[
  {
    "path": ".codecov.yml",
    "content": "comment:\n  layout: \"diff, files\"\n  behavior: default\n\ncoverage:\n  range: 50..100\n  round: down\n  precision: 2\n\n  status:\n    project:\n      default:\n        target: '70'\n    patch:\n      default:\n        target: '70'\n"
  },
  {
    "path": ".conda/environment-dev.yml",
    "content": "name: coincurve-with-conda-dev\nchannels:\n  - conda-forge\n  - defaults\ndependencies:\n  - cffi >=1.3.0\n  - cmake\n  - libsecp256k1\n  - pkg-config\n  - pytest\n  - pytest-benchmark\n  - python =3.12\n  - tox-conda\n"
  },
  {
    "path": ".conda/environment.yml",
    "content": "name: coincurve-with-conda\nchannels:\n  - conda-forge\n  - defaults\ndependencies:\n  - libsecp256k1\n  - cffi >=1.3.0\n  - asn1crypto\n\n"
  },
  {
    "path": ".gemini/config.yaml",
    "content": "# https://developers.google.com/gemini-code-assist/docs/customize-gemini-behavior-github\nhave_fun: false\ncode_review:\n  pull_request_opened:\n    summary: false\n    code_review: false\n"
  },
  {
    "path": ".gitattributes",
    "content": "# Auto detect text files and perform LF normalization\n* text=auto\n\n# Custom for Visual Studio\n*.cs     diff=csharp\n\n# Standard to msysgit\n*.doc\t diff=astextplain\n*.DOC\t diff=astextplain\n*.docx diff=astextplain\n*.DOCX diff=astextplain\n*.dot  diff=astextplain\n*.DOT  diff=astextplain\n*.pdf  diff=astextplain\n*.PDF\t diff=astextplain\n*.rtf\t diff=astextplain\n*.RTF\t diff=astextplain\n"
  },
  {
    "path": ".github/FUNDING.yml",
    "content": "github:\n- ofek\ncustom:\n- https://ofek.dev/donate/\n- https://paypal.me/ofeklev\n"
  },
  {
    "path": ".github/dependabot.yml",
    "content": "version: 2\nupdates:\n- package-ecosystem: \"github-actions\"\n  directory: \"/\"\n  schedule:\n    interval: \"monthly\"\n"
  },
  {
    "path": ".github/scripts/install-macos-build-deps.sh",
    "content": "#!/bin/bash\nset -ex\n\n# update brew\nbrew update\n\n# Update openssl if necessary\nbrew outdated openssl || brew upgrade openssl\n\n# Install packages needed to build lib-secp256k1\nfor pkg in pkg-config; do\n    brew list $pkg > /dev/null || brew install $pkg\n    brew outdated --quiet $pkg || brew upgrade $pkg\ndone\n"
  },
  {
    "path": ".github/workflows/build.yml",
    "content": "name: build\n\non:\n  push:\n    tags:\n    - v*\n    branches:\n    - master\n  pull_request:\n    branches:\n    - master\n\nconcurrency:\n  group: build-${{ github.head_ref }}\n  cancel-in-progress: true\n\nenv:\n  PYTHON_VERSION: '3.13'\n  COINCURVE_IGNORE_SYSTEM_LIB: 'ON'\n  COINCURVE_SECP256K1_STATIC: 'ON'\n  COINCURVE_CROSS_HOST: ''\n  CIBW_ENVIRONMENT_PASS_LINUX: >\n    COINCURVE_IGNORE_SYSTEM_LIB\n    COINCURVE_SECP256K1_STATIC\n    COINCURVE_CROSS_HOST\n  CIBW_BEFORE_ALL_MACOS: ./.github/scripts/install-macos-build-deps.sh\n  CIBW_TEST_REQUIRES: pytest\n  CIBW_TEST_COMMAND: >\n    python -c\n    \"from coincurve import PrivateKey;\n    a=PrivateKey();\n    b=PrivateKey();\n    assert a.ecdh(b.public_key.format())==b.ecdh(a.public_key.format())\n    \" &&\n    python -m pytest {project}\n  CIBW_SKIP: >\n      pp*\n\njobs:\n  test:\n    name: Test Python ${{ matrix.python-version }} on ${{ startsWith(matrix.os, 'macos-') && 'macOS' || startsWith(matrix.os, 'windows-') && 'Windows' || 'Linux' }}\n    runs-on: ${{ matrix.os }}\n    strategy:\n      fail-fast: false\n      matrix:\n        os: [ubuntu-latest, windows-latest, macos-latest]\n        python-version: [\"3.9\", \"3.10\", \"3.11\", \"3.12\", \"3.13\", \"3.14\"]\n\n    steps:\n    - name: Checkout code\n      uses: actions/checkout@v5\n\n    - name: Set up Python ${{ matrix.python-version }}\n      uses: actions/setup-python@v6\n      with:\n        python-version: ${{ matrix.python-version }}\n\n    - name: Install system dependencies\n      if: runner.os == 'macOS'\n      run: ./.github/scripts/install-macos-build-deps.sh\n\n    - name: Install Hatch\n      uses: pypa/hatch@install\n\n    - name: Run static analysis\n      run: hatch fmt --check\n\n    - name: Check types\n      run: hatch run types:check\n\n    - name: Run tests\n      run: hatch test --python ${{ matrix.python-version }} --cover-quiet --randomize\n\n    - name: Create coverage report\n      run: hatch run hatch-test.py${{ matrix.python-version }}:coverage xml\n\n    - name: Upload coverage data\n      uses: actions/upload-artifact@v4\n      with:\n        name: coverage-${{ matrix.os }}-${{ matrix.python-version }}\n        path: coverage.xml\n\n    - name: Install uv\n      uses: astral-sh/setup-uv@v5\n\n    - name: Benchmark\n      run: uv run --python-preference system scripts/bench.py\n\n  coverage:\n    name: Upload coverage\n    needs:\n    - test\n    runs-on: ubuntu-latest\n\n    permissions:\n      contents: read\n      id-token: write\n\n    steps:\n    - name: Download coverage data\n      uses: actions/download-artifact@v5\n      with:\n        pattern: coverage-*\n        path: coverage_data\n\n    - name: Upload coverage to Codecov\n      uses: codecov/codecov-action@v5\n      with:\n        directory: coverage_data\n        use_oidc: true\n\n  linux-wheels-x86_64:\n    name: Build Linux wheels for x86-64\n    needs:\n    - test\n    runs-on: ubuntu-latest\n\n    steps:\n    - uses: actions/checkout@v5\n\n    - name: Build wheels\n      uses: pypa/cibuildwheel@v2.23\n\n    - uses: actions/upload-artifact@v4\n      with:\n        name: artifact-linux-wheels-x86_64\n        path: wheelhouse/*.whl\n        if-no-files-found: error\n\n  macos-wheels-x86_64:\n    name: Build macOS wheels for x86-64\n    needs:\n    - test\n    runs-on: macos-15-intel\n\n    steps:\n    - uses: actions/checkout@v5\n\n    - name: Build wheels\n      uses: pypa/cibuildwheel@v3.2.0\n      env:\n        CIBW_ARCHS_MACOS: x86_64\n        CIBW_SKIP: \"cp314t-*\"\n        MACOSX_DEPLOYMENT_TARGET: 10.13\n\n    - uses: actions/upload-artifact@v4\n      with:\n        name: artifact-macos-wheels-x86_64\n        path: wheelhouse/*.whl\n        if-no-files-found: error\n\n  macos-wheels-arm64:\n    name: Build macOS wheels for ARM64\n    needs:\n    - test\n    runs-on: macos-latest\n\n    steps:\n    - uses: actions/checkout@v5\n\n    - name: Build wheels\n      uses: pypa/cibuildwheel@v2.23\n\n    - uses: actions/upload-artifact@v4\n      with:\n        name: artifact-macos-wheels-arm64\n        path: wheelhouse/*.whl\n        if-no-files-found: error\n\n  windows-wheels-x86_64:\n    name: Build Windows wheels for x86-64\n    needs:\n    - test\n    runs-on: windows-latest\n\n    steps:\n    - uses: actions/checkout@v5\n\n    - uses: actions/setup-python@v6\n      with:\n        python-version: ${{ env.PYTHON_VERSION }}\n\n    - name: Build wheels\n      uses: pypa/cibuildwheel@v2.23\n      env:\n        CIBW_ARCHS_WINDOWS: 'AMD64'\n        CIBW_BEFORE_ALL: choco install -y --no-progress --no-color cmake>=3.28\n\n    - uses: actions/upload-artifact@v4\n      with:\n        name: artifact-windows-wheels-x86_64\n        path: wheelhouse/*.whl\n        if-no-files-found: error\n\n  windows-wheels-arm64:\n    name: Build Windows wheels for ARM64\n    needs:\n    - test\n    runs-on: windows-latest\n\n    steps:\n    - uses: actions/checkout@v5\n\n    - name: Build wheels\n      uses: pypa/cibuildwheel@v2.23\n      env:\n        COINCURVE_CROSS_HOST: 'arm64'\n        CIBW_ARCHS_WINDOWS: 'ARM64'\n        CIBW_BEFORE_ALL: choco install -y --no-progress --no-color cmake>=3.28\n\n    - uses: actions/upload-artifact@v4\n      with:\n        name: artifact-windows-wheels-arm64\n        path: wheelhouse/*.whl\n        if-no-files-found: error\n\n  sdist:\n    name: Build source distribution\n    needs:\n    - test\n    runs-on: ubuntu-latest\n\n    steps:\n    - uses: actions/checkout@v5\n\n    - name: Install build dependencies\n      run: python -m pip install build\n\n    - name: Build source distribution\n      run: python -m build --sdist\n\n    - uses: actions/upload-artifact@v4\n      with:\n        name: artifact-sdist\n        path: dist/*\n        if-no-files-found: error\n\n  linux-wheels-arm64:\n    name: Build Linux wheels for ARM64\n    needs:\n    - test\n    runs-on: ubuntu-latest\n    if: github.event_name == 'push' && (github.ref == 'refs/heads/master' || startsWith(github.event.ref, 'refs/tags'))\n\n    steps:\n    - uses: actions/checkout@v5\n\n    - name: Set up QEMU\n      uses: docker/setup-qemu-action@v3\n      with:\n        platforms: arm64\n\n    - name: Build wheels\n      uses: pypa/cibuildwheel@v2.23\n      env:\n        CIBW_ARCHS_LINUX: aarch64\n\n    - uses: actions/upload-artifact@v4\n      with:\n        name: artifact-linux-wheels-arm64\n        path: wheelhouse/*.whl\n        if-no-files-found: error\n\n  publish:\n    name: Publish release\n    needs:\n    - linux-wheels-x86_64\n    - macos-wheels-x86_64\n    - macos-wheels-arm64\n    - windows-wheels-x86_64\n    - windows-wheels-arm64\n    - sdist\n    - linux-wheels-arm64\n    runs-on: ubuntu-latest\n    if: github.event_name == 'push' && startsWith(github.event.ref, 'refs/tags')\n\n    permissions:\n      id-token: write\n\n    steps:\n    - uses: actions/download-artifact@v5\n      with:\n        pattern: artifact-*\n        merge-multiple: true\n        path: dist\n    - run: ls -l dist\n\n    - name: Push build artifacts to PyPI\n      uses: pypa/gh-action-pypi-publish@v1.13.0\n      with:\n        skip-existing: true\n"
  },
  {
    "path": ".github/workflows/docs.yml",
    "content": "name: docs\n\non:\n  push:\n    branches:\n    - master\n  pull_request:\n    branches:\n    - master\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n\n    steps:\n    - uses: actions/checkout@v5\n      with:\n        # Fetch all history for applying timestamps to every page\n        fetch-depth: 0\n\n    - name: Set up Python\n      uses: actions/setup-python@v6\n      with:\n        python-version: '3.12'\n\n    - name: Install Hatch\n      uses: pypa/hatch@install\n\n    - name: Check documentation\n      run: hatch run docs:build-check\n\n    - name: Build documentation\n      run: hatch run docs:build\n\n    - uses: actions/upload-artifact@v4\n      with:\n        name: documentation\n        path: site\n\n  publish:\n    runs-on: ubuntu-latest\n\n    if: github.event_name == 'push' && github.ref == 'refs/heads/master'\n    needs:\n    - build\n\n    steps:\n    - uses: actions/download-artifact@v5\n      with:\n        name: documentation\n        path: site\n\n    - uses: peaceiris/actions-gh-pages@v4\n      with:\n        github_token: ${{ secrets.GITHUB_TOKEN }}\n        publish_dir: ./site\n        commit_message: ${{ github.event.head_commit.message }}\n        # Write .nojekyll at the root, see:\n        # https://help.github.com/en/github/working-with-github-pages/about-github-pages#static-site-generators\n        enable_jekyll: false\n        # Only deploy if there were changes\n        allow_empty_commit: false\n"
  },
  {
    "path": ".github/workflows/verify_conda_build.yml",
    "content": "name: conda_build\n\non:\n  push:\n    tags:\n    - v*\n    branches:\n    - master\n  pull_request:\n    branches:\n    - master\n\nconcurrency:\n  group: build_conda-${{ github.head_ref }}\n  cancel-in-progress: true\n\nenv:\n  PYTHON_VERSION: '3.12'\n  COINCURVE_UPSTREAM_REF: __no_upstream__\n  COINCURVE_IGNORE_SYSTEM_LIB: 'OFF'\n  COINCURVE_SECP256K1_STATIC: 'OFF'\n  COINCURVE_CROSS_HOST: ''\n  CIBW_ENVIRONMENT_PASS_LINUX: >\n    COINCURVE_UPSTREAM_REF\n    COINCURVE_IGNORE_SYSTEM_LIB\n    COINCURVE_SECP256K1_STATIC\n    COINCURVE_CROSS_HOST\n  CIBW_BEFORE_ALL_MACOS: ./.github/scripts/install-macos-build-deps.sh\n  CIBW_TEST_REQUIRES: pytest\n  CIBW_TEST_COMMAND: >\n    python -c\n    \"from coincurve import PrivateKey;\n    a=PrivateKey();\n    b=PrivateKey();\n    assert a.ecdh(b.public_key.format())==b.ecdh(a.public_key.format())\n    \" &&\n    python -m pytest {project}\n  CIBW_SKIP: >\n      pp*\n\njobs:\n  test:\n    name: Test with Conda libsecp256k1\n    runs-on: ubuntu-latest\n    defaults:\n      run:\n        shell: bash -el {0}\n\n    steps:\n    - uses: actions/checkout@v5\n\n    - name: Install Miniconda\n      uses: conda-incubator/setup-miniconda@v3\n      with:\n        environment-file: ./.conda/environment-dev.yml\n        activate-environment: coincurve-with-conda\n        python-version: ${{ env.PYTHON_VERSION }}\n        auto-activate-base: false\n\n    - name: Install Hatch\n      uses: pypa/hatch@install\n\n    - name: Run static analysis\n      run: hatch fmt --check\n\n    - name: Check types\n      run: hatch run types:check\n\n    - name: Run tests\n      run: LD_LIBRARY_PATH=$CONDA_PREFIX/lib hatch test\n\n    - name: Install uv\n      uses: astral-sh/setup-uv@v5\n\n    - name: Benchmark\n      run: LD_LIBRARY_PATH=$CONDA_PREFIX/lib uv run --python-preference system scripts/bench.py\n\n  linux-wheels-x86_64:\n    name: Build Linux wheels\n    needs:\n    - test\n    runs-on: ubuntu-latest\n    defaults:\n      run:\n        shell: bash -el {0}\n\n    steps:\n    - uses: actions/checkout@v5\n\n    - name: Install Miniconda\n      uses: conda-incubator/setup-miniconda@v3\n      with:\n        environment-file: ./.conda/environment-dev.yml\n        activate-environment: coincurve-with-conda\n        python-version: ${{ env.PYTHON_VERSION }}\n        auto-activate-base: false\n\n    - name: Build sdist & wheel\n      run: |\n        conda install python-build\n        python -m build --outdir conda_dist\n\n    - name: Test wheel in a clean environment\n      run: |\n        conda install pip\n        pip install conda_dist/*.whl\n        python -m pytest tests\n"
  },
  {
    "path": ".github/workflows/verify_shared_build.yml",
    "content": "name: shared_build\n\non:\n  push:\n    tags:\n    - v*\n    branches:\n    - master\n  pull_request:\n    branches:\n    - master\n\nconcurrency:\n  group: build_shared-${{ github.head_ref }}\n  cancel-in-progress: true\n\nenv:\n  PYTHON_VERSION: '3.12'\n  COINCURVE_IGNORE_SYSTEM_LIB: '1'\n  # Only 'SHARED' is recognized, any other string means 'not SHARED'\n  COINCURVE_SECP256K1_BUILD: 'SHARED'\n  CIBW_ENVIRONMENT_PASS_LINUX: >\n    COINCURVE_IGNORE_SYSTEM_LIB\n    COINCURVE_SECP256K1_BUILD\n  CIBW_BEFORE_ALL_MACOS: ./.github/scripts/install-macos-build-deps.sh\n  CIBW_TEST_REQUIRES: pytest\n  CIBW_TEST_COMMAND: >\n    python -c\n    \"from coincurve import PrivateKey;\n    a=PrivateKey();\n    b=PrivateKey();\n    assert a.ecdh(b.public_key.format())==b.ecdh(a.public_key.format())\n    \" &&\n    python -m pytest {project}\n  CIBW_TEST_SKIP: \"*-macosx_arm64\"\n  CIBW_SKIP: >\n      pp*\n\njobs:\n  test:\n    name: Test latest Python\n    runs-on: ubuntu-latest\n\n    steps:\n    - uses: actions/checkout@v5\n\n    - name: Set up Python ${{ env.PYTHON_VERSION }}\n      uses: actions/setup-python@v6\n      with:\n        python-version: ${{ env.PYTHON_VERSION }}\n\n    - name: Install system dependencies\n      if: runner.os == 'macOS'\n      run: ./.github/scripts/install-macos-build-deps.sh\n\n    - name: Install Hatch\n      uses: pypa/hatch@install\n\n    - name: Run static analysis\n      run: hatch fmt --check\n\n    - name: Check types\n      run: hatch run types:check\n\n    - name: Run tests\n      run: hatch test\n\n    - name: Install uv\n      uses: astral-sh/setup-uv@v5\n\n    - name: Benchmark\n      run: uv run --python-preference system scripts/bench.py\n\n  linux-wheels-x86_64:\n    name: Build Linux wheels for x86-64\n    needs:\n    - test\n    runs-on: ubuntu-latest\n\n    steps:\n    - uses: actions/checkout@v5\n\n    - name: Build wheels\n      uses: pypa/cibuildwheel@v2.23\n\n  macos-wheels-x86_64:\n    name: Build macOS wheels for x86-64\n    needs:\n    - test\n    runs-on: macos-15-intel\n\n    steps:\n    - uses: actions/checkout@v5\n\n    - name: Build wheels\n      uses: pypa/cibuildwheel@v3.2.0\n      env:\n        CIBW_ARCHS_MACOS: x86_64\n        CIBW_SKIP: \"cp314t-*\"\n        MACOSX_DEPLOYMENT_TARGET: 10.13\n\n  macos-wheels-arm64:\n    name: Build macOS wheels for ARM64\n    needs:\n    - test\n    runs-on: macos-latest\n\n    steps:\n    - uses: actions/checkout@v5\n\n    - name: Build wheels\n      uses: pypa/cibuildwheel@v2.23\n\n  windows-wheels-x86_64:\n    name: Build Windows wheels for x86-64\n    needs:\n    - test\n    runs-on: windows-latest\n\n    steps:\n    - uses: actions/checkout@v5\n\n    - uses: actions/setup-python@v6\n      with:\n        python-version: ${{ env.PYTHON_VERSION }}\n\n    - name: Build wheels\n      uses: pypa/cibuildwheel@v2.23\n      env:\n        CIBW_ARCHS_WINDOWS: 'AMD64'\n        CIBW_BEFORE_ALL: choco install -y --no-progress --no-color cmake>=3.28\n\n  windows-wheels-arm64:\n    name: Build Windows wheels for ARM64\n    needs:\n    - test\n    runs-on: windows-latest\n\n    steps:\n    - uses: actions/checkout@v5\n\n    - name: Build wheels\n      uses: pypa/cibuildwheel@v2.23\n      env:\n        COINCURVE_CROSS_HOST: 'arm64'\n        CIBW_ARCHS_WINDOWS: 'ARM64'\n        CIBW_BEFORE_ALL: choco install -y --no-progress --no-color cmake>=3.28\n"
  },
  {
    "path": ".gitignore",
    "content": "*.log\n*.pyc\n/.cache\n/.coverage\n/.eggs\n/.idea\n/.mypy_cache\n/.tox\n/coincurve.egg-info\n/build\n/dist\n/site\n"
  },
  {
    "path": ".linkcheckerrc",
    "content": "[AnchorCheck]\n"
  },
  {
    "path": "CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.26)\n\nproject(${SKBUILD_PROJECT_NAME}\n    VERSION ${SKBUILD_PROJECT_VERSION}\n    LANGUAGES C\n)\n\n# Path to custom CMake functions\nset(CMAKE_MODULE_PATH \"${PROJECT_SOURCE_DIR}/cmake\" ${CMAKE_MODULE_PATH})\n\n# Name of the vendored library CMake target\ninclude(SetDefaultVendoredLibrary)\nSetDefaultVendoredLibrary()\n\nset(CFFI_INPUT_LIBRARY ${VENDORED_LIBRARY_CMAKE_TARGET})\n\n# Set the output directories for the generated C code and headers\nset(CFFI_C_CODE_DIR ${PROJECT_BINARY_DIR}/_gen_c_file)\nset(CFFI_C_CODE \"${CFFI_INPUT_LIBRARY}_cffi_bindings.c\")\nset(CFFI_HEADERS_DIR ${PROJECT_BINARY_DIR}/_gen_cffi_headers)\n\n# Shared object that wraps the CFFI binding of the vendored library\nset(CFFI_OUTPUT_LIBRARY \"_${VENDORED_LIBRARY_PKG_CONFIG}\")\n\n# Setting python for the host system (before change in CMAKE_SYSTEM_PROCESSOR)\nfind_package(Python 3 REQUIRED COMPONENTS Interpreter Development.Module Development.SABIModule)\n\ninclude(SetCrossCompilerGithubActions)\nSetCrossCompilerGithubActions()\n\n# Add the subdirectories. Append CONDA to the PKG_CONFIG_PATH\nif (CMAKE_SYSTEM_NAME STREQUAL \"Windows\")\n    set(PKG_CONFIG_ARGN \"--dont-define-prefix\")\nendif()\nfind_package(PkgConfig REQUIRED)\n\n# Set VENDORED_AS_SYSTEM_LIB to true if the vendored library is installed as a system library\ninclude(SetSystemLibIfExists)\nSetSystemLibIfExists()\n\nadd_subdirectory(cm_vendored_library)\nadd_subdirectory(cm_library_cffi_headers)\nadd_subdirectory(cm_library_c_binding)\nadd_subdirectory(cm_python_module)\n\n# Configure installation of the shared library ${CFFI_OUTPUT_LIBRARY} in the package\ninstall(TARGETS ${CFFI_OUTPUT_LIBRARY} LIBRARY DESTINATION ${SKBUILD_PLATLIB_DIR}/${SKBUILD_PROJECT_NAME})\n"
  },
  {
    "path": "LICENSE-APACHE",
    "content": "Copyright 2017 Ofek Lev\n\n                              Apache License\n                        Version 2.0, January 2004\n                     http://www.apache.org/licenses/\n\nTERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n1. Definitions.\n\n   \"License\" shall mean the terms and conditions for use, reproduction,\n   and distribution as defined by Sections 1 through 9 of this document.\n\n   \"Licensor\" shall mean the copyright owner or entity authorized by\n   the copyright owner that is granting the License.\n\n   \"Legal Entity\" shall mean the union of the acting entity and all\n   other entities that control, are controlled by, or are under common\n   control with that entity. For the purposes of this definition,\n   \"control\" means (i) the power, direct or indirect, to cause the\n   direction or management of such entity, whether by contract or\n   otherwise, or (ii) ownership of fifty percent (50%) or more of the\n   outstanding shares, or (iii) beneficial ownership of such entity.\n\n   \"You\" (or \"Your\") shall mean an individual or Legal Entity\n   exercising permissions granted by this License.\n\n   \"Source\" form shall mean the preferred form for making modifications,\n   including but not limited to software source code, documentation\n   source, and configuration files.\n\n   \"Object\" form shall mean any form resulting from mechanical\n   transformation or translation of a Source form, including but\n   not limited to compiled object code, generated documentation,\n   and conversions to other media types.\n\n   \"Work\" shall mean the work of authorship, whether in Source or\n   Object form, made available under the License, as indicated by a\n   copyright notice that is included in or attached to the work\n   (an example is provided in the Appendix below).\n\n   \"Derivative Works\" shall mean any work, whether in Source or Object\n   form, that is based on (or derived from) the Work and for which the\n   editorial revisions, annotations, elaborations, or other modifications\n   represent, as a whole, an original work of authorship. For the purposes\n   of this License, Derivative Works shall not include works that remain\n   separable from, or merely link (or bind by name) to the interfaces of,\n   the Work and Derivative Works thereof.\n\n   \"Contribution\" shall mean any work of authorship, including\n   the original version of the Work and any modifications or additions\n   to that Work or Derivative Works thereof, that is intentionally\n   submitted to Licensor for inclusion in the Work by the copyright owner\n   or by an individual or Legal Entity authorized to submit on behalf of\n   the copyright owner. For the purposes of this definition, \"submitted\"\n   means any form of electronic, verbal, or written communication sent\n   to the Licensor or its representatives, including but not limited to\n   communication on electronic mailing lists, source code control systems,\n   and issue tracking systems that are managed by, or on behalf of, the\n   Licensor for the purpose of discussing and improving the Work, but\n   excluding communication that is conspicuously marked or otherwise\n   designated in writing by the copyright owner as \"Not a Contribution.\"\n\n   \"Contributor\" shall mean Licensor and any individual or Legal Entity\n   on behalf of whom a Contribution has been received by Licensor and\n   subsequently incorporated within the Work.\n\n2. Grant of Copyright License. Subject to the terms and conditions of\n   this License, each Contributor hereby grants to You a perpetual,\n   worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n   copyright license to reproduce, prepare Derivative Works of,\n   publicly display, publicly perform, sublicense, and distribute the\n   Work and such Derivative Works in Source or Object form.\n\n3. Grant of Patent License. Subject to the terms and conditions of\n   this License, each Contributor hereby grants to You a perpetual,\n   worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n   (except as stated in this section) patent license to make, have made,\n   use, offer to sell, sell, import, and otherwise transfer the Work,\n   where such license applies only to those patent claims licensable\n   by such Contributor that are necessarily infringed by their\n   Contribution(s) alone or by combination of their Contribution(s)\n   with the Work to which such Contribution(s) was submitted. If You\n   institute patent litigation against any entity (including a\n   cross-claim or counterclaim in a lawsuit) alleging that the Work\n   or a Contribution incorporated within the Work constitutes direct\n   or contributory patent infringement, then any patent licenses\n   granted to You under this License for that Work shall terminate\n   as of the date such litigation is filed.\n\n4. Redistribution. You may reproduce and distribute copies of the\n   Work or Derivative Works thereof in any medium, with or without\n   modifications, and in Source or Object form, provided that You\n   meet the following conditions:\n\n   (a) You must give any other recipients of the Work or\n       Derivative Works a copy of this License; and\n\n   (b) You must cause any modified files to carry prominent notices\n       stating that You changed the files; and\n\n   (c) You must retain, in the Source form of any Derivative Works\n       that You distribute, all copyright, patent, trademark, and\n       attribution notices from the Source form of the Work,\n       excluding those notices that do not pertain to any part of\n       the Derivative Works; and\n\n   (d) If the Work includes a \"NOTICE\" text file as part of its\n       distribution, then any Derivative Works that You distribute must\n       include a readable copy of the attribution notices contained\n       within such NOTICE file, excluding those notices that do not\n       pertain to any part of the Derivative Works, in at least one\n       of the following places: within a NOTICE text file distributed\n       as part of the Derivative Works; within the Source form or\n       documentation, if provided along with the Derivative Works; or,\n       within a display generated by the Derivative Works, if and\n       wherever such third-party notices normally appear. The contents\n       of the NOTICE file are for informational purposes only and\n       do not modify the License. You may add Your own attribution\n       notices within Derivative Works that You distribute, alongside\n       or as an addendum to the NOTICE text from the Work, provided\n       that such additional attribution notices cannot be construed\n       as modifying the License.\n\n   You may add Your own copyright statement to Your modifications and\n   may provide additional or different license terms and conditions\n   for use, reproduction, or distribution of Your modifications, or\n   for any such Derivative Works as a whole, provided Your use,\n   reproduction, and distribution of the Work otherwise complies with\n   the conditions stated in this License.\n\n5. Submission of Contributions. Unless You explicitly state otherwise,\n   any Contribution intentionally submitted for inclusion in the Work\n   by You to the Licensor shall be under the terms and conditions of\n   this License, without any additional terms or conditions.\n   Notwithstanding the above, nothing herein shall supersede or modify\n   the terms of any separate license agreement you may have executed\n   with Licensor regarding such Contributions.\n\n6. Trademarks. This License does not grant permission to use the trade\n   names, trademarks, service marks, or product names of the Licensor,\n   except as required for reasonable and customary use in describing the\n   origin of the Work and reproducing the content of the NOTICE file.\n\n7. Disclaimer of Warranty. Unless required by applicable law or\n   agreed to in writing, Licensor provides the Work (and each\n   Contributor provides its Contributions) on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n   implied, including, without limitation, any warranties or conditions\n   of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n   PARTICULAR PURPOSE. You are solely responsible for determining the\n   appropriateness of using or redistributing the Work and assume any\n   risks associated with Your exercise of permissions under this License.\n\n8. Limitation of Liability. In no event and under no legal theory,\n   whether in tort (including negligence), contract, or otherwise,\n   unless required by applicable law (such as deliberate and grossly\n   negligent acts) or agreed to in writing, shall any Contributor be\n   liable to You for damages, including any direct, indirect, special,\n   incidental, or consequential damages of any character arising as a\n   result of this License or out of the use or inability to use the\n   Work (including but not limited to damages for loss of goodwill,\n   work stoppage, computer failure or malfunction, or any and all\n   other commercial damages or losses), even if such Contributor\n   has been advised of the possibility of such damages.\n\n9. Accepting Warranty or Additional Liability. While redistributing\n   the Work or Derivative Works thereof, You may choose to offer,\n   and charge a fee for, acceptance of support, warranty, indemnity,\n   or other liability obligations and/or rights consistent with this\n   License. However, in accepting such obligations, You may act only\n   on Your own behalf and on Your sole responsibility, not on behalf\n   of any other Contributor, and only if You agree to indemnify,\n   defend, and hold each Contributor harmless for any liability\n   incurred by, or claims asserted against, such Contributor by reason\n   of your accepting any such warranty or additional liability.\n\nEND OF TERMS AND CONDITIONS\n"
  },
  {
    "path": "LICENSE-MIT",
    "content": "MIT License\n\nCopyright (c) 2017 Ofek Lev\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "NOTICE",
    "content": "This package is dual-licensed under MIT or Apache-2.0.\n\nThe final distribution includes the following compiled artifacts:\n\n* `_cffi_backend` shared library from the CFFI project (https://github.com/python-cffi/cffi) which is licensed under the MIT license. See `coincurve-X.Y.Z.dist-info/licenses/LICENSE-cffi` for the license text.\n* Code from the libsecp256k1 project (https://github.com/bitcoin-core/secp256k1) which is licensed under the MIT license.\n"
  },
  {
    "path": "README.md",
    "content": "# coincurve\n\n| | |\n| --- | --- |\n| CI/CD | [![CI - Test](https://github.com/ofek/coincurve/actions/workflows/build.yml/badge.svg)](https://github.com/ofek/coincurve/actions/workflows/build.yml) [![CI - Coverage](https://img.shields.io/codecov/c/github/ofek/coincurve/master.svg?logo=codecov&logoColor=red)](https://codecov.io/github/ofek/coincurve) |\n| Docs | [![CI - Docs](https://github.com/ofek/coincurve/actions/workflows/docs.yml/badge.svg)](https://github.com/ofek/coincurve/actions/workflows/docs.yml) |\n| Package | [![PyPI - Version](https://img.shields.io/pypi/v/coincurve.svg?logo=pypi&label=PyPI&logoColor=gold)](https://pypi.org/project/coincurve/) [![PyPI - Downloads](https://img.shields.io/pypi/dm/coincurve.svg?color=blue&label=Downloads&logo=pypi&logoColor=gold)](https://pypi.org/project/coincurve/) [![Required Python Version](https://img.shields.io/python/required-version-toml?tomlFilePath=https%3A%2F%2Fraw.githubusercontent.com%2Fofek%2Fcoincurve%2FHEAD%2Fpyproject.toml)](https://pypi.org/project/coincurve/) |\n| Meta | [![Hatch project](https://img.shields.io/badge/%F0%9F%A5%9A-Hatch-4051b5.svg)](https://github.com/ofek/dep-sync) [![linting - Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff) [![types - Mypy](https://img.shields.io/badge/types-Mypy-blue.svg)](https://github.com/python/mypy) [![License - MIT OR Apache-2.0](https://img.shields.io/badge/license-MIT%20OR%20Apache--2.0-9400d3.svg)](https://spdx.org/licenses/) [![GitHub Sponsors](https://img.shields.io/github/sponsors/ofek?logo=GitHub%20Sponsors&style=social)](https://github.com/sponsors/ofek) |\n\n-----\n\nThis library provides well-tested Python bindings for [libsecp256k1](https://github.com/bitcoin-core/secp256k1), the heavily optimized C library\nused by [Bitcoin Core](https://github.com/bitcoin/bitcoin) for operations on the elliptic curve [secp256k1](https://en.bitcoin.it/wiki/Secp256k1).\n\nFeel free to read the [documentation](https://ofek.dev/coincurve/)!\n\n## Users\n\n- [Ethereum](https://ethereum.org)\n- [LBRY](https://lbry.com)\n- [libp2p](https://libp2p.io)\n\nand [many more](https://ofek.dev/coincurve/users/)!\n\n## License\n\n`coincurve` is distributed under the terms of any of the following licenses:\n\n- [MIT](https://spdx.org/licenses/MIT.html)\n- [Apache-2.0](https://spdx.org/licenses/Apache-2.0.html)\n"
  },
  {
    "path": "cm_library_c_binding/CMakeLists.txt",
    "content": "# create folder for _gen code\nfile(MAKE_DIRECTORY ${PROJECT_BINARY_DIR}/_gen_c_file)\n\nif (NOT CFFI_C_CODE)\n    set(CFFI_C_CODE _cffi_c_code.c)\nendif()  \n\nif (NOT CFFI_C_CODE_DIR)\n    set(CFFI_C_CODE_DIR \"${PROJECT_BINARY_DIR}/_gen_c_file\")\nendif()\n\n# Copy the build.py file to the build directory\nfile(COPY ${CMAKE_CURRENT_LIST_DIR}/build.py DESTINATION ${CFFI_C_CODE_DIR})\n\ninclude(VerifyPythonModule)\nVerifyPythonModule(cffi ${Python_EXECUTABLE})\n\nif (VENDORED_HEADERS_DIR)\n    set(_static_build 'ON')\nelse()\n    message(STATUS \"CFFI C-file is built for a SHARED system library\")\n    set(_static_build 'OFF')\nendif()\n\n# Generate the CFFI source file\nadd_custom_command(\n    OUTPUT                ${CFFI_C_CODE_DIR}/${CFFI_C_CODE}\n    COMMAND               ${Python_EXECUTABLE} ${CFFI_C_CODE_DIR}/build.py\n                          ${CFFI_HEADERS_DIR}\n                          ${CFFI_C_CODE_DIR}/${CFFI_C_CODE} ${_static_build}\n    MAIN_DEPENDENCY       ${CMAKE_CURRENT_LIST_DIR}/build.py\n    DEPENDS               headers-for-cffi\n    WORKING_DIRECTORY     ${CFFI_C_CODE_DIR}\n    COMMENT               \"Generating CFFI source file\"\n)\n\nadd_custom_target(cffi-c-binding ALL DEPENDS ${CFFI_C_CODE_DIR}/${CFFI_C_CODE})\nadd_dependencies(cffi-c-binding headers-for-cffi)\n"
  },
  {
    "path": "cm_library_c_binding/build.py",
    "content": "from __future__ import annotations\n\nimport argparse\nimport logging\nimport os\nfrom typing import NamedTuple\n\nfrom cffi import FFI\n\nlogging.basicConfig(level=logging.INFO)\n\nhere = os.path.dirname(os.path.abspath(__file__))\n\n\nclass Source(NamedTuple):\n    h: str\n    include: str\n\n\ndef gather_sources_from_directory(directory: str) -> list[Source]:\n    \"\"\"\n    Gather source files from a given directory.\n\n    :param directory: The directory where source files are located.\n    :return: A list of Source namedtuples.\n    \"\"\"\n    sources = []\n    for filename in os.listdir(directory):\n        if filename.endswith(\".h\"):\n            include_line = f\"#include <{filename}>\"\n            sources.append(Source(filename, include_line))\n    return sorted(sources)\n\n\ndefine_static_lib = \"\"\"\n#if defined(_WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__NT__)\n#   define SECP256K1_STATIC 1\n#endif\n\"\"\"\n\n\ndef mk_ffi(\n    directory: str,\n    sources: list[Source],\n    static_lib: bool = False,  # noqa: FBT001, FBT002\n    name: str = \"_libsecp256k1\",\n) -> FFI:\n    \"\"\"\n    Create an FFI object.\n\n    :param sources: A list of Source namedtuples.\n    :param static_lib: Whether to generate a static lib in Windows.\n    :param name: The name of the FFI object.\n    :return: An FFI object.\n    \"\"\"\n    _ffi = FFI()\n    code = [define_static_lib] if static_lib else []\n\n    logging.info(\"   Static %s...\", static_lib)\n    for source in sources:\n        with open(os.path.join(directory, source.h), encoding=\"utf-8\") as h:\n            logging.info(\"   Including %s...\", source.h)\n            c_header = h.read()\n            _ffi.cdef(c_header)\n\n        code.append(source.include)\n\n    code.append(\"#define PY_USE_BUNDLED\")\n    _ffi.set_source(name, \"\\n\".join(code))\n\n    return _ffi\n\n\nif __name__ == \"__main__\":\n    logging.info(\"Starting CFFI build process...\")\n    parser = argparse.ArgumentParser(description=\"Generate C code using CFFI.\")\n    parser.add_argument(\"headers_dir\", help=\"Path to the header files.\", type=str)\n    parser.add_argument(\"c_file\", help=\"Generated C code filename.\", type=str)\n    parser.add_argument(\"static_lib\", help=\"Generate static lib in Windows.\", default=\"0N\", type=str)\n    args = parser.parse_args()\n\n    modules = gather_sources_from_directory(args.headers_dir)\n    ffi = mk_ffi(args.headers_dir, modules, args.static_lib == \"ON\")\n    ffi.emit_c_code(args.c_file)\n\n    vendor_cffi = os.environ.get(\"COINCURVE_VENDOR_CFFI\", \"1\") == \"1\"\n    if vendor_cffi:\n        with open(args.c_file, encoding=\"utf-8\") as f:\n            source = f.read()\n\n        expected_text = 'PyImport_ImportModule(\"_cffi_backend\")'\n        if expected_text not in source:\n            msg = f\"{expected_text} not found in {args.c_file}\"\n            raise ValueError(msg)\n\n        new_source = source.replace(expected_text, 'PyImport_ImportModule(\"coincurve._cffi_backend\")')\n        with open(args.c_file, \"w\", encoding=\"utf-8\") as f:\n            f.write(new_source)\n\n    logging.info(\"   Generated C code: %s\", args.c_file)\n"
  },
  {
    "path": "cm_library_cffi_headers/CMakeLists.txt",
    "content": "# create folder for _gen code\nfile(MAKE_DIRECTORY ${CFFI_HEADERS_DIR})\n\nmacro(generate_cffi_header src_header cffi_header cffi_dir)\n    add_custom_command(\n        OUTPUT              ${cffi_dir}/${cffi_header}\n        COMMAND             ${Python_EXECUTABLE} ${CMAKE_CURRENT_LIST_DIR}/compose_cffi_headers.py\n                            ${src_header} ${cffi_header} ${cffi_dir}\n        MAIN_DEPENDENCY     ${CMAKE_CURRENT_LIST_DIR}/compose_cffi_headers.py\n        DEPENDS             ${src_header}\n        WORKING_DIRECTORY   ${cffi_dir}\n    )\n    add_custom_target(${cffi_header} ALL DEPENDS ${cffi_dir}/${cffi_header})\nendmacro()\n\n# Extract files from full path of src_headers\nif(VENDORED_HEADERS_DIR)\n    file(GLOB src_headers ${VENDORED_HEADERS_DIR}/*.h)\nelseif(VENDORED_AS_SYSTEM_LIB_FOUND)\n    message(WARNING \"Using system library ${VENDORED_LIBRARY_CMAKE_TARGET}. The list of headers is set to:\"\n                    \"   <system_include>/*${VENDORED_LIBRARY_CMAKE_TARGET}/*.h\")\n    file(GLOB src_headers ${VENDORED_AS_SYSTEM_LIB_INCLUDE_DIRS}/*${VENDORED_LIBRARY_CMAKE_TARGET}*.h)\n    message(STATUS \"   Generating CFFI header for ${src_headers}\")\nelse()\n    message(FATAL_ERROR \"Headers for CFFI cannot be found. Exiting\")\nendif()\n\nadd_custom_target(headers-for-cffi)\n\nforeach(src_header ${src_headers})\n    get_filename_component(cffi_header ${src_header} NAME)\n    get_filename_component(src_header_dir ${src_header} DIRECTORY)\n    generate_cffi_header(${src_header_dir} ${cffi_header} ${CFFI_HEADERS_DIR})\n    add_dependencies(headers-for-cffi ${cffi_header})\nendforeach()\n"
  },
  {
    "path": "cm_library_cffi_headers/compose_cffi_headers.py",
    "content": "import argparse\nimport logging\nimport os\nimport re\nimport sys\n\nlogging.basicConfig(level=logging.ERROR)\n\n\ndef remove_c_comments_emptylines(text):\n    text = re.sub(r\"/\\*.*?\\*/\", \"\", text, flags=re.DOTALL)  # Remove multi-line comments\n    text = re.sub(r\"//.*\", \"\", text)  # Remove single-line comments\n    return re.sub(r\"\\n\\s*\\n+\", \"\\n\", text)  # Remove empty lines\n\n\ndef remove_c_includes(lines):\n    return [line for line in lines if not re.match(r\"^\\s*#include\\s\", line)]\n\n\ndef remove_special_defines(lines, defines):\n    return [line for line in lines if not any(f\"#define {define}\" in line for define in defines)]\n\n\ndef apply_cffi_defines_syntax(lines):\n    return [re.sub(r\"#\\s*define\\s+(\\w+).*\", r\"#define \\1 ...\", line) for line in lines]\n\n\ndef remove_c_ifdef(lines):\n    processed_lines = []\n\n    # The first #if is the multi-inclusion guard\n    ifdef_count = -1\n\n    for line in lines:\n        stripped_line = line.rstrip()\n\n        if re.match(r\"^#\\s*(if|el|endif)\", stripped_line):\n            stripped_line = stripped_line.replace(\" \", \"\")\n            ifdef_count += stripped_line.count(\"#if\") - stripped_line.count(\"#endif\")\n            continue\n\n        if ifdef_count == 0:\n            processed_lines.append(stripped_line)\n        elif ifdef_count < 0 and line != lines[-1]:\n            msg = \"Unbalanced #if/#endif preprocessor directives.\"\n            raise ValueError(msg)\n\n    return processed_lines\n\n\ndef concatenate_c_defines(lines):\n    buffer = []\n    processed_lines = []\n    in_define = False\n\n    for line in lines:\n        stripped_line = line.rstrip()\n\n        if (re.match(r\"#\\s*define\", stripped_line) or in_define) and stripped_line.endswith(\"\\\\\"):\n            in_define = True\n            buffer.append(\n                re.sub(r\"#\\s*define\", \"#define\", stripped_line).rstrip(\"\\\\\").strip()\n            )  # Normalize #define and remove trailing backslash\n            continue  # Skip the rest of the loop to avoid resetting the buffer\n\n        if in_define:\n            buffer.append(stripped_line)\n            processed_lines.append(\" \".join(buffer))\n            buffer = []  # Reset the buffer for the next definition\n            in_define = False\n            continue  # Skip the rest of the loop to avoid adding the line again\n\n        processed_lines.append(stripped_line)\n\n    return processed_lines\n\n\ndef remove_deprecated_functions(lines, deprecation):\n    buffer = []\n    processed_lines = []\n    in_struct = False\n    in_define = False\n    brace_count = 0\n\n    for line in lines:\n        stripped_line = line.rstrip()\n\n        if re.match(r\"#\\s*define\", stripped_line) or in_define:\n            in_define = bool(stripped_line.endswith(\"\\\\\"))\n            processed_lines.append(stripped_line)\n            continue\n\n        if stripped_line.startswith(\"struct\") or re.match(r\"typedef\\s+struct\", stripped_line) or in_struct:\n            in_struct = True\n            processed_lines.append(stripped_line)\n            brace_count += stripped_line.count(\"{\") - stripped_line.count(\"}\")\n            if brace_count == 0:  # End of struct block\n                in_struct = False\n            continue\n\n        buffer.append(stripped_line)\n\n        # Check for the end of a function declaration\n        if stripped_line.endswith(\";\") and not in_struct:\n            # Extend if not DEPRECATED\n            if not any(d in \" \".join(buffer) for d in deprecation):\n                processed_lines.extend(buffer)\n            buffer = []  # Reset the buffer for the next definition\n\n    return processed_lines\n\n\ndef remove_function_attributes(lines, attributes):\n    processed_lines = []\n\n    for line in lines:\n        stripped_line = line.rstrip()\n\n        for attribute, replacement in attributes.items():\n            # Attributes can be functions with (...), so using regular expression\n            # Remove the definition\n            if re.search(rf\"#\\s*define\\s+{attribute}(\\(.*\\))?\\b\", stripped_line):\n                stripped_line = None\n                break\n\n            if re.search(rf\"\\b{attribute}(\\(.*\\))?\\b\", stripped_line):\n                stripped_line = re.sub(rf\"\\b{attribute}(\\(.*\\))?\", f\"{replacement}\", stripped_line)\n                stripped_line = stripped_line.replace(\" ;\", \";\")\n                stripped_line = stripped_line.replace(\"  \", \" \")\n\n        if stripped_line:\n            processed_lines.append(stripped_line)\n\n    return processed_lines\n\n\ndef remove_header_guard(lines, keywords):\n    processed_lines = []\n\n    for line in lines:\n        stripped_line = line.rstrip()\n\n        for keyword in keywords:\n            if re.search(rf\"#\\s*define\\s+{keyword}.*_H\\b\", stripped_line):\n                continue\n            processed_lines.append(stripped_line)\n\n    return processed_lines\n\n\ndef concatenate_c_struct(lines):\n    buffer = []\n    processed_lines = []\n    in_struct = False\n    brace_count = 0\n\n    for line in lines:\n        stripped_line = line.strip()\n\n        if stripped_line.startswith(\"struct\") or re.match(r\"typedef\\s+struct\", stripped_line) or in_struct:\n            in_struct = True\n            brace_count += stripped_line.count(\"{\") - stripped_line.count(\"}\")\n            buffer.append(stripped_line)\n            if brace_count == 0:  # End of struct block\n                processed_lines.append(\" \".join(buffer).strip())\n                buffer = []  # Reset the buffer for the next definition\n                in_struct = False\n            continue  # Skip the rest of the loop to avoid adding the line again\n\n        processed_lines.append(stripped_line)\n\n    return processed_lines\n\n\ndef make_header_cffi_compliant(src_header_dir, src_header, cffi_dir):\n    with open(os.path.join(src_header_dir, src_header), encoding=\"utf-8\") as f:\n        text = remove_c_comments_emptylines(f.read())\n    lines = text.split(\"\\n\")\n\n    lines = remove_c_includes(lines)\n    lines = remove_c_ifdef(lines)\n    lines = concatenate_c_defines(lines)\n    lines = remove_deprecated_functions(lines, [\"DEPRECATED\"])\n    lines = remove_header_guard(lines, [\"SECP256K1\"])\n    lines = remove_function_attributes(\n        lines,\n        {\n            \"SECP256K1_API\": \"extern\",\n            \"SECP256K1_WARN_UNUSED_RESULT\": \"\",\n            \"SECP256K1_DEPRECATED\": \"\",\n            \"SECP256K1_ARG_NONNULL\": \"\",\n        },\n    )\n    lines = remove_special_defines(\n        lines,\n        [\n            # Deprecated flags\n            \"SECP256K1_CONTEXT_VERIFY\",\n            \"SECP256K1_CONTEXT_SIGN\",\n            \"SECP256K1_FLAGS_BIT_CONTEXT_VERIFY\",\n            \"SECP256K1_FLAGS_BIT_CONTEXT_SIGN\",\n            # Testing flags\n            \"SECP256K1_CONTEXT_DECLASSIFY\",\n            \"SECP256K1_FLAGS_BIT_CONTEXT_DECLASSIFY\",\n            # Not for direct use - That may not mean to remove them!\n            #   'SECP256K1_FLAGS_TYPE_MASK',\n            #   'SECP256K1_FLAGS_TYPE_CONTEXT',\n            #   'SECP256K1_FLAGS_TYPE_COMPRESSION',\n            #   'SECP256K1_FLAGS_BIT_COMPRESSION',\n            # Not supported\n            \"SECP256K1_SCHNORRSIG_EXTRAPARAMS_MAGIC\",\n            \"SECP256K1_SCHNORRSIG_EXTRAPARAMS\",\n        ],\n    )\n    lines = apply_cffi_defines_syntax(lines)\n\n    logging.info(\"   Writing: %s in %s\", src_header, cffi_dir)\n    output_filename = os.path.join(cffi_dir, src_header)\n    with open(output_filename, \"w\", encoding=\"utf-8\") as f_out:\n        f_out.write(\"\\n\".join(lines))\n\n\nif __name__ == \"__main__\":\n    parser = argparse.ArgumentParser(description=\"Process a header file.\")\n    parser.add_argument(\"src_header_dir\", type=str, help=\"The path to the header file to be processed.\")\n    parser.add_argument(\"cffi_header\", type=str, help=\"The path where the compliant header will be written.\")\n    parser.add_argument(\"cffi_dir\", type=str, help=\"The path where the compliant header will be written.\", default=\".\")\n\n    args = parser.parse_args()\n\n    # Verify args are valid\n    if not os.path.isdir(args.src_header_dir):\n        logging.error(\"Error: Directory: %s not found.\", args.src_header_dir)\n        sys.exit(1)\n\n    if not os.path.isdir(args.cffi_dir):\n        logging.error(\"Error: Directory: %s not found.\", args.cffi_dir)\n        sys.exit(1)\n\n    if not os.path.isfile(os.path.join(args.src_header_dir, args.cffi_header)):\n        logging.error(\"Error: %s not found in %s.\", args.cffi_header, args.src_header_dir)\n        sys.exit(1)\n\n    make_header_cffi_compliant(args.src_header_dir, args.cffi_header, args.cffi_dir)\n"
  },
  {
    "path": "cm_python_module/CMakeLists.txt",
    "content": "# Create the shared library from the CFFI binding and the static library from ${CFFI_INPUT_LIBRARY}\nif (CMAKE_SYSTEM_NAME STREQUAL \"Windows\")\n    Python_add_library(${CFFI_OUTPUT_LIBRARY} MODULE USE_SABI 3.8 \"${CFFI_C_CODE_DIR}/${CFFI_C_CODE}\")\nelse()\n    set(Python_SOABI ${SKBUILD_SOABI})\n    Python_add_library(${CFFI_OUTPUT_LIBRARY} MODULE WITH_SOABI \"${CFFI_C_CODE_DIR}/${CFFI_C_CODE}\")\n    target_compile_definitions(${CFFI_OUTPUT_LIBRARY} PRIVATE Py_LIMITED_API)\nendif()\n\nset_source_files_properties(\"${CFFI_C_CODE_DIR}/${CFFI_C_CODE}\" PROPERTIES GENERATED 1)\n\n# Detect whether the vendored library is a system library or not\nif (PROJECT_IGNORE_SYSTEM_LIB OR NOT VENDORED_AS_SYSTEM_LIB_FOUND)\n    # The build-type seems to be defined as 'MODULE', which creates issues with missing variables\n    # for CMake: (This only happens on Windows though ...)\n    set(CMAKE_MODULE_LINKER_FLAGS_COVERAGE \"\")\n\n    add_dependencies(${CFFI_OUTPUT_LIBRARY} ${CFFI_INPUT_LIBRARY})\n    add_dependencies(${CFFI_OUTPUT_LIBRARY} cffi-c-binding)\n    target_include_directories(${CFFI_OUTPUT_LIBRARY} PUBLIC ${VENDORED_HEADERS_DIR})\n\n    # Link the vendored library to the output library\n    # https://docs.python.org/3/c-api/stable.html#limited-c-api\n    target_link_libraries(${CFFI_OUTPUT_LIBRARY} PRIVATE ${CFFI_INPUT_LIBRARY})\nelseif(VENDORED_AS_SYSTEM_LIB_FOUND)\n    message(STATUS \"Vendored system library found: ${VENDORED_AS_SYSTEM_LIB_LIBRARIES}\")\n    target_include_directories(${CFFI_OUTPUT_LIBRARY} PRIVATE ${VENDORED_AS_SYSTEM_LIB_INCLUDE_DIRS})\n    add_dependencies(${CFFI_OUTPUT_LIBRARY} cffi-c-binding)\n    # On windows, using the LDFLAGS field creates /libpath... secp256k1.lib (correct), but at a later stage\n    # /libpath is converted to \\libpath and fails to be interpreted as a flag by the linker\n    # This may be an issue with libsecp256k1.pc, i.e. wrong slash used that triggers the slash conversion\n    target_link_libraries(${CFFI_OUTPUT_LIBRARY} PRIVATE ${VENDORED_AS_SYSTEM_LIB_LIBRARIES})\n    string(REPLACE \"/libpath:\" \"\" VENDORED_AS_SYSTEM_LIB_LIBRARY_DIRS ${VENDORED_AS_SYSTEM_LIB_LIBRARY_DIRS})\n    string(REPLACE \"/LIBPATH:\" \"\" VENDORED_AS_SYSTEM_LIB_LIBRARY_DIRS ${VENDORED_AS_SYSTEM_LIB_LIBRARY_DIRS})\n    target_link_directories(${CFFI_OUTPUT_LIBRARY} PRIVATE ${VENDORED_AS_SYSTEM_LIB_LIBRARY_DIRS})\nelse()\n    message(FATAL_ERROR \"Vendored library not found.\")\nendif()\n\n\n# Add platform-specific definitions\nif(CMAKE_SYSTEM_NAME STREQUAL \"Linux\")\n    target_compile_definitions(${CFFI_OUTPUT_LIBRARY} PUBLIC \"IS_LINUX\")\nendif()\nif(CMAKE_SYSTEM_NAME STREQUAL \"Darwin\")\n    target_compile_definitions(${CFFI_OUTPUT_LIBRARY} PUBLIC \"IS_MACOS\")\nendif()\nif(CMAKE_SYSTEM_NAME STREQUAL \"Windows\")\n    target_compile_definitions(${CFFI_OUTPUT_LIBRARY} PUBLIC \"IS_WINDOWS\")\nendif()\n"
  },
  {
    "path": "cm_vendored_library/CMakeLists.txt",
    "content": "if (PROJECT_IGNORE_SYSTEM_LIB OR NOT VENDORED_AS_SYSTEM_LIB_FOUND)\n    # Note that this could also be handled by: ExternalProject_Add\n    # However, FetchContent is a more flexible way to handle this\n    # https://cmake.org/cmake/help/latest/module/ExternalProject.html\n    # https://cmake.org/cmake/help/latest/module/FetchContent.html\n    include(GNUInstallDirs)\n    include(FetchContent)\n\n    # Set ULR based upon CMake definitions\n    if (NOT VENDORED_UPSTREAM_URL)\n        set(VENDORED_UPSTREAM_URL \"https://github.com/bitcoin-core/secp256k1/archive\")\n    endif()\n\n    if (NOT VENDORED_UPSTREAM_REF)\n       message(STATUS \"VENDORED_UPSTREAM_REF not set, using default value.\")\n       set(VENDORED_UPSTREAM_REF \"1ad5185cd42c0636104129fcc9f6a4bf9c67cc40\")\n    endif()\n\n    if (NOT VENDORED_UPSTREAM_SHA)\n        message(STATUS \"VENDORED_UPSTREAM_SHA not set, using default value.\")\n        set(VENDORED_UPSTREAM_SHA \"ba34be4319f505c5766aa80b99cfa696cbb2993bfecf7d7eb8696106c493cb8c\")\n    endif()\n\n    if (NOT CMAKE_BUILD_TYPE)\n        set(CMAKE_BUILD_TYPE Release)\n    endif()\n\n    # -fPIC is needed since we will link it from a shared object\n    if (VENDORED_LIBRARY_STATIC_BUILD)\n        set(CMAKE_POSITION_INDEPENDENT_CODE ON)\n    endif()\n\n    include(UpdateVendoredLibraryOptions)\n    UpdateVendoredLibraryOptions(\"VENDORED_OPTION\" \"${VENDORED_LIBRARY_OPTION_PREFIX}\")\n\n\n    FetchContent_Declare(\n        vendored_library\n        URL \"${VENDORED_UPSTREAM_URL}/${VENDORED_UPSTREAM_REF}.tar.gz\"\n        URL_HASH \"SHA256=${VENDORED_UPSTREAM_SHA}\"\n    )\n    FetchContent_MakeAvailable(vendored_library)\n\n    if (NOT IS_DIRECTORY ${vendored_library_SOURCE_DIR}/include)\n        message(FATAL_ERROR \"The system library: ${VENDORED_LIBRARY_PKG_CONFIG} was not found OR\")\n        message(FATAL_ERROR \"The IGNORE_SYSTEM_LIB flag was not set (${PROJECT_IGNORE_SYSTEM_LIB}) OR\")\n        message(FATAL_ERROR \"The vendored library was not installed correctly (<src>/include does not exists). Exiting\")\n    else()\n        set(VENDORED_HEADERS_DIR \"${vendored_library_SOURCE_DIR}/include\" CACHE PATH \"Path to the vendored headers\")\n\n        # Avoid spurious warnings when building the vendored library\n        unset(VENDORED_UPSTREAM_URL PARENT_SCOPE)\n        unset(VENDORED_UPSTREAM_REF PARENT_SCOPE)\n        unset(VENDORED_UPSTREAM_SHA PARENT_SCOPE)\n    endif()\nelse()\n    include(UnsetVendoredLibraryOptions)\n    UnsetVendoredLibraryOptions(\"VENDORED_OPTION\")\n    unset(VENDORED_LIBRARY_OPTION_PREFIX)\n    unset(VENDORED_LIBRARY_STATIC_BUILD)\n    unset(VENDORED_UPSTREAM_URL)\n    unset(VENDORED_UPSTREAM_REF)\n    unset(VENDORED_UPSTREAM_SHA)\nendif()"
  },
  {
    "path": "cmake/SetCrossCompilerGithubActions.cmake",
    "content": "function(SetCrossCompilerGithubActions)\n    # Cross-compilation options: This is setup for Github/Actions runners\n    # For Linux, we use cibuildwheel to build the wheels, which uses Docker\n    if (PROJECT_CROSS_COMPILE_TARGET AND CMAKE_SYSTEM_NAME STREQUAL \"Darwin\")\n        set(AUTOMATIC_OSX_TARGETS \"armv7\" \"armv7s\" \"arm64\" \"arm64e\" \"x86_64\")\n\n        if (\"${PROJECT_CROSS_COMPILE_TARGET}\" IN_LIST AUTOMATIC_OSX_TARGETS)\n            set(CMAKE_OSX_ARCHITECTURES ${PROJECT_CROSS_COMPILE_TARGET})\n        else()\n            message(FATAL_ERROR \"Cross-compilation target not supported: >${PROJECT_CROSS_COMPILE_TARGET}< (${AUTOMATIC_OSX_TARGETS})\")\n        endif()\n\n    elseif (PROJECT_CROSS_COMPILE_TARGET AND CMAKE_SYSTEM_NAME STREQUAL \"Windows\")\n        set(AUTOMATIC_WINDOWS_TARGETS \"AMD64\" \"x86\" \"arm64\")\n\n        if (\"${PROJECT_CROSS_COMPILE_TARGET}\" IN_LIST AUTOMATIC_WINDOWS_TARGETS)\n            # Cross-compilation for Windows host system:\n            set(CMAKE_SYSTEM_PROCESSOR ${PROJECT_CROSS_COMPILE_TARGET})\n            set(CMAKE_LIBRARY_ARCHITECTURE  ${PROJECT_CROSS_COMPILE_TARGET})\n        else()\n            message(FATAL_ERROR \"Cross-compilation target not supported: >${PROJECT_CROSS_COMPILE_TARGET}< (${AUTOMATIC_WINDOWS_TARGETS})\")\n        endif()\n    endif()\nendfunction()\n"
  },
  {
    "path": "cmake/SetDefaultVendoredLibrary.cmake",
    "content": "function (SetDefaultVendoredLibrary)\n    if (DEFINED VENDORED_LIBRARY_CMAKE_TARGET)\n        set(VENDORED_LIBRARY_CMAKE_TARGET  ${VENDORED_LIBRARY_CMAKE_TARGET})\n    else()\n        set(VENDORED_LIBRARY_CMAKE_TARGET  \"secp256k1\")\n    endif()\n    set(VENDORED_LIBRARY_CMAKE_TARGET  ${VENDORED_LIBRARY_CMAKE_TARGET} PARENT_SCOPE)\n\n    if (DEFINED VENDORED_LIBRARY_PKG_CONFIG)\n        set(VENDORED_LIBRARY_PKG_CONFIG  ${VENDORED_LIBRARY_PKG_CONFIG})\n    else()\n        set(VENDORED_LIBRARY_PKG_CONFIG  \"lib${VENDORED_LIBRARY_CMAKE_TARGET}\")\n    endif()\n    set(VENDORED_LIBRARY_PKG_CONFIG  ${VENDORED_LIBRARY_PKG_CONFIG} PARENT_SCOPE)\n\n    if (DEFINED VENDORED_LIBRARY_PKG_CONFIG_VERSION)\n        set(VENDORED_LIBRARY_PKG_CONFIG_VERSION  ${VENDORED_LIBRARY_PKG_CONFIG_VERSION})\n    else()\n        set(VENDORED_LIBRARY_PKG_CONFIG_VERSION  \"0.4.1\")\n    endif()\n    set(VENDORED_LIBRARY_PKG_CONFIG_VERSION  ${VENDORED_LIBRARY_PKG_CONFIG_VERSION} PARENT_SCOPE)\nendfunction()"
  },
  {
    "path": "cmake/SetSystemLibIfExists.cmake",
    "content": "function (SetSystemLibIfExists)\n    set(ENV{PKG_CONFIG_PATH} \"$ENV{PKG_CONFIG_PATH};$ENV{CONDA_PREFIX}/Library/lib/pkgconfig;$ENV{CONDA_PREFIX}/lib/pkgconfig\")\n    if(CMAKE_SYSTEM_NAME STREQUAL \"Windows\")\n        set(PKG_CONFIG_EXECUTABLE \"${PKG_CONFIG_EXECUTABLE};--msvc-syntax;--dont-define-prefix\")\n    endif()\n    pkg_check_modules(VENDORED_AS_SYSTEM_LIB IMPORTED_TARGET GLOBAL ${VENDORED_LIBRARY_PKG_CONFIG}>=${VENDORED_LIBRARY_PKG_CONFIG_VERSION})\nendfunction()\n"
  },
  {
    "path": "cmake/UnsetVendoredLibraryOptions.cmake",
    "content": "function (UnsetVendoredLibraryOptions _prefix)\n    get_cmake_property(_vars VARIABLES)\n    string (REGEX MATCHALL \"(^|;)${_prefix}[A-Za-z0-9_]*\" _matchedVars \"${_vars}\")\n    foreach (_var ${_matchedVars})\n        unset (${_var} PARENT_SCOPE)\n    endforeach()\nendfunction()\n"
  },
  {
    "path": "cmake/UpdateVendoredLibraryOptions.cmake",
    "content": "function (UpdateVendoredLibraryOptions _prefix _newPrefix)\n    get_cmake_property(_vars VARIABLES)\n    string (REGEX MATCHALL \"(^|;)${_prefix}[A-Za-z0-9_]*\" _matchedVars \"${_vars}\")\n    foreach (_var ${_matchedVars})\n        string (REGEX REPLACE \"^${_prefix}\" \"${_newPrefix}\" _newVar ${_var})\n        set(${_newVar} ${${_var}} PARENT_SCOPE)\n        unset (${_var} PARENT_SCOPE)\n    endforeach()\nendfunction()\n"
  },
  {
    "path": "cmake/VerifyPythonModule.cmake",
    "content": "# Verify CFFI python module is available\nfunction(VerifyPythonModule module python_executable)\n    find_package(Python3 REQUIRED COMPONENTS Interpreter)\n    execute_process(\n        COMMAND         ${python_executable} -c \"import ${module}\"\n        ERROR_VARIABLE  _error\n        OUTPUT_QUIET\n        ERROR_STRIP_TRAILING_WHITESPACE\n    )\n\n    if(_error)\n        message(FATAL_ERROR \"${module} is required to build coincurve\")\n    endif()\nendfunction()\n"
  },
  {
    "path": "docs/.snippets/abbrs.txt",
    "content": "*[ECDH]: Elliptic-curve Diffie–Hellman\n*[PyPI]: Python Package Index\n"
  },
  {
    "path": "docs/.snippets/links.txt",
    "content": "[Bitcoin Core]: https://github.com/bitcoin/bitcoin\n[ECDH]: https://en.wikipedia.org/wiki/Elliptic-curve_Diffie%E2%80%93Hellman\n[RFC 6979]: https://tools.ietf.org/html/rfc6979\n[libsecp256k1]: https://github.com/bitcoin-core/secp256k1\n[secp256k1]: https://en.bitcoin.it/wiki/Secp256k1\n"
  },
  {
    "path": "docs/api.md",
    "content": "# Developer Interface\n\n-----\n\nAll objects are available directly under the root namespace `coincurve`.\n\n::: coincurve.verify_signature\n\n::: coincurve.PrivateKey\n    options:\n      members:\n      - __init__\n      - sign\n      - sign_recoverable\n      - sign_schnorr\n      - ecdh\n      - add\n      - multiply\n      - to_int\n      - to_hex\n      - to_pem\n      - to_der\n      - from_int\n      - from_hex\n      - from_pem\n      - from_der\n\n::: coincurve.PublicKey\n    options:\n      members:\n      - __init__\n      - verify\n      - format\n      - point\n      - combine\n      - add\n      - multiply\n      - combine_keys\n      - from_signature_and_message\n      - from_secret\n      - from_valid_secret\n      - from_point\n\n::: coincurve.PublicKeyXOnly\n    options:\n      members:\n      - __init__\n      - verify\n      - format\n      - tweak_add\n      - from_secret\n      - from_valid_secret\n"
  },
  {
    "path": "docs/assets/css/custom.css",
    "content": "/* Brighter links for dark mode */\n[data-md-color-scheme=slate] {\n  /* https://github.com/squidfunk/mkdocs-material/blob/9.1.2/src/assets/stylesheets/main/_colors.scss#L91-L92 */\n  --md-typeset-a-color: var(--md-primary-fg-color--light);\n}\n\n/* FiraCode https://github.com/tonsky/FiraCode */\ncode { font-family: 'Fira Code', monospace; }\n@supports (font-variation-settings: normal) {\n  code { font-family: 'Fira Code VF', monospace; }\n}\n\n/* https://github.com/squidfunk/mkdocs-material/issues/1522 */\n.md-typeset h5 {\n  color: var(--md-default-fg-color);\n  text-transform: none;\n}\n\n/* Indentation. */\ndiv.doc-contents:not(.first) {\n  padding-left: 25px;\n  border-left: .05rem solid var(--md-typeset-table-color);\n}\n\n/* Mark external links as such. */\na.external::after,\na.autorefs-external::after {\n  /* https://primer.style/octicons/arrow-up-right-24 */\n  mask-image: url('data:image/svg+xml,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M18.25 15.5a.75.75 0 00.75-.75v-9a.75.75 0 00-.75-.75h-9a.75.75 0 000 1.5h7.19L6.22 16.72a.75.75 0 101.06 1.06L17.5 7.56v7.19c0 .414.336.75.75.75z\"></path></svg>');\n  -webkit-mask-image: url('data:image/svg+xml,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M18.25 15.5a.75.75 0 00.75-.75v-9a.75.75 0 00-.75-.75h-9a.75.75 0 000 1.5h7.19L6.22 16.72a.75.75 0 101.06 1.06L17.5 7.56v7.19c0 .414.336.75.75.75z\"></path></svg>');\n  content: ' ';\n\n  display: inline-block;\n  vertical-align: middle;\n  position: relative;\n\n  height: 1em;\n  width: 1em;\n  background-color: currentColor;\n}\n\na.external:hover::after,\na.autorefs-external:hover::after {\n  background-color: var(--md-accent-fg-color);\n}\n"
  },
  {
    "path": "docs/benchmarks.md",
    "content": "# Benchmarks\n\n-----\n\n## Setup\n\nDownload [Hatch](https://hatch.pypa.io/latest/install/) or [UV](https://docs.astral.sh/uv/getting-started/installation/) in order to run the benchmarks as follows:\n\n```\n[hatch|uv] run scripts/bench.py\n```\n\n## Results\n\n| Library | Key generation | Signing | Verification | Key export | Key import |\n| --- | --- | --- | --- | --- | --- |\n| coincurve v21.0.0 | 33.4 | 52.8 | 59.0 | 12.6 | 39.4 |\n| [fastecdsa](https://github.com/AntonKueltz/fastecdsa) v3.0.1 | 1319.6 | 1449.5 | 1160.4 | 1402.9 | 15.5 |\n\n!!! note\n    - the timings are in microseconds\n    - signing and verification use a 16 KiB message\n    - the Python version used for the benchmarks is 3.13.x\n"
  },
  {
    "path": "docs/history.md",
    "content": "# History\n\n-----\n\nImportant changes are emphasized.\n\n## Unreleased\n\n## 21.0.0\n\n- **Breaking:** Drop support for Python 3.8\n- Add support for Python 3.13\n- Remove all runtime dependencies (`cffi` & `asn1crypto`)\n- Add `COINCURVE_VENDOR_CFFI` environment variable to control vendoring of the `_cffi_backend` module\n- Minor performance improvement by removing use of formatted string constants\n- Upgrade [libsecp256k1][] to version 0.6.0\n\n## 20.0.0\n\n- **Breaking:** CMake is now a build dependency; this is only a breaking change for redistributors as building with standard Python packaging tools will automatically use the CMake that is available on PyPI\n- **Breaking:** Stop building wheels for Windows 32-bit\n- Build wheels for Windows ARM64\n- Upgrade [libsecp256k1][] to version 0.5.0\n\n## 19.0.1\n\n- Fix regression in Windows wheels\n\n## 19.0.0\n\n- **Breaking:** Drop support for Python 3.7\n- Add support for Python 3.12\n- Upgrade [libsecp256k1][] to version 0.4.1\n\n## 18.0.0\n\n- Support Schnorr signatures\n- Add support for Python 3.11\n- Upgrade [libsecp256k1][] to the latest available version\n\n## 17.0.0\n\n- **Breaking:** Drop support for Python 3.6\n- Fix wheels for Apple M1\n- Upgrade [libsecp256k1][] to the latest available version\n\n## 16.0.0\n\n- Wheels for Apple Silicon and musl linux (Alpine)\n- No wheels for PyPy until the build system is fixed\n\n## 15.0.1\n\n- Fix the `combine` method of `PublicKey`\n\n## 15.0.0\n\n- **Breaking:** Drop support for Python 2\n- **Breaking:** Binary wheels for CPython require version 19.3 or later of ``pip`` to install\n- Build AArch64 binary wheels for Linux\n- Build binary wheels for PyPy3.6 7.3.3 & PyPy3.7 7.3.3 on Linux\n- Upgrade [libsecp256k1][] to the latest available version\n- Upgrade libgmp to the latest available version\n- Introduce `COINCURVE_UPSTREAM_REF` environment variable to select an alternative [libsecp256k1][] version when building from source\n- Support PEP 561 type hints\n- Added support for supplying a custom nonce to `PrivateKey.sign_recoverable`\n\n## 14.0.0\n\n**IMPORTANT: This will be the final release that supports Python 2.**\n\n- **New:** Binary wheels for Python 3.9\n- **Breaking:** Drop support for Python 3.5\n- Fetch [libsecp256k1][] source if the system installation lacks ECDH support\n- Fix innocuous `setuptools` warning when building from source\n- Switch CI/CD to GitHub Actions\n\n## 13.0.0\n\n- **New:** Binary wheels for Python 3.8\n- Support building on OpenBSD\n- Improve handling of PEM private key deserialization\n- Improve ECDH documentation\n- Improvements from [libsecp256k1][] master\n\n## 12.0.0\n\n- **New:** Binary wheels on Linux for PyPy3.6 v7.1.1-beta\n- **New:** Binary wheels on macOS for Python 3.8.0-alpha.3\n- **New:** Binary wheels on Linux are now also built with the new [manylinux2010](https://www.python.org/dev/peps/pep-0571) spec for 64-bit platforms\n- Improvements from [libsecp256k1][] master\n\n## 11.0.0\n\n- Fix some linking scenarios by placing bundled [libsecp256k1][] dir first in path\n- Allow override of system [libsecp256k1][] with environment variable\n- Add benchmarks\n- Use Codecov to track coverage\n- Use black for code formatting\n\n## 10.0.0\n\n- Support tox for testing\n- Compatibility with latest [libsecp256k1][] ECDH API\n- Make libgmp optional when building from source\n\n## 9.0.0\n\n- Fixed wheels for macOS\n- **Breaking:** Drop support for 32-bit macOS\n\n## 8.0.2\n\n- No longer package tests\n\n## 8.0.0\n\n- **New:** Binary wheels for Python 3.7\n- **Changed:** Binary wheels on macOS for Python 3.5 now use Homebrew\n  Python for compilation due to new security requirements\n- Make build system support new GitHub & PyPI security requirements\n- Improvements from [libsecp256k1][] master\n\n## 7.1.0\n\n- Pin version of [libsecp256k1][]\n- Improve docs\n\n## 7.0.0\n\n- Improvements from [libsecp256k1][] master\n- Fix build script\n\n## 6.0.0\n\n- Resolved #6. You can choose to use this or remain on `5.2.0`. This will only be a temporary change, see 3e93480b3e38c6b9beb0bc2de83bc3630fc74c46.\n\n## 5.2.0\n\n- Added support for supplying a custom nonce to `PrivateKey.sign`\n\n## 5.1.0\n\n- Added `PublicKey.combine_keys` class method\n- Improvements to documentation\n\n## 5.0.1\n\n- Fixed an issue where secret validation would occasionally erroneously error\n  on user-provided secrets (secrets not generated by Coincurve itself) if there\n  were not exactly 256 bits of entropy. See #5.\n\n## 5.0.0\n\n- **Breaking:** Coincurve is now dual-licensed under the terms of `MIT` and `Apache-2.0`\n- Performance improvements from [libsecp256k1][] master\n- Improvements to documentation.\n\n## 4.5.1\n\n- First public stable release\n"
  },
  {
    "path": "docs/index.md",
    "content": "# coincurve\n\n| | |\n| --- | --- |\n| CI/CD | [![CI - Test](https://github.com/ofek/coincurve/actions/workflows/build.yml/badge.svg){ loading=lazy }](https://github.com/ofek/coincurve/actions/workflows/build.yml) [![CI - Coverage](https://img.shields.io/codecov/c/github/ofek/coincurve/master.svg?logo=codecov&logoColor=red){ loading=lazy }](https://codecov.io/github/ofek/coincurve) |\n| Docs | [![CI - Docs](https://github.com/ofek/coincurve/actions/workflows/docs.yml/badge.svg){ loading=lazy }](https://github.com/ofek/coincurve/actions/workflows/docs.yml) |\n| Package | [![PyPI - Version](https://img.shields.io/pypi/v/coincurve.svg?logo=pypi&label=PyPI&logoColor=gold){ loading=lazy }](https://pypi.org/project/coincurve/) [![PyPI - Downloads](https://img.shields.io/pypi/dm/coincurve.svg?color=blue&label=Downloads&logo=pypi&logoColor=gold){ loading=lazy }](https://pypi.org/project/coincurve/) [![Required Python Version](https://img.shields.io/python/required-version-toml?tomlFilePath=https%3A%2F%2Fraw.githubusercontent.com%2Fofek%2Fcoincurve%2FHEAD%2Fpyproject.toml){ loading=lazy }](https://pypi.org/project/coincurve/) |\n| Meta | [![Hatch project](https://img.shields.io/badge/%F0%9F%A5%9A-Hatch-4051b5.svg){ loading=lazy }](https://github.com/ofek/dep-sync) [![linting - Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json){ loading=lazy }](https://github.com/astral-sh/ruff) [![types - Mypy](https://img.shields.io/badge/types-Mypy-blue.svg){ loading=lazy }](https://github.com/python/mypy) [![License - MIT OR Apache-2.0](https://img.shields.io/badge/license-MIT%20OR%20Apache--2.0-9400d3.svg){ loading=lazy }](https://spdx.org/licenses/) [![GitHub Sponsors](https://img.shields.io/github/sponsors/ofek?logo=GitHub%20Sponsors&style=social){ loading=lazy }](https://github.com/sponsors/ofek) |\n\n-----\n\nThis library provides well-tested Python bindings for [libsecp256k1][], the heavily optimized\nC library used by [Bitcoin Core][] for operations on the elliptic curve [secp256k1][].\n\n## Features\n\n- Fastest available implementation (more than 10x faster than OpenSSL)\n- Clean, easy to use API\n- Frequent updates from the development version of [libsecp256k1][]\n- Linux, macOS, and Windows all have binary packages for multiple architectures\n- Deterministic signatures as specified by [RFC 6979][]\n- Non-malleable signatures (lower-S form) by default\n- Secure, non-malleable [ECDH][] implementation\n\n## Users\n\n- [Ethereum](https://ethereum.org)\n- [LBRY](https://lbry.com)\n- [libp2p](https://libp2p.io)\n\nand [many more](users.md)!\n\n## License\n\n`coincurve` is distributed under the terms of any of the following licenses:\n\n- [MIT](https://spdx.org/licenses/MIT.html)\n- [Apache-2.0](https://spdx.org/licenses/Apache-2.0.html)\n\n## Navigation\n\nDesktop readers can use keyboard shortcuts to navigate.\n\n| Keys | Action |\n| --- | --- |\n| <ul><li><kbd>,</kbd> (comma)</li><li><kbd>p</kbd></li></ul> | Navigate to the \"previous\" page |\n| <ul><li><kbd>.</kbd> (period)</li><li><kbd>n</kbd></li></ul> | Navigate to the \"next\" page |\n| <ul><li><kbd>/</kbd></li><li><kbd>s</kbd></li></ul> | Display the search modal |\n"
  },
  {
    "path": "docs/install.md",
    "content": "# Installation\n\n-----\n\n`coincurve` is available on PyPI and can be installed with [pip](https://pip.pypa.io):\n\n```\npip install coincurve\n```\n\n## Wheel\n\nBinary wheels are available for most platforms and require at least version `19.3` of pip to install.\n\n| | | | | |\n| --- | --- | --- | --- | --- |\n| | macOS | Windows | Linux (glibc) | Linux (musl) |\n| CPython 3.9 | <ul><li>x86_64</li><li>ARM64</li></ul> | <ul><li>x86_64</li><li>ARM64</li></ul> | <ul><li>x86_64</li><li>i686</li><li>AArch64</li></ul> | <ul><li>x86_64</li><li>i686</li><li>AArch64</li></ul> |\n| CPython 3.10 | <ul><li>x86_64</li><li>ARM64</li></ul> | <ul><li>x86_64</li><li>ARM64</li></ul> | <ul><li>x86_64</li><li>i686</li><li>AArch64</li></ul> | <ul><li>x86_64</li><li>i686</li><li>AArch64</li></ul> |\n| CPython 3.11 | <ul><li>x86_64</li><li>ARM64</li></ul> | <ul><li>x86_64</li><li>ARM64</li></ul> | <ul><li>x86_64</li><li>i686</li><li>AArch64</li></ul> | <ul><li>x86_64</li><li>i686</li><li>AArch64</li></ul> |\n| CPython 3.12 | <ul><li>x86_64</li><li>ARM64</li></ul> | <ul><li>x86_64</li><li>ARM64</li></ul> | <ul><li>x86_64</li><li>i686</li><li>AArch64</li></ul> | <ul><li>x86_64</li><li>i686</li><li>AArch64</li></ul> |\n| CPython 3.13 | <ul><li>x86_64</li><li>ARM64</li></ul> | <ul><li>x86_64</li><li>ARM64</li></ul> | <ul><li>x86_64</li><li>i686</li><li>AArch64</li></ul> | <ul><li>x86_64</li><li>i686</li><li>AArch64</li></ul> |\n\n## Source\n\nIf you are on a platform without support for pre-compiled wheels, you will need certain system packages in order to build from source.\n\nA few environment variables influence the build:\n\n- `COINCURVE_UPSTREAM_REF` - This is the Git reference of [libsecp256k1][] to use rather than the (frequently updated) default.\n- `COINCURVE_IGNORE_SYSTEM_LIB` - The presence of this will force fetching of [libsecp256k1][] even if it's already detected at the system level.\n- `COINCURVE_VENDOR_CFFI` - Setting this to anything other than `1` (the default) prevents vendoring of the `_cffi_backend` module. Re-distributors should make sure to require `cffi` as a runtime dependency when disabling this.\n\n!!! tip\n    To avoid installing the binary wheels on compatible distributions, use the `--no-binary` option.\n\n    ```\n    pip install coincurve --no-binary coincurve\n    ```\n\n### Alpine\n\n```\nsudo apk add autoconf automake build-base libffi-dev libtool pkgconfig python3-dev\n```\n\n### Debian/Ubuntu\n\n```\nsudo apt-get install -y autoconf automake build-essential libffi-dev libtool pkg-config python3-dev\n```\n\n### RHEL/CentOS\n\n```\nsudo yum install -y autoconf automake gcc gcc-c++ libffi-devel libtool make pkgconfig python3-devel\n```\n\n### macOS\n\n```\nxcode-select --install\nbrew install autoconf automake libffi libtool pkg-config python\n```\n"
  },
  {
    "path": "docs/users.md",
    "content": "# Users\n\n-----\n\n## Organizations\n\n| Name | Projects |\n| --- | --- |\n| [Anyl](https://github.com/Anylsite) | <ul><li><a href=https://github.com/Anylsite/anyledger-backend/blob/cb9e277ef4ba775384a1eb80ff1577418f88684e/requirements.in#L5> anyledger-backend </a></li></ul> |\n| [ARK](https://ark.io) | <ul><li><a href=https://github.com/ArkEcosystem/python-crypto/blob/1bd016f76b41eba9711be748c1caf20d8042f590/setup.py#L9> python-crypto </a></li></ul> |\n| [Augur](https://www.augur.net) | <ul><li><a href=https://github.com/AugurProject/augur-core/blob/5388e00120d3e2328b5ccc70960bedff1c8a03dd/requirements.txt#L9> augur-core </a></li></ul> |\n| [Blockcerts](https://www.blockcerts.org) | <ul><li><a href=https://github.com/blockchain-certificates/cert-issuer/blob/9b0ed451ef686018a507acd8bb7d217263a6fbf4/ethereum_requirements.txt#L2> cert-issuer </a></li></ul> |\n| [ECIES](https://ecies.org) | <ul><li><a href=https://github.com/ecies/py/blob/7d4bd252129410eb1472d9e3cf0fd9f1fcfaf174/pyproject.toml#L38> py </a></li></ul> |\n| [Elements](https://elementsproject.org) | <ul><li><a href=https://github.com/ElementsProject/lightning/blob/d134580419b90f2299cfa3646906b8b8b96c356e/requirements.txt#L33> lightning </a></li></ul> |\n| [Ethereum](https://ethereum.org) | <ul><li><a href=https://github.com/ethereum/alexandria/blob/adba4114fbd5f707181da602abd977e008e463c9/setup.py#L67> alexandria </a></li><li><a href=https://github.com/ethereum/ddht/blob/341e84e9163338556cd48dd2fcfda9eedec3eb45/setup.py#L73> ddht </a></li><li><a href=https://github.com/ethereum/eth-keys/blob/dd4f00a5d2f2b394665ccecc9817f753e58cc7bc/setup.py#L10> eth-keys </a></li><li><a href=https://github.com/ethereum/eth-tester/blob/1e37e846915374914bdc2950fbb2f9ea6ca2f3ec/tox.ini#L16> eth-tester </a></li><li><a href=https://github.com/ethereum/py-evm/blob/5e949a457fbe6692dcd9e9e2f141a1848000a0c2/setup.py#L26> py-evm </a></li><li><a href=https://github.com/ethereum/pydevp2p/blob/b09b8a06a152f34cd7dc7950b14b04e3f01511af/requirements.txt#L8> pydevp2p </a></li><li><a href=https://github.com/ethereum/trinity/blob/65609f8fda7d880c0efe859ea84a7d0935c02edb/setup.py#L39> trinity </a></li></ul> |\n| [Gnosis](https://gnosis.io) | <ul><li><a href=https://github.com/gnosis/gnosis-py/blob/7bad62eb83b50cf952227f5ae1019c95b8b4d9cd/README.rst#quick-start> gnosis-py </a></li></ul> |\n| [Golem Network](https://golem.network) | <ul><li><a href=https://github.com/golemfactory/concent/blob/23ffa9464c995a628aa570bc9a0a05d29f48b044/concent_api/requirements.lock#L18> concent </a></li><li><a href=https://github.com/golemfactory/golem/blob/6280b5d946640e81c475c66c5de4a9e53cbfcc69/requirements.txt#L25> golem </a></li><li><a href=https://github.com/golemfactory/golem-messages/blob/aae2a60a88c938f5ed7012b838cf2a29934b58b2/setup.py#L41> golem-messages </a></li></ul> |\n| [ICON Foundation](https://icon.foundation) | <ul><li><a href=https://github.com/icon-project/goloop/blob/6c8341e0c29fc7f9136221f315e8a76af9b5450c/pyee/requirements.txt#L2> goloop </a></li><li><a href=https://github.com/icon-project/icon-sdk-python/blob/cb293688c154349cabeb9b3f50a1cab29e91859d/requirements.txt#L2> icon-sdk-python </a></li><li><a href=https://github.com/icon-project/icon-service/blob/73c8d4521374207ef77e63b789fd511fc6d028b8/requirements.txt#L3> icon-service </a></li><li><a href=https://github.com/icon-project/loopchain/blob/9f29e8914918e12d683f2e1318c9b3c52dbee08d/requirements.txt#L11> loopchain </a></li><li><a href=https://github.com/icon-project/t-bears/pull/77> t-bears </a></li></ul> |\n| [LBRY](https://lbry.com) | <ul><li><a href=https://github.com/lbryio/lbry-android-sdk/blob/b0331248cdb7b1ca4a866e4aaa166dd820549e56/recipes/coincurve/__init__.py> lbry-android-sdk </a></li><li><a href=https://github.com/lbryio/lbry-sdk/blob/7486ee95371c238d51e1c2552113ad25bfaf0426/setup.py#L53> lbry-sdk </a></li></ul> |\n| [libp2p](https://libp2p.io) | <ul><li><a href=https://github.com/libp2p/py-libp2p/blob/12786f4e26783b530279a6f89089cf69af8e3922/setup.py#L73> py-libp2p </a></li></ul> |\n| [Microsoft](https://www.microsoft.com) | <ul><li><a href=https://github.com/microsoft/CCF/blob/f6670587ec1cb6c0faf8efcc6e4d08b8f4c1fd60/tests/requirements.txt#L4> CCF </a></li></ul> |\n| [NuCypher](https://www.nucypher.com) | <ul><li><a href=https://github.com/nucypher/nucypher/blob/24a57e1c810aa6408ecfc24942956925146aa024/requirements.txt#L16> nucypher </a></li><li><a href=https://github.com/nucypher/nucypher-monitor/blob/f8df51a37d0299c36541b26ef13d72fa390c294e/requirements.txt#L17> nucypher-monitor </a></li></ul> |\n| [Quantstamp](https://quantstamp.com) | <ul><li><a href=https://github.com/quantstamp/qsp-protocol-node/blob/6f776b01c91a3b1c306ab74932324ea367fa6157/requirements.txt#L32> qsp-protocol-node </a></li></ul> |\n| [QuarkChain](https://www.quarkchain.io) | <ul><li><a href=https://github.com/QuarkChain/pyquarkchain/blob/1f858f46efe31c3fb3bac20cdbd44eb94d89fb63/requirements.txt#L4> pyquarkchain </a></li></ul> |\n| [Raiden Network](https://raiden.network) | <ul><li><a href=https://github.com/raiden-network/demo-train/blob/66d187bd4f9e83a7d8d0cc43fc5d31c8444745f5/requirements.txt#L16> demo-train </a></li><li><a href=https://github.com/raiden-network/light-client/blob/8da39f8f164a3d93674889db39875003e1bc6e93/e2e-environment/synapse/auth/eth_auth_provider.py#L20> light-client </a></li><li><a href=https://github.com/raiden-network/microraiden/blob/2d51e78afaf3c0a8ddab87e59a5260c0064cdbdd/requirements.txt#L5> microraiden </a></li><li><a href=https://github.com/raiden-network/raiden/blob/e4c0f6d22788eddf51da551f11ea988a8dd5fd0d/requirements/requirements.in#L4> raiden </a></li><li><a href=https://github.com/raiden-network/raiden-contracts/blob/93230caa554f6f29e55b4521aafd0af20b710b1f/requirements.txt#L3> raiden-contracts </a></li><li><a href=https://github.com/raiden-network/raiden-service-bundle/blob/1ba6a265016eca4ade0ed4f2a198cebc570c11d3/build/synapse/Dockerfile#L18> raiden-service-bundle </a></li><li><a href=https://github.com/raiden-network/raiden-services/blob/b5d0f81447fbe476ed8185d825560b2b9327d455/src/raiden_libs/utils.py#L4> raiden-services </a></li><li><a href=https://github.com/raiden-network/raiden-wizard/blob/bf2fe8662be4db2c36bcc920d8e31cec888a496e/requirements.txt#L17> raiden-wizard </a></li><li><a href=https://github.com/raiden-network/raidex/blob/master/requirements.txt#L12> raidex </a></li></ul> |\n| [SKALE Network](https://skale.network) | <ul><li><a href=https://github.com/skalenetwork/libBLS/blob/785b7ab11f78512f6466b6dc996c4db44825696a/.travis.yml#L46> libBLS </a></li><li><a href=https://github.com/skalenetwork/sgx.py/blob/efff7d1a09abbea2c703cc21b25f9a6d9e7fcb79/setup.py#L11> sgx.py </a></li></ul> |\n\n## Projects\n\n- [bit](https://github.com/ofek/bit/blob/776f97ae7f9b3f05157113abc913eb141b2817ee/setup.py#L44)\n- [btcrecover](https://github.com/gurnec/btcrecover/commit/f113867fa22d2f5b22175cc2b5b3892351bc1109)\n- [crankycoin](https://github.com/cranklin/crankycoin/blob/7663a1c5429b3ddd11997b6a2e3488018789bf3b/requirements.txt#L2)\n- [ForkDelta](https://github.com/forkdelta/backend-replacement/blob/97ccd1a19544f26d242a8412113086f0c0dd5760/requirements.txt#L46)\n- [Heimdall](https://github.com/maddevsio/heimdall/blob/21f16880030cfdb1c1c97969158bec02ca6c0336/requirements.txt#L14)\n- [HoneyBadgerBFT](https://github.com/initc3/HoneyBadgerBFT-Python/blob/e8bcbc081dfb5d1e7298039d47bbebf7048b8e62/setup.py#L30)\n- [JoinMarket](https://github.com/JoinMarket-Org/joinmarket-clientserver/blob/dc581e9c99d7db6436ed9f8913b6ce614bcef8d8/jmbitcoin/setup.py#L13)\n- [minichain](https://github.com/kigawas/minichain/blob/0ae0437fdc4aa05e73c4d31a8df91d371542c8fe/pyproject.toml#L13)\n- [Nekoyume](https://github.com/nekoyume/nekoyume/blob/0dec2d6f1002091f3f727bd645ce67fadd85faeb/setup.cfg#L45)\n- [NuCypher](https://github.com/nucypher/nucypher/blob/24a57e1c810aa6408ecfc24942956925146aa024/requirements.txt#L16)\n- [python-idex](https://github.com/sammchardy/python-idex/blob/24cee970172491a7f7d5f52558727a77384cce26/requirements.txt#L2)\n- [Rotki](https://github.com/rotki/rotki/blob/70508f99f890bcbd520f1efe7776194d6a5e5e06/requirements.txt#L8)\n- [Vyper](https://github.com/vyperlang/vyper/blob/3bd0bf96856554810065fa9cfb89afef7625d436/Dockerfile#L15)\n- [ZeroNet](https://github.com/zeronet-conservancy/zeronet-conservancy/blob/b6e18fd3738b4725726c5e170040deb3048c9048/requirements.txt#L12)\n"
  },
  {
    "path": "hatch.toml",
    "content": "[envs.default]\ninstaller = \"uv\"\ndev-mode = false\n\n[envs.hatch-static-analysis]\nconfig-path = \"ruff_defaults.toml\"\ndependencies = [\"ruff==0.13.0\"]\n\n[envs.hatch-test]\ndev-mode = false\n\n[envs.types]\ndependencies = [\n  \"mypy\",\n  \"pytest\",\n]\n[envs.types.scripts]\ncheck = \"mypy --install-types --non-interactive {args:src/coincurve tests}\"\n\n[envs.docs]\ndependencies = [\n  \"mkdocs~=1.6.1\",\n  \"mkdocs-material~=9.5.40\",\n  # Plugins\n  \"mkdocs-minify-plugin~=0.8.0\",\n  \"mkdocs-git-revision-date-localized-plugin~=1.2.9\",\n  \"mkdocs-glightbox~=0.4.0\",\n  \"mkdocs-redirects~=1.2.1\",\n  \"mkdocstrings-python~=1.16.2\",\n  \"mike~=2.1.3\",\n  # Extensions\n  \"pymdown-extensions~=10.11.2\",\n  # Necessary for syntax highlighting in code blocks\n  \"pygments~=2.18.0\",\n  # Validation\n  \"linkchecker~=10.5.0\",\n]\n[envs.docs.env-vars]\nSOURCE_DATE_EPOCH = \"1580601600\"\nPYTHONUNBUFFERED = \"1\"\n[envs.docs.scripts]\nbuild = \"mkdocs build --clean --strict {args}\"\nserve = \"mkdocs serve --dev-addr localhost:8000 {args}\"\nci-build = \"mike deploy --update-aliases {args}\"\nvalidate = \"linkchecker --config .linkcheckerrc site\"\n# https://github.com/linkchecker/linkchecker/issues/678\nbuild-check = [\n  \"build --no-directory-urls\",\n  \"validate\",\n]\n"
  },
  {
    "path": "hatch_build.py",
    "content": "from __future__ import annotations\n\nimport os\nimport shutil\nfrom functools import cached_property\nfrom importlib.metadata import PackagePath, distribution\nfrom typing import Any\n\nimport _cffi_backend  # noqa: PLC2701\nfrom hatchling.builders.hooks.plugin.interface import BuildHookInterface\n\n\nclass CustomBuildHook(BuildHookInterface):\n    \"\"\"\n    A build hook that copies the `_cffi_backend` extension module into the wheel so that\n    the `cffi` package is not required as a runtime dependency.\n    \"\"\"\n\n    LICENSE_NAME = \"LICENSE-cffi\"\n\n    @cached_property\n    def local_cffi_license(self) -> str:\n        return os.path.join(self.root, self.LICENSE_NAME)\n\n    @staticmethod\n    def get_cffi_distribution_license_files() -> list[PackagePath]:\n        license_files = []\n\n        dist_files = distribution(\"cffi\").files or []\n        for f in dist_files:\n            if f.name == \"LICENSE\" and f.parts[0].endswith(\".dist-info\"):\n                license_files.append(f)\n                break\n\n        return license_files\n\n    def initialize(self, version: str, build_data: dict[str, Any]) -> None:  # noqa: ARG002\n        cffi_shared_lib = _cffi_backend.__file__\n        relative_path = f\"coincurve/{os.path.basename(cffi_shared_lib)}\"\n        build_data[\"force_include\"][cffi_shared_lib] = relative_path\n\n        license_files = self.get_cffi_distribution_license_files()\n        if len(license_files) != 1:\n            message = f\"Expected exactly one LICENSE file in cffi distribution, got {len(license_files)}\"\n            raise RuntimeError(message)\n\n        license_file = license_files[0]\n        shutil.copy2(license_file.locate(), self.local_cffi_license)\n        self.metadata.core.license_files.append(self.LICENSE_NAME)\n\n    def finalize(self, version: str, build_data: dict[str, Any], artifact: str) -> None:  # noqa: ARG002\n        os.remove(self.local_cffi_license)\n"
  },
  {
    "path": "mkdocs.yml",
    "content": "site_name: coincurve\nsite_description: Cross-platform Python bindings for libsecp256k1\nsite_author: Ofek Lev\nsite_url: https://ofek.dev/coincurve/\nrepo_name: ofek/coincurve\nrepo_url: https://github.com/ofek/coincurve\nedit_uri: blob/master/docs\ncopyright: 'Copyright &copy; Ofek Lev 2017-present'\n\ndocs_dir: docs\nsite_dir: site\ntheme:\n  name: material\n  language: en\n  font:\n    text: Roboto\n    code: Roboto Mono\n  icon:\n    logo: material/circle-multiple\n    repo: fontawesome/brands/github-alt\n  favicon: assets/images/favicon.ico\n  palette:\n    - media: \"(prefers-color-scheme: dark)\"\n      scheme: slate\n      primary: teal\n      accent: teal\n      toggle:\n        icon: material/weather-night\n        name: Switch to light mode\n    - media: \"(prefers-color-scheme: light)\"\n      scheme: default\n      primary: teal\n      accent: teal\n      toggle:\n        icon: material/weather-sunny\n        name: Switch to dark mode\n  features:\n    - content.action.edit\n    - content.code.copy\n    - content.tabs.link\n    - content.tooltips\n    - navigation.expand\n    - navigation.footer\n    - navigation.instant\n    - navigation.sections\n\nnav:\n  - About: index.md\n  - Install: install.md\n  - API Reference: api.md\n  - Benchmarks: benchmarks.md\n  - Meta:\n    - Users: users.md\n    - History: history.md\n\nplugins:\n  # Built-in\n  search: {}\n  # Extra\n  glightbox: {}\n  minify:\n    minify_html: true\n  git-revision-date-localized:\n    type: date\n    strict: false\n  mkdocstrings:\n    default_handler: python\n    handlers:\n      python:\n        paths:\n          - src\n        options:\n          # Rendering\n          show_root_full_path: false\n          # Headings\n          show_root_heading: true\n          show_source: false\n          show_symbol_type_toc: true\n          # Docstrings\n          show_if_no_docstring: true\n          # Signatures/annotations\n          show_signature_annotations: true\n          signature_crossrefs: true\n          # Other\n          show_bases: false\n        import:\n          - https://docs.python.org/3/objects.inv\n\nmarkdown_extensions:\n  # Built-in\n  - markdown.extensions.abbr:\n  - markdown.extensions.admonition:\n  - markdown.extensions.attr_list:\n  - markdown.extensions.footnotes:\n  - markdown.extensions.md_in_html:\n  - markdown.extensions.meta:\n  - markdown.extensions.tables:\n  - markdown.extensions.toc:\n      permalink: true\n  # Extra\n  - pymdownx.arithmatex:\n  - pymdownx.betterem:\n      smart_enable: all\n  - pymdownx.caret:\n  - pymdownx.critic:\n  - pymdownx.details:\n  - pymdownx.emoji:\n      # https://github.com/twitter/twemoji\n      # https://raw.githubusercontent.com/facelessuser/pymdown-extensions/master/pymdownx/twemoji_db.py\n      emoji_index: !!python/name:material.extensions.emoji.twemoji\n      emoji_generator: !!python/name:material.extensions.emoji.to_svg\n  - pymdownx.highlight:\n      guess_lang: false\n      linenums_style: pymdownx-inline\n      use_pygments: true\n  - pymdownx.inlinehilite:\n  - pymdownx.keys:\n  - pymdownx.magiclink:\n      repo_url_shortener: true\n      repo_url_shorthand: true\n      social_url_shortener: true\n      social_url_shorthand: true\n      normalize_issue_symbols: true\n      provider: github\n      user: ofek\n      repo: coincurve\n  - pymdownx.mark:\n  - pymdownx.progressbar:\n  - pymdownx.saneheaders:\n  - pymdownx.smartsymbols:\n  - pymdownx.snippets:\n      check_paths: true\n      base_path:\n        - docs/.snippets\n      auto_append:\n        - links.txt\n        - abbrs.txt\n  - pymdownx.superfences:\n  - pymdownx.tabbed:\n      alternate_style: true\n      slugify: !!python/object/apply:pymdownx.slugs.slugify\n        kwds:\n          case: lower\n  - pymdownx.tasklist:\n      custom_checkbox: true\n  - pymdownx.tilde:\n\nextra:\n  social:\n    - icon: fontawesome/brands/github-alt\n      link: https://github.com/ofek\n    - icon: fontawesome/solid/blog\n      link: https://ofek.dev/words/\n    - icon: fontawesome/brands/x-twitter\n      link: https://x.com/Ofekmeister\n    - icon: fontawesome/brands/linkedin\n      link: https://www.linkedin.com/in/ofeklev/\nextra_css:\n  - assets/css/custom.css\n  - https://cdn.jsdelivr.net/npm/firacode@6.2.0/distr/fira_code.css\n"
  },
  {
    "path": "pyproject.toml",
    "content": "[build-system]\nbuild-backend = \"hatchling.build\"\nrequires = [\n    \"hatchling>=1.27.0\",\n    \"cffi\",\n    \"scikit-build-core>=0.9.0\",\n    \"pkgconf; sys_platform == 'win32'\",\n]\n\n[project]\nname = \"coincurve\"\nauthors = [\n    { name = \"Ofek Lev\", email = \"oss@ofek.dev\" },\n]\ndescription = \"Safest and fastest Python library for secp256k1 elliptic curve operations\"\nkeywords = [\n    \"bitcoin\",\n    \"crypto\",\n    \"cryptocurrency\",\n    \"ecdh\",\n    \"ecdsa\",\n    \"elliptic curves\",\n    \"ethereum\",\n    \"libsecp256k1\",\n    \"secp256k1\",\n    \"schnorr\",\n]\nreadme = \"README.md\"\nlicense = \"MIT OR Apache-2.0\"\nlicense-files = [\n    \"LICENSE-APACHE\",\n    \"LICENSE-MIT\",\n    \"NOTICE\",\n]\nrequires-python = \">=3.9\"\nclassifiers = [\n    \"Development Status :: 5 - Production/Stable\",\n    \"Intended Audience :: Developers\",\n    \"Natural Language :: English\",\n    \"Operating System :: OS Independent\",\n    \"Programming Language :: Python :: Implementation :: CPython\",\n    \"Programming Language :: Python :: Implementation :: PyPy\",\n    \"Topic :: Software Development :: Libraries\",\n    \"Topic :: Security :: Cryptography\",\n]\ndynamic = [\"version\"]\n\n[project.urls]\nHomepage = \"https://ofek.dev/coincurve/\"\nSponsor = \"https://github.com/sponsors/ofek\"\nHistory = \"https://ofek.dev/coincurve/history/\"\nTracker = \"https://github.com/ofek/coincurve/issues\"\nSource = \"https://github.com/ofek/coincurve\"\n\n# --- hatch ---\n[tool.hatch.version]\npath = \"src/coincurve/__init__.py\"\n\n[tool.hatch.build.targets.wheel.hooks.custom]\n\n[tool.hatch.build.targets.wheel.hooks.scikit-build]\nexperimental = true\nbuild.verbose = true\ncmake.build-type = \"Release\"\ncmake.source-dir = \".\"\nwheel.py-api = \"\"\nwheel.packages = []\n\n# --- scikit-build-core ---\n[tool.scikit-build.cmake.define]\nCMAKE_BUILD_TYPE = \"Release\"\n# Coincurve build options - This may be better extracted from the ENV by the CMake directly?\nPROJECT_IGNORE_SYSTEM_LIB = { env = \"COINCURVE_IGNORE_SYSTEM_LIB\", default = \"ON\" }\nPROJECT_CROSS_COMPILE_TARGET = { env = \"COINCURVE_CROSS_HOST\", default = \"\" }\n# Vendored library: SECP256K1\nVENDORED_LIBRARY_CMAKE_TARGET = \"secp256k1\"\nVENDORED_LIBRARY_PKG_CONFIG = \"libsecp256k1\"\nVENDORED_LIBRARY_PKG_CONFIG_VERSION = \"0.6.0\"\nVENDORED_UPSTREAM_URL = \"https://github.com/bitcoin-core/secp256k1/archive/\"\nVENDORED_UPSTREAM_REF = { env = \"COINCURVE_UPSTREAM_REF\", default = \"0cdc758a56360bf58a851fe91085a327ec97685a\" }\nVENDORED_UPSTREAM_SHA = { env = \"COINCURVE_UPSTREAM_SHA\", default = \"385c115a21ee1ff31d0b0320acc2b278c92f7bde971f510566ad481a38835be0\" }\n# SECP256K1 library specific build options\n# `VENDORED_OPTION` is reserved prefix for vendored library build options\nVENDORED_LIBRARY_OPTION_PREFIX = \"SECP256K1\"\nVENDORED_OPTION_DISABLE_SHARED = { env = \"COINCURVE_SECP256K1_STATIC\", default = \"ON\" }\nVENDORED_OPTION_BUILD_BENCHMARK = \"OFF\"\nVENDORED_OPTION_BUILD_TESTS = \"OFF\"\nVENDORED_OPTION_BUILD_CTIME_TESTS = \"OFF\"\nVENDORED_OPTION_BUILD_EXHAUSTIVE_TESTS = \"OFF\"\nVENDORED_OPTION_BUILD_EXAMPLES = \"OFF\"\nVENDORED_OPTION_ENABLE_MODULE_ECDH = \"ON\"\nVENDORED_OPTION_ENABLE_MODULE_RECOVERY = \"ON\"\nVENDORED_OPTION_ENABLE_MODULE_SCHNORRSIG = \"ON\"\nVENDORED_OPTION_ENABLE_MODULE_EXTRAKEYS = \"ON\"\nVENDORED_OPTION_EXPERIMENTAL = \"ON\"\n# Vendored library build options (cmake, compiler, linker, etc.)\n# VENDORED_CMAKE is reserved prefix for vendored library cmake options\n# VENDORED_CMAKE_<STATIC|SHARED>_<CMAKE_OPTION> = <VALUE>\nVENDORED_LIBRARY_STATIC_BUILD = { env = \"COINCURVE_SECP256K1_STATIC\", default = \"ON\" }\n\n# --- Coverage ---\n[tool.coverage.run]\nsource_pkgs = [\"coincurve\", \"tests\"]\nbranch = true\nparallel = true\nomit = [\n    \"src/coincurve/__init__.py\",\n    \"tests/test_bench.py\",\n]\n\n[tool.coverage.report]\nexclude_lines =[\n    \"no cov\",\n\n    # Ignore missing debug-only code\n    \"def __repr__\",\n    \"if self\\\\.debug\",\n\n    # Ignore non-runnable code\n    \"if __name__ == .__main__.:\",\n]\n\n[tool.coverage.paths]\ncoincurve = [\"src/coincurve\", \"*/coincurve/src/coincurve\"]\ntests = [\"tests\", \"*/coincurve/tests\"]\n\n# --- Pytest ---\n[tool.pytest.ini_options]\naddopts = [\n    \"--import-mode=importlib\",\n]\n\n# --- Mypy ---\n[tool.mypy]\ndisallow_untyped_defs = false\nfollow_imports = \"normal\"\nignore_missing_imports = true\npretty = true\nshow_column_numbers = true\nwarn_no_return = false\nwarn_unused_ignores = true\n"
  },
  {
    "path": "ruff.toml",
    "content": "extend = \"ruff_defaults.toml\"\n\n[format]\npreview = true\n\n[lint]\npreview = true\n\n[lint.extend-per-file-ignores]\n# Implicit namespace packages\n\"cm_library_c_binding/build.py\" = [\"INP001\"]\n\"cm_library_cffi_headers/compose_cffi_headers.py\" = [\"INP001\"]\n"
  },
  {
    "path": "ruff_defaults.toml",
    "content": "line-length = 120\n\n[format]\ndocstring-code-format = true\ndocstring-code-line-length = 80\n\n[lint]\nselect = [\n  \"A001\",\n  \"A002\",\n  \"A003\",\n  \"ARG001\",\n  \"ARG002\",\n  \"ARG003\",\n  \"ARG004\",\n  \"ARG005\",\n  \"ASYNC100\",\n  \"ASYNC105\",\n  \"ASYNC109\",\n  \"ASYNC110\",\n  \"ASYNC115\",\n  \"B002\",\n  \"B003\",\n  \"B004\",\n  \"B005\",\n  \"B006\",\n  \"B007\",\n  \"B008\",\n  \"B009\",\n  \"B010\",\n  \"B011\",\n  \"B012\",\n  \"B013\",\n  \"B014\",\n  \"B015\",\n  \"B016\",\n  \"B017\",\n  \"B018\",\n  \"B019\",\n  \"B020\",\n  \"B021\",\n  \"B022\",\n  \"B023\",\n  \"B024\",\n  \"B025\",\n  \"B026\",\n  \"B028\",\n  \"B029\",\n  \"B030\",\n  \"B031\",\n  \"B032\",\n  \"B033\",\n  \"B034\",\n  \"B035\",\n  \"B904\",\n  \"B905\",\n  \"B909\",\n  \"BLE001\",\n  \"C400\",\n  \"C401\",\n  \"C402\",\n  \"C403\",\n  \"C404\",\n  \"C405\",\n  \"C406\",\n  \"C408\",\n  \"C409\",\n  \"C410\",\n  \"C411\",\n  \"C413\",\n  \"C414\",\n  \"C415\",\n  \"C416\",\n  \"C417\",\n  \"C418\",\n  \"C419\",\n  \"C420\",\n  \"COM818\",\n  \"DTZ001\",\n  \"DTZ002\",\n  \"DTZ003\",\n  \"DTZ004\",\n  \"DTZ005\",\n  \"DTZ006\",\n  \"DTZ007\",\n  \"DTZ011\",\n  \"DTZ012\",\n  \"E101\",\n  \"E112\",\n  \"E113\",\n  \"E115\",\n  \"E116\",\n  \"E201\",\n  \"E202\",\n  \"E203\",\n  \"E211\",\n  \"E221\",\n  \"E222\",\n  \"E223\",\n  \"E224\",\n  \"E225\",\n  \"E226\",\n  \"E227\",\n  \"E228\",\n  \"E231\",\n  \"E241\",\n  \"E242\",\n  \"E251\",\n  \"E252\",\n  \"E261\",\n  \"E262\",\n  \"E265\",\n  \"E266\",\n  \"E271\",\n  \"E272\",\n  \"E273\",\n  \"E274\",\n  \"E275\",\n  \"E401\",\n  \"E402\",\n  \"E502\",\n  \"E701\",\n  \"E702\",\n  \"E703\",\n  \"E711\",\n  \"E712\",\n  \"E713\",\n  \"E714\",\n  \"E721\",\n  \"E722\",\n  \"E731\",\n  \"E741\",\n  \"E742\",\n  \"E743\",\n  \"E902\",\n  \"EM101\",\n  \"EM102\",\n  \"EM103\",\n  \"EXE001\",\n  \"EXE002\",\n  \"EXE003\",\n  \"EXE004\",\n  \"EXE005\",\n  \"F401\",\n  \"F402\",\n  \"F403\",\n  \"F404\",\n  \"F405\",\n  \"F406\",\n  \"F407\",\n  \"F501\",\n  \"F502\",\n  \"F503\",\n  \"F504\",\n  \"F505\",\n  \"F506\",\n  \"F507\",\n  \"F508\",\n  \"F509\",\n  \"F521\",\n  \"F522\",\n  \"F523\",\n  \"F524\",\n  \"F525\",\n  \"F541\",\n  \"F601\",\n  \"F602\",\n  \"F621\",\n  \"F622\",\n  \"F631\",\n  \"F632\",\n  \"F633\",\n  \"F634\",\n  \"F701\",\n  \"F702\",\n  \"F704\",\n  \"F706\",\n  \"F707\",\n  \"F722\",\n  \"F811\",\n  \"F821\",\n  \"F822\",\n  \"F823\",\n  \"F841\",\n  \"F842\",\n  \"F901\",\n  \"FA100\",\n  \"FA102\",\n  \"FBT001\",\n  \"FBT002\",\n  \"FLY002\",\n  \"FURB105\",\n  \"FURB110\",\n  \"FURB113\",\n  \"FURB116\",\n  \"FURB118\",\n  \"FURB129\",\n  \"FURB131\",\n  \"FURB132\",\n  \"FURB136\",\n  \"FURB142\",\n  \"FURB145\",\n  \"FURB148\",\n  \"FURB152\",\n  \"FURB157\",\n  \"FURB161\",\n  \"FURB163\",\n  \"FURB164\",\n  \"FURB166\",\n  \"FURB167\",\n  \"FURB168\",\n  \"FURB169\",\n  \"FURB171\",\n  \"FURB177\",\n  \"FURB180\",\n  \"FURB181\",\n  \"FURB187\",\n  \"FURB192\",\n  \"G001\",\n  \"G002\",\n  \"G003\",\n  \"G004\",\n  \"G010\",\n  \"G101\",\n  \"G201\",\n  \"G202\",\n  \"I001\",\n  \"I002\",\n  \"ICN001\",\n  \"ICN002\",\n  \"ICN003\",\n  \"INP001\",\n  \"INT001\",\n  \"INT002\",\n  \"INT003\",\n  \"ISC003\",\n  \"LOG001\",\n  \"LOG002\",\n  \"LOG007\",\n  \"LOG009\",\n  \"N801\",\n  \"N802\",\n  \"N803\",\n  \"N804\",\n  \"N805\",\n  \"N806\",\n  \"N807\",\n  \"N811\",\n  \"N812\",\n  \"N813\",\n  \"N814\",\n  \"N815\",\n  \"N816\",\n  \"N817\",\n  \"N818\",\n  \"N999\",\n  \"PERF101\",\n  \"PERF102\",\n  \"PERF401\",\n  \"PERF402\",\n  \"PERF403\",\n  \"PGH005\",\n  \"PIE790\",\n  \"PIE794\",\n  \"PIE796\",\n  \"PIE800\",\n  \"PIE804\",\n  \"PIE807\",\n  \"PIE808\",\n  \"PIE810\",\n  \"PLC0105\",\n  \"PLC0131\",\n  \"PLC0132\",\n  \"PLC0205\",\n  \"PLC0208\",\n  \"PLC0414\",\n  \"PLC0415\",\n  \"PLC1901\",\n  \"PLC2401\",\n  \"PLC2403\",\n  \"PLC2701\",\n  \"PLC2801\",\n  \"PLC3002\",\n  \"PLE0100\",\n  \"PLE0101\",\n  \"PLE0115\",\n  \"PLE0116\",\n  \"PLE0117\",\n  \"PLE0118\",\n  \"PLE0237\",\n  \"PLE0241\",\n  \"PLE0302\",\n  \"PLE0303\",\n  \"PLE0304\",\n  \"PLE0305\",\n  \"PLE0307\",\n  \"PLE0308\",\n  \"PLE0309\",\n  \"PLE0604\",\n  \"PLE0605\",\n  \"PLE0643\",\n  \"PLE0704\",\n  \"PLE1132\",\n  \"PLE1141\",\n  \"PLE1142\",\n  \"PLE1205\",\n  \"PLE1206\",\n  \"PLE1300\",\n  \"PLE1307\",\n  \"PLE1310\",\n  \"PLE1507\",\n  \"PLE1519\",\n  \"PLE1520\",\n  \"PLE1700\",\n  \"PLE2502\",\n  \"PLE2510\",\n  \"PLE2512\",\n  \"PLE2513\",\n  \"PLE2514\",\n  \"PLE2515\",\n  \"PLE4703\",\n  \"PLR0124\",\n  \"PLR0133\",\n  \"PLR0202\",\n  \"PLR0203\",\n  \"PLR0206\",\n  \"PLR0402\",\n  \"PLR1704\",\n  \"PLR1711\",\n  \"PLR1714\",\n  \"PLR1722\",\n  \"PLR1730\",\n  \"PLR1733\",\n  \"PLR1736\",\n  \"PLR2004\",\n  \"PLR2044\",\n  \"PLR5501\",\n  \"PLR6104\",\n  \"PLR6201\",\n  \"PLR6301\",\n  \"PLW0108\",\n  \"PLW0120\",\n  \"PLW0127\",\n  \"PLW0128\",\n  \"PLW0129\",\n  \"PLW0131\",\n  \"PLW0133\",\n  \"PLW0177\",\n  \"PLW0211\",\n  \"PLW0245\",\n  \"PLW0406\",\n  \"PLW0602\",\n  \"PLW0603\",\n  \"PLW0604\",\n  \"PLW0642\",\n  \"PLW0711\",\n  \"PLW1501\",\n  \"PLW1508\",\n  \"PLW1509\",\n  \"PLW1510\",\n  \"PLW1514\",\n  \"PLW1641\",\n  \"PLW2101\",\n  \"PLW2901\",\n  \"PLW3201\",\n  \"PLW3301\",\n  \"PT001\",\n  \"PT002\",\n  \"PT003\",\n  \"PT006\",\n  \"PT007\",\n  \"PT008\",\n  \"PT009\",\n  \"PT010\",\n  \"PT011\",\n  \"PT012\",\n  \"PT013\",\n  \"PT014\",\n  \"PT015\",\n  \"PT016\",\n  \"PT017\",\n  \"PT018\",\n  \"PT019\",\n  \"PT020\",\n  \"PT021\",\n  \"PT022\",\n  \"PT023\",\n  \"PT024\",\n  \"PT025\",\n  \"PT026\",\n  \"PT027\",\n  \"PYI001\",\n  \"PYI002\",\n  \"PYI003\",\n  \"PYI004\",\n  \"PYI005\",\n  \"PYI006\",\n  \"PYI007\",\n  \"PYI008\",\n  \"PYI009\",\n  \"PYI010\",\n  \"PYI011\",\n  \"PYI012\",\n  \"PYI013\",\n  \"PYI014\",\n  \"PYI015\",\n  \"PYI016\",\n  \"PYI017\",\n  \"PYI018\",\n  \"PYI019\",\n  \"PYI020\",\n  \"PYI021\",\n  \"PYI024\",\n  \"PYI025\",\n  \"PYI026\",\n  \"PYI029\",\n  \"PYI030\",\n  \"PYI032\",\n  \"PYI033\",\n  \"PYI034\",\n  \"PYI035\",\n  \"PYI036\",\n  \"PYI041\",\n  \"PYI042\",\n  \"PYI043\",\n  \"PYI044\",\n  \"PYI045\",\n  \"PYI046\",\n  \"PYI047\",\n  \"PYI048\",\n  \"PYI049\",\n  \"PYI050\",\n  \"PYI051\",\n  \"PYI052\",\n  \"PYI053\",\n  \"PYI054\",\n  \"PYI055\",\n  \"PYI056\",\n  \"PYI058\",\n  \"PYI059\",\n  \"PYI062\",\n  \"RET503\",\n  \"RET504\",\n  \"RET505\",\n  \"RET506\",\n  \"RET507\",\n  \"RET508\",\n  \"RSE102\",\n  \"RUF001\",\n  \"RUF002\",\n  \"RUF003\",\n  \"RUF005\",\n  \"RUF006\",\n  \"RUF007\",\n  \"RUF008\",\n  \"RUF009\",\n  \"RUF010\",\n  \"RUF012\",\n  \"RUF013\",\n  \"RUF015\",\n  \"RUF016\",\n  \"RUF017\",\n  \"RUF018\",\n  \"RUF019\",\n  \"RUF020\",\n  \"RUF021\",\n  \"RUF022\",\n  \"RUF023\",\n  \"RUF024\",\n  \"RUF026\",\n  \"RUF027\",\n  \"RUF028\",\n  \"RUF029\",\n  \"RUF100\",\n  \"RUF101\",\n  \"S101\",\n  \"S102\",\n  \"S103\",\n  \"S104\",\n  \"S105\",\n  \"S106\",\n  \"S107\",\n  \"S108\",\n  \"S110\",\n  \"S112\",\n  \"S113\",\n  \"S201\",\n  \"S202\",\n  \"S301\",\n  \"S302\",\n  \"S303\",\n  \"S304\",\n  \"S305\",\n  \"S306\",\n  \"S307\",\n  \"S308\",\n  \"S310\",\n  \"S311\",\n  \"S312\",\n  \"S313\",\n  \"S314\",\n  \"S315\",\n  \"S316\",\n  \"S317\",\n  \"S318\",\n  \"S319\",\n  \"S321\",\n  \"S323\",\n  \"S324\",\n  \"S401\",\n  \"S402\",\n  \"S403\",\n  \"S405\",\n  \"S406\",\n  \"S407\",\n  \"S408\",\n  \"S409\",\n  \"S411\",\n  \"S412\",\n  \"S413\",\n  \"S415\",\n  \"S501\",\n  \"S502\",\n  \"S503\",\n  \"S504\",\n  \"S505\",\n  \"S506\",\n  \"S507\",\n  \"S508\",\n  \"S509\",\n  \"S601\",\n  \"S602\",\n  \"S604\",\n  \"S605\",\n  \"S606\",\n  \"S607\",\n  \"S608\",\n  \"S609\",\n  \"S610\",\n  \"S611\",\n  \"S612\",\n  \"S701\",\n  \"S702\",\n  \"SIM101\",\n  \"SIM102\",\n  \"SIM103\",\n  \"SIM105\",\n  \"SIM107\",\n  \"SIM108\",\n  \"SIM109\",\n  \"SIM110\",\n  \"SIM112\",\n  \"SIM113\",\n  \"SIM114\",\n  \"SIM115\",\n  \"SIM116\",\n  \"SIM117\",\n  \"SIM118\",\n  \"SIM201\",\n  \"SIM202\",\n  \"SIM208\",\n  \"SIM210\",\n  \"SIM211\",\n  \"SIM212\",\n  \"SIM220\",\n  \"SIM221\",\n  \"SIM222\",\n  \"SIM223\",\n  \"SIM300\",\n  \"SIM910\",\n  \"SIM911\",\n  \"SLF001\",\n  \"SLOT000\",\n  \"SLOT001\",\n  \"SLOT002\",\n  \"T100\",\n  \"T201\",\n  \"T203\",\n  \"TC001\",\n  \"TC002\",\n  \"TC003\",\n  \"TC004\",\n  \"TC005\",\n  \"TC010\",\n  \"TD004\",\n  \"TD005\",\n  \"TD006\",\n  \"TD007\",\n  \"TID251\",\n  \"TID252\",\n  \"TID253\",\n  \"TRY002\",\n  \"TRY003\",\n  \"TRY004\",\n  \"TRY201\",\n  \"TRY203\",\n  \"TRY300\",\n  \"TRY301\",\n  \"TRY400\",\n  \"TRY401\",\n  \"UP001\",\n  \"UP003\",\n  \"UP004\",\n  \"UP005\",\n  \"UP006\",\n  \"UP007\",\n  \"UP008\",\n  \"UP009\",\n  \"UP010\",\n  \"UP011\",\n  \"UP012\",\n  \"UP013\",\n  \"UP014\",\n  \"UP015\",\n  \"UP017\",\n  \"UP018\",\n  \"UP019\",\n  \"UP020\",\n  \"UP021\",\n  \"UP022\",\n  \"UP023\",\n  \"UP024\",\n  \"UP025\",\n  \"UP026\",\n  \"UP028\",\n  \"UP029\",\n  \"UP030\",\n  \"UP031\",\n  \"UP032\",\n  \"UP033\",\n  \"UP034\",\n  \"UP035\",\n  \"UP036\",\n  \"UP037\",\n  \"UP039\",\n  \"UP040\",\n  \"UP041\",\n  \"UP042\",\n  \"W291\",\n  \"W292\",\n  \"W293\",\n  \"W391\",\n  \"W505\",\n  \"W605\",\n  \"YTT101\",\n  \"YTT102\",\n  \"YTT103\",\n  \"YTT201\",\n  \"YTT202\",\n  \"YTT203\",\n  \"YTT204\",\n  \"YTT301\",\n  \"YTT302\",\n  \"YTT303\",\n]\n\n[lint.per-file-ignores]\n\"**/scripts/*\" = [\n  \"INP001\",\n  \"T201\",\n]\n\"**/tests/**/*\" = [\n  \"PLC1901\",\n  \"PLR2004\",\n  \"PLR6301\",\n  \"S\",\n  \"TID252\",\n]\n\n[lint.flake8-tidy-imports]\nban-relative-imports = \"all\"\n\n[lint.isort]\nknown-first-party = [\"coincurve\"]\n\n[lint.flake8-pytest-style]\nfixture-parentheses = false\nmark-parentheses = false\n"
  },
  {
    "path": "scripts/README.md",
    "content": "# Scripts\n\n-----\n\nThis directory contains scripts that are used to develop the project.\n"
  },
  {
    "path": "scripts/bench.py",
    "content": "# /// script\n# dependencies = [\n#   \"coincurve\",\n#   \"fastecdsa==3.0.1; sys_platform != 'win32'\",\n#   \"rich\",\n# ]\n# [tool.uv.sources]\n# coincurve = { path = \"..\" }\n# ///\nimport os\nimport sys\nfrom abc import ABC, abstractmethod\nfrom decimal import Decimal\nfrom textwrap import dedent\nfrom time import perf_counter_ns\nfrom timeit import Timer\n\nfrom rich.live import Live\nfrom rich.table import Table\n\nMESSAGE = os.urandom(8192).hex()\n\n\nclass BenchmarkSpec:\n    __slots__ = (\"setup\", \"statement\")\n\n    def __init__(self, setup: str, statement: str):\n        self.setup = dedent(setup[1:])\n        self.statement = dedent(statement[1:])\n\n\nclass Benchmark(ABC):\n    @staticmethod\n    @abstractmethod\n    def name() -> str:\n        pass\n\n    @staticmethod\n    @abstractmethod\n    def generate_key_pair() -> BenchmarkSpec:\n        pass\n\n    @staticmethod\n    @abstractmethod\n    def sign() -> BenchmarkSpec:\n        pass\n\n    @staticmethod\n    @abstractmethod\n    def verify() -> BenchmarkSpec:\n        pass\n\n    @staticmethod\n    @abstractmethod\n    def key_export() -> BenchmarkSpec:\n        pass\n\n    @staticmethod\n    @abstractmethod\n    def key_import() -> BenchmarkSpec:\n        pass\n\n\nclass CoincurveBenchmark(Benchmark):\n    @staticmethod\n    def name() -> str:\n        return \"coincurve\"\n\n    @staticmethod\n    def generate_key_pair() -> BenchmarkSpec:\n        return BenchmarkSpec(\n            \"\"\"\n            from coincurve import PrivateKey\n            \"\"\",\n            \"\"\"\n            PrivateKey()\n            \"\"\",\n        )\n\n    @staticmethod\n    def sign() -> BenchmarkSpec:\n        return BenchmarkSpec(\n            f\"\"\"\n            from coincurve import PrivateKey\n            message = {MESSAGE!r}.encode()\n            private_key = PrivateKey()\n            \"\"\",\n            \"\"\"\n            private_key.sign(message)\n            \"\"\",\n        )\n\n    @staticmethod\n    def verify() -> BenchmarkSpec:\n        return BenchmarkSpec(\n            f\"\"\"\n            from coincurve import PrivateKey, verify_signature\n            message = {MESSAGE!r}.encode()\n            private_key = PrivateKey()\n            signature = private_key.sign(message)\n            public_key = private_key.public_key.format(compressed=False)\n            \"\"\",\n            \"\"\"\n            assert verify_signature(signature, message, public_key)\n            \"\"\",\n        )\n\n    @staticmethod\n    def key_export() -> BenchmarkSpec:\n        return BenchmarkSpec(\n            \"\"\"\n            from coincurve import PrivateKey\n            private_key = PrivateKey()\n            \"\"\",\n            \"\"\"\n            private_key.to_pem()\n            \"\"\",\n        )\n\n    @staticmethod\n    def key_import() -> BenchmarkSpec:\n        return BenchmarkSpec(\n            \"\"\"\n            from coincurve import PrivateKey\n            private_key = PrivateKey()\n            private_key_pem = private_key.to_pem()\n            \"\"\",\n            \"\"\"\n            PrivateKey.from_pem(private_key_pem)\n            \"\"\",\n        )\n\n\nclass FastecdsaBenchmark(Benchmark):\n    @staticmethod\n    def name() -> str:\n        return \"fastecdsa\"\n\n    @staticmethod\n    def generate_key_pair() -> BenchmarkSpec:\n        return BenchmarkSpec(\n            \"\"\"\n            from fastecdsa import curve, keys\n            \"\"\",\n            \"\"\"\n            keys.gen_keypair(curve.secp256k1)\n            \"\"\",\n        )\n\n    @staticmethod\n    def sign() -> BenchmarkSpec:\n        return BenchmarkSpec(\n            f\"\"\"\n            from fastecdsa import curve, ecdsa, keys\n            message = {MESSAGE!r}\n            private_key, _ = keys.gen_keypair(curve.secp256k1)\n            \"\"\",\n            \"\"\"\n            r, s = ecdsa.sign(message, private_key, curve=curve.secp256k1)\n            \"\"\",\n        )\n\n    @staticmethod\n    def verify() -> BenchmarkSpec:\n        return BenchmarkSpec(\n            f\"\"\"\n            from fastecdsa import curve, ecdsa, keys\n            message = {MESSAGE!r}\n            private_key, public_key = keys.gen_keypair(curve.secp256k1)\n            r, s = ecdsa.sign(message, private_key, curve=curve.secp256k1)\n            \"\"\",\n            \"\"\"\n            assert ecdsa.verify((r, s), message, public_key, curve=curve.secp256k1)\n            \"\"\",\n        )\n\n    @staticmethod\n    def key_export() -> BenchmarkSpec:\n        return BenchmarkSpec(\n            \"\"\"\n            from fastecdsa import curve, keys\n            from fastecdsa.encoding.pem import PEMEncoder\n            private_key, _ = keys.gen_keypair(curve.secp256k1)\n            encoder = PEMEncoder()\n            \"\"\",\n            \"\"\"\n            encoder.encode_private_key(private_key, curve=curve.secp256k1)\n            \"\"\",\n        )\n\n    @staticmethod\n    def key_import() -> BenchmarkSpec:\n        return BenchmarkSpec(\n            \"\"\"\n            from fastecdsa import curve, keys\n            from fastecdsa.encoding.pem import PEMEncoder\n            private_key, _ = keys.gen_keypair(curve.secp256k1)\n            encoder = PEMEncoder()\n            private_key_pem = encoder.encode_private_key(private_key, curve=curve.secp256k1)\n            \"\"\",\n            \"\"\"\n            encoder.decode_private_key(private_key_pem)\n            \"\"\",\n        )\n\n\ndef generate_table(rows: list[list[str]]):\n    table = Table()\n    table.add_column(\"Library\")\n    table.add_column(\"Key generation\")\n    table.add_column(\"Signing\")\n    table.add_column(\"Verification\")\n    table.add_column(\"Key export\")\n    table.add_column(\"Key import\")\n\n    for row in rows:\n        table.add_row(*row)\n\n    return table\n\n\ndef main():\n    print(sys.version)\n    rows = []\n    table = generate_table(rows)\n\n    with Live(table, auto_refresh=False) as live:\n        for benchmark in [CoincurveBenchmark, FastecdsaBenchmark]:\n            row = [benchmark.name()]\n            rows.append(row)\n            live.update(generate_table(rows), refresh=True)\n\n            for method in [\n                benchmark.generate_key_pair,\n                benchmark.sign,\n                benchmark.verify,\n                benchmark.key_export,\n                benchmark.key_import,\n            ]:\n                spec = method()\n                timer = Timer(stmt=spec.statement, setup=spec.setup, timer=perf_counter_ns)\n\n                try:\n                    loops, _ = timer.autorange()\n                    times = timer.repeat(number=loops, repeat=1000)\n                except Exception as e:  # noqa: BLE001\n                    row.append(str(e))\n                    live.update(generate_table(rows), refresh=True)\n                    continue\n\n                best = Decimal(min(times))\n                # Convert nanoseconds to microseconds and round to 1 decimal place\n                best /= 1_000\n                best = best.quantize(Decimal(\"0.1\"))\n\n                row.append(str(best))\n                live.update(generate_table(rows), refresh=True)\n\n\nif __name__ == \"__main__\":\n    main()\n"
  },
  {
    "path": "src/coincurve/__init__.py",
    "content": "from coincurve.context import GLOBAL_CONTEXT, Context\nfrom coincurve.keys import PrivateKey, PublicKey, PublicKeyXOnly\nfrom coincurve.utils import verify_signature\n\n__version__ = \"21.0.0\"\n__all__ = [\n    \"GLOBAL_CONTEXT\",\n    \"Context\",\n    \"PrivateKey\",\n    \"PublicKey\",\n    \"PublicKeyXOnly\",\n    \"verify_signature\",\n]\n"
  },
  {
    "path": "src/coincurve/context.py",
    "content": "from __future__ import annotations\n\nfrom os import urandom\nfrom threading import Lock\n\nfrom coincurve._libsecp256k1 import ffi, lib\nfrom coincurve.flags import CONTEXT_FLAGS, CONTEXT_NONE\n\n\nclass Context:\n    def __init__(self, seed: bytes | None = None, flag=CONTEXT_NONE, name: str = \"\"):\n        if flag not in CONTEXT_FLAGS:\n            msg = f\"{flag} is an invalid context flag.\"\n            raise ValueError(msg)\n        self._lock = Lock()\n\n        self.ctx = ffi.gc(lib.secp256k1_context_create(flag), lib.secp256k1_context_destroy)\n        self.reseed(seed)\n\n        self.name = name\n\n    def reseed(self, seed: bytes | None = None):\n        \"\"\"\n        Protects against certain possible future side-channel timing attacks.\n        \"\"\"\n        with self._lock:\n            seed = urandom(32) if not seed or len(seed) != 32 else seed  # noqa: PLR2004\n            res = lib.secp256k1_context_randomize(self.ctx, ffi.new(\"unsigned char [32]\", seed))\n            if not res:\n                msg = \"secp256k1_context_randomize\"\n                raise ValueError(msg)\n\n    def __repr__(self):\n        return self.name or super().__repr__()\n\n\nGLOBAL_CONTEXT = Context(name=\"GLOBAL_CONTEXT\")\n"
  },
  {
    "path": "src/coincurve/der.py",
    "content": "\"\"\"\nMinimal, dependency-free ASN.1/DER encoder & decoder for secp256k1 EC private keys.\n\nThis module implements just enough DER encoding/decoding to support:\n\n    1. Outputting a DER-encoded PKCS#8 EC private key (with an embedded ECPrivateKey per RFC 5915)\n    2. Reading such a DER-encoded EC private key\n\nOnly the following ASN.1 types are supported:\n\n    - INTEGER\n    - BIT STRING\n    - OCTET STRING\n    - OBJECT IDENTIFIER\n    - SEQUENCE\n    - Context-specific EXPLICIT tags (for the optional public key)\n\nThe expected DER structure is as follows:\n\n    PrivateKeyInfo ::= SEQUENCE {\n        version             INTEGER,           -- must be 0\n        privateKeyAlgorithm SEQUENCE {\n            algorithm       OBJECT IDENTIFIER, -- id-ecPublicKey (1.2.840.10045.2.1)\n            parameters      OBJECT IDENTIFIER  -- secp256k1 (1.3.132.0.10)\n        },\n        privateKey          OCTET STRING       -- DER encoding of ECPrivateKey\n    }\n\n    ECPrivateKey ::= SEQUENCE {\n        version        INTEGER,                     -- must be 1\n        privateKey     OCTET STRING,                -- the secret bytes\n        publicKey  [1] EXPLICIT BIT STRING OPTIONAL -- uncompressed public key\n    }\n\"\"\"\n\nfrom __future__ import annotations\n\nfrom coincurve.utils import int_to_bytes\n\n# ASN.1 DER tag bytes\nINTEGER_TAG = 0x02\nBIT_STRING_TAG = 0x03\nOCTET_STRING_TAG = 0x04\nOBJECT_IDENTIFIER_TAG = 0x06\nSEQUENCE_TAG = 0x30\n\n# OIDs\nEC_PUBKEY_OID = bytes([0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x02, 0x01])  # 1.2.840.10045.2.1 (ecPublicKey)\nSECP256K1_OID = bytes([0x2B, 0x81, 0x04, 0x00, 0x0A])  # 1.3.132.0.10 (secp256k1)\n\n# Pre-computed structures\nVERSION_INTEGER_ZERO = bytes([INTEGER_TAG, 0x01, 0x00])  # INTEGER 0\nVERSION_INTEGER_ONE = bytes([INTEGER_TAG, 0x01, 0x01])  # INTEGER 1\nEC_ALGORITHM_IDENTIFIER = bytes([\n    SEQUENCE_TAG,\n    16,\n    OBJECT_IDENTIFIER_TAG,\n    len(EC_PUBKEY_OID),\n    *EC_PUBKEY_OID,\n    OBJECT_IDENTIFIER_TAG,\n    len(SECP256K1_OID),\n    *SECP256K1_OID,\n])\n\n\ndef encode_length(length: int) -> bytes:\n    \"\"\"Encode a length in DER format.\"\"\"\n    # Short form\n    if length < 128:  # noqa: PLR2004\n        return bytes([length])\n\n    # Long form\n    length_bytes = int_to_bytes(length)\n    return bytes([0x80 | len(length_bytes)]) + length_bytes\n\n\ndef encode_octet_string(value: bytes) -> bytes:\n    \"\"\"Encode an OCTET STRING in DER format.\"\"\"\n    length_bytes = encode_length(len(value))\n    length_bytes_len = len(length_bytes)\n    result = bytearray(1 + length_bytes_len + len(value))\n    result[0] = OCTET_STRING_TAG\n    result[1 : 1 + length_bytes_len] = length_bytes\n    result[1 + length_bytes_len :] = value\n    return bytes(result)\n\n\ndef encode_bit_string(value: bytes, unused_bits: int = 0) -> bytes:\n    \"\"\"Encode a BIT STRING in DER format.\"\"\"\n    length_bytes = encode_length(len(value) + 1)\n    length_bytes_len = len(length_bytes)\n    result = bytearray(1 + length_bytes_len + 1 + len(value))\n    result[0] = BIT_STRING_TAG\n    result[1 : 1 + length_bytes_len] = length_bytes\n    result[1 + length_bytes_len] = unused_bits\n    result[1 + length_bytes_len + 1 :] = value\n    return bytes(result)\n\n\ndef encode_der(private_key: bytes, public_key: bytes | None = None) -> bytes:\n    \"\"\"\n    Encode an EC private key in DER format (PKCS#8/RFC 5208).\n    Optimized for secp256k1 keys.\n\n    Parameters:\n        private_key: The private key as bytes (32 bytes for secp256k1)\n        public_key: The public key as bytes (65 bytes uncompressed for secp256k1, starting with 0x04)\n\n    Returns:\n        The DER-encoded private key\n    \"\"\"\n    # EC private key contains version(1) + octet string + optional pubkey\n    ec_key_buffer = bytearray(VERSION_INTEGER_ONE)\n\n    # Add private key as octet string\n    private_key_os = encode_octet_string(private_key)\n    ec_key_buffer.extend(private_key_os)\n\n    # Add public key if provided (optional)\n    if public_key is not None:\n        public_key_bs = encode_bit_string(public_key)\n        pubkey_len = len(public_key_bs)\n        ec_key_buffer.append(0xA1)  # context-specific [1] constructed\n        ec_key_buffer.extend(encode_length(pubkey_len))\n        ec_key_buffer.extend(public_key_bs)\n\n    # Wrap EC private key in sequence\n    ec_key_seq = bytearray([SEQUENCE_TAG])\n    ec_key_seq.extend(encode_length(len(ec_key_buffer)))\n    ec_key_seq.extend(ec_key_buffer)\n\n    # Wrap in octet string for outer structure\n    ec_key_os = encode_octet_string(ec_key_seq)\n\n    # Build the outer PKCS#8 structure\n    result = bytearray([SEQUENCE_TAG])\n\n    # Calculate total length: version(3) + alg_id(18) + octet_string(len)\n    outer_len = 3 + len(EC_ALGORITHM_IDENTIFIER) + len(ec_key_os)\n    result.extend(encode_length(outer_len))\n\n    # Version 0\n    result.extend(VERSION_INTEGER_ZERO)\n\n    # Algorithm identifier (pre-computed)\n    result.extend(EC_ALGORITHM_IDENTIFIER)\n\n    # EC key wrapped in octet string\n    result.extend(ec_key_os)\n\n    return bytes(result)\n\n\ndef decode_length(data: bytes, offset: int) -> tuple[int, int]:\n    \"\"\"\n    Decode a DER length field.\n\n    Parameters:\n        data: The DER-encoded data\n        offset: The current offset in the data\n\n    Returns:\n        Tuple of (length, new_offset)\n    \"\"\"\n    length_byte = data[offset]\n    offset += 1\n\n    # Short form\n    if length_byte < 128:  # noqa: PLR2004\n        return length_byte, offset\n\n    # Long form\n    num_length_bytes = length_byte & 0x7F\n    length = 0\n    for _ in range(num_length_bytes):\n        length = (length << 8) | data[offset]\n        offset += 1\n    return length, offset\n\n\ndef decode_der(der_data: bytes) -> bytes:\n    \"\"\"\n    Decode a DER-encoded EC private key to extract the private key secret.\n    Optimized for secp256k1 keys.\n\n    Parameters:\n        der_data: The DER-encoded private key in PKCS#8 format\n\n    Returns:\n        The private key secret as bytes\n    \"\"\"\n    # Quick validation for performance\n    if len(der_data) < 34 or der_data[0] != SEQUENCE_TAG:  # noqa: PLR2004\n        msg = \"Invalid DER: not a valid PKCS#8 structure\"\n        raise ValueError(msg)\n\n    # Skip outer sequence tag and length\n    offset = 1\n    _, offset = decode_length(der_data, offset)\n\n    # Skip version INTEGER (should be 0)\n    if der_data[offset] != INTEGER_TAG:\n        msg = \"Invalid DER: expected INTEGER tag for version\"\n        raise ValueError(msg)\n    offset += 1\n    version_len, offset = decode_length(der_data, offset)\n    offset += version_len  # Skip version value\n\n    # Validate algorithm identifier is for EC\n    if der_data[offset] != SEQUENCE_TAG:\n        msg = \"Invalid DER: expected SEQUENCE tag for algorithm\"\n        raise ValueError(msg)\n    offset += 1\n\n    alg_len, offset = decode_length(der_data, offset)\n    alg_end = offset + alg_len  # Store the end position of algorithm identifier\n\n    # Check if first OID is EC\n    if der_data[offset] != OBJECT_IDENTIFIER_TAG:\n        msg = \"Invalid DER: expected OBJECT IDENTIFIER tag\"\n        raise ValueError(msg)\n    offset += 1\n    oid_len, offset = decode_length(der_data, offset)\n    algorithm_oid = der_data[offset : offset + oid_len]\n\n    # Check if it's an EC key\n    if oid_len != len(EC_PUBKEY_OID) or algorithm_oid != EC_PUBKEY_OID:\n        msg = \"Not an EC private key\"\n        raise ValueError(msg)\n\n    # Skip to the end of algorithm identifier section\n    offset = alg_end\n\n    # Extract private key octet string\n    if der_data[offset] != OCTET_STRING_TAG:\n        msg = \"Invalid DER: expected OCTET STRING for private key\"\n        raise ValueError(msg)\n    offset += 1\n    priv_len, offset = decode_length(der_data, offset)\n\n    # Parse EC private key structure\n    ec_data = der_data[offset : offset + priv_len]\n\n    # Verify EC structure starts with sequence\n    if len(ec_data) < 2 or ec_data[0] != SEQUENCE_TAG:  # noqa: PLR2004\n        msg = \"Invalid EC key format: missing sequence\"\n        raise ValueError(msg)\n\n    # Skip sequence tag and length\n    ec_offset = 1\n    _, ec_offset = decode_length(ec_data, ec_offset)\n\n    # Skip version INTEGER (should be 1)\n    if ec_data[ec_offset] != INTEGER_TAG:\n        msg = \"Invalid EC key format: missing version\"\n        raise ValueError(msg)\n    ec_offset += 1\n    ec_ver_len, ec_offset = decode_length(ec_data, ec_offset)\n    ec_offset += ec_ver_len  # Skip version value\n\n    # Get private key octet string\n    if ec_data[ec_offset] != OCTET_STRING_TAG:\n        msg = \"Invalid DER: expected OCTET STRING for EC private key\"\n        raise ValueError(msg)\n    ec_offset += 1\n\n    key_len, ec_offset = decode_length(ec_data, ec_offset)\n\n    # Extract private key\n    return ec_data[ec_offset : ec_offset + key_len]\n"
  },
  {
    "path": "src/coincurve/ecdsa.py",
    "content": "from __future__ import annotations\n\nfrom typing import TYPE_CHECKING\n\nfrom coincurve._libsecp256k1 import ffi, lib\nfrom coincurve.context import GLOBAL_CONTEXT, Context\nfrom coincurve.utils import bytes_to_int, int_to_bytes, sha256\n\nif TYPE_CHECKING:\n    from coincurve.types import Hasher\n\nMAX_SIG_LENGTH = 72\nCDATA_SIG_LENGTH = 64\n\n\ndef cdata_to_der(cdata, context: Context = GLOBAL_CONTEXT) -> bytes:\n    der = ffi.new(\"unsigned char[72]\")\n    der_length = ffi.new(\"size_t *\", MAX_SIG_LENGTH)\n\n    lib.secp256k1_ecdsa_signature_serialize_der(context.ctx, der, der_length, cdata)\n\n    return bytes(ffi.buffer(der, der_length[0]))\n\n\ndef der_to_cdata(der: bytes, context: Context = GLOBAL_CONTEXT):\n    cdata = ffi.new(\"secp256k1_ecdsa_signature *\")\n    parsed = lib.secp256k1_ecdsa_signature_parse_der(context.ctx, cdata, der, len(der))\n\n    if not parsed:\n        msg = \"The DER-encoded signature could not be parsed.\"\n        raise ValueError(msg)\n\n    return cdata\n\n\ndef recover(message: bytes, recover_sig, hasher: Hasher = sha256, context: Context = GLOBAL_CONTEXT):\n    msg_hash = hasher(message) if hasher is not None else message\n    if len(msg_hash) != 32:  # noqa: PLR2004\n        msg = \"Message hash must be 32 bytes long.\"\n        raise ValueError(msg)\n    pubkey = ffi.new(\"secp256k1_pubkey *\")\n\n    recovered = lib.secp256k1_ecdsa_recover(context.ctx, pubkey, recover_sig, msg_hash)\n    if recovered:\n        return pubkey\n    msg = \"failed to recover ECDSA public key\"\n    raise ValueError(msg)\n\n\ndef serialize_recoverable(recover_sig, context: Context = GLOBAL_CONTEXT) -> bytes:\n    output = ffi.new(\"unsigned char[64]\")\n    recid = ffi.new(\"int *\")\n\n    lib.secp256k1_ecdsa_recoverable_signature_serialize_compact(context.ctx, output, recid, recover_sig)\n\n    return bytes(ffi.buffer(output, CDATA_SIG_LENGTH)) + int_to_bytes(recid[0])\n\n\ndef deserialize_recoverable(serialized: bytes, context: Context = GLOBAL_CONTEXT):\n    if len(serialized) != 65:  # noqa: PLR2004\n        msg = \"Serialized signature must be 65 bytes long.\"\n        raise ValueError(msg)\n\n    ser_sig, rec_id = serialized[:64], bytes_to_int(serialized[64:])\n\n    if not 0 <= rec_id <= 3:  # noqa: PLR2004\n        msg = \"Invalid recovery id.\"\n        raise ValueError(msg)\n\n    recover_sig = ffi.new(\"secp256k1_ecdsa_recoverable_signature *\")\n\n    parsed = lib.secp256k1_ecdsa_recoverable_signature_parse_compact(context.ctx, recover_sig, ser_sig, rec_id)\n    if not parsed:\n        msg = \"Failed to parse recoverable signature.\"\n        raise ValueError(msg)\n\n    return recover_sig\n\n\n\"\"\"\nWarning:\n    The functions below may change and are not tested!\n\"\"\"\n\n\ndef serialize_compact(raw_sig, context: Context = GLOBAL_CONTEXT):  # no cov\n    output = ffi.new(\"unsigned char[64]\")\n\n    res = lib.secp256k1_ecdsa_signature_serialize_compact(context.ctx, output, raw_sig)\n    if not res:\n        msg = \"secp256k1_ecdsa_signature_serialize_compact\"\n        raise ValueError(msg)\n\n    return bytes(ffi.buffer(output, CDATA_SIG_LENGTH))\n\n\ndef deserialize_compact(ser_sig: bytes, context: Context = GLOBAL_CONTEXT):  # no cov\n    if len(ser_sig) != 64:  # noqa: PLR2004\n        msg = \"invalid signature length\"\n        raise ValueError(msg)\n\n    raw_sig = ffi.new(\"secp256k1_ecdsa_signature *\")\n    res = lib.secp256k1_ecdsa_signature_parse_compact(context.ctx, raw_sig, ser_sig)\n    if not res:\n        msg = \"secp256k1_ecdsa_signature_parse_compact\"\n        raise ValueError(msg)\n\n    return raw_sig\n\n\ndef signature_normalize(raw_sig, context: Context = GLOBAL_CONTEXT):  # no cov\n    \"\"\"\n    Check and optionally convert a signature to a normalized lower-S form.\n\n    This function always return a tuple containing a boolean (True if\n    not previously normalized or False if signature was already\n    normalized), and the normalized signature.\n    \"\"\"\n    sigout = ffi.new(\"secp256k1_ecdsa_signature *\")\n\n    res = lib.secp256k1_ecdsa_signature_normalize(context.ctx, sigout, raw_sig)\n\n    return not not res, sigout  # noqa: SIM208\n\n\ndef recoverable_convert(recover_sig, context: Context = GLOBAL_CONTEXT):  # no cov\n    normal_sig = ffi.new(\"secp256k1_ecdsa_signature *\")\n\n    lib.secp256k1_ecdsa_recoverable_signature_convert(context.ctx, normal_sig, recover_sig)\n\n    return normal_sig\n"
  },
  {
    "path": "src/coincurve/flags.py",
    "content": "from __future__ import annotations\n\nfrom coincurve._libsecp256k1 import lib\n\nCONTEXT_NONE = lib.SECP256K1_CONTEXT_NONE\nCONTEXT_FLAGS = {\n    CONTEXT_NONE,\n}\n\nEC_COMPRESSED = lib.SECP256K1_EC_COMPRESSED\nEC_UNCOMPRESSED = lib.SECP256K1_EC_UNCOMPRESSED\n\n# Additional flags available from libsecp256k1\n# lib.SECP256K1_TAG_PUBKEY_EVEN\n# lib.SECP256K1_TAG_PUBKEY_ODD\n# lib.SECP256K1_TAG_PUBKEY_UNCOMPRESSED\n# lib.SECP256K1_TAG_PUBKEY_HYBRID_EVEN\n# lib.SECP256K1_TAG_PUBKEY_HYBRID_ODD\n"
  },
  {
    "path": "src/coincurve/keys.py",
    "content": "from __future__ import annotations\n\nimport os\nfrom typing import TYPE_CHECKING\n\nfrom coincurve._libsecp256k1 import ffi, lib\nfrom coincurve.context import GLOBAL_CONTEXT, Context\nfrom coincurve.der import decode_der, encode_der\nfrom coincurve.ecdsa import cdata_to_der, der_to_cdata, deserialize_recoverable, recover, serialize_recoverable\nfrom coincurve.flags import EC_COMPRESSED, EC_UNCOMPRESSED\nfrom coincurve.utils import (\n    DEFAULT_NONCE,\n    bytes_to_int,\n    der_to_pem,\n    get_valid_secret,\n    hex_to_bytes,\n    int_to_bytes_padded,\n    pad_scalar,\n    pem_to_der,\n    sha256,\n    validate_secret,\n)\n\nif TYPE_CHECKING:\n    from coincurve.types import Hasher, Nonce\n\n\nclass PrivateKey:\n    def __init__(self, secret: bytes | None = None, context: Context = GLOBAL_CONTEXT):\n        \"\"\"\n        Initializes a private key.\n\n        Parameters:\n            secret: The secret used to initialize the private key.\n                    If not provided, a new key will be generated.\n            context: The context to use.\n        \"\"\"\n        self.secret: bytes = validate_secret(secret) if secret is not None else get_valid_secret()\n        self.context = context\n        self.public_key: PublicKey = PublicKey.from_valid_secret(self.secret, self.context)\n        self.public_key_xonly: PublicKeyXOnly = PublicKeyXOnly.from_valid_secret(self.secret, self.context)\n\n    def sign(self, message: bytes, hasher: Hasher = sha256, custom_nonce: Nonce = DEFAULT_NONCE) -> bytes:\n        \"\"\"\n        Creates an ECDSA signature.\n\n        Parameters:\n            message: The message to sign.\n            hasher (collections.abc.Callable[[bytes], bytes] | None): The hash function to use, which must\n                return 32 bytes. By default, the `sha256` algorithm is used. If `None`, no hashing occurs.\n            custom_nonce (tuple[ffi.CData, ffi.CData]): Custom nonce data in the form `(nonce_function, input_data)`.\n                For more information, refer to the `libsecp256k1` documentation\n                [here](https://github.com/bitcoin-core/secp256k1/blob/v0.6.0/include/secp256k1.h#L637-L642).\n\n        Returns:\n            The ECDSA signature.\n\n        Raises:\n            ValueError: If the message hash was not 32 bytes long, the nonce generation\n                        function failed, or the private key was invalid.\n        \"\"\"\n        msg_hash = hasher(message) if hasher is not None else message\n        if len(msg_hash) != 32:  # noqa: PLR2004\n            msg = \"Message hash must be 32 bytes long.\"\n            raise ValueError(msg)\n\n        signature = ffi.new(\"secp256k1_ecdsa_signature *\")\n        nonce_fn, nonce_data = custom_nonce\n\n        signed = lib.secp256k1_ecdsa_sign(self.context.ctx, signature, msg_hash, self.secret, nonce_fn, nonce_data)\n\n        if not signed:\n            msg = \"The nonce generation function failed, or the private key was invalid.\"\n            raise ValueError(msg)\n\n        return cdata_to_der(signature, self.context)\n\n    def sign_schnorr(self, message: bytes, aux_randomness: bytes = b\"\") -> bytes:\n        \"\"\"\n        Creates a Schnorr signature.\n\n        Parameters:\n            message: The message to sign.\n            aux_randomness: 32 bytes of fresh randomness, empty bytestring (auto-generated),\n                or None (no randomness).\n\n        Returns:\n            The Schnorr signature.\n\n        Raises:\n            ValueError: If the message was not 32 bytes long, the optional auxiliary\n                random data was not 32 bytes long, signing failed, or the signature was invalid.\n        \"\"\"\n        if len(message) != 32:  # noqa: PLR2004\n            msg = \"Message must be 32 bytes long.\"\n            raise ValueError(msg)\n        if aux_randomness == b\"\":\n            aux_randomness = os.urandom(32)\n        elif aux_randomness is None:\n            aux_randomness = ffi.NULL\n        elif len(aux_randomness) != 32:  # noqa: PLR2004\n            msg = \"Auxiliary random data must be 32 bytes long.\"\n            raise ValueError(msg)\n\n        keypair = ffi.new(\"secp256k1_keypair *\")\n        res = lib.secp256k1_keypair_create(self.context.ctx, keypair, self.secret)\n        if not res:\n            msg = \"Secret was invalid\"\n            raise ValueError(msg)\n\n        signature = ffi.new(\"unsigned char[64]\")\n        res = lib.secp256k1_schnorrsig_sign32(self.context.ctx, signature, message, keypair, aux_randomness)\n        if not res:\n            msg = \"Signing failed\"\n            raise ValueError(msg)\n\n        res = lib.secp256k1_schnorrsig_verify(\n            self.context.ctx, signature, message, len(message), self.public_key_xonly.public_key\n        )\n        if not res:\n            msg = \"Invalid signature\"\n            raise ValueError(msg)\n\n        return bytes(ffi.buffer(signature))\n\n    def sign_recoverable(self, message: bytes, hasher: Hasher = sha256, custom_nonce: Nonce = DEFAULT_NONCE) -> bytes:\n        \"\"\"\n        Creates a recoverable ECDSA signature.\n\n        Parameters:\n            message: The message to sign.\n            hasher (collections.abc.Callable[[bytes], bytes] | None): The hash function to use, which must\n                return 32 bytes. By default, the `sha256` algorithm is used. If `None`, no hashing occurs.\n            custom_nonce (tuple[ffi.CData, ffi.CData]): Custom nonce data in the form `(nonce_function, input_data)`.\n                For more information, refer to the `libsecp256k1` documentation\n                [here](https://github.com/bitcoin-core/secp256k1/blob/v0.6.0/include/secp256k1.h#L637-L642).\n\n        Returns:\n            The recoverable ECDSA signature.\n\n        Raises:\n            ValueError: If the message hash was not 32 bytes long, the nonce generation\n                function failed, or the private key was invalid.\n        \"\"\"\n        msg_hash = hasher(message) if hasher is not None else message\n        if len(msg_hash) != 32:  # noqa: PLR2004\n            msg = \"Message hash must be 32 bytes long.\"\n            raise ValueError(msg)\n\n        signature = ffi.new(\"secp256k1_ecdsa_recoverable_signature *\")\n        nonce_fn, nonce_data = custom_nonce\n\n        signed = lib.secp256k1_ecdsa_sign_recoverable(\n            self.context.ctx, signature, msg_hash, self.secret, nonce_fn, nonce_data\n        )\n\n        if not signed:\n            msg = \"The nonce generation function failed, or the private key was invalid.\"\n            raise ValueError(msg)\n\n        return serialize_recoverable(signature, self.context)\n\n    def ecdh(self, public_key: bytes) -> bytes:\n        \"\"\"\n        Computes an EC Diffie-Hellman secret in constant time.\n\n        !!! note\n            This prevents malleability by returning `sha256(compressed_public_key)` instead of the `x` coordinate\n            directly.\n\n        Parameters:\n            public_key: The formatted public key.\n\n        Returns:\n            The 32-byte shared secret.\n\n        Raises:\n            ValueError: If the public key could not be parsed or was invalid.\n        \"\"\"\n        secret = ffi.new(\"unsigned char [32]\")\n\n        lib.secp256k1_ecdh(self.context.ctx, secret, PublicKey(public_key).public_key, self.secret, ffi.NULL, ffi.NULL)\n\n        return bytes(ffi.buffer(secret, 32))\n\n    def add(self, scalar: bytes, update: bool = False) -> PrivateKey:  # noqa: FBT001, FBT002\n        \"\"\"\n        Adds a scalar to the private key.\n\n        Parameters:\n            scalar: The scalar with which to add.\n            update: Whether to update the private key in-place.\n\n        Returns:\n            The new private key, or the modified private key if `update` is `True`.\n\n        Raises:\n            ValueError: If the tweak was out of range or the resulting private key was invalid.\n        \"\"\"\n        scalar = pad_scalar(scalar)\n\n        secret = ffi.new(\"unsigned char [32]\", self.secret)\n\n        success = lib.secp256k1_ec_seckey_tweak_add(self.context.ctx, secret, scalar)\n\n        if not success:\n            msg = \"The tweak was out of range, or the resulting private key is invalid.\"\n            raise ValueError(msg)\n\n        secret = bytes(ffi.buffer(secret, 32))\n\n        if update:\n            self.secret = secret\n            self._update_public_key()\n            return self\n\n        return PrivateKey(secret, self.context)\n\n    def multiply(self, scalar: bytes, update: bool = False) -> PrivateKey:  # noqa: FBT001, FBT002\n        \"\"\"\n        Multiplies the private key by a scalar.\n\n        Parameters:\n            scalar: The scalar with which to multiply.\n            update: Whether to update the private key in-place.\n\n        Returns:\n            The new private key, or the modified private key if `update` is `True`.\n        \"\"\"\n        scalar = validate_secret(scalar)\n\n        secret = ffi.new(\"unsigned char [32]\", self.secret)\n\n        lib.secp256k1_ec_seckey_tweak_mul(self.context.ctx, secret, scalar)\n\n        secret = bytes(ffi.buffer(secret, 32))\n\n        if update:\n            self.secret = secret\n            self._update_public_key()\n            return self\n\n        return PrivateKey(secret, self.context)\n\n    def to_hex(self) -> str:\n        \"\"\"\n        Returns the private key encoded as a hex string.\n        \"\"\"\n        return self.secret.hex()\n\n    def to_int(self) -> int:\n        \"\"\"\n        Returns the private key as an integer.\n        \"\"\"\n        return bytes_to_int(self.secret)\n\n    def to_pem(self) -> bytes:\n        \"\"\"\n        Returns the private key encoded in PEM format.\n        \"\"\"\n        return der_to_pem(self.to_der())\n\n    def to_der(self) -> bytes:\n        \"\"\"\n        Returns the private key encoded in DER format.\n        \"\"\"\n        return encode_der(self.secret, self.public_key.format(compressed=False))\n\n    @classmethod\n    def from_hex(cls, hexed: str, context: Context = GLOBAL_CONTEXT) -> PrivateKey:\n        \"\"\"\n        Creates a private key from a hex string.\n\n        Parameters:\n            hexed: The private key encoded as a hex string.\n            context: The context to use.\n\n        Returns:\n            The private key.\n        \"\"\"\n        return PrivateKey(hex_to_bytes(hexed), context)\n\n    @classmethod\n    def from_int(cls, num: int, context: Context = GLOBAL_CONTEXT) -> PrivateKey:\n        \"\"\"\n        Creates a private key from an integer.\n\n        Parameters:\n            num: The private key as an integer.\n            context: The context to use.\n\n        Returns:\n            The private key.\n        \"\"\"\n        return PrivateKey(int_to_bytes_padded(num), context)\n\n    @classmethod\n    def from_pem(cls, pem: bytes, context: Context = GLOBAL_CONTEXT) -> PrivateKey:\n        \"\"\"\n        Creates a private key from PEM format.\n\n        Parameters:\n            pem: The private key encoded in PEM format.\n            context: The context to use.\n\n        Returns:\n            The private key.\n        \"\"\"\n        return PrivateKey(decode_der(pem_to_der(pem)), context)\n\n    @classmethod\n    def from_der(cls, der: bytes, context: Context = GLOBAL_CONTEXT) -> PrivateKey:\n        \"\"\"\n        Creates a private key from DER format.\n\n        Parameters:\n            der: The private key encoded in DER format.\n            context: The context to use.\n\n        Returns:\n            The private key.\n        \"\"\"\n        return PrivateKey(decode_der(der), context)\n\n    def _update_public_key(self):\n        created = lib.secp256k1_ec_pubkey_create(self.context.ctx, self.public_key.public_key, self.secret)\n\n        if not created:\n            msg = \"Invalid secret.\"\n            raise ValueError(msg)\n\n    def __eq__(self, other) -> bool:\n        return self.secret == other.secret\n\n    def __hash__(self) -> int:\n        return hash(self.secret)\n\n\nclass PublicKey:\n    def __init__(self, data: bytes | ffi.CData, context: Context = GLOBAL_CONTEXT):\n        \"\"\"\n        Initializes a public key.\n\n        Parameters:\n            data (bytes): The formatted public key. This class supports parsing\n                compressed (33 bytes, header byte `0x02` or `0x03`),\n                uncompressed (65 bytes, header byte `0x04`), or\n                hybrid (65 bytes, header byte `0x06` or `0x07`) format public keys.\n            context: The context to use.\n\n        Raises:\n            ValueError: If the public key could not be parsed or was invalid.\n        \"\"\"\n        if not isinstance(data, bytes):\n            self.public_key = data\n        else:\n            public_key = ffi.new(\"secp256k1_pubkey *\")\n\n            parsed = lib.secp256k1_ec_pubkey_parse(context.ctx, public_key, data, len(data))\n\n            if not parsed:\n                msg = \"The public key could not be parsed or is invalid.\"\n                raise ValueError(msg)\n\n            self.public_key = public_key\n\n        self.context = context\n\n    @classmethod\n    def from_secret(cls, secret: bytes, context: Context = GLOBAL_CONTEXT) -> PublicKey:\n        \"\"\"\n        Derives a public key from a private key secret.\n\n        Parameters:\n            secret: The private key secret.\n            context: The context to use.\n\n        Returns:\n            The public key.\n\n        Raises:\n            ValueError: If an invalid secret was used.\n        \"\"\"\n        public_key = ffi.new(\"secp256k1_pubkey *\")\n\n        created = lib.secp256k1_ec_pubkey_create(context.ctx, public_key, validate_secret(secret))\n\n        if not created:  # no cov\n            msg = (\n                \"Somehow an invalid secret was used. Please \"\n                \"submit this as an issue here: \"\n                \"https://github.com/ofek/coincurve/issues/new\"\n            )\n            raise ValueError(msg)\n\n        return PublicKey(public_key, context)\n\n    @classmethod\n    def from_valid_secret(cls, secret: bytes, context: Context = GLOBAL_CONTEXT) -> PublicKey:\n        \"\"\"\n        Derives a public key from a valid private key secret, avoiding input checks.\n\n        Parameters:\n            secret: The private key secret.\n            context: The context to use.\n\n        Returns:\n            The public key.\n\n        Raises:\n            ValueError: If the secret was invalid.\n        \"\"\"\n        public_key = ffi.new(\"secp256k1_pubkey *\")\n\n        created = lib.secp256k1_ec_pubkey_create(context.ctx, public_key, secret)\n\n        if not created:\n            msg = \"Invalid secret.\"\n            raise ValueError(msg)\n\n        return PublicKey(public_key, context)\n\n    @classmethod\n    def from_point(cls, x: int, y: int, context: Context = GLOBAL_CONTEXT) -> PublicKey:\n        \"\"\"\n        Derives a public key from a coordinate point.\n\n        Parameters:\n            x: The x coordinate.\n            y: The y coordinate.\n            context: The context to use.\n\n        Returns:\n            The public key.\n        \"\"\"\n        return PublicKey(b\"\\x04\" + int_to_bytes_padded(x) + int_to_bytes_padded(y), context)\n\n    @classmethod\n    def from_signature_and_message(\n        cls, signature: bytes, message: bytes, hasher: Hasher = sha256, context: Context = GLOBAL_CONTEXT\n    ) -> PublicKey:\n        \"\"\"\n        Recovers an ECDSA public key from a recoverable signature.\n\n        Parameters:\n            signature: The recoverable ECDSA signature.\n            message: The message that was supposedly signed.\n            hasher (collections.abc.Callable[[bytes], bytes] | None): The hash function to use, which must\n                return 32 bytes. By default, the `sha256` algorithm is used. If `None`, no hashing occurs.\n            context: The context to use.\n\n        Returns:\n            The public key that signed the message.\n\n        Raises:\n            ValueError: If the message hash was not 32 bytes long or recovery of the\n                ECDSA public key failed.\n        \"\"\"\n        return PublicKey(\n            recover(message, deserialize_recoverable(signature, context=context), hasher=hasher, context=context)\n        )\n\n    @classmethod\n    def combine_keys(cls, public_keys: list[PublicKey], context: Context = GLOBAL_CONTEXT) -> PublicKey:\n        \"\"\"\n        Adds a number of public keys together.\n\n        Parameters:\n            public_keys: A sequence of public keys.\n            context: The context to use.\n\n        Returns:\n            The combined public key.\n\n        Raises:\n            ValueError: If the sum of the public keys was invalid.\n        \"\"\"\n        public_key = ffi.new(\"secp256k1_pubkey *\")\n\n        combined = lib.secp256k1_ec_pubkey_combine(\n            context.ctx, public_key, [pk.public_key for pk in public_keys], len(public_keys)\n        )\n\n        if not combined:\n            msg = \"The sum of the public keys is invalid.\"\n            raise ValueError(msg)\n\n        return PublicKey(public_key, context)\n\n    def format(self, compressed: bool = True) -> bytes:  # noqa: FBT001, FBT002\n        \"\"\"\n        Formats the public key.\n\n        Parameters:\n            compressed: Whether to use the compressed format.\n\n        Returns:\n            The 33 byte formatted public key, or the 65 byte formatted public key\n            if `compressed` is `False`.\n        \"\"\"\n        length = 33 if compressed else 65\n        serialized = ffi.new(\"unsigned char [%d]\" % length)  # noqa: UP031\n        output_len = ffi.new(\"size_t *\", length)\n\n        lib.secp256k1_ec_pubkey_serialize(\n            self.context.ctx, serialized, output_len, self.public_key, EC_COMPRESSED if compressed else EC_UNCOMPRESSED\n        )\n\n        return bytes(ffi.buffer(serialized, length))\n\n    def point(self) -> tuple[int, int]:\n        \"\"\"\n        Returns the public key as a coordinate point.\n        \"\"\"\n        public_key = self.format(compressed=False)\n        return bytes_to_int(public_key[1:33]), bytes_to_int(public_key[33:])\n\n    def verify(self, signature: bytes, message: bytes, hasher: Hasher = sha256) -> bool:\n        \"\"\"\n        Verifies an ECDSA signature.\n\n        Parameters:\n            signature: The ECDSA signature.\n            message: The message that was supposedly signed.\n            hasher (collections.abc.Callable[[bytes], bytes] | None): The hash function to use, which must\n                return 32 bytes. By default, the `sha256` algorithm is used. If `None`, no hashing occurs.\n\n        Returns:\n            A boolean indicating whether the signature is correct.\n\n        Raises:\n            ValueError: If the message hash was not 32 bytes long or the\n                DER-encoded signature could not be parsed.\n        \"\"\"\n        msg_hash = hasher(message) if hasher is not None else message\n        if len(msg_hash) != 32:  # noqa: PLR2004\n            msg = \"Message hash must be 32 bytes long.\"\n            raise ValueError(msg)\n\n        verified = lib.secp256k1_ecdsa_verify(self.context.ctx, der_to_cdata(signature), msg_hash, self.public_key)\n\n        # A performance hack to avoid global bool() lookup.\n        return not not verified  # noqa: SIM208\n\n    def add(self, scalar: bytes, update: bool = False) -> PublicKey:  # noqa: FBT001, FBT002\n        \"\"\"\n        Adds a scalar to the public key.\n\n        Parameters:\n            scalar: The scalar with which to add.\n            update: Whether to update the public key in-place.\n\n        Returns:\n            The new public key, or the modified public key if `update` is `True`.\n\n        Raises:\n            ValueError: If the tweak was out of range or the resulting public key was invalid.\n        \"\"\"\n        scalar = pad_scalar(scalar)\n\n        new_key = ffi.new(\"secp256k1_pubkey *\", self.public_key[0])\n\n        success = lib.secp256k1_ec_pubkey_tweak_add(self.context.ctx, new_key, scalar)\n\n        if not success:\n            msg = \"The tweak was out of range, or the resulting public key is invalid.\"\n            raise ValueError(msg)\n\n        if update:\n            self.public_key = new_key\n            return self\n\n        return PublicKey(new_key, self.context)\n\n    def multiply(self, scalar: bytes, update: bool = False) -> PublicKey:  # noqa: FBT001, FBT002\n        \"\"\"\n        Multiplies the public key by a scalar.\n\n        Parameters:\n            scalar: The scalar with which to multiply.\n            update: Whether to update the public key in-place.\n\n        Returns:\n            The new public key, or the modified public key if `update` is `True`.\n        \"\"\"\n        scalar = validate_secret(scalar)\n\n        new_key = ffi.new(\"secp256k1_pubkey *\", self.public_key[0])\n\n        lib.secp256k1_ec_pubkey_tweak_mul(self.context.ctx, new_key, scalar)\n\n        if update:\n            self.public_key = new_key\n            return self\n\n        return PublicKey(new_key, self.context)\n\n    def combine(self, public_keys: list[PublicKey], update: bool = False) -> PublicKey:  # noqa: FBT001, FBT002\n        \"\"\"\n        Adds a number of public keys together.\n\n        Parameters:\n            public_keys: A sequence of public keys.\n            update: Whether to update the public key in-place.\n\n        Returns:\n            The combined public key, or the modified public key if `update` is `True`.\n\n        Raises:\n            ValueError: If the sum of the public keys was invalid.\n        \"\"\"\n        new_key = ffi.new(\"secp256k1_pubkey *\")\n\n        combined = lib.secp256k1_ec_pubkey_combine(\n            self.context.ctx, new_key, [pk.public_key for pk in [self, *public_keys]], len(public_keys) + 1\n        )\n\n        if not combined:\n            msg = \"The sum of the public keys is invalid.\"\n            raise ValueError(msg)\n\n        if update:\n            self.public_key = new_key\n            return self\n\n        return PublicKey(new_key, self.context)\n\n    def __eq__(self, other) -> bool:\n        return self.format(compressed=False) == other.format(compressed=False)\n\n    def __hash__(self) -> int:\n        return hash(self.format(compressed=False))\n\n\nclass PublicKeyXOnly:\n    def __init__(self, data: bytes | ffi.CData, parity: bool = False, context: Context = GLOBAL_CONTEXT):  # noqa: FBT001, FBT002\n        \"\"\"\n        Initializes a BIP340 `x-only` public key.\n\n        Parameters:\n            data (bytes): The formatted public key.\n            parity: Whether the encoded point is the negation of the public key.\n            context: The context to use.\n\n        Raises:\n            ValueError: If the public key could not be parsed or is invalid.\n        \"\"\"\n        if not isinstance(data, bytes):\n            self.public_key = data\n        else:\n            public_key = ffi.new(\"secp256k1_xonly_pubkey *\")\n            parsed = lib.secp256k1_xonly_pubkey_parse(context.ctx, public_key, data)\n            if not parsed:\n                msg = \"The public key could not be parsed or is invalid.\"\n                raise ValueError(msg)\n\n            self.public_key = public_key\n\n        self.parity = parity\n        self.context = context\n\n    @classmethod\n    def from_secret(cls, secret: bytes, context: Context = GLOBAL_CONTEXT) -> PublicKeyXOnly:\n        \"\"\"\n        Derives an x-only public key from a private key secret.\n\n        Parameters:\n            secret: The private key secret.\n            context: The context to use.\n\n        Returns:\n            The x-only public key.\n\n        Raises:\n            ValueError: If the secret was invalid.\n        \"\"\"\n        keypair = ffi.new(\"secp256k1_keypair *\")\n        res = lib.secp256k1_keypair_create(context.ctx, keypair, validate_secret(secret))\n        if not res:\n            msg = \"Secret was invalid\"\n            raise ValueError(msg)\n\n        xonly_pubkey = ffi.new(\"secp256k1_xonly_pubkey *\")\n        pk_parity = ffi.new(\"int *\")\n        res = lib.secp256k1_keypair_xonly_pub(context.ctx, xonly_pubkey, pk_parity, keypair)\n\n        return cls(xonly_pubkey, parity=not not pk_parity[0], context=context)  # noqa: SIM208\n\n    @classmethod\n    def from_valid_secret(cls, secret: bytes, context: Context = GLOBAL_CONTEXT) -> PublicKeyXOnly:\n        \"\"\"\n        Derives an x-only public key from a valid private key secret, avoiding input checks.\n\n        Parameters:\n            secret: The private key secret.\n            context: The context to use.\n\n        Returns:\n            The x-only public key.\n\n        Raises:\n            ValueError: If the secret was invalid.\n        \"\"\"\n        keypair = ffi.new(\"secp256k1_keypair *\")\n        res = lib.secp256k1_keypair_create(context.ctx, keypair, secret)\n        if not res:\n            msg = \"Secret was invalid\"\n            raise ValueError(msg)\n\n        xonly_pubkey = ffi.new(\"secp256k1_xonly_pubkey *\")\n        pk_parity = ffi.new(\"int *\")\n        res = lib.secp256k1_keypair_xonly_pub(context.ctx, xonly_pubkey, pk_parity, keypair)\n\n        return cls(xonly_pubkey, parity=not not pk_parity[0], context=context)  # noqa: SIM208\n\n    def format(self) -> bytes:\n        \"\"\"\n        Serializes the public key.\n\n        Returns:\n            The public key serialized as 32 bytes.\n\n        Raises:\n            ValueError: If the public key in `self.public_key` is invalid.\n        \"\"\"\n        output32 = ffi.new(\"unsigned char [32]\")\n\n        res = lib.secp256k1_xonly_pubkey_serialize(self.context.ctx, output32, self.public_key)\n        if not res:\n            msg = \"Public key in self.public_key must be valid\"\n            raise ValueError(msg)\n\n        return bytes(ffi.buffer(output32, 32))\n\n    def verify(self, signature: bytes, message: bytes) -> bool:\n        \"\"\"\n        Verifies a Schnorr signature over a given message.\n\n        Parameters:\n            signature: The 64-byte Schnorr signature to verify.\n            message: The message to be verified.\n\n        Returns:\n            A boolean indicating whether the signature is correct.\n\n        Raises:\n            ValueError: If the signature is not 64 bytes long.\n        \"\"\"\n        if len(signature) != 64:  # noqa: PLR2004\n            msg = \"Signature must be 64 bytes long.\"\n            raise ValueError(msg)\n\n        return not not lib.secp256k1_schnorrsig_verify(  # noqa: SIM208\n            self.context.ctx, signature, message, len(message), self.public_key\n        )\n\n    def tweak_add(self, scalar: bytes) -> None:\n        \"\"\"\n        Adds a scalar to the public key.\n\n        Parameters:\n            scalar: The scalar with which to add.\n\n        Returns:\n            The modified public key.\n\n        Raises:\n            ValueError: If the tweak was out of range or the resulting public key would be invalid.\n        \"\"\"\n        scalar = pad_scalar(scalar)\n\n        out_pubkey = ffi.new(\"secp256k1_pubkey *\")\n        res = lib.secp256k1_xonly_pubkey_tweak_add(self.context.ctx, out_pubkey, self.public_key, scalar)\n        if not res:\n            msg = \"The tweak was out of range, or the resulting public key would be invalid\"\n            raise ValueError(msg)\n\n        pk_parity = ffi.new(\"int *\")\n        lib.secp256k1_xonly_pubkey_from_pubkey(self.context.ctx, self.public_key, pk_parity, out_pubkey)\n        self.parity = not not pk_parity[0]  # noqa: SIM208\n\n    def __eq__(self, other) -> bool:\n        res = lib.secp256k1_xonly_pubkey_cmp(self.context.ctx, self.public_key, other.public_key)\n        return res == 0\n\n    def __hash__(self) -> int:\n        return hash(self.format())\n"
  },
  {
    "path": "src/coincurve/py.typed",
    "content": ""
  },
  {
    "path": "src/coincurve/types.py",
    "content": "from __future__ import annotations\n\nfrom collections.abc import Callable\n\nfrom coincurve._libsecp256k1 import ffi\n\nHasher = Callable[[bytes], bytes] | None\nNonce = tuple[ffi.CData, ffi.CData]\n"
  },
  {
    "path": "src/coincurve/utils.py",
    "content": "from __future__ import annotations\n\nfrom base64 import b64decode, b64encode\nfrom hashlib import sha256 as _sha256\nfrom os import environ, urandom\nfrom typing import TYPE_CHECKING\n\nfrom coincurve._libsecp256k1 import ffi, lib\nfrom coincurve.context import GLOBAL_CONTEXT, Context\n\nif TYPE_CHECKING:\n    from collections.abc import Generator\n\n    from coincurve.types import Hasher\n\nGROUP_ORDER = (\n    b\"\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xfe\\xba\\xae\\xdc\\xe6\\xafH\\xa0;\\xbf\\xd2^\\x8c\\xd06AA\"\n)\nGROUP_ORDER_INT = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141\nKEY_SIZE = 32\nMSG_HASH_SIZE = 32\nZERO = b\"\\x00\"\nPEM_HEADER = b\"-----BEGIN PRIVATE KEY-----\\n\"\nPEM_FOOTER = b\"-----END PRIVATE KEY-----\\n\"\n\n\nif environ.get(\"COINCURVE_BUILDING_DOCS\") != \"true\":\n    DEFAULT_NONCE = (ffi.NULL, ffi.NULL)\n\n    def sha256(bytestr: bytes) -> bytes:\n        return _sha256(bytestr).digest()\n\nelse:  # no cov\n\n    class __Nonce(tuple):  # noqa: SLOT001\n        def __repr__(self) -> str:\n            return \"(ffi.NULL, ffi.NULL)\"\n\n    class __HasherSHA256:\n        def __call__(self, bytestr: bytes) -> bytes:\n            return _sha256(bytestr).digest()\n\n        def __repr__(self) -> str:\n            return \"sha256\"\n\n    DEFAULT_NONCE = __Nonce((ffi.NULL, ffi.NULL))\n    sha256 = __HasherSHA256()\n\n\ndef pad_hex(hexed: str) -> str:\n    # Pad odd-length hex strings.\n    return hexed if not len(hexed) & 1 else f\"0{hexed}\"\n\n\ndef bytes_to_int(bytestr: bytes) -> int:\n    return int.from_bytes(bytestr, \"big\")\n\n\ndef int_to_bytes(num: int) -> bytes:\n    return num.to_bytes((num.bit_length() + 7) // 8 or 1, \"big\")\n\n\ndef int_to_bytes_padded(num: int) -> bytes:\n    return pad_scalar(num.to_bytes((num.bit_length() + 7) // 8 or 1, \"big\"))\n\n\ndef hex_to_bytes(hexed: str) -> bytes:\n    return pad_scalar(bytes.fromhex(pad_hex(hexed)))\n\n\ndef chunk_data(data: bytes, size: int) -> Generator[bytes, None, None]:\n    return (data[i : i + size] for i in range(0, len(data), size))\n\n\ndef der_to_pem(der: bytes) -> bytes:\n    return b\"\".join([PEM_HEADER, b\"\\n\".join(chunk_data(b64encode(der), 64)), b\"\\n\", PEM_FOOTER])\n\n\ndef pem_to_der(pem: bytes) -> bytes:\n    return b64decode(b\"\".join(pem.strip().splitlines()[1:-1]))\n\n\ndef get_valid_secret() -> bytes:\n    while True:\n        secret = urandom(KEY_SIZE)\n        if ZERO < secret < GROUP_ORDER:\n            return secret\n\n\ndef pad_scalar(scalar: bytes) -> bytes:\n    return (ZERO * (KEY_SIZE - len(scalar))) + scalar\n\n\ndef validate_secret(secret: bytes) -> bytes:\n    if not 0 < bytes_to_int(secret) < GROUP_ORDER_INT:\n        msg = f\"Secret scalar must be greater than 0 and less than {GROUP_ORDER_INT}.\"\n        raise ValueError(msg)\n    return pad_scalar(secret)\n\n\ndef verify_signature(\n    signature: bytes, message: bytes, public_key: bytes, hasher: Hasher = sha256, context: Context = GLOBAL_CONTEXT\n) -> bool:\n    \"\"\"\n    Verify an ECDSA signature.\n\n    Parameters:\n        signature: The ECDSA signature.\n        message: The message that was supposedly signed.\n        public_key: The formatted public key.\n        hasher (collections.abc.Callable[[bytes], bytes] | None): The hash function to use, which must return 32 bytes.\n            By default, the `sha256` algorithm is used. If `None`, no hashing occurs.\n        context: The secp256k1 context.\n\n    Returns:\n        A boolean indicating whether or not the signature is correct.\n\n    Raises:\n        ValueError: If the public key could not be parsed or was invalid, the\n            message hash was not 32 bytes long, or the DER-encoded signature\n            could not be parsed.\n    \"\"\"\n    pubkey = ffi.new(\"secp256k1_pubkey *\")\n\n    pubkey_parsed = lib.secp256k1_ec_pubkey_parse(context.ctx, pubkey, public_key, len(public_key))\n\n    if not pubkey_parsed:\n        msg = \"The public key could not be parsed or is invalid.\"\n        raise ValueError(msg)\n\n    msg_hash = hasher(message) if hasher is not None else message\n    if len(msg_hash) != MSG_HASH_SIZE:\n        msg = \"Message hash must be 32 bytes long.\"\n        raise ValueError(msg)\n\n    sig = ffi.new(\"secp256k1_ecdsa_signature *\")\n\n    sig_parsed = lib.secp256k1_ecdsa_signature_parse_der(context.ctx, sig, signature, len(signature))\n\n    if not sig_parsed:\n        msg = \"The DER-encoded signature could not be parsed.\"\n        raise ValueError(msg)\n\n    verified = lib.secp256k1_ecdsa_verify(context.ctx, sig, msg_hash, pubkey)\n\n    # A performance hack to avoid global bool() lookup.\n    return not not verified  # noqa: SIM208\n"
  },
  {
    "path": "tests/__init__.py",
    "content": ""
  },
  {
    "path": "tests/conftest.py",
    "content": "import pytest\n\nPRIVATE_KEY_BYTES = b\"\\xc2\\x8a\\x9f\\x80s\\x8fw\\rRx\\x03\\xa5f\\xcfo\\xc3\\xed\\xf6\\xce\\xa5\\x86\\xc4\\xfcJR#\\xa5\\xady~\\x1a\\xc3\"\nPRIVATE_KEY_DER = (\n    b\"0\\x81\\x84\\x02\\x01\\x000\\x10\\x06\\x07*\\x86H\\xce=\\x02\\x01\\x06\"\n    b\"\\x05+\\x81\\x04\\x00\\n\\x04m0k\\x02\\x01\\x01\\x04 \\xc2\\x8a\\x9f\"\n    b\"\\x80s\\x8fw\\rRx\\x03\\xa5f\\xcfo\\xc3\\xed\\xf6\\xce\\xa5\\x86\\xc4\"\n    b\"\\xfcJR#\\xa5\\xady~\\x1a\\xc3\\xa1D\\x03B\\x00\\x04=\\\\(u\\xc9\\xbd\"\n    b\"\\x11hu\\xa7\\x1a]\\xb6L\\xff\\xcb\\x139k\\x16=\\x03\\x9b\\x1d\\x93'\"\n    b\"\\x82H\\x91\\x80C4v\\xa45**\\xdd\\x00\\xeb\\xb0\\xd5\\xc9LQ[r\\xeb\"\n    b\"\\x10\\xf1\\xfd\\x8f?\\x03\\xb4/J+%[\\xfc\\x9a\\xa9\\xe3\"\n)\nPRIVATE_KEY_HEX = \"c28a9f80738f770d527803a566cf6fc3edf6cea586c4fc4a5223a5ad797e1ac3\"\nPRIVATE_KEY_NUM = 87993618360805341115891506172036624893404292644470266399436498750715784469187\nPRIVATE_KEY_PEM = (\n    b\"-----BEGIN PRIVATE KEY-----\\n\"\n    b\"MIGEAgEAMBAGByqGSM49AgEGBSuBBAAKBG0wawIBAQQgwoqfgHOPdw1SeAOlZs9v\\n\"\n    b\"w+32zqWGxPxKUiOlrXl+GsOhRANCAAQ9XCh1yb0RaHWnGl22TP/LEzlrFj0Dmx2T\\n\"\n    b\"J4JIkYBDNHakNSoq3QDrsNXJTFFbcusQ8f2PPwO0L0orJVv8mqnj\\n\"\n    b\"-----END PRIVATE KEY-----\\n\"\n)\nPUBLIC_KEY_COMPRESSED = b\"\\x03=\\\\(u\\xc9\\xbd\\x11hu\\xa7\\x1a]\\xb6L\\xff\\xcb\\x139k\\x16=\\x03\\x9b\\x1d\\x93'\\x82H\\x91\\x80C4\"\nPUBLIC_KEY_UNCOMPRESSED = (\n    b\"\\x04=\\\\(u\\xc9\\xbd\\x11hu\\xa7\\x1a]\\xb6L\\xff\\xcb\\x139k\\x16=\\x03\"\n    b\"\\x9b\\x1d\\x93'\\x82H\\x91\\x80C4v\\xa45**\\xdd\\x00\\xeb\\xb0\\xd5\\xc9\"\n    b\"LQ[r\\xeb\\x10\\xf1\\xfd\\x8f?\\x03\\xb4/J+%[\\xfc\\x9a\\xa9\\xe3\"\n)\nPUBLIC_KEY_X = 27753912938952041417634381842191885283234814940840273460372041880794577257268\nPUBLIC_KEY_Y = 53663045980837260634637807506183816949039230809110041985901491152185762425315\n\nMESSAGE = (\n    b\"\\xdfw\\xeb)\\t2R8\\xda5\\x02\\xadE\\xdd\\xce\\xd2\\xe0\\xb4\\xf1\\x81\\xe7\\xdf\"\n    b\":\\xce\\x82m\\xcf\\x99\\xf3o\\x9d\\xe6\\xfb\\xe4\\x98O\\x88\\xcfh\\xbe\\xfd\\xc2\"\n    b\"{\\xafm\\xb3\\xff\\xb4QR\\xffPu$\\xfc>A'\\x03t\\xc5\\xf9\\xd8\\xf3I,\\xaa\\\"*\"\n    b\"\\xd7q\\xfe\\xb7]\\x11\\xa9uB'd\\x89\\x03'3\\xb8/\\x80\\xa2#\\x00\\xa2\\xfe\"\n    b\"\\xff\\xae\\xb0\\x86\\xc1/ o\\xc8]?\\xa05L\\xff8\\x8az\\x92\\xc9\\xab\\x9fg0|\"\n    b'\\\\5\\x98\\xfaG\\x9b#\\xec\\x1a\\xc5\\x10\\xd6\\x08\\x9c:\\x01\"\\x0c\\x812O/i'\n    b'\\xc4WI\\x0c\\r\\xd8\\x81-m1_\\x14]$\\xf8\\x16\\xef\\x1e\\x1d\\xb0\"Q\\x1a\\xcf'\n    b'`R\\xae\\x0c\"r2\\x9a\\xa3\\xdb\\xc4W}<c\\xd8\\x0e\\xb5\\x96\\x99\\x87\\xdeU'\n    b\"\\x84\\x1a?No\\x10T\\xf8\\xb8\\xd3\\x18\\xa4\\xaf\"\n)\nSIGNATURE = (\n    b\"0E\\x02!\\x00\\xee$\\x1b\\x0e@fa\\xd4<\\x17)\\xa7\\n\\xd0\\xd7\\xef\\x90\\xcd\\x13\"\n    b\"\\xad`\\xc1\\x06[\\xe0\\x821\\x96\\xe29\\x80'\\x02 \\r\\x02\\x13\\xd2\\xaf?\\x92G\"\n    b\"\\x80&8\\x1cVz%2\\xb0\\x8a\\xd0l\\x0b4\\x9c~\\x93\\x18\\xad\\xe4J\\x9c-\\n\"\n)\nRECOVERABLE_SIGNATURE = (\n    b\"\\xee$\\x1b\\x0e@fa\\xd4<\\x17)\\xa7\\n\\xd0\\xd7\\xef\\x90\\xcd\\x13\"\n    b\"\\xad`\\xc1\\x06[\\xe0\\x821\\x96\\xe29\\x80'\\r\\x02\\x13\\xd2\\xaf?\"\n    b\"\\x92G\\x80&8\\x1cVz%2\\xb0\\x8a\\xd0l\\x0b4\\x9c~\\x93\\x18\\xad\"\n    b\"\\xe4J\\x9c-\\n\\x00\"\n)\n\nX_ONLY_PUBKEY = b\"Ncx\\x00\\xf1_'BV\\x9ac\\x0b\\xec)\\x0eH\\xdf\\xebc\\xa9\\\\\\x85\\x19:\\xf9L{B\\xe6\\x14\\xfe\\xa8\"\nX_ONLY_PUBKEY_INVALID = bytes(32)\n\n\n@pytest.fixture\ndef samples():\n    return {\n        \"MESSAGE\": MESSAGE,\n        \"PRIVATE_KEY_BYTES\": PRIVATE_KEY_BYTES,\n        \"PRIVATE_KEY_DER\": PRIVATE_KEY_DER,\n        \"PRIVATE_KEY_HEX\": PRIVATE_KEY_HEX,\n        \"PRIVATE_KEY_NUM\": PRIVATE_KEY_NUM,\n        \"PRIVATE_KEY_PEM\": PRIVATE_KEY_PEM,\n        \"PUBLIC_KEY_COMPRESSED\": PUBLIC_KEY_COMPRESSED,\n        \"PUBLIC_KEY_UNCOMPRESSED\": PUBLIC_KEY_UNCOMPRESSED,\n        \"PUBLIC_KEY_X\": PUBLIC_KEY_X,\n        \"PUBLIC_KEY_Y\": PUBLIC_KEY_Y,\n        \"SIGNATURE\": SIGNATURE,\n        \"RECOVERABLE_SIGNATURE\": RECOVERABLE_SIGNATURE,\n        \"X_ONLY_PUBKEY\": X_ONLY_PUBKEY,\n        \"X_ONLY_PUBKEY_INVALID\": X_ONLY_PUBKEY_INVALID,\n    }\n"
  },
  {
    "path": "tests/data/ecdsa_sig.json",
    "content": "{\n    \"vectors\": [\n        {\n            \"msg\": \"9e5755ec2f328cc8635a55415d0e9a09c2b6f2c9b0343c945fbbfe08247a4cbe\", \n            \"sig\": \"30440220132382ca59240c2e14ee7ff61d90fc63276325f4cbe8169fc53ade4a407c2fc802204d86fbe3bde6975dd5a91fdc95ad6544dcdf0dab206f02224ce7e2b151bd82ab01\", \n            \"privkey\": \"31a84594060e103f5a63eb742bd46cf5f5900d8406e2726dedfc61c7cf43ebad\"\n        }, \n        {\n            \"msg\": \"2d46a712699bae19a634563d74d04cc2da497b841456da270dccb75ac2f7c4e7\", \n            \"sig\": \"3045022100d80cf7abc9ab601373780cee3733d2cb5ff69ba1452ec2d2a058adf9645c13be0220011d1213b7d152f72fd8759b45276ba32d9c909602e5ec89550baf3aaa8ed95001\", \n            \"privkey\": \"7177f0d04c79fa0b8c91fe90c1cf1d44772d1fba6e5eb9b281a22cd3aafb51fe\"\n        }, \n        {\n            \"msg\": \"c94f4ec84be928017cbbb447d2ab5b5d4d69e5e5fd03da7eae4378a1b1c9c402\", \n            \"sig\": \"3045022100d0f5b740cbe3ee5b098d3c5afdefa61bb0797cb4e7b596afbd38174e1c653bb602200329e9f1a09632de477664814791ac31544e04715db68f4b02657ba35863e71101\", \n            \"privkey\": \"989e500d6b1397f2c5dcdf43c58ac2f14df753eb6089654e07ff946b3f84f3d5\"\n        }, \n        {\n            \"msg\": \"dfeb2092955572ce0695aa038f58df5499949e18f58785553c3e83343cd5eb93\", \n            \"sig\": \"30440220692c01edf8aeab271df3ed4e8d57a170f014f8f9d65031aac28b5e1840acfb5602205075f9d1fdbf5079ee052e5f3572d518b3594ef49582899ec44d065f71a5519201\", \n            \"privkey\": \"39dfc615f2b718397f6903b0c46c47c5687e97d3d2a5e1f2b200f459f7b1219b\"\n        }, \n        {\n            \"msg\": \"49e558d232ca204ecc27b321b197bfe0e165acd5fe46f986d5b007c68c2dcbd7\", \n            \"sig\": \"30440220330f62769e8e0fd43721029e1343b7f2c2575edc568007aa1b4458b2928dfc530220549c8967e8e8f414be10c6e2d36f451f1c50007c28511f9410fd7a921220190401\", \n            \"privkey\": \"1e17c938ef3754781130edcbe8fa2c8a27ecb43f93d333e64d89af3d9c26c23a\"\n        }, \n        {\n            \"msg\": \"12a683325e3063e4d9d32d38f878300d84d4ebb63247607dfb2bd72849e5fb14\", \n            \"sig\": \"3045022100f1391011657e358464165b53f0993a1a637f6e296c1a8f6a984d522b441b470602206c78004f1489c398aeb05b6db63d0839875f4751b117a6bd239b173428f1c2e201\", \n            \"privkey\": \"9120318c2d0792a29516b18a3467051445e5a6c358da577dcf06ea5ddfb8839f\"\n        }, \n        {\n            \"msg\": \"06e42f8adc7c2ac118b6e6d1082940c66f7d2544fa2eaae0d2b1d016fea26092\", \n            \"sig\": \"304402202c947ee0cf77bce3c4aab68737f07f9c43733a961552da82798a2628d6650a7c02205bb4a8634e8204bc3da98ddb1c5a7d7f5a2f4d60ee447e6e7ab20cff9dfdc5bc01\", \n            \"privkey\": \"a7433f154076cd9317e048562fe60529140a1155a1497ebd165b081c053e8944\"\n        }, \n        {\n            \"msg\": \"43307439480b2d4c3a95e725d1a13a97ec032cdbdda467533dce304513752d46\", \n            \"sig\": \"3045022100ac6123107cc08a63fb80e2af53937cf5aa7dee9f4e233a668d6c15d0b474903b02205bdcd30cae23c89692ee53badd610385b84567f98dc65babf000055f33877ac801\", \n            \"privkey\": \"58a127499af1fa4f6cc95d6b2213171762a3be0d929246f27044d64de24c4db2\"\n        }, \n        {\n            \"msg\": \"3a75a427f8311ae278b76bcce9a2ba99b9adc1ee91d653f9f00052b9e154b511\", \n            \"sig\": \"304402202f54a17ffa1b631f67232785b469d794969d3fdb140bb683ae8097217ec12c7d0220159f78ceece7e2fa1dea9e31f53374aebe6b8d893588c27e951bbc40b7ca57cf01\", \n            \"privkey\": \"17449f296f72790a85284a3eead10e775b452a32e7cdf1f0e68f109e5732d8a4\"\n        }, \n        {\n            \"msg\": \"d2ae97ae7b0b488f3a9cca6b7ed92832b4a6a7a3546a3ed9964eb51fbb2fcd98\", \n            \"sig\": \"3045022100c842a06f6818768fc3d93d98332affc7160fc2f58ba6fc0239c2c9cf951e6bc302202756c90464f85193a52a29001eaf824d3b0602028d4c8f5abadf6995262bc7e001\", \n            \"privkey\": \"229d075d7a48c5725f21e585e9effb08c80ea768883fc372ed3ad48af60a653d\"\n        }, \n        {\n            \"msg\": \"3492a279ef2ddfebc47cc7ee28be41b5ffc03c54b738f657862590237e56841b\", \n            \"sig\": \"30440220708aae22df437d7280fd8e06b9ab043abc26f6286973e94df9ae28982c534fa5022063724a156b0766c59fe75c571a5f47b80f313676f60830699b0f0c171841c32a01\", \n            \"privkey\": \"f2f83ccb7ecd11e6ef61a8a090890b6db56e87810be8f283626f6028843e70c2\"\n        }, \n        {\n            \"msg\": \"bab37255a348dcfd8864aa2bd1b964c951da28370743905f892bbf5533b2c881\", \n            \"sig\": \"3044022054cc561ced7052b9b0d709578e691e8e4edb04e2a38d1b79fbdbf16302674c6f022013c9ec89010fe1d9643019c7bb863abd618d4dd492c116d8fb099710e33f5b5101\", \n            \"privkey\": \"c476e1df4d6bc771b23836b58616ed5bb6417baaab3c533dd255562d41cce2df\"\n        }, \n        {\n            \"msg\": \"3543080c755844091a26bc812fefa40d00663f57622bdb63334ffbdd70ac8cfd\", \n            \"sig\": \"3044022066b520cb7f51656e610aefb238bfa5a62426953b22cc09689408429b68ff53f902205971ec48692210b050683f9ab2cd4443ade8a9d0ae3f95d32e865458515b8e4601\", \n            \"privkey\": \"e9fd9db20943a760c4cf89a9eb8aa150405686332c8a2ab8789ef19593312ac9\"\n        }, \n        {\n            \"msg\": \"aa05ef24738774890500e5d4f25f2801802a4c20f1be4f06721220d065abe042\", \n            \"sig\": \"3045022100d081a3dcc756f91b4c6aaaa5eb57c18ebe733086391c4a0761a9b11a43dd477002205cf7ce2565d977572dd10fc17875d07b2f8e3d824740db45a30f8977f57c7a1d01\", \n            \"privkey\": \"251e11bc1fdf9ce349c904af6f3df523e906e0367e18c96e111104715fbbfcbc\"\n        }, \n        {\n            \"msg\": \"57176b5966096a1818148936e1c56bea9717a7b9f4e3decf582b4ae3585e794d\", \n            \"sig\": \"304502210093a5c31daffcaa47b22a1f34dd969510acb76440879e91c51bb1b465fedfa6d302206edf49b1ad26bae5a1c179ae6913d3f3c3fcc0c5a3c7abec07d8adb315a0782a01\", \n            \"privkey\": \"099796458bffc713b89b1332089b093f8ed08039fa1d8323d7a8b198225d89d5\"\n        }, \n        {\n            \"msg\": \"8b339212a72cbea99b8e882e4ce7c32a1a1f0e5185d3c8e4b99c9a8ebfe58060\", \n            \"sig\": \"30440220640997e496194c03b7e56fe5b97a44bbad81df5a9c2501138453b86e3d1ad16a02201a1dd1ffdbe9300184b7b1ff7d0a1339dd677a081acc2208050e0dde313f515b01\", \n            \"privkey\": \"00417c436e3f135eb2292eb5d88cab40157b0989dc0d917ab6e87e8faa0f1ee5\"\n        }, \n        {\n            \"msg\": \"f1415142ca90a4f6d1f5c63dd0d776642e34bc3fe3a9ea1427afdf9d71d79231\", \n            \"sig\": \"304402202364525dea549ced7856a0551be97d73b1e5f20237e857cd0193f3aacaa6e1100220245974967a1f0a849a3aa7492f044c53fb10a0198c280caf075aad9beb80126401\", \n            \"privkey\": \"1d77dcd3d3631285c0a99a6c669d804fb603cc8a788c4568a46971b46718453a\"\n        }, \n        {\n            \"msg\": \"e5a093e9d225f09961f35f44b3171962b2ad3f9c859c3c21d0f03fc7dfadbd51\", \n            \"sig\": \"304402200d2a510384e4ec4d294150598e893ef97827c11c61a081cf694cf53e1c0dfcc102200eed9c0dbe6294f692ead6d729eddfe9267411d67a08031012c4b46230561bb701\", \n            \"privkey\": \"df693dfdca61122d2e633d2a2d8f4270a9199624d06f9230325d82708da5e9d2\"\n        }, \n        {\n            \"msg\": \"42f5f89f123967d7ecb0f0ffbac97d1e414d22f8aeea5f61ab18c67d9b05b062\", \n            \"sig\": \"3045022100a251fd56b0630c642143c05cc20fef8979163e85d8dd4413acf97c7f0b21832002206959532ff89b8515c5934f7dedef47c8ea1c3b0f3e1630f85445cc6989b8e61c01\", \n            \"privkey\": \"3e21112d32f27677d715c4f12d4005d551a5a523d7c63717f2166ebea89addc5\"\n        }, \n        {\n            \"msg\": \"f1914da938a0c2e8112c769591ee070ac4123b9c487c0ed7fab6b04473bf7714\", \n            \"sig\": \"3044022010c823ef2f6bb11e4a974723499be7a4fc9610da16229ae49e025525eca9088102203e3ae2173dcc83b754e39fbc88eb1b31effda488c1c9632572513146ed5c7dfe01\", \n            \"privkey\": \"ec3eaa66a6ef4b6c31acd75528218e702419bdf1c086431137926fe71daaaea0\"\n        }, \n        {\n            \"msg\": \"3cf9fb4cf59c6d37da6c36e0d680b1d364800e94b54f2b9074d755a456a0d7f4\", \n            \"sig\": \"3045022100cd40d40dbef9ac2e27f3c8d40a7f8dd538d417a7bfbcd0c00a6e92c93bcb145202205172d09504b59aeb6d2afc298441615665e4ec8fb7bf064a9364ac5f6ad2171201\", \n            \"privkey\": \"a51997dff0ae72ff3005ae6cad243a5d5c6864691d238fd58123bea364008009\"\n        }, \n        {\n            \"msg\": \"ada128dfd83338a8b0f5ead162a0fc7acaa513d5c13b9b1d5d921d2648e674f5\", \n            \"sig\": \"3044022075c1178f1bb941fdfa4fa4e21f056c5717a5a94247030c321ad51ac6d8a2a860022036759348c6e87c3b27388ba92895ccc6c7af659f57b4205a236bebccfe6f3e3f01\", \n            \"privkey\": \"9a8114c3bfe3656290a0d092bb80a9f5c67b3e938ba719424c5c8c83e13ce266\"\n        }, \n        {\n            \"msg\": \"d23cdc4accc2566b82fe6270e144f366f08007dffcf9e47c1c66d40708747da0\", \n            \"sig\": \"3045022100fbe82220345d27c870e152048698340e70d701ab868a5482a7cc22977962f8d4022009181b343e76c8645dc640762d49911df336941d79dedccba313ba03dd8c28b701\", \n            \"privkey\": \"f1d7fb29ab98d00f46135b74de1b7ea80f3e38360c9ee0cd7056404c5d1db57b\"\n        }, \n        {\n            \"msg\": \"e89e786443b5634afbe711f66530326320a0e5ec27d1c42697e5fbc11e5ce169\", \n            \"sig\": \"3045022100be23de4212c4bca5d1be2882ab339aa8a586dd656daae12aa2287cdfb2809af002200d460339847f0c08311a59343997d5e307136a4fc0494f84aacbbf918deb11ff01\", \n            \"privkey\": \"ab8f7d2eb73af6349990d2b4296d98432da8bbd858863bfa136e234a56351090\"\n        }, \n        {\n            \"msg\": \"ba7de66731341e48fca15ef5b62c88f19b2aee7786987d73754be8e339f706aa\", \n            \"sig\": \"304402202c2c1b9bee9b018df561d1f45ec07527ac916e8e56a915862cf80a4fe73779c8022037aff510509b3704390da0db4b647540647f897df5a211648f4180a292b12bca01\", \n            \"privkey\": \"d142f008e4ee702e6ddbf6f5429e4b39e0cd59034018a332635e6fab028f2fbe\"\n        }, \n        {\n            \"msg\": \"1ddaa971fd3b025d0566d9bf893a0043329379e2c52561ad3ebd3815bae0e818\", \n            \"sig\": \"30440220110aa7dfe50948e3a8ae149a01d9b3824e7274a6f380e64d8b189b01e71ebc4902207712465f4f09e039f46d06fa949ab5f875a0f612c86c76702c07a4007532122f01\", \n            \"privkey\": \"c03a06e7e3958f790f3d1bbd8c9938e3c1636301a04b15b2774d27381a383d35\"\n        }, \n        {\n            \"msg\": \"c5b4b2981c007f5e5b6aceb950985e64f8c5afec77955e973bc65f1a913ccd2d\", \n            \"sig\": \"3045022100d9f8081fc24e267dd5e2a70604277496c9c8a20b7c37f3d788e92e7356754b6e02207ffdafb0ba4efee3211a1d8e4623f13b63141054c942cd47e388faf3489bb8ff01\", \n            \"privkey\": \"795b50f2d308bf999565a084c8f709e6393f69a7842ce889c5addbd17c24ff5c\"\n        }, \n        {\n            \"msg\": \"1544d33544fa93334739a60a35bab4390b523bdbaa43ba3956ca450ad03f6201\", \n            \"sig\": \"304402204d74290c6daedc88e3fdae9edac89984065c2774ed69d90668544aacc6e7e16402201ec57cf928279f30d56d8e5a1a46cd976cc7117bf2d03c9123833f08db6132ee01\", \n            \"privkey\": \"fd2190d00de40b004f9a5d6d06829fe87eb1b11e483e94023fa01b41c27da90b\"\n        }, \n        {\n            \"msg\": \"cd40650b1d22d7a7777ac3a6d8701c12b485dd3859dacbaca56ad4ee4a3f6024\", \n            \"sig\": \"30450221008c17c93e1aa880c36c87ec08fe52ed68a96ee014a4cb8045fdd08a0537cdb602022045728db5a2bc1860cdf0767122e567f903a0de25f770d3a96b51833b2530e03e01\", \n            \"privkey\": \"3a6857669abb2d6f2f529b548f6386435856ebc98d8760e75642ff30a149454a\"\n        }, \n        {\n            \"msg\": \"5817d0ffe477cab901884793ce1e5d40302941ea7460a2b468b7b02f08203527\", \n            \"sig\": \"304402205ab83ee406a958901837e7f155fa8c043558963fcac8156515166bf5d008b21c022026e18000c7050b8d7415337b10eccef395db63c6fdd8b008d2b613ac2583e8d201\", \n            \"privkey\": \"9054a4c8279b1812748c690f7de4a8305e7ba2afa27bb30a70ec2be6cfdcd104\"\n        }, \n        {\n            \"msg\": \"082bca2d141957a5bcf2e6f0653557ddb12d0ef393d89c5c41849464cca6b8f3\", \n            \"sig\": \"3045022100d62ef631bc28d285f0ea2bde820c4edd321539e209c3575b139b4fa7fb571e35022015f47f15f24d40900ad13ddcf9809a4f8f45e8c1af2a241cd2641df02772809a01\", \n            \"privkey\": \"eb75f55fc51a5664c46889eb93af6834b8fc4760ffd12f36f2a7a54180765644\"\n        }, \n        {\n            \"msg\": \"58a7fca8920df4322b3118241aca431418796937f2dbb32bf36b2c230ac3ce78\", \n            \"sig\": \"3045022100efed6c4c4287746b5870de319fd0fd1e7f39cfe19771764eea8bcc2641bb87120220284f66abc53254d9fce663ecc1648d417251b246c1f72e2668e786d65b01db0a01\", \n            \"privkey\": \"9d6cc489b02c25d0a33f3e2c71dc90c71bb91942bea45d543f41907f026fdf94\"\n        }, \n        {\n            \"msg\": \"33cfeae00abc4f593d9499a7e11e314f9ead2bc6d033977d91fa13df224b56c4\", \n            \"sig\": \"304402205d51ef7d53b77f1e4933e38b72e60e2cb505f5c04c4589691c4afb66d45299b302202a9b34129c747c1a98dbbee519ccb8f45354cbe36b4e4bc6e9cb0079d8a8b0df01\", \n            \"privkey\": \"cdeee2375309bcb5cdf33d6e43f8949b3936a0bb776bb20b40087150c4eaaa9d\"\n        }, \n        {\n            \"msg\": \"789d7a8a926e65c632dd4ae279c23c7cbbe1938082000a4f7e663dae4d2e6565\", \n            \"sig\": \"3045022100c316f7d0f51e6ea313d2b03805d695ac4426f959d14d9138ef171deddf0e593702203a94ff889daed2b366a17d5b0bbbe46f96faa439f3e0bf3da3755f2313cfd9e501\", \n            \"privkey\": \"f22cce5bfc11406b3c2013be86cda5e5597a10c99f045af275aa5c4136ae8247\"\n        }, \n        {\n            \"msg\": \"cad973f4d052f59654c8b714e4c777c297217de855f7e72679ddc4d88353179a\", \n            \"sig\": \"30440220140c11ee563970fd34a31076fb92a81320bad49373682aab2d11ad0e9e71da5902202bc4a45f694e1a25b89e87b21b659afe87e83f57a53a2fe7a4160a93fab4331701\", \n            \"privkey\": \"9056b9aeb9b88e4b2d2cc34a3be77e6120551c9ec9991aeac46d75b3b07307ab\"\n        }, \n        {\n            \"msg\": \"08f3306ded0c07980fc8e008c6805fa19582a1c635f892d0027256b8f6e658ef\", \n            \"sig\": \"3045022100ea0f425a8f27a9fc82286ca7545207cfe0ca1e41d54ad3168836086bc097740b022027ede91105e79097d091efa8d3045ee9a2e250ee9029245560caa5b8bb5450fd01\", \n            \"privkey\": \"54f8d7d845453d60ee39167ea8c0b3203487eb9fd7f9aa83f8b92ee41799d3ac\"\n        }, \n        {\n            \"msg\": \"ab440f7e37a9ac189e08850866f9fec3fc2c323dc802f5cc13c9b2dd6ea9c366\", \n            \"sig\": \"30450221008e6a5185622e53f986c0f865b376b69cf7e2297b681c7b4baf92396808e90de90220633313c8afcb4bde5d1e099871e75df82245c9f2fe24bcdae86e53a48116f74001\", \n            \"privkey\": \"ee1eda8fc9d0cb958fa518d0b95189c7eb82202e6d07099b8a6a11106797af70\"\n        }, \n        {\n            \"msg\": \"c0d12e0b35fa92dd04ca66b9e9537a71c5683a4fe5da9354e9f74cec0746251e\", \n            \"sig\": \"304402201e78c59ad8c6ea7ea75735696271eca86851f7d65b2c6771eb5ebbae2c3a5c0a02203f0e9b34333f544e692f7ae92ef6ad68fc455099760944d3e074bc994f2da7bb01\", \n            \"privkey\": \"56983efa120cfd3a7fb92df780a60463decd5f47c6422c6dd0538a68d3c7bfec\"\n        }, \n        {\n            \"msg\": \"98f7eeb9417e950aa953c110b245adba213084db4bbd58978f2aac125ec2e584\", \n            \"sig\": \"3045022100ba311522b51cfceb11f8fadb34a79f5a75e7eb6b5878c907fb63c983feaf695402205b9e0910415722ce1bf94ac5b6c3bcb09919d3497999ecdde7de6fa76f3d00b301\", \n            \"privkey\": \"04dbf45e1b5620e3ca700a82e4e83a971551e25e15abfcf49c8a201a4174bb58\"\n        }, \n        {\n            \"msg\": \"2e18fcb984ba778c0017cdf882a862dfcadee1ba4c7ad44937006a7ee0ee90cb\", \n            \"sig\": \"3044022013ccb3f7845476ceea2b990d15ec53253f333ebc1cf392e96590d88aac70dff902202c4874427363f84ab7bf331d2a811d57399237d58fe0ceef34056f26bcd9de2501\", \n            \"privkey\": \"8bfb17789767931b9602e3a1310ae79ffbd5fe7fe1f2583099568a4308cb80c8\"\n        }, \n        {\n            \"msg\": \"d6fe1d5d5670b02f399ab0125c57fdaa181ae93aeea97c5ad238e0521dc10873\", \n            \"sig\": \"304402202d633a9bbdf3e486fbcd8dae7afb7b9604cf9a806d72121d08a95895d16db21202202f83e6d1c5d17d676885bc05660271770618acaccd35a30b1d3723176c1b395201\", \n            \"privkey\": \"e74ff299a3e399fc7833799b1591c128102d441361dc2ec77810d99abf280fae\"\n        }, \n        {\n            \"msg\": \"798a41c8bc899e458e9e07d3d83410752ea580020accae54a3ff65ebdf607f54\", \n            \"sig\": \"3045022100ac0d8bee62c3aa92ee6f29c98978a7e47d179f6954fb2b04b977489a2d24e7af022057808f4c12d8deb7737827a1543e88bbd44abbafb4d4db43e2b5a6566d0e821801\", \n            \"privkey\": \"cd4d9c04ec290aa6fe5cb0e34e3f585beaddcba4f39d883bcd0a7e989801a778\"\n        }, \n        {\n            \"msg\": \"1bafdf652c98542066d53aedf3b0fdd1d3517bc6fcb0155be621ed0032675a1a\", \n            \"sig\": \"304402204ffba8cc994840f5824b2217188bd0e671cc4b787ac33509c774a4075c62a989022041129edaee766692b1c8d9301974f6daeb7139d463bad561f650801f097b4b2601\", \n            \"privkey\": \"51385eadf7238fa581b13905b83ff1c59cb7923d2afdfe2b29396ec9da1f708e\"\n        }, \n        {\n            \"msg\": \"6fc96a01cf2e3ab6ab277cce670d446f0da3a25bc4344c02651cda1510bda8cc\", \n            \"sig\": \"30450221008bf5889acf97948be7bf6afd1da1504bab75d841c09e3e6cf1cc445da0ed5cd2022030cf8407f6aabdd056e1d4cc14b4a0e4ac09c6cb45f572788f5353fda223923701\", \n            \"privkey\": \"20dc42c28ec79d4b62d84e2be93945888178a0c29aa9b67cb1afa5e4ff4f1073\"\n        }, \n        {\n            \"msg\": \"524fc94cd49f7fb80b5d2a111d7fa9f9022b79f5368608dc5b50d1706e7e7fce\", \n            \"sig\": \"3045022100d391974a51503f4b8675328abdbeecc998b54bf6de23492f57631c15b8f7ef8a022075e1d215853ce491a0efb1b2ca60776142a26b1e8975158988569c2db2af87b601\", \n            \"privkey\": \"8cdfd627ab00b392e38c27ab8eaae73b202f306deea075815bec61a0d2cec7b2\"\n        }, \n        {\n            \"msg\": \"d2a53bebeaeb041272699990b027da459ca5badb811e4ad57b3445c56e5112d7\", \n            \"sig\": \"3045022100e2e221910d4ce1fbd7d489a4807a5d11e6fa45f35a997ea5583f8508a1faaf1102200d5fc4fa852eb1b26abfaf6799559a7165b4590707ac446019acf2d468712c1801\", \n            \"privkey\": \"021144fa085375c86c681cd021ad5ed3e7070503309745e97143194248dca839\"\n        }, \n        {\n            \"msg\": \"63446421e65a1fde302d32b962dcc75a2286b7c2f0491c25b3fb6f051b208dc4\", \n            \"sig\": \"304402200c792c52f28ffdcccda08d7875b3a62e665dbd65ffdd80b0767fefe7af88bcb102207780c849bbd193e805916fded694b89376136cc7b2b8567f52179fd10c64a48601\", \n            \"privkey\": \"dae1c4edd2a889f677615ba48e22e9144580360cb3c7094495579b3a4c17ee24\"\n        }, \n        {\n            \"msg\": \"53751b08cdfd84b6e7a72d9d32f8684efcec290ec4ff53e5d2b66d85fe1075e4\", \n            \"sig\": \"304402206fa2f2ec4f36d3b92f901d6d1935f6167752c13bce38fde71e1cccace629abe802201575d02c1f9599e19e72c1552a1e67c2b84d780bb663cfe26f0200f7857152ac01\", \n            \"privkey\": \"81560d6c8f7f56947e85c05a5bf58247972a91974dc886fda04557e42cf7aeb6\"\n        }, \n        {\n            \"msg\": \"a8f00b68747f932865b1e652495e2ee2b962d58ae65a803a83d5dd723b961195\", \n            \"sig\": \"30440220113a2d165fa751a5fbbd96032fe0ba55a9f7395c546c56460c74800206c7689d022037cf2dbd41bfca49004f603aa6476f9a2ead3c0e55f4fe437b4f968379b8951f01\", \n            \"privkey\": \"3648124d1c85eab5ab6a9e48377e1727d1da31b9dafe46844bdbda5381364b16\"\n        }, \n        {\n            \"msg\": \"c0c93d49025eba4dcc15427306e598ce42b2b301dfda34e8fc944a10cbdf827d\", \n            \"sig\": \"3045022100fc15d1c1a7ab3647c56aec5fa47f1d3d52d082fb797701e32278ecc0ae93dc3f022074bd65fb1164ce8f856dd8c0d5432bef396357302409ca101f02904b7b7fd44801\", \n            \"privkey\": \"5516f2b53a5e43cc284f074d8960a918e67afc6c0c6fb74246fefdf2ae55b0eb\"\n        }, \n        {\n            \"msg\": \"8cf263c83989fa23970f41b30fdaaf226792c0348d21da89d659bca19fd6d26c\", \n            \"sig\": \"3044022072a768ab0f2f878492d56153ee51b170deb652b6b2a8fe940ded965dd32e49180220300b9252ba85a611adb8827c315d47c2cc33627db9be8e283fdf09b527bd21f701\", \n            \"privkey\": \"467904e0c8850c5b84066e2c135096df2374e5a2066c0e94114b1d06eb98c454\"\n        }, \n        {\n            \"msg\": \"ab2e3da1e5a5f2acb51e00f7f8e6cda712882080f24bcd9ea43ca555577f3b30\", \n            \"sig\": \"3045022100b1e275667ba42709e6a6da1306df173728b032c42fe955e60721819d7ca77c2302201219d9db72e278fab11dbc80fd14191d2d37a13fb31338280cf2837d64e27b7c01\", \n            \"privkey\": \"6a7536d6733334e204ac5bfa2172c86f7446fd32cd7180027391087f98f18116\"\n        }, \n        {\n            \"msg\": \"6eba52cd7a8f859632b2b5e8a6ac69581ce266d82a6b010c7b666d3afd0e19df\", \n            \"sig\": \"3045022100fcaa0e84521f46c9a9dcff5da933c981fd2d0275c2cef76881243c6390077ba702207f7aefa9e2e9d2b27526a34c26bfa57b7cb2e22ddbd9ecd830e7cfaf81a7b10b01\", \n            \"privkey\": \"e814cd0bf690b780f8c615cc6f1202247b5218725e76eca315faf9b438c5e554\"\n        }, \n        {\n            \"msg\": \"85b07d8a8d4100a4302ca49cfde58266911ab1ad45368cf7451dbd9b6f45eb78\", \n            \"sig\": \"3045022100fe510f6954ac3f2fba233f109ec7a08dd93aa955336e47fe7b095f1d79cfe198022037925a771d139f2649a5665a3281b4a363ca96fef8843444f23f101400f247f001\", \n            \"privkey\": \"4f4587386955963eaaac84b32eefff63b32dfbb540bfb578ff7b0cf9f01298b1\"\n        }, \n        {\n            \"msg\": \"13063f26e50c5b6e62ea39fda446e3beaccf50ad07441241df62e3115f939552\", \n            \"sig\": \"3045022100d44570f08a9e64119d9885d73f688e51176807a4143856d06b684fff4a8ac2da02205f757d21c8c56258c63034d9b169c402889532493cab2c06c697154f44705a9a01\", \n            \"privkey\": \"b6b2e1edbcf892e41285f4ac942a331c4a88d785267c45c8095059c5914d3a98\"\n        }, \n        {\n            \"msg\": \"738516a95cdb7d1b374324ab22e642b3b23db43464d898e80789eccb25240e6d\", \n            \"sig\": \"30440220655630c6bef940bc7360febfc8e7a09614e871b7ad8c500ad658a6ba7f1669d502202ad85b78a32a10c28b2d581d7e364f6c2b7caacb24a61e31130f2fae5a951de701\", \n            \"privkey\": \"23bf641b12ea841b7a8386a2ff4f378c8d33218fd147906db34c64363f59c1ae\"\n        }, \n        {\n            \"msg\": \"2a7f44ec15c00e5c457c545a7bd27dcf38ad636cd98d48f0964496d3a01f781f\", \n            \"sig\": \"3044022059bfd164d817b91b94dba6c3843cc85d08442662a9f3736b12f294630f75578b022017f6dffcc2039291bcf0719281b2e599044a63709e94ab0050ebe37a2394933c01\", \n            \"privkey\": \"86b53e69d27fa695bf8217b0a78d72651584e24f1d85e928647310ecc04d33da\"\n        }, \n        {\n            \"msg\": \"865c6d42b0ca9767593c8736c8b5151753f9c0068c9c52eaaf4305a19e2ea559\", \n            \"sig\": \"304402202b995842e430ed36900761f11440116c4a0ca5c4702aecf293625e608011b3df0220051b45eacacb9448cadd96cf4daef05db8f41dddfcb1943cb8ed67ded4a8e9e901\", \n            \"privkey\": \"8ca07dc245d61105afc9b40e69bbd1532b65e72094f929c117c5a72b4b6ddd25\"\n        }, \n        {\n            \"msg\": \"5170ee5b8311f24570aa8a639e33c22c8f883e8d947548d47e1e330b965cc57d\", \n            \"sig\": \"3045022100d523659075fe10d9f6cc3e75cc74bf94ee65f4a099eabf7fe6dbe24bbc17f65c02204423cb40c94d732a8a51487b9e398fdca78005bdf1571b7126d67d9f50b712c901\", \n            \"privkey\": \"44e488036d994a53d6d62bd6e3201b7d61aac740157bc25ea41c7da37b5d6149\"\n        }, \n        {\n            \"msg\": \"29b9327f728c7107537475f99ac50f28e33ec0f68f4db619ff0f8e5b314935f5\", \n            \"sig\": \"3044022035bc811ac5054c04febe41208c422922750ac045acc1cacf2529666a7fb7e40d022071837d85c64cf07a1d598de345125306053c3c9014b408898dc5edd04dd919e401\", \n            \"privkey\": \"1dc87fae4276cdae8ffd67563e0f8539231582818b2e2226dbbe159c021e61a0\"\n        }, \n        {\n            \"msg\": \"99c751a334d1a3687432e87a34301beae87ec78aed2d48ce066f118b476a85b0\", \n            \"sig\": \"3045022100efcfddecdfbd8157fbe996563256efdc6f29955fab32edb3efed9cab08ef1dcb022067b01f720312ae64475eccb6381e1d3fa342cbcf2852b1ca6a53f5b1a6e16ff901\", \n            \"privkey\": \"6e9f1467ebbfa71faa565e02a8663fd138487dc9526e5d096cfbb2ad38883d22\"\n        }, \n        {\n            \"msg\": \"76bdddc10926a641df369a6179ad622c6188d3081a3cc90d8dec398c68ab7af6\", \n            \"sig\": \"304402204d275af1bcd7ad578aff98d8a1551a83584b8ee9b57ef6d425fd191426f6f63a02206cb25c37fff11029f8fa5c2b99d0aa5bbc5a5fc484c863a49ab4ab4479892b3201\", \n            \"privkey\": \"f64b62c51f2de8f4643857ba12f81a433764a3e0cd9fa2316b8e202cad9778bd\"\n        }, \n        {\n            \"msg\": \"f87a7e12df4d4a0ed99ec33e3ce805151526bdbced2bbcb0a012019a5cec7f99\", \n            \"sig\": \"3044022029fa907c4e4ba985b362c2e291291271c6acbbecaf4c49b938261ea6f255ddde02206cfc13e0dbc8d5ec4c98684fb36087738f9b449cb0bd9d930cda0025083543d201\", \n            \"privkey\": \"c21f2a248126a5b5d964d404911682ae1cbe7b7741681226867337dab8974fcb\"\n        }, \n        {\n            \"msg\": \"493f0c699d505325bfd1dd86e28d7bf94d698120dc10d475aa2547bfdcf5d66e\", \n            \"sig\": \"3045022100c716b0c65339df2357089c202f4644603c21d7139f2cd77336f871834c27150d02206ef0c8cad1605b3957a15695db5fada122b9a8b9b4c49743088e88f93112320101\", \n            \"privkey\": \"5a4b74a8e52b8f2dfd45c2ff015641be2b1f66fc285661de8fc65badbd6707f5\"\n        }, \n        {\n            \"msg\": \"82c5878eb438661cf7c50655890ed64c374611f3cef2e309a76565f745fc2c96\", \n            \"sig\": \"3044022030db6955679658577e9a7cac8f7081105a173647362178efa7c74bc813396b8102206836332abe41ab0e23e6f62b0aa08666dbe8228c5138638ed0c2351c22e6c57301\", \n            \"privkey\": \"aa6db6512e8b33be3543a46a908f26720402e3c15bd70ba8ebdfe7ab80787afc\"\n        }, \n        {\n            \"msg\": \"652c4068be47d9437d49d36173e095118367e1d9d0e86295604c0eb94484d5ea\", \n            \"sig\": \"3044022065c05eecb47346d6b45b588a90eb0f5489a23f93170557eb969f258adffabde902202682a1ab6397c49892e349ba581fd623033a35910c97f4079e4c2e505dfdb21f01\", \n            \"privkey\": \"ef0d812b85eec684b3314de835f73fc06c3c90078d404862133643c3347ebe15\"\n        }, \n        {\n            \"msg\": \"a04a3ee113f5d3054fd1eaacf8f3b1db506122c413ab346250e08ef6b5be8236\", \n            \"sig\": \"3045022100ff6927f3d0c14cfff2ac2c8b47b20ac99baa48ac72726aca35e87af7965725730220654333918dc7615a2e1f5b59af74a1565c281db62201c54befc6158222f8284f01\", \n            \"privkey\": \"b85e9ba6297a46fa4f017742485616c61ce5dbf080782ba1dd961933b7390e18\"\n        }, \n        {\n            \"msg\": \"428f1dde2440673a19d0b97fe46ece447721e61a700376cc56263e63cac5a3da\", \n            \"sig\": \"3044022070ebbfb49ab2d2529546115e55f8aabb7784bd38fa16eb6a5cc6ac7ccce2fce202206d9afb41c0254c2aa1ba4fe3a05be5d5c1297803adb701197c918609184c2cda01\", \n            \"privkey\": \"c17b6ff03bc75792c3a3b4ed5612140e2f9d9e5d6b21650701523665b3819b05\"\n        }, \n        {\n            \"msg\": \"ca0d05a273ef3b2782059307d838599eb027b0962798d71efc00648a5b07b744\", \n            \"sig\": \"30450221009c88cd669ab7743fc2f3ccde723fa8ef653f951f67abad5afe8031c6fa3652c4022012cf4d5d66bc0e9d40322489ceedce43bcad5fb41cbf92a6ea0f387c4b3b214f01\", \n            \"privkey\": \"c658044aab784be15a5776d2c4346e1099368a45f06853277352d70823ea7572\"\n        }, \n        {\n            \"msg\": \"f6f4aa6943deafc1879c00589208656e927422b5f25cc9526a9fa6139c66613c\", \n            \"sig\": \"304402205325ccf115446eef902499ead3734d02065dfd337d924ca615f5d00b1580ef8b02205285496cb0cb63e8ccebf4ff999c922bc3bb5d4a4eb3267fa2c5608e6d0b5b1301\", \n            \"privkey\": \"480989d814f56895a0c5781497adb1ab82744c009815f00362321dcdb709f036\"\n        }, \n        {\n            \"msg\": \"f5747a05e3488bd03da4210f9233131e1983f9e969d23330b3858a6c71f5c484\", \n            \"sig\": \"30450221009e81de985b1bad7843c72cfb6ee2a30295f13ffb7e1c3b10ddd505cd5d6feb6d02203389442e24b7027466eeebf44a9390ff8f9832716544a4f508574fa919b4848701\", \n            \"privkey\": \"db1e27ec5686db0d8a2b7c609847652067534751944f610bc7ba9f3792e92fda\"\n        }, \n        {\n            \"msg\": \"ee0a83c20ff143b6629bd9599b5beb2e63384be72a53221c3263bb83efde8647\", \n            \"sig\": \"3044022063f2d7f32985641841f7c218e7a90add74b82e76004eb349d9e122162a574d7c022070e4793900af91b659030179ef46db54f478d74a31b31dd527af0952c49d461f01\", \n            \"privkey\": \"88624e28090c22fa80888c3f15000bd52da334c7b295587773a172aa95bffe2c\"\n        }, \n        {\n            \"msg\": \"80aaab2aba272c8ccb67022ae9a54bbfaf8443bb37d2f922021a681bc4252a90\", \n            \"sig\": \"304402204457849658bacecab40c4893021d2e567fc86f1c2ed2b20d9f1982138f7f00450220225b04c91531470606088263b28b3df2cccc5a9f1df36130d8960343ed89e13c01\", \n            \"privkey\": \"ac461d001fce26e7f75fd82fb910e839d6e92bca1db3969fd78e74674d3a6bff\"\n        }, \n        {\n            \"msg\": \"285b0f5cc3c35deb52d5e1f5fe6e7c5a82a0c3ae10249c39c4b81307bbc9a1df\", \n            \"sig\": \"304402205eed90c7c43c9dced57edcce95ae69e5babadaff58f033055d998e4df596121702201e47072efa39405f2920b240b56d3ee41c0b1c2adbef1f161c8da1e7eda6fbde01\", \n            \"privkey\": \"786f5c06867cc7e8a6b16c003ad6809da46851a8e3024527e93af60b1ff70a07\"\n        }, \n        {\n            \"msg\": \"d615006da4b6aeb980bc12f769e263821890003123b1d2439c69da2cecbe51bc\", \n            \"sig\": \"3045022100e13137464625b65c0403b71a3ff57b42da0f5d35be2384da2a4f52e93d8039b302207ae93812fb1aeffaf60c39b0096b39f2fd73bf2e695be8bddea458a2bd55b89101\", \n            \"privkey\": \"226140d24cc86b64a1c2aadc77bc8b05552386da2d707668b3c460f69d70108b\"\n        }, \n        {\n            \"msg\": \"0c26d76afb90e2fe6a8c4b2a9d2496e2a6e27f25380885f7985d8c1ab7d2dda6\", \n            \"sig\": \"304402207dfd5a172204356d4dbffe018b04cd6c123a48daf9b9fc201cf7e32088989b11022030217c1dce7e1d039ac011138569c4c897fd201694b10052a1f3ecb2aade3a7901\", \n            \"privkey\": \"1e807394e21a0412d2d48711c0be3685a49fa3810ff84517b5adb1189ebc452e\"\n        }, \n        {\n            \"msg\": \"ae93855f5897620269b0fbb6f2444fabf304c570c2bc3d1342aa3b0615ad5b70\", \n            \"sig\": \"3045022100bd83f85e36346c428909a60eddd7b1c52abfaf662cab6fc810e0fc398371f83d02207caafa58dceabf7176c2e3b8a8890e47b9c1cddd1cf000ba428a91c396932c7301\", \n            \"privkey\": \"c8d382437c63d3debc2844e00c7eea0e0f400b111e805ba32695de93fc150a65\"\n        }, \n        {\n            \"msg\": \"b9df3eba9ad579c1840fab29448186122ae27c9add5b5fd6c8a2c7556e0fda8c\", \n            \"sig\": \"30450221008bded4f87ee25852e45908397876b3601c6a0e177dc986bc43f52c5e25fe5d9a02205473929f0502abfc9ae0da25086b13d92e0ee4f1e1c9fcaf334fb4623048dbe101\", \n            \"privkey\": \"54a92b44ea83313d0779475a1e664ad132abc53dfd8e4742ef81d01b3ef657e5\"\n        }, \n        {\n            \"msg\": \"f304cff5f74fc72bddb353ecb5d1a250848ca764ace690cc308d00b247577226\", \n            \"sig\": \"3045022100c1f9fc9a63f0d26677bfd68687dd0e56a6342bc536a71c9b1f3a2bbd2a48360e022040a3f3179228bb89b82ebb648073e713cb759c1cb7d4e4f5486c29945d5c55e501\", \n            \"privkey\": \"b59821f0dba07cf87f0bcfb4310c6ab4e676ca319fc6c0d9d11ae80be8a0468b\"\n        }, \n        {\n            \"msg\": \"77ba3ec6b8fa5c2b8f6e4bfab18b2b51ecc94586a41a1dd80290665913412266\", \n            \"sig\": \"304402205d9fb1e3c6ea1b18849cbb2666ba5d5c67bffa78d6952e7b0f009226db6eac85022043cecaab697ed0684d53b497ac61ae614477ccc153c87f938e5a3302bb70d59f01\", \n            \"privkey\": \"a62d04ca999d3b5311f317edec9418fbb065805872b25dcf69c088ad7d3b9d11\"\n        }, \n        {\n            \"msg\": \"63c7a73d7d35dd73b94d23b446bde100dc15e3544222b9c7e6c9d0be84b1f5d6\", \n            \"sig\": \"30450221008043f2ee24182f28ecfc6c53cc3a51ae6da4ab902ca4dbcbcc629f3480b9a97c022052e44edd783f81cae9bcbf4e7185da17a82c09894bc44b0405392aa00000f85901\", \n            \"privkey\": \"57b66d323c278d6aa3799db509d1909da6d7f69385b2627f8785712777f8236d\"\n        }, \n        {\n            \"msg\": \"2ce5f3aff72b0867bc0b7c286dd49f011f65eb563a93cafef5d554ef3d9c1488\", \n            \"sig\": \"304402206b1cacf8fcc9e813f421f88ec8541c04de7f00430e1332829ded5ff73f218835022055b9da3bc1de4ed413f35765529c1df9d5b9b8e8ba1fbc7507c6e8fd747b191601\", \n            \"privkey\": \"81db6a86b8e6d840a97da1969d5ccb9b9eb4f9d36f6e59df65bcd42b9f3ef12b\"\n        }, \n        {\n            \"msg\": \"475ab4796a2038629a3b9f43a14d5a2c86467bc1e32ba654e87ba67ff99d2890\", \n            \"sig\": \"304402207d3375beafa30381e9ec3b32b0ab819d67c7f63c61df796993085ed9f61a1a100220050e89b744e94e4d7301701d602886a39e0529740c24f6a0f8bed0d91cc01ed501\", \n            \"privkey\": \"8b51025a732cd22a179591598414b66bc370295c1d35284f706d468de4684dda\"\n        }, \n        {\n            \"msg\": \"af1a72105095a243242132ad24085c444fc78bce26de4421467266d248536b87\", \n            \"sig\": \"3044022025accec34080896b7ef072474e0096fc58ae84bd73f045027007925dbb7fb5e002205602c0a5cce0b4d9e10a3009f9dca9d2599b694b6ef0e7c4360b08d35fbd607001\", \n            \"privkey\": \"5f0cc5d1b7996f0187a0e1c709981dc6dc944e92f908367eebd82f1babd2ea63\"\n        }, \n        {\n            \"msg\": \"029b0efbdf0374c6a23593cd7c6917a9404b9fa43ed32428a82be05bc7f2fc3a\", \n            \"sig\": \"304402205fee5f55838ab4f7f7551b64ed346565f64dd5b42e2694d7c372233db2fae37d0220026e8f5d54af25529d7ca1a4991a1385e7ea3ea9fb37db826d81aa32b0aeadbd01\", \n            \"privkey\": \"b7906b63b11eeeb3f69586b7a8323aab9f4dd51c157f813d24f8e34407eb5c18\"\n        }, \n        {\n            \"msg\": \"9db7ee956f52eba9fbfabcf840d9c107117a00f5e2874eeb54a91025951d2ea9\", \n            \"sig\": \"304402201fed017ec208e65cca442552269487cd15961c2603f6aa19fd035491cd4fa09602200d0c5c9ac89dd501c34f3b7403a82832f58153bb77d070c44fd8f9396dd0c2b401\", \n            \"privkey\": \"3e89238cb4a7de25f833f4b3cd3374cd5687d9cbb858de906a570818e14031db\"\n        }, \n        {\n            \"msg\": \"b502771c17443b8835fd6582fb2b44512b66f9bbe92dbed5e710b76fe35bcc56\", \n            \"sig\": \"3045022100a424be7d1cad14f52a4bc99736635e3130dceff4f9321dc3eec31915a99d365202202c573a3a8d2d24a79ae70ea15e32e0a79819406edcf54bcbae4d49ff87512c8001\", \n            \"privkey\": \"6a4aa42e630ede3342539fae35f43c6fa02c94c634753adcc2130de76e62dafe\"\n        }, \n        {\n            \"msg\": \"5c66cbe4059db5bc8046fc393266d2db410a81ec2a02ecae0368aa0eb35d68c6\", \n            \"sig\": \"304302204203bed95a0e92b6a4b6776551e01473b891487b051824cf707ca553b40972c7021f64f496fab45d743ffa95a520a7a6f5e98c49379e69f0b8a7dbeb98b576215001\", \n            \"privkey\": \"d7e3eb80f852de183837573ad3aef624e16e8302f7d0d4b4d5ff4abf9063e438\"\n        }, \n        {\n            \"msg\": \"12e16733960b2c7d5de1f06b824094bd116ee9ed83b680233298be7cead86741\", \n            \"sig\": \"304502210091d303cb2e80690531645c79743cdb29906fe6119023844b8c66c81d39c9e299022021e6614ab44c6da7bba1d7de4b37871cfaea7a76df43bb5b90ffc6f61fa7e86f01\", \n            \"privkey\": \"0686905b967248099704688e15d8e3eeeeb58ff24a06e8c7a0e17b534a4714f9\"\n        }, \n        {\n            \"msg\": \"2309bde84fa5fd4ed530fa7ba01af3dbb71e7967df1792a53b13bfa8225dca77\", \n            \"sig\": \"3045022100e8f17e0c541518d5eaa7ddfe24d7caec497783da37b7605522039024bcb835a2022075d5ef13cef091ebb861006299cac29fa762c2d635b3be798649633e4d8e0cf301\", \n            \"privkey\": \"4ded96d9315bf52be4ef30a2295d76a3c6a997a331555bebb5012491b6d315a5\"\n        }, \n        {\n            \"msg\": \"1453bb7e9be2757cfac795c751dcac6ea24a1a597d8ec4b5c0131142a985e17e\", \n            \"sig\": \"304402201a686a1eca60be4ec2d95f22765af2afe91a6493ae70dee9ec0ab8915792c02a022071aa6f6f48f2c04e1a56e116eca35cb36866595561cd10e75bfdaf7f08f2af2e01\", \n            \"privkey\": \"6d9ed1aae9dc352667d4feb5e3f41f51da9ef9eb56a58b2497d502779680ac4a\"\n        }, \n        {\n            \"msg\": \"863f7f5d7f0619816d65ef3eac2121c9d3b3a6980b044074652f99c70abf539d\", \n            \"sig\": \"304402200fcb08df78fd9aa098d627f6683faaf6535cb4452ac075a228ee72a3e5cdb16b02206936c264990abb530ab705249e564bb4bfa7227edbb71c5686387f7d82ec251501\", \n            \"privkey\": \"34f87676d627e5ce30cec37ca8b7add7b30e82f3e510b8ebac31fcedcabdb22a\"\n        }, \n        {\n            \"msg\": \"9d3469873f54a1c26498eaffa9fc7c49644664cc4b25297fefc1b1b8429f6674\", \n            \"sig\": \"304402206735289ce27cf7e55251526382a07eb9e4a132971834082002d4464faf012c1602204a6c9b451f9ad560bd5c10561a551f33b712d553dd209b5e9f12fec46c2ef9f201\", \n            \"privkey\": \"8b4bf88a79deedef116259d5dcc331e4e566c04f1581c2ce0d02e6e2f15b1ce0\"\n        }, \n        {\n            \"msg\": \"f479dd8ca6bef32889a4a0159462eb2b56e387b6ad15f8ae0b09e1f489d49cb3\", \n            \"sig\": \"3044022046df345f1bacaee73ab2157bcbe6e1b333d2abbe5cce53fb5a50f81c952caead022071ef3cab8a146da86366c1f79ccc7edc76bc630ab0e30956305ae041b908be7701\", \n            \"privkey\": \"d3259f9685535af057328f4b4aba66311fa654da96b01a4161749f12d27fdf60\"\n        }, \n        {\n            \"msg\": \"9b4ecdd6c6fd1a43ba3cdbf534a8eb0159d0216ccbff47c3e41665776f00aeba\", \n            \"sig\": \"3045022100e7f0b77b9f767b6cfcf33ecf00a5dde22fc7fb46f87a3289f09501dfd889a0360220645639cfb7bcf062d3bc62a81c27c79d6909758f2ee37b08032b2351988a7b5601\", \n            \"privkey\": \"3a6f3397de4bedee3cce0568298f039d97ef8f4ea1d3d136e6c857cc3cf477a4\"\n        }, \n        {\n            \"msg\": \"bc64a2216423e642a30a0f1d790f3cec68b71f06618494723541d3c778237c5e\", \n            \"sig\": \"3045022100f85ea06b50d834109e5a0cb1e4f506e86cddb875867a9c3b28b48b1ae086589c02206e875f5abce1a66c30cb082243dbd9ceca233ccfc758cf91bd16cbf08648f98501\", \n            \"privkey\": \"3783268c39a70a6ba824e2adbaa07cb11f94b39b63cc3e8d53cf3603042c5fd3\"\n        }, \n        {\n            \"msg\": \"3962c385ea39d4df584dc1d9b93c1424bce2bef2aebff1a26dc7ed181e57ca50\", \n            \"sig\": \"3044022043d17ebe7a376f79dd2ecd1b745548d9633e5c7871dd521f922af941c7ad47cb02203190a04501956eb66840ff7f7af13fb492e51b59ac981a6ae9e43fb06552365401\", \n            \"privkey\": \"c26e9a48223b3a3966495620a14db81803ffb6f3b3a69932b72b65f52b46ca80\"\n        }, \n        {\n            \"msg\": \"f87d0fe24e507120efd2d10aeed2905131d296d50e688684d1bb847e68c02bef\", \n            \"sig\": \"3045022100fe995bc6c1bc4e6f60fd8054baa3685cb09344fb83b18496f0a74da81a4ca46d02203ae1bed24bee86d68bad7501091593c5db3442b6f21fe02445ff14a0574d98af01\", \n            \"privkey\": \"53dc1c26dcbcd6220e7329e5d12fcf17d838b9f8936333b03d0abed3cfd3ac2d\"\n        }, \n        {\n            \"msg\": \"62d97d2a26ab35d9e2d18e4335f7e45665a712eb65a1b2da9c2824339c4f9780\", \n            \"sig\": \"3045022100e8542c42cb929f670c2c7e5faf2b46ff9a02852704e91e1a79097610476ed4f302206d9aa52a7b886fb4062a87ffb587e54c0c2a5a7ed1c12dcf112123e1b827b51401\", \n            \"privkey\": \"6742a01cbff6a2e83a4f68a338c6f0c0995f6cac6e842c6f06de8337fc679f19\"\n        }, \n        {\n            \"msg\": \"364f0f3c7f17aab5567cb6ab0d9a364a59ad8ff294a006eb89193396618ff58e\", \n            \"sig\": \"3045022100ec728047c10274e6c1f3ee2404a9bfb5d58beebed4ed7d0c80901926a2c5caa4022027f1905073e6730963b440c22e150504b47ae4b02b10dde1aa2177a169a80c9a01\", \n            \"privkey\": \"f2415dd427697296d40dfc72084df1249b04d33cedbc880df1d9a6c88917dd9d\"\n        }, \n        {\n            \"msg\": \"d0080a4d6d945980321e346feefa6d8056cde94b974210dc2064837d8f47ebaf\", \n            \"sig\": \"3045022100a81edb49b4d7544d27a5cd7e112b4caf58898cb83d76740934c151e79566f97802200156257235e64803ad6b15ee58d0eb7a103fbe1f6ea024fc25420db1d4b22b5b01\", \n            \"privkey\": \"a7ba1b4480cf766d833940311d8a8c59a22d761858443412a94aa3407e330c16\"\n        }, \n        {\n            \"msg\": \"f09feb58a0f48e1678434d3995d12185a9d340baf3d19902a4680a532456cd20\", \n            \"sig\": \"3045022100df54f5a3f4791b77107c11ac15b0ed7ac59cdc8a46234031f16317d1dfba946402203d768943db33aa775d86000428699ac45e683d9d0b4b5ecd47b99ec7c548709601\", \n            \"privkey\": \"ecc32707de9576a9e91fa013190253e12ef780a5d30a0b0806da2ac05678eb6e\"\n        }, \n        {\n            \"msg\": \"2e8e25a6cf4c689b3560007bbe26a3df37dbf0eb5562c68b8efcb42fd5760f1b\", \n            \"sig\": \"304402206d2f9b5b37afa234eabc8e9905f7094c56cb936b038abce5166a0e35b82ff9ad02206e0060d1b784e880f517a5d8607c77a82e93d6dab3c3b0ceffbd9e632ed3c78d01\", \n            \"privkey\": \"bd42ee836125cdb5cc41ef767933be53fd374924441c4ef829b18c88ae1340f8\"\n        }, \n        {\n            \"msg\": \"5d659bd8337e119afa182ead19ef91f5d2f4dc6f5849e8fc56b4e6045204679a\", \n            \"sig\": \"304402203ebb171ab9732a29344b2c5474f46068a7466c6db0694ce2935bb85f5a6cb57602201b80113965c0670f3b0065b0c3a527b89a4c328865362767d8fdd6d5c97258a201\", \n            \"privkey\": \"17324fd463b6990e89218846d24f13813e415ac8c29faa2c6e7b2a6169e32e8c\"\n        }, \n        {\n            \"msg\": \"1cb65e2253db80412c92e092db5864c2074fae2e0800ee213b4ee82d69d639d4\", \n            \"sig\": \"304402205c216ab6a7cb4bb9d33360999d2e00ac6b7c6e956150db10865ba8fcb87cda90022064fceefaee8c40a8f5ed8cee478d45d0e5da1aa15d29e103d1cfda7748f8160101\", \n            \"privkey\": \"5edd47eb6580ae11bf3a148e01ed28a94d6a7912621707408da31ce4c541f46c\"\n        }, \n        {\n            \"msg\": \"5ad8d22c2e648851a09d74f1f47d2f116b51e4cb662a7f6b217f609f6d578901\", \n            \"sig\": \"304402203c151a74e81770d564b18efbb895f0df2f4d225d8e215e671b5fa44b43b098f70220540f560d75456eef77ba2e52848326624ec76ae7edff7b2199b822d78e62a0b601\", \n            \"privkey\": \"0a2804f109b57c7768f1d034112ecf46c705c6bf01b68c24220ff80e332e1023\"\n        }, \n        {\n            \"msg\": \"53c82bb675afbb5f6ceea4f6b3bdb777cca87f9f27fca9c688432b69b80a8d9a\", \n            \"sig\": \"3045022100f49e0096e15d8d2183240fc3013fb71696aed95977d9788e1f6b99394006f0b502203d01efe4296b409db81a4e6cd601a7440859249339ca7c3a62188537802b488201\", \n            \"privkey\": \"9d0b7120991d0910765b1dd563a787ab9ed51afdab8fb6c214fa3c6d6e32a08f\"\n        }, \n        {\n            \"msg\": \"51ba637c78e753468782866a8eac39fed07f10e2e38946ae0ce7a9a087aeabc4\", \n            \"sig\": \"304402202067df8cec2b427a98fb7e0ec60715a4512102b74b651c9600a5b4883a0e5a2e02200daf8fb6d240f12f6a7afb2e9cb138160e16009498e49c8fc8f7f198dd1eda5001\", \n            \"privkey\": \"a73b76b643651ce1211f0f98ab19050a3aed4774f9ca2521249581c3b505817c\"\n        }, \n        {\n            \"msg\": \"5aa29ded6e2f76817a66fd97d28838a35b61bcb4f04bd7c9418f99786d9b67ff\", \n            \"sig\": \"304402205c5b3b02b9e0d50e2c5abe23cb046dcbb541b37f90c06bdad2d8a25bb91eaf050220346cf30343afa33695e160d2e8a66fa98fb2f8eaec1816178caadc223f93720701\", \n            \"privkey\": \"c9b796aa7aaebafcf3e7a2ab52b2dcc59acb926ded580c85ac95fb7333922c71\"\n        }, \n        {\n            \"msg\": \"e79b7d427349690bd001f4bf0a3fcb61a9a62f710dd7b84fa04a9ac8621dae22\", \n            \"sig\": \"304502210081a3126be36cef173363ac2b3d157e6b12ae905ebe0cc76bedece1f4451f2fed022046896d45d55e8698f6b628e930b09e230a778075e1c2ca5e1c61e75347eedc1e01\", \n            \"privkey\": \"a79e2a1d32fdec5d2425af329680cc7e466f37b559fe54a9414f383e0c02ce3e\"\n        }, \n        {\n            \"msg\": \"116eb6113b0e918e4590d9c0b6e335da67ca3c4e9ff65abf11655a8eea47e4f0\", \n            \"sig\": \"304502210094626b44fd9475c5f1300bdb3f66227371b42bf169ba0d75a9c5babd37ffc946022052b21f0bd6053814b76532320360c4ad93c0b856f4c80f43a4ff7757b3870a1f01\", \n            \"privkey\": \"326117f45d2e6e19c287813c7ad10e40be40d543951c9e81ce2547cb887e1308\"\n        }, \n        {\n            \"msg\": \"1c354d127988b843c7e73cc55767272a6ef7290b13ae90651202ce51653a9aa3\", \n            \"sig\": \"304402202fc5e5f3ad67a0b9515b0afe1f8e76b829ec604f112045cb34ccda7876f9f1110220090627218a60f449af87bc4703d8bdf226e502775d17fcc05ca86bbf125650c901\", \n            \"privkey\": \"7bb2bb79141834fc87df40d66db087c943613dba9ae64f44a7b6a78f4116df72\"\n        }, \n        {\n            \"msg\": \"f30ebdd3c9d82677fa3a1666c091d9edfb9a73bc44ad4e9addd8de7fe9216459\", \n            \"sig\": \"30450221009f649d2f5269d5bcc3636c5f7115952b93babbbcd679a746b7fc62d5b7645e9f02200e6fb9d63f00275f9fcfc91441e0110482a6931ae683d5b92cce9663a50b0d0801\", \n            \"privkey\": \"39884d1f793eb949ce5bb07dd1b045e5024904eca7845f2e2a682b3bd716f1a2\"\n        }, \n        {\n            \"msg\": \"a1c2b956c8d16378f8b37ba5a6507a39b2019f4920cea9e0fd8954535017d929\", \n            \"sig\": \"3045022100bd7cfc17f329f5248a3e90884ff27f6e43989b6955f0235027d633c80d414cba02205f465341ce8cdac4b3dbd3aed639816a883b3e10ec0c42dd00dc8151a8afe6b401\", \n            \"privkey\": \"7a214c6fe5a723dfa73db996d223a67e58f83f3b835bd054798f993146d962c1\"\n        }, \n        {\n            \"msg\": \"2a0425e8362bde896e2ea09a1228359e62911e8f9710e80918f26a74f0952cf0\", \n            \"sig\": \"3045022100c1f17cbe35264ec7643ecb9e9d9eb96251ff7fc627d288c5b9987a0907de33f1022005484896418729326860e8abeacfc7ac511f163e766510ae8f17df56f188558f01\", \n            \"privkey\": \"529e409a353f09bfec047cad40cc74c8990680498f30269b2869b1804b47410c\"\n        }, \n        {\n            \"msg\": \"dfe1ae0090ae3a721a001dbd9b3e33ceb4028c887b74b2b9557609229184a8c4\", \n            \"sig\": \"3044022002bebdab55b43bbeefc4c92fbcb0c8ec6462a63f80cf6b5b5876e2e8ece24a2f022006e667ab416bfa3c9052565a5199f16f4c68e9aaac3e5b20d52ae1286e8eaf9c01\", \n            \"privkey\": \"d2fc0076b87e6aee2852492a7092a49f80dd7a4fba43b1119ca23a0d5833f870\"\n        }, \n        {\n            \"msg\": \"a0fd53dafe53e8362b26116ec475e58da990cf7cf68c81c5bb643dd98e3952fb\", \n            \"sig\": \"304402205419be40e45705c8ede1de4aa194bea70c5aec160aa3ff0b7b897135097437da022076729f0571e5ab1c2a76d0f768103be8fe8170863f7501ead08d50fc5037b26b01\", \n            \"privkey\": \"68260c731196804f1f6a5325c0ea3fa6d8fb1b9964db1ea41f3add37dc65d31f\"\n        }, \n        {\n            \"msg\": \"4d23d02f8c91ec285631c4084bb6dfff6d8a96bfaf78ec3fe5f48ef25b4e911e\", \n            \"sig\": \"304402201ad146e7601eae64f06689dc5bebe1e5fa8f4dc0aaa1dda72659153b1db8ff4102204b5b3f639231a567c5c839f6c804febf9558403f553b6d1acdbb602aa790a0e701\", \n            \"privkey\": \"f48fca4688a9d6f522f345cfda72b847191b77ec891d39f54c422c0b0a4ad528\"\n        }, \n        {\n            \"msg\": \"88155ae33b918ecf6bafc7f24fe75b9de573e0f7217fda91fd2ca6b33c51ba0b\", \n            \"sig\": \"304402206af1fadaddf318e5cc6ea0d630c966a9aa6fdcfa1c51188dd18a30a5ce9292d702207b53272a1a29f92d9cc335005a9777a6352de56541694b42c3610f8287f3688e01\", \n            \"privkey\": \"31b614dbfa8820d15fa932946142ccf1e1f12c9dd57a6a7547e4fd80c5e418c5\"\n        }, \n        {\n            \"msg\": \"4dd10d1a99d91fa5677cff8285b8f1bc8c3e3addf2c45c4d7d5b3c7ed75f6970\", \n            \"sig\": \"30450221008f930b4e25f295f3c5a5e87fc0ec52bb915b96dacf2130be56540a6683d7a17802207b9f7eb912a8eca3990a6e192f01c072287f63202fbfcae20688117d30cc1a8f01\", \n            \"privkey\": \"db8b58e63fffcac3fc0b3d475059738d4c4f549ff3f0944bb9695353efb799a1\"\n        }, \n        {\n            \"msg\": \"925a060c837b7732e411d6dd6323c09f8cb8b2245b7855a51ec095f17828b953\", \n            \"sig\": \"3045022100e687b57e41c22c2f78aa75f000410bfddc852469e32352ce5e759a81c14ebe1702204ec924703af322348b6f06fd62567e689258988fe9928ab8987bbf25ca8a164301\", \n            \"privkey\": \"08c1df65ddd6405219f2f20c905693477db910566cbefc1fa3a53593c14d1157\"\n        }, \n        {\n            \"msg\": \"16ba4a02006bd0764558a71601542408b5dce7839ed91fdd3c229d37afd5cb66\", \n            \"sig\": \"3045022100eeec3696d777d1d4cc658ef6236356e32a92cee32670dc566e5ee28df32fe6f80220558c75df7de5286d89f7cdc7de3e1cb8d45aa73f34a05dad48e1079685813f2001\", \n            \"privkey\": \"c82829e681cc6cb6f124b4e1a0ea68d9aa063cf64be68fc95f6ccd095d97cf90\"\n        }, \n        {\n            \"msg\": \"977394a3cdb1151a226393902e9d4003b63678bbb4f67d784e45cbff6831a611\", \n            \"sig\": \"3045022100d3023f62a83b3d7a252fc7ddeb3072f1dd9c25b0c604f1c68959f22b9266186f02207e4d9f9ab40bd5fde9e55b42b05324d54bfd307a1b5c32a35ae2ce26ca8f1ce401\", \n            \"privkey\": \"1aabaf1d2953ff2b5f3f5ce80d5ab318bc31cad97eeb0fbf0f126b21b720c4ec\"\n        }, \n        {\n            \"msg\": \"0c9ebc4b38648729b33d86a001308c099b020e2cd2c989b82e9316b3687bc7fd\", \n            \"sig\": \"304402203aad8e8efb5721c59456d5121512db983672342dd2945f5666389f4fcef37d61022005b9a0d5ffd84e309ac186e91ceab6c5ffdb10afbde94f2c7fa904a1c241204901\", \n            \"privkey\": \"60f77c61b9fc3e3fdfbafb33a97d5da172c7223db73a22e8c19d8aee8e6bf8dd\"\n        }, \n        {\n            \"msg\": \"e672cf35e5b186843607321255beb9a626e9b16582ffe6cba68251cfa2d26edd\", \n            \"sig\": \"304402207a84304fa4d6521840d6e1b9582602a12574c1dba1f7088221748d08839e6101022076773ff0fb876865a3318f939e0f07721034e6886f6a9afe9546543df238e59401\", \n            \"privkey\": \"64e7e1a9a9e7b80cb5dae781b9d4060ac5129a2bb254076bc1bf1b3b5d0b6068\"\n        }, \n        {\n            \"msg\": \"7972a81012267be81555aac3644b4d6aac91061717ed33552b3cbbb5825151e4\", \n            \"sig\": \"3045022100f67a1f761743f7abf3ba3e0f0097e93579fc45cdba95476e5f5b9d8155ebc11402202984c12e518f5a6b3c59e248bf2660f9b4313f6030cf0b10a5bde3125aca1aad01\", \n            \"privkey\": \"af681d1431a137ca2ccfd9456123af2a50901826985d1b4d46ac33fe7439a0d6\"\n        }, \n        {\n            \"msg\": \"2884813390313e6832156ad2b86050d04dbfc3a810c1adb38a4ccfc3031db3e9\", \n            \"sig\": \"30450221009fc5d7058df747afb88e47dd18a9d8d73949b1af1ac4a7f4324b7e6d5ff499b602206e353305f58dfb727062bafd7dfe797c9f3071230f3780f5875d331bd99fbe5301\", \n            \"privkey\": \"c6904733a3f4a8786d04eb725ac9d7814ec66c667ee7f56d7e9c1d39c7a06d0a\"\n        }, \n        {\n            \"msg\": \"17dd2ab0e67376ec6dcfccaed832a5a154710034818a78498b2987a9453d61a5\", \n            \"sig\": \"3045022100d2c15d6611c1bde642076edf2b89fa2e1062c99c866935d4b7eca979a0ea63a10220624da519888c2316c265b554281b327d471eb98cf8c3fb72a7c7dbee22553edc01\", \n            \"privkey\": \"493a3a53de5389e4c75092732be209d2716b93795add2210f6a1460c92fe238f\"\n        }, \n        {\n            \"msg\": \"bf0bfaa0d35c77239d0c98b900c5dc4efdca9a83eaa0c1fc4c7a8d50c5136384\", \n            \"sig\": \"3044022032f05dc70f0b08a5b586732f377928ae5edaddf7d58d3cabf0e262d768db47cf02206faf588d1682554be1773f11fc52b0101aaad3acdedddce71ceb2cd4d0ed46f801\", \n            \"privkey\": \"649306bf872e1626d8531d655a38e4ed7c455af514dc9a90dd1bc434223a2e70\"\n        }, \n        {\n            \"msg\": \"eb73158bcf51a0d754baaf7e68c20c385185644acb701cf9d54fd41487f83709\", \n            \"sig\": \"3045022100beec086b0341c966e02014c7576b7d0d0ae007489bdece567fa64de4b810a09902203cbc3e4f414f766c4653c53f52272ab2b87c88d49d8be05bd2810bf67f4a9f0f01\", \n            \"privkey\": \"0548d0c8d32215ac696d32ae2f28c785d86d68433345fd83e6101b7bdbcd7199\"\n        }, \n        {\n            \"msg\": \"8558f4a0e8714bb6fe788d0a0c1e4bf5622eee75a163118dd312dd0bf12bc971\", \n            \"sig\": \"304502210093fb277d192b50368665826384f3f537917b4ab9122e3826c9039e45871fab380220745c193fa30a2a582be64072a71f8476e1ec8ee374424689f0656b24fb1c002d01\", \n            \"privkey\": \"303b41d5ba88eab108428fcdacb335ea96929989372069ae4cd27e692ffb3955\"\n        }, \n        {\n            \"msg\": \"727402055ed837f5eaf1329ac81082929aee22abe2246c6dcb483ee8c31b580a\", \n            \"sig\": \"30440220181a4a02b57b3223808dbde211d2cbb502f9d66c31975ae9f94cea26dddd5e0602204e6eaa65344ea524c207429647a27fefb4eb967c403c080e46877f61d22eb4fc01\", \n            \"privkey\": \"982e3cae8f991b965b44541243e2e9de3122c8faf05718ea7fa5ef00b4098220\"\n        }, \n        {\n            \"msg\": \"29a4c44b4d8a4d920fec9368f0dfbde2d245eeab89016af90e7019ef6e020f91\", \n            \"sig\": \"3044022038abb43bc0a1f4bda4d0dcd9e13d983a24e8c4b299dca06d61459fc56edb39fb02207fd3e3e37fa318907ee41222ec7cd4ce085b35c64dec1d8c6b61424306db50e601\", \n            \"privkey\": \"fc85d8dd8c854dbf7ec922c6124c654aebb61263b0572ff922beb523a743654f\"\n        }, \n        {\n            \"msg\": \"6f15ebe59374436bd4d6b1ddc7a2a016679ad682f077a8a096db0ac0f159229e\", \n            \"sig\": \"3045022100aa23abb03621b4834084e2372c8aa571b125a4e897d7a8b3690890e7cae22f08022021a5534de67162c0e02f946f49f72ea1cabc753395b80cbbfec117c2b253cc0f01\", \n            \"privkey\": \"c5fbec66e7c8b8d37e3dc65aec3ce66321983e87a7f48022e6d67f23f133fd2b\"\n        }, \n        {\n            \"msg\": \"08854040e59a06d8fa647274c751e69980a53045c7e10dac29e6c1f2293f8096\", \n            \"sig\": \"3045022100fafb9d2b34ae5a6efba997e865c34ac02402bdd1eacd4e51859e35ed16f73832022044bf0182a26d15905c672bae0dfb1ddd21264795947b591507f786541faba37301\", \n            \"privkey\": \"86410a06d6053dd75d05ab51e3a08608018bb7d70c14199ecbf0167cf459a3cc\"\n        }, \n        {\n            \"msg\": \"66d7220679b951b05ceee33cafa9490de8669514790200a5f86409722ffd5a23\", \n            \"sig\": \"3045022100cfad593cc4e424ccc6b7dcc8d576eb34d837ff3862ced984e61b3c0031ea11b4022034dc395f1c4cf1d84f074f45e4583ad15b94ebd74366f138d6b3228ac1cc1a2901\", \n            \"privkey\": \"148d9ae3cd5de9347b0ef76dd49022c416e05cab1d3e9f91de0bffabd9728aa3\"\n        }, \n        {\n            \"msg\": \"16d5f60b487f97c54ca4931e1804ff5e7f31b1a7546b90a515780b6aae66c67b\", \n            \"sig\": \"304402202eaa80e56f1fb665cb995bf12e4ad161e275c59a13930a78a1c8b990b2b40711022070603f86e4dbc0b89bfe02aa941bc901a2de2d880253f641c83c0fd6e59988ea01\", \n            \"privkey\": \"00b1ecd81941a3fbafe4420b9e96c36f40cb5067ccd0c128dcb40c4f9d508e68\"\n        }, \n        {\n            \"msg\": \"efe532630bef5f6404ab56e4329a08800c5f2ee06743b58c5c69bf47e78b27a5\", \n            \"sig\": \"30450221008807c44f387e9db50eea548928c1129308cf501f3bbe3fc1a4cabc400e57ab64022062d127baac5aa2d1fe08404b7ce8984a8fe1bdef50efd41eac5ee28b3d0e5ff301\", \n            \"privkey\": \"fb2ea5631dbc89764f2f592de36f1e087a313461f44c70fb231b0ef7928143c1\"\n        }, \n        {\n            \"msg\": \"02ceba7e7cfa451c9af56995c36f77252b3ec4a653bbc41ac94ea2751e8e7a07\", \n            \"sig\": \"304402200b028943013a0fdd47eba1117b89bc838a269ab923ffb3adfb125fdf971c7737022050f416497dc081b223c50349fea72a4cfec33c588474ea6dc9d7823076de856901\", \n            \"privkey\": \"35ce2144bc6e3fd449cc57516f2e0f63a9878a592ed1b6cce21c3de85d98d3af\"\n        }, \n        {\n            \"msg\": \"038decd7e8ecf898206c4af77fc8a6342d5b543a60f121685715319a6de3d947\", \n            \"sig\": \"304402201046959b39f101a68880dcd8958cd2908d228bc115988691d1cbc3f7bf5090a702202c2a82c6504ac301223d33608f7e9314825355b4e0907e6d7a965d8a90b14f5c01\", \n            \"privkey\": \"d71f018138fa752798132a8393f81f32c474bd60cecda2aa1baeb5a4b00e86e4\"\n        }, \n        {\n            \"msg\": \"517398a39596dea9899429688afe62c49ff2265f177b32ea452fab47ac57928e\", \n            \"sig\": \"3044022041c9adb3aa577da5f6a4ec2237bc7ade73b0f1db122a4ed3152fd53723067dd10220774bf2d35837da21ad6073330449ef969b3f28d1cf3ed8e35664e75d0257855b01\", \n            \"privkey\": \"533b93438ceccd4d12401e86b6810200211dcdeefec130410fd978814a8e76ac\"\n        }, \n        {\n            \"msg\": \"eb18410a53353de79a56a86f95ed94f7cc8efb20c7662f6acd1d0cb46dec6729\", \n            \"sig\": \"304402203beff0b6d06157a96bd48d84b70b2c8d5e4be1e60c358db05bab94c7b03685fb02205a3c07368ad539c0edff9ffc35f4d44cab663fbb3cb03f8e466929b5c9efd5c401\", \n            \"privkey\": \"5d006eeabbadd13ffcac0944381081f6f0dd7b3564fa5e9e0c0b2c8418d1ca52\"\n        }, \n        {\n            \"msg\": \"c886d6c0d4e62bd8c65c1d3319b32a82dcc4fb5780896c287f3bfac415a768ed\", \n            \"sig\": \"3044022068541ffbaab7dfdc9dd0d2a8e0d8d3a7e1acae685bceac3f1a0a19b61bdb9bf20220544d24dad0c195d0d57d2dbac2d22b328eb118da055f0e741b4346931a66de1c01\", \n            \"privkey\": \"c0d837694699e53ed82bf4fedfe7e8cf70dc02dbcad884c3b822b3ef6ddc5a19\"\n        }, \n        {\n            \"msg\": \"826f8c6ab61ed5928a1d6d9cd6d69082ec9f9e45c4e73f2121bf061ca1d88a87\", \n            \"sig\": \"3045022100e1d3b83cf96d324fb9bf2ac9096c70758799bf330104edcbf6c16ba672e8968d02206a9a826cf32840db5f2ddf887e819eb8f41d14e8be2e94aa0e7f064d96a4d21701\", \n            \"privkey\": \"3f523b03447d06bfa64fc78db115c7e5828739f38ba39663095309ae6051c092\"\n        }, \n        {\n            \"msg\": \"da71ad31c818c04ce018937d33a2428be6d4199af6e24f01b83f26212e3cb186\", \n            \"sig\": \"3044022000a0856075820b29361a83fb332c190048ad5f4a81f9b993765e5c76b6de462302200433ebf787caebb7d549fc93636e7e79b347a97fd56826f75adb69af01654efe01\", \n            \"privkey\": \"c235de75530efcf7c8bf08e3b3b69c13d5a306364172617f61c20d2d02d4b768\"\n        }, \n        {\n            \"msg\": \"de8f24d7924433bb1868e48a92aa49020c464140c1c69d36f8268b38798b1171\", \n            \"sig\": \"3045022100fbcc16baf92400595a5df863680c76388ff152e4e6ca3efb26d041f6126b51db022069c8c6ba124306ac55a3f5b5b95988fc45166aced7265d9fffdec77113cf572201\", \n            \"privkey\": \"231913cd2deed9aa0483d2a23719d9dc7a9354518ce5eea88f4d2de219891888\"\n        }, \n        {\n            \"msg\": \"3f87a3f5199d729f5683d90b1977e1403afab944a8a107abe8aeab1c2bbc4710\", \n            \"sig\": \"304402200e816369dc132b4331713cc481258cbe9a4526a767aeed50dd9c00d3cd5f321602200a592715b5538fe25713a179334dc0e275b710f74f16e11c599b79d397f1d01e01\", \n            \"privkey\": \"5b274ede3c80bcee4d5c1cf02f5b9f76adb95667a0369418370aa81530c28064\"\n        }, \n        {\n            \"msg\": \"12bb4666adc2cede1826b582085caed6fb64438a5462f74010eea04b4f2fb5fb\", \n            \"sig\": \"30450221008258561ae898aa8e689b6a8a878704020d1025d7ae835985eaac27a555996627022006bdaec9eaea8dc2eefcd197e1a10828e26f9114c394d1f2d161cfcc7e3d1cd401\", \n            \"privkey\": \"4fc83d5a7155af0810791a6db59e307295f0897682a1a6b958fd699f3ef9cb53\"\n        }, \n        {\n            \"msg\": \"1ac99db7e7ef6ee4af2016dd0c71b2a6d2995c1a2029c13959ddea0a4af1e839\", \n            \"sig\": \"30440220110722d507a7da0dc7a520ce7efe0e1fb42790c00ee8d565e0c7c8c4292cbcea0220267ae97ea9a2b1ef08239553cef818f625ed1e3e87ef766e8b6063f21a9daf9901\", \n            \"privkey\": \"f1fcd239bad3e3ef1483e10f3753283b88df5b8603f9bab20d66e00e81cef441\"\n        }, \n        {\n            \"msg\": \"b5d1b36d95311a86e450f507a0dea0805eaefb68c89f222d8a3d4761e5619b9d\", \n            \"sig\": \"3044022053a91f2c657aed63d265aa6249b3c0db90844210d828980b6ddf885b4e98b0840220325ba1809427c15527da92751f4fbe6e56230533ad7afccd91a244ff7c25ecb901\", \n            \"privkey\": \"ae74253a454718f1c08b4bc3b9673e2b084b1cd0b4c3bbc324da8329d5bced7c\"\n        }, \n        {\n            \"msg\": \"fb710ffc70334a93c4052be5e229875f55aa3f3067e6c493d53f115e39ba387a\", \n            \"sig\": \"304502210099b8afbdecefb8e2b5a3e2acdb7fb28da7d7f24c6ed6eb88e43c423b67954ebf022050050a3e69fbdfa91fa16d9ad669720c65b2fabe7e011ecab9336e92d18be19401\", \n            \"privkey\": \"40e53957385d806936ffba31637c7bcbc353616d896b6cda0e20d56e16baabaa\"\n        }, \n        {\n            \"msg\": \"b27b1bbaf48f7d3c38ce061542054b2fb19cce7a40a779253ece58169caa6efb\", \n            \"sig\": \"30450221009fccc94220c12ef508bfbe9a0d1a592875272e4213bdb78baa290d5a01054b1a02204101988977098b835b4b1ceff4e6af9925a92b7f879718a60340083679bbb63401\", \n            \"privkey\": \"67ff6b87850ab1fc1f8f7c0ddc606610fedd027e926fbed60f280abd2972a440\"\n        }, \n        {\n            \"msg\": \"433955be0f609ee6685e49229652c1311b6141f4b85a4f018e2f9b2ac49a4b54\", \n            \"sig\": \"304402202ccf1a22e503d11bad88fb90da3a5b3547397de3f125b86334ead3497fcd1ca302207065bdd03323de65b784384926fb26f637094774837b8368f59a191cf50b6f9101\", \n            \"privkey\": \"7befa50da27667bc46825f960dec45e461940da6a2267d8da6ce4b04bf4888c4\"\n        }, \n        {\n            \"msg\": \"577650e585efa3b2c2aa04f5c561306524178f0643c9208ec7034923a6949492\", \n            \"sig\": \"30450221008b75fcfac6277b160a555bbbb2dcb477c2509967946edfb0106f8d142fa1543c0220442de5a96c7e8f670398164a4380b97f8066304c62f5f7fef8b86e05941e94d301\", \n            \"privkey\": \"8cfe9d574c49070e41fc473352c4029547bba2299a2a61770fedb87d32de2edd\"\n        }, \n        {\n            \"msg\": \"a2fc75d302dadb11fc4bce7bafeb90406b9a367e368d0cb7a885e0b96d695fa6\", \n            \"sig\": \"30450221009ab4c7be6d7bebfbb9bdafa5abd628c8874b56872d77d04171209e692128b7ba022048f66d9206126e8a2a48a8cacb44dc7a6a660d04998b3f6d07d88481e4f230b301\", \n            \"privkey\": \"a1ab7d29541f45b96ccb881522f7dd45901765ac1160ebbabc50e2947b8853ef\"\n        }, \n        {\n            \"msg\": \"9acd7c5fedc120d69095eb7ce77684aae974cf7b48cfc806baece4dd812d560a\", \n            \"sig\": \"3045022100e8fb2e2817d7f481e059ccee51e8449f550f1488634ac012811aece52e5e23d502203d8d06125a037af6e32c0a0cd7032dbc12c7ca84f5d3952afb58857685c68fad01\", \n            \"privkey\": \"e2bccf63d91102cd90d519b18463ecdf41378c9f9b0e1d5a1ed58a837be11afa\"\n        }, \n        {\n            \"msg\": \"23ecbc3ed373e19e84d3d8e6420613d6e759b3e5d606e6ba9700234beaa7ae8d\", \n            \"sig\": \"3044022013b03a0a39a56f9241b21ee74acf83d93b5b6a81bcf254f7558648e686fc300e022065a5999b37b2fd7294f853b5c312cbf62c12a1db58f0d95041e7b7dd157cce7f01\", \n            \"privkey\": \"61dc64fb0590b9615bd5f381b0a301316857dd32f0b214c2e814f35e5fe956f2\"\n        }, \n        {\n            \"msg\": \"aea4c1124be7afa6c25af9f542b79997370ff6cd870e185a20c7be78c9c24b84\", \n            \"sig\": \"3045022100adac0cbb49e7d492b9f877a5f842860e0cbbce99fb4592558dee58f8e3cc44a4022074caa58d7edf18f2ed5c436930a5b8dd3a48a6024aa2c038b2f56c1187ab28b201\", \n            \"privkey\": \"0b31aea8e0af9a18f02e9cd4e06530e9ec9c4cab1e6a3bd52fdca5183617fc66\"\n        }, \n        {\n            \"msg\": \"f793e37b0dc14ffae24d6e5a3477aaf23cc3bba1ca939ccd0c4a4bc3f1943e68\", \n            \"sig\": \"304402200096eeb7256f916c256ae3884df5416bfac00143bcfb46a501cc0eee45ee432602200ba266f42639556de6a0f7c9f0bc2ee14d80cc035965c7fad9bd57c04826684601\", \n            \"privkey\": \"3fe28fcb15f00c93c5d628b4ae942beb2fb73e5f2c28f05dfd98998824c115c9\"\n        }, \n        {\n            \"msg\": \"85e774c6574ca6ae8f30af0ba108bbc487835a6ab9b9d7e00d17f1e710b3bde1\", \n            \"sig\": \"3045022100bb5a0cfb531d6bf5b817c1f6a17db02e7b592111a2a572a6ee4bf31e9de1ccd402202afab1acafd825fb8a51d801cb20564c67fa42a33afa5d7526f0d9f57535b5da01\", \n            \"privkey\": \"3902f9706403006e3fbc35d12b06fc78670509aa50b552544d708ab5dc5f5b79\"\n        }, \n        {\n            \"msg\": \"671db247e553158156e7c670136e9fd299a9d1fc33c394ee593752b0a1cc1f03\", \n            \"sig\": \"304402206d9f228584074ab3eafccffe240a1fbb448e8125836461da7423def37313aa1802205d076e6066caab751e95323be6761215e2fc5b69f2c9392b571e66a8f12ce2cb01\", \n            \"privkey\": \"2bc7499a1da26f836ed93be9834f9cfef1120e9512f3bc90c6d57c3ce366c58d\"\n        }, \n        {\n            \"msg\": \"d069674f48c2038bbb0dadcb18a9b18795eb71cc16cb34e91b4cbca86aec61d2\", \n            \"sig\": \"3045022100d1260fdebd27eed66d577b77a1f299cc42ac137227aa7730e2035077b71161da02204a8522a2f2eb8cc78e7ea11ad56f463f7d8f08c6e4e9a7db0cec3ad6779ff38d01\", \n            \"privkey\": \"0fc62bc36495f5f9b0d23145d0ee1983c29f822c7c60e22239959c13acec8da9\"\n        }, \n        {\n            \"msg\": \"e9a4c69779c44c72858e580297452f3ed488849a0cf204d75de42e591844f008\", \n            \"sig\": \"3045022100849c6e7b4d66ac63540a2784620c43ac1b558f7a1432237965949be3624af1d10220674f15f7779e4f0677f4c4cf66f85a5f7ca6a8b966f17c05ac1dd38e4664f0d801\", \n            \"privkey\": \"1229ade4f8919c0e61a5221c6cc37e7a2da7dcfc22eaf6d58b8e995d38a830c0\"\n        }, \n        {\n            \"msg\": \"183b7c41bb27526528ba72277a92ff7d39241539f6616f024e4389e76696db65\", \n            \"sig\": \"3045022100ba80e06c2a798b0dc206eb44b99703a31536ccc930eb0500a043f241aec21d1702200ce955a1627c9a073f8f49072afd5aa289e544bc90e5983b093c06c5c67e51a201\", \n            \"privkey\": \"08ece7a61cc766fee43dce42570d418d7509d63cc293a15e2292bef473e5c49a\"\n        }, \n        {\n            \"msg\": \"a119183cedb4d2385c204482f6f6aad863947f4dc336810a2cd494d73a7d63e6\", \n            \"sig\": \"3045022100bd8fe449160c9ec8029bb6f554f225fa985db131e2a7f56cda04d48d7133f8c10220060a2e95874ffddee22ce3e1a47bf15360922c73fb7c2a9ffe267447bbbd24d301\", \n            \"privkey\": \"70ea418b73f35a4d5fa241c97661be9e88d4e773478fc9ad59602e0d18d7499b\"\n        }, \n        {\n            \"msg\": \"e53804e86688bfb3e2d7a72d9a07d0b76c8d043472a70375f04bc26e5175d380\", \n            \"sig\": \"3044022076927896b56154a8eec11decbe729aa0a2543979cb388ceee3570b35e511e1ff0220730367ce5443b1522e61d990b5f0fe7c3e14d62fecf141d189da51285a65938e01\", \n            \"privkey\": \"4d2da431e0b77707cf388cc9d44f067d3fb82a3e544a436c2c94abfd0bd1a8eb\"\n        }, \n        {\n            \"msg\": \"c0a7969a9bd9689925f5b801e3937772fce4c20a238acf58e6baa4ddd68f958e\", \n            \"sig\": \"30440220700c5e64229194d774b222c34e436673c69aa8f1c9a18865895c05fccd02bf3a0220384b60122c477d03bc5ecfae58908dfc195dd94f09ae7e2eb18e14d54314982901\", \n            \"privkey\": \"7253a7b52381bce33b2502dd8026c6c242f66d75dbef89c6e47e8983a373941e\"\n        }, \n        {\n            \"msg\": \"d767a2f44d17543cb9833a4f5aa792f12064bcb1b7882feedd014cb9aeaba94c\", \n            \"sig\": \"3045022100d6cbcf05a476a5e05b92acf93c2ed41c97af666fc03f9a45e797af67f6f6eaf302202485861dd6538828e6ef0fe17f4e41c25053f4a2f28b017e181c0f364b44867f01\", \n            \"privkey\": \"90fb55d3cd1b87138b2983581f5f65efd7dc444c06438f492621e99311840805\"\n        }, \n        {\n            \"msg\": \"47d6db6d8e2a9aae31ade5ae2b1ae6ed17c25b7b74be25fbb6ea590046cf2d97\", \n            \"sig\": \"3044022054d1dd346604659a1ae9905a375f52124c066938bdd19200aa6598fe3cda676202202671b0da6d94702269909d2481347c328d789d052ff43b6821686fa65117627101\", \n            \"privkey\": \"cdcf9bb9730b0b88669876bc0692393a5dabaa75f78ca68372098a81374dee4e\"\n        }, \n        {\n            \"msg\": \"3e54cafef15a961d757071aee94b690280aad8201af7582aa81fafb64b748527\", \n            \"sig\": \"304402200e9cd509a33cc07318ac8e8c61c6e35a4825361bf255b47996ac6a6c45252a98022071092aee8df6e329303b5483c2e8fc6292b51df5e48ebef6548f043c11ad298201\", \n            \"privkey\": \"3b829c6c16002db5ba3323ac1ca6745cd1f6d1f67eb9c8f5f11b48df08d3fa75\"\n        }, \n        {\n            \"msg\": \"ff7482425542c945e2b83931583e2f516682dd24b2bac632ce00b0bf95f3764a\", \n            \"sig\": \"304402204ac0df04b0b83d87938c7d9591095acdcb6e0c6edaeb99a0ea40a1951f77470102201a40cd8a308c3a752cfb8c3741d6fec79b410a6bc4a3c64c4c377ea5b9bfddbe01\", \n            \"privkey\": \"1c1d11ed9739251c3e065db25ac10fd6413a54d8f9e553be3c67f4eb86bbdb08\"\n        }, \n        {\n            \"msg\": \"b5c1a15c2c219f845d5253f64947d49f94519a57aa484b6005517e0a8f933a58\", \n            \"sig\": \"3045022100c17a386ef1263ce5c1816e17504ccf8cbcdaf5f09ba00f141099c990ce2cc30002201d64bf0ad8da6d1b3fa02191145c19a94fb1011865933c2a8aaec4728fa5e06501\", \n            \"privkey\": \"df972b1d45f99fd4dbcb5e7354d6292b56b4a0f25f6432f9e1d7a318eecb2120\"\n        }, \n        {\n            \"msg\": \"bd15aac26ece339e81248e364dcc66dcbaadd6bac3f94047d161f0e71f44758c\", \n            \"sig\": \"30440220035a4c4bb28381cb4ed4f6f5714cb34bab019339299212fcc86ae90f83725ea502204f63ae13c03dc80e320b4274f9bd403f4966fde7c89c21328264a6305ee8c42701\", \n            \"privkey\": \"66eaec33187b285b3c604973aaacab3ae8d383a075dfd996c4cc3ac4cd16d0fd\"\n        }, \n        {\n            \"msg\": \"85fc198a649ee134d2116a2e0b189faf1a4d15c3afbb182033032f9ac322e1bd\", \n            \"sig\": \"3045022100aa128e5391a4bec3181d4a2127bd45fb38bc142993c967af8d7de33e90e3c03e022034eef4d80133c0002671027d55a1e10eaa12cd7e24f62d037077d1dd0e90775801\", \n            \"privkey\": \"5a6331ff79f2930f95df8a4747cdf56b0475eeae453af8da9257982f68fe66f4\"\n        }, \n        {\n            \"msg\": \"8b66547716aee0c7bcce9bc93051bd2babbcefaaed51a94605506f6ab6492744\", \n            \"sig\": \"3045022100bdadcc9d82b6bce0d4c453001e06481ba48b92ea2a8ed81b9186ceb247a6bb1e022005b30ff42cb05defa923dc09a9727eea67cbbaf1b5e5b561ea4d854b67e8208001\", \n            \"privkey\": \"994f92698ef865cc782429f13e47040ece8b95a2d6dc30fd8c6a9188db655668\"\n        }, \n        {\n            \"msg\": \"54fe0067ad6b4c7f4314802d40ab01896237015a466439d35ae986d81a6e5dbf\", \n            \"sig\": \"304402207b4f7d5bd15f520aabc9dabda7b8e73c660f10cca48c7e8ab5533a69137badc702204cd239932e7932d768bd65b55da2147ac527e61567f45bb14a953b0338211d3701\", \n            \"privkey\": \"21664545b76332766ec8959baedc77b7c842379d4400ce7f5f30417e5a1760e1\"\n        }, \n        {\n            \"msg\": \"438bafa3b8dbead8b2eeac1b9fd6527b9510d56d5bc09a2ae2a51b67e64ea8a9\", \n            \"sig\": \"30450221009d3fa71c0f2f7b015fff020316c81476930ed4d4f6fe3fdc348cae358d70206302202e2e69d6ca559ee5eea309b72c13bf22c643660e27cc7799d99bc807a28fbe3401\", \n            \"privkey\": \"dba5a15df6ef7b060b7e9a4ee819a431bd2c3146430e5d90b15c8c7f34fc5d9f\"\n        }, \n        {\n            \"msg\": \"2560b38e6a265f413fd762a88c4c492d46270b007e18cc844feb1dc06429a110\", \n            \"sig\": \"30440220361980512e7d7f6da1b37fb225c336801092d9ed05cf72b7723d7205de1b2baa02205cdf459c367d1f274b8067d008c533385c6c4330fd6376c4d330005312d4834b01\", \n            \"privkey\": \"d384f6a007cadf556e10c1bb59eb3e1e7dd940aae5ec6d305b64a6dbbe73ff64\"\n        }, \n        {\n            \"msg\": \"bf1d36ee509e65f04d78be03e0fa0d5ceae29397a33d9efad93332cb47ba0155\", \n            \"sig\": \"3045022100be83c754e4426893b698437baef7fe19329df4cd46f5cf05b33ed1090be2b4fa02202986f9ceb8ea9d2a30876b2a3e4c2e495d9716cc21c66018c91726955ea4b82201\", \n            \"privkey\": \"7f2776e0a044ff802d622f6ac37637ae83b4e2d83dbbf83c681f3606c46a7a8e\"\n        }, \n        {\n            \"msg\": \"fb75554ed0cc5485d2559c29f6510b6ef60dacb5f17d81564d25a87e79ac826e\", \n            \"sig\": \"304402207ab3815aae1a99a367489a31bf7a94661ee086e887641ebac2e455871994db3702204f6f8b7677bb30efb5c4602169f2541274b8f51e1938a2f84a828b9da0137ee201\", \n            \"privkey\": \"4c6f22a57c553e05a0a7a35adf46e1cb4c4d004a984e5af88bb2d2188ba7ab88\"\n        }, \n        {\n            \"msg\": \"6d18019673f7a984b0a222b7299b35e61622681cad5161748040c5375c951505\", \n            \"sig\": \"3044022034375c54a58c8562889c8e41f9c299f7f85704459f8d11f317dd52038ce7e29d02203e8a421f7f4d9d3dbad692dc81ce89ae060b734a01e9c048526ffb0eee908edb01\", \n            \"privkey\": \"0c0b3289b2c6fc93986902fab4457f42d22b0b461c5e5a53a5ec727051586fa7\"\n        }, \n        {\n            \"msg\": \"7e1e2a99702c16bed9055d399af557c2a63da0a5083292adeb3897af6b802564\", \n            \"sig\": \"3045022100c85073b669d65fa197cb73e4fc7a90c65b11cf195b8d718e998b22be071bd3c302207e7def3e6fe2e72aec48855ce06f9425c712fb874baa94484be96f9b9f472d3101\", \n            \"privkey\": \"4d1c0ae59c723633336f8dcc6bde9b358f9b75603e45168e406807212252b112\"\n        }, \n        {\n            \"msg\": \"a33b04ec26e5cbc6558c43abeed149ae35391bcccef36b684d345ff13496ca9b\", \n            \"sig\": \"3045022100f09854120ef83925f0a865aed3b256c5f0efef8f35f2bcf91384545d4ab6315e02205e9ff2aba9fe7270a73281f176d4675163a26b52e71819ac18f001cd5c93225401\", \n            \"privkey\": \"b2eef7149d49c01b51ee926e926e2e26f73c25bbf74371c990617eef8b50ecfe\"\n        }, \n        {\n            \"msg\": \"fa01a5e23fa06dd60c852d89edeb778f94ce904182a8b9d8d1ca9fa6634f9662\", \n            \"sig\": \"304402204cd469bb017d011fabb29cceb655148b0462c666dd940a2442176f4a02f5b02702207c64b92d62db3390facc8db753acbd05a9a1b63896ff4b27dbe47f256502bfad01\", \n            \"privkey\": \"7a572657b960cbeef0c13fd97855fd61147e896093d160fdb1191fe2849bf8e1\"\n        }, \n        {\n            \"msg\": \"14a93f4e03431f95877f6dc9f41f59bc967686bc8401ae10527483e1cdcfebf0\", \n            \"sig\": \"3045022100e502a90aa2908a903d45d5077d718812fd7341b551519f96fa7af94e66f39ef902201bef0e0b54a6fbc28e011d8ecefd0f33f6c7283cc2227ae7ae847b12b873e01001\", \n            \"privkey\": \"d661888426cf1c65cba5f96ec26314b55f421cd447ced732809e32220f28c246\"\n        }, \n        {\n            \"msg\": \"b6ec194ce825fc8ebee69325abfa2acb952d45495ab351455122d4901d4f64bb\", \n            \"sig\": \"304402205edce4c4ab58df2c58efeef2f12975a3a3ad38d6da9d4f18d76b086d5fc4d69d022074844f4cb83eae0aa01f409fbb27bccc32b44b0bca12b614831cfaea711edd9f01\", \n            \"privkey\": \"27cdce4f1e5ffa46fbbfe615bc1d1599db6869404714f0cc46300901b767383a\"\n        }, \n        {\n            \"msg\": \"9b86e708eb9574a8c3ded5d3932a6de43ae4982dcbdca3269af14e967c639b7f\", \n            \"sig\": \"30440220557f81e8f67ed361d2289aec02013731f75248350ecec55ac8dfb14418da68c202202598c35a9c0e062bc48d1ccb9494630a5daae324595be83c473fbaf2b3e7bdd201\", \n            \"privkey\": \"8d6fa8a66bc4684b35d9eb3226d352c7300452dd9b3d548d7a2d947459bc5a0f\"\n        }, \n        {\n            \"msg\": \"170a2926a37a37dbe2e406e2d5a3923973bae98e82ab55e26864a1dcf1785da1\", \n            \"sig\": \"3045022100fc7726b77976e58fd1f8a48c9232747edc40359eb1f6b393540608de72e2b4b5022005c22000c2c1c719c6f4f43ba81ba6ed4643a8645a34ec50619a4945849bd50a01\", \n            \"privkey\": \"339699b552be47df9e751d7bbd53fa052d953738d851741e656bba90de4a53b5\"\n        }, \n        {\n            \"msg\": \"90de053a840eb83db882433d067a2451bfc81f58db606d4e411a6b8fd82c953a\", \n            \"sig\": \"3045022100ae765968d1add07797a390b99ddb7faad3451e922a2e8f38adee56c654a3274902201f992b0f3605c54a6ae60d8604c7260b9a4db93be2512ad64937be4f0b3ad55501\", \n            \"privkey\": \"8b0377d0b6e665a0c6072009b50044c6891cec9316bfac8fc9b6a5a34e4eabb1\"\n        }, \n        {\n            \"msg\": \"38d14fe6dd85bdb8748f5cb23e1fb2e58df2e8bf841f1e1c68bd4d20dc94cfc5\", \n            \"sig\": \"30450221008e35cd8d034a2fc8234d9638f5baa6fe2bd96570df09b7b15ccd007f5c05a93e022041ae8101af3721d99668f87a743bad7bebfa3e0fbfb1a84d6e0f2e73e1d053a601\", \n            \"privkey\": \"6e99a1772417ee7deb91d0e3762d2642d7278f2f7431a4f659da50d43af879b8\"\n        }, \n        {\n            \"msg\": \"00ed851dc354b6df5a3e3bab543ee399b02f3600c595aa3e5ca6a1483465b155\", \n            \"sig\": \"3045022100deeb14e5b93035c0658f20aa05b87cb132609978bfa5ec008a3ca9502961244102205d0aef23a1f146edcda709137a5c5a376bb0f75abd031ba12128c4578ab93d8401\", \n            \"privkey\": \"56580e7ac5163e4e6579ab0e772f2a3848a80af534588e70f230a18158953803\"\n        }, \n        {\n            \"msg\": \"4d46ab40f75ab52c1fd8a7974e06ff684c01bf3e746977e811a1a442bf2912fd\", \n            \"sig\": \"3044022062aa9538861667b57609b750f7260df90373c01523b1341b7f841f3f53dafa0202200a3296141e23dec3292ae553a28c001efcdef18eca50ef09a0b4795b6d4b61b201\", \n            \"privkey\": \"3d38b60f2a844fb43dea0262aac32301ead58568074ca9915c6498155cb47f13\"\n        }, \n        {\n            \"msg\": \"9dd253813dd4ea8902617a09cfdcf060dd062849b76f3c1e556500d13d77170f\", \n            \"sig\": \"3045022100dccc41da7fdac14735bb98a2c59aae91d26284244f4cbc0beedb7851172a444a02206c5ac076f60a7f5243ef4e1630c51f411a03cdf57049d4b92a055ff90160ce8101\", \n            \"privkey\": \"80ac1ff9b4219c1aea37fa937299dfa946e48d23c858d463eafa1bd8d986d9e8\"\n        }, \n        {\n            \"msg\": \"c783fcc63873a8b39563fd0d39ded5453d9c7737e32a0946bc62ce4f6a4773bc\", \n            \"sig\": \"3045022100d782b60cca256c5b7918a62c3f6759588ed8bc3bad7b704dd8de3fe6e720a36802206d163563810897555f0a90c969d476f6c0452cc7a3027ab4ceaf8aafce1cb5a501\", \n            \"privkey\": \"527f7b367a63d977568bd25593860ae36bc3ba4b65f43b121f1af776c995d224\"\n        }, \n        {\n            \"msg\": \"4519ef8ca61e50159ee43d921a679ca78ab70784167ebe656112c2017f1e2a8e\", \n            \"sig\": \"3045022100dd23d3fee7e8fc4bac8c82378aee98fd7d3efa9140f18c1949b83f13654a7f8202201aabe8f08204e36e414d2a1cc42d76a7ba46bc3e4907dddae30944f14107b17a01\", \n            \"privkey\": \"e13d124062e954974d5e5918bf1409a7a5d1d20ad4f4217006e2d5612a255da3\"\n        }, \n        {\n            \"msg\": \"a3a2d23da4f1a6c4031879ba02e11952bd05209863f90907606615edc6dce871\", \n            \"sig\": \"3045022100983403797071adeae9cf36b3541580903d4fe20bbc29d7c85da3d5e86ebfbac202202b1cbdefdfa24e3c53b066b5bba6491f4117ab2b378c04552a4c1297d397670a01\", \n            \"privkey\": \"1f25a034e5df2a5ae72f91d63be72497c3a1df79300ce195ee73e4cfeeda37a6\"\n        }, \n        {\n            \"msg\": \"0b34440573c1ea6ea03e4b5500307948698f229b5a1315f81a5c622fdf660ddf\", \n            \"sig\": \"3045022100a5a3d9ffc866c3a747ad2a015f306d8a6c98540c7622f2bd0409e7a909924a7402201d0606df93f8f423fc5559623a829ae81632c6205af9a69e86965b1aafe9f7f101\", \n            \"privkey\": \"2dfc3b63b1c8f04643f550281371a846a1d31fa651fb861f7e6ae9db88122041\"\n        }, \n        {\n            \"msg\": \"88dde95676e529d3bd4422e8a50d106a4bbd465e8623b37d09228ff66c9dd275\", \n            \"sig\": \"30440220411a5d0613c89a246f08d1cf3db4b5d94b3c7de70a2464a0c6b930bd179db38702206253cc6df480e8fcc3716aa2e2c3cd10990fa73c6f2347e8aa7a499528ef2dec01\", \n            \"privkey\": \"d2f35b4f8e5f9db7e884ab4bcb64f84dc4d87a8d4b9055995df62b759e7ba4aa\"\n        }, \n        {\n            \"msg\": \"3617b55b4aed94d2fddf0f96f9c8c9f4359f948a2b902b76f0d9474a9e549710\", \n            \"sig\": \"3045022100ae0f294fbc13c28259019d000a9a9817173febfb37fb0a273511add46af4226102202d2a8b8b0e058179a0baf190dc76f649075a8d3ab3832d3be859159cbe1a9ae701\", \n            \"privkey\": \"66dc7feb6d7c733005c5d8716b22f38819738bd1538a40f46205f3f3be191efc\"\n        }\n    ]\n}"
  },
  {
    "path": "tests/data/pubkey.json",
    "content": "{\n    \"vectors\": [\n        {\n            \"seckey\": \"7ccca75d019dbae79ac4266501578684ee64eeb3c9212105f7a3bdc0ddb0f27e\", \n            \"pubkey\": \"04e9a06e539d6bf5cf1ca5c41b59121fa3df07a338322405a312c67b6349a707e94c181c5fe89306493dd5677143a329065606740ee58b873e01642228a09ecf9d\", \n            \"compressed\": \"03e9a06e539d6bf5cf1ca5c41b59121fa3df07a338322405a312c67b6349a707e9\"\n        }, \n        {\n            \"seckey\": \"2ec7c8e650421a54c42ec0563cf8672af11563e13ce2665865dcaca8934ec090\", \n            \"pubkey\": \"0480125e42c1984923106e281615dfada44d38c4125c005963b322427110d709d69c353f988b9cd88528bc0197e9b96fe81caa54e916eb39fc0941997f93bdcbc4\", \n            \"compressed\": \"0280125e42c1984923106e281615dfada44d38c4125c005963b322427110d709d6\"\n        }, \n        {\n            \"seckey\": \"e4630e17afe7cf7d1cc17f38c244d8d14b18a4e29e3ccd5913c68c6d08a2c6c9\", \n            \"pubkey\": \"04726fa5b19e9406aaa46ee22fd9e81a09dd5eb7c87505b93a11efcf4b945e778cde0181dfdade24fd558a91dc225038665a5995e0eb1c297203a008b9d9d2abca\", \n            \"compressed\": \"02726fa5b19e9406aaa46ee22fd9e81a09dd5eb7c87505b93a11efcf4b945e778c\"\n        }, \n        {\n            \"seckey\": \"dca84858ca88f3fa2ca301d3f99870687de177601771048455652ad0ce71d1da\", \n            \"pubkey\": \"0443b2db1b334da1499202295b19aeea396976b726464fc2a839a4d040d352e384572078a4f086909d47f942b9d260d27777f339f296ca9ccb2e33cfa85095b822\", \n            \"compressed\": \"0243b2db1b334da1499202295b19aeea396976b726464fc2a839a4d040d352e384\"\n        }, \n        {\n            \"seckey\": \"43c18e01d24c124e9dcab42b335d7f4dfd33d1cb790cd6fbd2da346ab8ca0bb8\", \n            \"pubkey\": \"04600a739be32a14938680b3b3d61b51f217a60df118160d0decab22c9e1329862d3c64f18859d2c0c73d2792b5ab20c44b65b1beba346e02945e5291fe4b24b77\", \n            \"compressed\": \"03600a739be32a14938680b3b3d61b51f217a60df118160d0decab22c9e1329862\"\n        }, \n        {\n            \"seckey\": \"1b60518fd566b0ca49ff3d84e40b56cff81223c8451ccf4188b25904cddf98a5\", \n            \"pubkey\": \"0463ab2b53f829f3cf9b629c8a3a771146f29771ff5e218024747393cb5c63cea8175ee0fc5c345b0c8b11832cfc04641d33fc992f4f9e83c1470fa76500b47e5c\", \n            \"compressed\": \"0263ab2b53f829f3cf9b629c8a3a771146f29771ff5e218024747393cb5c63cea8\"\n        }, \n        {\n            \"seckey\": \"df0268ab2b432e876acd3cab8fb65ccdd1219a189e5d62f5dbe9777bdbb4dfd7\", \n            \"pubkey\": \"048a2f126e3999ff66d01dcb101ab526d3aa1bf5cbdc4bde14950a4cead95f6fcba8f1ad4a12d62ce096f749620dba131dbcfec5549fca7307840c3d54de093120\", \n            \"compressed\": \"028a2f126e3999ff66d01dcb101ab526d3aa1bf5cbdc4bde14950a4cead95f6fcb\"\n        }, \n        {\n            \"seckey\": \"9dd033138aaff497f48f6d9d546a14f2780a7d1238d0f48ba61119450d38248b\", \n            \"pubkey\": \"04bea84d70e74f7603746b62d79bf035e16d982b56e6a1ee07dfd3b9130e8a2ad9c447dae0ca698b6a8bda2aae5a514e80dc885fcbeb275e31e5aeda9fe5910982\", \n            \"compressed\": \"02bea84d70e74f7603746b62d79bf035e16d982b56e6a1ee07dfd3b9130e8a2ad9\"\n        }, \n        {\n            \"seckey\": \"9d08c6e180068c8b275272478bb6a8b4fa1e994cb0b34ba1d018b19f97d20eff\", \n            \"pubkey\": \"04fed149618ff55014ae7871dd7ae4f6569075c507976939941cb78ea9cf10c7ae1b7f7eb680dba836e6bdcfd84dd17e5251b5c960cecc2778155a71a6bc1f2004\", \n            \"compressed\": \"02fed149618ff55014ae7871dd7ae4f6569075c507976939941cb78ea9cf10c7ae\"\n        }, \n        {\n            \"seckey\": \"195cfd0db31e5f09362f601d484e518b015e106429cd7e26e0ca1cdc467682d5\", \n            \"pubkey\": \"04a47fea445b0a8832edce3ad984b5f89a6d60aae5c7df7bafff09b2f88591676c247bd47502f547eea197ce24b95b751f9f521707ddfc07b68ed30f9b0ef40b6b\", \n            \"compressed\": \"03a47fea445b0a8832edce3ad984b5f89a6d60aae5c7df7bafff09b2f88591676c\"\n        }, \n        {\n            \"seckey\": \"84f0a67ea84a8d4187c0a55dbad6ed878bc44623a2cae6266bfb967bf678a2f0\", \n            \"pubkey\": \"0400d7aef146809ca2afa5992ab22558f12131866fbf8becb4be2b214be240e6635569070e2d8a5f763104ff0e663687cb3ca15dc75b4fea55137f851ace05469e\", \n            \"compressed\": \"0200d7aef146809ca2afa5992ab22558f12131866fbf8becb4be2b214be240e663\"\n        }, \n        {\n            \"seckey\": \"71ed678ff864c36b7053982f6783cab87244c2bf63fd97715e10f8e2c4d6e080\", \n            \"pubkey\": \"0435f68a7936cb472c63b40ef559e2792806ae9138a37d961f0c1473e1eab322181440234284dae4275f06fc2501d47b306a80fa22d10ad12113c4112a682068aa\", \n            \"compressed\": \"0235f68a7936cb472c63b40ef559e2792806ae9138a37d961f0c1473e1eab32218\"\n        }, \n        {\n            \"seckey\": \"5e63facf8b4353f5ccf60f80b7f6ccdc7950ca8a374c1da664f4aafa50a6f2d5\", \n            \"pubkey\": \"04e5e4e6e4f55c4102583a59bdef0e6ab6e2e577a9f8605685a057d5f1337ef8440315fd98280bfc1d33302e8d7c29cc8d5b36c8ddcf2a200de6fbf81a9c42193d\", \n            \"compressed\": \"03e5e4e6e4f55c4102583a59bdef0e6ab6e2e577a9f8605685a057d5f1337ef844\"\n        }, \n        {\n            \"seckey\": \"ac56453f101c5ddda206c17bfcf6a91667d758515658151fc30cec766bfb8148\", \n            \"pubkey\": \"04b41b5687497d0843b7f1b7ce41e841a58a74ea97788887826204e44db2c6e0b19be60c4894c784b40da8521824f183730ec623e1783c129950390702f5f433ec\", \n            \"compressed\": \"02b41b5687497d0843b7f1b7ce41e841a58a74ea97788887826204e44db2c6e0b1\"\n        }, \n        {\n            \"seckey\": \"22da18cd07966f0f926a648b6625aec4fe25985327fcdf328d37867024b37557\", \n            \"pubkey\": \"042c9e78bc84b0e29100d2cf0c6a88e56971f161c4967a54104528450d8a2e22c20d72ee6f8927bac376a030c21b3b55cbccfdd513a803a7b172ecf8a56fe35fad\", \n            \"compressed\": \"032c9e78bc84b0e29100d2cf0c6a88e56971f161c4967a54104528450d8a2e22c2\"\n        }, \n        {\n            \"seckey\": \"0c119a23d944f5f49ca9fe5a96adc4046308456239c90b954418ddfd035a5890\", \n            \"pubkey\": \"04d84b2edfd5606ee563fde4a1264b131ffc55bdd5530f032dcab3a70e176450e4c6674a3b838d3a91b68f40a8b4212d3808840a195dd384beb137d74814f74c1a\", \n            \"compressed\": \"02d84b2edfd5606ee563fde4a1264b131ffc55bdd5530f032dcab3a70e176450e4\"\n        }, \n        {\n            \"seckey\": \"ab386451bfc0d595cb247a4ee2c0a353e5eb6e6bf413bdbef09f00ea21fca359\", \n            \"pubkey\": \"046e4ee1a72f028dd55260133d9f57a5f11a4f8180726ed2b5835e88a2c02ae85636169cc1ab2214e95166dc1f6611d55e16870df346ac368db4a896c66ba6ae27\", \n            \"compressed\": \"036e4ee1a72f028dd55260133d9f57a5f11a4f8180726ed2b5835e88a2c02ae856\"\n        }, \n        {\n            \"seckey\": \"cefa1df154f602a7800eedd71d8eb15a0c7da5246326254c7b098c63779a3d6a\", \n            \"pubkey\": \"046b81cae168eb73f31395ab36493295a42fff2e2b54096852f3c6ec6283c8fee388560af3ef8e164f83f0ea1c3e4054a3bb0486306e184f9203bb73a389997d94\", \n            \"compressed\": \"026b81cae168eb73f31395ab36493295a42fff2e2b54096852f3c6ec6283c8fee3\"\n        }, \n        {\n            \"seckey\": \"8d65afbbfcb421c2e04dc5eaa8140ef020e7f910ede111895f49e143b50003b8\", \n            \"pubkey\": \"041be572257f48cf73f4791e8a3a9eb9d9092712c42dd5b7e9291e0e04e12d5547ef9a5579c16fbbc5ade694f2e222fd555fb2f1579c5f6784f2d990622aa6695f\", \n            \"compressed\": \"031be572257f48cf73f4791e8a3a9eb9d9092712c42dd5b7e9291e0e04e12d5547\"\n        }, \n        {\n            \"seckey\": \"e588399d19edeb9d1ae1ea3d094209f7088dfa0fe2ff112e8083c6156f8e26fd\", \n            \"pubkey\": \"043a51b11f63c86eb7e731bdcc896c715a29be1b337ba0e6c6ecb535a83ac6e1166c612720ebb51d39459ee69bd6897d905b8a94f09e908c2f0092f2119293f8a7\", \n            \"compressed\": \"033a51b11f63c86eb7e731bdcc896c715a29be1b337ba0e6c6ecb535a83ac6e116\"\n        }, \n        {\n            \"seckey\": \"8cbf3dc44eb9c90c1834606eeed137cb59168ba13e4c8a2330964750e2394ca0\", \n            \"pubkey\": \"044facbe755688a41dc5f1c08bff88c2ba7cb25f3a018d21f611dd7e1d946e05bd340a8d883e473395d966fb740485ee8614ca4031d7e06fa74627cc4ad2a55c5e\", \n            \"compressed\": \"024facbe755688a41dc5f1c08bff88c2ba7cb25f3a018d21f611dd7e1d946e05bd\"\n        }, \n        {\n            \"seckey\": \"6b79bb8c7f0162d00d4dd2419b22762890d2442a651a151e4d2d85e9cc410307\", \n            \"pubkey\": \"044959dd404af4fdd034a90df6a1f55498da3b73601b6515b747ee3e2bc59b208517877963f25c49dedcd889fdca0ad05f151c547a776a7ea9e8e8fcbc1d990334\", \n            \"compressed\": \"024959dd404af4fdd034a90df6a1f55498da3b73601b6515b747ee3e2bc59b2085\"\n        }, \n        {\n            \"seckey\": \"811ee1d9ef789d161b27326a6e9daee11af48f46a085c90edd107b251918040a\", \n            \"pubkey\": \"04343d29b0a74ef28540b66e5dcf83abe0de175e95bcf9fabc9620cbbdb7c5fe679a94df8db91298c83a675ec692926702d8ce04b2252b70f0f0e6d2b289dc4465\", \n            \"compressed\": \"03343d29b0a74ef28540b66e5dcf83abe0de175e95bcf9fabc9620cbbdb7c5fe67\"\n        }, \n        {\n            \"seckey\": \"023e2aa8cb59170bc6914b7b711598e55ab1278a6bdd4fae3419ad8197935b14\", \n            \"pubkey\": \"04b03f60370a694d7fcb853d7f81822a7c0f3ebfde68274802282023ac198c43cd2c8c59f0ce0ec329ae732c140d89d2af559b42c0ee2a9443d6ba0d9858da3471\", \n            \"compressed\": \"03b03f60370a694d7fcb853d7f81822a7c0f3ebfde68274802282023ac198c43cd\"\n        }, \n        {\n            \"seckey\": \"bfc79464381f3e7a28472a9ec311a5fd9894e3332b8dd146d26401f043c8abc6\", \n            \"pubkey\": \"04d20d4cbfdedd8388a4bcebe4e542d85489225a20b1c3c1369094b6f3907b2f39181dafdabb177b96b02c2568d5275cfbf704177c751cb6e56345d18de34d6e5c\", \n            \"compressed\": \"02d20d4cbfdedd8388a4bcebe4e542d85489225a20b1c3c1369094b6f3907b2f39\"\n        }, \n        {\n            \"seckey\": \"d13705ef7df1849a665c4325feaba7c1a6d14be654cededbc8a24556530a39e2\", \n            \"pubkey\": \"04307fec48e2238130fa1ee88df7746e4692ec02f0be20327ec022c18f6ae3f4be78b3991ca4784699a0cb8e496224a4fac4be14f7e9471327b555c8fc0347c8b3\", \n            \"compressed\": \"03307fec48e2238130fa1ee88df7746e4692ec02f0be20327ec022c18f6ae3f4be\"\n        }, \n        {\n            \"seckey\": \"378d606a9fba96d978b45d9880ec4e2dca6356284c0aae2687a22e4721e6ebb2\", \n            \"pubkey\": \"0491efa831503e0f4c888cffc911180c7682498943774998c7312775fe5df0827781d263a78bfbcffbdb780544b523a43100168a28364a2d72959fb5753a31e390\", \n            \"compressed\": \"0291efa831503e0f4c888cffc911180c7682498943774998c7312775fe5df08277\"\n        }, \n        {\n            \"seckey\": \"3e87e277d3b4d2d705c71624b1d3b5563272e3c953ef15f17c375f165fa98ba0\", \n            \"pubkey\": \"04ddbc09381b5a9b12ddfe460998c6385baab6d1d7bea5f960bc2dc94369713460e75cb131d85073042a1b3052522cdfcfbe44cfd2573d9971a325a189cf4a28ab\", \n            \"compressed\": \"03ddbc09381b5a9b12ddfe460998c6385baab6d1d7bea5f960bc2dc94369713460\"\n        }, \n        {\n            \"seckey\": \"32131765b03cc873b529aaf82bb24249d2915d4418ff3e79e986624fd53b487a\", \n            \"pubkey\": \"048240f4fbb6da80a9d9eff7253637ac1a347a0f9f4198ffbcd986ddffb36b46ce345d76c72077a6a47a36f43b545d69f27ea32b4b3f3e9587a878c7a546e30a85\", \n            \"compressed\": \"038240f4fbb6da80a9d9eff7253637ac1a347a0f9f4198ffbcd986ddffb36b46ce\"\n        }, \n        {\n            \"seckey\": \"443629de0125180a7ec942e17949020d22961fc90499b38e610ef92a60bba626\", \n            \"pubkey\": \"04759c67c0694744ca89e9cda47e9d35d126407a9946272c47e27887e22e703493e3ea9104d6ee908a25a3bad7d0809be5a2809af4e70cb1fa0baec46373429f12\", \n            \"compressed\": \"02759c67c0694744ca89e9cda47e9d35d126407a9946272c47e27887e22e703493\"\n        }, \n        {\n            \"seckey\": \"470cd084ee2de87342f4cb5496dc6b5eef4dfbbebdc6f05e811786a1c3a24a47\", \n            \"pubkey\": \"044b10ed479c20e99bc80fc45119fc81a17b4a5982b27ec00144a0b9e3ebbb063d32578cd16d5684b6cf807b1954428812c02ec6522d0fbcc9eef662f106377feb\", \n            \"compressed\": \"034b10ed479c20e99bc80fc45119fc81a17b4a5982b27ec00144a0b9e3ebbb063d\"\n        }, \n        {\n            \"seckey\": \"2134626053c6c798a81bfb13b0e1361241ee0dd3041a07615477a30bb9adfc4a\", \n            \"pubkey\": \"040c56a5520b20e34f7e7feb0de855255735bcaae09bb7ec86bc0176934e7b6e744f2a1da41e054c14b34e62642e3a4c9b737fe74e5d285e4c1d319bfbeaaa40f4\", \n            \"compressed\": \"020c56a5520b20e34f7e7feb0de855255735bcaae09bb7ec86bc0176934e7b6e74\"\n        }, \n        {\n            \"seckey\": \"48b92b5b299fad570db0fac39f1fc514e47883aa36e99ff80d87e83a1684c28d\", \n            \"pubkey\": \"043c62841338183ca3f4501617fb5672e297a134deb95b43bdabb838765d24f7f38b59bec1657f76a0ca901b972b6ed33e42345cfb2aec08bad3da2c03efe0b8e1\", \n            \"compressed\": \"033c62841338183ca3f4501617fb5672e297a134deb95b43bdabb838765d24f7f3\"\n        }, \n        {\n            \"seckey\": \"f254f28488e37efb212568b85b6bb85f7742bd889c89c8627a9e5d04857fb68b\", \n            \"pubkey\": \"04996ee0ff8f81aa500bfbc941ddae6aa0c1a2c280fbf2b950f799d8246abcc8a9434f91fc9499134e47a2eb858ac0d50133a8543ad2dfd0a279a513aa57e8f1f4\", \n            \"compressed\": \"02996ee0ff8f81aa500bfbc941ddae6aa0c1a2c280fbf2b950f799d8246abcc8a9\"\n        }, \n        {\n            \"seckey\": \"b9c48f1ebc2e6469c65ef2e06cde28800b62ed5614324be7e8dd4bc2ce84dfa1\", \n            \"pubkey\": \"043485b0a1e6fb5e9b177426b150254aac930c497eb073ca65bff0327f5577b277c7dcf7414b993a6076e176560b361327d787a2c854b631d9bddbb46ec6dacb6e\", \n            \"compressed\": \"023485b0a1e6fb5e9b177426b150254aac930c497eb073ca65bff0327f5577b277\"\n        }, \n        {\n            \"seckey\": \"c9bd0b7acbb72ee2d0dc07791271f1ae42fc05f12f8fb9dd7f578710c5d901b1\", \n            \"pubkey\": \"040debceb79cb4da203a76ae48d2ef40aa8b893f1618cc5806a03d0f81669c310fcdc5078f1ae7c836579f476cb5227354ff852b135d7ad138cc2b16bffcd975b0\", \n            \"compressed\": \"020debceb79cb4da203a76ae48d2ef40aa8b893f1618cc5806a03d0f81669c310f\"\n        }, \n        {\n            \"seckey\": \"76628cd29b98baaa5c7057dcdce8dd263dfd664082304edfa6b7046087bdf047\", \n            \"pubkey\": \"047f71ec5121c2e6b8483055220893e277344ee245f1878d55c9d5af41568a415049d8c83b8ffbd39cb1f362ebe21a7bdfe63f722f7cc534e2583cfb90289db850\", \n            \"compressed\": \"027f71ec5121c2e6b8483055220893e277344ee245f1878d55c9d5af41568a4150\"\n        }, \n        {\n            \"seckey\": \"e55e98e8a032ff949c2e72b2af3abe85d8417647b5d218aa41ac2d6147eb4121\", \n            \"pubkey\": \"04227c5fb62d8cf5e7a6b31929e2041954efe5bde9ac40c69ae54a0102a7a126fd2bb0b307d49ac22e061fc23a8eec55e0a42bcc734403ca7c0e140597367bc4ed\", \n            \"compressed\": \"03227c5fb62d8cf5e7a6b31929e2041954efe5bde9ac40c69ae54a0102a7a126fd\"\n        }, \n        {\n            \"seckey\": \"01461ed5879a4e2c219a09966c328e944b0572fad3aa126e9f9d91f1ae170d74\", \n            \"pubkey\": \"04872ece2caeee3838bb930157c7c694b9ad76f3d186d814a5de024f4a5c8d74ce634d788c1e3955e8d00c0cc18919eecfa836356b60ec763c5fb9570e6902ca98\", \n            \"compressed\": \"02872ece2caeee3838bb930157c7c694b9ad76f3d186d814a5de024f4a5c8d74ce\"\n        }, \n        {\n            \"seckey\": \"84b86f6228ac9a2c5a24fd414d54a6bf405ec0a32f2f8f4256da7a0c5b2ab2eb\", \n            \"pubkey\": \"04b35ff304c5f57eb05c0e3a5c96c117e1c491b0dd0a1106fb945b7a287f28341369a27c34430eb51b7f278bb90dd781842008ef0bf32fea081f631784053a10da\", \n            \"compressed\": \"02b35ff304c5f57eb05c0e3a5c96c117e1c491b0dd0a1106fb945b7a287f283413\"\n        }, \n        {\n            \"seckey\": \"af2ecf7cbe86f235a5c9ce921310c5e3f4d27aa2a4e2fec18bb6b6d12bc4ddd3\", \n            \"pubkey\": \"04bf0a76d76d638fdd7ffe73304a70912261a07148ec54bae19745aa3d712410082cb9912ebf33dfe67b35a28b096c1a08899201e66bbac2cc0d7e32abe8370b54\", \n            \"compressed\": \"02bf0a76d76d638fdd7ffe73304a70912261a07148ec54bae19745aa3d71241008\"\n        }, \n        {\n            \"seckey\": \"1c52039f38d3aa70163ed9bea15c34910a0b331e4b635289bef8f06142cdc11b\", \n            \"pubkey\": \"0484b91c8960fbf3a5f2efbd5c54364f838d3e9e6d7e68dcc21250804ab72fabf4087f58ff5d6a02430e8030b066079d9f6bf9759340cf5f47dce45a87310f60d8\", \n            \"compressed\": \"0284b91c8960fbf3a5f2efbd5c54364f838d3e9e6d7e68dcc21250804ab72fabf4\"\n        }, \n        {\n            \"seckey\": \"f13ece7534b2445f5fdd2d9e3c6b251afc8b0871e631be9d24ed080ee208fed7\", \n            \"pubkey\": \"041cebf6adc1f9d459321651490d8463b0aa257992fe4f01f1b7b74742980de74166142f083952c864f469ec843c83ace924e357379566947f381a708cd1dc3a21\", \n            \"compressed\": \"031cebf6adc1f9d459321651490d8463b0aa257992fe4f01f1b7b74742980de741\"\n        }, \n        {\n            \"seckey\": \"1e63ac5ce6369fc04be858303f3b39970d1c5bd1c065bb05912d731578c78c98\", \n            \"pubkey\": \"0426afaf7bbbd05627afb7ef3b7058a725261d688f331dc7340cc64af1d47a74182b7abcd639fb7bf1bf8fb2e54836d60aea89f63ee88a9b9438786381d1e9d5a3\", \n            \"compressed\": \"0326afaf7bbbd05627afb7ef3b7058a725261d688f331dc7340cc64af1d47a7418\"\n        }, \n        {\n            \"seckey\": \"b4577b63da15a69d49d79a17e2eba79739fed9c1540eed251540d3ca61d08ee8\", \n            \"pubkey\": \"042722b014b8f1f1778a00831b83dceedbb6e07930c7adc1f1418a62c641ad33ab91d703f2890487113446812aeb21663e4ac3a045e8d5d3025ecc99520c170907\", \n            \"compressed\": \"032722b014b8f1f1778a00831b83dceedbb6e07930c7adc1f1418a62c641ad33ab\"\n        }, \n        {\n            \"seckey\": \"f7f40582f37a0bee6e547e87696828e78c0a89c04c3063ac55d1c122b181c4a9\", \n            \"pubkey\": \"047dc6de9a51af64f9de63c1ef0a6bb5a37274f3f3504ab3ab82f7e7ebcc811a7621e67901bfaf745a0a7169fb9732cbc18bc84e7ef56cf1633ef9ae9a0e1f580b\", \n            \"compressed\": \"037dc6de9a51af64f9de63c1ef0a6bb5a37274f3f3504ab3ab82f7e7ebcc811a76\"\n        }, \n        {\n            \"seckey\": \"80fa67b7c389ebecd0a59dbf34673fdb98cf0a2a700d9683ea1e12a6ffb8042e\", \n            \"pubkey\": \"0473166d4836aa42f16798dbc2946ef9262e95f8e798c5f16dc77c2d6222b50873f1bf379efcb43b9091720184944e87d250d52fc9006653a63fe5c6d91bf8a904\", \n            \"compressed\": \"0273166d4836aa42f16798dbc2946ef9262e95f8e798c5f16dc77c2d6222b50873\"\n        }, \n        {\n            \"seckey\": \"023b59d4039f4dc8914ae0e13c291addf0886b4e201919e51084188e1c19a24c\", \n            \"pubkey\": \"04f93512e763cbd8ab2c0ac6c4a9e0217882b0a09762d1800ec67dfac0c06b7b22950a7bcf1b6105b1b9d4c58e5414c8e16c22331410bc2f08475099b650058167\", \n            \"compressed\": \"03f93512e763cbd8ab2c0ac6c4a9e0217882b0a09762d1800ec67dfac0c06b7b22\"\n        }, \n        {\n            \"seckey\": \"4b38c6ed81f1df9f9f24cbbc907a3a66b32802fb6dfc873b1b4ae99607c3b661\", \n            \"pubkey\": \"040bbec25cb0d323edafef3fd522516b0e82b36c5c2be4cbc97cf33cf2bbccc676d9c0be88d0bf82d5ab0036bcb7ec7575abc0739e9baa427b04e732bca31471e1\", \n            \"compressed\": \"030bbec25cb0d323edafef3fd522516b0e82b36c5c2be4cbc97cf33cf2bbccc676\"\n        }, \n        {\n            \"seckey\": \"f5c6024670b40cda523320539aa48a3e8df4746a7a13f98cb5a8413f60a6fd9a\", \n            \"pubkey\": \"04c27ca4fe4330da74863a97b9ebca5d104e249bf3a03b560777fd971bc4050b685deffed5a91c8e5a4036477965ed3c6ac4a62f9c448aa763b2f2847c4f022978\", \n            \"compressed\": \"02c27ca4fe4330da74863a97b9ebca5d104e249bf3a03b560777fd971bc4050b68\"\n        }, \n        {\n            \"seckey\": \"7944f7a2aa0d636d37e9482ed0713a4e6269ffd0a3e5244e2c1d7db08e8eb749\", \n            \"pubkey\": \"04e9be2b0cb0cf29138a2253cf4458c1049df646e722c04e09c6fcbc51c192935ae29b91ac0e35e4242302ba3654e983d18e82a47f75dc5e33dccaa2d78e0b9927\", \n            \"compressed\": \"03e9be2b0cb0cf29138a2253cf4458c1049df646e722c04e09c6fcbc51c192935a\"\n        }, \n        {\n            \"seckey\": \"5867203b1c1a5e5d83a2a13a4f82042997e5c2c43d4d0ae656ac1d5547e54200\", \n            \"pubkey\": \"0402c81a0c7472da67b8ac72f0dacc03e0951ccea14c4485dd86f0460bb6fe129502415e65448c856bd2cd2cf773858a6bb8c0a2b53e44f4c48a51e3006bccbe34\", \n            \"compressed\": \"0202c81a0c7472da67b8ac72f0dacc03e0951ccea14c4485dd86f0460bb6fe1295\"\n        }, \n        {\n            \"seckey\": \"70d5932480de26fd3b0428884cb31e8aa127d4825b85e82772b85da9dd04111a\", \n            \"pubkey\": \"042c5105cc06894f9bb6ffd5ada5cd6a72423b806d5d9a7c2fa97295d631bf94519504e52eb1103049826a03d3cc64d3b95efb23034c55be7ebc35e5c54c57544d\", \n            \"compressed\": \"032c5105cc06894f9bb6ffd5ada5cd6a72423b806d5d9a7c2fa97295d631bf9451\"\n        }, \n        {\n            \"seckey\": \"61003adc761c37a321ea1138bdc0835c116ffcaaa78a22b63d8990b5a672a3ff\", \n            \"pubkey\": \"04000e0816297a5fd380c4d6b01813dfff26ad16d9f318e94e58f896956cce9865fe89c56ed365953befddd9497949dc5184696eedfa1f2c83ecfbf1569bb1fd83\", \n            \"compressed\": \"03000e0816297a5fd380c4d6b01813dfff26ad16d9f318e94e58f896956cce9865\"\n        }, \n        {\n            \"seckey\": \"6b7e9f4a11954ead39d2b7908e0d2fc3490017a435ed16400a0971b52a2d7568\", \n            \"pubkey\": \"0478bca3ed414e938024a97edbf59455d40b84dd99ba867b729d54b94f97ffafbf7a72e22e6068fcecb0ef06acb69387a92a36c5dddf1e34a3bd34071c7cd53cd6\", \n            \"compressed\": \"0278bca3ed414e938024a97edbf59455d40b84dd99ba867b729d54b94f97ffafbf\"\n        }, \n        {\n            \"seckey\": \"c6823dc374670e85a36ab7c3a4ddce99d4c0d05f60674ec97fb05a3f110b5b06\", \n            \"pubkey\": \"042cd13613e7e0e43c3fd45b09efc13b6a9d330a62e63a6ae907187c704297e00c2ea7d55963a884070d404dab5dcb2a397014b721d77021324347ed53d3006c8b\", \n            \"compressed\": \"032cd13613e7e0e43c3fd45b09efc13b6a9d330a62e63a6ae907187c704297e00c\"\n        }, \n        {\n            \"seckey\": \"213bec40134d0b76ead9814929988575f717038e4f637372541492605e44f8d5\", \n            \"pubkey\": \"04ae8b652917f8d1cc03b0c18442475a52df2dc3265996bd8cb98a67146b51941097e304e40c9befb09363c74cd58c662e4f02964fedadcadab5751f43431d848e\", \n            \"compressed\": \"02ae8b652917f8d1cc03b0c18442475a52df2dc3265996bd8cb98a67146b519410\"\n        }, \n        {\n            \"seckey\": \"c470460fa0424a7c746640957f7df384e4ba5cb76fb27b92acf1df55d548108a\", \n            \"pubkey\": \"0421cd2dafccbeaa442344b2e720c8eb8d6d32fa816ab4234b12a6ad07d80558bf82943f2a4e311f4056c9d81052820746014c4e8a64b78135ec87f4403ff5c5f6\", \n            \"compressed\": \"0221cd2dafccbeaa442344b2e720c8eb8d6d32fa816ab4234b12a6ad07d80558bf\"\n        }, \n        {\n            \"seckey\": \"59d20005bc9ca4331a3f3021234954a80853260cbade21140c61ad760d991b7d\", \n            \"pubkey\": \"0447aea3ff97f110c86f47dfb1a628643fbb47d7843d9fa8f75d50c846a8e0b3dbf9d0535a83c6962b035319c7f463bf969de57bef08655c66011347be54c2ddf5\", \n            \"compressed\": \"0347aea3ff97f110c86f47dfb1a628643fbb47d7843d9fa8f75d50c846a8e0b3db\"\n        }, \n        {\n            \"seckey\": \"b0992b4f17f0d7cb3c7449eccc7e81aa9a1139486b35e4716d83f6365b2aefdd\", \n            \"pubkey\": \"04aea7231994e7eb134a4724cf97a1f484b8254ed87110fee7e43009ffb2e60054806f6c7bf3cb5e59546643f2478ae1e01fbef1c20f71b28d5542c705cdfe0b63\", \n            \"compressed\": \"03aea7231994e7eb134a4724cf97a1f484b8254ed87110fee7e43009ffb2e60054\"\n        }, \n        {\n            \"seckey\": \"b2b4e73caa7aa41c358ddd2ddbcd38735383b23a8ff2faa63f2d04726f240087\", \n            \"pubkey\": \"04a9b5215dcadaf828f37d7b2c43ad8f65d4c35aa8abcbbe8864969e5b5a3d7b5e7208b15dbffab7d3e187d21a34d8522610a278fe65c74c900cefc5dc27bd2078\", \n            \"compressed\": \"02a9b5215dcadaf828f37d7b2c43ad8f65d4c35aa8abcbbe8864969e5b5a3d7b5e\"\n        }, \n        {\n            \"seckey\": \"ce50a51e0832428207e12f3565ae5ed450f43ced0d084bd033b784d2f45d41e3\", \n            \"pubkey\": \"0464cadcd988a8cd79a3933dc8fbbe1c725ad54f2a45df08b65cbd47411a425c7b682955cad82ab283f3ee90cc57b5dbc934e44c28a1c3064ec5515c29a641c57a\", \n            \"compressed\": \"0264cadcd988a8cd79a3933dc8fbbe1c725ad54f2a45df08b65cbd47411a425c7b\"\n        }, \n        {\n            \"seckey\": \"f7cdd1939907b966693db5b400721b81223ce0fc5c8cf9609ef1559318ff4b92\", \n            \"pubkey\": \"042e46c5dac1085a7aaab56aa95355aae80b9fe4aae1c33949bc26133a416e6e9490324b1de160ef3c20deeb40f1972437b27cc889fa9372f008bb2f41b2a232b5\", \n            \"compressed\": \"032e46c5dac1085a7aaab56aa95355aae80b9fe4aae1c33949bc26133a416e6e94\"\n        }, \n        {\n            \"seckey\": \"ad3d71a40486e7aedffe2724e4a40003a0e2d16d9da7017a072ec633e272916f\", \n            \"pubkey\": \"046a49092925ec024314370654175ec5c9a1200568e8df3804fdfabd66c1accf3d41fee190cd38d1903b9f10845c4a5b5b155586a68be645a59841e8ab1a80b5f4\", \n            \"compressed\": \"026a49092925ec024314370654175ec5c9a1200568e8df3804fdfabd66c1accf3d\"\n        }, \n        {\n            \"seckey\": \"c5bab5baa79c882c357ff3bc1a1b03adc36b90e330447a7521b538abdde4742c\", \n            \"pubkey\": \"045b257f34d3e75f44463433980105604953652bf3695c71306114ddb40559a6c0e01d6c6c6cc710d738f38967ed6ca0e781e89dce137c53f135250a951334dc2e\", \n            \"compressed\": \"025b257f34d3e75f44463433980105604953652bf3695c71306114ddb40559a6c0\"\n        }, \n        {\n            \"seckey\": \"f291cadc03683b58703afd55e22df56a795c7530dd42ac6591ff3fbd2f007504\", \n            \"pubkey\": \"0463ef74c5501d53ce24540c87b714c9a2719a72d34850f978cc83f2b451eabfc1ecdf3287e065911dd37c73bb381986de1774d7c32461503331cf17eccc5e003a\", \n            \"compressed\": \"0263ef74c5501d53ce24540c87b714c9a2719a72d34850f978cc83f2b451eabfc1\"\n        }, \n        {\n            \"seckey\": \"4256011d3eca07fd9729beff4ca023c27b5f2ced0a21a4d0263c326a4128fa01\", \n            \"pubkey\": \"049dd28b095deb79b93f3ab6d8fb8fa70976c0af4f81d997bdbdf6b9c8b815ce55fbb7ba50e0c34fcd7e767fb71117840e00297d5c1ac3023c77d2f043864f1da2\", \n            \"compressed\": \"029dd28b095deb79b93f3ab6d8fb8fa70976c0af4f81d997bdbdf6b9c8b815ce55\"\n        }, \n        {\n            \"seckey\": \"f2382077dd7093e9553a17c534c6653a75349002a9b483203f0f8fee611ed5b1\", \n            \"pubkey\": \"04e3bb3f5087718f780ffa52ceeb08537a45d651c5b1cb1082a9391e1cd6a075a2bf186c770332799cc0e607b5588d617a36cf8cdf0a117fbdcbc7b8a2f4329673\", \n            \"compressed\": \"03e3bb3f5087718f780ffa52ceeb08537a45d651c5b1cb1082a9391e1cd6a075a2\"\n        }, \n        {\n            \"seckey\": \"32c9b2d7b1cd1170b27a7eae46bbf9aa4ec311ba42c6c0bb551811b2489fff69\", \n            \"pubkey\": \"049e1dd08e4fdf93992e3958e3a80af23ccbaaabd384c60b0494c8fe7f403fbdd9d65589f3167ea7a14204f57d67ce6fa8b11d9d273f55ba1ed9c89557c3cf4ff0\", \n            \"compressed\": \"029e1dd08e4fdf93992e3958e3a80af23ccbaaabd384c60b0494c8fe7f403fbdd9\"\n        }, \n        {\n            \"seckey\": \"a6ab914f819cb009e99bdd60f75c336e363aedc2fc89cdb553615f72b46d6344\", \n            \"pubkey\": \"04ad3edcbe70c937536d05b92137aad6ef76f1aad16b3a56d6f7c829744685d0cd362ee5b9d4781a79304e46ed4e8f8c2400be1b4292f4df691e2c79d77888a8e1\", \n            \"compressed\": \"03ad3edcbe70c937536d05b92137aad6ef76f1aad16b3a56d6f7c829744685d0cd\"\n        }, \n        {\n            \"seckey\": \"af6884ea63f8b9413b6d0b63507add8896d078627b1a691f4e2b3f33b6909036\", \n            \"pubkey\": \"04524781d3422e0c21fa6313320f26c4e93f511e10bfc3845f2df87e1c074cd42d1f85c72250ee3becde1c1d011d6abf5dd65f6894af022142db9408fcf4281721\", \n            \"compressed\": \"03524781d3422e0c21fa6313320f26c4e93f511e10bfc3845f2df87e1c074cd42d\"\n        }, \n        {\n            \"seckey\": \"04562b2ae83324fb03babf5cec7ba9360da90199d4b31a346ed507d1c29f94b1\", \n            \"pubkey\": \"0411c5ee90d6fc0391f6fa00d6b05ad004b061f855a39859949aa31e07bb3b7b0172b8c7d5654403b5cdd1bb4c2390f7c9bdfcd1d5b2334200d84db1f35b6673e5\", \n            \"compressed\": \"0311c5ee90d6fc0391f6fa00d6b05ad004b061f855a39859949aa31e07bb3b7b01\"\n        }, \n        {\n            \"seckey\": \"9791f58153d4f98371312889281eba58fa6a7cacad5a2a5aeb60c0756e960f50\", \n            \"pubkey\": \"047b2c1910972e26ae0f95e6e70ed613f64c957f964030a2a142b0acc82a049df7de3ef9887f4c2dcc29f614f6f39b538a3154912dcae08c882d478d23df3cba15\", \n            \"compressed\": \"037b2c1910972e26ae0f95e6e70ed613f64c957f964030a2a142b0acc82a049df7\"\n        }, \n        {\n            \"seckey\": \"ca7c713b06686c9b4706208d3ef6878f15ac90ea1f0f7938e210ec611d3c7c1a\", \n            \"pubkey\": \"04f4bb279e2ef35f7c459aae9fc3d7bef539af3763f492ad522466f77dcca77158c8a95d9bae2303c709052d7662b644405c88ddd8c72f95a970291f84ed71d513\", \n            \"compressed\": \"03f4bb279e2ef35f7c459aae9fc3d7bef539af3763f492ad522466f77dcca77158\"\n        }, \n        {\n            \"seckey\": \"897ecb1cf1d81821835ab6dc4f2791746558281b2e59e216702f932896479feb\", \n            \"pubkey\": \"044f75a4f8a61a46f82566c2b4fe9140b83a8ed38a6d77953c3fbddc4f07f42c2b59b92064850ccb6213afb48a31221d445da1fd5f3c2e356482f6661554ce4635\", \n            \"compressed\": \"034f75a4f8a61a46f82566c2b4fe9140b83a8ed38a6d77953c3fbddc4f07f42c2b\"\n        }, \n        {\n            \"seckey\": \"32079330c57029a8f89e69f4476e89063eb5ead0a29f310d803e1fa875540afb\", \n            \"pubkey\": \"04e96fa5f104626a165772eebc108b83cc9f68339aab02adaacbff35dcaa26c07924deb28148ec5cd5b2b15ca80e790c83974b194af3c7212643f47d686367479d\", \n            \"compressed\": \"03e96fa5f104626a165772eebc108b83cc9f68339aab02adaacbff35dcaa26c079\"\n        }, \n        {\n            \"seckey\": \"f76cbf728a81963ddb51862d28cdebb3df2b6d30bbaec85255b1eb1c27b91213\", \n            \"pubkey\": \"04d6bdf46acc2ed913e5a089f914f97c3c051b55d91be5fb96d590623254f46ff43ec7239cff046569f84a2ccf69c771e1e893288ff8718c5dd9aedaea1b42e5c8\", \n            \"compressed\": \"02d6bdf46acc2ed913e5a089f914f97c3c051b55d91be5fb96d590623254f46ff4\"\n        }, \n        {\n            \"seckey\": \"a3dd85db809880522570836cecf05d707d9bac91628bfed96fc43f4e566892af\", \n            \"pubkey\": \"0446e753925691edd9ea009caec4f1e85b35b0a33b122b0a74b62e2aeb72514ebc5b175102f84e7545fe9d2abc83b102f2f29442a65b342426f9f46ee549969727\", \n            \"compressed\": \"0346e753925691edd9ea009caec4f1e85b35b0a33b122b0a74b62e2aeb72514ebc\"\n        }, \n        {\n            \"seckey\": \"9574e3f2387264e675b05d960a41c908e962e608635aa00cbb8cd557e83be939\", \n            \"pubkey\": \"043263e745693958c32dd673b508d9b1c4d956305a7722e519fa83d4e3bb25c0e3459d3f70bc45f24118c313a9a42a6cff371aa1f9b3bea462c935ae1a675079d8\", \n            \"compressed\": \"023263e745693958c32dd673b508d9b1c4d956305a7722e519fa83d4e3bb25c0e3\"\n        }, \n        {\n            \"seckey\": \"54b03b736d6487e02345303381a76b7638c0a3361873b4379fcbe5739b3df6e8\", \n            \"pubkey\": \"041516dc0c5f8b51a228355242669c453b7092a6ca982f1a97057ddeecbcce6b39f6f5a8102b0cd1576556826a0a439f8a533e80bf708fd5ece8b7a6e1edb60c60\", \n            \"compressed\": \"021516dc0c5f8b51a228355242669c453b7092a6ca982f1a97057ddeecbcce6b39\"\n        }, \n        {\n            \"seckey\": \"85c502bdc3928d625b6d528d9ecfbf928095331866bbe45ecfa3b5e4148e2d54\", \n            \"pubkey\": \"04d16aa3a25917f5ef14a396b8a9792baf5349130527896ca27f3b3cacb2504f850ddbb8fa4443dd019c8af73a4a8ac016bb6d5ef336cf78e2a12b309187c9b840\", \n            \"compressed\": \"02d16aa3a25917f5ef14a396b8a9792baf5349130527896ca27f3b3cacb2504f85\"\n        }, \n        {\n            \"seckey\": \"44ec48845b90da105d2682003ed2d5587bf1fe9c0f886fab2a67c2e00537c101\", \n            \"pubkey\": \"04789b49261b73d3d566c6b4c4a76c999395845c27803011495fae6d9a0253808e5e57019bb4ac049970fd22c6c1f225ea68fddedeb42008715a9e7bb241d00c0c\", \n            \"compressed\": \"02789b49261b73d3d566c6b4c4a76c999395845c27803011495fae6d9a0253808e\"\n        }, \n        {\n            \"seckey\": \"a93b31823f79367c70c872eca37fe8e1a8b89d2c53b9469da5a644c289f3c269\", \n            \"pubkey\": \"04313fa4460b2a99d7e08f4c4976734bf7e912d6f19a44f41ad84205560561b9cbf40fd73c9c4393031d8437ce7033649fc2bccc30475fed115c700ea076e3fb10\", \n            \"compressed\": \"02313fa4460b2a99d7e08f4c4976734bf7e912d6f19a44f41ad84205560561b9cb\"\n        }, \n        {\n            \"seckey\": \"632c04dba2c14a152d6240bb685d8bbecdf5de486e76f53f4d40a5b8b2d35332\", \n            \"pubkey\": \"0426d1cd1f49bb756a31eb329f9ff529bfcaf6258c10d95d0274f84e0e611c5783e5ab4001233a7e5ce89f50225de3967710dfb74017da96cc1b090da3be76f938\", \n            \"compressed\": \"0226d1cd1f49bb756a31eb329f9ff529bfcaf6258c10d95d0274f84e0e611c5783\"\n        }, \n        {\n            \"seckey\": \"9147de4654824d5baf888e7c098e333edb1e9631121f1f556b08ffc215e4f83e\", \n            \"pubkey\": \"040ae9ce0eae46d3b8eeccac6b6d93cfd726d0fb634ce191df92e14bf074b619495b812bee1a4f6a95f3eddf809ef918f04d7fa5479fc374f97bc027ac265da4a8\", \n            \"compressed\": \"020ae9ce0eae46d3b8eeccac6b6d93cfd726d0fb634ce191df92e14bf074b61949\"\n        }, \n        {\n            \"seckey\": \"a62baf41727cba966140e30935280b5c005fe0b280f261dded79450e63557ecd\", \n            \"pubkey\": \"049f461eda87c83ce67c6b99c6084f6ddc6d9435641639eb739f0e6fea8b622a61ca736821a2e021b0f12fffb4ecff59f03165fb50647578cef7440e4c43b30be0\", \n            \"compressed\": \"029f461eda87c83ce67c6b99c6084f6ddc6d9435641639eb739f0e6fea8b622a61\"\n        }, \n        {\n            \"seckey\": \"df94783c5b831ca2714c750dd18463088442b02d1ead011a73071d5b77abb704\", \n            \"pubkey\": \"0463db5ff1a5af88d9738406fb68ed9119121cff7f22b998bd56fc574aae995319fb6758ecfe918ad0f0b4a70516a8d47b72f4b733688a742d02acfbee49a42280\", \n            \"compressed\": \"0263db5ff1a5af88d9738406fb68ed9119121cff7f22b998bd56fc574aae995319\"\n        }, \n        {\n            \"seckey\": \"8ab71478f9b30eb6917b9035c9c3d8e67734e59af20d5d283dac13b21a624e95\", \n            \"pubkey\": \"041b51d5d8064c91a3840a54042ccea84f8672df82331df212fdf8df3f28f8ead93cbf36aa50c805820d3f8a15db0586fac9edfdacdf83c98cf829ed882254ee50\", \n            \"compressed\": \"021b51d5d8064c91a3840a54042ccea84f8672df82331df212fdf8df3f28f8ead9\"\n        }, \n        {\n            \"seckey\": \"ede0e811a5aec47b9f1a7dea717e579c4fadf3f336950106cc633afe346198f7\", \n            \"pubkey\": \"049e89ded99095497309273fa6c8dcf1c9a8bf61358d1cf98e769eadc85d6f4d3b4bbdf2dc407214f0f006963d97319f51ee707a67515008375f26a5f0a0af4af8\", \n            \"compressed\": \"029e89ded99095497309273fa6c8dcf1c9a8bf61358d1cf98e769eadc85d6f4d3b\"\n        }, \n        {\n            \"seckey\": \"25e10503001d6c2b363538bda91bb2a46ffbef0b810b99f710ba58d79af9061d\", \n            \"pubkey\": \"04e1f50daac32e8fb5abb7b20567f785a2ca9a1dec976518c63fb6fce1eabf8d54b6b7c32fab02e373cf55106e42bd59c1aa64915c791ee899297f7277e356f1d1\", \n            \"compressed\": \"03e1f50daac32e8fb5abb7b20567f785a2ca9a1dec976518c63fb6fce1eabf8d54\"\n        }, \n        {\n            \"seckey\": \"5756d0a585fefedf32b2015bf8690696aafdf002fc3450e439545a22ad2c8357\", \n            \"pubkey\": \"0473ebf9d595af2821425525f229382ae81ca35e54eff591e9ebee4f6e39b69e4e2bf127c30fd5cd650c0e64629c501baf070a85214f0c8fe2d4b01b55c8facd7c\", \n            \"compressed\": \"0273ebf9d595af2821425525f229382ae81ca35e54eff591e9ebee4f6e39b69e4e\"\n        }, \n        {\n            \"seckey\": \"1392f92cbf5d548ce11c608b4362344c5b3133dd32eb6eafa874c74e5d9ecbd1\", \n            \"pubkey\": \"04a89b06737983f132447de3916048c2aab5ed85462134dc8dbcd58786eac268ae99cd28bf8cbc29cd8d8d8541a7f55cac50b2a6eb67a68831e88b67bd70ada583\", \n            \"compressed\": \"03a89b06737983f132447de3916048c2aab5ed85462134dc8dbcd58786eac268ae\"\n        }, \n        {\n            \"seckey\": \"5080c778d6988ed1ab512d3ab0a8e453309879b1796bead328b5c800895cd3fd\", \n            \"pubkey\": \"046824933a386d6a7b9edfd5d539a2c1020d887feb387cfdce9bd23b1f8df018dd866ba11bb9f72fca3a4f237b82d30f4700175af13acf2e47cfc3f17e8beee3a5\", \n            \"compressed\": \"036824933a386d6a7b9edfd5d539a2c1020d887feb387cfdce9bd23b1f8df018dd\"\n        }, \n        {\n            \"seckey\": \"0174c604fd59ed33d7c01b1476bb78f72c222385fe6ce252435ed1f4befd0cd3\", \n            \"pubkey\": \"04d2f1d601655a891e854c7d36a773a7055687ac58d476d23181015d30fd26f40e34cfddb4c4b660e1dd0ca1a4c9b788eb7926fb1f6a738bc36537f67ac9f24191\", \n            \"compressed\": \"03d2f1d601655a891e854c7d36a773a7055687ac58d476d23181015d30fd26f40e\"\n        }, \n        {\n            \"seckey\": \"5dc0b91e47b67fe804e4f6556aa29cc87ccdba4d023c3541e72d1d04a4b06d46\", \n            \"pubkey\": \"046f16344c8ea167052c387b374191e961731c88f4d62733adfdffe404aa99ed29aaa62626ad51f009990fcf6ac10269c13b8e9ba5e774252d11a2c0ccdaa89140\", \n            \"compressed\": \"026f16344c8ea167052c387b374191e961731c88f4d62733adfdffe404aa99ed29\"\n        }, \n        {\n            \"seckey\": \"59a843325b61fd4836f7a740e5a25e29713bef200d51dc2a52e0e57bbd46f20a\", \n            \"pubkey\": \"04311428e1d2ec575d819a7e359b51c37cb17447eac554a6fec735af803eadfab7d0650b9658abf9c6817cce201823d521cc776b7e9ac83c56a1d677a0de3a0676\", \n            \"compressed\": \"02311428e1d2ec575d819a7e359b51c37cb17447eac554a6fec735af803eadfab7\"\n        }, \n        {\n            \"seckey\": \"7fb9bfa1fae9b5372f9a9eadf1ea4b5ad904ede21c636dcc9269ffed3e7cc3db\", \n            \"pubkey\": \"043f2bd78dd39fc9a2710ee174f91d39218068d3b100929df466b5d76304c316d329beab977c57fe6981432418c7360601782172db4deeba9150944dab47b00a18\", \n            \"compressed\": \"023f2bd78dd39fc9a2710ee174f91d39218068d3b100929df466b5d76304c316d3\"\n        }, \n        {\n            \"seckey\": \"6f165a7bc3b3ef184c9849d437a2bf0e3efa1235e6f57a4b4cf2f2fa27091f6d\", \n            \"pubkey\": \"04491757b0a8ad7b52a3295df3008a325e9edd856ee05d0b77bba55f0146df49fca25a3d863d06676cd1652cf855ba2e000c419d28edf4d7b672c35c7555fe8d61\", \n            \"compressed\": \"03491757b0a8ad7b52a3295df3008a325e9edd856ee05d0b77bba55f0146df49fc\"\n        }, \n        {\n            \"seckey\": \"43f945981d47add0121c1bfb7174f5cb1f878e9bf0b48b05df4d72262fa4b93a\", \n            \"pubkey\": \"043db0075db49f48dd8f29a62f17dfe9a6f092ebe2b3e80cb7254daab314240cc9ca4204830427de3f31a29b07c64bd8b1e37a79df102203c6a2a9a64a21102a89\", \n            \"compressed\": \"033db0075db49f48dd8f29a62f17dfe9a6f092ebe2b3e80cb7254daab314240cc9\"\n        }, \n        {\n            \"seckey\": \"21f93be85dadba4b32f5ee2e097d4eaad65a99ac80840a0e8c7d9dd8d8ff7c29\", \n            \"pubkey\": \"04c62074a66f2b7121fe6f24899e2cf2096f49674239610197d0bbc7bf6dc34d7e7915d4a5f8b4451252581d6f162f09d5a4be9033bcd57b90982743aec36b92eb\", \n            \"compressed\": \"03c62074a66f2b7121fe6f24899e2cf2096f49674239610197d0bbc7bf6dc34d7e\"\n        }, \n        {\n            \"seckey\": \"9c07e907e3916ad39d9f090d762690d9ef005bfeafa68c39a8cbe701b5a7d3e9\", \n            \"pubkey\": \"046d1991c3176e8e8f989d1e108bd7cca7b0e946af8ef6f7669a284f636b629876fbd6b752535a77a96a3ce115c2c340534290b8f64ecf9342de6c9ee0b63b263a\", \n            \"compressed\": \"026d1991c3176e8e8f989d1e108bd7cca7b0e946af8ef6f7669a284f636b629876\"\n        }, \n        {\n            \"seckey\": \"6ff1df64b807c3071a840d4287b364ff34798b4f9d75cf1827d61622ecfdf64e\", \n            \"pubkey\": \"04bcce74b032aabc9c434fca70231b027474c1407058187fc0c423de8580927b53fcf729dd7a83905699f8b495f43cfc9a80336df59aa6a860b64233e41b510fe6\", \n            \"compressed\": \"02bcce74b032aabc9c434fca70231b027474c1407058187fc0c423de8580927b53\"\n        }, \n        {\n            \"seckey\": \"bae7c77dae456c97b2e8a9a47681b91129d679467cc4454d1f9e55ce31788b9e\", \n            \"pubkey\": \"04d5faddc423c5b6be9536de311b43f0287e09c6d8e36324e15a5328b6502bce656329a4e7872773af9d37b6a41ffeab6d27669dc86e61e976cab011f7c8649ac0\", \n            \"compressed\": \"02d5faddc423c5b6be9536de311b43f0287e09c6d8e36324e15a5328b6502bce65\"\n        }, \n        {\n            \"seckey\": \"3700836bde3c38ff453a4e3c2b8474783a719fd9bed9b03e093735fc873eb56c\", \n            \"pubkey\": \"04cafe7dd11faf895887328153694ea39b15f24ebf0aaa3d243ac0ef93416130c540d0429125116c2d06af1832888f0b905d443f328ba3e6f0edba6fe1a81335bd\", \n            \"compressed\": \"03cafe7dd11faf895887328153694ea39b15f24ebf0aaa3d243ac0ef93416130c5\"\n        }, \n        {\n            \"seckey\": \"76300e058c982513535a7b2db21a9b06563ef5a0756e244a7cb703ecdf14ab11\", \n            \"pubkey\": \"04b0a676218707a050f9cbe13a759422f7d989a13421b5ea56354590410e20471b85d09e23c719fec467a1aee39c3c56888f6ad6349208b33c1213a8592c3d3717\", \n            \"compressed\": \"03b0a676218707a050f9cbe13a759422f7d989a13421b5ea56354590410e20471b\"\n        }, \n        {\n            \"seckey\": \"06a7bff08145eb116a1d203e8ae7769a3b509b2577b1fec4b545843d2c55fbda\", \n            \"pubkey\": \"045a108b282317895a14f774010316288edc2f5bd59c6463484f829543700e1479bf073b42b9fb76f4bdc47edb7861e5f56c02b09faa7b99e9e0710fda87edd64d\", \n            \"compressed\": \"035a108b282317895a14f774010316288edc2f5bd59c6463484f829543700e1479\"\n        }, \n        {\n            \"seckey\": \"166b8acfc1ca952344b3b202f28dffdd3d5ccb86897a3f64d301d257fd5ca71b\", \n            \"pubkey\": \"04558a1d82be672ea78af57f6e01da7859adb8bb3777f70eabab05dba7050dd37bd7684f36b8cb623a0c15a5cfd4646fa7cbfa021edadc93dd4a4fb606eee1041a\", \n            \"compressed\": \"02558a1d82be672ea78af57f6e01da7859adb8bb3777f70eabab05dba7050dd37b\"\n        }, \n        {\n            \"seckey\": \"8fd583c8a4eadcc0659a161c0354ce4060145066235834cfe5d1c2de98900e9b\", \n            \"pubkey\": \"04ebbbc3472bd8da6501f2b5fbe63a6867521ea64578bcc99b5d25bb28f4e3c52f12f695a48d4b2e4a6713f3999f449dfd67f879947d67823607193655c08c3414\", \n            \"compressed\": \"02ebbbc3472bd8da6501f2b5fbe63a6867521ea64578bcc99b5d25bb28f4e3c52f\"\n        }, \n        {\n            \"seckey\": \"3cd6917b8b37beb10cb4ce629e4e17b948859ff188db3cce5173801ed07fefba\", \n            \"pubkey\": \"04ce403aa4fe0b04b04d007bbcf9b988055dac12315f49ca4a62019f1fa617e6feb877372885cb34d9d20cb746e8703500dbff0d7dc414ea7d3e13cff6b2fc2317\", \n            \"compressed\": \"03ce403aa4fe0b04b04d007bbcf9b988055dac12315f49ca4a62019f1fa617e6fe\"\n        }, \n        {\n            \"seckey\": \"37c6bd2fc6234bfa56c6bc6e128b86da1f23afceec9f34ebb3e37c21122694b1\", \n            \"pubkey\": \"04cf621f3ad2cac0d7485159ca8ed101bffcb0b96f6d2b10929375194665c2dbde71b15348d6b398c112ebfb4e34340fd948761bf41ddbc99c6199c2f96a715247\", \n            \"compressed\": \"03cf621f3ad2cac0d7485159ca8ed101bffcb0b96f6d2b10929375194665c2dbde\"\n        }, \n        {\n            \"seckey\": \"a29134111c4e3e77bdf6cb5eb4ae7ebdd15cb95ee16a5de21aed5b3ac4aaa561\", \n            \"pubkey\": \"047065a815c2eec55122ce5118dfdbe7d556083315f4e683979f8cb27e57bb266bfb99161ca7962cda59d0f30de21edabe83750d04616e05a755aec4301fb87618\", \n            \"compressed\": \"027065a815c2eec55122ce5118dfdbe7d556083315f4e683979f8cb27e57bb266b\"\n        }, \n        {\n            \"seckey\": \"e4ed032d4f4954c42db16279d160bf41c53bb7e8834c2cfd453d8dbd9b624e4d\", \n            \"pubkey\": \"04419bf9038500600836f8ea6556610d77eeb91f6de390eda8fe2bc09b10b3f8e0dd189a15d5c476ac585714a12bed49e11aaa66fa48828fb7f0afc729310eecfa\", \n            \"compressed\": \"02419bf9038500600836f8ea6556610d77eeb91f6de390eda8fe2bc09b10b3f8e0\"\n        }, \n        {\n            \"seckey\": \"4304a5966e21af89089d59a8d2ca5465b3d20599a332c6bcb83ed1bbc08510c3\", \n            \"pubkey\": \"04838584ec6b483a970b2b1aa7e89fc558775ebd04595d22820587d70e08c0bc3e9fc452b141b268f0b62c0f269fa958cb66f828d1607c94aed496cd85b1b1cf43\", \n            \"compressed\": \"03838584ec6b483a970b2b1aa7e89fc558775ebd04595d22820587d70e08c0bc3e\"\n        }, \n        {\n            \"seckey\": \"99bf47eea7fd1f12dd1d233637baa62e170bde693bc6ed1eb14e1645feb35fa2\", \n            \"pubkey\": \"04ae0855ae860bd66675b957ac781d92bb327453075f51af656e98a1742b046a91dd3ce591a7029a6b6b40c41ff3d01f45986e74f83b93f0f3f40f6cdc43eda36a\", \n            \"compressed\": \"02ae0855ae860bd66675b957ac781d92bb327453075f51af656e98a1742b046a91\"\n        }, \n        {\n            \"seckey\": \"aa40a04dd9c822f8caa5259b3326db18435ff76b38150f3e0b59b8db9f62714a\", \n            \"pubkey\": \"04d542e1e1716175937e2e3e507a76b3d90af47f55f1c5231f3c22dacad0e049f8a43789f448d274cca3176c9ca8aef184061e0d47cae7296f97b21960694b9575\", \n            \"compressed\": \"03d542e1e1716175937e2e3e507a76b3d90af47f55f1c5231f3c22dacad0e049f8\"\n        }, \n        {\n            \"seckey\": \"3e2176e09c7ad378e04595ba86ef849ed41b80065c9438b63351f41eb2fb84f0\", \n            \"pubkey\": \"04a97cc683834af2d2a579c6614ceea0b77bf649642ff0f3cb963c85b055f8e862544459dc9c1403ae4a0ea52ee1f533dd3837f130e65e484511c6c9bb70ac5bd7\", \n            \"compressed\": \"03a97cc683834af2d2a579c6614ceea0b77bf649642ff0f3cb963c85b055f8e862\"\n        }, \n        {\n            \"seckey\": \"b706577b8355764795f6dfcf446a456e697811615747f421b8559e925a6ee363\", \n            \"pubkey\": \"04021e2d63d3390cf494d3137635a416616dc02519d6e8980de56dc8ea3e4e1ed4098a49824437a1c0e4a4196ebffd22feb551b7437066f6dabd49d29f9de23c69\", \n            \"compressed\": \"03021e2d63d3390cf494d3137635a416616dc02519d6e8980de56dc8ea3e4e1ed4\"\n        }, \n        {\n            \"seckey\": \"230541e109550397c9bb810fb415a9d9597c28e730fc6e8bda4b86ab42e135ed\", \n            \"pubkey\": \"04cbb34b7b15f18beb29ccf2351b044994374b21cc33ce9b3389d3f2fbe2b3a15a0f3513174169f16cfd50f4bd3db1ec2bc0c9334147664c65ed1e0d09840957b7\", \n            \"compressed\": \"03cbb34b7b15f18beb29ccf2351b044994374b21cc33ce9b3389d3f2fbe2b3a15a\"\n        }, \n        {\n            \"seckey\": \"b3abb04914d9710de81228342a0ad983349b94dfaab31d858428155bea9e44f9\", \n            \"pubkey\": \"04fa7a5c2a3d127ed9fcba28ca4ceed9b82e8c7131d2f486be6ff98266b7bc27a4248729e8bbb39f70be53254d4185fd601ea0120d272c3fe83a8ccef29d8da894\", \n            \"compressed\": \"02fa7a5c2a3d127ed9fcba28ca4ceed9b82e8c7131d2f486be6ff98266b7bc27a4\"\n        }, \n        {\n            \"seckey\": \"1193c21dfe1fe9301c47e737d3caea557351bc251332df14a2e4504381981ad8\", \n            \"pubkey\": \"040029cb88fab8806647f838a4ad573bf0e061838b3c51c65d525d18cd156c63dcb60426a8adef42a263e22148b95a2e7c571fb27fb074956a327ec24aa20c194b\", \n            \"compressed\": \"030029cb88fab8806647f838a4ad573bf0e061838b3c51c65d525d18cd156c63dc\"\n        }, \n        {\n            \"seckey\": \"6d904bd060ba937b6db22d43e2f256cf0b1de145f695c7a464c842c40ece836b\", \n            \"pubkey\": \"04140cf8752a763093766947e9e1a68f0bd0eb2927ad51e8474e780e3987c9a86f25b9812e00938e1da6d17814b938da6814c037d494fe8e716444c85685faa004\", \n            \"compressed\": \"02140cf8752a763093766947e9e1a68f0bd0eb2927ad51e8474e780e3987c9a86f\"\n        }, \n        {\n            \"seckey\": \"7ec67cde75ca0e568cea79bea574145d7a83fb860218f26cd747898dcf0b3cff\", \n            \"pubkey\": \"04eaef8cc670a2d14a757c61fc0c98f6a39a5eabd9d910e1754d687a06bd86b001e9755e1d9e63c0d50c357efb642cb154334261c59a7fff9bfa1e8013d3e55b4a\", \n            \"compressed\": \"02eaef8cc670a2d14a757c61fc0c98f6a39a5eabd9d910e1754d687a06bd86b001\"\n        }, \n        {\n            \"seckey\": \"e1b43f8cc9b1efc3292d257cfb56a3aea0ab361d5b8011391808540e0a81dd42\", \n            \"pubkey\": \"04e17f5fdffa29bde9f3760562e405a415686f7518d3f4b1427eca568ddb7b328dcbd9000f8bb438c4af57428e7889ff8a21254d242132e3d9dab439eb53baba24\", \n            \"compressed\": \"02e17f5fdffa29bde9f3760562e405a415686f7518d3f4b1427eca568ddb7b328d\"\n        }, \n        {\n            \"seckey\": \"282d5316778eadf0c0a116b5b6c693f25c3563409480af3933b8262457977f18\", \n            \"pubkey\": \"040628e8bf972cb392dae6ba2d7550400ec50502566282fbbb1fb263ddd3f66a24df00b890db27f5d225bda57ec81f7f32b5d40888adf0553556fdae0487bb989a\", \n            \"compressed\": \"020628e8bf972cb392dae6ba2d7550400ec50502566282fbbb1fb263ddd3f66a24\"\n        }, \n        {\n            \"seckey\": \"6315d921c565704c4fccd09f04a651b9588a8ff9192c77e09a9297452eb61ecc\", \n            \"pubkey\": \"04814f7b348169ca396057e8edccd53348a76ab29126e476da2dcc61d9fa9c37a164c44cf5ae062de8849e57ee9eb08dd5c34fc2ba4eddf330fe7b0d6afd91446a\", \n            \"compressed\": \"02814f7b348169ca396057e8edccd53348a76ab29126e476da2dcc61d9fa9c37a1\"\n        }, \n        {\n            \"seckey\": \"786c6ec4b7082a3e9994382371bf7e5e8f051ac26763f3ab8731528cbd7e6751\", \n            \"pubkey\": \"044748c76360e729ba08d12ac6cb102027b8d4b1471297e3e7fd6e6295e3851ab25539b25731216ebba65eb93db95dd45adef47724aac3cb63f3219ea60f6c8ce4\", \n            \"compressed\": \"024748c76360e729ba08d12ac6cb102027b8d4b1471297e3e7fd6e6295e3851ab2\"\n        }, \n        {\n            \"seckey\": \"13dae1ce5fa08f48038efd6b03b2bc8b9aa803395a7428a420bc1b7de1094bcf\", \n            \"pubkey\": \"04a6ac1de401b907a5273f2336d91557d179de3d02bec906ed08f68fdf9699683230147c5a850e968cb7caf2b28d98254dbfb3dfeb2809e647d3e35c1ca255d510\", \n            \"compressed\": \"02a6ac1de401b907a5273f2336d91557d179de3d02bec906ed08f68fdf96996832\"\n        }, \n        {\n            \"seckey\": \"85e64cee9c59b3d45f4e54bf3f83b65f076c42e491f88997148d74b014e98523\", \n            \"pubkey\": \"040626e3c372963b5e8ac0f8784b5f15d668d846afe8fd7c632e6e1025ea5cb7d96b9cab4794c33cd144241cee28ac917c350ac899437b5db3d830639e58436679\", \n            \"compressed\": \"030626e3c372963b5e8ac0f8784b5f15d668d846afe8fd7c632e6e1025ea5cb7d9\"\n        }, \n        {\n            \"seckey\": \"acefe7e65b316633f6e0838690e87d24c94b9eec0f35c5820a5195a1a0d414cd\", \n            \"pubkey\": \"0473ebeb207b729456ff7c8a277666183b2376689380f6413525a631f7dda1b16ceece2e512d2e143af401af9eefc472720c067a7aba56e9ccf9cc41e0f98aa311\", \n            \"compressed\": \"0373ebeb207b729456ff7c8a277666183b2376689380f6413525a631f7dda1b16c\"\n        }, \n        {\n            \"seckey\": \"646d631ec81a906384f749ae2742d8b007bc57d96bb0fe43fbca7e23c654d039\", \n            \"pubkey\": \"04da953105ef264a1f0b6424fb31e541776ed0036a44954bc9050d7a8267cadc5a489d3411524df8186e9273e591ddd4adf0ff80c72aa77ca5cda72d432263a7d5\", \n            \"compressed\": \"03da953105ef264a1f0b6424fb31e541776ed0036a44954bc9050d7a8267cadc5a\"\n        }, \n        {\n            \"seckey\": \"c303ae2d0277c309049abfd831e3795c3098e4e8af58adeef300676c0f1ae176\", \n            \"pubkey\": \"0471a99b006ef91ff0ce5dbd41c089692c47d99062f72751ba648b15f3ad74997252812eb91f06a84a2672a7b06307ea6f12675f0643115944eb140c8ec83983b4\", \n            \"compressed\": \"0271a99b006ef91ff0ce5dbd41c089692c47d99062f72751ba648b15f3ad749972\"\n        }, \n        {\n            \"seckey\": \"917b3bf58f03d299f016c4ba1949e56e16c0e0e89a7d28f576fcc1f8b702abab\", \n            \"pubkey\": \"04317437599b836df26d9648afc1ffc14adf6f161eef9e326bf8bb6452a3f02b1137318bba4eb92171626161a169458fa6b20734bcda69ffdf72b0de588e619e31\", \n            \"compressed\": \"03317437599b836df26d9648afc1ffc14adf6f161eef9e326bf8bb6452a3f02b11\"\n        }, \n        {\n            \"seckey\": \"e8a9a85048ba8a25bef3413959c82c8f02fa25ce53d4309f23836c429a1fdd86\", \n            \"pubkey\": \"0488213fe94770491690b9bb2e67affd60ce64ae3cabf9181f7f1b80edbc9600baaf82a58ce071e6d61ac9186da788cd5c74f7d82dbba92b643aed56184d474931\", \n            \"compressed\": \"0388213fe94770491690b9bb2e67affd60ce64ae3cabf9181f7f1b80edbc9600ba\"\n        }, \n        {\n            \"seckey\": \"e72015f5f878496fee1bd2367c08b41bbd3bc6c1a211335894770c720f1839e2\", \n            \"pubkey\": \"0496996d21481124a05897031b3c344a9d93d0d49a7eb8f540a6fde56efad9e949cd3d37a0eb08acbba44116b4cdf229343c8575256d36b898eced1e25afe60e9a\", \n            \"compressed\": \"0296996d21481124a05897031b3c344a9d93d0d49a7eb8f540a6fde56efad9e949\"\n        }, \n        {\n            \"seckey\": \"95f84a08c3ec9fd24982f65aea8b99decb9c78d1102fbd222250f3de4ea42845\", \n            \"pubkey\": \"04fa9461c85ffb143c923621dcde37e40d55f2a11a7889020c94ae5fe2ca61c1730c4288eb716475ca92be4efc20581a42a5994527b6220699049340f3f69ca9a2\", \n            \"compressed\": \"02fa9461c85ffb143c923621dcde37e40d55f2a11a7889020c94ae5fe2ca61c173\"\n        }, \n        {\n            \"seckey\": \"b05f24d244367ad30f87d35868e47c4435c26f07c9bfdbfdea0729251a564d7a\", \n            \"pubkey\": \"043dd71c15b5aa5039420298806e2664eb37803f1eb68db0272a77ae1480622cc0fab50b6f174e4c541588507a1e1002bf410616bb404c23b4b5c7c6be68ea9f07\", \n            \"compressed\": \"033dd71c15b5aa5039420298806e2664eb37803f1eb68db0272a77ae1480622cc0\"\n        }, \n        {\n            \"seckey\": \"90a5a1eee056e37dad111be5396f68421b72f2f28780a0a1606536e2be680681\", \n            \"pubkey\": \"04e5d52817f8b0cdec7b94444a4a2d50d675bfb17c7a55c907903f94aeeb3cb9d4ac2c951ac0e80064b1189109da5ea095fd6c7c925a37f689174d6eb653df3ee7\", \n            \"compressed\": \"03e5d52817f8b0cdec7b94444a4a2d50d675bfb17c7a55c907903f94aeeb3cb9d4\"\n        }, \n        {\n            \"seckey\": \"e0132e80577babecc1569cb316dbf0b6946b4322b449d4bc7d4176c05bb15c22\", \n            \"pubkey\": \"04050442ceb6ef43ab5dcece4385baeea664bc914da8cb9582311b8c12d5a5de6ef24e734a4f25a85627807ea6eed8f89ab30e3b56e13ec669f4720ef390c99845\", \n            \"compressed\": \"03050442ceb6ef43ab5dcece4385baeea664bc914da8cb9582311b8c12d5a5de6e\"\n        }, \n        {\n            \"seckey\": \"51709b1bacd93fa9b723397d87eb5cb2a9c8d6b4c6942d88d73eddc26097124a\", \n            \"pubkey\": \"044cd3156c469ff34bc60dd609ef048f7cdb8508f7f2cc953535449cd30153d2bbeb9f9cbff203b3979ef4be9115aad48833c3af49cd9b6e587ff1bc10883bb133\", \n            \"compressed\": \"034cd3156c469ff34bc60dd609ef048f7cdb8508f7f2cc953535449cd30153d2bb\"\n        }, \n        {\n            \"seckey\": \"aebc6ae34bfb7ddc43cf1a6959c0fd0ce85e1b78d38059c407275276a40ba762\", \n            \"pubkey\": \"04aecc7985657318ecce7dd5378c44c2d03782cb5582d2cbf34ad61910ad6148406913dcedf02b842928763c1fb604c8acbb37aa125cc74539d55827d8e3cace3c\", \n            \"compressed\": \"02aecc7985657318ecce7dd5378c44c2d03782cb5582d2cbf34ad61910ad614840\"\n        }, \n        {\n            \"seckey\": \"6d588495386f13181af9d748e28c4543481edff0a4e1362fb099ee2f5597ce2f\", \n            \"pubkey\": \"04b0f85e67301b973b7ab30f80fc3515b5a67ed151583f5a60f4bc64863f72e7197cc1d9cb8f450da9d0bc195a7816348c46efff660012c72fa4f9634e28459cd7\", \n            \"compressed\": \"03b0f85e67301b973b7ab30f80fc3515b5a67ed151583f5a60f4bc64863f72e719\"\n        }, \n        {\n            \"seckey\": \"18ddc91c431dce729026716a1eb3dae15df332d8988caf5bb4e768ff68c4e232\", \n            \"pubkey\": \"04e75d1b82476562a848e2ec35087e3da47c97984b2287651f058e780cc83e992b83b2aff72700e04da8d58a2c08107d84cc11f94e3a23efae088ca369ecaf9d79\", \n            \"compressed\": \"03e75d1b82476562a848e2ec35087e3da47c97984b2287651f058e780cc83e992b\"\n        }, \n        {\n            \"seckey\": \"4c4b02c0b37a23bbc3fc883f962d48682ab3ce039e004d1586dc563cd25a8324\", \n            \"pubkey\": \"04cc2863c04ab285b0b66f2a96fa25d620d3579b23912e25c921232fba841dcfafa61809edad4bddd1d09025f9dafdf1e5b8c6925771babaf4acf0285258230da3\", \n            \"compressed\": \"03cc2863c04ab285b0b66f2a96fa25d620d3579b23912e25c921232fba841dcfaf\"\n        }, \n        {\n            \"seckey\": \"b11222a08a18a3803c88b481fb1ff7763675c1fbbe26fdcc59c116c381ea8acb\", \n            \"pubkey\": \"043bd98ae4d139610886d8e849d156c10a770755cecd229af48222ad3d9b4a3cb0324d539c0282eb334fc4c528af973beb8d92dbb77aa16a82f8181d56563f773e\", \n            \"compressed\": \"023bd98ae4d139610886d8e849d156c10a770755cecd229af48222ad3d9b4a3cb0\"\n        }, \n        {\n            \"seckey\": \"3c62e9a69792b3631a4dd9a146ce8d0a0cafd9c1f421b506381362980ccdb5ba\", \n            \"pubkey\": \"049e640a40ade1408736825a47f3d8df952ace779ace80ac6a1d7079a050591d34332f38e81ef103305f040aa3667d0c2bb1cfcfdd1dfd0ded5199cb6bdd272f5b\", \n            \"compressed\": \"039e640a40ade1408736825a47f3d8df952ace779ace80ac6a1d7079a050591d34\"\n        }, \n        {\n            \"seckey\": \"c82054279ee0f2569b8b54e97b5587348a3051f9e46679a119c5c4b8f2118795\", \n            \"pubkey\": \"041c7906e40d9c5d2e0ad1ba41c5845e2db0ac93f09299c9f3d862b0af530a90351ceb3eafb8779dea1cdc863fc53dc55d3d35408b0fc125dcc25652158a830c32\", \n            \"compressed\": \"021c7906e40d9c5d2e0ad1ba41c5845e2db0ac93f09299c9f3d862b0af530a9035\"\n        }, \n        {\n            \"seckey\": \"04364facd14635a27ca52b84127e2562b6be2e80b3851d09798a6f71dddd1783\", \n            \"pubkey\": \"04577dfdc185f7b4251959e9d28116bfc081990f5b5c517e7afca495e7da526d89efb875652d99ea33e92e1c24f8096a7354bc9cb3fe1c64d96137662bdd61d822\", \n            \"compressed\": \"02577dfdc185f7b4251959e9d28116bfc081990f5b5c517e7afca495e7da526d89\"\n        }, \n        {\n            \"seckey\": \"f010b989dac49b95232bba9e53946522f585bab510961443dc5a9200b6f1e22c\", \n            \"pubkey\": \"0493fd6715873269435c5814192abb2f8014c3b9f5e590e3a6a2e48070bb935c4553f456bc0f30333df6c57605374d0fbc38c4d83dd92cf77e45cdbf3d48e28ac9\", \n            \"compressed\": \"0393fd6715873269435c5814192abb2f8014c3b9f5e590e3a6a2e48070bb935c45\"\n        }, \n        {\n            \"seckey\": \"3fe90a7fa85db5056dcc15d0c84cc7c3d4a18762c213116e9ac43be5eaa43472\", \n            \"pubkey\": \"04c9a2dab7f6f331c27eb951d60433ae667d69b02451b3838919bf346da2819ef344ed7e09ed917c2387f1cd196b53ece2ae2ed7255b821dd947120d6ca3639779\", \n            \"compressed\": \"03c9a2dab7f6f331c27eb951d60433ae667d69b02451b3838919bf346da2819ef3\"\n        }, \n        {\n            \"seckey\": \"a6d67096c9364347fce4bf158b1d6b157e3650ae7666025a90676b6d53923c54\", \n            \"pubkey\": \"04853c6a0701428c1077a410549e74adcbb4b27ce481c398adac0f3f4bd6cdfc15fc5dcc4a446e5d603df050459d9ad554868ceaeadd17ca57e3bce92c6bf5e783\", \n            \"compressed\": \"03853c6a0701428c1077a410549e74adcbb4b27ce481c398adac0f3f4bd6cdfc15\"\n        }, \n        {\n            \"seckey\": \"dad98243ddee3e90b610b6e22008c43c947e10dadae596207a94fb02835ffe8f\", \n            \"pubkey\": \"0408980311df41dba2fe1ac796b08c1e9535a441dfac90cf5d519d907089f15d6d8fdf4d0e2bc7ae38135bb5971fc38f7944c3ba38a5a968aa7c90e4713a279450\", \n            \"compressed\": \"0208980311df41dba2fe1ac796b08c1e9535a441dfac90cf5d519d907089f15d6d\"\n        }, \n        {\n            \"seckey\": \"95d8bcf30e65dd8d7cc5312e401493024c27b83837427ecc5b82c0009af73580\", \n            \"pubkey\": \"04e4dc17cf69cad486285cfc47c6d64611c0fc518f3f5dbd9e034257b83c478b00303bcb7d38d7217e84556c81b5901c8490a8d3133b8cbe73a9136f07008aa6a7\", \n            \"compressed\": \"03e4dc17cf69cad486285cfc47c6d64611c0fc518f3f5dbd9e034257b83c478b00\"\n        }, \n        {\n            \"seckey\": \"0f878b2c96e979d4f6a70e5fd42344cb240d5baf7201e63fdf2fc544e4b4a3ae\", \n            \"pubkey\": \"044674298b9224b612f18255a72f1a15890927b0d8cbbfb82dbda23b9b70676d3b8ba9fe43e5c3eed91343326e2ed063471422bee57543b588a75f72e1b9ef92da\", \n            \"compressed\": \"024674298b9224b612f18255a72f1a15890927b0d8cbbfb82dbda23b9b70676d3b\"\n        }, \n        {\n            \"seckey\": \"bfae15219d739551d6e58764fe08f4b5d8f34f2244faf364a764a515302089a5\", \n            \"pubkey\": \"0447e3ac1ebd77b7aaab483c530f2831b02aef5c98b2b99e9a7733dbf0ac105f341d84f123cb53b8fa6ced5047a81e9af68b0bddac4889eda83d2f80f2fb96f7ba\", \n            \"compressed\": \"0247e3ac1ebd77b7aaab483c530f2831b02aef5c98b2b99e9a7733dbf0ac105f34\"\n        }, \n        {\n            \"seckey\": \"83ec0541559c1a4e75945d2560a3fa9b7f1a936af64ea70b627233f6f495b864\", \n            \"pubkey\": \"04a8e7b01bbf768e43be1199c560c69aab569ebc509d5b47b38937ab2989a64cffeb8ef8aeb57dbd0250c3ea12118328dae6ed329e87f8268c97a101da95611d1c\", \n            \"compressed\": \"02a8e7b01bbf768e43be1199c560c69aab569ebc509d5b47b38937ab2989a64cff\"\n        }, \n        {\n            \"seckey\": \"af0e956760f8db3ca874b23e95b3e8c5de5120a791da9a45d97b6cb0b26c2dae\", \n            \"pubkey\": \"04c44f86a5d8e008c88f74f493846675c1c2730beb3bac6a2e7f8d805d804733179dcd5ad1ff101e747c8d11933d39a8d484ddc1d3e61e12afe645e488369e4c69\", \n            \"compressed\": \"03c44f86a5d8e008c88f74f493846675c1c2730beb3bac6a2e7f8d805d80473317\"\n        }, \n        {\n            \"seckey\": \"197aa509b1e7430942e65b0a91b99b9b306c3012471c013a95e72dcc2785582f\", \n            \"pubkey\": \"04112adba29896d7429da60dfe40a8cd7e56e130095f7a23a118d884356de10dbee61eb5bc90fa142bbfeada9f3ec662aa44a6ad8b2610a9844cc3344ef43c653f\", \n            \"compressed\": \"03112adba29896d7429da60dfe40a8cd7e56e130095f7a23a118d884356de10dbe\"\n        }, \n        {\n            \"seckey\": \"2aa83220c4f99dd3111b8fbefd65c7a43e615f3791a790a8c98b5abdc87a62ea\", \n            \"pubkey\": \"0433e1c2a77c70f6996e2fadc43e21d62ab4805e3fc36eede4b42d9bd10b921162adb6a3a209d4ed0086be06be5f939fa8e7c4093f5dc3f2c95f84c4b2fd703664\", \n            \"compressed\": \"0233e1c2a77c70f6996e2fadc43e21d62ab4805e3fc36eede4b42d9bd10b921162\"\n        }, \n        {\n            \"seckey\": \"95e500b6b3f2cf69808a851e67ff0a930d27635f42a0222ecf2d106a2795c39e\", \n            \"pubkey\": \"048ffcf5c04a3e8ae9525a4c62cf4708e71311c6667a9e0994eef853b20e414791fc036d4ef4feb6d926702d076369359d31880df99c91a349f7e3412c1afb4273\", \n            \"compressed\": \"038ffcf5c04a3e8ae9525a4c62cf4708e71311c6667a9e0994eef853b20e414791\"\n        }, \n        {\n            \"seckey\": \"e8b283de9eff4598f06db07b7a3f6ddb69670c7f56c5ea1eef6efffde19db0c1\", \n            \"pubkey\": \"04ecec3719c6854b85b8dd92235d561042dc46607812bef2f4f67f60ca9d1f532e3be69204f3ef85112fa29ddd116344341b42567657a81693be012dbd551ea34f\", \n            \"compressed\": \"03ecec3719c6854b85b8dd92235d561042dc46607812bef2f4f67f60ca9d1f532e\"\n        }, \n        {\n            \"seckey\": \"05b87ba9d7b790c42903a711a92717995a7ea9ed1a4d66ea195ce973696e4aa2\", \n            \"pubkey\": \"04509d1e9c36626c73e21a4a8dee5613c6c1e458585a88d66c79559a6759db7cdd322dbcd053fd2debd59e31cb9c5787415d9d925f45136c0d96dc26905ee36ddc\", \n            \"compressed\": \"02509d1e9c36626c73e21a4a8dee5613c6c1e458585a88d66c79559a6759db7cdd\"\n        }, \n        {\n            \"seckey\": \"81ca4e7054a91889d49a603edc11e3f4e0660a90f918a18785304da268d68325\", \n            \"pubkey\": \"049bb6a697def098c5db74d8c5790e3650900e087ff61c74e17c8df76df55f4d1da5a3b6847b79ab6b2986c240bf646326aae1e0856e4ea80b50ade9747bb77f27\", \n            \"compressed\": \"039bb6a697def098c5db74d8c5790e3650900e087ff61c74e17c8df76df55f4d1d\"\n        }, \n        {\n            \"seckey\": \"fb11d3b0af2862d459c4f8f08e51f9ea23841a0e86b2152c15d8b813147818fc\", \n            \"pubkey\": \"043aa0bac7c74b4e291f008df47e032b6a9590e6e15bffec5b657a7d11cb42bef776a816cbb60091ce17a2f2471ceb125260304684ac78705f9eba01addd092f01\", \n            \"compressed\": \"033aa0bac7c74b4e291f008df47e032b6a9590e6e15bffec5b657a7d11cb42bef7\"\n        }, \n        {\n            \"seckey\": \"b9b1adab762edbc7309bda70a7c9f11413d3d5e19f54a26425afb0c57f0590c5\", \n            \"pubkey\": \"043879e058cb7decbb9b9ba517cde9ed5b705a149d6b7ba6b35c02bc1657356f597ea55ca30bfe62e44779d28c6fdbf8ce9e86b580a46fec1477b419a77e18d951\", \n            \"compressed\": \"033879e058cb7decbb9b9ba517cde9ed5b705a149d6b7ba6b35c02bc1657356f59\"\n        }, \n        {\n            \"seckey\": \"4647138540759544de92a592544e32fb43e956e58db47953496d7837b32693e1\", \n            \"pubkey\": \"04442c83aa35863ad4ae6b73c815ef1f1c148cfc3b3c3a7099269cb4f79902e42a6adb112135b15192af4881657208d1f2af8533db9941226a7ca0a8e37b8c9e69\", \n            \"compressed\": \"03442c83aa35863ad4ae6b73c815ef1f1c148cfc3b3c3a7099269cb4f79902e42a\"\n        }, \n        {\n            \"seckey\": \"5ee3e8a638a2207a22bb0b6194953345dbcd06a6f0019b65b961937abefe7d9d\", \n            \"pubkey\": \"0423a721f60e3ce5335fe9d21688ab6b4c292c44d89b78d08048c10a5138524c13d19203dd51e628173c52ff043673db574965932d00936c087cac9229ef100713\", \n            \"compressed\": \"0323a721f60e3ce5335fe9d21688ab6b4c292c44d89b78d08048c10a5138524c13\"\n        }, \n        {\n            \"seckey\": \"b377fcbe30dbadb0f464fbaea965e397f45053128444288b8c21c5e8d39afe11\", \n            \"pubkey\": \"0463b1aaf4c2c4b861fa39d11dfd529bfcb227141230812aa49c1f6be36b2feb6a432e18675ca6b4efaf444931b1a4fd15728af9981bd9336019f9f344cd33acfd\", \n            \"compressed\": \"0363b1aaf4c2c4b861fa39d11dfd529bfcb227141230812aa49c1f6be36b2feb6a\"\n        }, \n        {\n            \"seckey\": \"693e9199839edceba0c52f664f52a4562dac2a833a7f6b2a666ca217e8ac138b\", \n            \"pubkey\": \"04c998d2b542b7fd81e75e85c5ea6bdc2961b5a803392a433dd2eae066fe1f1781744d626bad195a61666c030257ca1350e06d02fef1cb3df2439ecd81ff9c150a\", \n            \"compressed\": \"02c998d2b542b7fd81e75e85c5ea6bdc2961b5a803392a433dd2eae066fe1f1781\"\n        }, \n        {\n            \"seckey\": \"02c1fdc05507c9c8c2201d506ace35ca41f63f14aee75d511dcfe18cc4c1051d\", \n            \"pubkey\": \"0433dd2293a391528d14dafa93c43dce3e6e8fe470ecb8b8f6e9e21167d192d09576f8f2a340059351e1d033ee1b560a82c9f48971b93b71da78463d989e76171b\", \n            \"compressed\": \"0333dd2293a391528d14dafa93c43dce3e6e8fe470ecb8b8f6e9e21167d192d095\"\n        }, \n        {\n            \"seckey\": \"5ce2ac317912a2e10ea5053d5003088f4aca3a48515280bda66ed5ce7e784374\", \n            \"pubkey\": \"04a9e6de3f94fddfd38195d52b5fb4d78cf2f1ea461dd8e239b4aa8b6766ca01921c1a2a16d268663c0a04dbc6aeacd5304f6ac60a7b92e084e75262846383b7d2\", \n            \"compressed\": \"02a9e6de3f94fddfd38195d52b5fb4d78cf2f1ea461dd8e239b4aa8b6766ca0192\"\n        }, \n        {\n            \"seckey\": \"06b280efe10c58d95da712f18eccd68b38145b6941cf11ab96bc080ef382579b\", \n            \"pubkey\": \"04b3e3f7ceae95b6a78be3e34cdd6ed437097fd760b168b6023d363cb3ecf8ce7e77c19f23db8c3d1378d4117fa758e632fcf8dacfacf66d323b4a5cf2f06b9140\", \n            \"compressed\": \"02b3e3f7ceae95b6a78be3e34cdd6ed437097fd760b168b6023d363cb3ecf8ce7e\"\n        }, \n        {\n            \"seckey\": \"06cc6542dc2620d2cdcd74da524f188cee9831dd0fa06d512c23a89378cb0d62\", \n            \"pubkey\": \"048a0fd136773b02513690cc6b9c218a0f16d7c59b6c9686c3b334b012daf02469e16e26070af46417644509f0fe0daea0cb7abf5e18138210a9f84afb6aaf7339\", \n            \"compressed\": \"038a0fd136773b02513690cc6b9c218a0f16d7c59b6c9686c3b334b012daf02469\"\n        }, \n        {\n            \"seckey\": \"ed7f15c7eda42bbcd8f983486cde0b91b2249fe944170f85c7e534aa865c6a5d\", \n            \"pubkey\": \"044301e26be724e08fe8828955a76a81ba717f7a2a7bcbb62b73e900c15e20a90dc8fe980dfa305050efe9ac5f5b7c94bf7f76286fb72b59a63ad16b6358d811bf\", \n            \"compressed\": \"034301e26be724e08fe8828955a76a81ba717f7a2a7bcbb62b73e900c15e20a90d\"\n        }, \n        {\n            \"seckey\": \"3f5c6f3ec66fa9a1d485abbad9985f5acba9abf299eeb9e0b744c16ab242c5af\", \n            \"pubkey\": \"04d1aee94b7bd5036e2c1a9f3899f36b3f21cd5d84760925c5fa679eac55545917e64cd98c6f35df737269198e1dd5d676371b62d8146c6eaf0ee0e37ee79ba912\", \n            \"compressed\": \"02d1aee94b7bd5036e2c1a9f3899f36b3f21cd5d84760925c5fa679eac55545917\"\n        }, \n        {\n            \"seckey\": \"8551960b049bd457487032d39204ae89cf3ebf59404fad04d2a2a386ec843e64\", \n            \"pubkey\": \"045f573d94c064f27a09acc774758cafbfc6bf6f72756f338a3ae0fb9f7019279b1ebbfe5d8ba78047ce205a817164febd7c2eb721a12236f3fecbe6bae84cc804\", \n            \"compressed\": \"025f573d94c064f27a09acc774758cafbfc6bf6f72756f338a3ae0fb9f7019279b\"\n        }, \n        {\n            \"seckey\": \"d8468abdd6ad35d8c234aeb4176e864175c8a678eb1b237c0b614c73c16f0bd2\", \n            \"pubkey\": \"040cd275e994623b636793d740cb371d7baa78784d06c3de490dd12bd233b10f0861ffae66a5705197f0bc9874b207d21c16403e828d3bb6ab37eb44a61172125e\", \n            \"compressed\": \"020cd275e994623b636793d740cb371d7baa78784d06c3de490dd12bd233b10f08\"\n        }, \n        {\n            \"seckey\": \"353eda679efbcc1df683b3507e3a7f6d0d2f23fd275eb38dad7b5f90fff15404\", \n            \"pubkey\": \"04b7a68bbace3246e89a75293cb8dd85e2847080ea8ad32079434d41b1d5e5fc50d96af378e78410a7bc28a96d141a6902eff19dc548c9fecc4d68e35ab3d284d8\", \n            \"compressed\": \"02b7a68bbace3246e89a75293cb8dd85e2847080ea8ad32079434d41b1d5e5fc50\"\n        }, \n        {\n            \"seckey\": \"54710afe04dbbb547e1869043f22ad5facf2a4405094673a15c9d68a3d3ee3c1\", \n            \"pubkey\": \"04f93299525f23645141f9dfcba8559b5d0744f71c8151538908fbf3eb8b44d602b4394ea8d6af4bb01c972a8bcf7a919288f6fb89aa722c4a7361ece2924bd297\", \n            \"compressed\": \"03f93299525f23645141f9dfcba8559b5d0744f71c8151538908fbf3eb8b44d602\"\n        }, \n        {\n            \"seckey\": \"4cb7f15328365ba8d86f96b8dd6da8ceb42b76c3e4dd984ec64eec256fed4486\", \n            \"pubkey\": \"046ded51928ba33950c76d8802aa64f356c5d65f641fa40262c72c8e95d3d1b28fcd4358ee3e3a0f5fd8f397186bd897a7c0654ae0f4adaac9a00391b0fdc67c4b\", \n            \"compressed\": \"036ded51928ba33950c76d8802aa64f356c5d65f641fa40262c72c8e95d3d1b28f\"\n        }, \n        {\n            \"seckey\": \"35b8ae6adf618dedde394233c366b3f4c4898764e56a3e13d161001aec0a7d45\", \n            \"pubkey\": \"04abc78b9caed489b16d3fdb77b27b5f29c2afbfe60542d967c6d478dd9a3e5e5525d25afd12ccdd48737a8077b3edf9dd0fbeeab28f1241076671141c6149787b\", \n            \"compressed\": \"03abc78b9caed489b16d3fdb77b27b5f29c2afbfe60542d967c6d478dd9a3e5e55\"\n        }, \n        {\n            \"seckey\": \"8990f7a1831ac179413206fdf71d134866cecd93a8c9cecc5a70b5b0a52f5293\", \n            \"pubkey\": \"041f86190586677d923778a48e2a46b347f81a3004b31e180e630b2ae3e6929649176bd1347bd3b2ce110ab675345c0567565b151ef3b8ae94e7e6dcd4661d0e6e\", \n            \"compressed\": \"021f86190586677d923778a48e2a46b347f81a3004b31e180e630b2ae3e6929649\"\n        }, \n        {\n            \"seckey\": \"2b3e695caeec1d58a26e5c3fe4effca41f673bee760fe485a7426477a99ada10\", \n            \"pubkey\": \"04c9ee41d358174cc80ddbf116fd76e2e39e94a1337afe36f876864756b1e937167857bea2ab92763f6afb968dcdde164e80f8da9e02a8ea5dac49829e59b09795\", \n            \"compressed\": \"03c9ee41d358174cc80ddbf116fd76e2e39e94a1337afe36f876864756b1e93716\"\n        }, \n        {\n            \"seckey\": \"10341dea0e5cf93de8838da424aa97acf6aa8fbac5942b927552eeff9d219e26\", \n            \"pubkey\": \"048e491849dc797f51c91c47a543ef51e82d622d92238d26f2f1e1b2a22d6655f29d07775b73f7adefb8971411c62c94bdefdfae7a7f8c1c4655f8820fa69350ba\", \n            \"compressed\": \"028e491849dc797f51c91c47a543ef51e82d622d92238d26f2f1e1b2a22d6655f2\"\n        }, \n        {\n            \"seckey\": \"8b2c63d76e2fbba7e55ce5471a64d208c4d954a1f9452d6cd5fe922c3ac100df\", \n            \"pubkey\": \"04e5239f0ae2b5faaad802f6172a84e80f6df6a510a3e3d88cea8b7ae3b42ded8af93a11acf6031c6815df2efc3a29b8d7cfd2736207071b472d95498a2802f09c\", \n            \"compressed\": \"02e5239f0ae2b5faaad802f6172a84e80f6df6a510a3e3d88cea8b7ae3b42ded8a\"\n        }, \n        {\n            \"seckey\": \"ba7b79b60b0a6f4ee13657a9b1c3cc968ead8288770c20335baf39f368dffa24\", \n            \"pubkey\": \"04dcf683cf055fbe3e589bec3c99f1386b081e9a0e620ae22e37040fa7861cfa3ceea0821294918a44148d4d1fd435e924a6ca7a5cdd374a6e5389fb7175bea7d8\", \n            \"compressed\": \"02dcf683cf055fbe3e589bec3c99f1386b081e9a0e620ae22e37040fa7861cfa3c\"\n        }, \n        {\n            \"seckey\": \"b7417d163e90e4e8df90b7764f4e1cc23db768b39451c9fce5980b00278f4d6b\", \n            \"pubkey\": \"04e4de1b22d3ac68aee7d6a81ac95ae146b8dd0de2f5b6eee29b946f9346af8f3cceb14f06d9d2851eaf8e5cb4f826c758b1fed0f53181534244a9491033436e11\", \n            \"compressed\": \"03e4de1b22d3ac68aee7d6a81ac95ae146b8dd0de2f5b6eee29b946f9346af8f3c\"\n        }, \n        {\n            \"seckey\": \"42d97bc7abdb0aaff2de26ff64ef4c4b0053ff844c834d7df0ec9f0f692c2558\", \n            \"pubkey\": \"04d845d8773c79b641f1243418bdae8d9ce626f799acef599c9852ff882d5d2569f00f3b31c97b02d49d28428bc3dfb0ee6b02c5c308ae3727fdd909c173a5aba9\", \n            \"compressed\": \"03d845d8773c79b641f1243418bdae8d9ce626f799acef599c9852ff882d5d2569\"\n        }, \n        {\n            \"seckey\": \"666bc22ccdc22d36238944765748ad1486214f6873f6782d37819b9d6ec01ecd\", \n            \"pubkey\": \"0456c9186660c955afdca716a70c9e086eb43496cabb3bfaa8303eb2531dfe30e8eed961479d245c4335c04089960a927e98fb6b8c9777c65c310d0e44cde738b5\", \n            \"compressed\": \"0356c9186660c955afdca716a70c9e086eb43496cabb3bfaa8303eb2531dfe30e8\"\n        }, \n        {\n            \"seckey\": \"5c48357a1ce14bb14a3037ff8907a0c0b19152a74ba920bb4d6253849a2a9912\", \n            \"pubkey\": \"048b35df900dca0d419392d5dd058695e9cca90ec632b4c3f3156469855d3e7b72c217c006271165f40ef5971aecd9f25b72040aa1f30a5136abad8dff9331a2e2\", \n            \"compressed\": \"028b35df900dca0d419392d5dd058695e9cca90ec632b4c3f3156469855d3e7b72\"\n        }, \n        {\n            \"seckey\": \"5bde1eab384e20d783717a60d42572972b1f0b829ab2520f6e8caa47609c7644\", \n            \"pubkey\": \"043c62ef54889120ff1eda934b6b9f5c3be0615867a3a8a6a63181ccf04cf8d3608371c1965692fc2b5cc9527f92160a6a19d8d1d44927d66031ef3636e98b7653\", \n            \"compressed\": \"033c62ef54889120ff1eda934b6b9f5c3be0615867a3a8a6a63181ccf04cf8d360\"\n        }, \n        {\n            \"seckey\": \"6fb00b23f212c55ce59b97bc630e859a38724c4c0134169f6be410ddde17b73c\", \n            \"pubkey\": \"0411e5f6fe0b9065e0abbd2110f7d4ce4731a725b6111b327d9e8179762c73979d4326032115a6b6a7832ad582de27e0c5dd40fc2e131df20f7b7c039a1d4aca3a\", \n            \"compressed\": \"0211e5f6fe0b9065e0abbd2110f7d4ce4731a725b6111b327d9e8179762c73979d\"\n        }, \n        {\n            \"seckey\": \"c67d814e7136a23a144fdc54966c616fa6a972bf4c7f5ad2156871ffc6e896eb\", \n            \"pubkey\": \"04c05b797066bbed39dc5ff33000826c303a8c36415c82dbb94916cbcebaf142a6dba706bff3c2dfaf4fd7ee52557905fccf29d04fffed2dbe38e104a88079d5cf\", \n            \"compressed\": \"03c05b797066bbed39dc5ff33000826c303a8c36415c82dbb94916cbcebaf142a6\"\n        }, \n        {\n            \"seckey\": \"eb2508fa91298b07f4ec97019713cb244438a66fd5274825dd0fe91dbd92224a\", \n            \"pubkey\": \"04161708fa4f9d67d38b994845e1f06464431276dbdc03831b45194509038229eb782df53f48ab4fe905116a72b8b0f5ae99b7d5cf6e0b63053ccf34327060de17\", \n            \"compressed\": \"03161708fa4f9d67d38b994845e1f06464431276dbdc03831b45194509038229eb\"\n        }, \n        {\n            \"seckey\": \"0807ae0ef4f4081c3a5e9743047e3fac375c5cb6988967f8ff785c53571264d9\", \n            \"pubkey\": \"0465c11c4ef64b630f9a820b86509db3bd7b8bba0c284d3512d155bf8be806bb5cf39f6b6dd0d3d2f3b6c46e2deec7ae20fe217eb3d5b7fb38459b74533c5492ce\", \n            \"compressed\": \"0265c11c4ef64b630f9a820b86509db3bd7b8bba0c284d3512d155bf8be806bb5c\"\n        }, \n        {\n            \"seckey\": \"a4107eb974ea112b735179ce2c9d6c19650cf387584d9d785744ce55d6e026df\", \n            \"pubkey\": \"04f45ecbf972e558f1056d54acc989cff0aa19feb638bd2ab5d16d30cc2d6b58cd4b0e1748ba61514898d7adb5ddc0e7cf7986a7c9a72934530ab4781635dcdd53\", \n            \"compressed\": \"03f45ecbf972e558f1056d54acc989cff0aa19feb638bd2ab5d16d30cc2d6b58cd\"\n        }, \n        {\n            \"seckey\": \"f2f2a580982d0ba4fca05e652dcefc2d2b50ac73312187c0632a7be2d700daa8\", \n            \"pubkey\": \"0472691d13f11bb1b04959546f1109d6e600631e6b00dbd4087f77c99ccbd569f82a2b8c18cab9d73c9d5f28742a4e28a89b00f04147d6747b5ba01427c1fc5704\", \n            \"compressed\": \"0272691d13f11bb1b04959546f1109d6e600631e6b00dbd4087f77c99ccbd569f8\"\n        }, \n        {\n            \"seckey\": \"2f62f4950db39668115b018badda70d0b2484cec1792eb6a746272631473e926\", \n            \"pubkey\": \"0497aee6f25947d62b101fff2fdef1e09fe76da72a2468b7114dd35e927e1dbc3d62c229a6cda096c74f194065a7d8aea08df3e85f970951ac6355dc5b184fe1c3\", \n            \"compressed\": \"0397aee6f25947d62b101fff2fdef1e09fe76da72a2468b7114dd35e927e1dbc3d\"\n        }, \n        {\n            \"seckey\": \"ac0a90f2dd1e0be47777bb765b2f9a17a7549d74a56899632f1bf8e4837c8b45\", \n            \"pubkey\": \"04776edbc6dbbda35e45239ad5e28597c1d80bd5097314a1c79dc7f53857b266b72a3f08a86112809006fbf2606c720e81a30f8e6e81ddff3ef2fbf12665370754\", \n            \"compressed\": \"02776edbc6dbbda35e45239ad5e28597c1d80bd5097314a1c79dc7f53857b266b7\"\n        }, \n        {\n            \"seckey\": \"d468b31eba5309ee3938a98dbbc317640b7592225cbe4f5d4a21b818cc9eb38e\", \n            \"pubkey\": \"040c8271fffc71e9daaac580488ab7b43405ff759c4722d5dac030ecc1b2964461ee27f3d27143bdd922c7712604a5d8a2e88ece29080e47f210a1f872517388b5\", \n            \"compressed\": \"030c8271fffc71e9daaac580488ab7b43405ff759c4722d5dac030ecc1b2964461\"\n        }, \n        {\n            \"seckey\": \"be2195f123960b14fb85cc6125707e2a08c93ef09717976d57c3e30e96e0eeb0\", \n            \"pubkey\": \"04339365024630be6df1e8735b98195a3bdbeecf0f4dd5be9fda3f304aa828979836e8de81321af3dc3f4951132d52faa3094dd9cff44d8688ab187010ecbf3cc2\", \n            \"compressed\": \"02339365024630be6df1e8735b98195a3bdbeecf0f4dd5be9fda3f304aa8289798\"\n        }, \n        {\n            \"seckey\": \"b12352c20e41da70a44d8f1ae46ef98a596b0eab48872c7eaa256012b36e302b\", \n            \"pubkey\": \"046f75becca320244f14a08722309ed3eb54a8f7ee4c97613388b8700b8f55e0207a5f05fc3cd5754338ac81b361060e220d40f3717dedb2ea08878ba0e3a72427\", \n            \"compressed\": \"036f75becca320244f14a08722309ed3eb54a8f7ee4c97613388b8700b8f55e020\"\n        }, \n        {\n            \"seckey\": \"2e0ddfee2755ad1a3fb4d53986436085b28152d04b3c9d5c0c2ea16ae7f94314\", \n            \"pubkey\": \"0446b310e2d5323fb6e5b7298e5ba8caf9920fcc9a3d01fc818adeb62f37b8e515fc9fb451f3005744c07f8bdab8cb5277ed5f27d38bcd44b813917058930289fa\", \n            \"compressed\": \"0246b310e2d5323fb6e5b7298e5ba8caf9920fcc9a3d01fc818adeb62f37b8e515\"\n        }, \n        {\n            \"seckey\": \"c01807e4b26df9bd22ef5601f4569e79cc365507f2ae46eb7d38fc2afcb999cc\", \n            \"pubkey\": \"046a0815be9c5712064b2ee4aa4ed2db64e44f2932dfa96c2d530d6b6b34d1deaa89898f74ace7f6e1e98a32c20e0104d139511fb629feda0da1e2f310ac9a3c09\", \n            \"compressed\": \"036a0815be9c5712064b2ee4aa4ed2db64e44f2932dfa96c2d530d6b6b34d1deaa\"\n        }, \n        {\n            \"seckey\": \"6a2482cf665f39e5b85177c48ff8b9a7e4faed54881cfce4dba1a5517184ef11\", \n            \"pubkey\": \"042cd42e99c9b3320aba8659ec8bd501e396dd854b5a5f0f4e2681f73fda90294c87cacb5c21beabb5d7fa54609331a0f90efbd30003e4e9d61e7b7fcdcfef870d\", \n            \"compressed\": \"032cd42e99c9b3320aba8659ec8bd501e396dd854b5a5f0f4e2681f73fda90294c\"\n        }, \n        {\n            \"seckey\": \"5d290e47c5f4e75dfde01aaf5068f68c17bd74d5e9d097e67a68ed80d4ec488c\", \n            \"pubkey\": \"04367a71d9e8a40d79dbae2bb7573b88a2350a985665fdeb94ae1fd09f568f68f7ab5c7c54de1c03cb84674a97efd3b0e633c58fde6ba7e6d9fce1bd6e6c770d3a\", \n            \"compressed\": \"02367a71d9e8a40d79dbae2bb7573b88a2350a985665fdeb94ae1fd09f568f68f7\"\n        }, \n        {\n            \"seckey\": \"36483348b5cc50cbf4abd527e62cd2e12ee2eb43fc54af3bb97b8c833be985af\", \n            \"pubkey\": \"04165f24e170a60dad84ce68e0476596db365927d798b59942eae79832144ea6b8df9f482d8cbe2d453d734cdfaa6e0d1c77f01e5d04e6512db1a99c85eb64a777\", \n            \"compressed\": \"03165f24e170a60dad84ce68e0476596db365927d798b59942eae79832144ea6b8\"\n        }, \n        {\n            \"seckey\": \"f9948072d240b1479e2e8c2c4510784804bab6e7317e2b2a1c1235437ba12a0a\", \n            \"pubkey\": \"0451d8a590901c9014f8cd4f5f227dcee87fbb8f67757108c12a3692084117306a15663a3d0e2ce58fd6c9c78c2ae657fd46d9e9f495268d9d725e62e0013d7310\", \n            \"compressed\": \"0251d8a590901c9014f8cd4f5f227dcee87fbb8f67757108c12a3692084117306a\"\n        }, \n        {\n            \"seckey\": \"de71012781ccb1fc11981f5388790218e8a62d073b7df82687345da1469b82b5\", \n            \"pubkey\": \"04be86d597f8c72cc59b5392878857ffc9bb9ed76c12df86e60dd06f23317e0336bee52b479f89b1004023983714b93fea3a24cc65a2dcb6642d58e80e91ffdbfe\", \n            \"compressed\": \"02be86d597f8c72cc59b5392878857ffc9bb9ed76c12df86e60dd06f23317e0336\"\n        }, \n        {\n            \"seckey\": \"a9ef26a1d4e2e3fe824216a1d365462d5c7b59dab97fd8b919a8bf80cca5685a\", \n            \"pubkey\": \"045e3e37fecfba917e3efcf392db30eae6f35ed0b731b9b4dce4b4c083bf030236e8487deed398193777afcf479a25ecca480382f6b9b20e030ca7f482e256de92\", \n            \"compressed\": \"025e3e37fecfba917e3efcf392db30eae6f35ed0b731b9b4dce4b4c083bf030236\"\n        }, \n        {\n            \"seckey\": \"06bfbaeaa274352b95d3f05616e4411278187dea770a3d24f8325120bd90c7a4\", \n            \"pubkey\": \"042c19bac2c4a3aa3d4acf774641e0a7e1a5086ff83da292e13d876a0a59d056a25589c633327730a14169a2bc465ccf4d80d1e6bdd34cded2137bd0f97ff7f4f1\", \n            \"compressed\": \"032c19bac2c4a3aa3d4acf774641e0a7e1a5086ff83da292e13d876a0a59d056a2\"\n        }, \n        {\n            \"seckey\": \"1a7308234695dc004867254badd292bb57bb04689df8e8fd34a211d791788848\", \n            \"pubkey\": \"044753eb2ce066a68f5c913cdeed1e6a45dfcec7ec68f792c9804d4d06d81082dc359eb027aa153ba231921e14f8ae1d221ddb300b80c0fbb5b1f1d78dc45339e7\", \n            \"compressed\": \"034753eb2ce066a68f5c913cdeed1e6a45dfcec7ec68f792c9804d4d06d81082dc\"\n        }, \n        {\n            \"seckey\": \"c58351b69a0bcfd5846da95ca94baac002a9f1378a94ea27a00b011ebeca1acf\", \n            \"pubkey\": \"046d00b101c02bea79b3a04de09cf42b536944843753399466b88c4dcc212804e6eaec1639ab76556b754b0167a44bef9ea5bf8e37851aa7ecf52bbf0d01c27eed\", \n            \"compressed\": \"036d00b101c02bea79b3a04de09cf42b536944843753399466b88c4dcc212804e6\"\n        }, \n        {\n            \"seckey\": \"08daf9fd5e015d1e2b79577e90ee80827c22d10cdc816cdc6f001c327fcecfad\", \n            \"pubkey\": \"04a76ec89b588c9e08dc2172e5fdac72a2a398ce0e743120c43b3a364719deae68efc194047895fce06c4046b87e66b8e59d3d8fda5c156e1d000b5bc35c529cfa\", \n            \"compressed\": \"02a76ec89b588c9e08dc2172e5fdac72a2a398ce0e743120c43b3a364719deae68\"\n        }, \n        {\n            \"seckey\": \"649657875915961707ec0a2280503d22b9b20cd9b40c4a960bb3320fa0981f68\", \n            \"pubkey\": \"042e9c9d477dc2f81da2fbfc4b9f010d3513daa7a7a6b8890dd2efe1e6af2e96b3a7cf6e57bf3ed476466b151191bf1ae25adc86ae35c0fcbbc3918e8b82e45327\", \n            \"compressed\": \"032e9c9d477dc2f81da2fbfc4b9f010d3513daa7a7a6b8890dd2efe1e6af2e96b3\"\n        }, \n        {\n            \"seckey\": \"2ac6ccd4a4d9259b960deabba6fa6f28bec449e4ccfc1c66430660fa26d950c1\", \n            \"pubkey\": \"04e0cc42f01ecd1d663870b0716b131d5feca615899cd9efda06e68b9626ce23380c2ed0533e88f6fb30e174514958738f01b5088ec024e6ea376fc8ee025080a3\", \n            \"compressed\": \"03e0cc42f01ecd1d663870b0716b131d5feca615899cd9efda06e68b9626ce2338\"\n        }, \n        {\n            \"seckey\": \"b5c2b23aa977823d06c8cbc697db038a66f9c800314d95983b29dc7389c80031\", \n            \"pubkey\": \"04646273ac102068ec22f47c5d2b8ea636fa30549f067a464d7cf292f166af8407b4b70154db3164a9067b074a6481e26de6f6d8862cc8c35d20bd4c8e1238648a\", \n            \"compressed\": \"02646273ac102068ec22f47c5d2b8ea636fa30549f067a464d7cf292f166af8407\"\n        }, \n        {\n            \"seckey\": \"4a1e575316129af5ee7dd2468d043fc38d43d14589979639ec70eb591f9b0464\", \n            \"pubkey\": \"04d1271d75c9ad0f5546007fd893182f377de92ccc7a0d87688a2b51367993e227b4c8e7986f11295611d2f43d4570c7e08d2d4e68611397102a0ec1b478d5eabe\", \n            \"compressed\": \"02d1271d75c9ad0f5546007fd893182f377de92ccc7a0d87688a2b51367993e227\"\n        }, \n        {\n            \"seckey\": \"c8b6de1b36c7601ab8ccda33641b38e4720a68018a8af4f13408728d873f8105\", \n            \"pubkey\": \"04610b4406a41a95e2a03d8e925ce8ca98076ea99f0569526ebc1ad776ac742af13e5634d3897b4c6967acef940e63a02fcce94d20ff12c714929112494bcea318\", \n            \"compressed\": \"02610b4406a41a95e2a03d8e925ce8ca98076ea99f0569526ebc1ad776ac742af1\"\n        }, \n        {\n            \"seckey\": \"a751c11936a1127aec15af9898c85332c46254c2f25b32f79d91114ade50d924\", \n            \"pubkey\": \"04ffc01b3b1b126ce7e2323c4f0a1b599516863a154685ee92a5e86fa84cbfc297686bffd283a4d712ec6b1f8c030fa6c9f77cc52ff7b49dd7abdd2fb93e9e30fd\", \n            \"compressed\": \"03ffc01b3b1b126ce7e2323c4f0a1b599516863a154685ee92a5e86fa84cbfc297\"\n        }, \n        {\n            \"seckey\": \"09f1f2a080b5d564ef31e6b4d4f7806a6b242ea90d5ff7398153fdd129506864\", \n            \"pubkey\": \"04991deb2bdc15b93dd384da53d7ac832173181db6a17b5b4b527411e70b29b56a160a20e038060c3470a61b4bafb72f771b076df0533a438c7bd8638c54056b90\", \n            \"compressed\": \"02991deb2bdc15b93dd384da53d7ac832173181db6a17b5b4b527411e70b29b56a\"\n        }, \n        {\n            \"seckey\": \"7c2b8c50a96d6ec7187c098f01792f22520e7fd366c2e9a6b7f79039e9d112dc\", \n            \"pubkey\": \"04a8e0abed964336c5712c46603ec3962cacbe1feea8c0657e22adc7da04c2f40b3475833fb76dfeba5dea41d4110fba6ded22be83c1fffeb9150aef5a0568fbe9\", \n            \"compressed\": \"03a8e0abed964336c5712c46603ec3962cacbe1feea8c0657e22adc7da04c2f40b\"\n        }, \n        {\n            \"seckey\": \"12c14a82178ba469d6aca8d54ffecc0a52e9617004315b39e31229f0d164e096\", \n            \"pubkey\": \"040cb0db33039ca4f648ac314f2ee58b910ba52ab72c11741c7a1d6879f5b120c2007a90d316be262dc1921397476ac932034b360bbfa5f9d1e6c608f464522318\", \n            \"compressed\": \"020cb0db33039ca4f648ac314f2ee58b910ba52ab72c11741c7a1d6879f5b120c2\"\n        }, \n        {\n            \"seckey\": \"0868b14e79d7ddf4299d4335342aa01e333c778e43c3911d6c1948e0ac6e3748\", \n            \"pubkey\": \"042397fb18793cfeb4d9615431d8de5679025bb9b98d852d91c36639340cd776842129726a1067aa451da4f7da425bb131024c61b0c31b4495d90874dec38e9660\", \n            \"compressed\": \"022397fb18793cfeb4d9615431d8de5679025bb9b98d852d91c36639340cd77684\"\n        }, \n        {\n            \"seckey\": \"8c40f72d01e552136164463261af28d883b0f1f7d6e42be136610bbb79fad091\", \n            \"pubkey\": \"04b33d9ff42918355841642a814bf3665fa59d5571aebfea820a3da5a182915e8384d0f910f911ca233083042d44b9ee985bbe124e8664036340c1405ff9a9b09c\", \n            \"compressed\": \"02b33d9ff42918355841642a814bf3665fa59d5571aebfea820a3da5a182915e83\"\n        }, \n        {\n            \"seckey\": \"7f6fba226278a4f7567bf728224edc8d2eabb7a22dd3beb13b47f0f183925ad8\", \n            \"pubkey\": \"0482b7ccd7bbb27106f720d7e6cbc22b868e1878637eec8e9e6e5ae8423c6edce4c9fcbceeea6d14bee63b30a9ec3b9a148a69c269ef2d97f4921993607efa5e3c\", \n            \"compressed\": \"0282b7ccd7bbb27106f720d7e6cbc22b868e1878637eec8e9e6e5ae8423c6edce4\"\n        }, \n        {\n            \"seckey\": \"4890ef2860f2dde47cc521a1d35fc23f473c96975f5c88736968903b8fda9b06\", \n            \"pubkey\": \"040df10559b86fb66e02c6d29d7181f0e2492b8441cd60bbcc11f26ba87da30a9494c638eb8340266b26e9a7dfe6b658d0fec7d853453a5cedcda8f977987b8fa7\", \n            \"compressed\": \"030df10559b86fb66e02c6d29d7181f0e2492b8441cd60bbcc11f26ba87da30a94\"\n        }, \n        {\n            \"seckey\": \"28d32827b483601efe34a40e2369a2ba932583c6d0fb150224b1afbbcc49316e\", \n            \"pubkey\": \"0463f5836e30018cf20f1f882d7ae6385c0fb45c4925f7b6031e266bf2d26c99682eb15dbae59b49cc29d5d01c3811708fd5a5b3af742ffceb736631fa7fa363ad\", \n            \"compressed\": \"0363f5836e30018cf20f1f882d7ae6385c0fb45c4925f7b6031e266bf2d26c9968\"\n        }, \n        {\n            \"seckey\": \"d00079d5acbd55fe6ab17ab7ebae3025a95eb93e488d1477eec80be96ea2b573\", \n            \"pubkey\": \"042766a70d92bdee772919e596099919b7b311be929caad48feec29e0e964a5ab30070db486c81f41e5685b903058ea0a9d6cd06429d31b7a64edcbb740b8f0b48\", \n            \"compressed\": \"022766a70d92bdee772919e596099919b7b311be929caad48feec29e0e964a5ab3\"\n        }, \n        {\n            \"seckey\": \"a8050c0a878f08d3febc2aa4f7b1b9d96b8c19e412b5f6e6d723244a176a9cc3\", \n            \"pubkey\": \"04c6cfbfee79f7cbcde80dbc5cee00646c5fb215d72459aba0cb15cb4a64e4522c856aa96607e84051c992e4d476cdbe7eb3e97a9b46de1d0716ecb1397c4d8b9d\", \n            \"compressed\": \"03c6cfbfee79f7cbcde80dbc5cee00646c5fb215d72459aba0cb15cb4a64e4522c\"\n        }, \n        {\n            \"seckey\": \"4108e3a68d9e0cc879e246c199ea4baa5d0db2421c401a84866a4ebe02cddeb2\", \n            \"pubkey\": \"048857941502dc7dbf7fbc4dfc5a6b8760df817b318851e79ee664a78d8dea5bb4cefc4da5088a3c01df45c26ec79d233c175ead9003e0be0e7ea75ba1416bfa37\", \n            \"compressed\": \"038857941502dc7dbf7fbc4dfc5a6b8760df817b318851e79ee664a78d8dea5bb4\"\n        }, \n        {\n            \"seckey\": \"7d595e98a7db5948fad561ebb439a9da1ac7ecfd364c08405fd2806d38668fa1\", \n            \"pubkey\": \"041bc169ee0201b942c2ebdda7f4ac7bfcb5a6cb06f1983db4a67975fe487e9ba665987093cb0656875f02b536ff9cd319b87e91aea92b06dbdf7986d5184cf786\", \n            \"compressed\": \"021bc169ee0201b942c2ebdda7f4ac7bfcb5a6cb06f1983db4a67975fe487e9ba6\"\n        }, \n        {\n            \"seckey\": \"b5a437457cf0f59fccd5d6f4125e28f00327b4aa993633008cdb577cd6f6dfc3\", \n            \"pubkey\": \"0432bd454b83a6950c1560e23c8d98d4173fd892cb2db89490db2e427d46248ba61782f679143252dc00169c7ce86be3bc4a79b2173e1d777ed1a60594b882aed4\", \n            \"compressed\": \"0232bd454b83a6950c1560e23c8d98d4173fd892cb2db89490db2e427d46248ba6\"\n        }, \n        {\n            \"seckey\": \"c5dc56ca6ac23f09998c06697a8511d51649bcfae46946b814d1c7c7fe6e1e87\", \n            \"pubkey\": \"04373ba43ca8d1b252082bad42d18a3514173ca0583e669b3fab87712985129909ec7da9bbf44754c691daeabf6423ffb3c563ae4c5924b2ec0294831d466f35d4\", \n            \"compressed\": \"02373ba43ca8d1b252082bad42d18a3514173ca0583e669b3fab87712985129909\"\n        }, \n        {\n            \"seckey\": \"3a3c8b0a742f9019303704ac2a0b8c73b33ed5c2a3146b43c54173443e614980\", \n            \"pubkey\": \"0411ddf069563965222d874d2fbd6a36411cdeed68d136ae3195af420a32c45bb9b009b297b24714c6accbefea521cdc3b7641f086923a100fd3a212add019b7d2\", \n            \"compressed\": \"0211ddf069563965222d874d2fbd6a36411cdeed68d136ae3195af420a32c45bb9\"\n        }, \n        {\n            \"seckey\": \"873356641a88407dfecb074cd9a791003ec94914ccec5db46ed06b43668e0cf0\", \n            \"pubkey\": \"045ffcb241e493cfb5d1336304ca078128b7a3f85cf2cec4892c2595acd2b2f7e8374de6e20c49bce82e123b9f5fa12ba7492e979229f79d02ea758bde83d476f6\", \n            \"compressed\": \"025ffcb241e493cfb5d1336304ca078128b7a3f85cf2cec4892c2595acd2b2f7e8\"\n        }, \n        {\n            \"seckey\": \"776294471712cc5e9365f4c110d05948098ec9969a640e5613cfa3ff7674f6c8\", \n            \"pubkey\": \"04936773bb1d7cfadd286917f6952b7df25fd090927ec639abead4ae9b77d25051b644311df9dfef650b5f30f3cf9eb4e0de9420f41bb1aee869bc3d0c815a2b17\", \n            \"compressed\": \"03936773bb1d7cfadd286917f6952b7df25fd090927ec639abead4ae9b77d25051\"\n        }, \n        {\n            \"seckey\": \"dd115ee7c1ebcb491be9cb307dacd6b3b2aee31ede9d20c5ff9c6395c79af497\", \n            \"pubkey\": \"0447d312cd4a4dc8e430b2444722df0387d1bad7e9c34845d1fa967ead88f2d3d3875c3201aeec6af004a1703b04936cc6f172de2c80c8a5f938a211f83f85d7ce\", \n            \"compressed\": \"0247d312cd4a4dc8e430b2444722df0387d1bad7e9c34845d1fa967ead88f2d3d3\"\n        }, \n        {\n            \"seckey\": \"1db047a0ee70bd85e46b8715246a05938147b49d2a85b24c53381507cfef0ab2\", \n            \"pubkey\": \"049a512559806c1712da0af7a9226c3fde4b89b091de9d015e14c3c7900f9bf141b5a9ac0bf59e26863e7981bfa4faf29c5a24779bae2e13fb5096c14df6ab5349\", \n            \"compressed\": \"039a512559806c1712da0af7a9226c3fde4b89b091de9d015e14c3c7900f9bf141\"\n        }, \n        {\n            \"seckey\": \"b801309ed28d09eeacded44074fa59e56c83ea36ace3af62be62f8f8303224e9\", \n            \"pubkey\": \"045f4cf3b642b7a77a8389a24bfa9d1e33e2d22775406659e8f3d03073033be52d7d50b0f22fb9aa127e4f31d63ec4e65c19e110882dc6696949feaf692435527d\", \n            \"compressed\": \"035f4cf3b642b7a77a8389a24bfa9d1e33e2d22775406659e8f3d03073033be52d\"\n        }, \n        {\n            \"seckey\": \"62732592365da66537729a5814e55675dbc1fedee7bf76ab01460ec11c483206\", \n            \"pubkey\": \"049604238f2b3e733bd277396385cea92069287eddef0544561e787cbd75a5d3bac75af2bfedb19c8e17d0f1480cd5429edf7686d6d7811ddee8e7a04542788ffd\", \n            \"compressed\": \"039604238f2b3e733bd277396385cea92069287eddef0544561e787cbd75a5d3ba\"\n        }, \n        {\n            \"seckey\": \"b956d900656def75ed1fe1a797a8a3a64d1a39b4ba47701652b6a38f0ae538b3\", \n            \"pubkey\": \"04be6d3b49cd49d5fac591d19aa78ad32690cba9bd919088b8aecfa4e4c67aed4423b55b334c437649d755ec8efb65912f4920e03ad42cd637fefe33c48f88ef5e\", \n            \"compressed\": \"02be6d3b49cd49d5fac591d19aa78ad32690cba9bd919088b8aecfa4e4c67aed44\"\n        }, \n        {\n            \"seckey\": \"7c521506d51919917bc9003949c9da1849ed221140f27ca8ebe5a89a94573bb5\", \n            \"pubkey\": \"043f8e4ef08c7a2949a585cb6fcaf32269dcf02d304e4b82810670e8771fefc7e577af4cafe2d3822a804600a0d4e16c691ad17f3d6bd1541c4cffdee27f4cd8f2\", \n            \"compressed\": \"023f8e4ef08c7a2949a585cb6fcaf32269dcf02d304e4b82810670e8771fefc7e5\"\n        }, \n        {\n            \"seckey\": \"e2fe01a8acb5ee168402e2161dc20bc30a4ea3855454bdf1d4865015dd6155af\", \n            \"pubkey\": \"04132fd7de3019601076faf986dcfd095f08ed6dfdf9f3ebdf6eb955abbbd221bb1778b5ef3ec78c0c788471a8a0a069d8f66749f5d6962792f8e91c950be56a08\", \n            \"compressed\": \"02132fd7de3019601076faf986dcfd095f08ed6dfdf9f3ebdf6eb955abbbd221bb\"\n        }, \n        {\n            \"seckey\": \"efe1b0fdd549a66ea044ba522c25708fd779f933db0d1e569660f44bbe0709bb\", \n            \"pubkey\": \"042fe8daaba2d83ce65c999f665c78682620cd69f4930ed6dbae8a697ae52ad5591cd67f11c8989deb26551c2786d9062410d0158c8507a6f8f578f23fafe883a7\", \n            \"compressed\": \"032fe8daaba2d83ce65c999f665c78682620cd69f4930ed6dbae8a697ae52ad559\"\n        }, \n        {\n            \"seckey\": \"2a4e166c5ff1bbd13b61d6564c35fa23ff0ab4c035e7c630a0e2b04f49d672ba\", \n            \"pubkey\": \"043fb48407b65cf14d195dc10c987abfa29fb44a896f4627ddba455bd1f34719ef5468b4fd23b9bbad75ffaa1fa3f7dd72af9413745b784838f58c1aff94a82fa5\", \n            \"compressed\": \"033fb48407b65cf14d195dc10c987abfa29fb44a896f4627ddba455bd1f34719ef\"\n        }, \n        {\n            \"seckey\": \"1dc5cfdf63436c27b4b9c536dabd5ae50ff3d3eb4131fabab479579915d5a985\", \n            \"pubkey\": \"0428dbc0e1d751dab0bb71991f8eff453d435f13c855de665ff7ba3d7e20e8571cdaa408ee41d988a6c3daa39da32d10b7b4dd3eb53f554a78212c55ee5be9b5a4\", \n            \"compressed\": \"0228dbc0e1d751dab0bb71991f8eff453d435f13c855de665ff7ba3d7e20e8571c\"\n        }, \n        {\n            \"seckey\": \"8e43745a8843647b4bcf5f1ee5cbf2690bbc693cea64896a364b0e8a34705243\", \n            \"pubkey\": \"04caae47120774f8fbddaad553216d929e7f9b2a44fb6171bbaa5de6cf8863d061dfacf43e1e06a06c4b8e9290b2750a336101772537b1bdc1098284a6b7ae1e22\", \n            \"compressed\": \"02caae47120774f8fbddaad553216d929e7f9b2a44fb6171bbaa5de6cf8863d061\"\n        }, \n        {\n            \"seckey\": \"e7dbcea3bf616486d685e6415b270b4be529be8189fff041fc1bc9f894287bce\", \n            \"pubkey\": \"04ee80a4e54bd41b59aa87fa88a8eeabdd7094c0e24c1302bcc139c0bc4f57e67db35447c520b5ed69e0909355f589da61cd3c4242a1f54db6b28b736d1bbda19f\", \n            \"compressed\": \"03ee80a4e54bd41b59aa87fa88a8eeabdd7094c0e24c1302bcc139c0bc4f57e67d\"\n        }, \n        {\n            \"seckey\": \"37dde5089dcb68795741b417af6e3df7de3ee231e7243100d6b408b96de80767\", \n            \"pubkey\": \"040e106db7fcbb9aacf1d8df7ed7e65eba4bd0866a45384fd6a1f5cd72205787cbcd653c2c005ad932cd35273a22339c2d95e54b6343546d5ee7edca66236545fa\", \n            \"compressed\": \"020e106db7fcbb9aacf1d8df7ed7e65eba4bd0866a45384fd6a1f5cd72205787cb\"\n        }, \n        {\n            \"seckey\": \"cd2efd6b7ece03274e3d3bbe27e80341665d34e1e368622dc5b38e30a7a1d75a\", \n            \"pubkey\": \"04717e66ed8644e3394d4c6a68d87bc26da71e3b3cb563947a1371813613995be87b869725db46ac549ffff9b48d8340f142b9d2b2a81929117ed1f119491ebf25\", \n            \"compressed\": \"03717e66ed8644e3394d4c6a68d87bc26da71e3b3cb563947a1371813613995be8\"\n        }, \n        {\n            \"seckey\": \"ca8b96d0dcc02d980765a49e21ae371f74a1dbf36f5db83bd897aaac4da4d2ff\", \n            \"pubkey\": \"0485a782c5cbe6746183b2b99c11a61166346d4c9ee5d7dc992b408d5c2b359b9ca9d3ed16f5faec016c2024a066d2fbef3bd2fadbd10b7f431fba43a204e9eb34\", \n            \"compressed\": \"0285a782c5cbe6746183b2b99c11a61166346d4c9ee5d7dc992b408d5c2b359b9c\"\n        }, \n        {\n            \"seckey\": \"6e8171609cb7b2363264f628f6366fd5561f6cf9a9208bff713090ffb6849e87\", \n            \"pubkey\": \"04d815ed594bf9adf9f7d48cff7924295467fc267cea783d8bfdf79b471436f8369b06624b4e4b75888a04eff5a79a4c23239ebfadaba041f61824af93229aa2da\", \n            \"compressed\": \"02d815ed594bf9adf9f7d48cff7924295467fc267cea783d8bfdf79b471436f836\"\n        }, \n        {\n            \"seckey\": \"00f71874e77da35c63fa1f7dec1a3ac2b4301aeb476bb719e50f1bc7b6faaecb\", \n            \"pubkey\": \"040e25faca15a28175d3da90045691de924c262f76eb0b671c1a695bb3a9a409489a9873b8ed3f2e9c6a38f3f515bc2d691a0445a6f3521c7bf312db3121488dc5\", \n            \"compressed\": \"030e25faca15a28175d3da90045691de924c262f76eb0b671c1a695bb3a9a40948\"\n        }, \n        {\n            \"seckey\": \"04879431f4217b4d89b16d7115fa5d2fad054a129813934762b1f16fa5f13385\", \n            \"pubkey\": \"0446306a54d7b8e3d09a851db896929bfdf1b89825d825a309b013bba2a54801feea6cf913a952952ce14bc50e2e25f650f79db7e7cdc9ed8961aa8614bc9db612\", \n            \"compressed\": \"0246306a54d7b8e3d09a851db896929bfdf1b89825d825a309b013bba2a54801fe\"\n        }, \n        {\n            \"seckey\": \"66b8ca012f1f73da06d041e6fc47ea37a49e6f0fd4583d78f30439cf8ad4882f\", \n            \"pubkey\": \"04892ba0564e88148e8f2bb19142dea5b112608d5e4553d493cf7a230c09c52968366be79cf3f8d8772f35f255c4635256cea1d3eb5b28c081171262cc1c0b732d\", \n            \"compressed\": \"03892ba0564e88148e8f2bb19142dea5b112608d5e4553d493cf7a230c09c52968\"\n        }, \n        {\n            \"seckey\": \"b8cfc2be3369bf79cd054593fb154d5b86c338cc0aab0c3d49a6231835de28d4\", \n            \"pubkey\": \"04f925d7ec03f1c07088dd4f8ce9ce5044d3d3cba167d4a5f81222d54c7697a11df2ea062c9d9a5444a29628e1a3748968e1e4e07db349708a2ee84f3341572884\", \n            \"compressed\": \"02f925d7ec03f1c07088dd4f8ce9ce5044d3d3cba167d4a5f81222d54c7697a11d\"\n        }, \n        {\n            \"seckey\": \"a9b54ff6bd752bcc9c1744521806ad7935a7aaf22c0372e8043e04c8e09592e3\", \n            \"pubkey\": \"042f27d2702dfd405e4666feb75e1b0285031e2405c80d103062b1d4cb6b101ad718d74e175022111999b2c56a3cf9b1298bf9726b5995f8ea5ad0c8250741a3e7\", \n            \"compressed\": \"032f27d2702dfd405e4666feb75e1b0285031e2405c80d103062b1d4cb6b101ad7\"\n        }, \n        {\n            \"seckey\": \"2f056505166785377cfb2883fec49833f4de148e327980569537e7471214cf76\", \n            \"pubkey\": \"045a2b90f69a033956284c302e4116f4643e003c06cfea94c49a6113c2cede2f6df114907def06e3fea6c7dbe46d198abcee3892a97330a67e12bd88d60d09c8ec\", \n            \"compressed\": \"025a2b90f69a033956284c302e4116f4643e003c06cfea94c49a6113c2cede2f6d\"\n        }, \n        {\n            \"seckey\": \"1dad84e868937d2cc4098776b2287f892cda9c6a15bd4931680b6bc82fa2e29c\", \n            \"pubkey\": \"0407aa97a48ea8baacff7591e85a51c608c7fbe86e7d50d37bde749e254882c1f6da21ade62e661dbe28ebc4e365ed7d8dc949107f40e2c18d2b55640995417a82\", \n            \"compressed\": \"0207aa97a48ea8baacff7591e85a51c608c7fbe86e7d50d37bde749e254882c1f6\"\n        }, \n        {\n            \"seckey\": \"359913327546f99398e18eb68810641c87fc1be798577032866d220a96f15894\", \n            \"pubkey\": \"04304e9416cc86f68052c13515c1e9ca3cd6b97d45f4a1584c1e11338f8422e657e8c8563cac96eaa0ab3cd2449239cac624fdc4e53b703d06e47c0c7c471a9b18\", \n            \"compressed\": \"02304e9416cc86f68052c13515c1e9ca3cd6b97d45f4a1584c1e11338f8422e657\"\n        }, \n        {\n            \"seckey\": \"2737a48b4eaf8d4d43f82891367fd92ff34001bec215e4511d2c31d852e05958\", \n            \"pubkey\": \"0492877aae22a08909015f6346486c64b918b3f1f01f819288bfeffeb6750b211aca2f81cbe42767c090ada935a396657450128ffc34976ddf126f5799de7c70f0\", \n            \"compressed\": \"0292877aae22a08909015f6346486c64b918b3f1f01f819288bfeffeb6750b211a\"\n        }, \n        {\n            \"seckey\": \"1d598e0219a4e6f575e58c8e142a0f989e1ef170ec31c56fd53359cdb759cc9c\", \n            \"pubkey\": \"047b09b091c93f8b06142a23acc3dda3ae3b33e0b65e922a4168df760a8fc44aede1b98511685666dba32080fdbdf008c2f7f47ccefb3194ea515cd7b8f98f2a6b\", \n            \"compressed\": \"037b09b091c93f8b06142a23acc3dda3ae3b33e0b65e922a4168df760a8fc44aed\"\n        }, \n        {\n            \"seckey\": \"5efe781e0860af2f2fed729493a411eb5a33a6e6f558f2758e953bbdec5b261c\", \n            \"pubkey\": \"040dbe3874b44d59becf0b33a2e299a2b1f91c1ea65f4f3e18a2202976c1a4c51e15cece77947a672bf8341d706263baf1e3fdd5456ee3a0b082e11c23562f7a93\", \n            \"compressed\": \"030dbe3874b44d59becf0b33a2e299a2b1f91c1ea65f4f3e18a2202976c1a4c51e\"\n        }, \n        {\n            \"seckey\": \"f5d1090ecac6cd79ca9cc52ec4f11cb987aa05c6e62ef92ad08fbece3c5c4590\", \n            \"pubkey\": \"0492eba93e1ff312e5058dc85e091cc3c0e7192bb9a885bd1d3744e0c9df35fd30c23eb13be62f066346172fcfc131122aea403ee9f94d7e878da0786e029c819e\", \n            \"compressed\": \"0292eba93e1ff312e5058dc85e091cc3c0e7192bb9a885bd1d3744e0c9df35fd30\"\n        }, \n        {\n            \"seckey\": \"65e92aa7521dc1a0f006c67b719d5f89a157fe9d2d536f3e83c41b86ac2333b9\", \n            \"pubkey\": \"042ac45d11725e9309e24713fa040a0c3be6ac9c8b1de56677389fdb2c7aa1ca3011a1f4cad4e8d1d5e25abec90a2f5d3f5fd137466159fe406a2bcba2c7b2a07f\", \n            \"compressed\": \"032ac45d11725e9309e24713fa040a0c3be6ac9c8b1de56677389fdb2c7aa1ca30\"\n        }, \n        {\n            \"seckey\": \"be8e1eb806ed15b0c7d265e4f0a4f1273bd9a4c5b8fbc9995e053bea7974e02d\", \n            \"pubkey\": \"04fdfc3ebca716b2b0272946b737d52f57a4c9d5f5e2d43519b1ede7a33d55b5a8d2310f70681d426a169e05e288559a003ec0f68998fca81cccbe109429f332a9\", \n            \"compressed\": \"03fdfc3ebca716b2b0272946b737d52f57a4c9d5f5e2d43519b1ede7a33d55b5a8\"\n        }, \n        {\n            \"seckey\": \"f546bc6d383c3272d12303e30346e1eba2a413641e667e9746ecfefbce1e1046\", \n            \"pubkey\": \"042c03f50c992b45e25bc98c9dad142412c3728671c6533339bbbd2be2e7305418113a73e6d0fd864e1ff48ffb9b6daab33df09eb8415092181095d1d864b4273a\", \n            \"compressed\": \"022c03f50c992b45e25bc98c9dad142412c3728671c6533339bbbd2be2e7305418\"\n        }, \n        {\n            \"seckey\": \"7422c75a0bf623a991424e97b500baeca13b07767d9d8eac835a94c9466b34b1\", \n            \"pubkey\": \"0444baf2748de57b7c1dc9ef8fc3ae01b7cdd771b3059d276fa3b3f8004bc85ad4020ceff5b7c1e89c92d7e17132fb5980955c099943f69762da9bf75658ddeb3e\", \n            \"compressed\": \"0244baf2748de57b7c1dc9ef8fc3ae01b7cdd771b3059d276fa3b3f8004bc85ad4\"\n        }, \n        {\n            \"seckey\": \"68fa5264cdce83b8a625234980fba5a27ef337a41ea1d5dada8b96fa2fb8dc48\", \n            \"pubkey\": \"04099f5994934656c95b4a2bce4988a549c1baf0a20ddb8cf73aeb8af4ab19956cb40757616e762d1e95ecc1ed4fd32282eaa1f86b2c670cbe187cd3fddf439f4a\", \n            \"compressed\": \"02099f5994934656c95b4a2bce4988a549c1baf0a20ddb8cf73aeb8af4ab19956c\"\n        }, \n        {\n            \"seckey\": \"550460124c467093929017ecfc8a6fe88e2a44587ba71824cb3fb6098f847359\", \n            \"pubkey\": \"0407668f5eb59d5c599cd8475f6710577b53698d06c7a65df163b4cae7903ace7edd349e6822c427b94f7207b003a5fddc4fd86320e73b00cac45b24c36f7b28e1\", \n            \"compressed\": \"0307668f5eb59d5c599cd8475f6710577b53698d06c7a65df163b4cae7903ace7e\"\n        }, \n        {\n            \"seckey\": \"3041bb56b539bfcf3c38e5e8fde241e57db1d8e7747a1175bbbc9adf6da578b9\", \n            \"pubkey\": \"046f69bf5f38d1be9a6b6b5298f6fada7fe78f76ce56ab1f786cccd539bb244c8ab041e62ca145c1114bef6798e022e920e6bdccb864f16c3b768a2268ceb89e29\", \n            \"compressed\": \"036f69bf5f38d1be9a6b6b5298f6fada7fe78f76ce56ab1f786cccd539bb244c8a\"\n        }, \n        {\n            \"seckey\": \"47e358811bbece646cf18fff6d2266b33a18fc4b30d8589d9e6ab5b5127aa0f6\", \n            \"pubkey\": \"0469d032f5474f76893bffd21df94607efe487f13adf1d553846c312ff18186aba1e2c1f1a8abebe7fea140d81da7b5ca9b9172d49caf2345f3076e817fc29301f\", \n            \"compressed\": \"0369d032f5474f76893bffd21df94607efe487f13adf1d553846c312ff18186aba\"\n        }, \n        {\n            \"seckey\": \"14cfebf95585966bcffba9ef65a6a22c75cbb71aa3ebe77add616b64f1f636c3\", \n            \"pubkey\": \"0424369ef3fded3eadc05f0d3e773c65cd57202ef6494e3266bc63429f427dd807bf9755f67d072285323c52736d27487e8b0e4b6601b33daa984ed2afb22f2f2f\", \n            \"compressed\": \"0324369ef3fded3eadc05f0d3e773c65cd57202ef6494e3266bc63429f427dd807\"\n        }, \n        {\n            \"seckey\": \"0eca986c2d5df8b2ecbddb1137a093f712be37507bbde9f3fa037a8b9c11496f\", \n            \"pubkey\": \"0462060baa8b8ad4fd92cde6c1e5afa705a5f6a4e2e466c8a8545dd8a53dcadc9a2c248657c6215996e366a4963f1609c0420e963455a8c4194c1379772799e3a4\", \n            \"compressed\": \"0262060baa8b8ad4fd92cde6c1e5afa705a5f6a4e2e466c8a8545dd8a53dcadc9a\"\n        }, \n        {\n            \"seckey\": \"60f1804ae66efb1fc81f609ec57055f03351ce7025fc9d016817d09f2aaad5c4\", \n            \"pubkey\": \"04f6b2fb0e9e0f44fc879c654a511a245cd03da17613a479031d484c5a173ac7466764ce5030026a426e0c2e068727c8002e0821a99b5e19afd58efbb68249b7fb\", \n            \"compressed\": \"03f6b2fb0e9e0f44fc879c654a511a245cd03da17613a479031d484c5a173ac746\"\n        }, \n        {\n            \"seckey\": \"8c389222e80accdb14a12aa90d7c45d6ee3ecaba638c18130c5199f3c1690aa4\", \n            \"pubkey\": \"046e998092c7c7d592adb9495083b3f8c4109be093d568549fa63294d84b562f16d39e37d332352831bdb9e12352a195638e3dd9fd9b828fd2be79584afc2c5531\", \n            \"compressed\": \"036e998092c7c7d592adb9495083b3f8c4109be093d568549fa63294d84b562f16\"\n        }, \n        {\n            \"seckey\": \"939aebe9a9b8831f99f9d8be5255ac52f17e5eb6ad6b0cc17de9bb0b4ba067dd\", \n            \"pubkey\": \"04e8af18bf771cfe262db8692f1cc2f2dbcd3df467fa765d6a66f8cd48bc66c92bf901b1be9a674ca6fe664cf48e2a80af7201785d17fbb0ec0b87b7a2da23b8b5\", \n            \"compressed\": \"03e8af18bf771cfe262db8692f1cc2f2dbcd3df467fa765d6a66f8cd48bc66c92b\"\n        }, \n        {\n            \"seckey\": \"0ee86816be02bed7d9b4e3b0c57571713705911384f403a100ea0de54c11b3b2\", \n            \"pubkey\": \"04ac2782a65f4e52401b987aa600dca785884ac2d90f792524c94ac3b266daf7ca856b14bb96318c5a006a90c79822cfac8acd384029f9572c0420bc847bf37a23\", \n            \"compressed\": \"03ac2782a65f4e52401b987aa600dca785884ac2d90f792524c94ac3b266daf7ca\"\n        }, \n        {\n            \"seckey\": \"3c2057e248e354afb94bded99e50ae9adb0da0787d6ac93356154977ad9160ce\", \n            \"pubkey\": \"044899ec4faed7b1adf76ed8891f1fddd57a342c3da7ea338bb24e2308be4ad32076f3263d25d46e2ad8d178ba85cdc0e39a773d2a6a5ac246d4b96275a57eebc9\", \n            \"compressed\": \"034899ec4faed7b1adf76ed8891f1fddd57a342c3da7ea338bb24e2308be4ad320\"\n        }, \n        {\n            \"seckey\": \"eb0108cbe117dde6ea44716a7ed143cd3dbf8734ae0465d1bde76828fe3979c0\", \n            \"pubkey\": \"04f43bb2079c180a36bbb2b0529769d753c0dd522ec712d8faa359989505e3826d90951e53424d462efdde5c6f79682447233eb85dde3cc434050733edaadaacde\", \n            \"compressed\": \"02f43bb2079c180a36bbb2b0529769d753c0dd522ec712d8faa359989505e3826d\"\n        }, \n        {\n            \"seckey\": \"fa4d7ea43088872791acb2ca6637aa85ec95ca9eddcbf86dd296b381dce2a7a7\", \n            \"pubkey\": \"04dc4b10ab2f9514169458dec77c8684a7c2b58ed766b64f096c9f77495b893d781776817499573b34c677cedf5dfd9697a49ec610cc48232be48b621698ad55a4\", \n            \"compressed\": \"02dc4b10ab2f9514169458dec77c8684a7c2b58ed766b64f096c9f77495b893d78\"\n        }, \n        {\n            \"seckey\": \"104c3922fcf96246c4a2ece0c7f8b2557a39eeb8dd31af378d21c202d10230cf\", \n            \"pubkey\": \"042592be5d1ddddfda90ed49b1daffe1a05e5f27b0167715f807b5d1aa4bf69a590639e19cbe295ec40606c308beea6ab57ca061966d56687f546f358ffb1dc042\", \n            \"compressed\": \"022592be5d1ddddfda90ed49b1daffe1a05e5f27b0167715f807b5d1aa4bf69a59\"\n        }, \n        {\n            \"seckey\": \"f23a78bb579292bd08b3ae7ceba8fe4a1814cf4ca893e6179dee0173aae588d7\", \n            \"pubkey\": \"04f6860faa984f803cf72352fd13764f1bd672b449c3e70e4ebfa4e26db98efaf2cb6f7a2a8244b30e0b7c6ab892a207085c845351a25e696a05e0223e4b43fba6\", \n            \"compressed\": \"02f6860faa984f803cf72352fd13764f1bd672b449c3e70e4ebfa4e26db98efaf2\"\n        }, \n        {\n            \"seckey\": \"8b325e7813a9bf38e6e0961c9b44856aabfdd01cacf8148ea0690c8436eae588\", \n            \"pubkey\": \"0490e6f277c772c1f30a10f5948b1aa541b2fae38c71a08a09d8ae44fe760dabf7b5f799d7222b1091f8a319e65036a81d8a3415678ef2d31fe8cd1bbb9cbc8d90\", \n            \"compressed\": \"0290e6f277c772c1f30a10f5948b1aa541b2fae38c71a08a09d8ae44fe760dabf7\"\n        }, \n        {\n            \"seckey\": \"f06facb92fce3698aa0236249a846af88cf0f0872469e973c96517f9a50e7cae\", \n            \"pubkey\": \"04d427d481e673080aa669a8430b5a866fa75c926483058f19b29e1a8e5d27d5cb1b56902e06c22b50fb5a87b6976b5c9650d4c0526aec70c44769f73e79fd5db3\", \n            \"compressed\": \"03d427d481e673080aa669a8430b5a866fa75c926483058f19b29e1a8e5d27d5cb\"\n        }, \n        {\n            \"seckey\": \"c4e1f76fe10f405d52a49884eaf9dfa876615949c5d33a5cac2ad5a0828e531c\", \n            \"pubkey\": \"049a3071014efe90aaae912cc9fa97d474adf0d87d7baace88ec691affb6b6cbd79019d699793e948262036efe10582472299c28bdd7590e215c71f24429ef5460\", \n            \"compressed\": \"029a3071014efe90aaae912cc9fa97d474adf0d87d7baace88ec691affb6b6cbd7\"\n        }, \n        {\n            \"seckey\": \"fee0527618fb1c6b40b8cce4774324b049549f4b4182d9f06f321f39ef1cc73f\", \n            \"pubkey\": \"04602eb18f39a53fb8fb062b0e89c1aff1f7dd6459e453afbbcfeca59ff4ecc31f0778ba50ce02c994c606c871d6bcc7b30c15d0fc5b58644dd8cc6d94afa4a110\", \n            \"compressed\": \"02602eb18f39a53fb8fb062b0e89c1aff1f7dd6459e453afbbcfeca59ff4ecc31f\"\n        }, \n        {\n            \"seckey\": \"b3548b76526e6fecf1aead6cdbe8f0c913a1a607f06f8cf1e9efc2e6cb894ce2\", \n            \"pubkey\": \"04e15f97b28ec26821858b59c51c249d3bfabe7426f4ab3bff766fe14ddf3a047d20e34d1f802b21e4b95b51eb97825c84cf313f55966768e03348ed9f217ae5ec\", \n            \"compressed\": \"02e15f97b28ec26821858b59c51c249d3bfabe7426f4ab3bff766fe14ddf3a047d\"\n        }, \n        {\n            \"seckey\": \"3ca30ca81904a2b7e93509c2df361db9652b7e5dd1cd375a6ed98e862895aa95\", \n            \"pubkey\": \"0471d0703b4a12d0e61940c807ae82c061be8934fc269d439154c6160f1ee573b81ff75d31b29e6cdbb0552440eff8308c70325b88376d6a41f10bb726a5b4db24\", \n            \"compressed\": \"0271d0703b4a12d0e61940c807ae82c061be8934fc269d439154c6160f1ee573b8\"\n        }, \n        {\n            \"seckey\": \"e88bdf5a91b812e1cd8f1b75cce587121479f9946d995133cd0c59b3cff07562\", \n            \"pubkey\": \"049db9fcbbf1ea089cf872c736e1b0950f50de87d48dcf5cc5f5651fb880da3c5ee890e8f01675a1e566dd846066f5156d8aeb1cb7cf6a49820303684fd6b65289\", \n            \"compressed\": \"039db9fcbbf1ea089cf872c736e1b0950f50de87d48dcf5cc5f5651fb880da3c5e\"\n        }, \n        {\n            \"seckey\": \"ee15135bf948dd50722992bf3bb7c6cb91fc23400040241fce413262577d3480\", \n            \"pubkey\": \"0417ed7f8116087a4513fd8da03b8b8c64360f1f1a3d2ede71bd02510a12e25bdc14f4963ccd0a2f9fe7609ee5ab4135ee7d94c88c85fce03939d6d3d2709ce4be\", \n            \"compressed\": \"0217ed7f8116087a4513fd8da03b8b8c64360f1f1a3d2ede71bd02510a12e25bdc\"\n        }, \n        {\n            \"seckey\": \"1ab2c7bc9cdb492d8b1b377b99c1b80bcff7f764c49726fc78adc0e6983ffbc8\", \n            \"pubkey\": \"0484657e385e230adb7bb8e38d3e97db32196fc8f71bd511fcf5ed4f45b3548e33d83210309b8265aa9a3ade1ada1e000435154025481fec3acb764e91d8752daa\", \n            \"compressed\": \"0284657e385e230adb7bb8e38d3e97db32196fc8f71bd511fcf5ed4f45b3548e33\"\n        }, \n        {\n            \"seckey\": \"2170965052e69528584e7530f468ade0b4bbe1aec9b48e0fbebf26907b176bb0\", \n            \"pubkey\": \"04d90fc3e182c52088b904635d916607d67e47ee31adbb5dea34b845d588242dbbb8fc17e7085325f22462fb549085d4fff2b67bcc9e28773a99f3c102d0f05d40\", \n            \"compressed\": \"02d90fc3e182c52088b904635d916607d67e47ee31adbb5dea34b845d588242dbb\"\n        }, \n        {\n            \"seckey\": \"44b33ebdb64b6ac139c2f6fca12fa59d8ae0b32e9f086f7152afee0fcdf0d04c\", \n            \"pubkey\": \"04c9c8f6fe2674a4932b21b02a2bf61b2f8f18fe2b00bd1d7c4b4c90e7fbdfeb07e1d08c7b3a707327ad2e46e1e6606e76043b3ada421b5fa1c8ba524e7acf23b0\", \n            \"compressed\": \"02c9c8f6fe2674a4932b21b02a2bf61b2f8f18fe2b00bd1d7c4b4c90e7fbdfeb07\"\n        }, \n        {\n            \"seckey\": \"01223a6fd91868cf7ea343909c08a1b597290dd21cb30ce82268015faf9e4d39\", \n            \"pubkey\": \"04e378dbe7479e8b18746bd9fe9e08ee4576ac2eb0d51370d38ad43a3cae4e6521ba5d0b0671fbaddf9cb27560c9392b05fb15920e96e3824c7340662bc2a6ee76\", \n            \"compressed\": \"02e378dbe7479e8b18746bd9fe9e08ee4576ac2eb0d51370d38ad43a3cae4e6521\"\n        }, \n        {\n            \"seckey\": \"b83cf834d30b490e6358bce4d167376527f2cd495b337819bd74f0c3b1e35692\", \n            \"pubkey\": \"049368f6a12020843aa6fb46cac19a3357bcaf06be894c280c18f7c284b558177c41e2ab2c5e5495875a20ea1ce344219261280fb8ab2321a438bb02f72416a917\", \n            \"compressed\": \"039368f6a12020843aa6fb46cac19a3357bcaf06be894c280c18f7c284b558177c\"\n        }, \n        {\n            \"seckey\": \"4add2ca0507a5aad3c7081616f29d4de8c7a4b34e39076618da2448cfe5801eb\", \n            \"pubkey\": \"0443b0a5bf42cf54ac6937485638e4fd1aadc446ae3f1a306f52b4f41d883c73d2c6369c01f9791fdedb161354deb9701c5783a589ba3d76b3264a50e195849d6c\", \n            \"compressed\": \"0243b0a5bf42cf54ac6937485638e4fd1aadc446ae3f1a306f52b4f41d883c73d2\"\n        }, \n        {\n            \"seckey\": \"48e2ccf7373fcae4776695a11f05e8a405b732ac60fb110311b2479572d67be7\", \n            \"pubkey\": \"047958b635ab5fc0226acbd375bc7d11c1d064f8244661882c2a37f811931208d4e56ddf69ac8624f1c14bd1479243d2218e604162ab72b8a67832a63bdedba085\", \n            \"compressed\": \"037958b635ab5fc0226acbd375bc7d11c1d064f8244661882c2a37f811931208d4\"\n        }, \n        {\n            \"seckey\": \"00acb783449ffc67f158240295d47a115f42e15d57b43911ac42d85a99ef291f\", \n            \"pubkey\": \"04715cda264798651008718674c16690139416172e0fd04c63c704d3a1db4919827e641c9a9951f86f49b75c3296f41247c34ced949933367b87fa929312dd00ec\", \n            \"compressed\": \"02715cda264798651008718674c16690139416172e0fd04c63c704d3a1db491982\"\n        }, \n        {\n            \"seckey\": \"44013c462757e4ac15c6edac70064e5d21267e8d04ce1b94effebed556610c60\", \n            \"pubkey\": \"04f81c5ac305f71315981901fdc21f278d5c11bc3eb0ed0cc40adf26084df7e9afae55da807730f26730f73674585609196af3b3857f752875e04d072f04531b7d\", \n            \"compressed\": \"03f81c5ac305f71315981901fdc21f278d5c11bc3eb0ed0cc40adf26084df7e9af\"\n        }, \n        {\n            \"seckey\": \"9a168d1d80f5f3ced12e2206daad5e5e6745b97ba4711d3318cc2127829cfc02\", \n            \"pubkey\": \"047ce669d00d36c07a93939f484191d3742853a46824222a60590b4e95b956fe2dc6d398c1277922f054455ca1117aadf835f0f062ce3f5256c071295d2f0a9024\", \n            \"compressed\": \"027ce669d00d36c07a93939f484191d3742853a46824222a60590b4e95b956fe2d\"\n        }, \n        {\n            \"seckey\": \"1afcee0bbbec1de6b940f9a4babed815717f20abd350a0178ac0814493685a7a\", \n            \"pubkey\": \"044e7601f50aca57779fb834eeca9f9a6e78387be039a410d3c2d3bb27c14f211b0544c34ea708acbc8b149f3b3c182d880dab46bea9927a81742d4a963df0f0b4\", \n            \"compressed\": \"024e7601f50aca57779fb834eeca9f9a6e78387be039a410d3c2d3bb27c14f211b\"\n        }, \n        {\n            \"seckey\": \"027814c94f7e864e595a5eb745b8c2e6a437bc81098848a32bb4ce2bc603ca0a\", \n            \"pubkey\": \"04f4e638008ef1eb38b315ce1572533d7591d336532fef9e2494e6227e3ab29b4ff802977269cfa5a72358ecf480381cca16b0f1b318c32915bf0e752b14311963\", \n            \"compressed\": \"03f4e638008ef1eb38b315ce1572533d7591d336532fef9e2494e6227e3ab29b4f\"\n        }, \n        {\n            \"seckey\": \"d6744111839b47081e9c2d35f2df0926a73cc5e1bc52ed315495a77a47ca8532\", \n            \"pubkey\": \"044b013a254951b465bbd50bde0dd31c210d3d14e0297205e78aa82a0ae27a63d33cdba64ac9942fba2c4f5856a63021a788a259393c7324663794128dfac480c4\", \n            \"compressed\": \"024b013a254951b465bbd50bde0dd31c210d3d14e0297205e78aa82a0ae27a63d3\"\n        }, \n        {\n            \"seckey\": \"9ca2104a505c640f3c9b491fa88c61ea74a3aaddeaf4583252ebc9da3f1fa95d\", \n            \"pubkey\": \"04227ad27e8218295b67c33c3046e2e320dbdc9def913441cf909e04e2db1e65615457f5fd6dbd3a077db8af4cc8112dcd13f0710f0d3220925eb5a6b65761fd3b\", \n            \"compressed\": \"03227ad27e8218295b67c33c3046e2e320dbdc9def913441cf909e04e2db1e6561\"\n        }, \n        {\n            \"seckey\": \"fdc295162702fff58052b1b781ef1fbe0dd4c2075cfd764d892c108632ac1276\", \n            \"pubkey\": \"0436953a02b65431b24e68b0b813b86bbfd5f6573725ddc709a3562d72eab76f490412112bb408e37c226ca2cdfaa137ced3400632616b84db14fe414a4cb3615f\", \n            \"compressed\": \"0336953a02b65431b24e68b0b813b86bbfd5f6573725ddc709a3562d72eab76f49\"\n        }, \n        {\n            \"seckey\": \"12c4964c0d1cdf8c659e596080ac697a069c3b85f9d18ce5482fc73eebf9f070\", \n            \"pubkey\": \"04037bacca116fa53bb501fd6fee3ac5b2cda7ea53a881bf1dc0e304778d3032d021c3810ff0cab94301ebae921d54822c07970e59802066a2df025f8ba965f029\", \n            \"compressed\": \"03037bacca116fa53bb501fd6fee3ac5b2cda7ea53a881bf1dc0e304778d3032d0\"\n        }, \n        {\n            \"seckey\": \"7867fcbb5cd58014331d104eb22127353b3a6615eea4c2188e020be28c186d35\", \n            \"pubkey\": \"044db03ba0c35b9b10a842058a9d9ff89ef7e4c1c163b3286bf65ac0f927faa3b2161c54477075666aa772697b76fe3259365d339227841c2a4fa617c6293174fd\", \n            \"compressed\": \"034db03ba0c35b9b10a842058a9d9ff89ef7e4c1c163b3286bf65ac0f927faa3b2\"\n        }, \n        {\n            \"seckey\": \"2b6f2b4ef903f24421480b512c4c8c5c63d165e587986a3c830de3f0a0fc5042\", \n            \"pubkey\": \"04b4176e833c2effdc24dc9dc64e235bf1c7a5a71984955528e9e13d67bf5b8a0947c8e6ccce55b3e64d936b0b13f3772bf705f3ccfd13d8ad9bde57bf14181326\", \n            \"compressed\": \"02b4176e833c2effdc24dc9dc64e235bf1c7a5a71984955528e9e13d67bf5b8a09\"\n        }, \n        {\n            \"seckey\": \"911ccb0518c65d758a12d06e79c4cd6c96e04b8341c561fe44f2e43c6892d174\", \n            \"pubkey\": \"040e4b8d25707368e1f1eb8a09f50db2b5e2fe0884b21e25d14f3c737a8b5c585d4c985529bc418ef02a9adc896c25ae543073101d805094426e54e9699ec32119\", \n            \"compressed\": \"030e4b8d25707368e1f1eb8a09f50db2b5e2fe0884b21e25d14f3c737a8b5c585d\"\n        }, \n        {\n            \"seckey\": \"324e287d47d0c0da719a15b1cb3b3388280370898cffc42c1feeed378806933f\", \n            \"pubkey\": \"0456b2a213ee387d0e8f695c497be25b5242702f1b7ba049a5cfe1d7ba7a2fcb0c91a20db7a5555ffc22a92c8ab9ea0131028f9f4a283d97cbed6437728dfa998c\", \n            \"compressed\": \"0256b2a213ee387d0e8f695c497be25b5242702f1b7ba049a5cfe1d7ba7a2fcb0c\"\n        }, \n        {\n            \"seckey\": \"7b72912b08a1c06d20c97704a31a208d70111a85ef332555a9c78ecaa176ec99\", \n            \"pubkey\": \"04c5995c94303a3de6b98c74c71aa3ee58309d29f476292000ac557eabf53e868ee77be6f675b9fde67353e6f3b6b3ccbeae9201639314db94ebb97473e5dcd7e9\", \n            \"compressed\": \"03c5995c94303a3de6b98c74c71aa3ee58309d29f476292000ac557eabf53e868e\"\n        }, \n        {\n            \"seckey\": \"342fa5e0fe0abb4ce49e41e35847959280263fa9e38038557ec5ca0892c2d441\", \n            \"pubkey\": \"044041b2620357990b2d319a4ad8d90bf60c7e082b81726482669e6259dfd7d549623905cd99c945bae16822455570a39acbdf1979cbc174b32e5b7a44b2f0b22f\", \n            \"compressed\": \"034041b2620357990b2d319a4ad8d90bf60c7e082b81726482669e6259dfd7d549\"\n        }, \n        {\n            \"seckey\": \"538c65fe9122cfc5a4120648e01cc8441cf2aff0ee0f67141bc2fc42038aa1df\", \n            \"pubkey\": \"045e9a0bf5483c0fb4d9c12dfda462c1216b33d8c95caed560e1fd752202d70b1dee5c3fb18de04996e4c947c09047a556329c52811157d692fbd7c4b2fbc3434c\", \n            \"compressed\": \"025e9a0bf5483c0fb4d9c12dfda462c1216b33d8c95caed560e1fd752202d70b1d\"\n        }, \n        {\n            \"seckey\": \"ac89fffeece5ac5e7256371fd478adb1bb8ced38c094caf965ff6407391cda25\", \n            \"pubkey\": \"04e475eea44dde0a16e6205e4d35551ea234199ebbc9fcc509a57c4afc50e0eb620eedd5200c20008e47a37316ff07fcb1454d815014b10af5e6ad69204e23d829\", \n            \"compressed\": \"03e475eea44dde0a16e6205e4d35551ea234199ebbc9fcc509a57c4afc50e0eb62\"\n        }, \n        {\n            \"seckey\": \"d4153411ccb8a8804de4a2c65db5f9eca36185374834d383347e5bb833d905a5\", \n            \"pubkey\": \"049e4df93729d63c67ea620891066162e586ebdf48633afafb8db9a5a695124e45540ce5233a2ade8551c8e05fc0b2e8a2251bbcfd80c6583b34560c8f5973fc25\", \n            \"compressed\": \"039e4df93729d63c67ea620891066162e586ebdf48633afafb8db9a5a695124e45\"\n        }, \n        {\n            \"seckey\": \"9494930f42dc6015e4939ee363a9f3a1c36caa26f50b42473e0575c0ac513218\", \n            \"pubkey\": \"049e416ee3a155811fa2230510945fd3b7f3b0d6673f955b09f4c840ec7079214800e00e658401e24ba6deed3b60eea665a3a42de966b998e23d6da7853d1546c3\", \n            \"compressed\": \"039e416ee3a155811fa2230510945fd3b7f3b0d6673f955b09f4c840ec70792148\"\n        }, \n        {\n            \"seckey\": \"1c646256d037c811fd0484cc3590b1fa4993b89af9ffeaf047a99f160a06287c\", \n            \"pubkey\": \"04659d4bbc332219cbf565a1a103f6d705667199b60c5fab5c78194eb60185dd1f6c832fe233affed41095e19978e31b2a2400e5137248f23e72be6f74cc6c8ecd\", \n            \"compressed\": \"03659d4bbc332219cbf565a1a103f6d705667199b60c5fab5c78194eb60185dd1f\"\n        }, \n        {\n            \"seckey\": \"11527612aa037112189b29476305180d39358e3eddc1cca9592737f92128f56c\", \n            \"pubkey\": \"04bf42153367a66150a5ccd7ab136bbc44668e4533af4901c30eef3a2131bac58d0b4d1096d94eac4ef7787fc9c260951fda71e3dd02a0cc49e0d838fae59e54ea\", \n            \"compressed\": \"02bf42153367a66150a5ccd7ab136bbc44668e4533af4901c30eef3a2131bac58d\"\n        }, \n        {\n            \"seckey\": \"b1fe94ecc797b699045daaf48ef9c93deb9cee5191ab4cd5efc3498896081891\", \n            \"pubkey\": \"04d22fee3954c5061d0ff0aa44cd5f27b97f1ac81f888e4940f52037bcc099117e34d7ceeaada35f12f04aca9d66d8bb2a59503b22ecdbac130dd2207fcb8e11d4\", \n            \"compressed\": \"02d22fee3954c5061d0ff0aa44cd5f27b97f1ac81f888e4940f52037bcc099117e\"\n        }, \n        {\n            \"seckey\": \"61b645033a86b1a80f79d35040bd7c5028454972f0b49eaf9c4bbe47e6c9fae5\", \n            \"pubkey\": \"0478c685a0f33d2615c1215d493f0a06e311201485720d9b06abb5277ba68b057f8cf984c2f9dcd547b30cd59121739afc981c132e783086b2e427d4a31090de88\", \n            \"compressed\": \"0278c685a0f33d2615c1215d493f0a06e311201485720d9b06abb5277ba68b057f\"\n        }, \n        {\n            \"seckey\": \"982eb26c257b2d2b02b89edefde5102faf96ce34a46fbb4adfc4121d3d391b16\", \n            \"pubkey\": \"0433dbec79a2ea44b7eb53c80f9b469850cd40daec32af21c55419fb999b7da8d66dc09f4368bf05be4fa301e46e12b21c70af6a7f786da6cfb11faa44f70b97ca\", \n            \"compressed\": \"0233dbec79a2ea44b7eb53c80f9b469850cd40daec32af21c55419fb999b7da8d6\"\n        }, \n        {\n            \"seckey\": \"749b0e2e65a69abf68a30deb40eb050d5566f7a91361c01768fc4cb1737855b1\", \n            \"pubkey\": \"04997740b18c5b3c1773039eacdaea72e052980fdfed6709dda842e30d61836d777816be325b097e2f91e3bd057be6f0704d9f3deb25298353bf1c9db272a312d2\", \n            \"compressed\": \"02997740b18c5b3c1773039eacdaea72e052980fdfed6709dda842e30d61836d77\"\n        }, \n        {\n            \"seckey\": \"df87f09f383b0cd9801ecc08edf0c1e8df5f11c872003441d6ff90f84059c902\", \n            \"pubkey\": \"04c4530c480f1ef3eb17ec7a7c97d48cc68eeec72d5343196ace04228b4c2c67b516e2f97c68f8737b2556a4950e60849e58aeff57afccab9c4f3c45f9b40dd4c7\", \n            \"compressed\": \"03c4530c480f1ef3eb17ec7a7c97d48cc68eeec72d5343196ace04228b4c2c67b5\"\n        }, \n        {\n            \"seckey\": \"c8043b73a5b13172ff77e90043792e9fc95d4efbddf187ebd78fc3eca9e4c770\", \n            \"pubkey\": \"047afb2275745bdfdbd0ef7b24da13af03774b4064784b00bc288cc82c056db1766ca164380f08cc5eedd4dd2cc4e56a3a30e0a8854a44dcbeea5235175c53b324\", \n            \"compressed\": \"027afb2275745bdfdbd0ef7b24da13af03774b4064784b00bc288cc82c056db176\"\n        }, \n        {\n            \"seckey\": \"a5baed8e2bb76212cedbf75c045eedf2b79d0d244cdd93e9911a032c3701979a\", \n            \"pubkey\": \"04f4a87a19ebb0c72c5b40f568cb40db05022664eb66012b9173fe6f80eab40528f32f2ec7ab37e4230ebb46d8f16ac3ed95abbc167c013d9924aedbb88c0bd637\", \n            \"compressed\": \"03f4a87a19ebb0c72c5b40f568cb40db05022664eb66012b9173fe6f80eab40528\"\n        }, \n        {\n            \"seckey\": \"bf408105bd8e8fd769249bd4e1278a4567e968a5e58c1585e2992a32767242f4\", \n            \"pubkey\": \"04a3b8c0bfe9a97b622b9421257822ec485288f41a59d643d68d460d43c51f454ca55d81ca6a30f5ebfa5a23d984209a5112e7d98eff72e42fdc382340c3627645\", \n            \"compressed\": \"03a3b8c0bfe9a97b622b9421257822ec485288f41a59d643d68d460d43c51f454c\"\n        }, \n        {\n            \"seckey\": \"2cfb9daf71951787dc6bf3019ae7e345979fb52049e6d1ba8d89fefde9e01332\", \n            \"pubkey\": \"041cd25ce4278560edb29d51bb30ebaa49b9eeb61486ff1071ebcdfa814ba3c007b892e6e89d8f12a24323f8488d1d341f32ee5b9395857bb5905e9a2308dd687d\", \n            \"compressed\": \"031cd25ce4278560edb29d51bb30ebaa49b9eeb61486ff1071ebcdfa814ba3c007\"\n        }, \n        {\n            \"seckey\": \"27d2aa2bb29d33681a12821ff30559172a30e11f6606366306ab77f4717f30ea\", \n            \"pubkey\": \"0457ce45bbf93f416ae6beaddbd5d9177406747733ede196c8710a5d333b9ef6fb99b2315c39fda5a19057eb56ddc36aa9195ce7d67ee8eb7e0a23b7a4b3112e5a\", \n            \"compressed\": \"0257ce45bbf93f416ae6beaddbd5d9177406747733ede196c8710a5d333b9ef6fb\"\n        }, \n        {\n            \"seckey\": \"7df8d48f72959451d17228b667742005d4c0017885d6d56373ea8b4934970fc0\", \n            \"pubkey\": \"041e3ef97c86f4d2a98da929342b22b4f2675bd496e095157e3efee081b2a881cf40031881ab8abeafd4ae573f6001db526b64692e9d3e139712affb3ea7aba6a5\", \n            \"compressed\": \"031e3ef97c86f4d2a98da929342b22b4f2675bd496e095157e3efee081b2a881cf\"\n        }, \n        {\n            \"seckey\": \"649c0f43bb369fb18817066f3070a645331bb3a0d66974e8f40403646ff56f6e\", \n            \"pubkey\": \"044db8aafc1703e4b7268b4e4ed1e10268ccfdd1ddfed0251de9f21f8335345ed998350d413a4431b1d3eade9614303d3e42b6518b1ea2a79aae0a76b8c1ede54d\", \n            \"compressed\": \"034db8aafc1703e4b7268b4e4ed1e10268ccfdd1ddfed0251de9f21f8335345ed9\"\n        }, \n        {\n            \"seckey\": \"82a11828afb5c449b4d62355520aea47e37cb3c2feba837a16baa3366df667e1\", \n            \"pubkey\": \"04945c02168249af4116f4a30623855f0f681f660ad7ee3b8663a611a2f84b930fac8e622af3981d06f5c8ad24bee86ecbae4bf8b7012a9830c607af919adbcbf3\", \n            \"compressed\": \"03945c02168249af4116f4a30623855f0f681f660ad7ee3b8663a611a2f84b930f\"\n        }, \n        {\n            \"seckey\": \"74aa3d21b306cac508079716ec800d8c77ac2fb8e2e624016827f374115552a3\", \n            \"pubkey\": \"04fc959c0042469dd949424ced05b72f19dbff071560cbc0fc2547c8b65a0f6c4bf9a70ead86b16cb99c9b52b69621ac21f5bc0c59e061e4a5b7af8fe9b6eccdb7\", \n            \"compressed\": \"03fc959c0042469dd949424ced05b72f19dbff071560cbc0fc2547c8b65a0f6c4b\"\n        }, \n        {\n            \"seckey\": \"2e4871ff6a9e4a1abd8e6450662fd8bd094e34eaeeccbe73a7a56d1738e2e3d0\", \n            \"pubkey\": \"0457c55110ba66f3fbae33b231a22a49042b81123fc7d9fa2670d1dae6366cb5b8e8b9130d396b3c014c8096d4727e628172df6c92198541f7cc5d2ce8c73a1b5a\", \n            \"compressed\": \"0257c55110ba66f3fbae33b231a22a49042b81123fc7d9fa2670d1dae6366cb5b8\"\n        }, \n        {\n            \"seckey\": \"eea4b1c48f4dc9a2d6a15ba695ccf9e93bde1c1e3c9623572519f81830d0ddb6\", \n            \"pubkey\": \"04f038736b873a61943032276301c748b33113577c41f79a00024d6eb21e557586c3a97b94112f8e2457c6644ee46e2b0fb2f87d8aa21a269db4898f314e55dee9\", \n            \"compressed\": \"03f038736b873a61943032276301c748b33113577c41f79a00024d6eb21e557586\"\n        }, \n        {\n            \"seckey\": \"df8513438fd1225bf78dc3a9ad2c47efc1d051df4103b37653e7f5fe7c4e3696\", \n            \"pubkey\": \"049812224feab465c01399aca61593d56551ff71c44ce223e3466a08b183c77c7d7364f69cc2edc4c0266052e9b6852c6d9a353c0582f2552456d08b61c8e6af19\", \n            \"compressed\": \"039812224feab465c01399aca61593d56551ff71c44ce223e3466a08b183c77c7d\"\n        }, \n        {\n            \"seckey\": \"be3e95f9b5a658ac6db8cd75063877f62ee20306ab2e61df383e734f4f20de71\", \n            \"pubkey\": \"04159d45805b5c5b4ffba2611b461108ee889e8fac786d67a4092bac971e1064a9ab7313a49411f0639171bcf94c98cb05bea99b5e3f880116f2fb0981456798a3\", \n            \"compressed\": \"03159d45805b5c5b4ffba2611b461108ee889e8fac786d67a4092bac971e1064a9\"\n        }, \n        {\n            \"seckey\": \"93348303c5570313c8dc97f1cd3294eb5c81c94e6d18ded97ee74386a88d3874\", \n            \"pubkey\": \"04da473dbc69502b4ba5b02064155bd2ee2c1cb1024a6dfe144f54b6fd41a4da6f80a827619c6cdcac90facdae511943d1c2bb94ec1f363f69ef92503f883249d8\", \n            \"compressed\": \"02da473dbc69502b4ba5b02064155bd2ee2c1cb1024a6dfe144f54b6fd41a4da6f\"\n        }, \n        {\n            \"seckey\": \"79859d7f5278957c90853f71c3ab4052affe80042d7c47939f4bd3b3f9d962fe\", \n            \"pubkey\": \"0423643e55aa9141d2a3c38175490238816599030ed8068f96cd964657b45a6f7c41701021d5dca586b9a25f22005dd01947e1a955eb1f3a2b3c09a284e184f917\", \n            \"compressed\": \"0323643e55aa9141d2a3c38175490238816599030ed8068f96cd964657b45a6f7c\"\n        }, \n        {\n            \"seckey\": \"68fedd1ef49a1df701a50a95837af20794c2bded8b7daf43cfda0f196bfed8d4\", \n            \"pubkey\": \"049a269a8a3840abd1402f68c308ea9e216299ae567bc178513a6c60c1e71713d42b29f378662f04692e69bd8fca864577da06549158a4331b4c9619048e0d931a\", \n            \"compressed\": \"029a269a8a3840abd1402f68c308ea9e216299ae567bc178513a6c60c1e71713d4\"\n        }, \n        {\n            \"seckey\": \"77e3935470a6107a8d1bfe996be40544898537c02c78c62069e3a7f78e1a70d6\", \n            \"pubkey\": \"04788ff3e914f2d660979a58c570ca9582f9a6ccdde9147566ec544239cd948689c2a4b240f682b71d14d284483ce8cee95ed69a7971a7fb64066eae7cd7e22ed5\", \n            \"compressed\": \"03788ff3e914f2d660979a58c570ca9582f9a6ccdde9147566ec544239cd948689\"\n        }, \n        {\n            \"seckey\": \"7002d3e04478c859ae539daa7094e699153d59a24ae00392aac51fc599da0914\", \n            \"pubkey\": \"0473b87c7ecead2dc4ea9bb45aa46795ace9dc4b42add4e03b56b778d3d6c52dac544d907f5b9676bb9c5aa6cad7bd1287de70d8d75d9af545a478fe1b5a9447e0\", \n            \"compressed\": \"0273b87c7ecead2dc4ea9bb45aa46795ace9dc4b42add4e03b56b778d3d6c52dac\"\n        }, \n        {\n            \"seckey\": \"3e728671180949fd12072094452bcc5f8f359e01d0a0568f0cfd15f46f74462d\", \n            \"pubkey\": \"0471254e1255498693572d5ce09a9706dba061effd6e0d2803596af74dd463d3070ed86d852fbb2671b42df2dff79c2cbb18daf3c6eb9972cf27327c6d65af75a9\", \n            \"compressed\": \"0371254e1255498693572d5ce09a9706dba061effd6e0d2803596af74dd463d307\"\n        }, \n        {\n            \"seckey\": \"ce7cd8f0c0b5c9508c6c5697b8e6014bd1f1382fc1ba809e48d814f80896b482\", \n            \"pubkey\": \"04a9b1f12be234fb2b42315a663c8b1f2c94d3e58615d17e0124b31a647d9f6437381f681874c557272c83229da8b4c5b70b957d5847df224356bf72a0a80634c1\", \n            \"compressed\": \"03a9b1f12be234fb2b42315a663c8b1f2c94d3e58615d17e0124b31a647d9f6437\"\n        }, \n        {\n            \"seckey\": \"6198d7d8832a17703b2e144fcac46194ce0095fc504a60a6dbc4770f8de6c358\", \n            \"pubkey\": \"04859428e911cf05fd90a5454b2292f29cdabb633287c20b6a308fb21a17cbe69a2b9ab06eda52dfb94ad162fb6166c950cbde56353cd409473c875ae371609da2\", \n            \"compressed\": \"02859428e911cf05fd90a5454b2292f29cdabb633287c20b6a308fb21a17cbe69a\"\n        }, \n        {\n            \"seckey\": \"6e41fddb532b525afa34cff7ff4de5d31da4c7254a6fa2368cb137a2457e509d\", \n            \"pubkey\": \"044aa79a70e0d09e2a40ae0d5149c6668c410f27098556cf5cb0837b84dd1891d760ba0372d1a724405f760a48638034635cece2ce3e79507735ffbfb6a2584abf\", \n            \"compressed\": \"034aa79a70e0d09e2a40ae0d5149c6668c410f27098556cf5cb0837b84dd1891d7\"\n        }, \n        {\n            \"seckey\": \"1c17afc85bcc48488e48311db2b8dc041c3f31b66b90f962c1078ad312d72c75\", \n            \"pubkey\": \"048992250ef4d527824c959cc5cccf04a6b8bf644651274b5ca18ae6cfbeb49bf5dd3f65b7112a24184a8f0d497583013ab78414bbf27a6b9c596235ec70622070\", \n            \"compressed\": \"028992250ef4d527824c959cc5cccf04a6b8bf644651274b5ca18ae6cfbeb49bf5\"\n        }, \n        {\n            \"seckey\": \"0794feceff06b3873adf72de307de3e095042d6bceee3b891efb82e84c666a28\", \n            \"pubkey\": \"04725d165db619f79f7625fb978aca08180164e9a6b8be32c9bebc0876df261ed761184cbdeb5ac3d7ce1a159a0febe3c227c8bb837f014ab3cd8a3d43a6fcc203\", \n            \"compressed\": \"03725d165db619f79f7625fb978aca08180164e9a6b8be32c9bebc0876df261ed7\"\n        }, \n        {\n            \"seckey\": \"14d6860653e80af5c3111a8ff82e138666e3403fdca8915086d9ffab1da5bfec\", \n            \"pubkey\": \"040c3dc445708a0055f72c079915ce612921789646ea45d336300e689a5c3b78cd477a5d4ebb0067d24ffed7c63ea2110cbbef923edfa74a4cc187835b5113175f\", \n            \"compressed\": \"030c3dc445708a0055f72c079915ce612921789646ea45d336300e689a5c3b78cd\"\n        }\n    ]\n}"
  },
  {
    "path": "tests/test_ecdsa.py",
    "content": "import pytest\n\nfrom coincurve.ecdsa import cdata_to_der, der_to_cdata\n\n\ndef test_der(samples):\n    assert cdata_to_der(der_to_cdata(samples[\"SIGNATURE\"])) == samples[\"SIGNATURE\"]\n\n\nif __name__ == \"__main__\":\n    pytest.main([\"-s\", __file__])\n"
  },
  {
    "path": "tests/test_flags.py",
    "content": "from coincurve.flags import (\n    CONTEXT_FLAGS,\n    CONTEXT_NONE,\n    EC_COMPRESSED,\n    EC_UNCOMPRESSED,\n)\n\n\ndef test_context_flags():\n    expected_flags = {\n        CONTEXT_NONE,\n    }\n    assert expected_flags == CONTEXT_FLAGS\n\n\ndef test_context_none():\n    # From libsecp256k1's include/secp256k1.h\n    assert CONTEXT_NONE == (1 << 0)\n\n\ndef test_ec_compressed():\n    # From libsecp256k1's include/secp256k1.h\n    assert EC_COMPRESSED == (1 << 1) | (1 << 8)\n\n\ndef test_ec_uncompressed():\n    # From libsecp256k1's include/secp256k1.h\n    assert EC_UNCOMPRESSED == (1 << 1)\n"
  },
  {
    "path": "tests/test_keys.py",
    "content": "from hashlib import sha512\nfrom os import urandom\n\nimport pytest\n\nfrom coincurve.ecdsa import deserialize_recoverable, recover\nfrom coincurve.keys import PrivateKey, PublicKey, PublicKeyXOnly\nfrom coincurve.utils import GROUP_ORDER_INT, bytes_to_int, int_to_bytes_padded, verify_signature\n\nG = PublicKey(\n    b\"\\x04y\\xbef~\\xf9\\xdc\\xbb\\xacU\\xa0b\\x95\\xce\\x87\\x0b\\x07\\x02\\x9b\"\n    b\"\\xfc\\xdb-\\xce(\\xd9Y\\xf2\\x81[\\x16\\xf8\\x17\\x98H:\\xdaw&\\xa3\\xc4e\"\n    b\"]\\xa4\\xfb\\xfc\\x0e\\x11\\x08\\xa8\\xfd\\x17\\xb4H\\xa6\\x85T\\x19\\x9cG\"\n    b\"\\xd0\\x8f\\xfb\\x10\\xd4\\xb8\"\n)\nn = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141\n\n\nclass TestPrivateKey:\n    def test_public_key(self, samples):\n        assert PrivateKey(samples[\"PRIVATE_KEY_BYTES\"]).public_key.format() == samples[\"PUBLIC_KEY_COMPRESSED\"]\n\n    def test_xonly_pubkey(self, samples):\n        assert (\n            PrivateKey(samples[\"PRIVATE_KEY_BYTES\"]).public_key_xonly.format() == samples[\"PUBLIC_KEY_COMPRESSED\"][1:]\n        )\n\n    def test_signature_correct(self):\n        private_key = PrivateKey()\n        public_key = private_key.public_key\n\n        message = urandom(200)\n        signature = private_key.sign(message)\n\n        assert verify_signature(signature, message, public_key.format(compressed=True))\n        assert verify_signature(signature, message, public_key.format(compressed=False))\n\n    def test_signature_deterministic(self, samples):\n        assert PrivateKey(samples[\"PRIVATE_KEY_BYTES\"]).sign(samples[\"MESSAGE\"]) == samples[\"SIGNATURE\"]\n\n    def test_signature_invalid_hasher(self, samples):\n        with pytest.raises(ValueError, match=r\"Message hash must be 32 bytes long\\.\"):\n            PrivateKey().sign(samples[\"MESSAGE\"], lambda x: sha512(x).digest())\n\n    def test_signature_recoverable(self, samples):\n        private_key = PrivateKey(samples[\"PRIVATE_KEY_BYTES\"])\n        assert (\n            private_key.public_key.format()\n            == PublicKey(\n                recover(\n                    samples[\"MESSAGE\"],\n                    deserialize_recoverable(private_key.sign_recoverable(samples[\"MESSAGE\"])),\n                )\n            ).format()\n        )\n\n    def test_schnorr_signature(self):\n        private_key = PrivateKey()\n        message = urandom(32)\n\n        # Message must be 32 bytes\n        with pytest.raises(ValueError, match=r\"Message must be 32 bytes long\\.\"):\n            private_key.sign_schnorr(message + b\"\\x01\")\n\n        # We can provide supplementary randomness\n        sig = private_key.sign_schnorr(message, urandom(32))\n        assert private_key.public_key_xonly.verify(sig, message)\n\n        # Or not\n        sig = private_key.sign_schnorr(message)\n        assert private_key.public_key_xonly.verify(sig, message)\n\n    def test_to_hex(self, samples):\n        assert PrivateKey(samples[\"PRIVATE_KEY_BYTES\"]).to_hex() == samples[\"PRIVATE_KEY_HEX\"]\n\n    def test_to_int(self, samples):\n        assert PrivateKey(samples[\"PRIVATE_KEY_BYTES\"]).to_int() == samples[\"PRIVATE_KEY_NUM\"]\n\n    def test_to_pem(self, samples):\n        assert PrivateKey(samples[\"PRIVATE_KEY_BYTES\"]).to_pem() == samples[\"PRIVATE_KEY_PEM\"]\n\n    def test_to_der(self, samples):\n        assert PrivateKey(samples[\"PRIVATE_KEY_BYTES\"]).to_der() == samples[\"PRIVATE_KEY_DER\"]\n\n    def test_from_hex(self, samples):\n        assert PrivateKey.from_hex(samples[\"PRIVATE_KEY_HEX\"]).secret == samples[\"PRIVATE_KEY_BYTES\"]\n\n    def test_from_int(self, samples):\n        assert PrivateKey.from_int(samples[\"PRIVATE_KEY_NUM\"]).secret == samples[\"PRIVATE_KEY_BYTES\"]\n\n    def test_from_pem(self, samples):\n        assert PrivateKey.from_pem(samples[\"PRIVATE_KEY_PEM\"]).secret == samples[\"PRIVATE_KEY_BYTES\"]\n\n    def test_from_der(self, samples):\n        assert PrivateKey.from_der(samples[\"PRIVATE_KEY_DER\"]).secret == samples[\"PRIVATE_KEY_BYTES\"]\n\n    def test_ecdh(self):\n        a = PrivateKey()\n        b = PrivateKey()\n\n        assert a.ecdh(b.public_key.format()) == b.ecdh(a.public_key.format())\n\n    def test_add(self):\n        assert PrivateKey(b\"\\x01\").add(b\"\\x09\").to_int() == 10\n\n    def test_add_update(self):\n        private_key = PrivateKey(b\"\\x01\")\n        new_private_key = private_key.add(b\"\\x09\", update=True)\n\n        assert new_private_key.to_int() == 10\n        assert private_key is new_private_key\n\n    def test_multiply(self):\n        assert PrivateKey(b\"\\x05\").multiply(b\"\\x05\").to_int() == 25\n\n    def test_multiply_update(self):\n        private_key = PrivateKey(b\"\\x05\")\n        new_private_key = private_key.multiply(b\"\\x05\", update=True)\n\n        assert new_private_key.to_int() == 25\n        assert private_key is new_private_key\n\n\nclass TestPublicKey:\n    def test_from_secret(self, samples):\n        assert PublicKey.from_secret(samples[\"PRIVATE_KEY_BYTES\"]).format() == samples[\"PUBLIC_KEY_COMPRESSED\"]\n\n    def test_from_point(self, samples):\n        assert PublicKey.from_point(samples[\"PUBLIC_KEY_X\"], samples[\"PUBLIC_KEY_Y\"]).format() == samples.get(\n            \"PUBLIC_KEY_COMPRESSED\"\n        )\n\n    def test_from_signature_and_message(self, samples):\n        assert (\n            PublicKey.from_secret(samples[\"PRIVATE_KEY_BYTES\"]).format()\n            == PublicKey.from_signature_and_message(samples[\"RECOVERABLE_SIGNATURE\"], samples[\"MESSAGE\"]).format()\n        )\n\n    def test_format(self, samples):\n        assert PublicKey(samples[\"PUBLIC_KEY_UNCOMPRESSED\"]).format(compressed=True) == samples.get(\n            \"PUBLIC_KEY_COMPRESSED\"\n        )\n        assert PublicKey(samples[\"PUBLIC_KEY_COMPRESSED\"]).format(compressed=False) == samples.get(\n            \"PUBLIC_KEY_UNCOMPRESSED\"\n        )\n\n    def test_point(self, samples):\n        assert PublicKey(samples[\"PUBLIC_KEY_COMPRESSED\"]).point() == (\n            samples[\"PUBLIC_KEY_X\"],\n            samples[\"PUBLIC_KEY_Y\"],\n        )\n\n    def test_verify(self, samples):\n        public_key = PublicKey(samples[\"PUBLIC_KEY_COMPRESSED\"])\n        assert public_key.verify(samples[\"SIGNATURE\"], samples[\"MESSAGE\"])\n\n    def test_transform(self):\n        x = urandom(32)\n        k = urandom(32)\n        point = G.multiply(x)\n\n        assert point.add(k) == G.multiply(int_to_bytes_padded((bytes_to_int(x) + bytes_to_int(k)) % n))\n\n    def test_combine(self):\n        a = PrivateKey().public_key\n        b = PrivateKey().public_key\n\n        assert PublicKey.combine_keys([a, b]) == a.combine([b])\n\n\nclass TestXonlyPubKey:\n    def test_parse_invalid(self, samples):\n        # Must be 32 bytes\n        with pytest.raises(ValueError, match=f\"Secret scalar must be greater than 0 and less than {GROUP_ORDER_INT}\"):\n            PublicKeyXOnly.from_secret(bytes(33))\n\n        # Must be an x coordinate for a valid point\n        with pytest.raises(ValueError, match=r\"The public key could not be parsed or is invalid\\.\"):\n            PublicKeyXOnly(samples[\"X_ONLY_PUBKEY_INVALID\"])\n\n    def test_roundtrip(self, samples):\n        assert PublicKeyXOnly(samples[\"X_ONLY_PUBKEY\"]).format() == samples[\"X_ONLY_PUBKEY\"]\n        assert PublicKeyXOnly(samples[\"PUBLIC_KEY_COMPRESSED\"][1:]).format() == samples[\"PUBLIC_KEY_COMPRESSED\"][1:]\n\n        # Test __eq__\n        assert PublicKeyXOnly(samples[\"X_ONLY_PUBKEY\"]) == PublicKeyXOnly(samples[\"X_ONLY_PUBKEY\"])\n\n    def test_tweak(self):\n        # Taken from BIP341 test vectors.\n        # See github.com/bitcoin/bips/blob/6545b81022212a9f1c814f6ce1673e84bc02c910/bip-0341/wallet-test-vectors.json\n        pubkey = PublicKeyXOnly(bytes.fromhex(\"d6889cb081036e0faefa3a35157ad71086b123b2b144b649798b494c300a961d\"))\n        pubkey.tweak_add(bytes.fromhex(\"b86e7be8f39bab32a6f2c0443abbc210f0edac0e2c53d501b36b64437d9c6c70\"))\n        assert pubkey.format() == bytes.fromhex(\"53a1f6e454df1aa2776a2814a721372d6258050de330b3c6d10ee8f4e0dda343\")\n\n    def test_parity(self):\n        # Taken from BIP341 test vectors.\n        # See github.com/bitcoin/bips/blob/6545b81022212a9f1c814f6ce1673e84bc02c910/bip-0341/wallet-test-vectors.json\n        pubkey = PublicKeyXOnly(bytes.fromhex(\"187791b6f712a8ea41c8ecdd0ee77fab3e85263b37e1ec18a3651926b3a6cf27\"))\n        pubkey.tweak_add(bytes.fromhex(\"cbd8679ba636c1110ea247542cfbd964131a6be84f873f7f3b62a777528ed001\"))\n        assert pubkey.format() == bytes.fromhex(\"147c9c57132f6e7ecddba9800bb0c4449251c92a1e60371ee77557b6620f3ea3\")\n        assert pubkey.parity\n\n        pubkey = PublicKeyXOnly(bytes.fromhex(\"93478e9488f956df2396be2ce6c5cced75f900dfa18e7dabd2428aae78451820\"))\n        pubkey.tweak_add(bytes.fromhex(\"6af9e28dbf9d6aaf027696e2598a5b3d056f5fd2355a7fd5a37a0e5008132d30\"))\n        assert pubkey.format() == bytes.fromhex(\"e4d810fd50586274face62b8a807eb9719cef49c04177cc6b76a9a4251d5450e\")\n        assert not pubkey.parity\n\n\nif __name__ == \"__main__\":\n    pytest.main([\"-v\", __file__])\n"
  },
  {
    "path": "tests/test_utils.py",
    "content": "from os import urandom\n\nimport pytest\n\nfrom coincurve.utils import (\n    GROUP_ORDER,\n    GROUP_ORDER_INT,\n    ZERO,\n    bytes_to_int,\n    chunk_data,\n    der_to_pem,\n    get_valid_secret,\n    int_to_bytes,\n    int_to_bytes_padded,\n    pad_scalar,\n    pem_to_der,\n    validate_secret,\n    verify_signature,\n)\n\n\nclass TestPadScalar:\n    def test_correct(self):\n        assert pad_scalar(b\"\\x01\") == b\"\\x00\" * 31 + b\"\\x01\"\n\n    def test_pad_limit(self):\n        n = urandom(32)\n        assert len(pad_scalar(n)) == len(n)\n\n    def test_empty_scalar(self):\n        assert len(pad_scalar(b\"\")) == 32\n\n\ndef test_get_valid_secret():\n    secret = get_valid_secret()\n    assert len(secret) == 32\n    assert ZERO < secret < GROUP_ORDER\n\n\nclass TestValidateSecret:\n    def test_valid(self):\n        secret = validate_secret(b\"\\x01\")\n        assert len(secret) == 32\n        assert ZERO < secret < GROUP_ORDER\n\n    def test_bytes_greater_than_group_order(self):\n        secret = (\n            b\"\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xfe\\xba\\xae\\xdc\\xe6\\xafH\\xa0;\\xbf\\xd2^\\x8d\"\n        )\n        assert secret > GROUP_ORDER\n\n        secret = validate_secret(secret)\n        assert len(secret) == 32\n        assert ZERO < secret < GROUP_ORDER\n\n    def test_out_of_range(self):\n        with pytest.raises(ValueError, match=f\"Secret scalar must be greater than 0 and less than {GROUP_ORDER_INT}\"):\n            validate_secret(ZERO)\n\n        with pytest.raises(ValueError, match=f\"Secret scalar must be greater than 0 and less than {GROUP_ORDER_INT}\"):\n            validate_secret(GROUP_ORDER)\n\n\ndef test_bytes_int_conversion():\n    bytestr = b\"\\x00\" + urandom(31)\n    assert pad_scalar(int_to_bytes(bytes_to_int(bytestr))) == bytestr\n\n\ndef test_bytes_int_conversion_padded():\n    bytestr = b\"\\x00\" + urandom(31)\n    assert int_to_bytes_padded(bytes_to_int(bytestr)) == bytestr\n\n\ndef test_der_conversion(samples):\n    assert pem_to_der(der_to_pem(samples[\"PRIVATE_KEY_DER\"])) == samples[\"PRIVATE_KEY_DER\"]\n\n\ndef test_verify_signature(samples):\n    assert verify_signature(samples[\"SIGNATURE\"], samples[\"MESSAGE\"], samples[\"PUBLIC_KEY_COMPRESSED\"])\n    assert verify_signature(samples[\"SIGNATURE\"], samples[\"MESSAGE\"], samples[\"PUBLIC_KEY_UNCOMPRESSED\"])\n\n\ndef test_chunk_data():\n    assert list(chunk_data(\"4fadd1977328c11efc1c1d8a781aa6b9677984d3e0b\", 2)) == [\n        \"4f\",\n        \"ad\",\n        \"d1\",\n        \"97\",\n        \"73\",\n        \"28\",\n        \"c1\",\n        \"1e\",\n        \"fc\",\n        \"1c\",\n        \"1d\",\n        \"8a\",\n        \"78\",\n        \"1a\",\n        \"a6\",\n        \"b9\",\n        \"67\",\n        \"79\",\n        \"84\",\n        \"d3\",\n        \"e0\",\n        \"b\",\n    ]\n\n\nif __name__ == \"__main__\":\n    pytest.main([\"-v\", __file__])\n"
  }
]