[
  {
    "path": ".github/workflows/codecov.yml",
    "content": "name: \"Code coverage\"\n\non:\n  pull_request:\n  push:\n\njobs:\n  skip_duplicates:\n    continue-on-error: true\n    runs-on: ubuntu-24.04\n    outputs:\n      should_skip: ${{ steps.skip_check.outputs.should_skip }}\n    steps:\n      - id: skip_check\n        uses: fkirc/skip-duplicate-actions@v5\n        with:\n          concurrent_skipping: 'same_content_newer'\n          skip_after_successful_duplicate: 'true'\n          paths_ignore: '[\"doc/**\", \"**/*.md\", \".gitignore\", \"libxcrypt.spec.rpkg\", \".packit.yaml\", \"rpkg.macros\", \"AUTHORS\", \"ChangeLog\", \"COPYING.LIB\", \"LICENSING\", \"NEWS\", \"README\", \"THANKS\", \"TODO\"]'\n          do_not_skip: '[\"workflow_dispatch\", \"schedule\"]'\n\n  O0-Buildflags:\n    needs: skip_duplicates\n    if: ${{ needs.skip_duplicates.outputs.should_skip != 'true' }}\n\n    runs-on: ubuntu-24.04\n\n    strategy:\n      fail-fast: false\n      matrix:\n        compiler: [gcc, clang]\n        config_opts:\n          - \"--enable-obsolete-api --enable-hashes=all --enable-failure-tokens\"\n          - \"--enable-obsolete-api --enable-obsolete-api-enosys --enable-hashes=all --enable-failure-tokens\"\n          - \"--disable-obsolete-api --enable-hashes=all --enable-failure-tokens\"\n          # --enable-hashes=strong can only be used with --disable-obsolete-api\n          - \"--disable-obsolete-api --enable-failure-tokens --enable-hashes=strong\"\n          # failure tokens only affect the generic code so there's no point\n          # testing with all of the hashes; use descrypt only, to get coverage\n          # of the --enable-obsolete-api code in this mode, and to get coverage\n          # of an \"only one hash enabled\" configuration.\n          - \"--enable-obsolete-api --disable-failure-tokens --enable-hashes=descrypt\"\n\n    env:\n      ac_cv_func_arc4random_buf: \"no\"\n      CC: ${{ matrix.compiler }}\n      CONFIG_OPTS: ${{ matrix.config_opts }}\n      CFLAGS: \"-O0 -g -fprofile-arcs -ftest-coverage\"\n      CXXFLAGS: \"-O0 -g -fprofile-arcs -ftest-coverage\"\n      LDFLAGS: \"--coverage\"\n      VERBOSE: 1\n\n    steps:\n    - name: Checkout\n      uses: actions/checkout@v4\n\n    - name: Install packages\n      run: |\n        packages=\"lcov libltdl-dev\"\n        if [ \"$CC\" = clang ]; then\n          # need 'llvm' for llvm-cov, as well as clang\n          packages=\"$packages clang llvm\"\n        fi\n        sudo apt-get install $packages\n\n    - name: Versions of build tools\n      id: build-tools\n      run: ./build-aux/ci/ci-log-dependency-versions\n\n    - name: Get nprocs\n      run: echo \"NPROCS=$((`nproc --all 2>/dev/null || sysctl -n hw.ncpu` * 2))\" | tee $GITHUB_ENV\n\n    - name: Cache bootstrap\n      id: cache\n      uses: actions/cache@v4\n      with:\n        path: |\n          INSTALL\n          Makefile.in\n          aclocal.m4\n          config.h.in\n          configure\n          autom4te.cache/**\n          build-aux/m4/libtool.m4\n          build-aux/m4/ltoptions.m4\n          build-aux/m4/ltsugar.m4\n          build-aux/m4/ltversion.m4\n          build-aux/m4/lt~obsolete.m4\n          build-aux/m4-autogen/**\n        key: autoreconf-${{ steps.build-tools.outputs.autotools-ver }}-${{ hashFiles('autogen.sh', 'configure.ac', 'Makefile.am', 'build-aux/m4/*.m4', 'build-aux/m4-autogen/**') }}\n\n    - name: Bootstrap\n      if: steps.cache.outputs.cache-hit != 'true'\n      run: ./autogen.sh\n\n    - name: Configure\n      run: ./configure $CONFIG_OPTS\n\n    - name: Build\n      run: |\n        make -j${{ env.NPROCS }} all\n        make -j${{ env.NPROCS }} test-programs\n\n    - name: Test\n      run: make -j${{ env.NPROCS }} check\n\n    - name: Summarize coverage data\n      run: ./build-aux/ci/summarize-coverage coverage.info\n\n    - name: Upload coverage data to Codecov\n      uses: codecov/codecov-action@v5\n      with:\n        fail_ci_if_error: true\n        files: coverage.info\n        token: ${{ secrets.CODECOV_TOKEN }}\n        verbose: true\n\n    - name: Detailed error logs\n      if: failure()\n      run: ./build-aux/ci/ci-log-logfiles\n"
  },
  {
    "path": ".github/workflows/codeql.yml",
    "content": "name: \"CodeQL static analysis\"\n\non:\n  push:\n  pull_request:\n  schedule:\n    - cron: '31 3 * * 1'  # Monday at 3h31 UTC\n\njobs:\n  skip_duplicates:\n    continue-on-error: true\n    runs-on: ubuntu-24.04\n    outputs:\n      should_skip: ${{ steps.skip_check.outputs.should_skip }}\n    steps:\n      - id: skip_check\n        uses: fkirc/skip-duplicate-actions@v5\n        with:\n          concurrent_skipping: 'same_content_newer'\n          skip_after_successful_duplicate: 'true'\n          paths_ignore: '[\"doc/**\", \"**/*.md\", \".gitignore\", \"libxcrypt.spec.rpkg\", \".packit.yaml\", \"rpkg.macros\", \"AUTHORS\", \"ChangeLog\", \"COPYING.LIB\", \"LICENSING\", \"NEWS\", \"README\", \"THANKS\", \"TODO\"]'\n          do_not_skip: '[\"workflow_dispatch\", \"schedule\"]'\n\n  CodeQL:\n    needs: skip_duplicates\n    if: ${{ needs.skip_duplicates.outputs.should_skip != 'true' }}\n\n    runs-on: ubuntu-24.04\n    permissions:\n      actions: read\n      contents: read\n      security-events: write\n\n    env:\n      ac_cv_func_arc4random_buf: \"no\"\n\n    steps:\n    - name: Checkout repository\n      uses: actions/checkout@v4\n\n    - name: Install packages\n      run: sudo apt-get install libltdl-dev\n\n    - name: Initialize CodeQL\n      uses: github/codeql-action/init@v3\n      with:\n        # CodeQL lumps C with C++.  Perl is not currently supported.\n        languages: cpp, python\n\n        # If you wish to specify custom queries, you can do so here or in a\n        # config file.  By default, queries listed here will override any\n        # specified in a config file.  Prefix the list here with \"+\" to use\n        # these queries and those in the config file.\n        #queries:\n        # - ./path/to/local/query\n        # - your-org/your-repo/queries@main\n\n    - name: Versions of build tools\n      id: build-tools\n      run: ./build-aux/ci/ci-log-dependency-versions\n\n    - name: Get nprocs\n      run: echo \"NPROCS=$((`nproc --all 2>/dev/null || sysctl -n hw.ncpu` * 2))\" | tee $GITHUB_ENV\n\n    - name: Cache bootstrap\n      id: cache\n      uses: actions/cache@v4\n      with:\n        path: |\n          INSTALL\n          Makefile.in\n          aclocal.m4\n          config.h.in\n          configure\n          autom4te.cache/**\n          build-aux/m4/libtool.m4\n          build-aux/m4/ltoptions.m4\n          build-aux/m4/ltsugar.m4\n          build-aux/m4/ltversion.m4\n          build-aux/m4/lt~obsolete.m4\n          build-aux/m4-autogen/**\n        key: autoreconf-${{ steps.build-tools.outputs.autotools-ver }}-${{ hashFiles('autogen.sh', 'configure.ac', 'Makefile.am', 'build-aux/m4/*.m4', 'build-aux/m4-autogen/**') }}\n\n    - name: Bootstrap\n      if: steps.cache.outputs.cache-hit != 'true'\n      run: ./autogen.sh\n\n    - name: Configure\n      run: ./configure --enable-obsolete-api --enable-hashes=all\n\n    - name: Build\n      run: |\n        make -j${{ env.NPROCS }} all\n        make -j${{ env.NPROCS }} test-programs\n\n    - name: Perform CodeQL Analysis\n      uses: github/codeql-action/analyze@v3\n\n    - name: Detailed error logs\n      if: failure()\n      run: ./build-aux/ci/ci-log-logfiles\n"
  },
  {
    "path": ".github/workflows/config-matrix.yml",
    "content": "name: \"Config Matrix\"\n\non:\n   pull_request:\n   push:\n\njobs:\n  skip_duplicates:\n    continue-on-error: true\n    runs-on: ubuntu-24.04\n    outputs:\n      should_skip: ${{ steps.skip_check.outputs.should_skip }}\n    steps:\n      - id: skip_check\n        uses: fkirc/skip-duplicate-actions@v5\n        with:\n          concurrent_skipping: 'same_content_newer'\n          skip_after_successful_duplicate: 'true'\n          paths_ignore: '[\"doc/**\", \"**/*.md\", \".gitignore\", \"libxcrypt.spec.rpkg\", \".packit.yaml\", \"rpkg.macros\", \"AUTHORS\", \"ChangeLog\", \"COPYING.LIB\", \"LICENSING\", \"NEWS\", \"README\", \"THANKS\", \"TODO\"]'\n          do_not_skip: '[\"workflow_dispatch\", \"schedule\"]'\n\n  build:\n    needs: skip_duplicates\n    if: ${{ needs.skip_duplicates.outputs.should_skip != 'true' }}\n\n    runs-on: ubuntu-24.04\n\n    strategy:\n      fail-fast: false\n      matrix:\n        compiler: [gcc, clang]\n        config_opts:\n        # General-purpose configurations with the obsolete APIs present.\n        - \"--enable-obsolete-api --enable-hashes=all\"\n        - \"--enable-obsolete-api --enable-hashes=all --enable-obsolete-api-enosys\"\n        - \"--enable-obsolete-api --enable-hashes=all --disable-failure-tokens\"\n        - \"--enable-obsolete-api --enable-hashes=all --enable-obsolete-api-enosys --disable-failure-tokens\"\n        - \"--enable-obsolete-api --enable-hashes=all --disable-symvers\"\n        - \"--enable-obsolete-api --enable-hashes=glibc\"\n        - \"--enable-obsolete-api=glibc --enable-hashes=strong,glibc\"\n\n        # General-purpose configurations with the obsolete APIs absent.\n        # Note that the obsolete APIs are always absent from the static library,\n        # so --disable-shared implies --disable-obsolete-api.\n        - \"--disable-obsolete-api --enable-hashes=all\"\n        - \"--disable-obsolete-api --enable-hashes=all --disable-shared\"\n        - \"--disable-obsolete-api --enable-hashes=all --disable-static\"\n        - \"--disable-obsolete-api --enable-hashes=all --disable-failure-tokens\"\n        - \"--disable-obsolete-api --enable-hashes=all --disable-symvers\"\n        - \"--disable-obsolete-api --enable-hashes=strong\"\n\n        # Configurations with only one hash enabled.  These exist to\n        # detect build failures due to incorrect ifdeffage.\n        - \"--disable-obsolete-api --enable-hashes=bcrypt\"\n        - \"--disable-obsolete-api --enable-hashes=bcrypt_a\"\n        - \"--disable-obsolete-api --enable-hashes=bcrypt_x\"\n        - \"--disable-obsolete-api --enable-hashes=bcrypt_y\"\n        - \"--disable-obsolete-api --enable-hashes=bigcrypt\"\n        - \"--disable-obsolete-api --enable-hashes=bsdicrypt\"\n        - \"--disable-obsolete-api --enable-hashes=descrypt\"\n        - \"--disable-obsolete-api --enable-hashes=gost-yescrypt\"\n        - \"--disable-obsolete-api --enable-hashes=md5crypt\"\n        - \"--disable-obsolete-api --enable-hashes=nt\"\n        - \"--disable-obsolete-api --enable-hashes=scrypt\"\n        - \"--disable-obsolete-api --enable-hashes=sha1crypt\"\n        - \"--disable-obsolete-api --enable-hashes=sha256crypt\"\n        - \"--disable-obsolete-api --enable-hashes=sha512crypt\"\n        - \"--disable-obsolete-api --enable-hashes=sm3crypt\"\n        - \"--disable-obsolete-api --enable-hashes=sm3-yescrypt\"\n        - \"--disable-obsolete-api --enable-hashes=sunmd5\"\n        - \"--disable-obsolete-api --enable-hashes=yescrypt\"\n\n    env:\n      ac_cv_func_arc4random_buf: \"no\"\n      CC: ${{ matrix.compiler }}\n      CONFIG_OPTS: ${{ matrix.config_opts }}\n      LDFLAGS: \"-Wl,--no-undefined-version\"\n\n    steps:\n    - name: Checkout\n      uses: actions/checkout@v4\n\n    - name: Install packages\n      run: |\n        packages=\"libltdl-dev\"\n        if [ \"$CC\" = clang ]; then\n          packages=\"$packages clang\"\n        fi\n        sudo apt-get install $packages\n\n    - name: Versions of build tools\n      id: build-tools\n      run: ./build-aux/ci/ci-log-dependency-versions\n\n    - name: Get nprocs\n      run: echo \"NPROCS=$((`nproc --all 2>/dev/null || sysctl -n hw.ncpu` * 2))\" | tee $GITHUB_ENV\n\n    - name: Cache bootstrap\n      id: cache\n      uses: actions/cache@v4\n      with:\n        path: |\n          INSTALL\n          Makefile.in\n          aclocal.m4\n          config.h.in\n          configure\n          autom4te.cache/**\n          build-aux/m4/libtool.m4\n          build-aux/m4/ltoptions.m4\n          build-aux/m4/ltsugar.m4\n          build-aux/m4/ltversion.m4\n          build-aux/m4/lt~obsolete.m4\n          build-aux/m4-autogen/**\n        key: autoreconf-${{ steps.build-tools.outputs.autotools-ver }}-${{ hashFiles('autogen.sh', 'configure.ac', 'Makefile.am', 'build-aux/m4/*.m4', 'build-aux/m4-autogen/**') }}\n\n    - name: Bootstrap\n      if: steps.cache.outputs.cache-hit != 'true'\n      run: ./autogen.sh\n\n    - name: Configure\n      run: ./build-aux/ci/configure-wrapper $CONFIG_OPTS\n\n    - name: Build\n      run: |\n        make -j${{ env.NPROCS }} all\n        make -j${{ env.NPROCS }} test-programs\n\n    - name: Test\n      run: make -j${{ env.NPROCS }} check\n\n    - name: Detailed error logs\n      if: failure()\n      run: ./build-aux/ci/ci-log-logfiles\n"
  },
  {
    "path": ".github/workflows/coverity.yml",
    "content": "name: Coverity\n\n# Coverity Scan gives relatively low-quality reports and has strict\n# rate limits, so we only run it on the main branch on a schedule.\non:\n  schedule:\n    - cron: '31 3 * * 1'  # Monday at 3h31 UTC\n  workflow_dispatch:\n\njobs:\n  Coverity:\n    runs-on: ubuntu-24.04\n\n    env:\n      ac_cv_func_arc4random_buf: \"no\"\n      CVT_PROJECT: besser82/libxcrypt\n\n    # Coverity doesn't have official Github Actions integration yet.\n    # The steps below were kitbashed together from the contents of\n    # https://scan.coverity.com/scripts/travisci_build_coverity_scan.sh\n    # plus some notions from\n    # https://github.com/ruby/actions-coverity-scan/blob/master/.github/workflows/coverity-scan.yml\n    steps:\n    - name: Check for authorization\n      env:\n        CVT_TOKEN: ${{ secrets.COVERITY_SCAN_TOKEN }}\n      run: |\n        if [ -z \"$CVT_TOKEN\" ]; then\n          printf '\\033[33;1mCoverity Scan token not available.\\033[0m\\n'\n          exit 1\n        fi\n        AUTH_RES=$(curl -s --form project=\"$CVT_PROJECT\" \\\n                           --form token=\"$CVT_TOKEN\" \\\n                           https://scan.coverity.com/api/upload_permitted)\n        if [ \"$AUTH_RES\" = \"Access denied\" ]; then\n          printf '\\033[33;1mCoverity Scan API access denied.\\033[0m\\n'\n          printf 'Check project name and access token.\\n'\n          exit 1\n        else\n          AUTH=$(printf '%s' \"$AUTH_RES\" | ruby -e \"\n            require 'rubygems'\n            require 'json'\n            puts JSON[STDIN.read]['upload_permitted']\n          \")\n          if [ \"$AUTH\" = \"true\" ]; then\n            echo ok\n            exit 0\n          else\n            WHEN=$(printf '%s' \"$AUTH_RES\" | ruby -e \"\n              require 'rubygems'\n              require 'json'\n              puts JSON[STDIN.read]['next_upload_permitted_at']\n            \")\n            printf '\\033[33;1mCoverity Scan access blocked until %s.\\033[0m\\n' \\\n              \"$WHEN\"\n            exit 1\n          fi\n        fi\n\n    - name: Checkout repository\n      uses: actions/checkout@v4\n\n    - name: Install packages\n      run: sudo apt-get install libltdl-dev\n\n    - name: Download Coverity Build Tool\n      env:\n        CVT_TOKEN: ${{ secrets.COVERITY_SCAN_TOKEN }}\n      run: |\n        echo Downloading Coverity tools...\n        # Put the tools in the parent directory so the build can't\n        # clobber them by accident.\n        cd ..\n        curl --no-progress-meter -o cov-analysis-linux64.tar.gz \\\n             --form token=\"$CVT_TOKEN\" \\\n             --form project=\"$CVT_PROJECT\" \\\n             https://scan.coverity.com/download/cxx/linux64\n        echo Extracting...\n        mkdir cov-analysis-linux64\n        tar xzf cov-analysis-linux64.tar.gz --strip 1 -C cov-analysis-linux64\n        echo done.\n        if [ -f cov-analysis-linux64/VERSION ]; then\n          echo ::group::Coverity tool versions\n          echo + cat cov-analysis-linux64/VERSION\n          echo\n          cat cov-analysis-linux64/VERSION\n          echo ::endgroup::\n        fi\n\n    - name: Versions of build tools\n      id: build-tools\n      run: ./build-aux/ci/ci-log-dependency-versions\n\n    - name: Get nprocs\n      run: echo \"NPROCS=$((`nproc --all 2>/dev/null || sysctl -n hw.ncpu` * 2))\" | tee $GITHUB_ENV\n\n    - name: Cache bootstrap\n      id: cache\n      uses: actions/cache@v4\n      with:\n        path: |\n          INSTALL\n          Makefile.in\n          aclocal.m4\n          config.h.in\n          configure\n          autom4te.cache/**\n          build-aux/m4/libtool.m4\n          build-aux/m4/ltoptions.m4\n          build-aux/m4/ltsugar.m4\n          build-aux/m4/ltversion.m4\n          build-aux/m4/lt~obsolete.m4\n          build-aux/m4-autogen/**\n        key: autoreconf-${{ steps.build-tools.outputs.autotools-ver }}-${{ hashFiles('autogen.sh', 'configure.ac', 'Makefile.am', 'build-aux/m4/*.m4', 'build-aux/m4-autogen/**') }}\n\n    - name: Bootstrap\n      if: steps.cache.outputs.cache-hit != 'true'\n      run: ./autogen.sh\n\n    - name: Configure\n      run: ./configure --disable-werror --enable-obsolete-api --enable-hashes=all\n\n    - name: Prepare build script\n      run: |\n        echo '#! /bin/sh' > cov_make.sh\n        echo \"make -j${{ env.NPROCS }} all\" >> cov_make.sh\n        echo \"make -j${{ env.NPROCS }} test-programs\" >> cov_make.sh\n        chmod +x cov_make.sh\n\n    - name: Build\n      run: |\n        export PATH=$(cd .. && pwd)/cov-analysis-linux64/bin:$PATH\n        cov-build --dir cov-int ./cov_make.sh\n        cov-import-scm --dir cov-int --scm git --log cov-int/scm_log.txt\n\n    - name: Upload analysis results\n      env:\n        CVT_TOKEN: ${{ secrets.COVERITY_SCAN_TOKEN }}\n        CVT_EMAIL: ${{ secrets.COVERITY_SCAN_NOTIFICATION_EMAIL }}\n      run: |\n        tar czvf cov-int.tar.gz cov-int\n        printf 'Uploading Coverity Scan Analysis results...\\n'\n        response=$(curl -s --write-out '\\n%{http_code}\\n' \\\n          --form project=\"$CVT_PROJECT\" \\\n          --form token=\"$CVT_TOKEN\" \\\n          --form email=\"$CVT_EMAIL\" \\\n          --form file=@cov-int.tar.gz \\\n          --form version=\"${GITHUB_REF}\" \\\n          --form description=\"${GITHUB_SHA}\" \\\n          https://scan.coverity.com/builds)\n        status_code=$(echo \"$response\" | sed -n '$p')\n        if [ \"$status_code\" = \"200\" ] || [ \"$status_code\" = \"201\" ] ; then\n          printf 'Upload complete.\\n'\n          exit 0\n        else\n          TEXT=$(echo \"$response\" | sed '$d')\n          printf '\\033[33;1mCoverity Scan upload failed:\\033[0m\\n%s.\\n' \"$TEXT\"\n          exit 1\n        fi\n\n    - name: Detailed error logs\n      if: failure()\n      run: ./build-aux/ci/ci-log-logfiles\n"
  },
  {
    "path": ".github/workflows/distcheck.yml",
    "content": "name: Distcheck\n\non:\n  push:\n  pull_request:\n  schedule:\n  - cron: '31 3 * * 1'  # Monday at 3h31 UTC\n\njobs:\n  skip_duplicates:\n    # continue-on-error: true # Uncomment once integration is finished\n    runs-on: ubuntu-24.04\n    outputs:\n      should_skip: ${{ steps.skip_check.outputs.should_skip }}\n    steps:\n      - id: skip_check\n        uses: fkirc/skip-duplicate-actions@v5\n        with:\n          concurrent_skipping: 'same_content_newer'\n          skip_after_successful_duplicate: 'true'\n          paths_ignore: '[]' # changes in any file can affect distcheck\n          do_not_skip: '[\"workflow_dispatch\", \"schedule\"]'\n\n  Distcheck:\n    needs: skip_duplicates\n    if: ${{ needs.skip_duplicates.outputs.should_skip != 'true' }}\n\n    runs-on: ubuntu-24.04\n\n    strategy:\n      fail-fast: false\n\n    env:\n      ac_cv_func_arc4random_buf: \"no\"\n      VERBOSE: 1\n\n    steps:\n    - name: Checkout\n      uses: actions/checkout@v4\n\n    - name: Install packages\n      run: sudo apt-get install libltdl-dev\n\n      # The distcheck build is run with the oldest version of perl we support,\n      # in order to verify that we still support it.\n    - name: Install Perl 5.14\n      uses: shogo82148/actions-setup-perl@v1\n      with:\n        perl-version: '5.14'\n\n      # 'make distcheck' runs perlcritic on all our Perl code.\n      # Install exactly the set of critic-related CPAN distributions\n      # documented in .perlcriticrc.\n      # One perlcritic policy has a stealth dependency on aspell.\n    - name: Install perlcritic and perltidy\n      run: |\n        sudo apt-get install aspell\n        cpanm -S -M https://cpan.metacpan.org/ -n -i $(sed -Ene '\n             s/^#[[:space:]]+([A-Z0-9]+\\/.+\\.tar\\.gz)$/\\1/p\n             /^$/q\n          ' .perlcriticrc)\n\n    - name: Versions of build tools\n      id: build-tools\n      run: ./build-aux/ci/ci-log-dependency-versions\n\n    - name: Get nprocs\n      run: echo \"NPROCS=$((`nproc --all 2>/dev/null || sysctl -n hw.ncpu` * 2))\" | tee $GITHUB_ENV\n\n    - name: Cache bootstrap\n      id: cache\n      uses: actions/cache@v4\n      with:\n        path: |\n          INSTALL\n          Makefile.in\n          aclocal.m4\n          config.h.in\n          configure\n          autom4te.cache/**\n          build-aux/m4/libtool.m4\n          build-aux/m4/ltoptions.m4\n          build-aux/m4/ltsugar.m4\n          build-aux/m4/ltversion.m4\n          build-aux/m4/lt~obsolete.m4\n          build-aux/m4-autogen/**\n        key: autoreconf-${{ steps.build-tools.outputs.autotools-ver }}-${{ hashFiles('autogen.sh', 'configure.ac', 'Makefile.am', 'build-aux/m4/*.m4', 'build-aux/m4-autogen/**') }}\n\n    - name: Bootstrap\n      if: steps.cache.outputs.cache-hit != 'true'\n      run: ./autogen.sh\n\n      # The configure options used in this step do not matter, we just need\n      # the makefile to exist.\n    - name: Configure\n      run: ./configure\n\n    - name: Test\n      run: make -j${{ env.NPROCS }} distcheck\n\n    - name: Detailed error logs\n      if: failure()\n      run: ./build-aux/ci/ci-log-logfiles\n"
  },
  {
    "path": ".github/workflows/memcheck.yml",
    "content": "name: Memory access checking\n\non:\n  push:\n  pull_request:\n\njobs:\n  skip_duplicates:\n    continue-on-error: true\n    runs-on: ubuntu-24.04\n    outputs:\n      should_skip: ${{ steps.skip_check.outputs.should_skip }}\n    steps:\n      - id: skip_check\n        uses: fkirc/skip-duplicate-actions@v5\n        with:\n          concurrent_skipping: 'same_content_newer'\n          skip_after_successful_duplicate: 'true'\n          paths_ignore: '[\"doc/**\", \"**/*.md\", \".gitignore\", \"libxcrypt.spec.rpkg\", \".packit.yaml\", \"rpkg.macros\", \"AUTHORS\", \"ChangeLog\", \"COPYING.LIB\", \"LICENSING\", \"NEWS\", \"README\", \"THANKS\", \"TODO\"]'\n          do_not_skip: '[\"workflow_dispatch\", \"schedule\"]'\n\n  Valgrind:\n    needs: skip_duplicates\n    if: ${{ needs.skip_duplicates.outputs.should_skip != 'true' }}\n\n    runs-on: ubuntu-24.04\n\n    strategy:\n      fail-fast: false\n      matrix:\n        compiler: [gcc, clang]\n\n    env:\n      ac_cv_func_arc4random_buf: \"no\"\n      CC: ${{ matrix.compiler }}\n      LDFLAGS: \"-Wl,--no-undefined-version\"\n      VERBOSE: 1\n\n    steps:\n    - name: Checkout\n      uses: actions/checkout@v4\n\n    - name: Install packages\n      run: sudo apt-get install clang libltdl-dev valgrind\n\n    - name: Versions of build tools\n      id: build-tools\n      run: ./build-aux/ci/ci-log-dependency-versions\n\n    - name: Get nprocs\n      run: echo \"NPROCS=$((`nproc --all 2>/dev/null || sysctl -n hw.ncpu` * 2))\" | tee $GITHUB_ENV\n\n    - name: Cache bootstrap\n      id: cache\n      uses: actions/cache@v4\n      with:\n        path: |\n          INSTALL\n          Makefile.in\n          aclocal.m4\n          config.h.in\n          configure\n          autom4te.cache/**\n          build-aux/m4/libtool.m4\n          build-aux/m4/ltoptions.m4\n          build-aux/m4/ltsugar.m4\n          build-aux/m4/ltversion.m4\n          build-aux/m4/lt~obsolete.m4\n          build-aux/m4-autogen/**\n        key: autoreconf-${{ steps.build-tools.outputs.autotools-ver }}-${{ hashFiles('autogen.sh', 'configure.ac', 'Makefile.am', 'build-aux/m4/*.m4', 'build-aux/m4-autogen/**') }}\n\n    - name: Bootstrap\n      if: steps.cache.outputs.cache-hit != 'true'\n      run: ./autogen.sh\n\n    - name: Configure\n      run: ./build-aux/ci/configure-wrapper --enable-obsolete-api --enable-hashes=all --enable-valgrind-memcheck\n\n    - name: Build\n      run: |\n        make -j${{ env.NPROCS }} all\n        make -j${{ env.NPROCS }} test-programs\n\n    - name: Test\n      run: make -j${{ env.NPROCS }} check-valgrind-memcheck\n\n    - name: Detailed error logs\n      if: failure()\n      run: ./build-aux/ci/ci-log-logfiles\n\n  ASan-UBSan:\n    needs: skip_duplicates\n    if: ${{ needs.skip_duplicates.outputs.should_skip != 'true' }}\n\n    runs-on: ubuntu-24.04\n\n    strategy:\n      fail-fast: false\n      matrix:\n        compiler: [gcc, clang]\n\n    env:\n      ac_cv_func_arc4random_buf: \"no\"\n      CC: ${{ matrix.compiler }}\n      DEB_BUILD_MAINT_OPTIONS: hardening=+all sanitize=+address,+leak,+undefined\n      LDFLAGS: \"-Wl,--no-undefined-version\"\n      VERBOSE: 1\n\n    steps:\n    - name: Checkout\n      uses: actions/checkout@v4\n\n    - name: Install packages\n      run: |\n        packages=\"libltdl-dev\"\n        if [ \"$CC\" = clang ]; then\n          packages=\"$packages clang\"\n        fi\n        sudo apt-get install $packages\n\n    - name: Versions of build tools\n      id: build-tools\n      run: ./build-aux/ci/ci-log-dependency-versions\n\n    - name: Cache bootstrap\n      id: cache\n      uses: actions/cache@v4\n      with:\n        path: |\n          INSTALL\n          Makefile.in\n          aclocal.m4\n          config.h.in\n          configure\n          autom4te.cache/**\n          build-aux/m4/libtool.m4\n          build-aux/m4/ltoptions.m4\n          build-aux/m4/ltsugar.m4\n          build-aux/m4/ltversion.m4\n          build-aux/m4/lt~obsolete.m4\n          build-aux/m4-autogen/**\n        key: autoreconf-${{ steps.build-tools.outputs.autotools-ver }}-${{ hashFiles('autogen.sh', 'configure.ac', 'Makefile.am', 'build-aux/m4/*.m4', 'build-aux/m4-autogen/**') }}\n\n    - name: Bootstrap\n      if: steps.cache.outputs.cache-hit != 'true'\n      run: ./autogen.sh\n\n    - name: Configure\n      run: ./build-aux/ci/configure-wrapper --enable-obsolete-api --enable-hashes=all\n\n    - name: Build\n      run: |\n        make -j${{ env.NPROCS }} all UNDEF_FLAG=\n        make -j${{ env.NPROCS }} test-programs UNDEF_FLAG=\n\n    - name: Test\n      run: make -j${{ env.NPROCS }} check\n\n    - name: Detailed error logs\n      if: failure()\n      run: ./build-aux/ci/ci-log-logfiles\n"
  },
  {
    "path": ".gitignore",
    "content": "# http://www.gnu.org/software/automake\n/Makefile\n/Makefile.deps\n/Makefile.in\n.deps/\n.dirstamp\n.libs/\n/INSTALL\n\n# http://www.gnu.org/software/autoconf\n/aclocal.m4\n/autom4te.cache\n/config.cache\n/config.h\n/config.h.in\n/config.log\n/config.status\n/configure\n/crypt.h.in\n/libtool\n/libxcrypt.pc\n/stamp-h1\n/build-aux/m4/libtool.m4\n/build-aux/m4/ltoptions.m4\n/build-aux/m4/ltsugar.m4\n/build-aux/m4/ltversion.m4\n/build-aux/m4/lt~obsolete.m4\n/build-aux/m4-autogen/*\n\n\n# compiler output\n*.gcda\n*.gcno\n*.la\n*.lo\n*.log\n*.o\n*.so\n*.trs\n*.T\n/crypt.h\n/crypt.h.stamp\n/crypt-hashes.h\n/crypt-hashes.h.stamp\n/crypt-symbol-vers.h\n/crypt-symbol-vers.h.stamp\n/libcrypt.map\n/libcrypt.map.stamp\ngen-des-tables\ntest/alg-des\ntest/alg-gost3411-2012\ntest/alg-gost3411-2012-hmac\ntest/alg-hmac-sha1\ntest/alg-md4\ntest/alg-md5\ntest/alg-pbkdf-hmac-sha256\ntest/alg-sha1\ntest/alg-sha256\ntest/alg-sha512\ntest/alg-sm3\ntest/alg-sm3-hmac\ntest/alg-yescrypt\ntest/badsalt\ntest/badsetting\ntest/bigcrypt\ntest/byteorder\ntest/checksalt\ntest/compile-strong-alias\ntest/crypt-badargs\ntest/crypt-bcrypt\ntest/crypt-des\ntest/crypt-gost-yescrypt\ntest/crypt-kat\ntest/crypt-md5\ntest/crypt-nested-call\ntest/crypt-nthash\ntest/crypt-pbkdf1-sha1\ntest/crypt-scrypt\ntest/crypt-sha256\ntest/crypt-sha512\ntest/crypt-sm3-yescrypt\ntest/crypt-sunmd5\ntest/crypt-too-long-phrase\ntest/crypt-yescrypt\ntest/des-obsolete\ntest/des-obsolete_r\ntest/explicit-bzero\ntest/fcrypt-enosys\ntest/gensalt\ntest/gensalt-bcrypt_x\ntest/gensalt-nested-call\ntest/gensalt-nthash\ntest/gensalt-extradata\ntest/getrandom-fallbacks\ntest/getrandom-interface\ntest/ka-bcrypt\ntest/ka-bcrypt-a\ntest/ka-bcrypt-x\ntest/ka-bcrypt-y\ntest/ka-bigcrypt\ntest/ka-bsdicrypt\ntest/ka-descrypt\ntest/ka-gost-yescrypt\ntest/ka-md5crypt\ntest/ka-nt\ntest/ka-scrypt\ntest/ka-sha1crypt\ntest/ka-sha256crypt\ntest/ka-sha512crypt\ntest/ka-sm3crypt\ntest/ka-sm3-yescrypt\ntest/ka-sunmd5\ntest/ka-yescrypt\ntest/preferred-method\ntest/short-outbuf\ntest/special-char-salt\n/xcrypt.h\n/xcrypt.h.stamp\n\n# backup-files\n*~\n\n# archives\n*.tar*\n\n# GnuPG keyrings\n*.asc\n*.gpg\n\n# Valgrind\nvgcore.*\n\n# Patch\n*.orig\n*.rej\n\n# Coverage\nall_coverage.info\ncoverage.info\n\n# Packit\nlibxcrypt.spec\nlibxcrypt-*.rpm\nlibxcrypt-*.srpm\nlibxcrypt-*.src.rpm\nlibxcrypt-*/\n*/libxcrypt-*.rpm\n"
  },
  {
    "path": ".packit.yaml",
    "content": "specfile_path: libxcrypt.spec\n\nfiles_to_sync:\n  - libxcrypt.spec\n  - .packit.yaml\n\nupstream_package_name: libxcrypt\nupstream_project_url: https://github.com/besser82/libxcrypt\nupstream_tag_template: v{version}\ndownstream_package_name: libxcrypt\ndist_git_namespace: rpms\ncreate_pr: True\n\nactions:\n  post-upstream-clone: \"wget https://src.fedoraproject.org/rpms/libxcrypt/raw/main/f/libxcrypt.spec -O libxcrypt.spec\"\n  post-modifications: \"sed -i -e 's!%bcond_with    bootstrap!%bcond_without bootstrap!g' -e 's!^Patch!#&!g' libxcrypt.spec\"\n\njobs:\n- job: upstream_koji_build\n  trigger: commit\n  metadata:\n    branch: develop\n    scratch: true\n    targets: fedora-all\n\n- job: upstream_koji_build\n  trigger: pull_request\n  metadata:\n    scratch: true\n    targets: fedora-all\n\n- job: propose_downstream\n  trigger: release\n"
  },
  {
    "path": ".perlcriticrc",
    "content": "# Perl::Critic configuration.  -*- conf -*-\n#\n# This .perlcriticrc expects precisely the following set of critic\n# policies and related distributions to be installed, **and no others**:\n#\n#          SHANCOCK/Perl-Tidy-20210402.tar.gz\n#          PETDANCE/Perl-Critic-1.140.tar.gz\n#          DBOOK/Perl-Critic-Community-v1.0.0.tar.gz\n#          KRYDE/Perl-Critic-Pulp-99.tar.gz\n#          GUGOD/Perl-Critic-TooMuchCode-0.15.tar.gz\n#\n# Make sure to keep this list in sync with the CI configuration.\n#\n# In order to ensure stable lint results, we explicitly enable or\n# disable every single policy from the policy packages we use, and we\n# have an ancillary script (build-aux/scripts/check-perlcritic-config)\n# that enforces that _all_ installed policies are mentioned and _all_\n# mentioned policies are installed.\n\n# Start from the empty set, but with severity maxed.\nseverity = 1\nonly = 1\n\n# compilation-mode--compatible diagnostic formatting\nverbose = %f:%l:%c: warning: %m (%p; %e)\\n\n\n# Policies are listed strictly in alphabetical order.\n# Each disabled policy should be annotated with an explanation.\n\n[-BuiltinFunctions::ProhibitBooleanGrep]\n# The rationale for prohibiting boolean 'grep' is sensible\n# (it doesn't short-circuit, which could be a huge waste of time)\n# but the recommended alternative is 'any' from List::MoreUtils,\n# which would be the only CPAN dependency we had.\n\n[BuiltinFunctions::ProhibitComplexMappings]\n\n[BuiltinFunctions::ProhibitLvalueSubstr]\n\n[BuiltinFunctions::ProhibitReverseSortBlock]\n\n[BuiltinFunctions::ProhibitShiftRef]\n\n[BuiltinFunctions::ProhibitSleepViaSelect]\n\n[BuiltinFunctions::ProhibitStringyEval]\n\n[BuiltinFunctions::ProhibitStringySplit]\n\n[BuiltinFunctions::ProhibitUniversalCan]\n\n[BuiltinFunctions::ProhibitUniversalIsa]\n\n[BuiltinFunctions::ProhibitUselessTopic]\n\n[BuiltinFunctions::ProhibitVoidGrep]\n\n[BuiltinFunctions::ProhibitVoidMap]\n\n[BuiltinFunctions::RequireBlockGrep]\n\n[BuiltinFunctions::RequireBlockMap]\n\n[BuiltinFunctions::RequireGlobFunction]\n\n[BuiltinFunctions::RequireSimpleSortBlock]\n\n[ClassHierarchies::ProhibitAutoloading]\n\n[ClassHierarchies::ProhibitExplicitISA]\n\n[ClassHierarchies::ProhibitOneArgBless]\n\n[CodeLayout::ProhibitFatCommaNewline]\n\n[CodeLayout::ProhibitHardTabs]\n\n[CodeLayout::ProhibitIfIfSameLine]\n\n[CodeLayout::ProhibitParensWithBuiltins]\n\n[CodeLayout::ProhibitQuotedWordLists]\n\n[CodeLayout::ProhibitTrailingWhitespace]\n\n[CodeLayout::RequireConsistentNewlines]\n\n[CodeLayout::RequireFinalSemicolon]\n\n[CodeLayout::RequireTidyCode]\nperltidyrc = .perltidyrc\n\n[CodeLayout::RequireTrailingCommaAtNewline]\n\n[CodeLayout::RequireTrailingCommas]\n\n[-Community::AmpersandSubCalls]\n# Duplicates core or pulp policy.\n\n[-Community::ArrayAssignAref]\n# Duplicates core or pulp policy.\n\n[-Community::BarewordFilehandles]\n# Duplicates core or pulp policy.\n\n[-Community::ConditionalDeclarations]\n# Duplicates core or pulp policy.\n\n[Community::ConditionalImplicitReturn]\n\n[Community::DeprecatedFeatures]\n\n[-Community::DiscouragedModules]\n# FindBin works fine for our purposes, and we can't use CPAN modules.\n# There is no option to ignore use of just one module\n# (https://github.com/Grinnz/Perl-Critic-Community/issues/42)\n\n[Community::DollarAB]\n\n[-Community::Each]\n# I don't agree with this style rule.\n\n[Community::EmptyReturn]\n\n[-Community::IndirectObjectNotation]\n# Duplicates core or pulp policy.\n\n[-Community::LexicalForeachIterator]\n# Duplicates core or pulp policy.\n\n[-Community::LoopOnHash]\n# Duplicates core or pulp policy.\n\n[Community::ModPerl]\n\n[Community::MultidimensionalArrayEmulation]\n\n[-Community::OpenArgs]\n# Duplicates core or pulp policy.\n\n[Community::OverloadOptions]\n\n[-Community::POSIXImports]\n# Duplicates core or pulp policy.\n\n[-Community::PackageMatchesFilename]\n# Duplicates core or pulp policy.\n\n[Community::PreferredAlternatives]\n\n[-Community::Prototypes]\n# Duplicates core or pulp policy.\n\n[-Community::StrictWarnings]\n# Duplicates core or pulp policy.\n\n[Community::Threads]\n\n[-Community::Wantarray]\n# I don't agree with this style rule.\n\n[Community::WarningsSwitch]\n\n[-Community::WhileDiamondDefaultAssignment]\n# I don't agree with this style rule.\n\n[Compatibility::ConstantLeadingUnderscore]\n\n[Compatibility::ConstantPragmaHash]\n\n[Compatibility::Gtk2Constants]\n\n[Compatibility::PodMinimumVersion]\n\n[Compatibility::ProhibitUnixDevNull]\n\n[ControlStructures::ProhibitCStyleForLoops]\n\n[ControlStructures::ProhibitCascadingIfElse]\nmax_elsif = 3\n\n[ControlStructures::ProhibitDeepNests]\n\n[ControlStructures::ProhibitLabelsWithSpecialBlockNames]\n\n[ControlStructures::ProhibitMutatingListFunctions]\n\n[ControlStructures::ProhibitNegativeExpressionsInUnlessAndUntilConditions]\n\n[-ControlStructures::ProhibitPostfixControls]\n# I don't agree with this style rule.\n\n[ControlStructures::ProhibitUnlessBlocks]\n\n[ControlStructures::ProhibitUnreachableCode]\n\n[ControlStructures::ProhibitUntilBlocks]\n\n[ControlStructures::ProhibitYadaOperator]\n\n[Documentation::PodSpelling]\n\n[Documentation::ProhibitAdjacentLinks]\n\n[Documentation::ProhibitBadAproposMarkup]\n\n[Documentation::ProhibitDuplicateHeadings]\n\n[Documentation::ProhibitDuplicateSeeAlso]\n\n[Documentation::ProhibitLinkToSelf]\n\n[Documentation::ProhibitParagraphEndComma]\n\n[Documentation::ProhibitParagraphTwoDots]\n\n[Documentation::ProhibitUnbalancedParens]\n\n[Documentation::ProhibitVerbatimMarkup]\n\n[Documentation::RequireEndBeforeLastPod]\n\n[Documentation::RequireFilenameMarkup]\n\n[Documentation::RequireFinalCut]\n\n[Documentation::RequireLinkedURLs]\n\n[Documentation::RequirePackageMatchesPodName]\n\n[Documentation::RequirePodAtEnd]\n\n[Documentation::RequirePodSections]\n\n[-ErrorHandling::RequireCarping]\n# This only makes sense for large libraries with lots of consumers.\n\n[ErrorHandling::RequireCheckingReturnValueOfEval]\n\n# All Freenode:: backward compatibility aliases are disabled.\n# See https://github.com/Grinnz/Perl-Critic-Community/issues/41\n[-Freenode::AmpersandSubCalls]\n[-Freenode::ArrayAssignAref]\n[-Freenode::BarewordFilehandles]\n[-Freenode::ConditionalDeclarations]\n[-Freenode::ConditionalImplicitReturn]\n[-Freenode::DeprecatedFeatures]\n[-Freenode::DiscouragedModules]\n[-Freenode::DollarAB]\n[-Freenode::Each]\n[-Freenode::EmptyReturn]\n[-Freenode::IndirectObjectNotation]\n[-Freenode::LexicalForeachIterator]\n[-Freenode::LoopOnHash]\n[-Freenode::ModPerl]\n[-Freenode::MultidimensionalArrayEmulation]\n[-Freenode::OpenArgs]\n[-Freenode::OverloadOptions]\n[-Freenode::POSIXImports]\n[-Freenode::PackageMatchesFilename]\n[-Freenode::PreferredAlternatives]\n[-Freenode::Prototypes]\n[-Freenode::StrictWarnings]\n[-Freenode::Threads]\n[-Freenode::Wantarray]\n[-Freenode::WarningsSwitch]\n[-Freenode::WhileDiamondDefaultAssignment]\n\n[InputOutput::ProhibitBacktickOperators]\n\n[InputOutput::ProhibitBarewordFileHandles]\n\n[InputOutput::ProhibitExplicitStdin]\n\n[InputOutput::ProhibitInteractiveTest]\n\n[InputOutput::ProhibitJoinedReadline]\n\n[InputOutput::ProhibitOneArgSelect]\n\n[InputOutput::ProhibitReadlineInForLoop]\n\n[InputOutput::ProhibitTwoArgOpen]\n\n[InputOutput::RequireBracedFileHandleWithPrint]\n\n[-InputOutput::RequireBriefOpen]\n# I can't find any explanation of what qualifies as \"brief\" and the\n# diagnostic triggers on perfectly sensible code.\n\n[InputOutput::RequireCheckedClose]\n\n[InputOutput::RequireCheckedOpen]\n\n[InputOutput::RequireCheckedSyscalls]\nfunctions = :builtins\nexclude_functions = print\n\n[InputOutput::RequireEncodingWithUTF8Layer]\n\n[Miscellanea::ProhibitFormats]\n\n[Miscellanea::ProhibitTies]\n\n[Miscellanea::ProhibitUnrestrictedNoCritic]\n\n[Miscellanea::ProhibitUselessNoCritic]\n\n[Miscellanea::TextDomainPlaceholders]\n\n[Miscellanea::TextDomainUnused]\n\n[Modules::ProhibitAutomaticExportation]\n\n[Modules::ProhibitConditionalUseStatements]\n\n[Modules::ProhibitEvilModules]\n\n[Modules::ProhibitExcessMainComplexity]\n\n[Modules::ProhibitModuleShebang]\n\n[Modules::ProhibitMultiplePackages]\n\n[Modules::ProhibitPOSIXimport]\n\n[Modules::ProhibitUseQuotedVersion]\n\n[Modules::RequireBarewordIncludes]\n\n[Modules::RequireEndWithOne]\n\n[Modules::RequireExplicitPackage]\n\n[Modules::RequireFilenameMatchesPackage]\n\n[Modules::RequireNoMatchVarsWithUseEnglish]\n\n[-Modules::RequireVersionVar]\n# This only makes sense for large libraries with lots of consumers.\n\n[-NamingConventions::Capitalization]\n# I don't agree with this style rule.\n\n[NamingConventions::ProhibitAmbiguousNames]\n\n[Objects::ProhibitIndirectSyntax]\n\n[References::ProhibitDoubleSigils]\n\n[RegularExpressions::ProhibitCaptureWithoutTest]\n\n[-RegularExpressions::ProhibitComplexRegexes]\n# The \"complex\" regexes are not that bad and splitting them up\n# would only obscure the logic.\n\n[-RegularExpressions::ProhibitEnumeratedClasses]\n# I don't agree with this style rule.\n\n[-RegularExpressions::ProhibitEscapedMetacharacters]\n# I don't agree with this style rule.\n\n[RegularExpressions::ProhibitFixedStringMatches]\n\n[RegularExpressions::ProhibitSingleCharAlternation]\n\n[RegularExpressions::ProhibitUnusedCapture]\n\n[RegularExpressions::ProhibitUnusualDelimiters]\n\n[RegularExpressions::ProhibitUselessTopic]\n\n[RegularExpressions::RequireBracesForMultiline]\n\n[-RegularExpressions::RequireDotMatchAnything]\n# I don't agree with this style rule.\n\n[-RegularExpressions::RequireExtendedFormatting]\n# I don't agree with this style rule.\n\n[-RegularExpressions::RequireLineBoundaryMatching]\n# I don't agree with this style rule.\n\n[Subroutines::ProhibitAmpersandSigils]\n\n[Subroutines::ProhibitBuiltinHomonyms]\n\n[-Subroutines::ProhibitExcessComplexity]\n# The \"complex\" subroutines are not that bad and splitting them up\n# would only obscure the logic.\n\n[Subroutines::ProhibitExplicitReturnUndef]\n\n[Subroutines::ProhibitManyArgs]\n\n[Subroutines::ProhibitNestedSubs]\n\n[Subroutines::ProhibitReturnSort]\n\n[Subroutines::ProhibitSubroutinePrototypes]\n\n[Subroutines::ProhibitUnusedPrivateSubroutines]\n\n[Subroutines::ProtectPrivateSubs]\n\n[Subroutines::RequireArgUnpacking]\n\n[Subroutines::RequireFinalReturn]\nterminal_funcs = fail skip error invocation_error subprocess_error\n\n[TestingAndDebugging::ProhibitNoStrict]\n\n[TestingAndDebugging::ProhibitNoWarnings]\nallow = experimental::smartmatch experimental::re_strict\n\n[TestingAndDebugging::ProhibitProlongedStrictureOverride]\n\n[TestingAndDebugging::RequireTestLabels]\n\n[TestingAndDebugging::RequireUseStrict]\n\n[TestingAndDebugging::RequireUseWarnings]\n\n[-TooMuchCode::ProhibitDuplicateLiteral]\n# I don't agree with this style rule.\n\n[TooMuchCode::ProhibitDuplicateSub]\n\n[TooMuchCode::ProhibitExcessiveColons]\n\n[TooMuchCode::ProhibitExtraStricture]\n\n[TooMuchCode::ProhibitLargeBlock]\n\n[TooMuchCode::ProhibitLargeTryBlock]\n\n[TooMuchCode::ProhibitUnnecessaryScalarKeyword]\n\n[-TooMuchCode::ProhibitUnnecessaryUTF8Pragma]\n# We intentionally 'use utf8' in every file, regardless of whether it\n# currently has non-ASCII characters in it.\n\n[TooMuchCode::ProhibitUnusedConstant]\n\n[TooMuchCode::ProhibitUnusedImport]\n\n[TooMuchCode::ProhibitUnusedInclude]\n\n[ValuesAndExpressions::ConstantBeforeLt]\n\n[ValuesAndExpressions::NotWithCompare]\n\n[ValuesAndExpressions::ProhibitArrayAssignAref]\n\n[ValuesAndExpressions::ProhibitBarewordDoubleColon]\n\n[ValuesAndExpressions::ProhibitCommaSeparatedStatements]\n\n[ValuesAndExpressions::ProhibitComplexVersion]\n\n[ValuesAndExpressions::ProhibitConstantPragma]\n\n[ValuesAndExpressions::ProhibitDuplicateHashKeys]\n\n[ValuesAndExpressions::ProhibitEmptyCommas]\n\n[ValuesAndExpressions::ProhibitEmptyQuotes]\n\n[ValuesAndExpressions::ProhibitEscapedCharacters]\n\n[-ValuesAndExpressions::ProhibitFiletest_f]\n# Doesn't understand the unusual, but unavoidable, uses of -f in this code\n# (to identify executables without actually running them).\n\n[ValuesAndExpressions::ProhibitImplicitNewlines]\n\n[ValuesAndExpressions::ProhibitInterpolationOfLiterals]\n\n[ValuesAndExpressions::ProhibitLeadingZeros]\n\n[ValuesAndExpressions::ProhibitLongChainsOfMethodCalls]\n\n[-ValuesAndExpressions::ProhibitMagicNumbers]\n# I don't agree with this style rule.\n\n[ValuesAndExpressions::ProhibitMismatchedOperators]\n\n[ValuesAndExpressions::ProhibitMixedBooleanOperators]\n\n[-ValuesAndExpressions::ProhibitNoisyQuotes]\n# I don't agree with this style rule.\n\n[ValuesAndExpressions::ProhibitNullStatements]\n\n[ValuesAndExpressions::ProhibitQuotesAsQuotelikeOperatorDelimiters]\n\n[ValuesAndExpressions::ProhibitSpecialLiteralHeredocTerminator]\n\n[ValuesAndExpressions::ProhibitUnknownBackslash]\n\n[-ValuesAndExpressions::ProhibitVersionStrings]\n# Version strings were only problematic in versions of Perl older than\n# our minimum.\n\n[ValuesAndExpressions::RequireConstantVersion]\n\n[ValuesAndExpressions::RequireInterpolationOfMetachars]\n\n[ValuesAndExpressions::RequireNumberSeparators]\n\n[ValuesAndExpressions::RequireNumericVersion]\n\n[ValuesAndExpressions::RequireQuotedHeredocTerminator]\n\n[ValuesAndExpressions::RequireUpperCaseHeredocTerminator]\n\n[ValuesAndExpressions::UnexpandedSpecialLiteral]\n\n[Variables::ProhibitAugmentedAssignmentInDeclaration]\n\n[Variables::ProhibitConditionalDeclarations]\n\n[Variables::ProhibitLocalVars]\n\n[Variables::ProhibitLoopOnHash]\n\n[Variables::ProhibitMatchVars]\n\n[Variables::ProhibitPackageVars]\n\n[Variables::ProhibitPerl4PackageNames]\n\n[-Variables::ProhibitPunctuationVars]\n# I don't agree with this style rule.\n\n[Variables::ProhibitReusedNames]\n\n[Variables::ProhibitUnusedVariables]\n\n[Variables::ProtectPrivateVars]\n\n[-Variables::RequireInitializationForLocalVars]\n# I'd *like* to disable this *only* for $_, where the whole point is\n# that it gets written to (and read from) implicitly, but that's not\n# possible.\n\n[Variables::RequireLexicalLoopIterators]\n\n[Variables::RequireLocalizedPunctuationVars]\n\n[Variables::RequireNegativeIndices]\n"
  },
  {
    "path": ".perltidyrc",
    "content": "# perltidy configuration\n\n--standard-error-output\n--warning-output\n--character-encoding=utf8\n--converge\n\n--continuation-indentation=4\n\n--cuddled-else\n--noblanks-before-comments\n--noblanks-before-blocks\n--paren-tightness=2            # no spaces inside parens\n--brace-tightness=2            # no spaces inside braces\n--square-bracket-tightness=2   # no spaces inside brackets\n"
  },
  {
    "path": "AUTHORS",
    "content": "The yescrypt code comes from yescrypt by Solar Designer <solar at\nopenwall.com>. It builds upon Colin Percival's scrypt.\nSee: http://openwall.com/yescrypt/ for reference.\n\nThe bcrypt hash module comes from crypt_blowfish, originally written\nby Solar Designer <solar at openwall.com> and based on algorithms and\nideas by Niels Provos <provos at citi.umich.edu> and David Mazieres\n<dm at lcs.mit.edu>.\n\nThe MD5, SHA256, and SHA512 hash modules, and the underlying\nsecure-hash primitives, were originally written by Ulrich Drepper\n<drepper at cygnus.com> as part of the GNU C Library.  Other people\nmay also have contributed to them; our records are incomplete.\n\nThe DES hash module was originally FreeSec, written by David Burren\n<davidb at werj.com.au> for the NetBSD project, and since extensively\nmodified by Geoffrey M. Rehmet, Mark R V Murray, and Zack Weinberg.\n\nThe NTHASH module comes from FreeBSD, originally written by Michael\nBretterklieber and based on the password hashing algorithm used by\nthe Windows NT LAN Manager (NTLM) from Microsoft Corporation to\nprovide easier compatibility with NT accounts.\n\nThe SUNMD5 hash module is a clean-room reimplementation by Zack Weinberg,\nbased on a specification written by Eli Collins for the Passlib project,\nof an algorithm originally developed by Alec Muffett for use in Solaris 9.\n\nThe crypt and gensalt backends for yescrypt and gost-yescrypt are by\nVitaly Chikunov.\n\nThe implementation of the public interface (crypt, crypt_r, etc) is a\nmashup of code from the GNU C Library with code from crypt_blowfish,\noriginally put together by Thorsten Kukuk and since completely\nrewritten by Björn Esser and Zack Weinberg.\n\nThe above components were assembled into this library by Thorsten Kukuk\n<kukuk at suse.de>, Björn Esser <besser82 at fedoraproject.org>, and\nZack Weinberg <zackw at panix.com>.\n"
  },
  {
    "path": "COPYING.LIB",
    "content": "                  GNU LESSER GENERAL PUBLIC LICENSE\n                       Version 2.1, February 1999\n\n Copyright (C) 1991, 1999 Free Software Foundation, Inc.\n 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n[This is the first released version of the Lesser GPL.  It also counts\n as the successor of the GNU Library Public License, version 2, hence\n the version number 2.1.]\n\n                            Preamble\n\n  The licenses for most software are designed to take away your\nfreedom to share and change it.  By contrast, the GNU General Public\nLicenses are intended to guarantee your freedom to share and change\nfree software--to make sure the software is free for all its users.\n\n  This license, the Lesser General Public License, applies to some\nspecially designated software packages--typically libraries--of the\nFree Software Foundation and other authors who decide to use it.  You\ncan use it too, but we suggest you first think carefully about whether\nthis license or the ordinary General Public License is the better\nstrategy to use in any particular case, based on the explanations below.\n\n  When we speak of free software, we are referring to freedom of use,\nnot price.  Our General Public Licenses are designed to make sure that\nyou have the freedom to distribute copies of free software (and charge\nfor this service if you wish); that you receive source code or can get\nit if you want it; that you can change the software and use pieces of\nit in new free programs; and that you are informed that you can do\nthese things.\n\n  To protect your rights, we need to make restrictions that forbid\ndistributors to deny you these rights or to ask you to surrender these\nrights.  These restrictions translate to certain responsibilities for\nyou if you distribute copies of the library or if you modify it.\n\n  For example, if you distribute copies of the library, whether gratis\nor for a fee, you must give the recipients all the rights that we gave\nyou.  You must make sure that they, too, receive or can get the source\ncode.  If you link other code with the library, you must provide\ncomplete object files to the recipients, so that they can relink them\nwith the library after making changes to the library and recompiling\nit.  And you must show them these terms so they know their rights.\n\n  We protect your rights with a two-step method: (1) we copyright the\nlibrary, and (2) we offer you this license, which gives you legal\npermission to copy, distribute and/or modify the library.\n\n  To protect each distributor, we want to make it very clear that\nthere is no warranty for the free library.  Also, if the library is\nmodified by someone else and passed on, the recipients should know\nthat what they have is not the original version, so that the original\nauthor's reputation will not be affected by problems that might be\nintroduced by others.\n\f\n  Finally, software patents pose a constant threat to the existence of\nany free program.  We wish to make sure that a company cannot\neffectively restrict the users of a free program by obtaining a\nrestrictive license from a patent holder.  Therefore, we insist that\nany patent license obtained for a version of the library must be\nconsistent with the full freedom of use specified in this license.\n\n  Most GNU software, including some libraries, is covered by the\nordinary GNU General Public License.  This license, the GNU Lesser\nGeneral Public License, applies to certain designated libraries, and\nis quite different from the ordinary General Public License.  We use\nthis license for certain libraries in order to permit linking those\nlibraries into non-free programs.\n\n  When a program is linked with a library, whether statically or using\na shared library, the combination of the two is legally speaking a\ncombined work, a derivative of the original library.  The ordinary\nGeneral Public License therefore permits such linking only if the\nentire combination fits its criteria of freedom.  The Lesser General\nPublic License permits more lax criteria for linking other code with\nthe library.\n\n  We call this license the \"Lesser\" General Public License because it\ndoes Less to protect the user's freedom than the ordinary General\nPublic License.  It also provides other free software developers Less\nof an advantage over competing non-free programs.  These disadvantages\nare the reason we use the ordinary General Public License for many\nlibraries.  However, the Lesser license provides advantages in certain\nspecial circumstances.\n\n  For example, on rare occasions, there may be a special need to\nencourage the widest possible use of a certain library, so that it becomes\na de-facto standard.  To achieve this, non-free programs must be\nallowed to use the library.  A more frequent case is that a free\nlibrary does the same job as widely used non-free libraries.  In this\ncase, there is little to gain by limiting the free library to free\nsoftware only, so we use the Lesser General Public License.\n\n  In other cases, permission to use a particular library in non-free\nprograms enables a greater number of people to use a large body of\nfree software.  For example, permission to use the GNU C Library in\nnon-free programs enables many more people to use the whole GNU\noperating system, as well as its variant, the GNU/Linux operating\nsystem.\n\n  Although the Lesser General Public License is Less protective of the\nusers' freedom, it does ensure that the user of a program that is\nlinked with the Library has the freedom and the wherewithal to run\nthat program using a modified version of the Library.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.  Pay close attention to the difference between a\n\"work based on the library\" and a \"work that uses the library\".  The\nformer contains code derived from the library, whereas the latter must\nbe combined with the library in order to run.\n\f\n                  GNU LESSER GENERAL PUBLIC LICENSE\n   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n\n  0. This License Agreement applies to any software library or other\nprogram which contains a notice placed by the copyright holder or\nother authorized party saying it may be distributed under the terms of\nthis Lesser General Public License (also called \"this License\").\nEach licensee is addressed as \"you\".\n\n  A \"library\" means a collection of software functions and/or data\nprepared so as to be conveniently linked with application programs\n(which use some of those functions and data) to form executables.\n\n  The \"Library\", below, refers to any such software library or work\nwhich has been distributed under these terms.  A \"work based on the\nLibrary\" means either the Library or any derivative work under\ncopyright law: that is to say, a work containing the Library or a\nportion of it, either verbatim or with modifications and/or translated\nstraightforwardly into another language.  (Hereinafter, translation is\nincluded without limitation in the term \"modification\".)\n\n  \"Source code\" for a work means the preferred form of the work for\nmaking modifications to it.  For a library, complete source code means\nall the source code for all modules it contains, plus any associated\ninterface definition files, plus the scripts used to control compilation\nand installation of the library.\n\n  Activities other than copying, distribution and modification are not\ncovered by this License; they are outside its scope.  The act of\nrunning a program using the Library is not restricted, and output from\nsuch a program is covered only if its contents constitute a work based\non the Library (independent of the use of the Library in a tool for\nwriting it).  Whether that is true depends on what the Library does\nand what the program that uses the Library does.\n\n  1. You may copy and distribute verbatim copies of the Library's\ncomplete source code as you receive it, in any medium, provided that\nyou conspicuously and appropriately publish on each copy an\nappropriate copyright notice and disclaimer of warranty; keep intact\nall the notices that refer to this License and to the absence of any\nwarranty; and distribute a copy of this License along with the\nLibrary.\n\n  You may charge a fee for the physical act of transferring a copy,\nand you may at your option offer warranty protection in exchange for a\nfee.\n\f\n  2. You may modify your copy or copies of the Library or any portion\nof it, thus forming a work based on the Library, and copy and\ndistribute such modifications or work under the terms of Section 1\nabove, provided that you also meet all of these conditions:\n\n    a) The modified work must itself be a software library.\n\n    b) You must cause the files modified to carry prominent notices\n    stating that you changed the files and the date of any change.\n\n    c) You must cause the whole of the work to be licensed at no\n    charge to all third parties under the terms of this License.\n\n    d) If a facility in the modified Library refers to a function or a\n    table of data to be supplied by an application program that uses\n    the facility, other than as an argument passed when the facility\n    is invoked, then you must make a good faith effort to ensure that,\n    in the event an application does not supply such function or\n    table, the facility still operates, and performs whatever part of\n    its purpose remains meaningful.\n\n    (For example, a function in a library to compute square roots has\n    a purpose that is entirely well-defined independent of the\n    application.  Therefore, Subsection 2d requires that any\n    application-supplied function or table used by this function must\n    be optional: if the application does not supply it, the square\n    root function must still compute square roots.)\n\nThese requirements apply to the modified work as a whole.  If\nidentifiable sections of that work are not derived from the Library,\nand can be reasonably considered independent and separate works in\nthemselves, then this License, and its terms, do not apply to those\nsections when you distribute them as separate works.  But when you\ndistribute the same sections as part of a whole which is a work based\non the Library, the distribution of the whole must be on the terms of\nthis License, whose permissions for other licensees extend to the\nentire whole, and thus to each and every part regardless of who wrote\nit.\n\nThus, it is not the intent of this section to claim rights or contest\nyour rights to work written entirely by you; rather, the intent is to\nexercise the right to control the distribution of derivative or\ncollective works based on the Library.\n\nIn addition, mere aggregation of another work not based on the Library\nwith the Library (or with a work based on the Library) on a volume of\na storage or distribution medium does not bring the other work under\nthe scope of this License.\n\n  3. You may opt to apply the terms of the ordinary GNU General Public\nLicense instead of this License to a given copy of the Library.  To do\nthis, you must alter all the notices that refer to this License, so\nthat they refer to the ordinary GNU General Public License, version 2,\ninstead of to this License.  (If a newer version than version 2 of the\nordinary GNU General Public License has appeared, then you can specify\nthat version instead if you wish.)  Do not make any other change in\nthese notices.\n\f\n  Once this change is made in a given copy, it is irreversible for\nthat copy, so the ordinary GNU General Public License applies to all\nsubsequent copies and derivative works made from that copy.\n\n  This option is useful when you wish to copy part of the code of\nthe Library into a program that is not a library.\n\n  4. You may copy and distribute the Library (or a portion or\nderivative of it, under Section 2) in object code or executable form\nunder the terms of Sections 1 and 2 above provided that you accompany\nit with the complete corresponding machine-readable source code, which\nmust be distributed under the terms of Sections 1 and 2 above on a\nmedium customarily used for software interchange.\n\n  If distribution of object code is made by offering access to copy\nfrom a designated place, then offering equivalent access to copy the\nsource code from the same place satisfies the requirement to\ndistribute the source code, even though third parties are not\ncompelled to copy the source along with the object code.\n\n  5. A program that contains no derivative of any portion of the\nLibrary, but is designed to work with the Library by being compiled or\nlinked with it, is called a \"work that uses the Library\".  Such a\nwork, in isolation, is not a derivative work of the Library, and\ntherefore falls outside the scope of this License.\n\n  However, linking a \"work that uses the Library\" with the Library\ncreates an executable that is a derivative of the Library (because it\ncontains portions of the Library), rather than a \"work that uses the\nlibrary\".  The executable is therefore covered by this License.\nSection 6 states terms for distribution of such executables.\n\n  When a \"work that uses the Library\" uses material from a header file\nthat is part of the Library, the object code for the work may be a\nderivative work of the Library even though the source code is not.\nWhether this is true is especially significant if the work can be\nlinked without the Library, or if the work is itself a library.  The\nthreshold for this to be true is not precisely defined by law.\n\n  If such an object file uses only numerical parameters, data\nstructure layouts and accessors, and small macros and small inline\nfunctions (ten lines or less in length), then the use of the object\nfile is unrestricted, regardless of whether it is legally a derivative\nwork.  (Executables containing this object code plus portions of the\nLibrary will still fall under Section 6.)\n\n  Otherwise, if the work is a derivative of the Library, you may\ndistribute the object code for the work under the terms of Section 6.\nAny executables containing that work also fall under Section 6,\nwhether or not they are linked directly with the Library itself.\n\f\n  6. As an exception to the Sections above, you may also combine or\nlink a \"work that uses the Library\" with the Library to produce a\nwork containing portions of the Library, and distribute that work\nunder terms of your choice, provided that the terms permit\nmodification of the work for the customer's own use and reverse\nengineering for debugging such modifications.\n\n  You must give prominent notice with each copy of the work that the\nLibrary is used in it and that the Library and its use are covered by\nthis License.  You must supply a copy of this License.  If the work\nduring execution displays copyright notices, you must include the\ncopyright notice for the Library among them, as well as a reference\ndirecting the user to the copy of this License.  Also, you must do one\nof these things:\n\n    a) Accompany the work with the complete corresponding\n    machine-readable source code for the Library including whatever\n    changes were used in the work (which must be distributed under\n    Sections 1 and 2 above); and, if the work is an executable linked\n    with the Library, with the complete machine-readable \"work that\n    uses the Library\", as object code and/or source code, so that the\n    user can modify the Library and then relink to produce a modified\n    executable containing the modified Library.  (It is understood\n    that the user who changes the contents of definitions files in the\n    Library will not necessarily be able to recompile the application\n    to use the modified definitions.)\n\n    b) Use a suitable shared library mechanism for linking with the\n    Library.  A suitable mechanism is one that (1) uses at run time a\n    copy of the library already present on the user's computer system,\n    rather than copying library functions into the executable, and (2)\n    will operate properly with a modified version of the library, if\n    the user installs one, as long as the modified version is\n    interface-compatible with the version that the work was made with.\n\n    c) Accompany the work with a written offer, valid for at\n    least three years, to give the same user the materials\n    specified in Subsection 6a, above, for a charge no more\n    than the cost of performing this distribution.\n\n    d) If distribution of the work is made by offering access to copy\n    from a designated place, offer equivalent access to copy the above\n    specified materials from the same place.\n\n    e) Verify that the user has already received a copy of these\n    materials or that you have already sent this user a copy.\n\n  For an executable, the required form of the \"work that uses the\nLibrary\" must include any data and utility programs needed for\nreproducing the executable from it.  However, as a special exception,\nthe materials to be distributed need not include anything that is\nnormally distributed (in either source or binary form) with the major\ncomponents (compiler, kernel, and so on) of the operating system on\nwhich the executable runs, unless that component itself accompanies\nthe executable.\n\n  It may happen that this requirement contradicts the license\nrestrictions of other proprietary libraries that do not normally\naccompany the operating system.  Such a contradiction means you cannot\nuse both them and the Library together in an executable that you\ndistribute.\n\f\n  7. You may place library facilities that are a work based on the\nLibrary side-by-side in a single library together with other library\nfacilities not covered by this License, and distribute such a combined\nlibrary, provided that the separate distribution of the work based on\nthe Library and of the other library facilities is otherwise\npermitted, and provided that you do these two things:\n\n    a) Accompany the combined library with a copy of the same work\n    based on the Library, uncombined with any other library\n    facilities.  This must be distributed under the terms of the\n    Sections above.\n\n    b) Give prominent notice with the combined library of the fact\n    that part of it is a work based on the Library, and explaining\n    where to find the accompanying uncombined form of the same work.\n\n  8. You may not copy, modify, sublicense, link with, or distribute\nthe Library except as expressly provided under this License.  Any\nattempt otherwise to copy, modify, sublicense, link with, or\ndistribute the Library is void, and will automatically terminate your\nrights under this License.  However, parties who have received copies,\nor rights, from you under this License will not have their licenses\nterminated so long as such parties remain in full compliance.\n\n  9. You are not required to accept this License, since you have not\nsigned it.  However, nothing else grants you permission to modify or\ndistribute the Library or its derivative works.  These actions are\nprohibited by law if you do not accept this License.  Therefore, by\nmodifying or distributing the Library (or any work based on the\nLibrary), you indicate your acceptance of this License to do so, and\nall its terms and conditions for copying, distributing or modifying\nthe Library or works based on it.\n\n  10. Each time you redistribute the Library (or any work based on the\nLibrary), the recipient automatically receives a license from the\noriginal licensor to copy, distribute, link with or modify the Library\nsubject to these terms and conditions.  You may not impose any further\nrestrictions on the recipients' exercise of the rights granted herein.\nYou are not responsible for enforcing compliance by third parties with\nthis License.\n\f\n  11. If, as a consequence of a court judgment or allegation of patent\ninfringement or for any other reason (not limited to patent issues),\nconditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot\ndistribute so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you\nmay not distribute the Library at all.  For example, if a patent\nlicense would not permit royalty-free redistribution of the Library by\nall those who receive copies directly or indirectly through you, then\nthe only way you could satisfy both it and this License would be to\nrefrain entirely from distribution of the Library.\n\nIf any portion of this section is held invalid or unenforceable under any\nparticular circumstance, the balance of the section is intended to apply,\nand the section as a whole is intended to apply in other circumstances.\n\nIt is not the purpose of this section to induce you to infringe any\npatents or other property right claims or to contest validity of any\nsuch claims; this section has the sole purpose of protecting the\nintegrity of the free software distribution system which is\nimplemented by public license practices.  Many people have made\ngenerous contributions to the wide range of software distributed\nthrough that system in reliance on consistent application of that\nsystem; it is up to the author/donor to decide if he or she is willing\nto distribute software through any other system and a licensee cannot\nimpose that choice.\n\nThis section is intended to make thoroughly clear what is believed to\nbe a consequence of the rest of this License.\n\n  12. If the distribution and/or use of the Library is restricted in\ncertain countries either by patents or by copyrighted interfaces, the\noriginal copyright holder who places the Library under this License may add\nan explicit geographical distribution limitation excluding those countries,\nso that distribution is permitted only in or among countries not thus\nexcluded.  In such case, this License incorporates the limitation as if\nwritten in the body of this License.\n\n  13. The Free Software Foundation may publish revised and/or new\nversions of the Lesser General Public License from time to time.\nSuch new versions will be similar in spirit to the present version,\nbut may differ in detail to address new problems or concerns.\n\nEach version is given a distinguishing version number.  If the Library\nspecifies a version number of this License which applies to it and\n\"any later version\", you have the option of following the terms and\nconditions either of that version or of any later version published by\nthe Free Software Foundation.  If the Library does not specify a\nlicense version number, you may choose any version ever published by\nthe Free Software Foundation.\n\f\n  14. If you wish to incorporate parts of the Library into other free\nprograms whose distribution conditions are incompatible with these,\nwrite to the author to ask for permission.  For software which is\ncopyrighted by the Free Software Foundation, write to the Free\nSoftware Foundation; we sometimes make exceptions for this.  Our\ndecision will be guided by the two goals of preserving the free status\nof all derivatives of our free software and of promoting the sharing\nand reuse of software generally.\n\n                            NO WARRANTY\n\n  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO\nWARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.\nEXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR\nOTHER PARTIES PROVIDE THE LIBRARY \"AS IS\" WITHOUT WARRANTY OF ANY\nKIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE\nLIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME\nTHE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN\nWRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY\nAND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU\nFOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR\nCONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE\nLIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING\nRENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A\nFAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF\nSUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH\nDAMAGES.\n\n                     END OF TERMS AND CONDITIONS\n\f\n           How to Apply These Terms to Your New Libraries\n\n  If you develop a new library, and you want it to be of the greatest\npossible use to the public, we recommend making it free software that\neveryone can redistribute and change.  You can do so by permitting\nredistribution under these terms (or, alternatively, under the terms of the\nordinary General Public License).\n\n  To apply these terms, attach the following notices to the library.  It is\nsafest to attach them to the start of each source file to most effectively\nconvey the exclusion of warranty; and each file should have at least the\n\"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the library's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This library is free software; you can redistribute it and/or\n    modify it under the terms of the GNU Lesser General Public\n    License as published by the Free Software Foundation; either\n    version 2.1 of the License, or (at your option) any later version.\n\n    This library is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n    Lesser General Public License for more details.\n\n    You should have received a copy of the GNU Lesser General Public\n    License along with this library; if not, write to the Free Software\n    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n\nAlso add information on how to contact you by electronic and paper mail.\n\nYou should also get your employer (if you work as a programmer) or your\nschool, if any, to sign a \"copyright disclaimer\" for the library, if\nnecessary.  Here is a sample; alter the names:\n\n  Yoyodyne, Inc., hereby disclaims all copyright interest in the\n  library `Frob' (a library for tweaking knobs) written by James Random Hacker.\n\n  <signature of Ty Coon>, 1 April 1990\n  Ty Coon, President of Vice\n\nThat's all there is to it!\n"
  },
  {
    "path": "ChangeLog",
    "content": "2018-01-27  Zack Weinberg <zackw@panix.com>\n\n\t* Version 4.0.0 released.\n\n\t* This project no longer maintains a GNU-style ChangeLog file.\n\tSee the Git commit history for detailed changes since 3.1.1.\n\n2015-05-13  Björn Esser <besser82@fedoraproject.org>\n\n\t* release version 3.1.1\n\n\t* README.bcrypt: whitespace clean-up\n\t* src/crypt-private.h\n\n\t* configure.ac: add '--enable-Wno-cast-align' to silence 'cast\n\t\t\tincreases required alignment'\n\n\n2015-05-12  Björn Esser <besser82@fedoraproject.org>\n\n\t* release version 3.1.0\n\n\t* configure.ac: update upstream-contact\n\n\t* configure.ac: add './configure --enable-bootstrap' to skip some\n\t\t\ttests on initial build\n\t* src/Makefile.am\n\n\t* bootstrap.sh: add bootstrap-script\n\n\t* LICENSE.bcrypt: add LICENSE for bcrypt\n\t* Makefile.am\n\n\t* plugins/blowfish/Makefile.am: update crypt_blowfish to v1.3\n\t* plugins/blowfish/blowfish-test.c\n\t* plugins/blowfish/crypt_blowfish.c\n\t* plugins/blowfish/crypt_blowfish.h\n\t* plugins/blowfish/ow-crypt.h\n\n\t* configure.ac: add '-Wextra' to CFLAGS\n\n\t* plugins/md5/md5.c: fix '-Werror=strict-aliasing'\n\t* plugins/sha256/sha256.c\n\t* plugins/sha512/sha512.c\n\n\t* src/cert.c: fix '-Werror=unused-result'\n\n\t* configure.in --> configure.ac: update Autotools\n\t* Makefile.am\n\t* m4/\n\t* plugins/blowfish/Makefile.am\n\t* plugins/md5/Makefile.am\n\t* plugins/sha256/Makefile.am\n\t* plugins/sha512/Makefile.am\n\t* src/Makefile.am\n\n2011-05-10  Thorsten Kukuk  <kukuk@suse.de>\n\n\t* release version 3.0.4\n\n\t* src/cert.c (get8): Don't save return value we never use.\n\n2009-10-29  Thorsten Kukuk  <kukuk@suse.de>\n\n\t* release version 3.0.3\n\n\t* src/xcrypt.c (__xcrypt_gensalt_r): Fix memory leak [bnc#547893].\n\n2008-11-04  Thorsten Kukuk  <kukuk@suse.de>\n\n\t* plugins/blowfish/blowfish-test.c (run): Fix compiler\n\twarnings [bnc#440134].\n\n2008-09-28  Thorsten Kukuk  <kukuk@suse.de>\n\n\t* src/xcrypt-private.h: Add prototype for _xcrypt_gensalt_sha256_rn\n\tand _xcrypt_gensalt_sha512_rn.\n\t* src/crypt_gensalt.c: Add new gensalt functions.\n\t* src/xcrypt.c: Use gensalt functions for sha512 and sha256.\n\t* src/gensalt-test.c: Enable test cases for sha256 and sha512.\n\n2008-07-16  Thorsten Kukuk  <kukuk@suse.de>\n\n\t* release version 3.0.2\n\n\t* src/xcrypt.c (__xcrypt_gensalt_r): Handle special\n\tMD5 case.\n\t* src/gensalt-test.c: New test case.\n\t* src/Makefile.am: Add gensalt-test as new test case.\n\n2008-06-24  Thorsten Kukuk  <kukuk@suse.de>\n\n\t* release version 3.0.1\n\n\t* plugins/md5/md5.c: Fix undefined macros.\n\t* plugins/sha256/sha256.c: Likewise.\n\t* plugins/sha512/sha512.c: Likewise.\n\n2008-02-15  Thorsten Kukuk  <kukuk@suse.de>\n\n\t* release version 3.0\n\n\t* plugins/*: Move all crypt related code into plugins.\n\t* plugins/sha256: New, $5$ aka sha256 hash.\n\t* plugins/sha512: New, $6$ aka sha512 hash.\n\n\t* src/sha.c: Removed.\n\t* src/sha-crypt.c: Likewise.\n\n\t* src/xcrypt.h: Add __nonnull.\n\n\t* src/crypt_util.c: Sync with glibc 2.7.\n\n\t* src/xcrypt.c: Load all hashes except DES dynamic.\n\n\t* src/Makefile.am: increase version of shared library.\n\n2006-01-06  Thorsten Kukuk  <kukuk@suse.de>\n\n\t* release version 2.4\n\n\t* src/Makefile.am: Bump minor version number\n\n\t* src/crypt_gensalt.c: Sync with crypt_blowfish 1.0.\n\n2005-09-18  Thorsten Kukuk  <kukuk@suse.de>\n\n\t* release version 2.3\n\n\t* src/x86.S: Remove.\n\n\t* src/crypt_blowfish.c: Don't use ASM on x86.\n\n2004-06-18  Thorsten Kukuk  <kukuk@suse.de>\n\n\t* release version 2.2\n\n\t* src/md5-crypt.c (__md5_crypt): Check if realloc\n\truns out of memory (from glibc CVS).\n\n\t* configure.in: Remove --noexecstack flag (compiler\n\tcan do it better itself).\n\n2003-11-14  Thorsten Kukuk  <kukuk@suse.de>\n\n\t* configure.in: Check for --noexecstack support\n\n2003-10-16  Thorsten Kukuk  <kukuk@suse.de>\n\n\t* release version 2.1\n\n\t* COPYING: Add all different copyrights.\n\n\t* src/x86.S: Added, optimized, thread safe version for ix86.\n\n\t* src/crypt_blowfish.c: Use optimized assembler functions on ix86.\n\n\t* libxcrypt.spec: New.\n\n2003-07-28  Thorsten Kukuk  <kukuk@suse.de>\n\n\t* release version 2.0\n\n\t* src/crypt_util.c: Include xcrypt-private.h only, add weak aliases.\n\t* src/wrapper.c: Likewise.\n\n\t* src/crypt_gensalt.c: Rename _crypt_* to _xcrypt_*\n\t* src/crypt_blowfish.c: Likewise.\n\n\t* src/crypt-entry.c: Include xcrypt-private.h.\n\n\t* src/crypt.c: Only include xcrypt-private.h.\n\n\t* src/xcrypt-private.h: Include xcrypt.h, undef xcrypt defines\n\t* src/xcrypt.h: Rename prototypes from crypt* to xcrypt* and\n\tadd compat defines.\n\n2003-01-16  Thorsten Kukuk  <kukuk@suse.de>\n\n\t* release version 1.4\n\n\t* src/blowfish-test.c: Add test with threads.\n\n\t* src/Makefile.am: Use AM_CFLAGS instead of CFLAGS,\n\t(blowfish_test_LDFLAGS): Add libpthread,\n\t(blowfish_test_CFLAGS): Define number of threads for test.\n\t* src/crypt_util.c: Don't define _LIBC for libc-lock.h,\n\tredefine __libc_lock_t with pthread_mutex_t.\n\n\t* src/crypt_blowfish.c: Sync with version 0.4.5\n\n2003-01-10  Thorsten Kukuk  <kukuk@suse.de>\n\n\t* release version 1.3\n\n2002-11-04  Thorsten Kukuk  <kukuk@suse.de>\n\n\t* src/crypt_util.c (__init_des_r): Sync with current glibc CVS\n\t(fix initialisation of internal data struct).\n\n\t* src/md5test.c (main): Sync with current glibc CVS (add test\n\tcase for above crypt_util fix).\n\n\n2002-10-21  Thorsten Kukuk  <kukuk@suse.de>\n\n\t* release version 1.2\n\n\t* src/crypt_util.c: undef _LIBC after inclusion of libc-lock.h\n\t* src/crypt_blowfish.c: Add support for hppa\n\t* configure.in: bump version number to 1.2\n\n2002-05-27  Thorsten Kukuk  <kukuk@suse.de>\n\n\t* release version 1.1\n\n\t* src/sha.c: New file.\n\t* src/sha-crypt.c: New file.\n\t* src/md5-private.h: Renamed to ...\n\t* src/xcrypt-private.h: ... to this.\n\t* src/crypt_gensalt.c: Add dummy function for SHA1.\n\t* src/wrapper.c: Call SHA1 functions.\n\n2002-05-14  Thorsten Kukuk  <kukuk@suse.de>\n\n\t* src/xcrypt.h: Add prototpyes for SHA1 functions.\n\n\t* src/wrapper.c: Don't include md5.h.\n\n\t* src/md5-crypt.c: Include xcrypt.h instead of md5.h.\n\t* src/md5test.c: Likewise.\n\t* src/md5.c: Likewise.\n\n\t* src/xcrypt.h: Add prototypes from md5.h.\n\t* src/md5.h: Removed.\n\n2002-04-13  Thorsten Kukuk  <kukuk@suse.de>\n\n\t* release version 1.0\n"
  },
  {
    "path": "LICENSING",
    "content": "# Detailed copyright and licensing information for libxcrypt\n\nThe overall license for libxcrypt is the GNU Lesser General Public\nLicense, version 2.1 (or, at your option, any later version); see\nthe file COPYING.LIB for the full terms of this license.\n\nMany individual files are under other licenses.  This file provides an\ninventory of the copyright holders and licenses of all files in the\nsource tree.  For specific licensing terms consult the files themselves.\n\n * Copyright Thorsten Kukuk, Björn Esser, Zack Weinberg; LGPL (v2.1 or later):\n   crypt.c, crypt-static.c, crypt-gensalt-static.c, crypt-port.h\n\n * Copyright Free Software Foundation, Inc.; LGPL (v2.1 or later):\n   crypt.h, crypt-obsolete.h, crypt-md5.c,\n   test-badsalt.c, test-crypt-nonnull.c, test-explicit-bzero.c\n\n * Copyright David Burren et al.; 3-clause BSD:\n   alg-des.h, alg-des.c, alg-des-tables.c,\n   crypt-des.c, crypt-des-obsolete.c, gen-des-tables.c\n\n * Public domain, written by Ulrich Drepper et al.:\n   crypt-sha256.c, crypt-sha512.c, crypt-sm3.c\n\n * Public domain, written by Solar Designer et al.:\n   alg-md4.h, alg-md4.c, alg-md5.h, alg-md5.c,\n   crypt-bcrypt.c, crypt-gensalt.c, test-crypt-bcrypt.c\n\n * Copyright Solar Designer, Colin Percival; 0-clause BSD:\n   alg-yescrypt-common.c, alg-yescrypt-platform.c\n\n * Copyright Solar Designer, Colin Percival; 2-clause BSD:\n   alg-sha256.c, alg-sha256.h, alg-yescrypt.h, alg-yescrypt-opt.c\n\n * Copyright Colin Percival; 2-clause BSD:\n   alg-sha512.h, alg-sha512.c\n\n * Copyright Alexey Degtyarev; 2-clause BSD:\n   alg-gost3411-2012-const.h, alg-gost3411-2012-core.c,\n   alg-gost3411-2012-core.h, alg-gost3411-2012-precalc.h,\n   alg-gost3411-2012-ref.h\n\n * Copyright Vitaly Chikunov, Björn Esser; 0-clause BSD:\n   alg-gost3411-2012-hmac.c, alg-gost3411-2012-hmac.h,\n   crypt-gost-yescrypt.c, test-alg-gost3411-2012.c,\n   test-alg-gost3411-2012-hmac.c, test-crypt-gost-yescrypt.c,\n   test-crypt-scrypt.c\n\n * Copyright Alexander Peslyak; 0-clause BSD:\n   test-alg-yescrypt.c\n\n * Copyright Alexander Peslyak, Björn Esser; 0-clause BSD:\n   crypt-scrypt.c\n\n * Copyright Björn Esser; 0-clause BSD:\n   alg-sm3.c, alg-sm3.h, alg-sm3-hmac.h, alg-sm3-hmac.c,\n   crypt-sm3-yescrypt.c, crypt-common.c, test-checksalt.c,\n   test-compile-strong-alias.c, test/crypt-nested-call.c,\n   test/gensalt-nested-call.c, test-gensalt-nthash.c,\n   test-short-outbuf.c, test-special-char-salt.c\n\n * Copyright Michael Bretterklieber, Björn Esser et al.; 2-clause BSD:\n   crypt-nthash.c\n\n * Copyright Zack Weinberg; 2-clause BSD:\n   crypt-sunmd5.c\n\n * Public domain, written by Steve Reid et al.:\n   alg-sha1.c, alg-sha1.h, test-alg-sha1.c\n\n * Copyright Juniper Networks, Inc.; 3-clause BSD:\n   crypt-pbkdf1-sha1.c, crypt-pbkdf1-sha1.c\n\n * Copyright Björn Esser; 2-clause BSD:\n   alg-hmac-sha1.c, alg-hmac-sha1.h, test-alg-hmac-sha1.c\n\n * Public domain, written by Zack Weinberg et al.:\n   byteorder.h, randombytes.c, test-byteorder.c\n   test-alg-pbkdf-hmac-sha256.c\n   test-badsetting.c, test-crypt-badargs.c, test-getrandom-fallbacks.c,\n   test-getrandom-interface.c, test-symbols-compat.sh,\n   test-symbols-renames.sh, test-symbols-static.sh,\n   build-aux/scripts/gen-crypt-h,\n   build-aux/scripts/gen-crypt-symbol-vers-h,\n   build-aux/scripts/gen-libcrypt-map,\n   build-aux/scripts/skip-if-exec-format-error,\n   build-aux/m4/zw_alignment.m4, build-aux/m4/zw_static_assert.m4,\n   build-aux/m4/zw_endianness.m4, build-aux/m4/zw_ld_wrap.m4\n\n * Copyright Zack Weinberg and Free Software Foundation, Inc;\n   GPL (v3 or later), with Autoconf exception:\n   build-aux/m4/zw_automodern.m4, build-aux/m4/zw_simple_warnings.m4\n\n * Copyright <vt at altlinux.org>; 0-clause BSD:\n   crypt-yescrypt.c, test-crypt-yescrypt.c\n\n * Copyright Kevin Cernekee; FSF All Permissive License:\n   build-aux/m4/ax_check_vscript.m4\n\n * Copyright Maarten Bosmans; FSF All Permissive License:\n   build-aux/m4/ax_append_compile_flags.m4\n\n * Copyright Guido U. Draheim, Maarten Bosmans;\n   FSF All Permissive License:\n   build-aux/m4/ax_append_flag.m4, build-aux/m4/ax_check_compile_flag.m4\n\n * Copyright Mike Frysinger; FSF All Permissive License:\n   build-aux/m4/ax_require_defined.m4\n\n * Copyright Gabriele Svelto; FSF All Permissive License:\n   build-aux/m4/ax_gcc_func_attribute.m4\n\n * Copyright Scott James Remnant, Dan Nicholson;\n   GPL (v2 or later), with Autoconf exception:\n   build-aux/m4/pkg_installdir_compat.m4\n\n * Copyright Tim Toolan; FSF All Permissive License:\n   build-aux/m4/ax_compare_version.m4\n\n * Copyright Philip Withnall; FSF All Permissive License:\n   build-aux/m4/ax_valgrind_check.m4\n\n * Copyright Steven G. Johnson, Daniel Richard G.;\n   GPL (v3 or later), with Autoconf exception:\n   build-aux/m4/ax_pthread.m4\n\n * Copyright Francesco Salvestrini; FSF All Permissive License:\n   build-aux/m4/ax_prog_python_version.m4\n\n * Copyright Andrew Collier; FSF All Permissive License:\n   build-aux/m4/ax_python_module.m4\n\n * Copyright holders unknown, no statement of license (all of these\n   files are part of the testsuite and do not contribute to the\n   installed library or its headers):\n   test-alg-des.c, test-alg-md4.c (adaption of test-alg-md5.c),\n   test-alg-md5.c, test-alg-sha256.c, test-alg-sha512.c, test-crypt-des.c,\n   test-crypt-md5.c, test-crypt-sha256.c, test-crypt-sha512.c,\n   test-des-cases.h, test-des-obsolete{,_r}.c, test-gensalt.c,\n   test-crypt-nthash.c (adaption of test-crypt-des.c),\n   test-crypt-sunmd5.c (adaption of test-crypt-des.c),\n   test-crypt-pbkdf1-sha1.c (adaption of test-crypt-des.c)\n\n * The NEWS file formerly contained the following copyright assertions:\n\n     Copyright 2002, 2003, 2004 SuSE Linux AG, Germany\n     Copyright 2005, 2008, 2009 2011 SUSE LINUX Products GmbH, Germany\n     Copyright 2015 Björn Esser\n\n   These were meant to apply to the library as a whole rather than\n   specific files or portions of files.\n"
  },
  {
    "path": "Makefile.am",
    "content": "#\n# Copyright (c) 2002, 2007 SuSE Linux AG, Germany\n#\n# Author: Thorsten Kukuk <kukuk@suse.de>\n#\n\nAUTOMAKE_OPTIONS = \\\n\t1.14 \\\n\tdist-bzip2 \\\n\tdist-xz \\\n\tfilename-length-max=99 \\\n\tgnits \\\n\tsubdir-objects\n\nACLOCAL_AMFLAGS = -I build-aux/m4\n\nAM_CPPFLAGS = -I$(srcdir)/lib\nAM_CFLAGS = $(WARN_CFLAGS) $(OPTI_FLAGS)\nAM_LDFLAGS = $(RELRO_FLAG) $(BINDNOW_FLAG)\n\nSCRIPTS_AUX = $(srcdir)/build-aux/scripts\nSTAMP = echo timestamp >\n\n@VALGRIND_CHECK_RULES@\n\nTEST_EXTENSIONS = .pl\n\nEXTRA_DIST = \\\n\tLICENSING \\\n\tTHANKS \\\n\tlib/alg-yescrypt-platform.c \\\n\tlib/crypt.h.in \\\n\tlib/hashes.conf \\\n\tlib/libcrypt.map.in \\\n\tlib/libcrypt.minver \\\n\tlib/xcrypt.h.in \\\n\tbuild-aux/scripts/BuildCommon.pm \\\n\tbuild-aux/scripts/check-perlcritic-config \\\n\tbuild-aux/scripts/compute-symver-floor \\\n\tbuild-aux/scripts/expand-selected-hashes \\\n\tbuild-aux/scripts/gen-crypt-h \\\n\tbuild-aux/scripts/gen-crypt-hashes-h \\\n\tbuild-aux/scripts/gen-crypt-symbol-vers-h \\\n\tbuild-aux/scripts/gen-libcrypt-map \\\n\tbuild-aux/scripts/move-if-change \\\n\tbuild-aux/scripts/skip-if-exec-format-error \\\n\ttest/TestCommon.pm \\\n\ttest/symbols-compat.pl \\\n\ttest/symbols-renames.pl \\\n\ttest/symbols-static.pl\n\nnotrans_dist_man3_MANS = \\\n\tdoc/crypt.3 \\\n\tdoc/crypt_checksalt.3 \\\n\tdoc/crypt_gensalt.3 \\\n\tdoc/crypt_gensalt_ra.3 \\\n\tdoc/crypt_gensalt_rn.3 \\\n\tdoc/crypt_preferred_method.3 \\\n\tdoc/crypt_r.3 \\\n\tdoc/crypt_ra.3 \\\n\tdoc/crypt_rn.3\nnotrans_dist_man5_MANS = \\\n\tdoc/crypt.5\n\nnodist_include_HEADERS = \\\n\tcrypt.h\nnodist_noinst_HEADERS = \\\n\tcrypt-hashes.h \\\n\tcrypt-symbol-vers.h\nnoinst_HEADERS = \\\n\tlib/alg-des.h \\\n\tlib/alg-gost3411-2012-const.h \\\n\tlib/alg-gost3411-2012-core.h \\\n\tlib/alg-gost3411-2012-hmac.h \\\n\tlib/alg-gost3411-2012-precalc.h \\\n\tlib/alg-gost3411-2012-ref.h \\\n\tlib/alg-hmac-sha1.h \\\n\tlib/alg-md4.h \\\n\tlib/alg-md5.h \\\n\tlib/alg-sha1.h \\\n\tlib/alg-sha256.h \\\n\tlib/alg-sha512.h \\\n\tlib/alg-sm3.h \\\n\tlib/alg-sm3-hmac.h \\\n\tlib/alg-yescrypt.h \\\n\tlib/byteorder.h \\\n\tlib/crypt-obsolete.h \\\n\tlib/crypt-port.h \\\n\ttest/des-cases.h \\\n\ttest/ka-table.inc\n\nif ENABLE_XCRYPT_COMPAT_FILES\nnodist_include_HEADERS += xcrypt.h\nendif\n\nnoinst_PROGRAMS = \\\n\tlib/gen-des-tables\n\nlib_LTLIBRARIES = \\\n\tlibcrypt.la\n\nlibcrypt_la_SOURCES = \\\n\tlib/alg-des-tables.c \\\n\tlib/alg-des.c \\\n\tlib/alg-gost3411-2012-core.c \\\n\tlib/alg-gost3411-2012-hmac.c \\\n\tlib/alg-hmac-sha1.c \\\n\tlib/alg-md4.c \\\n\tlib/alg-md5.c \\\n\tlib/alg-sha1.c \\\n\tlib/alg-sha256.c \\\n\tlib/alg-sha512.c \\\n\tlib/alg-sm3.c \\\n\tlib/alg-sm3-hmac.c \\\n\tlib/alg-yescrypt-common.c \\\n\tlib/alg-yescrypt-opt.c \\\n\tlib/crypt-bcrypt.c \\\n\tlib/crypt-des.c \\\n\tlib/crypt-gensalt-static.c \\\n\tlib/crypt-gost-yescrypt.c \\\n\tlib/crypt-sm3-yescrypt.c \\\n\tlib/crypt-md5.c \\\n\tlib/crypt-nthash.c \\\n\tlib/crypt-pbkdf1-sha1.c \\\n\tlib/crypt-scrypt.c \\\n\tlib/crypt-sha256.c \\\n\tlib/crypt-sha512.c \\\n\tlib/crypt-sm3.c \\\n\tlib/crypt-static.c \\\n\tlib/crypt-sunmd5.c \\\n\tlib/crypt-yescrypt.c \\\n\tlib/crypt.c \\\n\tlib/util-base64.c \\\n\tlib/util-gensalt-sha.c \\\n\tlib/util-get-random-bytes.c \\\n\tlib/util-make-failure-token.c \\\n\tlib/util-xbzero.c \\\n\tlib/util-xstrcpy.c\n\npkgconfig_DATA = libxcrypt.pc\n\n# Install libcrypt.pc symlink to libxcrypt.pc file.\nphony_targets = \\\n\tinstall-data-hook-pkgconfig uninstall-hook-pkgconfig\ninstall-data-hook: install-data-hook-pkgconfig\nuninstall_hook_targets = \\\n\tuninstall-hook-pkgconfig\ninstall-data-hook-pkgconfig:\n\tcd $(DESTDIR)$(pkgconfigdir) && \\\n\t\t$(LN_S) -f libxcrypt.pc libcrypt.pc\nuninstall-hook-pkgconfig:\n\t-rm -f $(DESTDIR)$(pkgconfigdir)/libcrypt.pc\n\n# Build libcrypt.so.2 if obsolete APIs are excluded, libcrypt.so.1 otherwise.\nif ENABLE_OBSOLETE_API\nlibcrypt_la_VERSION = 2:0:1\nelse\nlibcrypt_la_VERSION = 2:0:0\nendif\n\nlibcrypt_la_LDFLAGS = -version-info $(libcrypt_la_VERSION)\n\nif HAVE_VSCRIPT\nlibcrypt_la_LDFLAGS += $(VSCRIPT_LDFLAGS),$(builddir)/libcrypt.map\nAPPLY_SYMVERS = yes\nelse\nAPPLY_SYMVERS = no\nendif\n\nlibcrypt_la_LDFLAGS += $(UNDEF_FLAG) $(TEXT_RELOC_FLAG) $(AM_LDFLAGS)\n\nlibcrypt_la_CPPFLAGS = $(AM_CPPFLAGS) -DIN_LIBCRYPT\n\nCONFIG_STATUS_DEPENDENCIES = lib/libcrypt.minver\nEXTRA_libcrypt_la_DEPENDENCIES = libcrypt.map\nCLEANFILES = \\\n\tMakefile.deps Makefile.deps.T \\\n\tlibcrypt.map libcrypt.map.T libcrypt.map.stamp \\\n\tcrypt-symbol-vers.h crypt-symbol-vers.h.T crypt-symbol-vers.h.stamp \\\n\tcrypt-hashes.h crypt-hashes.h.T crypt-hashes.h.stamp \\\n\tcrypt.h crypt.h.T crypt.h.stamp \\\n\txcrypt.h xcrypt.h.T xcrypt.h.stamp \\\n\t./*.gcda ./*.gcno \\\n\tlib/*.gcda lib/*.gcno \\\n\ttest/*.gcda test/*.gcno\n\nDISTCLEANFILES = .deps/*.Plo\n\n# Force generated headers to be generated before any source files that\n# might depend on them are compiled.\nMakefile.deps: crypt.h crypt-hashes.h crypt-symbol-vers.h\n\t$(AM_V_GEN)LC_ALL=C echo \"# Deps\" > Makefile.deps.T\n\t$(AM_V_at)mv -f Makefile.deps.T Makefile.deps\n\n# Almost everything depends on the generated headers; the generated\n# headers depend on the Makefile; *most* changes to the Makefile won't\n# affect the contents of the generated headers.  Arrange for the\n# timestamps of the generated headers not to change if their contents\n# haven't.  The rule idiom used here was borrowed from GCC's Makefile;\n# in https://gcc.gnu.org/git/?p=gcc.git;a=blob;f=gcc/Makefile.in;hb=HEAD\n# search for the phrase \"On the use of stamps\".\nAM_V_GENS = $(am__v_GENS_@AM_V@)\nam__v_GENS_ = $(am__v_GENS_@AM_DEFAULT_V@)\nam__v_GENS_0 = @echo \"  GEN     \" $(@:.stamp=);\nam__v_GENS_1 =\n\nlibcrypt.map: libcrypt.map.stamp; @:\nlibcrypt.map.stamp: \\\n\t\tlib/libcrypt.map.in $(SCRIPTS_AUX)/gen-libcrypt-map \\\n\t\t$(SCRIPTS_AUX)/BuildCommon.pm Makefile\n\t$(AM_V_GENS)LC_ALL=C $(PERL) $(SCRIPTS_AUX)/gen-libcrypt-map \\\n\t  SYMVER_MIN=$(SYMVER_MIN) \\\n\t  SYMVER_FLOOR=$(SYMVER_FLOOR) \\\n\t  COMPAT_ABI=$(COMPAT_ABI) \\\n\t  $(srcdir)/lib/libcrypt.map.in > libcrypt.map.T\n\t$(AM_V_at)$(SCRIPTS_AUX)/move-if-change libcrypt.map.T libcrypt.map\n\t$(AM_V_at)$(STAMP) libcrypt.map.stamp\n\ncrypt-hashes.h: crypt-hashes.h.stamp; @:\ncrypt-hashes.h.stamp: \\\n\t\t$(SCRIPTS_AUX)/gen-crypt-hashes-h $(SCRIPTS_AUX)/BuildCommon.pm \\\n\t\tlib/hashes.conf Makefile\n\t$(AM_V_GENS)LC_ALL=C $(PERL) \\\n\t  $(SCRIPTS_AUX)/gen-crypt-hashes-h \\\n\t  $(srcdir)/lib/hashes.conf $(hashes_enabled) > crypt-hashes.h.T\n\t$(AM_V_at)$(SCRIPTS_AUX)/move-if-change crypt-hashes.h.T crypt-hashes.h\n\t$(AM_V_at)$(STAMP) crypt-hashes.h.stamp\n\ncrypt-symbol-vers.h: crypt-symbol-vers.h.stamp; @:\ncrypt-symbol-vers.h.stamp: \\\n\t\t$(SCRIPTS_AUX)/gen-crypt-symbol-vers-h \\\n\t\t$(SCRIPTS_AUX)/BuildCommon.pm \\\n\t\tlib/libcrypt.map.in Makefile\n\t$(AM_V_GENS)LC_ALL=C $(PERL) \\\n\t  $(SCRIPTS_AUX)/gen-crypt-symbol-vers-h \\\n\t  $(APPLY_SYMVERS) \\\n\t  SYMVER_MIN=$(SYMVER_MIN) \\\n\t  SYMVER_FLOOR=$(SYMVER_FLOOR) \\\n\t  COMPAT_ABI=$(COMPAT_ABI) \\\n\t     $(srcdir)/lib/libcrypt.map.in > crypt-symbol-vers.h.T\n\t$(AM_V_at)$(SCRIPTS_AUX)/move-if-change crypt-symbol-vers.h.T crypt-symbol-vers.h\n\t$(AM_V_at)$(STAMP) crypt-symbol-vers.h.stamp\n\ncrypt.h: crypt.h.stamp; @:\ncrypt.h.stamp: \\\n\t\t$(SCRIPTS_AUX)/gen-crypt-h $(SCRIPTS_AUX)/BuildCommon.pm \\\n\t\tlib/crypt.h.in lib/hashes.conf config.h Makefile\n\t$(AM_V_GENS)LC_ALL=C $(PERL) \\\n\t  $(SCRIPTS_AUX)/gen-crypt-h \\\n\t  $(srcdir)/lib/crypt.h.in config.h \\\n\t  $(srcdir)/lib/hashes.conf $(hashes_enabled) \\\n\t  > crypt.h.T\n\t$(AM_V_at)$(SCRIPTS_AUX)/move-if-change crypt.h.T crypt.h\n\t$(AM_V_at)$(STAMP) crypt.h.stamp\n\nxcrypt.h: xcrypt.h.stamp; @:\nxcrypt.h.stamp: \\\n\t\t$(SCRIPTS_AUX)/gen-crypt-h $(SCRIPTS_AUX)/BuildCommon.pm \\\n\t\tlib/xcrypt.h.in config.h\n\t$(AM_V_GENS)LC_ALL=C $(PERL) \\\n\t  $(SCRIPTS_AUX)/gen-crypt-h \\\n\t  $(srcdir)/lib/xcrypt.h.in config.h \\\n\t  > xcrypt.h.T\n\t$(AM_V_at)$(SCRIPTS_AUX)/move-if-change xcrypt.h.T xcrypt.h\n\t$(AM_V_at)$(STAMP) xcrypt.h.stamp\n\ninstall_exec_hook_targets =\n\nif ENABLE_XCRYPT_COMPAT_FILES\nif ENABLE_STATIC\n# Install libxcrypt.a symlink to libcrypt.a file.\nphony_targets += \\\n\tinstall-exec-hook-xcrypt-static uninstall-hook-xcrypt-static\ninstall_exec_hook_targets += \\\n\tinstall-exec-hook-xcrypt-static\nuninstall_hook_targets += \\\n\tuninstall-hook-xcrypt-static\ninstall-exec-hook-xcrypt-static:\n\tcd $(DESTDIR)$(libdir) && \\\n\t\t$(LN_S) -f libcrypt.a libxcrypt.a\nuninstall-hook-xcrypt-static:\n\t-rm -f $(DESTDIR)$(libdir)/libxcrypt.a\nendif\n\nif ENABLE_SHARED\n# Install libxcrypt.so symlink to libcrypt.so file.\nphony_targets += \\\n\tinstall-exec-hook-xcrypt-shared uninstall-hook-xcrypt-shared\ninstall_exec_hook_targets += \\\n\tinstall-exec-hook-xcrypt-shared\nuninstall_hook_targets += \\\n\tuninstall-hook-xcrypt-shared\ninstall-exec-hook-xcrypt-shared:\n\tcd $(DESTDIR)$(libdir) && \\\n\t\t$(LN_S) -f libcrypt.so libxcrypt.so\nuninstall-hook-xcrypt-shared:\n\t-rm -f $(DESTDIR)$(libdir)/libxcrypt.so\nendif\nendif\n\nif ENABLE_COMPAT_SUSE\n# When we are being binary compatible, also install symbolic links to\n# mimic SUSE's libowcrypt; any program that uses -lowcrypt in its\n# build, or already has a NEEDED entry for libowcrypt.so.1, will be\n# redirected to libcrypt.  The OW_CRYPT_1.0 symbol versions are already\n# present in libcrypt.so.1.\n#\n# Caution: this hardwires the expected (so)names of the shared\n# libraries involved, libcrypt.so.1 and libowcrypt.so.1.  (We should\n# be able to get away with this because in any circumstance where the\n# soname of libcrypt isn't libcrypt.so.1, ENABLE_OBSOLETE_API should\n# be automatically turned off, and as best I can tell, SUSE only ever\n# shipped libowcrypt.so.1.)\nif ENABLE_OBSOLETE_API\nif ENABLE_STATIC\nphony_targets += \\\n\tinstall-exec-hook-libstatic uninstall-hook-libstatic\ninstall_exec_hook_targets += \\\n\tinstall-exec-hook-libstatic\nuninstall_hook_targets += \\\n\tuninstall-hook-libstatic\ninstall-exec-hook-libstatic:\n\tcd $(DESTDIR)$(libdir) && \\\n\t\t$(LN_S) -f libcrypt.a libowcrypt.a\nuninstall-hook-libstatic:\n\t-rm -f $(DESTDIR)$(libdir)/libowcrypt.a\nendif\nif ENABLE_SHARED\nphony_targets += \\\n\tinstall-exec-hook-libshared uninstall-hook-libshared\ninstall_exec_hook_targets += \\\n\tinstall-exec-hook-libshared\nuninstall_hook_targets += \\\n\tuninstall-hook-libshared\ninstall-exec-hook-libshared:\n\tcd $(DESTDIR)$(libdir) && \\\n\t\t$(LN_S) -f libcrypt.so libowcrypt.so && \\\n\t\t$(LN_S) -f libcrypt.so.1 libowcrypt.so.1\nuninstall-hook-libshared:\n\t-rm -f  $(DESTDIR)$(libdir)/libowcrypt.so \\\n\t\t$(DESTDIR)$(libdir)/libowcrypt.so.1\nendif\nendif\nendif\n\n# The ka-* tests are first in this list because they are the slowest.\n# The list should otherwise be kept in alphabetical order.\n\ncheck_PROGRAMS = \\\n\ttest/ka-bcrypt \\\n\ttest/ka-bcrypt-a \\\n\ttest/ka-bcrypt-x \\\n\ttest/ka-bcrypt-y \\\n\ttest/ka-bigcrypt \\\n\ttest/ka-bsdicrypt \\\n\ttest/ka-descrypt \\\n\ttest/ka-gost-yescrypt \\\n\ttest/ka-md5crypt \\\n\ttest/ka-nt \\\n\ttest/ka-scrypt \\\n\ttest/ka-sha1crypt \\\n\ttest/ka-sha256crypt \\\n\ttest/ka-sha512crypt \\\n\ttest/ka-sm3crypt \\\n\ttest/ka-sm3-yescrypt \\\n\ttest/ka-sunmd5 \\\n\ttest/ka-yescrypt \\\n\ttest/alg-des \\\n\ttest/alg-gost3411-2012 \\\n\ttest/alg-gost3411-2012-hmac \\\n\ttest/alg-hmac-sha1 \\\n\ttest/alg-md4 \\\n\ttest/alg-md5 \\\n\ttest/alg-pbkdf-hmac-sha256 \\\n\ttest/alg-sha1 \\\n\ttest/alg-sha256 \\\n\ttest/alg-sha512 \\\n\ttest/alg-sm3 \\\n\ttest/alg-sm3-hmac \\\n\ttest/alg-yescrypt \\\n\ttest/badsalt \\\n\ttest/badsetting \\\n\ttest/byteorder \\\n\ttest/checksalt \\\n\ttest/compile-strong-alias \\\n\ttest/crypt-badargs \\\n\ttest/crypt-gost-yescrypt \\\n\ttest/crypt-nested-call \\\n\ttest/crypt-sm3-yescrypt \\\n\ttest/crypt-too-long-phrase \\\n\ttest/explicit-bzero \\\n\ttest/gensalt \\\n\ttest/gensalt-bcrypt_x \\\n\ttest/gensalt-extradata \\\n\ttest/gensalt-nested-call \\\n\ttest/gensalt-nthash \\\n\ttest/getrandom-fallbacks \\\n\ttest/getrandom-interface \\\n\ttest/preferred-method \\\n\ttest/short-outbuf \\\n\ttest/special-char-salt\n\n# All of the known-answer tests are compiled from the same source file,\n# with different macros defined.\ntest_ka_bcrypt_SOURCES\t\t= test/ka-tester.c\ntest_ka_bcrypt_a_SOURCES\t= test/ka-tester.c\ntest_ka_bcrypt_x_SOURCES\t= test/ka-tester.c\ntest_ka_bcrypt_y_SOURCES\t= test/ka-tester.c\ntest_ka_bigcrypt_SOURCES\t= test/ka-tester.c\ntest_ka_bsdicrypt_SOURCES\t= test/ka-tester.c\ntest_ka_descrypt_SOURCES\t= test/ka-tester.c\ntest_ka_gost_yescrypt_SOURCES\t= test/ka-tester.c\ntest_ka_md5crypt_SOURCES\t= test/ka-tester.c\ntest_ka_nt_SOURCES\t\t= test/ka-tester.c\ntest_ka_scrypt_SOURCES\t\t= test/ka-tester.c\ntest_ka_sha1crypt_SOURCES\t= test/ka-tester.c\ntest_ka_sha256crypt_SOURCES\t= test/ka-tester.c\ntest_ka_sha512crypt_SOURCES\t= test/ka-tester.c\ntest_ka_sm3crypt_SOURCES\t= test/ka-tester.c\ntest_ka_sm3_yescrypt_SOURCES\t= test/ka-tester.c\ntest_ka_sunmd5_SOURCES\t\t= test/ka-tester.c\ntest_ka_yescrypt_SOURCES\t= test/ka-tester.c\n\ntest_ka_bcrypt_CPPFLAGS\t\t= $(AM_CPPFLAGS) -DTEST_bcrypt\ntest_ka_bcrypt_a_CPPFLAGS\t= $(AM_CPPFLAGS) -DTEST_bcrypt_a\ntest_ka_bcrypt_x_CPPFLAGS\t= $(AM_CPPFLAGS) -DTEST_bcrypt_x\ntest_ka_bcrypt_y_CPPFLAGS\t= $(AM_CPPFLAGS) -DTEST_bcrypt_y\ntest_ka_bigcrypt_CPPFLAGS\t= $(AM_CPPFLAGS) -DTEST_bigcrypt\ntest_ka_bsdicrypt_CPPFLAGS\t= $(AM_CPPFLAGS) -DTEST_bsdicrypt\ntest_ka_descrypt_CPPFLAGS\t= $(AM_CPPFLAGS) -DTEST_descrypt\ntest_ka_gost_yescrypt_CPPFLAGS\t= $(AM_CPPFLAGS) -DTEST_gost_yescrypt\ntest_ka_md5crypt_CPPFLAGS\t= $(AM_CPPFLAGS) -DTEST_md5crypt\ntest_ka_nt_CPPFLAGS\t\t= $(AM_CPPFLAGS) -DTEST_nt\ntest_ka_scrypt_CPPFLAGS\t\t= $(AM_CPPFLAGS) -DTEST_scrypt\ntest_ka_sha1crypt_CPPFLAGS\t= $(AM_CPPFLAGS) -DTEST_sha1crypt\ntest_ka_sha256crypt_CPPFLAGS\t= $(AM_CPPFLAGS) -DTEST_sha256crypt\ntest_ka_sha512crypt_CPPFLAGS\t= $(AM_CPPFLAGS) -DTEST_sha512crypt\ntest_ka_sm3crypt_CPPFLAGS\t= $(AM_CPPFLAGS) -DTEST_sm3crypt\ntest_ka_sm3_yescrypt_CPPFLAGS\t= $(AM_CPPFLAGS) -DTEST_sm3_yescrypt\ntest_ka_sunmd5_CPPFLAGS\t\t= $(AM_CPPFLAGS) -DTEST_sunmd5\ntest_ka_yescrypt_CPPFLAGS\t= $(AM_CPPFLAGS) -DTEST_yescrypt\n\nif ENABLE_KA_TABLE_GEN\nif ENABLE_SHARED\n# test/ka-table.inc can be regenerated by running test/ka-table-gen.py.\n# This is very slow and requires nonstandard Python libraries and a shared\n# library build of libcrypt already present in the build-tree, so we only\n# do it when explicitly requested.\nregen-ka-table: libcrypt.la\n\t$(PYTHON) $(srcdir)/test/ka-table-gen.py > ka-table.inc.T\n\t@if cmp -s ka-table.inc.T $(srcdir)/test/ka-table.inc; \\\n\tthen echo ka-table.inc is unchanged; rm ka-table.inc.T; \\\n\telse echo mv -f ka-table.inc.T $(srcdir)/test/ka-table.inc; \\\n\tmv -f ka-table.inc.T $(srcdir)/test/ka-table.inc; fi\nphony_targets += regen-ka-table\nCLEANFILES += ka-table.inc.T\nendif\nendif\n\nif ENABLE_OBSOLETE_API\nlibcrypt_la_SOURCES += lib/crypt-des-obsolete.c\ncheck_PROGRAMS += test/des-obsolete test/des-obsolete_r\nendif\n\nTESTS = $(check_PROGRAMS)\n\nif ENABLE_STATIC\nTESTS += test/symbols-static.pl test/symbols-renames.pl\nendif\n\nif ENABLE_OBSOLETE_API\nTESTS += test/symbols-compat.pl\nendif\n\nAM_TESTS_ENVIRONMENT = \\\n    lib_la=\"./libcrypt.la\"; \\\n    lib_map=\"$(srcdir)/lib/libcrypt.map.in\"; \\\n    HAVE_CPP_dD=\"$(HAVE_CPP_dD)\"; \\\n    SYMBOL_PREFIX=\"$(SYMBOL_PREFIX)\"; \\\n    CC=\"$(CC)\"; \\\n    CPP=\"$(CPP)\"; \\\n    CPPFLAGS=\"$(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES)\"; \\\n    CPPFLAGS=\"$${CPPFLAGS} $(AM_CPPFLAGS) $(CPPFLAGS)\"; \\\n    CFLAGS=\"$(CFLAGS)\"; \\\n    LDFLAGS=\"$(LDFLAGS)\"; \\\n    NM=\"$(NM)\"; \\\n    SHELL=\"$(SHELL)\"; \\\n    export lib_la lib_map HAVE_CPP_dD SYMBOL_PREFIX; \\\n    export CC CPP CPPFLAGS CFLAGS LDFLAGS NM SHELL;\n\nPL_LOG_COMPILER = $(PERL)\nif CROSS_COMPILING\nLOG_COMPILER = $(PERL) $(SCRIPTS_AUX)/skip-if-exec-format-error\nendif\n\ntest/symbols-compat.log test/symbols-compat.trs: test/TestCommon.pm\ntest/symbols-renames.log test/symbols-renames.trs: test/TestCommon.pm\ntest/symbols-static.log test/symbols-static.trs: test/TestCommon.pm\n\nCOMMON_TEST_OBJECTS = libcrypt.la\n\ntest_badsalt_LDADD = $(COMMON_TEST_OBJECTS)\ntest_badsetting_LDADD = $(COMMON_TEST_OBJECTS)\ntest_gensalt_bcrypt_x_LDADD = $(COMMON_TEST_OBJECTS)\ntest_gensalt_nested_call_LDADD = $(COMMON_TEST_OBJECTS)\ntest_gensalt_nthash_LDADD = $(COMMON_TEST_OBJECTS)\ntest_gensalt_extradata_LDADD = $(COMMON_TEST_OBJECTS)\ntest_checksalt_LDADD = $(COMMON_TEST_OBJECTS)\ntest_des_obsolete_LDADD = $(COMMON_TEST_OBJECTS)\ntest_des_obsolete_r_LDADD = $(COMMON_TEST_OBJECTS)\ntest_crypt_badargs_LDADD = $(COMMON_TEST_OBJECTS)\ntest_crypt_nested_call_LDADD = $(COMMON_TEST_OBJECTS)\ntest_crypt_too_long_phrase_LDADD = $(COMMON_TEST_OBJECTS)\ntest_preferred_method_LDADD = $(COMMON_TEST_OBJECTS)\ntest_short_outbuf_LDADD = $(COMMON_TEST_OBJECTS)\ntest_special_char_salt_LDADD = $(COMMON_TEST_OBJECTS)\n\ntest_ka_bcrypt_LDADD = $(COMMON_TEST_OBJECTS)\ntest_ka_bcrypt_a_LDADD = $(COMMON_TEST_OBJECTS)\ntest_ka_bcrypt_x_LDADD = $(COMMON_TEST_OBJECTS)\ntest_ka_bcrypt_y_LDADD = $(COMMON_TEST_OBJECTS)\ntest_ka_bigcrypt_LDADD = $(COMMON_TEST_OBJECTS)\ntest_ka_bsdicrypt_LDADD = $(COMMON_TEST_OBJECTS)\ntest_ka_descrypt_LDADD = $(COMMON_TEST_OBJECTS)\ntest_ka_gost_yescrypt_LDADD = $(COMMON_TEST_OBJECTS)\ntest_ka_md5crypt_LDADD = $(COMMON_TEST_OBJECTS)\ntest_ka_nt_LDADD = $(COMMON_TEST_OBJECTS)\ntest_ka_scrypt_LDADD = $(COMMON_TEST_OBJECTS)\ntest_ka_sha1crypt_LDADD = $(COMMON_TEST_OBJECTS)\ntest_ka_sha256crypt_LDADD = $(COMMON_TEST_OBJECTS)\ntest_ka_sha512crypt_LDADD = $(COMMON_TEST_OBJECTS)\ntest_ka_sm3crypt_LDADD = $(COMMON_TEST_OBJECTS)\ntest_ka_sm3_yescrypt_LDADD = $(COMMON_TEST_OBJECTS)\ntest_ka_sunmd5_LDADD = $(COMMON_TEST_OBJECTS)\ntest_ka_yescrypt_LDADD = $(COMMON_TEST_OBJECTS)\n\n# These tests call internal APIs that may not be accessible from the\n# fully linked shared library.\n# Refer to object files that are linked into libxcrypt with the\n# qualified name, lib/libcrypt_la-foobar.lo, to prevent them from\n# being compiled a second time.\ntest_gensalt_LDADD = \\\n\tlib/libcrypt_la-util-xstrcpy.lo \\\n\t$(COMMON_TEST_OBJECTS)\ntest_alg_des_LDADD = \\\n\tlib/libcrypt_la-alg-des.lo \\\n\tlib/libcrypt_la-alg-des-tables.lo \\\n\t$(COMMON_TEST_OBJECTS)\ntest_alg_gost3411_2012_LDADD = \\\n\tlib/libcrypt_la-alg-gost3411-2012-core.lo \\\n\tlib/libcrypt_la-alg-gost3411-2012-hmac.lo \\\n\tlib/libcrypt_la-util-xbzero.lo \\\n\t$(COMMON_TEST_OBJECTS)\ntest_alg_gost3411_2012_hmac_LDADD = \\\n\tlib/libcrypt_la-alg-gost3411-2012-core.lo \\\n\tlib/libcrypt_la-alg-gost3411-2012-hmac.lo \\\n\tlib/libcrypt_la-util-xbzero.lo \\\n\t$(COMMON_TEST_OBJECTS)\ntest_alg_hmac_sha1_LDADD = \\\n\tlib/libcrypt_la-alg-sha1.lo \\\n\tlib/libcrypt_la-alg-hmac-sha1.lo \\\n\tlib/libcrypt_la-util-xbzero.lo \\\n\t$(COMMON_TEST_OBJECTS)\ntest_alg_md4_LDADD = \\\n\tlib/libcrypt_la-alg-md4.lo \\\n\tlib/libcrypt_la-util-xbzero.lo \\\n\t$(COMMON_TEST_OBJECTS)\ntest_alg_md5_LDADD = \\\n\tlib/libcrypt_la-alg-md5.lo \\\n\tlib/libcrypt_la-util-xbzero.lo \\\n\t$(COMMON_TEST_OBJECTS)\ntest_alg_pbkdf_hmac_sha256_LDADD = \\\n\tlib/libcrypt_la-alg-sha256.lo \\\n\tlib/libcrypt_la-util-xbzero.lo \\\n\t$(COMMON_TEST_OBJECTS)\ntest_alg_sha1_LDADD = \\\n\tlib/libcrypt_la-alg-sha1.lo \\\n\tlib/libcrypt_la-util-xbzero.lo \\\n\t$(COMMON_TEST_OBJECTS)\ntest_alg_sha256_LDADD = \\\n\tlib/libcrypt_la-alg-sha256.lo \\\n\tlib/libcrypt_la-util-xbzero.lo \\\n\t$(COMMON_TEST_OBJECTS)\ntest_alg_sha512_LDADD = \\\n\tlib/libcrypt_la-alg-sha512.lo \\\n\tlib/libcrypt_la-util-xbzero.lo \\\n\t$(COMMON_TEST_OBJECTS)\ntest_alg_sm3_LDADD = \\\n\tlib/libcrypt_la-alg-sm3.lo \\\n\tlib/libcrypt_la-util-xbzero.lo \\\n\t$(COMMON_TEST_OBJECTS)\ntest_alg_sm3_hmac_LDADD = \\\n\tlib/libcrypt_la-alg-sm3.lo \\\n\tlib/libcrypt_la-alg-sm3-hmac.lo \\\n\tlib/libcrypt_la-util-xbzero.lo \\\n\t$(COMMON_TEST_OBJECTS)\ntest_alg_yescrypt_LDADD = \\\n\tlib/libcrypt_la-alg-sha256.lo \\\n\tlib/libcrypt_la-alg-yescrypt-common.lo \\\n\tlib/libcrypt_la-alg-yescrypt-opt.lo \\\n\tlib/libcrypt_la-util-base64.lo \\\n\tlib/libcrypt_la-util-xbzero.lo \\\n\t$(COMMON_TEST_OBJECTS)\ntest_crypt_gost_yescrypt_LDADD = \\\n\tlib/libcrypt_la-alg-gost3411-2012-core.lo \\\n\tlib/libcrypt_la-alg-gost3411-2012-hmac.lo \\\n\tlib/libcrypt_la-alg-sha256.lo \\\n\tlib/libcrypt_la-alg-yescrypt-common.lo \\\n\tlib/libcrypt_la-alg-yescrypt-opt.lo \\\n\tlib/libcrypt_la-crypt-yescrypt.lo \\\n\tlib/libcrypt_la-util-base64.lo \\\n\tlib/libcrypt_la-util-xbzero.lo \\\n\tlib/libcrypt_la-util-xstrcpy.lo \\\n\t$(COMMON_TEST_OBJECTS)\ntest_crypt_sm3_yescrypt_LDADD = \\\n\tlib/libcrypt_la-alg-sm3.lo \\\n\tlib/libcrypt_la-alg-sm3-hmac.lo \\\n\tlib/libcrypt_la-alg-sha256.lo \\\n\tlib/libcrypt_la-alg-yescrypt-common.lo \\\n\tlib/libcrypt_la-alg-yescrypt-opt.lo \\\n\tlib/libcrypt_la-crypt-yescrypt.lo \\\n\tlib/libcrypt_la-util-base64.lo \\\n\tlib/libcrypt_la-util-xbzero.lo \\\n\tlib/libcrypt_la-util-xstrcpy.lo \\\n\t$(COMMON_TEST_OBJECTS)\n\ntest_explicit_bzero_LDADD = \\\n\tlib/libcrypt_la-util-xbzero.lo\ntest_getrandom_interface_LDADD = \\\n\tlib/libcrypt_la-util-get-random-bytes.lo \\\n\tlib/libcrypt_la-util-xbzero.lo\ntest_getrandom_fallbacks_LDADD = \\\n\tlib/libcrypt_la-util-get-random-bytes.lo \\\n\tlib/libcrypt_la-util-xbzero.lo\n\n\nif HAVE_LD_WRAP\ntest_getrandom_fallbacks_LDFLAGS = \\\n  -Wl,--wrap,getentropy -Wl,--wrap,getrandom -Wl,--wrap,syscall \\\n  -Wl,--wrap,open -Wl,--wrap,open64 -Wl,--wrap,read -Wl,--wrap,close \\\n  $(AM_LDFLAGS)\nendif\n\n# CI sometimes wants to compile all the test programs but not run them.\ntest-programs: $(check_PROGRAMS)\nphony_targets += test-programs\n\n# Additional checks to run in `make distcheck'.\ndistcheck-hook:\n\tcd $(top_srcdir) && \\\n\t  $(PERL) ./$(SCRIPTS_AUX)/check-perlcritic-config && \\\n\t  perlcritic --quiet ./\n\n# Target for generating a signed release tarball.\nrelease: libxcrypt-$(VERSION).tar.xz.sha256sum libxcrypt-gpgkey.asc\nphony_targets += release\n\nlibxcrypt-$(VERSION).tar.xz.asc: dist-xz\n\t$(GPG2) \\\n\t\t--quiet \\\n\t\t--armor \\\n\t\t--detach-sign \\\n\t\t--default-key F52E98007594C21D \\\n\t\t--output libxcrypt-$(VERSION).tar.xz.asc.T \\\n\t\tlibxcrypt-$(VERSION).tar.xz\n\t$(AM_V_at)$(SCRIPTS_AUX)/move-if-change \\\n\t\tlibxcrypt-$(VERSION).tar.xz.asc.T \\\n\t\tlibxcrypt-$(VERSION).tar.xz.asc\n\nlibxcrypt-$(VERSION).tar.xz.sha256sum: libxcrypt-$(VERSION).tar.xz.asc\n\t$(SHA256SUM) \\\n\t\tlibxcrypt-$(VERSION).tar.xz \\\n\t\tlibxcrypt-$(VERSION).tar.xz.asc \\\n\t\t> libxcrypt-$(VERSION).tar.xz.sha256sum.T\n\t$(AM_V_at)$(SCRIPTS_AUX)/move-if-change \\\n\t\tlibxcrypt-$(VERSION).tar.xz.sha256sum.T \\\n\t\tlibxcrypt-$(VERSION).tar.xz.sha256sum\n\nlibxcrypt-gpgkey.asc:\n\t$(GPG2) \\\n\t\t--armor \\\n\t\t--export \\\n\t\t--export-options \\\n\t\t\texport-minimal \\\n\t\t\tF52E98007594C21D \\\n\t\t> libxcrypt-gpgkey.asc.T\n\t$(AM_V_at)$(SCRIPTS_AUX)/move-if-change \\\n\t\tlibxcrypt-gpgkey.asc.T \\\n\t\tlibxcrypt-gpgkey.asc\n\nCLEANFILES += \\\n\tlibxcrypt-$(VERSION).tar.xz.asc* \\\n\tlibxcrypt-$(VERSION).tar.xz.sha256sum* \\\n\tlibxcrypt-gpgkey.asc*\n\n# Every object file depends on crypt-symbol-vers.h and crypt-hashes.h,\n# which are generated files, so automatic dependency generation is not\n# sufficient.\ninclude $(builddir)/Makefile.deps\n\n# Add additional targets\n.PHONY: $(phony_targets)\ninstall-exec-hook: $(install_exec_hook_targets)\nuninstall-hook: $(uninstall_hook_targets)\n"
  },
  {
    "path": "NEWS",
    "content": "libxcrypt NEWS -- history of user-visible changes.\n\nPlease send bug reports, questions and suggestions to\n<https://github.com/besser82/libxcrypt/issues>.\n\nVersion 4.5.3\n\nVersion 4.5.2\n* Use a more portable implementation for our fallback implementation\n  of explicit_bzero(); also get rid of the need for VLA in the new\n  implementation (issue #212).\n* Fix compilation of alg-sha1 with optimization level 3 for GCC v11\n  and newer (issue #179).\n\nVersion 4.5.1\n* Do not include undefined symbols in version-script (issue #181, #213).\n* Fix build with clang-20+ on macOS (issue #216).\n\nVersion 4.5.0\n* Implement the sm3crypt ($sm3$) hashing algorithm (issue #188).\n* Implement the sm3-yescrypt ($sm3y$) hashing algorithm (issue #206).\n* Fix the implementation of the crypt(3) functions and the crypt_gensalt(3)\n  functions to not overwrite the output buffer too early. (issue #209).\n* Fix the strcpy_or_abort() function to call abort() in -DNDEBUG builds.\n* Add some more testcases.\n* Several fixes for issues found by Coverity.\n\nVersion 4.4.38\n* Fix several \"-Wunterminated-string-initialization\", which are seen by\n  upcoming GCC 15.x (issue #194).\n* Fix \"-Wmaybe-uninitialized\" in crypt.c, which is seen by GCC 13.3.0.\n* Skip test/explicit-bzero if compiling with ASAN.\n* Drop hard requirement for the pkg-config binary (issue #198).\n\nVersion 4.4.37\n* Several fixes to the manpages (issue #185).\n* Add binary compatibility for x86_64 GNU/Hurd (issue #189).\n* Only test the needed makecontext signature during configure (issue #178).\n* Fix -Werror=strict-overflow in lib/crypt-bcrypt.c, which is seen\n  by GCC 4.8.5 (issue #197).\n\nVersion 4.4.36\n* Fix left over bits failing with Perl v5.38.0 (issue #173).\n\nVersion 4.4.35\n* Fix build with Perl v5.38.0 (issue #170).\n* Fix build with MinGW-w(32|64).\n\nVersion 4.4.34\n* Update build-aux/m4/ax_valgrind_check.m4 to v23.\n* Optimize some cast operation for performance in\n  lib/alg-yescrypt-platform.c.\n* Add SHA-2 Maj() optimization proposed by Wei Dai in lib/alg-sha512.c.\n* Explicitly clean the stack and context state after computation in\n  lib/alg-gost3411-2012-hmac.c, lib/alg-hmac-sha1.c, and lib/alg-sha256.c\n  (issue #168).\n\nVersion 4.4.33\n* Fix -Werror=sign-conversion in lib/alg-yescrypt-platform.c.\n  With commit 894aee75433b4dc8d9724b126da6e79fa5f6814b we introduced some\n  changes to huge page handling, that show this error when building with\n  GCC v12.2.1, and thus need a small fix.\n\nVersion 4.4.32\n* Improvements to huge page handling in lib/alg-yescrypt-platform.c.\n  When explicitly using huge pages, request the 2 MiB page size.\n  This should fix the issue where on a system configured to use 1 GiB\n  huge pages we'd fail on munmap() as we're only rounding the size up\n  to a multiple of 2 MiB.  With the fix, we wouldn't use huge pages on\n  such a system.  Unfortunately, now we also wouldn't use huge pages on\n  Linux kernels too old to have MAP_HUGE_2MB (issue #152).\n\nVersion 4.4.31\n* Fix -Werror=conversion in lib/alg-yescrypt-opt.c\n  (issues #161 and #162).\n* Add some SHA-2 Maj() optimization in lib/alg-sha256.c.\n* Fix issues found by Covscan in test/getrandom-fallback.c.\n* Fix -Werror=strict-overflow in lib/crypt-des.c, which is seen\n  by GCC 12.x (issues #155 and #163).\n\nVersion 4.4.30\n* configure: Restore ucontext api functionality check.\n  In c3f01c72b303cbbb0cc8983120677edee2f3fa4b the use of the ucontext api\n  in the main program was removed, and with it the configure check for it.\n  However, the ucontext api is still used in the \"explicit_bzero\" test and\n  thus this test still needs to be in place.\n  See also: https://bugs.gentoo.org/838172\n* configure: Restore the functionality of the '--disable-symvers' switch.\n  Without this fix the build was simply broken, if symbol versioning was\n  disabled for any reason, e.g. whether the compiler nor the linker\n  supporting it, or if disabled on purpose by the user (issue #142).\n* Fix variable name in crypt(3) for a datamember of 'struct crypt_data'\n  (issue #153).\n\nVersion 4.4.29\n* Add glibc-on-loongarch-lp64 (Loongson LA464 / LA664) entry to\n  libcrypt.minver.  This was added in GNU libc 2.36.\n\nVersion 4.4.28\n* Add glibc-on-or1k (OpenRISC 1000) entry to libcrypt.minver.\n  This was added in GNU libc 2.35.\n\nVersion 4.4.27\n* Limit the maximum amount of rbytes to 64 bytes (512 bits) for\n  yescrypt, gost-yescrypt, and scrypt.  Also reflect this limit\n  in the documentation (issue #145).\n\nVersion 4.4.26\n* Fix compilation on systems with GCC >= 10, that do not support\n  declarations with __attribute__((symver)).\n\nVersion 4.4.25\n* Add support for Python 3.11 in the configure script.\n* Stricter checking of invalid salt characters (issue #135).\n  Hashed passphrases are always entirely printable ASCII, and do\n  not contain any whitespace or the characters ':', ';', '*', '!',\n  or '\\'.  (These characters are used as delimiters and special\n  markers in the passwd(5) and shadow(5) files.)\n\nVersion 4.4.24\n* Add hash group for Debian in lib/hashes.conf.\n  Debian has switched to use the yescrypt hashing algorithm as\n  the default for new user passwords, so we should add a group\n  for this distribution.\n* Overhaul the badsalt test.\n  Test patterns are now mostly generated rather than manually coded\n  into a big table.  Not reading past the end of the “setting” part\n  of the string is tested more thoroughly (this would have caught the\n  sunmd5 $$ bug if it had been available at the time).\n  Test logs are tidier.\n* Add ‘test-programs’ utility target to Makefile.\n  It is sometimes useful to compile all the test programs but not run\n  them.  Add a Makefile target that does this.\n* Fix incorrect bcrypt-related ifdeffage in test/badsalt.c.\n  The four variants of bcrypt are independently configurable, but the\n  badsalt tests for them were all being toggled by INCLUDE_bcrypt,\n  which is only the macro for the $2b$ variant.\n* Fix bigcrypt-related test cases in test/badsalt.c.\n  The test spec was only correct when both or neither of bigcrypt and\n  descrypt were enabled.\n* Detect ASan in configure and disable incompatible tests.\n  ASan’s “interceptors” for crypt and crypt_r have a semantic conflict\n  with libxcrypt, requiring a few tests to be disabled for builds with\n  -fsanitize-address.  See commentary in test/crypt-badargs.c for an\n  explanation of the conflict, and the commentary in\n  build-aux/m4/zw_detect_asan.m4 for why a configure test is required.\n* Fix several issues found by Covscan in the testsuite.  These include:\n  - CWE-170: String not null terminated (STRING_NULL)\n  - CWE-188: Reliance on integer endianness (INCOMPATIBLE_CAST)\n  - CWE-190: Unintentional integer overflow (OVERFLOW_BEFORE_WIDEN)\n  - CWE-569: Wrong sizeof argument (SIZEOF_MISMATCH)\n  - CWE-573: Missing varargs init or cleanup (VARARGS)\n  - CWE-687: Argument cannot be negative (NEGATIVE_RETURNS)\n\nVersion 4.4.23\n* Fix output calculation for gensalt_yescrypt_rn().\n* Fix -Werror=conversion in lib/crypt-des-obsolete.c,\n  test/des-obsolete.c, and test/des-obsolete_r.c.\n\nVersion 4.4.22\n* The crypt_checksalt() function has been fixed to correctly return\n  with 'CRYPT_SALT_INVALID', in case the setting, that is passed\n  to be checked, represents an empty passphrase or an uncomputed\n  setting for descrypt without any salt characters.\n\nVersion 4.4.21\n* The crypt_checksalt() function will now return the value\n  'CRYPT_SALT_METHOD_LEGACY' in case the setting, that is passed\n  to be checked, uses a hashing method, which is considered to be\n  too weak for use with new passphrases.\n\nVersion 4.4.20\n* Fix build when the CFLAGS variable, that is passed into the\n  configure script, has a leading whitespace character in it\n  (issue #123).\n\nVersion 4.4.19\n* Improve fallback implementation of explicit_bzero.\n* Add glibc-on-CSKY, ARC, and RISCV-32 entries to libcrypt.minver.\n  These were added in GNU libc 2.29, 2.32, and 2.33 respectively\n  (issue #122).\n* Do not build xcrypt.h if we’re not going to install it.\n* Do not apply --enable-obsolete-api-enosys mode to fcrypt.\n* Compilation fix for NetBSD.  NetBSD’s <unistd.h> declares encrypt\n  and setkey to return int, contrary to POSIX (which says they return\n  void).  Rename those declarations out of the way with macros.\n* Compilation fixes for building with GCC 11.\n  Basically fixes for explicit type-casting.\n* Force update of existing symlinks during installation (issue #120).\n\nVersion 4.4.18\n* Fix compilation errors on (Free)BSD (issue #110).\n* Fix conversion error in lib/alg-gost3411-core.c, which is seen by\n  some sensitive compilers.\n* Convert build scripts to Perl.\n  The minimum version of Perl required is 5.14.\n\nVersion 4.4.17\n* Fix compilation error in 'alignas (type)' with older versions\n  of glibc and/or gcc (issue #107).\n* Salt string compatibility with generic implementations (issue #105).\n  All other existing implementations of the md5crypt, sha256crypt,\n  and sha512crypt hashing methods allow any ASCII character to be\n  present in the salt string.\n  We changed our implementation of these hash methods to be compliant\n  with the general behaviour, except for the colon ':' character,\n  which serves a special purpose in the Unix shadow file, and the\n  newline '\\n' character, since all parameters of the user data must\n  be on the same line within the Unix shadow file.\n* Fix for GCC 10.2 on s390x.\n\nVersion 4.4.16\n* Add support for the e2k architecture.\n\nVersion 4.4.15\n* The compatibility symbols crypt_gensalt_r, xcrypt, xcrypt_r,\n  xcrypt_gensalt, and xcrypt_gensalt_r are deprecated further.\n  (These are alternative names for crypt_gensalt_rn, crypt, crypt_r,\n  crypt_gensalt, and crypt_gensalt_rn, respectively; there is no\n  difference in behavior.)\n\n  In an --enable-xcrypt-compat-files configuration, newly compiled\n  programs can still use functions with these names if they include\n  xcrypt.h, but a program that attempts to use one of these functions\n  *without* including xcrypt.h will fail to link.  In particular, this\n  means AC_CHECK_FUNCS([xcrypt]) will not detect xcrypt, because the\n  test program generated by AC_CHECK_FUNCS does not include xcrypt.h.\n\n  In a --disable-xcrypt-compat-files --enable-obsolete-api\n  configuration, xcrypt.h is not installed and newly compiled programs\n  cannot use functions with these names, but existing binaries that\n  expect to find these symbols in a shared libcrypt.so.1 will still\n  work.\n\n  In a --disable-obsolete-api configuration, these symbols are not\n  defined at all; moreover, --disable-obsolete-api now implies\n  --disable-xcrypt-compat-files (which means xcrypt.h isn't installed).\n\nVersion 4.4.14\n* Renamed bootstrap script: 'bootstrap' -> 'autogen.sh'.\n  If building from a Git checkout instead of a tarball release,\n  use './autogen.sh' to create the configure script.\n\nVersion 4.4.13\n* libxcrypt now builds (including working tests) on Mac OSX.\n* Speed up ka-sunmd5 by skipping most of the test phrases.\n  ka-sunmd5 is slower than the entire rest of the testsuite put\n  together, because the sunmd5 hash is Just That Slow and we have to do\n  extra tests for it to ensure bug-compatibility.  No easy optimizations\n  are possible and the difficult optimizations are not worth the\n  engineering effort for this obsolete hash.  Instead, skip most of the\n  test phrases.  See comments in test/ka-table-gen.py!h_sunmd5 for\n  further explanation.\n\nVersion 4.4.12\n* Another fix for GCC v10.x, which occurs on s390 architectures only.\n\nVersion 4.4.11\n* Fixes for GCC v10.x (issue #95).\n* Change how the known-answer tests are parallelized.\n\nVersion 4.4.10\n* Fix ordering of hash methods in crypt-hashes.h when generated\n  using gawk < 4.1.0.\n\nVersion 4.4.9\n* Fix false positive finding from CovScan.\n\nVersion 4.4.8\n* Add binary compatibility for GNU/Hurd and GNU/kFreeBSD.\n\nVersion 4.4.7\n* LICENSING: Add missing files and update license information.\n* Fix -Wformat in test/crypt-kat.c.\n\nVersion 4.4.6\n* Make unalignment test really unaligned.\n\nVersion 4.4.5\n* Fix alignment problem for GOST 34.11 (Streebog) in gost-yestcrypt.\n  Some architectures in some circumstances do not allow unaligned\n  memory access (such as ARM, MIPS, SPARC) triggering SIGBUS. This\n  patch very crudely fixes this issue.\n  Being unfixed this would trigger SIGBUS when password buffer is\n  unaligned. Crash and fix are tested on UltraSparc T5 on GCC Compile\n  farm.\n\nVersion 4.4.4\n* The crypt_* functions will now all fail and set errno to ERANGE if\n  their 'phrase' argument is longer than CRYPT_MAX_PASSPHRASE_SIZE\n  characters (this is currently 512).  Formerly, longer passphrases\n  would either be silently accepted, silently truncated, or the\n  library would crash, depending on the hashing method.\n* The NT hashing method no longer truncates passphrases at 128\n  characters; Windows does not do this.  (The Windows login dialog\n  _limits_ interactively entered passphrases to 127 characters.\n  Passphrases set via the low-level API can be longer.)\n\nVersion 4.4.3\n* Fix the value of SUNMD5_MAX_ROUNDS.\n* Add generated C++-guards to <xcrypt.h>.\n* Add --enable-obsolete-api-enosys configure option.\n  If enabled, this option replaces the obsolete APIs (fcrypt,\n  encrypt{,_r}, and setkey{,_r}) with stubs that set errno to\n  ENOSYS and return without performing any real operations.\n  This allows one to disable DEScrypt support while preserving\n  POSIX compliance.\n  For security reasons, the encrypt{,r} functions will also\n  overwrite their data-block argument with random bits.\n  The fcrypt function will always produce a failure token\n  (*0 or *1), unless the library was also configured with\n  --disable-failure-tokens, in which case it will always\n  return NULL.\n\nVersion 4.4.2\n* Add test-alg-yescrypt for improved coverage.\n* Add x32 specific inline asm.\n\nVersion 4.4.1\n* Change the output of the gensalt function for the NT hashing method\n  ($3$) to output just its prefix ($3$) instead of a fake salt.\n  The output buffer for the returned string must be at least 4 bytes\n  long.\n* Decrase the minimum required amount of random bytes for the NT\n  hashing method to 1 byte, which is actually not used.\n* The default linker flags now generate binaries with full read-only\n  relocations (including full read-only re-mapping of the GOT), if\n  supported by the linker and the system's native binary format.\n\nVersion 4.4.0\n* Implement the crypt_preferred_method function.\n  This function can be used as a convenience function to get the prefix\n  of the preferred hash method.\n\nVersion 4.3.4\n* --enable-hashes now supports 'fedora' as a group of hashing methods.\n* Add aliases for xcrypt{,_r} and xcrypt_gensalt{,_r}.\n  They were added for code compatibility with libxcrypt v3.1.1\n  and earlier.\n* Install the <xcrypt.h> header file, declaring the previously named\n  aliases, and a symlink from libxcrypt.so to libcrypt.so, if a shared\n  library is build.  For static libraries a corresponding symlink for\n  the archive file will be installed.\n  The installation of the compatibility files can be disabled by\n  passing the '--disable-xcrypt-compat-files' flag to the configure\n  script.\n* Replace the prototype for the crypt_gensalt_r function with a\n  declaration through a macro, so new compiled applications link\n  against the identical crypt_gensalt_rn function directly.\n\nVersion 4.3.3\n* Add an alias for crypt_gensalt_r.\n  The function was available in older versions (v3.1.1 and earlier)\n  of libxcrypt.  It has the same semantics and the same prototype as\n  the crypt_gensalt_rn function.\n\nVersion 4.3.2\n* Fix the gensalt function for the NT hashing method ($3$) to\n  properly terminate its output string.  The output buffer for the\n  returned string must be at least 30 bytes long.\n* Remove the gensalt function for the bcrypt x variant ($2x$).\n  This prefix was never intended for use when hashing new passphrases.\n  The only use case originally intended was to manually edit '$2a$' to\n  '$2x$' in passphrase hashes to knowingly take the risk yet enable\n  users to continue to log in when upgrading systems with buggy bcrypt\n  implementations to fixed versions.\n\nVersion 4.3.1\n* Reduce the number of methods that can be the default for new hashes.\n  We don’t want to accidentally encourage use of gost-yescrypt,\n  scrypt, or the bug-compatibility bcrypt variants by people who do\n  not have a specific need for them.\n* sha256crypt ($5$) is not considered to be strong anymore.  Thus\n  it was dropped from the STRONG and DEFAULT sets.\n* The four variants of bcrypt ($2b$, $2a$, $2y$, $2x$) are now\n  independently selectable at configure time.  The $2x$ variant has\n  been dropped from the STRONG set, because it has a severe bug\n  causing it to be easy to find collisions for some passwords.  The\n  $2x$ and $2y$ variants have been dropped from the FreeBSD, NetBSD,\n  OpenBSD, and Solaris compatibility sets, because those operating\n  systems never supported those variants.\n\nVersion 4.3.0\n* Implement the gost-yescrypt ($gy$) hashing algorithm.\n* Remove all of the nonnull annotations, which are a questionable\n  optimization that have caused problems in the past and may cause\n  future problems on some systems.\n* Rename all hash methods to match naming in John the Ripper.\n* Make the configure switches --enable-obsolete-api and\n  --enable-hashes process their arguments case-insensitively; for\n  instance, \"--enable-hashes=OpenBSD\" and \"--enable-hashes=openbsd\"\n  are now understood as synonymous.\n* Fix gensalt for bigcrypt if descrypt hash method is not selected\n  at compile time.\n* Fix the bigcrypt hash method to reject too short settings and/or\n  descrypt hashes with a truncated phrase.  Hashes with a setting\n  shorter than 13 characters and phrases shorter than 8 characters\n  are valid bigcrypt hashes, although they are identical with the\n  output generated by descrypt under the same conditions.\n  This only applies when the descrypt hash method is not selected\n  at compile time.\n* Implement crypt_checksalt, which can be used by portable users of\n  libxcrypt to check whether the desired hash method is supported.\n* Make a default prefix available whenever at least one strong hash\n  is enabled.\n* Fix the definition of 'CRYPT_GENSALT_IMPLEMENTS_DEFAULT_PREFIX'\n  to reflect whether the default prefix is available or not.\n\nVersion 4.2.3\n* Add bootstrap script.  If building from a Git checkout instead of a\n  tarball release, use './bootstrap' to create the configure script.\n* Use sha512 implementation from Colin Percival.  Thus we now have a\n  sha512 implementation under the BSD license.\n* Use md5 implementation from Alexander Peslyak.  Thus we now have a\n  md5 implementation in the public domain.\n* 'make dist' now generates bzip2 and xz compressed tarballs along\n  with the default gzip compressed tarball.\n* The group 'altlinux' has been renamed to 'alt' in --enable-hashes,\n  as the ALTLINUX distribution has been rebranded to ALT some time ago.\n* New tagged versions are automatically submitted for Coverity Scan:\n  https://scan.coverity.com/projects/besser82-libxcrypt\n\nVersion 4.2.2\n* Convert existing manpages to BSD mdoc format.\n\nVersion 4.2.1\n* Fix tests for yescrypt and scrypt, when failure-tokens have been\n  disabled.\n\nVersion 4.2.0\n* Implement yescrypt ($y$) and scrypt ($7$) hashing algorithms.\n* For scrypt the implemented gensalt function ensures every new hash\n  is computed using at least 32 MiBytes of RAM.\n* yescrypt is the new default method used for new hashes.\n* --enable-hashes now supports additional groups of hashing methods:\n  'altlinux', 'owl', and 'suse', which select the methods historically\n  supported on those operating systems.\n* Added 'XCRYPT_VERSION_*' macros.\n\nVersion 4.1.2\n* Add optional 'check-valgrind' target to the Makefile.\n* Replace crypt-sha{256,512}.c with an implementation in the Public\n  Domain.\n* Add alias man-pages for other crypt functions.\n* Add configure option --disable-failure-tokens, which causes crypt\n  and crypt_r to return NULL on failure, as crypt_rn and crypt_ra do,\n  instead of a special \"failure token\".  Using this option improves\n  compatibility with programs written on the assumption that, like\n  most C library functions, crypt and crypt_r will return NULL on\n  failure; but it breaks compatibility with programs that assume these\n  functions never return NULL.  We're not sure which type of program\n  is more common.  Please let us know if you encounter either.\n* Improved handling of out-of-range cost parameters in gensalt.\n  The behavior is now:\n  - for hashes with a fixed cost parameter (DES/trad, DES/big, NTHASH,\n    MD5/bsd), crypt_gensalt only accepts 0 as the rounds argument.\n  - for hashes with a linear cost parameter (DES/bsdi, MD5/sun, SHA1,\n    SHA256, SHA512), crypt_gensalt accepts 0 or any value in the range\n    [1, ULONG_MAX] and clips it to the actual valid range for the hash\n    function, if necessary.  In the case of DES/bsdi, even numbers\n    become odd, as well.\n  - for hashes with an exponential cost parameter (bcrypt),\n    crypt_gensalt only accepts 0 or a value in the actual valid range.\n  - the documented valid range for SHA1 is now [4, 4294967295] instead\n    of [1, 4294967295].\n  - all of this is tested.\n\nVersion 4.1.1\n* --enable-hashes now supports additional groups of hashing methods:\n  'freebsd', 'netbsd', 'openbsd', 'osx', and 'solaris', which select\n  the hashes historically supported on those operating systems.\n* Predictable behavior when arguments to crypt() are NULL or invalid\n  (issue #15).\n* Hash formats $5, $6, and $md5 once again allow an explicit rounds\n  parameter specifying the default number of rounds (issue #16).\n* The library no longer uses swapcontext(), for ease of debugging and\n  better compatibility with hardening mechanisms like Intel CET\n  (issue #18).\n* Can now be built with versions of GNU ld older than 2.26.2.\n* crypt_gensalt_ra no longer leaks memory on failure.\n\nVersion 4.1.0\n* Fix spelling of SUSE.\n* Lower the minimum required automake version to 1.14.\n* Fix build with USE_SWAPCONTEXT turned off.\n* Extend --enable-weak-hashes configure option to accept optional\n  \"glibc\" parameter.  When specified, it enables only those of\n  weak hashes that are supported by historic versions of the\n  GNU libc.\n* Fix the leak of obtained random bytes.\n* Check expected output strings for deterministic methods.\n* Fix memory leak in crypt_sha1crypt_rn.\n* Fix read of random bytes out of bounds in gensalt_sha1crypt_rn.\n* Make it possible to disable individual hashes at configure time.\n  The default is --enable-hashes=all.  --enable-hashes=strong is the\n  equivalent of the old --disable-weak-hashes.  You could even do\n  --enable-hashes=bcrypt,des to get a binary-compatible libcrypt.so.1\n  that still supports almost nothing other than bcrypt.\n* Make salt validation pickier.\n* Replace crypt-sunmd5.c with BSD-licensed cleanroom reimplementation.\n* Make crypt_gensalt for $sha1 deterministic.\n* Fix incorrect output-size computation in crypt_sha1crypt_rn.\n* Add docs for SHA1, MD5/Sun, NTHASH.\n* Introduce CRYPT_GENSALT_IMPLEMENTS_* feature test macros.\n* Install libcrypt.pc symlink along with libxcrypt.pc.\n* Extend --enable-obsolete-api configure option.\n  Make vendor specific parts of compatibility ABI that are enabled by\n  --enable-obsolete-api option configurable.\n  This allows vendors to enable only those parts of compatibility ABI\n  that are relevant to them.\n* Extend overall test coverage.\n\nVersion 4.0.1\n* Fixes for GCC v8.x\n* Add symbol version for riscv64\n* Fixed an uninitialized value in test-crypt-badsalt\n\nVersion 4.0.0\n* Full binary backward compatibility with glibc libcrypt; all programs\n  compiled with glibc libcrypt, including vendor-patched versions that\n  include the Openwall extensions, should work with this libcrypt\n  (however, programs compiled against this libcrypt will NOT work with\n  glibc libcrypt).\n* struct crypt_data is now only 32kB (from 128kB), and divided into a\n  public-API section and a properly opaque internal section.\n* New feature: supplying a null pointer as the \"prefix\" argument to\n  any of the crypt_gencrypt functions will cause it to select the best\n  available hash function (in this release, bcrypt in mode 'a').\n  CAUTION: it must be a null pointer, not an empty string.  If you\n  supply an empty string, that selects DES, which is the *worst*\n  available hash function.\n* New feature: supplying a null pointer as the \"rbytes\" argument to\n  any of the crypt_gencrypt functions will cause it to acquire random\n  bytes from the operating system.\n* The legacy functions bigcrypt, fcrypt, encrypt, encrypt_r,\n  setkey, and setkey_r are no longer available for use by new programs.\n  All of these (except fcrypt, which was just another name for crypt)\n  force the use of DES, which is no longer safe for any application.\n* New configure option --disable-obsolete-api removes the above\n  functions from the library.  Since this breaks compatibility with\n  glibc's libcrypt, when this option is used the shared library will\n  be libcrypt.so.2 instead of libcrypt.so.1, and all of the\n  compatibility symbol versions for the crypt* functions will be\n  omitted.  This option is the default on all operating systems where\n  there is no GNU C Library to be compatible with.\n* New configure option --disable-weak-hashes removes all support for\n  DES and MD5 hashes from the library.  This option implies\n  --disable-obsolete-api, and will prevent DES and MD5 password hashes\n  from being *verified* -- accounts with such hashes are effectively\n  locked.  It is intended for use in high-security new installations.\n* Sensitive intermediate data is now thoroughly scrubbed from the\n  stack and CPU registers before the crypt functions return to their\n  callers.\n* UFC-crypt has been replaced with FreeSec; this enables the reduction in\n  size of crypt_data, and adds full support for BSD extended DES hashes.\n* Extensive code cleanup and portability work.  The static library\n  should now be buildable with any C99 compiler, although some\n  features may not be available (notably acquiring random bytes from\n  the operating system and scrubbing the stack).  The shared library\n  does still require some GNU extensions for symbol versioning.\n* The configure options --enable-Wno-cast-align and --enable-bootstrap\n  are no longer necessary and have been removed.\n* If building from a Git checkout instead of a tarball release, use\n  'autoreconf -i' to create the configure script; autogen.sh has been\n  removed.\n* More thoroughly tested.\n\nVersion 3.1.1\n* Add '--enable-Wno-cast-align' to silence 'cast increases required alignment'\n* Whitespace clean-up\n\nVersion 3.1.0\n* Update upstream-contact\n* Add './configure --enable-bootstrap' to skip some tests on initial build\n* Add bootstrap-script for Autotools\n* Add LICENSE for bcrypt\n* Update crypt_blowfish to v1.3\n* Add '-Wextra' to CFLAGS\n* Fix warnings generated by gcc 5.1.1\n* Update Autotools\n\nVersion 3.0.4\n* Fix warnings generated by gcc 4.6\n\nVersion 3.0.3\n* Fix memory leak\n* Fix compiler warnings\n\nVersion 3.0.2\n* Fix generating salts for MD5\n\nVersion 3.0.1\n* Fix build failures\n\nVersion 3.0\n* Add sha256 and sha512 hashes\n* Move all hashes into plugins\n\nVersion 2.4\n* Sync with crypt_blowfish 1.0\n\nVersion 2.3\n* Fix problems with gcc > 4.0\n\nVersion 2.2\n* Fix realloc call in md5-crypt\n\nVersion 2.1\n* Enable x86.S for i386 again\n\nVersion 2.0\n* Rename all crypt* functions to xcrypt* to avoid clash with normal\n  libcrypt from glibc\n\nVersion 1.4\n* Fix compiling with glibc > 2.3.1\n* Sync with crypt_blowfish 0.4.5\n\nVersion 1.3\n* Sync with current glibc CVS (fix for not correct initialication of\n  internal data structs)\n\nVersion 1.2\n* Fix building with glibc 2.3.x\n* Add support for HPPA\n\nVersion 1.1\n* merge md5.h with xcrypt.h\n* Add SHA1 functions and crypt\n\nVersion 1.0\n* First release\n"
  },
  {
    "path": "README.md",
    "content": "[![Build matrix](https://github.com/besser82/libxcrypt/actions/workflows/config-matrix.yml/badge.svg)](https://github.com/besser82/libxcrypt/actions/workflows/config-matrix.yml)\n[![Memcheck](https://github.com/besser82/libxcrypt/actions/workflows/memcheck.yml/badge.svg)](https://github.com/besser82/libxcrypt/actions/workflows/memcheck.yml)\n[![Distcheck](https://github.com/besser82/libxcrypt/actions/workflows/distcheck.yml/badge.svg)](https://github.com/besser82/libxcrypt/actions/workflows/distcheck.yml)\n[![COPR Build Status](https://copr.fedorainfracloud.org/coprs/besser82/libxcrypt_CI/package/libxcrypt/status_image/last_build.png)](https://copr.fedorainfracloud.org/coprs/besser82/libxcrypt_CI)\n[![codecov](https://codecov.io/gh/besser82/libxcrypt/branch/develop/graph/badge.svg)](https://codecov.io/gh/besser82/libxcrypt)\n[![Coverity Scan Build Status](https://scan.coverity.com/projects/17073/badge.svg)](https://scan.coverity.com/projects/besser82-libxcrypt)\n[![Codacy Badge](https://api.codacy.com/project/badge/Grade/1ebaa2314aca4bab92e14130906d5096)](https://www.codacy.com/manual/besser82/libxcrypt?utm_source=github.com&amp;utm_medium=referral&amp;utm_content=besser82/libxcrypt&amp;utm_campaign=Badge_Grade)\n\nREADME for libxcrypt\n====================\n\nlibxcrypt is a modern library for one-way hashing of passwords.  It\nsupports a wide variety of both modern and historical hashing methods:\nyescrypt, gost-yescrypt, sm3-yescrypt, scrypt, bcrypt, sha512crypt,\nsha256crypt, sm3crypt, md5crypt, SunMD5, sha1crypt, NT, bsdicrypt,\nbigcrypt, and descrypt.\nIt provides the traditional Unix `crypt` and `crypt_r` interfaces, as\nwell as a set of extended interfaces pioneered by Openwall Linux,\n`crypt_rn`, `crypt_ra`, `crypt_gensalt`, `crypt_gensalt_rn`, and\n`crypt_gensalt_ra`.\n\nlibxcrypt is intended to be used by `login(1)`, `passwd(1)`, and other\nsimilar programs; that is, to hash a small number of passwords during\nan interactive authentication dialogue with a human.  It is not\nsuitable for use in bulk password-cracking applications, or in any\nother situation where speed is more important than careful handling of\nsensitive data.  However, it *is* intended to be fast and lightweight\nenough for use in servers that must field thousands of login attempts\nper minute.\n\nAuthorship and Licensing\n------------------------\n\nlibxcrypt is currently maintained by Björn Esser and Zack Weinberg.\nMany people have contributed to the code making up libxcrypt, often\nunder the aegis of a different project.  Please see the AUTHORS and\nTHANKS files for a full set of credits.\n\nlibxcrypt as a whole is licensed under the GNU Lesser General Public\nLicense (version 2.1, or at your option, any later version).  However,\nmany individual files may be reused under more permissive licenses if\nseparated from the library.  Please see the LICENSING file for a\ncomprehensive inventory of licenses, and COPYING.LIB for the terms of\nthe LGPL.\n\nBug Reports, Feature Requests, Contributions, Etc.\n--------------------------------------------------\n\nlibxcrypt is currently maintained at Github: the canonical repository\nURL is <https://github.com/besser82/libxcrypt>.  Please file bug\nreports at <https://github.com/besser82/libxcrypt/issues>.  This is\nalso the appropriate place to suggest new features, offer patches,\netc.  All your feedback is welcome and will eventually receive a\nresponse, but this is a spare-time project for all of the present\nmaintainers, so please be patient.\n\nBuild Requirements and Instructions\n-----------------------------------\n\nTo build from a tarball release, the tools required are the standard\nUnix shell environment, a C compiler, and Perl (version 5.14 or\nlater).  Follow the generic build and installation instructions in the\nfile `INSTALL`.  There are several package-specific configure options;\nrun `./configure --help` for more detail on these options.\nRun `man -l crypt.5` for more detail on the hashing algorithms that\ncan be enabled or disabled by `--enable-hashes`.  You can do both of\nthese things before building the software.\n\nBuilding from a Git checkout additionally requires the Autotools\nsuite: `autoconf`, `automake`, `libtool`, and `pkg-config`.\nRun `./autogen.sh` at the top level of the source tree, and then\nfollow the instructions in `INSTALL` (which is created by that command).\n\nThe oldest versions of Autotools components that are known to work\nare: autoconf 2.69, automake 1.14, libtool 2.4.6, pkg-config 0.29.\nIf you test with an older version of one of these and find that it\nworks, please let us know.  We are not deliberately requiring newer\nversions; we just can’t conveniently test older versions ourselves.\n\nPortability Notes\n-----------------\n\nlibxcrypt should be buildable with any ISO C1999-compliant C compiler,\nwith one critical exception: the symbol versioning macros in\n`crypt-port.h` only work with compilers that implement certain GCC and\nGNU Binutils extensions (`__attribute__((alias))`, GCC-style `asm`,\nand `.symver`).\n\nA few C2011 features are used; the intention is not to use any of them\nwithout a fallback, but we do not currently test this.  A few POSIX\nand nonstandard-but-widespread Unix APIs are also used; again, the\nintention is not to use any of them without a fallback, but we do not\ncurrently test this.  In particular, the crypt_gensalt functions may\nnot always be able to retrieve cryptographically-sound random numbers\nfrom the operating system; if you call these functions with a null\npointer for the “rbytes” argument, be prepared for them to fail.\n\nAs of mid-2018, GCC and LLVM don’t support link-time optimization of\nlibraries that use symbol versioning.  If you build libxcrypt with\neither of these compilers, do not use `-flto`.  See [GCC bug 48200][1]\nfor specifics; the problem is very similar for LLVM.  Because this is,\nat its root, a set of missing compiler features, we expect link-time\noptimization won’t work in other C compilers either, but we haven’t\ntested it ourselves.\n\n[1]: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=48200\n\nCompatibility Notes\n-------------------\n\nOn Linux-based systems, by default libxcrypt will be binary backward\ncompatible with the libcrypt.so.1 shipped as part of the GNU C\nLibrary.  This means that all existing binary executables linked\nagainst glibc’s libcrypt should work unmodified with this library’s\nlibcrypt.so.1.  We have taken pains to provide exactly the same symbol\nversions as were used by glibc on various CPU architectures, and to\naccount for the variety of ways in which the Openwall extensions were\npatched into glibc’s libcrypt by some Linux distributions.  (For\ninstance, compatibility symlinks for SUSE’s “libowcrypt” are provided.)\n\nHowever, the converse is not true: programs linked against libxcrypt\nwill not work with glibc’s libcrypt.  Also, programs that use certain\nlegacy APIs supplied by glibc’s libcrypt (`encrypt`, `encrypt_r`,\n`setkey`, `setkey_r`, and `fcrypt`) cannot be *compiled* against\nlibxcrypt.\n\nBinary backward compatibility can be disabled by supplying the\n`--disable-obsolete-api` switch to `configure`, in which case libxcrypt\nwill install libcrypt.so.2 instead of libcrypt.so.1.  This\nconfiguration is always used on all operating systems other than\nLinux.  We are willing to consider adding binary backward\ncompatibility for other operating systems’ existing libcrypts, but we\ndon’t currently plan to do that work ourselves.\n\nIndividual hash functions may be enabled or disabled by use of the\n`--enable-hashes` switch to `configure`.  The default is to enable all\nsupported hashes.  Disabling the traditional ‘des’ hash algorithm\nimplies `--disable-obsolete-api`.  Security-conscious environments\nwithout backward compatibility constraints are encouraged to use\n`--enable-hashes=strong`, which enables only the hash functions that\nare strong enough to be safe for newly hashed passwords.\n\nThe original implementation of the SunMD5 hashing algorithm has a bug,\nwhich is mimicked by libxcrypt to be fully compatible with hashes\ngenerated on (Open)Solaris.  According to the only existing\n[documentation of this algorithm][2], its hashes were supposed to have\nthe format `$md5[,rounds=%u]$<salt>$<checksum>`, and include only the\nbare string `$md5[,rounds=%u]$<salt>` in the salt digest\nstep. However, almost all hashes encountered in production\nenvironments have the format `$md5[,rounds=%u]$<salt>$$<checksum>`\n(note the double $$).  Unfortunately, it is not merely a cosmetic\ndifference: hashes of this format incorporate the first $ after the\nsalt within the salt digest step, so the resulting checksum is\ndifferent.  The documentation hints that this stems from a bug within\nthe production implementation’s parser.  This bug causes the\nimplementation to return `$$`-format hashes when passed a\nconfiguration string that ends with `$`.  It returns the intended\noriginal format and checksum only if there is at least one letter\nafter the `$`, e.g. `$md5[,rounds=%u]$<salt>$x`.\n\nThe NT algorithm, in its original implementation, never came with any\n`gensalt` function, because the algorithm does not use any.  libxcrypt\nships a bogus `gensalt` function for the NT algorithm, which simply\nreturns `$3$`.\n\nglibc’s libcrypt could optionally be configured to use Mozilla’s NSS\nlibrary’s implementations of the cryptographic primitives md5crypt,\nsha256crypt, and sha512crypt.  This option is not available in\nlibxcrypt, because we do not currently believe it is a desirable\noption.  The stated rationale for the option was to source all\ncryptographic primitives from a library that has undergone FIPS\ncertification, but we believe FIPS certification would need to cover\nall of libxcrypt itself to have any meaningful value.  Moreover, the\nstrongest hashing methods, yescrypt and bcrypt, use cryptographic\nprimitives that are not available from NSS, so the certification\nwould not cover any part of what will hopefully be the most used code\npaths.\n\n[2]: https://dropsafe.crypticide.com/article/1389\n"
  },
  {
    "path": "THANKS",
    "content": "As mentioned in the README, many people have contributed to the code\nmaking up libxcrypt, often under the aegis of a different project.  Of\nthe past contributors, we particularly wish to credit David Burren,\nUlrich Drepper, Alec Muffett, Colin Percival, Alexey Degtyarev, and\nThorsten Kukuk.\n\nAs well as the present maintainers, active contributors to the library\ninclude Solar Designer, Dmitry V. Levin, and <vt at altlinux dot org>.\n\nWe would also like to extend our thanks in advance to everyone who\nwill, in the future, send us bug reports, suggestions, and contributions.\n\n  -- The Authors.\n"
  },
  {
    "path": "TODO.md",
    "content": "to-do list for libxcrypt\n------------------------\n\nThis list is categorized but not in any kind of priority order.\nIt was last updated 20 October 2018.\n\n* Code cleanliness\n  * Find and remove any code that still does dodgy things with type punning\n  * Factor out all of the repetitive base64 code\n  * Factor out the multiple implementations of HMAC and PBKDF\n\n* Testsuite improvements\n  * Investigate branch coverage\n  * Do some API fuzz testing and add missing cases to the testsuite\n  * Many of the `test-crypt-*.c` files repeat more or less the same\n    code with different data, consider merging them\n\n* Portability\n  * Make sure the symbol versioning macros work with all of the\n    compilers that anyone needs (they use GCC extensions that clang\n    also supports).\n\n* Hardening\n  * bcrypt-like selftest/memory scribble for all hashing methods\n    * how do we know the memory scribble is doing its job?\n  * build out of the box with compiler hardening features turned on\n  * something bespoke for not having to write serialization and\n    deserialization logic for hash strings by hand, as this is\n    probably the most error-prone part of writing a hashing method\n\n  * the most sensitive piece of data handled by this library is a\n    cleartext passphrase.  OS may have trusted-path facilities for\n    prompting the user for a passphrase and feeding it to a KDF\n    without its ever being accessible in normal memory.  investigate\n    whether we can use these.\n\n* Additional hashing methods\n  * Argon2 <https://password-hashing.net/>\n  * ...?\n\n* Runtime configurability (in progress on the [crypt.conf branch][])\n  * allow installations to enable or disable specific hash methods\n    without rebuilding the library\n  * make the default cost parameter used by `crypt_gensalt_*` for new\n    hashes configurable\n  * update the compiled-in defaults used by `crypt_gensalt_*` (not the\n    defaults used when no explicit cost parameter is present in a\n    hash; those can’t be changed without breaking existing stored hashes)\n    * relevant benchmarking at\n      <https://pthree.org/2016/06/28/lets-talk-password-hashing/>\n  * offer a way to tune cost parameters for a specific installation\n  * N.B. Solaris 11 has all of these features but our implementation will\n    probably not match them (they have a `crypt.conf` but it’s not the\n    same, and their `crypt_gensalt` is API-incompatible anyway).\n\n[crypt.conf branch]: https://github.com/besser82/libxcrypt/tree/zack/crypt.conf\n\n* Potential API enhancements:\n\n  * Support for \"pepper\" (an additional piece of information, _not_\n    stored in the password file, that you need to check a password)\n\n  * Reading passphrases from the terminal is finicky and there are\n    several competing, poorly portable, questionably sound library\n    functions to do it (`getpass`, `readpassphrase`, etc) -- should we\n    incorporate one?\n    * If we do, should it know how to trigger the trusted-path\n      password prompt in modern GUI environments? (probably)\n\n  * Make the crypt and crypt_gensalt static state thread-specific?\n    * Solaris 11 may have done this (its `crypt(3)` manpage describes\n      it as MT-Safe and I don’t see any other way they could have\n      accomplished that).\n    * if allocated on first use, this would also shave 32kB of\n      data segment off the shared library\n    * alternatively, add a global lock and *crash the program* if we\n      detect concurrent calls\n\n  * Allow access to more of yescrypt’s tunable parameters and ROM\n    feature, in a way that’s generic enough that we could also use it\n    for e.g. Argon2’s tunable parameters\n\n  * Other yescrypt-inspired features relevant to using this library to\n    back a “dedicated authentication service,” e.g. preallocation of\n    large blocks of scratch memory\n    * the main obstacles here are that `struct crypt_data` has a fixed\n      size which is either too big or too small depending how you look\n      at it, and no destructor function\n\n* Permissive relicensing, to encourage use beyond the GNU ecosystem?\n  * Replace crypt-md5.c with original md5crypt from FreeBSD?\n  * Other files subject to the (L)GPL are crypt.c, crypt-static.c,\n    crypt-gensalt-static.c, crypt-obsolete.h, crypt-port.h,\n    test-badsalt.c.  It is not clear to me how much material originally\n    assigned to the FSF remains in these files.\n    Several of them are API definitions and trivial wrappers that\n    could not be meaningfully changed without breaking them (so are\n    arguably uncopyrightable).\n  * Most of the test suite lacks any license or even authorship\n    information.  We would have to track down the original authors.\n"
  },
  {
    "path": "autogen.sh",
    "content": "#!/bin/sh\n#\n# Copyright (C) 2018 Björn Esser <besser82@fedoraproject.org>\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted.\n#\n# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n# SUCH DAMAGE.\n\nset -efu\nLANG=C\n\nrun_cmd()\n{\n  echo \"autogen: running: $@\"\n  \"$@\"\n}\n\nif [ -d .git ]; then\n  run_cmd git clean -dfX\nfi\n\nrun_cmd autoreconf -fiv -Wall,error\n"
  },
  {
    "path": "build-aux/ci/ci-log-dependency-versions",
    "content": "#! /bin/sh\nset -e\n\n# Record certain build tool versions for use as a cache key.\nautotools_ver=\n\n# Log the identities and versions of the build tools.\nfor tool in \\\n    \"${CC-cc}\" \\\n    \"${NM-nm}\" \\\n    \"${AUTOCONF-autoconf}\" \\\n    \"${AUTOMAKE-automake}\" \\\n    \"${LIBTOOLIZE-libtoolize}\" \\\n    \"${PKG_CONFIG-pkg-config}\" \\\n    \"${PERL-perl}\" \\\n    \"${CPANM-cpanm}\" \\\n    \"${PERLCRITIC-perlcritic}\" \\\n    \"${PERLTIDY-perltidy}\" \\\n    \"${PYTHON-python3}\" \\\n    \"${GCOV-gcov}\" \\\n    \"${LCOV-lcov}\" \\\n    \"${LLVM_COV-llvm-cov}\" \\\n    \"${VALGRIND-valgrind}\"\ndo\n    # $tool might include mandatory command-line arguments.\n    # Interpret it the same way Make would.\n    set fnord $tool; shift # word-split $tool and load it into \"$@\"\n\n    echo ::group::\"$1\"\n    if command -V \"$1\"; then\n        echo + \"$@\" --version\n        \"$@\" --version\n    fi\n    echo ::endgroup::\n\n    case \"$1\" in\n        (*autoconf*)\n            autotools_ver=\"${autotools_ver}ac$(\"$@\" --version 2>&1 |\n              sed -Ene '1{s/^[^\\(]+\\([^\\)]+\\) //;p}'\n            )\"\n            ;;\n\n        (*automake*)\n            autotools_ver=\"${autotools_ver}am$(\"$@\" --version |\n              sed -Ene '1{s/^[^\\(]+\\([^\\)]+\\) //;p}'\n            )\"\n            ;;\n\n        (*libtoolize*)\n            autotools_ver=\"${autotools_ver}lt$(\"$@\" --version |\n              sed -Ene '1{s/^[^\\(]+\\([^\\)]+\\) //;p}'\n            )\"\n            ;;\n\n        (*pkg-config*)\n            autotools_ver=\"${autotools_ver}pk$(\"$@\" --version |\n              sed -Ene '1{s/^[^\\(]+\\([^\\)]+\\) //;p}'\n            )\"\n            ;;\n\n        (*python*)\n            echo ::group::passlib\n            \"$@\" -c '\ntry:\n  import passlib\n  import os.path\n  print(\"passlib is \" + os.path.dirname(passlib.__file__))\n  print(\"passlib: version \" + passlib.__version__)\nexcept ModuleNotFoundError:\n  print(\"passlib is not installed\")\n'\n            echo ::endgroup::\n            ;;\n    esac\ndone\n\nset fnord; shift  # clear $@\necho \"autotools-ver=$autotools_ver\" >> $GITHUB_OUTPUT\nexit 0\n"
  },
  {
    "path": "build-aux/ci/ci-log-logfiles",
    "content": "#! /bin/sh\n\ngenerate_secure_token() {\n    echo head --bytes 64 /dev/urandom | sha512sum --binary | cut --fields 1 --delimiter ' '\n}\n\ndump_log () {\n    if [ -s \"$1\" ]; then\n        stop_command_token=\"$(generate_secure_token)\"\n        echo \"::group::$1\"\n        echo \"::stop-commands::$stop_command_token\"\n        cat \"$1\"\n        echo \"::$stop_command_token::\"\n        echo '::endgroup::'\n        unset stop_command_token\n    fi\n}\n\ndump_log config.log\nfind . -name 'test-suite*.log' -printf '%P\\n' | while read -r ts; do\n    dump_log \"$ts\"\ndone\n"
  },
  {
    "path": "build-aux/ci/clang-gcov-wrapper",
    "content": "#! /bin/sh\nexec llvm-cov gcov \"$@\"\n"
  },
  {
    "path": "build-aux/ci/configure-wrapper",
    "content": "#!/bin/bash\n\nexport DEB_BUILD_MAINT_OPTIONS=\"${DEB_BUILD_MAINT_OPTIONS:-hardening=+all optimize=-lto}\"\n\nexport CPPFLAGS=\"${CPPFLAGS} $(dpkg-buildflags --get CPPFLAGS)\"\nexport CFLAGS=\"${CFLAGS} $(dpkg-buildflags --get CFLAGS)\"\nexport CXXFLAGS=\"${CXXFLAGS} $(dpkg-buildflags --get CXXFLAGS)\"\nexport LDFLAGS=\"${LDFLAGS} $(dpkg-buildflags --get LDFLAGS)\"\n\n$PWD/configure \"$@\"\n"
  },
  {
    "path": "build-aux/ci/summarize-coverage",
    "content": "#! /bin/sh\nset -e\n\ncase \"$CC\" in\n    (*clang*)\n        GCOV=$(pwd)/build-aux/ci/clang-gcov-wrapper ;;\n    (*)\n        GCOV=gcov ;;\nesac\n\nunpruned=$(mktemp --tmpdir all-coverage.XXXXXXXXXX.info)\ntrap 'rm -f \"'\"$unpruned\"'\"' 0\n\nset -x\n# Merge all of the gcov output into one overview file using lcov,\n# then prune data for the tests themselves, and for system libraries.\n\nlcov --gcov-tool \"$GCOV\" --rc branch_coverage=1 \\\n     --directory . --output-file \"$unpruned\" \\\n     --capture\n\nlcov --gcov-tool \"$GCOV\" --rc branch_coverage=1 \\\n     --directory . --output-file \"$1\" --ignore-errors unused \\\n     --remove \"$unpruned\" '/usr/*' '*test*' '*gen-des-tables*'\n"
  },
  {
    "path": "build-aux/m4/ax_append_compile_flags.m4",
    "content": "# ============================================================================\n#  https://www.gnu.org/software/autoconf-archive/ax_append_compile_flags.html\n# ============================================================================\n#\n# SYNOPSIS\n#\n#   AX_APPEND_COMPILE_FLAGS([FLAG1 FLAG2 ...], [FLAGS-VARIABLE], [EXTRA-FLAGS], [INPUT])\n#\n# DESCRIPTION\n#\n#   For every FLAG1, FLAG2 it is checked whether the compiler works with the\n#   flag.  If it does, the flag is added FLAGS-VARIABLE\n#\n#   If FLAGS-VARIABLE is not specified, the current language's flags (e.g.\n#   CFLAGS) is used.  During the check the flag is always added to the\n#   current language's flags.\n#\n#   If EXTRA-FLAGS is defined, it is added to the current language's default\n#   flags (e.g. CFLAGS) when the check is done.  The check is thus made with\n#   the flags: \"CFLAGS EXTRA-FLAGS FLAG\".  This can for example be used to\n#   force the compiler to issue an error when a bad flag is given.\n#\n#   INPUT gives an alternative input source to AC_COMPILE_IFELSE.\n#\n#   NOTE: This macro depends on the AX_APPEND_FLAG and\n#   AX_CHECK_COMPILE_FLAG. Please keep this macro in sync with\n#   AX_APPEND_LINK_FLAGS.\n#\n# LICENSE\n#\n#   Copyright (c) 2011 Maarten Bosmans <mkbosmans@gmail.com>\n#\n#   Copying and distribution of this file, with or without modification, are\n#   permitted in any medium without royalty provided the copyright notice\n#   and this notice are preserved.  This file is offered as-is, without any\n#   warranty.\n\n#serial 7\n\nAC_DEFUN([AX_APPEND_COMPILE_FLAGS],\n[AX_REQUIRE_DEFINED([AX_CHECK_COMPILE_FLAG])\nAX_REQUIRE_DEFINED([AX_APPEND_FLAG])\nfor flag in $1; do\n  AX_CHECK_COMPILE_FLAG([$flag], [AX_APPEND_FLAG([$flag], [$2])], [], [$3], [$4])\ndone\n])dnl AX_APPEND_COMPILE_FLAGS\n"
  },
  {
    "path": "build-aux/m4/ax_append_flag.m4",
    "content": "# ===========================================================================\n#      https://www.gnu.org/software/autoconf-archive/ax_append_flag.html\n# ===========================================================================\n#\n# SYNOPSIS\n#\n#   AX_APPEND_FLAG(FLAG, [FLAGS-VARIABLE])\n#\n# DESCRIPTION\n#\n#   FLAG is appended to the FLAGS-VARIABLE shell variable, with a space\n#   added in between.\n#\n#   If FLAGS-VARIABLE is not specified, the current language's flags (e.g.\n#   CFLAGS) is used.  FLAGS-VARIABLE is not changed if it already contains\n#   FLAG.  If FLAGS-VARIABLE is unset in the shell, it is set to exactly\n#   FLAG.\n#\n#   NOTE: Implementation based on AX_CFLAGS_GCC_OPTION.\n#\n# LICENSE\n#\n#   Copyright (c) 2008 Guido U. Draheim <guidod@gmx.de>\n#   Copyright (c) 2011 Maarten Bosmans <mkbosmans@gmail.com>\n#\n#   Copying and distribution of this file, with or without modification, are\n#   permitted in any medium without royalty provided the copyright notice\n#   and this notice are preserved.  This file is offered as-is, without any\n#   warranty.\n\n#serial 8\n\nAC_DEFUN([AX_APPEND_FLAG],\n[dnl\nAC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_SET_IF\nAS_VAR_PUSHDEF([FLAGS], [m4_default($2,_AC_LANG_PREFIX[FLAGS])])\nAS_VAR_SET_IF(FLAGS,[\n  AS_CASE([\" AS_VAR_GET(FLAGS) \"],\n    [*\" $1 \"*], [AC_RUN_LOG([: FLAGS already contains $1])],\n    [\n     AS_VAR_APPEND(FLAGS,[\" $1\"])\n     AC_RUN_LOG([: FLAGS=\"$FLAGS\"])\n    ])\n  ],\n  [\n  AS_VAR_SET(FLAGS,[$1])\n  AC_RUN_LOG([: FLAGS=\"$FLAGS\"])\n  ])\nAS_VAR_POPDEF([FLAGS])dnl\n])dnl AX_APPEND_FLAG\n"
  },
  {
    "path": "build-aux/m4/ax_check_compile_flag.m4",
    "content": "# ===========================================================================\n#  https://www.gnu.org/software/autoconf-archive/ax_check_compile_flag.html\n# ===========================================================================\n#\n# SYNOPSIS\n#\n#   AX_CHECK_COMPILE_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS], [INPUT])\n#\n# DESCRIPTION\n#\n#   Check whether the given FLAG works with the current language's compiler\n#   or gives an error.  (Warnings, however, are ignored)\n#\n#   ACTION-SUCCESS/ACTION-FAILURE are shell commands to execute on\n#   success/failure.\n#\n#   If EXTRA-FLAGS is defined, it is added to the current language's default\n#   flags (e.g. CFLAGS) when the check is done.  The check is thus made with\n#   the flags: \"CFLAGS EXTRA-FLAGS FLAG\".  This can for example be used to\n#   force the compiler to issue an error when a bad flag is given.\n#\n#   INPUT gives an alternative input source to AC_COMPILE_IFELSE.\n#\n#   NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. Please keep this\n#   macro in sync with AX_CHECK_{PREPROC,LINK}_FLAG.\n#\n# LICENSE\n#\n#   Copyright (c) 2008 Guido U. Draheim <guidod@gmx.de>\n#   Copyright (c) 2011 Maarten Bosmans <mkbosmans@gmail.com>\n#\n#   Copying and distribution of this file, with or without modification, are\n#   permitted in any medium without royalty provided the copyright notice\n#   and this notice are preserved.  This file is offered as-is, without any\n#   warranty.\n\n#serial 6\n\nAC_DEFUN([AX_CHECK_COMPILE_FLAG],\n[AC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_IF\nAS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_[]_AC_LANG_ABBREV[]flags_$4_$1])dnl\nAC_CACHE_CHECK([whether _AC_LANG compiler accepts $1], CACHEVAR, [\n  ax_check_save_flags=$[]_AC_LANG_PREFIX[]FLAGS\n  _AC_LANG_PREFIX[]FLAGS=\"$[]_AC_LANG_PREFIX[]FLAGS $4 $1\"\n  AC_COMPILE_IFELSE([m4_default([$5],[AC_LANG_PROGRAM()])],\n    [AS_VAR_SET(CACHEVAR,[yes])],\n    [AS_VAR_SET(CACHEVAR,[no])])\n  _AC_LANG_PREFIX[]FLAGS=$ax_check_save_flags])\nAS_VAR_IF(CACHEVAR,yes,\n  [m4_default([$2], :)],\n  [m4_default([$3], :)])\nAS_VAR_POPDEF([CACHEVAR])dnl\n])dnl AX_CHECK_COMPILE_FLAGS\n"
  },
  {
    "path": "build-aux/m4/ax_check_vscript.m4",
    "content": "# ===========================================================================\n#     https://www.gnu.org/software/autoconf-archive/ax_check_vscript.html\n# ===========================================================================\n#\n# SYNOPSIS\n#\n#   AX_CHECK_VSCRIPT\n#\n# DESCRIPTION\n#\n#   Check whether the linker supports version scripts.  Version scripts are\n#   used when building shared libraries to bind symbols to version nodes\n#   (helping to detect incompatibilities) or to limit the visibility of\n#   non-public symbols.\n#\n#   Output:\n#\n#   If version scripts are supported, VSCRIPT_LDFLAGS will contain the\n#   appropriate flag to pass to the linker.  On GNU systems this would\n#   typically be \"-Wl,--version-script\", and on Solaris it would typically\n#   be \"-Wl,-M\".\n#\n#   Two Automake conditionals are also set:\n#\n#    HAVE_VSCRIPT is true if the linker supports version scripts with\n#    entries that use simple wildcards, like \"local: *\".\n#\n#    HAVE_VSCRIPT_COMPLEX is true if the linker supports version scripts with\n#    pattern matching wildcards, like \"global: Java_*\".\n#\n#   On systems that do not support symbol versioning, such as Mac OS X, both\n#   conditionals will be false.  They will also be false if the user passes\n#   \"--disable-symvers\" on the configure command line.\n#\n#   Example:\n#\n#    configure.ac:\n#\n#     AX_CHECK_VSCRIPT\n#\n#    Makefile.am:\n#\n#     if HAVE_VSCRIPT\n#     libfoo_la_LDFLAGS += $(VSCRIPT_LDFLAGS),@srcdir@/libfoo.map\n#     endif\n#\n#     if HAVE_VSCRIPT_COMPLEX\n#     libbar_la_LDFLAGS += $(VSCRIPT_LDFLAGS),@srcdir@/libbar.map\n#     endif\n#\n# LICENSE\n#\n#   Copyright (c) 2014 Kevin Cernekee <cernekee@gmail.com>\n#\n#   Copying and distribution of this file, with or without modification, are\n#   permitted in any medium without royalty provided the copyright notice\n#   and this notice are preserved. This file is offered as-is, without any\n#   warranty.\n\n#serial 2\n\n# _AX_CHECK_VSCRIPT(flag, global-sym, action-if-link-succeeds, [junk-file=no])\nAC_DEFUN([_AX_CHECK_VSCRIPT], [\n  AC_LANG_PUSH([C])\n  ax_check_vscript_save_flags=\"$LDFLAGS\"\n  echo \"V1 { global: $2; local: *; };\" > conftest.map\n  AS_IF([test x$4 = xyes], [\n    echo \"{\" >> conftest.map\n  ])\n  LDFLAGS=\"$LDFLAGS -Wl,$1,conftest.map\"\n  AC_LINK_IFELSE([AC_LANG_PROGRAM([[int show, hide;]], [])], [$3])\n  LDFLAGS=\"$ax_check_vscript_save_flags\"\n  rm -f conftest.map\n  AC_LANG_POP([C])\n]) dnl _AX_CHECK_VSCRIPT\n\nAC_DEFUN([AX_CHECK_VSCRIPT], [\n\n  AC_ARG_ENABLE([symvers],\n    AS_HELP_STRING([--disable-symvers],\n                   [disable library symbol versioning [default=auto]]),\n    [want_symvers=$enableval],\n    [want_symvers=yes]\n  )\n\n  AS_IF([test x$want_symvers = xyes], [\n\n    dnl First test --version-script and -M with a simple wildcard.\n\n    AC_CACHE_CHECK([linker version script flag], ax_cv_check_vscript_flag, [\n      ax_cv_check_vscript_flag=unsupported\n      _AX_CHECK_VSCRIPT([--version-script], [show], [\n        ax_cv_check_vscript_flag=--version-script\n      ])\n      AS_IF([test x$ax_cv_check_vscript_flag = xunsupported], [\n        _AX_CHECK_VSCRIPT([-M], [show], [ax_cv_check_vscript_flag=-M])\n      ])\n\n      dnl The linker may interpret -M (no argument) as \"produce a load map.\"\n      dnl If \"-M conftest.map\" doesn't fail when conftest.map contains\n      dnl obvious syntax errors, assume this is the case.\n\n      AS_IF([test x$ax_cv_check_vscript_flag != xunsupported], [\n        _AX_CHECK_VSCRIPT([$ax_cv_check_vscript_flag], [show],\n\t                  [ax_cv_check_vscript_flag=unsupported], [yes])\n      ])\n    ])\n\n    dnl If the simple wildcard worked, retest with a complex wildcard.\n\n    AS_IF([test x$ax_cv_check_vscript_flag != xunsupported], [\n      ax_check_vscript_flag=$ax_cv_check_vscript_flag\n      AC_CACHE_CHECK([if version scripts can use complex wildcards],\n                     ax_cv_check_vscript_complex_wildcards, [\n        ax_cv_check_vscript_complex_wildcards=no\n        _AX_CHECK_VSCRIPT([$ax_cv_check_vscript_flag], [sh*], [\n        ax_cv_check_vscript_complex_wildcards=yes])\n      ])\n      ax_check_vscript_complex_wildcards=\"$ax_cv_check_vscript_complex_wildcards\"\n    ], [\n      ax_check_vscript_flag=\n      ax_check_vscript_complex_wildcards=no\n    ])\n  ], [\n    AC_MSG_CHECKING([linker version script flag])\n    AC_MSG_RESULT([disabled])\n\n    ax_check_vscript_flag=\n    ax_check_vscript_complex_wildcards=no\n  ])\n\n  AS_IF([test x$ax_check_vscript_flag != x], [\n    VSCRIPT_LDFLAGS=\"-Wl,$ax_check_vscript_flag\"\n    AC_SUBST([VSCRIPT_LDFLAGS])\n  ])\n\n  AM_CONDITIONAL([HAVE_VSCRIPT],\n    [test x$ax_check_vscript_flag != x])\n  AM_CONDITIONAL([HAVE_VSCRIPT_COMPLEX],\n    [test x$ax_check_vscript_complex_wildcards = xyes])\n\n]) dnl AX_CHECK_VSCRIPT\n"
  },
  {
    "path": "build-aux/m4/ax_gcc_func_attribute.m4",
    "content": "# ===========================================================================\n#  https://www.gnu.org/software/autoconf-archive/ax_gcc_func_attribute.html\n# ===========================================================================\n#\n# SYNOPSIS\n#\n#   AX_GCC_FUNC_ATTRIBUTE(ATTRIBUTE)\n#\n# DESCRIPTION\n#\n#   This macro checks if the compiler supports one of GCC's function\n#   attributes; many other compilers also provide function attributes with\n#   the same syntax. Compiler warnings are used to detect supported\n#   attributes as unsupported ones are ignored by default so quieting\n#   warnings when using this macro will yield false positives.\n#\n#   The ATTRIBUTE parameter holds the name of the attribute to be checked.\n#\n#   If ATTRIBUTE is supported define HAVE_FUNC_ATTRIBUTE_<ATTRIBUTE>.\n#\n#   The macro caches its result in the ax_cv_have_func_attribute_<attribute>\n#   variable.\n#\n#   The macro currently supports the following function attributes:\n#\n#    alias\n#    aligned\n#    alloc_size\n#    always_inline\n#    artificial\n#    cold\n#    const\n#    constructor\n#    constructor_priority for constructor attribute with priority\n#    deprecated\n#    destructor\n#    dllexport\n#    dllimport\n#    error\n#    externally_visible\n#    fallthrough\n#    flatten\n#    format\n#    format_arg\n#    gnu_format\n#    gnu_inline\n#    hot\n#    ifunc\n#    leaf\n#    malloc\n#    noclone\n#    noinline\n#    nonnull\n#    noreturn\n#    nothrow\n#    optimize\n#    pure\n#    sentinel\n#    sentinel_position\n#    unused\n#    used\n#    visibility\n#    warning\n#    warn_unused_result\n#    weak\n#    weakref\n#    symver\n#\n#   Unsupported function attributes will be tested with a prototype\n#   returning an int and not accepting any arguments and the result of the\n#   check might be wrong or meaningless so use with care.\n#\n# LICENSE\n#\n#   Copyright (c) 2013 Gabriele Svelto <gabriele.svelto@gmail.com>\n#\n#   Copying and distribution of this file, with or without modification, are\n#   permitted in any medium without royalty provided the copyright notice\n#   and this notice are preserved.  This file is offered as-is, without any\n#   warranty.\n\n#serial 13\n\nAC_DEFUN([AX_GCC_FUNC_ATTRIBUTE], [\n    AS_VAR_PUSHDEF([ac_var], [ax_cv_have_func_attribute_$1])\n\n    AC_CACHE_CHECK([for __attribute__(($1))], [ac_var], [\n        AC_LINK_IFELSE([AC_LANG_PROGRAM([\n            m4_case([$1],\n                [alias], [\n                    int foo( void ) { return 0; }\n                    int bar( void ) __attribute__(($1(\"foo\")));\n                ],\n                [aligned], [\n                    int foo( void ) __attribute__(($1(32)));\n                ],\n                [alloc_size], [\n                    void *foo(int a) __attribute__(($1(1)));\n                ],\n                [always_inline], [\n                    inline __attribute__(($1)) int foo( void ) { return 0; }\n                ],\n                [artificial], [\n                    inline __attribute__(($1)) int foo( void ) { return 0; }\n                ],\n                [cold], [\n                    int foo( void ) __attribute__(($1));\n                ],\n                [const], [\n                    int foo( void ) __attribute__(($1));\n                ],\n                [constructor_priority], [\n                    int foo( void ) __attribute__((__constructor__(65535/2)));\n                ],\n                [constructor], [\n                    int foo( void ) __attribute__(($1));\n                ],\n                [deprecated], [\n                    int foo( void ) __attribute__(($1(\"\")));\n                ],\n                [destructor], [\n                    int foo( void ) __attribute__(($1));\n                ],\n                [dllexport], [\n                    __attribute__(($1)) int foo( void ) { return 0; }\n                ],\n                [dllimport], [\n                    int foo( void ) __attribute__(($1));\n                ],\n                [error], [\n                    int foo( void ) __attribute__(($1(\"\")));\n                ],\n                [externally_visible], [\n                    int foo( void ) __attribute__(($1));\n                ],\n                [fallthrough], [\n                    void foo( int x ) {switch (x) { case 1: __attribute__(($1)); case 2: break ; }};\n                ],\n                [flatten], [\n                    int foo( void ) __attribute__(($1));\n                ],\n                [format], [\n                    int foo(const char *p, ...) __attribute__(($1(printf, 1, 2)));\n                ],\n                [gnu_format], [\n                    int foo(const char *p, ...) __attribute__((format(gnu_printf, 1, 2)));\n                ],\n                [format_arg], [\n                    char *foo(const char *p) __attribute__(($1(1)));\n                ],\n                [gnu_inline], [\n                    inline __attribute__(($1)) int foo( void ) { return 0; }\n                ],\n                [hot], [\n                    int foo( void ) __attribute__(($1));\n                ],\n                [ifunc], [\n                    int my_foo( void ) { return 0; }\n                    static int (*resolve_foo(void))(void) { return my_foo; }\n                    int foo( void ) __attribute__(($1(\"resolve_foo\")));\n                ],\n                [leaf], [\n                    __attribute__(($1)) int foo( void ) { return 0; }\n                ],\n                [malloc], [\n                    void *foo( void ) __attribute__(($1));\n                ],\n                [noclone], [\n                    int foo( void ) __attribute__(($1));\n                ],\n                [noinline], [\n                    __attribute__(($1)) int foo( void ) { return 0; }\n                ],\n                [nonnull], [\n                    int foo(char *p) __attribute__(($1(1)));\n                ],\n                [noreturn], [\n                    void foo( void ) __attribute__(($1));\n                ],\n                [nothrow], [\n                    int foo( void ) __attribute__(($1));\n                ],\n                [optimize], [\n                    __attribute__(($1(3))) int foo( void ) { return 0; }\n                ],\n                [pure], [\n                    int foo( void ) __attribute__(($1));\n                ],\n                [sentinel], [\n                    int foo(void *p, ...) __attribute__(($1));\n                ],\n                [sentinel_position], [\n                    int foo(void *p, ...) __attribute__(($1(1)));\n                ],\n                [returns_nonnull], [\n                    void *foo( void ) __attribute__(($1));\n                ],\n                [unused], [\n                    int foo( void ) __attribute__(($1));\n                ],\n                [used], [\n                    int foo( void ) __attribute__(($1));\n                ],\n                [visibility], [\n                    int foo_def( void ) __attribute__(($1(\"default\")));\n                    int foo_hid( void ) __attribute__(($1(\"hidden\")));\n                    int foo_int( void ) __attribute__(($1(\"internal\")));\n                    int foo_pro( void ) __attribute__(($1(\"protected\")));\n                ],\n                [warning], [\n                    int foo( void ) __attribute__(($1(\"\")));\n                ],\n                [warn_unused_result], [\n                    int foo( void ) __attribute__(($1));\n                ],\n                [weak], [\n                    int foo( void ) __attribute__(($1));\n                ],\n                [weakref], [\n                    static int foo( void ) { return 0; }\n                    static int bar( void ) __attribute__(($1(\"foo\")));\n                ],\n                [symver], [\n                    __attribute__(($1(\"foo@2.0\"))) void bar( void ) {}\n                ],\n                [\n                 m4_warn([syntax], [Unsupported attribute $1, the test may fail])\n                 int foo( void ) __attribute__(($1));\n                ]\n            )], [])\n            ],\n            dnl GCC doesn't exit with an error if an unknown attribute is\n            dnl provided but only outputs a warning, so accept the attribute\n            dnl only if no warning were issued.\n            [AS_IF([grep -q -e -Wattributes -e -Wunknown-attributes -e error -e warning conftest.err],\n                [AS_VAR_SET([ac_var], [no])],\n                [AS_VAR_SET([ac_var], [yes])])],\n            [AS_VAR_SET([ac_var], [no])])\n    ])\n\n    AS_IF([test yes = AS_VAR_GET([ac_var])],\n        [AC_DEFINE_UNQUOTED(AS_TR_CPP(HAVE_FUNC_ATTRIBUTE_$1), 1,\n            [Define to 1 if the system has the `$1' function attribute])], [])\n\n    AS_VAR_POPDEF([ac_var])\n])\n"
  },
  {
    "path": "build-aux/m4/ax_require_defined.m4",
    "content": "# ===========================================================================\n#    https://www.gnu.org/software/autoconf-archive/ax_require_defined.html\n# ===========================================================================\n#\n# SYNOPSIS\n#\n#   AX_REQUIRE_DEFINED(MACRO)\n#\n# DESCRIPTION\n#\n#   AX_REQUIRE_DEFINED is a simple helper for making sure other macros have\n#   been defined and thus are available for use.  This avoids random issues\n#   where a macro isn't expanded.  Instead the configure script emits a\n#   non-fatal:\n#\n#     ./configure: line 1673: AX_CFLAGS_WARN_ALL: command not found\n#\n#   It's like AC_REQUIRE except it doesn't expand the required macro.\n#\n#   Here's an example:\n#\n#     AX_REQUIRE_DEFINED([AX_CHECK_LINK_FLAG])\n#\n# LICENSE\n#\n#   Copyright (c) 2014 Mike Frysinger <vapier@gentoo.org>\n#\n#   Copying and distribution of this file, with or without modification, are\n#   permitted in any medium without royalty provided the copyright notice\n#   and this notice are preserved. This file is offered as-is, without any\n#   warranty.\n\n#serial 2\n\nAC_DEFUN([AX_REQUIRE_DEFINED], [dnl\n  m4_ifndef([$1], [m4_fatal([macro ]$1[ is not defined; is a m4 file missing?])])\n])dnl AX_REQUIRE_DEFINED\n"
  },
  {
    "path": "build-aux/m4/ax_valgrind_check.m4",
    "content": "# ===========================================================================\n#    https://www.gnu.org/software/autoconf-archive/ax_valgrind_check.html\n# ===========================================================================\n#\n# SYNOPSIS\n#\n#   AX_VALGRIND_DFLT(memcheck|helgrind|drd|sgcheck, on|off)\n#   AX_VALGRIND_CHECK()\n#\n# DESCRIPTION\n#\n#   AX_VALGRIND_CHECK checks whether Valgrind is present and, if so, allows\n#   running `make check` under a variety of Valgrind tools to check for\n#   memory and threading errors.\n#\n#   Defines VALGRIND_CHECK_RULES which should be substituted in your\n#   Makefile; and $enable_valgrind which can be used in subsequent configure\n#   output. VALGRIND_ENABLED is defined and substituted, and corresponds to\n#   the value of the --enable-valgrind option, which defaults to being\n#   enabled if Valgrind is installed and disabled otherwise. Individual\n#   Valgrind tools can be disabled via --disable-valgrind-<tool>, the\n#   default is configurable via the AX_VALGRIND_DFLT command or is to use\n#   all commands not disabled via AX_VALGRIND_DFLT. All AX_VALGRIND_DFLT\n#   calls must be made before the call to AX_VALGRIND_CHECK.\n#\n#   If unit tests are written using a shell script and automake's\n#   LOG_COMPILER system, the $(VALGRIND) variable can be used within the\n#   shell scripts to enable Valgrind, as described here:\n#\n#     https://www.gnu.org/software/gnulib/manual/html_node/Running-self_002dtests-under-valgrind.html\n#\n#   Usage example:\n#\n#   configure.ac:\n#\n#     AX_VALGRIND_DFLT([sgcheck], [off])\n#     AX_VALGRIND_CHECK\n#\n#   in each Makefile.am with tests:\n#\n#     @VALGRIND_CHECK_RULES@\n#     VALGRIND_SUPPRESSIONS_FILES = my-project.supp\n#     EXTRA_DIST = my-project.supp\n#\n#   This results in a \"check-valgrind\" rule being added. Running `make\n#   check-valgrind` in that directory will recursively run the module's test\n#   suite (`make check`) once for each of the available Valgrind tools (out\n#   of memcheck, helgrind and drd) while the sgcheck will be skipped unless\n#   enabled again on the commandline with --enable-valgrind-sgcheck. The\n#   results for each check will be output to test-suite-$toolname.log. The\n#   target will succeed if there are zero errors and fail otherwise.\n#\n#   Alternatively, a \"check-valgrind-$TOOL\" rule will be added, for $TOOL in\n#   memcheck, helgrind, drd and sgcheck. These are useful because often only\n#   some of those tools can be ran cleanly on a codebase.\n#\n#   The macro supports running with and without libtool.\n#\n# LICENSE\n#\n#   Copyright (c) 2014, 2015, 2016 Philip Withnall <philip.withnall@collabora.co.uk>\n#\n#   Copying and distribution of this file, with or without modification, are\n#   permitted in any medium without royalty provided the copyright notice\n#   and this notice are preserved.  This file is offered as-is, without any\n#   warranty.\n\n#serial 23\n\ndnl Configured tools\nm4_define([valgrind_tool_list], [[memcheck], [helgrind], [drd], [sgcheck]])\nm4_set_add_all([valgrind_exp_tool_set], [sgcheck])\nm4_foreach([vgtool], [valgrind_tool_list],\n           [m4_define([en_dflt_valgrind_]vgtool, [on])])\n\nAC_DEFUN([AX_VALGRIND_DFLT],[\n\tm4_define([en_dflt_valgrind_$1], [$2])\n])dnl\n\nAC_DEFUN([AX_VALGRIND_CHECK],[\n\tAM_EXTRA_RECURSIVE_TARGETS([check-valgrind])\n\tm4_foreach([vgtool], [valgrind_tool_list],\n\t\t[AM_EXTRA_RECURSIVE_TARGETS([check-valgrind-]vgtool)])\n\n\tdnl Check for --enable-valgrind\n\tAC_ARG_ENABLE([valgrind],\n\t              [AS_HELP_STRING([--enable-valgrind], [Whether to enable Valgrind on the unit tests])],\n\t              [enable_valgrind=$enableval],[enable_valgrind=])\n\n\tAS_IF([test \"$enable_valgrind\" != \"no\"],[\n\t\t# Check for Valgrind.\n\t\tAC_PATH_PROG([VALGRIND],[valgrind])\n\t\tAS_IF([test \"$VALGRIND\" = \"\"],[\n\t\t\tAS_IF([test \"$enable_valgrind\" = \"yes\"],[\n\t\t\t\tAC_MSG_ERROR([Could not find valgrind; either install it or reconfigure with --disable-valgrind])\n\t\t\t],[\n\t\t\t\tenable_valgrind=no\n\t\t\t])\n\t\t],[\n\t\t\tenable_valgrind=yes\n\t\t])\n\t])\n\n\tAM_CONDITIONAL([VALGRIND_ENABLED],[test \"$enable_valgrind\" = \"yes\"])\n\tAC_SUBST([VALGRIND_ENABLED],[$enable_valgrind])\n\n\t# Check for Valgrind tools we care about.\n\t[valgrind_enabled_tools=]\n\tm4_foreach([vgtool],[valgrind_tool_list],[\n\t\tAC_ARG_ENABLE([valgrind-]vgtool,\n\t\t    m4_if(m4_defn([en_dflt_valgrind_]vgtool),[off],dnl\n[AS_HELP_STRING([--enable-valgrind-]vgtool, [Whether to use ]vgtool[ during the Valgrind tests])],dnl\n[AS_HELP_STRING([--disable-valgrind-]vgtool, [Whether to skip ]vgtool[ during the Valgrind tests])]),\n\t\t              [enable_valgrind_]vgtool[=$enableval],\n\t\t              [enable_valgrind_]vgtool[=])\n\t\tAS_IF([test \"$enable_valgrind\" = \"no\"],[\n\t\t\tenable_valgrind_]vgtool[=no],\n\t\t      [test \"$enable_valgrind_]vgtool[\" ]dnl\nm4_if(m4_defn([en_dflt_valgrind_]vgtool), [off], [= \"yes\"], [!= \"no\"]),[\n\t\t\tAC_CACHE_CHECK([for Valgrind tool ]vgtool,\n\t\t\t               [ax_cv_valgrind_tool_]vgtool,[\n\t\t\t\tax_cv_valgrind_tool_]vgtool[=no\n\t\t\t\tm4_set_contains([valgrind_exp_tool_set],vgtool,\n\t\t\t\t    [m4_define([vgtoolx],[exp-]vgtool)],\n\t\t\t\t    [m4_define([vgtoolx],vgtool)])\n\t\t\t\tAS_IF([`$VALGRIND --tool=]vgtoolx[ --help >/dev/null 2>&1`],[\n\t\t\t\t\tax_cv_valgrind_tool_]vgtool[=yes\n\t\t\t\t])\n\t\t\t])\n\t\t\tAS_IF([test \"$ax_cv_valgrind_tool_]vgtool[\" = \"no\"],[\n\t\t\t\tAS_IF([test \"$enable_valgrind_]vgtool[\" = \"yes\"],[\n\t\t\t\t\tAC_MSG_ERROR([Valgrind does not support ]vgtool[; reconfigure with --disable-valgrind-]vgtool)\n\t\t\t\t],[\n\t\t\t\t\tenable_valgrind_]vgtool[=no\n\t\t\t\t])\n\t\t\t],[\n\t\t\t\tenable_valgrind_]vgtool[=yes\n\t\t\t])\n\t\t])\n\t\tAS_IF([test \"$enable_valgrind_]vgtool[\" = \"yes\"],[\n\t\t\tvalgrind_enabled_tools=\"$valgrind_enabled_tools ]m4_bpatsubst(vgtool,[^exp-])[\"\n\t\t])\n\t\tAC_SUBST([ENABLE_VALGRIND_]vgtool,[$enable_valgrind_]vgtool)\n\t])\n\tAC_SUBST([valgrind_tools],[\"]m4_join([ ], valgrind_tool_list)[\"])\n\tAC_SUBST([valgrind_enabled_tools],[$valgrind_enabled_tools])\n\n[VALGRIND_CHECK_RULES='\n# Valgrind check\n#\n# Optional:\n#  - VALGRIND_SUPPRESSIONS_FILES: Space-separated list of Valgrind suppressions\n#    files to load. (Default: empty)\n#  - VALGRIND_FLAGS: General flags to pass to all Valgrind tools.\n#    (Default: --num-callers=30)\n#  - VALGRIND_$toolname_FLAGS: Flags to pass to Valgrind $toolname (one of:\n#    memcheck, helgrind, drd, sgcheck). (Default: various)\n\n# Optional variables\nVALGRIND_SUPPRESSIONS ?= $(addprefix --suppressions=,$(VALGRIND_SUPPRESSIONS_FILES))\nVALGRIND_FLAGS ?= --num-callers=30\nVALGRIND_memcheck_FLAGS ?= --leak-check=full --show-reachable=no\nVALGRIND_helgrind_FLAGS ?= --history-level=approx\nVALGRIND_drd_FLAGS ?=\nVALGRIND_sgcheck_FLAGS ?=\n\n# Internal use\nvalgrind_log_files = $(addprefix test-suite-,$(addsuffix .log,$(valgrind_tools)))\n\nvalgrind_memcheck_flags = --tool=memcheck $(VALGRIND_memcheck_FLAGS)\nvalgrind_helgrind_flags = --tool=helgrind $(VALGRIND_helgrind_FLAGS)\nvalgrind_drd_flags = --tool=drd $(VALGRIND_drd_FLAGS)\nvalgrind_sgcheck_flags = --tool=exp-sgcheck $(VALGRIND_sgcheck_FLAGS)\n\nvalgrind_quiet = $(valgrind_quiet_$(V))\nvalgrind_quiet_ = $(valgrind_quiet_$(AM_DEFAULT_VERBOSITY))\nvalgrind_quiet_0 = --quiet\nvalgrind_v_use   = $(valgrind_v_use_$(V))\nvalgrind_v_use_  = $(valgrind_v_use_$(AM_DEFAULT_VERBOSITY))\nvalgrind_v_use_0 = @echo \"  USE   \" $(patsubst check-valgrind-%-local,%,$''@):;\n\n# Support running with and without libtool.\nifneq ($(LIBTOOL),)\nvalgrind_lt = $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=execute\nelse\nvalgrind_lt =\nendif\n\n# Use recursive makes in order to ignore errors during check\ncheck-valgrind-local:\nifeq ($(VALGRIND_ENABLED),yes)\n\t$(A''M_V_at)$(MAKE) $(AM_MAKEFLAGS) -k \\\n\t\t$(foreach tool, $(valgrind_enabled_tools), check-valgrind-$(tool))\nelse\n\t@echo \"Need to reconfigure with --enable-valgrind\"\nendif\n\n# Valgrind running\nVALGRIND_TESTS_ENVIRONMENT = \\\n\t$(TESTS_ENVIRONMENT) \\\n\tenv VALGRIND=$(VALGRIND) \\\n\tG_SLICE=always-malloc,debug-blocks \\\n\tG_DEBUG=fatal-warnings,fatal-criticals,gc-friendly\n\nVALGRIND_LOG_COMPILER = \\\n\t$(valgrind_lt) \\\n\t$(VALGRIND) $(VALGRIND_SUPPRESSIONS) --error-exitcode=1 $(VALGRIND_FLAGS)\n\ndefine valgrind_tool_rule\ncheck-valgrind-$(1)-local:\nifeq ($$(VALGRIND_ENABLED)-$$(ENABLE_VALGRIND_$(1)),yes-yes)\nifneq ($$(TESTS),)\n\t$$(valgrind_v_use)$$(MAKE) check-TESTS \\\n\t\tTESTS_ENVIRONMENT=\"$$(VALGRIND_TESTS_ENVIRONMENT)\" \\\n\t\tLOG_COMPILER=\"$$(VALGRIND_LOG_COMPILER)\" \\\n\t\tLOG_FLAGS=\"$$(valgrind_$(1)_flags)\" \\\n\t\tTEST_SUITE_LOG=test-suite-$(1).log\nendif\nelse ifeq ($$(VALGRIND_ENABLED),yes)\n\t@echo \"Need to reconfigure with --enable-valgrind-$(1)\"\nelse\n\t@echo \"Need to reconfigure with --enable-valgrind\"\nendif\nendef\n\n$(foreach tool,$(valgrind_tools),$(eval $(call valgrind_tool_rule,$(tool))))\n\nA''M_DISTCHECK_CONFIGURE_FLAGS ?=\nA''M_DISTCHECK_CONFIGURE_FLAGS += --disable-valgrind\n\nMOSTLYCLEANFILES ?=\nMOSTLYCLEANFILES += $(valgrind_log_files)\n\n.PHONY: check-valgrind $(addprefix check-valgrind-,$(valgrind_tools))\n']\n\n\tAC_SUBST([VALGRIND_CHECK_RULES])\n\tm4_ifdef([_AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE([VALGRIND_CHECK_RULES])])\n])\n"
  },
  {
    "path": "build-aux/m4/pkg_compat.m4",
    "content": "# pkg.m4 - Macros to locate and use pkg-config.   -*- Autoconf -*-\n# serial 12 (pkg-config-0.29.2)\n\n# Copyright © 2004 Scott James Remnant <scott@netsplit.com>.\n# Copyright © 2012-2015 Dan Nicholson <dbn.lists@gmail.com>\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 2 of the License, or\n# (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful, but\n# WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program; if not, write to the Free Software\n# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA\n# 02111-1307, USA.\n#\n# As a special exception to the GNU General Public License, if you\n# distribute this file as part of a program that contains a\n# configuration script generated by Autoconf, you may include it under\n# the same distribution terms that you use for the rest of that\n# program.\n\n# PKG_PROG_PKG_CONFIG_COMPAT([MIN-VERSION], [ACTION-IF-NOT-FOUND])\n# ---------------------------------------------------------\n# Backported from pkg-config 0.29.2.\n#\n# Search for the pkg-config tool and set the PKG_CONFIG variable to\n# first found in the path. Checks that the version of pkg-config found\n# is at least MIN-VERSION. If MIN-VERSION is not specified, 0.9.0 is\n# used since that's the first version where most current features of\n# pkg-config existed.\n#\n# If pkg-config is not found or older than specified, it will result\n# in an empty PKG_CONFIG variable. To avoid widespread issues with\n# scripts not checking it, ACTION-IF-NOT-FOUND defaults to aborting.\n# You can specify [PKG_CONFIG=false] as an action instead, which would\n# result in pkg-config tests failing, but no bogus error messages.\nAC_DEFUN([PKG_PROG_PKG_CONFIG_COMPAT],\n[m4_pattern_forbid([^_?PKG_[A-Z_]+$])\nm4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$])\nm4_pattern_allow([^PKG_CONFIG_(DISABLE_UNINSTALLED|TOP_BUILD_DIR|DEBUG_SPEW)$])\nAC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility])\nAC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path])\nAC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path])\n\nif test \"x$ac_cv_env_PKG_CONFIG_set\" != \"xset\"; then\n\tAC_PATH_TOOL([PKG_CONFIG], [pkg-config])\nfi\nif test -n \"$PKG_CONFIG\"; then\n\t_pkg_min_version=m4_default([$1], [0.9.0])\n\tAC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version])\n\tif $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then\n\t\tAC_MSG_RESULT([yes])\n\telse\n\t\tAC_MSG_RESULT([no])\n\t\tPKG_CONFIG=\"\"\n\tfi\nfi\nif test -z \"$PKG_CONFIG\"; then\n\tm4_default([$2], [AC_MSG_ERROR([pkg-config not found])])\nfi[]\n])\n\n# PKG_INSTALLDIR_COMPAT([DIRECTORY])\n# -------------------------\n# Backported from pkg-config 0.27.\n#\n# Substitutes the variable pkgconfigdir as the location where a module\n# should install pkg-config .pc files. By default the directory is\n# $libdir/pkgconfig, but the default can be changed by passing\n# DIRECTORY. The user can override through the --with-pkgconfigdir\n# parameter.\nAC_DEFUN([PKG_INSTALLDIR_COMPAT],\n[m4_pushdef([pkg_default], [m4_default([$1], ['${libdir}/pkgconfig'])])\nm4_pushdef([pkg_description],\n    [pkg-config installation directory @<:@]pkg_default[@:>@])\nAC_ARG_WITH([pkgconfigdir],\n    [AS_HELP_STRING([--with-pkgconfigdir], pkg_description)],,\n    [with_pkgconfigdir=]pkg_default)\nAC_SUBST([pkgconfigdir], [$with_pkgconfigdir])\nm4_popdef([pkg_default])\nm4_popdef([pkg_description])\n])\n"
  },
  {
    "path": "build-aux/m4/zw_alignment.m4",
    "content": "dnl Written by Zack Weinberg <zackw at panix.com> in 2017.\ndnl To the extent possible under law, Zack Weinberg has waived all\ndnl copyright and related or neighboring rights to this work.\ndnl\ndnl See https://creativecommons.org/publicdomain/zero/1.0/ for further\ndnl details.\ndnl\ndnl Find out how to query and set data alignment.\ndnl Currently knows about C11's _Alignas and _Alignof,\ndnl and GCC's __attribute__ ((aligned)) and __alignof.\ndnl\ndnl Note: AC_PROG_CC_C11 includes a test for _Alignas and _Alignof,\ndnl but not for <stdalign.h>, which we don't bother using anyway.\ndnl\ndnl Compatibility note: alignas (TYPE) does not work when alignas() is\ndnl defined using __attribute__ ((aligned)).  Use alignas (alignof (TYPE))\ndnl instead.\nAC_DEFUN([zw_C_ALIGNAS],\n  [AC_REQUIRE([AC_PROG_CC])\n   AC_CACHE_CHECK([how to control data alignment], [zw_cv_c_alignas],\n     [AS_IF([test x$ac_prog_cc_stdc = xc11],\n        [zw_cv_c_alignas=_Alignas],\n        [AC_COMPILE_IFELSE(\n           [AC_LANG_PROGRAM([[\n                int __attribute__((__aligned__(8))) global;\n                struct __attribute__((__aligned__(8))) aggregate { int x, y; };\n              ]], [[\n                int __attribute__((__aligned__(8))) local;\n              ]])],\n           [zw_cv_c_alignas=__attribute__],\n           [zw_cv_c_alignas=unknown])\n        ])\n     ])\n   AS_IF([test x$zw_cv_c_alignas = x_Alignas],\n            [zw_c_alignas_expr=\"_Alignas(n)\"],\n         [test x$zw_cv_c_alignas = x__attribute__],\n            [zw_c_alignas_expr=\"__attribute__((__aligned__(n)))\"],\n         [AC_MSG_FAILURE([could not find a way to control data alignment])])\n   AC_DEFINE_UNQUOTED([alignas(n)], [$zw_c_alignas_expr],\n   [Define as a type specifier which sets the alignment of a variable or type\n    to N bytes.  C11 alignas(TYPE) does not need to be supported.])\n])\n\nAC_DEFUN([zw_C_ALIGNOF],\n  [AC_REQUIRE([AC_PROG_CC])\n   AC_CACHE_CHECK([how to query data alignment], [zw_cv_c_alignof],\n     [AS_IF([test x$ac_prog_cc_stdc = xc11],\n        [zw_cv_c_alignof=_Alignof],\n        [AC_COMPILE_IFELSE(\n           [AC_LANG_PROGRAM([[\n                struct agg { int x, y; };\n                extern const char align_int[__alignof__(int)];\n                extern const char align_agg[__alignof__(struct agg)];\n              ]], [[\n                double d;\n                char align_var[__alignof__(d)];\n              ]])],\n           [zw_cv_c_alignof=__alignof__],\n           [zw_cv_c_alignof=unknown])\n        ])\n     ])\n   AS_IF([test x$zw_cv_c_alignof = x_Alignof],\n            [zw_c_alignof_expr=\"_Alignof(thing)\"],\n         [test x$zw_cv_c_alignof = x__alignof__],\n            [zw_c_alignof_expr=\"__alignof__(thing)\"],\n         [AC_MSG_FAILURE([could not find a way to query data alignment])])\n   AC_DEFINE_UNQUOTED([alignof(thing)], [$zw_c_alignof_expr],\n   [Define as an expression which evaluates to the alignment of THING.\n    Must be computed at compile time (an \"integer constant expression\").])\n])\n\nAC_DEFUN([zw_C_MAX_ALIGN_T],\n  [AC_REQUIRE([AC_PROG_CC])\n   AC_REQUIRE([zw_C_ALIGNOF])\n   AC_CACHE_CHECK([for max_align_t in stddef.h], [zw_cv_c_max_align_t],\n     [AC_COMPILE_IFELSE(\n        [AC_LANG_PROGRAM([[\n            #include <stddef.h>\n          ]], [[\n            max_align_t var;\n            return alignof(var);\n          ]])],\n        [zw_cv_c_max_align_t=yes],\n        [zw_cv_c_max_align_t=no])\n     ])\n   AS_IF([test x$zw_cv_c_max_align_t = xyes],\n     [AC_DEFINE([HAVE_MAX_ALIGN_T], 1,\n        [Define if stddef.h provides max_align_t.])\n   ])\n])\n"
  },
  {
    "path": "build-aux/m4/zw_automodern.m4",
    "content": "dnl Copyright 2017 Zack Weinberg <zackw at panix.com>.\ndnl Partially based on Autoconf, copyright 1992-2017 Free Software Foundation.\ndnl\ndnl This program is free software; you can redistribute it and/or\ndnl modify it under the terms of the GNU General Public License as\ndnl published by the Free Software Foundation, either version 3 of the\ndnl License, or (at your option) any later version.\ndnl\ndnl This program is distributed in the hope that it will be useful,\ndnl but WITHOUT ANY WARRANTY; without even the implied warranty of\ndnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\ndnl GNU General Public License for more details.\ndnl\ndnl Under Section 7 of GPL version 3, you are granted additional\ndnl permissions described in the Autoconf Configure Script Exception,\ndnl version 3.0, as published by the Free Software Foundation.\ndnl\ndnl Because only two files in this source tree are released\ndnl under GPLv3 with exceptions, neither the GPLv3 nor the exception are\ndnl distributed with this source tree.  Copies can be retrieved from\ndnl https://www.gnu.org/licenses/\ndnl\ndnl As of this writing (September 2017), Autoconf 2.70 is not yet released.\ndnl Backport some improvements:\ndnl  - switch AC_CHECK_HEADER to compile-only\ndnl  - eliminate unnecessary tests in AC_INCLUDES_DEFAULT\ndnl  - Darwin (OSX) support in AC_USE_SYSTEM_EXTENSIONS\ndnl  - C11 mode by default in AC_PROG_CC, falling back to C99\nAC_PREREQ([2.62])dnl earliest version with working m4_version_prereq\nm4_version_prereq([2.70], [], [\n\n  m4_define([AC_CHECK_HEADER], [_AC_CHECK_HEADER_COMPILE($@)])\n\n  AC_DEFUN_ONCE([_AC_INCLUDES_DEFAULT_REQUIREMENTS],\n[m4_divert_text([DEFAULTS],\n[# Factoring default headers for most tests.\nac_includes_default=\"\\\n#include <stddef.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#ifdef HAVE_SYS_TYPES_H\n# include <sys/types.h>\n#endif\n#ifdef HAVE_SYS_STAT_H\n# include <sys/stat.h>\n#endif\n#ifdef HAVE_STRINGS_H\n# include <strings.h>\n#endif\n#ifdef HAVE_INTTYPES_H\n# include <inttypes.h>\n#endif\n#ifdef HAVE_STDINT_H\n# include <stdint.h>\n#endif\n#ifdef HAVE_UNISTD_H\n# include <unistd.h>\n#endif\"\n])]dnl\n[AC_CHECK_HEADERS(\n  [sys/types.h sys/stat.h strings.h inttypes.h stdint.h unistd.h],,,[/**/])]dnl\ndnl For backward compatibility, provide unconditional AC_DEFINEs of\ndnl HAVE_STDLIB_H, HAVE_STRING_H, and STDC_HEADERS.\n[AC_DEFINE([HAVE_STDLIB_H], [1],\n  [Always define to 1, for backward compatibility.\n   You can assume <stdlib.h> exists.])]dnl\n[AC_DEFINE([HAVE_STRING_H], [1],\n  [Always define to 1, for backward compatibility.\n   You can assume <string.h> exists.])]dnl\n[AC_DEFINE([STDC_HEADERS], [1],\n  [Always define to 1, for backward compatibility.\n   You can assume the C90 standard headers exist.])])\n\n  m4_define([AC_USE_SYSTEM_EXTENSIONS],\n    m4_defn([AC_USE_SYSTEM_EXTENSIONS])[\n    AH_VERBATIM([USE_SYSTEM_EXTENSIONS_270],\n[/* Enable general extensions on OSX. */\n#ifndef _DARWIN_C_SOURCE\n# undef _DARWIN_C_SOURCE\n#endif\n])\n    AC_DEFINE([_DARWIN_C_SOURCE])\n  ])\n\ndnl Prior to 2.70, AC_PROG_CC ends with an unconditional call to\ndnl _AC_PROG_CC_C89.  Use this as an extension hook, replacing it with\ndnl the logic that will be used in 2.70.\nm4_define([_AC_PROG_CC_C89_original], m4_defn([_AC_PROG_CC_C89]))\nm4_define([_AC_PROG_CC_C89], [dnl\ndnl Set ac_prog_cc_stdc to the supported C version.\ndnl Also set the documented variable ac_cv_prog_cc_stdc;\ndnl its name was chosen when it was cached, but it is no longer cached.\n_AC_PROG_CC_C11([ac_prog_cc_stdc=c11\n                 ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11],\n  [_AC_PROG_CC_C99([ac_prog_cc_stdc=c99\n                    ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99],\n     [_AC_PROG_CC_C89_original([ac_prog_cc_stdc=c89\n                       ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89],\n                      [ac_prog_cc_stdc=no\n                       ac_cv_prog_cc_stdc=no])])])\n])\ndnl Must also supply the definition of _AC_PROG_CC_C11.\ndnl This is also taken verbatim from Autoconf trunk.\ndnl I regret the bulk.\nAC_DEFUN([_AC_PROG_CC_C11],\n[_AC_C_STD_TRY([c11],\n[[#include <stdarg.h>\n#include <stdbool.h>\n#include <stddef.h>\n#include <stdlib.h>\n#include <wchar.h>\n#include <stdio.h>\n\n// Check varargs macros.  These examples are taken from C99 6.10.3.5.\n#define debug(...) fprintf (stderr, __VA_ARGS__)\n#define showlist(...) puts (#__VA_ARGS__)\n#define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__))\nstatic void\ntest_varargs_macros (void)\n{\n  int x = 1234;\n  int y = 5678;\n  debug (\"Flag\");\n  debug (\"X = %d\\n\", x);\n  showlist (The first, second, and third items.);\n  report (x>y, \"x is %d but y is %d\", x, y);\n}\n\n// Check long long types.\n#define BIG64 18446744073709551615ull\n#define BIG32 4294967295ul\n#define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0)\n#if !BIG_OK\n  your preprocessor is broken;\n#endif\n#if BIG_OK\n#else\n  your preprocessor is broken;\n#endif\nstatic long long int bignum = -9223372036854775807LL;\nstatic unsigned long long int ubignum = BIG64;\n\nstruct incomplete_array\n{\n  int datasize;\n  double data[];\n};\n\nstruct named_init {\n  int number;\n  const wchar_t *name;\n  double average;\n};\n\ntypedef const char *ccp;\n\nstatic inline int\ntest_restrict (ccp restrict text)\n{\n  // See if C++-style comments work.\n  // Iterate through items via the restricted pointer.\n  // Also check for declarations in for loops.\n  for (unsigned int i = 0; *(text+i) != '\\0'; ++i)\n    continue;\n  return 0;\n}\n\n// Check varargs and va_copy.\nstatic bool\ntest_varargs (const char *format, ...)\n{\n  va_list args;\n  va_start (args, format);\n  va_list args_copy;\n  va_copy (args_copy, args);\n\n  const char *str = \"\";\n  int number = 0;\n  float fnumber = 0;\n\n  while (*format)\n    {\n      switch (*format++)\n        {\n        case 's': // string\n          str = va_arg (args_copy, const char *);\n          break;\n        case 'd': // int\n          number = va_arg (args_copy, int);\n          break;\n        case 'f': // float\n          fnumber = va_arg (args_copy, double);\n          break;\n        default:\n          break;\n        }\n    }\n  va_end (args_copy);\n  va_end (args);\n\n  return *str && number && fnumber;\n}\n\n// Check _Alignas.\nchar _Alignas (double) aligned_as_double;\nchar _Alignas (0) no_special_alignment;\nextern char aligned_as_int;\nchar _Alignas (0) _Alignas (int) aligned_as_int;\n\n// Check _Alignof.\nenum\n{\n  int_alignment = _Alignof (int),\n  int_array_alignment = _Alignof (int[100]),\n  char_alignment = _Alignof (char)\n};\n_Static_assert (0 < -_Alignof (int), \"_Alignof is signed\");\n\n// Check _Noreturn.\nint _Noreturn does_not_return (void) { for (;;) continue; }\n\n// Check _Static_assert.\nstruct test_static_assert\n{\n  int x;\n  _Static_assert (sizeof (int) <= sizeof (long int),\n                  \"_Static_assert does not work in struct\");\n  long int y;\n};\n\n// Check UTF-8 literals.\n#define u8 syntax error!\nchar const utf8_literal[] = u8\"happens to be ASCII\" \"another string\";\n\n// Check duplicate typedefs.\ntypedef long *long_ptr;\ntypedef long int *long_ptr;\ntypedef long_ptr long_ptr;\n\n// Anonymous structures and unions -- taken from C11 6.7.2.1 Example 1.\nstruct anonymous\n{\n  union {\n    struct { int i; int j; };\n    struct { int k; long int l; } w;\n  };\n  int m;\n} v1;\n]],\n[[\n  // Check bool.\n  _Bool success = false;\n\n  // Check restrict.\n  if (test_restrict (\"String literal\") == 0)\n    success = true;\n  char *restrict newvar = \"Another string\";\n\n  // Check varargs.\n  success &= test_varargs (\"s, d' f .\", \"string\", 65, 34.234);\n  test_varargs_macros ();\n\n  // Check flexible array members.\n  struct incomplete_array *ia =\n    malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10));\n  ia->datasize = 10;\n  for (int i = 0; i < ia->datasize; ++i)\n    ia->data[i] = i * 1.234;\n\n  // Check named initializers.\n  struct named_init ni = {\n    .number = 34,\n    .name = L\"Test wide string\",\n    .average = 543.34343,\n  };\n\n  ni.number = 58;\n\n  int dynamic_array[ni.number];\n  dynamic_array[ni.number - 1] = 543;\n\n  // work around unused variable warnings\n  return (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == 'x'\n          || dynamic_array[ni.number - 1] != 543);\n\n  v1.i = 2;\n  v1.w.k = 5;\n  _Static_assert ((offsetof (struct anonymous, i)\n                   == offsetof (struct anonymous, w.k)),\n                  \"Anonymous union alignment botch\");\n]],\ndnl Try\ndnl GCC         -std=gnu11 (unused restrictive mode: -std=c11)\ndnl with extended modes being tried first.\ndnl\ndnl Do not try -qlanglvl=extc1x, because IBM XL C V12.1 (the latest version as\ndnl of September 2012) does not pass the C11 test.  For now, try extc1x when\ndnl compiling the C99 test instead, since it enables _Static_assert and\ndnl _Noreturn, which is a win.  If -qlanglvl=extc11 or -qlanglvl=extc1x passes\ndnl the C11 test in some future version of IBM XL C, we'll add it here,\ndnl preferably extc11.\n[[-std=gnu11]], [$1], [$2])[]dnl\n])# _AC_PROG_CC_C11\n\n\n])dnl m4_version_prereq([2.70], ...)\n"
  },
  {
    "path": "build-aux/m4/zw_detect_asan.m4",
    "content": "dnl Written by Zack Weinberg <zackw at panix.com> in 2021.\ndnl To the extent possible under law, Zack Weinberg has waived all\ndnl copyright and related or neighboring rights to this work.\ndnl\ndnl See https://creativecommons.org/publicdomain/zero/1.0/ for further\ndnl details.\ndnl\ndnl Detect whether the active compiler compiles programs with ASan\ndnl instrumentation.  If so, execute ACTIONS-IF-TRUE, otherwise\ndnl ACTIONS-IF-FALSE.\ndnl\ndnl Implementation note: with clang one can use __has_feature(address_sanitizer)\ndnl to detect ASan, but gcc does not support that.  Instead we look\ndnl for ASan symbols in the linked executable.  This requires a helper\ndnl macro shipped with libtool.\ndnl\ndnl zw_ASAN_IFELSE(actions-if-true[, actions-if-false])\nAC_DEFUN([zw_ASAN_IFELSE],\n  [AC_REQUIRE([AC_PROG_EGREP])]dnl\n  [AC_REQUIRE([LT_PATH_NM])]dnl\n  [AC_LINK_IFELSE([AC_LANG_PROGRAM([[]], [[]])],\n    [AS_IF([$NM conftest$EXEEXT | $EGREP _asan_ > /dev/null 2>&1],\n           [$1], [$2])],\n    [AC_MSG_ERROR([cannot link a trivial test program])])])\n"
  },
  {
    "path": "build-aux/m4/zw_endianness.m4",
    "content": "dnl Written by Zack Weinberg <zackw at panix.com> in 2018.\ndnl To the extent possible under law, Zack Weinberg has waived all\ndnl copyright and related or neighboring rights to this work.\ndnl\ndnl See https://creativecommons.org/publicdomain/zero/1.0/ for further\ndnl details.\ndnl\ndnl This macro is like AC_C_BIGENDIAN, but it doesn't try to determine\ndnl a final value at configure time.  Instead, it probes for a set of\ndnl headers and compile-time macros that may or may not be available,\ndnl and uses them to guide preprocessor logic that makes the final\ndnl determination.  This works better with MacOS \"universal binaries\",\ndnl which may involve compiling the program twice under opposite\ndnl endiannesses; no fixed byte-order macro is correct in that case,\ndnl but the compiler's built-ins will be.  This approach is also\ndnl friendlier to cross-compilation.\ndnl\ndnl This is the preprocessor logic that should be put in an appropriate\ndnl location, after including config.h:\ndnl\ndnl #include <limits.h>\ndnl #ifdef HAVE_ENDIAN_H\ndnl #include <endian.h>\ndnl #endif\ndnl #ifdef HAVE_SYS_ENDIAN_H\ndnl #include <sys/endian.h>\ndnl #endif\ndnl #ifdef HAVE_SYS_PARAM_H\ndnl #include <sys/param.h>\ndnl #endif\ndnl\ndnl #if ENDIANNESS_IS_BIG\ndnl # define ENDIAN_BIG\ndnl #elif ENDIANNESS_IS_LITTLE\ndnl # define ENDIAN_LITTLE\ndnl #elif ENDIANNESS_IS_PDP\ndnl # define ENDIAN_PDP\ndnl #else\ndnl # error \"Unable to determine byte order\"\ndnl #endif\ndnl ------------------------------------------------\n\ndnl There's no good way to implement this macro as a _shell_ loop, but we\ndnl can reasonably implement it as an _m4_ loop that expands to a sequence\ndnl of conditionals.  Actually two sequences of conditionals, one inside\ndnl AC_CACHE_CHECK and one outside.\n\nm4_define([zw_C_ENDIANNESS_options], [\n[ [BYTE_ORDER and xxx_ENDIAN],\n  [defined BYTE_ORDER && defined BIG_ENDIAN && defined LITTLE_ENDIAN && BIG_ENDIAN != LITTLE_ENDIAN],\n  [BYTE_ORDER == BIG_ENDIAN],\n  [BYTE_ORDER == LITTLE_ENDIAN],\n  [BYTE_ORDER == PDP_ENDIAN],\n],\n[ [__BYTE_ORDER and __xxx_ENDIAN],\n  [defined __BYTE_ORDER && defined __BIG_ENDIAN && defined __LITTLE_ENDIAN && __BIG_ENDIAN != __LITTLE_ENDIAN],\n  [__BYTE_ORDER == __BIG_ENDIAN],\n  [__BYTE_ORDER == __LITTLE_ENDIAN],\n  [__BYTE_ORDER == __PDP_ENDIAN],\n],\n[ [__BYTE_ORDER__ and __xxx_ENDIAN__],\n  [defined __BYTE_ORDER__ && defined __BIG_ENDIAN__ && defined __LITTLE_ENDIAN__ && __BIG_ENDIAN__ != __LITTLE_ENDIAN__],\n  [__BYTE_ORDER__ == __BIG_ENDIAN__],\n  [__BYTE_ORDER__ == __LITTLE_ENDIAN__],\n  [__BYTE_ORDER__ == __PDP_ENDIAN__],\n],\n[ [__BYTE_ORDER__ and __ORDER_xxx_ENDIAN__],\n  [defined __BYTE_ORDER__ && defined __ORDER_BIG_ENDIAN__ && defined __ORDER_LITTLE_ENDIAN__ && __ORDER_BIG_ENDIAN__ != __ORDER_LITTLE_ENDIAN__],\n  [__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__],\n  [__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__],\n  [__BYTE_ORDER__ == __ORDER_PDP_ENDIAN__],\n],\n[ [_BIG_ENDIAN and _LITTLE_ENDIAN],\n  [(defined _BIG_ENDIAN) != (defined _LITTLE_ENDIAN)],\n  [defined _BIG_ENDIAN], [defined _LITTLE_ENDIAN], [0],\n],\n[ [__BIG_ENDIAN__ and __LITTLE_ENDIAN__],\n  [(defined __BIG_ENDIAN__) != (defined __LITTLE_ENDIAN__)],\n  [defined __BIG_ENDIAN__], [defined __LITTLE_ENDIAN__], [0],\n],\n[ [__ARMEB__ and __ARMEL__],\n  [(defined __ARMEB__) != (defined __ARMEL__)],\n  [defined __ARMEB__], [defined __ARMEL__], [0],\n],\n[ [__THUMBEB__ and __THUMBEL__],\n  [(defined __THUMBEB__) != (defined __THUMBEL__)],\n  [defined __THUMBEB__], [defined __THUMBEL__], [0],\n],\n[ [__AARCH64EB__ and __AARCH64EL__],\n  [(defined __AARCH64EB__) != (defined __AARCH64EL__)],\n  [defined __AARCH64EB__], [defined __AARCH64EL__], [0],\n],\n[ [__MIPSEB__ and __MIPSEL__],\n  [(defined __MIPSEB__) != (defined __MIPSEL__)],\n  [defined __MIPSEB__], [defined __MIPSEL__], [0],\n],\n[ [__MIPSEB and __MIPSEL],\n  [(defined __MIPSEB) != (defined __MIPSEL)],\n  [defined __MIPSEB], [defined __MIPSEL], [0],\n],\n[ [_MIPSEB and _MIPSEL],\n  [(defined _MIPSEB) != (defined _MIPSEL)],\n  [defined _MIPSEB], [defined _MIPSEL], [0],\n]\n])\n\nm4_define([zw_C_ENDIANNESS_test_one], [\nif test \"$[]ac_cv_c_byte_order_macros\" = unknown; then\n  AC_PREPROC_IFELSE([AC_LANG_PROGRAM([[\n#include <limits.h>\n#ifdef HAVE_ENDIAN_H\n#include <endian.h>\n#endif\n#ifdef HAVE_SYS_ENDIAN_H\n#include <sys/endian.h>\n#endif\n#ifdef HAVE_SYS_PARAM_H\n#include <sys/param.h>\n#endif\n#if !($2)\n#error fail\n#endif\n]])],\n  [ac_cv_c_byte_order_macros=\"$1\"])\nfi])\n\nm4_define([zw_C_ENDIANNESS_case_one],\n  [[\"$1\"], [\n  zw_C_ENDIANNESS_IS_BIG=\"($3)\"\n  zw_C_ENDIANNESS_IS_LIT=\"($4)\"\n  zw_C_ENDIANNESS_IS_PDP=\"($5)\"]])\n\nAC_DEFUN([zw_C_ENDIANNESS], [\nAC_REQUIRE([AC_PROG_CC])\nAC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])\nAC_CHECK_HEADERS_ONCE([endian.h sys/endian.h sys/param.h])\nAC_CACHE_CHECK([for byte order macros],\n  [ac_cv_c_byte_order_macros], [\n  ac_cv_c_byte_order_macros=unknown\n  m4_map([zw_C_ENDIANNESS_test_one], [zw_C_ENDIANNESS_options])])\n\nAS_CASE([$ac_cv_c_byte_order_macros],\n        m4_map_sep([zw_C_ENDIANNESS_case_one], [,], [zw_C_ENDIANNESS_options]),\n        [AC_MSG_ERROR([unable to determine byte order at compile time])])\n\nAC_DEFINE_UNQUOTED([ENDIANNESS_IS_BIG], [$zw_C_ENDIANNESS_IS_BIG],\n  [Define as an @%:@if expression that is true when compiling for a big-endian CPU.])\nAC_DEFINE_UNQUOTED([ENDIANNESS_IS_LITTLE], [$zw_C_ENDIANNESS_IS_LIT],\n  [Define as an @%:@if expression that is true when compiling for a little-endian CPU.])\nAC_DEFINE_UNQUOTED([ENDIANNESS_IS_PDP], [$zw_C_ENDIANNESS_IS_PDP],\n  [Define as an @%:@if expression that is true when compiling for a PDP-endian CPU.])\n])\n"
  },
  {
    "path": "build-aux/m4/zw_ld_wrap.m4",
    "content": "dnl Written by Zack Weinberg <zackw at panix.com> in 2018.\ndnl To the extent possible under law, Zack Weinberg has waived all\ndnl copyright and related or neighboring rights to this work.\ndnl\ndnl See https://creativecommons.org/publicdomain/zero/1.0/ for further\ndnl details.\ndnl\ndnl Find out whether ld --wrap is supported.\nAC_DEFUN([zw_PROG_LD_WRAP],\n  [AC_REQUIRE([AC_PROG_CC])\n   AC_CACHE_CHECK([for ld --wrap], [zw_cv_prog_ld_wrap],\n     [save_LDFLAGS=\"$LDFLAGS\"\n      save_LIBS=\"$LIBS\"\n      LDFLAGS=\"\"\n      LIBS=\"\"\n      AC_COMPILE_IFELSE(\n        [AC_LANG_SOURCE([[\n            extern void bar(void);\n            void foo(void) { bar(); }\n        ]])],\n        [mv conftest.$OBJEXT conftest2.$OBJEXT\n         LDFLAGS=\"-Wl,--wrap,bar\"\n         LIBS=\"conftest2.$OBJEXT\"\n         AC_LINK_IFELSE(\n           [AC_LANG_PROGRAM([[\n               extern void foo(void);\n               void __wrap_bar(void) {}\n            ]], [[\n               foo();\n            ]])],\n           [zw_cv_prog_ld_wrap=yes],\n           [zw_cv_prog_ld_wrap=no])\n         rm -f conftest2.$OBJEXT\n        ],\n        [zw_cv_prog_ld_wrap=no])\n      LDFLAGS=\"$save_LDFLAGS\"\n      LIBS=\"$save_LIBS\"])\n   if test x$zw_cv_prog_ld_wrap = xyes; then\n      have_ld_wrap=yes\n      AC_DEFINE([HAVE_LD_WRAP], 1,\n                [Define to 1 if -Wl,--wrap,SYMBOL can be used to intercept\n                 calls to SYMBOL at link time.])\n   else\n      have_ld_wrap=no\n   fi\n   AM_CONDITIONAL([HAVE_LD_WRAP], [test $have_ld_wrap = yes])\n])\n"
  },
  {
    "path": "build-aux/m4/zw_prog_perl.m4",
    "content": "# zw_prog_perl.m4  -*- autoconf -*-\n# serial 1\n#\n# inspired by, but shares no code with, ax_prog_perl_version.m4 by\n# Franceso Salvestrini\n#\n# SYNOPSIS\n#\n#   zw_PROG_PERL([VERSION], [ACTION-IF-TRUE],\n#                [ACTION-IF-FALSE = (error out)])\n#\n# DESCRIPTION\n#\n#   Locate a Perl interpreter, and then verify that its version number\n#   is greater than or equal to VERSION.  If it is, set output variable\n#   PERL to the absolute path of that interpreter, and execute\n#   ACTION-IF-TRUE, if present.  Otherwise, execute ACTION-IF-FALSE.\n#   If ACTION-IF-FALSE is not present it defaults to issuing an error\n#   and stopping the configuration process.\n#\n# LICENSE\n#\n#   Copyright (c) 2020 Zack Weinberg <zackw@panix.com>\n#\n#   Copying and distribution of this file, with or without modification, are\n#   permitted in any medium without royalty provided the copyright notice\n#   and this notice are preserved. This file is offered as-is, without any\n#   warranty.\n\n#serial 13\n\nAC_DEFUN([zw_PROG_PERL],\n[AC_PATH_PROG([PERL], [perl])\nAC_MSG_CHECKING([whether $PERL is version $1 or later])\n_AS_ECHO_LOG([$PERL -e 'use v$1;'])\nAS_IF([\"$PERL\" -e 'use v$1;' >&AS_MESSAGE_LOG_FD 2>&1],\n  [AC_MSG_RESULT([yes])m4_ifnblank([$2], [\n  $2])],\n  [AC_MSG_RESULT([no])\nm4_default([$3], [AC_MSG_ERROR([Perl version $1 or later is required])])])])\n"
  },
  {
    "path": "build-aux/m4/zw_simple_warnings.m4",
    "content": "# serial 1\ndnl Copyright 2017 Zack Weinberg <zackw at panix.com>.\ndnl Partially based on Autoconf, copyright 1992-2017 Free Software Foundation.\ndnl\ndnl This program is free software; you can redistribute it and/or\ndnl modify it under the terms of the GNU General Public License as\ndnl published by the Free Software Foundation, either version 3 of the\ndnl License, or (at your option) any later version.\ndnl\ndnl This program is distributed in the hope that it will be useful,\ndnl but WITHOUT ANY WARRANTY; without even the implied warranty of\ndnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\ndnl GNU General Public License for more details.\ndnl\ndnl Under Section 7 of GPL version 3, you are granted additional\ndnl permissions described in the Autoconf Configure Script Exception,\ndnl version 3.0, as published by the Free Software Foundation.\ndnl\ndnl Because only two files in this source tree are released\ndnl under GPLv3 with exceptions, neither the GPLv3 nor the exception are\ndnl distributed with this source tree.  Copies can be retrieved from\ndnl https://www.gnu.org/licenses/\ndnl\ndnl Autoconf core has no good way of enabling compiler warnings.\ndnl This is a cut-down version of the elaborate thing in the extras\ndnl archive, which we do not need nearly all of.\ndnl\ndnl Partly based on:\ndnl https://www.gnu.org/software/autoconf-archive/ax_compiler_flags_cflags.html\n\nAC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_IF\n\nAC_DEFUN([zw_SIMPLE_ENABLE_WARNINGS],\n[\nAC_ARG_ENABLE(\n   [werror],\n   AS_HELP_STRING(\n        [--disable-werror],\n        [do not treat all warnings as errors]\n    ),\n    [case \"${enableval}\" in\n        yes) warnings_are_errors=true ;;\n         no) warnings_are_errors=false ;;\n          *) AC_MSG_ERROR([bad value ${enableval} for --enable-werror]) ;;\n     esac],\n     [warnings_are_errors=true]\n)\n\n    # Always pass -Werror=unknown-warning-option to get Clang to fail\n    # on bad flags, otherwise they are always appended to the\n    # warn_cflags variable, and Clang warns on them for every\n    # compilation unit.  If this is passed to GCC, it will explode, so\n    # the flag must be enabled conditionally.\n    AX_CHECK_COMPILE_FLAG([-Werror=unknown-warning-option],[\n        ax_compiler_flags_test=\"-Werror=unknown-warning-option\"\n    ],[\n        ax_compiler_flags_test=\"\"\n    ])\n\n    # Don't enable -pedantic if we don't have C11, or we may get junk\n    # warnings about static_assert.\n    ax_candidate_warnings=\"dnl\n        -Wall dnl\n        -Wextra dnl\n        -Walloc-zero dnl\n        -Walloca dnl\n        -Wbad-function-cast dnl\n        -Wcast-align dnl\n        -Wcast-qual dnl\n        -Wconversion dnl\n        -Wformat=2 dnl\n        -Wformat-overflow=2 dnl\n        -Wformat-signedness dnl\n        -Wformat-truncation=1 dnl\n        -Wlogical-op dnl\n        -Wmissing-declarations dnl\n        -Wmissing-prototypes dnl\n        -Wnested-externs dnl\n        -Wnull-dereference dnl\n        -Wold-style-definition dnl\n        -Wpointer-arith dnl\n        -Wrestrict dnl\n        -Wshadow dnl\n        -Wstrict-overflow=2 dnl\n        -Wstrict-prototypes dnl\n        -Wundef dnl\n        -Wvla dnl\n        -Wwrite-strings dnl\n    \"\n    if test x$ac_prog_cc_stdc = xc11; then\n        ax_candidate_warnings=\"$ax_candidate_warnings -Wpedantic\"\n    fi\n    if test x$warnings_are_errors = xtrue; then\n        ax_candidate_warnings=\"$ax_candidate_warnings -Werror\"\n    fi\n\n    # If we are building for OSX, turn -Wdeprecated-declarations off.\n    # Apple is a little too trigger-happy with deprecations.\n    case \"$host_os\" in\n      (*darwin*)\n        ax_candidate_warnings=\"$ax_candidate_warnings -Wno-deprecated-declarations\"\n      ;;\n    esac\n\n    AX_APPEND_COMPILE_FLAGS(\n        [$ax_candidate_warnings], [WARN_CFLAGS],\n        [$ax_compiler_flags_test])\n\n    AC_SUBST(WARN_CFLAGS)\n\n   if test $cross_compiling = yes; then\n       # Repeat the above logic for the build compiler.\n\n       save_cross_compiling=$cross_compiling\n       save_ac_tool_prefix=$ac_tool_prefix\n       save_CC=\"$CC\"\n       save_CFLAGS=\"$CFLAGS\"\n       save_CPPFLAGS=\"$CPPFLAGS\"\n       save_LDFLAGS=\"$LDFLAGS\"\n\n       cross_compiling=no\n       ac_tool_prefix=\n       CC=\"$CC_FOR_BUILD\"\n       CFLAGS=\"$CFLAGS_FOR_BUILD\"\n       CPPFLAGS=\"$CPPFLAGS_FOR_BUILD\"\n       LDFLAGS=\"$LDFLAGS_FOR_BUILD\"\n\n       pushdef([_AC_LANG_ABBREV],[build_c])\n\n       AX_CHECK_COMPILE_FLAG([-Werror=unknown-warning-option],[\n           ax_compiler_flags_test=\"-Werror=unknown-warning-option\"\n       ],[\n           ax_compiler_flags_test=\"\"\n       ])\n       AX_APPEND_COMPILE_FLAGS(\n           [$ax_candidate_warnings], [WARN_CFLAGS_FOR_BUILD],\n           [$ax_compiler_flags_test])\n\n       popdef([_AC_LANG_ABBREV])\n\n       AC_SUBST(WARN_CFLAGS_FOR_BUILD)\n\n       cross_compiling=$save_cross_compiling\n       ac_tool_prefix=$save_ac_tool_prefix\n       CC=\"$save_CC\"\n       CFLAGS=\"$save_CFLAGS\"\n       CPPFLAGS=\"$save_CPPFLAGS\"\n       LDFLAGS=\"$save_LDFLAGS\"\n    fi # cross_compiling\n])\n"
  },
  {
    "path": "build-aux/m4/zw_static_assert.m4",
    "content": "dnl Written by Zack Weinberg <zackw at panix.com> in 2017.\ndnl To the extent possible under law, Zack Weinberg has waived all\ndnl copyright and related or neighboring rights to this work.\ndnl\ndnl See https://creativecommons.org/publicdomain/zero/1.0/ for further\ndnl details.\ndnl\ndnl Check for static_assert in <assert.h>; failing that, check for intrinsic\ndnl support for C11 _Static_assert.\ndnl assert.h itself is in C89 and does not need to be probed for;\ndnl moreover, AC_PROG_CC's check for C11 includes _Static_assert (but not\ndnl static_assert).\ndnl Some logic borrowed from gnulib's assert_h.m4.\ndnl 2*2 != 7 is tested in honor of Stanisław Lem.\nAC_DEFUN([zw_C_STATIC_ASSERT],\n  [AC_REQUIRE([AC_PROG_CC])\n   AC_CACHE_CHECK([for static_assert in assert.h],\n     [zw_cv_c_assert_h_static_assert],\n     [AC_COMPILE_IFELSE(\n        [AC_LANG_PROGRAM([[\n           #undef NDEBUG\n           #include <assert.h>\n           static_assert(2 + 2 == 4, \"arithmetic does not work\");\n        ]], [[\n           static_assert(sizeof (char) == 1, \"sizeof does not work\");\n        ]])],\n        [static_assert_true=yes],\n        [static_assert_true=no])\n      AC_COMPILE_IFELSE(\n        [AC_LANG_PROGRAM([[\n           #undef NDEBUG\n           #include <assert.h>\n           static_assert(2 * 2 == 7, \"this assertion should fail\");\n        ]])],\n        [static_assert_false=no],\n        [static_assert_false=yes])\n      AS_IF([test $static_assert_false$static_assert_true = yesyes],\n        [zw_cv_c_assert_h_static_assert=yes],\n        [zw_cv_c_assert_h_static_assert=no])])\n   AS_IF([test $zw_cv_c_assert_h_static_assert = yes],\n     [AC_DEFINE([HAVE_STATIC_ASSERT_IN_ASSERT_H], 1,\n        [Define if <assert.h> defines static_assert.])],\n     [AC_CACHE_CHECK([for _Static_assert],\n        [zw_cv_c__Static_assert],\n        [AS_IF([test x$ac_prog_cc_stdc = xc11],\n           [zw_cv_c__Static_assert=yes],\n           [AC_COMPILE_IFELSE(\n              [AC_LANG_PROGRAM([[\n                 _Static_assert(2 + 2 == 4, \"arithmetic does not work\");\n              ]], [[\n                 _Static_assert(sizeof (char) == 1, \"sizeof does not work\");\n              ]])],\n              [_Static_assert_true=yes],\n              [_Static_assert_true=no])\n            AC_COMPILE_IFELSE(\n              [AC_LANG_PROGRAM([[\n                 _Static_assert(2 * 2 == 7, \"this assertion should fail\");\n              ]])],\n              [_Static_assert_false=no],\n              [_Static_assert_false=yes])\n            AS_IF([test $static_assert_false$static_assert_true = yesyes],\n              [zw_cv_c__Static_assert=yes],\n              [zw_cv_c__Static_assert=no])])])\n      AS_IF([test $zw_cv_c__Static_assert = yes],\n        [AC_DEFINE([HAVE__STATIC_ASSERT], 1,\n           [Define if the compiler supports the _Static_assert intrinsic.])])\n   ])\n])\n"
  },
  {
    "path": "build-aux/scripts/BuildCommon.pm",
    "content": "# Written by Zack Weinberg <zackw at panix.com> in 2017 and 2020.\n# To the extent possible under law, Zack Weinberg has waived all\n# copyright and related or neighboring rights to this work.\n#\n# See https://creativecommons.org/publicdomain/zero/1.0/ for further\n# details.\n\npackage BuildCommon;\n\nuse v5.14;    # implicit use strict, use feature ':5.14'\nuse warnings FATAL => 'all';\nuse utf8;\nuse open qw(:utf8);\nno  if $] >= 5.022, warnings => 'experimental::re_strict';\nuse if $] >= 5.022, re       => 'strict';\n\nuse Cwd qw(realpath);\nuse File::Spec::Functions qw(\n    catfile\n    catpath\n    file_name_is_absolute\n    path\n    splitpath\n);\nuse FindBin ();\nuse POSIX   ();\n\nour @EXPORT_OK;\nuse Exporter qw(import);\n\nBEGIN {\n    @EXPORT_OK = qw(\n        enabled_set\n        ensure_C_locale\n        error\n        parse_hashes_conf\n        parse_version_map_in\n        popen\n        sh_split\n        sh_quote\n        subprocess_error\n        which\n    );\n}\n\n#\n# Utilities for dealing with subprocesses.\n#\n\n# Diagnostics: report some kind of catastrophic internal error.\n# Exit code 99 tells the Automake test driver to mark a test as\n# 'errored' rather than 'failed'.\nsub error {    ## no critic (Subroutines::RequireArgUnpacking)\n    my $msg = join q{ }, @_;\n    print {*STDERR} $FindBin::Script, ': ERROR: ', $msg, \"\\n\";\n    exit 99;\n}\n\n# Like 'error', but the problem was with a subprocess, detected upon\n# trying to start the program named as @_.\nsub invocation_error {    ## no critic (Subroutines::RequireArgUnpacking)\n    my $err = \"$!\";\n    my $cmd = join q{ }, @_;\n    error(\"failed to invoke $cmd: $err\");\n}\n\n# Like 'error', but the problem was with a subprocess, detected upon\n# termination of the program named as @_; interpret both $! and $?\n# appropriately.\nsub subprocess_error {    ## no critic (Subroutines::RequireArgUnpacking)\n    my $syserr = $!;\n    my $status = $?;\n    my $cmd    = join q{ }, @_;\n    if ($syserr) {\n        error(\"system error with pipe to $cmd: $syserr\");\n\n    } elsif ($status == 0) {\n        return;\n\n    } elsif (($status & 0xFF) == 0) {\n        # we wouldn't be here if the exit status was zero\n        error(\"$cmd: exit \" . ($status >> 8));\n\n    } else {\n        my $sig = ($status & 0x7F);\n        # Neither Perl core nor the POSIX module exposes strsignal.\n        # This is the least terrible kludge I can presently find;\n        # it decodes the numbers to their <signal.h> constant names\n        # (e.g. \"SIGKILL\" instead of \"Killed\" for signal 9).\n        # Linear search through POSIX's hundreds of symbols is\n        # acceptable because this function terminates the process,\n        # so it can only ever be called once per run.\n        my $signame;\n        while (my ($name, $glob) = each %{'POSIX::'}) {\n            if ($name =~ /^SIG(?!_|RT)/ && (${$glob} // -1) == $sig) {\n                $signame = $name;\n                last;\n            }\n        }\n        $signame //= \"signal $sig\";\n        error(\"$cmd: killed by $signame\");\n    }\n}\n\n# Split a string into words, exactly the way the Bourne shell would do\n# it, with the default setting of IFS, when the string is the result\n# of a variable expansion.  If any of the resulting words would be\n# changed by filename expansion, throw an exception, otherwise return\n# a list of the words.\n#\n# Note: the word splitting process does *not* look for nested\n# quotation, substitutions, or operators.  For instance, if a\n# shell variable was set with\n#    var='\"ab cd\"'\n# then './a.out $var' would pass two arguments to a.out:\n# '\"ab' and 'cd\"'.\nsub sh_split {\n    my @words = split /[ \\t\\n]+/, shift;\n    for my $w (@words) {\n        die \"sh_split: '$w' could be changed by filename expansion\"\n            if $w =~ / (?<! \\\\) [\\[?*] /ax;\n    }\n    return @words;\n}\n\n# Quote a string, or list of strings, so that they will pass\n# unmolested through the shell.  Avoids adding quotation whenever\n# possible.  Algorithm copied from Python's shlex.quote.\nsub sh_quote {    ## no critic (Subroutines::RequireArgUnpacking)\n    my @quoted;\n    for my $w (@_) {\n        if ($w =~ m{[^\\w@%+=:,./-]}a) {\n            my $q = $w;\n            $q =~ s/'/'\\\\''/g;\n            $q =~ s/^/'/;\n            $q =~ s/$/'/;\n            push @quoted, $q;\n        } else {\n            push @quoted, $w;\n        }\n    }\n    return wantarray ? @quoted : $quoted[0];\n}\n\n# Emit a logging message for the execution of a subprocess whose\n# argument vector is @_.\nsub log_execution {    ## no critic (Subroutines::RequireArgUnpacking)\n    print {*STDERR} '+ ', join(q{ }, sh_quote(@_)), \"\\n\";\n    return;\n}\n\n# Run, and log execution of, a subprocess.  @_ should be one of the\n# open modes that creates a pipe, followed by an argument vector.\n# An anonymous filehandle for the pipe is returned.\n# Calls invocation_error() if open() fails.\n# Does *not* call which(); do that yourself if you need it.\nsub popen {\n    my ($mode, @args) = @_;\n    die \"popen: inappropriate mode argument '$mode'\"\n        unless $mode eq '-|' || $mode eq '|-';\n    die 'popen: no command to execute'\n        if scalar(@args) == 0;\n\n    log_execution(@args);\n    open my $fh, $mode, @args\n        or invocation_error($args[0]);\n    return $fh;\n}\n\n# Force use of the C locale for this process and all subprocesses.\n# This is necessary because subprocesses' output may be locale-\n# dependent.  If the C.UTF-8 locale is available, it is used,\n# otherwise the plain C locale.  Note that we do *not*\n# 'use locale' here or anywhere else!\nsub ensure_C_locale {\n    use POSIX qw(setlocale LC_ALL);\n\n    for my $k (keys %ENV) {\n        if ($k eq 'LANG' || $k eq 'LANGUAGE' || $k =~ /^LC_/) {\n            delete $ENV{$k};\n        }\n    }\n    if (defined(setlocale(LC_ALL, 'C.UTF-8'))) {\n        $ENV{LC_ALL} = 'C.UTF-8'; ## no critic (RequireLocalizedPunctuationVars)\n    } elsif (defined(setlocale(LC_ALL, 'C'))) {\n        $ENV{LC_ALL} = 'C';       ## no critic (RequireLocalizedPunctuationVars)\n    } else {\n        error(\"could not set 'C' locale: $!\");\n    }\n    return;\n}\n\n# Clean up $ENV{PATH}, and return the cleaned path as a list.\nsub clean_PATH {\n    state @path;\n    if (!@path) {\n        for my $d (path()) {\n            # Discard all entries that are not absolute paths.\n            next unless file_name_is_absolute($d);\n            # Discard all entries that are not directories, or don't\n            # exist.  (This is not just for tidiness; realpath()\n            # behaves unpredictably if called on a nonexistent\n            # pathname.)\n            next unless -d $d;\n            # Resolve symlinks in all remaining entries.\n            $d = realpath($d);\n            # Discard duplicates.\n            push @path, $d unless grep { $_ eq $d } @path;\n        }\n        error('nothing left after cleaning PATH')\n            unless @path;\n\n        # File::Spec knows internally whether $PATH is colon-separated\n        # or semicolon-separated, but it won't tell us.  Assume it's\n        # colon-separated unless the first element of $PATH has a\n        # colon in it (and is therefore probably a DOS-style absolute\n        # path, with a drive letter).\n        my $newpath;\n        if ($path[0] =~ /:/) {\n            $newpath = join ';', @path;\n        } else {\n            $newpath = join ':', @path;\n        }\n        $ENV{PATH} = $newpath;    ## no critic (RequireLocalizedPunctuationVars)\n    }\n    return @path;\n}\n\n# Locate a program that we need.\n# $_[0] is the name of the program along with any options that are\n# required to use it correctly.  Split this into an argument list,\n# exactly as /bin/sh would do it, and then search $PATH for the\n# executable.  If we find it, return a list whose first element is\n# the absolute pathname of the executable, followed by any options.\n# Otherwise return an empty list.\nsub which {\n    my ($command) = @_;\n    my @PATH = clean_PATH();\n\n    # Split the command name from any options attached to it.\n    my ($cmd, @options) = sh_split($command);\n    my ($vol, $path, $file) = splitpath($cmd);\n\n    if ($file eq 'false') {\n        # Special case: the command 'false' is never considered to be\n        # available.  Autoconf sets config variables like $CC and $NM to\n        # 'false' if it can't find the requested tool.\n        return ();\n\n    } elsif ($file ne $cmd) {\n        # $cmd was not a bare filename.  Do not do path search, but do\n        # verify that $cmd exists and is executable, then convert it\n        # to a canonical absolute path.\n        #\n        # Note: the result of realpath() is unspecified if its\n        # argument does not exist, so we must test its existence\n        # first.\n        #\n        # Note: if $file is a symlink, we must *not* resolve that\n        # symlink, because that may change the name of the program,\n        # which in turn may change what the program does.\n        # For instance, suppose $CC is /usr/lib/ccache/cc, and this\n        # 'cc' is a symlink to /usr/bin/ccache.  Resolving the symlink\n        # will cause ccache to be invoked as 'ccache' instead of 'cc'\n        # and it will error out because it's no longer being told\n        # it's supposed to run the compiler.\n        if (-f -x $cmd) {\n            return (catfile(realpath(catpath($vol, $path, q{})), $file),\n                @options);\n        } else {\n            return ();\n        }\n\n    } else {\n        for my $d (@PATH) {\n            my $cand = catfile($d, $cmd);\n            if (-f -x $cand) {\n                # @PATH came from clean_PATH, so all of the directories\n                # have already been canonicalized.  If the last element\n                # of $cand is a symlink, we should *not* resolve it (see\n                # above).  Therefore, we do not call realpath here.\n                return ($cand, @options);\n            }\n        }\n        return ();\n\n    }\n}\n\n#\n# Code shared among scripts that work from hashes.conf\n#\n\nuse Class::Struct HashSpec => [\n    name      => '$',\n    prefix    => '$',\n    nrbytes   => '$',\n    is_strong => '$',\n];\nuse Class::Struct HashesConfData => [\n    hashes             => '*%',\n    groups             => '*%',\n    max_namelen        => '$',\n    max_nrbyteslen     => '$',\n    max_prefixlen      => '$',\n    default_candidates => '*@',\n];\n\n# The canonical list of flags that can appear in the fourth field\n# of a hashes.conf entry.  Alphabetical, except for STRONG and\n# DEFAULT.\nmy %VALID_FLAGS = (\n    STRONG  => 1,\n    DEFAULT => 1,\n    ALT     => 1,\n    DEBIAN  => 1,\n    EULER   => 1,\n    FEDORA  => 1,\n    FREEBSD => 1,\n    GLIBC   => 1,\n    KYLIN   => 1,\n    NETBSD  => 1,\n    OPENBSD => 1,\n    OSX     => 1,\n    OWL     => 1,\n    SOLARIS => 1,\n    SUSE    => 1,\n);\n\nsub parse_hashes_conf {\n    my $fname = shift;\n    my $error = 0;\n\n    my $err = sub {\n        my ($line, $msg) = @_;\n        if (!defined $msg) {\n            $msg  = $line;\n            $line = $.;\n        }\n        print {*STDERR} \"$fname:$line: error: $msg\\n\";\n        $error = 1;\n    };\n    my $note = sub {\n        my ($line, $msg) = @_;\n        if (!defined $msg) {\n            $msg  = $line;\n            $line = $.;\n        }\n        print {*STDERR} \"$fname:$line: note: $msg\\n\";\n    };\n\n    open my $fh, '<', $fname\n        or die \"$fname: $!\\n\";\n\n    my %line_of;\n    my %hashes;\n    my %groups;\n    my $max_namelen    = 0;\n    my $max_nrbyteslen = 0;\n    my $max_prefixlen  = 0;\n    my @default_candidates;\n    local $_;\n    while (<$fh>) {\n        next if /^#/;\n        chomp;\n        s/\\s+$//;\n        next if $_ eq q{};\n\n        my @fields = split;\n        if (scalar(@fields) != 4) {\n            $err->('wrong number of fields');\n            next;\n        }\n        my ($name, $h_prefix, $nrbytes, $flags) = @fields;\n        my $default_cand = 0;\n        my $is_strong    = 0;\n        my @grps;\n\n        if ($name eq ':') {\n            $err->('method name cannot be blank');\n            $name = \"_missing_$.\";\n        }\n\n        # No two hashing method names can be the same.\n        if (exists $line_of{$name}) {\n            $err->(\"method name '$name' reused\");\n            $note->($line_of{$name}, 'previous use was here');\n        } else {\n            $line_of{$name} = $.;\n            if ($max_namelen < length $name) {\n                $max_namelen = length $name;\n            }\n        }\n\n        $h_prefix = q{} if $h_prefix eq ':';\n        if ($max_prefixlen < length $h_prefix) {\n            $max_prefixlen = length $h_prefix;\n        }\n\n        if ($nrbytes !~ /^[0-9]+$/ || $nrbytes == 0) {\n            $err->('nrbytes must be a positive integer');\n            $nrbytes = 1;\n        }\n\n        if ($max_nrbyteslen < length $nrbytes) {\n            $max_nrbyteslen = length $nrbytes;\n        }\n\n        $flags = q{} if $flags eq ':';\n        for (split /,/, $flags) {\n            if (!exists $VALID_FLAGS{$_}) {\n                $err->(\"unrecognized flag $_\");\n            } elsif ($_ eq 'DEFAULT') {\n                $default_cand = 1;\n            } else {\n                push @grps, lc;\n                if ($_ eq 'STRONG') {\n                    $is_strong = 1;\n                }\n            }\n        }\n        if ($default_cand && !$is_strong) {\n            $err->('weak hash marked as default candidate');\n        }\n\n        next if $error;\n\n        my $entry = HashSpec->new(\n            name      => $name,\n            prefix    => $h_prefix,\n            nrbytes   => $nrbytes,\n            is_strong => $is_strong,\n        );\n        $hashes{$name} = $entry;\n        for my $g (@grps) {\n            push @{$groups{$g}}, $entry;\n        }\n        if ($default_cand) {\n            push @default_candidates, $entry;\n        }\n    }\n\n    # No hash prefix can be a prefix of any other hash prefix, except\n    # for the empty prefix.\n    for my $p (values %hashes) {\n        my $pp = $p->prefix;\n        next if $pp eq q{};\n        my $mpp = qr/^\\Q$pp\\E/;\n        for my $q (values %hashes) {\n            next if $p->name eq $q->name;\n            my $pq = $q->prefix;\n            next if $pq eq q{};\n            if ($pq =~ $mpp) {\n                $err->(\n                    $line_of{$q->name},\n                    \"prefix collision: '$pq' begins with '$pp'\",\n                );\n                $note->(\n                    $line_of{$p->name},\n                    \"'$pp' used for hash '\" . $p->name . q{'},\n                );\n            }\n        }\n    }\n\n    die \"errors while parsing '$fname'\\n\" if $error;\n    return HashesConfData->new(\n        hashes             => \\%hashes,\n        groups             => \\%groups,\n        max_namelen        => $max_namelen,\n        max_nrbyteslen     => $max_nrbyteslen,\n        max_prefixlen      => $max_prefixlen,\n        default_candidates => \\@default_candidates,\n    );\n}\n\nsub enabled_set {\n    return map { $_ => 1 }\n        grep   { $_ ne q{} }\n        split /,/,\n        shift;\n}\n\n#\n# Code shared among scripts that work from libcrypt.map.in\n#\n\nuse Class::Struct VersionedSymbol => [\n    name        => '$',\n    included    => '$',\n    compat_only => '$',\n    versions    => '*@',\n];\n\nuse Class::Struct SymbolVersionMap => [\n    symbols    => '*@',\n    versions   => '*@',\n    basemap    => '$',\n    max_symlen => '$',\n];\n\n# Process command-line arguments to a program that works from a\n# .map.in file.  These are the name of the .map.in file plus var=value\n# settings for SYMVER_MIN, SYMVER_FLOOR, and COMPAT_ABI, in any order.\nsub parse_symver_args {\n    my (@args) = @_;\n    my $usage_error = sub {\n        print {*STDERR}\n            \"${FindBin::Script}: usage: \",\n            'SYMVER_MIN=value SYMVER_FLOOR=value ',\n            'COMPAT_ABI=value libcrypt.map.in',\n            \"\\n\";\n        exit 1;\n    };\n    $usage_error->() if scalar(@args) != 4;\n\n    my $map_in;\n    my $SYMVER_MIN;\n    my $SYMVER_FLOOR;\n    my $COMPAT_ABI;\n    local $_;\n    for (@args) {\n        if (/^SYMVER_MIN=(.+)$/) {\n            $usage_error->() if defined $SYMVER_MIN;\n            $SYMVER_MIN = $1;\n        } elsif (/^SYMVER_FLOOR=(.+)$/) {\n            $usage_error->() if defined $SYMVER_FLOOR;\n            $SYMVER_FLOOR = $1;\n        } elsif (/^COMPAT_ABI=(.+)$/) {\n            $usage_error->() if defined $COMPAT_ABI;\n            $COMPAT_ABI = $1;\n        } else {\n            $usage_error->() if defined $map_in;\n            $map_in = $_;\n        }\n    }\n    return $map_in, $SYMVER_MIN, $SYMVER_FLOOR, $COMPAT_ABI;\n}\n\n# Read a .map.in file and compute the set of symbol versions to be\n# included in this build of the library.\n#\n# All compat symbol versions that do not match COMPAT_ABI are ignored.\n# All symbol versions lower than SYMVER_MIN are discarded from the output.\n# All symbol versions lower than SYMVER_FLOOR are replaced with SYMVER_FLOOR.\n# SYMVER_FLOOR must be greater than or equal to SYMVER_MIN.\n#\n# The ordering of symbol versions is entirely controlled by the %chain\n# directive, which must therefore list both all of the versions\n# actually used for symbols, and all of the versions that might be\n# used as SYMVER_MIN or SYMVER_FLOOR.\nsub parse_version_map_in {    ## no critic (Subroutines::RequireArgUnpacking)\n    my ($map_in, $SYMVER_MIN, $SYMVER_FLOOR, $COMPAT_ABI) =\n        parse_symver_args(@_);\n\n    my %symbols;\n    my %vorder;\n    my $vmax = 0;\n    my $error;\n    my $max_symlen = 0;\n    open my $fh, '<', $map_in\n        or die \"$map_in: $!\\n\";\n\n    local $_;\n    while (<$fh>) {\n        next if /^#/;\n        chomp;\n        s/\\s+$//;\n        next if $_ eq q{};\n\n        my @vers = split;\n        my $sym  = shift @vers;\n        if ($sym eq '%chain') {\n            for my $v (@vers) {\n                if (exists $vorder{$v}) {\n                    print {*STDERR}\n                        \"$map_in:$.: error: '$v' used twice in %chain\\n\";\n                    $error = 1;\n                    next;\n                }\n                $vorder{$v} = $vmax;\n                $vmax++;\n            }\n            next;\n        }\n        if (exists $symbols{$sym}) {\n            print {*STDERR}\n                \"$map_in:$.: error: more than one entry for '$sym'\\n\";\n            $error = 1;\n            next;\n        }\n        if ($max_symlen < length $sym) {\n            $max_symlen = length $sym;\n        }\n\n        # Dash in the second field means there is no default version\n        # for this symbol.\n        my $compat_only = 0;\n        if ($vers[0] eq '-') {\n            $compat_only = 1;\n            shift @vers;\n        }\n\n        my @enabled_vers;\n        for my $v (@vers) {\n            # Each $v is a symbol version name followed by zero\n            # or more compatibility tags, separated by colons.\n            # If there are no tags, the symbol version is available\n            # unconditionally; if there are any tags, the symbol\n            # version is available if COMPAT_ABI is equal to 'yes'\n            # or equal to one of the tags.\n            my @tags = split /:/, $v;\n            $v = shift @tags;\n            my $enabled = 1;\n            if (@tags && $COMPAT_ABI ne 'yes') {\n                $enabled = 0;\n                for my $t (@tags) {\n                    if ($t eq $COMPAT_ABI) {\n                        $enabled = 1;\n                        last;\n                    }\n                }\n            }\n            push @enabled_vers, $v if $enabled;\n        }\n        $symbols{$sym} = VersionedSymbol->new(\n            name        => $sym,\n            included    => 1,\n            compat_only => $compat_only,\n            versions    => \\@enabled_vers,\n        );\n    }\n\n    my $symver_min_idx;\n    my $symver_floor_idx;\n    if (!%vorder) {\n        print {*STDERR} \"$map_in: error: missing %chain directive\\n\";\n        $error = 1;\n    } else {\n        $symver_min_idx   = $vorder{$SYMVER_MIN}   // -2;\n        $symver_floor_idx = $vorder{$SYMVER_FLOOR} // -1;\n        if ($symver_min_idx < 0) {\n            print {*STDERR}\n                \"$map_in: error: SYMVER_MIN ($SYMVER_MIN) \",\n                \"not found in %chain directives\\n\";\n            $error = 1;\n        }\n        if ($symver_floor_idx < 0) {\n            print {*STDERR}\n                \"$map_in: error: SYMVER_FLOOR ($SYMVER_FLOOR) \",\n                \"not found in %chain directives\\n\";\n            $error = 1;\n        }\n        if ($symver_floor_idx < $symver_min_idx) {\n            print {*STDERR}\n                \"$map_in: error: SYMVER_FLOOR ($SYMVER_FLOOR) \",\n                \"is lower than SYMVER_MIN ($SYMVER_MIN)\\n\";\n            $error = 1;\n        }\n    }\n    die \"errors processing '$map_in'\\n\" if $error;\n\n    # For each symbol, remove all of its versions below SYMVER_MIN,\n    # and replace all of its versions below SYMVER_FLOOR with a single\n    # instance of SYMVER_FLOOR.  If none are left, mark the symbol as\n    # not included.  Otherwise, sort its 'versions' array in\n    # _descending_ order of symbol version.  As we do this, keep track\n    # of all the symbol versions that are actually used.\n    my %used_versions;\n    for my $sym (values %symbols) {\n        my %pruned_versions;\n        for my $v (@{$sym->versions}) {\n            if (!exists $vorder{$v}) {\n                print {*STDERR}\n                    \"$map_in: error: version '$v' for symbol '\",\n                    $sym->name, \"' not found in %chain\\n\";\n                $error = 1;\n                next;\n            }\n            if ($vorder{$v} < $symver_min_idx) {\n                next;\n            } elsif ($vorder{$v} < $symver_floor_idx) {\n                $pruned_versions{$SYMVER_FLOOR} = 1;\n                $used_versions{$SYMVER_FLOOR}   = 1;\n            } else {\n                $pruned_versions{$v} = 1;\n                $used_versions{$v}   = 1;\n            }\n        }\n        if (%pruned_versions) {\n            @{$sym->versions} =\n                sort { -($vorder{$a} <=> $vorder{$b}) }\n                keys %pruned_versions;\n        } else {\n            $sym->included(0);\n            @{$sym->versions} = ();\n        }\n    }\n\n    # Sort the set of used symbol versions in _ascending_ order.\n    my @vchain = sort { $vorder{$a} <=> $vorder{$b} } keys %used_versions;\n\n    my (undef, undef, $basemap) = splitpath($map_in);\n    return SymbolVersionMap->new(\n        symbols    => [sort { $a->name cmp $b->name } values %symbols],\n        versions   => \\@vchain,\n        basemap    => $basemap,\n        max_symlen => $max_symlen,\n    );\n}\n\n1;\n"
  },
  {
    "path": "build-aux/scripts/check-perlcritic-config",
    "content": "#! /usr/bin/perl\n# Written by Zack Weinberg <zackw at panix.com> in 2021.\n# To the extent possible under law, Zack Weinberg has waived all\n# copyright and related or neighboring rights to this work.\n#\n# See https://creativecommons.org/publicdomain/zero/1.0/ for further\n# details.\n\n# Compare the set of available Perl::Critic policies with the set of\n# policies mentioned in .perlcriticrc.  Fail the build if there are\n# available policies that are not mentioned, or mentioned policies\n# that are not available.  This ensures that we always have the\n# expected set of policies available when running perlcritic, and\n# that we have thought about whether each one _should_ be enabled.\n# (\"Mentioned\" does not mean \"enabled\".  [-APolicy::WeDontWantToUse]\n# counts as mentioning the policy for purpose of this script.)\n\n# Ideally this would be a perlcritic policy itself, so it would get\n# run on any invocation of perlcritic, not just on 'make distcheck'.\n\nuse v5.14;    # implicit use strict, use feature ':5.14'\nuse warnings FATAL => 'all';\nuse utf8;\nuse open qw(:std :utf8);\nno  if $] >= 5.022, warnings => 'experimental::re_strict';\nuse if $] >= 5.022, re       => 'strict';\n\nuse Perl::Critic              ();\nuse Perl::Critic::UserProfile ();\n\nsub all_policies {\n    return\n        map { (\"$_\" => 1) }\n        Perl::Critic->new(-profile => q(), -severity => 1)->policies();\n}\n\nsub mentioned_policies {\n    return\n        map { (s/^Perl::Critic::Policy:://r => 1) }\n        Perl::Critic::UserProfile->new()->listed_policies();\n}\n\nsub compare_mentioned_to_all {\n    my %all       = all_policies();\n    my %mentioned = mentioned_policies();\n\n    my @unmentioned;\n    for my $p (keys %all) {\n        push @unmentioned, $p unless exists $mentioned{$p};\n    }\n\n    my @uninstalled;\n    for my $p (keys %mentioned) {\n        push @uninstalled, $p unless exists $all{$p};\n    }\n\n    my $fail = 0;\n    if (@unmentioned) {\n        print {*STDERR}\n            \"*** Unmentioned policies:\\n\\t\",\n            join(\"\\n\\t\", sort @unmentioned),\n            \"\\n\\n\";\n        $fail = 1;\n    }\n    if (@uninstalled) {\n        print {*STDERR}\n            \"*** Uninstalled policies:\\n\\t\",\n            join(\"\\n\\t\", sort @uninstalled),\n            \"\\n\\n\";\n        $fail = 1;\n    }\n\n    return $fail;\n}\n\nexit compare_mentioned_to_all();\n"
  },
  {
    "path": "build-aux/scripts/compute-symver-floor",
    "content": "#! /usr/bin/perl\n# Written by Zack Weinberg <zackw at panix.com> in 2017 and 2020.\n# To the extent possible under law, Zack Weinberg has waived all\n# copyright and related or neighboring rights to this work.\n#\n# See https://creativecommons.org/publicdomain/zero/1.0/ for further\n# details.\n\n# Process libcrypt.minver and determine the minumum symbol version to\n# use for compatibility symbols.  Called from configure.ac.\n\nuse v5.14;    # implicit use strict, use feature ':5.14'\nuse warnings FATAL => 'all';\nuse utf8;\nuse open qw(:std :utf8);\nno  if $] >= 5.022, warnings => 'experimental::re_strict';\nuse if $] >= 5.022, re       => 'strict';\n\nuse FindBin ();\nuse lib ${FindBin::Bin};\nuse BuildCommon qw(\n    ensure_C_locale\n    sh_split\n    popen\n    subprocess_error\n    which\n);\n\nsub preprocessor_check {\n    my ($expr) = @_;\n\n    state @CC;\n    state @CFLAGS;\n    if (!@CC) {\n        @CC = which($ENV{CC} // 'cc');\n        die \"C compiler not available\\n\" unless @CC;\n\n        @CFLAGS = sh_split($ENV{CFLAGS} // q{});\n\n        # Remove empty elements, particularly leading ones which\n        # cause issues with popen below.\n        @CFLAGS = grep { $_ } @CFLAGS;\n\n        # We call ensure_C_locale here, not from the main section,\n        # because this sub might not get called at all, in which\n        # case it would be unnecessary work.\n        ensure_C_locale();\n    }\n\n    # FIXME: We assume the compiler understands \"-fsyntax-only -xc -\"\n    # to mean \"read standard input, interpret as C, check for errors,\n    # produce no output.\"  This is true for all commonly used C\n    # compilers on operating systems where this feature is necessary.\n    print {*STDERR} \"${FindBin::Bin}: testing $expr\\n\";\n\n    my $ccpipe = popen('|-', @CC, @CFLAGS, '-fsyntax-only', '-xc', '-');\n    print {$ccpipe} <<\"EOF\";\n#include <limits.h>\n#if !($expr)\n#error nope\n#endif\nint avoid_empty_translation_unit;\nEOF\n    if (close $ccpipe) {\n        return 1;    # compilation successful\n    } elsif ($! == 0 && ($? & 0x7F) == 0) {\n        return 0;    # compilation failed\n    } else {\n        subprocess_error(@CC);\n    }\n}\n\nsub parse_minver_file {\n    my ($minver_file, $system, $cpu) = @_;\n    $system = lc $system;\n    $cpu    = lc $cpu;\n\n    local $_;\n    open my $fh, '<', $minver_file\n        or die \"$minver_file: $!\\n\";\n    while (<$fh>) {\n        next if /^#/;\n        chomp;\n        s/\\s+$//;\n        next if $_ eq q{};\n\n        my ($vers, $vsys, $vcpu, $ppck) = split q{ }, $_, 4;\n        $vsys = lc $vsys;\n        $vcpu = lc $vcpu;\n\n        return $vers\n            if $system =~ /\\A$vsys/\n            && $cpu =~ /\\A$vcpu/\n            && (!defined $ppck || preprocessor_check($ppck));\n    }\n    print {*STDERR} \"$0: no match for ${cpu}-${system}\\n\";\n    return 'ERROR';\n}\n\n#\n# Main\n#\nif (scalar(@ARGV) != 3) {\n    print {*STDERR} \"usage: $0 libcrypt.minver host-os host-cpu\\n\";\n    print {*STDERR} \"Environment variables \\$CC and \\$CFLAGS are honored.\\n\";\n    exit 2;\n}\n\nexit 0 if eval {\n    print parse_minver_file(@ARGV), \"\\n\";\n    close STDOUT or die \"write error: $!\\n\";\n    1;\n};\n\nprint {*STDERR} \"${FindBin::Script}: $@\";\nexit 1;\n"
  },
  {
    "path": "build-aux/scripts/expand-selected-hashes",
    "content": "#! /usr/bin/perl\n# Written by Zack Weinberg <zackw at panix.com> in 2018 and 2020.\n# To the extent possible under law, Zack Weinberg has waived all\n# copyright and related or neighboring rights to this work.\n#\n# See https://creativecommons.org/publicdomain/zero/1.0/ for further\n# details.\n\n# Using the information in lib/hashes.conf, validate a list of\n# selected hashes and hash groups that was supplied as the argument of\n# the --enable-hashes option to the configure script, expand all\n# the groups, and remove duplicates.\n#\n# Caution: if you change the format of lib/hashes.conf you will\n# probably need to modify gen-crypt-hashes-h as well as this script.\n\nuse v5.14;    # implicit use strict, use feature ':5.14'\nuse warnings FATAL => 'all';\nuse utf8;\nuse open qw(:std :utf8);\nno  if $] >= 5.022, warnings => 'experimental::re_strict';\nuse if $] >= 5.022, re       => 'strict';\n\nuse FindBin ();\nuse lib $FindBin::Bin;\nuse BuildCommon qw(\n    parse_hashes_conf\n);\n\nsub expand_selected {\n    my ($hconf, $selected) = @_;\n\n    if ($selected eq 'all') {\n        return keys %{$hconf->hashes};\n    } else {\n        my %enabled;\n        my @errors;\n        my $hashes = $hconf->hashes;\n        my $groups = $hconf->groups;\n        for my $w (split /,/, $selected) {\n            if ($w eq 'all') {\n                push @errors, \"'all' must be used alone\\n\";\n            } elsif (exists $hashes->{$w}) {\n                $enabled{$w} = 1;\n            } elsif (exists $groups->{$w}) {\n                for my $h (@{$groups->{$w}}) {\n                    $enabled{$h->name} = 1;\n                }\n            } else {\n                push @errors, \"'$w' is not a hash or group name\\n\";\n            }\n        }\n        if (scalar(%enabled) == 0) {\n            push @errors, \"no hashes are enabled\\n\";\n        }\n        die join q{}, @errors if @errors;\n        return keys %enabled;\n    }\n}\n\n#\n# Main\n#\nif (scalar(@ARGV) != 2) {\n    print {*STDERR}\n        \"usage: ${FindBin::Script} hashes.conf names,of,selected,hashes\\n\";\n    exit 1;\n}\nexit 0 if eval {\n    my ($hashes_conf, $hashes_selected) = @ARGV;\n    my $hconf   = parse_hashes_conf($hashes_conf);\n    my @enabled = expand_selected($hconf, $hashes_selected);\n\n    print ',', (join ',', sort @enabled), \",\\n\";\n    close STDOUT or die \"write error: $!\\n\";\n    1;\n};\n\nprint {*STDERR} \"${FindBin::Script}: $@\";\nexit 1;\n"
  },
  {
    "path": "build-aux/scripts/gen-crypt-h",
    "content": "#! /usr/bin/perl\n# Written by Zack Weinberg <zackw at panix.com> in 2017.\n# To the extent possible under law, Zack Weinberg has waived all\n# copyright and related or neighboring rights to this work.\n#\n# See https://creativecommons.org/publicdomain/zero/1.0/ for further\n# details.\n\n# Generate (x)crypt.h from (x)crypt.h.in.\n\nuse v5.14;    # implicit use strict, use feature ':5.14'\nuse warnings FATAL => 'all';\nuse utf8;\nuse open qw(:std :utf8);\nno  if $] >= 5.022, warnings => 'experimental::re_strict';\nuse if $] >= 5.022, re       => 'strict';\n\nuse FindBin ();\nuse lib $FindBin::Bin;\nuse BuildCommon qw(\n    enabled_set\n    parse_hashes_conf\n);\n\n# Substitutions we know about are accumulated in this hash.\nmy %substs;\n\nsub process_config_h {\n    my ($config_h) = @_;\n    open my $fh, '<', $config_h\n        or die \"$config_h: $!\\n\";\n\n    my $have_sys_cdefs_h               = 0;\n    my $have_sys_cdefs_begin_end_decls = 0;\n    my $have_sys_cdefs_throw           = 0;\n    local $_;\n    while (<$fh>) {\n        chomp;\n\n        if ($_ eq '#define HAVE_SYS_CDEFS_H 1') {\n            $have_sys_cdefs_h = 1;\n        } elsif ($_ eq '#define HAVE_SYS_CDEFS_BEGIN_END_DECLS 1') {\n            $have_sys_cdefs_begin_end_decls = 1;\n        } elsif ($_ eq '#define HAVE_SYS_CDEFS_THROW 1') {\n            $have_sys_cdefs_throw = 1;\n        } elsif (/^#define PACKAGE_VERSION \"((\\d+)\\.(\\d+)\\.\\d+)\"$/) {\n            $substs{XCRYPT_VERSION_STR}   = $1;\n            $substs{XCRYPT_VERSION_MAJOR} = $2;\n            $substs{XCRYPT_VERSION_MINOR} = $3;\n        }\n    }\n\n    die \"$config_h: error: inconsistent <sys/cdefs.h> settings\\n\"\n        if !$have_sys_cdefs_h\n        && ($have_sys_cdefs_begin_end_decls || $have_sys_cdefs_throw);\n\n    my $s = q{};\n    my $e = q{};\n    $s .= \"#include <sys/cdefs.h>\\n\" if $have_sys_cdefs_h;\n    $s .= \"#define __THROW /* nothing */\\n\" unless $have_sys_cdefs_throw;\n    $s .= \"\\n\";\n    if ($have_sys_cdefs_begin_end_decls) {\n        $s .= '__BEGIN_DECLS';\n        $e .= '__END_DECLS';\n    } else {\n        $s .= \"#ifdef __cplusplus\\nextern \\\"C\\\" {\\n#endif\";\n        $e .= \"#ifdef __cplusplus\\n} /* extern \\\"C\\\" */\\n#endif\";\n    }\n    $substs{BEGIN_DECLS} = $s;\n    $substs{END_DECLS}   = $e;\n    return;\n}\n\nsub process_hashes_conf {\n    my ($hashes_conf, $hashes_enabled) = @_;\n    my %enabled = enabled_set($hashes_enabled);\n    my $hconf   = parse_hashes_conf($hashes_conf);\n\n    my $default_prefix_enabled = 0;\n    for my $e (@{$hconf->default_candidates}) {\n        if ($enabled{$e->name}) {\n            $default_prefix_enabled = 1;\n            last;\n        }\n    }\n    $substs{DEFAULT_PREFIX_ENABLED} = $default_prefix_enabled;\n    return;\n}\n\nsub substitute {\n    my ($infile) = @_;\n    open my $fh, '<', $infile\n        or die \"$infile: $!\\n\";\n    my $error = 0;\n    local $_;\n    my $subst1 = sub {\n        my $rep = $substs{$_[0]};\n        return $rep if defined $rep;\n\n        print {*STDERR} \"$infile:$.: error: no substitution for $_[0]\\n\";\n        $error = 1;\n        return \"!$_[0]!\";\n    };\n    while (<$fh>) {\n        s/@([A-Z0-9_]+)@/&$subst1($1)/eg;\n        print;\n    }\n    exit 1 if $error;\n    return;\n}\n\n#\n# Main\n#\nif (scalar(@ARGV) != 2 && scalar(@ARGV) != 4) {\n    print {*STDERR} 'usage: '\n        . ${FindBin::Script}\n        . ' template config.h [hashes.conf ,hashes,enabled,]' . \"\\n\";\n    exit 1;\n}\nexit 0 if eval {\n    my $infile = shift @ARGV;\n    process_config_h(shift @ARGV);\n    process_hashes_conf(@ARGV) if @ARGV;\n    substitute($infile);\n    close STDOUT or die \"write error: $!\\n\";\n    1;\n};\n\nprint {*STDERR} \"${FindBin::Script}: $@\";\nexit 1;\n"
  },
  {
    "path": "build-aux/scripts/gen-crypt-hashes-h",
    "content": "#! /usr/bin/perl\n# Written by Zack Weinberg <zackw at panix.com> in 2018 and 2020.\n# To the extent possible under law, Zack Weinberg has waived all\n# copyright and related or neighboring rights to this work.\n#\n# See https://creativecommons.org/publicdomain/zero/1.0/ for further\n# details.\n\n# Generate crypt-hashes.h from lib/hashes.conf and configure settings.\n# Also responsible for checking lib/hashes.conf for errors.\n#\n# Caution: if you change the format of lib/hashes.conf you will\n# probably need to modify expand-selected-hashes as well as this script.\n\nuse v5.14;    # implicit use strict, use feature ':5.14'\nuse warnings FATAL => 'all';\nuse utf8;\nuse open qw(:std :utf8);\nno  if $] >= 5.022, warnings => 'experimental::re_strict';\nuse if $] >= 5.022, re       => 'strict';\n\nuse File::Spec::Functions qw(splitpath);\nuse FindBin ();\nuse lib $FindBin::Bin;\nuse BuildCommon qw(\n    enabled_set\n    parse_hashes_conf\n);\n\nsub output {\n    my ($basehc, $hashes_enabled, $hconf) = @_;\n    my %enabled = enabled_set($hashes_enabled);\n    my @enabled_hashes;\n\n    print <<\"EOT\";\n/* Generated by ${FindBin::Script} from $basehc.  DO NOT EDIT.  */\n\n#ifndef _CRYPT_HASHES_H\n#define _CRYPT_HASHES_H 1\n\nEOT\n    for my $e (sort { $a->name cmp $b->name } values %{$hconf->hashes}) {\n        my $name = $e->name;\n        my $ena  = $enabled{$name} // 0;\n        printf \"#define INCLUDE_%-*s %d\\n\", $hconf->max_namelen, $name, $ena;\n        push @enabled_hashes, $e if $ena;\n    }\n\n    print <<'EOT';\n\n/* Internal symbol renames for static linkage, see crypt-port.h.  */\nEOT\n    for my $e (@enabled_hashes) {\n        my $name_rn = $e->name . '_rn';\n        printf \"#define crypt_%-*s _crypt_crypt_%s\\n\",\n            $hconf->max_namelen + 5, $name_rn, $name_rn;\n        printf \"#define gensalt_%-*s _crypt_gensalt_%s\\n\",\n            $hconf->max_namelen + 3, $name_rn, $name_rn;\n    }\n\n    print <<'EOT';\n\n/* Prototypes for hash algorithm entry points.  */\nEOT\n    for my $e (@enabled_hashes) {\n        my $name = $e->name;\n        print <<\"EOT\";\nextern void crypt_${name}_rn (const char *, size_t, const char *,\n                size_t, uint8_t *, size_t, void *, size_t);\nextern void gensalt_${name}_rn (unsigned long,\n                const uint8_t *, size_t, uint8_t *, size_t);\n\nEOT\n    }\n\n    print <<'EOT';\n#define HASH_ALGORITHM_TABLE_ENTRIES \\\nEOT\n    # Entries in this table can be in any order _except_ that the hash\n    # whose prefix is the empty string, if it's enabled, must be last.\n    # The simplest way to accomplish this is to sort the prefixes in\n    # descending order of length (and then alphabetically as a\n    # tiebreaker).\n    my @table_hashes = sort {\n        -(length($a->prefix) <=> length($b->prefix))\n            || $a->prefix cmp $b->prefix\n    } @enabled_hashes;\n\n    for my $e (@table_hashes) {\n        my $name_rn  = $e->name . '_rn,';\n        my $q_prefix = '\"' . $e->prefix . '\",';\n        printf \"  { %-*s %d, crypt_%-*s gensalt_%-*s %2d, %d }, \\\\\\n\",\n            $hconf->max_prefixlen + 3, $q_prefix, length($e->prefix),\n            $hconf->max_namelen + 4,   $name_rn,\n            $hconf->max_namelen + 4,   $name_rn,\n            $e->nrbytes, $e->is_strong;\n    }\n    print \"  { 0, 0, 0, 0, 0, 0 }\\n\";\n\n    # The default_candidates array is in decreasing order of strength;\n    # select the first one that's enabled, if any.\n    my $default_prefix;\n    for my $e (@{$hconf->default_candidates}) {\n        if ($enabled{$e->name}) {\n            $default_prefix = $e->prefix;\n            last;\n        }\n    }\n    print <<\"EOT\" if defined $default_prefix;\n\n#define HASH_ALGORITHM_DEFAULT \"$default_prefix\"\nEOT\n    print <<'EOT';\n\n#endif /* crypt-hashes.h */\nEOT\n\n    close STDOUT or die \"write error: $!\\n\";\n    return;\n}\n\n#\n# Main\n#\nif (scalar(@ARGV) != 2) {\n    print {*STDERR} \"usage: ${FindBin::Script}\"\n        . \"hashes.conf ,names,of,enabled,hashes,\\n\";\n    exit 1;\n}\nexit 0 if eval {\n    my ($hashes_conf, $hashes_enabled) = @ARGV;\n    my (undef, undef, $basehc) = splitpath($hashes_conf);\n\n    my $hconf = parse_hashes_conf($hashes_conf);\n    output($basehc, $hashes_enabled, $hconf);\n    1;\n};\n\nprint {*STDERR} \"${FindBin::Script}: $@\";\nexit 1;\n"
  },
  {
    "path": "build-aux/scripts/gen-crypt-symbol-vers-h",
    "content": "#! /usr/bin/perl\n# Written by Zack Weinberg <zackw at panix.com> in 2017 and 2021.\n# To the extent possible under law, Zack Weinberg has waived all\n# copyright and related or neighboring rights to this work.\n#\n# See https://creativecommons.org/publicdomain/zero/1.0/ for further\n# details.\n\n# Generate macros that control the symbol versions of the public\n# library API, from a .map.in file.\n#\n# See libcrypt.map.in for an explanation of the format of .map.in\n# files.  See crypt-port.h for an explanation of how to use the macros\n# generated by this program.\n#\n# Note: we currently don't support compatibility symbols that need\n# a different definition from the default version.\n\nuse v5.14;    # implicit use strict, use feature ':5.14'\nuse warnings FATAL => 'all';\nuse utf8;\nuse open qw(:std :utf8);\nno  if $] >= 5.022, warnings => 'experimental::re_strict';\nuse if $] >= 5.022, re       => 'strict';\n\nuse FindBin ();\nuse lib $FindBin::Bin;\nuse BuildCommon qw(\n    parse_version_map_in\n);\n\nsub output {\n    my ($apply_symvers, $symvers) = @_;\n    my $basemap = $symvers->basemap;\n    print \"/* Generated from $basemap by ${FindBin::Script}.  \"\n        . \"DO NOT EDIT.  */\\n\";\n\n    print <<'EOT';\n\n#ifndef _CRYPT_SYMBOL_VERS_H\n#define _CRYPT_SYMBOL_VERS_H 1\n\n/* For each public symbol <sym>, INCLUDE_<sym> is true if it\n   has any versions above the backward compatibility minimum.\n   Compatibility-only symbols are not included in the static\n   library, or in the shared library when configured with\n   --disable-obsolete-api.  */\n#if defined PIC && ENABLE_OBSOLETE_API\n\nEOT\n\n    for my $sym (@{$symvers->symbols}) {\n        printf \"#define INCLUDE_%-*s %d\\n\",\n            $symvers->max_symlen, $sym->name, $sym->included;\n    }\n    print \"\\n#else\\n\\n\";\n    for my $sym (@{$symvers->symbols}) {\n        printf \"#define INCLUDE_%-*s %d\\n\",\n            $symvers->max_symlen, $sym->name,\n            $sym->included && !$sym->compat_only;\n    }\n\n    if ($apply_symvers =~ m/no/) {\n        print <<'EOT';\n\n#endif\n\n/* We are building this library with no symbol versioning\n   enabled, so let's define all macros for SYMVER_ to do\n   nothing. */\nEOT\n        for my $sym (@{$symvers->symbols}) {\n            my $name = $sym->name;\n            print \"#define SYMVER_$name symver_nop()\\n\";\n        }\n        print <<'EOT';\n#endif\nEOT\n        close STDOUT or die \"write error: $!\\n\";\n        return;\n    }\n\n    print <<'EOT';\n\n#endif\n\n/* When the public symbols are being given versions, they must be\n   defined under a different, private name first.  */\n#ifdef PIC\nEOT\n\n    for my $sym (@{$symvers->symbols}) {\n        if ($sym->included) {\n            printf \"#define %-*s _crypt_%s\\n\",\n                $symvers->max_symlen, $sym->name, $sym->name;\n        }\n    }\n\n    print <<'EOT';\n#endif\n\n/* For each public symbol <sym> that is included, define its\n   highest version as the default, and aliases at each\n   compatibility version. */\nEOT\n\n    for my $sym (@{$symvers->symbols}) {\n        my $name = $sym->name;\n        if (!$sym->included) {\n            print \"#define SYMVER_$name symver_nop()\\n\";\n            next;\n        }\n\n        my $seq = 0;\n        for my $v (@{$sym->versions}) {\n            if ($seq == 0) {\n                print \"#define SYMVER_$name \\\\\\n\";\n                if ($sym->compat_only) {\n                    print \"  symver_compat0 (\\\"$name\\\", $name, $v)\";\n                } else {\n                    print \"  symver_default (\\\"$name\\\", $name, $v)\";\n                }\n            } else {\n                print \"; \\\\\\n\"\n                    . \"  symver_compat ($seq, \\\"$name\\\", $name, $name, $v)\";\n            }\n            $seq++;\n        }\n        print \"\\n\";\n    }\n\n    print <<'EOT';\n\n#endif /* crypt-symbol-vers.h */\nEOT\n\n    close STDOUT or die \"write error: $!\\n\";\n    return;\n}\n\n#\n# Main\n#\nexit 0 if eval {\n    output($ARGV[0], parse_version_map_in(@ARGV[1 .. 4]));\n    1;\n};\n\nprint {*STDERR} \"${FindBin::Script}: $@\";\nexit 1;\n"
  },
  {
    "path": "build-aux/scripts/gen-libcrypt-map",
    "content": "#! /usr/bin/perl\n# Written by Zack Weinberg <zackw at panix.com> in 2017 and 2021.\n# To the extent possible under law, Zack Weinberg has waived all\n# copyright and related or neighboring rights to this work.\n#\n# See https://creativecommons.org/publicdomain/zero/1.0/ for further\n# details.\n\n# Generate an ELF-style \"symbol version script\" from a .map.in file.\n# See libcrypt.map.in for an explanation of the format of .map.in\n# files.\n\nuse v5.14;    # implicit use strict, use feature ':5.14'\nuse warnings FATAL => 'all';\nuse utf8;\nuse open qw(:std :utf8);\nno  if $] >= 5.022, warnings => 'experimental::re_strict';\nuse if $] >= 5.022, re       => 'strict';\n\nuse FindBin ();\nuse lib $FindBin::Bin;\nuse BuildCommon qw(\n    parse_version_map_in\n);\n\nsub output {\n    my ($symvers) = @_;\n    my $basemap = $symvers->basemap;\n    print \"/* Generated from $basemap by ${FindBin::Script}.  \"\n        . \"DO NOT EDIT.  */\\n\";\n\n    my %symbols_for_ver;\n    for my $sym (@{$symvers->symbols}) {\n        next if !$sym->included;\n        for my $v (@{$sym->versions}) {\n            push @{$symbols_for_ver{$v}}, $sym->name;\n        }\n    }\n\n    my $vp;\n    for my $v (@{$symvers->versions}) {\n        next unless exists $symbols_for_ver{$v};\n        print \"$v {\\n  global:\\n\";\n        for my $s (sort @{$symbols_for_ver{$v}}) {\n            print \"    $s;\\n\";\n        }\n        if (defined $vp) {\n            print \"} $vp;\\n\";\n        } else {\n            print \"  local:\\n    *;\\n};\\n\";\n        }\n        $vp = $v;\n    }\n    close STDOUT or die \"write error: $!\\n\";\n    return;\n}\n\n#\n# Main\n#\nexit 0 if eval {\n    output(parse_version_map_in(@ARGV));\n    1;\n};\n\nprint {*STDERR} \"${FindBin::Script}: $@\";\nexit 1;\n"
  },
  {
    "path": "build-aux/scripts/move-if-change",
    "content": "#!/bin/sh\n# Like mv $1 $2, but if the files are the same, just delete $1.\n# Status is zero if successful, nonzero otherwise.\n\nVERSION='2018-03-07 03:47'; # UTC\n# The definition above must lie within the first 8 lines in order\n# for the Emacs time-stamp write hook (at end) to update it.\n# If you change this file with Emacs, please let the write hook\n# do its job.  Otherwise, update this string manually.\n\n# Copyright (C) 2002-2020 Free Software Foundation, Inc.\n\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation, either version 3 of the License, or\n# (at your option) any later version.\n\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU General Public License for more details.\n\n# You should have received a copy of the GNU General Public License\n# along with this program.  If not, see <https://www.gnu.org/licenses/>.\n\nusage=\"usage: $0 SOURCE DEST\"\n\nhelp=\"$usage\n  or:  $0 OPTION\nIf SOURCE is different than DEST, then move it to DEST; else remove SOURCE.\n\n  --help     display this help and exit\n  --version  output version information and exit\n\nThe variable CMPPROG can be used to specify an alternative to 'cmp'.\n\nReport bugs to <bug-gnulib@gnu.org>.\"\n\nyear=`expr \"$VERSION\" : '\\([^-]*\\)'`\nversion=`expr \"$VERSION\" : '\\([^ ]*\\)'`\nversion=\"move-if-change (gnulib) $version\nCopyright $year Free Software Foundation, Inc.\nLicense GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>\nThis is free software: you are free to change and redistribute it.\nThere is NO WARRANTY, to the extent permitted by law.\"\n\ncmpprog=${CMPPROG-cmp}\n\nfor arg\ndo\n  case $arg in\n    --help | --hel | --he | --h)\n      exec echo \"$help\" ;;\n    --version | --versio | --versi | --vers | --ver | --ve | --v)\n      exec echo \"$version\" ;;\n    --)\n      shift\n      break ;;\n    -*)\n      echo \"$0: invalid option: $arg\" >&2\n      exit 1 ;;\n    *)\n      break ;;\n  esac\ndone\n\ntest $# -eq 2 || { echo \"$0: $usage\" >&2; exit 1; }\n\nif test -r \"$2\" && $cmpprog -- \"$1\" \"$2\" >/dev/null; then\n  rm -f -- \"$1\"\nelse\n  if mv -f -- \"$1\" \"$2\"; then :; else\n    # Ignore failure due to a concurrent move-if-change.\n    test -r \"$2\" && $cmpprog -- \"$1\" \"$2\" >/dev/null && rm -f -- \"$1\"\n  fi\nfi\n\n## Local Variables:\n## eval: (add-hook 'before-save-hook 'time-stamp)\n## time-stamp-start: \"VERSION='\"\n## time-stamp-format: \"%:y-%02m-%02d %02H:%02M\"\n## time-stamp-time-zone: \"UTC0\"\n## time-stamp-end: \"'; # UTC\"\n## End:\n"
  },
  {
    "path": "build-aux/scripts/skip-if-exec-format-error",
    "content": "#! /usr/bin/perl\n# Run a test given as @ARGV, and then munge its exit code to 77 if it\n# failed because of an \"exec format error.\"\n#\n# Written by Zack Weinberg <zackw at panix.com> in 2017--2020.\n# To the extent possible under law, Zack Weinberg has waived all\n# copyright and related or neighboring rights to this work.\n#\n# See https://creativecommons.org/publicdomain/zero/1.0/ for further\n# details.\n\nuse v5.14;    # implicit use strict; use feature ':5.14';\nuse warnings FATAL => 'all';\nuse utf8;\nuse open qw(:std :utf8);\nno  if $] >= 5.022, warnings => 'experimental::re_strict';\nuse if $] >= 5.022, re       => 'strict';\n\nuse FindBin ();\nuse IPC::Open3 qw(open3);\nuse Symbol qw(gensym);\n\nuse lib $FindBin::Bin;\nuse BuildCommon qw(subprocess_error);\n\n# We cannot simply exec the program and then check $!{ENOEXEC} if that\n# fails, because Perl's `exec` primitive calls execvp(3), and POSIX\n# requires execvp(3) to retry after rewriting the command line as\n# `/bin/sh PROGRAM ARGUMENTS...` if execve(2) fails with ENOEXEC.\n# This is a backward compatibility quirk for the sake of code written\n# before `#!` was a thing; if you ask me, on modern systems it's a\n# misfeature, but the Austin Group seems unwilling to change anything\n# (see https://austingroupbugs.net/view.php?id=1435).  Even if they\n# did, we would be stuck with build-system C libraries that\n# implemented the old bad behavior for many years.\n#\n# There is no way to call execve(2) directly from Perl.  We could\n# implement this program in C, but then we would need $(CC_FOR_BUILD),\n# which currently we do not.  So what we do, is rely on /bin/sh to\n# have some kind of heuristic to detect when it's being asked to\n# interpret a machine-code executable, and to print a recognizable\n# error message when this happens.  This is the same thing the old\n# shell-based implementation did, so we can live with it.\n\nmy $status = eval {\n    my $child_err   = gensym;\n    my $pid         = open3('<&STDIN', '>&STDOUT', $child_err, @ARGV);\n    my $saw_enoexec = 0;\n\n    local $_;\n    while (<$child_err>) {\n        $saw_enoexec = 1\n            if m{\\b(?:\n                   [Ex]ec \\s+ format \\s+ error\n                 | cannot \\s+ execute \\s+ (?:ELF \\s+)? binary\n               )\\b}x;\n        print {*STDERR} $_;\n    }\n    close $child_err or die \"read error: $!\\n\";\n    waitpid $pid, 0 or die \"waitpid: $!\\n\";\n\n    if (my $sig = ($? & 0x7F)) {\n        # subprocess_error knows how to print symbolic names for signals.\n        subprocess_error($ARGV[0]);\n    } else {\n        return 77 if $saw_enoexec;\n        return $? >> 8;\n    }\n};\nexit $status if defined $status;\n\n# We only get here if there was an error.\nmy $err = $@;\n$err =~ s/\\s+ at \\s+ \\S+ \\s+ line \\s+ \\d+ \\.? \\n? \\Z//x;\n$err =~ s/^open3: //;\n\nprint {*STDERR} \"${FindBin::Script}: $err\\n\";\nexit(($err =~ /\\bExec format error\\b/) ? 77 : 99);\n"
  },
  {
    "path": "codecov.yml",
    "content": "ignore:\n  - \"lib/gen-des-tables.c\"\n  - \"test\"\n  - \"/usr/**/*\"\n"
  },
  {
    "path": "configure.ac",
    "content": "# Process this file with autoconf to produce a configure script.\nm4_include([build-aux/m4/zw_automodern.m4])\nAC_INIT([xcrypt],\n        [4.5.3],\n        [https://github.com/besser82/libxcrypt/issues],\n        [libxcrypt],\n        [https://github.com/besser82/libxcrypt])\nAC_CONFIG_MACRO_DIR([build-aux/m4])\nAC_CONFIG_AUX_DIR([build-aux/m4-autogen])\nAC_CONFIG_SRCDIR([lib/crypt.c])\nAC_CONFIG_HEADERS([config.h])\nAC_CONFIG_FILES([\n  Makefile\n  libxcrypt.pc:lib/libxcrypt.pc.in\n])\nAM_INIT_AUTOMAKE([tar-v7])\n\nAH_TOP(\n[#ifndef _CRYPT_CONFIG_H\n#define _CRYPT_CONFIG_H 1])\nAH_BOTTOM(\n[#endif /* config.h */])\n\n# PKG_INSTALLDIR may not be defined, but we have a\n# compatibility replacement.\nm4_pattern_allow([PKG_INSTALLDIR])\nPKG_PROG_PKG_CONFIG_COMPAT([0.27], [PKG_CONFIG=false])\nAS_IF([test x\"$PKG_CONFIG\" != xfalse],\n  [PKG_INSTALLDIR],\n  [PKG_INSTALLDIR_COMPAT])\n\n# Checks for programs.\nAC_CANONICAL_HOST\nAC_PROG_CC\n\n# C99 language and library features are used unconditionally.\n# Don't even try to build with an older compiler.\ncase \"$ac_prog_cc_stdc\" in\n     c89 | no) AC_MSG_ERROR([a C99- or C11-compliant compiler is required]) ;;\nesac\n\nAC_PROG_CPP\nAC_PROG_MAKE_SET\nAC_PROG_LN_S\nzw_PROG_PERL([5.14.0])\nAC_PATH_PROG([GPG2], [gpg2], [false])\nAC_PATH_PROG([SHA256SUM], [sha256sum], [false])\n\nAC_USE_SYSTEM_EXTENSIONS\nAC_SYS_LARGEFILE\nzw_SIMPLE_ENABLE_WARNINGS\nLT_INIT\n\n# The test scripts need to know whether C global symbols have a\n# leading underscore.\nLT_SYS_SYMBOL_USCORE\nif test x$sys_symbol_underscore = xno; then\n  SYMBOL_PREFIX=\nelse\n  SYMBOL_PREFIX=_\nfi\nAC_SUBST([SYMBOL_PREFIX])\n\n# One of the test scripts needs to use -dD.\nAC_CACHE_CHECK([whether the preprocessor ($CPP) supports -dD],\n  [ac_cv_prog_cpp_dD],\n  [printf '#include <errno.h>' |\n    $CPP -dD -xc - > conftest.i 2>&AS_MESSAGE_LOG_FD\n  if test $? -ne 0; then\n    ac_cv_prog_cpp_dD=no\n  elif grep '#define EDOM' conftest.i > /dev/null 2>&1; then\n    ac_cv_prog_cpp_dD=yes\n  else\n    ac_cv_prog_cpp_dD=no\n  fi\n  rm -f conftest.i\n])\nAC_SUBST([HAVE_CPP_dD], [$ac_cv_prog_cpp_dD])\n\n# Some of the tests need to be conditionally compiled depending on\n# whether ASan is active.\nAC_CACHE_CHECK([whether we are compiling with ASan],\n  [ac_cv_c_address_sanitizer],\n  [zw_ASAN_IFELSE(\n    [ac_cv_c_address_sanitizer=yes],\n    [ac_cv_c_address_sanitizer=no])])\nif test x$ac_cv_c_address_sanitizer = xyes; then\n  AC_DEFINE([XCRYPT_USE_ASAN], [1],\n    [Define when compiling with ASan.  Only affects tests.])\nfi\n\n# Checks for libraries: currently none needed.\n\n# Checks for header files.\nAC_CHECK_HEADERS_ONCE([\n  fcntl.h\n  stdbool.h\n  ucontext.h\n  sys/cdefs.h\n  sys/random.h\n  sys/syscall.h\n  valgrind/valgrind.h\n])\n\n# stdint.h and inttypes.h were checked for by AC_INCLUDES_DEFAULT,\n# invoked implicitly by the above.\nif test $ac_cv_header_stdbool_h != yes ||\n   test $ac_cv_header_stdint_h != yes ||\n   test $ac_cv_header_inttypes_h != yes; then\n   AC_MSG_ERROR([a C99- or C11-compliant runtime library is required])\nfi\n\n# Checks for the specific things that we need from sys/cdefs.h, which\n# might or might not be there (there's no standard for this header).\nAS_IF([test $ac_cv_header_sys_cdefs_h = yes],\n  [AC_CACHE_CHECK([whether sys/cdefs.h defines __BEGIN_DECLS and __END_DECLS],\n                 [ac_cv_header_sys_cdefs_begin_end_decls], [\n    AC_COMPILE_IFELSE([AC_LANG_SOURCE([[\n#include <sys/cdefs.h>\n__BEGIN_DECLS\nextern int foo(void);\n__END_DECLS\n    ]])],\n    [ac_cv_header_sys_cdefs_begin_end_decls=yes],\n    [ac_cv_header_sys_cdefs_begin_end_decls=no])\n  ])\n  AC_CACHE_CHECK([whether sys/cdefs.h defines __THROW],\n                 [ac_cv_header_sys_cdefs_THROW], [\n    AC_COMPILE_IFELSE([AC_LANG_SOURCE([[\n#include <sys/cdefs.h>\nextern void foo(void) __THROW;\n    ]])],\n    [ac_cv_header_sys_cdefs_THROW=yes],\n    [ac_cv_header_sys_cdefs_THROW=no])\n  ])],\ndnl AS_IF else\n [ac_cv_header_sys_cdefs_begin_end_decls=no\n  ac_cv_header_sys_cdefs_THROW=no])\n\nif test $ac_cv_header_sys_cdefs_begin_end_decls = yes; then\n  AC_DEFINE([HAVE_SYS_CDEFS_BEGIN_END_DECLS], 1,\n    [Define if <sys/cdefs.h> defines __BEGIN_DECLS and __END_DECLS.])\nfi\nif test $ac_cv_header_sys_cdefs_THROW = yes; then\n  AC_DEFINE([HAVE_SYS_CDEFS_THROW], 1,\n    [Define if <sys/cdefs.h> defines __THROW.])\nfi\n\n# Checks for typedefs, structures, and compiler characteristics.\nzw_C_ALIGNAS\nzw_C_ALIGNOF\nzw_C_MAX_ALIGN_T\nzw_C_ENDIANNESS\nzw_C_STATIC_ASSERT\nzw_PROG_LD_WRAP\nAX_CHECK_VSCRIPT\nAX_GCC_FUNC_ATTRIBUTE(symver)\n\n# FIXME: This only checks whether the linker accepts either\n# -Wl,-z,defs or -Wl,--no-undefined.  It doesn't check that the switch\n# actually does what we want it to do.\nAC_CACHE_CHECK([how to make linking fail when undefined symbols remain],\n  [ac_cv_ld_no_undefined], [\n  ac_cv_ld_no_undefined=unknown\n  SAVED_LDFLAGS=\"$LDFLAGS\"\n  LDFLAGS=\"$SAVED_LDFLAGS -Wl,-z,defs\"\n  AC_LINK_IFELSE([AC_LANG_PROGRAM([], [int i = 1;])],\n    [ac_cv_ld_no_undefined=-Wl,-z,defs])\n  if test \"x$ac_cv_ld_no_undefined\" = xunknown; then\n    LDFLAGS=\"$SAVED_LDFLAGS -Wl,--no-undefined\"\n    AC_LINK_IFELSE([AC_LANG_PROGRAM([], [int i = 1;])],\n      [ac_cv_ld_no_undefined=-Wl,--no-undefined])\n  fi\n  LDFLAGS=\"$SAVED_LDFLAGS\"])\n\nUNDEF_FLAG=\nif test \"x$ac_cv_ld_no_undefined\" != xunknown; then\n  UNDEF_FLAG=\"$ac_cv_ld_no_undefined\"\nfi\nAC_SUBST([UNDEF_FLAG])\n\n# FIXME: This only checks whether the linker accepts -Wl,-z,text.\n# It doesn't check that the switch actually does what we want it to do.\nAC_CACHE_CHECK([how to make linking fail when there are text relocations],\n  [ac_cv_ld_no_textrel], [\n  ac_cv_ld_no_textrel=unknown\n  SAVED_LDFLAGS=\"$LDFLAGS\"\n  LDFLAGS=\"$SAVED_LDFLAGS -Wl,-z,text\"\n  AC_LINK_IFELSE([AC_LANG_PROGRAM([], [int i = 1;])],\n    [ac_cv_ld_no_textrel=-Wl,-z,text])\n  LDFLAGS=\"$SAVED_LDFLAGS\"])\n\nTEXT_RELOC_FLAG=\nif test \"x$ac_cv_ld_no_textrel\" != xunknown; then\n  TEXT_RELOC_FLAG=\"$ac_cv_ld_no_textrel\"\nfi\nAC_SUBST([TEXT_RELOC_FLAG])\n\n# FIXME: This only checks whether the linker accepts -Wl,-z,relro.\n# It doesn't check that the switch actually does what we want it to do.\nAC_CACHE_CHECK([how to link with read-only relocations],\n  [ac_cv_ld_relro], [\n  ac_cv_ld_relro=unknown\n  SAVED_LDFLAGS=\"$LDFLAGS\"\n  LDFLAGS=\"$SAVED_LDFLAGS -Wl,-z,relro\"\n  AC_LINK_IFELSE([AC_LANG_PROGRAM([], [int i = 1;])],\n    [ac_cv_ld_relro=-Wl,-z,relro])\n  LDFLAGS=\"$SAVED_LDFLAGS\"])\n\nRELRO_FLAG=\nif test \"x$ac_cv_ld_relro\" != xunknown; then\n  RELRO_FLAG=\"$ac_cv_ld_relro\"\nfi\nAC_SUBST([RELRO_FLAG])\n\n# FIXME: This only checks whether the linker accepts -Wl,-z,now.\n# It doesn't check that the switch actually does what we want it to do.\nAC_CACHE_CHECK([how to link with immediate binding],\n  [ac_cv_ld_now], [\n  ac_cv_ld_now=unknown\n  SAVED_LDFLAGS=\"$LDFLAGS\"\n  LDFLAGS=\"$SAVED_LDFLAGS -Wl,-z,now\"\n  AC_LINK_IFELSE([AC_LANG_PROGRAM([], [int i = 1;])],\n    [ac_cv_ld_now=-Wl,-z,now])\n  LDFLAGS=\"$SAVED_LDFLAGS\"])\n\nBINDNOW_FLAG=\nif test \"x$ac_cv_ld_now\" != xunknown; then\n  BINDNOW_FLAG=\"$ac_cv_ld_now\"\nfi\nAC_SUBST([BINDNOW_FLAG])\n\n# FIXME: This only checks whether the compiler accepts -fno-plt.\n# It doesn't check that the switch actually does what we want it to do.\nAX_APPEND_COMPILE_FLAGS([-fno-plt], [OPTI_FLAGS], [$WARN_CFLAGS])\n\n# Export compiler flags for optimization.\nAC_SUBST([OPTI_FLAGS])\n\n# Checks for library functions.\nAC_CHECK_FUNCS_ONCE([\n  arc4random_buf\n  explicit_bzero\n  explicit_memset\n  getentropy\n  getrandom\n  memset_explicit\n  memset_s\n  open64\n  syscall\n])\n\n# Disable valgrind tools for checking multithreaded\n# programs, as we don't use them in checks.\nAX_VALGRIND_DFLT([drd], [off])\nAX_VALGRIND_DFLT([helgrind], [off])\n\n# Valgrind's sgcheck is b0rk3n upstream.\nAX_VALGRIND_DFLT([sgcheck], [off])\n\n# Add a target to run testsuite with valgrind.\nAX_VALGRIND_CHECK()\n\n# Requirements for running test/ka-table-gen.py.\nAC_CACHE_CHECK([for Python 3.>=6 with Passlib],\n  [ac_cv_path_python3_passlib],\n  [AC_PATH_PROGS_FEATURE_CHECK([python3_passlib],\n     [python3 m4_for([minor], 11, 6, -1, [[python3.]minor ]) python],\n     [_AS_ECHO_LOG([trying $ac_path_python3_passlib...])\nAS_IF([$ac_path_python3_passlib -c '\nimport sys\nif sys.version_info < (3,6,0):\n    sys.stderr.write(\"too old: \" + sys.version + \"\\n\")\n    sys.exit(1)\nimport passlib\n' >&AS_MESSAGE_LOG_FD 2>&1],\n        [ac_cv_path_python3_passlib=$ac_path_python3_passlib\n         ac_path_python3_passlib_found=:])],\n     [ac_cv_path_python3_passlib=\"not found\"])])\nif test x\"$ac_cv_path_python3_passlib\" = x\"not found\"; then\n  PYTHON=false\n  AC_MSG_NOTICE(\n    [Disabling the \"regen-ka-table\" target, missing Python requirements.])\nelse\n  PYTHON=\"$ac_cv_path_python3_passlib\"\nfi\nAC_SUBST([PYTHON])\nAM_CONDITIONAL([ENABLE_KA_TABLE_GEN], [test x\"$PYTHON\" != \"xfalse\"])\n\n# The ucontext.h functions that we use were withdrawn from\n# POSIX.1-2008, so the existence of the header does not prove\n# we can use the functions.\nAS_IF([test $ac_cv_header_ucontext_h = yes],\n  [AC_CACHE_CHECK([whether all ucontext.h functions are available],\n     [ac_cv_header_ucontext_h_fns_available],\n     [AC_LINK_IFELSE([AC_LANG_PROGRAM([[\n// This code isn't intended to make sense; it just validates the\n// type signature of all four context functions, and avoids tripping\n// any of the many warnings we may have active.\n#include <ucontext.h>\nstatic int x;\nstatic void fn1(void) {}\n]], [[\n  ucontext_t uc1, uc2;\n  if (getcontext(&uc1)) return 1;\n  if (setcontext(&uc1)) return 1;\n  makecontext(&uc1, fn1, 0);\n  if (swapcontext(&uc1, &uc2)) return 1;\n  return x;\n]])],\n        [ac_cv_header_ucontext_h_fns_available=yes],\n        [ac_cv_header_ucontext_h_fns_available=no])])],\n  [ac_cv_header_ucontext_h_fns_available=no])\n\nif test $ac_cv_header_ucontext_h_fns_available = yes; then\n  AC_DEFINE([USE_SWAPCONTEXT], 1,\n    [Define to 1 if getcontext, setcontext, makecontext, and swapcontext are\n     available from ucontext.h without deprecation warnings.])\nfi\n\n# Configure options.\nAC_ARG_ENABLE([failure-tokens],\n    AS_HELP_STRING(\n        [--disable-failure-tokens],\n        [Make crypt and crypt_r return NULL on failure, instead of a\n         special \"failure token\" string that isn't the hash of any\n         passphrase.  This matches the behavior of several other\n         crypt implementations, but will break programs that assume these\n         functions never return NULL.  crypt_rn and crypt_ra are not affected\n         by this option, and will always return NULL on failure.]\n    ),\n    [case \"$enableval\" in\n      yes) enable_failure_tokens=1;;\n       no) enable_failure_tokens=0;;\n        *) AC_MSG_ERROR([bad value ${enableval} for --enable-failure-tokens]);;\n     esac],\n    [enable_failure_tokens=1])\nAC_DEFINE_UNQUOTED([ENABLE_FAILURE_TOKENS], [$enable_failure_tokens],\n  [Define to 1 if crypt and crypt_r should return a \"failure token\" on\n   failure, or 0 if they should return NULL.])\n\nAC_ARG_ENABLE([xcrypt-compat-files],\n    AS_HELP_STRING(\n        [--disable-xcrypt-compat-files],\n        [Disable the installation of the <xcrypt.h> header file and the\n         libxcrypt.{a,so} compatibility symlinks.]\n    ),\n    [case \"$enableval\" in\n      yes) enable_xcrypt_compat_files=1;;\n       no) enable_xcrypt_compat_files=0;;\n        *) AC_MSG_ERROR([bad value ${enableval} for --enable-xcrypt-compat-files]);;\n     esac],\n    [enable_xcrypt_compat_files=1])\n\nAC_ARG_ENABLE([obsolete-api],\n    AS_HELP_STRING(\n        [--enable-obsolete-api[=ARG]],\n        [When set to \"yes\", include all compatibility interfaces.\n         When set to \"alt\", include interfaces for compatibility with ALT.\n         When set to \"glibc\", include interfaces for compatibility with glibc.\n         When set to \"owl\", include interfaces for compatibility with Owl.\n         When set to \"suse\", include interfaces for compatibility with SUSE.\n         When set to \"no\", do not include any compatibility definitions at all,\n         and change the soname of the installed library to libcrypt.so.2.\n         This setting only affects existing binaries; new programs cannot\n         be linked against the obsolete APIs (bigcrypt, fcrypt, encrypt, setkey)\n         in any case. [default=yes]]\n    ),\n    [enableval=\"`AS_ECHO(\"$enableval\") |\n       $SED -e 'y!ABCDEFGHIJKLMNOPQRSTUVWXYZ-!abcdefghijklmnopqrstuvwxyz_!'`\"\n     case \"${enableval}\" in\n        alt|glibc|owl)\n            enable_obsolete_api=1\n            enable_compat_suse=0\n            COMPAT_ABI=${enableval} ;;\n        yes|suse)\n            enable_obsolete_api=1\n            enable_compat_suse=1\n            COMPAT_ABI=${enableval} ;;\n         no)\n            enable_obsolete_api=0\n            enable_compat_suse=0\n            COMPAT_ABI=${enableval} ;;\n          *) AC_MSG_ERROR([bad value ${enableval} for --enable-obsolete-api]) ;;\n     esac],\n     [enable_obsolete_api=1\n      enable_compat_suse=1\n      COMPAT_ABI=yes]\n)\nAC_SUBST(COMPAT_ABI)\n\nAC_ARG_ENABLE([obsolete-api-enosys],\n    AS_HELP_STRING(\n        [--enable-obsolete-api-enosys[=ARG]],\n        [If set to \"yes\", this option replaces the obsolete APIs\n         (fcrypt, encrypt{,_r}, and setkey{,_r}) with stubs that\n         set errno to ENOSYS and return without performing any real\n         operations.  This allows one to disable descrypt support\n         while preserving POSIX compliance.  For security reasons,\n         the encrypt{,r} functions will also overwrite their data-block\n         argument with random bits.  The fcrypt function will always\n         produce a failure token (*0 or *1), unless the library was\n         also configured with --disable-failure-tokens, in which case\n         it will always return NULL. [default=no]]\n    ),\n    [case \"$enableval\" in\n      yes) enable_obsolete_api_enosys=1;;\n       no) enable_obsolete_api_enosys=0;;\n        *) AC_MSG_ERROR([bad value ${enableval} for --enable-obsolete-api-enosys]);;\n     esac],\n    [enable_obsolete_api_enosys=0])\n\nAC_ARG_ENABLE([hashes],\n    AS_HELP_STRING(\n        [--enable-hashes=HASHES],\n        [Select hash methods to support.  Acceptable values are\n         'all' or a comma-separated list of names from the file\n         'hashes.conf' and/or the keywords 'strong', 'alt',\n         'fedora', 'freebsd', 'glibc', 'netbsd', 'openbsd',\n         'osx', 'owl', 'solaris', and 'suse' which select groups\n         of methods as described in that file.\n         The default is 'all'.\n         Note: if binary compatibility with any historic libcrypt is\n         desired (i.e. any --enable-obsolete-api setting other than\n         'no'), the 'descrypt' hash must be enabled.]),\n    [hashes_selected=\"`AS_ECHO(\"$enableval\") |\n      $SED -e 'y!ABCDEFGHIJKLMNOPQRSTUVWXYZ-!abcdefghijklmnopqrstuvwxyz_!'`\"],\n    [hashes_selected=all]\n)\n# This code must run after $PERL is set.\nhashes_enabled=$(\n    $PERL \"$srcdir\"/build-aux/scripts/expand-selected-hashes \\\n          \"$srcdir\"/lib/hashes.conf \\\n          \"$hashes_selected\"\n)\nif test x\"$hashes_enabled\" = x || test x\"$hashes_enabled\" = x,; then\n    AC_MSG_ERROR([bad value '${hashes_selected}' for --enable-hashes])\nfi\nAC_SUBST([hashes_enabled])\n\n\n# If the traditional DES hash is disabled, then the obsolete APIs are\n# implicitly disabled, except when stubs are requested.\ncase \"$hashes_enabled\" in\n    *,descrypt,*) ;;\n    *)\n       if test x\"$COMPAT_ABI\" != xno && \\\n          test x\"$enable_obsolete_api_enosys\" != x1; then\n         AC_MSG_WARN(\n           [--enable-hashes=${hashes_selected} forces --enable-obsolete-api=no])\n         enable_obsolete_api=0\n         enable_compat_suse=0\n         COMPAT_ABI=no\n       fi\n       ;;\nesac\n\n# If the obsolete APIs are disabled, the stubs implicitly disabled as well.\nif test x\"$COMPAT_ABI\" = xno && test x\"$enable_obsolete_api_enosys\" = x1; then\n  AC_MSG_WARN(\n    [--enable-obsolete-api=no implies --enable-obsolete-api-enosys=no.])\n  enable_obsolete_api_enosys=0\nfi\n\n# Export the value for ENABLE_OBSOLETE_API_ENOSYS.\nAC_DEFINE_UNQUOTED([ENABLE_OBSOLETE_API_ENOSYS], [$enable_obsolete_api_enosys],\n  [Define to 1 if fcrypt, encrypt{,_r}, setkey{,_r} should set errno to ENOSYS,\n   or 0 if they should perform real operations.])\n\n# The obsolete APIs are unconditionally excluded from the static library,\n# so if we are not building the shared library, we are effectively not\n# building obsolete APIs, and we shouldn't try to test them.\nif test x$enable_shared != xyes; then enable_obsolete_api=0; fi\n\n# Determine whether there's even a GNU libc on this system that we\n# need to be binary backward compatible with.\nif test $enable_obsolete_api = 1; then\n  AC_MSG_CHECKING([minimum symbol version to use for compatibility symbols])\n  SYMVER_FLOOR=$(\n    export CC\n    $PERL \"$srcdir\"/build-aux/scripts/compute-symver-floor \\\n      \"$srcdir\"/lib/libcrypt.minver $host_os $host_cpu \\\n    2>&AS_MESSAGE_LOG_FD\n  )\n  AC_MSG_RESULT([$SYMVER_FLOOR])\n  case \"$SYMVER_FLOOR\" in\n    '')\n      AC_MSG_ERROR([compute-symver-floor failed, see config.log for details])\n    ;;\n    ERROR)\n      AC_MSG_ERROR([libxcrypt port to $host is incomplete])\n    ;;\n    XCRYPT_2.0)\n      SYMVER_MIN=XCRYPT_2.0\n      enable_obsolete_api=0\n      enable_obsolete_api_enosys=0\n      enable_compat_suse=0\n      COMPAT_API=no\n    ;;\n    *)\n      SYMVER_MIN=GLIBC_2.0\n    ;;\n  esac\nelse\n  SYMVER_FLOOR=XCRYPT_2.0\n  SYMVER_MIN=XCRYPT_2.0\nfi\nAC_SUBST([SYMVER_FLOOR])\nAC_SUBST([SYMVER_MIN])\n\n# If symbol versioning is disabled for any reason, we should not rely on\n# versioned symbols in the testsuite.\nhave_symver=0\nif test x$ax_check_vscript_flag != x; then have_symver=1; fi\n\nAC_DEFINE_UNQUOTED([HAVE_SYMVER], [$have_symver],\n  [Define as 1 if symbol versioning is enabled and applied.])\n\n# If we are not building the obsolete APIs then we shouldn't install\n# xcrypt.h or the compatibility symlinks either.\nif test $enable_obsolete_api = 0; then enable_xcrypt_compat_files=0; fi\n\nAC_DEFINE_UNQUOTED([SYMVER_FLOOR], [$SYMVER_FLOOR],\n  [Define as the lowest compatibility symbol version that is actually\n   included in libcrypt.so.])\n\nAC_DEFINE_UNQUOTED([ENABLE_OBSOLETE_API], [$enable_obsolete_api],\n [Define as 1 if the obsolete APIs (fcrypt, encrypt, setkey)\n  should be included, 0 otherwise.])\n\nAM_CONDITIONAL([ENABLE_OBSOLETE_API], [test $enable_obsolete_api = 1])\nAM_CONDITIONAL([ENABLE_COMPAT_SUSE], [test $enable_compat_suse = 1])\nAM_CONDITIONAL([ENABLE_XCRYPT_COMPAT_FILES],\n               [test $enable_xcrypt_compat_files = 1])\n\n# The Makefile needs to know which versions of the library we are building.\nAM_CONDITIONAL([ENABLE_STATIC], [test $enable_static = yes])\nAM_CONDITIONAL([ENABLE_SHARED], [test $enable_shared = yes])\n\n# The Makefile needs to know if we are cross-compiling.\nAM_CONDITIONAL([CROSS_COMPILING], [test $cross_compiling = yes])\n\nXCRYPT_VERSION_MAJOR=`echo $PACKAGE_VERSION | cut -d. -f1`\nAC_SUBST([XCRYPT_VERSION_MAJOR])\n\nXCRYPT_VERSION_MINOR=`echo $PACKAGE_VERSION | cut -d. -f2`\nAC_SUBST([XCRYPT_VERSION_MINOR])\n\nAC_OUTPUT\n"
  },
  {
    "path": "doc/crypt.3",
    "content": ".\\\" Written and revised by Solar Designer <solar at openwall.com> in 2000-2011.\n.\\\" Revised by Zack Weinberg <zackw at panix.com> in 2017.\n.\\\" Converted to mdoc format by Zack Weinberg in 2018.\n.\\\"\n.\\\" No copyright is claimed, and this man page is hereby placed in the public\n.\\\" domain.  In case this attempt to disclaim copyright and place the man page\n.\\\" in the public domain is deemed null and void, then the man page is\n.\\\" Copyright 2000-2011 Solar Designer, 2017, 2018 Zack Weinberg, and it is\n.\\\" hereby released to the general public under the following terms:\n.\\\"\n.\\\" Redistribution and use in source and binary forms, with or without\n.\\\" modification, are permitted.\n.\\\"\n.\\\" There's ABSOLUTELY NO WARRANTY, express or implied.\n.\\\"\n.Dd October 11, 2017\n.Dt CRYPT 3\n.Os \"Openwall Project\"\n.Sh NAME\n.Nm crypt , crypt_r , crypt_rn , crypt_ra\n.Nd passphrase hashing\n.Sh LIBRARY\n.Lb libcrypt\n.Sh SYNOPSIS\n.In crypt.h\n.Ft \"char *\"\n.Fo crypt\n.Fa \"const char *phrase\"\n.Fa \"const char *setting\"\n.Fc\n.Ft \"char *\"\n.Fo crypt_r\n.Fa \"const char *phrase\"\n.Fa \"const char *setting\"\n.Fa \"struct crypt_data *data\"\n.Fc\n.Ft \"char *\"\n.Fo crypt_rn\n.Fa \"const char *phrase\"\n.Fa \"const char *setting\"\n.Fa \"struct crypt_data *data\"\n.Fa \"int size\"\n.Fc\n.Ft \"char *\"\n.Fo crypt_ra\n.Fa \"const char *phrase\"\n.Fa \"const char *setting\"\n.Fa \"void **data\"\n.Fa \"int *size\"\n.Fc\n.Sh DESCRIPTION\nThe\n.Nm crypt ,\n.Nm crypt_r ,\n.Nm crypt_rn ,\nand\n.Nm crypt_ra\nfunctions irreversibly\n.Dq hash\n.Fa phrase\nfor storage in the system password database\n.Pq Xr shadow 5\nusing a cryptographic\n.Dq hashing method.\nThe result of this operation is called a\n.Dq hashed passphrase\nor just a\n.Dq hash.\nHashing methods are described in\n.Xr crypt 5 .\n.Pp\n.Fa setting\ncontrols which hashing method to use,\nand also supplies various parameters to the chosen method,\nmost importantly a random\n.Dq salt\nwhich ensures that no two stored hashes are the same,\neven if the\n.Fa phrase\nstrings are the same.\n.Pp\nThe\n.Fa data\nargument to\n.Nm crypt_r\nis a structure of type\n.Vt \"struct crypt_data\" .\nIt has at least these fields:\n.Bd -literal -offset indent\nstruct crypt_data {\n    char output[CRYPT_OUTPUT_SIZE];\n    char setting[CRYPT_OUTPUT_SIZE];\n    char input[CRYPT_MAX_PASSPHRASE_SIZE];\n    char initialized;\n};\n.Ed\n.Pp\nUpon a successful return from\n.Nm crypt_r ,\nthe hashed passphrase will be stored in\n.Fa output .\nApplications are encouraged, but not required, to use the\n.Fa input\nand\n.Fa setting\nfields to store the strings that they will pass as\n.Fa input phrase\nand\n.Fa setting\nto\n.Nm crypt_r .\nThis will make it easier to erase all sensitive data\nafter it is no longer needed.\n.Pp\nThe\n.Fa initialized\nfield must be set to zero before the first time a\n.Vt \"struct crypt_data\"\nobject is first used in a call to\n.Fn crypt_r .\nWe recommend zeroing the entire object,\nnot just\n.Fa initialized\nand not just the documented fields,\nbefore the first use.\n(Of course, do this before storing anything in\n.Fa setting\nand\n.Fa input . )\n.Pp\nThe\n.Fa data\nargument to\n.Nm crypt_rn\nshould also point to a\n.Vt \"struct crypt_data\"\nobject, and\n.Fa size\nshould be the size of that object, cast to\n.Vt int .\nWhen used with\n.Nm crypt_rn ,\nthe entire\n.Fa data\nobject (except for the\n.Fa input\nand\n.Fa setting\nfields) must be zeroed before its first use;\nthis is not just a recommendation, as it is for\n.Nm crypt_r .\nOtherwise, the fields of the object have the same uses that they do for\n.Nm crypt_r .\n.Pp\nOn the first call to\n.Nm crypt_ra ,\n.Fa data\nshould be the address of a\n.Vt \"void *\"\nvariable set to NULL, and\n.Fa size\nshould be the address of an\n.Vt int\nvariable set to zero.\n.Nm crypt_ra\nwill allocate and initialize a\n.Vt \"struct crypt_data\"\nobject, using\n.Xr malloc 3 ,\nand write its address and size into the variables pointed to by\n.Fa data\nand\n.Fa size .\nThese can be reused in subsequent calls.\nAfter the application is done hashing passphrases,\nit should deallocate the\n.Vt \"struct crypt_data\"\nobject using\n.Xr free 3 .\n.Sh RETURN VALUES\nUpon successful completion,\n.Nm crypt ,\n.Nm crypt_r ,\n.Nm crypt_rn ,\nand\n.Nm crypt_ra\nreturn a pointer to a string which encodes both the hashed passphrase,\nand the settings that were used to encode it.\nThis string is directly usable as\n.Fa setting\nin other calls to\n.Nm crypt ,\n.Nm crypt_r ,\n.Nm crypt_rn ,\nand\n.Nm crypt_ra ,\nand as\n.Fa prefix\nin calls to\n.Nm crypt_gensalt ,\n.Nm crypt_gensalt_rn ,\nand\n.Nm crypt_gensalt_ra .\nIt will be entirely printable ASCII,\nand will not contain whitespace\nor the characters\n.Sq Li \\&: ,\n.Sq Li \\&; ,\n.Sq Li \\&* ,\n.Sq Li \\&! ,\nor\n.Sq Li \\&\\e .\nSee\n.Xr crypt 5\nfor more detail on the format of hashed passphrases.\n.Pp\n.Nm crypt\nplaces its result in a static storage area,\nwhich will be overwritten by subsequent calls to\n.Nm crypt .\nIt is not safe to call\n.Nm crypt\nfrom multiple threads simultaneously.\nIt's also not recommended to use the pointer\nreturned as an argument for another call to\n.Nm crypt ,\nas some implementations, including earlier\nreleases of libxcrypt, may overwrite the underlying\nstatic output buffer before computing the hash.\n.Pp\n.Nm crypt_r ,\n.Nm crypt_rn ,\nand\n.Nm crypt_ra\nplace their result in the\n.Fa output\nfield of their\n.Fa data\nargument.\nIt is safe to call them from multiple threads simultaneously,\nas long as a separate\n.Fa data\nobject is used for each thread.\nIt's also not recommended to use the pointer\nreturned as an argument for another call to\n.Nm crypt_r ,\n.Nm crypt_rn ,\nand\n.Nm crypt_ra\nusing the same\n.Fa data\nobject for subsequent calls, as some implementations,\nincluding earlier releases of libxcrypt, may overwrite the\n.Fa output\nfield of the passed\n.Fa data\nargument before computing the hash.\nCalling\n.Nm crypt_ra\nwith the\n.Fa phrase\nand/or\n.Fa setting\nparameters located within a passed\n.Fa data\nobject which is smaller than the size of\n.Vt \"struct crypt_data\"\nis not recommended, as some implementations, including\nearlier releases of libxcrypt, may not preserve the\npassed literals, if the\n.Fa data\nobject needs to be altered.\n.Pp\nUpon error,\n.Nm crypt_r ,\n.Nm crypt_rn ,\nand\n.Nm crypt_ra\nwrite an\n.Em invalid\nhash to the\n.Fa output\nfield of their\n.Fa data\nargument, and\n.Nm crypt\nwrites an invalid hash to its static storage area.\nThis string will be shorter than 13 characters,\nwill begin with a\n.Sq Li \\&* ,\nand will not compare equal to\n.Fa setting .\n.Pp\nUpon error,\n.Nm crypt_rn\nand\n.Nm crypt_ra\nreturn a null pointer.\n.Nm crypt_r\nand\n.Nm crypt\nmay also return a null pointer,\nor they may return a pointer to the invalid hash,\ndepending on how libcrypt was configured.\n(The option to return the invalid hash is for compatibility\nwith old applications that assume that\n.Nm crypt\ncannot return a null pointer.\nSee\n.Sx PORTABILITY NOTES\nbelow.)\n.Pp\nAll four functions set\n.Va errno\nwhen they fail.\nWhen the functions succeed, the value of\n.Va errno\nis unspecified and must not be relied upon.\n.Sh ERRORS\n.Bl -tag -width Er\n.It Er EINVAL\n.Fa setting\nis invalid, or requests a hashing method that is not supported.\n.It Er ERANGE\n.Fa phrase\nis too long\n(more than\n.Dv CRYPT_MAX_PASSPHRASE_SIZE\ncharacters; some hashing methods may have lower limits).\n.br\n.Nm crypt_rn\nonly:\n.Fa size\nis too small for the hashing method requested by\n.Fa setting .\n.It Er ENOMEM\nFailed to allocate internal scratch memory.\n.br\n.Nm crypt_ra\nonly: failed to allocate memory for\n.Fa data .\n.It Er ENOSYS No or Er EOPNOTSUPP\nHashing passphrases is not supported at all on this installation,\nor the hashing method requested by\n.Fa setting\nis not supported.\nThese error codes are not used by this version of libcrypt,\nbut may be encountered on other systems.\n.El\n.Sh PORTABILITY NOTES\n.Nm crypt\nis included in POSIX, but\n.Nm crypt_r ,\n.Nm crypt_rn ,\nand\n.Nm crypt_ra\nare not part of any standard.\n.Pp\nPOSIX does not specify any hashing methods,\nand does not require hashed passphrases to be portable between systems.\nIn practice, hashed passphrases are portable\nas long as both systems support the hashing method that was used.\nHowever, the set of supported hashing methods\nvaries considerably from system to system.\n.Pp\nThe behavior of\n.Nm crypt\non errors isn't well standardized.\nSome implementations simply can't fail\n(except by crashing the program),\nothers return a null pointer or a fixed string.\nMost implementations don't set\n.Va errno ,\nbut some do.\nPOSIX specifies returning a null pointer and setting\n.Va errno ,\nbut it defines only one possible error,\n.Er ENOSYS ,\nin the case where\n.Nm crypt\nis not supported at all.\nSome older applications are not prepared to handle null pointers\nreturned by\n.Nm crypt .\nThe behavior described above for this implementation,\nsetting\n.Va errno\nand returning an invalid hash different from\n.Fa setting ,\nis chosen to make these applications fail closed when an error occurs.\n.Pp\nDue to historical restrictions\non the export of cryptographic software from the USA,\n.Nm crypt\nis an optional POSIX component.\nApplications should therefore be prepared for\n.Nm crypt\nnot to be available,\nor to always fail (setting\n.Va errno\nto\n.Er ENOSYS )\nat runtime.\n.Pp\nPOSIX specifies that\n.Nm crypt\nis declared in\n.In unistd.h ,\nbut only if the macro\n.Dv _XOPEN_CRYPT\nis defined and has a value greater than or equal to zero.\nSince libcrypt does not provide\n.In unistd.h ,\nit declares\n.Nm crypt ,\n.Nm crypt_r ,\n.Nm crypt_rn ,\nand\n.Nm crypt_ra\nin\n.In crypt.h\ninstead.\n.Pp\nOn a minority of systems (notably recent versions of Solaris),\n.Nm crypt\nuses a thread-specific static storage buffer,\nwhich makes it safe to call from multiple threads simultaneously,\nbut does not prevent each call within a thread\nfrom overwriting the results of the previous one.\n.Sh BUGS\nSome implementations of\n.Nm crypt ,\nupon error,\nreturn an invalid hash that is stored in a read-only location\nor only initialized once,\nwhich means that it is only safe to erase the buffer pointed to by the\n.Nm crypt\nreturn value if an error did not occur.\n.Pp\n.Vt \"struct crypt_data\"\nmay be quite large (32kB in this implementation of libcrypt;\nover 128kB in some other implementations).\nThis is large enough that it may be unwise to allocate it on the stack.\n.Pp\nSome recently designed hashing methods need even more scratch memory,\nbut the\n.Nm crypt_r\ninterface makes it impossible to change the size of\n.Vt \"struct crypt_data\"\nwithout breaking binary compatibility.\nThe\n.Nm crypt_rn\ninterface could accommodate larger allocations for specific hashing methods,\nbut the caller of\n.Nm crypt_rn\nhas no way of knowing how much memory to allocate.\n.Nm crypt_ra\ndoes the allocation itself,\nbut can only make a single call to\n.Xr malloc 3 .\n.Sh ATTRIBUTES\nFor an explanation of the terms used in this section, see\n.Xr attributes 7 .\n.TS\nallbox;\nlb lb lb\nl l l.\nInterface\tAttribute\tValue\nT{\n.Nm crypt\nT}\tThread safety\tMT-Unsafe race:crypt\nT{\n.Nm crypt_r ,\n.Nm crypt_rn ,\n.Nm crypt_ra\nT}\tThread safety\tMT-Safe\n.TE\n.sp\n.Sh HISTORY\nA rotor-based\n.Nm crypt\nfunction appeared in\n.At v6 .\nThe\n.Dq traditional\nDES-based\n.Nm crypt\nfirst appeared in\n.At v7 .\n.Pp\n.Nm crypt_r\noriginates with the GNU C Library.\nThere's also a\n.Nm crypt_r\nfunction on HP-UX and MKS Toolkit, but the prototypes and semantics\ndiffer.\n.Pp\n.Nm crypt_rn\nand\n.Nm crypt_ra\noriginate with the Openwall project.\n.Sh SEE ALSO\n.Xr crypt_gensalt 3 ,\n.Xr getpass 3 ,\n.Xr getpwent 3 ,\n.Xr shadow 3 ,\n.Xr login 1 ,\n.Xr passwd 1 ,\n.Xr crypt 5 ,\n.Xr passwd 5 ,\n.Xr shadow 5 ,\n.Xr pam 8\n"
  },
  {
    "path": "doc/crypt.5",
    "content": ".\\\" Written and revised by Solar Designer <solar at openwall.com> in 2000-2024.\n.\\\" Revised by Zack Weinberg <zackw at panix.com> in 2017.\n.\\\" Converted to mdoc format by Zack Weinberg in 2018.\n.\\\"\n.\\\" No copyright is claimed, and this man page is hereby placed in the public\n.\\\" domain.  In case this attempt to disclaim copyright and place the man page\n.\\\" in the public domain is deemed null and void, then the man page is\n.\\\" Copyright 2000-2011 Solar Designer, 2017 Zack Weinberg, and it is\n.\\\" hereby released to the general public under the following terms:\n.\\\"\n.\\\" Redistribution and use in source and binary forms, with or without\n.\\\" modification, are permitted.\n.\\\"\n.\\\" There's ABSOLUTELY NO WARRANTY, express or implied.\n.\\\"\n.Dd March 27, 2024\n.Dt CRYPT 5\n.Os \"Openwall Project\"\n.Sh NAME\n.Nm crypt\n.Nd storage format for hashed passphrases and available hashing methods\n.Sh DESCRIPTION\nThe hashing methods implemented by\n.Xr crypt 3\nare designed only to process user passphrases for storage and authentication;\nthey are not suitable for use as general-purpose cryptographic hashes.\n.Pp\nPassphrase hashing is not a replacement for strong passphrases.\nIt is always possible\nfor an attacker with access to the hashed passphrases\nto guess and check possible cleartext passphrases.\nHowever, with a strong hashing method,\nguessing will be too slow for the attacker\nto discover a strong passphrase.\n.Pp\nMost of the hashing methods use a\n.Dq salt\nto perturb the hash function,\nso that the same passphrase may produce many possible hashes.\nNewer methods accept longer salt strings.\nThe salt should be chosen at random for each user.\nSalt defeats a number of attacks:\n.Bl -enum\n.It\nIt is not possible to hash a passphrase once\nand then test it against each account's stored hash;\nthe hash calculation must be repeated for each account.\n.It\nIt is not possible to tell whether two accounts use the same passphrase\nwithout successfully guessing one of the phrases.\n.It\nTables of precalculated hashes of commonly used passphrases\nmust have an entry for each possible salt,\nwhich makes them impractically large.\n.El\n.Pp\nMost of the hashing methods are also deliberately engineered to be slow;\nthey use many iterations of an underlying cryptographic primitive\nto increase the cost of each guess.\nThe newer hashing methods allow the number of iterations to be adjusted,\nusing the\n.Dq processing cost\nparameter to\n.Xr crypt_gensalt 3 .\nFor memory-hard hashing methods such as yescrypt,\nthis parameter also adjusts the amount of memory needed to compute a hash.\nHaving this configurable makes it possible to keep password guessing attacks\nagainst the hashes slow and costly as hardware improves.\n.Sh FORMAT OF HASHED PASSPHRASES\nAll of the hashing methods supported by\n.Xr crypt 3\nproduce a hashed passphrase which consists of four components:\n.Ar prefix ,\n.Ar options ,\n.Ar salt ,\nand\n.Ar hash .\nThe prefix controls which hashing method is to be used, and is the\nappropriate string to pass to\n.Xr crypt_gensalt 3\nto select that method.\nThe contents of\n.Ar options ,\n.Ar salt ,\nand\n.Ar hash\nare up to the method.\nDepending on the method, the\n.Ar prefix\nand\n.Ar options\ncomponents may be empty.\n.Pp\nThe\n.Fa setting\nargument to\n.Xr crypt 3\nmust begin with the first three components of a valid hashed passphrase,\nbut anything after that is ignored.\nThis makes authentication simple:\nhash the input passphrase using the stored hashed passphrase as the setting,\nand then compare the result to the stored hashed passphrase.\n.Pp\nHashed passphrases are always entirely printable ASCII,\nand do not contain any whitespace\nor the characters\n.Sq Li \\&: ,\n.Sq Li \\&; ,\n.Sq Li \\&* ,\n.Sq Li \\&! ,\nor\n.Sq Li \\&\\e .\n(These characters are used as delimiters and special markers in the\n.Xr passwd 5\nand\n.Xr shadow 5\nfiles.)\n.Pp\nThe syntax of each component of a hashed passphrase\nis up to the hashing method.\n.Sq Li \\&$\ncharacters usually delimit components,\nand the salt and hash are usually encoded as numerals in base 64.\nThe details of this base-64 encoding vary among hashing methods.\nThe common\n.Dq base64\nencoding specified by RFC 4648 is usually\n.Em not\nused.\n.Sh AVAILABLE HASHING METHODS\nThis is a list of\n.Em all\nthe hashing methods supported by\n.Xr crypt 3 ,\nroughly in decreasing order of strength.\nMany of the older methods\nare now considered too weak to use for new passphrases.\nThe hashed passphrase format is expressed\nwith extended regular expressions (see\n.Xr regex 7 )\nand does not show the division into prefix, options, salt, and hash.\n.de hash\n.Bl -tag -width 2n\n.It Sy Prefix\n.\\\" mandoc bug: .Qq comes out with curly quotes.\n.\\\" mandoc bug: .Li is hyperlinked to itself for no apparent reason.\n.Bf Li\n\"\\\\$1\"\n.Ef\n.if \"\\\\$1\"\" (empty string)\n.It Sy Hashed passphrase format\n.\\\" mandoc bug: .Li is hyperlinked to itself for no apparent reason.\n.Bf -literal\n\\&\\\\$2\n.Ef\n.It Sy Maximum passphrase length\n.ie \"\\\\$3\"unlimited\" unlimited\n.el \\\\$3 characters\n.if \"\\\\$4\"7\" (ignores 8th bit)\n.It Sy Hash size\n\\\\$6 bits\n.if !\"\\\\$5\"\\\\$6\" \\{\\\n.It Sy Effective key size\n\\&\\\\$5 bits\n.\\}\n.It Sy Salt size\n\\\\$7 bits\n.It Sy Processing cost parameter\n\\\\$8\n.El\n..\n.Ss yescrypt\nyescrypt is a scalable passphrase hashing scheme designed by Solar Designer,\nwhich is based on Colin Percival's scrypt.\nWhile yescrypt's strength against password guessing attacks comes from its\nalgorithm design, its cryptographic security is guaranteed by its use of\nSHA-256 on the outer layer.\nThe SHA-256 hash function has been published by NIST in FIPS PUB 180-2\n(and its subsequent revisions such as FIPS PUB 180-4)\nand by the IETF as RFC 4634 (and subsequently RFC 6234).\nRecommended for new hashes.\n.hash \"$y$\" \"\\e$y\\e$[./A-Za-z0-9]+\\e$[./A-Za-z0-9]{,86}\\e$[./A-Za-z0-9]{43}\" unlimited 8 256 256 \"up to 512 (128+ recommended)\" \"1 to 11 (logarithmic, also affects memory usage)\"\n.Ss gost-yescrypt\ngost-yescrypt uses the output from yescrypt as an input message to HMAC with\nthe GOST R 34.11-2012 (Streebog) hash function with a 256-bit digest.\nThus, yescrypt's cryptographic properties are superseded by those of the GOST\nhash function.\nThis hashing method is useful in applications that need modern passphrase\nhashing, but have to rely on GOST algorithms.\nThe GOST R 34.11-2012 (Streebog) hash function has been published by the IETF\nas RFC 6986.\nAcceptable for new hashes where required.\n.hash \"$gy$\" \"\\e$gy\\e$[./A-Za-z0-9]+\\e$[./A-Za-z0-9]{,86}\\e$[./A-Za-z0-9]{43}\" unlimited 8 256 256 \"up to 512 (128+ recommended)\" \"1 to 11 (logarithmic, also affects memory usage)\"\n.Ss sm3-yescrypt\nsm3-yescrypt uses the output from yescrypt as an input message to HMAC with\nthe ShangMi 3 hash function with a 256-bit digest.\nThus, yescrypt's cryptographic properties are superseded by those of the\nShangMi 3 hash function.\nThis hashing method is useful in applications that need modern passphrase\nhashing, but have to rely on algorithms approved by the Chinese Office of\nState Commercial Cryptography Administration (OSCCA).\nThe ShangMi 3 hash function has been published in Part 3: \"Dedicated\nhash-functions\" of the ISO/IEC 10118-3:2018.\nAcceptable for new hashes where required.\n.hash \"$sm3y$\" \"\\e$sm3y\\e$[./A-Za-z0-9]+\\e$[./A-Za-z0-9]{,86}\\e$[./A-Za-z0-9]{43}\" unlimited 8 256 256 \"up to 512 (128+ recommended)\" \"1 to 11 (logarithmic, also affects memory usage)\"\n.Ss scrypt\nscrypt is a password-based key derivation function created by Colin Percival,\noriginally for the Tarsnap online backup service.\nThe algorithm was specifically designed to make it costly to perform\nlarge-scale custom hardware attacks by requiring large amounts of memory.\nIn 2016, the scrypt algorithm was published by IETF as RFC 7914.\n.hash \"$7$\" \"\\e$7\\e$[./A-Za-z0-9]{11,97}\\e$[./A-Za-z0-9]{43}\" unlimited 8 256 256 \"up to 512 (128+ recommended)\" \"6 to 11 (logarithmic, also affects memory usage)\"\n.Ss bcrypt\nA hash based on the Blowfish block cipher,\nmodified to have an extra-expensive key schedule.\nOriginally developed by Niels Provos and David Mazieres for OpenBSD\nand also supported on recent versions of FreeBSD and NetBSD,\non Solaris 10 and newer, and on several GNU/*/Linux distributions.\n.hash \"$2b$\" \"\\e$2[abxy]\\e$[0-9]{2}\\e$[./A-Za-z0-9]{53}\" 72 8 184 184 128 \"4 to 31 (logarithmic)\"\n.Pp\nThe alternative prefix \"$2y$\" is equivalent to \"$2b$\".\nIt exists for historical reasons only.\nThe alternative prefixes \"$2a$\" and \"$2x$\"\nprovide bug-compatibility with crypt_blowfish 1.0.4 and earlier,\nwhich incorrectly processed characters with the 8th bit set.\n.Ss sha512crypt\nA hash based on SHA-2 with 512-bit output,\noriginally developed by Ulrich Drepper for GNU libc.\nSupported on Linux but not common elsewhere.\nAcceptable for new hashes.\nThe default processing cost parameter is 5000,\nwhich is too low for modern hardware.\n.hash \"$6$\" \"\\e$6\\e$(rounds=[1-9][0-9]+\\e$)?[^$:\\(rsn]{1,16}\\e$[./0-9A-Za-z]{86}\" unlimited 8 512 512 \"6 to 96\" \"1000 to 999,999,999\"\n.Ss sha256crypt\nA hash based on SHA-2 with 256-bit output,\noriginally developed by Ulrich Drepper for GNU libc.\nSupported on Linux but not common elsewhere.\nAcceptable for new hashes.\nThe default processing cost parameter is 5000,\nwhich is too low for modern hardware.\n.hash \"$5$\" \"\\e$5\\e$(rounds=[1-9][0-9]+\\e$)?[^$:\\(rsn]{1,16}\\e$[./0-9A-Za-z]{43}\" unlimited 8 256 256 \"6 to 96\" \"1000 to 999,999,999\"\n.Ss sm3crypt\nA hash based on the ShangMi 3 hash function\nwith 256-bit output, that uses the same design as\nsha256crypt and/or sha512crypt.\nSupported on EulerOS, Kylin, openEuler, and openKylin,\nbut not common elsewhere.\nAcceptable for new hashes where required.\nThe default processing cost parameter is 5000,\nwhich is too low for modern hardware.\n.hash \"$sm3$\" \"\\e$sm3\\e$(rounds=[1-9][0-9]+\\e$)?[^$:\\(rsn]{1,16}\\e$[./0-9A-Za-z]{86}\" unlimited 8 256 256 \"6 to 96\" \"1000 to 999,999,999\"\n.Ss sha1crypt\nA hash based on HMAC-SHA1.\nOriginally developed by Simon Gerraty for NetBSD.\nNot as weak as the DES-based hashes below,\nbut SHA-1 is so cheap on modern hardware\nthat it should not be used for new hashes.\n.hash \"$sha1\" \"\\e$sha1\\e$[1-9][0-9]+\\e$[./0-9A-Za-z]{1,64}\\e$[./0-9A-Za-z]{8,64}[./0-9A-Za-z]{32}\" unlimited 8 160 160 \"6 to 384\" \"4 to 4,294,967,295\"\n.Ss SunMD5\nA hash based on the MD5 algorithm,\noriginally developed by Alec David Muffett for Solaris.\nNot adopted elsewhere, to our knowledge.\nNot as weak as the DES-based hashes below,\nbut MD5 is so cheap on modern hardware\nthat it should not be used for new hashes.\n.hash \"$md5\" \"\\e$md5(,rounds=[1-9][0-9]+)?\\e$[./0-9A-Za-z]{8}\\e${1,2}[./0-9A-Za-z]{22}\" unlimited 8 128 128 48 \"4096 to 4,294,963,199\"\n.Ss md5crypt\nA hash based on the MD5 algorithm, originally developed by\nPoul-Henning Kamp for FreeBSD.\nSupported on most free Unixes and newer versions of Solaris.\nNot as weak as the DES-based hashes below,\nbut MD5 is so cheap on modern hardware\nthat it should not be used for new hashes.\nProcessing cost is not adjustable.\n.hash \"$1$\" \"\\e$1\\e$[^$:\\(rsn]{1,8}\\e$[./0-9A-Za-z]{22}\" unlimited 8 128 128 \"6 to 48\" 1000\n.Ss bsdicrypt (BSDI extended DES)\nAn extension of traditional DES,\nwhich eliminates the length limit,\nincreases the salt size,\nand makes the time cost tunable.\nIt originates with BSDI BSD/OS\nand is also available on at least NetBSD, OpenBSD, and FreeBSD\ndue to the use of David Burren's FreeSec library.\nIt is much better than traditional DES and bigcrypt,\nbut still should not be used for new hashes.\n.hash _ \"_[./0-9A-Za-z]{19}\" unlimited 7 \"up to 56\" 64 24 \"1 to 16,777,215 (must be odd)\"\n.Ss descrypt (Traditional DES)\nThe original hashing method from Unix V7, based on the DES block cipher.\nBecause DES is cheap on modern hardware,\nbecause there are only 4096 possible salts and 2**56 distinct passphrases,\nwhich it truncates to 8 characters,\nit is feasible to discover\n.Em any\npassphrase hashed with this method.\nIt should only be used if you absolutely have to generate hashes\nthat will work on an old operating system that supports nothing else.\n.hash \"\" \"[./0-9A-Za-z]{13}\" 8 7 \"up to 56\" 64 12 25\n.Ss bigcrypt\nA weak extension of traditional DES,\navailable on some commercial Unixes.\nAll it does is raise the length limit from 8 to 128 characters,\nand it does this in a crude way that allows attackers to\nguess chunks of a long passphrase separately and in parallel,\nwhich may make guessing even easier than for traditional DES above.\nIt should not be used for new hashes.\n.hash \"\" \"[./0-9A-Za-z]{13,178}\" 128 7 \"up to 56\" \"up to 1024\" 12 25\n.Ss NT\nThe hashing method used for network authentication\nin some versions of the SMB/CIFS protocol.\nAvailable, for cross-compatibility's sake, on FreeBSD.\nBased on MD4.\nHas no salt or tunable cost parameter.\nIt is so weak that almost\n.Em any\nhuman-chosen passphrase hashed with this method is guessable.\nIt should only be used if you absolutely have to generate hashes\nthat will work on an old operating system that supports nothing else.\n.hash \"$3$\" \"\\e$3\\e$\\e$[0-9a-f]{32}\" unlimited 8 256 256 0 1\n.Sh SEE ALSO\n.Xr crypt 3 ,\n.Xr crypt_gensalt 3 ,\n.Xr getpwent 3 ,\n.Xr passwd 5 ,\n.Xr shadow 5 ,\n.Xr pam 8\n.Rs\n.%A Niels Provos\n.%A David Mazieres\n.%T A Future-Adaptable Password Scheme\n.%B Proceedings of the 1999 USENIX Annual Technical Conference\n.%D June 1999\n.%U https://www.usenix.org/events/usenix99/provos.html\n.Re\n.Rs\n.%A Robert Morris\n.%A Ken Thompson\n.%T Password Security: A Case History\n.%J Communications of the ACM\n.%V 22\n.%N 11\n.%D 1979\n.%U http://wolfram.schneider.org/bsd/7thEdManVol2/password/password.pdf\n.Re\n"
  },
  {
    "path": "doc/crypt_checksalt.3",
    "content": ".\\\" Written by Zack Weinberg <zackw at panix.com> in 2018.\n.\\\"\n.\\\" To the extent possible under law, the authors have waived\n.\\\" all copyright and related or neighboring rights to this work.\n.\\\" See https://creativecommons.org/publicdomain/zero/1.0/ for further\n.\\\" details.\n.\\\"\n.Dd November 8, 2018\n.Dt CRYPT_CHECKSALT 3\n.Os \"libxcrypt\"\n.Sh NAME\n.Nm crypt_checksalt\n.Nd validate a crypt setting string\n.Sh LIBRARY\n.Lb libcrypt\n.Sh SYNOPSIS\n.In crypt.h\n.Ft int\n.Fo crypt_checksalt\n.Fa \"const char *setting\"\n.Fc\n.Sh DESCRIPTION\n.Nm\nchecks the\n.Ar setting\nstring against the system configuration\nand reports whether the hashing method and parameters it specifies\nare acceptable.\nIt is intended to be used by programs\nsuch as\n.Xr login 1\nto determine whether the user's passphrase should be re-hashed\nusing the currently preferred hashing method.\n.Sh RETURN VALUES\nThe return value is 0 if there is nothing wrong with this setting.\nOtherwise, it is one of the following constants:\n.Bl -tag -width 4n\n.It Dv CRYPT_SALT_OK\n.Ar setting\nis a fully correct setting string.\nThis constant is guaranteed to equal 0.\n.It Dv CRYPT_SALT_INVALID\n.Ar setting\nis not a valid setting string; either it specifies a hashing method\nthat is not known to this version of libxcrypt,\nor it specifies invalid parameters for the method.\n.It Dv CRYPT_SALT_METHOD_DISABLED (Not implemented, yet)\n.Ar setting\nspecifies a hashing method that is no longer allowed to be used at all;\n.Nm crypt\nwill fail if passed this\n.Ar setting .\nManual intervention will be required to reactivate the user's account.\n.It Dv CRYPT_SALT_METHOD_LEGACY\n.Ar setting\nspecifies a hashing method that is no longer considered strong enough\nfor use with new passphrases.\n.Nm crypt\nwill still authenticate a passphrase against this setting,\nbut if authentication succeeds,\nthe passphrase should be re-hashed using the currently preferred method.\n.It Dv CRYPT_SALT_TOO_CHEAP (Not implemented, yet)\n.Ar setting\nspecifies cost parameters that are considered too cheap for use with\nnew passphrases.\n.Nm crypt\nwill still authenticate a passphrase against this setting,\nbut if authentication succeeds,\nthe passphrase should be re-hashed using the currently preferred method.\n.El\n.Sh FEATURE TEST MACROS\n.In crypt.h\nwill define the macro\n.Dv CRYPT_CHECKSALT_AVAILABLE\nif\n.Nm\nis available in the current version of libxcrypt.\n.Sh BUGS\nSince full configurability is not yet implemented, the current\nimplementation will only ever return\n.Nm CRYPT_SALT_OK (0)\nor\n.Nm CRYPT_SALT_INVALID\nwhen invoked.\n.Sh PORTABILITY NOTES\nThe function\n.Nm\nis not part of any standard.\nIt was added to libxcrypt in version 4.3.0.\n.Sh ATTRIBUTES\nFor an explanation of the terms used in this section, see\n.Xr attributes 7 .\n.TS\nallbox;\nlb lb lb\nl l l.\nInterface\tAttribute\tValue\nT{\n.Nm\nT}\tThread safety\tMT-Safe\n.TE\n.sp\n.Sh SEE ALSO\n.Xr crypt 3 ,\n.Xr crypt_gensalt 3 ,\n.Xr crypt 5\n"
  },
  {
    "path": "doc/crypt_gensalt.3",
    "content": ".\\\" Written and revised by Solar Designer <solar at openwall.com> in 2000-2011.\n.\\\" Revised by Zack Weinberg <zackw at panix.com> in 2017.\n.\\\" Converted to mdoc format by Zack Weinberg in 2018.\n.\\\"\n.\\\" No copyright is claimed, and this man page is hereby placed in the public\n.\\\" domain.  In case this attempt to disclaim copyright and place the man page\n.\\\" in the public domain is deemed null and void, then the man page is\n.\\\" Copyright 2000-2011 Solar Designer, 2017 Zack Weinberg, and it is\n.\\\" hereby released to the general public under the following terms:\n.\\\"\n.\\\" Redistribution and use in source and binary forms, with or without\n.\\\" modification, are permitted.\n.\\\"\n.\\\" There's ABSOLUTELY NO WARRANTY, express or implied.\n.\\\"\n.Dd March 27, 2024\n.Dt CRYPT_GENSALT 3\n.Os \"Openwall Project\"\n.Sh NAME\n.Nm crypt_gensalt , crypt_gensalt_rn , crypt_gensalt_ra\n.Nd encode settings for passphrase hashing\n.Sh LIBRARY\n.Lb libcrypt\n.Sh SYNOPSIS\n.In crypt.h\n.Ft \"char *\"\n.Fo crypt_gensalt\n.Fa \"const char *prefix\"\n.Fa \"unsigned long count\"\n.Fa \"const char *rbytes\"\n.Fa \"int nrbytes\"\n.Fc\n.Ft \"char *\"\n.Fo crypt_gensalt_rn\n.Fa \"const char * prefix\"\n.Fa \"unsigned long count\"\n.Fa \"const char *rbytes\"\n.Fa \"int nrbytes\"\n.Fa \"char * output\"\n.Fa \"int output_size\"\n.Fc\n.Ft \"char *\"\n.Fo crypt_gensalt_ra\n.Fa \"const char *prefix\"\n.Fa \"unsigned long count\"\n.Fa \"const char *rbytes\"\n.Fa \"int nrbytes\"\n.Fc\n.Sh DESCRIPTION\nThe\n.Nm crypt_gensalt ,\n.Nm crypt_gensalt_rn ,\nand\n.Nm crypt_gensalt_ra\nfunctions compile a string for use as the\n.Fa setting\nargument to\n.Nm crypt ,\n.Nm crypt_r ,\n.Nm crypt_rn ,\nand\n.Nm crypt_ra .\n.Fa prefix\nselects the hashing method to use.\n.Fa count\ncontrols the processing cost of the hash;\nthe valid range and exact meaning of\n.Fa count\ndepend on the hashing method,\nbut larger numbers correspond to more costly hashes\nin terms of CPU time and possibly memory usage.\n.Fa rbytes\nshould point to\n.Fa nrbytes\ncryptographically random bytes for use as\n.Dq salt.\n.Pp\nIf\n.Fa prefix\nis a null pointer, the best available hashing method will be selected.\n.Po Sy CAUTION :\nif\n.Fa prefix\nis an empty string,\nthe\n.Dq traditional\nDES-based hashing method will be selected;\nthis method is unacceptably weak by modern standards.\n.Pc\nIf\n.Fa count\nis 0, a low default cost will be selected.\nIf\n.Fa rbytes\nis a null pointer, an appropriate number of random bytes will be\nobtained from the operating system, and\n.Fa nrbytes\nis ignored.\n.Pp\nSee\n.Xr crypt 5\nfor other strings that can be used as\n.Fa prefix ,\nand valid values of\n.Fa count\nfor each.\n.Sh RETURN VALUES\n.Nm crypt_gensalt ,\n.Nm crypt_gensalt_rn ,\nand\n.Nm crypt_gensalt_ra\nreturn a pointer to an encoded setting string.\nThis string will be entirely printable ASCII,\nand will not contain whitespace or the characters\n.Sq Li \\&: ,\n.Sq Li \\&; ,\n.Sq Li \\&* ,\n.Sq Li \\&! ,\nor\n.Sq Li \\&\\e .\nSee\n.Xr crypt 5\nfor more detail on the format of this string.\nUpon error, they return a null pointer and set\n.Va errno\nto an appropriate error code.\nWhen the functions succeed, the value of\n.Va errno\nis unspecified and must not be relied upon.\n.Pp\n.Nm crypt_gensalt\nplaces its result in a static storage area,\nwhich will be overwritten by subsequent calls to\n.Nm crypt_gensalt .\nIt is not safe to call\n.Nm crypt_gensalt\nfrom multiple threads simultaneously.\nIt's also not recommended to use the pointer\nreturned as an argument for another call to\n.Nm crypt_gensalt ,\nas some implementations, including earlier\nreleases of libxcrypt, may overwrite the underlying\nstatic output buffer before computing the setting.\nHowever, it\n.Em is\nsafe to pass the string returned by\n.Nm crypt_gensalt\ndirectly to\n.Nm crypt\nwithout copying it;\neach function has its own static storage area.\n.Pp\n.Nm crypt_gensalt_rn\nplaces its result in the supplied\n.Fa output\nbuffer, which has\n.Fa output_size\nbytes of storage available.\n.Fa output_size\nshould be greater than or equal to\n.Dv CRYPT_GENSALT_OUTPUT_SIZE .\nIt's also not recommended to use the pointer\nreturned as an argument for another call to\n.Nm crypt_gensalt_rn\nusing the same\n.Fa output\nbuffer for subsequent calls, as some implementations,\nincluding earlier releases of libxcrypt, may overwrite\nthe supplied buffer before computing the setting.\n.Pp\n.Nm crypt_gensalt_ra\nallocates memory for its result using\n.Xr malloc 3 .\nIt should be freed with\n.Xr free 3\nafter use.\n.Pp\nUpon error, in addition to returning a null pointer,\n.Nm crypt_gensalt\nand\n.Nm crypt_gensalt_rn\nwill write an invalid setting string\nto their output buffer, if there is enough space;\nthis string will begin with a\n.Sq Li \\&*\nand will not be equal to\n.Fa prefix .\n.Sh ERRORS\n.Bl -tag -width Er\n.It Er EINVAL\n.Fa prefix\nis invalid or not supported by this implementation;\n.Fa count\nis invalid for the requested\n.Fa prefix ;\nthe input\n.Fa nrbytes\nis insufficient for the smallest valid salt with the requested\n.Fa prefix .\n.It Er ERANGE\n.Nm crypt_gensalt_rn\nonly:\n.Fa output_size\nis too small to hold the compiled\n.Fa setting\nstring.\n.It Er ENOMEM\nFailed to allocate internal scratch memory.\n.br\n.Nm crypt_gensalt_ra\nonly:\nfailed to allocate memory for the compiled\n.Fa setting\nstring.\n.It Er ENOSYS , EACCES , EIO , No etc.\\&\nObtaining random bytes from the operating system failed.\nThis can only happen when\n.Fa rbytes\nis a null pointer.\n.El\n.Sh FEATURE TEST MACROS\nThe following macros are defined by\n.In crypt.h :\n.Bl -tag -width 6n\n.It Dv CRYPT_GENSALT_IMPLEMENTS_DEFAULT_PREFIX\nA null pointer can be specified as the\n.Fa prefix\nargument.\n.It Dv CRYPT_GENSALT_IMPLEMENTS_AUTO_ENTROPY\nA null pointer can be specified as the\n.Fa rbytes\nargument.\n.El\n.Sh PORTABILITY NOTES\nThe functions\n.Nm crypt_gensalt ,\n.Nm crypt_gensalt_rn ,\nand\n.Nm crypt_gensalt_ra\nare not part of any standard.\nThey originate with the Openwall project.\nA function with the name\n.Nm crypt_gensalt\nalso exists on Solaris 10 and newer, but its prototype and semantics differ.\n.Pp\nThe default prefix and auto entropy features are available since libxcrypt\nversion 4.0.0.  Portable software can use feature test macros to find out\nwhether null pointers can be used for the\n.Fa prefix\nand\n.Fa rbytes\narguments.\n.Pp\nThe set of supported hashing methods varies considerably from system\nto system.\n.Sh ATTRIBUTES\nFor an explanation of the terms used in this section, see\n.Xr attributes 7 .\n.ad l\n.TS\nallbox;\nlb lb lb\nl l l.\nInterface\tAttribute\tValue\nT{\n.Nm crypt_gensalt\nT}\tThread safety\tMT-Unsafe race:crypt_gensalt\nT{\n.Nm crypt_gensalt_rn ,\n.Nm crypt_gensalt_ra\nT}\tThread safety\tMT-Safe\n.TE\n.ad\n.sp\n.Sh SEE ALSO\n.Xr crypt 3 ,\n.Xr getpass 3 ,\n.Xr getpwent 3 ,\n.Xr shadow 3 ,\n.Xr login 1 ,\n.Xr passwd 1 ,\n.Xr crypt 5 ,\n.Xr passwd 5 ,\n.Xr shadow 5 ,\n.Xr pam 8\n"
  },
  {
    "path": "doc/crypt_gensalt_ra.3",
    "content": ".so man3/crypt_gensalt.3\n"
  },
  {
    "path": "doc/crypt_gensalt_rn.3",
    "content": ".so man3/crypt_gensalt.3\n"
  },
  {
    "path": "doc/crypt_preferred_method.3",
    "content": ".\\\" Written by Björn Esser <besser82 at fedoraproject.org> in 2018.\n.\\\"\n.\\\" To the extent possible under law, the authors have waived\n.\\\" all copyright and related or neighboring rights to this work.\n.\\\" See https://creativecommons.org/publicdomain/zero/1.0/ for further\n.\\\" details.\n.\\\"\n.Dd November 16, 2018\n.Dt CRYPT_PREFERRED_METHOD 3\n.Os libxcrypt\n.Sh NAME\n.Nm crypt_preferred_method\n.Nd get the prefix of the preferred hash method\n.Sh LIBRARY\n.Lb libcrypt\n.Sh SYNOPSIS\n.In crypt.h\n.Ft const char*\n.Fo crypt_preferred_method\n.Fa void\n.Fc\n.Sh DESCRIPTION\n.Nm\nis a convenience function to get the prefix of the preferred hash\nmethod.  If a preferred method is available,\nit is the same as the one also used by the\n.Nm crypt_gensalt functions ,\nif their given\n.Ar prefix\nparameter is NULL.\n.Sh RETURN VALUES\nThe string returned equals the prefix of the preferred hash method.\nIf no preferred hash method is available it is NULL.\nIt\n.Em is\nsafe to pass the string returned by\n.Nm crypt_preferred_method\ndirectly to\n.Nm crypt_gensalt\nwithout prior string-sanitizing nor NULL-pointer checks.\n.Sh FEATURE TEST MACROS\n.In crypt.h\nwill define the macro\n.Dv CRYPT_PREFERRED_METHOD_AVAILABLE\nif\n.Nm\nis available in the current version of libxcrypt.\n.Sh PORTABILITY NOTES\nThe function\n.Nm\nis not part of any standard.\nIt was added to libxcrypt in version 4.4.0.\n.Sh ATTRIBUTES\nFor an explanation of the terms used in this section,\nsee\n.Xr attributes 7 .\n.TS\nallbox;\nlb lb lb\nlw(22n) l l.\nInterface\tAttribute\tValue\nT{\n.Nm\nT}\tThread safety\tMT-Safe\n.TE\n.sp\n.Sh SEE ALSO\n.Xr crypt_gensalt 3\n"
  },
  {
    "path": "doc/crypt_r.3",
    "content": ".so man3/crypt.3\n"
  },
  {
    "path": "doc/crypt_ra.3",
    "content": ".so man3/crypt.3\n"
  },
  {
    "path": "doc/crypt_rn.3",
    "content": ".so man3/crypt.3\n"
  },
  {
    "path": "lib/alg-des-tables.c",
    "content": "/*\n * FreeSec: libcrypt for NetBSD\n *\n * Copyright (c) 1994 David Burren\n * All rights reserved.\n *\n * Adapted for FreeBSD-2.0 by Geoffrey M. Rehmet\n *\tthis file should now *only* export crypt(), in order to make\n *\tbinaries of libcrypt exportable from the USA\n *\n * Adapted for FreeBSD-4.0 by Mark R V Murray\n *\tthis file should now *only* export crypt_des(), in order to make\n *\ta module that can be optionally included in libcrypt.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the author nor the names of other contributors\n *    may be used to endorse or promote products derived from this software\n *    without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n *\n * This is an original implementation of the DES and the crypt(3) interfaces\n * by David Burren <davidb@werj.com.au>.\n */\n\n/*\n * The tables in this file were generated from a more compact\n * representation of the DES S-boxes and P-boxes by the program\n * gen-des-tables.c, which we no longer bother to run at build time.\n */\n\n#include \"crypt-port.h\"\n#include \"alg-des.h\"\n\n#if INCLUDE_descrypt || INCLUDE_bsdicrypt || INCLUDE_bigcrypt\n\nconst uint8_t m_sbox[4][4096] =\n{\n  {\n    0xef, 0xe3, 0xe1, 0xed, 0xe8, 0xe4, 0xee, 0xe7, 0xe6, 0xef, 0xeb, 0xe2,\n    0xe3, 0xe8, 0xe4, 0xee, 0xe9, 0xec, 0xe7, 0xe0, 0xe2, 0xe1, 0xed, 0xea,\n    0xec, 0xe6, 0xe0, 0xe9, 0xe5, 0xeb, 0xea, 0xe5, 0xe0, 0xed, 0xee, 0xe8,\n    0xe7, 0xea, 0xeb, 0xe1, 0xea, 0xe3, 0xe4, 0xef, 0xed, 0xe4, 0xe1, 0xe2,\n    0xe5, 0xeb, 0xe8, 0xe6, 0xec, 0xe7, 0xe6, 0xec, 0xe9, 0xe0, 0xe3, 0xe5,\n    0xe2, 0xee, 0xef, 0xe9, 0x0f, 0x03, 0x01, 0x0d, 0x08, 0x04, 0x0e, 0x07,\n    0x06, 0x0f, 0x0b, 0x02, 0x03, 0x08, 0x04, 0x0e, 0x09, 0x0c, 0x07, 0x00,\n    0x02, 0x01, 0x0d, 0x0a, 0x0c, 0x06, 0x00, 0x09, 0x05, 0x0b, 0x0a, 0x05,\n    0x00, 0x0d, 0x0e, 0x08, 0x07, 0x0a, 0x0b, 0x01, 0x0a, 0x03, 0x04, 0x0f,\n    0x0d, 0x04, 0x01, 0x02, 0x05, 0x0b, 0x08, 0x06, 0x0c, 0x07, 0x06, 0x0c,\n    0x09, 0x00, 0x03, 0x05, 0x02, 0x0e, 0x0f, 0x09, 0x4f, 0x43, 0x41, 0x4d,\n    0x48, 0x44, 0x4e, 0x47, 0x46, 0x4f, 0x4b, 0x42, 0x43, 0x48, 0x44, 0x4e,\n    0x49, 0x4c, 0x47, 0x40, 0x42, 0x41, 0x4d, 0x4a, 0x4c, 0x46, 0x40, 0x49,\n    0x45, 0x4b, 0x4a, 0x45, 0x40, 0x4d, 0x4e, 0x48, 0x47, 0x4a, 0x4b, 0x41,\n    0x4a, 0x43, 0x44, 0x4f, 0x4d, 0x44, 0x41, 0x42, 0x45, 0x4b, 0x48, 0x46,\n    0x4c, 0x47, 0x46, 0x4c, 0x49, 0x40, 0x43, 0x45, 0x42, 0x4e, 0x4f, 0x49,\n    0xff, 0xf3, 0xf1, 0xfd, 0xf8, 0xf4, 0xfe, 0xf7, 0xf6, 0xff, 0xfb, 0xf2,\n    0xf3, 0xf8, 0xf4, 0xfe, 0xf9, 0xfc, 0xf7, 0xf0, 0xf2, 0xf1, 0xfd, 0xfa,\n    0xfc, 0xf6, 0xf0, 0xf9, 0xf5, 0xfb, 0xfa, 0xf5, 0xf0, 0xfd, 0xfe, 0xf8,\n    0xf7, 0xfa, 0xfb, 0xf1, 0xfa, 0xf3, 0xf4, 0xff, 0xfd, 0xf4, 0xf1, 0xf2,\n    0xf5, 0xfb, 0xf8, 0xf6, 0xfc, 0xf7, 0xf6, 0xfc, 0xf9, 0xf0, 0xf3, 0xf5,\n    0xf2, 0xfe, 0xff, 0xf9, 0xdf, 0xd3, 0xd1, 0xdd, 0xd8, 0xd4, 0xde, 0xd7,\n    0xd6, 0xdf, 0xdb, 0xd2, 0xd3, 0xd8, 0xd4, 0xde, 0xd9, 0xdc, 0xd7, 0xd0,\n    0xd2, 0xd1, 0xdd, 0xda, 0xdc, 0xd6, 0xd0, 0xd9, 0xd5, 0xdb, 0xda, 0xd5,\n    0xd0, 0xdd, 0xde, 0xd8, 0xd7, 0xda, 0xdb, 0xd1, 0xda, 0xd3, 0xd4, 0xdf,\n    0xdd, 0xd4, 0xd1, 0xd2, 0xd5, 0xdb, 0xd8, 0xd6, 0xdc, 0xd7, 0xd6, 0xdc,\n    0xd9, 0xd0, 0xd3, 0xd5, 0xd2, 0xde, 0xdf, 0xd9, 0x7f, 0x73, 0x71, 0x7d,\n    0x78, 0x74, 0x7e, 0x77, 0x76, 0x7f, 0x7b, 0x72, 0x73, 0x78, 0x74, 0x7e,\n    0x79, 0x7c, 0x77, 0x70, 0x72, 0x71, 0x7d, 0x7a, 0x7c, 0x76, 0x70, 0x79,\n    0x75, 0x7b, 0x7a, 0x75, 0x70, 0x7d, 0x7e, 0x78, 0x77, 0x7a, 0x7b, 0x71,\n    0x7a, 0x73, 0x74, 0x7f, 0x7d, 0x74, 0x71, 0x72, 0x75, 0x7b, 0x78, 0x76,\n    0x7c, 0x77, 0x76, 0x7c, 0x79, 0x70, 0x73, 0x75, 0x72, 0x7e, 0x7f, 0x79,\n    0x1f, 0x13, 0x11, 0x1d, 0x18, 0x14, 0x1e, 0x17, 0x16, 0x1f, 0x1b, 0x12,\n    0x13, 0x18, 0x14, 0x1e, 0x19, 0x1c, 0x17, 0x10, 0x12, 0x11, 0x1d, 0x1a,\n    0x1c, 0x16, 0x10, 0x19, 0x15, 0x1b, 0x1a, 0x15, 0x10, 0x1d, 0x1e, 0x18,\n    0x17, 0x1a, 0x1b, 0x11, 0x1a, 0x13, 0x14, 0x1f, 0x1d, 0x14, 0x11, 0x12,\n    0x15, 0x1b, 0x18, 0x16, 0x1c, 0x17, 0x16, 0x1c, 0x19, 0x10, 0x13, 0x15,\n    0x12, 0x1e, 0x1f, 0x19, 0x4f, 0x43, 0x41, 0x4d, 0x48, 0x44, 0x4e, 0x47,\n    0x46, 0x4f, 0x4b, 0x42, 0x43, 0x48, 0x44, 0x4e, 0x49, 0x4c, 0x47, 0x40,\n    0x42, 0x41, 0x4d, 0x4a, 0x4c, 0x46, 0x40, 0x49, 0x45, 0x4b, 0x4a, 0x45,\n    0x40, 0x4d, 0x4e, 0x48, 0x47, 0x4a, 0x4b, 0x41, 0x4a, 0x43, 0x44, 0x4f,\n    0x4d, 0x44, 0x41, 0x42, 0x45, 0x4b, 0x48, 0x46, 0x4c, 0x47, 0x46, 0x4c,\n    0x49, 0x40, 0x43, 0x45, 0x42, 0x4e, 0x4f, 0x49, 0x2f, 0x23, 0x21, 0x2d,\n    0x28, 0x24, 0x2e, 0x27, 0x26, 0x2f, 0x2b, 0x22, 0x23, 0x28, 0x24, 0x2e,\n    0x29, 0x2c, 0x27, 0x20, 0x22, 0x21, 0x2d, 0x2a, 0x2c, 0x26, 0x20, 0x29,\n    0x25, 0x2b, 0x2a, 0x25, 0x20, 0x2d, 0x2e, 0x28, 0x27, 0x2a, 0x2b, 0x21,\n    0x2a, 0x23, 0x24, 0x2f, 0x2d, 0x24, 0x21, 0x22, 0x25, 0x2b, 0x28, 0x26,\n    0x2c, 0x27, 0x26, 0x2c, 0x29, 0x20, 0x23, 0x25, 0x22, 0x2e, 0x2f, 0x29,\n    0xef, 0xe3, 0xe1, 0xed, 0xe8, 0xe4, 0xee, 0xe7, 0xe6, 0xef, 0xeb, 0xe2,\n    0xe3, 0xe8, 0xe4, 0xee, 0xe9, 0xec, 0xe7, 0xe0, 0xe2, 0xe1, 0xed, 0xea,\n    0xec, 0xe6, 0xe0, 0xe9, 0xe5, 0xeb, 0xea, 0xe5, 0xe0, 0xed, 0xee, 0xe8,\n    0xe7, 0xea, 0xeb, 0xe1, 0xea, 0xe3, 0xe4, 0xef, 0xed, 0xe4, 0xe1, 0xe2,\n    0xe5, 0xeb, 0xe8, 0xe6, 0xec, 0xe7, 0xe6, 0xec, 0xe9, 0xe0, 0xe3, 0xe5,\n    0xe2, 0xee, 0xef, 0xe9, 0xff, 0xf3, 0xf1, 0xfd, 0xf8, 0xf4, 0xfe, 0xf7,\n    0xf6, 0xff, 0xfb, 0xf2, 0xf3, 0xf8, 0xf4, 0xfe, 0xf9, 0xfc, 0xf7, 0xf0,\n    0xf2, 0xf1, 0xfd, 0xfa, 0xfc, 0xf6, 0xf0, 0xf9, 0xf5, 0xfb, 0xfa, 0xf5,\n    0xf0, 0xfd, 0xfe, 0xf8, 0xf7, 0xfa, 0xfb, 0xf1, 0xfa, 0xf3, 0xf4, 0xff,\n    0xfd, 0xf4, 0xf1, 0xf2, 0xf5, 0xfb, 0xf8, 0xf6, 0xfc, 0xf7, 0xf6, 0xfc,\n    0xf9, 0xf0, 0xf3, 0xf5, 0xf2, 0xfe, 0xff, 0xf9, 0x2f, 0x23, 0x21, 0x2d,\n    0x28, 0x24, 0x2e, 0x27, 0x26, 0x2f, 0x2b, 0x22, 0x23, 0x28, 0x24, 0x2e,\n    0x29, 0x2c, 0x27, 0x20, 0x22, 0x21, 0x2d, 0x2a, 0x2c, 0x26, 0x20, 0x29,\n    0x25, 0x2b, 0x2a, 0x25, 0x20, 0x2d, 0x2e, 0x28, 0x27, 0x2a, 0x2b, 0x21,\n    0x2a, 0x23, 0x24, 0x2f, 0x2d, 0x24, 0x21, 0x22, 0x25, 0x2b, 0x28, 0x26,\n    0x2c, 0x27, 0x26, 0x2c, 0x29, 0x20, 0x23, 0x25, 0x22, 0x2e, 0x2f, 0x29,\n    0xbf, 0xb3, 0xb1, 0xbd, 0xb8, 0xb4, 0xbe, 0xb7, 0xb6, 0xbf, 0xbb, 0xb2,\n    0xb3, 0xb8, 0xb4, 0xbe, 0xb9, 0xbc, 0xb7, 0xb0, 0xb2, 0xb1, 0xbd, 0xba,\n    0xbc, 0xb6, 0xb0, 0xb9, 0xb5, 0xbb, 0xba, 0xb5, 0xb0, 0xbd, 0xbe, 0xb8,\n    0xb7, 0xba, 0xbb, 0xb1, 0xba, 0xb3, 0xb4, 0xbf, 0xbd, 0xb4, 0xb1, 0xb2,\n    0xb5, 0xbb, 0xb8, 0xb6, 0xbc, 0xb7, 0xb6, 0xbc, 0xb9, 0xb0, 0xb3, 0xb5,\n    0xb2, 0xbe, 0xbf, 0xb9, 0xdf, 0xd3, 0xd1, 0xdd, 0xd8, 0xd4, 0xde, 0xd7,\n    0xd6, 0xdf, 0xdb, 0xd2, 0xd3, 0xd8, 0xd4, 0xde, 0xd9, 0xdc, 0xd7, 0xd0,\n    0xd2, 0xd1, 0xdd, 0xda, 0xdc, 0xd6, 0xd0, 0xd9, 0xd5, 0xdb, 0xda, 0xd5,\n    0xd0, 0xdd, 0xde, 0xd8, 0xd7, 0xda, 0xdb, 0xd1, 0xda, 0xd3, 0xd4, 0xdf,\n    0xdd, 0xd4, 0xd1, 0xd2, 0xd5, 0xdb, 0xd8, 0xd6, 0xdc, 0xd7, 0xd6, 0xdc,\n    0xd9, 0xd0, 0xd3, 0xd5, 0xd2, 0xde, 0xdf, 0xd9, 0x8f, 0x83, 0x81, 0x8d,\n    0x88, 0x84, 0x8e, 0x87, 0x86, 0x8f, 0x8b, 0x82, 0x83, 0x88, 0x84, 0x8e,\n    0x89, 0x8c, 0x87, 0x80, 0x82, 0x81, 0x8d, 0x8a, 0x8c, 0x86, 0x80, 0x89,\n    0x85, 0x8b, 0x8a, 0x85, 0x80, 0x8d, 0x8e, 0x88, 0x87, 0x8a, 0x8b, 0x81,\n    0x8a, 0x83, 0x84, 0x8f, 0x8d, 0x84, 0x81, 0x82, 0x85, 0x8b, 0x88, 0x86,\n    0x8c, 0x87, 0x86, 0x8c, 0x89, 0x80, 0x83, 0x85, 0x82, 0x8e, 0x8f, 0x89,\n    0x1f, 0x13, 0x11, 0x1d, 0x18, 0x14, 0x1e, 0x17, 0x16, 0x1f, 0x1b, 0x12,\n    0x13, 0x18, 0x14, 0x1e, 0x19, 0x1c, 0x17, 0x10, 0x12, 0x11, 0x1d, 0x1a,\n    0x1c, 0x16, 0x10, 0x19, 0x15, 0x1b, 0x1a, 0x15, 0x10, 0x1d, 0x1e, 0x18,\n    0x17, 0x1a, 0x1b, 0x11, 0x1a, 0x13, 0x14, 0x1f, 0x1d, 0x14, 0x11, 0x12,\n    0x15, 0x1b, 0x18, 0x16, 0x1c, 0x17, 0x16, 0x1c, 0x19, 0x10, 0x13, 0x15,\n    0x12, 0x1e, 0x1f, 0x19, 0x3f, 0x33, 0x31, 0x3d, 0x38, 0x34, 0x3e, 0x37,\n    0x36, 0x3f, 0x3b, 0x32, 0x33, 0x38, 0x34, 0x3e, 0x39, 0x3c, 0x37, 0x30,\n    0x32, 0x31, 0x3d, 0x3a, 0x3c, 0x36, 0x30, 0x39, 0x35, 0x3b, 0x3a, 0x35,\n    0x30, 0x3d, 0x3e, 0x38, 0x37, 0x3a, 0x3b, 0x31, 0x3a, 0x33, 0x34, 0x3f,\n    0x3d, 0x34, 0x31, 0x32, 0x35, 0x3b, 0x38, 0x36, 0x3c, 0x37, 0x36, 0x3c,\n    0x39, 0x30, 0x33, 0x35, 0x32, 0x3e, 0x3f, 0x39, 0xaf, 0xa3, 0xa1, 0xad,\n    0xa8, 0xa4, 0xae, 0xa7, 0xa6, 0xaf, 0xab, 0xa2, 0xa3, 0xa8, 0xa4, 0xae,\n    0xa9, 0xac, 0xa7, 0xa0, 0xa2, 0xa1, 0xad, 0xaa, 0xac, 0xa6, 0xa0, 0xa9,\n    0xa5, 0xab, 0xaa, 0xa5, 0xa0, 0xad, 0xae, 0xa8, 0xa7, 0xaa, 0xab, 0xa1,\n    0xaa, 0xa3, 0xa4, 0xaf, 0xad, 0xa4, 0xa1, 0xa2, 0xa5, 0xab, 0xa8, 0xa6,\n    0xac, 0xa7, 0xa6, 0xac, 0xa9, 0xa0, 0xa3, 0xa5, 0xa2, 0xae, 0xaf, 0xa9,\n    0xaf, 0xa3, 0xa1, 0xad, 0xa8, 0xa4, 0xae, 0xa7, 0xa6, 0xaf, 0xab, 0xa2,\n    0xa3, 0xa8, 0xa4, 0xae, 0xa9, 0xac, 0xa7, 0xa0, 0xa2, 0xa1, 0xad, 0xaa,\n    0xac, 0xa6, 0xa0, 0xa9, 0xa5, 0xab, 0xaa, 0xa5, 0xa0, 0xad, 0xae, 0xa8,\n    0xa7, 0xaa, 0xab, 0xa1, 0xaa, 0xa3, 0xa4, 0xaf, 0xad, 0xa4, 0xa1, 0xa2,\n    0xa5, 0xab, 0xa8, 0xa6, 0xac, 0xa7, 0xa6, 0xac, 0xa9, 0xa0, 0xa3, 0xa5,\n    0xa2, 0xae, 0xaf, 0xa9, 0x6f, 0x63, 0x61, 0x6d, 0x68, 0x64, 0x6e, 0x67,\n    0x66, 0x6f, 0x6b, 0x62, 0x63, 0x68, 0x64, 0x6e, 0x69, 0x6c, 0x67, 0x60,\n    0x62, 0x61, 0x6d, 0x6a, 0x6c, 0x66, 0x60, 0x69, 0x65, 0x6b, 0x6a, 0x65,\n    0x60, 0x6d, 0x6e, 0x68, 0x67, 0x6a, 0x6b, 0x61, 0x6a, 0x63, 0x64, 0x6f,\n    0x6d, 0x64, 0x61, 0x62, 0x65, 0x6b, 0x68, 0x66, 0x6c, 0x67, 0x66, 0x6c,\n    0x69, 0x60, 0x63, 0x65, 0x62, 0x6e, 0x6f, 0x69, 0x6f, 0x63, 0x61, 0x6d,\n    0x68, 0x64, 0x6e, 0x67, 0x66, 0x6f, 0x6b, 0x62, 0x63, 0x68, 0x64, 0x6e,\n    0x69, 0x6c, 0x67, 0x60, 0x62, 0x61, 0x6d, 0x6a, 0x6c, 0x66, 0x60, 0x69,\n    0x65, 0x6b, 0x6a, 0x65, 0x60, 0x6d, 0x6e, 0x68, 0x67, 0x6a, 0x6b, 0x61,\n    0x6a, 0x63, 0x64, 0x6f, 0x6d, 0x64, 0x61, 0x62, 0x65, 0x6b, 0x68, 0x66,\n    0x6c, 0x67, 0x66, 0x6c, 0x69, 0x60, 0x63, 0x65, 0x62, 0x6e, 0x6f, 0x69,\n    0xcf, 0xc3, 0xc1, 0xcd, 0xc8, 0xc4, 0xce, 0xc7, 0xc6, 0xcf, 0xcb, 0xc2,\n    0xc3, 0xc8, 0xc4, 0xce, 0xc9, 0xcc, 0xc7, 0xc0, 0xc2, 0xc1, 0xcd, 0xca,\n    0xcc, 0xc6, 0xc0, 0xc9, 0xc5, 0xcb, 0xca, 0xc5, 0xc0, 0xcd, 0xce, 0xc8,\n    0xc7, 0xca, 0xcb, 0xc1, 0xca, 0xc3, 0xc4, 0xcf, 0xcd, 0xc4, 0xc1, 0xc2,\n    0xc5, 0xcb, 0xc8, 0xc6, 0xcc, 0xc7, 0xc6, 0xcc, 0xc9, 0xc0, 0xc3, 0xc5,\n    0xc2, 0xce, 0xcf, 0xc9, 0xcf, 0xc3, 0xc1, 0xcd, 0xc8, 0xc4, 0xce, 0xc7,\n    0xc6, 0xcf, 0xcb, 0xc2, 0xc3, 0xc8, 0xc4, 0xce, 0xc9, 0xcc, 0xc7, 0xc0,\n    0xc2, 0xc1, 0xcd, 0xca, 0xcc, 0xc6, 0xc0, 0xc9, 0xc5, 0xcb, 0xca, 0xc5,\n    0xc0, 0xcd, 0xce, 0xc8, 0xc7, 0xca, 0xcb, 0xc1, 0xca, 0xc3, 0xc4, 0xcf,\n    0xcd, 0xc4, 0xc1, 0xc2, 0xc5, 0xcb, 0xc8, 0xc6, 0xcc, 0xc7, 0xc6, 0xcc,\n    0xc9, 0xc0, 0xc3, 0xc5, 0xc2, 0xce, 0xcf, 0xc9, 0xbf, 0xb3, 0xb1, 0xbd,\n    0xb8, 0xb4, 0xbe, 0xb7, 0xb6, 0xbf, 0xbb, 0xb2, 0xb3, 0xb8, 0xb4, 0xbe,\n    0xb9, 0xbc, 0xb7, 0xb0, 0xb2, 0xb1, 0xbd, 0xba, 0xbc, 0xb6, 0xb0, 0xb9,\n    0xb5, 0xbb, 0xba, 0xb5, 0xb0, 0xbd, 0xbe, 0xb8, 0xb7, 0xba, 0xbb, 0xb1,\n    0xba, 0xb3, 0xb4, 0xbf, 0xbd, 0xb4, 0xb1, 0xb2, 0xb5, 0xbb, 0xb8, 0xb6,\n    0xbc, 0xb7, 0xb6, 0xbc, 0xb9, 0xb0, 0xb3, 0xb5, 0xb2, 0xbe, 0xbf, 0xb9,\n    0x5f, 0x53, 0x51, 0x5d, 0x58, 0x54, 0x5e, 0x57, 0x56, 0x5f, 0x5b, 0x52,\n    0x53, 0x58, 0x54, 0x5e, 0x59, 0x5c, 0x57, 0x50, 0x52, 0x51, 0x5d, 0x5a,\n    0x5c, 0x56, 0x50, 0x59, 0x55, 0x5b, 0x5a, 0x55, 0x50, 0x5d, 0x5e, 0x58,\n    0x57, 0x5a, 0x5b, 0x51, 0x5a, 0x53, 0x54, 0x5f, 0x5d, 0x54, 0x51, 0x52,\n    0x55, 0x5b, 0x58, 0x56, 0x5c, 0x57, 0x56, 0x5c, 0x59, 0x50, 0x53, 0x55,\n    0x52, 0x5e, 0x5f, 0x59, 0x9f, 0x93, 0x91, 0x9d, 0x98, 0x94, 0x9e, 0x97,\n    0x96, 0x9f, 0x9b, 0x92, 0x93, 0x98, 0x94, 0x9e, 0x99, 0x9c, 0x97, 0x90,\n    0x92, 0x91, 0x9d, 0x9a, 0x9c, 0x96, 0x90, 0x99, 0x95, 0x9b, 0x9a, 0x95,\n    0x90, 0x9d, 0x9e, 0x98, 0x97, 0x9a, 0x9b, 0x91, 0x9a, 0x93, 0x94, 0x9f,\n    0x9d, 0x94, 0x91, 0x92, 0x95, 0x9b, 0x98, 0x96, 0x9c, 0x97, 0x96, 0x9c,\n    0x99, 0x90, 0x93, 0x95, 0x92, 0x9e, 0x9f, 0x99, 0x9f, 0x93, 0x91, 0x9d,\n    0x98, 0x94, 0x9e, 0x97, 0x96, 0x9f, 0x9b, 0x92, 0x93, 0x98, 0x94, 0x9e,\n    0x99, 0x9c, 0x97, 0x90, 0x92, 0x91, 0x9d, 0x9a, 0x9c, 0x96, 0x90, 0x99,\n    0x95, 0x9b, 0x9a, 0x95, 0x90, 0x9d, 0x9e, 0x98, 0x97, 0x9a, 0x9b, 0x91,\n    0x9a, 0x93, 0x94, 0x9f, 0x9d, 0x94, 0x91, 0x92, 0x95, 0x9b, 0x98, 0x96,\n    0x9c, 0x97, 0x96, 0x9c, 0x99, 0x90, 0x93, 0x95, 0x92, 0x9e, 0x9f, 0x99,\n    0x5f, 0x53, 0x51, 0x5d, 0x58, 0x54, 0x5e, 0x57, 0x56, 0x5f, 0x5b, 0x52,\n    0x53, 0x58, 0x54, 0x5e, 0x59, 0x5c, 0x57, 0x50, 0x52, 0x51, 0x5d, 0x5a,\n    0x5c, 0x56, 0x50, 0x59, 0x55, 0x5b, 0x5a, 0x55, 0x50, 0x5d, 0x5e, 0x58,\n    0x57, 0x5a, 0x5b, 0x51, 0x5a, 0x53, 0x54, 0x5f, 0x5d, 0x54, 0x51, 0x52,\n    0x55, 0x5b, 0x58, 0x56, 0x5c, 0x57, 0x56, 0x5c, 0x59, 0x50, 0x53, 0x55,\n    0x52, 0x5e, 0x5f, 0x59, 0x0f, 0x03, 0x01, 0x0d, 0x08, 0x04, 0x0e, 0x07,\n    0x06, 0x0f, 0x0b, 0x02, 0x03, 0x08, 0x04, 0x0e, 0x09, 0x0c, 0x07, 0x00,\n    0x02, 0x01, 0x0d, 0x0a, 0x0c, 0x06, 0x00, 0x09, 0x05, 0x0b, 0x0a, 0x05,\n    0x00, 0x0d, 0x0e, 0x08, 0x07, 0x0a, 0x0b, 0x01, 0x0a, 0x03, 0x04, 0x0f,\n    0x0d, 0x04, 0x01, 0x02, 0x05, 0x0b, 0x08, 0x06, 0x0c, 0x07, 0x06, 0x0c,\n    0x09, 0x00, 0x03, 0x05, 0x02, 0x0e, 0x0f, 0x09, 0x3f, 0x33, 0x31, 0x3d,\n    0x38, 0x34, 0x3e, 0x37, 0x36, 0x3f, 0x3b, 0x32, 0x33, 0x38, 0x34, 0x3e,\n    0x39, 0x3c, 0x37, 0x30, 0x32, 0x31, 0x3d, 0x3a, 0x3c, 0x36, 0x30, 0x39,\n    0x35, 0x3b, 0x3a, 0x35, 0x30, 0x3d, 0x3e, 0x38, 0x37, 0x3a, 0x3b, 0x31,\n    0x3a, 0x33, 0x34, 0x3f, 0x3d, 0x34, 0x31, 0x32, 0x35, 0x3b, 0x38, 0x36,\n    0x3c, 0x37, 0x36, 0x3c, 0x39, 0x30, 0x33, 0x35, 0x32, 0x3e, 0x3f, 0x39,\n    0x7f, 0x73, 0x71, 0x7d, 0x78, 0x74, 0x7e, 0x77, 0x76, 0x7f, 0x7b, 0x72,\n    0x73, 0x78, 0x74, 0x7e, 0x79, 0x7c, 0x77, 0x70, 0x72, 0x71, 0x7d, 0x7a,\n    0x7c, 0x76, 0x70, 0x79, 0x75, 0x7b, 0x7a, 0x75, 0x70, 0x7d, 0x7e, 0x78,\n    0x77, 0x7a, 0x7b, 0x71, 0x7a, 0x73, 0x74, 0x7f, 0x7d, 0x74, 0x71, 0x72,\n    0x75, 0x7b, 0x78, 0x76, 0x7c, 0x77, 0x76, 0x7c, 0x79, 0x70, 0x73, 0x75,\n    0x72, 0x7e, 0x7f, 0x79, 0x8f, 0x83, 0x81, 0x8d, 0x88, 0x84, 0x8e, 0x87,\n    0x86, 0x8f, 0x8b, 0x82, 0x83, 0x88, 0x84, 0x8e, 0x89, 0x8c, 0x87, 0x80,\n    0x82, 0x81, 0x8d, 0x8a, 0x8c, 0x86, 0x80, 0x89, 0x85, 0x8b, 0x8a, 0x85,\n    0x80, 0x8d, 0x8e, 0x88, 0x87, 0x8a, 0x8b, 0x81, 0x8a, 0x83, 0x84, 0x8f,\n    0x8d, 0x84, 0x81, 0x82, 0x85, 0x8b, 0x88, 0x86, 0x8c, 0x87, 0x86, 0x8c,\n    0x89, 0x80, 0x83, 0x85, 0x82, 0x8e, 0x8f, 0x89, 0x4f, 0x43, 0x41, 0x4d,\n    0x48, 0x44, 0x4e, 0x47, 0x46, 0x4f, 0x4b, 0x42, 0x43, 0x48, 0x44, 0x4e,\n    0x49, 0x4c, 0x47, 0x40, 0x42, 0x41, 0x4d, 0x4a, 0x4c, 0x46, 0x40, 0x49,\n    0x45, 0x4b, 0x4a, 0x45, 0x40, 0x4d, 0x4e, 0x48, 0x47, 0x4a, 0x4b, 0x41,\n    0x4a, 0x43, 0x44, 0x4f, 0x4d, 0x44, 0x41, 0x42, 0x45, 0x4b, 0x48, 0x46,\n    0x4c, 0x47, 0x46, 0x4c, 0x49, 0x40, 0x43, 0x45, 0x42, 0x4e, 0x4f, 0x49,\n    0xff, 0xf3, 0xf1, 0xfd, 0xf8, 0xf4, 0xfe, 0xf7, 0xf6, 0xff, 0xfb, 0xf2,\n    0xf3, 0xf8, 0xf4, 0xfe, 0xf9, 0xfc, 0xf7, 0xf0, 0xf2, 0xf1, 0xfd, 0xfa,\n    0xfc, 0xf6, 0xf0, 0xf9, 0xf5, 0xfb, 0xfa, 0xf5, 0xf0, 0xfd, 0xfe, 0xf8,\n    0xf7, 0xfa, 0xfb, 0xf1, 0xfa, 0xf3, 0xf4, 0xff, 0xfd, 0xf4, 0xf1, 0xf2,\n    0xf5, 0xfb, 0xf8, 0xf6, 0xfc, 0xf7, 0xf6, 0xfc, 0xf9, 0xf0, 0xf3, 0xf5,\n    0xf2, 0xfe, 0xff, 0xf9, 0x1f, 0x13, 0x11, 0x1d, 0x18, 0x14, 0x1e, 0x17,\n    0x16, 0x1f, 0x1b, 0x12, 0x13, 0x18, 0x14, 0x1e, 0x19, 0x1c, 0x17, 0x10,\n    0x12, 0x11, 0x1d, 0x1a, 0x1c, 0x16, 0x10, 0x19, 0x15, 0x1b, 0x1a, 0x15,\n    0x10, 0x1d, 0x1e, 0x18, 0x17, 0x1a, 0x1b, 0x11, 0x1a, 0x13, 0x14, 0x1f,\n    0x1d, 0x14, 0x11, 0x12, 0x15, 0x1b, 0x18, 0x16, 0x1c, 0x17, 0x16, 0x1c,\n    0x19, 0x10, 0x13, 0x15, 0x12, 0x1e, 0x1f, 0x19, 0xcf, 0xc3, 0xc1, 0xcd,\n    0xc8, 0xc4, 0xce, 0xc7, 0xc6, 0xcf, 0xcb, 0xc2, 0xc3, 0xc8, 0xc4, 0xce,\n    0xc9, 0xcc, 0xc7, 0xc0, 0xc2, 0xc1, 0xcd, 0xca, 0xcc, 0xc6, 0xc0, 0xc9,\n    0xc5, 0xcb, 0xca, 0xc5, 0xc0, 0xcd, 0xce, 0xc8, 0xc7, 0xca, 0xcb, 0xc1,\n    0xca, 0xc3, 0xc4, 0xcf, 0xcd, 0xc4, 0xc1, 0xc2, 0xc5, 0xcb, 0xc8, 0xc6,\n    0xcc, 0xc7, 0xc6, 0xcc, 0xc9, 0xc0, 0xc3, 0xc5, 0xc2, 0xce, 0xcf, 0xc9,\n    0xef, 0xe3, 0xe1, 0xed, 0xe8, 0xe4, 0xee, 0xe7, 0xe6, 0xef, 0xeb, 0xe2,\n    0xe3, 0xe8, 0xe4, 0xee, 0xe9, 0xec, 0xe7, 0xe0, 0xe2, 0xe1, 0xed, 0xea,\n    0xec, 0xe6, 0xe0, 0xe9, 0xe5, 0xeb, 0xea, 0xe5, 0xe0, 0xed, 0xee, 0xe8,\n    0xe7, 0xea, 0xeb, 0xe1, 0xea, 0xe3, 0xe4, 0xef, 0xed, 0xe4, 0xe1, 0xe2,\n    0xe5, 0xeb, 0xe8, 0xe6, 0xec, 0xe7, 0xe6, 0xec, 0xe9, 0xe0, 0xe3, 0xe5,\n    0xe2, 0xee, 0xef, 0xe9, 0x8f, 0x83, 0x81, 0x8d, 0x88, 0x84, 0x8e, 0x87,\n    0x86, 0x8f, 0x8b, 0x82, 0x83, 0x88, 0x84, 0x8e, 0x89, 0x8c, 0x87, 0x80,\n    0x82, 0x81, 0x8d, 0x8a, 0x8c, 0x86, 0x80, 0x89, 0x85, 0x8b, 0x8a, 0x85,\n    0x80, 0x8d, 0x8e, 0x88, 0x87, 0x8a, 0x8b, 0x81, 0x8a, 0x83, 0x84, 0x8f,\n    0x8d, 0x84, 0x81, 0x82, 0x85, 0x8b, 0x88, 0x86, 0x8c, 0x87, 0x86, 0x8c,\n    0x89, 0x80, 0x83, 0x85, 0x82, 0x8e, 0x8f, 0x89, 0x8f, 0x83, 0x81, 0x8d,\n    0x88, 0x84, 0x8e, 0x87, 0x86, 0x8f, 0x8b, 0x82, 0x83, 0x88, 0x84, 0x8e,\n    0x89, 0x8c, 0x87, 0x80, 0x82, 0x81, 0x8d, 0x8a, 0x8c, 0x86, 0x80, 0x89,\n    0x85, 0x8b, 0x8a, 0x85, 0x80, 0x8d, 0x8e, 0x88, 0x87, 0x8a, 0x8b, 0x81,\n    0x8a, 0x83, 0x84, 0x8f, 0x8d, 0x84, 0x81, 0x82, 0x85, 0x8b, 0x88, 0x86,\n    0x8c, 0x87, 0x86, 0x8c, 0x89, 0x80, 0x83, 0x85, 0x82, 0x8e, 0x8f, 0x89,\n    0x2f, 0x23, 0x21, 0x2d, 0x28, 0x24, 0x2e, 0x27, 0x26, 0x2f, 0x2b, 0x22,\n    0x23, 0x28, 0x24, 0x2e, 0x29, 0x2c, 0x27, 0x20, 0x22, 0x21, 0x2d, 0x2a,\n    0x2c, 0x26, 0x20, 0x29, 0x25, 0x2b, 0x2a, 0x25, 0x20, 0x2d, 0x2e, 0x28,\n    0x27, 0x2a, 0x2b, 0x21, 0x2a, 0x23, 0x24, 0x2f, 0x2d, 0x24, 0x21, 0x22,\n    0x25, 0x2b, 0x28, 0x26, 0x2c, 0x27, 0x26, 0x2c, 0x29, 0x20, 0x23, 0x25,\n    0x22, 0x2e, 0x2f, 0x29, 0xdf, 0xd3, 0xd1, 0xdd, 0xd8, 0xd4, 0xde, 0xd7,\n    0xd6, 0xdf, 0xdb, 0xd2, 0xd3, 0xd8, 0xd4, 0xde, 0xd9, 0xdc, 0xd7, 0xd0,\n    0xd2, 0xd1, 0xdd, 0xda, 0xdc, 0xd6, 0xd0, 0xd9, 0xd5, 0xdb, 0xda, 0xd5,\n    0xd0, 0xdd, 0xde, 0xd8, 0xd7, 0xda, 0xdb, 0xd1, 0xda, 0xd3, 0xd4, 0xdf,\n    0xdd, 0xd4, 0xd1, 0xd2, 0xd5, 0xdb, 0xd8, 0xd6, 0xdc, 0xd7, 0xd6, 0xdc,\n    0xd9, 0xd0, 0xd3, 0xd5, 0xd2, 0xde, 0xdf, 0xd9, 0x4f, 0x43, 0x41, 0x4d,\n    0x48, 0x44, 0x4e, 0x47, 0x46, 0x4f, 0x4b, 0x42, 0x43, 0x48, 0x44, 0x4e,\n    0x49, 0x4c, 0x47, 0x40, 0x42, 0x41, 0x4d, 0x4a, 0x4c, 0x46, 0x40, 0x49,\n    0x45, 0x4b, 0x4a, 0x45, 0x40, 0x4d, 0x4e, 0x48, 0x47, 0x4a, 0x4b, 0x41,\n    0x4a, 0x43, 0x44, 0x4f, 0x4d, 0x44, 0x41, 0x42, 0x45, 0x4b, 0x48, 0x46,\n    0x4c, 0x47, 0x46, 0x4c, 0x49, 0x40, 0x43, 0x45, 0x42, 0x4e, 0x4f, 0x49,\n    0x6f, 0x63, 0x61, 0x6d, 0x68, 0x64, 0x6e, 0x67, 0x66, 0x6f, 0x6b, 0x62,\n    0x63, 0x68, 0x64, 0x6e, 0x69, 0x6c, 0x67, 0x60, 0x62, 0x61, 0x6d, 0x6a,\n    0x6c, 0x66, 0x60, 0x69, 0x65, 0x6b, 0x6a, 0x65, 0x60, 0x6d, 0x6e, 0x68,\n    0x67, 0x6a, 0x6b, 0x61, 0x6a, 0x63, 0x64, 0x6f, 0x6d, 0x64, 0x61, 0x62,\n    0x65, 0x6b, 0x68, 0x66, 0x6c, 0x67, 0x66, 0x6c, 0x69, 0x60, 0x63, 0x65,\n    0x62, 0x6e, 0x6f, 0x69, 0x9f, 0x93, 0x91, 0x9d, 0x98, 0x94, 0x9e, 0x97,\n    0x96, 0x9f, 0x9b, 0x92, 0x93, 0x98, 0x94, 0x9e, 0x99, 0x9c, 0x97, 0x90,\n    0x92, 0x91, 0x9d, 0x9a, 0x9c, 0x96, 0x90, 0x99, 0x95, 0x9b, 0x9a, 0x95,\n    0x90, 0x9d, 0x9e, 0x98, 0x97, 0x9a, 0x9b, 0x91, 0x9a, 0x93, 0x94, 0x9f,\n    0x9d, 0x94, 0x91, 0x92, 0x95, 0x9b, 0x98, 0x96, 0x9c, 0x97, 0x96, 0x9c,\n    0x99, 0x90, 0x93, 0x95, 0x92, 0x9e, 0x9f, 0x99, 0x2f, 0x23, 0x21, 0x2d,\n    0x28, 0x24, 0x2e, 0x27, 0x26, 0x2f, 0x2b, 0x22, 0x23, 0x28, 0x24, 0x2e,\n    0x29, 0x2c, 0x27, 0x20, 0x22, 0x21, 0x2d, 0x2a, 0x2c, 0x26, 0x20, 0x29,\n    0x25, 0x2b, 0x2a, 0x25, 0x20, 0x2d, 0x2e, 0x28, 0x27, 0x2a, 0x2b, 0x21,\n    0x2a, 0x23, 0x24, 0x2f, 0x2d, 0x24, 0x21, 0x22, 0x25, 0x2b, 0x28, 0x26,\n    0x2c, 0x27, 0x26, 0x2c, 0x29, 0x20, 0x23, 0x25, 0x22, 0x2e, 0x2f, 0x29,\n    0x1f, 0x13, 0x11, 0x1d, 0x18, 0x14, 0x1e, 0x17, 0x16, 0x1f, 0x1b, 0x12,\n    0x13, 0x18, 0x14, 0x1e, 0x19, 0x1c, 0x17, 0x10, 0x12, 0x11, 0x1d, 0x1a,\n    0x1c, 0x16, 0x10, 0x19, 0x15, 0x1b, 0x1a, 0x15, 0x10, 0x1d, 0x1e, 0x18,\n    0x17, 0x1a, 0x1b, 0x11, 0x1a, 0x13, 0x14, 0x1f, 0x1d, 0x14, 0x11, 0x12,\n    0x15, 0x1b, 0x18, 0x16, 0x1c, 0x17, 0x16, 0x1c, 0x19, 0x10, 0x13, 0x15,\n    0x12, 0x1e, 0x1f, 0x19, 0xbf, 0xb3, 0xb1, 0xbd, 0xb8, 0xb4, 0xbe, 0xb7,\n    0xb6, 0xbf, 0xbb, 0xb2, 0xb3, 0xb8, 0xb4, 0xbe, 0xb9, 0xbc, 0xb7, 0xb0,\n    0xb2, 0xb1, 0xbd, 0xba, 0xbc, 0xb6, 0xb0, 0xb9, 0xb5, 0xbb, 0xba, 0xb5,\n    0xb0, 0xbd, 0xbe, 0xb8, 0xb7, 0xba, 0xbb, 0xb1, 0xba, 0xb3, 0xb4, 0xbf,\n    0xbd, 0xb4, 0xb1, 0xb2, 0xb5, 0xbb, 0xb8, 0xb6, 0xbc, 0xb7, 0xb6, 0xbc,\n    0xb9, 0xb0, 0xb3, 0xb5, 0xb2, 0xbe, 0xbf, 0xb9, 0x7f, 0x73, 0x71, 0x7d,\n    0x78, 0x74, 0x7e, 0x77, 0x76, 0x7f, 0x7b, 0x72, 0x73, 0x78, 0x74, 0x7e,\n    0x79, 0x7c, 0x77, 0x70, 0x72, 0x71, 0x7d, 0x7a, 0x7c, 0x76, 0x70, 0x79,\n    0x75, 0x7b, 0x7a, 0x75, 0x70, 0x7d, 0x7e, 0x78, 0x77, 0x7a, 0x7b, 0x71,\n    0x7a, 0x73, 0x74, 0x7f, 0x7d, 0x74, 0x71, 0x72, 0x75, 0x7b, 0x78, 0x76,\n    0x7c, 0x77, 0x76, 0x7c, 0x79, 0x70, 0x73, 0x75, 0x72, 0x7e, 0x7f, 0x79,\n    0xff, 0xf3, 0xf1, 0xfd, 0xf8, 0xf4, 0xfe, 0xf7, 0xf6, 0xff, 0xfb, 0xf2,\n    0xf3, 0xf8, 0xf4, 0xfe, 0xf9, 0xfc, 0xf7, 0xf0, 0xf2, 0xf1, 0xfd, 0xfa,\n    0xfc, 0xf6, 0xf0, 0xf9, 0xf5, 0xfb, 0xfa, 0xf5, 0xf0, 0xfd, 0xfe, 0xf8,\n    0xf7, 0xfa, 0xfb, 0xf1, 0xfa, 0xf3, 0xf4, 0xff, 0xfd, 0xf4, 0xf1, 0xf2,\n    0xf5, 0xfb, 0xf8, 0xf6, 0xfc, 0xf7, 0xf6, 0xfc, 0xf9, 0xf0, 0xf3, 0xf5,\n    0xf2, 0xfe, 0xff, 0xf9, 0x5f, 0x53, 0x51, 0x5d, 0x58, 0x54, 0x5e, 0x57,\n    0x56, 0x5f, 0x5b, 0x52, 0x53, 0x58, 0x54, 0x5e, 0x59, 0x5c, 0x57, 0x50,\n    0x52, 0x51, 0x5d, 0x5a, 0x5c, 0x56, 0x50, 0x59, 0x55, 0x5b, 0x5a, 0x55,\n    0x50, 0x5d, 0x5e, 0x58, 0x57, 0x5a, 0x5b, 0x51, 0x5a, 0x53, 0x54, 0x5f,\n    0x5d, 0x54, 0x51, 0x52, 0x55, 0x5b, 0x58, 0x56, 0x5c, 0x57, 0x56, 0x5c,\n    0x59, 0x50, 0x53, 0x55, 0x52, 0x5e, 0x5f, 0x59, 0xcf, 0xc3, 0xc1, 0xcd,\n    0xc8, 0xc4, 0xce, 0xc7, 0xc6, 0xcf, 0xcb, 0xc2, 0xc3, 0xc8, 0xc4, 0xce,\n    0xc9, 0xcc, 0xc7, 0xc0, 0xc2, 0xc1, 0xcd, 0xca, 0xcc, 0xc6, 0xc0, 0xc9,\n    0xc5, 0xcb, 0xca, 0xc5, 0xc0, 0xcd, 0xce, 0xc8, 0xc7, 0xca, 0xcb, 0xc1,\n    0xca, 0xc3, 0xc4, 0xcf, 0xcd, 0xc4, 0xc1, 0xc2, 0xc5, 0xcb, 0xc8, 0xc6,\n    0xcc, 0xc7, 0xc6, 0xcc, 0xc9, 0xc0, 0xc3, 0xc5, 0xc2, 0xce, 0xcf, 0xc9,\n    0xbf, 0xb3, 0xb1, 0xbd, 0xb8, 0xb4, 0xbe, 0xb7, 0xb6, 0xbf, 0xbb, 0xb2,\n    0xb3, 0xb8, 0xb4, 0xbe, 0xb9, 0xbc, 0xb7, 0xb0, 0xb2, 0xb1, 0xbd, 0xba,\n    0xbc, 0xb6, 0xb0, 0xb9, 0xb5, 0xbb, 0xba, 0xb5, 0xb0, 0xbd, 0xbe, 0xb8,\n    0xb7, 0xba, 0xbb, 0xb1, 0xba, 0xb3, 0xb4, 0xbf, 0xbd, 0xb4, 0xb1, 0xb2,\n    0xb5, 0xbb, 0xb8, 0xb6, 0xbc, 0xb7, 0xb6, 0xbc, 0xb9, 0xb0, 0xb3, 0xb5,\n    0xb2, 0xbe, 0xbf, 0xb9, 0x9f, 0x93, 0x91, 0x9d, 0x98, 0x94, 0x9e, 0x97,\n    0x96, 0x9f, 0x9b, 0x92, 0x93, 0x98, 0x94, 0x9e, 0x99, 0x9c, 0x97, 0x90,\n    0x92, 0x91, 0x9d, 0x9a, 0x9c, 0x96, 0x90, 0x99, 0x95, 0x9b, 0x9a, 0x95,\n    0x90, 0x9d, 0x9e, 0x98, 0x97, 0x9a, 0x9b, 0x91, 0x9a, 0x93, 0x94, 0x9f,\n    0x9d, 0x94, 0x91, 0x92, 0x95, 0x9b, 0x98, 0x96, 0x9c, 0x97, 0x96, 0x9c,\n    0x99, 0x90, 0x93, 0x95, 0x92, 0x9e, 0x9f, 0x99, 0x3f, 0x33, 0x31, 0x3d,\n    0x38, 0x34, 0x3e, 0x37, 0x36, 0x3f, 0x3b, 0x32, 0x33, 0x38, 0x34, 0x3e,\n    0x39, 0x3c, 0x37, 0x30, 0x32, 0x31, 0x3d, 0x3a, 0x3c, 0x36, 0x30, 0x39,\n    0x35, 0x3b, 0x3a, 0x35, 0x30, 0x3d, 0x3e, 0x38, 0x37, 0x3a, 0x3b, 0x31,\n    0x3a, 0x33, 0x34, 0x3f, 0x3d, 0x34, 0x31, 0x32, 0x35, 0x3b, 0x38, 0x36,\n    0x3c, 0x37, 0x36, 0x3c, 0x39, 0x30, 0x33, 0x35, 0x32, 0x3e, 0x3f, 0x39,\n    0x7f, 0x73, 0x71, 0x7d, 0x78, 0x74, 0x7e, 0x77, 0x76, 0x7f, 0x7b, 0x72,\n    0x73, 0x78, 0x74, 0x7e, 0x79, 0x7c, 0x77, 0x70, 0x72, 0x71, 0x7d, 0x7a,\n    0x7c, 0x76, 0x70, 0x79, 0x75, 0x7b, 0x7a, 0x75, 0x70, 0x7d, 0x7e, 0x78,\n    0x77, 0x7a, 0x7b, 0x71, 0x7a, 0x73, 0x74, 0x7f, 0x7d, 0x74, 0x71, 0x72,\n    0x75, 0x7b, 0x78, 0x76, 0x7c, 0x77, 0x76, 0x7c, 0x79, 0x70, 0x73, 0x75,\n    0x72, 0x7e, 0x7f, 0x79, 0xef, 0xe3, 0xe1, 0xed, 0xe8, 0xe4, 0xee, 0xe7,\n    0xe6, 0xef, 0xeb, 0xe2, 0xe3, 0xe8, 0xe4, 0xee, 0xe9, 0xec, 0xe7, 0xe0,\n    0xe2, 0xe1, 0xed, 0xea, 0xec, 0xe6, 0xe0, 0xe9, 0xe5, 0xeb, 0xea, 0xe5,\n    0xe0, 0xed, 0xee, 0xe8, 0xe7, 0xea, 0xeb, 0xe1, 0xea, 0xe3, 0xe4, 0xef,\n    0xed, 0xe4, 0xe1, 0xe2, 0xe5, 0xeb, 0xe8, 0xe6, 0xec, 0xe7, 0xe6, 0xec,\n    0xe9, 0xe0, 0xe3, 0xe5, 0xe2, 0xee, 0xef, 0xe9, 0x3f, 0x33, 0x31, 0x3d,\n    0x38, 0x34, 0x3e, 0x37, 0x36, 0x3f, 0x3b, 0x32, 0x33, 0x38, 0x34, 0x3e,\n    0x39, 0x3c, 0x37, 0x30, 0x32, 0x31, 0x3d, 0x3a, 0x3c, 0x36, 0x30, 0x39,\n    0x35, 0x3b, 0x3a, 0x35, 0x30, 0x3d, 0x3e, 0x38, 0x37, 0x3a, 0x3b, 0x31,\n    0x3a, 0x33, 0x34, 0x3f, 0x3d, 0x34, 0x31, 0x32, 0x35, 0x3b, 0x38, 0x36,\n    0x3c, 0x37, 0x36, 0x3c, 0x39, 0x30, 0x33, 0x35, 0x32, 0x3e, 0x3f, 0x39,\n    0xaf, 0xa3, 0xa1, 0xad, 0xa8, 0xa4, 0xae, 0xa7, 0xa6, 0xaf, 0xab, 0xa2,\n    0xa3, 0xa8, 0xa4, 0xae, 0xa9, 0xac, 0xa7, 0xa0, 0xa2, 0xa1, 0xad, 0xaa,\n    0xac, 0xa6, 0xa0, 0xa9, 0xa5, 0xab, 0xaa, 0xa5, 0xa0, 0xad, 0xae, 0xa8,\n    0xa7, 0xaa, 0xab, 0xa1, 0xaa, 0xa3, 0xa4, 0xaf, 0xad, 0xa4, 0xa1, 0xa2,\n    0xa5, 0xab, 0xa8, 0xa6, 0xac, 0xa7, 0xa6, 0xac, 0xa9, 0xa0, 0xa3, 0xa5,\n    0xa2, 0xae, 0xaf, 0xa9, 0xaf, 0xa3, 0xa1, 0xad, 0xa8, 0xa4, 0xae, 0xa7,\n    0xa6, 0xaf, 0xab, 0xa2, 0xa3, 0xa8, 0xa4, 0xae, 0xa9, 0xac, 0xa7, 0xa0,\n    0xa2, 0xa1, 0xad, 0xaa, 0xac, 0xa6, 0xa0, 0xa9, 0xa5, 0xab, 0xaa, 0xa5,\n    0xa0, 0xad, 0xae, 0xa8, 0xa7, 0xaa, 0xab, 0xa1, 0xaa, 0xa3, 0xa4, 0xaf,\n    0xad, 0xa4, 0xa1, 0xa2, 0xa5, 0xab, 0xa8, 0xa6, 0xac, 0xa7, 0xa6, 0xac,\n    0xa9, 0xa0, 0xa3, 0xa5, 0xa2, 0xae, 0xaf, 0xa9, 0x0f, 0x03, 0x01, 0x0d,\n    0x08, 0x04, 0x0e, 0x07, 0x06, 0x0f, 0x0b, 0x02, 0x03, 0x08, 0x04, 0x0e,\n    0x09, 0x0c, 0x07, 0x00, 0x02, 0x01, 0x0d, 0x0a, 0x0c, 0x06, 0x00, 0x09,\n    0x05, 0x0b, 0x0a, 0x05, 0x00, 0x0d, 0x0e, 0x08, 0x07, 0x0a, 0x0b, 0x01,\n    0x0a, 0x03, 0x04, 0x0f, 0x0d, 0x04, 0x01, 0x02, 0x05, 0x0b, 0x08, 0x06,\n    0x0c, 0x07, 0x06, 0x0c, 0x09, 0x00, 0x03, 0x05, 0x02, 0x0e, 0x0f, 0x09,\n    0x5f, 0x53, 0x51, 0x5d, 0x58, 0x54, 0x5e, 0x57, 0x56, 0x5f, 0x5b, 0x52,\n    0x53, 0x58, 0x54, 0x5e, 0x59, 0x5c, 0x57, 0x50, 0x52, 0x51, 0x5d, 0x5a,\n    0x5c, 0x56, 0x50, 0x59, 0x55, 0x5b, 0x5a, 0x55, 0x50, 0x5d, 0x5e, 0x58,\n    0x57, 0x5a, 0x5b, 0x51, 0x5a, 0x53, 0x54, 0x5f, 0x5d, 0x54, 0x51, 0x52,\n    0x55, 0x5b, 0x58, 0x56, 0x5c, 0x57, 0x56, 0x5c, 0x59, 0x50, 0x53, 0x55,\n    0x52, 0x5e, 0x5f, 0x59, 0x6f, 0x63, 0x61, 0x6d, 0x68, 0x64, 0x6e, 0x67,\n    0x66, 0x6f, 0x6b, 0x62, 0x63, 0x68, 0x64, 0x6e, 0x69, 0x6c, 0x67, 0x60,\n    0x62, 0x61, 0x6d, 0x6a, 0x6c, 0x66, 0x60, 0x69, 0x65, 0x6b, 0x6a, 0x65,\n    0x60, 0x6d, 0x6e, 0x68, 0x67, 0x6a, 0x6b, 0x61, 0x6a, 0x63, 0x64, 0x6f,\n    0x6d, 0x64, 0x61, 0x62, 0x65, 0x6b, 0x68, 0x66, 0x6c, 0x67, 0x66, 0x6c,\n    0x69, 0x60, 0x63, 0x65, 0x62, 0x6e, 0x6f, 0x69, 0x0f, 0x03, 0x01, 0x0d,\n    0x08, 0x04, 0x0e, 0x07, 0x06, 0x0f, 0x0b, 0x02, 0x03, 0x08, 0x04, 0x0e,\n    0x09, 0x0c, 0x07, 0x00, 0x02, 0x01, 0x0d, 0x0a, 0x0c, 0x06, 0x00, 0x09,\n    0x05, 0x0b, 0x0a, 0x05, 0x00, 0x0d, 0x0e, 0x08, 0x07, 0x0a, 0x0b, 0x01,\n    0x0a, 0x03, 0x04, 0x0f, 0x0d, 0x04, 0x01, 0x02, 0x05, 0x0b, 0x08, 0x06,\n    0x0c, 0x07, 0x06, 0x0c, 0x09, 0x00, 0x03, 0x05, 0x02, 0x0e, 0x0f, 0x09,\n    0xdf, 0xd3, 0xd1, 0xdd, 0xd8, 0xd4, 0xde, 0xd7, 0xd6, 0xdf, 0xdb, 0xd2,\n    0xd3, 0xd8, 0xd4, 0xde, 0xd9, 0xdc, 0xd7, 0xd0, 0xd2, 0xd1, 0xdd, 0xda,\n    0xdc, 0xd6, 0xd0, 0xd9, 0xd5, 0xdb, 0xda, 0xd5, 0xd0, 0xdd, 0xde, 0xd8,\n    0xd7, 0xda, 0xdb, 0xd1, 0xda, 0xd3, 0xd4, 0xdf, 0xdd, 0xd4, 0xd1, 0xd2,\n    0xd5, 0xdb, 0xd8, 0xd6, 0xdc, 0xd7, 0xd6, 0xdc, 0xd9, 0xd0, 0xd3, 0xd5,\n    0xd2, 0xde, 0xdf, 0xd9,\n  },\n  {\n    0xa7, 0xad, 0xad, 0xa8, 0xae, 0xab, 0xa3, 0xa5, 0xa0, 0xa6, 0xa6, 0xaf,\n    0xa9, 0xa0, 0xaa, 0xa3, 0xa1, 0xa4, 0xa2, 0xa7, 0xa8, 0xa2, 0xa5, 0xac,\n    0xab, 0xa1, 0xac, 0xaa, 0xa4, 0xae, 0xaf, 0xa9, 0xaa, 0xa3, 0xa6, 0xaf,\n    0xa9, 0xa0, 0xa0, 0xa6, 0xac, 0xaa, 0xab, 0xa1, 0xa7, 0xad, 0xad, 0xa8,\n    0xaf, 0xa9, 0xa1, 0xa4, 0xa3, 0xa5, 0xae, 0xab, 0xa5, 0xac, 0xa2, 0xa7,\n    0xa8, 0xa2, 0xa4, 0xae, 0xd7, 0xdd, 0xdd, 0xd8, 0xde, 0xdb, 0xd3, 0xd5,\n    0xd0, 0xd6, 0xd6, 0xdf, 0xd9, 0xd0, 0xda, 0xd3, 0xd1, 0xd4, 0xd2, 0xd7,\n    0xd8, 0xd2, 0xd5, 0xdc, 0xdb, 0xd1, 0xdc, 0xda, 0xd4, 0xde, 0xdf, 0xd9,\n    0xda, 0xd3, 0xd6, 0xdf, 0xd9, 0xd0, 0xd0, 0xd6, 0xdc, 0xda, 0xdb, 0xd1,\n    0xd7, 0xdd, 0xdd, 0xd8, 0xdf, 0xd9, 0xd1, 0xd4, 0xd3, 0xd5, 0xde, 0xdb,\n    0xd5, 0xdc, 0xd2, 0xd7, 0xd8, 0xd2, 0xd4, 0xde, 0x07, 0x0d, 0x0d, 0x08,\n    0x0e, 0x0b, 0x03, 0x05, 0x00, 0x06, 0x06, 0x0f, 0x09, 0x00, 0x0a, 0x03,\n    0x01, 0x04, 0x02, 0x07, 0x08, 0x02, 0x05, 0x0c, 0x0b, 0x01, 0x0c, 0x0a,\n    0x04, 0x0e, 0x0f, 0x09, 0x0a, 0x03, 0x06, 0x0f, 0x09, 0x00, 0x00, 0x06,\n    0x0c, 0x0a, 0x0b, 0x01, 0x07, 0x0d, 0x0d, 0x08, 0x0f, 0x09, 0x01, 0x04,\n    0x03, 0x05, 0x0e, 0x0b, 0x05, 0x0c, 0x02, 0x07, 0x08, 0x02, 0x04, 0x0e,\n    0x77, 0x7d, 0x7d, 0x78, 0x7e, 0x7b, 0x73, 0x75, 0x70, 0x76, 0x76, 0x7f,\n    0x79, 0x70, 0x7a, 0x73, 0x71, 0x74, 0x72, 0x77, 0x78, 0x72, 0x75, 0x7c,\n    0x7b, 0x71, 0x7c, 0x7a, 0x74, 0x7e, 0x7f, 0x79, 0x7a, 0x73, 0x76, 0x7f,\n    0x79, 0x70, 0x70, 0x76, 0x7c, 0x7a, 0x7b, 0x71, 0x77, 0x7d, 0x7d, 0x78,\n    0x7f, 0x79, 0x71, 0x74, 0x73, 0x75, 0x7e, 0x7b, 0x75, 0x7c, 0x72, 0x77,\n    0x78, 0x72, 0x74, 0x7e, 0x97, 0x9d, 0x9d, 0x98, 0x9e, 0x9b, 0x93, 0x95,\n    0x90, 0x96, 0x96, 0x9f, 0x99, 0x90, 0x9a, 0x93, 0x91, 0x94, 0x92, 0x97,\n    0x98, 0x92, 0x95, 0x9c, 0x9b, 0x91, 0x9c, 0x9a, 0x94, 0x9e, 0x9f, 0x99,\n    0x9a, 0x93, 0x96, 0x9f, 0x99, 0x90, 0x90, 0x96, 0x9c, 0x9a, 0x9b, 0x91,\n    0x97, 0x9d, 0x9d, 0x98, 0x9f, 0x99, 0x91, 0x94, 0x93, 0x95, 0x9e, 0x9b,\n    0x95, 0x9c, 0x92, 0x97, 0x98, 0x92, 0x94, 0x9e, 0x07, 0x0d, 0x0d, 0x08,\n    0x0e, 0x0b, 0x03, 0x05, 0x00, 0x06, 0x06, 0x0f, 0x09, 0x00, 0x0a, 0x03,\n    0x01, 0x04, 0x02, 0x07, 0x08, 0x02, 0x05, 0x0c, 0x0b, 0x01, 0x0c, 0x0a,\n    0x04, 0x0e, 0x0f, 0x09, 0x0a, 0x03, 0x06, 0x0f, 0x09, 0x00, 0x00, 0x06,\n    0x0c, 0x0a, 0x0b, 0x01, 0x07, 0x0d, 0x0d, 0x08, 0x0f, 0x09, 0x01, 0x04,\n    0x03, 0x05, 0x0e, 0x0b, 0x05, 0x0c, 0x02, 0x07, 0x08, 0x02, 0x04, 0x0e,\n    0xe7, 0xed, 0xed, 0xe8, 0xee, 0xeb, 0xe3, 0xe5, 0xe0, 0xe6, 0xe6, 0xef,\n    0xe9, 0xe0, 0xea, 0xe3, 0xe1, 0xe4, 0xe2, 0xe7, 0xe8, 0xe2, 0xe5, 0xec,\n    0xeb, 0xe1, 0xec, 0xea, 0xe4, 0xee, 0xef, 0xe9, 0xea, 0xe3, 0xe6, 0xef,\n    0xe9, 0xe0, 0xe0, 0xe6, 0xec, 0xea, 0xeb, 0xe1, 0xe7, 0xed, 0xed, 0xe8,\n    0xef, 0xe9, 0xe1, 0xe4, 0xe3, 0xe5, 0xee, 0xeb, 0xe5, 0xec, 0xe2, 0xe7,\n    0xe8, 0xe2, 0xe4, 0xee, 0x97, 0x9d, 0x9d, 0x98, 0x9e, 0x9b, 0x93, 0x95,\n    0x90, 0x96, 0x96, 0x9f, 0x99, 0x90, 0x9a, 0x93, 0x91, 0x94, 0x92, 0x97,\n    0x98, 0x92, 0x95, 0x9c, 0x9b, 0x91, 0x9c, 0x9a, 0x94, 0x9e, 0x9f, 0x99,\n    0x9a, 0x93, 0x96, 0x9f, 0x99, 0x90, 0x90, 0x96, 0x9c, 0x9a, 0x9b, 0x91,\n    0x97, 0x9d, 0x9d, 0x98, 0x9f, 0x99, 0x91, 0x94, 0x93, 0x95, 0x9e, 0x9b,\n    0x95, 0x9c, 0x92, 0x97, 0x98, 0x92, 0x94, 0x9e, 0x67, 0x6d, 0x6d, 0x68,\n    0x6e, 0x6b, 0x63, 0x65, 0x60, 0x66, 0x66, 0x6f, 0x69, 0x60, 0x6a, 0x63,\n    0x61, 0x64, 0x62, 0x67, 0x68, 0x62, 0x65, 0x6c, 0x6b, 0x61, 0x6c, 0x6a,\n    0x64, 0x6e, 0x6f, 0x69, 0x6a, 0x63, 0x66, 0x6f, 0x69, 0x60, 0x60, 0x66,\n    0x6c, 0x6a, 0x6b, 0x61, 0x67, 0x6d, 0x6d, 0x68, 0x6f, 0x69, 0x61, 0x64,\n    0x63, 0x65, 0x6e, 0x6b, 0x65, 0x6c, 0x62, 0x67, 0x68, 0x62, 0x64, 0x6e,\n    0x37, 0x3d, 0x3d, 0x38, 0x3e, 0x3b, 0x33, 0x35, 0x30, 0x36, 0x36, 0x3f,\n    0x39, 0x30, 0x3a, 0x33, 0x31, 0x34, 0x32, 0x37, 0x38, 0x32, 0x35, 0x3c,\n    0x3b, 0x31, 0x3c, 0x3a, 0x34, 0x3e, 0x3f, 0x39, 0x3a, 0x33, 0x36, 0x3f,\n    0x39, 0x30, 0x30, 0x36, 0x3c, 0x3a, 0x3b, 0x31, 0x37, 0x3d, 0x3d, 0x38,\n    0x3f, 0x39, 0x31, 0x34, 0x33, 0x35, 0x3e, 0x3b, 0x35, 0x3c, 0x32, 0x37,\n    0x38, 0x32, 0x34, 0x3e, 0x37, 0x3d, 0x3d, 0x38, 0x3e, 0x3b, 0x33, 0x35,\n    0x30, 0x36, 0x36, 0x3f, 0x39, 0x30, 0x3a, 0x33, 0x31, 0x34, 0x32, 0x37,\n    0x38, 0x32, 0x35, 0x3c, 0x3b, 0x31, 0x3c, 0x3a, 0x34, 0x3e, 0x3f, 0x39,\n    0x3a, 0x33, 0x36, 0x3f, 0x39, 0x30, 0x30, 0x36, 0x3c, 0x3a, 0x3b, 0x31,\n    0x37, 0x3d, 0x3d, 0x38, 0x3f, 0x39, 0x31, 0x34, 0x33, 0x35, 0x3e, 0x3b,\n    0x35, 0x3c, 0x32, 0x37, 0x38, 0x32, 0x34, 0x3e, 0x47, 0x4d, 0x4d, 0x48,\n    0x4e, 0x4b, 0x43, 0x45, 0x40, 0x46, 0x46, 0x4f, 0x49, 0x40, 0x4a, 0x43,\n    0x41, 0x44, 0x42, 0x47, 0x48, 0x42, 0x45, 0x4c, 0x4b, 0x41, 0x4c, 0x4a,\n    0x44, 0x4e, 0x4f, 0x49, 0x4a, 0x43, 0x46, 0x4f, 0x49, 0x40, 0x40, 0x46,\n    0x4c, 0x4a, 0x4b, 0x41, 0x47, 0x4d, 0x4d, 0x48, 0x4f, 0x49, 0x41, 0x44,\n    0x43, 0x45, 0x4e, 0x4b, 0x45, 0x4c, 0x42, 0x47, 0x48, 0x42, 0x44, 0x4e,\n    0xf7, 0xfd, 0xfd, 0xf8, 0xfe, 0xfb, 0xf3, 0xf5, 0xf0, 0xf6, 0xf6, 0xff,\n    0xf9, 0xf0, 0xfa, 0xf3, 0xf1, 0xf4, 0xf2, 0xf7, 0xf8, 0xf2, 0xf5, 0xfc,\n    0xfb, 0xf1, 0xfc, 0xfa, 0xf4, 0xfe, 0xff, 0xf9, 0xfa, 0xf3, 0xf6, 0xff,\n    0xf9, 0xf0, 0xf0, 0xf6, 0xfc, 0xfa, 0xfb, 0xf1, 0xf7, 0xfd, 0xfd, 0xf8,\n    0xff, 0xf9, 0xf1, 0xf4, 0xf3, 0xf5, 0xfe, 0xfb, 0xf5, 0xfc, 0xf2, 0xf7,\n    0xf8, 0xf2, 0xf4, 0xfe, 0x67, 0x6d, 0x6d, 0x68, 0x6e, 0x6b, 0x63, 0x65,\n    0x60, 0x66, 0x66, 0x6f, 0x69, 0x60, 0x6a, 0x63, 0x61, 0x64, 0x62, 0x67,\n    0x68, 0x62, 0x65, 0x6c, 0x6b, 0x61, 0x6c, 0x6a, 0x64, 0x6e, 0x6f, 0x69,\n    0x6a, 0x63, 0x66, 0x6f, 0x69, 0x60, 0x60, 0x66, 0x6c, 0x6a, 0x6b, 0x61,\n    0x67, 0x6d, 0x6d, 0x68, 0x6f, 0x69, 0x61, 0x64, 0x63, 0x65, 0x6e, 0x6b,\n    0x65, 0x6c, 0x62, 0x67, 0x68, 0x62, 0x64, 0x6e, 0x57, 0x5d, 0x5d, 0x58,\n    0x5e, 0x5b, 0x53, 0x55, 0x50, 0x56, 0x56, 0x5f, 0x59, 0x50, 0x5a, 0x53,\n    0x51, 0x54, 0x52, 0x57, 0x58, 0x52, 0x55, 0x5c, 0x5b, 0x51, 0x5c, 0x5a,\n    0x54, 0x5e, 0x5f, 0x59, 0x5a, 0x53, 0x56, 0x5f, 0x59, 0x50, 0x50, 0x56,\n    0x5c, 0x5a, 0x5b, 0x51, 0x57, 0x5d, 0x5d, 0x58, 0x5f, 0x59, 0x51, 0x54,\n    0x53, 0x55, 0x5e, 0x5b, 0x55, 0x5c, 0x52, 0x57, 0x58, 0x52, 0x54, 0x5e,\n    0xa7, 0xad, 0xad, 0xa8, 0xae, 0xab, 0xa3, 0xa5, 0xa0, 0xa6, 0xa6, 0xaf,\n    0xa9, 0xa0, 0xaa, 0xa3, 0xa1, 0xa4, 0xa2, 0xa7, 0xa8, 0xa2, 0xa5, 0xac,\n    0xab, 0xa1, 0xac, 0xaa, 0xa4, 0xae, 0xaf, 0xa9, 0xaa, 0xa3, 0xa6, 0xaf,\n    0xa9, 0xa0, 0xa0, 0xa6, 0xac, 0xaa, 0xab, 0xa1, 0xa7, 0xad, 0xad, 0xa8,\n    0xaf, 0xa9, 0xa1, 0xa4, 0xa3, 0xa5, 0xae, 0xab, 0xa5, 0xac, 0xa2, 0xa7,\n    0xa8, 0xa2, 0xa4, 0xae, 0x17, 0x1d, 0x1d, 0x18, 0x1e, 0x1b, 0x13, 0x15,\n    0x10, 0x16, 0x16, 0x1f, 0x19, 0x10, 0x1a, 0x13, 0x11, 0x14, 0x12, 0x17,\n    0x18, 0x12, 0x15, 0x1c, 0x1b, 0x11, 0x1c, 0x1a, 0x14, 0x1e, 0x1f, 0x19,\n    0x1a, 0x13, 0x16, 0x1f, 0x19, 0x10, 0x10, 0x16, 0x1c, 0x1a, 0x1b, 0x11,\n    0x17, 0x1d, 0x1d, 0x18, 0x1f, 0x19, 0x11, 0x14, 0x13, 0x15, 0x1e, 0x1b,\n    0x15, 0x1c, 0x12, 0x17, 0x18, 0x12, 0x14, 0x1e, 0x27, 0x2d, 0x2d, 0x28,\n    0x2e, 0x2b, 0x23, 0x25, 0x20, 0x26, 0x26, 0x2f, 0x29, 0x20, 0x2a, 0x23,\n    0x21, 0x24, 0x22, 0x27, 0x28, 0x22, 0x25, 0x2c, 0x2b, 0x21, 0x2c, 0x2a,\n    0x24, 0x2e, 0x2f, 0x29, 0x2a, 0x23, 0x26, 0x2f, 0x29, 0x20, 0x20, 0x26,\n    0x2c, 0x2a, 0x2b, 0x21, 0x27, 0x2d, 0x2d, 0x28, 0x2f, 0x29, 0x21, 0x24,\n    0x23, 0x25, 0x2e, 0x2b, 0x25, 0x2c, 0x22, 0x27, 0x28, 0x22, 0x24, 0x2e,\n    0xd7, 0xdd, 0xdd, 0xd8, 0xde, 0xdb, 0xd3, 0xd5, 0xd0, 0xd6, 0xd6, 0xdf,\n    0xd9, 0xd0, 0xda, 0xd3, 0xd1, 0xd4, 0xd2, 0xd7, 0xd8, 0xd2, 0xd5, 0xdc,\n    0xdb, 0xd1, 0xdc, 0xda, 0xd4, 0xde, 0xdf, 0xd9, 0xda, 0xd3, 0xd6, 0xdf,\n    0xd9, 0xd0, 0xd0, 0xd6, 0xdc, 0xda, 0xdb, 0xd1, 0xd7, 0xdd, 0xdd, 0xd8,\n    0xdf, 0xd9, 0xd1, 0xd4, 0xd3, 0xd5, 0xde, 0xdb, 0xd5, 0xdc, 0xd2, 0xd7,\n    0xd8, 0xd2, 0xd4, 0xde, 0x87, 0x8d, 0x8d, 0x88, 0x8e, 0x8b, 0x83, 0x85,\n    0x80, 0x86, 0x86, 0x8f, 0x89, 0x80, 0x8a, 0x83, 0x81, 0x84, 0x82, 0x87,\n    0x88, 0x82, 0x85, 0x8c, 0x8b, 0x81, 0x8c, 0x8a, 0x84, 0x8e, 0x8f, 0x89,\n    0x8a, 0x83, 0x86, 0x8f, 0x89, 0x80, 0x80, 0x86, 0x8c, 0x8a, 0x8b, 0x81,\n    0x87, 0x8d, 0x8d, 0x88, 0x8f, 0x89, 0x81, 0x84, 0x83, 0x85, 0x8e, 0x8b,\n    0x85, 0x8c, 0x82, 0x87, 0x88, 0x82, 0x84, 0x8e, 0xc7, 0xcd, 0xcd, 0xc8,\n    0xce, 0xcb, 0xc3, 0xc5, 0xc0, 0xc6, 0xc6, 0xcf, 0xc9, 0xc0, 0xca, 0xc3,\n    0xc1, 0xc4, 0xc2, 0xc7, 0xc8, 0xc2, 0xc5, 0xcc, 0xcb, 0xc1, 0xcc, 0xca,\n    0xc4, 0xce, 0xcf, 0xc9, 0xca, 0xc3, 0xc6, 0xcf, 0xc9, 0xc0, 0xc0, 0xc6,\n    0xcc, 0xca, 0xcb, 0xc1, 0xc7, 0xcd, 0xcd, 0xc8, 0xcf, 0xc9, 0xc1, 0xc4,\n    0xc3, 0xc5, 0xce, 0xcb, 0xc5, 0xcc, 0xc2, 0xc7, 0xc8, 0xc2, 0xc4, 0xce,\n    0x57, 0x5d, 0x5d, 0x58, 0x5e, 0x5b, 0x53, 0x55, 0x50, 0x56, 0x56, 0x5f,\n    0x59, 0x50, 0x5a, 0x53, 0x51, 0x54, 0x52, 0x57, 0x58, 0x52, 0x55, 0x5c,\n    0x5b, 0x51, 0x5c, 0x5a, 0x54, 0x5e, 0x5f, 0x59, 0x5a, 0x53, 0x56, 0x5f,\n    0x59, 0x50, 0x50, 0x56, 0x5c, 0x5a, 0x5b, 0x51, 0x57, 0x5d, 0x5d, 0x58,\n    0x5f, 0x59, 0x51, 0x54, 0x53, 0x55, 0x5e, 0x5b, 0x55, 0x5c, 0x52, 0x57,\n    0x58, 0x52, 0x54, 0x5e, 0x77, 0x7d, 0x7d, 0x78, 0x7e, 0x7b, 0x73, 0x75,\n    0x70, 0x76, 0x76, 0x7f, 0x79, 0x70, 0x7a, 0x73, 0x71, 0x74, 0x72, 0x77,\n    0x78, 0x72, 0x75, 0x7c, 0x7b, 0x71, 0x7c, 0x7a, 0x74, 0x7e, 0x7f, 0x79,\n    0x7a, 0x73, 0x76, 0x7f, 0x79, 0x70, 0x70, 0x76, 0x7c, 0x7a, 0x7b, 0x71,\n    0x77, 0x7d, 0x7d, 0x78, 0x7f, 0x79, 0x71, 0x74, 0x73, 0x75, 0x7e, 0x7b,\n    0x75, 0x7c, 0x72, 0x77, 0x78, 0x72, 0x74, 0x7e, 0xe7, 0xed, 0xed, 0xe8,\n    0xee, 0xeb, 0xe3, 0xe5, 0xe0, 0xe6, 0xe6, 0xef, 0xe9, 0xe0, 0xea, 0xe3,\n    0xe1, 0xe4, 0xe2, 0xe7, 0xe8, 0xe2, 0xe5, 0xec, 0xeb, 0xe1, 0xec, 0xea,\n    0xe4, 0xee, 0xef, 0xe9, 0xea, 0xe3, 0xe6, 0xef, 0xe9, 0xe0, 0xe0, 0xe6,\n    0xec, 0xea, 0xeb, 0xe1, 0xe7, 0xed, 0xed, 0xe8, 0xef, 0xe9, 0xe1, 0xe4,\n    0xe3, 0xe5, 0xee, 0xeb, 0xe5, 0xec, 0xe2, 0xe7, 0xe8, 0xe2, 0xe4, 0xee,\n    0xb7, 0xbd, 0xbd, 0xb8, 0xbe, 0xbb, 0xb3, 0xb5, 0xb0, 0xb6, 0xb6, 0xbf,\n    0xb9, 0xb0, 0xba, 0xb3, 0xb1, 0xb4, 0xb2, 0xb7, 0xb8, 0xb2, 0xb5, 0xbc,\n    0xbb, 0xb1, 0xbc, 0xba, 0xb4, 0xbe, 0xbf, 0xb9, 0xba, 0xb3, 0xb6, 0xbf,\n    0xb9, 0xb0, 0xb0, 0xb6, 0xbc, 0xba, 0xbb, 0xb1, 0xb7, 0xbd, 0xbd, 0xb8,\n    0xbf, 0xb9, 0xb1, 0xb4, 0xb3, 0xb5, 0xbe, 0xbb, 0xb5, 0xbc, 0xb2, 0xb7,\n    0xb8, 0xb2, 0xb4, 0xbe, 0xc7, 0xcd, 0xcd, 0xc8, 0xce, 0xcb, 0xc3, 0xc5,\n    0xc0, 0xc6, 0xc6, 0xcf, 0xc9, 0xc0, 0xca, 0xc3, 0xc1, 0xc4, 0xc2, 0xc7,\n    0xc8, 0xc2, 0xc5, 0xcc, 0xcb, 0xc1, 0xcc, 0xca, 0xc4, 0xce, 0xcf, 0xc9,\n    0xca, 0xc3, 0xc6, 0xcf, 0xc9, 0xc0, 0xc0, 0xc6, 0xcc, 0xca, 0xcb, 0xc1,\n    0xc7, 0xcd, 0xcd, 0xc8, 0xcf, 0xc9, 0xc1, 0xc4, 0xc3, 0xc5, 0xce, 0xcb,\n    0xc5, 0xcc, 0xc2, 0xc7, 0xc8, 0xc2, 0xc4, 0xce, 0x47, 0x4d, 0x4d, 0x48,\n    0x4e, 0x4b, 0x43, 0x45, 0x40, 0x46, 0x46, 0x4f, 0x49, 0x40, 0x4a, 0x43,\n    0x41, 0x44, 0x42, 0x47, 0x48, 0x42, 0x45, 0x4c, 0x4b, 0x41, 0x4c, 0x4a,\n    0x44, 0x4e, 0x4f, 0x49, 0x4a, 0x43, 0x46, 0x4f, 0x49, 0x40, 0x40, 0x46,\n    0x4c, 0x4a, 0x4b, 0x41, 0x47, 0x4d, 0x4d, 0x48, 0x4f, 0x49, 0x41, 0x44,\n    0x43, 0x45, 0x4e, 0x4b, 0x45, 0x4c, 0x42, 0x47, 0x48, 0x42, 0x44, 0x4e,\n    0xb7, 0xbd, 0xbd, 0xb8, 0xbe, 0xbb, 0xb3, 0xb5, 0xb0, 0xb6, 0xb6, 0xbf,\n    0xb9, 0xb0, 0xba, 0xb3, 0xb1, 0xb4, 0xb2, 0xb7, 0xb8, 0xb2, 0xb5, 0xbc,\n    0xbb, 0xb1, 0xbc, 0xba, 0xb4, 0xbe, 0xbf, 0xb9, 0xba, 0xb3, 0xb6, 0xbf,\n    0xb9, 0xb0, 0xb0, 0xb6, 0xbc, 0xba, 0xbb, 0xb1, 0xb7, 0xbd, 0xbd, 0xb8,\n    0xbf, 0xb9, 0xb1, 0xb4, 0xb3, 0xb5, 0xbe, 0xbb, 0xb5, 0xbc, 0xb2, 0xb7,\n    0xb8, 0xb2, 0xb4, 0xbe, 0x27, 0x2d, 0x2d, 0x28, 0x2e, 0x2b, 0x23, 0x25,\n    0x20, 0x26, 0x26, 0x2f, 0x29, 0x20, 0x2a, 0x23, 0x21, 0x24, 0x22, 0x27,\n    0x28, 0x22, 0x25, 0x2c, 0x2b, 0x21, 0x2c, 0x2a, 0x24, 0x2e, 0x2f, 0x29,\n    0x2a, 0x23, 0x26, 0x2f, 0x29, 0x20, 0x20, 0x26, 0x2c, 0x2a, 0x2b, 0x21,\n    0x27, 0x2d, 0x2d, 0x28, 0x2f, 0x29, 0x21, 0x24, 0x23, 0x25, 0x2e, 0x2b,\n    0x25, 0x2c, 0x22, 0x27, 0x28, 0x22, 0x24, 0x2e, 0xf7, 0xfd, 0xfd, 0xf8,\n    0xfe, 0xfb, 0xf3, 0xf5, 0xf0, 0xf6, 0xf6, 0xff, 0xf9, 0xf0, 0xfa, 0xf3,\n    0xf1, 0xf4, 0xf2, 0xf7, 0xf8, 0xf2, 0xf5, 0xfc, 0xfb, 0xf1, 0xfc, 0xfa,\n    0xf4, 0xfe, 0xff, 0xf9, 0xfa, 0xf3, 0xf6, 0xff, 0xf9, 0xf0, 0xf0, 0xf6,\n    0xfc, 0xfa, 0xfb, 0xf1, 0xf7, 0xfd, 0xfd, 0xf8, 0xff, 0xf9, 0xf1, 0xf4,\n    0xf3, 0xf5, 0xfe, 0xfb, 0xf5, 0xfc, 0xf2, 0xf7, 0xf8, 0xf2, 0xf4, 0xfe,\n    0x87, 0x8d, 0x8d, 0x88, 0x8e, 0x8b, 0x83, 0x85, 0x80, 0x86, 0x86, 0x8f,\n    0x89, 0x80, 0x8a, 0x83, 0x81, 0x84, 0x82, 0x87, 0x88, 0x82, 0x85, 0x8c,\n    0x8b, 0x81, 0x8c, 0x8a, 0x84, 0x8e, 0x8f, 0x89, 0x8a, 0x83, 0x86, 0x8f,\n    0x89, 0x80, 0x80, 0x86, 0x8c, 0x8a, 0x8b, 0x81, 0x87, 0x8d, 0x8d, 0x88,\n    0x8f, 0x89, 0x81, 0x84, 0x83, 0x85, 0x8e, 0x8b, 0x85, 0x8c, 0x82, 0x87,\n    0x88, 0x82, 0x84, 0x8e, 0x17, 0x1d, 0x1d, 0x18, 0x1e, 0x1b, 0x13, 0x15,\n    0x10, 0x16, 0x16, 0x1f, 0x19, 0x10, 0x1a, 0x13, 0x11, 0x14, 0x12, 0x17,\n    0x18, 0x12, 0x15, 0x1c, 0x1b, 0x11, 0x1c, 0x1a, 0x14, 0x1e, 0x1f, 0x19,\n    0x1a, 0x13, 0x16, 0x1f, 0x19, 0x10, 0x10, 0x16, 0x1c, 0x1a, 0x1b, 0x11,\n    0x17, 0x1d, 0x1d, 0x18, 0x1f, 0x19, 0x11, 0x14, 0x13, 0x15, 0x1e, 0x1b,\n    0x15, 0x1c, 0x12, 0x17, 0x18, 0x12, 0x14, 0x1e, 0xd7, 0xdd, 0xdd, 0xd8,\n    0xde, 0xdb, 0xd3, 0xd5, 0xd0, 0xd6, 0xd6, 0xdf, 0xd9, 0xd0, 0xda, 0xd3,\n    0xd1, 0xd4, 0xd2, 0xd7, 0xd8, 0xd2, 0xd5, 0xdc, 0xdb, 0xd1, 0xdc, 0xda,\n    0xd4, 0xde, 0xdf, 0xd9, 0xda, 0xd3, 0xd6, 0xdf, 0xd9, 0xd0, 0xd0, 0xd6,\n    0xdc, 0xda, 0xdb, 0xd1, 0xd7, 0xdd, 0xdd, 0xd8, 0xdf, 0xd9, 0xd1, 0xd4,\n    0xd3, 0xd5, 0xde, 0xdb, 0xd5, 0xdc, 0xd2, 0xd7, 0xd8, 0xd2, 0xd4, 0xde,\n    0x17, 0x1d, 0x1d, 0x18, 0x1e, 0x1b, 0x13, 0x15, 0x10, 0x16, 0x16, 0x1f,\n    0x19, 0x10, 0x1a, 0x13, 0x11, 0x14, 0x12, 0x17, 0x18, 0x12, 0x15, 0x1c,\n    0x1b, 0x11, 0x1c, 0x1a, 0x14, 0x1e, 0x1f, 0x19, 0x1a, 0x13, 0x16, 0x1f,\n    0x19, 0x10, 0x10, 0x16, 0x1c, 0x1a, 0x1b, 0x11, 0x17, 0x1d, 0x1d, 0x18,\n    0x1f, 0x19, 0x11, 0x14, 0x13, 0x15, 0x1e, 0x1b, 0x15, 0x1c, 0x12, 0x17,\n    0x18, 0x12, 0x14, 0x1e, 0x67, 0x6d, 0x6d, 0x68, 0x6e, 0x6b, 0x63, 0x65,\n    0x60, 0x66, 0x66, 0x6f, 0x69, 0x60, 0x6a, 0x63, 0x61, 0x64, 0x62, 0x67,\n    0x68, 0x62, 0x65, 0x6c, 0x6b, 0x61, 0x6c, 0x6a, 0x64, 0x6e, 0x6f, 0x69,\n    0x6a, 0x63, 0x66, 0x6f, 0x69, 0x60, 0x60, 0x66, 0x6c, 0x6a, 0x6b, 0x61,\n    0x67, 0x6d, 0x6d, 0x68, 0x6f, 0x69, 0x61, 0x64, 0x63, 0x65, 0x6e, 0x6b,\n    0x65, 0x6c, 0x62, 0x67, 0x68, 0x62, 0x64, 0x6e, 0xa7, 0xad, 0xad, 0xa8,\n    0xae, 0xab, 0xa3, 0xa5, 0xa0, 0xa6, 0xa6, 0xaf, 0xa9, 0xa0, 0xaa, 0xa3,\n    0xa1, 0xa4, 0xa2, 0xa7, 0xa8, 0xa2, 0xa5, 0xac, 0xab, 0xa1, 0xac, 0xaa,\n    0xa4, 0xae, 0xaf, 0xa9, 0xaa, 0xa3, 0xa6, 0xaf, 0xa9, 0xa0, 0xa0, 0xa6,\n    0xac, 0xaa, 0xab, 0xa1, 0xa7, 0xad, 0xad, 0xa8, 0xaf, 0xa9, 0xa1, 0xa4,\n    0xa3, 0xa5, 0xae, 0xab, 0xa5, 0xac, 0xa2, 0xa7, 0xa8, 0xa2, 0xa4, 0xae,\n    0x47, 0x4d, 0x4d, 0x48, 0x4e, 0x4b, 0x43, 0x45, 0x40, 0x46, 0x46, 0x4f,\n    0x49, 0x40, 0x4a, 0x43, 0x41, 0x44, 0x42, 0x47, 0x48, 0x42, 0x45, 0x4c,\n    0x4b, 0x41, 0x4c, 0x4a, 0x44, 0x4e, 0x4f, 0x49, 0x4a, 0x43, 0x46, 0x4f,\n    0x49, 0x40, 0x40, 0x46, 0x4c, 0x4a, 0x4b, 0x41, 0x47, 0x4d, 0x4d, 0x48,\n    0x4f, 0x49, 0x41, 0x44, 0x43, 0x45, 0x4e, 0x4b, 0x45, 0x4c, 0x42, 0x47,\n    0x48, 0x42, 0x44, 0x4e, 0xd7, 0xdd, 0xdd, 0xd8, 0xde, 0xdb, 0xd3, 0xd5,\n    0xd0, 0xd6, 0xd6, 0xdf, 0xd9, 0xd0, 0xda, 0xd3, 0xd1, 0xd4, 0xd2, 0xd7,\n    0xd8, 0xd2, 0xd5, 0xdc, 0xdb, 0xd1, 0xdc, 0xda, 0xd4, 0xde, 0xdf, 0xd9,\n    0xda, 0xd3, 0xd6, 0xdf, 0xd9, 0xd0, 0xd0, 0xd6, 0xdc, 0xda, 0xdb, 0xd1,\n    0xd7, 0xdd, 0xdd, 0xd8, 0xdf, 0xd9, 0xd1, 0xd4, 0xd3, 0xd5, 0xde, 0xdb,\n    0xd5, 0xdc, 0xd2, 0xd7, 0xd8, 0xd2, 0xd4, 0xde, 0x97, 0x9d, 0x9d, 0x98,\n    0x9e, 0x9b, 0x93, 0x95, 0x90, 0x96, 0x96, 0x9f, 0x99, 0x90, 0x9a, 0x93,\n    0x91, 0x94, 0x92, 0x97, 0x98, 0x92, 0x95, 0x9c, 0x9b, 0x91, 0x9c, 0x9a,\n    0x94, 0x9e, 0x9f, 0x99, 0x9a, 0x93, 0x96, 0x9f, 0x99, 0x90, 0x90, 0x96,\n    0x9c, 0x9a, 0x9b, 0x91, 0x97, 0x9d, 0x9d, 0x98, 0x9f, 0x99, 0x91, 0x94,\n    0x93, 0x95, 0x9e, 0x9b, 0x95, 0x9c, 0x92, 0x97, 0x98, 0x92, 0x94, 0x9e,\n    0x07, 0x0d, 0x0d, 0x08, 0x0e, 0x0b, 0x03, 0x05, 0x00, 0x06, 0x06, 0x0f,\n    0x09, 0x00, 0x0a, 0x03, 0x01, 0x04, 0x02, 0x07, 0x08, 0x02, 0x05, 0x0c,\n    0x0b, 0x01, 0x0c, 0x0a, 0x04, 0x0e, 0x0f, 0x09, 0x0a, 0x03, 0x06, 0x0f,\n    0x09, 0x00, 0x00, 0x06, 0x0c, 0x0a, 0x0b, 0x01, 0x07, 0x0d, 0x0d, 0x08,\n    0x0f, 0x09, 0x01, 0x04, 0x03, 0x05, 0x0e, 0x0b, 0x05, 0x0c, 0x02, 0x07,\n    0x08, 0x02, 0x04, 0x0e, 0x87, 0x8d, 0x8d, 0x88, 0x8e, 0x8b, 0x83, 0x85,\n    0x80, 0x86, 0x86, 0x8f, 0x89, 0x80, 0x8a, 0x83, 0x81, 0x84, 0x82, 0x87,\n    0x88, 0x82, 0x85, 0x8c, 0x8b, 0x81, 0x8c, 0x8a, 0x84, 0x8e, 0x8f, 0x89,\n    0x8a, 0x83, 0x86, 0x8f, 0x89, 0x80, 0x80, 0x86, 0x8c, 0x8a, 0x8b, 0x81,\n    0x87, 0x8d, 0x8d, 0x88, 0x8f, 0x89, 0x81, 0x84, 0x83, 0x85, 0x8e, 0x8b,\n    0x85, 0x8c, 0x82, 0x87, 0x88, 0x82, 0x84, 0x8e, 0x67, 0x6d, 0x6d, 0x68,\n    0x6e, 0x6b, 0x63, 0x65, 0x60, 0x66, 0x66, 0x6f, 0x69, 0x60, 0x6a, 0x63,\n    0x61, 0x64, 0x62, 0x67, 0x68, 0x62, 0x65, 0x6c, 0x6b, 0x61, 0x6c, 0x6a,\n    0x64, 0x6e, 0x6f, 0x69, 0x6a, 0x63, 0x66, 0x6f, 0x69, 0x60, 0x60, 0x66,\n    0x6c, 0x6a, 0x6b, 0x61, 0x67, 0x6d, 0x6d, 0x68, 0x6f, 0x69, 0x61, 0x64,\n    0x63, 0x65, 0x6e, 0x6b, 0x65, 0x6c, 0x62, 0x67, 0x68, 0x62, 0x64, 0x6e,\n    0xf7, 0xfd, 0xfd, 0xf8, 0xfe, 0xfb, 0xf3, 0xf5, 0xf0, 0xf6, 0xf6, 0xff,\n    0xf9, 0xf0, 0xfa, 0xf3, 0xf1, 0xf4, 0xf2, 0xf7, 0xf8, 0xf2, 0xf5, 0xfc,\n    0xfb, 0xf1, 0xfc, 0xfa, 0xf4, 0xfe, 0xff, 0xf9, 0xfa, 0xf3, 0xf6, 0xff,\n    0xf9, 0xf0, 0xf0, 0xf6, 0xfc, 0xfa, 0xfb, 0xf1, 0xf7, 0xfd, 0xfd, 0xf8,\n    0xff, 0xf9, 0xf1, 0xf4, 0xf3, 0xf5, 0xfe, 0xfb, 0xf5, 0xfc, 0xf2, 0xf7,\n    0xf8, 0xf2, 0xf4, 0xfe, 0x97, 0x9d, 0x9d, 0x98, 0x9e, 0x9b, 0x93, 0x95,\n    0x90, 0x96, 0x96, 0x9f, 0x99, 0x90, 0x9a, 0x93, 0x91, 0x94, 0x92, 0x97,\n    0x98, 0x92, 0x95, 0x9c, 0x9b, 0x91, 0x9c, 0x9a, 0x94, 0x9e, 0x9f, 0x99,\n    0x9a, 0x93, 0x96, 0x9f, 0x99, 0x90, 0x90, 0x96, 0x9c, 0x9a, 0x9b, 0x91,\n    0x97, 0x9d, 0x9d, 0x98, 0x9f, 0x99, 0x91, 0x94, 0x93, 0x95, 0x9e, 0x9b,\n    0x95, 0x9c, 0x92, 0x97, 0x98, 0x92, 0x94, 0x9e, 0x37, 0x3d, 0x3d, 0x38,\n    0x3e, 0x3b, 0x33, 0x35, 0x30, 0x36, 0x36, 0x3f, 0x39, 0x30, 0x3a, 0x33,\n    0x31, 0x34, 0x32, 0x37, 0x38, 0x32, 0x35, 0x3c, 0x3b, 0x31, 0x3c, 0x3a,\n    0x34, 0x3e, 0x3f, 0x39, 0x3a, 0x33, 0x36, 0x3f, 0x39, 0x30, 0x30, 0x36,\n    0x3c, 0x3a, 0x3b, 0x31, 0x37, 0x3d, 0x3d, 0x38, 0x3f, 0x39, 0x31, 0x34,\n    0x33, 0x35, 0x3e, 0x3b, 0x35, 0x3c, 0x32, 0x37, 0x38, 0x32, 0x34, 0x3e,\n    0x87, 0x8d, 0x8d, 0x88, 0x8e, 0x8b, 0x83, 0x85, 0x80, 0x86, 0x86, 0x8f,\n    0x89, 0x80, 0x8a, 0x83, 0x81, 0x84, 0x82, 0x87, 0x88, 0x82, 0x85, 0x8c,\n    0x8b, 0x81, 0x8c, 0x8a, 0x84, 0x8e, 0x8f, 0x89, 0x8a, 0x83, 0x86, 0x8f,\n    0x89, 0x80, 0x80, 0x86, 0x8c, 0x8a, 0x8b, 0x81, 0x87, 0x8d, 0x8d, 0x88,\n    0x8f, 0x89, 0x81, 0x84, 0x83, 0x85, 0x8e, 0x8b, 0x85, 0x8c, 0x82, 0x87,\n    0x88, 0x82, 0x84, 0x8e, 0x07, 0x0d, 0x0d, 0x08, 0x0e, 0x0b, 0x03, 0x05,\n    0x00, 0x06, 0x06, 0x0f, 0x09, 0x00, 0x0a, 0x03, 0x01, 0x04, 0x02, 0x07,\n    0x08, 0x02, 0x05, 0x0c, 0x0b, 0x01, 0x0c, 0x0a, 0x04, 0x0e, 0x0f, 0x09,\n    0x0a, 0x03, 0x06, 0x0f, 0x09, 0x00, 0x00, 0x06, 0x0c, 0x0a, 0x0b, 0x01,\n    0x07, 0x0d, 0x0d, 0x08, 0x0f, 0x09, 0x01, 0x04, 0x03, 0x05, 0x0e, 0x0b,\n    0x05, 0x0c, 0x02, 0x07, 0x08, 0x02, 0x04, 0x0e, 0x77, 0x7d, 0x7d, 0x78,\n    0x7e, 0x7b, 0x73, 0x75, 0x70, 0x76, 0x76, 0x7f, 0x79, 0x70, 0x7a, 0x73,\n    0x71, 0x74, 0x72, 0x77, 0x78, 0x72, 0x75, 0x7c, 0x7b, 0x71, 0x7c, 0x7a,\n    0x74, 0x7e, 0x7f, 0x79, 0x7a, 0x73, 0x76, 0x7f, 0x79, 0x70, 0x70, 0x76,\n    0x7c, 0x7a, 0x7b, 0x71, 0x77, 0x7d, 0x7d, 0x78, 0x7f, 0x79, 0x71, 0x74,\n    0x73, 0x75, 0x7e, 0x7b, 0x75, 0x7c, 0x72, 0x77, 0x78, 0x72, 0x74, 0x7e,\n    0xb7, 0xbd, 0xbd, 0xb8, 0xbe, 0xbb, 0xb3, 0xb5, 0xb0, 0xb6, 0xb6, 0xbf,\n    0xb9, 0xb0, 0xba, 0xb3, 0xb1, 0xb4, 0xb2, 0xb7, 0xb8, 0xb2, 0xb5, 0xbc,\n    0xbb, 0xb1, 0xbc, 0xba, 0xb4, 0xbe, 0xbf, 0xb9, 0xba, 0xb3, 0xb6, 0xbf,\n    0xb9, 0xb0, 0xb0, 0xb6, 0xbc, 0xba, 0xbb, 0xb1, 0xb7, 0xbd, 0xbd, 0xb8,\n    0xbf, 0xb9, 0xb1, 0xb4, 0xb3, 0xb5, 0xbe, 0xbb, 0xb5, 0xbc, 0xb2, 0xb7,\n    0xb8, 0xb2, 0xb4, 0xbe, 0x47, 0x4d, 0x4d, 0x48, 0x4e, 0x4b, 0x43, 0x45,\n    0x40, 0x46, 0x46, 0x4f, 0x49, 0x40, 0x4a, 0x43, 0x41, 0x44, 0x42, 0x47,\n    0x48, 0x42, 0x45, 0x4c, 0x4b, 0x41, 0x4c, 0x4a, 0x44, 0x4e, 0x4f, 0x49,\n    0x4a, 0x43, 0x46, 0x4f, 0x49, 0x40, 0x40, 0x46, 0x4c, 0x4a, 0x4b, 0x41,\n    0x47, 0x4d, 0x4d, 0x48, 0x4f, 0x49, 0x41, 0x44, 0x43, 0x45, 0x4e, 0x4b,\n    0x45, 0x4c, 0x42, 0x47, 0x48, 0x42, 0x44, 0x4e, 0x17, 0x1d, 0x1d, 0x18,\n    0x1e, 0x1b, 0x13, 0x15, 0x10, 0x16, 0x16, 0x1f, 0x19, 0x10, 0x1a, 0x13,\n    0x11, 0x14, 0x12, 0x17, 0x18, 0x12, 0x15, 0x1c, 0x1b, 0x11, 0x1c, 0x1a,\n    0x14, 0x1e, 0x1f, 0x19, 0x1a, 0x13, 0x16, 0x1f, 0x19, 0x10, 0x10, 0x16,\n    0x1c, 0x1a, 0x1b, 0x11, 0x17, 0x1d, 0x1d, 0x18, 0x1f, 0x19, 0x11, 0x14,\n    0x13, 0x15, 0x1e, 0x1b, 0x15, 0x1c, 0x12, 0x17, 0x18, 0x12, 0x14, 0x1e,\n    0xf7, 0xfd, 0xfd, 0xf8, 0xfe, 0xfb, 0xf3, 0xf5, 0xf0, 0xf6, 0xf6, 0xff,\n    0xf9, 0xf0, 0xfa, 0xf3, 0xf1, 0xf4, 0xf2, 0xf7, 0xf8, 0xf2, 0xf5, 0xfc,\n    0xfb, 0xf1, 0xfc, 0xfa, 0xf4, 0xfe, 0xff, 0xf9, 0xfa, 0xf3, 0xf6, 0xff,\n    0xf9, 0xf0, 0xf0, 0xf6, 0xfc, 0xfa, 0xfb, 0xf1, 0xf7, 0xfd, 0xfd, 0xf8,\n    0xff, 0xf9, 0xf1, 0xf4, 0xf3, 0xf5, 0xfe, 0xfb, 0xf5, 0xfc, 0xf2, 0xf7,\n    0xf8, 0xf2, 0xf4, 0xfe, 0x27, 0x2d, 0x2d, 0x28, 0x2e, 0x2b, 0x23, 0x25,\n    0x20, 0x26, 0x26, 0x2f, 0x29, 0x20, 0x2a, 0x23, 0x21, 0x24, 0x22, 0x27,\n    0x28, 0x22, 0x25, 0x2c, 0x2b, 0x21, 0x2c, 0x2a, 0x24, 0x2e, 0x2f, 0x29,\n    0x2a, 0x23, 0x26, 0x2f, 0x29, 0x20, 0x20, 0x26, 0x2c, 0x2a, 0x2b, 0x21,\n    0x27, 0x2d, 0x2d, 0x28, 0x2f, 0x29, 0x21, 0x24, 0x23, 0x25, 0x2e, 0x2b,\n    0x25, 0x2c, 0x22, 0x27, 0x28, 0x22, 0x24, 0x2e, 0xe7, 0xed, 0xed, 0xe8,\n    0xee, 0xeb, 0xe3, 0xe5, 0xe0, 0xe6, 0xe6, 0xef, 0xe9, 0xe0, 0xea, 0xe3,\n    0xe1, 0xe4, 0xe2, 0xe7, 0xe8, 0xe2, 0xe5, 0xec, 0xeb, 0xe1, 0xec, 0xea,\n    0xe4, 0xee, 0xef, 0xe9, 0xea, 0xe3, 0xe6, 0xef, 0xe9, 0xe0, 0xe0, 0xe6,\n    0xec, 0xea, 0xeb, 0xe1, 0xe7, 0xed, 0xed, 0xe8, 0xef, 0xe9, 0xe1, 0xe4,\n    0xe3, 0xe5, 0xee, 0xeb, 0xe5, 0xec, 0xe2, 0xe7, 0xe8, 0xe2, 0xe4, 0xee,\n    0xc7, 0xcd, 0xcd, 0xc8, 0xce, 0xcb, 0xc3, 0xc5, 0xc0, 0xc6, 0xc6, 0xcf,\n    0xc9, 0xc0, 0xca, 0xc3, 0xc1, 0xc4, 0xc2, 0xc7, 0xc8, 0xc2, 0xc5, 0xcc,\n    0xcb, 0xc1, 0xcc, 0xca, 0xc4, 0xce, 0xcf, 0xc9, 0xca, 0xc3, 0xc6, 0xcf,\n    0xc9, 0xc0, 0xc0, 0xc6, 0xcc, 0xca, 0xcb, 0xc1, 0xc7, 0xcd, 0xcd, 0xc8,\n    0xcf, 0xc9, 0xc1, 0xc4, 0xc3, 0xc5, 0xce, 0xcb, 0xc5, 0xcc, 0xc2, 0xc7,\n    0xc8, 0xc2, 0xc4, 0xce, 0x37, 0x3d, 0x3d, 0x38, 0x3e, 0x3b, 0x33, 0x35,\n    0x30, 0x36, 0x36, 0x3f, 0x39, 0x30, 0x3a, 0x33, 0x31, 0x34, 0x32, 0x37,\n    0x38, 0x32, 0x35, 0x3c, 0x3b, 0x31, 0x3c, 0x3a, 0x34, 0x3e, 0x3f, 0x39,\n    0x3a, 0x33, 0x36, 0x3f, 0x39, 0x30, 0x30, 0x36, 0x3c, 0x3a, 0x3b, 0x31,\n    0x37, 0x3d, 0x3d, 0x38, 0x3f, 0x39, 0x31, 0x34, 0x33, 0x35, 0x3e, 0x3b,\n    0x35, 0x3c, 0x32, 0x37, 0x38, 0x32, 0x34, 0x3e, 0x57, 0x5d, 0x5d, 0x58,\n    0x5e, 0x5b, 0x53, 0x55, 0x50, 0x56, 0x56, 0x5f, 0x59, 0x50, 0x5a, 0x53,\n    0x51, 0x54, 0x52, 0x57, 0x58, 0x52, 0x55, 0x5c, 0x5b, 0x51, 0x5c, 0x5a,\n    0x54, 0x5e, 0x5f, 0x59, 0x5a, 0x53, 0x56, 0x5f, 0x59, 0x50, 0x50, 0x56,\n    0x5c, 0x5a, 0x5b, 0x51, 0x57, 0x5d, 0x5d, 0x58, 0x5f, 0x59, 0x51, 0x54,\n    0x53, 0x55, 0x5e, 0x5b, 0x55, 0x5c, 0x52, 0x57, 0x58, 0x52, 0x54, 0x5e,\n    0xb7, 0xbd, 0xbd, 0xb8, 0xbe, 0xbb, 0xb3, 0xb5, 0xb0, 0xb6, 0xb6, 0xbf,\n    0xb9, 0xb0, 0xba, 0xb3, 0xb1, 0xb4, 0xb2, 0xb7, 0xb8, 0xb2, 0xb5, 0xbc,\n    0xbb, 0xb1, 0xbc, 0xba, 0xb4, 0xbe, 0xbf, 0xb9, 0xba, 0xb3, 0xb6, 0xbf,\n    0xb9, 0xb0, 0xb0, 0xb6, 0xbc, 0xba, 0xbb, 0xb1, 0xb7, 0xbd, 0xbd, 0xb8,\n    0xbf, 0xb9, 0xb1, 0xb4, 0xb3, 0xb5, 0xbe, 0xbb, 0xb5, 0xbc, 0xb2, 0xb7,\n    0xb8, 0xb2, 0xb4, 0xbe, 0xa7, 0xad, 0xad, 0xa8, 0xae, 0xab, 0xa3, 0xa5,\n    0xa0, 0xa6, 0xa6, 0xaf, 0xa9, 0xa0, 0xaa, 0xa3, 0xa1, 0xa4, 0xa2, 0xa7,\n    0xa8, 0xa2, 0xa5, 0xac, 0xab, 0xa1, 0xac, 0xaa, 0xa4, 0xae, 0xaf, 0xa9,\n    0xaa, 0xa3, 0xa6, 0xaf, 0xa9, 0xa0, 0xa0, 0xa6, 0xac, 0xaa, 0xab, 0xa1,\n    0xa7, 0xad, 0xad, 0xa8, 0xaf, 0xa9, 0xa1, 0xa4, 0xa3, 0xa5, 0xae, 0xab,\n    0xa5, 0xac, 0xa2, 0xa7, 0xa8, 0xa2, 0xa4, 0xae, 0x57, 0x5d, 0x5d, 0x58,\n    0x5e, 0x5b, 0x53, 0x55, 0x50, 0x56, 0x56, 0x5f, 0x59, 0x50, 0x5a, 0x53,\n    0x51, 0x54, 0x52, 0x57, 0x58, 0x52, 0x55, 0x5c, 0x5b, 0x51, 0x5c, 0x5a,\n    0x54, 0x5e, 0x5f, 0x59, 0x5a, 0x53, 0x56, 0x5f, 0x59, 0x50, 0x50, 0x56,\n    0x5c, 0x5a, 0x5b, 0x51, 0x57, 0x5d, 0x5d, 0x58, 0x5f, 0x59, 0x51, 0x54,\n    0x53, 0x55, 0x5e, 0x5b, 0x55, 0x5c, 0x52, 0x57, 0x58, 0x52, 0x54, 0x5e,\n    0xe7, 0xed, 0xed, 0xe8, 0xee, 0xeb, 0xe3, 0xe5, 0xe0, 0xe6, 0xe6, 0xef,\n    0xe9, 0xe0, 0xea, 0xe3, 0xe1, 0xe4, 0xe2, 0xe7, 0xe8, 0xe2, 0xe5, 0xec,\n    0xeb, 0xe1, 0xec, 0xea, 0xe4, 0xee, 0xef, 0xe9, 0xea, 0xe3, 0xe6, 0xef,\n    0xe9, 0xe0, 0xe0, 0xe6, 0xec, 0xea, 0xeb, 0xe1, 0xe7, 0xed, 0xed, 0xe8,\n    0xef, 0xe9, 0xe1, 0xe4, 0xe3, 0xe5, 0xee, 0xeb, 0xe5, 0xec, 0xe2, 0xe7,\n    0xe8, 0xe2, 0xe4, 0xee, 0x27, 0x2d, 0x2d, 0x28, 0x2e, 0x2b, 0x23, 0x25,\n    0x20, 0x26, 0x26, 0x2f, 0x29, 0x20, 0x2a, 0x23, 0x21, 0x24, 0x22, 0x27,\n    0x28, 0x22, 0x25, 0x2c, 0x2b, 0x21, 0x2c, 0x2a, 0x24, 0x2e, 0x2f, 0x29,\n    0x2a, 0x23, 0x26, 0x2f, 0x29, 0x20, 0x20, 0x26, 0x2c, 0x2a, 0x2b, 0x21,\n    0x27, 0x2d, 0x2d, 0x28, 0x2f, 0x29, 0x21, 0x24, 0x23, 0x25, 0x2e, 0x2b,\n    0x25, 0x2c, 0x22, 0x27, 0x28, 0x22, 0x24, 0x2e, 0x77, 0x7d, 0x7d, 0x78,\n    0x7e, 0x7b, 0x73, 0x75, 0x70, 0x76, 0x76, 0x7f, 0x79, 0x70, 0x7a, 0x73,\n    0x71, 0x74, 0x72, 0x77, 0x78, 0x72, 0x75, 0x7c, 0x7b, 0x71, 0x7c, 0x7a,\n    0x74, 0x7e, 0x7f, 0x79, 0x7a, 0x73, 0x76, 0x7f, 0x79, 0x70, 0x70, 0x76,\n    0x7c, 0x7a, 0x7b, 0x71, 0x77, 0x7d, 0x7d, 0x78, 0x7f, 0x79, 0x71, 0x74,\n    0x73, 0x75, 0x7e, 0x7b, 0x75, 0x7c, 0x72, 0x77, 0x78, 0x72, 0x74, 0x7e,\n    0xc7, 0xcd, 0xcd, 0xc8, 0xce, 0xcb, 0xc3, 0xc5, 0xc0, 0xc6, 0xc6, 0xcf,\n    0xc9, 0xc0, 0xca, 0xc3, 0xc1, 0xc4, 0xc2, 0xc7, 0xc8, 0xc2, 0xc5, 0xcc,\n    0xcb, 0xc1, 0xcc, 0xca, 0xc4, 0xce, 0xcf, 0xc9, 0xca, 0xc3, 0xc6, 0xcf,\n    0xc9, 0xc0, 0xc0, 0xc6, 0xcc, 0xca, 0xcb, 0xc1, 0xc7, 0xcd, 0xcd, 0xc8,\n    0xcf, 0xc9, 0xc1, 0xc4, 0xc3, 0xc5, 0xce, 0xcb, 0xc5, 0xcc, 0xc2, 0xc7,\n    0xc8, 0xc2, 0xc4, 0xce,\n  },\n  {\n    0x2c, 0x2a, 0x21, 0x2f, 0x2a, 0x24, 0x2f, 0x22, 0x29, 0x27, 0x22, 0x2c,\n    0x26, 0x29, 0x28, 0x25, 0x20, 0x26, 0x2d, 0x21, 0x23, 0x2d, 0x24, 0x2e,\n    0x2e, 0x20, 0x27, 0x2b, 0x25, 0x23, 0x2b, 0x28, 0x29, 0x24, 0x2e, 0x23,\n    0x2f, 0x22, 0x25, 0x2c, 0x22, 0x29, 0x28, 0x25, 0x2c, 0x2f, 0x23, 0x2a,\n    0x27, 0x2b, 0x20, 0x2e, 0x24, 0x21, 0x2a, 0x27, 0x21, 0x26, 0x2d, 0x20,\n    0x2b, 0x28, 0x26, 0x2d, 0xec, 0xea, 0xe1, 0xef, 0xea, 0xe4, 0xef, 0xe2,\n    0xe9, 0xe7, 0xe2, 0xec, 0xe6, 0xe9, 0xe8, 0xe5, 0xe0, 0xe6, 0xed, 0xe1,\n    0xe3, 0xed, 0xe4, 0xee, 0xee, 0xe0, 0xe7, 0xeb, 0xe5, 0xe3, 0xeb, 0xe8,\n    0xe9, 0xe4, 0xee, 0xe3, 0xef, 0xe2, 0xe5, 0xec, 0xe2, 0xe9, 0xe8, 0xe5,\n    0xec, 0xef, 0xe3, 0xea, 0xe7, 0xeb, 0xe0, 0xee, 0xe4, 0xe1, 0xea, 0xe7,\n    0xe1, 0xe6, 0xed, 0xe0, 0xeb, 0xe8, 0xe6, 0xed, 0xcc, 0xca, 0xc1, 0xcf,\n    0xca, 0xc4, 0xcf, 0xc2, 0xc9, 0xc7, 0xc2, 0xcc, 0xc6, 0xc9, 0xc8, 0xc5,\n    0xc0, 0xc6, 0xcd, 0xc1, 0xc3, 0xcd, 0xc4, 0xce, 0xce, 0xc0, 0xc7, 0xcb,\n    0xc5, 0xc3, 0xcb, 0xc8, 0xc9, 0xc4, 0xce, 0xc3, 0xcf, 0xc2, 0xc5, 0xcc,\n    0xc2, 0xc9, 0xc8, 0xc5, 0xcc, 0xcf, 0xc3, 0xca, 0xc7, 0xcb, 0xc0, 0xce,\n    0xc4, 0xc1, 0xca, 0xc7, 0xc1, 0xc6, 0xcd, 0xc0, 0xcb, 0xc8, 0xc6, 0xcd,\n    0xbc, 0xba, 0xb1, 0xbf, 0xba, 0xb4, 0xbf, 0xb2, 0xb9, 0xb7, 0xb2, 0xbc,\n    0xb6, 0xb9, 0xb8, 0xb5, 0xb0, 0xb6, 0xbd, 0xb1, 0xb3, 0xbd, 0xb4, 0xbe,\n    0xbe, 0xb0, 0xb7, 0xbb, 0xb5, 0xb3, 0xbb, 0xb8, 0xb9, 0xb4, 0xbe, 0xb3,\n    0xbf, 0xb2, 0xb5, 0xbc, 0xb2, 0xb9, 0xb8, 0xb5, 0xbc, 0xbf, 0xb3, 0xba,\n    0xb7, 0xbb, 0xb0, 0xbe, 0xb4, 0xb1, 0xba, 0xb7, 0xb1, 0xb6, 0xbd, 0xb0,\n    0xbb, 0xb8, 0xb6, 0xbd, 0x4c, 0x4a, 0x41, 0x4f, 0x4a, 0x44, 0x4f, 0x42,\n    0x49, 0x47, 0x42, 0x4c, 0x46, 0x49, 0x48, 0x45, 0x40, 0x46, 0x4d, 0x41,\n    0x43, 0x4d, 0x44, 0x4e, 0x4e, 0x40, 0x47, 0x4b, 0x45, 0x43, 0x4b, 0x48,\n    0x49, 0x44, 0x4e, 0x43, 0x4f, 0x42, 0x45, 0x4c, 0x42, 0x49, 0x48, 0x45,\n    0x4c, 0x4f, 0x43, 0x4a, 0x47, 0x4b, 0x40, 0x4e, 0x44, 0x41, 0x4a, 0x47,\n    0x41, 0x46, 0x4d, 0x40, 0x4b, 0x48, 0x46, 0x4d, 0x2c, 0x2a, 0x21, 0x2f,\n    0x2a, 0x24, 0x2f, 0x22, 0x29, 0x27, 0x22, 0x2c, 0x26, 0x29, 0x28, 0x25,\n    0x20, 0x26, 0x2d, 0x21, 0x23, 0x2d, 0x24, 0x2e, 0x2e, 0x20, 0x27, 0x2b,\n    0x25, 0x23, 0x2b, 0x28, 0x29, 0x24, 0x2e, 0x23, 0x2f, 0x22, 0x25, 0x2c,\n    0x22, 0x29, 0x28, 0x25, 0x2c, 0x2f, 0x23, 0x2a, 0x27, 0x2b, 0x20, 0x2e,\n    0x24, 0x21, 0x2a, 0x27, 0x21, 0x26, 0x2d, 0x20, 0x2b, 0x28, 0x26, 0x2d,\n    0x1c, 0x1a, 0x11, 0x1f, 0x1a, 0x14, 0x1f, 0x12, 0x19, 0x17, 0x12, 0x1c,\n    0x16, 0x19, 0x18, 0x15, 0x10, 0x16, 0x1d, 0x11, 0x13, 0x1d, 0x14, 0x1e,\n    0x1e, 0x10, 0x17, 0x1b, 0x15, 0x13, 0x1b, 0x18, 0x19, 0x14, 0x1e, 0x13,\n    0x1f, 0x12, 0x15, 0x1c, 0x12, 0x19, 0x18, 0x15, 0x1c, 0x1f, 0x13, 0x1a,\n    0x17, 0x1b, 0x10, 0x1e, 0x14, 0x11, 0x1a, 0x17, 0x11, 0x16, 0x1d, 0x10,\n    0x1b, 0x18, 0x16, 0x1d, 0xcc, 0xca, 0xc1, 0xcf, 0xca, 0xc4, 0xcf, 0xc2,\n    0xc9, 0xc7, 0xc2, 0xcc, 0xc6, 0xc9, 0xc8, 0xc5, 0xc0, 0xc6, 0xcd, 0xc1,\n    0xc3, 0xcd, 0xc4, 0xce, 0xce, 0xc0, 0xc7, 0xcb, 0xc5, 0xc3, 0xcb, 0xc8,\n    0xc9, 0xc4, 0xce, 0xc3, 0xcf, 0xc2, 0xc5, 0xcc, 0xc2, 0xc9, 0xc8, 0xc5,\n    0xcc, 0xcf, 0xc3, 0xca, 0xc7, 0xcb, 0xc0, 0xce, 0xc4, 0xc1, 0xca, 0xc7,\n    0xc1, 0xc6, 0xcd, 0xc0, 0xcb, 0xc8, 0xc6, 0xcd, 0x7c, 0x7a, 0x71, 0x7f,\n    0x7a, 0x74, 0x7f, 0x72, 0x79, 0x77, 0x72, 0x7c, 0x76, 0x79, 0x78, 0x75,\n    0x70, 0x76, 0x7d, 0x71, 0x73, 0x7d, 0x74, 0x7e, 0x7e, 0x70, 0x77, 0x7b,\n    0x75, 0x73, 0x7b, 0x78, 0x79, 0x74, 0x7e, 0x73, 0x7f, 0x72, 0x75, 0x7c,\n    0x72, 0x79, 0x78, 0x75, 0x7c, 0x7f, 0x73, 0x7a, 0x77, 0x7b, 0x70, 0x7e,\n    0x74, 0x71, 0x7a, 0x77, 0x71, 0x76, 0x7d, 0x70, 0x7b, 0x78, 0x76, 0x7d,\n    0x4c, 0x4a, 0x41, 0x4f, 0x4a, 0x44, 0x4f, 0x42, 0x49, 0x47, 0x42, 0x4c,\n    0x46, 0x49, 0x48, 0x45, 0x40, 0x46, 0x4d, 0x41, 0x43, 0x4d, 0x44, 0x4e,\n    0x4e, 0x40, 0x47, 0x4b, 0x45, 0x43, 0x4b, 0x48, 0x49, 0x44, 0x4e, 0x43,\n    0x4f, 0x42, 0x45, 0x4c, 0x42, 0x49, 0x48, 0x45, 0x4c, 0x4f, 0x43, 0x4a,\n    0x47, 0x4b, 0x40, 0x4e, 0x44, 0x41, 0x4a, 0x47, 0x41, 0x46, 0x4d, 0x40,\n    0x4b, 0x48, 0x46, 0x4d, 0xac, 0xaa, 0xa1, 0xaf, 0xaa, 0xa4, 0xaf, 0xa2,\n    0xa9, 0xa7, 0xa2, 0xac, 0xa6, 0xa9, 0xa8, 0xa5, 0xa0, 0xa6, 0xad, 0xa1,\n    0xa3, 0xad, 0xa4, 0xae, 0xae, 0xa0, 0xa7, 0xab, 0xa5, 0xa3, 0xab, 0xa8,\n    0xa9, 0xa4, 0xae, 0xa3, 0xaf, 0xa2, 0xa5, 0xac, 0xa2, 0xa9, 0xa8, 0xa5,\n    0xac, 0xaf, 0xa3, 0xaa, 0xa7, 0xab, 0xa0, 0xae, 0xa4, 0xa1, 0xaa, 0xa7,\n    0xa1, 0xa6, 0xad, 0xa0, 0xab, 0xa8, 0xa6, 0xad, 0x7c, 0x7a, 0x71, 0x7f,\n    0x7a, 0x74, 0x7f, 0x72, 0x79, 0x77, 0x72, 0x7c, 0x76, 0x79, 0x78, 0x75,\n    0x70, 0x76, 0x7d, 0x71, 0x73, 0x7d, 0x74, 0x7e, 0x7e, 0x70, 0x77, 0x7b,\n    0x75, 0x73, 0x7b, 0x78, 0x79, 0x74, 0x7e, 0x73, 0x7f, 0x72, 0x75, 0x7c,\n    0x72, 0x79, 0x78, 0x75, 0x7c, 0x7f, 0x73, 0x7a, 0x77, 0x7b, 0x70, 0x7e,\n    0x74, 0x71, 0x7a, 0x77, 0x71, 0x76, 0x7d, 0x70, 0x7b, 0x78, 0x76, 0x7d,\n    0xbc, 0xba, 0xb1, 0xbf, 0xba, 0xb4, 0xbf, 0xb2, 0xb9, 0xb7, 0xb2, 0xbc,\n    0xb6, 0xb9, 0xb8, 0xb5, 0xb0, 0xb6, 0xbd, 0xb1, 0xb3, 0xbd, 0xb4, 0xbe,\n    0xbe, 0xb0, 0xb7, 0xbb, 0xb5, 0xb3, 0xbb, 0xb8, 0xb9, 0xb4, 0xbe, 0xb3,\n    0xbf, 0xb2, 0xb5, 0xbc, 0xb2, 0xb9, 0xb8, 0xb5, 0xbc, 0xbf, 0xb3, 0xba,\n    0xb7, 0xbb, 0xb0, 0xbe, 0xb4, 0xb1, 0xba, 0xb7, 0xb1, 0xb6, 0xbd, 0xb0,\n    0xbb, 0xb8, 0xb6, 0xbd, 0xdc, 0xda, 0xd1, 0xdf, 0xda, 0xd4, 0xdf, 0xd2,\n    0xd9, 0xd7, 0xd2, 0xdc, 0xd6, 0xd9, 0xd8, 0xd5, 0xd0, 0xd6, 0xdd, 0xd1,\n    0xd3, 0xdd, 0xd4, 0xde, 0xde, 0xd0, 0xd7, 0xdb, 0xd5, 0xd3, 0xdb, 0xd8,\n    0xd9, 0xd4, 0xde, 0xd3, 0xdf, 0xd2, 0xd5, 0xdc, 0xd2, 0xd9, 0xd8, 0xd5,\n    0xdc, 0xdf, 0xd3, 0xda, 0xd7, 0xdb, 0xd0, 0xde, 0xd4, 0xd1, 0xda, 0xd7,\n    0xd1, 0xd6, 0xdd, 0xd0, 0xdb, 0xd8, 0xd6, 0xdd, 0x6c, 0x6a, 0x61, 0x6f,\n    0x6a, 0x64, 0x6f, 0x62, 0x69, 0x67, 0x62, 0x6c, 0x66, 0x69, 0x68, 0x65,\n    0x60, 0x66, 0x6d, 0x61, 0x63, 0x6d, 0x64, 0x6e, 0x6e, 0x60, 0x67, 0x6b,\n    0x65, 0x63, 0x6b, 0x68, 0x69, 0x64, 0x6e, 0x63, 0x6f, 0x62, 0x65, 0x6c,\n    0x62, 0x69, 0x68, 0x65, 0x6c, 0x6f, 0x63, 0x6a, 0x67, 0x6b, 0x60, 0x6e,\n    0x64, 0x61, 0x6a, 0x67, 0x61, 0x66, 0x6d, 0x60, 0x6b, 0x68, 0x66, 0x6d,\n    0x1c, 0x1a, 0x11, 0x1f, 0x1a, 0x14, 0x1f, 0x12, 0x19, 0x17, 0x12, 0x1c,\n    0x16, 0x19, 0x18, 0x15, 0x10, 0x16, 0x1d, 0x11, 0x13, 0x1d, 0x14, 0x1e,\n    0x1e, 0x10, 0x17, 0x1b, 0x15, 0x13, 0x1b, 0x18, 0x19, 0x14, 0x1e, 0x13,\n    0x1f, 0x12, 0x15, 0x1c, 0x12, 0x19, 0x18, 0x15, 0x1c, 0x1f, 0x13, 0x1a,\n    0x17, 0x1b, 0x10, 0x1e, 0x14, 0x11, 0x1a, 0x17, 0x11, 0x16, 0x1d, 0x10,\n    0x1b, 0x18, 0x16, 0x1d, 0x8c, 0x8a, 0x81, 0x8f, 0x8a, 0x84, 0x8f, 0x82,\n    0x89, 0x87, 0x82, 0x8c, 0x86, 0x89, 0x88, 0x85, 0x80, 0x86, 0x8d, 0x81,\n    0x83, 0x8d, 0x84, 0x8e, 0x8e, 0x80, 0x87, 0x8b, 0x85, 0x83, 0x8b, 0x88,\n    0x89, 0x84, 0x8e, 0x83, 0x8f, 0x82, 0x85, 0x8c, 0x82, 0x89, 0x88, 0x85,\n    0x8c, 0x8f, 0x83, 0x8a, 0x87, 0x8b, 0x80, 0x8e, 0x84, 0x81, 0x8a, 0x87,\n    0x81, 0x86, 0x8d, 0x80, 0x8b, 0x88, 0x86, 0x8d, 0x5c, 0x5a, 0x51, 0x5f,\n    0x5a, 0x54, 0x5f, 0x52, 0x59, 0x57, 0x52, 0x5c, 0x56, 0x59, 0x58, 0x55,\n    0x50, 0x56, 0x5d, 0x51, 0x53, 0x5d, 0x54, 0x5e, 0x5e, 0x50, 0x57, 0x5b,\n    0x55, 0x53, 0x5b, 0x58, 0x59, 0x54, 0x5e, 0x53, 0x5f, 0x52, 0x55, 0x5c,\n    0x52, 0x59, 0x58, 0x55, 0x5c, 0x5f, 0x53, 0x5a, 0x57, 0x5b, 0x50, 0x5e,\n    0x54, 0x51, 0x5a, 0x57, 0x51, 0x56, 0x5d, 0x50, 0x5b, 0x58, 0x56, 0x5d,\n    0x5c, 0x5a, 0x51, 0x5f, 0x5a, 0x54, 0x5f, 0x52, 0x59, 0x57, 0x52, 0x5c,\n    0x56, 0x59, 0x58, 0x55, 0x50, 0x56, 0x5d, 0x51, 0x53, 0x5d, 0x54, 0x5e,\n    0x5e, 0x50, 0x57, 0x5b, 0x55, 0x53, 0x5b, 0x58, 0x59, 0x54, 0x5e, 0x53,\n    0x5f, 0x52, 0x55, 0x5c, 0x52, 0x59, 0x58, 0x55, 0x5c, 0x5f, 0x53, 0x5a,\n    0x57, 0x5b, 0x50, 0x5e, 0x54, 0x51, 0x5a, 0x57, 0x51, 0x56, 0x5d, 0x50,\n    0x5b, 0x58, 0x56, 0x5d, 0x0c, 0x0a, 0x01, 0x0f, 0x0a, 0x04, 0x0f, 0x02,\n    0x09, 0x07, 0x02, 0x0c, 0x06, 0x09, 0x08, 0x05, 0x00, 0x06, 0x0d, 0x01,\n    0x03, 0x0d, 0x04, 0x0e, 0x0e, 0x00, 0x07, 0x0b, 0x05, 0x03, 0x0b, 0x08,\n    0x09, 0x04, 0x0e, 0x03, 0x0f, 0x02, 0x05, 0x0c, 0x02, 0x09, 0x08, 0x05,\n    0x0c, 0x0f, 0x03, 0x0a, 0x07, 0x0b, 0x00, 0x0e, 0x04, 0x01, 0x0a, 0x07,\n    0x01, 0x06, 0x0d, 0x00, 0x0b, 0x08, 0x06, 0x0d, 0x3c, 0x3a, 0x31, 0x3f,\n    0x3a, 0x34, 0x3f, 0x32, 0x39, 0x37, 0x32, 0x3c, 0x36, 0x39, 0x38, 0x35,\n    0x30, 0x36, 0x3d, 0x31, 0x33, 0x3d, 0x34, 0x3e, 0x3e, 0x30, 0x37, 0x3b,\n    0x35, 0x33, 0x3b, 0x38, 0x39, 0x34, 0x3e, 0x33, 0x3f, 0x32, 0x35, 0x3c,\n    0x32, 0x39, 0x38, 0x35, 0x3c, 0x3f, 0x33, 0x3a, 0x37, 0x3b, 0x30, 0x3e,\n    0x34, 0x31, 0x3a, 0x37, 0x31, 0x36, 0x3d, 0x30, 0x3b, 0x38, 0x36, 0x3d,\n    0xfc, 0xfa, 0xf1, 0xff, 0xfa, 0xf4, 0xff, 0xf2, 0xf9, 0xf7, 0xf2, 0xfc,\n    0xf6, 0xf9, 0xf8, 0xf5, 0xf0, 0xf6, 0xfd, 0xf1, 0xf3, 0xfd, 0xf4, 0xfe,\n    0xfe, 0xf0, 0xf7, 0xfb, 0xf5, 0xf3, 0xfb, 0xf8, 0xf9, 0xf4, 0xfe, 0xf3,\n    0xff, 0xf2, 0xf5, 0xfc, 0xf2, 0xf9, 0xf8, 0xf5, 0xfc, 0xff, 0xf3, 0xfa,\n    0xf7, 0xfb, 0xf0, 0xfe, 0xf4, 0xf1, 0xfa, 0xf7, 0xf1, 0xf6, 0xfd, 0xf0,\n    0xfb, 0xf8, 0xf6, 0xfd, 0xfc, 0xfa, 0xf1, 0xff, 0xfa, 0xf4, 0xff, 0xf2,\n    0xf9, 0xf7, 0xf2, 0xfc, 0xf6, 0xf9, 0xf8, 0xf5, 0xf0, 0xf6, 0xfd, 0xf1,\n    0xf3, 0xfd, 0xf4, 0xfe, 0xfe, 0xf0, 0xf7, 0xfb, 0xf5, 0xf3, 0xfb, 0xf8,\n    0xf9, 0xf4, 0xfe, 0xf3, 0xff, 0xf2, 0xf5, 0xfc, 0xf2, 0xf9, 0xf8, 0xf5,\n    0xfc, 0xff, 0xf3, 0xfa, 0xf7, 0xfb, 0xf0, 0xfe, 0xf4, 0xf1, 0xfa, 0xf7,\n    0xf1, 0xf6, 0xfd, 0xf0, 0xfb, 0xf8, 0xf6, 0xfd, 0xac, 0xaa, 0xa1, 0xaf,\n    0xaa, 0xa4, 0xaf, 0xa2, 0xa9, 0xa7, 0xa2, 0xac, 0xa6, 0xa9, 0xa8, 0xa5,\n    0xa0, 0xa6, 0xad, 0xa1, 0xa3, 0xad, 0xa4, 0xae, 0xae, 0xa0, 0xa7, 0xab,\n    0xa5, 0xa3, 0xab, 0xa8, 0xa9, 0xa4, 0xae, 0xa3, 0xaf, 0xa2, 0xa5, 0xac,\n    0xa2, 0xa9, 0xa8, 0xa5, 0xac, 0xaf, 0xa3, 0xaa, 0xa7, 0xab, 0xa0, 0xae,\n    0xa4, 0xa1, 0xaa, 0xa7, 0xa1, 0xa6, 0xad, 0xa0, 0xab, 0xa8, 0xa6, 0xad,\n    0xdc, 0xda, 0xd1, 0xdf, 0xda, 0xd4, 0xdf, 0xd2, 0xd9, 0xd7, 0xd2, 0xdc,\n    0xd6, 0xd9, 0xd8, 0xd5, 0xd0, 0xd6, 0xdd, 0xd1, 0xd3, 0xdd, 0xd4, 0xde,\n    0xde, 0xd0, 0xd7, 0xdb, 0xd5, 0xd3, 0xdb, 0xd8, 0xd9, 0xd4, 0xde, 0xd3,\n    0xdf, 0xd2, 0xd5, 0xdc, 0xd2, 0xd9, 0xd8, 0xd5, 0xdc, 0xdf, 0xd3, 0xda,\n    0xd7, 0xdb, 0xd0, 0xde, 0xd4, 0xd1, 0xda, 0xd7, 0xd1, 0xd6, 0xdd, 0xd0,\n    0xdb, 0xd8, 0xd6, 0xdd, 0x3c, 0x3a, 0x31, 0x3f, 0x3a, 0x34, 0x3f, 0x32,\n    0x39, 0x37, 0x32, 0x3c, 0x36, 0x39, 0x38, 0x35, 0x30, 0x36, 0x3d, 0x31,\n    0x33, 0x3d, 0x34, 0x3e, 0x3e, 0x30, 0x37, 0x3b, 0x35, 0x33, 0x3b, 0x38,\n    0x39, 0x34, 0x3e, 0x33, 0x3f, 0x32, 0x35, 0x3c, 0x32, 0x39, 0x38, 0x35,\n    0x3c, 0x3f, 0x33, 0x3a, 0x37, 0x3b, 0x30, 0x3e, 0x34, 0x31, 0x3a, 0x37,\n    0x31, 0x36, 0x3d, 0x30, 0x3b, 0x38, 0x36, 0x3d, 0x0c, 0x0a, 0x01, 0x0f,\n    0x0a, 0x04, 0x0f, 0x02, 0x09, 0x07, 0x02, 0x0c, 0x06, 0x09, 0x08, 0x05,\n    0x00, 0x06, 0x0d, 0x01, 0x03, 0x0d, 0x04, 0x0e, 0x0e, 0x00, 0x07, 0x0b,\n    0x05, 0x03, 0x0b, 0x08, 0x09, 0x04, 0x0e, 0x03, 0x0f, 0x02, 0x05, 0x0c,\n    0x02, 0x09, 0x08, 0x05, 0x0c, 0x0f, 0x03, 0x0a, 0x07, 0x0b, 0x00, 0x0e,\n    0x04, 0x01, 0x0a, 0x07, 0x01, 0x06, 0x0d, 0x00, 0x0b, 0x08, 0x06, 0x0d,\n    0x9c, 0x9a, 0x91, 0x9f, 0x9a, 0x94, 0x9f, 0x92, 0x99, 0x97, 0x92, 0x9c,\n    0x96, 0x99, 0x98, 0x95, 0x90, 0x96, 0x9d, 0x91, 0x93, 0x9d, 0x94, 0x9e,\n    0x9e, 0x90, 0x97, 0x9b, 0x95, 0x93, 0x9b, 0x98, 0x99, 0x94, 0x9e, 0x93,\n    0x9f, 0x92, 0x95, 0x9c, 0x92, 0x99, 0x98, 0x95, 0x9c, 0x9f, 0x93, 0x9a,\n    0x97, 0x9b, 0x90, 0x9e, 0x94, 0x91, 0x9a, 0x97, 0x91, 0x96, 0x9d, 0x90,\n    0x9b, 0x98, 0x96, 0x9d, 0xec, 0xea, 0xe1, 0xef, 0xea, 0xe4, 0xef, 0xe2,\n    0xe9, 0xe7, 0xe2, 0xec, 0xe6, 0xe9, 0xe8, 0xe5, 0xe0, 0xe6, 0xed, 0xe1,\n    0xe3, 0xed, 0xe4, 0xee, 0xee, 0xe0, 0xe7, 0xeb, 0xe5, 0xe3, 0xeb, 0xe8,\n    0xe9, 0xe4, 0xee, 0xe3, 0xef, 0xe2, 0xe5, 0xec, 0xe2, 0xe9, 0xe8, 0xe5,\n    0xec, 0xef, 0xe3, 0xea, 0xe7, 0xeb, 0xe0, 0xee, 0xe4, 0xe1, 0xea, 0xe7,\n    0xe1, 0xe6, 0xed, 0xe0, 0xeb, 0xe8, 0xe6, 0xed, 0x8c, 0x8a, 0x81, 0x8f,\n    0x8a, 0x84, 0x8f, 0x82, 0x89, 0x87, 0x82, 0x8c, 0x86, 0x89, 0x88, 0x85,\n    0x80, 0x86, 0x8d, 0x81, 0x83, 0x8d, 0x84, 0x8e, 0x8e, 0x80, 0x87, 0x8b,\n    0x85, 0x83, 0x8b, 0x88, 0x89, 0x84, 0x8e, 0x83, 0x8f, 0x82, 0x85, 0x8c,\n    0x82, 0x89, 0x88, 0x85, 0x8c, 0x8f, 0x83, 0x8a, 0x87, 0x8b, 0x80, 0x8e,\n    0x84, 0x81, 0x8a, 0x87, 0x81, 0x86, 0x8d, 0x80, 0x8b, 0x88, 0x86, 0x8d,\n    0x9c, 0x9a, 0x91, 0x9f, 0x9a, 0x94, 0x9f, 0x92, 0x99, 0x97, 0x92, 0x9c,\n    0x96, 0x99, 0x98, 0x95, 0x90, 0x96, 0x9d, 0x91, 0x93, 0x9d, 0x94, 0x9e,\n    0x9e, 0x90, 0x97, 0x9b, 0x95, 0x93, 0x9b, 0x98, 0x99, 0x94, 0x9e, 0x93,\n    0x9f, 0x92, 0x95, 0x9c, 0x92, 0x99, 0x98, 0x95, 0x9c, 0x9f, 0x93, 0x9a,\n    0x97, 0x9b, 0x90, 0x9e, 0x94, 0x91, 0x9a, 0x97, 0x91, 0x96, 0x9d, 0x90,\n    0x9b, 0x98, 0x96, 0x9d, 0x6c, 0x6a, 0x61, 0x6f, 0x6a, 0x64, 0x6f, 0x62,\n    0x69, 0x67, 0x62, 0x6c, 0x66, 0x69, 0x68, 0x65, 0x60, 0x66, 0x6d, 0x61,\n    0x63, 0x6d, 0x64, 0x6e, 0x6e, 0x60, 0x67, 0x6b, 0x65, 0x63, 0x6b, 0x68,\n    0x69, 0x64, 0x6e, 0x63, 0x6f, 0x62, 0x65, 0x6c, 0x62, 0x69, 0x68, 0x65,\n    0x6c, 0x6f, 0x63, 0x6a, 0x67, 0x6b, 0x60, 0x6e, 0x64, 0x61, 0x6a, 0x67,\n    0x61, 0x66, 0x6d, 0x60, 0x6b, 0x68, 0x66, 0x6d, 0x4c, 0x4a, 0x41, 0x4f,\n    0x4a, 0x44, 0x4f, 0x42, 0x49, 0x47, 0x42, 0x4c, 0x46, 0x49, 0x48, 0x45,\n    0x40, 0x46, 0x4d, 0x41, 0x43, 0x4d, 0x44, 0x4e, 0x4e, 0x40, 0x47, 0x4b,\n    0x45, 0x43, 0x4b, 0x48, 0x49, 0x44, 0x4e, 0x43, 0x4f, 0x42, 0x45, 0x4c,\n    0x42, 0x49, 0x48, 0x45, 0x4c, 0x4f, 0x43, 0x4a, 0x47, 0x4b, 0x40, 0x4e,\n    0x44, 0x41, 0x4a, 0x47, 0x41, 0x46, 0x4d, 0x40, 0x4b, 0x48, 0x46, 0x4d,\n    0xbc, 0xba, 0xb1, 0xbf, 0xba, 0xb4, 0xbf, 0xb2, 0xb9, 0xb7, 0xb2, 0xbc,\n    0xb6, 0xb9, 0xb8, 0xb5, 0xb0, 0xb6, 0xbd, 0xb1, 0xb3, 0xbd, 0xb4, 0xbe,\n    0xbe, 0xb0, 0xb7, 0xbb, 0xb5, 0xb3, 0xbb, 0xb8, 0xb9, 0xb4, 0xbe, 0xb3,\n    0xbf, 0xb2, 0xb5, 0xbc, 0xb2, 0xb9, 0xb8, 0xb5, 0xbc, 0xbf, 0xb3, 0xba,\n    0xb7, 0xbb, 0xb0, 0xbe, 0xb4, 0xb1, 0xba, 0xb7, 0xb1, 0xb6, 0xbd, 0xb0,\n    0xbb, 0xb8, 0xb6, 0xbd, 0x2c, 0x2a, 0x21, 0x2f, 0x2a, 0x24, 0x2f, 0x22,\n    0x29, 0x27, 0x22, 0x2c, 0x26, 0x29, 0x28, 0x25, 0x20, 0x26, 0x2d, 0x21,\n    0x23, 0x2d, 0x24, 0x2e, 0x2e, 0x20, 0x27, 0x2b, 0x25, 0x23, 0x2b, 0x28,\n    0x29, 0x24, 0x2e, 0x23, 0x2f, 0x22, 0x25, 0x2c, 0x22, 0x29, 0x28, 0x25,\n    0x2c, 0x2f, 0x23, 0x2a, 0x27, 0x2b, 0x20, 0x2e, 0x24, 0x21, 0x2a, 0x27,\n    0x21, 0x26, 0x2d, 0x20, 0x2b, 0x28, 0x26, 0x2d, 0x8c, 0x8a, 0x81, 0x8f,\n    0x8a, 0x84, 0x8f, 0x82, 0x89, 0x87, 0x82, 0x8c, 0x86, 0x89, 0x88, 0x85,\n    0x80, 0x86, 0x8d, 0x81, 0x83, 0x8d, 0x84, 0x8e, 0x8e, 0x80, 0x87, 0x8b,\n    0x85, 0x83, 0x8b, 0x88, 0x89, 0x84, 0x8e, 0x83, 0x8f, 0x82, 0x85, 0x8c,\n    0x82, 0x89, 0x88, 0x85, 0x8c, 0x8f, 0x83, 0x8a, 0x87, 0x8b, 0x80, 0x8e,\n    0x84, 0x81, 0x8a, 0x87, 0x81, 0x86, 0x8d, 0x80, 0x8b, 0x88, 0x86, 0x8d,\n    0x1c, 0x1a, 0x11, 0x1f, 0x1a, 0x14, 0x1f, 0x12, 0x19, 0x17, 0x12, 0x1c,\n    0x16, 0x19, 0x18, 0x15, 0x10, 0x16, 0x1d, 0x11, 0x13, 0x1d, 0x14, 0x1e,\n    0x1e, 0x10, 0x17, 0x1b, 0x15, 0x13, 0x1b, 0x18, 0x19, 0x14, 0x1e, 0x13,\n    0x1f, 0x12, 0x15, 0x1c, 0x12, 0x19, 0x18, 0x15, 0x1c, 0x1f, 0x13, 0x1a,\n    0x17, 0x1b, 0x10, 0x1e, 0x14, 0x11, 0x1a, 0x17, 0x11, 0x16, 0x1d, 0x10,\n    0x1b, 0x18, 0x16, 0x1d, 0xcc, 0xca, 0xc1, 0xcf, 0xca, 0xc4, 0xcf, 0xc2,\n    0xc9, 0xc7, 0xc2, 0xcc, 0xc6, 0xc9, 0xc8, 0xc5, 0xc0, 0xc6, 0xcd, 0xc1,\n    0xc3, 0xcd, 0xc4, 0xce, 0xce, 0xc0, 0xc7, 0xcb, 0xc5, 0xc3, 0xcb, 0xc8,\n    0xc9, 0xc4, 0xce, 0xc3, 0xcf, 0xc2, 0xc5, 0xcc, 0xc2, 0xc9, 0xc8, 0xc5,\n    0xcc, 0xcf, 0xc3, 0xca, 0xc7, 0xcb, 0xc0, 0xce, 0xc4, 0xc1, 0xca, 0xc7,\n    0xc1, 0xc6, 0xcd, 0xc0, 0xcb, 0xc8, 0xc6, 0xcd, 0xbc, 0xba, 0xb1, 0xbf,\n    0xba, 0xb4, 0xbf, 0xb2, 0xb9, 0xb7, 0xb2, 0xbc, 0xb6, 0xb9, 0xb8, 0xb5,\n    0xb0, 0xb6, 0xbd, 0xb1, 0xb3, 0xbd, 0xb4, 0xbe, 0xbe, 0xb0, 0xb7, 0xbb,\n    0xb5, 0xb3, 0xbb, 0xb8, 0xb9, 0xb4, 0xbe, 0xb3, 0xbf, 0xb2, 0xb5, 0xbc,\n    0xb2, 0xb9, 0xb8, 0xb5, 0xbc, 0xbf, 0xb3, 0xba, 0xb7, 0xbb, 0xb0, 0xbe,\n    0xb4, 0xb1, 0xba, 0xb7, 0xb1, 0xb6, 0xbd, 0xb0, 0xbb, 0xb8, 0xb6, 0xbd,\n    0x7c, 0x7a, 0x71, 0x7f, 0x7a, 0x74, 0x7f, 0x72, 0x79, 0x77, 0x72, 0x7c,\n    0x76, 0x79, 0x78, 0x75, 0x70, 0x76, 0x7d, 0x71, 0x73, 0x7d, 0x74, 0x7e,\n    0x7e, 0x70, 0x77, 0x7b, 0x75, 0x73, 0x7b, 0x78, 0x79, 0x74, 0x7e, 0x73,\n    0x7f, 0x72, 0x75, 0x7c, 0x72, 0x79, 0x78, 0x75, 0x7c, 0x7f, 0x73, 0x7a,\n    0x77, 0x7b, 0x70, 0x7e, 0x74, 0x71, 0x7a, 0x77, 0x71, 0x76, 0x7d, 0x70,\n    0x7b, 0x78, 0x76, 0x7d, 0xac, 0xaa, 0xa1, 0xaf, 0xaa, 0xa4, 0xaf, 0xa2,\n    0xa9, 0xa7, 0xa2, 0xac, 0xa6, 0xa9, 0xa8, 0xa5, 0xa0, 0xa6, 0xad, 0xa1,\n    0xa3, 0xad, 0xa4, 0xae, 0xae, 0xa0, 0xa7, 0xab, 0xa5, 0xa3, 0xab, 0xa8,\n    0xa9, 0xa4, 0xae, 0xa3, 0xaf, 0xa2, 0xa5, 0xac, 0xa2, 0xa9, 0xa8, 0xa5,\n    0xac, 0xaf, 0xa3, 0xaa, 0xa7, 0xab, 0xa0, 0xae, 0xa4, 0xa1, 0xaa, 0xa7,\n    0xa1, 0xa6, 0xad, 0xa0, 0xab, 0xa8, 0xa6, 0xad, 0x1c, 0x1a, 0x11, 0x1f,\n    0x1a, 0x14, 0x1f, 0x12, 0x19, 0x17, 0x12, 0x1c, 0x16, 0x19, 0x18, 0x15,\n    0x10, 0x16, 0x1d, 0x11, 0x13, 0x1d, 0x14, 0x1e, 0x1e, 0x10, 0x17, 0x1b,\n    0x15, 0x13, 0x1b, 0x18, 0x19, 0x14, 0x1e, 0x13, 0x1f, 0x12, 0x15, 0x1c,\n    0x12, 0x19, 0x18, 0x15, 0x1c, 0x1f, 0x13, 0x1a, 0x17, 0x1b, 0x10, 0x1e,\n    0x14, 0x11, 0x1a, 0x17, 0x11, 0x16, 0x1d, 0x10, 0x1b, 0x18, 0x16, 0x1d,\n    0xdc, 0xda, 0xd1, 0xdf, 0xda, 0xd4, 0xdf, 0xd2, 0xd9, 0xd7, 0xd2, 0xdc,\n    0xd6, 0xd9, 0xd8, 0xd5, 0xd0, 0xd6, 0xdd, 0xd1, 0xd3, 0xdd, 0xd4, 0xde,\n    0xde, 0xd0, 0xd7, 0xdb, 0xd5, 0xd3, 0xdb, 0xd8, 0xd9, 0xd4, 0xde, 0xd3,\n    0xdf, 0xd2, 0xd5, 0xdc, 0xd2, 0xd9, 0xd8, 0xd5, 0xdc, 0xdf, 0xd3, 0xda,\n    0xd7, 0xdb, 0xd0, 0xde, 0xd4, 0xd1, 0xda, 0xd7, 0xd1, 0xd6, 0xdd, 0xd0,\n    0xdb, 0xd8, 0xd6, 0xdd, 0xec, 0xea, 0xe1, 0xef, 0xea, 0xe4, 0xef, 0xe2,\n    0xe9, 0xe7, 0xe2, 0xec, 0xe6, 0xe9, 0xe8, 0xe5, 0xe0, 0xe6, 0xed, 0xe1,\n    0xe3, 0xed, 0xe4, 0xee, 0xee, 0xe0, 0xe7, 0xeb, 0xe5, 0xe3, 0xeb, 0xe8,\n    0xe9, 0xe4, 0xee, 0xe3, 0xef, 0xe2, 0xe5, 0xec, 0xe2, 0xe9, 0xe8, 0xe5,\n    0xec, 0xef, 0xe3, 0xea, 0xe7, 0xeb, 0xe0, 0xee, 0xe4, 0xe1, 0xea, 0xe7,\n    0xe1, 0xe6, 0xed, 0xe0, 0xeb, 0xe8, 0xe6, 0xed, 0x7c, 0x7a, 0x71, 0x7f,\n    0x7a, 0x74, 0x7f, 0x72, 0x79, 0x77, 0x72, 0x7c, 0x76, 0x79, 0x78, 0x75,\n    0x70, 0x76, 0x7d, 0x71, 0x73, 0x7d, 0x74, 0x7e, 0x7e, 0x70, 0x77, 0x7b,\n    0x75, 0x73, 0x7b, 0x78, 0x79, 0x74, 0x7e, 0x73, 0x7f, 0x72, 0x75, 0x7c,\n    0x72, 0x79, 0x78, 0x75, 0x7c, 0x7f, 0x73, 0x7a, 0x77, 0x7b, 0x70, 0x7e,\n    0x74, 0x71, 0x7a, 0x77, 0x71, 0x76, 0x7d, 0x70, 0x7b, 0x78, 0x76, 0x7d,\n    0x2c, 0x2a, 0x21, 0x2f, 0x2a, 0x24, 0x2f, 0x22, 0x29, 0x27, 0x22, 0x2c,\n    0x26, 0x29, 0x28, 0x25, 0x20, 0x26, 0x2d, 0x21, 0x23, 0x2d, 0x24, 0x2e,\n    0x2e, 0x20, 0x27, 0x2b, 0x25, 0x23, 0x2b, 0x28, 0x29, 0x24, 0x2e, 0x23,\n    0x2f, 0x22, 0x25, 0x2c, 0x22, 0x29, 0x28, 0x25, 0x2c, 0x2f, 0x23, 0x2a,\n    0x27, 0x2b, 0x20, 0x2e, 0x24, 0x21, 0x2a, 0x27, 0x21, 0x26, 0x2d, 0x20,\n    0x2b, 0x28, 0x26, 0x2d, 0x8c, 0x8a, 0x81, 0x8f, 0x8a, 0x84, 0x8f, 0x82,\n    0x89, 0x87, 0x82, 0x8c, 0x86, 0x89, 0x88, 0x85, 0x80, 0x86, 0x8d, 0x81,\n    0x83, 0x8d, 0x84, 0x8e, 0x8e, 0x80, 0x87, 0x8b, 0x85, 0x83, 0x8b, 0x88,\n    0x89, 0x84, 0x8e, 0x83, 0x8f, 0x82, 0x85, 0x8c, 0x82, 0x89, 0x88, 0x85,\n    0x8c, 0x8f, 0x83, 0x8a, 0x87, 0x8b, 0x80, 0x8e, 0x84, 0x81, 0x8a, 0x87,\n    0x81, 0x86, 0x8d, 0x80, 0x8b, 0x88, 0x86, 0x8d, 0xdc, 0xda, 0xd1, 0xdf,\n    0xda, 0xd4, 0xdf, 0xd2, 0xd9, 0xd7, 0xd2, 0xdc, 0xd6, 0xd9, 0xd8, 0xd5,\n    0xd0, 0xd6, 0xdd, 0xd1, 0xd3, 0xdd, 0xd4, 0xde, 0xde, 0xd0, 0xd7, 0xdb,\n    0xd5, 0xd3, 0xdb, 0xd8, 0xd9, 0xd4, 0xde, 0xd3, 0xdf, 0xd2, 0xd5, 0xdc,\n    0xd2, 0xd9, 0xd8, 0xd5, 0xdc, 0xdf, 0xd3, 0xda, 0xd7, 0xdb, 0xd0, 0xde,\n    0xd4, 0xd1, 0xda, 0xd7, 0xd1, 0xd6, 0xdd, 0xd0, 0xdb, 0xd8, 0xd6, 0xdd,\n    0xfc, 0xfa, 0xf1, 0xff, 0xfa, 0xf4, 0xff, 0xf2, 0xf9, 0xf7, 0xf2, 0xfc,\n    0xf6, 0xf9, 0xf8, 0xf5, 0xf0, 0xf6, 0xfd, 0xf1, 0xf3, 0xfd, 0xf4, 0xfe,\n    0xfe, 0xf0, 0xf7, 0xfb, 0xf5, 0xf3, 0xfb, 0xf8, 0xf9, 0xf4, 0xfe, 0xf3,\n    0xff, 0xf2, 0xf5, 0xfc, 0xf2, 0xf9, 0xf8, 0xf5, 0xfc, 0xff, 0xf3, 0xfa,\n    0xf7, 0xfb, 0xf0, 0xfe, 0xf4, 0xf1, 0xfa, 0xf7, 0xf1, 0xf6, 0xfd, 0xf0,\n    0xfb, 0xf8, 0xf6, 0xfd, 0x6c, 0x6a, 0x61, 0x6f, 0x6a, 0x64, 0x6f, 0x62,\n    0x69, 0x67, 0x62, 0x6c, 0x66, 0x69, 0x68, 0x65, 0x60, 0x66, 0x6d, 0x61,\n    0x63, 0x6d, 0x64, 0x6e, 0x6e, 0x60, 0x67, 0x6b, 0x65, 0x63, 0x6b, 0x68,\n    0x69, 0x64, 0x6e, 0x63, 0x6f, 0x62, 0x65, 0x6c, 0x62, 0x69, 0x68, 0x65,\n    0x6c, 0x6f, 0x63, 0x6a, 0x67, 0x6b, 0x60, 0x6e, 0x64, 0x61, 0x6a, 0x67,\n    0x61, 0x66, 0x6d, 0x60, 0x6b, 0x68, 0x66, 0x6d, 0x9c, 0x9a, 0x91, 0x9f,\n    0x9a, 0x94, 0x9f, 0x92, 0x99, 0x97, 0x92, 0x9c, 0x96, 0x99, 0x98, 0x95,\n    0x90, 0x96, 0x9d, 0x91, 0x93, 0x9d, 0x94, 0x9e, 0x9e, 0x90, 0x97, 0x9b,\n    0x95, 0x93, 0x9b, 0x98, 0x99, 0x94, 0x9e, 0x93, 0x9f, 0x92, 0x95, 0x9c,\n    0x92, 0x99, 0x98, 0x95, 0x9c, 0x9f, 0x93, 0x9a, 0x97, 0x9b, 0x90, 0x9e,\n    0x94, 0x91, 0x9a, 0x97, 0x91, 0x96, 0x9d, 0x90, 0x9b, 0x98, 0x96, 0x9d,\n    0xfc, 0xfa, 0xf1, 0xff, 0xfa, 0xf4, 0xff, 0xf2, 0xf9, 0xf7, 0xf2, 0xfc,\n    0xf6, 0xf9, 0xf8, 0xf5, 0xf0, 0xf6, 0xfd, 0xf1, 0xf3, 0xfd, 0xf4, 0xfe,\n    0xfe, 0xf0, 0xf7, 0xfb, 0xf5, 0xf3, 0xfb, 0xf8, 0xf9, 0xf4, 0xfe, 0xf3,\n    0xff, 0xf2, 0xf5, 0xfc, 0xf2, 0xf9, 0xf8, 0xf5, 0xfc, 0xff, 0xf3, 0xfa,\n    0xf7, 0xfb, 0xf0, 0xfe, 0xf4, 0xf1, 0xfa, 0xf7, 0xf1, 0xf6, 0xfd, 0xf0,\n    0xfb, 0xf8, 0xf6, 0xfd, 0xcc, 0xca, 0xc1, 0xcf, 0xca, 0xc4, 0xcf, 0xc2,\n    0xc9, 0xc7, 0xc2, 0xcc, 0xc6, 0xc9, 0xc8, 0xc5, 0xc0, 0xc6, 0xcd, 0xc1,\n    0xc3, 0xcd, 0xc4, 0xce, 0xce, 0xc0, 0xc7, 0xcb, 0xc5, 0xc3, 0xcb, 0xc8,\n    0xc9, 0xc4, 0xce, 0xc3, 0xcf, 0xc2, 0xc5, 0xcc, 0xc2, 0xc9, 0xc8, 0xc5,\n    0xcc, 0xcf, 0xc3, 0xca, 0xc7, 0xcb, 0xc0, 0xce, 0xc4, 0xc1, 0xca, 0xc7,\n    0xc1, 0xc6, 0xcd, 0xc0, 0xcb, 0xc8, 0xc6, 0xcd, 0x0c, 0x0a, 0x01, 0x0f,\n    0x0a, 0x04, 0x0f, 0x02, 0x09, 0x07, 0x02, 0x0c, 0x06, 0x09, 0x08, 0x05,\n    0x00, 0x06, 0x0d, 0x01, 0x03, 0x0d, 0x04, 0x0e, 0x0e, 0x00, 0x07, 0x0b,\n    0x05, 0x03, 0x0b, 0x08, 0x09, 0x04, 0x0e, 0x03, 0x0f, 0x02, 0x05, 0x0c,\n    0x02, 0x09, 0x08, 0x05, 0x0c, 0x0f, 0x03, 0x0a, 0x07, 0x0b, 0x00, 0x0e,\n    0x04, 0x01, 0x0a, 0x07, 0x01, 0x06, 0x0d, 0x00, 0x0b, 0x08, 0x06, 0x0d,\n    0x5c, 0x5a, 0x51, 0x5f, 0x5a, 0x54, 0x5f, 0x52, 0x59, 0x57, 0x52, 0x5c,\n    0x56, 0x59, 0x58, 0x55, 0x50, 0x56, 0x5d, 0x51, 0x53, 0x5d, 0x54, 0x5e,\n    0x5e, 0x50, 0x57, 0x5b, 0x55, 0x53, 0x5b, 0x58, 0x59, 0x54, 0x5e, 0x53,\n    0x5f, 0x52, 0x55, 0x5c, 0x52, 0x59, 0x58, 0x55, 0x5c, 0x5f, 0x53, 0x5a,\n    0x57, 0x5b, 0x50, 0x5e, 0x54, 0x51, 0x5a, 0x57, 0x51, 0x56, 0x5d, 0x50,\n    0x5b, 0x58, 0x56, 0x5d, 0x9c, 0x9a, 0x91, 0x9f, 0x9a, 0x94, 0x9f, 0x92,\n    0x99, 0x97, 0x92, 0x9c, 0x96, 0x99, 0x98, 0x95, 0x90, 0x96, 0x9d, 0x91,\n    0x93, 0x9d, 0x94, 0x9e, 0x9e, 0x90, 0x97, 0x9b, 0x95, 0x93, 0x9b, 0x98,\n    0x99, 0x94, 0x9e, 0x93, 0x9f, 0x92, 0x95, 0x9c, 0x92, 0x99, 0x98, 0x95,\n    0x9c, 0x9f, 0x93, 0x9a, 0x97, 0x9b, 0x90, 0x9e, 0x94, 0x91, 0x9a, 0x97,\n    0x91, 0x96, 0x9d, 0x90, 0x9b, 0x98, 0x96, 0x9d, 0x6c, 0x6a, 0x61, 0x6f,\n    0x6a, 0x64, 0x6f, 0x62, 0x69, 0x67, 0x62, 0x6c, 0x66, 0x69, 0x68, 0x65,\n    0x60, 0x66, 0x6d, 0x61, 0x63, 0x6d, 0x64, 0x6e, 0x6e, 0x60, 0x67, 0x6b,\n    0x65, 0x63, 0x6b, 0x68, 0x69, 0x64, 0x6e, 0x63, 0x6f, 0x62, 0x65, 0x6c,\n    0x62, 0x69, 0x68, 0x65, 0x6c, 0x6f, 0x63, 0x6a, 0x67, 0x6b, 0x60, 0x6e,\n    0x64, 0x61, 0x6a, 0x67, 0x61, 0x66, 0x6d, 0x60, 0x6b, 0x68, 0x66, 0x6d,\n    0xac, 0xaa, 0xa1, 0xaf, 0xaa, 0xa4, 0xaf, 0xa2, 0xa9, 0xa7, 0xa2, 0xac,\n    0xa6, 0xa9, 0xa8, 0xa5, 0xa0, 0xa6, 0xad, 0xa1, 0xa3, 0xad, 0xa4, 0xae,\n    0xae, 0xa0, 0xa7, 0xab, 0xa5, 0xa3, 0xab, 0xa8, 0xa9, 0xa4, 0xae, 0xa3,\n    0xaf, 0xa2, 0xa5, 0xac, 0xa2, 0xa9, 0xa8, 0xa5, 0xac, 0xaf, 0xa3, 0xaa,\n    0xa7, 0xab, 0xa0, 0xae, 0xa4, 0xa1, 0xaa, 0xa7, 0xa1, 0xa6, 0xad, 0xa0,\n    0xab, 0xa8, 0xa6, 0xad, 0x3c, 0x3a, 0x31, 0x3f, 0x3a, 0x34, 0x3f, 0x32,\n    0x39, 0x37, 0x32, 0x3c, 0x36, 0x39, 0x38, 0x35, 0x30, 0x36, 0x3d, 0x31,\n    0x33, 0x3d, 0x34, 0x3e, 0x3e, 0x30, 0x37, 0x3b, 0x35, 0x33, 0x3b, 0x38,\n    0x39, 0x34, 0x3e, 0x33, 0x3f, 0x32, 0x35, 0x3c, 0x32, 0x39, 0x38, 0x35,\n    0x3c, 0x3f, 0x33, 0x3a, 0x37, 0x3b, 0x30, 0x3e, 0x34, 0x31, 0x3a, 0x37,\n    0x31, 0x36, 0x3d, 0x30, 0x3b, 0x38, 0x36, 0x3d, 0x4c, 0x4a, 0x41, 0x4f,\n    0x4a, 0x44, 0x4f, 0x42, 0x49, 0x47, 0x42, 0x4c, 0x46, 0x49, 0x48, 0x45,\n    0x40, 0x46, 0x4d, 0x41, 0x43, 0x4d, 0x44, 0x4e, 0x4e, 0x40, 0x47, 0x4b,\n    0x45, 0x43, 0x4b, 0x48, 0x49, 0x44, 0x4e, 0x43, 0x4f, 0x42, 0x45, 0x4c,\n    0x42, 0x49, 0x48, 0x45, 0x4c, 0x4f, 0x43, 0x4a, 0x47, 0x4b, 0x40, 0x4e,\n    0x44, 0x41, 0x4a, 0x47, 0x41, 0x46, 0x4d, 0x40, 0x4b, 0x48, 0x46, 0x4d,\n    0x0c, 0x0a, 0x01, 0x0f, 0x0a, 0x04, 0x0f, 0x02, 0x09, 0x07, 0x02, 0x0c,\n    0x06, 0x09, 0x08, 0x05, 0x00, 0x06, 0x0d, 0x01, 0x03, 0x0d, 0x04, 0x0e,\n    0x0e, 0x00, 0x07, 0x0b, 0x05, 0x03, 0x0b, 0x08, 0x09, 0x04, 0x0e, 0x03,\n    0x0f, 0x02, 0x05, 0x0c, 0x02, 0x09, 0x08, 0x05, 0x0c, 0x0f, 0x03, 0x0a,\n    0x07, 0x0b, 0x00, 0x0e, 0x04, 0x01, 0x0a, 0x07, 0x01, 0x06, 0x0d, 0x00,\n    0x0b, 0x08, 0x06, 0x0d, 0x5c, 0x5a, 0x51, 0x5f, 0x5a, 0x54, 0x5f, 0x52,\n    0x59, 0x57, 0x52, 0x5c, 0x56, 0x59, 0x58, 0x55, 0x50, 0x56, 0x5d, 0x51,\n    0x53, 0x5d, 0x54, 0x5e, 0x5e, 0x50, 0x57, 0x5b, 0x55, 0x53, 0x5b, 0x58,\n    0x59, 0x54, 0x5e, 0x53, 0x5f, 0x52, 0x55, 0x5c, 0x52, 0x59, 0x58, 0x55,\n    0x5c, 0x5f, 0x53, 0x5a, 0x57, 0x5b, 0x50, 0x5e, 0x54, 0x51, 0x5a, 0x57,\n    0x51, 0x56, 0x5d, 0x50, 0x5b, 0x58, 0x56, 0x5d, 0xec, 0xea, 0xe1, 0xef,\n    0xea, 0xe4, 0xef, 0xe2, 0xe9, 0xe7, 0xe2, 0xec, 0xe6, 0xe9, 0xe8, 0xe5,\n    0xe0, 0xe6, 0xed, 0xe1, 0xe3, 0xed, 0xe4, 0xee, 0xee, 0xe0, 0xe7, 0xeb,\n    0xe5, 0xe3, 0xeb, 0xe8, 0xe9, 0xe4, 0xee, 0xe3, 0xef, 0xe2, 0xe5, 0xec,\n    0xe2, 0xe9, 0xe8, 0xe5, 0xec, 0xef, 0xe3, 0xea, 0xe7, 0xeb, 0xe0, 0xee,\n    0xe4, 0xe1, 0xea, 0xe7, 0xe1, 0xe6, 0xed, 0xe0, 0xeb, 0xe8, 0xe6, 0xed,\n    0x3c, 0x3a, 0x31, 0x3f, 0x3a, 0x34, 0x3f, 0x32, 0x39, 0x37, 0x32, 0x3c,\n    0x36, 0x39, 0x38, 0x35, 0x30, 0x36, 0x3d, 0x31, 0x33, 0x3d, 0x34, 0x3e,\n    0x3e, 0x30, 0x37, 0x3b, 0x35, 0x33, 0x3b, 0x38, 0x39, 0x34, 0x3e, 0x33,\n    0x3f, 0x32, 0x35, 0x3c, 0x32, 0x39, 0x38, 0x35, 0x3c, 0x3f, 0x33, 0x3a,\n    0x37, 0x3b, 0x30, 0x3e, 0x34, 0x31, 0x3a, 0x37, 0x31, 0x36, 0x3d, 0x30,\n    0x3b, 0x38, 0x36, 0x3d,\n  },\n  {\n    0x4d, 0x41, 0x42, 0x4f, 0x48, 0x4d, 0x44, 0x48, 0x46, 0x4a, 0x4f, 0x43,\n    0x4b, 0x47, 0x41, 0x44, 0x4a, 0x4c, 0x49, 0x45, 0x43, 0x46, 0x4e, 0x4b,\n    0x45, 0x40, 0x40, 0x4e, 0x4c, 0x49, 0x47, 0x42, 0x47, 0x42, 0x4b, 0x41,\n    0x44, 0x4e, 0x41, 0x47, 0x49, 0x44, 0x4c, 0x4a, 0x4e, 0x48, 0x42, 0x4d,\n    0x40, 0x4f, 0x46, 0x4c, 0x4a, 0x49, 0x4d, 0x40, 0x4f, 0x43, 0x43, 0x45,\n    0x45, 0x46, 0x48, 0x4b, 0xdd, 0xd1, 0xd2, 0xdf, 0xd8, 0xdd, 0xd4, 0xd8,\n    0xd6, 0xda, 0xdf, 0xd3, 0xdb, 0xd7, 0xd1, 0xd4, 0xda, 0xdc, 0xd9, 0xd5,\n    0xd3, 0xd6, 0xde, 0xdb, 0xd5, 0xd0, 0xd0, 0xde, 0xdc, 0xd9, 0xd7, 0xd2,\n    0xd7, 0xd2, 0xdb, 0xd1, 0xd4, 0xde, 0xd1, 0xd7, 0xd9, 0xd4, 0xdc, 0xda,\n    0xde, 0xd8, 0xd2, 0xdd, 0xd0, 0xdf, 0xd6, 0xdc, 0xda, 0xd9, 0xdd, 0xd0,\n    0xdf, 0xd3, 0xd3, 0xd5, 0xd5, 0xd6, 0xd8, 0xdb, 0xbd, 0xb1, 0xb2, 0xbf,\n    0xb8, 0xbd, 0xb4, 0xb8, 0xb6, 0xba, 0xbf, 0xb3, 0xbb, 0xb7, 0xb1, 0xb4,\n    0xba, 0xbc, 0xb9, 0xb5, 0xb3, 0xb6, 0xbe, 0xbb, 0xb5, 0xb0, 0xb0, 0xbe,\n    0xbc, 0xb9, 0xb7, 0xb2, 0xb7, 0xb2, 0xbb, 0xb1, 0xb4, 0xbe, 0xb1, 0xb7,\n    0xb9, 0xb4, 0xbc, 0xba, 0xbe, 0xb8, 0xb2, 0xbd, 0xb0, 0xbf, 0xb6, 0xbc,\n    0xba, 0xb9, 0xbd, 0xb0, 0xbf, 0xb3, 0xb3, 0xb5, 0xb5, 0xb6, 0xb8, 0xbb,\n    0x0d, 0x01, 0x02, 0x0f, 0x08, 0x0d, 0x04, 0x08, 0x06, 0x0a, 0x0f, 0x03,\n    0x0b, 0x07, 0x01, 0x04, 0x0a, 0x0c, 0x09, 0x05, 0x03, 0x06, 0x0e, 0x0b,\n    0x05, 0x00, 0x00, 0x0e, 0x0c, 0x09, 0x07, 0x02, 0x07, 0x02, 0x0b, 0x01,\n    0x04, 0x0e, 0x01, 0x07, 0x09, 0x04, 0x0c, 0x0a, 0x0e, 0x08, 0x02, 0x0d,\n    0x00, 0x0f, 0x06, 0x0c, 0x0a, 0x09, 0x0d, 0x00, 0x0f, 0x03, 0x03, 0x05,\n    0x05, 0x06, 0x08, 0x0b, 0x2d, 0x21, 0x22, 0x2f, 0x28, 0x2d, 0x24, 0x28,\n    0x26, 0x2a, 0x2f, 0x23, 0x2b, 0x27, 0x21, 0x24, 0x2a, 0x2c, 0x29, 0x25,\n    0x23, 0x26, 0x2e, 0x2b, 0x25, 0x20, 0x20, 0x2e, 0x2c, 0x29, 0x27, 0x22,\n    0x27, 0x22, 0x2b, 0x21, 0x24, 0x2e, 0x21, 0x27, 0x29, 0x24, 0x2c, 0x2a,\n    0x2e, 0x28, 0x22, 0x2d, 0x20, 0x2f, 0x26, 0x2c, 0x2a, 0x29, 0x2d, 0x20,\n    0x2f, 0x23, 0x23, 0x25, 0x25, 0x26, 0x28, 0x2b, 0xbd, 0xb1, 0xb2, 0xbf,\n    0xb8, 0xbd, 0xb4, 0xb8, 0xb6, 0xba, 0xbf, 0xb3, 0xbb, 0xb7, 0xb1, 0xb4,\n    0xba, 0xbc, 0xb9, 0xb5, 0xb3, 0xb6, 0xbe, 0xbb, 0xb5, 0xb0, 0xb0, 0xbe,\n    0xbc, 0xb9, 0xb7, 0xb2, 0xb7, 0xb2, 0xbb, 0xb1, 0xb4, 0xbe, 0xb1, 0xb7,\n    0xb9, 0xb4, 0xbc, 0xba, 0xbe, 0xb8, 0xb2, 0xbd, 0xb0, 0xbf, 0xb6, 0xbc,\n    0xba, 0xb9, 0xbd, 0xb0, 0xbf, 0xb3, 0xb3, 0xb5, 0xb5, 0xb6, 0xb8, 0xbb,\n    0xed, 0xe1, 0xe2, 0xef, 0xe8, 0xed, 0xe4, 0xe8, 0xe6, 0xea, 0xef, 0xe3,\n    0xeb, 0xe7, 0xe1, 0xe4, 0xea, 0xec, 0xe9, 0xe5, 0xe3, 0xe6, 0xee, 0xeb,\n    0xe5, 0xe0, 0xe0, 0xee, 0xec, 0xe9, 0xe7, 0xe2, 0xe7, 0xe2, 0xeb, 0xe1,\n    0xe4, 0xee, 0xe1, 0xe7, 0xe9, 0xe4, 0xec, 0xea, 0xee, 0xe8, 0xe2, 0xed,\n    0xe0, 0xef, 0xe6, 0xec, 0xea, 0xe9, 0xed, 0xe0, 0xef, 0xe3, 0xe3, 0xe5,\n    0xe5, 0xe6, 0xe8, 0xeb, 0x7d, 0x71, 0x72, 0x7f, 0x78, 0x7d, 0x74, 0x78,\n    0x76, 0x7a, 0x7f, 0x73, 0x7b, 0x77, 0x71, 0x74, 0x7a, 0x7c, 0x79, 0x75,\n    0x73, 0x76, 0x7e, 0x7b, 0x75, 0x70, 0x70, 0x7e, 0x7c, 0x79, 0x77, 0x72,\n    0x77, 0x72, 0x7b, 0x71, 0x74, 0x7e, 0x71, 0x77, 0x79, 0x74, 0x7c, 0x7a,\n    0x7e, 0x78, 0x72, 0x7d, 0x70, 0x7f, 0x76, 0x7c, 0x7a, 0x79, 0x7d, 0x70,\n    0x7f, 0x73, 0x73, 0x75, 0x75, 0x76, 0x78, 0x7b, 0xfd, 0xf1, 0xf2, 0xff,\n    0xf8, 0xfd, 0xf4, 0xf8, 0xf6, 0xfa, 0xff, 0xf3, 0xfb, 0xf7, 0xf1, 0xf4,\n    0xfa, 0xfc, 0xf9, 0xf5, 0xf3, 0xf6, 0xfe, 0xfb, 0xf5, 0xf0, 0xf0, 0xfe,\n    0xfc, 0xf9, 0xf7, 0xf2, 0xf7, 0xf2, 0xfb, 0xf1, 0xf4, 0xfe, 0xf1, 0xf7,\n    0xf9, 0xf4, 0xfc, 0xfa, 0xfe, 0xf8, 0xf2, 0xfd, 0xf0, 0xff, 0xf6, 0xfc,\n    0xfa, 0xf9, 0xfd, 0xf0, 0xff, 0xf3, 0xf3, 0xf5, 0xf5, 0xf6, 0xf8, 0xfb,\n    0x4d, 0x41, 0x42, 0x4f, 0x48, 0x4d, 0x44, 0x48, 0x46, 0x4a, 0x4f, 0x43,\n    0x4b, 0x47, 0x41, 0x44, 0x4a, 0x4c, 0x49, 0x45, 0x43, 0x46, 0x4e, 0x4b,\n    0x45, 0x40, 0x40, 0x4e, 0x4c, 0x49, 0x47, 0x42, 0x47, 0x42, 0x4b, 0x41,\n    0x44, 0x4e, 0x41, 0x47, 0x49, 0x44, 0x4c, 0x4a, 0x4e, 0x48, 0x42, 0x4d,\n    0x40, 0x4f, 0x46, 0x4c, 0x4a, 0x49, 0x4d, 0x40, 0x4f, 0x43, 0x43, 0x45,\n    0x45, 0x46, 0x48, 0x4b, 0x0d, 0x01, 0x02, 0x0f, 0x08, 0x0d, 0x04, 0x08,\n    0x06, 0x0a, 0x0f, 0x03, 0x0b, 0x07, 0x01, 0x04, 0x0a, 0x0c, 0x09, 0x05,\n    0x03, 0x06, 0x0e, 0x0b, 0x05, 0x00, 0x00, 0x0e, 0x0c, 0x09, 0x07, 0x02,\n    0x07, 0x02, 0x0b, 0x01, 0x04, 0x0e, 0x01, 0x07, 0x09, 0x04, 0x0c, 0x0a,\n    0x0e, 0x08, 0x02, 0x0d, 0x00, 0x0f, 0x06, 0x0c, 0x0a, 0x09, 0x0d, 0x00,\n    0x0f, 0x03, 0x03, 0x05, 0x05, 0x06, 0x08, 0x0b, 0x9d, 0x91, 0x92, 0x9f,\n    0x98, 0x9d, 0x94, 0x98, 0x96, 0x9a, 0x9f, 0x93, 0x9b, 0x97, 0x91, 0x94,\n    0x9a, 0x9c, 0x99, 0x95, 0x93, 0x96, 0x9e, 0x9b, 0x95, 0x90, 0x90, 0x9e,\n    0x9c, 0x99, 0x97, 0x92, 0x97, 0x92, 0x9b, 0x91, 0x94, 0x9e, 0x91, 0x97,\n    0x99, 0x94, 0x9c, 0x9a, 0x9e, 0x98, 0x92, 0x9d, 0x90, 0x9f, 0x96, 0x9c,\n    0x9a, 0x99, 0x9d, 0x90, 0x9f, 0x93, 0x93, 0x95, 0x95, 0x96, 0x98, 0x9b,\n    0x8d, 0x81, 0x82, 0x8f, 0x88, 0x8d, 0x84, 0x88, 0x86, 0x8a, 0x8f, 0x83,\n    0x8b, 0x87, 0x81, 0x84, 0x8a, 0x8c, 0x89, 0x85, 0x83, 0x86, 0x8e, 0x8b,\n    0x85, 0x80, 0x80, 0x8e, 0x8c, 0x89, 0x87, 0x82, 0x87, 0x82, 0x8b, 0x81,\n    0x84, 0x8e, 0x81, 0x87, 0x89, 0x84, 0x8c, 0x8a, 0x8e, 0x88, 0x82, 0x8d,\n    0x80, 0x8f, 0x86, 0x8c, 0x8a, 0x89, 0x8d, 0x80, 0x8f, 0x83, 0x83, 0x85,\n    0x85, 0x86, 0x88, 0x8b, 0x1d, 0x11, 0x12, 0x1f, 0x18, 0x1d, 0x14, 0x18,\n    0x16, 0x1a, 0x1f, 0x13, 0x1b, 0x17, 0x11, 0x14, 0x1a, 0x1c, 0x19, 0x15,\n    0x13, 0x16, 0x1e, 0x1b, 0x15, 0x10, 0x10, 0x1e, 0x1c, 0x19, 0x17, 0x12,\n    0x17, 0x12, 0x1b, 0x11, 0x14, 0x1e, 0x11, 0x17, 0x19, 0x14, 0x1c, 0x1a,\n    0x1e, 0x18, 0x12, 0x1d, 0x10, 0x1f, 0x16, 0x1c, 0x1a, 0x19, 0x1d, 0x10,\n    0x1f, 0x13, 0x13, 0x15, 0x15, 0x16, 0x18, 0x1b, 0xdd, 0xd1, 0xd2, 0xdf,\n    0xd8, 0xdd, 0xd4, 0xd8, 0xd6, 0xda, 0xdf, 0xd3, 0xdb, 0xd7, 0xd1, 0xd4,\n    0xda, 0xdc, 0xd9, 0xd5, 0xd3, 0xd6, 0xde, 0xdb, 0xd5, 0xd0, 0xd0, 0xde,\n    0xdc, 0xd9, 0xd7, 0xd2, 0xd7, 0xd2, 0xdb, 0xd1, 0xd4, 0xde, 0xd1, 0xd7,\n    0xd9, 0xd4, 0xdc, 0xda, 0xde, 0xd8, 0xd2, 0xdd, 0xd0, 0xdf, 0xd6, 0xdc,\n    0xda, 0xd9, 0xdd, 0xd0, 0xdf, 0xd3, 0xd3, 0xd5, 0xd5, 0xd6, 0xd8, 0xdb,\n    0xad, 0xa1, 0xa2, 0xaf, 0xa8, 0xad, 0xa4, 0xa8, 0xa6, 0xaa, 0xaf, 0xa3,\n    0xab, 0xa7, 0xa1, 0xa4, 0xaa, 0xac, 0xa9, 0xa5, 0xa3, 0xa6, 0xae, 0xab,\n    0xa5, 0xa0, 0xa0, 0xae, 0xac, 0xa9, 0xa7, 0xa2, 0xa7, 0xa2, 0xab, 0xa1,\n    0xa4, 0xae, 0xa1, 0xa7, 0xa9, 0xa4, 0xac, 0xaa, 0xae, 0xa8, 0xa2, 0xad,\n    0xa0, 0xaf, 0xa6, 0xac, 0xaa, 0xa9, 0xad, 0xa0, 0xaf, 0xa3, 0xa3, 0xa5,\n    0xa5, 0xa6, 0xa8, 0xab, 0x3d, 0x31, 0x32, 0x3f, 0x38, 0x3d, 0x34, 0x38,\n    0x36, 0x3a, 0x3f, 0x33, 0x3b, 0x37, 0x31, 0x34, 0x3a, 0x3c, 0x39, 0x35,\n    0x33, 0x36, 0x3e, 0x3b, 0x35, 0x30, 0x30, 0x3e, 0x3c, 0x39, 0x37, 0x32,\n    0x37, 0x32, 0x3b, 0x31, 0x34, 0x3e, 0x31, 0x37, 0x39, 0x34, 0x3c, 0x3a,\n    0x3e, 0x38, 0x32, 0x3d, 0x30, 0x3f, 0x36, 0x3c, 0x3a, 0x39, 0x3d, 0x30,\n    0x3f, 0x33, 0x33, 0x35, 0x35, 0x36, 0x38, 0x3b, 0xed, 0xe1, 0xe2, 0xef,\n    0xe8, 0xed, 0xe4, 0xe8, 0xe6, 0xea, 0xef, 0xe3, 0xeb, 0xe7, 0xe1, 0xe4,\n    0xea, 0xec, 0xe9, 0xe5, 0xe3, 0xe6, 0xee, 0xeb, 0xe5, 0xe0, 0xe0, 0xee,\n    0xec, 0xe9, 0xe7, 0xe2, 0xe7, 0xe2, 0xeb, 0xe1, 0xe4, 0xee, 0xe1, 0xe7,\n    0xe9, 0xe4, 0xec, 0xea, 0xee, 0xe8, 0xe2, 0xed, 0xe0, 0xef, 0xe6, 0xec,\n    0xea, 0xe9, 0xed, 0xe0, 0xef, 0xe3, 0xe3, 0xe5, 0xe5, 0xe6, 0xe8, 0xeb,\n    0xcd, 0xc1, 0xc2, 0xcf, 0xc8, 0xcd, 0xc4, 0xc8, 0xc6, 0xca, 0xcf, 0xc3,\n    0xcb, 0xc7, 0xc1, 0xc4, 0xca, 0xcc, 0xc9, 0xc5, 0xc3, 0xc6, 0xce, 0xcb,\n    0xc5, 0xc0, 0xc0, 0xce, 0xcc, 0xc9, 0xc7, 0xc2, 0xc7, 0xc2, 0xcb, 0xc1,\n    0xc4, 0xce, 0xc1, 0xc7, 0xc9, 0xc4, 0xcc, 0xca, 0xce, 0xc8, 0xc2, 0xcd,\n    0xc0, 0xcf, 0xc6, 0xcc, 0xca, 0xc9, 0xcd, 0xc0, 0xcf, 0xc3, 0xc3, 0xc5,\n    0xc5, 0xc6, 0xc8, 0xcb, 0x3d, 0x31, 0x32, 0x3f, 0x38, 0x3d, 0x34, 0x38,\n    0x36, 0x3a, 0x3f, 0x33, 0x3b, 0x37, 0x31, 0x34, 0x3a, 0x3c, 0x39, 0x35,\n    0x33, 0x36, 0x3e, 0x3b, 0x35, 0x30, 0x30, 0x3e, 0x3c, 0x39, 0x37, 0x32,\n    0x37, 0x32, 0x3b, 0x31, 0x34, 0x3e, 0x31, 0x37, 0x39, 0x34, 0x3c, 0x3a,\n    0x3e, 0x38, 0x32, 0x3d, 0x30, 0x3f, 0x36, 0x3c, 0x3a, 0x39, 0x3d, 0x30,\n    0x3f, 0x33, 0x33, 0x35, 0x35, 0x36, 0x38, 0x3b, 0x9d, 0x91, 0x92, 0x9f,\n    0x98, 0x9d, 0x94, 0x98, 0x96, 0x9a, 0x9f, 0x93, 0x9b, 0x97, 0x91, 0x94,\n    0x9a, 0x9c, 0x99, 0x95, 0x93, 0x96, 0x9e, 0x9b, 0x95, 0x90, 0x90, 0x9e,\n    0x9c, 0x99, 0x97, 0x92, 0x97, 0x92, 0x9b, 0x91, 0x94, 0x9e, 0x91, 0x97,\n    0x99, 0x94, 0x9c, 0x9a, 0x9e, 0x98, 0x92, 0x9d, 0x90, 0x9f, 0x96, 0x9c,\n    0x9a, 0x99, 0x9d, 0x90, 0x9f, 0x93, 0x93, 0x95, 0x95, 0x96, 0x98, 0x9b,\n    0x5d, 0x51, 0x52, 0x5f, 0x58, 0x5d, 0x54, 0x58, 0x56, 0x5a, 0x5f, 0x53,\n    0x5b, 0x57, 0x51, 0x54, 0x5a, 0x5c, 0x59, 0x55, 0x53, 0x56, 0x5e, 0x5b,\n    0x55, 0x50, 0x50, 0x5e, 0x5c, 0x59, 0x57, 0x52, 0x57, 0x52, 0x5b, 0x51,\n    0x54, 0x5e, 0x51, 0x57, 0x59, 0x54, 0x5c, 0x5a, 0x5e, 0x58, 0x52, 0x5d,\n    0x50, 0x5f, 0x56, 0x5c, 0x5a, 0x59, 0x5d, 0x50, 0x5f, 0x53, 0x53, 0x55,\n    0x55, 0x56, 0x58, 0x5b, 0x7d, 0x71, 0x72, 0x7f, 0x78, 0x7d, 0x74, 0x78,\n    0x76, 0x7a, 0x7f, 0x73, 0x7b, 0x77, 0x71, 0x74, 0x7a, 0x7c, 0x79, 0x75,\n    0x73, 0x76, 0x7e, 0x7b, 0x75, 0x70, 0x70, 0x7e, 0x7c, 0x79, 0x77, 0x72,\n    0x77, 0x72, 0x7b, 0x71, 0x74, 0x7e, 0x71, 0x77, 0x79, 0x74, 0x7c, 0x7a,\n    0x7e, 0x78, 0x72, 0x7d, 0x70, 0x7f, 0x76, 0x7c, 0x7a, 0x79, 0x7d, 0x70,\n    0x7f, 0x73, 0x73, 0x75, 0x75, 0x76, 0x78, 0x7b, 0xcd, 0xc1, 0xc2, 0xcf,\n    0xc8, 0xcd, 0xc4, 0xc8, 0xc6, 0xca, 0xcf, 0xc3, 0xcb, 0xc7, 0xc1, 0xc4,\n    0xca, 0xcc, 0xc9, 0xc5, 0xc3, 0xc6, 0xce, 0xcb, 0xc5, 0xc0, 0xc0, 0xce,\n    0xcc, 0xc9, 0xc7, 0xc2, 0xc7, 0xc2, 0xcb, 0xc1, 0xc4, 0xce, 0xc1, 0xc7,\n    0xc9, 0xc4, 0xcc, 0xca, 0xce, 0xc8, 0xc2, 0xcd, 0xc0, 0xcf, 0xc6, 0xcc,\n    0xca, 0xc9, 0xcd, 0xc0, 0xcf, 0xc3, 0xc3, 0xc5, 0xc5, 0xc6, 0xc8, 0xcb,\n    0x5d, 0x51, 0x52, 0x5f, 0x58, 0x5d, 0x54, 0x58, 0x56, 0x5a, 0x5f, 0x53,\n    0x5b, 0x57, 0x51, 0x54, 0x5a, 0x5c, 0x59, 0x55, 0x53, 0x56, 0x5e, 0x5b,\n    0x55, 0x50, 0x50, 0x5e, 0x5c, 0x59, 0x57, 0x52, 0x57, 0x52, 0x5b, 0x51,\n    0x54, 0x5e, 0x51, 0x57, 0x59, 0x54, 0x5c, 0x5a, 0x5e, 0x58, 0x52, 0x5d,\n    0x50, 0x5f, 0x56, 0x5c, 0x5a, 0x59, 0x5d, 0x50, 0x5f, 0x53, 0x53, 0x55,\n    0x55, 0x56, 0x58, 0x5b, 0x2d, 0x21, 0x22, 0x2f, 0x28, 0x2d, 0x24, 0x28,\n    0x26, 0x2a, 0x2f, 0x23, 0x2b, 0x27, 0x21, 0x24, 0x2a, 0x2c, 0x29, 0x25,\n    0x23, 0x26, 0x2e, 0x2b, 0x25, 0x20, 0x20, 0x2e, 0x2c, 0x29, 0x27, 0x22,\n    0x27, 0x22, 0x2b, 0x21, 0x24, 0x2e, 0x21, 0x27, 0x29, 0x24, 0x2c, 0x2a,\n    0x2e, 0x28, 0x22, 0x2d, 0x20, 0x2f, 0x26, 0x2c, 0x2a, 0x29, 0x2d, 0x20,\n    0x2f, 0x23, 0x23, 0x25, 0x25, 0x26, 0x28, 0x2b, 0xad, 0xa1, 0xa2, 0xaf,\n    0xa8, 0xad, 0xa4, 0xa8, 0xa6, 0xaa, 0xaf, 0xa3, 0xab, 0xa7, 0xa1, 0xa4,\n    0xaa, 0xac, 0xa9, 0xa5, 0xa3, 0xa6, 0xae, 0xab, 0xa5, 0xa0, 0xa0, 0xae,\n    0xac, 0xa9, 0xa7, 0xa2, 0xa7, 0xa2, 0xab, 0xa1, 0xa4, 0xae, 0xa1, 0xa7,\n    0xa9, 0xa4, 0xac, 0xaa, 0xae, 0xa8, 0xa2, 0xad, 0xa0, 0xaf, 0xa6, 0xac,\n    0xaa, 0xa9, 0xad, 0xa0, 0xaf, 0xa3, 0xa3, 0xa5, 0xa5, 0xa6, 0xa8, 0xab,\n    0xfd, 0xf1, 0xf2, 0xff, 0xf8, 0xfd, 0xf4, 0xf8, 0xf6, 0xfa, 0xff, 0xf3,\n    0xfb, 0xf7, 0xf1, 0xf4, 0xfa, 0xfc, 0xf9, 0xf5, 0xf3, 0xf6, 0xfe, 0xfb,\n    0xf5, 0xf0, 0xf0, 0xfe, 0xfc, 0xf9, 0xf7, 0xf2, 0xf7, 0xf2, 0xfb, 0xf1,\n    0xf4, 0xfe, 0xf1, 0xf7, 0xf9, 0xf4, 0xfc, 0xfa, 0xfe, 0xf8, 0xf2, 0xfd,\n    0xf0, 0xff, 0xf6, 0xfc, 0xfa, 0xf9, 0xfd, 0xf0, 0xff, 0xf3, 0xf3, 0xf5,\n    0xf5, 0xf6, 0xf8, 0xfb, 0x6d, 0x61, 0x62, 0x6f, 0x68, 0x6d, 0x64, 0x68,\n    0x66, 0x6a, 0x6f, 0x63, 0x6b, 0x67, 0x61, 0x64, 0x6a, 0x6c, 0x69, 0x65,\n    0x63, 0x66, 0x6e, 0x6b, 0x65, 0x60, 0x60, 0x6e, 0x6c, 0x69, 0x67, 0x62,\n    0x67, 0x62, 0x6b, 0x61, 0x64, 0x6e, 0x61, 0x67, 0x69, 0x64, 0x6c, 0x6a,\n    0x6e, 0x68, 0x62, 0x6d, 0x60, 0x6f, 0x66, 0x6c, 0x6a, 0x69, 0x6d, 0x60,\n    0x6f, 0x63, 0x63, 0x65, 0x65, 0x66, 0x68, 0x6b, 0x8d, 0x81, 0x82, 0x8f,\n    0x88, 0x8d, 0x84, 0x88, 0x86, 0x8a, 0x8f, 0x83, 0x8b, 0x87, 0x81, 0x84,\n    0x8a, 0x8c, 0x89, 0x85, 0x83, 0x86, 0x8e, 0x8b, 0x85, 0x80, 0x80, 0x8e,\n    0x8c, 0x89, 0x87, 0x82, 0x87, 0x82, 0x8b, 0x81, 0x84, 0x8e, 0x81, 0x87,\n    0x89, 0x84, 0x8c, 0x8a, 0x8e, 0x88, 0x82, 0x8d, 0x80, 0x8f, 0x86, 0x8c,\n    0x8a, 0x89, 0x8d, 0x80, 0x8f, 0x83, 0x83, 0x85, 0x85, 0x86, 0x88, 0x8b,\n    0x1d, 0x11, 0x12, 0x1f, 0x18, 0x1d, 0x14, 0x18, 0x16, 0x1a, 0x1f, 0x13,\n    0x1b, 0x17, 0x11, 0x14, 0x1a, 0x1c, 0x19, 0x15, 0x13, 0x16, 0x1e, 0x1b,\n    0x15, 0x10, 0x10, 0x1e, 0x1c, 0x19, 0x17, 0x12, 0x17, 0x12, 0x1b, 0x11,\n    0x14, 0x1e, 0x11, 0x17, 0x19, 0x14, 0x1c, 0x1a, 0x1e, 0x18, 0x12, 0x1d,\n    0x10, 0x1f, 0x16, 0x1c, 0x1a, 0x19, 0x1d, 0x10, 0x1f, 0x13, 0x13, 0x15,\n    0x15, 0x16, 0x18, 0x1b, 0x6d, 0x61, 0x62, 0x6f, 0x68, 0x6d, 0x64, 0x68,\n    0x66, 0x6a, 0x6f, 0x63, 0x6b, 0x67, 0x61, 0x64, 0x6a, 0x6c, 0x69, 0x65,\n    0x63, 0x66, 0x6e, 0x6b, 0x65, 0x60, 0x60, 0x6e, 0x6c, 0x69, 0x67, 0x62,\n    0x67, 0x62, 0x6b, 0x61, 0x64, 0x6e, 0x61, 0x67, 0x69, 0x64, 0x6c, 0x6a,\n    0x6e, 0x68, 0x62, 0x6d, 0x60, 0x6f, 0x66, 0x6c, 0x6a, 0x69, 0x6d, 0x60,\n    0x6f, 0x63, 0x63, 0x65, 0x65, 0x66, 0x68, 0x6b, 0x1d, 0x11, 0x12, 0x1f,\n    0x18, 0x1d, 0x14, 0x18, 0x16, 0x1a, 0x1f, 0x13, 0x1b, 0x17, 0x11, 0x14,\n    0x1a, 0x1c, 0x19, 0x15, 0x13, 0x16, 0x1e, 0x1b, 0x15, 0x10, 0x10, 0x1e,\n    0x1c, 0x19, 0x17, 0x12, 0x17, 0x12, 0x1b, 0x11, 0x14, 0x1e, 0x11, 0x17,\n    0x19, 0x14, 0x1c, 0x1a, 0x1e, 0x18, 0x12, 0x1d, 0x10, 0x1f, 0x16, 0x1c,\n    0x1a, 0x19, 0x1d, 0x10, 0x1f, 0x13, 0x13, 0x15, 0x15, 0x16, 0x18, 0x1b,\n    0x6d, 0x61, 0x62, 0x6f, 0x68, 0x6d, 0x64, 0x68, 0x66, 0x6a, 0x6f, 0x63,\n    0x6b, 0x67, 0x61, 0x64, 0x6a, 0x6c, 0x69, 0x65, 0x63, 0x66, 0x6e, 0x6b,\n    0x65, 0x60, 0x60, 0x6e, 0x6c, 0x69, 0x67, 0x62, 0x67, 0x62, 0x6b, 0x61,\n    0x64, 0x6e, 0x61, 0x67, 0x69, 0x64, 0x6c, 0x6a, 0x6e, 0x68, 0x62, 0x6d,\n    0x60, 0x6f, 0x66, 0x6c, 0x6a, 0x69, 0x6d, 0x60, 0x6f, 0x63, 0x63, 0x65,\n    0x65, 0x66, 0x68, 0x6b, 0x4d, 0x41, 0x42, 0x4f, 0x48, 0x4d, 0x44, 0x48,\n    0x46, 0x4a, 0x4f, 0x43, 0x4b, 0x47, 0x41, 0x44, 0x4a, 0x4c, 0x49, 0x45,\n    0x43, 0x46, 0x4e, 0x4b, 0x45, 0x40, 0x40, 0x4e, 0x4c, 0x49, 0x47, 0x42,\n    0x47, 0x42, 0x4b, 0x41, 0x44, 0x4e, 0x41, 0x47, 0x49, 0x44, 0x4c, 0x4a,\n    0x4e, 0x48, 0x42, 0x4d, 0x40, 0x4f, 0x46, 0x4c, 0x4a, 0x49, 0x4d, 0x40,\n    0x4f, 0x43, 0x43, 0x45, 0x45, 0x46, 0x48, 0x4b, 0xbd, 0xb1, 0xb2, 0xbf,\n    0xb8, 0xbd, 0xb4, 0xb8, 0xb6, 0xba, 0xbf, 0xb3, 0xbb, 0xb7, 0xb1, 0xb4,\n    0xba, 0xbc, 0xb9, 0xb5, 0xb3, 0xb6, 0xbe, 0xbb, 0xb5, 0xb0, 0xb0, 0xbe,\n    0xbc, 0xb9, 0xb7, 0xb2, 0xb7, 0xb2, 0xbb, 0xb1, 0xb4, 0xbe, 0xb1, 0xb7,\n    0xb9, 0xb4, 0xbc, 0xba, 0xbe, 0xb8, 0xb2, 0xbd, 0xb0, 0xbf, 0xb6, 0xbc,\n    0xba, 0xb9, 0xbd, 0xb0, 0xbf, 0xb3, 0xb3, 0xb5, 0xb5, 0xb6, 0xb8, 0xbb,\n    0xbd, 0xb1, 0xb2, 0xbf, 0xb8, 0xbd, 0xb4, 0xb8, 0xb6, 0xba, 0xbf, 0xb3,\n    0xbb, 0xb7, 0xb1, 0xb4, 0xba, 0xbc, 0xb9, 0xb5, 0xb3, 0xb6, 0xbe, 0xbb,\n    0xb5, 0xb0, 0xb0, 0xbe, 0xbc, 0xb9, 0xb7, 0xb2, 0xb7, 0xb2, 0xbb, 0xb1,\n    0xb4, 0xbe, 0xb1, 0xb7, 0xb9, 0xb4, 0xbc, 0xba, 0xbe, 0xb8, 0xb2, 0xbd,\n    0xb0, 0xbf, 0xb6, 0xbc, 0xba, 0xb9, 0xbd, 0xb0, 0xbf, 0xb3, 0xb3, 0xb5,\n    0xb5, 0xb6, 0xb8, 0xbb, 0xdd, 0xd1, 0xd2, 0xdf, 0xd8, 0xdd, 0xd4, 0xd8,\n    0xd6, 0xda, 0xdf, 0xd3, 0xdb, 0xd7, 0xd1, 0xd4, 0xda, 0xdc, 0xd9, 0xd5,\n    0xd3, 0xd6, 0xde, 0xdb, 0xd5, 0xd0, 0xd0, 0xde, 0xdc, 0xd9, 0xd7, 0xd2,\n    0xd7, 0xd2, 0xdb, 0xd1, 0xd4, 0xde, 0xd1, 0xd7, 0xd9, 0xd4, 0xdc, 0xda,\n    0xde, 0xd8, 0xd2, 0xdd, 0xd0, 0xdf, 0xd6, 0xdc, 0xda, 0xd9, 0xdd, 0xd0,\n    0xdf, 0xd3, 0xd3, 0xd5, 0xd5, 0xd6, 0xd8, 0xdb, 0xdd, 0xd1, 0xd2, 0xdf,\n    0xd8, 0xdd, 0xd4, 0xd8, 0xd6, 0xda, 0xdf, 0xd3, 0xdb, 0xd7, 0xd1, 0xd4,\n    0xda, 0xdc, 0xd9, 0xd5, 0xd3, 0xd6, 0xde, 0xdb, 0xd5, 0xd0, 0xd0, 0xde,\n    0xdc, 0xd9, 0xd7, 0xd2, 0xd7, 0xd2, 0xdb, 0xd1, 0xd4, 0xde, 0xd1, 0xd7,\n    0xd9, 0xd4, 0xdc, 0xda, 0xde, 0xd8, 0xd2, 0xdd, 0xd0, 0xdf, 0xd6, 0xdc,\n    0xda, 0xd9, 0xdd, 0xd0, 0xdf, 0xd3, 0xd3, 0xd5, 0xd5, 0xd6, 0xd8, 0xdb,\n    0x8d, 0x81, 0x82, 0x8f, 0x88, 0x8d, 0x84, 0x88, 0x86, 0x8a, 0x8f, 0x83,\n    0x8b, 0x87, 0x81, 0x84, 0x8a, 0x8c, 0x89, 0x85, 0x83, 0x86, 0x8e, 0x8b,\n    0x85, 0x80, 0x80, 0x8e, 0x8c, 0x89, 0x87, 0x82, 0x87, 0x82, 0x8b, 0x81,\n    0x84, 0x8e, 0x81, 0x87, 0x89, 0x84, 0x8c, 0x8a, 0x8e, 0x88, 0x82, 0x8d,\n    0x80, 0x8f, 0x86, 0x8c, 0x8a, 0x89, 0x8d, 0x80, 0x8f, 0x83, 0x83, 0x85,\n    0x85, 0x86, 0x88, 0x8b, 0xcd, 0xc1, 0xc2, 0xcf, 0xc8, 0xcd, 0xc4, 0xc8,\n    0xc6, 0xca, 0xcf, 0xc3, 0xcb, 0xc7, 0xc1, 0xc4, 0xca, 0xcc, 0xc9, 0xc5,\n    0xc3, 0xc6, 0xce, 0xcb, 0xc5, 0xc0, 0xc0, 0xce, 0xcc, 0xc9, 0xc7, 0xc2,\n    0xc7, 0xc2, 0xcb, 0xc1, 0xc4, 0xce, 0xc1, 0xc7, 0xc9, 0xc4, 0xcc, 0xca,\n    0xce, 0xc8, 0xc2, 0xcd, 0xc0, 0xcf, 0xc6, 0xcc, 0xca, 0xc9, 0xcd, 0xc0,\n    0xcf, 0xc3, 0xc3, 0xc5, 0xc5, 0xc6, 0xc8, 0xcb, 0x1d, 0x11, 0x12, 0x1f,\n    0x18, 0x1d, 0x14, 0x18, 0x16, 0x1a, 0x1f, 0x13, 0x1b, 0x17, 0x11, 0x14,\n    0x1a, 0x1c, 0x19, 0x15, 0x13, 0x16, 0x1e, 0x1b, 0x15, 0x10, 0x10, 0x1e,\n    0x1c, 0x19, 0x17, 0x12, 0x17, 0x12, 0x1b, 0x11, 0x14, 0x1e, 0x11, 0x17,\n    0x19, 0x14, 0x1c, 0x1a, 0x1e, 0x18, 0x12, 0x1d, 0x10, 0x1f, 0x16, 0x1c,\n    0x1a, 0x19, 0x1d, 0x10, 0x1f, 0x13, 0x13, 0x15, 0x15, 0x16, 0x18, 0x1b,\n    0x3d, 0x31, 0x32, 0x3f, 0x38, 0x3d, 0x34, 0x38, 0x36, 0x3a, 0x3f, 0x33,\n    0x3b, 0x37, 0x31, 0x34, 0x3a, 0x3c, 0x39, 0x35, 0x33, 0x36, 0x3e, 0x3b,\n    0x35, 0x30, 0x30, 0x3e, 0x3c, 0x39, 0x37, 0x32, 0x37, 0x32, 0x3b, 0x31,\n    0x34, 0x3e, 0x31, 0x37, 0x39, 0x34, 0x3c, 0x3a, 0x3e, 0x38, 0x32, 0x3d,\n    0x30, 0x3f, 0x36, 0x3c, 0x3a, 0x39, 0x3d, 0x30, 0x3f, 0x33, 0x33, 0x35,\n    0x35, 0x36, 0x38, 0x3b, 0x4d, 0x41, 0x42, 0x4f, 0x48, 0x4d, 0x44, 0x48,\n    0x46, 0x4a, 0x4f, 0x43, 0x4b, 0x47, 0x41, 0x44, 0x4a, 0x4c, 0x49, 0x45,\n    0x43, 0x46, 0x4e, 0x4b, 0x45, 0x40, 0x40, 0x4e, 0x4c, 0x49, 0x47, 0x42,\n    0x47, 0x42, 0x4b, 0x41, 0x44, 0x4e, 0x41, 0x47, 0x49, 0x44, 0x4c, 0x4a,\n    0x4e, 0x48, 0x42, 0x4d, 0x40, 0x4f, 0x46, 0x4c, 0x4a, 0x49, 0x4d, 0x40,\n    0x4f, 0x43, 0x43, 0x45, 0x45, 0x46, 0x48, 0x4b, 0x7d, 0x71, 0x72, 0x7f,\n    0x78, 0x7d, 0x74, 0x78, 0x76, 0x7a, 0x7f, 0x73, 0x7b, 0x77, 0x71, 0x74,\n    0x7a, 0x7c, 0x79, 0x75, 0x73, 0x76, 0x7e, 0x7b, 0x75, 0x70, 0x70, 0x7e,\n    0x7c, 0x79, 0x77, 0x72, 0x77, 0x72, 0x7b, 0x71, 0x74, 0x7e, 0x71, 0x77,\n    0x79, 0x74, 0x7c, 0x7a, 0x7e, 0x78, 0x72, 0x7d, 0x70, 0x7f, 0x76, 0x7c,\n    0x7a, 0x79, 0x7d, 0x70, 0x7f, 0x73, 0x73, 0x75, 0x75, 0x76, 0x78, 0x7b,\n    0xad, 0xa1, 0xa2, 0xaf, 0xa8, 0xad, 0xa4, 0xa8, 0xa6, 0xaa, 0xaf, 0xa3,\n    0xab, 0xa7, 0xa1, 0xa4, 0xaa, 0xac, 0xa9, 0xa5, 0xa3, 0xa6, 0xae, 0xab,\n    0xa5, 0xa0, 0xa0, 0xae, 0xac, 0xa9, 0xa7, 0xa2, 0xa7, 0xa2, 0xab, 0xa1,\n    0xa4, 0xae, 0xa1, 0xa7, 0xa9, 0xa4, 0xac, 0xaa, 0xae, 0xa8, 0xa2, 0xad,\n    0xa0, 0xaf, 0xa6, 0xac, 0xaa, 0xa9, 0xad, 0xa0, 0xaf, 0xa3, 0xa3, 0xa5,\n    0xa5, 0xa6, 0xa8, 0xab, 0xed, 0xe1, 0xe2, 0xef, 0xe8, 0xed, 0xe4, 0xe8,\n    0xe6, 0xea, 0xef, 0xe3, 0xeb, 0xe7, 0xe1, 0xe4, 0xea, 0xec, 0xe9, 0xe5,\n    0xe3, 0xe6, 0xee, 0xeb, 0xe5, 0xe0, 0xe0, 0xee, 0xec, 0xe9, 0xe7, 0xe2,\n    0xe7, 0xe2, 0xeb, 0xe1, 0xe4, 0xee, 0xe1, 0xe7, 0xe9, 0xe4, 0xec, 0xea,\n    0xee, 0xe8, 0xe2, 0xed, 0xe0, 0xef, 0xe6, 0xec, 0xea, 0xe9, 0xed, 0xe0,\n    0xef, 0xe3, 0xe3, 0xe5, 0xe5, 0xe6, 0xe8, 0xeb, 0x7d, 0x71, 0x72, 0x7f,\n    0x78, 0x7d, 0x74, 0x78, 0x76, 0x7a, 0x7f, 0x73, 0x7b, 0x77, 0x71, 0x74,\n    0x7a, 0x7c, 0x79, 0x75, 0x73, 0x76, 0x7e, 0x7b, 0x75, 0x70, 0x70, 0x7e,\n    0x7c, 0x79, 0x77, 0x72, 0x77, 0x72, 0x7b, 0x71, 0x74, 0x7e, 0x71, 0x77,\n    0x79, 0x74, 0x7c, 0x7a, 0x7e, 0x78, 0x72, 0x7d, 0x70, 0x7f, 0x76, 0x7c,\n    0x7a, 0x79, 0x7d, 0x70, 0x7f, 0x73, 0x73, 0x75, 0x75, 0x76, 0x78, 0x7b,\n    0xad, 0xa1, 0xa2, 0xaf, 0xa8, 0xad, 0xa4, 0xa8, 0xa6, 0xaa, 0xaf, 0xa3,\n    0xab, 0xa7, 0xa1, 0xa4, 0xaa, 0xac, 0xa9, 0xa5, 0xa3, 0xa6, 0xae, 0xab,\n    0xa5, 0xa0, 0xa0, 0xae, 0xac, 0xa9, 0xa7, 0xa2, 0xa7, 0xa2, 0xab, 0xa1,\n    0xa4, 0xae, 0xa1, 0xa7, 0xa9, 0xa4, 0xac, 0xaa, 0xae, 0xa8, 0xa2, 0xad,\n    0xa0, 0xaf, 0xa6, 0xac, 0xaa, 0xa9, 0xad, 0xa0, 0xaf, 0xa3, 0xa3, 0xa5,\n    0xa5, 0xa6, 0xa8, 0xab, 0x9d, 0x91, 0x92, 0x9f, 0x98, 0x9d, 0x94, 0x98,\n    0x96, 0x9a, 0x9f, 0x93, 0x9b, 0x97, 0x91, 0x94, 0x9a, 0x9c, 0x99, 0x95,\n    0x93, 0x96, 0x9e, 0x9b, 0x95, 0x90, 0x90, 0x9e, 0x9c, 0x99, 0x97, 0x92,\n    0x97, 0x92, 0x9b, 0x91, 0x94, 0x9e, 0x91, 0x97, 0x99, 0x94, 0x9c, 0x9a,\n    0x9e, 0x98, 0x92, 0x9d, 0x90, 0x9f, 0x96, 0x9c, 0x9a, 0x99, 0x9d, 0x90,\n    0x9f, 0x93, 0x93, 0x95, 0x95, 0x96, 0x98, 0x9b, 0xfd, 0xf1, 0xf2, 0xff,\n    0xf8, 0xfd, 0xf4, 0xf8, 0xf6, 0xfa, 0xff, 0xf3, 0xfb, 0xf7, 0xf1, 0xf4,\n    0xfa, 0xfc, 0xf9, 0xf5, 0xf3, 0xf6, 0xfe, 0xfb, 0xf5, 0xf0, 0xf0, 0xfe,\n    0xfc, 0xf9, 0xf7, 0xf2, 0xf7, 0xf2, 0xfb, 0xf1, 0xf4, 0xfe, 0xf1, 0xf7,\n    0xf9, 0xf4, 0xfc, 0xfa, 0xfe, 0xf8, 0xf2, 0xfd, 0xf0, 0xff, 0xf6, 0xfc,\n    0xfa, 0xf9, 0xfd, 0xf0, 0xff, 0xf3, 0xf3, 0xf5, 0xf5, 0xf6, 0xf8, 0xfb,\n    0x5d, 0x51, 0x52, 0x5f, 0x58, 0x5d, 0x54, 0x58, 0x56, 0x5a, 0x5f, 0x53,\n    0x5b, 0x57, 0x51, 0x54, 0x5a, 0x5c, 0x59, 0x55, 0x53, 0x56, 0x5e, 0x5b,\n    0x55, 0x50, 0x50, 0x5e, 0x5c, 0x59, 0x57, 0x52, 0x57, 0x52, 0x5b, 0x51,\n    0x54, 0x5e, 0x51, 0x57, 0x59, 0x54, 0x5c, 0x5a, 0x5e, 0x58, 0x52, 0x5d,\n    0x50, 0x5f, 0x56, 0x5c, 0x5a, 0x59, 0x5d, 0x50, 0x5f, 0x53, 0x53, 0x55,\n    0x55, 0x56, 0x58, 0x5b, 0x6d, 0x61, 0x62, 0x6f, 0x68, 0x6d, 0x64, 0x68,\n    0x66, 0x6a, 0x6f, 0x63, 0x6b, 0x67, 0x61, 0x64, 0x6a, 0x6c, 0x69, 0x65,\n    0x63, 0x66, 0x6e, 0x6b, 0x65, 0x60, 0x60, 0x6e, 0x6c, 0x69, 0x67, 0x62,\n    0x67, 0x62, 0x6b, 0x61, 0x64, 0x6e, 0x61, 0x67, 0x69, 0x64, 0x6c, 0x6a,\n    0x6e, 0x68, 0x62, 0x6d, 0x60, 0x6f, 0x66, 0x6c, 0x6a, 0x69, 0x6d, 0x60,\n    0x6f, 0x63, 0x63, 0x65, 0x65, 0x66, 0x68, 0x6b, 0x0d, 0x01, 0x02, 0x0f,\n    0x08, 0x0d, 0x04, 0x08, 0x06, 0x0a, 0x0f, 0x03, 0x0b, 0x07, 0x01, 0x04,\n    0x0a, 0x0c, 0x09, 0x05, 0x03, 0x06, 0x0e, 0x0b, 0x05, 0x00, 0x00, 0x0e,\n    0x0c, 0x09, 0x07, 0x02, 0x07, 0x02, 0x0b, 0x01, 0x04, 0x0e, 0x01, 0x07,\n    0x09, 0x04, 0x0c, 0x0a, 0x0e, 0x08, 0x02, 0x0d, 0x00, 0x0f, 0x06, 0x0c,\n    0x0a, 0x09, 0x0d, 0x00, 0x0f, 0x03, 0x03, 0x05, 0x05, 0x06, 0x08, 0x0b,\n    0x8d, 0x81, 0x82, 0x8f, 0x88, 0x8d, 0x84, 0x88, 0x86, 0x8a, 0x8f, 0x83,\n    0x8b, 0x87, 0x81, 0x84, 0x8a, 0x8c, 0x89, 0x85, 0x83, 0x86, 0x8e, 0x8b,\n    0x85, 0x80, 0x80, 0x8e, 0x8c, 0x89, 0x87, 0x82, 0x87, 0x82, 0x8b, 0x81,\n    0x84, 0x8e, 0x81, 0x87, 0x89, 0x84, 0x8c, 0x8a, 0x8e, 0x88, 0x82, 0x8d,\n    0x80, 0x8f, 0x86, 0x8c, 0x8a, 0x89, 0x8d, 0x80, 0x8f, 0x83, 0x83, 0x85,\n    0x85, 0x86, 0x88, 0x8b, 0xfd, 0xf1, 0xf2, 0xff, 0xf8, 0xfd, 0xf4, 0xf8,\n    0xf6, 0xfa, 0xff, 0xf3, 0xfb, 0xf7, 0xf1, 0xf4, 0xfa, 0xfc, 0xf9, 0xf5,\n    0xf3, 0xf6, 0xfe, 0xfb, 0xf5, 0xf0, 0xf0, 0xfe, 0xfc, 0xf9, 0xf7, 0xf2,\n    0xf7, 0xf2, 0xfb, 0xf1, 0xf4, 0xfe, 0xf1, 0xf7, 0xf9, 0xf4, 0xfc, 0xfa,\n    0xfe, 0xf8, 0xf2, 0xfd, 0xf0, 0xff, 0xf6, 0xfc, 0xfa, 0xf9, 0xfd, 0xf0,\n    0xff, 0xf3, 0xf3, 0xf5, 0xf5, 0xf6, 0xf8, 0xfb, 0x0d, 0x01, 0x02, 0x0f,\n    0x08, 0x0d, 0x04, 0x08, 0x06, 0x0a, 0x0f, 0x03, 0x0b, 0x07, 0x01, 0x04,\n    0x0a, 0x0c, 0x09, 0x05, 0x03, 0x06, 0x0e, 0x0b, 0x05, 0x00, 0x00, 0x0e,\n    0x0c, 0x09, 0x07, 0x02, 0x07, 0x02, 0x0b, 0x01, 0x04, 0x0e, 0x01, 0x07,\n    0x09, 0x04, 0x0c, 0x0a, 0x0e, 0x08, 0x02, 0x0d, 0x00, 0x0f, 0x06, 0x0c,\n    0x0a, 0x09, 0x0d, 0x00, 0x0f, 0x03, 0x03, 0x05, 0x05, 0x06, 0x08, 0x0b,\n    0xed, 0xe1, 0xe2, 0xef, 0xe8, 0xed, 0xe4, 0xe8, 0xe6, 0xea, 0xef, 0xe3,\n    0xeb, 0xe7, 0xe1, 0xe4, 0xea, 0xec, 0xe9, 0xe5, 0xe3, 0xe6, 0xee, 0xeb,\n    0xe5, 0xe0, 0xe0, 0xee, 0xec, 0xe9, 0xe7, 0xe2, 0xe7, 0xe2, 0xeb, 0xe1,\n    0xe4, 0xee, 0xe1, 0xe7, 0xe9, 0xe4, 0xec, 0xea, 0xee, 0xe8, 0xe2, 0xed,\n    0xe0, 0xef, 0xe6, 0xec, 0xea, 0xe9, 0xed, 0xe0, 0xef, 0xe3, 0xe3, 0xe5,\n    0xe5, 0xe6, 0xe8, 0xeb, 0x5d, 0x51, 0x52, 0x5f, 0x58, 0x5d, 0x54, 0x58,\n    0x56, 0x5a, 0x5f, 0x53, 0x5b, 0x57, 0x51, 0x54, 0x5a, 0x5c, 0x59, 0x55,\n    0x53, 0x56, 0x5e, 0x5b, 0x55, 0x50, 0x50, 0x5e, 0x5c, 0x59, 0x57, 0x52,\n    0x57, 0x52, 0x5b, 0x51, 0x54, 0x5e, 0x51, 0x57, 0x59, 0x54, 0x5c, 0x5a,\n    0x5e, 0x58, 0x52, 0x5d, 0x50, 0x5f, 0x56, 0x5c, 0x5a, 0x59, 0x5d, 0x50,\n    0x5f, 0x53, 0x53, 0x55, 0x55, 0x56, 0x58, 0x5b, 0x2d, 0x21, 0x22, 0x2f,\n    0x28, 0x2d, 0x24, 0x28, 0x26, 0x2a, 0x2f, 0x23, 0x2b, 0x27, 0x21, 0x24,\n    0x2a, 0x2c, 0x29, 0x25, 0x23, 0x26, 0x2e, 0x2b, 0x25, 0x20, 0x20, 0x2e,\n    0x2c, 0x29, 0x27, 0x22, 0x27, 0x22, 0x2b, 0x21, 0x24, 0x2e, 0x21, 0x27,\n    0x29, 0x24, 0x2c, 0x2a, 0x2e, 0x28, 0x22, 0x2d, 0x20, 0x2f, 0x26, 0x2c,\n    0x2a, 0x29, 0x2d, 0x20, 0x2f, 0x23, 0x23, 0x25, 0x25, 0x26, 0x28, 0x2b,\n    0x9d, 0x91, 0x92, 0x9f, 0x98, 0x9d, 0x94, 0x98, 0x96, 0x9a, 0x9f, 0x93,\n    0x9b, 0x97, 0x91, 0x94, 0x9a, 0x9c, 0x99, 0x95, 0x93, 0x96, 0x9e, 0x9b,\n    0x95, 0x90, 0x90, 0x9e, 0x9c, 0x99, 0x97, 0x92, 0x97, 0x92, 0x9b, 0x91,\n    0x94, 0x9e, 0x91, 0x97, 0x99, 0x94, 0x9c, 0x9a, 0x9e, 0x98, 0x92, 0x9d,\n    0x90, 0x9f, 0x96, 0x9c, 0x9a, 0x99, 0x9d, 0x90, 0x9f, 0x93, 0x93, 0x95,\n    0x95, 0x96, 0x98, 0x9b, 0x3d, 0x31, 0x32, 0x3f, 0x38, 0x3d, 0x34, 0x38,\n    0x36, 0x3a, 0x3f, 0x33, 0x3b, 0x37, 0x31, 0x34, 0x3a, 0x3c, 0x39, 0x35,\n    0x33, 0x36, 0x3e, 0x3b, 0x35, 0x30, 0x30, 0x3e, 0x3c, 0x39, 0x37, 0x32,\n    0x37, 0x32, 0x3b, 0x31, 0x34, 0x3e, 0x31, 0x37, 0x39, 0x34, 0x3c, 0x3a,\n    0x3e, 0x38, 0x32, 0x3d, 0x30, 0x3f, 0x36, 0x3c, 0x3a, 0x39, 0x3d, 0x30,\n    0x3f, 0x33, 0x33, 0x35, 0x35, 0x36, 0x38, 0x3b, 0x2d, 0x21, 0x22, 0x2f,\n    0x28, 0x2d, 0x24, 0x28, 0x26, 0x2a, 0x2f, 0x23, 0x2b, 0x27, 0x21, 0x24,\n    0x2a, 0x2c, 0x29, 0x25, 0x23, 0x26, 0x2e, 0x2b, 0x25, 0x20, 0x20, 0x2e,\n    0x2c, 0x29, 0x27, 0x22, 0x27, 0x22, 0x2b, 0x21, 0x24, 0x2e, 0x21, 0x27,\n    0x29, 0x24, 0x2c, 0x2a, 0x2e, 0x28, 0x22, 0x2d, 0x20, 0x2f, 0x26, 0x2c,\n    0x2a, 0x29, 0x2d, 0x20, 0x2f, 0x23, 0x23, 0x25, 0x25, 0x26, 0x28, 0x2b,\n    0xcd, 0xc1, 0xc2, 0xcf, 0xc8, 0xcd, 0xc4, 0xc8, 0xc6, 0xca, 0xcf, 0xc3,\n    0xcb, 0xc7, 0xc1, 0xc4, 0xca, 0xcc, 0xc9, 0xc5, 0xc3, 0xc6, 0xce, 0xcb,\n    0xc5, 0xc0, 0xc0, 0xce, 0xcc, 0xc9, 0xc7, 0xc2, 0xc7, 0xc2, 0xcb, 0xc1,\n    0xc4, 0xce, 0xc1, 0xc7, 0xc9, 0xc4, 0xcc, 0xca, 0xce, 0xc8, 0xc2, 0xcd,\n    0xc0, 0xcf, 0xc6, 0xcc, 0xca, 0xc9, 0xcd, 0xc0, 0xcf, 0xc3, 0xc3, 0xc5,\n    0xc5, 0xc6, 0xc8, 0xcb,\n  },\n};\n\nconst uint32_t ip_maskl[8][256] =\n{\n  {\n    0x00000000, 0x00000001, 0x00000000, 0x00000001, 0x00000100, 0x00000101,\n    0x00000100, 0x00000101, 0x00000000, 0x00000001, 0x00000000, 0x00000001,\n    0x00000100, 0x00000101, 0x00000100, 0x00000101, 0x00010000, 0x00010001,\n    0x00010000, 0x00010001, 0x00010100, 0x00010101, 0x00010100, 0x00010101,\n    0x00010000, 0x00010001, 0x00010000, 0x00010001, 0x00010100, 0x00010101,\n    0x00010100, 0x00010101, 0x00000000, 0x00000001, 0x00000000, 0x00000001,\n    0x00000100, 0x00000101, 0x00000100, 0x00000101, 0x00000000, 0x00000001,\n    0x00000000, 0x00000001, 0x00000100, 0x00000101, 0x00000100, 0x00000101,\n    0x00010000, 0x00010001, 0x00010000, 0x00010001, 0x00010100, 0x00010101,\n    0x00010100, 0x00010101, 0x00010000, 0x00010001, 0x00010000, 0x00010001,\n    0x00010100, 0x00010101, 0x00010100, 0x00010101, 0x01000000, 0x01000001,\n    0x01000000, 0x01000001, 0x01000100, 0x01000101, 0x01000100, 0x01000101,\n    0x01000000, 0x01000001, 0x01000000, 0x01000001, 0x01000100, 0x01000101,\n    0x01000100, 0x01000101, 0x01010000, 0x01010001, 0x01010000, 0x01010001,\n    0x01010100, 0x01010101, 0x01010100, 0x01010101, 0x01010000, 0x01010001,\n    0x01010000, 0x01010001, 0x01010100, 0x01010101, 0x01010100, 0x01010101,\n    0x01000000, 0x01000001, 0x01000000, 0x01000001, 0x01000100, 0x01000101,\n    0x01000100, 0x01000101, 0x01000000, 0x01000001, 0x01000000, 0x01000001,\n    0x01000100, 0x01000101, 0x01000100, 0x01000101, 0x01010000, 0x01010001,\n    0x01010000, 0x01010001, 0x01010100, 0x01010101, 0x01010100, 0x01010101,\n    0x01010000, 0x01010001, 0x01010000, 0x01010001, 0x01010100, 0x01010101,\n    0x01010100, 0x01010101, 0x00000000, 0x00000001, 0x00000000, 0x00000001,\n    0x00000100, 0x00000101, 0x00000100, 0x00000101, 0x00000000, 0x00000001,\n    0x00000000, 0x00000001, 0x00000100, 0x00000101, 0x00000100, 0x00000101,\n    0x00010000, 0x00010001, 0x00010000, 0x00010001, 0x00010100, 0x00010101,\n    0x00010100, 0x00010101, 0x00010000, 0x00010001, 0x00010000, 0x00010001,\n    0x00010100, 0x00010101, 0x00010100, 0x00010101, 0x00000000, 0x00000001,\n    0x00000000, 0x00000001, 0x00000100, 0x00000101, 0x00000100, 0x00000101,\n    0x00000000, 0x00000001, 0x00000000, 0x00000001, 0x00000100, 0x00000101,\n    0x00000100, 0x00000101, 0x00010000, 0x00010001, 0x00010000, 0x00010001,\n    0x00010100, 0x00010101, 0x00010100, 0x00010101, 0x00010000, 0x00010001,\n    0x00010000, 0x00010001, 0x00010100, 0x00010101, 0x00010100, 0x00010101,\n    0x01000000, 0x01000001, 0x01000000, 0x01000001, 0x01000100, 0x01000101,\n    0x01000100, 0x01000101, 0x01000000, 0x01000001, 0x01000000, 0x01000001,\n    0x01000100, 0x01000101, 0x01000100, 0x01000101, 0x01010000, 0x01010001,\n    0x01010000, 0x01010001, 0x01010100, 0x01010101, 0x01010100, 0x01010101,\n    0x01010000, 0x01010001, 0x01010000, 0x01010001, 0x01010100, 0x01010101,\n    0x01010100, 0x01010101, 0x01000000, 0x01000001, 0x01000000, 0x01000001,\n    0x01000100, 0x01000101, 0x01000100, 0x01000101, 0x01000000, 0x01000001,\n    0x01000000, 0x01000001, 0x01000100, 0x01000101, 0x01000100, 0x01000101,\n    0x01010000, 0x01010001, 0x01010000, 0x01010001, 0x01010100, 0x01010101,\n    0x01010100, 0x01010101, 0x01010000, 0x01010001, 0x01010000, 0x01010001,\n    0x01010100, 0x01010101, 0x01010100, 0x01010101,\n  },\n  {\n    0x00000000, 0x00000002, 0x00000000, 0x00000002, 0x00000200, 0x00000202,\n    0x00000200, 0x00000202, 0x00000000, 0x00000002, 0x00000000, 0x00000002,\n    0x00000200, 0x00000202, 0x00000200, 0x00000202, 0x00020000, 0x00020002,\n    0x00020000, 0x00020002, 0x00020200, 0x00020202, 0x00020200, 0x00020202,\n    0x00020000, 0x00020002, 0x00020000, 0x00020002, 0x00020200, 0x00020202,\n    0x00020200, 0x00020202, 0x00000000, 0x00000002, 0x00000000, 0x00000002,\n    0x00000200, 0x00000202, 0x00000200, 0x00000202, 0x00000000, 0x00000002,\n    0x00000000, 0x00000002, 0x00000200, 0x00000202, 0x00000200, 0x00000202,\n    0x00020000, 0x00020002, 0x00020000, 0x00020002, 0x00020200, 0x00020202,\n    0x00020200, 0x00020202, 0x00020000, 0x00020002, 0x00020000, 0x00020002,\n    0x00020200, 0x00020202, 0x00020200, 0x00020202, 0x02000000, 0x02000002,\n    0x02000000, 0x02000002, 0x02000200, 0x02000202, 0x02000200, 0x02000202,\n    0x02000000, 0x02000002, 0x02000000, 0x02000002, 0x02000200, 0x02000202,\n    0x02000200, 0x02000202, 0x02020000, 0x02020002, 0x02020000, 0x02020002,\n    0x02020200, 0x02020202, 0x02020200, 0x02020202, 0x02020000, 0x02020002,\n    0x02020000, 0x02020002, 0x02020200, 0x02020202, 0x02020200, 0x02020202,\n    0x02000000, 0x02000002, 0x02000000, 0x02000002, 0x02000200, 0x02000202,\n    0x02000200, 0x02000202, 0x02000000, 0x02000002, 0x02000000, 0x02000002,\n    0x02000200, 0x02000202, 0x02000200, 0x02000202, 0x02020000, 0x02020002,\n    0x02020000, 0x02020002, 0x02020200, 0x02020202, 0x02020200, 0x02020202,\n    0x02020000, 0x02020002, 0x02020000, 0x02020002, 0x02020200, 0x02020202,\n    0x02020200, 0x02020202, 0x00000000, 0x00000002, 0x00000000, 0x00000002,\n    0x00000200, 0x00000202, 0x00000200, 0x00000202, 0x00000000, 0x00000002,\n    0x00000000, 0x00000002, 0x00000200, 0x00000202, 0x00000200, 0x00000202,\n    0x00020000, 0x00020002, 0x00020000, 0x00020002, 0x00020200, 0x00020202,\n    0x00020200, 0x00020202, 0x00020000, 0x00020002, 0x00020000, 0x00020002,\n    0x00020200, 0x00020202, 0x00020200, 0x00020202, 0x00000000, 0x00000002,\n    0x00000000, 0x00000002, 0x00000200, 0x00000202, 0x00000200, 0x00000202,\n    0x00000000, 0x00000002, 0x00000000, 0x00000002, 0x00000200, 0x00000202,\n    0x00000200, 0x00000202, 0x00020000, 0x00020002, 0x00020000, 0x00020002,\n    0x00020200, 0x00020202, 0x00020200, 0x00020202, 0x00020000, 0x00020002,\n    0x00020000, 0x00020002, 0x00020200, 0x00020202, 0x00020200, 0x00020202,\n    0x02000000, 0x02000002, 0x02000000, 0x02000002, 0x02000200, 0x02000202,\n    0x02000200, 0x02000202, 0x02000000, 0x02000002, 0x02000000, 0x02000002,\n    0x02000200, 0x02000202, 0x02000200, 0x02000202, 0x02020000, 0x02020002,\n    0x02020000, 0x02020002, 0x02020200, 0x02020202, 0x02020200, 0x02020202,\n    0x02020000, 0x02020002, 0x02020000, 0x02020002, 0x02020200, 0x02020202,\n    0x02020200, 0x02020202, 0x02000000, 0x02000002, 0x02000000, 0x02000002,\n    0x02000200, 0x02000202, 0x02000200, 0x02000202, 0x02000000, 0x02000002,\n    0x02000000, 0x02000002, 0x02000200, 0x02000202, 0x02000200, 0x02000202,\n    0x02020000, 0x02020002, 0x02020000, 0x02020002, 0x02020200, 0x02020202,\n    0x02020200, 0x02020202, 0x02020000, 0x02020002, 0x02020000, 0x02020002,\n    0x02020200, 0x02020202, 0x02020200, 0x02020202,\n  },\n  {\n    0x00000000, 0x00000004, 0x00000000, 0x00000004, 0x00000400, 0x00000404,\n    0x00000400, 0x00000404, 0x00000000, 0x00000004, 0x00000000, 0x00000004,\n    0x00000400, 0x00000404, 0x00000400, 0x00000404, 0x00040000, 0x00040004,\n    0x00040000, 0x00040004, 0x00040400, 0x00040404, 0x00040400, 0x00040404,\n    0x00040000, 0x00040004, 0x00040000, 0x00040004, 0x00040400, 0x00040404,\n    0x00040400, 0x00040404, 0x00000000, 0x00000004, 0x00000000, 0x00000004,\n    0x00000400, 0x00000404, 0x00000400, 0x00000404, 0x00000000, 0x00000004,\n    0x00000000, 0x00000004, 0x00000400, 0x00000404, 0x00000400, 0x00000404,\n    0x00040000, 0x00040004, 0x00040000, 0x00040004, 0x00040400, 0x00040404,\n    0x00040400, 0x00040404, 0x00040000, 0x00040004, 0x00040000, 0x00040004,\n    0x00040400, 0x00040404, 0x00040400, 0x00040404, 0x04000000, 0x04000004,\n    0x04000000, 0x04000004, 0x04000400, 0x04000404, 0x04000400, 0x04000404,\n    0x04000000, 0x04000004, 0x04000000, 0x04000004, 0x04000400, 0x04000404,\n    0x04000400, 0x04000404, 0x04040000, 0x04040004, 0x04040000, 0x04040004,\n    0x04040400, 0x04040404, 0x04040400, 0x04040404, 0x04040000, 0x04040004,\n    0x04040000, 0x04040004, 0x04040400, 0x04040404, 0x04040400, 0x04040404,\n    0x04000000, 0x04000004, 0x04000000, 0x04000004, 0x04000400, 0x04000404,\n    0x04000400, 0x04000404, 0x04000000, 0x04000004, 0x04000000, 0x04000004,\n    0x04000400, 0x04000404, 0x04000400, 0x04000404, 0x04040000, 0x04040004,\n    0x04040000, 0x04040004, 0x04040400, 0x04040404, 0x04040400, 0x04040404,\n    0x04040000, 0x04040004, 0x04040000, 0x04040004, 0x04040400, 0x04040404,\n    0x04040400, 0x04040404, 0x00000000, 0x00000004, 0x00000000, 0x00000004,\n    0x00000400, 0x00000404, 0x00000400, 0x00000404, 0x00000000, 0x00000004,\n    0x00000000, 0x00000004, 0x00000400, 0x00000404, 0x00000400, 0x00000404,\n    0x00040000, 0x00040004, 0x00040000, 0x00040004, 0x00040400, 0x00040404,\n    0x00040400, 0x00040404, 0x00040000, 0x00040004, 0x00040000, 0x00040004,\n    0x00040400, 0x00040404, 0x00040400, 0x00040404, 0x00000000, 0x00000004,\n    0x00000000, 0x00000004, 0x00000400, 0x00000404, 0x00000400, 0x00000404,\n    0x00000000, 0x00000004, 0x00000000, 0x00000004, 0x00000400, 0x00000404,\n    0x00000400, 0x00000404, 0x00040000, 0x00040004, 0x00040000, 0x00040004,\n    0x00040400, 0x00040404, 0x00040400, 0x00040404, 0x00040000, 0x00040004,\n    0x00040000, 0x00040004, 0x00040400, 0x00040404, 0x00040400, 0x00040404,\n    0x04000000, 0x04000004, 0x04000000, 0x04000004, 0x04000400, 0x04000404,\n    0x04000400, 0x04000404, 0x04000000, 0x04000004, 0x04000000, 0x04000004,\n    0x04000400, 0x04000404, 0x04000400, 0x04000404, 0x04040000, 0x04040004,\n    0x04040000, 0x04040004, 0x04040400, 0x04040404, 0x04040400, 0x04040404,\n    0x04040000, 0x04040004, 0x04040000, 0x04040004, 0x04040400, 0x04040404,\n    0x04040400, 0x04040404, 0x04000000, 0x04000004, 0x04000000, 0x04000004,\n    0x04000400, 0x04000404, 0x04000400, 0x04000404, 0x04000000, 0x04000004,\n    0x04000000, 0x04000004, 0x04000400, 0x04000404, 0x04000400, 0x04000404,\n    0x04040000, 0x04040004, 0x04040000, 0x04040004, 0x04040400, 0x04040404,\n    0x04040400, 0x04040404, 0x04040000, 0x04040004, 0x04040000, 0x04040004,\n    0x04040400, 0x04040404, 0x04040400, 0x04040404,\n  },\n  {\n    0x00000000, 0x00000008, 0x00000000, 0x00000008, 0x00000800, 0x00000808,\n    0x00000800, 0x00000808, 0x00000000, 0x00000008, 0x00000000, 0x00000008,\n    0x00000800, 0x00000808, 0x00000800, 0x00000808, 0x00080000, 0x00080008,\n    0x00080000, 0x00080008, 0x00080800, 0x00080808, 0x00080800, 0x00080808,\n    0x00080000, 0x00080008, 0x00080000, 0x00080008, 0x00080800, 0x00080808,\n    0x00080800, 0x00080808, 0x00000000, 0x00000008, 0x00000000, 0x00000008,\n    0x00000800, 0x00000808, 0x00000800, 0x00000808, 0x00000000, 0x00000008,\n    0x00000000, 0x00000008, 0x00000800, 0x00000808, 0x00000800, 0x00000808,\n    0x00080000, 0x00080008, 0x00080000, 0x00080008, 0x00080800, 0x00080808,\n    0x00080800, 0x00080808, 0x00080000, 0x00080008, 0x00080000, 0x00080008,\n    0x00080800, 0x00080808, 0x00080800, 0x00080808, 0x08000000, 0x08000008,\n    0x08000000, 0x08000008, 0x08000800, 0x08000808, 0x08000800, 0x08000808,\n    0x08000000, 0x08000008, 0x08000000, 0x08000008, 0x08000800, 0x08000808,\n    0x08000800, 0x08000808, 0x08080000, 0x08080008, 0x08080000, 0x08080008,\n    0x08080800, 0x08080808, 0x08080800, 0x08080808, 0x08080000, 0x08080008,\n    0x08080000, 0x08080008, 0x08080800, 0x08080808, 0x08080800, 0x08080808,\n    0x08000000, 0x08000008, 0x08000000, 0x08000008, 0x08000800, 0x08000808,\n    0x08000800, 0x08000808, 0x08000000, 0x08000008, 0x08000000, 0x08000008,\n    0x08000800, 0x08000808, 0x08000800, 0x08000808, 0x08080000, 0x08080008,\n    0x08080000, 0x08080008, 0x08080800, 0x08080808, 0x08080800, 0x08080808,\n    0x08080000, 0x08080008, 0x08080000, 0x08080008, 0x08080800, 0x08080808,\n    0x08080800, 0x08080808, 0x00000000, 0x00000008, 0x00000000, 0x00000008,\n    0x00000800, 0x00000808, 0x00000800, 0x00000808, 0x00000000, 0x00000008,\n    0x00000000, 0x00000008, 0x00000800, 0x00000808, 0x00000800, 0x00000808,\n    0x00080000, 0x00080008, 0x00080000, 0x00080008, 0x00080800, 0x00080808,\n    0x00080800, 0x00080808, 0x00080000, 0x00080008, 0x00080000, 0x00080008,\n    0x00080800, 0x00080808, 0x00080800, 0x00080808, 0x00000000, 0x00000008,\n    0x00000000, 0x00000008, 0x00000800, 0x00000808, 0x00000800, 0x00000808,\n    0x00000000, 0x00000008, 0x00000000, 0x00000008, 0x00000800, 0x00000808,\n    0x00000800, 0x00000808, 0x00080000, 0x00080008, 0x00080000, 0x00080008,\n    0x00080800, 0x00080808, 0x00080800, 0x00080808, 0x00080000, 0x00080008,\n    0x00080000, 0x00080008, 0x00080800, 0x00080808, 0x00080800, 0x00080808,\n    0x08000000, 0x08000008, 0x08000000, 0x08000008, 0x08000800, 0x08000808,\n    0x08000800, 0x08000808, 0x08000000, 0x08000008, 0x08000000, 0x08000008,\n    0x08000800, 0x08000808, 0x08000800, 0x08000808, 0x08080000, 0x08080008,\n    0x08080000, 0x08080008, 0x08080800, 0x08080808, 0x08080800, 0x08080808,\n    0x08080000, 0x08080008, 0x08080000, 0x08080008, 0x08080800, 0x08080808,\n    0x08080800, 0x08080808, 0x08000000, 0x08000008, 0x08000000, 0x08000008,\n    0x08000800, 0x08000808, 0x08000800, 0x08000808, 0x08000000, 0x08000008,\n    0x08000000, 0x08000008, 0x08000800, 0x08000808, 0x08000800, 0x08000808,\n    0x08080000, 0x08080008, 0x08080000, 0x08080008, 0x08080800, 0x08080808,\n    0x08080800, 0x08080808, 0x08080000, 0x08080008, 0x08080000, 0x08080008,\n    0x08080800, 0x08080808, 0x08080800, 0x08080808,\n  },\n  {\n    0x00000000, 0x00000010, 0x00000000, 0x00000010, 0x00001000, 0x00001010,\n    0x00001000, 0x00001010, 0x00000000, 0x00000010, 0x00000000, 0x00000010,\n    0x00001000, 0x00001010, 0x00001000, 0x00001010, 0x00100000, 0x00100010,\n    0x00100000, 0x00100010, 0x00101000, 0x00101010, 0x00101000, 0x00101010,\n    0x00100000, 0x00100010, 0x00100000, 0x00100010, 0x00101000, 0x00101010,\n    0x00101000, 0x00101010, 0x00000000, 0x00000010, 0x00000000, 0x00000010,\n    0x00001000, 0x00001010, 0x00001000, 0x00001010, 0x00000000, 0x00000010,\n    0x00000000, 0x00000010, 0x00001000, 0x00001010, 0x00001000, 0x00001010,\n    0x00100000, 0x00100010, 0x00100000, 0x00100010, 0x00101000, 0x00101010,\n    0x00101000, 0x00101010, 0x00100000, 0x00100010, 0x00100000, 0x00100010,\n    0x00101000, 0x00101010, 0x00101000, 0x00101010, 0x10000000, 0x10000010,\n    0x10000000, 0x10000010, 0x10001000, 0x10001010, 0x10001000, 0x10001010,\n    0x10000000, 0x10000010, 0x10000000, 0x10000010, 0x10001000, 0x10001010,\n    0x10001000, 0x10001010, 0x10100000, 0x10100010, 0x10100000, 0x10100010,\n    0x10101000, 0x10101010, 0x10101000, 0x10101010, 0x10100000, 0x10100010,\n    0x10100000, 0x10100010, 0x10101000, 0x10101010, 0x10101000, 0x10101010,\n    0x10000000, 0x10000010, 0x10000000, 0x10000010, 0x10001000, 0x10001010,\n    0x10001000, 0x10001010, 0x10000000, 0x10000010, 0x10000000, 0x10000010,\n    0x10001000, 0x10001010, 0x10001000, 0x10001010, 0x10100000, 0x10100010,\n    0x10100000, 0x10100010, 0x10101000, 0x10101010, 0x10101000, 0x10101010,\n    0x10100000, 0x10100010, 0x10100000, 0x10100010, 0x10101000, 0x10101010,\n    0x10101000, 0x10101010, 0x00000000, 0x00000010, 0x00000000, 0x00000010,\n    0x00001000, 0x00001010, 0x00001000, 0x00001010, 0x00000000, 0x00000010,\n    0x00000000, 0x00000010, 0x00001000, 0x00001010, 0x00001000, 0x00001010,\n    0x00100000, 0x00100010, 0x00100000, 0x00100010, 0x00101000, 0x00101010,\n    0x00101000, 0x00101010, 0x00100000, 0x00100010, 0x00100000, 0x00100010,\n    0x00101000, 0x00101010, 0x00101000, 0x00101010, 0x00000000, 0x00000010,\n    0x00000000, 0x00000010, 0x00001000, 0x00001010, 0x00001000, 0x00001010,\n    0x00000000, 0x00000010, 0x00000000, 0x00000010, 0x00001000, 0x00001010,\n    0x00001000, 0x00001010, 0x00100000, 0x00100010, 0x00100000, 0x00100010,\n    0x00101000, 0x00101010, 0x00101000, 0x00101010, 0x00100000, 0x00100010,\n    0x00100000, 0x00100010, 0x00101000, 0x00101010, 0x00101000, 0x00101010,\n    0x10000000, 0x10000010, 0x10000000, 0x10000010, 0x10001000, 0x10001010,\n    0x10001000, 0x10001010, 0x10000000, 0x10000010, 0x10000000, 0x10000010,\n    0x10001000, 0x10001010, 0x10001000, 0x10001010, 0x10100000, 0x10100010,\n    0x10100000, 0x10100010, 0x10101000, 0x10101010, 0x10101000, 0x10101010,\n    0x10100000, 0x10100010, 0x10100000, 0x10100010, 0x10101000, 0x10101010,\n    0x10101000, 0x10101010, 0x10000000, 0x10000010, 0x10000000, 0x10000010,\n    0x10001000, 0x10001010, 0x10001000, 0x10001010, 0x10000000, 0x10000010,\n    0x10000000, 0x10000010, 0x10001000, 0x10001010, 0x10001000, 0x10001010,\n    0x10100000, 0x10100010, 0x10100000, 0x10100010, 0x10101000, 0x10101010,\n    0x10101000, 0x10101010, 0x10100000, 0x10100010, 0x10100000, 0x10100010,\n    0x10101000, 0x10101010, 0x10101000, 0x10101010,\n  },\n  {\n    0x00000000, 0x00000020, 0x00000000, 0x00000020, 0x00002000, 0x00002020,\n    0x00002000, 0x00002020, 0x00000000, 0x00000020, 0x00000000, 0x00000020,\n    0x00002000, 0x00002020, 0x00002000, 0x00002020, 0x00200000, 0x00200020,\n    0x00200000, 0x00200020, 0x00202000, 0x00202020, 0x00202000, 0x00202020,\n    0x00200000, 0x00200020, 0x00200000, 0x00200020, 0x00202000, 0x00202020,\n    0x00202000, 0x00202020, 0x00000000, 0x00000020, 0x00000000, 0x00000020,\n    0x00002000, 0x00002020, 0x00002000, 0x00002020, 0x00000000, 0x00000020,\n    0x00000000, 0x00000020, 0x00002000, 0x00002020, 0x00002000, 0x00002020,\n    0x00200000, 0x00200020, 0x00200000, 0x00200020, 0x00202000, 0x00202020,\n    0x00202000, 0x00202020, 0x00200000, 0x00200020, 0x00200000, 0x00200020,\n    0x00202000, 0x00202020, 0x00202000, 0x00202020, 0x20000000, 0x20000020,\n    0x20000000, 0x20000020, 0x20002000, 0x20002020, 0x20002000, 0x20002020,\n    0x20000000, 0x20000020, 0x20000000, 0x20000020, 0x20002000, 0x20002020,\n    0x20002000, 0x20002020, 0x20200000, 0x20200020, 0x20200000, 0x20200020,\n    0x20202000, 0x20202020, 0x20202000, 0x20202020, 0x20200000, 0x20200020,\n    0x20200000, 0x20200020, 0x20202000, 0x20202020, 0x20202000, 0x20202020,\n    0x20000000, 0x20000020, 0x20000000, 0x20000020, 0x20002000, 0x20002020,\n    0x20002000, 0x20002020, 0x20000000, 0x20000020, 0x20000000, 0x20000020,\n    0x20002000, 0x20002020, 0x20002000, 0x20002020, 0x20200000, 0x20200020,\n    0x20200000, 0x20200020, 0x20202000, 0x20202020, 0x20202000, 0x20202020,\n    0x20200000, 0x20200020, 0x20200000, 0x20200020, 0x20202000, 0x20202020,\n    0x20202000, 0x20202020, 0x00000000, 0x00000020, 0x00000000, 0x00000020,\n    0x00002000, 0x00002020, 0x00002000, 0x00002020, 0x00000000, 0x00000020,\n    0x00000000, 0x00000020, 0x00002000, 0x00002020, 0x00002000, 0x00002020,\n    0x00200000, 0x00200020, 0x00200000, 0x00200020, 0x00202000, 0x00202020,\n    0x00202000, 0x00202020, 0x00200000, 0x00200020, 0x00200000, 0x00200020,\n    0x00202000, 0x00202020, 0x00202000, 0x00202020, 0x00000000, 0x00000020,\n    0x00000000, 0x00000020, 0x00002000, 0x00002020, 0x00002000, 0x00002020,\n    0x00000000, 0x00000020, 0x00000000, 0x00000020, 0x00002000, 0x00002020,\n    0x00002000, 0x00002020, 0x00200000, 0x00200020, 0x00200000, 0x00200020,\n    0x00202000, 0x00202020, 0x00202000, 0x00202020, 0x00200000, 0x00200020,\n    0x00200000, 0x00200020, 0x00202000, 0x00202020, 0x00202000, 0x00202020,\n    0x20000000, 0x20000020, 0x20000000, 0x20000020, 0x20002000, 0x20002020,\n    0x20002000, 0x20002020, 0x20000000, 0x20000020, 0x20000000, 0x20000020,\n    0x20002000, 0x20002020, 0x20002000, 0x20002020, 0x20200000, 0x20200020,\n    0x20200000, 0x20200020, 0x20202000, 0x20202020, 0x20202000, 0x20202020,\n    0x20200000, 0x20200020, 0x20200000, 0x20200020, 0x20202000, 0x20202020,\n    0x20202000, 0x20202020, 0x20000000, 0x20000020, 0x20000000, 0x20000020,\n    0x20002000, 0x20002020, 0x20002000, 0x20002020, 0x20000000, 0x20000020,\n    0x20000000, 0x20000020, 0x20002000, 0x20002020, 0x20002000, 0x20002020,\n    0x20200000, 0x20200020, 0x20200000, 0x20200020, 0x20202000, 0x20202020,\n    0x20202000, 0x20202020, 0x20200000, 0x20200020, 0x20200000, 0x20200020,\n    0x20202000, 0x20202020, 0x20202000, 0x20202020,\n  },\n  {\n    0x00000000, 0x00000040, 0x00000000, 0x00000040, 0x00004000, 0x00004040,\n    0x00004000, 0x00004040, 0x00000000, 0x00000040, 0x00000000, 0x00000040,\n    0x00004000, 0x00004040, 0x00004000, 0x00004040, 0x00400000, 0x00400040,\n    0x00400000, 0x00400040, 0x00404000, 0x00404040, 0x00404000, 0x00404040,\n    0x00400000, 0x00400040, 0x00400000, 0x00400040, 0x00404000, 0x00404040,\n    0x00404000, 0x00404040, 0x00000000, 0x00000040, 0x00000000, 0x00000040,\n    0x00004000, 0x00004040, 0x00004000, 0x00004040, 0x00000000, 0x00000040,\n    0x00000000, 0x00000040, 0x00004000, 0x00004040, 0x00004000, 0x00004040,\n    0x00400000, 0x00400040, 0x00400000, 0x00400040, 0x00404000, 0x00404040,\n    0x00404000, 0x00404040, 0x00400000, 0x00400040, 0x00400000, 0x00400040,\n    0x00404000, 0x00404040, 0x00404000, 0x00404040, 0x40000000, 0x40000040,\n    0x40000000, 0x40000040, 0x40004000, 0x40004040, 0x40004000, 0x40004040,\n    0x40000000, 0x40000040, 0x40000000, 0x40000040, 0x40004000, 0x40004040,\n    0x40004000, 0x40004040, 0x40400000, 0x40400040, 0x40400000, 0x40400040,\n    0x40404000, 0x40404040, 0x40404000, 0x40404040, 0x40400000, 0x40400040,\n    0x40400000, 0x40400040, 0x40404000, 0x40404040, 0x40404000, 0x40404040,\n    0x40000000, 0x40000040, 0x40000000, 0x40000040, 0x40004000, 0x40004040,\n    0x40004000, 0x40004040, 0x40000000, 0x40000040, 0x40000000, 0x40000040,\n    0x40004000, 0x40004040, 0x40004000, 0x40004040, 0x40400000, 0x40400040,\n    0x40400000, 0x40400040, 0x40404000, 0x40404040, 0x40404000, 0x40404040,\n    0x40400000, 0x40400040, 0x40400000, 0x40400040, 0x40404000, 0x40404040,\n    0x40404000, 0x40404040, 0x00000000, 0x00000040, 0x00000000, 0x00000040,\n    0x00004000, 0x00004040, 0x00004000, 0x00004040, 0x00000000, 0x00000040,\n    0x00000000, 0x00000040, 0x00004000, 0x00004040, 0x00004000, 0x00004040,\n    0x00400000, 0x00400040, 0x00400000, 0x00400040, 0x00404000, 0x00404040,\n    0x00404000, 0x00404040, 0x00400000, 0x00400040, 0x00400000, 0x00400040,\n    0x00404000, 0x00404040, 0x00404000, 0x00404040, 0x00000000, 0x00000040,\n    0x00000000, 0x00000040, 0x00004000, 0x00004040, 0x00004000, 0x00004040,\n    0x00000000, 0x00000040, 0x00000000, 0x00000040, 0x00004000, 0x00004040,\n    0x00004000, 0x00004040, 0x00400000, 0x00400040, 0x00400000, 0x00400040,\n    0x00404000, 0x00404040, 0x00404000, 0x00404040, 0x00400000, 0x00400040,\n    0x00400000, 0x00400040, 0x00404000, 0x00404040, 0x00404000, 0x00404040,\n    0x40000000, 0x40000040, 0x40000000, 0x40000040, 0x40004000, 0x40004040,\n    0x40004000, 0x40004040, 0x40000000, 0x40000040, 0x40000000, 0x40000040,\n    0x40004000, 0x40004040, 0x40004000, 0x40004040, 0x40400000, 0x40400040,\n    0x40400000, 0x40400040, 0x40404000, 0x40404040, 0x40404000, 0x40404040,\n    0x40400000, 0x40400040, 0x40400000, 0x40400040, 0x40404000, 0x40404040,\n    0x40404000, 0x40404040, 0x40000000, 0x40000040, 0x40000000, 0x40000040,\n    0x40004000, 0x40004040, 0x40004000, 0x40004040, 0x40000000, 0x40000040,\n    0x40000000, 0x40000040, 0x40004000, 0x40004040, 0x40004000, 0x40004040,\n    0x40400000, 0x40400040, 0x40400000, 0x40400040, 0x40404000, 0x40404040,\n    0x40404000, 0x40404040, 0x40400000, 0x40400040, 0x40400000, 0x40400040,\n    0x40404000, 0x40404040, 0x40404000, 0x40404040,\n  },\n  {\n    0x00000000, 0x00000080, 0x00000000, 0x00000080, 0x00008000, 0x00008080,\n    0x00008000, 0x00008080, 0x00000000, 0x00000080, 0x00000000, 0x00000080,\n    0x00008000, 0x00008080, 0x00008000, 0x00008080, 0x00800000, 0x00800080,\n    0x00800000, 0x00800080, 0x00808000, 0x00808080, 0x00808000, 0x00808080,\n    0x00800000, 0x00800080, 0x00800000, 0x00800080, 0x00808000, 0x00808080,\n    0x00808000, 0x00808080, 0x00000000, 0x00000080, 0x00000000, 0x00000080,\n    0x00008000, 0x00008080, 0x00008000, 0x00008080, 0x00000000, 0x00000080,\n    0x00000000, 0x00000080, 0x00008000, 0x00008080, 0x00008000, 0x00008080,\n    0x00800000, 0x00800080, 0x00800000, 0x00800080, 0x00808000, 0x00808080,\n    0x00808000, 0x00808080, 0x00800000, 0x00800080, 0x00800000, 0x00800080,\n    0x00808000, 0x00808080, 0x00808000, 0x00808080, 0x80000000, 0x80000080,\n    0x80000000, 0x80000080, 0x80008000, 0x80008080, 0x80008000, 0x80008080,\n    0x80000000, 0x80000080, 0x80000000, 0x80000080, 0x80008000, 0x80008080,\n    0x80008000, 0x80008080, 0x80800000, 0x80800080, 0x80800000, 0x80800080,\n    0x80808000, 0x80808080, 0x80808000, 0x80808080, 0x80800000, 0x80800080,\n    0x80800000, 0x80800080, 0x80808000, 0x80808080, 0x80808000, 0x80808080,\n    0x80000000, 0x80000080, 0x80000000, 0x80000080, 0x80008000, 0x80008080,\n    0x80008000, 0x80008080, 0x80000000, 0x80000080, 0x80000000, 0x80000080,\n    0x80008000, 0x80008080, 0x80008000, 0x80008080, 0x80800000, 0x80800080,\n    0x80800000, 0x80800080, 0x80808000, 0x80808080, 0x80808000, 0x80808080,\n    0x80800000, 0x80800080, 0x80800000, 0x80800080, 0x80808000, 0x80808080,\n    0x80808000, 0x80808080, 0x00000000, 0x00000080, 0x00000000, 0x00000080,\n    0x00008000, 0x00008080, 0x00008000, 0x00008080, 0x00000000, 0x00000080,\n    0x00000000, 0x00000080, 0x00008000, 0x00008080, 0x00008000, 0x00008080,\n    0x00800000, 0x00800080, 0x00800000, 0x00800080, 0x00808000, 0x00808080,\n    0x00808000, 0x00808080, 0x00800000, 0x00800080, 0x00800000, 0x00800080,\n    0x00808000, 0x00808080, 0x00808000, 0x00808080, 0x00000000, 0x00000080,\n    0x00000000, 0x00000080, 0x00008000, 0x00008080, 0x00008000, 0x00008080,\n    0x00000000, 0x00000080, 0x00000000, 0x00000080, 0x00008000, 0x00008080,\n    0x00008000, 0x00008080, 0x00800000, 0x00800080, 0x00800000, 0x00800080,\n    0x00808000, 0x00808080, 0x00808000, 0x00808080, 0x00800000, 0x00800080,\n    0x00800000, 0x00800080, 0x00808000, 0x00808080, 0x00808000, 0x00808080,\n    0x80000000, 0x80000080, 0x80000000, 0x80000080, 0x80008000, 0x80008080,\n    0x80008000, 0x80008080, 0x80000000, 0x80000080, 0x80000000, 0x80000080,\n    0x80008000, 0x80008080, 0x80008000, 0x80008080, 0x80800000, 0x80800080,\n    0x80800000, 0x80800080, 0x80808000, 0x80808080, 0x80808000, 0x80808080,\n    0x80800000, 0x80800080, 0x80800000, 0x80800080, 0x80808000, 0x80808080,\n    0x80808000, 0x80808080, 0x80000000, 0x80000080, 0x80000000, 0x80000080,\n    0x80008000, 0x80008080, 0x80008000, 0x80008080, 0x80000000, 0x80000080,\n    0x80000000, 0x80000080, 0x80008000, 0x80008080, 0x80008000, 0x80008080,\n    0x80800000, 0x80800080, 0x80800000, 0x80800080, 0x80808000, 0x80808080,\n    0x80808000, 0x80808080, 0x80800000, 0x80800080, 0x80800000, 0x80800080,\n    0x80808000, 0x80808080, 0x80808000, 0x80808080,\n  },\n};\n\nconst uint32_t ip_maskr[8][256] =\n{\n  {\n    0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000000, 0x00000000,\n    0x00000001, 0x00000001, 0x00000100, 0x00000100, 0x00000101, 0x00000101,\n    0x00000100, 0x00000100, 0x00000101, 0x00000101, 0x00000000, 0x00000000,\n    0x00000001, 0x00000001, 0x00000000, 0x00000000, 0x00000001, 0x00000001,\n    0x00000100, 0x00000100, 0x00000101, 0x00000101, 0x00000100, 0x00000100,\n    0x00000101, 0x00000101, 0x00010000, 0x00010000, 0x00010001, 0x00010001,\n    0x00010000, 0x00010000, 0x00010001, 0x00010001, 0x00010100, 0x00010100,\n    0x00010101, 0x00010101, 0x00010100, 0x00010100, 0x00010101, 0x00010101,\n    0x00010000, 0x00010000, 0x00010001, 0x00010001, 0x00010000, 0x00010000,\n    0x00010001, 0x00010001, 0x00010100, 0x00010100, 0x00010101, 0x00010101,\n    0x00010100, 0x00010100, 0x00010101, 0x00010101, 0x00000000, 0x00000000,\n    0x00000001, 0x00000001, 0x00000000, 0x00000000, 0x00000001, 0x00000001,\n    0x00000100, 0x00000100, 0x00000101, 0x00000101, 0x00000100, 0x00000100,\n    0x00000101, 0x00000101, 0x00000000, 0x00000000, 0x00000001, 0x00000001,\n    0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000100, 0x00000100,\n    0x00000101, 0x00000101, 0x00000100, 0x00000100, 0x00000101, 0x00000101,\n    0x00010000, 0x00010000, 0x00010001, 0x00010001, 0x00010000, 0x00010000,\n    0x00010001, 0x00010001, 0x00010100, 0x00010100, 0x00010101, 0x00010101,\n    0x00010100, 0x00010100, 0x00010101, 0x00010101, 0x00010000, 0x00010000,\n    0x00010001, 0x00010001, 0x00010000, 0x00010000, 0x00010001, 0x00010001,\n    0x00010100, 0x00010100, 0x00010101, 0x00010101, 0x00010100, 0x00010100,\n    0x00010101, 0x00010101, 0x01000000, 0x01000000, 0x01000001, 0x01000001,\n    0x01000000, 0x01000000, 0x01000001, 0x01000001, 0x01000100, 0x01000100,\n    0x01000101, 0x01000101, 0x01000100, 0x01000100, 0x01000101, 0x01000101,\n    0x01000000, 0x01000000, 0x01000001, 0x01000001, 0x01000000, 0x01000000,\n    0x01000001, 0x01000001, 0x01000100, 0x01000100, 0x01000101, 0x01000101,\n    0x01000100, 0x01000100, 0x01000101, 0x01000101, 0x01010000, 0x01010000,\n    0x01010001, 0x01010001, 0x01010000, 0x01010000, 0x01010001, 0x01010001,\n    0x01010100, 0x01010100, 0x01010101, 0x01010101, 0x01010100, 0x01010100,\n    0x01010101, 0x01010101, 0x01010000, 0x01010000, 0x01010001, 0x01010001,\n    0x01010000, 0x01010000, 0x01010001, 0x01010001, 0x01010100, 0x01010100,\n    0x01010101, 0x01010101, 0x01010100, 0x01010100, 0x01010101, 0x01010101,\n    0x01000000, 0x01000000, 0x01000001, 0x01000001, 0x01000000, 0x01000000,\n    0x01000001, 0x01000001, 0x01000100, 0x01000100, 0x01000101, 0x01000101,\n    0x01000100, 0x01000100, 0x01000101, 0x01000101, 0x01000000, 0x01000000,\n    0x01000001, 0x01000001, 0x01000000, 0x01000000, 0x01000001, 0x01000001,\n    0x01000100, 0x01000100, 0x01000101, 0x01000101, 0x01000100, 0x01000100,\n    0x01000101, 0x01000101, 0x01010000, 0x01010000, 0x01010001, 0x01010001,\n    0x01010000, 0x01010000, 0x01010001, 0x01010001, 0x01010100, 0x01010100,\n    0x01010101, 0x01010101, 0x01010100, 0x01010100, 0x01010101, 0x01010101,\n    0x01010000, 0x01010000, 0x01010001, 0x01010001, 0x01010000, 0x01010000,\n    0x01010001, 0x01010001, 0x01010100, 0x01010100, 0x01010101, 0x01010101,\n    0x01010100, 0x01010100, 0x01010101, 0x01010101,\n  },\n  {\n    0x00000000, 0x00000000, 0x00000002, 0x00000002, 0x00000000, 0x00000000,\n    0x00000002, 0x00000002, 0x00000200, 0x00000200, 0x00000202, 0x00000202,\n    0x00000200, 0x00000200, 0x00000202, 0x00000202, 0x00000000, 0x00000000,\n    0x00000002, 0x00000002, 0x00000000, 0x00000000, 0x00000002, 0x00000002,\n    0x00000200, 0x00000200, 0x00000202, 0x00000202, 0x00000200, 0x00000200,\n    0x00000202, 0x00000202, 0x00020000, 0x00020000, 0x00020002, 0x00020002,\n    0x00020000, 0x00020000, 0x00020002, 0x00020002, 0x00020200, 0x00020200,\n    0x00020202, 0x00020202, 0x00020200, 0x00020200, 0x00020202, 0x00020202,\n    0x00020000, 0x00020000, 0x00020002, 0x00020002, 0x00020000, 0x00020000,\n    0x00020002, 0x00020002, 0x00020200, 0x00020200, 0x00020202, 0x00020202,\n    0x00020200, 0x00020200, 0x00020202, 0x00020202, 0x00000000, 0x00000000,\n    0x00000002, 0x00000002, 0x00000000, 0x00000000, 0x00000002, 0x00000002,\n    0x00000200, 0x00000200, 0x00000202, 0x00000202, 0x00000200, 0x00000200,\n    0x00000202, 0x00000202, 0x00000000, 0x00000000, 0x00000002, 0x00000002,\n    0x00000000, 0x00000000, 0x00000002, 0x00000002, 0x00000200, 0x00000200,\n    0x00000202, 0x00000202, 0x00000200, 0x00000200, 0x00000202, 0x00000202,\n    0x00020000, 0x00020000, 0x00020002, 0x00020002, 0x00020000, 0x00020000,\n    0x00020002, 0x00020002, 0x00020200, 0x00020200, 0x00020202, 0x00020202,\n    0x00020200, 0x00020200, 0x00020202, 0x00020202, 0x00020000, 0x00020000,\n    0x00020002, 0x00020002, 0x00020000, 0x00020000, 0x00020002, 0x00020002,\n    0x00020200, 0x00020200, 0x00020202, 0x00020202, 0x00020200, 0x00020200,\n    0x00020202, 0x00020202, 0x02000000, 0x02000000, 0x02000002, 0x02000002,\n    0x02000000, 0x02000000, 0x02000002, 0x02000002, 0x02000200, 0x02000200,\n    0x02000202, 0x02000202, 0x02000200, 0x02000200, 0x02000202, 0x02000202,\n    0x02000000, 0x02000000, 0x02000002, 0x02000002, 0x02000000, 0x02000000,\n    0x02000002, 0x02000002, 0x02000200, 0x02000200, 0x02000202, 0x02000202,\n    0x02000200, 0x02000200, 0x02000202, 0x02000202, 0x02020000, 0x02020000,\n    0x02020002, 0x02020002, 0x02020000, 0x02020000, 0x02020002, 0x02020002,\n    0x02020200, 0x02020200, 0x02020202, 0x02020202, 0x02020200, 0x02020200,\n    0x02020202, 0x02020202, 0x02020000, 0x02020000, 0x02020002, 0x02020002,\n    0x02020000, 0x02020000, 0x02020002, 0x02020002, 0x02020200, 0x02020200,\n    0x02020202, 0x02020202, 0x02020200, 0x02020200, 0x02020202, 0x02020202,\n    0x02000000, 0x02000000, 0x02000002, 0x02000002, 0x02000000, 0x02000000,\n    0x02000002, 0x02000002, 0x02000200, 0x02000200, 0x02000202, 0x02000202,\n    0x02000200, 0x02000200, 0x02000202, 0x02000202, 0x02000000, 0x02000000,\n    0x02000002, 0x02000002, 0x02000000, 0x02000000, 0x02000002, 0x02000002,\n    0x02000200, 0x02000200, 0x02000202, 0x02000202, 0x02000200, 0x02000200,\n    0x02000202, 0x02000202, 0x02020000, 0x02020000, 0x02020002, 0x02020002,\n    0x02020000, 0x02020000, 0x02020002, 0x02020002, 0x02020200, 0x02020200,\n    0x02020202, 0x02020202, 0x02020200, 0x02020200, 0x02020202, 0x02020202,\n    0x02020000, 0x02020000, 0x02020002, 0x02020002, 0x02020000, 0x02020000,\n    0x02020002, 0x02020002, 0x02020200, 0x02020200, 0x02020202, 0x02020202,\n    0x02020200, 0x02020200, 0x02020202, 0x02020202,\n  },\n  {\n    0x00000000, 0x00000000, 0x00000004, 0x00000004, 0x00000000, 0x00000000,\n    0x00000004, 0x00000004, 0x00000400, 0x00000400, 0x00000404, 0x00000404,\n    0x00000400, 0x00000400, 0x00000404, 0x00000404, 0x00000000, 0x00000000,\n    0x00000004, 0x00000004, 0x00000000, 0x00000000, 0x00000004, 0x00000004,\n    0x00000400, 0x00000400, 0x00000404, 0x00000404, 0x00000400, 0x00000400,\n    0x00000404, 0x00000404, 0x00040000, 0x00040000, 0x00040004, 0x00040004,\n    0x00040000, 0x00040000, 0x00040004, 0x00040004, 0x00040400, 0x00040400,\n    0x00040404, 0x00040404, 0x00040400, 0x00040400, 0x00040404, 0x00040404,\n    0x00040000, 0x00040000, 0x00040004, 0x00040004, 0x00040000, 0x00040000,\n    0x00040004, 0x00040004, 0x00040400, 0x00040400, 0x00040404, 0x00040404,\n    0x00040400, 0x00040400, 0x00040404, 0x00040404, 0x00000000, 0x00000000,\n    0x00000004, 0x00000004, 0x00000000, 0x00000000, 0x00000004, 0x00000004,\n    0x00000400, 0x00000400, 0x00000404, 0x00000404, 0x00000400, 0x00000400,\n    0x00000404, 0x00000404, 0x00000000, 0x00000000, 0x00000004, 0x00000004,\n    0x00000000, 0x00000000, 0x00000004, 0x00000004, 0x00000400, 0x00000400,\n    0x00000404, 0x00000404, 0x00000400, 0x00000400, 0x00000404, 0x00000404,\n    0x00040000, 0x00040000, 0x00040004, 0x00040004, 0x00040000, 0x00040000,\n    0x00040004, 0x00040004, 0x00040400, 0x00040400, 0x00040404, 0x00040404,\n    0x00040400, 0x00040400, 0x00040404, 0x00040404, 0x00040000, 0x00040000,\n    0x00040004, 0x00040004, 0x00040000, 0x00040000, 0x00040004, 0x00040004,\n    0x00040400, 0x00040400, 0x00040404, 0x00040404, 0x00040400, 0x00040400,\n    0x00040404, 0x00040404, 0x04000000, 0x04000000, 0x04000004, 0x04000004,\n    0x04000000, 0x04000000, 0x04000004, 0x04000004, 0x04000400, 0x04000400,\n    0x04000404, 0x04000404, 0x04000400, 0x04000400, 0x04000404, 0x04000404,\n    0x04000000, 0x04000000, 0x04000004, 0x04000004, 0x04000000, 0x04000000,\n    0x04000004, 0x04000004, 0x04000400, 0x04000400, 0x04000404, 0x04000404,\n    0x04000400, 0x04000400, 0x04000404, 0x04000404, 0x04040000, 0x04040000,\n    0x04040004, 0x04040004, 0x04040000, 0x04040000, 0x04040004, 0x04040004,\n    0x04040400, 0x04040400, 0x04040404, 0x04040404, 0x04040400, 0x04040400,\n    0x04040404, 0x04040404, 0x04040000, 0x04040000, 0x04040004, 0x04040004,\n    0x04040000, 0x04040000, 0x04040004, 0x04040004, 0x04040400, 0x04040400,\n    0x04040404, 0x04040404, 0x04040400, 0x04040400, 0x04040404, 0x04040404,\n    0x04000000, 0x04000000, 0x04000004, 0x04000004, 0x04000000, 0x04000000,\n    0x04000004, 0x04000004, 0x04000400, 0x04000400, 0x04000404, 0x04000404,\n    0x04000400, 0x04000400, 0x04000404, 0x04000404, 0x04000000, 0x04000000,\n    0x04000004, 0x04000004, 0x04000000, 0x04000000, 0x04000004, 0x04000004,\n    0x04000400, 0x04000400, 0x04000404, 0x04000404, 0x04000400, 0x04000400,\n    0x04000404, 0x04000404, 0x04040000, 0x04040000, 0x04040004, 0x04040004,\n    0x04040000, 0x04040000, 0x04040004, 0x04040004, 0x04040400, 0x04040400,\n    0x04040404, 0x04040404, 0x04040400, 0x04040400, 0x04040404, 0x04040404,\n    0x04040000, 0x04040000, 0x04040004, 0x04040004, 0x04040000, 0x04040000,\n    0x04040004, 0x04040004, 0x04040400, 0x04040400, 0x04040404, 0x04040404,\n    0x04040400, 0x04040400, 0x04040404, 0x04040404,\n  },\n  {\n    0x00000000, 0x00000000, 0x00000008, 0x00000008, 0x00000000, 0x00000000,\n    0x00000008, 0x00000008, 0x00000800, 0x00000800, 0x00000808, 0x00000808,\n    0x00000800, 0x00000800, 0x00000808, 0x00000808, 0x00000000, 0x00000000,\n    0x00000008, 0x00000008, 0x00000000, 0x00000000, 0x00000008, 0x00000008,\n    0x00000800, 0x00000800, 0x00000808, 0x00000808, 0x00000800, 0x00000800,\n    0x00000808, 0x00000808, 0x00080000, 0x00080000, 0x00080008, 0x00080008,\n    0x00080000, 0x00080000, 0x00080008, 0x00080008, 0x00080800, 0x00080800,\n    0x00080808, 0x00080808, 0x00080800, 0x00080800, 0x00080808, 0x00080808,\n    0x00080000, 0x00080000, 0x00080008, 0x00080008, 0x00080000, 0x00080000,\n    0x00080008, 0x00080008, 0x00080800, 0x00080800, 0x00080808, 0x00080808,\n    0x00080800, 0x00080800, 0x00080808, 0x00080808, 0x00000000, 0x00000000,\n    0x00000008, 0x00000008, 0x00000000, 0x00000000, 0x00000008, 0x00000008,\n    0x00000800, 0x00000800, 0x00000808, 0x00000808, 0x00000800, 0x00000800,\n    0x00000808, 0x00000808, 0x00000000, 0x00000000, 0x00000008, 0x00000008,\n    0x00000000, 0x00000000, 0x00000008, 0x00000008, 0x00000800, 0x00000800,\n    0x00000808, 0x00000808, 0x00000800, 0x00000800, 0x00000808, 0x00000808,\n    0x00080000, 0x00080000, 0x00080008, 0x00080008, 0x00080000, 0x00080000,\n    0x00080008, 0x00080008, 0x00080800, 0x00080800, 0x00080808, 0x00080808,\n    0x00080800, 0x00080800, 0x00080808, 0x00080808, 0x00080000, 0x00080000,\n    0x00080008, 0x00080008, 0x00080000, 0x00080000, 0x00080008, 0x00080008,\n    0x00080800, 0x00080800, 0x00080808, 0x00080808, 0x00080800, 0x00080800,\n    0x00080808, 0x00080808, 0x08000000, 0x08000000, 0x08000008, 0x08000008,\n    0x08000000, 0x08000000, 0x08000008, 0x08000008, 0x08000800, 0x08000800,\n    0x08000808, 0x08000808, 0x08000800, 0x08000800, 0x08000808, 0x08000808,\n    0x08000000, 0x08000000, 0x08000008, 0x08000008, 0x08000000, 0x08000000,\n    0x08000008, 0x08000008, 0x08000800, 0x08000800, 0x08000808, 0x08000808,\n    0x08000800, 0x08000800, 0x08000808, 0x08000808, 0x08080000, 0x08080000,\n    0x08080008, 0x08080008, 0x08080000, 0x08080000, 0x08080008, 0x08080008,\n    0x08080800, 0x08080800, 0x08080808, 0x08080808, 0x08080800, 0x08080800,\n    0x08080808, 0x08080808, 0x08080000, 0x08080000, 0x08080008, 0x08080008,\n    0x08080000, 0x08080000, 0x08080008, 0x08080008, 0x08080800, 0x08080800,\n    0x08080808, 0x08080808, 0x08080800, 0x08080800, 0x08080808, 0x08080808,\n    0x08000000, 0x08000000, 0x08000008, 0x08000008, 0x08000000, 0x08000000,\n    0x08000008, 0x08000008, 0x08000800, 0x08000800, 0x08000808, 0x08000808,\n    0x08000800, 0x08000800, 0x08000808, 0x08000808, 0x08000000, 0x08000000,\n    0x08000008, 0x08000008, 0x08000000, 0x08000000, 0x08000008, 0x08000008,\n    0x08000800, 0x08000800, 0x08000808, 0x08000808, 0x08000800, 0x08000800,\n    0x08000808, 0x08000808, 0x08080000, 0x08080000, 0x08080008, 0x08080008,\n    0x08080000, 0x08080000, 0x08080008, 0x08080008, 0x08080800, 0x08080800,\n    0x08080808, 0x08080808, 0x08080800, 0x08080800, 0x08080808, 0x08080808,\n    0x08080000, 0x08080000, 0x08080008, 0x08080008, 0x08080000, 0x08080000,\n    0x08080008, 0x08080008, 0x08080800, 0x08080800, 0x08080808, 0x08080808,\n    0x08080800, 0x08080800, 0x08080808, 0x08080808,\n  },\n  {\n    0x00000000, 0x00000000, 0x00000010, 0x00000010, 0x00000000, 0x00000000,\n    0x00000010, 0x00000010, 0x00001000, 0x00001000, 0x00001010, 0x00001010,\n    0x00001000, 0x00001000, 0x00001010, 0x00001010, 0x00000000, 0x00000000,\n    0x00000010, 0x00000010, 0x00000000, 0x00000000, 0x00000010, 0x00000010,\n    0x00001000, 0x00001000, 0x00001010, 0x00001010, 0x00001000, 0x00001000,\n    0x00001010, 0x00001010, 0x00100000, 0x00100000, 0x00100010, 0x00100010,\n    0x00100000, 0x00100000, 0x00100010, 0x00100010, 0x00101000, 0x00101000,\n    0x00101010, 0x00101010, 0x00101000, 0x00101000, 0x00101010, 0x00101010,\n    0x00100000, 0x00100000, 0x00100010, 0x00100010, 0x00100000, 0x00100000,\n    0x00100010, 0x00100010, 0x00101000, 0x00101000, 0x00101010, 0x00101010,\n    0x00101000, 0x00101000, 0x00101010, 0x00101010, 0x00000000, 0x00000000,\n    0x00000010, 0x00000010, 0x00000000, 0x00000000, 0x00000010, 0x00000010,\n    0x00001000, 0x00001000, 0x00001010, 0x00001010, 0x00001000, 0x00001000,\n    0x00001010, 0x00001010, 0x00000000, 0x00000000, 0x00000010, 0x00000010,\n    0x00000000, 0x00000000, 0x00000010, 0x00000010, 0x00001000, 0x00001000,\n    0x00001010, 0x00001010, 0x00001000, 0x00001000, 0x00001010, 0x00001010,\n    0x00100000, 0x00100000, 0x00100010, 0x00100010, 0x00100000, 0x00100000,\n    0x00100010, 0x00100010, 0x00101000, 0x00101000, 0x00101010, 0x00101010,\n    0x00101000, 0x00101000, 0x00101010, 0x00101010, 0x00100000, 0x00100000,\n    0x00100010, 0x00100010, 0x00100000, 0x00100000, 0x00100010, 0x00100010,\n    0x00101000, 0x00101000, 0x00101010, 0x00101010, 0x00101000, 0x00101000,\n    0x00101010, 0x00101010, 0x10000000, 0x10000000, 0x10000010, 0x10000010,\n    0x10000000, 0x10000000, 0x10000010, 0x10000010, 0x10001000, 0x10001000,\n    0x10001010, 0x10001010, 0x10001000, 0x10001000, 0x10001010, 0x10001010,\n    0x10000000, 0x10000000, 0x10000010, 0x10000010, 0x10000000, 0x10000000,\n    0x10000010, 0x10000010, 0x10001000, 0x10001000, 0x10001010, 0x10001010,\n    0x10001000, 0x10001000, 0x10001010, 0x10001010, 0x10100000, 0x10100000,\n    0x10100010, 0x10100010, 0x10100000, 0x10100000, 0x10100010, 0x10100010,\n    0x10101000, 0x10101000, 0x10101010, 0x10101010, 0x10101000, 0x10101000,\n    0x10101010, 0x10101010, 0x10100000, 0x10100000, 0x10100010, 0x10100010,\n    0x10100000, 0x10100000, 0x10100010, 0x10100010, 0x10101000, 0x10101000,\n    0x10101010, 0x10101010, 0x10101000, 0x10101000, 0x10101010, 0x10101010,\n    0x10000000, 0x10000000, 0x10000010, 0x10000010, 0x10000000, 0x10000000,\n    0x10000010, 0x10000010, 0x10001000, 0x10001000, 0x10001010, 0x10001010,\n    0x10001000, 0x10001000, 0x10001010, 0x10001010, 0x10000000, 0x10000000,\n    0x10000010, 0x10000010, 0x10000000, 0x10000000, 0x10000010, 0x10000010,\n    0x10001000, 0x10001000, 0x10001010, 0x10001010, 0x10001000, 0x10001000,\n    0x10001010, 0x10001010, 0x10100000, 0x10100000, 0x10100010, 0x10100010,\n    0x10100000, 0x10100000, 0x10100010, 0x10100010, 0x10101000, 0x10101000,\n    0x10101010, 0x10101010, 0x10101000, 0x10101000, 0x10101010, 0x10101010,\n    0x10100000, 0x10100000, 0x10100010, 0x10100010, 0x10100000, 0x10100000,\n    0x10100010, 0x10100010, 0x10101000, 0x10101000, 0x10101010, 0x10101010,\n    0x10101000, 0x10101000, 0x10101010, 0x10101010,\n  },\n  {\n    0x00000000, 0x00000000, 0x00000020, 0x00000020, 0x00000000, 0x00000000,\n    0x00000020, 0x00000020, 0x00002000, 0x00002000, 0x00002020, 0x00002020,\n    0x00002000, 0x00002000, 0x00002020, 0x00002020, 0x00000000, 0x00000000,\n    0x00000020, 0x00000020, 0x00000000, 0x00000000, 0x00000020, 0x00000020,\n    0x00002000, 0x00002000, 0x00002020, 0x00002020, 0x00002000, 0x00002000,\n    0x00002020, 0x00002020, 0x00200000, 0x00200000, 0x00200020, 0x00200020,\n    0x00200000, 0x00200000, 0x00200020, 0x00200020, 0x00202000, 0x00202000,\n    0x00202020, 0x00202020, 0x00202000, 0x00202000, 0x00202020, 0x00202020,\n    0x00200000, 0x00200000, 0x00200020, 0x00200020, 0x00200000, 0x00200000,\n    0x00200020, 0x00200020, 0x00202000, 0x00202000, 0x00202020, 0x00202020,\n    0x00202000, 0x00202000, 0x00202020, 0x00202020, 0x00000000, 0x00000000,\n    0x00000020, 0x00000020, 0x00000000, 0x00000000, 0x00000020, 0x00000020,\n    0x00002000, 0x00002000, 0x00002020, 0x00002020, 0x00002000, 0x00002000,\n    0x00002020, 0x00002020, 0x00000000, 0x00000000, 0x00000020, 0x00000020,\n    0x00000000, 0x00000000, 0x00000020, 0x00000020, 0x00002000, 0x00002000,\n    0x00002020, 0x00002020, 0x00002000, 0x00002000, 0x00002020, 0x00002020,\n    0x00200000, 0x00200000, 0x00200020, 0x00200020, 0x00200000, 0x00200000,\n    0x00200020, 0x00200020, 0x00202000, 0x00202000, 0x00202020, 0x00202020,\n    0x00202000, 0x00202000, 0x00202020, 0x00202020, 0x00200000, 0x00200000,\n    0x00200020, 0x00200020, 0x00200000, 0x00200000, 0x00200020, 0x00200020,\n    0x00202000, 0x00202000, 0x00202020, 0x00202020, 0x00202000, 0x00202000,\n    0x00202020, 0x00202020, 0x20000000, 0x20000000, 0x20000020, 0x20000020,\n    0x20000000, 0x20000000, 0x20000020, 0x20000020, 0x20002000, 0x20002000,\n    0x20002020, 0x20002020, 0x20002000, 0x20002000, 0x20002020, 0x20002020,\n    0x20000000, 0x20000000, 0x20000020, 0x20000020, 0x20000000, 0x20000000,\n    0x20000020, 0x20000020, 0x20002000, 0x20002000, 0x20002020, 0x20002020,\n    0x20002000, 0x20002000, 0x20002020, 0x20002020, 0x20200000, 0x20200000,\n    0x20200020, 0x20200020, 0x20200000, 0x20200000, 0x20200020, 0x20200020,\n    0x20202000, 0x20202000, 0x20202020, 0x20202020, 0x20202000, 0x20202000,\n    0x20202020, 0x20202020, 0x20200000, 0x20200000, 0x20200020, 0x20200020,\n    0x20200000, 0x20200000, 0x20200020, 0x20200020, 0x20202000, 0x20202000,\n    0x20202020, 0x20202020, 0x20202000, 0x20202000, 0x20202020, 0x20202020,\n    0x20000000, 0x20000000, 0x20000020, 0x20000020, 0x20000000, 0x20000000,\n    0x20000020, 0x20000020, 0x20002000, 0x20002000, 0x20002020, 0x20002020,\n    0x20002000, 0x20002000, 0x20002020, 0x20002020, 0x20000000, 0x20000000,\n    0x20000020, 0x20000020, 0x20000000, 0x20000000, 0x20000020, 0x20000020,\n    0x20002000, 0x20002000, 0x20002020, 0x20002020, 0x20002000, 0x20002000,\n    0x20002020, 0x20002020, 0x20200000, 0x20200000, 0x20200020, 0x20200020,\n    0x20200000, 0x20200000, 0x20200020, 0x20200020, 0x20202000, 0x20202000,\n    0x20202020, 0x20202020, 0x20202000, 0x20202000, 0x20202020, 0x20202020,\n    0x20200000, 0x20200000, 0x20200020, 0x20200020, 0x20200000, 0x20200000,\n    0x20200020, 0x20200020, 0x20202000, 0x20202000, 0x20202020, 0x20202020,\n    0x20202000, 0x20202000, 0x20202020, 0x20202020,\n  },\n  {\n    0x00000000, 0x00000000, 0x00000040, 0x00000040, 0x00000000, 0x00000000,\n    0x00000040, 0x00000040, 0x00004000, 0x00004000, 0x00004040, 0x00004040,\n    0x00004000, 0x00004000, 0x00004040, 0x00004040, 0x00000000, 0x00000000,\n    0x00000040, 0x00000040, 0x00000000, 0x00000000, 0x00000040, 0x00000040,\n    0x00004000, 0x00004000, 0x00004040, 0x00004040, 0x00004000, 0x00004000,\n    0x00004040, 0x00004040, 0x00400000, 0x00400000, 0x00400040, 0x00400040,\n    0x00400000, 0x00400000, 0x00400040, 0x00400040, 0x00404000, 0x00404000,\n    0x00404040, 0x00404040, 0x00404000, 0x00404000, 0x00404040, 0x00404040,\n    0x00400000, 0x00400000, 0x00400040, 0x00400040, 0x00400000, 0x00400000,\n    0x00400040, 0x00400040, 0x00404000, 0x00404000, 0x00404040, 0x00404040,\n    0x00404000, 0x00404000, 0x00404040, 0x00404040, 0x00000000, 0x00000000,\n    0x00000040, 0x00000040, 0x00000000, 0x00000000, 0x00000040, 0x00000040,\n    0x00004000, 0x00004000, 0x00004040, 0x00004040, 0x00004000, 0x00004000,\n    0x00004040, 0x00004040, 0x00000000, 0x00000000, 0x00000040, 0x00000040,\n    0x00000000, 0x00000000, 0x00000040, 0x00000040, 0x00004000, 0x00004000,\n    0x00004040, 0x00004040, 0x00004000, 0x00004000, 0x00004040, 0x00004040,\n    0x00400000, 0x00400000, 0x00400040, 0x00400040, 0x00400000, 0x00400000,\n    0x00400040, 0x00400040, 0x00404000, 0x00404000, 0x00404040, 0x00404040,\n    0x00404000, 0x00404000, 0x00404040, 0x00404040, 0x00400000, 0x00400000,\n    0x00400040, 0x00400040, 0x00400000, 0x00400000, 0x00400040, 0x00400040,\n    0x00404000, 0x00404000, 0x00404040, 0x00404040, 0x00404000, 0x00404000,\n    0x00404040, 0x00404040, 0x40000000, 0x40000000, 0x40000040, 0x40000040,\n    0x40000000, 0x40000000, 0x40000040, 0x40000040, 0x40004000, 0x40004000,\n    0x40004040, 0x40004040, 0x40004000, 0x40004000, 0x40004040, 0x40004040,\n    0x40000000, 0x40000000, 0x40000040, 0x40000040, 0x40000000, 0x40000000,\n    0x40000040, 0x40000040, 0x40004000, 0x40004000, 0x40004040, 0x40004040,\n    0x40004000, 0x40004000, 0x40004040, 0x40004040, 0x40400000, 0x40400000,\n    0x40400040, 0x40400040, 0x40400000, 0x40400000, 0x40400040, 0x40400040,\n    0x40404000, 0x40404000, 0x40404040, 0x40404040, 0x40404000, 0x40404000,\n    0x40404040, 0x40404040, 0x40400000, 0x40400000, 0x40400040, 0x40400040,\n    0x40400000, 0x40400000, 0x40400040, 0x40400040, 0x40404000, 0x40404000,\n    0x40404040, 0x40404040, 0x40404000, 0x40404000, 0x40404040, 0x40404040,\n    0x40000000, 0x40000000, 0x40000040, 0x40000040, 0x40000000, 0x40000000,\n    0x40000040, 0x40000040, 0x40004000, 0x40004000, 0x40004040, 0x40004040,\n    0x40004000, 0x40004000, 0x40004040, 0x40004040, 0x40000000, 0x40000000,\n    0x40000040, 0x40000040, 0x40000000, 0x40000000, 0x40000040, 0x40000040,\n    0x40004000, 0x40004000, 0x40004040, 0x40004040, 0x40004000, 0x40004000,\n    0x40004040, 0x40004040, 0x40400000, 0x40400000, 0x40400040, 0x40400040,\n    0x40400000, 0x40400000, 0x40400040, 0x40400040, 0x40404000, 0x40404000,\n    0x40404040, 0x40404040, 0x40404000, 0x40404000, 0x40404040, 0x40404040,\n    0x40400000, 0x40400000, 0x40400040, 0x40400040, 0x40400000, 0x40400000,\n    0x40400040, 0x40400040, 0x40404000, 0x40404000, 0x40404040, 0x40404040,\n    0x40404000, 0x40404000, 0x40404040, 0x40404040,\n  },\n  {\n    0x00000000, 0x00000000, 0x00000080, 0x00000080, 0x00000000, 0x00000000,\n    0x00000080, 0x00000080, 0x00008000, 0x00008000, 0x00008080, 0x00008080,\n    0x00008000, 0x00008000, 0x00008080, 0x00008080, 0x00000000, 0x00000000,\n    0x00000080, 0x00000080, 0x00000000, 0x00000000, 0x00000080, 0x00000080,\n    0x00008000, 0x00008000, 0x00008080, 0x00008080, 0x00008000, 0x00008000,\n    0x00008080, 0x00008080, 0x00800000, 0x00800000, 0x00800080, 0x00800080,\n    0x00800000, 0x00800000, 0x00800080, 0x00800080, 0x00808000, 0x00808000,\n    0x00808080, 0x00808080, 0x00808000, 0x00808000, 0x00808080, 0x00808080,\n    0x00800000, 0x00800000, 0x00800080, 0x00800080, 0x00800000, 0x00800000,\n    0x00800080, 0x00800080, 0x00808000, 0x00808000, 0x00808080, 0x00808080,\n    0x00808000, 0x00808000, 0x00808080, 0x00808080, 0x00000000, 0x00000000,\n    0x00000080, 0x00000080, 0x00000000, 0x00000000, 0x00000080, 0x00000080,\n    0x00008000, 0x00008000, 0x00008080, 0x00008080, 0x00008000, 0x00008000,\n    0x00008080, 0x00008080, 0x00000000, 0x00000000, 0x00000080, 0x00000080,\n    0x00000000, 0x00000000, 0x00000080, 0x00000080, 0x00008000, 0x00008000,\n    0x00008080, 0x00008080, 0x00008000, 0x00008000, 0x00008080, 0x00008080,\n    0x00800000, 0x00800000, 0x00800080, 0x00800080, 0x00800000, 0x00800000,\n    0x00800080, 0x00800080, 0x00808000, 0x00808000, 0x00808080, 0x00808080,\n    0x00808000, 0x00808000, 0x00808080, 0x00808080, 0x00800000, 0x00800000,\n    0x00800080, 0x00800080, 0x00800000, 0x00800000, 0x00800080, 0x00800080,\n    0x00808000, 0x00808000, 0x00808080, 0x00808080, 0x00808000, 0x00808000,\n    0x00808080, 0x00808080, 0x80000000, 0x80000000, 0x80000080, 0x80000080,\n    0x80000000, 0x80000000, 0x80000080, 0x80000080, 0x80008000, 0x80008000,\n    0x80008080, 0x80008080, 0x80008000, 0x80008000, 0x80008080, 0x80008080,\n    0x80000000, 0x80000000, 0x80000080, 0x80000080, 0x80000000, 0x80000000,\n    0x80000080, 0x80000080, 0x80008000, 0x80008000, 0x80008080, 0x80008080,\n    0x80008000, 0x80008000, 0x80008080, 0x80008080, 0x80800000, 0x80800000,\n    0x80800080, 0x80800080, 0x80800000, 0x80800000, 0x80800080, 0x80800080,\n    0x80808000, 0x80808000, 0x80808080, 0x80808080, 0x80808000, 0x80808000,\n    0x80808080, 0x80808080, 0x80800000, 0x80800000, 0x80800080, 0x80800080,\n    0x80800000, 0x80800000, 0x80800080, 0x80800080, 0x80808000, 0x80808000,\n    0x80808080, 0x80808080, 0x80808000, 0x80808000, 0x80808080, 0x80808080,\n    0x80000000, 0x80000000, 0x80000080, 0x80000080, 0x80000000, 0x80000000,\n    0x80000080, 0x80000080, 0x80008000, 0x80008000, 0x80008080, 0x80008080,\n    0x80008000, 0x80008000, 0x80008080, 0x80008080, 0x80000000, 0x80000000,\n    0x80000080, 0x80000080, 0x80000000, 0x80000000, 0x80000080, 0x80000080,\n    0x80008000, 0x80008000, 0x80008080, 0x80008080, 0x80008000, 0x80008000,\n    0x80008080, 0x80008080, 0x80800000, 0x80800000, 0x80800080, 0x80800080,\n    0x80800000, 0x80800000, 0x80800080, 0x80800080, 0x80808000, 0x80808000,\n    0x80808080, 0x80808080, 0x80808000, 0x80808000, 0x80808080, 0x80808080,\n    0x80800000, 0x80800000, 0x80800080, 0x80800080, 0x80800000, 0x80800000,\n    0x80800080, 0x80800080, 0x80808000, 0x80808000, 0x80808080, 0x80808080,\n    0x80808000, 0x80808000, 0x80808080, 0x80808080,\n  },\n};\n\nconst uint32_t fp_maskl[8][256] =\n{\n  {\n    0x00000000, 0x40000000, 0x00400000, 0x40400000, 0x00004000, 0x40004000,\n    0x00404000, 0x40404000, 0x00000040, 0x40000040, 0x00400040, 0x40400040,\n    0x00004040, 0x40004040, 0x00404040, 0x40404040, 0x00000000, 0x40000000,\n    0x00400000, 0x40400000, 0x00004000, 0x40004000, 0x00404000, 0x40404000,\n    0x00000040, 0x40000040, 0x00400040, 0x40400040, 0x00004040, 0x40004040,\n    0x00404040, 0x40404040, 0x00000000, 0x40000000, 0x00400000, 0x40400000,\n    0x00004000, 0x40004000, 0x00404000, 0x40404000, 0x00000040, 0x40000040,\n    0x00400040, 0x40400040, 0x00004040, 0x40004040, 0x00404040, 0x40404040,\n    0x00000000, 0x40000000, 0x00400000, 0x40400000, 0x00004000, 0x40004000,\n    0x00404000, 0x40404000, 0x00000040, 0x40000040, 0x00400040, 0x40400040,\n    0x00004040, 0x40004040, 0x00404040, 0x40404040, 0x00000000, 0x40000000,\n    0x00400000, 0x40400000, 0x00004000, 0x40004000, 0x00404000, 0x40404000,\n    0x00000040, 0x40000040, 0x00400040, 0x40400040, 0x00004040, 0x40004040,\n    0x00404040, 0x40404040, 0x00000000, 0x40000000, 0x00400000, 0x40400000,\n    0x00004000, 0x40004000, 0x00404000, 0x40404000, 0x00000040, 0x40000040,\n    0x00400040, 0x40400040, 0x00004040, 0x40004040, 0x00404040, 0x40404040,\n    0x00000000, 0x40000000, 0x00400000, 0x40400000, 0x00004000, 0x40004000,\n    0x00404000, 0x40404000, 0x00000040, 0x40000040, 0x00400040, 0x40400040,\n    0x00004040, 0x40004040, 0x00404040, 0x40404040, 0x00000000, 0x40000000,\n    0x00400000, 0x40400000, 0x00004000, 0x40004000, 0x00404000, 0x40404000,\n    0x00000040, 0x40000040, 0x00400040, 0x40400040, 0x00004040, 0x40004040,\n    0x00404040, 0x40404040, 0x00000000, 0x40000000, 0x00400000, 0x40400000,\n    0x00004000, 0x40004000, 0x00404000, 0x40404000, 0x00000040, 0x40000040,\n    0x00400040, 0x40400040, 0x00004040, 0x40004040, 0x00404040, 0x40404040,\n    0x00000000, 0x40000000, 0x00400000, 0x40400000, 0x00004000, 0x40004000,\n    0x00404000, 0x40404000, 0x00000040, 0x40000040, 0x00400040, 0x40400040,\n    0x00004040, 0x40004040, 0x00404040, 0x40404040, 0x00000000, 0x40000000,\n    0x00400000, 0x40400000, 0x00004000, 0x40004000, 0x00404000, 0x40404000,\n    0x00000040, 0x40000040, 0x00400040, 0x40400040, 0x00004040, 0x40004040,\n    0x00404040, 0x40404040, 0x00000000, 0x40000000, 0x00400000, 0x40400000,\n    0x00004000, 0x40004000, 0x00404000, 0x40404000, 0x00000040, 0x40000040,\n    0x00400040, 0x40400040, 0x00004040, 0x40004040, 0x00404040, 0x40404040,\n    0x00000000, 0x40000000, 0x00400000, 0x40400000, 0x00004000, 0x40004000,\n    0x00404000, 0x40404000, 0x00000040, 0x40000040, 0x00400040, 0x40400040,\n    0x00004040, 0x40004040, 0x00404040, 0x40404040, 0x00000000, 0x40000000,\n    0x00400000, 0x40400000, 0x00004000, 0x40004000, 0x00404000, 0x40404000,\n    0x00000040, 0x40000040, 0x00400040, 0x40400040, 0x00004040, 0x40004040,\n    0x00404040, 0x40404040, 0x00000000, 0x40000000, 0x00400000, 0x40400000,\n    0x00004000, 0x40004000, 0x00404000, 0x40404000, 0x00000040, 0x40000040,\n    0x00400040, 0x40400040, 0x00004040, 0x40004040, 0x00404040, 0x40404040,\n    0x00000000, 0x40000000, 0x00400000, 0x40400000, 0x00004000, 0x40004000,\n    0x00404000, 0x40404000, 0x00000040, 0x40000040, 0x00400040, 0x40400040,\n    0x00004040, 0x40004040, 0x00404040, 0x40404040,\n  },\n  {\n    0x00000000, 0x10000000, 0x00100000, 0x10100000, 0x00001000, 0x10001000,\n    0x00101000, 0x10101000, 0x00000010, 0x10000010, 0x00100010, 0x10100010,\n    0x00001010, 0x10001010, 0x00101010, 0x10101010, 0x00000000, 0x10000000,\n    0x00100000, 0x10100000, 0x00001000, 0x10001000, 0x00101000, 0x10101000,\n    0x00000010, 0x10000010, 0x00100010, 0x10100010, 0x00001010, 0x10001010,\n    0x00101010, 0x10101010, 0x00000000, 0x10000000, 0x00100000, 0x10100000,\n    0x00001000, 0x10001000, 0x00101000, 0x10101000, 0x00000010, 0x10000010,\n    0x00100010, 0x10100010, 0x00001010, 0x10001010, 0x00101010, 0x10101010,\n    0x00000000, 0x10000000, 0x00100000, 0x10100000, 0x00001000, 0x10001000,\n    0x00101000, 0x10101000, 0x00000010, 0x10000010, 0x00100010, 0x10100010,\n    0x00001010, 0x10001010, 0x00101010, 0x10101010, 0x00000000, 0x10000000,\n    0x00100000, 0x10100000, 0x00001000, 0x10001000, 0x00101000, 0x10101000,\n    0x00000010, 0x10000010, 0x00100010, 0x10100010, 0x00001010, 0x10001010,\n    0x00101010, 0x10101010, 0x00000000, 0x10000000, 0x00100000, 0x10100000,\n    0x00001000, 0x10001000, 0x00101000, 0x10101000, 0x00000010, 0x10000010,\n    0x00100010, 0x10100010, 0x00001010, 0x10001010, 0x00101010, 0x10101010,\n    0x00000000, 0x10000000, 0x00100000, 0x10100000, 0x00001000, 0x10001000,\n    0x00101000, 0x10101000, 0x00000010, 0x10000010, 0x00100010, 0x10100010,\n    0x00001010, 0x10001010, 0x00101010, 0x10101010, 0x00000000, 0x10000000,\n    0x00100000, 0x10100000, 0x00001000, 0x10001000, 0x00101000, 0x10101000,\n    0x00000010, 0x10000010, 0x00100010, 0x10100010, 0x00001010, 0x10001010,\n    0x00101010, 0x10101010, 0x00000000, 0x10000000, 0x00100000, 0x10100000,\n    0x00001000, 0x10001000, 0x00101000, 0x10101000, 0x00000010, 0x10000010,\n    0x00100010, 0x10100010, 0x00001010, 0x10001010, 0x00101010, 0x10101010,\n    0x00000000, 0x10000000, 0x00100000, 0x10100000, 0x00001000, 0x10001000,\n    0x00101000, 0x10101000, 0x00000010, 0x10000010, 0x00100010, 0x10100010,\n    0x00001010, 0x10001010, 0x00101010, 0x10101010, 0x00000000, 0x10000000,\n    0x00100000, 0x10100000, 0x00001000, 0x10001000, 0x00101000, 0x10101000,\n    0x00000010, 0x10000010, 0x00100010, 0x10100010, 0x00001010, 0x10001010,\n    0x00101010, 0x10101010, 0x00000000, 0x10000000, 0x00100000, 0x10100000,\n    0x00001000, 0x10001000, 0x00101000, 0x10101000, 0x00000010, 0x10000010,\n    0x00100010, 0x10100010, 0x00001010, 0x10001010, 0x00101010, 0x10101010,\n    0x00000000, 0x10000000, 0x00100000, 0x10100000, 0x00001000, 0x10001000,\n    0x00101000, 0x10101000, 0x00000010, 0x10000010, 0x00100010, 0x10100010,\n    0x00001010, 0x10001010, 0x00101010, 0x10101010, 0x00000000, 0x10000000,\n    0x00100000, 0x10100000, 0x00001000, 0x10001000, 0x00101000, 0x10101000,\n    0x00000010, 0x10000010, 0x00100010, 0x10100010, 0x00001010, 0x10001010,\n    0x00101010, 0x10101010, 0x00000000, 0x10000000, 0x00100000, 0x10100000,\n    0x00001000, 0x10001000, 0x00101000, 0x10101000, 0x00000010, 0x10000010,\n    0x00100010, 0x10100010, 0x00001010, 0x10001010, 0x00101010, 0x10101010,\n    0x00000000, 0x10000000, 0x00100000, 0x10100000, 0x00001000, 0x10001000,\n    0x00101000, 0x10101000, 0x00000010, 0x10000010, 0x00100010, 0x10100010,\n    0x00001010, 0x10001010, 0x00101010, 0x10101010,\n  },\n  {\n    0x00000000, 0x04000000, 0x00040000, 0x04040000, 0x00000400, 0x04000400,\n    0x00040400, 0x04040400, 0x00000004, 0x04000004, 0x00040004, 0x04040004,\n    0x00000404, 0x04000404, 0x00040404, 0x04040404, 0x00000000, 0x04000000,\n    0x00040000, 0x04040000, 0x00000400, 0x04000400, 0x00040400, 0x04040400,\n    0x00000004, 0x04000004, 0x00040004, 0x04040004, 0x00000404, 0x04000404,\n    0x00040404, 0x04040404, 0x00000000, 0x04000000, 0x00040000, 0x04040000,\n    0x00000400, 0x04000400, 0x00040400, 0x04040400, 0x00000004, 0x04000004,\n    0x00040004, 0x04040004, 0x00000404, 0x04000404, 0x00040404, 0x04040404,\n    0x00000000, 0x04000000, 0x00040000, 0x04040000, 0x00000400, 0x04000400,\n    0x00040400, 0x04040400, 0x00000004, 0x04000004, 0x00040004, 0x04040004,\n    0x00000404, 0x04000404, 0x00040404, 0x04040404, 0x00000000, 0x04000000,\n    0x00040000, 0x04040000, 0x00000400, 0x04000400, 0x00040400, 0x04040400,\n    0x00000004, 0x04000004, 0x00040004, 0x04040004, 0x00000404, 0x04000404,\n    0x00040404, 0x04040404, 0x00000000, 0x04000000, 0x00040000, 0x04040000,\n    0x00000400, 0x04000400, 0x00040400, 0x04040400, 0x00000004, 0x04000004,\n    0x00040004, 0x04040004, 0x00000404, 0x04000404, 0x00040404, 0x04040404,\n    0x00000000, 0x04000000, 0x00040000, 0x04040000, 0x00000400, 0x04000400,\n    0x00040400, 0x04040400, 0x00000004, 0x04000004, 0x00040004, 0x04040004,\n    0x00000404, 0x04000404, 0x00040404, 0x04040404, 0x00000000, 0x04000000,\n    0x00040000, 0x04040000, 0x00000400, 0x04000400, 0x00040400, 0x04040400,\n    0x00000004, 0x04000004, 0x00040004, 0x04040004, 0x00000404, 0x04000404,\n    0x00040404, 0x04040404, 0x00000000, 0x04000000, 0x00040000, 0x04040000,\n    0x00000400, 0x04000400, 0x00040400, 0x04040400, 0x00000004, 0x04000004,\n    0x00040004, 0x04040004, 0x00000404, 0x04000404, 0x00040404, 0x04040404,\n    0x00000000, 0x04000000, 0x00040000, 0x04040000, 0x00000400, 0x04000400,\n    0x00040400, 0x04040400, 0x00000004, 0x04000004, 0x00040004, 0x04040004,\n    0x00000404, 0x04000404, 0x00040404, 0x04040404, 0x00000000, 0x04000000,\n    0x00040000, 0x04040000, 0x00000400, 0x04000400, 0x00040400, 0x04040400,\n    0x00000004, 0x04000004, 0x00040004, 0x04040004, 0x00000404, 0x04000404,\n    0x00040404, 0x04040404, 0x00000000, 0x04000000, 0x00040000, 0x04040000,\n    0x00000400, 0x04000400, 0x00040400, 0x04040400, 0x00000004, 0x04000004,\n    0x00040004, 0x04040004, 0x00000404, 0x04000404, 0x00040404, 0x04040404,\n    0x00000000, 0x04000000, 0x00040000, 0x04040000, 0x00000400, 0x04000400,\n    0x00040400, 0x04040400, 0x00000004, 0x04000004, 0x00040004, 0x04040004,\n    0x00000404, 0x04000404, 0x00040404, 0x04040404, 0x00000000, 0x04000000,\n    0x00040000, 0x04040000, 0x00000400, 0x04000400, 0x00040400, 0x04040400,\n    0x00000004, 0x04000004, 0x00040004, 0x04040004, 0x00000404, 0x04000404,\n    0x00040404, 0x04040404, 0x00000000, 0x04000000, 0x00040000, 0x04040000,\n    0x00000400, 0x04000400, 0x00040400, 0x04040400, 0x00000004, 0x04000004,\n    0x00040004, 0x04040004, 0x00000404, 0x04000404, 0x00040404, 0x04040404,\n    0x00000000, 0x04000000, 0x00040000, 0x04040000, 0x00000400, 0x04000400,\n    0x00040400, 0x04040400, 0x00000004, 0x04000004, 0x00040004, 0x04040004,\n    0x00000404, 0x04000404, 0x00040404, 0x04040404,\n  },\n  {\n    0x00000000, 0x01000000, 0x00010000, 0x01010000, 0x00000100, 0x01000100,\n    0x00010100, 0x01010100, 0x00000001, 0x01000001, 0x00010001, 0x01010001,\n    0x00000101, 0x01000101, 0x00010101, 0x01010101, 0x00000000, 0x01000000,\n    0x00010000, 0x01010000, 0x00000100, 0x01000100, 0x00010100, 0x01010100,\n    0x00000001, 0x01000001, 0x00010001, 0x01010001, 0x00000101, 0x01000101,\n    0x00010101, 0x01010101, 0x00000000, 0x01000000, 0x00010000, 0x01010000,\n    0x00000100, 0x01000100, 0x00010100, 0x01010100, 0x00000001, 0x01000001,\n    0x00010001, 0x01010001, 0x00000101, 0x01000101, 0x00010101, 0x01010101,\n    0x00000000, 0x01000000, 0x00010000, 0x01010000, 0x00000100, 0x01000100,\n    0x00010100, 0x01010100, 0x00000001, 0x01000001, 0x00010001, 0x01010001,\n    0x00000101, 0x01000101, 0x00010101, 0x01010101, 0x00000000, 0x01000000,\n    0x00010000, 0x01010000, 0x00000100, 0x01000100, 0x00010100, 0x01010100,\n    0x00000001, 0x01000001, 0x00010001, 0x01010001, 0x00000101, 0x01000101,\n    0x00010101, 0x01010101, 0x00000000, 0x01000000, 0x00010000, 0x01010000,\n    0x00000100, 0x01000100, 0x00010100, 0x01010100, 0x00000001, 0x01000001,\n    0x00010001, 0x01010001, 0x00000101, 0x01000101, 0x00010101, 0x01010101,\n    0x00000000, 0x01000000, 0x00010000, 0x01010000, 0x00000100, 0x01000100,\n    0x00010100, 0x01010100, 0x00000001, 0x01000001, 0x00010001, 0x01010001,\n    0x00000101, 0x01000101, 0x00010101, 0x01010101, 0x00000000, 0x01000000,\n    0x00010000, 0x01010000, 0x00000100, 0x01000100, 0x00010100, 0x01010100,\n    0x00000001, 0x01000001, 0x00010001, 0x01010001, 0x00000101, 0x01000101,\n    0x00010101, 0x01010101, 0x00000000, 0x01000000, 0x00010000, 0x01010000,\n    0x00000100, 0x01000100, 0x00010100, 0x01010100, 0x00000001, 0x01000001,\n    0x00010001, 0x01010001, 0x00000101, 0x01000101, 0x00010101, 0x01010101,\n    0x00000000, 0x01000000, 0x00010000, 0x01010000, 0x00000100, 0x01000100,\n    0x00010100, 0x01010100, 0x00000001, 0x01000001, 0x00010001, 0x01010001,\n    0x00000101, 0x01000101, 0x00010101, 0x01010101, 0x00000000, 0x01000000,\n    0x00010000, 0x01010000, 0x00000100, 0x01000100, 0x00010100, 0x01010100,\n    0x00000001, 0x01000001, 0x00010001, 0x01010001, 0x00000101, 0x01000101,\n    0x00010101, 0x01010101, 0x00000000, 0x01000000, 0x00010000, 0x01010000,\n    0x00000100, 0x01000100, 0x00010100, 0x01010100, 0x00000001, 0x01000001,\n    0x00010001, 0x01010001, 0x00000101, 0x01000101, 0x00010101, 0x01010101,\n    0x00000000, 0x01000000, 0x00010000, 0x01010000, 0x00000100, 0x01000100,\n    0x00010100, 0x01010100, 0x00000001, 0x01000001, 0x00010001, 0x01010001,\n    0x00000101, 0x01000101, 0x00010101, 0x01010101, 0x00000000, 0x01000000,\n    0x00010000, 0x01010000, 0x00000100, 0x01000100, 0x00010100, 0x01010100,\n    0x00000001, 0x01000001, 0x00010001, 0x01010001, 0x00000101, 0x01000101,\n    0x00010101, 0x01010101, 0x00000000, 0x01000000, 0x00010000, 0x01010000,\n    0x00000100, 0x01000100, 0x00010100, 0x01010100, 0x00000001, 0x01000001,\n    0x00010001, 0x01010001, 0x00000101, 0x01000101, 0x00010101, 0x01010101,\n    0x00000000, 0x01000000, 0x00010000, 0x01010000, 0x00000100, 0x01000100,\n    0x00010100, 0x01010100, 0x00000001, 0x01000001, 0x00010001, 0x01010001,\n    0x00000101, 0x01000101, 0x00010101, 0x01010101,\n  },\n  {\n    0x00000000, 0x80000000, 0x00800000, 0x80800000, 0x00008000, 0x80008000,\n    0x00808000, 0x80808000, 0x00000080, 0x80000080, 0x00800080, 0x80800080,\n    0x00008080, 0x80008080, 0x00808080, 0x80808080, 0x00000000, 0x80000000,\n    0x00800000, 0x80800000, 0x00008000, 0x80008000, 0x00808000, 0x80808000,\n    0x00000080, 0x80000080, 0x00800080, 0x80800080, 0x00008080, 0x80008080,\n    0x00808080, 0x80808080, 0x00000000, 0x80000000, 0x00800000, 0x80800000,\n    0x00008000, 0x80008000, 0x00808000, 0x80808000, 0x00000080, 0x80000080,\n    0x00800080, 0x80800080, 0x00008080, 0x80008080, 0x00808080, 0x80808080,\n    0x00000000, 0x80000000, 0x00800000, 0x80800000, 0x00008000, 0x80008000,\n    0x00808000, 0x80808000, 0x00000080, 0x80000080, 0x00800080, 0x80800080,\n    0x00008080, 0x80008080, 0x00808080, 0x80808080, 0x00000000, 0x80000000,\n    0x00800000, 0x80800000, 0x00008000, 0x80008000, 0x00808000, 0x80808000,\n    0x00000080, 0x80000080, 0x00800080, 0x80800080, 0x00008080, 0x80008080,\n    0x00808080, 0x80808080, 0x00000000, 0x80000000, 0x00800000, 0x80800000,\n    0x00008000, 0x80008000, 0x00808000, 0x80808000, 0x00000080, 0x80000080,\n    0x00800080, 0x80800080, 0x00008080, 0x80008080, 0x00808080, 0x80808080,\n    0x00000000, 0x80000000, 0x00800000, 0x80800000, 0x00008000, 0x80008000,\n    0x00808000, 0x80808000, 0x00000080, 0x80000080, 0x00800080, 0x80800080,\n    0x00008080, 0x80008080, 0x00808080, 0x80808080, 0x00000000, 0x80000000,\n    0x00800000, 0x80800000, 0x00008000, 0x80008000, 0x00808000, 0x80808000,\n    0x00000080, 0x80000080, 0x00800080, 0x80800080, 0x00008080, 0x80008080,\n    0x00808080, 0x80808080, 0x00000000, 0x80000000, 0x00800000, 0x80800000,\n    0x00008000, 0x80008000, 0x00808000, 0x80808000, 0x00000080, 0x80000080,\n    0x00800080, 0x80800080, 0x00008080, 0x80008080, 0x00808080, 0x80808080,\n    0x00000000, 0x80000000, 0x00800000, 0x80800000, 0x00008000, 0x80008000,\n    0x00808000, 0x80808000, 0x00000080, 0x80000080, 0x00800080, 0x80800080,\n    0x00008080, 0x80008080, 0x00808080, 0x80808080, 0x00000000, 0x80000000,\n    0x00800000, 0x80800000, 0x00008000, 0x80008000, 0x00808000, 0x80808000,\n    0x00000080, 0x80000080, 0x00800080, 0x80800080, 0x00008080, 0x80008080,\n    0x00808080, 0x80808080, 0x00000000, 0x80000000, 0x00800000, 0x80800000,\n    0x00008000, 0x80008000, 0x00808000, 0x80808000, 0x00000080, 0x80000080,\n    0x00800080, 0x80800080, 0x00008080, 0x80008080, 0x00808080, 0x80808080,\n    0x00000000, 0x80000000, 0x00800000, 0x80800000, 0x00008000, 0x80008000,\n    0x00808000, 0x80808000, 0x00000080, 0x80000080, 0x00800080, 0x80800080,\n    0x00008080, 0x80008080, 0x00808080, 0x80808080, 0x00000000, 0x80000000,\n    0x00800000, 0x80800000, 0x00008000, 0x80008000, 0x00808000, 0x80808000,\n    0x00000080, 0x80000080, 0x00800080, 0x80800080, 0x00008080, 0x80008080,\n    0x00808080, 0x80808080, 0x00000000, 0x80000000, 0x00800000, 0x80800000,\n    0x00008000, 0x80008000, 0x00808000, 0x80808000, 0x00000080, 0x80000080,\n    0x00800080, 0x80800080, 0x00008080, 0x80008080, 0x00808080, 0x80808080,\n    0x00000000, 0x80000000, 0x00800000, 0x80800000, 0x00008000, 0x80008000,\n    0x00808000, 0x80808000, 0x00000080, 0x80000080, 0x00800080, 0x80800080,\n    0x00008080, 0x80008080, 0x00808080, 0x80808080,\n  },\n  {\n    0x00000000, 0x20000000, 0x00200000, 0x20200000, 0x00002000, 0x20002000,\n    0x00202000, 0x20202000, 0x00000020, 0x20000020, 0x00200020, 0x20200020,\n    0x00002020, 0x20002020, 0x00202020, 0x20202020, 0x00000000, 0x20000000,\n    0x00200000, 0x20200000, 0x00002000, 0x20002000, 0x00202000, 0x20202000,\n    0x00000020, 0x20000020, 0x00200020, 0x20200020, 0x00002020, 0x20002020,\n    0x00202020, 0x20202020, 0x00000000, 0x20000000, 0x00200000, 0x20200000,\n    0x00002000, 0x20002000, 0x00202000, 0x20202000, 0x00000020, 0x20000020,\n    0x00200020, 0x20200020, 0x00002020, 0x20002020, 0x00202020, 0x20202020,\n    0x00000000, 0x20000000, 0x00200000, 0x20200000, 0x00002000, 0x20002000,\n    0x00202000, 0x20202000, 0x00000020, 0x20000020, 0x00200020, 0x20200020,\n    0x00002020, 0x20002020, 0x00202020, 0x20202020, 0x00000000, 0x20000000,\n    0x00200000, 0x20200000, 0x00002000, 0x20002000, 0x00202000, 0x20202000,\n    0x00000020, 0x20000020, 0x00200020, 0x20200020, 0x00002020, 0x20002020,\n    0x00202020, 0x20202020, 0x00000000, 0x20000000, 0x00200000, 0x20200000,\n    0x00002000, 0x20002000, 0x00202000, 0x20202000, 0x00000020, 0x20000020,\n    0x00200020, 0x20200020, 0x00002020, 0x20002020, 0x00202020, 0x20202020,\n    0x00000000, 0x20000000, 0x00200000, 0x20200000, 0x00002000, 0x20002000,\n    0x00202000, 0x20202000, 0x00000020, 0x20000020, 0x00200020, 0x20200020,\n    0x00002020, 0x20002020, 0x00202020, 0x20202020, 0x00000000, 0x20000000,\n    0x00200000, 0x20200000, 0x00002000, 0x20002000, 0x00202000, 0x20202000,\n    0x00000020, 0x20000020, 0x00200020, 0x20200020, 0x00002020, 0x20002020,\n    0x00202020, 0x20202020, 0x00000000, 0x20000000, 0x00200000, 0x20200000,\n    0x00002000, 0x20002000, 0x00202000, 0x20202000, 0x00000020, 0x20000020,\n    0x00200020, 0x20200020, 0x00002020, 0x20002020, 0x00202020, 0x20202020,\n    0x00000000, 0x20000000, 0x00200000, 0x20200000, 0x00002000, 0x20002000,\n    0x00202000, 0x20202000, 0x00000020, 0x20000020, 0x00200020, 0x20200020,\n    0x00002020, 0x20002020, 0x00202020, 0x20202020, 0x00000000, 0x20000000,\n    0x00200000, 0x20200000, 0x00002000, 0x20002000, 0x00202000, 0x20202000,\n    0x00000020, 0x20000020, 0x00200020, 0x20200020, 0x00002020, 0x20002020,\n    0x00202020, 0x20202020, 0x00000000, 0x20000000, 0x00200000, 0x20200000,\n    0x00002000, 0x20002000, 0x00202000, 0x20202000, 0x00000020, 0x20000020,\n    0x00200020, 0x20200020, 0x00002020, 0x20002020, 0x00202020, 0x20202020,\n    0x00000000, 0x20000000, 0x00200000, 0x20200000, 0x00002000, 0x20002000,\n    0x00202000, 0x20202000, 0x00000020, 0x20000020, 0x00200020, 0x20200020,\n    0x00002020, 0x20002020, 0x00202020, 0x20202020, 0x00000000, 0x20000000,\n    0x00200000, 0x20200000, 0x00002000, 0x20002000, 0x00202000, 0x20202000,\n    0x00000020, 0x20000020, 0x00200020, 0x20200020, 0x00002020, 0x20002020,\n    0x00202020, 0x20202020, 0x00000000, 0x20000000, 0x00200000, 0x20200000,\n    0x00002000, 0x20002000, 0x00202000, 0x20202000, 0x00000020, 0x20000020,\n    0x00200020, 0x20200020, 0x00002020, 0x20002020, 0x00202020, 0x20202020,\n    0x00000000, 0x20000000, 0x00200000, 0x20200000, 0x00002000, 0x20002000,\n    0x00202000, 0x20202000, 0x00000020, 0x20000020, 0x00200020, 0x20200020,\n    0x00002020, 0x20002020, 0x00202020, 0x20202020,\n  },\n  {\n    0x00000000, 0x08000000, 0x00080000, 0x08080000, 0x00000800, 0x08000800,\n    0x00080800, 0x08080800, 0x00000008, 0x08000008, 0x00080008, 0x08080008,\n    0x00000808, 0x08000808, 0x00080808, 0x08080808, 0x00000000, 0x08000000,\n    0x00080000, 0x08080000, 0x00000800, 0x08000800, 0x00080800, 0x08080800,\n    0x00000008, 0x08000008, 0x00080008, 0x08080008, 0x00000808, 0x08000808,\n    0x00080808, 0x08080808, 0x00000000, 0x08000000, 0x00080000, 0x08080000,\n    0x00000800, 0x08000800, 0x00080800, 0x08080800, 0x00000008, 0x08000008,\n    0x00080008, 0x08080008, 0x00000808, 0x08000808, 0x00080808, 0x08080808,\n    0x00000000, 0x08000000, 0x00080000, 0x08080000, 0x00000800, 0x08000800,\n    0x00080800, 0x08080800, 0x00000008, 0x08000008, 0x00080008, 0x08080008,\n    0x00000808, 0x08000808, 0x00080808, 0x08080808, 0x00000000, 0x08000000,\n    0x00080000, 0x08080000, 0x00000800, 0x08000800, 0x00080800, 0x08080800,\n    0x00000008, 0x08000008, 0x00080008, 0x08080008, 0x00000808, 0x08000808,\n    0x00080808, 0x08080808, 0x00000000, 0x08000000, 0x00080000, 0x08080000,\n    0x00000800, 0x08000800, 0x00080800, 0x08080800, 0x00000008, 0x08000008,\n    0x00080008, 0x08080008, 0x00000808, 0x08000808, 0x00080808, 0x08080808,\n    0x00000000, 0x08000000, 0x00080000, 0x08080000, 0x00000800, 0x08000800,\n    0x00080800, 0x08080800, 0x00000008, 0x08000008, 0x00080008, 0x08080008,\n    0x00000808, 0x08000808, 0x00080808, 0x08080808, 0x00000000, 0x08000000,\n    0x00080000, 0x08080000, 0x00000800, 0x08000800, 0x00080800, 0x08080800,\n    0x00000008, 0x08000008, 0x00080008, 0x08080008, 0x00000808, 0x08000808,\n    0x00080808, 0x08080808, 0x00000000, 0x08000000, 0x00080000, 0x08080000,\n    0x00000800, 0x08000800, 0x00080800, 0x08080800, 0x00000008, 0x08000008,\n    0x00080008, 0x08080008, 0x00000808, 0x08000808, 0x00080808, 0x08080808,\n    0x00000000, 0x08000000, 0x00080000, 0x08080000, 0x00000800, 0x08000800,\n    0x00080800, 0x08080800, 0x00000008, 0x08000008, 0x00080008, 0x08080008,\n    0x00000808, 0x08000808, 0x00080808, 0x08080808, 0x00000000, 0x08000000,\n    0x00080000, 0x08080000, 0x00000800, 0x08000800, 0x00080800, 0x08080800,\n    0x00000008, 0x08000008, 0x00080008, 0x08080008, 0x00000808, 0x08000808,\n    0x00080808, 0x08080808, 0x00000000, 0x08000000, 0x00080000, 0x08080000,\n    0x00000800, 0x08000800, 0x00080800, 0x08080800, 0x00000008, 0x08000008,\n    0x00080008, 0x08080008, 0x00000808, 0x08000808, 0x00080808, 0x08080808,\n    0x00000000, 0x08000000, 0x00080000, 0x08080000, 0x00000800, 0x08000800,\n    0x00080800, 0x08080800, 0x00000008, 0x08000008, 0x00080008, 0x08080008,\n    0x00000808, 0x08000808, 0x00080808, 0x08080808, 0x00000000, 0x08000000,\n    0x00080000, 0x08080000, 0x00000800, 0x08000800, 0x00080800, 0x08080800,\n    0x00000008, 0x08000008, 0x00080008, 0x08080008, 0x00000808, 0x08000808,\n    0x00080808, 0x08080808, 0x00000000, 0x08000000, 0x00080000, 0x08080000,\n    0x00000800, 0x08000800, 0x00080800, 0x08080800, 0x00000008, 0x08000008,\n    0x00080008, 0x08080008, 0x00000808, 0x08000808, 0x00080808, 0x08080808,\n    0x00000000, 0x08000000, 0x00080000, 0x08080000, 0x00000800, 0x08000800,\n    0x00080800, 0x08080800, 0x00000008, 0x08000008, 0x00080008, 0x08080008,\n    0x00000808, 0x08000808, 0x00080808, 0x08080808,\n  },\n  {\n    0x00000000, 0x02000000, 0x00020000, 0x02020000, 0x00000200, 0x02000200,\n    0x00020200, 0x02020200, 0x00000002, 0x02000002, 0x00020002, 0x02020002,\n    0x00000202, 0x02000202, 0x00020202, 0x02020202, 0x00000000, 0x02000000,\n    0x00020000, 0x02020000, 0x00000200, 0x02000200, 0x00020200, 0x02020200,\n    0x00000002, 0x02000002, 0x00020002, 0x02020002, 0x00000202, 0x02000202,\n    0x00020202, 0x02020202, 0x00000000, 0x02000000, 0x00020000, 0x02020000,\n    0x00000200, 0x02000200, 0x00020200, 0x02020200, 0x00000002, 0x02000002,\n    0x00020002, 0x02020002, 0x00000202, 0x02000202, 0x00020202, 0x02020202,\n    0x00000000, 0x02000000, 0x00020000, 0x02020000, 0x00000200, 0x02000200,\n    0x00020200, 0x02020200, 0x00000002, 0x02000002, 0x00020002, 0x02020002,\n    0x00000202, 0x02000202, 0x00020202, 0x02020202, 0x00000000, 0x02000000,\n    0x00020000, 0x02020000, 0x00000200, 0x02000200, 0x00020200, 0x02020200,\n    0x00000002, 0x02000002, 0x00020002, 0x02020002, 0x00000202, 0x02000202,\n    0x00020202, 0x02020202, 0x00000000, 0x02000000, 0x00020000, 0x02020000,\n    0x00000200, 0x02000200, 0x00020200, 0x02020200, 0x00000002, 0x02000002,\n    0x00020002, 0x02020002, 0x00000202, 0x02000202, 0x00020202, 0x02020202,\n    0x00000000, 0x02000000, 0x00020000, 0x02020000, 0x00000200, 0x02000200,\n    0x00020200, 0x02020200, 0x00000002, 0x02000002, 0x00020002, 0x02020002,\n    0x00000202, 0x02000202, 0x00020202, 0x02020202, 0x00000000, 0x02000000,\n    0x00020000, 0x02020000, 0x00000200, 0x02000200, 0x00020200, 0x02020200,\n    0x00000002, 0x02000002, 0x00020002, 0x02020002, 0x00000202, 0x02000202,\n    0x00020202, 0x02020202, 0x00000000, 0x02000000, 0x00020000, 0x02020000,\n    0x00000200, 0x02000200, 0x00020200, 0x02020200, 0x00000002, 0x02000002,\n    0x00020002, 0x02020002, 0x00000202, 0x02000202, 0x00020202, 0x02020202,\n    0x00000000, 0x02000000, 0x00020000, 0x02020000, 0x00000200, 0x02000200,\n    0x00020200, 0x02020200, 0x00000002, 0x02000002, 0x00020002, 0x02020002,\n    0x00000202, 0x02000202, 0x00020202, 0x02020202, 0x00000000, 0x02000000,\n    0x00020000, 0x02020000, 0x00000200, 0x02000200, 0x00020200, 0x02020200,\n    0x00000002, 0x02000002, 0x00020002, 0x02020002, 0x00000202, 0x02000202,\n    0x00020202, 0x02020202, 0x00000000, 0x02000000, 0x00020000, 0x02020000,\n    0x00000200, 0x02000200, 0x00020200, 0x02020200, 0x00000002, 0x02000002,\n    0x00020002, 0x02020002, 0x00000202, 0x02000202, 0x00020202, 0x02020202,\n    0x00000000, 0x02000000, 0x00020000, 0x02020000, 0x00000200, 0x02000200,\n    0x00020200, 0x02020200, 0x00000002, 0x02000002, 0x00020002, 0x02020002,\n    0x00000202, 0x02000202, 0x00020202, 0x02020202, 0x00000000, 0x02000000,\n    0x00020000, 0x02020000, 0x00000200, 0x02000200, 0x00020200, 0x02020200,\n    0x00000002, 0x02000002, 0x00020002, 0x02020002, 0x00000202, 0x02000202,\n    0x00020202, 0x02020202, 0x00000000, 0x02000000, 0x00020000, 0x02020000,\n    0x00000200, 0x02000200, 0x00020200, 0x02020200, 0x00000002, 0x02000002,\n    0x00020002, 0x02020002, 0x00000202, 0x02000202, 0x00020202, 0x02020202,\n    0x00000000, 0x02000000, 0x00020000, 0x02020000, 0x00000200, 0x02000200,\n    0x00020200, 0x02020200, 0x00000002, 0x02000002, 0x00020002, 0x02020002,\n    0x00000202, 0x02000202, 0x00020202, 0x02020202,\n  },\n};\n\nconst uint32_t fp_maskr[8][256] =\n{\n  {\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x40000000, 0x40000000,\n    0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000,\n    0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000,\n    0x40000000, 0x40000000, 0x00400000, 0x00400000, 0x00400000, 0x00400000,\n    0x00400000, 0x00400000, 0x00400000, 0x00400000, 0x00400000, 0x00400000,\n    0x00400000, 0x00400000, 0x00400000, 0x00400000, 0x00400000, 0x00400000,\n    0x40400000, 0x40400000, 0x40400000, 0x40400000, 0x40400000, 0x40400000,\n    0x40400000, 0x40400000, 0x40400000, 0x40400000, 0x40400000, 0x40400000,\n    0x40400000, 0x40400000, 0x40400000, 0x40400000, 0x00004000, 0x00004000,\n    0x00004000, 0x00004000, 0x00004000, 0x00004000, 0x00004000, 0x00004000,\n    0x00004000, 0x00004000, 0x00004000, 0x00004000, 0x00004000, 0x00004000,\n    0x00004000, 0x00004000, 0x40004000, 0x40004000, 0x40004000, 0x40004000,\n    0x40004000, 0x40004000, 0x40004000, 0x40004000, 0x40004000, 0x40004000,\n    0x40004000, 0x40004000, 0x40004000, 0x40004000, 0x40004000, 0x40004000,\n    0x00404000, 0x00404000, 0x00404000, 0x00404000, 0x00404000, 0x00404000,\n    0x00404000, 0x00404000, 0x00404000, 0x00404000, 0x00404000, 0x00404000,\n    0x00404000, 0x00404000, 0x00404000, 0x00404000, 0x40404000, 0x40404000,\n    0x40404000, 0x40404000, 0x40404000, 0x40404000, 0x40404000, 0x40404000,\n    0x40404000, 0x40404000, 0x40404000, 0x40404000, 0x40404000, 0x40404000,\n    0x40404000, 0x40404000, 0x00000040, 0x00000040, 0x00000040, 0x00000040,\n    0x00000040, 0x00000040, 0x00000040, 0x00000040, 0x00000040, 0x00000040,\n    0x00000040, 0x00000040, 0x00000040, 0x00000040, 0x00000040, 0x00000040,\n    0x40000040, 0x40000040, 0x40000040, 0x40000040, 0x40000040, 0x40000040,\n    0x40000040, 0x40000040, 0x40000040, 0x40000040, 0x40000040, 0x40000040,\n    0x40000040, 0x40000040, 0x40000040, 0x40000040, 0x00400040, 0x00400040,\n    0x00400040, 0x00400040, 0x00400040, 0x00400040, 0x00400040, 0x00400040,\n    0x00400040, 0x00400040, 0x00400040, 0x00400040, 0x00400040, 0x00400040,\n    0x00400040, 0x00400040, 0x40400040, 0x40400040, 0x40400040, 0x40400040,\n    0x40400040, 0x40400040, 0x40400040, 0x40400040, 0x40400040, 0x40400040,\n    0x40400040, 0x40400040, 0x40400040, 0x40400040, 0x40400040, 0x40400040,\n    0x00004040, 0x00004040, 0x00004040, 0x00004040, 0x00004040, 0x00004040,\n    0x00004040, 0x00004040, 0x00004040, 0x00004040, 0x00004040, 0x00004040,\n    0x00004040, 0x00004040, 0x00004040, 0x00004040, 0x40004040, 0x40004040,\n    0x40004040, 0x40004040, 0x40004040, 0x40004040, 0x40004040, 0x40004040,\n    0x40004040, 0x40004040, 0x40004040, 0x40004040, 0x40004040, 0x40004040,\n    0x40004040, 0x40004040, 0x00404040, 0x00404040, 0x00404040, 0x00404040,\n    0x00404040, 0x00404040, 0x00404040, 0x00404040, 0x00404040, 0x00404040,\n    0x00404040, 0x00404040, 0x00404040, 0x00404040, 0x00404040, 0x00404040,\n    0x40404040, 0x40404040, 0x40404040, 0x40404040, 0x40404040, 0x40404040,\n    0x40404040, 0x40404040, 0x40404040, 0x40404040, 0x40404040, 0x40404040,\n    0x40404040, 0x40404040, 0x40404040, 0x40404040,\n  },\n  {\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x10000000, 0x10000000,\n    0x10000000, 0x10000000, 0x10000000, 0x10000000, 0x10000000, 0x10000000,\n    0x10000000, 0x10000000, 0x10000000, 0x10000000, 0x10000000, 0x10000000,\n    0x10000000, 0x10000000, 0x00100000, 0x00100000, 0x00100000, 0x00100000,\n    0x00100000, 0x00100000, 0x00100000, 0x00100000, 0x00100000, 0x00100000,\n    0x00100000, 0x00100000, 0x00100000, 0x00100000, 0x00100000, 0x00100000,\n    0x10100000, 0x10100000, 0x10100000, 0x10100000, 0x10100000, 0x10100000,\n    0x10100000, 0x10100000, 0x10100000, 0x10100000, 0x10100000, 0x10100000,\n    0x10100000, 0x10100000, 0x10100000, 0x10100000, 0x00001000, 0x00001000,\n    0x00001000, 0x00001000, 0x00001000, 0x00001000, 0x00001000, 0x00001000,\n    0x00001000, 0x00001000, 0x00001000, 0x00001000, 0x00001000, 0x00001000,\n    0x00001000, 0x00001000, 0x10001000, 0x10001000, 0x10001000, 0x10001000,\n    0x10001000, 0x10001000, 0x10001000, 0x10001000, 0x10001000, 0x10001000,\n    0x10001000, 0x10001000, 0x10001000, 0x10001000, 0x10001000, 0x10001000,\n    0x00101000, 0x00101000, 0x00101000, 0x00101000, 0x00101000, 0x00101000,\n    0x00101000, 0x00101000, 0x00101000, 0x00101000, 0x00101000, 0x00101000,\n    0x00101000, 0x00101000, 0x00101000, 0x00101000, 0x10101000, 0x10101000,\n    0x10101000, 0x10101000, 0x10101000, 0x10101000, 0x10101000, 0x10101000,\n    0x10101000, 0x10101000, 0x10101000, 0x10101000, 0x10101000, 0x10101000,\n    0x10101000, 0x10101000, 0x00000010, 0x00000010, 0x00000010, 0x00000010,\n    0x00000010, 0x00000010, 0x00000010, 0x00000010, 0x00000010, 0x00000010,\n    0x00000010, 0x00000010, 0x00000010, 0x00000010, 0x00000010, 0x00000010,\n    0x10000010, 0x10000010, 0x10000010, 0x10000010, 0x10000010, 0x10000010,\n    0x10000010, 0x10000010, 0x10000010, 0x10000010, 0x10000010, 0x10000010,\n    0x10000010, 0x10000010, 0x10000010, 0x10000010, 0x00100010, 0x00100010,\n    0x00100010, 0x00100010, 0x00100010, 0x00100010, 0x00100010, 0x00100010,\n    0x00100010, 0x00100010, 0x00100010, 0x00100010, 0x00100010, 0x00100010,\n    0x00100010, 0x00100010, 0x10100010, 0x10100010, 0x10100010, 0x10100010,\n    0x10100010, 0x10100010, 0x10100010, 0x10100010, 0x10100010, 0x10100010,\n    0x10100010, 0x10100010, 0x10100010, 0x10100010, 0x10100010, 0x10100010,\n    0x00001010, 0x00001010, 0x00001010, 0x00001010, 0x00001010, 0x00001010,\n    0x00001010, 0x00001010, 0x00001010, 0x00001010, 0x00001010, 0x00001010,\n    0x00001010, 0x00001010, 0x00001010, 0x00001010, 0x10001010, 0x10001010,\n    0x10001010, 0x10001010, 0x10001010, 0x10001010, 0x10001010, 0x10001010,\n    0x10001010, 0x10001010, 0x10001010, 0x10001010, 0x10001010, 0x10001010,\n    0x10001010, 0x10001010, 0x00101010, 0x00101010, 0x00101010, 0x00101010,\n    0x00101010, 0x00101010, 0x00101010, 0x00101010, 0x00101010, 0x00101010,\n    0x00101010, 0x00101010, 0x00101010, 0x00101010, 0x00101010, 0x00101010,\n    0x10101010, 0x10101010, 0x10101010, 0x10101010, 0x10101010, 0x10101010,\n    0x10101010, 0x10101010, 0x10101010, 0x10101010, 0x10101010, 0x10101010,\n    0x10101010, 0x10101010, 0x10101010, 0x10101010,\n  },\n  {\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x04000000, 0x04000000,\n    0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000,\n    0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000,\n    0x04000000, 0x04000000, 0x00040000, 0x00040000, 0x00040000, 0x00040000,\n    0x00040000, 0x00040000, 0x00040000, 0x00040000, 0x00040000, 0x00040000,\n    0x00040000, 0x00040000, 0x00040000, 0x00040000, 0x00040000, 0x00040000,\n    0x04040000, 0x04040000, 0x04040000, 0x04040000, 0x04040000, 0x04040000,\n    0x04040000, 0x04040000, 0x04040000, 0x04040000, 0x04040000, 0x04040000,\n    0x04040000, 0x04040000, 0x04040000, 0x04040000, 0x00000400, 0x00000400,\n    0x00000400, 0x00000400, 0x00000400, 0x00000400, 0x00000400, 0x00000400,\n    0x00000400, 0x00000400, 0x00000400, 0x00000400, 0x00000400, 0x00000400,\n    0x00000400, 0x00000400, 0x04000400, 0x04000400, 0x04000400, 0x04000400,\n    0x04000400, 0x04000400, 0x04000400, 0x04000400, 0x04000400, 0x04000400,\n    0x04000400, 0x04000400, 0x04000400, 0x04000400, 0x04000400, 0x04000400,\n    0x00040400, 0x00040400, 0x00040400, 0x00040400, 0x00040400, 0x00040400,\n    0x00040400, 0x00040400, 0x00040400, 0x00040400, 0x00040400, 0x00040400,\n    0x00040400, 0x00040400, 0x00040400, 0x00040400, 0x04040400, 0x04040400,\n    0x04040400, 0x04040400, 0x04040400, 0x04040400, 0x04040400, 0x04040400,\n    0x04040400, 0x04040400, 0x04040400, 0x04040400, 0x04040400, 0x04040400,\n    0x04040400, 0x04040400, 0x00000004, 0x00000004, 0x00000004, 0x00000004,\n    0x00000004, 0x00000004, 0x00000004, 0x00000004, 0x00000004, 0x00000004,\n    0x00000004, 0x00000004, 0x00000004, 0x00000004, 0x00000004, 0x00000004,\n    0x04000004, 0x04000004, 0x04000004, 0x04000004, 0x04000004, 0x04000004,\n    0x04000004, 0x04000004, 0x04000004, 0x04000004, 0x04000004, 0x04000004,\n    0x04000004, 0x04000004, 0x04000004, 0x04000004, 0x00040004, 0x00040004,\n    0x00040004, 0x00040004, 0x00040004, 0x00040004, 0x00040004, 0x00040004,\n    0x00040004, 0x00040004, 0x00040004, 0x00040004, 0x00040004, 0x00040004,\n    0x00040004, 0x00040004, 0x04040004, 0x04040004, 0x04040004, 0x04040004,\n    0x04040004, 0x04040004, 0x04040004, 0x04040004, 0x04040004, 0x04040004,\n    0x04040004, 0x04040004, 0x04040004, 0x04040004, 0x04040004, 0x04040004,\n    0x00000404, 0x00000404, 0x00000404, 0x00000404, 0x00000404, 0x00000404,\n    0x00000404, 0x00000404, 0x00000404, 0x00000404, 0x00000404, 0x00000404,\n    0x00000404, 0x00000404, 0x00000404, 0x00000404, 0x04000404, 0x04000404,\n    0x04000404, 0x04000404, 0x04000404, 0x04000404, 0x04000404, 0x04000404,\n    0x04000404, 0x04000404, 0x04000404, 0x04000404, 0x04000404, 0x04000404,\n    0x04000404, 0x04000404, 0x00040404, 0x00040404, 0x00040404, 0x00040404,\n    0x00040404, 0x00040404, 0x00040404, 0x00040404, 0x00040404, 0x00040404,\n    0x00040404, 0x00040404, 0x00040404, 0x00040404, 0x00040404, 0x00040404,\n    0x04040404, 0x04040404, 0x04040404, 0x04040404, 0x04040404, 0x04040404,\n    0x04040404, 0x04040404, 0x04040404, 0x04040404, 0x04040404, 0x04040404,\n    0x04040404, 0x04040404, 0x04040404, 0x04040404,\n  },\n  {\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x01000000, 0x01000000,\n    0x01000000, 0x01000000, 0x01000000, 0x01000000, 0x01000000, 0x01000000,\n    0x01000000, 0x01000000, 0x01000000, 0x01000000, 0x01000000, 0x01000000,\n    0x01000000, 0x01000000, 0x00010000, 0x00010000, 0x00010000, 0x00010000,\n    0x00010000, 0x00010000, 0x00010000, 0x00010000, 0x00010000, 0x00010000,\n    0x00010000, 0x00010000, 0x00010000, 0x00010000, 0x00010000, 0x00010000,\n    0x01010000, 0x01010000, 0x01010000, 0x01010000, 0x01010000, 0x01010000,\n    0x01010000, 0x01010000, 0x01010000, 0x01010000, 0x01010000, 0x01010000,\n    0x01010000, 0x01010000, 0x01010000, 0x01010000, 0x00000100, 0x00000100,\n    0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100,\n    0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100,\n    0x00000100, 0x00000100, 0x01000100, 0x01000100, 0x01000100, 0x01000100,\n    0x01000100, 0x01000100, 0x01000100, 0x01000100, 0x01000100, 0x01000100,\n    0x01000100, 0x01000100, 0x01000100, 0x01000100, 0x01000100, 0x01000100,\n    0x00010100, 0x00010100, 0x00010100, 0x00010100, 0x00010100, 0x00010100,\n    0x00010100, 0x00010100, 0x00010100, 0x00010100, 0x00010100, 0x00010100,\n    0x00010100, 0x00010100, 0x00010100, 0x00010100, 0x01010100, 0x01010100,\n    0x01010100, 0x01010100, 0x01010100, 0x01010100, 0x01010100, 0x01010100,\n    0x01010100, 0x01010100, 0x01010100, 0x01010100, 0x01010100, 0x01010100,\n    0x01010100, 0x01010100, 0x00000001, 0x00000001, 0x00000001, 0x00000001,\n    0x00000001, 0x00000001, 0x00000001, 0x00000001, 0x00000001, 0x00000001,\n    0x00000001, 0x00000001, 0x00000001, 0x00000001, 0x00000001, 0x00000001,\n    0x01000001, 0x01000001, 0x01000001, 0x01000001, 0x01000001, 0x01000001,\n    0x01000001, 0x01000001, 0x01000001, 0x01000001, 0x01000001, 0x01000001,\n    0x01000001, 0x01000001, 0x01000001, 0x01000001, 0x00010001, 0x00010001,\n    0x00010001, 0x00010001, 0x00010001, 0x00010001, 0x00010001, 0x00010001,\n    0x00010001, 0x00010001, 0x00010001, 0x00010001, 0x00010001, 0x00010001,\n    0x00010001, 0x00010001, 0x01010001, 0x01010001, 0x01010001, 0x01010001,\n    0x01010001, 0x01010001, 0x01010001, 0x01010001, 0x01010001, 0x01010001,\n    0x01010001, 0x01010001, 0x01010001, 0x01010001, 0x01010001, 0x01010001,\n    0x00000101, 0x00000101, 0x00000101, 0x00000101, 0x00000101, 0x00000101,\n    0x00000101, 0x00000101, 0x00000101, 0x00000101, 0x00000101, 0x00000101,\n    0x00000101, 0x00000101, 0x00000101, 0x00000101, 0x01000101, 0x01000101,\n    0x01000101, 0x01000101, 0x01000101, 0x01000101, 0x01000101, 0x01000101,\n    0x01000101, 0x01000101, 0x01000101, 0x01000101, 0x01000101, 0x01000101,\n    0x01000101, 0x01000101, 0x00010101, 0x00010101, 0x00010101, 0x00010101,\n    0x00010101, 0x00010101, 0x00010101, 0x00010101, 0x00010101, 0x00010101,\n    0x00010101, 0x00010101, 0x00010101, 0x00010101, 0x00010101, 0x00010101,\n    0x01010101, 0x01010101, 0x01010101, 0x01010101, 0x01010101, 0x01010101,\n    0x01010101, 0x01010101, 0x01010101, 0x01010101, 0x01010101, 0x01010101,\n    0x01010101, 0x01010101, 0x01010101, 0x01010101,\n  },\n  {\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x80000000, 0x80000000,\n    0x80000000, 0x80000000, 0x80000000, 0x80000000, 0x80000000, 0x80000000,\n    0x80000000, 0x80000000, 0x80000000, 0x80000000, 0x80000000, 0x80000000,\n    0x80000000, 0x80000000, 0x00800000, 0x00800000, 0x00800000, 0x00800000,\n    0x00800000, 0x00800000, 0x00800000, 0x00800000, 0x00800000, 0x00800000,\n    0x00800000, 0x00800000, 0x00800000, 0x00800000, 0x00800000, 0x00800000,\n    0x80800000, 0x80800000, 0x80800000, 0x80800000, 0x80800000, 0x80800000,\n    0x80800000, 0x80800000, 0x80800000, 0x80800000, 0x80800000, 0x80800000,\n    0x80800000, 0x80800000, 0x80800000, 0x80800000, 0x00008000, 0x00008000,\n    0x00008000, 0x00008000, 0x00008000, 0x00008000, 0x00008000, 0x00008000,\n    0x00008000, 0x00008000, 0x00008000, 0x00008000, 0x00008000, 0x00008000,\n    0x00008000, 0x00008000, 0x80008000, 0x80008000, 0x80008000, 0x80008000,\n    0x80008000, 0x80008000, 0x80008000, 0x80008000, 0x80008000, 0x80008000,\n    0x80008000, 0x80008000, 0x80008000, 0x80008000, 0x80008000, 0x80008000,\n    0x00808000, 0x00808000, 0x00808000, 0x00808000, 0x00808000, 0x00808000,\n    0x00808000, 0x00808000, 0x00808000, 0x00808000, 0x00808000, 0x00808000,\n    0x00808000, 0x00808000, 0x00808000, 0x00808000, 0x80808000, 0x80808000,\n    0x80808000, 0x80808000, 0x80808000, 0x80808000, 0x80808000, 0x80808000,\n    0x80808000, 0x80808000, 0x80808000, 0x80808000, 0x80808000, 0x80808000,\n    0x80808000, 0x80808000, 0x00000080, 0x00000080, 0x00000080, 0x00000080,\n    0x00000080, 0x00000080, 0x00000080, 0x00000080, 0x00000080, 0x00000080,\n    0x00000080, 0x00000080, 0x00000080, 0x00000080, 0x00000080, 0x00000080,\n    0x80000080, 0x80000080, 0x80000080, 0x80000080, 0x80000080, 0x80000080,\n    0x80000080, 0x80000080, 0x80000080, 0x80000080, 0x80000080, 0x80000080,\n    0x80000080, 0x80000080, 0x80000080, 0x80000080, 0x00800080, 0x00800080,\n    0x00800080, 0x00800080, 0x00800080, 0x00800080, 0x00800080, 0x00800080,\n    0x00800080, 0x00800080, 0x00800080, 0x00800080, 0x00800080, 0x00800080,\n    0x00800080, 0x00800080, 0x80800080, 0x80800080, 0x80800080, 0x80800080,\n    0x80800080, 0x80800080, 0x80800080, 0x80800080, 0x80800080, 0x80800080,\n    0x80800080, 0x80800080, 0x80800080, 0x80800080, 0x80800080, 0x80800080,\n    0x00008080, 0x00008080, 0x00008080, 0x00008080, 0x00008080, 0x00008080,\n    0x00008080, 0x00008080, 0x00008080, 0x00008080, 0x00008080, 0x00008080,\n    0x00008080, 0x00008080, 0x00008080, 0x00008080, 0x80008080, 0x80008080,\n    0x80008080, 0x80008080, 0x80008080, 0x80008080, 0x80008080, 0x80008080,\n    0x80008080, 0x80008080, 0x80008080, 0x80008080, 0x80008080, 0x80008080,\n    0x80008080, 0x80008080, 0x00808080, 0x00808080, 0x00808080, 0x00808080,\n    0x00808080, 0x00808080, 0x00808080, 0x00808080, 0x00808080, 0x00808080,\n    0x00808080, 0x00808080, 0x00808080, 0x00808080, 0x00808080, 0x00808080,\n    0x80808080, 0x80808080, 0x80808080, 0x80808080, 0x80808080, 0x80808080,\n    0x80808080, 0x80808080, 0x80808080, 0x80808080, 0x80808080, 0x80808080,\n    0x80808080, 0x80808080, 0x80808080, 0x80808080,\n  },\n  {\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x20000000, 0x20000000,\n    0x20000000, 0x20000000, 0x20000000, 0x20000000, 0x20000000, 0x20000000,\n    0x20000000, 0x20000000, 0x20000000, 0x20000000, 0x20000000, 0x20000000,\n    0x20000000, 0x20000000, 0x00200000, 0x00200000, 0x00200000, 0x00200000,\n    0x00200000, 0x00200000, 0x00200000, 0x00200000, 0x00200000, 0x00200000,\n    0x00200000, 0x00200000, 0x00200000, 0x00200000, 0x00200000, 0x00200000,\n    0x20200000, 0x20200000, 0x20200000, 0x20200000, 0x20200000, 0x20200000,\n    0x20200000, 0x20200000, 0x20200000, 0x20200000, 0x20200000, 0x20200000,\n    0x20200000, 0x20200000, 0x20200000, 0x20200000, 0x00002000, 0x00002000,\n    0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000,\n    0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000,\n    0x00002000, 0x00002000, 0x20002000, 0x20002000, 0x20002000, 0x20002000,\n    0x20002000, 0x20002000, 0x20002000, 0x20002000, 0x20002000, 0x20002000,\n    0x20002000, 0x20002000, 0x20002000, 0x20002000, 0x20002000, 0x20002000,\n    0x00202000, 0x00202000, 0x00202000, 0x00202000, 0x00202000, 0x00202000,\n    0x00202000, 0x00202000, 0x00202000, 0x00202000, 0x00202000, 0x00202000,\n    0x00202000, 0x00202000, 0x00202000, 0x00202000, 0x20202000, 0x20202000,\n    0x20202000, 0x20202000, 0x20202000, 0x20202000, 0x20202000, 0x20202000,\n    0x20202000, 0x20202000, 0x20202000, 0x20202000, 0x20202000, 0x20202000,\n    0x20202000, 0x20202000, 0x00000020, 0x00000020, 0x00000020, 0x00000020,\n    0x00000020, 0x00000020, 0x00000020, 0x00000020, 0x00000020, 0x00000020,\n    0x00000020, 0x00000020, 0x00000020, 0x00000020, 0x00000020, 0x00000020,\n    0x20000020, 0x20000020, 0x20000020, 0x20000020, 0x20000020, 0x20000020,\n    0x20000020, 0x20000020, 0x20000020, 0x20000020, 0x20000020, 0x20000020,\n    0x20000020, 0x20000020, 0x20000020, 0x20000020, 0x00200020, 0x00200020,\n    0x00200020, 0x00200020, 0x00200020, 0x00200020, 0x00200020, 0x00200020,\n    0x00200020, 0x00200020, 0x00200020, 0x00200020, 0x00200020, 0x00200020,\n    0x00200020, 0x00200020, 0x20200020, 0x20200020, 0x20200020, 0x20200020,\n    0x20200020, 0x20200020, 0x20200020, 0x20200020, 0x20200020, 0x20200020,\n    0x20200020, 0x20200020, 0x20200020, 0x20200020, 0x20200020, 0x20200020,\n    0x00002020, 0x00002020, 0x00002020, 0x00002020, 0x00002020, 0x00002020,\n    0x00002020, 0x00002020, 0x00002020, 0x00002020, 0x00002020, 0x00002020,\n    0x00002020, 0x00002020, 0x00002020, 0x00002020, 0x20002020, 0x20002020,\n    0x20002020, 0x20002020, 0x20002020, 0x20002020, 0x20002020, 0x20002020,\n    0x20002020, 0x20002020, 0x20002020, 0x20002020, 0x20002020, 0x20002020,\n    0x20002020, 0x20002020, 0x00202020, 0x00202020, 0x00202020, 0x00202020,\n    0x00202020, 0x00202020, 0x00202020, 0x00202020, 0x00202020, 0x00202020,\n    0x00202020, 0x00202020, 0x00202020, 0x00202020, 0x00202020, 0x00202020,\n    0x20202020, 0x20202020, 0x20202020, 0x20202020, 0x20202020, 0x20202020,\n    0x20202020, 0x20202020, 0x20202020, 0x20202020, 0x20202020, 0x20202020,\n    0x20202020, 0x20202020, 0x20202020, 0x20202020,\n  },\n  {\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x08000000, 0x08000000,\n    0x08000000, 0x08000000, 0x08000000, 0x08000000, 0x08000000, 0x08000000,\n    0x08000000, 0x08000000, 0x08000000, 0x08000000, 0x08000000, 0x08000000,\n    0x08000000, 0x08000000, 0x00080000, 0x00080000, 0x00080000, 0x00080000,\n    0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000,\n    0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000,\n    0x08080000, 0x08080000, 0x08080000, 0x08080000, 0x08080000, 0x08080000,\n    0x08080000, 0x08080000, 0x08080000, 0x08080000, 0x08080000, 0x08080000,\n    0x08080000, 0x08080000, 0x08080000, 0x08080000, 0x00000800, 0x00000800,\n    0x00000800, 0x00000800, 0x00000800, 0x00000800, 0x00000800, 0x00000800,\n    0x00000800, 0x00000800, 0x00000800, 0x00000800, 0x00000800, 0x00000800,\n    0x00000800, 0x00000800, 0x08000800, 0x08000800, 0x08000800, 0x08000800,\n    0x08000800, 0x08000800, 0x08000800, 0x08000800, 0x08000800, 0x08000800,\n    0x08000800, 0x08000800, 0x08000800, 0x08000800, 0x08000800, 0x08000800,\n    0x00080800, 0x00080800, 0x00080800, 0x00080800, 0x00080800, 0x00080800,\n    0x00080800, 0x00080800, 0x00080800, 0x00080800, 0x00080800, 0x00080800,\n    0x00080800, 0x00080800, 0x00080800, 0x00080800, 0x08080800, 0x08080800,\n    0x08080800, 0x08080800, 0x08080800, 0x08080800, 0x08080800, 0x08080800,\n    0x08080800, 0x08080800, 0x08080800, 0x08080800, 0x08080800, 0x08080800,\n    0x08080800, 0x08080800, 0x00000008, 0x00000008, 0x00000008, 0x00000008,\n    0x00000008, 0x00000008, 0x00000008, 0x00000008, 0x00000008, 0x00000008,\n    0x00000008, 0x00000008, 0x00000008, 0x00000008, 0x00000008, 0x00000008,\n    0x08000008, 0x08000008, 0x08000008, 0x08000008, 0x08000008, 0x08000008,\n    0x08000008, 0x08000008, 0x08000008, 0x08000008, 0x08000008, 0x08000008,\n    0x08000008, 0x08000008, 0x08000008, 0x08000008, 0x00080008, 0x00080008,\n    0x00080008, 0x00080008, 0x00080008, 0x00080008, 0x00080008, 0x00080008,\n    0x00080008, 0x00080008, 0x00080008, 0x00080008, 0x00080008, 0x00080008,\n    0x00080008, 0x00080008, 0x08080008, 0x08080008, 0x08080008, 0x08080008,\n    0x08080008, 0x08080008, 0x08080008, 0x08080008, 0x08080008, 0x08080008,\n    0x08080008, 0x08080008, 0x08080008, 0x08080008, 0x08080008, 0x08080008,\n    0x00000808, 0x00000808, 0x00000808, 0x00000808, 0x00000808, 0x00000808,\n    0x00000808, 0x00000808, 0x00000808, 0x00000808, 0x00000808, 0x00000808,\n    0x00000808, 0x00000808, 0x00000808, 0x00000808, 0x08000808, 0x08000808,\n    0x08000808, 0x08000808, 0x08000808, 0x08000808, 0x08000808, 0x08000808,\n    0x08000808, 0x08000808, 0x08000808, 0x08000808, 0x08000808, 0x08000808,\n    0x08000808, 0x08000808, 0x00080808, 0x00080808, 0x00080808, 0x00080808,\n    0x00080808, 0x00080808, 0x00080808, 0x00080808, 0x00080808, 0x00080808,\n    0x00080808, 0x00080808, 0x00080808, 0x00080808, 0x00080808, 0x00080808,\n    0x08080808, 0x08080808, 0x08080808, 0x08080808, 0x08080808, 0x08080808,\n    0x08080808, 0x08080808, 0x08080808, 0x08080808, 0x08080808, 0x08080808,\n    0x08080808, 0x08080808, 0x08080808, 0x08080808,\n  },\n  {\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x02000000, 0x02000000,\n    0x02000000, 0x02000000, 0x02000000, 0x02000000, 0x02000000, 0x02000000,\n    0x02000000, 0x02000000, 0x02000000, 0x02000000, 0x02000000, 0x02000000,\n    0x02000000, 0x02000000, 0x00020000, 0x00020000, 0x00020000, 0x00020000,\n    0x00020000, 0x00020000, 0x00020000, 0x00020000, 0x00020000, 0x00020000,\n    0x00020000, 0x00020000, 0x00020000, 0x00020000, 0x00020000, 0x00020000,\n    0x02020000, 0x02020000, 0x02020000, 0x02020000, 0x02020000, 0x02020000,\n    0x02020000, 0x02020000, 0x02020000, 0x02020000, 0x02020000, 0x02020000,\n    0x02020000, 0x02020000, 0x02020000, 0x02020000, 0x00000200, 0x00000200,\n    0x00000200, 0x00000200, 0x00000200, 0x00000200, 0x00000200, 0x00000200,\n    0x00000200, 0x00000200, 0x00000200, 0x00000200, 0x00000200, 0x00000200,\n    0x00000200, 0x00000200, 0x02000200, 0x02000200, 0x02000200, 0x02000200,\n    0x02000200, 0x02000200, 0x02000200, 0x02000200, 0x02000200, 0x02000200,\n    0x02000200, 0x02000200, 0x02000200, 0x02000200, 0x02000200, 0x02000200,\n    0x00020200, 0x00020200, 0x00020200, 0x00020200, 0x00020200, 0x00020200,\n    0x00020200, 0x00020200, 0x00020200, 0x00020200, 0x00020200, 0x00020200,\n    0x00020200, 0x00020200, 0x00020200, 0x00020200, 0x02020200, 0x02020200,\n    0x02020200, 0x02020200, 0x02020200, 0x02020200, 0x02020200, 0x02020200,\n    0x02020200, 0x02020200, 0x02020200, 0x02020200, 0x02020200, 0x02020200,\n    0x02020200, 0x02020200, 0x00000002, 0x00000002, 0x00000002, 0x00000002,\n    0x00000002, 0x00000002, 0x00000002, 0x00000002, 0x00000002, 0x00000002,\n    0x00000002, 0x00000002, 0x00000002, 0x00000002, 0x00000002, 0x00000002,\n    0x02000002, 0x02000002, 0x02000002, 0x02000002, 0x02000002, 0x02000002,\n    0x02000002, 0x02000002, 0x02000002, 0x02000002, 0x02000002, 0x02000002,\n    0x02000002, 0x02000002, 0x02000002, 0x02000002, 0x00020002, 0x00020002,\n    0x00020002, 0x00020002, 0x00020002, 0x00020002, 0x00020002, 0x00020002,\n    0x00020002, 0x00020002, 0x00020002, 0x00020002, 0x00020002, 0x00020002,\n    0x00020002, 0x00020002, 0x02020002, 0x02020002, 0x02020002, 0x02020002,\n    0x02020002, 0x02020002, 0x02020002, 0x02020002, 0x02020002, 0x02020002,\n    0x02020002, 0x02020002, 0x02020002, 0x02020002, 0x02020002, 0x02020002,\n    0x00000202, 0x00000202, 0x00000202, 0x00000202, 0x00000202, 0x00000202,\n    0x00000202, 0x00000202, 0x00000202, 0x00000202, 0x00000202, 0x00000202,\n    0x00000202, 0x00000202, 0x00000202, 0x00000202, 0x02000202, 0x02000202,\n    0x02000202, 0x02000202, 0x02000202, 0x02000202, 0x02000202, 0x02000202,\n    0x02000202, 0x02000202, 0x02000202, 0x02000202, 0x02000202, 0x02000202,\n    0x02000202, 0x02000202, 0x00020202, 0x00020202, 0x00020202, 0x00020202,\n    0x00020202, 0x00020202, 0x00020202, 0x00020202, 0x00020202, 0x00020202,\n    0x00020202, 0x00020202, 0x00020202, 0x00020202, 0x00020202, 0x00020202,\n    0x02020202, 0x02020202, 0x02020202, 0x02020202, 0x02020202, 0x02020202,\n    0x02020202, 0x02020202, 0x02020202, 0x02020202, 0x02020202, 0x02020202,\n    0x02020202, 0x02020202, 0x02020202, 0x02020202,\n  },\n};\n\nconst uint32_t key_perm_maskl[8][128] =\n{\n  {\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000010, 0x00000010,\n    0x00000010, 0x00000010, 0x00000010, 0x00000010, 0x00000010, 0x00000010,\n    0x00000010, 0x00000010, 0x00000010, 0x00000010, 0x00000010, 0x00000010,\n    0x00000010, 0x00000010, 0x00001000, 0x00001000, 0x00001000, 0x00001000,\n    0x00001000, 0x00001000, 0x00001000, 0x00001000, 0x00001000, 0x00001000,\n    0x00001000, 0x00001000, 0x00001000, 0x00001000, 0x00001000, 0x00001000,\n    0x00001010, 0x00001010, 0x00001010, 0x00001010, 0x00001010, 0x00001010,\n    0x00001010, 0x00001010, 0x00001010, 0x00001010, 0x00001010, 0x00001010,\n    0x00001010, 0x00001010, 0x00001010, 0x00001010, 0x00100000, 0x00100000,\n    0x00100000, 0x00100000, 0x00100000, 0x00100000, 0x00100000, 0x00100000,\n    0x00100000, 0x00100000, 0x00100000, 0x00100000, 0x00100000, 0x00100000,\n    0x00100000, 0x00100000, 0x00100010, 0x00100010, 0x00100010, 0x00100010,\n    0x00100010, 0x00100010, 0x00100010, 0x00100010, 0x00100010, 0x00100010,\n    0x00100010, 0x00100010, 0x00100010, 0x00100010, 0x00100010, 0x00100010,\n    0x00101000, 0x00101000, 0x00101000, 0x00101000, 0x00101000, 0x00101000,\n    0x00101000, 0x00101000, 0x00101000, 0x00101000, 0x00101000, 0x00101000,\n    0x00101000, 0x00101000, 0x00101000, 0x00101000, 0x00101010, 0x00101010,\n    0x00101010, 0x00101010, 0x00101010, 0x00101010, 0x00101010, 0x00101010,\n    0x00101010, 0x00101010, 0x00101010, 0x00101010, 0x00101010, 0x00101010,\n    0x00101010, 0x00101010,\n  },\n  {\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000020, 0x00000020,\n    0x00000020, 0x00000020, 0x00000020, 0x00000020, 0x00000020, 0x00000020,\n    0x00000020, 0x00000020, 0x00000020, 0x00000020, 0x00000020, 0x00000020,\n    0x00000020, 0x00000020, 0x00002000, 0x00002000, 0x00002000, 0x00002000,\n    0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000,\n    0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000,\n    0x00002020, 0x00002020, 0x00002020, 0x00002020, 0x00002020, 0x00002020,\n    0x00002020, 0x00002020, 0x00002020, 0x00002020, 0x00002020, 0x00002020,\n    0x00002020, 0x00002020, 0x00002020, 0x00002020, 0x00200000, 0x00200000,\n    0x00200000, 0x00200000, 0x00200000, 0x00200000, 0x00200000, 0x00200000,\n    0x00200000, 0x00200000, 0x00200000, 0x00200000, 0x00200000, 0x00200000,\n    0x00200000, 0x00200000, 0x00200020, 0x00200020, 0x00200020, 0x00200020,\n    0x00200020, 0x00200020, 0x00200020, 0x00200020, 0x00200020, 0x00200020,\n    0x00200020, 0x00200020, 0x00200020, 0x00200020, 0x00200020, 0x00200020,\n    0x00202000, 0x00202000, 0x00202000, 0x00202000, 0x00202000, 0x00202000,\n    0x00202000, 0x00202000, 0x00202000, 0x00202000, 0x00202000, 0x00202000,\n    0x00202000, 0x00202000, 0x00202000, 0x00202000, 0x00202020, 0x00202020,\n    0x00202020, 0x00202020, 0x00202020, 0x00202020, 0x00202020, 0x00202020,\n    0x00202020, 0x00202020, 0x00202020, 0x00202020, 0x00202020, 0x00202020,\n    0x00202020, 0x00202020,\n  },\n  {\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000040, 0x00000040,\n    0x00000040, 0x00000040, 0x00000040, 0x00000040, 0x00000040, 0x00000040,\n    0x00000040, 0x00000040, 0x00000040, 0x00000040, 0x00000040, 0x00000040,\n    0x00000040, 0x00000040, 0x00004000, 0x00004000, 0x00004000, 0x00004000,\n    0x00004000, 0x00004000, 0x00004000, 0x00004000, 0x00004000, 0x00004000,\n    0x00004000, 0x00004000, 0x00004000, 0x00004000, 0x00004000, 0x00004000,\n    0x00004040, 0x00004040, 0x00004040, 0x00004040, 0x00004040, 0x00004040,\n    0x00004040, 0x00004040, 0x00004040, 0x00004040, 0x00004040, 0x00004040,\n    0x00004040, 0x00004040, 0x00004040, 0x00004040, 0x00400000, 0x00400000,\n    0x00400000, 0x00400000, 0x00400000, 0x00400000, 0x00400000, 0x00400000,\n    0x00400000, 0x00400000, 0x00400000, 0x00400000, 0x00400000, 0x00400000,\n    0x00400000, 0x00400000, 0x00400040, 0x00400040, 0x00400040, 0x00400040,\n    0x00400040, 0x00400040, 0x00400040, 0x00400040, 0x00400040, 0x00400040,\n    0x00400040, 0x00400040, 0x00400040, 0x00400040, 0x00400040, 0x00400040,\n    0x00404000, 0x00404000, 0x00404000, 0x00404000, 0x00404000, 0x00404000,\n    0x00404000, 0x00404000, 0x00404000, 0x00404000, 0x00404000, 0x00404000,\n    0x00404000, 0x00404000, 0x00404000, 0x00404000, 0x00404040, 0x00404040,\n    0x00404040, 0x00404040, 0x00404040, 0x00404040, 0x00404040, 0x00404040,\n    0x00404040, 0x00404040, 0x00404040, 0x00404040, 0x00404040, 0x00404040,\n    0x00404040, 0x00404040,\n  },\n  {\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000080, 0x00000080,\n    0x00000080, 0x00000080, 0x00000080, 0x00000080, 0x00000080, 0x00000080,\n    0x00000080, 0x00000080, 0x00000080, 0x00000080, 0x00000080, 0x00000080,\n    0x00000080, 0x00000080, 0x00008000, 0x00008000, 0x00008000, 0x00008000,\n    0x00008000, 0x00008000, 0x00008000, 0x00008000, 0x00008000, 0x00008000,\n    0x00008000, 0x00008000, 0x00008000, 0x00008000, 0x00008000, 0x00008000,\n    0x00008080, 0x00008080, 0x00008080, 0x00008080, 0x00008080, 0x00008080,\n    0x00008080, 0x00008080, 0x00008080, 0x00008080, 0x00008080, 0x00008080,\n    0x00008080, 0x00008080, 0x00008080, 0x00008080, 0x00800000, 0x00800000,\n    0x00800000, 0x00800000, 0x00800000, 0x00800000, 0x00800000, 0x00800000,\n    0x00800000, 0x00800000, 0x00800000, 0x00800000, 0x00800000, 0x00800000,\n    0x00800000, 0x00800000, 0x00800080, 0x00800080, 0x00800080, 0x00800080,\n    0x00800080, 0x00800080, 0x00800080, 0x00800080, 0x00800080, 0x00800080,\n    0x00800080, 0x00800080, 0x00800080, 0x00800080, 0x00800080, 0x00800080,\n    0x00808000, 0x00808000, 0x00808000, 0x00808000, 0x00808000, 0x00808000,\n    0x00808000, 0x00808000, 0x00808000, 0x00808000, 0x00808000, 0x00808000,\n    0x00808000, 0x00808000, 0x00808000, 0x00808000, 0x00808080, 0x00808080,\n    0x00808080, 0x00808080, 0x00808080, 0x00808080, 0x00808080, 0x00808080,\n    0x00808080, 0x00808080, 0x00808080, 0x00808080, 0x00808080, 0x00808080,\n    0x00808080, 0x00808080,\n  },\n  {\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x00000001,\n    0x00000001, 0x00000001, 0x00000001, 0x00000001, 0x00000100, 0x00000100,\n    0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100,\n    0x00000101, 0x00000101, 0x00000101, 0x00000101, 0x00000101, 0x00000101,\n    0x00000101, 0x00000101, 0x00010000, 0x00010000, 0x00010000, 0x00010000,\n    0x00010000, 0x00010000, 0x00010000, 0x00010000, 0x00010001, 0x00010001,\n    0x00010001, 0x00010001, 0x00010001, 0x00010001, 0x00010001, 0x00010001,\n    0x00010100, 0x00010100, 0x00010100, 0x00010100, 0x00010100, 0x00010100,\n    0x00010100, 0x00010100, 0x00010101, 0x00010101, 0x00010101, 0x00010101,\n    0x00010101, 0x00010101, 0x00010101, 0x00010101, 0x01000000, 0x01000000,\n    0x01000000, 0x01000000, 0x01000000, 0x01000000, 0x01000000, 0x01000000,\n    0x01000001, 0x01000001, 0x01000001, 0x01000001, 0x01000001, 0x01000001,\n    0x01000001, 0x01000001, 0x01000100, 0x01000100, 0x01000100, 0x01000100,\n    0x01000100, 0x01000100, 0x01000100, 0x01000100, 0x01000101, 0x01000101,\n    0x01000101, 0x01000101, 0x01000101, 0x01000101, 0x01000101, 0x01000101,\n    0x01010000, 0x01010000, 0x01010000, 0x01010000, 0x01010000, 0x01010000,\n    0x01010000, 0x01010000, 0x01010001, 0x01010001, 0x01010001, 0x01010001,\n    0x01010001, 0x01010001, 0x01010001, 0x01010001, 0x01010100, 0x01010100,\n    0x01010100, 0x01010100, 0x01010100, 0x01010100, 0x01010100, 0x01010100,\n    0x01010101, 0x01010101, 0x01010101, 0x01010101, 0x01010101, 0x01010101,\n    0x01010101, 0x01010101,\n  },\n  {\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000002, 0x00000002, 0x00000002, 0x00000002,\n    0x00000002, 0x00000002, 0x00000002, 0x00000002, 0x00000200, 0x00000200,\n    0x00000200, 0x00000200, 0x00000200, 0x00000200, 0x00000200, 0x00000200,\n    0x00000202, 0x00000202, 0x00000202, 0x00000202, 0x00000202, 0x00000202,\n    0x00000202, 0x00000202, 0x00020000, 0x00020000, 0x00020000, 0x00020000,\n    0x00020000, 0x00020000, 0x00020000, 0x00020000, 0x00020002, 0x00020002,\n    0x00020002, 0x00020002, 0x00020002, 0x00020002, 0x00020002, 0x00020002,\n    0x00020200, 0x00020200, 0x00020200, 0x00020200, 0x00020200, 0x00020200,\n    0x00020200, 0x00020200, 0x00020202, 0x00020202, 0x00020202, 0x00020202,\n    0x00020202, 0x00020202, 0x00020202, 0x00020202, 0x02000000, 0x02000000,\n    0x02000000, 0x02000000, 0x02000000, 0x02000000, 0x02000000, 0x02000000,\n    0x02000002, 0x02000002, 0x02000002, 0x02000002, 0x02000002, 0x02000002,\n    0x02000002, 0x02000002, 0x02000200, 0x02000200, 0x02000200, 0x02000200,\n    0x02000200, 0x02000200, 0x02000200, 0x02000200, 0x02000202, 0x02000202,\n    0x02000202, 0x02000202, 0x02000202, 0x02000202, 0x02000202, 0x02000202,\n    0x02020000, 0x02020000, 0x02020000, 0x02020000, 0x02020000, 0x02020000,\n    0x02020000, 0x02020000, 0x02020002, 0x02020002, 0x02020002, 0x02020002,\n    0x02020002, 0x02020002, 0x02020002, 0x02020002, 0x02020200, 0x02020200,\n    0x02020200, 0x02020200, 0x02020200, 0x02020200, 0x02020200, 0x02020200,\n    0x02020202, 0x02020202, 0x02020202, 0x02020202, 0x02020202, 0x02020202,\n    0x02020202, 0x02020202,\n  },\n  {\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000004, 0x00000004, 0x00000004, 0x00000004,\n    0x00000004, 0x00000004, 0x00000004, 0x00000004, 0x00000400, 0x00000400,\n    0x00000400, 0x00000400, 0x00000400, 0x00000400, 0x00000400, 0x00000400,\n    0x00000404, 0x00000404, 0x00000404, 0x00000404, 0x00000404, 0x00000404,\n    0x00000404, 0x00000404, 0x00040000, 0x00040000, 0x00040000, 0x00040000,\n    0x00040000, 0x00040000, 0x00040000, 0x00040000, 0x00040004, 0x00040004,\n    0x00040004, 0x00040004, 0x00040004, 0x00040004, 0x00040004, 0x00040004,\n    0x00040400, 0x00040400, 0x00040400, 0x00040400, 0x00040400, 0x00040400,\n    0x00040400, 0x00040400, 0x00040404, 0x00040404, 0x00040404, 0x00040404,\n    0x00040404, 0x00040404, 0x00040404, 0x00040404, 0x04000000, 0x04000000,\n    0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000,\n    0x04000004, 0x04000004, 0x04000004, 0x04000004, 0x04000004, 0x04000004,\n    0x04000004, 0x04000004, 0x04000400, 0x04000400, 0x04000400, 0x04000400,\n    0x04000400, 0x04000400, 0x04000400, 0x04000400, 0x04000404, 0x04000404,\n    0x04000404, 0x04000404, 0x04000404, 0x04000404, 0x04000404, 0x04000404,\n    0x04040000, 0x04040000, 0x04040000, 0x04040000, 0x04040000, 0x04040000,\n    0x04040000, 0x04040000, 0x04040004, 0x04040004, 0x04040004, 0x04040004,\n    0x04040004, 0x04040004, 0x04040004, 0x04040004, 0x04040400, 0x04040400,\n    0x04040400, 0x04040400, 0x04040400, 0x04040400, 0x04040400, 0x04040400,\n    0x04040404, 0x04040404, 0x04040404, 0x04040404, 0x04040404, 0x04040404,\n    0x04040404, 0x04040404,\n  },\n  {\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000008, 0x00000008, 0x00000008, 0x00000008,\n    0x00000008, 0x00000008, 0x00000008, 0x00000008, 0x00000800, 0x00000800,\n    0x00000800, 0x00000800, 0x00000800, 0x00000800, 0x00000800, 0x00000800,\n    0x00000808, 0x00000808, 0x00000808, 0x00000808, 0x00000808, 0x00000808,\n    0x00000808, 0x00000808, 0x00080000, 0x00080000, 0x00080000, 0x00080000,\n    0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080008, 0x00080008,\n    0x00080008, 0x00080008, 0x00080008, 0x00080008, 0x00080008, 0x00080008,\n    0x00080800, 0x00080800, 0x00080800, 0x00080800, 0x00080800, 0x00080800,\n    0x00080800, 0x00080800, 0x00080808, 0x00080808, 0x00080808, 0x00080808,\n    0x00080808, 0x00080808, 0x00080808, 0x00080808, 0x08000000, 0x08000000,\n    0x08000000, 0x08000000, 0x08000000, 0x08000000, 0x08000000, 0x08000000,\n    0x08000008, 0x08000008, 0x08000008, 0x08000008, 0x08000008, 0x08000008,\n    0x08000008, 0x08000008, 0x08000800, 0x08000800, 0x08000800, 0x08000800,\n    0x08000800, 0x08000800, 0x08000800, 0x08000800, 0x08000808, 0x08000808,\n    0x08000808, 0x08000808, 0x08000808, 0x08000808, 0x08000808, 0x08000808,\n    0x08080000, 0x08080000, 0x08080000, 0x08080000, 0x08080000, 0x08080000,\n    0x08080000, 0x08080000, 0x08080008, 0x08080008, 0x08080008, 0x08080008,\n    0x08080008, 0x08080008, 0x08080008, 0x08080008, 0x08080800, 0x08080800,\n    0x08080800, 0x08080800, 0x08080800, 0x08080800, 0x08080800, 0x08080800,\n    0x08080808, 0x08080808, 0x08080808, 0x08080808, 0x08080808, 0x08080808,\n    0x08080808, 0x08080808,\n  },\n};\n\nconst uint32_t key_perm_maskr[8][128] =\n{\n  {\n    0x00000000, 0x00100000, 0x00001000, 0x00101000, 0x00000010, 0x00100010,\n    0x00001010, 0x00101010, 0x00000001, 0x00100001, 0x00001001, 0x00101001,\n    0x00000011, 0x00100011, 0x00001011, 0x00101011, 0x00000000, 0x00100000,\n    0x00001000, 0x00101000, 0x00000010, 0x00100010, 0x00001010, 0x00101010,\n    0x00000001, 0x00100001, 0x00001001, 0x00101001, 0x00000011, 0x00100011,\n    0x00001011, 0x00101011, 0x00000000, 0x00100000, 0x00001000, 0x00101000,\n    0x00000010, 0x00100010, 0x00001010, 0x00101010, 0x00000001, 0x00100001,\n    0x00001001, 0x00101001, 0x00000011, 0x00100011, 0x00001011, 0x00101011,\n    0x00000000, 0x00100000, 0x00001000, 0x00101000, 0x00000010, 0x00100010,\n    0x00001010, 0x00101010, 0x00000001, 0x00100001, 0x00001001, 0x00101001,\n    0x00000011, 0x00100011, 0x00001011, 0x00101011, 0x00000000, 0x00100000,\n    0x00001000, 0x00101000, 0x00000010, 0x00100010, 0x00001010, 0x00101010,\n    0x00000001, 0x00100001, 0x00001001, 0x00101001, 0x00000011, 0x00100011,\n    0x00001011, 0x00101011, 0x00000000, 0x00100000, 0x00001000, 0x00101000,\n    0x00000010, 0x00100010, 0x00001010, 0x00101010, 0x00000001, 0x00100001,\n    0x00001001, 0x00101001, 0x00000011, 0x00100011, 0x00001011, 0x00101011,\n    0x00000000, 0x00100000, 0x00001000, 0x00101000, 0x00000010, 0x00100010,\n    0x00001010, 0x00101010, 0x00000001, 0x00100001, 0x00001001, 0x00101001,\n    0x00000011, 0x00100011, 0x00001011, 0x00101011, 0x00000000, 0x00100000,\n    0x00001000, 0x00101000, 0x00000010, 0x00100010, 0x00001010, 0x00101010,\n    0x00000001, 0x00100001, 0x00001001, 0x00101001, 0x00000011, 0x00100011,\n    0x00001011, 0x00101011,\n  },\n  {\n    0x00000000, 0x00200000, 0x00002000, 0x00202000, 0x00000020, 0x00200020,\n    0x00002020, 0x00202020, 0x00000002, 0x00200002, 0x00002002, 0x00202002,\n    0x00000022, 0x00200022, 0x00002022, 0x00202022, 0x00000000, 0x00200000,\n    0x00002000, 0x00202000, 0x00000020, 0x00200020, 0x00002020, 0x00202020,\n    0x00000002, 0x00200002, 0x00002002, 0x00202002, 0x00000022, 0x00200022,\n    0x00002022, 0x00202022, 0x00000000, 0x00200000, 0x00002000, 0x00202000,\n    0x00000020, 0x00200020, 0x00002020, 0x00202020, 0x00000002, 0x00200002,\n    0x00002002, 0x00202002, 0x00000022, 0x00200022, 0x00002022, 0x00202022,\n    0x00000000, 0x00200000, 0x00002000, 0x00202000, 0x00000020, 0x00200020,\n    0x00002020, 0x00202020, 0x00000002, 0x00200002, 0x00002002, 0x00202002,\n    0x00000022, 0x00200022, 0x00002022, 0x00202022, 0x00000000, 0x00200000,\n    0x00002000, 0x00202000, 0x00000020, 0x00200020, 0x00002020, 0x00202020,\n    0x00000002, 0x00200002, 0x00002002, 0x00202002, 0x00000022, 0x00200022,\n    0x00002022, 0x00202022, 0x00000000, 0x00200000, 0x00002000, 0x00202000,\n    0x00000020, 0x00200020, 0x00002020, 0x00202020, 0x00000002, 0x00200002,\n    0x00002002, 0x00202002, 0x00000022, 0x00200022, 0x00002022, 0x00202022,\n    0x00000000, 0x00200000, 0x00002000, 0x00202000, 0x00000020, 0x00200020,\n    0x00002020, 0x00202020, 0x00000002, 0x00200002, 0x00002002, 0x00202002,\n    0x00000022, 0x00200022, 0x00002022, 0x00202022, 0x00000000, 0x00200000,\n    0x00002000, 0x00202000, 0x00000020, 0x00200020, 0x00002020, 0x00202020,\n    0x00000002, 0x00200002, 0x00002002, 0x00202002, 0x00000022, 0x00200022,\n    0x00002022, 0x00202022,\n  },\n  {\n    0x00000000, 0x00400000, 0x00004000, 0x00404000, 0x00000040, 0x00400040,\n    0x00004040, 0x00404040, 0x00000004, 0x00400004, 0x00004004, 0x00404004,\n    0x00000044, 0x00400044, 0x00004044, 0x00404044, 0x00000000, 0x00400000,\n    0x00004000, 0x00404000, 0x00000040, 0x00400040, 0x00004040, 0x00404040,\n    0x00000004, 0x00400004, 0x00004004, 0x00404004, 0x00000044, 0x00400044,\n    0x00004044, 0x00404044, 0x00000000, 0x00400000, 0x00004000, 0x00404000,\n    0x00000040, 0x00400040, 0x00004040, 0x00404040, 0x00000004, 0x00400004,\n    0x00004004, 0x00404004, 0x00000044, 0x00400044, 0x00004044, 0x00404044,\n    0x00000000, 0x00400000, 0x00004000, 0x00404000, 0x00000040, 0x00400040,\n    0x00004040, 0x00404040, 0x00000004, 0x00400004, 0x00004004, 0x00404004,\n    0x00000044, 0x00400044, 0x00004044, 0x00404044, 0x00000000, 0x00400000,\n    0x00004000, 0x00404000, 0x00000040, 0x00400040, 0x00004040, 0x00404040,\n    0x00000004, 0x00400004, 0x00004004, 0x00404004, 0x00000044, 0x00400044,\n    0x00004044, 0x00404044, 0x00000000, 0x00400000, 0x00004000, 0x00404000,\n    0x00000040, 0x00400040, 0x00004040, 0x00404040, 0x00000004, 0x00400004,\n    0x00004004, 0x00404004, 0x00000044, 0x00400044, 0x00004044, 0x00404044,\n    0x00000000, 0x00400000, 0x00004000, 0x00404000, 0x00000040, 0x00400040,\n    0x00004040, 0x00404040, 0x00000004, 0x00400004, 0x00004004, 0x00404004,\n    0x00000044, 0x00400044, 0x00004044, 0x00404044, 0x00000000, 0x00400000,\n    0x00004000, 0x00404000, 0x00000040, 0x00400040, 0x00004040, 0x00404040,\n    0x00000004, 0x00400004, 0x00004004, 0x00404004, 0x00000044, 0x00400044,\n    0x00004044, 0x00404044,\n  },\n  {\n    0x00000000, 0x00800000, 0x00008000, 0x00808000, 0x00000080, 0x00800080,\n    0x00008080, 0x00808080, 0x00000008, 0x00800008, 0x00008008, 0x00808008,\n    0x00000088, 0x00800088, 0x00008088, 0x00808088, 0x00000000, 0x00800000,\n    0x00008000, 0x00808000, 0x00000080, 0x00800080, 0x00008080, 0x00808080,\n    0x00000008, 0x00800008, 0x00008008, 0x00808008, 0x00000088, 0x00800088,\n    0x00008088, 0x00808088, 0x00000000, 0x00800000, 0x00008000, 0x00808000,\n    0x00000080, 0x00800080, 0x00008080, 0x00808080, 0x00000008, 0x00800008,\n    0x00008008, 0x00808008, 0x00000088, 0x00800088, 0x00008088, 0x00808088,\n    0x00000000, 0x00800000, 0x00008000, 0x00808000, 0x00000080, 0x00800080,\n    0x00008080, 0x00808080, 0x00000008, 0x00800008, 0x00008008, 0x00808008,\n    0x00000088, 0x00800088, 0x00008088, 0x00808088, 0x00000000, 0x00800000,\n    0x00008000, 0x00808000, 0x00000080, 0x00800080, 0x00008080, 0x00808080,\n    0x00000008, 0x00800008, 0x00008008, 0x00808008, 0x00000088, 0x00800088,\n    0x00008088, 0x00808088, 0x00000000, 0x00800000, 0x00008000, 0x00808000,\n    0x00000080, 0x00800080, 0x00008080, 0x00808080, 0x00000008, 0x00800008,\n    0x00008008, 0x00808008, 0x00000088, 0x00800088, 0x00008088, 0x00808088,\n    0x00000000, 0x00800000, 0x00008000, 0x00808000, 0x00000080, 0x00800080,\n    0x00008080, 0x00808080, 0x00000008, 0x00800008, 0x00008008, 0x00808008,\n    0x00000088, 0x00800088, 0x00008088, 0x00808088, 0x00000000, 0x00800000,\n    0x00008000, 0x00808000, 0x00000080, 0x00800080, 0x00008080, 0x00808080,\n    0x00000008, 0x00800008, 0x00008008, 0x00808008, 0x00000088, 0x00800088,\n    0x00008088, 0x00808088,\n  },\n  {\n    0x00000000, 0x01000000, 0x00010000, 0x01010000, 0x00000100, 0x01000100,\n    0x00010100, 0x01010100, 0x00000000, 0x01000000, 0x00010000, 0x01010000,\n    0x00000100, 0x01000100, 0x00010100, 0x01010100, 0x00000000, 0x01000000,\n    0x00010000, 0x01010000, 0x00000100, 0x01000100, 0x00010100, 0x01010100,\n    0x00000000, 0x01000000, 0x00010000, 0x01010000, 0x00000100, 0x01000100,\n    0x00010100, 0x01010100, 0x00000000, 0x01000000, 0x00010000, 0x01010000,\n    0x00000100, 0x01000100, 0x00010100, 0x01010100, 0x00000000, 0x01000000,\n    0x00010000, 0x01010000, 0x00000100, 0x01000100, 0x00010100, 0x01010100,\n    0x00000000, 0x01000000, 0x00010000, 0x01010000, 0x00000100, 0x01000100,\n    0x00010100, 0x01010100, 0x00000000, 0x01000000, 0x00010000, 0x01010000,\n    0x00000100, 0x01000100, 0x00010100, 0x01010100, 0x00000000, 0x01000000,\n    0x00010000, 0x01010000, 0x00000100, 0x01000100, 0x00010100, 0x01010100,\n    0x00000000, 0x01000000, 0x00010000, 0x01010000, 0x00000100, 0x01000100,\n    0x00010100, 0x01010100, 0x00000000, 0x01000000, 0x00010000, 0x01010000,\n    0x00000100, 0x01000100, 0x00010100, 0x01010100, 0x00000000, 0x01000000,\n    0x00010000, 0x01010000, 0x00000100, 0x01000100, 0x00010100, 0x01010100,\n    0x00000000, 0x01000000, 0x00010000, 0x01010000, 0x00000100, 0x01000100,\n    0x00010100, 0x01010100, 0x00000000, 0x01000000, 0x00010000, 0x01010000,\n    0x00000100, 0x01000100, 0x00010100, 0x01010100, 0x00000000, 0x01000000,\n    0x00010000, 0x01010000, 0x00000100, 0x01000100, 0x00010100, 0x01010100,\n    0x00000000, 0x01000000, 0x00010000, 0x01010000, 0x00000100, 0x01000100,\n    0x00010100, 0x01010100,\n  },\n  {\n    0x00000000, 0x02000000, 0x00020000, 0x02020000, 0x00000200, 0x02000200,\n    0x00020200, 0x02020200, 0x00000000, 0x02000000, 0x00020000, 0x02020000,\n    0x00000200, 0x02000200, 0x00020200, 0x02020200, 0x00000000, 0x02000000,\n    0x00020000, 0x02020000, 0x00000200, 0x02000200, 0x00020200, 0x02020200,\n    0x00000000, 0x02000000, 0x00020000, 0x02020000, 0x00000200, 0x02000200,\n    0x00020200, 0x02020200, 0x00000000, 0x02000000, 0x00020000, 0x02020000,\n    0x00000200, 0x02000200, 0x00020200, 0x02020200, 0x00000000, 0x02000000,\n    0x00020000, 0x02020000, 0x00000200, 0x02000200, 0x00020200, 0x02020200,\n    0x00000000, 0x02000000, 0x00020000, 0x02020000, 0x00000200, 0x02000200,\n    0x00020200, 0x02020200, 0x00000000, 0x02000000, 0x00020000, 0x02020000,\n    0x00000200, 0x02000200, 0x00020200, 0x02020200, 0x00000000, 0x02000000,\n    0x00020000, 0x02020000, 0x00000200, 0x02000200, 0x00020200, 0x02020200,\n    0x00000000, 0x02000000, 0x00020000, 0x02020000, 0x00000200, 0x02000200,\n    0x00020200, 0x02020200, 0x00000000, 0x02000000, 0x00020000, 0x02020000,\n    0x00000200, 0x02000200, 0x00020200, 0x02020200, 0x00000000, 0x02000000,\n    0x00020000, 0x02020000, 0x00000200, 0x02000200, 0x00020200, 0x02020200,\n    0x00000000, 0x02000000, 0x00020000, 0x02020000, 0x00000200, 0x02000200,\n    0x00020200, 0x02020200, 0x00000000, 0x02000000, 0x00020000, 0x02020000,\n    0x00000200, 0x02000200, 0x00020200, 0x02020200, 0x00000000, 0x02000000,\n    0x00020000, 0x02020000, 0x00000200, 0x02000200, 0x00020200, 0x02020200,\n    0x00000000, 0x02000000, 0x00020000, 0x02020000, 0x00000200, 0x02000200,\n    0x00020200, 0x02020200,\n  },\n  {\n    0x00000000, 0x04000000, 0x00040000, 0x04040000, 0x00000400, 0x04000400,\n    0x00040400, 0x04040400, 0x00000000, 0x04000000, 0x00040000, 0x04040000,\n    0x00000400, 0x04000400, 0x00040400, 0x04040400, 0x00000000, 0x04000000,\n    0x00040000, 0x04040000, 0x00000400, 0x04000400, 0x00040400, 0x04040400,\n    0x00000000, 0x04000000, 0x00040000, 0x04040000, 0x00000400, 0x04000400,\n    0x00040400, 0x04040400, 0x00000000, 0x04000000, 0x00040000, 0x04040000,\n    0x00000400, 0x04000400, 0x00040400, 0x04040400, 0x00000000, 0x04000000,\n    0x00040000, 0x04040000, 0x00000400, 0x04000400, 0x00040400, 0x04040400,\n    0x00000000, 0x04000000, 0x00040000, 0x04040000, 0x00000400, 0x04000400,\n    0x00040400, 0x04040400, 0x00000000, 0x04000000, 0x00040000, 0x04040000,\n    0x00000400, 0x04000400, 0x00040400, 0x04040400, 0x00000000, 0x04000000,\n    0x00040000, 0x04040000, 0x00000400, 0x04000400, 0x00040400, 0x04040400,\n    0x00000000, 0x04000000, 0x00040000, 0x04040000, 0x00000400, 0x04000400,\n    0x00040400, 0x04040400, 0x00000000, 0x04000000, 0x00040000, 0x04040000,\n    0x00000400, 0x04000400, 0x00040400, 0x04040400, 0x00000000, 0x04000000,\n    0x00040000, 0x04040000, 0x00000400, 0x04000400, 0x00040400, 0x04040400,\n    0x00000000, 0x04000000, 0x00040000, 0x04040000, 0x00000400, 0x04000400,\n    0x00040400, 0x04040400, 0x00000000, 0x04000000, 0x00040000, 0x04040000,\n    0x00000400, 0x04000400, 0x00040400, 0x04040400, 0x00000000, 0x04000000,\n    0x00040000, 0x04040000, 0x00000400, 0x04000400, 0x00040400, 0x04040400,\n    0x00000000, 0x04000000, 0x00040000, 0x04040000, 0x00000400, 0x04000400,\n    0x00040400, 0x04040400,\n  },\n  {\n    0x00000000, 0x08000000, 0x00080000, 0x08080000, 0x00000800, 0x08000800,\n    0x00080800, 0x08080800, 0x00000000, 0x08000000, 0x00080000, 0x08080000,\n    0x00000800, 0x08000800, 0x00080800, 0x08080800, 0x00000000, 0x08000000,\n    0x00080000, 0x08080000, 0x00000800, 0x08000800, 0x00080800, 0x08080800,\n    0x00000000, 0x08000000, 0x00080000, 0x08080000, 0x00000800, 0x08000800,\n    0x00080800, 0x08080800, 0x00000000, 0x08000000, 0x00080000, 0x08080000,\n    0x00000800, 0x08000800, 0x00080800, 0x08080800, 0x00000000, 0x08000000,\n    0x00080000, 0x08080000, 0x00000800, 0x08000800, 0x00080800, 0x08080800,\n    0x00000000, 0x08000000, 0x00080000, 0x08080000, 0x00000800, 0x08000800,\n    0x00080800, 0x08080800, 0x00000000, 0x08000000, 0x00080000, 0x08080000,\n    0x00000800, 0x08000800, 0x00080800, 0x08080800, 0x00000000, 0x08000000,\n    0x00080000, 0x08080000, 0x00000800, 0x08000800, 0x00080800, 0x08080800,\n    0x00000000, 0x08000000, 0x00080000, 0x08080000, 0x00000800, 0x08000800,\n    0x00080800, 0x08080800, 0x00000000, 0x08000000, 0x00080000, 0x08080000,\n    0x00000800, 0x08000800, 0x00080800, 0x08080800, 0x00000000, 0x08000000,\n    0x00080000, 0x08080000, 0x00000800, 0x08000800, 0x00080800, 0x08080800,\n    0x00000000, 0x08000000, 0x00080000, 0x08080000, 0x00000800, 0x08000800,\n    0x00080800, 0x08080800, 0x00000000, 0x08000000, 0x00080000, 0x08080000,\n    0x00000800, 0x08000800, 0x00080800, 0x08080800, 0x00000000, 0x08000000,\n    0x00080000, 0x08080000, 0x00000800, 0x08000800, 0x00080800, 0x08080800,\n    0x00000000, 0x08000000, 0x00080000, 0x08080000, 0x00000800, 0x08000800,\n    0x00080800, 0x08080800,\n  },\n};\n\nconst uint32_t comp_maskl[8][128] =\n{\n  {\n    0x00000000, 0x00000010, 0x00004000, 0x00004010, 0x00040000, 0x00040010,\n    0x00044000, 0x00044010, 0x00000100, 0x00000110, 0x00004100, 0x00004110,\n    0x00040100, 0x00040110, 0x00044100, 0x00044110, 0x00020000, 0x00020010,\n    0x00024000, 0x00024010, 0x00060000, 0x00060010, 0x00064000, 0x00064010,\n    0x00020100, 0x00020110, 0x00024100, 0x00024110, 0x00060100, 0x00060110,\n    0x00064100, 0x00064110, 0x00000001, 0x00000011, 0x00004001, 0x00004011,\n    0x00040001, 0x00040011, 0x00044001, 0x00044011, 0x00000101, 0x00000111,\n    0x00004101, 0x00004111, 0x00040101, 0x00040111, 0x00044101, 0x00044111,\n    0x00020001, 0x00020011, 0x00024001, 0x00024011, 0x00060001, 0x00060011,\n    0x00064001, 0x00064011, 0x00020101, 0x00020111, 0x00024101, 0x00024111,\n    0x00060101, 0x00060111, 0x00064101, 0x00064111, 0x00080000, 0x00080010,\n    0x00084000, 0x00084010, 0x000c0000, 0x000c0010, 0x000c4000, 0x000c4010,\n    0x00080100, 0x00080110, 0x00084100, 0x00084110, 0x000c0100, 0x000c0110,\n    0x000c4100, 0x000c4110, 0x000a0000, 0x000a0010, 0x000a4000, 0x000a4010,\n    0x000e0000, 0x000e0010, 0x000e4000, 0x000e4010, 0x000a0100, 0x000a0110,\n    0x000a4100, 0x000a4110, 0x000e0100, 0x000e0110, 0x000e4100, 0x000e4110,\n    0x00080001, 0x00080011, 0x00084001, 0x00084011, 0x000c0001, 0x000c0011,\n    0x000c4001, 0x000c4011, 0x00080101, 0x00080111, 0x00084101, 0x00084111,\n    0x000c0101, 0x000c0111, 0x000c4101, 0x000c4111, 0x000a0001, 0x000a0011,\n    0x000a4001, 0x000a4011, 0x000e0001, 0x000e0011, 0x000e4001, 0x000e4011,\n    0x000a0101, 0x000a0111, 0x000a4101, 0x000a4111, 0x000e0101, 0x000e0111,\n    0x000e4101, 0x000e4111,\n  },\n  {\n    0x00000000, 0x00800000, 0x00000002, 0x00800002, 0x00000200, 0x00800200,\n    0x00000202, 0x00800202, 0x00200000, 0x00a00000, 0x00200002, 0x00a00002,\n    0x00200200, 0x00a00200, 0x00200202, 0x00a00202, 0x00001000, 0x00801000,\n    0x00001002, 0x00801002, 0x00001200, 0x00801200, 0x00001202, 0x00801202,\n    0x00201000, 0x00a01000, 0x00201002, 0x00a01002, 0x00201200, 0x00a01200,\n    0x00201202, 0x00a01202, 0x00000000, 0x00800000, 0x00000002, 0x00800002,\n    0x00000200, 0x00800200, 0x00000202, 0x00800202, 0x00200000, 0x00a00000,\n    0x00200002, 0x00a00002, 0x00200200, 0x00a00200, 0x00200202, 0x00a00202,\n    0x00001000, 0x00801000, 0x00001002, 0x00801002, 0x00001200, 0x00801200,\n    0x00001202, 0x00801202, 0x00201000, 0x00a01000, 0x00201002, 0x00a01002,\n    0x00201200, 0x00a01200, 0x00201202, 0x00a01202, 0x00000040, 0x00800040,\n    0x00000042, 0x00800042, 0x00000240, 0x00800240, 0x00000242, 0x00800242,\n    0x00200040, 0x00a00040, 0x00200042, 0x00a00042, 0x00200240, 0x00a00240,\n    0x00200242, 0x00a00242, 0x00001040, 0x00801040, 0x00001042, 0x00801042,\n    0x00001240, 0x00801240, 0x00001242, 0x00801242, 0x00201040, 0x00a01040,\n    0x00201042, 0x00a01042, 0x00201240, 0x00a01240, 0x00201242, 0x00a01242,\n    0x00000040, 0x00800040, 0x00000042, 0x00800042, 0x00000240, 0x00800240,\n    0x00000242, 0x00800242, 0x00200040, 0x00a00040, 0x00200042, 0x00a00042,\n    0x00200240, 0x00a00240, 0x00200242, 0x00a00242, 0x00001040, 0x00801040,\n    0x00001042, 0x00801042, 0x00001240, 0x00801240, 0x00001242, 0x00801242,\n    0x00201040, 0x00a01040, 0x00201042, 0x00a01042, 0x00201240, 0x00a01240,\n    0x00201242, 0x00a01242,\n  },\n  {\n    0x00000000, 0x00002000, 0x00000004, 0x00002004, 0x00000400, 0x00002400,\n    0x00000404, 0x00002404, 0x00000000, 0x00002000, 0x00000004, 0x00002004,\n    0x00000400, 0x00002400, 0x00000404, 0x00002404, 0x00400000, 0x00402000,\n    0x00400004, 0x00402004, 0x00400400, 0x00402400, 0x00400404, 0x00402404,\n    0x00400000, 0x00402000, 0x00400004, 0x00402004, 0x00400400, 0x00402400,\n    0x00400404, 0x00402404, 0x00000020, 0x00002020, 0x00000024, 0x00002024,\n    0x00000420, 0x00002420, 0x00000424, 0x00002424, 0x00000020, 0x00002020,\n    0x00000024, 0x00002024, 0x00000420, 0x00002420, 0x00000424, 0x00002424,\n    0x00400020, 0x00402020, 0x00400024, 0x00402024, 0x00400420, 0x00402420,\n    0x00400424, 0x00402424, 0x00400020, 0x00402020, 0x00400024, 0x00402024,\n    0x00400420, 0x00402420, 0x00400424, 0x00402424, 0x00008000, 0x0000a000,\n    0x00008004, 0x0000a004, 0x00008400, 0x0000a400, 0x00008404, 0x0000a404,\n    0x00008000, 0x0000a000, 0x00008004, 0x0000a004, 0x00008400, 0x0000a400,\n    0x00008404, 0x0000a404, 0x00408000, 0x0040a000, 0x00408004, 0x0040a004,\n    0x00408400, 0x0040a400, 0x00408404, 0x0040a404, 0x00408000, 0x0040a000,\n    0x00408004, 0x0040a004, 0x00408400, 0x0040a400, 0x00408404, 0x0040a404,\n    0x00008020, 0x0000a020, 0x00008024, 0x0000a024, 0x00008420, 0x0000a420,\n    0x00008424, 0x0000a424, 0x00008020, 0x0000a020, 0x00008024, 0x0000a024,\n    0x00008420, 0x0000a420, 0x00008424, 0x0000a424, 0x00408020, 0x0040a020,\n    0x00408024, 0x0040a024, 0x00408420, 0x0040a420, 0x00408424, 0x0040a424,\n    0x00408020, 0x0040a020, 0x00408024, 0x0040a024, 0x00408420, 0x0040a420,\n    0x00408424, 0x0040a424,\n  },\n  {\n    0x00000000, 0x00010000, 0x00000008, 0x00010008, 0x00000080, 0x00010080,\n    0x00000088, 0x00010088, 0x00000000, 0x00010000, 0x00000008, 0x00010008,\n    0x00000080, 0x00010080, 0x00000088, 0x00010088, 0x00100000, 0x00110000,\n    0x00100008, 0x00110008, 0x00100080, 0x00110080, 0x00100088, 0x00110088,\n    0x00100000, 0x00110000, 0x00100008, 0x00110008, 0x00100080, 0x00110080,\n    0x00100088, 0x00110088, 0x00000800, 0x00010800, 0x00000808, 0x00010808,\n    0x00000880, 0x00010880, 0x00000888, 0x00010888, 0x00000800, 0x00010800,\n    0x00000808, 0x00010808, 0x00000880, 0x00010880, 0x00000888, 0x00010888,\n    0x00100800, 0x00110800, 0x00100808, 0x00110808, 0x00100880, 0x00110880,\n    0x00100888, 0x00110888, 0x00100800, 0x00110800, 0x00100808, 0x00110808,\n    0x00100880, 0x00110880, 0x00100888, 0x00110888, 0x00000000, 0x00010000,\n    0x00000008, 0x00010008, 0x00000080, 0x00010080, 0x00000088, 0x00010088,\n    0x00000000, 0x00010000, 0x00000008, 0x00010008, 0x00000080, 0x00010080,\n    0x00000088, 0x00010088, 0x00100000, 0x00110000, 0x00100008, 0x00110008,\n    0x00100080, 0x00110080, 0x00100088, 0x00110088, 0x00100000, 0x00110000,\n    0x00100008, 0x00110008, 0x00100080, 0x00110080, 0x00100088, 0x00110088,\n    0x00000800, 0x00010800, 0x00000808, 0x00010808, 0x00000880, 0x00010880,\n    0x00000888, 0x00010888, 0x00000800, 0x00010800, 0x00000808, 0x00010808,\n    0x00000880, 0x00010880, 0x00000888, 0x00010888, 0x00100800, 0x00110800,\n    0x00100808, 0x00110808, 0x00100880, 0x00110880, 0x00100888, 0x00110888,\n    0x00100800, 0x00110800, 0x00100808, 0x00110808, 0x00100880, 0x00110880,\n    0x00100888, 0x00110888,\n  },\n  {\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000,\n  },\n  {\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000,\n  },\n  {\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000,\n  },\n  {\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000,\n  },\n};\n\nconst uint32_t comp_maskr[8][128] =\n{\n  {\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000,\n  },\n  {\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000,\n  },\n  {\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000,\n  },\n  {\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000,\n  },\n  {\n    0x00000000, 0x00000000, 0x00000080, 0x00000080, 0x00002000, 0x00002000,\n    0x00002080, 0x00002080, 0x00000001, 0x00000001, 0x00000081, 0x00000081,\n    0x00002001, 0x00002001, 0x00002081, 0x00002081, 0x00200000, 0x00200000,\n    0x00200080, 0x00200080, 0x00202000, 0x00202000, 0x00202080, 0x00202080,\n    0x00200001, 0x00200001, 0x00200081, 0x00200081, 0x00202001, 0x00202001,\n    0x00202081, 0x00202081, 0x00020000, 0x00020000, 0x00020080, 0x00020080,\n    0x00022000, 0x00022000, 0x00022080, 0x00022080, 0x00020001, 0x00020001,\n    0x00020081, 0x00020081, 0x00022001, 0x00022001, 0x00022081, 0x00022081,\n    0x00220000, 0x00220000, 0x00220080, 0x00220080, 0x00222000, 0x00222000,\n    0x00222080, 0x00222080, 0x00220001, 0x00220001, 0x00220081, 0x00220081,\n    0x00222001, 0x00222001, 0x00222081, 0x00222081, 0x00000002, 0x00000002,\n    0x00000082, 0x00000082, 0x00002002, 0x00002002, 0x00002082, 0x00002082,\n    0x00000003, 0x00000003, 0x00000083, 0x00000083, 0x00002003, 0x00002003,\n    0x00002083, 0x00002083, 0x00200002, 0x00200002, 0x00200082, 0x00200082,\n    0x00202002, 0x00202002, 0x00202082, 0x00202082, 0x00200003, 0x00200003,\n    0x00200083, 0x00200083, 0x00202003, 0x00202003, 0x00202083, 0x00202083,\n    0x00020002, 0x00020002, 0x00020082, 0x00020082, 0x00022002, 0x00022002,\n    0x00022082, 0x00022082, 0x00020003, 0x00020003, 0x00020083, 0x00020083,\n    0x00022003, 0x00022003, 0x00022083, 0x00022083, 0x00220002, 0x00220002,\n    0x00220082, 0x00220082, 0x00222002, 0x00222002, 0x00222082, 0x00222082,\n    0x00220003, 0x00220003, 0x00220083, 0x00220083, 0x00222003, 0x00222003,\n    0x00222083, 0x00222083,\n  },\n  {\n    0x00000000, 0x00000010, 0x00800000, 0x00800010, 0x00010000, 0x00010010,\n    0x00810000, 0x00810010, 0x00000200, 0x00000210, 0x00800200, 0x00800210,\n    0x00010200, 0x00010210, 0x00810200, 0x00810210, 0x00000000, 0x00000010,\n    0x00800000, 0x00800010, 0x00010000, 0x00010010, 0x00810000, 0x00810010,\n    0x00000200, 0x00000210, 0x00800200, 0x00800210, 0x00010200, 0x00010210,\n    0x00810200, 0x00810210, 0x00100000, 0x00100010, 0x00900000, 0x00900010,\n    0x00110000, 0x00110010, 0x00910000, 0x00910010, 0x00100200, 0x00100210,\n    0x00900200, 0x00900210, 0x00110200, 0x00110210, 0x00910200, 0x00910210,\n    0x00100000, 0x00100010, 0x00900000, 0x00900010, 0x00110000, 0x00110010,\n    0x00910000, 0x00910010, 0x00100200, 0x00100210, 0x00900200, 0x00900210,\n    0x00110200, 0x00110210, 0x00910200, 0x00910210, 0x00000004, 0x00000014,\n    0x00800004, 0x00800014, 0x00010004, 0x00010014, 0x00810004, 0x00810014,\n    0x00000204, 0x00000214, 0x00800204, 0x00800214, 0x00010204, 0x00010214,\n    0x00810204, 0x00810214, 0x00000004, 0x00000014, 0x00800004, 0x00800014,\n    0x00010004, 0x00010014, 0x00810004, 0x00810014, 0x00000204, 0x00000214,\n    0x00800204, 0x00800214, 0x00010204, 0x00010214, 0x00810204, 0x00810214,\n    0x00100004, 0x00100014, 0x00900004, 0x00900014, 0x00110004, 0x00110014,\n    0x00910004, 0x00910014, 0x00100204, 0x00100214, 0x00900204, 0x00900214,\n    0x00110204, 0x00110214, 0x00910204, 0x00910214, 0x00100004, 0x00100014,\n    0x00900004, 0x00900014, 0x00110004, 0x00110014, 0x00910004, 0x00910014,\n    0x00100204, 0x00100214, 0x00900204, 0x00900214, 0x00110204, 0x00110214,\n    0x00910204, 0x00910214,\n  },\n  {\n    0x00000000, 0x00000400, 0x00001000, 0x00001400, 0x00080000, 0x00080400,\n    0x00081000, 0x00081400, 0x00000020, 0x00000420, 0x00001020, 0x00001420,\n    0x00080020, 0x00080420, 0x00081020, 0x00081420, 0x00004000, 0x00004400,\n    0x00005000, 0x00005400, 0x00084000, 0x00084400, 0x00085000, 0x00085400,\n    0x00004020, 0x00004420, 0x00005020, 0x00005420, 0x00084020, 0x00084420,\n    0x00085020, 0x00085420, 0x00000800, 0x00000c00, 0x00001800, 0x00001c00,\n    0x00080800, 0x00080c00, 0x00081800, 0x00081c00, 0x00000820, 0x00000c20,\n    0x00001820, 0x00001c20, 0x00080820, 0x00080c20, 0x00081820, 0x00081c20,\n    0x00004800, 0x00004c00, 0x00005800, 0x00005c00, 0x00084800, 0x00084c00,\n    0x00085800, 0x00085c00, 0x00004820, 0x00004c20, 0x00005820, 0x00005c20,\n    0x00084820, 0x00084c20, 0x00085820, 0x00085c20, 0x00000000, 0x00000400,\n    0x00001000, 0x00001400, 0x00080000, 0x00080400, 0x00081000, 0x00081400,\n    0x00000020, 0x00000420, 0x00001020, 0x00001420, 0x00080020, 0x00080420,\n    0x00081020, 0x00081420, 0x00004000, 0x00004400, 0x00005000, 0x00005400,\n    0x00084000, 0x00084400, 0x00085000, 0x00085400, 0x00004020, 0x00004420,\n    0x00005020, 0x00005420, 0x00084020, 0x00084420, 0x00085020, 0x00085420,\n    0x00000800, 0x00000c00, 0x00001800, 0x00001c00, 0x00080800, 0x00080c00,\n    0x00081800, 0x00081c00, 0x00000820, 0x00000c20, 0x00001820, 0x00001c20,\n    0x00080820, 0x00080c20, 0x00081820, 0x00081c20, 0x00004800, 0x00004c00,\n    0x00005800, 0x00005c00, 0x00084800, 0x00084c00, 0x00085800, 0x00085c00,\n    0x00004820, 0x00004c20, 0x00005820, 0x00005c20, 0x00084820, 0x00084c20,\n    0x00085820, 0x00085c20,\n  },\n  {\n    0x00000000, 0x00000100, 0x00040000, 0x00040100, 0x00000000, 0x00000100,\n    0x00040000, 0x00040100, 0x00000040, 0x00000140, 0x00040040, 0x00040140,\n    0x00000040, 0x00000140, 0x00040040, 0x00040140, 0x00400000, 0x00400100,\n    0x00440000, 0x00440100, 0x00400000, 0x00400100, 0x00440000, 0x00440100,\n    0x00400040, 0x00400140, 0x00440040, 0x00440140, 0x00400040, 0x00400140,\n    0x00440040, 0x00440140, 0x00008000, 0x00008100, 0x00048000, 0x00048100,\n    0x00008000, 0x00008100, 0x00048000, 0x00048100, 0x00008040, 0x00008140,\n    0x00048040, 0x00048140, 0x00008040, 0x00008140, 0x00048040, 0x00048140,\n    0x00408000, 0x00408100, 0x00448000, 0x00448100, 0x00408000, 0x00408100,\n    0x00448000, 0x00448100, 0x00408040, 0x00408140, 0x00448040, 0x00448140,\n    0x00408040, 0x00408140, 0x00448040, 0x00448140, 0x00000008, 0x00000108,\n    0x00040008, 0x00040108, 0x00000008, 0x00000108, 0x00040008, 0x00040108,\n    0x00000048, 0x00000148, 0x00040048, 0x00040148, 0x00000048, 0x00000148,\n    0x00040048, 0x00040148, 0x00400008, 0x00400108, 0x00440008, 0x00440108,\n    0x00400008, 0x00400108, 0x00440008, 0x00440108, 0x00400048, 0x00400148,\n    0x00440048, 0x00440148, 0x00400048, 0x00400148, 0x00440048, 0x00440148,\n    0x00008008, 0x00008108, 0x00048008, 0x00048108, 0x00008008, 0x00008108,\n    0x00048008, 0x00048108, 0x00008048, 0x00008148, 0x00048048, 0x00048148,\n    0x00008048, 0x00008148, 0x00048048, 0x00048148, 0x00408008, 0x00408108,\n    0x00448008, 0x00448108, 0x00408008, 0x00408108, 0x00448008, 0x00448108,\n    0x00408048, 0x00408148, 0x00448048, 0x00448148, 0x00408048, 0x00408148,\n    0x00448048, 0x00448148,\n  },\n};\n\nconst uint32_t psbox[4][256] =\n{\n  {\n    0x00000000, 0x00004000, 0x40000000, 0x40004000, 0x00000010, 0x00004010,\n    0x40000010, 0x40004010, 0x00080000, 0x00084000, 0x40080000, 0x40084000,\n    0x00080010, 0x00084010, 0x40080010, 0x40084010, 0x00000002, 0x00004002,\n    0x40000002, 0x40004002, 0x00000012, 0x00004012, 0x40000012, 0x40004012,\n    0x00080002, 0x00084002, 0x40080002, 0x40084002, 0x00080012, 0x00084012,\n    0x40080012, 0x40084012, 0x00000200, 0x00004200, 0x40000200, 0x40004200,\n    0x00000210, 0x00004210, 0x40000210, 0x40004210, 0x00080200, 0x00084200,\n    0x40080200, 0x40084200, 0x00080210, 0x00084210, 0x40080210, 0x40084210,\n    0x00000202, 0x00004202, 0x40000202, 0x40004202, 0x00000212, 0x00004212,\n    0x40000212, 0x40004212, 0x00080202, 0x00084202, 0x40080202, 0x40084202,\n    0x00080212, 0x00084212, 0x40080212, 0x40084212, 0x00008000, 0x0000c000,\n    0x40008000, 0x4000c000, 0x00008010, 0x0000c010, 0x40008010, 0x4000c010,\n    0x00088000, 0x0008c000, 0x40088000, 0x4008c000, 0x00088010, 0x0008c010,\n    0x40088010, 0x4008c010, 0x00008002, 0x0000c002, 0x40008002, 0x4000c002,\n    0x00008012, 0x0000c012, 0x40008012, 0x4000c012, 0x00088002, 0x0008c002,\n    0x40088002, 0x4008c002, 0x00088012, 0x0008c012, 0x40088012, 0x4008c012,\n    0x00008200, 0x0000c200, 0x40008200, 0x4000c200, 0x00008210, 0x0000c210,\n    0x40008210, 0x4000c210, 0x00088200, 0x0008c200, 0x40088200, 0x4008c200,\n    0x00088210, 0x0008c210, 0x40088210, 0x4008c210, 0x00008202, 0x0000c202,\n    0x40008202, 0x4000c202, 0x00008212, 0x0000c212, 0x40008212, 0x4000c212,\n    0x00088202, 0x0008c202, 0x40088202, 0x4008c202, 0x00088212, 0x0008c212,\n    0x40088212, 0x4008c212, 0x00800000, 0x00804000, 0x40800000, 0x40804000,\n    0x00800010, 0x00804010, 0x40800010, 0x40804010, 0x00880000, 0x00884000,\n    0x40880000, 0x40884000, 0x00880010, 0x00884010, 0x40880010, 0x40884010,\n    0x00800002, 0x00804002, 0x40800002, 0x40804002, 0x00800012, 0x00804012,\n    0x40800012, 0x40804012, 0x00880002, 0x00884002, 0x40880002, 0x40884002,\n    0x00880012, 0x00884012, 0x40880012, 0x40884012, 0x00800200, 0x00804200,\n    0x40800200, 0x40804200, 0x00800210, 0x00804210, 0x40800210, 0x40804210,\n    0x00880200, 0x00884200, 0x40880200, 0x40884200, 0x00880210, 0x00884210,\n    0x40880210, 0x40884210, 0x00800202, 0x00804202, 0x40800202, 0x40804202,\n    0x00800212, 0x00804212, 0x40800212, 0x40804212, 0x00880202, 0x00884202,\n    0x40880202, 0x40884202, 0x00880212, 0x00884212, 0x40880212, 0x40884212,\n    0x00808000, 0x0080c000, 0x40808000, 0x4080c000, 0x00808010, 0x0080c010,\n    0x40808010, 0x4080c010, 0x00888000, 0x0088c000, 0x40888000, 0x4088c000,\n    0x00888010, 0x0088c010, 0x40888010, 0x4088c010, 0x00808002, 0x0080c002,\n    0x40808002, 0x4080c002, 0x00808012, 0x0080c012, 0x40808012, 0x4080c012,\n    0x00888002, 0x0088c002, 0x40888002, 0x4088c002, 0x00888012, 0x0088c012,\n    0x40888012, 0x4088c012, 0x00808200, 0x0080c200, 0x40808200, 0x4080c200,\n    0x00808210, 0x0080c210, 0x40808210, 0x4080c210, 0x00888200, 0x0088c200,\n    0x40888200, 0x4088c200, 0x00888210, 0x0088c210, 0x40888210, 0x4088c210,\n    0x00808202, 0x0080c202, 0x40808202, 0x4080c202, 0x00808212, 0x0080c212,\n    0x40808212, 0x4080c212, 0x00888202, 0x0088c202, 0x40888202, 0x4088c202,\n    0x00888212, 0x0088c212, 0x40888212, 0x4088c212,\n  },\n  {\n    0x00000000, 0x80000000, 0x00400000, 0x80400000, 0x00001000, 0x80001000,\n    0x00401000, 0x80401000, 0x00000040, 0x80000040, 0x00400040, 0x80400040,\n    0x00001040, 0x80001040, 0x00401040, 0x80401040, 0x04000000, 0x84000000,\n    0x04400000, 0x84400000, 0x04001000, 0x84001000, 0x04401000, 0x84401000,\n    0x04000040, 0x84000040, 0x04400040, 0x84400040, 0x04001040, 0x84001040,\n    0x04401040, 0x84401040, 0x00000004, 0x80000004, 0x00400004, 0x80400004,\n    0x00001004, 0x80001004, 0x00401004, 0x80401004, 0x00000044, 0x80000044,\n    0x00400044, 0x80400044, 0x00001044, 0x80001044, 0x00401044, 0x80401044,\n    0x04000004, 0x84000004, 0x04400004, 0x84400004, 0x04001004, 0x84001004,\n    0x04401004, 0x84401004, 0x04000044, 0x84000044, 0x04400044, 0x84400044,\n    0x04001044, 0x84001044, 0x04401044, 0x84401044, 0x00010000, 0x80010000,\n    0x00410000, 0x80410000, 0x00011000, 0x80011000, 0x00411000, 0x80411000,\n    0x00010040, 0x80010040, 0x00410040, 0x80410040, 0x00011040, 0x80011040,\n    0x00411040, 0x80411040, 0x04010000, 0x84010000, 0x04410000, 0x84410000,\n    0x04011000, 0x84011000, 0x04411000, 0x84411000, 0x04010040, 0x84010040,\n    0x04410040, 0x84410040, 0x04011040, 0x84011040, 0x04411040, 0x84411040,\n    0x00010004, 0x80010004, 0x00410004, 0x80410004, 0x00011004, 0x80011004,\n    0x00411004, 0x80411004, 0x00010044, 0x80010044, 0x00410044, 0x80410044,\n    0x00011044, 0x80011044, 0x00411044, 0x80411044, 0x04010004, 0x84010004,\n    0x04410004, 0x84410004, 0x04011004, 0x84011004, 0x04411004, 0x84411004,\n    0x04010044, 0x84010044, 0x04410044, 0x84410044, 0x04011044, 0x84011044,\n    0x04411044, 0x84411044, 0x00000100, 0x80000100, 0x00400100, 0x80400100,\n    0x00001100, 0x80001100, 0x00401100, 0x80401100, 0x00000140, 0x80000140,\n    0x00400140, 0x80400140, 0x00001140, 0x80001140, 0x00401140, 0x80401140,\n    0x04000100, 0x84000100, 0x04400100, 0x84400100, 0x04001100, 0x84001100,\n    0x04401100, 0x84401100, 0x04000140, 0x84000140, 0x04400140, 0x84400140,\n    0x04001140, 0x84001140, 0x04401140, 0x84401140, 0x00000104, 0x80000104,\n    0x00400104, 0x80400104, 0x00001104, 0x80001104, 0x00401104, 0x80401104,\n    0x00000144, 0x80000144, 0x00400144, 0x80400144, 0x00001144, 0x80001144,\n    0x00401144, 0x80401144, 0x04000104, 0x84000104, 0x04400104, 0x84400104,\n    0x04001104, 0x84001104, 0x04401104, 0x84401104, 0x04000144, 0x84000144,\n    0x04400144, 0x84400144, 0x04001144, 0x84001144, 0x04401144, 0x84401144,\n    0x00010100, 0x80010100, 0x00410100, 0x80410100, 0x00011100, 0x80011100,\n    0x00411100, 0x80411100, 0x00010140, 0x80010140, 0x00410140, 0x80410140,\n    0x00011140, 0x80011140, 0x00411140, 0x80411140, 0x04010100, 0x84010100,\n    0x04410100, 0x84410100, 0x04011100, 0x84011100, 0x04411100, 0x84411100,\n    0x04010140, 0x84010140, 0x04410140, 0x84410140, 0x04011140, 0x84011140,\n    0x04411140, 0x84411140, 0x00010104, 0x80010104, 0x00410104, 0x80410104,\n    0x00011104, 0x80011104, 0x00411104, 0x80411104, 0x00010144, 0x80010144,\n    0x00410144, 0x80410144, 0x00011144, 0x80011144, 0x00411144, 0x80411144,\n    0x04010104, 0x84010104, 0x04410104, 0x84410104, 0x04011104, 0x84011104,\n    0x04411104, 0x84411104, 0x04010144, 0x84010144, 0x04410144, 0x84410144,\n    0x04011144, 0x84011144, 0x04411144, 0x84411144,\n  },\n  {\n    0x00000000, 0x00002000, 0x00200000, 0x00202000, 0x00000008, 0x00002008,\n    0x00200008, 0x00202008, 0x10000000, 0x10002000, 0x10200000, 0x10202000,\n    0x10000008, 0x10002008, 0x10200008, 0x10202008, 0x20000000, 0x20002000,\n    0x20200000, 0x20202000, 0x20000008, 0x20002008, 0x20200008, 0x20202008,\n    0x30000000, 0x30002000, 0x30200000, 0x30202000, 0x30000008, 0x30002008,\n    0x30200008, 0x30202008, 0x00000080, 0x00002080, 0x00200080, 0x00202080,\n    0x00000088, 0x00002088, 0x00200088, 0x00202088, 0x10000080, 0x10002080,\n    0x10200080, 0x10202080, 0x10000088, 0x10002088, 0x10200088, 0x10202088,\n    0x20000080, 0x20002080, 0x20200080, 0x20202080, 0x20000088, 0x20002088,\n    0x20200088, 0x20202088, 0x30000080, 0x30002080, 0x30200080, 0x30202080,\n    0x30000088, 0x30002088, 0x30200088, 0x30202088, 0x00040000, 0x00042000,\n    0x00240000, 0x00242000, 0x00040008, 0x00042008, 0x00240008, 0x00242008,\n    0x10040000, 0x10042000, 0x10240000, 0x10242000, 0x10040008, 0x10042008,\n    0x10240008, 0x10242008, 0x20040000, 0x20042000, 0x20240000, 0x20242000,\n    0x20040008, 0x20042008, 0x20240008, 0x20242008, 0x30040000, 0x30042000,\n    0x30240000, 0x30242000, 0x30040008, 0x30042008, 0x30240008, 0x30242008,\n    0x00040080, 0x00042080, 0x00240080, 0x00242080, 0x00040088, 0x00042088,\n    0x00240088, 0x00242088, 0x10040080, 0x10042080, 0x10240080, 0x10242080,\n    0x10040088, 0x10042088, 0x10240088, 0x10242088, 0x20040080, 0x20042080,\n    0x20240080, 0x20242080, 0x20040088, 0x20042088, 0x20240088, 0x20242088,\n    0x30040080, 0x30042080, 0x30240080, 0x30242080, 0x30040088, 0x30042088,\n    0x30240088, 0x30242088, 0x01000000, 0x01002000, 0x01200000, 0x01202000,\n    0x01000008, 0x01002008, 0x01200008, 0x01202008, 0x11000000, 0x11002000,\n    0x11200000, 0x11202000, 0x11000008, 0x11002008, 0x11200008, 0x11202008,\n    0x21000000, 0x21002000, 0x21200000, 0x21202000, 0x21000008, 0x21002008,\n    0x21200008, 0x21202008, 0x31000000, 0x31002000, 0x31200000, 0x31202000,\n    0x31000008, 0x31002008, 0x31200008, 0x31202008, 0x01000080, 0x01002080,\n    0x01200080, 0x01202080, 0x01000088, 0x01002088, 0x01200088, 0x01202088,\n    0x11000080, 0x11002080, 0x11200080, 0x11202080, 0x11000088, 0x11002088,\n    0x11200088, 0x11202088, 0x21000080, 0x21002080, 0x21200080, 0x21202080,\n    0x21000088, 0x21002088, 0x21200088, 0x21202088, 0x31000080, 0x31002080,\n    0x31200080, 0x31202080, 0x31000088, 0x31002088, 0x31200088, 0x31202088,\n    0x01040000, 0x01042000, 0x01240000, 0x01242000, 0x01040008, 0x01042008,\n    0x01240008, 0x01242008, 0x11040000, 0x11042000, 0x11240000, 0x11242000,\n    0x11040008, 0x11042008, 0x11240008, 0x11242008, 0x21040000, 0x21042000,\n    0x21240000, 0x21242000, 0x21040008, 0x21042008, 0x21240008, 0x21242008,\n    0x31040000, 0x31042000, 0x31240000, 0x31242000, 0x31040008, 0x31042008,\n    0x31240008, 0x31242008, 0x01040080, 0x01042080, 0x01240080, 0x01242080,\n    0x01040088, 0x01042088, 0x01240088, 0x01242088, 0x11040080, 0x11042080,\n    0x11240080, 0x11242080, 0x11040088, 0x11042088, 0x11240088, 0x11242088,\n    0x21040080, 0x21042080, 0x21240080, 0x21242080, 0x21040088, 0x21042088,\n    0x21240088, 0x21242088, 0x31040080, 0x31042080, 0x31240080, 0x31242080,\n    0x31040088, 0x31042088, 0x31240088, 0x31242088,\n  },\n  {\n    0x00000000, 0x00000800, 0x00020000, 0x00020800, 0x00000020, 0x00000820,\n    0x00020020, 0x00020820, 0x08000000, 0x08000800, 0x08020000, 0x08020800,\n    0x08000020, 0x08000820, 0x08020020, 0x08020820, 0x02000000, 0x02000800,\n    0x02020000, 0x02020800, 0x02000020, 0x02000820, 0x02020020, 0x02020820,\n    0x0a000000, 0x0a000800, 0x0a020000, 0x0a020800, 0x0a000020, 0x0a000820,\n    0x0a020020, 0x0a020820, 0x00000400, 0x00000c00, 0x00020400, 0x00020c00,\n    0x00000420, 0x00000c20, 0x00020420, 0x00020c20, 0x08000400, 0x08000c00,\n    0x08020400, 0x08020c00, 0x08000420, 0x08000c20, 0x08020420, 0x08020c20,\n    0x02000400, 0x02000c00, 0x02020400, 0x02020c00, 0x02000420, 0x02000c20,\n    0x02020420, 0x02020c20, 0x0a000400, 0x0a000c00, 0x0a020400, 0x0a020c00,\n    0x0a000420, 0x0a000c20, 0x0a020420, 0x0a020c20, 0x00100000, 0x00100800,\n    0x00120000, 0x00120800, 0x00100020, 0x00100820, 0x00120020, 0x00120820,\n    0x08100000, 0x08100800, 0x08120000, 0x08120800, 0x08100020, 0x08100820,\n    0x08120020, 0x08120820, 0x02100000, 0x02100800, 0x02120000, 0x02120800,\n    0x02100020, 0x02100820, 0x02120020, 0x02120820, 0x0a100000, 0x0a100800,\n    0x0a120000, 0x0a120800, 0x0a100020, 0x0a100820, 0x0a120020, 0x0a120820,\n    0x00100400, 0x00100c00, 0x00120400, 0x00120c00, 0x00100420, 0x00100c20,\n    0x00120420, 0x00120c20, 0x08100400, 0x08100c00, 0x08120400, 0x08120c00,\n    0x08100420, 0x08100c20, 0x08120420, 0x08120c20, 0x02100400, 0x02100c00,\n    0x02120400, 0x02120c00, 0x02100420, 0x02100c20, 0x02120420, 0x02120c20,\n    0x0a100400, 0x0a100c00, 0x0a120400, 0x0a120c00, 0x0a100420, 0x0a100c20,\n    0x0a120420, 0x0a120c20, 0x00000001, 0x00000801, 0x00020001, 0x00020801,\n    0x00000021, 0x00000821, 0x00020021, 0x00020821, 0x08000001, 0x08000801,\n    0x08020001, 0x08020801, 0x08000021, 0x08000821, 0x08020021, 0x08020821,\n    0x02000001, 0x02000801, 0x02020001, 0x02020801, 0x02000021, 0x02000821,\n    0x02020021, 0x02020821, 0x0a000001, 0x0a000801, 0x0a020001, 0x0a020801,\n    0x0a000021, 0x0a000821, 0x0a020021, 0x0a020821, 0x00000401, 0x00000c01,\n    0x00020401, 0x00020c01, 0x00000421, 0x00000c21, 0x00020421, 0x00020c21,\n    0x08000401, 0x08000c01, 0x08020401, 0x08020c01, 0x08000421, 0x08000c21,\n    0x08020421, 0x08020c21, 0x02000401, 0x02000c01, 0x02020401, 0x02020c01,\n    0x02000421, 0x02000c21, 0x02020421, 0x02020c21, 0x0a000401, 0x0a000c01,\n    0x0a020401, 0x0a020c01, 0x0a000421, 0x0a000c21, 0x0a020421, 0x0a020c21,\n    0x00100001, 0x00100801, 0x00120001, 0x00120801, 0x00100021, 0x00100821,\n    0x00120021, 0x00120821, 0x08100001, 0x08100801, 0x08120001, 0x08120801,\n    0x08100021, 0x08100821, 0x08120021, 0x08120821, 0x02100001, 0x02100801,\n    0x02120001, 0x02120801, 0x02100021, 0x02100821, 0x02120021, 0x02120821,\n    0x0a100001, 0x0a100801, 0x0a120001, 0x0a120801, 0x0a100021, 0x0a100821,\n    0x0a120021, 0x0a120821, 0x00100401, 0x00100c01, 0x00120401, 0x00120c01,\n    0x00100421, 0x00100c21, 0x00120421, 0x00120c21, 0x08100401, 0x08100c01,\n    0x08120401, 0x08120c01, 0x08100421, 0x08100c21, 0x08120421, 0x08120c21,\n    0x02100401, 0x02100c01, 0x02120401, 0x02120c01, 0x02100421, 0x02100c21,\n    0x02120421, 0x02120c21, 0x0a100401, 0x0a100c01, 0x0a120401, 0x0a120c01,\n    0x0a100421, 0x0a100c21, 0x0a120421, 0x0a120c21,\n  },\n};\n\n#endif\n"
  },
  {
    "path": "lib/alg-des.c",
    "content": "/*\n * FreeSec: libcrypt for NetBSD\n *\n * Copyright (c) 1994 David Burren\n * All rights reserved.\n *\n * Adapted for FreeBSD-2.0 by Geoffrey M. Rehmet\n *      this file should now *only* export crypt(), in order to make\n *      binaries of libcrypt exportable from the USA\n *\n * Adapted for FreeBSD-4.0 by Mark R V Murray\n *      this file should now *only* export crypt_des(), in order to make\n *      a module that can be optionally included in libcrypt.\n *\n * Adapted for libxcrypt by Zack Weinberg, 2017\n *      writable global data eliminated; type-punning eliminated;\n *      des_init() run at build time (see des-mktables.c);\n *      made into a libxcrypt algorithm module (see des-crypt.c);\n *      functionality required to support the legacy encrypt() and\n *      setkey() primitives re-exposed (see des-obsolete.c).\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the author nor the names of other contributors\n *    may be used to endorse or promote products derived from this software\n *    without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n *\n * This is an original implementation of the DES and the crypt(3) interfaces\n * by David Burren <davidb@werj.com.au>.\n *\n * An excellent reference on the underlying algorithm (and related\n * algorithms) is:\n *\n *      B. Schneier, Applied Cryptography: protocols, algorithms,\n *      and source code in C, John Wiley & Sons, 1994.\n *\n * Note that in that book's description of DES the lookups for the initial,\n * pbox, and final permutations are inverted (this has been brought to the\n * attention of the author).  A list of errata for this book has been\n * posted to the sci.crypt newsgroup by the author and is available for FTP.\n */\n\n#include \"crypt-port.h\"\n\n#if INCLUDE_descrypt || INCLUDE_bigcrypt || INCLUDE_bsdicrypt\n\n#include \"alg-des.h\"\n#include \"byteorder.h\"\n\nstatic const uint8_t key_shifts[16] =\n{\n  1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1\n};\n\nvoid\ndes_set_key (struct des_ctx *restrict ctx,\n             const unsigned char key[MIN_SIZE(8)])\n{\n  uint32_t rawkey0, rawkey1, k0, k1, t0, t1;\n  int shifts, round;\n\n  rawkey0 = be32_to_cpu (&key[0]);\n  rawkey1 = be32_to_cpu (&key[4]);\n\n  /* Do key permutation and split into two 28-bit subkeys.  */\n  k0 = key_perm_maskl[0][(rawkey0 >> 25) & 0x7f]\n       | key_perm_maskl[1][(rawkey0 >> 17) & 0x7f]\n       | key_perm_maskl[2][(rawkey0 >> 9) & 0x7f]\n       | key_perm_maskl[3][(rawkey0 >> 1) & 0x7f]\n       | key_perm_maskl[4][(rawkey1 >> 25) & 0x7f]\n       | key_perm_maskl[5][(rawkey1 >> 17) & 0x7f]\n       | key_perm_maskl[6][(rawkey1 >> 9) & 0x7f]\n       | key_perm_maskl[7][(rawkey1 >> 1) & 0x7f];\n  k1 = key_perm_maskr[0][(rawkey0 >> 25) & 0x7f]\n       | key_perm_maskr[1][(rawkey0 >> 17) & 0x7f]\n       | key_perm_maskr[2][(rawkey0 >> 9) & 0x7f]\n       | key_perm_maskr[3][(rawkey0 >> 1) & 0x7f]\n       | key_perm_maskr[4][(rawkey1 >> 25) & 0x7f]\n       | key_perm_maskr[5][(rawkey1 >> 17) & 0x7f]\n       | key_perm_maskr[6][(rawkey1 >> 9) & 0x7f]\n       | key_perm_maskr[7][(rawkey1 >> 1) & 0x7f];\n\n  /* Rotate subkeys and do compression permutation.  */\n  shifts = 0;\n  for (round = 0; round < 16; round++)\n    {\n      shifts += key_shifts[round];\n\n      t0 = (k0 << shifts) | (k0 >> (28 - shifts));\n      t1 = (k1 << shifts) | (k1 >> (28 - shifts));\n\n      ctx->keysl[round] =\n        comp_maskl[0][(t0 >> 21) & 0x7f]\n        | comp_maskl[1][(t0 >> 14) & 0x7f]\n        | comp_maskl[2][(t0 >>  7) & 0x7f]\n        | comp_maskl[3][(t0 >>  0) & 0x7f]\n        | comp_maskl[4][(t1 >> 21) & 0x7f]\n        | comp_maskl[5][(t1 >> 14) & 0x7f]\n        | comp_maskl[6][(t1 >>  7) & 0x7f]\n        | comp_maskl[7][(t1 >>  0) & 0x7f];\n\n      ctx->keysr[round] =\n        comp_maskr[0][(t0 >> 21) & 0x7f]\n        | comp_maskr[1][(t0 >> 14) & 0x7f]\n        | comp_maskr[2][(t0 >>  7) & 0x7f]\n        | comp_maskr[3][(t0 >>  0) & 0x7f]\n        | comp_maskr[4][(t1 >> 21) & 0x7f]\n        | comp_maskr[5][(t1 >> 14) & 0x7f]\n        | comp_maskr[6][(t1 >>  7) & 0x7f]\n        | comp_maskr[7][(t1 >>  0) & 0x7f];\n    }\n}\n\nvoid\ndes_set_salt (struct des_ctx *restrict ctx, uint32_t salt)\n{\n  uint32_t obit, saltbit, saltbits;\n  int i;\n  saltbits = 0L;\n  saltbit = 1;\n  obit = 0x800000;\n  for (i = 0; i < 24; i++)\n    {\n      if (salt & saltbit)\n        saltbits |= obit;\n      saltbit <<= 1;\n      obit >>= 1;\n    }\n  ctx->saltbits = saltbits;\n}\n\nvoid\ndes_crypt_block (struct des_ctx *restrict ctx,\n                 unsigned char *out, const unsigned char *in,\n                 unsigned int count, bool decrypt)\n{\n  uint32_t l_in, r_in, l_out, r_out;\n  uint32_t l, r, *kl, *kr, *kl1, *kr1;\n  uint32_t f, r48l, r48r;\n  uint32_t saltbits = ctx->saltbits;\n  int round, rk_step;\n\n  /* Zero encryptions/decryptions doesn't make sense.  */\n  if (count == 0)\n    count = 1;\n\n  if (decrypt)\n    {\n      kl1 = ctx->keysl + 15;\n      kr1 = ctx->keysr + 15;\n      rk_step = -1;\n    }\n  else\n    {\n      kl1 = ctx->keysl;\n      kr1 = ctx->keysr;\n      rk_step = 1;\n    }\n\n  /* Read the input, which is notionally in \"big-endian\" format.  */\n  l_in = be32_to_cpu (in);\n  r_in = be32_to_cpu (in + 4);\n\n  /* Do initial permutation.  */\n  l = ip_maskl[0][(l_in >> 24) & 0xff]\n      | ip_maskl[1][(l_in >> 16) & 0xff]\n      | ip_maskl[2][(l_in >>  8) & 0xff]\n      | ip_maskl[3][(l_in >>  0) & 0xff]\n      | ip_maskl[4][(r_in >> 24) & 0xff]\n      | ip_maskl[5][(r_in >> 16) & 0xff]\n      | ip_maskl[6][(r_in >>  8) & 0xff]\n      | ip_maskl[7][(r_in >>  0) & 0xff];\n  r = ip_maskr[0][(l_in >> 24) & 0xff]\n      | ip_maskr[1][(l_in >> 16) & 0xff]\n      | ip_maskr[2][(l_in >>  8) & 0xff]\n      | ip_maskr[3][(l_in >>  0) & 0xff]\n      | ip_maskr[4][(r_in >> 24) & 0xff]\n      | ip_maskr[5][(r_in >> 16) & 0xff]\n      | ip_maskr[6][(r_in >>  8) & 0xff]\n      | ip_maskr[7][(r_in >>  0) & 0xff];\n\n  do\n    {\n      kl = kl1;\n      kr = kr1;\n      round = 16;\n      do\n        {\n          /* Expand R to 48 bits (simulate the E-box).  */\n          r48l = ((r & 0x00000001) << 23)\n                 | ((r & 0xf8000000) >>  9)\n                 | ((r & 0x1f800000) >> 11)\n                 | ((r & 0x01f80000) >> 13)\n                 | ((r & 0x001f8000) >> 15);\n          r48r = ((r & 0x0001f800) <<  7)\n                 | ((r & 0x00001f80) <<  5)\n                 | ((r & 0x000001f8) <<  3)\n                 | ((r & 0x0000001f) <<  1)\n                 | ((r & 0x80000000) >> 31);\n\n          /* Apply salt and permuted round key.  */\n          f = (r48l ^ r48r) & saltbits;\n          r48l ^= f ^ *kl;\n          r48r ^= f ^ *kr;\n          kl += rk_step;\n          kr += rk_step;\n\n          /* Do sbox lookups (which shrink it back to 32 bits)\n             and the pbox permutation at the same time.  */\n          f = psbox[0][m_sbox[0][r48l >> 12]]\n              | psbox[1][m_sbox[1][r48l & 0xfff]]\n              | psbox[2][m_sbox[2][r48r >> 12]]\n              | psbox[3][m_sbox[3][r48r & 0xfff]];\n\n          /* Now that we've permuted things, complete f().  */\n          f ^= l;\n          l = r;\n          r = f;\n        }\n      while (--round);\n\n      r = l;\n      l = f;\n    }\n  while (--count);\n\n  /* Do final permutation (inverse of IP).  */\n  l_out =\n    fp_maskl[0][(l >> 24) & 0xff]\n    | fp_maskl[1][(l >> 16) & 0xff]\n    | fp_maskl[2][(l >>  8) & 0xff]\n    | fp_maskl[3][(l >>  0) & 0xff]\n    | fp_maskl[4][(r >> 24) & 0xff]\n    | fp_maskl[5][(r >> 16) & 0xff]\n    | fp_maskl[6][(r >>  8) & 0xff]\n    | fp_maskl[7][(r >>  0) & 0xff];\n  r_out =\n    fp_maskr[0][(l >> 24) & 0xff]\n    | fp_maskr[1][(l >> 16) & 0xff]\n    | fp_maskr[2][(l >>  8) & 0xff]\n    | fp_maskr[3][(l >>  0) & 0xff]\n    | fp_maskr[4][(r >> 24) & 0xff]\n    | fp_maskr[5][(r >> 16) & 0xff]\n    | fp_maskr[6][(r >>  8) & 0xff]\n    | fp_maskr[7][(r >>  0) & 0xff];\n\n  cpu_to_be32 (out, l_out);\n  cpu_to_be32 (out + 4, r_out);\n}\n\n#endif\n"
  },
  {
    "path": "lib/alg-des.h",
    "content": "/*\n * FreeSec: libcrypt for NetBSD\n *\n * Copyright (c) 1994 David Burren\n * All rights reserved.\n *\n * Adapted for FreeBSD-2.0 by Geoffrey M. Rehmet\n *      this file should now *only* export crypt(), in order to make\n *      binaries of libcrypt exportable from the USA\n *\n * Adapted for FreeBSD-4.0 by Mark R V Murray\n *      this file should now *only* export crypt_des(), in order to make\n *      a module that can be optionally included in libcrypt.\n *\n * Adapted for libxcrypt by Zack Weinberg, 2017\n *      see notes in des.c\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the author nor the names of other contributors\n *    may be used to endorse or promote products derived from this software\n *    without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n *\n * This is an original implementation of the DES and the crypt(3) interfaces\n * by David Burren <davidb@werj.com.au>.\n */\n\n#ifndef _CRYPT_ALG_DES_H\n#define _CRYPT_ALG_DES_H 1\n\n/* des.c */\n\nstruct des_ctx\n{\n  uint32_t keysl[16];\n  uint32_t keysr[16];\n  uint32_t saltbits;\n};\n\nextern void des_set_key (struct des_ctx *restrict ctx,\n                         const unsigned char key[MIN_SIZE(8)]);\nextern void des_set_salt (struct des_ctx *restrict ctx,\n                          uint32_t salt);\nextern void des_crypt_block (struct des_ctx *restrict ctx,\n                             unsigned char *out, const unsigned char *in,\n                             unsigned int count, bool decrypt);\n\n/* des-tables.c (generated by des-mktables) */\nextern const uint8_t m_sbox[4][4096];\nextern const uint32_t ip_maskl[8][256], ip_maskr[8][256];\nextern const uint32_t fp_maskl[8][256], fp_maskr[8][256];\nextern const uint32_t key_perm_maskl[8][128], key_perm_maskr[8][128];\nextern const uint32_t comp_maskl[8][128], comp_maskr[8][128];\nextern const uint32_t psbox[4][256];\n\n#endif /* alg-des.h */\n"
  },
  {
    "path": "lib/alg-gost3411-2012-const.h",
    "content": "/*\n * Copyright (c) 2013, Alexey Degtyarev <alexey@renatasystems.org>.\n * All rights reserved.\n *\n * Iteration constants defined in standard.\n *\n * $Id$\n */\n\nstatic const uint512_u buffer0 = {{ 0x0ULL, 0x0ULL, 0x0ULL,\n    0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL }};\n\n#ifndef __GOST3411_BIG_ENDIAN__\nstatic const uint512_u buffer512 = {{ 0x0000000000000200ULL,\n    0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL }};\n#else\nstatic const uint512_u buffer512 = {{ 0x0002000000000000ULL,\n    0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL }};\n#endif\n\n#ifndef __GOST3411_BIG_ENDIAN__\nstatic const uint512_u C[12] = {\n    {{\n         0xdd806559f2a64507ULL,\n         0x05767436cc744d23ULL,\n         0xa2422a08a460d315ULL,\n         0x4b7ce09192676901ULL,\n         0x714eb88d7585c4fcULL,\n         0x2f6a76432e45d016ULL,\n         0xebcb2f81c0657c1fULL,\n         0xb1085bda1ecadae9ULL\n    }},\n    {{\n         0xe679047021b19bb7ULL,\n         0x55dda21bd7cbcd56ULL,\n         0x5cb561c2db0aa7caULL,\n         0x9ab5176b12d69958ULL,\n         0x61d55e0f16b50131ULL,\n         0xf3feea720a232b98ULL,\n         0x4fe39d460f70b5d7ULL,\n         0x6fa3b58aa99d2f1aULL\n    }},\n    {{\n         0x991e96f50aba0ab2ULL,\n         0xc2b6f443867adb31ULL,\n         0xc1c93a376062db09ULL,\n         0xd3e20fe490359eb1ULL,\n         0xf2ea7514b1297b7bULL,\n         0x06f15e5f529c1f8bULL,\n         0x0a39fc286a3d8435ULL,\n         0xf574dcac2bce2fc7ULL\n    }},\n    {{\n         0x220cbebc84e3d12eULL,\n         0x3453eaa193e837f1ULL,\n         0xd8b71333935203beULL,\n         0xa9d72c82ed03d675ULL,\n         0x9d721cad685e353fULL,\n         0x488e857e335c3c7dULL,\n         0xf948e1a05d71e4ddULL,\n         0xef1fdfb3e81566d2ULL\n    }},\n    {{\n         0x601758fd7c6cfe57ULL,\n         0x7a56a27ea9ea63f5ULL,\n         0xdfff00b723271a16ULL,\n         0xbfcd1747253af5a3ULL,\n         0x359e35d7800fffbdULL,\n         0x7f151c1f1686104aULL,\n         0x9a3f410c6ca92363ULL,\n         0x4bea6bacad474799ULL\n    }},\n    {{\n         0xfa68407a46647d6eULL,\n         0xbf71c57236904f35ULL,\n         0x0af21f66c2bec6b6ULL,\n         0xcffaa6b71c9ab7b4ULL,\n         0x187f9ab49af08ec6ULL,\n         0x2d66c4f95142a46cULL,\n         0x6fa4c33b7a3039c0ULL,\n         0xae4faeae1d3ad3d9ULL\n    }},\n    {{\n         0x8886564d3a14d493ULL,\n         0x3517454ca23c4af3ULL,\n         0x06476983284a0504ULL,\n         0x0992abc52d822c37ULL,\n         0xd3473e33197a93c9ULL,\n         0x399ec6c7e6bf87c9ULL,\n         0x51ac86febf240954ULL,\n         0xf4c70e16eeaac5ecULL\n    }},\n    {{\n         0xa47f0dd4bf02e71eULL,\n         0x36acc2355951a8d9ULL,\n         0x69d18d2bd1a5c42fULL,\n         0xf4892bcb929b0690ULL,\n         0x89b4443b4ddbc49aULL,\n         0x4eb7f8719c36de1eULL,\n         0x03e7aa020c6e4141ULL,\n         0x9b1f5b424d93c9a7ULL\n    }},\n    {{\n         0x7261445183235adbULL,\n         0x0e38dc92cb1f2a60ULL,\n         0x7b2b8a9aa6079c54ULL,\n         0x800a440bdbb2ceb1ULL,\n         0x3cd955b7e00d0984ULL,\n         0x3a7d3a1b25894224ULL,\n         0x944c9ad8ec165fdeULL,\n         0x378f5a541631229bULL\n    }},\n    {{\n         0x74b4c7fb98459cedULL,\n         0x3698fad1153bb6c3ULL,\n         0x7a1e6c303b7652f4ULL,\n         0x9fe76702af69334bULL,\n         0x1fffe18a1b336103ULL,\n         0x8941e71cff8a78dbULL,\n         0x382ae548b2e4f3f3ULL,\n         0xabbedea680056f52ULL\n    }},\n    {{\n         0x6bcaa4cd81f32d1bULL,\n         0xdea2594ac06fd85dULL,\n         0xefbacd1d7d476e98ULL,\n         0x8a1d71efea48b9caULL,\n         0x2001802114846679ULL,\n         0xd8fa6bbbebab0761ULL,\n         0x3002c6cd635afe94ULL,\n         0x7bcd9ed0efc889fbULL\n    }},\n    {{\n         0x48bc924af11bd720ULL,\n         0xfaf417d5d9b21b99ULL,\n         0xe71da4aa88e12852ULL,\n         0x5d80ef9d1891cc86ULL,\n         0xf82012d430219f9bULL,\n         0xcda43c32bcdf1d77ULL,\n         0xd21380b00449b17aULL,\n         0x378ee767f11631baULL\n    }}\n};\n#else\nstatic const uint512_u C[12] = {\n    {{\n         0x0745a6f2596580ddULL,\n         0x234d74cc36747605ULL,\n         0x15d360a4082a42a2ULL,\n         0x0169679291e07c4bULL,\n         0xfcc485758db84e71ULL,\n         0x16d0452e43766a2fULL,\n         0x1f7c65c0812fcbebULL,\n         0xe9daca1eda5b08b1ULL\n    }},\n    {{\n         0xb79bb121700479e6ULL,\n         0x56cdcbd71ba2dd55ULL,\n         0xcaa70adbc261b55cULL,\n         0x5899d6126b17b59aULL,\n         0x3101b5160f5ed561ULL,\n         0x982b230a72eafef3ULL,\n         0xd7b5700f469de34fULL,\n         0x1a2f9da98ab5a36fULL\n    }},\n    {{\n         0xb20aba0af5961e99ULL,\n         0x31db7a8643f4b6c2ULL,\n         0x09db6260373ac9c1ULL,\n         0xb19e3590e40fe2d3ULL,\n         0x7b7b29b11475eaf2ULL,\n         0x8b1f9c525f5ef106ULL,\n         0x35843d6a28fc390aULL,\n         0xc72fce2bacdc74f5ULL\n    }},\n    {{\n         0x2ed1e384bcbe0c22ULL,\n         0xf137e893a1ea5334ULL,\n         0xbe0352933313b7d8ULL,\n         0x75d603ed822cd7a9ULL,\n         0x3f355e68ad1c729dULL,\n         0x7d3c5c337e858e48ULL,\n         0xdde4715da0e148f9ULL,\n         0xd26615e8b3df1fefULL\n    }},\n    {{\n         0x57fe6c7cfd581760ULL,\n         0xf563eaa97ea2567aULL,\n         0x161a2723b700ffdfULL,\n         0xa3f53a254717cdbfULL,\n         0xbdff0f80d7359e35ULL,\n         0x4a1086161f1c157fULL,\n         0x6323a96c0c413f9aULL,\n         0x994747adac6bea4bULL\n    }},\n    {{\n         0x6e7d64467a4068faULL,\n         0x354f903672c571bfULL,\n         0xb6c6bec2661ff20aULL,\n         0xb4b79a1cb7a6facfULL,\n         0xc68ef09ab49a7f18ULL,\n         0x6ca44251f9c4662dULL,\n         0xc039307a3bc3a46fULL,\n         0xd9d33a1daeae4faeULL\n    }},\n    {{\n         0x93d4143a4d568688ULL,\n         0xf34a3ca24c451735ULL,\n         0x04054a2883694706ULL,\n         0x372c822dc5ab9209ULL,\n         0xc9937a19333e47d3ULL,\n         0xc987bfe6c7c69e39ULL,\n         0x540924bffe86ac51ULL,\n         0xecc5aaee160ec7f4ULL\n    }},\n    {{\n         0x1ee702bfd40d7fa4ULL,\n         0xd9a8515935c2ac36ULL,\n         0x2fc4a5d12b8dd169ULL,\n         0x90069b92cb2b89f4ULL,\n         0x9ac4db4d3b44b489ULL,\n         0x1ede369c71f8b74eULL,\n         0x41416e0c02aae703ULL,\n         0xa7c9934d425b1f9bULL\n    }},\n    {{\n         0xdb5a238351446172ULL,\n         0x602a1fcb92dc380eULL,\n         0x549c07a69a8a2b7bULL,\n         0xb1ceb2db0b440a80ULL,\n         0x84090de0b755d93cULL,\n         0x244289251b3a7d3aULL,\n         0xde5f16ecd89a4c94ULL,\n         0x9b223116545a8f37ULL\n    }},\n    {{\n         0xed9c4598fbc7b474ULL,\n         0xc3b63b15d1fa9836ULL,\n         0xf452763b306c1e7aULL,\n         0x4b3369af0267e79fULL,\n         0x0361331b8ae1ff1fULL,\n         0xdb788aff1ce74189ULL,\n         0xf3f3e4b248e52a38ULL,\n         0x526f0580a6debeabULL\n    }},\n    {{\n         0x1b2df381cda4ca6bULL,\n         0x5dd86fc04a59a2deULL,\n         0x986e477d1dcdbaefULL,\n         0xcab948eaef711d8aULL,\n         0x7966841421800120ULL,\n         0x6107abebbb6bfad8ULL,\n         0x94fe5a63cdc60230ULL,\n         0xfb89c8efd09ecd7bULL\n    }},\n    {{\n         0x20d71bf14a92bc48ULL,\n         0x991bb2d9d517f4faULL,\n         0x5228e188aaa41de7ULL,\n         0x86cc91189def805dULL,\n         0x9b9f2130d41220f8ULL,\n         0x771ddfbc323ca4cdULL,\n         0x7ab14904b08013d2ULL,\n         0xba3116f167e78e37ULL\n    }}\n};\n#endif\n\nstatic const unsigned char Tau[64] = {\n    0,   8,  16,  24,  32,  40,  48,  56,\n    1,   9,  17,  25,  33,  41,  49,  57,\n    2,  10,  18,  26,  34,  42,  50,  58,\n    3,  11,  19,  27,  35,  43,  51,  59,\n    4,  12,  20,  28,  36,  44,  52,  60,\n    5,  13,  21,  29,  37,  45,  53,  61,\n    6,  14,  22,  30,  38,  46,  54,  62,\n    7,  15,  23,  31,  39,  47,  55,  63\n};\n\nstatic const unsigned char Pi[256] = {\n    252, 238, 221,  17, 207, 110,  49,  22,\n    251, 196, 250, 218,  35, 197,   4,  77,\n    233, 119, 240, 219, 147,  46, 153, 186,\n     23,  54, 241, 187,  20, 205,  95, 193,\n    249,  24, 101,  90, 226,  92, 239,  33,\n    129,  28,  60,  66, 139,   1, 142,  79,\n      5, 132,   2, 174, 227, 106, 143, 160,\n      6,  11, 237, 152, 127, 212, 211,  31,\n    235,  52,  44,  81, 234, 200,  72, 171,\n    242,  42, 104, 162, 253,  58, 206, 204,\n    181, 112,  14,  86,   8,  12, 118,  18,\n    191, 114,  19,  71, 156, 183,  93, 135,\n     21, 161, 150,  41,  16, 123, 154, 199,\n    243, 145, 120, 111, 157, 158, 178, 177,\n     50, 117,  25,  61, 255,  53, 138, 126,\n    109,  84, 198, 128, 195, 189,  13,  87,\n    223, 245,  36, 169,  62, 168,  67, 201,\n    215, 121, 214, 246, 124,  34, 185,   3,\n    224,  15, 236, 222, 122, 148, 176, 188,\n    220, 232,  40,  80,  78,  51,  10,  74,\n    167, 151,  96, 115,  30,   0,  98,  68,\n     26, 184,  56, 130, 100, 159,  38,  65,\n    173,  69,  70, 146,  39,  94,  85,  47,\n    140, 163, 165, 125, 105, 213, 149,  59,\n      7,  88, 179,  64, 134, 172,  29, 247,\n     48,  55, 107, 228, 136, 217, 231, 137,\n    225,  27, 131,  73,  76,  63, 248, 254,\n    141,  83, 170, 144, 202, 216, 133,  97,\n     32, 113, 103, 164,  45,  43,   9,  91,\n    203, 155,  37, 208, 190, 229, 108,  82,\n     89, 166, 116, 210, 230, 244, 180, 192,\n    209, 102, 175, 194,  57,  75,  99, 182\n};\n"
  },
  {
    "path": "lib/alg-gost3411-2012-core.c",
    "content": "/*\n * Copyright (c) 2013, Alexey Degtyarev <alexey@renatasystems.org>.\n * All rights reserved.\n *\n * GOST R 34.11-2012 core and API functions.\n *\n * $Id$\n */\n\n#include \"crypt-port.h\"\n\n#if INCLUDE_gost_yescrypt\n\n#include \"alg-gost3411-2012-core.h\"\n\n#pragma GCC diagnostic ignored \"-Wcast-align\"\n\n#define BSWAP64(x) \\\n    (((x & 0xFF00000000000000ULL) >> 56) | \\\n     ((x & 0x00FF000000000000ULL) >> 40) | \\\n     ((x & 0x0000FF0000000000ULL) >> 24) | \\\n     ((x & 0x000000FF00000000ULL) >>  8) | \\\n     ((x & 0x00000000FF000000ULL) <<  8) | \\\n     ((x & 0x0000000000FF0000ULL) << 24) | \\\n     ((x & 0x000000000000FF00ULL) << 40) | \\\n     ((x & 0x00000000000000FFULL) << 56))\n\nvoid\nGOST34112012Cleanup(GOST34112012Context *CTX)\n{\n    explicit_bzero(CTX, sizeof (GOST34112012Context));\n}\n\nvoid\nGOST34112012Init(GOST34112012Context *CTX, const unsigned int digest_size)\n{\n    unsigned int i;\n\n    memset(CTX, 0, sizeof (GOST34112012Context));\n    CTX->digest_size = digest_size;\n\n    for (i = 0; i < 8; i++)\n    {\n        if (digest_size == 256)\n            CTX->h.QWORD[i] = 0x0101010101010101ULL;\n        else\n            CTX->h.QWORD[i] = 0x00ULL;\n    }\n}\n\nstatic inline void\npad(GOST34112012Context *CTX)\n{\n    if (CTX->bufsize < sizeof CTX->buffer)\n    {\n        memset (CTX->buffer + CTX->bufsize, 0,\n                sizeof(CTX->buffer) - CTX->bufsize);\n        CTX->buffer[CTX->bufsize] = 0x01;\n    }\n}\n\nstatic inline void\nadd512(const uint512_u *x, const uint512_u *y, uint512_u *r)\n{\n#ifndef __GOST3411_BIG_ENDIAN__\n    unsigned int CF;\n    unsigned int i;\n\n    CF = 0;\n    for (i = 0; i < 8; i++)\n    {\n        const unsigned long long left = x->QWORD[i];\n        unsigned long long sum;\n\n        sum = left + y->QWORD[i] + CF;\n        if (sum != left)\n            CF = (sum < left);\n        r->QWORD[i] = sum;\n    }\n#else\n    const unsigned char *xp, *yp;\n    unsigned char *rp;\n    unsigned int i;\n    int buf;\n\n    xp = (const unsigned char *) &x[0];\n    yp = (const unsigned char *) &y[0];\n    rp = (unsigned char *) &r[0];\n\n    buf = 0;\n    for (i = 0; i < 64; i++)\n    {\n        buf = xp[i] + yp[i] + (buf >> 8);\n        rp[i] = (unsigned char) (buf & 0xFF);\n    }\n#endif\n}\n\nstatic void\ng(uint512_u *h, const uint512_u *N, const unsigned char *m)\n{\n#ifdef __GOST3411_HAS_SSE2__\n    __m128i xmm0, xmm2, xmm4, xmm6; /* XMMR0-quadruple */\n    __m128i xmm1, xmm3, xmm5, xmm7; /* XMMR1-quadruple */\n    unsigned int i;\n\n    LOAD(N, xmm0, xmm2, xmm4, xmm6);\n    XLPS128M(h, xmm0, xmm2, xmm4, xmm6);\n\n    LOAD(m, xmm1, xmm3, xmm5, xmm7);\n    XLPS128R(xmm0, xmm2, xmm4, xmm6, xmm1, xmm3, xmm5, xmm7);\n\n    for (i = 0; i < 11; i++)\n        ROUND128(i, xmm0, xmm2, xmm4, xmm6, xmm1, xmm3, xmm5, xmm7);\n\n    XLPS128M((&C[11]), xmm0, xmm2, xmm4, xmm6);\n    X128R(xmm0, xmm2, xmm4, xmm6, xmm1, xmm3, xmm5, xmm7);\n\n    X128M(h, xmm0, xmm2, xmm4, xmm6);\n    X128M(m, xmm0, xmm2, xmm4, xmm6);\n\n    UNLOAD(h, xmm0, xmm2, xmm4, xmm6);\n\n    /* Restore the Floating-point status on the CPU */\n    _mm_empty();\n#else\n    uint512_u Ki, data;\n    unsigned int i;\n\n    XLPS(h, N, (&data));\n\n    /* Starting E() */\n    Ki = data;\n    XLPS((&Ki), ((const uint512_u *) &m[0]), (&data));\n\n    for (i = 0; i < 11; i++)\n        ROUND(i, (&Ki), (&data));\n\n    XLPS((&Ki), (&C[11]), (&Ki));\n    X((&Ki), (&data), (&data));\n    /* E() done */\n\n    X((&data), h, (&data));\n    X((&data), ((const uint512_u *) &m[0]), h);\n#endif\n}\n\nstatic inline void\nstage2(GOST34112012Context *CTX, const unsigned char *data)\n{\n    uint512_u m;\n\n    memcpy(&m, data, sizeof(m));\n    g(&(CTX->h), &(CTX->N), (const unsigned char *)&m);\n\n    add512(&(CTX->N), &buffer512, &(CTX->N));\n    add512(&(CTX->Sigma), &m, &(CTX->Sigma));\n}\n\nstatic inline void\nstage3(GOST34112012Context *CTX)\n{\n    uint512_u buf = {{ 0 }};\n\n#ifndef __GOST3411_BIG_ENDIAN__\n    buf.QWORD[0] = CTX->bufsize << 3;\n#else\n    buf.QWORD[0] = BSWAP64(CTX->bufsize << 3);\n#endif\n\n    pad(CTX);\n\n    g(&(CTX->h), &(CTX->N), (const unsigned char *) &(CTX->buffer));\n\n    add512(&(CTX->N), &buf, &(CTX->N));\n    add512(&(CTX->Sigma), (const uint512_u *) &CTX->buffer[0],\n           &(CTX->Sigma));\n\n    g(&(CTX->h), &buffer0, (const unsigned char *) &(CTX->N));\n\n    g(&(CTX->h), &buffer0, (const unsigned char *) &(CTX->Sigma));\n    memcpy(&(CTX->hash), &(CTX->h), sizeof (uint512_u));\n}\n\nvoid\nGOST34112012Update(GOST34112012Context *CTX, const unsigned char *data, size_t len)\n{\n    size_t chunksize;\n\n    if (CTX->bufsize) {\n        chunksize = 64 - CTX->bufsize;\n        if (chunksize > len)\n            chunksize = len;\n\n        memcpy(&CTX->buffer[CTX->bufsize], data, chunksize);\n\n        CTX->bufsize += chunksize;\n        len -= chunksize;\n        data += chunksize;\n\n        if (CTX->bufsize == 64)\n        {\n            stage2(CTX, CTX->buffer);\n\n            CTX->bufsize = 0;\n        }\n    }\n\n    while (len > 63)\n    {\n        stage2(CTX, data);\n\n        data += 64;\n        len  -= 64;\n    }\n\n    if (len) {\n        memcpy(&CTX->buffer, data, len);\n        CTX->bufsize = len;\n    }\n}\n\nvoid\nGOST34112012Final(GOST34112012Context *CTX, unsigned char *digest)\n{\n    stage3(CTX);\n\n    CTX->bufsize = 0;\n\n    if (CTX->digest_size == 256)\n        memcpy(digest, &(CTX->hash.QWORD[4]), 32);\n    else\n        memcpy(digest, &(CTX->hash.QWORD[0]), 64);\n\n    GOST34112012Cleanup(CTX);\n}\n\n#endif /* INCLUDE_gost_yescrypt */\n"
  },
  {
    "path": "lib/alg-gost3411-2012-core.h",
    "content": "/*\n * Copyright (c) 2013, Alexey Degtyarev <alexey@renatasystems.org>.\n * All rights reserved.\n *\n * $Id$\n */\n\n#ifndef _CRYPT_ALG_GOST3411_2012_CORE_H\n#define _CRYPT_ALG_GOST3411_2012_CORE_H\n\n#if defined   __GOST3411_HAS_SSE41__\n#include \"alg-gost3411-2012-sse41.h\"\n#elif defined __GOST3411_HAS_SSE2__\n#include \"alg-gost3411-2012-sse2.h\"\n#elif defined __GOST3411_HAS_MMX__\n#include \"alg-gost3411-2012-mmx.h\"\n#else\n#include \"alg-gost3411-2012-ref.h\"\n#endif\n\ntypedef union uint512_u\n{\n    unsigned long long QWORD[8];\n} uint512_u;\n\n#include \"alg-gost3411-2012-const.h\"\n#include \"alg-gost3411-2012-precalc.h\"\n\ntypedef struct GOST34112012Context\n{\n    unsigned char buffer[64];\n    uint512_u hash;\n    uint512_u h;\n    uint512_u N;\n    uint512_u Sigma;\n    size_t bufsize;\n    unsigned int digest_size;\n} GOST34112012Context;\n\nextern void GOST34112012Init(GOST34112012Context *CTX,\n               const unsigned int digest_size);\n\nextern void GOST34112012Update(GOST34112012Context *CTX,\n               const unsigned char *data, size_t len);\n\nextern void GOST34112012Final(GOST34112012Context *CTX,\n               unsigned char *digest);\n\nextern void GOST34112012Cleanup(GOST34112012Context *CTX);\n\n#endif /* alg-gost3411-2012-core.h */\n"
  },
  {
    "path": "lib/alg-gost3411-2012-hmac.c",
    "content": "/* Copyright (C) 2018 vt@altlinux.org\n * Copyright (C) 2018 Björn Esser <besser82@fedoraproject.org>\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\n\n#include \"crypt-port.h\"\n\n#if INCLUDE_gost_yescrypt\n\n#include \"alg-gost3411-2012-hmac.h\"\n\n/* GOST2012_256 */\nvoid\ngost_hash256 (const uint8_t *t, size_t n, uint8_t *out32,\n              GOST34112012Context *ctx)\n{\n  GOST34112012Init (ctx, GOSTR3411_2012_BITS);\n  GOST34112012Update (ctx, t, n);\n  GOST34112012Final (ctx, out32);\n}\n\n/* HMAC_GOSTR3411_2012_256 */\nvoid\ngost_hmac256 (const uint8_t *k, size_t n, const uint8_t *t, size_t len,\n              uint8_t *out32, gost_hmac_256_t *gostbuf)\n{\n  size_t i;\n\n  /* R 50.1.113-2016 only allowed N to be in range 256..512 bits */\n  assert (n >= GOSTR3411_2012_L && n <= GOSTR3411_2012_B);\n\n  for (i = 0; i < sizeof (gostbuf->pad); i++)\n    gostbuf->kstar[i] = i < n ? k[i] : 0;\n\n  GOST34112012Init (&gostbuf->ctx, GOSTR3411_2012_BITS);\n\n  for (i = 0; i < sizeof (gostbuf->pad); i++)\n    gostbuf->pad[i] = gostbuf->kstar[i] ^ 0x36; /* ipad */\n\n  GOST34112012Update (&gostbuf->ctx, gostbuf->pad,\n                      sizeof (gostbuf->pad));\n  GOST34112012Update (&gostbuf->ctx, t, len);\n  GOST34112012Final (&gostbuf->ctx, gostbuf->digest);\n\n  /* Clear the context state. */\n  explicit_bzero (&gostbuf->ctx, sizeof (GOST34112012Context));\n\n  GOST34112012Init (&gostbuf->ctx, GOSTR3411_2012_BITS);\n\n  for (i = 0; i < sizeof (gostbuf->pad); i++)\n    gostbuf->pad[i] = gostbuf->kstar[i] ^ 0x5c; /* opad */\n\n  GOST34112012Update (&gostbuf->ctx, gostbuf->pad,\n                      sizeof (gostbuf->pad));\n  GOST34112012Update (&gostbuf->ctx, gostbuf->digest,\n                      sizeof (gostbuf->digest));\n  GOST34112012Final (&gostbuf->ctx, out32);\n\n  /* Clear the context state. */\n  explicit_bzero (gostbuf, sizeof (gost_hmac_256_t));\n}\n\n#endif /* INCLUDE_gost_yescrypt */\n"
  },
  {
    "path": "lib/alg-gost3411-2012-hmac.h",
    "content": "/* Copyright (C) 2018 vt@altlinux.org\n * Copyright (C) 2018 Björn Esser <besser82@fedoraproject.org>\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\n#ifndef _CRYPT_ALG_GOST3411_2012_HMAC_H\n#define _CRYPT_ALG_GOST3411_2012_HMAC_H\n\n#include \"alg-gost3411-2012-core.h\"\n\n/* Constants for HMAC_GOSTR3411_2012_256 */\n#define GOSTR3411_2012_L 32 /* hash output len */\n#define GOSTR3411_2012_B 64 /* hash input len (512) */\n#define GOSTR3411_2012_BITS GOSTR3411_2012_L * 8 /* 256 */\n\ntypedef struct\n{\n  GOST34112012Context ctx;\n  unsigned char pad[GOSTR3411_2012_B];   /* ipad and opad */\n  unsigned char kstar[GOSTR3411_2012_B]; /* derived key */\n  unsigned char digest[GOSTR3411_2012_L];\n} gost_hmac_256_t;\n\nextern void\ngost_hash256 (const uint8_t *t, size_t n, uint8_t *out32,\n              GOST34112012Context *ctx);\n\nextern void\ngost_hmac256 (const uint8_t *k, size_t n, const uint8_t *t, size_t len,\n              uint8_t *out32, gost_hmac_256_t *gostbuf);\n\n#endif /* alg-gost3411-2012-hmac.h */\n"
  },
  {
    "path": "lib/alg-gost3411-2012-precalc.h",
    "content": "/*\n * Copyright (c) 2013, Alexey Degtyarev <alexey@renatasystems.org>.\n * All rights reserved.\n *\n * Precalculation of matrix A multiplication.\n *\n * $Id$\n */\n\n#ifndef __GOST3411_BIG_ENDIAN__\nstatic const unsigned long long Ax[8][256] =\n{\n    {\n        0xd01f715b5c7ef8e6ULL, 0x16fa240980778325ULL, 0xa8a42e857ee049c8ULL,\n        0x6ac1068fa186465bULL, 0x6e417bd7a2e9320bULL, 0x665c8167a437daabULL,\n        0x7666681aa89617f6ULL, 0x4b959163700bdcf5ULL, 0xf14be6b78df36248ULL,\n        0xc585bd689a625cffULL, 0x9557d7fca67d82cbULL, 0x89f0b969af6dd366ULL,\n        0xb0833d48749f6c35ULL, 0xa1998c23b1ecbc7cULL, 0x8d70c431ac02a736ULL,\n        0xd6dfbc2fd0a8b69eULL, 0x37aeb3e551fa198bULL, 0x0b7d128a40b5cf9cULL,\n        0x5a8f2008b5780cbcULL, 0xedec882284e333e5ULL, 0xd25fc177d3c7c2ceULL,\n        0x5e0f5d50b61778ecULL, 0x1d873683c0c24cb9ULL, 0xad040bcbb45d208cULL,\n        0x2f89a0285b853c76ULL, 0x5732fff6791b8d58ULL, 0x3e9311439ef6ec3fULL,\n        0xc9183a809fd3c00fULL, 0x83adf3f5260a01eeULL, 0xa6791941f4e8ef10ULL,\n        0x103ae97d0ca1cd5dULL, 0x2ce948121dee1b4aULL, 0x39738421dbf2bf53ULL,\n        0x093da2a6cf0cf5b4ULL, 0xcd9847d89cbcb45fULL, 0xf9561c078b2d8ae8ULL,\n        0x9c6a755a6971777fULL, 0xbc1ebaa0712ef0c5ULL, 0x72e61542abf963a6ULL,\n        0x78bb5fde229eb12eULL, 0x14ba94250fceb90dULL, 0x844d6697630e5282ULL,\n        0x98ea08026a1e032fULL, 0xf06bbea144217f5cULL, 0xdb6263d11ccb377aULL,\n        0x641c314b2b8ee083ULL, 0x320e96ab9b4770cfULL, 0x1ee7deb986a96b85ULL,\n        0xe96cf57a878c47b5ULL, 0xfdd6615f8842feb8ULL, 0xc83862965601dd1bULL,\n        0x2ea9f83e92572162ULL, 0xf876441142ff97fcULL, 0xeb2c455608357d9dULL,\n        0x5612a7e0b0c9904cULL, 0x6c01cbfb2d500823ULL, 0x4548a6a7fa037a2dULL,\n        0xabc4c6bf388b6ef4ULL, 0xbade77d4fdf8bebdULL, 0x799b07c8eb4cac3aULL,\n        0x0c9d87e805b19cf0ULL, 0xcb588aac106afa27ULL, 0xea0c1d40c1e76089ULL,\n        0x2869354a1e816f1aULL, 0xff96d17307fbc490ULL, 0x9f0a9d602f1a5043ULL,\n        0x96373fc6e016a5f7ULL, 0x5292dab8b3a6e41cULL, 0x9b8ae0382c752413ULL,\n        0x4f15ec3b7364a8a5ULL, 0x3fb349555724f12bULL, 0xc7c50d4415db66d7ULL,\n        0x92b7429ee379d1a7ULL, 0xd37f99611a15dfdaULL, 0x231427c05e34a086ULL,\n        0xa439a96d7b51d538ULL, 0xb403401077f01865ULL, 0xdda2aea5901d7902ULL,\n        0x0a5d4a9c8967d288ULL, 0xc265280adf660f93ULL, 0x8bb0094520d4e94eULL,\n        0x2a29856691385532ULL, 0x42a833c5bf072941ULL, 0x73c64d54622b7eb2ULL,\n        0x07e095624504536cULL, 0x8a905153e906f45aULL, 0x6f6123c16b3b2f1fULL,\n        0xc6e55552dc097bc3ULL, 0x4468feb133d16739ULL, 0xe211e7f0c7398829ULL,\n        0xa2f96419f7879b40ULL, 0x19074bdbc3ad38e9ULL, 0xf4ebc3f9474e0b0cULL,\n        0x43886bd376d53455ULL, 0xd8028beb5aa01046ULL, 0x51f23282f5cdc320ULL,\n        0xe7b1c2be0d84e16dULL, 0x081dfab006dee8a0ULL, 0x3b33340d544b857bULL,\n        0x7f5bcabc679ae242ULL, 0x0edd37c48a08a6d8ULL, 0x81ed43d9a9b33bc6ULL,\n        0xb1a3655ebd4d7121ULL, 0x69a1eeb5e7ed6167ULL, 0xf6ab73d5c8f73124ULL,\n        0x1a67a3e185c61fd5ULL, 0x2dc91004d43c065eULL, 0x0240b02c8fb93a28ULL,\n        0x90f7f2b26cc0eb8fULL, 0x3cd3a16f114fd617ULL, 0xaae49ea9f15973e0ULL,\n        0x06c0cd748cd64e78ULL, 0xda423bc7d5192a6eULL, 0xc345701c16b41287ULL,\n        0x6d2193ede4821537ULL, 0xfcf639494190e3acULL, 0x7c3b228621f1c57eULL,\n        0xfb16ac2b0494b0c0ULL, 0xbf7e529a3745d7f9ULL, 0x6881b6a32e3f7c73ULL,\n        0xca78d2bad9b8e733ULL, 0xbbfe2fc2342aa3a9ULL, 0x0dbddffecc6381e4ULL,\n        0x70a6a56e2440598eULL, 0xe4d12a844befc651ULL, 0x8c509c2765d0ba22ULL,\n        0xee8c6018c28814d9ULL, 0x17da7c1f49a59e31ULL, 0x609c4c1328e194d3ULL,\n        0xb3e3d57232f44b09ULL, 0x91d7aaa4a512f69bULL, 0x0ffd6fd243dabbccULL,\n        0x50d26a943c1fde34ULL, 0x6be15e9968545b4fULL, 0x94778fea6faf9fdfULL,\n        0x2b09dd7058ea4826ULL, 0x677cd9716de5c7bfULL, 0x49d5214fffb2e6ddULL,\n        0x0360e83a466b273cULL, 0x1fc786af4f7b7691ULL, 0xa0b9d435783ea168ULL,\n        0xd49f0c035f118cb6ULL, 0x01205816c9d21d14ULL, 0xac2453dd7d8f3d98ULL,\n        0x545217cc3f70aa64ULL, 0x26b4028e9489c9c2ULL, 0xdec2469fd6765e3eULL,\n        0x04807d58036f7450ULL, 0xe5f17292823ddb45ULL, 0xf30b569b024a5860ULL,\n        0x62dcfc3fa758aefbULL, 0xe84cad6c4e5e5aa1ULL, 0xccb81fce556ea94bULL,\n        0x53b282ae7a74f908ULL, 0x1b47fbf74c1402c1ULL, 0x368eebf39828049fULL,\n        0x7afbeff2ad278b06ULL, 0xbe5e0a8cfe97caedULL, 0xcfd8f7f413058e77ULL,\n        0xf78b2bc301252c30ULL, 0x4d555c17fcdd928dULL, 0x5f2f05467fc565f8ULL,\n        0x24f4b2a21b30f3eaULL, 0x860dd6bbecb768aaULL, 0x4c750401350f8f99ULL,\n        0x0000000000000000ULL, 0xecccd0344d312ef1ULL, 0xb5231806be220571ULL,\n        0xc105c030990d28afULL, 0x653c695de25cfd97ULL, 0x159acc33c61ca419ULL,\n        0xb89ec7f872418495ULL, 0xa9847693b73254dcULL, 0x58cf90243ac13694ULL,\n        0x59efc832f3132b80ULL, 0x5c4fed7c39ae42c4ULL, 0x828dabe3efd81cfaULL,\n        0xd13f294d95ace5f2ULL, 0x7d1b7a90e823d86aULL, 0xb643f03cf849224dULL,\n        0x3df3f979d89dcb03ULL, 0x7426d836272f2ddeULL, 0xdfe21e891fa4432aULL,\n        0x3a136c1b9d99986fULL, 0xfa36f43dcd46add4ULL, 0xc025982650df35bbULL,\n        0x856d3e81aadc4f96ULL, 0xc4a5e57e53b041ebULL, 0x4708168b75ba4005ULL,\n        0xaf44bbe73be41aa4ULL, 0x971767d029c4b8e3ULL, 0xb9be9feebb939981ULL,\n        0x215497ecd18d9aaeULL, 0x316e7e91dd2c57f3ULL, 0xcef8afe2dad79363ULL,\n        0x3853dc371220a247ULL, 0x35ee03c9de4323a3ULL, 0xe6919aa8c456fc79ULL,\n        0xe05157dc4880b201ULL, 0x7bdbb7e464f59612ULL, 0x127a59518318f775ULL,\n        0x332ecebd52956ddbULL, 0x8f30741d23bb9d1eULL, 0xd922d3fd93720d52ULL,\n        0x7746300c61440ae2ULL, 0x25d4eab4d2e2eefeULL, 0x75068020eefd30caULL,\n        0x135a01474acaea61ULL, 0x304e268714fe4ae7ULL, 0xa519f17bb283c82cULL,\n        0xdc82f6b359cf6416ULL, 0x5baf781e7caa11a8ULL, 0xb2c38d64fb26561dULL,\n        0x34ce5bdf17913eb7ULL, 0x5d6fb56af07c5fd0ULL, 0x182713cd0a7f25fdULL,\n        0x9e2ac576e6c84d57ULL, 0x9aaab82ee5a73907ULL, 0xa3d93c0f3e558654ULL,\n        0x7e7b92aaae48ff56ULL, 0x872d8ead256575beULL, 0x41c8dbfff96c0e7dULL,\n        0x99ca5014a3cc1e3bULL, 0x40e883e930be1369ULL, 0x1ca76e95091051adULL,\n        0x4e35b42dbab6b5b1ULL, 0x05a0254ecabd6944ULL, 0xe1710fca8152af15ULL,\n        0xf22b0e8dcb984574ULL, 0xb763a82a319b3f59ULL, 0x63fca4296e8ab3efULL,\n        0x9d4a2d4ca0a36a6bULL, 0xe331bfe60eeb953dULL, 0xd5bf541596c391a2ULL,\n        0xf5cb9bef8e9c1618ULL, 0x46284e9dbc685d11ULL, 0x2074cffa185f87baULL,\n        0xbd3ee2b6b8fcedd1ULL, 0xae64e3f1f23607b0ULL, 0xfeb68965ce29d984ULL,\n        0x55724fdaf6a2b770ULL, 0x29496d5cd753720eULL, 0xa75941573d3af204ULL,\n        0x8e102c0bea69800aULL, 0x111ab16bc573d049ULL, 0xd7ffe439197aab8aULL,\n        0xefac380e0b5a09cdULL, 0x48f579593660fbc9ULL, 0x22347fd697e6bd92ULL,\n        0x61bc1405e13389c7ULL, 0x4ab5c975b9d9c1e1ULL, 0x80cd1bcf606126d2ULL,\n        0x7186fd78ed92449aULL, 0x93971a882aabccb3ULL, 0x88d0e17f66bfce72ULL,\n        0x27945a985d5bd4d6ULL\n    },\n    {\n        0xde553f8c05a811c8ULL, 0x1906b59631b4f565ULL, 0x436e70d6b1964ff7ULL,\n        0x36d343cb8b1e9d85ULL, 0x843dfacc858aab5aULL, 0xfdfc95c299bfc7f9ULL,\n        0x0f634bdea1d51fa2ULL, 0x6d458b3b76efb3cdULL, 0x85c3f77cf8593f80ULL,\n        0x3c91315fbe737cb2ULL, 0x2148b03366ace398ULL, 0x18f8b8264c6761bfULL,\n        0xc830c1c495c9fb0fULL, 0x981a76102086a0aaULL, 0xaa16012142f35760ULL,\n        0x35cc54060c763cf6ULL, 0x42907d66cc45db2dULL, 0x8203d44b965af4bcULL,\n        0x3d6f3cefc3a0e868ULL, 0xbc73ff69d292bda7ULL, 0x8722ed0102e20a29ULL,\n        0x8f8185e8cd34deb7ULL, 0x9b0561dda7ee01d9ULL, 0x5335a0193227fad6ULL,\n        0xc9cecc74e81a6fd5ULL, 0x54f5832e5c2431eaULL, 0x99e47ba05d553470ULL,\n        0xf7bee756acd226ceULL, 0x384e05a5571816fdULL, 0xd1367452a47d0e6aULL,\n        0xf29fde1c386ad85bULL, 0x320c77316275f7caULL, 0xd0c879e2d9ae9ab0ULL,\n        0xdb7406c69110ef5dULL, 0x45505e51a2461011ULL, 0xfc029872e46c5323ULL,\n        0xfa3cb6f5f7bc0cc5ULL, 0x031f17cd8768a173ULL, 0xbd8df2d9af41297dULL,\n        0x9d3b4f5ab43e5e3fULL, 0x4071671b36feee84ULL, 0x716207e7d3e3b83dULL,\n        0x48d20ff2f9283a1aULL, 0x27769eb4757cbc7eULL, 0x5c56ebc793f2e574ULL,\n        0xa48b474f9ef5dc18ULL, 0x52cbada94ff46e0cULL, 0x60c7da982d8199c6ULL,\n        0x0e9d466edc068b78ULL, 0x4eec2175eaf865fcULL, 0x550b8e9e21f7a530ULL,\n        0x6b7ba5bc653fec2bULL, 0x5eb7f1ba6949d0ddULL, 0x57ea94e3db4c9099ULL,\n        0xf640eae6d101b214ULL, 0xdd4a284182c0b0bbULL, 0xff1d8fbf6304f250ULL,\n        0xb8accb933bf9d7e8ULL, 0xe8867c478eb68c4dULL, 0x3f8e2692391bddc1ULL,\n        0xcb2fd60912a15a7cULL, 0xaec935dbab983d2fULL, 0xf55ffd2b56691367ULL,\n        0x80e2ce366ce1c115ULL, 0x179bf3f8edb27e1dULL, 0x01fe0db07dd394daULL,\n        0xda8a0b76ecc37b87ULL, 0x44ae53e1df9584cbULL, 0xb310b4b77347a205ULL,\n        0xdfab323c787b8512ULL, 0x3b511268d070b78eULL, 0x65e6e3d2b9396753ULL,\n        0x6864b271e2574d58ULL, 0x259784c98fc789d7ULL, 0x02e11a7dfabb35a9ULL,\n        0x8841a6dfa337158bULL, 0x7ade78c39b5dcdd0ULL, 0xb7cf804d9a2cc84aULL,\n        0x20b6bd831b7f7742ULL, 0x75bd331d3a88d272ULL, 0x418f6aab4b2d7a5eULL,\n        0xd9951cbb6babdaf4ULL, 0xb6318dfde7ff5c90ULL, 0x1f389b112264aa83ULL,\n        0x492c024284fbaec0ULL, 0xe33a0363c608f9a0ULL, 0x2688930408af28a4ULL,\n        0xc7538a1a341ce4adULL, 0x5da8e677ee2171aeULL, 0x8c9e92254a5c7fc4ULL,\n        0x63d8cd55aae938b5ULL, 0x29ebd8daa97a3706ULL, 0x959827b37be88aa1ULL,\n        0x1484e4356adadf6eULL, 0xa7945082199d7d6bULL, 0xbf6ce8a455fa1cd4ULL,\n        0x9cc542eac9edcae5ULL, 0x79c16f0e1c356ca3ULL, 0x89bfab6fdee48151ULL,\n        0xd4174d1830c5f0ffULL, 0x9258048415eb419dULL, 0x6139d72850520d1cULL,\n        0x6a85a80c18ec78f1ULL, 0xcd11f88e0171059aULL, 0xcceff53e7ca29140ULL,\n        0xd229639f2315af19ULL, 0x90b91ef9ef507434ULL, 0x5977d28d074a1be1ULL,\n        0x311360fce51d56b9ULL, 0xc093a92d5a1f2f91ULL, 0x1a19a25bb6dc5416ULL,\n        0xeb996b8a09de2d3eULL, 0xfee3820f1ed7668aULL, 0xd7085ad5b7ad518cULL,\n        0x7fff41890fe53345ULL, 0xec5948bd67dde602ULL, 0x2fd5f65dbaaa68e0ULL,\n        0xa5754affe32648c2ULL, 0xf8ddac880d07396cULL, 0x6fa491468c548664ULL,\n        0x0c7c5c1326bdbed1ULL, 0x4a33158f03930fb3ULL, 0x699abfc19f84d982ULL,\n        0xe4fa2054a80b329cULL, 0x6707f9af438252faULL, 0x08a368e9cfd6d49eULL,\n        0x47b1442c58fd25b8ULL, 0xbbb3dc5ebc91769bULL, 0x1665fe489061eac7ULL,\n        0x33f27a811fa66310ULL, 0x93a609346838d547ULL, 0x30ed6d4c98cec263ULL,\n        0x1dd9816cd8df9f2aULL, 0x94662a03063b1e7bULL, 0x83fdd9fbeb896066ULL,\n        0x7b207573e68e590aULL, 0x5f49fc0a149a4407ULL, 0x343259b671a5a82cULL,\n        0xfbc2bb458a6f981fULL, 0xc272b350a0a41a38ULL, 0x3aaf1fd8ada32354ULL,\n        0x6cbb868b0b3c2717ULL, 0xa2b569c88d2583feULL, 0xf180c9d1bf027928ULL,\n        0xaf37386bd64ba9f5ULL, 0x12bacab2790a8088ULL, 0x4c0d3b0810435055ULL,\n        0xb2eeb9070e9436dfULL, 0xc5b29067cea7d104ULL, 0xdcb425f1ff132461ULL,\n        0x4f122cc5972bf126ULL, 0xac282fa651230886ULL, 0xe7e537992f6393efULL,\n        0xe61b3a2952b00735ULL, 0x709c0a57ae302ce7ULL, 0xe02514ae416058d3ULL,\n        0xc44c9dd7b37445deULL, 0x5a68c5408022ba92ULL, 0x1c278cdca50c0bf0ULL,\n        0x6e5a9cf6f18712beULL, 0x86dce0b17f319ef3ULL, 0x2d34ec2040115d49ULL,\n        0x4bcd183f7e409b69ULL, 0x2815d56ad4a9a3dcULL, 0x24698979f2141d0dULL,\n        0x0000000000000000ULL, 0x1ec696a15fb73e59ULL, 0xd86b110b16784e2eULL,\n        0x8e7f8858b0e74a6dULL, 0x063e2e8713d05fe6ULL, 0xe2c40ed3bbdb6d7aULL,\n        0xb1f1aeca89fc97acULL, 0xe1db191e3cb3cc09ULL, 0x6418ee62c4eaf389ULL,\n        0xc6ad87aa49cf7077ULL, 0xd6f65765ca7ec556ULL, 0x9afb6c6dda3d9503ULL,\n        0x7ce05644888d9236ULL, 0x8d609f95378feb1eULL, 0x23a9aa4e9c17d631ULL,\n        0x6226c0e5d73aac6fULL, 0x56149953a69f0443ULL, 0xeeb852c09d66d3abULL,\n        0x2b0ac2a753c102afULL, 0x07c023376e03cb3cULL, 0x2ccae1903dc2c993ULL,\n        0xd3d76e2f5ec63bc3ULL, 0x9e2458973356ff4cULL, 0xa66a5d32644ee9b1ULL,\n        0x0a427294356de137ULL, 0x783f62be61e6f879ULL, 0x1344c70204d91452ULL,\n        0x5b96c8f0fdf12e48ULL, 0xa90916ecc59bf613ULL, 0xbe92e5142829880eULL,\n        0x727d102a548b194eULL, 0x1be7afebcb0fc0ccULL, 0x3e702b2244c8491bULL,\n        0xd5e940a84d166425ULL, 0x66f9f41f3e51c620ULL, 0xabe80c913f20c3baULL,\n        0xf07ec461c2d1edf2ULL, 0xf361d3ac45b94c81ULL, 0x0521394a94b8fe95ULL,\n        0xadd622162cf09c5cULL, 0xe97871f7f3651897ULL, 0xf4a1f09b2bba87bdULL,\n        0x095d6559b2054044ULL, 0x0bbc7f2448be75edULL, 0x2af4cf172e129675ULL,\n        0x157ae98517094bb4ULL, 0x9fda55274e856b96ULL, 0x914713499283e0eeULL,\n        0xb952c623462a4332ULL, 0x74433ead475b46a8ULL, 0x8b5eb112245fb4f8ULL,\n        0xa34b6478f0f61724ULL, 0x11a5dd7ffe6221fbULL, 0xc16da49d27ccbb4bULL,\n        0x76a224d0bde07301ULL, 0x8aa0bca2598c2022ULL, 0x4df336b86d90c48fULL,\n        0xea67663a740db9e4ULL, 0xef465f70e0b54771ULL, 0x39b008152acb8227ULL,\n        0x7d1e5bf4f55e06ecULL, 0x105bd0cf83b1b521ULL, 0x775c2960c033e7dbULL,\n        0x7e014c397236a79fULL, 0x811cc386113255cfULL, 0xeda7450d1a0e72d8ULL,\n        0x5889df3d7a998f3bULL, 0x2e2bfbedc779fc3aULL, 0xce0eef438619a4e9ULL,\n        0x372d4e7bf6cd095fULL, 0x04df34fae96b6a4fULL, 0xf923a13870d4adb6ULL,\n        0xa1aa7e050a4d228dULL, 0xa8f71b5cb84862c9ULL, 0xb52e9a306097fde3ULL,\n        0x0d8251a35b6e2a0bULL, 0x2257a7fee1c442ebULL, 0x73831d9a29588d94ULL,\n        0x51d4ba64c89ccf7fULL, 0x502ab7d4b54f5ba5ULL, 0x97793dce8153bf08ULL,\n        0xe5042de4d5d8a646ULL, 0x9687307efc802bd2ULL, 0xa05473b5779eb657ULL,\n        0xb4d097801d446939ULL, 0xcff0e2f3fbca3033ULL, 0xc38cbee0dd778ee2ULL,\n        0x464f499c252eb162ULL, 0xcad1dbb96f72cea6ULL, 0xba4dd1eec142e241ULL,\n        0xb00fa37af42f0376ULL\n    },\n    {\n        0xcce4cd3aa968b245ULL, 0x089d5484e80b7fafULL, 0x638246c1b3548304ULL,\n        0xd2fe0ec8c2355492ULL, 0xa7fbdf7ff2374eeeULL, 0x4df1600c92337a16ULL,\n        0x84e503ea523b12fbULL, 0x0790bbfd53ab0c4aULL, 0x198a780f38f6ea9dULL,\n        0x2ab30c8f55ec48cbULL, 0xe0f7fed6b2c49db5ULL, 0xb6ecf3f422cadbdcULL,\n        0x409c9a541358df11ULL, 0xd3ce8a56dfde3fe3ULL, 0xc3e9224312c8c1a0ULL,\n        0x0d6dfa58816ba507ULL, 0xddf3e1b179952777ULL, 0x04c02a42748bb1d9ULL,\n        0x94c2abff9f2decb8ULL, 0x4f91752da8f8acf4ULL, 0x78682befb169bf7bULL,\n        0xe1c77a48af2ff6c4ULL, 0x0c5d7ec69c80ce76ULL, 0x4cc1e4928fd81167ULL,\n        0xfeed3d24d9997b62ULL, 0x518bb6dfc3a54a23ULL, 0x6dbf2d26151f9b90ULL,\n        0xb5bc624b05ea664fULL, 0xe86aaa525acfe21aULL, 0x4801ced0fb53a0beULL,\n        0xc91463e6c00868edULL, 0x1027a815cd16fe43ULL, 0xf67069a0319204cdULL,\n        0xb04ccc976c8abce7ULL, 0xc0b9b3fc35e87c33ULL, 0xf380c77c58f2de65ULL,\n        0x50bb3241de4e2152ULL, 0xdf93f490435ef195ULL, 0xf1e0d25d62390887ULL,\n        0xaf668bfb1a3c3141ULL, 0xbc11b251f00a7291ULL, 0x73a5eed47e427d47ULL,\n        0x25bee3f6ee4c3b2eULL, 0x43cc0beb34786282ULL, 0xc824e778dde3039cULL,\n        0xf97d86d98a327728ULL, 0xf2b043e24519b514ULL, 0xe297ebf7880f4b57ULL,\n        0x3a94a49a98fab688ULL, 0x868516cb68f0c419ULL, 0xeffa11af0964ee50ULL,\n        0xa4ab4ec0d517f37dULL, 0xa9c6b498547c567aULL, 0x8e18424f80fbbbb6ULL,\n        0x0bcdc53bcf2bc23cULL, 0x137739aaea3643d0ULL, 0x2c1333ec1bac2ff0ULL,\n        0x8d48d3f0a7db0625ULL, 0x1e1ac3f26b5de6d7ULL, 0xf520f81f16b2b95eULL,\n        0x9f0f6ec450062e84ULL, 0x0130849e1deb6b71ULL, 0xd45e31ab8c7533a9ULL,\n        0x652279a2fd14e43fULL, 0x3209f01e70f1c927ULL, 0xbe71a770cac1a473ULL,\n        0x0e3d6be7a64b1894ULL, 0x7ec8148cff29d840ULL, 0xcb7476c7fac3be0fULL,\n        0x72956a4a63a91636ULL, 0x37f95ec21991138fULL, 0x9e3fea5a4ded45f5ULL,\n        0x7b38ba50964902e8ULL, 0x222e580bbde73764ULL, 0x61e253e0899f55e6ULL,\n        0xfc8d2805e352ad80ULL, 0x35994be3235ac56dULL, 0x09add01af5e014deULL,\n        0x5e8659a6780539c6ULL, 0xb17c48097161d796ULL, 0x026015213acbd6e2ULL,\n        0xd1ae9f77e515e901ULL, 0xb7dc776a3f21b0adULL, 0xaba6a1b96eb78098ULL,\n        0x9bcf4486248d9f5dULL, 0x582666c536455efdULL, 0xfdbdac9bfeb9c6f1ULL,\n        0xc47999be4163cdeaULL, 0x765540081722a7efULL, 0x3e548ed8ec710751ULL,\n        0x3d041f67cb51bac2ULL, 0x7958af71ac82d40aULL, 0x36c9da5c047a78feULL,\n        0xed9a048e33af38b2ULL, 0x26ee7249c96c86bdULL, 0x900281bdeba65d61ULL,\n        0x11172c8bd0fd9532ULL, 0xea0abf73600434f8ULL, 0x42fc8f75299309f3ULL,\n        0x34a9cf7d3eb1ae1cULL, 0x2b838811480723baULL, 0x5ce64c8742ceef24ULL,\n        0x1adae9b01fd6570eULL, 0x3c349bf9d6bad1b3ULL, 0x82453c891c7b75c0ULL,\n        0x97923a40b80d512bULL, 0x4a61dbf1c198765cULL, 0xb48ce6d518010d3eULL,\n        0xcfb45c858e480fd6ULL, 0xd933cbf30d1e96aeULL, 0xd70ea014ab558e3aULL,\n        0xc189376228031742ULL, 0x9262949cd16d8b83ULL, 0xeb3a3bed7def5f89ULL,\n        0x49314a4ee6b8cbcfULL, 0xdcc3652f647e4c06ULL, 0xda635a4c2a3e2b3dULL,\n        0x470c21a940f3d35bULL, 0x315961a157d174b4ULL, 0x6672e81dda3459acULL,\n        0x5b76f77a1165e36eULL, 0x445cb01667d36ec8ULL, 0xc5491d205c88a69bULL,\n        0x456c34887a3805b9ULL, 0xffddb9bac4721013ULL, 0x99af51a71e4649bfULL,\n        0xa15be01cbc7729d5ULL, 0x52db2760e485f7b0ULL, 0x8c78576eba306d54ULL,\n        0xae560f6507d75a30ULL, 0x95f22f6182c687c9ULL, 0x71c5fbf54489aba5ULL,\n        0xca44f259e728d57eULL, 0x88b87d2ccebbdc8dULL, 0xbab18d32be4a15aaULL,\n        0x8be8ec93e99b611eULL, 0x17b713e89ebdf209ULL, 0xb31c5d284baa0174ULL,\n        0xeeca9531148f8521ULL, 0xb8d198138481c348ULL, 0x8988f9b2d350b7fcULL,\n        0xb9e11c8d996aa839ULL, 0x5a4673e40c8e881fULL, 0x1687977683569978ULL,\n        0xbf4123eed72acf02ULL, 0x4ea1f1b3b513c785ULL, 0xe767452be16f91ffULL,\n        0x7505d1b730021a7cULL, 0xa59bca5ec8fc980cULL, 0xad069eda20f7e7a3ULL,\n        0x38f4b1bba231606aULL, 0x60d2d77e94743e97ULL, 0x9affc0183966f42cULL,\n        0x248e6768f3a7505fULL, 0xcdd449a4b483d934ULL, 0x87b59255751baf68ULL,\n        0x1bea6d2e023d3c7fULL, 0x6b1f12455b5ffcabULL, 0x743555292de9710dULL,\n        0xd8034f6d10f5fddfULL, 0xc6198c9f7ba81b08ULL, 0xbb8109aca3a17edbULL,\n        0xfa2d1766ad12cabbULL, 0xc729080166437079ULL, 0x9c5fff7b77269317ULL,\n        0x0000000000000000ULL, 0x15d706c9a47624ebULL, 0x6fdf38072fd44d72ULL,\n        0x5fb6dd3865ee52b7ULL, 0xa33bf53d86bcff37ULL, 0xe657c1b5fc84fa8eULL,\n        0xaa962527735cebe9ULL, 0x39c43525bfda0b1bULL, 0x204e4d2a872ce186ULL,\n        0x7a083ece8ba26999ULL, 0x554b9c9db72efbfaULL, 0xb22cd9b656416a05ULL,\n        0x96a2bedea5e63a5aULL, 0x802529a826b0a322ULL, 0x8115ad363b5bc853ULL,\n        0x8375b81701901eb1ULL, 0x3069e53f4a3a1fc5ULL, 0xbd2136cfede119e0ULL,\n        0x18bafc91251d81ecULL, 0x1d4a524d4c7d5b44ULL, 0x05f0aedc6960daa8ULL,\n        0x29e39d3072ccf558ULL, 0x70f57f6b5962c0d4ULL, 0x989fd53903ad22ceULL,\n        0xf84d024797d91c59ULL, 0x547b1803aac5908bULL, 0xf0d056c37fd263f6ULL,\n        0xd56eb535919e58d8ULL, 0x1c7ad6d351963035ULL, 0x2e7326cd2167f912ULL,\n        0xac361a443d1c8cd2ULL, 0x697f076461942a49ULL, 0x4b515f6fdc731d2dULL,\n        0x8ad8680df4700a6fULL, 0x41ac1eca0eb3b460ULL, 0x7d988533d80965d3ULL,\n        0xa8f6300649973d0bULL, 0x7765c4960ac9cc9eULL, 0x7ca801adc5e20ea2ULL,\n        0xdea3700e5eb59ae4ULL, 0xa06b6482a19c42a4ULL, 0x6a2f96db46b497daULL,\n        0x27def6d7d487edccULL, 0x463ca5375d18b82aULL, 0xa6cb5be1efdc259fULL,\n        0x53eba3fef96e9cc1ULL, 0xce84d81b93a364a7ULL, 0xf4107c810b59d22fULL,\n        0x333974806d1aa256ULL, 0x0f0def79bba073e5ULL, 0x231edc95a00c5c15ULL,\n        0xe437d494c64f2c6cULL, 0x91320523f64d3610ULL, 0x67426c83c7df32ddULL,\n        0x6eefbc99323f2603ULL, 0x9d6f7be56acdf866ULL, 0x5916e25b2bae358cULL,\n        0x7ff89012e2c2b331ULL, 0x035091bf2720bd93ULL, 0x561b0d22900e4669ULL,\n        0x28d319ae6f279e29ULL, 0x2f43a2533c8c9263ULL, 0xd09e1be9f8fe8270ULL,\n        0xf740ed3e2c796fbcULL, 0xdb53ded237d5404cULL, 0x62b2c25faebfe875ULL,\n        0x0afd41a5d2c0a94dULL, 0x6412fd3ce0ff8f4eULL, 0xe3a76f6995e42026ULL,\n        0x6c8fa9b808f4f0e1ULL, 0xc2d9a6dd0f23aad1ULL, 0x8f28c6d19d10d0c7ULL,\n        0x85d587744fd0798aULL, 0xa20b71a39b579446ULL, 0x684f83fa7c7f4138ULL,\n        0xe507500adba4471dULL, 0x3f640a46f19a6c20ULL, 0x1247bd34f7dd28a1ULL,\n        0x2d23b77206474481ULL, 0x93521002cc86e0f2ULL, 0x572b89bc8de52d18ULL,\n        0xfb1d93f8b0f9a1caULL, 0xe95a2ecc4724896bULL, 0x3ba420048511ddf9ULL,\n        0xd63e248ab6bee54bULL, 0x5dd6c8195f258455ULL, 0x06a03f634e40673bULL,\n        0x1f2a476c76b68da6ULL, 0x217ec9b49ac78af7ULL, 0xecaa80102e4453c3ULL,\n        0x14e78257b99d4f9aULL\n    },\n    {\n        0x20329b2cc87bba05ULL, 0x4f5eb6f86546a531ULL, 0xd4f44775f751b6b1ULL,\n        0x8266a47b850dfa8bULL, 0xbb986aa15a6ca985ULL, 0xc979eb08f9ae0f99ULL,\n        0x2da6f447a2375ea1ULL, 0x1e74275dcd7d8576ULL, 0xbc20180a800bc5f8ULL,\n        0xb4a2f701b2dc65beULL, 0xe726946f981b6d66ULL, 0x48e6c453bf21c94cULL,\n        0x42cad9930f0a4195ULL, 0xefa47b64aacccd20ULL, 0x71180a8960409a42ULL,\n        0x8bb3329bf6a44e0cULL, 0xd34c35de2d36daccULL, 0xa92f5b7cbc23dc96ULL,\n        0xb31a85aa68bb09c3ULL, 0x13e04836a73161d2ULL, 0xb24dfc4129c51d02ULL,\n        0x8ae44b70b7da5acdULL, 0xe671ed84d96579a7ULL, 0xa4bb3417d66f3832ULL,\n        0x4572ab38d56d2de8ULL, 0xb1b47761ea47215cULL, 0xe81c09cf70aba15dULL,\n        0xffbdb872ce7f90acULL, 0xa8782297fd5dc857ULL, 0x0d946f6b6a4ce4a4ULL,\n        0xe4df1f4f5b995138ULL, 0x9ebc71edca8c5762ULL, 0x0a2c1dc0b02b88d9ULL,\n        0x3b503c115d9d7b91ULL, 0xc64376a8111ec3a2ULL, 0xcec199a323c963e4ULL,\n        0xdc76a87ec58616f7ULL, 0x09d596e073a9b487ULL, 0x14583a9d7d560dafULL,\n        0xf4c6dc593f2a0cb4ULL, 0xdd21d19584f80236ULL, 0x4a4836983ddde1d3ULL,\n        0xe58866a41ae745f9ULL, 0xf591a5b27e541875ULL, 0x891dc05074586693ULL,\n        0x5b068c651810a89eULL, 0xa30346bc0c08544fULL, 0x3dbf3751c684032dULL,\n        0x2a1e86ec785032dcULL, 0xf73f5779fca830eaULL, 0xb60c05ca30204d21ULL,\n        0x0cc316802b32f065ULL, 0x8770241bdd96be69ULL, 0xb861e18199ee95dbULL,\n        0xf805cad91418fcd1ULL, 0x29e70dccbbd20e82ULL, 0xc7140f435060d763ULL,\n        0x0f3a9da0e8b0cc3bULL, 0xa2543f574d76408eULL, 0xbd7761e1c175d139ULL,\n        0x4b1f4f737ca3f512ULL, 0x6dc2df1f2fc137abULL, 0xf1d05c3967b14856ULL,\n        0xa742bf3715ed046cULL, 0x654030141d1697edULL, 0x07b872abda676c7dULL,\n        0x3ce84eba87fa17ecULL, 0xc1fb0403cb79afdfULL, 0x3e46bc7105063f73ULL,\n        0x278ae987121cd678ULL, 0xa1adb4778ef47cd0ULL, 0x26dd906c5362c2b9ULL,\n        0x05168060589b44e2ULL, 0xfbfc41f9d79ac08fULL, 0x0e6de44ba9ced8faULL,\n        0x9feb08068bf243a3ULL, 0x7b341749d06b129bULL, 0x229c69e74a87929aULL,\n        0xe09ee6c4427c011bULL, 0x5692e30e725c4c3aULL, 0xda99a33e5e9f6e4bULL,\n        0x353dd85af453a36bULL, 0x25241b4c90e0fee7ULL, 0x5de987258309d022ULL,\n        0xe230140fc0802984ULL, 0x93281e86a0c0b3c6ULL, 0xf229d719a4337408ULL,\n        0x6f6c2dd4ad3d1f34ULL, 0x8ea5b2fbae3f0aeeULL, 0x8331dd90c473ee4aULL,\n        0x346aa1b1b52db7aaULL, 0xdf8f235e06042aa9ULL, 0xcc6f6b68a1354b7bULL,\n        0x6c95a6f46ebf236aULL, 0x52d31a856bb91c19ULL, 0x1a35ded6d498d555ULL,\n        0xf37eaef2e54d60c9ULL, 0x72e181a9a3c2a61cULL, 0x98537aad51952fdeULL,\n        0x16f6c856ffaa2530ULL, 0xd960281e9d1d5215ULL, 0x3a0745fa1ce36f50ULL,\n        0x0b7b642bf1559c18ULL, 0x59a87eae9aec8001ULL, 0x5e100c05408bec7cULL,\n        0x0441f98b19e55023ULL, 0xd70dcc5534d38aefULL, 0x927f676de1bea707ULL,\n        0x9769e70db925e3e5ULL, 0x7a636ea29115065aULL, 0x468b201816ef11b6ULL,\n        0xab81a9b73edff409ULL, 0xc0ac7de88a07bb1eULL, 0x1f235eb68c0391b7ULL,\n        0x6056b074458dd30fULL, 0xbe8eeac102f7ed67ULL, 0xcd381283e04b5fbaULL,\n        0x5cbefecec277c4e3ULL, 0xd21b4c356c48ce0dULL, 0x1019c31664b35d8cULL,\n        0x247362a7d19eea26ULL, 0xebe582efb3299d03ULL, 0x02aef2cb82fc289fULL,\n        0x86275df09ce8aaa8ULL, 0x28b07427faac1a43ULL, 0x38a9b7319e1f47cfULL,\n        0xc82e92e3b8d01b58ULL, 0x06ef0b409b1978bcULL, 0x62f842bfc771fb90ULL,\n        0x9904034610eb3b1fULL, 0xded85ab5477a3e68ULL, 0x90d195a663428f98ULL,\n        0x5384636e2ac708d8ULL, 0xcbd719c37b522706ULL, 0xae9729d76644b0ebULL,\n        0x7c8c65e20a0c7ee6ULL, 0x80c856b007f1d214ULL, 0x8c0b40302cc32271ULL,\n        0xdbcedad51fe17a8aULL, 0x740e8ae938dbdea0ULL, 0xa615c6dc549310adULL,\n        0x19cc55f6171ae90bULL, 0x49b1bdb8fe5fdd8dULL, 0xed0a89af2830e5bfULL,\n        0x6a7aadb4f5a65bd6ULL, 0x7e22972988f05679ULL, 0xf952b3325566e810ULL,\n        0x39fecedadf61530eULL, 0x6101c99f04f3c7ceULL, 0x2e5f7f6761b562ffULL,\n        0xf08725d226cf5c97ULL, 0x63af3b54860fef51ULL, 0x8ff2cb10ef411e2fULL,\n        0x884ab9bb35267252ULL, 0x4df04433e7ba8daeULL, 0x9afd8866d3690741ULL,\n        0x66b9bb34de94abb3ULL, 0x9baaf18d92171380ULL, 0x543c11c5f0a064a5ULL,\n        0x17a1b1bdbed431f1ULL, 0xb5f58eeaf3a2717fULL, 0xc355f6c849858740ULL,\n        0xec5df044694ef17eULL, 0xd83751f5dc6346d4ULL, 0xfc4433520dfdacf2ULL,\n        0x0000000000000000ULL, 0x5a51f58e596ebc5fULL, 0x3285aaf12e34cf16ULL,\n        0x8d5c39db6dbd36b0ULL, 0x12b731dde64f7513ULL, 0x94906c2d7aa7dfbbULL,\n        0x302b583aacc8e789ULL, 0x9d45facd090e6b3cULL, 0x2165e2c78905aec4ULL,\n        0x68d45f7f775a7349ULL, 0x189b2c1d5664fdcaULL, 0xe1c99f2f030215daULL,\n        0x6983269436246788ULL, 0x8489af3b1e148237ULL, 0xe94b702431d5b59cULL,\n        0x33d2d31a6f4adbd7ULL, 0xbfd9932a4389f9a6ULL, 0xb0e30e8aab39359dULL,\n        0xd1e2c715afcaf253ULL, 0x150f43763c28196eULL, 0xc4ed846393e2eb3dULL,\n        0x03f98b20c3823c5eULL, 0xfd134ab94c83b833ULL, 0x556b682eb1de7064ULL,\n        0x36c4537a37d19f35ULL, 0x7559f30279a5ca61ULL, 0x799ae58252973a04ULL,\n        0x9c12832648707ffdULL, 0x78cd9c6913e92ec5ULL, 0x1d8dac7d0effb928ULL,\n        0x439da0784e745554ULL, 0x413352b3cc887dcbULL, 0xbacf134a1b12bd44ULL,\n        0x114ebafd25cd494dULL, 0x2f08068c20cb763eULL, 0x76a07822ba27f63fULL,\n        0xeab2fb04f25789c2ULL, 0xe3676de481fe3d45ULL, 0x1b62a73d95e6c194ULL,\n        0x641749ff5c68832cULL, 0xa5ec4dfc97112cf3ULL, 0xf6682e92bdd6242bULL,\n        0x3f11c59a44782bb2ULL, 0x317c21d1edb6f348ULL, 0xd65ab5be75ad9e2eULL,\n        0x6b2dd45fb4d84f17ULL, 0xfaab381296e4d44eULL, 0xd0b5befeeeb4e692ULL,\n        0x0882ef0b32d7a046ULL, 0x512a91a5a83b2047ULL, 0x963e9ee6f85bf724ULL,\n        0x4e09cf132438b1f0ULL, 0x77f701c9fb59e2feULL, 0x7ddb1c094b726a27ULL,\n        0x5f4775ee01f5f8bdULL, 0x9186ec4d223c9b59ULL, 0xfeeac1998f01846dULL,\n        0xac39db1ce4b89874ULL, 0xb75b7c21715e59e0ULL, 0xafc0503c273aa42aULL,\n        0x6e3b543fec430bf5ULL, 0x704f7362213e8e83ULL, 0x58ff0745db9294c0ULL,\n        0x67eec2df9feabf72ULL, 0xa0facd9ccf8a6811ULL, 0xb936986ad890811aULL,\n        0x95c715c63bd9cb7aULL, 0xca8060283a2c33c7ULL, 0x507de84ee9453486ULL,\n        0x85ded6d05f6a96f6ULL, 0x1cdad5964f81ade9ULL, 0xd5a33e9eb62fa270ULL,\n        0x40642b588df6690aULL, 0x7f75eec2c98e42b8ULL, 0x2cf18dace3494a60ULL,\n        0x23cb100c0bf9865bULL, 0xeef3028febb2d9e1ULL, 0x4425d2d394133929ULL,\n        0xaad6d05c7fa1e0c8ULL, 0xad6ea2f7a5c68cb5ULL, 0xc2028f2308fb9381ULL,\n        0x819f2f5b468fc6d5ULL, 0xc5bafd88d29cfffcULL, 0x47dc59f357910577ULL,\n        0x2b49ff07392e261dULL, 0x57c59ae5332258fbULL, 0x73b6f842e2bcb2ddULL,\n        0xcf96e04862b77725ULL, 0x4ca73dd8a6c4996fULL, 0x015779eb417e14c1ULL,\n        0x37932a9176af8bf4ULL\n    },\n    {\n        0x190a2c9b249df23eULL, 0x2f62f8b62263e1e9ULL, 0x7a7f754740993655ULL,\n        0x330b7ba4d5564d9fULL, 0x4c17a16a46672582ULL, 0xb22f08eb7d05f5b8ULL,\n        0x535f47f40bc148ccULL, 0x3aec5d27d4883037ULL, 0x10ed0a1825438f96ULL,\n        0x516101f72c233d17ULL, 0x13cc6f949fd04eaeULL, 0x739853c441474bfdULL,\n        0x653793d90d3f5b1bULL, 0x5240647b96b0fc2fULL, 0x0c84890ad27623e0ULL,\n        0xd7189b32703aaea3ULL, 0x2685de3523bd9c41ULL, 0x99317c5b11bffefaULL,\n        0x0d9baa854f079703ULL, 0x70b93648fbd48ac5ULL, 0xa80441fce30bc6beULL,\n        0x7287704bdc36ff1eULL, 0xb65384ed33dc1f13ULL, 0xd36417343ee34408ULL,\n        0x39cd38ab6e1bf10fULL, 0x5ab861770a1f3564ULL, 0x0ebacf09f594563bULL,\n        0xd04572b884708530ULL, 0x3cae9722bdb3af47ULL, 0x4a556b6f2f5cbaf2ULL,\n        0xe1704f1f76c4bd74ULL, 0x5ec4ed7144c6dfcfULL, 0x16afc01d4c7810e6ULL,\n        0x283f113cd629ca7aULL, 0xaf59a8761741ed2dULL, 0xeed5a3991e215facULL,\n        0x3bf37ea849f984d4ULL, 0xe413e096a56ce33cULL, 0x2c439d3a98f020d1ULL,\n        0x637559dc6404c46bULL, 0x9e6c95d1e5f5d569ULL, 0x24bb9836045fe99aULL,\n        0x44efa466dac8ecc9ULL, 0xc6eab2a5c80895d6ULL, 0x803b50c035220cc4ULL,\n        0x0321658cba93c138ULL, 0x8f9ebc465dc7ee1cULL, 0xd15a5137190131d3ULL,\n        0x0fa5ec8668e5e2d8ULL, 0x91c979578d1037b1ULL, 0x0642ca05693b9f70ULL,\n        0xefca80168350eb4fULL, 0x38d21b24f36a45ecULL, 0xbeab81e1af73d658ULL,\n        0x8cbfd9cae7542f24ULL, 0xfd19cc0d81f11102ULL, 0x0ac6430fbb4dbc90ULL,\n        0x1d76a09d6a441895ULL, 0x2a01573ff1cbbfa1ULL, 0xb572e161894fde2bULL,\n        0x8124734fa853b827ULL, 0x614b1fdf43e6b1b0ULL, 0x68ac395c4238cc18ULL,\n        0x21d837bfd7f7b7d2ULL, 0x20c714304a860331ULL, 0x5cfaab726324aa14ULL,\n        0x74c5ba4eb50d606eULL, 0xf3a3030474654739ULL, 0x23e671bcf015c209ULL,\n        0x45f087e947b9582aULL, 0xd8bd77b418df4c7bULL, 0xe06f6c90ebb50997ULL,\n        0x0bd96080263c0873ULL, 0x7e03f9410e40dcfeULL, 0xb8e94be4c6484928ULL,\n        0xfb5b0608e8ca8e72ULL, 0x1a2b49179e0e3306ULL, 0x4e29e76961855059ULL,\n        0x4f36c4e6fcf4e4baULL, 0x49740ee395cf7bcaULL, 0xc2963ea386d17f7dULL,\n        0x90d65ad810618352ULL, 0x12d34c1b02a1fa4dULL, 0xfa44258775bb3a91ULL,\n        0x18150f14b9ec46ddULL, 0x1491861e6b9a653dULL, 0x9a1019d7ab2c3fc2ULL,\n        0x3668d42d06fe13d7ULL, 0xdcc1fbb25606a6d0ULL, 0x969490dd795a1c22ULL,\n        0x3549b1a1bc6dd2efULL, 0xc94f5e23a0ed770eULL, 0xb9f6686b5b39fdcbULL,\n        0xc4d4f4a6efeae00dULL, 0xe732851a1fff2204ULL, 0x94aad6de5eb869f9ULL,\n        0x3f8ff2ae07206e7fULL, 0xfe38a9813b62d03aULL, 0xa7a1ad7a8bee2466ULL,\n        0x7b6056c8dde882b6ULL, 0x302a1e286fc58ca7ULL, 0x8da0fa457a259bc7ULL,\n        0xb3302b64e074415bULL, 0x5402ae7eff8b635fULL, 0x08f8050c9cafc94bULL,\n        0xae468bf98a3059ceULL, 0x88c355cca98dc58fULL, 0xb10e6d67c7963480ULL,\n        0xbad70de7e1aa3cf3ULL, 0xbfb4a26e320262bbULL, 0xcb711820870f02d5ULL,\n        0xce12b7a954a75c9dULL, 0x563ce87dd8691684ULL, 0x9f73b65e7884618aULL,\n        0x2b1e74b06cba0b42ULL, 0x47cec1ea605b2df1ULL, 0x1c698312f735ac76ULL,\n        0x5fdbcefed9b76b2cULL, 0x831a354c8fb1cdfcULL, 0x820516c312c0791fULL,\n        0xb74ca762aeadabf0ULL, 0xfc06ef821c80a5e1ULL, 0x5723cbf24518a267ULL,\n        0x9d4df05d5f661451ULL, 0x588627742dfd40bfULL, 0xda8331b73f3d39a0ULL,\n        0x17b0e392d109a405ULL, 0xf965400bcf28fba9ULL, 0x7c3dbf4229a2a925ULL,\n        0x023e460327e275dbULL, 0x6cd0b55a0ce126b3ULL, 0xe62da695828e96e7ULL,\n        0x42ad6e63b3f373b9ULL, 0xe50cc319381d57dfULL, 0xc5cbd729729b54eeULL,\n        0x46d1e265fd2a9912ULL, 0x6428b056904eeff8ULL, 0x8be23040131e04b7ULL,\n        0x6709d5da2add2ec0ULL, 0x075de98af44a2b93ULL, 0x8447dcc67bfbe66fULL,\n        0x6616f655b7ac9a23ULL, 0xd607b8bded4b1a40ULL, 0x0563af89d3a85e48ULL,\n        0x3db1b4ad20c21ba4ULL, 0x11f22997b8323b75ULL, 0x292032b34b587e99ULL,\n        0x7f1cdace9331681dULL, 0x8e819fc9c0b65affULL, 0xa1e3677fe2d5bb16ULL,\n        0xcd33d225ee349da5ULL, 0xd9a2543b85aef898ULL, 0x795e10cbfa0af76dULL,\n        0x25a4bbb9992e5d79ULL, 0x78413344677b438eULL, 0xf0826688cef68601ULL,\n        0xd27b34bba392f0ebULL, 0x551d8df162fad7bcULL, 0x1e57c511d0d7d9adULL,\n        0xdeffbdb171e4d30bULL, 0xf4feea8e802f6caaULL, 0xa480c8f6317de55eULL,\n        0xa0fc44f07fa40ff5ULL, 0x95b5f551c3c9dd1aULL, 0x22f952336d6476eaULL,\n        0x0000000000000000ULL, 0xa6be8ef5169f9085ULL, 0xcc2cf1aa73452946ULL,\n        0x2e7ddb39bf12550aULL, 0xd526dd3157d8db78ULL, 0x486b2d6c08becf29ULL,\n        0x9b0f3a58365d8b21ULL, 0xac78cdfaadd22c15ULL, 0xbc95c7e28891a383ULL,\n        0x6a927f5f65dab9c3ULL, 0xc3891d2c1ba0cb9eULL, 0xeaa92f9f50f8b507ULL,\n        0xcf0d9426c9d6e87eULL, 0xca6e3baf1a7eb636ULL, 0xab25247059980786ULL,\n        0x69b31ad3df4978fbULL, 0xe2512a93cc577c4cULL, 0xff278a0ea61364d9ULL,\n        0x71a615c766a53e26ULL, 0x89dc764334fc716cULL, 0xf87a638452594f4aULL,\n        0xf2bc208be914f3daULL, 0x8766b94ac1682757ULL, 0xbbc82e687cdb8810ULL,\n        0x626a7a53f9757088ULL, 0xa2c202f358467a2eULL, 0x4d0882e5db169161ULL,\n        0x09e7268301de7da8ULL, 0xe897699c771ac0dcULL, 0xc8507dac3d9cc3edULL,\n        0xc0a878a0a1330aa6ULL, 0x978bb352e42ba8c1ULL, 0xe9884a13ea6b743fULL,\n        0x279afdbabecc28a2ULL, 0x047c8c064ed9eaabULL, 0x507e2278b15289f4ULL,\n        0x599904fbb08cf45cULL, 0xbd8ae46d15e01760ULL, 0x31353da7f2b43844ULL,\n        0x8558ff49e68a528cULL, 0x76fbfc4d92ef15b5ULL, 0x3456922e211c660cULL,\n        0x86799ac55c1993b4ULL, 0x3e90d1219a51da9cULL, 0x2d5cbeb505819432ULL,\n        0x982e5fd48cce4a19ULL, 0xdb9c1238a24c8d43ULL, 0xd439febecaa96f9bULL,\n        0x418c0bef0960b281ULL, 0x158ea591f6ebd1deULL, 0x1f48e69e4da66d4eULL,\n        0x8afd13cf8e6fb054ULL, 0xf5e1c9011d5ed849ULL, 0xe34e091c5126c8afULL,\n        0xad67ee7530a398f6ULL, 0x43b24dec2e82c75aULL, 0x75da99c1287cd48dULL,\n        0x92e81cdb3783f689ULL, 0xa3dd217cc537cecdULL, 0x60543c50de970553ULL,\n        0x93f73f54aaf2426aULL, 0xa91b62737e7a725dULL, 0xf19d4507538732e2ULL,\n        0x77e4dfc20f9ea156ULL, 0x7d229ccdb4d31dc6ULL, 0x1b346a98037f87e5ULL,\n        0xedf4c615a4b29e94ULL, 0x4093286094110662ULL, 0xb0114ee85ae78063ULL,\n        0x6ff1d0d6b672e78bULL, 0x6dcf96d591909250ULL, 0xdfe09e3eec9567e8ULL,\n        0x3214582b4827f97cULL, 0xb46dc2ee143e6ac8ULL, 0xf6c0ac8da7cd1971ULL,\n        0xebb60c10cd8901e4ULL, 0xf7df8f023abcad92ULL, 0x9c52d3d2c217a0b2ULL,\n        0x6b8d5cd0f8ab0d20ULL, 0x3777f7a29b8fa734ULL, 0x011f238f9d71b4e3ULL,\n        0xc1b75b2f3c42be45ULL, 0x5de588fdfe551ef7ULL, 0x6eeef3592b035368ULL,\n        0xaa3a07ffc4e9b365ULL, 0xecebe59a39c32a77ULL, 0x5ba742f8976e8187ULL,\n        0x4b4a48e0b22d0e11ULL, 0xddded83dcb771233ULL, 0xa59feb79ac0c51bdULL,\n        0xc7f5912a55792135ULL\n    },\n    {\n        0x6d6ae04668a9b08aULL, 0x3ab3f04b0be8c743ULL, 0xe51e166b54b3c908ULL,\n        0xbe90a9eb35c2f139ULL, 0xb2c7066637f2bec1ULL, 0xaa6945613392202cULL,\n        0x9a28c36f3b5201ebULL, 0xddce5a93ab536994ULL, 0x0e34133ef6382827ULL,\n        0x52a02ba1ec55048bULL, 0xa2f88f97c4b2a177ULL, 0x8640e513ca2251a5ULL,\n        0xcdf1d36258137622ULL, 0xfe6cb708dedf8ddbULL, 0x8a174a9ec8121e5dULL,\n        0x679896036b81560eULL, 0x59ed033395795feeULL, 0x1dd778ab8b74edafULL,\n        0xee533ef92d9f926dULL, 0x2a8c79baf8a8d8f5ULL, 0x6bcf398e69b119f6ULL,\n        0xe20491742fafdd95ULL, 0x276488e0809c2aecULL, 0xea955b82d88f5cceULL,\n        0x7102c63a99d9e0c4ULL, 0xf9763017a5c39946ULL, 0x429fa2501f151b3dULL,\n        0x4659c72bea05d59eULL, 0x984b7fdccf5a6634ULL, 0xf742232953fbb161ULL,\n        0x3041860e08c021c7ULL, 0x747bfd9616cd9386ULL, 0x4bb1367192312787ULL,\n        0x1b72a1638a6c44d3ULL, 0x4a0e68a6e8359a66ULL, 0x169a5039f258b6caULL,\n        0xb98a2ef44edee5a4ULL, 0xd9083fe85e43a737ULL, 0x967f6ce239624e13ULL,\n        0x8874f62d3c1a7982ULL, 0x3c1629830af06e3fULL, 0x9165ebfd427e5a8eULL,\n        0xb5dd81794ceeaa5cULL, 0x0de8f15a7834f219ULL, 0x70bd98ede3dd5d25ULL,\n        0xaccc9ca9328a8950ULL, 0x56664eda1945ca28ULL, 0x221db34c0f8859aeULL,\n        0x26dbd637fa98970dULL, 0x1acdffb4f068f932ULL, 0x4585254f64090fa0ULL,\n        0x72de245e17d53afaULL, 0x1546b25d7c546cf4ULL, 0x207e0ffffb803e71ULL,\n        0xfaaad2732bcf4378ULL, 0xb462dfae36ea17bdULL, 0xcf926fd1ac1b11fdULL,\n        0xe0672dc7dba7ba4aULL, 0xd3fa49ad5d6b41b3ULL, 0x8ba81449b216a3bcULL,\n        0x14f9ec8a0650d115ULL, 0x40fc1ee3eb1d7ce2ULL, 0x23a2ed9b758ce44fULL,\n        0x782c521b14fddc7eULL, 0x1c68267cf170504eULL, 0xbcf31558c1ca96e6ULL,\n        0xa781b43b4ba6d235ULL, 0xf6fd7dfe29ff0c80ULL, 0xb0a4bad5c3fad91eULL,\n        0xd199f51ea963266cULL, 0x414340349119c103ULL, 0x5405f269ed4dadf7ULL,\n        0xabd61bb649969dcdULL, 0x6813dbeae7bdc3c8ULL, 0x65fb2ab09f8931d1ULL,\n        0xf1e7fae152e3181dULL, 0xc1a67cef5a2339daULL, 0x7a4feea8e0f5bba1ULL,\n        0x1e0b9acf05783791ULL, 0x5b8ebf8061713831ULL, 0x80e53cdbcb3af8d9ULL,\n        0x7e898bd315e57502ULL, 0xc6bcfbf0213f2d47ULL, 0x95a38e86b76e942dULL,\n        0x092e94218d243cbaULL, 0x8339debf453622e7ULL, 0xb11be402b9fe64ffULL,\n        0x57d9100d634177c9ULL, 0xcc4e8db52217cbc3ULL, 0x3b0cae9c71ec7aa2ULL,\n        0xfb158ca451cbfe99ULL, 0x2b33276d82ac6514ULL, 0x01bf5ed77a04bde1ULL,\n        0xc5601994af33f779ULL, 0x75c4a3416cc92e67ULL, 0xf3844652a6eb7fc2ULL,\n        0x3487e375fdd0ef64ULL, 0x18ae430704609eedULL, 0x4d14efb993298efbULL,\n        0x815a620cb13e4538ULL, 0x125c354207487869ULL, 0x9eeea614ce42cf48ULL,\n        0xce2d3106d61fac1cULL, 0xbbe99247bad6827bULL, 0x071a871f7b1c149dULL,\n        0x2e4a1cc10db81656ULL, 0x77a71ff298c149b8ULL, 0x06a5d9c80118a97cULL,\n        0xad73c27e488e34b1ULL, 0x443a7b981e0db241ULL, 0xe3bbcfa355ab6074ULL,\n        0x0af276450328e684ULL, 0x73617a896dd1871bULL, 0x58525de4ef7de20fULL,\n        0xb7be3dcab8e6cd83ULL, 0x19111dd07e64230cULL, 0x842359a03e2a367aULL,\n        0x103f89f1f3401fb6ULL, 0xdc710444d157d475ULL, 0xb835702334da5845ULL,\n        0x4320fc876511a6dcULL, 0xd026abc9d3679b8dULL, 0x17250eee885c0b2bULL,\n        0x90dab52a387ae76fULL, 0x31fed8d972c49c26ULL, 0x89cba8fa461ec463ULL,\n        0x2ff5421677bcabb7ULL, 0x396f122f85e41d7dULL, 0xa09b332430bac6a8ULL,\n        0xc888e8ced7070560ULL, 0xaeaf201ac682ee8fULL, 0x1180d7268944a257ULL,\n        0xf058a43628e7a5fcULL, 0xbd4c4b8fbbce2b07ULL, 0xa1246df34abe7b49ULL,\n        0x7d5569b79be9af3cULL, 0xa9b5a705bd9efa12ULL, 0xdb6b835baa4bc0e8ULL,\n        0x05793bac8f147342ULL, 0x21c1512881848390ULL, 0xfdb0556c50d357e5ULL,\n        0x613d4fcb6a99ff72ULL, 0x03dce2648e0cda3eULL, 0xe949b9e6568386f0ULL,\n        0xfc0f0bbb2ad7ea04ULL, 0x6a70675913b5a417ULL, 0x7f36d5046fe1c8e3ULL,\n        0x0c57af8d02304ff8ULL, 0x32223abdfcc84618ULL, 0x0891caf6f720815bULL,\n        0xa63eeaec31a26fd4ULL, 0x2507345374944d33ULL, 0x49d28ac266394058ULL,\n        0xf5219f9aa7f3d6beULL, 0x2d96fea583b4cc68ULL, 0x5a31e1571b7585d0ULL,\n        0x8ed12fe53d02d0feULL, 0xdfade6205f5b0e4bULL, 0x4cabb16ee92d331aULL,\n        0x04c6657bf510cea3ULL, 0xd73c2cd6a87b8f10ULL, 0xe1d87310a1a307abULL,\n        0x6cd5be9112ad0d6bULL, 0x97c032354366f3f2ULL, 0xd4e0ceb22677552eULL,\n        0x0000000000000000ULL, 0x29509bde76a402cbULL, 0xc27a9e8bd42fe3e4ULL,\n        0x5ef7842cee654b73ULL, 0xaf107ecdbc86536eULL, 0x3fcacbe784fcb401ULL,\n        0xd55f90655c73e8cfULL, 0xe6c2f40fdabf1336ULL, 0xe8f6e7312c873b11ULL,\n        0xeb2a0555a28be12fULL, 0xe4a148bc2eb774e9ULL, 0x9b979db84156bc0aULL,\n        0x6eb60222e6a56ab4ULL, 0x87ffbbc4b026ec44ULL, 0xc703a5275b3b90a6ULL,\n        0x47e699fc9001687fULL, 0x9c8d1aa73a4aa897ULL, 0x7cea3760e1ed12ddULL,\n        0x4ec80ddd1d2554c5ULL, 0x13e36b957d4cc588ULL, 0x5d2b66486069914dULL,\n        0x92b90999cc7280b0ULL, 0x517cc9c56259deb5ULL, 0xc937b619ad03b881ULL,\n        0xec30824ad997f5b2ULL, 0xa45d565fc5aa080bULL, 0xd6837201d27f32f1ULL,\n        0x635ef3789e9198adULL, 0x531f75769651b96aULL, 0x4f77530a6721e924ULL,\n        0x486dd4151c3dfdb9ULL, 0x5f48dafb9461f692ULL, 0x375b011173dc355aULL,\n        0x3da9775470f4d3deULL, 0x8d0dcd81b30e0ac0ULL, 0x36e45fc609d888bbULL,\n        0x55baacbe97491016ULL, 0x8cb29356c90ab721ULL, 0x76184125e2c5f459ULL,\n        0x99f4210bb55edbd5ULL, 0x6f095cf59ca1d755ULL, 0x9f51f8c3b44672a9ULL,\n        0x3538bda287d45285ULL, 0x50c39712185d6354ULL, 0xf23b1885dcefc223ULL,\n        0x79930ccc6ef9619fULL, 0xed8fdc9da3934853ULL, 0xcb540aaa590bdf5eULL,\n        0x5c94389f1a6d2cacULL, 0xe77daad8a0bbaed7ULL, 0x28efc5090ca0bf2aULL,\n        0xbf2ff73c4fc64cd8ULL, 0xb37858b14df60320ULL, 0xf8c96ec0dfc724a7ULL,\n        0x828680683f329f06ULL, 0x941cd051cd6a29ccULL, 0xc3c5c05cae2b5e05ULL,\n        0xb601631dc2e27062ULL, 0xc01922382027843bULL, 0x24b86a840e90f0d2ULL,\n        0xd245177a276ffc52ULL, 0x0f8b4de98c3c95c6ULL, 0x3e759530fef809e0ULL,\n        0x0b4d2892792c5b65ULL, 0xc4df4743d5374a98ULL, 0xa5e20888bfaeb5eaULL,\n        0xba56cc90c0d23f9aULL, 0x38d04cf8ffe0a09cULL, 0x62e1adafe495254cULL,\n        0x0263bcb3f40867dfULL, 0xcaeb547d230f62bfULL, 0x6082111c109d4293ULL,\n        0xdad4dd8cd04f7d09ULL, 0xefec602e579b2f8cULL, 0x1fb4c4187f7c8a70ULL,\n        0xffd3e9dfa4db303aULL, 0x7bf0b07f9af10640ULL, 0xf49ec14dddf76b5fULL,\n        0x8f6e713247066d1fULL, 0x339d646a86ccfbf9ULL, 0x64447467e58d8c30ULL,\n        0x2c29a072f9b07189ULL, 0xd8b7613f24471ad6ULL, 0x6627c8d41185ebefULL,\n        0xa347d140beb61c96ULL, 0xde12b8f7255fb3aaULL, 0x9d324470404e1576ULL,\n        0x9306574eb6763d51ULL, 0xa80af9d2c79a47f3ULL, 0x859c0777442e8b9bULL,\n        0x69ac853d9db97e29ULL\n    },\n    {\n        0xc3407dfc2de6377eULL, 0x5b9e93eea4256f77ULL, 0xadb58fdd50c845e0ULL,\n        0x5219ff11a75bed86ULL, 0x356b61cfd90b1de9ULL, 0xfb8f406e25abe037ULL,\n        0x7a5a0231c0f60796ULL, 0x9d3cd216e1f5020bULL, 0x0c6550fb6b48d8f3ULL,\n        0xf57508c427ff1c62ULL, 0x4ad35ffa71cb407dULL, 0x6290a2da1666aa6dULL,\n        0xe284ec2349355f9fULL, 0xb3c307c53d7c84ecULL, 0x05e23c0468365a02ULL,\n        0x190bac4d6c9ebfa8ULL, 0x94bbbee9e28b80faULL, 0xa34fc777529cb9b5ULL,\n        0xcc7b39f095bcd978ULL, 0x2426addb0ce532e3ULL, 0x7e79329312ce4fc7ULL,\n        0xab09a72eebec2917ULL, 0xf8d15499f6b9d6c2ULL, 0x1a55b8babf8c895dULL,\n        0xdb8add17fb769a85ULL, 0xb57f2f368658e81bULL, 0x8acd36f18f3f41f6ULL,\n        0x5ce3b7bba50f11d3ULL, 0x114dcc14d5ee2f0aULL, 0xb91a7fcded1030e8ULL,\n        0x81d5425fe55de7a1ULL, 0xb6213bc1554adeeeULL, 0x80144ef95f53f5f2ULL,\n        0x1e7688186db4c10cULL, 0x3b912965db5fe1bcULL, 0xc281715a97e8252dULL,\n        0x54a5d7e21c7f8171ULL, 0x4b12535ccbc5522eULL, 0x1d289cefbea6f7f9ULL,\n        0x6ef5f2217d2e729eULL, 0xe6a7dc819b0d17ceULL, 0x1b94b41c05829b0eULL,\n        0x33d7493c622f711eULL, 0xdcf7f942fa5ce421ULL, 0x600fba8b7f7a8ecbULL,\n        0x46b60f011a83988eULL, 0x235b898e0dcf4c47ULL, 0x957ab24f588592a9ULL,\n        0x4354330572b5c28cULL, 0xa5f3ef84e9b8d542ULL, 0x8c711e02341b2d01ULL,\n        0x0b1874ae6a62a657ULL, 0x1213d8e306fc19ffULL, 0xfe6d7c6a4d9dba35ULL,\n        0x65ed868f174cd4c9ULL, 0x88522ea0e6236550ULL, 0x899322065c2d7703ULL,\n        0xc01e690bfef4018bULL, 0x915982ed8abddaf8ULL, 0xbe675b98ec3a4e4cULL,\n        0xa996bf7f82f00db1ULL, 0xe1daf8d49a27696aULL, 0x2effd5d3dc8986e7ULL,\n        0xd153a51f2b1a2e81ULL, 0x18caa0ebd690adfbULL, 0x390e3134b243c51aULL,\n        0x2778b92cdff70416ULL, 0x029f1851691c24a6ULL, 0x5e7cafeacc133575ULL,\n        0xfa4e4cc89fa5f264ULL, 0x5a5f9f481e2b7d24ULL, 0x484c47ab18d764dbULL,\n        0x400a27f2a1a7f479ULL, 0xaeeb9b2a83da7315ULL, 0x721c626879869734ULL,\n        0x042330a2d2384851ULL, 0x85f672fd3765aff0ULL, 0xba446b3a3e02061dULL,\n        0x73dd6ecec3888567ULL, 0xffac70ccf793a866ULL, 0xdfa9edb5294ed2d4ULL,\n        0x6c6aea7014325638ULL, 0x834a5a0e8c41c307ULL, 0xcdba35562fb2cb2bULL,\n        0x0ad97808d06cb404ULL, 0x0f3b440cb85aee06ULL, 0xe5f9c876481f213bULL,\n        0x98deee1289c35809ULL, 0x59018bbfcd394bd1ULL, 0xe01bf47220297b39ULL,\n        0xde68e1139340c087ULL, 0x9fa3ca4788e926adULL, 0xbb85679c840c144eULL,\n        0x53d8f3b71d55ffd5ULL, 0x0da45c5dd146caa0ULL, 0x6f34fe87c72060cdULL,\n        0x57fbc315cf6db784ULL, 0xcee421a1fca0fddeULL, 0x3d2d0196607b8d4bULL,\n        0x642c8a29ad42c69aULL, 0x14aff010bdd87508ULL, 0xac74837beac657b3ULL,\n        0x3216459ad821634dULL, 0x3fb219c70967a9edULL, 0x06bc28f3bb246cf7ULL,\n        0xf2082c9126d562c6ULL, 0x66b39278c45ee23cULL, 0xbd394f6f3f2878b9ULL,\n        0xfd33689d9e8f8cc0ULL, 0x37f4799eb017394fULL, 0x108cc0b26fe03d59ULL,\n        0xda4bd1b1417888d6ULL, 0xb09d1332ee6eb219ULL, 0x2f3ed975668794b4ULL,\n        0x58c0871977375982ULL, 0x7561463d78ace990ULL, 0x09876cff037e82f1ULL,\n        0x7fb83e35a8c05d94ULL, 0x26b9b58a65f91645ULL, 0xef20b07e9873953fULL,\n        0x3148516d0b3355b8ULL, 0x41cb2b541ba9e62aULL, 0x790416c613e43163ULL,\n        0xa011d380818e8f40ULL, 0x3a5025c36151f3efULL, 0xd57095bdf92266d0ULL,\n        0x498d4b0da2d97688ULL, 0x8b0c3a57353153a5ULL, 0x21c491df64d368e1ULL,\n        0x8f2f0af5e7091bf4ULL, 0x2da1c1240f9bb012ULL, 0xc43d59a92ccc49daULL,\n        0xbfa6573e56345c1fULL, 0x828b56a8364fd154ULL, 0x9a41f643e0df7cafULL,\n        0xbcf843c985266aeaULL, 0x2b1de9d7b4bfdce5ULL, 0x20059d79dedd7ab2ULL,\n        0x6dabe6d6ae3c446bULL, 0x45e81bf6c991ae7bULL, 0x6351ae7cac68b83eULL,\n        0xa432e32253b6c711ULL, 0xd092a9b991143cd2ULL, 0xcac711032e98b58fULL,\n        0xd8d4c9e02864ac70ULL, 0xc5fc550f96c25b89ULL, 0xd7ef8dec903e4276ULL,\n        0x67729ede7e50f06fULL, 0xeac28c7af045cf3dULL, 0xb15c1f945460a04aULL,\n        0x9cfddeb05bfb1058ULL, 0x93c69abce3a1fe5eULL, 0xeb0380dc4a4bdd6eULL,\n        0xd20db1e8f8081874ULL, 0x229a8528b7c15e14ULL, 0x44291750739fbc28ULL,\n        0xd3ccbd4e42060a27ULL, 0xf62b1c33f4ed2a97ULL, 0x86a8660ae4779905ULL,\n        0xd62e814a2a305025ULL, 0x477703a7a08d8addULL, 0x7b9b0e977af815c5ULL,\n        0x78c51a60a9ea2330ULL, 0xa6adfb733aaae3b7ULL, 0x97e5aa1e3199b60fULL,\n        0x0000000000000000ULL, 0xf4b404629df10e31ULL, 0x5564db44a6719322ULL,\n        0x9207961a59afec0dULL, 0x9624a6b88b97a45cULL, 0x363575380a192b1cULL,\n        0x2c60cd82b595a241ULL, 0x7d272664c1dc7932ULL, 0x7142769faa94a1c1ULL,\n        0xa1d0df263b809d13ULL, 0x1630e841d4c451aeULL, 0xc1df65ad44fa13d8ULL,\n        0x13d2d445bcf20bacULL, 0xd915c546926abe23ULL, 0x38cf3d92084dd749ULL,\n        0xe766d0272103059dULL, 0xc7634d5effde7f2fULL, 0x077d2455012a7ea4ULL,\n        0xedbfa82ff16fb199ULL, 0xaf2a978c39d46146ULL, 0x42953fa3c8bbd0dfULL,\n        0xcb061da59496a7dcULL, 0x25e7a17db6eb20b0ULL, 0x34aa6d6963050fbaULL,\n        0xa76cf7d580a4f1e4ULL, 0xf7ea10954ee338c4ULL, 0xfcf2643b24819e93ULL,\n        0xcf252d0746aeef8dULL, 0x4ef06f58a3f3082cULL, 0x563acfb37563a5d7ULL,\n        0x5086e740ce47c920ULL, 0x2982f186dda3f843ULL, 0x87696aac5e798b56ULL,\n        0x5d22bb1d1f010380ULL, 0x035e14f7d31236f5ULL, 0x3cec0d30da759f18ULL,\n        0xf3c920379cdb7095ULL, 0xb8db736b571e22bbULL, 0xdd36f5e44052f672ULL,\n        0xaac8ab8851e23b44ULL, 0xa857b3d938fe1fe2ULL, 0x17f1e4e76eca43fdULL,\n        0xec7ea4894b61a3caULL, 0x9e62c6e132e734feULL, 0xd4b1991b432c7483ULL,\n        0x6ad6c283af163acfULL, 0x1ce9904904a8e5aaULL, 0x5fbda34c761d2726ULL,\n        0xf910583f4cb7c491ULL, 0xc6a241f845d06d7cULL, 0x4f3163fe19fd1a7fULL,\n        0xe99c988d2357f9c8ULL, 0x8eee06535d0709a7ULL, 0x0efa48aa0254fc55ULL,\n        0xb4be23903c56fa48ULL, 0x763f52caabbedf65ULL, 0xeee1bcd8227d876cULL,\n        0xe345e085f33b4dccULL, 0x3e731561b369bbbeULL, 0x2843fd2067adea10ULL,\n        0x2adce5710eb1ceb6ULL, 0xb7e03767ef44ccbdULL, 0x8db012a48e153f52ULL,\n        0x61ceb62dc5749c98ULL, 0xe85d942b9959eb9bULL, 0x4c6f7709caef2c8aULL,\n        0x84377e5b8d6bbda3ULL, 0x30895dcbb13d47ebULL, 0x74a04a9bc2a2fbc3ULL,\n        0x6b17ce251518289cULL, 0xe438c4d0f2113368ULL, 0x1fb784bed7bad35fULL,\n        0x9b80fae55ad16efcULL, 0x77fe5e6c11b0cd36ULL, 0xc858095247849129ULL,\n        0x08466059b97090a2ULL, 0x01c10ca6ba0e1253ULL, 0x6988d6747c040c3aULL,\n        0x6849dad2c60a1e69ULL, 0x5147ebe67449db73ULL, 0xc99905f4fd8a837aULL,\n        0x991fe2b433cd4a5aULL, 0xf09734c04fc94660ULL, 0xa28ecbd1e892abe6ULL,\n        0xf1563866f5c75433ULL, 0x4dae7baf70e13ed9ULL, 0x7ce62ac27bd26b61ULL,\n        0x70837a39109ab392ULL, 0x90988e4b30b3c8abULL, 0xb2020b63877296bfULL,\n        0x156efcb607d6675bULL\n    },\n    {\n        0xe63f55ce97c331d0ULL, 0x25b506b0015bba16ULL, 0xc8706e29e6ad9ba8ULL,\n        0x5b43d3775d521f6aULL, 0x0bfa3d577035106eULL, 0xab95fc172afb0e66ULL,\n        0xf64b63979e7a3276ULL, 0xf58b4562649dad4bULL, 0x48f7c3dbae0c83f1ULL,\n        0xff31916642f5c8c5ULL, 0xcbb048dc1c4a0495ULL, 0x66b8f83cdf622989ULL,\n        0x35c130e908e2b9b0ULL, 0x7c761a61f0b34fa1ULL, 0x3601161cf205268dULL,\n        0x9e54ccfe2219b7d6ULL, 0x8b7d90a538940837ULL, 0x9cd403588ea35d0bULL,\n        0xbc3c6fea9ccc5b5aULL, 0xe5ff733b6d24aeedULL, 0xceed22de0f7eb8d2ULL,\n        0xec8581cab1ab545eULL, 0xb96105e88ff8e71dULL, 0x8ca03501871a5eadULL,\n        0x76ccce65d6db2a2fULL, 0x5883f582a7b58057ULL, 0x3f7be4ed2e8adc3eULL,\n        0x0fe7be06355cd9c9ULL, 0xee054e6c1d11be83ULL, 0x1074365909b903a6ULL,\n        0x5dde9f80b4813c10ULL, 0x4a770c7d02b6692cULL, 0x5379c8d5d7809039ULL,\n        0xb4067448161ed409ULL, 0x5f5e5026183bd6cdULL, 0xe898029bf4c29df9ULL,\n        0x7fb63c940a54d09cULL, 0xc5171f897f4ba8bcULL, 0xa6f28db7b31d3d72ULL,\n        0x2e4f3be7716eaa78ULL, 0x0d6771a099e63314ULL, 0x82076254e41bf284ULL,\n        0x2f0fd2b42733df98ULL, 0x5c9e76d3e2dc49f0ULL, 0x7aeb569619606cdbULL,\n        0x83478b07b2468764ULL, 0xcfadcb8d5923cd32ULL, 0x85dac7f05b95a41eULL,\n        0xb5469d1b4043a1e9ULL, 0xb821ecbbd9a592fdULL, 0x1b8e0b0e798c13c8ULL,\n        0x62a57b6d9a0be02eULL, 0xfcf1b793b81257f8ULL, 0x9d94ea0bd8fe28ebULL,\n        0x4cea408aeb654a56ULL, 0x23284a47e888996cULL, 0x2d8f1d128b893545ULL,\n        0xf4cbac3132c0d8abULL, 0xbd7c86b9ca912ebaULL, 0x3a268eef3dbe6079ULL,\n        0xf0d62f6077a9110cULL, 0x2735c916ade150cbULL, 0x89fd5f03942ee2eaULL,\n        0x1acee25d2fd16628ULL, 0x90f39bab41181bffULL, 0x430dfe8cde39939fULL,\n        0xf70b8ac4c8274796ULL, 0x1c53aeaac6024552ULL, 0x13b410acf35e9c9bULL,\n        0xa532ab4249faa24fULL, 0x2b1251e5625a163fULL, 0xd7e3e676da4841c7ULL,\n        0xa7b264e4e5404892ULL, 0xda8497d643ae72d3ULL, 0x861ae105a1723b23ULL,\n        0x38a6414991048aa4ULL, 0x6578dec92585b6b4ULL, 0x0280cfa6acbaeaddULL,\n        0x88bdb650c273970aULL, 0x9333bd5ebbff84c2ULL, 0x4e6a8f2c47dfa08bULL,\n        0x321c954db76cef2aULL, 0x418d312a72837942ULL, 0xb29b38bfffcdf773ULL,\n        0x6c022c38f90a4c07ULL, 0x5a033a240b0f6a8aULL, 0x1f93885f3ce5da6fULL,\n        0xc38a537e96988bc6ULL, 0x39e6a81ac759ff44ULL, 0x29929e43cee0fce2ULL,\n        0x40cdd87924de0ca2ULL, 0xe9d8ebc8a29fe819ULL, 0x0c2798f3cfbb46f4ULL,\n        0x55e484223e53b343ULL, 0x4650948ecd0d2fd8ULL, 0x20e86cb2126f0651ULL,\n        0x6d42c56baf5739e7ULL, 0xa06fc1405ace1e08ULL, 0x7babbfc54f3d193bULL,\n        0x424d17df8864e67fULL, 0xd8045870ef14980eULL, 0xc6d7397c85ac3781ULL,\n        0x21a885e1443273b1ULL, 0x67f8116f893f5c69ULL, 0x24f5efe35706cff6ULL,\n        0xd56329d076f2ab1aULL, 0x5e1eb9754e66a32dULL, 0x28d2771098bd8902ULL,\n        0x8f6013f47dfdc190ULL, 0x17a993fdb637553cULL, 0xe0a219397e1012aaULL,\n        0x786b9930b5da8606ULL, 0x6e82e39e55b0a6daULL, 0x875a0856f72f4ec3ULL,\n        0x3741ff4fa458536dULL, 0xac4859b3957558fcULL, 0x7ef6d5c75c09a57cULL,\n        0xc04a758b6c7f14fbULL, 0xf9acdd91ab26ebbfULL, 0x7391a467c5ef9668ULL,\n        0x335c7c1ee1319acaULL, 0xa91533b18641e4bbULL, 0xe4bf9a683b79db0dULL,\n        0x8e20faa72ba0b470ULL, 0x51f907737b3a7ae4ULL, 0x2268a314bed5ec8cULL,\n        0xd944b123b949edeeULL, 0x31dcb3b84d8b7017ULL, 0xd3fe65279f218860ULL,\n        0x097af2f1dc8ffab3ULL, 0x9b09a6fc312d0b91ULL, 0xcc6ded78a3c4520fULL,\n        0x3481d9ba5ebfcc50ULL, 0x4f2a667f1182d56bULL, 0xdfd9fdd4509ace94ULL,\n        0x26752045fbbc252bULL, 0xbffc491f662bc467ULL, 0xdd593272fc202449ULL,\n        0x3cbbc218d46d4303ULL, 0x91b372f817456e1fULL, 0x681faf69bc6385a0ULL,\n        0xb686bbeebaa43ed4ULL, 0x1469b5084cd0ca01ULL, 0x98c98009cbca94acULL,\n        0x6438379a73d8c354ULL, 0xc2caba2dc0c5fe26ULL, 0x3e3b0dbe78d7a9deULL,\n        0x50b9ee202d670f04ULL, 0x4590b27b37eab0e5ULL, 0x6025b4cb36b10af3ULL,\n        0xfb2c1237079c0162ULL, 0xa12f28130c936be8ULL, 0x4b37e52e54eb1cccULL,\n        0x083a1ba28ad28f53ULL, 0xc10a9cd83a22611bULL, 0x9f1425ad7444c236ULL,\n        0x069d4cf7e9d3237aULL, 0xedc56899e7f621beULL, 0x778c273680865fcfULL,\n        0x309c5aeb1bd605f7ULL, 0x8de0dc52d1472b4dULL, 0xf8ec34c2fd7b9e5fULL,\n        0xea18cd3d58787724ULL, 0xaad515447ca67b86ULL, 0x9989695a9d97e14cULL,\n        0x0000000000000000ULL, 0xf196c63321f464ecULL, 0x71116bc169557cb5ULL,\n        0xaf887f466f92c7c1ULL, 0x972e3e0ffe964d65ULL, 0x190ec4a8d536f915ULL,\n        0x95aef1a9522ca7b8ULL, 0xdc19db21aa7d51a9ULL, 0x94ee18fa0471d258ULL,\n        0x8087adf248a11859ULL, 0xc457f6da2916dd5cULL, 0xfa6cfb6451c17482ULL,\n        0xf256e0c6db13fbd1ULL, 0x6a9f60cf10d96f7dULL, 0x4daaa9d9bd383fb6ULL,\n        0x03c026f5fae79f3dULL, 0xde99148706c7bb74ULL, 0x2a52b8b6340763dfULL,\n        0x6fc20acd03edd33aULL, 0xd423c08320afdefaULL, 0xbbe1ca4e23420dc0ULL,\n        0x966ed75ca8cb3885ULL, 0xeb58246e0e2502c4ULL, 0x055d6a021334bc47ULL,\n        0xa47242111fa7d7afULL, 0xe3623fcc84f78d97ULL, 0x81c744a11efc6db9ULL,\n        0xaec8961539cfb221ULL, 0xf31609958d4e8e31ULL, 0x63e5923ecc5695ceULL,\n        0x47107ddd9b505a38ULL, 0xa3afe7b5a0298135ULL, 0x792b7063e387f3e6ULL,\n        0x0140e953565d75e0ULL, 0x12f4f9ffa503e97bULL, 0x750ce8902c3cb512ULL,\n        0xdbc47e8515f30733ULL, 0x1ed3610c6ab8af8fULL, 0x5239218681dde5d9ULL,\n        0xe222d69fd2aaf877ULL, 0xfe71783514a8bd25ULL, 0xcaf0a18f4a177175ULL,\n        0x61655d9860ec7f13ULL, 0xe77fbc9dc19e4430ULL, 0x2ccff441ddd440a5ULL,\n        0x16e97aaee06a20dcULL, 0xa855dae2d01c915bULL, 0x1d1347f9905f30b2ULL,\n        0xb7c652bdecf94b34ULL, 0xd03e43d265c6175dULL, 0xfdb15ec0ee4f2218ULL,\n        0x57644b8492e9599eULL, 0x07dda5a4bf8e569aULL, 0x54a46d71680ec6a3ULL,\n        0x5624a2d7c4b42c7eULL, 0xbebca04c3076b187ULL, 0x7d36f332a6ee3a41ULL,\n        0x3b6667bc6be31599ULL, 0x695f463aea3ef040ULL, 0xad08b0e0c3282d1cULL,\n        0xb15b1e4a052a684eULL, 0x44d05b2861b7c505ULL, 0x15295c5b1a8dbfe1ULL,\n        0x744c01c37a61c0f2ULL, 0x59c31cd1f1e8f5b7ULL, 0xef45a73f4b4ccb63ULL,\n        0x6bdf899c46841a9dULL, 0x3dfb2b4b823036e3ULL, 0xa2ef0ee6f674f4d5ULL,\n        0x184e2dfb836b8cf5ULL, 0x1134df0a5fe47646ULL, 0xbaa1231d751f7820ULL,\n        0xd17eaa81339b62bdULL, 0xb01bf71953771daeULL, 0x849a2ea30dc8d1feULL,\n        0x705182923f080955ULL, 0x0ea757556301ac29ULL, 0x041d83514569c9a7ULL,\n        0x0abad4042668658eULL, 0x49b72a88f851f611ULL, 0x8a3d79f66ec97dd7ULL,\n        0xcd2d042bf59927efULL, 0xc930877ab0f0ee48ULL, 0x9273540deda2f122ULL,\n        0xc797d02fd3f14261ULL, 0xe1e2f06a284d674aULL, 0xd2be8c74c97cfd80ULL,\n        0x9a494faf67707e71ULL, 0xb3dbd1eca9908293ULL, 0x72d14d3493b2e388ULL,\n        0xd6a30f258c153427ULL\n    }\n};\n#else\nstatic const unsigned long long Ax[8][256] =\n{\n    {\n        0xe6f87e5c5b711fd0ULL, 0x258377800924fa16ULL, 0xc849e07e852ea4a8ULL,\n        0x5b4686a18f06c16aULL, 0x0b32e9a2d77b416eULL, 0xabda37a467815c66ULL,\n        0xf61796a81a686676ULL, 0xf5dc0b706391954bULL, 0x4862f38db7e64bf1ULL,\n        0xff5c629a68bd85c5ULL, 0xcb827da6fcd75795ULL, 0x66d36daf69b9f089ULL,\n        0x356c9f74483d83b0ULL, 0x7cbcecb1238c99a1ULL, 0x36a702ac31c4708dULL,\n        0x9eb6a8d02fbcdfd6ULL, 0x8b19fa51e5b3ae37ULL, 0x9ccfb5408a127d0bULL,\n        0xbc0c78b508208f5aULL, 0xe533e3842288ecedULL, 0xcec2c7d377c15fd2ULL,\n        0xec7817b6505d0f5eULL, 0xb94cc2c08336871dULL, 0x8c205db4cb0b04adULL,\n        0x763c855b28a0892fULL, 0x588d1b79f6ff3257ULL, 0x3fecf69e4311933eULL,\n        0x0fc0d39f803a18c9ULL, 0xee010a26f5f3ad83ULL, 0x10efe8f4411979a6ULL,\n        0x5dcda10c7de93a10ULL, 0x4a1bee1d1248e92cULL, 0x53bff2db21847339ULL,\n        0xb4f50ccfa6a23d09ULL, 0x5fb4bc9cd84798cdULL, 0xe88a2d8b071c56f9ULL,\n        0x7f7771695a756a9cULL, 0xc5f02e71a0ba1ebcULL, 0xa663f9ab4215e672ULL,\n        0x2eb19e22de5fbb78ULL, 0x0db9ce0f2594ba14ULL, 0x82520e6397664d84ULL,\n        0x2f031e6a0208ea98ULL, 0x5c7f2144a1be6bf0ULL, 0x7a37cb1cd16362dbULL,\n        0x83e08e2b4b311c64ULL, 0xcf70479bab960e32ULL, 0x856ba986b9dee71eULL,\n        0xb5478c877af56ce9ULL, 0xb8fe42885f61d6fdULL, 0x1bdd0156966238c8ULL,\n        0x622157923ef8a92eULL, 0xfc97ff42114476f8ULL, 0x9d7d350856452cebULL,\n        0x4c90c9b0e0a71256ULL, 0x2308502dfbcb016cULL, 0x2d7a03faa7a64845ULL,\n        0xf46e8b38bfc6c4abULL, 0xbdbef8fdd477debaULL, 0x3aac4cebc8079b79ULL,\n        0xf09cb105e8879d0cULL, 0x27fa6a10ac8a58cbULL, 0x8960e7c1401d0ceaULL,\n        0x1a6f811e4a356928ULL, 0x90c4fb0773d196ffULL, 0x43501a2f609d0a9fULL,\n        0xf7a516e0c63f3796ULL, 0x1ce4a6b3b8da9252ULL, 0x1324752c38e08a9bULL,\n        0xa5a864733bec154fULL, 0x2bf124575549b33fULL, 0xd766db15440dc5c7ULL,\n        0xa7d179e39e42b792ULL, 0xdadf151a61997fd3ULL, 0x86a0345ec0271423ULL,\n        0x38d5517b6da939a4ULL, 0x6518f077104003b4ULL, 0x02791d90a5aea2ddULL,\n        0x88d267899c4a5d0aULL, 0x930f66df0a2865c2ULL, 0x4ee9d4204509b08bULL,\n        0x325538916685292aULL, 0x412907bfc533a842ULL, 0xb27e2b62544dc673ULL,\n        0x6c5304456295e007ULL, 0x5af406e95351908aULL, 0x1f2f3b6bc123616fULL,\n        0xc37b09dc5255e5c6ULL, 0x3967d133b1fe6844ULL, 0x298839c7f0e711e2ULL,\n        0x409b87f71964f9a2ULL, 0xe938adc3db4b0719ULL, 0x0c0b4e47f9c3ebf4ULL,\n        0x5534d576d36b8843ULL, 0x4610a05aeb8b02d8ULL, 0x20c3cdf58232f251ULL,\n        0x6de1840dbec2b1e7ULL, 0xa0e8de06b0fa1d08ULL, 0x7b854b540d34333bULL,\n        0x42e29a67bcca5b7fULL, 0xd8a6088ac437dd0eULL, 0xc63bb3a9d943ed81ULL,\n        0x21714dbd5e65a3b1ULL, 0x6761ede7b5eea169ULL, 0x2431f7c8d573abf6ULL,\n        0xd51fc685e1a3671aULL, 0x5e063cd40410c92dULL, 0x283ab98f2cb04002ULL,\n        0x8febc06cb2f2f790ULL, 0x17d64f116fa1d33cULL, 0xe07359f1a99ee4aaULL,\n        0x784ed68c74cdc006ULL, 0x6e2a19d5c73b42daULL, 0x8712b4161c7045c3ULL,\n        0x371582e4ed93216dULL, 0xace390414939f6fcULL, 0x7ec5f12186223b7cULL,\n        0xc0b094042bac16fbULL, 0xf9d745379a527ebfULL, 0x737c3f2ea3b68168ULL,\n        0x33e7b8d9bad278caULL, 0xa9a32a34c22ffebbULL, 0xe48163ccfedfbd0dULL,\n        0x8e5940246ea5a670ULL, 0x51c6ef4b842ad1e4ULL, 0x22bad065279c508cULL,\n        0xd91488c218608ceeULL, 0x319ea5491f7cda17ULL, 0xd394e128134c9c60ULL,\n        0x094bf43272d5e3b3ULL, 0x9bf612a5a4aad791ULL, 0xccbbda43d26ffd0fULL,\n        0x34de1f3c946ad250ULL, 0x4f5b5468995ee16bULL, 0xdf9faf6fea8f7794ULL,\n        0x2648ea5870dd092bULL, 0xbfc7e56d71d97c67ULL, 0xdde6b2ff4f21d549ULL,\n        0x3c276b463ae86003ULL, 0x91767b4faf86c71fULL, 0x68a13e7835d4b9a0ULL,\n        0xb68c115f030c9fd4ULL, 0x141dd2c916582001ULL, 0x983d8f7ddd5324acULL,\n        0x64aa703fcc175254ULL, 0xc2c989948e02b426ULL, 0x3e5e76d69f46c2deULL,\n        0x50746f03587d8004ULL, 0x45db3d829272f1e5ULL, 0x60584a029b560bf3ULL,\n        0xfbae58a73ffcdc62ULL, 0xa15a5e4e6cad4ce8ULL, 0x4ba96e55ce1fb8ccULL,\n        0x08f9747aae82b253ULL, 0xc102144cf7fb471bULL, 0x9f042898f3eb8e36ULL,\n        0x068b27adf2effb7aULL, 0xedca97fe8c0a5ebeULL, 0x778e0513f4f7d8cfULL,\n        0x302c2501c32b8bf7ULL, 0x8d92ddfc175c554dULL, 0xf865c57f46052f5fULL,\n        0xeaf3301ba2b2f424ULL, 0xaa68b7ecbbd60d86ULL, 0x998f0f350104754cULL,\n        0x0000000000000000ULL, 0xf12e314d34d0ccecULL, 0x710522be061823b5ULL,\n        0xaf280d9930c005c1ULL, 0x97fd5ce25d693c65ULL, 0x19a41cc633cc9a15ULL,\n        0x95844172f8c79eb8ULL, 0xdc5432b7937684a9ULL, 0x9436c13a2490cf58ULL,\n        0x802b13f332c8ef59ULL, 0xc442ae397ced4f5cULL, 0xfa1cd8efe3ab8d82ULL,\n        0xf2e5ac954d293fd1ULL, 0x6ad823e8907a1b7dULL, 0x4d2249f83cf043b6ULL,\n        0x03cb9dd879f9f33dULL, 0xde2d2f2736d82674ULL, 0x2a43a41f891ee2dfULL,\n        0x6f98999d1b6c133aULL, 0xd4ad46cd3df436faULL, 0xbb35df50269825c0ULL,\n        0x964fdcaa813e6d85ULL, 0xeb41b0537ee5a5c4ULL, 0x0540ba758b160847ULL,\n        0xa41ae43be7bb44afULL, 0xe3b8c429d0671797ULL, 0x819993bbee9fbeb9ULL,\n        0xae9a8dd1ec975421ULL, 0xf3572cdd917e6e31ULL, 0x6393d7dae2aff8ceULL,\n        0x47a2201237dc5338ULL, 0xa32343dec903ee35ULL, 0x79fc56c4a89a91e6ULL,\n        0x01b28048dc5751e0ULL, 0x1296f564e4b7db7bULL, 0x75f7188351597a12ULL,\n        0xdb6d9552bdce2e33ULL, 0x1e9dbb231d74308fULL, 0x520d7293fdd322d9ULL,\n        0xe20a44610c304677ULL, 0xfeeee2d2b4ead425ULL, 0xca30fdee20800675ULL,\n        0x61eaca4a47015a13ULL, 0xe74afe1487264e30ULL, 0x2cc883b27bf119a5ULL,\n        0x1664cf59b3f682dcULL, 0xa811aa7c1e78af5bULL, 0x1d5626fb648dc3b2ULL,\n        0xb73e9117df5bce34ULL, 0xd05f7cf06ab56f5dULL, 0xfd257f0acd132718ULL,\n        0x574dc8e676c52a9eULL, 0x0739a7e52eb8aa9aULL, 0x5486553e0f3cd9a3ULL,\n        0x56ff48aeaa927b7eULL, 0xbe756525ad8e2d87ULL, 0x7d0e6cf9ffdbc841ULL,\n        0x3b1ecca31450ca99ULL, 0x6913be30e983e840ULL, 0xad511009956ea71cULL,\n        0xb1b5b6ba2db4354eULL, 0x4469bdca4e25a005ULL, 0x15af5281ca0f71e1ULL,\n        0x744598cb8d0e2bf2ULL, 0x593f9b312aa863b7ULL, 0xefb38a6e29a4fc63ULL,\n        0x6b6aa3a04c2d4a9dULL, 0x3d95eb0ee6bf31e3ULL, 0xa291c3961554bfd5ULL,\n        0x18169c8eef9bcbf5ULL, 0x115d68bc9d4e2846ULL, 0xba875f18facf7420ULL,\n        0xd1edfcb8b6e23ebdULL, 0xb00736f2f1e364aeULL, 0x84d929ce6589b6feULL,\n        0x70b7a2f6da4f7255ULL, 0x0e7253d75c6d4929ULL, 0x04f23a3d574159a7ULL,\n        0x0a8069ea0b2c108eULL, 0x49d073c56bb11a11ULL, 0x8aab7a1939e4ffd7ULL,\n        0xcd095a0b0e38acefULL, 0xc9fb60365979f548ULL, 0x92bde697d67f3422ULL,\n        0xc78933e10514bc61ULL, 0xe1c1d9b975c9b54aULL, 0xd2266160cf1bcd80ULL,\n        0x9a4492ed78fd8671ULL, 0xb3ccab2a881a9793ULL, 0x72cebf667fe1d088ULL,\n        0xd6d45b5d985a9427ULL\n    },\n    {\n        0xc811a8058c3f55deULL, 0x65f5b43196b50619ULL, 0xf74f96b1d6706e43ULL,\n        0x859d1e8bcb43d336ULL, 0x5aab8a85ccfa3d84ULL, 0xf9c7bf99c295fcfdULL,\n        0xa21fd5a1de4b630fULL, 0xcdb3ef763b8b456dULL, 0x803f59f87cf7c385ULL,\n        0xb27c73be5f31913cULL, 0x98e3ac6633b04821ULL, 0xbf61674c26b8f818ULL,\n        0x0ffbc995c4c130c8ULL, 0xaaa0862010761a98ULL, 0x6057f342210116aaULL,\n        0xf63c760c0654cc35ULL, 0x2ddb45cc667d9042ULL, 0xbcf45a964bd40382ULL,\n        0x68e8a0c3ef3c6f3dULL, 0xa7bd92d269ff73bcULL, 0x290ae20201ed2287ULL,\n        0xb7de34cde885818fULL, 0xd901eea7dd61059bULL, 0xd6fa273219a03553ULL,\n        0xd56f1ae874cccec9ULL, 0xea31245c2e83f554ULL, 0x7034555da07be499ULL,\n        0xce26d2ac56e7bef7ULL, 0xfd161857a5054e38ULL, 0x6a0e7da4527436d1ULL,\n        0x5bd86a381cde9ff2ULL, 0xcaf7756231770c32ULL, 0xb09aaed9e279c8d0ULL,\n        0x5def1091c60674dbULL, 0x111046a2515e5045ULL, 0x23536ce4729802fcULL,\n        0xc50cbcf7f5b63cfaULL, 0x73a16887cd171f03ULL, 0x7d2941afd9f28dbdULL,\n        0x3f5e3eb45a4f3b9dULL, 0x84eefe361b677140ULL, 0x3db8e3d3e7076271ULL,\n        0x1a3a28f9f20fd248ULL, 0x7ebc7c75b49e7627ULL, 0x74e5f293c7eb565cULL,\n        0x18dcf59e4f478ba4ULL, 0x0c6ef44fa9adcb52ULL, 0xc699812d98dac760ULL,\n        0x788b06dc6e469d0eULL, 0xfc65f8ea7521ec4eULL, 0x30a5f7219e8e0b55ULL,\n        0x2bec3f65bca57b6bULL, 0xddd04969baf1b75eULL, 0x99904cdbe394ea57ULL,\n        0x14b201d1e6ea40f6ULL, 0xbbb0c08241284addULL, 0x50f20463bf8f1dffULL,\n        0xe8d7f93b93cbacb8ULL, 0x4d8cb68e477c86e8ULL, 0xc1dd1b3992268e3fULL,\n        0x7c5aa11209d62fcbULL, 0x2f3d98abdb35c9aeULL, 0x671369562bfd5ff5ULL,\n        0x15c1e16c36cee280ULL, 0x1d7eb2edf8f39b17ULL, 0xda94d37db00dfe01ULL,\n        0x877bc3ec760b8adaULL, 0xcb8495dfe153ae44ULL, 0x05a24773b7b410b3ULL,\n        0x12857b783c32abdfULL, 0x8eb770d06812513bULL, 0x536739b9d2e3e665ULL,\n        0x584d57e271b26468ULL, 0xd789c78fc9849725ULL, 0xa935bbfa7d1ae102ULL,\n        0x8b1537a3dfa64188ULL, 0xd0cd5d9bc378de7aULL, 0x4ac82c9a4d80cfb7ULL,\n        0x42777f1b83bdb620ULL, 0x72d2883a1d33bd75ULL, 0x5e7a2d4bab6a8f41ULL,\n        0xf4daab6bbb1c95d9ULL, 0x905cffe7fd8d31b6ULL, 0x83aa6422119b381fULL,\n        0xc0aefb8442022c49ULL, 0xa0f908c663033ae3ULL, 0xa428af0804938826ULL,\n        0xade41c341a8a53c7ULL, 0xae7121ee77e6a85dULL, 0xc47f5c4a25929e8cULL,\n        0xb538e9aa55cdd863ULL, 0x06377aa9dad8eb29ULL, 0xa18ae87bb3279895ULL,\n        0x6edfda6a35e48414ULL, 0x6b7d9d19825094a7ULL, 0xd41cfa55a4e86cbfULL,\n        0xe5caedc9ea42c59cULL, 0xa36c351c0e6fc179ULL, 0x5181e4de6fabbf89ULL,\n        0xfff0c530184d17d4ULL, 0x9d41eb1584045892ULL, 0x1c0d525028d73961ULL,\n        0xf178ec180ca8856aULL, 0x9a0571018ef811cdULL, 0x4091a27c3ef5efccULL,\n        0x19af15239f6329d2ULL, 0x347450eff91eb990ULL, 0xe11b4a078dd27759ULL,\n        0xb9561de5fc601331ULL, 0x912f1f5a2da993c0ULL, 0x1654dcb65ba2191aULL,\n        0x3e2dde098a6b99ebULL, 0x8a66d71e0f82e3feULL, 0x8c51adb7d55a08d7ULL,\n        0x4533e50f8941ff7fULL, 0x02e6dd67bd4859ecULL, 0xe068aaba5df6d52fULL,\n        0xc24826e3ff4a75a5ULL, 0x6c39070d88acddf8ULL, 0x6486548c4691a46fULL,\n        0xd1bebd26135c7c0cULL, 0xb30f93038f15334aULL, 0x82d9849fc1bf9a69ULL,\n        0x9c320ba85420fae4ULL, 0xfa528243aff90767ULL, 0x9ed4d6cfe968a308ULL,\n        0xb825fd582c44b147ULL, 0x9b7691bc5edcb3bbULL, 0xc7ea619048fe6516ULL,\n        0x1063a61f817af233ULL, 0x47d538683409a693ULL, 0x63c2ce984c6ded30ULL,\n        0x2a9fdfd86c81d91dULL, 0x7b1e3b06032a6694ULL, 0x666089ebfbd9fd83ULL,\n        0x0a598ee67375207bULL, 0x07449a140afc495fULL, 0x2ca8a571b6593234ULL,\n        0x1f986f8a45bbc2fbULL, 0x381aa4a050b372c2ULL, 0x5423a3add81faf3aULL,\n        0x17273c0b8b86bb6cULL, 0xfe83258dc869b5a2ULL, 0x287902bfd1c980f1ULL,\n        0xf5a94bd66b3837afULL, 0x88800a79b2caba12ULL, 0x55504310083b0d4cULL,\n        0xdf36940e07b9eeb2ULL, 0x04d1a7ce6790b2c5ULL, 0x612413fff125b4dcULL,\n        0x26f12b97c52c124fULL, 0x86082351a62f28acULL, 0xef93632f9937e5e7ULL,\n        0x3507b052293a1be6ULL, 0xe72c30ae570a9c70ULL, 0xd3586041ae1425e0ULL,\n        0xde4574b3d79d4cc4ULL, 0x92ba228040c5685aULL, 0xf00b0ca5dc8c271cULL,\n        0xbe1287f1f69c5a6eULL, 0xf39e317fb1e0dc86ULL, 0x495d114020ec342dULL,\n        0x699b407e3f18cd4bULL, 0xdca3a9d46ad51528ULL, 0x0d1d14f279896924ULL,\n        0x0000000000000000ULL, 0x593eb75fa196c61eULL, 0x2e4e78160b116bd8ULL,\n        0x6d4ae7b058887f8eULL, 0xe65fd013872e3e06ULL, 0x7a6ddbbbd30ec4e2ULL,\n        0xac97fc89caaef1b1ULL, 0x09ccb33c1e19dbe1ULL, 0x89f3eac462ee1864ULL,\n        0x7770cf49aa87adc6ULL, 0x56c57eca6557f6d6ULL, 0x03953dda6d6cfb9aULL,\n        0x36928d884456e07cULL, 0x1eeb8f37959f608dULL, 0x31d6179c4eaaa923ULL,\n        0x6fac3ad7e5c02662ULL, 0x43049fa653991456ULL, 0xabd3669dc052b8eeULL,\n        0xaf02c153a7c20a2bULL, 0x3ccb036e3723c007ULL, 0x93c9c23d90e1ca2cULL,\n        0xc33bc65e2f6ed7d3ULL, 0x4cff56339758249eULL, 0xb1e94e64325d6aa6ULL,\n        0x37e16d359472420aULL, 0x79f8e661be623f78ULL, 0x5214d90402c74413ULL,\n        0x482ef1fdf0c8965bULL, 0x13f69bc5ec1609a9ULL, 0x0e88292814e592beULL,\n        0x4e198b542a107d72ULL, 0xccc00fcbebafe71bULL, 0x1b49c844222b703eULL,\n        0x2564164da840e9d5ULL, 0x20c6513e1ff4f966ULL, 0xbac3203f910ce8abULL,\n        0xf2edd1c261c47ef0ULL, 0x814cb945acd361f3ULL, 0x95feb8944a392105ULL,\n        0x5c9cf02c1622d6adULL, 0x971865f3f77178e9ULL, 0xbd87ba2b9bf0a1f4ULL,\n        0x444005b259655d09ULL, 0xed75be48247fbc0bULL, 0x7596122e17cff42aULL,\n        0xb44b091785e97a15ULL, 0x966b854e2755da9fULL, 0xeee0839249134791ULL,\n        0x32432a4623c652b9ULL, 0xa8465b47ad3e4374ULL, 0xf8b45f2412b15e8bULL,\n        0x2417f6f078644ba3ULL, 0xfb2162fe7fdda511ULL, 0x4bbbcc279da46dc1ULL,\n        0x0173e0bdd024a276ULL, 0x22208c59a2bca08aULL, 0x8fc4906db836f34dULL,\n        0xe4b90d743a6667eaULL, 0x7147b5e0705f46efULL, 0x2782cb2a1508b039ULL,\n        0xec065ef5f45b1e7dULL, 0x21b5b183cfd05b10ULL, 0xdbe733c060295c77ULL,\n        0x9fa73672394c017eULL, 0xcf55321186c31c81ULL, 0xd8720e1a0d45a7edULL,\n        0x3b8f997a3ddf8958ULL, 0x3afc79c7edfb2b2eULL, 0xe9a4198643ef0eceULL,\n        0x5f09cdf67b4e2d37ULL, 0x4f6a6be9fa34df04ULL, 0xb6add47038a123f9ULL,\n        0x8d224d0a057eaaa1ULL, 0xc96248b85c1bf7a8ULL, 0xe3fd9760309a2eb5ULL,\n        0x0b2a6e5ba351820dULL, 0xeb42c4e1fea75722ULL, 0x948d58299a1d8373ULL,\n        0x7fcf9cc864bad451ULL, 0xa55b4fb5d4b72a50ULL, 0x08bf5381ce3d7997ULL,\n        0x46a6d8d5e42d04e5ULL, 0xd22b80fc7e308796ULL, 0x57b69e77b57354a0ULL,\n        0x3969441d8097d0b4ULL, 0x3330cafbf3e2f0cfULL, 0xe28e77dde0be8cc3ULL,\n        0x62b12e259c494f46ULL, 0xa6ce726fb9dbd1caULL, 0x41e242c1eed14dbaULL,\n        0x76032ff47aa30fb0ULL\n    },\n    {\n        0x45b268a93acde4ccULL, 0xaf7f0be884549d08ULL, 0x048354b3c1468263ULL,\n        0x925435c2c80efed2ULL, 0xee4e37f27fdffba7ULL, 0x167a33920c60f14dULL,\n        0xfb123b52ea03e584ULL, 0x4a0cab53fdbb9007ULL, 0x9deaf6380f788a19ULL,\n        0xcb48ec558f0cb32aULL, 0xb59dc4b2d6fef7e0ULL, 0xdcdbca22f4f3ecb6ULL,\n        0x11df5813549a9c40ULL, 0xe33fdedf568aced3ULL, 0xa0c1c8124322e9c3ULL,\n        0x07a56b8158fa6d0dULL, 0x77279579b1e1f3ddULL, 0xd9b18b74422ac004ULL,\n        0xb8ec2d9fffabc294ULL, 0xf4acf8a82d75914fULL, 0x7bbf69b1ef2b6878ULL,\n        0xc4f62faf487ac7e1ULL, 0x76ce809cc67e5d0cULL, 0x6711d88f92e4c14cULL,\n        0x627b99d9243dedfeULL, 0x234aa5c3dfb68b51ULL, 0x909b1f15262dbf6dULL,\n        0x4f66ea054b62bcb5ULL, 0x1ae2cf5a52aa6ae8ULL, 0xbea053fbd0ce0148ULL,\n        0xed6808c0e66314c9ULL, 0x43fe16cd15a82710ULL, 0xcd049231a06970f6ULL,\n        0xe7bc8a6c97cc4cb0ULL, 0x337ce835fcb3b9c0ULL, 0x65def2587cc780f3ULL,\n        0x52214ede4132bb50ULL, 0x95f15e4390f493dfULL, 0x870839625dd2e0f1ULL,\n        0x41313c1afb8b66afULL, 0x91720af051b211bcULL, 0x477d427ed4eea573ULL,\n        0x2e3b4ceef6e3be25ULL, 0x82627834eb0bcc43ULL, 0x9c03e3dd78e724c8ULL,\n        0x2877328ad9867df9ULL, 0x14b51945e243b0f2ULL, 0x574b0f88f7eb97e2ULL,\n        0x88b6fa989aa4943aULL, 0x19c4f068cb168586ULL, 0x50ee6409af11faefULL,\n        0x7df317d5c04eaba4ULL, 0x7a567c5498b4c6a9ULL, 0xb6bbfb804f42188eULL,\n        0x3cc22bcf3bc5cd0bULL, 0xd04336eaaa397713ULL, 0xf02fac1bec33132cULL,\n        0x2506dba7f0d3488dULL, 0xd7e65d6bf2c31a1eULL, 0x5eb9b2161ff820f5ULL,\n        0x842e0650c46e0f9fULL, 0x716beb1d9e843001ULL, 0xa933758cab315ed4ULL,\n        0x3fe414fda2792265ULL, 0x27c9f1701ef00932ULL, 0x73a4c1ca70a771beULL,\n        0x94184ba6e76b3d0eULL, 0x40d829ff8c14c87eULL, 0x0fbec3fac77674cbULL,\n        0x3616a9634a6a9572ULL, 0x8f139119c25ef937ULL, 0xf545ed4d5aea3f9eULL,\n        0xe802499650ba387bULL, 0x6437e7bd0b582e22ULL, 0xe6559f89e053e261ULL,\n        0x80ad52e305288dfcULL, 0x6dc55a23e34b9935ULL, 0xde14e0f51ad0ad09ULL,\n        0xc6390578a659865eULL, 0x96d7617109487cb1ULL, 0xe2d6cb3a21156002ULL,\n        0x01e915e5779faed1ULL, 0xadb0213f6a77dcb7ULL, 0x9880b76eb9a1a6abULL,\n        0x5d9f8d248644cf9bULL, 0xfd5e4536c5662658ULL, 0xf1c6b9fe9bacbdfdULL,\n        0xeacd6341be9979c4ULL, 0xefa7221708405576ULL, 0x510771ecd88e543eULL,\n        0xc2ba51cb671f043dULL, 0x0ad482ac71af5879ULL, 0xfe787a045cdac936ULL,\n        0xb238af338e049aedULL, 0xbd866cc94972ee26ULL, 0x615da6ebbd810290ULL,\n        0x3295fdd08b2c1711ULL, 0xf834046073bf0aeaULL, 0xf3099329758ffc42ULL,\n        0x1caeb13e7dcfa934ULL, 0xba2307481188832bULL, 0x24efce42874ce65cULL,\n        0x0e57d61fb0e9da1aULL, 0xb3d1bad6f99b343cULL, 0xc0757b1c893c4582ULL,\n        0x2b510db8403a9297ULL, 0x5c7698c1f1db614aULL, 0x3e0d0118d5e68cb4ULL,\n        0xd60f488e855cb4cfULL, 0xae961e0df3cb33d9ULL, 0x3a8e55ab14a00ed7ULL,\n        0x42170328623789c1ULL, 0x838b6dd19c946292ULL, 0x895fef7ded3b3aebULL,\n        0xcfcbb8e64e4a3149ULL, 0x064c7e642f65c3dcULL, 0x3d2b3e2a4c5a63daULL,\n        0x5bd3f340a9210c47ULL, 0xb474d157a1615931ULL, 0xac5934da1de87266ULL,\n        0x6ee365117af7765bULL, 0xc86ed36716b05c44ULL, 0x9ba6885c201d49c5ULL,\n        0xb905387a88346c45ULL, 0x131072c4bab9ddffULL, 0xbf49461ea751af99ULL,\n        0xd52977bc1ce05ba1ULL, 0xb0f785e46027db52ULL, 0x546d30ba6e57788cULL,\n        0x305ad707650f56aeULL, 0xc987c682612ff295ULL, 0xa5ab8944f5fbc571ULL,\n        0x7ed528e759f244caULL, 0x8ddcbbce2c7db888ULL, 0xaa154abe328db1baULL,\n        0x1e619be993ece88bULL, 0x09f2bd9ee813b717ULL, 0x7401aa4b285d1cb3ULL,\n        0x21858f143195caeeULL, 0x48c381841398d1b8ULL, 0xfcb750d3b2f98889ULL,\n        0x39a86a998d1ce1b9ULL, 0x1f888e0ce473465aULL, 0x7899568376978716ULL,\n        0x02cf2ad7ee2341bfULL, 0x85c713b5b3f1a14eULL, 0xff916fe12b4567e7ULL,\n        0x7c1a0230b7d10575ULL, 0x0c98fcc85eca9ba5ULL, 0xa3e7f720da9e06adULL,\n        0x6a6031a2bbb1f438ULL, 0x973e74947ed7d260ULL, 0x2cf4663918c0ff9aULL,\n        0x5f50a7f368678e24ULL, 0x34d983b4a449d4cdULL, 0x68af1b755592b587ULL,\n        0x7f3c3d022e6dea1bULL, 0xabfc5f5b45121f6bULL, 0x0d71e92d29553574ULL,\n        0xdffdf5106d4f03d8ULL, 0x081ba87b9f8c19c6ULL, 0xdb7ea1a3ac0981bbULL,\n        0xbbca12ad66172dfaULL, 0x79704366010829c7ULL, 0x179326777bff5f9cULL,\n        0x0000000000000000ULL, 0xeb2476a4c906d715ULL, 0x724dd42f0738df6fULL,\n        0xb752ee6538ddb65fULL, 0x37ffbc863df53ba3ULL, 0x8efa84fcb5c157e6ULL,\n        0xe9eb5c73272596aaULL, 0x1b0bdabf2535c439ULL, 0x86e12c872a4d4e20ULL,\n        0x9969a28bce3e087aULL, 0xfafb2eb79d9c4b55ULL, 0x056a4156b6d92cb2ULL,\n        0x5a3ae6a5debea296ULL, 0x22a3b026a8292580ULL, 0x53c85b3b36ad1581ULL,\n        0xb11e900117b87583ULL, 0xc51f3a4a3fe56930ULL, 0xe019e1edcf3621bdULL,\n        0xec811d2591fcba18ULL, 0x445b7d4c4d524a1dULL, 0xa8da6069dcaef005ULL,\n        0x58f5cc72309de329ULL, 0xd4c062596b7ff570ULL, 0xce22ad0339d59f98ULL,\n        0x591cd99747024df8ULL, 0x8b90c5aa03187b54ULL, 0xf663d27fc356d0f0ULL,\n        0xd8589e9135b56ed5ULL, 0x35309651d3d67a1cULL, 0x12f96721cd26732eULL,\n        0xd28c1c3d441a36acULL, 0x492a946164077f69ULL, 0x2d1d73dc6f5f514bULL,\n        0x6f0a70f40d68d88aULL, 0x60b4b30eca1eac41ULL, 0xd36509d83385987dULL,\n        0x0b3d97490630f6a8ULL, 0x9eccc90a96c46577ULL, 0xa20ee2c5ad01a87cULL,\n        0xe49ab55e0e70a3deULL, 0xa4429ca182646ba0ULL, 0xda97b446db962f6aULL,\n        0xcced87d4d7f6de27ULL, 0x2ab8185d37a53c46ULL, 0x9f25dcefe15bcba6ULL,\n        0xc19c6ef9fea3eb53ULL, 0xa764a3931bd884ceULL, 0x2fd2590b817c10f4ULL,\n        0x56a21a6d80743933ULL, 0xe573a0bb79ef0d0fULL, 0x155c0ca095dc1e23ULL,\n        0x6c2c4fc694d437e4ULL, 0x10364df623053291ULL, 0xdd32dfc7836c4267ULL,\n        0x03263f3299bcef6eULL, 0x66f8cd6ae57b6f9dULL, 0x8c35ae2b5be21659ULL,\n        0x31b3c2e21290f87fULL, 0x93bd2027bf915003ULL, 0x69460e90220d1b56ULL,\n        0x299e276fae19d328ULL, 0x63928c3c53a2432fULL, 0x7082fef8e91b9ed0ULL,\n        0xbc6f792c3eed40f7ULL, 0x4c40d537d2de53dbULL, 0x75e8bfae5fc2b262ULL,\n        0x4da9c0d2a541fd0aULL, 0x4e8fffe03cfd1264ULL, 0x2620e495696fa7e3ULL,\n        0xe1f0f408b8a98f6cULL, 0xd1aa230fdda6d9c2ULL, 0xc7d0109dd1c6288fULL,\n        0x8a79d04f7487d585ULL, 0x4694579ba3710ba2ULL, 0x38417f7cfa834f68ULL,\n        0x1d47a4db0a5007e5ULL, 0x206c9af1460a643fULL, 0xa128ddf734bd4712ULL,\n        0x8144470672b7232dULL, 0xf2e086cc02105293ULL, 0x182de58dbc892b57ULL,\n        0xcaa1f9b0f8931dfbULL, 0x6b892447cc2e5ae9ULL, 0xf9dd11850420a43bULL,\n        0x4be5beb68a243ed6ULL, 0x5584255f19c8d65dULL, 0x3b67404e633fa006ULL,\n        0xa68db6766c472a1fULL, 0xf78ac79ab4c97e21ULL, 0xc353442e1080aaecULL,\n        0x9a4f9db95782e714ULL\n    },\n    {\n        0x05ba7bc82c9b3220ULL, 0x31a54665f8b65e4fULL, 0xb1b651f77547f4d4ULL,\n        0x8bfa0d857ba46682ULL, 0x85a96c5aa16a98bbULL, 0x990faef908eb79c9ULL,\n        0xa15e37a247f4a62dULL, 0x76857dcd5d27741eULL, 0xf8c50b800a1820bcULL,\n        0xbe65dcb201f7a2b4ULL, 0x666d1b986f9426e7ULL, 0x4cc921bf53c4e648ULL,\n        0x95410a0f93d9ca42ULL, 0x20cdccaa647ba4efULL, 0x429a4060890a1871ULL,\n        0x0c4ea4f69b32b38bULL, 0xccda362dde354cd3ULL, 0x96dc23bc7c5b2fa9ULL,\n        0xc309bb68aa851ab3ULL, 0xd26131a73648e013ULL, 0x021dc52941fc4db2ULL,\n        0xcd5adab7704be48aULL, 0xa77965d984ed71e6ULL, 0x32386fd61734bba4ULL,\n        0xe82d6dd538ab7245ULL, 0x5c2147ea6177b4b1ULL, 0x5da1ab70cf091ce8ULL,\n        0xac907fce72b8bdffULL, 0x57c85dfd972278a8ULL, 0xa4e44c6a6b6f940dULL,\n        0x3851995b4f1fdfe4ULL, 0x62578ccaed71bc9eULL, 0xd9882bb0c01d2c0aULL,\n        0x917b9d5d113c503bULL, 0xa2c31e11a87643c6ULL, 0xe463c923a399c1ceULL,\n        0xf71686c57ea876dcULL, 0x87b4a973e096d509ULL, 0xaf0d567d9d3a5814ULL,\n        0xb40c2a3f59dcc6f4ULL, 0x3602f88495d121ddULL, 0xd3e1dd3d9836484aULL,\n        0xf945e71aa46688e5ULL, 0x7518547eb2a591f5ULL, 0x9366587450c01d89ULL,\n        0x9ea81018658c065bULL, 0x4f54080cbc4603a3ULL, 0x2d0384c65137bf3dULL,\n        0xdc325078ec861e2aULL, 0xea30a8fc79573ff7ULL, 0x214d2030ca050cb6ULL,\n        0x65f0322b8016c30cULL, 0x69be96dd1b247087ULL, 0xdb95ee9981e161b8ULL,\n        0xd1fc1814d9ca05f8ULL, 0x820ed2bbcc0de729ULL, 0x63d76050430f14c7ULL,\n        0x3bccb0e8a09d3a0fULL, 0x8e40764d573f54a2ULL, 0x39d175c1e16177bdULL,\n        0x12f5a37c734f1f4bULL, 0xab37c12f1fdfc26dULL, 0x5648b167395cd0f1ULL,\n        0x6c04ed1537bf42a7ULL, 0xed97161d14304065ULL, 0x7d6c67daab72b807ULL,\n        0xec17fa87ba4ee83cULL, 0xdfaf79cb0304fbc1ULL, 0x733f060571bc463eULL,\n        0x78d61c1287e98a27ULL, 0xd07cf48e77b4ada1ULL, 0xb9c262536c90dd26ULL,\n        0xe2449b5860801605ULL, 0x8fc09ad7f941fcfbULL, 0xfad8cea94be46d0eULL,\n        0xa343f28b0608eb9fULL, 0x9b126bd04917347bULL, 0x9a92874ae7699c22ULL,\n        0x1b017c42c4e69ee0ULL, 0x3a4c5c720ee39256ULL, 0x4b6e9f5e3ea399daULL,\n        0x6ba353f45ad83d35ULL, 0xe7fee0904c1b2425ULL, 0x22d009832587e95dULL,\n        0x842980c00f1430e2ULL, 0xc6b3c0a0861e2893ULL, 0x087433a419d729f2ULL,\n        0x341f3dadd42d6c6fULL, 0xee0a3faefbb2a58eULL, 0x4aee73c490dd3183ULL,\n        0xaab72db5b1a16a34ULL, 0xa92a04065e238fdfULL, 0x7b4b35a1686b6fccULL,\n        0x6a23bf6ef4a6956cULL, 0x191cb96b851ad352ULL, 0x55d598d4d6de351aULL,\n        0xc9604de5f2ae7ef3ULL, 0x1ca6c2a3a981e172ULL, 0xde2f9551ad7a5398ULL,\n        0x3025aaff56c8f616ULL, 0x15521d9d1e2860d9ULL, 0x506fe31cfa45073aULL,\n        0x189c55f12b647b0bULL, 0x0180ec9aae7ea859ULL, 0x7cec8b40050c105eULL,\n        0x2350e5198bf94104ULL, 0xef8ad33455cc0dd7ULL, 0x07a7bee16d677f92ULL,\n        0xe5e325b90de76997ULL, 0x5a061591a26e637aULL, 0xb611ef1618208b46ULL,\n        0x09f4df3eb7a981abULL, 0x1ebb078ae87dacc0ULL, 0xb791038cb65e231fULL,\n        0x0fd38d4574b05660ULL, 0x67edf702c1ea8ebeULL, 0xba5f4be0831238cdULL,\n        0xe3c477c2cefebe5cULL, 0x0dce486c354c1bd2ULL, 0x8c5db36416c31910ULL,\n        0x26ea9ed1a7627324ULL, 0x039d29b3ef82e5ebULL, 0x9f28fc82cbf2ae02ULL,\n        0xa8aae89cf05d2786ULL, 0x431aacfa2774b028ULL, 0xcf471f9e31b7a938ULL,\n        0x581bd0b8e3922ec8ULL, 0xbc78199b400bef06ULL, 0x90fb71c7bf42f862ULL,\n        0x1f3beb1046030499ULL, 0x683e7a47b55ad8deULL, 0x988f4263a695d190ULL,\n        0xd808c72a6e638453ULL, 0x0627527bc319d7cbULL, 0xebb04466d72997aeULL,\n        0xe67e0c0ae2658c7cULL, 0x14d2f107b056c880ULL, 0x7122c32c30400b8cULL,\n        0x8a7ae11fd5dacedbULL, 0xa0dedb38e98a0e74ULL, 0xad109354dcc615a6ULL,\n        0x0be91a17f655cc19ULL, 0x8ddd5ffeb8bdb149ULL, 0xbfe53028af890aedULL,\n        0xd65ba6f5b4ad7a6aULL, 0x7956f0882997227eULL, 0x10e8665532b352f9ULL,\n        0x0e5361dfdacefe39ULL, 0xcec7f3049fc90161ULL, 0xff62b561677f5f2eULL,\n        0x975ccf26d22587f0ULL, 0x51ef0f86543baf63ULL, 0x2f1e41ef10cbf28fULL,\n        0x52722635bbb94a88ULL, 0xae8dbae73344f04dULL, 0x410769d36688fd9aULL,\n        0xb3ab94de34bbb966ULL, 0x801317928df1aa9bULL, 0xa564a0f0c5113c54ULL,\n        0xf131d4bebdb1a117ULL, 0x7f71a2f3ea8ef5b5ULL, 0x40878549c8f655c3ULL,\n        0x7ef14e6944f05decULL, 0xd44663dcf55137d8ULL, 0xf2acfd0d523344fcULL,\n        0x0000000000000000ULL, 0x5fbc6e598ef5515aULL, 0x16cf342ef1aa8532ULL,\n        0xb036bd6ddb395c8dULL, 0x13754fe6dd31b712ULL, 0xbbdfa77a2d6c9094ULL,\n        0x89e7c8ac3a582b30ULL, 0x3c6b0e09cdfa459dULL, 0xc4ae0589c7e26521ULL,\n        0x49735a777f5fd468ULL, 0xcafd64561d2c9b18ULL, 0xda1502032f9fc9e1ULL,\n        0x8867243694268369ULL, 0x3782141e3baf8984ULL, 0x9cb5d53124704be9ULL,\n        0xd7db4a6f1ad3d233ULL, 0xa6f989432a93d9bfULL, 0x9d3539ab8a0ee3b0ULL,\n        0x53f2caaf15c7e2d1ULL, 0x6e19283c76430f15ULL, 0x3debe2936384edc4ULL,\n        0x5e3c82c3208bf903ULL, 0x33b8834cb94a13fdULL, 0x6470deb12e686b55ULL,\n        0x359fd1377a53c436ULL, 0x61caa57902f35975ULL, 0x043a975282e59a79ULL,\n        0xfd7f70482683129cULL, 0xc52ee913699ccd78ULL, 0x28b9ff0e7dac8d1dULL,\n        0x5455744e78a09d43ULL, 0xcb7d88ccb3523341ULL, 0x44bd121b4a13cfbaULL,\n        0x4d49cd25fdba4e11ULL, 0x3e76cb208c06082fULL, 0x3ff627ba2278a076ULL,\n        0xc28957f204fbb2eaULL, 0x453dfe81e46d67e3ULL, 0x94c1e6953da7621bULL,\n        0x2c83685cff491764ULL, 0xf32c1197fc4deca5ULL, 0x2b24d6bd922e68f6ULL,\n        0xb22b78449ac5113fULL, 0x48f3b6edd1217c31ULL, 0x2e9ead75beb55ad6ULL,\n        0x174fd8b45fd42d6bULL, 0x4ed4e4961238abfaULL, 0x92e6b4eefebeb5d0ULL,\n        0x46a0d7320bef8208ULL, 0x47203ba8a5912a51ULL, 0x24f75bf8e69e3e96ULL,\n        0xf0b1382413cf094eULL, 0xfee259fbc901f777ULL, 0x276a724b091cdb7dULL,\n        0xbdf8f501ee75475fULL, 0x599b3c224dec8691ULL, 0x6d84018f99c1eafeULL,\n        0x7498b8e41cdb39acULL, 0xe0595e71217c5bb7ULL, 0x2aa43a273c50c0afULL,\n        0xf50b43ec3f543b6eULL, 0x838e3e2162734f70ULL, 0xc09492db4507ff58ULL,\n        0x72bfea9fdfc2ee67ULL, 0x11688acf9ccdfaa0ULL, 0x1a8190d86a9836b9ULL,\n        0x7acbd93bc615c795ULL, 0xc7332c3a286080caULL, 0x863445e94ee87d50ULL,\n        0xf6966a5fd0d6de85ULL, 0xe9ad814f96d5da1cULL, 0x70a22fb69e3ea3d5ULL,\n        0x0a69f68d582b6440ULL, 0xb8428ec9c2ee757fULL, 0x604a49e3ac8df12cULL,\n        0x5b86f90b0c10cb23ULL, 0xe1d9b2eb8f02f3eeULL, 0x29391394d3d22544ULL,\n        0xc8e0a17f5cd0d6aaULL, 0xb58cc6a5f7a26eadULL, 0x8193fb08238f02c2ULL,\n        0xd5c68f465b2f9f81ULL, 0xfcff9cd288fdbac5ULL, 0x77059157f359dc47ULL,\n        0x1d262e3907ff492bULL, 0xfb582233e59ac557ULL, 0xddb2bce242f8b673ULL,\n        0x2577b76248e096cfULL, 0x6f99c4a6d83da74cULL, 0xc1147e41eb795701ULL,\n        0xf48baf76912a9337ULL\n    },\n    {\n        0x3ef29d249b2c0a19ULL, 0xe9e16322b6f8622fULL, 0x5536994047757f7aULL,\n        0x9f4d56d5a47b0b33ULL, 0x822567466aa1174cULL, 0xb8f5057deb082fb2ULL,\n        0xcc48c10bf4475f53ULL, 0x373088d4275dec3aULL, 0x968f4325180aed10ULL,\n        0x173d232cf7016151ULL, 0xae4ed09f946fcc13ULL, 0xfd4b4741c4539873ULL,\n        0x1b5b3f0dd9933765ULL, 0x2ffcb0967b644052ULL, 0xe02376d20a89840cULL,\n        0xa3ae3a70329b18d7ULL, 0x419cbd2335de8526ULL, 0xfafebf115b7c3199ULL,\n        0x0397074f85aa9b0dULL, 0xc58ad4fb4836b970ULL, 0xbec60be3fc4104a8ULL,\n        0x1eff36dc4b708772ULL, 0x131fdc33ed8453b6ULL, 0x0844e33e341764d3ULL,\n        0x0ff11b6eab38cd39ULL, 0x64351f0a7761b85aULL, 0x3b5694f509cfba0eULL,\n        0x30857084b87245d0ULL, 0x47afb3bd2297ae3cULL, 0xf2ba5c2f6f6b554aULL,\n        0x74bdc4761f4f70e1ULL, 0xcfdfc64471edc45eULL, 0xe610784c1dc0af16ULL,\n        0x7aca29d63c113f28ULL, 0x2ded411776a859afULL, 0xac5f211e99a3d5eeULL,\n        0xd484f949a87ef33bULL, 0x3ce36ca596e013e4ULL, 0xd120f0983a9d432cULL,\n        0x6bc40464dc597563ULL, 0x69d5f5e5d1956c9eULL, 0x9ae95f043698bb24ULL,\n        0xc9ecc8da66a4ef44ULL, 0xd69508c8a5b2eac6ULL, 0xc40c2235c0503b80ULL,\n        0x38c193ba8c652103ULL, 0x1ceec75d46bc9e8fULL, 0xd331011937515ad1ULL,\n        0xd8e2e56886eca50fULL, 0xb137108d5779c991ULL, 0x709f3b6905ca4206ULL,\n        0x4feb50831680caefULL, 0xec456af3241bd238ULL, 0x58d673afe181abbeULL,\n        0x242f54e7cad9bf8cULL, 0x0211f1810dcc19fdULL, 0x90bc4dbb0f43c60aULL,\n        0x9518446a9da0761dULL, 0xa1bfcbf13f57012aULL, 0x2bde4f8961e172b5ULL,\n        0x27b853a84f732481ULL, 0xb0b1e643df1f4b61ULL, 0x18cc38425c39ac68ULL,\n        0xd2b7f7d7bf37d821ULL, 0x3103864a3014c720ULL, 0x14aa246372abfa5cULL,\n        0x6e600db54ebac574ULL, 0x394765740403a3f3ULL, 0x09c215f0bc71e623ULL,\n        0x2a58b947e987f045ULL, 0x7b4cdf18b477bdd8ULL, 0x9709b5eb906c6fe0ULL,\n        0x73083c268060d90bULL, 0xfedc400e41f9037eULL, 0x284948c6e44be9b8ULL,\n        0x728ecae808065bfbULL, 0x06330e9e17492b1aULL, 0x5950856169e7294eULL,\n        0xbae4f4fce6c4364fULL, 0xca7bcf95e30e7449ULL, 0x7d7fd186a33e96c2ULL,\n        0x52836110d85ad690ULL, 0x4dfaa1021b4cd312ULL, 0x913abb75872544faULL,\n        0xdd46ecb9140f1518ULL, 0x3d659a6b1e869114ULL, 0xc23f2cabd719109aULL,\n        0xd713fe062dd46836ULL, 0xd0a60656b2fbc1dcULL, 0x221c5a79dd909496ULL,\n        0xefd26dbca1b14935ULL, 0x0e77eda0235e4fc9ULL, 0xcbfd395b6b68f6b9ULL,\n        0x0de0eaefa6f4d4c4ULL, 0x0422ff1f1a8532e7ULL, 0xf969b85eded6aa94ULL,\n        0x7f6e2007aef28f3fULL, 0x3ad0623b81a938feULL, 0x6624ee8b7aada1a7ULL,\n        0xb682e8ddc856607bULL, 0xa78cc56f281e2a30ULL, 0xc79b257a45faa08dULL,\n        0x5b4174e0642b30b3ULL, 0x5f638bff7eae0254ULL, 0x4bc9af9c0c05f808ULL,\n        0xce59308af98b46aeULL, 0x8fc58da9cc55c388ULL, 0x803496c7676d0eb1ULL,\n        0xf33caae1e70dd7baULL, 0xbb6202326ea2b4bfULL, 0xd5020f87201871cbULL,\n        0x9d5ca754a9b712ceULL, 0x841669d87de83c56ULL, 0x8a6184785eb6739fULL,\n        0x420bba6cb0741e2bULL, 0xf12d5b60eac1ce47ULL, 0x76ac35f71283691cULL,\n        0x2c6bb7d9fecedb5fULL, 0xfccdb18f4c351a83ULL, 0x1f79c012c3160582ULL,\n        0xf0abadae62a74cb7ULL, 0xe1a5801c82ef06fcULL, 0x67a21845f2cb2357ULL,\n        0x5114665f5df04d9dULL, 0xbf40fd2d74278658ULL, 0xa0393d3fb73183daULL,\n        0x05a409d192e3b017ULL, 0xa9fb28cf0b4065f9ULL, 0x25a9a22942bf3d7cULL,\n        0xdb75e22703463e02ULL, 0xb326e10c5ab5d06cULL, 0xe7968e8295a62de6ULL,\n        0xb973f3b3636ead42ULL, 0xdf571d3819c30ce5ULL, 0xee549b7229d7cbc5ULL,\n        0x12992afd65e2d146ULL, 0xf8ef4e9056b02864ULL, 0xb7041e134030e28bULL,\n        0xc02edd2adad50967ULL, 0x932b4af48ae95d07ULL, 0x6fe6fb7bc6dc4784ULL,\n        0x239aacb755f61666ULL, 0x401a4bedbdb807d6ULL, 0x485ea8d389af6305ULL,\n        0xa41bc220adb4b13dULL, 0x753b32b89729f211ULL, 0x997e584bb3322029ULL,\n        0x1d683193ceda1c7fULL, 0xff5ab6c0c99f818eULL, 0x16bbd5e27f67e3a1ULL,\n        0xa59d34ee25d233cdULL, 0x98f8ae853b54a2d9ULL, 0x6df70afacb105e79ULL,\n        0x795d2e99b9bba425ULL, 0x8e437b6744334178ULL, 0x0186f6ce886682f0ULL,\n        0xebf092a3bb347bd2ULL, 0xbcd7fa62f18d1d55ULL, 0xadd9d7d011c5571eULL,\n        0x0bd3e471b1bdffdeULL, 0xaa6c2f808eeafef4ULL, 0x5ee57d31f6c880a4ULL,\n        0xf50fa47ff044fca0ULL, 0x1addc9c351f5b595ULL, 0xea76646d3352f922ULL,\n        0x0000000000000000ULL, 0x85909f16f58ebea6ULL, 0x46294573aaf12cccULL,\n        0x0a5512bf39db7d2eULL, 0x78dbd85731dd26d5ULL, 0x29cfbe086c2d6b48ULL,\n        0x218b5d36583a0f9bULL, 0x152cd2adfacd78acULL, 0x83a39188e2c795bcULL,\n        0xc3b9da655f7f926aULL, 0x9ecba01b2c1d89c3ULL, 0x07b5f8509f2fa9eaULL,\n        0x7ee8d6c926940dcfULL, 0x36b67e1aaf3b6ecaULL, 0x86079859702425abULL,\n        0xfb7849dfd31ab369ULL, 0x4c7c57cc932a51e2ULL, 0xd96413a60e8a27ffULL,\n        0x263ea566c715a671ULL, 0x6c71fc344376dc89ULL, 0x4a4f595284637af8ULL,\n        0xdaf314e98b20bcf2ULL, 0x572768c14ab96687ULL, 0x1088db7c682ec8bbULL,\n        0x887075f9537a6a62ULL, 0x2e7a4658f302c2a2ULL, 0x619116dbe582084dULL,\n        0xa87dde018326e709ULL, 0xdcc01a779c6997e8ULL, 0xedc39c3dac7d50c8ULL,\n        0xa60a33a1a078a8c0ULL, 0xc1a82be452b38b97ULL, 0x3f746bea134a88e9ULL,\n        0xa228ccbebafd9a27ULL, 0xabead94e068c7c04ULL, 0xf48952b178227e50ULL,\n        0x5cf48cb0fb049959ULL, 0x6017e0156de48abdULL, 0x4438b4f2a73d3531ULL,\n        0x8c528ae649ff5885ULL, 0xb515ef924dfcfb76ULL, 0x0c661c212e925634ULL,\n        0xb493195cc59a7986ULL, 0x9cda519a21d1903eULL, 0x32948105b5be5c2dULL,\n        0x194ace8cd45f2e98ULL, 0x438d4ca238129cdbULL, 0x9b6fa9cabefe39d4ULL,\n        0x81b26009ef0b8c41ULL, 0xded1ebf691a58e15ULL, 0x4e6da64d9ee6481fULL,\n        0x54b06f8ecf13fd8aULL, 0x49d85e1d01c9e1f5ULL, 0xafc826511c094ee3ULL,\n        0xf698a33075ee67adULL, 0x5ac7822eec4db243ULL, 0x8dd47c28c199da75ULL,\n        0x89f68337db1ce892ULL, 0xcdce37c57c21dda3ULL, 0x530597de503c5460ULL,\n        0x6a42f2aa543ff793ULL, 0x5d727a7e73621ba9ULL, 0xe232875307459df1ULL,\n        0x56a19e0fc2dfe477ULL, 0xc61dd3b4cd9c227dULL, 0xe5877f03986a341bULL,\n        0x949eb2a415c6f4edULL, 0x6206119460289340ULL, 0x6380e75ae84e11b0ULL,\n        0x8be772b6d6d0f16fULL, 0x50929091d596cf6dULL, 0xe86795ec3e9ee0dfULL,\n        0x7cf927482b581432ULL, 0xc86a3e14eec26db4ULL, 0x7119cda78dacc0f6ULL,\n        0xe40189cd100cb6ebULL, 0x92adbc3a028fdff7ULL, 0xb2a017c2d2d3529cULL,\n        0x200dabf8d05c8d6bULL, 0x34a78f9ba2f77737ULL, 0xe3b4719d8f231f01ULL,\n        0x45be423c2f5bb7c1ULL, 0xf71e55fefd88e55dULL, 0x6853032b59f3ee6eULL,\n        0x65b3e9c4ff073aaaULL, 0x772ac3399ae5ebecULL, 0x87816e97f842a75bULL,\n        0x110e2db2e0484a4bULL, 0x331277cb3dd8deddULL, 0xbd510cac79eb9fa5ULL,\n        0x352179552a91f5c7ULL\n    },\n    {\n        0x8ab0a96846e06a6dULL, 0x43c7e80b4bf0b33aULL, 0x08c9b3546b161ee5ULL,\n        0x39f1c235eba990beULL, 0xc1bef2376606c7b2ULL, 0x2c209233614569aaULL,\n        0xeb01523b6fc3289aULL, 0x946953ab935aceddULL, 0x272838f63e13340eULL,\n        0x8b0455eca12ba052ULL, 0x77a1b2c4978ff8a2ULL, 0xa55122ca13e54086ULL,\n        0x2276135862d3f1cdULL, 0xdb8ddfde08b76cfeULL, 0x5d1e12c89e4a178aULL,\n        0x0e56816b03969867ULL, 0xee5f79953303ed59ULL, 0xafed748bab78d71dULL,\n        0x6d929f2df93e53eeULL, 0xf5d8a8f8ba798c2aULL, 0xf619b1698e39cf6bULL,\n        0x95ddaf2f749104e2ULL, 0xec2a9c80e0886427ULL, 0xce5c8fd8825b95eaULL,\n        0xc4e0d9993ac60271ULL, 0x4699c3a5173076f9ULL, 0x3d1b151f50a29f42ULL,\n        0x9ed505ea2bc75946ULL, 0x34665acfdc7f4b98ULL, 0x61b1fb53292342f7ULL,\n        0xc721c0080e864130ULL, 0x8693cd1696fd7b74ULL, 0x872731927136b14bULL,\n        0xd3446c8a63a1721bULL, 0x669a35e8a6680e4aULL, 0xcab658f239509a16ULL,\n        0xa4e5de4ef42e8ab9ULL, 0x37a7435ee83f08d9ULL, 0x134e6239e26c7f96ULL,\n        0x82791a3c2df67488ULL, 0x3f6ef00a8329163cULL, 0x8e5a7e42fdeb6591ULL,\n        0x5caaee4c7981ddb5ULL, 0x19f234785af1e80dULL, 0x255ddde3ed98bd70ULL,\n        0x50898a32a99cccacULL, 0x28ca4519da4e6656ULL, 0xae59880f4cb31d22ULL,\n        0x0d9798fa37d6db26ULL, 0x32f968f0b4ffcd1aULL, 0xa00f09644f258545ULL,\n        0xfa3ad5175e24de72ULL, 0xf46c547c5db24615ULL, 0x713e80fbff0f7e20ULL,\n        0x7843cf2b73d2aafaULL, 0xbd17ea36aedf62b4ULL, 0xfd111bacd16f92cfULL,\n        0x4abaa7dbc72d67e0ULL, 0xb3416b5dad49fad3ULL, 0xbca316b24914a88bULL,\n        0x15d150068aecf914ULL, 0xe27c1debe31efc40ULL, 0x4fe48c759beda223ULL,\n        0x7edcfd141b522c78ULL, 0x4e5070f17c26681cULL, 0xe696cac15815f3bcULL,\n        0x35d2a64b3bb481a7ULL, 0x800cff29fe7dfdf6ULL, 0x1ed9fac3d5baa4b0ULL,\n        0x6c2663a91ef599d1ULL, 0x03c1199134404341ULL, 0xf7ad4ded69f20554ULL,\n        0xcd9d9649b61bd6abULL, 0xc8c3bde7eadb1368ULL, 0xd131899fb02afb65ULL,\n        0x1d18e352e1fae7f1ULL, 0xda39235aef7ca6c1ULL, 0xa1bbf5e0a8ee4f7aULL,\n        0x91377805cf9a0b1eULL, 0x3138716180bf8e5bULL, 0xd9f83acbdb3ce580ULL,\n        0x0275e515d38b897eULL, 0x472d3f21f0fbbcc6ULL, 0x2d946eb7868ea395ULL,\n        0xba3c248d21942e09ULL, 0xe7223645bfde3983ULL, 0xff64feb902e41bb1ULL,\n        0xc97741630d10d957ULL, 0xc3cb1722b58d4eccULL, 0xa27aec719cae0c3bULL,\n        0x99fecb51a48c15fbULL, 0x1465ac826d27332bULL, 0xe1bd047ad75ebf01ULL,\n        0x79f733af941960c5ULL, 0x672ec96c41a3c475ULL, 0xc27feba6524684f3ULL,\n        0x64efd0fd75e38734ULL, 0xed9e60040743ae18ULL, 0xfb8e2993b9ef144dULL,\n        0x38453eb10c625a81ULL, 0x6978480742355c12ULL, 0x48cf42ce14a6ee9eULL,\n        0x1cac1fd606312dceULL, 0x7b82d6ba4792e9bbULL, 0x9d141c7b1f871a07ULL,\n        0x5616b80dc11c4a2eULL, 0xb849c198f21fa777ULL, 0x7ca91801c8d9a506ULL,\n        0xb1348e487ec273adULL, 0x41b20d1e987b3a44ULL, 0x7460ab55a3cfbbe3ULL,\n        0x84e628034576f20aULL, 0x1b87d16d897a6173ULL, 0x0fe27defe45d5258ULL,\n        0x83cde6b8ca3dbeb7ULL, 0x0c23647ed01d1119ULL, 0x7a362a3ea0592384ULL,\n        0xb61f40f3f1893f10ULL, 0x75d457d1440471dcULL, 0x4558da34237035b8ULL,\n        0xdca6116587fc2043ULL, 0x8d9b67d3c9ab26d0ULL, 0x2b0b5c88ee0e2517ULL,\n        0x6fe77a382ab5da90ULL, 0x269cc472d9d8fe31ULL, 0x63c41e46faa8cb89ULL,\n        0xb7abbc771642f52fULL, 0x7d1de4852f126f39ULL, 0xa8c6ba3024339ba0ULL,\n        0x600507d7cee888c8ULL, 0x8fee82c61a20afaeULL, 0x57a2448926d78011ULL,\n        0xfca5e72836a458f0ULL, 0x072bcebb8f4b4cbdULL, 0x497bbe4af36d24a1ULL,\n        0x3cafe99bb769557dULL, 0x12fa9ebd05a7b5a9ULL, 0xe8c04baa5b836bdbULL,\n        0x4273148fac3b7905ULL, 0x908384812851c121ULL, 0xe557d3506c55b0fdULL,\n        0x72ff996acb4f3d61ULL, 0x3eda0c8e64e2dc03ULL, 0xf0868356e6b949e9ULL,\n        0x04ead72abb0b0ffcULL, 0x17a4b5135967706aULL, 0xe3c8e16f04d5367fULL,\n        0xf84f30028daf570cULL, 0x1846c8fcbd3a2232ULL, 0x5b8120f7f6ca9108ULL,\n        0xd46fa231ecea3ea6ULL, 0x334d947453340725ULL, 0x58403966c28ad249ULL,\n        0xbed6f3a79a9f21f5ULL, 0x68ccb483a5fe962dULL, 0xd085751b57e1315aULL,\n        0xfed0023de52fd18eULL, 0x4b0e5b5f20e6addfULL, 0x1a332de96eb1ab4cULL,\n        0xa3ce10f57b65c604ULL, 0x108f7ba8d62c3cd7ULL, 0xab07a3a11073d8e1ULL,\n        0x6b0dad1291bed56cULL, 0xf2f366433532c097ULL, 0x2e557726b2cee0d4ULL,\n        0x0000000000000000ULL, 0xcb02a476de9b5029ULL, 0xe4e32fd48b9e7ac2ULL,\n        0x734b65ee2c84f75eULL, 0x6e5386bccd7e10afULL, 0x01b4fc84e7cbca3fULL,\n        0xcfe8735c65905fd5ULL, 0x3613bfda0ff4c2e6ULL, 0x113b872c31e7f6e8ULL,\n        0x2fe18ba255052aebULL, 0xe974b72ebc48a1e4ULL, 0x0abc5641b89d979bULL,\n        0xb46aa5e62202b66eULL, 0x44ec26b0c4bbff87ULL, 0xa6903b5b27a503c7ULL,\n        0x7f680190fc99e647ULL, 0x97a84a3aa71a8d9cULL, 0xdd12ede16037ea7cULL,\n        0xc554251ddd0dc84eULL, 0x88c54c7d956be313ULL, 0x4d91696048662b5dULL,\n        0xb08072cc9909b992ULL, 0xb5de5962c5c97c51ULL, 0x81b803ad19b637c9ULL,\n        0xb2f597d94a8230ecULL, 0x0b08aac55f565da4ULL, 0xf1327fd2017283d6ULL,\n        0xad98919e78f35e63ULL, 0x6ab9519676751f53ULL, 0x24e921670a53774fULL,\n        0xb9fd3d1c15d46d48ULL, 0x92f66194fbda485fULL, 0x5a35dc7311015b37ULL,\n        0xded3f4705477a93dULL, 0xc00a0eb381cd0d8dULL, 0xbb88d809c65fe436ULL,\n        0x16104997beacba55ULL, 0x21b70ac95693b28cULL, 0x59f4c5e225411876ULL,\n        0xd5db5eb50b21f499ULL, 0x55d7a19cf55c096fULL, 0xa97246b4c3f8519fULL,\n        0x8552d487a2bd3835ULL, 0x54635d181297c350ULL, 0x23c2efdc85183bf2ULL,\n        0x9f61f96ecc0c9379ULL, 0x534893a39ddc8fedULL, 0x5edf0b59aa0a54cbULL,\n        0xac2c6d1a9f38945cULL, 0xd7aebba0d8aa7de7ULL, 0x2abfa00c09c5ef28ULL,\n        0xd84cc64f3cf72fbfULL, 0x2003f64db15878b3ULL, 0xa724c7dfc06ec9f8ULL,\n        0x069f323f68808682ULL, 0xcc296acd51d01c94ULL, 0x055e2bae5cc0c5c3ULL,\n        0x6270e2c21d6301b6ULL, 0x3b842720382219c0ULL, 0xd2f0900e846ab824ULL,\n        0x52fc6f277a1745d2ULL, 0xc6953c8ce94d8b0fULL, 0xe009f8fe3095753eULL,\n        0x655b2c7992284d0bULL, 0x984a37d54347dfc4ULL, 0xeab5aebf8808e2a5ULL,\n        0x9a3fd2c090cc56baULL, 0x9ca0e0fff84cd038ULL, 0x4c2595e4afade162ULL,\n        0xdf6708f4b3bc6302ULL, 0xbf620f237d54ebcaULL, 0x93429d101c118260ULL,\n        0x097d4fd08cddd4daULL, 0x8c2f9b572e60ecefULL, 0x708a7c7f18c4b41fULL,\n        0x3a30dba4dfe9d3ffULL, 0x4006f19a7fb0f07bULL, 0x5f6bf7dd4dc19ef4ULL,\n        0x1f6d064732716e8fULL, 0xf9fbcc866a649d33ULL, 0x308c8de567744464ULL,\n        0x8971b0f972a0292cULL, 0xd61a47243f61b7d8ULL, 0xefeb8511d4c82766ULL,\n        0x961cb6be40d147a3ULL, 0xaab35f25f7b812deULL, 0x76154e407044329dULL,\n        0x513d76b64e570693ULL, 0xf3479ac7d2f90aa8ULL, 0x9b8b2e4477079c85ULL,\n        0x297eb99d3d85ac69ULL\n    },\n    {\n        0x7e37e62dfc7d40c3ULL, 0x776f25a4ee939e5bULL, 0xe045c850dd8fb5adULL,\n        0x86ed5ba711ff1952ULL, 0xe91d0bd9cf616b35ULL, 0x37e0ab256e408ffbULL,\n        0x9607f6c031025a7aULL, 0x0b02f5e116d23c9dULL, 0xf3d8486bfb50650cULL,\n        0x621cff27c40875f5ULL, 0x7d40cb71fa5fd34aULL, 0x6daa6616daa29062ULL,\n        0x9f5f354923ec84e2ULL, 0xec847c3dc507c3b3ULL, 0x025a3668043ce205ULL,\n        0xa8bf9e6c4dac0b19ULL, 0xfa808be2e9bebb94ULL, 0xb5b99c5277c74fa3ULL,\n        0x78d9bc95f0397bccULL, 0xe332e50cdbad2624ULL, 0xc74fce129332797eULL,\n        0x1729eceb2ea709abULL, 0xc2d6b9f69954d1f8ULL, 0x5d898cbfbab8551aULL,\n        0x859a76fb17dd8adbULL, 0x1be85886362f7fb5ULL, 0xf6413f8ff136cd8aULL,\n        0xd3110fa5bbb7e35cULL, 0x0a2feed514cc4d11ULL, 0xe83010edcd7f1ab9ULL,\n        0xa1e75de55f42d581ULL, 0xeede4a55c13b21b6ULL, 0xf2f5535ff94e1480ULL,\n        0x0cc1b46d1888761eULL, 0xbce15fdb6529913bULL, 0x2d25e8975a7181c2ULL,\n        0x71817f1ce2d7a554ULL, 0x2e52c5cb5c53124bULL, 0xf9f7a6beef9c281dULL,\n        0x9e722e7d21f2f56eULL, 0xce170d9b81dca7e6ULL, 0x0e9b82051cb4941bULL,\n        0x1e712f623c49d733ULL, 0x21e45cfa42f9f7dcULL, 0xcb8e7a7f8bba0f60ULL,\n        0x8e98831a010fb646ULL, 0x474ccf0d8e895b23ULL, 0xa99285584fb27a95ULL,\n        0x8cc2b57205335443ULL, 0x42d5b8e984eff3a5ULL, 0x012d1b34021e718cULL,\n        0x57a6626aae74180bULL, 0xff19fc06e3d81312ULL, 0x35ba9d4d6a7c6dfeULL,\n        0xc9d44c178f86ed65ULL, 0x506523e6a02e5288ULL, 0x03772d5c06229389ULL,\n        0x8b01f4fe0b691ec0ULL, 0xf8dabd8aed825991ULL, 0x4c4e3aec985b67beULL,\n        0xb10df0827fbf96a9ULL, 0x6a69279ad4f8dae1ULL, 0xe78689dcd3d5ff2eULL,\n        0x812e1a2b1fa553d1ULL, 0xfbad90d6eba0ca18ULL, 0x1ac543b234310e39ULL,\n        0x1604f7df2cb97827ULL, 0xa6241c6951189f02ULL, 0x753513cceaaf7c5eULL,\n        0x64f2a59fc84c4efaULL, 0x247d2b1e489f5f5aULL, 0xdb64d718ab474c48ULL,\n        0x79f4a7a1f2270a40ULL, 0x1573da832a9bebaeULL, 0x3497867968621c72ULL,\n        0x514838d2a2302304ULL, 0xf0af6537fd72f685ULL, 0x1d06023e3a6b44baULL,\n        0x678588c3ce6edd73ULL, 0x66a893f7cc70acffULL, 0xd4d24e29b5eda9dfULL,\n        0x3856321470ea6a6cULL, 0x07c3418c0e5a4a83ULL, 0x2bcbb22f5635bacdULL,\n        0x04b46cd00878d90aULL, 0x06ee5ab80c443b0fULL, 0x3b211f4876c8f9e5ULL,\n        0x0958c38912eede98ULL, 0xd14b39cdbf8b0159ULL, 0x397b292072f41be0ULL,\n        0x87c0409313e168deULL, 0xad26e98847caa39fULL, 0x4e140c849c6785bbULL,\n        0xd5ff551db7f3d853ULL, 0xa0ca46d15d5ca40dULL, 0xcd6020c787fe346fULL,\n        0x84b76dcf15c3fb57ULL, 0xdefda0fca121e4ceULL, 0x4b8d7b6096012d3dULL,\n        0x9ac642ad298a2c64ULL, 0x0875d8bd10f0af14ULL, 0xb357c6ea7b8374acULL,\n        0x4d6321d89a451632ULL, 0xeda96709c719b23fULL, 0xf76c24bbf328bc06ULL,\n        0xc662d526912c08f2ULL, 0x3ce25ec47892b366ULL, 0xb978283f6f4f39bdULL,\n        0xc08c8f9e9d6833fdULL, 0x4f3917b09e79f437ULL, 0x593de06fb2c08c10ULL,\n        0xd6887841b1d14bdaULL, 0x19b26eee32139db0ULL, 0xb494876675d93e2fULL,\n        0x825937771987c058ULL, 0x90e9ac783d466175ULL, 0xf1827e03ff6c8709ULL,\n        0x945dc0a8353eb87fULL, 0x4516f9658ab5b926ULL, 0x3f9573987eb020efULL,\n        0xb855330b6d514831ULL, 0x2ae6a91b542bcb41ULL, 0x6331e413c6160479ULL,\n        0x408f8e8180d311a0ULL, 0xeff35161c325503aULL, 0xd06622f9bd9570d5ULL,\n        0x8876d9a20d4b8d49ULL, 0xa5533135573a0c8bULL, 0xe168d364df91c421ULL,\n        0xf41b09e7f50a2f8fULL, 0x12b09b0f24c1a12dULL, 0xda49cc2ca9593dc4ULL,\n        0x1f5c34563e57a6bfULL, 0x54d14f36a8568b82ULL, 0xaf7cdfe043f6419aULL,\n        0xea6a2685c943f8bcULL, 0xe5dcbfb4d7e91d2bULL, 0xb27addde799d0520ULL,\n        0x6b443caed6e6ab6dULL, 0x7bae91c9f61be845ULL, 0x3eb868ac7cae5163ULL,\n        0x11c7b65322e332a4ULL, 0xd23c1491b9a992d0ULL, 0x8fb5982e0311c7caULL,\n        0x70ac6428e0c9d4d8ULL, 0x895bc2960f55fcc5ULL, 0x76423e90ec8defd7ULL,\n        0x6ff0507ede9e7267ULL, 0x3dcf45f07a8cc2eaULL, 0x4aa06054941f5cb1ULL,\n        0x5810fb5bb0defd9cULL, 0x5efea1e3bc9ac693ULL, 0x6edd4b4adc8003ebULL,\n        0x741808f8e8b10dd2ULL, 0x145ec1b728859a22ULL, 0x28bc9f7350172944ULL,\n        0x270a06424ebdccd3ULL, 0x972aedf4331c2bf6ULL, 0x059977e40a66a886ULL,\n        0x2550302a4a812ed6ULL, 0xdd8a8da0a7037747ULL, 0xc515f87a970e9b7bULL,\n        0x3023eaa9601ac578ULL, 0xb7e3aa3a73fbada6ULL, 0x0fb699311eaae597ULL,\n        0x0000000000000000ULL, 0x310ef19d6204b4f4ULL, 0x229371a644db6455ULL,\n        0x0decaf591a960792ULL, 0x5ca4978bb8a62496ULL, 0x1c2b190a38753536ULL,\n        0x41a295b582cd602cULL, 0x3279dcc16426277dULL, 0xc1a194aa9f764271ULL,\n        0x139d803b26dfd0a1ULL, 0xae51c4d441e83016ULL, 0xd813fa44ad65dfc1ULL,\n        0xac0bf2bc45d4d213ULL, 0x23be6a9246c515d9ULL, 0x49d74d08923dcf38ULL,\n        0x9d05032127d066e7ULL, 0x2f7fdeff5e4d63c7ULL, 0xa47e2a0155247d07ULL,\n        0x99b16ff12fa8bfedULL, 0x4661d4398c972aafULL, 0xdfd0bbc8a33f9542ULL,\n        0xdca79694a51d06cbULL, 0xb020ebb67da1e725ULL, 0xba0f0563696daa34ULL,\n        0xe4f1a480d5f76ca7ULL, 0xc438e34e9510eaf7ULL, 0x939e81243b64f2fcULL,\n        0x8defae46072d25cfULL, 0x2c08f3a3586ff04eULL, 0xd7a56375b3cf3a56ULL,\n        0x20c947ce40e78650ULL, 0x43f8a3dd86f18229ULL, 0x568b795eac6a6987ULL,\n        0x8003011f1dbb225dULL, 0xf53612d3f7145e03ULL, 0x189f75da300dec3cULL,\n        0x9570db9c3720c9f3ULL, 0xbb221e576b73dbb8ULL, 0x72f65240e4f536ddULL,\n        0x443be25188abc8aaULL, 0xe21ffe38d9b357a8ULL, 0xfd43ca6ee7e4f117ULL,\n        0xcaa3614b89a47eecULL, 0xfe34e732e1c6629eULL, 0x83742c431b99b1d4ULL,\n        0xcf3a16af83c2d66aULL, 0xaae5a8044990e91cULL, 0x26271d764ca3bd5fULL,\n        0x91c4b74c3f5810f9ULL, 0x7c6dd045f841a2c6ULL, 0x7f1afd19fe63314fULL,\n        0xc8f957238d989ce9ULL, 0xa709075d5306ee8eULL, 0x55fc5402aa48fa0eULL,\n        0x48fa563c9023beb4ULL, 0x65dfbeabca523f76ULL, 0x6c877d22d8bce1eeULL,\n        0xcc4d3bf385e045e3ULL, 0xbebb69b36115733eULL, 0x10eaad6720fd4328ULL,\n        0xb6ceb10e71e5dc2aULL, 0xbdcc44ef6737e0b7ULL, 0x523f158ea412b08dULL,\n        0x989c74c52db6ce61ULL, 0x9beb59992b945de8ULL, 0x8a2cefca09776f4cULL,\n        0xa3bd6b8d5b7e3784ULL, 0xeb473db1cb5d8930ULL, 0xc3fba2c29b4aa074ULL,\n        0x9c28181525ce176bULL, 0x683311f2d0c438e4ULL, 0x5fd3bad7be84b71fULL,\n        0xfc6ed15ae5fa809bULL, 0x36cdb0116c5efe77ULL, 0x29918447520958c8ULL,\n        0xa29070b959604608ULL, 0x53120ebaa60cc101ULL, 0x3a0c047c74d68869ULL,\n        0x691e0ac6d2da4968ULL, 0x73db4974e6eb4751ULL, 0x7a838afdf40599c9ULL,\n        0x5a4acd33b4e21f99ULL, 0x6046c94fc03497f0ULL, 0xe6ab92e8d1cb8ea2ULL,\n        0x3354c7f5663856f1ULL, 0xd93ee170af7bae4dULL, 0x616bd27bc22ae67cULL,\n        0x92b39a10397a8370ULL, 0xabc8b3304b8e9890ULL, 0xbf967287630b02b2ULL,\n        0x5b67d607b6fc6e15ULL\n    },\n    {\n        0xd031c397ce553fe6ULL, 0x16ba5b01b006b525ULL, 0xa89bade6296e70c8ULL,\n        0x6a1f525d77d3435bULL, 0x6e103570573dfa0bULL, 0x660efb2a17fc95abULL,\n        0x76327a9e97634bf6ULL, 0x4bad9d6462458bf5ULL, 0xf1830caedbc3f748ULL,\n        0xc5c8f542669131ffULL, 0x95044a1cdc48b0cbULL, 0x892962df3cf8b866ULL,\n        0xb0b9e208e930c135ULL, 0xa14fb3f0611a767cULL, 0x8d2605f21c160136ULL,\n        0xd6b71922fecc549eULL, 0x37089438a5907d8bULL, 0x0b5da38e5803d49cULL,\n        0x5a5bcc9cea6f3cbcULL, 0xedae246d3b73ffe5ULL, 0xd2b87e0fde22edceULL,\n        0x5e54abb1ca8185ecULL, 0x1de7f88fe80561b9ULL, 0xad5e1a870135a08cULL,\n        0x2f2adbd665cecc76ULL, 0x5780b5a782f58358ULL, 0x3edc8a2eede47b3fULL,\n        0xc9d95c3506bee70fULL, 0x83be111d6c4e05eeULL, 0xa603b90959367410ULL,\n        0x103c81b4809fde5dULL, 0x2c69b6027d0c774aULL, 0x399080d7d5c87953ULL,\n        0x09d41e16487406b4ULL, 0xcdd63b1826505e5fULL, 0xf99dc2f49b0298e8ULL,\n        0x9cd0540a943cb67fULL, 0xbca84b7f891f17c5ULL, 0x723d1db3b78df2a6ULL,\n        0x78aa6e71e73b4f2eULL, 0x1433e699a071670dULL, 0x84f21be454620782ULL,\n        0x98df3327b4d20f2fULL, 0xf049dce2d3769e5cULL, 0xdb6c60199656eb7aULL,\n        0x648746b2078b4783ULL, 0x32cd23598dcbadcfULL, 0x1ea4955bf0c7da85ULL,\n        0xe9a143401b9d46b5ULL, 0xfd92a5d9bbec21b8ULL, 0xc8138c790e0b8e1bULL,\n        0x2ee00b9a6d7ba562ULL, 0xf85712b893b7f1fcULL, 0xeb28fed80bea949dULL,\n        0x564a65eb8a40ea4cULL, 0x6c9988e8474a2823ULL, 0x4535898b121d8f2dULL,\n        0xabd8c03231accbf4ULL, 0xba2e91cab9867cbdULL, 0x7960be3def8e263aULL,\n        0x0c11a977602fd6f0ULL, 0xcb50e1ad16c93527ULL, 0xeae22e94035ffd89ULL,\n        0x2866d12f5de2ce1aULL, 0xff1b1841ab9bf390ULL, 0x9f9339de8cfe0d43ULL,\n        0x964727c8c48a0bf7ULL, 0x524502c6aaae531cULL, 0x9b9c5ef3ac10b413ULL,\n        0x4fa2fa4942ab32a5ULL, 0x3f165a62e551122bULL, 0xc74148da76e6e3d7ULL,\n        0x924840e5e464b2a7ULL, 0xd372ae43d69784daULL, 0x233b72a105e11a86ULL,\n        0xa48a04914941a638ULL, 0xb4b68525c9de7865ULL, 0xddeabaaca6cf8002ULL,\n        0x0a9773c250b6bd88ULL, 0xc284ffbb5ebd3393ULL, 0x8ba0df472c8f6a4eULL,\n        0x2aef6cb74d951c32ULL, 0x427983722a318d41ULL, 0x73f7cdffbf389bb2ULL,\n        0x074c0af9382c026cULL, 0x8a6a0f0b243a035aULL, 0x6fdae53c5f88931fULL,\n        0xc68b98967e538ac3ULL, 0x44ff59c71aa8e639ULL, 0xe2fce0ce439e9229ULL,\n        0xa20cde2479d8cd40ULL, 0x19e89fa2c8ebd8e9ULL, 0xf446bbcff398270cULL,\n        0x43b3533e2284e455ULL, 0xd82f0dcd8e945046ULL, 0x51066f12b26ce820ULL,\n        0xe73957af6bc5426dULL, 0x081ece5a40c16fa0ULL, 0x3b193d4fc5bfab7bULL,\n        0x7fe66488df174d42ULL, 0x0e9814ef705804d8ULL, 0x8137ac857c39d7c6ULL,\n        0xb1733244e185a821ULL, 0x695c3f896f11f867ULL, 0xf6cf0657e3eff524ULL,\n        0x1aabf276d02963d5ULL, 0x2da3664e75b91e5eULL, 0x0289bd981077d228ULL,\n        0x90c1fd7df413608fULL, 0x3c5537b6fd93a917ULL, 0xaa12107e3919a2e0ULL,\n        0x0686dab530996b78ULL, 0xdaa6b0559ee3826eULL, 0xc34e2ff756085a87ULL,\n        0x6d5358a44fff4137ULL, 0xfc587595b35948acULL, 0x7ca5095cc7d5f67eULL,\n        0xfb147f6c8b754ac0ULL, 0xbfeb26ab91ddacf9ULL, 0x6896efc567a49173ULL,\n        0xca9a31e11e7c5c33ULL, 0xbbe44186b13315a9ULL, 0x0ddb793b689abfe4ULL,\n        0x70b4a02ba7fa208eULL, 0xe47a3a7b7307f951ULL, 0x8cecd5be14a36822ULL,\n        0xeeed49b923b144d9ULL, 0x17708b4db8b3dc31ULL, 0x6088219f2765fed3ULL,\n        0xb3fa8fdcf1f27a09ULL, 0x910b2d31fca6099bULL, 0x0f52c4a378ed6dccULL,\n        0x50ccbf5ebad98134ULL, 0x6bd582117f662a4fULL, 0x94ce9a50d4fdd9dfULL,\n        0x2b25bcfb45207526ULL, 0x67c42b661f49fcbfULL, 0x492420fc723259ddULL,\n        0x03436dd418c2bb3cULL, 0x1f6e4517f872b391ULL, 0xa08563bc69af1f68ULL,\n        0xd43ea4baeebb86b6ULL, 0x01cad04c08b56914ULL, 0xac94cacb0980c998ULL,\n        0x54c3d8739a373864ULL, 0x26fec5c02dbacac2ULL, 0xdea9d778be0d3b3eULL,\n        0x040f672d20eeb950ULL, 0xe5b0ea377bb29045ULL, 0xf30ab136cbb42560ULL,\n        0x62019c0737122cfbULL, 0xe86b930c13282fa1ULL, 0xcc1ceb542ee5374bULL,\n        0x538fd28aa21b3a08ULL, 0x1b61223ad89c0ac1ULL, 0x36c24474ad25149fULL,\n        0x7a23d3e9f74c9d06ULL, 0xbe21f6e79968c5edULL, 0xcf5f868036278c77ULL,\n        0xf705d61beb5a9c30ULL, 0x4d2b47d152dce08dULL, 0x5f9e7bfdc234ecf8ULL,\n        0x247778583dcd18eaULL, 0x867ba67c4415d5aaULL, 0x4ce1979d5a698999ULL,\n        0x0000000000000000ULL, 0xec64f42133c696f1ULL, 0xb57c5569c16b1171ULL,\n        0xc1c7926f467f88afULL, 0x654d96fe0f3e2e97ULL, 0x15f936d5a8c40e19ULL,\n        0xb8a72c52a9f1ae95ULL, 0xa9517daa21db19dcULL, 0x58d27104fa18ee94ULL,\n        0x5918a148f2ad8780ULL, 0x5cdd1629daf657c4ULL, 0x8274c15164fb6cfaULL,\n        0xd1fb13dbc6e056f2ULL, 0x7d6fd910cf609f6aULL, 0xb63f38bdd9a9aa4dULL,\n        0x3d9fe7faf526c003ULL, 0x74bbc706871499deULL, 0xdf630734b6b8522aULL,\n        0x3ad3ed03cd0ac26fULL, 0xfadeaf2083c023d4ULL, 0xc00d42234ecae1bbULL,\n        0x8538cba85cd76e96ULL, 0xc402250e6e2458ebULL, 0x47bc3413026a5d05ULL,\n        0xafd7a71f114272a4ULL, 0x978df784cc3f62e3ULL, 0xb96dfc1ea144c781ULL,\n        0x21b2cf391596c8aeULL, 0x318e4e8d950916f3ULL, 0xce9556cc3e92e563ULL,\n        0x385a509bdd7d1047ULL, 0x358129a0b5e7afa3ULL, 0xe6f387e363702b79ULL,\n        0xe0755d5653e94001ULL, 0x7be903a5fff9f412ULL, 0x12b53c2c90e80c75ULL,\n        0x3307f315857ec4dbULL, 0x8fafb86a0c61d31eULL, 0xd9e5dd8186213952ULL,\n        0x77f8aad29fd622e2ULL, 0x25bda814357871feULL, 0x7571174a8fa1f0caULL,\n        0x137fec60985d6561ULL, 0x30449ec19dbc7fe7ULL, 0xa540d4dd41f4cf2cULL,\n        0xdc206ae0ae7ae916ULL, 0x5b911cd0e2da55a8ULL, 0xb2305f90f947131dULL,\n        0x344bf9ecbd52c6b7ULL, 0x5d17c665d2433ed0ULL, 0x18224feec05eb1fdULL,\n        0x9e59e992844b6457ULL, 0x9a568ebfa4a5dd07ULL, 0xa3c60e68716da454ULL,\n        0x7e2cb4c4d7a22456ULL, 0x87b176304ca0bcbeULL, 0x413aeea632f3367dULL,\n        0x9915e36bbc67663bULL, 0x40f03eea3a465f69ULL, 0x1c2d28c3e0b008adULL,\n        0x4e682a054a1e5bb1ULL, 0x05c5b761285bd044ULL, 0xe1bf8d1a5b5c2915ULL,\n        0xf2c0617ac3014c74ULL, 0xb7f5e8f1d11cc359ULL, 0x63cb4c4b3fa745efULL,\n        0x9d1a84469c89df6bULL, 0xe33630824b2bfb3dULL, 0xd5f474f6e60eefa2ULL,\n        0xf58c6b83fb2d4e18ULL, 0x4676e45f0adf3411ULL, 0x20781f751d23a1baULL,\n        0xbd629b3381aa7ed1ULL, 0xae1d775319f71bb0ULL, 0xfed1c80da32e9a84ULL,\n        0x5509083f92825170ULL, 0x29ac01635557a70eULL, 0xa7c9694551831d04ULL,\n        0x8e65682604d4ba0aULL, 0x11f651f8882ab749ULL, 0xd77dc96ef6793d8aULL,\n        0xef2799f52b042dcdULL, 0x48eef0b07a8730c9ULL, 0x22f1a2ed0d547392ULL,\n        0x6142f1d32fd097c7ULL, 0x4a674d286af0e2e1ULL, 0x80fd7cc9748cbed2ULL,\n        0x717e7067af4f499aULL, 0x938290a9ecd1dbb3ULL, 0x88e3b293344dd172ULL,\n        0x2734158c250fa3d6ULL\n    }\n};\n#endif\n"
  },
  {
    "path": "lib/alg-gost3411-2012-ref.h",
    "content": "/*\n * Copyright (c) 2013, Alexey Degtyarev <alexey@renatasystems.org>.\n * All rights reserved.\n *\n * Portable and simple (thus sometimes slow) implementation of core functions.\n *\n * $Id$\n */\n\n#ifdef __GOST3411_HAS_SSE2__\n#error \"portable implementation disabled in config.h\"\n#endif\n\n#ifdef __GOST3411_HAS_MMX__\n#error \"portable implementation disabled in config.h\"\n#endif\n\n#define X(x, y, z) { \\\n    z->QWORD[0] = x->QWORD[0] ^ y->QWORD[0]; \\\n    z->QWORD[1] = x->QWORD[1] ^ y->QWORD[1]; \\\n    z->QWORD[2] = x->QWORD[2] ^ y->QWORD[2]; \\\n    z->QWORD[3] = x->QWORD[3] ^ y->QWORD[3]; \\\n    z->QWORD[4] = x->QWORD[4] ^ y->QWORD[4]; \\\n    z->QWORD[5] = x->QWORD[5] ^ y->QWORD[5]; \\\n    z->QWORD[6] = x->QWORD[6] ^ y->QWORD[6]; \\\n    z->QWORD[7] = x->QWORD[7] ^ y->QWORD[7]; \\\n}\n\n#ifndef __GOST3411_BIG_ENDIAN__\n#define __XLPS_FOR for (_i = 0; _i <= 7; _i++)\n#define _datai _i\n#else\n#define __XLPS_FOR for (_i = 7; _i >= 0; _i--)\n#define _datai 7 - _i\n#endif\n\n#define XLPS(x, y, data) { \\\n    register unsigned long long r0, r1, r2, r3, r4, r5, r6, r7; \\\n    int _i; \\\n    \\\n    r0 = x->QWORD[0] ^ y->QWORD[0]; \\\n    r1 = x->QWORD[1] ^ y->QWORD[1]; \\\n    r2 = x->QWORD[2] ^ y->QWORD[2]; \\\n    r3 = x->QWORD[3] ^ y->QWORD[3]; \\\n    r4 = x->QWORD[4] ^ y->QWORD[4]; \\\n    r5 = x->QWORD[5] ^ y->QWORD[5]; \\\n    r6 = x->QWORD[6] ^ y->QWORD[6]; \\\n    r7 = x->QWORD[7] ^ y->QWORD[7]; \\\n    \\\n    \\\n    __XLPS_FOR \\\n    {\\\n        data->QWORD[_datai]  = Ax[0][(r0 >> (_i << 3)) & 0xFF]; \\\n        data->QWORD[_datai] ^= Ax[1][(r1 >> (_i << 3)) & 0xFF]; \\\n        data->QWORD[_datai] ^= Ax[2][(r2 >> (_i << 3)) & 0xFF]; \\\n        data->QWORD[_datai] ^= Ax[3][(r3 >> (_i << 3)) & 0xFF]; \\\n        data->QWORD[_datai] ^= Ax[4][(r4 >> (_i << 3)) & 0xFF]; \\\n        data->QWORD[_datai] ^= Ax[5][(r5 >> (_i << 3)) & 0xFF]; \\\n        data->QWORD[_datai] ^= Ax[6][(r6 >> (_i << 3)) & 0xFF]; \\\n        data->QWORD[_datai] ^= Ax[7][(r7 >> (_i << 3)) & 0xFF]; \\\n    }\\\n}\n\n#define ROUND(i, Ki, data) { \\\n    XLPS(Ki, (&C[i]), Ki); \\\n    XLPS(Ki, data, data); \\\n}\n"
  },
  {
    "path": "lib/alg-hmac-sha1.c",
    "content": "/*\n * Copyright (c) 2017, Björn Esser <besser82@fedoraproject.org>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n *\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n/*\n * Implement HMAC as described in RFC 2104\n *\n */\n\n#include \"crypt-port.h\"\n#include \"alg-hmac-sha1.h\"\n#include \"alg-sha1.h\"\n\n#include <stdlib.h>\n\n#if INCLUDE_sha1crypt\n\n/* Don't change these */\n#define HMAC_IPAD 0x36\n#define HMAC_OPAD 0x5c\n\n/* Nor this */\n#ifndef HMAC_BLOCKSZ\n# define HMAC_BLOCKSZ 64\n# define HASH_LENGTH  20\n#endif\n\n/*\n * The logic here is lifted straight from RFC 2104 except that\n * rather than filling the pads with 0, copying in the key and then\n * XOR with the pad byte, we just fill with the pad byte and\n * XOR with the key.\n */\nvoid\nhmac_sha1_process_data (const uint8_t *text, size_t text_len,\n                        const uint8_t *key, size_t key_len,\n                        void *resbuf)\n{\n  struct sha1_ctx ctx;\n  /* Inner padding key XOR'd with ipad */\n  uint8_t k_ipad[HMAC_BLOCKSZ];\n  /* Outer padding key XOR'd with opad */\n  uint8_t k_opad[HMAC_BLOCKSZ];\n  /* HASH(key) if needed */\n  unsigned char tk[HASH_LENGTH];\n  size_t i;\n\n  /*\n   * If key is longer than HMAC_BLOCKSZ bytes\n   * reset it to key=HASH(key)\n   */\n  if (key_len > HMAC_BLOCKSZ)\n    {\n      struct sha1_ctx tctx;\n\n      sha1_init_ctx (&tctx);\n      sha1_process_bytes (key, &tctx, key_len);\n      sha1_finish_ctx(&tctx, &tk);\n\n      key = tk;\n      key_len = HASH_LENGTH;\n    }\n\n  /*\n   * The HMAC_ transform looks like:\n   *\n   * HASH(K XOR opad, HASH(K XOR ipad, text))\n   *\n   * where K is an n byte key\n   * ipad is the byte HMAC_IPAD repeated HMAC_BLOCKSZ times\n   * opad is the byte HMAC_OPAD repeated HMAC_BLOCKSZ times\n   * and text is the data being protected\n   */\n\n  /*\n   * Fill the pads and XOR in the key\n   */\n  memset (k_ipad, HMAC_IPAD, sizeof k_ipad);\n  memset (k_opad, HMAC_OPAD, sizeof k_opad);\n  for (i = 0; i < key_len; i++)\n    {\n      k_ipad[i] ^= key[i];\n      k_opad[i] ^= key[i];\n    }\n\n  /* Clean the stack. */\n  explicit_bzero (tk, HASH_LENGTH);\n\n  /*\n   * Perform inner HASH.\n   * Start with inner pad,\n   * then the text.\n   */\n  sha1_init_ctx (&ctx);\n  sha1_process_bytes (k_ipad, &ctx, HMAC_BLOCKSZ);\n  sha1_process_bytes (text, &ctx, text_len);\n  sha1_finish_ctx(&ctx, resbuf);\n\n  /* Clean the stack. */\n  explicit_bzero (k_ipad, HMAC_BLOCKSZ);\n\n  /*\n   * Perform outer HASH.\n   * Start with the outer pad,\n   * then the result of the inner hash.\n   */\n  sha1_init_ctx (&ctx);\n  sha1_process_bytes (k_opad, &ctx, HMAC_BLOCKSZ);\n  sha1_process_bytes (resbuf, &ctx, HASH_LENGTH);\n  sha1_finish_ctx(&ctx, resbuf);\n\n  /* Clean the stack. */\n  explicit_bzero (k_opad, HMAC_BLOCKSZ);\n}\n\n#endif\n"
  },
  {
    "path": "lib/alg-hmac-sha1.h",
    "content": "/*\n * Copyright (c) 2017, Björn Esser <besser82@fedoraproject.org>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n *\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n/* Generate the keyed-hash message authentication code of TEXT and KEY.\n   The resulting HMAC is written into RESBUF, which should point to 20\n   bytes of storage.  */\nextern void\nhmac_sha1_process_data (const uint8_t *text, size_t text_len,\n                        const uint8_t *key, size_t key_len,\n                        void *resbuf);\n"
  },
  {
    "path": "lib/alg-md4.c",
    "content": "/*\n * This is an OpenSSL-compatible implementation of the RSA Data Security, Inc.\n * MD4 Message-Digest Algorithm (RFC 1320).\n *\n * Homepage:\n * http://openwall.info/wiki/people/solar/software/public-domain-source-code/md4\n *\n * Author:\n * Alexander Peslyak, better known as Solar Designer <solar at openwall.com>\n *\n * This software was written by Alexander Peslyak in 2001.  No copyright is\n * claimed, and the software is hereby placed in the public domain.\n * In case this attempt to disclaim copyright and place the software in the\n * public domain is deemed null and void, then the software is\n * Copyright (c) 2001 Alexander Peslyak and it is hereby released to the\n * general public under the following terms:\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted.\n *\n * There's ABSOLUTELY NO WARRANTY, express or implied.\n *\n * (This is a heavily cut-down \"BSD license\".)\n *\n * This differs from Colin Plumb's older public domain implementation in that\n * no exactly 32-bit integer data type is required (any 32-bit or wider\n * unsigned integer data type will do), there's no compile-time endianness\n * configuration, and the function prototypes match OpenSSL's.  No code from\n * Colin Plumb's implementation has been reused; this comment merely compares\n * the properties of the two independent implementations.\n *\n * The primary goals of this implementation are portability and ease of use.\n * It is meant to be fast, but not as fast as possible.  Some known\n * optimizations are not included to reduce source code size and avoid\n * compile-time configuration.\n */\n\n#include \"crypt-port.h\"\n\n#if INCLUDE_nt\n\n#include \"alg-md4.h\"\n\n/*\n * The basic MD4 functions.\n *\n * F and G are optimized compared to their RFC 1320 definitions, with the\n * optimization for F borrowed from Colin Plumb's MD5 implementation.\n */\n#define F(x, y, z)\t\t\t((z) ^ ((x) & ((y) ^ (z))))\n#define G(x, y, z)\t\t\t(((x) & ((y) | (z))) | ((y) & (z)))\n#define H(x, y, z)\t\t\t((x) ^ (y) ^ (z))\n\n/*\n * The MD4 transformation for all three rounds.\n */\n#define STEP(f, a, b, c, d, x, s) \\\n\t(a) += f((b), (c), (d)) + (x); \\\n\t(a) = (((a) << (s)) | (((a) & 0xffffffff) >> (32 - (s))));\n\n/*\n * SET reads 4 input bytes in little-endian byte order and stores them in a\n * properly aligned word in host byte order.\n *\n * The check for little-endian architectures that tolerate unaligned memory\n * accesses is just an optimization.  Nothing will break if it fails to detect\n * a suitable architecture.\n *\n * Unfortunately, this optimization may be a C strict aliasing rules violation\n * if the caller's data buffer has effective type that cannot be aliased by\n * MD4_u32plus.  In practice, this problem may occur if these MD4 routines are\n * inlined into a calling function, or with future and dangerously advanced\n * link-time optimizations.  For the time being, keeping these MD4 routines in\n * their own translation unit avoids the problem.\n */\n#if 0 /* defined(__i386__) || defined(__x86_64__) || defined(__vax__) */\n#define SET(n) \\\n\t(*(const MD4_u32plus *)&ptr[(n) * 4])\n#define GET(n) \\\n\tSET(n)\n#else\n#define SET(n) \\\n\t(ctx->block[(n)] = \\\n\t(MD4_u32plus)ptr[(n) * 4] | \\\n\t((MD4_u32plus)ptr[(n) * 4 + 1] << 8) | \\\n\t((MD4_u32plus)ptr[(n) * 4 + 2] << 16) | \\\n\t((MD4_u32plus)ptr[(n) * 4 + 3] << 24))\n#define GET(n) \\\n\t(ctx->block[(n)])\n#endif\n\n/*\n * This processes one or more 64-byte data blocks, but does NOT update the bit\n * counters.  There are no alignment requirements.\n */\nstatic const void *body(MD4_CTX *ctx, const void *data, unsigned long size)\n{\n\tconst unsigned char *ptr;\n\tMD4_u32plus a, b, c, d;\n\tMD4_u32plus saved_a, saved_b, saved_c, saved_d;\n\tconst MD4_u32plus ac1 = 0x5a827999, ac2 = 0x6ed9eba1;\n\n\tptr = (const unsigned char *)data;\n\n\ta = ctx->a;\n\tb = ctx->b;\n\tc = ctx->c;\n\td = ctx->d;\n\n\tdo {\n\t\tsaved_a = a;\n\t\tsaved_b = b;\n\t\tsaved_c = c;\n\t\tsaved_d = d;\n\n/* Round 1 */\n\t\tSTEP(F, a, b, c, d, SET(0), 3)\n\t\tSTEP(F, d, a, b, c, SET(1), 7)\n\t\tSTEP(F, c, d, a, b, SET(2), 11)\n\t\tSTEP(F, b, c, d, a, SET(3), 19)\n\t\tSTEP(F, a, b, c, d, SET(4), 3)\n\t\tSTEP(F, d, a, b, c, SET(5), 7)\n\t\tSTEP(F, c, d, a, b, SET(6), 11)\n\t\tSTEP(F, b, c, d, a, SET(7), 19)\n\t\tSTEP(F, a, b, c, d, SET(8), 3)\n\t\tSTEP(F, d, a, b, c, SET(9), 7)\n\t\tSTEP(F, c, d, a, b, SET(10), 11)\n\t\tSTEP(F, b, c, d, a, SET(11), 19)\n\t\tSTEP(F, a, b, c, d, SET(12), 3)\n\t\tSTEP(F, d, a, b, c, SET(13), 7)\n\t\tSTEP(F, c, d, a, b, SET(14), 11)\n\t\tSTEP(F, b, c, d, a, SET(15), 19)\n\n/* Round 2 */\n\t\tSTEP(G, a, b, c, d, GET(0) + ac1, 3)\n\t\tSTEP(G, d, a, b, c, GET(4) + ac1, 5)\n\t\tSTEP(G, c, d, a, b, GET(8) + ac1, 9)\n\t\tSTEP(G, b, c, d, a, GET(12) + ac1, 13)\n\t\tSTEP(G, a, b, c, d, GET(1) + ac1, 3)\n\t\tSTEP(G, d, a, b, c, GET(5) + ac1, 5)\n\t\tSTEP(G, c, d, a, b, GET(9) + ac1, 9)\n\t\tSTEP(G, b, c, d, a, GET(13) + ac1, 13)\n\t\tSTEP(G, a, b, c, d, GET(2) + ac1, 3)\n\t\tSTEP(G, d, a, b, c, GET(6) + ac1, 5)\n\t\tSTEP(G, c, d, a, b, GET(10) + ac1, 9)\n\t\tSTEP(G, b, c, d, a, GET(14) + ac1, 13)\n\t\tSTEP(G, a, b, c, d, GET(3) + ac1, 3)\n\t\tSTEP(G, d, a, b, c, GET(7) + ac1, 5)\n\t\tSTEP(G, c, d, a, b, GET(11) + ac1, 9)\n\t\tSTEP(G, b, c, d, a, GET(15) + ac1, 13)\n\n/* Round 3 */\n\t\tSTEP(H, a, b, c, d, GET(0) + ac2, 3)\n\t\tSTEP(H, d, a, b, c, GET(8) + ac2, 9)\n\t\tSTEP(H, c, d, a, b, GET(4) + ac2, 11)\n\t\tSTEP(H, b, c, d, a, GET(12) + ac2, 15)\n\t\tSTEP(H, a, b, c, d, GET(2) + ac2, 3)\n\t\tSTEP(H, d, a, b, c, GET(10) + ac2, 9)\n\t\tSTEP(H, c, d, a, b, GET(6) + ac2, 11)\n\t\tSTEP(H, b, c, d, a, GET(14) + ac2, 15)\n\t\tSTEP(H, a, b, c, d, GET(1) + ac2, 3)\n\t\tSTEP(H, d, a, b, c, GET(9) + ac2, 9)\n\t\tSTEP(H, c, d, a, b, GET(5) + ac2, 11)\n\t\tSTEP(H, b, c, d, a, GET(13) + ac2, 15)\n\t\tSTEP(H, a, b, c, d, GET(3) + ac2, 3)\n\t\tSTEP(H, d, a, b, c, GET(11) + ac2, 9)\n\t\tSTEP(H, c, d, a, b, GET(7) + ac2, 11)\n\t\tSTEP(H, b, c, d, a, GET(15) + ac2, 15)\n\n\t\ta += saved_a;\n\t\tb += saved_b;\n\t\tc += saved_c;\n\t\td += saved_d;\n\n\t\tptr += 64;\n\t} while (size -= 64);\n\n\tctx->a = a;\n\tctx->b = b;\n\tctx->c = c;\n\tctx->d = d;\n\n\treturn ptr;\n}\n\nvoid MD4_Init(MD4_CTX *ctx)\n{\n\tctx->a = 0x67452301;\n\tctx->b = 0xefcdab89;\n\tctx->c = 0x98badcfe;\n\tctx->d = 0x10325476;\n\n\tctx->lo = 0;\n\tctx->hi = 0;\n}\n\nvoid MD4_Update(MD4_CTX *ctx, const void *data, size_t size)\n{\n\tMD4_u32plus saved_lo;\n\tunsigned long used, available;\n\n\tsaved_lo = ctx->lo;\n\tif ((ctx->lo = (saved_lo + size) & 0x1fffffff) < saved_lo)\n\t\tctx->hi++;\n\tctx->hi += (MD4_u32plus) size >> 29;\n\n\tused = saved_lo & 0x3f;\n\n\tif (used) {\n\t\tavailable = 64 - used;\n\n\t\tif (size < available) {\n\t\t\tmemcpy(&ctx->buffer[used], data, size);\n\t\t\treturn;\n\t\t}\n\n\t\tmemcpy(&ctx->buffer[used], data, available);\n\t\tdata = (const unsigned char *)data + available;\n\t\tsize -= available;\n\t\tbody(ctx, ctx->buffer, 64);\n\t}\n\n\tif (size >= 64) {\n\t\tdata = body(ctx, data, size & ~(unsigned long)0x3f);\n\t\tsize &= 0x3f;\n\t}\n\n\tmemcpy(ctx->buffer, data, size);\n}\n\n#define OUT(dst, src) \\\n\t(dst)[0] = (unsigned char)(src); \\\n\t(dst)[1] = (unsigned char)((src) >> 8); \\\n\t(dst)[2] = (unsigned char)((src) >> 16); \\\n\t(dst)[3] = (unsigned char)((src) >> 24);\n\nvoid MD4_Final(uint8_t result[16], MD4_CTX *ctx)\n{\n\tunsigned long used, available;\n\n\tused = ctx->lo & 0x3f;\n\n\tctx->buffer[used++] = 0x80;\n\n\tavailable = 64 - used;\n\n\tif (available < 8) {\n\t\tmemset(&ctx->buffer[used], 0, available);\n\t\tbody(ctx, ctx->buffer, 64);\n\t\tused = 0;\n\t\tavailable = 64;\n\t}\n\n\tmemset(&ctx->buffer[used], 0, available - 8);\n\n\tctx->lo <<= 3;\n\tOUT(&ctx->buffer[56], ctx->lo)\n\tOUT(&ctx->buffer[60], ctx->hi)\n\n\tbody(ctx, ctx->buffer, 64);\n\n\tOUT(&result[0], ctx->a)\n\tOUT(&result[4], ctx->b)\n\tOUT(&result[8], ctx->c)\n\tOUT(&result[12], ctx->d)\n\n\texplicit_bzero(ctx, sizeof(*ctx));\n}\n\n#endif\n"
  },
  {
    "path": "lib/alg-md4.h",
    "content": "/*\n * This is an OpenSSL-compatible implementation of the RSA Data Security, Inc.\n * MD4 Message-Digest Algorithm (RFC 1320).\n *\n * Homepage:\n * http://openwall.info/wiki/people/solar/software/public-domain-source-code/md4\n *\n * Author:\n * Alexander Peslyak, better known as Solar Designer <solar at openwall.com>\n *\n * This software was written by Alexander Peslyak in 2001.  No copyright is\n * claimed, and the software is hereby placed in the public domain.\n * In case this attempt to disclaim copyright and place the software in the\n * public domain is deemed null and void, then the software is\n * Copyright (c) 2001 Alexander Peslyak and it is hereby released to the\n * general public under the following terms:\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted.\n *\n * There's ABSOLUTELY NO WARRANTY, express or implied.\n *\n * See md4.c for more information.\n */\n\n#ifndef _CRYPT_ALG_MD4_H\n#define _CRYPT_ALG_MD4_H 1\n\n/* Any 32-bit or wider unsigned integer data type will do */\ntypedef uint32_t MD4_u32plus;\n\ntypedef struct {\n\tMD4_u32plus lo, hi;\n\tMD4_u32plus a, b, c, d;\n\tuint8_t buffer[64];\n\tMD4_u32plus block[16];\n} MD4_CTX;\n\nextern void MD4_Init(MD4_CTX *ctx);\nextern void MD4_Update(MD4_CTX *ctx, const void *data, size_t size);\nextern void MD4_Final(uint8_t result[16], MD4_CTX *ctx);\n\n#endif /* alg-md4.h */\n"
  },
  {
    "path": "lib/alg-md5.c",
    "content": "/*\n * This is an OpenSSL-compatible implementation of the RSA Data Security, Inc.\n * MD5 Message-Digest Algorithm (RFC 1321).\n *\n * Homepage:\n * http://openwall.info/wiki/people/solar/software/public-domain-source-code/md5\n *\n * Author:\n * Alexander Peslyak, better known as Solar Designer <solar at openwall.com>\n *\n * This software was written by Alexander Peslyak in 2001.  No copyright is\n * claimed, and the software is hereby placed in the public domain.\n * In case this attempt to disclaim copyright and place the software in the\n * public domain is deemed null and void, then the software is\n * Copyright (c) 2001 Alexander Peslyak and it is hereby released to the\n * general public under the following terms:\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted.\n *\n * There's ABSOLUTELY NO WARRANTY, express or implied.\n *\n * (This is a heavily cut-down \"BSD license\".)\n *\n * This differs from Colin Plumb's older public domain implementation in that\n * no exactly 32-bit integer data type is required (any 32-bit or wider\n * unsigned integer data type will do), there's no compile-time endianness\n * configuration, and the function prototypes match OpenSSL's.  No code from\n * Colin Plumb's implementation has been reused; this comment merely compares\n * the properties of the two independent implementations.\n *\n * The primary goals of this implementation are portability and ease of use.\n * It is meant to be fast, but not as fast as possible.  Some known\n * optimizations are not included to reduce source code size and avoid\n * compile-time configuration.\n */\n\n#include \"crypt-port.h\"\n\n#if INCLUDE_md5crypt || INCLUDE_sunmd5\n\n#include \"alg-md5.h\"\n\n/*\n * The basic MD5 functions.\n *\n * F and G are optimized compared to their RFC 1321 definitions for\n * architectures that lack an AND-NOT instruction, just like in Colin Plumb's\n * implementation.\n */\n#define F(x, y, z)\t\t\t((z) ^ ((x) & ((y) ^ (z))))\n#define G(x, y, z)\t\t\t((y) ^ ((z) & ((x) ^ (y))))\n#define H(x, y, z)\t\t\t(((x) ^ (y)) ^ (z))\n#define H2(x, y, z)\t\t\t((x) ^ ((y) ^ (z)))\n#define I(x, y, z)\t\t\t((y) ^ ((x) | ~(z)))\n\n/*\n * The MD5 transformation for all four rounds.\n */\n#define STEP(f, a, b, c, d, x, t, s) \\\n\t(a) += f((b), (c), (d)) + (x) + (t); \\\n\t(a) = (((a) << (s)) | (((a) & 0xffffffff) >> (32 - (s)))); \\\n\t(a) += (b);\n\n/*\n * SET reads 4 input bytes in little-endian byte order and stores them in a\n * properly aligned word in host byte order.\n *\n * The check for little-endian architectures that tolerate unaligned memory\n * accesses is just an optimization.  Nothing will break if it fails to detect\n * a suitable architecture.\n *\n * Unfortunately, this optimization may be a C strict aliasing rules violation\n * if the caller's data buffer has effective type that cannot be aliased by\n * MD5_u32plus.  In practice, this problem may occur if these MD5 routines are\n * inlined into a calling function, or with future and dangerously advanced\n * link-time optimizations.  For the time being, keeping these MD5 routines in\n * their own translation unit avoids the problem.\n */\n#if 0 /* defined(__i386__) || defined(__x86_64__) || defined(__vax__) */\n#define SET(n) \\\n\t(*(const MD5_u32plus *)&ptr[(n) * 4])\n#define GET(n) \\\n\tSET(n)\n#else\n#define SET(n) \\\n\t(ctx->block[(n)] = \\\n\t(MD5_u32plus)ptr[(n) * 4] | \\\n\t((MD5_u32plus)ptr[(n) * 4 + 1] << 8) | \\\n\t((MD5_u32plus)ptr[(n) * 4 + 2] << 16) | \\\n\t((MD5_u32plus)ptr[(n) * 4 + 3] << 24))\n#define GET(n) \\\n\t(ctx->block[(n)])\n#endif\n\n/*\n * This processes one or more 64-byte data blocks, but does NOT update the bit\n * counters.  There are no alignment requirements.\n */\nstatic const void *body(MD5_CTX *ctx, const void *data, unsigned long size)\n{\n\tconst unsigned char *ptr;\n\tMD5_u32plus a, b, c, d;\n\tMD5_u32plus saved_a, saved_b, saved_c, saved_d;\n\n\tptr = (const unsigned char *)data;\n\n\ta = ctx->a;\n\tb = ctx->b;\n\tc = ctx->c;\n\td = ctx->d;\n\n\tdo {\n\t\tsaved_a = a;\n\t\tsaved_b = b;\n\t\tsaved_c = c;\n\t\tsaved_d = d;\n\n/* Round 1 */\n\t\tSTEP(F, a, b, c, d, SET(0), 0xd76aa478, 7)\n\t\tSTEP(F, d, a, b, c, SET(1), 0xe8c7b756, 12)\n\t\tSTEP(F, c, d, a, b, SET(2), 0x242070db, 17)\n\t\tSTEP(F, b, c, d, a, SET(3), 0xc1bdceee, 22)\n\t\tSTEP(F, a, b, c, d, SET(4), 0xf57c0faf, 7)\n\t\tSTEP(F, d, a, b, c, SET(5), 0x4787c62a, 12)\n\t\tSTEP(F, c, d, a, b, SET(6), 0xa8304613, 17)\n\t\tSTEP(F, b, c, d, a, SET(7), 0xfd469501, 22)\n\t\tSTEP(F, a, b, c, d, SET(8), 0x698098d8, 7)\n\t\tSTEP(F, d, a, b, c, SET(9), 0x8b44f7af, 12)\n\t\tSTEP(F, c, d, a, b, SET(10), 0xffff5bb1, 17)\n\t\tSTEP(F, b, c, d, a, SET(11), 0x895cd7be, 22)\n\t\tSTEP(F, a, b, c, d, SET(12), 0x6b901122, 7)\n\t\tSTEP(F, d, a, b, c, SET(13), 0xfd987193, 12)\n\t\tSTEP(F, c, d, a, b, SET(14), 0xa679438e, 17)\n\t\tSTEP(F, b, c, d, a, SET(15), 0x49b40821, 22)\n\n/* Round 2 */\n\t\tSTEP(G, a, b, c, d, GET(1), 0xf61e2562, 5)\n\t\tSTEP(G, d, a, b, c, GET(6), 0xc040b340, 9)\n\t\tSTEP(G, c, d, a, b, GET(11), 0x265e5a51, 14)\n\t\tSTEP(G, b, c, d, a, GET(0), 0xe9b6c7aa, 20)\n\t\tSTEP(G, a, b, c, d, GET(5), 0xd62f105d, 5)\n\t\tSTEP(G, d, a, b, c, GET(10), 0x02441453, 9)\n\t\tSTEP(G, c, d, a, b, GET(15), 0xd8a1e681, 14)\n\t\tSTEP(G, b, c, d, a, GET(4), 0xe7d3fbc8, 20)\n\t\tSTEP(G, a, b, c, d, GET(9), 0x21e1cde6, 5)\n\t\tSTEP(G, d, a, b, c, GET(14), 0xc33707d6, 9)\n\t\tSTEP(G, c, d, a, b, GET(3), 0xf4d50d87, 14)\n\t\tSTEP(G, b, c, d, a, GET(8), 0x455a14ed, 20)\n\t\tSTEP(G, a, b, c, d, GET(13), 0xa9e3e905, 5)\n\t\tSTEP(G, d, a, b, c, GET(2), 0xfcefa3f8, 9)\n\t\tSTEP(G, c, d, a, b, GET(7), 0x676f02d9, 14)\n\t\tSTEP(G, b, c, d, a, GET(12), 0x8d2a4c8a, 20)\n\n/* Round 3 */\n\t\tSTEP(H, a, b, c, d, GET(5), 0xfffa3942, 4)\n\t\tSTEP(H2, d, a, b, c, GET(8), 0x8771f681, 11)\n\t\tSTEP(H, c, d, a, b, GET(11), 0x6d9d6122, 16)\n\t\tSTEP(H2, b, c, d, a, GET(14), 0xfde5380c, 23)\n\t\tSTEP(H, a, b, c, d, GET(1), 0xa4beea44, 4)\n\t\tSTEP(H2, d, a, b, c, GET(4), 0x4bdecfa9, 11)\n\t\tSTEP(H, c, d, a, b, GET(7), 0xf6bb4b60, 16)\n\t\tSTEP(H2, b, c, d, a, GET(10), 0xbebfbc70, 23)\n\t\tSTEP(H, a, b, c, d, GET(13), 0x289b7ec6, 4)\n\t\tSTEP(H2, d, a, b, c, GET(0), 0xeaa127fa, 11)\n\t\tSTEP(H, c, d, a, b, GET(3), 0xd4ef3085, 16)\n\t\tSTEP(H2, b, c, d, a, GET(6), 0x04881d05, 23)\n\t\tSTEP(H, a, b, c, d, GET(9), 0xd9d4d039, 4)\n\t\tSTEP(H2, d, a, b, c, GET(12), 0xe6db99e5, 11)\n\t\tSTEP(H, c, d, a, b, GET(15), 0x1fa27cf8, 16)\n\t\tSTEP(H2, b, c, d, a, GET(2), 0xc4ac5665, 23)\n\n/* Round 4 */\n\t\tSTEP(I, a, b, c, d, GET(0), 0xf4292244, 6)\n\t\tSTEP(I, d, a, b, c, GET(7), 0x432aff97, 10)\n\t\tSTEP(I, c, d, a, b, GET(14), 0xab9423a7, 15)\n\t\tSTEP(I, b, c, d, a, GET(5), 0xfc93a039, 21)\n\t\tSTEP(I, a, b, c, d, GET(12), 0x655b59c3, 6)\n\t\tSTEP(I, d, a, b, c, GET(3), 0x8f0ccc92, 10)\n\t\tSTEP(I, c, d, a, b, GET(10), 0xffeff47d, 15)\n\t\tSTEP(I, b, c, d, a, GET(1), 0x85845dd1, 21)\n\t\tSTEP(I, a, b, c, d, GET(8), 0x6fa87e4f, 6)\n\t\tSTEP(I, d, a, b, c, GET(15), 0xfe2ce6e0, 10)\n\t\tSTEP(I, c, d, a, b, GET(6), 0xa3014314, 15)\n\t\tSTEP(I, b, c, d, a, GET(13), 0x4e0811a1, 21)\n\t\tSTEP(I, a, b, c, d, GET(4), 0xf7537e82, 6)\n\t\tSTEP(I, d, a, b, c, GET(11), 0xbd3af235, 10)\n\t\tSTEP(I, c, d, a, b, GET(2), 0x2ad7d2bb, 15)\n\t\tSTEP(I, b, c, d, a, GET(9), 0xeb86d391, 21)\n\n\t\ta += saved_a;\n\t\tb += saved_b;\n\t\tc += saved_c;\n\t\td += saved_d;\n\n\t\tptr += 64;\n\t} while (size -= 64);\n\n\tctx->a = a;\n\tctx->b = b;\n\tctx->c = c;\n\tctx->d = d;\n\n\treturn ptr;\n}\n\nvoid MD5_Init(MD5_CTX *ctx)\n{\n\tctx->a = 0x67452301;\n\tctx->b = 0xefcdab89;\n\tctx->c = 0x98badcfe;\n\tctx->d = 0x10325476;\n\n\tctx->lo = 0;\n\tctx->hi = 0;\n}\n\nvoid MD5_Update(MD5_CTX *ctx, const void *data, size_t size)\n{\n\tMD5_u32plus saved_lo;\n\tunsigned long used, available;\n\n\tsaved_lo = ctx->lo;\n\tif ((ctx->lo = (saved_lo + size) & 0x1fffffff) < saved_lo)\n\t\tctx->hi++;\n\tctx->hi += (MD5_u32plus) size >> 29;\n\n\tused = saved_lo & 0x3f;\n\n\tif (used) {\n\t\tavailable = 64 - used;\n\n\t\tif (size < available) {\n\t\t\tmemcpy(&ctx->buffer[used], data, size);\n\t\t\treturn;\n\t\t}\n\n\t\tmemcpy(&ctx->buffer[used], data, available);\n\t\tdata = (const unsigned char *)data + available;\n\t\tsize -= available;\n\t\tbody(ctx, ctx->buffer, 64);\n\t}\n\n\tif (size >= 64) {\n\t\tdata = body(ctx, data, size & ~(unsigned long)0x3f);\n\t\tsize &= 0x3f;\n\t}\n\n\tmemcpy(ctx->buffer, data, size);\n}\n\n#define OUT(dst, src) \\\n\t(dst)[0] = (unsigned char)(src); \\\n\t(dst)[1] = (unsigned char)((src) >> 8); \\\n\t(dst)[2] = (unsigned char)((src) >> 16); \\\n\t(dst)[3] = (unsigned char)((src) >> 24);\n\nvoid MD5_Final(uint8_t result[16], MD5_CTX *ctx)\n{\n\tunsigned long used, available;\n\n\tused = ctx->lo & 0x3f;\n\n\tctx->buffer[used++] = 0x80;\n\n\tavailable = 64 - used;\n\n\tif (available < 8) {\n\t\tmemset(&ctx->buffer[used], 0, available);\n\t\tbody(ctx, ctx->buffer, 64);\n\t\tused = 0;\n\t\tavailable = 64;\n\t}\n\n\tmemset(&ctx->buffer[used], 0, available - 8);\n\n\tctx->lo <<= 3;\n\tOUT(&ctx->buffer[56], ctx->lo)\n\tOUT(&ctx->buffer[60], ctx->hi)\n\n\tbody(ctx, ctx->buffer, 64);\n\n\tOUT(&result[0], ctx->a)\n\tOUT(&result[4], ctx->b)\n\tOUT(&result[8], ctx->c)\n\tOUT(&result[12], ctx->d)\n\n\texplicit_bzero(ctx, sizeof(*ctx));\n}\n\n#endif\n"
  },
  {
    "path": "lib/alg-md5.h",
    "content": "/*\n * This is an OpenSSL-compatible implementation of the RSA Data Security, Inc.\n * MD5 Message-Digest Algorithm (RFC 1321).\n *\n * Homepage:\n * http://openwall.info/wiki/people/solar/software/public-domain-source-code/md5\n *\n * Author:\n * Alexander Peslyak, better known as Solar Designer <solar at openwall.com>\n *\n * This software was written by Alexander Peslyak in 2001.  No copyright is\n * claimed, and the software is hereby placed in the public domain.\n * In case this attempt to disclaim copyright and place the software in the\n * public domain is deemed null and void, then the software is\n * Copyright (c) 2001 Alexander Peslyak and it is hereby released to the\n * general public under the following terms:\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted.\n *\n * There's ABSOLUTELY NO WARRANTY, express or implied.\n *\n * See md5.c for more information.\n */\n\n#ifndef _CRYPT_ALG_MD5_H\n#define _CRYPT_ALG_MD5_H 1\n\n/* Any 32-bit or wider unsigned integer data type will do */\ntypedef uint32_t MD5_u32plus;\n\ntypedef struct {\n\tMD5_u32plus lo, hi;\n\tMD5_u32plus a, b, c, d;\n\tuint8_t buffer[64];\n\tMD5_u32plus block[16];\n} MD5_CTX;\n\nextern void MD5_Init(MD5_CTX *ctx);\nextern void MD5_Update(MD5_CTX *ctx, const void *data, size_t size);\nextern void MD5_Final(uint8_t result[16], MD5_CTX *ctx);\n\n#endif /* alg-md5.h */\n"
  },
  {
    "path": "lib/alg-sha1.c",
    "content": "/*\nSHA-1 in C\nBy Steve Reid <sreid@sea-to-sky.net>\n100% Public Domain\n\n-----------------\nModified 7/98\nBy James H. Brown <jbrown@burgoyne.com>\nStill 100% Public Domain\n\nCorrected a problem which generated improper hash values on 16 bit machines\nRoutine SHA1Update changed from\n  void SHA1Update(SHA1_CTX* context, unsigned char* data, unsigned int len)\nto\n  void SHA1Update(SHA1_CTX* context, unsigned char* data, unsigned long len)\n\nThe 'len' parameter was declared an int which works fine on 32 bit machines.\nHowever, on 16 bit machines an int is too small for the shifts being done\nagainst\nit.  This caused the hash function to generate incorrect values if len was\ngreater than 8191 (8K - 1) due to the 'len << 3' on line 3 of SHA1Update().\n\nSince the file IO in main() reads 16K at a time, any file 8K or larger would\nbe guaranteed to generate the wrong hash (e.g. Test Vector #3,\na million \"a\"s).\n\nI also changed the declaration of variables i & j in SHA1Update to\nunsigned long from unsigned int for the same reason.\n\nThese changes should make no difference to any 32 bit implementations since\nan int and a long are the same size in those environments.\n\n--\nI also corrected a few compiler warnings generated by Borland C.\n1. Added #include <process.h> for exit() prototype\n2. Removed unused variable 'j' in SHA1Final\n3. Changed exit(0) to return(0) at end of main.\n\nALL changes I made can be located by searching for comments containing 'JHB'\n-----------------\nModified 8/98\nBy Steve Reid <sreid@sea-to-sky.net>\nStill 100% public domain\n\n1- Removed #include <process.h> and used return() instead of exit()\n2- Fixed overwriting of finalcount in SHA1Final() (discovered by Chris Hall)\n3- Changed email address from steve@edmweb.com to sreid@sea-to-sky.net\n\n-----------------\nModified 4/01\nBy Saul Kravitz <Saul.Kravitz@celera.com>\nStill 100% PD\nModified to run on Compaq Alpha hardware.\n\n-----------------\nModified 07/2002\nBy Ralph Giles <giles@ghostscript.com>\nStill 100% public domain\nmodified for use with stdint types, autoconf\ncode cleanup, removed attribution comments\nswitched SHA1Final() argument order for consistency\nuse SHA1_ prefix for public api\nmove public api to sha1.h\n\n-----------------\nModified 10/2017\nBy Björn Esser <besser82@fedoraproject.org>\nStill 100% public domain\nmodified for use with libxcrypt\n\n-----------------\nModified 11/2025\nBy Björn Esser <besser82@fedoraproject.org>\nStill 100% public domain\nmodified sha1_process_bytes() to fix compilation with -O3 and GCC >= 11\n*/\n\n#include \"crypt-port.h\"\n#include \"alg-sha1.h\"\n\n#if INCLUDE_sha1crypt\n\n#define SHA1_DIGEST_SIZE 20\n\n#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))\n\n/* blk0() and blk() perform the initial expand. */\n/* I got the idea of expanding during the round function from SSLeay */\n/* FIXME: can we do this in an endian-proof way? */\n#if XCRYPT_USE_BIGENDIAN\n#define blk0(i) block.l[i]\n#else\n#define blk0(i) (block.l[i] = (rol(block.l[i],24)&0xFF00FF00) \\\n    |(rol(block.l[i],8)&0x00FF00FF))\n#endif\n#define blk(i) (block.l[i&15] = rol(block.l[(i+13)&15]^block.l[(i+8)&15] \\\n    ^block.l[(i+2)&15]^block.l[i&15],1))\n\n/* (R0+R1), R2, R3, R4 are the different operations used in SHA1 */\n#define R0(v,w,x,y,z,i) z+=((w&(x^y))^y)+blk0(i)+0x5A827999+rol(v,5);w=rol(w,30);\n#define R1(v,w,x,y,z,i) z+=((w&(x^y))^y)+blk(i)+0x5A827999+rol(v,5);w=rol(w,30);\n#define R2(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0x6ED9EBA1+rol(v,5);w=rol(w,30);\n#define R3(v,w,x,y,z,i) z+=(((w|x)&y)|(w&x))+blk(i)+0x8F1BBCDC+rol(v,5);w=rol(w,30);\n#define R4(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0xCA62C1D6+rol(v,5);w=rol(w,30);\n\n\n/* Hash a single 512-bit block. This is the core of the algorithm. */\nstatic void\nsha1_do_transform (uint32_t state[5], const uint8_t buffer[64])\n{\n  uint32_t a, b, c, d, e;\n  typedef union\n  {\n    uint8_t c[64];\n    uint32_t l[16];\n  } CHAR64LONG16;\n  CHAR64LONG16 block;\n\n  memcpy (&block, buffer, 64);\n\n  /* Copy context->state[] to working vars */\n  a = state[0];\n  b = state[1];\n  c = state[2];\n  d = state[3];\n  e = state[4];\n\n  /* 4 rounds of 20 operations each. Loop unrolled. */\n  R0(a,b,c,d,e, 0);\n  R0(e,a,b,c,d, 1);\n  R0(d,e,a,b,c, 2);\n  R0(c,d,e,a,b, 3);\n  R0(b,c,d,e,a, 4);\n  R0(a,b,c,d,e, 5);\n  R0(e,a,b,c,d, 6);\n  R0(d,e,a,b,c, 7);\n  R0(c,d,e,a,b, 8);\n  R0(b,c,d,e,a, 9);\n  R0(a,b,c,d,e,10);\n  R0(e,a,b,c,d,11);\n  R0(d,e,a,b,c,12);\n  R0(c,d,e,a,b,13);\n  R0(b,c,d,e,a,14);\n  R0(a,b,c,d,e,15);\n  R1(e,a,b,c,d,16);\n  R1(d,e,a,b,c,17);\n  R1(c,d,e,a,b,18);\n  R1(b,c,d,e,a,19);\n  R2(a,b,c,d,e,20);\n  R2(e,a,b,c,d,21);\n  R2(d,e,a,b,c,22);\n  R2(c,d,e,a,b,23);\n  R2(b,c,d,e,a,24);\n  R2(a,b,c,d,e,25);\n  R2(e,a,b,c,d,26);\n  R2(d,e,a,b,c,27);\n  R2(c,d,e,a,b,28);\n  R2(b,c,d,e,a,29);\n  R2(a,b,c,d,e,30);\n  R2(e,a,b,c,d,31);\n  R2(d,e,a,b,c,32);\n  R2(c,d,e,a,b,33);\n  R2(b,c,d,e,a,34);\n  R2(a,b,c,d,e,35);\n  R2(e,a,b,c,d,36);\n  R2(d,e,a,b,c,37);\n  R2(c,d,e,a,b,38);\n  R2(b,c,d,e,a,39);\n  R3(a,b,c,d,e,40);\n  R3(e,a,b,c,d,41);\n  R3(d,e,a,b,c,42);\n  R3(c,d,e,a,b,43);\n  R3(b,c,d,e,a,44);\n  R3(a,b,c,d,e,45);\n  R3(e,a,b,c,d,46);\n  R3(d,e,a,b,c,47);\n  R3(c,d,e,a,b,48);\n  R3(b,c,d,e,a,49);\n  R3(a,b,c,d,e,50);\n  R3(e,a,b,c,d,51);\n  R3(d,e,a,b,c,52);\n  R3(c,d,e,a,b,53);\n  R3(b,c,d,e,a,54);\n  R3(a,b,c,d,e,55);\n  R3(e,a,b,c,d,56);\n  R3(d,e,a,b,c,57);\n  R3(c,d,e,a,b,58);\n  R3(b,c,d,e,a,59);\n  R4(a,b,c,d,e,60);\n  R4(e,a,b,c,d,61);\n  R4(d,e,a,b,c,62);\n  R4(c,d,e,a,b,63);\n  R4(b,c,d,e,a,64);\n  R4(a,b,c,d,e,65);\n  R4(e,a,b,c,d,66);\n  R4(d,e,a,b,c,67);\n  R4(c,d,e,a,b,68);\n  R4(b,c,d,e,a,69);\n  R4(a,b,c,d,e,70);\n  R4(e,a,b,c,d,71);\n  R4(d,e,a,b,c,72);\n  R4(c,d,e,a,b,73);\n  R4(b,c,d,e,a,74);\n  R4(a,b,c,d,e,75);\n  R4(e,a,b,c,d,76);\n  R4(d,e,a,b,c,77);\n  R4(c,d,e,a,b,78);\n  R4(b,c,d,e,a,79);\n\n  /* Add the working vars back into context.state[] */\n  state[0] += a;\n  state[1] += b;\n  state[2] += c;\n  state[3] += d;\n  state[4] += e;\n\n  /* Wipe variables */\n  a = b = c = d = e = 0;\n}\n\n\n/* SHA1Init - Initialize new context */\nvoid\nsha1_init_ctx (struct sha1_ctx* ctx)\n{\n  /* SHA1 initialization constants */\n  ctx->state[0] = 0x67452301;\n  ctx->state[1] = 0xEFCDAB89;\n  ctx->state[2] = 0x98BADCFE;\n  ctx->state[3] = 0x10325476;\n  ctx->state[4] = 0xC3D2E1F0;\n  ctx->count[0] = ctx->count[1] = 0;\n}\n\n\n/* Run your data through this. */\nvoid\nsha1_process_bytes (const void *buffer, struct sha1_ctx *ctx, size_t size)\n{\n  const uint8_t *data = buffer;\n  size_t j = (ctx->count[0] >> 3) & 63;\n\n  if ((ctx->count[0] += (uint32_t)size << 3) < ((uint32_t)size << 3)) ctx->count[1]++;\n  ctx->count[1] += (uint32_t)(size >> 29);\n  if ((j + size) > 63)\n    {\n      const size_t i = 64 - j;\n      memcpy (&ctx->buffer[j], data, i);\n      sha1_do_transform (ctx->state, ctx->buffer);\n      j = 0;\n      size = size > i ? size - i : 0;\n      data += i;\n      while (size > 63)\n        {\n          sha1_do_transform (ctx->state, data);\n          size -= 64;\n          data += 64;\n        }\n    }\n  memcpy (&ctx->buffer[j], data, size);\n}\n\n\n/* Add padding and return the message digest. */\nvoid *\nsha1_finish_ctx (struct sha1_ctx *ctx, void *resbuf)\n{\n  uint32_t i;\n  uint8_t  finalcount[8];\n\n  for (i = 0; i < 8; i++)\n    {\n      finalcount[i] = (unsigned char)((ctx->count[(i >= 4 ? 0 : 1)]\n                                       >> ((3-(i & 3)) * 8) ) & 255);  /* Endian independent */\n    }\n  sha1_process_bytes ((const uint8_t *)\"\\200\", ctx, 1);\n  while ((ctx->count[0] & 504) != 448)\n    sha1_process_bytes ((const uint8_t *)\"\\0\", ctx, 1);\n  sha1_process_bytes (finalcount, ctx, 8);  /* Should cause a sha1_do_transform() */\n  for (i = 0; i < SHA1_DIGEST_SIZE; i++)\n    {\n      *((uint8_t *)resbuf + i) = (uint8_t)((ctx->state[i>>2]\n                                            >> ((3-(i & 3)) * 8) ) & 255);\n    }\n\n  /* Wipe variables */\n  i = 0;\n  explicit_bzero (ctx, sizeof (struct sha1_ctx));\n  explicit_bzero (finalcount, 8);  /* SWR */\n\n  return resbuf;\n}\n\n#endif\n"
  },
  {
    "path": "lib/alg-sha1.h",
    "content": "/*\n * This is an implementation of the National Institute of Standards\n * and Technology US Secure Hash Algorithm 1 (SHA1).\n *\n * Public api for steve reid's public domain SHA-1 implementation.\n * This file is in the public domain.\n */\n\n#ifndef _CRYPT_ALG_SHA1_H\n#define _CRYPT_ALG_SHA1_H 1\n\n/* Structure to save state of computation between the single steps.  */\nstruct sha1_ctx\n{\n  uint32_t state[5];\n  uint32_t count[2];\n  uint8_t  buffer[64];\n};\n\n/* Initialize structure containing state of computation.\n   (RFC 3174, 6.1)  */\nextern void sha1_init_ctx (struct sha1_ctx *ctx);\n\n/* Starting with the result of former calls of this function (or the\n   initialization function) update the context for the next LEN bytes\n   starting at BUFFER.  LEN does not need to be a multiple of 64.  */\nextern void sha1_process_bytes (const void *buffer, struct sha1_ctx *ctx, size_t size);\n\n/* Process the remaining bytes in the buffer and write the finalized\n   hash to RESBUF, which should point to 20 bytes of storage.  All\n   data written to CTX is erased before returning from the function.  */\nextern void *sha1_finish_ctx (struct sha1_ctx *ctx, void *resbuf);\n\n#endif\n"
  },
  {
    "path": "lib/alg-sha256.c",
    "content": "/*-\n * Copyright 2005-2016 Colin Percival\n * Copyright 2016-2018,2021 Alexander Peslyak\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\n#include \"crypt-port.h\"\n\n#if INCLUDE_gost_yescrypt || INCLUDE_yescrypt || INCLUDE_scrypt || \\\n    INCLUDE_sha256crypt || INCLUDE_sm3_yescrypt\n\n#include \"alg-sha256.h\"\n#include \"byteorder.h\"\n\n#ifdef __ICC\n/* Miscompile with icc 14.0.0 (at least), so don't use restrict there */\n#define restrict\n#elif __STDC_VERSION__ >= 199901L\n/* Have restrict */\n#elif defined(__GNUC__)\n#define restrict __restrict\n#else\n#define restrict\n#endif\n\n/* SHA256 round constants. */\nstatic const uint32_t Krnd[64] = {\n\t0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,\n\t0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,\n\t0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,\n\t0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,\n\t0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,\n\t0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\n\t0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,\n\t0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,\n\t0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,\n\t0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\n\t0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3,\n\t0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\n\t0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5,\n\t0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,\n\t0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,\n\t0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2\n};\n\n/* Elementary functions used by SHA256 */\n#define Ch(x, y, z)\t((x & (y ^ z)) ^ z)\n#if 1 /* Explicit caching/reuse of common subexpression between rounds */\n#define Maj(x, y, z)\t(y ^ ((x_xor_y = x ^ y) & y_xor_z))\n#else /* Let the compiler cache/reuse or not */\n#define Maj(x, y, z)\t(y ^ ((x ^ y) & (y ^ z)))\n#endif\n#define SHR(x, n)\t(x >> n)\n#define ROTR(x, n)\t((x >> n) | (x << (32 - n)))\n#define S0(x)\t\t(ROTR(x, 2) ^ ROTR(x, 13) ^ ROTR(x, 22))\n#define S1(x)\t\t(ROTR(x, 6) ^ ROTR(x, 11) ^ ROTR(x, 25))\n#define s0(x)\t\t(ROTR(x, 7) ^ ROTR(x, 18) ^ SHR(x, 3))\n#define s1(x)\t\t(ROTR(x, 17) ^ ROTR(x, 19) ^ SHR(x, 10))\n\n/* SHA256 round function */\n#define RND(a, b, c, d, e, f, g, h, k)\t\t\t\\\n\th += S1(e) + Ch(e, f, g) + k;\t\t\t\\\n\td += h;\t\t\t\t\t\t\\\n\th += S0(a) + Maj(a, b, c);\t\t\t\\\n\ty_xor_z = x_xor_y;\n\n/* Adjusted round function for rotating state */\n#define RNDr(S, W, i, ii)\t\t\t\\\n\tRND(S[(64 - i) % 8], S[(65 - i) % 8],\t\\\n\t    S[(66 - i) % 8], S[(67 - i) % 8],\t\\\n\t    S[(68 - i) % 8], S[(69 - i) % 8],\t\\\n\t    S[(70 - i) % 8], S[(71 - i) % 8],\t\\\n\t    W[i + ii] + Krnd[i + ii])\n\n/* Message schedule computation */\n#define MSCH(W, ii, i)\t\t\t\t\\\n\tW[i + ii + 16] = s1(W[i + ii + 14]) + W[i + ii + 9] + s0(W[i + ii + 1]) + W[i + ii]\n\n/*\n * SHA256 block compression function.  The 256-bit state is transformed via\n * the 512-bit input block to produce a new state.\n */\nstatic void\nSHA256_Transform(uint32_t state[static restrict 8],\n    const uint8_t block[static restrict 64],\n    uint32_t W[static restrict 64], uint32_t S[static restrict 8])\n{\n\tint i;\n\n\t/* 1. Prepare the first part of the message schedule W. */\n\tbe32dec_vect(W, block, 16);\n\n\t/* 2. Initialize working variables. */\n\tmemcpy(S, state, 32);\n\n\t/* 3. Mix. */\n\tfor (i = 0; i <= 48; i += 16) {\n\t\tuint32_t x_xor_y, y_xor_z = S[(65 - i) % 8] ^ S[(66 - i) % 8];\n\t\tRNDr(S, W, 0, i);\n\t\tRNDr(S, W, 1, i);\n\t\tRNDr(S, W, 2, i);\n\t\tRNDr(S, W, 3, i);\n\t\tRNDr(S, W, 4, i);\n\t\tRNDr(S, W, 5, i);\n\t\tRNDr(S, W, 6, i);\n\t\tRNDr(S, W, 7, i);\n\t\tRNDr(S, W, 8, i);\n\t\tRNDr(S, W, 9, i);\n\t\tRNDr(S, W, 10, i);\n\t\tRNDr(S, W, 11, i);\n\t\tRNDr(S, W, 12, i);\n\t\tRNDr(S, W, 13, i);\n\t\tRNDr(S, W, 14, i);\n\t\tRNDr(S, W, 15, i);\n\n\t\tif (i == 48)\n\t\t\tbreak;\n\n\t\tMSCH(W, 0, i);\n\t\tMSCH(W, 1, i);\n\t\tMSCH(W, 2, i);\n\t\tMSCH(W, 3, i);\n\t\tMSCH(W, 4, i);\n\t\tMSCH(W, 5, i);\n\t\tMSCH(W, 6, i);\n\t\tMSCH(W, 7, i);\n\t\tMSCH(W, 8, i);\n\t\tMSCH(W, 9, i);\n\t\tMSCH(W, 10, i);\n\t\tMSCH(W, 11, i);\n\t\tMSCH(W, 12, i);\n\t\tMSCH(W, 13, i);\n\t\tMSCH(W, 14, i);\n\t\tMSCH(W, 15, i);\n\t}\n\n\t/* 4. Mix local working variables into global state. */\n\tstate[0] += S[0];\n\tstate[1] += S[1];\n\tstate[2] += S[2];\n\tstate[3] += S[3];\n\tstate[4] += S[4];\n\tstate[5] += S[5];\n\tstate[6] += S[6];\n\tstate[7] += S[7];\n}\n\nstatic const uint8_t PAD[64] = {\n\t0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n\t0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n\t0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n\t0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0\n};\n\n/* Add padding and terminating bit-count. */\nstatic void\nSHA256_Pad(SHA256_CTX * ctx, uint32_t tmp32[static restrict 72])\n{\n\tsize_t r;\n\n\t/* Figure out how many bytes we have buffered. */\n\tr = (ctx->count >> 3) & 0x3f;\n\n\t/* Pad to 56 mod 64, transforming if we finish a block en route. */\n\tif (r < 56) {\n\t\t/* Pad to 56 mod 64. */\n\t\tmemcpy(&ctx->buf[r], PAD, 56 - r);\n\t} else {\n\t\t/* Finish the current block and mix. */\n\t\tmemcpy(&ctx->buf[r], PAD, 64 - r);\n\t\tSHA256_Transform(ctx->state, ctx->buf, &tmp32[0], &tmp32[64]);\n\n\t\t/* The start of the final block is all zeroes. */\n\t\tmemset(&ctx->buf[0], 0, 56);\n\t}\n\n\t/* Add the terminating bit-count. */\n\tbe64enc(&ctx->buf[56], ctx->count);\n\n\t/* Mix in the final block. */\n\tSHA256_Transform(ctx->state, ctx->buf, &tmp32[0], &tmp32[64]);\n}\n\n/* Magic initialization constants. */\nstatic const uint32_t initial_state[8] = {\n\t0x6A09E667, 0xBB67AE85, 0x3C6EF372, 0xA54FF53A,\n\t0x510E527F, 0x9B05688C, 0x1F83D9AB, 0x5BE0CD19\n};\n\n/**\n * SHA256_Init(ctx):\n * Initialize the SHA256 context ${ctx}.\n */\nvoid\nSHA256_Init(SHA256_CTX * ctx)\n{\n\n\t/* Zero bits processed so far. */\n\tctx->count = 0;\n\n\t/* Initialize state. */\n\tmemcpy(ctx->state, initial_state, sizeof(initial_state));\n}\n\n/**\n * SHA256_Update(ctx, in, len):\n * Input ${len} bytes from ${in} into the SHA256 context ${ctx}.\n */\nstatic void\n_SHA256_Update(SHA256_CTX * ctx, const void * in, size_t len,\n    uint32_t tmp32[static restrict 72])\n{\n\tuint32_t r;\n\tconst uint8_t * src = in;\n\n\t/* Return immediately if we have nothing to do. */\n\tif (len == 0)\n\t\treturn;\n\n\t/* Number of bytes left in the buffer from previous updates. */\n\tr = (ctx->count >> 3) & 0x3f;\n\n\t/* Update number of bits. */\n\tctx->count += (uint64_t)(len) << 3;\n\n\t/* Handle the case where we don't need to perform any transforms. */\n\tif (len < 64 - r) {\n\t\tmemcpy(&ctx->buf[r], src, len);\n\t\treturn;\n\t}\n\n\t/* Finish the current block. */\n\tmemcpy(&ctx->buf[r], src, 64 - r);\n\tSHA256_Transform(ctx->state, ctx->buf, &tmp32[0], &tmp32[64]);\n\tsrc += 64 - r;\n\tlen -= 64 - r;\n\n\t/* Perform complete blocks. */\n\twhile (len >= 64) {\n\t\tSHA256_Transform(ctx->state, src, &tmp32[0], &tmp32[64]);\n\t\tsrc += 64;\n\t\tlen -= 64;\n\t}\n\n\t/* Copy left over data into buffer. */\n\tmemcpy(ctx->buf, src, len);\n}\n\n/* Wrapper function for intermediate-values sanitization. */\nvoid\nSHA256_Update(SHA256_CTX * ctx, const void * in, size_t len)\n{\n\tuint32_t tmp32[72];\n\n\t/* Call the real function. */\n\t_SHA256_Update(ctx, in, len, tmp32);\n\n\t/* Clean the stack. */\n\texplicit_bzero(tmp32, 288);\n}\n\n/**\n * SHA256_Final(digest, ctx):\n * Output the SHA256 hash of the data input to the context ${ctx} into the\n * buffer ${digest}.\n */\nstatic void\n_SHA256_Final(uint8_t digest[32], SHA256_CTX * ctx,\n    uint32_t tmp32[static restrict 72])\n{\n\n\t/* Add padding. */\n\tSHA256_Pad(ctx, tmp32);\n\n\t/* Write the hash. */\n\tbe32enc_vect(digest, ctx->state, 8);\n}\n\n/* Wrapper function for intermediate-values sanitization. */\nvoid\nSHA256_Final(uint8_t digest[32], SHA256_CTX * ctx)\n{\n\tuint32_t tmp32[72];\n\n\t/* Call the real function. */\n\t_SHA256_Final(digest, ctx, tmp32);\n\n\t/* Clear the context state. */\n\texplicit_bzero(ctx, sizeof(SHA256_CTX));\n\n\t/* Clean the stack. */\n\texplicit_bzero(tmp32, 288);\n}\n\n/**\n * SHA256_Buf(in, len, digest):\n * Compute the SHA256 hash of ${len} bytes from ${in} and write it to ${digest}.\n */\nvoid\nSHA256_Buf(const void * in, size_t len, uint8_t digest[32])\n{\n\tSHA256_CTX ctx;\n\tuint32_t tmp32[72];\n\n\tSHA256_Init(&ctx);\n\t_SHA256_Update(&ctx, in, len, tmp32);\n\t_SHA256_Final(digest, &ctx, tmp32);\n\n\t/* Clean the stack. */\n\texplicit_bzero(&ctx, sizeof(SHA256_CTX));\n\texplicit_bzero(tmp32, 288);\n}\n\n#endif /* INCLUDE_gost_yescrypt || INCLUDE_yescrypt || INCLUDE_scrypt ||\n          INCLUDE_sha256crypt || INCLUDE_sm3_yescrypt */\n\n#if INCLUDE_gost_yescrypt || INCLUDE_yescrypt || INCLUDE_scrypt || \\\n    INCLUDE_sm3_yescrypt\n\n/**\n * HMAC_SHA256_Init(ctx, K, Klen):\n * Initialize the HMAC-SHA256 context ${ctx} with ${Klen} bytes of key from\n * ${K}.\n */\nstatic void\n_HMAC_SHA256_Init(HMAC_SHA256_CTX * ctx, const void * _K, size_t Klen,\n    uint32_t tmp32[static restrict 72], uint8_t pad[static restrict 64],\n    uint8_t khash[static restrict 32])\n{\n\tconst uint8_t * K = _K;\n\tsize_t i;\n\n\t/* If Klen > 64, the key is really SHA256(K). */\n\tif (Klen > 64) {\n\t\tSHA256_Init(&ctx->ictx);\n\t\t_SHA256_Update(&ctx->ictx, K, Klen, tmp32);\n\t\t_SHA256_Final(khash, &ctx->ictx, tmp32);\n\t\tK = khash;\n\t\tKlen = 32;\n\t}\n\n\t/* Inner SHA256 operation is SHA256(K xor [block of 0x36] || data). */\n\tSHA256_Init(&ctx->ictx);\n\tmemset(pad, 0x36, 64);\n\tfor (i = 0; i < Klen; i++)\n\t\tpad[i] ^= K[i];\n\t_SHA256_Update(&ctx->ictx, pad, 64, tmp32);\n\n\t/* Outer SHA256 operation is SHA256(K xor [block of 0x5c] || hash). */\n\tSHA256_Init(&ctx->octx);\n\tmemset(pad, 0x5c, 64);\n\tfor (i = 0; i < Klen; i++)\n\t\tpad[i] ^= K[i];\n\t_SHA256_Update(&ctx->octx, pad, 64, tmp32);\n}\n\n/* Wrapper function for intermediate-values sanitization. */\nvoid\nHMAC_SHA256_Init(HMAC_SHA256_CTX * ctx, const void * _K, size_t Klen)\n{\n\tuint32_t tmp32[72];\n\tuint8_t pad[64];\n\tuint8_t khash[32];\n\n\t/* Call the real function. */\n\t_HMAC_SHA256_Init(ctx, _K, Klen, tmp32, pad, khash);\n\n\t/* Clean the stack. */\n\texplicit_bzero(tmp32, 288);\n\texplicit_bzero(khash, 32);\n\texplicit_bzero(pad, 64);\n}\n\n/**\n * HMAC_SHA256_Update(ctx, in, len):\n * Input ${len} bytes from ${in} into the HMAC-SHA256 context ${ctx}.\n */\nstatic void\n_HMAC_SHA256_Update(HMAC_SHA256_CTX * ctx, const void * in, size_t len,\n    uint32_t tmp32[static restrict 72])\n{\n\n\t/* Feed data to the inner SHA256 operation. */\n\t_SHA256_Update(&ctx->ictx, in, len, tmp32);\n}\n\n/* Wrapper function for intermediate-values sanitization. */\nvoid\nHMAC_SHA256_Update(HMAC_SHA256_CTX * ctx, const void * in, size_t len)\n{\n\tuint32_t tmp32[72];\n\n\t/* Call the real function. */\n\t_HMAC_SHA256_Update(ctx, in, len, tmp32);\n\n\t/* Clean the stack. */\n\texplicit_bzero(tmp32, 288);\n}\n\n/**\n * HMAC_SHA256_Final(digest, ctx):\n * Output the HMAC-SHA256 of the data input to the context ${ctx} into the\n * buffer ${digest}.\n */\nstatic void\n_HMAC_SHA256_Final(uint8_t digest[32], HMAC_SHA256_CTX * ctx,\n    uint32_t tmp32[static restrict 72], uint8_t ihash[static restrict 32])\n{\n\n\t/* Finish the inner SHA256 operation. */\n\t_SHA256_Final(ihash, &ctx->ictx, tmp32);\n\n\t/* Feed the inner hash to the outer SHA256 operation. */\n\t_SHA256_Update(&ctx->octx, ihash, 32, tmp32);\n\n\t/* Finish the outer SHA256 operation. */\n\t_SHA256_Final(digest, &ctx->octx, tmp32);\n}\n\n/* Wrapper function for intermediate-values sanitization. */\nvoid\nHMAC_SHA256_Final(uint8_t digest[32], HMAC_SHA256_CTX * ctx)\n{\n\tuint32_t tmp32[72];\n\tuint8_t ihash[32];\n\n\t/* Call the real function. */\n\t_HMAC_SHA256_Final(digest, ctx, tmp32, ihash);\n\n\t/* Clear the context state. */\n\texplicit_bzero(ctx, sizeof(HMAC_SHA256_CTX));\n\n\t/* Clean the stack. */\n\texplicit_bzero(tmp32, 288);\n\texplicit_bzero(ihash, 32);\n}\n\n/**\n * HMAC_SHA256_Buf(K, Klen, in, len, digest):\n * Compute the HMAC-SHA256 of ${len} bytes from ${in} using the key ${K} of\n * length ${Klen}, and write the result to ${digest}.\n */\nvoid\nHMAC_SHA256_Buf(const void * K, size_t Klen, const void * in, size_t len,\n    uint8_t digest[32])\n{\n\tHMAC_SHA256_CTX ctx;\n\tuint32_t tmp32[72];\n\tuint8_t tmp8[96];\n\n\t_HMAC_SHA256_Init(&ctx, K, Klen, tmp32, &tmp8[0], &tmp8[64]);\n\t_HMAC_SHA256_Update(&ctx, in, len, tmp32);\n\t_HMAC_SHA256_Final(digest, &ctx, tmp32, &tmp8[0]);\n\n\t/* Clean the stack. */\n\texplicit_bzero(&ctx, sizeof(HMAC_SHA256_CTX));\n\texplicit_bzero(tmp32, 288);\n\texplicit_bzero(tmp8, 96);\n}\n\n/* Add padding and terminating bit-count, but don't invoke Transform yet. */\nstatic int\nSHA256_Pad_Almost(SHA256_CTX * ctx, uint8_t len[static restrict 8],\n    uint32_t tmp32[static restrict 72])\n{\n\tuint32_t r;\n\n\tr = (ctx->count >> 3) & 0x3f;\n\tif (r >= 56)\n\t\treturn -1;\n\n\t/*\n\t * Convert length to a vector of bytes -- we do this now rather\n\t * than later because the length will change after we pad.\n\t */\n\tbe64enc(len, ctx->count);\n\n\t/* Add 1--56 bytes so that the resulting length is 56 mod 64. */\n\t_SHA256_Update(ctx, PAD, 56 - r, tmp32);\n\n\t/* Add the terminating bit-count. */\n\tctx->buf[63] = len[7];\n\t_SHA256_Update(ctx, len, 7, tmp32);\n\n\treturn 0;\n}\n\n/**\n * PBKDF2_SHA256(passwd, passwdlen, salt, saltlen, c, buf, dkLen):\n * Compute PBKDF2(passwd, salt, c, dkLen) using HMAC-SHA256 as the PRF, and\n * write the output to buf.  The value dkLen must be at most 32 * (2^32 - 1).\n */\nvoid\nPBKDF2_SHA256(const uint8_t * passwd, size_t passwdlen, const uint8_t * salt,\n    size_t saltlen, uint64_t c, uint8_t * buf, size_t dkLen)\n{\n\tHMAC_SHA256_CTX Phctx, PShctx, hctx;\n\tuint32_t tmp32[72];\n\tunion {\n\t\tuint8_t tmp8[96];\n\t\tuint32_t state[8];\n\t} u;\n\tsize_t i;\n\tuint8_t ivec[4];\n\tuint8_t U[32];\n\tuint8_t T[32];\n\tuint64_t j;\n\tint k;\n\tsize_t clen;\n\n\t/* Sanity-check. */\n\tassert(dkLen <= 32 * (size_t)(UINT32_MAX));\n\n\tif (c == 1 && (dkLen & 31) == 0 && (saltlen & 63) <= 51) {\n\t\tuint32_t oldcount;\n\t\tuint8_t * ivecp;\n\n\t\t/* Compute HMAC state after processing P and S. */\n\t\t_HMAC_SHA256_Init(&hctx, passwd, passwdlen,\n\t\t    tmp32, &u.tmp8[0], &u.tmp8[64]);\n\t\t_HMAC_SHA256_Update(&hctx, salt, saltlen, tmp32);\n\n\t\t/* Prepare ictx padding. */\n\t\toldcount = hctx.ictx.count & (0x3f << 3);\n\t\t_HMAC_SHA256_Update(&hctx, \"\\0\\0\\0\", 4, tmp32);\n\t\tif ((hctx.ictx.count & (0x3f << 3)) < oldcount ||\n\t\t    SHA256_Pad_Almost(&hctx.ictx, u.tmp8, tmp32))\n\t\t\tgoto generic; /* Can't happen due to saltlen check */\n\t\tivecp = hctx.ictx.buf + (oldcount >> 3);\n\n\t\t/* Prepare octx padding. */\n\t\thctx.octx.count += 32 << 3;\n\t\tSHA256_Pad_Almost(&hctx.octx, u.tmp8, tmp32);\n\n\t\t/* Iterate through the blocks. */\n\t\tfor (i = 0; i * 32 < dkLen; i++) {\n\t\t\t/* Generate INT(i + 1). */\n\t\t\tbe32enc(ivecp, (uint32_t)(i + 1));\n\n\t\t\t/* Compute U_1 = PRF(P, S || INT(i)). */\n\t\t\tmemcpy(u.state, hctx.ictx.state, sizeof(u.state));\n\t\t\tSHA256_Transform(u.state, hctx.ictx.buf,\n\t\t\t    &tmp32[0], &tmp32[64]);\n\t\t\tbe32enc_vect(hctx.octx.buf, u.state, 8);\n\t\t\tmemcpy(u.state, hctx.octx.state, sizeof(u.state));\n\t\t\tSHA256_Transform(u.state, hctx.octx.buf,\n\t\t\t    &tmp32[0], &tmp32[64]);\n\t\t\tbe32enc_vect(&buf[i * 32], u.state, 8);\n\t\t}\n\n\t\tgoto cleanup;\n\t}\n\ngeneric:\n\t/* Compute HMAC state after processing P. */\n\t_HMAC_SHA256_Init(&Phctx, passwd, passwdlen,\n\t    tmp32, &u.tmp8[0], &u.tmp8[64]);\n\n\t/* Compute HMAC state after processing P and S. */\n\tmemcpy(&PShctx, &Phctx, sizeof(HMAC_SHA256_CTX));\n\t_HMAC_SHA256_Update(&PShctx, salt, saltlen, tmp32);\n\n\t/* Iterate through the blocks. */\n\tfor (i = 0; i * 32 < dkLen; i++) {\n\t\t/* Generate INT(i + 1). */\n\t\tbe32enc(ivec, (uint32_t)(i + 1));\n\n\t\t/* Compute U_1 = PRF(P, S || INT(i)). */\n\t\tmemcpy(&hctx, &PShctx, sizeof(HMAC_SHA256_CTX));\n\t\t_HMAC_SHA256_Update(&hctx, ivec, 4, tmp32);\n\t\t_HMAC_SHA256_Final(T, &hctx, tmp32, u.tmp8);\n\n\t\tif (c > 1) {\n\t\t\t/* T_i = U_1 ... */\n\t\t\tmemcpy(U, T, 32);\n\n\t\t\tfor (j = 2; j <= c; j++) {\n\t\t\t\t/* Compute U_j. */\n\t\t\t\tmemcpy(&hctx, &Phctx, sizeof(HMAC_SHA256_CTX));\n\t\t\t\t_HMAC_SHA256_Update(&hctx, U, 32, tmp32);\n\t\t\t\t_HMAC_SHA256_Final(U, &hctx, tmp32, u.tmp8);\n\n\t\t\t\t/* ... xor U_j ... */\n\t\t\t\tfor (k = 0; k < 32; k++)\n\t\t\t\t\tT[k] ^= U[k];\n\t\t\t}\n\t\t}\n\n\t\t/* Copy as many bytes as necessary into buf. */\n\t\tclen = dkLen - i * 32;\n\t\tif (clen > 32)\n\t\t\tclen = 32;\n\t\tmemcpy(&buf[i * 32], T, clen);\n\t}\n\n\t/* Clean the stack. */\n\texplicit_bzero(&Phctx, sizeof(HMAC_SHA256_CTX));\n\texplicit_bzero(&PShctx, sizeof(HMAC_SHA256_CTX));\n\texplicit_bzero(U, 32);\n\texplicit_bzero(T, 32);\n\ncleanup:\n\texplicit_bzero(&hctx, sizeof(HMAC_SHA256_CTX));\n\texplicit_bzero(tmp32, 288);\n\texplicit_bzero(&u, sizeof(u));\n}\n\n#endif /* INCLUDE_gost_yescrypt || INCLUDE_yescrypt || INCLUDE_scrypt ||\n          INCLUDE_sm3_yescrypt */\n"
  },
  {
    "path": "lib/alg-sha256.h",
    "content": "/*-\n * Copyright 2005-2016 Colin Percival\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\n#ifndef _SHA256_H_\n#define _SHA256_H_\n\n#include \"crypt-port.h\"\n\n#include <stddef.h>\n#include <stdint.h>\n\n/*\n * Use #defines in order to avoid namespace collisions with anyone else's\n * SHA256 code (e.g., the code in OpenSSL).\n */\n#define SHA256_Init libcperciva_SHA256_Init\n#define SHA256_Update libcperciva_SHA256_Update\n#define SHA256_Final libcperciva_SHA256_Final\n#define SHA256_Buf libcperciva_SHA256_Buf\n#define SHA256_CTX libcperciva_SHA256_CTX\n#define HMAC_SHA256_Init libcperciva_HMAC_SHA256_Init\n#define HMAC_SHA256_Update libcperciva_HMAC_SHA256_Update\n#define HMAC_SHA256_Final libcperciva_HMAC_SHA256_Final\n#define HMAC_SHA256_Buf libcperciva_HMAC_SHA256_Buf\n#define HMAC_SHA256_CTX libcperciva_HMAC_SHA256_CTX\n\n/* Context structure for SHA256 operations. */\ntypedef struct {\n\tuint32_t state[8];\n\tuint64_t count;\n\tuint8_t buf[64];\n} SHA256_CTX;\n\n/**\n * SHA256_Init(ctx):\n * Initialize the SHA256 context ${ctx}.\n */\nextern void SHA256_Init(SHA256_CTX *);\n\n/**\n * SHA256_Update(ctx, in, len):\n * Input ${len} bytes from ${in} into the SHA256 context ${ctx}.\n */\nextern void SHA256_Update(SHA256_CTX *, const void *, size_t);\n\n/**\n * SHA256_Final(digest, ctx):\n * Output the SHA256 hash of the data input to the context ${ctx} into the\n * buffer ${digest}.\n */\nextern void SHA256_Final(uint8_t[32], SHA256_CTX *);\n\n/**\n * SHA256_Buf(in, len, digest):\n * Compute the SHA256 hash of ${len} bytes from ${in} and write it to ${digest}.\n */\nextern void SHA256_Buf(const void *, size_t, uint8_t[32]);\n\n/* Context structure for HMAC-SHA256 operations. */\ntypedef struct {\n\tSHA256_CTX ictx;\n\tSHA256_CTX octx;\n} HMAC_SHA256_CTX;\n\n/**\n * HMAC_SHA256_Init(ctx, K, Klen):\n * Initialize the HMAC-SHA256 context ${ctx} with ${Klen} bytes of key from\n * ${K}.\n */\nextern void HMAC_SHA256_Init(HMAC_SHA256_CTX *, const void *, size_t);\n\n/**\n * HMAC_SHA256_Update(ctx, in, len):\n * Input ${len} bytes from ${in} into the HMAC-SHA256 context ${ctx}.\n */\nextern void HMAC_SHA256_Update(HMAC_SHA256_CTX *, const void *, size_t);\n\n/**\n * HMAC_SHA256_Final(digest, ctx):\n * Output the HMAC-SHA256 of the data input to the context ${ctx} into the\n * buffer ${digest}.\n */\nextern void HMAC_SHA256_Final(uint8_t[32], HMAC_SHA256_CTX *);\n\n/**\n * HMAC_SHA256_Buf(K, Klen, in, len, digest):\n * Compute the HMAC-SHA256 of ${len} bytes from ${in} using the key ${K} of\n * length ${Klen}, and write the result to ${digest}.\n */\nextern void HMAC_SHA256_Buf(const void *, size_t, const void *, size_t, uint8_t[32]);\n\n/**\n * PBKDF2_SHA256(passwd, passwdlen, salt, saltlen, c, buf, dkLen):\n * Compute PBKDF2(passwd, salt, c, dkLen) using HMAC-SHA256 as the PRF, and\n * write the output to buf.  The value dkLen must be at most 32 * (2^32 - 1).\n */\nextern void PBKDF2_SHA256(const uint8_t *, size_t, const uint8_t *, size_t,\n    uint64_t, uint8_t *, size_t);\n\n#endif /* !_SHA256_H_ */\n"
  },
  {
    "path": "lib/alg-sha512.c",
    "content": "/*-\n * Copyright 2005 Colin Percival\n * Copyright (c) 2015 Allan Jude <allanjude@FreeBSD.org>\n * Copyright 2021, 2022 Alexander Peslyak\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\n#include \"crypt-port.h\"\n\n#if INCLUDE_sha512crypt\n\n#include \"alg-sha512.h\"\n#include \"byteorder.h\"\n\n/* SHA512 round constants. */\nstatic const uint64_t K[80] = {\n\t0x428a2f98d728ae22ULL, 0x7137449123ef65cdULL,\n\t0xb5c0fbcfec4d3b2fULL, 0xe9b5dba58189dbbcULL,\n\t0x3956c25bf348b538ULL, 0x59f111f1b605d019ULL,\n\t0x923f82a4af194f9bULL, 0xab1c5ed5da6d8118ULL,\n\t0xd807aa98a3030242ULL, 0x12835b0145706fbeULL,\n\t0x243185be4ee4b28cULL, 0x550c7dc3d5ffb4e2ULL,\n\t0x72be5d74f27b896fULL, 0x80deb1fe3b1696b1ULL,\n\t0x9bdc06a725c71235ULL, 0xc19bf174cf692694ULL,\n\t0xe49b69c19ef14ad2ULL, 0xefbe4786384f25e3ULL,\n\t0x0fc19dc68b8cd5b5ULL, 0x240ca1cc77ac9c65ULL,\n\t0x2de92c6f592b0275ULL, 0x4a7484aa6ea6e483ULL,\n\t0x5cb0a9dcbd41fbd4ULL, 0x76f988da831153b5ULL,\n\t0x983e5152ee66dfabULL, 0xa831c66d2db43210ULL,\n\t0xb00327c898fb213fULL, 0xbf597fc7beef0ee4ULL,\n\t0xc6e00bf33da88fc2ULL, 0xd5a79147930aa725ULL,\n\t0x06ca6351e003826fULL, 0x142929670a0e6e70ULL,\n\t0x27b70a8546d22ffcULL, 0x2e1b21385c26c926ULL,\n\t0x4d2c6dfc5ac42aedULL, 0x53380d139d95b3dfULL,\n\t0x650a73548baf63deULL, 0x766a0abb3c77b2a8ULL,\n\t0x81c2c92e47edaee6ULL, 0x92722c851482353bULL,\n\t0xa2bfe8a14cf10364ULL, 0xa81a664bbc423001ULL,\n\t0xc24b8b70d0f89791ULL, 0xc76c51a30654be30ULL,\n\t0xd192e819d6ef5218ULL, 0xd69906245565a910ULL,\n\t0xf40e35855771202aULL, 0x106aa07032bbd1b8ULL,\n\t0x19a4c116b8d2d0c8ULL, 0x1e376c085141ab53ULL,\n\t0x2748774cdf8eeb99ULL, 0x34b0bcb5e19b48a8ULL,\n\t0x391c0cb3c5c95a63ULL, 0x4ed8aa4ae3418acbULL,\n\t0x5b9cca4f7763e373ULL, 0x682e6ff3d6b2b8a3ULL,\n\t0x748f82ee5defb2fcULL, 0x78a5636f43172f60ULL,\n\t0x84c87814a1f0ab72ULL, 0x8cc702081a6439ecULL,\n\t0x90befffa23631e28ULL, 0xa4506cebde82bde9ULL,\n\t0xbef9a3f7b2c67915ULL, 0xc67178f2e372532bULL,\n\t0xca273eceea26619cULL, 0xd186b8c721c0c207ULL,\n\t0xeada7dd6cde0eb1eULL, 0xf57d4f7fee6ed178ULL,\n\t0x06f067aa72176fbaULL, 0x0a637dc5a2c898a6ULL,\n\t0x113f9804bef90daeULL, 0x1b710b35131c471bULL,\n\t0x28db77f523047d84ULL, 0x32caab7b40c72493ULL,\n\t0x3c9ebe0a15c9bebcULL, 0x431d67c49c100d4cULL,\n\t0x4cc5d4becb3e42b6ULL, 0x597f299cfc657e2aULL,\n\t0x5fcb6fab3ad6faecULL, 0x6c44198c4a475817ULL\n};\n\n/* Elementary functions used by SHA512 */\n#define Ch(x, y, z)\t((x & (y ^ z)) ^ z)\n#if 1 /* Explicit caching/reuse of common subexpression between rounds */\n#define Maj(x, y, z)\t(y ^ ((x_xor_y = x ^ y) & y_xor_z))\n#else /* Let the compiler cache/reuse or not */\n#define Maj(x, y, z)\t(y ^ ((x ^ y) & (y ^ z)))\n#endif\n#define SHR(x, n)\t(x >> n)\n#define ROTR(x, n)\t((x >> n) | (x << (64 - n)))\n#define S0(x)\t\t(ROTR(x, 28) ^ ROTR(x, 34) ^ ROTR(x, 39))\n#define S1(x)\t\t(ROTR(x, 14) ^ ROTR(x, 18) ^ ROTR(x, 41))\n#define s0(x)\t\t(ROTR(x, 1) ^ ROTR(x, 8) ^ SHR(x, 7))\n#define s1(x)\t\t(ROTR(x, 19) ^ ROTR(x, 61) ^ SHR(x, 6))\n\n/* SHA512 round function */\n#define RND(a, b, c, d, e, f, g, h, k)\t\t\t\\\n\th += S1(e) + Ch(e, f, g) + k;\t\t\t\\\n\td += h;\t\t\t\t\t\t\\\n\th += S0(a) + Maj(a, b, c);\t\t\t\\\n\ty_xor_z = x_xor_y;\n\n/* Adjusted round function for rotating state */\n#define RNDr(S, W, i, ii)\t\t\t\\\n\tRND(S[(80 - i) % 8], S[(81 - i) % 8],\t\\\n\t    S[(82 - i) % 8], S[(83 - i) % 8],\t\\\n\t    S[(84 - i) % 8], S[(85 - i) % 8],\t\\\n\t    S[(86 - i) % 8], S[(87 - i) % 8],\t\\\n\t    W[i + ii] + K[i + ii])\n\n/* Message schedule computation */\n#define MSCH(W, ii, i)\t\t\t\t\\\n\tW[i + ii + 16] = s1(W[i + ii + 14]) + W[i + ii + 9] + s0(W[i + ii + 1]) + W[i + ii]\n\n/*\n * SHA512 block compression function.  The 512-bit state is transformed via\n * the 512-bit input block to produce a new state.\n */\nstatic void\nSHA512_Transform(uint64_t * state, const unsigned char block[SHA512_BLOCK_LENGTH])\n{\n\tuint64_t W[80];\n\tuint64_t S[8];\n\tint i;\n\n\t/* 1. Prepare the first part of the message schedule W. */\n\tbe64dec_vect(W, block, SHA512_BLOCK_LENGTH/8);\n\n\t/* 2. Initialize working variables. */\n\tmemcpy(S, state, SHA512_DIGEST_LENGTH);\n\n\t/* 3. Mix. */\n\tfor (i = 0; i < 80; i += 16) {\n\t\tuint64_t x_xor_y, y_xor_z = S[(65 - i) % 8] ^ S[(66 - i) % 8];\n\t\tRNDr(S, W, 0, i);\n\t\tRNDr(S, W, 1, i);\n\t\tRNDr(S, W, 2, i);\n\t\tRNDr(S, W, 3, i);\n\t\tRNDr(S, W, 4, i);\n\t\tRNDr(S, W, 5, i);\n\t\tRNDr(S, W, 6, i);\n\t\tRNDr(S, W, 7, i);\n\t\tRNDr(S, W, 8, i);\n\t\tRNDr(S, W, 9, i);\n\t\tRNDr(S, W, 10, i);\n\t\tRNDr(S, W, 11, i);\n\t\tRNDr(S, W, 12, i);\n\t\tRNDr(S, W, 13, i);\n\t\tRNDr(S, W, 14, i);\n\t\tRNDr(S, W, 15, i);\n\n\t\tif (i == 64)\n\t\t\tbreak;\n\t\tMSCH(W, 0, i);\n\t\tMSCH(W, 1, i);\n\t\tMSCH(W, 2, i);\n\t\tMSCH(W, 3, i);\n\t\tMSCH(W, 4, i);\n\t\tMSCH(W, 5, i);\n\t\tMSCH(W, 6, i);\n\t\tMSCH(W, 7, i);\n\t\tMSCH(W, 8, i);\n\t\tMSCH(W, 9, i);\n\t\tMSCH(W, 10, i);\n\t\tMSCH(W, 11, i);\n\t\tMSCH(W, 12, i);\n\t\tMSCH(W, 13, i);\n\t\tMSCH(W, 14, i);\n\t\tMSCH(W, 15, i);\n\t}\n\n\t/* 4. Mix local working variables into global state */\n\tfor (i = 0; i < 8; i++)\n\t\tstate[i] += S[i];\n}\n\nstatic const unsigned char PAD[SHA512_BLOCK_LENGTH] = {\n\t0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n\t0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n\t0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n\t0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n\t0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n\t0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n\t0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n\t0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0\n};\n\n/* Add padding and terminating bit-count. */\nstatic void\nSHA512_Pad(SHA512_CTX * ctx)\n{\n\tsize_t r;\n\n\t/* Figure out how many bytes we have buffered. */\n\tr = (ctx->count[1] >> 3) & 0x7f;\n\n\t/* Pad to 112 mod 128, transforming if we finish a block en route. */\n\tif (r < 112) {\n\t\t/* Pad to 112 mod 128. */\n\t\tmemcpy(&ctx->buf[r], PAD, 112 - r);\n\t} else {\n\t\t/* Finish the current block and mix. */\n\t\tmemcpy(&ctx->buf[r], PAD, 128 - r);\n\t\tSHA512_Transform(ctx->state, ctx->buf);\n\n\t\t/* The start of the final block is all zeroes. */\n\t\tmemset(&ctx->buf[0], 0, 112);\n\t}\n\n\t/* Add the terminating bit-count. */\n\tbe64enc_vect(&ctx->buf[112], ctx->count, 2);\n\n\t/* Mix in the final block. */\n\tSHA512_Transform(ctx->state, ctx->buf);\n}\n\n/* SHA-512 initialization.  Begins a SHA-512 operation. */\nvoid\nSHA512_Init(SHA512_CTX * ctx)\n{\n\n\t/* Zero bits processed so far */\n\tctx->count[0] = ctx->count[1] = 0;\n\n\t/* Magic initialization constants */\n\tctx->state[0] = 0x6a09e667f3bcc908ULL;\n\tctx->state[1] = 0xbb67ae8584caa73bULL;\n\tctx->state[2] = 0x3c6ef372fe94f82bULL;\n\tctx->state[3] = 0xa54ff53a5f1d36f1ULL;\n\tctx->state[4] = 0x510e527fade682d1ULL;\n\tctx->state[5] = 0x9b05688c2b3e6c1fULL;\n\tctx->state[6] = 0x1f83d9abfb41bd6bULL;\n\tctx->state[7] = 0x5be0cd19137e2179ULL;\n}\n\n/* Add bytes into the hash */\nvoid\nSHA512_Update(SHA512_CTX * ctx, const void *in, size_t len)\n{\n\tuint64_t bitlen[2];\n\tsize_t r;\n\tconst unsigned char *src = in;\n\n\t/* Number of bytes left in the buffer from previous updates */\n\tr = (ctx->count[1] >> 3) & 0x7f;\n\n\t/* Convert the length into a number of bits */\n\tbitlen[1] = ((uint64_t)len) << 3;\n\tbitlen[0] = ((uint64_t)len) >> 61;\n\n\t/* Update number of bits */\n\tif ((ctx->count[1] += bitlen[1]) < bitlen[1])\n\t\tctx->count[0]++;\n\tctx->count[0] += bitlen[0];\n\n\t/* Handle the case where we don't need to perform any transforms */\n\tif (len < SHA512_BLOCK_LENGTH - r) {\n\t\tmemcpy(&ctx->buf[r], src, len);\n\t\treturn;\n\t}\n\n\t/* Finish the current block */\n\tmemcpy(&ctx->buf[r], src, SHA512_BLOCK_LENGTH - r);\n\tSHA512_Transform(ctx->state, ctx->buf);\n\tsrc += SHA512_BLOCK_LENGTH - r;\n\tlen -= SHA512_BLOCK_LENGTH - r;\n\n\t/* Perform complete blocks */\n\twhile (len >= SHA512_BLOCK_LENGTH) {\n\t\tSHA512_Transform(ctx->state, src);\n\t\tsrc += SHA512_BLOCK_LENGTH;\n\t\tlen -= SHA512_BLOCK_LENGTH;\n\t}\n\n\t/* Copy left over data into buffer */\n\tmemcpy(ctx->buf, src, len);\n}\n\n/*\n * SHA-512 finalization.  Pads the input data, exports the hash value,\n * and clears the context state.\n */\nvoid\nSHA512_Final(unsigned char digest[MIN_SIZE(SHA512_DIGEST_LENGTH)],\n\tSHA512_CTX *ctx)\n{\n\n\t/* Add padding */\n\tSHA512_Pad(ctx);\n\n\t/* Write the hash */\n\tbe64enc_vect(digest, ctx->state, SHA512_DIGEST_LENGTH/8);\n\n\t/* Clear the context state */\n\texplicit_bzero(ctx, sizeof(*ctx));\n}\n\n/**\n * SHA512_Buf(in, len, digest):\n * Compute the SHA512 hash of ${len} bytes from ${in} and write it to ${digest}.\n */\nvoid\nSHA512_Buf(const void * in, size_t len,\n\tunsigned char digest[MIN_SIZE(SHA512_DIGEST_LENGTH)])\n{\n        SHA512_CTX ctx;\n\n        SHA512_Init(&ctx);\n        SHA512_Update(&ctx, in, len);\n        SHA512_Final(digest, &ctx);\n}\n\n#endif\n"
  },
  {
    "path": "lib/alg-sha512.h",
    "content": "/*-\n * Copyright 2005 Colin Percival\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\n#ifndef _SHA512_H_\n#define _SHA512_H_\n\n#include <stddef.h>\n#include <stdint.h>\n\n/*\n * Use #defines in order to avoid namespace collisions with anyone else's\n * SHA512 code (e.g., the code in OpenSSL).\n */\n#define SHA512_Init libcperciva_SHA512_Init\n#define SHA512_Update libcperciva_SHA512_Update\n#define SHA512_Final libcperciva_SHA512_Final\n#define SHA512_Buf libcperciva_SHA512_Buf\n#define SHA512_CTX libcperciva_SHA512_CTX\n\n/* Common constants. */\n#define SHA512_BLOCK_LENGTH 128\n#define SHA512_DIGEST_LENGTH 64\n\n/* Context structure for SHA512 operations. */\ntypedef struct {\n\tuint64_t state[8];\n\tuint64_t count[2];\n\tuint8_t  buf[SHA512_BLOCK_LENGTH];\n} SHA512_CTX;\n\n/**\n * SHA512_Init(ctx):\n * Initialize the SHA512 context ${ctx}.\n */\nextern void SHA512_Init(SHA512_CTX *);\n\n/**\n * SHA512_Update(ctx, in, len):\n * Input ${len} bytes from ${in} into the SHA512 context ${ctx}.\n */\nextern void SHA512_Update(SHA512_CTX *, const void *, size_t);\n\n/**\n * SHA512_Final(digest, ctx):\n * Output the SHA512 hash of the data input to the context ${ctx} into the\n * buffer ${digest}.\n */\nextern void SHA512_Final(unsigned char[MIN_SIZE(SHA512_DIGEST_LENGTH)],\n    SHA512_CTX *);\n\n/**\n * SHA512_Buf(in, len, digest):\n * Compute the SHA512 hash of ${len} bytes from ${in} and write it to ${digest}.\n */\nextern void SHA512_Buf(const void *, size_t,\n    unsigned char[MIN_SIZE(SHA512_DIGEST_LENGTH)]);\n\n#endif /* !_SHA512_H_ */\n"
  },
  {
    "path": "lib/alg-sm3-hmac.c",
    "content": "/* Copyright (C) 2024 Björn Esser <besser82@fedoraproject.org>\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\n#include \"crypt-port.h\"\n\n#if INCLUDE_sm3_yescrypt\n\n#include <string.h>\n#include \"alg-sm3-hmac.h\"\n\n/**\n * HMAC_k(m) = H((k ^ opad), H((k ^ ipad), m))\n * pseudo-code:\n * function hmac(key, message)\n *   opad = [0x5c * blocksize]\n *   ipad = [0x36 * blocksize]\n *   if (length(key) > blocksize) then\n *     key = hash(key)\n *   end if\n *   for i from 0 to length(key) - 1 step 1\n *     ipad[i] = ipad[i] XOR key[i]\n *     opad[i] = opad[i] XOR key[i]\n *   end for\n *   return hash(opad || hash(ipad || message))\n * end function\n */\n\n#define IPAD 0x36\n#define OPAD 0x5C\n\nvoid\nsm3_hmac_init (sm3_hmac_ctx_t *ctx, const uint8_t *key, size_t key_len)\n{\n  /* Initialize */\n  memset (ctx, 0, sizeof (sm3_hmac_ctx_t));\n\n  if (key_len > 64)\n    {\n      sm3_init (&ctx->sm3_ctx);\n      sm3_update (&ctx->sm3_ctx, key, key_len);\n      sm3_final (ctx->key, &ctx->sm3_ctx);\n      goto end;\n    }\n\n  memcpy (ctx->key, key, key_len);\n\nend:\n  for (int i = 0; i < 64; i++)\n    {\n      ctx->key[i] ^= IPAD;\n    }\n  sm3_init (&ctx->sm3_ctx);\n  sm3_update (&ctx->sm3_ctx, ctx->key, 64);\n}\n\nvoid\nsm3_hmac_update (sm3_hmac_ctx_t *ctx, const uint8_t *data, size_t data_len)\n{\n  sm3_update (&ctx->sm3_ctx, data, data_len);\n}\n\nvoid\nsm3_hmac_final (sm3_hmac_ctx_t *ctx, uint8_t mac[32])\n{\n  for (int i = 0; i < 64; i++)\n    {\n      ctx->key[i] ^= (IPAD ^ OPAD);\n    }\n  sm3_final (mac, &ctx->sm3_ctx);\n  sm3_init (&ctx->sm3_ctx);\n  sm3_update (&ctx->sm3_ctx, ctx->key, 64);\n  sm3_update (&ctx->sm3_ctx, mac, 32);\n  sm3_final (mac, &ctx->sm3_ctx);\n\n  /* Zeroize sensitive information. */\n  explicit_bzero (ctx, sizeof (sm3_hmac_ctx_t));\n}\n\nvoid\nsm3_hmac (const unsigned char *data, size_t data_len,\n          const uint8_t *key, size_t key_len,\n          uint8_t mac[32], sm3_hmac_ctx_t *ctx)\n{\n  sm3_hmac_init (ctx, key, key_len);\n  sm3_hmac_update (ctx, data, data_len);\n  sm3_hmac_final (ctx, mac);\n}\n\nvoid\nsm3_hmac_buf (const unsigned char *data, size_t data_len,\n              const uint8_t *key, size_t key_len,\n              uint8_t mac[32])\n{\n  sm3_hmac_ctx_t ctx;\n  sm3_hmac (data, data_len, key, key_len, mac, &ctx);\n}\n\n#endif /* INCLUDE_sm3_yescrypt */\n"
  },
  {
    "path": "lib/alg-sm3-hmac.h",
    "content": "/* Copyright (C) 2024 Björn Esser <besser82@fedoraproject.org>\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\n#ifndef _CRYPT_ALG_SM3_HMAC_H\n#define _CRYPT_ALG_SM3_HMAC_H\n\n#include \"alg-sm3.h\"\n\ntypedef struct\n{\n  sm3_ctx sm3_ctx;\n  uint8_t key[64];\n} sm3_hmac_ctx_t;\n\nvoid sm3_hmac_init (sm3_hmac_ctx_t * ctx, const uint8_t * key,\n                    size_t key_len);\nvoid sm3_hmac_update (sm3_hmac_ctx_t * ctx, const uint8_t * data,\n                      size_t data_len);\nvoid sm3_hmac_final (sm3_hmac_ctx_t * ctx, uint8_t mac[32]);\nvoid sm3_hmac (const uint8_t * data, size_t data_len,\n               const uint8_t * key, size_t key_len,\n               uint8_t mac[32], sm3_hmac_ctx_t * ctx);\nvoid sm3_hmac_buf (const uint8_t * data, size_t data_len,\n                   const uint8_t * key, size_t key_len,\n                   uint8_t mac[32]);\n\n#endif /* _CRYPT_ALG_SM3_HMAC_H */\n"
  },
  {
    "path": "lib/alg-sm3.c",
    "content": "/*\n * Copyright (c) 2025 Björn Esser <besser82 at fedoraproject.org>\n * All rights reserved.\n *\n * Permission to use, copy, modify, and/or distribute this software for any\n * purpose with or without fee is hereby granted.\n *\n * THE SOFTWARE IS PROVIDED “AS IS” AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n */\n\n#include \"crypt-port.h\"\n\n#if INCLUDE_sm3crypt || INCLUDE_sm3_yescrypt\n\n#include \"alg-sm3.h\"\n#include \"byteorder.h\"\n\n#define ROTATE(a,n) (((a)<<(n))|(((a)&0xffffffff)>>(32-(n))))\n\n#define P0(X) (X ^ ROTATE(X, 9) ^ ROTATE(X, 17))\n#define P1(X) (X ^ ROTATE(X, 15) ^ ROTATE(X, 23))\n\n#define FF0(X,Y,Z) (X ^ Y ^ Z)\n#define GG0(X,Y,Z) (X ^ Y ^ Z)\n\n#define FF1(X,Y,Z) ((X & Y) | ((X | Y) & Z))\n#define GG1(X,Y,Z) ((Z ^ (X & (Y ^ Z))))\n\n#define EXPAND(W0,W7,W13,W3,W10) \\\n  (P1(W0 ^ W7 ^ ROTATE(W13, 15)) ^ ROTATE(W3, 7) ^ W10)\n\n#define RND(A, B, C, D, E, F, G, H, TJ, Wi, Wj, FF, GG)          \\\n  do                                                             \\\n    {                                                            \\\n      const uint32_t A12 = ROTATE(A, 12);                        \\\n      const uint32_t A12_SM = A12 + E + TJ;                      \\\n      const uint32_t SS1 = ROTATE(A12_SM, 7);                    \\\n      const uint32_t TT1 = FF(A, B, C) + D + (SS1 ^ A12) + (Wj); \\\n      const uint32_t TT2 = GG(E, F, G) + H + SS1 + Wi;           \\\n      B = ROTATE(B, 9);                                          \\\n      D = TT1;                                                   \\\n      F = ROTATE(F, 19);                                         \\\n      H = P0(TT2);                                               \\\n    }                                                            \\\n  while(0)\n\n#define R1(A,B,C,D,E,F,G,H,TJ,Wi,Wj) \\\n  RND(A,B,C,D,E,F,G,H,TJ,Wi,Wj,FF0,GG0)\n\n#define R2(A,B,C,D,E,F,G,H,TJ,Wi,Wj) \\\n  RND(A,B,C,D,E,F,G,H,TJ,Wi,Wj,FF1,GG1)\n\n  /*\n   * Encode a length len*2 vector of (uint32_t) into a length len*8 vector of\n   * (uint8_t) in big-endian form.\n   */\n  static void\n  sm3_be32enc_vect(uint8_t * dst, const uint32_t * src, size_t len)\n  {\n\n    /* Encode vector, two words at a time. */\n    do\n      {\n        be32enc(&dst[0], src[0]);\n        be32enc(&dst[4], src[1]);\n        src += 2;\n        dst += 8;\n      }\n    while (--len);\n  }\n\n/*\n * Decode a big-endian length len*8 vector of (uint8_t) into a length\n * len*2 vector of (uint32_t).\n */\nstatic void\nsm3_be32dec_vect(uint32_t * dst, const uint8_t * src, size_t len)\n{\n\n  /* Decode vector, two words at a time. */\n  do\n    {\n      dst[0] = be32dec(&src[0]);\n      dst[1] = be32dec(&src[4]);\n      src += 8;\n      dst += 2;\n    }\n  while (--len);\n}\n\nstatic void\nsm3_transform(uint32_t state[static restrict 8],\n              const uint8_t block[static restrict 64],\n              uint32_t W[static restrict 64])\n{\n  register uint32_t A, B, C, D, E, F, G, H;\n  uint32_t W00, W01, W02, W03, W04, W05, W06, W07,\n           W08, W09, W10, W11, W12, W13, W14, W15;\n\n  /* 1. Prepare the first part of the message schedule W. */\n  sm3_be32dec_vect(W, block, 8);\n\n  A = state[0];\n  B = state[1];\n  C = state[2];\n  D = state[3];\n  E = state[4];\n  F = state[5];\n  G = state[6];\n  H = state[7];\n\n  W00 = W[0];\n  W01 = W[1];\n  W02 = W[2];\n  W03 = W[3];\n  W04 = W[4];\n  W05 = W[5];\n  W06 = W[6];\n  W07 = W[7];\n  W08 = W[8];\n  W09 = W[9];\n  W10 = W[10];\n  W11 = W[11];\n  W12 = W[12];\n  W13 = W[13];\n  W14 = W[14];\n  W15 = W[15];\n\n  R1(A, B, C, D, E, F, G, H, 0x79CC4519, W00, W00 ^ W04);\n  W00 = EXPAND(W00, W07, W13, W03, W10);\n  R1(D, A, B, C, H, E, F, G, 0xF3988A32, W01, W01 ^ W05);\n  W01 = EXPAND(W01, W08, W14, W04, W11);\n  R1(C, D, A, B, G, H, E, F, 0xE7311465, W02, W02 ^ W06);\n  W02 = EXPAND(W02, W09, W15, W05, W12);\n  R1(B, C, D, A, F, G, H, E, 0xCE6228CB, W03, W03 ^ W07);\n  W03 = EXPAND(W03, W10, W00, W06, W13);\n  R1(A, B, C, D, E, F, G, H, 0x9CC45197, W04, W04 ^ W08);\n  W04 = EXPAND(W04, W11, W01, W07, W14);\n  R1(D, A, B, C, H, E, F, G, 0x3988A32F, W05, W05 ^ W09);\n  W05 = EXPAND(W05, W12, W02, W08, W15);\n  R1(C, D, A, B, G, H, E, F, 0x7311465E, W06, W06 ^ W10);\n  W06 = EXPAND(W06, W13, W03, W09, W00);\n  R1(B, C, D, A, F, G, H, E, 0xE6228CBC, W07, W07 ^ W11);\n  W07 = EXPAND(W07, W14, W04, W10, W01);\n  R1(A, B, C, D, E, F, G, H, 0xCC451979, W08, W08 ^ W12);\n  W08 = EXPAND(W08, W15, W05, W11, W02);\n  R1(D, A, B, C, H, E, F, G, 0x988A32F3, W09, W09 ^ W13);\n  W09 = EXPAND(W09, W00, W06, W12, W03);\n  R1(C, D, A, B, G, H, E, F, 0x311465E7, W10, W10 ^ W14);\n  W10 = EXPAND(W10, W01, W07, W13, W04);\n  R1(B, C, D, A, F, G, H, E, 0x6228CBCE, W11, W11 ^ W15);\n  W11 = EXPAND(W11, W02, W08, W14, W05);\n  R1(A, B, C, D, E, F, G, H, 0xC451979C, W12, W12 ^ W00);\n  W12 = EXPAND(W12, W03, W09, W15, W06);\n  R1(D, A, B, C, H, E, F, G, 0x88A32F39, W13, W13 ^ W01);\n  W13 = EXPAND(W13, W04, W10, W00, W07);\n  R1(C, D, A, B, G, H, E, F, 0x11465E73, W14, W14 ^ W02);\n  W14 = EXPAND(W14, W05, W11, W01, W08);\n  R1(B, C, D, A, F, G, H, E, 0x228CBCE6, W15, W15 ^ W03);\n  W15 = EXPAND(W15, W06, W12, W02, W09);\n  R2(A, B, C, D, E, F, G, H, 0x9D8A7A87, W00, W00 ^ W04);\n  W00 = EXPAND(W00, W07, W13, W03, W10);\n  R2(D, A, B, C, H, E, F, G, 0x3B14F50F, W01, W01 ^ W05);\n  W01 = EXPAND(W01, W08, W14, W04, W11);\n  R2(C, D, A, B, G, H, E, F, 0x7629EA1E, W02, W02 ^ W06);\n  W02 = EXPAND(W02, W09, W15, W05, W12);\n  R2(B, C, D, A, F, G, H, E, 0xEC53D43C, W03, W03 ^ W07);\n  W03 = EXPAND(W03, W10, W00, W06, W13);\n  R2(A, B, C, D, E, F, G, H, 0xD8A7A879, W04, W04 ^ W08);\n  W04 = EXPAND(W04, W11, W01, W07, W14);\n  R2(D, A, B, C, H, E, F, G, 0xB14F50F3, W05, W05 ^ W09);\n  W05 = EXPAND(W05, W12, W02, W08, W15);\n  R2(C, D, A, B, G, H, E, F, 0x629EA1E7, W06, W06 ^ W10);\n  W06 = EXPAND(W06, W13, W03, W09, W00);\n  R2(B, C, D, A, F, G, H, E, 0xC53D43CE, W07, W07 ^ W11);\n  W07 = EXPAND(W07, W14, W04, W10, W01);\n  R2(A, B, C, D, E, F, G, H, 0x8A7A879D, W08, W08 ^ W12);\n  W08 = EXPAND(W08, W15, W05, W11, W02);\n  R2(D, A, B, C, H, E, F, G, 0x14F50F3B, W09, W09 ^ W13);\n  W09 = EXPAND(W09, W00, W06, W12, W03);\n  R2(C, D, A, B, G, H, E, F, 0x29EA1E76, W10, W10 ^ W14);\n  W10 = EXPAND(W10, W01, W07, W13, W04);\n  R2(B, C, D, A, F, G, H, E, 0x53D43CEC, W11, W11 ^ W15);\n  W11 = EXPAND(W11, W02, W08, W14, W05);\n  R2(A, B, C, D, E, F, G, H, 0xA7A879D8, W12, W12 ^ W00);\n  W12 = EXPAND(W12, W03, W09, W15, W06);\n  R2(D, A, B, C, H, E, F, G, 0x4F50F3B1, W13, W13 ^ W01);\n  W13 = EXPAND(W13, W04, W10, W00, W07);\n  R2(C, D, A, B, G, H, E, F, 0x9EA1E762, W14, W14 ^ W02);\n  W14 = EXPAND(W14, W05, W11, W01, W08);\n  R2(B, C, D, A, F, G, H, E, 0x3D43CEC5, W15, W15 ^ W03);\n  W15 = EXPAND(W15, W06, W12, W02, W09);\n  R2(A, B, C, D, E, F, G, H, 0x7A879D8A, W00, W00 ^ W04);\n  W00 = EXPAND(W00, W07, W13, W03, W10);\n  R2(D, A, B, C, H, E, F, G, 0xF50F3B14, W01, W01 ^ W05);\n  W01 = EXPAND(W01, W08, W14, W04, W11);\n  R2(C, D, A, B, G, H, E, F, 0xEA1E7629, W02, W02 ^ W06);\n  W02 = EXPAND(W02, W09, W15, W05, W12);\n  R2(B, C, D, A, F, G, H, E, 0xD43CEC53, W03, W03 ^ W07);\n  W03 = EXPAND(W03, W10, W00, W06, W13);\n  R2(A, B, C, D, E, F, G, H, 0xA879D8A7, W04, W04 ^ W08);\n  W04 = EXPAND(W04, W11, W01, W07, W14);\n  R2(D, A, B, C, H, E, F, G, 0x50F3B14F, W05, W05 ^ W09);\n  W05 = EXPAND(W05, W12, W02, W08, W15);\n  R2(C, D, A, B, G, H, E, F, 0xA1E7629E, W06, W06 ^ W10);\n  W06 = EXPAND(W06, W13, W03, W09, W00);\n  R2(B, C, D, A, F, G, H, E, 0x43CEC53D, W07, W07 ^ W11);\n  W07 = EXPAND(W07, W14, W04, W10, W01);\n  R2(A, B, C, D, E, F, G, H, 0x879D8A7A, W08, W08 ^ W12);\n  W08 = EXPAND(W08, W15, W05, W11, W02);\n  R2(D, A, B, C, H, E, F, G, 0x0F3B14F5, W09, W09 ^ W13);\n  W09 = EXPAND(W09, W00, W06, W12, W03);\n  R2(C, D, A, B, G, H, E, F, 0x1E7629EA, W10, W10 ^ W14);\n  W10 = EXPAND(W10, W01, W07, W13, W04);\n  R2(B, C, D, A, F, G, H, E, 0x3CEC53D4, W11, W11 ^ W15);\n  W11 = EXPAND(W11, W02, W08, W14, W05);\n  R2(A, B, C, D, E, F, G, H, 0x79D8A7A8, W12, W12 ^ W00);\n  W12 = EXPAND(W12, W03, W09, W15, W06);\n  R2(D, A, B, C, H, E, F, G, 0xF3B14F50, W13, W13 ^ W01);\n  W13 = EXPAND(W13, W04, W10, W00, W07);\n  R2(C, D, A, B, G, H, E, F, 0xE7629EA1, W14, W14 ^ W02);\n  W14 = EXPAND(W14, W05, W11, W01, W08);\n  R2(B, C, D, A, F, G, H, E, 0xCEC53D43, W15, W15 ^ W03);\n  W15 = EXPAND(W15, W06, W12, W02, W09);\n  R2(A, B, C, D, E, F, G, H, 0x9D8A7A87, W00, W00 ^ W04);\n  W00 = EXPAND(W00, W07, W13, W03, W10);\n  R2(D, A, B, C, H, E, F, G, 0x3B14F50F, W01, W01 ^ W05);\n  W01 = EXPAND(W01, W08, W14, W04, W11);\n  R2(C, D, A, B, G, H, E, F, 0x7629EA1E, W02, W02 ^ W06);\n  W02 = EXPAND(W02, W09, W15, W05, W12);\n  R2(B, C, D, A, F, G, H, E, 0xEC53D43C, W03, W03 ^ W07);\n  W03 = EXPAND(W03, W10, W00, W06, W13);\n  R2(A, B, C, D, E, F, G, H, 0xD8A7A879, W04, W04 ^ W08);\n  R2(D, A, B, C, H, E, F, G, 0xB14F50F3, W05, W05 ^ W09);\n  R2(C, D, A, B, G, H, E, F, 0x629EA1E7, W06, W06 ^ W10);\n  R2(B, C, D, A, F, G, H, E, 0xC53D43CE, W07, W07 ^ W11);\n  R2(A, B, C, D, E, F, G, H, 0x8A7A879D, W08, W08 ^ W12);\n  R2(D, A, B, C, H, E, F, G, 0x14F50F3B, W09, W09 ^ W13);\n  R2(C, D, A, B, G, H, E, F, 0x29EA1E76, W10, W10 ^ W14);\n  R2(B, C, D, A, F, G, H, E, 0x53D43CEC, W11, W11 ^ W15);\n  R2(A, B, C, D, E, F, G, H, 0xA7A879D8, W12, W12 ^ W00);\n  R2(D, A, B, C, H, E, F, G, 0x4F50F3B1, W13, W13 ^ W01);\n  R2(C, D, A, B, G, H, E, F, 0x9EA1E762, W14, W14 ^ W02);\n  R2(B, C, D, A, F, G, H, E, 0x3D43CEC5, W15, W15 ^ W03);\n\n  state[0] ^= A;\n  state[1] ^= B;\n  state[2] ^= C;\n  state[3] ^= D;\n  state[4] ^= E;\n  state[5] ^= F;\n  state[6] ^= G;\n  state[7] ^= H;\n}\n\n/* Magic initialization constants. */\nstatic const uint32_t initial_state[8] =\n{\n  0x7380166f, 0x4914b2b9, 0x172442d7, 0xda8a0600,\n  0xa96f30bc, 0x163138aa, 0xe38dee4d, 0xb0fb0e4e\n};\n\n/**\n * sm3_init(ctx):\n * Initialize the SM3 context ${ctx}.\n */\nvoid\nsm3_init(sm3_ctx * ctx)\n{\n\n  /* Zero bits processed so far. */\n  ctx->count = 0;\n\n  /* Initialize state. */\n  memcpy(ctx->state, initial_state, sizeof(initial_state));\n}\n\n\n/**\n * sm3_update(ctx, in, len):\n * Input ${len} bytes from ${in} into the SM3 context ${ctx}.\n */\nstatic void\n_sm3_update(sm3_ctx * ctx, const void * in, size_t len,\n            uint32_t tmp32[static restrict 72])\n{\n  uint32_t r;\n  const uint8_t * src = in;\n\n  /* Return immediately if we have nothing to do. */\n  if (len == 0)\n    return;\n\n  /* Number of bytes left in the buffer from previous updates. */\n  r = (ctx->count >> 3) & 0x3f;\n\n  /* Update number of bits. */\n  ctx->count += (uint64_t)(len) << 3;\n\n  /* Handle the case where we don't need to perform any transforms. */\n  if (len < 64 - r)\n    {\n      memcpy(&ctx->buf[r], src, len);\n      return;\n    }\n\n  /* Finish the current block. */\n  memcpy(&ctx->buf[r], src, 64 - r);\n  sm3_transform(ctx->state, ctx->buf, &tmp32[0]);\n  src += 64 - r;\n  len -= 64 - r;\n\n  /* Perform complete blocks. */\n  while (len >= 64)\n    {\n      sm3_transform(ctx->state, src, &tmp32[0]);\n      src += 64;\n      len -= 64;\n    }\n\n  /* Copy left over data into buffer. */\n  memcpy(ctx->buf, src, len);\n}\n\n/* Wrapper function for intermediate-values sanitization. */\nvoid\nsm3_update(sm3_ctx * ctx, const void * in, size_t len)\n{\n  uint32_t tmp32[72];\n\n  /* Call the real function. */\n  _sm3_update(ctx, in, len, tmp32);\n\n  /* Clean the stack. */\n  explicit_bzero(tmp32, 288);\n}\n\nstatic const uint8_t PAD[64] =\n{\n  0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0\n};\n\n/* Add padding and terminating bit-count. */\nstatic void\nsm3_pad(sm3_ctx * ctx, uint32_t tmp32[static restrict 72])\n{\n  size_t r;\n\n  /* Figure out how many bytes we have buffered. */\n  r = (ctx->count >> 3) & 0x3f;\n\n  /* Pad to 56 mod 64, transforming if we finish a block en route. */\n  if (r < 56)\n    {\n      /* Pad to 56 mod 64. */\n      memcpy(&ctx->buf[r], PAD, 56 - r);\n    }\n  else\n    {\n      /* Finish the current block and mix. */\n      memcpy(&ctx->buf[r], PAD, 64 - r);\n      sm3_transform(ctx->state, ctx->buf, &tmp32[0]);\n\n      /* The start of the final block is all zeroes. */\n      memset(&ctx->buf[0], 0, 56);\n    }\n\n  /* Add the terminating bit-count. */\n  be64enc(&ctx->buf[56], ctx->count);\n\n  /* Mix in the final block. */\n  sm3_transform(ctx->state, ctx->buf, &tmp32[0]);\n}\n/**\n * sm3_final(digest, ctx):\n * Output the SM3 hash of the data input to the context ${ctx} into the\n * buffer ${digest}.\n */\nstatic void\n_sm3_final(uint8_t digest[32], sm3_ctx * ctx,\n           uint32_t tmp32[static restrict 72])\n{\n\n  /* Add padding. */\n  sm3_pad(ctx, tmp32);\n\n  /* Write the hash. */\n  sm3_be32enc_vect(digest, ctx->state, 4);\n}\n\n/* Wrapper function for intermediate-values sanitization. */\nvoid\nsm3_final(uint8_t digest[32], sm3_ctx * ctx)\n{\n  uint32_t tmp32[72];\n\n  /* Call the real function. */\n  _sm3_final(digest, ctx, tmp32);\n\n  /* Clear the context state. */\n  explicit_bzero(ctx, sizeof(sm3_ctx));\n\n  /* Clean the stack. */\n  explicit_bzero(tmp32, 288);\n}\n\n/**\n * sm3_hash(in, len, digest, ctx):\n * Compute the SM3 hash of ${len} bytes from ${in} and write it to ${digest},\n * using the prepared context ${ctx}.\n */\nvoid\nsm3_hash(const void * in, size_t len, uint8_t digest[32], sm3_ctx * ctx)\n{\n  uint32_t tmp32[72];\n\n  sm3_init(ctx);\n  _sm3_update(ctx, in, len, tmp32);\n  _sm3_final(digest, ctx, tmp32);\n\n  /* Clean the stack. */\n  explicit_bzero(tmp32, 288);\n}\n\n/**\n * sm3_buf(in, len, digest):\n * Compute the SM3 hash of ${len} bytes from ${in} and write it to ${digest}.\n */\nvoid\nsm3_buf(const void * in, size_t len, uint8_t digest[32])\n{\n  sm3_ctx ctx;\n\n  sm3_hash(in, len, digest, &ctx);\n\n  /* Clean the stack. */\n  explicit_bzero(&ctx, sizeof(sm3_ctx));\n}\n\n#endif /* INCLUDE_sm3crypt || INCLUDE_sm3_yescrypt */\n"
  },
  {
    "path": "lib/alg-sm3.h",
    "content": "/*\n * Copyright (c) 2025 Björn Esser <besser82 at fedoraproject.org>\n * All rights reserved.\n *\n * Permission to use, copy, modify, and/or distribute this software for any\n * purpose with or without fee is hereby granted.\n *\n * THE SOFTWARE IS PROVIDED “AS IS” AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n */\n\n#ifndef _CRYPT_ALG_SM3_H\n#define _CRYPT_ALG_SM3_H\n\n#include \"crypt-port.h\"\n\n#include <stdint.h>\n\n/* Context structure for SM3 operations. */\ntypedef struct\n{\n  uint32_t state[8];\n  uint64_t count;\n  uint8_t buf[64];\n} sm3_ctx;\n\n/**\n * sm3_init(ctx):\n * Initialize the SM3 context ${ctx}.\n */\nextern void sm3_init(sm3_ctx *);\n\n/**\n * sm3_update(ctx, in, len):\n * Input ${len} bytes from ${in} into the SM3 context ${ctx}.\n */\nextern void sm3_update(sm3_ctx *, const void *, size_t);\n\n/**\n * sm3_final(digest, ctx):\n * Output the SM3 hash of the data input to the context ${ctx} into the\n * buffer ${digest}.\n */\nextern void sm3_final(uint8_t[32], sm3_ctx *);\n\n/**\n * sm3_hash(in, len, digest, ctx):\n * Compute the SM3 hash of ${len} bytes from ${in} and write it to ${digest},\n * using the prepared context ${ctx}.\n */\nextern void sm3_hash(const void *, size_t, uint8_t[32], sm3_ctx *);\n\n/**\n * sm3_buf(in, len, digest):\n * Compute the SM3 hash of ${len} bytes from ${in} and write it to ${digest}.\n */\nextern void sm3_buf(const void *, size_t, uint8_t[32]);\n#endif /* _CRYPT_ALG_SM3_H */\n"
  },
  {
    "path": "lib/alg-yescrypt-common.c",
    "content": "/*-\n * Copyright 2013-2018 Alexander Peslyak\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\n#include \"crypt-port.h\"\n\n#if INCLUDE_yescrypt || INCLUDE_scrypt || INCLUDE_gost_yescrypt || \\\n    INCLUDE_sm3_yescrypt\n\n#include <stdint.h>\n#include <string.h>\n\n#include \"alg-sha256.h\"\n\n#define YESCRYPT_INTERNAL\n#include \"alg-yescrypt.h\"\n\n#pragma GCC diagnostic ignored \"-Wconversion\"\n#pragma GCC diagnostic ignored \"-Wsign-conversion\"\n#pragma GCC diagnostic ignored \"-Wsign-compare\"\n#pragma GCC diagnostic ignored \"-Wcast-qual\"\n\n#define BYTES2CHARS(bytes) ((((bytes) * 8) + 5) / 6)\n\n#define HASH_SIZE sizeof(yescrypt_binary_t) /* bytes */\n#define HASH_LEN BYTES2CHARS(HASH_SIZE) /* base-64 chars */\n\n/*\n * \"$y$\", up to 8 params of up to 6 chars each, '$', salt\n * Alternatively, but that's smaller:\n * \"$7$\", 3 params encoded as 1+5+5 chars, salt\n */\n#define PREFIX_LEN (3 + 8 * 6 + 1 + BYTES2CHARS(32))\n\nstatic const uint8_t atoi64_partial[77] = {\n\t0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,\n\t64, 64, 64, 64, 64, 64, 64,\n\t12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,\n\t25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37,\n\t64, 64, 64, 64, 64, 64,\n\t38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50,\n\t51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63\n};\n\nstatic uint8_t *encode64_uint32(uint8_t *dst, size_t dstlen,\n    uint32_t src, uint32_t min)\n{\n\tuint32_t start = 0, end = 47, chars = 1, bits = 0;\n\n\tif (src < min)\n\t\treturn NULL;\n\tsrc -= min;\n\n\tdo {\n\t\tuint32_t count = (end + 1 - start) << bits;\n\t\tif (src < count)\n\t\t\tbreak;\n\t\tif (start >= 63)\n\t\t\treturn NULL;\n\t\tstart = end + 1;\n\t\tend = start + (62 - end) / 2;\n\t\tsrc -= count;\n\t\tchars++;\n\t\tbits += 6;\n\t} while (1);\n\n\tif (dstlen <= chars) /* require room for a NUL terminator */\n\t\treturn NULL;\n\n\t*dst++ = itoa64[start + (src >> bits)];\n\n\twhile (--chars) {\n\t\tbits -= 6;\n\t\t*dst++ = itoa64[(src >> bits) & 0x3f];\n\t}\n\n\t*dst = 0; /* NUL terminate just in case */\n\n\treturn dst;\n}\n\nstatic inline uint32_t atoi64(uint8_t src)\n{\n\tif (src >= '.' && src <= 'z')\n\t\treturn atoi64_partial[src - '.'];\n\n\treturn 64;\n}\n\nstatic const uint8_t *decode64_uint32(uint32_t *dst,\n    const uint8_t *src, uint32_t min)\n{\n\tuint32_t start = 0, end = 47, chars = 1, bits = 0;\n\tuint32_t c;\n\n\tc = atoi64(*src++);\n\tif (c > 63)\n\t\tgoto fail;\n\n\t*dst = min;\n\twhile (c > end) {\n\t\t*dst += (end + 1 - start) << bits;\n\t\tstart = end + 1;\n\t\tend = start + (62 - end) / 2;\n\t\tchars++;\n\t\tbits += 6;\n\t}\n\n\t*dst += (c - start) << bits;\n\n\twhile (--chars) {\n\t\tc = atoi64(*src++);\n\t\tif (c > 63)\n\t\t\tgoto fail;\n\t\tbits -= 6;\n\t\t*dst += c << bits;\n\t}\n\n\treturn src;\n\nfail:\n\t*dst = 0;\n\treturn NULL;\n}\n\nstatic uint8_t *encode64_uint32_fixed(uint8_t *dst, size_t dstlen,\n    uint32_t src, uint32_t srcbits)\n{\n\tuint32_t bits;\n\n\tfor (bits = 0; bits < srcbits; bits += 6) {\n\t\tif (dstlen < 2)\n\t\t\treturn NULL;\n\t\t*dst++ = itoa64[src & 0x3f];\n\t\tdstlen--;\n\t\tsrc >>= 6;\n\t}\n\n\tif (src || dstlen < 1)\n\t\treturn NULL;\n\n\t*dst = 0; /* NUL terminate just in case */\n\n\treturn dst;\n}\n\nuint8_t *encode64(uint8_t *dst, size_t dstlen,\n    const uint8_t *src, size_t srclen)\n{\n\tsize_t i;\n\n\tfor (i = 0; i < srclen; ) {\n\t\tuint8_t *dnext;\n\t\tuint32_t value = 0, bits = 0;\n\t\tdo {\n\t\t\tvalue |= (uint32_t)src[i++] << bits;\n\t\t\tbits += 8;\n\t\t} while (bits < 24 && i < srclen);\n\t\tdnext = encode64_uint32_fixed(dst, dstlen, value, bits);\n\t\tif (!dnext)\n\t\t\treturn NULL;\n\t\tdstlen -= dnext - dst;\n\t\tdst = dnext;\n\t}\n\n\tif (dstlen < 1)\n\t\treturn NULL;\n\n\t*dst = 0; /* NUL terminate just in case */\n\n\treturn dst;\n}\n\nstatic const uint8_t *decode64_uint32_fixed(uint32_t *dst, uint32_t dstbits,\n    const uint8_t *src)\n{\n\tuint32_t bits;\n\n\t*dst = 0;\n\tfor (bits = 0; bits < dstbits; bits += 6) {\n\t\tuint32_t c = atoi64(*src++);\n\t\tif (c > 63) {\n\t\t\t*dst = 0;\n\t\t\treturn NULL;\n\t\t}\n\t\t*dst |= c << bits;\n\t}\n\n\treturn src;\n}\n\nconst uint8_t *decode64(uint8_t *dst, size_t *dstlen,\n    const uint8_t *src, size_t srclen)\n{\n\tsize_t dstpos = 0;\n\n\twhile (dstpos <= *dstlen && srclen) {\n\t\tuint32_t value = 0, bits = 0;\n\t\twhile (srclen--) {\n\t\t\tuint32_t c = atoi64(*src);\n\t\t\tif (c > 63) {\n\t\t\t\tsrclen = 0;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tsrc++;\n\t\t\tvalue |= c << bits;\n\t\t\tbits += 6;\n\t\t\tif (bits >= 24)\n\t\t\t\tbreak;\n\t\t}\n\t\tif (!bits)\n\t\t\tbreak;\n\t\tif (bits < 12) /* must have at least one full byte */\n\t\t\tgoto fail;\n\t\twhile (dstpos++ < *dstlen) {\n\t\t\t*dst++ = value;\n\t\t\tvalue >>= 8;\n\t\t\tbits -= 8;\n\t\t\tif (bits < 8) { /* 2 or 4 */\n\t\t\t\tif (value) /* must be 0 */\n\t\t\t\t\tgoto fail;\n\t\t\t\tbits = 0;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (bits)\n\t\t\tgoto fail;\n\t}\n\n\tif (!srclen && dstpos <= *dstlen) {\n\t\t*dstlen = dstpos;\n\t\treturn src;\n\t}\n\nfail:\n\t*dstlen = 0;\n\treturn NULL;\n}\n\ntypedef enum { ENC = 1, DEC = -1 } encrypt_dir_t;\n\nstatic void memxor(unsigned char *dst, unsigned char *src, size_t size)\n{\n\twhile (size--)\n\t\t*dst++ ^= *src++;\n}\n\nstatic void yescrypt_sha256_cipher(unsigned char *data, size_t datalen,\n    const yescrypt_binary_t *key, encrypt_dir_t dir)\n{\n\tSHA256_CTX ctx;\n\tunsigned char f[32 + 4];\n\tsize_t halflen, which;\n\tunsigned char mask, round, target;\n\n\tif (!datalen)\n\t\treturn;\n\tif (datalen > 64)\n\t\tdatalen = 64;\n\n\thalflen = datalen >> 1;\n\n\twhich = 0; /* offset to half we are working on (0 or halflen) */\n\tmask = 0x0f; /* current half's extra nibble mask if datalen is odd */\n\n\tround = 0;\n\ttarget = 5; /* 6 rounds due to Jacques Patarin's CRYPTO 2004 paper */\n\n\tif (dir == DEC) {\n\t\twhich = halflen; /* even round count, so swap the halves */\n\t\tmask ^= 0xff;\n\n\t\tround = target;\n\t\ttarget = 0;\n\t}\n\n\tf[32] = 0;\n\tf[33] = sizeof(*key);\n\tf[34] = datalen;\n\n\tdo {\n\t\tSHA256_Init(&ctx);\n\t\tf[35] = round;\n\t\tSHA256_Update(&ctx, &f[32], 4);\n\t\tSHA256_Update(&ctx, key, sizeof(*key));\n\t\tSHA256_Update(&ctx, &data[which], halflen);\n\t\tif (datalen & 1) {\n\t\t\tf[0] = data[datalen - 1] & mask;\n\t\t\tSHA256_Update(&ctx, f, 1);\n\t\t}\n\t\tSHA256_Final(f, &ctx);\n\t\twhich ^= halflen;\n\t\tmemxor(&data[which], f, halflen);\n\t\tif (datalen & 1) {\n\t\t\tmask ^= 0xff;\n\t\t\tdata[datalen - 1] ^= f[halflen] & mask;\n\t\t}\n\t\tif (round == target)\n\t\t\tbreak;\n\t\t// coverity[overflow_const]\n\t\tround += dir;\n\t} while (1);\n\n\t/* ctx is presumably zeroized by SHA256_Final() */\n\texplicit_bzero(f, sizeof(f));\n}\n\nuint8_t *yescrypt_r(const yescrypt_shared_t *shared, yescrypt_local_t *local,\n    const uint8_t *passwd, size_t passwdlen,\n    const uint8_t *setting,\n    const yescrypt_binary_t *key,\n    uint8_t *buf, size_t buflen)\n{\n\tunsigned char saltbin[64], hashbin[32];\n\tconst uint8_t *src, *saltstr, *salt;\n\tuint8_t *dst;\n\tsize_t need, prefixlen, saltstrlen, saltlen;\n\tyescrypt_params_t params = { .p = 1 };\n\n\tif (setting[0] != '$' ||\n\t    (setting[1] != '7' && setting[1] != 'y') ||\n\t    setting[2] != '$')\n\t\treturn NULL;\n\tsrc = setting + 3;\n\n\tif (setting[1] == '7') {\n\t\tuint32_t N_log2 = atoi64(*src++);\n\t\tif (N_log2 < 1 || N_log2 > 63)\n\t\t\treturn NULL;\n\t\tparams.N = (uint64_t)1 << N_log2;\n\n\t\tsrc = decode64_uint32_fixed(&params.r, 30, src);\n\t\tif (!src)\n\t\t\treturn NULL;\n\n\t\tsrc = decode64_uint32_fixed(&params.p, 30, src);\n\t\tif (!src)\n\t\t\treturn NULL;\n\n\t\tif (key)\n\t\t\treturn NULL;\n\t} else {\n\t\tuint32_t flavor, N_log2;\n\n\t\tsrc = decode64_uint32(&flavor, src, 0);\n\t\tif (!src)\n\t\t\treturn NULL;\n\n\t\tif (flavor < YESCRYPT_RW) {\n\t\t\tparams.flags = flavor;\n\t\t} else if (flavor <= YESCRYPT_RW + (YESCRYPT_RW_FLAVOR_MASK >> 2)) {\n\t\t\tparams.flags = YESCRYPT_RW + ((flavor - YESCRYPT_RW) << 2);\n\t\t} else {\n\t\t\treturn NULL;\n\t\t}\n\n\t\tsrc = decode64_uint32(&N_log2, src, 1);\n\t\tif (!src || N_log2 > 63)\n\t\t\treturn NULL;\n\t\tparams.N = (uint64_t)1 << N_log2;\n\n\t\tsrc = decode64_uint32(&params.r, src, 1);\n\t\tif (!src)\n\t\t\treturn NULL;\n\n\t\tif (*src != '$') {\n\t\t\tuint32_t have;\n\n\t\t\tsrc = decode64_uint32(&have, src, 1);\n\t\t\tif (!src)\n\t\t\t\treturn NULL;\n\n\t\t\tif (have & 1) {\n\t\t\t\tsrc = decode64_uint32(&params.p, src, 2);\n\t\t\t\tif (!src)\n\t\t\t\t\treturn NULL;\n\t\t\t}\n\n\t\t\tif (have & 2) {\n\t\t\t\tsrc = decode64_uint32(&params.t, src, 1);\n\t\t\t\tif (!src)\n\t\t\t\t\treturn NULL;\n\t\t\t}\n\n\t\t\tif (have & 4) {\n\t\t\t\tsrc = decode64_uint32(&params.g, src, 1);\n\t\t\t\tif (!src)\n\t\t\t\t\treturn NULL;\n\t\t\t}\n\n\t\t\tif (have & 8) {\n\t\t\t\tuint32_t NROM_log2;\n\t\t\t\tsrc = decode64_uint32(&NROM_log2, src, 1);\n\t\t\t\tif (!src || NROM_log2 > 63)\n\t\t\t\t\treturn NULL;\n\t\t\t\tparams.NROM = (uint64_t)1 << NROM_log2;\n\t\t\t}\n\t\t}\n\n\t\tif (*src++ != '$')\n\t\t\treturn NULL;\n\t}\n\n\tprefixlen = src - setting;\n\n\tsaltstr = src;\n\tsrc = (uint8_t *)strrchr((char *)saltstr, '$');\n\tif (src)\n\t\tsaltstrlen = src - saltstr;\n\telse\n\t\tsaltstrlen = strlen((char *)saltstr);\n\n\tif (setting[1] == '7') {\n\t\tsalt = saltstr;\n\t\tsaltlen = saltstrlen;\n\t} else {\n\t\tconst uint8_t *saltend;\n\n\t\tsaltlen = sizeof(saltbin);\n\t\tsaltend = decode64(saltbin, &saltlen, saltstr, saltstrlen);\n\n\t\tif (!saltend || (size_t)(saltend - saltstr) != saltstrlen)\n\t\t\tgoto fail;\n\n\t\tsalt = saltbin;\n\n\t\tif (key)\n\t\t\tyescrypt_sha256_cipher(saltbin, saltlen, key, ENC);\n\t}\n\n\tneed = prefixlen + saltstrlen + 1 + HASH_LEN + 1;\n\tif (need > buflen || need < saltstrlen)\n\t\tgoto fail;\n\n\tif (yescrypt_kdf(shared, local, passwd, passwdlen, salt, saltlen,\n\t    &params, hashbin, sizeof(hashbin)))\n\t\tgoto fail;\n\n\tif (key) {\n\t\texplicit_bzero(saltbin, sizeof(saltbin));\n\t\tyescrypt_sha256_cipher(hashbin, sizeof(hashbin), key, ENC);\n\t}\n\n\tdst = buf;\n\tmemcpy(dst, setting, prefixlen + saltstrlen);\n\tdst += prefixlen + saltstrlen;\n\t*dst++ = '$';\n\n\tdst = encode64(dst, buflen - (dst - buf), hashbin, sizeof(hashbin));\n\texplicit_bzero(hashbin, sizeof(hashbin));\n\tif (!dst || dst >= buf + buflen)\n\t\treturn NULL;\n\n\t*dst = 0; /* NUL termination */\n\n\treturn buf;\n\nfail:\n\texplicit_bzero(saltbin, sizeof(saltbin));\n\texplicit_bzero(hashbin, sizeof(hashbin));\n\treturn NULL;\n}\n\nuint8_t *yescrypt(const uint8_t *passwd, const uint8_t *setting)\n{\n\t/* prefix, '$', hash, NUL */\n\tstatic uint8_t buf[PREFIX_LEN + 1 + HASH_LEN + 1];\n\tyescrypt_local_t local;\n\tuint8_t *retval;\n\n\tif (yescrypt_init_local(&local))\n\t\treturn NULL;\n\tretval = yescrypt_r(NULL, &local,\n\t    passwd, strlen((char *)passwd), setting, NULL, buf, sizeof(buf));\n\tif (yescrypt_free_local(&local))\n\t\treturn NULL;\n\treturn retval;\n}\n\nuint8_t *yescrypt_reencrypt(uint8_t *hash,\n    const yescrypt_binary_t *from_key,\n    const yescrypt_binary_t *to_key)\n{\n\tuint8_t *retval = NULL, *saltstart, *hashstart;\n\tconst uint8_t *hashend;\n\tunsigned char saltbin[64], hashbin[32];\n\tsize_t saltstrlen, saltlen = 0, hashlen;\n\n\tif (strncmp((char *)hash, \"$y$\", 3))\n\t\treturn NULL;\n\n\tsaltstart = NULL;\n\thashstart = (uint8_t *)strrchr((char *)hash, '$');\n\tif (hashstart) {\n\t\tif (hashstart > (uint8_t *)hash) {\n\t\t\tsaltstart = hashstart - 1;\n\t\t\twhile (*saltstart != '$' && saltstart > hash)\n\t\t\t\tsaltstart--;\n\t\t\tif (*saltstart == '$')\n\t\t\t\tsaltstart++;\n\t\t}\n\t\thashstart++;\n\t} else {\n\t\thashstart = hash;\n\t}\n\tsaltstrlen = saltstart ? (hashstart - 1 - saltstart) : 0;\n\tif (saltstrlen > BYTES2CHARS(64) ||\n\t    strlen((char *)hashstart) != HASH_LEN)\n\t\treturn NULL;\n\n\tif (saltstrlen) {\n\t\tconst uint8_t *saltend;\n\t\tsaltlen = sizeof(saltbin);\n\t\tsaltend = decode64(saltbin, &saltlen, saltstart, saltstrlen);\n\t\tif (!saltend || *saltend != '$' || saltlen < 1 || saltlen > 64)\n\t\t\tgoto out;\n\n\t\tif (from_key)\n\t\t\tyescrypt_sha256_cipher(saltbin, saltlen, from_key, ENC);\n\t\tif (to_key)\n\t\t\tyescrypt_sha256_cipher(saltbin, saltlen, to_key, DEC);\n\t}\n\n\thashlen = sizeof(hashbin);\n\thashend = decode64(hashbin, &hashlen, hashstart, HASH_LEN);\n\tif (!hashend || *hashend || hashlen != sizeof(hashbin))\n\t\tgoto out;\n\n\tif (from_key)\n\t\tyescrypt_sha256_cipher(hashbin, hashlen, from_key, DEC);\n\tif (to_key)\n\t\tyescrypt_sha256_cipher(hashbin, hashlen, to_key, ENC);\n\n\tif (saltstrlen) {\n\t\tif (!encode64(saltstart, saltstrlen + 1, saltbin, saltlen))\n\t\t\tgoto out; /* can't happen */\n\t\t*(saltstart + saltstrlen) = '$';\n\t}\n\n\tif (!encode64(hashstart, HASH_LEN + 1, hashbin, hashlen))\n\t\tgoto out; /* can't happen */\n\n\tretval = hash;\n\nout:\n\texplicit_bzero(saltbin, sizeof(saltbin));\n\texplicit_bzero(hashbin, sizeof(hashbin));\n\n\treturn retval;\n}\n\nstatic uint32_t N2log2(uint64_t N)\n{\n\tuint32_t N_log2;\n\n\tif (N < 2)\n\t\treturn 0;\n\n\tN_log2 = 2;\n\twhile (N >> N_log2 != 0)\n\t\tN_log2++;\n\tN_log2--;\n\n\tif (N >> N_log2 != 1)\n\t\treturn 0;\n\n\treturn N_log2;\n}\n\nuint8_t *yescrypt_encode_params_r(const yescrypt_params_t *params,\n    const uint8_t *src, size_t srclen,\n    uint8_t *buf, size_t buflen)\n{\n\tuint32_t flavor, N_log2, NROM_log2, have;\n\tuint8_t *dst;\n\n\tif (srclen > SIZE_MAX / 16)\n\t\treturn NULL;\n\n\tif (params->flags < YESCRYPT_RW) {\n\t\tflavor = params->flags;\n\t} else if ((params->flags & YESCRYPT_MODE_MASK) == YESCRYPT_RW &&\n\t    params->flags <= (YESCRYPT_RW | YESCRYPT_RW_FLAVOR_MASK)) {\n\t\tflavor = YESCRYPT_RW + (params->flags >> 2);\n\t} else {\n\t\treturn NULL;\n\t}\n\n\tN_log2 = N2log2(params->N);\n\tif (!N_log2)\n\t\treturn NULL;\n\n\tNROM_log2 = N2log2(params->NROM);\n\tif (params->NROM && !NROM_log2)\n\t\treturn NULL;\n\n\tif ((uint64_t)params->r * (uint64_t)params->p >= (1U << 30))\n\t\treturn NULL;\n\n\tdst = buf;\n\t*dst++ = '$';\n\t*dst++ = 'y';\n\t*dst++ = '$';\n\n\tdst = encode64_uint32(dst, buflen - (dst - buf), flavor, 0);\n\tif (!dst)\n\t\treturn NULL;\n\n\tdst = encode64_uint32(dst, buflen - (dst - buf), N_log2, 1);\n\tif (!dst)\n\t\treturn NULL;\n\n\tdst = encode64_uint32(dst, buflen - (dst - buf), params->r, 1);\n\tif (!dst)\n\t\treturn NULL;\n\n\thave = 0;\n\tif (params->p != 1)\n\t\thave |= 1;\n\tif (params->t)\n\t\thave |= 2;\n\tif (params->g)\n\t\thave |= 4;\n\tif (NROM_log2)\n\t\thave |= 8;\n\n\tif (have) {\n\t\tdst = encode64_uint32(dst, buflen - (dst - buf), have, 1);\n\t\tif (!dst)\n\t\t\treturn NULL;\n\t}\n\n\tif (params->p != 1) {\n\t\tdst = encode64_uint32(dst, buflen - (dst - buf), params->p, 2);\n\t\tif (!dst)\n\t\t\treturn NULL;\n\t}\n\n\tif (params->t) {\n\t\tdst = encode64_uint32(dst, buflen - (dst - buf), params->t, 1);\n\t\tif (!dst)\n\t\t\treturn NULL;\n\t}\n\n\tif (params->g) {\n\t\tdst = encode64_uint32(dst, buflen - (dst - buf), params->g, 1);\n\t\tif (!dst)\n\t\t\treturn NULL;\n\t}\n\n\tif (NROM_log2) {\n\t\tdst = encode64_uint32(dst, buflen - (dst - buf), NROM_log2, 1);\n\t\tif (!dst)\n\t\t\treturn NULL;\n\t}\n\n\tif (dst >= buf + buflen)\n\t\treturn NULL;\n\n\t*dst++ = '$';\n\n\tdst = encode64(dst, buflen - (dst - buf), src, srclen);\n\tif (!dst || dst >= buf + buflen)\n\t\treturn NULL;\n\n\t*dst = 0; /* NUL termination */\n\n\treturn buf;\n}\n\nuint8_t *yescrypt_encode_params(const yescrypt_params_t *params,\n    const uint8_t *src, size_t srclen)\n{\n\t/* prefix, NUL */\n\tstatic uint8_t buf[PREFIX_LEN + 1];\n\treturn yescrypt_encode_params_r(params, src, srclen, buf, sizeof(buf));\n}\n\nint crypto_scrypt(const uint8_t *passwd, size_t passwdlen,\n    const uint8_t *salt, size_t saltlen, uint64_t N, uint32_t r, uint32_t p,\n    uint8_t *buf, size_t buflen)\n{\n\tyescrypt_local_t local;\n\tyescrypt_params_t params = { .flags = 0, .N = N, .r = r, .p = p };\n\tint retval;\n\n\tif (yescrypt_init_local(&local))\n\t\treturn -1;\n\tretval = yescrypt_kdf(NULL, &local,\n\t    passwd, passwdlen, salt, saltlen, &params, buf, buflen);\n\tif (yescrypt_free_local(&local))\n\t\treturn -1;\n\treturn retval;\n}\n\n#endif /* INCLUDE_yescrypt || INCLUDE_scrypt || INCLUDE_gost_yescrypt ||\n          INCLUDE_sm3_yescrypt */\n"
  },
  {
    "path": "lib/alg-yescrypt-opt.c",
    "content": "/*-\n * Copyright 2009 Colin Percival\n * Copyright 2012-2025 Alexander Peslyak\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n *\n * This file was originally written by Colin Percival as part of the Tarsnap\n * online backup system.\n */\n\n#include \"crypt-port.h\"\n\n#if INCLUDE_yescrypt || INCLUDE_scrypt || INCLUDE_gost_yescrypt || \\\n    INCLUDE_sm3_yescrypt\n\n#pragma GCC diagnostic ignored \"-Wcast-align\"\n#pragma GCC diagnostic ignored \"-Wconversion\"\n#ifdef __clang__\n#pragma GCC diagnostic ignored \"-Wtautological-constant-out-of-range-compare\"\n#endif\n\n/*\n * AVX and especially XOP speed up Salsa20 a lot, but this mostly matters for\n * classic scrypt and for YESCRYPT_WORM (which use 8 rounds of Salsa20 per\n * sub-block), and much less so for YESCRYPT_RW (which uses 2 rounds of Salsa20\n * per block except during pwxform S-box initialization).\n */\n#if 0\n#ifdef __XOP__\n#warning \"Note: XOP is enabled.  That's great.\"\n#elif defined(__AVX512VL__)\n#warning \"Note: AVX512VL is enabled.  That's great.\"\n#elif defined(__AVX__)\n#warning \"Note: AVX is enabled, which is great for classic scrypt and YESCRYPT_WORM, but is sometimes slightly slower than plain SSE2 for YESCRYPT_RW\"\n#elif defined(__SSE2__)\n#warning \"Note: AVX and XOP are not enabled, which is great for YESCRYPT_RW, but they would substantially improve performance at classic scrypt and YESCRYPT_WORM\"\n#elif defined(__x86_64__) || defined(__i386__)\n#warning \"SSE2 not enabled.  Expect poor performance.\"\n#else\n#warning \"Note: building generic code for non-x86.  That's OK.\"\n#endif\n#endif\n\n/*\n * The SSE4 code version has fewer instructions than the generic SSE2 version,\n * but all of the instructions are SIMD, thereby wasting the scalar execution\n * units.  Thus, the generic SSE2 version below actually runs faster on some\n * CPUs due to its balanced mix of SIMD and scalar instructions.\n */\n#undef USE_SSE4_FOR_32BIT\n\n#ifdef __SSE2__\n/*\n * GCC before 4.9 would by default unnecessarily use store/load (without\n * SSE4.1) or (V)PEXTR (with SSE4.1 or AVX) instead of simply (V)MOV.\n * This was tracked as GCC bug 54349.\n * \"-mtune=corei7\" works around this, but is only supported for GCC 4.6+.\n * We use inline asm for pre-4.6 GCC, further down this file.\n */\n#if __GNUC__ == 4 && __GNUC_MINOR__ >= 6 && __GNUC_MINOR__ < 9 && \\\n    !defined(__clang__) && !defined(__ICC)\n#pragma GCC target (\"tune=corei7\")\n#endif\n#include <emmintrin.h>\n#ifdef __XOP__\n#include <x86intrin.h>\n#elif defined(__AVX512VL__)\n#include <immintrin.h>\n#endif\n#elif defined(__SSE__)\n#include <xmmintrin.h>\n#endif\n\n#include <assert.h>\n#include <errno.h>\n#include <stdint.h>\n#include <stdlib.h>\n#include <string.h>\n\n#include \"alg-sha256.h\"\n#include \"byteorder.h\"\n\n#define YESCRYPT_INTERNAL\n#include \"alg-yescrypt.h\"\n\n#include \"alg-yescrypt-platform.c\"\n\n#if __STDC_VERSION__ >= 199901L\n/* Have restrict */\n#elif defined(__GNUC__)\n#define restrict __restrict\n#else\n#define restrict\n#endif\n\n#ifdef __GNUC__\n#define unlikely(exp) __builtin_expect(exp, 0)\n#else\n#define unlikely(exp) (exp)\n#endif\n\n#ifdef __SSE__\n#define PREFETCH(x, hint) _mm_prefetch((x), (hint));\n/* Older versions of clang have a bug in their xmmintrin.h that causes\n   spurious -Wcast-qual warnings on uses of _mm_prefetch.  */\n# if defined __clang_major__ && __clang_major__ < 11\n#  pragma clang diagnostic ignored \"-Wcast-qual\"\n# endif\n#else\n#undef PREFETCH\n#endif\n\ntypedef union {\n\tuint32_t w[16];\n\tuint64_t d[8];\n#ifdef __SSE2__\n\t__m128i q[4];\n#endif\n} salsa20_blk_t;\n\nstatic inline void salsa20_simd_shuffle(const salsa20_blk_t *Bin,\n    salsa20_blk_t *Bout)\n{\n#define COMBINE(out, in1, in2) \\\n\tBout->d[out] = Bin->w[in1 * 2] | ((uint64_t)Bin->w[in2 * 2 + 1] << 32);\n\tCOMBINE(0, 0, 2)\n\tCOMBINE(1, 5, 7)\n\tCOMBINE(2, 2, 4)\n\tCOMBINE(3, 7, 1)\n\tCOMBINE(4, 4, 6)\n\tCOMBINE(5, 1, 3)\n\tCOMBINE(6, 6, 0)\n\tCOMBINE(7, 3, 5)\n#undef COMBINE\n}\n\nstatic inline void salsa20_simd_unshuffle(const salsa20_blk_t *Bin,\n    salsa20_blk_t *Bout)\n{\n#define UNCOMBINE(out, in1, in2) \\\n\tBout->w[out * 2] = Bin->d[in1]; \\\n\tBout->w[out * 2 + 1] = Bin->d[in2] >> 32;\n\tUNCOMBINE(0, 0, 6)\n\tUNCOMBINE(1, 5, 3)\n\tUNCOMBINE(2, 2, 0)\n\tUNCOMBINE(3, 7, 5)\n\tUNCOMBINE(4, 4, 2)\n\tUNCOMBINE(5, 1, 7)\n\tUNCOMBINE(6, 6, 4)\n\tUNCOMBINE(7, 3, 1)\n#undef UNCOMBINE\n}\n\n#ifdef __SSE2__\n#define DECL_X \\\n\t__m128i X0, X1, X2, X3;\n#define DECL_Y \\\n\t__m128i Y0, Y1, Y2, Y3;\n#define READ_X(in) \\\n\tX0 = (in).q[0]; X1 = (in).q[1]; X2 = (in).q[2]; X3 = (in).q[3];\n#define WRITE_X(out) \\\n\t(out).q[0] = X0; (out).q[1] = X1; (out).q[2] = X2; (out).q[3] = X3;\n\n#ifdef __XOP__\n#define ARX(out, in1, in2, s) \\\n\tout = _mm_xor_si128(out, _mm_roti_epi32(_mm_add_epi32(in1, in2), s));\n#elif defined(__AVX512VL__)\n#define ARX(out, in1, in2, s) \\\n\tout = _mm_xor_si128(out, _mm_rol_epi32(_mm_add_epi32(in1, in2), s));\n#else\n#define ARX(out, in1, in2, s) { \\\n\t__m128i tmp = _mm_add_epi32(in1, in2); \\\n\tout = _mm_xor_si128(out, _mm_slli_epi32(tmp, s)); \\\n\tout = _mm_xor_si128(out, _mm_srli_epi32(tmp, 32 - s)); \\\n}\n#endif\n\n#define SALSA20_2ROUNDS \\\n\t/* Operate on \"columns\" */ \\\n\tARX(X1, X0, X3, 7) \\\n\tARX(X2, X1, X0, 9) \\\n\tARX(X3, X2, X1, 13) \\\n\tARX(X0, X3, X2, 18) \\\n\t/* Rearrange data */ \\\n\tX1 = _mm_shuffle_epi32(X1, 0x93); \\\n\tX2 = _mm_shuffle_epi32(X2, 0x4E); \\\n\tX3 = _mm_shuffle_epi32(X3, 0x39); \\\n\t/* Operate on \"rows\" */ \\\n\tARX(X3, X0, X1, 7) \\\n\tARX(X2, X3, X0, 9) \\\n\tARX(X1, X2, X3, 13) \\\n\tARX(X0, X1, X2, 18) \\\n\t/* Rearrange data */ \\\n\tX1 = _mm_shuffle_epi32(X1, 0x39); \\\n\tX2 = _mm_shuffle_epi32(X2, 0x4E); \\\n\tX3 = _mm_shuffle_epi32(X3, 0x93);\n\n/**\n * Apply the Salsa20 core to the block provided in (X0 ... X3).\n */\n#define SALSA20_wrapper(out, rounds) { \\\n\t__m128i Z0 = X0, Z1 = X1, Z2 = X2, Z3 = X3; \\\n\trounds \\\n\t(out).q[0] = X0 = _mm_add_epi32(X0, Z0); \\\n\t(out).q[1] = X1 = _mm_add_epi32(X1, Z1); \\\n\t(out).q[2] = X2 = _mm_add_epi32(X2, Z2); \\\n\t(out).q[3] = X3 = _mm_add_epi32(X3, Z3); \\\n}\n\n/**\n * Apply the Salsa20/2 core to the block provided in X.\n */\n#define SALSA20_2(out) \\\n\tSALSA20_wrapper(out, SALSA20_2ROUNDS)\n\n#define SALSA20_8ROUNDS \\\n\tSALSA20_2ROUNDS SALSA20_2ROUNDS SALSA20_2ROUNDS SALSA20_2ROUNDS\n\n#define XOR_X(in) \\\n\tX0 = _mm_xor_si128(X0, (in).q[0]); \\\n\tX1 = _mm_xor_si128(X1, (in).q[1]); \\\n\tX2 = _mm_xor_si128(X2, (in).q[2]); \\\n\tX3 = _mm_xor_si128(X3, (in).q[3]);\n\n#define XOR_X_2(in1, in2) \\\n\tX0 = _mm_xor_si128((in1).q[0], (in2).q[0]); \\\n\tX1 = _mm_xor_si128((in1).q[1], (in2).q[1]); \\\n\tX2 = _mm_xor_si128((in1).q[2], (in2).q[2]); \\\n\tX3 = _mm_xor_si128((in1).q[3], (in2).q[3]);\n\n#define XOR_X_WRITE_XOR_Y_2(out, in) \\\n\t(out).q[0] = Y0 = _mm_xor_si128((out).q[0], (in).q[0]); \\\n\t(out).q[1] = Y1 = _mm_xor_si128((out).q[1], (in).q[1]); \\\n\t(out).q[2] = Y2 = _mm_xor_si128((out).q[2], (in).q[2]); \\\n\t(out).q[3] = Y3 = _mm_xor_si128((out).q[3], (in).q[3]); \\\n\tX0 = _mm_xor_si128(X0, Y0); \\\n\tX1 = _mm_xor_si128(X1, Y1); \\\n\tX2 = _mm_xor_si128(X2, Y2); \\\n\tX3 = _mm_xor_si128(X3, Y3);\n\n/**\n * Apply the Salsa20/8 core to the block provided in X ^ in.\n */\n#define SALSA20_8_XOR_MEM(in, out) \\\n\tXOR_X(in) \\\n\tSALSA20_wrapper(out, SALSA20_8ROUNDS)\n\n#define INTEGERIFY (uint32_t)_mm_cvtsi128_si32(X0)\n\n#else /* !defined(__SSE2__) */\n\n#define DECL_X \\\n\tsalsa20_blk_t X;\n#define DECL_Y \\\n\tsalsa20_blk_t Y;\n\n#define COPY(out, in) \\\n\t(out).d[0] = (in).d[0]; \\\n\t(out).d[1] = (in).d[1]; \\\n\t(out).d[2] = (in).d[2]; \\\n\t(out).d[3] = (in).d[3]; \\\n\t(out).d[4] = (in).d[4]; \\\n\t(out).d[5] = (in).d[5]; \\\n\t(out).d[6] = (in).d[6]; \\\n\t(out).d[7] = (in).d[7];\n\n#define READ_X(in) COPY(X, in)\n#define WRITE_X(out) COPY(out, X)\n\n/**\n * salsa20(B):\n * Apply the Salsa20 core to the provided block.\n */\nstatic inline void salsa20(salsa20_blk_t *restrict B,\n    salsa20_blk_t *restrict Bout, uint32_t doublerounds)\n{\n\tsalsa20_blk_t X;\n#define x X.w\n\n\tsalsa20_simd_unshuffle(B, &X);\n\n\tdo {\n#define R(a,b) (((a) << (b)) | ((a) >> (32 - (b))))\n\t\t/* Operate on columns */\n\t\tx[ 4] ^= R(x[ 0]+x[12], 7);  x[ 8] ^= R(x[ 4]+x[ 0], 9);\n\t\tx[12] ^= R(x[ 8]+x[ 4],13);  x[ 0] ^= R(x[12]+x[ 8],18);\n\n\t\tx[ 9] ^= R(x[ 5]+x[ 1], 7);  x[13] ^= R(x[ 9]+x[ 5], 9);\n\t\tx[ 1] ^= R(x[13]+x[ 9],13);  x[ 5] ^= R(x[ 1]+x[13],18);\n\n\t\tx[14] ^= R(x[10]+x[ 6], 7);  x[ 2] ^= R(x[14]+x[10], 9);\n\t\tx[ 6] ^= R(x[ 2]+x[14],13);  x[10] ^= R(x[ 6]+x[ 2],18);\n\n\t\tx[ 3] ^= R(x[15]+x[11], 7);  x[ 7] ^= R(x[ 3]+x[15], 9);\n\t\tx[11] ^= R(x[ 7]+x[ 3],13);  x[15] ^= R(x[11]+x[ 7],18);\n\n\t\t/* Operate on rows */\n\t\tx[ 1] ^= R(x[ 0]+x[ 3], 7);  x[ 2] ^= R(x[ 1]+x[ 0], 9);\n\t\tx[ 3] ^= R(x[ 2]+x[ 1],13);  x[ 0] ^= R(x[ 3]+x[ 2],18);\n\n\t\tx[ 6] ^= R(x[ 5]+x[ 4], 7);  x[ 7] ^= R(x[ 6]+x[ 5], 9);\n\t\tx[ 4] ^= R(x[ 7]+x[ 6],13);  x[ 5] ^= R(x[ 4]+x[ 7],18);\n\n\t\tx[11] ^= R(x[10]+x[ 9], 7);  x[ 8] ^= R(x[11]+x[10], 9);\n\t\tx[ 9] ^= R(x[ 8]+x[11],13);  x[10] ^= R(x[ 9]+x[ 8],18);\n\n\t\tx[12] ^= R(x[15]+x[14], 7);  x[13] ^= R(x[12]+x[15], 9);\n\t\tx[14] ^= R(x[13]+x[12],13);  x[15] ^= R(x[14]+x[13],18);\n#undef R\n\t} while (--doublerounds);\n#undef x\n\n\t{\n\t\tuint32_t i;\n\t\tsalsa20_simd_shuffle(&X, Bout);\n\t\tfor (i = 0; i < 16; i += 4) {\n\t\t\tB->w[i] = Bout->w[i] += B->w[i];\n\t\t\tB->w[i + 1] = Bout->w[i + 1] += B->w[i + 1];\n\t\t\tB->w[i + 2] = Bout->w[i + 2] += B->w[i + 2];\n\t\t\tB->w[i + 3] = Bout->w[i + 3] += B->w[i + 3];\n\t\t}\n\t}\n\n#if 0\n\t/* Too expensive */\n\texplicit_bzero(&X, sizeof(X));\n#endif\n}\n\n/**\n * Apply the Salsa20/2 core to the block provided in X.\n */\n#define SALSA20_2(out) \\\n\tsalsa20(&X, &out, 1);\n\n#define XOR(out, in1, in2) \\\n\t(out).d[0] = (in1).d[0] ^ (in2).d[0]; \\\n\t(out).d[1] = (in1).d[1] ^ (in2).d[1]; \\\n\t(out).d[2] = (in1).d[2] ^ (in2).d[2]; \\\n\t(out).d[3] = (in1).d[3] ^ (in2).d[3]; \\\n\t(out).d[4] = (in1).d[4] ^ (in2).d[4]; \\\n\t(out).d[5] = (in1).d[5] ^ (in2).d[5]; \\\n\t(out).d[6] = (in1).d[6] ^ (in2).d[6]; \\\n\t(out).d[7] = (in1).d[7] ^ (in2).d[7];\n\n#define XOR_X(in) XOR(X, X, in)\n#define XOR_X_2(in1, in2) XOR(X, in1, in2)\n#define XOR_X_WRITE_XOR_Y_2(out, in) \\\n\tXOR(Y, out, in) \\\n\tCOPY(out, Y) \\\n\tXOR(X, X, Y)\n\n/**\n * Apply the Salsa20/8 core to the block provided in X ^ in.\n */\n#define SALSA20_8_XOR_MEM(in, out) \\\n\tXOR_X(in); \\\n\tsalsa20(&X, &out, 4);\n\n#define INTEGERIFY (uint32_t)X.d[0]\n#endif\n\n/**\n * blockmix_salsa8(Bin, Bout, r):\n * Compute Bout = BlockMix_{salsa20/8, r}(Bin).  The input Bin must be 128r\n * bytes in length; the output Bout must also be the same size.\n */\nstatic void blockmix_salsa8(const salsa20_blk_t *restrict Bin,\n    salsa20_blk_t *restrict Bout, size_t r)\n{\n\tsize_t i;\n\tDECL_X\n\n\tREAD_X(Bin[r * 2 - 1])\n\tfor (i = 0; i < r; i++) {\n\t\tSALSA20_8_XOR_MEM(Bin[i * 2], Bout[i])\n\t\tSALSA20_8_XOR_MEM(Bin[i * 2 + 1], Bout[r + i])\n\t}\n}\n\nstatic uint32_t blockmix_salsa8_xor(const salsa20_blk_t *restrict Bin1,\n    const salsa20_blk_t *restrict Bin2, salsa20_blk_t *restrict Bout,\n    size_t r)\n{\n\tsize_t i;\n\tDECL_X\n\n#ifdef PREFETCH\n\tPREFETCH(&Bin2[r * 2 - 1], _MM_HINT_T0)\n\tfor (i = 0; i < r - 1; i++) {\n\t\tPREFETCH(&Bin2[i * 2], _MM_HINT_T0)\n\t\tPREFETCH(&Bin2[i * 2 + 1], _MM_HINT_T0)\n\t}\n\tPREFETCH(&Bin2[i * 2], _MM_HINT_T0)\n#endif\n\n\tXOR_X_2(Bin1[r * 2 - 1], Bin2[r * 2 - 1])\n\tfor (i = 0; i < r; i++) {\n\t\tXOR_X(Bin1[i * 2])\n\t\tSALSA20_8_XOR_MEM(Bin2[i * 2], Bout[i])\n\t\tXOR_X(Bin1[i * 2 + 1])\n\t\tSALSA20_8_XOR_MEM(Bin2[i * 2 + 1], Bout[r + i])\n\t}\n\n\treturn INTEGERIFY;\n}\n\n/* This is tunable */\n#define Swidth 8\n\n/* Not tunable in this implementation, hard-coded in a few places */\n#define PWXsimple 2\n#define PWXgather 4\n\n/* Derived values.  Not tunable except via Swidth above. */\n#define PWXbytes (PWXgather * PWXsimple * 8)\n#define Sbytes (3 * (1 << Swidth) * PWXsimple * 8)\n#define Smask (((1 << Swidth) - 1) * PWXsimple * 8)\n#define Smask2 (((uint64_t)Smask << 32) | Smask)\n\n#define DECL_SMASK2REG /* empty */\n#define FORCE_REGALLOC_3 /* empty */\n#define MAYBE_MEMORY_BARRIER /* empty */\n\n#ifdef __SSE2__\n/*\n * (V)PSRLDQ and (V)PSHUFD have higher throughput than (V)PSRLQ on some CPUs\n * starting with Sandy Bridge.  Additionally, PSHUFD uses separate source and\n * destination registers, whereas the shifts would require an extra move\n * instruction for our code when building without AVX.  Unfortunately, PSHUFD\n * is much slower on Conroe (4 cycles latency vs. 1 cycle latency for PSRLQ)\n * and somewhat slower on some non-Intel CPUs (luckily not including AMD\n * Bulldozer and Piledriver).\n */\n#ifdef __AVX__\n#define HI32(X) \\\n\t_mm_srli_si128((X), 4)\n#elif 1 /* As an option, check for __SSE4_1__ here not to hurt Conroe */\n#define HI32(X) \\\n\t_mm_shuffle_epi32((X), _MM_SHUFFLE(2,3,0,1))\n#else\n#define HI32(X) \\\n\t_mm_srli_epi64((X), 32)\n#endif\n\n#if defined(__x86_64__) && \\\n    __GNUC__ == 4 && __GNUC_MINOR__ < 6 && !defined(__ICC)\n#ifdef __AVX__\n#define MOVQ \"vmovq\"\n#else\n/* \"movq\" would be more correct, but \"movd\" is supported by older binutils\n * due to an error in AMD's spec for x86-64. */\n#define MOVQ \"movd\"\n#endif\n#define EXTRACT64(X) ({ \\\n\tuint64_t result; \\\n\t__asm__(MOVQ \" %1, %0\" : \"=r\" (result) : \"x\" (X)); \\\n\tresult; \\\n})\n#elif defined(__x86_64__) && !defined(_MSC_VER) && !defined(__OPEN64__)\n/* MSVC and Open64 had bugs */\n#define EXTRACT64(X) _mm_cvtsi128_si64(X)\n#elif defined(__x86_64__) && defined(__SSE4_1__)\n/* No known bugs for this intrinsic */\n#include <smmintrin.h>\n#define EXTRACT64(X) _mm_extract_epi64((X), 0)\n#elif defined(USE_SSE4_FOR_32BIT) && defined(__SSE4_1__)\n/* 32-bit */\n#include <smmintrin.h>\n#if 0\n/* This is currently unused by the code below, which instead uses these two\n * intrinsics explicitly when (!defined(__x86_64__) && defined(__SSE4_1__)) */\n#define EXTRACT64(X) \\\n\t((uint64_t)(uint32_t)_mm_cvtsi128_si32(X) | \\\n\t((uint64_t)(uint32_t)_mm_extract_epi32((X), 1) << 32))\n#endif\n#else\n/* 32-bit or compilers with known past bugs in _mm_cvtsi128_si64() */\n#define EXTRACT64(X) \\\n\t((uint64_t)(uint32_t)_mm_cvtsi128_si32(X) | \\\n\t((uint64_t)(uint32_t)_mm_cvtsi128_si32(HI32(X)) << 32))\n#endif\n\n#if defined(__x86_64__) && (defined(__AVX__) || !defined(__GNUC__))\n/* 64-bit with AVX */\n/* Force use of 64-bit AND instead of two 32-bit ANDs */\n#undef DECL_SMASK2REG\n#if defined(__GNUC__) && !defined(__ICC)\n#define DECL_SMASK2REG uint64_t Smask2reg = Smask2;\n/* Force use of lower-numbered registers to reduce number of prefixes, relying\n * on out-of-order execution and register renaming. */\n#define FORCE_REGALLOC_1 \\\n\t__asm__(\"\" : \"=a\" (x), \"+d\" (Smask2reg), \"+S\" (S0), \"+D\" (S1));\n#define FORCE_REGALLOC_2 \\\n\t__asm__(\"\" : : \"c\" (lo));\n#else\nstatic volatile uint64_t Smask2var = Smask2;\n#define DECL_SMASK2REG uint64_t Smask2reg = Smask2var;\n#define FORCE_REGALLOC_1 /* empty */\n#define FORCE_REGALLOC_2 /* empty */\n#endif\n#define PWXFORM_SIMD(X) { \\\n\tuint64_t x; \\\n\tFORCE_REGALLOC_1 \\\n\tuint32_t lo = (uint32_t)(x = ((uint64_t)EXTRACT64(X)) & Smask2reg); \\\n\tFORCE_REGALLOC_2 \\\n\tuint32_t hi = x >> 32; \\\n\tX = _mm_mul_epu32(HI32(X), X); \\\n\tX = _mm_add_epi64(X, *(__m128i *)(S0 + lo)); \\\n\tX = _mm_xor_si128(X, *(__m128i *)(S1 + hi)); \\\n}\n#elif defined(__x86_64__)\n/* 64-bit without AVX.  This relies on out-of-order execution and register\n * renaming.  It may actually be fastest on CPUs with AVX(2) as well - e.g.,\n * it runs great on Haswell. */\n#if 0\n#warning \"Note: using x86-64 inline assembly for YESCRYPT_RW.  That's great.\"\n#endif\n/* We need a compiler memory barrier between sub-blocks to ensure that none of\n * the writes into what was S2 during processing of the previous sub-block are\n * postponed until after a read from S0 or S1 in the inline asm code below. */\n#undef MAYBE_MEMORY_BARRIER\n#define MAYBE_MEMORY_BARRIER \\\n\t__asm__(\"\" : : : \"memory\");\n#ifdef __ILP32__ /* x32 */\n#define REGISTER_PREFIX \"e\"\n#else\n#define REGISTER_PREFIX \"r\"\n#endif\n#define PWXFORM_SIMD(X) { \\\n\t__m128i H; \\\n\t__asm__( \\\n\t    \"movd %0, %%rax\\n\\t\" \\\n\t    \"pshufd $0xb1, %0, %1\\n\\t\" \\\n\t    \"andq %2, %%rax\\n\\t\" \\\n\t    \"pmuludq %1, %0\\n\\t\" \\\n\t    \"movl %%eax, %%ecx\\n\\t\" \\\n\t    \"shrq $0x20, %%rax\\n\\t\" \\\n\t    \"paddq (%3,%%\" REGISTER_PREFIX \"cx), %0\\n\\t\" \\\n\t    \"pxor (%4,%%\" REGISTER_PREFIX \"ax), %0\\n\\t\" \\\n\t    : \"+x\" (X), \"=x\" (H) \\\n\t    : \"d\" (Smask2), \"S\" (S0), \"D\" (S1) \\\n\t    : \"cc\", \"ax\", \"cx\"); \\\n}\n#elif defined(USE_SSE4_FOR_32BIT) && defined(__SSE4_1__)\n/* 32-bit with SSE4.1 */\n#define PWXFORM_SIMD(X) { \\\n\t__m128i x = _mm_and_si128(X, _mm_set1_epi64x(Smask2)); \\\n\t__m128i s0 = *(__m128i *)(S0 + (uint32_t)_mm_cvtsi128_si32(x)); \\\n\t__m128i s1 = *(__m128i *)(S1 + (uint32_t)_mm_extract_epi32(x, 1)); \\\n\tX = _mm_mul_epu32(HI32(X), X); \\\n\tX = _mm_add_epi64(X, s0); \\\n\tX = _mm_xor_si128(X, s1); \\\n}\n#else\n/* 32-bit without SSE4.1 */\n#define PWXFORM_SIMD(X) { \\\n\tuint64_t x = EXTRACT64(X) & Smask2; \\\n\t__m128i s0 = *(__m128i *)(S0 + (uint32_t)x); \\\n\t__m128i s1 = *(__m128i *)(S1 + (x >> 32)); \\\n\tX = _mm_mul_epu32(HI32(X), X); \\\n\tX = _mm_add_epi64(X, s0); \\\n\tX = _mm_xor_si128(X, s1); \\\n}\n#endif\n\n#define PWXFORM_ROUND \\\n\tPWXFORM_SIMD(X0) \\\n\tPWXFORM_SIMD(X1) \\\n\tPWXFORM_SIMD(X2) \\\n\tPWXFORM_SIMD(X3)\n\n#if defined(__x86_64__) && defined(__GNUC__) && !defined(__ICC)\n#undef FORCE_REGALLOC_3\n#define FORCE_REGALLOC_3 __asm__(\"\" : : \"b\" (Sw));\n#endif\n\n#else /* !defined(__SSE2__) */\n\n#define PWXFORM_SIMD(x0, x1) { \\\n\tuint64_t x = x0 & Smask2; \\\n\tuint64_t *p0 = (uint64_t *)(S0 + (uint32_t)x); \\\n\tuint64_t *p1 = (uint64_t *)(S1 + (x >> 32)); \\\n\tx0 = ((x0 >> 32) * (uint32_t)x0 + p0[0]) ^ p1[0]; \\\n\tx1 = ((x1 >> 32) * (uint32_t)x1 + p0[1]) ^ p1[1]; \\\n}\n\n#define PWXFORM_ROUND \\\n\tPWXFORM_SIMD(X.d[0], X.d[1]) \\\n\tPWXFORM_SIMD(X.d[2], X.d[3]) \\\n\tPWXFORM_SIMD(X.d[4], X.d[5]) \\\n\tPWXFORM_SIMD(X.d[6], X.d[7])\n#endif\n\n/*\n * This offset helps address the 256-byte write block via the single-byte\n * displacements encodable in x86(-64) instructions.  It is needed because the\n * displacements are signed.  Without it, we'd get 4-byte displacements for\n * half of the writes.  Setting it to 0x80 instead of 0x7c would avoid needing\n * a displacement for one of the writes, but then the LEA instruction would\n * need a 4-byte displacement.\n */\n#define PWXFORM_WRITE_OFFSET 0x7c\n\n#define PWXFORM_WRITE \\\n\tWRITE_X(*(salsa20_blk_t *)(Sw - PWXFORM_WRITE_OFFSET)) \\\n\tSw += 64;\n\n#define PWXFORM { \\\n\tuint8_t *Sw = S2 + w + PWXFORM_WRITE_OFFSET; \\\n\tFORCE_REGALLOC_3 \\\n\tMAYBE_MEMORY_BARRIER \\\n\tPWXFORM_ROUND \\\n\tPWXFORM_ROUND PWXFORM_WRITE \\\n\tPWXFORM_ROUND PWXFORM_WRITE \\\n\tPWXFORM_ROUND PWXFORM_WRITE \\\n\tPWXFORM_ROUND PWXFORM_WRITE \\\n\tPWXFORM_ROUND \\\n\tw = (w + 64 * 4) & Smask2; \\\n\t{ \\\n\t\tuint8_t *Stmp = S2; \\\n\t\tS2 = S1; \\\n\t\tS1 = S0; \\\n\t\tS0 = Stmp; \\\n\t} \\\n}\n\ntypedef struct {\n\tuint8_t *S0, *S1, *S2;\n\tsize_t w;\n} pwxform_ctx_t;\n\n#define Salloc (Sbytes + ((sizeof(pwxform_ctx_t) + 63) & ~63U))\n\n/**\n * blockmix_pwxform(Bin, Bout, r, S):\n * Compute Bout = BlockMix_pwxform{salsa20/2, r, S}(Bin).  The input Bin must\n * be 128r bytes in length; the output Bout must also be the same size.\n */\nstatic void blockmix(const salsa20_blk_t *restrict Bin,\n    salsa20_blk_t *restrict Bout, size_t r, pwxform_ctx_t *restrict ctx)\n{\n\t/* ctx MUST NOT be NULL */\n\tassert(ctx != NULL);\n\n\tuint8_t *S0 = ctx->S0, *S1 = ctx->S1, *S2 = ctx->S2;\n\tsize_t w = ctx->w;\n\tsize_t i;\n\tDECL_X\n\n\t/* Convert count of 128-byte blocks to max index of 64-byte block */\n\tr = r * 2 - 1;\n\n\tREAD_X(Bin[r])\n\n\tDECL_SMASK2REG\n\n\ti = 0;\n\tdo {\n\t\tXOR_X(Bin[i])\n\t\tPWXFORM\n\t\tif (unlikely(i >= r))\n\t\t\tbreak;\n\t\tWRITE_X(Bout[i])\n\t\ti++;\n\t} while (1);\n\n\tctx->S0 = S0; ctx->S1 = S1; ctx->S2 = S2;\n\tctx->w = w;\n\n\tSALSA20_2(Bout[i])\n}\n\nstatic uint32_t blockmix_xor(const salsa20_blk_t *Bin1,\n    const salsa20_blk_t *restrict Bin2, salsa20_blk_t *Bout,\n    size_t r, int Bin2_in_ROM, pwxform_ctx_t *restrict ctx)\n{\n\t/* ctx MUST NOT be NULL */\n\tassert(ctx != NULL);\n\n\tuint8_t *S0 = ctx->S0, *S1 = ctx->S1, *S2 = ctx->S2;\n\tsize_t w = ctx->w;\n\tsize_t i;\n\tDECL_X\n\n\t/* Convert count of 128-byte blocks to max index of 64-byte block */\n\tr = r * 2 - 1;\n\n#ifdef PREFETCH\n\tif (Bin2_in_ROM) {\n\t\tPREFETCH(&Bin2[r], _MM_HINT_NTA)\n\t\tfor (i = 0; i < r; i++) {\n\t\t\tPREFETCH(&Bin2[i], _MM_HINT_NTA)\n\t\t}\n\t} else {\n\t\tPREFETCH(&Bin2[r], _MM_HINT_T0)\n\t\tfor (i = 0; i < r; i++) {\n\t\t\tPREFETCH(&Bin2[i], _MM_HINT_T0)\n\t\t}\n\t}\n#else\n\t(void)Bin2_in_ROM; /* unused */\n#endif\n\n\tXOR_X_2(Bin1[r], Bin2[r])\n\n\tDECL_SMASK2REG\n\n\ti = 0;\n\tr--;\n\tdo {\n\t\tXOR_X(Bin1[i])\n\t\tXOR_X(Bin2[i])\n\t\tPWXFORM\n\t\tWRITE_X(Bout[i])\n\n\t\tXOR_X(Bin1[i + 1])\n\t\tXOR_X(Bin2[i + 1])\n\t\tPWXFORM\n\n\t\tif (unlikely(i >= r))\n\t\t\tbreak;\n\n\t\tWRITE_X(Bout[i + 1])\n\n\t\ti += 2;\n\t} while (1);\n\ti++;\n\n\tctx->S0 = S0; ctx->S1 = S1; ctx->S2 = S2;\n\tctx->w = w;\n\n\tSALSA20_2(Bout[i])\n\n\treturn INTEGERIFY;\n}\n\nstatic uint32_t blockmix_xor_save(salsa20_blk_t *restrict Bin1out,\n    salsa20_blk_t *restrict Bin2,\n    size_t r, pwxform_ctx_t *restrict ctx)\n{\n\t/* ctx MUST NOT be NULL */\n\tassert(ctx != NULL);\n\n\tuint8_t *S0 = ctx->S0, *S1 = ctx->S1, *S2 = ctx->S2;\n\tsize_t w = ctx->w;\n\tsize_t i;\n\tDECL_X\n\tDECL_Y\n\n\t/* Convert count of 128-byte blocks to max index of 64-byte block */\n\tr = r * 2 - 1;\n\n#ifdef PREFETCH\n\tPREFETCH(&Bin2[r], _MM_HINT_T0)\n\tfor (i = 0; i < r; i++) {\n\t\tPREFETCH(&Bin2[i], _MM_HINT_T0)\n\t}\n#endif\n\n\tXOR_X_2(Bin1out[r], Bin2[r])\n\n\tDECL_SMASK2REG\n\n\ti = 0;\n\tr--;\n\tdo {\n\t\tXOR_X_WRITE_XOR_Y_2(Bin2[i], Bin1out[i])\n\t\tPWXFORM\n\t\tWRITE_X(Bin1out[i])\n\n\t\tXOR_X_WRITE_XOR_Y_2(Bin2[i + 1], Bin1out[i + 1])\n\t\tPWXFORM\n\n\t\tif (unlikely(i >= r))\n\t\t\tbreak;\n\n\t\tWRITE_X(Bin1out[i + 1])\n\n\t\ti += 2;\n\t} while (1);\n\ti++;\n\n\tctx->S0 = S0; ctx->S1 = S1; ctx->S2 = S2;\n\tctx->w = w;\n\n\tSALSA20_2(Bin1out[i])\n\n\treturn INTEGERIFY;\n}\n\n/**\n * integerify(B, r):\n * Return the result of parsing B_{2r-1} as a little-endian integer.\n */\nstatic inline uint32_t integerify(const salsa20_blk_t *B, size_t r)\n{\n/*\n * Our 64-bit words are in host byte order, which is why we don't just read\n * w[0] here (would be wrong on big-endian).  Also, our 32-bit words are\n * SIMD-shuffled (so the next 32 bits would be part of d[6]), but currently\n * this does not matter as we only care about the least significant 32 bits.\n */\n\treturn (uint32_t)B[2 * r - 1].d[0];\n}\n\n/**\n * smix1(B, r, N, flags, V, NROM, VROM, XY, ctx):\n * Compute first loop of B = SMix_r(B, N).  The input B must be 128r bytes in\n * length; the temporary storage V must be 128rN bytes in length; the temporary\n * storage XY must be 128r+64 bytes in length.  N must be even and at least 4.\n * The array V must be aligned to a multiple of 64 bytes, and arrays B and XY\n * to a multiple of at least 16 bytes.\n */\nstatic void smix1(uint8_t *B, size_t r, uint32_t N, yescrypt_flags_t flags,\n    salsa20_blk_t *V, uint32_t NROM, const salsa20_blk_t *VROM,\n    salsa20_blk_t *XY, pwxform_ctx_t *ctx)\n{\n\tsize_t s = 2 * r;\n\tsalsa20_blk_t *X = V, *Y = &V[s];\n\tuint32_t i, j;\n\n\tfor (i = 0; i < 2 * r; i++) {\n\t\tconst salsa20_blk_t *src = (salsa20_blk_t *)&B[i * 64];\n\t\tsalsa20_blk_t *tmp = Y;\n\t\tsalsa20_blk_t *dst = &X[i];\n\t\tsize_t k;\n\t\tfor (k = 0; k < 16; k++)\n\t\t\ttmp->w[k] = le32dec((const uint8_t *) &src->w[k]);\n\t\tsalsa20_simd_shuffle(tmp, dst);\n\t}\n\n\tif (VROM) {\n\t\tuint32_t n;\n\t\tconst salsa20_blk_t *V_j;\n\n\t\tV_j = &VROM[(NROM - 1) * s];\n\t\tj = blockmix_xor(X, V_j, Y, r, 1, ctx) & (NROM - 1);\n\t\tV_j = &VROM[j * s];\n\t\tX = Y + s;\n\t\tj = blockmix_xor(Y, V_j, X, r, 1, ctx);\n\n\t\tfor (n = 2; n < N; n <<= 1) {\n\t\t\tuint32_t m = (n < N / 2) ? n : (N - 1 - n);\n\t\t\tfor (i = 1; i < m; i += 2) {\n\t\t\t\tj &= n - 1;\n\t\t\t\tj += i - 1;\n\t\t\t\tV_j = &V[j * s];\n\t\t\t\tY = X + s;\n\t\t\t\tj = blockmix_xor(X, V_j, Y, r, 0, ctx) & (NROM - 1);\n\t\t\t\tV_j = &VROM[j * s];\n\t\t\t\tX = Y + s;\n\t\t\t\tj = blockmix_xor(Y, V_j, X, r, 1, ctx);\n\t\t\t}\n\t\t}\n\t\tn >>= 1;\n\n\t\tj &= n - 1;\n\t\tj += N - 2 - n;\n\t\tV_j = &V[j * s];\n\t\tY = X + s;\n\t\tj = blockmix_xor(X, V_j, Y, r, 0, ctx) & (NROM - 1);\n\t\tV_j = &VROM[j * s];\n\t\tblockmix_xor(Y, V_j, XY, r, 1, ctx);\n\t} else if (flags & YESCRYPT_RW) {\n\t\tuint32_t n;\n\t\tsalsa20_blk_t *V_j;\n\n\t\tblockmix(X, Y, r, ctx);\n\t\tX = Y + s;\n\t\tblockmix(Y, X, r, ctx);\n\t\tj = integerify(X, r);\n\n\t\tfor (n = 2; n < N; n <<= 1) {\n\t\t\tuint32_t m = (n < N / 2) ? n : (N - 1 - n);\n\t\t\tfor (i = 1; i < m; i += 2) {\n\t\t\t\tY = X + s;\n\t\t\t\tj &= n - 1;\n\t\t\t\tj += i - 1;\n\t\t\t\tV_j = &V[j * s];\n\t\t\t\tj = blockmix_xor(X, V_j, Y, r, 0, ctx);\n\t\t\t\tj &= n - 1;\n\t\t\t\tj += i;\n\t\t\t\tV_j = &V[j * s];\n\t\t\t\tX = Y + s;\n\t\t\t\tj = blockmix_xor(Y, V_j, X, r, 0, ctx);\n\t\t\t}\n\t\t}\n\t\tn >>= 1;\n\n\t\tj &= n - 1;\n\t\tj += N - 2 - n;\n\t\tV_j = &V[j * s];\n\t\tY = X + s;\n\t\tj = blockmix_xor(X, V_j, Y, r, 0, ctx);\n\t\tj &= n - 1;\n\t\tj += N - 1 - n;\n\t\tV_j = &V[j * s];\n\t\tblockmix_xor(Y, V_j, XY, r, 0, ctx);\n\t} else {\n\t\tN -= 2;\n\t\tdo {\n\t\t\tblockmix_salsa8(X, Y, r);\n\t\t\tX = Y + s;\n\t\t\tblockmix_salsa8(Y, X, r);\n\t\t\tY = X + s;\n\t\t} while ((N -= 2));\n\n\t\tblockmix_salsa8(X, Y, r);\n\t\tblockmix_salsa8(Y, XY, r);\n\t}\n\n\tfor (i = 0; i < 2 * r; i++) {\n\t\tconst salsa20_blk_t *src = &XY[i];\n\t\tsalsa20_blk_t *tmp = &XY[s];\n\t\tsalsa20_blk_t *dst = (salsa20_blk_t *)&B[i * 64];\n\t\tsize_t k;\n\t\tfor (k = 0; k < 16; k++)\n\t\t\tle32enc((uint8_t *)&tmp->w[k], src->w[k]);\n\t\tsalsa20_simd_unshuffle(tmp, dst);\n\t}\n}\n\n/**\n * smix2(B, r, N, Nloop, flags, V, NROM, VROM, XY, ctx):\n * Compute second loop of B = SMix_r(B, N).  The input B must be 128r bytes in\n * length; the temporary storage V must be 128rN bytes in length; the temporary\n * storage XY must be 256r bytes in length.  N must be a power of 2 and at\n * least 2.  Nloop must be even.  The array V must be aligned to a multiple of\n * 64 bytes, and arrays B and XY to a multiple of at least 16 bytes.\n */\nstatic void smix2(uint8_t *B, size_t r, uint32_t N, uint64_t Nloop,\n    yescrypt_flags_t flags, salsa20_blk_t *V, uint32_t NROM,\n    const salsa20_blk_t *VROM, salsa20_blk_t *XY, pwxform_ctx_t *ctx)\n{\n\tsize_t s = 2 * r;\n\tsalsa20_blk_t *X = XY, *Y = &XY[s];\n\tuint32_t i, j;\n\n\tif (Nloop == 0)\n\t\treturn;\n\n\tfor (i = 0; i < 2 * r; i++) {\n\t\tconst salsa20_blk_t *src = (salsa20_blk_t *)&B[i * 64];\n\t\tsalsa20_blk_t *tmp = Y;\n\t\tsalsa20_blk_t *dst = &X[i];\n\t\tsize_t k;\n\t\tfor (k = 0; k < 16; k++)\n\t\t\ttmp->w[k] = le32dec((const uint8_t *)&src->w[k]);\n\t\tsalsa20_simd_shuffle(tmp, dst);\n\t}\n\n\tj = integerify(X, r) & (N - 1);\n\n/*\n * Normally, VROM implies YESCRYPT_RW, but we check for these separately\n * because our SMix resets YESCRYPT_RW for the smix2() calls operating on the\n * entire V when p > 1.\n */\n\tif (VROM && (flags & YESCRYPT_RW)) {\n\t\tdo {\n\t\t\tsalsa20_blk_t *V_j = &V[j * s];\n\t\t\tconst salsa20_blk_t *VROM_j;\n\t\t\tj = blockmix_xor_save(X, V_j, r, ctx) & (NROM - 1);\n\t\t\tVROM_j = &VROM[j * s];\n\t\t\tj = blockmix_xor(X, VROM_j, X, r, 1, ctx) & (N - 1);\n\t\t} while (Nloop -= 2);\n\t} else if (VROM) {\n\t\tdo {\n\t\t\tconst salsa20_blk_t *V_j = &V[j * s];\n\t\t\tj = blockmix_xor(X, V_j, X, r, 0, ctx) & (NROM - 1);\n\t\t\tV_j = &VROM[j * s];\n\t\t\tj = blockmix_xor(X, V_j, X, r, 1, ctx) & (N - 1);\n\t\t} while (Nloop -= 2);\n\t} else if (flags & YESCRYPT_RW) {\n\t\tdo {\n\t\t\tsalsa20_blk_t *V_j = &V[j * s];\n\t\t\tj = blockmix_xor_save(X, V_j, r, ctx) & (N - 1);\n\t\t\tV_j = &V[j * s];\n\t\t\tj = blockmix_xor_save(X, V_j, r, ctx) & (N - 1);\n\t\t} while (Nloop -= 2);\n\t} else if (ctx) {\n\t\tdo {\n\t\t\tconst salsa20_blk_t *V_j = &V[j * s];\n\t\t\tj = blockmix_xor(X, V_j, X, r, 0, ctx) & (N - 1);\n\t\t\tV_j = &V[j * s];\n\t\t\tj = blockmix_xor(X, V_j, X, r, 0, ctx) & (N - 1);\n\t\t} while (Nloop -= 2);\n\t} else {\n\t\tdo {\n\t\t\tconst salsa20_blk_t *V_j = &V[j * s];\n\t\t\tj = blockmix_salsa8_xor(X, V_j, Y, r) & (N - 1);\n\t\t\tV_j = &V[j * s];\n\t\t\tj = blockmix_salsa8_xor(Y, V_j, X, r) & (N - 1);\n\t\t} while (Nloop -= 2);\n\t}\n\n\tfor (i = 0; i < 2 * r; i++) {\n\t\tconst salsa20_blk_t *src = &X[i];\n\t\tsalsa20_blk_t *tmp = Y;\n\t\tsalsa20_blk_t *dst = (salsa20_blk_t *)&B[i * 64];\n\t\tsize_t k;\n\t\tfor (k = 0; k < 16; k++)\n\t\t\tle32enc((uint8_t *)&tmp->w[k], src->w[k]);\n\t\tsalsa20_simd_unshuffle(tmp, dst);\n\t}\n}\n\n/**\n * p2floor(x):\n * Largest power of 2 not greater than argument.\n */\nstatic uint64_t p2floor(uint64_t x)\n{\n\tuint64_t y;\n\twhile ((y = x & (x - 1)))\n\t\tx = y;\n\treturn x;\n}\n\n/**\n * smix(B, r, N, p, t, flags, V, NROM, VROM, XY, S, passwd):\n * Compute B = SMix_r(B, N).  The input B must be 128rp bytes in length; the\n * temporary storage V must be 128rN bytes in length; the temporary storage\n * XY must be 256r or 256rp bytes in length (the larger size is required with\n * OpenMP-enabled builds).  N must be a power of 2 and at least 4.  The array V\n * must be aligned to a multiple of 64 bytes, and arrays B and XY to a multiple\n * of at least 16 bytes (aligning them to 64 bytes as well saves cache lines\n * and helps avoid false sharing in OpenMP-enabled builds when p > 1, but it\n * might also result in cache bank conflicts).\n */\nstatic void smix(uint8_t *B, size_t r, uint32_t N, uint32_t p, uint32_t t,\n    yescrypt_flags_t flags,\n    salsa20_blk_t *V, uint32_t NROM, const salsa20_blk_t *VROM,\n    salsa20_blk_t *XY, uint8_t *S, uint8_t *passwd)\n{\n\tsize_t s = 2 * r;\n\tuint32_t Nchunk;\n\tuint64_t Nloop_all, Nloop_rw;\n\tuint32_t i;\n\n\tNchunk = N / p;\n\tNloop_all = Nchunk;\n\tif (flags & YESCRYPT_RW) {\n\t\tif (t <= 1) {\n\t\t\tif (t)\n\t\t\t\tNloop_all *= 2; /* 2/3 */\n\t\t\tNloop_all = (Nloop_all + 2) / 3; /* 1/3, round up */\n\t\t} else {\n\t\t\tNloop_all *= t - 1;\n\t\t}\n\t} else if (t) {\n\t\tif (t == 1)\n\t\t\tNloop_all += (Nloop_all + 1) / 2; /* 1.5, round up */\n\t\tNloop_all *= t;\n\t}\n\n\tNloop_rw = 0;\n\tif (flags & YESCRYPT_INIT_SHARED)\n\t\tNloop_rw = Nloop_all;\n\telse if (flags & YESCRYPT_RW)\n\t\tNloop_rw = Nloop_all / p;\n\n\tNchunk &= ~(uint32_t)1; /* round down to even */\n\tNloop_all++; Nloop_all &= ~(uint64_t)1; /* round up to even */\n\tNloop_rw++; Nloop_rw &= ~(uint64_t)1; /* round up to even */\n\n#ifdef _OPENMP\n#pragma omp parallel if (p > 1) default(none) private(i) shared(B, r, N, p, flags, V, NROM, VROM, XY, S, passwd, s, Nchunk, Nloop_all, Nloop_rw)\n\t{\n#pragma omp for\n#endif\n\tfor (i = 0; i < p; i++) {\n\t\tuint32_t Vchunk = i * Nchunk;\n\t\tuint32_t Np = (i < p - 1) ? Nchunk : (N - Vchunk);\n\t\tuint8_t *Bp = &B[128 * r * i];\n\t\tsalsa20_blk_t *Vp = &V[Vchunk * s];\n#ifdef _OPENMP\n\t\tsalsa20_blk_t *XYp = &XY[i * (2 * s)];\n#else\n\t\tsalsa20_blk_t *XYp = XY;\n#endif\n\t\tpwxform_ctx_t *ctx_i = NULL;\n\t\tif (flags & YESCRYPT_RW) {\n\t\t\tuint8_t *Si = S + i * Salloc;\n\t\t\tsmix1(Bp, 1, Sbytes / 128, 0 /* no flags */,\n\t\t\t    (salsa20_blk_t *)Si, 0, NULL, XYp, NULL);\n\t\t\tctx_i = (pwxform_ctx_t *)(Si + Sbytes);\n\t\t\tctx_i->S2 = Si;\n\t\t\tctx_i->S1 = Si + Sbytes / 3;\n\t\t\tctx_i->S0 = Si + Sbytes / 3 * 2;\n\t\t\tctx_i->w = 0;\n\t\t\tif (i == 0)\n\t\t\t\tHMAC_SHA256_Buf(Bp + (128 * r - 64), 64,\n\t\t\t\t    passwd, 32, passwd);\n\t\t}\n\t\tsmix1(Bp, r, Np, flags, Vp, NROM, VROM, XYp, ctx_i);\n\t\tsmix2(Bp, r, p2floor(Np), Nloop_rw, flags, Vp,\n\t\t    NROM, VROM, XYp, ctx_i);\n\t}\n\n\tif (Nloop_all > Nloop_rw) {\n#ifdef _OPENMP\n#pragma omp for\n#endif\n\t\tfor (i = 0; i < p; i++) {\n\t\t\tuint8_t *Bp = &B[128 * r * i];\n#ifdef _OPENMP\n\t\t\tsalsa20_blk_t *XYp = &XY[i * (2 * s)];\n#else\n\t\t\tsalsa20_blk_t *XYp = XY;\n#endif\n\t\t\tpwxform_ctx_t *ctx_i = NULL;\n\t\t\tif (flags & YESCRYPT_RW) {\n\t\t\t\tuint8_t *Si = S + i * Salloc;\n\t\t\t\tctx_i = (pwxform_ctx_t *)(Si + Sbytes);\n\t\t\t}\n\t\t\tsmix2(Bp, r, N, Nloop_all - Nloop_rw,\n                              flags & (yescrypt_flags_t)~YESCRYPT_RW,\n                              V, NROM, VROM, XYp, ctx_i);\n\t\t}\n\t}\n#ifdef _OPENMP\n\t}\n#endif\n}\n\n/**\n * yescrypt_kdf_body(shared, local, passwd, passwdlen, salt, saltlen,\n *     flags, N, r, p, t, NROM, buf, buflen):\n * Compute scrypt(passwd[0 .. passwdlen - 1], salt[0 .. saltlen - 1], N, r,\n * p, buflen), or a revision of scrypt as requested by flags and shared, and\n * write the result into buf.\n *\n * shared and flags may request special modes as described in yescrypt.h.\n *\n * local is the thread-local data structure, allowing to preserve and reuse a\n * memory allocation across calls, thereby reducing its overhead.\n *\n * t controls computation time while not affecting peak memory usage.\n *\n * Return 0 on success; or -1 on error.\n *\n * This optimized implementation currently limits N to the range from 4 to\n * 2^31, but other implementations might not.\n */\nstatic int yescrypt_kdf_body(const yescrypt_shared_t *shared,\n    yescrypt_local_t *local,\n    const uint8_t *passwd, size_t passwdlen,\n    const uint8_t *salt, size_t saltlen,\n    yescrypt_flags_t flags, uint64_t N, uint32_t r, uint32_t p, uint32_t t,\n    uint64_t NROM,\n    uint8_t *buf, size_t buflen)\n{\n\tyescrypt_region_t tmp;\n\tconst salsa20_blk_t *VROM;\n\tsize_t B_size, V_size, XY_size, need;\n\tuint8_t *B, *S;\n\tsalsa20_blk_t *V, *XY;\n\tuint8_t sha256[32];\n\tuint8_t dk[sizeof(sha256)], *dkp = buf;\n\n\t/* Sanity-check parameters */\n\tswitch (flags & YESCRYPT_MODE_MASK) {\n\tcase 0: /* classic scrypt - can't have anything non-standard */\n\t\tif (flags || t || NROM)\n\t\t\tgoto out_EINVAL;\n\t\tbreak;\n\tcase YESCRYPT_WORM:\n\t\tif (flags != YESCRYPT_WORM || NROM)\n\t\t\tgoto out_EINVAL;\n\t\tbreak;\n\tcase YESCRYPT_RW:\n\t\tif (flags != (flags & YESCRYPT_KNOWN_FLAGS))\n\t\t\tgoto out_EINVAL;\n#if PWXsimple == 2 && PWXgather == 4 && Sbytes == 12288\n\t\tif ((flags & YESCRYPT_RW_FLAVOR_MASK) ==\n\t\t    (YESCRYPT_ROUNDS_6 | YESCRYPT_GATHER_4 |\n\t\t    YESCRYPT_SIMPLE_2 | YESCRYPT_SBOX_12K))\n\t\t\tbreak;\n#else\n#error \"Unsupported pwxform settings\"\n#endif\n\t\t/* FALLTHRU */\n\tdefault:\n\t\tgoto out_EINVAL;\n\t}\n#if SIZE_MAX > UINT32_MAX\n\tif (buflen > (((uint64_t)1 << 32) - 1) * 32)\n\t\tgoto out_EINVAL;\n#endif\n\tif ((uint64_t)r * (uint64_t)p >= 1 << 30)\n\t\tgoto out_EINVAL;\n\tif (N > UINT32_MAX)\n\t\tgoto out_EINVAL;\n\tif ((N & (N - 1)) != 0 || N <= 3 || r < 1 || p < 1)\n\t\tgoto out_EINVAL;\n\tif (r > SIZE_MAX / 256 / p ||\n\t    N > SIZE_MAX / 128 / r)\n\t\tgoto out_EINVAL;\n\tif (flags & YESCRYPT_RW) {\n\t\t/* p cannot be greater than SIZE_MAX/Salloc on 64-bit systems,\n\t\t   but it can on 32-bit systems.  */\n#pragma GCC diagnostic push\n#pragma GCC diagnostic ignored \"-Wtype-limits\"\n\t\tif (N / p <= 3 || p > SIZE_MAX / Salloc)\n\t\t\tgoto out_EINVAL;\n#pragma GCC diagnostic pop\n\t}\n#ifdef _OPENMP\n\telse if (N > SIZE_MAX / 128 / (r * p)) {\n\t\tgoto out_EINVAL;\n\t}\n#endif\n\n\tVROM = NULL;\n\tif (shared) {\n\t\tuint64_t expected_size = (size_t)128 * r * NROM;\n\t\t// coverity[overflow_const]\n\t\tif ((NROM & (NROM - 1)) != 0 ||\n\t\t    NROM <= 1 || NROM > UINT32_MAX ||\n\t\t    shared->aligned_size < expected_size)\n\t\t\tgoto out_EINVAL;\n\t\tif (!(flags & YESCRYPT_INIT_SHARED)) {\n\t\t\tuint64_t *tag = (uint64_t *)\n\t\t\t    ((uint8_t *)shared->aligned + expected_size - 48);\n\t\t\tif (tag[0] != YESCRYPT_ROM_TAG1 || tag[1] != YESCRYPT_ROM_TAG2)\n\t\t\t\tgoto out_EINVAL;\n\t\t}\n\t\tVROM = shared->aligned;\n\t} else {\n\t\tif (NROM)\n\t\t\tgoto out_EINVAL;\n\t}\n\n\t/* Allocate memory */\n\tV = NULL;\n\tV_size = (size_t)128 * r * N;\n#ifdef _OPENMP\n\tif (!(flags & YESCRYPT_RW))\n\t\tV_size *= p;\n#endif\n\tneed = V_size;\n\tif (flags & YESCRYPT_INIT_SHARED) {\n\t\tif (local->aligned_size < need) {\n\t\t\tif (local->base || local->aligned ||\n\t\t\t    local->base_size || local->aligned_size)\n\t\t\t\tgoto out_EINVAL;\n\t\t\tif (!alloc_region(local, need))\n\t\t\t\treturn -1;\n\t\t}\n\t\tif (flags & YESCRYPT_ALLOC_ONLY)\n\t\t\treturn -2; /* expected \"failure\" */\n\t\tV = (salsa20_blk_t *)local->aligned;\n\t\tneed = 0;\n\t}\n\tB_size = (size_t)128 * r * p;\n\tneed += B_size;\n\tif (need < B_size)\n\t\tgoto out_EINVAL;\n\tXY_size = (size_t)256 * r;\n#ifdef _OPENMP\n\tXY_size *= p;\n#endif\n\tneed += XY_size;\n\tif (need < XY_size)\n\t\tgoto out_EINVAL;\n\tif (flags & YESCRYPT_RW) {\n\t\tsize_t S_size = (size_t)Salloc * p;\n\t\tneed += S_size;\n\t\tif (need < S_size)\n\t\t\tgoto out_EINVAL;\n\t}\n\tif (flags & YESCRYPT_INIT_SHARED) {\n\t\tif (!alloc_region(&tmp, need))\n\t\t\treturn -1;\n\t\tB = (uint8_t *)tmp.aligned;\n\t\tXY = (salsa20_blk_t *)((uint8_t *)B + B_size);\n\t} else {\n\t\tinit_region(&tmp);\n\t\tif (local->aligned_size < need) {\n\t\t\tif (free_region(local))\n\t\t\t\treturn -1;\n\t\t\tif (!alloc_region(local, need))\n\t\t\t\treturn -1;\n\t\t}\n\t\tif (flags & YESCRYPT_ALLOC_ONLY)\n\t\t\treturn -3; /* expected \"failure\" */\n\t\tB = (uint8_t *)local->aligned;\n\t\tV = (salsa20_blk_t *)((uint8_t *)B + B_size);\n\t\tXY = (salsa20_blk_t *)((uint8_t *)V + V_size);\n\t}\n\tS = NULL;\n\tif (flags & YESCRYPT_RW)\n\t\tS = (uint8_t *)XY + XY_size;\n\n\tif (flags) {\n\t\tHMAC_SHA256_Buf(\"yescrypt-prehash\",\n\t\t    (flags & YESCRYPT_PREHASH) ? 16 : 8,\n\t\t    passwd, passwdlen, sha256);\n\t\tpasswd = sha256;\n\t\tpasswdlen = sizeof(sha256);\n\t}\n\n\tPBKDF2_SHA256(passwd, passwdlen, salt, saltlen, 1, B, B_size);\n\n\tif (flags)\n\t\tmemcpy(sha256, B, sizeof(sha256));\n\n\tif (p == 1 || (flags & YESCRYPT_RW)) {\n\t\tsmix(B, r, N, p, t, flags, V, NROM, VROM, XY, S, sha256);\n\t} else {\n\t\tuint32_t i;\n#ifdef _OPENMP\n#pragma omp parallel for default(none) private(i) shared(B, r, N, p, t, flags, V, NROM, VROM, XY, S)\n#endif\n\t\tfor (i = 0; i < p; i++) {\n#ifdef _OPENMP\n\t\t\tsmix(&B[(size_t)128 * r * i], r, N, 1, t, flags,\n\t\t\t    &V[(size_t)2 * r * i * N],\n\t\t\t    NROM, VROM,\n\t\t\t    &XY[(size_t)4 * r * i], NULL, NULL);\n#else\n\t\t\tsmix(&B[(size_t)128 * r * i], r, N, 1, t, flags, V,\n\t\t\t    NROM, VROM, XY, NULL, NULL);\n#endif\n\t\t}\n\t}\n\n\tdkp = buf;\n\tif (flags && buflen < sizeof(dk)) {\n\t\tPBKDF2_SHA256(passwd, passwdlen, B, B_size, 1, dk, sizeof(dk));\n\t\tdkp = dk;\n\t}\n\n\tPBKDF2_SHA256(passwd, passwdlen, B, B_size, 1, buf, buflen);\n\n\t/*\n\t * Except when computing classic scrypt, allow all computation so far\n\t * to be performed on the client.  The final steps below match those of\n\t * SCRAM (RFC 5802), so that an extension of SCRAM (with the steps so\n\t * far in place of SCRAM's use of PBKDF2 and with SHA-256 in place of\n\t * SCRAM's use of SHA-1) would be usable with yescrypt hashes.\n\t */\n\tif (flags && !(flags & YESCRYPT_PREHASH)) {\n\t\t/* Compute ClientKey */\n\t\tHMAC_SHA256_Buf(dkp, sizeof(dk), \"Client Key\", 10, sha256);\n\t\t/* Compute StoredKey */\n\t\t{\n\t\t\tsize_t clen = buflen;\n\t\t\tif (clen > sizeof(dk))\n\t\t\t\tclen = sizeof(dk);\n\t\t\tSHA256_Buf(sha256, sizeof(sha256), dk);\n\t\t\tmemcpy(buf, dk, clen);\n\t\t}\n\t}\n\n\tif (flags) {\n\t\texplicit_bzero(sha256, sizeof(sha256));\n\t\texplicit_bzero(dk, sizeof(dk));\n\t}\n\n\tif (free_region(&tmp)) {\n\t\texplicit_bzero(buf, buflen); /* must preserve errno */\n\t\treturn -1;\n\t}\n\n\t/* Success! */\n\treturn 0;\n\nout_EINVAL:\n\terrno = EINVAL;\n\treturn -1;\n}\n\n/**\n * yescrypt_kdf(shared, local, passwd, passwdlen, salt, saltlen, params,\n *     buf, buflen):\n * Compute scrypt or its revision as requested by the parameters.  The inputs\n * to this function are the same as those for yescrypt_kdf_body() above, with\n * the addition of g, which controls hash upgrades (0 for no upgrades so far).\n */\nint yescrypt_kdf(const yescrypt_shared_t *shared, yescrypt_local_t *local,\n    const uint8_t *passwd, size_t passwdlen,\n    const uint8_t *salt, size_t saltlen,\n    const yescrypt_params_t *params,\n    uint8_t *buf, size_t buflen)\n{\n\tyescrypt_flags_t flags = params->flags;\n\tuint64_t N = params->N;\n\tuint32_t r = params->r;\n\tuint32_t p = params->p;\n\tuint32_t t = params->t;\n\tuint32_t g = params->g;\n\tuint64_t NROM = params->NROM;\n\tuint8_t dk[32];\n\tint retval;\n\n\t/* Support for hash upgrades has been temporarily removed */\n\tif (g) {\n\t\terrno = EINVAL;\n\t\treturn -1;\n\t}\n\n\tif ((flags & (YESCRYPT_RW | YESCRYPT_INIT_SHARED)) == YESCRYPT_RW &&\n\t    p >= 1 && N / p >= 0x100 && N / p * r >= 0x20000) {\n\t\tif (yescrypt_kdf_body(shared, local,\n\t\t    passwd, passwdlen, salt, saltlen,\n\t\t    flags | YESCRYPT_ALLOC_ONLY, N, r, p, t, NROM,\n\t\t    buf, buflen) != -3) {\n\t\t\terrno = EINVAL;\n\t\t\treturn -1;\n\t\t}\n\t\tif ((retval = yescrypt_kdf_body(shared, local,\n\t\t    passwd, passwdlen, salt, saltlen,\n\t\t    flags | YESCRYPT_PREHASH, N >> 6, r, p, 0, NROM,\n\t\t    dk, sizeof(dk))))\n\t\t\treturn retval;\n\t\tpasswd = dk;\n\t\tpasswdlen = sizeof(dk);\n\t}\n\n\tretval = yescrypt_kdf_body(shared, local,\n\t    passwd, passwdlen, salt, saltlen,\n\t    flags, N, r, p, t, NROM, buf, buflen);\n#ifndef SKIP_MEMZERO\n\tif (passwd == dk)\n\t\texplicit_bzero(dk, sizeof(dk));\n#endif\n\treturn retval;\n}\n\nint yescrypt_init_shared(yescrypt_shared_t *shared,\n    const uint8_t *seed, size_t seedlen,\n    const yescrypt_params_t *params)\n{\n\tyescrypt_params_t subparams;\n\tyescrypt_shared_t half1, half2;\n\tuint8_t salt[32];\n\tuint64_t *tag;\n\n\tsubparams = *params;\n\tsubparams.flags |= YESCRYPT_INIT_SHARED;\n\tsubparams.N = params->NROM;\n\tsubparams.NROM = 0;\n\n\tif (!(params->flags & YESCRYPT_RW) || params->N || params->g)\n\t\treturn -1;\n\n\tif (params->flags & YESCRYPT_SHARED_PREALLOCATED) {\n\t\tif (!shared->aligned || !shared->aligned_size)\n\t\t\treturn -1;\n\n/* Overwrite a possible old ROM tag before we overwrite the rest */\n\t\ttag = (uint64_t *)\n\t\t    ((uint8_t *)shared->aligned + shared->aligned_size - 48);\n\t\tmemset(tag, 0, 48);\n\t} else {\n\t\tinit_region(shared);\n\n\t\tsubparams.flags |= YESCRYPT_ALLOC_ONLY;\n\t\tif (yescrypt_kdf(NULL, shared, NULL, 0, NULL, 0, &subparams,\n\t\t    NULL, 0) != -2 || !shared->aligned)\n\t\t\treturn -1;\n\t\tsubparams.flags -= YESCRYPT_ALLOC_ONLY;\n\t}\n\n\tsubparams.N /= 2;\n\n\thalf1 = *shared;\n\thalf1.aligned_size /= 2;\n\thalf2 = half1;\n\thalf2.aligned = (uint8_t *)half2.aligned + half1.aligned_size;\n\n\tif (yescrypt_kdf(NULL, &half1,\n\t    seed, seedlen, (const uint8_t *)\"yescrypt-ROMhash\", 16, &subparams,\n\t    salt, sizeof(salt)))\n\t\tgoto fail;\n\n\tsubparams.NROM = subparams.N;\n\n\tif (yescrypt_kdf(&half1, &half2,\n\t    seed, seedlen, salt, sizeof(salt), &subparams, salt, sizeof(salt)))\n\t\tgoto fail;\n\n\tif (yescrypt_kdf(&half2, &half1,\n\t    seed, seedlen, salt, sizeof(salt), &subparams, salt, sizeof(salt)))\n\t\tgoto fail;\n\n\ttag = (uint64_t *)\n\t    ((uint8_t *)shared->aligned + shared->aligned_size - 48);\n\ttag[0] = YESCRYPT_ROM_TAG1;\n\ttag[1] = YESCRYPT_ROM_TAG2;\n\ttag[2] = le64dec(salt);\n\ttag[3] = le64dec(salt + 8);\n\ttag[4] = le64dec(salt + 16);\n\ttag[5] = le64dec(salt + 24);\n\n\texplicit_bzero(salt, sizeof(salt));\n\treturn 0;\n\nfail:\n\texplicit_bzero(salt, sizeof(salt));\n\tif (!(params->flags & YESCRYPT_SHARED_PREALLOCATED))\n\t\tfree_region(shared);\n\treturn -1;\n}\n\nyescrypt_binary_t *yescrypt_digest_shared(yescrypt_shared_t *shared)\n{\n\tstatic yescrypt_binary_t digest;\n\tuint64_t *tag;\n\n\tif (shared->aligned_size < 48)\n\t\treturn NULL;\n\n\ttag = (uint64_t *)\n\t    ((uint8_t *)shared->aligned + shared->aligned_size - 48);\n\n\tif (tag[0] != YESCRYPT_ROM_TAG1 || tag[1] != YESCRYPT_ROM_TAG2)\n\t\treturn NULL;\n\n\tle64enc(digest.uc, tag[2]);\n\tle64enc(digest.uc + 8, tag[3]);\n\tle64enc(digest.uc + 16, tag[4]);\n\tle64enc(digest.uc + 24, tag[5]);\n\n\treturn &digest;\n}\n\nint yescrypt_free_shared(yescrypt_shared_t *shared)\n{\n\treturn free_region(shared);\n}\n\nint yescrypt_init_local(yescrypt_local_t *local)\n{\n\tinit_region(local);\n\treturn 0;\n}\n\nint yescrypt_free_local(yescrypt_local_t *local)\n{\n\treturn free_region(local);\n}\n\n#endif /* INCLUDE_yescrypt || INCLUDE_scrypt || INCLUDE_gost_yescrypt ||\n          INCLUDE_sm3_yescrypt */\n"
  },
  {
    "path": "lib/alg-yescrypt-platform.c",
    "content": "/*-\n * Copyright 2013-2018,2022 Alexander Peslyak\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\n#ifdef __unix__\n#include <sys/mman.h>\n#endif\n#ifdef __linux__\n#include <linux/mman.h> /* for MAP_HUGE_2MB */\n#endif\n\n#define HUGEPAGE_THRESHOLD\t\t(32 * 1024 * 1024)\n\n#ifdef __x86_64__\n#define HUGEPAGE_SIZE\t\t\t(2 * 1024 * 1024)\n#else\n#undef HUGEPAGE_SIZE\n#endif\n\nstatic void *alloc_region(yescrypt_region_t *region, size_t size)\n{\n\tsize_t base_size = size;\n\tuint8_t *base, *aligned;\n#ifdef MAP_ANON\n\tunsigned int flags =\n#ifdef MAP_NOCORE\n\t    MAP_NOCORE |\n#endif\n\t    MAP_ANON | MAP_PRIVATE;\n#if defined(MAP_HUGETLB) && defined(MAP_HUGE_2MB) && defined(HUGEPAGE_SIZE)\n\tsize_t new_size = size;\n\tconst size_t hugepage_mask = (size_t)HUGEPAGE_SIZE - 1;\n\tif (size >= HUGEPAGE_THRESHOLD && size + hugepage_mask >= size) {\n\t\tflags |= MAP_HUGETLB | MAP_HUGE_2MB;\n/*\n * Linux's munmap() fails on MAP_HUGETLB mappings if size is not a multiple of\n * huge page size, so let's round up to huge page size here.\n */\n\t\tnew_size = size + hugepage_mask;\n\t\tnew_size &= ~hugepage_mask;\n\t}\n\tbase = mmap(NULL, new_size, PROT_READ | PROT_WRITE, (int)flags, -1, 0);\n\tif (base != MAP_FAILED) {\n\t\tbase_size = new_size;\n\t} else if (flags & MAP_HUGETLB) {\n\t\tflags &= ~(unsigned int)(MAP_HUGETLB | MAP_HUGE_2MB);\n\t\tbase = mmap(NULL, size, PROT_READ | PROT_WRITE, (int)flags, -1, 0);\n\t}\n\n#else\n\tbase = mmap(NULL, size, PROT_READ | PROT_WRITE, (int)flags, -1, 0);\n#endif\n\tif (base == MAP_FAILED)\n\t\tbase = NULL;\n\taligned = base;\n#else /* mmap not available */\n\tbase = aligned = NULL;\n\tif (size + 63 < size) {\n\t\terrno = ENOMEM;\n\t} else if ((base = malloc(size + 63)) != NULL) {\n\t\taligned = base + 63;\n\t\taligned -= (uintptr_t)aligned & 63;\n\t}\n#endif\n\tregion->base = base;\n\tregion->aligned = aligned;\n\tregion->base_size = base ? base_size : 0;\n\tregion->aligned_size = base ? size : 0;\n\treturn aligned;\n}\n\nstatic inline void init_region(yescrypt_region_t *region)\n{\n\tregion->base = region->aligned = NULL;\n\tregion->base_size = region->aligned_size = 0;\n}\n\nstatic int free_region(yescrypt_region_t *region)\n{\n\tif (region->base) {\n#ifdef MAP_ANON\n\t\tif (munmap(region->base, region->base_size))\n\t\t\treturn -1;\n#else\n\t\tfree(region->base);\n#endif\n\t}\n\tinit_region(region);\n\treturn 0;\n}\n"
  },
  {
    "path": "lib/alg-yescrypt.h",
    "content": "/*-\n * Copyright 2009 Colin Percival\n * Copyright 2013-2018 Alexander Peslyak\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n *\n * This file was originally written by Colin Percival as part of the Tarsnap\n * online backup system.\n */\n#ifndef _YESCRYPT_H_\n#define _YESCRYPT_H_\n\n#include \"crypt-port.h\"\n\n#include <stdint.h>\n#include <stdlib.h> /* for size_t */\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n * crypto_scrypt(passwd, passwdlen, salt, saltlen, N, r, p, buf, buflen):\n * Compute scrypt(passwd[0 .. passwdlen - 1], salt[0 .. saltlen - 1], N, r,\n * p, buflen) and write the result into buf.  The parameters r, p, and buflen\n * must satisfy r * p < 2^30 and buflen <= (2^32 - 1) * 32.  The parameter N\n * must be a power of 2 greater than 1.\n *\n * Return 0 on success; or -1 on error.\n *\n * MT-safe as long as buf is local to the thread.\n */\nextern int crypto_scrypt(const uint8_t *passwd, size_t passwdlen,\n    const uint8_t *salt, size_t saltlen,\n    uint64_t N, uint32_t r, uint32_t p, uint8_t *buf, size_t buflen);\n\n/**\n * Internal type used by the memory allocator.  Please do not use it directly.\n * Use yescrypt_shared_t and yescrypt_local_t as appropriate instead, since\n * they might differ from each other in a future version.\n */\ntypedef struct {\n\tvoid *base, *aligned;\n\tsize_t base_size, aligned_size;\n} yescrypt_region_t;\n\n/**\n * Types for shared (ROM) and thread-local (RAM) data structures.\n */\ntypedef yescrypt_region_t yescrypt_shared_t;\ntypedef yescrypt_region_t yescrypt_local_t;\n\n/**\n * Two 64-bit tags placed 48 bytes to the end of a ROM in host byte endianness\n * (and followed by 32 bytes of the ROM digest).\n */\n#define YESCRYPT_ROM_TAG1 0x7470797263736579 /* \"yescrypt\" */\n#define YESCRYPT_ROM_TAG2 0x687361684d4f522d /* \"-ROMhash\" */\n\n/**\n * Type and possible values for the flags argument of yescrypt_kdf(),\n * yescrypt_encode_params_r(), yescrypt_encode_params().  Most of these may be\n * OR'ed together, except that YESCRYPT_WORM stands on its own.\n * Please refer to the description of yescrypt_kdf() below for the meaning of\n * these flags.\n */\ntypedef uint32_t yescrypt_flags_t;\n/* Public */\n#define YESCRYPT_WORM\t\t\t1\n#define YESCRYPT_RW\t\t\t0x002\n#define YESCRYPT_ROUNDS_3\t\t0x000\n#define YESCRYPT_ROUNDS_6\t\t0x004\n#define YESCRYPT_GATHER_1\t\t0x000\n#define YESCRYPT_GATHER_2\t\t0x008\n#define YESCRYPT_GATHER_4\t\t0x010\n#define YESCRYPT_GATHER_8\t\t0x018\n#define YESCRYPT_SIMPLE_1\t\t0x000\n#define YESCRYPT_SIMPLE_2\t\t0x020\n#define YESCRYPT_SIMPLE_4\t\t0x040\n#define YESCRYPT_SIMPLE_8\t\t0x060\n#define YESCRYPT_SBOX_6K\t\t0x000\n#define YESCRYPT_SBOX_12K\t\t0x080\n#define YESCRYPT_SBOX_24K\t\t0x100\n#define YESCRYPT_SBOX_48K\t\t0x180\n#define YESCRYPT_SBOX_96K\t\t0x200\n#define YESCRYPT_SBOX_192K\t\t0x280\n#define YESCRYPT_SBOX_384K\t\t0x300\n#define YESCRYPT_SBOX_768K\t\t0x380\n/* Only valid for yescrypt_init_shared() */\n#define YESCRYPT_SHARED_PREALLOCATED\t0x10000\n#ifdef YESCRYPT_INTERNAL\n/* Private */\n#define YESCRYPT_MODE_MASK\t\t0x003\n#define YESCRYPT_RW_FLAVOR_MASK\t\t0x3fc\n#define YESCRYPT_INIT_SHARED\t\t0x01000000\n#define YESCRYPT_ALLOC_ONLY\t\t0x08000000\n#define YESCRYPT_PREHASH\t\t0x10000000\n#endif\n\n#define YESCRYPT_RW_DEFAULTS \\\n\t(YESCRYPT_RW | \\\n\tYESCRYPT_ROUNDS_6 | YESCRYPT_GATHER_4 | YESCRYPT_SIMPLE_2 | \\\n\tYESCRYPT_SBOX_12K)\n\n#define YESCRYPT_DEFAULTS YESCRYPT_RW_DEFAULTS\n\n#ifdef YESCRYPT_INTERNAL\n#define YESCRYPT_KNOWN_FLAGS \\\n\t(YESCRYPT_MODE_MASK | YESCRYPT_RW_FLAVOR_MASK | \\\n\tYESCRYPT_SHARED_PREALLOCATED | \\\n\tYESCRYPT_INIT_SHARED | YESCRYPT_ALLOC_ONLY | YESCRYPT_PREHASH)\n#endif\n\n/**\n * yescrypt parameters combined into one struct.  N, r, p are the same as in\n * classic scrypt, except that the meaning of p changes when YESCRYPT_RW is\n * set.  flags, t, g, NROM are special to yescrypt.\n */\ntypedef struct {\n\tyescrypt_flags_t flags;\n\tuint64_t N;\n\tuint32_t r, p, t, g;\n\tuint64_t NROM;\n} yescrypt_params_t;\n\n/**\n * A 256-bit yescrypt hash, or a hash encryption key (which may itself have\n * been derived as a yescrypt hash of a human-specified key string).\n */\ntypedef union {\n\tunsigned char uc[32];\n\tuint64_t u64[4];\n} yescrypt_binary_t;\n\n/**\n * yescrypt_init_shared(shared, seed, seedlen, params):\n * Optionally allocate memory for and initialize the shared (ROM) data\n * structure.  The parameters flags, NROM, r, p, and t specify how the ROM is\n * to be initialized, and seed and seedlen specify the initial seed affecting\n * the data with which the ROM is filled.\n *\n * Return 0 on success; or -1 on error.\n *\n * If bit YESCRYPT_SHARED_PREALLOCATED in flags is set, then memory for the\n * ROM is assumed to have been preallocated by the caller, with shared->aligned\n * being the start address of the ROM and shared->aligned_size being its size\n * (which must be sufficient for NROM, r, p).  This may be used e.g. when the\n * ROM is to be placed in a SysV shared memory segment allocated by the caller.\n *\n * MT-safe as long as shared is local to the thread.\n */\nextern int yescrypt_init_shared(yescrypt_shared_t *shared,\n    const uint8_t *seed, size_t seedlen, const yescrypt_params_t *params);\n\n/**\n * yescrypt_digest_shared(shared):\n * Extract the previously stored message digest of the provided yescrypt ROM.\n *\n * Return pointer to the message digest on success; or NULL on error.\n *\n * MT-unsafe.\n */\nextern yescrypt_binary_t *yescrypt_digest_shared(yescrypt_shared_t *shared);\n\n/**\n * yescrypt_free_shared(shared):\n * Free memory that had been allocated with yescrypt_init_shared().\n *\n * Return 0 on success; or -1 on error.\n *\n * MT-safe as long as shared is local to the thread.\n */\nextern int yescrypt_free_shared(yescrypt_shared_t *shared);\n\n/**\n * yescrypt_init_local(local):\n * Initialize the thread-local (RAM) data structure.  Actual memory allocation\n * is currently fully postponed until a call to yescrypt_kdf() or yescrypt_r().\n *\n * Return 0 on success; or -1 on error.\n *\n * MT-safe as long as local is local to the thread.\n */\nextern int yescrypt_init_local(yescrypt_local_t *local);\n\n/**\n * yescrypt_free_local(local):\n * Free memory that may have been allocated for an initialized thread-local\n * (RAM) data structure.\n *\n * Return 0 on success; or -1 on error.\n *\n * MT-safe as long as local is local to the thread.\n */\nextern int yescrypt_free_local(yescrypt_local_t *local);\n\n/**\n * yescrypt_kdf(shared, local, passwd, passwdlen, salt, saltlen, params,\n *     buf, buflen):\n * Compute scrypt(passwd[0 .. passwdlen - 1], salt[0 .. saltlen - 1], N, r,\n * p, buflen), or a revision of scrypt as requested by flags and shared, and\n * write the result into buf.  The parameters N, r, p, and buflen must satisfy\n * the same conditions as with crypto_scrypt().  t controls computation time\n * while not affecting peak memory usage (t = 0 is optimal unless higher N*r\n * is not affordable while higher t is).  g controls hash upgrades (g = 0 for\n * no upgrades so far).  shared and flags may request special modes.  local is\n * the thread-local data structure, allowing to preserve and reuse a memory\n * allocation across calls, thereby reducing processing overhead.\n *\n * Return 0 on success; or -1 on error.\n *\n * Classic scrypt is available by setting shared = NULL, flags = 0, and t = 0.\n *\n * Setting YESCRYPT_WORM enables only minimal deviations from classic scrypt:\n * support for the t parameter, and pre- and post-hashing.\n *\n * Setting YESCRYPT_RW fully enables yescrypt.  As a side effect of differences\n * between the algorithms, it also prevents p > 1 from growing the threads'\n * combined processing time and memory allocation (like it did with classic\n * scrypt and YESCRYPT_WORM), treating p as a divider rather than a multiplier.\n *\n * Passing a shared structure, with ROM contents previously computed by\n * yescrypt_init_shared(), enables the use of ROM and requires YESCRYPT_RW.\n *\n * In order to allow for initialization of the ROM to be split into a separate\n * program (or separate invocation of the same program), the shared->aligned\n * and shared->aligned_size fields may optionally be set by the caller directly\n * (e.g., to a mapped SysV shm segment), without using yescrypt_init_shared().\n *\n * local must be initialized with yescrypt_init_local().\n *\n * MT-safe as long as local and buf are local to the thread.\n */\nextern int yescrypt_kdf(const yescrypt_shared_t *shared,\n    yescrypt_local_t *local,\n    const uint8_t *passwd, size_t passwdlen,\n    const uint8_t *salt, size_t saltlen,\n    const yescrypt_params_t *params,\n    uint8_t *buf, size_t buflen);\n\n/**\n * yescrypt_r(shared, local, passwd, passwdlen, setting, key, buf, buflen):\n * Compute and encode an scrypt or enhanced scrypt hash of passwd given the\n * parameters and salt value encoded in setting.  If shared is not NULL, a ROM\n * is used and YESCRYPT_RW is required.  Otherwise, whether to compute classic\n * scrypt, YESCRYPT_WORM (a slight deviation from classic scrypt), or\n * YESCRYPT_RW (time-memory tradeoff discouraging modification) is determined\n * by the setting string.  shared (if not NULL) and local must be initialized\n * as described above for yescrypt_kdf().  buf must be large enough (as\n * indicated by buflen) to hold the encoded hash string.\n *\n * Return the encoded hash string on success; or NULL on error.\n *\n * MT-safe as long as local and buf are local to the thread.\n */\nextern uint8_t *yescrypt_r(const yescrypt_shared_t *shared,\n    yescrypt_local_t *local,\n    const uint8_t *passwd, size_t passwdlen,\n    const uint8_t *setting,\n    const yescrypt_binary_t *key,\n    uint8_t *buf, size_t buflen);\n\n/**\n * yescrypt(passwd, setting):\n * Compute and encode an scrypt or enhanced scrypt hash of passwd given the\n * parameters and salt value encoded in setting.  Whether to compute classic\n * scrypt, YESCRYPT_WORM (a slight deviation from classic scrypt), or\n * YESCRYPT_RW (time-memory tradeoff discouraging modification) is determined\n * by the setting string.\n *\n * Return the encoded hash string on success; or NULL on error.\n *\n * This is a crypt(3)-like interface, which is simpler to use than\n * yescrypt_r(), but it is not MT-safe, it does not allow for the use of a ROM,\n * and it is slower than yescrypt_r() for repeated calls because it allocates\n * and frees memory on each call.\n *\n * MT-unsafe.\n */\nextern uint8_t *yescrypt(const uint8_t *passwd, const uint8_t *setting);\n\n/**\n * yescrypt_reencrypt(hash, from_key, to_key):\n * Re-encrypt a yescrypt hash from one key to another.  Either key may be NULL\n * to indicate unencrypted hash.  The encoded hash string is modified in-place.\n *\n * Return the hash pointer on success; or NULL on error (in which case the hash\n * string is left unmodified).\n *\n * MT-safe as long as hash is local to the thread.\n */\nextern uint8_t *yescrypt_reencrypt(uint8_t *hash,\n    const yescrypt_binary_t *from_key,\n    const yescrypt_binary_t *to_key);\n\n/**\n * yescrypt_encode_params_r(params, src, srclen, buf, buflen):\n * Generate a setting string for use with yescrypt_r() and yescrypt() by\n * encoding into it the parameters flags, N, r, p, t, g, and a salt given by\n * src (of srclen bytes).  buf must be large enough (as indicated by buflen)\n * to hold the setting string.\n *\n * Return the setting string on success; or NULL on error.\n *\n * MT-safe as long as buf is local to the thread.\n */\nextern uint8_t *yescrypt_encode_params_r(const yescrypt_params_t *params,\n    const uint8_t *src, size_t srclen,\n    uint8_t *buf, size_t buflen);\n\n/**\n * yescrypt_encode_params(params, src, srclen):\n * Generate a setting string for use with yescrypt_r() and yescrypt().  This\n * function is the same as yescrypt_encode_params_r() except that it uses a\n * static buffer and thus is not MT-safe.\n *\n * Return the setting string on success; or NULL on error.\n *\n * MT-unsafe.\n */\nextern uint8_t *yescrypt_encode_params(const yescrypt_params_t *params,\n    const uint8_t *src, size_t srclen);\n\n#ifdef YESCRYPT_INTERNAL\n\n#define decode64 yescrypt_decode64\n#define encode64 yescrypt_encode64\n\nextern const uint8_t *decode64(uint8_t *dst, size_t *dstlen,\n    const uint8_t *src, size_t srclen);\nextern uint8_t *encode64(uint8_t *dst, size_t dstlen,\n    const uint8_t *src, size_t srclen);\n\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* !_YESCRYPT_H_ */\n"
  },
  {
    "path": "lib/byteorder.h",
    "content": "/* Functions to copy data between possibly-unaligned byte buffers\n   and machine integers, fixing the endianness.\n\n   Written by Zack Weinberg <zackw at panix.com> in 2017.\n   To the extent possible under law, Zack Weinberg has waived all\n   copyright and related or neighboring rights to this work.\n\n   See https://creativecommons.org/publicdomain/zero/1.0/ for further\n   details.  */\n\n#ifndef _CRYPT_BYTEORDER_H\n#define _CRYPT_BYTEORDER_H 1\n\nstatic inline uint32_t\nle32_to_cpu (const unsigned char *buf)\n{\n  return ((((uint32_t)buf[0]) <<  0) |\n          (((uint32_t)buf[1]) <<  8) |\n          (((uint32_t)buf[2]) << 16) |\n          (((uint32_t)buf[3]) << 24) );\n}\n\nstatic inline uint32_t\nbe32_to_cpu (const unsigned char *buf)\n{\n  return ((((uint32_t)buf[0]) << 24) |\n          (((uint32_t)buf[1]) << 16) |\n          (((uint32_t)buf[2]) <<  8) |\n          (((uint32_t)buf[3]) <<  0) );\n}\n\nstatic inline uint64_t\nle64_to_cpu (const unsigned char *buf)\n{\n  return ((((uint64_t)buf[0]) <<  0) |\n          (((uint64_t)buf[1]) <<  8) |\n          (((uint64_t)buf[2]) << 16) |\n          (((uint64_t)buf[3]) << 24) |\n          (((uint64_t)buf[4]) << 32) |\n          (((uint64_t)buf[5]) << 40) |\n          (((uint64_t)buf[6]) << 48) |\n          (((uint64_t)buf[7]) << 56) );\n}\n\nstatic inline uint64_t\nbe64_to_cpu (const unsigned char *buf)\n{\n  return ((((uint64_t)buf[0]) << 56) |\n          (((uint64_t)buf[1]) << 48) |\n          (((uint64_t)buf[2]) << 40) |\n          (((uint64_t)buf[3]) << 32) |\n          (((uint64_t)buf[4]) << 24) |\n          (((uint64_t)buf[5]) << 16) |\n          (((uint64_t)buf[6]) <<  8) |\n          (((uint64_t)buf[7]) <<  0) );\n}\n\nstatic inline void\ncpu_to_le32 (unsigned char *buf, uint32_t n)\n{\n  buf[0] = (unsigned char)((n & 0x000000FFu) >>  0);\n  buf[1] = (unsigned char)((n & 0x0000FF00u) >>  8);\n  buf[2] = (unsigned char)((n & 0x00FF0000u) >> 16);\n  buf[3] = (unsigned char)((n & 0xFF000000u) >> 24);\n}\n\nstatic inline void\ncpu_to_be32 (unsigned char *buf, uint32_t n)\n{\n  buf[0] = (unsigned char)((n & 0xFF000000u) >> 24);\n  buf[1] = (unsigned char)((n & 0x00FF0000u) >> 16);\n  buf[2] = (unsigned char)((n & 0x0000FF00u) >>  8);\n  buf[3] = (unsigned char)((n & 0x000000FFu) >>  0);\n}\n\nstatic inline void\ncpu_to_le64 (unsigned char *buf, uint64_t n)\n{\n  buf[0] = (unsigned char)((n & 0x00000000000000FFull) >>  0);\n  buf[1] = (unsigned char)((n & 0x000000000000FF00ull) >>  8);\n  buf[2] = (unsigned char)((n & 0x0000000000FF0000ull) >> 16);\n  buf[3] = (unsigned char)((n & 0x00000000FF000000ull) >> 24);\n  buf[4] = (unsigned char)((n & 0x000000FF00000000ull) >> 32);\n  buf[5] = (unsigned char)((n & 0x0000FF0000000000ull) >> 40);\n  buf[6] = (unsigned char)((n & 0x00FF000000000000ull) >> 48);\n  buf[7] = (unsigned char)((n & 0xFF00000000000000ull) >> 56);\n}\n\nstatic inline void\ncpu_to_be64 (unsigned char *buf, uint64_t n)\n{\n  buf[0] = (unsigned char)((n & 0xFF00000000000000ull) >> 56);\n  buf[1] = (unsigned char)((n & 0x00FF000000000000ull) >> 48);\n  buf[2] = (unsigned char)((n & 0x0000FF0000000000ull) >> 40);\n  buf[3] = (unsigned char)((n & 0x000000FF00000000ull) >> 32);\n  buf[4] = (unsigned char)((n & 0x00000000FF000000ull) >> 24);\n  buf[5] = (unsigned char)((n & 0x0000000000FF0000ull) >> 16);\n  buf[6] = (unsigned char)((n & 0x000000000000FF00ull) >>  8);\n  buf[7] = (unsigned char)((n & 0x00000000000000FFull) >>  0);\n}\n\n/* Template: Define a function named cpu_to_<END><BITS>_vect that\n   takes a vector SRC of LEN integers, each of type uint<BITS>_t, and\n   writes them to the buffer DST in the endianness defined by END.\n   Caution: LEN is the number of vector elements, not the total size\n   of the buffers.  */\n#define VECTOR_CPU_TO(end, bits) VECTOR_CPU_TO_(end##bits, uint##bits##_t)\n#define VECTOR_CPU_TO_(prim, stype)                                     \\\n  static inline void                                                    \\\n  cpu_to_##prim##_vect(uint8_t *dst, const stype *src, size_t len)      \\\n  {                                                                     \\\n    while (len)                                                         \\\n      {                                                                 \\\n        cpu_to_##prim(dst, *src);                                       \\\n        src += 1;                                                       \\\n        dst += sizeof(stype);                                           \\\n        len -= 1;                                                       \\\n      }                                                                 \\\n  } struct _swallow_semicolon\n\n/* Template: Define a function named <END><BITS>_to_cpu_vect that\n   reads a vector of LEN integers, each of type uint<BITS>_t, from the\n   buffer SRC, in the endianness defined by END, and writes them to\n   the vector DST.  Caution: LEN is the number of vector elements, not\n   the total size of the buffers.  */\n#define VECTOR_TO_CPU(end, bits) VECTOR_TO_CPU_(end##bits, uint##bits##_t)\n#define VECTOR_TO_CPU_(prim, dtype)                                     \\\n  static inline void                                                    \\\n  prim##_to_cpu_vect(dtype *dst, const uint8_t *src, size_t len)        \\\n  {                                                                     \\\n    while (len)                                                         \\\n      {                                                                 \\\n        *dst = prim##_to_cpu(src);                                      \\\n        src += sizeof(dtype);                                           \\\n        dst += 1;                                                       \\\n        len -= 1;                                                       \\\n      }                                                                 \\\n  } struct _swallow_semicolon\n\n/* These are the vectorized endianness-conversion functions that are\n   presently used.  Add more as necessary.  */\nVECTOR_CPU_TO(be,32);\nVECTOR_CPU_TO(be,64);\nVECTOR_TO_CPU(be,32);\nVECTOR_TO_CPU(be,64);\n\n/* Alternative names used in code derived from Colin Percival's\n   cryptography libraries.  */\n#define le32enc cpu_to_le32\n#define le32dec le32_to_cpu\n#define le64enc cpu_to_le64\n#define le64dec le64_to_cpu\n\n#define be32enc cpu_to_be32\n#define be32dec be32_to_cpu\n#define be64enc cpu_to_be64\n#define be64dec be64_to_cpu\n\n#define be32enc_vect cpu_to_be32_vect\n#define be32dec_vect be32_to_cpu_vect\n#define be64enc_vect cpu_to_be64_vect\n#define be64dec_vect be64_to_cpu_vect\n\n#endif /* byteorder.h */\n"
  },
  {
    "path": "lib/crypt-bcrypt.c",
    "content": "/*\n * The crypt_blowfish homepage is:\n *\n *      http://www.openwall.com/crypt/\n *\n * This code comes from John the Ripper password cracker, with reentrant\n * and crypt(3) interfaces added, but optimizations specific to password\n * cracking removed.\n *\n * Written by Solar Designer <solar at openwall.com> in 1998-2014.\n * No copyright is claimed, and the software is hereby placed in the public\n * domain.  In case this attempt to disclaim copyright and place the software\n * in the public domain is deemed null and void, then the software is\n * Copyright (c) 1998-2014 Solar Designer and it is hereby released to the\n * general public under the following terms:\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted.\n *\n * There's ABSOLUTELY NO WARRANTY, express or implied.\n *\n * It is my intent that you should be able to use this on your system,\n * as part of a software package, or anywhere else to improve security,\n * ensure compatibility, or for any other purpose.  I would appreciate\n * it if you give credit where it is due and keep your modifications in\n * the public domain as well, but I don't require that in order to let\n * you place this code and any modifications you make under a license\n * of your choice.\n *\n * This implementation is fully compatible with OpenBSD's bcrypt.c for prefix\n * \"$2b$\", originally by Niels Provos <provos at citi.umich.edu>, and it uses\n * some of his ideas.  The password hashing algorithm was designed by David\n * Mazieres <dm at lcs.mit.edu>.  For information on the level of\n * compatibility for bcrypt hash prefixes other than \"$2b$\", please refer to\n * the comments in BF_set_key() below and to the included crypt(3) man page.\n *\n * There's a paper on the algorithm that explains its design decisions:\n *\n *      http://www.usenix.org/events/usenix99/provos.html\n *\n * Some of the tricks in BF_ROUND might be inspired by Eric Young's\n * Blowfish library (I can't be sure if I would think of something if I\n * hadn't seen his code).\n */\n\n#include \"crypt-port.h\"\n#include \"byteorder.h\"\n\n#include <errno.h>\n#include <stdio.h>\n\n#if INCLUDE_bcrypt || INCLUDE_bcrypt_a || INCLUDE_bcrypt_x || INCLUDE_bcrypt_y\n\n#if defined(__i386__) || defined(__x86_64__) || \\\n    defined(__alpha__) || defined(__hppa__)\n#define BF_SCALE                        1\n#else\n#define BF_SCALE                        0\n#endif\n\ntypedef uint32_t BF_word;\ntypedef int32_t BF_word_signed;\n\n/* Set the int_to_cpu function according to the system's endianness */\n#if XCRYPT_USE_BIGENDIAN\n#define BF_WORD_TO_CPU(x)               be32_to_cpu (x)\n#else\n#define BF_WORD_TO_CPU(x)               le32_to_cpu (x)\n#endif\n\n/* Number of Blowfish rounds, this is also hardcoded into a few places */\n#define BF_N                            16\n\ntypedef BF_word BF_key[BF_N + 2];\n\ntypedef struct\n{\n  BF_word S[4][0x100];\n  BF_key P;\n} BF_ctx;\n\n/*\n * Magic IV for 64 Blowfish encryptions that we do at the end.\n * The string is \"OrpheanBeholderScryDoubt\" on big-endian.\n */\nstatic const BF_word BF_magic_w[6] =\n{\n  0x4F727068, 0x65616E42, 0x65686F6C,\n  0x64657253, 0x63727944, 0x6F756274\n};\n\n/*\n * P-box and S-box tables initialized with digits of Pi.\n */\nstatic const BF_ctx BF_init_state =\n{\n  {\n    {\n      0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7,\n      0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99,\n      0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16,\n      0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e,\n      0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee,\n      0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013,\n      0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef,\n      0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e,\n      0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60,\n      0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440,\n      0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce,\n      0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a,\n      0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e,\n      0xafd6ba33, 0x6c24cf5c, 0x7a325381, 0x28958677,\n      0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193,\n      0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032,\n      0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88,\n      0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239,\n      0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e,\n      0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0,\n      0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3,\n      0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98,\n      0xa1f1651d, 0x39af0176, 0x66ca593e, 0x82430e88,\n      0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe,\n      0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6,\n      0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d,\n      0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b,\n      0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7,\n      0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x04c006ba,\n      0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463,\n      0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f,\n      0x6dfc511f, 0x9b30952c, 0xcc814544, 0xaf5ebd09,\n      0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3,\n      0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb,\n      0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279,\n      0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8,\n      0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab,\n      0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82,\n      0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db,\n      0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573,\n      0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0,\n      0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b,\n      0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790,\n      0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8,\n      0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4,\n      0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0,\n      0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7,\n      0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c,\n      0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad,\n      0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1,\n      0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299,\n      0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9,\n      0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477,\n      0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf,\n      0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49,\n      0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af,\n      0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa,\n      0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5,\n      0x83260376, 0x6295cfa9, 0x11c81968, 0x4e734a41,\n      0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915,\n      0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400,\n      0x08ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915,\n      0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664,\n      0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a\n    },\n    {\n      0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623,\n      0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266,\n      0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1,\n      0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e,\n      0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6,\n      0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1,\n      0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e,\n      0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1,\n      0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737,\n      0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8,\n      0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff,\n      0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd,\n      0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701,\n      0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7,\n      0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41,\n      0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331,\n      0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf,\n      0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af,\n      0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e,\n      0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87,\n      0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c,\n      0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2,\n      0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16,\n      0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd,\n      0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b,\n      0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509,\n      0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e,\n      0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3,\n      0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f,\n      0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a,\n      0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4,\n      0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960,\n      0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66,\n      0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28,\n      0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802,\n      0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84,\n      0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510,\n      0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf,\n      0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14,\n      0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e,\n      0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50,\n      0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7,\n      0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8,\n      0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281,\n      0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99,\n      0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696,\n      0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128,\n      0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73,\n      0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0,\n      0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0,\n      0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105,\n      0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250,\n      0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3,\n      0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285,\n      0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00,\n      0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061,\n      0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb,\n      0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e,\n      0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735,\n      0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc,\n      0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9,\n      0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340,\n      0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20,\n      0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7\n    },\n    {\n      0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934,\n      0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068,\n      0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af,\n      0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840,\n      0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45,\n      0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504,\n      0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a,\n      0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb,\n      0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee,\n      0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6,\n      0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42,\n      0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b,\n      0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2,\n      0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb,\n      0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527,\n      0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b,\n      0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33,\n      0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c,\n      0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3,\n      0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc,\n      0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17,\n      0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564,\n      0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b,\n      0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115,\n      0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922,\n      0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728,\n      0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0,\n      0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e,\n      0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37,\n      0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d,\n      0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804,\n      0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b,\n      0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3,\n      0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb,\n      0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d,\n      0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c,\n      0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350,\n      0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9,\n      0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a,\n      0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe,\n      0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d,\n      0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc,\n      0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f,\n      0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61,\n      0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2,\n      0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9,\n      0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2,\n      0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c,\n      0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e,\n      0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633,\n      0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10,\n      0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169,\n      0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52,\n      0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027,\n      0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5,\n      0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62,\n      0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634,\n      0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76,\n      0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24,\n      0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc,\n      0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4,\n      0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c,\n      0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837,\n      0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0\n    },\n    {\n      0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b,\n      0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe,\n      0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b,\n      0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4,\n      0x5748ab2f, 0xbc946e79, 0xc6a376d2, 0x6549c2c8,\n      0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6,\n      0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304,\n      0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22,\n      0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4,\n      0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6,\n      0x2826a2f9, 0xa73a3ae1, 0x4ba99586, 0xef5562e9,\n      0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59,\n      0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593,\n      0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51,\n      0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28,\n      0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c,\n      0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b,\n      0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28,\n      0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c,\n      0x15056dd4, 0x88f46dba, 0x03a16125, 0x0564f0bd,\n      0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a,\n      0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319,\n      0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb,\n      0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f,\n      0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991,\n      0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32,\n      0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680,\n      0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166,\n      0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae,\n      0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb,\n      0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5,\n      0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47,\n      0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370,\n      0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d,\n      0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84,\n      0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048,\n      0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8,\n      0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd,\n      0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9,\n      0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7,\n      0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38,\n      0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f,\n      0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c,\n      0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525,\n      0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1,\n      0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442,\n      0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964,\n      0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e,\n      0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8,\n      0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d,\n      0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f,\n      0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299,\n      0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02,\n      0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc,\n      0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614,\n      0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a,\n      0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6,\n      0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b,\n      0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0,\n      0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060,\n      0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e,\n      0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9,\n      0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f,\n      0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6\n    }\n  },\n  {\n    0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344,\n    0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89,\n    0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c,\n    0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917,\n    0x9216d5d9, 0x8979fb1b\n  }\n};\n\nstatic const unsigned char BF_itoa64[64 + 1] =\n  \"./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\";\n\nstatic const unsigned char BF_atoi64[0x60] =\n{\n  64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 0, 1,\n  54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 64, 64, 64, 64, 64,\n  64, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,\n  17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 64, 64, 64, 64, 64,\n  64, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42,\n  43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 64, 64, 64, 64, 64\n};\n\n#define BF_safe_atoi64(dst, src) \\\n{ \\\n        tmp = (unsigned char)(src); \\\n        if ((unsigned int)(tmp -= 0x20) >= 0x60) return -1; \\\n        tmp = BF_atoi64[tmp]; \\\n        if (tmp > 63) return -1; \\\n        (dst) = tmp; \\\n}\n\nstatic int\nBF_decode (BF_word * dst, const char *src, int size)\n{\n  unsigned char *dptr = (unsigned char *) dst;\n  unsigned char *end = dptr + size;\n  const unsigned char *sptr = (const unsigned char *) src;\n  unsigned int tmp, c1, c2, c3, c4;\n\n  do\n    {\n      BF_safe_atoi64 (c1, *sptr++);\n      BF_safe_atoi64 (c2, *sptr++);\n      *dptr++ = (unsigned char)((c1 << 2) | ((c2 & 0x30) >> 4));\n      if (dptr >= end)\n        break;\n\n      BF_safe_atoi64 (c3, *sptr++);\n      *dptr++ = (unsigned char)(((c2 & 0x0F) << 4) | ((c3 & 0x3C) >> 2));\n      if (dptr >= end)\n        break;\n\n      BF_safe_atoi64 (c4, *sptr++);\n      *dptr++ = (unsigned char)(((c3 & 0x03) << 6) | c4);\n    }\n  while (dptr < end);\n\n  return 0;\n}\n\nstatic void\nBF_encode (unsigned char *dst, const BF_word * src, int size)\n{\n  const unsigned char *sptr = (const unsigned char *) src;\n  const unsigned char *end = sptr + size;\n  unsigned char *dptr = dst;\n  unsigned int c1, c2;\n\n  do\n    {\n      c1 = *sptr++;\n      *dptr++ = BF_itoa64[c1 >> 2];\n      c1 = (c1 & 0x03) << 4;\n      if (end - sptr <= 0)\n        {\n          *dptr++ = BF_itoa64[c1];\n          break;\n        }\n\n      c2 = *sptr++;\n      c1 |= c2 >> 4;\n      *dptr++ = BF_itoa64[c1];\n      c1 = (c2 & 0x0f) << 2;\n      if (end - sptr <= 0)\n        {\n          *dptr++ = BF_itoa64[c1];\n          break;\n        }\n\n      c2 = *sptr++;\n      c1 |= c2 >> 6;\n      *dptr++ = BF_itoa64[c1];\n      *dptr++ = BF_itoa64[c2 & 0x3f];\n    }\n  while (end - sptr > 0);\n}\n\n#if XCRYPT_USE_BIGENDIAN\nstatic void\nBF_swap (ARG_UNUSED(BF_word * x), ARG_UNUSED(int count))\n{\n}\n#else\nstatic void\nBF_swap (BF_word * x, int count)\n{\n  BF_word tmp;\n\n  do\n    {\n      tmp = *x;\n      tmp = (tmp << 16) | (tmp >> 16);\n      *x++ = ((tmp & 0x00FF00FF) << 8) | ((tmp >> 8) & 0x00FF00FF);\n    }\n  while (--count);\n}\n#endif\n\n#if BF_SCALE\n/* Architectures which can shift addresses left by 2 bits with no extra cost */\n#define BF_ROUND(L, R, N) \\\n        tmp1 = L & 0xFF; \\\n        tmp2 = L >> 8; \\\n        tmp2 &= 0xFF; \\\n        tmp3 = L >> 16; \\\n        tmp3 &= 0xFF; \\\n        tmp4 = L >> 24; \\\n        tmp1 = data->ctx.S[3][tmp1]; \\\n        tmp2 = data->ctx.S[2][tmp2]; \\\n        tmp3 = data->ctx.S[1][tmp3]; \\\n        tmp3 += data->ctx.S[0][tmp4]; \\\n        tmp3 ^= tmp2; \\\n        R ^= data->ctx.P[N + 1]; \\\n        tmp3 += tmp1; \\\n        R ^= tmp3;\n#else\n/* Architectures with no complicated addressing modes supported */\n#define BF_INDEX(S, i) \\\n        BF_WORD_TO_CPU((((unsigned char *)S) + i))\n#define BF_ROUND(L, R, N) \\\n        tmp1 = L & 0xFF; \\\n        tmp1 <<= 2; \\\n        tmp2 = L >> 6; \\\n        tmp2 &= 0x3FC; \\\n        tmp3 = L >> 14; \\\n        tmp3 &= 0x3FC; \\\n        tmp4 = L >> 22; \\\n        tmp4 &= 0x3FC; \\\n        tmp1 = BF_INDEX(data->ctx.S[3], tmp1); \\\n        tmp2 = BF_INDEX(data->ctx.S[2], tmp2); \\\n        tmp3 = BF_INDEX(data->ctx.S[1], tmp3); \\\n        tmp3 += BF_INDEX(data->ctx.S[0], tmp4); \\\n        tmp3 ^= tmp2; \\\n        R ^= data->ctx.P[N + 1]; \\\n        tmp3 += tmp1; \\\n        R ^= tmp3;\n#endif\n\n/*\n * Encrypt one block, BF_N is hardcoded here.\n */\n#define BF_ENCRYPT \\\n        L ^= data->ctx.P[0]; \\\n        BF_ROUND(L, R, 0); \\\n        BF_ROUND(R, L, 1); \\\n        BF_ROUND(L, R, 2); \\\n        BF_ROUND(R, L, 3); \\\n        BF_ROUND(L, R, 4); \\\n        BF_ROUND(R, L, 5); \\\n        BF_ROUND(L, R, 6); \\\n        BF_ROUND(R, L, 7); \\\n        BF_ROUND(L, R, 8); \\\n        BF_ROUND(R, L, 9); \\\n        BF_ROUND(L, R, 10); \\\n        BF_ROUND(R, L, 11); \\\n        BF_ROUND(L, R, 12); \\\n        BF_ROUND(R, L, 13); \\\n        BF_ROUND(L, R, 14); \\\n        BF_ROUND(R, L, 15); \\\n        tmp4 = R; \\\n        R = L; \\\n        L = tmp4 ^ data->ctx.P[BF_N + 1];\n\n#define BF_body() \\\n        L = R = 0; \\\n        ptr = data->ctx.P; \\\n        do { \\\n                ptr += 2; \\\n                BF_ENCRYPT; \\\n                *(ptr - 2) = L; \\\n                *(ptr - 1) = R; \\\n        } while (ptr < &data->ctx.P[BF_N + 2]); \\\n\\\n        ptr = data->ctx.S[0]; \\\n        do { \\\n                ptr += 2; \\\n                BF_ENCRYPT; \\\n                *(ptr - 2) = L; \\\n                *(ptr - 1) = R; \\\n        } while (ptr < &data->ctx.S[3][0xFF]);\n\nstatic void\nBF_set_key (const char *key, BF_key expanded, BF_key initial,\n            unsigned char flags)\n{\n  const char *ptr = key;\n  unsigned int bug, i, j;\n  BF_word safety, sign, diff, tmp[2];\n  BF_word_signed stmp;\n\n  /*\n   * There was a sign extension bug in older revisions of this function.  While\n   * we would have liked to simply fix the bug and move on, we have to provide\n   * a backwards compatibility feature (essentially the bug) for some systems and\n   * a safety measure for some others.  The latter is needed because for certain\n   * multiple inputs to the buggy algorithm there exist easily found inputs to\n   * the correct algorithm that produce the same hash.  Thus, we optionally\n   * deviate from the correct algorithm just enough to avoid such collisions.\n   * While the bug itself affected the majority of passwords containing\n   * characters with the 8th bit set (although only a percentage of those in a\n   * collision-producing way), the anti-collision safety measure affects\n   * only a subset of passwords containing the '\\xff' character (not even all of\n   * those passwords, just some of them).  This character is not found in valid\n   * UTF-8 sequences and is rarely used in popular 8-bit character encodings.\n   * Thus, the safety measure is unlikely to cause much annoyance, and is a\n   * reasonable tradeoff to use when authenticating against existing hashes that\n   * are not reliably known to have been computed with the correct algorithm.\n   *\n   * We use an approach that tries to minimize side-channel leaks of password\n   * information - that is, we mostly use fixed-cost bitwise operations instead\n   * of branches or table lookups.  (One conditional branch based on password\n   * length remains.  It is not part of the bug aftermath, though, and is\n   * difficult and possibly unreasonable to avoid given the use of C strings by\n   * the caller, which results in similar timing leaks anyway.)\n   *\n   * For actual implementation, we set an array index in the variable \"bug\"\n   * (0 means no bug, 1 means sign extension bug emulation) and a flag in the\n   * variable \"safety\" (bit 16 is set when the safety measure is requested).\n   * Valid combinations of settings are:\n   *\n   * Prefix \"$2a$\": bug = 0, safety = 0x10000\n   * Prefix \"$2b$\": bug = 0, safety = 0\n   * Prefix \"$2x$\": bug = 1, safety = 0\n   * Prefix \"$2y$\": bug = 0, safety = 0\n   */\n  bug = (unsigned int) flags & 1;\n  safety = ((BF_word) flags & 2) << 15;\n\n  sign = diff = 0;\n\n  for (i = 0; i < BF_N + 2; i++)\n    {\n      tmp[0] = tmp[1] = 0;\n      for (j = 0; j < 4; j++)\n        {\n          tmp[0] <<= 8;\n          tmp[0] |= (unsigned char) *ptr;       /* correct */\n          tmp[1] <<= 8;\n          stmp = (BF_word_signed) (signed char) *ptr; /* bug */\n          tmp[1] |= (BF_word) stmp; /* two steps avoid GCC 6 spurious warning */\n          /*\n           * Sign extension in the first char has no effect - nothing to overwrite yet,\n           * and those extra 24 bits will be fully shifted out of the 32-bit word.  For\n           * chars 2, 3, 4 in each four-char block, we set bit 7 of \"sign\" if sign\n           * extension in tmp[1] occurs.  Once this flag is set, it remains set.\n           */\n          if (j)\n            sign |= tmp[1] & 0x80;\n          if (!*ptr)\n            ptr = key;\n          else\n            ptr++;\n        }\n      diff |= tmp[0] ^ tmp[1];  /* Non-zero on any differences */\n\n      expanded[i] = tmp[bug];\n      initial[i] = BF_init_state.P[i] ^ tmp[bug];\n    }\n\n  /*\n   * At this point, \"diff\" is zero iff the correct and buggy algorithms produced\n   * exactly the same result.  If so and if \"sign\" is non-zero, which indicates\n   * that there was a non-benign sign extension, this means that we have a\n   * collision between the correctly computed hash for this password and a set of\n   * passwords that could be supplied to the buggy algorithm.  Our safety measure\n   * is meant to protect from such many-buggy to one-correct collisions, by\n   * deviating from the correct algorithm in such cases.  Let's check for this.\n   */\n  diff |= diff >> 16;     /* still zero iff exact match */\n  diff &= 0xffff;         /* ditto */\n  diff += 0xffff;         /* bit 16 set iff \"diff\" was non-zero (on non-match) */\n  sign <<= 9;             /* move the non-benign sign extension flag to bit 16 */\n  sign &= ~diff & safety; /* action needed? */\n\n  /*\n   * If we have determined that we need to deviate from the correct algorithm,\n   * flip bit 16 in initial expanded key.  (The choice of 16 is arbitrary, but\n   * let's stick to it now.  It came out of the approach we used above, and it's\n   * not any worse than any other choice we could make.)\n   *\n   * It is crucial that we don't do the same to the expanded key used in the main\n   * Eksblowfish loop.  By doing it to only one of these two, we deviate from a\n   * state that could be directly specified by a password to the buggy algorithm\n   * (and to the fully correct one as well, but that's a side-effect).\n   */\n  initial[0] ^= sign;\n}\n\nstatic const unsigned char flags_by_subtype[26] =\n{\n  2, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 4, 0\n};\n\n/* prefix: $2z$00$ = 7 chars\n     (where z = a, b, x, or y, and 00 = a decimal number\n      from 00 to 31 inclusive)\n   salt: 22 chars */\n#define BF_SETTING_LENGTH (7 + 22)\n\n/* prefix: BF_SETTING_LENGTH\n   hash: 31 chars\n   terminator: 1 char */\n#define BF_HASH_LENGTH (BF_SETTING_LENGTH + 31 + 1)\n\nstatic_assert (BF_HASH_LENGTH <= CRYPT_OUTPUT_SIZE,\n               \"CRYPT_OUTPUT_SIZE is too small for bcrypt\");\n\n/* BF_data holds all of the sensitive intermediate data used by\n   BF_crypt.  */\nstruct BF_data\n{\n  BF_ctx ctx;\n  BF_key expanded_key;\n  union\n  {\n    BF_word salt[4];\n    BF_word output[6];\n  } binary;\n};\n\n/* A BF_buffer holds a BF_data plus two extra output buffers used by\n   the self-test logic.  One of them is slightly overlength so the\n   self-test can verify that BF_crypt emits exactly BF_HASH_LENGTH\n   bytes and no more.  */\nstruct BF_buffer\n{\n  struct BF_data data;\n  unsigned char re_output[BF_HASH_LENGTH];\n  unsigned char st_output[BF_HASH_LENGTH + 2];\n};\n\nstatic_assert (sizeof (struct BF_buffer) <= ALG_SPECIFIC_SIZE,\n               \"ALG_SPECIFIC_SIZE is too small for bcrypt\");\n\n\nstatic bool\nBF_crypt (const char *key, const char *setting, unsigned char *output,\n          struct BF_data *data, BF_word min)\n{\n  BF_word L, R;\n  BF_word tmp1, tmp2, tmp3, tmp4;\n  BF_word *ptr;\n  BF_word count;\n  int i;\n\n  if (setting[0] != '$' ||\n      setting[1] != '2' ||\n      setting[2] < 'a' || setting[2] > 'z' ||\n      !flags_by_subtype[(unsigned int) (unsigned char) setting[2] - 'a'] ||\n      setting[3] != '$' ||\n      setting[4] < '0' || setting[4] > '3' ||\n      setting[5] < '0' || setting[5] > '9' ||\n      (setting[4] == '3' && setting[5] > '1') || setting[6] != '$')\n    {\n      errno = EINVAL;\n      return false;\n    }\n\n  count = (BF_word) 1 << ((setting[4] - '0') * 10 + (setting[5] - '0'));\n  if (count < min || BF_decode (data->binary.salt, &setting[7], 16))\n    {\n      errno = EINVAL;\n      return false;\n    }\n  BF_swap (data->binary.salt, 4);\n\n  BF_set_key (key, data->expanded_key, data->ctx.P,\n              flags_by_subtype[(unsigned int) (unsigned char) setting[2] -\n                                              'a']);\n\n  memcpy (data->ctx.S, BF_init_state.S, sizeof (data->ctx.S));\n\n  L = R = 0;\n  for (i = 0; i < BF_N + 2; i += 2)\n    {\n      L ^= data->binary.salt[i & 2];\n      R ^= data->binary.salt[(i & 2) + 1];\n      BF_ENCRYPT;\n      data->ctx.P[i] = L;\n      data->ctx.P[i + 1] = R;\n    }\n\n  ptr = data->ctx.S[0];\n  do\n    {\n      ptr += 4;\n      L ^= data->binary.salt[(BF_N + 2) & 3];\n      R ^= data->binary.salt[(BF_N + 3) & 3];\n      BF_ENCRYPT;\n      *(ptr - 4) = L;\n      *(ptr - 3) = R;\n\n      L ^= data->binary.salt[(BF_N + 4) & 3];\n      R ^= data->binary.salt[(BF_N + 5) & 3];\n      BF_ENCRYPT;\n      *(ptr - 2) = L;\n      *(ptr - 1) = R;\n    }\n  while (ptr < &data->ctx.S[3][0xFF]);\n\n  do\n    {\n      int done;\n\n      for (i = 0; i < BF_N + 2; i += 2)\n        {\n          data->ctx.P[i] ^= data->expanded_key[i];\n          data->ctx.P[i + 1] ^= data->expanded_key[i + 1];\n        }\n\n      done = 0;\n      do\n        {\n          BF_body ();\n          if (done)\n            break;\n          done = 1;\n\n          tmp1 = data->binary.salt[0];\n          tmp2 = data->binary.salt[1];\n          tmp3 = data->binary.salt[2];\n          tmp4 = data->binary.salt[3];\n          for (i = 0; i < BF_N; i += 4)\n            {\n              data->ctx.P[i] ^= tmp1;\n              data->ctx.P[i + 1] ^= tmp2;\n              data->ctx.P[i + 2] ^= tmp3;\n              data->ctx.P[i + 3] ^= tmp4;\n            }\n          data->ctx.P[16] ^= tmp1;\n          data->ctx.P[17] ^= tmp2;\n        }\n      while (1);\n    }\n  while (--count);\n\n  for (i = 0; i < 6; i += 2)\n    {\n      L = BF_magic_w[i];\n      R = BF_magic_w[i + 1];\n\n      count = 64;\n      do\n        {\n          BF_ENCRYPT;\n        }\n      while (--count);\n\n      data->binary.output[i] = L;\n      data->binary.output[i + 1] = R;\n    }\n\n  memcpy (output, setting, BF_SETTING_LENGTH - 1);\n  output[BF_SETTING_LENGTH - 1] =\n    BF_itoa64[(int)\n              BF_atoi64[(int) setting[BF_SETTING_LENGTH - 1] -\n                        0x20] & 0x30];\n\n  /* This has to be bug-compatible with the original implementation, so\n   * only encode 23 of the 24 bytes. :-) */\n  BF_swap (data->binary.output, 6);\n  BF_encode (&output[BF_SETTING_LENGTH], data->binary.output, 23);\n  output[BF_HASH_LENGTH - 1] = '\\0';\n\n  return true;\n}\n\n/*\n * Please preserve the runtime self-test.  It serves two purposes at once:\n *\n * 1. We really can't afford the risk of producing incompatible hashes e.g.\n * when there's something like gcc bug 26587 again, whereas an application or\n * library integrating this code might not also integrate our external tests or\n * it might not run them after every build.  Even if it does, the miscompile\n * might only occur on the production build, but not on a testing build (such\n * as because of different optimization settings).  It is painful to recover\n * from incorrectly-computed hashes - merely fixing whatever broke is not\n * enough.  Thus, a proactive measure like this self-test is needed.\n *\n * 2. We don't want to leave sensitive data from our actual password hash\n * computation on the stack or in registers.  Previous revisions of the code\n * would do explicit cleanups, but simply running the self-test after hash\n * computation is more reliable.\n *\n * The performance cost of this quick self-test is around 0.6% at the \"$2a$08\"\n * setting.\n */\nstatic void\nBF_full_crypt (const char *phrase, const char *setting,\n               uint8_t *output, size_t out_size,\n               void *scratch, size_t scr_size)\n{\n  /* This shouldn't ever happen, but...  */\n  if (out_size < BF_HASH_LENGTH || scr_size < sizeof (struct BF_buffer))\n    {\n      errno = ERANGE;\n      return;\n    }\n  struct BF_buffer *buffer = scratch;\n\n  /* Hash the supplied password */\n  if (!BF_crypt (phrase, setting, buffer->re_output, &buffer->data, 16))\n    return; /* errno has already been set */\n\n  /* Save and restore the current value of errno around the self-test.  */\n  int save_errno = errno;\n\n  /* Do a quick self-test.  It is important that we make both calls to\n     BF_crypt() from the same scope such that they likely use the same\n     stack locations, which makes the second call overwrite the first\n     call's sensitive data on the stack and makes it more likely that\n     any alignment related issues would be detected by the self-test.  */\n\n  static const char test_key[] = \"8b \\xd0\\xc1\\xd2\\xcf\\xcc\\xd8\";\n  static const char test_setting_init[] = \"$2a$00$abcdefghijklmnopqrstuu\";\n  static const char *const test_hashes[2] =\n  {\n    \"i1D709vfamulimlGcq0qq3UvuUasvEa\\0\\x55\",  /* 'a', 'b', 'y' */\n    \"VUrPmXD6q/nVSSp7pNDhCR9071IfIRe\\0\\x55\"   /* 'x' */\n  };\n  const char *test_hash = test_hashes[0];\n  char test_setting[BF_SETTING_LENGTH];\n  unsigned int flags = flags_by_subtype[(unsigned int) (unsigned char)\n                                                       setting[2] - 'a'];\n  bool ok;\n\n  memcpy (test_setting, test_setting_init, BF_SETTING_LENGTH);\n  test_hash = test_hashes[flags & 1];\n  test_setting[2] = setting[2];\n\n  memset (buffer->st_output, 0x55, sizeof buffer->st_output);\n\n  ok = (BF_crypt (test_key, test_setting, buffer->st_output, &buffer->data, 1)\n        && !memcmp (buffer->st_output, test_setting, BF_SETTING_LENGTH)\n        && !memcmp (buffer->st_output + BF_SETTING_LENGTH, test_hash,\n                    sizeof buffer->st_output - (BF_SETTING_LENGTH + 1)));\n\n  /* Do a second self-test of the key-expansion \"safety\" logic.  */\n  {\n    const char *k = \"\\xff\\xa3\" \"34\" \"\\xff\\xff\\xff\\xa3\" \"345\";\n    BF_key ae, ai, ye, yi;\n    BF_set_key (k, ae, ai, 2);  /* $2a$ */\n    BF_set_key (k, ye, yi, 4);  /* $2y$ */\n    ai[0] ^= 0x10000;           /* undo the safety (for comparison) */\n    ok = ok && ai[0] == 0xdb9c59bc && ye[17] == 0x33343500 &&\n         !memcmp (ae, ye, sizeof (ae)) && !memcmp (ai, yi, sizeof (ai));\n  }\n\n  if (!ok)\n    {\n      /* Self-test failed; pretend we don't support this hash type.  */\n      errno = EINVAL;\n      return;\n    }\n\n  /* Self-test succeeded; copy the true output into the true output\n     buffer and return.  We already know there is enough space.  */\n  memcpy (output, buffer->re_output, BF_HASH_LENGTH);\n  errno = save_errno;\n}\n#endif\n\n#if INCLUDE_bcrypt || INCLUDE_bcrypt_a || INCLUDE_bcrypt_y\nstatic void\nBF_gensalt (char subtype, unsigned long count,\n            const uint8_t *rbytes, size_t nrbytes,\n            uint8_t *output, size_t o_size)\n{\n  if (!count)\n    count = 5;\n  if (nrbytes < 16 ||\n      count < 4 || count > 31 ||\n      (subtype != 'a' && subtype != 'b' && subtype != 'y'))\n    {\n      errno = EINVAL;\n      return;\n    }\n  if (o_size < 7 + 22 + 1)\n    {\n      errno = ERANGE;\n      return;\n    }\n\n  BF_word aligned_rbytes[16 / sizeof(BF_word)];\n  memcpy(aligned_rbytes, rbytes, 16);\n\n  output[0] = '$';\n  output[1] = '2';\n  output[2] = (uint8_t)subtype;\n  output[3] = '$';\n  output[4] = (uint8_t)('0' + count / 10);\n  output[5] = (uint8_t)('0' + count % 10);\n  output[6] = '$';\n\n  BF_encode (&output[7], aligned_rbytes, 16);\n  output[7 + 22] = '\\0';\n}\n#endif\n\n#if INCLUDE_bcrypt\nvoid\ncrypt_bcrypt_rn (const char *phrase, size_t ARG_UNUSED (phr_size),\n                 const char *setting, size_t ARG_UNUSED (set_size),\n                 uint8_t *output, size_t out_size,\n                 void *scratch, size_t scr_size)\n{\n  BF_full_crypt (phrase, setting, output, out_size, scratch, scr_size);\n}\n\nvoid\ngensalt_bcrypt_rn (unsigned long count,\n                   const uint8_t *rbytes, size_t nrbytes,\n                   uint8_t *output, size_t o_size)\n{\n  BF_gensalt ('b', count, rbytes, nrbytes, output, o_size);\n}\n#endif\n\n#if INCLUDE_bcrypt_a\nvoid\ncrypt_bcrypt_a_rn (const char *phrase, size_t ARG_UNUSED (phr_size),\n                   const char *setting, size_t ARG_UNUSED (set_size),\n                   uint8_t *output, size_t out_size,\n                   void *scratch, size_t scr_size)\n{\n  BF_full_crypt (phrase, setting, output, out_size, scratch, scr_size);\n}\n\nvoid\ngensalt_bcrypt_a_rn (unsigned long count,\n                     const uint8_t *rbytes, size_t nrbytes,\n                     uint8_t *output, size_t o_size)\n{\n  BF_gensalt ('a', count, rbytes, nrbytes, output, o_size);\n}\n#endif\n\n#if INCLUDE_bcrypt_x\nvoid\ncrypt_bcrypt_x_rn (const char *phrase, size_t ARG_UNUSED (phr_size),\n                   const char *setting, size_t ARG_UNUSED (set_size),\n                   uint8_t *output, size_t out_size,\n                   void *scratch, size_t scr_size)\n{\n  BF_full_crypt (phrase, setting, output, out_size, scratch, scr_size);\n}\n\nvoid\ngensalt_bcrypt_x_rn (ARG_UNUSED(unsigned long count),\n                     ARG_UNUSED(const uint8_t *rbytes),\n                     ARG_UNUSED(size_t nrbytes),\n                     ARG_UNUSED(uint8_t *output),\n                     ARG_UNUSED(size_t o_size))\n{\n  /* The prefix '$2x$' MUST NOT be used for computing new hashes.  */\n  errno = EINVAL;\n  return;\n}\n#endif\n\n#if INCLUDE_bcrypt_y\nvoid\ncrypt_bcrypt_y_rn (const char *phrase, size_t ARG_UNUSED (phr_size),\n                   const char *setting, size_t ARG_UNUSED (set_size),\n                   uint8_t *output, size_t out_size,\n                   void *scratch, size_t scr_size)\n{\n  BF_full_crypt (phrase, setting, output, out_size, scratch, scr_size);\n}\n\nvoid\ngensalt_bcrypt_y_rn (unsigned long count,\n                     const uint8_t *rbytes, size_t nrbytes,\n                     uint8_t *output, size_t o_size)\n{\n  BF_gensalt ('y', count, rbytes, nrbytes, output, o_size);\n}\n#endif\n"
  },
  {
    "path": "lib/crypt-des-obsolete.c",
    "content": "/*\n * FreeSec: libcrypt for NetBSD\n *\n * Copyright (c) 1994 David Burren\n * All rights reserved.\n *\n * Adapted for FreeBSD-2.0 by Geoffrey M. Rehmet\n *\tthis file should now *only* export crypt(), in order to make\n *\tbinaries of libcrypt exportable from the USA\n *\n * Adapted for FreeBSD-4.0 by Mark R V Murray\n *\tthis file should now *only* export crypt_des(), in order to make\n *\ta module that can be optionally included in libcrypt.\n *\n * Adapted for libxcrypt by Zack Weinberg, 2017\n *\tsee notes in des.c\n *\n * Adapted for libxcrypt by Björn Esser, 2019\n *\tadd function-stubs simply setting error to ENOSYS.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the author nor the names of other contributors\n *    may be used to endorse or promote products derived from this software\n *    without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n *\n * This is an original implementation of the DES and the crypt(3) interfaces\n * by David Burren <davidb@werj.com.au>.\n */\n\n/* Obsolete DES symmetric cipher API - not to be used in new code.  */\n\n#include \"crypt-port.h\"\n#include \"crypt-obsolete.h\"\n#include \"alg-des.h\"\n#include <errno.h>\n\n#if (INCLUDE_encrypt || INCLUDE_encrypt_r || INCLUDE_setkey || INCLUDE_setkey_r) && \\\n    !ENABLE_OBSOLETE_API_ENOSYS\n\nstatic_assert(sizeof (struct des_ctx) + alignof (struct des_ctx)\n              <= CRYPT_DATA_INTERNAL_SIZE,\n              \"crypt_data.internal is too small for struct des_ctx\");\n\n/* struct crypt_data is allocated by application code and contains\n   only char-typed fields, so its 'internal' field may not be\n   sufficiently aligned.  */\nstatic inline struct des_ctx *\nget_des_ctx (struct crypt_data *data)\n{\n  uintptr_t internalp = (uintptr_t) data->internal;\n  const uintptr_t align = alignof (struct des_ctx);\n  internalp = (internalp + align - 1) & ~(align - 1);\n  return (struct des_ctx *)internalp;\n}\n\n/* For reasons lost in the mists of time, these functions operate on\n   64-*byte* arrays, each of which should be either 0 or 1 - only the\n   low bit of each byte is examined.  The DES primitives, much more\n   sensibly, operate on 8-byte/64-*bit* arrays.  */\n\nstatic void\nunpack_bits (char bytev[64], const unsigned char bitv[8])\n{\n  unsigned char c;\n  for (int i = 0; i < 8; i++)\n    {\n      c = bitv[i];\n      for (int j = 0; j < 8; j++)\n        bytev[i*8 + j] = (char)((c & (0x01 << (7 - j))) != 0);\n    }\n}\n\nstatic void\npack_bits (unsigned char bitv[8], const char bytev[64])\n{\n  unsigned int c;\n  for (int i = 0; i < 8; i++)\n    {\n      c = 0;\n      for (int j = 0; j < 8; j++)\n        {\n          c <<= 1;\n          c |= ((unsigned char)bytev[i*8 + j] & 0x01u);\n        }\n      bitv[i] = (unsigned char)c;\n    }\n}\n#endif\n\n/* Initialize DATA with a DES key, KEY, represented as a byte vector.  */\n#if (INCLUDE_setkey_r || INCLUDE_setkey) && !ENABLE_OBSOLETE_API_ENOSYS\nstatic void\ndo_setkey_r (const char *key, struct des_ctx *ctx)\n{\n  memset (ctx, 0, sizeof (struct des_ctx));\n  des_set_salt (ctx, 0);\n\n  unsigned char bkey[8];\n  pack_bits (bkey, key);\n  des_set_key (ctx, bkey);\n}\n#endif\n\n#if INCLUDE_setkey_r\nvoid\nsetkey_r (ARG_UNUSED (const char *key), ARG_UNUSED (struct crypt_data *data))\n{\n#if ENABLE_OBSOLETE_API_ENOSYS\n  /* This function is not supported in this configuration.  */\n  errno = ENOSYS;\n#else\n  do_setkey_r (key, get_des_ctx (data));\n#endif\n}\nSYMVER_setkey_r;\n#endif\n\n/* Encrypt or decrypt one DES block, BLOCK, using the key schedule in\n   DATA.  BLOCK is processed in place.  */\n#if (INCLUDE_encrypt_r || INCLUDE_encrypt) && !ENABLE_OBSOLETE_API_ENOSYS\nstatic void\ndo_encrypt_r (char *block, int edflag, struct des_ctx *ctx)\n{\n  unsigned char bin[8], bout[8];\n  pack_bits (bin, block);\n  des_crypt_block (ctx, bout, bin, 1, edflag != 0);\n  unpack_bits (block, bout);\n}\n#endif\n\n#if INCLUDE_encrypt_r\nvoid\nencrypt_r (char *block, ARG_UNUSED (int edflag),\n           ARG_UNUSED (struct crypt_data *data))\n{\n#if ENABLE_OBSOLETE_API_ENOSYS\n  /* Make sure sensitive data is erased in case\n     case get_random_bytes() fails.  */\n  explicit_bzero(block, 64);\n\n  /* Overwrite sensitive data with random data.  */\n  get_random_bytes(block, 64);\n\n  /* This function is not supported in this configuration.  */\n  errno = ENOSYS;\n#else\n  do_encrypt_r (block, edflag, get_des_ctx (data));\n#endif\n}\nSYMVER_encrypt_r;\n#endif\n\n/* Even-more-deprecated-than-the-above nonreentrant versions.\n   These use a separate state object from the main library's\n   nonreentrant crypt().  Unlike with crypt() vs crypt_r(),\n   these do not get their own file because they're not compiled\n   into the static library anyway.  */\n\n#if (INCLUDE_setkey || INCLUDE_encrypt) && !ENABLE_OBSOLETE_API_ENOSYS\nstatic struct des_ctx nr_encrypt_ctx;\n#endif\n\n#if INCLUDE_setkey\nvoid\nsetkey (ARG_UNUSED (const char *key))\n{\n#if ENABLE_OBSOLETE_API_ENOSYS\n  /* This function is not supported in this configuration.  */\n  errno = ENOSYS;\n#else\n  do_setkey_r (key, &nr_encrypt_ctx);\n#endif\n}\nSYMVER_setkey;\n#endif\n\n#if INCLUDE_encrypt\nvoid\nencrypt (char *block, ARG_UNUSED (int edflag))\n{\n#if ENABLE_OBSOLETE_API_ENOSYS\n  /* Make sure sensitive data is erased in case\n     case get_random_bytes() fails.  */\n  explicit_bzero(block, 64);\n\n  /* Overwrite sensitive data with random data.  */\n  get_random_bytes(block, 64);\n\n  /* This function is not supported in this configuration.  */\n  errno = ENOSYS;\n#else\n  do_encrypt_r (block, edflag, &nr_encrypt_ctx);\n#endif\n}\nSYMVER_encrypt;\n#endif\n"
  },
  {
    "path": "lib/crypt-des.c",
    "content": "/*\n * FreeSec: libcrypt for NetBSD\n *\n * Copyright (c) 1994 David Burren\n * All rights reserved.\n *\n * Adapted for FreeBSD-2.0 by Geoffrey M. Rehmet\n *\tthis file should now *only* export crypt(), in order to make\n *\tbinaries of libcrypt exportable from the USA\n *\n * Adapted for FreeBSD-4.0 by Mark R V Murray\n *\tthis file should now *only* export crypt_des(), in order to make\n *\ta module that can be optionally included in libcrypt.\n *\n * Adapted for libxcrypt by Zack Weinberg, 2017\n *\tsee notes in des.c\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the author nor the names of other contributors\n *    may be used to endorse or promote products derived from this software\n *    without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n *\n * This is an original implementation of the DES and the crypt(3) interfaces\n * by David Burren <davidb@werj.com.au>.\n */\n\n#include \"crypt-port.h\"\n#include \"alg-des.h\"\n\n#include <errno.h>\n\n#if INCLUDE_descrypt || INCLUDE_bsdicrypt || INCLUDE_bigcrypt\n\n#define DES_TRD_OUTPUT_LEN 14                /* SShhhhhhhhhhh0 */\n#define DES_EXT_OUTPUT_LEN 21                /* _CCCCSSSShhhhhhhhhhh0 */\n#define DES_BIG_OUTPUT_LEN ((16*11) + 2 + 1) /* SS (hhhhhhhhhhh){1,16} 0 */\n\n#define DES_MAX_OUTPUT_LEN \\\n  MAX (DES_TRD_OUTPUT_LEN, MAX (DES_EXT_OUTPUT_LEN, DES_BIG_OUTPUT_LEN))\n\nstatic_assert (DES_MAX_OUTPUT_LEN <= CRYPT_OUTPUT_SIZE,\n               \"CRYPT_OUTPUT_SIZE is too small for DES\");\n\n/* A des_buffer holds all of the sensitive intermediate data used by\n   crypt_des_*.  */\n\nstruct des_buffer\n{\n  struct des_ctx ctx;\n  uint8_t keybuf[8];\n  uint8_t pkbuf[8];\n};\n\nstatic_assert (sizeof (struct des_buffer) <= ALG_SPECIFIC_SIZE,\n               \"ALG_SPECIFIC_SIZE is too small for DES\");\n\n\nstatic inline int\nascii_to_bin(char ch)\n{\n  if (ch > 'z')\n    return -1;\n  if (ch >= 'a')\n    return ch - 'a' + 38;\n  if (ch > 'Z')\n    return -1;\n  if (ch >= 'A')\n    return ch - 'A' + 12;\n  if (ch > '9')\n    return -1;\n  if (ch >= '.')\n    return ch - '.';\n  return -1;\n}\n\n/* Generate an 11-character DES password hash into the buffer at\n   OUTPUT, and nul-terminate it.  The salt and key have already been\n   set.  The plaintext is 64 bits of zeroes, and the raw ciphertext is\n   written to cbuf[].  */\nstatic void\ndes_gen_hash (struct des_ctx *ctx, uint32_t count, uint8_t *output,\n              uint8_t cbuf[8])\n{\n  uint8_t plaintext[8];\n  memset (plaintext, 0, 8);\n  des_crypt_block (ctx, cbuf, plaintext, count, false);\n\n  /* Now encode the result.  */\n  const uint8_t *sptr = cbuf;\n  const uint8_t *end = sptr + 8;\n  unsigned int c1, c2;\n\n  do\n    {\n      c1 = *sptr++;\n      *output++ = ascii64[c1 >> 2];\n      c1 = (c1 & 0x03) << 4;\n      if (end - sptr <= 0)\n        {\n          *output++ = ascii64[c1];\n          break;\n        }\n\n      c2 = *sptr++;\n      c1 |= c2 >> 4;\n      *output++ = ascii64[c1];\n      c1 = (c2 & 0x0f) << 2;\n      if (end - sptr <= 0)\n        {\n          *output++ = ascii64[c1];\n          break;\n        }\n\n      c2 = *sptr++;\n      c1 |= c2 >> 6;\n      *output++ = ascii64[c1];\n      *output++ = ascii64[c2 & 0x3f];\n    }\n  while (end - sptr > 0);\n  *output = '\\0';\n}\n#endif\n\n#if INCLUDE_descrypt\n/* The original UNIX DES-based password hash, no extensions.  */\nvoid\ncrypt_descrypt_rn (const char *phrase, size_t ARG_UNUSED (phr_size),\n                   const char *setting, size_t ARG_UNUSED (set_size),\n                   uint8_t *output, size_t out_size,\n                   void *scratch, size_t scr_size)\n{\n  /* This shouldn't ever happen, but...  */\n  if (out_size < DES_TRD_OUTPUT_LEN || scr_size < sizeof (struct des_buffer))\n    {\n      errno = ERANGE;\n      return;\n    }\n\n  struct des_buffer *buf = scratch;\n  struct des_ctx *ctx = &buf->ctx;\n  uint32_t salt = 0;\n  uint8_t *keybuf = buf->keybuf, *pkbuf = buf->pkbuf;\n  uint8_t *cp = output;\n  int i;\n\n  /* \"old\"-style: setting - 2 bytes of salt, phrase - up to 8 characters.\n     Note: ascii_to_bin maps all byte values outside the ascii64\n     alphabet to -1.  Do not read past the end of the string.  */\n  i = ascii_to_bin (setting[0]);\n  if (i < 0)\n    {\n      errno = EINVAL;\n      return;\n    }\n  salt = (unsigned int)i;\n  i = ascii_to_bin (setting[1]);\n  if (i < 0)\n    {\n      errno = EINVAL;\n      return;\n    }\n  salt |= ((unsigned int)i << 6);\n\n  /* Write the canonical form of the salt to the output buffer.  We do\n     this instead of copying from the setting because the setting\n     might be catastrophically malformed (e.g. a 0- or 1-byte string;\n     this could plausibly happen if e.g. login(8) doesn't special-case\n     \"*\" or \"!\" in the password database).  */\n  *cp++ = ascii64[salt & 0x3f];\n  *cp++ = ascii64[(salt >> 6) & 0x3f];\n\n  /* Copy the first 8 characters of the password into keybuf, shifting\n     each character up by 1 bit and padding on the right with zeroes.  */\n  for (i = 0; i < 8; i++)\n    {\n      keybuf[i] = (uint8_t)(*phrase << 1);\n      if (*phrase)\n        phrase++;\n    }\n\n  des_set_key (ctx, keybuf);\n  des_set_salt (ctx, salt);\n  des_gen_hash (ctx, 25, cp, pkbuf);\n}\n#endif\n\n#if INCLUDE_bigcrypt\n/* This algorithm is algorithm 0 (default) shipped with the C2 secure\n   implementation of Digital UNIX.\n\n   Disclaimer: This work is not based on the source code to Digital\n   UNIX, nor am I (Andy Phillips) connected to Digital Equipment Corp,\n   in any way other than as a customer. This code is based on\n   published interfaces and reasonable guesswork.\n\n   Description: The cleartext is divided into blocks of 8 characters\n   or less. Each block is encrypted using the standard UNIX libc crypt\n   function. The result of the encryption for one block provides the\n   salt for the succeeding block.  The output is simply the\n   concatenation of all the blocks.  Up to 16 blocks are supported\n   (that is, the password can be no more than 128 characters long).\n\n   Andy Phillips <atp@mssl.ucl.ac.uk>  */\nvoid\ncrypt_bigcrypt_rn (const char *phrase, size_t phr_size,\n                   const char *setting, size_t set_size,\n                   uint8_t *output, size_t out_size,\n                   void *scratch, size_t scr_size)\n{\n  /* descrypt and bigcrypt generate identical hashes when the phrase\n     contains no more than 8 characters.  When the phrase is longer\n     than 8 characters, descrypt would truncate it, and bigcrypt would\n     generate a different, longer hash.  Therefore, when we encounter\n     a phrase longer than 8 characters together with a short setting\n     string, the appropriate behavior depends on whether descrypt is\n     enabled.  When it is, forward to descrypt.  When it isn't, reject\n     the operation.  */\n  if (phr_size > 8 && set_size <= 13)\n    {\n#if INCLUDE_descrypt\n      crypt_descrypt_rn (phrase, phr_size, setting, set_size,\n                         output, out_size, scratch, scr_size);\n#else\n      errno = EINVAL;\n#endif\n      return;\n    }\n\n  /* This shouldn't ever happen, but...  */\n  if (out_size < DES_BIG_OUTPUT_LEN || scr_size < sizeof (struct des_buffer))\n    {\n      errno = ERANGE;\n      return;\n    }\n\n  struct des_buffer *buf = scratch;\n  struct des_ctx *ctx = &buf->ctx;\n  uint32_t salt = 0;\n  uint8_t *keybuf = buf->keybuf, *pkbuf = buf->pkbuf;\n  uint8_t *cp = output;\n  int i, seg;\n\n  /* The setting string is exactly the same as for a traditional DES\n     hash.  */\n  i = ascii_to_bin (setting[0]);\n  if (i < 0)\n    {\n      errno = EINVAL;\n      return;\n    }\n  salt = (unsigned int)i;\n  i = ascii_to_bin (setting[1]);\n  if (i < 0)\n    {\n      errno = EINVAL;\n      return;\n    }\n  salt |= ((unsigned int)i << 6);\n\n  *cp++ = ascii64[salt & 0x3f];\n  *cp++ = ascii64[(salt >> 6) & 0x3f];\n\n  for (seg = 0; seg < 16; seg++)\n    {\n      /* Copy and shift each block as for the traditional DES.  */\n      for (i = 0; i < 8; i++)\n        {\n          keybuf[i] = (uint8_t)(*phrase << 1);\n          if (*phrase)\n            phrase++;\n        }\n\n      des_set_key (ctx, keybuf);\n      des_set_salt (ctx, salt);\n      des_gen_hash (ctx, 25, cp, pkbuf);\n\n      if (*phrase == 0)\n        break;\n\n      /* change the salt (1st 2 chars of previous block) - this was found\n         by dowsing - no need to check for invalid characters here */\n      salt = (unsigned int)ascii_to_bin ((char)cp[0]);\n      salt |= (unsigned int)ascii_to_bin ((char)cp[1]) << 6;\n      cp += 11;\n    }\n}\n#endif\n\n#if INCLUDE_bsdicrypt\n/* crypt_rn() entry point for BSD-style extended DES hashes.  These\n   permit long passwords and have more salt and a controllable iteration\n   count, but are still unacceptably weak by modern standards.  */\nvoid\ncrypt_bsdicrypt_rn (const char *phrase, size_t ARG_UNUSED (phr_size),\n                    const char *setting, size_t set_size,\n                    uint8_t *output, size_t out_size,\n                    void *scratch, size_t scr_size)\n{\n  /* This shouldn't ever happen, but...  */\n  if (out_size < DES_EXT_OUTPUT_LEN || scr_size < sizeof (struct des_buffer))\n    {\n      errno = ERANGE;\n      return;\n    }\n\n  /* If this is true, this function shouldn't have been called.\n     Setting must be at least 9 bytes long, byte 10+ is ignored.  */\n  if (*setting != '_' || set_size < 9)\n    {\n      errno = EINVAL;\n      return;\n    }\n\n  struct des_buffer *buf = scratch;\n  struct des_ctx *ctx = &buf->ctx;\n  uint32_t count = 0, salt = 0;\n  uint8_t *keybuf = buf->keybuf, *pkbuf = buf->pkbuf;\n  uint8_t *cp = output;\n  int i, x;\n\n  /* \"new\"-style DES hash:\n   \tsetting - underscore, 4 bytes of count, 4 bytes of salt\n   \tphrase - unlimited characters\n   */\n  for (i = 1; i < 5; i++)\n    {\n      x = ascii_to_bin(setting[i]);\n      if (x < 0)\n        {\n          errno = EINVAL;\n          return;\n        }\n      count |= (unsigned int)x << ((i - 1) * 6);\n    }\n\n  for (i = 5; i < 9; i++)\n    {\n      x = ascii_to_bin(setting[i]);\n      if (x < 0)\n        {\n          errno = EINVAL;\n          return;\n        }\n      salt |= (unsigned int)x << ((i - 5) * 6);\n    }\n\n  memcpy (cp, setting, 9);\n  cp += 9;\n\n  /* Fold passwords longer than 8 bytes into a single DES key using a\n     procedure similar to a Merkle-Dåmgard hash construction.  Each\n     block is shifted and padded, as for the traditional hash, then\n     XORed with the output of the previous round (IV all bits zero),\n     set as the DES key, and encrypted to produce the round output.\n     The salt is zero throughout this procedure.  */\n  des_set_salt (ctx, 0);\n  memset (pkbuf, 0, 8);\n  for (;;)\n    {\n      for (i = 0; i < 8; i++)\n        {\n          keybuf[i] = (uint8_t)(pkbuf[i] ^ (*phrase << 1));\n          if (*phrase)\n            phrase++;\n        }\n      des_set_key (ctx, keybuf);\n      if (*phrase == 0)\n        break;\n      des_crypt_block (ctx, pkbuf, keybuf, 1, false);\n    }\n\n  /* Proceed as for the traditional DES hash.  */\n  des_set_salt (ctx, salt);\n  des_gen_hash (ctx, count, cp, pkbuf);\n}\n#endif\n\n#if INCLUDE_descrypt || INCLUDE_bigcrypt\nvoid\ngensalt_descrypt_rn (unsigned long count,\n                     const uint8_t *rbytes, size_t nrbytes,\n                     uint8_t *output, size_t output_size)\n{\n  if (output_size < 3)\n    {\n      errno = ERANGE;\n      return;\n    }\n\n  if (nrbytes < 2 || count != 0)\n    {\n      errno = EINVAL;\n      return;\n    }\n\n  output[0] = ascii64[(unsigned int) rbytes[0] & 0x3f];\n  output[1] = ascii64[(unsigned int) rbytes[1] & 0x3f];\n  output[2] = '\\0';\n}\n#if INCLUDE_bigcrypt\nvoid\ngensalt_bigcrypt_rn (unsigned long count,\n                     const uint8_t *rbytes, size_t nrbytes,\n                     uint8_t *output, size_t output_size)\n{\n#if !INCLUDE_descrypt\n  /* We need descrypt + 12 bytes.  */\n  if (output_size < 3 + 12)\n    {\n      errno = ERANGE;\n      return;\n    }\n#endif\n\n  /* Same setting string as descrypt, but...  */\n  gensalt_descrypt_rn (count, rbytes, nrbytes, output, output_size);\n\n#if !INCLUDE_descrypt\n  /* ... add 12 trailing dummy characters, which makes the string too\n     long to be a descrypt setting, thus bigcrypt will be used.  */\n  strcpy_or_abort (output + 2, output_size - 2, \"............\");\n#endif\n}\n#endif\n#endif\n\n#if INCLUDE_bsdicrypt\nvoid\ngensalt_bsdicrypt_rn (unsigned long count,\n                      const uint8_t *rbytes, size_t nrbytes,\n                      uint8_t *output, size_t output_size)\n{\n  if (output_size < 1 + 4 + 4 + 1)\n    {\n      errno = ERANGE;\n      return;\n    }\n  if (nrbytes < 3)\n    {\n      errno = EINVAL;\n      return;\n    }\n\n  if (count == 0)\n    count = 725;\n  if (count > 0xffffff)\n    count = 0xffffff;\n\n  /* Even iteration counts make it easier to detect weak DES keys from a look\n     at the hash, so they should be avoided.  */\n  count |= 1;\n\n  unsigned long value =\n    ((unsigned long) (unsigned char) rbytes[0] <<  0) |\n    ((unsigned long) (unsigned char) rbytes[1] <<  8) |\n    ((unsigned long) (unsigned char) rbytes[2] << 16);\n\n  output[0] = '_';\n\n  output[1] = ascii64[(count >>  0) & 0x3f];\n  output[2] = ascii64[(count >>  6) & 0x3f];\n  output[3] = ascii64[(count >> 12) & 0x3f];\n  output[4] = ascii64[(count >> 18) & 0x3f];\n\n  output[5] = ascii64[(value >>  0) & 0x3f];\n  output[6] = ascii64[(value >>  6) & 0x3f];\n  output[7] = ascii64[(value >> 12) & 0x3f];\n  output[8] = ascii64[(value >> 18) & 0x3f];\n\n  output[9] = '\\0';\n}\n#endif\n"
  },
  {
    "path": "lib/crypt-gensalt-static.c",
    "content": "/* Copyright (C) 2007-2017 Thorsten Kukuk\n\n   This library is free software; you can redistribute it and/or\n   modify it under the terms of the GNU Lesser General Public License\n   as published by the Free Software Foundation; either version 2.1 of\n   the License, or (at your option) any later version.\n\n   This library is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n   GNU Lesser General Public License for more details.\n\n   You should have received a copy of the GNU Lesser General Public\n   License along with this library; if not, see\n   <https://www.gnu.org/licenses/>.  */\n\n#include \"crypt-port.h\"\n\n/* The functions that use global state objects are isolated in their\n   own files so that a statically-linked program that doesn't use them\n   will not have the state objects in its data segment.  */\n\n#if INCLUDE_crypt_gensalt\nchar *\ncrypt_gensalt (const char *prefix, unsigned long count,\n               const char *rbytes, int nrbytes)\n{\n  static char output[CRYPT_GENSALT_OUTPUT_SIZE];\n\n  return crypt_gensalt_rn (prefix, count,\n                           rbytes, nrbytes, output, sizeof (output));\n}\nSYMVER_crypt_gensalt;\n#endif\n\n/* For code compatibility with older versions (v3.1.1 and earlier).  */\n#if INCLUDE_crypt_gensalt && INCLUDE_xcrypt_gensalt\nstrong_alias (crypt_gensalt, xcrypt_gensalt);\nSYMVER_xcrypt_gensalt;\n#endif\n"
  },
  {
    "path": "lib/crypt-gost-yescrypt.c",
    "content": "/* Copyright (C) 2018 vt@altlinux.org\n * Copyright (C) 2018 Björn Esser besser82@fedoraproject.org\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\n#include \"crypt-port.h\"\n\n#if INCLUDE_gost_yescrypt\n\n#define YESCRYPT_INTERNAL\n#include \"alg-yescrypt.h\"\n#undef YESCRYPT_INTERNAL\n\n#include \"alg-gost3411-2012-hmac.h\"\n\n#include <errno.h>\n\n/* upper level hmac for tests */\n#ifndef outer_gost_hmac256\n#define outer_gost_hmac256 gost_hmac256\n#endif\n\n/* For use in scratch space by crypt_gost_yescrypt_rn().  */\ntypedef struct\n{\n  yescrypt_local_t local;\n  gost_hmac_256_t gostbuf;\n  uint8_t outbuf[CRYPT_OUTPUT_SIZE];\n  uint8_t gsetting[CRYPT_OUTPUT_SIZE];\n  uint8_t hk[32], interm[32], y[32];\n  uint8_t *retval;\n} crypt_gost_yescrypt_internal_t;\n\nstatic_assert (sizeof (crypt_gost_yescrypt_internal_t) <= ALG_SPECIFIC_SIZE,\n               \"ALG_SPECIFIC_SIZE is too small for GOST-YESCRYPT.\");\n\n/*\n * As OUTPUT is initialized with a failure token before gensalt_yescrypt_rn\n * is called, in case of an error we could just set an appropriate errno\n * and return.\n */\nvoid\ngensalt_gost_yescrypt_rn (unsigned long count,\n                          const uint8_t *rbytes, size_t nrbytes,\n                          uint8_t *output, size_t o_size)\n{\n  /* Up to 512 bits (64 bytes) of entropy for computing the salt portion\n     of the MCF-setting are supported.  */\n  nrbytes = (nrbytes > 64 ? 64 : nrbytes);\n\n  if (o_size < 4 + 8 * 6 + BASE64_LEN (nrbytes) + 1 ||\n      CRYPT_GENSALT_OUTPUT_SIZE < 4 + 8 * 6 + BASE64_LEN (nrbytes) + 1)\n    {\n      errno = ERANGE;\n      return;\n    }\n\n  /* We pass 'o_size - 1' to gensalt, because we need to shift\n           the prefix by 1 char to insert the gost marker.  */\n  gensalt_yescrypt_rn (count, rbytes, nrbytes, output, o_size - 1);\n\n  /* Check for failures.  */\n  if (output[0] == '*')\n    return;\n\n  /* Shift output one byte further.  */\n  memmove (output + 1, output, strlen ((const char *) output) + 1);\n\n  /* Insert the gost marker.  */\n  output[1] = 'g';\n}\n\nvoid\ncrypt_gost_yescrypt_rn (const char *phrase, size_t phr_size,\n                        const char *setting, size_t set_size,\n                        uint8_t *output, size_t o_size,\n                        void *scratch, size_t s_size)\n{\n  if (o_size < set_size + 1 + 43 + 1 ||\n      CRYPT_OUTPUT_SIZE < set_size + 1 + 43 + 1 ||\n      s_size < sizeof (crypt_gost_yescrypt_internal_t))\n    {\n      errno = ERANGE;\n      return;\n    }\n\n  /* Fail when called with wrong prefix.  */\n  if (strncmp (setting, \"$gy$\", 4))\n    {\n      errno = EINVAL;\n      return;\n    }\n\n  crypt_gost_yescrypt_internal_t *intbuf = scratch;\n\n  if (yescrypt_init_local (&intbuf->local))\n    return;\n\n  /* convert gost setting to yescrypt setting */\n  intbuf->gsetting[0] = '$';\n  intbuf->gsetting[1] = 'y';\n  intbuf->gsetting[2] = '$';\n  strcpy_or_abort (&intbuf->gsetting[3], set_size - 3, setting + 4);\n\n  intbuf->retval = yescrypt_r (NULL, &intbuf->local,\n                               (const uint8_t *) phrase, phr_size,\n                               intbuf->gsetting, NULL,\n                               intbuf->outbuf + 1, o_size - 1);\n\n  if (!intbuf->retval)\n    errno = EINVAL;\n\n  if (yescrypt_free_local (&intbuf->local) || !intbuf->retval)\n    return;\n\n  intbuf->outbuf[0] = '$';\n  intbuf->outbuf[1] = 'g';\n\n  /* extract yescrypt output from \"$y$param$salt$output\" */\n  char *hptr = strchr ((char *) intbuf->retval + 3, '$');\n  if (!hptr)\n    {\n      errno = EINVAL;\n      return;\n    }\n  hptr = strchr (hptr + 1, '$');\n  if (!hptr)\n    {\n      errno = EINVAL;\n      return;\n    }\n  hptr++; /* start of output */\n\n  /* decode yescrypt output into its raw 256-bit form */\n  size_t ylen = sizeof (intbuf->y);\n  if (!decode64 (intbuf->y, &ylen, (uint8_t *) hptr, strlen (hptr)) ||\n      ylen != sizeof (intbuf->y))\n    {\n      errno = EINVAL;\n      return;\n    }\n\n  /*\n   * HMAC_GOSTR3411_2012_256(\n   *   HMAC_GOSTR3411_2012_256(GOST2012_256(K), S),\n   *   yescrypt(K, S)\n   * )\n   * yescrypt output is used in place of message,\n   * thus, its crypto properties are superseded by GOST.\n   * Password is always hashed for inner hmac to avoid\n   * collisions between hashed and unhashed passwords.\n   */\n  gost_hash256 ((const uint8_t *) phrase, phr_size, intbuf->hk, &intbuf->gostbuf.ctx);\n  gost_hmac256 (intbuf->hk, sizeof (intbuf->hk),\n                (const uint8_t *) setting,\n                (size_t) ((uint8_t *) hptr - intbuf->retval),\n                intbuf->interm, &intbuf->gostbuf);\n  outer_gost_hmac256 (intbuf->interm, sizeof (intbuf->interm),\n                      intbuf->y, sizeof (intbuf->y), intbuf->y, &intbuf->gostbuf);\n\n  encode64 ((uint8_t *) hptr, o_size - (size_t) ((uint8_t *) hptr - intbuf->retval),\n            intbuf->y, sizeof (intbuf->y));\n\n  strcpy_or_abort (output, o_size, intbuf->outbuf);\n  return;\n}\n\n#endif /* INCLUDE_gost_yescrypt */\n"
  },
  {
    "path": "lib/crypt-md5.c",
    "content": "/* One way encryption based on MD5 sum.\n   Compatible with the behavior of MD5 crypt introduced in FreeBSD 2.0.\n\n   Copyright (C) 1996-2017 Free Software Foundation, Inc.\n   Modified by Björn Esser <besser82 at fedoraproject.org> in 2020.\n\n   This library is free software; you can redistribute it and/or\n   modify it under the terms of the GNU Lesser General Public License\n   as published by the Free Software Foundation; either version 2.1 of\n   the License, or (at your option) any later version.\n\n   This library is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n   GNU Lesser General Public License for more details.\n\n   You should have received a copy of the GNU Lesser General Public\n   License along with this library; if not, see\n   <https://www.gnu.org/licenses/>.  */\n\n#include \"crypt-port.h\"\n#include \"alg-md5.h\"\n\n#include <errno.h>\n\n#if INCLUDE_md5crypt\n\n/* Define our magic string to mark salt for MD5 \"encryption\"\n   replacement.  This is meant to be the same as for other MD5 based\n   encryption implementations.  */\nstatic const char md5_salt_prefix[] = \"$1$\";\n\n/* The maximum length of an MD5 salt string (just the actual salt, not\n   the entire prefix).  */\n#define SALT_LEN_MAX 8\n\n/* The length of an MD5-hashed password string, including the\n   terminating NUL character.  Prefix (including its NUL) + 8 bytes of\n   salt + separator + 22 bytes of hashed password.  */\n#define MD5_HASH_LENGTH \\\n  (sizeof (md5_salt_prefix) + SALT_LEN_MAX + 1 + 22)\n\nstatic_assert (MD5_HASH_LENGTH <= CRYPT_OUTPUT_SIZE,\n               \"CRYPT_OUTPUT_SIZE is too small for MD5\");\n\n/* An md5_buffer holds all of the sensitive intermediate data.  */\nstruct md5_buffer\n{\n  MD5_CTX ctx;\n  uint8_t result[16];\n};\n\nstatic_assert (sizeof (struct md5_buffer) <= ALG_SPECIFIC_SIZE,\n               \"ALG_SPECIFIC_SIZE is too small for MD5\");\n\n\n/* This entry point is equivalent to the `crypt' function in Unix\n   libcs.  */\nvoid\ncrypt_md5crypt_rn (const char *phrase, size_t phr_size,\n                   const char *setting, size_t ARG_UNUSED (set_size),\n                   uint8_t *output, size_t out_size,\n                   void *scratch, size_t scr_size)\n{\n  /* This shouldn't ever happen, but...  */\n  if (out_size < MD5_HASH_LENGTH || scr_size < sizeof (struct md5_buffer))\n    {\n      errno = ERANGE;\n      return;\n    }\n\n  struct md5_buffer *buf = scratch;\n  MD5_CTX *ctx = &buf->ctx;\n  uint8_t *result = buf->result;\n  char *cp = (char *)output;\n  const char *salt = setting;\n\n  size_t salt_size;\n  size_t cnt;\n\n  /* Find beginning of salt string.  The prefix should normally always\n     be present.  Just in case it is not.  */\n  if (strncmp (md5_salt_prefix, salt, sizeof (md5_salt_prefix) - 1) == 0)\n    /* Skip salt prefix.  */\n    salt += sizeof (md5_salt_prefix) - 1;\n\n\n  /* The salt ends at the next '$' or the end of the string.\n     Ensure ':' does not appear in the salt (it is used as a separator in /etc/passwd).\n     Also check for '\\n', as in /etc/passwd the whole parameters of the user data must\n     be on a single line. */\n  salt_size = strcspn (salt, \"$:\\n\");\n  if (!(salt[salt_size] == '$' || !salt[salt_size]))\n    {\n      errno = EINVAL;\n      return;\n    }\n\n  /* Ensure we do not use more salt than SALT_LEN_MAX. */\n  if (salt_size > SALT_LEN_MAX)\n    salt_size = SALT_LEN_MAX;\n\n  /* Compute alternate MD5 sum with input PHRASE, SALT, and PHRASE.  The\n     final result will be added to the first context.  */\n  MD5_Init (ctx);\n\n  /* Add phrase.  */\n  MD5_Update (ctx, phrase, phr_size);\n\n  /* Add salt.  */\n  MD5_Update (ctx, salt, salt_size);\n\n  /* Add phrase again.  */\n  MD5_Update (ctx, phrase, phr_size);\n\n  /* Now get result of this (16 bytes).  */\n  MD5_Final (result, ctx);\n\n  /* Prepare for the real work.  */\n  MD5_Init (ctx);\n\n  /* Add the phrase string.  */\n  MD5_Update (ctx, phrase, phr_size);\n\n  /* Because the SALT argument need not always have the salt prefix we\n     add it separately.  */\n  MD5_Update (ctx, md5_salt_prefix, sizeof (md5_salt_prefix) - 1);\n\n  /* The last part is the salt string.  This must be at most 8\n     characters and it ends at the first `$' character (for\n     compatibility with existing implementations).  */\n  MD5_Update (ctx, salt, salt_size);\n\n\n  /* Add for any character in the phrase one byte of the alternate sum.  */\n  for (cnt = phr_size; cnt > 16; cnt -= 16)\n    MD5_Update (ctx, result, 16);\n  MD5_Update (ctx, result, cnt);\n\n  /* For the following code we need a NUL byte.  */\n  *result = '\\0';\n\n  /* The original implementation now does something weird: for every 1\n     bit in the phrase the first 0 is added to the buffer, for every 0\n     bit the first character of the phrase.  This does not seem to be\n     what was intended but we have to follow this to be compatible.  */\n  for (cnt = phr_size; cnt > 0; cnt >>= 1)\n    MD5_Update (ctx, (cnt & 1) != 0 ? (const char *) result : phrase, 1);\n\n  /* Create intermediate result.  */\n  MD5_Final (result, ctx);\n\n  /* Now comes another weirdness.  In fear of password crackers here\n     comes a quite long loop which just processes the output of the\n     previous round again.  We cannot ignore this here.  */\n  for (cnt = 0; cnt < 1000; ++cnt)\n    {\n      /* New context.  */\n      MD5_Init (ctx);\n\n      /* Add phrase or last result.  */\n      if ((cnt & 1) != 0)\n        MD5_Update (ctx, phrase, phr_size);\n      else\n        MD5_Update (ctx, result, 16);\n\n      /* Add salt for numbers not divisible by 3.  */\n      if (cnt % 3 != 0)\n        MD5_Update (ctx, salt, salt_size);\n\n      /* Add phrase for numbers not divisible by 7.  */\n      if (cnt % 7 != 0)\n        MD5_Update (ctx, phrase, phr_size);\n\n      /* Add phrase or last result.  */\n      if ((cnt & 1) != 0)\n        MD5_Update (ctx, result, 16);\n      else\n        MD5_Update (ctx, phrase, phr_size);\n\n      /* Create intermediate result.  */\n      MD5_Final (result, ctx);\n    }\n\n  /* Now we can construct the result string.  It consists of three\n     parts.  We already know that there is enough space at CP.  */\n  memcpy (cp, md5_salt_prefix, sizeof (md5_salt_prefix) - 1);\n  cp += sizeof (md5_salt_prefix) - 1;\n\n  memcpy (cp, salt, salt_size);\n  cp += salt_size;\n  *cp++ = '$';\n\n#define b64_from_24bit(B2, B1, B0, N)                   \\\n  do {                                                  \\\n    unsigned int w = ((((unsigned int)(B2)) << 16) |    \\\n                      (((unsigned int)(B1)) << 8) |     \\\n                      ((unsigned int)(B0)));            \\\n    int n = (N);                                        \\\n    while (n-- > 0)                                     \\\n      {                                                 \\\n        *cp++ = b64t[w & 0x3f];                         \\\n        w >>= 6;                                        \\\n      }                                                 \\\n  } while (0)\n\n\n  b64_from_24bit (result[0], result[6], result[12], 4);\n  b64_from_24bit (result[1], result[7], result[13], 4);\n  b64_from_24bit (result[2], result[8], result[14], 4);\n  b64_from_24bit (result[3], result[9], result[15], 4);\n  b64_from_24bit (result[4], result[10], result[5], 4);\n  b64_from_24bit (0, 0, result[11], 2);\n\n  *cp = '\\0';\n}\n\nvoid\ngensalt_md5crypt_rn (unsigned long count,\n                     const uint8_t *rbytes, size_t nrbytes,\n                     uint8_t *output, size_t output_size)\n{\n  if (count != 0)\n    {\n      errno = EINVAL;\n      return;\n    }\n  gensalt_sha_rn (\"1\", 8, 1000, 1000, 1000, 1000,\n                  rbytes, nrbytes, output, output_size);\n}\n\n#endif\n"
  },
  {
    "path": "lib/crypt-nthash.c",
    "content": "/*-\n * Copyright (c) 1998-1999 Whistle Communications, Inc.\n * Copyright (c) 1998-1999 Archie Cobbs <archie@freebsd.org>\n * Copyright (c) 2003 Michael Bretterklieber\n * Copyright (c) 2017-2019 Björn Esser <besser82@fedoraproject.org>\n * Copyright (c) 2017-2019 Zack Weinberg <zackw at panix.com>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\n#include \"crypt-port.h\"\n\n#if INCLUDE_nt\n\n#include \"alg-md4.h\"\n\n#include <errno.h>\n#include <stdlib.h>\n\n#define MD4_HASHLEN        16\n\ntypedef struct\n{\n  MD4_CTX ctx;\n  uint8_t unipw[CRYPT_MAX_PASSPHRASE_SIZE * 2];\n  unsigned char hash[MD4_HASHLEN];\n} crypt_nt_internal_t;\n\nstatic_assert (sizeof (crypt_nt_internal_t) <= ALG_SPECIFIC_SIZE,\n               \"ALG_SPECIFIC_SIZE is too small for NTHASH.\");\n\n/*\n * NT HASH = md4(str2unicode(phrase))\n */\n\nvoid\ncrypt_nt_rn (const char *phrase, size_t phr_size,\n             const char *setting, size_t ARG_UNUSED (set_size),\n             uint8_t *output, size_t out_size,\n             void *scratch, size_t scr_size)\n{\n  static const char *magic = \"$3$\";\n  static const uint8_t *hexconvtab = (const uint8_t*) \"0123456789abcdef\";\n\n  if ((out_size < strlen (magic) + MD4_HASHLEN * 2 + 1) ||\n      (scr_size < sizeof (crypt_nt_internal_t)))\n    {\n      errno = ERANGE;\n      return;\n    }\n\n  if (strncmp (setting, magic, strlen (magic)))\n    {\n      errno = EINVAL;\n      return;\n    }\n\n  crypt_nt_internal_t *intbuf = scratch;\n\n  /* Convert the input to UCS-2LE, blindly assuming that it was\n     IANA ISO_8859-1:1987 to begin with (i.e. 0x00 .. 0xFF\n     encode U+0000 .. U+FFFF; technically this is a superset\n     of the original ISO 8859.1).  Note that this does not\n     U+0000-terminate intbuf->unipw.  */\n  for (size_t i = 0; i < phr_size; i++)\n    {\n      intbuf->unipw[2*i    ] = (uint8_t)phrase[i];\n      intbuf->unipw[2*i + 1] = 0x00;\n    }\n\n  /* Compute MD4 of Unicode password.  */\n  MD4_Init (&intbuf->ctx);\n  MD4_Update (&intbuf->ctx, intbuf->unipw, phr_size * 2);\n  MD4_Final (intbuf->hash, &intbuf->ctx);\n\n  /* Write the computed hash to the output buffer.  */\n  output += strcpy_or_abort (output, out_size, magic);\n  *output++ = '$';\n  for (size_t i = 0; i < MD4_HASHLEN; i++)\n    {\n      *output++ = hexconvtab[intbuf->hash[i] >> 4];\n      *output++ = hexconvtab[intbuf->hash[i] & 0xf];\n    }\n  *output = '\\0';\n}\n\n/* This function simply returns the magic string '$3$',\n   so it can be used as SETTING for the crypt function.  */\nvoid\ngensalt_nt_rn (unsigned long count,\n               ARG_UNUSED(const uint8_t *rbytes),\n               ARG_UNUSED(size_t nrbytes),\n               uint8_t *output,\n               size_t o_size)\n{\n  const char *prefix = \"$3$\";\n\n  /* Minimal O_SIZE to store the prefix.  */\n  if (o_size < strlen (prefix) + 1)\n    {\n      errno = ERANGE;\n      return;\n    }\n\n  if (count != 0)\n    {\n      errno = EINVAL;\n      return;\n    }\n\n  strcpy_or_abort (output, o_size, prefix);\n}\n\n#endif\n"
  },
  {
    "path": "lib/crypt-obsolete.h",
    "content": "/* Prototypes for obsolete functions in libcrypt.\n\n   Copyright (C) 1991-2017 Free Software Foundation, Inc.\n\n   This library is free software; you can redistribute it and/or\n   modify it under the terms of the GNU Lesser General Public License\n   as published by the Free Software Foundation; either version 2.1 of\n   the License, or (at your option) any later version.\n\n   This library is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n   GNU Lesser General Public License for more details.\n\n   You should have received a copy of the GNU Lesser General Public\n   License along with this library; if not, see\n   <https://www.gnu.org/licenses/>.  */\n\n#ifndef _CRYPT_OBSOLETE_H\n#define _CRYPT_OBSOLETE_H 1\n\n/* These API functions are obsolete and provided for binary backward\n   compatibility only.  New programs cannot be linked against them,\n   and we do not install this header, but we still need it to build the\n   library itself.  */\n\n/* Prepare to encrypt or decrypt data with DES, using KEY.  */\nextern void setkey (const char *key);\n\nextern void setkey_r (const char *key,\n                      struct crypt_data *restrict data);\n\n/* Encrypt data in BLOCK in place if EDFLAG is zero; otherwise decrypt\n   block in place.  */\nextern void encrypt (char *block, int edflag);\n\nextern void encrypt_r (char *block, int edflag,\n                       struct crypt_data *restrict data);\n\n#endif /* crypt-obsolete.h */\n"
  },
  {
    "path": "lib/crypt-pbkdf1-sha1.c",
    "content": "/*\n * Copyright (c) 2004, Juniper Networks, Inc.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holders nor the names of its\n *    contributors may be used to endorse or promote products derived\n *    from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n#include \"crypt-port.h\"\n#include \"alg-hmac-sha1.h\"\n#include \"byteorder.h\"\n\n#include <errno.h>\n#include <stdio.h>\n#include <stdlib.h>\n\n#if INCLUDE_sha1crypt\n\n/*\n * The default iterations - should take >0s on a fast CPU\n * but not be insane for a slow CPU.\n */\n#ifndef CRYPT_SHA1_ITERATIONS\n# define CRYPT_SHA1_ITERATIONS 262144\n#endif\n/*\n * Support a reasonably? long salt.\n */\n#ifndef CRYPT_SHA1_SALT_LENGTH\n# define CRYPT_SHA1_SALT_LENGTH 64\n#endif\n\n#define SHA1_SIZE 20         /* size of raw SHA1 digest, 160 bits */\n#define SHA1_OUTPUT_SIZE 28  /* size of base64-ed output string */\n\nstatic inline void\nto64 (uint8_t *s, unsigned long v, int n)\n{\n  while (--n >= 0)\n    {\n      *s++ = itoa64[v & 0x3f];\n      v >>= 6;\n    }\n}\n\n/*\n * UNIX password using hmac_sha1\n * This is PBKDF1 from RFC 2898, but using hmac_sha1.\n *\n * The format of the encrypted password is:\n * $<tag>$<iterations>$<salt>$<digest>\n *\n * where:\n * \t<tag>\t\tis \"sha1\"\n *\t<iterations>\tis an unsigned int identifying how many rounds\n * \t\t\thave been applied to <digest>.  The number\n * \t\t\tshould vary slightly for each password to make\n * \t\t\tit harder to generate a dictionary of\n * \t\t\tpre-computed hashes.  See gensalt_sha1crypt_rn.\n * \t<salt>\t\tup to 64 bytes of random data, 8 bytes is\n * \t\t\tcurrently considered more than enough.\n *\t<digest>\tthe hashed password.\n *\n * NOTE:\n * To be FIPS 140 compliant, the password which is used as a hmac key,\n * should be between 10 and 20 characters to provide at least 80bits\n * strength, and avoid the need to hash it before using as the\n * hmac key.\n */\nvoid\ncrypt_sha1crypt_rn (const char *phrase, size_t phr_size,\n                    const char *setting, size_t ARG_UNUSED (set_size),\n                    uint8_t *output, size_t out_size,\n                    void *scratch, size_t scr_size)\n{\n  static const char *magic = \"$sha1$\";\n\n  if ((out_size < (strlen (magic) + 2 + 10 + CRYPT_SHA1_SALT_LENGTH +\n                   SHA1_OUTPUT_SIZE)) ||\n      scr_size < SHA1_SIZE)\n    {\n      errno = ERANGE;\n      return;\n    }\n\n  const char *sp;\n  uint8_t *ep;\n  unsigned long ul;\n  size_t sl;\n  size_t pl = phr_size;\n  int dl;\n  unsigned long iterations;\n  unsigned long i;\n  /* XXX silence -Wpointer-sign (would be nice to fix this some other way) */\n  const uint8_t *pwu = (const uint8_t *)phrase;\n  uint8_t *hmac_buf = scratch;\n\n  /*\n   * Salt format is\n   * $<tag>$<iterations>$salt[$]\n   */\n\n  /* If the string doesn't starts with the magic prefix, we shouldn't have been called */\n  if (strncmp (setting, magic, strlen (magic)))\n    {\n      errno = EINVAL;\n      return;\n    }\n\n  setting += strlen (magic);\n  /* get the iteration count */\n  iterations = (unsigned long)strtoul (setting, (char **)&ep, 10);\n  if (*ep != '$')\n    {\n      errno = EINVAL;\n      return;  /* invalid input */\n    }\n  setting = (char *)ep + 1;  /* skip over the '$' */\n\n  /* The next 1..CRYPT_SHA1_SALT_LENGTH bytes should be itoa64 characters,\n     followed by another '$' (or end of string).  */\n  sp = setting + strspn (setting, (const char *)itoa64);\n  if (sp == setting || (*sp && *sp != '$'))\n    {\n      errno = EINVAL;\n      return;\n    }\n\n  sl = (size_t)(sp - setting);\n\n  /*\n   * Now get to work...\n   * Prime the pump with <salt><magic><iterations>\n   */\n  dl = snprintf ((char *)output, out_size, \"%.*s%s%lu\",\n                 (int)sl, setting, magic, iterations);\n  /*\n   * Then hmac using <phrase> as key, and repeat...\n   */\n  hmac_sha1_process_data ((const unsigned char *)output, (size_t)dl,\n                          pwu, pl, hmac_buf);\n  for (i = 1; i < iterations; ++i)\n    {\n      hmac_sha1_process_data (hmac_buf, SHA1_SIZE, pwu, pl, hmac_buf);\n    }\n  /* Now output... */\n  pl = (size_t)snprintf ((char *)output, out_size, \"%s%lu$%.*s$\",\n                         magic, iterations, (int)sl, setting);\n  ep = output + pl;\n\n  /* Every 3 bytes of hash gives 24 bits which is 4 base64 chars */\n  for (i = 0; i < SHA1_SIZE - 3; i += 3)\n    {\n      ul = (unsigned long)((hmac_buf[i+0] << 16) |\n                           (hmac_buf[i+1] << 8) |\n                           hmac_buf[i+2]);\n      to64 (ep, ul, 4);\n      ep += 4;\n    }\n  /* Only 2 bytes left, so we pad with byte0 */\n  ul = (unsigned long)((hmac_buf[SHA1_SIZE - 2] << 16) |\n                       (hmac_buf[SHA1_SIZE - 1] << 8) |\n                       hmac_buf[0]);\n  to64 (ep, ul, 4);\n  ep += 4;\n  *ep = '\\0';\n\n  /* Don't leave anything around in vm they could use. */\n  explicit_bzero (scratch, scr_size);\n}\n\n/* Modified excerpt from:\n   http://cvsweb.netbsd.org/bsdweb.cgi/~checkout~/src/lib/libcrypt/pw_gensalt.c */\nvoid\ngensalt_sha1crypt_rn (unsigned long count,\n                      const uint8_t *rbytes, size_t nrbytes,\n                      uint8_t *output, size_t o_size)\n{\n  static_assert (sizeof (uint32_t) == 4,\n                 \"space calculations below assume 8-bit bytes\");\n\n  /* Make sure we have enough random bytes to use for the salt.\n     The format supports using up to 48 random bytes, but 12 is\n     enough.  We require another 4 bytes of randomness to perturb\n     'count' with.  */\n  if (nrbytes < 12 + 4)\n    {\n      errno = EINVAL;\n      return;\n    }\n\n  /* Make sure we have enough output space, given the amount of\n     randomness available.  $sha1$<10digits>$<(nrbytes-4)*4/3>$ */\n  if (o_size < (nrbytes - 4) * 4 / 3 + sizeof \"$sha1$$$\" + 10)\n    {\n      errno = ERANGE;\n      return;\n    }\n\n  /*\n   * We treat 'count' as a hint.\n   * Make it harder for someone to pre-compute hashes for a\n   * dictionary attack by not using the same iteration count for\n   * every entry.\n   */\n  uint32_t rounds, random = le32_to_cpu (rbytes);\n\n  if (count == 0)\n    count = CRYPT_SHA1_ITERATIONS;\n  if (count < 4)\n    count = 4;\n  if (count > UINT32_MAX)\n    count = UINT32_MAX;\n  rounds = (uint32_t) (count - (random % (count / 4)));\n\n  uint32_t encbuf;\n  int n = snprintf((char *)output, o_size, \"$sha1$%u$\", (unsigned int)rounds);\n  assert (n >= 1 && (size_t)n + 2 < o_size);\n\n  const uint8_t *r = rbytes + 4;\n  const uint8_t *rlim = rbytes + nrbytes;\n  uint8_t *o = output + n;\n  uint8_t *olim = output + n + CRYPT_SHA1_SALT_LENGTH;\n  if (olim + 2 > output + o_size)\n    olim = output + o_size - 2;\n\n  for (; r + 3 < rlim && o + 4 < olim; r += 3, o += 4)\n    {\n      encbuf = ((((uint32_t)r[0]) << 16) |\n                (((uint32_t)r[1]) <<  8) |\n                (((uint32_t)r[2]) <<  0));\n      to64 (o, encbuf, 4);\n    }\n\n  o[0] = '$';\n  o[1] = '\\0';\n}\n\n#endif\n"
  },
  {
    "path": "lib/crypt-port.h",
    "content": "/* Portability glue for libcrypt.\n\n   Copyright 2007-2017 Thorsten Kukuk and Zack Weinberg\n   Copyright 2018-2019 Björn Esser\n\n   This library is free software; you can redistribute it and/or\n   modify it under the terms of the GNU Lesser General Public License\n   as published by the Free Software Foundation; either version 2.1 of\n   the License, or (at your option) any later version.\n\n   This library is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n   GNU Lesser General Public License for more details.\n\n   You should have received a copy of the GNU Lesser General Public\n   License along with this library; if not, see\n   <https://www.gnu.org/licenses/>.  */\n\n#ifndef _CRYPT_PORT_H\n#define _CRYPT_PORT_H 1\n\n#ifndef HAVE_CONFIG_H\n#error \"Run configure before compiling; see INSTALL for instructions\"\n#endif\n\n#include \"config.h\"\n\n#undef NDEBUG\n#include <assert.h>\n\n#include <stdbool.h>\n#include <stddef.h>\n#include <stdint.h>\n#include <string.h>\n#include <limits.h>\n#ifdef HAVE_SYS_TYPES_H\n#include <sys/types.h>\n#endif\n#ifdef HAVE_SYS_CDEFS_H\n#include <sys/cdefs.h>\n#endif\n#ifdef HAVE_ENDIAN_H\n#include <endian.h>\n#endif\n#ifdef HAVE_SYS_ENDIAN_H\n#include <sys/endian.h>\n#endif\n#ifdef HAVE_SYS_PARAM_H\n#include <sys/param.h>\n#endif\n\n/* unistd.h may contain declarations of crypt, crypt_r, crypt_data,\n   encrypt, and setkey; if present, they may be incompatible with our\n   declarations.  Rename them out of the way with macros.  This needs\n   to be done before we include crypt-symbol-vers.h, which defines\n   macros with the same names for symbol-versioning purposes.  */\n#ifdef HAVE_UNISTD_H\n#define crypt unistd_crypt_is_incompatible\n#define crypt_r unistd_crypt_r_is_incompatible\n#define crypt_data unistd_crypt_data_is_incompatible\n#define encrypt unistd_encrypt_is_incompatible\n#define setkey unistd_setkey_is_incompatible\n#include <unistd.h>\n#undef crypt\n#undef crypt_r\n#undef crypt_data\n#undef encrypt\n#undef setkey\n#endif\n\n#ifndef HAVE_SYS_CDEFS_THROW\n#define __THROW /* nothing */\n#endif\n\n/* Suppression of unused-argument warnings.  */\n#if defined __GNUC__ && __GNUC__ >= 3\n# define ARG_UNUSED(x) x __attribute__ ((__unused__))\n#else\n# define ARG_UNUSED(x) x\n#endif\n\n/* Functions that should not be inlined.  */\n#if defined __GNUC__ && __GNUC__ >= 3\n# define NO_INLINE __attribute__ ((__noinline__))\n#else\n# error \"Don't know how to prevent function inlining\"\n#endif\n\n/* C99 Static array indices in function parameter declarations.  Syntax\n   such as:  void bar(int myArray[static 10]);  is allowed in C99, but\n   not all compiler support it properly.  Define MIN_SIZE appropriately\n   so headers using it can be compiled using any compiler.\n   Use like this:  void bar(int myArray[MIN_SIZE(10)]);  */\n#if (defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L) && \\\n    ((defined __GNUC__ && __GNUC__ > 4) || defined __clang__)\n#define MIN_SIZE(x) static (x)\n#else\n#define MIN_SIZE(x) (x)\n#endif\n\n/* Detect system endianness.  */\n#if ENDIANNESS_IS_BIG\n# define XCRYPT_USE_BIGENDIAN 1\n#elif ENDIANNESS_IS_LITTLE\n# define XCRYPT_USE_BIGENDIAN 0\n#elif ENDIANNESS_IS_PDP\n# error \"Byte-order sensitive code in libxcrypt does not support PDP-endianness\"\n#else\n# error \"Unable to determine byte ordering\"\n#endif\n\n/* static_assert shim.  */\n#ifdef HAVE_STATIC_ASSERT_IN_ASSERT_H\n/* nothing to do */\n#elif defined HAVE__STATIC_ASSERT\n# define static_assert(expr, message) _Static_assert(expr, message)\n#else\n/* This fallback is known to work with most C99-compliant compilers.\n   See verify.h in gnulib for extensive discussion.  */\n# define static_assert(expr, message) \\\n  extern int (*xcrypt_static_assert_fn (void)) \\\n  [!!sizeof (struct { int xcrypt_error_if_negative: (expr) ? 2 : -1; })]\n#endif\n\n/* max_align_t shim.  In the absence of official word from the\n   compiler, we guess that one of long double, uintmax_t, void *, and\n   void (*)(void) will have the maximum alignment.  This is probably\n   not true in the presence of vector types, but we currently don't\n   use vector types, and hopefully any compiler with extra-aligned\n   vector types will provide max_align_t.  */\n#ifndef HAVE_MAX_ALIGN_T\ntypedef union\n{\n  long double ld;\n  uintmax_t ui;\n  void *vp;\n  void (*vpf)(void);\n} max_align_t;\n#endif\n\n/* Several files expect the traditional definitions of these macros.\n   (We don't trust sys/param.h to define them correctly.)  */\n#undef MIN\n#define MIN(a, b) (((a) < (b)) ? (a) : (b))\n#undef MAX\n#define MAX(a, b) (((a) > (b)) ? (a) : (b))\n\n/* Size of a declared array.  */\n#define ARRAY_SIZE(a_)  (sizeof (a_) / sizeof ((a_)[0]))\n\n/* Not all systems provide a library function usable for erasing\n   memory containing sensitive data, and among those that do, there is\n   no standard for what it should be called.  (Plain memset and bzero\n   are not usable for this purpose, because the compiler may remove\n   calls to these functions if it thinks the stores are dead.)\n\n   All code in libxcrypt is standardized on explicit_bzero() as the\n   name for the function that does this job; here, we map that name\n   to whatever platform routine is available, or to our own fallback\n   implementation.  */\n#define INCLUDE_explicit_bzero 0\n#if defined HAVE_MEMSET_EXPLICIT\n/* Preferred over explicit_bzero, as this is part of the C23 standard.\n   See: ISO/IEC 9899:2024  */\n#define explicit_bzero(s, len) memset_explicit(s, 0, len)\n#elif defined HAVE_MEMSET_S\n#define explicit_bzero(s, len) memset_s(s, len, 0, len)\n#elif defined HAVE_EXPLICIT_BZERO\n/* nothing to do */\n#elif defined HAVE_EXPLICIT_MEMSET\n#define explicit_bzero(s, len) explicit_memset(s, 0, len)\n#else\n/* activate our fallback implementation */\n#undef INCLUDE_explicit_bzero\n#define INCLUDE_explicit_bzero 1\n#define explicit_bzero _crypt_explicit_bzero\nextern void explicit_bzero (void *, size_t);\n#endif\n\n/* Provide a safe way to copy strings with the guarantee src,\n   including its terminating '\\0', will fit d_size bytes.\n   The trailing bytes of d_size will be filled with '\\0'.\n   dst and src must not be NULL.  Returns strlen (src).\n   Note: dst and src are declared as void * instead of char *\n   because some of the hashing methods want to call this\n   function with unsigned char * arguments.  */\n#define strcpy_or_abort _crypt_strcpy_or_abort\nextern size_t strcpy_or_abort (void *dst, size_t d_size, const void *src);\n\n\n/* Define ALIASNAME as a strong alias for NAME.  */\n#define strong_alias(name, aliasname) _strong_alias(name, aliasname)\n\n/* Darwin (Mach-O) doesn't support alias attributes or symbol versioning.\n   It does, however, support symbol aliasing at the object file level.  */\n#ifdef __APPLE__\n\n# define _strong_alias(name, aliasname)         \\\n  __asm__(\".globl _\" #aliasname);               \\\n  __asm__(\".set _\" #aliasname \", _\" #name);     \\\n  extern __typeof(name) aliasname __THROW\n\n# define symver_set(extstr, intname, version, mode)     \\\n  __asm__(\".globl _\" extstr);                           \\\n  __asm__(\".set _\" extstr \", _\" #intname)\n\n#elif defined _WIN32\n\n/* .symver is only supported for ELF format, Windows uses COFF/PE */\n# define symver_set(extstr, intname, version, mode)\n\n#elif defined __GNUC__ && __GNUC__ >= 3\n\n# define _strong_alias(name, aliasname) \\\n  extern __typeof (name) aliasname __THROW __attribute__ ((alias (#name)))\n\n/* Starting with GCC 10, we can use the symver attribute, which is also\n   needed at the point we decide to enable link-time optimization.  */\n# if defined HAVE_FUNC_ATTRIBUTE_SYMVER\n\n/* Set the symbol version for EXTNAME, which uses INTNAME as its\n   implementation.  */\n# define symver_set(extstr, intname, version, mode) \\\n  extern __typeof (intname) intname __THROW \\\n    __attribute__((symver (extstr mode #version)))\n\n/* Referencing specific _compatibility_ symbols still needs inline asm.  */\n# define _symver_ref(extstr, intname, version) \\\n  __asm__ (\".symver \" #intname \",\" extstr \"@\" #version)\n\n# else\n\n/* Set the symbol version for EXTNAME, which uses INTNAME as its\n   implementation.  */\n# define symver_set(extstr, intname, version, mode) \\\n  __asm__ (\".symver \" #intname \",\" extstr mode #version)\n\n# endif\n\n#else\n# error \"Don't know how to do symbol versioning with this compiler\"\n#endif\n\n/* A construct with the same syntactic role as the expansion of symver_set,\n   but which does nothing.  */\n#define symver_nop() __asm__ (\"\")\n\n/* The macros for versioned symbols work differently in this library\n   than they do in glibc.  They are mostly auto-generated\n   (see build-aux/scripts/gen-crypt-symbol-vers-h)\n   and we currently don't support compatibility symbols that need a different\n   definition from the default version.\n\n   Each definition of a public symbol should look like this:\n   #if INCLUDE_foo\n   int foo(arguments)\n   {\n     body\n   }\n   SYMVER_foo;\n   #endif\n\n   and the macros take care of the rest.  Normally, to call a public\n   symbol you do nothing special.  The macro symver_ref() forces\n   all uses of a particular name (in the file where it's used) to refer\n   to a particular version of a public symbol, e.g. for testing.  */\n\n#ifdef IN_LIBCRYPT\n\n#include \"crypt-symbol-vers.h\"\n\n#ifdef PIC\n\n#define symver_compat(n, extstr, extname, intname, version) \\\n  strong_alias (intname, extname ## __ ## n); \\\n  symver_set (extstr, extname ## __ ## n, version, \"@\")\n\n#define symver_compat0(extstr, intname, version) \\\n  symver_set (extstr, intname, version, \"@\")\n\n#define symver_default(extstr, intname, version) \\\n  symver_set (extstr, intname, version, \"@@\")\n\n#else\n\n/* When not building the shared library, don't do any of this.  */\n#define symver_compat(n, extstr, extname, intname, version) symver_nop ()\n#define symver_compat0(extstr, intname, version) symver_nop ()\n#define symver_default(extstr, intname, version) symver_nop ()\n\n#endif\n#endif\n\n/* Tests may need to _refer_ to compatibility symbols, but should never need\n   to _define_ them.  */\n#define symver_ref(extstr, intname, version) \\\n  _symver_ref(extstr, intname, version)\n\n/* Generic way for referencing specific _compatibility_ symbols.  */\n#ifndef _symver_ref\n#define _symver_ref(extstr, intname, version) \\\n  symver_set(extstr, intname, version, \"@\")\n#endif\n\n/* Define configuration macros used during compile-time by the\n   GOST R 34.11-2012 \"Streebog\" hash function.  */\n#if XCRYPT_USE_BIGENDIAN\n#define __GOST3411_BIG_ENDIAN__ 1\n#else\n#define __GOST3411_LITTLE_ENDIAN__ 1\n#endif\n\n/* Get the set of hash algorithms to be included and some related\n   definitions.  */\n#include \"crypt-hashes.h\"\n\n/* Rename all of the internal-but-global symbols with a _crypt_ prefix\n   so that they do not interfere with other people's code when linking\n   statically.  This list cannot be autogenerated, but is validated by\n   test-symbols.sh.  */\n\n#define ascii64                  _crypt_ascii64\n#define get_random_bytes         _crypt_get_random_bytes\n#define make_failure_token       _crypt_make_failure_token\n\n#if INCLUDE_descrypt || INCLUDE_bsdicrypt || INCLUDE_bigcrypt\n#define des_crypt_block          _crypt_des_crypt_block\n#define des_set_key              _crypt_des_set_key\n#define des_set_salt             _crypt_des_set_salt\n#define comp_maskl               _crypt_comp_maskl\n#define comp_maskr               _crypt_comp_maskr\n#define fp_maskl                 _crypt_fp_maskl\n#define fp_maskr                 _crypt_fp_maskr\n#define ip_maskl                 _crypt_ip_maskl\n#define ip_maskr                 _crypt_ip_maskr\n#define key_perm_maskl           _crypt_key_perm_maskl\n#define key_perm_maskr           _crypt_key_perm_maskr\n#define m_sbox                   _crypt_m_sbox\n#define psbox                    _crypt_psbox\n#endif\n\n#if INCLUDE_nt\n#define MD4_Init   _crypt_MD4_Init\n#define MD4_Update _crypt_MD4_Update\n#define MD4_Final  _crypt_MD4_Final\n#endif\n\n#if INCLUDE_md5crypt || INCLUDE_sunmd5\n#define MD5_Init   _crypt_MD5_Init\n#define MD5_Update _crypt_MD5_Update\n#define MD5_Final  _crypt_MD5_Final\n#endif\n\n#if INCLUDE_sha1crypt\n#define hmac_sha1_process_data   _crypt_hmac_sha1_process_data\n#define sha1_finish_ctx          _crypt_sha1_finish_ctx\n#define sha1_init_ctx            _crypt_sha1_init_ctx\n#define sha1_process_bytes       _crypt_sha1_process_bytes\n#endif\n\n#if INCLUDE_sha512crypt\n#define libcperciva_SHA512_Init   _crypt_SHA512_Init\n#define libcperciva_SHA512_Update _crypt_SHA512_Update\n#define libcperciva_SHA512_Final  _crypt_SHA512_Final\n#define libcperciva_SHA512_Buf    _crypt_SHA512_Buf\n#endif\n\n#if INCLUDE_md5crypt || INCLUDE_sha256crypt || INCLUDE_sha512crypt || \\\n    INCLUDE_sm3crypt\n#define gensalt_sha_rn           _crypt_gensalt_sha_rn\n#endif\n\n#if INCLUDE_yescrypt || INCLUDE_scrypt || INCLUDE_gost_yescrypt || \\\n    INCLUDE_sm3_yescrypt\n#define PBKDF2_SHA256            _crypt_PBKDF2_SHA256\n#define crypto_scrypt            _crypt_crypto_scrypt\n#define yescrypt                 _crypt_yescrypt\n#define yescrypt_decode64        _crypt_yescrypt_decode64\n#define yescrypt_digest_shared   _crypt_yescrypt_digest_shared\n#define yescrypt_encode64        _crypt_yescrypt_encode64\n#define yescrypt_encode_params   _crypt_yescrypt_encode_params\n#define yescrypt_encode_params_r _crypt_yescrypt_encode_params_r\n#define yescrypt_free_local      _crypt_yescrypt_free_local\n#define yescrypt_free_shared     _crypt_yescrypt_free_shared\n#define yescrypt_init_local      _crypt_yescrypt_init_local\n#define yescrypt_init_shared     _crypt_yescrypt_init_shared\n#define yescrypt_kdf             _crypt_yescrypt_kdf\n#define yescrypt_r               _crypt_yescrypt_r\n#define yescrypt_reencrypt       _crypt_yescrypt_reencrypt\n\n#define libcperciva_HMAC_SHA256_Init _crypt_HMAC_SHA256_Init\n#define libcperciva_HMAC_SHA256_Update _crypt_HMAC_SHA256_Update\n#define libcperciva_HMAC_SHA256_Final _crypt_HMAC_SHA256_Final\n#define libcperciva_HMAC_SHA256_Buf _crypt_HMAC_SHA256_Buf\n#endif\n\n#if INCLUDE_sha256crypt || INCLUDE_scrypt || INCLUDE_yescrypt || \\\n    INCLUDE_gost_yescrypt || INCLUDE_sm3_yescrypt\n#define libcperciva_SHA256_Init  _crypt_SHA256_Init\n#define libcperciva_SHA256_Update _crypt_SHA256_Update\n#define libcperciva_SHA256_Final _crypt_SHA256_Final\n#define libcperciva_SHA256_Buf   _crypt_SHA256_Buf\n#endif\n\n#if INCLUDE_sm3crypt || INCLUDE_sm3_yescrypt\n#define sm3_init   _crypt_sm3_init\n#define sm3_update _crypt_sm3_update\n#define sm3_final  _crypt_sm3_final\n#define sm3_hash   _crypt_sm3_hash\n#define sm3_buf    _crypt_sm3_buf\n#endif\n\n#if INCLUDE_gost_yescrypt\n#define GOST34112012Init       _crypt_GOST34112012_Init\n#define GOST34112012Update     _crypt_GOST34112012_Update\n#define GOST34112012Final      _crypt_GOST34112012_Final\n#define GOST34112012Cleanup    _crypt_GOST34112012_Cleanup\n#define gost_hash256           _crypt_gost_hash256\n#define gost_hmac256           _crypt_gost_hmac256\n#endif\n\n#if INCLUDE_sm3_yescrypt\n#define sm3_hmac_buf      _crypt_sm3_hmac_buf\n#define sm3_hmac_final    _crypt_sm3_hmac_final\n#define sm3_hmac_init     _crypt_sm3_hmac_init\n#define sm3_hmac_update   _crypt_sm3_hmac_update\n#define sm3_hmac          _crypt_sm3_hmac\n#endif\n\n/* Those are not present, if gost-yescrypt or sm3-yescrypt\n   is selected, but yescrypt is not. */\n#if !INCLUDE_yescrypt && (INCLUDE_gost_yescrypt || INCLUDE_sm3_yescrypt)\n#define gensalt_yescrypt_rn _crypt_gensalt_yescrypt_rn\nextern void gensalt_yescrypt_rn\n(unsigned long, const uint8_t *, size_t, uint8_t *, size_t);\n#endif\n\n/* Those are not present, if des-big is selected, but des is not. */\n#if INCLUDE_bigcrypt && !INCLUDE_descrypt\n#define gensalt_descrypt_rn _crypt_gensalt_descrypt_rn\nextern void gensalt_descrypt_rn\n(unsigned long, const uint8_t *, size_t, uint8_t *, size_t);\n#endif\n\n/* Those are not present, if scrypt is selected, but yescrypt is not. */\n#if INCLUDE_scrypt && !INCLUDE_yescrypt\n#define crypt_yescrypt_rn _crypt_crypt_yescrypt_rn\nextern void crypt_yescrypt_rn (const char *, size_t, const char *,\n                               size_t, uint8_t *, size_t, void *, size_t);\n#endif\n\n/* We need a prototype for fcrypt for some tests.  */\n#if ENABLE_OBSOLETE_API\nextern char *fcrypt (const char *key, const char *setting);\n#endif\n\n/* Utility functions */\n\n/* Fill BUF with BUFLEN bytes whose values are chosen uniformly at\n   random, using a cryptographically strong RNG provided by the\n   operating system.  BUFLEN may not be greater than 256.  Returns\n   true if all BUFLEN bytes were successfully filled, false otherwise;\n   sets errno when it returns false.  Can block.  */\nextern bool get_random_bytes (void *buf, size_t buflen);\n\n/* Generate a setting string in the format common to md5crypt,\n   sha256crypt, and sha512crypt.  */\nextern void gensalt_sha_rn (const char *tag, size_t maxsalt, unsigned long defcount,\n                            unsigned long mincount, unsigned long maxcount,\n                            unsigned long count,\n                            const uint8_t *rbytes, size_t nrbytes,\n                            uint8_t *output, size_t output_size);\n\n/* For historical reasons, crypt and crypt_r are not expected ever\n   to return 0, and for internal implementation reasons (see\n   call_crypt_fn, in crypt.c), it is simpler if the individual\n   algorithms' crypt and gensalt functions return nothing.\n\n   This function generates a \"failure token\" in the output buffer,\n   which is guaranteed not to be equal to any valid password hash or\n   setting string, nor to the setting(+hash) string that was passed\n   in; thus, a subsequent blind attempt to authenticate someone by\n   comparing the output to a previously recorded hash string will\n   fail, even if that string is itself one of these \"failure tokens\".\n\n   We always call this function on the output buffer as the first\n   step.  If the individual algorithm's crypt or gensalt function\n   succeeds, it overwrites the failure token with real output;\n   otherwise the token is left intact, and the API functions that\n   _can_ return 0 on error notice it.  */\nextern void\nmake_failure_token (const char *setting, char *output, int size);\n\n/* The base-64 encoding table used by most hashing methods.\n   (bcrypt uses a slightly different encoding.)  Size 65\n   because it's used as a C string in a few places.  */\nextern const unsigned char ascii64[65];\n\n/* Same table gets used with other names in various places.  */\n#define b64t   ((const char *) ascii64)\n#define itoa64 ascii64\n\n/* Calculate the size of a base64 encoding of N bytes:\n   6 bits per output byte, rounded up.  */\n#define BASE64_LEN(bytes) ((((bytes) * 8) + 5) / 6)\n\n/* The \"scratch\" area passed to each of the individual hash functions is\n   this big.  */\n#define ALG_SPECIFIC_SIZE 8192\n\n#include \"crypt.h\"\n\n#endif /* crypt-port.h */\n"
  },
  {
    "path": "lib/crypt-scrypt.c",
    "content": "/* Copyright (C) 2013 Alexander Peslyak\n * Copyright (C) 2018 Björn Esser <besser82@fedoraproject.org>\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\n#include \"crypt-port.h\"\n#include \"crypt-hashes.h\"\n\n#include <errno.h>\n\n#if INCLUDE_scrypt\n\nstatic int\ncheck_salt_char (char ch)\n{\n  if (ch > 'z')\n    return 0;\n  if (ch >= 'a')\n    return 1;\n  if (ch > 'Z')\n    return 0;\n  if (ch >= 'A')\n    return 1;\n  if (ch > '9')\n    return 0;\n  if (ch >= '.' || ch == '$')\n    return 1;\n  return 0;\n}\n\nstatic int\nverify_salt (const char *setting, size_t set_size)\n{\n  for (size_t i = 3 + 1 + 5 * 2; i < set_size; i++)\n    {\n      if (!check_salt_char (setting[i]))\n        {\n          /* Salt is terminated properly.\n             Following characters don't matter.  */\n          if (setting[i - 1] == '$')\n            break;\n\n          /* Salt has an invalid character.  */\n          return 0;\n        }\n    }\n  return 1;\n}\n\nstatic uint8_t *\nencode64_uint32 (uint8_t * dst, ssize_t dstlen,\n                 uint32_t src, uint32_t srcbits)\n{\n  uint32_t bit;\n\n  for (bit = 0; bit < srcbits; bit += 6)\n    {\n      if (dstlen < 1)\n        {\n          errno = ERANGE;\n          return NULL;\n        }\n      *dst++ = ascii64[src & 0x3f];\n      dstlen--;\n      src >>= 6;\n    }\n\n  *dst = '\\0';\n  return dst;\n}\n\nstatic uint8_t *\nencode64 (uint8_t * dst, ssize_t dstlen,\n          const uint8_t * src, size_t srclen)\n{\n  size_t i;\n\n  for (i = 0; i < srclen; )\n    {\n      uint8_t * dnext;\n      uint32_t value = 0, bits = 0;\n      do\n        {\n          value |= (uint32_t) src[i++] << bits;\n          bits += 8;\n        }\n      while (bits < 24 && i < srclen);\n      dnext = encode64_uint32 (dst, dstlen, value, bits);\n      if (!dnext)\n        {\n          errno = ERANGE;\n          return NULL;\n        }\n      dstlen -= (dnext - dst);\n      dst = dnext;\n    }\n\n  *dst = '\\0';\n  return dst;\n}\n\nstatic uint32_t\nN2log2 (uint64_t N)\n{\n  uint32_t N_log2;\n\n  if (N < 2)\n    return 0;\n\n  N_log2 = 2;\n  while (N >> N_log2 != 0)\n    N_log2++;\n  N_log2--;\n\n  if (N >> N_log2 != 1)\n    return 0;\n\n  return N_log2;\n}\n\n/*\n * Wrapper for crypt_yescrypt_rn to compute the hash.\n */\nvoid\ncrypt_scrypt_rn (const char *phrase, size_t phr_size,\n                 const char *setting, size_t set_size,\n                 uint8_t *output, size_t o_size,\n                 void *scratch, size_t s_size)\n{\n  if (o_size < set_size + 1 + 43 + 1 ||\n      CRYPT_OUTPUT_SIZE < set_size + 1 + 43 + 1)\n    {\n      errno = ERANGE;\n      return;\n    }\n\n  /* Setting is invalid.  */\n  if (strncmp (setting, \"$7$\", 3) || !verify_salt (setting, set_size))\n    {\n      errno = EINVAL;\n      return;\n    }\n\n  crypt_yescrypt_rn (phrase, phr_size, setting, set_size,\n                     output, o_size, scratch, s_size);\n  return;\n}\n\nvoid\ngensalt_scrypt_rn (unsigned long count,\n                   const uint8_t *rbytes, size_t nrbytes,\n                   uint8_t *output, size_t o_size)\n{\n  /* Up to 512 bits (64 bytes) of entropy for computing the salt portion\n     of the MCF-setting are supported.  */\n  nrbytes = (nrbytes > 64 ? 64 : nrbytes);\n\n  if (o_size < 3 + 1 + 5 * 2 + BASE64_LEN (nrbytes) + 1 ||\n      CRYPT_GENSALT_OUTPUT_SIZE < 3 + 1 + 5 * 2 + BASE64_LEN (nrbytes) + 1)\n    {\n      errno = ERANGE;\n      return;\n    }\n\n  if ((count > 0 && count < 6) || count > 11 || nrbytes < 16)\n    {\n      errno = EINVAL;\n      return;\n    }\n\n  /* Temporary buffer for operation.  The buffer is guaranteed to be\n     large enough to hold the maximum size of the generated salt.  */\n  uint8_t outbuf[CRYPT_GENSALT_OUTPUT_SIZE];\n  uint8_t *out_p = outbuf + 4;\n  ssize_t out_s = CRYPT_GENSALT_OUTPUT_SIZE - (out_p - outbuf);\n\n  /* Valid cost parameters are from 6 to 11.  The default is 7.\n     Any cost parameter below 6 is not to be considered strong\n     enough anymore, because using less than 32 MiBytes of RAM\n     when computing a hash is even weaker than bcrypt ($2y$).\n     These are used to set scrypt's 'N' and 'r' parameters as\n     follows:\n     N (block count) is specified in units of r (block size,\n     adjustable in steps of 128 bytes).\n\n     128 bytes * r = size of each memory block\n\n     128 bytes * r * N = total amount of memory used for hashing\n                         in N blocks of r * 128 bytes.\n\n     The author of yescrypt recommends in the documentation to use\n     r=8 (a block size of 1 KiB) for total sizes of 2 MiB and less,\n     and r=32 (a block size of 4KiB) above that.\n     This has to do with the typical per-core last-level cache sizes\n     of current CPUs.  */\n  if (count == 0)\n    count = 7;\n\n  uint32_t p = 1;\n  uint32_t r = 32;\n  uint64_t N = 1ULL << (count + 7); // 6 -> 8192, 7 -> 16384, ... 11 -> 262144\n\n  if (out_s > (ssize_t) BASE64_LEN (30))\n    {\n      outbuf[0] = '$';\n      outbuf[1] = '7';\n      outbuf[2] = '$';\n      outbuf[3] = ascii64[N2log2 (N)];\n\n      out_p = encode64_uint32 (out_p, out_s, r, 30);\n      out_s -= (out_p - outbuf);\n    }\n\n  if (out_p && out_s > (ssize_t) BASE64_LEN (30))\n    {\n      out_p = encode64_uint32 (out_p, out_s, p, 30);\n      out_s -= (out_p - outbuf);\n    }\n\n  if (out_p && out_s > (ssize_t) BASE64_LEN (nrbytes))\n    {\n      out_p = encode64 (out_p, out_s, rbytes, nrbytes);\n    }\n\n  if (out_p)\n    {\n      strcpy_or_abort (output, o_size, outbuf);\n    }\n\n  return;\n}\n\n#endif /* INCLUDE_scrypt */\n"
  },
  {
    "path": "lib/crypt-sha256.c",
    "content": "/* One way encryption based on the SHA256-based Unix crypt implementation.\n *\n * Written by Ulrich Drepper <drepper at redhat.com> in 2007 [1].\n * Modified by Zack Weinberg <zackw at panix.com> in 2017, 2018.\n * Composed by Björn Esser <besser82 at fedoraproject.org> in 2018.\n * Modified by Björn Esser <besser82 at fedoraproject.org> in 2020.\n * To the extent possible under law, the named authors have waived all\n * copyright and related or neighboring rights to this work.\n *\n * See https://creativecommons.org/publicdomain/zero/1.0/ for further\n * details.\n *\n * This file is a modified except from [2], lines 648 up to 909.\n *\n * [1]  https://www.akkadia.org/drepper/sha-crypt.html\n * [2]  https://www.akkadia.org/drepper/SHA-crypt.txt\n */\n\n#include \"crypt-port.h\"\n#include \"alg-sha256.h\"\n\n#include <errno.h>\n#include <stdio.h>\n#include <stdlib.h>\n\n#if INCLUDE_sha256crypt\n\n/* Define our magic string to mark salt for SHA256 \"encryption\"\n   replacement.  */\nstatic const char sha256_salt_prefix[] = \"$5$\";\n\n/* Prefix for optional rounds specification.  */\nstatic const char sha256_rounds_prefix[] = \"rounds=\";\n\n/* Maximum salt string length.  */\n#define SALT_LEN_MAX 16\n/* Default number of rounds if not explicitly specified.  */\n#define ROUNDS_DEFAULT 5000\n/* Minimum number of rounds.  */\n#define ROUNDS_MIN 1000\n/* Maximum number of rounds.  */\n#define ROUNDS_MAX 999999999\n\n/* The maximum possible length of a SHA256-hashed password string,\n   including the terminating NUL character.  Prefix (including its NUL)\n   + rounds tag (\"rounds=$\" = \"rounds=\\0\") + strlen(ROUNDS_MAX)\n   + salt (up to SALT_LEN_MAX chars) + '$' + hash (43 chars).  */\n\n#define LENGTH_OF_NUMBER(n) (sizeof #n - 1)\n\n#define SHA256_HASH_LENGTH \\\n  (sizeof (sha256_salt_prefix) + sizeof (sha256_rounds_prefix) + \\\n   LENGTH_OF_NUMBER (ROUNDS_MAX) + SALT_LEN_MAX + 1 + 43)\n\nstatic_assert (SHA256_HASH_LENGTH <= CRYPT_OUTPUT_SIZE,\n               \"CRYPT_OUTPUT_SIZE is too small for SHA256\");\n\n/* A sha256_buffer holds all of the sensitive intermediate data.  */\nstruct sha256_buffer\n{\n  SHA256_CTX ctx;\n  uint8_t result[32];\n  uint8_t p_bytes[32];\n  uint8_t s_bytes[32];\n};\n\nstatic_assert (sizeof (struct sha256_buffer) <= ALG_SPECIFIC_SIZE,\n               \"ALG_SPECIFIC_SIZE is too small for SHA256\");\n\n\n/* Feed CTX with LEN bytes of a virtual byte sequence consisting of\n   BLOCK repeated over and over indefinitely.  */\nstatic void\nSHA256_Update_recycled (SHA256_CTX *ctx,\n                        unsigned char block[32], size_t len)\n{\n  size_t cnt;\n  for (cnt = len; cnt >= 32; cnt -= 32)\n    SHA256_Update (ctx, block, 32);\n  SHA256_Update (ctx, block, cnt);\n}\n\nvoid\ncrypt_sha256crypt_rn (const char *phrase, size_t phr_size,\n                      const char *setting, size_t ARG_UNUSED (set_size),\n                      uint8_t *output, size_t out_size,\n                      void *scratch, size_t scr_size)\n{\n  /* This shouldn't ever happen, but...  */\n  if (out_size < SHA256_HASH_LENGTH\n      || scr_size < sizeof (struct sha256_buffer))\n    {\n      errno = ERANGE;\n      return;\n    }\n\n  struct sha256_buffer *buf = scratch;\n  SHA256_CTX *ctx = &buf->ctx;\n  uint8_t *result = buf->result;\n  uint8_t *p_bytes = buf->p_bytes;\n  uint8_t *s_bytes = buf->s_bytes;\n  char *cp = (char *)output;\n  const char *salt = setting;\n\n  size_t salt_size;\n  size_t cnt;\n  /* Default number of rounds.  */\n  size_t rounds = ROUNDS_DEFAULT;\n  bool rounds_custom = false;\n\n  /* Find beginning of salt string.  The prefix should normally always\n     be present.  Just in case it is not.  */\n  if (strncmp (sha256_salt_prefix, salt, sizeof (sha256_salt_prefix) - 1) == 0)\n    /* Skip salt prefix.  */\n    salt += sizeof (sha256_salt_prefix) - 1;\n\n  if (strncmp (salt, sha256_rounds_prefix, sizeof (sha256_rounds_prefix) - 1)\n      == 0)\n    {\n      const char *num = salt + sizeof (sha256_rounds_prefix) - 1;\n      /* Do not allow an explicit setting of zero rounds, nor of the\n         default number of rounds, nor leading zeroes on the rounds.  */\n      if (!(*num >= '1' && *num <= '9'))\n        {\n          errno = EINVAL;\n          return;\n        }\n\n      errno = 0;\n      char *endp;\n      rounds = strtoul (num, &endp, 10);\n      if (endp == num || *endp != '$'\n          || rounds < ROUNDS_MIN\n          || rounds > ROUNDS_MAX\n          || errno)\n        {\n          errno = EINVAL;\n          return;\n        }\n      salt = endp + 1;\n      rounds_custom = true;\n    }\n\n  /* The salt ends at the next '$' or the end of the string.\n     Ensure ':' does not appear in the salt (it is used as a separator in /etc/passwd).\n     Also check for '\\n', as in /etc/passwd the whole parameters of the user data must\n     be on a single line. */\n  salt_size = strcspn (salt, \"$:\\n\");\n  if (!(salt[salt_size] == '$' || !salt[salt_size]))\n    {\n      errno = EINVAL;\n      return;\n    }\n\n  /* Ensure we do not use more salt than SALT_LEN_MAX. */\n  if (salt_size > SALT_LEN_MAX)\n    salt_size = SALT_LEN_MAX;\n\n  /* Compute alternate SHA256 sum with input PHRASE, SALT, and PHRASE.  The\n     final result will be added to the first context.  */\n  SHA256_Init (ctx);\n\n  /* Add phrase.  */\n  SHA256_Update (ctx, phrase, phr_size);\n\n  /* Add salt.  */\n  SHA256_Update (ctx, salt, salt_size);\n\n  /* Add phrase again.  */\n  SHA256_Update (ctx, phrase, phr_size);\n\n  /* Now get result of this (32 bytes).  */\n  SHA256_Final (result, ctx);\n\n  /* Prepare for the real work.  */\n  SHA256_Init (ctx);\n\n  /* Add the phrase string.  */\n  SHA256_Update (ctx, phrase, phr_size);\n\n  /* The last part is the salt string.  This must be at most 8\n     characters and it ends at the first `$' character (for\n     compatibility with existing implementations).  */\n  SHA256_Update (ctx, salt, salt_size);\n\n  /* Add for any character in the phrase one byte of the alternate sum.  */\n  for (cnt = phr_size; cnt > 32; cnt -= 32)\n    SHA256_Update (ctx, result, 32);\n  SHA256_Update (ctx, result, cnt);\n\n  /* Take the binary representation of the length of the phrase and for every\n     1 add the alternate sum, for every 0 the phrase.  */\n  for (cnt = phr_size; cnt > 0; cnt >>= 1)\n    if ((cnt & 1) != 0)\n      SHA256_Update (ctx, result, 32);\n    else\n      SHA256_Update (ctx, phrase, phr_size);\n\n  /* Create intermediate result.  */\n  SHA256_Final (result, ctx);\n\n  /* Start computation of P byte sequence.  */\n  SHA256_Init (ctx);\n\n  /* For every character in the password add the entire password.  */\n  for (cnt = 0; cnt < phr_size; ++cnt)\n    SHA256_Update (ctx, phrase, phr_size);\n\n  /* Finish the digest.  */\n  SHA256_Final (p_bytes, ctx);\n\n  /* Start computation of S byte sequence.  */\n  SHA256_Init (ctx);\n\n  /* For every character in the password add the entire password.  */\n  for (cnt = 0; cnt < (size_t) 16 + (size_t) result[0]; ++cnt)\n    SHA256_Update (ctx, salt, salt_size);\n\n  /* Finish the digest.  */\n  SHA256_Final (s_bytes, ctx);\n\n  /* Repeatedly run the collected hash value through SHA256 to burn\n     CPU cycles.  */\n  for (cnt = 0; cnt < rounds; ++cnt)\n    {\n      /* New context.  */\n      SHA256_Init (ctx);\n\n      /* Add phrase or last result.  */\n      if ((cnt & 1) != 0)\n        SHA256_Update_recycled (ctx, p_bytes, phr_size);\n      else\n        SHA256_Update (ctx, result, 32);\n\n      /* Add salt for numbers not divisible by 3.  */\n      if (cnt % 3 != 0)\n        SHA256_Update_recycled (ctx, s_bytes, salt_size);\n\n      /* Add phrase for numbers not divisible by 7.  */\n      if (cnt % 7 != 0)\n        SHA256_Update_recycled (ctx, p_bytes, phr_size);\n\n      /* Add phrase or last result.  */\n      if ((cnt & 1) != 0)\n        SHA256_Update (ctx, result, 32);\n      else\n        SHA256_Update_recycled (ctx, p_bytes, phr_size);\n\n      /* Create intermediate result.  */\n      SHA256_Final (result, ctx);\n    }\n\n  /* Now we can construct the result string.  It consists of four\n     parts, one of which is optional.  We already know that there\n     is sufficient space at CP for the longest possible result string.  */\n  memcpy (cp, sha256_salt_prefix, sizeof (sha256_salt_prefix) - 1);\n  cp += sizeof (sha256_salt_prefix) - 1;\n\n  if (rounds_custom)\n    {\n      int n = snprintf (cp,\n                        SHA256_HASH_LENGTH - (sizeof (sha256_salt_prefix) - 1),\n                        \"%s%zu$\", sha256_rounds_prefix, rounds);\n      cp += n;\n    }\n\n  memcpy (cp, salt, salt_size);\n  cp += salt_size;\n  *cp++ = '$';\n\n#define b64_from_24bit(B2, B1, B0, N)                   \\\n  do {                                                  \\\n    unsigned int w = ((((unsigned int)(B2)) << 16) |    \\\n                      (((unsigned int)(B1)) << 8) |     \\\n                      ((unsigned int)(B0)));            \\\n    int n = (N);                                        \\\n    while (n-- > 0)                                     \\\n      {                                                 \\\n        *cp++ = b64t[w & 0x3f];                         \\\n        w >>= 6;                                        \\\n      }                                                 \\\n  } while (0)\n\n  b64_from_24bit (result[0], result[10], result[20], 4);\n  b64_from_24bit (result[21], result[1], result[11], 4);\n  b64_from_24bit (result[12], result[22], result[2], 4);\n  b64_from_24bit (result[3], result[13], result[23], 4);\n  b64_from_24bit (result[24], result[4], result[14], 4);\n  b64_from_24bit (result[15], result[25], result[5], 4);\n  b64_from_24bit (result[6], result[16], result[26], 4);\n  b64_from_24bit (result[27], result[7], result[17], 4);\n  b64_from_24bit (result[18], result[28], result[8], 4);\n  b64_from_24bit (result[9], result[19], result[29], 4);\n  b64_from_24bit (0, result[31], result[30], 3);\n\n  *cp = '\\0';\n}\n\nvoid\ngensalt_sha256crypt_rn (unsigned long count,\n                        const uint8_t *rbytes, size_t nrbytes,\n                        uint8_t *output, size_t output_size)\n{\n  gensalt_sha_rn (\"5\", SALT_LEN_MAX, ROUNDS_DEFAULT, ROUNDS_MIN, ROUNDS_MAX,\n                  count, rbytes, nrbytes, output, output_size);\n}\n\n#endif\n"
  },
  {
    "path": "lib/crypt-sha512.c",
    "content": "/* One way encryption based on the SHA512-based Unix crypt implementation.\n *\n * Written by Ulrich Drepper <drepper at redhat.com> in 2007 [1].\n * Modified by Zack Weinberg <zackw at panix.com> in 2017, 2018.\n * Composed by Björn Esser <besser82 at fedoraproject.org> in 2018.\n * Modified by Björn Esser <besser82 at fedoraproject.org> in 2020.\n * To the extent possible under law, the named authors have waived all\n * copyright and related or neighboring rights to this work.\n *\n * See https://creativecommons.org/publicdomain/zero/1.0/ for further\n * details.\n *\n * This file is a modified except from [2], lines 1403 up to 1676.\n *\n * [1]  https://www.akkadia.org/drepper/sha-crypt.html\n * [2]  https://www.akkadia.org/drepper/SHA-crypt.txt\n */\n\n#include \"crypt-port.h\"\n#include \"alg-sha512.h\"\n\n#include <errno.h>\n#include <stdio.h>\n#include <stdlib.h>\n\n#if INCLUDE_sha512crypt\n\n/* Define our magic string to mark salt for SHA512 \"encryption\"\n   replacement.  */\nstatic const char sha512_salt_prefix[] = \"$6$\";\n\n/* Prefix for optional rounds specification.  */\nstatic const char sha512_rounds_prefix[] = \"rounds=\";\n\n/* Maximum salt string length.  */\n#define SALT_LEN_MAX 16\n/* Default number of rounds if not explicitly specified.  */\n#define ROUNDS_DEFAULT 5000\n/* Minimum number of rounds.  */\n#define ROUNDS_MIN 1000\n/* Maximum number of rounds.  */\n#define ROUNDS_MAX 999999999\n\n/* The maximum possible length of a SHA512-hashed password string,\n   including the terminating NUL character.  Prefix (including its NUL)\n   + rounds tag (\"rounds=$\" = \"rounds=\\0\") + strlen(ROUNDS_MAX)\n   + salt (up to SALT_LEN_MAX chars) + '$' + hash (86 chars).  */\n\n#define LENGTH_OF_NUMBER(n) (sizeof #n - 1)\n\n#define SHA512_HASH_LENGTH \\\n  (sizeof (sha512_salt_prefix) + sizeof (sha512_rounds_prefix) + \\\n   LENGTH_OF_NUMBER (ROUNDS_MAX) + SALT_LEN_MAX + 1 + 86)\n\nstatic_assert (SHA512_HASH_LENGTH <= CRYPT_OUTPUT_SIZE,\n               \"CRYPT_OUTPUT_SIZE is too small for SHA512\");\n\n/* A sha512_buffer holds all of the sensitive intermediate data.  */\nstruct sha512_buffer\n{\n  SHA512_CTX ctx;\n  uint8_t result[64];\n  uint8_t p_bytes[64];\n  uint8_t s_bytes[64];\n};\n\nstatic_assert (sizeof (struct sha512_buffer) <= ALG_SPECIFIC_SIZE,\n               \"ALG_SPECIFIC_SIZE is too small for SHA512\");\n\n\n/* Subroutine of _xcrypt_crypt_sha512crypt_rn: Feed CTX with LEN bytes of a\n   virtual byte sequence consisting of BLOCK repeated over and over\n   indefinitely.  */\nstatic void\nsha512_process_recycled_bytes (unsigned char block[64], size_t len,\n                               SHA512_CTX *ctx)\n{\n  size_t cnt;\n  for (cnt = len; cnt >= 64; cnt -= 64)\n    SHA512_Update (ctx, block, 64);\n  SHA512_Update (ctx, block, cnt);\n}\n\nvoid\ncrypt_sha512crypt_rn (const char *phrase, size_t phr_size,\n                      const char *setting, size_t ARG_UNUSED (set_size),\n                      uint8_t *output, size_t out_size,\n                      void *scratch, size_t scr_size)\n{\n  /* This shouldn't ever happen, but...  */\n  if (out_size < SHA512_HASH_LENGTH\n      || scr_size < sizeof (struct sha512_buffer))\n    {\n      errno = ERANGE;\n      return;\n    }\n\n  struct sha512_buffer *buf = scratch;\n  SHA512_CTX *ctx = &buf->ctx;\n  uint8_t *result = buf->result;\n  uint8_t *p_bytes = buf->p_bytes;\n  uint8_t *s_bytes = buf->s_bytes;\n  char *cp = (char *)output;\n  const char *salt = setting;\n\n  size_t salt_size;\n  size_t cnt;\n  /* Default number of rounds.  */\n  size_t rounds = ROUNDS_DEFAULT;\n  bool rounds_custom = false;\n\n  /* Find beginning of salt string.  The prefix should normally always\n     be present.  Just in case it is not.  */\n  if (strncmp (sha512_salt_prefix, salt, sizeof (sha512_salt_prefix) - 1) == 0)\n    /* Skip salt prefix.  */\n    salt += sizeof (sha512_salt_prefix) - 1;\n\n  if (strncmp (salt, sha512_rounds_prefix, sizeof (sha512_rounds_prefix) - 1)\n      == 0)\n    {\n      const char *num = salt + sizeof (sha512_rounds_prefix) - 1;\n      /* Do not allow an explicit setting of zero rounds, nor of the\n         default number of rounds, nor leading zeroes on the rounds.  */\n      if (!(*num >= '1' && *num <= '9'))\n        {\n          errno = EINVAL;\n          return;\n        }\n\n      errno = 0;\n      char *endp;\n      rounds = strtoul (num, &endp, 10);\n      if (endp == num || *endp != '$'\n          || rounds < ROUNDS_MIN\n          || rounds > ROUNDS_MAX\n          || errno)\n        {\n          errno = EINVAL;\n          return;\n        }\n      salt = endp + 1;\n      rounds_custom = true;\n    }\n\n  /* The salt ends at the next '$' or the end of the string.\n     Ensure ':' does not appear in the salt (it is used as a separator in /etc/passwd).\n     Also check for '\\n', as in /etc/passwd the whole parameters of the user data must\n     be on a single line. */\n  salt_size = strcspn (salt, \"$:\\n\");\n  if (!(salt[salt_size] == '$' || !salt[salt_size]))\n    {\n      errno = EINVAL;\n      return;\n    }\n\n  /* Ensure we do not use more salt than SALT_LEN_MAX. */\n  if (salt_size > SALT_LEN_MAX)\n    salt_size = SALT_LEN_MAX;\n\n  /* Compute alternate SHA512 sum with input PHRASE, SALT, and PHRASE.  The\n     final result will be added to the first context.  */\n  SHA512_Init (ctx);\n\n  /* Add phrase.  */\n  SHA512_Update (ctx, phrase, phr_size);\n\n  /* Add salt.  */\n  SHA512_Update (ctx, salt, salt_size);\n\n  /* Add phrase again.  */\n  SHA512_Update (ctx, phrase, phr_size);\n\n  /* Now get result of this (64 bytes) and add it to the other\n     context.  */\n  SHA512_Final (result, ctx);\n\n  /* Prepare for the real work.  */\n  SHA512_Init (ctx);\n\n  /* Add the phrase string.  */\n  SHA512_Update (ctx, phrase, phr_size);\n\n  /* The last part is the salt string.  This must be at most 8\n     characters and it ends at the first `$' character (for\n     compatibility with existing implementations).  */\n  SHA512_Update (ctx, salt, salt_size);\n\n  /* Add for any character in the phrase one byte of the alternate sum.  */\n  for (cnt = phr_size; cnt > 64; cnt -= 64)\n    SHA512_Update (ctx, result, 64);\n  SHA512_Update (ctx, result, cnt);\n\n  /* Take the binary representation of the length of the phrase and for every\n     1 add the alternate sum, for every 0 the phrase.  */\n  for (cnt = phr_size; cnt > 0; cnt >>= 1)\n    if ((cnt & 1) != 0)\n      SHA512_Update (ctx, result, 64);\n    else\n      SHA512_Update (ctx, phrase, phr_size);\n\n  /* Create intermediate result.  */\n  SHA512_Final (result, ctx);\n\n  /* Start computation of P byte sequence.  */\n  SHA512_Init (ctx);\n\n  /* For every character in the password add the entire password.  */\n  for (cnt = 0; cnt < phr_size; ++cnt)\n    SHA512_Update (ctx, phrase, phr_size);\n\n  /* Finish the digest.  */\n  SHA512_Final (p_bytes, ctx);\n\n  /* Start computation of S byte sequence.  */\n  SHA512_Init (ctx);\n\n  /* For every character in the password add the entire password.  */\n  for (cnt = 0; cnt < (size_t) 16 + (size_t) result[0]; ++cnt)\n    SHA512_Update (ctx, salt, salt_size);\n\n  /* Finish the digest.  */\n  SHA512_Final (s_bytes, ctx);\n\n  /* Repeatedly run the collected hash value through SHA512 to burn\n     CPU cycles.  */\n  for (cnt = 0; cnt < rounds; ++cnt)\n    {\n      /* New context.  */\n      SHA512_Init (ctx);\n\n      /* Add phrase or last result.  */\n      if ((cnt & 1) != 0)\n        sha512_process_recycled_bytes (p_bytes, phr_size, ctx);\n      else\n        SHA512_Update (ctx, result, 64);\n\n      /* Add salt for numbers not divisible by 3.  */\n      if (cnt % 3 != 0)\n        sha512_process_recycled_bytes (s_bytes, salt_size, ctx);\n\n      /* Add phrase for numbers not divisible by 7.  */\n      if (cnt % 7 != 0)\n        sha512_process_recycled_bytes (p_bytes, phr_size, ctx);\n\n      /* Add phrase or last result.  */\n      if ((cnt & 1) != 0)\n        SHA512_Update (ctx, result, 64);\n      else\n        sha512_process_recycled_bytes (p_bytes, phr_size, ctx);\n\n      /* Create intermediate result.  */\n      SHA512_Final (result, ctx);\n    }\n\n  /* Now we can construct the result string.  It consists of four\n     parts, one of which is optional.  We already know that buflen is\n     at least sha512_hash_length, therefore none of the string bashing\n     below can overflow the buffer. */\n\n  memcpy (cp, sha512_salt_prefix, sizeof (sha512_salt_prefix) - 1);\n  cp += sizeof (sha512_salt_prefix) - 1;\n\n  if (rounds_custom)\n    {\n      int n = snprintf (cp,\n                        SHA512_HASH_LENGTH - (sizeof (sha512_salt_prefix) - 1),\n                        \"%s%zu$\", sha512_rounds_prefix, rounds);\n      cp += n;\n    }\n\n  memcpy (cp, salt, salt_size);\n  cp += salt_size;\n  *cp++ = '$';\n\n#define b64_from_24bit(B2, B1, B0, N)                   \\\n  do {                                                  \\\n    unsigned int w = ((((unsigned int)(B2)) << 16) |    \\\n                      (((unsigned int)(B1)) << 8) |     \\\n                      ((unsigned int)(B0)));            \\\n    int n = (N);                                        \\\n    while (n-- > 0)                                     \\\n      {                                                 \\\n        *cp++ = b64t[w & 0x3f];                         \\\n        w >>= 6;                                        \\\n      }                                                 \\\n  } while (0)\n\n  b64_from_24bit (result[0], result[21], result[42], 4);\n  b64_from_24bit (result[22], result[43], result[1], 4);\n  b64_from_24bit (result[44], result[2], result[23], 4);\n  b64_from_24bit (result[3], result[24], result[45], 4);\n  b64_from_24bit (result[25], result[46], result[4], 4);\n  b64_from_24bit (result[47], result[5], result[26], 4);\n  b64_from_24bit (result[6], result[27], result[48], 4);\n  b64_from_24bit (result[28], result[49], result[7], 4);\n  b64_from_24bit (result[50], result[8], result[29], 4);\n  b64_from_24bit (result[9], result[30], result[51], 4);\n  b64_from_24bit (result[31], result[52], result[10], 4);\n  b64_from_24bit (result[53], result[11], result[32], 4);\n  b64_from_24bit (result[12], result[33], result[54], 4);\n  b64_from_24bit (result[34], result[55], result[13], 4);\n  b64_from_24bit (result[56], result[14], result[35], 4);\n  b64_from_24bit (result[15], result[36], result[57], 4);\n  b64_from_24bit (result[37], result[58], result[16], 4);\n  b64_from_24bit (result[59], result[17], result[38], 4);\n  b64_from_24bit (result[18], result[39], result[60], 4);\n  b64_from_24bit (result[40], result[61], result[19], 4);\n  b64_from_24bit (result[62], result[20], result[41], 4);\n  b64_from_24bit (0, 0, result[63], 2);\n\n  *cp = '\\0';\n}\n\nvoid\ngensalt_sha512crypt_rn (unsigned long count,\n                        const uint8_t *rbytes, size_t nrbytes,\n                        uint8_t *output, size_t output_size)\n{\n  gensalt_sha_rn (\"6\", SALT_LEN_MAX, ROUNDS_DEFAULT, ROUNDS_MIN, ROUNDS_MAX,\n                  count, rbytes, nrbytes, output, output_size);\n}\n\n#endif\n"
  },
  {
    "path": "lib/crypt-sm3-yescrypt.c",
    "content": "/* Copyright (C) 2024 Björn Esser besser82@fedoraproject.org\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\n#include \"crypt-port.h\"\n\n#if INCLUDE_sm3_yescrypt\n\n#define YESCRYPT_INTERNAL\n#include \"alg-yescrypt.h\"\n#undef YESCRYPT_INTERNAL\n\n#include \"alg-sm3-hmac.h\"\n\n#include <errno.h>\n\n/* upper level hmac for tests */\n#ifndef outer_sm3_hmac\n#define outer_sm3_hmac sm3_hmac\n#endif\n\n/* For use in scratch space by crypt_gost_yescrypt_rn().  */\ntypedef struct\n{\n  sm3_hmac_ctx_t sm3buf;\n  yescrypt_local_t local;\n  uint8_t outbuf[CRYPT_OUTPUT_SIZE],\n          sm3setting[CRYPT_OUTPUT_SIZE],\n          hk[32],\n          interm[32],\n          y[32],\n          *retval;\n} crypt_sm3_yescrypt_internal_t;\n\nstatic_assert (sizeof (crypt_sm3_yescrypt_internal_t) <= ALG_SPECIFIC_SIZE,\n               \"ALG_SPECIFIC_SIZE is too small for SM3-YESCRYPT.\");\n\n/*\n * As OUTPUT is initialized with a failure token before gensalt_yescrypt_rn\n * is called, in case of an error we could just set an appropriate errno\n * and return.\n */\nvoid\ngensalt_sm3_yescrypt_rn (unsigned long count,\n                         const uint8_t *rbytes, size_t nrbytes,\n                         uint8_t *output, size_t o_size)\n{\n  /* Up to 512 bits (64 bytes) of entropy for computing the salt portion\n     of the MCF-setting are supported.  */\n  nrbytes = (nrbytes > 64 ? 64 : nrbytes);\n\n  if (o_size < 6 + 8 * 6 + BASE64_LEN (nrbytes) + 1 ||\n      CRYPT_GENSALT_OUTPUT_SIZE < 6 + 8 * 6 + BASE64_LEN (nrbytes) + 1)\n    {\n      errno = ERANGE;\n      return;\n    }\n\n  /* We pass 'o_size - 3' to gensalt, because we need to shift\n           the prefix by 3 chars to insert the sm3 marker.  */\n  gensalt_yescrypt_rn (count, rbytes, nrbytes, output, o_size - 3);\n\n  /* Check for failures.  */\n  if (output[0] == '*')\n    return;\n\n  /* Shift output three bytes further.  */\n  memmove (output + 3, output, strlen ((const char *) output) + 1);\n\n  /* Insert the sm3 marker.  */\n  output[1] = 's';\n  output[2] = 'm';\n  output[3] = '3';\n}\n\nvoid\ncrypt_sm3_yescrypt_rn (const char *phrase, size_t phr_size,\n                       const char *setting, size_t set_size,\n                       uint8_t *output, size_t o_size,\n                       void *scratch, size_t s_size)\n{\n  if (o_size < set_size + 1 + 43 + 1 ||\n      CRYPT_OUTPUT_SIZE < set_size + 1 + 43 + 1 ||\n      s_size < sizeof (crypt_sm3_yescrypt_internal_t))\n    {\n      errno = ERANGE;\n      return;\n    }\n\n  /* Fail when called with wrong prefix.  */\n  if (strncmp (setting, \"$sm3y$\", 6))\n    {\n      errno = EINVAL;\n      return;\n    }\n\n  crypt_sm3_yescrypt_internal_t *intbuf = scratch;\n\n  if (yescrypt_init_local (&intbuf->local))\n    return;\n\n  /* convert gost setting to yescrypt setting */\n  intbuf->sm3setting[0] = '$';\n  intbuf->sm3setting[1] = 'y';\n  intbuf->sm3setting[2] = '$';\n  strcpy_or_abort (&intbuf->sm3setting[3], set_size - 3, setting + 6);\n\n  intbuf->retval = yescrypt_r (NULL, &intbuf->local,\n                               (const uint8_t *) phrase, phr_size,\n                               intbuf->sm3setting, NULL,\n                               intbuf->outbuf + 3, o_size - 3);\n\n  if (!intbuf->retval)\n    errno = EINVAL;\n\n  if (yescrypt_free_local (&intbuf->local) || !intbuf->retval)\n    return;\n\n  intbuf->outbuf[0] = '$';\n  intbuf->outbuf[1] = 's';\n  intbuf->outbuf[2] = 'm';\n  intbuf->outbuf[3] = '3';\n\n  /* extract yescrypt output from \"$y$param$salt$output\" */\n  char *hptr = strchr ((char *) intbuf->retval + 3, '$');\n  if (!hptr)\n    {\n      errno = EINVAL;\n      return;\n    }\n  hptr = strchr (hptr + 1, '$');\n  if (!hptr)\n    {\n      errno = EINVAL;\n      return;\n    }\n  hptr++; /* start of output */\n\n  /* decode yescrypt output into its raw 256-bit form */\n  size_t ylen = sizeof (intbuf->y);\n  if (!decode64 (intbuf->y, &ylen, (uint8_t *) hptr, strlen (hptr)) ||\n      ylen != sizeof (intbuf->y))\n    {\n      errno = EINVAL;\n      return;\n    }\n\n  /*\n   * SM3_HMAC(\n   *   SM3_HMAC(SM3(K), S),\n   *   yescrypt(K, S)\n   * )\n   * yescrypt output is used in place of message,\n   * thus, its crypto properties are superseded by SM3.\n   * Password is always hashed for inner hmac to avoid\n   * collisions between hashed and unhashed passwords.\n   */\n  sm3_hash ((const uint8_t *) phrase, phr_size, intbuf->hk,\n            &intbuf->sm3buf.sm3_ctx);\n  sm3_hmac (intbuf->hk, sizeof (intbuf->hk),\n                (const uint8_t *) setting,\n                (size_t) ((uint8_t *) hptr - intbuf->retval),\n                intbuf->interm, &intbuf->sm3buf);\n  outer_sm3_hmac (intbuf->interm, sizeof (intbuf->interm),\n                  intbuf->y, sizeof (intbuf->y), intbuf->y,\n                  &intbuf->sm3buf);\n\n  encode64 ((uint8_t *) hptr, o_size - (size_t) ((uint8_t *) hptr - intbuf->retval),\n            intbuf->y, sizeof (intbuf->y));\n\n  strcpy_or_abort (output, o_size, intbuf->outbuf);\n  return;\n}\n\n#endif /* INCLUDE_sm3_yescrypt */\n"
  },
  {
    "path": "lib/crypt-sm3.c",
    "content": "/* One way encryption based on the SHA256-based Unix crypt implementation.\n *\n * Written by Ulrich Drepper <drepper at redhat.com> in 2007 [1].\n * Modified by Zack Weinberg <zackw at panix.com> in 2017, 2018.\n * Composed by Björn Esser <besser82 at fedoraproject.org> in 2018.\n * Modified by Björn Esser <besser82 at fedoraproject.org> in 2020.\n * Modified by Tianjia Zhang <tianjia.zhang at linux.alibaba.com> in 2024.\n * To the extent possible under law, the named authors have waived all\n * copyright and related or neighboring rights to this work.\n *\n * See https://creativecommons.org/publicdomain/zero/1.0/ for further\n * details.\n *\n * This file is a modified except from [2], lines 648 up to 909.\n *\n * [1]  https://www.akkadia.org/drepper/sha-crypt.html\n * [2]  https://www.akkadia.org/drepper/SHA-crypt.txt\n */\n\n#include \"crypt-port.h\"\n#include \"alg-sm3.h\"\n\n#include <errno.h>\n#include <stdio.h>\n#include <stdlib.h>\n\n#if INCLUDE_sm3crypt\n\n/* Define our magic string to mark salt for SM3 \"encryption\"\n   replacement.  */\nstatic const char sm3_salt_prefix[] = \"$sm3$\";\n\n/* Prefix for optional rounds specification.  */\nstatic const char sm3_rounds_prefix[] = \"rounds=\";\n\n/* Maximum salt string length.  */\n#define SALT_LEN_MAX 16\n/* Default number of rounds if not explicitly specified.  */\n#define ROUNDS_DEFAULT 5000\n/* Minimum number of rounds.  */\n#define ROUNDS_MIN 1000\n/* Maximum number of rounds.  */\n#define ROUNDS_MAX 999999999\n\n/* The maximum possible length of a SM3-hashed password string,\n   including the terminating NUL character.  Prefix (including its NUL)\n   + rounds tag (\"rounds=$\" = \"rounds=\\0\") + strlen(ROUNDS_MAX)\n   + salt (up to SALT_LEN_MAX chars) + '$' + hash (43 chars).  */\n\n#define LENGTH_OF_NUMBER(n) (sizeof #n - 1)\n\n#define SM3_HASH_LENGTH \\\n  (sizeof (sm3_salt_prefix) + sizeof (sm3_rounds_prefix) + \\\n   LENGTH_OF_NUMBER (ROUNDS_MAX) + SALT_LEN_MAX + 1 + 43)\n\nstatic_assert (SM3_HASH_LENGTH <= CRYPT_OUTPUT_SIZE,\n               \"CRYPT_OUTPUT_SIZE is too small for SM3\");\n\n/* A sm3_buffer holds all of the sensitive intermediate data.  */\nstruct sm3_buffer\n{\n  sm3_ctx ctx;\n  uint8_t result[32];\n  uint8_t p_bytes[32];\n  uint8_t s_bytes[32];\n};\n\nstatic_assert (sizeof (struct sm3_buffer) <= ALG_SPECIFIC_SIZE,\n               \"ALG_SPECIFIC_SIZE is too small for SM3crypt\");\n\n\n/* Feed CTX with LEN bytes of a virtual byte sequence consisting of\n   BLOCK repeated over and over indefinitely.  */\nstatic void\nsm3_update_recycled (sm3_ctx *ctx,\n                     unsigned char block[32], size_t len)\n{\n  size_t cnt;\n  for (cnt = len; cnt >= 32; cnt -= 32)\n    sm3_update (ctx, block, 32);\n  sm3_update (ctx, block, cnt);\n}\n\nvoid\ncrypt_sm3crypt_rn (const char *phrase, size_t phr_size,\n                   const char *setting, size_t ARG_UNUSED (set_size),\n                   uint8_t *output, size_t out_size,\n                   void *scratch, size_t scr_size)\n{\n  /* This shouldn't ever happen, but...  */\n  if (out_size < SM3_HASH_LENGTH\n      || scr_size < sizeof (struct sm3_buffer))\n    {\n      errno = ERANGE;\n      return;\n    }\n\n  struct sm3_buffer *buf = scratch;\n  sm3_ctx *ctx = &buf->ctx;\n  uint8_t *result = buf->result;\n  uint8_t *p_bytes = buf->p_bytes;\n  uint8_t *s_bytes = buf->s_bytes;\n  char *cp = (char *)output;\n  const char *salt = setting;\n\n  size_t salt_size;\n  size_t cnt;\n  /* Default number of rounds.  */\n  size_t rounds = ROUNDS_DEFAULT;\n  bool rounds_custom = false;\n\n  /* Find beginning of salt string.  The prefix should normally always\n     be present.  Just in case it is not.  */\n  if (strncmp (sm3_salt_prefix, salt, sizeof (sm3_salt_prefix) - 1) == 0)\n    /* Skip salt prefix.  */\n    salt += sizeof (sm3_salt_prefix) - 1;\n\n  if (strncmp (salt, sm3_rounds_prefix, sizeof (sm3_rounds_prefix) - 1)\n      == 0)\n    {\n      const char *num = salt + sizeof (sm3_rounds_prefix) - 1;\n      /* Do not allow an explicit setting of zero rounds, nor of the\n         default number of rounds, nor leading zeroes on the rounds.  */\n      if (!(*num >= '1' && *num <= '9'))\n        {\n          errno = EINVAL;\n          return;\n        }\n\n      errno = 0;\n      char *endp;\n      rounds = strtoul (num, &endp, 10);\n      if (endp == num || *endp != '$'\n          || rounds < ROUNDS_MIN\n          || rounds > ROUNDS_MAX\n          || errno)\n        {\n          errno = EINVAL;\n          return;\n        }\n      salt = endp + 1;\n      rounds_custom = true;\n    }\n\n  /* The salt ends at the next '$' or the end of the string.\n     Ensure ':' does not appear in the salt (it is used as a separator in /etc/passwd).\n     Also check for '\\n', as in /etc/passwd the whole parameters of the user data must\n     be on a single line. */\n  salt_size = strcspn (salt, \"$:\\n\");\n  if (!(salt[salt_size] == '$' || !salt[salt_size]))\n    {\n      errno = EINVAL;\n      return;\n    }\n\n  /* Ensure we do not use more salt than SALT_LEN_MAX. */\n  if (salt_size > SALT_LEN_MAX)\n    salt_size = SALT_LEN_MAX;\n\n  /* Compute alternate SM3 sum with input PHRASE, SALT, and PHRASE.  The\n     final result will be added to the first context.  */\n  sm3_init (ctx);\n\n  /* Add phrase.  */\n  sm3_update (ctx, phrase, phr_size);\n\n  /* Add salt.  */\n  sm3_update (ctx, salt, salt_size);\n\n  /* Add phrase again.  */\n  sm3_update (ctx, phrase, phr_size);\n\n  /* Now get result of this (32 bytes).  */\n  sm3_final (result, ctx);\n\n  /* Prepare for the real work.  */\n  sm3_init (ctx);\n\n  /* Add the phrase string.  */\n  sm3_update (ctx, phrase, phr_size);\n\n  /* The last part is the salt string.  This must be at most 8\n     characters and it ends at the first `$' character (for\n     compatibility with existing implementations).  */\n  sm3_update (ctx, salt, salt_size);\n\n  /* Add for any character in the phrase one byte of the alternate sum.  */\n  for (cnt = phr_size; cnt > 32; cnt -= 32)\n    sm3_update (ctx, result, 32);\n  sm3_update (ctx, result, cnt);\n\n  /* Take the binary representation of the length of the phrase and for every\n     1 add the alternate sum, for every 0 the phrase.  */\n  for (cnt = phr_size; cnt > 0; cnt >>= 1)\n    if ((cnt & 1) != 0)\n      sm3_update (ctx, result, 32);\n    else\n      sm3_update (ctx, phrase, phr_size);\n\n  /* Create intermediate result.  */\n  sm3_final (result, ctx);\n\n  /* Start computation of P byte sequence.  */\n  sm3_init (ctx);\n\n  /* For every character in the password add the entire password.  */\n  for (cnt = 0; cnt < phr_size; ++cnt)\n    sm3_update (ctx, phrase, phr_size);\n\n  /* Finish the digest.  */\n  sm3_final (p_bytes, ctx);\n\n  /* Start computation of S byte sequence.  */\n  sm3_init (ctx);\n\n  /* For every character in the password add the entire password.  */\n  for (cnt = 0; cnt < (size_t) 16 + (size_t) result[0]; ++cnt)\n    sm3_update (ctx, salt, salt_size);\n\n  /* Finish the digest.  */\n  sm3_final (s_bytes, ctx);\n\n  /* Repeatedly run the collected hash value through SM3 to burn\n     CPU cycles.  */\n  for (cnt = 0; cnt < rounds; ++cnt)\n    {\n      /* New context.  */\n      sm3_init (ctx);\n\n      /* Add phrase or last result.  */\n      if ((cnt & 1) != 0)\n        sm3_update_recycled (ctx, p_bytes, phr_size);\n      else\n        sm3_update (ctx, result, 32);\n\n      /* Add salt for numbers not divisible by 3.  */\n      if (cnt % 3 != 0)\n        sm3_update_recycled (ctx, s_bytes, salt_size);\n\n      /* Add phrase for numbers not divisible by 7.  */\n      if (cnt % 7 != 0)\n        sm3_update_recycled (ctx, p_bytes, phr_size);\n\n      /* Add phrase or last result.  */\n      if ((cnt & 1) != 0)\n        sm3_update (ctx, result, 32);\n      else\n        sm3_update_recycled (ctx, p_bytes, phr_size);\n\n      /* Create intermediate result.  */\n      sm3_final (result, ctx);\n    }\n\n  /* Now we can construct the result string.  It consists of four\n     parts, one of which is optional.  We already know that there\n     is sufficient space at CP for the longest possible result string.  */\n  memcpy (cp, sm3_salt_prefix, sizeof (sm3_salt_prefix) - 1);\n  cp += sizeof (sm3_salt_prefix) - 1;\n\n  if (rounds_custom)\n    {\n      int n = snprintf (cp, SM3_HASH_LENGTH - (sizeof (sm3_salt_prefix) - 1),\n                        \"%s%zu$\", sm3_rounds_prefix, rounds);\n      cp += n;\n    }\n\n  memcpy (cp, salt, salt_size);\n  cp += salt_size;\n  *cp++ = '$';\n\n#define b64_from_24bit(B2, B1, B0, N)                   \\\n  do {                                                  \\\n    unsigned int w = ((((unsigned int)(B2)) << 16) |    \\\n                      (((unsigned int)(B1)) << 8) |     \\\n                      ((unsigned int)(B0)));            \\\n    int n = (N);                                        \\\n    while (n-- > 0)                                     \\\n      {                                                 \\\n        *cp++ = b64t[w & 0x3f];                         \\\n        w >>= 6;                                        \\\n      }                                                 \\\n  } while (0)\n\n  b64_from_24bit (result[0], result[10], result[20], 4);\n  b64_from_24bit (result[21], result[1], result[11], 4);\n  b64_from_24bit (result[12], result[22], result[2], 4);\n  b64_from_24bit (result[3], result[13], result[23], 4);\n  b64_from_24bit (result[24], result[4], result[14], 4);\n  b64_from_24bit (result[15], result[25], result[5], 4);\n  b64_from_24bit (result[6], result[16], result[26], 4);\n  b64_from_24bit (result[27], result[7], result[17], 4);\n  b64_from_24bit (result[18], result[28], result[8], 4);\n  b64_from_24bit (result[9], result[19], result[29], 4);\n  b64_from_24bit (0, result[31], result[30], 3);\n\n  *cp = '\\0';\n}\n\nvoid\ngensalt_sm3crypt_rn (unsigned long count,\n                     const uint8_t *rbytes, size_t nrbytes,\n                     uint8_t *output, size_t output_size)\n{\n  gensalt_sha_rn (\"sm3\", SALT_LEN_MAX, ROUNDS_DEFAULT, ROUNDS_MIN, ROUNDS_MAX,\n                  count, rbytes, nrbytes, output, output_size);\n}\n\n#endif\n"
  },
  {
    "path": "lib/crypt-static.c",
    "content": "/* Copyright (C) 2007-2017 Thorsten Kukuk\n   Copyright (C) 2019 Björn Esser\n\n   This library is free software; you can redistribute it and/or\n   modify it under the terms of the GNU Lesser General Public License\n   as published by the Free Software Foundation; either version 2.1 of\n   the License, or (at your option) any later version.\n\n   This library is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n   GNU Lesser General Public License for more details.\n\n   You should have received a copy of the GNU Lesser General Public\n   License along with this library; if not, see\n   <https://www.gnu.org/licenses/>.  */\n\n#include \"crypt-port.h\"\n\n/* The functions that use global state objects are isolated in their\n   own files so that a statically-linked program that doesn't use them\n   will not have the state objects in its data segment.  */\n\n#if INCLUDE_crypt\nchar *\ncrypt (const char *key, const char *setting)\n{\n  static struct crypt_data nr_crypt_ctx;\n  return crypt_r (key, setting, &nr_crypt_ctx);\n}\nSYMVER_crypt;\n#endif\n\n/* For code compatibility with old glibc.  */\n#if INCLUDE_fcrypt\nstrong_alias (crypt, fcrypt);\nSYMVER_fcrypt;\n#endif\n\n/* For code compatibility with older versions (v3.1.1 and earlier).  */\n#if INCLUDE_crypt && INCLUDE_xcrypt\nstrong_alias (crypt, xcrypt);\nSYMVER_xcrypt;\n#endif\n"
  },
  {
    "path": "lib/crypt-sunmd5.c",
    "content": "/* Copyright (c) 2018 Zack Weinberg.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n *\n * This is a clean-room reimplementation of the Sun-MD5 password hash,\n * based on the prose description of the algorithm in the Passlib v1.7.1\n * documentation:\n * https://passlib.readthedocs.io/en/stable/lib/passlib.hash.sun_md5_crypt.html\n */\n\n#include \"crypt-port.h\"\n#include \"alg-md5.h\"\n\n#include <errno.h>\n#include <stdlib.h>\n#include <stdio.h>\n\n#if INCLUDE_sunmd5\n\n#define SUNMD5_PREFIX           \"$md5\"\n#define SUNMD5_PREFIX_LEN       4\n#define SUNMD5_SALT_LEN         8\n#define SUNMD5_MAX_SETTING_LEN  32 /* $md5,rounds=4294963199$12345678$ */\n#define SUNMD5_BARE_OUTPUT_LEN  22 /* not counting the setting or the NUL */\n#define SUNMD5_MAX_ROUNDS       (0xFFFFFFFFul)\n\n/* At each round of the algorithm, this string (including the trailing\n   NUL) may or may not be included in the input to MD5, depending on a\n   pseudorandom coin toss.  It is Hamlet's famous soliloquy from the\n   play of the same name, which is in the public domain.  Text from\n   <https://www.gutenberg.org/files/1524/old/2ws2610.tex> with double\n   blank lines replaced with `\\n`.  Note that more recent Project\n   Gutenberg editions of _Hamlet_ are punctuated differently.  */\nstatic const char hamlet_quotation[] =\n  \"To be, or not to be,--that is the question:--\\n\"\n  \"Whether 'tis nobler in the mind to suffer\\n\"\n  \"The slings and arrows of outrageous fortune\\n\"\n  \"Or to take arms against a sea of troubles,\\n\"\n  \"And by opposing end them?--To die,--to sleep,--\\n\"\n  \"No more; and by a sleep to say we end\\n\"\n  \"The heartache, and the thousand natural shocks\\n\"\n  \"That flesh is heir to,--'tis a consummation\\n\"\n  \"Devoutly to be wish'd. To die,--to sleep;--\\n\"\n  \"To sleep! perchance to dream:--ay, there's the rub;\\n\"\n  \"For in that sleep of death what dreams may come,\\n\"\n  \"When we have shuffled off this mortal coil,\\n\"\n  \"Must give us pause: there's the respect\\n\"\n  \"That makes calamity of so long life;\\n\"\n  \"For who would bear the whips and scorns of time,\\n\"\n  \"The oppressor's wrong, the proud man's contumely,\\n\"\n  \"The pangs of despis'd love, the law's delay,\\n\"\n  \"The insolence of office, and the spurns\\n\"\n  \"That patient merit of the unworthy takes,\\n\"\n  \"When he himself might his quietus make\\n\"\n  \"With a bare bodkin? who would these fardels bear,\\n\"\n  \"To grunt and sweat under a weary life,\\n\"\n  \"But that the dread of something after death,--\\n\"\n  \"The undiscover'd country, from whose bourn\\n\"\n  \"No traveller returns,--puzzles the will,\\n\"\n  \"And makes us rather bear those ills we have\\n\"\n  \"Than fly to others that we know not of?\\n\"\n  \"Thus conscience does make cowards of us all;\\n\"\n  \"And thus the native hue of resolution\\n\"\n  \"Is sicklied o'er with the pale cast of thought;\\n\"\n  \"And enterprises of great pith and moment,\\n\"\n  \"With this regard, their currents turn awry,\\n\"\n  \"And lose the name of action.--Soft you now!\\n\"\n  \"The fair Ophelia!--Nymph, in thy orisons\\n\"\n  \"Be all my sins remember'd.\\n\";\n\n/* Decide, pseudorandomly, whether or not to include the above quotation\n   in the input to MD5.  */\nstatic inline bool\nget_nth_bit (const uint8_t digest[16], unsigned int n)\n{\n  unsigned int byte = (n % 128) / 8;\n  unsigned int bit  = (n % 128) % 8;\n  return !!(digest[byte] & (1 << bit));\n}\n\nstatic bool\nmuffet_coin_toss (const uint8_t prev_digest[16], unsigned int round_count)\n{\n  unsigned int x, y, a, b, r, v, i;\n  for (i = 0, x = 0, y = 0; i < 8; i++)\n    {\n      a = prev_digest[(i + 0) % 16];\n      b = prev_digest[(i + 3) % 16];\n      r = a >> (b % 5);\n      v = prev_digest[r % 16];\n      if (b & (1u << (a % 8)))\n        v /= 2;\n      x |= ((unsigned int) +get_nth_bit (prev_digest, v)) << i;\n\n      a = prev_digest[(i + 8)  % 16];\n      b = prev_digest[(i + 11) % 16];\n      r = a >> (b % 5);\n      v = prev_digest[r % 16];\n      if (b & (1u << (a % 8)))\n        v /= 2;\n      y |= ((unsigned int) +get_nth_bit (prev_digest, v)) << i;\n    }\n\n  if (get_nth_bit (prev_digest, round_count))\n    x /= 2;\n  if (get_nth_bit (prev_digest, round_count + 64))\n    y /= 2;\n\n  return !!(get_nth_bit (prev_digest, x) ^ get_nth_bit (prev_digest, y));\n}\n\nstatic inline void\nwrite_itoa64_4 (uint8_t *output,\n                unsigned int b0, unsigned int b1, unsigned int b2)\n{\n  unsigned int value = (b0 << 0) | (b1 << 8) | (b2 << 16);\n  output[0] = itoa64[value & 0x3f];\n  output[1] = itoa64[(value >> 6) & 0x3f];\n  output[2] = itoa64[(value >> 12) & 0x3f];\n  output[3] = itoa64[(value >> 18) & 0x3f];\n}\n\n/* used only for the last two bytes of crypt_sunmd5_rn output */\nstatic inline void\nwrite_itoa64_2 (uint8_t *output,\n                unsigned int b0, unsigned int b1, unsigned int b2)\n{\n  unsigned int value = (b0 << 0) | (b1 << 8) | (b2 << 16);\n  output[0] = itoa64[value & 0x3f];\n  output[1] = itoa64[(value >> 6) & 0x3f];\n}\n\n/* Module entry points.  */\n\nvoid\ncrypt_sunmd5_rn (const char *phrase, size_t phr_size,\n                 const char *setting, size_t ARG_UNUSED (set_size),\n                 uint8_t *output, size_t out_size,\n                 void *scratch, size_t scr_size)\n{\n  struct crypt_sunmd5_scratch\n  {\n    MD5_CTX ctx;\n    uint8_t dg[16];\n    char    rn[16];\n  };\n\n  /* If 'setting' doesn't start with the prefix, we should not have\n     been called in the first place.  */\n  if (strncmp (setting, SUNMD5_PREFIX, SUNMD5_PREFIX_LEN)\n      || (setting[SUNMD5_PREFIX_LEN] != '$'\n          && setting[SUNMD5_PREFIX_LEN] != ','))\n    {\n      errno = EINVAL;\n      return;\n    }\n\n  /* For bug-compatibility with the original implementation, we allow\n     'rounds=' to follow either '$md5,' or '$md5$'.  */\n  const char *p = setting + SUNMD5_PREFIX_LEN + 1;\n  unsigned int nrounds = 4096;\n  if (!strncmp (p, \"rounds=\", sizeof \"rounds=\" - 1))\n    {\n      p += sizeof \"rounds=\" - 1;\n      /* Do not allow an explicit setting of zero additional rounds,\n         nor leading zeroes on the number of rounds.  */\n      if (!(*p >= '1' && *p <= '9'))\n        {\n          errno = EINVAL;\n          return;\n        }\n\n      errno = 0;\n      char *endp;\n      unsigned long arounds = strtoul (p, &endp, 10);\n      if (endp == p || arounds > SUNMD5_MAX_ROUNDS || errno)\n        {\n          errno = EINVAL;\n          return;\n        }\n      nrounds += (unsigned int)arounds;\n      p = endp;\n      if (*p != '$')\n        {\n          errno = EINVAL;\n          return;\n        }\n      p += 1;\n    }\n\n  /* p now points to the beginning of the actual salt.  */\n  p += strspn (p, (const char *)itoa64);\n  if (*p != '\\0' && *p != '$')\n    {\n      errno = EINVAL;\n      return;\n    }\n  /* For bug-compatibility with the original implementation, if p\n     points to a '$' and the following character is either another '$'\n     or NUL, the first '$' should be included in the salt.  */\n  if (p[0] == '$' && (p[1] == '$' || p[1] == '\\0'))\n    p += 1;\n\n  size_t saltlen = (size_t) (p - setting);\n  /* Do we have enough space?  */\n  if (scr_size < sizeof (struct crypt_sunmd5_scratch)\n      || out_size < saltlen + SUNMD5_BARE_OUTPUT_LEN + 2)\n    {\n      errno = ERANGE;\n      return;\n    }\n\n  struct crypt_sunmd5_scratch *s = scratch;\n\n  /* Initial round.  */\n  MD5_Init (&s->ctx);\n  MD5_Update (&s->ctx, phrase, phr_size);\n  MD5_Update (&s->ctx, setting, saltlen);\n  MD5_Final (s->dg, &s->ctx);\n\n  /* Stretching rounds.  */\n  for (unsigned int i = 0; i < nrounds; i++)\n    {\n      MD5_Init (&s->ctx);\n\n      MD5_Update (&s->ctx, s->dg, sizeof s->dg);\n\n      /* The trailing nul is intentionally included.  */\n      if (muffet_coin_toss (s->dg, i))\n        MD5_Update (&s->ctx, hamlet_quotation, sizeof hamlet_quotation);\n\n      int nwritten = snprintf (s->rn, sizeof s->rn, \"%u\", i);\n      assert (nwritten >= 1 && (unsigned int)nwritten + 1 <= sizeof s->rn);\n      MD5_Update (&s->ctx, s->rn, (unsigned int)nwritten);\n\n      MD5_Final (s->dg, &s->ctx);\n    }\n\n  memcpy (output, setting, saltlen);\n  *(output + saltlen + 0) = '$';\n  /* This is the same permuted order used by BSD md5-crypt ($1$).  */\n  write_itoa64_4 (output + saltlen +  1, s->dg[12], s->dg[ 6], s->dg[0]);\n  write_itoa64_4 (output + saltlen +  5, s->dg[13], s->dg[ 7], s->dg[1]);\n  write_itoa64_4 (output + saltlen +  9, s->dg[14], s->dg[ 8], s->dg[2]);\n  write_itoa64_4 (output + saltlen + 13, s->dg[15], s->dg[ 9], s->dg[3]);\n  write_itoa64_4 (output + saltlen + 17, s->dg[ 5], s->dg[10], s->dg[4]);\n  write_itoa64_2 (output + saltlen + 21, s->dg[11], 0, 0);\n  *(output + saltlen + 23) = '\\0';\n}\n\nvoid\ngensalt_sunmd5_rn (unsigned long count,\n                   const uint8_t *rbytes,\n                   size_t nrbytes,\n                   uint8_t *output,\n                   size_t o_size)\n{\n  if (o_size < SUNMD5_MAX_SETTING_LEN + 1)\n    {\n      errno = ERANGE;\n      return;\n    }\n  if (nrbytes < 6 + 2)\n    {\n      errno = EINVAL;\n      return;\n    }\n\n  /* The default number of rounds, 4096, is much too low.  The actual\n     number of rounds is somewhat randomized to make construction of\n     rainbow tables more difficult (effectively this means an extra 16\n     bits of entropy are smuggled into the salt via the round number).  */\n  if (count < 32768)\n    count = 32768;\n  else if (count > SUNMD5_MAX_ROUNDS - 65536)\n    count = SUNMD5_MAX_ROUNDS - 65536;\n\n  count += ((unsigned long)rbytes[0]) << 8;\n  count += ((unsigned long)rbytes[1]) << 0;\n\n  assert (count != 0);\n\n  size_t written = (size_t) snprintf ((char *)output, o_size,\n                                      \"%s,rounds=%lu$\", SUNMD5_PREFIX, count);\n\n\n  write_itoa64_4(output + written + 0, rbytes[2], rbytes[3], rbytes[4]);\n  write_itoa64_4(output + written + 4, rbytes[5], rbytes[6], rbytes[7]);\n\n  output[written + 8] = '$';\n  output[written + 9] = '\\0';\n}\n\n#endif\n"
  },
  {
    "path": "lib/crypt-yescrypt.c",
    "content": "/* Copyright (C) 2018 vt@altlinux.org\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\n#include \"crypt-port.h\"\n#include \"alg-yescrypt.h\"\n\n#include <errno.h>\n\n#if INCLUDE_yescrypt || INCLUDE_scrypt\n\n/* For use in scratch space by crypt_yescrypt_rn().  */\ntypedef struct\n{\n  yescrypt_local_t local;\n  uint8_t outbuf[CRYPT_OUTPUT_SIZE];\n  uint8_t *retval;\n} crypt_yescrypt_internal_t;\n\nstatic_assert (sizeof (crypt_yescrypt_internal_t) <= ALG_SPECIFIC_SIZE,\n               \"ALG_SPECIFIC_SIZE is too small for YESCRYPT.\");\n\nvoid\ncrypt_yescrypt_rn (const char *phrase, size_t phr_size,\n                   const char *setting, size_t set_size,\n                   uint8_t *output, size_t o_size,\n                   void *scratch, size_t s_size)\n{\n#if !INCLUDE_scrypt\n\n  /* If scrypt is disabled fail when called with its prefix.  */\n  if (!strncmp (setting, \"$7$\", 3))\n    {\n      errno = EINVAL;\n      return;\n    }\n\n#endif /* !INCLUDE_scrypt */\n\n#if !INCLUDE_yescrypt\n\n  /* If yescrypt is disabled fail when called with its prefix.  */\n  if (!strncmp (setting, \"$y$\", 3))\n    {\n      errno = EINVAL;\n      return;\n    }\n\n#endif /* !INCLUDE_yescrypt */\n\n  if (o_size < set_size + 1 + 43 + 1 ||\n      CRYPT_OUTPUT_SIZE < set_size + 1 + 43 + 1 ||\n      s_size < sizeof (crypt_yescrypt_internal_t))\n    {\n      errno = ERANGE;\n      return;\n    }\n\n  crypt_yescrypt_internal_t *intbuf = scratch;\n\n  if (yescrypt_init_local (&intbuf->local))\n    return;\n\n  intbuf->retval = yescrypt_r (NULL, &intbuf->local,\n                               (const uint8_t *)phrase, phr_size,\n                               (const uint8_t *)setting, NULL,\n                               intbuf->outbuf, o_size);\n\n  if (!intbuf->retval)\n    errno = EINVAL;\n\n  if (yescrypt_free_local (&intbuf->local) || !intbuf->retval)\n    return;\n\n  strcpy_or_abort (output, o_size, intbuf->outbuf);\n  return;\n}\n\n#endif /* INCLUDE_yescrypt || INCLUDE_scrypt */\n\n#if INCLUDE_gost_yescrypt || INCLUDE_yescrypt || INCLUDE_sm3_yescrypt\n\n/*\n * As OUTPUT is initialized with a failure token before gensalt_yescrypt_rn\n * is called, in case of an error we could just set an appropriate errno\n * and return.\n * Since O_SIZE is guaranteed to be greater than 2, we may fill OUTPUT\n * with a short failure token when need.\n */\nvoid\ngensalt_yescrypt_rn (unsigned long count,\n                     const uint8_t *rbytes, size_t nrbytes,\n                     uint8_t *output, size_t o_size)\n{\n  /* Up to 512 bits (64 bytes) of entropy for computing the salt portion\n     of the MCF-setting are supported.  */\n  nrbytes = (nrbytes > 64 ? 64 : nrbytes);\n\n  if (o_size < 3 + 8 * 6 + 1 + BASE64_LEN (nrbytes) + 1 ||\n      CRYPT_GENSALT_OUTPUT_SIZE < 3 + 8 * 6 + 1 + BASE64_LEN (nrbytes) + 1)\n    {\n      errno = ERANGE;\n      return;\n    }\n\n  if (count > 11 || nrbytes < 16)\n    {\n      errno = EINVAL;\n      return;\n    }\n\n  /* Temporary buffer for operation.  The buffer is guaranteed to be\n     large enough to hold the maximum size of the generated salt.  */\n  uint8_t outbuf[CRYPT_GENSALT_OUTPUT_SIZE];\n\n  yescrypt_params_t params =\n  {\n    .flags = YESCRYPT_DEFAULTS,\n    .p = 1,\n  };\n\n  /* Valid cost parameters are from 1 to 11.  The default is 5.\n     These are used to set yescrypt's 'N' and 'r' parameters as\n     follows:\n     N (block count) is specified in units of r (block size,\n     adjustable in steps of 128 bytes).\n\n     128 bytes * r = size of each memory block\n\n     128 bytes * r * N = total amount of memory used for hashing\n                         in N blocks of r * 128 bytes.\n\n     The author of yescrypt recommends in the documentation to use\n     r=8 (a block size of 1 KiB) for total sizes of 2 MiB and less,\n     and r=32 (a block size of 4KiB) above that.\n     This has to do with the typical per-core last-level cache sizes\n     of current CPUs.  */\n\n  if (count == 0)\n    count = 5;\n\n  if (count < 3)\n    {\n      params.r = 8;                   // N in 1KiB\n      params.N = 1ULL << (count + 9); // 1 -> 1024, 2 -> 2048\n    }\n  else\n    {\n      params.r = 32;                  // N in 4KiB\n      params.N = 1ULL << (count + 7); // 3 -> 1024, 4 -> 2048, ... 11 -> 262144\n    }\n\n  if (!yescrypt_encode_params_r (&params, rbytes, nrbytes, outbuf, o_size))\n    {\n      errno = ERANGE;\n      return;\n    }\n\n  strcpy_or_abort (output, o_size, outbuf);\n  return;\n}\n\n#endif /* INCLUDE_gost_yescrypt || INCLUDE_yescrypt || INCLUDE_sm3_yescrypt */\n"
  },
  {
    "path": "lib/crypt.c",
    "content": "/* High-level libcrypt interfaces.\n\n   Copyright 2007-2017 Thorsten Kukuk and Zack Weinberg\n   Copyright 2018-2025 Björn Esser\n\n   This library is free software; you can redistribute it and/or\n   modify it under the terms of the GNU Lesser General Public License\n   as published by the Free Software Foundation; either version 2.1 of\n   the License, or (at your option) any later version.\n\n   This library is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n   GNU Lesser General Public License for more details.\n\n   You should have received a copy of the GNU Lesser General Public\n   License along with this library; if not, see\n   <https://www.gnu.org/licenses/>.  */\n\n#include \"crypt-port.h\"\n\n#include <errno.h>\n#include <stdlib.h>\n\n/* The internal storage area within struct crypt_data is used as\n   follows.  We don't know what alignment the algorithm modules will\n   need for their scratch data, so give it the maximum natural\n   alignment.  Note that the C11 alignas() specifier can't be applied\n   directly to a struct type, but it can be applied to the first field\n   of a struct, which effectively forces alignment of the entire\n   struct, since the first field must always have offset 0.  */\nstruct crypt_internal\n{\n  /* Alignment critical data members.  */\n  char alignas (alignof (max_align_t)) alg_specific[ALG_SPECIFIC_SIZE];\n  /* Not alignment critical data members.  */\n  char output[CRYPT_OUTPUT_SIZE];\n};\n\nstatic_assert(sizeof (struct crypt_internal) + alignof (struct crypt_internal)\n              <= CRYPT_DATA_INTERNAL_SIZE,\n              \"crypt_data.internal is too small for crypt_internal\");\n\n/* struct crypt_data is allocated by application code and contains\n   only char-typed fields, so its 'internal' field may not be\n   sufficiently aligned.  */\nstatic inline struct crypt_internal *\nget_internal (struct crypt_data *data)\n{\n  uintptr_t internalp = (uintptr_t) data->internal;\n  const uintptr_t align = alignof (struct crypt_internal);\n  internalp = (internalp + align - 1) & ~(align - 1);\n  return (struct crypt_internal *)internalp;\n}\n\ntypedef void (*crypt_fn) (const char *phrase, size_t phr_size,\n                          const char *setting, size_t set_size,\n                          uint8_t *output, size_t out_size,\n                          void *scratch, size_t scr_size);\n\ntypedef void (*gensalt_fn) (unsigned long count,\n                            const uint8_t *rbytes, size_t nrbytes,\n                            uint8_t *output, size_t output_size);\n\nstruct hashfn\n{\n  const char *prefix;\n  size_t plen;\n  crypt_fn crypt;\n  gensalt_fn gensalt;\n  /* The type of this field is unsigned char to ensure that it cannot\n     be set larger than the size of an internal buffer in crypt_gensalt_rn.  */\n  unsigned char nrbytes;\n  unsigned char is_strong;\n};\n\nstatic const struct hashfn hash_algorithms[] =\n{\n  HASH_ALGORITHM_TABLE_ENTRIES\n};\n\n#if INCLUDE_descrypt || INCLUDE_bigcrypt\nstatic int\nis_des_salt_char (char c)\n{\n  return ((c >= 'a' && c <= 'z') ||\n          (c >= 'A' && c <= 'Z') ||\n          (c >= '0' && c <= '9') ||\n          c == '.' || c == '/');\n}\n#endif\n\nstatic const struct hashfn *\nget_hashfn (const char *setting)\n{\n  const struct hashfn *h;\n  for (h = hash_algorithms; h->prefix; h++)\n    {\n      if (h->plen > 0)\n        {\n          if (!strncmp (setting, h->prefix, h->plen))\n            return h;\n        }\n#if INCLUDE_descrypt || INCLUDE_bigcrypt\n      else\n        {\n          if (setting[0] == '\\0' ||\n              (is_des_salt_char (setting[0]) && is_des_salt_char (setting[1])))\n            return h;\n        }\n#endif\n    }\n  return 0;\n}\n\n/* Check a setting string for generic validity, according to the rule\n   stated in crypt(5):\n\n      \"Hashed passphrases are always entirely printable ASCII, and do\n      not contain any whitespace or the characters ':', ';', '*', '!',\n      or '\\\\'.  (These characters are used as delimiters and special\n      markers in the passwd(5) and shadow(5) files.)\"\n\n   There is a precautionary case for rejecting additional ASCII\n   punctuation, particularly other characters often given syntactic\n   significance in configuration files, such as \" ' and #.  However,\n   this check didn't used to exist at all, and some of the hash\n   function implementations don't restrict the set of byte values they\n   they will accept in their setting strings (particularly in the salt\n   component) either.  Thus, to maintain compatibility with the widest\n   variety of existing hashed passphrases, we are only enforcing the\n   documented rule for now.\n\n   See <https://github.com/besser82/libxcrypt/issues/135> for\n   additional discussion.  */\nstatic int\ncheck_badsalt_chars (const char *setting)\n{\n  size_t i;\n\n  for (i = 0; setting[i] != '\\0'; i++)\n    if ((unsigned char) setting[i] <= 0x20 ||\n        (unsigned char) setting[i] >= 0x7f)\n      return 1;\n\n  return strcspn (setting, \"!*:;\\\\\") != i;\n}\n\nstatic void\ndo_crypt (const char *phrase, const char *setting, struct crypt_data *data)\n{\n  struct crypt_internal *cint = get_internal (data);\n  memset (cint->output, 0, sizeof cint->output);\n  make_failure_token (setting, cint->output, sizeof cint->output);\n\n  if (!phrase || !setting)\n    {\n      errno = EINVAL;\n      goto out;\n    }\n  /* Do these strlen() calls before reading prefixes of either\n     'phrase' or 'setting', so we get a predictable crash if they are\n     not valid strings.  */\n  size_t phr_size = strlen (phrase);\n  size_t set_size = strlen (setting);\n  if (phr_size >= CRYPT_MAX_PASSPHRASE_SIZE)\n    {\n      errno = ERANGE;\n      goto out;\n    }\n  if (check_badsalt_chars (setting))\n    {\n      errno = EINVAL;\n      goto out;\n    }\n\n  const struct hashfn *h = get_hashfn (setting);\n  if (!h)\n    {\n      /* Unrecognized hash algorithm */\n      errno = EINVAL;\n      goto out;\n    }\n\n  h->crypt (phrase, phr_size, setting, set_size,\n            (unsigned char *) cint->output, sizeof cint->output,\n            cint->alg_specific, sizeof cint->alg_specific);\n\nout:\n  strcpy_or_abort (data->output, sizeof data->output, cint->output);\n  explicit_bzero (data->internal, sizeof data->internal);\n  explicit_bzero (data->reserved, sizeof data->reserved);\n  data->initialized = 0;\n}\n\n#if INCLUDE_crypt_rn\nchar *\ncrypt_rn (const char *phrase, const char *setting, void *data, int size)\n{\n  if (size < (int) sizeof (struct crypt_data))\n    {\n      errno = ERANGE;\n      make_failure_token (setting, data, size);\n      return 0;\n    }\n\n  struct crypt_data *p = data;\n  do_crypt (phrase, setting, p);\n  return p->output[0] == '*' ? 0 : p->output;\n}\nSYMVER_crypt_rn;\n#endif\n\n#if INCLUDE_crypt_ra\nchar *\ncrypt_ra (const char *phrase, const char *setting, void **data, int *size)\n{\n  struct crypt_data *p = NULL;\n\n  /* Short-circuit, if possible.  */\n  if (*data && *size >= (int) sizeof (struct crypt_data))\n    {\n      p = *data;\n      do_crypt (phrase, setting, p);\n      return p->output[0] == '*' ? 0 : p->output;\n    }\n\n  /* Allocate new memory for struct crypt_data.  */\n  p = malloc (sizeof (struct crypt_data));\n  if (!p)\n    {\n      /* ERRNO is set by malloc.  */\n      if (*data)\n        make_failure_token (setting, *data, *size);\n      return 0;\n    }\n  memset (p, 0, sizeof (struct crypt_data));\n\n  do_crypt (phrase, setting, p);\n\n  /* Zeroize memory, if needed, before assigning\n     the new memory location to the data pointer.  */\n  if (*data && *size > 0)\n    explicit_bzero (*data, (size_t) *size);\n  free (*data);\n  *data = p;\n  *size = sizeof (struct crypt_data);\n\n  return p->output[0] == '*' ? 0 : p->output;\n}\nSYMVER_crypt_ra;\n#endif\n\n#if INCLUDE_crypt_r\nchar *\ncrypt_r (const char *phrase, const char *setting, struct crypt_data *data)\n{\n  do_crypt (phrase, setting, data);\n#if ENABLE_FAILURE_TOKENS\n  return data->output;\n#else\n  return data->output[0] == '*' ? 0 : data->output;\n#endif\n}\nSYMVER_crypt_r;\n#endif\n\n/* For code compatibility with older versions (v3.1.1 and earlier).  */\n#if INCLUDE_crypt_r && INCLUDE_xcrypt_r\nstrong_alias (crypt_r, xcrypt_r);\nSYMVER_xcrypt_r;\n#endif\n\n#if INCLUDE_crypt_gensalt_rn\nchar *\ncrypt_gensalt_rn (const char *prefix, unsigned long count,\n                  const char *rbytes, int nrbytes, char *output,\n                  int output_size)\n{\n  /* Individual gensalt functions will check for adequate space for\n     their own breed of setting, but the shortest possible one is\n     three bytes (DES two-character salt + NUL terminator) and we\n     also want to rule out negative numbers early.  */\n  if (output_size < 3)\n    {\n      errno = ERANGE;\n      make_failure_token (prefix, output, output_size);\n      return 0;\n    }\n\n  char outbuf[CRYPT_GENSALT_OUTPUT_SIZE];\n  unsigned char internal_nrbytes = 0;\n  memset (outbuf, 0, sizeof outbuf);\n  make_failure_token (prefix, outbuf, sizeof outbuf);\n\n  /* If the prefix is 0, that means to use the current best default.\n     Note that this is different from the behavior when the prefix is\n     \"\", which selects DES.  HASH_ALGORITHM_DEFAULT is not defined when\n     the current default algorithm was disabled at configure time.  */\n  if (!prefix)\n    {\n#if defined HASH_ALGORITHM_DEFAULT\n      prefix = HASH_ALGORITHM_DEFAULT;\n#else\n      errno = EINVAL;\n      goto out;\n#endif\n    }\n\n  const struct hashfn *h = get_hashfn (prefix);\n  if (!h)\n    {\n      errno = EINVAL;\n      goto out;\n    }\n\n  char internal_rbytes[UCHAR_MAX] = \"\\0\";\n  /* typeof (internal_nrbytes) == typeof (h->nrbytes).  */\n\n  /* If rbytes is 0, read random bytes from the operating system if\n     possible.  */\n  if (!rbytes)\n    {\n      if (!get_random_bytes (internal_rbytes, h->nrbytes))\n        goto out;\n\n      rbytes = internal_rbytes;\n      nrbytes = internal_nrbytes = h->nrbytes;\n    }\n\n  h->gensalt (count,\n              (const unsigned char *) rbytes, (size_t) nrbytes,\n              (unsigned char *) outbuf,\n              MIN ((size_t) output_size, sizeof outbuf));\n\nout:\n  strcpy_or_abort (output, (size_t) output_size, outbuf);\n  explicit_bzero (outbuf, sizeof outbuf);\n\n  if (internal_nrbytes)\n    explicit_bzero (internal_rbytes, internal_nrbytes);\n\n  return output[0] == '*' ? 0 : output;\n}\nSYMVER_crypt_gensalt_rn;\n#endif\n\n/* For code compatibility with older versions (v3.1.1 and earlier).  */\n#if INCLUDE_crypt_gensalt_rn && INCLUDE_crypt_gensalt_r\nstrong_alias (crypt_gensalt_rn, crypt_gensalt_r);\nSYMVER_crypt_gensalt_r;\n#endif\n\n/* For code compatibility with older versions (v3.1.1 and earlier).  */\n#if INCLUDE_crypt_gensalt_rn && INCLUDE_xcrypt_gensalt_r\nstrong_alias (crypt_gensalt_rn, xcrypt_gensalt_r);\nSYMVER_xcrypt_gensalt_r;\n#endif\n\n#if INCLUDE_crypt_gensalt_ra\nchar *\ncrypt_gensalt_ra (const char *prefix, unsigned long count,\n                  const char *rbytes, int nrbytes)\n{\n  char *output = malloc (CRYPT_GENSALT_OUTPUT_SIZE);\n  if (!output)\n    return 0;\n\n  char *result = crypt_gensalt_rn (prefix, count, rbytes, nrbytes, output,\n                                   CRYPT_GENSALT_OUTPUT_SIZE);\n  if (result == 0)\n    free (output);\n  return result;\n}\nSYMVER_crypt_gensalt_ra;\n#endif\n\n#if INCLUDE_crypt_checksalt\nstatic_assert(CRYPT_SALT_OK == 0, \"CRYPT_SALT_OK does not equal zero\");\n\nint\ncrypt_checksalt (const char *setting)\n{\n  int retval = CRYPT_SALT_INVALID;\n\n  if (!setting ||                     /* NULL string */\n      setting[0] == '\\0' ||           /* empty passphrase */\n      check_badsalt_chars (setting))  /* bad salt chars */\n    goto end;\n\n  const struct hashfn *h = get_hashfn (setting);\n\n  if (h)\n    {\n      retval = CRYPT_SALT_OK;\n\n      if (h->is_strong == 0)\n        {\n          retval = CRYPT_SALT_METHOD_LEGACY;\n          goto end;\n        }\n    }\n\nend:\n  return retval;\n}\nSYMVER_crypt_checksalt;\n#endif\n\n#if INCLUDE_crypt_preferred_method\nconst char *\ncrypt_preferred_method (void)\n{\n#if defined HASH_ALGORITHM_DEFAULT\n  return HASH_ALGORITHM_DEFAULT;\n#else\n  return NULL;\n#endif\n}\nSYMVER_crypt_preferred_method;\n#endif\n"
  },
  {
    "path": "lib/crypt.h.in",
    "content": "/* High-level libcrypt interfaces.\n\n   Copyright (C) 1991-2017 Free Software Foundation, Inc.\n\n   This library is free software; you can redistribute it and/or\n   modify it under the terms of the GNU Lesser General Public License\n   as published by the Free Software Foundation; either version 2.1 of\n   the License, or (at your option) any later version.\n\n   This library is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n   GNU Lesser General Public License for more details.\n\n   You should have received a copy of the GNU Lesser General Public\n   License along with this library; if not, see\n   <https://www.gnu.org/licenses/>.  */\n\n#ifndef _CRYPT_H\n#define _CRYPT_H 1\n\n@BEGIN_DECLS@\n\n/* The strings returned by crypt, crypt_r, crypt_rn, and crypt_ra will\n   be no longer than this, counting the terminating NUL.  (Existing\n   algorithms all produce much shorter strings, but we have reserved\n   generous space for future expansion.)  This is NOT the appropriate\n   size to use in allocating the buffer supplied to crypt_rn; use\n   sizeof (struct crypt_data) instead.  */\n#define CRYPT_OUTPUT_SIZE 384\n\n/* Passphrases longer than this (counting the terminating NUL) are not\n   supported.  Note that some hash algorithms have lower limits.  */\n#define CRYPT_MAX_PASSPHRASE_SIZE 512\n\n/* The strings returned by crypt_gensalt, crypt_gensalt_rn, and\n   crypt_gensalt_ra will be no longer than this.  This IS the\n   appropriate size to use when allocating the buffer supplied to\n   crypt_gensalt_rn.  (Again, existing algorithms all produce\n   much shorter strings, but we have reserved generous space for\n   future expansion.)  */\n#define CRYPT_GENSALT_OUTPUT_SIZE 192\n\n/* One-way hash the passphrase PHRASE as specified by SETTING, and\n   return a string suitable for storage in a Unix-style \"passwd\" file.\n\n   If SETTING is a previously hashed passphrase, the string returned\n   will be equal to SETTING if and only if PHRASE is the same as the\n   passphrase that was previously hashed.  See the documentation for\n   other ways to use this function.\n\n   The string returned by this function is stored in a statically-\n   allocated buffer, and will be overwritten if the function is called\n   again.  It is not safe to call this function from multiple threads\n   concurrently.\n\n   If an error occurs (such as SETTING being nonsense or unsupported)\n   the string returned will begin with '*', and will not be equal to\n   SETTING nor to any valid hashed passphrase.  Otherwise, the string\n   will not begin with '*'.  */\nextern char *crypt (const char *__phrase, const char *__setting)\n__THROW;\n\n/* These sizes are chosen to make sizeof (struct crypt_data) add up to\n   exactly 32768 bytes.  */\n#define CRYPT_DATA_RESERVED_SIZE 767\n#define CRYPT_DATA_INTERNAL_SIZE 30720\n\n/* Memory area used by crypt_r.  */\nstruct crypt_data\n{\n  /* crypt_r writes the hashed password to this field of its 'data'\n     argument.  crypt_rn and crypt_ra do the same, treating the\n     untyped data area they are supplied with as this struct.  */\n  char output[CRYPT_OUTPUT_SIZE];\n\n  /* Applications are encouraged, but not required, to use this field\n     to store the \"setting\" string that must be passed to crypt_*.\n     Future extensions to the API may make this more ergonomic.\n\n     A valid \"setting\" is either previously hashed password or the\n     string produced by one of the crypt_gensalt functions; see the\n     crypt_gensalt documentation for further details.  */\n  char setting[CRYPT_OUTPUT_SIZE];\n\n  /* Applications are encouraged, but not required, to use this field\n     to store the unhashed passphrase they will pass to crypt_*.\n     Future extensions to the API may make this more ergonomic.  */\n  char input[CRYPT_MAX_PASSPHRASE_SIZE];\n\n  /* Reserved for future application-visible fields.  For maximum\n     forward compatibility, applications should set this field to all\n     bytes zero before calling crypt_r, crypt_rn, or crypt_ra for the\n     first time with a just-allocated 'struct crypt_data'.  Future\n     extensions to the API may make this more ergonomic.  */\n  char reserved[CRYPT_DATA_RESERVED_SIZE];\n\n  /* This field should be set to 0 before calling crypt_r, crypt_rn,\n     or crypt_ra for the first time with a just-allocated\n     'struct crypt_data'.  This is not required if crypt_ra is allowed\n     to do the allocation itself (i.e. if the *DATA argument is a null\n     pointer).  Future extensions to the API may make this more ergonomic.  */\n  char initialized;\n\n  /* Scratch space used internally.  Applications should not read or\n     write this field.  All data written to this area is erased before\n     returning from the library.  */\n  char internal[CRYPT_DATA_INTERNAL_SIZE];\n};\n\n/* Thread-safe version of crypt.  Instead of writing to a static\n   storage area, the string returned by this function will be within\n   DATA->output.  Otherwise, behaves exactly the same as crypt.  */\nextern char *crypt_r (const char *__phrase, const char *__setting,\n                      struct crypt_data *__restrict __data)\n__THROW;\n\n/* Another thread-safe version of crypt.  Instead of writing to a\n   static storage area, the string returned by this function will be\n   somewhere within the space provided at DATA, which is of length SIZE\n   bytes.  SIZE must be at least sizeof (struct crypt_data).\n\n   Also, if an error occurs, this function returns a null pointer,\n   not a special string.  (However, the string returned on success\n   still will never begin with '*'.)  */\nextern char *crypt_rn (const char *__phrase, const char *__setting,\n                       void *__data, int __size)\n__THROW;\n\n/* Yet a third thread-safe version of crypt; this one works like\n   getline(3).  *DATA must be either 0 or a pointer to memory\n   allocated by malloc, and *SIZE must be the size of the allocation.\n   This space will be allocated or reallocated as necessary and the\n   values updated.  The string returned by this function will be\n   somewhere within the space at *DATA.  It is safe to deallocate\n   this space with free when it is no longer needed.\n\n   Like crypt_rn, this function returns a null pointer on failure, not\n   a special string.  */\nextern char *crypt_ra (const char *__phrase, const char *__setting,\n                       void **__data, int *__size)\n__THROW;\n\n\n/* Generate a string suitable for use as the setting when hashing a\n   new passphrase.  PREFIX controls which hash function will be used,\n   COUNT controls the computational cost of the hash (for functions\n   where this is tunable), and RBYTES should point to NRBYTES bytes of\n   random data.  If PREFIX is a null pointer, the current best default\n   is used; if RBYTES is a null pointer, random data will be retrieved\n   from the operating system if possible.  (Caution: setting PREFIX to\n   an *empty string* selects the use of the oldest and least secure\n   hash in the library.  Don't do that.)\n\n   The string returned is stored in a statically-allocated buffer, and\n   will be overwritten if the function is called again.  It is not\n   safe to call this function from multiple threads concurrently.\n   However, within a single thread, it is safe to pass the string as\n   the SETTING argument to crypt without copying it first; the two\n   functions use separate buffers.\n\n   If an error occurs (e.g. a prefix that does not correspond to a\n   supported hash function, or an inadequate amount of random data),\n   this function returns a null pointer.  */\nextern char *crypt_gensalt (const char *__prefix, unsigned long __count,\n                            const char *__rbytes, int __nrbytes)\n__THROW;\n\n/* Thread-safe version of crypt_gensalt; instead of a\n   statically-allocated buffer, the generated setting string is\n   written to OUTPUT, which is OUTPUT_SIZE bytes long.  OUTPUT_SIZE\n   must be at least CRYPT_GENSALT_OUTPUT_SIZE (see above).\n\n   If an error occurs, this function returns a null pointer and writes\n   a string that does not correspond to any valid setting into OUTPUT.  */\nextern char *crypt_gensalt_rn (const char *__prefix, unsigned long __count,\n                               const char *__rbytes, int __nrbytes,\n                               char *__output, int __output_size)\n__THROW;\n\n/* Kept for code compatibility with libxcrypt (v3.1.1 and earlier).\n   We intentionally declare the function using a macro here, since\n   we actually want to link compiled applications against the\n   identical crypt_gensalt_rn function.  */\n#ifndef IN_LIBCRYPT  /* Defined when building libxcrypt. */\n# ifdef __REDIRECT_NTH\nextern char * __REDIRECT_NTH (crypt_gensalt_r, (const char *__prefix,\n                              unsigned long __count, const char *__rbytes,\n                              int __nrbytes, char *__output,\n                              int __output_size), crypt_gensalt_rn);\n# else\n#  define crypt_gensalt_r crypt_gensalt_rn\n# endif\n#endif\n\n/* Another thread-safe version of crypt_gensalt; the generated setting\n   string is in storage allocated by malloc, and should be deallocated\n   with free when it is no longer needed.  */\nextern char *crypt_gensalt_ra (const char *__prefix, unsigned long __count,\n                               const char *__rbytes, int __nrbytes)\n__THROW;\n\n/* Checks whether the given setting is a supported method.\n\n   The return value is 0 if there is nothing wrong with this setting.\n   Otherwise, it is one of the following constants.  */\nextern int crypt_checksalt (const char *__setting);\n\n/* Constants for checking the return value of the\n   crypt_checksalt function.  */\n#define CRYPT_SALT_OK              0\n#define CRYPT_SALT_INVALID         1\n#define CRYPT_SALT_METHOD_DISABLED 2  /* NOT implemented, yet. */\n#define CRYPT_SALT_METHOD_LEGACY   3\n#define CRYPT_SALT_TOO_CHEAP       4  /* NOT implemented, yet. */\n\n/* Convenience function to get the prefix of the preferred hash method,\n   which is also used by the crypt_gensalt functions, if their given\n   prefix parameter is NULL.\n\n   The return value is string that equals the prefix of the preferred\n   hash method.  Otherwise, it is NULL.  */\nextern const char *crypt_preferred_method (void);\n\n/* These macros could be checked by portable users of crypt_gensalt*\n   functions to find out whether null pointers could be specified\n   as PREFIX and RBYTES arguments.  */\n#define CRYPT_GENSALT_IMPLEMENTS_DEFAULT_PREFIX @DEFAULT_PREFIX_ENABLED@\n#define CRYPT_GENSALT_IMPLEMENTS_AUTO_ENTROPY   1\n\n/* These macros can be checked by portable users of libxcrypt\n   to find out whether the function is implemented.  */\n#define CRYPT_CHECKSALT_AVAILABLE 1\n#define CRYPT_PREFERRED_METHOD_AVAILABLE 1\n\n/* Version number split in single integers.  */\n#define XCRYPT_VERSION_MAJOR @XCRYPT_VERSION_MAJOR@\n#define XCRYPT_VERSION_MINOR @XCRYPT_VERSION_MINOR@\n\n/* Version number coded into an integer.  */\n#define XCRYPT_VERSION_NUM ((XCRYPT_VERSION_MAJOR << 16) | \\\n                             XCRYPT_VERSION_MINOR)\n\n/* Version number as a string constant.  */\n#define XCRYPT_VERSION_STR \"@XCRYPT_VERSION_STR@\"\n\n@END_DECLS@\n\n#endif /* crypt.h */\n"
  },
  {
    "path": "lib/gen-des-tables.c",
    "content": "/*\n * FreeSec: libcrypt for NetBSD\n *\n * Copyright (c) 1994 David Burren\n * All rights reserved.\n *\n * Adapted for FreeBSD-2.0 by Geoffrey M. Rehmet\n *\tthis file should now *only* export crypt(), in order to make\n *\tbinaries of libcrypt exportable from the USA\n *\n * Adapted for FreeBSD-4.0 by Mark R V Murray\n *\tthis file should now *only* export crypt_des(), in order to make\n *\ta module that can be optionally included in libcrypt.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the author nor the names of other contributors\n *    may be used to endorse or promote products derived from this software\n *    without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n *\n * This is an original implementation of the DES and the crypt(3) interfaces\n * by David Burren <davidb@werj.com.au>.\n */\n\n/*\n * This program can regenerate the tables in alg-des-tables.c.\n * It is preserved as documentation, but it should no longer be\n * necessary to run it.\n */\n\n#include \"crypt-port.h\"\n\n#include <inttypes.h>\n#include <stdio.h>\n\nstatic const uint8_t\tIP[64] =\n{\n  58, 50, 42, 34, 26, 18, 10,  2, 60, 52, 44, 36, 28, 20, 12,  4,\n  62, 54, 46, 38, 30, 22, 14,  6, 64, 56, 48, 40, 32, 24, 16,  8,\n  57, 49, 41, 33, 25, 17,  9,  1, 59, 51, 43, 35, 27, 19, 11,  3,\n  61, 53, 45, 37, 29, 21, 13,  5, 63, 55, 47, 39, 31, 23, 15,  7\n};\n\nstatic uint8_t\tinv_key_perm[64];\nstatic const uint8_t\tkey_perm[56] =\n{\n  57, 49, 41, 33, 25, 17,  9,  1, 58, 50, 42, 34, 26, 18,\n  10,  2, 59, 51, 43, 35, 27, 19, 11,  3, 60, 52, 44, 36,\n  63, 55, 47, 39, 31, 23, 15,  7, 62, 54, 46, 38, 30, 22,\n  14,  6, 61, 53, 45, 37, 29, 21, 13,  5, 28, 20, 12,  4\n};\n\nstatic uint8_t\tinv_comp_perm[56];\nstatic const uint8_t\tcomp_perm[48] =\n{\n  14, 17, 11, 24,  1,  5,  3, 28, 15,  6, 21, 10,\n  23, 19, 12,  4, 26,  8, 16,  7, 27, 20, 13,  2,\n  41, 52, 31, 37, 47, 55, 30, 40, 51, 45, 33, 48,\n  44, 49, 39, 56, 34, 53, 46, 42, 50, 36, 29, 32\n};\n\n/*\n *\tNo E box is used, as it's replaced by some ANDs, shifts, and ORs.\n */\n\nstatic uint8_t\tu_sbox[8][64];\nstatic const uint8_t\tsbox[8][64] =\n{\n  {\n    14,  4, 13,  1,  2, 15, 11,  8,  3, 10,  6, 12,  5,  9,  0,  7,\n    0, 15,  7,  4, 14,  2, 13,  1, 10,  6, 12, 11,  9,  5,  3,  8,\n    4,  1, 14,  8, 13,  6,  2, 11, 15, 12,  9,  7,  3, 10,  5,  0,\n    15, 12,  8,  2,  4,  9,  1,  7,  5, 11,  3, 14, 10,  0,  6, 13\n  },\n  {\n    15,  1,  8, 14,  6, 11,  3,  4,  9,  7,  2, 13, 12,  0,  5, 10,\n    3, 13,  4,  7, 15,  2,  8, 14, 12,  0,  1, 10,  6,  9, 11,  5,\n    0, 14,  7, 11, 10,  4, 13,  1,  5,  8, 12,  6,  9,  3,  2, 15,\n    13,  8, 10,  1,  3, 15,  4,  2, 11,  6,  7, 12,  0,  5, 14,  9\n  },\n  {\n    10,  0,  9, 14,  6,  3, 15,  5,  1, 13, 12,  7, 11,  4,  2,  8,\n    13,  7,  0,  9,  3,  4,  6, 10,  2,  8,  5, 14, 12, 11, 15,  1,\n    13,  6,  4,  9,  8, 15,  3,  0, 11,  1,  2, 12,  5, 10, 14,  7,\n    1, 10, 13,  0,  6,  9,  8,  7,  4, 15, 14,  3, 11,  5,  2, 12\n  },\n  {\n    7, 13, 14,  3,  0,  6,  9, 10,  1,  2,  8,  5, 11, 12,  4, 15,\n    13,  8, 11,  5,  6, 15,  0,  3,  4,  7,  2, 12,  1, 10, 14,  9,\n    10,  6,  9,  0, 12, 11,  7, 13, 15,  1,  3, 14,  5,  2,  8,  4,\n    3, 15,  0,  6, 10,  1, 13,  8,  9,  4,  5, 11, 12,  7,  2, 14\n  },\n  {\n    2, 12,  4,  1,  7, 10, 11,  6,  8,  5,  3, 15, 13,  0, 14,  9,\n    14, 11,  2, 12,  4,  7, 13,  1,  5,  0, 15, 10,  3,  9,  8,  6,\n    4,  2,  1, 11, 10, 13,  7,  8, 15,  9, 12,  5,  6,  3,  0, 14,\n    11,  8, 12,  7,  1, 14,  2, 13,  6, 15,  0,  9, 10,  4,  5,  3\n  },\n  {\n    12,  1, 10, 15,  9,  2,  6,  8,  0, 13,  3,  4, 14,  7,  5, 11,\n    10, 15,  4,  2,  7, 12,  9,  5,  6,  1, 13, 14,  0, 11,  3,  8,\n    9, 14, 15,  5,  2,  8, 12,  3,  7,  0,  4, 10,  1, 13, 11,  6,\n    4,  3,  2, 12,  9,  5, 15, 10, 11, 14,  1,  7,  6,  0,  8, 13\n  },\n  {\n    4, 11,  2, 14, 15,  0,  8, 13,  3, 12,  9,  7,  5, 10,  6,  1,\n    13,  0, 11,  7,  4,  9,  1, 10, 14,  3,  5, 12,  2, 15,  8,  6,\n    1,  4, 11, 13, 12,  3,  7, 14, 10, 15,  6,  8,  0,  5,  9,  2,\n    6, 11, 13,  8,  1,  4, 10,  7,  9,  5,  0, 15, 14,  2,  3, 12\n  },\n  {\n    13,  2,  8,  4,  6, 15, 11,  1, 10,  9,  3, 14,  5,  0, 12,  7,\n    1, 15, 13,  8, 10,  3,  7,  4, 12,  5,  6, 11,  0, 14,  9,  2,\n    7, 11,  4,  1,  9, 12, 14,  2,  0,  6, 10, 13, 15,  3,  5,  8,\n    2,  1, 14,  7,  4, 10,  8, 13, 15, 12,  9,  0,  3,  5,  6, 11\n  }\n};\n\nstatic uint8_t\tun_pbox[32];\nstatic const uint8_t\tpbox[32] =\n{\n  16,  7, 20, 21, 29, 12, 28, 17,  1, 15, 23, 26,  5, 18, 31, 10,\n  2,  8, 24, 14, 32, 27,  3,  9, 19, 13, 30,  6, 22, 11,  4, 25\n};\n\nstatic const uint32_t\t*bits28, *bits24;\nstatic uint8_t\t\tinit_perm[64], final_perm[64];\n\nstatic const uint32_t\tbits32[32] =\n{\n  0x80000000, 0x40000000, 0x20000000, 0x10000000,\n  0x08000000, 0x04000000, 0x02000000, 0x01000000,\n  0x00800000, 0x00400000, 0x00200000, 0x00100000,\n  0x00080000, 0x00040000, 0x00020000, 0x00010000,\n  0x00008000, 0x00004000, 0x00002000, 0x00001000,\n  0x00000800, 0x00000400, 0x00000200, 0x00000100,\n  0x00000080, 0x00000040, 0x00000020, 0x00000010,\n  0x00000008, 0x00000004, 0x00000002, 0x00000001\n};\n\nstatic const uint8_t bits8[8] =\n{ 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01 };\n\nstatic uint8_t m_sbox_[4][4096];\nstatic uint32_t\tip_maskl_[8][256], ip_maskr_[8][256];\nstatic uint32_t\tfp_maskl_[8][256], fp_maskr_[8][256];\nstatic uint32_t\tkey_perm_maskl_[8][128], key_perm_maskr_[8][128];\nstatic uint32_t\tcomp_maskl_[8][128], comp_maskr_[8][128];\nstatic uint32_t\tpsbox_[4][256];\n\nstatic void\ndes_init(void)\n{\n  int\ti, j, b, k, inbit, obit;\n  uint32_t\t*p, *il, *ir, *fl, *fr;\n\n  bits24 = (bits28 = bits32 + 4) + 4;\n\n  /*\n   * Invert the S-boxes, reordering the input bits.\n   */\n  for (i = 0; i < 8; i++)\n    for (j = 0; j < 64; j++)\n      {\n        b = (j & 0x20) | ((j & 1) << 4) | ((j >> 1) & 0xf);\n        u_sbox[i][j] = sbox[i][b];\n      }\n\n  /*\n   * Convert the inverted S-boxes into 4 arrays of 8 bits.\n   * Each will handle 12 bits of the S-box input.\n   */\n  for (b = 0; b < 4; b++)\n    for (i = 0; i < 64; i++)\n      for (j = 0; j < 64; j++)\n        m_sbox_[b][(i << 6) | j] =\n          (uint8_t)((u_sbox[(b << 1)][i] << 4) |\n                    u_sbox[(b << 1) + 1][j]);\n\n  /*\n   * Set up the initial & final permutations into a useful form, and\n   * initialise the inverted key permutation.\n   */\n  for (i = 0; i < 64; i++)\n    {\n      final_perm[i] = (uint8_t)(IP[i] - 1);\n      init_perm[final_perm[i]] = (uint8_t)i;\n      inv_key_perm[i] = 255;\n    }\n\n  /*\n   * Invert the key permutation and initialise the inverted key\n   * compression permutation.\n   */\n  for (i = 0; i < 56; i++)\n    {\n      inv_key_perm[key_perm[i] - 1] = (uint8_t)i;\n      inv_comp_perm[i] = 255;\n    }\n\n  /*\n   * Invert the key compression permutation.\n   */\n  for (i = 0; i < 48; i++)\n    {\n      inv_comp_perm[comp_perm[i] - 1] = (uint8_t)i;\n    }\n\n  /*\n   * Set up the OR-mask arrays for the initial and final permutations,\n   * and for the key initial and compression permutations.\n   */\n  for (k = 0; k < 8; k++)\n    {\n      for (i = 0; i < 256; i++)\n        {\n          *(il = &ip_maskl_[k][i]) = 0L;\n          *(ir = &ip_maskr_[k][i]) = 0L;\n          *(fl = &fp_maskl_[k][i]) = 0L;\n          *(fr = &fp_maskr_[k][i]) = 0L;\n          for (j = 0; j < 8; j++)\n            {\n              inbit = 8 * k + j;\n              if (i & bits8[j])\n                {\n                  if ((obit = init_perm[inbit]) < 32)\n                    *il |= bits32[obit];\n                  else\n                    *ir |= bits32[obit-32];\n                  if ((obit = final_perm[inbit]) < 32)\n                    *fl |= bits32[obit];\n                  else\n                    *fr |= bits32[obit - 32];\n                }\n            }\n        }\n      for (i = 0; i < 128; i++)\n        {\n          *(il = &key_perm_maskl_[k][i]) = 0L;\n          *(ir = &key_perm_maskr_[k][i]) = 0L;\n          for (j = 0; j < 7; j++)\n            {\n              inbit = 8 * k + j;\n              if (i & bits8[j + 1])\n                {\n                  if ((obit = inv_key_perm[inbit]) == 255)\n                    continue;\n                  if (obit < 28)\n                    *il |= bits28[obit];\n                  else\n                    *ir |= bits28[obit - 28];\n                }\n            }\n          *(il = &comp_maskl_[k][i]) = 0L;\n          *(ir = &comp_maskr_[k][i]) = 0L;\n          for (j = 0; j < 7; j++)\n            {\n              inbit = 7 * k + j;\n              if (i & bits8[j + 1])\n                {\n                  if ((obit=inv_comp_perm[inbit]) == 255)\n                    continue;\n                  if (obit < 24)\n                    *il |= bits24[obit];\n                  else\n                    *ir |= bits24[obit - 24];\n                }\n            }\n        }\n    }\n\n  /*\n   * Invert the P-box permutation, and convert into OR-masks for\n   * handling the output of the S-box arrays setup above.\n   */\n  for (i = 0; i < 32; i++)\n    un_pbox[pbox[i] - 1] = (uint8_t)i;\n\n  for (b = 0; b < 4; b++)\n    for (i = 0; i < 256; i++)\n      {\n        *(p = &psbox_[b][i]) = 0L;\n        for (j = 0; j < 8; j++)\n          {\n            if (i & bits8[j])\n              *p |= bits32[un_pbox[8 * b + j]];\n          }\n      }\n}\n\nstatic void\nwrite_table_u8(size_t m, size_t n, const uint8_t *tbl, const char *name)\n{\n  printf(\"\\nconst uint8_t %s[%zu][%zu] = {\\n\", name, m, n);\n  for (size_t i = 0; i < m; i++)\n    {\n      fputs(\"  {\", stdout);\n      for (size_t j = 0; j < n; j++)\n        {\n          if (j % 12 == 0)\n            fputs(\"\\n   \", stdout);\n          printf(\" 0x%02x,\", (unsigned int)tbl[i*n + j]);\n        }\n      puts(\"\\n  },\");\n    }\n  puts(\"};\");\n}\n\nstatic void\nwrite_table_u32(size_t m, size_t n, const uint32_t *tbl, const char *name)\n{\n  printf(\"\\nconst uint32_t %s[%zu][%zu] = {\\n\", name, m, n);\n  for (size_t i = 0; i < m; i++)\n    {\n      fputs(\"  {\", stdout);\n      for (size_t j = 0; j < n; j++)\n        {\n          if (j % 6 == 0)\n            fputs(\"\\n   \", stdout);\n          printf(\" 0x%08\"PRIx32\",\", tbl[i*n + j]);\n        }\n      puts(\"\\n  },\");\n    }\n  puts(\"};\");\n}\n\nint\nmain(void)\n{\n  des_init();\n\n  write_table_u8(4, 4096, &m_sbox_[0][0], \"m_sbox\");\n\n  write_table_u32(8, 256, &ip_maskl_[0][0], \"ip_maskl\");\n  write_table_u32(8, 256, &ip_maskr_[0][0], \"ip_maskr\");\n  write_table_u32(8, 256, &fp_maskl_[0][0], \"fp_maskl\");\n  write_table_u32(8, 256, &fp_maskr_[0][0], \"fp_maskr\");\n\n  write_table_u32(8, 128, &key_perm_maskl_[0][0], \"key_perm_maskl\");\n  write_table_u32(8, 128, &key_perm_maskr_[0][0], \"key_perm_maskr\");\n  write_table_u32(8, 128, &comp_maskl_[0][0], \"comp_maskl\");\n  write_table_u32(8, 128, &comp_maskr_[0][0], \"comp_maskr\");\n\n  write_table_u32(4, 256, &psbox_[0][0], \"psbox\");\n}\n"
  },
  {
    "path": "lib/hashes.conf",
    "content": "# This file is read by expand-selected-hashes and gen-crypt-hashes-h.\n# It lists, for each supported hash algorithm, the name to be used to\n# enable or disable it at configure time, which is also part of the\n# name used for the 'crypt_fn' and 'gensalt_fn' entry points to the\n# relevant algorithm module; the prefix used to identify the algorithm\n# in hash strings; the number of bytes of random data that\n# crypt_gensalt should draw from the OS when its caller doesn't supply\n# any; and a comma-separated list of flags.\n#\n# The current set of possible flags is: STRONG means the hash is still\n# considered strong enough to use for newly hashed passwords; this is\n# the set of hashes that will be enabled when the library is\n# configured with --enable-hashes=strong.  DEFAULT means that this\n# hash may be used as the default for newly hashed passwords;\n# when crypt_gensalt is called with a null pointer for its prefix\n# argument, it will use the first hash in this file that was enabled\n# and has a DEFAULT flag.  Hashes that are not STRONG should never be\n# marked DEFAULT.  If you change the set of DEFAULT hashes you must also\n# update test-gensalt.c to match.\n#\n# ALT, FREEBSD, GLIBC, NETBSD, OPENBSD, OSX, OWL, SOLARIS, and SUSE\n# mean that the hash was historically supported by crypt() as provided\n# by that operating system / C library.  These are also recognized by\n# --enable-hashes as sets of hashes that can be enabled.\n#\n# Fields are separated by whitespace. Lines beginning with # are\n# ignored; # is not otherwise significant.  Multiple flags are\n# separated by commas.  A field whose contents are a single colon (:)\n# is actually understood as an empty string; colon is used for this\n# purpose because it cannot be part of a hash prefix or a C identifier.\n#\n# Because the first DEFAULT entry that's enabled is used for new\n# hashes when crypt_gensalt() is called with a null prefix, the list\n# should be kept in decreasing order of cryptographic strength overall\n# (this only *matters* for DEFAULT entries, but it's easier to keep\n# the whole list sorted that way).  Because of how crypt() checks\n# prefixes, the hashes that use an empty prefix (bigcrypt and\n# descrypt) must be last (conveniently, these are also the weakest\n# supported hashes).\n#\n#name          h_prefix  nrbytes  flags\nyescrypt       $y$       16       STRONG,DEFAULT,ALT,DEBIAN,FEDORA\ngost_yescrypt  $gy$      16       STRONG,ALT\nsm3_yescrypt   $sm3y$    16       STRONG,EULER,KYLIN\nscrypt         $7$       16       STRONG\nbcrypt         $2b$      16       STRONG,DEFAULT,ALT,FREEBSD,NETBSD,OPENBSD,OWL,SOLARIS,SUSE\nbcrypt_y       $2y$      16       STRONG,ALT,OWL,SUSE\nbcrypt_a       $2a$      16       STRONG,ALT,FREEBSD,NETBSD,OPENBSD,OWL,SOLARIS,SUSE\nbcrypt_x       $2x$      16       ALT,OWL,SUSE\nsm3crypt       $sm3$     16       EULER,KYLIN\nsha512crypt    $6$       15       STRONG,DEFAULT,GLIBC,FREEBSD,SOLARIS\nsha256crypt    $5$       15       GLIBC,FREEBSD,SOLARIS\nsha1crypt      $sha1     20       NETBSD\nsunmd5         $md5      8        SOLARIS\nmd5crypt       $1$       9        GLIBC,FREEBSD,NETBSD,OPENBSD,SOLARIS\nnt             $3$       1        FREEBSD\nbsdicrypt      _         3        FREEBSD,NETBSD,OPENBSD,OSX\nbigcrypt       :         2        :\ndescrypt       :         2        GLIBC,FREEBSD,NETBSD,OPENBSD,SOLARIS,OSX\n"
  },
  {
    "path": "lib/libcrypt.map.in",
    "content": "# This file is processed by gen-libcrypt-map to produce the versions\n# map file for libxcrypt.\n# symbol default_version compat_version [compat_version ...]\n\n# Actively supported POSIX interfaces; in GNU libc since 2.0\ncrypt\t\t\tXCRYPT_2.0\tGLIBC_2.0\ncrypt_r\t\t\tXCRYPT_2.0\tGLIBC_2.0\n\n# Actively supported Openwall extensions; never actually added to\n# upstream GNU libc, but present in at least Openwall, ALT, and SUSE\n# Linux distributions with one or more of these symbol versions\ncrypt_rn\t\tXCRYPT_2.0\tGLIBC_2.0:owl:suse\tGLIBC_2.2.1:alt\ncrypt_gensalt\t\tXCRYPT_2.0\tGLIBC_2.0:owl:suse\tGLIBC_2.2.1:alt     OW_CRYPT_1.0:suse\ncrypt_gensalt_rn\tXCRYPT_2.0\tGLIBC_2.0:owl:suse\tGLIBC_2.2.1:alt     OW_CRYPT_1.0:suse\n\ncrypt_ra\t\tXCRYPT_2.0\tGLIBC_2.0:owl:suse\tGLIBC_2.2.2:alt\ncrypt_gensalt_ra\tXCRYPT_2.0\tGLIBC_2.0:owl:suse\tGLIBC_2.2.2:alt     OW_CRYPT_1.0:suse\n\n# Actively supported interfaces from libxcrypt.\ncrypt_checksalt\t\tXCRYPT_4.3\ncrypt_preferred_method\tXCRYPT_4.4\n\n# Interfaces for code compatibility with libxcrypt v3.1.1 and earlier.\n# No longer available to new binaries.  Include in version-script, only\n# if one of the compatibility interfaces is enabled.\ncrypt_gensalt_r\t\t-\t\tXCRYPT_2.0:alt:glibc:owl:suse:yes\nxcrypt\t\t\t-\t\tXCRYPT_2.0:alt:glibc:owl:suse:yes\nxcrypt_r\t\t-\t\tXCRYPT_2.0:alt:glibc:owl:suse:yes\nxcrypt_gensalt\t\t-\t\tXCRYPT_2.0:alt:glibc:owl:suse:yes\nxcrypt_gensalt_r\t-\t\tXCRYPT_2.0:alt:glibc:owl:suse:yes\n\n# Deprecated interfaces, POSIX and otherwise; also present in GNU libc\n# since 2.0\nencrypt\t\t\t-\t\tGLIBC_2.0\nencrypt_r\t\t-\t\tGLIBC_2.0\nsetkey\t\t\t-\t\tGLIBC_2.0\nsetkey_r\t\t-\t\tGLIBC_2.0\nfcrypt\t\t\t-\t\tGLIBC_2.0\n\n# This determines the ordering of the version chain.  Each symbol\n# version that appears above must also appear in this list, and to\n# simplify gen-libcrypt-map, so must all of the versions listed in\n# libcrypt.minver.  The ordering is left to right, top to bottom.\n%chain GLIBC_2.0 GLIBC_2.2 GLIBC_2.2.1 GLIBC_2.2.2 GLIBC_2.2.5 GLIBC_2.2.6\n%chain GLIBC_2.3 GLIBC_2.4 GLIBC_2.12 GLIBC_2.16 GLIBC_2.17 GLIBC_2.18\n%chain GLIBC_2.21 GLIBC_2.27 GLIBC_2.29 GLIBC_2.32 GLIBC_2.33 GLIBC_2.35\n%chain GLIBC_2.36 GLIBC_2.38\n%chain OW_CRYPT_1.0 XCRYPT_2.0 XCRYPT_4.3 XCRYPT_4.4\n"
  },
  {
    "path": "lib/libcrypt.minver",
    "content": "# This file defines the minimum symbol version number used by the\n# system-provided libcrypt, for each CPU and OS where libxcrypt can be\n# binary backward compatible with it.  See also lib/libcrypt.map.in,\n# build-aux/scripts/compute-symver-floor, and\n# build-aux/scripts/gen-libcrypt-map.\n#\n# Lines in this file that start with '#' are comments; # is not\n# otherwise significant.  Blank lines are ignored.  All other lines\n# must have three or four columns: VERSION, SYSTEM, CPU_FAMILY,\n# and PREPROCESSOR_CHECK, in that order.\n#\n# VERSION is the minimum symbol version to use on hosts where SYSTEM\n# and CPU_FAMILY match autoconf's $host_os and $host_cpu values,\n# respectively, when interpreted as (Perl) regexes.  There is an implicit\n# ^ at the beginning of each regex (that is, they must match starting\n# at the beginning of the string) but there is no implicit $ at the end\n# (that is, they do not have to match the entire string).  Use '.'\n# to accept any string.\n#\n# If there is anything more on the line after the CPU_FAMILY field,\n# all of it is taken as a preprocessor #if expression which must be\n# true for this line's version number to be used.  The macros defined\n# in <limits.h> are available to this expression.  This mechanism is\n# for subarchitectures that do not change $host_cpu, e.g. x32 (I wish\n# they wouldn't do that...)\n#\n# The symbol version XCRYPT_2.0 is special; if this file selects that\n# version as the minimum for some platform, configure will\n# automatically switch into --disable-obsolete-api mode.  This is used\n# for platforms where either we have not yet implemented binary\n# backward compatibility with the system-provided libcrypt, or we know\n# there is no system-provided libcrypt to be compatible with.\n#\n# The symbol version ERROR is special; if this file selects that\n# version as the minimum for some platform, configuration will fail.\n# This is used for platforms where we know we ought to support\n# backward binary compatibility and the library shouldn't be allowed\n# to be used until someone's set this up properly.\n#\n# More specific regexes must be sorted below less specific ones, and\n# empty PREPROCESSOR_CHECK must be sorted below non-empty.  If neither\n# constraint applies, sort entries in descending order of symbol\n# version within one SYSTEM, and in alphabetical order of CPU_FAMILY\n# within each symbol version.\n#\n# Future cleanup: the ERROR lines for 'gnu*', 'kfreebsd*gnu*', and\n# 'linux*gnu*' can be removed once GNU libc stops shipping libcrypt.\n# It will be correct to use XCRYPT_2.0 as the minimum symbol version\n# for any platform added to glibc after that release.\n\n#VERSION     SYSTEM          CPU_FAMILY    PREPROCESSOR_CHECK\n\n# GNU Hurd\nGLIBC_2.38   gnu             x86_64\nGLIBC_2.2.6  gnu             i[3-9]86\nERROR        gnu             .\n\n# FreeBSD kernel with GNU libc\nGLIBC_2.3    kfreebsd.*gnu   x86_64        !(defined __x86_64__ && ULONG_MAX == UINT_MAX) /* not x32 */\nGLIBC_2.3    kfreebsd.*gnu   i[3-9]86\nERROR        kfreebsd.*gnu   .\n\n# Linux with GNU libc\nGLIBC_2.36   linux.*gnu      loongarch64   __WORDSIZE == 64 && ULONG_MAX != UINT_MAX /* lp64* ABI */\nGLIBC_2.35   linux.*gnu      or1k\nGLIBC_2.33   linux.*gnu      riscv32\nGLIBC_2.32   linux.*gnu      arc\nGLIBC_2.29   linux.*gnu      csky\nGLIBC_2.27   linux.*gnu      riscv64\nGLIBC_2.21   linux.*gnu      nios2\nGLIBC_2.18   linux.*gnu      microblaze\nGLIBC_2.17   linux.*gnu      aarch64\nGLIBC_2.17   linux.*gnu      powerpc64le\nGLIBC_2.16   linux.*gnu      x86_64        defined __x86_64__ && ULONG_MAX == UINT_MAX /* x32 */\nGLIBC_2.12   linux.*gnu      tilegx\nGLIBC_2.12   linux.*gnu      tilepro\nGLIBC_2.4    linux.*gnu      arm\nGLIBC_2.4    linux.*gnu      m68k          defined __mcoldfire__\nGLIBC_2.3    linux.*gnu      powerpc64\nGLIBC_2.2.5  linux.*gnu      x86_64        defined __x86_64__ && ULONG_MAX != UINT_MAX /* 64 */\nGLIBC_2.2    linux.*gnu      s390x\nGLIBC_2.0    linux.*gnu      alpha\nGLIBC_2.0    linux.*gnu      e2k\nGLIBC_2.0    linux.*gnu      hppa\nGLIBC_2.0    linux.*gnu      i[3-9]86\nGLIBC_2.0    linux.*gnu      ia64\nGLIBC_2.0    linux.*gnu      m68k\nGLIBC_2.0    linux.*gnu      mips\nGLIBC_2.0    linux.*gnu      powerpc\nGLIBC_2.0    linux.*gnu      s390\nGLIBC_2.0    linux.*gnu      sh\nGLIBC_2.0    linux.*gnu      sparc\nGLIBC_2.0    linux.*gnu      x86_64\nERROR        linux.*gnu      .\n\n# Other systems.\nXCRYPT_2.0   .               .\n"
  },
  {
    "path": "lib/libxcrypt.pc.in",
    "content": "#############################################\n#####   Pkg-Config file for libxcrypt   #####\n#############################################\n\nprefix=@prefix@\nexec_prefix=${prefix}\n\nlibdir=@libdir@\nincludedir=@includedir@\n\nName: @PACKAGE@\nVersion: @VERSION@\nDescription: Extended crypt library for DES, MD5, Blowfish and others\nLibs: -L${libdir} -lcrypt\nCflags: -I${includedir}\n"
  },
  {
    "path": "lib/util-base64.c",
    "content": "/* Copyright (C) 2018-2021 Björn Esser <besser82@fedoraproject.org>\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\n/* Base64-related utility functions and data.  */\n\n#include \"crypt-port.h\"\n\nconst unsigned char ascii64[65] =\n  \"./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\";\n/* 0000000000111111111122222222223333333333444444444455555555556666 */\n/* 0123456789012345678901234567890123456789012345678901234567890123 */\n"
  },
  {
    "path": "lib/util-gensalt-sha.c",
    "content": "/*\n * Written by Solar Designer and placed in the public domain.\n * See crypt-bcrypt.c for more information.\n *\n * This file contains setting-string generation code shared among the\n * MD5, SHA256, and SHA512 hash algorithms, which use very similar\n * setting formats.  Setting-string generation for bcrypt and DES is\n * entirely in crypt-bcrypt.c and crypt-des.c respectively.\n */\n\n#include \"crypt-port.h\"\n\n#include <errno.h>\n#include <stdio.h>\n\n#if INCLUDE_md5crypt || INCLUDE_sha256crypt || INCLUDE_sha512crypt || INCLUDE_sm3crypt\n\nvoid\ngensalt_sha_rn (const char *tag, size_t maxsalt, unsigned long defcount,\n                unsigned long mincount, unsigned long maxcount,\n                unsigned long count,\n                const uint8_t *rbytes, size_t nrbytes,\n                uint8_t *output, size_t output_size)\n{\n  /* We will use more rbytes if available, but at least this much is\n     required.  */\n  if (nrbytes < 3)\n    {\n      errno = EINVAL;\n      return;\n    }\n\n  if (count == 0)\n    count = defcount;\n  if (count < mincount)\n    count = mincount;\n  if (count > maxcount)\n    count = maxcount;\n\n  /* Compute how much space we need.  */\n  size_t output_len = 8; /* $x$ssss\\0 */\n  if (count != defcount)\n    {\n      output_len += 9; /* rounds=1$ */\n      for (unsigned long ceiling = 10; ceiling < count; ceiling *= 10)\n        output_len += 1;\n    }\n  if (output_size < output_len)\n    {\n      errno = ERANGE;\n      return;\n    }\n\n  size_t written;\n  if (count == defcount)\n    {\n      written = (size_t) snprintf ((char *)output, output_size, \"$%s$\", tag);\n    }\n  else\n    written = (size_t) snprintf ((char *)output, output_size,\n                                 \"$%s$rounds=%lu$\", tag, count);\n\n  /* The length calculation above should ensure that this is always true.  */\n  assert (written + 5 < output_size);\n\n  size_t used_rbytes = 0;\n  while (written + 5 < output_size &&\n         used_rbytes + 3 < nrbytes &&\n         (used_rbytes * 4 / 3) < maxsalt)\n    {\n      unsigned long value =\n        ((unsigned long) (unsigned char) rbytes[used_rbytes + 0] <<  0) |\n        ((unsigned long) (unsigned char) rbytes[used_rbytes + 1] <<  8) |\n        ((unsigned long) (unsigned char) rbytes[used_rbytes + 2] << 16);\n\n      output[written + 0] = ascii64[value & 0x3f];\n      output[written + 1] = ascii64[(value >> 6) & 0x3f];\n      output[written + 2] = ascii64[(value >> 12) & 0x3f];\n      output[written + 3] = ascii64[(value >> 18) & 0x3f];\n\n      written += 4;\n      used_rbytes += 3;\n    }\n\n  output[written] = '\\0';\n}\n\n#endif\n"
  },
  {
    "path": "lib/util-get-random-bytes.c",
    "content": "/* Retrieval of cryptographically random bytes from the operating system.\n *\n * Written by Zack Weinberg <zackw at panix.com> in 2017.\n *\n * No copyright is claimed, and the software is hereby placed in the public\n * domain.  In case this attempt to disclaim copyright and place the software\n * in the public domain is deemed null and void, then the software is\n * Copyright (c) 2017 Zack Weinberg and it is hereby released to the\n * general public under the following terms:\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted.\n *\n * There's ABSOLUTELY NO WARRANTY, express or implied.\n */\n\n#include \"crypt-port.h\"\n\n#include <errno.h>\n#include <stdlib.h>\n\n#ifdef HAVE_FCNTL_H\n#include <fcntl.h>\n#endif\n#ifdef HAVE_SYS_RANDOM_H\n#include <sys/random.h>\n#endif\n#ifdef HAVE_SYS_SYSCALL_H\n#include <sys/syscall.h>\n#endif\n#ifdef HAVE_SYS_STAT_H\n#include <sys/stat.h>\n#endif\n\n/* If we have O_CLOEXEC, we use it, but if we don't, we don't worry\n   about it.  */\n#ifndef O_CLOEXEC\n#define O_CLOEXEC 0\n#endif\n\n/* There is no universally portable way to access a system CSPRNG.\n   If the C library provides any of the following functions, we try them,\n   in order of preference: arc4random_buf, getentropy, getrandom.\n   If none of those are available or they don't work, we attempt to\n   make direct system calls for getentropy and getrandom.  If *that*\n   doesn't work, we try opening and reading /dev/urandom.\n\n   This function returns true if the exact number of requested bytes\n   was successfully read, false otherwise; if it returns false, errno\n   has been set.  It may block.  It cannot be used to read more than\n   256 bytes at a time (this is a limitation inherited from\n   getentropy() and enforced regardless of the actual back-end in use).\n\n   If we fall all the way back to /dev/urandom, we open and close it on\n   each call.  */\n\nbool\nget_random_bytes(void *buf, size_t buflen)\n{\n  if (buflen == 0)\n    return true;\n\n  /* Some, but not all, of the primitives below are limited to\n     producing no more than 256 bytes of random data.  Impose this\n     constraint on our callers regardless of which primitive is\n     actually used.  */\n  if (buflen > 256)\n    {\n      errno = EIO;\n      return false;\n    }\n\n  /* To eliminate the possibility of one of the primitives below failing\n     with EFAULT, force a crash now if the buffer is unwritable.  */\n  explicit_bzero (buf, buflen);\n\n#ifdef HAVE_ARC4RANDOM_BUF\n  /* arc4random_buf, if it exists, can never fail.  */\n  arc4random_buf (buf, buflen);\n  return true;\n\n#else /* no arc4random_buf */\n\n#ifdef HAVE_GETENTROPY\n  /* getentropy may exist but lack kernel support.  */\n  static bool getentropy_doesnt_work;\n  if (!getentropy_doesnt_work)\n    {\n      if (!getentropy (buf, buflen))\n        return true;\n      getentropy_doesnt_work = true;\n    }\n#endif\n\n#ifdef HAVE_GETRANDOM\n  /* Likewise getrandom.  */\n  static bool getrandom_doesnt_work;\n  if (!getrandom_doesnt_work)\n    {\n      if ((size_t)getrandom (buf, buflen, 0) == buflen)\n        return true;\n      getrandom_doesnt_work = true;\n    }\n#endif\n\n  /* If we can make arbitrary syscalls, try getentropy and getrandom\n     again that way.  */\n#ifdef HAVE_SYSCALL\n#ifdef SYS_getentropy\n  static bool sys_getentropy_doesnt_work;\n  if (!sys_getentropy_doesnt_work)\n    {\n      if (!syscall (SYS_getentropy, buf, buflen))\n        return true;\n      sys_getentropy_doesnt_work = true;\n    }\n#endif\n\n#ifdef SYS_getrandom\n  static bool sys_getrandom_doesnt_work;\n  if (!sys_getrandom_doesnt_work)\n    {\n      if ((size_t)syscall (SYS_getrandom, buf, buflen, 0) == buflen)\n        return true;\n      sys_getrandom_doesnt_work = true;\n    }\n#endif\n#endif\n\n#if defined HAVE_SYS_STAT_H && defined HAVE_FCNTL_H && defined HAVE_UNISTD_H\n  /* Try reading from /dev/urandom.  */\n  static bool dev_urandom_doesnt_work;\n  if (!dev_urandom_doesnt_work)\n    {\n      int fd = open (\"/dev/urandom\", O_RDONLY|O_CLOEXEC);\n      if (fd == -1)\n        dev_urandom_doesnt_work = true;\n      else\n        {\n          ssize_t nread = read (fd, buf, buflen);\n          if (nread < 0 || (size_t)nread < buflen)\n            dev_urandom_doesnt_work = true;\n\n          close(fd);\n          return !dev_urandom_doesnt_work;\n        }\n    }\n#endif\n\n  /* if we get here, we're just completely hosed */\n  errno = ENOSYS;\n  return false;\n#endif /* no arc4random_buf */\n}\n"
  },
  {
    "path": "lib/util-make-failure-token.c",
    "content": "/* Copyright (C) 2018-2019 Björn Esser <besser82@fedoraproject.org>\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\n#include \"crypt-port.h\"\n\n/* Fill the output buffer with a failure token.  */\nvoid\nmake_failure_token (const char *setting, char *output, int size)\n{\n  if (size >= 3)\n    {\n      char token[3] = \"*0\";\n\n      if (setting && setting[0] == '*' && setting[1] == '0')\n        token[1] = '1';\n\n      output[0] = token[0];\n      output[1] = token[1];\n      output[2] = '\\0';\n    }\n\n  /* If there's not enough space for the full failure token, do the\n     best we can.  */\n  else if (size == 2)\n    {\n      output[0] = '*';\n      output[1] = '\\0';\n    }\n  else if (size == 1)\n    {\n      output[0] = '\\0';\n    }\n}\n"
  },
  {
    "path": "lib/util-xbzero.c",
    "content": "/* Copyright (C) 2018-2019 Björn Esser <besser82@fedoraproject.org>\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\n#include \"crypt-port.h\"\n\n#if INCLUDE_explicit_bzero\n/* As long as this function is defined in a translation unit all by\n   itself, and we aren't doing LTO, it would be enough for it to just\n   call memset.  While compiling _this_ translation unit, the compiler\n   has no information about what the callers do with the buffer, so it\n   cannot eliminate the memset.  While compiling code that _calls_\n   this function, the compiler doesn't know what it does, so it cannot\n   eliminate the call (if it has special knowledge of a function with\n   this name, we would hope that it knows _not_ to optimize it out!)\n\n   However, in anticipation of doing LTO on this library one day, we\n   add two more defensive measures, when we know how: the function is\n   marked no-inline, and there is a no-op assembly insert immediately\n   after the memset call, declared to read the memory that the memset\n   writes.  */\n\nNO_INLINE void\nexplicit_bzero (void *s, size_t len)\n{\n  s = memset (s, 0, len);\n  asm volatile (\"\" : : \"g\" (s) : \"memory\");\n}\n#endif\n"
  },
  {
    "path": "lib/util-xstrcpy.c",
    "content": "/* Copyright (C) 2018-2019 Björn Esser <besser82@fedoraproject.org>\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\n/* Simple commonly used helper functions.  */\n\n#include \"crypt-port.h\"\n\n#include <stdlib.h>\n\n/* Provide a safe way to copy strings with the guarantee src,\n   including its terminating '\\0', will fit d_size bytes.\n   The trailing bytes of d_size will be filled with '\\0'.\n   dst and src must not be NULL.  Returns strlen (src).  */\nsize_t\nstrcpy_or_abort (void *dst, size_t d_size, const void *src)\n{\n  assert (dst != NULL);\n  assert (src != NULL);\n  size_t s_size = strlen ((const char *)src);\n  assert (d_size > s_size);\n  if (!(d_size > s_size)) /* for NDEBUG builds */\n    abort();\n\n  memcpy (dst, src, s_size);\n  memset (((char *)dst) + s_size, 0, d_size - s_size);\n  return s_size;\n}\n"
  },
  {
    "path": "lib/xcrypt.h.in",
    "content": "/* libxcrypt interfaces for code compatibility.\n\n   Copyright (C) 2018 Björn Esser <besser82@fedoraproject.org>\n\n   Redistribution and use in source and binary forms, with or without\n   modification, are permitted.\n\n   THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n   ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n   ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n   FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n   DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n   OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n   HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n   LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n   OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n   SUCH DAMAGE.  */\n\n#ifndef _XCRYPT_H\n#define _XCRYPT_H 1\n\n#include <crypt.h>\n\n@BEGIN_DECLS@\n\n/* For backward compatibility with older versions (v3.1.1 and earlier)\n   of libcrypt, this header declares xcrypt, xcrypt_r, xcrypt_gensalt,\n   and xcrypt_gensalt_r as alternative names for crypt, crypt_r,\n   crypt_gensalt, and crypt_gensalt_rn, respectively.  If glibc's\n   <sys/cdefs.h> macro __REDIRECT_NTH (which declares an alternative\n   name at the object-file level) is available, we use it.  */\n#ifdef __REDIRECT_NTH\nextern char * __REDIRECT_NTH (xcrypt, (const char *__phrase,\n                              const char *__setting), crypt);\n\nextern char * __REDIRECT_NTH (xcrypt_r, (const char *__phrase,\n                              const char *__setting,\n                              struct crypt_data *__restrict __data), crypt_r);\n\nextern char * __REDIRECT_NTH (xcrypt_gensalt, (const char *__prefix,\n                              unsigned long __count, const char *__rbytes,\n                              int __nrbytes), crypt_gensalt);\n\nextern char * __REDIRECT_NTH (xcrypt_gensalt_r, (const char *__prefix,\n                              unsigned long __count, const char *__rbytes,\n                              int __nrbytes, char *__output,\n                              int __output_size), crypt_gensalt_rn);\n#else\n# define xcrypt           crypt\n# define xcrypt_r         crypt_r\n# define xcrypt_gensalt   crypt_gensalt\n# define xcrypt_gensalt_r crypt_gensalt_rn\n#endif\n\n@END_DECLS@\n\n#endif /* xcrypt.h */\n"
  },
  {
    "path": "libxcrypt.spec.rpkg",
    "content": "# Build with new api?\n%if 0%{?fedora} || 0%{?rhel} > 8\n%bcond_without new_api\n%else\n%bcond_with    new_api\n%endif\n\n\n# Build the compat package?\n%if 0%{?fedora} >= 999 || 0%{?rhel} >= 10 || %{without new_api}\n%bcond_with    compat_pkg\n%else\n%bcond_without compat_pkg\n%endif\n\n\n# Replace obsolete functions with a stub?\n%if %{with new_api} && %{with compat_pkg}\n%bcond_without enosys_stubs\n%else\n%bcond_with    enosys_stubs\n%endif\n\n\n# Build the static library?\n%bcond_without staticlib\n\n\n# Shared object version of libcrypt.\n%if %{with new_api}\n%global soc  2\n%global sol  0\n%global sof  0\n%global sov  %{soc}.%{sol}.%{sof}\n%else\n%global soc  1\n%global sol  1\n%global sof  0\n%global sov  %{soc}.%{sol}.%{sof}\n%endif\n\n%if %{with compat_pkg}\n%global csoc 1\n%global csol 1\n%global csof 0\n%global csov %{csoc}.%{csol}.%{csof}\n%endif\n\n\n# First version of glibc built without libcrypt.\n%global glibc_minver     2.28\n\n\n# Minimum version of Perl needed for some build-scripts.\n%global perl_minver      5.14\n\n\n# The libxcrypt-devel package conflicts with out-dated manuals\n# shipped with the man-pages packages *before* this EVR.\n%global man_pages_minver 4.15-3\n\n\n# Need versioned requires on glibc and man-pages?\n%if !(0%{?fedora} || 0%{?rhel} > 9)\n%global trans_pkg        1\n%endif\n\n\n# Hash methods and API supported by libcrypt.\n# NEVER EVER touch this, if you do NOT know what you are doing!\n%global hash_methods   all\n\n%if %{with new_api}\n%global obsolete_api   no\n%else\n%global obsolete_api   glibc\n%endif\n\n%if %{with compat_pkg}\n%global compat_methods all\n%global compat_api     glibc\n%endif\n\n\n# Do we replace the obsolete API functions with stubs?\n%if %{with enosys_stubs}\n%global enosys_stubs   yes\n%else\n%global enosys_stubs   no\n%endif\n\n\n# Needed for the distribution README file.\n%if 0%{?fedora}\n%global distname .fedora\n%else\n%if 0%{?rhel}\n%global distname .rhel\n%else\n%global distname .distribution\n%endif\n%endif\n\n\n# Needed for out-of-tree builds.\n%global _configure \"$(realpath ../configure)\"\n\n\n# Create config.cache to speedup the run of\n# the configure script for the compat package.\n%global nvrt_str %{name}-%{version}-%{release}.%{_target_cpu}\n%global mktemplate %{nvrt_str}-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n%global config_cache %(mktemp -tu %{mktemplate}-config.cache)\n\n\n# Common configure options.\n%global common_configure_options           \\\\\\\n  --cache-file=%{config_cache}             \\\\\\\n  --disable-failure-tokens                 \\\\\\\n  --disable-silent-rules                   \\\\\\\n  --enable-shared                          \\\\\\\n%if %{with staticlib}                      \\\n  --enable-static                          \\\\\\\n%else                                      \\\n  --disable-static                         \\\\\\\n%endif                                     \\\n  --disable-valgrind                       \\\\\\\n  --srcdir=$(realpath ..)                  \\\\\\\n  --with-pkgconfigdir=%{_libdir}/pkgconfig\n\n\n# Fail linking if there are undefined symbols.\n# Required for proper ELF symbol versioning support.\n%global _ld_strict_symbol_defs 1\n\n\nName:           {{{ git_name }}}\nVersion:        {{{ git_real_version }}}\nRelease:        0.{{{ git_real_release }}}%{?dist}\nSummary:        Extended crypt library for descrypt, md5crypt, bcrypt, and others\n\n# For explicit license breakdown, see the\n# LICENSING file in the source tarball.\nLicense:        LGPL-2.1-or-later AND BSD-3-Clause AND BSD-2-Clause AND BSD-2-Clause-FreeBSD AND 0BSD AND CC0-1.0 AND LicenseRef-Fedora-Public-Domain\nURL:            https://github.com/besser82/%{name}\nVCS:            {{{ git_dir_vcs }}}\n\nSource0:        {{{ git_dir_pack }}}\n\nBuildRequires:  autoconf\nBuildRequires:  automake\nBuildRequires:  coreutils\nBuildRequires:  gcc\n%if 0%{?trans_pkg}\nBuildRequires:  glibc-devel                  >= %{glibc_minver}\n%endif\nBuildRequires:  libtool\nBuildRequires:  make\nBuildRequires:  perl(:VERSION)               >= %{perl_minver}\nBuildRequires:  perl(Class::Struct)\nBuildRequires:  perl(Cwd)\nBuildRequires:  perl(Exporter)\nBuildRequires:  perl(File::Spec::Functions)\nBuildRequires:  perl(File::Temp)\nBuildRequires:  perl(FindBin)\nBuildRequires:  perl(if)\nBuildRequires:  perl(IPC::Open3)\nBuildRequires:  perl(lib)\nBuildRequires:  perl(open)\nBuildRequires:  perl(POSIX)\nBuildRequires:  perl(Symbol)\nBuildRequires:  perl(utf8)\nBuildRequires:  perl(warnings)\nBuildRequires:  perl-interpreter\n\n# We do not need to keep this forever.\n%if 0%{?trans_pkg}\n# Inherited from former libcrypt package.\nObsoletes:      libcrypt-nss           < %{glibc_minver}\nProvides:       libcrypt-nss           = %{glibc_minver}\nProvides:       libcrypt-nss%{?_isa}   = %{glibc_minver}\n\n# Obsolete former libcrypt properly and provide a virtual libcrypt\n# package as it has been done by the former packages, which were\n# built by glibc before.\nObsoletes:      libcrypt               < %{glibc_minver}\nProvides:       libcrypt               = %{glibc_minver}\nProvides:       libcrypt%{?_isa}       = %{glibc_minver}\n\n# Obsolete former libxcrypt-common properly.\nObsoletes:      %{name}-common         < 4.3.3-4\nProvides:       %{name}-common         = %{version}-%{release}\n\n# We need a version of glibc, that doesn't build libcrypt anymore.\nRequires:       glibc%{?_isa}         >= %{glibc_minver}\n%endif\n\n%if %{with new_api} && %{without compat_pkg}\nObsoletes:      %{name}-compat         < %{version}-%{release}\n%endif\n\n%if 0%{?fedora}\nRecommends:     mkpasswd\n%endif\n\n%description\nlibxcrypt is a modern library for one-way hashing of passwords.  It\nsupports a wide variety of both modern and historical hashing methods:\nyescrypt, gost-yescrypt, sm3-yescrypt, scrypt, bcrypt, sm3crypt,\nsha512crypt, sha256crypt, md5crypt, SunMD5, sha1crypt, NT, bsdicrypt,\nbigcrypt, and descrypt.  It provides the traditional Unix crypt and\ncrypt_r interfaces, as well as a set of extended interfaces pioneered\nby Openwall Linux, crypt_rn, crypt_ra, crypt_gensalt, crypt_gensalt_rn,\nand crypt_gensalt_ra.\n\nlibxcrypt is intended to be used by login(1), passwd(1), and other\nsimilar programs; that is, to hash a small number of passwords during\nan interactive authentication dialogue with a human. It is not suitable\nfor use in bulk password-cracking applications, or in any other situation\nwhere speed is more important than careful handling of sensitive data.\nHowever, it is intended to be fast and lightweight enough for use in\nservers that must field thousands of login attempts per minute.\n%if %{with new_api}\nThis version of the library does not provide the legacy API functions\nthat have been provided by glibc's libcrypt.so.1.\n%endif\n\n\n%if %{with compat_pkg}\n%package        compat\nSummary:        Compatibility library providing legacy API functions\n\n# For testing the glibc compatibility symbols.\nBuildRequires:  libxcrypt-compat\n\nRequires:       %{name}%{?_isa}        = %{version}-%{release}\n\n%description    compat\nThis package contains the library providing the compatibility API\nfor applications that are linked against glibc's libxcrypt, or that\nare still using the unsafe and deprecated, encrypt, encrypt_r,\nsetkey, setkey_r, and fcrypt functions, which are still required by\nrecent versions of POSIX, the Single UNIX Specification, and various\nother standards.\n\nAll existing binary executables linked against glibc's libcrypt should\nwork unmodified with the library supplied by this package.\n%endif\n\n\n%package        devel\nSummary:        Development files for %{name}\n\nRequires:       %{name}%{?_isa}        = %{version}-%{release}\nRequires:       glibc-devel%{?_isa}\n%if 0%{?trans_pkg}\nConflicts:      man-pages              < %{man_pages_minver}\nRequires:       glibc-devel%{?_isa}   >= %{glibc_minver}\n%endif\n\n%description    devel\nThe %{name}-devel package contains libraries and header files for\ndeveloping applications that use %{name}.\n\n\n%if %{with staticlib}\n%package        static\nSummary:        Static library for -static linking with %{name}\n\nRequires:       %{name}-devel%{?_isa}  = %{version}-%{release}\nRequires:       glibc-static%{?_isa}\n%if 0%{?trans_pkg}\nRequires:       glibc-static%{?_isa}  >= %{glibc_minver}\n%endif\n\n%description    static\nThis package contains the libxcrypt static library for -static\nlinking.\n\nYou don't need this, unless you link statically, which is highly\ndiscouraged.\n%endif\n\n\n%prep\n{{{ git_dir_setup_macro }}}\n\n$(realpath ./autogen.sh)\n\n%if %{with new_api}\ncat << EOF >> README%{distname}\nThis version of the %{name} package ships the libcrypt.so.2\nlibrary and does not provide the legacy API functions that have\nbeen provided by glibc's libcrypt.so.1.  The removed functions\nby name are encrypt, encrypt_r, setkey, setkey_r, and fcrypt.\n%if %{with compat_pkg}\n\nIf you are using a third-party application that links against\nthose functions, or that is linked against glibc's libcrypt,\nyou may need to install the %{name}-compat package manually.\n\nAll existing binary executables linked against glibc's libcrypt\nshould work unmodified with the libcrypt.so.1 library supplied\nby the %{name}-compat package.\n%endif\nEOF\n%endif\n\n%if %{with enosys_stubs}\ncat << EOF >> README.posix\nThis version of the libcrypt.so.1 library has entirely removed\nthe functionality of the encrypt, encrypt_r, setkey, and setkey_r\nfunctions, while keeping fully binary compatibility with existing\n(third-party) applications possibly still using those funtions.\nIf such an application attemps to call one of these functions, the\ncorresponding function will indicate that it is not supported by\nthe system in a POSIX-compliant way.\n\nFor security reasons, the encrypt and encrypt_r functions will\nalso overwrite their data-block argument with random bits.\n\nAll existing binary executables linked against glibc's libcrypt\nshould work unmodified with the provided version of the\nlibcrypt.so.1 library in place.\nEOF\n%endif\n\n%if %{with staticlib}\ncat << EOF >> README.static\nApplications that use certain legacy APIs supplied by glibc’s\nlibcrypt (encrypt, encrypt_r, setkey, setkey_r, and fcrypt)\ncannot be compiled nor linked against the supplied build of\nthe object files provided in the static library libcrypt.a.\nEOF\n%endif\n\n\n%build\ntouch %{config_cache}\nmkdir -p %{_vpath_builddir}\n\n# Build the default system library.\npushd %{_vpath_builddir}\n%configure                                       \\\n  %{common_configure_options}                    \\\n  --enable-hashes=%{hash_methods}                \\\n  --enable-obsolete-api=%{obsolete_api}          \\\n%if %{with new_api}\n  --enable-obsolete-api-enosys=%{obsolete_api}\n%else\n  --enable-obsolete-api-enosys=%{enosys_stubs}\n%endif\n%make_build\npopd\n\n%if %{with compat_pkg}\nmkdir -p %{_vpath_builddir}-compat\n\n# Build the compatibility library.\npushd %{_vpath_builddir}-compat\n%configure                                       \\\n  %{common_configure_options}                    \\\n  --enable-hashes=%{compat_methods}              \\\n  --enable-obsolete-api=%{compat_api}            \\\n  --enable-obsolete-api-enosys=%{enosys_stubs}\n%make_build\npopd\n%endif\nrm -f %{config_cache}\n\n\n%install\n%if %{with compat_pkg}\n# Install the compatibility library.\n%make_install -C %{_vpath_builddir}-compat\n\n# Cleanup everything we do not need from the compatibility library.\nfind %{buildroot}                                               \\\n  -not -type d -not -name 'libcrypt.so.%{csoc}*' -delete -print\n%endif\n\n# Install the default system library.\n%make_install -C %{_vpath_builddir}\n\n# Get rid of libtool crap.\nfind %{buildroot} -name '*.la' -delete -print\n\n# Install documentation to shared %%_pkgdocdir.\ninstall -Dpm 0644 -t %{buildroot}%{_pkgdocdir} \\\n  ChangeLog NEWS README* THANKS TODO\n\n# Drop README.md as it is identical to README.\nrm -f %{buildroot}%{_pkgdocdir}/README.md\n\n\n%check\nbuild_dirs=\"%{_vpath_builddir}\"\n%if %{with compat_pkg}\nbuild_dirs=\"${build_dirs} %{_vpath_builddir}-compat\"\n%endif\nfor dir in ${build_dirs}; do\n  %make_build -C ${dir} check || \\\n    {\n      rc=$?;\n      echo \"-----BEGIN TESTLOG: ${dir}-----\";\n      cat ${dir}/test-suite.log;\n      echo \"-----END TESTLOG: ${dir}-----\";\n      exit $rc;\n    }\ndone\n\n\n%ldconfig_scriptlets\n%if %{with compat_pkg}\n%ldconfig_scriptlets compat\n%endif\n\n\n%files\n%doc %dir %{_pkgdocdir}\n%doc %{_pkgdocdir}/NEWS\n%doc %{_pkgdocdir}/README\n%if %{with new_api}\n%doc %{_pkgdocdir}/README%{distname}\n%endif\n%if %{with enosys_stubs} && %{without compat_pkg}\n%doc %{_pkgdocdir}/README.posix\n%endif\n%doc %{_pkgdocdir}/THANKS\n%license AUTHORS COPYING.LIB LICENSING\n%{_libdir}/libcrypt.so.%{soc}\n%{_libdir}/libcrypt.so.%{sov}\n%{_mandir}/man5/crypt.5*\n\n\n%if %{with compat_pkg}\n%files          compat\n%if %{with enosys_stubs}\n%doc %{_pkgdocdir}/README.posix\n%endif\n%{_libdir}/libcrypt.so.%{csoc}\n%{_libdir}/libcrypt.so.%{csov}\n%endif\n\n\n%files          devel\n%doc %{_pkgdocdir}/ChangeLog\n%doc %{_pkgdocdir}/TODO\n%{_libdir}/libcrypt.so\n%if %{without new_api}\n%{_libdir}/libxcrypt.so\n%endif\n%{_includedir}/crypt.h\n%if %{without new_api}\n%{_includedir}/xcrypt.h\n%endif\n%{_libdir}/pkgconfig/libcrypt.pc\n%{_libdir}/pkgconfig/%{name}.pc\n%{_mandir}/man3/crypt.3*\n%{_mandir}/man3/crypt_r.3*\n%{_mandir}/man3/crypt_ra.3*\n%{_mandir}/man3/crypt_rn.3*\n%{_mandir}/man3/crypt_checksalt.3*\n%{_mandir}/man3/crypt_gensalt.3*\n%{_mandir}/man3/crypt_gensalt_ra.3*\n%{_mandir}/man3/crypt_gensalt_rn.3*\n%{_mandir}/man3/crypt_preferred_method.3*\n\n\n%if %{with staticlib}\n%files          static\n%doc %{_pkgdocdir}/README.static\n%{_libdir}/libcrypt.a\n%if %{without new_api}\n%{_libdir}/libxcrypt.a\n%endif\n%endif\n\n\n%changelog\n{{{ git_dir_changelog }}}\n"
  },
  {
    "path": "rpkg.conf",
    "content": "[rpkg]\nuser_macros = \"${git_props:root}/rpkg.macros\"\n"
  },
  {
    "path": "rpkg.macros",
    "content": "function filter_tags {\n    grep -E \"^$1[^-]+$\"\n}\n\nfunction latest_merged_tag {\n    if [ \"$LEGACY_GIT\" ]; then\n        git for-each-ref --sort=-v:refname refs/tags | cut -f2 |\n            while read tag; do\n                if [ -z \"$(basename \"$tag\" | filter_tags \"$1\")\" ]; then\n                    continue\n                fi\n                if [ \"$(git merge-base \"$tag\" HEAD)\"=\"$(git rev-parse \"$tag\"^{commit})\" ]; then\n                    echo \"$(basename \"$tag\")\"\n                    return\n                fi\n            done\n    else\n        git tag --list --sort=-v:refname \"$1*\" --merged 2> /dev/null | filter_tags \"$1\" | head -n 1\n    fi\n}\n\nfunction git_version {\n    declare name=\"v\" lead=0 follow= \"$@\"\n\n    if [ -z \"$name\" ]; then\n        log_error \"name cannot be empty.\"\n        return 1\n    fi\n\n    if echo \"$lead.$follow\" | grep -q '-'; then\n        log_error \"lead and follow cannot contain dashes.\"\n        return 1\n    fi\n\n    if echo \"$follow\" | grep -q '\\.'; then\n        log_error \"follow cannot contain dots.\"\n        return 1\n    fi\n\n    latest_tag=\"$(latest_merged_tag \"$name\")\"\n    latest_tag_version=\"$(echo $latest_tag | sed -E -n \"s/^$name([^-]+)$/\\1/p\")\"\n\n    if [ -n \"$latest_tag\" ]; then\n        commit_count=\"$(git rev-list \"$latest_tag\"..HEAD | wc -l)\"\n    else\n        commit_count=\"$(git rev-list HEAD 2> /dev/null | wc -l  || printf 0)\"\n    fi\n\n    if [ \"$commit_count\" -eq 0 ]; then\n        commit_count_appendix=\n    else\n        commit_count_appendix=\".git.$commit_count.$(git rev-parse --short HEAD)\"\n    fi\n\n    latest_ctime=\"$(git_latest_ctime)\"\n    if [ \"$latest_ctime\" -eq 0 ]; then\n        wtree_appendix=\n    else\n        wtree_appendix=\".wtree.$(encode_decimal \"$latest_ctime\")\"\n    fi\n\n    if [ -z \"$follow\" ]; then\n        follow=\"$(echo \"$latest_tag_version\" | sed -E -n \"s/^.*\\.([^.]*)$/\\1/p\")\"\n    fi\n\n    if [ \"$lead\" = 0 ]; then\n        lead=\"$(echo \"$latest_tag_version\" | sed -E -n \"s/\\.$follow$//p\")\"\n    fi\n\n    follow=$((follow+1))\n\n    output \"${lead}.${follow:-0}${commit_count_appendix}${wtree_appendix}\"\n}\n\nfunction git_real_version {\n    real_version=\"$(git_version \"$@\" | sed -e \"s/\\.git.*$//\")\"\n    output \"${real_version}\"\n}\n\nfunction git_real_release {\n    git_version > /dev/null\n    commit_sha=\"$(echo ${commit_count_appendix} | sed -e \"s/^.*\\.//\")\"\n    commit_count_no=\"$(echo ${commit_count_appendix} | sed -e \"s/^\\.git\\.//\")\"\n    commit_count_no=\"$(echo ${commit_count_no} | sed -e \"s/\\.${commit_sha}//\")\"\n    output \"${commit_count_no}.git${commit_sha}${wtree_appendix}\"\n}\n"
  },
  {
    "path": "test/TestCommon.pm",
    "content": "# Written by Zack Weinberg <zackw at panix.com> in 2020.\n# To the extent possible under law, Zack Weinberg has waived all\n# copyright and related or neighboring rights to this work.\n#\n# See https://creativecommons.org/publicdomain/zero/1.0/ for further\n# details.\n\n# Code shared among all of the Perl-language tests in this directory.\n\npackage TestCommon;\n\nuse v5.14;    # implicit use strict, use feature ':5.14'\nuse warnings FATAL => 'all';\nuse utf8;\nuse open qw(:utf8);\n\nno  if $] >= 5.022, warnings => 'experimental::re_strict';\nuse if $] >= 5.022, re       => 'strict';\n\nuse Cwd qw(realpath);\nuse File::Spec::Functions qw(\n    catdir\n    catpath\n    splitpath\n);\nuse FindBin ();\nuse POSIX   ();\n\nuse lib \"$FindBin::Bin/../build-aux/scripts\";\n## ProhibitUnusedImport does not notice uses from @EXPORT_OK.\n## no critic (TooMuchCode::ProhibitUnusedImport)\nuse BuildCommon qw(\n    ensure_C_locale\n    error\n    popen\n    sh_split\n    sh_quote\n    subprocess_error\n    which\n);\n## use critic\n\nour @EXPORT_OK;\nuse Exporter qw(import);\n\nBEGIN {\n    # Re-export all the subprocess handling routines from BuildCommon\n    # as a convenience for individual tests.\n    @EXPORT_OK = qw(\n        compare_symbol_lists\n        ensure_C_locale\n        error\n        fail\n        find_real_library\n        get_symbols\n        popen\n        sh_quote\n        sh_split\n        skip\n        subprocess_error\n        which\n    );\n}\n\n# Diagnostics: report that the test has failed.\nsub fail {    ## no critic (Subroutines::RequireArgUnpacking)\n    my $msg = join q{ }, @_;\n    print {*STDERR} $FindBin::Script, ': FAIL: ', $msg, \"\\n\";\n    exit 1;\n}\n\n# Diagnostics: report that the test should be 'skipped' because\n# some piece of infrastructure we need is missing.\nsub skip {    ## no critic (Subroutines::RequireArgUnpacking)\n    my $msg = join q{ }, @_;\n    print {*STDERR} $FindBin::Script, ': skipping test: ', $msg, \"\\n\";\n    exit 77;\n}\n\n# Parse a .la file (arg 1) and determine the name of the actual .a or\n# .so file it refers to (arg 2: 'static' for .a, 'shared' for .so)\nsub find_real_library {\n    my ($lib_la, $type) = @_;\n\n    state @SH;\n    if (!@SH) {\n        @SH = which($ENV{SHELL} || $ENV{CONFIG_SHELL} || '/bin/sh');\n        error('no shell available???') if !@SH;\n    }\n\n    my $param;\n    if ($type eq 'shared') {\n        $param = 'dlname';\n    } elsif ($type eq 'static') {\n        $param = 'old_library';\n    } else {\n        error(\"unknown library type: '$type'\");\n    }\n\n    # We're going to interpolate $lib_la into a shell command.\n    # Save the unmangled directory part first, then quote it.\n    my ($vol, $dir, undef) = splitpath($lib_la);\n    $lib_la = sh_quote($lib_la);\n\n    # .la files are shell script fragments.  The easiest way to learn\n    # the name of the actual library is to ask a shell to parse the\n    # fragment for us.\n    my $fh = popen('-|', @SH, '-c', \". $lib_la; printf %s \\\"\\$$param\\\"\");\n    my $real_library;\n    {\n        local $/ = undef;    # slurp\n        $real_library = <$fh>;\n    }\n    close $fh or subprocess_error($SH[0]);\n\n    chomp $real_library;\n    $real_library = catpath($vol, catdir($dir, '.libs'), $real_library);\n    error(\"'$real_library' does not exist\") unless -f $real_library;\n    return realpath($real_library);\n}\n\n# In some object file formats, all symbols defined in C have an\n# underscore prepended to their names.  The configure script detects\n# this and the Makefiles set this environment variable appropriately.\nmy $symbol_prefix = $ENV{SYMBOL_PREFIX} || q{};\n\n# Return a hashset of symbols exported by the library $_[0], using readelf.\n# If it is a dynamic library, annotate each symbol with its version tag.\nsub get_symbols_readelf {\n    my $lib    = shift;\n    my $filter = shift // sub { 1 };\n\n    state $readelf_works = 1;\n    die \"readelf doesn't work\\n\" unless $readelf_works;\n\n    state @READELF;\n    if (!@READELF) {\n        @READELF = which($ENV{READELF} || 'readelf');\n        die \"readelf not available\\n\" unless @READELF;\n    }\n\n    my @opts              = ('--wide');\n    my $want_version_tags = 0;\n    if ($lib =~ /\\.(?:a|lib)$/) {\n        push @opts, '--syms';\n    } else {\n        push @opts, '--dyn-syms';\n        $want_version_tags = 1;\n    }\n\n    my $fh = popen('-|', @READELF, @opts, $lib);\n\n    local $_;\n    my %symbols;\n    my $saw_version_tags = 0;\n    while (<$fh>) {\n        chomp;\n        s/\\s+$//;\n        next if /^(?:$|File:|Symbol table)/;\n        next if /^\\s*Num:\\s+Value\\s+Size\\s+Type\\s+Bind\\s+Vis\\s+Ndx\\s+Name$/;\n\n        my ($num, $value, $size, $type, $bind, $vis, $ndx, $name) = split;\n\n        # We are only interested in globally visible, defined,\n        # non-absolute symbols.\n        next\n            if $ndx eq 'UND'\n            || $ndx eq 'ABS'\n            || $bind eq 'LOCAL';\n\n        # Strip the symbol prefix, if any, from each symbol.\n        $name =~ s/^$symbol_prefix// if $symbol_prefix ne q{};\n\n        $saw_version_tags = 1 if $name =~ /@[A-Z_]+[0-9]/;\n\n        if (&{$filter}($name)) {\n            print {*STDERR} \"|+ $name\\n\";\n            $symbols{$name} = 1;\n        } else {\n            print {*STDERR} \"|- $name\\n\";\n        }\n    }\n    if (!close $fh) {\n        # If it ran but exited 1 or 2, don't give up yet, we still\n        # have nm to try.\n        if ($! == 0 && ($? == 256 || $? == 512)) {\n            $readelf_works = 0;\n            die \"$READELF[0] exited \" . ($? >> 2) . \"\\n\";\n        }\n        subprocess_error($READELF[0]);\n    }\n    if ($want_version_tags && !$saw_version_tags) {\n        $readelf_works = 0;\n        die \"$READELF[0] did not print version tags\\n\";\n    }\n    return \\%symbols;\n}\n\n# Return a hashset of symbols exported by the library $_[0], using nm.\n# If it is a dynamic library, annotate each symbol with its version tag.\nsub get_symbols_nm {\n    my $lib    = shift;\n    my $filter = shift // sub { 1 };\n\n    state $nm_works = 1;\n    die \"nm doesn't work\\n\" unless $nm_works;\n\n    state @NM;\n    if (!@NM) {\n        @NM = which($ENV{NM} || 'nm');\n        die \"nm not available\\n\" unless @NM;\n    }\n\n    my @opts              = qw(--format=bsd --extern-only --defined-only);\n    my $want_version_tags = 0;\n    if ($lib !~ /\\.(?:a|lib)$/) {\n        push @opts, qw(--dynamic --with-symbol-versions);\n        $want_version_tags = 1;\n    }\n\n    my $fh = popen('-|', @NM, @opts, $lib);\n    local $_;\n    my %symbols;\n    my $saw_version_tags = 0;\n    while (<$fh>) {\n        chomp;\n        s/\\s+$//;\n        next unless $_;\n\n        # BSD-format nm output, when restricted to external, defined\n        # symbols, has three fields per line: address type name.\n        # We shouldn't ever see symbols with the address field blank,\n        # but just in case, discard them.\n        next unless /^([0-9a-fA-F]+)\\s+([A-Za-z])\\s+(\\S+)$/;\n        my $addr = $1;\n        my $type = $2;\n        my $name = $3;\n\n        # Symbols whose address is 0 and type is A are uninteresting;\n        # they define the set of symbol version tags.\n        next if $addr =~ /^0+$/ && $type eq 'A';\n\n        # Strip the symbol prefix, if any, from each symbol.\n        $name =~ s/^$symbol_prefix// if $symbol_prefix;\n\n        # Compensate for a bug in some versions of GNU nm\n        # where the symbol version is printed twice.\n        $name =~ s/(@+[A-Z0-9_.]+)\\1$/$1/;\n\n        $saw_version_tags = 1 if $name =~ /@[A-Z_]+[0-9]/;\n\n        if (&{$filter}($name)) {\n            print {*STDERR} \"|+ $name\\n\";\n            $symbols{$name} = 1;\n        } else {\n            print {*STDERR} \"|- $name\\n\";\n        }\n    }\n    if (!close $fh) {\n        # If it ran but exited 1 or 2, don't give up yet, we still\n        # have readelf to try.\n        if ($! == 0 && ($? == 256 || $? == 512)) {\n            $nm_works = 0;\n            die \"$NM[0] exited \" . ($? >> 8) . \"\\n\";\n        }\n        subprocess_error($NM[0]);\n    }\n    if ($want_version_tags && !$saw_version_tags) {\n        $nm_works = 0;\n        die \"$NM[0] did not print version tags\\n\";\n    }\n    return \\%symbols;\n}\n\n# Return a hashset of symbols exported by the library $_[0], using\n# readelf or nm, whichever works on this system.  If it is a dynamic\n# library, annotate each symbol with its version tag.  If $_[1] is\n# defined, it is a filter procedure; only symbols for which the filter\n# returns true are included in the hashset.\nsub get_symbols {    ## no critic (Subroutines::RequireArgUnpacking)\n    my $result;\n\n    $result = eval { get_symbols_nm(@_); };\n    return $result if $result;\n    print {*STDERR} \"get_symbols_nm: $@\";\n\n    $result = eval { get_symbols_readelf(@_); };\n    return $result if $result;\n    print {*STDERR} \"get_symbols_readelf: $@\";\n\n    skip('cannot get symbols using either readelf or nm');\n}\n\nsub compare_symbol_lists {\n    my ($found, $expected, $tag, $extra_allowed) = @_;\n    my @extra;\n    my @missing;\n    local $_;\n    for (keys %{$expected}) {\n        push @missing, $_ unless exists $found->{$_};\n    }\n    for (keys %{$found}) {\n        push @extra, $_ unless exists $expected->{$_};\n    }\n\n    my $error = 0;\n    if (@extra) {\n        $error = 1 unless $extra_allowed;\n        print {*STDERR} \"*** Extra $tag:\\n\";\n        for (sort @extra) {\n            s/^_crypt_//;\n            print {*STDERR} \"  $_\\n\";\n        }\n    }\n    if (@missing) {\n        $error = 1;\n        print {*STDERR} \"*** Missing $tag:\\n\";\n        for (sort @missing) {\n            s/^_crypt_//;\n            print {*STDERR} \"  $_\\n\";\n        }\n    }\n    return $error;\n}\n\n1;\n"
  },
  {
    "path": "test/alg-des.c",
    "content": "/*\n * This crypt(3) validation program shipped with UFC-crypt\n * is derived from one distributed with Phil Karns PD DES package.\n *\n * @(#)cert.c   1.8 11 Aug 1996\n */\n\n#include \"crypt-port.h\"\n#include \"alg-des.h\"\n#include \"des-cases.h\"\n\n#include <stdio.h>\n\n#if INCLUDE_descrypt || INCLUDE_bsdicrypt || INCLUDE_bigcrypt\n\nstatic void\nv_print (const unsigned char v[8])\n{\n  for (int i = 0; i < 8; i++)\n    printf (\"%02x\", (unsigned int)v[i]);\n}\n\nstatic void\nreport_failure (size_t n, bool decrypt,\n                const struct des_testcase *tc, const unsigned char got[8])\n{\n  printf (\"FAIL: %zu/%s: k=\", n, decrypt ? \"de\" : \"en\");\n  v_print (tc->key);\n  fputs (\"  exp \", stdout);\n  if (decrypt)\n    v_print (tc->plain);\n  else\n    v_print (tc->answer);\n  fputs (\"  got \", stdout);\n  v_print (got);\n  putchar ('\\n');\n}\n\nint\nmain (void)\n{\n  struct des_ctx ctx;\n  const struct des_testcase *tc;\n  unsigned char got[8];\n  size_t t;\n  int status = 0;\n\n  des_set_salt (&ctx, 0);\n\n  for (t = 0; t < N_DES_TESTCASES; t++)\n    {\n      tc = &des_testcases[t];\n      des_set_key (&ctx, tc->key);\n      des_crypt_block (&ctx, got, tc->plain, 0, false);\n      if (memcmp (got, tc->answer, 8) != 0)\n        {\n          status = 1;\n          report_failure (t, false, tc, got);\n        }\n\n      des_crypt_block (&ctx, got, tc->answer, 0, true);\n      if (memcmp (got, tc->plain, 8) != 0)\n        {\n          status = 1;\n          report_failure (t, true, tc, got);\n        }\n    }\n\n  return status;\n}\n\n#else\n\nint\nmain (void)\n{\n  return 77; /* UNSUPPORTED */\n}\n\n#endif\n"
  },
  {
    "path": "test/alg-gost3411-2012-hmac.c",
    "content": "/* Copyright (C) 2018 vt@altlinux.org\n * Copyright (C) 2018 Björn Esser besser82@fedoraproject.org\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\n#include \"crypt-port.h\"\n\n#if INCLUDE_gost_yescrypt\n\n#include \"alg-gost3411-2012-hmac.h\"\n\n#include <stdio.h>\n\nstatic void\ndumphex(const void *ptr, size_t size)\n{\n  size_t i;\n\n  for (i = 0; i < size; i++)\n    printf(\"%02x\", ((const unsigned char *)ptr)[i]);\n  printf(\"\\n\");\n}\n\nstatic int\ntest_gost2012_hmac(const char *subject, const char *k, size_t ksize,\n                   const char *t, size_t tlen, const char *match)\n{\n  uint8_t digest[32];\n  gost_hmac_256_t gostbuf;\n\n  gost_hmac256((const uint8_t *)k, ksize,\n               (const uint8_t *)t, tlen, digest, &gostbuf);\n\n  if (memcmp(digest, match, sizeof(digest)))\n    {\n      fprintf(stderr, \"ERROR: %s\\n\", subject);\n      printf(\"   key: \");\n      dumphex(k, ksize);\n      printf(\"   t:   \");\n      dumphex(t, tlen);\n      printf(\"   hmac=\");\n      dumphex(digest, sizeof(digest));\n      return 1;\n    }\n  else\n    fprintf(stderr, \"   ok: %s\\n\", subject);\n\n  return 0;\n}\n\nint\nmain (void)\n{\n  int result = 0;\n\n  result |= test_gost2012_hmac(\n              \"HMAC_GOSTR3411_2012_256 test vector from P 50.1.113-2016\",\n              \"\\x00\\x01\\x02\\x03\\x04\\x05\\x06\\x07\\x08\\x09\\x0a\\x0b\\x0c\\x0d\\x0e\\x0f\"\n              \"\\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17\\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f\", 32,\n              \"\\x01\\x26\\xbd\\xb8\\x78\\x00\\xaf\\x21\\x43\\x41\\x45\\x65\\x63\\x78\\x01\\x00\", 16,\n              \"\\xa1\\xaa\\x5f\\x7d\\xe4\\x02\\xd7\\xb3\\xd3\\x23\\xf2\\x99\\x1c\\x8d\\x45\\x34\"\n              \"\\x01\\x31\\x37\\x01\\x0a\\x83\\x75\\x4f\\xd0\\xaf\\x6d\\x7c\\xd4\\x92\\x2e\\xd9\"\n            );\n\n  return result;\n}\n\n#else\n\nint\nmain (void)\n{\n  return 77; /* UNSUPPORTED */\n}\n\n#endif /* INCLUDE_gost_yescrypt */\n"
  },
  {
    "path": "test/alg-gost3411-2012.c",
    "content": "/* Copyright (C) 2018 vt@altlinux.org\n * Copyright (C) 2018 Björn Esser besser82@fedoraproject.org\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\n#include \"crypt-port.h\"\n\n#if INCLUDE_gost_yescrypt\n\n#include \"alg-gost3411-2012-hmac.h\"\n\n#include <stdio.h>\n\nstatic void\ndumphex(const void *ptr, size_t size)\n{\n  size_t i;\n\n  for (i = 0; i < size; i++)\n    printf(\"%02x\", ((const unsigned char *)ptr)[i]);\n  printf(\"\\n\");\n}\n\nstatic int\ntest_gost2012_hash(const char *subject, const char *t, const char *match)\n{\n  size_t i;\n  uint8_t digest[32];\n  GOST34112012Context ctx;\n\n  gost_hash256((const uint8_t *)t, strlen(t), digest, &ctx);\n\n  char dgt[32 * 2 + 1];\n  for (i = 0; i < sizeof(digest); i++)\n    sprintf(&dgt[i * 2], \"%02x\", digest[i]);\n\n  if (strcmp(dgt, match) != 0)\n    {\n      fprintf(stderr, \"ERROR: %s\\n\", subject);\n      printf(\"   t[%zu] = \", strlen(t));\n      dumphex(t, strlen(t));\n      printf(\"   digest(%zu) = %s\",\n             sizeof(digest), dgt);\n      printf(\"   expected(%zu) = %s\\n\",\n             strlen(match) / 2, match);\n      return 1;\n    }\n  else\n    fprintf(stderr, \"   ok: %s\\n\", subject);\n\n  return 0;\n}\n\nstatic int\ntest_gost2012_hash512(const char *subject, const char *t, const char *match)\n{\n  size_t i;\n  size_t len = strlen(t);\n  size_t lh = len / 2;\n  uint8_t digest[64];\n  GOST34112012Context ctx;\n\n  GOST34112012Init(&ctx, GOSTR3411_2012_BITS * 2);\n\n  /* Operate on len < 64 for coverage */\n  GOST34112012Update(&ctx, (const uint8_t *)t, lh);\n  GOST34112012Update(&ctx, (const uint8_t *)t + lh, len - lh);\n\n  GOST34112012Final(&ctx, digest);\n\n  char dgt[64 * 2 + 1];\n  for (i = 0; i < sizeof(digest); i++)\n    sprintf(&dgt[i * 2], \"%02x\", digest[i]);\n\n  if (strcmp(dgt, match) != 0)\n    {\n      fprintf(stderr, \"ERROR: %s\\n\", subject);\n      printf(\"   t[%zu] = \", strlen(t));\n      dumphex(t, strlen(t));\n      printf(\"   digest(%zu) = %s\",\n             sizeof(digest), dgt);\n      printf(\"   expected(%zu) = %s\\n\",\n             strlen(match) / 2, match);\n      return 1;\n    }\n  else\n    fprintf(stderr, \"   ok: %s\\n\", subject);\n\n  return 0;\n}\n\nint\nmain (void)\n{\n  int result = 0;\n\n  result |= test_gost2012_hash(\n              \"test vector from example A.1 from GOST-34.11-2012 (256 Bit)\",\n              \"012345678901234567890123456789012345678901234567890123456789012\",\n              \"9d151eefd8590b89daa6ba6cb74af9275dd051026bb149a452fd84e5e57b5500\");\n\n  result |= !test_gost2012_hash(\n              \"false positive test vector (256 Bit)\",\n              \"012345678901234567890123456789012345678901234567890123456789012\",\n              \"012345678901234567890123456789012345678901234567890123456789012\");\n\n  result |= test_gost2012_hash(\n              \"test vector from example A.2 from GOST-34.11-2012 (256 Bit)\",\n              \"\\xD1\\xE5\\x20\\xE2\\xE5\\xF2\\xF0\\xE8\\x2C\\x20\\xD1\\xF2\\xF0\\xE8\\xE1\\xEE\"\n              \"\\xE6\\xE8\\x20\\xE2\\xED\\xF3\\xF6\\xE8\\x2C\\x20\\xE2\\xE5\\xFE\\xF2\\xFA\\x20\"\n              \"\\xF1\\x20\\xEC\\xEE\\xF0\\xFF\\x20\\xF1\\xF2\\xF0\\xE5\\xEB\\xE0\\xEC\\xE8\\x20\"\n              \"\\xED\\xE0\\x20\\xF5\\xF0\\xE0\\xE1\\xF0\\xFB\\xFF\\x20\\xEF\\xEB\\xFA\\xEA\\xFB\"\n              \"\\x20\\xC8\\xE3\\xEE\\xF0\\xE5\\xE2\\xFB\",\n              \"9dd2fe4e90409e5da87f53976d7405b0c0cac628fc669a741d50063c557e8f50\");\n\n  /* carry test */\n  result |= test_gost2012_hash(\n              \"carry test vector from gost-engine (256 Bit)\",\n              \"\\xEE\\xEE\\xEE\\xEE\\xEE\\xEE\\xEE\\xEE\\xEE\\xEE\\xEE\\xEE\\xEE\\xEE\\xEE\\xEE\"\n              \"\\xEE\\xEE\\xEE\\xEE\\xEE\\xEE\\xEE\\xEE\\xEE\\xEE\\xEE\\xEE\\xEE\\xEE\\xEE\\xEE\"\n              \"\\xEE\\xEE\\xEE\\xEE\\xEE\\xEE\\xEE\\xEE\\xEE\\xEE\\xEE\\xEE\\xEE\\xEE\\xEE\\xEE\"\n              \"\\xEE\\xEE\\xEE\\xEE\\xEE\\xEE\\xEE\\xEE\\xEE\\xEE\\xEE\\xEE\\xEE\\xEE\\xEE\\xEE\"\n              \"\\x16\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\"\n              \"\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\"\n              \"\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\"\n              \"\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x16\",\n              \"81bb632fa31fcc38b4c379a662dbc58b9bed83f50d3a1b2ce7271ab02d25babb\");\n\n  /* 512 bit hash test for completeness */\n  result |= test_gost2012_hash512(\n              \"test vector from example A.1 from GOST-34.11-2012 (512 bit)\",\n              \"012345678901234567890123456789012345678901234567890123456789012\",\n              \"1b54d01a4af5b9d5cc3d86d68d285462b19abc2475222f35c085122be4ba1ffa\"\n              \"00ad30f8767b3a82384c6574f024c311e2a481332b08ef7f41797891c1646f48\");\n\n  result |= !test_gost2012_hash512(\n              \"false positive test vector (512 bit)\",\n              \"012345678901234567890123456789012345678901234567890123456789012\",\n              \"0123456789012345678901234567890123456789012345678901234567890120\"\n              \"1234567890123456789012345678901234567890123456789012345678901234\");\n\n  result |= test_gost2012_hash512(\n              \"test vector from example A.2 from GOST-34.11-2012 (512 bit)\",\n              \"\\xD1\\xE5\\x20\\xE2\\xE5\\xF2\\xF0\\xE8\\x2C\\x20\\xD1\\xF2\\xF0\\xE8\\xE1\\xEE\"\n              \"\\xE6\\xE8\\x20\\xE2\\xED\\xF3\\xF6\\xE8\\x2C\\x20\\xE2\\xE5\\xFE\\xF2\\xFA\\x20\"\n              \"\\xF1\\x20\\xEC\\xEE\\xF0\\xFF\\x20\\xF1\\xF2\\xF0\\xE5\\xEB\\xE0\\xEC\\xE8\\x20\"\n              \"\\xED\\xE0\\x20\\xF5\\xF0\\xE0\\xE1\\xF0\\xFB\\xFF\\x20\\xEF\\xEB\\xFA\\xEA\\xFB\"\n              \"\\x20\\xC8\\xE3\\xEE\\xF0\\xE5\\xE2\\xFB\",\n              \"1e88e62226bfca6f9994f1f2d51569e0daf8475a3b0fe61a5300eee46d961376\"\n              \"035fe83549ada2b8620fcd7c496ce5b33f0cb9dddc2b6460143b03dabac9fb28\");\n\n  /* carry test */\n  result |= test_gost2012_hash512(\n              \"carry test vector from gost-engine (512 Bit)\",\n              \"\\xEE\\xEE\\xEE\\xEE\\xEE\\xEE\\xEE\\xEE\\xEE\\xEE\\xEE\\xEE\\xEE\\xEE\\xEE\\xEE\"\n              \"\\xEE\\xEE\\xEE\\xEE\\xEE\\xEE\\xEE\\xEE\\xEE\\xEE\\xEE\\xEE\\xEE\\xEE\\xEE\\xEE\"\n              \"\\xEE\\xEE\\xEE\\xEE\\xEE\\xEE\\xEE\\xEE\\xEE\\xEE\\xEE\\xEE\\xEE\\xEE\\xEE\\xEE\"\n              \"\\xEE\\xEE\\xEE\\xEE\\xEE\\xEE\\xEE\\xEE\\xEE\\xEE\\xEE\\xEE\\xEE\\xEE\\xEE\\xEE\"\n              \"\\x16\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\"\n              \"\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\"\n              \"\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\"\n              \"\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x16\",\n              \"8b06f41e59907d9636e892caf5942fcdfb71fa31169a5e70f0edb873664df41c\"\n              \"2cce6e06dc6755d15a61cdeb92bd607cc4aaca6732bf3568a23a210dd520fd41\");\n\n  return result;\n}\n\n#else\n\nint\nmain (void)\n{\n  return 77; /* UNSUPPORTED */\n}\n\n#endif /* INCLUDE_gost_yescrypt */\n"
  },
  {
    "path": "test/alg-hmac-sha1.c",
    "content": "/*\n * Copyright (c) 2017, Björn Esser <besser82@fedoraproject.org>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n *\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n#include \"crypt-port.h\"\n#include \"alg-sha1.h\"\n#include \"alg-hmac-sha1.h\"\n\n#include <stdio.h>\n#include <stdlib.h>\n\n#if INCLUDE_sha1crypt\n\n#define HASH_LENGTH 20\n\nstatic char *\nbin_to_char (char *buf, size_t bufsz, const char *data, size_t nbytes)\n{\n  size_t i;\n\n  buf[0] = '\\0';\n  if (bufsz <= (nbytes * 2))\n    return NULL;\n  for (i = 0; i < nbytes; i++)\n    {\n      (void)sprintf (&buf[i*2], \"%02x\", (unsigned char)data[i]);\n    }\n  return buf;\n}\n\nstatic int\nchar_to_bin (char *buf, size_t bufsz, const char *data, size_t nbytes)\n{\n  size_t i;\n  uint32_t c;\n\n  if (nbytes < 1)\n    nbytes = strlen (data);\n  nbytes /= 2;\n  if (bufsz <= nbytes)\n    return 0;\n  for (i = 0; i < nbytes; i++)\n    {\n      if (sscanf (&data[i*2], \"%02x\", &c) < 1)\n        break;\n      buf[i] = (char)(c & 0xff);\n    }\n  buf[i] = 0;\n  return (int)i;\n}\n\n/*\n * If a test key or data starts with 0x we'll convert to binary.\n */\n#define X2B(v, b) do { \\\n    if (memcmp (v, \"0x\", 2) == 0) { \\\n        v += 2; \\\n        char_to_bin (b, sizeof(b), v, strlen(v)); \\\n        v = b; \\\n    } \\\n} while (0)\n\n/*\n * Run some of the known answer tests from RFC 2202.\n */\nint\nmain (void)\n{\n  struct test_s\n  {\n    const char *key;\n    const char *data;\n    const char *expect;\n    const size_t data_size;\n  } tests[] =\n  {\n    {\n      \"0x0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b\",\n      \"Hi There\",\n      \"0xb617318655057264e28bc0b6fb378c8ef146be00\",\n      8,\n    },\n    {\n      \"Jefe\",\n      \"what do ya want for nothing?\",\n      \"0xeffcdf6ae5eb2fa2d27416d5f184df9c259a7c79\",\n      28,\n    },\n    {\n      \"0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n      \"0xdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd\",\n      \"0x125d7342b9ac11cd91a39af48aa17b4f63f175d3\",\n      50,\n    },\n    {\n      \"0x0102030405060708090a0b0c0d0e0f10111213141516171819\",\n      \"0xcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd\",\n      \"0x4c9007f4026250c6bc8414f9bf50c86c2d7235da\",\n      50,\n    },\n    {\n      \"0x0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c\",\n      \"Test With Truncation\",\n      \"0x4c1a03424b55e07fe7f27be1d58bb9324a9a5a04\",\n      20,\n    },\n    {\n      \"0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n      \"Test Using Larger Than Block-Size Key - Hash Key First\",\n      \"0xaa4ae5e15272d00e95705637ce8a3b55ed402112\",\n      54,\n    },\n    {\n      \"0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n      \"Test Using Larger Than Block-Size Key and Larger Than One Block-Size Data\",\n      \"0xe8e99d0f45237d786d6bbaa7965c7808bbff1a91\",\n      73,\n    },\n    {\n      0, 0, 0, 0,\n    },\n  };\n  struct test_s *test = tests;\n  char digest[HASH_LENGTH];\n  char kbuf[BUFSIZ];\n  char dbuf[BUFSIZ];\n  int n = 0;\n\n  for (test = tests; test->key; test++)\n    {\n      X2B(test->key, kbuf);\n      X2B(test->data, dbuf);\n      hmac_sha1_process_data ((const uint8_t *)test->data, test->data_size,\n                              (const uint8_t *)test->key, strlen(test->key), digest);\n      strncpy (dbuf, \"0x\", BUFSIZ);\n      bin_to_char (&dbuf[2], (sizeof dbuf) - 2, digest, HASH_LENGTH);\n\n      if (strcmp (dbuf, test->expect) != 0)\n        {\n          n = 1;\n          fputs (\"\\nkey=\", stdout);\n          fputs (test->key, stdout);\n          fputs (\", data=\", stdout);\n          fputs (test->data, stdout);\n          fputs (\",\\nresult=\", stdout);\n          fputs (dbuf, stdout);\n          fputs (\": \", stdout);\n          fputs (test->expect, stdout);\n          fputs (\"\\n\", stdout);\n        }\n    }\n  return n;\n}\n\n#else\n\nint\nmain (void)\n{\n  return 77; /* UNSUPPORTED */\n}\n\n#endif\n"
  },
  {
    "path": "test/alg-md4.c",
    "content": "#include \"crypt-port.h\"\n#include \"alg-md4.h\"\n\n#include <stdio.h>\n\n#if INCLUDE_nt\n\nstatic const struct\n{\n  const char *input;\n  const char result[16 + 1] ;\n} tests[] =\n{\n  /* Test vectors as defined in RFC 1320, appendix A, section 5.\n     https://tools.ietf.org/html/rfc1320#appendix-A.5  */\n  {\n    \"\",\n    \"\\x31\\xd6\\xcf\\xe0\\xd1\\x6a\\xe9\\x31\\xb7\\x3c\\x59\\xd7\\xe0\\xc0\\x89\\xc0\"\n  },\n  {\n    \"a\",\n    \"\\xbd\\xe5\\x2c\\xb3\\x1d\\xe3\\x3e\\x46\\x24\\x5e\\x05\\xfb\\xdb\\xd6\\xfb\\x24\"\n  },\n  {\n    \"abc\",\n    \"\\xa4\\x48\\x01\\x7a\\xaf\\x21\\xd8\\x52\\x5f\\xc1\\x0a\\xe8\\x7a\\xa6\\x72\\x9d\"\n  },\n  {\n    \"message digest\",\n    \"\\xd9\\x13\\x0a\\x81\\x64\\x54\\x9f\\xe8\\x18\\x87\\x48\\x06\\xe1\\xc7\\x01\\x4b\"\n  },\n  {\n    \"abcdefghijklmnopqrstuvwxyz\",\n    \"\\xd7\\x9e\\x1c\\x30\\x8a\\xa5\\xbb\\xcd\\xee\\xa8\\xed\\x63\\xdf\\x41\\x2d\\xa9\"\n  },\n  {\n    \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\",\n    \"\\x04\\x3f\\x85\\x82\\xf2\\x41\\xdb\\x35\\x1c\\xe6\\x27\\xe1\\x53\\xe7\\xf0\\xe4\"\n  },\n  {\n    \"12345678901234567890123456789012345678901234567890123456789012345678901234567890\",\n    \"\\xe3\\x3b\\x4d\\xdc\\x9c\\x38\\xf2\\x19\\x9c\\x3e\\x7b\\x16\\x4f\\xcc\\x05\\x36\"\n  }\n};\n\nstatic void\nreport_failure(int n, const char *tag,\n               const char expected[16], uint8_t actual[16])\n{\n  int i;\n  printf (\"FAIL: test %d (%s):\\n  exp:\", n, tag);\n  for (i = 0; i < 16; i++)\n    {\n      if (i % 4 == 0)\n        putchar (' ');\n      printf (\"%02x\", (unsigned int)(unsigned char)expected[i]);\n    }\n  printf (\"\\n  got:\");\n  for (i = 0; i < 16; i++)\n    {\n      if (i % 4 == 0)\n        putchar (' ');\n      printf (\"%02x\", (unsigned int)(unsigned char)actual[i]);\n    }\n  putchar ('\\n');\n  putchar ('\\n');\n}\n\nint\nmain (void)\n{\n  MD4_CTX ctx;\n  uint8_t sum[16];\n  int result = 0;\n  int cnt;\n  int i;\n\n  for (cnt = 0; cnt < (int) ARRAY_SIZE (tests); ++cnt)\n    {\n      MD4_Init (&ctx);\n      MD4_Update (&ctx, tests[cnt].input, strlen (tests[cnt].input));\n      MD4_Final (sum, &ctx);\n      if (memcmp (tests[cnt].result, sum, 16))\n        {\n          report_failure (cnt, \"all at once\", tests[cnt].result, sum);\n          result = 1;\n        }\n\n      MD4_Init (&ctx);\n      for (i = 0; tests[cnt].input[i] != '\\0'; ++i)\n        MD4_Update (&ctx, &tests[cnt].input[i], 1);\n      MD4_Final (sum, &ctx);\n      if (memcmp (tests[cnt].result, sum, 16))\n        {\n          report_failure (cnt, \"byte by byte\", tests[cnt].result, sum);\n          result = 1;\n        }\n    }\n\n  return result;\n}\n\n#else\n\nint\nmain (void)\n{\n  return 77; /* UNSUPPORTED */\n}\n\n#endif\n"
  },
  {
    "path": "test/alg-md5.c",
    "content": "#include \"crypt-port.h\"\n#include \"alg-md5.h\"\n\n#include <stdio.h>\n\n#if INCLUDE_md5crypt || INCLUDE_sunmd5\n\nstatic const struct\n{\n  const char *input;\n  const char result[16 + 1];\n} tests[] =\n{\n  /* \"Informal\" test vectors from\n     https://www.nist.gov/itl/ssd/software-quality-group/nsrl-test-data\n     (these were once in FIPS 180-2, but MD5 has been withdrawn).  */\n  {\n    \"abc\",\n    \"\\x90\\x01\\x50\\x98\\x3c\\xd2\\x4f\\xb0\\xd6\\x96\\x3f\\x7d\\x28\\xe1\\x7f\\x72\"\n  },\n  {\n    \"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq\",\n    \"\\x82\\x15\\xef\\x07\\x96\\xa2\\x0b\\xca\\xaa\\xe1\\x16\\xd3\\x87\\x6c\\x66\\x4a\"\n  },\n  /* Test vectors from the NESSIE project.  */\n  {\n    \"\",\n    \"\\xd4\\x1d\\x8c\\xd9\\x8f\\x00\\xb2\\x04\\xe9\\x80\\x09\\x98\\xec\\xf8\\x42\\x7e\"\n  },\n  {\n    \"a\",\n    \"\\x0c\\xc1\\x75\\xb9\\xc0\\xf1\\xb6\\xa8\\x31\\xc3\\x99\\xe2\\x69\\x77\\x26\\x61\"\n  },\n  {\n    \"message digest\",\n    \"\\xf9\\x6b\\x69\\x7d\\x7c\\xb7\\x93\\x8d\\x52\\x5a\\x2f\\x31\\xaa\\xf1\\x61\\xd0\"\n  },\n  {\n    \"abcdefghijklmnopqrstuvwxyz\",\n    \"\\xc3\\xfc\\xd3\\xd7\\x61\\x92\\xe4\\x00\\x7d\\xfb\\x49\\x6c\\xca\\x67\\xe1\\x3b\"\n  },\n  {\n    \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\",\n    \"\\xd1\\x74\\xab\\x98\\xd2\\x77\\xd9\\xf5\\xa5\\x61\\x1c\\x2c\\x9f\\x41\\x9d\\x9f\"\n  },\n  {\n    \"123456789012345678901234567890123456789012345678901234567890\"\n    \"12345678901234567890\",\n    \"\\x57\\xed\\xf4\\xa2\\x2b\\xe3\\xc9\\x55\\xac\\x49\\xda\\x2e\\x21\\x07\\xb6\\x7a\"\n  }\n};\n\nstatic void\nreport_failure(int n, const char *tag,\n               const char expected[16], uint8_t actual[16])\n{\n  int i;\n  printf (\"FAIL: test %d (%s):\\n  exp:\", n, tag);\n  for (i = 0; i < 16; i++)\n    {\n      if (i % 4 == 0)\n        putchar (' ');\n      printf (\"%02x\", (unsigned int)(unsigned char)expected[i]);\n    }\n  printf (\"\\n  got:\");\n  for (i = 0; i < 16; i++)\n    {\n      if (i % 4 == 0)\n        putchar (' ');\n      printf (\"%02x\", (unsigned int)(unsigned char)actual[i]);\n    }\n  putchar ('\\n');\n  putchar ('\\n');\n}\n\nint\nmain (void)\n{\n  MD5_CTX ctx;\n  uint8_t sum[16];\n  int result = 0;\n  int cnt;\n  int i;\n\n  for (cnt = 0; cnt < (int) ARRAY_SIZE (tests); ++cnt)\n    {\n      MD5_Init (&ctx);\n      MD5_Update (&ctx, tests[cnt].input, strlen (tests[cnt].input));\n      MD5_Final (sum, &ctx);\n      if (memcmp (tests[cnt].result, sum, 16))\n        {\n          report_failure (cnt, \"all at once\", tests[cnt].result, sum);\n          result = 1;\n        }\n\n      MD5_Init (&ctx);\n      for (i = 0; tests[cnt].input[i] != '\\0'; ++i)\n        MD5_Update (&ctx, &tests[cnt].input[i], 1);\n      MD5_Final (sum, &ctx);\n      if (memcmp (tests[cnt].result, sum, 16))\n        {\n          report_failure (cnt, \"byte by byte\", tests[cnt].result, sum);\n          result = 1;\n        }\n    }\n\n  /* The third \"informal\" test vector from\n     <https://www.nist.gov/itl/ssd/software-quality-group/nsrl-test-data>. */\n  char buf[1000];\n  memset (buf, 'a', sizeof (buf));\n  MD5_Init (&ctx);\n  for (i = 0; i < 1000; ++i)\n    MD5_Update (&ctx, buf, sizeof (buf));\n  MD5_Final (sum, &ctx);\n  static const char expected[64] =\n    \"\\x77\\x07\\xd6\\xae\\x4e\\x02\\x7c\\x70\\xee\\xa2\\xa9\\x35\\xc2\\x29\\x6f\\x21\";\n  if (memcmp (expected, sum, 16) != 0)\n    {\n      report_failure (cnt, \"block by block\", expected, sum);\n      result = 1;\n    }\n\n  return result;\n}\n\n#else\n\nint\nmain (void)\n{\n  return 77; /* UNSUPPORTED */\n}\n\n#endif\n"
  },
  {
    "path": "test/alg-pbkdf-hmac-sha256.c",
    "content": "/* Test HMAC_SHA256 and PBKDF2_HMAC_SHA256 implementations.\n *\n * Written by Zack Weinberg <zackw at panix.com> in 2018.\n * Incorporates standard test vectors from sources documented below.\n * To the extent possible under law, the named authors have waived all\n * copyright and related or neighboring rights to this work.\n *\n * See https://creativecommons.org/publicdomain/zero/1.0/ for further\n * details.\n */\n\n#include \"crypt-port.h\"\n#include \"alg-sha256.h\"\n\n#include <stdio.h>\n\n#if INCLUDE_scrypt || INCLUDE_yescrypt || INCLUDE_gost_yescrypt\n\nstruct hmac_sha256_test\n{\n  const char *key;\n  const char *message;\n  uint8_t digest[32 + 1];\n};\n\n/* HMAC-SHA256 test vectors from RFC 4231.  */\nstatic const struct hmac_sha256_test hmac_sha256_tests[] =\n{\n  {\n    \"\\x0b\\x0b\\x0b\\x0b\\x0b\\x0b\\x0b\\x0b\\x0b\\x0b\\x0b\\x0b\\x0b\\x0b\\x0b\\x0b\"\n    \"\\x0b\\x0b\\x0b\\x0b\",\n    \"Hi There\",\n    \"\\xb0\\x34\\x4c\\x61\\xd8\\xdb\\x38\\x53\\x5c\\xa8\\xaf\\xce\\xaf\\x0b\\xf1\\x2b\"\n    \"\\x88\\x1d\\xc2\\x00\\xc9\\x83\\x3d\\xa7\\x26\\xe9\\x37\\x6c\\x2e\\x32\\xcf\\xf7\"\n  },\n  {\n    \"Jefe\",\n    \"what do ya want for nothing?\",\n    \"\\x5b\\xdc\\xc1\\x46\\xbf\\x60\\x75\\x4e\\x6a\\x04\\x24\\x26\\x08\\x95\\x75\\xc7\"\n    \"\\x5a\\x00\\x3f\\x08\\x9d\\x27\\x39\\x83\\x9d\\xec\\x58\\xb9\\x64\\xec\\x38\\x43\"\n  },\n  {\n    \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\"\n    \"\\xaa\\xaa\\xaa\\xaa\",\n    \"\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\"\n    \"\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\"\n    \"\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\"\n    \"\\xdd\\xdd\",\n    \"\\x77\\x3e\\xa9\\x1e\\x36\\x80\\x0e\\x46\\x85\\x4d\\xb8\\xeb\\xd0\\x91\\x81\\xa7\"\n    \"\\x29\\x59\\x09\\x8b\\x3e\\xf8\\xc1\\x22\\xd9\\x63\\x55\\x14\\xce\\xd5\\x65\\xfe\"\n  },\n  {\n    \"\\x01\\x02\\x03\\x04\\x05\\x06\\x07\\x08\\x09\\x0a\\x0b\\x0c\\x0d\\x0e\\x0f\\x10\"\n    \"\\x11\\x12\\x13\\x14\\x15\\x16\\x17\\x18\\x19\",\n    \"\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\"\n    \"\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\"\n    \"\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\"\n    \"\\xcd\\xcd\",\n    \"\\x82\\x55\\x8a\\x38\\x9a\\x44\\x3c\\x0e\\xa4\\xcc\\x81\\x98\\x99\\xf2\\x08\\x3a\"\n    \"\\x85\\xf0\\xfa\\xa3\\xe5\\x78\\xf8\\x07\\x7a\\x2e\\x3f\\xf4\\x67\\x29\\x66\\x5b\"\n  },\n  {\n    \"\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\"\n    \"\\x0c\\x0c\\x0c\\x0c\",\n    \"Test With Truncation\",\n    /* N.B. the RFC only supplies the high 16 bytes of this vector; the rest\n       were filled in with the current implementation's output.  */\n    \"\\xa3\\xb6\\x16\\x74\\x73\\x10\\x0e\\xe0\\x6e\\x0c\\x79\\x6c\\x29\\x55\\x55\\x2b\"\n    \"\\xfa\\x6f\\x7c\\x0a\\x6a\\x8a\\xef\\x8b\\x93\\xf8\\x60\\xaa\\xb0\\xcd\\x20\\xc5\"\n  },\n  {\n    \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\"\n    \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\"\n    \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\"\n    \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\"\n    \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\"\n    \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\"\n    \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\"\n    \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\"\n    \"\\xaa\\xaa\\xaa\",\n    \"Test Using Larger Than Block-Size Key - Hash Key First\",\n    \"\\x60\\xe4\\x31\\x59\\x1e\\xe0\\xb6\\x7f\\x0d\\x8a\\x26\\xaa\\xcb\\xf5\\xb7\\x7f\"\n    \"\\x8e\\x0b\\xc6\\x21\\x37\\x28\\xc5\\x14\\x05\\x46\\x04\\x0f\\x0e\\xe3\\x7f\\x54\"\n  },\n  {\n    \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\"\n    \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\"\n    \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\"\n    \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\"\n    \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\"\n    \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\"\n    \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\"\n    \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\"\n    \"\\xaa\\xaa\\xaa\",\n    \"This is a test using a larger than block-size key and a larger t\"\n    \"han block-size data. The key needs to be hashed before being use\"\n    \"d by the HMAC algorithm.\",\n    \"\\x9b\\x09\\xff\\xa7\\x1b\\x94\\x2f\\xcb\\x27\\x63\\x5f\\xbc\\xd5\\xb0\\xe9\\x44\"\n    \"\\xbf\\xdc\\x63\\x64\\x4f\\x07\\x13\\x93\\x8a\\x7f\\x51\\x53\\x5c\\x3a\\x35\\xe2\"\n  }\n};\n\nstruct pbkdf2_hmac_sha256_test\n{\n  const char *passwd;\n  const char *salt;\n  uint32_t plen;\n  uint32_t slen;\n  uint32_t c;\n  uint32_t dklen;\n  const char *dk; /* [dklen] */\n};\n\nstruct pbkdf2_hmac_sha256_test pbkdf2_hmac_sha256_tests[] =\n{\n  /* PBKDF2-HMAC-SHA256 test vectors from RFC 7914.  */\n  {\n    \"passwd\", \"salt\", 6, 4, 1, 64,\n    \"\\x55\\xac\\x04\\x6e\\x56\\xe3\\x08\\x9f\\xec\\x16\\x91\\xc2\\x25\\x44\\xb6\\x05\"\n    \"\\xf9\\x41\\x85\\x21\\x6d\\xde\\x04\\x65\\xe6\\x8b\\x9d\\x57\\xc2\\x0d\\xac\\xbc\"\n    \"\\x49\\xca\\x9c\\xcc\\xf1\\x79\\xb6\\x45\\x99\\x16\\x64\\xb3\\x9d\\x77\\xef\\x31\"\n    \"\\x7c\\x71\\xb8\\x45\\xb1\\xe3\\x0b\\xd5\\x09\\x11\\x20\\x41\\xd3\\xa1\\x97\\x83\"\n  },\n  {\n    \"Password\", \"NaCl\", 8, 4, 80000, 64,\n    \"\\x4d\\xdc\\xd8\\xf6\\x0b\\x98\\xbe\\x21\\x83\\x0c\\xee\\x5e\\xf2\\x27\\x01\\xf9\"\n    \"\\x64\\x1a\\x44\\x18\\xd0\\x4c\\x04\\x14\\xae\\xff\\x08\\x87\\x6b\\x34\\xab\\x56\"\n    \"\\xa1\\xd4\\x25\\xa1\\x22\\x58\\x33\\x54\\x9a\\xdb\\x84\\x1b\\x51\\xc9\\xb3\\x17\"\n    \"\\x6a\\x27\\x2b\\xde\\xbb\\xa1\\xd0\\x78\\x47\\x8f\\x62\\xb3\\x97\\xf3\\x3c\\x8d\"\n  },\n  /* Test vectors from RFC 6070 (which defines PBKDF2-HMAC-SHA1)\n     recalculated with SHA256 instead of SHA1 and a larger dklen by\n     'aaz' at <https://stackoverflow.com/a/5136918/388520>.  */\n  {\n    \"password\", \"salt\", 8, 4, 1, 32,\n    \"\\x12\\x0f\\xb6\\xcf\\xfc\\xf8\\xb3\\x2c\\x43\\xe7\\x22\\x52\\x56\\xc4\\xf8\\x37\"\n    \"\\xa8\\x65\\x48\\xc9\\x2c\\xcc\\x35\\x48\\x08\\x05\\x98\\x7c\\xb7\\x0b\\xe1\\x7b\"\n  },\n  {\n    \"password\", \"salt\", 8, 4, 2, 32,\n    \"\\xae\\x4d\\x0c\\x95\\xaf\\x6b\\x46\\xd3\\x2d\\x0a\\xdf\\xf9\\x28\\xf0\\x6d\\xd0\"\n    \"\\x2a\\x30\\x3f\\x8e\\xf3\\xc2\\x51\\xdf\\xd6\\xe2\\xd8\\x5a\\x95\\x47\\x4c\\x43\"\n  },\n  {\n    \"password\", \"salt\", 8, 4, 4096, 32,\n    \"\\xc5\\xe4\\x78\\xd5\\x92\\x88\\xc8\\x41\\xaa\\x53\\x0d\\xb6\\x84\\x5c\\x4c\\x8d\"\n    \"\\x96\\x28\\x93\\xa0\\x01\\xce\\x4e\\x11\\xa4\\x96\\x38\\x73\\xaa\\x98\\x13\\x4a\"\n  },\n#ifdef SLOW_TESTS\n  /* With this test vector included, the program takes 40 seconds to run\n     to completion on a 2017-generation x86.  Without, half a second.  */\n  {\n    \"password\", \"salt\", 8, 4, 16777216, 32,\n    \"\\xcf\\x81\\xc6\\x6f\\xe8\\xcf\\xc0\\x4d\\x1f\\x31\\xec\\xb6\\x5d\\xab\\x40\\x89\"\n    \"\\xf7\\xf1\\x79\\xe8\\x9b\\x3b\\x0b\\xcb\\x17\\xad\\x10\\xe3\\xac\\x6e\\xba\\x46\"\n  },\n#endif\n  {\n    \"passwordPASSWORDpassword\", \"saltSALTsaltSALTsaltSALTsaltSALTsalt\",\n    24, 36, 4096, 40,\n    \"\\x34\\x8c\\x89\\xdb\\xcb\\xd3\\x2b\\x2f\\x32\\xd8\\x14\\xb8\\x11\\x6e\\x84\\xcf\"\n    \"\\x2b\\x17\\x34\\x7e\\xbc\\x18\\x00\\x18\\x1c\\x4e\\x2a\\x1f\\xb8\\xdd\\x53\\xe1\"\n    \"\\xc6\\x35\\x51\\x8c\\x7d\\xac\\x47\\xe9\"\n  },\n  {\n    \"pass\\0word\", \"sa\\0lt\", 9, 5, 4096, 16,\n    \"\\x89\\xb6\\x9d\\x05\\x16\\xf8\\x29\\x89\\x3c\\x69\\x62\\x26\\x65\\x0a\\x86\\x87\"\n  }\n};\n\n\nstatic void\nreport_failure(const char *tag, size_t n, size_t len,\n               const uint8_t expected[], const uint8_t actual[])\n{\n  size_t i;\n  printf (\"FAIL: %s/%zu:\\n  exp:\", tag, n);\n  for (i = 0; i < len; i++)\n    {\n      if (i % 4 == 0)\n        putchar (' ');\n      printf (\"%02x\", (unsigned int)(unsigned char)expected[i]);\n    }\n  printf (\"\\n  got:\");\n  for (i = 0; i < len; i++)\n    {\n      if (i % 4 == 0)\n        putchar (' ');\n      printf (\"%02x\", (unsigned int)(unsigned char)actual[i]);\n    }\n  putchar ('\\n');\n  putchar ('\\n');\n}\n\nstatic int\ntest_hmac_sha256 (void)\n{\n  uint8_t output[32];\n  HMAC_SHA256_CTX ctx;\n  int status = 0;\n  size_t j;\n  for (size_t i = 0; i < ARRAY_SIZE (hmac_sha256_tests); i++)\n    {\n      const struct hmac_sha256_test *t = &hmac_sha256_tests[i];\n      HMAC_SHA256_Buf (t->key, strlen (t->key),\n                       t->message, strlen (t->message),\n                       output);\n      if (memcmp (output, t->digest, 32))\n        {\n          report_failure (\"HMAC-SHA256 (one shot)\",\n                          i, 32, t->digest, output);\n          status = 1;\n        }\n      HMAC_SHA256_Init(&ctx, t->key, strlen (t->key));\n      for (j = 0; t->message[j] != '\\0'; j++)\n        HMAC_SHA256_Update(&ctx, &t->message[j], 1);\n      HMAC_SHA256_Final(output, &ctx);\n      if (memcmp (output, t->digest, 32))\n        {\n          report_failure (\"HMAC-SHA256 (incremental)\",\n                          i, 32, t->digest, output);\n          status = 1;\n        }\n    }\n  return status;\n}\n\nstatic int\ntest_pbkdf2_hmac_sha256 (void)\n{\n  uint8_t output[64];\n  int status = 0;\n  for (size_t i = 0; i < ARRAY_SIZE (pbkdf2_hmac_sha256_tests); i++)\n    {\n      const struct pbkdf2_hmac_sha256_test *t = &pbkdf2_hmac_sha256_tests[i];\n      assert (t->dklen <= sizeof output);\n\n      PBKDF2_SHA256 ((const unsigned char *)t->passwd, t->plen,\n                     (const unsigned char *)t->salt, t->slen,\n                     t->c, output, t->dklen);\n      if (memcmp (output, t->dk, t->dklen))\n        {\n          report_failure (\"PBKDF2-HMAC-SHA256\", i, t->dklen,\n                          (const unsigned char *)t->dk, output);\n          status = 1;\n        }\n    }\n  return status;\n}\n\n\nint\nmain (void)\n{\n  int status = 0;\n  status |= test_hmac_sha256 ();\n  status |= test_pbkdf2_hmac_sha256 ();\n  return status;\n}\n\n#else /* INCLUDE_scrypt || INCLUDE_yescrypt */\n\nint\nmain (void)\n{\n  return 77; /* UNSUPPORTED */\n}\n\n#endif\n"
  },
  {
    "path": "test/alg-sha1.c",
    "content": "/*\n * SHA-1 in C\n * By Steve Reid <sreid@sea-to-sky.net>\n * 100% Public Domain\n*/\n\n#include \"crypt-port.h\"\n#include \"alg-sha1.h\"\n\n#include <stdio.h>\n\n#if INCLUDE_sha1crypt\n\n/* Test Vectors (from FIPS PUB 180-1) */\nconst char *test_data[3] =\n{\n  \"abc\",\n  \"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq\",\n  \"A million repetitions of 'a'\"\n};\n\nconst char *test_results[3] =\n{\n  \"a9993e364706816aba3e25717850c26c9cd0d89d\",\n  \"84983e441c3bd26ebaae4aa1f95129e5e54670f1\",\n  \"34aa973cd4c4daa4f61eeb2bdbad27316534016f\"\n};\n\n\nstatic void\nbin_to_hex (uint8_t *digest, char *output)\n{\n  for (uint8_t i = 0; i < 20; ++i)\n    {\n      sprintf (output, \"%02x\", *digest);\n      ++digest;\n      output += 2;\n    }\n}\n\n\nint\nmain (void)\n{\n  int k;\n  struct sha1_ctx ctx;\n  uint8_t digest[20];\n  char output[80];\n  uint8_t retval = 0;\n\n  for (k = 0; k < 2; k++)\n    {\n      sha1_init_ctx (&ctx);\n      sha1_process_bytes ((const uint8_t*)test_data[k], &ctx, strlen(test_data[k]));\n      sha1_finish_ctx (&ctx, digest);\n      bin_to_hex(digest, output);\n\n      if (strcmp(output, test_results[k]))\n        {\n          fprintf(stdout, \"FAIL\\n\");\n          fprintf(stderr,\"* hash of \\\"%s\\\" incorrect:\\n\", test_data[k]);\n          fprintf(stderr,\"\\t%s returned\\n\", output);\n          fprintf(stderr,\"\\t%s is correct\\n\", test_results[k]);\n          retval = 1;\n        }\n    }\n  /* million 'a' vector we feed separately */\n  sha1_init_ctx (&ctx);\n  for (k = 0; k < 1000000; k++)\n    sha1_process_bytes ((const uint8_t*)\"a\", &ctx, 1);\n  sha1_finish_ctx (&ctx, digest);\n  bin_to_hex(digest, output);\n  if (strcmp(output, test_results[2]))\n    {\n      fprintf(stdout, \"FAIL\\n\");\n      fprintf(stderr,\"* hash of \\\"%s\\\" incorrect:\\n\", test_data[2]);\n      fprintf(stderr,\"\\t%s returned\\n\", output);\n      fprintf(stderr,\"\\t%s is correct\\n\", test_results[2]);\n      retval = 1;\n    }\n\n  /* The same test as above, but with 1000 blocks of 1000 bytes.  */\n  char buf[1000];\n  memset (buf, 'a', sizeof (buf));\n  sha1_init_ctx (&ctx);\n  for (k = 0; k < 1000; ++k)\n    sha1_process_bytes ((const uint8_t*)buf, &ctx, sizeof (buf));\n  sha1_finish_ctx (&ctx, digest);\n  bin_to_hex(digest, output);\n  if (strcmp(output, test_results[2]))\n    {\n      fprintf(stdout, \"FAIL\\n\");\n      fprintf(stderr,\"* hash of \\\"%s\\\" incorrect:\\n\", test_data[2]);\n      fprintf(stderr,\"\\t%s returned\\n\", output);\n      fprintf(stderr,\"\\t%s is correct\\n\", test_results[2]);\n      retval = 1;\n    }\n\n  /* success */\n  return retval;\n}\n\n#else\n\nint\nmain (void)\n{\n  return 77; /* UNSUPPORTED */\n}\n\n#endif\n"
  },
  {
    "path": "test/alg-sha256.c",
    "content": "#include \"crypt-port.h\"\n#include \"alg-sha256.h\"\n\n#include <stdio.h>\n\n#if INCLUDE_sha256crypt || INCLUDE_scrypt || INCLUDE_yescrypt || \\\n    INCLUDE_gost_yescrypt\n\nstatic const struct\n{\n  const char *input;\n  const char result[32 + 1];\n} tests[] =\n{\n  /* Test vectors from FIPS 180-2: appendix B.1.  */\n  {\n    \"abc\",\n    \"\\xba\\x78\\x16\\xbf\\x8f\\x01\\xcf\\xea\\x41\\x41\\x40\\xde\\x5d\\xae\\x22\\x23\"\n    \"\\xb0\\x03\\x61\\xa3\\x96\\x17\\x7a\\x9c\\xb4\\x10\\xff\\x61\\xf2\\x00\\x15\\xad\"\n  },\n  /* Test vectors from FIPS 180-2: appendix B.2.  */\n  {\n    \"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq\",\n    \"\\x24\\x8d\\x6a\\x61\\xd2\\x06\\x38\\xb8\\xe5\\xc0\\x26\\x93\\x0c\\x3e\\x60\\x39\"\n    \"\\xa3\\x3c\\xe4\\x59\\x64\\xff\\x21\\x67\\xf6\\xec\\xed\\xd4\\x19\\xdb\\x06\\xc1\"\n  },\n  /* Test vectors from the NESSIE project.  */\n  {\n    \"\",\n    \"\\xe3\\xb0\\xc4\\x42\\x98\\xfc\\x1c\\x14\\x9a\\xfb\\xf4\\xc8\\x99\\x6f\\xb9\\x24\"\n    \"\\x27\\xae\\x41\\xe4\\x64\\x9b\\x93\\x4c\\xa4\\x95\\x99\\x1b\\x78\\x52\\xb8\\x55\"\n  },\n  {\n    \"a\",\n    \"\\xca\\x97\\x81\\x12\\xca\\x1b\\xbd\\xca\\xfa\\xc2\\x31\\xb3\\x9a\\x23\\xdc\\x4d\"\n    \"\\xa7\\x86\\xef\\xf8\\x14\\x7c\\x4e\\x72\\xb9\\x80\\x77\\x85\\xaf\\xee\\x48\\xbb\"\n  },\n  {\n    \"message digest\",\n    \"\\xf7\\x84\\x6f\\x55\\xcf\\x23\\xe1\\x4e\\xeb\\xea\\xb5\\xb4\\xe1\\x55\\x0c\\xad\"\n    \"\\x5b\\x50\\x9e\\x33\\x48\\xfb\\xc4\\xef\\xa3\\xa1\\x41\\x3d\\x39\\x3c\\xb6\\x50\"\n  },\n  {\n    \"abcdefghijklmnopqrstuvwxyz\",\n    \"\\x71\\xc4\\x80\\xdf\\x93\\xd6\\xae\\x2f\\x1e\\xfa\\xd1\\x44\\x7c\\x66\\xc9\\x52\"\n    \"\\x5e\\x31\\x62\\x18\\xcf\\x51\\xfc\\x8d\\x9e\\xd8\\x32\\xf2\\xda\\xf1\\x8b\\x73\"\n  },\n  {\n    \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\",\n    \"\\xdb\\x4b\\xfc\\xbd\\x4d\\xa0\\xcd\\x85\\xa6\\x0c\\x3c\\x37\\xd3\\xfb\\xd8\\x80\"\n    \"\\x5c\\x77\\xf1\\x5f\\xc6\\xb1\\xfd\\xfe\\x61\\x4e\\xe0\\xa7\\xc8\\xfd\\xb4\\xc0\"\n  },\n  {\n    \"123456789012345678901234567890123456789012345678901234567890\"\n    \"12345678901234567890\",\n    \"\\xf3\\x71\\xbc\\x4a\\x31\\x1f\\x2b\\x00\\x9e\\xef\\x95\\x2d\\xd8\\x3c\\xa8\\x0e\"\n    \"\\x2b\\x60\\x02\\x6c\\x8e\\x93\\x55\\x92\\xd0\\xf9\\xc3\\x08\\x45\\x3c\\x81\\x3e\"\n  }\n};\n\n\nstatic void\nreport_failure(int n, const char *tag,\n               const char expected[32], uint8_t actual[32])\n{\n  int i;\n  printf (\"FAIL: test %d (%s):\\n  exp:\", n, tag);\n  for (i = 0; i < 32; i++)\n    {\n      if (i % 4 == 0)\n        putchar (' ');\n      printf (\"%02x\", (unsigned int)(unsigned char)expected[i]);\n    }\n  printf (\"\\n  got:\");\n  for (i = 0; i < 32; i++)\n    {\n      if (i % 4 == 0)\n        putchar (' ');\n      printf (\"%02x\", (unsigned int)(unsigned char)actual[i]);\n    }\n  putchar ('\\n');\n  putchar ('\\n');\n}\n\nint\nmain (void)\n{\n  SHA256_CTX ctx;\n  uint8_t sum[32];\n  int result = 0;\n  int cnt;\n  int i;\n\n  for (cnt = 0; cnt < (int) ARRAY_SIZE (tests); ++cnt)\n    {\n      SHA256_Buf (tests[cnt].input, strlen (tests[cnt].input), sum);\n      if (memcmp (tests[cnt].result, sum, 32) != 0)\n        {\n          report_failure (cnt, \"all at once\", tests[cnt].result, sum);\n          result = 1;\n        }\n\n      SHA256_Init (&ctx);\n      for (i = 0; tests[cnt].input[i] != '\\0'; ++i)\n        SHA256_Update (&ctx, &tests[cnt].input[i], 1);\n      SHA256_Final (sum, &ctx);\n      if (memcmp (tests[cnt].result, sum, 32) != 0)\n        {\n          report_failure (cnt, \"byte by byte\", tests[cnt].result, sum);\n          result = 1;\n        }\n    }\n\n  /* Test vector from FIPS 180-2: appendix B.3.  */\n  char buf[1000];\n  memset (buf, 'a', sizeof (buf));\n  SHA256_Init (&ctx);\n  for (i = 0; i < 1000; ++i)\n    SHA256_Update (&ctx, buf, sizeof (buf));\n  SHA256_Final (sum, &ctx);\n  static const char expected[32 + 1] =\n    \"\\xcd\\xc7\\x6e\\x5c\\x99\\x14\\xfb\\x92\\x81\\xa1\\xc7\\xe2\\x84\\xd7\\x3e\\x67\"\n    \"\\xf1\\x80\\x9a\\x48\\xa4\\x97\\x20\\x0e\\x04\\x6d\\x39\\xcc\\xc7\\x11\\x2c\\xd0\";\n  if (memcmp (expected, sum, 32) != 0)\n    {\n      report_failure (cnt, \"block by block\", expected, sum);\n      result = 1;\n    }\n\n  return result;\n}\n\n#else\n\nint\nmain (void)\n{\n  return 77; /* UNSUPPORTED */\n}\n\n#endif\n"
  },
  {
    "path": "test/alg-sha512.c",
    "content": "#include \"crypt-port.h\"\n#include \"alg-sha512.h\"\n\n#include <stdio.h>\n\n#if INCLUDE_sha512crypt\n\nstatic const struct\n{\n  const char *input;\n  const char result[64 + 1];\n} tests[] =\n{\n  /* Test vectors from FIPS 180-2: appendix C.1.  */\n  {\n    \"abc\",\n    \"\\xdd\\xaf\\x35\\xa1\\x93\\x61\\x7a\\xba\\xcc\\x41\\x73\\x49\\xae\\x20\\x41\\x31\"\n    \"\\x12\\xe6\\xfa\\x4e\\x89\\xa9\\x7e\\xa2\\x0a\\x9e\\xee\\xe6\\x4b\\x55\\xd3\\x9a\"\n    \"\\x21\\x92\\x99\\x2a\\x27\\x4f\\xc1\\xa8\\x36\\xba\\x3c\\x23\\xa3\\xfe\\xeb\\xbd\"\n    \"\\x45\\x4d\\x44\\x23\\x64\\x3c\\xe8\\x0e\\x2a\\x9a\\xc9\\x4f\\xa5\\x4c\\xa4\\x9f\"\n  },\n  /* Test vectors from FIPS 180-2: appendix C.2.  */\n  {\n    \"abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmn\"\n    \"hijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu\",\n    \"\\x8e\\x95\\x9b\\x75\\xda\\xe3\\x13\\xda\\x8c\\xf4\\xf7\\x28\\x14\\xfc\\x14\\x3f\"\n    \"\\x8f\\x77\\x79\\xc6\\xeb\\x9f\\x7f\\xa1\\x72\\x99\\xae\\xad\\xb6\\x88\\x90\\x18\"\n    \"\\x50\\x1d\\x28\\x9e\\x49\\x00\\xf7\\xe4\\x33\\x1b\\x99\\xde\\xc4\\xb5\\x43\\x3a\"\n    \"\\xc7\\xd3\\x29\\xee\\xb6\\xdd\\x26\\x54\\x5e\\x96\\xe5\\x5b\\x87\\x4b\\xe9\\x09\"\n  },\n  /* Test vectors from the NESSIE project.  */\n  {\n    \"\",\n    \"\\xcf\\x83\\xe1\\x35\\x7e\\xef\\xb8\\xbd\\xf1\\x54\\x28\\x50\\xd6\\x6d\\x80\\x07\"\n    \"\\xd6\\x20\\xe4\\x05\\x0b\\x57\\x15\\xdc\\x83\\xf4\\xa9\\x21\\xd3\\x6c\\xe9\\xce\"\n    \"\\x47\\xd0\\xd1\\x3c\\x5d\\x85\\xf2\\xb0\\xff\\x83\\x18\\xd2\\x87\\x7e\\xec\\x2f\"\n    \"\\x63\\xb9\\x31\\xbd\\x47\\x41\\x7a\\x81\\xa5\\x38\\x32\\x7a\\xf9\\x27\\xda\\x3e\"\n  },\n  {\n    \"a\",\n    \"\\x1f\\x40\\xfc\\x92\\xda\\x24\\x16\\x94\\x75\\x09\\x79\\xee\\x6c\\xf5\\x82\\xf2\"\n    \"\\xd5\\xd7\\xd2\\x8e\\x18\\x33\\x5d\\xe0\\x5a\\xbc\\x54\\xd0\\x56\\x0e\\x0f\\x53\"\n    \"\\x02\\x86\\x0c\\x65\\x2b\\xf0\\x8d\\x56\\x02\\x52\\xaa\\x5e\\x74\\x21\\x05\\x46\"\n    \"\\xf3\\x69\\xfb\\xbb\\xce\\x8c\\x12\\xcf\\xc7\\x95\\x7b\\x26\\x52\\xfe\\x9a\\x75\"\n  },\n  {\n    \"message digest\",\n    \"\\x10\\x7d\\xbf\\x38\\x9d\\x9e\\x9f\\x71\\xa3\\xa9\\x5f\\x6c\\x05\\x5b\\x92\\x51\"\n    \"\\xbc\\x52\\x68\\xc2\\xbe\\x16\\xd6\\xc1\\x34\\x92\\xea\\x45\\xb0\\x19\\x9f\\x33\"\n    \"\\x09\\xe1\\x64\\x55\\xab\\x1e\\x96\\x11\\x8e\\x8a\\x90\\x5d\\x55\\x97\\xb7\\x20\"\n    \"\\x38\\xdd\\xb3\\x72\\xa8\\x98\\x26\\x04\\x6d\\xe6\\x66\\x87\\xbb\\x42\\x0e\\x7c\"\n  },\n  {\n    \"abcdefghijklmnopqrstuvwxyz\",\n    \"\\x4d\\xbf\\xf8\\x6c\\xc2\\xca\\x1b\\xae\\x1e\\x16\\x46\\x8a\\x05\\xcb\\x98\\x81\"\n    \"\\xc9\\x7f\\x17\\x53\\xbc\\xe3\\x61\\x90\\x34\\x89\\x8f\\xaa\\x1a\\xab\\xe4\\x29\"\n    \"\\x95\\x5a\\x1b\\xf8\\xec\\x48\\x3d\\x74\\x21\\xfe\\x3c\\x16\\x46\\x61\\x3a\\x59\"\n    \"\\xed\\x54\\x41\\xfb\\x0f\\x32\\x13\\x89\\xf7\\x7f\\x48\\xa8\\x79\\xc7\\xb1\\xf1\"\n  },\n  {\n    \"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq\",\n    \"\\x20\\x4a\\x8f\\xc6\\xdd\\xa8\\x2f\\x0a\\x0c\\xed\\x7b\\xeb\\x8e\\x08\\xa4\\x16\"\n    \"\\x57\\xc1\\x6e\\xf4\\x68\\xb2\\x28\\xa8\\x27\\x9b\\xe3\\x31\\xa7\\x03\\xc3\\x35\"\n    \"\\x96\\xfd\\x15\\xc1\\x3b\\x1b\\x07\\xf9\\xaa\\x1d\\x3b\\xea\\x57\\x78\\x9c\\xa0\"\n    \"\\x31\\xad\\x85\\xc7\\xa7\\x1d\\xd7\\x03\\x54\\xec\\x63\\x12\\x38\\xca\\x34\\x45\"\n  },\n  {\n    \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\",\n    \"\\x1e\\x07\\xbe\\x23\\xc2\\x6a\\x86\\xea\\x37\\xea\\x81\\x0c\\x8e\\xc7\\x80\\x93\"\n    \"\\x52\\x51\\x5a\\x97\\x0e\\x92\\x53\\xc2\\x6f\\x53\\x6c\\xfc\\x7a\\x99\\x96\\xc4\"\n    \"\\x5c\\x83\\x70\\x58\\x3e\\x0a\\x78\\xfa\\x4a\\x90\\x04\\x1d\\x71\\xa4\\xce\\xab\"\n    \"\\x74\\x23\\xf1\\x9c\\x71\\xb9\\xd5\\xa3\\xe0\\x12\\x49\\xf0\\xbe\\xbd\\x58\\x94\"\n  },\n  {\n    \"123456789012345678901234567890123456789012345678901234567890\"\n    \"12345678901234567890\",\n    \"\\x72\\xec\\x1e\\xf1\\x12\\x4a\\x45\\xb0\\x47\\xe8\\xb7\\xc7\\x5a\\x93\\x21\\x95\"\n    \"\\x13\\x5b\\xb6\\x1d\\xe2\\x4e\\xc0\\xd1\\x91\\x40\\x42\\x24\\x6e\\x0a\\xec\\x3a\"\n    \"\\x23\\x54\\xe0\\x93\\xd7\\x6f\\x30\\x48\\xb4\\x56\\x76\\x43\\x46\\x90\\x0c\\xb1\"\n    \"\\x30\\xd2\\xa4\\xfd\\x5d\\xd1\\x6a\\xbb\\x5e\\x30\\xbc\\xb8\\x50\\xde\\xe8\\x43\"\n  }\n};\n\n\nstatic void\nreport_failure(int n, const char *tag,\n               const char expected[64], const uint8_t actual[64])\n{\n  int i;\n  printf (\"FAIL: test %d (%s):\\n  exp:\", n, tag);\n  for (i = 0; i < 64; i++)\n    {\n      if (i == 32)\n        printf (\"\\n         \");\n      else if (i % 4 == 0)\n        putchar (' ');\n      printf (\"%02x\", (unsigned int)(unsigned char)expected[i]);\n    }\n  printf (\"\\n  got:\");\n  for (i = 0; i < 64; i++)\n    {\n      if (i == 32)\n        printf (\"\\n         \");\n      else if (i % 4 == 0)\n        putchar (' ');\n      printf (\"%02x\", (unsigned int)(unsigned char)actual[i]);\n    }\n  putchar ('\\n');\n  putchar ('\\n');\n}\n\nint\nmain (void)\n{\n  SHA512_CTX ctx;\n  uint8_t sum[64];\n  int result = 0;\n  int cnt;\n  int i;\n\n  for (cnt = 0; cnt < (int) ARRAY_SIZE (tests); ++cnt)\n    {\n      SHA512_Buf (tests[cnt].input, strlen (tests[cnt].input), sum);\n      if (memcmp (tests[cnt].result, sum, 64) != 0)\n        {\n          report_failure (cnt, \"all at once\", tests[cnt].result, sum);\n          result = 1;\n        }\n\n      SHA512_Init (&ctx);\n      for (i = 0; tests[cnt].input[i] != '\\0'; ++i)\n        SHA512_Update (&ctx, &tests[cnt].input[i], 1);\n      SHA512_Final (sum, &ctx);\n      if (memcmp (tests[cnt].result, sum, 64) != 0)\n        {\n          report_failure (cnt, \"byte by byte\", tests[cnt].result, sum);\n          result = 1;\n        }\n    }\n\n  /* Test vector from FIPS 180-2: appendix C.3.  */\n  char buf[1000];\n  memset (buf, 'a', sizeof (buf));\n  SHA512_Init (&ctx);\n  for (i = 0; i < 1000; ++i)\n    SHA512_Update (&ctx, buf, sizeof (buf));\n  SHA512_Final (sum, &ctx);\n  static const char expected[64 + 1] =\n    \"\\xe7\\x18\\x48\\x3d\\x0c\\xe7\\x69\\x64\\x4e\\x2e\\x42\\xc7\\xbc\\x15\\xb4\\x63\"\n    \"\\x8e\\x1f\\x98\\xb1\\x3b\\x20\\x44\\x28\\x56\\x32\\xa8\\x03\\xaf\\xa9\\x73\\xeb\"\n    \"\\xde\\x0f\\xf2\\x44\\x87\\x7e\\xa6\\x0a\\x4c\\xb0\\x43\\x2c\\xe5\\x77\\xc3\\x1b\"\n    \"\\xeb\\x00\\x9c\\x5c\\x2c\\x49\\xaa\\x2e\\x4e\\xad\\xb2\\x17\\xad\\x8c\\xc0\\x9b\";\n  if (memcmp (expected, sum, 64) != 0)\n    {\n      report_failure (cnt, \"block by block\", expected, sum);\n      result = 1;\n    }\n\n  return result;\n}\n\n#else\n\nint\nmain (void)\n{\n  return 77; /* UNSUPPORTED */\n}\n\n#endif\n"
  },
  {
    "path": "test/alg-sm3-hmac.c",
    "content": "/* Copyright (C) 2018, 2024, 2025 Björn Esser besser82@fedoraproject.org\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\n#include \"crypt-port.h\"\n\n#if INCLUDE_sm3_yescrypt\n\n#include \"alg-sm3-hmac.h\"\n\n#include <stdio.h>\n\nstruct testcase\n{\n  const char *subject;\n  const char *t;\n  size_t tlen;\n  const char *k;\n  size_t ksize;\n  const char *match;\n};\n\n/* Test vectors as published in GM/T 0042-2015 Appendix D.3 */\nstatic const struct testcase testcases[] =\n{\n  {\n    \"First test vector for HMAC-SM3 from GM/T 0042-2015 Appendix D.3\",\n    \"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq\"\n    \"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq\",          112,\n    \"\\x01\\x02\\x03\\x04\\x05\\x06\\x07\\x08\\x09\\x0a\\x0b\\x0c\\x0d\\x0e\\x0f\\x10\"\n    \"\\x11\\x12\\x13\\x14\\x15\\x16\\x17\\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f\\x20\",   32,\n    \"\\xca\\x05\\xe1\\x44\\xed\\x05\\xd1\\x85\\x78\\x40\\xd1\\xf3\\x18\\xa4\\xa8\\x66\"\n    \"\\x9e\\x55\\x9f\\xc8\\x39\\x1f\\x41\\x44\\x85\\xbf\\xdf\\x7b\\xb4\\x08\\x96\\x3a\"\n  },\n  {\n    \"Second test vector for HMAC-SM3 from GM/T 0042-2015 Appendix D.3\",\n    \"\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\"\n    \"\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\"\n    \"\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\"\n    \"\\xcd\\xcd\",                                                           50,\n    \"\\x01\\x02\\x03\\x04\\x05\\x06\\x07\\x08\\x09\\x0a\\x0b\\x0c\\x0d\\x0e\\x0f\\x10\"\n    \"\\x11\\x12\\x13\\x14\\x15\\x16\\x17\\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f\\x20\"\n    \"\\x21\\x22\\x23\\x24\\x25\",                                               37,\n    \"\\x22\\x0b\\xf5\\x79\\xde\\xd5\\x55\\x39\\x3f\\x01\\x59\\xf6\\x6c\\x99\\x87\\x78\"\n    \"\\x22\\xa3\\xec\\xf6\\x10\\xd1\\x55\\x21\\x54\\xb4\\x1d\\x44\\xb9\\x4d\\xb3\\xae\"\n  },\n  {\n    \"Third test vector for HMAC-SM3 from GM/T 0042-2015 Appendix D.3\",\n    \"Hi There\",                                                            8,\n    \"\\x0b\\x0b\\x0b\\x0b\\x0b\\x0b\\x0b\\x0b\\x0b\\x0b\\x0b\\x0b\\x0b\\x0b\\x0b\\x0b\"\n    \"\\x0b\\x0b\\x0b\\x0b\\x0b\\x0b\\x0b\\x0b\\x0b\\x0b\\x0b\\x0b\\x0b\\x0b\\x0b\\x0b\",   32,\n    \"\\xc0\\xba\\x18\\xc6\\x8b\\x90\\xc8\\x8b\\xc0\\x7d\\xe7\\x94\\xbf\\xc7\\xd2\\xc8\"\n    \"\\xd1\\x9e\\xc3\\x1e\\xd8\\x77\\x3b\\xc2\\xb3\\x90\\xc9\\x60\\x4e\\x0b\\xe1\\x1e\"\n  },\n  {\n    \"Fourth test vector for HMAC-SM3 from GM/T 0042-2015 Appendix D.3\",\n    \"what do ya want for nothing?\",                                       28,\n    \"Jefe\",                                                                4,\n    \"\\x2e\\x87\\xf1\\xd1\\x68\\x62\\xe6\\xd9\\x64\\xb5\\x0a\\x52\\x00\\xbf\\x2b\\x10\"\n    \"\\xb7\\x64\\xfa\\xa9\\x68\\x0a\\x29\\x6a\\x24\\x05\\xf2\\x4b\\xec\\x39\\xf8\\x82\"\n  },\n  {\n    \"Custom test vector for HMAC-SM3 with key length > 64\",\n    \"What is the purpose of this test???\",                                35,\n    \"\\x49\\x74\\x27\\x73\\x20\\x63\\x6f\\x6d\\x70\\x6c\\x69\\x63\\x61\\x74\\x65\\x64\"\n    \"\\x20\\x74\\x6f\\x20\\x65\\x78\\x70\\x6c\\x61\\x69\\x6e\\x2c\\x20\\x62\\x75\\x74\"\n    \"\\x20\\x77\\x65\\x20\\x6e\\x65\\x65\\x64\\x20\\x73\\x6f\\x6d\\x65\\x20\\x74\\x65\"\n    \"\\x78\\x74\\x20\\x74\\x68\\x61\\x74\\x20\\x63\\x6c\\x65\\x61\\x72\\x6c\\x79\\x20\"\n    \"\\x65\\x78\\x63\\x65\\x65\\x64\\x73\\x20\\x73\\x69\\x78\\x74\\x79\\x66\\x6f\\x75\"\n    \"\\x72\\x20\\x62\\x79\\x74\\x65\\x73\\x20\\x6f\\x66\\x20\\x64\\x61\\x74\\x61\\x20\"\n    \"\\x66\\x6f\\x72\\x20\\x74\\x68\\x65\\x20\\x6b\\x65\\x79\\x20\\x74\\x6f\\x20\\x74\"\n    \"\\x65\\x73\\x74\\x20\\x63\\x6f\\x76\\x65\\x72\\x61\\x67\\x65\\x2e\\x2e\\x2e\\x2e\",  128,\n    \"\\xd3\\xde\\xc8\\x63\\xe3\\x16\\x59\\x62\\x38\\x09\\x0e\\xac\\xe6\\x61\\xe6\\xd3\"\n    \"\\xc4\\xcb\\xae\\x43\\xdc\\xf0\\x06\\x0c\\x71\\xf0\\xe4\\xe5\\xdc\\x5f\\xf7\\xd3\"\n  },\n};\n\n\nstatic void\ndumphex(const void *ptr, size_t size)\n{\n  size_t i;\n\n  for (i = 0; i < size; i++)\n    printf(\"\\\\x%02x\", ((const unsigned char *)ptr)[i]);\n  printf(\"\\n\");\n}\n\nstatic int\ntest_sm3_hmac(const struct testcase *tc)\n{\n  uint8_t digest[32];\n\n  sm3_hmac_buf((const uint8_t *)tc->t, tc->tlen,\n               (const uint8_t *)tc->k, tc->ksize, digest);\n\n  if (memcmp(digest, tc->match, 32))\n    {\n      fprintf(stderr, \"ERROR: %s\\n\", tc->subject);\n      printf(\"   key: \");\n      dumphex(tc->k, tc->ksize);\n      printf(\"   t:   \");\n      dumphex(tc->t, tc->tlen);\n      printf(\"   hmac=\");\n      dumphex(digest, 32);\n      printf(\" expect=\");\n      dumphex(tc->match, 32);\n      return 1;\n    }\n  else\n    fprintf(stderr, \"   ok: %s\\n\", tc->subject);\n\n  return 0;\n}\n\nint\nmain (void)\n{\n  int result = 0;\n\n  for (size_t i = 0; i < ARRAY_SIZE (testcases); i++)\n    result |= test_sm3_hmac(&testcases[i]);\n\n  return result;\n}\n\n#else\n\nint\nmain (void)\n{\n  return 77; /* UNSUPPORTED */\n}\n\n#endif /* INCLUDE_sm3_yescrypt */\n"
  },
  {
    "path": "test/alg-sm3.c",
    "content": "/*\n * Copyright (C) 2024 Tianjia Zhang\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the author nor the names of other contributors\n *    may be used to endorse or promote products derived from this software\n *    without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\n#include \"crypt-port.h\"\n#include \"alg-sm3.h\"\n\n#include <stdio.h>\n\n#if INCLUDE_sm3crypt\n\nstatic const struct\n{\n  const char *input;\n  const char result[33];\n} tests[] =\n{\n  /* Test vectors from OSCCA GM/T 0004-2012: appendix A.  */\n  {\n    \"abc\",\n    \"\\x66\\xc7\\xf0\\xf4\\x62\\xee\\xed\\xd9\\xd1\\xf2\\xd4\\x6b\\xdc\\x10\\xe4\\xe2\"\n    \"\\x41\\x67\\xc4\\x87\\x5c\\xf2\\xf7\\xa2\\x29\\x7d\\xa0\\x2b\\x8f\\x4b\\xa8\\xe0\"\n  },\n  {\n    \"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq\",\n    \"\\x63\\x9b\\x6c\\xc5\\xe6\\x4d\\x9e\\x37\\xa3\\x90\\xb1\\x92\\xdf\\x4f\\xa1\\xea\"\n    \"\\x07\\x20\\xab\\x74\\x7f\\xf6\\x92\\xb9\\xf3\\x8c\\x4e\\x66\\xad\\x7b\\x8c\\x05\"\n  },\n  {\n    \"\",\n    \"\\x1a\\xb2\\x1d\\x83\\x55\\xcf\\xa1\\x7f\\x8E\\x61\\x19\\x48\\x31\\xe8\\x1a\\x8f\"\n    \"\\x22\\xbe\\xc8\\xc7\\x28\\xfe\\xfb\\x74\\x7e\\xd0\\x35\\xeb\\x50\\x82\\xaa\\x2b\"\n  },\n  {\n    \"a\",\n    \"\\x62\\x34\\x76\\xac\\x18\\xf6\\x5a\\x29\\x09\\xe4\\x3c\\x7f\\xec\\x61\\xb4\\x9c\"\n    \"\\x7e\\x76\\x4a\\x91\\xa1\\x8c\\xcb\\x82\\xf1\\x91\\x7a\\x29\\xc8\\x6c\\x5e\\x88\"\n  },\n  {\n    \"message digest\",\n    \"\\xc5\\x22\\xa9\\x42\\xe8\\x9b\\xd8\\x0d\\x97\\xdd\\x66\\x6e\\x7a\\x55\\x31\\xb3\"\n    \"\\x61\\x88\\xc9\\x81\\x71\\x49\\xe9\\xb2\\x58\\xdf\\xe5\\x1e\\xce\\x98\\xed\\x77\"\n  },\n  {\n    \"abcdefghijklmnopqrstuvwxyz\",\n    \"\\xb8\\x0f\\xe9\\x7a\\x4d\\xa2\\x4a\\xfc\\x27\\x75\\x64\\xf6\\x6a\\x35\\x9e\\xf4\"\n    \"\\x40\\x46\\x2a\\xd2\\x8d\\xcc\\x6d\\x63\\xad\\xb2\\x4d\\x5c\\x20\\xa6\\x15\\x95\"\n  },\n  {\n    \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\",\n    \"\\x29\\x71\\xd1\\x0c\\x88\\x42\\xb7\\x0c\\x97\\x9e\\x55\\x06\\x34\\x80\\xc5\\x0b\"\n    \"\\xac\\xff\\xd9\\x0e\\x98\\xe2\\xe6\\x0d\\x25\\x12\\xab\\x8a\\xbf\\xdf\\xce\\xc5\"\n  },\n  {\n    \"123456789012345678901234567890123456789012345678901234567890\"\n    \"12345678901234567890\",\n    \"\\xad\\x81\\x80\\x53\\x21\\xf3\\xe6\\x9d\\x25\\x12\\x35\\xbf\\x88\\x6a\\x56\\x48\"\n    \"\\x44\\x87\\x3b\\x56\\xdd\\x7d\\xde\\x40\\x0f\\x05\\x5b\\x7d\\xde\\x39\\x30\\x7a\"\n  }\n};\n\n\nstatic void\nreport_failure(int n, const char *tag,\n               const char expected[32], uint8_t actual[32])\n{\n  int i;\n  printf (\"FAIL: test %d (%s):\\n  exp:\", n, tag);\n  for (i = 0; i < 32; i++)\n    {\n      if (i % 4 == 0)\n        putchar (' ');\n      printf (\"%02x\", (unsigned int)(unsigned char)expected[i]);\n    }\n  printf (\"\\n  got:\");\n  for (i = 0; i < 32; i++)\n    {\n      if (i % 4 == 0)\n        putchar (' ');\n      printf (\"%02x\", (unsigned int)(unsigned char)actual[i]);\n    }\n  putchar ('\\n');\n  putchar ('\\n');\n}\n\nint\nmain (void)\n{\n  sm3_ctx ctx;\n  uint8_t sum[32];\n  int result = 0;\n  int cnt;\n  int i;\n\n  for (cnt = 0; cnt < (int) ARRAY_SIZE (tests); ++cnt)\n    {\n      sm3_buf (tests[cnt].input, strlen (tests[cnt].input), sum);\n      if (memcmp (tests[cnt].result, sum, 32) != 0)\n        {\n          report_failure (cnt, \"all at once\", tests[cnt].result, sum);\n          result = 1;\n        }\n\n      sm3_init (&ctx);\n      for (i = 0; tests[cnt].input[i] != '\\0'; ++i)\n        sm3_update (&ctx, &tests[cnt].input[i], 1);\n      sm3_final (sum, &ctx);\n      if (memcmp (tests[cnt].result, sum, 32) != 0)\n        {\n          report_failure (cnt, \"byte by byte\", tests[cnt].result, sum);\n          result = 1;\n        }\n    }\n\n  /* Test vector from FIPS 180-2: appendix B.3.  */\n  char buf[1000];\n  memset (buf, 'a', sizeof (buf));\n  sm3_init (&ctx);\n  for (i = 0; i < 1000; ++i)\n    sm3_update (&ctx, buf, sizeof (buf));\n  sm3_final (sum, &ctx);\n  static const char expected[33] =\n    \"\\xc8\\xaa\\xf8\\x94\\x29\\x55\\x40\\x29\\xe2\\x31\\x94\\x1a\\x2a\\xcc\\x0a\\xd6\"\n    \"\\x1f\\xf2\\xa5\\xac\\xd8\\xfa\\xdd\\x25\\x84\\x7a\\x3a\\x73\\x2b\\x3b\\x02\\xc3\";\n\n  if (memcmp (expected, sum, 32) != 0)\n    {\n      report_failure (cnt, \"block by block\", expected, sum);\n      result = 1;\n    }\n\n  return result;\n}\n\n#else\n\nint\nmain (void)\n{\n  return 77; /* UNSUPPORTED */\n}\n\n#endif\n"
  },
  {
    "path": "test/alg-yescrypt.c",
    "content": "/*-\n * Copyright 2013-2018 Alexander Peslyak\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\n#include \"crypt-port.h\"\n\n#if INCLUDE_yescrypt || INCLUDE_scrypt || INCLUDE_gost_yescrypt || \\\n    INCLUDE_sm3_yescrypt\n\n#pragma GCC diagnostic ignored \"-Wconversion\"\n#pragma GCC diagnostic ignored \"-Wsign-conversion\"\n#pragma GCC diagnostic ignored \"-Wcast-qual\"\n\n#include <stdio.h>\n#include <string.h>\n\n#define YESCRYPT_FLAGS YESCRYPT_DEFAULTS\n#if 1\n#define YESCRYPT_P 11\n#define YESCRYPT_PROM 8\n#else\n#define YESCRYPT_P 1\n#define YESCRYPT_PROM 1\n#endif\n\n#undef  TEST_PBKDF2_SHA256\n#define TEST_SCRYPT\n#define TEST_YESCRYPT_KDF\n#define TEST_YESCRYPT_ENCODING\n#define TEST_ROM\n#define TEST_ROM_PREALLOC\n\nstatic int retval = 0;\n\n#ifdef TEST_ROM_PREALLOC\n#include <stdlib.h> /* for malloc() */\n#endif\n\n#ifdef TEST_PBKDF2_SHA256\n#include <assert.h>\n\n#include \"alg-sha256.h\"\n\nstatic void print_PBKDF2_SHA256_raw(const char *passwd, size_t passwdlen,\n    const char *salt, size_t saltlen, uint64_t c, size_t dkLen)\n{\n\tuint8_t dk[64];\n\tsize_t i;\n\n\tassert(dkLen <= sizeof(dk));\n\n\t/* XXX This prints the strings truncated at first NUL */\n\tprintf(\"PBKDF2_SHA256(\\\"%s\\\", \\\"%s\\\", %llu, %llu) =\",\n\t    passwd, salt, (unsigned long long)c, (unsigned long long)dkLen);\n\n\tPBKDF2_SHA256((const uint8_t *) passwd, passwdlen,\n\t    (const uint8_t *) salt, saltlen, c, dk, dkLen);\n\n\tfor (i = 0; i < dkLen; i++)\n\t\tprintf(\" %02x\", dk[i]);\n\tputs(\"\");\n}\n\nstatic void print_PBKDF2_SHA256(const char *passwd,\n    const char *salt, uint64_t c, size_t dkLen)\n{\n\tprint_PBKDF2_SHA256_raw(passwd, strlen(passwd), salt, strlen(salt), c,\n\t    dkLen);\n}\n#endif\n\n#if defined(TEST_SCRYPT) || defined(TEST_YESCRYPT_ENCODING)\n#include \"alg-yescrypt.h\"\n#endif\n\n#ifdef TEST_SCRYPT\nstatic void print_scrypt(const char *passwd, const char *salt,\n    uint64_t N, uint32_t r, uint32_t p)\n{\n\tuint8_t dk[64];\n\tsize_t i;\n\n\tprintf(\"scrypt(\\\"%s\\\", \\\"%s\\\", %llu, %u, %u) =\",\n\t    passwd, salt, (unsigned long long)N, r, p);\n\n\tif (crypto_scrypt((const uint8_t *) passwd, strlen(passwd),\n\t    (const uint8_t *) salt, strlen(salt), N, r, p, dk, sizeof(dk))) {\n\t\tputs(\" FAILED\");\n\t\tretval = 1;\n\t\treturn;\n\t}\n\n\tfor (i = 0; i < sizeof(dk); i++)\n\t\tprintf(\" %02x\", dk[i]);\n\tputs(\"\");\n}\n#endif\n\n#ifdef TEST_YESCRYPT_KDF\nstatic void print_yescrypt(const char *passwd, const char *salt,\n    yescrypt_flags_t flags,\n    uint64_t N, uint32_t r, uint32_t p, uint32_t t, uint32_t g,\n    uint32_t dklen)\n{\n\tyescrypt_local_t local;\n\tyescrypt_params_t params = {flags, N, r, p, t, g, 0};\n\tuint8_t dk[64];\n\tuint32_t i;\n\n#if 1\n\t/* Don't test hash upgrades */\n\tif (g)\n\t\treturn;\n#endif\n\n\tif (dklen > sizeof(dk) || yescrypt_init_local(&local)) {\n\t\tputs(\"FAILED\");\n\t\tretval = 1;\n\t\treturn;\n\t}\n\n\tprintf(\"yescrypt(\\\"%s\\\", \\\"%s\\\", %u, %llu, %u, %u, %u, %u) =\",\n\t    passwd, salt, flags, (unsigned long long)N, r, p, t, g);\n\n\tif (yescrypt_kdf(NULL, &local,\n\t    (const uint8_t *) passwd, strlen(passwd),\n\t    (const uint8_t *) salt, strlen(salt), &params, dk, dklen)) {\n\t\tyescrypt_free_local(&local);\n\t\tputs(\" FAILED\");\n\t\tretval = 1;\n\t\treturn;\n\t}\n\n\tyescrypt_free_local(&local);\n\n\tfor (i = 0; i < dklen; i++)\n\t\tprintf(\" %02x\", dk[i]);\n\tputs(\"\");\n}\n#endif\n\nint main(void)\n{\n\tint i;\n\n\tsetvbuf(stdout, NULL, _IOLBF, 0);\n\n#ifdef TEST_PBKDF2_SHA256\n\tprint_PBKDF2_SHA256(\"password\", \"salt\", 1, 20);\n\tprint_PBKDF2_SHA256(\"password\", \"salt\", 2, 20);\n\tprint_PBKDF2_SHA256(\"password\", \"salt\", 4096, 20);\n\tprint_PBKDF2_SHA256(\"password\", \"salt\", 16777216, 20);\n\tprint_PBKDF2_SHA256(\"passwordPASSWORDpassword\",\n\t    \"saltSALTsaltSALTsaltSALTsaltSALTsalt\", 4096, 25);\n\tprint_PBKDF2_SHA256_raw(\"pass\\0word\", 9, \"sa\\0lt\", 5, 4096, 16);\n#if 0\n\tprint_PBKDF2_SHA256(\"password\", \"salt\", 1, 32);\n\tprint_PBKDF2_SHA256(\"password\", \"salt\", 2, 32);\n\tprint_PBKDF2_SHA256(\"password\", \"salt\", 4096, 32);\n\tprint_PBKDF2_SHA256(\"password\", \"salt\", 16777216, 32);\n\tprint_PBKDF2_SHA256(\"passwordPASSWORDpassword\",\n\t    \"saltSALTsaltSALTsaltSALTsaltSALTsalt\", 4096, 40);\n\tprint_PBKDF2_SHA256(\"password\", \"salt\", 4096, 16);\n\tprint_PBKDF2_SHA256(\"password\", \"salt\", 1, 20);\n\tprint_PBKDF2_SHA256(\"password\", \"salt\", 2, 20);\n\tprint_PBKDF2_SHA256(\"password\", \"salt\", 4096, 20);\n\tprint_PBKDF2_SHA256(\"password\", \"salt\", 16777216, 20);\n\tprint_PBKDF2_SHA256(\"password\", \"salt\", 4096, 25);\n\tprint_PBKDF2_SHA256(\"password\", \"salt\", 4096, 16);\n#endif\n#endif\n\n#ifdef TEST_SCRYPT\n\tprint_scrypt(\"\", \"\", 16, 1, 1);\n\tprint_scrypt(\"password\", \"NaCl\", 1024, 8, 16);\n\tprint_scrypt(\"pleaseletmein\", \"SodiumChloride\", 16384, 8, 1);\n\tprint_scrypt(\"pleaseletmein\", \"SodiumChloride\", 1048576, 8, 1);\n#endif\n\n#ifdef TEST_YESCRYPT_KDF\n\tprint_yescrypt(\"\", \"\", 0, 16, 1, 1, 0, 0, 64);\n\tprint_yescrypt(\"\", \"\", 0, 16, 1, 1, 0, 0, 8);\n\tprint_yescrypt(\"\", \"\", 0, 4, 1, 1, 0, 0, 64);\n\tprint_yescrypt(\"\", \"\", YESCRYPT_WORM, 4, 1, 1, 0, 0, 64);\n\tprint_yescrypt(\"\", \"\", YESCRYPT_WORM, 4, 1, 1, 0, 0, 8);\n\tprint_yescrypt(\"\", \"\", YESCRYPT_WORM, 4, 1, 1, 1, 0, 64);\n\tprint_yescrypt(\"\", \"\", YESCRYPT_WORM, 4, 1, 1, 2, 0, 64);\n\tprint_yescrypt(\"\", \"\", YESCRYPT_WORM, 4, 1, 1, 3, 0, 64);\n\tprint_yescrypt(\"\", \"\", YESCRYPT_WORM, 4, 1, 1, 3, 0, 33);\n\tprint_yescrypt(\"\", \"\", YESCRYPT_WORM, 4, 1, 1, 3, 0, 32);\n\tprint_yescrypt(\"\", \"\", YESCRYPT_WORM, 4, 1, 1, 3, 0, 31);\n\tprint_yescrypt(\"\", \"\", YESCRYPT_WORM, 4, 1, 1, 3, 0, 1);\n\tprint_yescrypt(\"\", \"\", YESCRYPT_DEFAULTS, 4, 1, 1, 0, 0, 64);\n\tprint_yescrypt(\"\", \"\", YESCRYPT_DEFAULTS, 4, 1, 1, 0, 0, 4);\n\tprint_yescrypt(\"\", \"\", YESCRYPT_DEFAULTS, 4, 1, 1, 1, 0, 64);\n\tprint_yescrypt(\"\", \"\", YESCRYPT_DEFAULTS, 4, 1, 1, 1, 0, 33);\n\tprint_yescrypt(\"\", \"\", YESCRYPT_DEFAULTS, 4, 1, 1, 1, 0, 32);\n\tprint_yescrypt(\"\", \"\", YESCRYPT_DEFAULTS, 4, 1, 1, 1, 0, 31);\n\tprint_yescrypt(\"\", \"\", YESCRYPT_DEFAULTS, 4, 1, 1, 1, 0, 1);\n\tfor (i = 0; i <= 6; i++)\n\t\tprint_yescrypt(\"p\", \"s\", YESCRYPT_DEFAULTS, 16, 8, 1, i + 10, i, 40);\n\tfor (i = 0; i <= 6; i++)\n\t\tprint_yescrypt(\"p\", \"s\", YESCRYPT_WORM, 16, 8, 1, i + 10, i, 40);\n\tfor (i = 0; i <= 6; i++)\n\t\tprint_yescrypt(\"p\", \"s\", YESCRYPT_DEFAULTS, 16, 8, 1, 0, i, 40);\n\tfor (i = 0; i <= 6; i++)\n\t\tprint_yescrypt(\"p\", \"s\", YESCRYPT_WORM, 16, 8, 1, 0, i, 40);\n\tfor (i = 0; i <= 2; i++)\n\t\tprint_yescrypt(\"p\", \"s\", YESCRYPT_DEFAULTS, 16, 8, 1, 0, i, 32);\n\tfor (i = 0; i <= 2; i++)\n\t\tprint_yescrypt(\"p\", \"s\", YESCRYPT_DEFAULTS, 16, 8, 1, 0, i, 8);\n#endif\n\n#ifdef TEST_YESCRYPT_ENCODING\n\t{\n\t\tuint8_t *setting;\n\t\tyescrypt_binary_t key = {.uc={\n\t\t    1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,\n\t\t    17,18,19,20,21,22,23,24,25,26,27,28,255,128,64,32}};\n\n\t\tfor (i = 0; i < 18; i++) {\n\t\t\tuint32_t N_log2 = (i < 14) ? (16 - i) : 2;\n\t\t\tuint32_t r = (i < 8) ? (8 - i) : (1 + (i & 1));\n\t\t\tuint32_t p = (i & 1) ? 1 : YESCRYPT_P;\n\t\t\tyescrypt_flags_t flags = YESCRYPT_DEFAULTS;\n\t\t\tif ((int)p - (i / 2) > 1)\n\t\t\t\tp -= i / 2;\n\t\t\tif (i & 2) {\n\t\t\t\tflags = YESCRYPT_WORM;\n\t\t\t} else {\n\t\t\t\twhile ((1ULL << N_log2) / p <= 3)\n\t\t\t\t\tN_log2++;\n\t\t\t}\n\t\t\tyescrypt_params_t params =\n\t\t\t    {flags, (uint64_t)1 << N_log2, r, p, 0, 0, 0};\n\t\t\tsetting = yescrypt_encode_params(&params,\n\t\t\t    (const uint8_t *)\"WZaPV7LSUEKMo34.\", 16 - (i & 15));\n\t\t\tif (setting && i == 0)\n\t\t\t\tprintf(\"'%s'\\n\", (char *)setting);\n\t\t\tif (!setting) {\n\t\t\t\tprintf(\"%d yescrypt_encode_params() = NULL\\n\", i);\n\t\t\t\tretval = 1;\n\t\t\t}\n\t\t\tif (setting) {\n\t\t\t\tuint8_t *hash = yescrypt(\n\t\t\t\t    (const uint8_t *)\"pleaseletmein\", setting);\n\t\t\t\tprintf(\"Plaintext: '%s'\\n\", (char *)hash);\n\t\t\t\thash = (uint8_t *)strdup((char *)hash);\n\t\t\t\tif (!hash || strcmp(\n\t\t\t\t    (char *)hash, (char *)yescrypt(\n\t\t\t\t    (const uint8_t *)\"pleaseletmein\", hash))) {\n\t\t\t\t\tputs(\"Validation FAILED\");\n\t\t\t\t\tretval = 1;\n\t\t\t\t}\n\t\t\t\tuint8_t *orig = (uint8_t *)strdup((char *)hash);\n\t\t\t\tif (!yescrypt_reencrypt(hash, NULL, &key)) {\n\t\t\t\t\tprintf(\"%d yescrypt_reencrypt() = NULL\\n\", i);\n\t\t\t\t\tretval = 1;\n\t\t\t\t}\n\t\t\t\tprintf(\"Encrypted: '%s'\\n\", (char *)hash);\n\t\t\t\tyescrypt_local_t local;\n\t\t\t\tif (yescrypt_init_local(&local)) {\n\t\t\t\t\tputs(\"yescrypt_init_local() FAILED\");\n\t\t\t\t\tretval = 1;\n\t\t\t\t}\n\t\t\t\tuint8_t buf[128];\n\t\t\t\tif (strcmp((char *)hash, (char *)yescrypt_r(\n\t\t\t\t    NULL, &local,\n\t\t\t\t    (const uint8_t *)\"pleaseletmein\", 13,\n\t\t\t\t    hash, &key, buf, sizeof(buf)))) {\n\t\t\t\t\tputs(\"Validation of encrypted FAILED\");\n\t\t\t\t\tretval = 1;\n\t\t\t\t}\n\t\t\t\tif (!strcmp((char *)hash, (char *)yescrypt_r(\n\t\t\t\t    NULL, &local,\n\t\t\t\t    (const uint8_t *)\"pleaseletmein\", 13,\n\t\t\t\t    hash, NULL, buf, sizeof(buf)))) {\n\t\t\t\t\tputs(\"Validation of encrypted \"\n\t\t\t\t\t\"unexpectedly succeeded\");\n\t\t\t\t\tretval = 1;\n\t\t\t\t}\n\t\t\t\tif (!strcmp((char *)orig, (char *)yescrypt_r(\n\t\t\t\t    NULL, &local,\n\t\t\t\t    (const uint8_t *)\"pleaseletmein\", 13,\n\t\t\t\t    orig, &key, buf, sizeof(buf)))) {\n\t\t\t\t\tputs(\"Validation of unencrypted \"\n\t\t\t\t\t\"unexpectedly succeeded\");\n\t\t\t\t\tretval = 1;\n\t\t\t\t}\n\t\t\t\tyescrypt_free_local(&local);\n\t\t\t\tif (!yescrypt_reencrypt(hash, &key, NULL)) {\n\t\t\t\t\tprintf(\"%d yescrypt_reencrypt() = NULL\\n\", i);\n\t\t\t\t\tretval = 1;\n\t\t\t\t}\n\t\t\t\tif (strcmp((char *)hash, (char *)orig)) {\n\t\t\t\t\tputs(\"Decryption FAILED\");\n\t\t\t\t\tretval = 1;\n\t\t\t\t}\n\t\t\t\tfree(orig);\n\t\t\t\tfree(hash);\n\t\t\t}\n\t\t}\n\n\t\tprintf(\"'%s'\\n\", (char *)yescrypt(\n\t\t    (const uint8_t *)\"pleaseletmein\",\n\t\t    (const uint8_t *)\"$7$C6..../....SodiumChloride\"));\n\n\t\tprintf(\"'%s'\\n\", (char *)yescrypt(\n\t\t    (const uint8_t *)\"pleaseletmein\",\n\t\t    (const uint8_t *)\"$7$06..../....SodiumChloride\"));\n\n#ifdef TEST_ROM\n\t\tuint64_t rom_bytes = 256 * (1024ULL*1024);\n\t\tuint64_t ram_bytes = 2 * (1024ULL*1024);\n\t\tuint32_t r;\n\t\tuint64_t NROM_log2, N_log2;\n\t\tyescrypt_shared_t shared;\n\t\tyescrypt_local_t local;\n\n\t\tNROM_log2 = 0;\n\t\twhile (((rom_bytes >> NROM_log2) & 0xff) == 0)\n\t\t\tNROM_log2++;\n\t\tr = rom_bytes >> (7 + NROM_log2);\n\t\twhile (r < 5 && NROM_log2 > 0) {\n\t\t\tr <<= 1;\n\t\t\tNROM_log2--;\n\t\t}\n\t\trom_bytes = (uint64_t)r << (7 + NROM_log2);\n\n\t\tN_log2 = 0;\n\t\twhile (((uint64_t)r << (7 + N_log2)) < ram_bytes)\n\t\t\tN_log2++;\n\t\tram_bytes = (uint64_t)r << (7 + N_log2);\n\n\t\tprintf(\"r=%u N=2^%u NROM=2^%u\\n\", r,\n\t\t    (unsigned int)N_log2, (unsigned int)NROM_log2);\n\n\t\tprintf(\"Will use %.2f KiB ROM\\n\", rom_bytes / 1024.0);\n\t\tprintf(\"         %.2f KiB RAM\\n\", ram_bytes / 1024.0);\n\n\t\tprintf(\"Initializing ROM ...\");\n\t\tfflush(stdout);\n\t\tyescrypt_params_t rom_params = { YESCRYPT_DEFAULTS,\n\t\t    0, r, YESCRYPT_PROM, 0, 0, (uint64_t)1 << NROM_log2 };\n\t\tif (yescrypt_init_shared(&shared,\n\t\t    (uint8_t *)\"local param\", 12, &rom_params)) {\n\t\t\tputs(\" FAILED\");\n\t\t\tretval = 1;\n\t\t}\n\t\tyescrypt_binary_t *digest = yescrypt_digest_shared(&shared);\n\t\tprintf(\" DONE (%02x%02x%02x%02x)\\n\",\n\t\t    digest->uc[0], digest->uc[1], digest->uc[2], digest->uc[3]);\n\n\t\tif (yescrypt_init_local(&local)) {\n\t\t\tputs(\"FAILED\");\n\t\t\tretval = 1;\n\t\t}\n\n\t\tyescrypt_params_t params = rom_params;\n\t\tparams.flags = YESCRYPT_FLAGS;\n\t\tparams.N = (uint64_t)1 << N_log2;\n\t\tparams.p = YESCRYPT_P;\n\t\tsetting = yescrypt_encode_params(&params,\n\t\t    (const uint8_t *)\"WZaPV7LSUEKMo34.\", 16);\n\t\tprintf(\"'%s'\\n\", (char *)setting);\n\n\t\tuint8_t hash[128];\n\n\t\tprintf(\"'%s'\\n\", (char *)yescrypt_r(&shared, &local,\n\t\t    (const uint8_t *)\"pleaseletmein\", 13, setting, NULL,\n\t\t    hash, sizeof(hash)));\n\n#ifdef TEST_ROM_PREALLOC\n\t\tyescrypt_free_shared(&shared);\n\n\t\tshared.aligned_size = ((uint64_t)1 << NROM_log2) * 128 * r;\n\t\tshared.base_size = shared.aligned_size + 63;\n\t\tuint8_t *where = shared.base = malloc(shared.base_size);\n\t\twhere += 63;\n\t\twhere = shared.aligned = where - ((uintptr_t)where & 63);\n\n\t\tprintf(\"Initializing ROM in preallocated memory ...\");\n\t\tfflush(stdout);\n\t\trom_params.flags |= YESCRYPT_SHARED_PREALLOCATED;\n\t\tif (yescrypt_init_shared(&shared,\n\t\t    (uint8_t *)\"local param\", 12, &rom_params)) {\n\t\t\tputs(\" FAILED\");\n\t\t\tretval = 1;\n\t\t}\n\t\tdigest = yescrypt_digest_shared(&shared);\n\t\tprintf(\" DONE (%02x%02x%02x%02x)\\n\",\n\t\t    digest->uc[0], digest->uc[1], digest->uc[2], digest->uc[3]);\n\n\t\tif ((void *)where != shared.aligned) {\n\t\t\tputs(\"YESCRYPT_SHARED_PREALLOCATED failed\");\n\t\t\tretval = 1;\n\t\t}\n\n#endif\n\n\t\tprintf(\"'%s'\\n\", (char *)yescrypt_r(&shared, &local,\n\t\t    (const uint8_t *)\"pleaseletmein\", 13, setting, NULL,\n\t\t    hash, sizeof(hash)));\n\n\t\tprintf(\"'%s'\\n\", (char *)yescrypt_r(&shared, &local,\n\t\t    (const uint8_t *)\"pleaseletmeIn\", 13, setting, NULL,\n\t\t    hash, sizeof(hash)));\n\n\t\tsetting = yescrypt_encode_params(&params,\n\t\t    (const uint8_t *)\"WZaPV7LSUEIMo34.\", 16);\n\n\t\tprintf(\"'%s'\\n\", (char *)yescrypt_r(&shared, &local,\n\t\t    (const uint8_t *)\"pleaseletmein\", 13, setting, NULL,\n\t\t    hash, sizeof(hash)));\n\n\t\tprintf(\"'%s'\\n\", (char *)yescrypt_r(&shared, &local,\n\t\t    (const uint8_t *)\"pleaseletmeIn\", 13, setting, NULL,\n\t\t    hash, sizeof(hash)));\n\n\t\tparams.N = 4;\n\t\tparams.NROM *= params.r;\n\t\tparams.r = 1;\n\t\tparams.p = 1;\n\t\tsetting = yescrypt_encode_params(&params,\n\t\t    (const uint8_t *)\"WZaPV7LSUEKMo34.\", 16);\n\n\t\tprintf(\"'%s'\\n\", (char *)yescrypt_r(&shared, &local,\n\t\t    (const uint8_t *)\"pleaseletmein\", 13, setting, NULL,\n\t\t    hash, sizeof(hash)));\n\n\t\tfree(shared.base); /* has been malloc'ed */\n\t\tshared.base = NULL;\n\t\tyescrypt_free_shared(&shared);\n#endif\n\t}\n#endif\n\n\treturn retval;\n}\n\n#else\n\nint\nmain (void)\n{\n\treturn 77; /* UNSUPPORTED */\n}\n\n#endif /* INCLUDE_yescrypt || INCLUDE_scrypt || INCLUDE_gost_yescrypt ||\n          INCLUDE_sm3_yescrypt */\n"
  },
  {
    "path": "test/badsalt.c",
    "content": "/* Test rejection of ill-formed password hashes.\n   Copyright (C) 2012-2018 Free Software Foundation, Inc.\n   This file is part of the GNU C Library.\n\n   The GNU C Library is free software; you can redistribute it and/or\n   modify it under the terms of the GNU Lesser General Public\n   License as published by the Free Software Foundation; either\n   version 2.1 of the License, or (at your option) any later version.\n\n   The GNU C Library is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n   Lesser General Public License for more details.\n\n   You should have received a copy of the GNU Lesser General Public\n   License along with the GNU C Library; if not, see\n   <http://www.gnu.org/licenses/>.  */\n\n#include \"crypt-port.h\"\n#undef yescrypt\n\n#include <errno.h>\n#include <setjmp.h>\n#include <stdio.h>\n#include <string.h>\n#include <signal.h>\n#include <sys/mman.h>\n\n/* If VERBOSE is true, passing testcases will be printed out as well\n   as failing ones.  */\nstatic bool verbose = false;\n\n/* All hashes are hashes of this passphrase, an infamous error message\n   used for some forgotten can't-happen condition in Unix V6; see\n   <https://wiki.tuhs.org/doku.php?id=anecdotes:values_of_beta>.  */\nstatic const char phrase[] = \"values of β will give rise to dom!\";\n\n/* Correct setting strings, from which we derive incorrect ones by\n   replacing one character at a time with a character that cannot\n   appear in a valid passphrase (namely ':') and/or truncating the\n   string.  */\nstruct valid_setting;\n\n/* Type of functions to use in is_valid_trunc.  */\ntypedef bool (*valid_trunc_p)(const struct valid_setting *original,\n                              const char *truncated);\n\nstruct valid_setting\n{\n  /* Human-readable name for this test */\n  const char *tag;\n\n  /* The setting string */\n  const char *setting;\n\n  /* Length of the actual setting, within the setting string.  This is\n     usually equal to strlen(setting), but a couple of the strings are\n     padded on the right for hash-specific reasons.  */\n  size_t setting_len;\n\n  /* Given a truncation of a valid setting string, decide whether the\n   truncation is also valid.  */\n  valid_trunc_p is_valid_trunc;\n\n  /* Numeric parameter for is_valid_trunc; usually the length of a\n     subfield of the setting.  */\n  uint16_t is_valid_trunc_param;\n\n  /* Whether support for this hash was compiled into the library.  */\n  bool enabled;\n\n};\n\n/* is_valid_trunc functions -- forward declarations */\n\nstatic bool vt_never(const struct valid_setting *, const char *);\nstatic bool vt_varsuffix(const struct valid_setting *, const char *);\nstatic bool vt_sunmd5(const struct valid_setting *, const char *);\nstatic bool vt_sm3(const struct valid_setting *, const char *);\nstatic bool vt_sha2gnu(const struct valid_setting *, const char *);\nstatic bool vt_yescrypt(const struct valid_setting *, const char *);\n\n/* shorthands for use in valid_cases */\n\n#define V_(  hash,      setting, vt, vp) \\\n  { #hash,               setting, sizeof setting - 1, vt, vp, INCLUDE_##hash }\n#define Vp_( hash,      setting, vt, vp) \\\n  { #hash,               setting, vp,                 vt, vp, INCLUDE_##hash }\n#define Vt_( hash, tag, setting, vt, vp) \\\n  { #hash \" (\" #tag \")\", setting, sizeof setting - 1, vt, vp, INCLUDE_##hash }\n#define Vtp_(hash, tag, setting, vt, vp) \\\n  { #hash \" (\" #tag \")\", setting, vp,                 vt, vp, INCLUDE_##hash }\n\n#define V(  hash,          setting) V_(  hash,      setting, vt_never,     0)\n#define Vn( hash,      vt, setting) V_(  hash,      setting, vt_##vt,      0)\n#define Vp( hash,      sl, setting) Vp_( hash,      setting, vt_varsuffix, sl)\n#define Vv( hash,      sl, setting) V_(  hash,      setting, vt_varsuffix, sl)\n#define Vt( hash, tag,     setting) Vt_( hash, tag, setting, vt_never,     0)\n#define Vtn(hash, tag, vt, setting) Vt_( hash, tag, setting, vt_##vt,      0)\n#define Vtp(hash, tag, sl, setting) Vtp_(hash, tag, setting, vt_varsuffix, sl)\n#define Vtv(hash, tag, sl, setting) Vt_( hash, tag, setting, vt_varsuffix, sl)\n\n/* Each of these is a valid setting string for some algorithm,\n   from which we will derive many invalid setting strings.\n   This is an expensive test, so where possible, the number of\n   \"rounds\" of the hash function has been set abnormally low.  */\nstatic const struct valid_setting valid_cases[] =\n{\n  V  (descrypt,                            \"Mp\"                               ),\n  /* bigcrypt is extra special:\n     this salt is a valid descrypt salt when bigcrypt isn't enabled\n       but descrypt is;\n     truncations down to 2 are valid when descrypt is enabled, but\n       if *only* bigcrypt is enabled, then truncations can only\n       go down to 14.  */\n  {\n    INCLUDE_bigcrypt ? \"bigcrypt\" : \"descrypt (padded)\",\n    \"Mp............\", 2, vt_varsuffix,\n    INCLUDE_descrypt ? 2 : 14,\n    INCLUDE_descrypt || INCLUDE_bigcrypt\n  },\n  V  (bsdicrypt,                           \"_J9..MJHn\"                          ),\n  Vv (md5crypt,                  3,        \"$1$MJHnaAke$\"                       ),\n  Vtn(sunmd5,        plain,      sunmd5,   \"$md5$1xMeE.at$\"                     ),\n  Vtn(sunmd5,        rounds,     sunmd5,   \"$md5,rounds=123$1xMeE.at$\"          ),\n  Vt (nt,            plain,                \"$3$\"                                ),\n  Vtp(nt,            fake salt,  3,        \"$3$__not_used__c809a450df09a3\"      ),\n  Vv (sha1crypt,                 11,       \"$sha1$123$GGXpNqoJvglVTkGU$\"        ),\n  Vtn(sha256crypt,   plain,      sha2gnu,  \"$5$MJHnaAkegEVYHsFK$\"               ),\n  Vtn(sha256crypt,   rounds,     sha2gnu,  \"$5$rounds=1000$MJHnaAkegEVYHsFK$\"   ),\n  Vtn(sha512crypt,   plain,      sha2gnu,  \"$6$MJHnaAkegEVYHsFK$\"               ),\n  Vtn(sha512crypt,   rounds,     sha2gnu,  \"$6$rounds=1000$MJHnaAkegEVYHsFK$\"   ),\n  Vtn(sm3crypt,      plain,      sm3,      \"$sm3$MJHnaAkegEVYHsFK$\"             ),\n  Vtn(sm3crypt,      rounds,     sm3,      \"$sm3$rounds=1000$MJHnaAkegEVYHsFK$\" ),\n  V  (bcrypt,                              \"$2b$04$UBVLHeMpJ/QQCv3XqJx8zO\"      ),\n  V  (bcrypt_a,                            \"$2a$04$UBVLHeMpJ/QQCv3XqJx8zO\"      ),\n  V  (bcrypt_x,                            \"$2x$04$UBVLHeMpJ/QQCv3XqJx8zO\"      ),\n  V  (bcrypt_y,                            \"$2y$04$UBVLHeMpJ/QQCv3XqJx8zO\"      ),\n  Vv (scrypt,                    14,       \"$7$C6..../....SodiumChloride$\"      ),\n  Vn (yescrypt,                  yescrypt, \"$y$j9T$PKXc3hCOSyMqdaEQArI62/$\"     ),\n  Vn (gost_yescrypt,             yescrypt, \"$gy$j9T$PKXc3hCOSyMqdaEQArI62/$\"    ),\n  Vn (sm3_yescrypt,              yescrypt, \"$sm3y$j9T$PKXc3hCOSyMqdaEQArI62/$\"  ),\n};\n\n#undef V_\n#undef Vp_\n#undef Vt_\n#undef Vtp_\n\n#undef V\n#undef Vn\n#undef Vp\n#undef Vv\n#undef Vt\n#undef Vtn\n#undef Vtp\n#undef Vtv\n\n/* Additional tests of manually constructed, invalid setting\n   strings.  */\nstruct invalid_setting\n{\n  const char *tag;\n  const char *setting;\n};\nstatic const struct invalid_setting invalid_cases[] =\n{\n  /* These strings are invalid regardless of the algorithm.  */\n  { \"too short 1\",                 \"/\"                                        },\n  { \"too short 2\",                 \"M\"                                        },\n  { \"too short 3\",                 \"$\"                                        },\n  { \"too short 4\",                 \"_\"                                        },\n  { \"too short 5\",                 \".\"                                        },\n  { \"invalid char :\",              \":\"                                        },\n  { \"invalid char ;\",              \";\"                                        },\n  { \"invalid char *\",              \"*\"                                        },\n  { \"invalid char !\",              \"!\"                                        },\n  { \"invalid char \\\\\",             \"\\\\\"                                       },\n  { \"invalid char SPC\",            \" \"                                        },\n  { \"invalid char TAB\",            \"\\t\"                                       },\n  { \"invalid char ^M\",             \"\\r\"                                       },\n  { \"invalid char ^J\",             \"\\n\"                                       },\n  { \"invalid char ^L\",             \"\\f\"                                       },\n  { \"invalid char ^A\",             \"\\001\"                                     },\n  { \"invalid char DEL\",            \"\\177\"                                     },\n  { \"failure token 1\",             \"*0\"                                       },\n  { \"failure token 2\",             \"*1\"                                       },\n  { \"unsupported algorithm\",       \"$un$upp0rt3d$\"                            },\n  { \"empty string\",                \"\"                                         },\n\n  /* These strings are invalid for specific algorithms, in ways\n     that the generic error generator cannot produce.  */\n  { \"sunmd5 absent rounds\",        \"$md5,rounds=$1xMeE.at$\"                   },\n  { \"sunmd5 low rounds\",           \"$md5,rounds=0$1xMeE.at$\"                  },\n  { \"sunmd5 octal rounds\",         \"$md5,rounds=012$1xMeE.at$\"                },\n  { \"sunmd5 high rounds\",          \"$md5,rounds=4294967296$1xMeE.at$\"         },\n  { \"sha256 absent rounds\",        \"$5$rounds=$MJHnaAkegEVYHsFK$\"             },\n  { \"sha256 low rounds\",           \"$5$rounds=0$MJHnaAkegEVYHsFK$\"            },\n  { \"sha256 octal rounds\",         \"$5$rounds=0100$MJHnaAkegEVYHsFK$\"         },\n  { \"sha256 high rounds\",          \"$5$rounds=4294967295$MJHnaAkegEVYHsFK$\"   },\n  { \"sha512 absent rounds\",        \"$6$rounds=$MJHnaAkegEVYHsFK$\"             },\n  { \"sha512 low rounds\",           \"$6$rounds=0$MJHnaAkegEVYHsFK$\"            },\n  { \"sha512 octal rounds\",         \"$6$rounds=0100$MJHnaAkegEVYHsFK$\"         },\n  { \"sha512 high rounds\",          \"$6$rounds=4294967295$MJHnaAkegEVYHsFK$\"   },\n  { \"sm3 absent rounds\",           \"$sm3$rounds=$MJHnaAkegEVYHsFK$\"           },\n  { \"sm3 low rounds\",              \"$sm3$rounds=0$MJHnaAkegEVYHsFK$\"          },\n  { \"sm3 octal rounds\",            \"$sm3$rounds=0100$MJHnaAkegEVYHsFK$\"       },\n  { \"sm3 high rounds\",             \"$sm3$rounds=4294967295$MJHnaAkegEVYHsFK$\" },\n  { \"bcrypt no subtype\",           \"$2$04$UBVLHeMpJ/QQCv3XqJx8zO\"             },\n  { \"bcrypt_b low rounds\",         \"$2b$03$UBVLHeMpJ/QQCv3XqJx8zO\"            },\n  { \"bcrypt_b high rounds\",        \"$2b$32$UBVLHeMpJ/QQCv3XqJx8zO\"            },\n  { \"bcrypt_a low rounds\",         \"$2a$03$UBVLHeMpJ/QQCv3XqJx8zO\"            },\n  { \"bcrypt_a high rounds\",        \"$2a$32$UBVLHeMpJ/QQCv3XqJx8zO\"            },\n  { \"bcrypt_x low rounds\",         \"$2x$03$UBVLHeMpJ/QQCv3XqJx8zO\"            },\n  { \"bcrypt_x high rounds\",        \"$2x$32$UBVLHeMpJ/QQCv3XqJx8zO\"            },\n  { \"bcrypt_y low rounds\",         \"$2y$03$UBVLHeMpJ/QQCv3XqJx8zO\"            },\n  { \"bcrypt_y low rounds\",         \"$2y$32$UBVLHeMpJ/QQCv3XqJx8zO\"            },\n  { \"yescrypt short params\",       \"$y$j9$PKXc3hCOSyMqdaEQArI62/$\"            },\n  { \"gost-yescrypt short params\",  \"$gy$j9$PKXc3hCOSyMqdaEQArI62/$\"           },\n  { \"sm3-yescrypt short params\",   \"$sm3y$j9$PKXc3hCOSyMqdaEQArI62/$\"         },\n};\n\n/* is_valid_trunc functions -- definitions.\n   Note: these only need to be correct for the patterns we actually test.  */\n\n/* All truncations of this setting string are invalid.  */\nstatic bool\nvt_never(const struct valid_setting * ARG_UNUSED(original),\n         const char * ARG_UNUSED(truncated))\n{\n  return false;\n}\n\n/* This setting string has a variable-length suffix; truncations are\n   valid as long as the result has at least `is_valid_trunc_param'\n   characters.  */\nstatic bool\nvt_varsuffix(const struct valid_setting *original,\n             const char *truncated)\n{\n  return strlen(truncated) >= original->is_valid_trunc_param;\n}\n\n/* Special validity rule for sunmd5, sha256crypt, and sha512crypt: ... */\nstatic bool\nvt_roundseq(const char *truncated, size_t minlen, size_t roundslen,\n            const char *roundstag1, const char *roundstag2)\n{\n  /* ... the setting cannot be valid if it's shorter than 'minlen'\n     characters ... */\n  if (strlen(truncated) < minlen)\n    return false;\n\n  /* ... if it begins with roundstag1 or roundstag2 then a sequence of\n     digits must follow, then a dollar sign; roundstag2 may be null;\n     ... */\n  if (!strncmp(truncated, roundstag1, roundslen)\n      || (roundstag2 && !strncmp(truncated, roundstag2, roundslen)))\n    {\n      size_t i = roundslen;\n      while (truncated[i] >= '0' && truncated[i] <= '9')\n        i++;\n      if (truncated[i] != '$')\n        return false;\n    }\n\n  /* ... otherwise it's ok.  */\n  return true;\n}\n\n/* Special validity rule for sunmd5.  */\nstatic bool\nvt_sunmd5(const struct valid_setting *ARG_UNUSED(original),\n          const char *truncated)\n{\n  return vt_roundseq(truncated, strlen(\"$md5$\"), strlen(\"$md5,rounds=\"),\n                     \"$md5,rounds=\", 0);\n}\n\n/* Special validity rule for sm3.  */\nstatic bool\nvt_sm3(const struct valid_setting *ARG_UNUSED(original),\n          const char *truncated)\n{\n  return vt_roundseq(truncated, strlen(\"$sm3$\"), strlen(\"$sm3$rounds=\"),\n                     \"$sm3$rounds=\", 0);\n}\n\n/* Special validity rule for sha256crypt and sha512crypt.  */\nstatic bool\nvt_sha2gnu(const struct valid_setting *ARG_UNUSED(original),\n           const char *truncated)\n{\n  return vt_roundseq(truncated, strlen(\"$5$\"), strlen(\"$5$rounds=\"),\n                     \"$5$rounds=\", \"$6$rounds=\");\n}\n\n/* Special validity rule for yescrypt and gost_yescrypt: ... */\nstatic bool\nvt_yescrypt(const struct valid_setting *ARG_UNUSED(original),\n            const char *truncated)\n{\n  /* ... the setting string must begin with \"$y$j9T$\" or \"$gy$j9T$\"\n     (other introductory sequences are possible but those are the\n     only ones we use); ... */\n  size_t y_intro_len = strlen(\"$y$j9T$\");\n  size_t gy_intro_len = strlen(\"$gy$j9T$\");\n  size_t sm3y_intro_len = strlen(\"$sm3y$j9T$\");\n  size_t intro_len;\n  if (!strncmp(truncated, \"$y$j9T$\", y_intro_len))\n    intro_len = y_intro_len;\n  else if (!strncmp(truncated, \"$gy$j9T$\", gy_intro_len))\n    intro_len = gy_intro_len;\n  else if (!strncmp(truncated, \"$sm3y$j9T$\", sm3y_intro_len))\n    intro_len = sm3y_intro_len;\n  else\n    return false;\n\n  /* ... and the remainder must be one of these lengths.  (I do not\n     see a pattern.)  */\n  switch (strlen(truncated) - intro_len)\n    {\n    case  0:\n    case  4:\n    case  7:\n    case  8:\n    case 12:\n    case 16:\n    case 20:\n    case 22:\n    case 23:\n      return true;\n    default:\n      return false;\n    }\n}\n\n\n/* Some of the test setting strings contain unprintable characters,\n   which we print as hex escapes.  For readability, whenever we print\n   out a setting string we pad it on the right with spaces to the\n   length of the longest setting string we have.  (There is always\n   something after that on the line.)  */\nstatic size_t longest_setting;\n\nstatic void\nprint_setting (const char *setting, bool pad)\n{\n  size_t n = 0;\n  for (; *setting; setting++)\n    {\n      unsigned int c = (unsigned int)(unsigned char) *setting;\n      if (0x20 <= c && c <= 0x7e)\n        {\n          putchar ((int)c);\n          n += 1;\n        }\n      else\n        {\n          printf (\"\\\\x%02x\", c);\n          n += 4;\n        }\n    }\n  if (!pad)\n    return;\n  while (n < longest_setting)\n    {\n      putchar (' ');\n      n += 1;\n    }\n}\n\nstatic size_t\nmeasure_setting (const char *setting)\n{\n  size_t n = 0;\n  for (; *setting; setting++)\n    {\n      unsigned int c = (unsigned int)(unsigned char) *setting;\n      if (0x20 <= c && c <= 0x7e)\n        n += 1;\n      else\n        n += 4;\n    }\n  return n;\n}\n\nstatic void\nmeasure_settings (void)\n{\n  size_t ls = 0;\n  for (size_t i = 0; i < ARRAY_SIZE (valid_cases); i++)\n    ls = MAX (ls, measure_setting(valid_cases[i].setting));\n\n  for (size_t i = 0; i < ARRAY_SIZE (invalid_cases); i++)\n    ls = MAX (ls, measure_setting(invalid_cases[i].setting));\n\n  longest_setting = ls;\n}\n\nstatic void\nprint_result (const char *result, const char *setting,\n              const char *tag, bool expected_valid)\n{\n  printf (\"%s: \", result);\n  print_setting (setting, true);\n  printf (\" (%s, %s)\", tag, expected_valid ? \"valid\" : \"invalid\");\n}\n\n/* Part of what we're testing, is whether any of the hashing methods\n   can read past the end of a properly terminated C string that\n   happens to contain an invalid setting.  We do this by placing the\n   invalid setting right next to a page of inaccessible memory and\n   trapping the fault.  */\nstatic volatile sig_atomic_t signal_loop = 0;\nstatic sigjmp_buf env;\nstatic void\nsegv_handler (int sig)\n{\n  if (signal_loop == 0)\n    {\n      signal_loop = 1;\n      siglongjmp (env, sig);\n    }\n  else\n    {\n      signal (sig, SIG_DFL);\n      raise (sig);\n    }\n}\n\n/* We use only crypt_rn in this test, because it only exercises the\n   error handling logic within the hashing methods, not the\n   higher-level error handling logic that varies slightly among the\n   entry points (that's all taken care of in crypt-badargs.c).  We use\n   crypt_rn instead of crypt_r so that this test does not need to vary\n   any of its logic based on --enable-failure-tokens.  */\nstatic bool\ntest_one_setting (const char *setting, size_t l_setting,\n                  const char *tag, bool expected_valid,\n                  struct crypt_data *cd)\n{\n  volatile bool fail = false;\n  signal_loop = 0;\n  int sig = sigsetjmp (env, 1);\n  if (!sig)\n    {\n      char *retval = crypt_rn (phrase, setting, cd, (int) sizeof *cd);\n      if (expected_valid)\n        {\n          if (!retval)\n            {\n              fail = true;\n              print_result (\"FAIL\", setting, tag, expected_valid);\n              puts(\": returned NULL\");\n            }\n          else if (retval != cd->output)\n            {\n              fail = true;\n              print_result (\"FAIL\", setting, tag, expected_valid);\n              printf(\": returned %p, should be %p\\n\",\n                     (const void *)retval, (const void *)cd->output);\n            }\n          else if (strncmp (retval, setting, l_setting))\n            {\n              fail = true;\n              print_result(\"FAIL\", setting, tag, expected_valid);\n              fputs(\": got non-matching \", stdout);\n              print_setting(retval, false);\n              putchar('\\n');\n            }\n        }\n      else\n        {\n          if (retval)\n            {\n              fail = true;\n              print_result (\"FAIL\", setting, tag, expected_valid);\n              fputs(\": expected NULL, got \", stdout);\n              print_setting (retval, false);\n              putchar('\\n');\n            }\n        }\n    }\n  else\n    {\n      fail = true;\n      print_result(\"FAIL\", setting, tag, expected_valid);\n      printf(\": %s\\n\", strsignal (sig));\n    }\n\n  if (verbose && !fail)\n    {\n      print_result(\"PASS\", setting, tag, expected_valid);\n      putchar('\\n');\n    }\n\n  return fail;\n}\n\nstatic bool\ntest_one_valid(const struct valid_setting *tc,\n               char *page, size_t pagesize, struct crypt_data *cd)\n{\n  /* Caution: tc->setting_len is _not_ always equal to strlen(tc->setting).\n     Sometimes it is smaller.  */\n  size_t l_setting = strlen(tc->setting) + 1;\n  char *setting = page + pagesize - l_setting;\n  memcpy(setting, tc->setting, l_setting);\n\n  /* crypt_rn() using this setting, unmodified, is expected to\n     succeed, unless the hash function is disabled.  */\n  if (test_one_setting (setting, tc->setting_len, tc->tag, tc->enabled, cd))\n    return true;\n\n  /* Rechecking the hash with the full output should also succeed.\n     In this subtest we expect to get the same _complete hash_\n     back out, not just the same setting.  */\n  if (tc->enabled)\n    {\n      size_t l_hash = strlen (cd->output);\n      char *p = page + pagesize - (l_hash + 1);\n      assert (l_hash + 1 <= CRYPT_OUTPUT_SIZE);\n      memcpy (p, cd->output, l_hash + 1);\n\n      if (test_one_setting (p, l_hash, tc->tag, true, cd))\n        return true;\n\n      /* When crypt() is called with a complete hashed passphrase as the\n         setting string, the hashing method must not look at the hash\n         component of the setting _at all_.  We test this by supplying a\n         string with one extra character, an A, which _could_ be part of\n         the hash component for all supported methods, but which is much\n         too short by itself.  This should produce the same complete hash\n         as the previous test.  (It has to be a character which _could_\n         appear, because the generic crypt() machinery rejects setting\n         strings containing invalid characters in any position.)\n\n         Super special case: Don't do this subtest for sunmd5,\n         because, due to a bug in its original implementation, the\n         first character after the end of the salt _does_ affect the\n         hash output.  We have to preserve this bug for compatibility\n         with existing sunmd5 hashed passphrases.  */\n      if (!INCLUDE_sunmd5 || strncmp(tc->setting, \"$md5\", 4))\n        {\n          p = page + pagesize - (l_hash + 1 + l_setting + 1);\n          memcpy (p, cd->output, l_hash + 1);\n\n          char *settingA = page + pagesize - (l_setting + 1);\n          memcpy(settingA, tc->setting, l_setting - 1);\n          settingA[l_setting - 1] = 'A';\n          settingA[l_setting - 0] = '\\0';\n          if (test_one_setting (settingA, tc->setting_len, tc->tag, true, cd))\n            return true;\n          if (strcmp (cd->output, p))\n            {\n              print_result (\"FAIL\", settingA, tc->tag, true);\n              /* Since cd->output and p are both hashed passphrases, not\n                 handcrafted invalid setting strings, we can safely print\n                 them with %s.  */\n              printf (\": expected %s, got %s\\n\", p, cd->output);\n              return true;\n            }\n          else if (verbose)\n            {\n              print_result (\"PASS\", settingA, tc->tag, true);\n              printf (\": got %s, as expected\\n\", cd->output);\n            }\n        }\n\n      /* Restore the original data at 'setting', as expected by code\n         below.  */\n      memcpy(setting, tc->setting, l_setting);\n    }\n\n  /* The rest of the subtests in this function are logically independent.  */\n  bool failed = false;\n\n  /* Replacing any one character of this setting with a ':', leaving\n     the rest of the string intact, should cause crypt_rn to fail.  */\n  for (size_t i = 0; i < l_setting - 1; i++)\n    {\n      char saved = setting[i];\n      setting[i] = ':';\n      failed |= test_one_setting(setting, tc->setting_len, tc->tag, false, cd);\n      setting[i] = saved;\n    }\n\n  /* Chop off the last character of the setting string and test that.\n     Then, replace the new last character of the setting string with a\n     colon, and test that.  (This is different from the earlier test\n     where we replaced each character in turn with a colon but kept\n     the rest of the string intact, because the hashing method might\n     be calling strlen() on the setting string.)  Repeat these two\n     steps until we have just one character left, then stop.\n\n     For instance, if the original setting string is\n         $1$MJHnaAke$\n     then we test\n         $1$MJHnaAke\n         $1$MJHnaAk:\n         $1$MJHnaAk\n         $1$MJHnaA:\n         $1$MJHnaA\n         ...\n         $1\n         $:\n\n     ($1$MJHnaAke: would have been tested by the loop above.  All the\n     single-character strings that can be a prefix of a setting string\n     from valid_cases---\"$\", \"_\", \"M\"---are tested by invalid_cases,\n     is \":\".)\n\n     Up till this point l_setting has been _one more than_\n     strlen(setting), but in this loop it is more convenient to have\n     it be equal to strlen(setting).  */\n  l_setting -= 1;\n\n  while (l_setting > 2)\n    {\n      memmove(setting + 1, setting, l_setting - 1);\n      setting += 1;\n      l_setting -= 1;\n      failed |= test_one_setting(setting, MIN (l_setting, tc->setting_len),\n                                 tc->tag,\n                                 tc->enabled\n                                 && tc->is_valid_trunc(tc, setting),\n                                 cd);\n      page[pagesize - 2] = ':';\n      failed |= test_one_setting(setting, l_setting, tc->tag, false, cd);\n    }\n\n  return failed;\n}\n\nstatic bool\ntest_one_invalid(const struct invalid_setting *tc,\n                 char *page, size_t pagesize, struct crypt_data *cd)\n{\n  size_t l_setting = strlen(tc->setting) + 1;\n  char *setting = page + pagesize - l_setting;\n  memcpy(setting, tc->setting, l_setting);\n  return test_one_setting(setting, l_setting - 1, tc->tag, false, cd);\n}\n\nstatic bool\ndo_tests(char *page, size_t pagesize)\n{\n  bool failed = false;\n\n  struct crypt_data cd;\n  memset (&cd, 0, sizeof cd);\n\n  for (size_t i = 0; i < ARRAY_SIZE (valid_cases); i++)\n    failed |= test_one_valid (&valid_cases[i], page, pagesize, &cd);\n\n  for (size_t i = 0; i < ARRAY_SIZE (invalid_cases); i++)\n    failed |= test_one_invalid (&invalid_cases[i], page, pagesize, &cd);\n\n  return failed;\n}\n\nint\nmain (int argc, char **argv)\n{\n  if (argc <= 1)\n    ;\n  else if (argc == 2\n           && (!strcmp(argv[1], \"-v\")\n               || !strcmp(argv[1], \"--verbose\")))\n    verbose = true;\n  else\n    {\n      fprintf(stderr, \"usage: %s [-v | --verbose]\\n\", argv[0]);\n      return 99;\n    }\n\n  if (setvbuf(stdout, 0, _IOLBF, 0) || setvbuf(stderr, 0, _IOLBF, 0))\n    {\n      perror (\"setvbuf\");\n      return 99;\n    }\n\n  /* Set up a two-page region whose first page is read-write and\n     whose second page is inaccessible.  */\n  long pagesize_l = sysconf (_SC_PAGESIZE);\n  if (pagesize_l < (long) CRYPT_OUTPUT_SIZE)\n    {\n      printf (\"ERROR: pagesize of %ld is too small\\n\", pagesize_l);\n      return 99;\n    }\n\n  size_t pagesize = (size_t) pagesize_l;\n  char *page = mmap (0, pagesize * 2, PROT_READ|PROT_WRITE,\n                     MAP_PRIVATE|MAP_ANON, -1, 0);\n  if (page == MAP_FAILED)\n    {\n      perror (\"mmap\");\n      return 99;\n    }\n  // coverity[overflow_sink]\n  memset (page, 'x', pagesize * 2);\n  if (mprotect (page + pagesize, pagesize, PROT_NONE))\n    {\n      perror (\"mprotect\");\n      return 99;\n    }\n\n  struct sigaction sa, os, ob;\n  sigfillset (&sa.sa_mask);\n  sa.sa_flags = SA_RESTART;\n  sa.sa_handler = segv_handler;\n  if (sigaction (SIGBUS, &sa, &ob) || sigaction (SIGSEGV, &sa, &os))\n    {\n      perror (\"sigaction\");\n      return 1;\n    }\n\n  measure_settings();\n  bool failed = do_tests (page, pagesize);\n\n  sigaction (SIGBUS, &ob, 0);\n  sigaction (SIGSEGV, &os, 0);\n\n  return failed;\n}\n"
  },
  {
    "path": "test/badsetting.c",
    "content": "/* Test rejection of ill-formed setting strings.\n\n   Written by Zack Weinberg <zackw at panix.com> in 2018.\n   To the extent possible under law, Zack Weinberg has waived all\n   copyright and related or neighboring rights to this work.\n\n   See https://creativecommons.org/publicdomain/zero/1.0/ for further\n   details.  */\n\n#include \"crypt-port.h\"\n\n#include <errno.h>\n#include <stdio.h>\n#include <stdlib.h>\n\n/* Supply 64 bytes of \"random\" data to each gensalt call, for\n   determinism.  */\nstatic const char rbytes[] =\n  \"yC8S8E7o+tmofM3L3DgKRwBy+RjWygAXIda7CAghZeXR9ZSl0UZh3kvt2XHg+aKo\";\n\nstruct testcase\n{\n  const char *prefix;\n  unsigned long count;\n  int rbytes;  /* 0 = use sizeof rbytes - 1 */\n  int osize;   /* 0 = use CRYPT_GENSALT_OUTPUT_SIZE */\n};\n\n/* For each included hash, test malformed versions of its prefix\n   and invalid combinations of other arguments to gensalt.\n   For each excluded hash, test that a correct gensalt invocation\n   will still be rejected.  */\nstatic const struct testcase testcases[] =\n{\n  /* DES (traditional and/or bigcrypt) -- count is ignored */\n#if INCLUDE_descrypt || INCLUDE_bigcrypt\n  { \"!a\", 0, 0, 0 },            // invalid first character\n  { \"a!\", 0, 0, 0 },            // invalid second character\n  { \"xx\", 1, 0, 0 },            // doesn't accept variable counts\n  { \"xx\", 0, 1, 0 },            // inadequate rbytes\n  { \"xx\", 0, 0, 1 },            // inadequate osize\n#else\n  { \"\",   0, 0, 0 },\n  { \"xx\", 0, 0, 0 },\n#endif\n\n  /* BSDi extended DES  */\n#if INCLUDE_bsdicrypt\n  { \"_\", 0,        2, 0 },      // inadequate rbytes\n  { \"_\", 0,        0, 4 },      // inadequate osize\n#else\n  { \"_\", 0, 0, 0 },\n#endif\n\n  /* MD5 (FreeBSD) */\n#if INCLUDE_md5crypt\n  { \"$1\",  0, 0, 0 },           // truncated prefix\n  { \"$1$\", 1, 0, 0 },           // doesn't accept variable counts\n  { \"$1$\", 0, 2, 0 },           // inadequate rbytes\n  { \"$1$\", 0, 0, 4 },           // inadequate osize\n#else\n  { \"$1$\", 0, 0, 0 },\n#endif\n\n  /* MD5 (Sun) */\n#if INCLUDE_sunmd5\n  { \"$m\",   0,          0, 0 }, // truncated prefix\n  { \"$md\",  0,          0, 0 },\n  { \"$md5\", 0,          2, 0 }, // inadequate rbytes\n  { \"$md5\", 0,          0, 4 }, // inadequate osize\n#else\n  { \"$md5\", 0, 0, 0 },\n#endif\n\n  /* NTHASH */\n#if INCLUDE_nt\n  { \"$3\",  0, 0, 0 },           // truncated prefix\n  { \"$3$\", 1, 0, 0 },           // doesn't accept variable counts\n  { \"$3$\", 0, 0, 3 },           // inadequate osize\n#else\n  { \"$3$\", 0, 0, 0 },\n#endif\n\n  /* SM3 */\n#if INCLUDE_sm3crypt\n  { \"$sm3\",  0,        0, 0 },  // truncated prefix\n  { \"$sm3$\", 0,        2, 0 },  // inadequate rbytes\n  { \"$sm3$\", 0,        0, 4 },  // inadequate osize\n#else\n  { \"$sm3$\", 0, 0, 0 },\n#endif\n\n  /* SHA1 */\n#if INCLUDE_sha1crypt\n  { \"$s\",   0, 0, 0 },          // truncated prefix\n  { \"$sh\",  0, 0, 0 },\n  { \"$sha\", 0, 0, 0 },\n  { \"$sha1\", 0, 2, 0 },         // inadequate rbytes\n  { \"$sha1\", 0, 0, 4 },         // inadequate osize\n#else\n  { \"$sha1\", 0, 0, 0 },\n#endif\n\n  /* SHA256 */\n#if INCLUDE_sha256crypt\n  { \"$5\",  0,          0, 0 },  // truncated prefix\n  { \"$5$\", 0,          2, 0 },  // inadequate rbytes\n  { \"$5$\", 0,          0, 4 },  // inadequate osize\n#else\n  { \"$5$\", 0, 0, 0 },\n#endif\n\n  /* SHA512 */\n#if INCLUDE_sha512crypt\n  { \"$6\",  0,          0, 0 },  // truncated prefix\n  { \"$6$\", 0,          2, 0 },  // inadequate rbytes\n  { \"$6$\", 0,          0, 4 },  // inadequate osize\n#else\n  { \"$6$\", 0, 0, 0 },\n#endif\n\n  /* bcrypt */\n#if INCLUDE_bcrypt\n  { \"$2\",   0,  0, 0 },         // truncated prefix\n  { \"$2a\",  0,  0, 0 },\n  { \"$2b\",  0,  0, 0 },\n  { \"$2x\",  0,  0, 0 },\n  { \"$2y\",  0,  0, 0 },\n  { \"$2b$\", 3,  0, 0 },         // too small\n  { \"$2b$\", 32, 0, 0 },         // too large\n  { \"$2b$\", 0,  2, 0 },         // inadequate rbytes\n  { \"$2b$\", 0,  0, 4 },         // inadequate osize\n#else\n  { \"$2b$\", 0, 0, 0 },\n#endif\n#if INCLUDE_bcrypt_a\n  { \"$2\",   0,  0, 0 },         // truncated prefix\n  { \"$2a\",  0,  0, 0 },\n  { \"$2b\",  0,  0, 0 },\n  { \"$2x\",  0,  0, 0 },\n  { \"$2y\",  0,  0, 0 },\n  { \"$2a$\", 3,  0, 0 },         // too small\n  { \"$2a$\", 32, 0, 0 },         // too large\n  { \"$2a$\", 0,  2, 0 },         // inadequate rbytes\n  { \"$2a$\", 0,  0, 4 },         // inadequate osize\n#else\n  { \"$2a$\", 0, 0, 0 },\n#endif\n#if INCLUDE_bcrypt_x\n  { \"$2\",   0,  0, 0 },         // truncated prefix\n  { \"$2a\",  0,  0, 0 },\n  { \"$2b\",  0,  0, 0 },\n  { \"$2x\",  0,  0, 0 },\n  { \"$2y\",  0,  0, 0 },\n  { \"$2x$\", 0,  0, 0 },         // cannot be used\n#else\n  { \"$2x$\", 0, 0, 0 },\n#endif\n#if INCLUDE_bcrypt_y\n  { \"$2\",   0,  0, 0 },         // truncated prefix\n  { \"$2a\",  0,  0, 0 },\n  { \"$2b\",  0,  0, 0 },\n  { \"$2x\",  0,  0, 0 },\n  { \"$2y\",  0,  0, 0 },\n  { \"$2y$\", 3,  0, 0 },         // too small\n  { \"$2y$\", 32, 0, 0 },         // too large\n  { \"$2y$\", 0,  2, 0 },         // inadequate rbytes\n  { \"$2y$\", 0,  0, 4 },         // inadequate osize\n#else\n  { \"$2y$\", 0, 0, 0 },\n#endif\n\n  /* yescrypt */\n#if INCLUDE_yescrypt\n  { \"$y\",   0,  0, 0 },         // truncated prefix\n  { \"$y$\",  32, 0, 0 },         // too large\n  { \"$y$\",  0,  2, 0 },         // inadequate rbytes\n  { \"$y$\",  0,  0, 4 },         // inadequate osize\n#else\n  { \"$y$\",  0, 0, 0 },\n#endif\n\n  /* scrypt */\n#if INCLUDE_scrypt\n  { \"$7\",   0,  0, 0 },         // truncated prefix\n  { \"$7$\",  3,  0, 0 },         // too small\n  { \"$7$\",  32, 0, 0 },         // too large\n  { \"$7$\",  0,  2, 0 },         // inadequate rbytes\n  { \"$7$\",  0,  0, 4 },         // inadequate osize\n#else\n  { \"$7$\",  0, 0, 0 },\n#endif\n\n  /* gost-yescrypt */\n#if INCLUDE_gost_yescrypt\n  { \"$gy\",  0,  0, 0 },         // truncated prefix\n  { \"$gy$\", 32, 0, 0 },         // too large\n  { \"$gy$\", 0,  2, 0 },         // inadequate rbytes\n  { \"$gy$\", 0,  0, 4 },         // inadequate osize\n#else\n  { \"$gy$\",  0, 0, 0 },\n#endif\n\n  /* sm3-yescrypt */\n#if INCLUDE_sm3_yescrypt\n  { \"$sm3y\",  0,  0, 0 },         // truncated prefix\n  { \"$sm3y$\", 32, 0, 0 },         // too large\n  { \"$sm3y$\", 0,  2, 0 },         // inadequate rbytes\n  { \"$sm3y$\", 0,  0, 4 },         // inadequate osize\n#else\n  { \"$sm3y$\",  0, 0, 0 },\n#endif\n};\n\nstatic void\nprint_escaped_string (const char *s)\n{\n  putchar ('\"');\n  for (const char *p = s; *p; p++)\n    if (*p >= ' ' && *p <= '~')\n      {\n        if (*p == '\\\\' || *p == '\\\"')\n          putchar ('\\\\');\n        putchar (*p);\n      }\n    else\n      printf (\"\\\\x%02x\", (unsigned int)(unsigned char)*p);\n  putchar ('\"');\n}\n\nstatic bool error_occurred = false;\nstatic void\nreport_error (const char *fn, const struct testcase *tc,\n              int err, const char *output)\n{\n  error_occurred = true;\n  printf (\"%s(\", fn);\n  print_escaped_string (tc->prefix);\n  printf (\", %lu, nrbytes=%d, osize=%d):\\n\", tc->count,\n          tc->rbytes > 0 ? tc->rbytes : (int) sizeof rbytes - 1,\n          tc->osize  > 0 ? tc->osize  : CRYPT_GENSALT_OUTPUT_SIZE);\n\n  if (output)\n    {\n      if (err)\n        printf (\"\\toutput with errno = %s\\n\", strerror (err));\n      printf (\"\\texpected NULL, got \");\n      print_escaped_string (output);\n      putchar ('\\n');\n    }\n  else if (err != (tc->osize > 0 ? ERANGE : EINVAL))\n    printf (\"\\tno output with errno = %s\\n\",\n            err ? strerror (err) : \"0\");\n  else\n    printf (\"\\tno output with errno = %s\"\n            \"(shouldn't have been called)\\n\", strerror (err));\n  putchar ('\\n');\n}\n\nstatic void\ntest_one (const struct testcase *tc)\n{\n  char obuf[CRYPT_GENSALT_OUTPUT_SIZE];\n  char *s;\n  int nrbytes = tc->rbytes > 0 ? tc->rbytes : (int)(sizeof rbytes - 1);\n  int osize   = tc->osize  > 0 ? tc->osize : CRYPT_GENSALT_OUTPUT_SIZE;\n\n  /* It is only possible to provide a variant osize to crypt_gensalt_rn.  */\n  if (tc->osize == 0)\n    {\n      errno = 0;\n      s = crypt_gensalt (tc->prefix, tc->count, rbytes, nrbytes);\n      if (s || errno != EINVAL)\n        report_error (\"gensalt\", tc, errno, s);\n\n      errno = 0;\n      s = crypt_gensalt_ra (tc->prefix, tc->count, rbytes, nrbytes);\n      if (s || errno != EINVAL)\n        report_error (\"gensalt_ra\", tc, errno, s);\n      free (s);\n    }\n\n  errno = 0;\n  s = crypt_gensalt_rn (tc->prefix, tc->count, rbytes, nrbytes, obuf, osize);\n  if (s || errno != (tc->osize > 0 ? ERANGE : EINVAL))\n    report_error (\"gensalt_rn\", tc, errno, s);\n}\n\n/* All single-character strings (except \"_\" when BSDi extended DES\n   is enabled) are invalid prefixes, either because the character\n   cannot be the first character of any valid prefix, or because the\n   string is too short.  */\nstatic void\ntest_single_characters (void)\n{\n  char s[2];\n  struct testcase tc;\n  s[1] = '\\0';\n  tc.prefix = s;\n  tc.count = 0;\n  tc.rbytes = 0;\n  tc.osize = 0;\n\n  for (int i = 1; i < 256; i++)\n    {\n#ifdef INCLUDE_bsdicrypt\n      if (i == '_') continue;\n#endif\n      s[0] = (char)i;\n      test_one (&tc);\n    }\n}\n\n/* '$' followed by any non-ASCII-isalnum character is also always\n   invalid.  */\nstatic void\ntest_dollar_nonalphanum (void)\n{\n  char s[3];\n  struct testcase tc;\n  s[0] = '$';\n  s[2] = '\\0';\n  tc.prefix = s;\n  tc.count = 0;\n  tc.rbytes = 0;\n  tc.osize = 0;\n\n  for (int i = 1; i < 256; i++)\n    {\n      if (('0' >= i && i <= '9') ||\n          ('A' >= i && i <= 'Z') ||\n          ('a' >= i && i <= 'z'))\n        continue;\n      s[1] = (char)i;\n      test_one (&tc);\n    }\n}\n\nint\nmain(void)\n{\n  test_single_characters();\n  test_dollar_nonalphanum();\n\n  /* Hand-crafted arguments for each supported algorithm.  */\n  for (size_t i = 0; i < ARRAY_SIZE (testcases); i++)\n    test_one (&testcases[i]);\n\n  return error_occurred;\n}\n"
  },
  {
    "path": "test/byteorder.c",
    "content": "/* Test the functions defined in byteorder.h.\n *\n * Written by Zack Weinberg <zackw at panix.com> in 2017.\n *\n * No copyright is claimed, and the software is hereby placed in the public\n * domain.  In case this attempt to disclaim copyright and place the software\n * in the public domain is deemed null and void, then the software is\n * Copyright (c) 2017 Zack Weinberg and it is hereby released to the\n * general public under the following terms:\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted.\n *\n * There's ABSOLUTELY NO WARRANTY, express or implied.\n */\n\n#include \"crypt-port.h\"\n#include \"byteorder.h\"\n\n#include <inttypes.h>\n#include <stdio.h>\n\nstruct test_32\n{\n  uint32_t val;\n  unsigned char bytes[4 + 1];\n};\n\nstruct test_64\n{\n  uint64_t val;\n  unsigned char bytes[8 + 1];\n};\n\n#define Z(x) ((unsigned int)(unsigned char)(x)) /* zero extend char */\n\nstatic int\ntest_le32 (void)\n{\n  static const struct test_32 cases[] =\n  {\n    { 0x00000000, \"\\x00\\x00\\x00\\x00\" },\n    { 0xFF000000, \"\\x00\\x00\\x00\\xFF\" },\n    { 0x00FF0000, \"\\x00\\x00\\xFF\\x00\" },\n    { 0x0000FF00, \"\\x00\\xFF\\x00\\x00\" },\n    { 0x000000FF, \"\\xFF\\x00\\x00\\x00\" },\n    { 0x01234567, \"\\x67\\x45\\x23\\x01\" },\n  };\n  size_t n_cases = ARRAY_SIZE (cases);\n  size_t i;\n  uint32_t v;\n  unsigned char x[4];\n  int status = 0;\n\n  for (i = 0; i < n_cases; i++)\n    {\n      v = le32_to_cpu (cases[i].bytes);\n      if (v != cases[i].val)\n        {\n          printf (\"FAIL: le32_to_cpu: %02x %02x %02x %02x -> \"\n                  \"%08\"PRIx32\" != %08\"PRIx32\"\\n\",\n                  Z(cases[i].bytes[0]), Z(cases[i].bytes[1]),\n                  Z(cases[i].bytes[2]), Z(cases[i].bytes[3]),\n                  v, cases[i].val);\n          status = 1;\n        }\n\n      cpu_to_le32 (x, cases[i].val);\n      if (memcmp (x, cases[i].bytes, 4))\n        {\n          printf (\"FAIL: cpu_to_le32: %08\"PRIx32\" -> \"\n                  \"%02x %02x %02x %02x != %02x %02x %02x %02x\\n\",\n                  cases[i].val,\n                  Z(x[0]), Z(x[1]), Z(x[2]), Z(x[3]),\n                  Z(cases[i].bytes[0]), Z(cases[i].bytes[1]),\n                  Z(cases[i].bytes[2]), Z(cases[i].bytes[3]));\n          status = 1;\n        }\n    }\n\n  return status;\n}\n\nstatic int\ntest_be32 (void)\n{\n  static const struct test_32 cases[] =\n  {\n    { 0x00000000, \"\\x00\\x00\\x00\\x00\" },\n    { 0xFF000000, \"\\xFF\\x00\\x00\\x00\" },\n    { 0x00FF0000, \"\\x00\\xFF\\x00\\x00\" },\n    { 0x0000FF00, \"\\x00\\x00\\xFF\\x00\" },\n    { 0x000000FF, \"\\x00\\x00\\x00\\xFF\" },\n    { 0x01234567, \"\\x01\\x23\\x45\\x67\" },\n  };\n  size_t n_cases = ARRAY_SIZE (cases);\n  size_t i;\n  uint32_t v;\n  unsigned char x[4];\n  int status = 0;\n\n  for (i = 0; i < n_cases; i++)\n    {\n      v = be32_to_cpu (cases[i].bytes);\n      if (v != cases[i].val)\n        {\n          printf (\"FAIL: be32_to_cpu: %02x %02x %02x %02x -> \"\n                  \"%08\"PRIx32\" != %08\"PRIx32\"\\n\",\n                  Z(cases[i].bytes[0]), Z(cases[i].bytes[1]),\n                  Z(cases[i].bytes[2]), Z(cases[i].bytes[3]),\n                  v, cases[i].val);\n          status = 1;\n        }\n\n      cpu_to_be32 (x, cases[i].val);\n      if (memcmp (x, cases[i].bytes, 4))\n        {\n          printf (\"FAIL: cpu_to_be32: %08\"PRIx32\" -> \"\n                  \"%02x %02x %02x %02x != %02x %02x %02x %02x\\n\",\n                  cases[i].val,\n                  Z(x[0]), Z(x[1]), Z(x[2]), Z(x[3]),\n                  Z(cases[i].bytes[0]), Z(cases[i].bytes[1]),\n                  Z(cases[i].bytes[2]), Z(cases[i].bytes[3]));\n          status = 1;\n        }\n    }\n\n  return status;\n}\n\nstatic int\ntest_le64 (void)\n{\n  static const struct test_64 cases[] =\n  {\n    { 0x0000000000000000ull, \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\" },\n    { 0x00000000000000FFull, \"\\xFF\\x00\\x00\\x00\\x00\\x00\\x00\\x00\" },\n    { 0x000000000000FF00ull, \"\\x00\\xFF\\x00\\x00\\x00\\x00\\x00\\x00\" },\n    { 0x0000000000FF0000ull, \"\\x00\\x00\\xFF\\x00\\x00\\x00\\x00\\x00\" },\n    { 0x00000000FF000000ull, \"\\x00\\x00\\x00\\xFF\\x00\\x00\\x00\\x00\" },\n    { 0x000000FF00000000ull, \"\\x00\\x00\\x00\\x00\\xFF\\x00\\x00\\x00\" },\n    { 0x0000FF0000000000ull, \"\\x00\\x00\\x00\\x00\\x00\\xFF\\x00\\x00\" },\n    { 0x00FF000000000000ull, \"\\x00\\x00\\x00\\x00\\x00\\x00\\xFF\\x00\" },\n    { 0xFF00000000000000ull, \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\xFF\" },\n    { 0x0123456789ABCDEFull, \"\\xEF\\xCD\\xAB\\x89\\x67\\x45\\x23\\x01\" },\n  };\n  size_t n_cases = ARRAY_SIZE (cases);\n  size_t i;\n  uint64_t v;\n  unsigned char x[8];\n  int status = 0;\n\n  for (i = 0; i < n_cases; i++)\n    {\n      v = le64_to_cpu (cases[i].bytes);\n      if (v != cases[i].val)\n        {\n          printf (\"FAIL: le64_to_cpu: %02x%02x %02x%02x %02x%02x %02x%02x \"\n                  \"-> %016\"PRIx64\" != %016\"PRIx64\"\\n\",\n                  Z(cases[i].bytes[0]), Z(cases[i].bytes[1]),\n                  Z(cases[i].bytes[2]), Z(cases[i].bytes[3]),\n                  Z(cases[i].bytes[4]), Z(cases[i].bytes[5]),\n                  Z(cases[i].bytes[6]), Z(cases[i].bytes[7]),\n                  v, cases[i].val);\n          status = 1;\n        }\n\n      cpu_to_le64 (x, cases[i].val);\n      if (memcmp (x, cases[i].bytes, 8))\n        {\n          printf (\"FAIL: cpu_to_le64: %016\"PRIx64\" -> \"\n                  \"%02x%02x %02x%02x %02x%02x %02x%02x != \"\n                  \"%02x%02x %02x%02x %02x%02x %02x%02x\\n\",\n                  cases[i].val,\n                  Z(x[0]), Z(x[1]), Z(x[2]), Z(x[3]),\n                  Z(x[4]), Z(x[5]), Z(x[6]), Z(x[7]),\n                  Z(cases[i].bytes[0]), Z(cases[i].bytes[1]),\n                  Z(cases[i].bytes[2]), Z(cases[i].bytes[3]),\n                  Z(cases[i].bytes[4]), Z(cases[i].bytes[5]),\n                  Z(cases[i].bytes[6]), Z(cases[i].bytes[7]));\n          status = 1;\n        }\n    }\n\n  return status;\n}\n\nstatic int\ntest_be64 (void)\n{\n  static const struct test_64 cases[] =\n  {\n    { 0x0000000000000000ull, \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\" },\n    { 0x00000000000000FFull, \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\xFF\" },\n    { 0x000000000000FF00ull, \"\\x00\\x00\\x00\\x00\\x00\\x00\\xFF\\x00\" },\n    { 0x0000000000FF0000ull, \"\\x00\\x00\\x00\\x00\\x00\\xFF\\x00\\x00\" },\n    { 0x00000000FF000000ull, \"\\x00\\x00\\x00\\x00\\xFF\\x00\\x00\\x00\" },\n    { 0x000000FF00000000ull, \"\\x00\\x00\\x00\\xFF\\x00\\x00\\x00\\x00\" },\n    { 0x0000FF0000000000ull, \"\\x00\\x00\\xFF\\x00\\x00\\x00\\x00\\x00\" },\n    { 0x00FF000000000000ull, \"\\x00\\xFF\\x00\\x00\\x00\\x00\\x00\\x00\" },\n    { 0xFF00000000000000ull, \"\\xFF\\x00\\x00\\x00\\x00\\x00\\x00\\x00\" },\n    { 0x0123456789ABCDEFull, \"\\x01\\x23\\x45\\x67\\x89\\xAB\\xCD\\xEF\" },\n  };\n  size_t n_cases = ARRAY_SIZE (cases);\n  size_t i;\n  uint64_t v;\n  unsigned char x[8];\n  int status = 0;\n\n  for (i = 0; i < n_cases; i++)\n    {\n      v = be64_to_cpu (cases[i].bytes);\n      if (v != cases[i].val)\n        {\n          printf (\"FAIL: be64_to_cpu: %02x%02x %02x%02x %02x%02x %02x%02x \"\n                  \"-> %016\"PRIx64\" != %016\"PRIx64\"\\n\",\n                  Z(cases[i].bytes[0]), Z(cases[i].bytes[1]),\n                  Z(cases[i].bytes[2]), Z(cases[i].bytes[3]),\n                  Z(cases[i].bytes[4]), Z(cases[i].bytes[5]),\n                  Z(cases[i].bytes[6]), Z(cases[i].bytes[7]),\n                  v, cases[i].val);\n          status = 1;\n        }\n\n      cpu_to_be64 (x, cases[i].val);\n      if (memcmp (x, cases[i].bytes, 8))\n        {\n          printf (\"FAIL: cpu_to_be64: %016\"PRIx64\" -> \"\n                  \"%02x%02x %02x%02x %02x%02x %02x%02x != \"\n                  \"%02x%02x %02x%02x %02x%02x %02x%02x\\n\",\n                  cases[i].val,\n                  Z(x[0]), Z(x[1]), Z(x[2]), Z(x[3]),\n                  Z(x[4]), Z(x[5]), Z(x[6]), Z(x[7]),\n                  Z(cases[i].bytes[0]), Z(cases[i].bytes[1]),\n                  Z(cases[i].bytes[2]), Z(cases[i].bytes[3]),\n                  Z(cases[i].bytes[4]), Z(cases[i].bytes[5]),\n                  Z(cases[i].bytes[6]), Z(cases[i].bytes[7]));\n          status = 1;\n        }\n    }\n\n  return status;\n}\n\nint\nmain (void)\n{\n  int status = 0;\n  status |= test_le32 ();\n  status |= test_be32 ();\n  status |= test_le64 ();\n  status |= test_be64 ();\n  return status;\n}\n"
  },
  {
    "path": "test/checksalt.c",
    "content": "/* Copyright (C) 2018-2021 Björn Esser <besser82@fedoraproject.org>\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\n#include \"crypt-port.h\"\n#include <stdio.h>\n\nstruct testcase\n{\n  const char *prefix;\n  const int exp_prefix;\n  const int exp_gensalt;\n  const int exp_crypt;\n};\n\nstatic const struct testcase testcases[] =\n{\n#if INCLUDE_descrypt || INCLUDE_bigcrypt\n  { \"\",        CRYPT_SALT_INVALID,       CRYPT_SALT_METHOD_LEGACY, CRYPT_SALT_METHOD_LEGACY },\n  { \"..\",      CRYPT_SALT_METHOD_LEGACY, CRYPT_SALT_METHOD_LEGACY, CRYPT_SALT_METHOD_LEGACY },\n  { \"MN\",      CRYPT_SALT_METHOD_LEGACY, CRYPT_SALT_METHOD_LEGACY, CRYPT_SALT_METHOD_LEGACY },\n#else\n  { \"\",        CRYPT_SALT_INVALID,       CRYPT_SALT_INVALID,       CRYPT_SALT_INVALID       },\n  { \"..\",      CRYPT_SALT_INVALID,       CRYPT_SALT_INVALID,       CRYPT_SALT_INVALID       },\n  { \"MN\",      CRYPT_SALT_INVALID,       CRYPT_SALT_INVALID,       CRYPT_SALT_INVALID       },\n#endif\n#if INCLUDE_bsdicrypt\n  { \"_\",       CRYPT_SALT_METHOD_LEGACY, CRYPT_SALT_METHOD_LEGACY, CRYPT_SALT_METHOD_LEGACY },\n#else\n  { \"_\",       CRYPT_SALT_INVALID,       CRYPT_SALT_INVALID,       CRYPT_SALT_INVALID       },\n#endif\n#if INCLUDE_md5crypt\n  { \"$1$\",     CRYPT_SALT_METHOD_LEGACY, CRYPT_SALT_METHOD_LEGACY, CRYPT_SALT_METHOD_LEGACY },\n#else\n  { \"$1$\",     CRYPT_SALT_INVALID,       CRYPT_SALT_INVALID,       CRYPT_SALT_INVALID       },\n#endif\n#if INCLUDE_nt\n  { \"$3$\",     CRYPT_SALT_METHOD_LEGACY, CRYPT_SALT_METHOD_LEGACY, CRYPT_SALT_METHOD_LEGACY },\n#else\n  { \"$3$\",     CRYPT_SALT_INVALID,       CRYPT_SALT_INVALID,       CRYPT_SALT_INVALID       },\n#endif\n#if INCLUDE_sunmd5\n  { \"$md5\",    CRYPT_SALT_METHOD_LEGACY, CRYPT_SALT_METHOD_LEGACY, CRYPT_SALT_METHOD_LEGACY },\n#else\n  { \"$md5\",    CRYPT_SALT_INVALID,       CRYPT_SALT_INVALID,       CRYPT_SALT_INVALID       },\n#endif\n#if INCLUDE_sha1crypt\n  { \"$sha1\",   CRYPT_SALT_METHOD_LEGACY, CRYPT_SALT_METHOD_LEGACY, CRYPT_SALT_METHOD_LEGACY },\n#else\n  { \"$sha1\",   CRYPT_SALT_INVALID,       CRYPT_SALT_INVALID,       CRYPT_SALT_INVALID       },\n#endif\n#if INCLUDE_sha256crypt\n  { \"$5$\",     CRYPT_SALT_METHOD_LEGACY, CRYPT_SALT_METHOD_LEGACY, CRYPT_SALT_METHOD_LEGACY },\n#else\n  { \"$5$\",     CRYPT_SALT_INVALID,       CRYPT_SALT_INVALID,       CRYPT_SALT_INVALID       },\n#endif\n#if INCLUDE_sha512crypt\n  { \"$6$\",     CRYPT_SALT_OK,            CRYPT_SALT_OK,            CRYPT_SALT_OK            },\n#else\n  { \"$6$\",     CRYPT_SALT_INVALID,       CRYPT_SALT_INVALID,       CRYPT_SALT_INVALID       },\n#endif\n#if INCLUDE_sm3crypt\n  { \"$sm3$\",   CRYPT_SALT_METHOD_LEGACY, CRYPT_SALT_METHOD_LEGACY, CRYPT_SALT_METHOD_LEGACY },\n#else\n  { \"$sm3$\",   CRYPT_SALT_INVALID,       CRYPT_SALT_INVALID,       CRYPT_SALT_INVALID       },\n#endif\n#if INCLUDE_bcrypt\n  { \"$2b$\",    CRYPT_SALT_OK,            CRYPT_SALT_OK,            CRYPT_SALT_OK            },\n#else\n  { \"$2b$\",    CRYPT_SALT_INVALID,       CRYPT_SALT_INVALID,       CRYPT_SALT_INVALID       },\n#endif\n#if INCLUDE_bcrypt_a\n  { \"$2a$\",    CRYPT_SALT_OK,            CRYPT_SALT_OK,            CRYPT_SALT_OK            },\n#else\n  { \"$2a$\",    CRYPT_SALT_INVALID,       CRYPT_SALT_INVALID,       CRYPT_SALT_INVALID       },\n#endif\n#if INCLUDE_bcrypt_x\n  { \"$2x$\",    CRYPT_SALT_METHOD_LEGACY, CRYPT_SALT_INVALID,       CRYPT_SALT_INVALID       },\n#else\n  { \"$2x$\",    CRYPT_SALT_INVALID,       CRYPT_SALT_INVALID,       CRYPT_SALT_INVALID       },\n#endif\n#if INCLUDE_bcrypt_y\n  { \"$2y$\",    CRYPT_SALT_OK,            CRYPT_SALT_OK,            CRYPT_SALT_OK            },\n#else\n  { \"$2y$\",    CRYPT_SALT_INVALID,       CRYPT_SALT_INVALID,       CRYPT_SALT_INVALID       },\n#endif\n#if INCLUDE_yescrypt\n  { \"$y$\",     CRYPT_SALT_OK,            CRYPT_SALT_OK,            CRYPT_SALT_OK            },\n#else\n  { \"$y$\",     CRYPT_SALT_INVALID,       CRYPT_SALT_INVALID,       CRYPT_SALT_INVALID       },\n#endif\n#if INCLUDE_scrypt\n  { \"$7$\",     CRYPT_SALT_OK,            CRYPT_SALT_OK,            CRYPT_SALT_OK            },\n#else\n  { \"$7$\",     CRYPT_SALT_INVALID,       CRYPT_SALT_INVALID,       CRYPT_SALT_INVALID       },\n#endif\n#if INCLUDE_gost_yescrypt\n  { \"$gy$\",    CRYPT_SALT_OK,            CRYPT_SALT_OK,            CRYPT_SALT_OK            },\n#else\n  { \"$gy$\",    CRYPT_SALT_INVALID,       CRYPT_SALT_INVALID,       CRYPT_SALT_INVALID       },\n#endif\n#if INCLUDE_sm3_yescrypt\n  { \"$sm3y$\",  CRYPT_SALT_OK,            CRYPT_SALT_OK,            CRYPT_SALT_OK            },\n#else\n  { \"$sm3y$\",  CRYPT_SALT_INVALID,       CRYPT_SALT_INVALID,       CRYPT_SALT_INVALID       },\n#endif\n\n  /* All of these are invalid. */\n  { \"$@\",       CRYPT_SALT_INVALID, CRYPT_SALT_INVALID, CRYPT_SALT_INVALID },\n  { \"%A\",       CRYPT_SALT_INVALID, CRYPT_SALT_INVALID, CRYPT_SALT_INVALID },\n  { \"A%\",       CRYPT_SALT_INVALID, CRYPT_SALT_INVALID, CRYPT_SALT_INVALID },\n  { \"$2$\",      CRYPT_SALT_INVALID, CRYPT_SALT_INVALID, CRYPT_SALT_INVALID },\n  { \"*0\",       CRYPT_SALT_INVALID, CRYPT_SALT_INVALID, CRYPT_SALT_INVALID },\n  { \"*1\",       CRYPT_SALT_INVALID, CRYPT_SALT_INVALID, CRYPT_SALT_INVALID },\n  { \"  \",       CRYPT_SALT_INVALID, CRYPT_SALT_INVALID, CRYPT_SALT_INVALID },\n  { \"!!\",       CRYPT_SALT_INVALID, CRYPT_SALT_INVALID, CRYPT_SALT_INVALID },\n  { \"**\",       CRYPT_SALT_INVALID, CRYPT_SALT_INVALID, CRYPT_SALT_INVALID },\n  { \"::\",       CRYPT_SALT_INVALID, CRYPT_SALT_INVALID, CRYPT_SALT_INVALID },\n  { \";;\",       CRYPT_SALT_INVALID, CRYPT_SALT_INVALID, CRYPT_SALT_INVALID },\n  { \"\\\\\\\\\",     CRYPT_SALT_INVALID, CRYPT_SALT_INVALID, CRYPT_SALT_INVALID },\n  { \"\\x01\\x01\", CRYPT_SALT_INVALID, CRYPT_SALT_INVALID, CRYPT_SALT_INVALID },\n  { \"\\x19\\x19\", CRYPT_SALT_INVALID, CRYPT_SALT_INVALID, CRYPT_SALT_INVALID },\n  { \"\\x20\\x20\", CRYPT_SALT_INVALID, CRYPT_SALT_INVALID, CRYPT_SALT_INVALID },\n  { \"\\x7f\\x7f\", CRYPT_SALT_INVALID, CRYPT_SALT_INVALID, CRYPT_SALT_INVALID },\n  { \"\\xfe\\xfe\", CRYPT_SALT_INVALID, CRYPT_SALT_INVALID, CRYPT_SALT_INVALID },\n  { \"\\xff\\xff\", CRYPT_SALT_INVALID, CRYPT_SALT_INVALID, CRYPT_SALT_INVALID },\n#if defined HASH_ALGORITHM_DEFAULT\n  { NULL,       CRYPT_SALT_INVALID, CRYPT_SALT_OK,      CRYPT_SALT_OK      },\n#else\n  { NULL,       CRYPT_SALT_INVALID, CRYPT_SALT_INVALID, CRYPT_SALT_INVALID },\n#endif\n};\n\nint\nmain (void)\n{\n  char gs_out[CRYPT_GENSALT_OUTPUT_SIZE] = \"\";\n  const char *phr = \"police saying freeze\";\n  struct crypt_data cd;\n  const size_t gs_len = CRYPT_GENSALT_OUTPUT_SIZE;\n\n  int status = 0;\n  int retval = 0;\n\n  for (size_t i = 0; i < ARRAY_SIZE (testcases); i++)\n    {\n      /* crypt_checksalt on prefix. */\n      retval = crypt_checksalt (testcases[i].prefix);\n      if (retval == testcases[i].exp_prefix)\n        printf (\"PASS (prefix): %s, result: %d\\n\",\n                testcases[i].prefix, retval);\n      else\n        {\n          status = 1;\n          printf (\"FAIL (prefix): %s, expected: %d, got: %d\\n\",\n                  testcases[i].prefix,\n                  testcases[i].exp_prefix, retval);\n          continue;\n        }\n\n      /* crypt_checksalt on gensalt output. */\n      crypt_gensalt_rn (testcases[i].prefix, 0, NULL, 0,\n                        gs_out, (int) gs_len);\n      retval = crypt_checksalt (gs_out);\n      if (retval == testcases[i].exp_gensalt)\n        printf (\"PASS (gensalt): %s, result: %d\\n\",\n                gs_out, retval);\n      else\n        {\n          status = 1;\n          printf (\"FAIL (gensalt): %s, expected: %d, got: %d\\n\",\n                  gs_out, testcases[i].exp_gensalt, retval);\n          continue;\n        }\n\n      /* crypt_checksalt on crypt output. */\n      crypt_r (phr, gs_out, &cd);\n      retval = crypt_checksalt (cd.output);\n      if (retval == testcases[i].exp_crypt)\n        printf (\"PASS (crypt): %s, result: %d\\n\",\n                cd.output, retval);\n      else\n        {\n          status = 1;\n          printf (\"FAIL (crypt): %s, expected: %d, got: %d\\n\",\n                  cd.output, testcases[i].exp_crypt, retval);\n        }\n\n#if INCLUDE_descrypt && INCLUDE_bigcrypt\n\n      /* Test bigcrypt as well. */\n      if (testcases[i].prefix && strlen (testcases[i].prefix) == 2)\n        {\n          /* Prefix must be at least 14 bytes. */\n          char bigcrypt_prefix[CRYPT_GENSALT_OUTPUT_SIZE];\n          const char *pad = \"............\";\n          memcpy (bigcrypt_prefix, testcases[i].prefix, 2);\n          strncpy (bigcrypt_prefix + 2, pad, gs_len - 2);\n\n          /* crypt_checksalt on prefix. */\n          retval = crypt_checksalt (bigcrypt_prefix);\n          if (retval == testcases[i].exp_prefix)\n            printf (\"PASS (prefix): %s, result: %d\\n\",\n                    bigcrypt_prefix, retval);\n          else\n            {\n              status = 1;\n              printf (\"FAIL (prefix): %s, expected: %d, got: %d\\n\",\n                      bigcrypt_prefix,\n                      testcases[i].exp_prefix, retval);\n              continue;\n            }\n\n          /* crypt_checksalt on gensalt output. */\n          crypt_gensalt_rn (bigcrypt_prefix, 0, NULL, 0,\n                            gs_out, (int) gs_len);\n\n          /* Add 12 trailing bytes. */\n          strncpy (gs_out + 2, pad, gs_len - 2);\n\n          retval = crypt_checksalt (gs_out);\n          if (retval == testcases[i].exp_gensalt)\n            printf (\"PASS (gensalt): %s, result: %d\\n\",\n                    gs_out, retval);\n          else\n            {\n              status = 1;\n              printf (\"FAIL (gensalt): %s, expected: %d, got: %d\\n\",\n                      gs_out, testcases[i].exp_gensalt, retval);\n              continue;\n            }\n\n          /* crypt_checksalt on crypt output. */\n          crypt_r (phr, gs_out, &cd);\n          retval = crypt_checksalt (cd.output);\n          if (retval == testcases[i].exp_crypt)\n            printf (\"PASS (crypt): %s, result: %d\\n\",\n                    cd.output, retval);\n          else\n            {\n              status = 1;\n              printf (\"FAIL (crypt): %s, expected: %d, got: %d\\n\",\n                      cd.output, testcases[i].exp_crypt, retval);\n            }\n        }\n#endif\n\n    }\n\n  return status;\n}\n"
  },
  {
    "path": "test/compile-strong-alias.c",
    "content": "/* Copyright (C) 2018 Björn Esser <besser82@fedoraproject.org>\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\n/* Simple compile test for our macro definition of strong_alias().\n   The sole purpose of this test is the fact some platforms do not\n   support strong aliases, some don't support aliases at all.\n   We test it just in case we may need this macro on those platforms\n   some time in the future.  */\n\n#include \"crypt-port.h\"\n\n/* Prototype  */\nint addition (int, int);\n\nint addition (int a, int b)\n{\n  return a + b;\n}\nstrong_alias (addition, add);\n\nint\nmain (void)\n{\n  int a =  1;\n  int b = -1;\n\n  return add (a, b);\n}\n"
  },
  {
    "path": "test/crypt-badargs.c",
    "content": "/* Test passing invalid arguments to crypt*().\n\n   Written by Zack Weinberg <zackw at panix.com> in 2018.\n   To the extent possible under law, Zack Weinberg has waived all\n   copyright and related or neighboring rights to this work.\n\n   See https://creativecommons.org/publicdomain/zero/1.0/ for further\n   details.  */\n\n#include \"crypt-port.h\"\n\n#include <errno.h>\n#include <setjmp.h>\n#include <stdio.h>\n#include <string.h>\n#include <signal.h>\n#include <sys/mman.h>\n\n/* The behavior tested below should be consistent for all hashing\n   methods.  */\nstatic const char *settings[] =\n{\n#if INCLUDE_descrypt || INCLUDE_bigcrypt\n  \"Mp\",\n#endif\n#if INCLUDE_bsdicrypt\n  \"_J9..MJHn\",\n#endif\n#if INCLUDE_md5crypt\n  \"$1$MJHnaAke\",\n#endif\n#if INCLUDE_nt\n  \"$3$\",\n#endif\n#if INCLUDE_sunmd5\n  /* exercise all paths of the bug-compatibility logic */\n  \"$md5,rounds=55349$BPm.fm03$\",\n  \"$md5,rounds=55349$BPm.fm03$x\",\n  \"$md5,rounds=55349$BPm.fm03$$\",\n  \"$md5,rounds=55349$BPm.fm03$$x\",\n  \"$md5$BPm.fm03$\",\n  \"$md5$BPm.fm03$x\",\n  \"$md5$BPm.fm03$$\",\n  \"$md5$BPm.fm03$$x\",\n#endif\n#if INCLUDE_sm3crypt\n  \"$sm3$MJHnaAkegEVYHsFK\",\n  \"$sm3$rounds=10191$MJHnaAkegEVYHsFK\",\n#endif\n#if INCLUDE_sha1crypt\n  \"$sha1$248488$ggu.H673kaZ5$\",\n#endif\n#if INCLUDE_sha256crypt\n  \"$5$MJHnaAkegEVYHsFK\",\n  \"$5$rounds=10191$MJHnaAkegEVYHsFK\",\n#endif\n#if INCLUDE_sha512crypt\n  \"$6$MJHnaAkegEVYHsFK\",\n  \"$6$rounds=10191$MJHnaAkegEVYHsFK\",\n#endif\n#if INCLUDE_bcrypt_a\n  \"$2a$05$UBVLHeMpJ/QQCv3XqJx8zO\",\n#endif\n#if INCLUDE_bcrypt\n  \"$2b$05$UBVLHeMpJ/QQCv3XqJx8zO\",\n#endif\n#if INCLUDE_bcrypt_x\n  \"$2x$05$UBVLHeMpJ/QQCv3XqJx8zO\",\n#endif\n#if INCLUDE_bcrypt_y\n  \"$2y$05$UBVLHeMpJ/QQCv3XqJx8zO\",\n#endif\n#if INCLUDE_yescrypt\n  \"$y$j9T$MJHnaAkegEVYHsFKkmfzJ1\",\n#endif\n#if INCLUDE_scrypt\n  \"$7$CU..../....MJHnaAkegEVYHsFKkmfzJ1\",\n#endif\n#if INCLUDE_gost_yescrypt\n  \"$gy$j9T$MJHnaAkegEVYHsFKkmfzJ1\",\n#endif\n#if INCLUDE_sm3_yescrypt\n  \"$sm3y$j9T$MJHnaAkegEVYHsFKkmfzJ1\",\n#endif\n};\n\n/* In some of the tests below, a segmentation fault is the expected result.  */\nstatic sigjmp_buf env;\nstatic void\nsegv_handler (int sig)\n{\n  siglongjmp (env, sig);\n}\n\nstatic bool error_occurred;\n\n#ifndef XCRYPT_USE_ASAN /* see comments in do_tests */\nstatic void\nexpect_no_fault (const char *tag,\n                 const char *phrase, const char *setting, const char *expect,\n                 void (*testfn) (const char *, const char *,\n                                 const char *, const char *))\n{\n  int rv = sigsetjmp (env, 1);\n  if (!rv)\n    testfn (tag, phrase, setting, expect);\n  else\n    {\n      printf (\"FAIL: %s: Unexpected %s\\n\", tag, strsignal (rv));\n      error_occurred = 1;\n    }\n}\n#endif\n\nstatic void\nexpect_a_fault (const char *tag,\n                const char *phrase, const char *setting, const char *expect,\n                void (*testfn) (const char *, const char *,\n                                const char *, const char *))\n{\n  int rv = sigsetjmp (env, 1);\n  if (!rv)\n    {\n      testfn (tag, phrase, setting, expect);\n      printf (\"ERROR: %s: No signal occurred\\n\", tag);\n      error_occurred = true;\n    }\n}\n\nstatic void\ncheck (const char *tag, const char *expect, const char *got)\n{\n  int err = errno;\n  if ((got == 0 && expect != 0)\n      || (got != 0 && expect == 0)\n      || (got != 0 && expect != 0 && strcmp(got, expect) != 0))\n    {\n      printf (\"FAIL: %s: exp '%s' got '%s'\\n\",\n              tag, expect ? expect : \"(nil)\",\n              got ? got : \"(nil)\");\n      error_occurred = true;\n    }\n  if ((expect == 0 || expect[0] == '*') && err != EINVAL)\n    {\n      printf (\"FAIL: %s: exp '%s' got '%s'\\n\",\n              tag, strerror (EINVAL), strerror (err));\n      error_occurred = true;\n    }\n}\n\nstatic void\ntest_crypt (const char *tag,\n            const char *phrase, const char *setting, const char *expect)\n{\n  char *got = crypt (phrase, setting);\n  check (tag, expect, got);\n}\n\nstatic void\ntest_crypt_r (const char *tag,\n              const char *phrase, const char *setting, const char *expect)\n{\n  struct crypt_data data;\n  memset (&data, 0, sizeof data);\n  char *got = crypt_r (phrase, setting, &data);\n  check (tag, expect, got);\n}\n\nstatic void\ntest_crypt_rn (const char *tag,\n               const char *phrase, const char *setting, const char *expect)\n{\n  struct crypt_data data;\n  memset (&data, 0, sizeof data);\n\n  char *got = crypt_rn (phrase, setting, &data, (int) sizeof data);\n  check (tag, expect, got);\n}\n\nstatic void\ntest_crypt_ra (const char *tag,\n               const char *phrase, const char *setting, const char *expect)\n{\n  /* cheat - crypt_ra doesn't actually care whether its scratch area\n     is on the heap as long as it's big enough */\n  struct crypt_data data;\n  memset (&data, 0, sizeof data);\n  void *datap = &data;\n  int datas = (int) sizeof data;\n\n  char *got = crypt_ra (phrase, setting, &datap, &datas);\n  check (tag, expect, got);\n}\n\n#if ENABLE_FAILURE_TOKENS\n# define FT0 \"*0\"\n# define FT1 \"*1\"\n#else\n# define FT0 0\n# define FT1 0\n#endif\n\n/* PAGE should point to PAGESIZE bytes of read-write memory followed\n   by another PAGESIZE bytes of inaccessible memory.  */\n\nstatic void\ndo_tests(char *page, size_t pagesize)\n{\n  static const char phrase[] =\n    \"the ritual question of how much is two plus two\";\n\n  /* This copy operation intentionally omits the NUL; 'p1' points to a\n     sequence of nonzero bytes followed immediately by inaccessible\n     memory.  */\n  memcpy (page + pagesize - (sizeof phrase - 1), phrase, sizeof phrase - 1);\n  const char *p1 = page + pagesize - (sizeof phrase - 1);\n  const char *p2 = page + pagesize;\n  size_t i;\n\n  /* Our crypt*() functions return NULL / a failure token, with errno set\n     to EINVAL, when either the setting or the phrase argument is NULL.\n     ASan's interceptors for crypt*() instead crash the program when either\n     argument is NULL -- this is arguably a better choice, but for\n     compatibility's sake we can't change what our functions do.  There is\n     no way to disable interception of specific functions as far as I can\n     tell.  Therefore, these tests are skipped when compiled with ASan.  */\n#ifndef XCRYPT_USE_ASAN\n  /* When SETTING is null, it shouldn't matter what PHRASE is.  */\n  expect_no_fault (\"0.0.crypt\",    0,  0, FT0, test_crypt);\n  expect_no_fault (\"0.0.crypt_r\",  0,  0, FT0, test_crypt_r);\n  expect_no_fault (\"0.0.crypt_rn\", 0,  0, 0,    test_crypt_rn);\n  expect_no_fault (\"0.0.crypt_ra\", 0,  0, 0,    test_crypt_ra);\n\n  expect_no_fault (\"''.0.crypt\",    \"\", 0, FT0, test_crypt);\n  expect_no_fault (\"''.0.crypt_r\",  \"\", 0, FT0, test_crypt_r);\n  expect_no_fault (\"''.0.crypt_rn\", \"\", 0, 0,    test_crypt_rn);\n  expect_no_fault (\"''.0.crypt_ra\", \"\", 0, 0,    test_crypt_ra);\n\n  expect_no_fault (\"ph.0.crypt\",    phrase, 0, FT0, test_crypt);\n  expect_no_fault (\"ph.0.crypt_r\",  phrase, 0, FT0, test_crypt_r);\n  expect_no_fault (\"ph.0.crypt_rn\", phrase, 0, 0,    test_crypt_rn);\n  expect_no_fault (\"ph.0.crypt_ra\", phrase, 0, 0,    test_crypt_ra);\n\n  expect_no_fault (\"p1.0.crypt\",    p1, 0, FT0, test_crypt);\n  expect_no_fault (\"p1.0.crypt_r\",  p1, 0, FT0, test_crypt_r);\n  expect_no_fault (\"p1.0.crypt_rn\", p1, 0, 0,    test_crypt_rn);\n  expect_no_fault (\"p1.0.crypt_ra\", p1, 0, 0,    test_crypt_ra);\n\n  expect_no_fault (\"p2.0.crypt\",    p2, 0, FT0, test_crypt);\n  expect_no_fault (\"p2.0.crypt_r\",  p2, 0, FT0, test_crypt_r);\n  expect_no_fault (\"p2.0.crypt_rn\", p2, 0, 0,    test_crypt_rn);\n  expect_no_fault (\"p2.0.crypt_ra\", p2, 0, 0,    test_crypt_ra);\n\n  /* Conversely, when PHRASE is null,\n     it shouldn't matter what SETTING is...  */\n  expect_no_fault (\"0.''.crypt\",    0, \"\", FT0,  test_crypt);\n  expect_no_fault (\"0.''.crypt_r\",  0, \"\", FT0,  test_crypt_r);\n  expect_no_fault (\"0.''.crypt_rn\", 0, \"\", 0,    test_crypt_rn);\n  expect_no_fault (\"0.''.crypt_ra\", 0, \"\", 0,    test_crypt_ra);\n\n  expect_no_fault (\"0.'*'.crypt\",    0, \"*\", FT0,  test_crypt);\n  expect_no_fault (\"0.'*'.crypt_r\",  0, \"*\", FT0,  test_crypt_r);\n  expect_no_fault (\"0.'*'.crypt_rn\", 0, \"*\", 0,    test_crypt_rn);\n  expect_no_fault (\"0.'*'.crypt_ra\", 0, \"*\", 0,    test_crypt_ra);\n\n  expect_no_fault (\"0.'*0'.crypt\",    0, \"*0\", FT1,  test_crypt);\n  expect_no_fault (\"0.'*0'.crypt_r\",  0, \"*0\", FT1,  test_crypt_r);\n  expect_no_fault (\"0.'*0'.crypt_rn\", 0, \"*0\", 0,    test_crypt_rn);\n  expect_no_fault (\"0.'*0'.crypt_ra\", 0, \"*0\", 0,    test_crypt_ra);\n\n  expect_no_fault (\"0.'*1'.crypt\",    0, \"*1\", FT0,  test_crypt);\n  expect_no_fault (\"0.'*1'.crypt_r\",  0, \"*1\", FT0,  test_crypt_r);\n  expect_no_fault (\"0.'*1'.crypt_rn\", 0, \"*1\", 0,    test_crypt_rn);\n  expect_no_fault (\"0.'*1'.crypt_ra\", 0, \"*1\", 0,    test_crypt_ra);\n\n  expect_no_fault (\"0.p1.crypt\",    0, p1, FT0,  test_crypt);\n  expect_no_fault (\"0.p1.crypt_r\",  0, p1, FT0,  test_crypt_r);\n  expect_no_fault (\"0.p1.crypt_rn\", 0, p1, 0,    test_crypt_rn);\n  expect_no_fault (\"0.p1.crypt_ra\", 0, p1, 0,    test_crypt_ra);\n\n  /* ... except for the case where SETTING is nonnull but there are\n     fewer than 2 readable characters at SETTING, in which case we'll\n     crash before we get to the null check in do_crypt.  This is a\n     bug, but it's impractical to fix without breaking the property\n     that 'crypt' _never_ creates a failure token that is equal to the\n     setting string, which is more important than this corner case.  */\n  expect_a_fault (\"0.p2.crypt\",    0, p2, FT0,  test_crypt);\n  expect_a_fault (\"0.p2.crypt_r\",  0, p2, FT0,  test_crypt_r);\n  expect_a_fault (\"0.p2.crypt_rn\", 0, p2, 0,    test_crypt_rn);\n  expect_a_fault (\"0.p2.crypt_ra\", 0, p2, 0,    test_crypt_ra);\n#endif /* no ASan */\n\n  /* When SETTING is valid, passing an invalid string as PHRASE should\n     crash reliably.  */\n  for (i = 0; i < ARRAY_SIZE (settings); i++)\n    {\n      snprintf (page, pagesize, \"p1.'%s'.crypt\", settings[i]);\n      expect_a_fault (page, p1, settings[i], FT0,  test_crypt);\n\n      snprintf (page, pagesize, \"p1.'%s'.crypt_r\", settings[i]);\n      expect_a_fault (page, p1, settings[i], FT0,  test_crypt_r);\n\n      snprintf (page, pagesize, \"p1.'%s'.crypt_rn\", settings[i]);\n      expect_a_fault (page, p1, settings[i], 0,    test_crypt_rn);\n\n      snprintf (page, pagesize, \"p1.'%s'.crypt_ra\", settings[i]);\n      expect_a_fault (page, p1, settings[i], 0,    test_crypt_ra);\n\n      snprintf (page, pagesize, \"p2.'%s'.crypt\", settings[i]);\n      expect_a_fault (page, p2, settings[i], FT0,  test_crypt);\n\n      snprintf (page, pagesize, \"p2.'%s'.crypt_r\", settings[i]);\n      expect_a_fault (page, p2, settings[i], FT0,  test_crypt_r);\n\n      snprintf (page, pagesize, \"p2.'%s'.crypt_rn\", settings[i]);\n      expect_a_fault (page, p2, settings[i], 0,    test_crypt_rn);\n\n      snprintf (page, pagesize, \"p2.'%s'.crypt_ra\", settings[i]);\n      expect_a_fault (page, p2, settings[i], 0,    test_crypt_ra);\n    }\n\n  /* Conversely, when PHRASE is valid, passing an invalid string as SETTING\n     should crash reliably.  */\n  expect_a_fault (\"ph.p2.crypt\",    phrase, p2, FT0,  test_crypt);\n  expect_a_fault (\"ph.p2.crypt_r\",  phrase, p2, FT0,  test_crypt_r);\n  expect_a_fault (\"ph.p2.crypt_rn\", phrase, p2, 0,    test_crypt_rn);\n  expect_a_fault (\"ph.p2.crypt_ra\", phrase, p2, 0,    test_crypt_ra);\n\n  for (i = 0; i < ARRAY_SIZE (settings); i++)\n    {\n      p1 = memcpy (page + pagesize - strlen (settings[i]),\n                   settings[i], strlen (settings[i]));\n\n      snprintf (page, pagesize, \"ph.'%s'.crypt\", settings[i]);\n      expect_a_fault (page, phrase, p1, FT0, test_crypt);\n\n      snprintf (page, pagesize, \"ph.'%s'.crypt_r\", settings[i]);\n      expect_a_fault (page, phrase, p1, FT0, test_crypt_r);\n\n      snprintf (page, pagesize, \"ph.'%s'.crypt_rn\", settings[i]);\n      expect_a_fault (page, phrase, p1, 0,    test_crypt_rn);\n\n      snprintf (page, pagesize, \"ph.'%s'.crypt_ra\", settings[i]);\n      expect_a_fault (page, phrase, p1, 0,    test_crypt_ra);\n    }\n}\n\nint\nmain (void)\n{\n  /* Set up a two-page region whose first page is read-write and\n     whose second page is inaccessible.  */\n  long pagesize_l = sysconf (_SC_PAGESIZE);\n  if (pagesize_l < 256)\n    {\n      printf (\"ERROR: pagesize of %ld is too small\\n\", pagesize_l);\n      return 99;\n    }\n\n  size_t pagesize = (size_t) pagesize_l;\n  char *page = mmap (0, pagesize * 2, PROT_READ|PROT_WRITE,\n                     MAP_PRIVATE|MAP_ANON, -1, 0);\n  if (page == MAP_FAILED)\n    {\n      perror (\"mmap\");\n      return 99;\n    }\n  // coverity[overflow_sink]\n  memset (page, 'x', pagesize * 2);\n  if (mprotect (page + pagesize, pagesize, PROT_NONE))\n    {\n      perror (\"mprotect\");\n      return 99;\n    }\n\n  struct sigaction sa, os, ob;\n  sigfillset (&sa.sa_mask);\n  sa.sa_flags = SA_RESTART;\n  sa.sa_handler = segv_handler;\n  if (sigaction (SIGBUS, &sa, &ob) || sigaction (SIGSEGV, &sa, &os))\n    {\n      perror (\"sigaction\");\n      return 1;\n    }\n\n  do_tests (page, pagesize);\n\n  sigaction (SIGBUS, &ob, 0);\n  sigaction (SIGSEGV, &os, 0);\n\n  return error_occurred;\n}\n"
  },
  {
    "path": "test/crypt-gost-yescrypt.c",
    "content": "/* Copyright (C) 2018 vt@altlinux.org\n * Copyright (C) 2018 Björn Esser besser82@fedoraproject.org\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\n#include \"crypt-port.h\"\n\n#if INCLUDE_gost_yescrypt\n\n#include \"alg-gost3411-2012-hmac.h\"\n\n#include <stdio.h>\n\n/* redefine outer hmac to this function to test entropy bypass */\nstatic void\ntest_outer_hmac (const uint8_t *k, size_t n, const uint8_t *t, size_t len,\n                 uint8_t *out32, gost_hmac_256_t *gostbuf);\n#define outer_gost_hmac256 test_outer_hmac\n#include \"../lib/crypt-gost-yescrypt.c\"\n\nstatic int test_mode = 0;\n\nstatic void\ntest_outer_hmac (const uint8_t *k, size_t n, const uint8_t *t, size_t len,\n                 uint8_t *out32, gost_hmac_256_t *gostbuf)\n{\n  const uint8_t zero[32] = {0};\n\n  /* Zero one of arguments to outer hmac. */\n  if (test_mode & 1)\n    {\n      k = zero;\n      n = sizeof (zero);\n    }\n  if (test_mode & 2)\n    {\n      t = zero;\n      len = sizeof (zero);\n    }\n  gost_hmac256 (k, n, t, len, out32, gostbuf);\n}\n\nstatic int\ntest_crypt_raw (int m, int p, int s, char **a, size_t *a_size)\n{\n  char output[CRYPT_OUTPUT_SIZE];\n  char pass[CRYPT_MAX_PASSPHRASE_SIZE];\n  char pref[CRYPT_GENSALT_OUTPUT_SIZE];\n  char scratch[ALG_SPECIFIC_SIZE];\n  char *salt;\n\n  test_mode = m;\n  fprintf (stderr, \".\");\n  snprintf (pass, sizeof (pass), \"%d\", p);\n  snprintf (pref, sizeof (pref), \"%15d\", s);\n  salt = crypt_gensalt (\"$gy$\", 0, pref, (int) strlen(pref) + 1);\n  if (!salt || salt[0] == '*')\n    {\n      fprintf(stderr, \"ERROR: entropy test (gensalt) [%s]\\n\", pref);\n      return 1;\n    }\n  crypt_gost_yescrypt_rn (pass, strlen (pass), salt, strlen (salt),\n                          (uint8_t *) output, sizeof (output),\n                          scratch, sizeof (scratch));\n  if (output[0] == '*')\n    {\n      fprintf(stderr, \"ERROR: entropy test (crypt)\\n\");\n      return 1;\n    }\n  char *h = strrchr (output, '$') + 1;\n  if (*a && strstr (*a, h))\n    {\n      fprintf (stderr, \"ERROR: duplicated hash %s\\n\", output);\n      return 1;\n    }\n  size_t len = strlen(h);\n  *a = realloc (*a, *a_size + len + 1);\n  strcpy (*a + *a_size, h);\n  *a_size += len;\n  (*a)[*a_size] = '\\0';\n\n  return 0;\n}\n\nint\nmain (void)\n{\n  int result = 0;\n\n  /* Entropy tests\n   * Replace left then right argument of outer hmac() with constant\n   * and do hashing, verifying that output hashes are still different\n   * when password or salt are changing.\n   * Thus, we prove that entropy is still passing to the output not\n   * depending on yescrypt. */\n\n  int m, pp, ss;\n  int etest = 0;\n  char **a = malloc (sizeof (char*));\n  size_t *a_size = malloc (sizeof (size_t));\n\n  *a = malloc (sizeof (char));\n  (*a)[0] = '\\0';\n  *a_size = 0;\n\n  for (m = 1; m < 3; m++)\n    {\n      for (pp = 0; pp < 22; pp++)\n        etest |= test_crypt_raw (m, pp, 0, a, a_size);\n      for (ss = 0; ss < 22; ss++)\n        etest |= test_crypt_raw (m, pp, ss, a, a_size);\n    }\n  fprintf (stderr, \"\\n\");\n  if (etest)\n    fprintf (stderr, \"ERROR: entropy test failed.\\n\");\n  else\n    fprintf (stderr, \"   ok: entropy test\\n\");\n  result |= etest;\n\n  free (*a);\n  free (a);\n  free (a_size);\n\n  return result;\n}\n\n#else\n\nint\nmain (void)\n{\n  return 77; /* UNSUPPORTED */\n}\n\n#endif /* INCLUDE_gost_yescrypt */\n"
  },
  {
    "path": "test/crypt-nested-call.c",
    "content": "/*\n * Copyright (c) 2025 Björn Esser <besser82 at fedoraproject.org>\n * All rights reserved.\n *\n * Permission to use, copy, modify, and/or distribute this software for any\n * purpose with or without fee is hereby granted.\n *\n * THE SOFTWARE IS PROVIDED “AS IS” AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n */\n\n#include \"crypt-port.h\"\n#include <stdlib.h>\n#include <stdio.h>\n\n#define PASSW \"alexander\"\n\nstatic const char *settings[] =\n{\n#if INCLUDE_descrypt\n  \"Mp\",\n#endif\n#if INCLUDE_bigcrypt\n  \"Mp............\",\n#endif\n#if INCLUDE_bsdicrypt\n  \"_J9..MJHn\",\n#endif\n#if INCLUDE_md5crypt\n  \"$1$MJHnaAke\",\n#endif\n#if INCLUDE_nt\n  \"$3$\",\n#endif\n#if INCLUDE_sunmd5\n  \"$md5$BPm.fm03$\",\n#endif\n#if INCLUDE_sm3crypt\n  \"$sm3$MJHnaAkegEVYHsFK\",\n#endif\n#if INCLUDE_sha1crypt\n  \"$sha1$248488$ggu.H673kaZ5$\",\n#endif\n#if INCLUDE_sha256crypt\n  \"$5$MJHnaAkegEVYHsFK\",\n#endif\n#if INCLUDE_sha512crypt\n  \"$6$MJHnaAkegEVYHsFK\",\n#endif\n#if INCLUDE_bcrypt_a\n  \"$2a$05$UBVLHeMpJ/QQCv3XqJx8zO\",\n#endif\n#if INCLUDE_bcrypt\n  \"$2b$05$UBVLHeMpJ/QQCv3XqJx8zO\",\n#endif\n#if INCLUDE_bcrypt_y\n  \"$2y$05$UBVLHeMpJ/QQCv3XqJx8zO\",\n#endif\n#if INCLUDE_bcrypt_x\n  \"$2x$05$UBVLHeMpJ/QQCv3XqJx8zO\",\n#endif\n#if INCLUDE_yescrypt\n  \"$y$j9T$MJHnaAkegEVYHsFKkmfzJ1\",\n#endif\n#if INCLUDE_scrypt\n  \"$7$CU..../....MJHnaAkegEVYHsFKkmfzJ1\",\n#endif\n#if INCLUDE_gost_yescrypt\n  \"$gy$j9T$MJHnaAkegEVYHsFKkmfzJ1\",\n#endif\n#if INCLUDE_sm3_yescrypt\n  \"$sm3y$j9T$MJHnaAkegEVYHsFKkmfzJ1\",\n#endif\n};\n\nint\nmain (void)\n{\n  char *retval = NULL;\n  int status = 0;\n  struct crypt_data cd;\n  struct crypt_data *p = &cd;\n  int cd_size = (int) sizeof (cd);\n\n  for (size_t i = 0; i < ARRAY_SIZE (settings); i++)\n    {\n      retval = crypt (PASSW, settings[i]);\n      retval = crypt (PASSW, retval);\n\n      if (!retval || *retval == '*')\n        {\n          printf (\"Subsequent call to crypt(3) with output as setting \"\n                  \"failed for prefix \\\"%s\\\".\\n\",\n                  settings[i]);\n          status = 1;\n        }\n\n      // coverity[var_deref_model]\n      retval = crypt (retval, settings[i]);\n\n      if (!retval || *retval == '*')\n        {\n          printf (\"Subsequent call to crypt(3) with output as key \"\n                  \"failed for prefix \\\"%s\\\".\\n\",\n                  settings[i]);\n          status = 1;\n        }\n\n      retval = crypt_r (PASSW, settings[i], p);\n      retval = crypt_r (PASSW, retval, p);\n\n      if (!retval || *retval == '*')\n        {\n          printf (\"Subsequent call to crypt_r(3) with output as setting \"\n                  \"failed for prefix \\\"%s\\\".\\n\",\n                  settings[i]);\n          status = 1;\n        }\n\n      retval = crypt_r (retval, settings[i], p);\n\n      if (!retval || *retval == '*')\n        {\n          printf (\"Subsequent call to crypt_r(3) with output as key \"\n                  \"failed for prefix \\\"%s\\\".\\n\",\n                  settings[i]);\n          status = 1;\n        }\n\n      retval = crypt_rn (PASSW, settings[i], p, cd_size);\n      retval = crypt_rn (PASSW, retval, p, cd_size);\n\n      if (!retval || *retval == '*')\n        {\n          printf (\"Subsequent call to crypt_rn(3) with output as setting \"\n                  \"failed for prefix \\\"%s\\\".\\n\",\n                  settings[i]);\n          status = 1;\n        }\n\n      retval = crypt_rn (retval, settings[i], p, cd_size);\n\n      if (!retval || *retval == '*')\n        {\n          printf (\"Subsequent call to crypt_rn(3) with output as key \"\n                  \"failed for prefix \\\"%s\\\".\\n\",\n                  settings[i]);\n          status = 1;\n        }\n\n      retval = crypt_ra (PASSW, settings[i], (void **) &p, &cd_size);\n      retval = crypt_ra (PASSW, retval, (void **) &p, &cd_size);\n\n      if (!retval || *retval == '*')\n        {\n          printf (\"Subsequent call to crypt_ra(3) with output as setting \"\n                  \"failed for prefix \\\"%s\\\".\\n\",\n                  settings[i]);\n          status = 1;\n        }\n\n      retval = crypt_ra (retval, settings[i], (void **) &p, &cd_size);\n\n      if (!retval || *retval == '*')\n        {\n          printf (\"Subsequent call to crypt_ra(3) with output as key \"\n                  \"failed for prefix \\\"%s\\\".\\n\",\n                  settings[i]);\n          status = 1;\n        }\n    }\n\n  explicit_bzero (&cd, sizeof cd);\n  return status;\n}\n"
  },
  {
    "path": "test/crypt-sm3-yescrypt.c",
    "content": "/* Copyright (C) 2018 vt@altlinux.org\n * Copyright (C) 2018, 2024 Björn Esser besser82@fedoraproject.org\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\n#include \"crypt-port.h\"\n\n#if INCLUDE_sm3_yescrypt\n\n#include \"alg-sm3-hmac.h\"\n\n#include <stdio.h>\n\n/* redefine outer hmac to this function to test entropy bypass */\nstatic void\ntest_outer_hmac (const uint8_t *k, size_t n, const uint8_t *t, size_t len,\n                 uint8_t *out, sm3_hmac_ctx_t *sm3buf);\n#define outer_sm3_hmac test_outer_hmac\n#include \"../lib/crypt-sm3-yescrypt.c\"\n\nstatic int test_mode = 0;\n\nstatic void\ntest_outer_hmac (const uint8_t *k, size_t n, const uint8_t *t, size_t len,\n                 uint8_t *out, sm3_hmac_ctx_t *sm3buf)\n{\n  const uint8_t zero[32] = {0};\n\n  /* Zero one of arguments to outer hmac. */\n  if (test_mode & 1)\n    {\n      k = zero;\n      n = sizeof (zero);\n    }\n  if (test_mode & 2)\n    {\n      t = zero;\n      len = sizeof (zero);\n    }\n  sm3_hmac (k, n, t, len, out, sm3buf);\n}\n\nstatic int\ntest_crypt_raw (int m, int p, int s, char **a, size_t *a_size)\n{\n  char output[CRYPT_OUTPUT_SIZE];\n  char pass[CRYPT_MAX_PASSPHRASE_SIZE];\n  char pref[CRYPT_GENSALT_OUTPUT_SIZE];\n  char scratch[ALG_SPECIFIC_SIZE];\n  char *salt;\n\n  test_mode = m;\n  fprintf (stderr, \".\");\n  snprintf (pass, sizeof (pass), \"%d\", p);\n  snprintf (pref, sizeof (pref), \"%15d\", s);\n  salt = crypt_gensalt (\"$sm3y$\", 0, pref, (int) strlen(pref) + 1);\n  if (!salt || salt[0] == '*')\n    {\n      fprintf(stderr, \"ERROR: entropy test (gensalt) [%s]\\n\", pref);\n      return 1;\n    }\n  crypt_sm3_yescrypt_rn (pass, strlen (pass), salt, strlen (salt),\n                         (uint8_t *) output, sizeof (output),\n                         scratch, sizeof (scratch));\n  if (output[0] == '*')\n    {\n      fprintf(stderr, \"ERROR: entropy test (crypt)\\n\");\n      return 1;\n    }\n  char *h = strrchr (output, '$') + 1;\n  if (*a && strstr (*a, h))\n    {\n      fprintf (stderr, \"ERROR: duplicated hash %s\\n\", output);\n      return 1;\n    }\n  size_t len = strlen(h);\n  *a = realloc (*a, *a_size + len + 1);\n  strcpy (*a + *a_size, h);\n  *a_size += len;\n  (*a)[*a_size] = '\\0';\n\n  return 0;\n}\n\nint\nmain (void)\n{\n  int result = 0;\n\n  /* Entropy tests\n   * Replace left then right argument of outer hmac() with constant\n   * and do hashing, verifying that output hashes are still different\n   * when password or salt are changing.\n   * Thus, we prove that entropy is still passing to the output not\n   * depending on yescrypt. */\n\n  int m, pp, ss;\n  int etest = 0;\n  char **a = malloc (sizeof (char*));\n  size_t *a_size = malloc (sizeof (size_t));\n\n  *a = malloc (sizeof (char));\n  (*a)[0] = '\\0';\n  *a_size = 0;\n\n  for (m = 1; m < 3; m++)\n    {\n      for (pp = 0; pp < 22; pp++)\n        etest |= test_crypt_raw (m, pp, 0, a, a_size);\n      for (ss = 0; ss < 22; ss++)\n        etest |= test_crypt_raw (m, pp, ss, a, a_size);\n    }\n  fprintf (stderr, \"\\n\");\n  if (etest)\n    fprintf (stderr, \"ERROR: entropy test failed.\\n\");\n  else\n    fprintf (stderr, \"   ok: entropy test\\n\");\n  result |= etest;\n\n  free (*a);\n  free (a);\n  free (a_size);\n\n  return result;\n}\n\n#else\n\nint\nmain (void)\n{\n  return 77; /* UNSUPPORTED */\n}\n\n#endif /* INCLUDE_sm3_yescrypt */\n"
  },
  {
    "path": "test/crypt-too-long-phrase.c",
    "content": "/*\n * Copyright (c) 2025 Björn Esser <besser82 at fedoraproject.org>\n * All rights reserved.\n *\n * Permission to use, copy, modify, and/or distribute this software for any\n * purpose with or without fee is hereby granted.\n *\n * THE SOFTWARE IS PROVIDED “AS IS” AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n */\n\n#include \"crypt-port.h\"\n#include <errno.h>\n#include <stdlib.h>\n#include <stdio.h>\n\nstatic const char *settings[] =\n{\n#if INCLUDE_descrypt\n  \"Mp\",\n#endif\n#if INCLUDE_bigcrypt\n  \"Mp............\",\n#endif\n#if INCLUDE_bsdicrypt\n  \"_J9..MJHn\",\n#endif\n#if INCLUDE_md5crypt\n  \"$1$MJHnaAke\",\n#endif\n#if INCLUDE_nt\n  \"$3$\",\n#endif\n#if INCLUDE_sunmd5\n  \"$md5$BPm.fm03$\",\n#endif\n#if INCLUDE_sm3crypt\n  \"$sm3$MJHnaAkegEVYHsFK\",\n#endif\n#if INCLUDE_sha1crypt\n  \"$sha1$248488$ggu.H673kaZ5$\",\n#endif\n#if INCLUDE_sha256crypt\n  \"$5$MJHnaAkegEVYHsFK\",\n#endif\n#if INCLUDE_sha512crypt\n  \"$6$MJHnaAkegEVYHsFK\",\n#endif\n#if INCLUDE_bcrypt_a\n  \"$2a$05$UBVLHeMpJ/QQCv3XqJx8zO\",\n#endif\n#if INCLUDE_bcrypt\n  \"$2b$05$UBVLHeMpJ/QQCv3XqJx8zO\",\n#endif\n#if INCLUDE_bcrypt_y\n  \"$2y$05$UBVLHeMpJ/QQCv3XqJx8zO\",\n#endif\n#if INCLUDE_bcrypt_x\n  \"$2x$05$UBVLHeMpJ/QQCv3XqJx8zO\",\n#endif\n#if INCLUDE_yescrypt\n  \"$y$j9T$MJHnaAkegEVYHsFKkmfzJ1\",\n#endif\n#if INCLUDE_scrypt\n  \"$7$CU..../....MJHnaAkegEVYHsFKkmfzJ1\",\n#endif\n#if INCLUDE_gost_yescrypt\n  \"$gy$j9T$MJHnaAkegEVYHsFKkmfzJ1\",\n#endif\n#if INCLUDE_sm3_yescrypt\n  \"$sm3y$j9T$MJHnaAkegEVYHsFKkmfzJ1\",\n#endif\n};\n\nint\nmain (void)\n{\n  char *retval = NULL;\n  char phrase[CRYPT_MAX_PASSPHRASE_SIZE * 2];\n  int status = 0;\n  struct crypt_data crypt_ctx;\n\n  memset (phrase, 'a', sizeof phrase);\n  phrase[sizeof phrase - 1] = '\\0';\n\n  for (size_t i = 0; i < ARRAY_SIZE (settings); i++)\n    {\n      struct crypt_data *cd = &crypt_ctx;\n      void **data = (void **) &cd;\n      int size = sizeof crypt_ctx;\n\n      memset (cd, 0, sizeof crypt_ctx);\n      errno = 0;\n      retval = crypt (phrase, settings[i]);\n\n      if ((retval && retval[0] != '*') || errno != ERANGE)\n        {\n          printf (\"crypt(3) returned unexpectedly.\\n\"\n                  \"setting: %s\\ngot: %s\\nERRNO: %d, %s\\n\",\n                  settings[i], retval, errno, strerror (errno));\n          status = 1;\n        }\n\n      errno = 0;\n      retval = crypt_r (phrase, settings[i], cd);\n\n      if ((retval && retval[0] != '*') || errno != ERANGE)\n        {\n          printf (\"crypt_r(3) returned unexpectedly.\\n\"\n                  \"setting: %s\\ngot: %s\\nERRNO: %d, %s\\n\",\n                  settings[i], retval, errno, strerror (errno));\n          status = 1;\n        }\n\n      errno = 0;\n      retval = crypt_rn (phrase, settings[i], cd, size);\n\n      if (retval || errno != ERANGE)\n        {\n          printf (\"crypt_rn(3) returned unexpectedly.\\n\"\n                  \"setting: %s\\ngot: %s\\nERRNO: %d, %s\\n\",\n                  settings[i], retval, errno, strerror (errno));\n          status = 1;\n        }\n\n      errno = 0;\n      retval = crypt_ra (phrase, settings[i], data, &size);\n\n      if (retval || errno != ERANGE)\n        {\n          printf (\"crypt_ra(3) (pre-alloc) returned unexpectedly.\\n\"\n                  \"setting: %s\\ngot: %s\\nERRNO: %d, %s\\n\",\n                  settings[i], retval, errno, strerror (errno));\n          status = 1;\n        }\n\n      *data = NULL;\n      size = 0;\n      errno = 0;\n      retval = crypt_ra (phrase, settings[i], data, &size);\n\n      if (retval || errno != ERANGE)\n        {\n          printf (\"crypt_ra(3) (new alloc) returned unexpectedly.\\n\"\n                  \"setting: %s\\ngot: %s\\nERRNO: %d, %s\\n\",\n                  settings[i], retval, errno, strerror (errno));\n          status = 1;\n        }\n      free (*data);\n    }\n  return status;\n}\n"
  },
  {
    "path": "test/des-cases.h",
    "content": "/*\n * These test vectors for the DES primitive block cipher are derived\n * from Phil Karns' PD DES package.  They are used to test both the\n * raw encryption primitive (des.c) and the obsolete setkey/encrypt\n * API that wraps it (des-obsolete.c).\n *\n * @(#)cert.c   1.8 11 Aug 1996\n */\n\n#ifndef _CRYPT_TEST_DES_CASES_H\n#define _CRYPT_TEST_DES_CASES_H 1\n\nstruct des_testcase\n{\n  unsigned char key[8 + 1];\n  unsigned char plain[8 + 1];\n  unsigned char answer[8 + 1];\n};\n\nstatic const struct des_testcase des_testcases[] =\n{\n  { \"\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\", \"\\x95\\xf8\\xa5\\xe5\\xdd\\x31\\xd9\\x00\", \"\\x80\\x00\\x00\\x00\\x00\\x00\\x00\\x00\" },\n  { \"\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\", \"\\xdd\\x7f\\x12\\x1c\\xa5\\x01\\x56\\x19\", \"\\x40\\x00\\x00\\x00\\x00\\x00\\x00\\x00\" },\n  { \"\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\", \"\\x2e\\x86\\x53\\x10\\x4f\\x38\\x34\\xea\", \"\\x20\\x00\\x00\\x00\\x00\\x00\\x00\\x00\" },\n  { \"\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\", \"\\x4b\\xd3\\x88\\xff\\x6c\\xd8\\x1d\\x4f\", \"\\x10\\x00\\x00\\x00\\x00\\x00\\x00\\x00\" },\n  { \"\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\", \"\\x20\\xb9\\xe7\\x67\\xb2\\xfb\\x14\\x56\", \"\\x08\\x00\\x00\\x00\\x00\\x00\\x00\\x00\" },\n  { \"\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\", \"\\x55\\x57\\x93\\x80\\xd7\\x71\\x38\\xef\", \"\\x04\\x00\\x00\\x00\\x00\\x00\\x00\\x00\" },\n  { \"\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\", \"\\x6c\\xc5\\xde\\xfa\\xaf\\x04\\x51\\x2f\", \"\\x02\\x00\\x00\\x00\\x00\\x00\\x00\\x00\" },\n  { \"\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\", \"\\x0d\\x9f\\x27\\x9b\\xa5\\xd8\\x72\\x60\", \"\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\" },\n  { \"\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\", \"\\xd9\\x03\\x1b\\x02\\x71\\xbd\\x5a\\x0a\", \"\\x00\\x80\\x00\\x00\\x00\\x00\\x00\\x00\" },\n  { \"\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\", \"\\x42\\x42\\x50\\xb3\\x7c\\x3d\\xd9\\x51\", \"\\x00\\x40\\x00\\x00\\x00\\x00\\x00\\x00\" },\n  { \"\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\", \"\\xb8\\x06\\x1b\\x7e\\xcd\\x9a\\x21\\xe5\", \"\\x00\\x20\\x00\\x00\\x00\\x00\\x00\\x00\" },\n  { \"\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\", \"\\xf1\\x5d\\x0f\\x28\\x6b\\x65\\xbd\\x28\", \"\\x00\\x10\\x00\\x00\\x00\\x00\\x00\\x00\" },\n  { \"\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\", \"\\xad\\xd0\\xcc\\x8d\\x6e\\x5d\\xeb\\xa1\", \"\\x00\\x08\\x00\\x00\\x00\\x00\\x00\\x00\" },\n  { \"\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\", \"\\xe6\\xd5\\xf8\\x27\\x52\\xad\\x63\\xd1\", \"\\x00\\x04\\x00\\x00\\x00\\x00\\x00\\x00\" },\n  { \"\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\", \"\\xec\\xbf\\xe3\\xbd\\x3f\\x59\\x1a\\x5e\", \"\\x00\\x02\\x00\\x00\\x00\\x00\\x00\\x00\" },\n  { \"\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\", \"\\xf3\\x56\\x83\\x43\\x79\\xd1\\x65\\xcd\", \"\\x00\\x01\\x00\\x00\\x00\\x00\\x00\\x00\" },\n  { \"\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\", \"\\x2b\\x9f\\x98\\x2f\\x20\\x03\\x7f\\xa9\", \"\\x00\\x00\\x80\\x00\\x00\\x00\\x00\\x00\" },\n  { \"\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\", \"\\x88\\x9d\\xe0\\x68\\xa1\\x6f\\x0b\\xe6\", \"\\x00\\x00\\x40\\x00\\x00\\x00\\x00\\x00\" },\n  { \"\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\", \"\\xe1\\x9e\\x27\\x5d\\x84\\x6a\\x12\\x98\", \"\\x00\\x00\\x20\\x00\\x00\\x00\\x00\\x00\" },\n  { \"\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\", \"\\x32\\x9a\\x8e\\xd5\\x23\\xd7\\x1a\\xec\", \"\\x00\\x00\\x10\\x00\\x00\\x00\\x00\\x00\" },\n  { \"\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\", \"\\xe7\\xfc\\xe2\\x25\\x57\\xd2\\x3c\\x97\", \"\\x00\\x00\\x08\\x00\\x00\\x00\\x00\\x00\" },\n  { \"\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\", \"\\x12\\xa9\\xf5\\x81\\x7f\\xf2\\xd6\\x5d\", \"\\x00\\x00\\x04\\x00\\x00\\x00\\x00\\x00\" },\n  { \"\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\", \"\\xa4\\x84\\xc3\\xad\\x38\\xdc\\x9c\\x19\", \"\\x00\\x00\\x02\\x00\\x00\\x00\\x00\\x00\" },\n  { \"\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\", \"\\xfb\\xe0\\x0a\\x8a\\x1e\\xf8\\xad\\x72\", \"\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00\" },\n  { \"\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\", \"\\x75\\x0d\\x07\\x94\\x07\\x52\\x13\\x63\", \"\\x00\\x00\\x00\\x80\\x00\\x00\\x00\\x00\" },\n  { \"\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\", \"\\x64\\xfe\\xed\\x9c\\x72\\x4c\\x2f\\xaf\", \"\\x00\\x00\\x00\\x40\\x00\\x00\\x00\\x00\" },\n  { \"\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\", \"\\xf0\\x2b\\x26\\x3b\\x32\\x8e\\x2b\\x60\", \"\\x00\\x00\\x00\\x20\\x00\\x00\\x00\\x00\" },\n  { \"\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\", \"\\x9d\\x64\\x55\\x5a\\x9a\\x10\\xb8\\x52\", \"\\x00\\x00\\x00\\x10\\x00\\x00\\x00\\x00\" },\n  { \"\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\", \"\\xd1\\x06\\xff\\x0b\\xed\\x52\\x55\\xd7\", \"\\x00\\x00\\x00\\x08\\x00\\x00\\x00\\x00\" },\n  { \"\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\", \"\\xe1\\x65\\x2c\\x6b\\x13\\x8c\\x64\\xa5\", \"\\x00\\x00\\x00\\x04\\x00\\x00\\x00\\x00\" },\n  { \"\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\", \"\\xe4\\x28\\x58\\x11\\x86\\xec\\x8f\\x46\", \"\\x00\\x00\\x00\\x02\\x00\\x00\\x00\\x00\" },\n  { \"\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\", \"\\xae\\xb5\\xf5\\xed\\xe2\\x2d\\x1a\\x36\", \"\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\" },\n  { \"\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\", \"\\xe9\\x43\\xd7\\x56\\x8a\\xec\\x0c\\x5c\", \"\\x00\\x00\\x00\\x00\\x80\\x00\\x00\\x00\" },\n  { \"\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\", \"\\xdf\\x98\\xc8\\x27\\x6f\\x54\\xb0\\x4b\", \"\\x00\\x00\\x00\\x00\\x40\\x00\\x00\\x00\" },\n  { \"\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\", \"\\xb1\\x60\\xe4\\x68\\x0f\\x6c\\x69\\x6f\", \"\\x00\\x00\\x00\\x00\\x20\\x00\\x00\\x00\" },\n  { \"\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\", \"\\xfa\\x07\\x52\\xb0\\x7d\\x9c\\x4a\\xb8\", \"\\x00\\x00\\x00\\x00\\x10\\x00\\x00\\x00\" },\n  { \"\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\", \"\\xca\\x3a\\x2b\\x03\\x6d\\xbc\\x85\\x02\", \"\\x00\\x00\\x00\\x00\\x08\\x00\\x00\\x00\" },\n  { \"\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\", \"\\x5e\\x09\\x05\\x51\\x7b\\xb5\\x9b\\xcf\", \"\\x00\\x00\\x00\\x00\\x04\\x00\\x00\\x00\" },\n  { \"\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\", \"\\x81\\x4e\\xeb\\x3b\\x91\\xd9\\x07\\x26\", \"\\x00\\x00\\x00\\x00\\x02\\x00\\x00\\x00\" },\n  { \"\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\", \"\\x4d\\x49\\xdb\\x15\\x32\\x91\\x9c\\x9f\", \"\\x00\\x00\\x00\\x00\\x01\\x00\\x00\\x00\" },\n  { \"\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\", \"\\x25\\xeb\\x5f\\xc3\\xf8\\xcf\\x06\\x21\", \"\\x00\\x00\\x00\\x00\\x00\\x80\\x00\\x00\" },\n  { \"\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\", \"\\xab\\x6a\\x20\\xc0\\x62\\x0d\\x1c\\x6f\", \"\\x00\\x00\\x00\\x00\\x00\\x40\\x00\\x00\" },\n  { \"\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\", \"\\x79\\xe9\\x0d\\xbc\\x98\\xf9\\x2c\\xca\", \"\\x00\\x00\\x00\\x00\\x00\\x20\\x00\\x00\" },\n  { \"\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\", \"\\x86\\x6e\\xce\\xdd\\x80\\x72\\xbb\\x0e\", \"\\x00\\x00\\x00\\x00\\x00\\x10\\x00\\x00\" },\n  { \"\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\", \"\\x8b\\x54\\x53\\x6f\\x2f\\x3e\\x64\\xa8\", \"\\x00\\x00\\x00\\x00\\x00\\x08\\x00\\x00\" },\n  { \"\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\", \"\\xea\\x51\\xd3\\x97\\x55\\x95\\xb8\\x6b\", \"\\x00\\x00\\x00\\x00\\x00\\x04\\x00\\x00\" },\n  { \"\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\", \"\\xca\\xff\\xc6\\xac\\x45\\x42\\xde\\x31\", \"\\x00\\x00\\x00\\x00\\x00\\x02\\x00\\x00\" },\n  { \"\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\", \"\\x8d\\xd4\\x5a\\x2d\\xdf\\x90\\x79\\x6c\", \"\\x00\\x00\\x00\\x00\\x00\\x01\\x00\\x00\" },\n  { \"\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\", \"\\x10\\x29\\xd5\\x5e\\x88\\x0e\\xc2\\xd0\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x80\\x00\" },\n  { \"\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\", \"\\x5d\\x86\\xcb\\x23\\x63\\x9d\\xbe\\xa9\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x40\\x00\" },\n  { \"\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\", \"\\x1d\\x1c\\xa8\\x53\\xae\\x7c\\x0c\\x5f\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x20\\x00\" },\n  { \"\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\", \"\\xce\\x33\\x23\\x29\\x24\\x8f\\x32\\x28\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x10\\x00\" },\n  { \"\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\", \"\\x84\\x05\\xd1\\xab\\xe2\\x4f\\xb9\\x42\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x08\\x00\" },\n  { \"\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\", \"\\xe6\\x43\\xd7\\x80\\x90\\xca\\x42\\x07\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x04\\x00\" },\n  { \"\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\", \"\\x48\\x22\\x1b\\x99\\x37\\x74\\x8a\\x23\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x02\\x00\" },\n  { \"\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\", \"\\xdd\\x7c\\x0b\\xbd\\x61\\xfa\\xfd\\x54\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x01\\x00\" },\n  { \"\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\", \"\\x2f\\xbc\\x29\\x1a\\x57\\x0d\\xb5\\xc4\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x80\" },\n  { \"\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\", \"\\xe0\\x7c\\x30\\xd7\\xe4\\xe2\\x6e\\x12\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x40\" },\n  { \"\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\", \"\\x09\\x53\\xe2\\x25\\x8e\\x8e\\x90\\xa1\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x20\" },\n  { \"\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\", \"\\x5b\\x71\\x1b\\xc4\\xce\\xeb\\xf2\\xee\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x10\" },\n  { \"\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\", \"\\xcc\\x08\\x3f\\x1e\\x6d\\x9e\\x85\\xf6\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x08\" },\n  { \"\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\", \"\\xd2\\xfd\\x88\\x67\\xd5\\x0d\\x2d\\xfe\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x04\" },\n  { \"\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\", \"\\x06\\xe7\\xea\\x22\\xce\\x92\\x70\\x8f\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x02\" },\n  { \"\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\", \"\\x16\\x6b\\x40\\xb4\\x4a\\xba\\x4b\\xd6\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x01\" },\n  { \"\\x80\\x01\\x01\\x01\\x01\\x01\\x01\\x01\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\", \"\\x95\\xa8\\xd7\\x28\\x13\\xda\\xa9\\x4d\" },\n  { \"\\x40\\x01\\x01\\x01\\x01\\x01\\x01\\x01\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\", \"\\x0e\\xec\\x14\\x87\\xdd\\x8c\\x26\\xd5\" },\n  { \"\\x20\\x01\\x01\\x01\\x01\\x01\\x01\\x01\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\", \"\\x7a\\xd1\\x6f\\xfb\\x79\\xc4\\x59\\x26\" },\n  { \"\\x10\\x01\\x01\\x01\\x01\\x01\\x01\\x01\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\", \"\\xd3\\x74\\x62\\x94\\xca\\x6a\\x6c\\xf3\" },\n  { \"\\x08\\x01\\x01\\x01\\x01\\x01\\x01\\x01\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\", \"\\x80\\x9f\\x5f\\x87\\x3c\\x1f\\xd7\\x61\" },\n  { \"\\x04\\x01\\x01\\x01\\x01\\x01\\x01\\x01\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\", \"\\xc0\\x2f\\xaf\\xfe\\xc9\\x89\\xd1\\xfc\" },\n  { \"\\x02\\x01\\x01\\x01\\x01\\x01\\x01\\x01\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\", \"\\x46\\x15\\xaa\\x1d\\x33\\xe7\\x2f\\x10\" },\n  { \"\\x01\\x80\\x01\\x01\\x01\\x01\\x01\\x01\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\", \"\\x20\\x55\\x12\\x33\\x50\\xc0\\x08\\x58\" },\n  { \"\\x01\\x40\\x01\\x01\\x01\\x01\\x01\\x01\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\", \"\\xdf\\x3b\\x99\\xd6\\x57\\x73\\x97\\xc8\" },\n  { \"\\x01\\x20\\x01\\x01\\x01\\x01\\x01\\x01\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\", \"\\x31\\xfe\\x17\\x36\\x9b\\x52\\x88\\xc9\" },\n  { \"\\x01\\x10\\x01\\x01\\x01\\x01\\x01\\x01\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\", \"\\xdf\\xdd\\x3c\\xc6\\x4d\\xae\\x16\\x42\" },\n  { \"\\x01\\x08\\x01\\x01\\x01\\x01\\x01\\x01\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\", \"\\x17\\x8c\\x83\\xce\\x2b\\x39\\x9d\\x94\" },\n  { \"\\x01\\x04\\x01\\x01\\x01\\x01\\x01\\x01\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\", \"\\x50\\xf6\\x36\\x32\\x4a\\x9b\\x7f\\x80\" },\n  { \"\\x01\\x02\\x01\\x01\\x01\\x01\\x01\\x01\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\", \"\\xa8\\x46\\x8e\\xe3\\xbc\\x18\\xf0\\x6d\" },\n  { \"\\x01\\x01\\x80\\x01\\x01\\x01\\x01\\x01\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\", \"\\xa2\\xdc\\x9e\\x92\\xfd\\x3c\\xde\\x92\" },\n  { \"\\x01\\x01\\x40\\x01\\x01\\x01\\x01\\x01\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\", \"\\xca\\xc0\\x9f\\x79\\x7d\\x03\\x12\\x87\" },\n  { \"\\x01\\x01\\x20\\x01\\x01\\x01\\x01\\x01\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\", \"\\x90\\xba\\x68\\x0b\\x22\\xae\\xb5\\x25\" },\n  { \"\\x01\\x01\\x10\\x01\\x01\\x01\\x01\\x01\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\", \"\\xce\\x7a\\x24\\xf3\\x50\\xe2\\x80\\xb6\" },\n  { \"\\x01\\x01\\x08\\x01\\x01\\x01\\x01\\x01\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\", \"\\x88\\x2b\\xff\\x0a\\xa0\\x1a\\x0b\\x87\" },\n  { \"\\x01\\x01\\x04\\x01\\x01\\x01\\x01\\x01\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\", \"\\x25\\x61\\x02\\x88\\x92\\x45\\x11\\xc2\" },\n  { \"\\x01\\x01\\x02\\x01\\x01\\x01\\x01\\x01\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\", \"\\xc7\\x15\\x16\\xc2\\x9c\\x75\\xd1\\x70\" },\n  { \"\\x01\\x01\\x01\\x80\\x01\\x01\\x01\\x01\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\", \"\\x51\\x99\\xc2\\x9a\\x52\\xc9\\xf0\\x59\" },\n  { \"\\x01\\x01\\x01\\x40\\x01\\x01\\x01\\x01\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\", \"\\xc2\\x2f\\x0a\\x29\\x4a\\x71\\xf2\\x9f\" },\n  { \"\\x01\\x01\\x01\\x20\\x01\\x01\\x01\\x01\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\", \"\\xee\\x37\\x14\\x83\\x71\\x4c\\x02\\xea\" },\n  { \"\\x01\\x01\\x01\\x10\\x01\\x01\\x01\\x01\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\", \"\\xa8\\x1f\\xbd\\x44\\x8f\\x9e\\x52\\x2f\" },\n  { \"\\x01\\x01\\x01\\x08\\x01\\x01\\x01\\x01\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\", \"\\x4f\\x64\\x4c\\x92\\xe1\\x92\\xdf\\xed\" },\n  { \"\\x01\\x01\\x01\\x04\\x01\\x01\\x01\\x01\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\", \"\\x1a\\xfa\\x9a\\x66\\xa6\\xdf\\x92\\xae\" },\n  { \"\\x01\\x01\\x01\\x02\\x01\\x01\\x01\\x01\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\", \"\\xb3\\xc1\\xcc\\x71\\x5c\\xb8\\x79\\xd8\" },\n  { \"\\x01\\x01\\x01\\x01\\x80\\x01\\x01\\x01\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\", \"\\x19\\xd0\\x32\\xe6\\x4a\\xb0\\xbd\\x8b\" },\n  { \"\\x01\\x01\\x01\\x01\\x40\\x01\\x01\\x01\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\", \"\\x3c\\xfa\\xa7\\xa7\\xdc\\x87\\x20\\xdc\" },\n  { \"\\x01\\x01\\x01\\x01\\x20\\x01\\x01\\x01\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\", \"\\xb7\\x26\\x5f\\x7f\\x44\\x7a\\xc6\\xf3\" },\n  { \"\\x01\\x01\\x01\\x01\\x10\\x01\\x01\\x01\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\", \"\\x9d\\xb7\\x3b\\x3c\\x0d\\x16\\x3f\\x54\" },\n  { \"\\x01\\x01\\x01\\x01\\x08\\x01\\x01\\x01\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\", \"\\x81\\x81\\xb6\\x5b\\xab\\xf4\\xa9\\x75\" },\n  { \"\\x01\\x01\\x01\\x01\\x04\\x01\\x01\\x01\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\", \"\\x93\\xc9\\xb6\\x40\\x42\\xea\\xa2\\x40\" },\n  { \"\\x01\\x01\\x01\\x01\\x02\\x01\\x01\\x01\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\", \"\\x55\\x70\\x53\\x08\\x29\\x70\\x55\\x92\" },\n  { \"\\x01\\x01\\x01\\x01\\x01\\x80\\x01\\x01\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\", \"\\x86\\x38\\x80\\x9e\\x87\\x87\\x87\\xa0\" },\n  { \"\\x01\\x01\\x01\\x01\\x01\\x40\\x01\\x01\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\", \"\\x41\\xb9\\xa7\\x9a\\xf7\\x9a\\xc2\\x08\" },\n  { \"\\x01\\x01\\x01\\x01\\x01\\x20\\x01\\x01\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\", \"\\x7a\\x9b\\xe4\\x2f\\x20\\x09\\xa8\\x92\" },\n  { \"\\x01\\x01\\x01\\x01\\x01\\x10\\x01\\x01\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\", \"\\x29\\x03\\x8d\\x56\\xba\\x6d\\x27\\x45\" },\n  { \"\\x01\\x01\\x01\\x01\\x01\\x08\\x01\\x01\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\", \"\\x54\\x95\\xc6\\xab\\xf1\\xe5\\xdf\\x51\" },\n  { \"\\x01\\x01\\x01\\x01\\x01\\x04\\x01\\x01\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\", \"\\xae\\x13\\xdb\\xd5\\x61\\x48\\x89\\x33\" },\n  { \"\\x01\\x01\\x01\\x01\\x01\\x02\\x01\\x01\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\", \"\\x02\\x4d\\x1f\\xfa\\x89\\x04\\xe3\\x89\" },\n  { \"\\x01\\x01\\x01\\x01\\x01\\x01\\x80\\x01\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\", \"\\xd1\\x39\\x97\\x12\\xf9\\x9b\\xf0\\x2e\" },\n  { \"\\x01\\x01\\x01\\x01\\x01\\x01\\x40\\x01\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\", \"\\x14\\xc1\\xd7\\xc1\\xcf\\xfe\\xc7\\x9e\" },\n  { \"\\x01\\x01\\x01\\x01\\x01\\x01\\x20\\x01\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\", \"\\x1d\\xe5\\x27\\x9d\\xae\\x3b\\xed\\x6f\" },\n  { \"\\x01\\x01\\x01\\x01\\x01\\x01\\x10\\x01\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\", \"\\xe9\\x41\\xa3\\x3f\\x85\\x50\\x13\\x03\" },\n  { \"\\x01\\x01\\x01\\x01\\x01\\x01\\x08\\x01\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\", \"\\xda\\x99\\xdb\\xbc\\x9a\\x03\\xf3\\x79\" },\n  { \"\\x01\\x01\\x01\\x01\\x01\\x01\\x04\\x01\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\", \"\\xb7\\xfc\\x92\\xf9\\x1d\\x8e\\x92\\xe9\" },\n  { \"\\x01\\x01\\x01\\x01\\x01\\x01\\x02\\x01\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\", \"\\xae\\x8e\\x5c\\xaa\\x3c\\xa0\\x4e\\x85\" },\n  { \"\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x80\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\", \"\\x9c\\xc6\\x2d\\xf4\\x3b\\x6e\\xed\\x74\" },\n  { \"\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x40\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\", \"\\xd8\\x63\\xdb\\xb5\\xc5\\x9a\\x91\\xa0\" },\n  { \"\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x20\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\", \"\\xa1\\xab\\x21\\x90\\x54\\x5b\\x91\\xd7\" },\n  { \"\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x10\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\", \"\\x08\\x75\\x04\\x1e\\x64\\xc5\\x70\\xf7\" },\n  { \"\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x08\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\", \"\\x5a\\x59\\x45\\x28\\xbe\\xbe\\xf1\\xcc\" },\n  { \"\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x04\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\", \"\\xfc\\xdb\\x32\\x91\\xde\\x21\\xf0\\xc0\" },\n  { \"\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x02\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\", \"\\x86\\x9e\\xfd\\x7f\\x9f\\x26\\x5a\\x09\" },\n  { \"\\x10\\x46\\x91\\x34\\x89\\x98\\x01\\x31\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\", \"\\x88\\xd5\\x5e\\x54\\xf5\\x4c\\x97\\xb4\" },\n  { \"\\x10\\x07\\x10\\x34\\x89\\x98\\x80\\x20\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\", \"\\x0c\\x0c\\xc0\\x0c\\x83\\xea\\x48\\xfd\" },\n  { \"\\x10\\x07\\x10\\x34\\xc8\\x98\\x01\\x20\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\", \"\\x83\\xbc\\x8e\\xf3\\xa6\\x57\\x01\\x83\" },\n  { \"\\x10\\x46\\x10\\x34\\x89\\x98\\x80\\x20\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\", \"\\xdf\\x72\\x5d\\xca\\xd9\\x4e\\xa2\\xe9\" },\n  { \"\\x10\\x86\\x91\\x15\\x19\\x19\\x01\\x01\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\", \"\\xe6\\x52\\xb5\\x3b\\x55\\x0b\\xe8\\xb0\" },\n  { \"\\x10\\x86\\x91\\x15\\x19\\x58\\x01\\x01\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\", \"\\xaf\\x52\\x71\\x20\\xc4\\x85\\xcb\\xb0\" },\n  { \"\\x51\\x07\\xb0\\x15\\x19\\x58\\x01\\x01\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\", \"\\x0f\\x04\\xce\\x39\\x3d\\xb9\\x26\\xd5\" },\n  { \"\\x10\\x07\\xb0\\x15\\x19\\x19\\x01\\x01\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\", \"\\xc9\\xf0\\x0f\\xfc\\x74\\x07\\x90\\x67\" },\n  { \"\\x31\\x07\\x91\\x54\\x98\\x08\\x01\\x01\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\", \"\\x7c\\xfd\\x82\\xa5\\x93\\x25\\x2b\\x4e\" },\n  { \"\\x31\\x07\\x91\\x94\\x98\\x08\\x01\\x01\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\", \"\\xcb\\x49\\xa2\\xf9\\xe9\\x13\\x63\\xe3\" },\n  { \"\\x10\\x07\\x91\\x15\\xb9\\x08\\x01\\x40\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\", \"\\x00\\xb5\\x88\\xbe\\x70\\xd2\\x3f\\x56\" },\n  { \"\\x31\\x07\\x91\\x15\\x98\\x08\\x01\\x40\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\", \"\\x40\\x6a\\x9a\\x6a\\xb4\\x33\\x99\\xae\" },\n  { \"\\x10\\x07\\xd0\\x15\\x89\\x98\\x01\\x01\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\", \"\\x6c\\xb7\\x73\\x61\\x1d\\xca\\x9a\\xda\" },\n  { \"\\x91\\x07\\x91\\x15\\x89\\x98\\x01\\x01\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\", \"\\x67\\xfd\\x21\\xc1\\x7d\\xbb\\x5d\\x70\" },\n  { \"\\x91\\x07\\xd0\\x15\\x89\\x19\\x01\\x01\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\", \"\\x95\\x92\\xcb\\x41\\x10\\x43\\x07\\x87\" },\n  { \"\\x10\\x07\\xd0\\x15\\x98\\x98\\x01\\x20\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\", \"\\xa6\\xb7\\xff\\x68\\xa3\\x18\\xdd\\xd3\" },\n  { \"\\x10\\x07\\x94\\x04\\x98\\x19\\x01\\x01\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\", \"\\x4d\\x10\\x21\\x96\\xc9\\x14\\xca\\x16\" },\n  { \"\\x01\\x07\\x91\\x04\\x91\\x19\\x04\\x01\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\", \"\\x2d\\xfa\\x9f\\x45\\x73\\x59\\x49\\x65\" },\n  { \"\\x01\\x07\\x91\\x04\\x91\\x19\\x01\\x01\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\", \"\\xb4\\x66\\x04\\x81\\x6c\\x0e\\x07\\x74\" },\n  { \"\\x01\\x07\\x94\\x04\\x91\\x19\\x04\\x01\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\", \"\\x6e\\x7e\\x62\\x21\\xa4\\xf3\\x4e\\x87\" },\n  { \"\\x19\\x07\\x92\\x10\\x98\\x1a\\x01\\x01\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\", \"\\xaa\\x85\\xe7\\x46\\x43\\x23\\x31\\x99\" },\n  { \"\\x10\\x07\\x91\\x19\\x98\\x19\\x08\\x01\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\", \"\\x2e\\x5a\\x19\\xdb\\x4d\\x19\\x62\\xd6\" },\n  { \"\\x10\\x07\\x91\\x19\\x98\\x1a\\x08\\x01\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\", \"\\x23\\xa8\\x66\\xa8\\x09\\xd3\\x08\\x94\" },\n  { \"\\x10\\x07\\x92\\x10\\x98\\x19\\x01\\x01\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\", \"\\xd8\\x12\\xd9\\x61\\xf0\\x17\\xd3\\x20\" },\n  { \"\\x10\\x07\\x91\\x15\\x98\\x19\\x01\\x0b\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\", \"\\x05\\x56\\x05\\x81\\x6e\\x58\\x60\\x8f\" },\n  { \"\\x10\\x04\\x80\\x15\\x98\\x19\\x01\\x01\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\", \"\\xab\\xd8\\x8e\\x8b\\x1b\\x77\\x16\\xf1\" },\n  { \"\\x10\\x04\\x80\\x15\\x98\\x19\\x01\\x02\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\", \"\\x53\\x7a\\xc9\\x5b\\xe6\\x9d\\xa1\\xe1\" },\n  { \"\\x10\\x04\\x80\\x15\\x98\\x19\\x01\\x08\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\", \"\\xae\\xd0\\xf6\\xae\\x3c\\x25\\xcd\\xd8\" },\n  { \"\\x10\\x02\\x91\\x15\\x98\\x10\\x01\\x04\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\", \"\\xb3\\xe3\\x5a\\x5e\\xe5\\x3e\\x7b\\x8d\" },\n  { \"\\x10\\x02\\x91\\x15\\x98\\x19\\x01\\x04\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\", \"\\x61\\xc7\\x9c\\x71\\x92\\x1a\\x2e\\xf8\" },\n  { \"\\x10\\x02\\x91\\x15\\x98\\x10\\x02\\x01\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\", \"\\xe2\\xf5\\x72\\x8f\\x09\\x95\\x01\\x3c\" },\n  { \"\\x10\\x02\\x91\\x16\\x98\\x10\\x01\\x01\", \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\", \"\\x1a\\xea\\xc3\\x9a\\x61\\xf0\\xa4\\x64\" },\n  { \"\\x7c\\xa1\\x10\\x45\\x4a\\x1a\\x6e\\x57\", \"\\x01\\xa1\\xd6\\xd0\\x39\\x77\\x67\\x42\", \"\\x69\\x0f\\x5b\\x0d\\x9a\\x26\\x93\\x9b\" },\n  { \"\\x01\\x31\\xd9\\x61\\x9d\\xc1\\x37\\x6e\", \"\\x5c\\xd5\\x4c\\xa8\\x3d\\xef\\x57\\xda\", \"\\x7a\\x38\\x9d\\x10\\x35\\x4b\\xd2\\x71\" },\n  { \"\\x07\\xa1\\x13\\x3e\\x4a\\x0b\\x26\\x86\", \"\\x02\\x48\\xd4\\x38\\x06\\xf6\\x71\\x72\", \"\\x86\\x8e\\xbb\\x51\\xca\\xb4\\x59\\x9a\" },\n  { \"\\x38\\x49\\x67\\x4c\\x26\\x02\\x31\\x9e\", \"\\x51\\x45\\x4b\\x58\\x2d\\xdf\\x44\\x0a\", \"\\x71\\x78\\x87\\x6e\\x01\\xf1\\x9b\\x2a\" },\n  { \"\\x04\\xb9\\x15\\xba\\x43\\xfe\\xb5\\xb6\", \"\\x42\\xfd\\x44\\x30\\x59\\x57\\x7f\\xa2\", \"\\xaf\\x37\\xfb\\x42\\x1f\\x8c\\x40\\x95\" },\n  { \"\\x01\\x13\\xb9\\x70\\xfd\\x34\\xf2\\xce\", \"\\x05\\x9b\\x5e\\x08\\x51\\xcf\\x14\\x3a\", \"\\x86\\xa5\\x60\\xf1\\x0e\\xc6\\xd8\\x5b\" },\n  { \"\\x01\\x70\\xf1\\x75\\x46\\x8f\\xb5\\xe6\", \"\\x07\\x56\\xd8\\xe0\\x77\\x47\\x61\\xd2\", \"\\x0c\\xd3\\xda\\x02\\x00\\x21\\xdc\\x09\" },\n  { \"\\x43\\x29\\x7f\\xad\\x38\\xe3\\x73\\xfe\", \"\\x76\\x25\\x14\\xb8\\x29\\xbf\\x48\\x6a\", \"\\xea\\x67\\x6b\\x2c\\xb7\\xdb\\x2b\\x7a\" },\n  { \"\\x07\\xa7\\x13\\x70\\x45\\xda\\x2a\\x16\", \"\\x3b\\xdd\\x11\\x90\\x49\\x37\\x28\\x02\", \"\\xdf\\xd6\\x4a\\x81\\x5c\\xaf\\x1a\\x0f\" },\n  { \"\\x04\\x68\\x91\\x04\\xc2\\xfd\\x3b\\x2f\", \"\\x26\\x95\\x5f\\x68\\x35\\xaf\\x60\\x9a\", \"\\x5c\\x51\\x3c\\x9c\\x48\\x86\\xc0\\x88\" },\n  { \"\\x37\\xd0\\x6b\\xb5\\x16\\xcb\\x75\\x46\", \"\\x16\\x4d\\x5e\\x40\\x4f\\x27\\x52\\x32\", \"\\x0a\\x2a\\xee\\xae\\x3f\\xf4\\xab\\x77\" },\n  { \"\\x1f\\x08\\x26\\x0d\\x1a\\xc2\\x46\\x5e\", \"\\x6b\\x05\\x6e\\x18\\x75\\x9f\\x5c\\xca\", \"\\xef\\x1b\\xf0\\x3e\\x5d\\xfa\\x57\\x5a\" },\n  { \"\\x58\\x40\\x23\\x64\\x1a\\xba\\x61\\x76\", \"\\x00\\x4b\\xd6\\xef\\x09\\x17\\x60\\x62\", \"\\x88\\xbf\\x0d\\xb6\\xd7\\x0d\\xee\\x56\" },\n  { \"\\x02\\x58\\x16\\x16\\x46\\x29\\xb0\\x07\", \"\\x48\\x0d\\x39\\x00\\x6e\\xe7\\x62\\xf2\", \"\\xa1\\xf9\\x91\\x55\\x41\\x02\\x0b\\x56\" },\n  { \"\\x49\\x79\\x3e\\xbc\\x79\\xb3\\x25\\x8f\", \"\\x43\\x75\\x40\\xc8\\x69\\x8f\\x3c\\xfa\", \"\\x6f\\xbf\\x1c\\xaf\\xcf\\xfd\\x05\\x56\" },\n  { \"\\x4f\\xb0\\x5e\\x15\\x15\\xab\\x73\\xa7\", \"\\x07\\x2d\\x43\\xa0\\x77\\x07\\x52\\x92\", \"\\x2f\\x22\\xe4\\x9b\\xab\\x7c\\xa1\\xac\" },\n  { \"\\x49\\xe9\\x5d\\x6d\\x4c\\xa2\\x29\\xbf\", \"\\x02\\xfe\\x55\\x77\\x81\\x17\\xf1\\x2a\", \"\\x5a\\x6b\\x61\\x2c\\xc2\\x6c\\xce\\x4a\" },\n  { \"\\x01\\x83\\x10\\xdc\\x40\\x9b\\x26\\xd6\", \"\\x1d\\x9d\\x5c\\x50\\x18\\xf7\\x28\\xc2\", \"\\x5f\\x4c\\x03\\x8e\\xd1\\x2b\\x2e\\x41\" },\n  { \"\\x1c\\x58\\x7f\\x1c\\x13\\x92\\x4f\\xef\", \"\\x30\\x55\\x32\\x28\\x6d\\x6f\\x29\\x5a\", \"\\x63\\xfa\\xc0\\xd0\\x34\\xd9\\xf7\\x93\" },\n};\nstatic const size_t N_DES_TESTCASES = ARRAY_SIZE (des_testcases);\n\n#endif /* test-des-cases.h */\n"
  },
  {
    "path": "test/des-obsolete.c",
    "content": "\n/*\n * This crypt(3) validation program shipped with UFC-crypt\n * is derived from one distributed with Phil Karns PD DES package.\n *\n * @(#)cert.c   1.8 11 Aug 1996\n */\n\n#include \"crypt-port.h\"\n#include \"crypt-obsolete.h\"\n#include \"des-cases.h\"\n\n#include <stdio.h>\n\n#if ENABLE_OBSOLETE_API_ENOSYS\n#include <errno.h>\n#endif\n\n#if HAVE_SYMVER\nsymver_ref(\"encrypt\", encrypt, SYMVER_FLOOR);\nsymver_ref(\"setkey\", setkey, SYMVER_FLOOR);\n#endif\n\nstatic void\nexpand (unsigned char ex[64], const unsigned char pk[8])\n{\n  int i, j;\n  unsigned int t;\n\n  for (i = 0; i < 8; i++)\n    {\n      t = pk[i];\n      for (j = 0; j < 8; j++)\n        ex[i*8 + j] = (unsigned char)((t & (0x01u << (7 - j))) != 0);\n    }\n}\n\n#if !ENABLE_OBSOLETE_API_ENOSYS\n\nstatic void\nex_print (const unsigned char ex[64])\n{\n  int i, j;\n  unsigned int t;\n\n  for (i = 0; i < 8; i++)\n    {\n      t = 0;\n      for (j = 0; j < 8; j++)\n        t = (t << 1) | ex[i*8 + j];\n      printf (\"%02x\", t);\n    }\n}\n\nstatic void\npk_print (const unsigned char pk[8])\n{\n  for (int i = 0; i < 8; i++)\n    printf (\"%02x\", (unsigned int)pk[i]);\n}\n\nstatic void\nreport_failure (size_t n, bool decrypt,\n                const struct des_testcase *tc, const unsigned char got[64])\n{\n  printf (\"FAIL: %zu/%s: k=\", n, decrypt ? \"de\" : \"en\");\n  pk_print (tc->key);\n  fputs (\"  exp \", stdout);\n  if (decrypt)\n    pk_print (tc->plain);\n  else\n    pk_print (tc->answer);\n  fputs (\"  got \", stdout);\n  ex_print (got);\n  putchar ('\\n');\n}\n\nint\nmain (void)\n{\n  unsigned char key[64], plain[64], cipher[64], answer[64];\n  const struct des_testcase *tc;\n  size_t t;\n  int status = 0;\n\n  for (t = 0; t < N_DES_TESTCASES; t++)\n    {\n      tc = &des_testcases[t];\n      expand (key, tc->key);\n      expand (plain, tc->plain);\n      expand (answer, tc->answer);\n\n      setkey ((char *)key);\n      memcpy (cipher, plain, 64);\n      encrypt ((char *)cipher, 0);\n\n      if (memcmp (cipher, answer, 64) != 0)\n        {\n          status = 1;\n          // coverity[sensitive_data_leak]\n          report_failure (t, false, tc, cipher);\n        }\n\n      memcpy (cipher, answer, 64);\n      encrypt ((char *)cipher, 1);\n      if (memcmp (cipher, plain, 64) != 0)\n        {\n          status = 1;\n          report_failure (t, true, tc, cipher);\n        }\n    }\n\n  return status;\n}\n\n#else\n\nint\nmain (void)\n{\n  unsigned char key[64], plain[64], cipher[64], answer[64];\n  const struct des_testcase *tc;\n  size_t t;\n  int status = 0;\n\n  for (t = 0; t < N_DES_TESTCASES; t++)\n    {\n      tc = &des_testcases[t];\n      expand (key, tc->key);\n      expand (plain, tc->plain);\n      expand (answer, tc->answer);\n\n      /* Explicitly reset errno as required by POSIX.  */\n      errno = 0;\n\n      setkey ((char *)key);\n\n      if (errno != ENOSYS)\n        {\n          status = 1;\n          printf (\"FAIL: %s: errno does NOT equal ENOSYS.\\n\"\n                  \"expected: %d, %s, got: %d, %s\\n\", \"setkey\",\n                  ENOSYS, strerror (ENOSYS), errno, strerror (errno));\n        }\n\n      memcpy (cipher, plain, 64);\n\n      /* Explicitly reset errno as required by POSIX.  */\n      errno = 0;\n\n      encrypt ((char *)cipher, 0);\n\n      if (memcmp (cipher, answer, 64) == 0)\n        {\n          status = 1;\n          printf (\"FAIL: %s: still performs correct operation.\\n\",\n                  \"encrypt\");\n        }\n\n      if (memcmp (cipher, plain, 64) == 0)\n        {\n          status = 1;\n          printf (\"FAIL: %s: data-block is has not changed.\\n\",\n                  \"encrypt\");\n        }\n\n      if (errno != ENOSYS)\n        {\n          status = 1;\n          printf (\"FAIL: %s: errno does NOT equal ENOSYS.\\n\"\n                  \"expected: %d, %s, got: %d, %s\\n\", \"encrypt\",\n                  ENOSYS, strerror (ENOSYS), errno, strerror (errno));\n        }\n\n      /* Explicitly reset errno as required by POSIX.  */\n      errno = 0;\n\n      encrypt ((char *)cipher, 1);\n\n      if (memcmp (cipher, plain, 64) == 0)\n        {\n          status = 1;\n          printf (\"FAIL: %s: still performs correct operation.\\n\",\n                  \"encrypt (decrypt)\");\n        }\n\n      if (memcmp (cipher, answer, 64) == 0)\n        {\n          status = 1;\n          printf (\"FAIL: %s: data-block is unchanged.\\n\",\n                  \"encrypt (decrypt)\");\n        }\n\n      if (errno != ENOSYS)\n        {\n          status = 1;\n          printf (\"FAIL: %s: errno does NOT equal ENOSYS.\\n\"\n                  \"expected: %d, %s, got: %d, %s\\n\", \"encrypt (decrypt)\",\n                  ENOSYS, strerror (ENOSYS), errno, strerror (errno));\n        }\n    }\n\n  return status;\n}\n\n#endif\n"
  },
  {
    "path": "test/des-obsolete_r.c",
    "content": "\n/*\n * This crypt(3) validation program shipped with UFC-crypt\n * is derived from one distributed with Phil Karns PD DES package.\n *\n * @(#)cert.c   1.8 11 Aug 1996\n */\n\n#include \"crypt-port.h\"\n#include \"crypt-obsolete.h\"\n#include \"des-cases.h\"\n\n#include <stdio.h>\n\n#if ENABLE_OBSOLETE_API_ENOSYS\n#include <errno.h>\n#endif\n\n#if HAVE_SYMVER\nsymver_ref(\"encrypt_r\", encrypt_r, SYMVER_FLOOR);\nsymver_ref(\"setkey_r\", setkey_r, SYMVER_FLOOR);\n#endif\n\nstatic void\nexpand (unsigned char ex[64], const unsigned char pk[8])\n{\n  int i, j;\n  unsigned int t;\n\n  for (i = 0; i < 8; i++)\n    {\n      t = pk[i];\n      for (j = 0; j < 8; j++)\n        ex[i*8 + j] = (unsigned char)((t & (0x01u << (7 - j))) != 0);\n    }\n}\n\n#if !ENABLE_OBSOLETE_API_ENOSYS\n\nstatic void\nex_print (const unsigned char ex[64])\n{\n  int i, j;\n  unsigned int t;\n\n  for (i = 0; i < 8; i++)\n    {\n      t = 0;\n      for (j = 0; j < 8; j++)\n        t = (t << 1) | ex[i*8 + j];\n      printf (\"%02x\", t);\n    }\n}\n\nstatic void\npk_print (const unsigned char pk[8])\n{\n  for (int i = 0; i < 8; i++)\n    printf (\"%02x\", (unsigned int)pk[i]);\n}\n\nstatic void\nreport_failure (size_t n, bool decrypt,\n                const struct des_testcase *tc, const unsigned char got[64])\n{\n  printf (\"FAIL: %zu/%s: k=\", n, decrypt ? \"de\" : \"en\");\n  pk_print (tc->key);\n  fputs (\"  exp \", stdout);\n  if (decrypt)\n    pk_print (tc->plain);\n  else\n    pk_print (tc->answer);\n  fputs (\"  got \", stdout);\n  ex_print (got);\n  putchar ('\\n');\n}\n\nint\nmain (void)\n{\n  unsigned char key[64], plain[64], cipher[64], answer[64];\n  const struct des_testcase *tc;\n  size_t t;\n  int status = 0;\n  struct crypt_data data;\n\n  for (t = 0; t < N_DES_TESTCASES; t++)\n    {\n      tc = &des_testcases[t];\n      expand (key, tc->key);\n      expand (plain, tc->plain);\n      expand (answer, tc->answer);\n\n      setkey_r ((char *)key, &data);\n      memcpy (cipher, plain, 64);\n      encrypt_r ((char *)cipher, 0, &data);\n\n      if (memcmp (cipher, answer, 64) != 0)\n        {\n          status = 1;\n          report_failure (t, false, tc, cipher);\n        }\n\n      memcpy (cipher, answer, 64);\n      encrypt_r ((char *)cipher, 1, &data);\n      if (memcmp (cipher, plain, 64) != 0)\n        {\n          status = 1;\n          report_failure (t, true, tc, cipher);\n        }\n    }\n\n  return status;\n}\n\n#else\n\nint\nmain (void)\n{\n  unsigned char key[64], plain[64], cipher[64], answer[64];\n  const struct des_testcase *tc;\n  size_t t;\n  int status = 0;\n  struct crypt_data data;\n\n  for (t = 0; t < N_DES_TESTCASES; t++)\n    {\n      tc = &des_testcases[t];\n      expand (key, tc->key);\n      expand (plain, tc->plain);\n      expand (answer, tc->answer);\n\n      /* Explicitly reset errno as required by POSIX.  */\n      errno = 0;\n\n      setkey_r ((char *)key, &data);\n\n      if (errno != ENOSYS)\n        {\n          status = 1;\n          printf (\"FAIL: %s: errno does NOT equal ENOSYS.\\n\"\n                  \"expected: %d, %s, got: %d, %s\\n\", \"setkey_r\",\n                  ENOSYS, strerror (ENOSYS), errno, strerror (errno));\n        }\n\n      memcpy (cipher, plain, 64);\n\n      /* Explicitly reset errno as required by POSIX.  */\n      errno = 0;\n\n      encrypt_r ((char *)cipher, 0, &data);\n\n      if (memcmp (cipher, answer, 64) == 0)\n        {\n          status = 1;\n          printf (\"FAIL: %s: still performs correct operation.\\n\",\n                  \"encrypt_r\");\n        }\n\n      if (memcmp (cipher, plain, 64) == 0)\n        {\n          status = 1;\n          printf (\"FAIL: %s: data-block is has not changed.\\n\",\n                  \"encrypt_r\");\n        }\n\n      if (errno != ENOSYS)\n        {\n          status = 1;\n          printf (\"FAIL: %s: errno does NOT equal ENOSYS.\\n\"\n                  \"expected: %d, %s, got: %d, %s\\n\", \"encrypt_r\",\n                  ENOSYS, strerror (ENOSYS), errno, strerror (errno));\n        }\n\n      /* Explicitly reset errno as required by POSIX.  */\n      errno = 0;\n\n      encrypt_r ((char *)cipher, 1, &data);\n\n      if (memcmp (cipher, plain, 64) == 0)\n        {\n          status = 1;\n          printf (\"FAIL: %s: still performs correct operation.\\n\",\n                  \"encrypt_r (decrypt)\");\n        }\n\n      if (memcmp (cipher, answer, 64) == 0)\n        {\n          status = 1;\n          printf (\"FAIL: %s: data-block is unchanged.\\n\",\n                  \"encrypt_r (decrypt)\");\n        }\n\n      if (errno != ENOSYS)\n        {\n          status = 1;\n          printf (\"FAIL: %s: errno does NOT equal ENOSYS.\\n\"\n                  \"expected: %d, %s, got: %d, %s\\n\", \"encrypt_r (decrypt)\",\n                  ENOSYS, strerror (ENOSYS), errno, strerror (errno));\n        }\n    }\n\n  return status;\n}\n\n#endif\n"
  },
  {
    "path": "test/explicit-bzero.c",
    "content": "/* Test that explicit_bzero block clears are not optimized out.\n   Copyright (C) 2016-2020 Free Software Foundation, Inc.\n   This file is part of the GNU C Library.\n\n   The GNU C Library is free software; you can redistribute it and/or\n   modify it under the terms of the GNU Lesser General Public\n   License as published by the Free Software Foundation; either\n   version 2.1 of the License, or (at your option) any later version.\n\n   The GNU C Library is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n   Lesser General Public License for more details.\n\n   You should have received a copy of the GNU Lesser General Public\n   License along with the GNU C Library; if not, see\n   <https://www.gnu.org/licenses/>.  */\n\n/* This test is conceptually based on a test designed by Matthew\n   Dempsky for the OpenBSD regression suite:\n   <openbsd>/src/regress/lib/libc/explicit_bzero/explicit_bzero.c.\n   The basic idea is, we have a function that contains a\n   block-clearing operation (not necessarily explicit_bzero), after\n   which the block is dead, in the compiler-jargon sense.  Execute\n   that function while running on a user-allocated alternative\n   stack. Then we have another pointer to the memory region affected\n   by the block clear -- namely, the original allocation for the\n   alternative stack -- and can find out whether it actually happened.\n\n   The OpenBSD test uses sigaltstack and SIGUSR1 to get onto an\n   alternative stack.  This causes a number of awkward problems; some\n   operating systems (e.g. Solaris and OSX) wipe the signal stack upon\n   returning to the normal stack, there's no way to be sure that other\n   processes running on the same system will not interfere, and the\n   signal stack is very small so it's not safe to call printf there.\n   This implementation instead uses the <ucontext.h> coroutine\n   interface.  The coroutine stack is still too small to safely use\n   printf, but we know the OS won't erase it, so we can do all the\n   checks and printing from the normal stack.  */\n\n#include \"crypt-port.h\"\n\n#if !defined USE_SWAPCONTEXT || defined XCRYPT_USE_ASAN\n/* We can't do this test if we don't have the ucontext API.\n   Also ASAN may have some problems with using swapcontext().  */\nint main(void)\n{\n  return 77;\n}\n#else\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <ucontext.h>\n\n#ifdef HAVE_VALGRIND_VALGRIND_H\n# include <valgrind/valgrind.h>\n# include <valgrind/memcheck.h>\n#else\n# define VALGRIND_STACK_REGISTER(start, end) do {} while (0)\n# define VALGRIND_MAKE_MEM_DEFINED(addr, len) do {} while (0)\n#endif\n\n/* A byte pattern that is unlikely to occur by chance: the first 16\n   prime numbers (OEIS A000040).  */\nstatic const unsigned char test_pattern[16] =\n{\n  2, 3, 5, 7,  11, 13, 17, 19,  23, 29, 31, 37,  41, 43, 47, 53\n};\n\n/* Immediately after each subtest returns, we call swapcontext to get\n   back onto the main stack.  That call might itself overwrite the\n   test pattern, so we fill a modest-sized buffer with copies of it\n   and check whether any of them survived.  */\n\n#define PATTERN_SIZE (sizeof test_pattern)\n#define PATTERN_REPS 32\n#define TEST_BUFFER_SIZE (PATTERN_SIZE * PATTERN_REPS)\n\n/* There are three subtests, two of which are sanity checks.\n   Each test follows this sequence:\n\n     main                      coroutine\n     ----                      --------\n     advance cur_subtest\n     swap\n                               call setup function\n                                 prepare test buffer\n                                 swap\n     verify that buffer\n     was filled in\n     swap\n                                 possibly clear buffer\n                                 return\n                               swap\n     check buffer again,\n     according to test\n     expectation\n\n   In the \"no_clear\" case, we don't do anything to the test buffer\n   between preparing it and letting it go out of scope, and we expect\n   to find it.  This confirms that the test buffer does get filled in\n   and we can find it from the stack buffer.  In the \"ordinary_clear\"\n   case, we clear it using memset.  Depending on the target, the\n   compiler may not be able to apply dead store elimination to the\n   memset call, so the test does not fail if the memset is not\n   eliminated.  Finally, the \"explicit_clear\" case uses explicit_bzero\n   and expects _not_ to find the test buffer, which is the real\n   test.  */\n\nstatic ucontext_t uc_main, uc_co;\n\nstatic NO_INLINE int\nuse_test_buffer (unsigned char *buf)\n{\n  unsigned int sum = 0;\n\n  for (unsigned int i = 0; i < PATTERN_REPS; i++)\n    sum += buf[i * PATTERN_SIZE];\n\n  return (sum == 2 * PATTERN_REPS) ? 0 : 1;\n}\n\n/* Always check the test buffer immediately after filling it; this\n   makes externally visible side effects depend on the buffer existing\n   and having been filled in.  */\nstatic inline void\nprepare_test_buffer (unsigned char *buf)\n{\n  for (unsigned int i = 0; i < PATTERN_REPS; i++)\n    memcpy (buf + i*PATTERN_SIZE, test_pattern, PATTERN_SIZE);\n\n  if (swapcontext (&uc_co, &uc_main))\n    abort ();\n\n  /* Force the compiler to really copy the pattern to buf.  */\n  if (use_test_buffer (buf))\n    abort ();\n}\n\nstatic void\nsetup_no_clear (void)\n{\n  unsigned char buf[TEST_BUFFER_SIZE];\n  prepare_test_buffer (buf);\n}\n\nstatic void\nsetup_ordinary_clear (void)\n{\n  unsigned char buf[TEST_BUFFER_SIZE];\n  prepare_test_buffer (buf);\n  memset (buf, 0, TEST_BUFFER_SIZE);\n}\n\nstatic void\nsetup_explicit_clear (void)\n{\n  unsigned char buf[TEST_BUFFER_SIZE];\n  prepare_test_buffer (buf);\n  explicit_bzero (buf, TEST_BUFFER_SIZE);\n}\n\nenum test_expectation\n{\n  EXPECT_NONE = 1,\n  EXPECT_SOME,\n  EXPECT_ALL,\n  NO_EXPECTATIONS,\n  ARRAY_END = 0\n};\nstruct subtest\n{\n  void (*setup_subtest) (void);\n  const char *label;\n  enum test_expectation expected;\n};\nstatic const struct subtest *cur_subtest;\n\nstatic const struct subtest subtests[] =\n{\n  { setup_no_clear,       \"no clear\",       EXPECT_SOME     },\n  /* The memset may happen or not, depending on compiler\n     optimizations.  */\n  { setup_ordinary_clear, \"ordinary clear\", NO_EXPECTATIONS },\n  { setup_explicit_clear, \"explicit clear\", EXPECT_NONE     },\n  { 0,                    0,                ARRAY_END       }\n};\n\nstatic void\ntest_coroutine (void)\n{\n  while (cur_subtest->setup_subtest)\n    {\n      cur_subtest->setup_subtest ();\n      if (swapcontext (&uc_co, &uc_main))\n        abort ();\n    }\n}\n\n/* All the code above this point runs on the coroutine stack.\n   All the code below this point runs on the main stack.  */\n\nstatic int test_status;\nstatic unsigned char *co_stack_buffer;\nstatic size_t co_stack_size;\n\nstatic unsigned int\ncount_test_patterns (unsigned char *buf, size_t bufsiz)\n{\n  VALGRIND_MAKE_MEM_DEFINED (buf, bufsiz);\n  unsigned char *first = memmem (buf, bufsiz, test_pattern, PATTERN_SIZE);\n  if (!first)\n    return 0;\n  unsigned int cnt = 0;\n  for (unsigned int i = 0; i < PATTERN_REPS; i++)\n    {\n      unsigned char *p = first + i*PATTERN_SIZE;\n      if (p + PATTERN_SIZE - buf > (ptrdiff_t)bufsiz)\n        break;\n      if (memcmp (p, test_pattern, PATTERN_SIZE) == 0)\n        cnt++;\n    }\n  return cnt;\n}\n\nstatic void\ncheck_test_buffer (enum test_expectation expected,\n                   const char *label, const char *stage)\n{\n  unsigned int cnt = count_test_patterns (co_stack_buffer, co_stack_size);\n  switch (expected)\n    {\n    case EXPECT_NONE:\n      if (cnt == 0)\n        printf (\"PASS: %s/%s: expected 0 got %u\\n\", label, stage, cnt);\n      else\n        {\n          printf (\"FAIL: %s/%s: expected 0 got %u\\n\", label, stage, cnt);\n          test_status = 1;\n        }\n      break;\n\n    case EXPECT_SOME:\n      if (cnt > 0)\n        printf (\"PASS: %s/%s: expected some got %u\\n\", label, stage, cnt);\n      else\n        {\n          printf (\"FAIL: %s/%s: expected some got 0\\n\", label, stage);\n          test_status = 1;\n        }\n      break;\n\n    case EXPECT_ALL:\n      if (cnt == PATTERN_REPS)\n        printf (\"PASS: %s/%s: expected %d got %u\\n\", label, stage,\n                PATTERN_REPS, cnt);\n      else\n        {\n          printf (\"FAIL: %s/%s: expected %d got %u\\n\", label, stage,\n                  PATTERN_REPS, cnt);\n          test_status = 1;\n        }\n      break;\n\n    case NO_EXPECTATIONS:\n      printf (\"INFO: %s/%s: found %u patterns%s\\n\", label, stage, cnt,\n              cnt == 0 ? \" (memset not eliminated)\" : \"\");\n      break;\n\n    default:\n      printf (\"ERROR: %s/%s: invalid value for 'expected' = %d\\n\",\n              label, stage, (int)expected);\n      test_status = 1;\n    }\n}\n\nstatic void\ntest_loop (void)\n{\n  cur_subtest = subtests;\n  while (cur_subtest->setup_subtest)\n    {\n      if (swapcontext (&uc_main, &uc_co))\n        abort ();\n      check_test_buffer (EXPECT_ALL, cur_subtest->label, \"prepare\");\n      if (swapcontext (&uc_main, &uc_co))\n        abort ();\n      check_test_buffer (cur_subtest->expected, cur_subtest->label, \"test\");\n      cur_subtest++;\n    }\n  /* Terminate the coroutine.  */\n  if (swapcontext (&uc_main, &uc_co))\n    abort ();\n}\n\nint\nmain (void)\n{\n  size_t page_alignment = sizeof (void *);\n  long page_alignment_l = sysconf (_SC_PAGESIZE);\n  if (page_alignment_l > (long) sizeof (void *))\n    page_alignment = (size_t) page_alignment_l;\n\n  co_stack_size = (size_t) SIGSTKSZ + (size_t) TEST_BUFFER_SIZE;\n  if (co_stack_size < page_alignment * 4)\n    co_stack_size = page_alignment * 4;\n\n  void *p;\n  int err = posix_memalign (&p, page_alignment, co_stack_size);\n  if (err || !p)\n    {\n      printf (\"ERROR: allocating alt stack: %s\\n\", strerror (err));\n      return 2;\n    }\n  co_stack_buffer = p;\n  memset (co_stack_buffer, 0, co_stack_size);\n  VALGRIND_STACK_REGISTER (co_stack_buffer, co_stack_buffer + co_stack_size);\n\n  if (getcontext (&uc_co))\n    {\n      printf (\"ERROR: allocating coroutine context: %s\\n\", strerror (err));\n      return 2;\n    }\n  uc_co.uc_stack.ss_sp   = co_stack_buffer;\n  uc_co.uc_stack.ss_size = co_stack_size;\n  uc_co.uc_link          = &uc_main;\n  makecontext (&uc_co, test_coroutine, 0);\n\n  test_loop ();\n  return test_status;\n}\n\n#endif /* have ucontext.h || defined XCRYPT_USE_ASAN */\n"
  },
  {
    "path": "test/gensalt-bcrypt_x.c",
    "content": "/* Copyright (C) 2025 Björn Esser <besser82@fedoraproject.org>\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\n#include \"crypt-port.h\"\n\n#if INCLUDE_bcrypt_x\n\n#include <errno.h>\n#include <stdio.h>\n\nint\nmain (void)\n{\n  char *retval;\n\n  errno = 0;\n  retval = crypt_gensalt (\"$2x$\", 0, NULL, 0);\n\n  if (retval || errno != EINVAL)\n    {\n      fprintf (stderr, \"gensalt: expected \\\"NULL\\\", got \\\"%s\\\" \"\n                       \"with errno == %i, instead of %i.\\n\",\n               retval ? retval : \"NULL\", errno, EINVAL);\n\n      return 1;\n    }\n\n  return 0;\n}\n\n#else\n\nint\nmain (void)\n{\n  return 77; /* UNSUPPORTED */\n}\n\n#endif /* INCLUDE_bcrypt_x */\n"
  },
  {
    "path": "test/gensalt-extradata.c",
    "content": "/* Test that the prefix argument to crypt_gensalt affects only the\n   choice of hashing method, not any of the parameters or the salt.\n\n   Written by Zack Weinberg <zackw at panix.com> in 2018.\n   To the extent possible under law, Zack Weinberg has waived all\n   copyright and related or neighboring rights to this work.\n\n   See https://creativecommons.org/publicdomain/zero/1.0/ for further\n   details.  */\n\n#include \"crypt-port.h\"\n\n#include <errno.h>\n#include <stdio.h>\n\n/* Random bytes used when calling crypt_gensalt; for determinism, these\n   are fixed from run to run.  */\n#define N_RBYTES 64ul\n\nstatic const char rbytes1[] =\n  \"90idUkI2+mu2E/tMTViD418j2sPdEYq9LYq0yRW7RYhr4RqQ+oVzIIEcfJBqpf/D\";\n\nstatic const char rbytes2[] =\n  \"sEwXQxrjBTEADauxCpvOQqq7iU9oq6uJ+Iux/fbhtLRj1MWgBFyo/t+nh/nzm0Kn\";\n\nstatic_assert(sizeof rbytes1 == N_RBYTES + 1, \"rbytes1 is wrong length\");\nstatic_assert(sizeof rbytes2 == N_RBYTES + 1, \"rbytes2 is wrong length\");\n\nstruct testcase\n{\n  const char *prefix;\n  unsigned long count1;\n  unsigned long count2;\n};\n\n/* This list should include one entry for each potentially-supported\n   hash prefix.  If the hash method has tunable cost, set count1 and\n   count2 to two different nonzero values, within the supported cost\n   range.  Neither value should equal the default cost.  If the hash\n   method does not have tunable cost, set count1 and count2 to zero.  */\nstatic const struct testcase testcases[] =\n{\n#if INCLUDE_descrypt || INCLUDE_bigcrypt\n  { \"\", 0, 0 },\n#endif\n#if INCLUDE_bsdicrypt\n  { \"_\", 7019, 1120211 },\n#endif\n#if INCLUDE_nt\n  { \"$3$\", 0, 0 },\n#endif\n#if INCLUDE_md5crypt\n  { \"$1$\", 0, 0 },\n#endif\n#if INCLUDE_sunmd5\n  { \"$md5\",  7019, 1120211 },\n#endif\n#if INCLUDE_sm3crypt\n  { \"$sm3$\",  7019, 1120211 },\n#endif\n#if INCLUDE_sha1crypt\n  { \"$sha1\", 7019, 1120211 },\n#endif\n#if INCLUDE_sha256crypt\n  { \"$5$\", 7019, 1120211 },\n#endif\n#if INCLUDE_sha512crypt\n  { \"$6$\", 7019, 1120211 },\n#endif\n#if INCLUDE_bcrypt\n  { \"$2b$\", 7, 11 },\n#endif\n#if INCLUDE_bcrypt_y\n  { \"$2y$\", 7, 11 },\n#endif\n#if INCLUDE_bcrypt_a\n  { \"$2a$\", 7, 11 },\n#endif\n#if INCLUDE_scrypt\n  { \"$7$\", 7, 11, },\n#endif\n#if INCLUDE_yescrypt\n  { \"$y$\", 7, 11, },\n#endif\n#if INCLUDE_gost_yescrypt\n  { \"$gy$\", 7, 11, },\n#endif\n#if INCLUDE_sm3_yescrypt\n  { \"$sm3y$\", 7, 11, },\n#endif\n  { 0, 0, 0, }\n};\n\nstatic int\ndo_crypt_gensalt(const char *prefix,\n                 const char rbytes[MIN_SIZE(N_RBYTES)],\n                 unsigned long count,\n                 char outbuf[MIN_SIZE(CRYPT_GENSALT_OUTPUT_SIZE)])\n{\n  /* Detect failure to NUL-terminate the output properly.  */\n  static int ncalls = 0;\n  memset(outbuf, '!' + (ncalls % ('~' - '!' + 1)),\n         CRYPT_GENSALT_OUTPUT_SIZE - 1);\n  outbuf[CRYPT_GENSALT_OUTPUT_SIZE - 1] = 0;\n  ncalls++;\n\n  char *rv = crypt_gensalt_rn(prefix, count, rbytes, N_RBYTES,\n                              outbuf, CRYPT_GENSALT_OUTPUT_SIZE);\n  if (rv == 0)\n    {\n      printf(\"ERROR: gensalt(%s, %lu, %c%c..., %lu, outbuf, %lu) = 0/%s\\n\",\n             prefix, count, rbytes[0], rbytes[1],\n             N_RBYTES, (unsigned long)CRYPT_GENSALT_OUTPUT_SIZE,\n             strerror(errno));\n      outbuf[0] = '*';\n      memset (outbuf+1, 0, CRYPT_GENSALT_OUTPUT_SIZE-1);\n      return 1;\n    }\n  else if (rv[0] == '*')\n    {\n      printf(\"ERROR: gensalt(%s, %lu, %c%c..., %lu, outbuf, %lu) = %s/%s\\n\",\n             prefix, count, rbytes[0], rbytes[1],\n             N_RBYTES, (unsigned long)CRYPT_GENSALT_OUTPUT_SIZE,\n             outbuf, strerror(errno));\n      outbuf[0] = '*';\n      memset (outbuf+1, 0, CRYPT_GENSALT_OUTPUT_SIZE-1);\n      return 1;\n    }\n  else\n    return 0;\n}\n\nstatic int\ndo_check_equal(const char *stst, const char *sref,\n               const char *prefix, const char rbytes[N_RBYTES],\n               unsigned long count, const char *setting)\n{\n  if (!strcmp(stst, sref))\n    return 0;\n\n  printf(\"FAIL: expected %s\\n\"\n         \"           got %s\\n\"\n         \"  from %s, %lu, %c%c...\\n\"\n         \"   and %s\\n\",\n         sref, stst, prefix, count, rbytes[0], rbytes[1], setting);\n  return 1;\n}\n\nint\nmain(void)\n{\n  int status = 0;\n  char sref[6][CRYPT_GENSALT_OUTPUT_SIZE];\n  char stst[CRYPT_GENSALT_OUTPUT_SIZE];\n\n  for (size_t i = 0; testcases[i].prefix; i++)\n    {\n      const char *prefix   = testcases[i].prefix;\n      unsigned long count1 = testcases[i].count1;\n      unsigned long count2 = testcases[i].count2;\n      int ncases;\n\n      memset(sref, 0, sizeof sref);\n\n      /* If count1 and count2 are both nonzero, then they should also\n         be unequal, and we have six reference cases:\n         (0, count1, count2) x (rbytes1, rbytes2).\n         If count1 and count2 are both zero, then we only have two\n         reference cases: 0 x (rbytes1, rbytes2) (this happens when the\n         hash method doesn't have tunable cost).\n         It is incorrect for only one of count1 and count2 to be zero,\n         or for them to be equal but nonzero.  */\n      if (count1 == 0 && count2 == 0)\n        {\n          ncases = 2;\n          status |= do_crypt_gensalt(prefix, rbytes1, 0, sref[0]);\n          status |= do_crypt_gensalt(prefix, rbytes2, 0, sref[1]);\n        }\n      else if (count1 != 0 && count2 != 0 && count1 != count2)\n        {\n          ncases = 6;\n          status |= do_crypt_gensalt(prefix, rbytes1, 0,      sref[0]);\n          status |= do_crypt_gensalt(prefix, rbytes2, 0,      sref[1]);\n          status |= do_crypt_gensalt(prefix, rbytes1, count1, sref[2]);\n          status |= do_crypt_gensalt(prefix, rbytes2, count1, sref[3]);\n          status |= do_crypt_gensalt(prefix, rbytes1, count2, sref[4]);\n          status |= do_crypt_gensalt(prefix, rbytes2, count2, sref[5]);\n        }\n      else\n        {\n          printf (\"ERROR: %zu/%s: inappropriate count1=%lu count2=%lu\\n\",\n                  i, prefix, count1, count2);\n          status = 1;\n          continue;\n        }\n\n      /* At this point, sref[0..ncases] are filled with setting\n         strings corresponding to different combinations of salt and\n         cost.  If we reuse those strings as prefixes for crypt_gensalt,\n         none of the additional information should affect the output.  */\n      for (int j = 0; j < ncases; j++)\n        {\n          if (sref[j][0] == '*')\n            continue; /* initial crypt_gensalt call failed */\n          if (count1 == 0 && count2 == 0)\n            {\n              status |= do_crypt_gensalt(sref[j], rbytes1, 0, stst);\n              status |= do_check_equal(stst, sref[0],\n                                       prefix, rbytes1, 0, sref[j]);\n\n              status |= do_crypt_gensalt(sref[j], rbytes2, 0, stst);\n              status |= do_check_equal(stst, sref[1],\n                                       prefix, rbytes2, 0, sref[j]);\n            }\n          else\n            {\n              status |= do_crypt_gensalt(sref[j], rbytes1, 0,      stst);\n              status |= do_check_equal(stst, sref[0],\n                                       prefix, rbytes1, 0, sref[j]);\n\n              status |= do_crypt_gensalt(sref[j], rbytes2, 0,      stst);\n              status |= do_check_equal(stst, sref[1],\n                                       prefix, rbytes2, 0, sref[j]);\n\n              status |= do_crypt_gensalt(sref[j], rbytes1, count1, stst);\n              status |= do_check_equal(stst, sref[2],\n                                       prefix, rbytes1, count1, sref[j]);\n\n              status |= do_crypt_gensalt(sref[j], rbytes2, count1, stst);\n              status |= do_check_equal(stst, sref[3],\n                                       prefix, rbytes2, count1, sref[j]);\n\n              status |= do_crypt_gensalt(sref[j], rbytes1, count2, stst);\n              status |= do_check_equal(stst, sref[4],\n                                       prefix, rbytes1, count2, sref[j]);\n\n              status |= do_crypt_gensalt(sref[j], rbytes2, count2, stst);\n              status |= do_check_equal(stst, sref[5],\n                                       prefix, rbytes2, count2, sref[j]);\n            }\n        }\n\n    }\n\n  return status;\n}\n"
  },
  {
    "path": "test/gensalt-nested-call.c",
    "content": "/*\n * Copyright (c) 2025 Björn Esser <besser82 at fedoraproject.org>\n * All rights reserved.\n *\n * Permission to use, copy, modify, and/or distribute this software for any\n * purpose with or without fee is hereby granted.\n *\n * THE SOFTWARE IS PROVIDED “AS IS” AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n */\n\n#include \"crypt-port.h\"\n\n#if INCLUDE_bcrypt        || INCLUDE_bcrypt_a     || INCLUDE_bcrypt_y    || \\\n    INCLUDE_bigcrypt      || INCLUDE_bsdicrypt    || INCLUDE_descrypt    || \\\n    INCLUDE_gost_yescrypt || INCLUDE_md5crypt     || INCLUDE_nt          || \\\n    INCLUDE_scrypt        || INCLUDE_sha1crypt    || INCLUDE_sha256crypt || \\\n    INCLUDE_sha512crypt   || INCLUDE_sm3_yescrypt || INCLUDE_sm3crypt    || \\\n    INCLUDE_sunmd5        || INCLUDE_yescrypt\n\n#include <stdio.h>\n\nstatic const char *prefixes[] =\n{\n#if INCLUDE_descrypt\n  \"Mp\",\n#endif\n#if INCLUDE_bigcrypt\n  \"Mp............\",\n#endif\n#if INCLUDE_bsdicrypt\n  \"_\",\n#endif\n#if INCLUDE_md5crypt\n  \"$1$\",\n#endif\n#if INCLUDE_nt\n  \"$3$\",\n#endif\n#if INCLUDE_sunmd5\n  \"$md5$\",\n#endif\n#if INCLUDE_sm3crypt\n  \"$sm3$\",\n#endif\n#if INCLUDE_sha1crypt\n  \"$sha1$\",\n#endif\n#if INCLUDE_sha256crypt\n  \"$5$\",\n#endif\n#if INCLUDE_sha512crypt\n  \"$6$\",\n#endif\n#if INCLUDE_bcrypt_a\n  \"$2a$\",\n#endif\n#if INCLUDE_bcrypt\n  \"$2b$\",\n#endif\n#if INCLUDE_bcrypt_y\n  \"$2y$\",\n#endif\n#if INCLUDE_yescrypt\n  \"$y$\",\n#endif\n#if INCLUDE_scrypt\n  \"$7$\",\n#endif\n#if INCLUDE_gost_yescrypt\n  \"$gy$\",\n#endif\n#if INCLUDE_sm3_yescrypt\n  \"$sm3y$\",\n#endif\n};\n\nint\nmain (void)\n{\n  char output[CRYPT_GENSALT_OUTPUT_SIZE];\n  char *retval = NULL;\n  int status = 0;\n\n  for (size_t i = 0; i < ARRAY_SIZE (prefixes); i++)\n    {\n      retval = crypt_gensalt (prefixes[i], 0, NULL, 0);\n      retval = !retval ? 0 : crypt_gensalt (retval, 0, NULL, 0);\n\n      if (!retval)\n        {\n          printf (\"Subsequent call to crypt_gensalt(3) failed for prefix \\\"%s\\\".\\n\",\n                  prefixes[i]);\n          status = 1;\n        }\n\n      retval = crypt_gensalt_rn (prefixes[i], 0, NULL, 0,\n                                 output, sizeof output);\n      retval = !retval ? 0 : crypt_gensalt_rn (retval, 0, NULL, 0,\n                                               output, sizeof output);\n\n      if (!retval)\n        {\n          printf (\"Subsequent call to crypt_gensalt_rn(3) failed for prefix \\\"%s\\\".\\n\",\n                  prefixes[i]);\n          status = 1;\n        }\n    }\n\n  return status;\n}\n\n#else\n\nint\nmain (void)\n{\n  return 77; /* UNSUPPORTED */\n}\n\n#endif /* all, but bcrypt_x only */\n"
  },
  {
    "path": "test/gensalt-nthash.c",
    "content": "/* Copyright (C) 2018 Björn Esser <besser82@fedoraproject.org>\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\n#include \"crypt-port.h\"\n\n#include <stdio.h>\n\n#if INCLUDE_nt\n\nint\nmain (void)\n{\n  const char *prefix = \"$3$\";\n  const char *crypt_exp = \"$3$$be8cb5d74036075bbe5344cb8ad248b0\";\n  char output[CRYPT_GENSALT_OUTPUT_SIZE];\n  struct crypt_data cd;\n  int retval = 0;\n\n  crypt_gensalt_rn (prefix, 0, NULL, 0,\n                    output, CRYPT_GENSALT_OUTPUT_SIZE);\n\n  if (strcmp (prefix, output))\n    retval = 1;\n\n  fprintf (stderr, \"%s: gensalt: expected \\\"%s\\\", got \\\"%s\\\"\\n\",\n           retval == 0 ? \"PASS\" : \"FAIL\", prefix, output);\n\n  if (retval != 0)\n    return retval;\n\n  crypt_r (\"top secret\", output, &cd);\n\n  if (strcmp (crypt_exp, cd.output))\n    retval = 1;\n\n  fprintf (stderr, \"%s: crypt: expected \\\"%s\\\", got \\\"%s\\\"\\n\",\n           retval == 0 ? \"PASS\" : \"FAIL\", crypt_exp, cd.output);\n\n  return retval;\n}\n\n#else\n\nint\nmain (void)\n{\n  return 77; /* UNSUPPORTED */\n}\n\n#endif /* INCLUDE_nt */\n"
  },
  {
    "path": "test/gensalt.c",
    "content": "#include \"crypt-port.h\"\n\n#include <errno.h>\n#include <stdio.h>\n#include <stdlib.h>\n\nstatic const char *const entropy[] =\n{\n  \"\\x58\\x35\\xcd\\x26\\x03\\xab\\x2c\\x14\\x92\\x13\\x1e\\x59\\xb0\\xbc\\xfe\\xd5\",\n  \"\\x9b\\x35\\xa2\\x45\\xeb\\x68\\x9e\\x8f\\xd9\\xa9\\x09\\x71\\xcc\\x4d\\x21\\x44\",\n  \"\\x25\\x13\\xc5\\x94\\xc3\\x93\\x1d\\xf4\\xfd\\xd4\\x4f\\xbd\\x10\\xe5\\x28\\x08\",\n  \"\\xa0\\x2d\\x35\\x70\\xa8\\x0b\\xc3\\xad\\xdf\\x61\\x69\\xb3\\x19\\xda\\x7e\\x8d\",\n  0\n};\n\n#if INCLUDE_descrypt\nstatic const char *const des_expected_output[] = { \"Mp\", \"Pp\", \"ZH\", \"Uh\"};\n#endif\n#if INCLUDE_bigcrypt && !INCLUDE_descrypt\nstatic const char *const big_expected_output[] =\n{\n  \"Mp............\",\n  \"Pp............\",\n  \"ZH............\",\n  \"Uh............\"\n};\n#endif\n#if INCLUDE_bsdicrypt\nstatic const char *const bsdi_expected_output[] =\n{\n  \"_J9..MJHn\",\n  \"_J9..PKXc\",\n  \"_J9..ZAFl\",\n  \"_J9..UqGB\"\n};\nstatic const char *const bsdi_expected_output_r[] =\n{\n  \"_/.2.MJHn\",\n  \"_/.2.PKXc\",\n  \"_/.2.ZAFl\",\n  \"_/.2.UqGB\"\n};\nstatic const char *const bsdi_expected_output_l[] =\n{\n  \"_/...MJHn\",\n  \"_/...PKXc\",\n  \"_/...ZAFl\",\n  \"_/...UqGB\"\n};\nstatic const char *const bsdi_expected_output_h[] =\n{\n  \"_zzzzMJHn\",\n  \"_zzzzPKXc\",\n  \"_zzzzZAFl\",\n  \"_zzzzUqGB\"\n};\n#endif\n#if INCLUDE_md5crypt\nstatic const char *const md5_expected_output[] =\n{\n  \"$1$MJHnaAke\",\n  \"$1$PKXc3hCO\",\n  \"$1$ZAFlICwY\",\n  \"$1$UqGBkVu0\"\n};\n#endif\n#if INCLUDE_sunmd5\nstatic const char *const sunmd5_expected_output[] =\n{\n  \"$md5,rounds=55349$BPm.fm03$\",\n  \"$md5,rounds=72501$WKoucttX$\",\n  \"$md5,rounds=42259$3HtkHq/x$\",\n  \"$md5,rounds=73773$p.5e9AQf$\",\n};\nstatic const char *const sunmd5_expected_output_l[] =\n{\n  \"$md5,rounds=55349$BPm.fm03$\",\n  \"$md5,rounds=72501$WKoucttX$\",\n  \"$md5,rounds=42259$3HtkHq/x$\",\n  \"$md5,rounds=73773$p.5e9AQf$\",\n};\nstatic const char *const sunmd5_expected_output_h[] =\n{\n  \"$md5,rounds=4294924340$BPm.fm03$\",\n  \"$md5,rounds=4294941492$WKoucttX$\",\n  \"$md5,rounds=4294911250$3HtkHq/x$\",\n  \"$md5,rounds=4294942764$p.5e9AQf$\",\n};\n#endif\n#if INCLUDE_sha1crypt\nstatic const char *const sha1_expected_output[] =\n{\n  \"$sha1$248488$ggu.H673kaZ5$\",\n  \"$sha1$248421$SWqudaxXA5L0$\",\n  \"$sha1$257243$RAtkIrDxEovH$\",\n  \"$sha1$250464$1j.eVxRfNAPO$\",\n};\nstatic const char *const sha1_expected_output_l[] =\n{\n  \"$sha1$4$ggu.H673kaZ5$\",\n  \"$sha1$4$SWqudaxXA5L0$\",\n  \"$sha1$4$RAtkIrDxEovH$\",\n  \"$sha1$4$1j.eVxRfNAPO$\",\n};\nstatic const char *const sha1_expected_output_h[] =\n{\n  \"$sha1$3643984551$ggu.H673kaZ5$\",\n  \"$sha1$4200450659$SWqudaxXA5L0$\",\n  \"$sha1$3946507480$RAtkIrDxEovH$\",\n  \"$sha1$3486175838$1j.eVxRfNAPO$\",\n};\n#endif\n#if INCLUDE_sha256crypt\nstatic const char *const sha256_expected_output[] =\n{\n  \"$5$MJHnaAkegEVYHsFK\",\n  \"$5$PKXc3hCOSyMqdaEQ\",\n  \"$5$ZAFlICwYRETzIzIj\",\n  \"$5$UqGBkVu01rurVZqg\"\n};\nstatic const char *const sha256_expected_output_r[] =\n{\n  \"$5$rounds=10191$MJHnaAkegEVYHsFK\",\n  \"$5$rounds=10191$PKXc3hCOSyMqdaEQ\",\n  \"$5$rounds=10191$ZAFlICwYRETzIzIj\",\n  \"$5$rounds=10191$UqGBkVu01rurVZqg\"\n};\nstatic const char *const sha256_expected_output_l[] =\n{\n  \"$5$rounds=1000$MJHnaAkegEVYHsFK\",\n  \"$5$rounds=1000$PKXc3hCOSyMqdaEQ\",\n  \"$5$rounds=1000$ZAFlICwYRETzIzIj\",\n  \"$5$rounds=1000$UqGBkVu01rurVZqg\"\n};\nstatic const char *const sha256_expected_output_h[] =\n{\n  \"$5$rounds=999999999$MJHnaAkegEVYHsFK\",\n  \"$5$rounds=999999999$PKXc3hCOSyMqdaEQ\",\n  \"$5$rounds=999999999$ZAFlICwYRETzIzIj\",\n  \"$5$rounds=999999999$UqGBkVu01rurVZqg\"\n};\n#endif\n#if INCLUDE_sha512crypt\nstatic const char *const sha512_expected_output[] =\n{\n  \"$6$MJHnaAkegEVYHsFK\",\n  \"$6$PKXc3hCOSyMqdaEQ\",\n  \"$6$ZAFlICwYRETzIzIj\",\n  \"$6$UqGBkVu01rurVZqg\"\n};\nstatic const char *const sha512_expected_output_r[] =\n{\n  \"$6$rounds=10191$MJHnaAkegEVYHsFK\",\n  \"$6$rounds=10191$PKXc3hCOSyMqdaEQ\",\n  \"$6$rounds=10191$ZAFlICwYRETzIzIj\",\n  \"$6$rounds=10191$UqGBkVu01rurVZqg\"\n};\nstatic const char *const sha512_expected_output_l[] =\n{\n  \"$6$rounds=1000$MJHnaAkegEVYHsFK\",\n  \"$6$rounds=1000$PKXc3hCOSyMqdaEQ\",\n  \"$6$rounds=1000$ZAFlICwYRETzIzIj\",\n  \"$6$rounds=1000$UqGBkVu01rurVZqg\"\n};\nstatic const char *const sha512_expected_output_h[] =\n{\n  \"$6$rounds=999999999$MJHnaAkegEVYHsFK\",\n  \"$6$rounds=999999999$PKXc3hCOSyMqdaEQ\",\n  \"$6$rounds=999999999$ZAFlICwYRETzIzIj\",\n  \"$6$rounds=999999999$UqGBkVu01rurVZqg\"\n};\n#endif\n#if INCLUDE_sm3crypt\nstatic const char *const sm3_expected_output[] =\n{\n  \"$sm3$MJHnaAkegEVYHsFK\",\n  \"$sm3$PKXc3hCOSyMqdaEQ\",\n  \"$sm3$ZAFlICwYRETzIzIj\",\n  \"$sm3$UqGBkVu01rurVZqg\"\n};\nstatic const char *const sm3_expected_output_r[] =\n{\n  \"$sm3$rounds=10191$MJHnaAkegEVYHsFK\",\n  \"$sm3$rounds=10191$PKXc3hCOSyMqdaEQ\",\n  \"$sm3$rounds=10191$ZAFlICwYRETzIzIj\",\n  \"$sm3$rounds=10191$UqGBkVu01rurVZqg\"\n};\nstatic const char *const sm3_expected_output_l[] =\n{\n  \"$sm3$rounds=1000$MJHnaAkegEVYHsFK\",\n  \"$sm3$rounds=1000$PKXc3hCOSyMqdaEQ\",\n  \"$sm3$rounds=1000$ZAFlICwYRETzIzIj\",\n  \"$sm3$rounds=1000$UqGBkVu01rurVZqg\"\n};\nstatic const char *const sm3_expected_output_h[] =\n{\n  \"$sm3$rounds=999999999$MJHnaAkegEVYHsFK\",\n  \"$sm3$rounds=999999999$PKXc3hCOSyMqdaEQ\",\n  \"$sm3$rounds=999999999$ZAFlICwYRETzIzIj\",\n  \"$sm3$rounds=999999999$UqGBkVu01rurVZqg\"\n};\n#endif\n#if INCLUDE_bcrypt\nstatic const char *const bcrypt_b_expected_output[] =\n{\n  \"$2b$05$UBVLHeMpJ/QQCv3XqJx8zO\",\n  \"$2b$05$kxUgPcrmlm9XoOjvxCyfP.\",\n  \"$2b$05$HPNDjKMRFdR7zC87CMSmA.\",\n  \"$2b$05$mAyzaIeJu41dWUkxEbn8hO\"\n};\nstatic const char *const bcrypt_b_expected_output_l[] =\n{\n  \"$2b$04$UBVLHeMpJ/QQCv3XqJx8zO\",\n  \"$2b$04$kxUgPcrmlm9XoOjvxCyfP.\",\n  \"$2b$04$HPNDjKMRFdR7zC87CMSmA.\",\n  \"$2b$04$mAyzaIeJu41dWUkxEbn8hO\"\n};\nstatic const char *const bcrypt_b_expected_output_h[] =\n{\n  \"$2b$31$UBVLHeMpJ/QQCv3XqJx8zO\",\n  \"$2b$31$kxUgPcrmlm9XoOjvxCyfP.\",\n  \"$2b$31$HPNDjKMRFdR7zC87CMSmA.\",\n  \"$2b$31$mAyzaIeJu41dWUkxEbn8hO\"\n};\n#endif\n#if INCLUDE_bcrypt_a\nstatic const char *const bcrypt_a_expected_output[] =\n{\n  \"$2a$05$UBVLHeMpJ/QQCv3XqJx8zO\",\n  \"$2a$05$kxUgPcrmlm9XoOjvxCyfP.\",\n  \"$2a$05$HPNDjKMRFdR7zC87CMSmA.\",\n  \"$2a$05$mAyzaIeJu41dWUkxEbn8hO\"\n};\n#endif\n#if INCLUDE_bcrypt_y\nstatic const char *const bcrypt_y_expected_output[] =\n{\n  \"$2y$05$UBVLHeMpJ/QQCv3XqJx8zO\",\n  \"$2y$05$kxUgPcrmlm9XoOjvxCyfP.\",\n  \"$2y$05$HPNDjKMRFdR7zC87CMSmA.\",\n  \"$2y$05$mAyzaIeJu41dWUkxEbn8hO\"\n};\n#endif\n#if INCLUDE_yescrypt\nstatic const char *yescrypt_expected_output[] =\n{\n  \"$y$j9T$MJHnaAkegEVYHsFKkmfzJ1\",\n  \"$y$j9T$PKXc3hCOSyMqdaEQArI62/\",\n  \"$y$j9T$ZAFlICwYRETzIzIjEIC86.\",\n  \"$y$j9T$UqGBkVu01rurVZqgNchTB0\"\n};\nstatic const char *yescrypt_expected_output_l[] =\n{\n  \"$y$j75$MJHnaAkegEVYHsFKkmfzJ1\",\n  \"$y$j75$PKXc3hCOSyMqdaEQArI62/\",\n  \"$y$j75$ZAFlICwYRETzIzIjEIC86.\",\n  \"$y$j75$UqGBkVu01rurVZqgNchTB0\"\n};\nstatic const char *yescrypt_expected_output_h[] =\n{\n  \"$y$jFT$MJHnaAkegEVYHsFKkmfzJ1\",\n  \"$y$jFT$PKXc3hCOSyMqdaEQArI62/\",\n  \"$y$jFT$ZAFlICwYRETzIzIjEIC86.\",\n  \"$y$jFT$UqGBkVu01rurVZqgNchTB0\"\n};\n#endif\n#if INCLUDE_scrypt\nstatic const char *scrypt_expected_output[] =\n{\n  \"$7$CU..../....MJHnaAkegEVYHsFKkmfzJ1\",\n  \"$7$CU..../....PKXc3hCOSyMqdaEQArI62/\",\n  \"$7$CU..../....ZAFlICwYRETzIzIjEIC86.\",\n  \"$7$CU..../....UqGBkVu01rurVZqgNchTB0\"\n};\nstatic const char *scrypt_expected_output_l[] =\n{\n  \"$7$BU..../....MJHnaAkegEVYHsFKkmfzJ1\",\n  \"$7$BU..../....PKXc3hCOSyMqdaEQArI62/\",\n  \"$7$BU..../....ZAFlICwYRETzIzIjEIC86.\",\n  \"$7$BU..../....UqGBkVu01rurVZqgNchTB0\"\n};\nstatic const char *scrypt_expected_output_h[] =\n{\n  \"$7$GU..../....MJHnaAkegEVYHsFKkmfzJ1\",\n  \"$7$GU..../....PKXc3hCOSyMqdaEQArI62/\",\n  \"$7$GU..../....ZAFlICwYRETzIzIjEIC86.\",\n  \"$7$GU..../....UqGBkVu01rurVZqgNchTB0\"\n};\n#endif\n#if INCLUDE_gost_yescrypt\nstatic const char *gost_yescrypt_expected_output[] =\n{\n  \"$gy$j9T$MJHnaAkegEVYHsFKkmfzJ1\",\n  \"$gy$j9T$PKXc3hCOSyMqdaEQArI62/\",\n  \"$gy$j9T$ZAFlICwYRETzIzIjEIC86.\",\n  \"$gy$j9T$UqGBkVu01rurVZqgNchTB0\"\n};\nstatic const char *gost_yescrypt_expected_output_l[] =\n{\n  \"$gy$j75$MJHnaAkegEVYHsFKkmfzJ1\",\n  \"$gy$j75$PKXc3hCOSyMqdaEQArI62/\",\n  \"$gy$j75$ZAFlICwYRETzIzIjEIC86.\",\n  \"$gy$j75$UqGBkVu01rurVZqgNchTB0\"\n};\nstatic const char *gost_yescrypt_expected_output_h[] =\n{\n  \"$gy$jFT$MJHnaAkegEVYHsFKkmfzJ1\",\n  \"$gy$jFT$PKXc3hCOSyMqdaEQArI62/\",\n  \"$gy$jFT$ZAFlICwYRETzIzIjEIC86.\",\n  \"$gy$jFT$UqGBkVu01rurVZqgNchTB0\"\n};\n#endif\n#if INCLUDE_sm3_yescrypt\nstatic const char *const sm3_yescrypt_expected_output[] =\n{\n  \"$sm3y$j9T$MJHnaAkegEVYHsFKkmfzJ1\",\n  \"$sm3y$j9T$PKXc3hCOSyMqdaEQArI62/\",\n  \"$sm3y$j9T$ZAFlICwYRETzIzIjEIC86.\",\n  \"$sm3y$j9T$UqGBkVu01rurVZqgNchTB0\"\n};\nstatic const char *const sm3_yescrypt_expected_output_l[] =\n{\n  \"$sm3y$j75$MJHnaAkegEVYHsFKkmfzJ1\",\n  \"$sm3y$j75$PKXc3hCOSyMqdaEQArI62/\",\n  \"$sm3y$j75$ZAFlICwYRETzIzIjEIC86.\",\n  \"$sm3y$j75$UqGBkVu01rurVZqgNchTB0\"\n};\nstatic const char *const sm3_yescrypt_expected_output_h[] =\n{\n  \"$sm3y$jFT$MJHnaAkegEVYHsFKkmfzJ1\",\n  \"$sm3y$jFT$PKXc3hCOSyMqdaEQArI62/\",\n  \"$sm3y$jFT$ZAFlICwYRETzIzIjEIC86.\",\n  \"$sm3y$jFT$UqGBkVu01rurVZqgNchTB0\"\n};\n#endif\n\nstruct testcase\n{\n  const char *prefix;\n  const char *const *expected_output;\n  unsigned int expected_len;\n  unsigned int expected_auto_len;\n  unsigned long rounds;\n};\n\n// For all hashing methods with a linear cost parameter (that is,\n// DES/BSD, MD5/Sun, SM3, SHA1, SHA256, and SHA512), crypt_gensalt will\n// accept any value in the range of 'unsigned long' and clip it to the\n// actual valid range.\n#define MIN_LINEAR_COST 1\n#define MAX_LINEAR_COST ULONG_MAX\n\nstatic const struct testcase testcases[] =\n{\n#if INCLUDE_descrypt\n  { \"\",      des_expected_output,       2,  0, 0 },\n  // DES doesn't have variable round count.\n#endif\n#if INCLUDE_bigcrypt && !INCLUDE_descrypt\n  { \"\",      big_expected_output,       14,  0, 0 },\n  // bigcrypt doesn't have variable round count.\n#endif\n#if INCLUDE_bsdicrypt\n  { \"_\",     bsdi_expected_output,      9,  0, 0 },\n  // BSDI/DES always emits a round count.\n  // The _r expectation is used to verify that even inputs are\n  // made odd, rather than rejected.\n  { \"_\",     bsdi_expected_output_r,    9,  0, 16384 },\n  { \"_\",     bsdi_expected_output_l,    9,  0, MIN_LINEAR_COST },\n  { \"_\",     bsdi_expected_output_h,    9,  0, MAX_LINEAR_COST },\n#endif\n#if INCLUDE_md5crypt\n  { \"$1$\",   md5_expected_output,      11,  0, 0 },\n  // MD5/BSD doesn't have variable round count.\n#endif\n#if INCLUDE_sunmd5\n  { \"$md5\",  sunmd5_expected_output,   27,  0, 0 },\n  // MD5/Sun always emits a round count.\n  { \"$md5\", sunmd5_expected_output_l,  27,  0, MIN_LINEAR_COST },\n  { \"$md5\", sunmd5_expected_output_h,  32,  0, MAX_LINEAR_COST },\n#endif\n#if INCLUDE_sm3crypt\n  { \"$sm3$\", sm3_expected_output,      21,  0, 0 },\n  { \"$sm3$\", sm3_expected_output_r,    34,  0, 10191 },\n  { \"$sm3$\", sm3_expected_output_l,    33,  0, MIN_LINEAR_COST },\n  { \"$sm3$\", sm3_expected_output_h,    38,  0, MAX_LINEAR_COST },\n#endif\n#if INCLUDE_sha1crypt\n  { \"$sha1\", sha1_expected_output,     26, 34, 0 },\n  // SHA1/PBKDF always emits a round count.\n  { \"$sha1\", sha1_expected_output_l,   21, 29, MIN_LINEAR_COST },\n  { \"$sha1\", sha1_expected_output_h,   30, 38, MAX_LINEAR_COST },\n#endif\n#if INCLUDE_sha256crypt\n  { \"$5$\",   sha256_expected_output,   19,  0, 0 },\n  { \"$5$\",   sha256_expected_output_r, 32,  0, 10191 },\n  { \"$5$\",   sha256_expected_output_l, 31,  0, MIN_LINEAR_COST },\n  { \"$5$\",   sha256_expected_output_h, 36,  0, MAX_LINEAR_COST },\n#endif\n#if INCLUDE_sha512crypt\n  { \"$6$\",   sha512_expected_output,   19,  0, 0 },\n  { \"$6$\",   sha512_expected_output_r, 32,  0, 10191 },\n  { \"$6$\",   sha512_expected_output_l, 31,  0, MIN_LINEAR_COST },\n  { \"$6$\",   sha512_expected_output_h, 36,  0, MAX_LINEAR_COST },\n#endif\n#if INCLUDE_bcrypt\n  { \"$2b$\",  bcrypt_b_expected_output, 29,  0, 0 },\n  // bcrypt always emits a cost parameter.\n  // bcrypt's cost parameter is exponential, not linear, and\n  // values outside the documented range are errors.\n  { \"$2b$\",  bcrypt_b_expected_output_l, 29,  0, 4 },\n  { \"$2b$\",  bcrypt_b_expected_output_h, 29,  0, 31 },\n#endif\n  // Salt generation for legacy bcrypt variants uses the same code as\n  // the 'b' variant, so we don't bother testing them on non-default\n  // rounds.\n#if INCLUDE_bcrypt_a\n  { \"$2a$\",  bcrypt_a_expected_output, 29,  0, 0 },\n#endif\n#if INCLUDE_bcrypt_y\n  { \"$2y$\",  bcrypt_y_expected_output, 29,  0, 0 },\n#endif\n#if INCLUDE_yescrypt\n  { \"$y$\",   yescrypt_expected_output,   29, 29,  0 },\n  { \"$y$\",   yescrypt_expected_output_l, 29, 29,  1 },\n  { \"$y$\",   yescrypt_expected_output_h, 29, 29, 11 },\n#endif\n#if INCLUDE_scrypt\n  { \"$7$\",   scrypt_expected_output,   36, 36,  0 },\n  { \"$7$\",   scrypt_expected_output_l, 36, 36,  6 },\n  { \"$7$\",   scrypt_expected_output_h, 36, 36, 11 },\n#endif\n#if INCLUDE_gost_yescrypt\n  { \"$gy$\",  gost_yescrypt_expected_output,   30, 30,  0 },\n  { \"$gy$\",  gost_yescrypt_expected_output_l, 30, 30,  1 },\n  { \"$gy$\",  gost_yescrypt_expected_output_h, 30, 30, 11 },\n#endif\n#if INCLUDE_sm3_yescrypt\n  { \"$sm3y$\",  sm3_yescrypt_expected_output,   32, 32,  0 },\n  { \"$sm3y$\",  sm3_yescrypt_expected_output_l, 32, 32,  1 },\n  { \"$sm3y$\",  sm3_yescrypt_expected_output_h, 32, 32, 11 },\n#endif\n  { 0, 0, 0, 0, 0 }\n};\n\n/* The \"best available\" hashing method.  */\n#if INCLUDE_yescrypt\n# define EXPECTED_DEFAULT_PREFIX \"$y$\"\n#elif INCLUDE_bcrypt\n# define EXPECTED_DEFAULT_PREFIX \"$2b$\"\n#elif INCLUDE_sha512crypt\n# define EXPECTED_DEFAULT_PREFIX \"$6$\"\n#endif\n\n#if CRYPT_GENSALT_IMPLEMENTS_DEFAULT_PREFIX\n# ifndef EXPECTED_DEFAULT_PREFIX\n#  error \"Which hashing algorithm is the default?\"\n# endif\n#else\n# ifdef EXPECTED_DEFAULT_PREFIX\n#  error \"Default hashing algorithm should be available\"\n# endif\n#endif\n\nint\nmain (void)\n{\n  int status = 0;\n  unsigned int ent;\n  const struct testcase *tcase;\n  char output[CRYPT_GENSALT_OUTPUT_SIZE];\n  char prev_output[CRYPT_GENSALT_OUTPUT_SIZE];\n\n  for (tcase = testcases; tcase->prefix; tcase++)\n    {\n      memset (prev_output, 0, CRYPT_GENSALT_OUTPUT_SIZE);\n      for (ent = 0; ent < ARRAY_SIZE (entropy); ent++)\n        {\n          memset (output, 0, CRYPT_GENSALT_OUTPUT_SIZE);\n          char *salt = crypt_gensalt_rn (tcase->prefix, tcase->rounds,\n                                         entropy[ent], 16,\n                                         output, CRYPT_GENSALT_OUTPUT_SIZE);\n          if (salt == 0)\n            {\n              if (entropy[ent] == 0 && errno == ENOSYS)\n                {\n                  fprintf (stderr,\n                           \"UNSUPPORTED: %s/%lu/auto-entropy -> ENOSYS\\n\",\n                           tcase->prefix, tcase->rounds);\n                }\n              else\n                {\n                  fprintf (stderr, \"ERROR: %s/%lu/%u -> 0\\n\",\n                           tcase->prefix, tcase->rounds, ent);\n                  status = 1;\n                }\n              continue;\n            }\n          size_t slen = strlen (salt);\n          unsigned int expected_len =\n            (!entropy[ent] && tcase->expected_auto_len) ?\n            tcase->expected_auto_len : tcase->expected_len;\n          if (slen != expected_len)\n            {\n              fprintf (stderr,\n                       \"ERROR: %s/%lu/%u -> %s (expected len=%u got %zu)\\n\",\n                       tcase->prefix, tcase->rounds, ent, salt,\n                       expected_len, slen);\n              status = 1;\n            }\n          else if (strncmp (salt, tcase->prefix, strlen (tcase->prefix)))\n            {\n              fprintf (stderr, \"ERROR: %s/%lu/%u -> %s (prefix wrong)\\n\",\n                       tcase->prefix, tcase->rounds, ent, salt);\n              status = 1;\n            }\n          else if (!strcmp (salt, prev_output))\n            {\n              fprintf (stderr, \"ERROR: %s/%lu/%u -> %s (same as prev)\\n\",\n                       tcase->prefix, tcase->rounds, ent, salt);\n              status = 1;\n            }\n          else if (entropy[ent] &&  strcmp (salt, tcase->expected_output[ent]))\n            {\n              fprintf (stderr, \"ERROR: %s/%lu/%u -> %s (expected %s)\\n\",\n                       tcase->prefix, tcase->rounds, ent, salt,\n                       tcase->expected_output[ent]);\n              status = 1;\n            }\n          else\n            fprintf (stderr, \"   ok: %s/%lu/%u -> %s\\n\",\n                     tcase->prefix, tcase->rounds, ent, salt);\n\n          strcpy_or_abort (prev_output, CRYPT_GENSALT_OUTPUT_SIZE, salt);\n\n          /* Test if crypt works with this salt. */\n          if (!tcase->rounds)\n            {\n#define PASSW \"alexander\"\n              static struct crypt_data a, b;\n              if (!crypt_rn (PASSW, salt, &a, sizeof(a)))\n                {\n                  fprintf (stderr, \"ERROR: %s/%u -> crypt(gensalt) fail\\n\",\n                           tcase->prefix, ent);\n                  status = 1;\n                }\n              else if (!crypt_rn (PASSW, a.output, &b, sizeof(b)))\n                {\n                  fprintf (stderr, \"ERROR: %s/%u -> crypt(crypt(gensalt)) fail\\n\",\n                           tcase->prefix, ent);\n                  status = 1;\n                }\n              else if (strcmp (a.output, b.output))\n                {\n                  fprintf (stderr, \"ERROR: %s/%u -> crypt(gensalt) != crypt(crypt(gensalt))\\n\",\n                           tcase->prefix, ent);\n                  status = 1;\n                }\n              else\n                {\n                  fprintf (stderr, \"   ok: %s/%u -> crypt works with this salt\\n\",\n                           tcase->prefix, ent);\n                }\n            }\n        }\n    }\n#if CRYPT_GENSALT_IMPLEMENTS_DEFAULT_PREFIX\n  /* Passing a null pointer as the prefix argument to crypt_gensalt is\n     supposed to tell it to use the \"best available\" hashing method.  */\n  {\n    char *setting1, *setting2;\n    setting1 = crypt_gensalt_ra (EXPECTED_DEFAULT_PREFIX, 0, entropy[0], 16);\n    setting2 = crypt_gensalt_ra (0, 0, entropy[0], 16);\n    if ((setting1 == 0 && setting2 != 0) ||\n        (setting1 != 0 && setting2 == 0) ||\n        (setting1 != 0 && setting2 != 0 && strcmp (setting1, setting2)))\n      {\n        printf (\"FAILED: crypt_gensalt defaulting to $y$\\n\"\n                \"  $y$ -> %s\\n\"\n                \"  null -> %s\\n\",\n                setting1, setting2);\n        status = 1;\n      }\n    free (setting1);\n    free (setting2);\n  }\n#else\n  {\n    char *setting = crypt_gensalt_ra (0, 0, entropy[0], 16);\n    if (setting)\n      {\n        printf (\"FAILED: crypt_gensalt null -> %s (null expected)\\n\", setting);\n        status = 1;\n      }\n    free (setting);\n  }\n#endif\n  return status;\n}\n"
  },
  {
    "path": "test/getrandom-fallbacks.c",
    "content": "/* Test the fallback logic in get_random_bytes.\n\n   Written by Zack Weinberg <zackw at panix.com> in 2018.\n   To the extent possible under law, Zack Weinberg has waived all\n   copyright and related or neighboring rights to this work.\n\n   See https://creativecommons.org/publicdomain/zero/1.0/ for further\n   details.  */\n\n#include \"crypt-port.h\"\n\n#include <stdarg.h>\n#include <stdio.h>\n#include <string.h>\n#include <errno.h>\n\n#ifdef HAVE_FCNTL_H\n#include <fcntl.h>\n#endif\n#if defined HAVE_SYS_SYSCALL_H\n#include <sys/syscall.h>\n#endif\n#ifdef HAVE_SYS_STAT_H\n#include <sys/stat.h>\n#endif\n\n/* If arc4random_buf is available, all of the fallback logic is compiled\n   out and this test is unnecessary.  If ld --wrap is not available this\n   test will not work.  */\n#if defined HAVE_ARC4RANDOM_BUF || !defined HAVE_LD_WRAP\n\nint\nmain (void)\n{\n  return 77;\n}\n\n#else\n\n/* All of the mock system primitives below fill in their buffer with\n   repeats of these bytes, so we can tell where the data came from.  */\n#define MOCK_getentropy     'e'\n#define MOCK_getrandom      'r'\n#define MOCK_sys_getentropy 'E'\n#define MOCK_sys_getrandom  'R'\n#define MOCK_urandom        'u'\n\n#ifdef HAVE_GETENTROPY\nstatic bool getentropy_should_fail = false;\nextern int __wrap_getentropy (void *, size_t);\nint\n__wrap_getentropy (void *buf, size_t buflen)\n{\n  if (getentropy_should_fail)\n    {\n      errno = ENOSYS;\n      return -1;\n    }\n  else\n    {\n      memset (buf, MOCK_getentropy, buflen);\n      return 0;\n    }\n}\n#endif\n\n#ifdef HAVE_GETRANDOM\nstatic bool getrandom_should_fail = false;\nextern ssize_t __wrap_getrandom (void *, size_t, unsigned int);\nssize_t\n__wrap_getrandom (void *buf, size_t buflen, unsigned int ARG_UNUSED(flags))\n{\n  if (getrandom_should_fail)\n    {\n      errno = ENOSYS;\n      return -1;\n    }\n  else\n    {\n      buflen = MIN (buflen, INT16_MAX);\n      memset (buf, MOCK_getrandom, buflen);\n      return (ssize_t)buflen;\n    }\n}\n#endif\n\n#ifdef HAVE_SYSCALL\n#ifdef SYS_getentropy\nstatic bool sys_getentropy_should_fail = false;\n#endif\n#ifdef SYS_getrandom\nstatic bool sys_getrandom_should_fail = false;\n#endif\nstatic bool other_syscalls = false;\nextern long __wrap_syscall (long, ...);\nlong\n__wrap_syscall(long number, ...)\n{\n#ifdef SYS_getentropy\n  if (number == SYS_getentropy)\n    {\n      if (sys_getentropy_should_fail)\n        {\n          errno = ENOSYS;\n          return -1;\n        }\n      else\n        {\n          va_list ap;\n          va_start (ap, number);\n          void *buf = va_arg (ap, void *);\n          size_t buflen = va_arg (ap, size_t);\n          va_end (ap);\n          memset (buf, MOCK_sys_getentropy, buflen);\n          return 0;\n        }\n    }\n#endif\n#ifdef SYS_getrandom\n  if (number == SYS_getrandom)\n    {\n      if (sys_getrandom_should_fail)\n        {\n          errno = ENOSYS;\n          return -1;\n        }\n      else\n        {\n          va_list ap;\n          va_start (ap, number);\n          void *buf = va_arg (ap, void *);\n          size_t buflen = va_arg (ap, size_t);\n          buflen = MIN (buflen, INT16_MAX);\n          va_end (ap);\n          memset (buf, MOCK_sys_getrandom, buflen);\n          return (ssize_t)buflen;\n        }\n    }\n#endif\n  /* There is no vsyscall.  We just have to hope nobody in this test\n     program wants to use syscall() for anything else.  */\n  other_syscalls = true;\n  fprintf (stderr, \"ERROR: unexpected syscall(%ld)\\n\", number);\n  errno = ENOSYS;\n  return -1;\n}\n#endif /* HAVE_SYSCALL */\n\n/* It is not possible to hit both of the code paths that can set the\n   \"/dev/urandom doesn't work\" flag in a single test program, because\n   there's no way to _clear_ that flag again.  This test chooses to\n   exercise the read-failure path, not the open-failure path.  */\n#if defined HAVE_SYS_STAT_H && defined HAVE_FCNTL_H && defined HAVE_UNISTD_H\n\nstatic bool open_needs_mode(int flags)\n{\n  if (flags & O_CREAT)\n  {\n    return true;\n  }\n#if defined(O_TMPFILE)\n  if ((flags & O_TMPFILE) == O_TMPFILE)\n  {\n    return true;\n  }\n#endif\n  return false;\n}\n\nstatic bool urandom_should_fail = false;\nstatic int urandom_fd = -1;\nextern int __wrap_open (const char *, int, ...);\nextern int __real_open (const char *, int, ...);\nint\n__wrap_open (const char *path, int flags, ...)\n{\n  int mode = 0;\n  if (open_needs_mode(flags))\n  {\n    va_list args;\n    va_start(args, flags);\n    mode = va_arg(args, int);\n    va_end(args);\n  }\n\n  int ret = __real_open (path, flags, mode);\n  if (ret == -1)\n    return ret;\n  if (!strcmp (path, \"/dev/urandom\"))\n    urandom_fd = ret;\n  return ret;\n}\n\n#ifdef HAVE_OPEN64\nextern int __wrap_open64 (const char *, int, ...);\nextern int __real_open64 (const char *, int, ...);\nint\n__wrap_open64 (const char *path, int flags, ...)\n{\n  int mode = 0;\n  if (open_needs_mode(flags))\n  {\n    va_list args;\n    va_start(args, flags);\n    mode = va_arg(args, int);\n    va_end(args);\n  }\n\n  int ret = __real_open64 (path, flags, mode);\n  if (ret == -1)\n    return ret;\n  if (!strcmp (path, \"/dev/urandom\"))\n    urandom_fd = ret;\n  return ret;\n}\n#endif\n\nextern int __wrap_close (int);\nextern int __real_close (int);\nint\n__wrap_close (int fd)\n{\n  if (fd == urandom_fd)\n    urandom_fd = -1;\n  return __real_close (fd);\n}\n\nextern ssize_t __wrap_read (int, void *, size_t);\nextern ssize_t __real_read (int, void *, size_t);\nssize_t\n__wrap_read (int fd, void *buf, size_t count)\n{\n  if (fd == urandom_fd)\n    {\n      if (urandom_should_fail)\n        {\n          errno = ENOSYS;\n          return -1;\n        }\n      else\n        {\n          count = MIN (count, INT16_MAX);\n          memset (buf, MOCK_urandom, count);\n          return (ssize_t)count;\n        }\n    }\n  else\n    return __real_read (fd, buf, count);\n}\n\n#endif\n\nstruct subtest\n{\n  const char *what;\n  bool *make_fail;\n  char expected;\n};\nconst struct subtest subtests[] =\n{\n  { \"initial\", 0, 'x' },\n\n#ifdef HAVE_GETENTROPY\n  { \"getentropy\", &getentropy_should_fail, MOCK_getentropy },\n#endif\n#ifdef HAVE_GETRANDOM\n  { \"getrandom\", &getrandom_should_fail, MOCK_getrandom },\n#endif\n\n#ifdef HAVE_SYSCALL\n#ifdef SYS_getentropy\n  { \"sys_getentropy\", &sys_getentropy_should_fail, MOCK_sys_getentropy },\n#endif\n#ifdef SYS_getrandom\n  { \"sys_getrandom\", &sys_getrandom_should_fail, MOCK_sys_getrandom },\n#endif\n#endif\n\n#if defined HAVE_SYS_STAT_H && defined HAVE_FCNTL_H && defined HAVE_UNISTD_H\n  { \"/dev/urandom\", &urandom_should_fail, MOCK_urandom },\n#endif\n\n  { \"final\", 0, 0 }\n};\n\nint\nmain (void)\n{\n  char buf[257];\n  char expected[2] = { 0, 0 };\n  memset (buf, 'x', sizeof buf - 1);\n  buf[sizeof buf - 1] = '\\0';\n  bool failed = false;\n  const struct subtest *s;\n\n  for (s = subtests; s->expected;)\n    {\n      expected[0] = s->expected;\n      if (strspn (buf, expected) != 256)\n        {\n          printf (\"FAIL: %s: buffer not filled with '%c'\\n\",\n                  s->what, s->expected);\n          failed = true;\n        }\n      else\n        printf (\"ok: %s (output)\\n\", s->what);\n\n      if (s->make_fail)\n        *(s->make_fail) = true;\n      s++;\n\n      bool r = get_random_bytes (buf, sizeof buf - 1);\n      buf[sizeof buf - 1] = '\\0';\n      if ((s->expected && !r) || (!s->expected && r))\n        {\n          printf (\"FAIL: %s: get_random_bytes: %s\\n\",\n                  s->what, strerror (errno));\n          failed = true;\n        }\n      else\n        printf (\"ok: %s (return)\\n\", s->what);\n    }\n#if HAVE_SYSCALL\n  failed |= other_syscalls;\n#endif\n  return failed;\n}\n\n#endif\n"
  },
  {
    "path": "test/getrandom-interface.c",
    "content": "/* Test the exposed interface of get_random_bytes.\n\n   Written by Zack Weinberg <zackw at panix.com> in 2018.\n   To the extent possible under law, Zack Weinberg has waived all\n   copyright and related or neighboring rights to this work.\n\n   See https://creativecommons.org/publicdomain/zero/1.0/ for further\n   details.  */\n\n#include \"crypt-port.h\"\n\n#include <errno.h>\n#include <setjmp.h>\n#include <stdio.h>\n#include <string.h>\n#include <signal.h>\n#include <sys/mman.h>\n\nstatic bool error_occurred;\n\n/* Note: both of the following test functions expect PAGE to point to\n   PAGESIZE bytes of read-write memory followed by another PAGESIZE\n   bytes of unwritable memory.  Both functions also assume that\n   PAGESIZE is greater than or equal to 256.  */\n\nstatic void\ntest_basic (char *page, size_t pagesize)\n{\n  printf (\"Testing basic functionality...\\n\");\n\n  // A request for zero bytes should succeed, and should not touch the\n  // output buffer.\n  if (!get_random_bytes (page + pagesize, 0))\n    {\n      printf (\"ERROR: get_random_bytes(0) = %s\\n\", strerror (errno));\n      error_occurred = 1;\n    }\n  else\n    printf (\"ok: get_random_bytes(0)\\n\");\n\n  // A request for 257 bytes should fail, and should not touch the\n  // output buffer.\n  if (get_random_bytes (page + pagesize, 257))\n    {\n      printf (\"ERROR: get_random_bytes(257) succeeded\\n\");\n      error_occurred = 1;\n    }\n  else if (errno != EIO)\n    {\n      printf (\"ERROR: get_random_bytes(257) = %s (expected: %s)\\n\",\n              strerror (errno), strerror (EIO));\n      error_occurred = 1;\n    }\n  else\n    printf (\"ok: get_random_bytes(257)\\n\");\n\n  // A request for five bytes should succeed, and should not write\n  // past the end of the buffer.  (We use an odd, prime number here to\n  // catch implementations that might write e.g. four or eight bytes\n  // at once.)\n  if (!get_random_bytes (page + pagesize - 5, 5))\n    {\n      printf (\"ERROR: get_random_bytes(5) = %s\\n\", strerror (errno));\n      error_occurred = 1;\n    }\n  else\n    printf (\"ok: get_random_bytes(5)\\n\");\n\n  // It's extremely difficult to say whether any output of a random\n  // number generator is or is not \"good\", but the odds that 251 bytes\n  // of RNG output are all zero is one in 2**2008, and the odds that\n  // the first 251 bytes of RNG output are equal to the second 251\n  // bytes of RNG output is also one in 2**2008.  (Again, we use an\n  // odd, prime number to trip up implementations that do wide writes.)\n\n  char prev[251];\n  memset (prev, 0, 251);\n\n  if (!get_random_bytes (page + pagesize - 251, 251))\n    {\n      printf (\"ERROR: get_random_bytes(251)/1 = %s\\n\", strerror (errno));\n      error_occurred = 1;\n      return;\n    }\n\n  if (!memcmp (prev, page + pagesize - 251, 251))\n    {\n      printf (\"ERROR: get_random_bytes(251)/1 produced all zeroes\\n\");\n      error_occurred = 1;\n      return;\n    }\n\n  memcpy (prev, page + pagesize - 251, 251);\n\n  if (!get_random_bytes (page + pagesize - 251, 251))\n    {\n      printf (\"ERROR: get_random_bytes(251)/2 = %s\\n\", strerror (errno));\n      error_occurred = 1;\n      return;\n    }\n\n  if (!memcmp (prev, page + pagesize - 251, 251))\n    {\n      printf (\"ERROR: get_random_bytes(251)/2 produced same output \"\n              \"as /1\\n\");\n      error_occurred = 1;\n      return;\n    }\n\n  printf (\"ok: get_random_bytes(251) smoke test of output\\n\");\n}\n\nstatic void\ntest_fault (char *page, size_t pagesize)\n{\n  printf (\"Testing partially inaccessible output buffer...\\n\");\n  bool rv = get_random_bytes (page + pagesize - 64, 128);\n  /* shouldn't ever get here */\n  error_occurred = 1;\n  if (rv)\n    printf (\"ERROR: success (should have faulted)\\n\");\n  else\n    printf (\"ERROR: failed with %s (should have faulted)\\n\",\n            strerror (errno));\n}\n\n/* In one of the tests above, a segmentation fault is the expected result.  */\nstatic sigjmp_buf env;\nstatic void\nsegv_handler (int sig)\n{\n  siglongjmp (env, sig);\n}\n\nstatic void\nexpect_no_fault (char *page, size_t pagesize,\n                 void (*testfn) (char *, size_t))\n{\n  int rv = sigsetjmp (env, 1);\n  if (!rv)\n    testfn (page, pagesize);\n  else\n    {\n      printf (\"ERROR: Unexpected %s\\n\", strsignal (rv));\n      error_occurred = 1;\n    }\n}\n\nstatic void\nexpect_a_fault (char *page, size_t pagesize,\n                void (*testfn) (char *, size_t))\n{\n  int rv = sigsetjmp (env, 1);\n  if (!rv)\n    {\n      testfn (page, pagesize);\n      printf (\"ERROR: No signal occurred\\n\");\n      error_occurred = 1;\n    }\n  else\n    {\n      printf (\"ok: %s (as expected)\\n\", strsignal (rv));\n    }\n}\n\nint\nmain (void)\n{\n  /* Set up a two-page region whose first page is read-write and\n     whose second page is inaccessible.  */\n  long pagesize_l = sysconf (_SC_PAGESIZE);\n  if (pagesize_l < 256)\n    {\n      printf (\"ERROR: pagesize of %ld is too small\\n\", pagesize_l);\n      return 99;\n    }\n\n  size_t pagesize = (size_t) pagesize_l;\n  char *page = mmap (0, pagesize * 2, PROT_READ|PROT_WRITE,\n                     MAP_PRIVATE|MAP_ANON, -1, 0);\n  if (page == MAP_FAILED)\n    {\n      perror (\"mmap\");\n      return 1;\n    }\n  // coverity[overflow_sink]\n  memset (page, 'x', pagesize * 2);\n  if (mprotect (page + pagesize, pagesize, PROT_NONE))\n    {\n      perror (\"mprotect\");\n      return 1;\n    }\n\n  struct sigaction sa, os, ob;\n  sigfillset (&sa.sa_mask);\n  sa.sa_flags = SA_RESTART;\n  sa.sa_handler = segv_handler;\n  if (sigaction (SIGBUS, &sa, &ob) || sigaction (SIGSEGV, &sa, &os))\n    {\n      perror (\"sigaction\");\n      return 1;\n    }\n\n  expect_no_fault (page, pagesize, test_basic);\n  expect_a_fault  (page, pagesize, test_fault);\n\n  sigaction (SIGBUS, &ob, 0);\n  sigaction (SIGSEGV, &os, 0);\n\n  return error_occurred;\n}\n"
  },
  {
    "path": "test/ka-table-gen.py",
    "content": "#! /usr/bin/python3\n# Compute test cases for ka-* tests.\n#\n# Written by Zack Weinberg <zackw at panix.com> in 2019.\n# To the extent possible under law, Zack Weinberg has waived all\n# copyright and related or neighboring rights to this work.\n#\n# See https://creativecommons.org/publicdomain/zero/1.0/ for further\n# details.\n\n# This program generates ka-table.inc, which defines the set\n# of tests performed by the ka-*.c tests.  It is not run automatically\n# during the build for two reasons: it's very slow, and it requires Python\n# 3.6 or greater with Passlib <https://passlib.readthedocs.io/en/stable/>\n# available.\n#\n# If you modify this program, make sure to update ka-table.inc,\n# by running 'make regen-ka-table' (libcrypt.so must already have been\n# built), and then check in the updates to that file in the same\n# commit as your changes to this program.  You will need to install\n# Passlib itself, but not any other libraries.\n#\n# This program intentionally uses Passlib's slow pure-Python back\n# ends, rather than accelerated C modules that tend to be, at their\n# core, the same code libxcrypt uses itself, so that we really are\n# testing libxcrypt against known answers generated with a different\n# implementation.\n\nimport array\nimport ctypes\nimport multiprocessing\nimport os\nimport re\nimport sys\n\n# force passlib to allow use of its built-in bcrypt implementation\nos.environ[\"PASSLIB_BUILTIN_BCRYPT\"] = \"enabled\"\n\nimport passlib.hash\n\n# In order to tickle various bugs and limitations in older hashing\n# methods precisely, we need to test several passphrases whose byte\n# sequences are not valid Unicode text in any encoding.  We therefore\n# use exclusively byte strings in this array.\nPHRASES = [\n    # All ASCII printable, various lengths.  Most of these were taken\n    # from older known-answer tests for specific hashing methods.\n    b'',\n    b' ',\n    b'a',\n    b'ab',\n    b'abc',\n    b'U*U',\n    b'U*U*',\n    b'U*U*U',\n    b'.....',\n    b'dragon',\n    b'dRaGoN',\n    b'DrAgOn',\n    b'PAROLX',\n    b'U*U***U',\n    b'abcdefg',\n    b'01234567',\n    b'726 even',\n    b'zyxwvuts',\n    b'ab1234567',\n    b'alexander',\n    b'beautiful',\n    b'challenge',\n    b'chocolate',\n    b'cr1234567',\n    b'katherine',\n    b'stephanie',\n    b'sunflower',\n    b'basketball',\n    b'porsche911',\n    b'|_337T`/p3',\n    b'thunderbird',\n    b'Hello world!',\n    b'pleaseletmein',\n    b'a short string',\n    b'zxyDPWgydbQjgq',\n    b'photojournalism',\n    b'ecclesiastically',\n    b'congregationalism',\n    b'dihydrosphingosine',\n    b'semianthropological',\n    b'palaeogeographically',\n    b'electromyographically',\n    b'noninterchangeableness',\n    b'abcdefghijklmnopqrstuvwxyz',\n    b'electroencephalographically',\n    b'antidisestablishmentarianism',\n    b'cyclotrimethylenetrinitramine',\n    b'dichlorodiphenyltrichloroethane',\n    b'multiple words seperated by spaces',\n    b'supercalifragilisticexpialidocious',\n    b'we have a short salt string but not a short password',\n    b'multiple word$ $eperated by $pace$ and $pecial character$',\n    b'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789',\n    (b'1234567890123456789012345678901234567890'\n     b'1234567890123456789012345678901234567890'),\n    (b'a very much longer text to encrypt.  This one even stretches over more'\n     b'than one line.'),\n\n    # ASCII printables with their high bits flipped - DES-based hashes collide.\n    # All of these have an exact counterpart above.\n    b'\\xd0\\xc1\\xd2\\xcf\\xcc\\xd8',              # 'PAROLX'\n    b'\\xd5\\xaa\\xd5\\xaa\\xaa\\xaa\\xd5\\xaa',      # 'U*U***U*'\n    b'\\xe1\\xec\\xe5\\xf8\\xe1\\xee\\xe4\\xe5\\xf2',  # 'alexander'\n    b'\\xf3\\xf4\\xe5\\xf0\\xe8\\xe1\\xee\\xe9\\xe5',  # 'stephanie'\n    # '*U*U*U*U*U*U*U*U*'\n    b'\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa',\n\n    # A few UTF-8 strings and what they will collide with for\n    # DES-based hashes.\n    b'\\xC3\\xA9tude', b'C)tude', # UTF-8(NFC(étude))\n    b'Chl\\xC3\\xB6e', b'ChlC6e', # UTF-8(NFC(Chlöe))\n    # Eight letters, but 10 bytes: UTF-8(NFC(Ångström))\n    b'\\xC3\\x85ngstr\\xC3\\xB6m', b'C\\x05ngstrC6m', b'C\\x05ngstrC'\n\n    # descrypt truncates everything to 8 characters.\n    b'U*U***U*', b'U*U***U*ignored',\n    b'U*U*U*U*', b'U*U*U*U*ignored',\n    b'*U*U*U*U', b'*U*U*U*U*', b'*U*U*U*U*U*U*U*U', b'*U*U*U*U*U*U*U*U*',\n\n    # Patterns designed to tickle the bcrypt $2x$ sign-extension bug.\n    b'\\xa3',\n    b'\\xa3a',\n    b'\\xd1\\x91',\n    b'\\xa3ab',\n    b'\\xff\\xff\\xa3',\n    b'1\\xa3345',\n    b'\\xff\\xa3345',\n    b'\\xff\\xa334\\xff\\xff\\xff\\xa3345',\n\n    (b'\\x55\\xaa\\xff\\x55\\xaa\\xff\\x55\\xaa\\xff\\x55\\xaa\\xff'\n     b'\\x55\\xaa\\xff\\x55\\xaa\\xff\\x55\\xaa\\xff\\x55\\xaa\\xff'\n     b'\\x55\\xaa\\xff\\x55\\xaa\\xff\\x55\\xaa\\xff\\x55\\xaa\\xff'\n     b'\\x55\\xaa\\xff\\x55\\xaa\\xff\\x55\\xaa\\xff\\x55\\xaa\\xff'\n     b'\\x55\\xaa\\xff\\x55\\xaa\\xff\\x55\\xaa\\xff\\x55\\xaa\\xff'\n     b'\\x55\\xaa\\xff\\x55\\xaa\\xff\\x55\\xaa\\xff\\x55\\xaa\\xff'),\n\n    (b'\\xaa\\x55\\xaa\\x55\\xaa\\x55\\xaa\\x55\\xaa\\x55\\xaa\\x55'\n     b'\\xaa\\x55\\xaa\\x55\\xaa\\x55\\xaa\\x55\\xaa\\x55\\xaa\\x55'\n     b'\\xaa\\x55\\xaa\\x55\\xaa\\x55\\xaa\\x55\\xaa\\x55\\xaa\\x55'\n     b'\\xaa\\x55\\xaa\\x55\\xaa\\x55\\xaa\\x55\\xaa\\x55\\xaa\\x55'\n     b'\\xaa\\x55\\xaa\\x55\\xaa\\x55\\xaa\\x55\\xaa\\x55\\xaa\\x55'\n     b'\\xaa\\x55\\xaa\\x55\\xaa\\x55\\xaa\\x55\\xaa\\x55\\xaa\\x55'),\n\n    # bcrypt truncates to 72 characters\n    (b'0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'\n     b'0123456789'),\n    (b'0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'\n     b'0123456789chars after 72 are ignored'),\n\n    (b'\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa'\n     b'\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa'\n     b'\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa'\n     b'\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa'\n     b'\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa'\n     b'\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa'),\n\n    (b'\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa'\n     b'\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa'\n     b'\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa'\n     b'\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa'\n     b'\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa'\n     b'\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa'\n     b'chars after 72 are ignored as usual'),\n\n    # bigcrypt truncates to 128 characters\n    # (first sentence of _Twenty Thousand Leagues Under The Sea_)\n    (b'THE YEAR 1866 was marked by a bizarre development, an unexplained and '\n     b'downright inexplicable phenomenon that surely no one has forgotten.'),\n\n    # first 8 characters of above (des)\n    b'THE YEAR',\n    # first 72 characters (bcrypt)\n    b'THE YEAR 1866 was marked by a bizarre development, an unexplained and do',\n    # first 128 characters (bigcrypt)\n    (b'THE YEAR 1866 was marked by a bizarre development, an unexplained and '\n     b'downright inexplicable phenomenon that surely no one has f')\n]\n\n# passlib does not support all of the hashing methods we do, no longer\n# supports generation of bare setting strings, and in some cases does\n# not support all of the variants we need to generate.  Therefore,\n# there is a shim for each hashing method (variant).  Shims must be\n# named 'h_METHOD' where METHOD is the name for the method used by the\n# INCLUDE_method macros.\n#\n# Each shim function takes at least the arguments phrase, rounds, and\n# salt, in that order.  Additional optional arguments are allowed.  It\n# should do 'yield (phrase, setting, expected)' at least once, where\n# phrase is the phrase argument, setting is a setting string generated\n# from rounds and salt, and expected is the hashed passphrase expected\n# to be generated from that combination of phrase and setting.\n#\n# When implementing new shims, use of passlib's pure-Python \"backends\"\n# is strongly preferred where possible, because the speed of this\n# program does not matter, and the C backends tend to be based on some\n# incarnation of the same code that libxcrypt uses itself, so it\n# wouldn't be a proper interop test.\n\n# straightforward passlib wrappers, sorted by age of algorithm\nDES_CRYPT = passlib.hash.des_crypt\nDES_CRYPT.set_backend(\"builtin\")\ndef h_descrypt(phrase, rounds, salt):\n    expected = DES_CRYPT.using(\n        salt=salt, truncate_error=False\n    ).hash(phrase)\n    setting = expected[:2]\n    yield (phrase, setting, expected)\n\nBIGCRYPT = passlib.hash.bigcrypt\n# BIGCRYPT.set_backend(\"builtin\") # currently p.h.bigcrypt always uses builtin\ndef h_bigcrypt(phrase, rounds, salt):\n    # p.h.bigcrypt doesn't truncate to 128 chars.\n    # The bigcrypt implementation in libxcrypt was reverse engineered\n    # from a closed-source original and it's possible that they could\n    # have gotten it wrong, but let's stick to what we have.\n    expected = BIGCRYPT.using(\n        salt=salt\n    ).hash(phrase[:128])\n    # bigcrypt has no prefix, so our crypt() looks at the length of\n    # the setting string to decide whether it should use bigcrypt or\n    # descrypt.  For bigcrypt to be used, the setting must be too long\n    # to be a traditional DES hashed password.\n    setting = expected[:2] + \"..............\"\n    yield (phrase, setting, expected)\n\nBSDI_CRYPT = passlib.hash.bsdi_crypt\nBSDI_CRYPT.set_backend(\"builtin\")\ndef h_bsdicrypt(phrase, rounds, salt):\n    expected = BSDI_CRYPT.using(\n        salt=salt, rounds=rounds\n    ).hash(phrase)\n    setting = expected[:9]\n    yield (phrase, setting, expected)\n\nMD5_CRYPT = passlib.hash.md5_crypt\nMD5_CRYPT.set_backend(\"builtin\")\ndef h_md5crypt(phrase, rounds, salt):\n    expected = MD5_CRYPT.using(\n        salt=salt\n    ).hash(phrase)\n    setting = expected[:expected.rfind('$')]\n    yield (phrase, setting, expected)\n\nBSD_NTHASH = passlib.hash.bsd_nthash\n#BSD_NTHASH.set_backend(\"builtin\") # has only the built-in backend\ndef h_nt(phrase, rounds, salt):\n    # passlib.hash.bsd_nthash attempts to decode byte strings as UTF-8, which\n    # is Not What We Want.  Python's iso_8859_1 is an identity map from 00..FF\n    # to U+0000..U+00FF, which is correct for this application.\n    expected = BSD_NTHASH.hash(phrase.decode(\"iso_8859_1\"))\n    # NTHash doesn't have a salt.\n    # Older versions of libxcrypt generated a fake salt which\n    # we should ensure is ignored.\n    yield (phrase, \"$3$\", expected)\n    yield (phrase, \"$3$__not_used__0123456789abcdef\", expected)\n\nSHA1_CRYPT = passlib.hash.sha1_crypt\nSHA1_CRYPT.set_backend(\"builtin\")\ndef h_sha1crypt(phrase, rounds, salt):\n    expected = SHA1_CRYPT.using(\n        salt=salt, rounds=rounds\n    ).hash(phrase)\n    setting = expected[:expected.rfind('$')]\n    yield (phrase, setting, expected)\n\nSHA256_CRYPT = passlib.hash.sha256_crypt\nSHA256_CRYPT.set_backend(\"builtin\")\ndef h_sha256crypt(phrase, rounds, salt):\n    expected = SHA256_CRYPT.using(\n        salt=salt, rounds=rounds\n    ).hash(phrase)\n    setting = expected[:expected.rfind('$')]\n    yield (phrase, setting, expected)\n\nSHA512_CRYPT = passlib.hash.sha512_crypt\nSHA512_CRYPT.set_backend(\"builtin\")\ndef h_sha512crypt(phrase, rounds, salt):\n    expected = SHA512_CRYPT.using(\n        salt=salt, rounds=rounds\n    ).hash(phrase)\n    setting = expected[:expected.rfind('$')]\n    yield (phrase, setting, expected)\n\n# these need to do more work by hand\n\n# We need to test setting strings both with and without the suffix\n# that triggers the off-by-one error in the original Sun hash parser\n# (which must be preserved by all interoperable implementations).\n# passlib.hash.sun_md5_crypt.using(..., bare_salt=True) does not\n# actually work.\nfrom passlib.handlers.sun_md5_crypt import raw_sun_md5_crypt\ndef h_sunmd5(phrase, rounds, salt):\n\n    # sunmd5 is extremely slow in this test, compared to all the other\n    # hashes, because we have to do extra tests of bug-compatibility,\n    # because its round count cannot be reduced below 4096, and\n    # because on approximately half of those rounds it feeds an\n    # additional 1.5k of text to MD5_Update.  The only optimization\n    # that wouldn't break compatibility would be to plug in a faster\n    # MD5 core, but that's not worth the engineering effort since it\n    # would only benefit obsolete hashes.  Instead, skip most of the\n    # test phrases for this hash.  This cuts the wall-clock time for\n    # ka-sunmd5 (on a current-generation x86-64) from fifty to nine\n    # seconds, which we can live with.  sunmd5 feeds the phrase\n    # verbatim to MD5_Update, only once, with no length limit, so we\n    # don't need a lot of careful testing of different phrases.  We do\n    # still include at least a few of the non-ASCII test phrases, and\n    # one very long phrase.\n    if 6 <= len(phrase) <= 128:\n        return\n\n    if rounds == 0:\n        bare_setting = \"$md5$\" + salt\n    else:\n        bare_setting = \"$md5,rounds={}${}\".format(rounds, salt)\n\n    suff_setting = bare_setting + \"$\"\n    bare_cksum = raw_sun_md5_crypt(phrase, rounds, bare_setting.encode(\"ascii\"))\n    suff_cksum = raw_sun_md5_crypt(phrase, rounds, suff_setting.encode(\"ascii\"))\n\n    bare_cksum = bare_cksum.decode(\"ascii\")\n    suff_cksum = suff_cksum.decode(\"ascii\")\n\n    yield (phrase, bare_setting, bare_setting + \"$\" + bare_cksum)\n    yield (phrase, bare_setting + \"$x\", bare_setting + \"$\" + bare_cksum)\n    yield (phrase, suff_setting, suff_setting + \"$\" + suff_cksum)\n    yield (phrase, suff_setting + \"$\", suff_setting + \"$\" + suff_cksum)\n\n# testing bcrypt $2b$ and $2y$ is easy, but ...\nBCRYPT = passlib.hash.bcrypt\nBCRYPT.set_backend(\"builtin\")\ndef h_bcrypt(phrase, rounds, salt):\n    expected = BCRYPT.using(\n        salt=salt, rounds=rounds, ident=\"2b\"\n    ).hash(phrase)\n    setting = expected[:-31]\n    yield (phrase, setting, expected)\n\ndef h_bcrypt_y(phrase, rounds, salt):\n    expected = BCRYPT.using(\n        salt=salt, rounds=rounds, ident=\"2y\"\n    ).hash(phrase)\n    setting = expected[:-31]\n    yield (phrase, setting, expected)\n\n# ...passlib doesn't implement the quirks of crypt_blowfish's $2a$ or\n# $2x$, but we really must test them.  It is theoretically possible to\n# implement the $2x$ quirk by a transformation on the input\n# passphrase, but it would be hard to get right, and the $2a$ quirk\n# cannot be implemented this way.  The path of least resistance is to\n# compute the $2b$ hash and then look up its output in a table of\n# substitutions for each quirk.  The collision resistance of the $2b$\n# hash should protect us from false hits in these tables.  (Remember\n# that the $2x$ quirk is a _bug_, preserved for backward compatibility's\n# sake, that causes output collisions; duplicate entries on the\n# right-hand side of the $2x$ substitution table are expected.)\nbcrypt_a_substitutions = {\n    'HdhhdUXVgLADnbTYf12kvsasO1gS51C': '5jlqAXzFdq.3//pJFBa432Pepsclbdu',\n    'caGU5ROXj4M8Tgsx3s/D5BQIuhazIWa': '7N5c8AaH.dbqz7.2o.V2mRkUDV0TZnO',\n    '8jdeg8QqT4CX3ERA9vZPFZAkxZRpxJW': 'D8jTC5oJeIumVOhMVpz79BzoGVhCjrW',\n    '9f4sA9SRA0scUKcRyC5kce8dao2.GKe': 'E8Lpo1/qkGPTBDBxEsJjeEzh9nkZ9uW',\n    'MOaOTHB4gEm.rriBjXNwBNh.Oc4mKGG': 'ZQhQBRpiYJCaQFgyHlB.t/F01cqLCIu',\n    'Qjdj3GXX7D0sFE9jji6wxSTWIhqI3US': 'euRNRfAA6e0fjpTfQPPAMU1PCOf9IHq',\n    'PIeeyENZVZmrKLAq5lwBUU9fMRVfV2m': 'h87NWu/js59XXaIj1hDyHxnjw7MJ5K6',\n    'VmFQpoXeVuKTzkg2ZRsAf.8PZJZg142': 'vrukkCtLqHBLoBDsz6QoBtSwzI9Qxiq',\n}\ndef h_bcrypt_a(phrase, rounds, salt):\n    base = BCRYPT.using(\n        salt=salt, rounds=rounds, ident=\"2b\"\n    ).hash(phrase)\n    base_setting = base[4:-31]\n    base_output  = base[-31:]\n    output = bcrypt_a_substitutions.get(base_output, base_output)\n\n    setting = \"$2a$\" + base_setting\n    expected = setting + output\n    yield (phrase, setting, expected)\n\nbcrypt_x_substitutions = {\n    'xGPMyJSPyyeICKolPQ2gecm8rOgHwz.': '.sDifhVkUxvjPx6U4yeM2tC411Wuc.W',\n    'SRMKxjeMqVSDMhSLhOnvtEZ/p5KhUbq': '1Z0zKnHbUU3q/kk//Pknlv19a4/T8.K',\n    'PQInhDOdCKnXeUE.n/L.kQmTKM9ldK2': '25hhqa/GOJGmXui3avNI5MN8lOI2bCW',\n    '7UwHe/ywPmdp.nr.ZLQSxd8hqn7qURW': '2E0h7UFL/4fALemA5ApWrCWllQXSPTu',\n    'FZEYKXyyMgG13MK0uV8dwNotWf4Wm6e': '2M7Vc.sF98e8DDmnxFjRfAmrudbv6y.',\n    'ZHZAnvydiPNiYH2VjRNhEAD6BEiyaWS': '3kVpkKaj1q2TAXm.ptIi98Nj3zVV8A2',\n    'I7vjUzDOKf8XqcK8VSCm9b0bwoSm1Qm': '6He0iAS8JsdM.iB4OQ4fbsKMXPagLhy',\n    'tLCLEXAt3RUjOgs.yvfWSni4j1JX/JS': '7bLwFi3rlVcl.xfhc7LxjqwOExfxki2',\n    'zQPVIDk6wF8XmESji30KDHFabTlu0WK': '8gGm3RkYFflDX50UQs.tJ8InKNy.HGO',\n    'KBv1eBM2he2T/QheS8zPHMejn5fMNRe': '8jdeg8QqT4CX3ERA9vZPFZAkxZRpxJW',\n    'XEhidoDX1kz.RFnwWIzMJvtW2aP/k4e': '8jdeg8QqT4CX3ERA9vZPFZAkxZRpxJW',\n    'UIzecIiCguM2sPh1F7L9IS3zOtmg5Im': '9f4sA9SRA0scUKcRyC5kce8dao2.GKe',\n    'Xl2V4mQ7s0zX0b4XXH/b9UkRRCWpq3e': '9f4sA9SRA0scUKcRyC5kce8dao2.GKe',\n    'tHwehGUs3q0b/Ejn42MsoM4Yv/iA1rq': '9iflVP0Ezo/iaxO0XS74wFglLNeryTS',\n    'K2KXzhsMefB8v6hJJG3bOyKV.XRf6Qe': 'C3nvb4DotHdnRYgOPcdiK0C4q.DkIDO',\n    'EuEnx.TyCLYgkTV/uhWL5xJTHV7ZMjG': 'HdhhdUXVgLADnbTYf12kvsasO1gS51C',\n    'oaE0x.b2rUEITWgPdg.GEcU4ePHLh6m': 'IZEWKJgp.b.KG29zgOadgd2rUt5iV1e',\n    '3cFqlEl7Y0HWaVLHpyyCqG8dBNk1DSm': 'IvJ5WHgSbYKj7g9hhdVsAjyzcnVT/.m',\n    'gI4g/1M6K/Sz2bsgu9VDeEl6reszuXa': 'J6Y/kPTV/aHj7iJKuDfD5OPjVTvT2BK',\n    'rz1efvzeJjL4mQ813hrZNg3p1.ivOii': 'MOaOTHB4gEm.rriBjXNwBNh.Oc4mKGG',\n    'Tp1b9XCEV16BcrQ.0k4xf7V/OGPZLnK': 'N5E4WSTo/R5henexIN1o8xkGwe2V86W',\n    'CARhc7ugFdgoPjDb7LUG.yQF2lboK6e': 'NjlOVoE5aHHQGtU9zc25wu0VykHnD1G',\n    'nCdKcLO57oLlc6J6sNnGyfT9FrIawiW': 'PIeeyENZVZmrKLAq5lwBUU9fMRVfV2m',\n    'DQjlTXDA5PBQ97.qBJY/vsHPQhLJDMe': 'PMOS6ygjFMSbDo.iJJam/G63inGIOBO',\n    '1qOUgfpg30XDHLx/zrbWiMRcWyFhwye': 'QZ7A0p9q1Ag9Utfnfl/xif8NiDtVhO.',\n    'h0JFRyDXfP0duxAkVxWGr8nMDEDvPca': 'QiT.KUY9PXgIzL2aECMKb0EvVl0Pzw6',\n    'BvtRGGx3p8o0C5C36uS442Qqnrwofrq': 'Qjdj3GXX7D0sFE9jji6wxSTWIhqI3US',\n    'UTFLPGm29p.YVzcY6pqejGEql1x8Ccq': 'TYqa73Yp3leHe3D6.ysuJtNLwOma87C',\n    'YdPam5/ypFIyDUQMyCCEIwzVsTi0Sa6': 'TmFuGBy/Zgc6JVAr667oHeCvGQGyS1q',\n    'gbhoNOH4mWxoEhRrQNdeI.rpk9XeuZS': 'UPPO3QqmgMIXGHvbOLe2IkNzHLAToY2',\n    'ZkQGqjbMpqQ9oCsxNZjN8LQJaHFqPMC': 'VTMVcF7YBLV2/O6V1PNcQw0BD3hTN6a',\n    'RbKkfW2ph8bd8B5yul5E97DxgDw9cT.': 'VmFQpoXeVuKTzkg2ZRsAf.8PZJZg142',\n    'WI7ZNXFtzCd9mN1mWoNMQRHEmkDsZnm': 'VmFQpoXeVuKTzkg2ZRsAf.8PZJZg142',\n    '2WegkGS5Xr/qYNkfEi6JmnR16WVSwcW': 'Xv3TUB0NdnMpyn4cfg4g48oZxRSIrNC',\n    'LN/CEHXLfFeYdOOxbdxKu8ZqSIKgqAu': 'YdqUOXeMKw7X6zbqBXP6c1xqIKun7Oq',\n    'VAQY6kySmwStlNY.sut9Y87njVr0mm.': 'Ysbn1VpHCTzInfW/z/8Q3k676rxfmSW',\n    'qJn4AY9ch/WAR5JXeeJtVGeovjQrhd2': 'ZH9vItRapPbkFKo0iQqU4v71o0e19Mm',\n    '4QrucGf30zIbQA.sO0d1QrU63xBrEYq': 'bqJMLkbvnTFj0OYMu9tPnQXstRzX/e6',\n    'HD8RnTmGEavoR3LFVfdHvh3xA0QPka2': 'cYbtH8J2lfpMIiBKfF3pKpMno7JlLui',\n    '6WgD2zYQDPgxR2sXlUeEeGKknxt95W.': 'caGU5ROXj4M8Tgsx3s/D5BQIuhazIWa',\n    'rPSVExmrZ2WB1xntSbqZ/DRQRlKtVw.': 'caGU5ROXj4M8Tgsx3s/D5BQIuhazIWa',\n    'PYLCOpTKZmhFn1CoBM2XNbWgqMX4Jk2': 'cxMAJfIx3T.Fv3O0KjL9VdM/oSSUVRK',\n    'w8RVl3rh7sNazq544l0944qGq4GUFUq': 'fOj7giyJz5k22FHTKGVo8o1o5zGzPsq',\n    'KHsCqMFVxOAGJObHwEBR3JaEdKVu1.m': 'fRmxM11/x97bxCrhecMENdkPm7YpRbe',\n    '3wn02pxRJPnFwvlGt75DURDbt4g7om.': 'fY4v5x6.8txtKUKDP86z1xjlXG/GgZO',\n    'k9Hv17Gha84losGKAq61csCZokj5pyy': 'gLfxf5sydYesf658mrFYb51nLrn/4Sm',\n    'uTNb9MEHVGI7kd6UnQjYxgRNiKJM01S': 'h.z2vLHB/tYSU5fPXkrYB7TxLHGJnI6',\n    'heAts1y/8kcTTP0/vD3yeuMX1ihF8dO': 'j72N2Fi2j3pGalOZvTqtyH3bYGotuju',\n    'SqNATdQiNEckAKLsqgsKbAM5.hZoMCq': 'mjGosqV8OkKEcduYTNz5PKN2scswFya',\n    'k786rdsOdUP4cRi.dLa3dsYueMj5UnS': 'nQF1kDoMDjBBwXy2wwMni2gJLKqA0ta',\n    'G6PeIXKiqeNUPUbqFkMJvvI7G9hd51W': 'oBvt6zJCTP5OED1esTYUYPn31cWqwsa',\n    'TszY8.avBpwJ6xbNjwws3SKBbK6kj6S': 'odAvHZH9azlhi1x4pBLF25.hj08RMFi',\n    'z4QFggBRTVUeHRGL/CQxlAYHraYPcpa': 'ojiyBkc.4HZ2y5Yh0LxBbI6ZkLiRg0C',\n    'PPtdI0NcxZ4Txyv/Y5ORfcP1XFriKT2': 'pjce7u/YRnectNa8DXjsSGzRdyH2PSG',\n    'uIZ1Lgb.jHRDU/Z/LVXfpQCK72fTEHq': 'q5NMeQZ0UTyP/bILj02wdQ.Si5KHU1K',\n    '51cV.PJOQVwmiao4t4lXsb9Cc3Jnuem': 'rB3dV.fJGdSihNlP0vo5PemoaZRp6LS',\n    's6h1E6A2RzVn2KxXLQXsKosQeRo8bLa': 'sND7G4.cx6Dzn6TqbXfK99bElU0a7P.',\n    'A96emG/jBf0K1K6vCG.eZGdLkSridom': 'tlD3cmtHgs/TwWAvy5E3F.freZS1bau',\n    'hWYb0x3Q3zM0aBkB2G1arbzmWxRQS/i': 'whpbcVuyGrJbgveSSM3XQKa8G5alyRm',\n    'AqM0XavJxJXeVlJ3Te3umGJaPOCYmZi': 'xP2lldc1.10LvZDjJZXNBKLzWqnkbOa',\n    'UPBzTBMwJb5mKWflQ.5Rid4481RrxVy': 'xSD.pz8Zg3vt0Jiovghl5Dqrs8aw8ni',\n    'yM59Cq5iVZDB3u45gTNhRSnOgrY1tdG': 'yED5tIjzyeH90te88BUWvTrMFHsWgCi',\n    'k.qekGiJym3QgfeFCwNhPHg0Zk99KSa': 'yphVralDu2JlxYbCqwwGli/H6wBgBtC',\n    'iYbzuFNFwSfCgqTGNsUFtSDh8PJAqSe': 'zAUUWh4XGsBGYs6yyUJTSfEgzoLXO6G',\n}\ndef h_bcrypt_x(phrase, rounds, salt):\n    base = BCRYPT.using(\n        salt=salt, rounds=rounds, ident=\"2b\"\n    ).hash(phrase)\n    base_setting = base[4:-31]\n    base_output  = base[-31:]\n    output = bcrypt_x_substitutions.get(base_output, base_output)\n\n    setting = \"$2x$\" + base_setting\n    expected = setting + output\n    yield (phrase, setting, expected)\n\n# passlib includes an scrypt implementation, but its encoded password\n# format is not the $7$ format we implement, so instead we use the\n# stdlib's hashlib.scrypt (this is why 3.6+ is required) and encode\n# the setting string by hand.  This may produce strings encoding N/r/p\n# combinations that don't normally occur in the wild, but that's OK.\n# The algorithm implemented by hashlib.scrypt is standardized as\n# RFC 7914, so it's not an issue where that implementation came from.\n# Yes, the salt is properly passed to raw_scrypt as-is.\nfrom hashlib import scrypt as raw_scrypt\nfrom passlib.utils.binary import h64 as hash64\ndef h_scrypt(phrase, rounds, salt):\n    p = 1\n    r = 8\n    log2N = rounds + 7\n    N = 1 << log2N\n\n    bytesalt = salt.encode(\"ascii\")\n    setting = (b\"$7$\" +\n               hash64.encode_int6(log2N) +\n               hash64.encode_int30(r) +\n               hash64.encode_int30(p) +\n               bytesalt)\n\n    binhash = raw_scrypt(phrase, salt=bytesalt, p=p, r=r, n=N, dklen=32)\n\n    yield (phrase, setting, setting + b'$' + hash64.encode_bytes(binhash))\n\n#\n# passlib does not support either yescrypt or gost-yescrypt.  In fact,\n# as far as I can tell, at the time of writing, there exists only one\n# implementation of yescrypt and gost-yescrypt, by Solar Designer et al\n# which is the code we use ourselves.  However, a test for round-\n# trippability and API consistency is still worthwhile, as is a test\n# that the implementation's current behavior is compatible with its\n# behavior some time ago.  Therefore, we encode setting strings by\n# hand, and ctypes is used to access crypt_ra in the just-built\n# libcrypt.so.  This will only work if the library was configured with\n# --enable-hashes=yescrypt,gost-yescrypt,[others] and --enable-shared,\n# which is OK, since it's not run during a normal build.  Remove this\n# once passlib supports these hashes.\n#\n# crypt_ra is used because it's thread-safe but doesn't require us to\n# know how big struct crypt_data is.  There is no good way to arrange\n# for the data object to be deallocated.  Oh well.\nLIBCRYPT = ctypes.cdll.LoadLibrary(os.path.join(os.getcwd(), \".libs\",\n                                                \"libcrypt.so\"))\n_xcrypt_crypt_ra = LIBCRYPT.crypt_ra\n_xcrypt_crypt_ra.argtypes = [ctypes.c_char_p, ctypes.c_char_p,\n                             ctypes.POINTER(ctypes.c_void_p),\n                             ctypes.POINTER(ctypes.c_int)]\n_xcrypt_crypt_ra.restype = ctypes.c_char_p\n_xcrypt_crypt_ra_data = ctypes.c_void_p(0)\n_xcrypt_crypt_ra_datasize = ctypes.c_int(0)\n\ndef xcrypt_crypt(phrase, setting):\n    global _xcrypt_crypt_ra_data, _xcrypt_crypt_ra_datasize\n    if not isinstance(phrase, bytes): phrase = phrase.encode(\"utf-8\")\n    if not isinstance(setting, bytes): setting = setting.encode(\"ascii\")\n    rv = _xcrypt_crypt_ra(phrase, setting,\n                          ctypes.byref(_xcrypt_crypt_ra_data),\n                          ctypes.byref(_xcrypt_crypt_ra_datasize))\n    if not rv:\n        err = ctypes.get_errno()\n        raise OSError(err, os.strerror(err))\n    return bytes(rv)\n\ndef h_sm3crypt(phrase, rounds, salt):\n    setting = \"$sm3$rounds={r}${s}\".format(r=rounds, s=salt)\n    yield (phrase, setting, xcrypt_crypt(phrase, setting))\n\ndef yescrypt_gensalt(ident, rounds, salt):\n    if rounds == 1:\n        params = \"j75\"\n    elif rounds == 2:\n        params = \"j85\"\n    else:\n        raise RuntimeError(\"don't know how to encode rounds={}\"\n                           .format(rounds))\n\n    return \"${}${}${}\".format(ident, params, salt)\n\ndef h_yescrypt(phrase, rounds, salt):\n    setting = yescrypt_gensalt(\"y\", rounds, salt)\n    yield (phrase, setting, xcrypt_crypt(phrase, setting))\n\ndef h_gost_yescrypt(phrase, rounds, salt):\n    setting = yescrypt_gensalt(\"gy\", rounds, salt)\n    yield (phrase, setting, xcrypt_crypt(phrase, setting))\n\ndef h_sm3_yescrypt(phrase, rounds, salt):\n    setting = yescrypt_gensalt(\"sm3y\", rounds, salt)\n    yield (phrase, setting, xcrypt_crypt(phrase, setting))\n\n\n# Each method should contribute a group of parameters to the array\n# below.  Each block has the form\n#\n#  ('method', [\n#     (rounds, salt),\n#     (rounds, salt),\n#     ...\n#  ])\n#\n# where 'method' is the method name used in the INCLUDE_ macros,\n# rounds is a number and salt is a salt string.  The appropriate\n# h_method function will be called with arguments (phrase, *params)\n# where params is one of the tuples from its block, so it is OK to add\n# extra arguments after the salt if necessary.\n#\n# If the method has a tunable rounds parameter, its array of\n# (rounds, salt) pairs should have two salts * at least two values of\n# the rounds parameter.  If it does not, it should have two salts and\n# use 0 for the rounds parameter.\n#\n# The point of this test is not to exercise brute force resistance,\n# so keep cost parameters low.\n#\n# Methods should be in alphabetical order by their INCLUDE_macro name.\n\nSETTINGS = [\n    ('bcrypt', [\n        (5, 'CCCCCCCCCCCCCCCCCCCCC.'),\n        (5, 'abcdefghijklmnopqrstuu'),\n        (4, 'CCCCCCCCCCCCCCCCCCCCC.'),\n        (4, 'abcdefghijklmnopqrstuu'),\n    ]),\n\n    ('bcrypt_y', [\n        (5, 'CCCCCCCCCCCCCCCCCCCCC.'),\n        (5, 'abcdefghijklmnopqrstuu'),\n        (4, 'CCCCCCCCCCCCCCCCCCCCC.'),\n        (4, 'abcdefghijklmnopqrstuu'),\n    ]),\n\n    ('bcrypt_a', [\n        (5, 'CCCCCCCCCCCCCCCCCCCCC.'),\n        (5, 'abcdefghijklmnopqrstuu'),\n        (4, 'CCCCCCCCCCCCCCCCCCCCC.'),\n        (4, 'abcdefghijklmnopqrstuu'),\n    ]),\n\n    ('bcrypt_x', [\n        (5, 'CCCCCCCCCCCCCCCCCCCCC.'),\n        (5, 'abcdefghijklmnopqrstuu'),\n        (4, 'CCCCCCCCCCCCCCCCCCCCC.'),\n        (4, 'abcdefghijklmnopqrstuu'),\n    ]),\n\n    ('bigcrypt', [\n        (0, 'CC'),\n        (0, 'ab'),\n    ]),\n\n    # The bsdicrypt round count is required to be odd.\n    ('bsdicrypt', [\n        (1, 'CCCC'),\n        (1, 'abcd'),\n        (13, 'CCCC'),\n        (13, 'abcd'),\n    ]),\n\n    ('descrypt', [\n        (0, 'CC'),\n        (0, 'ab'),\n    ]),\n\n    ('gost_yescrypt', [\n        (1, '.......'),\n        (1, 'LdJMENpBABJJ3hIHjB1Bi.'),\n        (2, '.......'),\n        (2, 'LdJMENpBABJJ3hIHjB1Bi.'),\n    ]),\n\n    ('md5crypt', [\n        (0, 'CCCCCCCC'),\n        (0, 'abcdefgh'),\n    ]),\n\n    ('nt', [\n        (0, ''),\n    ]),\n\n    ('scrypt', [\n        (1, 'SodiumChloride'),\n        (1, 'unUNunUNunUNun'),\n        (2, 'SodiumChloride'),\n        (2, 'unUNunUNunUNun'),\n    ]),\n\n    ('sha1crypt', [\n        (12, 'GGXpNqoJvglVTkGU'),\n        (12, 'xSZGpk6Bp4SA3.cR'),\n        (456, 'GGXpNqoJvglVTkGU'),\n        (456, 'xSZGpk6Bp4SA3.cR'),\n    ]),\n\n    ('sha256crypt', [\n        (1000, 'saltstring'),\n        (1000, 'short'),\n        (5000, 'saltstring'),\n        (5000, 'short'),\n    ]),\n\n    ('sha512crypt', [\n        (1000, 'saltstring'),\n        (1000, 'short'),\n        (5000, 'saltstring'),\n        (5000, 'short'),\n    ]),\n\n    ('sm3crypt', [\n        (1000, 'saltstring'),\n        (1000, 'short'),\n        (5000, 'saltstring'),\n        (5000, 'short'),\n    ]),\n\n    ('sm3_yescrypt', [\n        (1, '.......'),\n        (1, 'LdJMENpBABJJ3hIHjB1Bi.'),\n        (2, '.......'),\n        (2, 'LdJMENpBABJJ3hIHjB1Bi.'),\n    ]),\n\n    ('sunmd5', [\n        (0, '9ZLwtuTO'),\n        (0, '1xMeE.at'),\n        (12, '9ZLwtuTO'),\n        (12, '1xMeE.at'),\n    ]),\n\n    ('yescrypt', [\n        (1, '.......'),\n        (1, 'LdJMENpBABJJ3hIHjB1Bi.'),\n        (2, '.......'),\n        (2, 'LdJMENpBABJJ3hIHjB1Bi.'),\n    ]),\n]\n\n# Normally, we expect that (1) for fixed salt, no two phrases hash to\n# the same string; (2) for fixed phrase, no two settings produce the\n# same string.  The known exceptions are all due to limitations and/or\n# bugs in the hashing method.  Check the table produced by this\n# program to ensure that all of the collisions in the ->expected\n# strings are due to one of the known exceptions.  test-crypt-kat.c\n# itself doesn't need to do this test; as long as all of the hashes\n# produced by the just-built crypt() match the appropriate ->expected\n# string, no new collisions can have been introduced.\n\ndef strneq_7bit (p1, p2, limit):\n    n1 = len(p1)\n    n2 = len(p2)\n    for i in range(limit):\n        if i == n1 and i == n2:\n            # strings are the same length, within the limit, and no\n            # mismatched characters were found\n            return True\n        if i == n1 or i == n2:\n            # one string is longer than the other, within the limit\n            return False\n        if (p1[i] & 0x7F) != (p2[i] & 0x7F):\n            # characters not equal, after masking the 8th bit\n            return False\n    # reached the limit, no mismatches found\n    return True\n\n# The bug in bcrypt mode \"x\" (preserved from the original\n# implementation of bcrypt) is, at its root, that the code below\n# sign- rather than zero-extends *p before or-ing it into 'tmp'.\n# When *p has its 8th bit set, it is therefore or-ed in as\n# 0xFF_FF_FF_xx rather than 0x00_00_00_xx, and clobbers the other\n# three bytes in 'tmp'.  Depending on its position within the input,\n# this can erase up to three other characters of the passphrase.\n# The exact set of strings involved in any one group of collisions is\n# difficult to describe in words and may depend on the endianness of\n# the CPU.  The test cases in this file have only been verified on\n# a little-endian CPU.\nBF_KEY_LEN  = 18\n\ndef buggy_expand_BF_key(phrase):\n    p = 0\n    lp = len(phrase)\n    expanded = [0]*BF_KEY_LEN\n    if lp > 0:\n        for i in range(BF_KEY_LEN):\n            tmp = 0\n            for j in range(4):\n                if p == lp:\n                    c = 0\n                else:\n                    c = phrase[p]\n                stmp = ((c & 0x7F) - (c & 0x80)) & 0xFFFFFFFF\n                tmp = ((tmp << 8) | stmp) & 0xFFFFFFFF\n                p += 1\n                if p == lp + 1:\n                    p = 0\n            expanded[i] = tmp\n    return expanded\n\ndef sign_extension_collision_p(p1, p2):\n    return buggy_expand_BF_key(p1) == buggy_expand_BF_key(p2)\n\ndef equivalent_sunmd5_settings_p(s1, s2):\n    if s1[:4] != \"$md5\": return False\n    if s2[:4] != \"$md5\": return False\n\n    l1 = len(s1)\n    l2 = len(s2)\n    if l1 < l2:\n        ll = l1\n        lh = l2\n        sl = s1\n        sh = s2\n    else:\n        ll = l2\n        lh = l1\n        sl = s2\n        sh = s1\n    if sl[:ll] != sh[:ll]:\n        return False\n\n    # The two cases where sunmd5 settings are equivalent:\n    # $md5...$ and $md5...$$\n    # $md5...  and $md5...$x\n    if sl[ll-1] == '$':\n        if ll+1 != lh or sh[ll] != '$':\n            return False\n    else:\n        if ll+2 != lh or sh[ll] != '$' or sh[ll+1] != 'x':\n            return False\n    return True\n\ndef collision_expected(p1, p2, s1, s2):\n    if not isinstance(p1, bytes): p1 = p1.encode(\"iso_8859_1\")\n    if not isinstance(p2, bytes): p2 = p2.encode(\"iso_8859_1\")\n    if isinstance(s1, bytes):     s1 = s1.decode(\"ascii\")\n    if isinstance(s2, bytes):     s2 = s2.decode(\"ascii\")\n    # Under no circumstances should two hashes with different settings\n    # collide, except...\n    if s1 != s2:\n        # a descrypt hash can collide with a bigcrypt hash when the phrase\n        # input to bigcrypt was fewer than 8 characters long\n        if (    s1[0] != '$' and s1[0] != '_'\n            and s2[0] != '$' and s2[0] != '_'\n            and (   (len(s1) == 2 and len(s2) > 2 and len(p2) <= 8)\n                 or (len(s2) == 2 and len(s1) > 2 and len(p1) <= 8))):\n            return strneq_7bit(p1, p2, 8)\n\n        # all settings for NTHASH are equivalent\n        if s1[:3] == '$3$' and s2[:3] == '$3$':\n            return p1 == p2\n\n        # sunmd5 has pairs of equivalent settings\n        if equivalent_sunmd5_settings_p (s1, s2):\n            return p1 == p2\n\n        return False\n\n    if s1[:2] == '$2':\n        # bcrypt truncates passphrases to 72 characters\n        if p1[:72] == p2[:72]:\n            return True\n        # preserved bcrypt $2x bug?\n        if s1[:3] == '$2x' and sign_extension_collision_p(p1, p2):\n            return True\n        return False\n\n    if s1[0] != '$' and s1[0] != '_':\n        if len(s1) == 2:\n            # descrypt truncates passphrases to 8 characters and strips the\n            # 8th bit\n            return strneq_7bit(p1, p2, 8)\n        else:\n            # bigcrypt truncates passphrases to 128 characters and strips the\n            # 8th bit\n            return strneq_7bit(p1, p2, 128)\n\n    if s1[0] == '_':\n        # bsdicrypt does not truncate but does still strip the 8th bit\n        return strneq_7bit(p1, p2, max(len(p1), len(p2)))\n\n    return False\n\ndef report_unexpected_collision(p1, p2, s1, s2, expected):\n    sys.stderr.write(\"UNEXPECTED HASH COLLISION:\\n\"\n                     \"  hash = {}\\n\"\n                     \"    p1 = {!r}\\n\"\n                     \"    p2 = {!r}\\n\"\n                     \"    s1 = {!r}\\n\"\n                     \"    s2 = {!r}\\n\"\n                     \"\\n\".format(expected, p1, p2, s1, s2))\n\n# Master control.\n#\n# To reduce the painful slowness of this program _somewhat_,\n# we use a multiprocessing pool to compute all of the hashes.\n\ndef generate_phrase_setting_combs():\n    for macro_name, settings in SETTINGS:\n        for phrase in PHRASES:\n            for setting in settings:\n                yield (macro_name, phrase, setting)\n\ndef worker_compute_one(args):\n    method, phrase, setting = args\n\n    import __main__\n    sfunc = getattr(__main__, 'h_' + method)\n    return [(method, case) for case in sfunc(phrase, *setting)]\n\n# Python specifies that an \\x escape in a string literal consumes\n# exactly two subsequent hexadecimal digits.  C, on the other hand,\n# specifies that \\x in a string literal consumes *any number of*\n# hexadecimal digits, and if the hexadecimal number is larger than the\n# range representable by 'unsigned char' the result is\n# implementation-defined.  For instance, \"\\x303\" == \"03\" in Python,\n# but in C the string on the left could be anything.  The simplest way\n# to deal with this is to escape the string Python's way and then\n# replace sequences like '\\x303' with '\\x30\"\"3'.\nc_hex_escape_fixup_re_ = re.compile(\n    r\"(\\\\x[0-9a-fA-F]{2})([0-9a-fA-F])\")\n\ndef c_hex_escape(s):\n    if isinstance(s, bytes):\n        s = s.decode(\"iso_8859_1\")\n    s = s.encode(\"unicode_escape\").decode(\"ascii\")\n\n    return c_hex_escape_fixup_re_.sub(r'\\1\"\"\\2', s)\n\ndef format_case(phrase, setting, expected):\n    return ('  {{ \"{}\", \"{}\", \"{}\" }},\\n'\n            .format(c_hex_escape(setting),\n                    c_hex_escape(expected),\n                    c_hex_escape(phrase)))\n\ndef main():\n    # FIXME: This only detects collisions that actually happen, not\n    # collisions that ought to have happened but didn't.  (Detecting\n    # collisions that ought to have happened, but didn't, would be\n    # unavoidably quadratic in the total number of test cases, so I'm\n    # not sure it's worth it.)\n    items = []\n    collisions = {}\n    collision_error = False\n    with multiprocessing.Pool() as pool:\n        for group in pool.imap(worker_compute_one,\n                               generate_phrase_setting_combs(),\n                               chunksize=100):\n            for method, (phrase, setting, expected) in group:\n                if expected in collisions:\n                    p1, s1 = collisions[expected]\n                    if not collision_expected(p1, phrase, s1, setting):\n                        report_unexpected_collision(p1, phrase, s1, setting,\n                                                    expected)\n                        collision_error = True\n                else:\n                    collisions[expected] = (phrase, setting)\n                items.append((method, format_case(phrase, setting, expected)))\n\n    if collision_error:\n        sys.exit(1)\n\n    sys.stdout.write(\n        \"/* Known-answer tests for passphrase hashes.  -*- mode: c -*-\\n\"\n        \"   Automatically generated by ka-table-gen.py.\\n\"\n        \"   Do not edit this file by hand.  */\\n\\n\")\n\n    prev_method = None\n    for method, case in items:\n        if method != prev_method:\n            if prev_method is not None:\n                sys.stdout.write(\"#endif // {}\\n\\n\".format(prev_method))\n            sys.stdout.write(\"#if INCLUDE_{} && defined TEST_{}\\n\"\n                             .format(method, method))\n            prev_method = method\n        sys.stdout.write(case)\n\n    if prev_method is not None:\n        sys.stdout.write(\"#endif // {}\\n\".format(prev_method))\n\nif __name__ == '__main__':\n    main()\n"
  },
  {
    "path": "test/ka-table.inc",
    "content": "/* Known-answer tests for passphrase hashes.  -*- mode: c -*-\n   Automatically generated by ka-table-gen.py.\n   Do not edit this file by hand.  */\n\n#if INCLUDE_bcrypt && defined TEST_bcrypt\n  { \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.7uG0VCzI2bS7j6ymqJi9CdcdxiRTWNy\", \"\" },\n  { \"$2b$05$abcdefghijklmnopqrstuu\", \"$2b$05$abcdefghijklmnopqrstuu0oImNDIy4flhldV9YqunRgBAePKmw7m\", \"\" },\n  { \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.Cg0ly9t/KVBCBYYDfOmZKwry9JuXClC\", \"\" },\n  { \"$2b$04$abcdefghijklmnopqrstuu\", \"$2b$04$abcdefghijklmnopqrstuubyCG3zY1GIXMyxfivm.ClDiInHzxjiq\", \"\" },\n  { \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.REUe.wVCLEE7cNcWpheIXR9MaRPCoVC\", \" \" },\n  { \"$2b$05$abcdefghijklmnopqrstuu\", \"$2b$05$abcdefghijklmnopqrstuueHjTs35M4oLkB0oz2vpFCrkqmB3wDyK\", \" \" },\n  { \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.QK3io8Pm4WhsBSZhzvm1OPPQ1MU.WxC\", \" \" },\n  { \"$2b$04$abcdefghijklmnopqrstuu\", \"$2b$04$abcdefghijklmnopqrstuu/ied6LYDv4Nek.n8vXq7pbx7mJcRizO\", \" \" },\n  { \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.crbyEJ0XFaJ9sONRyOTHdI7c4ZT.ndu\", \"a\" },\n  { \"$2b$05$abcdefghijklmnopqrstuu\", \"$2b$05$abcdefghijklmnopqrstuu8.veTXNDPV2eEsdpKNczMw2otgh5LnK\", \"a\" },\n  { \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.f/Fm9DOYGp2ai9rjxvG4QHlhtDCuDuu\", \"a\" },\n  { \"$2b$04$abcdefghijklmnopqrstuu\", \"$2b$04$abcdefghijklmnopqrstuuMFdJu9yVgmagVAIC24fOZkaFqd3s9JC\", \"a\" },\n  { \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.w5.fxtwCNbJ3swM5YKT2SoO0YcCOkhS\", \"ab\" },\n  { \"$2b$05$abcdefghijklmnopqrstuu\", \"$2b$05$abcdefghijklmnopqrstuu0EJam7uq2UHswNA05epRm6fJdiFmbUi\", \"ab\" },\n  { \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.ThcCpjPKXmu6XgQqJJEGokAiEUquQVe\", \"ab\" },\n  { \"$2b$04$abcdefghijklmnopqrstuu\", \"$2b$04$abcdefghijklmnopqrstuu0CkeIeZLJOlOL1QPPhfXulLNPdFqJBW\", \"ab\" },\n  { \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.gNn9EDJdrUJF53AHnb.4T9BCvqhUYdW\", \"abc\" },\n  { \"$2b$05$abcdefghijklmnopqrstuu\", \"$2b$05$abcdefghijklmnopqrstuuRWUgMyyCUnsDr8evYotXg5ZXVF/HhzS\", \"abc\" },\n  { \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.AKurti2nSiRoaXd0tyyeWA.1jj9Kto2\", \"abc\" },\n  { \"$2b$04$abcdefghijklmnopqrstuu\", \"$2b$04$abcdefghijklmnopqrstuuCi15uRb1eH7NAlJ/TgeJertyknQpYn2\", \"abc\" },\n  { \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.E5YPO9kmyuRGyh0XouQYb4YMJKvyOeW\", \"U*U\" },\n  { \"$2b$05$abcdefghijklmnopqrstuu\", \"$2b$05$abcdefghijklmnopqrstuuMpLhh66NJUQMuZ6FwRQX0sqAEKeWcKW\", \"U*U\" },\n  { \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.K7Qr0se1MxuggH4aP4YgB.U2Em1pGSK\", \"U*U\" },\n  { \"$2b$04$abcdefghijklmnopqrstuu\", \"$2b$04$abcdefghijklmnopqrstuuCFaEytnzrfaPZJKbS76hh9vqd9r8v2S\", \"U*U\" },\n  { \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.VGOzA784oUp/Z0DY336zx7pLYAy0lwK\", \"U*U*\" },\n  { \"$2b$05$abcdefghijklmnopqrstuu\", \"$2b$05$abcdefghijklmnopqrstuueqZzwRqX8BEsrV2jF8gx70v6bcd1qAG\", \"U*U*\" },\n  { \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.5dvsdVl2y/501tm9dvdbbSRbpuvxsaC\", \"U*U*\" },\n  { \"$2b$04$abcdefghijklmnopqrstuu\", \"$2b$04$abcdefghijklmnopqrstuuBtzXFXMcxIslxJptQaoJYuU.xP21coS\", \"U*U*\" },\n  { \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.Bw3BobdGs1SFsKsRLIx9rC4T.Q7DtEm\", \"U*U*U\" },\n  { \"$2b$05$abcdefghijklmnopqrstuu\", \"$2b$05$abcdefghijklmnopqrstuupkvHj1c6E382bN8hwXRlu1xE4bc1pgG\", \"U*U*U\" },\n  { \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.r2Gz4aKpQDpr6TmvEJksSv12hIDVgXe\", \"U*U*U\" },\n  { \"$2b$04$abcdefghijklmnopqrstuu\", \"$2b$04$abcdefghijklmnopqrstuuMJG4SPxGpsI2PpmiVYJg7D.hA7CdQyO\", \"U*U*U\" },\n  { \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.6YtT5mHh5I666KkHRqqIuteDuaNX1GS\", \".....\" },\n  { \"$2b$05$abcdefghijklmnopqrstuu\", \"$2b$05$abcdefghijklmnopqrstuun3YeQp9ZOh1qWiEKJNRybZT69WMr2sW\", \".....\" },\n  { \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.6v/P2K1bqBzj9FILn7LJntMzJQxUuA6\", \".....\" },\n  { \"$2b$04$abcdefghijklmnopqrstuu\", \"$2b$04$abcdefghijklmnopqrstuu7bnTzNnC9mpomsuya2sDYCcZGtW3FKu\", \".....\" },\n  { \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.LZrfN0lz4CULfFuRjqXiVMP49yNOHKi\", \"dragon\" },\n  { \"$2b$05$abcdefghijklmnopqrstuu\", \"$2b$05$abcdefghijklmnopqrstuuG4nizIsfFMB34Hh5MoYcbtdFUq5YPJK\", \"dragon\" },\n  { \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.tidtIFf5ZCN.gk6Mobs.YyDMzNhFfFm\", \"dragon\" },\n  { \"$2b$04$abcdefghijklmnopqrstuu\", \"$2b$04$abcdefghijklmnopqrstuujzhP54E3nDKxLTbGbyrFiW3EkV.7ERC\", \"dragon\" },\n  { \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.i7hPnfU5WycMwd1C9qJZDFBCw8NcAFu\", \"dRaGoN\" },\n  { \"$2b$05$abcdefghijklmnopqrstuu\", \"$2b$05$abcdefghijklmnopqrstuuMA7xTS.7H8Lal4RW.s8KBMURGOrPxQa\", \"dRaGoN\" },\n  { \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.5TqUWVAHsz4mvbAcNwu3JSwt7Pd.dm2\", \"dRaGoN\" },\n  { \"$2b$04$abcdefghijklmnopqrstuu\", \"$2b$04$abcdefghijklmnopqrstuuqS/OX35wGo1BfqluN8dsq//CyXY2pNS\", \"dRaGoN\" },\n  { \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.ZGVtQn6eTc3aPe.tQ.zJuH3XlzyI9Di\", \"DrAgOn\" },\n  { \"$2b$05$abcdefghijklmnopqrstuu\", \"$2b$05$abcdefghijklmnopqrstuuO5PYTf2OGllbJ1tyzjIAdpnQ9rUDGNC\", \"DrAgOn\" },\n  { \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.SzmeTH6T6GIGbKj9Om75UAlglaj4twK\", \"DrAgOn\" },\n  { \"$2b$04$abcdefghijklmnopqrstuu\", \"$2b$04$abcdefghijklmnopqrstuuE9zYHFcawnjSDJKsSux5hf1fyy3utXW\", \"DrAgOn\" },\n  { \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.u/WsPSagrbjc3QmFLSt6j9e/LJ8FoNm\", \"PAROLX\" },\n  { \"$2b$05$abcdefghijklmnopqrstuu\", \"$2b$05$abcdefghijklmnopqrstuuzyv2QWIljnSNjMYpSebmlCqn.QEGEB6\", \"PAROLX\" },\n  { \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.pQY3jmCmc/1Pk8B2m6DNUj9ANrzICLK\", \"PAROLX\" },\n  { \"$2b$04$abcdefghijklmnopqrstuu\", \"$2b$04$abcdefghijklmnopqrstuumicc49hlc3UdUYSMeE8ZXKFJcV/Q2Nm\", \"PAROLX\" },\n  { \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.7Knr9/jUQJ0lh8N4AU/fMnQskXCdfSu\", \"U*U***U\" },\n  { \"$2b$05$abcdefghijklmnopqrstuu\", \"$2b$05$abcdefghijklmnopqrstuu0whe22G2FGJcNLWQaY2ZVuZIf5IJBHK\", \"U*U***U\" },\n  { \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.H3n2rsAGLquD5DBiTNaKBEYcc0HJy5K\", \"U*U***U\" },\n  { \"$2b$04$abcdefghijklmnopqrstuu\", \"$2b$04$abcdefghijklmnopqrstuuDu3PK53XxhceAEiIIFWWlG16bn5LvcG\", \"U*U***U\" },\n  { \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.HjTkKOvb2xTYRqeMFaN1PRcxuDYro5y\", \"abcdefg\" },\n  { \"$2b$05$abcdefghijklmnopqrstuu\", \"$2b$05$abcdefghijklmnopqrstuu3NLAiMrV.ggY98aZ7cNIwxII7afa91.\", \"abcdefg\" },\n  { \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.GQNqYPSPnkqs4XPHOKxta8z3oVxx.Oe\", \"abcdefg\" },\n  { \"$2b$04$abcdefghijklmnopqrstuu\", \"$2b$04$abcdefghijklmnopqrstuuGTNT0Ri8Ic/nBhrRQu0ORxwctqE11mO\", \"abcdefg\" },\n  { \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.RFkLTR7KyUmGXnFvMFlLbB23MCIzsgi\", \"01234567\" },\n  { \"$2b$05$abcdefghijklmnopqrstuu\", \"$2b$05$abcdefghijklmnopqrstuuQOF57SPhYRiKufm4.epZm3ELZ4UlAVy\", \"01234567\" },\n  { \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.3uce2XN8xqrZ2aIduEu48JNEUk6ih9y\", \"01234567\" },\n  { \"$2b$04$abcdefghijklmnopqrstuu\", \"$2b$04$abcdefghijklmnopqrstuucnCKiuhmJV3sCjWqQH.rYNPhmru2Bfq\", \"01234567\" },\n  { \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.hz7CVP6wIj8Z57Ze7yuhrhzKfvq0Ty.\", \"726 even\" },\n  { \"$2b$05$abcdefghijklmnopqrstuu\", \"$2b$05$abcdefghijklmnopqrstuuIaVbx2I8MHKuu1rBc/gqV8Fo2An7wQm\", \"726 even\" },\n  { \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.ib/v2w9PynSZewkHDlSuFwGC.jkyh4a\", \"726 even\" },\n  { \"$2b$04$abcdefghijklmnopqrstuu\", \"$2b$04$abcdefghijklmnopqrstuus/VSIfP19Ty4eQaE51vB9GbPNmLhq2S\", \"726 even\" },\n  { \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.jUMW9ITlTfAw5cFja1iYihO7V9qsmWK\", \"zyxwvuts\" },\n  { \"$2b$05$abcdefghijklmnopqrstuu\", \"$2b$05$abcdefghijklmnopqrstuucN2On7GNyUtMxT..Bo0a0ICaTeQOJ4u\", \"zyxwvuts\" },\n  { \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.xf6Tlh/zfR9Qob4S/6wj9RneRcBt4yG\", \"zyxwvuts\" },\n  { \"$2b$04$abcdefghijklmnopqrstuu\", \"$2b$04$abcdefghijklmnopqrstuucqOWKor12VNz5REoX.a3GqgU2btIQWS\", \"zyxwvuts\" },\n  { \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.hdihJRIixUmRFFg0NQNaid9UF3Uw/Q.\", \"ab1234567\" },\n  { \"$2b$05$abcdefghijklmnopqrstuu\", \"$2b$05$abcdefghijklmnopqrstuulK6ChIvFKqdreUvOY9oKm2O2Fn.1Zuq\", \"ab1234567\" },\n  { \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.xq4CFi9Keo/OhWm9tosH45r9gI3Gd4C\", \"ab1234567\" },\n  { \"$2b$04$abcdefghijklmnopqrstuu\", \"$2b$04$abcdefghijklmnopqrstuuuBq8XeHGZZJdrs6jsgiLupxqOP4GLc6\", \"ab1234567\" },\n  { \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.0c9Eoia74tfCGVyINCZAcZaVzJdMsoi\", \"alexander\" },\n  { \"$2b$05$abcdefghijklmnopqrstuu\", \"$2b$05$abcdefghijklmnopqrstuu3qH73fcOvo6pdGd/u/Of.mkavvVviAG\", \"alexander\" },\n  { \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.bK5f5L/foC9KH3IYxj9uWGZPE/w22J2\", \"alexander\" },\n  { \"$2b$04$abcdefghijklmnopqrstuu\", \"$2b$04$abcdefghijklmnopqrstuu1zazepZSS74T7o4eCXaJqsa4KC41vt6\", \"alexander\" },\n  { \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.Tc9f8dMIa03zsepKEv1oSFsFWT84Me.\", \"beautiful\" },\n  { \"$2b$05$abcdefghijklmnopqrstuu\", \"$2b$05$abcdefghijklmnopqrstuusxVo.QMslOcijv585zolzUwesRGYfui\", \"beautiful\" },\n  { \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.7XxYg42754jz07Elen5lFQuommU7crW\", \"beautiful\" },\n  { \"$2b$04$abcdefghijklmnopqrstuu\", \"$2b$04$abcdefghijklmnopqrstuuHz11b40qtSU5.OKZJGONgmO6tsOw8ny\", \"beautiful\" },\n  { \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.SxOcYMxtg44jVOAYY0zBeTBbfCYXSBu\", \"challenge\" },\n  { \"$2b$05$abcdefghijklmnopqrstuu\", \"$2b$05$abcdefghijklmnopqrstuuD2bZx1XnT2xoC7mKx.Jr7E20hJXg5y.\", \"challenge\" },\n  { \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.mK3Hkg2ZFCrNFQRor1M7Bd.pyBSFz56\", \"challenge\" },\n  { \"$2b$04$abcdefghijklmnopqrstuu\", \"$2b$04$abcdefghijklmnopqrstuu92OCZ/GwgJ2w0KrMJRu6fK7i2iKqYha\", \"challenge\" },\n  { \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.455yryJspofWOsWxxZ/Tsu5qtg8j2wm\", \"chocolate\" },\n  { \"$2b$05$abcdefghijklmnopqrstuu\", \"$2b$05$abcdefghijklmnopqrstuulZGdWs.WkvfSGHTz.1.5CPi2ETJLi3.\", \"chocolate\" },\n  { \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.N0Iumk1Mt6l7kbmk8iYgSA9FqaEfv5y\", \"chocolate\" },\n  { \"$2b$04$abcdefghijklmnopqrstuu\", \"$2b$04$abcdefghijklmnopqrstuuLbL252qaabO.sIFmAzyShKINVGRsGeu\", \"chocolate\" },\n  { \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.ZA//OMzj1MY4PfGODYfbeGs8HPUS2zq\", \"cr1234567\" },\n  { \"$2b$05$abcdefghijklmnopqrstuu\", \"$2b$05$abcdefghijklmnopqrstuuUccVOwN/r/34c2SICyLEwyfRWS4Vgja\", \"cr1234567\" },\n  { \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.8tZkJ2HTsa4Pn6bgGzpDRWJ8c1biGYu\", \"cr1234567\" },\n  { \"$2b$04$abcdefghijklmnopqrstuu\", \"$2b$04$abcdefghijklmnopqrstuuA.Ry5GZ8Ob/wI0r8UydZ6XfbyfLJ5JK\", \"cr1234567\" },\n  { \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.XyLDmzSo8jvTANPtIoCB164F84v8EkS\", \"katherine\" },\n  { \"$2b$05$abcdefghijklmnopqrstuu\", \"$2b$05$abcdefghijklmnopqrstuuOYRnTkqPmRfoAB/blXEA7y5xOBtiEg6\", \"katherine\" },\n  { \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.bsdSaZOaobkZJkNO2MxskcWIZCJ8btK\", \"katherine\" },\n  { \"$2b$04$abcdefghijklmnopqrstuu\", \"$2b$04$abcdefghijklmnopqrstuu5i6Sk8a0h8mpYFdjQZdYrEsLaxZ1EaG\", \"katherine\" },\n  { \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$05$CCCCCCCCCCCCCCCCCCCCC./cK5Kv8QvFDy9GyVbaJS/eEKlmhA6wW\", \"stephanie\" },\n  { \"$2b$05$abcdefghijklmnopqrstuu\", \"$2b$05$abcdefghijklmnopqrstuucK0uB5JOSYLNCq75/1vd9213cIwiEQi\", \"stephanie\" },\n  { \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.Yr8Btf/4dkO36VgY1VYAp6Q9B4.B/rm\", \"stephanie\" },\n  { \"$2b$04$abcdefghijklmnopqrstuu\", \"$2b$04$abcdefghijklmnopqrstuug3T9Nmp5d1Zd35nXtrYPiCSv8A6PVAu\", \"stephanie\" },\n  { \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.VYs2hleVmLTA.FbmrBwOI38C4Pd/8BS\", \"sunflower\" },\n  { \"$2b$05$abcdefghijklmnopqrstuu\", \"$2b$05$abcdefghijklmnopqrstuuY/44p2UkK4uV0kvS9KurVonsOh/oc5m\", \"sunflower\" },\n  { \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.VuKIcBGfiLx.AYuX6c48oQtlhMCQPRq\", \"sunflower\" },\n  { \"$2b$04$abcdefghijklmnopqrstuu\", \"$2b$04$abcdefghijklmnopqrstuul18yFhC69sq/WwO8ibiE1VQy773yVfu\", \"sunflower\" },\n  { \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.465.cDVHqgo4g9qBZIbQbOcdcGqRs2O\", \"basketball\" },\n  { \"$2b$05$abcdefghijklmnopqrstuu\", \"$2b$05$abcdefghijklmnopqrstuuFT2m2RbIlbhkAJBfZ3FCN3Sn3V.N4Bm\", \"basketball\" },\n  { \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.R293rqybpDGrtZIhZxApKqVLXiOJUTG\", \"basketball\" },\n  { \"$2b$04$abcdefghijklmnopqrstuu\", \"$2b$04$abcdefghijklmnopqrstuudp7.T6JYoR2jjqAKGX8kDLzPDm6RR3S\", \"basketball\" },\n  { \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.XUKWvx5JT0wYalbOFE4HU.j3lDUpDcm\", \"porsche911\" },\n  { \"$2b$05$abcdefghijklmnopqrstuu\", \"$2b$05$abcdefghijklmnopqrstuupKJ./ES4uwzJk/SsN3YaTFdl9AIiAdu\", \"porsche911\" },\n  { \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.jgOl9b/oD1cEHohzVyGK6zqcGccVRBG\", \"porsche911\" },\n  { \"$2b$04$abcdefghijklmnopqrstuu\", \"$2b$04$abcdefghijklmnopqrstuuVXo2ooNppOi53FnAHCUuZp8EyiwUoCi\", \"porsche911\" },\n  { \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.sXCEcM/a6jUtNpF7EFCOWiQRogVPxNW\", \"|_337T`/p3\" },\n  { \"$2b$05$abcdefghijklmnopqrstuu\", \"$2b$05$abcdefghijklmnopqrstuugZjL4p/g0M.xDKdvzvO1BKtO0aYdnwC\", \"|_337T`/p3\" },\n  { \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.UyHWsohI3G2oJ05vftc06k9UIwXNW4a\", \"|_337T`/p3\" },\n  { \"$2b$04$abcdefghijklmnopqrstuu\", \"$2b$04$abcdefghijklmnopqrstuuh7AZQzpU7Q7C5l4VczvD6UVfhLQVCDK\", \"|_337T`/p3\" },\n  { \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.ScdVt/vv5qxU5Weko6ZqQcaHw2EjuRG\", \"thunderbird\" },\n  { \"$2b$05$abcdefghijklmnopqrstuu\", \"$2b$05$abcdefghijklmnopqrstuuhX1c3kKr2qeB4tFvvRmDk/ta3LTQtma\", \"thunderbird\" },\n  { \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.XXuNspXmlmLMqkZ37Xt0om56PIqSupq\", \"thunderbird\" },\n  { \"$2b$04$abcdefghijklmnopqrstuu\", \"$2b$04$abcdefghijklmnopqrstuuSJB.YmarGme5IjgFBN49eRn74KS.zVC\", \"thunderbird\" },\n  { \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.z6PrHbuSsMSSwIGFy1JGevQZf6CqJ1y\", \"Hello world!\" },\n  { \"$2b$05$abcdefghijklmnopqrstuu\", \"$2b$05$abcdefghijklmnopqrstuu7nFISH/8YdwlXD3lw69A4iBUf6fvWAW\", \"Hello world!\" },\n  { \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.M.JZM2tZUe85sR83hfk5p2NZ0IVXwXe\", \"Hello world!\" },\n  { \"$2b$04$abcdefghijklmnopqrstuu\", \"$2b$04$abcdefghijklmnopqrstuuyeG8laUfZvsCmc.AE6qIDYSPGM2efmK\", \"Hello world!\" },\n  { \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.cTKgEgC.g8ePpbyZbNC34HvEm4dr75a\", \"pleaseletmein\" },\n  { \"$2b$05$abcdefghijklmnopqrstuu\", \"$2b$05$abcdefghijklmnopqrstuu2EjsH9/6E2HK9wvYowfGqPX5wGi4UDS\", \"pleaseletmein\" },\n  { \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.3WPQy/x8EhyouO1Eia.f.CS216k/lTq\", \"pleaseletmein\" },\n  { \"$2b$04$abcdefghijklmnopqrstuu\", \"$2b$04$abcdefghijklmnopqrstuumH1BFkDxi3LKCbP6FQ2juPgiLLcuV6S\", \"pleaseletmein\" },\n  { \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.UTQ/YCMF16uRDggIHAnzfTGA1GG/5.K\", \"a short string\" },\n  { \"$2b$05$abcdefghijklmnopqrstuu\", \"$2b$05$abcdefghijklmnopqrstuuZM773JiyU8IodKIqJ54EAWHzd/nJoF6\", \"a short string\" },\n  { \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.nks3nTLHIdR6yOhEvQZRsOoYVEqWOtW\", \"a short string\" },\n  { \"$2b$04$abcdefghijklmnopqrstuu\", \"$2b$04$abcdefghijklmnopqrstuu.oBhtv6clsTihZTgUKW34dikJs1Zg1y\", \"a short string\" },\n  { \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.gBXVnji0fmYJspngWLhq07sJA.unyGS\", \"zxyDPWgydbQjgq\" },\n  { \"$2b$05$abcdefghijklmnopqrstuu\", \"$2b$05$abcdefghijklmnopqrstuuGbGKxJ6BsCRT7AGpwiKNOKUzJzb5AA.\", \"zxyDPWgydbQjgq\" },\n  { \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.6vf3XUm.amMyfSlIH2P/SIU5V6p644a\", \"zxyDPWgydbQjgq\" },\n  { \"$2b$04$abcdefghijklmnopqrstuu\", \"$2b$04$abcdefghijklmnopqrstuukgPMil1AyxXOwqj9OWvu3muVwEMg1Aq\", \"zxyDPWgydbQjgq\" },\n  { \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.8TeQYvjyS9VKUlqSLz.kDaRa5v396hC\", \"photojournalism\" },\n  { \"$2b$05$abcdefghijklmnopqrstuu\", \"$2b$05$abcdefghijklmnopqrstuuhJe3S.rJQghSggwRY8.DQE1zCW18PcG\", \"photojournalism\" },\n  { \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.1h1LaJMlvaH2Defb280WzG6X/kqHQQy\", \"photojournalism\" },\n  { \"$2b$04$abcdefghijklmnopqrstuu\", \"$2b$04$abcdefghijklmnopqrstuugpKNM0gEaEfwZ43UsjoT1tNLK25mqV6\", \"photojournalism\" },\n  { \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$05$CCCCCCCCCCCCCCCCCCCCC./fog6ND8iIMkWXIpr.Y6LCOndkFsu/m\", \"ecclesiastically\" },\n  { \"$2b$05$abcdefghijklmnopqrstuu\", \"$2b$05$abcdefghijklmnopqrstuuDUj/hoyzOfsxHnlzXPdMGJybsJgbODG\", \"ecclesiastically\" },\n  { \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.AYMycNr126P8pzb9X2aVQjINCiZadp2\", \"ecclesiastically\" },\n  { \"$2b$04$abcdefghijklmnopqrstuu\", \"$2b$04$abcdefghijklmnopqrstuuOt9ERn2.X0reuqDc7blRS.5f8ttIq3a\", \"ecclesiastically\" },\n  { \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.dsZw45vJh0v/SWcvr.H79lmJF/uZKAy\", \"congregationalism\" },\n  { \"$2b$05$abcdefghijklmnopqrstuu\", \"$2b$05$abcdefghijklmnopqrstuuZu0OqjIDqSsvpAvbAqbC.8HRlYYcVkW\", \"congregationalism\" },\n  { \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.1CYpRB/IxktadiLrbTzgJ.Jd/Q06oBe\", \"congregationalism\" },\n  { \"$2b$04$abcdefghijklmnopqrstuu\", \"$2b$04$abcdefghijklmnopqrstuulau/kOpHdl7CjZgjQuvsiDAB2f/8Aqa\", \"congregationalism\" },\n  { \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.aHkGX/fiki8Qrwu3gWTRnejC9Hba52e\", \"dihydrosphingosine\" },\n  { \"$2b$05$abcdefghijklmnopqrstuu\", \"$2b$05$abcdefghijklmnopqrstuuEJAH.2Z6lOSn5WvfN87I7V1JhCPsW5y\", \"dihydrosphingosine\" },\n  { \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.8obhdpTZ2CAxc8Qbd8dIApwIFM6pzZe\", \"dihydrosphingosine\" },\n  { \"$2b$04$abcdefghijklmnopqrstuu\", \"$2b$04$abcdefghijklmnopqrstuu3tvUtVPx0FPXPsdjb7uta674As4iQfq\", \"dihydrosphingosine\" },\n  { \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.sYSxc3RiA3.WrH2ic000nunk3yqkXHa\", \"semianthropological\" },\n  { \"$2b$05$abcdefghijklmnopqrstuu\", \"$2b$05$abcdefghijklmnopqrstuuLa.VWC3vq9KMn0BrxUY.r4HUotKepnO\", \"semianthropological\" },\n  { \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.tLQTlKtJqj8kJFe92LPFDJdoiTxQ9PO\", \"semianthropological\" },\n  { \"$2b$04$abcdefghijklmnopqrstuu\", \"$2b$04$abcdefghijklmnopqrstuu6yC/otJXGOxvYDo3uRwUKNucauhdOPO\", \"semianthropological\" },\n  { \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.Kvy1q1BWf93W1T7eSLpj/6OuRO.4FqC\", \"palaeogeographically\" },\n  { \"$2b$05$abcdefghijklmnopqrstuu\", \"$2b$05$abcdefghijklmnopqrstuuYNeqeSEZQQFODdHVEfj5MJFvrZPOeF6\", \"palaeogeographically\" },\n  { \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.ybSWdRvitEQlA9I.Oq9wpqMqvBcJiti\", \"palaeogeographically\" },\n  { \"$2b$04$abcdefghijklmnopqrstuu\", \"$2b$04$abcdefghijklmnopqrstuu1POIcCAIthmV0dvj5BClL3hMpuuUctO\", \"palaeogeographically\" },\n  { \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.g7bhq.l6.ix6BSpqhW6wIRoq310s.qO\", \"electromyographically\" },\n  { \"$2b$05$abcdefghijklmnopqrstuu\", \"$2b$05$abcdefghijklmnopqrstuuFj/NgndkQJ9QWdR8vDPZF92Ql/3UYFy\", \"electromyographically\" },\n  { \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.rnGfJV5/J4BjTZj66R1dckO0Gy88d5e\", \"electromyographically\" },\n  { \"$2b$04$abcdefghijklmnopqrstuu\", \"$2b$04$abcdefghijklmnopqrstuui7gF3bPS07zaLzWARBCVakWoF70OE8K\", \"electromyographically\" },\n  { \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.fr2hBCxymAKP.MXKdQbm7/rIBEBis9y\", \"noninterchangeableness\" },\n  { \"$2b$05$abcdefghijklmnopqrstuu\", \"$2b$05$abcdefghijklmnopqrstuueL38vMSpfDTZP0TBBAuZDp0A/4eFDFa\", \"noninterchangeableness\" },\n  { \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.z1xt/vCOI.kmvN8L8t9GsafzGsOXupS\", \"noninterchangeableness\" },\n  { \"$2b$04$abcdefghijklmnopqrstuu\", \"$2b$04$abcdefghijklmnopqrstuuR1nrUOQ7HQO0AfPt3niv6JJN90IEgi2\", \"noninterchangeableness\" },\n  { \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.UwjPIUFoFVfh.JD5Z/iVMDQ/.s2BdmK\", \"abcdefghijklmnopqrstuvwxyz\" },\n  { \"$2b$05$abcdefghijklmnopqrstuu\", \"$2b$05$abcdefghijklmnopqrstuuq9gWjWvJAAO9dtIxbLejROlOtpZkAZ2\", \"abcdefghijklmnopqrstuvwxyz\" },\n  { \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.2qEx6VDzW/1gZVPz1yxtxnopI9gvYHG\", \"abcdefghijklmnopqrstuvwxyz\" },\n  { \"$2b$04$abcdefghijklmnopqrstuu\", \"$2b$04$abcdefghijklmnopqrstuucUHlaG.p8AVcD5w/eidx9TAkwV4EXAW\", \"abcdefghijklmnopqrstuvwxyz\" },\n  { \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.BdcD8qjQ3jCap/PcGpUCiau8u4PMcSy\", \"electroencephalographically\" },\n  { \"$2b$05$abcdefghijklmnopqrstuu\", \"$2b$05$abcdefghijklmnopqrstuuXDAnjJaWDI/Zcl0Om1uOs90q4mqBRWy\", \"electroencephalographically\" },\n  { \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.n1A7hL3v/hM0RBTwKl/MB.eEE0e4av2\", \"electroencephalographically\" },\n  { \"$2b$04$abcdefghijklmnopqrstuu\", \"$2b$04$abcdefghijklmnopqrstuuvcwFX7UZ8m2DKl4e6qPHdONvRVRgApi\", \"electroencephalographically\" },\n  { \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.9WsvENLhmOLqpxNHHDPzl0/i3I0QLXy\", \"antidisestablishmentarianism\" },\n  { \"$2b$05$abcdefghijklmnopqrstuu\", \"$2b$05$abcdefghijklmnopqrstuuNq0IwONJZaZ7QfLbcoA7E.G9LXdQ.8.\", \"antidisestablishmentarianism\" },\n  { \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.WM1vtlGv4CR1StKJWw9/1zvZjhQpVm2\", \"antidisestablishmentarianism\" },\n  { \"$2b$04$abcdefghijklmnopqrstuu\", \"$2b$04$abcdefghijklmnopqrstuu.Nk99xH6C1i1s687VYJkw/9TgJZwvkW\", \"antidisestablishmentarianism\" },\n  { \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.9vgB/QG0/5yJ0/eI2lb6I1NvMoYZHEi\", \"cyclotrimethylenetrinitramine\" },\n  { \"$2b$05$abcdefghijklmnopqrstuu\", \"$2b$05$abcdefghijklmnopqrstuuwOuvuEB8yOWqrtta0jWB10wzwfcx.sG\", \"cyclotrimethylenetrinitramine\" },\n  { \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.mumkbiG5cCSVfxbwD8LbcQV6CFQ3MXq\", \"cyclotrimethylenetrinitramine\" },\n  { \"$2b$04$abcdefghijklmnopqrstuu\", \"$2b$04$abcdefghijklmnopqrstuukUEvmtjkKEjAeshmrzk18VIJ5pOYI9G\", \"cyclotrimethylenetrinitramine\" },\n  { \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.ld/W//3S8PyfCs05HnX4ctiJEWzxvtu\", \"dichlorodiphenyltrichloroethane\" },\n  { \"$2b$05$abcdefghijklmnopqrstuu\", \"$2b$05$abcdefghijklmnopqrstuuJaeloUBsLGuKojqNVj.JssS.S.5SOoG\", \"dichlorodiphenyltrichloroethane\" },\n  { \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.IJ0s8nV/cDKYfTVFgirVaOoRoZvbMAW\", \"dichlorodiphenyltrichloroethane\" },\n  { \"$2b$04$abcdefghijklmnopqrstuu\", \"$2b$04$abcdefghijklmnopqrstuuQBL3QBmqpQVj0lKsVoN/yVsN7LDfMom\", \"dichlorodiphenyltrichloroethane\" },\n  { \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.qgmN7ezpNt2mv7RXpV9nwxAwSRHe8Z6\", \"multiple words seperated by spaces\" },\n  { \"$2b$05$abcdefghijklmnopqrstuu\", \"$2b$05$abcdefghijklmnopqrstuuUyj6XHAnIT7HIUaHPt/mAqWbLOZ95oW\", \"multiple words seperated by spaces\" },\n  { \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.ya4OMfax14JgLKjCeRnok41QNmDHk.6\", \"multiple words seperated by spaces\" },\n  { \"$2b$04$abcdefghijklmnopqrstuu\", \"$2b$04$abcdefghijklmnopqrstuurps.S9nvQl/40RApzaFs9lIt3AMcneK\", \"multiple words seperated by spaces\" },\n  { \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.2CHByRiD9EoV4pN2mhPq49ZZhIg5K/.\", \"supercalifragilisticexpialidocious\" },\n  { \"$2b$05$abcdefghijklmnopqrstuu\", \"$2b$05$abcdefghijklmnopqrstuuchc4Fu0voJQx93SMHFKQgbDXESzxUai\", \"supercalifragilisticexpialidocious\" },\n  { \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.mqD8IRcEmTxZ.ChOQZyLHygiTWmqvk2\", \"supercalifragilisticexpialidocious\" },\n  { \"$2b$04$abcdefghijklmnopqrstuu\", \"$2b$04$abcdefghijklmnopqrstuuG9j0r2T6lEIX9LVt3txW9dZuFY0Ew1q\", \"supercalifragilisticexpialidocious\" },\n  { \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.pr..QUPolGyX.oqq.qgP8kNIbwX1YlC\", \"we have a short salt string but not a short password\" },\n  { \"$2b$05$abcdefghijklmnopqrstuu\", \"$2b$05$abcdefghijklmnopqrstuuwLVtPJcEI87Gw5SVMgJ3jR.jz4FXA3C\", \"we have a short salt string but not a short password\" },\n  { \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.S693iU5aWL1P1CiTvv4sKd4VtqEefpm\", \"we have a short salt string but not a short password\" },\n  { \"$2b$04$abcdefghijklmnopqrstuu\", \"$2b$04$abcdefghijklmnopqrstuus8h4uV7ZQW6KJvz2prsjqaySAO/1k2e\", \"we have a short salt string but not a short password\" },\n  { \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.VkOUUuotOZvrmtXJpkTGsRR7av5It52\", \"multiple word$ $eperated by $pace$ and $pecial character$\" },\n  { \"$2b$05$abcdefghijklmnopqrstuu\", \"$2b$05$abcdefghijklmnopqrstuuT837gAqiU/1zYnau8zpkZMploUCluwS\", \"multiple word$ $eperated by $pace$ and $pecial character$\" },\n  { \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.iNDvHP9V2K7P.xzMWcBO.ucnS87zUrq\", \"multiple word$ $eperated by $pace$ and $pecial character$\" },\n  { \"$2b$04$abcdefghijklmnopqrstuu\", \"$2b$04$abcdefghijklmnopqrstuu5RYaD3UZMA62Bfinm5QndpfWzruwF.O\", \"multiple word$ $eperated by $pace$ and $pecial character$\" },\n  { \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.8b67df7RZ0XnI62umy35MYpe4K51Fk2\", \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\" },\n  { \"$2b$05$abcdefghijklmnopqrstuu\", \"$2b$05$abcdefghijklmnopqrstuuW5igozlL8rSr/rkFexuDh1grrkW8FSi\", \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\" },\n  { \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.F3K5wiwHej.p9lTXgX9bOlrEyWKv066\", \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\" },\n  { \"$2b$04$abcdefghijklmnopqrstuu\", \"$2b$04$abcdefghijklmnopqrstuuViu5c2UpaacAGAhQuLE2zyrV3jz4b5e\", \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\" },\n  { \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.Td/f8oS7ISMxGfHYB8YP9rXGhoZDosO\", \"12345678901234567890123456789012345678901234567890123456789012345678901234567890\" },\n  { \"$2b$05$abcdefghijklmnopqrstuu\", \"$2b$05$abcdefghijklmnopqrstuuxuElans2nYY6zVSN13XYHtA0oeOXZLa\", \"12345678901234567890123456789012345678901234567890123456789012345678901234567890\" },\n  { \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.kLVEehyg8LFsXfIVuFyGfLj4dvN7a4e\", \"12345678901234567890123456789012345678901234567890123456789012345678901234567890\" },\n  { \"$2b$04$abcdefghijklmnopqrstuu\", \"$2b$04$abcdefghijklmnopqrstuuMNSliUjQvcDZoWAZHm/hAG9Z3ZRf5wy\", \"12345678901234567890123456789012345678901234567890123456789012345678901234567890\" },\n  { \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.4aisLqC2w3pT8aeXd3SHZFJkWSCkf0a\", \"a very much longer text to encrypt.  This one even stretches over morethan one line.\" },\n  { \"$2b$05$abcdefghijklmnopqrstuu\", \"$2b$05$abcdefghijklmnopqrstuuoBz.G9gMNiZlW/Gsj.oKhiomPeIRFTC\", \"a very much longer text to encrypt.  This one even stretches over morethan one line.\" },\n  { \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.9c/KG5wY7kGTdky/Js0KWIpuVuJFUJG\", \"a very much longer text to encrypt.  This one even stretches over morethan one line.\" },\n  { \"$2b$04$abcdefghijklmnopqrstuu\", \"$2b$04$abcdefghijklmnopqrstuuinRgQYMZk.yuMIssG.kPPL6i9WP0xFa\", \"a very much longer text to encrypt.  This one even stretches over morethan one line.\" },\n  { \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.heAts1y/8kcTTP0/vD3yeuMX1ihF8dO\", \"\\xd0\\xc1\\xd2\\xcf\\xcc\\xd8\" },\n  { \"$2b$05$abcdefghijklmnopqrstuu\", \"$2b$05$abcdefghijklmnopqrstuuTp1b9XCEV16BcrQ.0k4xf7V/OGPZLnK\", \"\\xd0\\xc1\\xd2\\xcf\\xcc\\xd8\" },\n  { \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.A96emG/jBf0K1K6vCG.eZGdLkSridom\", \"\\xd0\\xc1\\xd2\\xcf\\xcc\\xd8\" },\n  { \"$2b$04$abcdefghijklmnopqrstuu\", \"$2b$04$abcdefghijklmnopqrstuuoaE0x.b2rUEITWgPdg.GEcU4ePHLh6m\", \"\\xd0\\xc1\\xd2\\xcf\\xcc\\xd8\" },\n  { \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.qJn4AY9ch/WAR5JXeeJtVGeovjQrhd2\", \"\\xd5\\xaa\\xd5\\xaa\\xaa\\xaa\\xd5\\xaa\" },\n  { \"$2b$05$abcdefghijklmnopqrstuu\", \"$2b$05$abcdefghijklmnopqrstuuiYbzuFNFwSfCgqTGNsUFtSDh8PJAqSe\", \"\\xd5\\xaa\\xd5\\xaa\\xaa\\xaa\\xd5\\xaa\" },\n  { \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.h0JFRyDXfP0duxAkVxWGr8nMDEDvPca\", \"\\xd5\\xaa\\xd5\\xaa\\xaa\\xaa\\xd5\\xaa\" },\n  { \"$2b$04$abcdefghijklmnopqrstuu\", \"$2b$04$abcdefghijklmnopqrstuuw8RVl3rh7sNazq544l0944qGq4GUFUq\", \"\\xd5\\xaa\\xd5\\xaa\\xaa\\xaa\\xd5\\xaa\" },\n  { \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.FZEYKXyyMgG13MK0uV8dwNotWf4Wm6e\", \"\\xe1\\xec\\xe5\\xf8\\xe1\\xee\\xe4\\xe5\\xf2\" },\n  { \"$2b$05$abcdefghijklmnopqrstuu\", \"$2b$05$abcdefghijklmnopqrstuuK2KXzhsMefB8v6hJJG3bOyKV.XRf6Qe\", \"\\xe1\\xec\\xe5\\xf8\\xe1\\xee\\xe4\\xe5\\xf2\" },\n  { \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.I7vjUzDOKf8XqcK8VSCm9b0bwoSm1Qm\", \"\\xe1\\xec\\xe5\\xf8\\xe1\\xee\\xe4\\xe5\\xf2\" },\n  { \"$2b$04$abcdefghijklmnopqrstuu\", \"$2b$04$abcdefghijklmnopqrstuuhWYb0x3Q3zM0aBkB2G1arbzmWxRQS/i\", \"\\xe1\\xec\\xe5\\xf8\\xe1\\xee\\xe4\\xe5\\xf2\" },\n  { \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.HD8RnTmGEavoR3LFVfdHvh3xA0QPka2\", \"\\xf3\\xf4\\xe5\\xf0\\xe8\\xe1\\xee\\xe9\\xe5\" },\n  { \"$2b$05$abcdefghijklmnopqrstuu\", \"$2b$05$abcdefghijklmnopqrstuuSRMKxjeMqVSDMhSLhOnvtEZ/p5KhUbq\", \"\\xf3\\xf4\\xe5\\xf0\\xe8\\xe1\\xee\\xe9\\xe5\" },\n  { \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.zQPVIDk6wF8XmESji30KDHFabTlu0WK\", \"\\xf3\\xf4\\xe5\\xf0\\xe8\\xe1\\xee\\xe9\\xe5\" },\n  { \"$2b$04$abcdefghijklmnopqrstuu\", \"$2b$04$abcdefghijklmnopqrstuuk9Hv17Gha84losGKAq61csCZokj5pyy\", \"\\xf3\\xf4\\xe5\\xf0\\xe8\\xe1\\xee\\xe9\\xe5\" },\n  { \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.PYLCOpTKZmhFn1CoBM2XNbWgqMX4Jk2\", \"\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\" },\n  { \"$2b$05$abcdefghijklmnopqrstuu\", \"$2b$05$abcdefghijklmnopqrstuuUTFLPGm29p.YVzcY6pqejGEql1x8Ccq\", \"\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\" },\n  { \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.PQInhDOdCKnXeUE.n/L.kQmTKM9ldK2\", \"\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\" },\n  { \"$2b$04$abcdefghijklmnopqrstuu\", \"$2b$04$abcdefghijklmnopqrstuugI4g/1M6K/Sz2bsgu9VDeEl6reszuXa\", \"\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\" },\n  { \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.uIZ1Lgb.jHRDU/Z/LVXfpQCK72fTEHq\", \"\\xc3\\xa9tude\" },\n  { \"$2b$05$abcdefghijklmnopqrstuu\", \"$2b$05$abcdefghijklmnopqrstuuYdPam5/ypFIyDUQMyCCEIwzVsTi0Sa6\", \"\\xc3\\xa9tude\" },\n  { \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.TszY8.avBpwJ6xbNjwws3SKBbK6kj6S\", \"\\xc3\\xa9tude\" },\n  { \"$2b$04$abcdefghijklmnopqrstuu\", \"$2b$04$abcdefghijklmnopqrstuu3wn02pxRJPnFwvlGt75DURDbt4g7om.\", \"\\xc3\\xa9tude\" },\n  { \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.qcYQ0c2j2SvETms11hszz5bnbvNhN0G\", \"C)tude\" },\n  { \"$2b$05$abcdefghijklmnopqrstuu\", \"$2b$05$abcdefghijklmnopqrstuuo170FGVreUKlJWzQl8GcfhpghDIp2c.\", \"C)tude\" },\n  { \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.2iSSZ5gtiVxKz8BdAoDV9IxZl3LAH7y\", \"C)tude\" },\n  { \"$2b$04$abcdefghijklmnopqrstuu\", \"$2b$04$abcdefghijklmnopqrstuutA7.Ir5GREoOf.twyI.Zoy.dI1gNHfC\", \"C)tude\" },\n  { \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.tLCLEXAt3RUjOgs.yvfWSni4j1JX/JS\", \"Chl\\xc3\\xb6\"\"e\" },\n  { \"$2b$05$abcdefghijklmnopqrstuu\", \"$2b$05$abcdefghijklmnopqrstuuz4QFggBRTVUeHRGL/CQxlAYHraYPcpa\", \"Chl\\xc3\\xb6\"\"e\" },\n  { \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.KHsCqMFVxOAGJObHwEBR3JaEdKVu1.m\", \"Chl\\xc3\\xb6\"\"e\" },\n  { \"$2b$04$abcdefghijklmnopqrstuu\", \"$2b$04$abcdefghijklmnopqrstuuG6PeIXKiqeNUPUbqFkMJvvI7G9hd51W\", \"Chl\\xc3\\xb6\"\"e\" },\n  { \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.w.V.mBIadppiKKxZ0OzpXn86NOk43pC\", \"ChlC6e\" },\n  { \"$2b$05$abcdefghijklmnopqrstuu\", \"$2b$05$abcdefghijklmnopqrstuuQ2qgoto47/GjSmc6truiPxHNSL1jAfS\", \"ChlC6e\" },\n  { \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.r7GLvyVWQLuQaOTYsrMOBkbLfy8sPIi\", \"ChlC6e\" },\n  { \"$2b$04$abcdefghijklmnopqrstuu\", \"$2b$04$abcdefghijklmnopqrstuueolw0UBEFN.qCtReAkwiO7BAjrY4CX6\", \"ChlC6e\" },\n  { \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.UPBzTBMwJb5mKWflQ.5Rid4481RrxVy\", \"\\xc3\\x85ngstr\\xc3\\xb6m\" },\n  { \"$2b$05$abcdefghijklmnopqrstuu\", \"$2b$05$abcdefghijklmnopqrstuuCARhc7ugFdgoPjDb7LUG.yQF2lboK6e\", \"\\xc3\\x85ngstr\\xc3\\xb6m\" },\n  { \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.ZHZAnvydiPNiYH2VjRNhEAD6BEiyaWS\", \"\\xc3\\x85ngstr\\xc3\\xb6m\" },\n  { \"$2b$04$abcdefghijklmnopqrstuu\", \"$2b$04$abcdefghijklmnopqrstuu2WegkGS5Xr/qYNkfEi6JmnR16WVSwcW\", \"\\xc3\\x85ngstr\\xc3\\xb6m\" },\n  { \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.gx7D73FxK1lx9aoctuj3fhNJqC.IYc6\", \"C\\x05ngstrC6m\" },\n  { \"$2b$05$abcdefghijklmnopqrstuu\", \"$2b$05$abcdefghijklmnopqrstuusSqmEHNEXYcUAamAuvd.piiJP2/SvW6\", \"C\\x05ngstrC6m\" },\n  { \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.pjA09E/vp0VG8cavv0kgRuMJNPJRdqS\", \"C\\x05ngstrC6m\" },\n  { \"$2b$04$abcdefghijklmnopqrstuu\", \"$2b$04$abcdefghijklmnopqrstuuEFW231TUkQA55cajdiwh2GQXkKY7v4.\", \"C\\x05ngstrC6m\" },\n  { \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.OVB6qjs7Uzos9N7/Rpm1laBHwGw11u.\", \"C\\x05ngstrCU*U***U*\" },\n  { \"$2b$05$abcdefghijklmnopqrstuu\", \"$2b$05$abcdefghijklmnopqrstuuAEHJsqoIo5645CuTbmM6VobcvFM6pxK\", \"C\\x05ngstrCU*U***U*\" },\n  { \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.E/ZiYei4bcJNCJEyI148Q1.aMAOn66e\", \"C\\x05ngstrCU*U***U*\" },\n  { \"$2b$04$abcdefghijklmnopqrstuu\", \"$2b$04$abcdefghijklmnopqrstuumAqJP8MYx4tSoKoE9d0vR0QW81bYuSC\", \"C\\x05ngstrCU*U***U*\" },\n  { \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.84ASbYYPYkl18.t0.TvQbm0oh98TFvG\", \"U*U***U*ignored\" },\n  { \"$2b$05$abcdefghijklmnopqrstuu\", \"$2b$05$abcdefghijklmnopqrstuuR.W0Ohu3KxpPUfr5Knw07yOOzZkdd7.\", \"U*U***U*ignored\" },\n  { \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.wx4V3qBoGl7ej9kbsoEpQTxmptzY0yq\", \"U*U***U*ignored\" },\n  { \"$2b$04$abcdefghijklmnopqrstuu\", \"$2b$04$abcdefghijklmnopqrstuu4SS72T2y2mc0YsQSe9qECdkPhGVslHS\", \"U*U***U*ignored\" },\n  { \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.ebmmSqlfcFhKGN/743nH7i03zpqftle\", \"U*U*U*U*\" },\n  { \"$2b$05$abcdefghijklmnopqrstuu\", \"$2b$05$abcdefghijklmnopqrstuuF1QNFce4DfYnYJUcafR1v2/7XbWeLjK\", \"U*U*U*U*\" },\n  { \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.5KIIW3tGg2xhhVu/AQXLZX9lSSeeehu\", \"U*U*U*U*\" },\n  { \"$2b$04$abcdefghijklmnopqrstuu\", \"$2b$04$abcdefghijklmnopqrstuudBYNJEBvC10idL3LIvyzUGdaxqz0jJW\", \"U*U*U*U*\" },\n  { \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.htnOkHgQ8LrcyWv4cQVE5Bt0DiVxJzG\", \"U*U*U*U*ignored\" },\n  { \"$2b$05$abcdefghijklmnopqrstuu\", \"$2b$05$abcdefghijklmnopqrstuu1JJvN7RoX92Zzq1yGezl/5/3vlXyrxi\", \"U*U*U*U*ignored\" },\n  { \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.7YCBkroPI7yK9JGre8Hne5hdwmA6Z3S\", \"U*U*U*U*ignored\" },\n  { \"$2b$04$abcdefghijklmnopqrstuu\", \"$2b$04$abcdefghijklmnopqrstuuc1KKQsfk4nXu9CnvuF/SfMwrmif7tsC\", \"U*U*U*U*ignored\" },\n  { \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.DzSBCMqe17IfGIqEfq.FrxykxqtrVi2\", \"*U*U*U*U\" },\n  { \"$2b$05$abcdefghijklmnopqrstuu\", \"$2b$05$abcdefghijklmnopqrstuuuzPVVNB/SAKLJbAoTgm3qolIt8JCyqG\", \"*U*U*U*U\" },\n  { \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.1fL1/3fOtt1usdRoe0dWgjAUT/TMd76\", \"*U*U*U*U\" },\n  { \"$2b$04$abcdefghijklmnopqrstuu\", \"$2b$04$abcdefghijklmnopqrstuu39YJ8HbI96dgaVWEUkKUCgXR4676Qjq\", \"*U*U*U*U\" },\n  { \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.yu/PNF5atjbvgp2r9GyRzSYOErUPNHq\", \"*U*U*U*U*\" },\n  { \"$2b$05$abcdefghijklmnopqrstuu\", \"$2b$05$abcdefghijklmnopqrstuuZu/4jl7FZnNPiPunsfxbXLTBcZ4XPMe\", \"*U*U*U*U*\" },\n  { \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.YT6TwplC9qsDdIyZ4nZ.2STP1srJcv.\", \"*U*U*U*U*\" },\n  { \"$2b$04$abcdefghijklmnopqrstuu\", \"$2b$04$abcdefghijklmnopqrstuuQ6t3zlOYOUrJSlX7AdtXuuWd0hDhQiC\", \"*U*U*U*U*\" },\n  { \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.7Cc1PePc3H0bDi8khYlhX6PVDNBB0QK\", \"*U*U*U*U*U*U*U*U\" },\n  { \"$2b$05$abcdefghijklmnopqrstuu\", \"$2b$05$abcdefghijklmnopqrstuuwd22F2Sxe6gq2OS.jcQfMBY2dJtwKyS\", \"*U*U*U*U*U*U*U*U\" },\n  { \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.AYh0eQgGLbt9qiP1jMH9.zHrUuVNY5.\", \"*U*U*U*U*U*U*U*U\" },\n  { \"$2b$04$abcdefghijklmnopqrstuu\", \"$2b$04$abcdefghijklmnopqrstuui4ZHqA63Ft09xDrL31aaZvJ3RjuITQq\", \"*U*U*U*U*U*U*U*U\" },\n  { \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.jlPoM5ioW.OQLW.5JcdEmo4HtRjF876\", \"*U*U*U*U*U*U*U*U*\" },\n  { \"$2b$05$abcdefghijklmnopqrstuu\", \"$2b$05$abcdefghijklmnopqrstuuz3ESgmDkKJlK0Nuq2.ylqgmDHlpC38q\", \"*U*U*U*U*U*U*U*U*\" },\n  { \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.scf6.mexwrzCAGi3ShQ8cYkynqeH0bK\", \"*U*U*U*U*U*U*U*U*\" },\n  { \"$2b$04$abcdefghijklmnopqrstuu\", \"$2b$04$abcdefghijklmnopqrstuuQLykgCNxKyLhRD0HXzLibuZLZfiGOEO\", \"*U*U*U*U*U*U*U*U*\" },\n  { \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.BvtRGGx3p8o0C5C36uS442Qqnrwofrq\", \"\\xa3\" },\n  { \"$2b$05$abcdefghijklmnopqrstuu\", \"$2b$05$abcdefghijklmnopqrstuuEuEnx.TyCLYgkTV/uhWL5xJTHV7ZMjG\", \"\\xa3\" },\n  { \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.nCdKcLO57oLlc6J6sNnGyfT9FrIawiW\", \"\\xa3\" },\n  { \"$2b$04$abcdefghijklmnopqrstuu\", \"$2b$04$abcdefghijklmnopqrstuurz1efvzeJjL4mQ813hrZNg3p1.ivOii\", \"\\xa3\" },\n  { \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.k786rdsOdUP4cRi.dLa3dsYueMj5UnS\", \"\\xa3\"\"a\" },\n  { \"$2b$05$abcdefghijklmnopqrstuu\", \"$2b$05$abcdefghijklmnopqrstuuLN/CEHXLfFeYdOOxbdxKu8ZqSIKgqAu\", \"\\xa3\"\"a\" },\n  { \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.4QrucGf30zIbQA.sO0d1QrU63xBrEYq\", \"\\xa3\"\"a\" },\n  { \"$2b$04$abcdefghijklmnopqrstuu\", \"$2b$04$abcdefghijklmnopqrstuugbhoNOH4mWxoEhRrQNdeI.rpk9XeuZS\", \"\\xa3\"\"a\" },\n  { \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.1qOUgfpg30XDHLx/zrbWiMRcWyFhwye\", \"\\xd1\\x91\" },\n  { \"$2b$05$abcdefghijklmnopqrstuu\", \"$2b$05$abcdefghijklmnopqrstuus6h1E6A2RzVn2KxXLQXsKosQeRo8bLa\", \"\\xd1\\x91\" },\n  { \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.7UwHe/ywPmdp.nr.ZLQSxd8hqn7qURW\", \"\\xd1\\x91\" },\n  { \"$2b$04$abcdefghijklmnopqrstuu\", \"$2b$04$abcdefghijklmnopqrstuuSqNATdQiNEckAKLsqgsKbAM5.hZoMCq\", \"\\xd1\\x91\" },\n  { \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.bJFOmj3TaByM10X0BF32w0Fv/xFNSvm\", \"\\xa3\"\"ab\" },\n  { \"$2b$05$abcdefghijklmnopqrstuu\", \"$2b$05$abcdefghijklmnopqrstuuojaU9K.vmSlY6BHpgIQ/WY9rEOCcJO2\", \"\\xa3\"\"ab\" },\n  { \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.0EeTSP42yLfD7uTTcDffPd2CNLKHdoy\", \"\\xa3\"\"ab\" },\n  { \"$2b$04$abcdefghijklmnopqrstuu\", \"$2b$04$abcdefghijklmnopqrstuuikYh/9nIvugTp.kFPFeZDBu7eW6BLoa\", \"\\xa3\"\"ab\" },\n  { \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.Qjdj3GXX7D0sFE9jji6wxSTWIhqI3US\", \"\\xff\\xff\\xa3\" },\n  { \"$2b$05$abcdefghijklmnopqrstuu\", \"$2b$05$abcdefghijklmnopqrstuuHdhhdUXVgLADnbTYf12kvsasO1gS51C\", \"\\xff\\xff\\xa3\" },\n  { \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.PIeeyENZVZmrKLAq5lwBUU9fMRVfV2m\", \"\\xff\\xff\\xa3\" },\n  { \"$2b$04$abcdefghijklmnopqrstuu\", \"$2b$04$abcdefghijklmnopqrstuuMOaOTHB4gEm.rriBjXNwBNh.Oc4mKGG\", \"\\xff\\xff\\xa3\" },\n  { \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.RbKkfW2ph8bd8B5yul5E97DxgDw9cT.\", \"1\\xa3\"\"345\" },\n  { \"$2b$05$abcdefghijklmnopqrstuu\", \"$2b$05$abcdefghijklmnopqrstuurPSVExmrZ2WB1xntSbqZ/DRQRlKtVw.\", \"1\\xa3\"\"345\" },\n  { \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.XEhidoDX1kz.RFnwWIzMJvtW2aP/k4e\", \"1\\xa3\"\"345\" },\n  { \"$2b$04$abcdefghijklmnopqrstuu\", \"$2b$04$abcdefghijklmnopqrstuuXl2V4mQ7s0zX0b4XXH/b9UkRRCWpq3e\", \"1\\xa3\"\"345\" },\n  { \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.WI7ZNXFtzCd9mN1mWoNMQRHEmkDsZnm\", \"\\xff\\xa3\"\"345\" },\n  { \"$2b$05$abcdefghijklmnopqrstuu\", \"$2b$05$abcdefghijklmnopqrstuu6WgD2zYQDPgxR2sXlUeEeGKknxt95W.\", \"\\xff\\xa3\"\"345\" },\n  { \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.KBv1eBM2he2T/QheS8zPHMejn5fMNRe\", \"\\xff\\xa3\"\"345\" },\n  { \"$2b$04$abcdefghijklmnopqrstuu\", \"$2b$04$abcdefghijklmnopqrstuuUIzecIiCguM2sPh1F7L9IS3zOtmg5Im\", \"\\xff\\xa3\"\"345\" },\n  { \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.VmFQpoXeVuKTzkg2ZRsAf.8PZJZg142\", \"\\xff\\xa3\"\"34\\xff\\xff\\xff\\xa3\"\"345\" },\n  { \"$2b$05$abcdefghijklmnopqrstuu\", \"$2b$05$abcdefghijklmnopqrstuucaGU5ROXj4M8Tgsx3s/D5BQIuhazIWa\", \"\\xff\\xa3\"\"34\\xff\\xff\\xff\\xa3\"\"345\" },\n  { \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.8jdeg8QqT4CX3ERA9vZPFZAkxZRpxJW\", \"\\xff\\xa3\"\"34\\xff\\xff\\xff\\xa3\"\"345\" },\n  { \"$2b$04$abcdefghijklmnopqrstuu\", \"$2b$04$abcdefghijklmnopqrstuu9f4sA9SRA0scUKcRyC5kce8dao2.GKe\", \"\\xff\\xa3\"\"34\\xff\\xff\\xff\\xa3\"\"345\" },\n  { \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.xGPMyJSPyyeICKolPQ2gecm8rOgHwz.\", \"U\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xff\" },\n  { \"$2b$05$abcdefghijklmnopqrstuu\", \"$2b$05$abcdefghijklmnopqrstuuuTNb9MEHVGI7kd6UnQjYxgRNiKJM01S\", \"U\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xff\" },\n  { \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.k.qekGiJym3QgfeFCwNhPHg0Zk99KSa\", \"U\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xff\" },\n  { \"$2b$04$abcdefghijklmnopqrstuu\", \"$2b$04$abcdefghijklmnopqrstuuyM59Cq5iVZDB3u45gTNhRSnOgrY1tdG\", \"U\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xff\" },\n  { \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.VAQY6kySmwStlNY.sut9Y87njVr0mm.\", \"\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\" },\n  { \"$2b$05$abcdefghijklmnopqrstuu\", \"$2b$05$abcdefghijklmnopqrstuuPPtdI0NcxZ4Txyv/Y5ORfcP1XFriKT2\", \"\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\" },\n  { \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.tHwehGUs3q0b/Ejn42MsoM4Yv/iA1rq\", \"\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\" },\n  { \"$2b$04$abcdefghijklmnopqrstuu\", \"$2b$04$abcdefghijklmnopqrstuu3cFqlEl7Y0HWaVLHpyyCqG8dBNk1DSm\", \"\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\" },\n  { \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.n2VnrmAaokJwiDSekcCjbZxRIyVngRy\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\" },\n  { \"$2b$05$abcdefghijklmnopqrstuu\", \"$2b$05$abcdefghijklmnopqrstuu5s2v8.iXieOjg/.AySBTTZIIVFJeBui\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\" },\n  { \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.0ZsAfF0DsSCOCcfZKxtwXxkV4RFYBVG\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\" },\n  { \"$2b$04$abcdefghijklmnopqrstuu\", \"$2b$04$abcdefghijklmnopqrstuuRAip/W0RPQX4QKkqYqXE3GIXWH518Sm\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\" },\n  { \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.n2VnrmAaokJwiDSekcCjbZxRIyVngRy\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789chars after 72 are ignored\" },\n  { \"$2b$05$abcdefghijklmnopqrstuu\", \"$2b$05$abcdefghijklmnopqrstuu5s2v8.iXieOjg/.AySBTTZIIVFJeBui\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789chars after 72 are ignored\" },\n  { \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.0ZsAfF0DsSCOCcfZKxtwXxkV4RFYBVG\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789chars after 72 are ignored\" },\n  { \"$2b$04$abcdefghijklmnopqrstuu\", \"$2b$04$abcdefghijklmnopqrstuuRAip/W0RPQX4QKkqYqXE3GIXWH518Sm\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789chars after 72 are ignored\" },\n  { \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.ZkQGqjbMpqQ9oCsxNZjN8LQJaHFqPMC\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\" },\n  { \"$2b$05$abcdefghijklmnopqrstuu\", \"$2b$05$abcdefghijklmnopqrstuu51cV.PJOQVwmiao4t4lXsb9Cc3Jnuem\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\" },\n  { \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.DQjlTXDA5PBQ97.qBJY/vsHPQhLJDMe\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\" },\n  { \"$2b$04$abcdefghijklmnopqrstuu\", \"$2b$04$abcdefghijklmnopqrstuuAqM0XavJxJXeVlJ3Te3umGJaPOCYmZi\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\" },\n  { \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.ZkQGqjbMpqQ9oCsxNZjN8LQJaHFqPMC\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\"\"chars after 72 are ignored as usual\" },\n  { \"$2b$05$abcdefghijklmnopqrstuu\", \"$2b$05$abcdefghijklmnopqrstuu51cV.PJOQVwmiao4t4lXsb9Cc3Jnuem\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\"\"chars after 72 are ignored as usual\" },\n  { \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.DQjlTXDA5PBQ97.qBJY/vsHPQhLJDMe\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\"\"chars after 72 are ignored as usual\" },\n  { \"$2b$04$abcdefghijklmnopqrstuu\", \"$2b$04$abcdefghijklmnopqrstuuAqM0XavJxJXeVlJ3Te3umGJaPOCYmZi\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\"\"chars after 72 are ignored as usual\" },\n  { \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.RURfiuM5wAc5Jv4SO604mh/l3NurIoq\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has forgotten.\" },\n  { \"$2b$05$abcdefghijklmnopqrstuu\", \"$2b$05$abcdefghijklmnopqrstuu6v4sW.Jh71LP6RHjCG1iTdKjHpi8Az2\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has forgotten.\" },\n  { \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.NNYMcLQ7lIauYt0h6mWJtoSyBZqwBwi\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has forgotten.\" },\n  { \"$2b$04$abcdefghijklmnopqrstuu\", \"$2b$04$abcdefghijklmnopqrstuuZgFC0hc.gvORKBIExxdbXTGVmt0vRFW\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has forgotten.\" },\n  { \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.uB1no1bSvQlNFbG6DThB52xIhyG9z8G\", \"THE YEAR\" },\n  { \"$2b$05$abcdefghijklmnopqrstuu\", \"$2b$05$abcdefghijklmnopqrstuuySE45JP/avbudkXbPzjvqTBKf61NNfi\", \"THE YEAR\" },\n  { \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.c/NBil2GQ9h1axG3uDE7cen7O1yt4wu\", \"THE YEAR\" },\n  { \"$2b$04$abcdefghijklmnopqrstuu\", \"$2b$04$abcdefghijklmnopqrstuuT4fz1ym9dcyOwa1hMmFJSuk4yISb03.\", \"THE YEAR\" },\n  { \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.RURfiuM5wAc5Jv4SO604mh/l3NurIoq\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and do\" },\n  { \"$2b$05$abcdefghijklmnopqrstuu\", \"$2b$05$abcdefghijklmnopqrstuu6v4sW.Jh71LP6RHjCG1iTdKjHpi8Az2\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and do\" },\n  { \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.NNYMcLQ7lIauYt0h6mWJtoSyBZqwBwi\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and do\" },\n  { \"$2b$04$abcdefghijklmnopqrstuu\", \"$2b$04$abcdefghijklmnopqrstuuZgFC0hc.gvORKBIExxdbXTGVmt0vRFW\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and do\" },\n  { \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$05$CCCCCCCCCCCCCCCCCCCCC.RURfiuM5wAc5Jv4SO604mh/l3NurIoq\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has f\" },\n  { \"$2b$05$abcdefghijklmnopqrstuu\", \"$2b$05$abcdefghijklmnopqrstuu6v4sW.Jh71LP6RHjCG1iTdKjHpi8Az2\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has f\" },\n  { \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2b$04$CCCCCCCCCCCCCCCCCCCCC.NNYMcLQ7lIauYt0h6mWJtoSyBZqwBwi\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has f\" },\n  { \"$2b$04$abcdefghijklmnopqrstuu\", \"$2b$04$abcdefghijklmnopqrstuuZgFC0hc.gvORKBIExxdbXTGVmt0vRFW\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has f\" },\n#endif // bcrypt\n\n#if INCLUDE_bcrypt_y && defined TEST_bcrypt_y\n  { \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.7uG0VCzI2bS7j6ymqJi9CdcdxiRTWNy\", \"\" },\n  { \"$2y$05$abcdefghijklmnopqrstuu\", \"$2y$05$abcdefghijklmnopqrstuu0oImNDIy4flhldV9YqunRgBAePKmw7m\", \"\" },\n  { \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.Cg0ly9t/KVBCBYYDfOmZKwry9JuXClC\", \"\" },\n  { \"$2y$04$abcdefghijklmnopqrstuu\", \"$2y$04$abcdefghijklmnopqrstuubyCG3zY1GIXMyxfivm.ClDiInHzxjiq\", \"\" },\n  { \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.REUe.wVCLEE7cNcWpheIXR9MaRPCoVC\", \" \" },\n  { \"$2y$05$abcdefghijklmnopqrstuu\", \"$2y$05$abcdefghijklmnopqrstuueHjTs35M4oLkB0oz2vpFCrkqmB3wDyK\", \" \" },\n  { \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.QK3io8Pm4WhsBSZhzvm1OPPQ1MU.WxC\", \" \" },\n  { \"$2y$04$abcdefghijklmnopqrstuu\", \"$2y$04$abcdefghijklmnopqrstuu/ied6LYDv4Nek.n8vXq7pbx7mJcRizO\", \" \" },\n  { \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.crbyEJ0XFaJ9sONRyOTHdI7c4ZT.ndu\", \"a\" },\n  { \"$2y$05$abcdefghijklmnopqrstuu\", \"$2y$05$abcdefghijklmnopqrstuu8.veTXNDPV2eEsdpKNczMw2otgh5LnK\", \"a\" },\n  { \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.f/Fm9DOYGp2ai9rjxvG4QHlhtDCuDuu\", \"a\" },\n  { \"$2y$04$abcdefghijklmnopqrstuu\", \"$2y$04$abcdefghijklmnopqrstuuMFdJu9yVgmagVAIC24fOZkaFqd3s9JC\", \"a\" },\n  { \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.w5.fxtwCNbJ3swM5YKT2SoO0YcCOkhS\", \"ab\" },\n  { \"$2y$05$abcdefghijklmnopqrstuu\", \"$2y$05$abcdefghijklmnopqrstuu0EJam7uq2UHswNA05epRm6fJdiFmbUi\", \"ab\" },\n  { \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.ThcCpjPKXmu6XgQqJJEGokAiEUquQVe\", \"ab\" },\n  { \"$2y$04$abcdefghijklmnopqrstuu\", \"$2y$04$abcdefghijklmnopqrstuu0CkeIeZLJOlOL1QPPhfXulLNPdFqJBW\", \"ab\" },\n  { \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.gNn9EDJdrUJF53AHnb.4T9BCvqhUYdW\", \"abc\" },\n  { \"$2y$05$abcdefghijklmnopqrstuu\", \"$2y$05$abcdefghijklmnopqrstuuRWUgMyyCUnsDr8evYotXg5ZXVF/HhzS\", \"abc\" },\n  { \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.AKurti2nSiRoaXd0tyyeWA.1jj9Kto2\", \"abc\" },\n  { \"$2y$04$abcdefghijklmnopqrstuu\", \"$2y$04$abcdefghijklmnopqrstuuCi15uRb1eH7NAlJ/TgeJertyknQpYn2\", \"abc\" },\n  { \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.E5YPO9kmyuRGyh0XouQYb4YMJKvyOeW\", \"U*U\" },\n  { \"$2y$05$abcdefghijklmnopqrstuu\", \"$2y$05$abcdefghijklmnopqrstuuMpLhh66NJUQMuZ6FwRQX0sqAEKeWcKW\", \"U*U\" },\n  { \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.K7Qr0se1MxuggH4aP4YgB.U2Em1pGSK\", \"U*U\" },\n  { \"$2y$04$abcdefghijklmnopqrstuu\", \"$2y$04$abcdefghijklmnopqrstuuCFaEytnzrfaPZJKbS76hh9vqd9r8v2S\", \"U*U\" },\n  { \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.VGOzA784oUp/Z0DY336zx7pLYAy0lwK\", \"U*U*\" },\n  { \"$2y$05$abcdefghijklmnopqrstuu\", \"$2y$05$abcdefghijklmnopqrstuueqZzwRqX8BEsrV2jF8gx70v6bcd1qAG\", \"U*U*\" },\n  { \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.5dvsdVl2y/501tm9dvdbbSRbpuvxsaC\", \"U*U*\" },\n  { \"$2y$04$abcdefghijklmnopqrstuu\", \"$2y$04$abcdefghijklmnopqrstuuBtzXFXMcxIslxJptQaoJYuU.xP21coS\", \"U*U*\" },\n  { \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.Bw3BobdGs1SFsKsRLIx9rC4T.Q7DtEm\", \"U*U*U\" },\n  { \"$2y$05$abcdefghijklmnopqrstuu\", \"$2y$05$abcdefghijklmnopqrstuupkvHj1c6E382bN8hwXRlu1xE4bc1pgG\", \"U*U*U\" },\n  { \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.r2Gz4aKpQDpr6TmvEJksSv12hIDVgXe\", \"U*U*U\" },\n  { \"$2y$04$abcdefghijklmnopqrstuu\", \"$2y$04$abcdefghijklmnopqrstuuMJG4SPxGpsI2PpmiVYJg7D.hA7CdQyO\", \"U*U*U\" },\n  { \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.6YtT5mHh5I666KkHRqqIuteDuaNX1GS\", \".....\" },\n  { \"$2y$05$abcdefghijklmnopqrstuu\", \"$2y$05$abcdefghijklmnopqrstuun3YeQp9ZOh1qWiEKJNRybZT69WMr2sW\", \".....\" },\n  { \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.6v/P2K1bqBzj9FILn7LJntMzJQxUuA6\", \".....\" },\n  { \"$2y$04$abcdefghijklmnopqrstuu\", \"$2y$04$abcdefghijklmnopqrstuu7bnTzNnC9mpomsuya2sDYCcZGtW3FKu\", \".....\" },\n  { \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.LZrfN0lz4CULfFuRjqXiVMP49yNOHKi\", \"dragon\" },\n  { \"$2y$05$abcdefghijklmnopqrstuu\", \"$2y$05$abcdefghijklmnopqrstuuG4nizIsfFMB34Hh5MoYcbtdFUq5YPJK\", \"dragon\" },\n  { \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.tidtIFf5ZCN.gk6Mobs.YyDMzNhFfFm\", \"dragon\" },\n  { \"$2y$04$abcdefghijklmnopqrstuu\", \"$2y$04$abcdefghijklmnopqrstuujzhP54E3nDKxLTbGbyrFiW3EkV.7ERC\", \"dragon\" },\n  { \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.i7hPnfU5WycMwd1C9qJZDFBCw8NcAFu\", \"dRaGoN\" },\n  { \"$2y$05$abcdefghijklmnopqrstuu\", \"$2y$05$abcdefghijklmnopqrstuuMA7xTS.7H8Lal4RW.s8KBMURGOrPxQa\", \"dRaGoN\" },\n  { \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.5TqUWVAHsz4mvbAcNwu3JSwt7Pd.dm2\", \"dRaGoN\" },\n  { \"$2y$04$abcdefghijklmnopqrstuu\", \"$2y$04$abcdefghijklmnopqrstuuqS/OX35wGo1BfqluN8dsq//CyXY2pNS\", \"dRaGoN\" },\n  { \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.ZGVtQn6eTc3aPe.tQ.zJuH3XlzyI9Di\", \"DrAgOn\" },\n  { \"$2y$05$abcdefghijklmnopqrstuu\", \"$2y$05$abcdefghijklmnopqrstuuO5PYTf2OGllbJ1tyzjIAdpnQ9rUDGNC\", \"DrAgOn\" },\n  { \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.SzmeTH6T6GIGbKj9Om75UAlglaj4twK\", \"DrAgOn\" },\n  { \"$2y$04$abcdefghijklmnopqrstuu\", \"$2y$04$abcdefghijklmnopqrstuuE9zYHFcawnjSDJKsSux5hf1fyy3utXW\", \"DrAgOn\" },\n  { \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.u/WsPSagrbjc3QmFLSt6j9e/LJ8FoNm\", \"PAROLX\" },\n  { \"$2y$05$abcdefghijklmnopqrstuu\", \"$2y$05$abcdefghijklmnopqrstuuzyv2QWIljnSNjMYpSebmlCqn.QEGEB6\", \"PAROLX\" },\n  { \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.pQY3jmCmc/1Pk8B2m6DNUj9ANrzICLK\", \"PAROLX\" },\n  { \"$2y$04$abcdefghijklmnopqrstuu\", \"$2y$04$abcdefghijklmnopqrstuumicc49hlc3UdUYSMeE8ZXKFJcV/Q2Nm\", \"PAROLX\" },\n  { \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.7Knr9/jUQJ0lh8N4AU/fMnQskXCdfSu\", \"U*U***U\" },\n  { \"$2y$05$abcdefghijklmnopqrstuu\", \"$2y$05$abcdefghijklmnopqrstuu0whe22G2FGJcNLWQaY2ZVuZIf5IJBHK\", \"U*U***U\" },\n  { \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.H3n2rsAGLquD5DBiTNaKBEYcc0HJy5K\", \"U*U***U\" },\n  { \"$2y$04$abcdefghijklmnopqrstuu\", \"$2y$04$abcdefghijklmnopqrstuuDu3PK53XxhceAEiIIFWWlG16bn5LvcG\", \"U*U***U\" },\n  { \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.HjTkKOvb2xTYRqeMFaN1PRcxuDYro5y\", \"abcdefg\" },\n  { \"$2y$05$abcdefghijklmnopqrstuu\", \"$2y$05$abcdefghijklmnopqrstuu3NLAiMrV.ggY98aZ7cNIwxII7afa91.\", \"abcdefg\" },\n  { \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.GQNqYPSPnkqs4XPHOKxta8z3oVxx.Oe\", \"abcdefg\" },\n  { \"$2y$04$abcdefghijklmnopqrstuu\", \"$2y$04$abcdefghijklmnopqrstuuGTNT0Ri8Ic/nBhrRQu0ORxwctqE11mO\", \"abcdefg\" },\n  { \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.RFkLTR7KyUmGXnFvMFlLbB23MCIzsgi\", \"01234567\" },\n  { \"$2y$05$abcdefghijklmnopqrstuu\", \"$2y$05$abcdefghijklmnopqrstuuQOF57SPhYRiKufm4.epZm3ELZ4UlAVy\", \"01234567\" },\n  { \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.3uce2XN8xqrZ2aIduEu48JNEUk6ih9y\", \"01234567\" },\n  { \"$2y$04$abcdefghijklmnopqrstuu\", \"$2y$04$abcdefghijklmnopqrstuucnCKiuhmJV3sCjWqQH.rYNPhmru2Bfq\", \"01234567\" },\n  { \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.hz7CVP6wIj8Z57Ze7yuhrhzKfvq0Ty.\", \"726 even\" },\n  { \"$2y$05$abcdefghijklmnopqrstuu\", \"$2y$05$abcdefghijklmnopqrstuuIaVbx2I8MHKuu1rBc/gqV8Fo2An7wQm\", \"726 even\" },\n  { \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.ib/v2w9PynSZewkHDlSuFwGC.jkyh4a\", \"726 even\" },\n  { \"$2y$04$abcdefghijklmnopqrstuu\", \"$2y$04$abcdefghijklmnopqrstuus/VSIfP19Ty4eQaE51vB9GbPNmLhq2S\", \"726 even\" },\n  { \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.jUMW9ITlTfAw5cFja1iYihO7V9qsmWK\", \"zyxwvuts\" },\n  { \"$2y$05$abcdefghijklmnopqrstuu\", \"$2y$05$abcdefghijklmnopqrstuucN2On7GNyUtMxT..Bo0a0ICaTeQOJ4u\", \"zyxwvuts\" },\n  { \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.xf6Tlh/zfR9Qob4S/6wj9RneRcBt4yG\", \"zyxwvuts\" },\n  { \"$2y$04$abcdefghijklmnopqrstuu\", \"$2y$04$abcdefghijklmnopqrstuucqOWKor12VNz5REoX.a3GqgU2btIQWS\", \"zyxwvuts\" },\n  { \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.hdihJRIixUmRFFg0NQNaid9UF3Uw/Q.\", \"ab1234567\" },\n  { \"$2y$05$abcdefghijklmnopqrstuu\", \"$2y$05$abcdefghijklmnopqrstuulK6ChIvFKqdreUvOY9oKm2O2Fn.1Zuq\", \"ab1234567\" },\n  { \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.xq4CFi9Keo/OhWm9tosH45r9gI3Gd4C\", \"ab1234567\" },\n  { \"$2y$04$abcdefghijklmnopqrstuu\", \"$2y$04$abcdefghijklmnopqrstuuuBq8XeHGZZJdrs6jsgiLupxqOP4GLc6\", \"ab1234567\" },\n  { \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.0c9Eoia74tfCGVyINCZAcZaVzJdMsoi\", \"alexander\" },\n  { \"$2y$05$abcdefghijklmnopqrstuu\", \"$2y$05$abcdefghijklmnopqrstuu3qH73fcOvo6pdGd/u/Of.mkavvVviAG\", \"alexander\" },\n  { \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.bK5f5L/foC9KH3IYxj9uWGZPE/w22J2\", \"alexander\" },\n  { \"$2y$04$abcdefghijklmnopqrstuu\", \"$2y$04$abcdefghijklmnopqrstuu1zazepZSS74T7o4eCXaJqsa4KC41vt6\", \"alexander\" },\n  { \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.Tc9f8dMIa03zsepKEv1oSFsFWT84Me.\", \"beautiful\" },\n  { \"$2y$05$abcdefghijklmnopqrstuu\", \"$2y$05$abcdefghijklmnopqrstuusxVo.QMslOcijv585zolzUwesRGYfui\", \"beautiful\" },\n  { \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.7XxYg42754jz07Elen5lFQuommU7crW\", \"beautiful\" },\n  { \"$2y$04$abcdefghijklmnopqrstuu\", \"$2y$04$abcdefghijklmnopqrstuuHz11b40qtSU5.OKZJGONgmO6tsOw8ny\", \"beautiful\" },\n  { \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.SxOcYMxtg44jVOAYY0zBeTBbfCYXSBu\", \"challenge\" },\n  { \"$2y$05$abcdefghijklmnopqrstuu\", \"$2y$05$abcdefghijklmnopqrstuuD2bZx1XnT2xoC7mKx.Jr7E20hJXg5y.\", \"challenge\" },\n  { \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.mK3Hkg2ZFCrNFQRor1M7Bd.pyBSFz56\", \"challenge\" },\n  { \"$2y$04$abcdefghijklmnopqrstuu\", \"$2y$04$abcdefghijklmnopqrstuu92OCZ/GwgJ2w0KrMJRu6fK7i2iKqYha\", \"challenge\" },\n  { \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.455yryJspofWOsWxxZ/Tsu5qtg8j2wm\", \"chocolate\" },\n  { \"$2y$05$abcdefghijklmnopqrstuu\", \"$2y$05$abcdefghijklmnopqrstuulZGdWs.WkvfSGHTz.1.5CPi2ETJLi3.\", \"chocolate\" },\n  { \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.N0Iumk1Mt6l7kbmk8iYgSA9FqaEfv5y\", \"chocolate\" },\n  { \"$2y$04$abcdefghijklmnopqrstuu\", \"$2y$04$abcdefghijklmnopqrstuuLbL252qaabO.sIFmAzyShKINVGRsGeu\", \"chocolate\" },\n  { \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.ZA//OMzj1MY4PfGODYfbeGs8HPUS2zq\", \"cr1234567\" },\n  { \"$2y$05$abcdefghijklmnopqrstuu\", \"$2y$05$abcdefghijklmnopqrstuuUccVOwN/r/34c2SICyLEwyfRWS4Vgja\", \"cr1234567\" },\n  { \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.8tZkJ2HTsa4Pn6bgGzpDRWJ8c1biGYu\", \"cr1234567\" },\n  { \"$2y$04$abcdefghijklmnopqrstuu\", \"$2y$04$abcdefghijklmnopqrstuuA.Ry5GZ8Ob/wI0r8UydZ6XfbyfLJ5JK\", \"cr1234567\" },\n  { \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.XyLDmzSo8jvTANPtIoCB164F84v8EkS\", \"katherine\" },\n  { \"$2y$05$abcdefghijklmnopqrstuu\", \"$2y$05$abcdefghijklmnopqrstuuOYRnTkqPmRfoAB/blXEA7y5xOBtiEg6\", \"katherine\" },\n  { \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.bsdSaZOaobkZJkNO2MxskcWIZCJ8btK\", \"katherine\" },\n  { \"$2y$04$abcdefghijklmnopqrstuu\", \"$2y$04$abcdefghijklmnopqrstuu5i6Sk8a0h8mpYFdjQZdYrEsLaxZ1EaG\", \"katherine\" },\n  { \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$05$CCCCCCCCCCCCCCCCCCCCC./cK5Kv8QvFDy9GyVbaJS/eEKlmhA6wW\", \"stephanie\" },\n  { \"$2y$05$abcdefghijklmnopqrstuu\", \"$2y$05$abcdefghijklmnopqrstuucK0uB5JOSYLNCq75/1vd9213cIwiEQi\", \"stephanie\" },\n  { \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.Yr8Btf/4dkO36VgY1VYAp6Q9B4.B/rm\", \"stephanie\" },\n  { \"$2y$04$abcdefghijklmnopqrstuu\", \"$2y$04$abcdefghijklmnopqrstuug3T9Nmp5d1Zd35nXtrYPiCSv8A6PVAu\", \"stephanie\" },\n  { \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.VYs2hleVmLTA.FbmrBwOI38C4Pd/8BS\", \"sunflower\" },\n  { \"$2y$05$abcdefghijklmnopqrstuu\", \"$2y$05$abcdefghijklmnopqrstuuY/44p2UkK4uV0kvS9KurVonsOh/oc5m\", \"sunflower\" },\n  { \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.VuKIcBGfiLx.AYuX6c48oQtlhMCQPRq\", \"sunflower\" },\n  { \"$2y$04$abcdefghijklmnopqrstuu\", \"$2y$04$abcdefghijklmnopqrstuul18yFhC69sq/WwO8ibiE1VQy773yVfu\", \"sunflower\" },\n  { \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.465.cDVHqgo4g9qBZIbQbOcdcGqRs2O\", \"basketball\" },\n  { \"$2y$05$abcdefghijklmnopqrstuu\", \"$2y$05$abcdefghijklmnopqrstuuFT2m2RbIlbhkAJBfZ3FCN3Sn3V.N4Bm\", \"basketball\" },\n  { \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.R293rqybpDGrtZIhZxApKqVLXiOJUTG\", \"basketball\" },\n  { \"$2y$04$abcdefghijklmnopqrstuu\", \"$2y$04$abcdefghijklmnopqrstuudp7.T6JYoR2jjqAKGX8kDLzPDm6RR3S\", \"basketball\" },\n  { \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.XUKWvx5JT0wYalbOFE4HU.j3lDUpDcm\", \"porsche911\" },\n  { \"$2y$05$abcdefghijklmnopqrstuu\", \"$2y$05$abcdefghijklmnopqrstuupKJ./ES4uwzJk/SsN3YaTFdl9AIiAdu\", \"porsche911\" },\n  { \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.jgOl9b/oD1cEHohzVyGK6zqcGccVRBG\", \"porsche911\" },\n  { \"$2y$04$abcdefghijklmnopqrstuu\", \"$2y$04$abcdefghijklmnopqrstuuVXo2ooNppOi53FnAHCUuZp8EyiwUoCi\", \"porsche911\" },\n  { \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.sXCEcM/a6jUtNpF7EFCOWiQRogVPxNW\", \"|_337T`/p3\" },\n  { \"$2y$05$abcdefghijklmnopqrstuu\", \"$2y$05$abcdefghijklmnopqrstuugZjL4p/g0M.xDKdvzvO1BKtO0aYdnwC\", \"|_337T`/p3\" },\n  { \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.UyHWsohI3G2oJ05vftc06k9UIwXNW4a\", \"|_337T`/p3\" },\n  { \"$2y$04$abcdefghijklmnopqrstuu\", \"$2y$04$abcdefghijklmnopqrstuuh7AZQzpU7Q7C5l4VczvD6UVfhLQVCDK\", \"|_337T`/p3\" },\n  { \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.ScdVt/vv5qxU5Weko6ZqQcaHw2EjuRG\", \"thunderbird\" },\n  { \"$2y$05$abcdefghijklmnopqrstuu\", \"$2y$05$abcdefghijklmnopqrstuuhX1c3kKr2qeB4tFvvRmDk/ta3LTQtma\", \"thunderbird\" },\n  { \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.XXuNspXmlmLMqkZ37Xt0om56PIqSupq\", \"thunderbird\" },\n  { \"$2y$04$abcdefghijklmnopqrstuu\", \"$2y$04$abcdefghijklmnopqrstuuSJB.YmarGme5IjgFBN49eRn74KS.zVC\", \"thunderbird\" },\n  { \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.z6PrHbuSsMSSwIGFy1JGevQZf6CqJ1y\", \"Hello world!\" },\n  { \"$2y$05$abcdefghijklmnopqrstuu\", \"$2y$05$abcdefghijklmnopqrstuu7nFISH/8YdwlXD3lw69A4iBUf6fvWAW\", \"Hello world!\" },\n  { \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.M.JZM2tZUe85sR83hfk5p2NZ0IVXwXe\", \"Hello world!\" },\n  { \"$2y$04$abcdefghijklmnopqrstuu\", \"$2y$04$abcdefghijklmnopqrstuuyeG8laUfZvsCmc.AE6qIDYSPGM2efmK\", \"Hello world!\" },\n  { \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.cTKgEgC.g8ePpbyZbNC34HvEm4dr75a\", \"pleaseletmein\" },\n  { \"$2y$05$abcdefghijklmnopqrstuu\", \"$2y$05$abcdefghijklmnopqrstuu2EjsH9/6E2HK9wvYowfGqPX5wGi4UDS\", \"pleaseletmein\" },\n  { \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.3WPQy/x8EhyouO1Eia.f.CS216k/lTq\", \"pleaseletmein\" },\n  { \"$2y$04$abcdefghijklmnopqrstuu\", \"$2y$04$abcdefghijklmnopqrstuumH1BFkDxi3LKCbP6FQ2juPgiLLcuV6S\", \"pleaseletmein\" },\n  { \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.UTQ/YCMF16uRDggIHAnzfTGA1GG/5.K\", \"a short string\" },\n  { \"$2y$05$abcdefghijklmnopqrstuu\", \"$2y$05$abcdefghijklmnopqrstuuZM773JiyU8IodKIqJ54EAWHzd/nJoF6\", \"a short string\" },\n  { \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.nks3nTLHIdR6yOhEvQZRsOoYVEqWOtW\", \"a short string\" },\n  { \"$2y$04$abcdefghijklmnopqrstuu\", \"$2y$04$abcdefghijklmnopqrstuu.oBhtv6clsTihZTgUKW34dikJs1Zg1y\", \"a short string\" },\n  { \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.gBXVnji0fmYJspngWLhq07sJA.unyGS\", \"zxyDPWgydbQjgq\" },\n  { \"$2y$05$abcdefghijklmnopqrstuu\", \"$2y$05$abcdefghijklmnopqrstuuGbGKxJ6BsCRT7AGpwiKNOKUzJzb5AA.\", \"zxyDPWgydbQjgq\" },\n  { \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.6vf3XUm.amMyfSlIH2P/SIU5V6p644a\", \"zxyDPWgydbQjgq\" },\n  { \"$2y$04$abcdefghijklmnopqrstuu\", \"$2y$04$abcdefghijklmnopqrstuukgPMil1AyxXOwqj9OWvu3muVwEMg1Aq\", \"zxyDPWgydbQjgq\" },\n  { \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.8TeQYvjyS9VKUlqSLz.kDaRa5v396hC\", \"photojournalism\" },\n  { \"$2y$05$abcdefghijklmnopqrstuu\", \"$2y$05$abcdefghijklmnopqrstuuhJe3S.rJQghSggwRY8.DQE1zCW18PcG\", \"photojournalism\" },\n  { \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.1h1LaJMlvaH2Defb280WzG6X/kqHQQy\", \"photojournalism\" },\n  { \"$2y$04$abcdefghijklmnopqrstuu\", \"$2y$04$abcdefghijklmnopqrstuugpKNM0gEaEfwZ43UsjoT1tNLK25mqV6\", \"photojournalism\" },\n  { \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$05$CCCCCCCCCCCCCCCCCCCCC./fog6ND8iIMkWXIpr.Y6LCOndkFsu/m\", \"ecclesiastically\" },\n  { \"$2y$05$abcdefghijklmnopqrstuu\", \"$2y$05$abcdefghijklmnopqrstuuDUj/hoyzOfsxHnlzXPdMGJybsJgbODG\", \"ecclesiastically\" },\n  { \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.AYMycNr126P8pzb9X2aVQjINCiZadp2\", \"ecclesiastically\" },\n  { \"$2y$04$abcdefghijklmnopqrstuu\", \"$2y$04$abcdefghijklmnopqrstuuOt9ERn2.X0reuqDc7blRS.5f8ttIq3a\", \"ecclesiastically\" },\n  { \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.dsZw45vJh0v/SWcvr.H79lmJF/uZKAy\", \"congregationalism\" },\n  { \"$2y$05$abcdefghijklmnopqrstuu\", \"$2y$05$abcdefghijklmnopqrstuuZu0OqjIDqSsvpAvbAqbC.8HRlYYcVkW\", \"congregationalism\" },\n  { \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.1CYpRB/IxktadiLrbTzgJ.Jd/Q06oBe\", \"congregationalism\" },\n  { \"$2y$04$abcdefghijklmnopqrstuu\", \"$2y$04$abcdefghijklmnopqrstuulau/kOpHdl7CjZgjQuvsiDAB2f/8Aqa\", \"congregationalism\" },\n  { \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.aHkGX/fiki8Qrwu3gWTRnejC9Hba52e\", \"dihydrosphingosine\" },\n  { \"$2y$05$abcdefghijklmnopqrstuu\", \"$2y$05$abcdefghijklmnopqrstuuEJAH.2Z6lOSn5WvfN87I7V1JhCPsW5y\", \"dihydrosphingosine\" },\n  { \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.8obhdpTZ2CAxc8Qbd8dIApwIFM6pzZe\", \"dihydrosphingosine\" },\n  { \"$2y$04$abcdefghijklmnopqrstuu\", \"$2y$04$abcdefghijklmnopqrstuu3tvUtVPx0FPXPsdjb7uta674As4iQfq\", \"dihydrosphingosine\" },\n  { \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.sYSxc3RiA3.WrH2ic000nunk3yqkXHa\", \"semianthropological\" },\n  { \"$2y$05$abcdefghijklmnopqrstuu\", \"$2y$05$abcdefghijklmnopqrstuuLa.VWC3vq9KMn0BrxUY.r4HUotKepnO\", \"semianthropological\" },\n  { \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.tLQTlKtJqj8kJFe92LPFDJdoiTxQ9PO\", \"semianthropological\" },\n  { \"$2y$04$abcdefghijklmnopqrstuu\", \"$2y$04$abcdefghijklmnopqrstuu6yC/otJXGOxvYDo3uRwUKNucauhdOPO\", \"semianthropological\" },\n  { \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.Kvy1q1BWf93W1T7eSLpj/6OuRO.4FqC\", \"palaeogeographically\" },\n  { \"$2y$05$abcdefghijklmnopqrstuu\", \"$2y$05$abcdefghijklmnopqrstuuYNeqeSEZQQFODdHVEfj5MJFvrZPOeF6\", \"palaeogeographically\" },\n  { \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.ybSWdRvitEQlA9I.Oq9wpqMqvBcJiti\", \"palaeogeographically\" },\n  { \"$2y$04$abcdefghijklmnopqrstuu\", \"$2y$04$abcdefghijklmnopqrstuu1POIcCAIthmV0dvj5BClL3hMpuuUctO\", \"palaeogeographically\" },\n  { \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.g7bhq.l6.ix6BSpqhW6wIRoq310s.qO\", \"electromyographically\" },\n  { \"$2y$05$abcdefghijklmnopqrstuu\", \"$2y$05$abcdefghijklmnopqrstuuFj/NgndkQJ9QWdR8vDPZF92Ql/3UYFy\", \"electromyographically\" },\n  { \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.rnGfJV5/J4BjTZj66R1dckO0Gy88d5e\", \"electromyographically\" },\n  { \"$2y$04$abcdefghijklmnopqrstuu\", \"$2y$04$abcdefghijklmnopqrstuui7gF3bPS07zaLzWARBCVakWoF70OE8K\", \"electromyographically\" },\n  { \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.fr2hBCxymAKP.MXKdQbm7/rIBEBis9y\", \"noninterchangeableness\" },\n  { \"$2y$05$abcdefghijklmnopqrstuu\", \"$2y$05$abcdefghijklmnopqrstuueL38vMSpfDTZP0TBBAuZDp0A/4eFDFa\", \"noninterchangeableness\" },\n  { \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.z1xt/vCOI.kmvN8L8t9GsafzGsOXupS\", \"noninterchangeableness\" },\n  { \"$2y$04$abcdefghijklmnopqrstuu\", \"$2y$04$abcdefghijklmnopqrstuuR1nrUOQ7HQO0AfPt3niv6JJN90IEgi2\", \"noninterchangeableness\" },\n  { \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.UwjPIUFoFVfh.JD5Z/iVMDQ/.s2BdmK\", \"abcdefghijklmnopqrstuvwxyz\" },\n  { \"$2y$05$abcdefghijklmnopqrstuu\", \"$2y$05$abcdefghijklmnopqrstuuq9gWjWvJAAO9dtIxbLejROlOtpZkAZ2\", \"abcdefghijklmnopqrstuvwxyz\" },\n  { \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.2qEx6VDzW/1gZVPz1yxtxnopI9gvYHG\", \"abcdefghijklmnopqrstuvwxyz\" },\n  { \"$2y$04$abcdefghijklmnopqrstuu\", \"$2y$04$abcdefghijklmnopqrstuucUHlaG.p8AVcD5w/eidx9TAkwV4EXAW\", \"abcdefghijklmnopqrstuvwxyz\" },\n  { \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.BdcD8qjQ3jCap/PcGpUCiau8u4PMcSy\", \"electroencephalographically\" },\n  { \"$2y$05$abcdefghijklmnopqrstuu\", \"$2y$05$abcdefghijklmnopqrstuuXDAnjJaWDI/Zcl0Om1uOs90q4mqBRWy\", \"electroencephalographically\" },\n  { \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.n1A7hL3v/hM0RBTwKl/MB.eEE0e4av2\", \"electroencephalographically\" },\n  { \"$2y$04$abcdefghijklmnopqrstuu\", \"$2y$04$abcdefghijklmnopqrstuuvcwFX7UZ8m2DKl4e6qPHdONvRVRgApi\", \"electroencephalographically\" },\n  { \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.9WsvENLhmOLqpxNHHDPzl0/i3I0QLXy\", \"antidisestablishmentarianism\" },\n  { \"$2y$05$abcdefghijklmnopqrstuu\", \"$2y$05$abcdefghijklmnopqrstuuNq0IwONJZaZ7QfLbcoA7E.G9LXdQ.8.\", \"antidisestablishmentarianism\" },\n  { \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.WM1vtlGv4CR1StKJWw9/1zvZjhQpVm2\", \"antidisestablishmentarianism\" },\n  { \"$2y$04$abcdefghijklmnopqrstuu\", \"$2y$04$abcdefghijklmnopqrstuu.Nk99xH6C1i1s687VYJkw/9TgJZwvkW\", \"antidisestablishmentarianism\" },\n  { \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.9vgB/QG0/5yJ0/eI2lb6I1NvMoYZHEi\", \"cyclotrimethylenetrinitramine\" },\n  { \"$2y$05$abcdefghijklmnopqrstuu\", \"$2y$05$abcdefghijklmnopqrstuuwOuvuEB8yOWqrtta0jWB10wzwfcx.sG\", \"cyclotrimethylenetrinitramine\" },\n  { \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.mumkbiG5cCSVfxbwD8LbcQV6CFQ3MXq\", \"cyclotrimethylenetrinitramine\" },\n  { \"$2y$04$abcdefghijklmnopqrstuu\", \"$2y$04$abcdefghijklmnopqrstuukUEvmtjkKEjAeshmrzk18VIJ5pOYI9G\", \"cyclotrimethylenetrinitramine\" },\n  { \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.ld/W//3S8PyfCs05HnX4ctiJEWzxvtu\", \"dichlorodiphenyltrichloroethane\" },\n  { \"$2y$05$abcdefghijklmnopqrstuu\", \"$2y$05$abcdefghijklmnopqrstuuJaeloUBsLGuKojqNVj.JssS.S.5SOoG\", \"dichlorodiphenyltrichloroethane\" },\n  { \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.IJ0s8nV/cDKYfTVFgirVaOoRoZvbMAW\", \"dichlorodiphenyltrichloroethane\" },\n  { \"$2y$04$abcdefghijklmnopqrstuu\", \"$2y$04$abcdefghijklmnopqrstuuQBL3QBmqpQVj0lKsVoN/yVsN7LDfMom\", \"dichlorodiphenyltrichloroethane\" },\n  { \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.qgmN7ezpNt2mv7RXpV9nwxAwSRHe8Z6\", \"multiple words seperated by spaces\" },\n  { \"$2y$05$abcdefghijklmnopqrstuu\", \"$2y$05$abcdefghijklmnopqrstuuUyj6XHAnIT7HIUaHPt/mAqWbLOZ95oW\", \"multiple words seperated by spaces\" },\n  { \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.ya4OMfax14JgLKjCeRnok41QNmDHk.6\", \"multiple words seperated by spaces\" },\n  { \"$2y$04$abcdefghijklmnopqrstuu\", \"$2y$04$abcdefghijklmnopqrstuurps.S9nvQl/40RApzaFs9lIt3AMcneK\", \"multiple words seperated by spaces\" },\n  { \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.2CHByRiD9EoV4pN2mhPq49ZZhIg5K/.\", \"supercalifragilisticexpialidocious\" },\n  { \"$2y$05$abcdefghijklmnopqrstuu\", \"$2y$05$abcdefghijklmnopqrstuuchc4Fu0voJQx93SMHFKQgbDXESzxUai\", \"supercalifragilisticexpialidocious\" },\n  { \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.mqD8IRcEmTxZ.ChOQZyLHygiTWmqvk2\", \"supercalifragilisticexpialidocious\" },\n  { \"$2y$04$abcdefghijklmnopqrstuu\", \"$2y$04$abcdefghijklmnopqrstuuG9j0r2T6lEIX9LVt3txW9dZuFY0Ew1q\", \"supercalifragilisticexpialidocious\" },\n  { \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.pr..QUPolGyX.oqq.qgP8kNIbwX1YlC\", \"we have a short salt string but not a short password\" },\n  { \"$2y$05$abcdefghijklmnopqrstuu\", \"$2y$05$abcdefghijklmnopqrstuuwLVtPJcEI87Gw5SVMgJ3jR.jz4FXA3C\", \"we have a short salt string but not a short password\" },\n  { \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.S693iU5aWL1P1CiTvv4sKd4VtqEefpm\", \"we have a short salt string but not a short password\" },\n  { \"$2y$04$abcdefghijklmnopqrstuu\", \"$2y$04$abcdefghijklmnopqrstuus8h4uV7ZQW6KJvz2prsjqaySAO/1k2e\", \"we have a short salt string but not a short password\" },\n  { \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.VkOUUuotOZvrmtXJpkTGsRR7av5It52\", \"multiple word$ $eperated by $pace$ and $pecial character$\" },\n  { \"$2y$05$abcdefghijklmnopqrstuu\", \"$2y$05$abcdefghijklmnopqrstuuT837gAqiU/1zYnau8zpkZMploUCluwS\", \"multiple word$ $eperated by $pace$ and $pecial character$\" },\n  { \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.iNDvHP9V2K7P.xzMWcBO.ucnS87zUrq\", \"multiple word$ $eperated by $pace$ and $pecial character$\" },\n  { \"$2y$04$abcdefghijklmnopqrstuu\", \"$2y$04$abcdefghijklmnopqrstuu5RYaD3UZMA62Bfinm5QndpfWzruwF.O\", \"multiple word$ $eperated by $pace$ and $pecial character$\" },\n  { \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.8b67df7RZ0XnI62umy35MYpe4K51Fk2\", \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\" },\n  { \"$2y$05$abcdefghijklmnopqrstuu\", \"$2y$05$abcdefghijklmnopqrstuuW5igozlL8rSr/rkFexuDh1grrkW8FSi\", \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\" },\n  { \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.F3K5wiwHej.p9lTXgX9bOlrEyWKv066\", \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\" },\n  { \"$2y$04$abcdefghijklmnopqrstuu\", \"$2y$04$abcdefghijklmnopqrstuuViu5c2UpaacAGAhQuLE2zyrV3jz4b5e\", \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\" },\n  { \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.Td/f8oS7ISMxGfHYB8YP9rXGhoZDosO\", \"12345678901234567890123456789012345678901234567890123456789012345678901234567890\" },\n  { \"$2y$05$abcdefghijklmnopqrstuu\", \"$2y$05$abcdefghijklmnopqrstuuxuElans2nYY6zVSN13XYHtA0oeOXZLa\", \"12345678901234567890123456789012345678901234567890123456789012345678901234567890\" },\n  { \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.kLVEehyg8LFsXfIVuFyGfLj4dvN7a4e\", \"12345678901234567890123456789012345678901234567890123456789012345678901234567890\" },\n  { \"$2y$04$abcdefghijklmnopqrstuu\", \"$2y$04$abcdefghijklmnopqrstuuMNSliUjQvcDZoWAZHm/hAG9Z3ZRf5wy\", \"12345678901234567890123456789012345678901234567890123456789012345678901234567890\" },\n  { \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.4aisLqC2w3pT8aeXd3SHZFJkWSCkf0a\", \"a very much longer text to encrypt.  This one even stretches over morethan one line.\" },\n  { \"$2y$05$abcdefghijklmnopqrstuu\", \"$2y$05$abcdefghijklmnopqrstuuoBz.G9gMNiZlW/Gsj.oKhiomPeIRFTC\", \"a very much longer text to encrypt.  This one even stretches over morethan one line.\" },\n  { \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.9c/KG5wY7kGTdky/Js0KWIpuVuJFUJG\", \"a very much longer text to encrypt.  This one even stretches over morethan one line.\" },\n  { \"$2y$04$abcdefghijklmnopqrstuu\", \"$2y$04$abcdefghijklmnopqrstuuinRgQYMZk.yuMIssG.kPPL6i9WP0xFa\", \"a very much longer text to encrypt.  This one even stretches over morethan one line.\" },\n  { \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.heAts1y/8kcTTP0/vD3yeuMX1ihF8dO\", \"\\xd0\\xc1\\xd2\\xcf\\xcc\\xd8\" },\n  { \"$2y$05$abcdefghijklmnopqrstuu\", \"$2y$05$abcdefghijklmnopqrstuuTp1b9XCEV16BcrQ.0k4xf7V/OGPZLnK\", \"\\xd0\\xc1\\xd2\\xcf\\xcc\\xd8\" },\n  { \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.A96emG/jBf0K1K6vCG.eZGdLkSridom\", \"\\xd0\\xc1\\xd2\\xcf\\xcc\\xd8\" },\n  { \"$2y$04$abcdefghijklmnopqrstuu\", \"$2y$04$abcdefghijklmnopqrstuuoaE0x.b2rUEITWgPdg.GEcU4ePHLh6m\", \"\\xd0\\xc1\\xd2\\xcf\\xcc\\xd8\" },\n  { \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.qJn4AY9ch/WAR5JXeeJtVGeovjQrhd2\", \"\\xd5\\xaa\\xd5\\xaa\\xaa\\xaa\\xd5\\xaa\" },\n  { \"$2y$05$abcdefghijklmnopqrstuu\", \"$2y$05$abcdefghijklmnopqrstuuiYbzuFNFwSfCgqTGNsUFtSDh8PJAqSe\", \"\\xd5\\xaa\\xd5\\xaa\\xaa\\xaa\\xd5\\xaa\" },\n  { \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.h0JFRyDXfP0duxAkVxWGr8nMDEDvPca\", \"\\xd5\\xaa\\xd5\\xaa\\xaa\\xaa\\xd5\\xaa\" },\n  { \"$2y$04$abcdefghijklmnopqrstuu\", \"$2y$04$abcdefghijklmnopqrstuuw8RVl3rh7sNazq544l0944qGq4GUFUq\", \"\\xd5\\xaa\\xd5\\xaa\\xaa\\xaa\\xd5\\xaa\" },\n  { \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.FZEYKXyyMgG13MK0uV8dwNotWf4Wm6e\", \"\\xe1\\xec\\xe5\\xf8\\xe1\\xee\\xe4\\xe5\\xf2\" },\n  { \"$2y$05$abcdefghijklmnopqrstuu\", \"$2y$05$abcdefghijklmnopqrstuuK2KXzhsMefB8v6hJJG3bOyKV.XRf6Qe\", \"\\xe1\\xec\\xe5\\xf8\\xe1\\xee\\xe4\\xe5\\xf2\" },\n  { \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.I7vjUzDOKf8XqcK8VSCm9b0bwoSm1Qm\", \"\\xe1\\xec\\xe5\\xf8\\xe1\\xee\\xe4\\xe5\\xf2\" },\n  { \"$2y$04$abcdefghijklmnopqrstuu\", \"$2y$04$abcdefghijklmnopqrstuuhWYb0x3Q3zM0aBkB2G1arbzmWxRQS/i\", \"\\xe1\\xec\\xe5\\xf8\\xe1\\xee\\xe4\\xe5\\xf2\" },\n  { \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.HD8RnTmGEavoR3LFVfdHvh3xA0QPka2\", \"\\xf3\\xf4\\xe5\\xf0\\xe8\\xe1\\xee\\xe9\\xe5\" },\n  { \"$2y$05$abcdefghijklmnopqrstuu\", \"$2y$05$abcdefghijklmnopqrstuuSRMKxjeMqVSDMhSLhOnvtEZ/p5KhUbq\", \"\\xf3\\xf4\\xe5\\xf0\\xe8\\xe1\\xee\\xe9\\xe5\" },\n  { \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.zQPVIDk6wF8XmESji30KDHFabTlu0WK\", \"\\xf3\\xf4\\xe5\\xf0\\xe8\\xe1\\xee\\xe9\\xe5\" },\n  { \"$2y$04$abcdefghijklmnopqrstuu\", \"$2y$04$abcdefghijklmnopqrstuuk9Hv17Gha84losGKAq61csCZokj5pyy\", \"\\xf3\\xf4\\xe5\\xf0\\xe8\\xe1\\xee\\xe9\\xe5\" },\n  { \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.PYLCOpTKZmhFn1CoBM2XNbWgqMX4Jk2\", \"\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\" },\n  { \"$2y$05$abcdefghijklmnopqrstuu\", \"$2y$05$abcdefghijklmnopqrstuuUTFLPGm29p.YVzcY6pqejGEql1x8Ccq\", \"\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\" },\n  { \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.PQInhDOdCKnXeUE.n/L.kQmTKM9ldK2\", \"\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\" },\n  { \"$2y$04$abcdefghijklmnopqrstuu\", \"$2y$04$abcdefghijklmnopqrstuugI4g/1M6K/Sz2bsgu9VDeEl6reszuXa\", \"\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\" },\n  { \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.uIZ1Lgb.jHRDU/Z/LVXfpQCK72fTEHq\", \"\\xc3\\xa9tude\" },\n  { \"$2y$05$abcdefghijklmnopqrstuu\", \"$2y$05$abcdefghijklmnopqrstuuYdPam5/ypFIyDUQMyCCEIwzVsTi0Sa6\", \"\\xc3\\xa9tude\" },\n  { \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.TszY8.avBpwJ6xbNjwws3SKBbK6kj6S\", \"\\xc3\\xa9tude\" },\n  { \"$2y$04$abcdefghijklmnopqrstuu\", \"$2y$04$abcdefghijklmnopqrstuu3wn02pxRJPnFwvlGt75DURDbt4g7om.\", \"\\xc3\\xa9tude\" },\n  { \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.qcYQ0c2j2SvETms11hszz5bnbvNhN0G\", \"C)tude\" },\n  { \"$2y$05$abcdefghijklmnopqrstuu\", \"$2y$05$abcdefghijklmnopqrstuuo170FGVreUKlJWzQl8GcfhpghDIp2c.\", \"C)tude\" },\n  { \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.2iSSZ5gtiVxKz8BdAoDV9IxZl3LAH7y\", \"C)tude\" },\n  { \"$2y$04$abcdefghijklmnopqrstuu\", \"$2y$04$abcdefghijklmnopqrstuutA7.Ir5GREoOf.twyI.Zoy.dI1gNHfC\", \"C)tude\" },\n  { \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.tLCLEXAt3RUjOgs.yvfWSni4j1JX/JS\", \"Chl\\xc3\\xb6\"\"e\" },\n  { \"$2y$05$abcdefghijklmnopqrstuu\", \"$2y$05$abcdefghijklmnopqrstuuz4QFggBRTVUeHRGL/CQxlAYHraYPcpa\", \"Chl\\xc3\\xb6\"\"e\" },\n  { \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.KHsCqMFVxOAGJObHwEBR3JaEdKVu1.m\", \"Chl\\xc3\\xb6\"\"e\" },\n  { \"$2y$04$abcdefghijklmnopqrstuu\", \"$2y$04$abcdefghijklmnopqrstuuG6PeIXKiqeNUPUbqFkMJvvI7G9hd51W\", \"Chl\\xc3\\xb6\"\"e\" },\n  { \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.w.V.mBIadppiKKxZ0OzpXn86NOk43pC\", \"ChlC6e\" },\n  { \"$2y$05$abcdefghijklmnopqrstuu\", \"$2y$05$abcdefghijklmnopqrstuuQ2qgoto47/GjSmc6truiPxHNSL1jAfS\", \"ChlC6e\" },\n  { \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.r7GLvyVWQLuQaOTYsrMOBkbLfy8sPIi\", \"ChlC6e\" },\n  { \"$2y$04$abcdefghijklmnopqrstuu\", \"$2y$04$abcdefghijklmnopqrstuueolw0UBEFN.qCtReAkwiO7BAjrY4CX6\", \"ChlC6e\" },\n  { \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.UPBzTBMwJb5mKWflQ.5Rid4481RrxVy\", \"\\xc3\\x85ngstr\\xc3\\xb6m\" },\n  { \"$2y$05$abcdefghijklmnopqrstuu\", \"$2y$05$abcdefghijklmnopqrstuuCARhc7ugFdgoPjDb7LUG.yQF2lboK6e\", \"\\xc3\\x85ngstr\\xc3\\xb6m\" },\n  { \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.ZHZAnvydiPNiYH2VjRNhEAD6BEiyaWS\", \"\\xc3\\x85ngstr\\xc3\\xb6m\" },\n  { \"$2y$04$abcdefghijklmnopqrstuu\", \"$2y$04$abcdefghijklmnopqrstuu2WegkGS5Xr/qYNkfEi6JmnR16WVSwcW\", \"\\xc3\\x85ngstr\\xc3\\xb6m\" },\n  { \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.gx7D73FxK1lx9aoctuj3fhNJqC.IYc6\", \"C\\x05ngstrC6m\" },\n  { \"$2y$05$abcdefghijklmnopqrstuu\", \"$2y$05$abcdefghijklmnopqrstuusSqmEHNEXYcUAamAuvd.piiJP2/SvW6\", \"C\\x05ngstrC6m\" },\n  { \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.pjA09E/vp0VG8cavv0kgRuMJNPJRdqS\", \"C\\x05ngstrC6m\" },\n  { \"$2y$04$abcdefghijklmnopqrstuu\", \"$2y$04$abcdefghijklmnopqrstuuEFW231TUkQA55cajdiwh2GQXkKY7v4.\", \"C\\x05ngstrC6m\" },\n  { \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.OVB6qjs7Uzos9N7/Rpm1laBHwGw11u.\", \"C\\x05ngstrCU*U***U*\" },\n  { \"$2y$05$abcdefghijklmnopqrstuu\", \"$2y$05$abcdefghijklmnopqrstuuAEHJsqoIo5645CuTbmM6VobcvFM6pxK\", \"C\\x05ngstrCU*U***U*\" },\n  { \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.E/ZiYei4bcJNCJEyI148Q1.aMAOn66e\", \"C\\x05ngstrCU*U***U*\" },\n  { \"$2y$04$abcdefghijklmnopqrstuu\", \"$2y$04$abcdefghijklmnopqrstuumAqJP8MYx4tSoKoE9d0vR0QW81bYuSC\", \"C\\x05ngstrCU*U***U*\" },\n  { \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.84ASbYYPYkl18.t0.TvQbm0oh98TFvG\", \"U*U***U*ignored\" },\n  { \"$2y$05$abcdefghijklmnopqrstuu\", \"$2y$05$abcdefghijklmnopqrstuuR.W0Ohu3KxpPUfr5Knw07yOOzZkdd7.\", \"U*U***U*ignored\" },\n  { \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.wx4V3qBoGl7ej9kbsoEpQTxmptzY0yq\", \"U*U***U*ignored\" },\n  { \"$2y$04$abcdefghijklmnopqrstuu\", \"$2y$04$abcdefghijklmnopqrstuu4SS72T2y2mc0YsQSe9qECdkPhGVslHS\", \"U*U***U*ignored\" },\n  { \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.ebmmSqlfcFhKGN/743nH7i03zpqftle\", \"U*U*U*U*\" },\n  { \"$2y$05$abcdefghijklmnopqrstuu\", \"$2y$05$abcdefghijklmnopqrstuuF1QNFce4DfYnYJUcafR1v2/7XbWeLjK\", \"U*U*U*U*\" },\n  { \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.5KIIW3tGg2xhhVu/AQXLZX9lSSeeehu\", \"U*U*U*U*\" },\n  { \"$2y$04$abcdefghijklmnopqrstuu\", \"$2y$04$abcdefghijklmnopqrstuudBYNJEBvC10idL3LIvyzUGdaxqz0jJW\", \"U*U*U*U*\" },\n  { \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.htnOkHgQ8LrcyWv4cQVE5Bt0DiVxJzG\", \"U*U*U*U*ignored\" },\n  { \"$2y$05$abcdefghijklmnopqrstuu\", \"$2y$05$abcdefghijklmnopqrstuu1JJvN7RoX92Zzq1yGezl/5/3vlXyrxi\", \"U*U*U*U*ignored\" },\n  { \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.7YCBkroPI7yK9JGre8Hne5hdwmA6Z3S\", \"U*U*U*U*ignored\" },\n  { \"$2y$04$abcdefghijklmnopqrstuu\", \"$2y$04$abcdefghijklmnopqrstuuc1KKQsfk4nXu9CnvuF/SfMwrmif7tsC\", \"U*U*U*U*ignored\" },\n  { \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.DzSBCMqe17IfGIqEfq.FrxykxqtrVi2\", \"*U*U*U*U\" },\n  { \"$2y$05$abcdefghijklmnopqrstuu\", \"$2y$05$abcdefghijklmnopqrstuuuzPVVNB/SAKLJbAoTgm3qolIt8JCyqG\", \"*U*U*U*U\" },\n  { \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.1fL1/3fOtt1usdRoe0dWgjAUT/TMd76\", \"*U*U*U*U\" },\n  { \"$2y$04$abcdefghijklmnopqrstuu\", \"$2y$04$abcdefghijklmnopqrstuu39YJ8HbI96dgaVWEUkKUCgXR4676Qjq\", \"*U*U*U*U\" },\n  { \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.yu/PNF5atjbvgp2r9GyRzSYOErUPNHq\", \"*U*U*U*U*\" },\n  { \"$2y$05$abcdefghijklmnopqrstuu\", \"$2y$05$abcdefghijklmnopqrstuuZu/4jl7FZnNPiPunsfxbXLTBcZ4XPMe\", \"*U*U*U*U*\" },\n  { \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.YT6TwplC9qsDdIyZ4nZ.2STP1srJcv.\", \"*U*U*U*U*\" },\n  { \"$2y$04$abcdefghijklmnopqrstuu\", \"$2y$04$abcdefghijklmnopqrstuuQ6t3zlOYOUrJSlX7AdtXuuWd0hDhQiC\", \"*U*U*U*U*\" },\n  { \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.7Cc1PePc3H0bDi8khYlhX6PVDNBB0QK\", \"*U*U*U*U*U*U*U*U\" },\n  { \"$2y$05$abcdefghijklmnopqrstuu\", \"$2y$05$abcdefghijklmnopqrstuuwd22F2Sxe6gq2OS.jcQfMBY2dJtwKyS\", \"*U*U*U*U*U*U*U*U\" },\n  { \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.AYh0eQgGLbt9qiP1jMH9.zHrUuVNY5.\", \"*U*U*U*U*U*U*U*U\" },\n  { \"$2y$04$abcdefghijklmnopqrstuu\", \"$2y$04$abcdefghijklmnopqrstuui4ZHqA63Ft09xDrL31aaZvJ3RjuITQq\", \"*U*U*U*U*U*U*U*U\" },\n  { \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.jlPoM5ioW.OQLW.5JcdEmo4HtRjF876\", \"*U*U*U*U*U*U*U*U*\" },\n  { \"$2y$05$abcdefghijklmnopqrstuu\", \"$2y$05$abcdefghijklmnopqrstuuz3ESgmDkKJlK0Nuq2.ylqgmDHlpC38q\", \"*U*U*U*U*U*U*U*U*\" },\n  { \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.scf6.mexwrzCAGi3ShQ8cYkynqeH0bK\", \"*U*U*U*U*U*U*U*U*\" },\n  { \"$2y$04$abcdefghijklmnopqrstuu\", \"$2y$04$abcdefghijklmnopqrstuuQLykgCNxKyLhRD0HXzLibuZLZfiGOEO\", \"*U*U*U*U*U*U*U*U*\" },\n  { \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.BvtRGGx3p8o0C5C36uS442Qqnrwofrq\", \"\\xa3\" },\n  { \"$2y$05$abcdefghijklmnopqrstuu\", \"$2y$05$abcdefghijklmnopqrstuuEuEnx.TyCLYgkTV/uhWL5xJTHV7ZMjG\", \"\\xa3\" },\n  { \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.nCdKcLO57oLlc6J6sNnGyfT9FrIawiW\", \"\\xa3\" },\n  { \"$2y$04$abcdefghijklmnopqrstuu\", \"$2y$04$abcdefghijklmnopqrstuurz1efvzeJjL4mQ813hrZNg3p1.ivOii\", \"\\xa3\" },\n  { \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.k786rdsOdUP4cRi.dLa3dsYueMj5UnS\", \"\\xa3\"\"a\" },\n  { \"$2y$05$abcdefghijklmnopqrstuu\", \"$2y$05$abcdefghijklmnopqrstuuLN/CEHXLfFeYdOOxbdxKu8ZqSIKgqAu\", \"\\xa3\"\"a\" },\n  { \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.4QrucGf30zIbQA.sO0d1QrU63xBrEYq\", \"\\xa3\"\"a\" },\n  { \"$2y$04$abcdefghijklmnopqrstuu\", \"$2y$04$abcdefghijklmnopqrstuugbhoNOH4mWxoEhRrQNdeI.rpk9XeuZS\", \"\\xa3\"\"a\" },\n  { \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.1qOUgfpg30XDHLx/zrbWiMRcWyFhwye\", \"\\xd1\\x91\" },\n  { \"$2y$05$abcdefghijklmnopqrstuu\", \"$2y$05$abcdefghijklmnopqrstuus6h1E6A2RzVn2KxXLQXsKosQeRo8bLa\", \"\\xd1\\x91\" },\n  { \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.7UwHe/ywPmdp.nr.ZLQSxd8hqn7qURW\", \"\\xd1\\x91\" },\n  { \"$2y$04$abcdefghijklmnopqrstuu\", \"$2y$04$abcdefghijklmnopqrstuuSqNATdQiNEckAKLsqgsKbAM5.hZoMCq\", \"\\xd1\\x91\" },\n  { \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.bJFOmj3TaByM10X0BF32w0Fv/xFNSvm\", \"\\xa3\"\"ab\" },\n  { \"$2y$05$abcdefghijklmnopqrstuu\", \"$2y$05$abcdefghijklmnopqrstuuojaU9K.vmSlY6BHpgIQ/WY9rEOCcJO2\", \"\\xa3\"\"ab\" },\n  { \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.0EeTSP42yLfD7uTTcDffPd2CNLKHdoy\", \"\\xa3\"\"ab\" },\n  { \"$2y$04$abcdefghijklmnopqrstuu\", \"$2y$04$abcdefghijklmnopqrstuuikYh/9nIvugTp.kFPFeZDBu7eW6BLoa\", \"\\xa3\"\"ab\" },\n  { \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.Qjdj3GXX7D0sFE9jji6wxSTWIhqI3US\", \"\\xff\\xff\\xa3\" },\n  { \"$2y$05$abcdefghijklmnopqrstuu\", \"$2y$05$abcdefghijklmnopqrstuuHdhhdUXVgLADnbTYf12kvsasO1gS51C\", \"\\xff\\xff\\xa3\" },\n  { \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.PIeeyENZVZmrKLAq5lwBUU9fMRVfV2m\", \"\\xff\\xff\\xa3\" },\n  { \"$2y$04$abcdefghijklmnopqrstuu\", \"$2y$04$abcdefghijklmnopqrstuuMOaOTHB4gEm.rriBjXNwBNh.Oc4mKGG\", \"\\xff\\xff\\xa3\" },\n  { \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.RbKkfW2ph8bd8B5yul5E97DxgDw9cT.\", \"1\\xa3\"\"345\" },\n  { \"$2y$05$abcdefghijklmnopqrstuu\", \"$2y$05$abcdefghijklmnopqrstuurPSVExmrZ2WB1xntSbqZ/DRQRlKtVw.\", \"1\\xa3\"\"345\" },\n  { \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.XEhidoDX1kz.RFnwWIzMJvtW2aP/k4e\", \"1\\xa3\"\"345\" },\n  { \"$2y$04$abcdefghijklmnopqrstuu\", \"$2y$04$abcdefghijklmnopqrstuuXl2V4mQ7s0zX0b4XXH/b9UkRRCWpq3e\", \"1\\xa3\"\"345\" },\n  { \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.WI7ZNXFtzCd9mN1mWoNMQRHEmkDsZnm\", \"\\xff\\xa3\"\"345\" },\n  { \"$2y$05$abcdefghijklmnopqrstuu\", \"$2y$05$abcdefghijklmnopqrstuu6WgD2zYQDPgxR2sXlUeEeGKknxt95W.\", \"\\xff\\xa3\"\"345\" },\n  { \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.KBv1eBM2he2T/QheS8zPHMejn5fMNRe\", \"\\xff\\xa3\"\"345\" },\n  { \"$2y$04$abcdefghijklmnopqrstuu\", \"$2y$04$abcdefghijklmnopqrstuuUIzecIiCguM2sPh1F7L9IS3zOtmg5Im\", \"\\xff\\xa3\"\"345\" },\n  { \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.VmFQpoXeVuKTzkg2ZRsAf.8PZJZg142\", \"\\xff\\xa3\"\"34\\xff\\xff\\xff\\xa3\"\"345\" },\n  { \"$2y$05$abcdefghijklmnopqrstuu\", \"$2y$05$abcdefghijklmnopqrstuucaGU5ROXj4M8Tgsx3s/D5BQIuhazIWa\", \"\\xff\\xa3\"\"34\\xff\\xff\\xff\\xa3\"\"345\" },\n  { \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.8jdeg8QqT4CX3ERA9vZPFZAkxZRpxJW\", \"\\xff\\xa3\"\"34\\xff\\xff\\xff\\xa3\"\"345\" },\n  { \"$2y$04$abcdefghijklmnopqrstuu\", \"$2y$04$abcdefghijklmnopqrstuu9f4sA9SRA0scUKcRyC5kce8dao2.GKe\", \"\\xff\\xa3\"\"34\\xff\\xff\\xff\\xa3\"\"345\" },\n  { \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.xGPMyJSPyyeICKolPQ2gecm8rOgHwz.\", \"U\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xff\" },\n  { \"$2y$05$abcdefghijklmnopqrstuu\", \"$2y$05$abcdefghijklmnopqrstuuuTNb9MEHVGI7kd6UnQjYxgRNiKJM01S\", \"U\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xff\" },\n  { \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.k.qekGiJym3QgfeFCwNhPHg0Zk99KSa\", \"U\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xff\" },\n  { \"$2y$04$abcdefghijklmnopqrstuu\", \"$2y$04$abcdefghijklmnopqrstuuyM59Cq5iVZDB3u45gTNhRSnOgrY1tdG\", \"U\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xff\" },\n  { \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.VAQY6kySmwStlNY.sut9Y87njVr0mm.\", \"\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\" },\n  { \"$2y$05$abcdefghijklmnopqrstuu\", \"$2y$05$abcdefghijklmnopqrstuuPPtdI0NcxZ4Txyv/Y5ORfcP1XFriKT2\", \"\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\" },\n  { \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.tHwehGUs3q0b/Ejn42MsoM4Yv/iA1rq\", \"\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\" },\n  { \"$2y$04$abcdefghijklmnopqrstuu\", \"$2y$04$abcdefghijklmnopqrstuu3cFqlEl7Y0HWaVLHpyyCqG8dBNk1DSm\", \"\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\" },\n  { \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.n2VnrmAaokJwiDSekcCjbZxRIyVngRy\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\" },\n  { \"$2y$05$abcdefghijklmnopqrstuu\", \"$2y$05$abcdefghijklmnopqrstuu5s2v8.iXieOjg/.AySBTTZIIVFJeBui\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\" },\n  { \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.0ZsAfF0DsSCOCcfZKxtwXxkV4RFYBVG\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\" },\n  { \"$2y$04$abcdefghijklmnopqrstuu\", \"$2y$04$abcdefghijklmnopqrstuuRAip/W0RPQX4QKkqYqXE3GIXWH518Sm\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\" },\n  { \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.n2VnrmAaokJwiDSekcCjbZxRIyVngRy\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789chars after 72 are ignored\" },\n  { \"$2y$05$abcdefghijklmnopqrstuu\", \"$2y$05$abcdefghijklmnopqrstuu5s2v8.iXieOjg/.AySBTTZIIVFJeBui\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789chars after 72 are ignored\" },\n  { \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.0ZsAfF0DsSCOCcfZKxtwXxkV4RFYBVG\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789chars after 72 are ignored\" },\n  { \"$2y$04$abcdefghijklmnopqrstuu\", \"$2y$04$abcdefghijklmnopqrstuuRAip/W0RPQX4QKkqYqXE3GIXWH518Sm\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789chars after 72 are ignored\" },\n  { \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.ZkQGqjbMpqQ9oCsxNZjN8LQJaHFqPMC\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\" },\n  { \"$2y$05$abcdefghijklmnopqrstuu\", \"$2y$05$abcdefghijklmnopqrstuu51cV.PJOQVwmiao4t4lXsb9Cc3Jnuem\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\" },\n  { \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.DQjlTXDA5PBQ97.qBJY/vsHPQhLJDMe\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\" },\n  { \"$2y$04$abcdefghijklmnopqrstuu\", \"$2y$04$abcdefghijklmnopqrstuuAqM0XavJxJXeVlJ3Te3umGJaPOCYmZi\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\" },\n  { \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.ZkQGqjbMpqQ9oCsxNZjN8LQJaHFqPMC\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\"\"chars after 72 are ignored as usual\" },\n  { \"$2y$05$abcdefghijklmnopqrstuu\", \"$2y$05$abcdefghijklmnopqrstuu51cV.PJOQVwmiao4t4lXsb9Cc3Jnuem\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\"\"chars after 72 are ignored as usual\" },\n  { \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.DQjlTXDA5PBQ97.qBJY/vsHPQhLJDMe\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\"\"chars after 72 are ignored as usual\" },\n  { \"$2y$04$abcdefghijklmnopqrstuu\", \"$2y$04$abcdefghijklmnopqrstuuAqM0XavJxJXeVlJ3Te3umGJaPOCYmZi\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\"\"chars after 72 are ignored as usual\" },\n  { \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.RURfiuM5wAc5Jv4SO604mh/l3NurIoq\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has forgotten.\" },\n  { \"$2y$05$abcdefghijklmnopqrstuu\", \"$2y$05$abcdefghijklmnopqrstuu6v4sW.Jh71LP6RHjCG1iTdKjHpi8Az2\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has forgotten.\" },\n  { \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.NNYMcLQ7lIauYt0h6mWJtoSyBZqwBwi\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has forgotten.\" },\n  { \"$2y$04$abcdefghijklmnopqrstuu\", \"$2y$04$abcdefghijklmnopqrstuuZgFC0hc.gvORKBIExxdbXTGVmt0vRFW\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has forgotten.\" },\n  { \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.uB1no1bSvQlNFbG6DThB52xIhyG9z8G\", \"THE YEAR\" },\n  { \"$2y$05$abcdefghijklmnopqrstuu\", \"$2y$05$abcdefghijklmnopqrstuuySE45JP/avbudkXbPzjvqTBKf61NNfi\", \"THE YEAR\" },\n  { \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.c/NBil2GQ9h1axG3uDE7cen7O1yt4wu\", \"THE YEAR\" },\n  { \"$2y$04$abcdefghijklmnopqrstuu\", \"$2y$04$abcdefghijklmnopqrstuuT4fz1ym9dcyOwa1hMmFJSuk4yISb03.\", \"THE YEAR\" },\n  { \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.RURfiuM5wAc5Jv4SO604mh/l3NurIoq\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and do\" },\n  { \"$2y$05$abcdefghijklmnopqrstuu\", \"$2y$05$abcdefghijklmnopqrstuu6v4sW.Jh71LP6RHjCG1iTdKjHpi8Az2\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and do\" },\n  { \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.NNYMcLQ7lIauYt0h6mWJtoSyBZqwBwi\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and do\" },\n  { \"$2y$04$abcdefghijklmnopqrstuu\", \"$2y$04$abcdefghijklmnopqrstuuZgFC0hc.gvORKBIExxdbXTGVmt0vRFW\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and do\" },\n  { \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$05$CCCCCCCCCCCCCCCCCCCCC.RURfiuM5wAc5Jv4SO604mh/l3NurIoq\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has f\" },\n  { \"$2y$05$abcdefghijklmnopqrstuu\", \"$2y$05$abcdefghijklmnopqrstuu6v4sW.Jh71LP6RHjCG1iTdKjHpi8Az2\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has f\" },\n  { \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2y$04$CCCCCCCCCCCCCCCCCCCCC.NNYMcLQ7lIauYt0h6mWJtoSyBZqwBwi\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has f\" },\n  { \"$2y$04$abcdefghijklmnopqrstuu\", \"$2y$04$abcdefghijklmnopqrstuuZgFC0hc.gvORKBIExxdbXTGVmt0vRFW\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has f\" },\n#endif // bcrypt_y\n\n#if INCLUDE_bcrypt_a && defined TEST_bcrypt_a\n  { \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.7uG0VCzI2bS7j6ymqJi9CdcdxiRTWNy\", \"\" },\n  { \"$2a$05$abcdefghijklmnopqrstuu\", \"$2a$05$abcdefghijklmnopqrstuu0oImNDIy4flhldV9YqunRgBAePKmw7m\", \"\" },\n  { \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.Cg0ly9t/KVBCBYYDfOmZKwry9JuXClC\", \"\" },\n  { \"$2a$04$abcdefghijklmnopqrstuu\", \"$2a$04$abcdefghijklmnopqrstuubyCG3zY1GIXMyxfivm.ClDiInHzxjiq\", \"\" },\n  { \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.REUe.wVCLEE7cNcWpheIXR9MaRPCoVC\", \" \" },\n  { \"$2a$05$abcdefghijklmnopqrstuu\", \"$2a$05$abcdefghijklmnopqrstuueHjTs35M4oLkB0oz2vpFCrkqmB3wDyK\", \" \" },\n  { \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.QK3io8Pm4WhsBSZhzvm1OPPQ1MU.WxC\", \" \" },\n  { \"$2a$04$abcdefghijklmnopqrstuu\", \"$2a$04$abcdefghijklmnopqrstuu/ied6LYDv4Nek.n8vXq7pbx7mJcRizO\", \" \" },\n  { \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.crbyEJ0XFaJ9sONRyOTHdI7c4ZT.ndu\", \"a\" },\n  { \"$2a$05$abcdefghijklmnopqrstuu\", \"$2a$05$abcdefghijklmnopqrstuu8.veTXNDPV2eEsdpKNczMw2otgh5LnK\", \"a\" },\n  { \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.f/Fm9DOYGp2ai9rjxvG4QHlhtDCuDuu\", \"a\" },\n  { \"$2a$04$abcdefghijklmnopqrstuu\", \"$2a$04$abcdefghijklmnopqrstuuMFdJu9yVgmagVAIC24fOZkaFqd3s9JC\", \"a\" },\n  { \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.w5.fxtwCNbJ3swM5YKT2SoO0YcCOkhS\", \"ab\" },\n  { \"$2a$05$abcdefghijklmnopqrstuu\", \"$2a$05$abcdefghijklmnopqrstuu0EJam7uq2UHswNA05epRm6fJdiFmbUi\", \"ab\" },\n  { \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.ThcCpjPKXmu6XgQqJJEGokAiEUquQVe\", \"ab\" },\n  { \"$2a$04$abcdefghijklmnopqrstuu\", \"$2a$04$abcdefghijklmnopqrstuu0CkeIeZLJOlOL1QPPhfXulLNPdFqJBW\", \"ab\" },\n  { \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.gNn9EDJdrUJF53AHnb.4T9BCvqhUYdW\", \"abc\" },\n  { \"$2a$05$abcdefghijklmnopqrstuu\", \"$2a$05$abcdefghijklmnopqrstuuRWUgMyyCUnsDr8evYotXg5ZXVF/HhzS\", \"abc\" },\n  { \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.AKurti2nSiRoaXd0tyyeWA.1jj9Kto2\", \"abc\" },\n  { \"$2a$04$abcdefghijklmnopqrstuu\", \"$2a$04$abcdefghijklmnopqrstuuCi15uRb1eH7NAlJ/TgeJertyknQpYn2\", \"abc\" },\n  { \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.E5YPO9kmyuRGyh0XouQYb4YMJKvyOeW\", \"U*U\" },\n  { \"$2a$05$abcdefghijklmnopqrstuu\", \"$2a$05$abcdefghijklmnopqrstuuMpLhh66NJUQMuZ6FwRQX0sqAEKeWcKW\", \"U*U\" },\n  { \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.K7Qr0se1MxuggH4aP4YgB.U2Em1pGSK\", \"U*U\" },\n  { \"$2a$04$abcdefghijklmnopqrstuu\", \"$2a$04$abcdefghijklmnopqrstuuCFaEytnzrfaPZJKbS76hh9vqd9r8v2S\", \"U*U\" },\n  { \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.VGOzA784oUp/Z0DY336zx7pLYAy0lwK\", \"U*U*\" },\n  { \"$2a$05$abcdefghijklmnopqrstuu\", \"$2a$05$abcdefghijklmnopqrstuueqZzwRqX8BEsrV2jF8gx70v6bcd1qAG\", \"U*U*\" },\n  { \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.5dvsdVl2y/501tm9dvdbbSRbpuvxsaC\", \"U*U*\" },\n  { \"$2a$04$abcdefghijklmnopqrstuu\", \"$2a$04$abcdefghijklmnopqrstuuBtzXFXMcxIslxJptQaoJYuU.xP21coS\", \"U*U*\" },\n  { \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.Bw3BobdGs1SFsKsRLIx9rC4T.Q7DtEm\", \"U*U*U\" },\n  { \"$2a$05$abcdefghijklmnopqrstuu\", \"$2a$05$abcdefghijklmnopqrstuupkvHj1c6E382bN8hwXRlu1xE4bc1pgG\", \"U*U*U\" },\n  { \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.r2Gz4aKpQDpr6TmvEJksSv12hIDVgXe\", \"U*U*U\" },\n  { \"$2a$04$abcdefghijklmnopqrstuu\", \"$2a$04$abcdefghijklmnopqrstuuMJG4SPxGpsI2PpmiVYJg7D.hA7CdQyO\", \"U*U*U\" },\n  { \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.6YtT5mHh5I666KkHRqqIuteDuaNX1GS\", \".....\" },\n  { \"$2a$05$abcdefghijklmnopqrstuu\", \"$2a$05$abcdefghijklmnopqrstuun3YeQp9ZOh1qWiEKJNRybZT69WMr2sW\", \".....\" },\n  { \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.6v/P2K1bqBzj9FILn7LJntMzJQxUuA6\", \".....\" },\n  { \"$2a$04$abcdefghijklmnopqrstuu\", \"$2a$04$abcdefghijklmnopqrstuu7bnTzNnC9mpomsuya2sDYCcZGtW3FKu\", \".....\" },\n  { \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.LZrfN0lz4CULfFuRjqXiVMP49yNOHKi\", \"dragon\" },\n  { \"$2a$05$abcdefghijklmnopqrstuu\", \"$2a$05$abcdefghijklmnopqrstuuG4nizIsfFMB34Hh5MoYcbtdFUq5YPJK\", \"dragon\" },\n  { \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.tidtIFf5ZCN.gk6Mobs.YyDMzNhFfFm\", \"dragon\" },\n  { \"$2a$04$abcdefghijklmnopqrstuu\", \"$2a$04$abcdefghijklmnopqrstuujzhP54E3nDKxLTbGbyrFiW3EkV.7ERC\", \"dragon\" },\n  { \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.i7hPnfU5WycMwd1C9qJZDFBCw8NcAFu\", \"dRaGoN\" },\n  { \"$2a$05$abcdefghijklmnopqrstuu\", \"$2a$05$abcdefghijklmnopqrstuuMA7xTS.7H8Lal4RW.s8KBMURGOrPxQa\", \"dRaGoN\" },\n  { \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.5TqUWVAHsz4mvbAcNwu3JSwt7Pd.dm2\", \"dRaGoN\" },\n  { \"$2a$04$abcdefghijklmnopqrstuu\", \"$2a$04$abcdefghijklmnopqrstuuqS/OX35wGo1BfqluN8dsq//CyXY2pNS\", \"dRaGoN\" },\n  { \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.ZGVtQn6eTc3aPe.tQ.zJuH3XlzyI9Di\", \"DrAgOn\" },\n  { \"$2a$05$abcdefghijklmnopqrstuu\", \"$2a$05$abcdefghijklmnopqrstuuO5PYTf2OGllbJ1tyzjIAdpnQ9rUDGNC\", \"DrAgOn\" },\n  { \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.SzmeTH6T6GIGbKj9Om75UAlglaj4twK\", \"DrAgOn\" },\n  { \"$2a$04$abcdefghijklmnopqrstuu\", \"$2a$04$abcdefghijklmnopqrstuuE9zYHFcawnjSDJKsSux5hf1fyy3utXW\", \"DrAgOn\" },\n  { \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.u/WsPSagrbjc3QmFLSt6j9e/LJ8FoNm\", \"PAROLX\" },\n  { \"$2a$05$abcdefghijklmnopqrstuu\", \"$2a$05$abcdefghijklmnopqrstuuzyv2QWIljnSNjMYpSebmlCqn.QEGEB6\", \"PAROLX\" },\n  { \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.pQY3jmCmc/1Pk8B2m6DNUj9ANrzICLK\", \"PAROLX\" },\n  { \"$2a$04$abcdefghijklmnopqrstuu\", \"$2a$04$abcdefghijklmnopqrstuumicc49hlc3UdUYSMeE8ZXKFJcV/Q2Nm\", \"PAROLX\" },\n  { \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.7Knr9/jUQJ0lh8N4AU/fMnQskXCdfSu\", \"U*U***U\" },\n  { \"$2a$05$abcdefghijklmnopqrstuu\", \"$2a$05$abcdefghijklmnopqrstuu0whe22G2FGJcNLWQaY2ZVuZIf5IJBHK\", \"U*U***U\" },\n  { \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.H3n2rsAGLquD5DBiTNaKBEYcc0HJy5K\", \"U*U***U\" },\n  { \"$2a$04$abcdefghijklmnopqrstuu\", \"$2a$04$abcdefghijklmnopqrstuuDu3PK53XxhceAEiIIFWWlG16bn5LvcG\", \"U*U***U\" },\n  { \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.HjTkKOvb2xTYRqeMFaN1PRcxuDYro5y\", \"abcdefg\" },\n  { \"$2a$05$abcdefghijklmnopqrstuu\", \"$2a$05$abcdefghijklmnopqrstuu3NLAiMrV.ggY98aZ7cNIwxII7afa91.\", \"abcdefg\" },\n  { \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.GQNqYPSPnkqs4XPHOKxta8z3oVxx.Oe\", \"abcdefg\" },\n  { \"$2a$04$abcdefghijklmnopqrstuu\", \"$2a$04$abcdefghijklmnopqrstuuGTNT0Ri8Ic/nBhrRQu0ORxwctqE11mO\", \"abcdefg\" },\n  { \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.RFkLTR7KyUmGXnFvMFlLbB23MCIzsgi\", \"01234567\" },\n  { \"$2a$05$abcdefghijklmnopqrstuu\", \"$2a$05$abcdefghijklmnopqrstuuQOF57SPhYRiKufm4.epZm3ELZ4UlAVy\", \"01234567\" },\n  { \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.3uce2XN8xqrZ2aIduEu48JNEUk6ih9y\", \"01234567\" },\n  { \"$2a$04$abcdefghijklmnopqrstuu\", \"$2a$04$abcdefghijklmnopqrstuucnCKiuhmJV3sCjWqQH.rYNPhmru2Bfq\", \"01234567\" },\n  { \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.hz7CVP6wIj8Z57Ze7yuhrhzKfvq0Ty.\", \"726 even\" },\n  { \"$2a$05$abcdefghijklmnopqrstuu\", \"$2a$05$abcdefghijklmnopqrstuuIaVbx2I8MHKuu1rBc/gqV8Fo2An7wQm\", \"726 even\" },\n  { \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.ib/v2w9PynSZewkHDlSuFwGC.jkyh4a\", \"726 even\" },\n  { \"$2a$04$abcdefghijklmnopqrstuu\", \"$2a$04$abcdefghijklmnopqrstuus/VSIfP19Ty4eQaE51vB9GbPNmLhq2S\", \"726 even\" },\n  { \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.jUMW9ITlTfAw5cFja1iYihO7V9qsmWK\", \"zyxwvuts\" },\n  { \"$2a$05$abcdefghijklmnopqrstuu\", \"$2a$05$abcdefghijklmnopqrstuucN2On7GNyUtMxT..Bo0a0ICaTeQOJ4u\", \"zyxwvuts\" },\n  { \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.xf6Tlh/zfR9Qob4S/6wj9RneRcBt4yG\", \"zyxwvuts\" },\n  { \"$2a$04$abcdefghijklmnopqrstuu\", \"$2a$04$abcdefghijklmnopqrstuucqOWKor12VNz5REoX.a3GqgU2btIQWS\", \"zyxwvuts\" },\n  { \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.hdihJRIixUmRFFg0NQNaid9UF3Uw/Q.\", \"ab1234567\" },\n  { \"$2a$05$abcdefghijklmnopqrstuu\", \"$2a$05$abcdefghijklmnopqrstuulK6ChIvFKqdreUvOY9oKm2O2Fn.1Zuq\", \"ab1234567\" },\n  { \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.xq4CFi9Keo/OhWm9tosH45r9gI3Gd4C\", \"ab1234567\" },\n  { \"$2a$04$abcdefghijklmnopqrstuu\", \"$2a$04$abcdefghijklmnopqrstuuuBq8XeHGZZJdrs6jsgiLupxqOP4GLc6\", \"ab1234567\" },\n  { \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.0c9Eoia74tfCGVyINCZAcZaVzJdMsoi\", \"alexander\" },\n  { \"$2a$05$abcdefghijklmnopqrstuu\", \"$2a$05$abcdefghijklmnopqrstuu3qH73fcOvo6pdGd/u/Of.mkavvVviAG\", \"alexander\" },\n  { \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.bK5f5L/foC9KH3IYxj9uWGZPE/w22J2\", \"alexander\" },\n  { \"$2a$04$abcdefghijklmnopqrstuu\", \"$2a$04$abcdefghijklmnopqrstuu1zazepZSS74T7o4eCXaJqsa4KC41vt6\", \"alexander\" },\n  { \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.Tc9f8dMIa03zsepKEv1oSFsFWT84Me.\", \"beautiful\" },\n  { \"$2a$05$abcdefghijklmnopqrstuu\", \"$2a$05$abcdefghijklmnopqrstuusxVo.QMslOcijv585zolzUwesRGYfui\", \"beautiful\" },\n  { \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.7XxYg42754jz07Elen5lFQuommU7crW\", \"beautiful\" },\n  { \"$2a$04$abcdefghijklmnopqrstuu\", \"$2a$04$abcdefghijklmnopqrstuuHz11b40qtSU5.OKZJGONgmO6tsOw8ny\", \"beautiful\" },\n  { \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.SxOcYMxtg44jVOAYY0zBeTBbfCYXSBu\", \"challenge\" },\n  { \"$2a$05$abcdefghijklmnopqrstuu\", \"$2a$05$abcdefghijklmnopqrstuuD2bZx1XnT2xoC7mKx.Jr7E20hJXg5y.\", \"challenge\" },\n  { \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.mK3Hkg2ZFCrNFQRor1M7Bd.pyBSFz56\", \"challenge\" },\n  { \"$2a$04$abcdefghijklmnopqrstuu\", \"$2a$04$abcdefghijklmnopqrstuu92OCZ/GwgJ2w0KrMJRu6fK7i2iKqYha\", \"challenge\" },\n  { \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.455yryJspofWOsWxxZ/Tsu5qtg8j2wm\", \"chocolate\" },\n  { \"$2a$05$abcdefghijklmnopqrstuu\", \"$2a$05$abcdefghijklmnopqrstuulZGdWs.WkvfSGHTz.1.5CPi2ETJLi3.\", \"chocolate\" },\n  { \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.N0Iumk1Mt6l7kbmk8iYgSA9FqaEfv5y\", \"chocolate\" },\n  { \"$2a$04$abcdefghijklmnopqrstuu\", \"$2a$04$abcdefghijklmnopqrstuuLbL252qaabO.sIFmAzyShKINVGRsGeu\", \"chocolate\" },\n  { \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.ZA//OMzj1MY4PfGODYfbeGs8HPUS2zq\", \"cr1234567\" },\n  { \"$2a$05$abcdefghijklmnopqrstuu\", \"$2a$05$abcdefghijklmnopqrstuuUccVOwN/r/34c2SICyLEwyfRWS4Vgja\", \"cr1234567\" },\n  { \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.8tZkJ2HTsa4Pn6bgGzpDRWJ8c1biGYu\", \"cr1234567\" },\n  { \"$2a$04$abcdefghijklmnopqrstuu\", \"$2a$04$abcdefghijklmnopqrstuuA.Ry5GZ8Ob/wI0r8UydZ6XfbyfLJ5JK\", \"cr1234567\" },\n  { \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.XyLDmzSo8jvTANPtIoCB164F84v8EkS\", \"katherine\" },\n  { \"$2a$05$abcdefghijklmnopqrstuu\", \"$2a$05$abcdefghijklmnopqrstuuOYRnTkqPmRfoAB/blXEA7y5xOBtiEg6\", \"katherine\" },\n  { \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.bsdSaZOaobkZJkNO2MxskcWIZCJ8btK\", \"katherine\" },\n  { \"$2a$04$abcdefghijklmnopqrstuu\", \"$2a$04$abcdefghijklmnopqrstuu5i6Sk8a0h8mpYFdjQZdYrEsLaxZ1EaG\", \"katherine\" },\n  { \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$05$CCCCCCCCCCCCCCCCCCCCC./cK5Kv8QvFDy9GyVbaJS/eEKlmhA6wW\", \"stephanie\" },\n  { \"$2a$05$abcdefghijklmnopqrstuu\", \"$2a$05$abcdefghijklmnopqrstuucK0uB5JOSYLNCq75/1vd9213cIwiEQi\", \"stephanie\" },\n  { \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.Yr8Btf/4dkO36VgY1VYAp6Q9B4.B/rm\", \"stephanie\" },\n  { \"$2a$04$abcdefghijklmnopqrstuu\", \"$2a$04$abcdefghijklmnopqrstuug3T9Nmp5d1Zd35nXtrYPiCSv8A6PVAu\", \"stephanie\" },\n  { \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.VYs2hleVmLTA.FbmrBwOI38C4Pd/8BS\", \"sunflower\" },\n  { \"$2a$05$abcdefghijklmnopqrstuu\", \"$2a$05$abcdefghijklmnopqrstuuY/44p2UkK4uV0kvS9KurVonsOh/oc5m\", \"sunflower\" },\n  { \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.VuKIcBGfiLx.AYuX6c48oQtlhMCQPRq\", \"sunflower\" },\n  { \"$2a$04$abcdefghijklmnopqrstuu\", \"$2a$04$abcdefghijklmnopqrstuul18yFhC69sq/WwO8ibiE1VQy773yVfu\", \"sunflower\" },\n  { \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.465.cDVHqgo4g9qBZIbQbOcdcGqRs2O\", \"basketball\" },\n  { \"$2a$05$abcdefghijklmnopqrstuu\", \"$2a$05$abcdefghijklmnopqrstuuFT2m2RbIlbhkAJBfZ3FCN3Sn3V.N4Bm\", \"basketball\" },\n  { \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.R293rqybpDGrtZIhZxApKqVLXiOJUTG\", \"basketball\" },\n  { \"$2a$04$abcdefghijklmnopqrstuu\", \"$2a$04$abcdefghijklmnopqrstuudp7.T6JYoR2jjqAKGX8kDLzPDm6RR3S\", \"basketball\" },\n  { \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.XUKWvx5JT0wYalbOFE4HU.j3lDUpDcm\", \"porsche911\" },\n  { \"$2a$05$abcdefghijklmnopqrstuu\", \"$2a$05$abcdefghijklmnopqrstuupKJ./ES4uwzJk/SsN3YaTFdl9AIiAdu\", \"porsche911\" },\n  { \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.jgOl9b/oD1cEHohzVyGK6zqcGccVRBG\", \"porsche911\" },\n  { \"$2a$04$abcdefghijklmnopqrstuu\", \"$2a$04$abcdefghijklmnopqrstuuVXo2ooNppOi53FnAHCUuZp8EyiwUoCi\", \"porsche911\" },\n  { \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.sXCEcM/a6jUtNpF7EFCOWiQRogVPxNW\", \"|_337T`/p3\" },\n  { \"$2a$05$abcdefghijklmnopqrstuu\", \"$2a$05$abcdefghijklmnopqrstuugZjL4p/g0M.xDKdvzvO1BKtO0aYdnwC\", \"|_337T`/p3\" },\n  { \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.UyHWsohI3G2oJ05vftc06k9UIwXNW4a\", \"|_337T`/p3\" },\n  { \"$2a$04$abcdefghijklmnopqrstuu\", \"$2a$04$abcdefghijklmnopqrstuuh7AZQzpU7Q7C5l4VczvD6UVfhLQVCDK\", \"|_337T`/p3\" },\n  { \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.ScdVt/vv5qxU5Weko6ZqQcaHw2EjuRG\", \"thunderbird\" },\n  { \"$2a$05$abcdefghijklmnopqrstuu\", \"$2a$05$abcdefghijklmnopqrstuuhX1c3kKr2qeB4tFvvRmDk/ta3LTQtma\", \"thunderbird\" },\n  { \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.XXuNspXmlmLMqkZ37Xt0om56PIqSupq\", \"thunderbird\" },\n  { \"$2a$04$abcdefghijklmnopqrstuu\", \"$2a$04$abcdefghijklmnopqrstuuSJB.YmarGme5IjgFBN49eRn74KS.zVC\", \"thunderbird\" },\n  { \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.z6PrHbuSsMSSwIGFy1JGevQZf6CqJ1y\", \"Hello world!\" },\n  { \"$2a$05$abcdefghijklmnopqrstuu\", \"$2a$05$abcdefghijklmnopqrstuu7nFISH/8YdwlXD3lw69A4iBUf6fvWAW\", \"Hello world!\" },\n  { \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.M.JZM2tZUe85sR83hfk5p2NZ0IVXwXe\", \"Hello world!\" },\n  { \"$2a$04$abcdefghijklmnopqrstuu\", \"$2a$04$abcdefghijklmnopqrstuuyeG8laUfZvsCmc.AE6qIDYSPGM2efmK\", \"Hello world!\" },\n  { \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.cTKgEgC.g8ePpbyZbNC34HvEm4dr75a\", \"pleaseletmein\" },\n  { \"$2a$05$abcdefghijklmnopqrstuu\", \"$2a$05$abcdefghijklmnopqrstuu2EjsH9/6E2HK9wvYowfGqPX5wGi4UDS\", \"pleaseletmein\" },\n  { \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.3WPQy/x8EhyouO1Eia.f.CS216k/lTq\", \"pleaseletmein\" },\n  { \"$2a$04$abcdefghijklmnopqrstuu\", \"$2a$04$abcdefghijklmnopqrstuumH1BFkDxi3LKCbP6FQ2juPgiLLcuV6S\", \"pleaseletmein\" },\n  { \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.UTQ/YCMF16uRDggIHAnzfTGA1GG/5.K\", \"a short string\" },\n  { \"$2a$05$abcdefghijklmnopqrstuu\", \"$2a$05$abcdefghijklmnopqrstuuZM773JiyU8IodKIqJ54EAWHzd/nJoF6\", \"a short string\" },\n  { \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.nks3nTLHIdR6yOhEvQZRsOoYVEqWOtW\", \"a short string\" },\n  { \"$2a$04$abcdefghijklmnopqrstuu\", \"$2a$04$abcdefghijklmnopqrstuu.oBhtv6clsTihZTgUKW34dikJs1Zg1y\", \"a short string\" },\n  { \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.gBXVnji0fmYJspngWLhq07sJA.unyGS\", \"zxyDPWgydbQjgq\" },\n  { \"$2a$05$abcdefghijklmnopqrstuu\", \"$2a$05$abcdefghijklmnopqrstuuGbGKxJ6BsCRT7AGpwiKNOKUzJzb5AA.\", \"zxyDPWgydbQjgq\" },\n  { \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.6vf3XUm.amMyfSlIH2P/SIU5V6p644a\", \"zxyDPWgydbQjgq\" },\n  { \"$2a$04$abcdefghijklmnopqrstuu\", \"$2a$04$abcdefghijklmnopqrstuukgPMil1AyxXOwqj9OWvu3muVwEMg1Aq\", \"zxyDPWgydbQjgq\" },\n  { \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.8TeQYvjyS9VKUlqSLz.kDaRa5v396hC\", \"photojournalism\" },\n  { \"$2a$05$abcdefghijklmnopqrstuu\", \"$2a$05$abcdefghijklmnopqrstuuhJe3S.rJQghSggwRY8.DQE1zCW18PcG\", \"photojournalism\" },\n  { \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.1h1LaJMlvaH2Defb280WzG6X/kqHQQy\", \"photojournalism\" },\n  { \"$2a$04$abcdefghijklmnopqrstuu\", \"$2a$04$abcdefghijklmnopqrstuugpKNM0gEaEfwZ43UsjoT1tNLK25mqV6\", \"photojournalism\" },\n  { \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$05$CCCCCCCCCCCCCCCCCCCCC./fog6ND8iIMkWXIpr.Y6LCOndkFsu/m\", \"ecclesiastically\" },\n  { \"$2a$05$abcdefghijklmnopqrstuu\", \"$2a$05$abcdefghijklmnopqrstuuDUj/hoyzOfsxHnlzXPdMGJybsJgbODG\", \"ecclesiastically\" },\n  { \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.AYMycNr126P8pzb9X2aVQjINCiZadp2\", \"ecclesiastically\" },\n  { \"$2a$04$abcdefghijklmnopqrstuu\", \"$2a$04$abcdefghijklmnopqrstuuOt9ERn2.X0reuqDc7blRS.5f8ttIq3a\", \"ecclesiastically\" },\n  { \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.dsZw45vJh0v/SWcvr.H79lmJF/uZKAy\", \"congregationalism\" },\n  { \"$2a$05$abcdefghijklmnopqrstuu\", \"$2a$05$abcdefghijklmnopqrstuuZu0OqjIDqSsvpAvbAqbC.8HRlYYcVkW\", \"congregationalism\" },\n  { \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.1CYpRB/IxktadiLrbTzgJ.Jd/Q06oBe\", \"congregationalism\" },\n  { \"$2a$04$abcdefghijklmnopqrstuu\", \"$2a$04$abcdefghijklmnopqrstuulau/kOpHdl7CjZgjQuvsiDAB2f/8Aqa\", \"congregationalism\" },\n  { \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.aHkGX/fiki8Qrwu3gWTRnejC9Hba52e\", \"dihydrosphingosine\" },\n  { \"$2a$05$abcdefghijklmnopqrstuu\", \"$2a$05$abcdefghijklmnopqrstuuEJAH.2Z6lOSn5WvfN87I7V1JhCPsW5y\", \"dihydrosphingosine\" },\n  { \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.8obhdpTZ2CAxc8Qbd8dIApwIFM6pzZe\", \"dihydrosphingosine\" },\n  { \"$2a$04$abcdefghijklmnopqrstuu\", \"$2a$04$abcdefghijklmnopqrstuu3tvUtVPx0FPXPsdjb7uta674As4iQfq\", \"dihydrosphingosine\" },\n  { \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.sYSxc3RiA3.WrH2ic000nunk3yqkXHa\", \"semianthropological\" },\n  { \"$2a$05$abcdefghijklmnopqrstuu\", \"$2a$05$abcdefghijklmnopqrstuuLa.VWC3vq9KMn0BrxUY.r4HUotKepnO\", \"semianthropological\" },\n  { \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.tLQTlKtJqj8kJFe92LPFDJdoiTxQ9PO\", \"semianthropological\" },\n  { \"$2a$04$abcdefghijklmnopqrstuu\", \"$2a$04$abcdefghijklmnopqrstuu6yC/otJXGOxvYDo3uRwUKNucauhdOPO\", \"semianthropological\" },\n  { \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.Kvy1q1BWf93W1T7eSLpj/6OuRO.4FqC\", \"palaeogeographically\" },\n  { \"$2a$05$abcdefghijklmnopqrstuu\", \"$2a$05$abcdefghijklmnopqrstuuYNeqeSEZQQFODdHVEfj5MJFvrZPOeF6\", \"palaeogeographically\" },\n  { \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.ybSWdRvitEQlA9I.Oq9wpqMqvBcJiti\", \"palaeogeographically\" },\n  { \"$2a$04$abcdefghijklmnopqrstuu\", \"$2a$04$abcdefghijklmnopqrstuu1POIcCAIthmV0dvj5BClL3hMpuuUctO\", \"palaeogeographically\" },\n  { \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.g7bhq.l6.ix6BSpqhW6wIRoq310s.qO\", \"electromyographically\" },\n  { \"$2a$05$abcdefghijklmnopqrstuu\", \"$2a$05$abcdefghijklmnopqrstuuFj/NgndkQJ9QWdR8vDPZF92Ql/3UYFy\", \"electromyographically\" },\n  { \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.rnGfJV5/J4BjTZj66R1dckO0Gy88d5e\", \"electromyographically\" },\n  { \"$2a$04$abcdefghijklmnopqrstuu\", \"$2a$04$abcdefghijklmnopqrstuui7gF3bPS07zaLzWARBCVakWoF70OE8K\", \"electromyographically\" },\n  { \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.fr2hBCxymAKP.MXKdQbm7/rIBEBis9y\", \"noninterchangeableness\" },\n  { \"$2a$05$abcdefghijklmnopqrstuu\", \"$2a$05$abcdefghijklmnopqrstuueL38vMSpfDTZP0TBBAuZDp0A/4eFDFa\", \"noninterchangeableness\" },\n  { \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.z1xt/vCOI.kmvN8L8t9GsafzGsOXupS\", \"noninterchangeableness\" },\n  { \"$2a$04$abcdefghijklmnopqrstuu\", \"$2a$04$abcdefghijklmnopqrstuuR1nrUOQ7HQO0AfPt3niv6JJN90IEgi2\", \"noninterchangeableness\" },\n  { \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.UwjPIUFoFVfh.JD5Z/iVMDQ/.s2BdmK\", \"abcdefghijklmnopqrstuvwxyz\" },\n  { \"$2a$05$abcdefghijklmnopqrstuu\", \"$2a$05$abcdefghijklmnopqrstuuq9gWjWvJAAO9dtIxbLejROlOtpZkAZ2\", \"abcdefghijklmnopqrstuvwxyz\" },\n  { \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.2qEx6VDzW/1gZVPz1yxtxnopI9gvYHG\", \"abcdefghijklmnopqrstuvwxyz\" },\n  { \"$2a$04$abcdefghijklmnopqrstuu\", \"$2a$04$abcdefghijklmnopqrstuucUHlaG.p8AVcD5w/eidx9TAkwV4EXAW\", \"abcdefghijklmnopqrstuvwxyz\" },\n  { \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.BdcD8qjQ3jCap/PcGpUCiau8u4PMcSy\", \"electroencephalographically\" },\n  { \"$2a$05$abcdefghijklmnopqrstuu\", \"$2a$05$abcdefghijklmnopqrstuuXDAnjJaWDI/Zcl0Om1uOs90q4mqBRWy\", \"electroencephalographically\" },\n  { \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.n1A7hL3v/hM0RBTwKl/MB.eEE0e4av2\", \"electroencephalographically\" },\n  { \"$2a$04$abcdefghijklmnopqrstuu\", \"$2a$04$abcdefghijklmnopqrstuuvcwFX7UZ8m2DKl4e6qPHdONvRVRgApi\", \"electroencephalographically\" },\n  { \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.9WsvENLhmOLqpxNHHDPzl0/i3I0QLXy\", \"antidisestablishmentarianism\" },\n  { \"$2a$05$abcdefghijklmnopqrstuu\", \"$2a$05$abcdefghijklmnopqrstuuNq0IwONJZaZ7QfLbcoA7E.G9LXdQ.8.\", \"antidisestablishmentarianism\" },\n  { \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.WM1vtlGv4CR1StKJWw9/1zvZjhQpVm2\", \"antidisestablishmentarianism\" },\n  { \"$2a$04$abcdefghijklmnopqrstuu\", \"$2a$04$abcdefghijklmnopqrstuu.Nk99xH6C1i1s687VYJkw/9TgJZwvkW\", \"antidisestablishmentarianism\" },\n  { \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.9vgB/QG0/5yJ0/eI2lb6I1NvMoYZHEi\", \"cyclotrimethylenetrinitramine\" },\n  { \"$2a$05$abcdefghijklmnopqrstuu\", \"$2a$05$abcdefghijklmnopqrstuuwOuvuEB8yOWqrtta0jWB10wzwfcx.sG\", \"cyclotrimethylenetrinitramine\" },\n  { \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.mumkbiG5cCSVfxbwD8LbcQV6CFQ3MXq\", \"cyclotrimethylenetrinitramine\" },\n  { \"$2a$04$abcdefghijklmnopqrstuu\", \"$2a$04$abcdefghijklmnopqrstuukUEvmtjkKEjAeshmrzk18VIJ5pOYI9G\", \"cyclotrimethylenetrinitramine\" },\n  { \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.ld/W//3S8PyfCs05HnX4ctiJEWzxvtu\", \"dichlorodiphenyltrichloroethane\" },\n  { \"$2a$05$abcdefghijklmnopqrstuu\", \"$2a$05$abcdefghijklmnopqrstuuJaeloUBsLGuKojqNVj.JssS.S.5SOoG\", \"dichlorodiphenyltrichloroethane\" },\n  { \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.IJ0s8nV/cDKYfTVFgirVaOoRoZvbMAW\", \"dichlorodiphenyltrichloroethane\" },\n  { \"$2a$04$abcdefghijklmnopqrstuu\", \"$2a$04$abcdefghijklmnopqrstuuQBL3QBmqpQVj0lKsVoN/yVsN7LDfMom\", \"dichlorodiphenyltrichloroethane\" },\n  { \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.qgmN7ezpNt2mv7RXpV9nwxAwSRHe8Z6\", \"multiple words seperated by spaces\" },\n  { \"$2a$05$abcdefghijklmnopqrstuu\", \"$2a$05$abcdefghijklmnopqrstuuUyj6XHAnIT7HIUaHPt/mAqWbLOZ95oW\", \"multiple words seperated by spaces\" },\n  { \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.ya4OMfax14JgLKjCeRnok41QNmDHk.6\", \"multiple words seperated by spaces\" },\n  { \"$2a$04$abcdefghijklmnopqrstuu\", \"$2a$04$abcdefghijklmnopqrstuurps.S9nvQl/40RApzaFs9lIt3AMcneK\", \"multiple words seperated by spaces\" },\n  { \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.2CHByRiD9EoV4pN2mhPq49ZZhIg5K/.\", \"supercalifragilisticexpialidocious\" },\n  { \"$2a$05$abcdefghijklmnopqrstuu\", \"$2a$05$abcdefghijklmnopqrstuuchc4Fu0voJQx93SMHFKQgbDXESzxUai\", \"supercalifragilisticexpialidocious\" },\n  { \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.mqD8IRcEmTxZ.ChOQZyLHygiTWmqvk2\", \"supercalifragilisticexpialidocious\" },\n  { \"$2a$04$abcdefghijklmnopqrstuu\", \"$2a$04$abcdefghijklmnopqrstuuG9j0r2T6lEIX9LVt3txW9dZuFY0Ew1q\", \"supercalifragilisticexpialidocious\" },\n  { \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.pr..QUPolGyX.oqq.qgP8kNIbwX1YlC\", \"we have a short salt string but not a short password\" },\n  { \"$2a$05$abcdefghijklmnopqrstuu\", \"$2a$05$abcdefghijklmnopqrstuuwLVtPJcEI87Gw5SVMgJ3jR.jz4FXA3C\", \"we have a short salt string but not a short password\" },\n  { \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.S693iU5aWL1P1CiTvv4sKd4VtqEefpm\", \"we have a short salt string but not a short password\" },\n  { \"$2a$04$abcdefghijklmnopqrstuu\", \"$2a$04$abcdefghijklmnopqrstuus8h4uV7ZQW6KJvz2prsjqaySAO/1k2e\", \"we have a short salt string but not a short password\" },\n  { \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.VkOUUuotOZvrmtXJpkTGsRR7av5It52\", \"multiple word$ $eperated by $pace$ and $pecial character$\" },\n  { \"$2a$05$abcdefghijklmnopqrstuu\", \"$2a$05$abcdefghijklmnopqrstuuT837gAqiU/1zYnau8zpkZMploUCluwS\", \"multiple word$ $eperated by $pace$ and $pecial character$\" },\n  { \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.iNDvHP9V2K7P.xzMWcBO.ucnS87zUrq\", \"multiple word$ $eperated by $pace$ and $pecial character$\" },\n  { \"$2a$04$abcdefghijklmnopqrstuu\", \"$2a$04$abcdefghijklmnopqrstuu5RYaD3UZMA62Bfinm5QndpfWzruwF.O\", \"multiple word$ $eperated by $pace$ and $pecial character$\" },\n  { \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.8b67df7RZ0XnI62umy35MYpe4K51Fk2\", \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\" },\n  { \"$2a$05$abcdefghijklmnopqrstuu\", \"$2a$05$abcdefghijklmnopqrstuuW5igozlL8rSr/rkFexuDh1grrkW8FSi\", \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\" },\n  { \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.F3K5wiwHej.p9lTXgX9bOlrEyWKv066\", \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\" },\n  { \"$2a$04$abcdefghijklmnopqrstuu\", \"$2a$04$abcdefghijklmnopqrstuuViu5c2UpaacAGAhQuLE2zyrV3jz4b5e\", \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\" },\n  { \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.Td/f8oS7ISMxGfHYB8YP9rXGhoZDosO\", \"12345678901234567890123456789012345678901234567890123456789012345678901234567890\" },\n  { \"$2a$05$abcdefghijklmnopqrstuu\", \"$2a$05$abcdefghijklmnopqrstuuxuElans2nYY6zVSN13XYHtA0oeOXZLa\", \"12345678901234567890123456789012345678901234567890123456789012345678901234567890\" },\n  { \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.kLVEehyg8LFsXfIVuFyGfLj4dvN7a4e\", \"12345678901234567890123456789012345678901234567890123456789012345678901234567890\" },\n  { \"$2a$04$abcdefghijklmnopqrstuu\", \"$2a$04$abcdefghijklmnopqrstuuMNSliUjQvcDZoWAZHm/hAG9Z3ZRf5wy\", \"12345678901234567890123456789012345678901234567890123456789012345678901234567890\" },\n  { \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.4aisLqC2w3pT8aeXd3SHZFJkWSCkf0a\", \"a very much longer text to encrypt.  This one even stretches over morethan one line.\" },\n  { \"$2a$05$abcdefghijklmnopqrstuu\", \"$2a$05$abcdefghijklmnopqrstuuoBz.G9gMNiZlW/Gsj.oKhiomPeIRFTC\", \"a very much longer text to encrypt.  This one even stretches over morethan one line.\" },\n  { \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.9c/KG5wY7kGTdky/Js0KWIpuVuJFUJG\", \"a very much longer text to encrypt.  This one even stretches over morethan one line.\" },\n  { \"$2a$04$abcdefghijklmnopqrstuu\", \"$2a$04$abcdefghijklmnopqrstuuinRgQYMZk.yuMIssG.kPPL6i9WP0xFa\", \"a very much longer text to encrypt.  This one even stretches over morethan one line.\" },\n  { \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.heAts1y/8kcTTP0/vD3yeuMX1ihF8dO\", \"\\xd0\\xc1\\xd2\\xcf\\xcc\\xd8\" },\n  { \"$2a$05$abcdefghijklmnopqrstuu\", \"$2a$05$abcdefghijklmnopqrstuuTp1b9XCEV16BcrQ.0k4xf7V/OGPZLnK\", \"\\xd0\\xc1\\xd2\\xcf\\xcc\\xd8\" },\n  { \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.A96emG/jBf0K1K6vCG.eZGdLkSridom\", \"\\xd0\\xc1\\xd2\\xcf\\xcc\\xd8\" },\n  { \"$2a$04$abcdefghijklmnopqrstuu\", \"$2a$04$abcdefghijklmnopqrstuuoaE0x.b2rUEITWgPdg.GEcU4ePHLh6m\", \"\\xd0\\xc1\\xd2\\xcf\\xcc\\xd8\" },\n  { \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.qJn4AY9ch/WAR5JXeeJtVGeovjQrhd2\", \"\\xd5\\xaa\\xd5\\xaa\\xaa\\xaa\\xd5\\xaa\" },\n  { \"$2a$05$abcdefghijklmnopqrstuu\", \"$2a$05$abcdefghijklmnopqrstuuiYbzuFNFwSfCgqTGNsUFtSDh8PJAqSe\", \"\\xd5\\xaa\\xd5\\xaa\\xaa\\xaa\\xd5\\xaa\" },\n  { \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.h0JFRyDXfP0duxAkVxWGr8nMDEDvPca\", \"\\xd5\\xaa\\xd5\\xaa\\xaa\\xaa\\xd5\\xaa\" },\n  { \"$2a$04$abcdefghijklmnopqrstuu\", \"$2a$04$abcdefghijklmnopqrstuuw8RVl3rh7sNazq544l0944qGq4GUFUq\", \"\\xd5\\xaa\\xd5\\xaa\\xaa\\xaa\\xd5\\xaa\" },\n  { \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.FZEYKXyyMgG13MK0uV8dwNotWf4Wm6e\", \"\\xe1\\xec\\xe5\\xf8\\xe1\\xee\\xe4\\xe5\\xf2\" },\n  { \"$2a$05$abcdefghijklmnopqrstuu\", \"$2a$05$abcdefghijklmnopqrstuuK2KXzhsMefB8v6hJJG3bOyKV.XRf6Qe\", \"\\xe1\\xec\\xe5\\xf8\\xe1\\xee\\xe4\\xe5\\xf2\" },\n  { \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.I7vjUzDOKf8XqcK8VSCm9b0bwoSm1Qm\", \"\\xe1\\xec\\xe5\\xf8\\xe1\\xee\\xe4\\xe5\\xf2\" },\n  { \"$2a$04$abcdefghijklmnopqrstuu\", \"$2a$04$abcdefghijklmnopqrstuuhWYb0x3Q3zM0aBkB2G1arbzmWxRQS/i\", \"\\xe1\\xec\\xe5\\xf8\\xe1\\xee\\xe4\\xe5\\xf2\" },\n  { \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.HD8RnTmGEavoR3LFVfdHvh3xA0QPka2\", \"\\xf3\\xf4\\xe5\\xf0\\xe8\\xe1\\xee\\xe9\\xe5\" },\n  { \"$2a$05$abcdefghijklmnopqrstuu\", \"$2a$05$abcdefghijklmnopqrstuuSRMKxjeMqVSDMhSLhOnvtEZ/p5KhUbq\", \"\\xf3\\xf4\\xe5\\xf0\\xe8\\xe1\\xee\\xe9\\xe5\" },\n  { \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.zQPVIDk6wF8XmESji30KDHFabTlu0WK\", \"\\xf3\\xf4\\xe5\\xf0\\xe8\\xe1\\xee\\xe9\\xe5\" },\n  { \"$2a$04$abcdefghijklmnopqrstuu\", \"$2a$04$abcdefghijklmnopqrstuuk9Hv17Gha84losGKAq61csCZokj5pyy\", \"\\xf3\\xf4\\xe5\\xf0\\xe8\\xe1\\xee\\xe9\\xe5\" },\n  { \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.PYLCOpTKZmhFn1CoBM2XNbWgqMX4Jk2\", \"\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\" },\n  { \"$2a$05$abcdefghijklmnopqrstuu\", \"$2a$05$abcdefghijklmnopqrstuuUTFLPGm29p.YVzcY6pqejGEql1x8Ccq\", \"\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\" },\n  { \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.PQInhDOdCKnXeUE.n/L.kQmTKM9ldK2\", \"\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\" },\n  { \"$2a$04$abcdefghijklmnopqrstuu\", \"$2a$04$abcdefghijklmnopqrstuugI4g/1M6K/Sz2bsgu9VDeEl6reszuXa\", \"\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\" },\n  { \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.uIZ1Lgb.jHRDU/Z/LVXfpQCK72fTEHq\", \"\\xc3\\xa9tude\" },\n  { \"$2a$05$abcdefghijklmnopqrstuu\", \"$2a$05$abcdefghijklmnopqrstuuYdPam5/ypFIyDUQMyCCEIwzVsTi0Sa6\", \"\\xc3\\xa9tude\" },\n  { \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.TszY8.avBpwJ6xbNjwws3SKBbK6kj6S\", \"\\xc3\\xa9tude\" },\n  { \"$2a$04$abcdefghijklmnopqrstuu\", \"$2a$04$abcdefghijklmnopqrstuu3wn02pxRJPnFwvlGt75DURDbt4g7om.\", \"\\xc3\\xa9tude\" },\n  { \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.qcYQ0c2j2SvETms11hszz5bnbvNhN0G\", \"C)tude\" },\n  { \"$2a$05$abcdefghijklmnopqrstuu\", \"$2a$05$abcdefghijklmnopqrstuuo170FGVreUKlJWzQl8GcfhpghDIp2c.\", \"C)tude\" },\n  { \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.2iSSZ5gtiVxKz8BdAoDV9IxZl3LAH7y\", \"C)tude\" },\n  { \"$2a$04$abcdefghijklmnopqrstuu\", \"$2a$04$abcdefghijklmnopqrstuutA7.Ir5GREoOf.twyI.Zoy.dI1gNHfC\", \"C)tude\" },\n  { \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.tLCLEXAt3RUjOgs.yvfWSni4j1JX/JS\", \"Chl\\xc3\\xb6\"\"e\" },\n  { \"$2a$05$abcdefghijklmnopqrstuu\", \"$2a$05$abcdefghijklmnopqrstuuz4QFggBRTVUeHRGL/CQxlAYHraYPcpa\", \"Chl\\xc3\\xb6\"\"e\" },\n  { \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.KHsCqMFVxOAGJObHwEBR3JaEdKVu1.m\", \"Chl\\xc3\\xb6\"\"e\" },\n  { \"$2a$04$abcdefghijklmnopqrstuu\", \"$2a$04$abcdefghijklmnopqrstuuG6PeIXKiqeNUPUbqFkMJvvI7G9hd51W\", \"Chl\\xc3\\xb6\"\"e\" },\n  { \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.w.V.mBIadppiKKxZ0OzpXn86NOk43pC\", \"ChlC6e\" },\n  { \"$2a$05$abcdefghijklmnopqrstuu\", \"$2a$05$abcdefghijklmnopqrstuuQ2qgoto47/GjSmc6truiPxHNSL1jAfS\", \"ChlC6e\" },\n  { \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.r7GLvyVWQLuQaOTYsrMOBkbLfy8sPIi\", \"ChlC6e\" },\n  { \"$2a$04$abcdefghijklmnopqrstuu\", \"$2a$04$abcdefghijklmnopqrstuueolw0UBEFN.qCtReAkwiO7BAjrY4CX6\", \"ChlC6e\" },\n  { \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.UPBzTBMwJb5mKWflQ.5Rid4481RrxVy\", \"\\xc3\\x85ngstr\\xc3\\xb6m\" },\n  { \"$2a$05$abcdefghijklmnopqrstuu\", \"$2a$05$abcdefghijklmnopqrstuuCARhc7ugFdgoPjDb7LUG.yQF2lboK6e\", \"\\xc3\\x85ngstr\\xc3\\xb6m\" },\n  { \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.ZHZAnvydiPNiYH2VjRNhEAD6BEiyaWS\", \"\\xc3\\x85ngstr\\xc3\\xb6m\" },\n  { \"$2a$04$abcdefghijklmnopqrstuu\", \"$2a$04$abcdefghijklmnopqrstuu2WegkGS5Xr/qYNkfEi6JmnR16WVSwcW\", \"\\xc3\\x85ngstr\\xc3\\xb6m\" },\n  { \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.gx7D73FxK1lx9aoctuj3fhNJqC.IYc6\", \"C\\x05ngstrC6m\" },\n  { \"$2a$05$abcdefghijklmnopqrstuu\", \"$2a$05$abcdefghijklmnopqrstuusSqmEHNEXYcUAamAuvd.piiJP2/SvW6\", \"C\\x05ngstrC6m\" },\n  { \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.pjA09E/vp0VG8cavv0kgRuMJNPJRdqS\", \"C\\x05ngstrC6m\" },\n  { \"$2a$04$abcdefghijklmnopqrstuu\", \"$2a$04$abcdefghijklmnopqrstuuEFW231TUkQA55cajdiwh2GQXkKY7v4.\", \"C\\x05ngstrC6m\" },\n  { \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.OVB6qjs7Uzos9N7/Rpm1laBHwGw11u.\", \"C\\x05ngstrCU*U***U*\" },\n  { \"$2a$05$abcdefghijklmnopqrstuu\", \"$2a$05$abcdefghijklmnopqrstuuAEHJsqoIo5645CuTbmM6VobcvFM6pxK\", \"C\\x05ngstrCU*U***U*\" },\n  { \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.E/ZiYei4bcJNCJEyI148Q1.aMAOn66e\", \"C\\x05ngstrCU*U***U*\" },\n  { \"$2a$04$abcdefghijklmnopqrstuu\", \"$2a$04$abcdefghijklmnopqrstuumAqJP8MYx4tSoKoE9d0vR0QW81bYuSC\", \"C\\x05ngstrCU*U***U*\" },\n  { \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.84ASbYYPYkl18.t0.TvQbm0oh98TFvG\", \"U*U***U*ignored\" },\n  { \"$2a$05$abcdefghijklmnopqrstuu\", \"$2a$05$abcdefghijklmnopqrstuuR.W0Ohu3KxpPUfr5Knw07yOOzZkdd7.\", \"U*U***U*ignored\" },\n  { \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.wx4V3qBoGl7ej9kbsoEpQTxmptzY0yq\", \"U*U***U*ignored\" },\n  { \"$2a$04$abcdefghijklmnopqrstuu\", \"$2a$04$abcdefghijklmnopqrstuu4SS72T2y2mc0YsQSe9qECdkPhGVslHS\", \"U*U***U*ignored\" },\n  { \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.ebmmSqlfcFhKGN/743nH7i03zpqftle\", \"U*U*U*U*\" },\n  { \"$2a$05$abcdefghijklmnopqrstuu\", \"$2a$05$abcdefghijklmnopqrstuuF1QNFce4DfYnYJUcafR1v2/7XbWeLjK\", \"U*U*U*U*\" },\n  { \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.5KIIW3tGg2xhhVu/AQXLZX9lSSeeehu\", \"U*U*U*U*\" },\n  { \"$2a$04$abcdefghijklmnopqrstuu\", \"$2a$04$abcdefghijklmnopqrstuudBYNJEBvC10idL3LIvyzUGdaxqz0jJW\", \"U*U*U*U*\" },\n  { \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.htnOkHgQ8LrcyWv4cQVE5Bt0DiVxJzG\", \"U*U*U*U*ignored\" },\n  { \"$2a$05$abcdefghijklmnopqrstuu\", \"$2a$05$abcdefghijklmnopqrstuu1JJvN7RoX92Zzq1yGezl/5/3vlXyrxi\", \"U*U*U*U*ignored\" },\n  { \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.7YCBkroPI7yK9JGre8Hne5hdwmA6Z3S\", \"U*U*U*U*ignored\" },\n  { \"$2a$04$abcdefghijklmnopqrstuu\", \"$2a$04$abcdefghijklmnopqrstuuc1KKQsfk4nXu9CnvuF/SfMwrmif7tsC\", \"U*U*U*U*ignored\" },\n  { \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.DzSBCMqe17IfGIqEfq.FrxykxqtrVi2\", \"*U*U*U*U\" },\n  { \"$2a$05$abcdefghijklmnopqrstuu\", \"$2a$05$abcdefghijklmnopqrstuuuzPVVNB/SAKLJbAoTgm3qolIt8JCyqG\", \"*U*U*U*U\" },\n  { \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.1fL1/3fOtt1usdRoe0dWgjAUT/TMd76\", \"*U*U*U*U\" },\n  { \"$2a$04$abcdefghijklmnopqrstuu\", \"$2a$04$abcdefghijklmnopqrstuu39YJ8HbI96dgaVWEUkKUCgXR4676Qjq\", \"*U*U*U*U\" },\n  { \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.yu/PNF5atjbvgp2r9GyRzSYOErUPNHq\", \"*U*U*U*U*\" },\n  { \"$2a$05$abcdefghijklmnopqrstuu\", \"$2a$05$abcdefghijklmnopqrstuuZu/4jl7FZnNPiPunsfxbXLTBcZ4XPMe\", \"*U*U*U*U*\" },\n  { \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.YT6TwplC9qsDdIyZ4nZ.2STP1srJcv.\", \"*U*U*U*U*\" },\n  { \"$2a$04$abcdefghijklmnopqrstuu\", \"$2a$04$abcdefghijklmnopqrstuuQ6t3zlOYOUrJSlX7AdtXuuWd0hDhQiC\", \"*U*U*U*U*\" },\n  { \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.7Cc1PePc3H0bDi8khYlhX6PVDNBB0QK\", \"*U*U*U*U*U*U*U*U\" },\n  { \"$2a$05$abcdefghijklmnopqrstuu\", \"$2a$05$abcdefghijklmnopqrstuuwd22F2Sxe6gq2OS.jcQfMBY2dJtwKyS\", \"*U*U*U*U*U*U*U*U\" },\n  { \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.AYh0eQgGLbt9qiP1jMH9.zHrUuVNY5.\", \"*U*U*U*U*U*U*U*U\" },\n  { \"$2a$04$abcdefghijklmnopqrstuu\", \"$2a$04$abcdefghijklmnopqrstuui4ZHqA63Ft09xDrL31aaZvJ3RjuITQq\", \"*U*U*U*U*U*U*U*U\" },\n  { \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.jlPoM5ioW.OQLW.5JcdEmo4HtRjF876\", \"*U*U*U*U*U*U*U*U*\" },\n  { \"$2a$05$abcdefghijklmnopqrstuu\", \"$2a$05$abcdefghijklmnopqrstuuz3ESgmDkKJlK0Nuq2.ylqgmDHlpC38q\", \"*U*U*U*U*U*U*U*U*\" },\n  { \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.scf6.mexwrzCAGi3ShQ8cYkynqeH0bK\", \"*U*U*U*U*U*U*U*U*\" },\n  { \"$2a$04$abcdefghijklmnopqrstuu\", \"$2a$04$abcdefghijklmnopqrstuuQLykgCNxKyLhRD0HXzLibuZLZfiGOEO\", \"*U*U*U*U*U*U*U*U*\" },\n  { \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.BvtRGGx3p8o0C5C36uS442Qqnrwofrq\", \"\\xa3\" },\n  { \"$2a$05$abcdefghijklmnopqrstuu\", \"$2a$05$abcdefghijklmnopqrstuuEuEnx.TyCLYgkTV/uhWL5xJTHV7ZMjG\", \"\\xa3\" },\n  { \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.nCdKcLO57oLlc6J6sNnGyfT9FrIawiW\", \"\\xa3\" },\n  { \"$2a$04$abcdefghijklmnopqrstuu\", \"$2a$04$abcdefghijklmnopqrstuurz1efvzeJjL4mQ813hrZNg3p1.ivOii\", \"\\xa3\" },\n  { \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.k786rdsOdUP4cRi.dLa3dsYueMj5UnS\", \"\\xa3\"\"a\" },\n  { \"$2a$05$abcdefghijklmnopqrstuu\", \"$2a$05$abcdefghijklmnopqrstuuLN/CEHXLfFeYdOOxbdxKu8ZqSIKgqAu\", \"\\xa3\"\"a\" },\n  { \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.4QrucGf30zIbQA.sO0d1QrU63xBrEYq\", \"\\xa3\"\"a\" },\n  { \"$2a$04$abcdefghijklmnopqrstuu\", \"$2a$04$abcdefghijklmnopqrstuugbhoNOH4mWxoEhRrQNdeI.rpk9XeuZS\", \"\\xa3\"\"a\" },\n  { \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.1qOUgfpg30XDHLx/zrbWiMRcWyFhwye\", \"\\xd1\\x91\" },\n  { \"$2a$05$abcdefghijklmnopqrstuu\", \"$2a$05$abcdefghijklmnopqrstuus6h1E6A2RzVn2KxXLQXsKosQeRo8bLa\", \"\\xd1\\x91\" },\n  { \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.7UwHe/ywPmdp.nr.ZLQSxd8hqn7qURW\", \"\\xd1\\x91\" },\n  { \"$2a$04$abcdefghijklmnopqrstuu\", \"$2a$04$abcdefghijklmnopqrstuuSqNATdQiNEckAKLsqgsKbAM5.hZoMCq\", \"\\xd1\\x91\" },\n  { \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.bJFOmj3TaByM10X0BF32w0Fv/xFNSvm\", \"\\xa3\"\"ab\" },\n  { \"$2a$05$abcdefghijklmnopqrstuu\", \"$2a$05$abcdefghijklmnopqrstuuojaU9K.vmSlY6BHpgIQ/WY9rEOCcJO2\", \"\\xa3\"\"ab\" },\n  { \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.0EeTSP42yLfD7uTTcDffPd2CNLKHdoy\", \"\\xa3\"\"ab\" },\n  { \"$2a$04$abcdefghijklmnopqrstuu\", \"$2a$04$abcdefghijklmnopqrstuuikYh/9nIvugTp.kFPFeZDBu7eW6BLoa\", \"\\xa3\"\"ab\" },\n  { \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.euRNRfAA6e0fjpTfQPPAMU1PCOf9IHq\", \"\\xff\\xff\\xa3\" },\n  { \"$2a$05$abcdefghijklmnopqrstuu\", \"$2a$05$abcdefghijklmnopqrstuu5jlqAXzFdq.3//pJFBa432Pepsclbdu\", \"\\xff\\xff\\xa3\" },\n  { \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.h87NWu/js59XXaIj1hDyHxnjw7MJ5K6\", \"\\xff\\xff\\xa3\" },\n  { \"$2a$04$abcdefghijklmnopqrstuu\", \"$2a$04$abcdefghijklmnopqrstuuZQhQBRpiYJCaQFgyHlB.t/F01cqLCIu\", \"\\xff\\xff\\xa3\" },\n  { \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.RbKkfW2ph8bd8B5yul5E97DxgDw9cT.\", \"1\\xa3\"\"345\" },\n  { \"$2a$05$abcdefghijklmnopqrstuu\", \"$2a$05$abcdefghijklmnopqrstuurPSVExmrZ2WB1xntSbqZ/DRQRlKtVw.\", \"1\\xa3\"\"345\" },\n  { \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.XEhidoDX1kz.RFnwWIzMJvtW2aP/k4e\", \"1\\xa3\"\"345\" },\n  { \"$2a$04$abcdefghijklmnopqrstuu\", \"$2a$04$abcdefghijklmnopqrstuuXl2V4mQ7s0zX0b4XXH/b9UkRRCWpq3e\", \"1\\xa3\"\"345\" },\n  { \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.WI7ZNXFtzCd9mN1mWoNMQRHEmkDsZnm\", \"\\xff\\xa3\"\"345\" },\n  { \"$2a$05$abcdefghijklmnopqrstuu\", \"$2a$05$abcdefghijklmnopqrstuu6WgD2zYQDPgxR2sXlUeEeGKknxt95W.\", \"\\xff\\xa3\"\"345\" },\n  { \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.KBv1eBM2he2T/QheS8zPHMejn5fMNRe\", \"\\xff\\xa3\"\"345\" },\n  { \"$2a$04$abcdefghijklmnopqrstuu\", \"$2a$04$abcdefghijklmnopqrstuuUIzecIiCguM2sPh1F7L9IS3zOtmg5Im\", \"\\xff\\xa3\"\"345\" },\n  { \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.vrukkCtLqHBLoBDsz6QoBtSwzI9Qxiq\", \"\\xff\\xa3\"\"34\\xff\\xff\\xff\\xa3\"\"345\" },\n  { \"$2a$05$abcdefghijklmnopqrstuu\", \"$2a$05$abcdefghijklmnopqrstuu7N5c8AaH.dbqz7.2o.V2mRkUDV0TZnO\", \"\\xff\\xa3\"\"34\\xff\\xff\\xff\\xa3\"\"345\" },\n  { \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.D8jTC5oJeIumVOhMVpz79BzoGVhCjrW\", \"\\xff\\xa3\"\"34\\xff\\xff\\xff\\xa3\"\"345\" },\n  { \"$2a$04$abcdefghijklmnopqrstuu\", \"$2a$04$abcdefghijklmnopqrstuuE8Lpo1/qkGPTBDBxEsJjeEzh9nkZ9uW\", \"\\xff\\xa3\"\"34\\xff\\xff\\xff\\xa3\"\"345\" },\n  { \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.xGPMyJSPyyeICKolPQ2gecm8rOgHwz.\", \"U\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xff\" },\n  { \"$2a$05$abcdefghijklmnopqrstuu\", \"$2a$05$abcdefghijklmnopqrstuuuTNb9MEHVGI7kd6UnQjYxgRNiKJM01S\", \"U\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xff\" },\n  { \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.k.qekGiJym3QgfeFCwNhPHg0Zk99KSa\", \"U\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xff\" },\n  { \"$2a$04$abcdefghijklmnopqrstuu\", \"$2a$04$abcdefghijklmnopqrstuuyM59Cq5iVZDB3u45gTNhRSnOgrY1tdG\", \"U\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xff\" },\n  { \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.VAQY6kySmwStlNY.sut9Y87njVr0mm.\", \"\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\" },\n  { \"$2a$05$abcdefghijklmnopqrstuu\", \"$2a$05$abcdefghijklmnopqrstuuPPtdI0NcxZ4Txyv/Y5ORfcP1XFriKT2\", \"\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\" },\n  { \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.tHwehGUs3q0b/Ejn42MsoM4Yv/iA1rq\", \"\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\" },\n  { \"$2a$04$abcdefghijklmnopqrstuu\", \"$2a$04$abcdefghijklmnopqrstuu3cFqlEl7Y0HWaVLHpyyCqG8dBNk1DSm\", \"\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\" },\n  { \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.n2VnrmAaokJwiDSekcCjbZxRIyVngRy\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\" },\n  { \"$2a$05$abcdefghijklmnopqrstuu\", \"$2a$05$abcdefghijklmnopqrstuu5s2v8.iXieOjg/.AySBTTZIIVFJeBui\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\" },\n  { \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.0ZsAfF0DsSCOCcfZKxtwXxkV4RFYBVG\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\" },\n  { \"$2a$04$abcdefghijklmnopqrstuu\", \"$2a$04$abcdefghijklmnopqrstuuRAip/W0RPQX4QKkqYqXE3GIXWH518Sm\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\" },\n  { \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.n2VnrmAaokJwiDSekcCjbZxRIyVngRy\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789chars after 72 are ignored\" },\n  { \"$2a$05$abcdefghijklmnopqrstuu\", \"$2a$05$abcdefghijklmnopqrstuu5s2v8.iXieOjg/.AySBTTZIIVFJeBui\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789chars after 72 are ignored\" },\n  { \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.0ZsAfF0DsSCOCcfZKxtwXxkV4RFYBVG\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789chars after 72 are ignored\" },\n  { \"$2a$04$abcdefghijklmnopqrstuu\", \"$2a$04$abcdefghijklmnopqrstuuRAip/W0RPQX4QKkqYqXE3GIXWH518Sm\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789chars after 72 are ignored\" },\n  { \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.ZkQGqjbMpqQ9oCsxNZjN8LQJaHFqPMC\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\" },\n  { \"$2a$05$abcdefghijklmnopqrstuu\", \"$2a$05$abcdefghijklmnopqrstuu51cV.PJOQVwmiao4t4lXsb9Cc3Jnuem\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\" },\n  { \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.DQjlTXDA5PBQ97.qBJY/vsHPQhLJDMe\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\" },\n  { \"$2a$04$abcdefghijklmnopqrstuu\", \"$2a$04$abcdefghijklmnopqrstuuAqM0XavJxJXeVlJ3Te3umGJaPOCYmZi\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\" },\n  { \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.ZkQGqjbMpqQ9oCsxNZjN8LQJaHFqPMC\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\"\"chars after 72 are ignored as usual\" },\n  { \"$2a$05$abcdefghijklmnopqrstuu\", \"$2a$05$abcdefghijklmnopqrstuu51cV.PJOQVwmiao4t4lXsb9Cc3Jnuem\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\"\"chars after 72 are ignored as usual\" },\n  { \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.DQjlTXDA5PBQ97.qBJY/vsHPQhLJDMe\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\"\"chars after 72 are ignored as usual\" },\n  { \"$2a$04$abcdefghijklmnopqrstuu\", \"$2a$04$abcdefghijklmnopqrstuuAqM0XavJxJXeVlJ3Te3umGJaPOCYmZi\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\"\"chars after 72 are ignored as usual\" },\n  { \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.RURfiuM5wAc5Jv4SO604mh/l3NurIoq\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has forgotten.\" },\n  { \"$2a$05$abcdefghijklmnopqrstuu\", \"$2a$05$abcdefghijklmnopqrstuu6v4sW.Jh71LP6RHjCG1iTdKjHpi8Az2\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has forgotten.\" },\n  { \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.NNYMcLQ7lIauYt0h6mWJtoSyBZqwBwi\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has forgotten.\" },\n  { \"$2a$04$abcdefghijklmnopqrstuu\", \"$2a$04$abcdefghijklmnopqrstuuZgFC0hc.gvORKBIExxdbXTGVmt0vRFW\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has forgotten.\" },\n  { \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.uB1no1bSvQlNFbG6DThB52xIhyG9z8G\", \"THE YEAR\" },\n  { \"$2a$05$abcdefghijklmnopqrstuu\", \"$2a$05$abcdefghijklmnopqrstuuySE45JP/avbudkXbPzjvqTBKf61NNfi\", \"THE YEAR\" },\n  { \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.c/NBil2GQ9h1axG3uDE7cen7O1yt4wu\", \"THE YEAR\" },\n  { \"$2a$04$abcdefghijklmnopqrstuu\", \"$2a$04$abcdefghijklmnopqrstuuT4fz1ym9dcyOwa1hMmFJSuk4yISb03.\", \"THE YEAR\" },\n  { \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.RURfiuM5wAc5Jv4SO604mh/l3NurIoq\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and do\" },\n  { \"$2a$05$abcdefghijklmnopqrstuu\", \"$2a$05$abcdefghijklmnopqrstuu6v4sW.Jh71LP6RHjCG1iTdKjHpi8Az2\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and do\" },\n  { \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.NNYMcLQ7lIauYt0h6mWJtoSyBZqwBwi\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and do\" },\n  { \"$2a$04$abcdefghijklmnopqrstuu\", \"$2a$04$abcdefghijklmnopqrstuuZgFC0hc.gvORKBIExxdbXTGVmt0vRFW\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and do\" },\n  { \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$05$CCCCCCCCCCCCCCCCCCCCC.RURfiuM5wAc5Jv4SO604mh/l3NurIoq\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has f\" },\n  { \"$2a$05$abcdefghijklmnopqrstuu\", \"$2a$05$abcdefghijklmnopqrstuu6v4sW.Jh71LP6RHjCG1iTdKjHpi8Az2\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has f\" },\n  { \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2a$04$CCCCCCCCCCCCCCCCCCCCC.NNYMcLQ7lIauYt0h6mWJtoSyBZqwBwi\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has f\" },\n  { \"$2a$04$abcdefghijklmnopqrstuu\", \"$2a$04$abcdefghijklmnopqrstuuZgFC0hc.gvORKBIExxdbXTGVmt0vRFW\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has f\" },\n#endif // bcrypt_a\n\n#if INCLUDE_bcrypt_x && defined TEST_bcrypt_x\n  { \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.7uG0VCzI2bS7j6ymqJi9CdcdxiRTWNy\", \"\" },\n  { \"$2x$05$abcdefghijklmnopqrstuu\", \"$2x$05$abcdefghijklmnopqrstuu0oImNDIy4flhldV9YqunRgBAePKmw7m\", \"\" },\n  { \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.Cg0ly9t/KVBCBYYDfOmZKwry9JuXClC\", \"\" },\n  { \"$2x$04$abcdefghijklmnopqrstuu\", \"$2x$04$abcdefghijklmnopqrstuubyCG3zY1GIXMyxfivm.ClDiInHzxjiq\", \"\" },\n  { \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.REUe.wVCLEE7cNcWpheIXR9MaRPCoVC\", \" \" },\n  { \"$2x$05$abcdefghijklmnopqrstuu\", \"$2x$05$abcdefghijklmnopqrstuueHjTs35M4oLkB0oz2vpFCrkqmB3wDyK\", \" \" },\n  { \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.QK3io8Pm4WhsBSZhzvm1OPPQ1MU.WxC\", \" \" },\n  { \"$2x$04$abcdefghijklmnopqrstuu\", \"$2x$04$abcdefghijklmnopqrstuu/ied6LYDv4Nek.n8vXq7pbx7mJcRizO\", \" \" },\n  { \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.crbyEJ0XFaJ9sONRyOTHdI7c4ZT.ndu\", \"a\" },\n  { \"$2x$05$abcdefghijklmnopqrstuu\", \"$2x$05$abcdefghijklmnopqrstuu8.veTXNDPV2eEsdpKNczMw2otgh5LnK\", \"a\" },\n  { \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.f/Fm9DOYGp2ai9rjxvG4QHlhtDCuDuu\", \"a\" },\n  { \"$2x$04$abcdefghijklmnopqrstuu\", \"$2x$04$abcdefghijklmnopqrstuuMFdJu9yVgmagVAIC24fOZkaFqd3s9JC\", \"a\" },\n  { \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.w5.fxtwCNbJ3swM5YKT2SoO0YcCOkhS\", \"ab\" },\n  { \"$2x$05$abcdefghijklmnopqrstuu\", \"$2x$05$abcdefghijklmnopqrstuu0EJam7uq2UHswNA05epRm6fJdiFmbUi\", \"ab\" },\n  { \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.ThcCpjPKXmu6XgQqJJEGokAiEUquQVe\", \"ab\" },\n  { \"$2x$04$abcdefghijklmnopqrstuu\", \"$2x$04$abcdefghijklmnopqrstuu0CkeIeZLJOlOL1QPPhfXulLNPdFqJBW\", \"ab\" },\n  { \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.gNn9EDJdrUJF53AHnb.4T9BCvqhUYdW\", \"abc\" },\n  { \"$2x$05$abcdefghijklmnopqrstuu\", \"$2x$05$abcdefghijklmnopqrstuuRWUgMyyCUnsDr8evYotXg5ZXVF/HhzS\", \"abc\" },\n  { \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.AKurti2nSiRoaXd0tyyeWA.1jj9Kto2\", \"abc\" },\n  { \"$2x$04$abcdefghijklmnopqrstuu\", \"$2x$04$abcdefghijklmnopqrstuuCi15uRb1eH7NAlJ/TgeJertyknQpYn2\", \"abc\" },\n  { \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.E5YPO9kmyuRGyh0XouQYb4YMJKvyOeW\", \"U*U\" },\n  { \"$2x$05$abcdefghijklmnopqrstuu\", \"$2x$05$abcdefghijklmnopqrstuuMpLhh66NJUQMuZ6FwRQX0sqAEKeWcKW\", \"U*U\" },\n  { \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.K7Qr0se1MxuggH4aP4YgB.U2Em1pGSK\", \"U*U\" },\n  { \"$2x$04$abcdefghijklmnopqrstuu\", \"$2x$04$abcdefghijklmnopqrstuuCFaEytnzrfaPZJKbS76hh9vqd9r8v2S\", \"U*U\" },\n  { \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.VGOzA784oUp/Z0DY336zx7pLYAy0lwK\", \"U*U*\" },\n  { \"$2x$05$abcdefghijklmnopqrstuu\", \"$2x$05$abcdefghijklmnopqrstuueqZzwRqX8BEsrV2jF8gx70v6bcd1qAG\", \"U*U*\" },\n  { \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.5dvsdVl2y/501tm9dvdbbSRbpuvxsaC\", \"U*U*\" },\n  { \"$2x$04$abcdefghijklmnopqrstuu\", \"$2x$04$abcdefghijklmnopqrstuuBtzXFXMcxIslxJptQaoJYuU.xP21coS\", \"U*U*\" },\n  { \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.Bw3BobdGs1SFsKsRLIx9rC4T.Q7DtEm\", \"U*U*U\" },\n  { \"$2x$05$abcdefghijklmnopqrstuu\", \"$2x$05$abcdefghijklmnopqrstuupkvHj1c6E382bN8hwXRlu1xE4bc1pgG\", \"U*U*U\" },\n  { \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.r2Gz4aKpQDpr6TmvEJksSv12hIDVgXe\", \"U*U*U\" },\n  { \"$2x$04$abcdefghijklmnopqrstuu\", \"$2x$04$abcdefghijklmnopqrstuuMJG4SPxGpsI2PpmiVYJg7D.hA7CdQyO\", \"U*U*U\" },\n  { \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.6YtT5mHh5I666KkHRqqIuteDuaNX1GS\", \".....\" },\n  { \"$2x$05$abcdefghijklmnopqrstuu\", \"$2x$05$abcdefghijklmnopqrstuun3YeQp9ZOh1qWiEKJNRybZT69WMr2sW\", \".....\" },\n  { \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.6v/P2K1bqBzj9FILn7LJntMzJQxUuA6\", \".....\" },\n  { \"$2x$04$abcdefghijklmnopqrstuu\", \"$2x$04$abcdefghijklmnopqrstuu7bnTzNnC9mpomsuya2sDYCcZGtW3FKu\", \".....\" },\n  { \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.LZrfN0lz4CULfFuRjqXiVMP49yNOHKi\", \"dragon\" },\n  { \"$2x$05$abcdefghijklmnopqrstuu\", \"$2x$05$abcdefghijklmnopqrstuuG4nizIsfFMB34Hh5MoYcbtdFUq5YPJK\", \"dragon\" },\n  { \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.tidtIFf5ZCN.gk6Mobs.YyDMzNhFfFm\", \"dragon\" },\n  { \"$2x$04$abcdefghijklmnopqrstuu\", \"$2x$04$abcdefghijklmnopqrstuujzhP54E3nDKxLTbGbyrFiW3EkV.7ERC\", \"dragon\" },\n  { \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.i7hPnfU5WycMwd1C9qJZDFBCw8NcAFu\", \"dRaGoN\" },\n  { \"$2x$05$abcdefghijklmnopqrstuu\", \"$2x$05$abcdefghijklmnopqrstuuMA7xTS.7H8Lal4RW.s8KBMURGOrPxQa\", \"dRaGoN\" },\n  { \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.5TqUWVAHsz4mvbAcNwu3JSwt7Pd.dm2\", \"dRaGoN\" },\n  { \"$2x$04$abcdefghijklmnopqrstuu\", \"$2x$04$abcdefghijklmnopqrstuuqS/OX35wGo1BfqluN8dsq//CyXY2pNS\", \"dRaGoN\" },\n  { \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.ZGVtQn6eTc3aPe.tQ.zJuH3XlzyI9Di\", \"DrAgOn\" },\n  { \"$2x$05$abcdefghijklmnopqrstuu\", \"$2x$05$abcdefghijklmnopqrstuuO5PYTf2OGllbJ1tyzjIAdpnQ9rUDGNC\", \"DrAgOn\" },\n  { \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.SzmeTH6T6GIGbKj9Om75UAlglaj4twK\", \"DrAgOn\" },\n  { \"$2x$04$abcdefghijklmnopqrstuu\", \"$2x$04$abcdefghijklmnopqrstuuE9zYHFcawnjSDJKsSux5hf1fyy3utXW\", \"DrAgOn\" },\n  { \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.u/WsPSagrbjc3QmFLSt6j9e/LJ8FoNm\", \"PAROLX\" },\n  { \"$2x$05$abcdefghijklmnopqrstuu\", \"$2x$05$abcdefghijklmnopqrstuuzyv2QWIljnSNjMYpSebmlCqn.QEGEB6\", \"PAROLX\" },\n  { \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.pQY3jmCmc/1Pk8B2m6DNUj9ANrzICLK\", \"PAROLX\" },\n  { \"$2x$04$abcdefghijklmnopqrstuu\", \"$2x$04$abcdefghijklmnopqrstuumicc49hlc3UdUYSMeE8ZXKFJcV/Q2Nm\", \"PAROLX\" },\n  { \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.7Knr9/jUQJ0lh8N4AU/fMnQskXCdfSu\", \"U*U***U\" },\n  { \"$2x$05$abcdefghijklmnopqrstuu\", \"$2x$05$abcdefghijklmnopqrstuu0whe22G2FGJcNLWQaY2ZVuZIf5IJBHK\", \"U*U***U\" },\n  { \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.H3n2rsAGLquD5DBiTNaKBEYcc0HJy5K\", \"U*U***U\" },\n  { \"$2x$04$abcdefghijklmnopqrstuu\", \"$2x$04$abcdefghijklmnopqrstuuDu3PK53XxhceAEiIIFWWlG16bn5LvcG\", \"U*U***U\" },\n  { \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.HjTkKOvb2xTYRqeMFaN1PRcxuDYro5y\", \"abcdefg\" },\n  { \"$2x$05$abcdefghijklmnopqrstuu\", \"$2x$05$abcdefghijklmnopqrstuu3NLAiMrV.ggY98aZ7cNIwxII7afa91.\", \"abcdefg\" },\n  { \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.GQNqYPSPnkqs4XPHOKxta8z3oVxx.Oe\", \"abcdefg\" },\n  { \"$2x$04$abcdefghijklmnopqrstuu\", \"$2x$04$abcdefghijklmnopqrstuuGTNT0Ri8Ic/nBhrRQu0ORxwctqE11mO\", \"abcdefg\" },\n  { \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.RFkLTR7KyUmGXnFvMFlLbB23MCIzsgi\", \"01234567\" },\n  { \"$2x$05$abcdefghijklmnopqrstuu\", \"$2x$05$abcdefghijklmnopqrstuuQOF57SPhYRiKufm4.epZm3ELZ4UlAVy\", \"01234567\" },\n  { \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.3uce2XN8xqrZ2aIduEu48JNEUk6ih9y\", \"01234567\" },\n  { \"$2x$04$abcdefghijklmnopqrstuu\", \"$2x$04$abcdefghijklmnopqrstuucnCKiuhmJV3sCjWqQH.rYNPhmru2Bfq\", \"01234567\" },\n  { \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.hz7CVP6wIj8Z57Ze7yuhrhzKfvq0Ty.\", \"726 even\" },\n  { \"$2x$05$abcdefghijklmnopqrstuu\", \"$2x$05$abcdefghijklmnopqrstuuIaVbx2I8MHKuu1rBc/gqV8Fo2An7wQm\", \"726 even\" },\n  { \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.ib/v2w9PynSZewkHDlSuFwGC.jkyh4a\", \"726 even\" },\n  { \"$2x$04$abcdefghijklmnopqrstuu\", \"$2x$04$abcdefghijklmnopqrstuus/VSIfP19Ty4eQaE51vB9GbPNmLhq2S\", \"726 even\" },\n  { \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.jUMW9ITlTfAw5cFja1iYihO7V9qsmWK\", \"zyxwvuts\" },\n  { \"$2x$05$abcdefghijklmnopqrstuu\", \"$2x$05$abcdefghijklmnopqrstuucN2On7GNyUtMxT..Bo0a0ICaTeQOJ4u\", \"zyxwvuts\" },\n  { \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.xf6Tlh/zfR9Qob4S/6wj9RneRcBt4yG\", \"zyxwvuts\" },\n  { \"$2x$04$abcdefghijklmnopqrstuu\", \"$2x$04$abcdefghijklmnopqrstuucqOWKor12VNz5REoX.a3GqgU2btIQWS\", \"zyxwvuts\" },\n  { \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.hdihJRIixUmRFFg0NQNaid9UF3Uw/Q.\", \"ab1234567\" },\n  { \"$2x$05$abcdefghijklmnopqrstuu\", \"$2x$05$abcdefghijklmnopqrstuulK6ChIvFKqdreUvOY9oKm2O2Fn.1Zuq\", \"ab1234567\" },\n  { \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.xq4CFi9Keo/OhWm9tosH45r9gI3Gd4C\", \"ab1234567\" },\n  { \"$2x$04$abcdefghijklmnopqrstuu\", \"$2x$04$abcdefghijklmnopqrstuuuBq8XeHGZZJdrs6jsgiLupxqOP4GLc6\", \"ab1234567\" },\n  { \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.0c9Eoia74tfCGVyINCZAcZaVzJdMsoi\", \"alexander\" },\n  { \"$2x$05$abcdefghijklmnopqrstuu\", \"$2x$05$abcdefghijklmnopqrstuu3qH73fcOvo6pdGd/u/Of.mkavvVviAG\", \"alexander\" },\n  { \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.bK5f5L/foC9KH3IYxj9uWGZPE/w22J2\", \"alexander\" },\n  { \"$2x$04$abcdefghijklmnopqrstuu\", \"$2x$04$abcdefghijklmnopqrstuu1zazepZSS74T7o4eCXaJqsa4KC41vt6\", \"alexander\" },\n  { \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.Tc9f8dMIa03zsepKEv1oSFsFWT84Me.\", \"beautiful\" },\n  { \"$2x$05$abcdefghijklmnopqrstuu\", \"$2x$05$abcdefghijklmnopqrstuusxVo.QMslOcijv585zolzUwesRGYfui\", \"beautiful\" },\n  { \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.7XxYg42754jz07Elen5lFQuommU7crW\", \"beautiful\" },\n  { \"$2x$04$abcdefghijklmnopqrstuu\", \"$2x$04$abcdefghijklmnopqrstuuHz11b40qtSU5.OKZJGONgmO6tsOw8ny\", \"beautiful\" },\n  { \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.SxOcYMxtg44jVOAYY0zBeTBbfCYXSBu\", \"challenge\" },\n  { \"$2x$05$abcdefghijklmnopqrstuu\", \"$2x$05$abcdefghijklmnopqrstuuD2bZx1XnT2xoC7mKx.Jr7E20hJXg5y.\", \"challenge\" },\n  { \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.mK3Hkg2ZFCrNFQRor1M7Bd.pyBSFz56\", \"challenge\" },\n  { \"$2x$04$abcdefghijklmnopqrstuu\", \"$2x$04$abcdefghijklmnopqrstuu92OCZ/GwgJ2w0KrMJRu6fK7i2iKqYha\", \"challenge\" },\n  { \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.455yryJspofWOsWxxZ/Tsu5qtg8j2wm\", \"chocolate\" },\n  { \"$2x$05$abcdefghijklmnopqrstuu\", \"$2x$05$abcdefghijklmnopqrstuulZGdWs.WkvfSGHTz.1.5CPi2ETJLi3.\", \"chocolate\" },\n  { \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.N0Iumk1Mt6l7kbmk8iYgSA9FqaEfv5y\", \"chocolate\" },\n  { \"$2x$04$abcdefghijklmnopqrstuu\", \"$2x$04$abcdefghijklmnopqrstuuLbL252qaabO.sIFmAzyShKINVGRsGeu\", \"chocolate\" },\n  { \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.ZA//OMzj1MY4PfGODYfbeGs8HPUS2zq\", \"cr1234567\" },\n  { \"$2x$05$abcdefghijklmnopqrstuu\", \"$2x$05$abcdefghijklmnopqrstuuUccVOwN/r/34c2SICyLEwyfRWS4Vgja\", \"cr1234567\" },\n  { \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.8tZkJ2HTsa4Pn6bgGzpDRWJ8c1biGYu\", \"cr1234567\" },\n  { \"$2x$04$abcdefghijklmnopqrstuu\", \"$2x$04$abcdefghijklmnopqrstuuA.Ry5GZ8Ob/wI0r8UydZ6XfbyfLJ5JK\", \"cr1234567\" },\n  { \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.XyLDmzSo8jvTANPtIoCB164F84v8EkS\", \"katherine\" },\n  { \"$2x$05$abcdefghijklmnopqrstuu\", \"$2x$05$abcdefghijklmnopqrstuuOYRnTkqPmRfoAB/blXEA7y5xOBtiEg6\", \"katherine\" },\n  { \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.bsdSaZOaobkZJkNO2MxskcWIZCJ8btK\", \"katherine\" },\n  { \"$2x$04$abcdefghijklmnopqrstuu\", \"$2x$04$abcdefghijklmnopqrstuu5i6Sk8a0h8mpYFdjQZdYrEsLaxZ1EaG\", \"katherine\" },\n  { \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$05$CCCCCCCCCCCCCCCCCCCCC./cK5Kv8QvFDy9GyVbaJS/eEKlmhA6wW\", \"stephanie\" },\n  { \"$2x$05$abcdefghijklmnopqrstuu\", \"$2x$05$abcdefghijklmnopqrstuucK0uB5JOSYLNCq75/1vd9213cIwiEQi\", \"stephanie\" },\n  { \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.Yr8Btf/4dkO36VgY1VYAp6Q9B4.B/rm\", \"stephanie\" },\n  { \"$2x$04$abcdefghijklmnopqrstuu\", \"$2x$04$abcdefghijklmnopqrstuug3T9Nmp5d1Zd35nXtrYPiCSv8A6PVAu\", \"stephanie\" },\n  { \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.VYs2hleVmLTA.FbmrBwOI38C4Pd/8BS\", \"sunflower\" },\n  { \"$2x$05$abcdefghijklmnopqrstuu\", \"$2x$05$abcdefghijklmnopqrstuuY/44p2UkK4uV0kvS9KurVonsOh/oc5m\", \"sunflower\" },\n  { \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.VuKIcBGfiLx.AYuX6c48oQtlhMCQPRq\", \"sunflower\" },\n  { \"$2x$04$abcdefghijklmnopqrstuu\", \"$2x$04$abcdefghijklmnopqrstuul18yFhC69sq/WwO8ibiE1VQy773yVfu\", \"sunflower\" },\n  { \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.465.cDVHqgo4g9qBZIbQbOcdcGqRs2O\", \"basketball\" },\n  { \"$2x$05$abcdefghijklmnopqrstuu\", \"$2x$05$abcdefghijklmnopqrstuuFT2m2RbIlbhkAJBfZ3FCN3Sn3V.N4Bm\", \"basketball\" },\n  { \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.R293rqybpDGrtZIhZxApKqVLXiOJUTG\", \"basketball\" },\n  { \"$2x$04$abcdefghijklmnopqrstuu\", \"$2x$04$abcdefghijklmnopqrstuudp7.T6JYoR2jjqAKGX8kDLzPDm6RR3S\", \"basketball\" },\n  { \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.XUKWvx5JT0wYalbOFE4HU.j3lDUpDcm\", \"porsche911\" },\n  { \"$2x$05$abcdefghijklmnopqrstuu\", \"$2x$05$abcdefghijklmnopqrstuupKJ./ES4uwzJk/SsN3YaTFdl9AIiAdu\", \"porsche911\" },\n  { \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.jgOl9b/oD1cEHohzVyGK6zqcGccVRBG\", \"porsche911\" },\n  { \"$2x$04$abcdefghijklmnopqrstuu\", \"$2x$04$abcdefghijklmnopqrstuuVXo2ooNppOi53FnAHCUuZp8EyiwUoCi\", \"porsche911\" },\n  { \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.sXCEcM/a6jUtNpF7EFCOWiQRogVPxNW\", \"|_337T`/p3\" },\n  { \"$2x$05$abcdefghijklmnopqrstuu\", \"$2x$05$abcdefghijklmnopqrstuugZjL4p/g0M.xDKdvzvO1BKtO0aYdnwC\", \"|_337T`/p3\" },\n  { \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.UyHWsohI3G2oJ05vftc06k9UIwXNW4a\", \"|_337T`/p3\" },\n  { \"$2x$04$abcdefghijklmnopqrstuu\", \"$2x$04$abcdefghijklmnopqrstuuh7AZQzpU7Q7C5l4VczvD6UVfhLQVCDK\", \"|_337T`/p3\" },\n  { \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.ScdVt/vv5qxU5Weko6ZqQcaHw2EjuRG\", \"thunderbird\" },\n  { \"$2x$05$abcdefghijklmnopqrstuu\", \"$2x$05$abcdefghijklmnopqrstuuhX1c3kKr2qeB4tFvvRmDk/ta3LTQtma\", \"thunderbird\" },\n  { \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.XXuNspXmlmLMqkZ37Xt0om56PIqSupq\", \"thunderbird\" },\n  { \"$2x$04$abcdefghijklmnopqrstuu\", \"$2x$04$abcdefghijklmnopqrstuuSJB.YmarGme5IjgFBN49eRn74KS.zVC\", \"thunderbird\" },\n  { \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.z6PrHbuSsMSSwIGFy1JGevQZf6CqJ1y\", \"Hello world!\" },\n  { \"$2x$05$abcdefghijklmnopqrstuu\", \"$2x$05$abcdefghijklmnopqrstuu7nFISH/8YdwlXD3lw69A4iBUf6fvWAW\", \"Hello world!\" },\n  { \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.M.JZM2tZUe85sR83hfk5p2NZ0IVXwXe\", \"Hello world!\" },\n  { \"$2x$04$abcdefghijklmnopqrstuu\", \"$2x$04$abcdefghijklmnopqrstuuyeG8laUfZvsCmc.AE6qIDYSPGM2efmK\", \"Hello world!\" },\n  { \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.cTKgEgC.g8ePpbyZbNC34HvEm4dr75a\", \"pleaseletmein\" },\n  { \"$2x$05$abcdefghijklmnopqrstuu\", \"$2x$05$abcdefghijklmnopqrstuu2EjsH9/6E2HK9wvYowfGqPX5wGi4UDS\", \"pleaseletmein\" },\n  { \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.3WPQy/x8EhyouO1Eia.f.CS216k/lTq\", \"pleaseletmein\" },\n  { \"$2x$04$abcdefghijklmnopqrstuu\", \"$2x$04$abcdefghijklmnopqrstuumH1BFkDxi3LKCbP6FQ2juPgiLLcuV6S\", \"pleaseletmein\" },\n  { \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.UTQ/YCMF16uRDggIHAnzfTGA1GG/5.K\", \"a short string\" },\n  { \"$2x$05$abcdefghijklmnopqrstuu\", \"$2x$05$abcdefghijklmnopqrstuuZM773JiyU8IodKIqJ54EAWHzd/nJoF6\", \"a short string\" },\n  { \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.nks3nTLHIdR6yOhEvQZRsOoYVEqWOtW\", \"a short string\" },\n  { \"$2x$04$abcdefghijklmnopqrstuu\", \"$2x$04$abcdefghijklmnopqrstuu.oBhtv6clsTihZTgUKW34dikJs1Zg1y\", \"a short string\" },\n  { \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.gBXVnji0fmYJspngWLhq07sJA.unyGS\", \"zxyDPWgydbQjgq\" },\n  { \"$2x$05$abcdefghijklmnopqrstuu\", \"$2x$05$abcdefghijklmnopqrstuuGbGKxJ6BsCRT7AGpwiKNOKUzJzb5AA.\", \"zxyDPWgydbQjgq\" },\n  { \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.6vf3XUm.amMyfSlIH2P/SIU5V6p644a\", \"zxyDPWgydbQjgq\" },\n  { \"$2x$04$abcdefghijklmnopqrstuu\", \"$2x$04$abcdefghijklmnopqrstuukgPMil1AyxXOwqj9OWvu3muVwEMg1Aq\", \"zxyDPWgydbQjgq\" },\n  { \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.8TeQYvjyS9VKUlqSLz.kDaRa5v396hC\", \"photojournalism\" },\n  { \"$2x$05$abcdefghijklmnopqrstuu\", \"$2x$05$abcdefghijklmnopqrstuuhJe3S.rJQghSggwRY8.DQE1zCW18PcG\", \"photojournalism\" },\n  { \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.1h1LaJMlvaH2Defb280WzG6X/kqHQQy\", \"photojournalism\" },\n  { \"$2x$04$abcdefghijklmnopqrstuu\", \"$2x$04$abcdefghijklmnopqrstuugpKNM0gEaEfwZ43UsjoT1tNLK25mqV6\", \"photojournalism\" },\n  { \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$05$CCCCCCCCCCCCCCCCCCCCC./fog6ND8iIMkWXIpr.Y6LCOndkFsu/m\", \"ecclesiastically\" },\n  { \"$2x$05$abcdefghijklmnopqrstuu\", \"$2x$05$abcdefghijklmnopqrstuuDUj/hoyzOfsxHnlzXPdMGJybsJgbODG\", \"ecclesiastically\" },\n  { \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.AYMycNr126P8pzb9X2aVQjINCiZadp2\", \"ecclesiastically\" },\n  { \"$2x$04$abcdefghijklmnopqrstuu\", \"$2x$04$abcdefghijklmnopqrstuuOt9ERn2.X0reuqDc7blRS.5f8ttIq3a\", \"ecclesiastically\" },\n  { \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.dsZw45vJh0v/SWcvr.H79lmJF/uZKAy\", \"congregationalism\" },\n  { \"$2x$05$abcdefghijklmnopqrstuu\", \"$2x$05$abcdefghijklmnopqrstuuZu0OqjIDqSsvpAvbAqbC.8HRlYYcVkW\", \"congregationalism\" },\n  { \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.1CYpRB/IxktadiLrbTzgJ.Jd/Q06oBe\", \"congregationalism\" },\n  { \"$2x$04$abcdefghijklmnopqrstuu\", \"$2x$04$abcdefghijklmnopqrstuulau/kOpHdl7CjZgjQuvsiDAB2f/8Aqa\", \"congregationalism\" },\n  { \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.aHkGX/fiki8Qrwu3gWTRnejC9Hba52e\", \"dihydrosphingosine\" },\n  { \"$2x$05$abcdefghijklmnopqrstuu\", \"$2x$05$abcdefghijklmnopqrstuuEJAH.2Z6lOSn5WvfN87I7V1JhCPsW5y\", \"dihydrosphingosine\" },\n  { \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.8obhdpTZ2CAxc8Qbd8dIApwIFM6pzZe\", \"dihydrosphingosine\" },\n  { \"$2x$04$abcdefghijklmnopqrstuu\", \"$2x$04$abcdefghijklmnopqrstuu3tvUtVPx0FPXPsdjb7uta674As4iQfq\", \"dihydrosphingosine\" },\n  { \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.sYSxc3RiA3.WrH2ic000nunk3yqkXHa\", \"semianthropological\" },\n  { \"$2x$05$abcdefghijklmnopqrstuu\", \"$2x$05$abcdefghijklmnopqrstuuLa.VWC3vq9KMn0BrxUY.r4HUotKepnO\", \"semianthropological\" },\n  { \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.tLQTlKtJqj8kJFe92LPFDJdoiTxQ9PO\", \"semianthropological\" },\n  { \"$2x$04$abcdefghijklmnopqrstuu\", \"$2x$04$abcdefghijklmnopqrstuu6yC/otJXGOxvYDo3uRwUKNucauhdOPO\", \"semianthropological\" },\n  { \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.Kvy1q1BWf93W1T7eSLpj/6OuRO.4FqC\", \"palaeogeographically\" },\n  { \"$2x$05$abcdefghijklmnopqrstuu\", \"$2x$05$abcdefghijklmnopqrstuuYNeqeSEZQQFODdHVEfj5MJFvrZPOeF6\", \"palaeogeographically\" },\n  { \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.ybSWdRvitEQlA9I.Oq9wpqMqvBcJiti\", \"palaeogeographically\" },\n  { \"$2x$04$abcdefghijklmnopqrstuu\", \"$2x$04$abcdefghijklmnopqrstuu1POIcCAIthmV0dvj5BClL3hMpuuUctO\", \"palaeogeographically\" },\n  { \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.g7bhq.l6.ix6BSpqhW6wIRoq310s.qO\", \"electromyographically\" },\n  { \"$2x$05$abcdefghijklmnopqrstuu\", \"$2x$05$abcdefghijklmnopqrstuuFj/NgndkQJ9QWdR8vDPZF92Ql/3UYFy\", \"electromyographically\" },\n  { \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.rnGfJV5/J4BjTZj66R1dckO0Gy88d5e\", \"electromyographically\" },\n  { \"$2x$04$abcdefghijklmnopqrstuu\", \"$2x$04$abcdefghijklmnopqrstuui7gF3bPS07zaLzWARBCVakWoF70OE8K\", \"electromyographically\" },\n  { \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.fr2hBCxymAKP.MXKdQbm7/rIBEBis9y\", \"noninterchangeableness\" },\n  { \"$2x$05$abcdefghijklmnopqrstuu\", \"$2x$05$abcdefghijklmnopqrstuueL38vMSpfDTZP0TBBAuZDp0A/4eFDFa\", \"noninterchangeableness\" },\n  { \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.z1xt/vCOI.kmvN8L8t9GsafzGsOXupS\", \"noninterchangeableness\" },\n  { \"$2x$04$abcdefghijklmnopqrstuu\", \"$2x$04$abcdefghijklmnopqrstuuR1nrUOQ7HQO0AfPt3niv6JJN90IEgi2\", \"noninterchangeableness\" },\n  { \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.UwjPIUFoFVfh.JD5Z/iVMDQ/.s2BdmK\", \"abcdefghijklmnopqrstuvwxyz\" },\n  { \"$2x$05$abcdefghijklmnopqrstuu\", \"$2x$05$abcdefghijklmnopqrstuuq9gWjWvJAAO9dtIxbLejROlOtpZkAZ2\", \"abcdefghijklmnopqrstuvwxyz\" },\n  { \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.2qEx6VDzW/1gZVPz1yxtxnopI9gvYHG\", \"abcdefghijklmnopqrstuvwxyz\" },\n  { \"$2x$04$abcdefghijklmnopqrstuu\", \"$2x$04$abcdefghijklmnopqrstuucUHlaG.p8AVcD5w/eidx9TAkwV4EXAW\", \"abcdefghijklmnopqrstuvwxyz\" },\n  { \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.BdcD8qjQ3jCap/PcGpUCiau8u4PMcSy\", \"electroencephalographically\" },\n  { \"$2x$05$abcdefghijklmnopqrstuu\", \"$2x$05$abcdefghijklmnopqrstuuXDAnjJaWDI/Zcl0Om1uOs90q4mqBRWy\", \"electroencephalographically\" },\n  { \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.n1A7hL3v/hM0RBTwKl/MB.eEE0e4av2\", \"electroencephalographically\" },\n  { \"$2x$04$abcdefghijklmnopqrstuu\", \"$2x$04$abcdefghijklmnopqrstuuvcwFX7UZ8m2DKl4e6qPHdONvRVRgApi\", \"electroencephalographically\" },\n  { \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.9WsvENLhmOLqpxNHHDPzl0/i3I0QLXy\", \"antidisestablishmentarianism\" },\n  { \"$2x$05$abcdefghijklmnopqrstuu\", \"$2x$05$abcdefghijklmnopqrstuuNq0IwONJZaZ7QfLbcoA7E.G9LXdQ.8.\", \"antidisestablishmentarianism\" },\n  { \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.WM1vtlGv4CR1StKJWw9/1zvZjhQpVm2\", \"antidisestablishmentarianism\" },\n  { \"$2x$04$abcdefghijklmnopqrstuu\", \"$2x$04$abcdefghijklmnopqrstuu.Nk99xH6C1i1s687VYJkw/9TgJZwvkW\", \"antidisestablishmentarianism\" },\n  { \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.9vgB/QG0/5yJ0/eI2lb6I1NvMoYZHEi\", \"cyclotrimethylenetrinitramine\" },\n  { \"$2x$05$abcdefghijklmnopqrstuu\", \"$2x$05$abcdefghijklmnopqrstuuwOuvuEB8yOWqrtta0jWB10wzwfcx.sG\", \"cyclotrimethylenetrinitramine\" },\n  { \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.mumkbiG5cCSVfxbwD8LbcQV6CFQ3MXq\", \"cyclotrimethylenetrinitramine\" },\n  { \"$2x$04$abcdefghijklmnopqrstuu\", \"$2x$04$abcdefghijklmnopqrstuukUEvmtjkKEjAeshmrzk18VIJ5pOYI9G\", \"cyclotrimethylenetrinitramine\" },\n  { \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.ld/W//3S8PyfCs05HnX4ctiJEWzxvtu\", \"dichlorodiphenyltrichloroethane\" },\n  { \"$2x$05$abcdefghijklmnopqrstuu\", \"$2x$05$abcdefghijklmnopqrstuuJaeloUBsLGuKojqNVj.JssS.S.5SOoG\", \"dichlorodiphenyltrichloroethane\" },\n  { \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.IJ0s8nV/cDKYfTVFgirVaOoRoZvbMAW\", \"dichlorodiphenyltrichloroethane\" },\n  { \"$2x$04$abcdefghijklmnopqrstuu\", \"$2x$04$abcdefghijklmnopqrstuuQBL3QBmqpQVj0lKsVoN/yVsN7LDfMom\", \"dichlorodiphenyltrichloroethane\" },\n  { \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.qgmN7ezpNt2mv7RXpV9nwxAwSRHe8Z6\", \"multiple words seperated by spaces\" },\n  { \"$2x$05$abcdefghijklmnopqrstuu\", \"$2x$05$abcdefghijklmnopqrstuuUyj6XHAnIT7HIUaHPt/mAqWbLOZ95oW\", \"multiple words seperated by spaces\" },\n  { \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.ya4OMfax14JgLKjCeRnok41QNmDHk.6\", \"multiple words seperated by spaces\" },\n  { \"$2x$04$abcdefghijklmnopqrstuu\", \"$2x$04$abcdefghijklmnopqrstuurps.S9nvQl/40RApzaFs9lIt3AMcneK\", \"multiple words seperated by spaces\" },\n  { \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.2CHByRiD9EoV4pN2mhPq49ZZhIg5K/.\", \"supercalifragilisticexpialidocious\" },\n  { \"$2x$05$abcdefghijklmnopqrstuu\", \"$2x$05$abcdefghijklmnopqrstuuchc4Fu0voJQx93SMHFKQgbDXESzxUai\", \"supercalifragilisticexpialidocious\" },\n  { \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.mqD8IRcEmTxZ.ChOQZyLHygiTWmqvk2\", \"supercalifragilisticexpialidocious\" },\n  { \"$2x$04$abcdefghijklmnopqrstuu\", \"$2x$04$abcdefghijklmnopqrstuuG9j0r2T6lEIX9LVt3txW9dZuFY0Ew1q\", \"supercalifragilisticexpialidocious\" },\n  { \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.pr..QUPolGyX.oqq.qgP8kNIbwX1YlC\", \"we have a short salt string but not a short password\" },\n  { \"$2x$05$abcdefghijklmnopqrstuu\", \"$2x$05$abcdefghijklmnopqrstuuwLVtPJcEI87Gw5SVMgJ3jR.jz4FXA3C\", \"we have a short salt string but not a short password\" },\n  { \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.S693iU5aWL1P1CiTvv4sKd4VtqEefpm\", \"we have a short salt string but not a short password\" },\n  { \"$2x$04$abcdefghijklmnopqrstuu\", \"$2x$04$abcdefghijklmnopqrstuus8h4uV7ZQW6KJvz2prsjqaySAO/1k2e\", \"we have a short salt string but not a short password\" },\n  { \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.VkOUUuotOZvrmtXJpkTGsRR7av5It52\", \"multiple word$ $eperated by $pace$ and $pecial character$\" },\n  { \"$2x$05$abcdefghijklmnopqrstuu\", \"$2x$05$abcdefghijklmnopqrstuuT837gAqiU/1zYnau8zpkZMploUCluwS\", \"multiple word$ $eperated by $pace$ and $pecial character$\" },\n  { \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.iNDvHP9V2K7P.xzMWcBO.ucnS87zUrq\", \"multiple word$ $eperated by $pace$ and $pecial character$\" },\n  { \"$2x$04$abcdefghijklmnopqrstuu\", \"$2x$04$abcdefghijklmnopqrstuu5RYaD3UZMA62Bfinm5QndpfWzruwF.O\", \"multiple word$ $eperated by $pace$ and $pecial character$\" },\n  { \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.8b67df7RZ0XnI62umy35MYpe4K51Fk2\", \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\" },\n  { \"$2x$05$abcdefghijklmnopqrstuu\", \"$2x$05$abcdefghijklmnopqrstuuW5igozlL8rSr/rkFexuDh1grrkW8FSi\", \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\" },\n  { \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.F3K5wiwHej.p9lTXgX9bOlrEyWKv066\", \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\" },\n  { \"$2x$04$abcdefghijklmnopqrstuu\", \"$2x$04$abcdefghijklmnopqrstuuViu5c2UpaacAGAhQuLE2zyrV3jz4b5e\", \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\" },\n  { \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.Td/f8oS7ISMxGfHYB8YP9rXGhoZDosO\", \"12345678901234567890123456789012345678901234567890123456789012345678901234567890\" },\n  { \"$2x$05$abcdefghijklmnopqrstuu\", \"$2x$05$abcdefghijklmnopqrstuuxuElans2nYY6zVSN13XYHtA0oeOXZLa\", \"12345678901234567890123456789012345678901234567890123456789012345678901234567890\" },\n  { \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.kLVEehyg8LFsXfIVuFyGfLj4dvN7a4e\", \"12345678901234567890123456789012345678901234567890123456789012345678901234567890\" },\n  { \"$2x$04$abcdefghijklmnopqrstuu\", \"$2x$04$abcdefghijklmnopqrstuuMNSliUjQvcDZoWAZHm/hAG9Z3ZRf5wy\", \"12345678901234567890123456789012345678901234567890123456789012345678901234567890\" },\n  { \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.4aisLqC2w3pT8aeXd3SHZFJkWSCkf0a\", \"a very much longer text to encrypt.  This one even stretches over morethan one line.\" },\n  { \"$2x$05$abcdefghijklmnopqrstuu\", \"$2x$05$abcdefghijklmnopqrstuuoBz.G9gMNiZlW/Gsj.oKhiomPeIRFTC\", \"a very much longer text to encrypt.  This one even stretches over morethan one line.\" },\n  { \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.9c/KG5wY7kGTdky/Js0KWIpuVuJFUJG\", \"a very much longer text to encrypt.  This one even stretches over morethan one line.\" },\n  { \"$2x$04$abcdefghijklmnopqrstuu\", \"$2x$04$abcdefghijklmnopqrstuuinRgQYMZk.yuMIssG.kPPL6i9WP0xFa\", \"a very much longer text to encrypt.  This one even stretches over morethan one line.\" },\n  { \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.j72N2Fi2j3pGalOZvTqtyH3bYGotuju\", \"\\xd0\\xc1\\xd2\\xcf\\xcc\\xd8\" },\n  { \"$2x$05$abcdefghijklmnopqrstuu\", \"$2x$05$abcdefghijklmnopqrstuuN5E4WSTo/R5henexIN1o8xkGwe2V86W\", \"\\xd0\\xc1\\xd2\\xcf\\xcc\\xd8\" },\n  { \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.tlD3cmtHgs/TwWAvy5E3F.freZS1bau\", \"\\xd0\\xc1\\xd2\\xcf\\xcc\\xd8\" },\n  { \"$2x$04$abcdefghijklmnopqrstuu\", \"$2x$04$abcdefghijklmnopqrstuuIZEWKJgp.b.KG29zgOadgd2rUt5iV1e\", \"\\xd0\\xc1\\xd2\\xcf\\xcc\\xd8\" },\n  { \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.ZH9vItRapPbkFKo0iQqU4v71o0e19Mm\", \"\\xd5\\xaa\\xd5\\xaa\\xaa\\xaa\\xd5\\xaa\" },\n  { \"$2x$05$abcdefghijklmnopqrstuu\", \"$2x$05$abcdefghijklmnopqrstuuzAUUWh4XGsBGYs6yyUJTSfEgzoLXO6G\", \"\\xd5\\xaa\\xd5\\xaa\\xaa\\xaa\\xd5\\xaa\" },\n  { \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.QiT.KUY9PXgIzL2aECMKb0EvVl0Pzw6\", \"\\xd5\\xaa\\xd5\\xaa\\xaa\\xaa\\xd5\\xaa\" },\n  { \"$2x$04$abcdefghijklmnopqrstuu\", \"$2x$04$abcdefghijklmnopqrstuufOj7giyJz5k22FHTKGVo8o1o5zGzPsq\", \"\\xd5\\xaa\\xd5\\xaa\\xaa\\xaa\\xd5\\xaa\" },\n  { \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.2M7Vc.sF98e8DDmnxFjRfAmrudbv6y.\", \"\\xe1\\xec\\xe5\\xf8\\xe1\\xee\\xe4\\xe5\\xf2\" },\n  { \"$2x$05$abcdefghijklmnopqrstuu\", \"$2x$05$abcdefghijklmnopqrstuuC3nvb4DotHdnRYgOPcdiK0C4q.DkIDO\", \"\\xe1\\xec\\xe5\\xf8\\xe1\\xee\\xe4\\xe5\\xf2\" },\n  { \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.6He0iAS8JsdM.iB4OQ4fbsKMXPagLhy\", \"\\xe1\\xec\\xe5\\xf8\\xe1\\xee\\xe4\\xe5\\xf2\" },\n  { \"$2x$04$abcdefghijklmnopqrstuu\", \"$2x$04$abcdefghijklmnopqrstuuwhpbcVuyGrJbgveSSM3XQKa8G5alyRm\", \"\\xe1\\xec\\xe5\\xf8\\xe1\\xee\\xe4\\xe5\\xf2\" },\n  { \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.cYbtH8J2lfpMIiBKfF3pKpMno7JlLui\", \"\\xf3\\xf4\\xe5\\xf0\\xe8\\xe1\\xee\\xe9\\xe5\" },\n  { \"$2x$05$abcdefghijklmnopqrstuu\", \"$2x$05$abcdefghijklmnopqrstuu1Z0zKnHbUU3q/kk//Pknlv19a4/T8.K\", \"\\xf3\\xf4\\xe5\\xf0\\xe8\\xe1\\xee\\xe9\\xe5\" },\n  { \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.8gGm3RkYFflDX50UQs.tJ8InKNy.HGO\", \"\\xf3\\xf4\\xe5\\xf0\\xe8\\xe1\\xee\\xe9\\xe5\" },\n  { \"$2x$04$abcdefghijklmnopqrstuu\", \"$2x$04$abcdefghijklmnopqrstuugLfxf5sydYesf658mrFYb51nLrn/4Sm\", \"\\xf3\\xf4\\xe5\\xf0\\xe8\\xe1\\xee\\xe9\\xe5\" },\n  { \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.cxMAJfIx3T.Fv3O0KjL9VdM/oSSUVRK\", \"\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\" },\n  { \"$2x$05$abcdefghijklmnopqrstuu\", \"$2x$05$abcdefghijklmnopqrstuuTYqa73Yp3leHe3D6.ysuJtNLwOma87C\", \"\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\" },\n  { \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.25hhqa/GOJGmXui3avNI5MN8lOI2bCW\", \"\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\" },\n  { \"$2x$04$abcdefghijklmnopqrstuu\", \"$2x$04$abcdefghijklmnopqrstuuJ6Y/kPTV/aHj7iJKuDfD5OPjVTvT2BK\", \"\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\" },\n  { \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.q5NMeQZ0UTyP/bILj02wdQ.Si5KHU1K\", \"\\xc3\\xa9tude\" },\n  { \"$2x$05$abcdefghijklmnopqrstuu\", \"$2x$05$abcdefghijklmnopqrstuuTmFuGBy/Zgc6JVAr667oHeCvGQGyS1q\", \"\\xc3\\xa9tude\" },\n  { \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.odAvHZH9azlhi1x4pBLF25.hj08RMFi\", \"\\xc3\\xa9tude\" },\n  { \"$2x$04$abcdefghijklmnopqrstuu\", \"$2x$04$abcdefghijklmnopqrstuufY4v5x6.8txtKUKDP86z1xjlXG/GgZO\", \"\\xc3\\xa9tude\" },\n  { \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.qcYQ0c2j2SvETms11hszz5bnbvNhN0G\", \"C)tude\" },\n  { \"$2x$05$abcdefghijklmnopqrstuu\", \"$2x$05$abcdefghijklmnopqrstuuo170FGVreUKlJWzQl8GcfhpghDIp2c.\", \"C)tude\" },\n  { \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.2iSSZ5gtiVxKz8BdAoDV9IxZl3LAH7y\", \"C)tude\" },\n  { \"$2x$04$abcdefghijklmnopqrstuu\", \"$2x$04$abcdefghijklmnopqrstuutA7.Ir5GREoOf.twyI.Zoy.dI1gNHfC\", \"C)tude\" },\n  { \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.7bLwFi3rlVcl.xfhc7LxjqwOExfxki2\", \"Chl\\xc3\\xb6\"\"e\" },\n  { \"$2x$05$abcdefghijklmnopqrstuu\", \"$2x$05$abcdefghijklmnopqrstuuojiyBkc.4HZ2y5Yh0LxBbI6ZkLiRg0C\", \"Chl\\xc3\\xb6\"\"e\" },\n  { \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.fRmxM11/x97bxCrhecMENdkPm7YpRbe\", \"Chl\\xc3\\xb6\"\"e\" },\n  { \"$2x$04$abcdefghijklmnopqrstuu\", \"$2x$04$abcdefghijklmnopqrstuuoBvt6zJCTP5OED1esTYUYPn31cWqwsa\", \"Chl\\xc3\\xb6\"\"e\" },\n  { \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.w.V.mBIadppiKKxZ0OzpXn86NOk43pC\", \"ChlC6e\" },\n  { \"$2x$05$abcdefghijklmnopqrstuu\", \"$2x$05$abcdefghijklmnopqrstuuQ2qgoto47/GjSmc6truiPxHNSL1jAfS\", \"ChlC6e\" },\n  { \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.r7GLvyVWQLuQaOTYsrMOBkbLfy8sPIi\", \"ChlC6e\" },\n  { \"$2x$04$abcdefghijklmnopqrstuu\", \"$2x$04$abcdefghijklmnopqrstuueolw0UBEFN.qCtReAkwiO7BAjrY4CX6\", \"ChlC6e\" },\n  { \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.xSD.pz8Zg3vt0Jiovghl5Dqrs8aw8ni\", \"\\xc3\\x85ngstr\\xc3\\xb6m\" },\n  { \"$2x$05$abcdefghijklmnopqrstuu\", \"$2x$05$abcdefghijklmnopqrstuuNjlOVoE5aHHQGtU9zc25wu0VykHnD1G\", \"\\xc3\\x85ngstr\\xc3\\xb6m\" },\n  { \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.3kVpkKaj1q2TAXm.ptIi98Nj3zVV8A2\", \"\\xc3\\x85ngstr\\xc3\\xb6m\" },\n  { \"$2x$04$abcdefghijklmnopqrstuu\", \"$2x$04$abcdefghijklmnopqrstuuXv3TUB0NdnMpyn4cfg4g48oZxRSIrNC\", \"\\xc3\\x85ngstr\\xc3\\xb6m\" },\n  { \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.gx7D73FxK1lx9aoctuj3fhNJqC.IYc6\", \"C\\x05ngstrC6m\" },\n  { \"$2x$05$abcdefghijklmnopqrstuu\", \"$2x$05$abcdefghijklmnopqrstuusSqmEHNEXYcUAamAuvd.piiJP2/SvW6\", \"C\\x05ngstrC6m\" },\n  { \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.pjA09E/vp0VG8cavv0kgRuMJNPJRdqS\", \"C\\x05ngstrC6m\" },\n  { \"$2x$04$abcdefghijklmnopqrstuu\", \"$2x$04$abcdefghijklmnopqrstuuEFW231TUkQA55cajdiwh2GQXkKY7v4.\", \"C\\x05ngstrC6m\" },\n  { \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.OVB6qjs7Uzos9N7/Rpm1laBHwGw11u.\", \"C\\x05ngstrCU*U***U*\" },\n  { \"$2x$05$abcdefghijklmnopqrstuu\", \"$2x$05$abcdefghijklmnopqrstuuAEHJsqoIo5645CuTbmM6VobcvFM6pxK\", \"C\\x05ngstrCU*U***U*\" },\n  { \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.E/ZiYei4bcJNCJEyI148Q1.aMAOn66e\", \"C\\x05ngstrCU*U***U*\" },\n  { \"$2x$04$abcdefghijklmnopqrstuu\", \"$2x$04$abcdefghijklmnopqrstuumAqJP8MYx4tSoKoE9d0vR0QW81bYuSC\", \"C\\x05ngstrCU*U***U*\" },\n  { \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.84ASbYYPYkl18.t0.TvQbm0oh98TFvG\", \"U*U***U*ignored\" },\n  { \"$2x$05$abcdefghijklmnopqrstuu\", \"$2x$05$abcdefghijklmnopqrstuuR.W0Ohu3KxpPUfr5Knw07yOOzZkdd7.\", \"U*U***U*ignored\" },\n  { \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.wx4V3qBoGl7ej9kbsoEpQTxmptzY0yq\", \"U*U***U*ignored\" },\n  { \"$2x$04$abcdefghijklmnopqrstuu\", \"$2x$04$abcdefghijklmnopqrstuu4SS72T2y2mc0YsQSe9qECdkPhGVslHS\", \"U*U***U*ignored\" },\n  { \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.ebmmSqlfcFhKGN/743nH7i03zpqftle\", \"U*U*U*U*\" },\n  { \"$2x$05$abcdefghijklmnopqrstuu\", \"$2x$05$abcdefghijklmnopqrstuuF1QNFce4DfYnYJUcafR1v2/7XbWeLjK\", \"U*U*U*U*\" },\n  { \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.5KIIW3tGg2xhhVu/AQXLZX9lSSeeehu\", \"U*U*U*U*\" },\n  { \"$2x$04$abcdefghijklmnopqrstuu\", \"$2x$04$abcdefghijklmnopqrstuudBYNJEBvC10idL3LIvyzUGdaxqz0jJW\", \"U*U*U*U*\" },\n  { \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.htnOkHgQ8LrcyWv4cQVE5Bt0DiVxJzG\", \"U*U*U*U*ignored\" },\n  { \"$2x$05$abcdefghijklmnopqrstuu\", \"$2x$05$abcdefghijklmnopqrstuu1JJvN7RoX92Zzq1yGezl/5/3vlXyrxi\", \"U*U*U*U*ignored\" },\n  { \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.7YCBkroPI7yK9JGre8Hne5hdwmA6Z3S\", \"U*U*U*U*ignored\" },\n  { \"$2x$04$abcdefghijklmnopqrstuu\", \"$2x$04$abcdefghijklmnopqrstuuc1KKQsfk4nXu9CnvuF/SfMwrmif7tsC\", \"U*U*U*U*ignored\" },\n  { \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.DzSBCMqe17IfGIqEfq.FrxykxqtrVi2\", \"*U*U*U*U\" },\n  { \"$2x$05$abcdefghijklmnopqrstuu\", \"$2x$05$abcdefghijklmnopqrstuuuzPVVNB/SAKLJbAoTgm3qolIt8JCyqG\", \"*U*U*U*U\" },\n  { \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.1fL1/3fOtt1usdRoe0dWgjAUT/TMd76\", \"*U*U*U*U\" },\n  { \"$2x$04$abcdefghijklmnopqrstuu\", \"$2x$04$abcdefghijklmnopqrstuu39YJ8HbI96dgaVWEUkKUCgXR4676Qjq\", \"*U*U*U*U\" },\n  { \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.yu/PNF5atjbvgp2r9GyRzSYOErUPNHq\", \"*U*U*U*U*\" },\n  { \"$2x$05$abcdefghijklmnopqrstuu\", \"$2x$05$abcdefghijklmnopqrstuuZu/4jl7FZnNPiPunsfxbXLTBcZ4XPMe\", \"*U*U*U*U*\" },\n  { \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.YT6TwplC9qsDdIyZ4nZ.2STP1srJcv.\", \"*U*U*U*U*\" },\n  { \"$2x$04$abcdefghijklmnopqrstuu\", \"$2x$04$abcdefghijklmnopqrstuuQ6t3zlOYOUrJSlX7AdtXuuWd0hDhQiC\", \"*U*U*U*U*\" },\n  { \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.7Cc1PePc3H0bDi8khYlhX6PVDNBB0QK\", \"*U*U*U*U*U*U*U*U\" },\n  { \"$2x$05$abcdefghijklmnopqrstuu\", \"$2x$05$abcdefghijklmnopqrstuuwd22F2Sxe6gq2OS.jcQfMBY2dJtwKyS\", \"*U*U*U*U*U*U*U*U\" },\n  { \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.AYh0eQgGLbt9qiP1jMH9.zHrUuVNY5.\", \"*U*U*U*U*U*U*U*U\" },\n  { \"$2x$04$abcdefghijklmnopqrstuu\", \"$2x$04$abcdefghijklmnopqrstuui4ZHqA63Ft09xDrL31aaZvJ3RjuITQq\", \"*U*U*U*U*U*U*U*U\" },\n  { \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.jlPoM5ioW.OQLW.5JcdEmo4HtRjF876\", \"*U*U*U*U*U*U*U*U*\" },\n  { \"$2x$05$abcdefghijklmnopqrstuu\", \"$2x$05$abcdefghijklmnopqrstuuz3ESgmDkKJlK0Nuq2.ylqgmDHlpC38q\", \"*U*U*U*U*U*U*U*U*\" },\n  { \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.scf6.mexwrzCAGi3ShQ8cYkynqeH0bK\", \"*U*U*U*U*U*U*U*U*\" },\n  { \"$2x$04$abcdefghijklmnopqrstuu\", \"$2x$04$abcdefghijklmnopqrstuuQLykgCNxKyLhRD0HXzLibuZLZfiGOEO\", \"*U*U*U*U*U*U*U*U*\" },\n  { \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.Qjdj3GXX7D0sFE9jji6wxSTWIhqI3US\", \"\\xa3\" },\n  { \"$2x$05$abcdefghijklmnopqrstuu\", \"$2x$05$abcdefghijklmnopqrstuuHdhhdUXVgLADnbTYf12kvsasO1gS51C\", \"\\xa3\" },\n  { \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.PIeeyENZVZmrKLAq5lwBUU9fMRVfV2m\", \"\\xa3\" },\n  { \"$2x$04$abcdefghijklmnopqrstuu\", \"$2x$04$abcdefghijklmnopqrstuuMOaOTHB4gEm.rriBjXNwBNh.Oc4mKGG\", \"\\xa3\" },\n  { \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.nQF1kDoMDjBBwXy2wwMni2gJLKqA0ta\", \"\\xa3\"\"a\" },\n  { \"$2x$05$abcdefghijklmnopqrstuu\", \"$2x$05$abcdefghijklmnopqrstuuYdqUOXeMKw7X6zbqBXP6c1xqIKun7Oq\", \"\\xa3\"\"a\" },\n  { \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.bqJMLkbvnTFj0OYMu9tPnQXstRzX/e6\", \"\\xa3\"\"a\" },\n  { \"$2x$04$abcdefghijklmnopqrstuu\", \"$2x$04$abcdefghijklmnopqrstuuUPPO3QqmgMIXGHvbOLe2IkNzHLAToY2\", \"\\xa3\"\"a\" },\n  { \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.QZ7A0p9q1Ag9Utfnfl/xif8NiDtVhO.\", \"\\xd1\\x91\" },\n  { \"$2x$05$abcdefghijklmnopqrstuu\", \"$2x$05$abcdefghijklmnopqrstuusND7G4.cx6Dzn6TqbXfK99bElU0a7P.\", \"\\xd1\\x91\" },\n  { \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.2E0h7UFL/4fALemA5ApWrCWllQXSPTu\", \"\\xd1\\x91\" },\n  { \"$2x$04$abcdefghijklmnopqrstuu\", \"$2x$04$abcdefghijklmnopqrstuumjGosqV8OkKEcduYTNz5PKN2scswFya\", \"\\xd1\\x91\" },\n  { \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.bJFOmj3TaByM10X0BF32w0Fv/xFNSvm\", \"\\xa3\"\"ab\" },\n  { \"$2x$05$abcdefghijklmnopqrstuu\", \"$2x$05$abcdefghijklmnopqrstuuojaU9K.vmSlY6BHpgIQ/WY9rEOCcJO2\", \"\\xa3\"\"ab\" },\n  { \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.0EeTSP42yLfD7uTTcDffPd2CNLKHdoy\", \"\\xa3\"\"ab\" },\n  { \"$2x$04$abcdefghijklmnopqrstuu\", \"$2x$04$abcdefghijklmnopqrstuuikYh/9nIvugTp.kFPFeZDBu7eW6BLoa\", \"\\xa3\"\"ab\" },\n  { \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.Qjdj3GXX7D0sFE9jji6wxSTWIhqI3US\", \"\\xff\\xff\\xa3\" },\n  { \"$2x$05$abcdefghijklmnopqrstuu\", \"$2x$05$abcdefghijklmnopqrstuuHdhhdUXVgLADnbTYf12kvsasO1gS51C\", \"\\xff\\xff\\xa3\" },\n  { \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.PIeeyENZVZmrKLAq5lwBUU9fMRVfV2m\", \"\\xff\\xff\\xa3\" },\n  { \"$2x$04$abcdefghijklmnopqrstuu\", \"$2x$04$abcdefghijklmnopqrstuuMOaOTHB4gEm.rriBjXNwBNh.Oc4mKGG\", \"\\xff\\xff\\xa3\" },\n  { \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.VmFQpoXeVuKTzkg2ZRsAf.8PZJZg142\", \"1\\xa3\"\"345\" },\n  { \"$2x$05$abcdefghijklmnopqrstuu\", \"$2x$05$abcdefghijklmnopqrstuucaGU5ROXj4M8Tgsx3s/D5BQIuhazIWa\", \"1\\xa3\"\"345\" },\n  { \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.8jdeg8QqT4CX3ERA9vZPFZAkxZRpxJW\", \"1\\xa3\"\"345\" },\n  { \"$2x$04$abcdefghijklmnopqrstuu\", \"$2x$04$abcdefghijklmnopqrstuu9f4sA9SRA0scUKcRyC5kce8dao2.GKe\", \"1\\xa3\"\"345\" },\n  { \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.VmFQpoXeVuKTzkg2ZRsAf.8PZJZg142\", \"\\xff\\xa3\"\"345\" },\n  { \"$2x$05$abcdefghijklmnopqrstuu\", \"$2x$05$abcdefghijklmnopqrstuucaGU5ROXj4M8Tgsx3s/D5BQIuhazIWa\", \"\\xff\\xa3\"\"345\" },\n  { \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.8jdeg8QqT4CX3ERA9vZPFZAkxZRpxJW\", \"\\xff\\xa3\"\"345\" },\n  { \"$2x$04$abcdefghijklmnopqrstuu\", \"$2x$04$abcdefghijklmnopqrstuu9f4sA9SRA0scUKcRyC5kce8dao2.GKe\", \"\\xff\\xa3\"\"345\" },\n  { \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.VmFQpoXeVuKTzkg2ZRsAf.8PZJZg142\", \"\\xff\\xa3\"\"34\\xff\\xff\\xff\\xa3\"\"345\" },\n  { \"$2x$05$abcdefghijklmnopqrstuu\", \"$2x$05$abcdefghijklmnopqrstuucaGU5ROXj4M8Tgsx3s/D5BQIuhazIWa\", \"\\xff\\xa3\"\"34\\xff\\xff\\xff\\xa3\"\"345\" },\n  { \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.8jdeg8QqT4CX3ERA9vZPFZAkxZRpxJW\", \"\\xff\\xa3\"\"34\\xff\\xff\\xff\\xa3\"\"345\" },\n  { \"$2x$04$abcdefghijklmnopqrstuu\", \"$2x$04$abcdefghijklmnopqrstuu9f4sA9SRA0scUKcRyC5kce8dao2.GKe\", \"\\xff\\xa3\"\"34\\xff\\xff\\xff\\xa3\"\"345\" },\n  { \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$05$CCCCCCCCCCCCCCCCCCCCC..sDifhVkUxvjPx6U4yeM2tC411Wuc.W\", \"U\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xff\" },\n  { \"$2x$05$abcdefghijklmnopqrstuu\", \"$2x$05$abcdefghijklmnopqrstuuh.z2vLHB/tYSU5fPXkrYB7TxLHGJnI6\", \"U\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xff\" },\n  { \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.yphVralDu2JlxYbCqwwGli/H6wBgBtC\", \"U\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xff\" },\n  { \"$2x$04$abcdefghijklmnopqrstuu\", \"$2x$04$abcdefghijklmnopqrstuuyED5tIjzyeH90te88BUWvTrMFHsWgCi\", \"U\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xff\" },\n  { \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.Ysbn1VpHCTzInfW/z/8Q3k676rxfmSW\", \"\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\" },\n  { \"$2x$05$abcdefghijklmnopqrstuu\", \"$2x$05$abcdefghijklmnopqrstuupjce7u/YRnectNa8DXjsSGzRdyH2PSG\", \"\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\" },\n  { \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.9iflVP0Ezo/iaxO0XS74wFglLNeryTS\", \"\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\" },\n  { \"$2x$04$abcdefghijklmnopqrstuu\", \"$2x$04$abcdefghijklmnopqrstuuIvJ5WHgSbYKj7g9hhdVsAjyzcnVT/.m\", \"\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\" },\n  { \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.n2VnrmAaokJwiDSekcCjbZxRIyVngRy\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\" },\n  { \"$2x$05$abcdefghijklmnopqrstuu\", \"$2x$05$abcdefghijklmnopqrstuu5s2v8.iXieOjg/.AySBTTZIIVFJeBui\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\" },\n  { \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.0ZsAfF0DsSCOCcfZKxtwXxkV4RFYBVG\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\" },\n  { \"$2x$04$abcdefghijklmnopqrstuu\", \"$2x$04$abcdefghijklmnopqrstuuRAip/W0RPQX4QKkqYqXE3GIXWH518Sm\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\" },\n  { \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.n2VnrmAaokJwiDSekcCjbZxRIyVngRy\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789chars after 72 are ignored\" },\n  { \"$2x$05$abcdefghijklmnopqrstuu\", \"$2x$05$abcdefghijklmnopqrstuu5s2v8.iXieOjg/.AySBTTZIIVFJeBui\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789chars after 72 are ignored\" },\n  { \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.0ZsAfF0DsSCOCcfZKxtwXxkV4RFYBVG\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789chars after 72 are ignored\" },\n  { \"$2x$04$abcdefghijklmnopqrstuu\", \"$2x$04$abcdefghijklmnopqrstuuRAip/W0RPQX4QKkqYqXE3GIXWH518Sm\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789chars after 72 are ignored\" },\n  { \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.VTMVcF7YBLV2/O6V1PNcQw0BD3hTN6a\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\" },\n  { \"$2x$05$abcdefghijklmnopqrstuu\", \"$2x$05$abcdefghijklmnopqrstuurB3dV.fJGdSihNlP0vo5PemoaZRp6LS\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\" },\n  { \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.PMOS6ygjFMSbDo.iJJam/G63inGIOBO\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\" },\n  { \"$2x$04$abcdefghijklmnopqrstuu\", \"$2x$04$abcdefghijklmnopqrstuuxP2lldc1.10LvZDjJZXNBKLzWqnkbOa\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\" },\n  { \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.VTMVcF7YBLV2/O6V1PNcQw0BD3hTN6a\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\"\"chars after 72 are ignored as usual\" },\n  { \"$2x$05$abcdefghijklmnopqrstuu\", \"$2x$05$abcdefghijklmnopqrstuurB3dV.fJGdSihNlP0vo5PemoaZRp6LS\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\"\"chars after 72 are ignored as usual\" },\n  { \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.PMOS6ygjFMSbDo.iJJam/G63inGIOBO\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\"\"chars after 72 are ignored as usual\" },\n  { \"$2x$04$abcdefghijklmnopqrstuu\", \"$2x$04$abcdefghijklmnopqrstuuxP2lldc1.10LvZDjJZXNBKLzWqnkbOa\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\"\"chars after 72 are ignored as usual\" },\n  { \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.RURfiuM5wAc5Jv4SO604mh/l3NurIoq\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has forgotten.\" },\n  { \"$2x$05$abcdefghijklmnopqrstuu\", \"$2x$05$abcdefghijklmnopqrstuu6v4sW.Jh71LP6RHjCG1iTdKjHpi8Az2\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has forgotten.\" },\n  { \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.NNYMcLQ7lIauYt0h6mWJtoSyBZqwBwi\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has forgotten.\" },\n  { \"$2x$04$abcdefghijklmnopqrstuu\", \"$2x$04$abcdefghijklmnopqrstuuZgFC0hc.gvORKBIExxdbXTGVmt0vRFW\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has forgotten.\" },\n  { \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.uB1no1bSvQlNFbG6DThB52xIhyG9z8G\", \"THE YEAR\" },\n  { \"$2x$05$abcdefghijklmnopqrstuu\", \"$2x$05$abcdefghijklmnopqrstuuySE45JP/avbudkXbPzjvqTBKf61NNfi\", \"THE YEAR\" },\n  { \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.c/NBil2GQ9h1axG3uDE7cen7O1yt4wu\", \"THE YEAR\" },\n  { \"$2x$04$abcdefghijklmnopqrstuu\", \"$2x$04$abcdefghijklmnopqrstuuT4fz1ym9dcyOwa1hMmFJSuk4yISb03.\", \"THE YEAR\" },\n  { \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.RURfiuM5wAc5Jv4SO604mh/l3NurIoq\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and do\" },\n  { \"$2x$05$abcdefghijklmnopqrstuu\", \"$2x$05$abcdefghijklmnopqrstuu6v4sW.Jh71LP6RHjCG1iTdKjHpi8Az2\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and do\" },\n  { \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.NNYMcLQ7lIauYt0h6mWJtoSyBZqwBwi\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and do\" },\n  { \"$2x$04$abcdefghijklmnopqrstuu\", \"$2x$04$abcdefghijklmnopqrstuuZgFC0hc.gvORKBIExxdbXTGVmt0vRFW\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and do\" },\n  { \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$05$CCCCCCCCCCCCCCCCCCCCC.RURfiuM5wAc5Jv4SO604mh/l3NurIoq\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has f\" },\n  { \"$2x$05$abcdefghijklmnopqrstuu\", \"$2x$05$abcdefghijklmnopqrstuu6v4sW.Jh71LP6RHjCG1iTdKjHpi8Az2\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has f\" },\n  { \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.\", \"$2x$04$CCCCCCCCCCCCCCCCCCCCC.NNYMcLQ7lIauYt0h6mWJtoSyBZqwBwi\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has f\" },\n  { \"$2x$04$abcdefghijklmnopqrstuu\", \"$2x$04$abcdefghijklmnopqrstuuZgFC0hc.gvORKBIExxdbXTGVmt0vRFW\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has f\" },\n#endif // bcrypt_x\n\n#if INCLUDE_bigcrypt && defined TEST_bigcrypt\n  { \"CC..............\", \"CCHYKxYMMLQN2\", \"\" },\n  { \"ab..............\", \"abmF1QH4PEr.E\", \"\" },\n  { \"CC..............\", \"CCcePb2UhZY96\", \" \" },\n  { \"ab..............\", \"ab3nfvqkpDCz6\", \" \" },\n  { \"CC..............\", \"CCu3ZS/UCwMaA\", \"a\" },\n  { \"ab..............\", \"abxxB7HlIeckU\", \"a\" },\n  { \"CC..............\", \"CC0MiZNhf/ACw\", \"ab\" },\n  { \"ab..............\", \"abAwh7.RciMzE\", \"ab\" },\n  { \"CC..............\", \"CCQ4IySE25HV2\", \"abc\" },\n  { \"ab..............\", \"abFZSxKKdq5s6\", \"abc\" },\n  { \"CC..............\", \"CCHc6HsfCQ5t6\", \"U*U\" },\n  { \"ab..............\", \"abCY/CHNnliwA\", \"U*U\" },\n  { \"CC..............\", \"CCmOvmGnYgIOQ\", \"U*U*\" },\n  { \"ab..............\", \"abrP9hatwxlsc\", \"U*U*\" },\n  { \"CC..............\", \"CCzd9NlE45556\", \"U*U*U\" },\n  { \"ab..............\", \"ab9YovNfzixZE\", \"U*U*U\" },\n  { \"CC..............\", \"CCvbcTIyRnP1s\", \".....\" },\n  { \"ab..............\", \"abQcwGqfvDF4U\", \".....\" },\n  { \"CC..............\", \"CCcMgHKAHJ1SA\", \"dragon\" },\n  { \"ab..............\", \"ab6Gj9YvrF2As\", \"dragon\" },\n  { \"CC..............\", \"CCK5kzKL/XuQY\", \"dRaGoN\" },\n  { \"ab..............\", \"abmNlUI1COvYE\", \"dRaGoN\" },\n  { \"CC..............\", \"CCRDslM6u7nAk\", \"DrAgOn\" },\n  { \"ab..............\", \"abUqB6rDk72W2\", \"DrAgOn\" },\n  { \"CC..............\", \"CCUj.vcbp0YcQ\", \"PAROLX\" },\n  { \"ab..............\", \"ab2mSJsfAaEYc\", \"PAROLX\" },\n  { \"CC..............\", \"CCX.K.MFy4Ois\", \"U*U***U\" },\n  { \"ab..............\", \"abRk/fdtGCS02\", \"U*U***U\" },\n  { \"CC..............\", \"CC457075f2366\", \"abcdefg\" },\n  { \"ab..............\", \"abJ1KhM1sjlUo\", \"abcdefg\" },\n  { \"CC..............\", \"CCO7o2HcqNKcw\", \"01234567\" },\n  { \"ab..............\", \"ab2wHQ4RTFVKI\", \"01234567\" },\n  { \"CC..............\", \"CCBsM2N7uDf4I\", \"726 even\" },\n  { \"ab..............\", \"abvP7wxxQ4tog\", \"726 even\" },\n  { \"CC..............\", \"CCOGSgC4qjcA2\", \"zyxwvuts\" },\n  { \"ab..............\", \"abbEulwxH3FHA\", \"zyxwvuts\" },\n  { \"CC..............\", \"CCVTQupjkvqPYMXt7kJ5/KC.\", \"ab1234567\" },\n  { \"ab..............\", \"abnYLVrXaFJ5wbbOy5TMMF9I\", \"ab1234567\" },\n  { \"CC..............\", \"CCk4Onp6WTPTYcGQwikygdIE\", \"alexander\" },\n  { \"ab..............\", \"ab76vmlPVRy5Q2/bWVChp3m.\", \"alexander\" },\n  { \"CC..............\", \"CCoUdX6WyGKgs.4ll1y5t4hw\", \"beautiful\" },\n  { \"ab..............\", \"abwfsjWX4EyO.54F5tcweK2E\", \"beautiful\" },\n  { \"CC..............\", \"CC9P2ZjaWPiSQGjxqTYeOQtE\", \"challenge\" },\n  { \"ab..............\", \"abNf5XM5DhRJsjTttFuXLpEg\", \"challenge\" },\n  { \"CC..............\", \"CCFkZ6ziYuRO2LCFGKut0Jf.\", \"chocolate\" },\n  { \"ab..............\", \"ab5g9v/XGNiAQpwEERnw4/Sc\", \"chocolate\" },\n  { \"CC..............\", \"CCNbsdP6Epo2.m7Bgw8ZzxjU\", \"cr1234567\" },\n  { \"ab..............\", \"abxR5d2mWY2GgbmtEHvkfvZg\", \"cr1234567\" },\n  { \"CC..............\", \"CCOwLOT2cAuVIMc/EueVKMIk\", \"katherine\" },\n  { \"ab..............\", \"abzBVZ7aWUKM6j/2ha276idw\", \"katherine\" },\n  { \"CC..............\", \"CCoLp0sLZdas2rWkty8ZiqLo\", \"stephanie\" },\n  { \"ab..............\", \"abO4gfga4XKD.LyaCgObeHxM\", \"stephanie\" },\n  { \"CC..............\", \"CCZrXpzITbV1kikHjkiorO6g\", \"sunflower\" },\n  { \"ab..............\", \"ab48pizZvB/R231zb7gnVeRI\", \"sunflower\" },\n  { \"CC..............\", \"CC6fdwBHH3atwlQ9lNt6a5H2\", \"basketball\" },\n  { \"ab..............\", \"abJqfe.5maUGkAQ70mQTJjK2\", \"basketball\" },\n  { \"CC..............\", \"CCJa7tMefq.rwoBNL6XmZMek\", \"porsche911\" },\n  { \"ab..............\", \"abAXo0qGhDad2x0n5AvrnUfU\", \"porsche911\" },\n  { \"CC..............\", \"CCiwAFQV9a8P2tzhCAZYe6Q2\", \"|_337T`/p3\" },\n  { \"ab..............\", \"abhOzUBEprC2Mn9crKdJV6uQ\", \"|_337T`/p3\" },\n  { \"CC..............\", \"CCUIVkP6RhPU.HtCCpm2VJIU\", \"thunderbird\" },\n  { \"ab..............\", \"abqhNEbBQBA3sUoPrPfnrgZ2\", \"thunderbird\" },\n  { \"CC..............\", \"CC.FXhmgF9eGUNGazFEI8GD6\", \"Hello world!\" },\n  { \"ab..............\", \"abMbH7WsHr7wQFVyKTqAt7D.\", \"Hello world!\" },\n  { \"CC..............\", \"CCBkhrj5Ptwl6L39.Qc1YFjU\", \"pleaseletmein\" },\n  { \"ab..............\", \"ab/DEQq.fnuz6aBwj.3UrCLQ\", \"pleaseletmein\" },\n  { \"CC..............\", \"CCL8hSYYbUTgsUSRMXLhUt06\", \"a short string\" },\n  { \"ab..............\", \"abgpCbJjOvjuoaRydemZ2HY.\", \"a short string\" },\n  { \"CC..............\", \"CCzCSKYTyC2JEb3pCcnZOQIU\", \"zxyDPWgydbQjgq\" },\n  { \"ab..............\", \"abfcHW3Eqw9a6Fs/VxbSDWzY\", \"zxyDPWgydbQjgq\" },\n  { \"CC..............\", \"CCedg2FJ0iNYIBZudedTER.M\", \"photojournalism\" },\n  { \"ab..............\", \"abZW.Bx7lmec.SDRa1Fdf49A\", \"photojournalism\" },\n  { \"CC..............\", \"CC9rjRlxb4hYIUtYIWuraHEM\", \"ecclesiastically\" },\n  { \"ab..............\", \"abWR9L6FAAjBUhciM5rPw9LU\", \"ecclesiastically\" },\n  { \"CC..............\", \"CCdDDsxFI3f1IoBaUtkUPzhYHOn.GmO9vzg\", \"congregationalism\" },\n  { \"ab..............\", \"abCQz3pDUMwjEYuKi2q9aXZ2N5cEyz20NfI\", \"congregationalism\" },\n  { \"CC..............\", \"CCObKp6oZ/Ijs5BckuMqUe42t3lhtkogpPE\", \"dihydrosphingosine\" },\n  { \"ab..............\", \"abi0ZGA2O7vz2N5qJzQtGPIopK9iDkNesxQ\", \"dihydrosphingosine\" },\n  { \"CC..............\", \"CCSd6IjC3XUtQpLiYoJJR3L61ag8tPyMnkY\", \"semianthropological\" },\n  { \"ab..............\", \"abkpCn0UslKR2lQRz5/EHshYNtWNhPzyZD2\", \"semianthropological\" },\n  { \"CC..............\", \"CCkszowLaKwQICypy.I6xl/glI9ZVe7Xjm6\", \"palaeogeographically\" },\n  { \"ab..............\", \"abQpNzgtS8Y4.8QujPFse2hICU6kR1Nqews\", \"palaeogeographically\" },\n  { \"CC..............\", \"CCj4BLTHC8dPQhbf4iUgXJjsKRdcsOpBQdY\", \"electromyographically\" },\n  { \"ab..............\", \"abhofIPtJKDnImNUGCkjfroAx8nN7ehOV0k\", \"electromyographically\" },\n  { \"CC..............\", \"CCqYSYdfJDa9AZReZ1nNZdLsCdvwFQqiebY\", \"noninterchangeableness\" },\n  { \"ab..............\", \"abjBC5WWqUx5sY1LtCMWebPwD9kvv6jSCjw\", \"noninterchangeableness\" },\n  { \"CC..............\", \"CCYiWECFTvLboOsCPb5O261k4XXsJKi3eb.Pj78mokOy8I\", \"abcdefghijklmnopqrstuvwxyz\" },\n  { \"ab..............\", \"abYH7TYgEKz2QoAyB.mxxiXgOOohoOIApK6ELI2GMEXSa.\", \"abcdefghijklmnopqrstuvwxyz\" },\n  { \"CC..............\", \"CCDUc5yYKE2dIIv6tsd7Jzm.XBkdER00XCIxwy10ZCv.dE\", \"electroencephalographically\" },\n  { \"ab..............\", \"abooZTCeS9jSg9290VBBYwb21PdwjAmuKVg6UlARNZjsx.\", \"electroencephalographically\" },\n  { \"CC..............\", \"CCvT8tKTENFfoM60X889h.JkbwGKcf/eFCwQR4QAq3gGEY\", \"antidisestablishmentarianism\" },\n  { \"ab..............\", \"ab6c/K2rnT8AwtU8ulncid6E4joJsx1acjgt4CdohWxSGE\", \"antidisestablishmentarianism\" },\n  { \"CC..............\", \"CCqCWJUufOFw6FnRug44H5BoStVJTBled.crPhz0GMSvwk\", \"cyclotrimethylenetrinitramine\" },\n  { \"ab..............\", \"abzi9F1yuymUQ/08a1n8/23wmfdEaTrt.P2/yfBeJeZ.mc\", \"cyclotrimethylenetrinitramine\" },\n  { \"CC..............\", \"CCWpLVCzkv4GsfiC2CQF4JCgv2TKqhkG1tQFiHDoqCP82o\", \"dichlorodiphenyltrichloroethane\" },\n  { \"ab..............\", \"abAXyrMLt2fwcEiuJgjLEj8ELvEtItM2UPoiCt9PfNsiWc\", \"dichlorodiphenyltrichloroethane\" },\n  { \"CC..............\", \"CCFAo2el2sagU5NocAjwS.LIXuwuwlVq4yooUqJEP1y7UEAFxoQpabTMU\", \"multiple words seperated by spaces\" },\n  { \"ab..............\", \"abAYLFLzcWoWo3uygM0YWq.6sgFIjwJbxCIqObjsdV5prMwvqiKtKSC82\", \"multiple words seperated by spaces\" },\n  { \"CC..............\", \"CCSz2gog3i0copk3g62AcBKotVVA77Yv372DZauQ67wH8YyDlJ51euZQo\", \"supercalifragilisticexpialidocious\" },\n  { \"ab..............\", \"abBTyQ2AdyQW.NX65b2kLmGI37LOYpInv.2LW9j1EmpUZArV9PZJ8bB62\", \"supercalifragilisticexpialidocious\" },\n  { \"CC..............\", \"CCRFMtw/2Yz6cYE2qeoAowTEdZb2DLRzhdQ1d3R3w3eHRgMxDBIf60FlQaX1VUf04apcdi9ZBJwLyQ6\", \"we have a short salt string but not a short password\" },\n  { \"ab..............\", \"abBCBt9IU4lugg.4bU.ixxyIUp.0Elat4LUsDTnSGYYoMYA875qHLhna.XUdWmk50yH.Irc3cDsuSYA\", \"we have a short salt string but not a short password\" },\n  { \"CC..............\", \"CCFAo2el2sagUy/is9gPtJsk09WWrDyEBNAhhMd8X3ZuqAgTlKulLOMVEwhmmbTz.fZkU7ZbA.YZBCsNIdSXNGM.g2\", \"multiple word$ $eperated by $pace$ and $pecial character$\" },\n  { \"ab..............\", \"abAYLFLzcWoWoAGdkYci9Fso2DsqBx9v0lE3ppOJwoJyaMrko1Wv9pFz2i3TFCO76PVIsUTpOmwjMPo5p99wCa/qRA\", \"multiple word$ $eperated by $pace$ and $pecial character$\" },\n  { \"CC..............\", \"CC.nSMd1oqough8yDz3kHHd6CMmltaq1NrwZWrqo1YITyceQ8v6XVixfw8LJYrzE4ZSsGcY32UjcmoYZmW1kid7QDg\", \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\" },\n  { \"ab..............\", \"abzCGr5cnwu5QyHd7mdh8il60ak0tvYKIa.8wo.69BgkdAqW2gR9Hxt8wOgMJAyLGkhMZEp0C6kbMNIIbQ7Z7tjqg.\", \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\" },\n  { \"CC..............\", \"CCehtSXY9VcgUZ2YOt3h4GOMOzPpwCvkjZYo39LwWSbFHoC1F2QNfNnIEKrBF1JE4aHg4yczltNErjM8SkkKrjf/PsDwtB/uMk2y.4e6G7WwGsjI\", \"12345678901234567890123456789012345678901234567890123456789012345678901234567890\" },\n  { \"ab..............\", \"ab1iBa.N.U2C6mzGmzqYiNVweDs/2eCEvo2JgfwvFy3nn2YL3CyMUoH8wRbI65CoVvq2qipX1DPxpq.ZqmLSl1KeKkTN0zS6FlWUAbvrI1YaHuYE\", \"12345678901234567890123456789012345678901234567890123456789012345678901234567890\" },\n  { \"CC..............\", \"CCeWCPWeB0Y7sotLnsWgg152jISFe1nlm7.EABfmte0UFMyWccbNIjGnMfSlXsipHzoQIVrDe7XV2YMHo2eiTidoxMG9HorBbDtkoeLRQI4K9PL6Y./juXb87aA\", \"a very much longer text to encrypt.  This one even stretches over morethan one line.\" },\n  { \"ab..............\", \"abmQw6w8KuXCQdxJQmOYY8a2j9eM50RJMSc1IjbFsgYK9.14eN7o775aUJSexWmaQklQFRBoT205WiYopjr2HYdcJweENajtGY5N6BQHLRlAjvsQa09JllUnaoI\", \"a very much longer text to encrypt.  This one even stretches over morethan one line.\" },\n  { \"CC..............\", \"CCUj.vcbp0YcQ\", \"\\xd0\\xc1\\xd2\\xcf\\xcc\\xd8\" },\n  { \"ab..............\", \"ab2mSJsfAaEYc\", \"\\xd0\\xc1\\xd2\\xcf\\xcc\\xd8\" },\n  { \"CC..............\", \"CC4rMpbg9AMZ.\", \"\\xd5\\xaa\\xd5\\xaa\\xaa\\xaa\\xd5\\xaa\" },\n  { \"ab..............\", \"abP6zaVz4PU9U\", \"\\xd5\\xaa\\xd5\\xaa\\xaa\\xaa\\xd5\\xaa\" },\n  { \"CC..............\", \"CCk4Onp6WTPTYcGQwikygdIE\", \"\\xe1\\xec\\xe5\\xf8\\xe1\\xee\\xe4\\xe5\\xf2\" },\n  { \"ab..............\", \"ab76vmlPVRy5Q2/bWVChp3m.\", \"\\xe1\\xec\\xe5\\xf8\\xe1\\xee\\xe4\\xe5\\xf2\" },\n  { \"CC..............\", \"CCoLp0sLZdas2rWkty8ZiqLo\", \"\\xf3\\xf4\\xe5\\xf0\\xe8\\xe1\\xee\\xe9\\xe5\" },\n  { \"ab..............\", \"abO4gfga4XKD.LyaCgObeHxM\", \"\\xf3\\xf4\\xe5\\xf0\\xe8\\xe1\\xee\\xe9\\xe5\" },\n  { \"CC..............\", \"CCr8qoMD/gdWEs345DTs3Xe.7btteQJYjNE\", \"\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\" },\n  { \"ab..............\", \"abtb865WlwaOAOQYZhsInLvQ8Y4l28LTy4E\", \"\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\" },\n  { \"CC..............\", \"CCn9g8mHJ8WxU\", \"\\xc3\\xa9tude\" },\n  { \"ab..............\", \"ab4vjYACxKO9o\", \"\\xc3\\xa9tude\" },\n  { \"CC..............\", \"CCn9g8mHJ8WxU\", \"C)tude\" },\n  { \"ab..............\", \"ab4vjYACxKO9o\", \"C)tude\" },\n  { \"CC..............\", \"CCRgyVVVpXpM2\", \"Chl\\xc3\\xb6\"\"e\" },\n  { \"ab..............\", \"ab5zWidETSBlE\", \"Chl\\xc3\\xb6\"\"e\" },\n  { \"CC..............\", \"CCRgyVVVpXpM2\", \"ChlC6e\" },\n  { \"ab..............\", \"ab5zWidETSBlE\", \"ChlC6e\" },\n  { \"CC..............\", \"CCM6/Cpgtljf2J4DCwep/Zag\", \"\\xc3\\x85ngstr\\xc3\\xb6m\" },\n  { \"ab..............\", \"abaBhSVlHGKLICoBGmfR65Vo\", \"\\xc3\\x85ngstr\\xc3\\xb6m\" },\n  { \"CC..............\", \"CCM6/Cpgtljf2J4DCwep/Zag\", \"C\\x05ngstrC6m\" },\n  { \"ab..............\", \"abaBhSVlHGKLICoBGmfR65Vo\", \"C\\x05ngstrC6m\" },\n  { \"CC..............\", \"CCM6/Cpgtljf2oRwXaoXTsX6\", \"C\\x05ngstrCU*U***U*\" },\n  { \"ab..............\", \"abaBhSVlHGKLICus5dxoRsnE\", \"C\\x05ngstrCU*U***U*\" },\n  { \"CC..............\", \"CC4rMpbg9AMZ.Ar0HgE5ZjsA\", \"U*U***U*ignored\" },\n  { \"ab..............\", \"abP6zaVz4PU9UGUOi2FoSM6g\", \"U*U***U*ignored\" },\n  { \"CC..............\", \"CCNf8Sbh3HDfQ\", \"U*U*U*U*\" },\n  { \"ab..............\", \"ab3RlyzKJBvlk\", \"U*U*U*U*\" },\n  { \"CC..............\", \"CCNf8Sbh3HDfQZK9ghgqAMOk\", \"U*U*U*U*ignored\" },\n  { \"ab..............\", \"ab3RlyzKJBvlkdAuvhqxf7FA\", \"U*U*U*U*ignored\" },\n  { \"CC..............\", \"CCr8qoMD/gdWE\", \"*U*U*U*U\" },\n  { \"ab..............\", \"abtb865WlwaOA\", \"*U*U*U*U\" },\n  { \"CC..............\", \"CCr8qoMD/gdWExB1fA0Sa/mo\", \"*U*U*U*U*\" },\n  { \"ab..............\", \"abtb865WlwaOAwvvRoBrx/P6\", \"*U*U*U*U*\" },\n  { \"CC..............\", \"CCr8qoMD/gdWEs345DTs3Xe.\", \"*U*U*U*U*U*U*U*U\" },\n  { \"ab..............\", \"abtb865WlwaOAOQYZhsInLvQ\", \"*U*U*U*U*U*U*U*U\" },\n  { \"CC..............\", \"CCr8qoMD/gdWEs345DTs3Xe.7btteQJYjNE\", \"*U*U*U*U*U*U*U*U*\" },\n  { \"ab..............\", \"abtb865WlwaOAOQYZhsInLvQ8Y4l28LTy4E\", \"*U*U*U*U*U*U*U*U*\" },\n  { \"CC..............\", \"CCwH9PyRzmVTM\", \"\\xa3\" },\n  { \"ab..............\", \"abTqKyzTBdcQE\", \"\\xa3\" },\n  { \"CC..............\", \"CCZYYLpGi1lH.\", \"\\xa3\"\"a\" },\n  { \"ab..............\", \"ab.Trho55NucA\", \"\\xa3\"\"a\" },\n  { \"CC..............\", \"CCg211qX.b5cc\", \"\\xd1\\x91\" },\n  { \"ab..............\", \"ab7FZcdAi4gGI\", \"\\xd1\\x91\" },\n  { \"CC..............\", \"CCfPQN0mP.mF2\", \"\\xa3\"\"ab\" },\n  { \"ab..............\", \"abO6Dh3hnXKYk\", \"\\xa3\"\"ab\" },\n  { \"CC..............\", \"CC8cOxUkqH1as\", \"\\xff\\xff\\xa3\" },\n  { \"ab..............\", \"abiJnZqdV5Bc6\", \"\\xff\\xff\\xa3\" },\n  { \"CC..............\", \"CCutL9YOrA9uI\", \"1\\xa3\"\"345\" },\n  { \"ab..............\", \"abpOcyfwGCZ7M\", \"1\\xa3\"\"345\" },\n  { \"CC..............\", \"CCkTvRgBmtK4g\", \"\\xff\\xa3\"\"345\" },\n  { \"ab..............\", \"abPUWAfA7vSns\", \"\\xff\\xa3\"\"345\" },\n  { \"CC..............\", \"CCAtHFmg41y9Eu9AKRFbpYQk\", \"\\xff\\xa3\"\"34\\xff\\xff\\xff\\xa3\"\"345\" },\n  { \"ab..............\", \"abI531hjKAdzYsF3zv3/JKvA\", \"\\xff\\xa3\"\"34\\xff\\xff\\xff\\xa3\"\"345\" },\n  { \"CC..............\", \"CC/mlx4OdBiAkPZbn4qnw2.s98xTR2rhjKYv5InzHEygwI595ZBL6Ye7.iTixQ2vPVN2THdrwx78V9Md/xGLgH2V92/OSp159NrLg\", \"U\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xff\" },\n  { \"ab..............\", \"abD/2HQeVfH5I8cWmIiwP4Fws9AYAuBIBW6q4mdhzX45QsH68uziHZWqYd115a5lk0skcYyXosIcOGkwJasyj1r8bc.wl8x162Y5Q\", \"U\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xff\" },\n  { \"CC..............\", \"CCr8qoMD/gdWEs345DTs3Xe.EAH9EdGoz/.rJqpyURw0Osp/luMzjS4bMPsQNnZ4aAUckOLiFxloZc.hiMyL1Iw556cAkL3qEJJMU\", \"\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\" },\n  { \"ab..............\", \"abtb865WlwaOAOQYZhsInLvQp9O81qWm9PwZy0yk4BUz7YewIIWEwqMo.dPPnKRrVqLIZDsnjmQoEGUjQ4bDJ5E8QEtB7/WG4Q0iU\", \"\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\" },\n  { \"CC..............\", \"CCO7o2HcqNKcw9.JJlsXRKqQGkonR./Wpd.rWKgf6j9IG2p9YpBbZffeYcJRY.7J.s2sV.njh0Chv5EWHwzClcLdGAlIy5w1EnNys\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\" },\n  { \"ab..............\", \"ab2wHQ4RTFVKI3cyxPgr4a7QWEHfh0uTWT2qc51R8i0s.6IdtR1Wm8jNEuOnh.8s69TArVpLUfvi/oY7YsOX5N9ej66guo.cYqXoM\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\" },\n  { \"CC..............\", \"CCO7o2HcqNKcw9.JJlsXRKqQGkonR./Wpd.rWKgf6j9IG2p9YpBbZffeYcJRY.7J.s2sV.njh0Chv5EWHwzClcLdGAlIy5w1EnNysp6xkV2e9sEEcozN4OMMk1gXPaJvzXHx4gLgtk7nvvacM\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789chars after 72 are ignored\" },\n  { \"ab..............\", \"ab2wHQ4RTFVKI3cyxPgr4a7QWEHfh0uTWT2qc51R8i0s.6IdtR1Wm8jNEuOnh.8s69TArVpLUfvi/oY7YsOX5N9ej66guo.cYqXoM.3.PG6MJ8pUCo7q0zcwnaIjsK3Fo010ewQpOJZ3nqp4A\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789chars after 72 are ignored\" },\n  { \"CC..............\", \"CCddR21tiMaqgXjSVrlYrjAo/BamoDBI/g.5BZCEoYkXEUpkwVGmtI65EohwOE/9qr6swmlKdKJyiz.0oUVMxepYXA5aNlBSF6Yb2\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\" },\n  { \"ab..............\", \"abdpmZGWTUFX25HcCgIrC1RkXso4VQuZRBIyHkWmCurMVc7H/xnOtM0DgTNw7akyJaRwBda53dmCRSATwfVqDdlDwwnD2LfcTt8qA\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\" },\n  { \"CC..............\", \"CCddR21tiMaqgXjSVrlYrjAo/BamoDBI/g.5BZCEoYkXEUpkwVGmtI65EohwOE/9qr6swmlKdKJyiz.0oUVMxepYXA5aNlBSF6Yb2XirFOcRFPGk0Emf34KI.y6h.jEM31YeWkwkbBiwtUcPAMJ5SxKmhPz6\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\"\"chars after 72 are ignored as usual\" },\n  { \"ab..............\", \"abdpmZGWTUFX25HcCgIrC1RkXso4VQuZRBIyHkWmCurMVc7H/xnOtM0DgTNw7akyJaRwBda53dmCRSATwfVqDdlDwwnD2LfcTt8qAlfDCOQpIe2ogMNDWJdiEdYdxCBXjNMNRoBVTePak5LvcluA/RDQer4Y\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\"\"chars after 72 are ignored as usual\" },\n  { \"CC..............\", \"CC2RU2fzIuOsc7SvrIjqm2ewKbN1P1MJgvU8m36MjoOi4Q/die15s0b1YRrUVJ8qGcFMMaqdVwMqJ.YmgkhrmoHz/A7n.dckZEG3cIM0V/H2s8c6H2pGLAOLAdQwCzV2q8zNs.etSsFg954/oOaf.e11bkUMBOyjbAFu6OEBqZbxzcZSe6\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has forgotten.\" },\n  { \"ab..............\", \"ab7TBnHv4ezs2aEcMpSlsQBEuaf.p4Zk6uoS61vP0xzLasZZZ7NzKBXs6VjyhEW0gEW./WnJcMC6bPogRPj1CU7mwEklNG9PzQO1.e1L6Ft5iMXA8LWhVm9D/X6jn.3CdSIwOoxMQcAi0lkDM4fZClNTdP86aDazBFTtdvsVDKw4.azsbE\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has forgotten.\" },\n  { \"CC..............\", \"CC2RU2fzIuOsc\", \"THE YEAR\" },\n  { \"ab..............\", \"ab7TBnHv4ezs2\", \"THE YEAR\" },\n  { \"CC..............\", \"CC2RU2fzIuOsc7SvrIjqm2ewKbN1P1MJgvU8m36MjoOi4Q/die15s0b1YRrUVJ8qGcFMMaqdVwMqJ.YmgkhrmoHz/A7n.dckZEG3c\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and do\" },\n  { \"ab..............\", \"ab7TBnHv4ezs2aEcMpSlsQBEuaf.p4Zk6uoS61vP0xzLasZZZ7NzKBXs6VjyhEW0gEW./WnJcMC6bPogRPj1CU7mwEklNG9PzQO1.\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and do\" },\n  { \"CC..............\", \"CC2RU2fzIuOsc7SvrIjqm2ewKbN1P1MJgvU8m36MjoOi4Q/die15s0b1YRrUVJ8qGcFMMaqdVwMqJ.YmgkhrmoHz/A7n.dckZEG3cIM0V/H2s8c6H2pGLAOLAdQwCzV2q8zNs.etSsFg954/oOaf.e11bkUMBOyjbAFu6OEBqZbxzcZSe6\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has f\" },\n  { \"ab..............\", \"ab7TBnHv4ezs2aEcMpSlsQBEuaf.p4Zk6uoS61vP0xzLasZZZ7NzKBXs6VjyhEW0gEW./WnJcMC6bPogRPj1CU7mwEklNG9PzQO1.e1L6Ft5iMXA8LWhVm9D/X6jn.3CdSIwOoxMQcAi0lkDM4fZClNTdP86aDazBFTtdvsVDKw4.azsbE\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has f\" },\n#endif // bigcrypt\n\n#if INCLUDE_bsdicrypt && defined TEST_bsdicrypt\n  { \"_/...CCCC\", \"_/...CCCCBeguG7nmIew\", \"\" },\n  { \"_/...abcd\", \"_/...abcdoj0PMidvoVc\", \"\" },\n  { \"_B...CCCC\", \"_B...CCCCBeguG7nmIew\", \"\" },\n  { \"_B...abcd\", \"_B...abcdoj0PMidvoVc\", \"\" },\n  { \"_/...CCCC\", \"_/...CCCCVHofVuaSR6w\", \" \" },\n  { \"_/...abcd\", \"_/...abcdLEZHkDADUl2\", \" \" },\n  { \"_B...CCCC\", \"_B...CCCCQDmgBy8nghg\", \" \" },\n  { \"_B...abcd\", \"_B...abcdU2HCHlvuzWM\", \" \" },\n  { \"_/...CCCC\", \"_/...CCCCTvwHUrPYWbQ\", \"a\" },\n  { \"_/...abcd\", \"_/...abcdKkq2nt4mdPo\", \"a\" },\n  { \"_B...CCCC\", \"_B...CCCC967A/xgTAhs\", \"a\" },\n  { \"_B...abcd\", \"_B...abcdTq40X7Fqj5o\", \"a\" },\n  { \"_/...CCCC\", \"_/...CCCCWbyzXNEkZbo\", \"ab\" },\n  { \"_/...abcd\", \"_/...abcdFQhyndvCmqw\", \"ab\" },\n  { \"_B...CCCC\", \"_B...CCCC1UZb6e1agLQ\", \"ab\" },\n  { \"_B...abcd\", \"_B...abcdYXY3mvPund6\", \"ab\" },\n  { \"_/...CCCC\", \"_/...CCCC//OWMW4PJcU\", \"abc\" },\n  { \"_/...abcd\", \"_/...abcdYkSYkxr7rF6\", \"abc\" },\n  { \"_B...CCCC\", \"_B...CCCCqx0iPZT5wZ.\", \"abc\" },\n  { \"_B...abcd\", \"_B...abcdbvwQNHyg.Zk\", \"abc\" },\n  { \"_/...CCCC\", \"_/...CCCCCGHlkLDPnfs\", \"U*U\" },\n  { \"_/...abcd\", \"_/...abcd97DycduxF16\", \"U*U\" },\n  { \"_B...CCCC\", \"_B...CCCCYfQkIvgs0Rs\", \"U*U\" },\n  { \"_B...abcd\", \"_B...abcd.9SgPxFi5w.\", \"U*U\" },\n  { \"_/...CCCC\", \"_/...CCCCqaRcwwjiK3E\", \"U*U*\" },\n  { \"_/...abcd\", \"_/...abcdHTF2GmmTF8I\", \"U*U*\" },\n  { \"_B...CCCC\", \"_B...CCCCfNkdhjXezoo\", \"U*U*\" },\n  { \"_B...abcd\", \"_B...abcdxB8ez8kkKRw\", \"U*U*\" },\n  { \"_/...CCCC\", \"_/...CCCCIwIeyIq23gc\", \"U*U*U\" },\n  { \"_/...abcd\", \"_/...abcdaV0BQEXXcic\", \"U*U*U\" },\n  { \"_B...CCCC\", \"_B...CCCCt6tYbPIIepw\", \"U*U*U\" },\n  { \"_B...abcd\", \"_B...abcdacWDzLDRATQ\", \"U*U*U\" },\n  { \"_/...CCCC\", \"_/...CCCCF5fZ5vt.Y2g\", \".....\" },\n  { \"_/...abcd\", \"_/...abcd5YiZ7LritzU\", \".....\" },\n  { \"_B...CCCC\", \"_B...CCCCRi6lsA0puUw\", \".....\" },\n  { \"_B...abcd\", \"_B...abcdfIEOZrkcKng\", \".....\" },\n  { \"_/...CCCC\", \"_/...CCCCqSuIwqhxkds\", \"dragon\" },\n  { \"_/...abcd\", \"_/...abcd2ZORBubFtYY\", \"dragon\" },\n  { \"_B...CCCC\", \"_B...CCCCq45bbAMDyns\", \"dragon\" },\n  { \"_B...abcd\", \"_B...abcd8F9wugwUEUU\", \"dragon\" },\n  { \"_/...CCCC\", \"_/...CCCCS1p6b/YyVJ.\", \"dRaGoN\" },\n  { \"_/...abcd\", \"_/...abcd/RKLgaWc97E\", \"dRaGoN\" },\n  { \"_B...CCCC\", \"_B...CCCCtaq1OLOOZEY\", \"dRaGoN\" },\n  { \"_B...abcd\", \"_B...abcdRshIla4rkYg\", \"dRaGoN\" },\n  { \"_/...CCCC\", \"_/...CCCCMwyyu.b.0xE\", \"DrAgOn\" },\n  { \"_/...abcd\", \"_/...abcdQWTtT/Xf7Os\", \"DrAgOn\" },\n  { \"_B...CCCC\", \"_B...CCCCDzlOeJ2lpHA\", \"DrAgOn\" },\n  { \"_B...abcd\", \"_B...abcdcw7r5Sl6xws\", \"DrAgOn\" },\n  { \"_/...CCCC\", \"_/...CCCCOyVbAQbxTXw\", \"PAROLX\" },\n  { \"_/...abcd\", \"_/...abcdgn9mlSB8mWw\", \"PAROLX\" },\n  { \"_B...CCCC\", \"_B...CCCCciBqCA67jaY\", \"PAROLX\" },\n  { \"_B...abcd\", \"_B...abcd73xKpZTZvTk\", \"PAROLX\" },\n  { \"_/...CCCC\", \"_/...CCCCMToupEDpXE6\", \"U*U***U\" },\n  { \"_/...abcd\", \"_/...abcdWvB2Q73W0B2\", \"U*U***U\" },\n  { \"_B...CCCC\", \"_B...CCCCYdoTwmOvqqU\", \"U*U***U\" },\n  { \"_B...abcd\", \"_B...abcdmDfkfahfZUY\", \"U*U***U\" },\n  { \"_/...CCCC\", \"_/...CCCC1qEXrVUrwF2\", \"abcdefg\" },\n  { \"_/...abcd\", \"_/...abcd6jFhVxJKwFg\", \"abcdefg\" },\n  { \"_B...CCCC\", \"_B...CCCCrX71Rb7lmQA\", \"abcdefg\" },\n  { \"_B...abcd\", \"_B...abcdf66uYqtupCk\", \"abcdefg\" },\n  { \"_/...CCCC\", \"_/...CCCCuIpWCn4xDDg\", \"01234567\" },\n  { \"_/...abcd\", \"_/...abcdLV13lYRdOx2\", \"01234567\" },\n  { \"_B...CCCC\", \"_B...CCCCtZy/Om476tQ\", \"01234567\" },\n  { \"_B...abcd\", \"_B...abcdYMY6dr0pSo2\", \"01234567\" },\n  { \"_/...CCCC\", \"_/...CCCCfvGU5U5/3Ag\", \"726 even\" },\n  { \"_/...abcd\", \"_/...abcdoRlYhFP6gX2\", \"726 even\" },\n  { \"_B...CCCC\", \"_B...CCCCp9U8qH6KYyM\", \"726 even\" },\n  { \"_B...abcd\", \"_B...abcdDhNfVRGwuBY\", \"726 even\" },\n  { \"_/...CCCC\", \"_/...CCCCNnL0sFtBG/A\", \"zyxwvuts\" },\n  { \"_/...abcd\", \"_/...abcdW22LfMmtHI.\", \"zyxwvuts\" },\n  { \"_B...CCCC\", \"_B...CCCC5v4AmBG06Fg\", \"zyxwvuts\" },\n  { \"_B...abcd\", \"_B...abcdYeK/oCxtyR2\", \"zyxwvuts\" },\n  { \"_/...CCCC\", \"_/...CCCCuh2hDE2UEZQ\", \"ab1234567\" },\n  { \"_/...abcd\", \"_/...abcd4soDPqn3.Eg\", \"ab1234567\" },\n  { \"_B...CCCC\", \"_B...CCCCTMTOl/1Ih1M\", \"ab1234567\" },\n  { \"_B...abcd\", \"_B...abcd/baGunX9paw\", \"ab1234567\" },\n  { \"_/...CCCC\", \"_/...CCCCN18ifu91Z3Q\", \"alexander\" },\n  { \"_/...abcd\", \"_/...abcdWu/d1.77uJE\", \"alexander\" },\n  { \"_B...CCCC\", \"_B...CCCCX1xtoXIJ/zE\", \"alexander\" },\n  { \"_B...abcd\", \"_B...abcd0DnTwzHvkHg\", \"alexander\" },\n  { \"_/...CCCC\", \"_/...CCCCE/LOBAaEB2o\", \"beautiful\" },\n  { \"_/...abcd\", \"_/...abcdJR1KkREntJM\", \"beautiful\" },\n  { \"_B...CCCC\", \"_B...CCCCgsyFERc4f8Y\", \"beautiful\" },\n  { \"_B...abcd\", \"_B...abcd31iralny5.c\", \"beautiful\" },\n  { \"_/...CCCC\", \"_/...CCCCvQGKpbY8sRI\", \"challenge\" },\n  { \"_/...abcd\", \"_/...abcdxeQKPXEWSU6\", \"challenge\" },\n  { \"_B...CCCC\", \"_B...CCCCzPUz2J2CAeM\", \"challenge\" },\n  { \"_B...abcd\", \"_B...abcdKP7e72UE/2I\", \"challenge\" },\n  { \"_/...CCCC\", \"_/...CCCCrEIkl1HOZRc\", \"chocolate\" },\n  { \"_/...abcd\", \"_/...abcddaQ941FqVig\", \"chocolate\" },\n  { \"_B...CCCC\", \"_B...CCCCU/ua7R/UQQU\", \"chocolate\" },\n  { \"_B...abcd\", \"_B...abcdru8w6IGYSzE\", \"chocolate\" },\n  { \"_/...CCCC\", \"_/...CCCCtnw4Z9jZeOk\", \"cr1234567\" },\n  { \"_/...abcd\", \"_/...abcdWPgHGVKg1cE\", \"cr1234567\" },\n  { \"_B...CCCC\", \"_B...CCCCsE3lTU4mtgU\", \"cr1234567\" },\n  { \"_B...abcd\", \"_B...abcd99E4bpp3jI6\", \"cr1234567\" },\n  { \"_/...CCCC\", \"_/...CCCCkAD94zn1vyw\", \"katherine\" },\n  { \"_/...abcd\", \"_/...abcd/HYgt1AYf9E\", \"katherine\" },\n  { \"_B...CCCC\", \"_B...CCCCCy4qUrxHuIE\", \"katherine\" },\n  { \"_B...abcd\", \"_B...abcdfrfbpb6Gv6Q\", \"katherine\" },\n  { \"_/...CCCC\", \"_/...CCCCmQFknxgqJSA\", \"stephanie\" },\n  { \"_/...abcd\", \"_/...abcdfTYpn4PZyFA\", \"stephanie\" },\n  { \"_B...CCCC\", \"_B...CCCC7UCwyT8UrfU\", \"stephanie\" },\n  { \"_B...abcd\", \"_B...abcd1Gd2yx3rFg6\", \"stephanie\" },\n  { \"_/...CCCC\", \"_/...CCCC4bAcKLVxz1A\", \"sunflower\" },\n  { \"_/...abcd\", \"_/...abcdVr9y8Ld42PI\", \"sunflower\" },\n  { \"_B...CCCC\", \"_B...CCCCzLHgNhzuqVo\", \"sunflower\" },\n  { \"_B...abcd\", \"_B...abcdb82.WKSkFxc\", \"sunflower\" },\n  { \"_/...CCCC\", \"_/...CCCCIrAChAiWQkc\", \"basketball\" },\n  { \"_/...abcd\", \"_/...abcdeS19gzBKY9Y\", \"basketball\" },\n  { \"_B...CCCC\", \"_B...CCCCfU5bEsT2imA\", \"basketball\" },\n  { \"_B...abcd\", \"_B...abcd6ImZPdQTzdg\", \"basketball\" },\n  { \"_/...CCCC\", \"_/...CCCCWzz9JY4flUs\", \"porsche911\" },\n  { \"_/...abcd\", \"_/...abcdAS3sgaZRtcs\", \"porsche911\" },\n  { \"_B...CCCC\", \"_B...CCCCAETQUzGQm2.\", \"porsche911\" },\n  { \"_B...abcd\", \"_B...abcdL1X2K8TR9T6\", \"porsche911\" },\n  { \"_/...CCCC\", \"_/...CCCCHuv0KKrlCPI\", \"|_337T`/p3\" },\n  { \"_/...abcd\", \"_/...abcd4ljnAIDBnlc\", \"|_337T`/p3\" },\n  { \"_B...CCCC\", \"_B...CCCCNUdpKh1GhaQ\", \"|_337T`/p3\" },\n  { \"_B...abcd\", \"_B...abcdqUSPUtBHBPM\", \"|_337T`/p3\" },\n  { \"_/...CCCC\", \"_/...CCCCG14pqzCgI6E\", \"thunderbird\" },\n  { \"_/...abcd\", \"_/...abcdl6Vc18JcUPQ\", \"thunderbird\" },\n  { \"_B...CCCC\", \"_B...CCCCv6O7qtLKxas\", \"thunderbird\" },\n  { \"_B...abcd\", \"_B...abcdrbVYYU9qYuk\", \"thunderbird\" },\n  { \"_/...CCCC\", \"_/...CCCCAlnEgHaLlwM\", \"Hello world!\" },\n  { \"_/...abcd\", \"_/...abcdp8WwWTf1aFI\", \"Hello world!\" },\n  { \"_B...CCCC\", \"_B...CCCCJkJWYfPNHOI\", \"Hello world!\" },\n  { \"_B...abcd\", \"_B...abcdBgZI0LAA2uo\", \"Hello world!\" },\n  { \"_/...CCCC\", \"_/...CCCCT5ofitrBHDM\", \"pleaseletmein\" },\n  { \"_/...abcd\", \"_/...abcdQQDF9VfzUpk\", \"pleaseletmein\" },\n  { \"_B...CCCC\", \"_B...CCCC91UX9Wr2wj2\", \"pleaseletmein\" },\n  { \"_B...abcd\", \"_B...abcdiEY2njmAvDs\", \"pleaseletmein\" },\n  { \"_/...CCCC\", \"_/...CCCC/d9D8rYeVbA\", \"a short string\" },\n  { \"_/...abcd\", \"_/...abcdZ9IAxyf8y9s\", \"a short string\" },\n  { \"_B...CCCC\", \"_B...CCCCiLFjawTSDBY\", \"a short string\" },\n  { \"_B...abcd\", \"_B...abcdHjdgGQuMd9o\", \"a short string\" },\n  { \"_/...CCCC\", \"_/...CCCCCa.WizTe/zo\", \"zxyDPWgydbQjgq\" },\n  { \"_/...abcd\", \"_/...abcdDNQYpuvlGy2\", \"zxyDPWgydbQjgq\" },\n  { \"_B...CCCC\", \"_B...CCCCL7S9y/wTFxY\", \"zxyDPWgydbQjgq\" },\n  { \"_B...abcd\", \"_B...abcdTLnmbqTDeSU\", \"zxyDPWgydbQjgq\" },\n  { \"_/...CCCC\", \"_/...CCCCxTuhwE4k3c2\", \"photojournalism\" },\n  { \"_/...abcd\", \"_/...abcd8Tl/FO/i2HY\", \"photojournalism\" },\n  { \"_B...CCCC\", \"_B...CCCCu4oEMKvaNFI\", \"photojournalism\" },\n  { \"_B...abcd\", \"_B...abcdW81LtS9at3.\", \"photojournalism\" },\n  { \"_/...CCCC\", \"_/...CCCCgT7d4pE/Viw\", \"ecclesiastically\" },\n  { \"_/...abcd\", \"_/...abcdvsSzrxanBvA\", \"ecclesiastically\" },\n  { \"_B...CCCC\", \"_B...CCCCvbOfNfifyJw\", \"ecclesiastically\" },\n  { \"_B...abcd\", \"_B...abcdZiCTo6VHHUw\", \"ecclesiastically\" },\n  { \"_/...CCCC\", \"_/...CCCCD34AMsBSZ/o\", \"congregationalism\" },\n  { \"_/...abcd\", \"_/...abcdEng7LU93Q3.\", \"congregationalism\" },\n  { \"_B...CCCC\", \"_B...CCCCQQD4a860swI\", \"congregationalism\" },\n  { \"_B...abcd\", \"_B...abcdGkcC7.2WqWI\", \"congregationalism\" },\n  { \"_/...CCCC\", \"_/...CCCCsTqgvVPEHoU\", \"dihydrosphingosine\" },\n  { \"_/...abcd\", \"_/...abcdqmltYy4Vc8s\", \"dihydrosphingosine\" },\n  { \"_B...CCCC\", \"_B...CCCC9ZsLq14kpZ.\", \"dihydrosphingosine\" },\n  { \"_B...abcd\", \"_B...abcdhG/je5XQQuw\", \"dihydrosphingosine\" },\n  { \"_/...CCCC\", \"_/...CCCCbprZDw13EVA\", \"semianthropological\" },\n  { \"_/...abcd\", \"_/...abcd5ELmFKFCXLM\", \"semianthropological\" },\n  { \"_B...CCCC\", \"_B...CCCCXIMdWSafrR2\", \"semianthropological\" },\n  { \"_B...abcd\", \"_B...abcdc3EEwZy11VQ\", \"semianthropological\" },\n  { \"_/...CCCC\", \"_/...CCCCHO9C/P8bTQY\", \"palaeogeographically\" },\n  { \"_/...abcd\", \"_/...abcdzXoE/sq1Prg\", \"palaeogeographically\" },\n  { \"_B...CCCC\", \"_B...CCCC1Kwifqw9uGI\", \"palaeogeographically\" },\n  { \"_B...abcd\", \"_B...abcdDdTVPNkCg/M\", \"palaeogeographically\" },\n  { \"_/...CCCC\", \"_/...CCCCXMRnlxA3rsE\", \"electromyographically\" },\n  { \"_/...abcd\", \"_/...abcdlH84PIScV7M\", \"electromyographically\" },\n  { \"_B...CCCC\", \"_B...CCCCsRgPjD5SvTs\", \"electromyographically\" },\n  { \"_B...abcd\", \"_B...abcdnc1FQpVWaSs\", \"electromyographically\" },\n  { \"_/...CCCC\", \"_/...CCCC3DotYDlSnKo\", \"noninterchangeableness\" },\n  { \"_/...abcd\", \"_/...abcd01yLN5G3hoI\", \"noninterchangeableness\" },\n  { \"_B...CCCC\", \"_B...CCCCISj.TCHd/Ys\", \"noninterchangeableness\" },\n  { \"_B...abcd\", \"_B...abcdrbv3wJfw4gM\", \"noninterchangeableness\" },\n  { \"_/...CCCC\", \"_/...CCCCLy4NuWhfRTk\", \"abcdefghijklmnopqrstuvwxyz\" },\n  { \"_/...abcd\", \"_/...abcd99ziiSM8aJI\", \"abcdefghijklmnopqrstuvwxyz\" },\n  { \"_B...CCCC\", \"_B...CCCCKE2r9XSTXHE\", \"abcdefghijklmnopqrstuvwxyz\" },\n  { \"_B...abcd\", \"_B...abcdI3kkuuHXz6w\", \"abcdefghijklmnopqrstuvwxyz\" },\n  { \"_/...CCCC\", \"_/...CCCC6FgpGecPxKg\", \"electroencephalographically\" },\n  { \"_/...abcd\", \"_/...abcdmKAUeZlWWr6\", \"electroencephalographically\" },\n  { \"_B...CCCC\", \"_B...CCCCvk4oCFTH5qQ\", \"electroencephalographically\" },\n  { \"_B...abcd\", \"_B...abcdzEfhuxbzTuk\", \"electroencephalographically\" },\n  { \"_/...CCCC\", \"_/...CCCCbZ548uMFpz.\", \"antidisestablishmentarianism\" },\n  { \"_/...abcd\", \"_/...abcdGphkdzix4L6\", \"antidisestablishmentarianism\" },\n  { \"_B...CCCC\", \"_B...CCCC1bo6xasE8u2\", \"antidisestablishmentarianism\" },\n  { \"_B...abcd\", \"_B...abcdYURKTmfYk3M\", \"antidisestablishmentarianism\" },\n  { \"_/...CCCC\", \"_/...CCCCNAqf./ywd.c\", \"cyclotrimethylenetrinitramine\" },\n  { \"_/...abcd\", \"_/...abcdgYwPgw1zr/I\", \"cyclotrimethylenetrinitramine\" },\n  { \"_B...CCCC\", \"_B...CCCCKDG7alWIUlc\", \"cyclotrimethylenetrinitramine\" },\n  { \"_B...abcd\", \"_B...abcd90v9Pne/2vg\", \"cyclotrimethylenetrinitramine\" },\n  { \"_/...CCCC\", \"_/...CCCCnE8DuCyvO6c\", \"dichlorodiphenyltrichloroethane\" },\n  { \"_/...abcd\", \"_/...abcdEzf9dIUGrbw\", \"dichlorodiphenyltrichloroethane\" },\n  { \"_B...CCCC\", \"_B...CCCCYzEYe86tFpY\", \"dichlorodiphenyltrichloroethane\" },\n  { \"_B...abcd\", \"_B...abcdN8QPNXzMj1M\", \"dichlorodiphenyltrichloroethane\" },\n  { \"_/...CCCC\", \"_/...CCCCfd5wkcUh9Cs\", \"multiple words seperated by spaces\" },\n  { \"_/...abcd\", \"_/...abcdTSPjuGt3EjQ\", \"multiple words seperated by spaces\" },\n  { \"_B...CCCC\", \"_B...CCCCldyIeEqyS36\", \"multiple words seperated by spaces\" },\n  { \"_B...abcd\", \"_B...abcdDo7mF7Z4irU\", \"multiple words seperated by spaces\" },\n  { \"_/...CCCC\", \"_/...CCCCQohbLW1KjQE\", \"supercalifragilisticexpialidocious\" },\n  { \"_/...abcd\", \"_/...abcdZajK9EJp11k\", \"supercalifragilisticexpialidocious\" },\n  { \"_B...CCCC\", \"_B...CCCC7zqAeEYr99Y\", \"supercalifragilisticexpialidocious\" },\n  { \"_B...abcd\", \"_B...abcdOKtLi2Hl7kY\", \"supercalifragilisticexpialidocious\" },\n  { \"_/...CCCC\", \"_/...CCCCw6rjvmlD1hA\", \"we have a short salt string but not a short password\" },\n  { \"_/...abcd\", \"_/...abcd/og8TpJvzAw\", \"we have a short salt string but not a short password\" },\n  { \"_B...CCCC\", \"_B...CCCCZryeaXSvtzo\", \"we have a short salt string but not a short password\" },\n  { \"_B...abcd\", \"_B...abcdmNlZ8iWNgIg\", \"we have a short salt string but not a short password\" },\n  { \"_/...CCCC\", \"_/...CCCCVdtcJAFlK/M\", \"multiple word$ $eperated by $pace$ and $pecial character$\" },\n  { \"_/...abcd\", \"_/...abcdTGETkK9kn1k\", \"multiple word$ $eperated by $pace$ and $pecial character$\" },\n  { \"_B...CCCC\", \"_B...CCCC1g0udxbmRE2\", \"multiple word$ $eperated by $pace$ and $pecial character$\" },\n  { \"_B...abcd\", \"_B...abcdY/AV1NlXi0Y\", \"multiple word$ $eperated by $pace$ and $pecial character$\" },\n  { \"_/...CCCC\", \"_/...CCCCWEsepchdmMg\", \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\" },\n  { \"_/...abcd\", \"_/...abcdIjQl65Lih1A\", \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\" },\n  { \"_B...CCCC\", \"_B...CCCCWHl.4Q5ZOEs\", \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\" },\n  { \"_B...abcd\", \"_B...abcdMVExl294Kd.\", \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\" },\n  { \"_/...CCCC\", \"_/...CCCCj2jmHCAaBjo\", \"12345678901234567890123456789012345678901234567890123456789012345678901234567890\" },\n  { \"_/...abcd\", \"_/...abcdGUK83lhrwik\", \"12345678901234567890123456789012345678901234567890123456789012345678901234567890\" },\n  { \"_B...CCCC\", \"_B...CCCCOdAJ6xJLX/o\", \"12345678901234567890123456789012345678901234567890123456789012345678901234567890\" },\n  { \"_B...abcd\", \"_B...abcdrQpQTSytOBs\", \"12345678901234567890123456789012345678901234567890123456789012345678901234567890\" },\n  { \"_/...CCCC\", \"_/...CCCC1CPl3OBmy0w\", \"a very much longer text to encrypt.  This one even stretches over morethan one line.\" },\n  { \"_/...abcd\", \"_/...abcdgzlOwIfyQPA\", \"a very much longer text to encrypt.  This one even stretches over morethan one line.\" },\n  { \"_B...CCCC\", \"_B...CCCCszCdbPLEKkw\", \"a very much longer text to encrypt.  This one even stretches over morethan one line.\" },\n  { \"_B...abcd\", \"_B...abcdeHtnuHvk6z.\", \"a very much longer text to encrypt.  This one even stretches over morethan one line.\" },\n  { \"_/...CCCC\", \"_/...CCCCOyVbAQbxTXw\", \"\\xd0\\xc1\\xd2\\xcf\\xcc\\xd8\" },\n  { \"_/...abcd\", \"_/...abcdgn9mlSB8mWw\", \"\\xd0\\xc1\\xd2\\xcf\\xcc\\xd8\" },\n  { \"_B...CCCC\", \"_B...CCCCciBqCA67jaY\", \"\\xd0\\xc1\\xd2\\xcf\\xcc\\xd8\" },\n  { \"_B...abcd\", \"_B...abcd73xKpZTZvTk\", \"\\xd0\\xc1\\xd2\\xcf\\xcc\\xd8\" },\n  { \"_/...CCCC\", \"_/...CCCCf.ha3A6AlE6\", \"\\xd5\\xaa\\xd5\\xaa\\xaa\\xaa\\xd5\\xaa\" },\n  { \"_/...abcd\", \"_/...abcdwYSh45VDTgc\", \"\\xd5\\xaa\\xd5\\xaa\\xaa\\xaa\\xd5\\xaa\" },\n  { \"_B...CCCC\", \"_B...CCCCfRP64097qJQ\", \"\\xd5\\xaa\\xd5\\xaa\\xaa\\xaa\\xd5\\xaa\" },\n  { \"_B...abcd\", \"_B...abcdi555w3aRRUM\", \"\\xd5\\xaa\\xd5\\xaa\\xaa\\xaa\\xd5\\xaa\" },\n  { \"_/...CCCC\", \"_/...CCCCN18ifu91Z3Q\", \"\\xe1\\xec\\xe5\\xf8\\xe1\\xee\\xe4\\xe5\\xf2\" },\n  { \"_/...abcd\", \"_/...abcdWu/d1.77uJE\", \"\\xe1\\xec\\xe5\\xf8\\xe1\\xee\\xe4\\xe5\\xf2\" },\n  { \"_B...CCCC\", \"_B...CCCCX1xtoXIJ/zE\", \"\\xe1\\xec\\xe5\\xf8\\xe1\\xee\\xe4\\xe5\\xf2\" },\n  { \"_B...abcd\", \"_B...abcd0DnTwzHvkHg\", \"\\xe1\\xec\\xe5\\xf8\\xe1\\xee\\xe4\\xe5\\xf2\" },\n  { \"_/...CCCC\", \"_/...CCCCmQFknxgqJSA\", \"\\xf3\\xf4\\xe5\\xf0\\xe8\\xe1\\xee\\xe9\\xe5\" },\n  { \"_/...abcd\", \"_/...abcdfTYpn4PZyFA\", \"\\xf3\\xf4\\xe5\\xf0\\xe8\\xe1\\xee\\xe9\\xe5\" },\n  { \"_B...CCCC\", \"_B...CCCC7UCwyT8UrfU\", \"\\xf3\\xf4\\xe5\\xf0\\xe8\\xe1\\xee\\xe9\\xe5\" },\n  { \"_B...abcd\", \"_B...abcd1Gd2yx3rFg6\", \"\\xf3\\xf4\\xe5\\xf0\\xe8\\xe1\\xee\\xe9\\xe5\" },\n  { \"_/...CCCC\", \"_/...CCCCf//DLBYyJMU\", \"\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\" },\n  { \"_/...abcd\", \"_/...abcdwJgzAwQgoNc\", \"\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\" },\n  { \"_B...CCCC\", \"_B...CCCCO6z7UViseDU\", \"\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\" },\n  { \"_B...abcd\", \"_B...abcd.FvEj1rW/UM\", \"\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\" },\n  { \"_/...CCCC\", \"_/...CCCCIrNSleSGrAU\", \"\\xc3\\xa9tude\" },\n  { \"_/...abcd\", \"_/...abcdezBVbMgQK0w\", \"\\xc3\\xa9tude\" },\n  { \"_B...CCCC\", \"_B...CCCCrP2p4rL84HE\", \"\\xc3\\xa9tude\" },\n  { \"_B...abcd\", \"_B...abcdIz8/KfzGFl.\", \"\\xc3\\xa9tude\" },\n  { \"_/...CCCC\", \"_/...CCCCIrNSleSGrAU\", \"C)tude\" },\n  { \"_/...abcd\", \"_/...abcdezBVbMgQK0w\", \"C)tude\" },\n  { \"_B...CCCC\", \"_B...CCCCrP2p4rL84HE\", \"C)tude\" },\n  { \"_B...abcd\", \"_B...abcdIz8/KfzGFl.\", \"C)tude\" },\n  { \"_/...CCCC\", \"_/...CCCCNCR4z9/J5v2\", \"Chl\\xc3\\xb6\"\"e\" },\n  { \"_/...abcd\", \"_/...abcdZQEk8g4rxpU\", \"Chl\\xc3\\xb6\"\"e\" },\n  { \"_B...CCCC\", \"_B...CCCCICvqPQjdeOs\", \"Chl\\xc3\\xb6\"\"e\" },\n  { \"_B...abcd\", \"_B...abcdnNfT0CunTfw\", \"Chl\\xc3\\xb6\"\"e\" },\n  { \"_/...CCCC\", \"_/...CCCCNCR4z9/J5v2\", \"ChlC6e\" },\n  { \"_/...abcd\", \"_/...abcdZQEk8g4rxpU\", \"ChlC6e\" },\n  { \"_B...CCCC\", \"_B...CCCCICvqPQjdeOs\", \"ChlC6e\" },\n  { \"_B...abcd\", \"_B...abcdnNfT0CunTfw\", \"ChlC6e\" },\n  { \"_/...CCCC\", \"_/...CCCCLAnu2LMWrn6\", \"\\xc3\\x85ngstr\\xc3\\xb6m\" },\n  { \"_/...abcd\", \"_/...abcdobTsvviP/3k\", \"\\xc3\\x85ngstr\\xc3\\xb6m\" },\n  { \"_B...CCCC\", \"_B...CCCC0D8JPFOSneE\", \"\\xc3\\x85ngstr\\xc3\\xb6m\" },\n  { \"_B...abcd\", \"_B...abcdrcZ5N..M/OM\", \"\\xc3\\x85ngstr\\xc3\\xb6m\" },\n  { \"_/...CCCC\", \"_/...CCCCLAnu2LMWrn6\", \"C\\x05ngstrC6m\" },\n  { \"_/...abcd\", \"_/...abcdobTsvviP/3k\", \"C\\x05ngstrC6m\" },\n  { \"_B...CCCC\", \"_B...CCCC0D8JPFOSneE\", \"C\\x05ngstrC6m\" },\n  { \"_B...abcd\", \"_B...abcdrcZ5N..M/OM\", \"C\\x05ngstrC6m\" },\n  { \"_/...CCCC\", \"_/...CCCCtnJ8cCo.3zM\", \"C\\x05ngstrCU*U***U*\" },\n  { \"_/...abcd\", \"_/...abcdxcMJ4rXbM9A\", \"C\\x05ngstrCU*U***U*\" },\n  { \"_B...CCCC\", \"_B...CCCC4f/Jm9JWuiI\", \"C\\x05ngstrCU*U***U*\" },\n  { \"_B...abcd\", \"_B...abcdZZ3FoMqo/fU\", \"C\\x05ngstrCU*U***U*\" },\n  { \"_/...CCCC\", \"_/...CCCCAJ3mNbmiHno\", \"U*U***U*ignored\" },\n  { \"_/...abcd\", \"_/...abcdQsIF/0O3j8o\", \"U*U***U*ignored\" },\n  { \"_B...CCCC\", \"_B...CCCCqpxkiIrevrg\", \"U*U***U*ignored\" },\n  { \"_B...abcd\", \"_B...abcdY5.r.59htLA\", \"U*U***U*ignored\" },\n  { \"_/...CCCC\", \"_/...CCCCHBolZ/cIO2.\", \"U*U*U*U*\" },\n  { \"_/...abcd\", \"_/...abcdE9xumTAImPc\", \"U*U*U*U*\" },\n  { \"_B...CCCC\", \"_B...CCCCqMC/M8JYgQQ\", \"U*U*U*U*\" },\n  { \"_B...abcd\", \"_B...abcdDw27Hu8t7vI\", \"U*U*U*U*\" },\n  { \"_/...CCCC\", \"_/...CCCC83SohZDUyuM\", \"U*U*U*U*ignored\" },\n  { \"_/...abcd\", \"_/...abcdzIRDXyWsFMs\", \"U*U*U*U*ignored\" },\n  { \"_B...CCCC\", \"_B...CCCCNZ46e2ZQlq.\", \"U*U*U*U*ignored\" },\n  { \"_B...abcd\", \"_B...abcdpo64mjPxzvM\", \"U*U*U*U*ignored\" },\n  { \"_/...CCCC\", \"_/...CCCCWwLAdDLAlqU\", \"*U*U*U*U\" },\n  { \"_/...abcd\", \"_/...abcd32gqx.9DhNY\", \"*U*U*U*U\" },\n  { \"_B...CCCC\", \"_B...CCCCFytsW43tAPc\", \"*U*U*U*U\" },\n  { \"_B...abcd\", \"_B...abcdWIJ23vb0VYY\", \"*U*U*U*U\" },\n  { \"_/...CCCC\", \"_/...CCCC1t6b8imrh7.\", \"*U*U*U*U*\" },\n  { \"_/...abcd\", \"_/...abcdFBV2KHxgnJU\", \"*U*U*U*U*\" },\n  { \"_B...CCCC\", \"_B...CCCC7zMLShIGmes\", \"*U*U*U*U*\" },\n  { \"_B...abcd\", \"_B...abcdYoxn5ShdX1.\", \"*U*U*U*U*\" },\n  { \"_/...CCCC\", \"_/...CCCCOI9YZn/9qq.\", \"*U*U*U*U*U*U*U*U\" },\n  { \"_/...abcd\", \"_/...abcdq/kBDDh1pFg\", \"*U*U*U*U*U*U*U*U\" },\n  { \"_B...CCCC\", \"_B...CCCC9VsCmAIVNAI\", \"*U*U*U*U*U*U*U*U\" },\n  { \"_B...abcd\", \"_B...abcd6k74YyhApEU\", \"*U*U*U*U*U*U*U*U\" },\n  { \"_/...CCCC\", \"_/...CCCCf//DLBYyJMU\", \"*U*U*U*U*U*U*U*U*\" },\n  { \"_/...abcd\", \"_/...abcdwJgzAwQgoNc\", \"*U*U*U*U*U*U*U*U*\" },\n  { \"_B...CCCC\", \"_B...CCCCO6z7UViseDU\", \"*U*U*U*U*U*U*U*U*\" },\n  { \"_B...abcd\", \"_B...abcd.FvEj1rW/UM\", \"*U*U*U*U*U*U*U*U*\" },\n  { \"_/...CCCC\", \"_/...CCCCWfYoiTx6C4k\", \"\\xa3\" },\n  { \"_/...abcd\", \"_/...abcdpjvjs1/CK9M\", \"\\xa3\" },\n  { \"_B...CCCC\", \"_B...CCCC6mv7.mqDSWM\", \"\\xa3\" },\n  { \"_B...abcd\", \"_B...abcd9vcuX17ZKQM\", \"\\xa3\" },\n  { \"_/...CCCC\", \"_/...CCCCwf2kZE/5XSk\", \"\\xa3\"\"a\" },\n  { \"_/...abcd\", \"_/...abcd0fl0VsRHBl2\", \"\\xa3\"\"a\" },\n  { \"_B...CCCC\", \"_B...CCCCGhg85Fw0nuU\", \"\\xa3\"\"a\" },\n  { \"_B...abcd\", \"_B...abcdDmwRvC2gx2c\", \"\\xa3\"\"a\" },\n  { \"_/...CCCC\", \"_/...CCCC96w6ooDlSgk\", \"\\xd1\\x91\" },\n  { \"_/...abcd\", \"_/...abcdPEGrYCRYQ4A\", \"\\xd1\\x91\" },\n  { \"_B...CCCC\", \"_B...CCCCorJXnoXlg22\", \"\\xd1\\x91\" },\n  { \"_B...abcd\", \"_B...abcdKj9MRtC9gfE\", \"\\xd1\\x91\" },\n  { \"_/...CCCC\", \"_/...CCCCgKEz7Km9Af6\", \"\\xa3\"\"ab\" },\n  { \"_/...abcd\", \"_/...abcd9skGqMXuOMI\", \"\\xa3\"\"ab\" },\n  { \"_B...CCCC\", \"_B...CCCCj7WBOKCRAdA\", \"\\xa3\"\"ab\" },\n  { \"_B...abcd\", \"_B...abcd0d0WtNaDq/Q\", \"\\xa3\"\"ab\" },\n  { \"_/...CCCC\", \"_/...CCCCJSgJw/3uDc.\", \"\\xff\\xff\\xa3\" },\n  { \"_/...abcd\", \"_/...abcdbqKxdmFmTTo\", \"\\xff\\xff\\xa3\" },\n  { \"_B...CCCC\", \"_B...CCCC5Vcxf9knCr2\", \"\\xff\\xff\\xa3\" },\n  { \"_B...abcd\", \"_B...abcdts1BGqqdCoI\", \"\\xff\\xff\\xa3\" },\n  { \"_/...CCCC\", \"_/...CCCCCV6VaZRDapg\", \"1\\xa3\"\"345\" },\n  { \"_/...abcd\", \"_/...abcdF/oeA2QzhNE\", \"1\\xa3\"\"345\" },\n  { \"_B...CCCC\", \"_B...CCCCk9FNkKv87g6\", \"1\\xa3\"\"345\" },\n  { \"_B...abcd\", \"_B...abcdfZojC31y3M2\", \"1\\xa3\"\"345\" },\n  { \"_/...CCCC\", \"_/...CCCCPy4k/ab3P4U\", \"\\xff\\xa3\"\"345\" },\n  { \"_/...abcd\", \"_/...abcdVGDgkxePVgk\", \"\\xff\\xa3\"\"345\" },\n  { \"_B...CCCC\", \"_B...CCCCR20qfTcbOmk\", \"\\xff\\xa3\"\"345\" },\n  { \"_B...abcd\", \"_B...abcdkN.76rSsn3M\", \"\\xff\\xa3\"\"345\" },\n  { \"_/...CCCC\", \"_/...CCCCbOgFif1W21o\", \"\\xff\\xa3\"\"34\\xff\\xff\\xff\\xa3\"\"345\" },\n  { \"_/...abcd\", \"_/...abcdInpCH72mumM\", \"\\xff\\xa3\"\"34\\xff\\xff\\xff\\xa3\"\"345\" },\n  { \"_B...CCCC\", \"_B...CCCCxo3D/g7TQ4U\", \"\\xff\\xa3\"\"34\\xff\\xff\\xff\\xa3\"\"345\" },\n  { \"_B...abcd\", \"_B...abcdhAvj.atD1Ro\", \"\\xff\\xa3\"\"34\\xff\\xff\\xff\\xa3\"\"345\" },\n  { \"_/...CCCC\", \"_/...CCCCCgoxx8JH4nU\", \"U\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xff\" },\n  { \"_/...abcd\", \"_/...abcdBFIGRJ7nTC6\", \"U\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xff\" },\n  { \"_B...CCCC\", \"_B...CCCCKwGgfbWFM2w\", \"U\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xff\" },\n  { \"_B...abcd\", \"_B...abcdydXuqMqLDTA\", \"U\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xff\" },\n  { \"_/...CCCC\", \"_/...CCCCf0Dq2rnmjyE\", \"\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\" },\n  { \"_/...abcd\", \"_/...abcdNqj2pLcQCIs\", \"\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\" },\n  { \"_B...CCCC\", \"_B...CCCCwMu3fbiD6Ps\", \"\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\" },\n  { \"_B...abcd\", \"_B...abcdbwY0XWYUiIE\", \"\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\" },\n  { \"_/...CCCC\", \"_/...CCCChh18zOEj2I.\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\" },\n  { \"_/...abcd\", \"_/...abcdzhT0k99wsyw\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\" },\n  { \"_B...CCCC\", \"_B...CCCC9L9SrjKUHUw\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\" },\n  { \"_B...abcd\", \"_B...abcdPerVNjIHgcI\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\" },\n  { \"_/...CCCC\", \"_/...CCCCBQOmoWLUSwc\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789chars after 72 are ignored\" },\n  { \"_/...abcd\", \"_/...abcdpDS9tO8bBy6\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789chars after 72 are ignored\" },\n  { \"_B...CCCC\", \"_B...CCCCRvxv4EXcbak\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789chars after 72 are ignored\" },\n  { \"_B...abcd\", \"_B...abcd9m2IxfC3gSE\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789chars after 72 are ignored\" },\n  { \"_/...CCCC\", \"_/...CCCC314jfbWa8nk\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\" },\n  { \"_/...abcd\", \"_/...abcd1MfrH9pD3ik\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\" },\n  { \"_B...CCCC\", \"_B...CCCCmtzL2gX5gLQ\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\" },\n  { \"_B...abcd\", \"_B...abcdUbPKEiaFUXw\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\" },\n  { \"_/...CCCC\", \"_/...CCCCJPJX36vYR.I\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\"\"chars after 72 are ignored as usual\" },\n  { \"_/...abcd\", \"_/...abcdhxm0.K3aBNs\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\"\"chars after 72 are ignored as usual\" },\n  { \"_B...CCCC\", \"_B...CCCC61eHvZQ80Z.\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\"\"chars after 72 are ignored as usual\" },\n  { \"_B...abcd\", \"_B...abcdQ.TCe07hQYY\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\"\"chars after 72 are ignored as usual\" },\n  { \"_/...CCCC\", \"_/...CCCCotFKYQijdBQ\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has forgotten.\" },\n  { \"_/...abcd\", \"_/...abcdfglVkBExi8U\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has forgotten.\" },\n  { \"_B...CCCC\", \"_B...CCCCRiZfxAVj2yU\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has forgotten.\" },\n  { \"_B...abcd\", \"_B...abcdEYqapacaAYs\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has forgotten.\" },\n  { \"_/...CCCC\", \"_/...CCCCUELtB3Fru9g\", \"THE YEAR\" },\n  { \"_/...abcd\", \"_/...abcdw6dwjS9jP1Y\", \"THE YEAR\" },\n  { \"_B...CCCC\", \"_B...CCCCh2RbaCahLzU\", \"THE YEAR\" },\n  { \"_B...abcd\", \"_B...abcdQx0zygxMhZs\", \"THE YEAR\" },\n  { \"_/...CCCC\", \"_/...CCCCy0pVqCLVn2o\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and do\" },\n  { \"_/...abcd\", \"_/...abcd2VeQzRb/CRw\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and do\" },\n  { \"_B...CCCC\", \"_B...CCCCq3yznjfxdu6\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and do\" },\n  { \"_B...abcd\", \"_B...abcdFvVe3CG2rcw\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and do\" },\n  { \"_/...CCCC\", \"_/...CCCC3P3XpjNKeAs\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has f\" },\n  { \"_/...abcd\", \"_/...abcdVZdYUgXYPWM\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has f\" },\n  { \"_B...CCCC\", \"_B...CCCCSqu8dXTjc5Q\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has f\" },\n  { \"_B...abcd\", \"_B...abcdbJQyCuuvcgI\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has f\" },\n#endif // bsdicrypt\n\n#if INCLUDE_descrypt && defined TEST_descrypt\n  { \"CC\", \"CCHYKxYMMLQN2\", \"\" },\n  { \"ab\", \"abmF1QH4PEr.E\", \"\" },\n  { \"CC\", \"CCcePb2UhZY96\", \" \" },\n  { \"ab\", \"ab3nfvqkpDCz6\", \" \" },\n  { \"CC\", \"CCu3ZS/UCwMaA\", \"a\" },\n  { \"ab\", \"abxxB7HlIeckU\", \"a\" },\n  { \"CC\", \"CC0MiZNhf/ACw\", \"ab\" },\n  { \"ab\", \"abAwh7.RciMzE\", \"ab\" },\n  { \"CC\", \"CCQ4IySE25HV2\", \"abc\" },\n  { \"ab\", \"abFZSxKKdq5s6\", \"abc\" },\n  { \"CC\", \"CCHc6HsfCQ5t6\", \"U*U\" },\n  { \"ab\", \"abCY/CHNnliwA\", \"U*U\" },\n  { \"CC\", \"CCmOvmGnYgIOQ\", \"U*U*\" },\n  { \"ab\", \"abrP9hatwxlsc\", \"U*U*\" },\n  { \"CC\", \"CCzd9NlE45556\", \"U*U*U\" },\n  { \"ab\", \"ab9YovNfzixZE\", \"U*U*U\" },\n  { \"CC\", \"CCvbcTIyRnP1s\", \".....\" },\n  { \"ab\", \"abQcwGqfvDF4U\", \".....\" },\n  { \"CC\", \"CCcMgHKAHJ1SA\", \"dragon\" },\n  { \"ab\", \"ab6Gj9YvrF2As\", \"dragon\" },\n  { \"CC\", \"CCK5kzKL/XuQY\", \"dRaGoN\" },\n  { \"ab\", \"abmNlUI1COvYE\", \"dRaGoN\" },\n  { \"CC\", \"CCRDslM6u7nAk\", \"DrAgOn\" },\n  { \"ab\", \"abUqB6rDk72W2\", \"DrAgOn\" },\n  { \"CC\", \"CCUj.vcbp0YcQ\", \"PAROLX\" },\n  { \"ab\", \"ab2mSJsfAaEYc\", \"PAROLX\" },\n  { \"CC\", \"CCX.K.MFy4Ois\", \"U*U***U\" },\n  { \"ab\", \"abRk/fdtGCS02\", \"U*U***U\" },\n  { \"CC\", \"CC457075f2366\", \"abcdefg\" },\n  { \"ab\", \"abJ1KhM1sjlUo\", \"abcdefg\" },\n  { \"CC\", \"CCO7o2HcqNKcw\", \"01234567\" },\n  { \"ab\", \"ab2wHQ4RTFVKI\", \"01234567\" },\n  { \"CC\", \"CCBsM2N7uDf4I\", \"726 even\" },\n  { \"ab\", \"abvP7wxxQ4tog\", \"726 even\" },\n  { \"CC\", \"CCOGSgC4qjcA2\", \"zyxwvuts\" },\n  { \"ab\", \"abbEulwxH3FHA\", \"zyxwvuts\" },\n  { \"CC\", \"CCVTQupjkvqPY\", \"ab1234567\" },\n  { \"ab\", \"abnYLVrXaFJ5w\", \"ab1234567\" },\n  { \"CC\", \"CCk4Onp6WTPTY\", \"alexander\" },\n  { \"ab\", \"ab76vmlPVRy5Q\", \"alexander\" },\n  { \"CC\", \"CCoUdX6WyGKgs\", \"beautiful\" },\n  { \"ab\", \"abwfsjWX4EyO.\", \"beautiful\" },\n  { \"CC\", \"CC9P2ZjaWPiSQ\", \"challenge\" },\n  { \"ab\", \"abNf5XM5DhRJs\", \"challenge\" },\n  { \"CC\", \"CCFkZ6ziYuRO2\", \"chocolate\" },\n  { \"ab\", \"ab5g9v/XGNiAQ\", \"chocolate\" },\n  { \"CC\", \"CCNbsdP6Epo2.\", \"cr1234567\" },\n  { \"ab\", \"abxR5d2mWY2Gg\", \"cr1234567\" },\n  { \"CC\", \"CCOwLOT2cAuVI\", \"katherine\" },\n  { \"ab\", \"abzBVZ7aWUKM6\", \"katherine\" },\n  { \"CC\", \"CCoLp0sLZdas2\", \"stephanie\" },\n  { \"ab\", \"abO4gfga4XKD.\", \"stephanie\" },\n  { \"CC\", \"CCZrXpzITbV1k\", \"sunflower\" },\n  { \"ab\", \"ab48pizZvB/R2\", \"sunflower\" },\n  { \"CC\", \"CC6fdwBHH3atw\", \"basketball\" },\n  { \"ab\", \"abJqfe.5maUGk\", \"basketball\" },\n  { \"CC\", \"CCJa7tMefq.rw\", \"porsche911\" },\n  { \"ab\", \"abAXo0qGhDad2\", \"porsche911\" },\n  { \"CC\", \"CCiwAFQV9a8P2\", \"|_337T`/p3\" },\n  { \"ab\", \"abhOzUBEprC2M\", \"|_337T`/p3\" },\n  { \"CC\", \"CCUIVkP6RhPU.\", \"thunderbird\" },\n  { \"ab\", \"abqhNEbBQBA3s\", \"thunderbird\" },\n  { \"CC\", \"CC.FXhmgF9eGU\", \"Hello world!\" },\n  { \"ab\", \"abMbH7WsHr7wQ\", \"Hello world!\" },\n  { \"CC\", \"CCBkhrj5Ptwl6\", \"pleaseletmein\" },\n  { \"ab\", \"ab/DEQq.fnuz6\", \"pleaseletmein\" },\n  { \"CC\", \"CCL8hSYYbUTgs\", \"a short string\" },\n  { \"ab\", \"abgpCbJjOvjuo\", \"a short string\" },\n  { \"CC\", \"CCzCSKYTyC2JE\", \"zxyDPWgydbQjgq\" },\n  { \"ab\", \"abfcHW3Eqw9a6\", \"zxyDPWgydbQjgq\" },\n  { \"CC\", \"CCedg2FJ0iNYI\", \"photojournalism\" },\n  { \"ab\", \"abZW.Bx7lmec.\", \"photojournalism\" },\n  { \"CC\", \"CC9rjRlxb4hYI\", \"ecclesiastically\" },\n  { \"ab\", \"abWR9L6FAAjBU\", \"ecclesiastically\" },\n  { \"CC\", \"CCdDDsxFI3f1I\", \"congregationalism\" },\n  { \"ab\", \"abCQz3pDUMwjE\", \"congregationalism\" },\n  { \"CC\", \"CCObKp6oZ/Ijs\", \"dihydrosphingosine\" },\n  { \"ab\", \"abi0ZGA2O7vz2\", \"dihydrosphingosine\" },\n  { \"CC\", \"CCSd6IjC3XUtQ\", \"semianthropological\" },\n  { \"ab\", \"abkpCn0UslKR2\", \"semianthropological\" },\n  { \"CC\", \"CCkszowLaKwQI\", \"palaeogeographically\" },\n  { \"ab\", \"abQpNzgtS8Y4.\", \"palaeogeographically\" },\n  { \"CC\", \"CCj4BLTHC8dPQ\", \"electromyographically\" },\n  { \"ab\", \"abhofIPtJKDnI\", \"electromyographically\" },\n  { \"CC\", \"CCqYSYdfJDa9A\", \"noninterchangeableness\" },\n  { \"ab\", \"abjBC5WWqUx5s\", \"noninterchangeableness\" },\n  { \"CC\", \"CCYiWECFTvLbo\", \"abcdefghijklmnopqrstuvwxyz\" },\n  { \"ab\", \"abYH7TYgEKz2Q\", \"abcdefghijklmnopqrstuvwxyz\" },\n  { \"CC\", \"CCDUc5yYKE2dI\", \"electroencephalographically\" },\n  { \"ab\", \"abooZTCeS9jSg\", \"electroencephalographically\" },\n  { \"CC\", \"CCvT8tKTENFfo\", \"antidisestablishmentarianism\" },\n  { \"ab\", \"ab6c/K2rnT8Aw\", \"antidisestablishmentarianism\" },\n  { \"CC\", \"CCqCWJUufOFw6\", \"cyclotrimethylenetrinitramine\" },\n  { \"ab\", \"abzi9F1yuymUQ\", \"cyclotrimethylenetrinitramine\" },\n  { \"CC\", \"CCWpLVCzkv4Gs\", \"dichlorodiphenyltrichloroethane\" },\n  { \"ab\", \"abAXyrMLt2fwc\", \"dichlorodiphenyltrichloroethane\" },\n  { \"CC\", \"CCFAo2el2sagU\", \"multiple words seperated by spaces\" },\n  { \"ab\", \"abAYLFLzcWoWo\", \"multiple words seperated by spaces\" },\n  { \"CC\", \"CCSz2gog3i0co\", \"supercalifragilisticexpialidocious\" },\n  { \"ab\", \"abBTyQ2AdyQW.\", \"supercalifragilisticexpialidocious\" },\n  { \"CC\", \"CCRFMtw/2Yz6c\", \"we have a short salt string but not a short password\" },\n  { \"ab\", \"abBCBt9IU4lug\", \"we have a short salt string but not a short password\" },\n  { \"CC\", \"CCFAo2el2sagU\", \"multiple word$ $eperated by $pace$ and $pecial character$\" },\n  { \"ab\", \"abAYLFLzcWoWo\", \"multiple word$ $eperated by $pace$ and $pecial character$\" },\n  { \"CC\", \"CC.nSMd1oqoug\", \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\" },\n  { \"ab\", \"abzCGr5cnwu5Q\", \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\" },\n  { \"CC\", \"CCehtSXY9VcgU\", \"12345678901234567890123456789012345678901234567890123456789012345678901234567890\" },\n  { \"ab\", \"ab1iBa.N.U2C6\", \"12345678901234567890123456789012345678901234567890123456789012345678901234567890\" },\n  { \"CC\", \"CCeWCPWeB0Y7s\", \"a very much longer text to encrypt.  This one even stretches over morethan one line.\" },\n  { \"ab\", \"abmQw6w8KuXCQ\", \"a very much longer text to encrypt.  This one even stretches over morethan one line.\" },\n  { \"CC\", \"CCUj.vcbp0YcQ\", \"\\xd0\\xc1\\xd2\\xcf\\xcc\\xd8\" },\n  { \"ab\", \"ab2mSJsfAaEYc\", \"\\xd0\\xc1\\xd2\\xcf\\xcc\\xd8\" },\n  { \"CC\", \"CC4rMpbg9AMZ.\", \"\\xd5\\xaa\\xd5\\xaa\\xaa\\xaa\\xd5\\xaa\" },\n  { \"ab\", \"abP6zaVz4PU9U\", \"\\xd5\\xaa\\xd5\\xaa\\xaa\\xaa\\xd5\\xaa\" },\n  { \"CC\", \"CCk4Onp6WTPTY\", \"\\xe1\\xec\\xe5\\xf8\\xe1\\xee\\xe4\\xe5\\xf2\" },\n  { \"ab\", \"ab76vmlPVRy5Q\", \"\\xe1\\xec\\xe5\\xf8\\xe1\\xee\\xe4\\xe5\\xf2\" },\n  { \"CC\", \"CCoLp0sLZdas2\", \"\\xf3\\xf4\\xe5\\xf0\\xe8\\xe1\\xee\\xe9\\xe5\" },\n  { \"ab\", \"abO4gfga4XKD.\", \"\\xf3\\xf4\\xe5\\xf0\\xe8\\xe1\\xee\\xe9\\xe5\" },\n  { \"CC\", \"CCr8qoMD/gdWE\", \"\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\" },\n  { \"ab\", \"abtb865WlwaOA\", \"\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\" },\n  { \"CC\", \"CCn9g8mHJ8WxU\", \"\\xc3\\xa9tude\" },\n  { \"ab\", \"ab4vjYACxKO9o\", \"\\xc3\\xa9tude\" },\n  { \"CC\", \"CCn9g8mHJ8WxU\", \"C)tude\" },\n  { \"ab\", \"ab4vjYACxKO9o\", \"C)tude\" },\n  { \"CC\", \"CCRgyVVVpXpM2\", \"Chl\\xc3\\xb6\"\"e\" },\n  { \"ab\", \"ab5zWidETSBlE\", \"Chl\\xc3\\xb6\"\"e\" },\n  { \"CC\", \"CCRgyVVVpXpM2\", \"ChlC6e\" },\n  { \"ab\", \"ab5zWidETSBlE\", \"ChlC6e\" },\n  { \"CC\", \"CCM6/Cpgtljf2\", \"\\xc3\\x85ngstr\\xc3\\xb6m\" },\n  { \"ab\", \"abaBhSVlHGKLI\", \"\\xc3\\x85ngstr\\xc3\\xb6m\" },\n  { \"CC\", \"CCM6/Cpgtljf2\", \"C\\x05ngstrC6m\" },\n  { \"ab\", \"abaBhSVlHGKLI\", \"C\\x05ngstrC6m\" },\n  { \"CC\", \"CCM6/Cpgtljf2\", \"C\\x05ngstrCU*U***U*\" },\n  { \"ab\", \"abaBhSVlHGKLI\", \"C\\x05ngstrCU*U***U*\" },\n  { \"CC\", \"CC4rMpbg9AMZ.\", \"U*U***U*ignored\" },\n  { \"ab\", \"abP6zaVz4PU9U\", \"U*U***U*ignored\" },\n  { \"CC\", \"CCNf8Sbh3HDfQ\", \"U*U*U*U*\" },\n  { \"ab\", \"ab3RlyzKJBvlk\", \"U*U*U*U*\" },\n  { \"CC\", \"CCNf8Sbh3HDfQ\", \"U*U*U*U*ignored\" },\n  { \"ab\", \"ab3RlyzKJBvlk\", \"U*U*U*U*ignored\" },\n  { \"CC\", \"CCr8qoMD/gdWE\", \"*U*U*U*U\" },\n  { \"ab\", \"abtb865WlwaOA\", \"*U*U*U*U\" },\n  { \"CC\", \"CCr8qoMD/gdWE\", \"*U*U*U*U*\" },\n  { \"ab\", \"abtb865WlwaOA\", \"*U*U*U*U*\" },\n  { \"CC\", \"CCr8qoMD/gdWE\", \"*U*U*U*U*U*U*U*U\" },\n  { \"ab\", \"abtb865WlwaOA\", \"*U*U*U*U*U*U*U*U\" },\n  { \"CC\", \"CCr8qoMD/gdWE\", \"*U*U*U*U*U*U*U*U*\" },\n  { \"ab\", \"abtb865WlwaOA\", \"*U*U*U*U*U*U*U*U*\" },\n  { \"CC\", \"CCwH9PyRzmVTM\", \"\\xa3\" },\n  { \"ab\", \"abTqKyzTBdcQE\", \"\\xa3\" },\n  { \"CC\", \"CCZYYLpGi1lH.\", \"\\xa3\"\"a\" },\n  { \"ab\", \"ab.Trho55NucA\", \"\\xa3\"\"a\" },\n  { \"CC\", \"CCg211qX.b5cc\", \"\\xd1\\x91\" },\n  { \"ab\", \"ab7FZcdAi4gGI\", \"\\xd1\\x91\" },\n  { \"CC\", \"CCfPQN0mP.mF2\", \"\\xa3\"\"ab\" },\n  { \"ab\", \"abO6Dh3hnXKYk\", \"\\xa3\"\"ab\" },\n  { \"CC\", \"CC8cOxUkqH1as\", \"\\xff\\xff\\xa3\" },\n  { \"ab\", \"abiJnZqdV5Bc6\", \"\\xff\\xff\\xa3\" },\n  { \"CC\", \"CCutL9YOrA9uI\", \"1\\xa3\"\"345\" },\n  { \"ab\", \"abpOcyfwGCZ7M\", \"1\\xa3\"\"345\" },\n  { \"CC\", \"CCkTvRgBmtK4g\", \"\\xff\\xa3\"\"345\" },\n  { \"ab\", \"abPUWAfA7vSns\", \"\\xff\\xa3\"\"345\" },\n  { \"CC\", \"CCAtHFmg41y9E\", \"\\xff\\xa3\"\"34\\xff\\xff\\xff\\xa3\"\"345\" },\n  { \"ab\", \"abI531hjKAdzY\", \"\\xff\\xa3\"\"34\\xff\\xff\\xff\\xa3\"\"345\" },\n  { \"CC\", \"CC/mlx4OdBiAk\", \"U\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xff\" },\n  { \"ab\", \"abD/2HQeVfH5I\", \"U\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xff\" },\n  { \"CC\", \"CCr8qoMD/gdWE\", \"\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\" },\n  { \"ab\", \"abtb865WlwaOA\", \"\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\" },\n  { \"CC\", \"CCO7o2HcqNKcw\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\" },\n  { \"ab\", \"ab2wHQ4RTFVKI\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\" },\n  { \"CC\", \"CCO7o2HcqNKcw\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789chars after 72 are ignored\" },\n  { \"ab\", \"ab2wHQ4RTFVKI\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789chars after 72 are ignored\" },\n  { \"CC\", \"CCddR21tiMaqg\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\" },\n  { \"ab\", \"abdpmZGWTUFX2\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\" },\n  { \"CC\", \"CCddR21tiMaqg\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\"\"chars after 72 are ignored as usual\" },\n  { \"ab\", \"abdpmZGWTUFX2\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\"\"chars after 72 are ignored as usual\" },\n  { \"CC\", \"CC2RU2fzIuOsc\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has forgotten.\" },\n  { \"ab\", \"ab7TBnHv4ezs2\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has forgotten.\" },\n  { \"CC\", \"CC2RU2fzIuOsc\", \"THE YEAR\" },\n  { \"ab\", \"ab7TBnHv4ezs2\", \"THE YEAR\" },\n  { \"CC\", \"CC2RU2fzIuOsc\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and do\" },\n  { \"ab\", \"ab7TBnHv4ezs2\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and do\" },\n  { \"CC\", \"CC2RU2fzIuOsc\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has f\" },\n  { \"ab\", \"ab7TBnHv4ezs2\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has f\" },\n#endif // descrypt\n\n#if INCLUDE_gost_yescrypt && defined TEST_gost_yescrypt\n  { \"$gy$j75$.......\", \"$gy$j75$.......$C5BUyYB5xps0ocKn7vbPXrA/CKww4ZbrgU3O.X0kiy8\", \"\" },\n  { \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.$VIvMlb2yKp1wnlflMAxutM8UsAjZPD6dcXHT0nL2UP6\", \"\" },\n  { \"$gy$j85$.......\", \"$gy$j85$.......$qcWboYF3QMRz3e9REHJfozixjIKov0Uujf7BEu2ZZB2\", \"\" },\n  { \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.$FFwajX.u/AzLfnYpLYaQpve0Zo.MzWzKkpWKCXVVdqD\", \"\" },\n  { \"$gy$j75$.......\", \"$gy$j75$.......$yeq3RM1SBF/X5UXG3/rgW3ODUzAid4VZnK.beIBi7A.\", \" \" },\n  { \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.$.QwcVcz9TqZtbUo52mxANeDJikjVhGhB8N7BLbOlw55\", \" \" },\n  { \"$gy$j85$.......\", \"$gy$j85$.......$zA7FloUwnueYy7mv1wSgv0OyXjxaSIr/81pJeIyHwwB\", \" \" },\n  { \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.$ysztMflCfFAhIz1oAxej1tDh5gMgyuTV23gkN9sakx5\", \" \" },\n  { \"$gy$j75$.......\", \"$gy$j75$.......$eBagUD/6d5e0p3WmLp6DS1yMGjT9p55M7c1rJV6c2sA\", \"a\" },\n  { \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.$3cu6oF.5ffZtumWCBOTnzDnVwO9u1qooMY.tolVVmgA\", \"a\" },\n  { \"$gy$j85$.......\", \"$gy$j85$.......$I0imOradhMNccrx0ZHpL.f02V7CVnVBiLyznVnU4FkC\", \"a\" },\n  { \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.$Pd2n9sm904arKsigtl8Q8CBjxiQZ3rti7ZX4t2YUqj0\", \"a\" },\n  { \"$gy$j75$.......\", \"$gy$j75$.......$kUdcYFvlEPzM5g1WtlpGRTO0fPB34YAtUkimqcWTtr8\", \"ab\" },\n  { \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.$JQ3TPsm.eccu6pQfq83k6o65GqUAWRHze8fIJn5e/8D\", \"ab\" },\n  { \"$gy$j85$.......\", \"$gy$j85$.......$9pjahGx1oL9Llexl21cbbA.eXK4UK5GhSGkmD7iYs.5\", \"ab\" },\n  { \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.$quk01WQ1quH9iMg0O02lIlsQoRgr8F4VjLLr9RCDmV0\", \"ab\" },\n  { \"$gy$j75$.......\", \"$gy$j75$.......$XH2YP.u9tPw6ObDCXTRJiUfyrAEZ/TGIF0CjnxNW3h/\", \"abc\" },\n  { \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.$L2dOa9cEfoqtM0yxuEyxQCctdYVD6HCXsluuaIJe9I.\", \"abc\" },\n  { \"$gy$j85$.......\", \"$gy$j85$.......$08Hdk6V57cXirP/uFImn98HF2BF6KZWIbCvkJ2ID6JD\", \"abc\" },\n  { \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.$R2ki2bsp3XNbL0RT0AqWD0aJo73DkXO71UREZb34230\", \"abc\" },\n  { \"$gy$j75$.......\", \"$gy$j75$.......$2MgfEFMXQDMiVz5FoADXDmZqUGbHk1ZowcjDCELt0tA\", \"U*U\" },\n  { \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.$Udi6emcIyaqjsnk1MDoFsEZ/Osun/G3Vfl2xKSaS2K6\", \"U*U\" },\n  { \"$gy$j85$.......\", \"$gy$j85$.......$uTjh9GTeGAXGqwHhhHNIfd9mc2vOjSvznKbZX7W9fT3\", \"U*U\" },\n  { \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.$em7NI7dyD4fZ4wIBmq1RwxGxmD5vaCyQhFzptmDEBz2\", \"U*U\" },\n  { \"$gy$j75$.......\", \"$gy$j75$.......$3QfYsWjKOcG3/3050vUSWmi6sLvnJtplRcZFeDSDPb7\", \"U*U*\" },\n  { \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.$brR63dP6sW9ya2FqaQ.jvFeakx4BlaCdAprErx.KKQ.\", \"U*U*\" },\n  { \"$gy$j85$.......\", \"$gy$j85$.......$OKdBTBDU/4rwZiJYVv1tAgNVTKfLPIDr97OETLmx6J5\", \"U*U*\" },\n  { \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.$xFP56XMS7dykUI.gheamShTgw4bJGK6bq.DCKykyo/5\", \"U*U*\" },\n  { \"$gy$j75$.......\", \"$gy$j75$.......$LHGIR60LusLVPLX.vhk3wN6OUudxHoctGd1D6hskrN6\", \"U*U*U\" },\n  { \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.$m7k6NWNaAlb1ZsBNngUgx1UsGttDX4o8mug05LovYR3\", \"U*U*U\" },\n  { \"$gy$j85$.......\", \"$gy$j85$.......$YBvISwdayI/b5HtXucqXxtSQx52dNbfEI7Crhr0kLIA\", \"U*U*U\" },\n  { \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.$P6zvk9rHj2Eq89wO8aHChgTXBaRVO6w9.KwkF.BzYwA\", \"U*U*U\" },\n  { \"$gy$j75$.......\", \"$gy$j75$.......$rMrSARKvvE.gk9q3V/iRdZX09f72QHBCCepv3vTQmh/\", \".....\" },\n  { \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.$4KoiKqFKUMvS4oFe/m/Dfx/WmWYWtOrr9p5S.MaJoS7\", \".....\" },\n  { \"$gy$j85$.......\", \"$gy$j85$.......$uvwXuSvP/.vOGyoEtzfqhvymymRe9MwmBEtOpPFGto4\", \".....\" },\n  { \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.$A632z25kLhB.iNNJUMH/.CQnDeTquwmGbeH/7n/Bdp5\", \".....\" },\n  { \"$gy$j75$.......\", \"$gy$j75$.......$8XoI2beNyRr/sfdJ1zhybcWhRwhvAOdUcK6nqwz3O4.\", \"dragon\" },\n  { \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.$XOe1WAt0Aj.sOSXXrzCobxh1YgjFakCGQCmB58ZKKZ0\", \"dragon\" },\n  { \"$gy$j85$.......\", \"$gy$j85$.......$2s30RlZzHAZW24TFe7vsa3y3V5r1CHAJ5JXuRH00Pn.\", \"dragon\" },\n  { \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.$K55LpE8tg31P6HtlqlR2/Y46br8ohiayx0JynFtaqj0\", \"dragon\" },\n  { \"$gy$j75$.......\", \"$gy$j75$.......$xzXF8V3pf2mVgaf1V5Yv2xUGTR/KMen/.H9f53/aeI/\", \"dRaGoN\" },\n  { \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.$M9YlVcCkO2SG44MA5xV8gzg1Ol/7Mys.NuohwoeheV1\", \"dRaGoN\" },\n  { \"$gy$j85$.......\", \"$gy$j85$.......$he3zfQzy.bPSTMvacDBjB/kWN3Y5oCfoBihwunDjg68\", \"dRaGoN\" },\n  { \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.$c1Tz45C1GGffLEIPamOZir8pAjTVWLpJOT9anIwy77/\", \"dRaGoN\" },\n  { \"$gy$j75$.......\", \"$gy$j75$.......$tGaQcR3gIRQr6NSrtUZPr2IMkohE6YyyoPM6BnhQRx0\", \"DrAgOn\" },\n  { \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.$ozHV4YgroesMNBTOk.ZPU6ods.bFQ4uW9oLUgGq56h8\", \"DrAgOn\" },\n  { \"$gy$j85$.......\", \"$gy$j85$.......$wnvBVYulR5RsJiAk7u94EJ4Qs8yzNgwRa7XH3Nud5e0\", \"DrAgOn\" },\n  { \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.$leV3.HrxgZ7wetBccpcz80YvgIWtmNT5VEyojiqHtE0\", \"DrAgOn\" },\n  { \"$gy$j75$.......\", \"$gy$j75$.......$0typDNZ0Tl4sir49ZcOf5tJ64dCkh219z0vi54flZz7\", \"PAROLX\" },\n  { \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.$qbLj.WFRzkAqktxtpy/amhflmNPa9VdUM5H1t9BI9b.\", \"PAROLX\" },\n  { \"$gy$j85$.......\", \"$gy$j85$.......$ObQJq4c4/YQClBaerSPsLx5u335EI7vEeJZ0K14SjVC\", \"PAROLX\" },\n  { \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.$3.hde8WfQqYzojcjdpFETOPXxAE07jN.hVsPRxWyut4\", \"PAROLX\" },\n  { \"$gy$j75$.......\", \"$gy$j75$.......$Z7m1qzZ.4gYFqy2w7V0YOXpGvWz/DP.GBR/clR0lu73\", \"U*U***U\" },\n  { \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.$xD6mJI9Q5qbdOiKkwZzRIDrJQBEvFBkPPnEb5EHnHe9\", \"U*U***U\" },\n  { \"$gy$j85$.......\", \"$gy$j85$.......$IX4VJZLEzVM0F/0SH8zI0aaRPyNFElweojqY6R4RPb1\", \"U*U***U\" },\n  { \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.$DdWnAHyuhiNUzIAueU6jI6bhtCLuX2z3mHipJKvySiB\", \"U*U***U\" },\n  { \"$gy$j75$.......\", \"$gy$j75$.......$NIb62oBds0n69VNxMjzoK.galMyenjKndtiyH/.BzP5\", \"abcdefg\" },\n  { \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.$.w4ZMpkTRIsAFZmlGEkk1HefHWnRYNuqyhFXcmYpU52\", \"abcdefg\" },\n  { \"$gy$j85$.......\", \"$gy$j85$.......$3YMTvMot1FbF2gRdyYIY5lpHWs/BzkSQqD7F5M/nra0\", \"abcdefg\" },\n  { \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.$5gEbvJyVRTl.y/2aVNV2zik5VtCnJNGOuLAbFTPLbA7\", \"abcdefg\" },\n  { \"$gy$j75$.......\", \"$gy$j75$.......$wwJfCZTFWLC/oCJshdYocDGXBG4zayaAYYnaqQy6O.7\", \"01234567\" },\n  { \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.$ZvA.DWjyvxxKO8vCu2mReEYuDGliqf8f46VywSXzRf3\", \"01234567\" },\n  { \"$gy$j85$.......\", \"$gy$j85$.......$P1of6vxmZsJqlnqqOb08atMTqlqrLSptHza4TnyMRX0\", \"01234567\" },\n  { \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.$CH89kK75GOmpcSRCN8/HCP3F8i4jos.J67BJNtseZHA\", \"01234567\" },\n  { \"$gy$j75$.......\", \"$gy$j75$.......$06vSfetdFpfuSOmiC07VgJV94xwdZkdcvVV8tEQ.6g1\", \"726 even\" },\n  { \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.$BkDcHhA6h2ZloPYeaP./uui1YXvi/xypQO.Mx2jpTf6\", \"726 even\" },\n  { \"$gy$j85$.......\", \"$gy$j85$.......$vQ1rLRqFSd94X5BRRhHPHVvu8LhFCYoQ0F74w4.yvuA\", \"726 even\" },\n  { \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.$eXL6mCaYcnNKHkekCMRCPcSiLmj4yJJkL87x62iZB/9\", \"726 even\" },\n  { \"$gy$j75$.......\", \"$gy$j75$.......$XXVb6efUDkS.Z9AkBo02kEr8U5XAXcj6DsVx8KWS5K8\", \"zyxwvuts\" },\n  { \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.$4YAqk4DKKnD0xvNg3jLLzQek1heuzRAn.ct4CwhdRLA\", \"zyxwvuts\" },\n  { \"$gy$j85$.......\", \"$gy$j85$.......$YdfHuCTWY1T/a60Ve/WEa3CGsRbc.6SnawF7ddFMer3\", \"zyxwvuts\" },\n  { \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.$bf6J5naHOyk7RNXxL7N/d53YcGGv8euyu8dL7Z7buL5\", \"zyxwvuts\" },\n  { \"$gy$j75$.......\", \"$gy$j75$.......$OQFQ/WjDPoZ81BKrTamZwlQDEoO.amnpFg3fJJ66vx6\", \"ab1234567\" },\n  { \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.$2LVwnHAlnk4fyxfsHRaTx.uFScb5BlrWuEFTQn/DvV.\", \"ab1234567\" },\n  { \"$gy$j85$.......\", \"$gy$j85$.......$48HqJwaKvDoFRD1dBUUf.Ls.Y3rqrwBJy6k4wsvSG54\", \"ab1234567\" },\n  { \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.$2mBdv7fxREQyxtrShAfz9lr8PAjF2b0ZOGDFKHAPGf1\", \"ab1234567\" },\n  { \"$gy$j75$.......\", \"$gy$j75$.......$g8CXwJ7ccaismgA/kkjYgWGrPbO1nxtpX8EbTzQUFT.\", \"alexander\" },\n  { \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.$QxdV3fcqrHnos0CMmNMP.tyYb2ym1136Ibxsds5k3q.\", \"alexander\" },\n  { \"$gy$j85$.......\", \"$gy$j85$.......$b6iSEiGkicetIL15EL/cmTS3YFbA7/rnELd0uW2qYJ0\", \"alexander\" },\n  { \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.$K6T2.SfueblQe.s3sG0uik0YSH81rNbDgje8he4s51.\", \"alexander\" },\n  { \"$gy$j75$.......\", \"$gy$j75$.......$N6CYdTSgCVSvLqvOOq1Vg0uJoowU8W6ATTXP.iItrO7\", \"beautiful\" },\n  { \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.$iVOsFYn8Bcu7lUqPok3tEq.atcrgiaHnOCMeCrKOjr4\", \"beautiful\" },\n  { \"$gy$j85$.......\", \"$gy$j85$.......$3o21UocX4SPe/qemqQmKoTQajYsYjkFDZfZL05CKBY5\", \"beautiful\" },\n  { \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.$3oFJdLH87C35yZ1Y6YCAfH8f54C9Cm2DYAYU6iO2yUA\", \"beautiful\" },\n  { \"$gy$j75$.......\", \"$gy$j75$.......$4UujoVqzB4.rvnN7chI181vcUniG/GOvpEhdTt5J3sD\", \"challenge\" },\n  { \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.$7vL9STzD6ZvXhmF.pZydUmXO9grVxFuOuxyIGD6rRY9\", \"challenge\" },\n  { \"$gy$j85$.......\", \"$gy$j85$.......$JsRFw3psyoXImWkqQXVc44PJY6YD8R7uGV1gbaL7DsC\", \"challenge\" },\n  { \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.$bqITrpEX/oZ1G3QA15ktUBnniVxXJwZ0Zuil3cvDn4C\", \"challenge\" },\n  { \"$gy$j75$.......\", \"$gy$j75$.......$gqXFpMq0Qhp0rWCNWVPrZJYMa85l82bMzp3N55n4Yr.\", \"chocolate\" },\n  { \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.$hi1uMs3/xdQS8qwF5JiJgdPafv4JAXUoM92TtOORl4C\", \"chocolate\" },\n  { \"$gy$j85$.......\", \"$gy$j85$.......$KzUbYZDqN1JQJ7G/070VuNuYccLO0BkcSqau9fwfCF3\", \"chocolate\" },\n  { \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.$B9vmGzz8W.vVN9dMXFVAMqf9DSQBMzBJgK3WRE7JzuD\", \"chocolate\" },\n  { \"$gy$j75$.......\", \"$gy$j75$.......$dmnPVTcjsZZezusL7QvgK6rUqOmnzjFjA.rrB6b4e4D\", \"cr1234567\" },\n  { \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.$gfUq0qddSXU6K/lTWFiU1lYcmtASl6xaqdnFgSKDAD9\", \"cr1234567\" },\n  { \"$gy$j85$.......\", \"$gy$j85$.......$ixpGY0InKowR/zRYQ9ykuvrkF9Z30CwmBgfUzEesyeD\", \"cr1234567\" },\n  { \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.$mFBR79lasS9a3Y.gN/7dI9ngh0FyauzHMYMIGcYdi52\", \"cr1234567\" },\n  { \"$gy$j75$.......\", \"$gy$j75$.......$5qI1fZqyGXBa2dSRoD4Uq61LEP.s2hLvoPxe6EShDa4\", \"katherine\" },\n  { \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.$y5YZ1dqH.1qu1T0hJ6YU2/vhwd3dBF/JvLYTjT7ICX1\", \"katherine\" },\n  { \"$gy$j85$.......\", \"$gy$j85$.......$u9OaUx.QOvLYZzsp.e8trGLXXOhyXoO4yl/xItsj721\", \"katherine\" },\n  { \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.$K0K7U/Np0gSRNQwTz5F/Uc4urv8vuDXMsVq5g3kAHk5\", \"katherine\" },\n  { \"$gy$j75$.......\", \"$gy$j75$.......$3kw0SFwYnDDWkg/WsJ.WoTL5/g.FrVM3QXHBYIutk62\", \"stephanie\" },\n  { \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.$653GHm8T/yXCpk/LDiBLziwqiOjcZAq95GT6e.hnKS1\", \"stephanie\" },\n  { \"$gy$j85$.......\", \"$gy$j85$.......$HvaCRW6RfUteFIm8G0AEGQWm5xL6fAezCKqxYtOptW2\", \"stephanie\" },\n  { \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.$C82thHwg1tSsWBnZLrYUCIojZqbJz2RU.szOVIqY1x0\", \"stephanie\" },\n  { \"$gy$j75$.......\", \"$gy$j75$.......$u.9wgpq83ZxZ9nFSi14FQ65nmsnpo/02B.mX.WhhYGA\", \"sunflower\" },\n  { \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.$Ur/0zo5dUh8Bikmly78XKD.9AEXg90AuTl9ra4Xj7v0\", \"sunflower\" },\n  { \"$gy$j85$.......\", \"$gy$j85$.......$bowtl//9DSMrMcPRyDdMZgeqzLlmz05kmD8ttz5jwTB\", \"sunflower\" },\n  { \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.$4LDovQsfXcYZTmpDpYWbBm7ZexgjzuoZGuOb75CpZM8\", \"sunflower\" },\n  { \"$gy$j75$.......\", \"$gy$j75$.......$4ZnU5zBelTRfHVwNT07ZXt0iVGUbnH37xAdOdVcxTaC\", \"basketball\" },\n  { \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.$KZdGrPlBtS60pgtbfXO.2YrqaMBg/wYHCDVBixZKbO4\", \"basketball\" },\n  { \"$gy$j85$.......\", \"$gy$j85$.......$.zn0bVJlFbbs8YysQvbHqBAfw2qBYQe/5gavPdhizn0\", \"basketball\" },\n  { \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.$2.I0pjFsW1HdmvEFCanlZsjl8Decyg8e7z0/x3hfCR.\", \"basketball\" },\n  { \"$gy$j75$.......\", \"$gy$j75$.......$mWaDA.EsFP1mOaI3Ox0pUcw4WJDsUeIJ7EXeMfbUe33\", \"porsche911\" },\n  { \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.$agPYxvyJWCwDABuKjRgXVNVGS8qicZhMVXgj0FQ.YI2\", \"porsche911\" },\n  { \"$gy$j85$.......\", \"$gy$j85$.......$IYHAe5xXEPHyK649n/AK4qRFTRvK0gCqSX4u9fe5bRC\", \"porsche911\" },\n  { \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.$U9sDkkCymgehl8bsioKK2DMsMP3qqP5pkfN/0XFXpX7\", \"porsche911\" },\n  { \"$gy$j75$.......\", \"$gy$j75$.......$6rTjWFwZbW/AzSIO.aj9USmksMg0VBp6A4yA8g8bNB7\", \"|_337T`/p3\" },\n  { \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.$5W9zz6kiyR6T/gTkGoivl0s9tXwZPw5Do.yaB9Orc3.\", \"|_337T`/p3\" },\n  { \"$gy$j85$.......\", \"$gy$j85$.......$EC5f1LnUSsxNHPD2JMU9dgp737uPibMGipWAYFbiot9\", \"|_337T`/p3\" },\n  { \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.$K696ZFX0TEjHwQ614URRGSrJeAtjrcdqBsX.oy4cx7.\", \"|_337T`/p3\" },\n  { \"$gy$j75$.......\", \"$gy$j75$.......$j8ynU.zvWVOLpb.ykIfQelXu4yxPXgfqw9tE2f5TIt/\", \"thunderbird\" },\n  { \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.$D/kl.1T/t6zJNUh4YQ4Stcz.E6WMZ5uvPYT2kB.aU1D\", \"thunderbird\" },\n  { \"$gy$j85$.......\", \"$gy$j85$.......$EXnrx3JDG/4scOqquFvMDGM0KsT6Ww/iCKHkGkttUu2\", \"thunderbird\" },\n  { \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.$b0V92DSxJ/u6FlAP40ibumgwY7KC2iuy1G7neEBU64D\", \"thunderbird\" },\n  { \"$gy$j75$.......\", \"$gy$j75$.......$mH8A6PYt/6.FlDeVfUtD7mfEVypDgbSX0MagtEntiM4\", \"Hello world!\" },\n  { \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.$5jeCDa.gqje1rkEFrCfYWc0atZtZSqocZrak0uAbf18\", \"Hello world!\" },\n  { \"$gy$j85$.......\", \"$gy$j85$.......$jKTcdxu6KdPXn7EN29ir..reDQZd2Ccwh0ctH4rEuM6\", \"Hello world!\" },\n  { \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.$rj762cpiSuHNd/UqxuVxRWksdhO6eDHPHsZ9MQMpDs0\", \"Hello world!\" },\n  { \"$gy$j75$.......\", \"$gy$j75$.......$Dn3Q5nslkbrxxA3exxYXpQa8Ael1AAjHk1iU49c17ZB\", \"pleaseletmein\" },\n  { \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.$DFeQcmRiMM1ZhJ7ucqwvYLMj56sGp/durhpnAg/nVu2\", \"pleaseletmein\" },\n  { \"$gy$j85$.......\", \"$gy$j85$.......$QqxlcA6VGIIUhWWTSyzO6JxNvoynDwF1io3UcAMSht9\", \"pleaseletmein\" },\n  { \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.$TGpKr9kK6ZX.IP1x7Qp2BvzwMd2BSZFSEDRhzvlGIM2\", \"pleaseletmein\" },\n  { \"$gy$j75$.......\", \"$gy$j75$.......$kYaFes6Xv3gRerkLP7/4t6bzzTcAjRuXC934u6PMPM3\", \"a short string\" },\n  { \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.$MzPUiCu8m/E6Aam7FrciVxf.dI7BDS7icU4wvqIKA29\", \"a short string\" },\n  { \"$gy$j85$.......\", \"$gy$j85$.......$uSSR1JanLC6D1yrW77VHka/i8svrbQe2.LiNvxv73V8\", \"a short string\" },\n  { \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.$Z.t5jfwcysgS0oZ2tYmqCqgeRN49L3lsJG78msREd01\", \"a short string\" },\n  { \"$gy$j75$.......\", \"$gy$j75$.......$qfQyyxorg82JbbD1/LNpHD58xb8kFDMY.BpHDc4gt31\", \"zxyDPWgydbQjgq\" },\n  { \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.$JrbShULG16wdFk6J5G6gFbvjPb.XP6omfpMAPs4dTM3\", \"zxyDPWgydbQjgq\" },\n  { \"$gy$j85$.......\", \"$gy$j85$.......$7cES0jpMWrnpVsAZQ08A3oQPA2MLOOiD3dK40jcYZu5\", \"zxyDPWgydbQjgq\" },\n  { \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.$0k7LcQHZ8wtfPkUCg5VXIWrnSDgd4Z1/avPWG8nSi78\", \"zxyDPWgydbQjgq\" },\n  { \"$gy$j75$.......\", \"$gy$j75$.......$S0mtjhQH6Zgw9KtytdoBvanCgtWz8Knm5pb.0128yTD\", \"photojournalism\" },\n  { \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.$vlGaccF4.4ZtJKbe9hZgg0a/vaGTrLHCvjWgJzBY.I.\", \"photojournalism\" },\n  { \"$gy$j85$.......\", \"$gy$j85$.......$4u2/yTgI3Xl1KbzDo/uviSCesJQp84q2h0uHvA5bEnD\", \"photojournalism\" },\n  { \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.$1NCXLRHuEM5RKqjn1rgYVLss90eS57dCasXTAeHh0G0\", \"photojournalism\" },\n  { \"$gy$j75$.......\", \"$gy$j75$.......$0H.VHy1ylVgctz71jhBZgIkkVcPlDw5rOWBzUL.2ux4\", \"ecclesiastically\" },\n  { \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.$9eVWNVlLb.4dh66gdeg7irHelezkfqbBVFJYgvz2vF9\", \"ecclesiastically\" },\n  { \"$gy$j85$.......\", \"$gy$j85$.......$ASJ.a8iPBu2p4OogAuMl/QV1xc275yLDGypbEMpVsH2\", \"ecclesiastically\" },\n  { \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.$Gj5SKco/.BeMECwg/Jt/ArmoUMfd.hlg7Q.joDcMv67\", \"ecclesiastically\" },\n  { \"$gy$j75$.......\", \"$gy$j75$.......$kwIx9VaMEDQFOHrAuMVcUtQao4Ojp3LCAUlBo4wCBfA\", \"congregationalism\" },\n  { \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.$5RvJB3/RuAKu4ygA3nBauWw34iJ3XOvn/ZtVFYgfVD0\", \"congregationalism\" },\n  { \"$gy$j85$.......\", \"$gy$j85$.......$1ySdm2sWMi3bnDtfn5B5MuqyBmJJ8KdMr3.mtfqR1l.\", \"congregationalism\" },\n  { \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.$TLTx0csFWbQjjPV5aQjNf9aXof0d0GwoK8X23JRroD3\", \"congregationalism\" },\n  { \"$gy$j75$.......\", \"$gy$j75$.......$RK5fpDKQSf0Xx9l2WQJUGRY1lfItsvOTSvyzzVWX4q3\", \"dihydrosphingosine\" },\n  { \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.$G/HOt48aRXCO24Ck37vADmQ7xWVcCWdyzQvdVbyOQ65\", \"dihydrosphingosine\" },\n  { \"$gy$j85$.......\", \"$gy$j85$.......$38l9FOgLKQnNhN1HXmAyUzym2uytsTmqsO3WR44q6d1\", \"dihydrosphingosine\" },\n  { \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.$/BaWf9Rb1L/2OmHor0UsEtaPX6ZVKdIsE.D5QzNwEsC\", \"dihydrosphingosine\" },\n  { \"$gy$j75$.......\", \"$gy$j75$.......$t6XNiMKBS/Mi8ZiT4lL21cIOthgJaz6z1sbj5WmqSnC\", \"semianthropological\" },\n  { \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.$T1x61ml9QS8YYRsVFWtmJjM9W27DjBEfQK52coo6wx7\", \"semianthropological\" },\n  { \"$gy$j85$.......\", \"$gy$j85$.......$pqa/u8x6KKA1.YsLW4AsKOoVS69S9g1tJkbEXmE/GD0\", \"semianthropological\" },\n  { \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.$fSKKp8h2F3Ojypt90/DpEE3JvGdWa/YvjBZ4j58gUW2\", \"semianthropological\" },\n  { \"$gy$j75$.......\", \"$gy$j75$.......$ifIN//mcLmGvaW2A376.ud8qOTj54ipuLcif3K8bDC2\", \"palaeogeographically\" },\n  { \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.$xJf5Q.Eb7DsEMhKjLReHnk9d1yat1YFD9RGXT5cWTi6\", \"palaeogeographically\" },\n  { \"$gy$j85$.......\", \"$gy$j85$.......$tb7hNOWIT0P5h/jqjSoi7WXAfRLgETj8Bkq7.MxGam.\", \"palaeogeographically\" },\n  { \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.$mpXv0XWYUjD8Xc24ELz0YXQotWsiovRlZHXd10Kkk64\", \"palaeogeographically\" },\n  { \"$gy$j75$.......\", \"$gy$j75$.......$ZL1kbSRJ5gLlLJmZ5IyxmH04DsiuMkyRiv6FwWMf3tD\", \"electromyographically\" },\n  { \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.$wJkWx5ncSA2VxgqjqXE2pKDs4l6/X63iORWcK9U8rL4\", \"electromyographically\" },\n  { \"$gy$j85$.......\", \"$gy$j85$.......$58lpf1g0nvLJvZnSDBfsQTuCMLNCMTMBtoje3/XsiGD\", \"electromyographically\" },\n  { \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.$1bSWHPkMcULM4QbUlFbDU1N9.z4PSqDEW8C.p8d2Gz0\", \"electromyographically\" },\n  { \"$gy$j75$.......\", \"$gy$j75$.......$5eVq5ZSWFrO6JYCbPEIKJ6vB27nvNM48dlvvjp1IsBB\", \"noninterchangeableness\" },\n  { \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.$7wDG3ept6jRsTymR1AVZ.ozZBazh8w1HzhYZsMvPPH3\", \"noninterchangeableness\" },\n  { \"$gy$j85$.......\", \"$gy$j85$.......$.toEFxnTRi1pQepaOLJLNJ.B7lpnwTZDyo7T4IdSer9\", \"noninterchangeableness\" },\n  { \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.$Ij4GVB1F8oTt0KlkUvZmRXMeHmD84BZRqNRR/YWwYeA\", \"noninterchangeableness\" },\n  { \"$gy$j75$.......\", \"$gy$j75$.......$gMYvyzZ.Gvc39g9eFXcoJd3G9Co1Kw.LltZPGU5jmR4\", \"abcdefghijklmnopqrstuvwxyz\" },\n  { \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.$6sGuvOiKa4x1EAiPcvOuqA9yJaHUSR3ecdJw34xZsj0\", \"abcdefghijklmnopqrstuvwxyz\" },\n  { \"$gy$j85$.......\", \"$gy$j85$.......$x5vfHstS4Jivur9YYXL0qT6HlqGEhyqnICAyq.ArKTD\", \"abcdefghijklmnopqrstuvwxyz\" },\n  { \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.$A2ULAPT3sNLkLGe3pi/6xuCQBFrTOsadL74HMctdoOC\", \"abcdefghijklmnopqrstuvwxyz\" },\n  { \"$gy$j75$.......\", \"$gy$j75$.......$u/qpH4hndENeGzp.aqWHyxmorU50/FAiGA5609TE9v0\", \"electroencephalographically\" },\n  { \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.$3ZUaPzdOdgEV62tb37hvCMIBvsDsEg1U/nc.PnA4uPC\", \"electroencephalographically\" },\n  { \"$gy$j85$.......\", \"$gy$j85$.......$w5QrgWSribxVno.06Ht0OeJ3Pf5KIkfIpG6YvRiI0C4\", \"electroencephalographically\" },\n  { \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.$H8rMtycWCkGldExWhv6Wl1xwwdLL41GpR21qS4yruv.\", \"electroencephalographically\" },\n  { \"$gy$j75$.......\", \"$gy$j75$.......$nNh4plGlwarUxm2WK6OmFgsI3rHlSzBC8Y1jBJ7NYi9\", \"antidisestablishmentarianism\" },\n  { \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.$6E0e1F4MH9YpvE0yVZPHCqNzJUAdFSz5T9Sw/bRZ9ZD\", \"antidisestablishmentarianism\" },\n  { \"$gy$j85$.......\", \"$gy$j85$.......$zJaa20rPNkk7be.9QlSDHgx2imp3uweGiaNe8l/BDy0\", \"antidisestablishmentarianism\" },\n  { \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.$NbJyuhgbNAT3fsObqL.d2QukuKtyeAhZs0lvYp/phVD\", \"antidisestablishmentarianism\" },\n  { \"$gy$j75$.......\", \"$gy$j75$.......$d4uRpI0Hu163.UYCarR..5Dl2FPZB8TF6Bsfd88PhmB\", \"cyclotrimethylenetrinitramine\" },\n  { \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.$cHniVRkWa.v2T7UC8PzpiO0/JiU1HAPgLG5Qai616U3\", \"cyclotrimethylenetrinitramine\" },\n  { \"$gy$j85$.......\", \"$gy$j85$.......$fMnj9ncwhSSeQyPfw2EBTHffsb38g5Ynfi590CODe8C\", \"cyclotrimethylenetrinitramine\" },\n  { \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.$6dpFLbr8kFY0jWWPTfUPqa2qeVUeDqDt.mcbGjzVeH4\", \"cyclotrimethylenetrinitramine\" },\n  { \"$gy$j75$.......\", \"$gy$j75$.......$ssSXu/TjP2nYRAm8MA994K7/oEqbrAMXTl6J6zyvHcA\", \"dichlorodiphenyltrichloroethane\" },\n  { \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.$rSUrvUtOFl8cHFyKZgxzg.uqoFkK6ASdzGKEhT7PmI4\", \"dichlorodiphenyltrichloroethane\" },\n  { \"$gy$j85$.......\", \"$gy$j85$.......$w87ij/NI4trU0mQrMYztx7GgT.o0Vn3/WIoJvO75Kt/\", \"dichlorodiphenyltrichloroethane\" },\n  { \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.$9Sz/V/2Mkz1dJA54sV1GsyiYiD1cHSV5cM0Gjvtp6C8\", \"dichlorodiphenyltrichloroethane\" },\n  { \"$gy$j75$.......\", \"$gy$j75$.......$hVw/wMPY9n9WTSIFq8EBRj1K3Xqn2A3VY371LhJQcoC\", \"multiple words seperated by spaces\" },\n  { \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.$skUlgwOh3JoXydPND.75rARvcp.Zo.f1HzvIBu4TYpA\", \"multiple words seperated by spaces\" },\n  { \"$gy$j85$.......\", \"$gy$j85$.......$2rmC6QOfkGRHgdQK0uNFHANRaqs3bmyGqfbkBoUUWLB\", \"multiple words seperated by spaces\" },\n  { \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.$HMf.OMxaGaQdclIBWm5IPDnTCnPdJoaM7ZxJSmVGkO4\", \"multiple words seperated by spaces\" },\n  { \"$gy$j75$.......\", \"$gy$j75$.......$zpFF2aDakeRnRbR6h8.vIhF3yixzs05ehqEYNSmk5l.\", \"supercalifragilisticexpialidocious\" },\n  { \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.$5KTrFndb.PN/kJSoRnHk6C42OZ2jr8xQ4bZc8psO8p1\", \"supercalifragilisticexpialidocious\" },\n  { \"$gy$j85$.......\", \"$gy$j85$.......$0FudcGnwMUXxgo6FhxYmJGbeP8SnOonK5A8hfxhMxM7\", \"supercalifragilisticexpialidocious\" },\n  { \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.$MeT7lb9jGGIrWFffwbs7mK8TVgJlvDVaH5rK.ihnsA3\", \"supercalifragilisticexpialidocious\" },\n  { \"$gy$j75$.......\", \"$gy$j75$.......$gqopDIPx5bn5AlnM0FhKfPLLIXKJ9NMo6r/PpvptoE4\", \"we have a short salt string but not a short password\" },\n  { \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.$KyCr56Xpf.eE8S7s/QtL9szvDm6/EaxBIkiFposJtP/\", \"we have a short salt string but not a short password\" },\n  { \"$gy$j85$.......\", \"$gy$j85$.......$AdQm5p1BACTl.f/dprWskLZjXpmCaVZ9wW5P.oTFZDA\", \"we have a short salt string but not a short password\" },\n  { \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.$PbB.vSkaao43xr2t/hDEKyBo9wjTWjnE.k/r6Duomm8\", \"we have a short salt string but not a short password\" },\n  { \"$gy$j75$.......\", \"$gy$j75$.......$3mvlCdQV8od7T53oA9ZukYRE6k7zjswxVr1nt4jejJ6\", \"multiple word$ $eperated by $pace$ and $pecial character$\" },\n  { \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.$1ZIpeYyPm/pUOoKbVj3DTAjZbQsDvMBkTFtl22RaXl3\", \"multiple word$ $eperated by $pace$ and $pecial character$\" },\n  { \"$gy$j85$.......\", \"$gy$j85$.......$el/h941NrwLzT6Tq9XrDYdZqetNZGISZ5emb9UiPHwB\", \"multiple word$ $eperated by $pace$ and $pecial character$\" },\n  { \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.$TmLxSUBkwVMqip3IszVmYMdIICqFDvJszXxLD0VGKl4\", \"multiple word$ $eperated by $pace$ and $pecial character$\" },\n  { \"$gy$j75$.......\", \"$gy$j75$.......$75IHAeKATZ8/PeFavlLjtPzXmWH.lAOD86m7poUAZP3\", \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\" },\n  { \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.$XxMxCBAzhFj.RD1py6NWOz7FxAlnzAiP/XKdl08e8k9\", \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\" },\n  { \"$gy$j85$.......\", \"$gy$j85$.......$mEU6IUsg.cU3p0IUPBxiOMPbKRfTfT4goGxbisJMtR3\", \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\" },\n  { \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.$M4ZJEU2S/uskYewVkAuGY5nxd/UmNQlma981EdcI79B\", \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\" },\n  { \"$gy$j75$.......\", \"$gy$j75$.......$7ligFf6OMmQhSniQDP6pGcLfrEtN2nGzzn4ByhXTIRD\", \"12345678901234567890123456789012345678901234567890123456789012345678901234567890\" },\n  { \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.$miDODWYQmRSVbU36.BJ5KmgClbOM4V6iW1aExHs8m36\", \"12345678901234567890123456789012345678901234567890123456789012345678901234567890\" },\n  { \"$gy$j85$.......\", \"$gy$j85$.......$LgT6EalaUYSJOHg3UXNp/rahh9STcnxYONPPiY2XNg4\", \"12345678901234567890123456789012345678901234567890123456789012345678901234567890\" },\n  { \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.$SROlP.aT6WPBs0L3fzc0bYg5qzCpNU2EDO6OZatRHc.\", \"12345678901234567890123456789012345678901234567890123456789012345678901234567890\" },\n  { \"$gy$j75$.......\", \"$gy$j75$.......$RbowMpRY7rpZum7k7cswdTS1jXRRVPAUp9Fy3ueBlk2\", \"a very much longer text to encrypt.  This one even stretches over morethan one line.\" },\n  { \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.$adi0bxhoImhH6g.xbP63bFbMWl48JfsLowMhusVO5u3\", \"a very much longer text to encrypt.  This one even stretches over morethan one line.\" },\n  { \"$gy$j85$.......\", \"$gy$j85$.......$TpQvC5YE/oN6s2C42aHRUzp.5I5qAVg4xKzfLl9tkJ4\", \"a very much longer text to encrypt.  This one even stretches over morethan one line.\" },\n  { \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.$g2TF4SWLsQtonL4ZxZdi5XK971M35IsZWJj3pjTxYgA\", \"a very much longer text to encrypt.  This one even stretches over morethan one line.\" },\n  { \"$gy$j75$.......\", \"$gy$j75$.......$7RnHl5dZGakq9KHbs.U62FogKMo9n4ix8zboFw4DN37\", \"\\xd0\\xc1\\xd2\\xcf\\xcc\\xd8\" },\n  { \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.$nl.ehg3WTLQUbhBImTlQEB8iyHH7RKPoqRGgHzP3.e2\", \"\\xd0\\xc1\\xd2\\xcf\\xcc\\xd8\" },\n  { \"$gy$j85$.......\", \"$gy$j85$.......$dQRV5w0yfwJjwvfOy/7dSe41758u9Uu2wR3qA2iAEI2\", \"\\xd0\\xc1\\xd2\\xcf\\xcc\\xd8\" },\n  { \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.$orMYLYeekI3egQDDXqMvAgUP94OSVTm/87SFTv5ZxC.\", \"\\xd0\\xc1\\xd2\\xcf\\xcc\\xd8\" },\n  { \"$gy$j75$.......\", \"$gy$j75$.......$.LISmKHe7RY7UW20ETp6m.r1ghqNBkyCj3K6iV0nEjB\", \"\\xd5\\xaa\\xd5\\xaa\\xaa\\xaa\\xd5\\xaa\" },\n  { \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.$T8vVQ.yid7eAAdk9.IJS8rjK2YIaIDbgLfaPAw7YrY3\", \"\\xd5\\xaa\\xd5\\xaa\\xaa\\xaa\\xd5\\xaa\" },\n  { \"$gy$j85$.......\", \"$gy$j85$.......$X4w.z05IyNKvY3Mn3hhYGnDlK0U2Hx2Zo8J2UsHRcs2\", \"\\xd5\\xaa\\xd5\\xaa\\xaa\\xaa\\xd5\\xaa\" },\n  { \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.$IGBjII4Cw4u3o5YHtfdpchtSRzlrQAQnITDl9S0GlU1\", \"\\xd5\\xaa\\xd5\\xaa\\xaa\\xaa\\xd5\\xaa\" },\n  { \"$gy$j75$.......\", \"$gy$j75$.......$5pBGmi.PGaf1cBy117ChvVOlKzNEyMyb3SxHO2FOIJ4\", \"\\xe1\\xec\\xe5\\xf8\\xe1\\xee\\xe4\\xe5\\xf2\" },\n  { \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.$kdNTW/TU.dXgihSRqfJZLNRlC0y86Z1UQlrSt3AZop3\", \"\\xe1\\xec\\xe5\\xf8\\xe1\\xee\\xe4\\xe5\\xf2\" },\n  { \"$gy$j85$.......\", \"$gy$j85$.......$xWDwDM5OHKi/N3woTo9teU.DyTmELEhSnCUOi2oxu5D\", \"\\xe1\\xec\\xe5\\xf8\\xe1\\xee\\xe4\\xe5\\xf2\" },\n  { \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.$o3S5eT9cwQ6tIFgd5nW66Hn1CeNrubVpg3IvamdqD75\", \"\\xe1\\xec\\xe5\\xf8\\xe1\\xee\\xe4\\xe5\\xf2\" },\n  { \"$gy$j75$.......\", \"$gy$j75$.......$bN38lnE7dvEdYR.70uN4CmmhKOyHayolDz7xwW4asA6\", \"\\xf3\\xf4\\xe5\\xf0\\xe8\\xe1\\xee\\xe9\\xe5\" },\n  { \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.$hLaqCM19hL2DNv7iLjdCMhVAL5NrbubEdSOZr5g4On5\", \"\\xf3\\xf4\\xe5\\xf0\\xe8\\xe1\\xee\\xe9\\xe5\" },\n  { \"$gy$j85$.......\", \"$gy$j85$.......$xTdKkwwTL9eDaqQOGTlw1Z96i/oBvyk3WuwNsjtQPhA\", \"\\xf3\\xf4\\xe5\\xf0\\xe8\\xe1\\xee\\xe9\\xe5\" },\n  { \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.$f0uMn5svuaQvqtaHm1M/CE0chsEFQ1LtDAOwdtmyPP.\", \"\\xf3\\xf4\\xe5\\xf0\\xe8\\xe1\\xee\\xe9\\xe5\" },\n  { \"$gy$j75$.......\", \"$gy$j75$.......$DzdK5SbueEJbTCRV2l8B0iOB3zq1xtBpM9F9dd2e4k7\", \"\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\" },\n  { \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.$Hww9O32Kz93oERgd6DfB5/a9ECRbmOsAznSgaQ61Za1\", \"\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\" },\n  { \"$gy$j85$.......\", \"$gy$j85$.......$a.tj/sPg9XuNnPQyvuRGYsm8iGtt2QMzyB8u3fqC2eD\", \"\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\" },\n  { \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.$/BNXO4SmhW8SEu8NKipNK2FTvCt6UTJsqtXkHgwzbc4\", \"\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\" },\n  { \"$gy$j75$.......\", \"$gy$j75$.......$alBloYJOS1Tj4VZ477hLFJHU9X/x4NEAxEtypHlFeN8\", \"\\xc3\\xa9tude\" },\n  { \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.$izHHCLwbvDPcdrnjubnRBORxtqGAVVxwRPiBMBLtcLA\", \"\\xc3\\xa9tude\" },\n  { \"$gy$j85$.......\", \"$gy$j85$.......$MT2NorwMFy5Pp07yrTIvhpPsCh0V1Pupz0XITobLI77\", \"\\xc3\\xa9tude\" },\n  { \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.$YwjvamIoYSlYvsJN8v.wMLoOjejaRufZ9e5Y13/WhW2\", \"\\xc3\\xa9tude\" },\n  { \"$gy$j75$.......\", \"$gy$j75$.......$ZxaD5Fa7z/r3ERNQ7hn5iJmIu2IF9jmWuRm5VNxZ9T5\", \"C)tude\" },\n  { \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.$a88GVPT32c8pSEJSokpZXVI.Vd1bXFJJ5pHx6zNYQbD\", \"C)tude\" },\n  { \"$gy$j85$.......\", \"$gy$j85$.......$cLPn255iyF9vuFL3K7a5PuRDm6mVAHA2XwBQkrv8a2A\", \"C)tude\" },\n  { \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.$Cp237pZ5lpRH.MGtGDmnAEvfBlSpaRv8McurDTnIJC6\", \"C)tude\" },\n  { \"$gy$j75$.......\", \"$gy$j75$.......$G6iciVL5YBxKN8MAS32upd/c7i2r6kwZy1D1wlZgJA4\", \"Chl\\xc3\\xb6\"\"e\" },\n  { \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.$LTAnw6k0iRD.jv.uLl0Ora/tL7/C3LN7qxTanm6PFU8\", \"Chl\\xc3\\xb6\"\"e\" },\n  { \"$gy$j85$.......\", \"$gy$j85$.......$WSMrFLWCtFFZs6dF9URCAMJ5kUkff2t/TgqItJ0d/QD\", \"Chl\\xc3\\xb6\"\"e\" },\n  { \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.$RR0ZfbSM5GnO8ZnqSQ2Ozmk2x/tmPGjNkMu7/oxDuG4\", \"Chl\\xc3\\xb6\"\"e\" },\n  { \"$gy$j75$.......\", \"$gy$j75$.......$VAqr/mXtW86YYxtLkkpIdurozPqnRho/I/MxZY6IiU4\", \"ChlC6e\" },\n  { \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.$UoCxceq28qTU2A5oi6zxfV3l0hmf6t2ge7CUKPQ5zz2\", \"ChlC6e\" },\n  { \"$gy$j85$.......\", \"$gy$j85$.......$vzQS4YmKY9zistx01qhIUtt0WHCL/vmpRvjWqIjOkWD\", \"ChlC6e\" },\n  { \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.$LwYtOumNHoM2CLa90kozMqULC97OIud7H4GvhLTJIk9\", \"ChlC6e\" },\n  { \"$gy$j75$.......\", \"$gy$j75$.......$wgWA9l8Ne3kojZdkpCt4OAuakdCW8ZmRYMTWP9kforA\", \"\\xc3\\x85ngstr\\xc3\\xb6m\" },\n  { \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.$NI8ZYYsg6q3hAus6c1eEoKYUpaUdRZWm/VA7MBo91yD\", \"\\xc3\\x85ngstr\\xc3\\xb6m\" },\n  { \"$gy$j85$.......\", \"$gy$j85$.......$znZNaByPGnHki8EVEE3Ad3b4QDgu9M/jBPMe41GrUU4\", \"\\xc3\\x85ngstr\\xc3\\xb6m\" },\n  { \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.$/w8tExwgISevWouw9aAXH27g3VDeQ64GEs8fNHTI.t8\", \"\\xc3\\x85ngstr\\xc3\\xb6m\" },\n  { \"$gy$j75$.......\", \"$gy$j75$.......$Lt3k8Rr6WK/lFcBKAve.XzTDQJDRgud2Pqug0t9o/n1\", \"C\\x05ngstrC6m\" },\n  { \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.$HsoWU9DuyuAKbBD6MDryaGpa8DHmbnTaPoGLBUjVW2.\", \"C\\x05ngstrC6m\" },\n  { \"$gy$j85$.......\", \"$gy$j85$.......$5YqFIYGv0kUVeA6Qybj1gtSt7R8b2X89sf2Jkz5gFy4\", \"C\\x05ngstrC6m\" },\n  { \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.$JWNl/sAyYUX4KJY//J9Bhz3gsnj.AiQmSGrHWgxcjc1\", \"C\\x05ngstrC6m\" },\n  { \"$gy$j75$.......\", \"$gy$j75$.......$JI3XmF.GJLU2ehT7MWJOXSXZXfS3qyuD5dNwM.UyncC\", \"C\\x05ngstrCU*U***U*\" },\n  { \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.$PN.APUSSEkkGmn.wqEhL91YdgcUPUxQtY.ObziHvs8/\", \"C\\x05ngstrCU*U***U*\" },\n  { \"$gy$j85$.......\", \"$gy$j85$.......$gb4f1IcvEAQor7/I1Xe2P9DQ4Ufi7esTzf5TFOf4U9B\", \"C\\x05ngstrCU*U***U*\" },\n  { \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.$scA6FwGGUwgLdOSc4U7H4crOp25qk.KU/.PTeDL.yW8\", \"C\\x05ngstrCU*U***U*\" },\n  { \"$gy$j75$.......\", \"$gy$j75$.......$ZRoDq9Y3NPunxRkzntmuoM.Kv0hKLyHfnnEI0ne1aK1\", \"U*U***U*ignored\" },\n  { \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.$HEBJLsXS9iDBx7Sl7Kh32V4F7e1uL1ZexBGuNBi1yQ1\", \"U*U***U*ignored\" },\n  { \"$gy$j85$.......\", \"$gy$j85$.......$3FobIobqjw5UrNb8OhkBu.MKUGl5DPluj7fKDx54Y.A\", \"U*U***U*ignored\" },\n  { \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.$Q5.H9bsApL0bFe4DFp0.ebFePnh8D44Ozc5vDxovTdD\", \"U*U***U*ignored\" },\n  { \"$gy$j75$.......\", \"$gy$j75$.......$pb.gwC5hQUaEdshckBgBtPIZKFmfueHpYL8.uNk6I2.\", \"U*U*U*U*\" },\n  { \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.$PkLZ8OGN5g1v4L5W1ZjinoSe0XUOvhKzr7gjbq05fN/\", \"U*U*U*U*\" },\n  { \"$gy$j85$.......\", \"$gy$j85$.......$TIknUuGwu6vYQDkk6E0EU.fpcpAnYEFnekdIsZem1K.\", \"U*U*U*U*\" },\n  { \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.$MgRKQgAz86P0Ig/9PpVEya89VdIzRdyn.LjiZfJH0v9\", \"U*U*U*U*\" },\n  { \"$gy$j75$.......\", \"$gy$j75$.......$h5gIYIw92xuGDjAJ1OheyTK4TprYAGlWtwZynoIRLx2\", \"U*U*U*U*ignored\" },\n  { \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.$KWomDMPtXlkKfoX8FNXyHU8w3M8/1NgchP0e6wqszd8\", \"U*U*U*U*ignored\" },\n  { \"$gy$j85$.......\", \"$gy$j85$.......$GYg4b6ZmzsUvkL/ZWB7zEKEtqdut6ExxI./ttIuBel4\", \"U*U*U*U*ignored\" },\n  { \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.$4f5qvAhZwrNQ757j9VgQRb6VWIVsRdUJL5.OIROwlJ9\", \"U*U*U*U*ignored\" },\n  { \"$gy$j75$.......\", \"$gy$j75$.......$.95v53CDmbdxsfgzKki6y/hUGPTphFNQ.jHwVvD2Ly0\", \"*U*U*U*U\" },\n  { \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.$dx7MeqVF.xJON221S8MehLC/2EF8Pvf5WuJRrS24dC8\", \"*U*U*U*U\" },\n  { \"$gy$j85$.......\", \"$gy$j85$.......$fQrHG0v6eXFH6sIC5UVMspOGuvMKgWCq2aCgCEXfd20\", \"*U*U*U*U\" },\n  { \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.$8dHc3EiE9IjD0h/ib0q9EKoMG4FEHTkhgjgIo7VT8d9\", \"*U*U*U*U\" },\n  { \"$gy$j75$.......\", \"$gy$j75$.......$5r9KPMPnInksPEuazZ18bXSPZ0TP4kwzXnS5.pNtmXB\", \"*U*U*U*U*\" },\n  { \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.$ilac/bjcWM7ayt0Mwr1OHdDhjbbKnlxwZoLpJJEn.UB\", \"*U*U*U*U*\" },\n  { \"$gy$j85$.......\", \"$gy$j85$.......$KAuVnqdHNxhmbgJylzwVUqM5bKMe8sE2TCqywtMwOb7\", \"*U*U*U*U*\" },\n  { \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.$kp4PvkqiaTxVwoNJamchNjbWumjH4c//JeT4D4zuxR4\", \"*U*U*U*U*\" },\n  { \"$gy$j75$.......\", \"$gy$j75$.......$PdBPO1IcU7Dfz7n3IL4RF8EbKNrqIG1vxRhagQlWxw9\", \"*U*U*U*U*U*U*U*U\" },\n  { \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.$prcqek/w3CFRJaXis7k/NrNBdXgPbmpZdEvD5IjzcaB\", \"*U*U*U*U*U*U*U*U\" },\n  { \"$gy$j85$.......\", \"$gy$j85$.......$Bhc4g7.eAbnHsK6OreunJktj0LIBi3ACMFB2wx57gpC\", \"*U*U*U*U*U*U*U*U\" },\n  { \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.$J9j48wlufw3FOnWXZiP8f.hefuj5R1ccae6U4LoG2F7\", \"*U*U*U*U*U*U*U*U\" },\n  { \"$gy$j75$.......\", \"$gy$j75$.......$A6O2sSnaQOloMRb97QEnRYMJgTh5m.IKg373cNiOqz6\", \"*U*U*U*U*U*U*U*U*\" },\n  { \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.$CZLRG4/sEZdXAI6EmhwKFU0TZbNJtlQSvn6ySei0fqB\", \"*U*U*U*U*U*U*U*U*\" },\n  { \"$gy$j85$.......\", \"$gy$j85$.......$bTZ7DDwPdB8j.PVLLiez3aMXd0uIuWo.pGCEUtqTxq3\", \"*U*U*U*U*U*U*U*U*\" },\n  { \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.$5cLFTQ7/f1q761MZqL3QQnLO974KhVDK3pgPiqwR5W7\", \"*U*U*U*U*U*U*U*U*\" },\n  { \"$gy$j75$.......\", \"$gy$j75$.......$dfeK1ue.MyJSj38VmaRY7vxEd0c82fmH40YJNWSdkY3\", \"\\xa3\" },\n  { \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.$ZHNcBWtiGfWpz02p4Cg4GYsV4qGrfFRWZeDo8sjfXR7\", \"\\xa3\" },\n  { \"$gy$j85$.......\", \"$gy$j85$.......$pETIIQuwbukDPUVgFe9x5mY3LCMqPrsJ/1KGuFPrZD8\", \"\\xa3\" },\n  { \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.$qxTX.XwoE.SJAeaBCcD2yVTlg2O6V6zmOm33nlDgac0\", \"\\xa3\" },\n  { \"$gy$j75$.......\", \"$gy$j75$.......$7Y4.WveE8WFV9.ew5aJMmWrOPss.8ie8uWGZ8eUI6fB\", \"\\xa3\"\"a\" },\n  { \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.$AperSj/SdcBCxSjaRTxDdm9xz/VgKpnYWZ72S/O.ORD\", \"\\xa3\"\"a\" },\n  { \"$gy$j85$.......\", \"$gy$j85$.......$M8Kv58mhB6MLilozaAhoh5FONvWvrDmtcLHIXvu60X1\", \"\\xa3\"\"a\" },\n  { \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.$QbWXa8vFSzEYQMRkL6t0gdwOX.nip4LpquhYXPy44G7\", \"\\xa3\"\"a\" },\n  { \"$gy$j75$.......\", \"$gy$j75$.......$W3bV.ZJDUq2pKdJz8t/8EUzvaxuoZdPB7jIHNMf4qY2\", \"\\xd1\\x91\" },\n  { \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.$PyDzJfpCroClRpIHx2A1LbY1yV99cVFBpDsxXBRUUt8\", \"\\xd1\\x91\" },\n  { \"$gy$j85$.......\", \"$gy$j85$.......$vgenLSrIBWbkVX1mKj0.4e9fmIAhtOc/tvdYhr7DOH/\", \"\\xd1\\x91\" },\n  { \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.$.xW9F5znHb6bRogZkj/iMqJyx7LSWhPWJ74A5DijFHC\", \"\\xd1\\x91\" },\n  { \"$gy$j75$.......\", \"$gy$j75$.......$XsnvURKnFtJQf3xR75dC62RqBdFrcm/R.S2h6qMa8QA\", \"\\xa3\"\"ab\" },\n  { \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.$2dml/8E6YfsNlXns47qs1HfTRG0QZoctMWYAAiVc119\", \"\\xa3\"\"ab\" },\n  { \"$gy$j85$.......\", \"$gy$j85$.......$G8ticvG7nGXh5dihMNiSWWTZoConjhpOhDptcmEYy31\", \"\\xa3\"\"ab\" },\n  { \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.$Y4JGzKzjYxaMkKXOH.R6nuCivxD1mcvwtp/FvW.NJB.\", \"\\xa3\"\"ab\" },\n  { \"$gy$j75$.......\", \"$gy$j75$.......$/YlCClBJX3gRIWRIWFHouJ/pPJK5EBoHOL7rOGa6ko5\", \"\\xff\\xff\\xa3\" },\n  { \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.$pw9fGvwlUL6B8XLLsmikaG6GTD0CIXVj6NWfH/jbY8C\", \"\\xff\\xff\\xa3\" },\n  { \"$gy$j85$.......\", \"$gy$j85$.......$.ADe6iQ62NfgIUbfyBDeXzaJQVpA6VwBklKkjnLNRRD\", \"\\xff\\xff\\xa3\" },\n  { \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.$ZlSujtcLWxd6vl8UQUPYSdKbwDKlYqAGKyd6HD8lCG4\", \"\\xff\\xff\\xa3\" },\n  { \"$gy$j75$.......\", \"$gy$j75$.......$etolgfLgQnYTGjLGhF4Ak/0lg2cm.RiwCl901dQShbB\", \"1\\xa3\"\"345\" },\n  { \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.$/yzytS9V3kQSvKduaFb0TJhQyGp11xP2IYti5e3x2o8\", \"1\\xa3\"\"345\" },\n  { \"$gy$j85$.......\", \"$gy$j85$.......$KjpsCK/kTmF4X53GS2828Ddclkj5.R9YwrVEDEX16g0\", \"1\\xa3\"\"345\" },\n  { \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.$5FuoOfGJgxl8hVkHMuE9xyAuTbQJryfVGQX0RYx/102\", \"1\\xa3\"\"345\" },\n  { \"$gy$j75$.......\", \"$gy$j75$.......$QhTBmXTFPaRZCTeBq2YZouowF7vbdubUUk3fHULDMD2\", \"\\xff\\xa3\"\"345\" },\n  { \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.$2/PMQbmxJVbvXF0a5q8TvFIFXIvuyakUQDz/x6wavb0\", \"\\xff\\xa3\"\"345\" },\n  { \"$gy$j85$.......\", \"$gy$j85$.......$sJhENr.9tjU43kTPMiNLy6y9r9iP5Q6A5CEhhNQiD22\", \"\\xff\\xa3\"\"345\" },\n  { \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.$YqqZ.VOXJtWdHxKf6fgFGKmdLKHzk1wINFL678YJOK6\", \"\\xff\\xa3\"\"345\" },\n  { \"$gy$j75$.......\", \"$gy$j75$.......$8zsZiUX2E1SXL/NLoYrmIJpyhlF9bR/7c.beu91HuW.\", \"\\xff\\xa3\"\"34\\xff\\xff\\xff\\xa3\"\"345\" },\n  { \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.$hsaNxokXGddBWmvjbm//QNsWRW4y/W6ElvNul.3KRE1\", \"\\xff\\xa3\"\"34\\xff\\xff\\xff\\xa3\"\"345\" },\n  { \"$gy$j85$.......\", \"$gy$j85$.......$VjzE.ltCX4NjGB6/wo4YOOfsbvrHqC3loLZcXqrrH/.\", \"\\xff\\xa3\"\"34\\xff\\xff\\xff\\xa3\"\"345\" },\n  { \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.$xdWdeN1fMHEZrzAyX8xot6XN4TOodQZBjhZgNu.n9t6\", \"\\xff\\xa3\"\"34\\xff\\xff\\xff\\xa3\"\"345\" },\n  { \"$gy$j75$.......\", \"$gy$j75$.......$rNSIEwZ9A9.VT2aMVSHvAKgLmy6X93cN.2fVjA4jcj7\", \"U\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xff\" },\n  { \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.$HtB2DxTt6hBQNvSS0OVUyotc6mF8zXIulGC8i4N/8M8\", \"U\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xff\" },\n  { \"$gy$j85$.......\", \"$gy$j85$.......$SGjpChZGrJrh4tjMQNlWHbxuXJy9ofzUThuAqpjNiZ.\", \"U\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xff\" },\n  { \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.$9EXtL13D7IAOHCyDl06bEyDdvPzGHAJyRWMSUpX.N15\", \"U\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xff\" },\n  { \"$gy$j75$.......\", \"$gy$j75$.......$OObIA2eneYrC9Hv6nS6wYvbm9vyPM.zi6gw1fU.eLy6\", \"\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\" },\n  { \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.$Coco8Ms9cTsApbGikhGGCnPEE3dSuVjFTUvjBaePnQA\", \"\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\" },\n  { \"$gy$j85$.......\", \"$gy$j85$.......$KLraiuzjVKrlxr5j5AC2J7slssws95G5o67.lPGDQu/\", \"\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\" },\n  { \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.$M0SCsrVDn9X7rZ7/tBr.e9a0VVVYkOEpKfn.B2uOq9B\", \"\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\" },\n  { \"$gy$j75$.......\", \"$gy$j75$.......$Kufo3tnBeB1VeYNwCLQqbRPaUcKAvS8qoWBR2OLfA9C\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\" },\n  { \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.$/PoQ1T4MAgC85QGvPDQgRlbHymcS8hj1dFZfc.dw/uC\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\" },\n  { \"$gy$j85$.......\", \"$gy$j85$.......$mEHUx6S6ZHfWsT9pvOix7TEHRu7Cd6aApJFzj4j/pW.\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\" },\n  { \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.$R.bEEI5eTMs9P8AE4LTVjn9zv6DmH4LI89NrYXwyDM1\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\" },\n  { \"$gy$j75$.......\", \"$gy$j75$.......$1LS6.oC2/ngI/4dQ2idiuuu/dyNCxkBF3XFYzIbPZkD\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789chars after 72 are ignored\" },\n  { \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.$6P.Bvon4OtDfLnKiZvFWUotcjScUQMkP/qfwL2sfFkA\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789chars after 72 are ignored\" },\n  { \"$gy$j85$.......\", \"$gy$j85$.......$UvIQWwYbXTE2VO/eZJ3RAaQwBOQsPmrXBcuVtOQQQI5\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789chars after 72 are ignored\" },\n  { \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.$JO.6V8aM9mE29i07h2BUTMV3ZD9AEEJU35obokiLLa.\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789chars after 72 are ignored\" },\n  { \"$gy$j75$.......\", \"$gy$j75$.......$5Q/Xt3ErIeGXaA8Ofe.5LKpZI5iqJNWHdstY/usxRgA\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\" },\n  { \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.$CJoPT8pQoOzIEd9rVhXbqSpAPSOLOIqO4SMODSg7ri8\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\" },\n  { \"$gy$j85$.......\", \"$gy$j85$.......$RaFsuYTQlb3xEiSU6Kl5et2Kvi32lptpgvPlaU7EzCC\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\" },\n  { \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.$SPFeE5GnWOkp5u.ML/V1wB8ouox75IK05AlDrU/0lZD\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\" },\n  { \"$gy$j75$.......\", \"$gy$j75$.......$wh1PjR8WTxkAemIWAb/BEggLZRDqVPuFu6bjeGru.f6\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\"\"chars after 72 are ignored as usual\" },\n  { \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.$A5JdRvZdUnm8dRZ6TorakNVqTOHIM8BGA2NyWVr05OD\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\"\"chars after 72 are ignored as usual\" },\n  { \"$gy$j85$.......\", \"$gy$j85$.......$H.CaCtAHpd/KJjU963DcDfd/JZ0H3ObF3LC8odpE/9D\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\"\"chars after 72 are ignored as usual\" },\n  { \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.$DDg2lHaFqes4dZMBkmrSrngFEV5GtaOCwBInxvkukzC\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\"\"chars after 72 are ignored as usual\" },\n  { \"$gy$j75$.......\", \"$gy$j75$.......$3HgXHJ0LvV/stryxOfrNtPM/4/WU0JVUO6MiFD9.Lp5\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has forgotten.\" },\n  { \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.$wXYInodkebOrIbqkAFikwcPHhk3o04P5O53fIsEwj96\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has forgotten.\" },\n  { \"$gy$j85$.......\", \"$gy$j85$.......$fK3M2aH3JO8aglZalDgPEZcni3b4TeUDe8fdwppGJ7B\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has forgotten.\" },\n  { \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.$lH0hnbEgsYcM43SD7OK/K5.6FuhwF/a0kSCav6WK.A4\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has forgotten.\" },\n  { \"$gy$j75$.......\", \"$gy$j75$.......$eM1eggivZnmLlacaqwcED8oe9/TfLuPQezj.xR0fiC7\", \"THE YEAR\" },\n  { \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.$tJg7PZ3RWCiTHYH5k4CwP93mvcLHrQcXEpzxH0fJbe.\", \"THE YEAR\" },\n  { \"$gy$j85$.......\", \"$gy$j85$.......$AKYs/ze5RzoPsxsE2SCEHYW1nAXZrp4twD6Acs77NbC\", \"THE YEAR\" },\n  { \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.$IY1fJnlULLmIAz2CvZsExBXae6sjcuAaHSGaNYYthYD\", \"THE YEAR\" },\n  { \"$gy$j75$.......\", \"$gy$j75$.......$8X.enacaiXWDH4xyB8vLrQiKv/8cVKIsfiiiQuNRAJC\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and do\" },\n  { \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.$OnN/GHEFcUP9DoI9ArdfcX7BWxwA6oLeiaT9SNl5/w7\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and do\" },\n  { \"$gy$j85$.......\", \"$gy$j85$.......$1ZY7rHIXoxc3D5pA6.bH6SQN9wgRYU2pqhAoC39LpA5\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and do\" },\n  { \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.$4MVk6KBvVvhCjGXK74jbGwhWWLOixShEBmfzgZ6MoaC\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and do\" },\n  { \"$gy$j75$.......\", \"$gy$j75$.......$F05eoM783SXbeWIx7Qpb9AXsyokxft9cmeFW7LSQqi8\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has f\" },\n  { \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j75$LdJMENpBABJJ3hIHjB1Bi.$GYt3.jbzAzZYLZrGFeJ5V1u0q7oHrijnZH.H.DcVT11\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has f\" },\n  { \"$gy$j85$.......\", \"$gy$j85$.......$ThY51yoJZcdxhDAZLP.XKU0aD0BBU5iQ.YkpPLjOiW.\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has f\" },\n  { \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$gy$j85$LdJMENpBABJJ3hIHjB1Bi.$8woNvgPfpTpOqf5FSLZukSAZ7qudVXPmR0CerJh5UWD\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has f\" },\n#endif // gost_yescrypt\n\n#if INCLUDE_md5crypt && defined TEST_md5crypt\n  { \"$1$CCCCCCCC\", \"$1$CCCCCCCC$3VEFvYjOvLeslZkqpLoqn.\", \"\" },\n  { \"$1$abcdefgh\", \"$1$abcdefgh$M55TzYaaccxVGbptZWaxX/\", \"\" },\n  { \"$1$CCCCCCCC\", \"$1$CCCCCCCC$fF1eBrniyJJXCQxhnuZWu/\", \" \" },\n  { \"$1$abcdefgh\", \"$1$abcdefgh$O7BjR/ZHapYPQbSTcq4Nq1\", \" \" },\n  { \"$1$CCCCCCCC\", \"$1$CCCCCCCC$G8nuxHw3XLmkyKhpNPCog.\", \"a\" },\n  { \"$1$abcdefgh\", \"$1$abcdefgh$jUYc1Xi7pkozuzWQ0Dft71\", \"a\" },\n  { \"$1$CCCCCCCC\", \"$1$CCCCCCCC$EjzjgyBQi50ijfMgLXBe11\", \"ab\" },\n  { \"$1$abcdefgh\", \"$1$abcdefgh$Vp3YNwpcydYzv31o3cmRg/\", \"ab\" },\n  { \"$1$CCCCCCCC\", \"$1$CCCCCCCC$feWwGi1u/IRJbumxdmIKi0\", \"abc\" },\n  { \"$1$abcdefgh\", \"$1$abcdefgh$Kn5qrjcQzV7oAHBJ23Cu3/\", \"abc\" },\n  { \"$1$CCCCCCCC\", \"$1$CCCCCCCC$gw92IW7tqCd0lx8RLT6Xd0\", \"U*U\" },\n  { \"$1$abcdefgh\", \"$1$abcdefgh$MgWcALXH6GdKt4lgu3JCA/\", \"U*U\" },\n  { \"$1$CCCCCCCC\", \"$1$CCCCCCCC$hgLez9pNcD04OdMFn5Aid1\", \"U*U*\" },\n  { \"$1$abcdefgh\", \"$1$abcdefgh$r0botEXKzX1B2i63LvkBU/\", \"U*U*\" },\n  { \"$1$CCCCCCCC\", \"$1$CCCCCCCC$2n0GWD4YaCrGB0j9A1rQt0\", \"U*U*U\" },\n  { \"$1$abcdefgh\", \"$1$abcdefgh$U7jk83m0mbZHeDFC1osTv0\", \"U*U*U\" },\n  { \"$1$CCCCCCCC\", \"$1$CCCCCCCC$KV2Sv2T97eDjbQKa.Scjm/\", \".....\" },\n  { \"$1$abcdefgh\", \"$1$abcdefgh$rJpkRIK5xqCYuBQrFSSpu/\", \".....\" },\n  { \"$1$CCCCCCCC\", \"$1$CCCCCCCC$9rSWi2uvoMaF4tuRo/FmT1\", \"dragon\" },\n  { \"$1$abcdefgh\", \"$1$abcdefgh$gyPqltr49ET96qfEMI36o/\", \"dragon\" },\n  { \"$1$CCCCCCCC\", \"$1$CCCCCCCC$GJiVP2WgZ2g7d.8WZIYtt.\", \"dRaGoN\" },\n  { \"$1$abcdefgh\", \"$1$abcdefgh$DT8OQqxRq0eFPYY0AlLBI1\", \"dRaGoN\" },\n  { \"$1$CCCCCCCC\", \"$1$CCCCCCCC$fjxnrgDnpXEDdB2LhMYzg.\", \"DrAgOn\" },\n  { \"$1$abcdefgh\", \"$1$abcdefgh$RC6u3Q4xCFpJ/H/9Mdd7x0\", \"DrAgOn\" },\n  { \"$1$CCCCCCCC\", \"$1$CCCCCCCC$fPCBG64zc9zVh2lOUuDzz1\", \"PAROLX\" },\n  { \"$1$abcdefgh\", \"$1$abcdefgh$P/TbBAvAzGkKmD2eCFwS51\", \"PAROLX\" },\n  { \"$1$CCCCCCCC\", \"$1$CCCCCCCC$ZFa4RVhiKKr2BjumIRKLY.\", \"U*U***U\" },\n  { \"$1$abcdefgh\", \"$1$abcdefgh$SL24g8PA7capmoHnO2tLr0\", \"U*U***U\" },\n  { \"$1$CCCCCCCC\", \"$1$CCCCCCCC$kzV44m6FcLqPKlmR.ensm/\", \"abcdefg\" },\n  { \"$1$abcdefgh\", \"$1$abcdefgh$F.A05.w2tKCW6T1uhxZYJ/\", \"abcdefg\" },\n  { \"$1$CCCCCCCC\", \"$1$CCCCCCCC$PVyf3huWcnHp.eMatEdTx1\", \"01234567\" },\n  { \"$1$abcdefgh\", \"$1$abcdefgh$ndt42kAlt/A34dn3RG9Hb/\", \"01234567\" },\n  { \"$1$CCCCCCCC\", \"$1$CCCCCCCC$D6VIjDq8l9PRLFIQ4dkbN.\", \"726 even\" },\n  { \"$1$abcdefgh\", \"$1$abcdefgh$r6lRjJ/vvwnG/tlAi9OQc.\", \"726 even\" },\n  { \"$1$CCCCCCCC\", \"$1$CCCCCCCC$neVLpneLdTzs2AguXgadz/\", \"zyxwvuts\" },\n  { \"$1$abcdefgh\", \"$1$abcdefgh$HXgBrBO6l8eRk1w0fblnH.\", \"zyxwvuts\" },\n  { \"$1$CCCCCCCC\", \"$1$CCCCCCCC$rr/FYyvajUIk4JcYMCsqw1\", \"ab1234567\" },\n  { \"$1$abcdefgh\", \"$1$abcdefgh$RtTAt.JhGdQVc2itkTYbS.\", \"ab1234567\" },\n  { \"$1$CCCCCCCC\", \"$1$CCCCCCCC$232NhbDiq0GNSDCea4DTz/\", \"alexander\" },\n  { \"$1$abcdefgh\", \"$1$abcdefgh$z8M6ycmJ1OciX9vhv6XBW/\", \"alexander\" },\n  { \"$1$CCCCCCCC\", \"$1$CCCCCCCC$0CaezolaUbbpq/dIbB3zc1\", \"beautiful\" },\n  { \"$1$abcdefgh\", \"$1$abcdefgh$SQTzRjDY3bXAidB.WGpYA/\", \"beautiful\" },\n  { \"$1$CCCCCCCC\", \"$1$CCCCCCCC$2OJ.i7uNxiGR0QpcC41FK/\", \"challenge\" },\n  { \"$1$abcdefgh\", \"$1$abcdefgh$7/4aP4i2U1OVKKxGdkXYK/\", \"challenge\" },\n  { \"$1$CCCCCCCC\", \"$1$CCCCCCCC$C0xdYrrcROWSoB.A1mkpm/\", \"chocolate\" },\n  { \"$1$abcdefgh\", \"$1$abcdefgh$.3RF/pxvzv7Usl0FYBu8R0\", \"chocolate\" },\n  { \"$1$CCCCCCCC\", \"$1$CCCCCCCC$BX3EUhgVc046dPA2aK1jv1\", \"cr1234567\" },\n  { \"$1$abcdefgh\", \"$1$abcdefgh$KeHYGRfRiCVyBt.zyEmvC0\", \"cr1234567\" },\n  { \"$1$CCCCCCCC\", \"$1$CCCCCCCC$PM5tGbAZr2mQocZUPnnmK/\", \"katherine\" },\n  { \"$1$abcdefgh\", \"$1$abcdefgh$ATOPrDtE2LBiLO7FZouMY1\", \"katherine\" },\n  { \"$1$CCCCCCCC\", \"$1$CCCCCCCC$1gp52OR0MPKH8LfNF6uoc1\", \"stephanie\" },\n  { \"$1$abcdefgh\", \"$1$abcdefgh$HWr7QFFJlg.qzuajUZeNo.\", \"stephanie\" },\n  { \"$1$CCCCCCCC\", \"$1$CCCCCCCC$XnZshSTLEoW9.yPGVijpA/\", \"sunflower\" },\n  { \"$1$abcdefgh\", \"$1$abcdefgh$VlDMZ8Yy3ahVZpYnSeauX.\", \"sunflower\" },\n  { \"$1$CCCCCCCC\", \"$1$CCCCCCCC$ymdTuavwPu.hO/2D4B8Bs/\", \"basketball\" },\n  { \"$1$abcdefgh\", \"$1$abcdefgh$v3r7hyJfpbJVlZPQGueCF.\", \"basketball\" },\n  { \"$1$CCCCCCCC\", \"$1$CCCCCCCC$b0RKtgL2MCXW0qPX6r54b0\", \"porsche911\" },\n  { \"$1$abcdefgh\", \"$1$abcdefgh$aw9.XNDWJA0DtFT2Jhjmf1\", \"porsche911\" },\n  { \"$1$CCCCCCCC\", \"$1$CCCCCCCC$nlIUzfjWxs2U7Axp.WQZF1\", \"|_337T`/p3\" },\n  { \"$1$abcdefgh\", \"$1$abcdefgh$OEAL/g.n7FoYsHk2N9FDm1\", \"|_337T`/p3\" },\n  { \"$1$CCCCCCCC\", \"$1$CCCCCCCC$1ZF01ppNU3L6LTgcFtexS/\", \"thunderbird\" },\n  { \"$1$abcdefgh\", \"$1$abcdefgh$D9jDI5vFMKtr6gizj5VjR1\", \"thunderbird\" },\n  { \"$1$CCCCCCCC\", \"$1$CCCCCCCC$rJ.yZpWZdEhUcaGDAvyzP0\", \"Hello world!\" },\n  { \"$1$abcdefgh\", \"$1$abcdefgh$fzmjzFdo5nMtBG8gtud5e0\", \"Hello world!\" },\n  { \"$1$CCCCCCCC\", \"$1$CCCCCCCC$/nC1ARcvhLEJ2FHKRkBbK1\", \"pleaseletmein\" },\n  { \"$1$abcdefgh\", \"$1$abcdefgh$3qy9r54GtjsyVILgK0aOa.\", \"pleaseletmein\" },\n  { \"$1$CCCCCCCC\", \"$1$CCCCCCCC$r0lPgYOthMsmbdXDT2JVh/\", \"a short string\" },\n  { \"$1$abcdefgh\", \"$1$abcdefgh$4.48BCvaYOCpQt50Y430b0\", \"a short string\" },\n  { \"$1$CCCCCCCC\", \"$1$CCCCCCCC$AOrFbY68VuK/iYF2YmCwj.\", \"zxyDPWgydbQjgq\" },\n  { \"$1$abcdefgh\", \"$1$abcdefgh$YtwIsfm2sDo6qgYsu5Ii.1\", \"zxyDPWgydbQjgq\" },\n  { \"$1$CCCCCCCC\", \"$1$CCCCCCCC$UsbDzObTc7njWzvooxioG.\", \"photojournalism\" },\n  { \"$1$abcdefgh\", \"$1$abcdefgh$vTwWkt.61b178rKwdPmyU.\", \"photojournalism\" },\n  { \"$1$CCCCCCCC\", \"$1$CCCCCCCC$YF.So56GLoDKmLeZdudRb/\", \"ecclesiastically\" },\n  { \"$1$abcdefgh\", \"$1$abcdefgh$x.4Hvf9t2FLspOzG1fCBr/\", \"ecclesiastically\" },\n  { \"$1$CCCCCCCC\", \"$1$CCCCCCCC$lGAtGVGP5wFLgvGsdUuDA.\", \"congregationalism\" },\n  { \"$1$abcdefgh\", \"$1$abcdefgh$IuWBvGW1pUxwqzbycdjfN.\", \"congregationalism\" },\n  { \"$1$CCCCCCCC\", \"$1$CCCCCCCC$XnvN61jk3QGTbPOLYzMIq1\", \"dihydrosphingosine\" },\n  { \"$1$abcdefgh\", \"$1$abcdefgh$aVbFx8M7gjfV9fc3.jrK50\", \"dihydrosphingosine\" },\n  { \"$1$CCCCCCCC\", \"$1$CCCCCCCC$qTggqR60CB/DZ7D1g66WB0\", \"semianthropological\" },\n  { \"$1$abcdefgh\", \"$1$abcdefgh$CjguQzuQU8zYdzO08NwJq/\", \"semianthropological\" },\n  { \"$1$CCCCCCCC\", \"$1$CCCCCCCC$Fs2ZhR.fzIcLkzNVljjwl0\", \"palaeogeographically\" },\n  { \"$1$abcdefgh\", \"$1$abcdefgh$xck3UcDH7lIOFLC9YHcfH0\", \"palaeogeographically\" },\n  { \"$1$CCCCCCCC\", \"$1$CCCCCCCC$gq4ReK9TyFSQiunk9dXNc1\", \"electromyographically\" },\n  { \"$1$abcdefgh\", \"$1$abcdefgh$pxvjfPct1kja4b/zs/a4w1\", \"electromyographically\" },\n  { \"$1$CCCCCCCC\", \"$1$CCCCCCCC$uZArZttLs4Me7t4mhb.NA1\", \"noninterchangeableness\" },\n  { \"$1$abcdefgh\", \"$1$abcdefgh$z2bNvZ.Ghp0y2QxRj/lI0/\", \"noninterchangeableness\" },\n  { \"$1$CCCCCCCC\", \"$1$CCCCCCCC$N7SF4UPzT5sF0Ab9JkjTw0\", \"abcdefghijklmnopqrstuvwxyz\" },\n  { \"$1$abcdefgh\", \"$1$abcdefgh$PUUA73rkgF7NpJCpUy0nH1\", \"abcdefghijklmnopqrstuvwxyz\" },\n  { \"$1$CCCCCCCC\", \"$1$CCCCCCCC$om1uqQHIYK6Yg7uwQoyZj.\", \"electroencephalographically\" },\n  { \"$1$abcdefgh\", \"$1$abcdefgh$iBygg/0KwmzuUKJXZHs3a/\", \"electroencephalographically\" },\n  { \"$1$CCCCCCCC\", \"$1$CCCCCCCC$/H48fHVT4Vb3kzPt5B/Ux/\", \"antidisestablishmentarianism\" },\n  { \"$1$abcdefgh\", \"$1$abcdefgh$gxeQVSJBHtRwspExzsGYB1\", \"antidisestablishmentarianism\" },\n  { \"$1$CCCCCCCC\", \"$1$CCCCCCCC$RHjWx.M98KRbQXKzakD2X1\", \"cyclotrimethylenetrinitramine\" },\n  { \"$1$abcdefgh\", \"$1$abcdefgh$o0DrqaV1Km7U/bvH.lnFe.\", \"cyclotrimethylenetrinitramine\" },\n  { \"$1$CCCCCCCC\", \"$1$CCCCCCCC$rsroqf1CeL9MCRXzugE5k.\", \"dichlorodiphenyltrichloroethane\" },\n  { \"$1$abcdefgh\", \"$1$abcdefgh$9u5RmjOdf4YvnCvNOheJA1\", \"dichlorodiphenyltrichloroethane\" },\n  { \"$1$CCCCCCCC\", \"$1$CCCCCCCC$19F48bDspWw.nL9oeltvJ1\", \"multiple words seperated by spaces\" },\n  { \"$1$abcdefgh\", \"$1$abcdefgh$ISZa8Bd6MhtOCY2RZxNHS.\", \"multiple words seperated by spaces\" },\n  { \"$1$CCCCCCCC\", \"$1$CCCCCCCC$e03M.JG85W/Ceg0Jmit7P0\", \"supercalifragilisticexpialidocious\" },\n  { \"$1$abcdefgh\", \"$1$abcdefgh$XjyDQRyWmrgHG/aPLip570\", \"supercalifragilisticexpialidocious\" },\n  { \"$1$CCCCCCCC\", \"$1$CCCCCCCC$KnUTNWYq99MC3ieupa2Ps/\", \"we have a short salt string but not a short password\" },\n  { \"$1$abcdefgh\", \"$1$abcdefgh$SzFLz7qPo5zlUc9riugWR.\", \"we have a short salt string but not a short password\" },\n  { \"$1$CCCCCCCC\", \"$1$CCCCCCCC$J5jgRhocHN/1zF3Wodaj..\", \"multiple word$ $eperated by $pace$ and $pecial character$\" },\n  { \"$1$abcdefgh\", \"$1$abcdefgh$DAYp5MGob5QJ5B.zsKV0b1\", \"multiple word$ $eperated by $pace$ and $pecial character$\" },\n  { \"$1$CCCCCCCC\", \"$1$CCCCCCCC$i8oV0kZYcBU9CcOy.vjff/\", \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\" },\n  { \"$1$abcdefgh\", \"$1$abcdefgh$gRJNFY8U.ACWCSYdcGzsK.\", \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\" },\n  { \"$1$CCCCCCCC\", \"$1$CCCCCCCC$7CfsiXMdA9cscLPyziddW0\", \"12345678901234567890123456789012345678901234567890123456789012345678901234567890\" },\n  { \"$1$abcdefgh\", \"$1$abcdefgh$HpCl68zMykh9X16y73S8N0\", \"12345678901234567890123456789012345678901234567890123456789012345678901234567890\" },\n  { \"$1$CCCCCCCC\", \"$1$CCCCCCCC$xvczMupCEqTEMdsbNvNmp0\", \"a very much longer text to encrypt.  This one even stretches over morethan one line.\" },\n  { \"$1$abcdefgh\", \"$1$abcdefgh$j37CHvGkiOEUvY/w0I4gw1\", \"a very much longer text to encrypt.  This one even stretches over morethan one line.\" },\n  { \"$1$CCCCCCCC\", \"$1$CCCCCCCC$HXricYVZu8bgI85Hv7Cq3.\", \"\\xd0\\xc1\\xd2\\xcf\\xcc\\xd8\" },\n  { \"$1$abcdefgh\", \"$1$abcdefgh$xGvS9opNzTVoMbVPog4ha0\", \"\\xd0\\xc1\\xd2\\xcf\\xcc\\xd8\" },\n  { \"$1$CCCCCCCC\", \"$1$CCCCCCCC$AoBBJ5BVtOtVDTW4gB2Nu0\", \"\\xd5\\xaa\\xd5\\xaa\\xaa\\xaa\\xd5\\xaa\" },\n  { \"$1$abcdefgh\", \"$1$abcdefgh$Rsvboxu8AALo99ByYHO/z.\", \"\\xd5\\xaa\\xd5\\xaa\\xaa\\xaa\\xd5\\xaa\" },\n  { \"$1$CCCCCCCC\", \"$1$CCCCCCCC$XsTrEjKT8enjnESvPmRrZ.\", \"\\xe1\\xec\\xe5\\xf8\\xe1\\xee\\xe4\\xe5\\xf2\" },\n  { \"$1$abcdefgh\", \"$1$abcdefgh$KDskBFOHq.zkwdRvOh1vE.\", \"\\xe1\\xec\\xe5\\xf8\\xe1\\xee\\xe4\\xe5\\xf2\" },\n  { \"$1$CCCCCCCC\", \"$1$CCCCCCCC$qyJQqz405Vy2EDzt8ANwM/\", \"\\xf3\\xf4\\xe5\\xf0\\xe8\\xe1\\xee\\xe9\\xe5\" },\n  { \"$1$abcdefgh\", \"$1$abcdefgh$ld0cLXNNe45GlLjk/FUeb0\", \"\\xf3\\xf4\\xe5\\xf0\\xe8\\xe1\\xee\\xe9\\xe5\" },\n  { \"$1$CCCCCCCC\", \"$1$CCCCCCCC$WCf0lStfTbXAJh8lZgcf//\", \"\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\" },\n  { \"$1$abcdefgh\", \"$1$abcdefgh$0jy3aDbrPsoN.YgCUgG9P0\", \"\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\" },\n  { \"$1$CCCCCCCC\", \"$1$CCCCCCCC$ztBvhxgwecESGOR9UyhRp.\", \"\\xc3\\xa9tude\" },\n  { \"$1$abcdefgh\", \"$1$abcdefgh$ZQEnYbGW/Adt9cLn9yjwV/\", \"\\xc3\\xa9tude\" },\n  { \"$1$CCCCCCCC\", \"$1$CCCCCCCC$Ny4b16WAD8aIhJzV2Hdsi.\", \"C)tude\" },\n  { \"$1$abcdefgh\", \"$1$abcdefgh$R8W51vsbuWul19F22rgc4/\", \"C)tude\" },\n  { \"$1$CCCCCCCC\", \"$1$CCCCCCCC$5mye/USugxlUzg6mXzZ78/\", \"Chl\\xc3\\xb6\"\"e\" },\n  { \"$1$abcdefgh\", \"$1$abcdefgh$nxcLmY4E.1mOxFQAM.nVx0\", \"Chl\\xc3\\xb6\"\"e\" },\n  { \"$1$CCCCCCCC\", \"$1$CCCCCCCC$4zoZTVNmMVHoUAJkjMJxO0\", \"ChlC6e\" },\n  { \"$1$abcdefgh\", \"$1$abcdefgh$NxKoGC3PkWPDQcaVPY0Da/\", \"ChlC6e\" },\n  { \"$1$CCCCCCCC\", \"$1$CCCCCCCC$SGa7fFS8YaUadEPpmiLcT1\", \"\\xc3\\x85ngstr\\xc3\\xb6m\" },\n  { \"$1$abcdefgh\", \"$1$abcdefgh$1ieAOKER8H8Q8E9pWRDAL/\", \"\\xc3\\x85ngstr\\xc3\\xb6m\" },\n  { \"$1$CCCCCCCC\", \"$1$CCCCCCCC$TcOpcz.jGk5G1oOnt1WZE1\", \"C\\x05ngstrC6m\" },\n  { \"$1$abcdefgh\", \"$1$abcdefgh$S2Rs2iVMhwLIoD.IVy/Br/\", \"C\\x05ngstrC6m\" },\n  { \"$1$CCCCCCCC\", \"$1$CCCCCCCC$6P2AiSKjDb/MRWxo5/TKB/\", \"C\\x05ngstrCU*U***U*\" },\n  { \"$1$abcdefgh\", \"$1$abcdefgh$ZyL0yNgxjea9B0nAIiOb81\", \"C\\x05ngstrCU*U***U*\" },\n  { \"$1$CCCCCCCC\", \"$1$CCCCCCCC$WQUEqsaUgBt/KwWzhwoU01\", \"U*U***U*ignored\" },\n  { \"$1$abcdefgh\", \"$1$abcdefgh$wBnlJdQykzoCl7zpRg5mk1\", \"U*U***U*ignored\" },\n  { \"$1$CCCCCCCC\", \"$1$CCCCCCCC$nJMgkPMU61cAabNxupF4e0\", \"U*U*U*U*\" },\n  { \"$1$abcdefgh\", \"$1$abcdefgh$s7nrRJjPHTR5VyMXFUOR.0\", \"U*U*U*U*\" },\n  { \"$1$CCCCCCCC\", \"$1$CCCCCCCC$ovvoeLls1/ni2cpTOQdEm1\", \"U*U*U*U*ignored\" },\n  { \"$1$abcdefgh\", \"$1$abcdefgh$8SPAiyyWUxp.IGr/rFjAF/\", \"U*U*U*U*ignored\" },\n  { \"$1$CCCCCCCC\", \"$1$CCCCCCCC$watTtD/zvc5Fq4Z8I/V4i.\", \"*U*U*U*U\" },\n  { \"$1$abcdefgh\", \"$1$abcdefgh$JtVGN5QQGqdEUIr2DPDnH0\", \"*U*U*U*U\" },\n  { \"$1$CCCCCCCC\", \"$1$CCCCCCCC$w9RqVTcK.GSJX5nqROGfw1\", \"*U*U*U*U*\" },\n  { \"$1$abcdefgh\", \"$1$abcdefgh$he.rHYpSVPrQ6zOmBIVUk.\", \"*U*U*U*U*\" },\n  { \"$1$CCCCCCCC\", \"$1$CCCCCCCC$Z92WSOtMLK5z/RgSrsIZV0\", \"*U*U*U*U*U*U*U*U\" },\n  { \"$1$abcdefgh\", \"$1$abcdefgh$QI10y/BEoUb2DndAp1GmF/\", \"*U*U*U*U*U*U*U*U\" },\n  { \"$1$CCCCCCCC\", \"$1$CCCCCCCC$aPvdu9a759jHQAwa6zDTB.\", \"*U*U*U*U*U*U*U*U*\" },\n  { \"$1$abcdefgh\", \"$1$abcdefgh$IbeuoYf5T8SG6zOOe06a00\", \"*U*U*U*U*U*U*U*U*\" },\n  { \"$1$CCCCCCCC\", \"$1$CCCCCCCC$naH8Ddw2hni3K6EBuhhqO/\", \"\\xa3\" },\n  { \"$1$abcdefgh\", \"$1$abcdefgh$2bBGUs.MaAMF/GswXhbTM1\", \"\\xa3\" },\n  { \"$1$CCCCCCCC\", \"$1$CCCCCCCC$VNWLRC3x8d1LdF0Ult/6k/\", \"\\xa3\"\"a\" },\n  { \"$1$abcdefgh\", \"$1$abcdefgh$b4GBSPqq29.5uSGAdEm5V1\", \"\\xa3\"\"a\" },\n  { \"$1$CCCCCCCC\", \"$1$CCCCCCCC$4s.VBq0BxC5QCae9ZrZVb.\", \"\\xd1\\x91\" },\n  { \"$1$abcdefgh\", \"$1$abcdefgh$YdLYoJwm9dp95oN7TuIye/\", \"\\xd1\\x91\" },\n  { \"$1$CCCCCCCC\", \"$1$CCCCCCCC$zNyWM22x6Oj01T7wU9t880\", \"\\xa3\"\"ab\" },\n  { \"$1$abcdefgh\", \"$1$abcdefgh$vIfeQm2KwLPlHwVfN4Eqf/\", \"\\xa3\"\"ab\" },\n  { \"$1$CCCCCCCC\", \"$1$CCCCCCCC$N56OzIlm0dgH2dCTfCJwM0\", \"\\xff\\xff\\xa3\" },\n  { \"$1$abcdefgh\", \"$1$abcdefgh$GoUrYKmAk2AGHJA1iJccH1\", \"\\xff\\xff\\xa3\" },\n  { \"$1$CCCCCCCC\", \"$1$CCCCCCCC$Z1jBzcsJuaDyWnL.BzznP1\", \"1\\xa3\"\"345\" },\n  { \"$1$abcdefgh\", \"$1$abcdefgh$8sTvaVzVcRcxrFZ2ZTvoy/\", \"1\\xa3\"\"345\" },\n  { \"$1$CCCCCCCC\", \"$1$CCCCCCCC$HlH6u4jaAlgbA31qxx0mn.\", \"\\xff\\xa3\"\"345\" },\n  { \"$1$abcdefgh\", \"$1$abcdefgh$EvqgIpKkkXaucuZH10LoY/\", \"\\xff\\xa3\"\"345\" },\n  { \"$1$CCCCCCCC\", \"$1$CCCCCCCC$rTb1DMSszWMgS/kNnuDCV.\", \"\\xff\\xa3\"\"34\\xff\\xff\\xff\\xa3\"\"345\" },\n  { \"$1$abcdefgh\", \"$1$abcdefgh$pt7agU8yTzKdDB/RIzdWl.\", \"\\xff\\xa3\"\"34\\xff\\xff\\xff\\xa3\"\"345\" },\n  { \"$1$CCCCCCCC\", \"$1$CCCCCCCC$8XbJ0x.3VArmvlna09qgw1\", \"U\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xff\" },\n  { \"$1$abcdefgh\", \"$1$abcdefgh$LDWZ6yPRz1pfZnrCR3NMl0\", \"U\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xff\" },\n  { \"$1$CCCCCCCC\", \"$1$CCCCCCCC$jPqxrmlwfjnt8.QPFPR5E0\", \"\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\" },\n  { \"$1$abcdefgh\", \"$1$abcdefgh$KP06ldpOd.6om40DB7BD11\", \"\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\" },\n  { \"$1$CCCCCCCC\", \"$1$CCCCCCCC$OvKP7wmqPIMxqvmd3idHc1\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\" },\n  { \"$1$abcdefgh\", \"$1$abcdefgh$0lRoLbWrDtFCdbPXsCGeQ/\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\" },\n  { \"$1$CCCCCCCC\", \"$1$CCCCCCCC$uul920dnxWu.YFRNsmBuO/\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789chars after 72 are ignored\" },\n  { \"$1$abcdefgh\", \"$1$abcdefgh$8qkEzjcTUyyWHpDKU1Ck3.\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789chars after 72 are ignored\" },\n  { \"$1$CCCCCCCC\", \"$1$CCCCCCCC$CsqLLDOcxcaf.yLPQCA4c0\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\" },\n  { \"$1$abcdefgh\", \"$1$abcdefgh$K0NgKIz4p8cq6H9GHXMwD0\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\" },\n  { \"$1$CCCCCCCC\", \"$1$CCCCCCCC$zWTB4WxPAwUyt18y5Zc31.\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\"\"chars after 72 are ignored as usual\" },\n  { \"$1$abcdefgh\", \"$1$abcdefgh$zNuGPTPch3zuDqO7yQzkx/\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\"\"chars after 72 are ignored as usual\" },\n  { \"$1$CCCCCCCC\", \"$1$CCCCCCCC$J91yKhxXfvtUnYMc.dJRS0\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has forgotten.\" },\n  { \"$1$abcdefgh\", \"$1$abcdefgh$JW/dlwDB3OEb0pH8o5rFJ0\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has forgotten.\" },\n  { \"$1$CCCCCCCC\", \"$1$CCCCCCCC$Gsh1Cpbqgk.zHFemcUtVH.\", \"THE YEAR\" },\n  { \"$1$abcdefgh\", \"$1$abcdefgh$wX/XLDulTCITBlw11On0e1\", \"THE YEAR\" },\n  { \"$1$CCCCCCCC\", \"$1$CCCCCCCC$RKWSDpG6MqWtaVJXPLGFn0\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and do\" },\n  { \"$1$abcdefgh\", \"$1$abcdefgh$q5HH4Ys2I.htqrplqRNBW.\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and do\" },\n  { \"$1$CCCCCCCC\", \"$1$CCCCCCCC$9DWTJzTp2eEsXN/hOgDyO/\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has f\" },\n  { \"$1$abcdefgh\", \"$1$abcdefgh$qJ70XApTatr8UBxoCT2tj1\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has f\" },\n#endif // md5crypt\n\n#if INCLUDE_nt && defined TEST_nt\n  { \"$3$\", \"$3$$31d6cfe0d16ae931b73c59d7e0c089c0\", \"\" },\n  { \"$3$__not_used__0123456789abcdef\", \"$3$$31d6cfe0d16ae931b73c59d7e0c089c0\", \"\" },\n  { \"$3$\", \"$3$$71c5391067de41fad6f3063162e5eeff\", \" \" },\n  { \"$3$__not_used__0123456789abcdef\", \"$3$$71c5391067de41fad6f3063162e5eeff\", \" \" },\n  { \"$3$\", \"$3$$186cb09181e2c2ecaac768c47c729904\", \"a\" },\n  { \"$3$__not_used__0123456789abcdef\", \"$3$$186cb09181e2c2ecaac768c47c729904\", \"a\" },\n  { \"$3$\", \"$3$$79312f7ee81e59d4e76a15021e74b597\", \"ab\" },\n  { \"$3$__not_used__0123456789abcdef\", \"$3$$79312f7ee81e59d4e76a15021e74b597\", \"ab\" },\n  { \"$3$\", \"$3$$e0fba38268d0ec66ef1cb452d5885e53\", \"abc\" },\n  { \"$3$__not_used__0123456789abcdef\", \"$3$$e0fba38268d0ec66ef1cb452d5885e53\", \"abc\" },\n  { \"$3$\", \"$3$$ceb4a53eab759a7b5da77a864c89969f\", \"U*U\" },\n  { \"$3$__not_used__0123456789abcdef\", \"$3$$ceb4a53eab759a7b5da77a864c89969f\", \"U*U\" },\n  { \"$3$\", \"$3$$020b0e67d1f7cf9572872be20eea8e46\", \"U*U*\" },\n  { \"$3$__not_used__0123456789abcdef\", \"$3$$020b0e67d1f7cf9572872be20eea8e46\", \"U*U*\" },\n  { \"$3$\", \"$3$$4a8c3c762ab3d8555d9c56c10c22192c\", \"U*U*U\" },\n  { \"$3$__not_used__0123456789abcdef\", \"$3$$4a8c3c762ab3d8555d9c56c10c22192c\", \"U*U*U\" },\n  { \"$3$\", \"$3$$c68e5da4d65da3c0af82c12b570a70db\", \".....\" },\n  { \"$3$__not_used__0123456789abcdef\", \"$3$$c68e5da4d65da3c0af82c12b570a70db\", \".....\" },\n  { \"$3$\", \"$3$$f7eb9c06fafaa23c4bcf22ba6781c1e2\", \"dragon\" },\n  { \"$3$__not_used__0123456789abcdef\", \"$3$$f7eb9c06fafaa23c4bcf22ba6781c1e2\", \"dragon\" },\n  { \"$3$\", \"$3$$daa481bd1f162914a274e2a245f8109e\", \"dRaGoN\" },\n  { \"$3$__not_used__0123456789abcdef\", \"$3$$daa481bd1f162914a274e2a245f8109e\", \"dRaGoN\" },\n  { \"$3$\", \"$3$$4797812bea44e9096249023d368fb105\", \"DrAgOn\" },\n  { \"$3$__not_used__0123456789abcdef\", \"$3$$4797812bea44e9096249023d368fb105\", \"DrAgOn\" },\n  { \"$3$\", \"$3$$c772c8e4d04f243c605cce71ee6f62eb\", \"PAROLX\" },\n  { \"$3$__not_used__0123456789abcdef\", \"$3$$c772c8e4d04f243c605cce71ee6f62eb\", \"PAROLX\" },\n  { \"$3$\", \"$3$$f853ef408446648d7b169102806b7c0d\", \"U*U***U\" },\n  { \"$3$__not_used__0123456789abcdef\", \"$3$$f853ef408446648d7b169102806b7c0d\", \"U*U***U\" },\n  { \"$3$\", \"$3$$352dfe551d62459b20349b78a21a2f37\", \"abcdefg\" },\n  { \"$3$__not_used__0123456789abcdef\", \"$3$$352dfe551d62459b20349b78a21a2f37\", \"abcdefg\" },\n  { \"$3$\", \"$3$$380bc5229eacff2c5552486b68a6ccc5\", \"01234567\" },\n  { \"$3$__not_used__0123456789abcdef\", \"$3$$380bc5229eacff2c5552486b68a6ccc5\", \"01234567\" },\n  { \"$3$\", \"$3$$7fbb217faea46857f612f84bfe10e812\", \"726 even\" },\n  { \"$3$__not_used__0123456789abcdef\", \"$3$$7fbb217faea46857f612f84bfe10e812\", \"726 even\" },\n  { \"$3$\", \"$3$$b3c508fbd73269591969bfb8fbfb183c\", \"zyxwvuts\" },\n  { \"$3$__not_used__0123456789abcdef\", \"$3$$b3c508fbd73269591969bfb8fbfb183c\", \"zyxwvuts\" },\n  { \"$3$\", \"$3$$ddc0dcdede6610bb6a0ee2d44311be88\", \"ab1234567\" },\n  { \"$3$__not_used__0123456789abcdef\", \"$3$$ddc0dcdede6610bb6a0ee2d44311be88\", \"ab1234567\" },\n  { \"$3$\", \"$3$$b2afd3ee7005887d914650f0d30231c0\", \"alexander\" },\n  { \"$3$__not_used__0123456789abcdef\", \"$3$$b2afd3ee7005887d914650f0d30231c0\", \"alexander\" },\n  { \"$3$\", \"$3$$9f76131357710f136b9827c3996a9baa\", \"beautiful\" },\n  { \"$3$__not_used__0123456789abcdef\", \"$3$$9f76131357710f136b9827c3996a9baa\", \"beautiful\" },\n  { \"$3$\", \"$3$$1597f8e3b872d5348767416f6921d346\", \"challenge\" },\n  { \"$3$__not_used__0123456789abcdef\", \"$3$$1597f8e3b872d5348767416f6921d346\", \"challenge\" },\n  { \"$3$\", \"$3$$b8018bbb613b4454d120f964b27c0335\", \"chocolate\" },\n  { \"$3$__not_used__0123456789abcdef\", \"$3$$b8018bbb613b4454d120f964b27c0335\", \"chocolate\" },\n  { \"$3$\", \"$3$$49ebe86d5beb8fd388ae37b865a52a0b\", \"cr1234567\" },\n  { \"$3$__not_used__0123456789abcdef\", \"$3$$49ebe86d5beb8fd388ae37b865a52a0b\", \"cr1234567\" },\n  { \"$3$\", \"$3$$163e842740652fa1f35b4e979e5d40f1\", \"katherine\" },\n  { \"$3$__not_used__0123456789abcdef\", \"$3$$163e842740652fa1f35b4e979e5d40f1\", \"katherine\" },\n  { \"$3$\", \"$3$$cc01ce7709c35d13429488edde7b58b1\", \"stephanie\" },\n  { \"$3$__not_used__0123456789abcdef\", \"$3$$cc01ce7709c35d13429488edde7b58b1\", \"stephanie\" },\n  { \"$3$\", \"$3$$22958710c569d1fa791f43aba4d4e9ea\", \"sunflower\" },\n  { \"$3$__not_used__0123456789abcdef\", \"$3$$22958710c569d1fa791f43aba4d4e9ea\", \"sunflower\" },\n  { \"$3$\", \"$3$$cf5fd610b326e61f175e3a9bac4751f9\", \"basketball\" },\n  { \"$3$__not_used__0123456789abcdef\", \"$3$$cf5fd610b326e61f175e3a9bac4751f9\", \"basketball\" },\n  { \"$3$\", \"$3$$f4cac307bff26ea1aa0189e361d39212\", \"porsche911\" },\n  { \"$3$__not_used__0123456789abcdef\", \"$3$$f4cac307bff26ea1aa0189e361d39212\", \"porsche911\" },\n  { \"$3$\", \"$3$$ca8ad8058c3226764a3af34a8edcbb2e\", \"|_337T`/p3\" },\n  { \"$3$__not_used__0123456789abcdef\", \"$3$$ca8ad8058c3226764a3af34a8edcbb2e\", \"|_337T`/p3\" },\n  { \"$3$\", \"$3$$0dee2479a5d39b0a7ced5776173596eb\", \"thunderbird\" },\n  { \"$3$__not_used__0123456789abcdef\", \"$3$$0dee2479a5d39b0a7ced5776173596eb\", \"thunderbird\" },\n  { \"$3$\", \"$3$$87ee0af454a9cb8d90d24196068637a8\", \"Hello world!\" },\n  { \"$3$__not_used__0123456789abcdef\", \"$3$$87ee0af454a9cb8d90d24196068637a8\", \"Hello world!\" },\n  { \"$3$\", \"$3$$50ba50a9c78298045b88320ea47fd387\", \"pleaseletmein\" },\n  { \"$3$__not_used__0123456789abcdef\", \"$3$$50ba50a9c78298045b88320ea47fd387\", \"pleaseletmein\" },\n  { \"$3$\", \"$3$$d1a71e89e521aa81176f6ddf3b86b68c\", \"a short string\" },\n  { \"$3$__not_used__0123456789abcdef\", \"$3$$d1a71e89e521aa81176f6ddf3b86b68c\", \"a short string\" },\n  { \"$3$\", \"$3$$f869abd36f7b31c1f9c4a213e49b559f\", \"zxyDPWgydbQjgq\" },\n  { \"$3$__not_used__0123456789abcdef\", \"$3$$f869abd36f7b31c1f9c4a213e49b559f\", \"zxyDPWgydbQjgq\" },\n  { \"$3$\", \"$3$$83200a50482a6daf45b2902ed52042f2\", \"photojournalism\" },\n  { \"$3$__not_used__0123456789abcdef\", \"$3$$83200a50482a6daf45b2902ed52042f2\", \"photojournalism\" },\n  { \"$3$\", \"$3$$0b83b68ba7a5ce58ed50bb0f9a5fa06a\", \"ecclesiastically\" },\n  { \"$3$__not_used__0123456789abcdef\", \"$3$$0b83b68ba7a5ce58ed50bb0f9a5fa06a\", \"ecclesiastically\" },\n  { \"$3$\", \"$3$$ebd2b24e1ee857784f6ac40fd500077e\", \"congregationalism\" },\n  { \"$3$__not_used__0123456789abcdef\", \"$3$$ebd2b24e1ee857784f6ac40fd500077e\", \"congregationalism\" },\n  { \"$3$\", \"$3$$40fabb09b52fb8a7843f7e1ee723cf03\", \"dihydrosphingosine\" },\n  { \"$3$__not_used__0123456789abcdef\", \"$3$$40fabb09b52fb8a7843f7e1ee723cf03\", \"dihydrosphingosine\" },\n  { \"$3$\", \"$3$$1eba95138c99f9a0621d24876eea2868\", \"semianthropological\" },\n  { \"$3$__not_used__0123456789abcdef\", \"$3$$1eba95138c99f9a0621d24876eea2868\", \"semianthropological\" },\n  { \"$3$\", \"$3$$5d6536aea6febd7b98e373cfd3f28a85\", \"palaeogeographically\" },\n  { \"$3$__not_used__0123456789abcdef\", \"$3$$5d6536aea6febd7b98e373cfd3f28a85\", \"palaeogeographically\" },\n  { \"$3$\", \"$3$$a27af10e890b5e0856360a4d993eeb77\", \"electromyographically\" },\n  { \"$3$__not_used__0123456789abcdef\", \"$3$$a27af10e890b5e0856360a4d993eeb77\", \"electromyographically\" },\n  { \"$3$\", \"$3$$3f820d837c34f4019203f9ae5df458e7\", \"noninterchangeableness\" },\n  { \"$3$__not_used__0123456789abcdef\", \"$3$$3f820d837c34f4019203f9ae5df458e7\", \"noninterchangeableness\" },\n  { \"$3$\", \"$3$$0bd63185f3484bb000286c85917dc12e\", \"abcdefghijklmnopqrstuvwxyz\" },\n  { \"$3$__not_used__0123456789abcdef\", \"$3$$0bd63185f3484bb000286c85917dc12e\", \"abcdefghijklmnopqrstuvwxyz\" },\n  { \"$3$\", \"$3$$ed5d6deb9f1510c55d8c825c05985a42\", \"electroencephalographically\" },\n  { \"$3$__not_used__0123456789abcdef\", \"$3$$ed5d6deb9f1510c55d8c825c05985a42\", \"electroencephalographically\" },\n  { \"$3$\", \"$3$$bf4dd2e2566dfb4fafae5f7b0ef32470\", \"antidisestablishmentarianism\" },\n  { \"$3$__not_used__0123456789abcdef\", \"$3$$bf4dd2e2566dfb4fafae5f7b0ef32470\", \"antidisestablishmentarianism\" },\n  { \"$3$\", \"$3$$260a9c487c4815769245a28c242ed260\", \"cyclotrimethylenetrinitramine\" },\n  { \"$3$__not_used__0123456789abcdef\", \"$3$$260a9c487c4815769245a28c242ed260\", \"cyclotrimethylenetrinitramine\" },\n  { \"$3$\", \"$3$$6674a3a9bb08c4e58b2cda57c66ea608\", \"dichlorodiphenyltrichloroethane\" },\n  { \"$3$__not_used__0123456789abcdef\", \"$3$$6674a3a9bb08c4e58b2cda57c66ea608\", \"dichlorodiphenyltrichloroethane\" },\n  { \"$3$\", \"$3$$51439a927ed19fe271002bb43f355758\", \"multiple words seperated by spaces\" },\n  { \"$3$__not_used__0123456789abcdef\", \"$3$$51439a927ed19fe271002bb43f355758\", \"multiple words seperated by spaces\" },\n  { \"$3$\", \"$3$$f5295d5b0a47abecb70ed08bdb6d4e6e\", \"supercalifragilisticexpialidocious\" },\n  { \"$3$__not_used__0123456789abcdef\", \"$3$$f5295d5b0a47abecb70ed08bdb6d4e6e\", \"supercalifragilisticexpialidocious\" },\n  { \"$3$\", \"$3$$626450a571c8959e9bfa9f48e935dd34\", \"we have a short salt string but not a short password\" },\n  { \"$3$__not_used__0123456789abcdef\", \"$3$$626450a571c8959e9bfa9f48e935dd34\", \"we have a short salt string but not a short password\" },\n  { \"$3$\", \"$3$$48370cb663dfc4a0a54555764653c7f3\", \"multiple word$ $eperated by $pace$ and $pecial character$\" },\n  { \"$3$__not_used__0123456789abcdef\", \"$3$$48370cb663dfc4a0a54555764653c7f3\", \"multiple word$ $eperated by $pace$ and $pecial character$\" },\n  { \"$3$\", \"$3$$2e74cc46c96ee4caee5df20d0898fef8\", \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\" },\n  { \"$3$__not_used__0123456789abcdef\", \"$3$$2e74cc46c96ee4caee5df20d0898fef8\", \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\" },\n  { \"$3$\", \"$3$$cf17b1ae2606afa964193690df7543b1\", \"12345678901234567890123456789012345678901234567890123456789012345678901234567890\" },\n  { \"$3$__not_used__0123456789abcdef\", \"$3$$cf17b1ae2606afa964193690df7543b1\", \"12345678901234567890123456789012345678901234567890123456789012345678901234567890\" },\n  { \"$3$\", \"$3$$556736618d1bc1343ad8ccc7d43e6d03\", \"a very much longer text to encrypt.  This one even stretches over morethan one line.\" },\n  { \"$3$__not_used__0123456789abcdef\", \"$3$$556736618d1bc1343ad8ccc7d43e6d03\", \"a very much longer text to encrypt.  This one even stretches over morethan one line.\" },\n  { \"$3$\", \"$3$$7d17e6e477db7a72b5b88d7cc9c5c6e7\", \"\\xd0\\xc1\\xd2\\xcf\\xcc\\xd8\" },\n  { \"$3$__not_used__0123456789abcdef\", \"$3$$7d17e6e477db7a72b5b88d7cc9c5c6e7\", \"\\xd0\\xc1\\xd2\\xcf\\xcc\\xd8\" },\n  { \"$3$\", \"$3$$39810dfba0f9bbfb2e115d56a5324d18\", \"\\xd5\\xaa\\xd5\\xaa\\xaa\\xaa\\xd5\\xaa\" },\n  { \"$3$__not_used__0123456789abcdef\", \"$3$$39810dfba0f9bbfb2e115d56a5324d18\", \"\\xd5\\xaa\\xd5\\xaa\\xaa\\xaa\\xd5\\xaa\" },\n  { \"$3$\", \"$3$$6107f1da1190680d85c060b621c50702\", \"\\xe1\\xec\\xe5\\xf8\\xe1\\xee\\xe4\\xe5\\xf2\" },\n  { \"$3$__not_used__0123456789abcdef\", \"$3$$6107f1da1190680d85c060b621c50702\", \"\\xe1\\xec\\xe5\\xf8\\xe1\\xee\\xe4\\xe5\\xf2\" },\n  { \"$3$\", \"$3$$fc52480ca4ecd0d0c2a40fdd69a34992\", \"\\xf3\\xf4\\xe5\\xf0\\xe8\\xe1\\xee\\xe9\\xe5\" },\n  { \"$3$__not_used__0123456789abcdef\", \"$3$$fc52480ca4ecd0d0c2a40fdd69a34992\", \"\\xf3\\xf4\\xe5\\xf0\\xe8\\xe1\\xee\\xe9\\xe5\" },\n  { \"$3$\", \"$3$$e11d090c0e5619e1468d25ed58978748\", \"\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\" },\n  { \"$3$__not_used__0123456789abcdef\", \"$3$$e11d090c0e5619e1468d25ed58978748\", \"\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\" },\n  { \"$3$\", \"$3$$14afdf1514c72786089966de5e09b928\", \"\\xc3\\xa9tude\" },\n  { \"$3$__not_used__0123456789abcdef\", \"$3$$14afdf1514c72786089966de5e09b928\", \"\\xc3\\xa9tude\" },\n  { \"$3$\", \"$3$$6f2b35b4fe89a75763f5c1e2b560f022\", \"C)tude\" },\n  { \"$3$__not_used__0123456789abcdef\", \"$3$$6f2b35b4fe89a75763f5c1e2b560f022\", \"C)tude\" },\n  { \"$3$\", \"$3$$398278be7fac0d1eedc81352055df0f4\", \"Chl\\xc3\\xb6\"\"e\" },\n  { \"$3$__not_used__0123456789abcdef\", \"$3$$398278be7fac0d1eedc81352055df0f4\", \"Chl\\xc3\\xb6\"\"e\" },\n  { \"$3$\", \"$3$$a36be97082fb9837c0cfbca4431b3121\", \"ChlC6e\" },\n  { \"$3$__not_used__0123456789abcdef\", \"$3$$a36be97082fb9837c0cfbca4431b3121\", \"ChlC6e\" },\n  { \"$3$\", \"$3$$7a42a07c229f3cc38d80acd4dc6ffdf9\", \"\\xc3\\x85ngstr\\xc3\\xb6m\" },\n  { \"$3$__not_used__0123456789abcdef\", \"$3$$7a42a07c229f3cc38d80acd4dc6ffdf9\", \"\\xc3\\x85ngstr\\xc3\\xb6m\" },\n  { \"$3$\", \"$3$$7c240517e69272d8e162da986b275aee\", \"C\\x05ngstrC6m\" },\n  { \"$3$__not_used__0123456789abcdef\", \"$3$$7c240517e69272d8e162da986b275aee\", \"C\\x05ngstrC6m\" },\n  { \"$3$\", \"$3$$18ce4e221995066db5eb9cc70bfe7a69\", \"C\\x05ngstrCU*U***U*\" },\n  { \"$3$__not_used__0123456789abcdef\", \"$3$$18ce4e221995066db5eb9cc70bfe7a69\", \"C\\x05ngstrCU*U***U*\" },\n  { \"$3$\", \"$3$$1eee46ce75794382efd97b8f45d0f011\", \"U*U***U*ignored\" },\n  { \"$3$__not_used__0123456789abcdef\", \"$3$$1eee46ce75794382efd97b8f45d0f011\", \"U*U***U*ignored\" },\n  { \"$3$\", \"$3$$cc2c846fbf2013694591d0ec141c4928\", \"U*U*U*U*\" },\n  { \"$3$__not_used__0123456789abcdef\", \"$3$$cc2c846fbf2013694591d0ec141c4928\", \"U*U*U*U*\" },\n  { \"$3$\", \"$3$$040763d90c35a7f6bdda15e25050d505\", \"U*U*U*U*ignored\" },\n  { \"$3$__not_used__0123456789abcdef\", \"$3$$040763d90c35a7f6bdda15e25050d505\", \"U*U*U*U*ignored\" },\n  { \"$3$\", \"$3$$3131bc805d3a46021b9f392cf32865a3\", \"*U*U*U*U\" },\n  { \"$3$__not_used__0123456789abcdef\", \"$3$$3131bc805d3a46021b9f392cf32865a3\", \"*U*U*U*U\" },\n  { \"$3$\", \"$3$$0e5c31b469e9563440fb046190337219\", \"*U*U*U*U*\" },\n  { \"$3$__not_used__0123456789abcdef\", \"$3$$0e5c31b469e9563440fb046190337219\", \"*U*U*U*U*\" },\n  { \"$3$\", \"$3$$f1940520dd599a5456144f76bd58cdca\", \"*U*U*U*U*U*U*U*U\" },\n  { \"$3$__not_used__0123456789abcdef\", \"$3$$f1940520dd599a5456144f76bd58cdca\", \"*U*U*U*U*U*U*U*U\" },\n  { \"$3$\", \"$3$$d110a48f7371b735dd04806f12c57798\", \"*U*U*U*U*U*U*U*U*\" },\n  { \"$3$__not_used__0123456789abcdef\", \"$3$$d110a48f7371b735dd04806f12c57798\", \"*U*U*U*U*U*U*U*U*\" },\n  { \"$3$\", \"$3$$e1ae1bf327fbcc23730f7db73a56ac44\", \"\\xa3\" },\n  { \"$3$__not_used__0123456789abcdef\", \"$3$$e1ae1bf327fbcc23730f7db73a56ac44\", \"\\xa3\" },\n  { \"$3$\", \"$3$$c709b0e6d1791452cbff9bc7344ac892\", \"\\xa3\"\"a\" },\n  { \"$3$__not_used__0123456789abcdef\", \"$3$$c709b0e6d1791452cbff9bc7344ac892\", \"\\xa3\"\"a\" },\n  { \"$3$\", \"$3$$4ee17ce1db45df7e2b63eaf5f70cda9d\", \"\\xd1\\x91\" },\n  { \"$3$__not_used__0123456789abcdef\", \"$3$$4ee17ce1db45df7e2b63eaf5f70cda9d\", \"\\xd1\\x91\" },\n  { \"$3$\", \"$3$$14cac4c35c77a1ed966b51fa42e2a9bc\", \"\\xa3\"\"ab\" },\n  { \"$3$__not_used__0123456789abcdef\", \"$3$$14cac4c35c77a1ed966b51fa42e2a9bc\", \"\\xa3\"\"ab\" },\n  { \"$3$\", \"$3$$3dd5944e24802eaf5c79a1612159756d\", \"\\xff\\xff\\xa3\" },\n  { \"$3$__not_used__0123456789abcdef\", \"$3$$3dd5944e24802eaf5c79a1612159756d\", \"\\xff\\xff\\xa3\" },\n  { \"$3$\", \"$3$$11ea99f039752eb3a546eeca3cf9f9a8\", \"1\\xa3\"\"345\" },\n  { \"$3$__not_used__0123456789abcdef\", \"$3$$11ea99f039752eb3a546eeca3cf9f9a8\", \"1\\xa3\"\"345\" },\n  { \"$3$\", \"$3$$27cc3d4e8b7ed255af0c71e510712391\", \"\\xff\\xa3\"\"345\" },\n  { \"$3$__not_used__0123456789abcdef\", \"$3$$27cc3d4e8b7ed255af0c71e510712391\", \"\\xff\\xa3\"\"345\" },\n  { \"$3$\", \"$3$$5b06d09bfab79cb270c95cd551997554\", \"\\xff\\xa3\"\"34\\xff\\xff\\xff\\xa3\"\"345\" },\n  { \"$3$__not_used__0123456789abcdef\", \"$3$$5b06d09bfab79cb270c95cd551997554\", \"\\xff\\xa3\"\"34\\xff\\xff\\xff\\xa3\"\"345\" },\n  { \"$3$\", \"$3$$207aa340ce45277a3fe0a449dd866e5a\", \"U\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xff\" },\n  { \"$3$__not_used__0123456789abcdef\", \"$3$$207aa340ce45277a3fe0a449dd866e5a\", \"U\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xff\" },\n  { \"$3$\", \"$3$$dbc6f00b397fb4e7495069aa36fd6db6\", \"\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\" },\n  { \"$3$__not_used__0123456789abcdef\", \"$3$$dbc6f00b397fb4e7495069aa36fd6db6\", \"\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\" },\n  { \"$3$\", \"$3$$f2352a9d32bd205080543902d7f0ebb0\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\" },\n  { \"$3$__not_used__0123456789abcdef\", \"$3$$f2352a9d32bd205080543902d7f0ebb0\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\" },\n  { \"$3$\", \"$3$$5a244c197ea731df985e08cfe273ddd8\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789chars after 72 are ignored\" },\n  { \"$3$__not_used__0123456789abcdef\", \"$3$$5a244c197ea731df985e08cfe273ddd8\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789chars after 72 are ignored\" },\n  { \"$3$\", \"$3$$51ba57575232c303f407d91bf1949cca\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\" },\n  { \"$3$__not_used__0123456789abcdef\", \"$3$$51ba57575232c303f407d91bf1949cca\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\" },\n  { \"$3$\", \"$3$$9d299c47c4a4759f9e6608d6cde88c3d\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\"\"chars after 72 are ignored as usual\" },\n  { \"$3$__not_used__0123456789abcdef\", \"$3$$9d299c47c4a4759f9e6608d6cde88c3d\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\"\"chars after 72 are ignored as usual\" },\n  { \"$3$\", \"$3$$eb300ad67bac4085d47c166a75efc7bf\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has forgotten.\" },\n  { \"$3$__not_used__0123456789abcdef\", \"$3$$eb300ad67bac4085d47c166a75efc7bf\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has forgotten.\" },\n  { \"$3$\", \"$3$$e1aeb5cac1f5fc905085787a81ff3a1f\", \"THE YEAR\" },\n  { \"$3$__not_used__0123456789abcdef\", \"$3$$e1aeb5cac1f5fc905085787a81ff3a1f\", \"THE YEAR\" },\n  { \"$3$\", \"$3$$c2b3fff2d75601bd8759e782256d0491\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and do\" },\n  { \"$3$__not_used__0123456789abcdef\", \"$3$$c2b3fff2d75601bd8759e782256d0491\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and do\" },\n  { \"$3$\", \"$3$$10c8c9d7aca870531d3647209f4f9bbf\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has f\" },\n  { \"$3$__not_used__0123456789abcdef\", \"$3$$10c8c9d7aca870531d3647209f4f9bbf\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has f\" },\n#endif // nt\n\n#if INCLUDE_scrypt && defined TEST_scrypt\n  { \"$7$66..../....SodiumChloride\", \"$7$66..../....SodiumChloride$SpJsFY2pIFcsdECgiLhE7VnInSJAT3kTfdlS6S6xFq9\", \"\" },\n  { \"$7$66..../....unUNunUNunUNun\", \"$7$66..../....unUNunUNunUNun$5eHIcyF4C5bDzpiuGzYQQc1sIe60.UsmfjoNrxt5adA\", \"\" },\n  { \"$7$76..../....SodiumChloride\", \"$7$76..../....SodiumChloride$YNmeZ8Ubrj9X2G.Id80j6RGT1rp6Pi2ZfUpzCG21dZ6\", \"\" },\n  { \"$7$76..../....unUNunUNunUNun\", \"$7$76..../....unUNunUNunUNun$MHVhxrNwp6l3KndOGprjC2Go6U2ZoyHUGXYBX7mnlM8\", \"\" },\n  { \"$7$66..../....SodiumChloride\", \"$7$66..../....SodiumChloride$XVKS1M06owVrhDhmhl2upMTpKBrSpJTIRPXIER0dYGC\", \" \" },\n  { \"$7$66..../....unUNunUNunUNun\", \"$7$66..../....unUNunUNunUNun$.lqTTv.oXq816RKZeJeqMXVnnGR9jcb3W2kWm23ubu0\", \" \" },\n  { \"$7$76..../....SodiumChloride\", \"$7$76..../....SodiumChloride$QGYQu4qLFgl0ToyUv5btcXxk7xMU5BovtmsLHYYT4j9\", \" \" },\n  { \"$7$76..../....unUNunUNunUNun\", \"$7$76..../....unUNunUNunUNun$bglUTSbAvHFOd5FwRuFMIFeWmFeuJeDMJxPbhNLxoT1\", \" \" },\n  { \"$7$66..../....SodiumChloride\", \"$7$66..../....SodiumChloride$3O/5oVC8v927Yhzj2bu8S8CyYleLle9tDi1rFTQhC57\", \"a\" },\n  { \"$7$66..../....unUNunUNunUNun\", \"$7$66..../....unUNunUNunUNun$PFYi7kkAbbFJJo4LO7XenXepvOo0cAH0lqQyEusOru1\", \"a\" },\n  { \"$7$76..../....SodiumChloride\", \"$7$76..../....SodiumChloride$A3TZmeiryDHQ2WPMhp4DJMj40uf7Gow9iHzQxhe7ikC\", \"a\" },\n  { \"$7$76..../....unUNunUNunUNun\", \"$7$76..../....unUNunUNunUNun$XviMC77gAZJx0sr/dxV4Pr.OY5csaR.27w/bjvi4KVB\", \"a\" },\n  { \"$7$66..../....SodiumChloride\", \"$7$66..../....SodiumChloride$nsG5DCq79pNVsIV9tJfaaDYfF5TKV213491RLvWYdFC\", \"ab\" },\n  { \"$7$66..../....unUNunUNunUNun\", \"$7$66..../....unUNunUNunUNun$UIhkXrHHqBfavxeyz1WXixjNuEUcfycTC6qaTB4LuE4\", \"ab\" },\n  { \"$7$76..../....SodiumChloride\", \"$7$76..../....SodiumChloride$WHUeP2Kz.d0azHgvtaz7fEuUff38B.ijOQrubDYvjz/\", \"ab\" },\n  { \"$7$76..../....unUNunUNunUNun\", \"$7$76..../....unUNunUNunUNun$lI2ks79t8lOMoWSim7ImZ4grk4ByCn2LKTudAGnAxLB\", \"ab\" },\n  { \"$7$66..../....SodiumChloride\", \"$7$66..../....SodiumChloride$WpfVhZgVj63.RiL2fAQZsLyYNROrrN67Wlo8QJ5bI/A\", \"abc\" },\n  { \"$7$66..../....unUNunUNunUNun\", \"$7$66..../....unUNunUNunUNun$jXEtOySg6CHRImbAKo9ZS94G90MwIv/l3KJd2IQUYE1\", \"abc\" },\n  { \"$7$76..../....SodiumChloride\", \"$7$76..../....SodiumChloride$HAy4uW28T5fT1BwdCh3Hi9S3QGAS9DVqOf0fOay9p2/\", \"abc\" },\n  { \"$7$76..../....unUNunUNunUNun\", \"$7$76..../....unUNunUNunUNun$qqhmchrAEOkJB2ovbd/1lTjre9m4bHXpVc/.2cWPUA8\", \"abc\" },\n  { \"$7$66..../....SodiumChloride\", \"$7$66..../....SodiumChloride$eHW53P3AOnosAY12RWow37kj/pZSTnjAQiJ8d/eEQrB\", \"U*U\" },\n  { \"$7$66..../....unUNunUNunUNun\", \"$7$66..../....unUNunUNunUNun$7GLPoDH0it14nReTexn.dU83I70ZcCO5x4In1pcadu5\", \"U*U\" },\n  { \"$7$76..../....SodiumChloride\", \"$7$76..../....SodiumChloride$GM424MuY.1sSOBEV8It0PvXfP8iUFL3y/rn.TqnUJv/\", \"U*U\" },\n  { \"$7$76..../....unUNunUNunUNun\", \"$7$76..../....unUNunUNunUNun$h7jZQEJddV6UDPACDlwBZS.qLZQEXl2dA/T7W8EUci2\", \"U*U\" },\n  { \"$7$66..../....SodiumChloride\", \"$7$66..../....SodiumChloride$nEzR6msJS9q1w.szC9sxbJQR06Y0nnKJa33APSFp0U7\", \"U*U*\" },\n  { \"$7$66..../....unUNunUNunUNun\", \"$7$66..../....unUNunUNunUNun$BozgJ5Iz9pRrJsAs8ieFnhoq34dBKGJY0jD0tzw/SfB\", \"U*U*\" },\n  { \"$7$76..../....SodiumChloride\", \"$7$76..../....SodiumChloride$F5/bgQXMe44nby2xG2ToqGbBF4YynN8Uz7Mc6bEEvo8\", \"U*U*\" },\n  { \"$7$76..../....unUNunUNunUNun\", \"$7$76..../....unUNunUNunUNun$EB3IrD7WvuZhkB.Y6rNuCL03xtVAIDrs/xx/Knl0J0B\", \"U*U*\" },\n  { \"$7$66..../....SodiumChloride\", \"$7$66..../....SodiumChloride$G92gG28oqBL96NWkds6Vm9TxKNr9ea/b9VqbfhWfTO7\", \"U*U*U\" },\n  { \"$7$66..../....unUNunUNunUNun\", \"$7$66..../....unUNunUNunUNun$qTP.SfAIXuSmRutQizKlYTEFXXgEoULHRKIMTuF5Ov8\", \"U*U*U\" },\n  { \"$7$76..../....SodiumChloride\", \"$7$76..../....SodiumChloride$xIk7sBb5/sVvsF1Hkae5Su.mMk8VUdvhZsxd2HcnUf9\", \"U*U*U\" },\n  { \"$7$76..../....unUNunUNunUNun\", \"$7$76..../....unUNunUNunUNun$vwTzRJlP8KJJNqzM2/9roop6k3Fg1wbS5H1l/vhJll.\", \"U*U*U\" },\n  { \"$7$66..../....SodiumChloride\", \"$7$66..../....SodiumChloride$AIPjRNZ06KQkx1//R/.QVpMz0EztB15JDka0eAaqWgD\", \".....\" },\n  { \"$7$66..../....unUNunUNunUNun\", \"$7$66..../....unUNunUNunUNun$eOM0ZZztCqkd2qDLTIRl1iIc/mel7i6hrTT4zVmhI//\", \".....\" },\n  { \"$7$76..../....SodiumChloride\", \"$7$76..../....SodiumChloride$axAeSprvMSJYMhochVAm7HeLaGfKxslF1CaSVhZzhr9\", \".....\" },\n  { \"$7$76..../....unUNunUNunUNun\", \"$7$76..../....unUNunUNunUNun$zPut5OL3XF/cwZwTwxXUIgLZse.4Z2F9ogYMBfvyeM.\", \".....\" },\n  { \"$7$66..../....SodiumChloride\", \"$7$66..../....SodiumChloride$IRqON6M.CZInCa/Y/Zpx/d8q39oKlIqQK642upv8ZHA\", \"dragon\" },\n  { \"$7$66..../....unUNunUNunUNun\", \"$7$66..../....unUNunUNunUNun$TmXG5z0LQfe5kdF/qETXc55bYcXZSjfxYiGltg31Nd8\", \"dragon\" },\n  { \"$7$76..../....SodiumChloride\", \"$7$76..../....SodiumChloride$vQPLamucdOIp12SaBOsZXbo5SIZqu4VGHeE1YV5N9s4\", \"dragon\" },\n  { \"$7$76..../....unUNunUNunUNun\", \"$7$76..../....unUNunUNunUNun$MU/BOJSzTs4BeSQvVviHPuZJnENnzLaJRtwkr6hUsN/\", \"dragon\" },\n  { \"$7$66..../....SodiumChloride\", \"$7$66..../....SodiumChloride$aBfmQa50n5hqmnNg0cUZcmsOYoLu559RPbGeoF.Jg10\", \"dRaGoN\" },\n  { \"$7$66..../....unUNunUNunUNun\", \"$7$66..../....unUNunUNunUNun$CQQ6hp5p20aPby.LkRq9jDuo2dniE4nb/uJaKnYYlV3\", \"dRaGoN\" },\n  { \"$7$76..../....SodiumChloride\", \"$7$76..../....SodiumChloride$8ZT7Is53G8Vw3afeCrPVhgyamUCnKgNmkAAk2LPhU49\", \"dRaGoN\" },\n  { \"$7$76..../....unUNunUNunUNun\", \"$7$76..../....unUNunUNunUNun$pQv1H90A4X3uncsPRAmk82kxFCPBNJi0iqHVGIOWYO2\", \"dRaGoN\" },\n  { \"$7$66..../....SodiumChloride\", \"$7$66..../....SodiumChloride$YDB1Tr765PRQpPVpNGtCjNY7kqMufAK77BFZ/ijS.M7\", \"DrAgOn\" },\n  { \"$7$66..../....unUNunUNunUNun\", \"$7$66..../....unUNunUNunUNun$We0A.oZyALXJI9Ini5aHQnlc5J013amcrV0k9Ps7tZB\", \"DrAgOn\" },\n  { \"$7$76..../....SodiumChloride\", \"$7$76..../....SodiumChloride$cUXY28GQtryPo4gJ5LciNFvJZyfTj8EIHC2mZKjGM9D\", \"DrAgOn\" },\n  { \"$7$76..../....unUNunUNunUNun\", \"$7$76..../....unUNunUNunUNun$uz8WUtmJ8JC5S/KIiXQ2S70j/xNKBQuyrDt8bcUZHa4\", \"DrAgOn\" },\n  { \"$7$66..../....SodiumChloride\", \"$7$66..../....SodiumChloride$jZCq1DdvUYOs9G7Q0foP9fO3N18QXnX2M5QcYs1mVF2\", \"PAROLX\" },\n  { \"$7$66..../....unUNunUNunUNun\", \"$7$66..../....unUNunUNunUNun$y/7imVOFYgfPlLT.ZvtKDiwuARo015oUmgrLjFPKe23\", \"PAROLX\" },\n  { \"$7$76..../....SodiumChloride\", \"$7$76..../....SodiumChloride$FphGDxa5WkvRGlUEqJAMOnlcyy2DzxFXZCGgD1nBsGB\", \"PAROLX\" },\n  { \"$7$76..../....unUNunUNunUNun\", \"$7$76..../....unUNunUNunUNun$9glq30y.Natpjmbrej/5mOYJmck9zl7QzCC0vgiTgZ8\", \"PAROLX\" },\n  { \"$7$66..../....SodiumChloride\", \"$7$66..../....SodiumChloride$mhqjZMevLIGgQdqxcuTA1QNqzB.gi7NYcLdBAdvGQM4\", \"U*U***U\" },\n  { \"$7$66..../....unUNunUNunUNun\", \"$7$66..../....unUNunUNunUNun$4CiBN6FD3hQBo635kLlTInaextOLlrmXICq1ByL3CT6\", \"U*U***U\" },\n  { \"$7$76..../....SodiumChloride\", \"$7$76..../....SodiumChloride$KVPhyat3KccJzoC1JRE7iHKXV3X0yB5BLL5mzB3oE2B\", \"U*U***U\" },\n  { \"$7$76..../....unUNunUNunUNun\", \"$7$76..../....unUNunUNunUNun$OumU4KdQJFjYVryM.yXFwAng/OV6Y/EykfEOb0y2wv4\", \"U*U***U\" },\n  { \"$7$66..../....SodiumChloride\", \"$7$66..../....SodiumChloride$HKJRdmlw7HlNwRLH9FzgY/pFu/BKdRBcCP3YerzM4oB\", \"abcdefg\" },\n  { \"$7$66..../....unUNunUNunUNun\", \"$7$66..../....unUNunUNunUNun$BvtzWq5aneD3A8PLNqnga5rcIye5Tp4D7dniuWL9kA5\", \"abcdefg\" },\n  { \"$7$76..../....SodiumChloride\", \"$7$76..../....SodiumChloride$e8NjLJqvzfFzekXBbZaZlnpJx6FmyuqZlsOQS/7mjt8\", \"abcdefg\" },\n  { \"$7$76..../....unUNunUNunUNun\", \"$7$76..../....unUNunUNunUNun$3nflZbkjxcBkM7pHOhjyCeKkvIVYxZlQPt1XO4ujuz6\", \"abcdefg\" },\n  { \"$7$66..../....SodiumChloride\", \"$7$66..../....SodiumChloride$qHKFqYwK50fIZziG55wN24cs286uyxoEJTuf.heOev6\", \"01234567\" },\n  { \"$7$66..../....unUNunUNunUNun\", \"$7$66..../....unUNunUNunUNun$zgXL0PpmXAb.i9pEJsmc09rwZqDNacNHdZN0/NY2lK9\", \"01234567\" },\n  { \"$7$76..../....SodiumChloride\", \"$7$76..../....SodiumChloride$20vrIp0.jgpaJ4JGQQYqJpguASZ6oYiDgha7K5O64V3\", \"01234567\" },\n  { \"$7$76..../....unUNunUNunUNun\", \"$7$76..../....unUNunUNunUNun$/Jb9DFZEhda1tFv.OIkLxSTFf2NTqZjTW7OAtKYX5z3\", \"01234567\" },\n  { \"$7$66..../....SodiumChloride\", \"$7$66..../....SodiumChloride$13AFum4i9NcNGfVWuIccf8tUm.lQUQusuWPltLHoaLB\", \"726 even\" },\n  { \"$7$66..../....unUNunUNunUNun\", \"$7$66..../....unUNunUNunUNun$q/bfJHp1GXTYTs4/MIvV60/VKsRAa77tcpfz1NrjJn9\", \"726 even\" },\n  { \"$7$76..../....SodiumChloride\", \"$7$76..../....SodiumChloride$xWxBm0VjhEr15xo65XU4VGwgELA2J.jtO79Hl65mQ5A\", \"726 even\" },\n  { \"$7$76..../....unUNunUNunUNun\", \"$7$76..../....unUNunUNunUNun$ZMiqzxEH50JkXRf/fw2DeIsPnkkPC50cDSfSSsewrL.\", \"726 even\" },\n  { \"$7$66..../....SodiumChloride\", \"$7$66..../....SodiumChloride$PmOlv3tOlc3JE2UP0CpTk1QUjiJAN3hvPSvcOmvaM64\", \"zyxwvuts\" },\n  { \"$7$66..../....unUNunUNunUNun\", \"$7$66..../....unUNunUNunUNun$vONMZNYuNFJGw3u7N18S3U9Ms7lP6YtQHkuzPAerbw3\", \"zyxwvuts\" },\n  { \"$7$76..../....SodiumChloride\", \"$7$76..../....SodiumChloride$MOtbLb2ErLv5CM1.zp1v9G7WVXc20WKkN2j.Ai4ARX8\", \"zyxwvuts\" },\n  { \"$7$76..../....unUNunUNunUNun\", \"$7$76..../....unUNunUNunUNun$mRppiF5oVCPdn59FbkPfEky4aIyV0GYQ7XOmpmeUpoA\", \"zyxwvuts\" },\n  { \"$7$66..../....SodiumChloride\", \"$7$66..../....SodiumChloride$Dd2S4vWFOJ1ALCT2oMbI1qnlJqSYXP6UgS.vRG6AIg8\", \"ab1234567\" },\n  { \"$7$66..../....unUNunUNunUNun\", \"$7$66..../....unUNunUNunUNun$OO1cvKmiKSEkVBiu1fJOPYk5c2gCr10sjcgzj8xhqDC\", \"ab1234567\" },\n  { \"$7$76..../....SodiumChloride\", \"$7$76..../....SodiumChloride$vkqZtzwTK3SRp4In4Pa3NhC5KjHC3RM1d/0vVbH4hH2\", \"ab1234567\" },\n  { \"$7$76..../....unUNunUNunUNun\", \"$7$76..../....unUNunUNunUNun$pojoC/jFk55RpshsRlWi0kkJhBuWCzLpf3ulKU14TGA\", \"ab1234567\" },\n  { \"$7$66..../....SodiumChloride\", \"$7$66..../....SodiumChloride$mJNMEE9LaxlIknmcisrS84fH09mME84ZeRgHOfx7AB6\", \"alexander\" },\n  { \"$7$66..../....unUNunUNunUNun\", \"$7$66..../....unUNunUNunUNun$zLMutqlywtCWYlg/sSbB13kw8fo1Y9jmAK88lXteMu0\", \"alexander\" },\n  { \"$7$76..../....SodiumChloride\", \"$7$76..../....SodiumChloride$1QLiTYefj978U.BzORPg086aZ3mooSRqb.9PHXF38R.\", \"alexander\" },\n  { \"$7$76..../....unUNunUNunUNun\", \"$7$76..../....unUNunUNunUNun$g9a04uZyjWL4XvZUJNxRlc8jZyKvaL3KjVXfF5WIqU1\", \"alexander\" },\n  { \"$7$66..../....SodiumChloride\", \"$7$66..../....SodiumChloride$3lzuyQm3mRtKEPqcpZTMpwZyYbY3c3Dejhan5GodvPA\", \"beautiful\" },\n  { \"$7$66..../....unUNunUNunUNun\", \"$7$66..../....unUNunUNunUNun$0zhaZgjwyh4wo.s./KhTWUDGMERXfLKE0r6rCT0.rd3\", \"beautiful\" },\n  { \"$7$76..../....SodiumChloride\", \"$7$76..../....SodiumChloride$kFhAWU1XtiaxuYoepaGTQJbuRy0Bj7zArprlZOP1LE.\", \"beautiful\" },\n  { \"$7$76..../....unUNunUNunUNun\", \"$7$76..../....unUNunUNunUNun$YSlmTrkj5g46GMrj2kUVvlhtTkkSbROjlUN6o5o5AK.\", \"beautiful\" },\n  { \"$7$66..../....SodiumChloride\", \"$7$66..../....SodiumChloride$KD9RUk3QMt41WfPigOQtLf6GZ8fuzMugHwvIVmqOKD6\", \"challenge\" },\n  { \"$7$66..../....unUNunUNunUNun\", \"$7$66..../....unUNunUNunUNun$wjC/v8aboVqjwHEFJulHUyR9hkImgGF5NrqlFZ.gVq/\", \"challenge\" },\n  { \"$7$76..../....SodiumChloride\", \"$7$76..../....SodiumChloride$pabePgNXmr3YrdrVJmZQtwbMeXQtJATVrCu4Ol/xUu5\", \"challenge\" },\n  { \"$7$76..../....unUNunUNunUNun\", \"$7$76..../....unUNunUNunUNun$Usl.rWM8DLh0IEJXNOMBaYj.gVj7AREmu7zah2/PDFD\", \"challenge\" },\n  { \"$7$66..../....SodiumChloride\", \"$7$66..../....SodiumChloride$Dw5.FC4qLmYIacDSnM5f4uQ/tpuYOIYfVAmngXwlI13\", \"chocolate\" },\n  { \"$7$66..../....unUNunUNunUNun\", \"$7$66..../....unUNunUNunUNun$fkhDQcQUdLK6E0TZvVTIbViviDoImiza/k4EFxSc7L/\", \"chocolate\" },\n  { \"$7$76..../....SodiumChloride\", \"$7$76..../....SodiumChloride$MhegevG2ur407Nfxp0WvIHeYC8BzmroT0it8m9qQq55\", \"chocolate\" },\n  { \"$7$76..../....unUNunUNunUNun\", \"$7$76..../....unUNunUNunUNun$i14Db3..kJdxVZiBEaoBhS6VKrfrx3FGiSNtb.Hh4RD\", \"chocolate\" },\n  { \"$7$66..../....SodiumChloride\", \"$7$66..../....SodiumChloride$KB.UbNINFVhURIZ7S6c/1OzT67VrFXO9I78oEhX/kq0\", \"cr1234567\" },\n  { \"$7$66..../....unUNunUNunUNun\", \"$7$66..../....unUNunUNunUNun$ucQSvFHUGc5p8PpusL/BueRc7twsa9y0LyZNWKBxR71\", \"cr1234567\" },\n  { \"$7$76..../....SodiumChloride\", \"$7$76..../....SodiumChloride$PzMgRZKQAlpwFaMij9qr7EO8LoLZjnosbf/5SH3ip0B\", \"cr1234567\" },\n  { \"$7$76..../....unUNunUNunUNun\", \"$7$76..../....unUNunUNunUNun$XsDDeYZNV1J.bYkH8JaFMAis368kp1IDacG0wQP3nQ4\", \"cr1234567\" },\n  { \"$7$66..../....SodiumChloride\", \"$7$66..../....SodiumChloride$OAFCY25qhD3G2FUgPaP0vpVlOJmwAcxpOyhTQ4cvZf.\", \"katherine\" },\n  { \"$7$66..../....unUNunUNunUNun\", \"$7$66..../....unUNunUNunUNun$3whsjio4Hg7nnIJqJHcwFrCocU0Wg4p8Nw04lMJGTi7\", \"katherine\" },\n  { \"$7$76..../....SodiumChloride\", \"$7$76..../....SodiumChloride$riJgGCL4gJ3EnsquTPL/Bx9zPOEE20B9RUmclPSgUVA\", \"katherine\" },\n  { \"$7$76..../....unUNunUNunUNun\", \"$7$76..../....unUNunUNunUNun$iXGDrW1DV4ifO.nUmUlqtzMK23R97rq4eCvJ7E.Tpm.\", \"katherine\" },\n  { \"$7$66..../....SodiumChloride\", \"$7$66..../....SodiumChloride$ZhLWjy0PFkIC.e7AuE4bFakUNYumRcu5ugj/KGQ3Y60\", \"stephanie\" },\n  { \"$7$66..../....unUNunUNunUNun\", \"$7$66..../....unUNunUNunUNun$1XS/JDwJxhqrowy0zwk3EEbiBZMIbkAPgWJjs/vYeH2\", \"stephanie\" },\n  { \"$7$76..../....SodiumChloride\", \"$7$76..../....SodiumChloride$DioI2qUrm8k15E4mboazqTOE.sPOGKAvEIgYV/CDk42\", \"stephanie\" },\n  { \"$7$76..../....unUNunUNunUNun\", \"$7$76..../....unUNunUNunUNun$KrKcCZUYvh6GMkZjJ9YHoWDia3yR28CW/370088czQD\", \"stephanie\" },\n  { \"$7$66..../....SodiumChloride\", \"$7$66..../....SodiumChloride$7C7KL2uWEDQCUtzFhANJDkQK6cC3vnyWMiodIU2JsV9\", \"sunflower\" },\n  { \"$7$66..../....unUNunUNunUNun\", \"$7$66..../....unUNunUNunUNun$hsIMmC/tqayFMUN6Y7BtvgDf.AwCEfGKePsityZ9cTC\", \"sunflower\" },\n  { \"$7$76..../....SodiumChloride\", \"$7$76..../....SodiumChloride$X.QvVrcBovlKor7imsKbmywWl3Mygqc9JU5huaKFoZ2\", \"sunflower\" },\n  { \"$7$76..../....unUNunUNunUNun\", \"$7$76..../....unUNunUNunUNun$ESGOVyD20HhkM5ciRQ5ipORH4FqIt6MImqCCxjL4iZ9\", \"sunflower\" },\n  { \"$7$66..../....SodiumChloride\", \"$7$66..../....SodiumChloride$I3EW44BECMn.MdHUieUGRBrKOS5vxFEF7doDhXu2XA4\", \"basketball\" },\n  { \"$7$66..../....unUNunUNunUNun\", \"$7$66..../....unUNunUNunUNun$4ug51qZJiNQgFlj0FxDp2AXU6crqsH2u5USWC2nsDyB\", \"basketball\" },\n  { \"$7$76..../....SodiumChloride\", \"$7$76..../....SodiumChloride$GOFi2fx/KDZ9FZby/aiDXWLlVm5icuPXKmsS2YbeT/8\", \"basketball\" },\n  { \"$7$76..../....unUNunUNunUNun\", \"$7$76..../....unUNunUNunUNun$UlQY5zA31QInXucVDM.LLgCQhaHy/4VLe1qUtLmmaR9\", \"basketball\" },\n  { \"$7$66..../....SodiumChloride\", \"$7$66..../....SodiumChloride$6aGvr82BM0EEKCa9GiTIlAJpczbt/xaWtA2v80kXts2\", \"porsche911\" },\n  { \"$7$66..../....unUNunUNunUNun\", \"$7$66..../....unUNunUNunUNun$rvqgVRgbyRLAN2HL0OqSi5pvn8gxUYCJKmKuqpyIm40\", \"porsche911\" },\n  { \"$7$76..../....SodiumChloride\", \"$7$76..../....SodiumChloride$1Eqf.wtEz1ZG9O8UrBGVg0uJ0tJkr7CQZZiahkFWlL5\", \"porsche911\" },\n  { \"$7$76..../....unUNunUNunUNun\", \"$7$76..../....unUNunUNunUNun$oe7Gnl0NaBXwUWIBlTTZQOr7meiOXOxeVmUmW6XEx/0\", \"porsche911\" },\n  { \"$7$66..../....SodiumChloride\", \"$7$66..../....SodiumChloride$86OMk6tZ3eDfJautFi4fJsrZZ2tm/VZDEpNZW8NS8WD\", \"|_337T`/p3\" },\n  { \"$7$66..../....unUNunUNunUNun\", \"$7$66..../....unUNunUNunUNun$R.kkSOX4ljlpBMgo/hicWZ98jmS7fzd7CDzCA76T/b3\", \"|_337T`/p3\" },\n  { \"$7$76..../....SodiumChloride\", \"$7$76..../....SodiumChloride$3xmjXRfo9XAIx4FwmRJOxMrdVdSe.5AWFx9ZoyopWL2\", \"|_337T`/p3\" },\n  { \"$7$76..../....unUNunUNunUNun\", \"$7$76..../....unUNunUNunUNun$aR3IeXwWgTCTCm0Iq8yF6Bv7GXXsHoEK2zSWA2HzKV.\", \"|_337T`/p3\" },\n  { \"$7$66..../....SodiumChloride\", \"$7$66..../....SodiumChloride$I99TnpFaDm5INcdFSDIElPlgLMBs5Y6D3MaS3JDaUs2\", \"thunderbird\" },\n  { \"$7$66..../....unUNunUNunUNun\", \"$7$66..../....unUNunUNunUNun$bL2l.GhY8JjrkxozCOM8cqfXTK.afoZ9DbGSujtVBJA\", \"thunderbird\" },\n  { \"$7$76..../....SodiumChloride\", \"$7$76..../....SodiumChloride$lSSKwgpP/06k.7cNQ16lJpRqpSkmRBM6HraLv989O09\", \"thunderbird\" },\n  { \"$7$76..../....unUNunUNunUNun\", \"$7$76..../....unUNunUNunUNun$kqhNa1TbrgdAdPYMgYhNMxQWeiaVhGMgkcqpSjPGJa7\", \"thunderbird\" },\n  { \"$7$66..../....SodiumChloride\", \"$7$66..../....SodiumChloride$yws9hx0PxszV5EA/Wj/B9RGulgq1wsB.EeAff9wuv0A\", \"Hello world!\" },\n  { \"$7$66..../....unUNunUNunUNun\", \"$7$66..../....unUNunUNunUNun$s3CcnrhMQ1QUz621AevEZCTXCd57u5RHmmoGiBQvQ39\", \"Hello world!\" },\n  { \"$7$76..../....SodiumChloride\", \"$7$76..../....SodiumChloride$RSX2DurfOMuYmtJ.GuheprbkovFO2MwstVgLF0JMBq2\", \"Hello world!\" },\n  { \"$7$76..../....unUNunUNunUNun\", \"$7$76..../....unUNunUNunUNun$tNWPwi8ycih56sTZlTY8aDlZ1W.5CnlkNiwoCU8GUh/\", \"Hello world!\" },\n  { \"$7$66..../....SodiumChloride\", \"$7$66..../....SodiumChloride$Gu.XUfhI8F1OmjjnsS/8R.xTl9c.dNxBKG27fItU6f3\", \"pleaseletmein\" },\n  { \"$7$66..../....unUNunUNunUNun\", \"$7$66..../....unUNunUNunUNun$UgFCxJxBNa54dsmJWQ.zxD/esYpRE.0nOa43N/g8mL/\", \"pleaseletmein\" },\n  { \"$7$76..../....SodiumChloride\", \"$7$76..../....SodiumChloride$pZCS9SDuSgM9UaPMmvQnA9pMjrsYMkxpu4Z/iEGhHC7\", \"pleaseletmein\" },\n  { \"$7$76..../....unUNunUNunUNun\", \"$7$76..../....unUNunUNunUNun$eg1OUQ7Qlv1dI5u14n1d.jleeeA9Swr.XdGGj.YZLp4\", \"pleaseletmein\" },\n  { \"$7$66..../....SodiumChloride\", \"$7$66..../....SodiumChloride$KYam1TJTr5uOM24iKU5sOzL/DD7o/piMz85CR1p3PI0\", \"a short string\" },\n  { \"$7$66..../....unUNunUNunUNun\", \"$7$66..../....unUNunUNunUNun$7/3m1ziUFO5uPFj0X/a33YE7oBQpilKVq8yi2M8vgz.\", \"a short string\" },\n  { \"$7$76..../....SodiumChloride\", \"$7$76..../....SodiumChloride$vjsgudSKKQboBAZykH5Fjr95a5aKW8jkNTbB2hWA2pC\", \"a short string\" },\n  { \"$7$76..../....unUNunUNunUNun\", \"$7$76..../....unUNunUNunUNun$9WA4Ltb38MFY/01Bcc1kEfB3uZY/UnMob9067971np8\", \"a short string\" },\n  { \"$7$66..../....SodiumChloride\", \"$7$66..../....SodiumChloride$/r6s4npJwl/qj1n33VekNzG6J.Od0JiSi.NiU4OsCp0\", \"zxyDPWgydbQjgq\" },\n  { \"$7$66..../....unUNunUNunUNun\", \"$7$66..../....unUNunUNunUNun$kxWRv8sQN2djJCtZ6UzPXmBKkpd4wnyWAR9bk8UnaH8\", \"zxyDPWgydbQjgq\" },\n  { \"$7$76..../....SodiumChloride\", \"$7$76..../....SodiumChloride$Ky/M2li/VKiTbggPaWDfR3h1i2t8I/YfWeeiydwvUR2\", \"zxyDPWgydbQjgq\" },\n  { \"$7$76..../....unUNunUNunUNun\", \"$7$76..../....unUNunUNunUNun$qgs5y/mf.AgBL2VxKHVSw56.SJlOM6KWsVfA4TgrJt3\", \"zxyDPWgydbQjgq\" },\n  { \"$7$66..../....SodiumChloride\", \"$7$66..../....SodiumChloride$uhLWHz5tD.ds7S/.ZnzcnyWpIBWni/TUGDySldPKc07\", \"photojournalism\" },\n  { \"$7$66..../....unUNunUNunUNun\", \"$7$66..../....unUNunUNunUNun$dUQyEbezujy0uRffnMI38JjTiJYLk6gDhyBuHFewXu3\", \"photojournalism\" },\n  { \"$7$76..../....SodiumChloride\", \"$7$76..../....SodiumChloride$GxotTvvfVNhXxhmRI9GxbPFtO9buyN1AA7uctLib7m.\", \"photojournalism\" },\n  { \"$7$76..../....unUNunUNunUNun\", \"$7$76..../....unUNunUNunUNun$0B1Jtwfr9Fqs46qAxv3xkeRZs2ohIjRKGghD494tcy6\", \"photojournalism\" },\n  { \"$7$66..../....SodiumChloride\", \"$7$66..../....SodiumChloride$A9H4UqOCZJTGJDfX18h4iyBLujzQtFnicm9sPp/nT50\", \"ecclesiastically\" },\n  { \"$7$66..../....unUNunUNunUNun\", \"$7$66..../....unUNunUNunUNun$.Qj/GOg4WWuz6cU2awV/s/q7ELkgK1L4TI.hdVXvrN.\", \"ecclesiastically\" },\n  { \"$7$76..../....SodiumChloride\", \"$7$76..../....SodiumChloride$Fm6eiIV00qR4yDpGxI.uv.xvEtHD93X31P4OwSk1RNA\", \"ecclesiastically\" },\n  { \"$7$76..../....unUNunUNunUNun\", \"$7$76..../....unUNunUNunUNun$VDYsX9FgMddZ53w1Blup3JeT8ZfSNQpa.S3IK7aBTu7\", \"ecclesiastically\" },\n  { \"$7$66..../....SodiumChloride\", \"$7$66..../....SodiumChloride$g2.FfaB2jZVVQyDsV2Ogxqv8PrVbH1uzS8vm1UtT8p8\", \"congregationalism\" },\n  { \"$7$66..../....unUNunUNunUNun\", \"$7$66..../....unUNunUNunUNun$qz9dvvi/YgHhHoFQJk7pHoH0Hp5scS1xLM5HEXG3JF1\", \"congregationalism\" },\n  { \"$7$76..../....SodiumChloride\", \"$7$76..../....SodiumChloride$XzSSUDYEDtpN4Q4tlSz70A1HHlTiZAipOKOKcuHrsS/\", \"congregationalism\" },\n  { \"$7$76..../....unUNunUNunUNun\", \"$7$76..../....unUNunUNunUNun$tF8qu42hlpHzxQ04245mbvEVYKnuCxE/52T/j4CsZLC\", \"congregationalism\" },\n  { \"$7$66..../....SodiumChloride\", \"$7$66..../....SodiumChloride$zvknIv/4C0Un.fSHgWL7llQ2w52A3i/inAPVDPubmr1\", \"dihydrosphingosine\" },\n  { \"$7$66..../....unUNunUNunUNun\", \"$7$66..../....unUNunUNunUNun$uBYMbuA5Blob66kdTGj.Ha8gtLYdpRLBkCvn6tRc7F4\", \"dihydrosphingosine\" },\n  { \"$7$76..../....SodiumChloride\", \"$7$76..../....SodiumChloride$WFKbPB2LaF4Xk.4AKGBhzbeG04jb4.YmbDJ8/GyYME4\", \"dihydrosphingosine\" },\n  { \"$7$76..../....unUNunUNunUNun\", \"$7$76..../....unUNunUNunUNun$8ctwb1BYGQ16BVs65s4D5pJsV6Iqybxs/G0CMc65YN.\", \"dihydrosphingosine\" },\n  { \"$7$66..../....SodiumChloride\", \"$7$66..../....SodiumChloride$KqNJJ9MetQhb8hIUafmBA62P6BB8.9qdlki5q/Oxl11\", \"semianthropological\" },\n  { \"$7$66..../....unUNunUNunUNun\", \"$7$66..../....unUNunUNunUNun$sZIzlkCuQMOV.FOEMKHIGTnBCK/pWTzDPdRlUGWof33\", \"semianthropological\" },\n  { \"$7$76..../....SodiumChloride\", \"$7$76..../....SodiumChloride$uAE6EpMP/2qs/f6K1IYgexDdQH9YEFJLJuAlrv8nQ/7\", \"semianthropological\" },\n  { \"$7$76..../....unUNunUNunUNun\", \"$7$76..../....unUNunUNunUNun$yghI7LZeAdKMPJ1Kcwt.poH7.HKccf4RaNPSPDhiYf9\", \"semianthropological\" },\n  { \"$7$66..../....SodiumChloride\", \"$7$66..../....SodiumChloride$brEwm96SNW0TVYPogmSBwvTWo15eHFyWLjprwj.rk23\", \"palaeogeographically\" },\n  { \"$7$66..../....unUNunUNunUNun\", \"$7$66..../....unUNunUNunUNun$IdAjGtFnKdnnbb7D4brCU5npfVV5JsOuOUlRUNC5uX4\", \"palaeogeographically\" },\n  { \"$7$76..../....SodiumChloride\", \"$7$76..../....SodiumChloride$zp3i38vp3QiN4NcpBMxypdNNP6UmUZqHfQNdmW5GVW1\", \"palaeogeographically\" },\n  { \"$7$76..../....unUNunUNunUNun\", \"$7$76..../....unUNunUNunUNun$.rRDG811VnfgDOphwx0v58/Un/0b/yqlQeEqnSx9wxD\", \"palaeogeographically\" },\n  { \"$7$66..../....SodiumChloride\", \"$7$66..../....SodiumChloride$hNBu4ivuLdtFvgcvw/Js82YlIyvdl71HQLAWQOo/iD/\", \"electromyographically\" },\n  { \"$7$66..../....unUNunUNunUNun\", \"$7$66..../....unUNunUNunUNun$UffarlyZ.Q7ZMCLUWoar4LXGrY3vC/gsmztiGPnXFm8\", \"electromyographically\" },\n  { \"$7$76..../....SodiumChloride\", \"$7$76..../....SodiumChloride$74MjXshvfP5lLY4ATRDe6bAMMla/5phwsQ5NrC5SzdA\", \"electromyographically\" },\n  { \"$7$76..../....unUNunUNunUNun\", \"$7$76..../....unUNunUNunUNun$lkKqkxegFPCRrmLiQHkn5/LVwnspaCJ8Gy5E2mZwui1\", \"electromyographically\" },\n  { \"$7$66..../....SodiumChloride\", \"$7$66..../....SodiumChloride$KNQ/5ja6h7mscZbwqpH.iEpXyPBEkRJ9RM57AGd8LwC\", \"noninterchangeableness\" },\n  { \"$7$66..../....unUNunUNunUNun\", \"$7$66..../....unUNunUNunUNun$yAeMOp9QX4wt1lt/RWf8Lzk1iDiDWJgC3fJaQ2PvqF.\", \"noninterchangeableness\" },\n  { \"$7$76..../....SodiumChloride\", \"$7$76..../....SodiumChloride$OZE37yOsji/vihsTRie//KghfLDg36hvG9fs80mvpg2\", \"noninterchangeableness\" },\n  { \"$7$76..../....unUNunUNunUNun\", \"$7$76..../....unUNunUNunUNun$t0S7LBBTkpU3qva2gUFOmwQf62ZuSfIZN8pxhySNHF.\", \"noninterchangeableness\" },\n  { \"$7$66..../....SodiumChloride\", \"$7$66..../....SodiumChloride$CUYPLJy6LoXtljQDkO04hlE.gilwwqjxlt6t2qVSjv2\", \"abcdefghijklmnopqrstuvwxyz\" },\n  { \"$7$66..../....unUNunUNunUNun\", \"$7$66..../....unUNunUNunUNun$6H/tA7duVyrkPwk7iKE2CQTHBbcEc/G9yQ.rmvCCzq1\", \"abcdefghijklmnopqrstuvwxyz\" },\n  { \"$7$76..../....SodiumChloride\", \"$7$76..../....SodiumChloride$6kkrcXSUEwzunuRxeslvWes5DYsvW/RIy6fDjDufYp7\", \"abcdefghijklmnopqrstuvwxyz\" },\n  { \"$7$76..../....unUNunUNunUNun\", \"$7$76..../....unUNunUNunUNun$r3GUOCcDpB6FpFKfBluyu0XCLp4hucbNjfF1WNSj0d5\", \"abcdefghijklmnopqrstuvwxyz\" },\n  { \"$7$66..../....SodiumChloride\", \"$7$66..../....SodiumChloride$XEv77kvbvqdbQCJng4I3D/m6NjDYuWKF6/MG1L258r0\", \"electroencephalographically\" },\n  { \"$7$66..../....unUNunUNunUNun\", \"$7$66..../....unUNunUNunUNun$BgZVKL5keloiD1zPtW8K4FhjubX.lyXktMtxLGp.PYB\", \"electroencephalographically\" },\n  { \"$7$76..../....SodiumChloride\", \"$7$76..../....SodiumChloride$xDUhBS4DqBgtfiO/5byHY5nLqIdLY1gOu55V4Ru5PKB\", \"electroencephalographically\" },\n  { \"$7$76..../....unUNunUNunUNun\", \"$7$76..../....unUNunUNunUNun$ghuPfXLrXuGVh4n1EYom8NjB46M30q.8IdeFLgA25TD\", \"electroencephalographically\" },\n  { \"$7$66..../....SodiumChloride\", \"$7$66..../....SodiumChloride$hbIVIW3Hs8JQ/dbBEsDeplEKM9Nqen.9m6cRg3lnRyA\", \"antidisestablishmentarianism\" },\n  { \"$7$66..../....unUNunUNunUNun\", \"$7$66..../....unUNunUNunUNun$bPoDjdIiZfB/.0ZhW9HDDVmR4s.dgJISacsjuHqonN2\", \"antidisestablishmentarianism\" },\n  { \"$7$76..../....SodiumChloride\", \"$7$76..../....SodiumChloride$G9toGVRwz/26QeL7LYMsJUvFRo.ymQTOFKwb0OJBPE5\", \"antidisestablishmentarianism\" },\n  { \"$7$76..../....unUNunUNunUNun\", \"$7$76..../....unUNunUNunUNun$xSoXugIYrd1Kw7.0coaqwOjsGO7vI0l1XR6nii8kOw9\", \"antidisestablishmentarianism\" },\n  { \"$7$66..../....SodiumChloride\", \"$7$66..../....SodiumChloride$MLWhEztYNELFd/PYpkDdGRQIMaxrFHYUWgDx4GHE7h3\", \"cyclotrimethylenetrinitramine\" },\n  { \"$7$66..../....unUNunUNunUNun\", \"$7$66..../....unUNunUNunUNun$8GZvqrkMMz7iLpT425YKke/3uISWjpr6piwTGgL4kc5\", \"cyclotrimethylenetrinitramine\" },\n  { \"$7$76..../....SodiumChloride\", \"$7$76..../....SodiumChloride$QxEx6K3TBTIdnKw.7L4g4x203i1eQoWVC8B/MLXCE//\", \"cyclotrimethylenetrinitramine\" },\n  { \"$7$76..../....unUNunUNunUNun\", \"$7$76..../....unUNunUNunUNun$NQM6UR9Cn3y5RpRYi9.BOEKiEOask8wUGwBuxfpjjD7\", \"cyclotrimethylenetrinitramine\" },\n  { \"$7$66..../....SodiumChloride\", \"$7$66..../....SodiumChloride$lBdfxI4O2hA14dB3MephYa8B5ot8oXG/oOuEpnNgAC1\", \"dichlorodiphenyltrichloroethane\" },\n  { \"$7$66..../....unUNunUNunUNun\", \"$7$66..../....unUNunUNunUNun$ZYvGdIp/iEXn64SffBI1MTBUGyjYHhm.AKNUwZ8ORYC\", \"dichlorodiphenyltrichloroethane\" },\n  { \"$7$76..../....SodiumChloride\", \"$7$76..../....SodiumChloride$5PGTGTfoMgeVRLExFZcYnQ60p6JiAboEaxU9cEMA415\", \"dichlorodiphenyltrichloroethane\" },\n  { \"$7$76..../....unUNunUNunUNun\", \"$7$76..../....unUNunUNunUNun$.4wQnG7tTPcxgRUfU.dm1NT2wNgdqqyFFeJIpFwTFu4\", \"dichlorodiphenyltrichloroethane\" },\n  { \"$7$66..../....SodiumChloride\", \"$7$66..../....SodiumChloride$kdVQatRfJqgtmphXXTYg00J2nxPINlGefGYQevNBW09\", \"multiple words seperated by spaces\" },\n  { \"$7$66..../....unUNunUNunUNun\", \"$7$66..../....unUNunUNunUNun$OZf.b6XF8a8Plo0jueF/vU44kPS/vsRXkZZAi14/Ng5\", \"multiple words seperated by spaces\" },\n  { \"$7$76..../....SodiumChloride\", \"$7$76..../....SodiumChloride$Vi4X0cIfMTFTjdx/IR0wvNOIUn9FkbJeFT.2e8v54y4\", \"multiple words seperated by spaces\" },\n  { \"$7$76..../....unUNunUNunUNun\", \"$7$76..../....unUNunUNunUNun$qDaN3uWN2U6nlwrm0aITbXRjdIy0tmq7U26M0oG0/H8\", \"multiple words seperated by spaces\" },\n  { \"$7$66..../....SodiumChloride\", \"$7$66..../....SodiumChloride$gSBL3DnRcy/JLvbq3ci6juELi94IF9ZsdV4.3zMhvE3\", \"supercalifragilisticexpialidocious\" },\n  { \"$7$66..../....unUNunUNunUNun\", \"$7$66..../....unUNunUNunUNun$w/MkHQjGUXr5ZCefUrLsIp4ytR5DvzPM3dNsurBMFZD\", \"supercalifragilisticexpialidocious\" },\n  { \"$7$76..../....SodiumChloride\", \"$7$76..../....SodiumChloride$ZSsEFxX0KbK1vjSTJyHoEF2Y2wxeXcDYk6.cZFz0SM.\", \"supercalifragilisticexpialidocious\" },\n  { \"$7$76..../....unUNunUNunUNun\", \"$7$76..../....unUNunUNunUNun$lpENVoBj7AEyEyf8riXs5c15grUonMZalUUrTeLPxo1\", \"supercalifragilisticexpialidocious\" },\n  { \"$7$66..../....SodiumChloride\", \"$7$66..../....SodiumChloride$h/ZJga/dNpY076nq06yA5xD/VJ/F21sh74BQ0d6pRv/\", \"we have a short salt string but not a short password\" },\n  { \"$7$66..../....unUNunUNunUNun\", \"$7$66..../....unUNunUNunUNun$Csps3zKBhCt7Vku6Are1m8Owwds/u9CSNV6Qc2uJiPB\", \"we have a short salt string but not a short password\" },\n  { \"$7$76..../....SodiumChloride\", \"$7$76..../....SodiumChloride$gOx9RDgmVRdzSJlE0Ci2ytt55Wht4F1/UpJq0I2w9c/\", \"we have a short salt string but not a short password\" },\n  { \"$7$76..../....unUNunUNunUNun\", \"$7$76..../....unUNunUNunUNun$ca.ZfqSluM5LSJMeKyuXbUsztyKFYiV3Ms.6MQLoJw5\", \"we have a short salt string but not a short password\" },\n  { \"$7$66..../....SodiumChloride\", \"$7$66..../....SodiumChloride$m4rB5kSSkH9ej4Nlcp9UAuhLrKvPhQnWBWFie4l2va0\", \"multiple word$ $eperated by $pace$ and $pecial character$\" },\n  { \"$7$66..../....unUNunUNunUNun\", \"$7$66..../....unUNunUNunUNun$if43uVHmfNErvPbUbj.P0RzaqmoIYgccd3yrWSKFpuB\", \"multiple word$ $eperated by $pace$ and $pecial character$\" },\n  { \"$7$76..../....SodiumChloride\", \"$7$76..../....SodiumChloride$IEuGp5dUsMJJJREfPggbUks/3e1GOn8wcyltsTgBXv/\", \"multiple word$ $eperated by $pace$ and $pecial character$\" },\n  { \"$7$76..../....unUNunUNunUNun\", \"$7$76..../....unUNunUNunUNun$f658PeyhhWW6Y6GKEFv8cvukWFqE/7FWsWlZ2HHfmSA\", \"multiple word$ $eperated by $pace$ and $pecial character$\" },\n  { \"$7$66..../....SodiumChloride\", \"$7$66..../....SodiumChloride$HRqVH4PaV0wiWpemjmhhw5OxDVvx13LpC6n/vBicXlB\", \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\" },\n  { \"$7$66..../....unUNunUNunUNun\", \"$7$66..../....unUNunUNunUNun$gKaNLHX36iVpdi5ewcUTR4/HjKk1PxtF9AhHbZnOLG.\", \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\" },\n  { \"$7$76..../....SodiumChloride\", \"$7$76..../....SodiumChloride$gDUXkFO3sSuNijh5n8q8bcWhUqHasp8uFHlCb18Npw3\", \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\" },\n  { \"$7$76..../....unUNunUNunUNun\", \"$7$76..../....unUNunUNunUNun$yY5yuCtt2klGs4W3StK/krL2J3LJ6LWWyfMylGE5aP6\", \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\" },\n  { \"$7$66..../....SodiumChloride\", \"$7$66..../....SodiumChloride$A6WHcwWZpjgSfa1ngCBZYahf9eyI3t75WvaSnxnzH25\", \"12345678901234567890123456789012345678901234567890123456789012345678901234567890\" },\n  { \"$7$66..../....unUNunUNunUNun\", \"$7$66..../....unUNunUNunUNun$T5bqciTYrsZFVFVbxkTHN30pfTbljRJ/m966N5OAfR7\", \"12345678901234567890123456789012345678901234567890123456789012345678901234567890\" },\n  { \"$7$76..../....SodiumChloride\", \"$7$76..../....SodiumChloride$0cSTRsNmhbr81DtJHAM7FJ.vyJvY6bBGUTEuKSYl17.\", \"12345678901234567890123456789012345678901234567890123456789012345678901234567890\" },\n  { \"$7$76..../....unUNunUNunUNun\", \"$7$76..../....unUNunUNunUNun$slOkk.KJlnAMqheMHqN907MayfR3vXBbs5BGQEGQNd5\", \"12345678901234567890123456789012345678901234567890123456789012345678901234567890\" },\n  { \"$7$66..../....SodiumChloride\", \"$7$66..../....SodiumChloride$.pbieXeSVNL39ATY0oPdKYCV5QvMNi0DeVIl4q/.rK.\", \"a very much longer text to encrypt.  This one even stretches over morethan one line.\" },\n  { \"$7$66..../....unUNunUNunUNun\", \"$7$66..../....unUNunUNunUNun$ATPpafm6yia2P3.IbncE55JuQwUMoFAW70g1Vxi3pH9\", \"a very much longer text to encrypt.  This one even stretches over morethan one line.\" },\n  { \"$7$76..../....SodiumChloride\", \"$7$76..../....SodiumChloride$0eaxJnTVq07T9FMJvShP7BZhuTREgXYUgkfNOVkxyeA\", \"a very much longer text to encrypt.  This one even stretches over morethan one line.\" },\n  { \"$7$76..../....unUNunUNunUNun\", \"$7$76..../....unUNunUNunUNun$nqET9bwT1mcbXvT0uUgH7aJR422Kwx7.pURU7kE86O5\", \"a very much longer text to encrypt.  This one even stretches over morethan one line.\" },\n  { \"$7$66..../....SodiumChloride\", \"$7$66..../....SodiumChloride$GZ36xGAcwHXjjRhiDCGP91Jche.ChE/dmLjBww6lR8C\", \"\\xd0\\xc1\\xd2\\xcf\\xcc\\xd8\" },\n  { \"$7$66..../....unUNunUNunUNun\", \"$7$66..../....unUNunUNunUNun$4kq6g7KTg.qlKwTXzD6M7gCbopcY4.cJmdknT3YaV03\", \"\\xd0\\xc1\\xd2\\xcf\\xcc\\xd8\" },\n  { \"$7$76..../....SodiumChloride\", \"$7$76..../....SodiumChloride$0QttwQ3y8GIFlaBd1OKJav03xdDdhDNeSwf5NtIcfq3\", \"\\xd0\\xc1\\xd2\\xcf\\xcc\\xd8\" },\n  { \"$7$76..../....unUNunUNunUNun\", \"$7$76..../....unUNunUNunUNun$Ca5hjdbTg76aKYimyLabk0SPl//G9iGC0TiKIgxt/q6\", \"\\xd0\\xc1\\xd2\\xcf\\xcc\\xd8\" },\n  { \"$7$66..../....SodiumChloride\", \"$7$66..../....SodiumChloride$4Zog16enLMlDstdejo/AvHk9DYuHsVptymAnM3bjR.8\", \"\\xd5\\xaa\\xd5\\xaa\\xaa\\xaa\\xd5\\xaa\" },\n  { \"$7$66..../....unUNunUNunUNun\", \"$7$66..../....unUNunUNunUNun$aRuiHsZDl2ktFlwvnjx7T0VBTPE6aunlmpIIs6Zj0k5\", \"\\xd5\\xaa\\xd5\\xaa\\xaa\\xaa\\xd5\\xaa\" },\n  { \"$7$76..../....SodiumChloride\", \"$7$76..../....SodiumChloride$tyd4kG/q20CGuAXU91HsshL8p4W5NI8OmFu1z6kqqL.\", \"\\xd5\\xaa\\xd5\\xaa\\xaa\\xaa\\xd5\\xaa\" },\n  { \"$7$76..../....unUNunUNunUNun\", \"$7$76..../....unUNunUNunUNun$vpWZbPKg.gOudWmAn1i/m.jz7hkswc3fLHVHsSEDqy7\", \"\\xd5\\xaa\\xd5\\xaa\\xaa\\xaa\\xd5\\xaa\" },\n  { \"$7$66..../....SodiumChloride\", \"$7$66..../....SodiumChloride$edUTmV9p3X7NfQrEZkuVV9Q7H2EpMG6JwaipQCx..37\", \"\\xe1\\xec\\xe5\\xf8\\xe1\\xee\\xe4\\xe5\\xf2\" },\n  { \"$7$66..../....unUNunUNunUNun\", \"$7$66..../....unUNunUNunUNun$Up4CGTaC4DcLJeWumLq2oYpsQBdGZ6zhefQtD5vf4B7\", \"\\xe1\\xec\\xe5\\xf8\\xe1\\xee\\xe4\\xe5\\xf2\" },\n  { \"$7$76..../....SodiumChloride\", \"$7$76..../....SodiumChloride$KB8pc1gdDCtiNPZd2cZUmjshm9GQ.Yk4uspB.3xrRd8\", \"\\xe1\\xec\\xe5\\xf8\\xe1\\xee\\xe4\\xe5\\xf2\" },\n  { \"$7$76..../....unUNunUNunUNun\", \"$7$76..../....unUNunUNunUNun$H4LrNZ/3mpKiAeKZqNCS.60b.L407Y7K/tpI1kHXBp8\", \"\\xe1\\xec\\xe5\\xf8\\xe1\\xee\\xe4\\xe5\\xf2\" },\n  { \"$7$66..../....SodiumChloride\", \"$7$66..../....SodiumChloride$taXiXmR1LaEBv82YaQ3SBl8F3Gcuf4jTmvdfmid46W.\", \"\\xf3\\xf4\\xe5\\xf0\\xe8\\xe1\\xee\\xe9\\xe5\" },\n  { \"$7$66..../....unUNunUNunUNun\", \"$7$66..../....unUNunUNunUNun$WVK43ggptNSR88TRDzbRdB3vXkI2lraL8CyS3viXYk7\", \"\\xf3\\xf4\\xe5\\xf0\\xe8\\xe1\\xee\\xe9\\xe5\" },\n  { \"$7$76..../....SodiumChloride\", \"$7$76..../....SodiumChloride$HOFNCX8mY41ken5Cjvq/Hg2eCh2jvmd9QsadZnsMgfA\", \"\\xf3\\xf4\\xe5\\xf0\\xe8\\xe1\\xee\\xe9\\xe5\" },\n  { \"$7$76..../....unUNunUNunUNun\", \"$7$76..../....unUNunUNunUNun$tEeoOSU9CXY8jSFhNWnI.65c/vAM77WP84DQFMXiOh3\", \"\\xf3\\xf4\\xe5\\xf0\\xe8\\xe1\\xee\\xe9\\xe5\" },\n  { \"$7$66..../....SodiumChloride\", \"$7$66..../....SodiumChloride$GnxAApWhTAk0w95IKHC4g76uSDwEhfaGqRwHz8nYGT3\", \"\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\" },\n  { \"$7$66..../....unUNunUNunUNun\", \"$7$66..../....unUNunUNunUNun$53YP/5lSxwCFXZriLWhEumpMr97.rSzYdt.T1nT8o60\", \"\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\" },\n  { \"$7$76..../....SodiumChloride\", \"$7$76..../....SodiumChloride$zWuROXQzGUp9R8E5h0AnsUkelve2vtXjpTDTX6aNlo5\", \"\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\" },\n  { \"$7$76..../....unUNunUNunUNun\", \"$7$76..../....unUNunUNunUNun$enSeUXaINLX6wa3HA08fvDw/uHSedJfgiu2FTJbc1o7\", \"\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\" },\n  { \"$7$66..../....SodiumChloride\", \"$7$66..../....SodiumChloride$7YxRixGFJcQ0iUdI4sdLYUB.QO3YbeTCxW3SwzzMGo7\", \"\\xc3\\xa9tude\" },\n  { \"$7$66..../....unUNunUNunUNun\", \"$7$66..../....unUNunUNunUNun$ECwRAGSxvgb1/KmboMJL1f2Cyt997OERnWC.9UVHRb3\", \"\\xc3\\xa9tude\" },\n  { \"$7$76..../....SodiumChloride\", \"$7$76..../....SodiumChloride$pK2u/JUkP4FBcu9ygDg2kDKqF/8W0pPOGtjVweTEDU7\", \"\\xc3\\xa9tude\" },\n  { \"$7$76..../....unUNunUNunUNun\", \"$7$76..../....unUNunUNunUNun$7e6UUY2ruu431N4qu5VqvbGloAERSKWscHSohwpq8x4\", \"\\xc3\\xa9tude\" },\n  { \"$7$66..../....SodiumChloride\", \"$7$66..../....SodiumChloride$iebMQMvY4dNBwougHGbuTK0LwLfvai2JmAi02Zt7.40\", \"C)tude\" },\n  { \"$7$66..../....unUNunUNunUNun\", \"$7$66..../....unUNunUNunUNun$yDEn2iJBjfAkq88sLvWu5le9cgbPHBLX5eKGZRikDs2\", \"C)tude\" },\n  { \"$7$76..../....SodiumChloride\", \"$7$76..../....SodiumChloride$g/1vF6ADAMayLCBCvLcj9IR7UupsnjWSnjSyN3GCPS5\", \"C)tude\" },\n  { \"$7$76..../....unUNunUNunUNun\", \"$7$76..../....unUNunUNunUNun$awa/bIY0pRLscq/4q7XsgAFCUNnWhE0BkCP7d/VnYp7\", \"C)tude\" },\n  { \"$7$66..../....SodiumChloride\", \"$7$66..../....SodiumChloride$Tw39uW5qnx.068sZ7imQrpaO04CpSSWFw1SyfYWOjM0\", \"Chl\\xc3\\xb6\"\"e\" },\n  { \"$7$66..../....unUNunUNunUNun\", \"$7$66..../....unUNunUNunUNun$xVKR0vEo2aBZXz6izQFdMWrxrRxdEAF4Jh7VR48QmdD\", \"Chl\\xc3\\xb6\"\"e\" },\n  { \"$7$76..../....SodiumChloride\", \"$7$76..../....SodiumChloride$TvGwUq6yImvl7jyBbtt4mkbK8OkjH91.buV.j.Zdjo4\", \"Chl\\xc3\\xb6\"\"e\" },\n  { \"$7$76..../....unUNunUNunUNun\", \"$7$76..../....unUNunUNunUNun$eIvWRZ70aeggFV/9IrenXXFwAI1wiM6fEFfzkZuUby2\", \"Chl\\xc3\\xb6\"\"e\" },\n  { \"$7$66..../....SodiumChloride\", \"$7$66..../....SodiumChloride$FNMfr2g9s.l95sk6k6O2Z/hYJ8Q3KBYPungYU/.gGc3\", \"ChlC6e\" },\n  { \"$7$66..../....unUNunUNunUNun\", \"$7$66..../....unUNunUNunUNun$ZunXMqAj4Pl64KKAji63Q4kgVVoNH2eOwD5FiJbsTN2\", \"ChlC6e\" },\n  { \"$7$76..../....SodiumChloride\", \"$7$76..../....SodiumChloride$o9JpUNH9h7HnyU.koOM2d0RYAY7QpMF59KEaVS7mzi.\", \"ChlC6e\" },\n  { \"$7$76..../....unUNunUNunUNun\", \"$7$76..../....unUNunUNunUNun$WV15m4A6WrD9Pf0cHpaEeJTUEWXKfE6JjuHejLNvH/6\", \"ChlC6e\" },\n  { \"$7$66..../....SodiumChloride\", \"$7$66..../....SodiumChloride$9c4boo0yE48RQsdNfhqabszXZga0chCIJHfXpMnN9b4\", \"\\xc3\\x85ngstr\\xc3\\xb6m\" },\n  { \"$7$66..../....unUNunUNunUNun\", \"$7$66..../....unUNunUNunUNun$aXXYXsPC7ZXcKTEJmwagJZq0./I3SAkmwDNgfVK2r91\", \"\\xc3\\x85ngstr\\xc3\\xb6m\" },\n  { \"$7$76..../....SodiumChloride\", \"$7$76..../....SodiumChloride$QimJe0885yasrX58w1mJfYGZaGx7cpAMbVFejXwXsZA\", \"\\xc3\\x85ngstr\\xc3\\xb6m\" },\n  { \"$7$76..../....unUNunUNunUNun\", \"$7$76..../....unUNunUNunUNun$uLw78UCq8kgGJ/f/hyTjbR3LY4PT/coimrnuhSKeHM8\", \"\\xc3\\x85ngstr\\xc3\\xb6m\" },\n  { \"$7$66..../....SodiumChloride\", \"$7$66..../....SodiumChloride$cQCoPfhwC5XZq0jWBSoxwAaNHVKOzMrw3BEzbYORTr1\", \"C\\x05ngstrC6m\" },\n  { \"$7$66..../....unUNunUNunUNun\", \"$7$66..../....unUNunUNunUNun$6icbwVQfTjEmyBzDjIhcj.eVgxnAQYcXRux51qy4je6\", \"C\\x05ngstrC6m\" },\n  { \"$7$76..../....SodiumChloride\", \"$7$76..../....SodiumChloride$b1AooKtTJ8LMItkXgS2KtoGHHnMBTRQXAdULmIDfSm5\", \"C\\x05ngstrC6m\" },\n  { \"$7$76..../....unUNunUNunUNun\", \"$7$76..../....unUNunUNunUNun$xck.JIR9K8h2wtFPXat68.uruOIvMiBGw02hgXRPcQ.\", \"C\\x05ngstrC6m\" },\n  { \"$7$66..../....SodiumChloride\", \"$7$66..../....SodiumChloride$IiAMtRbn31nS7eTo0D86GtHnjO6Vj5rWBgSviKaPuIB\", \"C\\x05ngstrCU*U***U*\" },\n  { \"$7$66..../....unUNunUNunUNun\", \"$7$66..../....unUNunUNunUNun$rF.n95KwHM1oFUOynHOJuC8gleTXsjLs4a5BBn5fyE.\", \"C\\x05ngstrCU*U***U*\" },\n  { \"$7$76..../....SodiumChloride\", \"$7$76..../....SodiumChloride$eDeOgA6iIrdrhSlATANsgmIBCCP.zNSg.VMuI6ooZ6D\", \"C\\x05ngstrCU*U***U*\" },\n  { \"$7$76..../....unUNunUNunUNun\", \"$7$76..../....unUNunUNunUNun$C/nyPkTqs7FjMXGXFbyjRpurGJWLrCr/9o5GTxY1uM.\", \"C\\x05ngstrCU*U***U*\" },\n  { \"$7$66..../....SodiumChloride\", \"$7$66..../....SodiumChloride$FD2gMMrxEcUavxXywaHg18dL.1zg2tRVyiRgdqx17p.\", \"U*U***U*ignored\" },\n  { \"$7$66..../....unUNunUNunUNun\", \"$7$66..../....unUNunUNunUNun$6mnihpCBh3mK3a8PaQe/MXvlG/uHnXmtDkd2o9CdWW5\", \"U*U***U*ignored\" },\n  { \"$7$76..../....SodiumChloride\", \"$7$76..../....SodiumChloride$4k8OO2yMIOqmEp2cM5j8/bicLTRiJTmhQZY6/uV1cbD\", \"U*U***U*ignored\" },\n  { \"$7$76..../....unUNunUNunUNun\", \"$7$76..../....unUNunUNunUNun$e8VUg.Rrc4Uto8oNK7ebWblYkVKOj38N2MbMzDLyPyA\", \"U*U***U*ignored\" },\n  { \"$7$66..../....SodiumChloride\", \"$7$66..../....SodiumChloride$F86V4KQXciynySIYU62E.Pgkn4/R/6BmR.nN/yuW6Y6\", \"U*U*U*U*\" },\n  { \"$7$66..../....unUNunUNunUNun\", \"$7$66..../....unUNunUNunUNun$0gicmm5BtY7dBezbkBcsT6drHRJS4SwpldzmaagAOi1\", \"U*U*U*U*\" },\n  { \"$7$76..../....SodiumChloride\", \"$7$76..../....SodiumChloride$131cregLhY72L1SCJMRcJV/wFnaXYpCfAoM.I6lRKO3\", \"U*U*U*U*\" },\n  { \"$7$76..../....unUNunUNunUNun\", \"$7$76..../....unUNunUNunUNun$ZrPFoAiMIkBVnpdgM1KWGyZkIBihtPids5J616.4bv4\", \"U*U*U*U*\" },\n  { \"$7$66..../....SodiumChloride\", \"$7$66..../....SodiumChloride$.eU1o0il.hO77hAiVFeFjcwYzkrw8W/xG4R/t6xyuj/\", \"U*U*U*U*ignored\" },\n  { \"$7$66..../....unUNunUNunUNun\", \"$7$66..../....unUNunUNunUNun$Tp9gUITtxCqjcxrOyFwWR6OJHET3NYDdfheJVuPAg7C\", \"U*U*U*U*ignored\" },\n  { \"$7$76..../....SodiumChloride\", \"$7$76..../....SodiumChloride$O19rd3DVUcTsYjqiSIr806M2gnDdtO.XrH7.bJSLc71\", \"U*U*U*U*ignored\" },\n  { \"$7$76..../....unUNunUNunUNun\", \"$7$76..../....unUNunUNunUNun$sM/qkyd1LcgGCO1zscauewUyDxx2WabrxQU.2lHnoB5\", \"U*U*U*U*ignored\" },\n  { \"$7$66..../....SodiumChloride\", \"$7$66..../....SodiumChloride$8oBdAWdWBxHSBzIxOXJhGBxrgBr1x5QDTT62pv/PBT7\", \"*U*U*U*U\" },\n  { \"$7$66..../....unUNunUNunUNun\", \"$7$66..../....unUNunUNunUNun$JmL7VfGcKNwntIRPBxInEq9cqZG4dTgN1QHoJYRFhU9\", \"*U*U*U*U\" },\n  { \"$7$76..../....SodiumChloride\", \"$7$76..../....SodiumChloride$/nF4yqbXJb9LLaj6nsAO8IuLbJLAw7bHVqBupaYOUr/\", \"*U*U*U*U\" },\n  { \"$7$76..../....unUNunUNunUNun\", \"$7$76..../....unUNunUNunUNun$mw74WE2pyCoLDzLTHjIkaXzWCfpAXKw62PKX6BuX0y6\", \"*U*U*U*U\" },\n  { \"$7$66..../....SodiumChloride\", \"$7$66..../....SodiumChloride$ujH6VGmEIBtxPi5NQD9oCa3CwTBA1/H95FKlGltdQR9\", \"*U*U*U*U*\" },\n  { \"$7$66..../....unUNunUNunUNun\", \"$7$66..../....unUNunUNunUNun$v5hV2JabckGN6x.Ti1TorG.O4OJZ.DvLJ2HQ2TeVP45\", \"*U*U*U*U*\" },\n  { \"$7$76..../....SodiumChloride\", \"$7$76..../....SodiumChloride$qj8FEKJTbuFZXDtTZBV6ueI3ShgFhUBOhjm.MuVeNm6\", \"*U*U*U*U*\" },\n  { \"$7$76..../....unUNunUNunUNun\", \"$7$76..../....unUNunUNunUNun$bB9hQmub5roDfDkDG/.AUyH0GUx1Hbt4zqOA1YXUaQ2\", \"*U*U*U*U*\" },\n  { \"$7$66..../....SodiumChloride\", \"$7$66..../....SodiumChloride$EvTdArdcQuXxCFUyu8urMaY9wCSo2zVhgUk651bBk08\", \"*U*U*U*U*U*U*U*U\" },\n  { \"$7$66..../....unUNunUNunUNun\", \"$7$66..../....unUNunUNunUNun$UOYLpVu28lBtuMRZ8oy6qICNufeQiiv86bIRuvukEh3\", \"*U*U*U*U*U*U*U*U\" },\n  { \"$7$76..../....SodiumChloride\", \"$7$76..../....SodiumChloride$xRLMFI5mh135V9NMFgrcUyL6Dhrv3hdGlUz5RRzu1Q/\", \"*U*U*U*U*U*U*U*U\" },\n  { \"$7$76..../....unUNunUNunUNun\", \"$7$76..../....unUNunUNunUNun$O/fYa975Oab7hUPjZq9mbNOSQzxjAIfqPouRuvIgVm7\", \"*U*U*U*U*U*U*U*U\" },\n  { \"$7$66..../....SodiumChloride\", \"$7$66..../....SodiumChloride$RePK.di7NuD.VUy8SaEw2HT0GlwlMqkjVsM8UzEk8J3\", \"*U*U*U*U*U*U*U*U*\" },\n  { \"$7$66..../....unUNunUNunUNun\", \"$7$66..../....unUNunUNunUNun$ibcYiggYF7w6/3F3EUcX6COy/RDRy3W3FQMwFDoxKT6\", \"*U*U*U*U*U*U*U*U*\" },\n  { \"$7$76..../....SodiumChloride\", \"$7$76..../....SodiumChloride$mS34ZYmcC/KqbQCQK5JLeaqlem5YtOmnAxY5RxkGEp3\", \"*U*U*U*U*U*U*U*U*\" },\n  { \"$7$76..../....unUNunUNunUNun\", \"$7$76..../....unUNunUNunUNun$TQodCEzmT1iYm8dXR4Q8Tb6ems0mlE9cQjYa3DiY2c8\", \"*U*U*U*U*U*U*U*U*\" },\n  { \"$7$66..../....SodiumChloride\", \"$7$66..../....SodiumChloride$zMvDpwv1riqro9MagZ.9lDdG9PDk0aa5BSpMGKhUaLD\", \"\\xa3\" },\n  { \"$7$66..../....unUNunUNunUNun\", \"$7$66..../....unUNunUNunUNun$3RqmFvJAvOzugD8jQoWtCamCLD2XcrAW5yYy.w9aEf6\", \"\\xa3\" },\n  { \"$7$76..../....SodiumChloride\", \"$7$76..../....SodiumChloride$PF36n1GOVDJHPn1HMjgVul2aj.lkW51Nxb5x0CknkvA\", \"\\xa3\" },\n  { \"$7$76..../....unUNunUNunUNun\", \"$7$76..../....unUNunUNunUNun$uxnYccfaaCSbULfJRwa/OvR64bNeL9P686g9gqlY5h2\", \"\\xa3\" },\n  { \"$7$66..../....SodiumChloride\", \"$7$66..../....SodiumChloride$mT4x6wjY6o1GQS7D/uYnZGZWm0EYDGgzvbb9iUsKug8\", \"\\xa3\"\"a\" },\n  { \"$7$66..../....unUNunUNunUNun\", \"$7$66..../....unUNunUNunUNun$0mX0TmnXNllLRDUyvuF2BUdndBqHi1IMI2DfttEuY8.\", \"\\xa3\"\"a\" },\n  { \"$7$76..../....SodiumChloride\", \"$7$76..../....SodiumChloride$r8cMdCDon/cX84m7F7Ac.JaJHDMGi/NMPtu2nLnu/v9\", \"\\xa3\"\"a\" },\n  { \"$7$76..../....unUNunUNunUNun\", \"$7$76..../....unUNunUNunUNun$9AhRhs3DOnxMHqgcwLqM.giO9bcjFdDjrwZIWjbbzKD\", \"\\xa3\"\"a\" },\n  { \"$7$66..../....SodiumChloride\", \"$7$66..../....SodiumChloride$RjYtMKrm0Dfbxz.NPamXblt0QWzH1bdCZrSAvoFUZT0\", \"\\xd1\\x91\" },\n  { \"$7$66..../....unUNunUNunUNun\", \"$7$66..../....unUNunUNunUNun$U60iLmAbdWjZtqC3/DGTuBrwUMyJgOWchmteULVE9X9\", \"\\xd1\\x91\" },\n  { \"$7$76..../....SodiumChloride\", \"$7$76..../....SodiumChloride$JC2FgAb473Y3tpVl/96F2dzULdExv/it/LF9gK9oL65\", \"\\xd1\\x91\" },\n  { \"$7$76..../....unUNunUNunUNun\", \"$7$76..../....unUNunUNunUNun$G6Rxr9HAMCdXQIlL1g8Ecx0HV.KGnyuPlBgQaDOuB/.\", \"\\xd1\\x91\" },\n  { \"$7$66..../....SodiumChloride\", \"$7$66..../....SodiumChloride$E6W.reBwHzUAT7eM67zUaOINeMVOhysElp.7gQvmbH9\", \"\\xa3\"\"ab\" },\n  { \"$7$66..../....unUNunUNunUNun\", \"$7$66..../....unUNunUNunUNun$hTyEPYPLPGJZUmENXQk7vDiwXHitk3NQR7UJmHaDGLC\", \"\\xa3\"\"ab\" },\n  { \"$7$76..../....SodiumChloride\", \"$7$76..../....SodiumChloride$yIWpWKiKgyC30URAYuYJD0T4OZzfueGWyKtOGdYE3GA\", \"\\xa3\"\"ab\" },\n  { \"$7$76..../....unUNunUNunUNun\", \"$7$76..../....unUNunUNunUNun$jIak4C9WVCs9YDP2eGI7O7ee2rd9xpIqmWgznukuyu1\", \"\\xa3\"\"ab\" },\n  { \"$7$66..../....SodiumChloride\", \"$7$66..../....SodiumChloride$qxEBlzPJlM6OAtfchj2arh2bdwqM5Z45cw5ML.jAjd5\", \"\\xff\\xff\\xa3\" },\n  { \"$7$66..../....unUNunUNunUNun\", \"$7$66..../....unUNunUNunUNun$biGQRBKqafxdN.asEvmuR2Kdl1U9.fzBJ70FeiQHgF1\", \"\\xff\\xff\\xa3\" },\n  { \"$7$76..../....SodiumChloride\", \"$7$76..../....SodiumChloride$g76tp0jkf.fgTlCOKZByz6ClnclUtfENJFgg7MC1Oy1\", \"\\xff\\xff\\xa3\" },\n  { \"$7$76..../....unUNunUNunUNun\", \"$7$76..../....unUNunUNunUNun$eqL/XiUhQVmhMS3dCWtr.xCdYwCDIINIZYEMc3D41q3\", \"\\xff\\xff\\xa3\" },\n  { \"$7$66..../....SodiumChloride\", \"$7$66..../....SodiumChloride$osocfLgQvWEug3PJIEU6JnkX1v73RtGlEI4rgM4HDS7\", \"1\\xa3\"\"345\" },\n  { \"$7$66..../....unUNunUNunUNun\", \"$7$66..../....unUNunUNunUNun$f5WUC8WzClufnbcUsy.fw7cc1o0aCb6CCwJG20d67v6\", \"1\\xa3\"\"345\" },\n  { \"$7$76..../....SodiumChloride\", \"$7$76..../....SodiumChloride$hKTA4vbfBrjCKbEjhgYs/w.iYA/6k1Coyuxq1vME8C/\", \"1\\xa3\"\"345\" },\n  { \"$7$76..../....unUNunUNunUNun\", \"$7$76..../....unUNunUNunUNun$M4MJvkf4l3/9yYMv.kt23msFi/LE7uC5B/5N0NLj897\", \"1\\xa3\"\"345\" },\n  { \"$7$66..../....SodiumChloride\", \"$7$66..../....SodiumChloride$80g/tKzSNL1oAWoOno2iMnBH7dUXBm/sI.pfkjiioq5\", \"\\xff\\xa3\"\"345\" },\n  { \"$7$66..../....unUNunUNunUNun\", \"$7$66..../....unUNunUNunUNun$3AJnhopg1F5YGQmzoAgWnclqadWVYwE0PNpDluWMRH4\", \"\\xff\\xa3\"\"345\" },\n  { \"$7$76..../....SodiumChloride\", \"$7$76..../....SodiumChloride$60heEl4VMS6POJ1h2tpme9MNVe2wBf4eOSG8nc.kWrB\", \"\\xff\\xa3\"\"345\" },\n  { \"$7$76..../....unUNunUNunUNun\", \"$7$76..../....unUNunUNunUNun$PEMVTGfatVb8JvjV.U3GMLnFy9CPr.rYTg2qm0oVtC/\", \"\\xff\\xa3\"\"345\" },\n  { \"$7$66..../....SodiumChloride\", \"$7$66..../....SodiumChloride$8qKJs2sxI2X.IjaD92XbkmXWbnXKWKbpu8doXlQx9L7\", \"\\xff\\xa3\"\"34\\xff\\xff\\xff\\xa3\"\"345\" },\n  { \"$7$66..../....unUNunUNunUNun\", \"$7$66..../....unUNunUNunUNun$LNSuRInMWKAAr4dCdIWcpVJaFneJuv9hDWLQk2mTnO3\", \"\\xff\\xa3\"\"34\\xff\\xff\\xff\\xa3\"\"345\" },\n  { \"$7$76..../....SodiumChloride\", \"$7$76..../....SodiumChloride$fjpW.HlyqrGYcfpUpFMOWRAbeKvx/0vvKEjF9x2xvy4\", \"\\xff\\xa3\"\"34\\xff\\xff\\xff\\xa3\"\"345\" },\n  { \"$7$76..../....unUNunUNunUNun\", \"$7$76..../....unUNunUNunUNun$nsuyo35dVIW2jGX.M6sEPiadNegFLwICITC.AjNxGw0\", \"\\xff\\xa3\"\"34\\xff\\xff\\xff\\xa3\"\"345\" },\n  { \"$7$66..../....SodiumChloride\", \"$7$66..../....SodiumChloride$PpYniTQpnDu2xjPqepGv5Z5LNSobSslIu06t0ZheM/C\", \"U\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xff\" },\n  { \"$7$66..../....unUNunUNunUNun\", \"$7$66..../....unUNunUNunUNun$Xhwh23B1bvYySrY3CYgjHfLuw/HnFuzz5Cs7Jl5UX/9\", \"U\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xff\" },\n  { \"$7$76..../....SodiumChloride\", \"$7$76..../....SodiumChloride$Aqp6YYwpRSNkKVFOMy/dpSGXIEdu5cv3k6jlZ3XsK4A\", \"U\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xff\" },\n  { \"$7$76..../....unUNunUNunUNun\", \"$7$76..../....unUNunUNunUNun$Ei1/xPtI96wvI8QIYoetMfg9LFvr.FHhCW8qaNt2nV5\", \"U\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xff\" },\n  { \"$7$66..../....SodiumChloride\", \"$7$66..../....SodiumChloride$4fgfBWi0WdIDTL6vId2y0lR1lKxWBdy2mcW5v30E9d9\", \"\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\" },\n  { \"$7$66..../....unUNunUNunUNun\", \"$7$66..../....unUNunUNunUNun$Mm1a9LtT/t76JvHmQzo6ZQ2kterNAfZOgbPcw0RONa4\", \"\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\" },\n  { \"$7$76..../....SodiumChloride\", \"$7$76..../....SodiumChloride$.pdaiyKPOOC7vX1dErqdtuBa7mB38hTRtK9Y9NURrQ/\", \"\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\" },\n  { \"$7$76..../....unUNunUNunUNun\", \"$7$76..../....unUNunUNunUNun$at/UBhHq3lOkIWwKq0N15zcSXJeX1fGkbsrnJOwXI/3\", \"\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\" },\n  { \"$7$66..../....SodiumChloride\", \"$7$66..../....SodiumChloride$liSf7mTa8u.no7HgXcNQwIE3K8Twqr7nSt5N/HrEXBA\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\" },\n  { \"$7$66..../....unUNunUNunUNun\", \"$7$66..../....unUNunUNunUNun$e1MvxAxlc5CmmyZIv4wFjK1QFcSlZtYRu8js3vt94J.\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\" },\n  { \"$7$76..../....SodiumChloride\", \"$7$76..../....SodiumChloride$BfP7vcwPuLK54Srdja21kWTs9YjKGAHEXpCr64pjeD9\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\" },\n  { \"$7$76..../....unUNunUNunUNun\", \"$7$76..../....unUNunUNunUNun$iKHIQ5QmbKatT4KlSvoUOLrrxtluLDrygpezD80ULV6\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\" },\n  { \"$7$66..../....SodiumChloride\", \"$7$66..../....SodiumChloride$LJM0EguPUkwuiest9cmjcXFGt2y7OGLrqLKKxEsZh./\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789chars after 72 are ignored\" },\n  { \"$7$66..../....unUNunUNunUNun\", \"$7$66..../....unUNunUNunUNun$/185VGjSOo5ctS1gXz9vIFEyvZBbFQK5eIadLqA/0E8\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789chars after 72 are ignored\" },\n  { \"$7$76..../....SodiumChloride\", \"$7$76..../....SodiumChloride$FI1q4hzGjbE.Y63Y0R8dGXpzUPysD2a3Wl2eQevi0I0\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789chars after 72 are ignored\" },\n  { \"$7$76..../....unUNunUNunUNun\", \"$7$76..../....unUNunUNunUNun$sSi/MnMMQ5bJT7uK31bZQUbo9Ndx74f5szGll45S2E.\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789chars after 72 are ignored\" },\n  { \"$7$66..../....SodiumChloride\", \"$7$66..../....SodiumChloride$5PFYYEDmxkMMY7y3kC3WoJPgp3RMn1kk75QEGg4zHqA\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\" },\n  { \"$7$66..../....unUNunUNunUNun\", \"$7$66..../....unUNunUNunUNun$Tr0LtKtY7GdlNqkFyEPE1rAO/DuDnx8zap5LAdFoj8C\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\" },\n  { \"$7$76..../....SodiumChloride\", \"$7$76..../....SodiumChloride$HPGIvKO9qSfB6hjHQZior8vp9DZyTraLFU..WpZ1i4D\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\" },\n  { \"$7$76..../....unUNunUNunUNun\", \"$7$76..../....unUNunUNunUNun$ScEUeW0bf4lIUkvnDsN.GBoG4YltcedJ0LpgG/0FXT/\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\" },\n  { \"$7$66..../....SodiumChloride\", \"$7$66..../....SodiumChloride$E58r8pgTX.C9h5GE4pFjxLfryIqvfkIoPzl6.Qd.PoC\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\"\"chars after 72 are ignored as usual\" },\n  { \"$7$66..../....unUNunUNunUNun\", \"$7$66..../....unUNunUNunUNun$8tbjwsnKXj54RkRmY/6OmwkZ6VWrZsggSPZ78BBVbl2\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\"\"chars after 72 are ignored as usual\" },\n  { \"$7$76..../....SodiumChloride\", \"$7$76..../....SodiumChloride$u9qLMsrODvlTH5RKmvy6QjXj8naJuZFrfqZYgUYR8tC\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\"\"chars after 72 are ignored as usual\" },\n  { \"$7$76..../....unUNunUNunUNun\", \"$7$76..../....unUNunUNunUNun$aprvZJwQjJ/851juw5.bmh7SD7XXgZbhFZo6Gc0NTcC\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\"\"chars after 72 are ignored as usual\" },\n  { \"$7$66..../....SodiumChloride\", \"$7$66..../....SodiumChloride$XWvM63NkSpzT20/b2/EZnuewkQsMK27yYxPuFHqmXF7\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has forgotten.\" },\n  { \"$7$66..../....unUNunUNunUNun\", \"$7$66..../....unUNunUNunUNun$qz35/rXwtde9v9.76nCueVwZxyyaEMEKVswakoKRNdC\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has forgotten.\" },\n  { \"$7$76..../....SodiumChloride\", \"$7$76..../....SodiumChloride$oC9JvM1.2hG7iuvTSssKDcI41wbEJRSylSXYH5G8KQ1\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has forgotten.\" },\n  { \"$7$76..../....unUNunUNunUNun\", \"$7$76..../....unUNunUNunUNun$UxlMyj4KzIf6NphvvTX.8L7hnTiHIuiWGbHsw185rN/\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has forgotten.\" },\n  { \"$7$66..../....SodiumChloride\", \"$7$66..../....SodiumChloride$kBd3tMYCmP.08m8B54zvtjY8oJCsycaa0NJkW8pGzY9\", \"THE YEAR\" },\n  { \"$7$66..../....unUNunUNunUNun\", \"$7$66..../....unUNunUNunUNun$etfOU0Hskdu32Pq.V5yi0JDeW4Km7kKQNvjgTNdL4G4\", \"THE YEAR\" },\n  { \"$7$76..../....SodiumChloride\", \"$7$76..../....SodiumChloride$IA7kRgXhK58Xq1X8U.FBjnRSkt.2ZrbxiKjVViamhN3\", \"THE YEAR\" },\n  { \"$7$76..../....unUNunUNunUNun\", \"$7$76..../....unUNunUNunUNun$gFVdU3.j3cBR40YFm1oih5HfoJPk0Yic4aO5j94p384\", \"THE YEAR\" },\n  { \"$7$66..../....SodiumChloride\", \"$7$66..../....SodiumChloride$qamur.ZkdwGjSTdMcOvVP8to/mYsUbyWhXysqR2wZT1\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and do\" },\n  { \"$7$66..../....unUNunUNunUNun\", \"$7$66..../....unUNunUNunUNun$8A1w6txth2aqCCrdtUmTeiHonLF5t.Mf/kxSCtiWMi9\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and do\" },\n  { \"$7$76..../....SodiumChloride\", \"$7$76..../....SodiumChloride$/VAM3Y91pyeZ23jD.PtAwPmCt60jWQevXqaUoHta.r/\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and do\" },\n  { \"$7$76..../....unUNunUNunUNun\", \"$7$76..../....unUNunUNunUNun$IpbZMRgpk4lDjCvkWRnYWZAp6w.L4TjRknBIK809ke5\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and do\" },\n  { \"$7$66..../....SodiumChloride\", \"$7$66..../....SodiumChloride$5.dMdkgPkYWBeo.bwGGy5uvM07HG.sPN5FqKIN5E5O6\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has f\" },\n  { \"$7$66..../....unUNunUNunUNun\", \"$7$66..../....unUNunUNunUNun$JCaaEytAqFSFA4kEO/n25qwV07qz6lIrS10g/e.RLpD\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has f\" },\n  { \"$7$76..../....SodiumChloride\", \"$7$76..../....SodiumChloride$6QRmYmWRMTS.24zHZcNvULbsQVtIrbU/0ks/gXD4is.\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has f\" },\n  { \"$7$76..../....unUNunUNunUNun\", \"$7$76..../....unUNunUNunUNun$KdYezd0y5ca2uj07L06lxge3dcYwkXP6jW0bpglZ/U0\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has f\" },\n#endif // scrypt\n\n#if INCLUDE_sha1crypt && defined TEST_sha1crypt\n  { \"$sha1$12$GGXpNqoJvglVTkGU\", \"$sha1$12$GGXpNqoJvglVTkGU$24ApQz0YcjniaKRybMfRK5DJIz6n\", \"\" },\n  { \"$sha1$12$xSZGpk6Bp4SA3.cR\", \"$sha1$12$xSZGpk6Bp4SA3.cR$tsxg1OcOIRcYxCEtp36rr6ULn4vQ\", \"\" },\n  { \"$sha1$456$GGXpNqoJvglVTkGU\", \"$sha1$456$GGXpNqoJvglVTkGU$LzqiYdGaEExjTzfTk7H73qMJvK.o\", \"\" },\n  { \"$sha1$456$xSZGpk6Bp4SA3.cR\", \"$sha1$456$xSZGpk6Bp4SA3.cR$hMqn.E6yFWqU4pFAN8bfhI/IDHY5\", \"\" },\n  { \"$sha1$12$GGXpNqoJvglVTkGU\", \"$sha1$12$GGXpNqoJvglVTkGU$t.6rYZWKJE2c3hmqOqEQFIW1QzVS\", \" \" },\n  { \"$sha1$12$xSZGpk6Bp4SA3.cR\", \"$sha1$12$xSZGpk6Bp4SA3.cR$pDIvodIjXB2aL6e5OTqNZ1r9hDJ1\", \" \" },\n  { \"$sha1$456$GGXpNqoJvglVTkGU\", \"$sha1$456$GGXpNqoJvglVTkGU$pwWLA6h5Rp26X5d1KtniDlvvSB/u\", \" \" },\n  { \"$sha1$456$xSZGpk6Bp4SA3.cR\", \"$sha1$456$xSZGpk6Bp4SA3.cR$tzRaH1vW4yFkis7C4RX1u64aN8LG\", \" \" },\n  { \"$sha1$12$GGXpNqoJvglVTkGU\", \"$sha1$12$GGXpNqoJvglVTkGU$15ay/sqt8x.kymG1fxcilMe9uzbg\", \"a\" },\n  { \"$sha1$12$xSZGpk6Bp4SA3.cR\", \"$sha1$12$xSZGpk6Bp4SA3.cR$ffbX5Tib3HIamb7DFtCXLv1/CWeI\", \"a\" },\n  { \"$sha1$456$GGXpNqoJvglVTkGU\", \"$sha1$456$GGXpNqoJvglVTkGU$QaIV98sGCzM4BrksS1Lfsq473yOw\", \"a\" },\n  { \"$sha1$456$xSZGpk6Bp4SA3.cR\", \"$sha1$456$xSZGpk6Bp4SA3.cR$02YDwH9L3BdhhLT7rLnikG6dyszQ\", \"a\" },\n  { \"$sha1$12$GGXpNqoJvglVTkGU\", \"$sha1$12$GGXpNqoJvglVTkGU$coqIIvpcdPaKfu9NVK5oHZ8qH/ZL\", \"ab\" },\n  { \"$sha1$12$xSZGpk6Bp4SA3.cR\", \"$sha1$12$xSZGpk6Bp4SA3.cR$EdA2XMipVWA.VW.LGjxi8NVCEUSb\", \"ab\" },\n  { \"$sha1$456$GGXpNqoJvglVTkGU\", \"$sha1$456$GGXpNqoJvglVTkGU$4jye9tqDQ51RUiFxAxlHDY14fm1M\", \"ab\" },\n  { \"$sha1$456$xSZGpk6Bp4SA3.cR\", \"$sha1$456$xSZGpk6Bp4SA3.cR$.eePvxQ9ZzUK5nok0gz1xdBOixQa\", \"ab\" },\n  { \"$sha1$12$GGXpNqoJvglVTkGU\", \"$sha1$12$GGXpNqoJvglVTkGU$I2kBSbaKuC5BRdOKHDkuhGyZrkxV\", \"abc\" },\n  { \"$sha1$12$xSZGpk6Bp4SA3.cR\", \"$sha1$12$xSZGpk6Bp4SA3.cR$wpPICrXXbgCprRZZqVyXlnxBFhwV\", \"abc\" },\n  { \"$sha1$456$GGXpNqoJvglVTkGU\", \"$sha1$456$GGXpNqoJvglVTkGU$1mhAryDechbI5mQqzYx6fvVAmwtb\", \"abc\" },\n  { \"$sha1$456$xSZGpk6Bp4SA3.cR\", \"$sha1$456$xSZGpk6Bp4SA3.cR$tVZ0qNp9iIF2diHSAUeusnx58AZl\", \"abc\" },\n  { \"$sha1$12$GGXpNqoJvglVTkGU\", \"$sha1$12$GGXpNqoJvglVTkGU$20wfOdRz0K3r0xM7AqRJussRjGDk\", \"U*U\" },\n  { \"$sha1$12$xSZGpk6Bp4SA3.cR\", \"$sha1$12$xSZGpk6Bp4SA3.cR$51ZPvwXNjQYXfYrrWyeinPaPipaL\", \"U*U\" },\n  { \"$sha1$456$GGXpNqoJvglVTkGU\", \"$sha1$456$GGXpNqoJvglVTkGU$NFzZf1UYKoeVuELW3myamKkQLyvc\", \"U*U\" },\n  { \"$sha1$456$xSZGpk6Bp4SA3.cR\", \"$sha1$456$xSZGpk6Bp4SA3.cR$UsODgIeehgmH7cTX2VyTwXPnxkcq\", \"U*U\" },\n  { \"$sha1$12$GGXpNqoJvglVTkGU\", \"$sha1$12$GGXpNqoJvglVTkGU$F4ExSFycFzqnpRJhqrCsxqbrprhi\", \"U*U*\" },\n  { \"$sha1$12$xSZGpk6Bp4SA3.cR\", \"$sha1$12$xSZGpk6Bp4SA3.cR$2Q7KEqqpPG.MYLtLYBfuYR8uMlEx\", \"U*U*\" },\n  { \"$sha1$456$GGXpNqoJvglVTkGU\", \"$sha1$456$GGXpNqoJvglVTkGU$P3P4V4Z4dINocgBN823Tfu08NAo9\", \"U*U*\" },\n  { \"$sha1$456$xSZGpk6Bp4SA3.cR\", \"$sha1$456$xSZGpk6Bp4SA3.cR$V1UhjMiZjPBXnyhjndlPB/bCqyUA\", \"U*U*\" },\n  { \"$sha1$12$GGXpNqoJvglVTkGU\", \"$sha1$12$GGXpNqoJvglVTkGU$ZEhqfNRqqR33vdjdVscpBkyZOP.v\", \"U*U*U\" },\n  { \"$sha1$12$xSZGpk6Bp4SA3.cR\", \"$sha1$12$xSZGpk6Bp4SA3.cR$qXmxLa7XHZYkTW.axnkg0ZhGr9x.\", \"U*U*U\" },\n  { \"$sha1$456$GGXpNqoJvglVTkGU\", \"$sha1$456$GGXpNqoJvglVTkGU$pvLi1u1DPEtMoZygL0a5YyMrt8mZ\", \"U*U*U\" },\n  { \"$sha1$456$xSZGpk6Bp4SA3.cR\", \"$sha1$456$xSZGpk6Bp4SA3.cR$.U0OGzNsh/UE79suFDuDGCxicRjV\", \"U*U*U\" },\n  { \"$sha1$12$GGXpNqoJvglVTkGU\", \"$sha1$12$GGXpNqoJvglVTkGU$Q/Av96L5yOChpaU6nGevJ0SQgTU7\", \".....\" },\n  { \"$sha1$12$xSZGpk6Bp4SA3.cR\", \"$sha1$12$xSZGpk6Bp4SA3.cR$V8srR4/uIK6eyidOtxOQs/WJTn3o\", \".....\" },\n  { \"$sha1$456$GGXpNqoJvglVTkGU\", \"$sha1$456$GGXpNqoJvglVTkGU$coB1LPzD8yyBRF2Yi1KjtyWlA2my\", \".....\" },\n  { \"$sha1$456$xSZGpk6Bp4SA3.cR\", \"$sha1$456$xSZGpk6Bp4SA3.cR$jfd7rLEMYJCDAC3l1HHa/UEUa6JO\", \".....\" },\n  { \"$sha1$12$GGXpNqoJvglVTkGU\", \"$sha1$12$GGXpNqoJvglVTkGU$lE5gwUx7lqvoLTE95ye4XFOxkiGQ\", \"dragon\" },\n  { \"$sha1$12$xSZGpk6Bp4SA3.cR\", \"$sha1$12$xSZGpk6Bp4SA3.cR$GXkoVxTeHFfTATwniCm7z4KxHTu.\", \"dragon\" },\n  { \"$sha1$456$GGXpNqoJvglVTkGU\", \"$sha1$456$GGXpNqoJvglVTkGU$0hIfm8r3KhfUvVt/4AG9OcnKhGwJ\", \"dragon\" },\n  { \"$sha1$456$xSZGpk6Bp4SA3.cR\", \"$sha1$456$xSZGpk6Bp4SA3.cR$3kZ/qZ3kQPyRMir72rL.QGjZ42PK\", \"dragon\" },\n  { \"$sha1$12$GGXpNqoJvglVTkGU\", \"$sha1$12$GGXpNqoJvglVTkGU$orRJ0KAkqwFrecUBbcN8i6PfJZF6\", \"dRaGoN\" },\n  { \"$sha1$12$xSZGpk6Bp4SA3.cR\", \"$sha1$12$xSZGpk6Bp4SA3.cR$OG6yxfAI0P.b726ZpYhTGSApsvAw\", \"dRaGoN\" },\n  { \"$sha1$456$GGXpNqoJvglVTkGU\", \"$sha1$456$GGXpNqoJvglVTkGU$MPzBJfoigY8Ey9ehBlUQQzYdrMhT\", \"dRaGoN\" },\n  { \"$sha1$456$xSZGpk6Bp4SA3.cR\", \"$sha1$456$xSZGpk6Bp4SA3.cR$d7E4PuoGZ3ePAS.J9eULvaowNAo3\", \"dRaGoN\" },\n  { \"$sha1$12$GGXpNqoJvglVTkGU\", \"$sha1$12$GGXpNqoJvglVTkGU$DNZfgYD3oaQExTMJjHsHofS6iOR/\", \"DrAgOn\" },\n  { \"$sha1$12$xSZGpk6Bp4SA3.cR\", \"$sha1$12$xSZGpk6Bp4SA3.cR$Tzq4FXgzX2eUrOEy7XCHKszrPEON\", \"DrAgOn\" },\n  { \"$sha1$456$GGXpNqoJvglVTkGU\", \"$sha1$456$GGXpNqoJvglVTkGU$Pf3dQfv5VjzxLNA7jBhbwkmRY8e0\", \"DrAgOn\" },\n  { \"$sha1$456$xSZGpk6Bp4SA3.cR\", \"$sha1$456$xSZGpk6Bp4SA3.cR$4mKiedWXLPWMFMDoJvckdEYMtO5c\", \"DrAgOn\" },\n  { \"$sha1$12$GGXpNqoJvglVTkGU\", \"$sha1$12$GGXpNqoJvglVTkGU$r0aGVbba/xYqyrbqA3wgyZxP8tJ8\", \"PAROLX\" },\n  { \"$sha1$12$xSZGpk6Bp4SA3.cR\", \"$sha1$12$xSZGpk6Bp4SA3.cR$SRq1Cdzi8fO5XwMVRQzziI6KD2Ig\", \"PAROLX\" },\n  { \"$sha1$456$GGXpNqoJvglVTkGU\", \"$sha1$456$GGXpNqoJvglVTkGU$Gfl6qj9WB6pRmNJfpblIp7G2XQyO\", \"PAROLX\" },\n  { \"$sha1$456$xSZGpk6Bp4SA3.cR\", \"$sha1$456$xSZGpk6Bp4SA3.cR$fPmhu.0LXBK3ORrPCY2p2UtsrG4o\", \"PAROLX\" },\n  { \"$sha1$12$GGXpNqoJvglVTkGU\", \"$sha1$12$GGXpNqoJvglVTkGU$VQj1n8LC/BS5EMdvj2aI3vTgCE6U\", \"U*U***U\" },\n  { \"$sha1$12$xSZGpk6Bp4SA3.cR\", \"$sha1$12$xSZGpk6Bp4SA3.cR$fNI2qxRjcTxlbYO0ih4VOQnZFkQo\", \"U*U***U\" },\n  { \"$sha1$456$GGXpNqoJvglVTkGU\", \"$sha1$456$GGXpNqoJvglVTkGU$nUB9jDUMXrAN4Y8pKrxUTRCbgUCY\", \"U*U***U\" },\n  { \"$sha1$456$xSZGpk6Bp4SA3.cR\", \"$sha1$456$xSZGpk6Bp4SA3.cR$4X9FWFi3F.qq.C0MnsVADBTm2RE7\", \"U*U***U\" },\n  { \"$sha1$12$GGXpNqoJvglVTkGU\", \"$sha1$12$GGXpNqoJvglVTkGU$2iFSnCvKPCM4SybxdZhExWkOtNPH\", \"abcdefg\" },\n  { \"$sha1$12$xSZGpk6Bp4SA3.cR\", \"$sha1$12$xSZGpk6Bp4SA3.cR$5aGivE87bTt/BPyyzJIqrjoktC7T\", \"abcdefg\" },\n  { \"$sha1$456$GGXpNqoJvglVTkGU\", \"$sha1$456$GGXpNqoJvglVTkGU$owUknBv4X0E6arjEmMmd0X0/0LjX\", \"abcdefg\" },\n  { \"$sha1$456$xSZGpk6Bp4SA3.cR\", \"$sha1$456$xSZGpk6Bp4SA3.cR$M4F2I58zN8OAd1yYs1JShB7fFgUl\", \"abcdefg\" },\n  { \"$sha1$12$GGXpNqoJvglVTkGU\", \"$sha1$12$GGXpNqoJvglVTkGU$M6hIV6GFtpCL.paD1vY.uOqJGhFx\", \"01234567\" },\n  { \"$sha1$12$xSZGpk6Bp4SA3.cR\", \"$sha1$12$xSZGpk6Bp4SA3.cR$Z5GTMuJ8/Y.4b4cOdiTOwnkNxdst\", \"01234567\" },\n  { \"$sha1$456$GGXpNqoJvglVTkGU\", \"$sha1$456$GGXpNqoJvglVTkGU$mNvcvlHj8O4DSYc0NJfvMnxaX0yf\", \"01234567\" },\n  { \"$sha1$456$xSZGpk6Bp4SA3.cR\", \"$sha1$456$xSZGpk6Bp4SA3.cR$0H2y1zjvHhq37bRqD.d6WtKKsjXq\", \"01234567\" },\n  { \"$sha1$12$GGXpNqoJvglVTkGU\", \"$sha1$12$GGXpNqoJvglVTkGU$gmebmy9.lK7EqTNQN.yvtgRhSqzk\", \"726 even\" },\n  { \"$sha1$12$xSZGpk6Bp4SA3.cR\", \"$sha1$12$xSZGpk6Bp4SA3.cR$QUzJhvdFR.heRuTvVw7EtAL4LBiS\", \"726 even\" },\n  { \"$sha1$456$GGXpNqoJvglVTkGU\", \"$sha1$456$GGXpNqoJvglVTkGU$ex/Gy/D8ayFSi9hMqEuHLYQ86xGr\", \"726 even\" },\n  { \"$sha1$456$xSZGpk6Bp4SA3.cR\", \"$sha1$456$xSZGpk6Bp4SA3.cR$9qGm6Rhl0ZsBXC3TVQaQQHJV71C8\", \"726 even\" },\n  { \"$sha1$12$GGXpNqoJvglVTkGU\", \"$sha1$12$GGXpNqoJvglVTkGU$HmPjxO0O4Vj2cxxMgK9T2ut2xSUY\", \"zyxwvuts\" },\n  { \"$sha1$12$xSZGpk6Bp4SA3.cR\", \"$sha1$12$xSZGpk6Bp4SA3.cR$Zs.U4S3bCpJ4kTgS4u40oFYo.SiX\", \"zyxwvuts\" },\n  { \"$sha1$456$GGXpNqoJvglVTkGU\", \"$sha1$456$GGXpNqoJvglVTkGU$JHY.q2lZMVF/j9z0MpUGYmT90cgI\", \"zyxwvuts\" },\n  { \"$sha1$456$xSZGpk6Bp4SA3.cR\", \"$sha1$456$xSZGpk6Bp4SA3.cR$CR705j9gESaj4PNTSKrqnBtj6AJr\", \"zyxwvuts\" },\n  { \"$sha1$12$GGXpNqoJvglVTkGU\", \"$sha1$12$GGXpNqoJvglVTkGU$0gzRQyn63KJGHz2IgBC5Vtiurlfv\", \"ab1234567\" },\n  { \"$sha1$12$xSZGpk6Bp4SA3.cR\", \"$sha1$12$xSZGpk6Bp4SA3.cR$0TZCcjXB1.FyrqljAUJaVxbxukTc\", \"ab1234567\" },\n  { \"$sha1$456$GGXpNqoJvglVTkGU\", \"$sha1$456$GGXpNqoJvglVTkGU$HCJq4IwHYFgr0qBYctL0rwoXNnlE\", \"ab1234567\" },\n  { \"$sha1$456$xSZGpk6Bp4SA3.cR\", \"$sha1$456$xSZGpk6Bp4SA3.cR$y6RIbBXKq/U9DgS4qYr6d8EkFFyI\", \"ab1234567\" },\n  { \"$sha1$12$GGXpNqoJvglVTkGU\", \"$sha1$12$GGXpNqoJvglVTkGU$RRUYOaZ.yperjvWOWC8eqDURG0X8\", \"alexander\" },\n  { \"$sha1$12$xSZGpk6Bp4SA3.cR\", \"$sha1$12$xSZGpk6Bp4SA3.cR$gxwXwNNVJUfd4bNTGwx2hio/DuWD\", \"alexander\" },\n  { \"$sha1$456$GGXpNqoJvglVTkGU\", \"$sha1$456$GGXpNqoJvglVTkGU$MH0L6iqWqUAR5q5VKf4kCjgXQpun\", \"alexander\" },\n  { \"$sha1$456$xSZGpk6Bp4SA3.cR\", \"$sha1$456$xSZGpk6Bp4SA3.cR$EBWqMJGdGmlkPJ3hMKy9G9EnO5Cj\", \"alexander\" },\n  { \"$sha1$12$GGXpNqoJvglVTkGU\", \"$sha1$12$GGXpNqoJvglVTkGU$iGbi33LAG//xo7P9OrVgt2e9uG3D\", \"beautiful\" },\n  { \"$sha1$12$xSZGpk6Bp4SA3.cR\", \"$sha1$12$xSZGpk6Bp4SA3.cR$.U8q9ng/yLORWouONPNqpC/yMTKt\", \"beautiful\" },\n  { \"$sha1$456$GGXpNqoJvglVTkGU\", \"$sha1$456$GGXpNqoJvglVTkGU$exwvD8qwsBWPbRWPgh6BalAGjDgM\", \"beautiful\" },\n  { \"$sha1$456$xSZGpk6Bp4SA3.cR\", \"$sha1$456$xSZGpk6Bp4SA3.cR$0zUI1qcqZdmaHgKDOrcisK0FGddE\", \"beautiful\" },\n  { \"$sha1$12$GGXpNqoJvglVTkGU\", \"$sha1$12$GGXpNqoJvglVTkGU$Z/.IGAXegw2kcp3NrpNA.b3TExw/\", \"challenge\" },\n  { \"$sha1$12$xSZGpk6Bp4SA3.cR\", \"$sha1$12$xSZGpk6Bp4SA3.cR$Oamt4nNqncjsLrQlCdxUCAztbn2m\", \"challenge\" },\n  { \"$sha1$456$GGXpNqoJvglVTkGU\", \"$sha1$456$GGXpNqoJvglVTkGU$7FytHUwn/VBgEtmKVFe4yRz8b9Ha\", \"challenge\" },\n  { \"$sha1$456$xSZGpk6Bp4SA3.cR\", \"$sha1$456$xSZGpk6Bp4SA3.cR$0jVKVGrN0wvtOMFYrT4bkB/oO3Gv\", \"challenge\" },\n  { \"$sha1$12$GGXpNqoJvglVTkGU\", \"$sha1$12$GGXpNqoJvglVTkGU$HhRx/Ht9CLmpMKHW4Be0u1lGp5xk\", \"chocolate\" },\n  { \"$sha1$12$xSZGpk6Bp4SA3.cR\", \"$sha1$12$xSZGpk6Bp4SA3.cR$dqVgEi8YKsf786zDZPt3FHsPmqL3\", \"chocolate\" },\n  { \"$sha1$456$GGXpNqoJvglVTkGU\", \"$sha1$456$GGXpNqoJvglVTkGU$UPUpnKhJdSi795DMLIlTkz.zKj9s\", \"chocolate\" },\n  { \"$sha1$456$xSZGpk6Bp4SA3.cR\", \"$sha1$456$xSZGpk6Bp4SA3.cR$V5h6.MG39oli0U5PCZOnauukWonp\", \"chocolate\" },\n  { \"$sha1$12$GGXpNqoJvglVTkGU\", \"$sha1$12$GGXpNqoJvglVTkGU$j3UfDsKNCssFBTPEka8mKGvLiest\", \"cr1234567\" },\n  { \"$sha1$12$xSZGpk6Bp4SA3.cR\", \"$sha1$12$xSZGpk6Bp4SA3.cR$/peMa2rTr0qQjcHGpJaI3PS.W/rb\", \"cr1234567\" },\n  { \"$sha1$456$GGXpNqoJvglVTkGU\", \"$sha1$456$GGXpNqoJvglVTkGU$1W303Nca3i3PvnmrkZr9EM6A6Mt7\", \"cr1234567\" },\n  { \"$sha1$456$xSZGpk6Bp4SA3.cR\", \"$sha1$456$xSZGpk6Bp4SA3.cR$5bB4M/IQSjj6nqdZr.DbzrN0MY/N\", \"cr1234567\" },\n  { \"$sha1$12$GGXpNqoJvglVTkGU\", \"$sha1$12$GGXpNqoJvglVTkGU$nxQZcrYTwloQ3SfLMqtFm/kKJqH6\", \"katherine\" },\n  { \"$sha1$12$xSZGpk6Bp4SA3.cR\", \"$sha1$12$xSZGpk6Bp4SA3.cR$S7FblxEUCvl8nFqlPeX8ezoGRK0I\", \"katherine\" },\n  { \"$sha1$456$GGXpNqoJvglVTkGU\", \"$sha1$456$GGXpNqoJvglVTkGU$WtogReSEY.tPLsA0KYAd1emXnG.o\", \"katherine\" },\n  { \"$sha1$456$xSZGpk6Bp4SA3.cR\", \"$sha1$456$xSZGpk6Bp4SA3.cR$7siI6B3pe.tSom1SFZpw8JwmGJ2P\", \"katherine\" },\n  { \"$sha1$12$GGXpNqoJvglVTkGU\", \"$sha1$12$GGXpNqoJvglVTkGU$Ihx3taVNZ7adhKZV3gEqexuZLEzJ\", \"stephanie\" },\n  { \"$sha1$12$xSZGpk6Bp4SA3.cR\", \"$sha1$12$xSZGpk6Bp4SA3.cR$POJf5NDie5l91DNDMTrspav9haEX\", \"stephanie\" },\n  { \"$sha1$456$GGXpNqoJvglVTkGU\", \"$sha1$456$GGXpNqoJvglVTkGU$DHhjdouuLTqY4sIg5BQFHvRJyOkM\", \"stephanie\" },\n  { \"$sha1$456$xSZGpk6Bp4SA3.cR\", \"$sha1$456$xSZGpk6Bp4SA3.cR$i/wXlVLnQbnsuoesL8tbxh/7DKi3\", \"stephanie\" },\n  { \"$sha1$12$GGXpNqoJvglVTkGU\", \"$sha1$12$GGXpNqoJvglVTkGU$18wDgMPoMpl4DIfY3uVzFtSvz.Rz\", \"sunflower\" },\n  { \"$sha1$12$xSZGpk6Bp4SA3.cR\", \"$sha1$12$xSZGpk6Bp4SA3.cR$fH9G35dSxw62qYaVYR07a9fn6lbM\", \"sunflower\" },\n  { \"$sha1$456$GGXpNqoJvglVTkGU\", \"$sha1$456$GGXpNqoJvglVTkGU$yW9TNxSlAShsumhwq15AWtKvwxjz\", \"sunflower\" },\n  { \"$sha1$456$xSZGpk6Bp4SA3.cR\", \"$sha1$456$xSZGpk6Bp4SA3.cR$iteXYw8XvE76pdHzS3EV9kzNCCH5\", \"sunflower\" },\n  { \"$sha1$12$GGXpNqoJvglVTkGU\", \"$sha1$12$GGXpNqoJvglVTkGU$0Em11nwLcF1KLAFrPIVImhyDDg3H\", \"basketball\" },\n  { \"$sha1$12$xSZGpk6Bp4SA3.cR\", \"$sha1$12$xSZGpk6Bp4SA3.cR$08jDlHINxEuFBSRMgGes0Agbyo9G\", \"basketball\" },\n  { \"$sha1$456$GGXpNqoJvglVTkGU\", \"$sha1$456$GGXpNqoJvglVTkGU$uTKagARWVMMfvR1SfdXwktF1N8D4\", \"basketball\" },\n  { \"$sha1$456$xSZGpk6Bp4SA3.cR\", \"$sha1$456$xSZGpk6Bp4SA3.cR$LWrJCyly9hZYMNdIYmJeFt1NL7.x\", \"basketball\" },\n  { \"$sha1$12$GGXpNqoJvglVTkGU\", \"$sha1$12$GGXpNqoJvglVTkGU$bJq.vrY7Hepqu.MQN0RjksUq1g1F\", \"porsche911\" },\n  { \"$sha1$12$xSZGpk6Bp4SA3.cR\", \"$sha1$12$xSZGpk6Bp4SA3.cR$vUCwAW3S7V3ShfjByPUZjXvkkLlc\", \"porsche911\" },\n  { \"$sha1$456$GGXpNqoJvglVTkGU\", \"$sha1$456$GGXpNqoJvglVTkGU$xCUDZyBf734N97WiX61DCU2MyM7C\", \"porsche911\" },\n  { \"$sha1$456$xSZGpk6Bp4SA3.cR\", \"$sha1$456$xSZGpk6Bp4SA3.cR$SkP.k3PSMo8H7DZXj1VEkIgH/YPn\", \"porsche911\" },\n  { \"$sha1$12$GGXpNqoJvglVTkGU\", \"$sha1$12$GGXpNqoJvglVTkGU$WFygibX0dgvTCbTvVwhLE3fDn0QK\", \"|_337T`/p3\" },\n  { \"$sha1$12$xSZGpk6Bp4SA3.cR\", \"$sha1$12$xSZGpk6Bp4SA3.cR$tu0rAC7uzczRfKZBACsIOyoXQ1e9\", \"|_337T`/p3\" },\n  { \"$sha1$456$GGXpNqoJvglVTkGU\", \"$sha1$456$GGXpNqoJvglVTkGU$tHjMHWZ1Ed.mJ/1hOxi8lxU5Wp5n\", \"|_337T`/p3\" },\n  { \"$sha1$456$xSZGpk6Bp4SA3.cR\", \"$sha1$456$xSZGpk6Bp4SA3.cR$wpFfxr5WYr3HChe6cA8r4XhphGf/\", \"|_337T`/p3\" },\n  { \"$sha1$12$GGXpNqoJvglVTkGU\", \"$sha1$12$GGXpNqoJvglVTkGU$iJ1CqxIlvrZ09jI9w.o3Zc3dsoEq\", \"thunderbird\" },\n  { \"$sha1$12$xSZGpk6Bp4SA3.cR\", \"$sha1$12$xSZGpk6Bp4SA3.cR$TFfFzeE6VstiWlsO2E6RGTxR4J62\", \"thunderbird\" },\n  { \"$sha1$456$GGXpNqoJvglVTkGU\", \"$sha1$456$GGXpNqoJvglVTkGU$sgKMac/nyL2FtRxlfIBoVCKiVNen\", \"thunderbird\" },\n  { \"$sha1$456$xSZGpk6Bp4SA3.cR\", \"$sha1$456$xSZGpk6Bp4SA3.cR$op47uCExlJzZcxLrW2VuS5HZYY3I\", \"thunderbird\" },\n  { \"$sha1$12$GGXpNqoJvglVTkGU\", \"$sha1$12$GGXpNqoJvglVTkGU$PuVU6CGbpBXBpK2bHZo/Ut0E0aBw\", \"Hello world!\" },\n  { \"$sha1$12$xSZGpk6Bp4SA3.cR\", \"$sha1$12$xSZGpk6Bp4SA3.cR$6MwMtjzd/WHzLGSI52GXr/4jX7vL\", \"Hello world!\" },\n  { \"$sha1$456$GGXpNqoJvglVTkGU\", \"$sha1$456$GGXpNqoJvglVTkGU$k1yThyIEpa2h/x6R9yXSSK2Zz7i7\", \"Hello world!\" },\n  { \"$sha1$456$xSZGpk6Bp4SA3.cR\", \"$sha1$456$xSZGpk6Bp4SA3.cR$YTj6RNNa7n7SXzGt728eI4OvWQQm\", \"Hello world!\" },\n  { \"$sha1$12$GGXpNqoJvglVTkGU\", \"$sha1$12$GGXpNqoJvglVTkGU$DgX4wcC2rmpnCUwqS6XtoMeVOQp/\", \"pleaseletmein\" },\n  { \"$sha1$12$xSZGpk6Bp4SA3.cR\", \"$sha1$12$xSZGpk6Bp4SA3.cR$opDsvhROutWpgqX1TDteJS4BUb/I\", \"pleaseletmein\" },\n  { \"$sha1$456$GGXpNqoJvglVTkGU\", \"$sha1$456$GGXpNqoJvglVTkGU$HBeNjwwtfNwV6cYzO/BUeEfpaF/s\", \"pleaseletmein\" },\n  { \"$sha1$456$xSZGpk6Bp4SA3.cR\", \"$sha1$456$xSZGpk6Bp4SA3.cR$fPwPwQD6qSpyM/Y1E1b8pauFj3KC\", \"pleaseletmein\" },\n  { \"$sha1$12$GGXpNqoJvglVTkGU\", \"$sha1$12$GGXpNqoJvglVTkGU$UyN40MGCb8O0QUISTgRP4OihNg1k\", \"a short string\" },\n  { \"$sha1$12$xSZGpk6Bp4SA3.cR\", \"$sha1$12$xSZGpk6Bp4SA3.cR$xdLE8zMImh1y7Dh20mJ4Vnu3/3os\", \"a short string\" },\n  { \"$sha1$456$GGXpNqoJvglVTkGU\", \"$sha1$456$GGXpNqoJvglVTkGU$68q.PY5p2z6J2poLbV0Rmz2b1.Xl\", \"a short string\" },\n  { \"$sha1$456$xSZGpk6Bp4SA3.cR\", \"$sha1$456$xSZGpk6Bp4SA3.cR$OdIS.TLfeSUwNZ95hOaSIYzpt7lO\", \"a short string\" },\n  { \"$sha1$12$GGXpNqoJvglVTkGU\", \"$sha1$12$GGXpNqoJvglVTkGU$w1iV0W6F/mtL82sa5FWreQbw48bE\", \"zxyDPWgydbQjgq\" },\n  { \"$sha1$12$xSZGpk6Bp4SA3.cR\", \"$sha1$12$xSZGpk6Bp4SA3.cR$qxD8BGydfVfk1QUxFANhfeFHc.N5\", \"zxyDPWgydbQjgq\" },\n  { \"$sha1$456$GGXpNqoJvglVTkGU\", \"$sha1$456$GGXpNqoJvglVTkGU$3K9gBj3jbcYY1wLPPJXHM.j8kucB\", \"zxyDPWgydbQjgq\" },\n  { \"$sha1$456$xSZGpk6Bp4SA3.cR\", \"$sha1$456$xSZGpk6Bp4SA3.cR$Fj5uai/pq53MoK36RdhO32o2cL.s\", \"zxyDPWgydbQjgq\" },\n  { \"$sha1$12$GGXpNqoJvglVTkGU\", \"$sha1$12$GGXpNqoJvglVTkGU$kAEDsHJt1FQqZ0Tu.FSND4WzxkIN\", \"photojournalism\" },\n  { \"$sha1$12$xSZGpk6Bp4SA3.cR\", \"$sha1$12$xSZGpk6Bp4SA3.cR$s7VG48i5qlWsi2L9w0b4UtNH8lbO\", \"photojournalism\" },\n  { \"$sha1$456$GGXpNqoJvglVTkGU\", \"$sha1$456$GGXpNqoJvglVTkGU$K84eDZhNb7UPrmYdjK.kZpehcOQV\", \"photojournalism\" },\n  { \"$sha1$456$xSZGpk6Bp4SA3.cR\", \"$sha1$456$xSZGpk6Bp4SA3.cR$Io27rIBMIITCVyiLrAOpXX/qYAKF\", \"photojournalism\" },\n  { \"$sha1$12$GGXpNqoJvglVTkGU\", \"$sha1$12$GGXpNqoJvglVTkGU$MNRGm.wL5SQZeg3LSLYb9YRK777m\", \"ecclesiastically\" },\n  { \"$sha1$12$xSZGpk6Bp4SA3.cR\", \"$sha1$12$xSZGpk6Bp4SA3.cR$aXxTZS6hK6zv7FP8KzTeXzkrzJA2\", \"ecclesiastically\" },\n  { \"$sha1$456$GGXpNqoJvglVTkGU\", \"$sha1$456$GGXpNqoJvglVTkGU$l210wtVdfS5L7zXiAWg8iXwk6YBc\", \"ecclesiastically\" },\n  { \"$sha1$456$xSZGpk6Bp4SA3.cR\", \"$sha1$456$xSZGpk6Bp4SA3.cR$YnrpanJtO5kjtFXT/i.y//.ELHaF\", \"ecclesiastically\" },\n  { \"$sha1$12$GGXpNqoJvglVTkGU\", \"$sha1$12$GGXpNqoJvglVTkGU$M5xx8nh3EgMT9Fc8SAS1adeBrjg2\", \"congregationalism\" },\n  { \"$sha1$12$xSZGpk6Bp4SA3.cR\", \"$sha1$12$xSZGpk6Bp4SA3.cR$Utz7UbQkqKEbg9Cl.qAtSxD2bQsc\", \"congregationalism\" },\n  { \"$sha1$456$GGXpNqoJvglVTkGU\", \"$sha1$456$GGXpNqoJvglVTkGU$G6POXP5uD81VxdvRcFmiOsRWdp.Y\", \"congregationalism\" },\n  { \"$sha1$456$xSZGpk6Bp4SA3.cR\", \"$sha1$456$xSZGpk6Bp4SA3.cR$FfFu2D5UVxnc.xCbmN8HLa6Sdf8J\", \"congregationalism\" },\n  { \"$sha1$12$GGXpNqoJvglVTkGU\", \"$sha1$12$GGXpNqoJvglVTkGU$KJWy.WJVVoxzdlw52Zbg7wT5u9P6\", \"dihydrosphingosine\" },\n  { \"$sha1$12$xSZGpk6Bp4SA3.cR\", \"$sha1$12$xSZGpk6Bp4SA3.cR$DVL.o4xjpNBVKIyv.DP6P5Ip/oCh\", \"dihydrosphingosine\" },\n  { \"$sha1$456$GGXpNqoJvglVTkGU\", \"$sha1$456$GGXpNqoJvglVTkGU$lmAhoTfrOJw0VQpmO.aozByboWER\", \"dihydrosphingosine\" },\n  { \"$sha1$456$xSZGpk6Bp4SA3.cR\", \"$sha1$456$xSZGpk6Bp4SA3.cR$iMdTClqZUleHuCqlGR9LUWahy7tB\", \"dihydrosphingosine\" },\n  { \"$sha1$12$GGXpNqoJvglVTkGU\", \"$sha1$12$GGXpNqoJvglVTkGU$wFokh3I6d6MEVZbvUZNqXSIi1rKY\", \"semianthropological\" },\n  { \"$sha1$12$xSZGpk6Bp4SA3.cR\", \"$sha1$12$xSZGpk6Bp4SA3.cR$3yvWSwVTW/OnnJ1dFqoaANuf9y59\", \"semianthropological\" },\n  { \"$sha1$456$GGXpNqoJvglVTkGU\", \"$sha1$456$GGXpNqoJvglVTkGU$AanEEj8ov9AzQ6I0WErvvUgS1Vt9\", \"semianthropological\" },\n  { \"$sha1$456$xSZGpk6Bp4SA3.cR\", \"$sha1$456$xSZGpk6Bp4SA3.cR$Hfj8iZBDJLyu/nLgdtasfsw2eQMb\", \"semianthropological\" },\n  { \"$sha1$12$GGXpNqoJvglVTkGU\", \"$sha1$12$GGXpNqoJvglVTkGU$f98fwWZutzgZuZjwsLyX.F1kg4Wl\", \"palaeogeographically\" },\n  { \"$sha1$12$xSZGpk6Bp4SA3.cR\", \"$sha1$12$xSZGpk6Bp4SA3.cR$Aa/5Of9op0oQGHKrUazFLabsQs.V\", \"palaeogeographically\" },\n  { \"$sha1$456$GGXpNqoJvglVTkGU\", \"$sha1$456$GGXpNqoJvglVTkGU$6rChzFn2O5shSlB0icdWgCoAo8jL\", \"palaeogeographically\" },\n  { \"$sha1$456$xSZGpk6Bp4SA3.cR\", \"$sha1$456$xSZGpk6Bp4SA3.cR$e4v.geXpULpj0zDgQ3X68lMx1Q5i\", \"palaeogeographically\" },\n  { \"$sha1$12$GGXpNqoJvglVTkGU\", \"$sha1$12$GGXpNqoJvglVTkGU$gt91MtFM2Bl7C4/bxZXT7o6UAMtf\", \"electromyographically\" },\n  { \"$sha1$12$xSZGpk6Bp4SA3.cR\", \"$sha1$12$xSZGpk6Bp4SA3.cR$8yVB9AjSAx7D5DKXoWbMIED.qkBV\", \"electromyographically\" },\n  { \"$sha1$456$GGXpNqoJvglVTkGU\", \"$sha1$456$GGXpNqoJvglVTkGU$39/p9L/UINfnGjcOiD/SbH.qIf0d\", \"electromyographically\" },\n  { \"$sha1$456$xSZGpk6Bp4SA3.cR\", \"$sha1$456$xSZGpk6Bp4SA3.cR$cMrppqBODRDidLPKsp7dIeMvLnnz\", \"electromyographically\" },\n  { \"$sha1$12$GGXpNqoJvglVTkGU\", \"$sha1$12$GGXpNqoJvglVTkGU$PIcK7/MRaVxd7TXqrwf4wpdxOBS9\", \"noninterchangeableness\" },\n  { \"$sha1$12$xSZGpk6Bp4SA3.cR\", \"$sha1$12$xSZGpk6Bp4SA3.cR$u42HIhhX7Ko/UwjkVmNM3rL9AN5D\", \"noninterchangeableness\" },\n  { \"$sha1$456$GGXpNqoJvglVTkGU\", \"$sha1$456$GGXpNqoJvglVTkGU$elEqLPmkxasI85MJ474OeXEwNfR1\", \"noninterchangeableness\" },\n  { \"$sha1$456$xSZGpk6Bp4SA3.cR\", \"$sha1$456$xSZGpk6Bp4SA3.cR$IfJmIXui7p1HmG5FkiNKSecE7vXa\", \"noninterchangeableness\" },\n  { \"$sha1$12$GGXpNqoJvglVTkGU\", \"$sha1$12$GGXpNqoJvglVTkGU$ASOcvYQ6KrSjxyjw1togF9n9VCBV\", \"abcdefghijklmnopqrstuvwxyz\" },\n  { \"$sha1$12$xSZGpk6Bp4SA3.cR\", \"$sha1$12$xSZGpk6Bp4SA3.cR$uAqgtGfbcUMbHvctwCQBH3pMnO4i\", \"abcdefghijklmnopqrstuvwxyz\" },\n  { \"$sha1$456$GGXpNqoJvglVTkGU\", \"$sha1$456$GGXpNqoJvglVTkGU$G36.DfuxWCD5nnv/Dti82e/a.2xQ\", \"abcdefghijklmnopqrstuvwxyz\" },\n  { \"$sha1$456$xSZGpk6Bp4SA3.cR\", \"$sha1$456$xSZGpk6Bp4SA3.cR$RBMU8K0iB26X8/6x.qjaFYKh/uD9\", \"abcdefghijklmnopqrstuvwxyz\" },\n  { \"$sha1$12$GGXpNqoJvglVTkGU\", \"$sha1$12$GGXpNqoJvglVTkGU$CxIqcg69KfRz5gDOABfWHLwcNf5Y\", \"electroencephalographically\" },\n  { \"$sha1$12$xSZGpk6Bp4SA3.cR\", \"$sha1$12$xSZGpk6Bp4SA3.cR$e0BgTV7r/gJ6OV12dJXVzcUEkG6j\", \"electroencephalographically\" },\n  { \"$sha1$456$GGXpNqoJvglVTkGU\", \"$sha1$456$GGXpNqoJvglVTkGU$A9Qg0.8NvqaPKfMB2dcUNC3alaRl\", \"electroencephalographically\" },\n  { \"$sha1$456$xSZGpk6Bp4SA3.cR\", \"$sha1$456$xSZGpk6Bp4SA3.cR$pnt/NwsBoNzYemC.xt/fydIN56hY\", \"electroencephalographically\" },\n  { \"$sha1$12$GGXpNqoJvglVTkGU\", \"$sha1$12$GGXpNqoJvglVTkGU$Wc/4rTJImQHAUQ/Fi5B7O6gxM.BI\", \"antidisestablishmentarianism\" },\n  { \"$sha1$12$xSZGpk6Bp4SA3.cR\", \"$sha1$12$xSZGpk6Bp4SA3.cR$X.JadOXA86ypgkqIM4v3pi5kNKHv\", \"antidisestablishmentarianism\" },\n  { \"$sha1$456$GGXpNqoJvglVTkGU\", \"$sha1$456$GGXpNqoJvglVTkGU$gmJ7rzVSZSdx6/17wwo0D/mtZ6Eb\", \"antidisestablishmentarianism\" },\n  { \"$sha1$456$xSZGpk6Bp4SA3.cR\", \"$sha1$456$xSZGpk6Bp4SA3.cR$1LtFfVPtd.XqVQYp.TZue1IB5xkf\", \"antidisestablishmentarianism\" },\n  { \"$sha1$12$GGXpNqoJvglVTkGU\", \"$sha1$12$GGXpNqoJvglVTkGU$ocG2YkRNcs6PNTgWNKHr2WgrFIBD\", \"cyclotrimethylenetrinitramine\" },\n  { \"$sha1$12$xSZGpk6Bp4SA3.cR\", \"$sha1$12$xSZGpk6Bp4SA3.cR$7nUx7vXFrbEozgASvE25dpnTqb74\", \"cyclotrimethylenetrinitramine\" },\n  { \"$sha1$456$GGXpNqoJvglVTkGU\", \"$sha1$456$GGXpNqoJvglVTkGU$vnNqeP1JkhXF.vQoIjD5GirjNDQa\", \"cyclotrimethylenetrinitramine\" },\n  { \"$sha1$456$xSZGpk6Bp4SA3.cR\", \"$sha1$456$xSZGpk6Bp4SA3.cR$hjpC1EhsF7FfVORbQZxEgKJyv2X4\", \"cyclotrimethylenetrinitramine\" },\n  { \"$sha1$12$GGXpNqoJvglVTkGU\", \"$sha1$12$GGXpNqoJvglVTkGU$x19TSKExVjDXMSyIKnNWUTDDw/U7\", \"dichlorodiphenyltrichloroethane\" },\n  { \"$sha1$12$xSZGpk6Bp4SA3.cR\", \"$sha1$12$xSZGpk6Bp4SA3.cR$LvENCurrUesWUzDpnt3vmdniZVNr\", \"dichlorodiphenyltrichloroethane\" },\n  { \"$sha1$456$GGXpNqoJvglVTkGU\", \"$sha1$456$GGXpNqoJvglVTkGU$vEvISAotLlSUu/MBBQljm1YQHR9B\", \"dichlorodiphenyltrichloroethane\" },\n  { \"$sha1$456$xSZGpk6Bp4SA3.cR\", \"$sha1$456$xSZGpk6Bp4SA3.cR$1356iAygxiV16hrelgftX56IU6mO\", \"dichlorodiphenyltrichloroethane\" },\n  { \"$sha1$12$GGXpNqoJvglVTkGU\", \"$sha1$12$GGXpNqoJvglVTkGU$kKf99s.OHwqpY2LveX5WHFjsiE6F\", \"multiple words seperated by spaces\" },\n  { \"$sha1$12$xSZGpk6Bp4SA3.cR\", \"$sha1$12$xSZGpk6Bp4SA3.cR$VZ618mejjM3bg1Nb4hfkSQ4dA6XF\", \"multiple words seperated by spaces\" },\n  { \"$sha1$456$GGXpNqoJvglVTkGU\", \"$sha1$456$GGXpNqoJvglVTkGU$NWO5CzgmNreB5xeYHHZpdlikRY19\", \"multiple words seperated by spaces\" },\n  { \"$sha1$456$xSZGpk6Bp4SA3.cR\", \"$sha1$456$xSZGpk6Bp4SA3.cR$eYjLRVTbSq/5jfSAxW26jBGYSxWo\", \"multiple words seperated by spaces\" },\n  { \"$sha1$12$GGXpNqoJvglVTkGU\", \"$sha1$12$GGXpNqoJvglVTkGU$EMUFfKSlnt3P5qLKLwVg0jw24BuY\", \"supercalifragilisticexpialidocious\" },\n  { \"$sha1$12$xSZGpk6Bp4SA3.cR\", \"$sha1$12$xSZGpk6Bp4SA3.cR$WA62oqmOX.XSPVU5k7vbdaA0E.iP\", \"supercalifragilisticexpialidocious\" },\n  { \"$sha1$456$GGXpNqoJvglVTkGU\", \"$sha1$456$GGXpNqoJvglVTkGU$jWKRusipT76SKKq5Z4zxHHUfpVPc\", \"supercalifragilisticexpialidocious\" },\n  { \"$sha1$456$xSZGpk6Bp4SA3.cR\", \"$sha1$456$xSZGpk6Bp4SA3.cR$lHYEbGhKrM1ZRmqfPXwip4vB0RHh\", \"supercalifragilisticexpialidocious\" },\n  { \"$sha1$12$GGXpNqoJvglVTkGU\", \"$sha1$12$GGXpNqoJvglVTkGU$dAlnKRbxkRevFazvhmarOTYsDf4S\", \"we have a short salt string but not a short password\" },\n  { \"$sha1$12$xSZGpk6Bp4SA3.cR\", \"$sha1$12$xSZGpk6Bp4SA3.cR$M8EB8h612uUYJOb6YX9fCgkipg0I\", \"we have a short salt string but not a short password\" },\n  { \"$sha1$456$GGXpNqoJvglVTkGU\", \"$sha1$456$GGXpNqoJvglVTkGU$a3a6IiZcLcgWFnohYpkGr8R/W69K\", \"we have a short salt string but not a short password\" },\n  { \"$sha1$456$xSZGpk6Bp4SA3.cR\", \"$sha1$456$xSZGpk6Bp4SA3.cR$sFftXTj3mcMa.w/JEXAXqIPbabHi\", \"we have a short salt string but not a short password\" },\n  { \"$sha1$12$GGXpNqoJvglVTkGU\", \"$sha1$12$GGXpNqoJvglVTkGU$totaKtwNhKQeSQwaKC.yUAhFPygz\", \"multiple word$ $eperated by $pace$ and $pecial character$\" },\n  { \"$sha1$12$xSZGpk6Bp4SA3.cR\", \"$sha1$12$xSZGpk6Bp4SA3.cR$3eezBADzknYJlMQkLtacHpC6yntw\", \"multiple word$ $eperated by $pace$ and $pecial character$\" },\n  { \"$sha1$456$GGXpNqoJvglVTkGU\", \"$sha1$456$GGXpNqoJvglVTkGU$egR8TbSSRwXWtSC1EXLio2KOdgxv\", \"multiple word$ $eperated by $pace$ and $pecial character$\" },\n  { \"$sha1$456$xSZGpk6Bp4SA3.cR\", \"$sha1$456$xSZGpk6Bp4SA3.cR$AQyOn73WUdoqbng..Yn9XY58fZLq\", \"multiple word$ $eperated by $pace$ and $pecial character$\" },\n  { \"$sha1$12$GGXpNqoJvglVTkGU\", \"$sha1$12$GGXpNqoJvglVTkGU$.yQeSaMQGCtUbFu7Nis2LgV4diTq\", \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\" },\n  { \"$sha1$12$xSZGpk6Bp4SA3.cR\", \"$sha1$12$xSZGpk6Bp4SA3.cR$QIaR47vjsMev9DryhApi.FDIqp7u\", \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\" },\n  { \"$sha1$456$GGXpNqoJvglVTkGU\", \"$sha1$456$GGXpNqoJvglVTkGU$I4fLJArARSUzQWm1CgAxV6RpSNBC\", \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\" },\n  { \"$sha1$456$xSZGpk6Bp4SA3.cR\", \"$sha1$456$xSZGpk6Bp4SA3.cR$P.Sit/qwokwD8t243bDpdIOFtOBk\", \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\" },\n  { \"$sha1$12$GGXpNqoJvglVTkGU\", \"$sha1$12$GGXpNqoJvglVTkGU$cFA0MAClwyaJrcmclfBUfFwK669W\", \"12345678901234567890123456789012345678901234567890123456789012345678901234567890\" },\n  { \"$sha1$12$xSZGpk6Bp4SA3.cR\", \"$sha1$12$xSZGpk6Bp4SA3.cR$cx27ZSgKzTqTHFV.BuEFb9cHYsuc\", \"12345678901234567890123456789012345678901234567890123456789012345678901234567890\" },\n  { \"$sha1$456$GGXpNqoJvglVTkGU\", \"$sha1$456$GGXpNqoJvglVTkGU$ZFZtRdHUomKSku3pbuYMXPDnaXns\", \"12345678901234567890123456789012345678901234567890123456789012345678901234567890\" },\n  { \"$sha1$456$xSZGpk6Bp4SA3.cR\", \"$sha1$456$xSZGpk6Bp4SA3.cR$vpa7TDRCaPWqIGCJmzQpSMXOac72\", \"12345678901234567890123456789012345678901234567890123456789012345678901234567890\" },\n  { \"$sha1$12$GGXpNqoJvglVTkGU\", \"$sha1$12$GGXpNqoJvglVTkGU$YX.gyNn4gBiBmAAh7bZxa/.8kqjJ\", \"a very much longer text to encrypt.  This one even stretches over morethan one line.\" },\n  { \"$sha1$12$xSZGpk6Bp4SA3.cR\", \"$sha1$12$xSZGpk6Bp4SA3.cR$373JT1JmfaVV9AeQrLmvWlvIINrO\", \"a very much longer text to encrypt.  This one even stretches over morethan one line.\" },\n  { \"$sha1$456$GGXpNqoJvglVTkGU\", \"$sha1$456$GGXpNqoJvglVTkGU$lPJO0.dokdHxd/afTKVWV6Vad/Qq\", \"a very much longer text to encrypt.  This one even stretches over morethan one line.\" },\n  { \"$sha1$456$xSZGpk6Bp4SA3.cR\", \"$sha1$456$xSZGpk6Bp4SA3.cR$7QI1x38cNArM3d.iQmKcTgnNBMG7\", \"a very much longer text to encrypt.  This one even stretches over morethan one line.\" },\n  { \"$sha1$12$GGXpNqoJvglVTkGU\", \"$sha1$12$GGXpNqoJvglVTkGU$XYVNV1cIL8JC0X0cPfexSxGGaV7V\", \"\\xd0\\xc1\\xd2\\xcf\\xcc\\xd8\" },\n  { \"$sha1$12$xSZGpk6Bp4SA3.cR\", \"$sha1$12$xSZGpk6Bp4SA3.cR$bzkDR/NH12RDEpw2R85IV4oLzcoB\", \"\\xd0\\xc1\\xd2\\xcf\\xcc\\xd8\" },\n  { \"$sha1$456$GGXpNqoJvglVTkGU\", \"$sha1$456$GGXpNqoJvglVTkGU$khPUkoK8qbdfSnGDXnVmpQhg/K9G\", \"\\xd0\\xc1\\xd2\\xcf\\xcc\\xd8\" },\n  { \"$sha1$456$xSZGpk6Bp4SA3.cR\", \"$sha1$456$xSZGpk6Bp4SA3.cR$BWHrUET42Seg2xQswoM7vGA6Rb.N\", \"\\xd0\\xc1\\xd2\\xcf\\xcc\\xd8\" },\n  { \"$sha1$12$GGXpNqoJvglVTkGU\", \"$sha1$12$GGXpNqoJvglVTkGU$fSzKUkeUwNHR22UA6EAPpYpwPVV4\", \"\\xd5\\xaa\\xd5\\xaa\\xaa\\xaa\\xd5\\xaa\" },\n  { \"$sha1$12$xSZGpk6Bp4SA3.cR\", \"$sha1$12$xSZGpk6Bp4SA3.cR$Wa20muWTx1gfUK2mPpmpLOrA6cpS\", \"\\xd5\\xaa\\xd5\\xaa\\xaa\\xaa\\xd5\\xaa\" },\n  { \"$sha1$456$GGXpNqoJvglVTkGU\", \"$sha1$456$GGXpNqoJvglVTkGU$ifDXWLRvPtxTQsypEXjmrPkBA8Fc\", \"\\xd5\\xaa\\xd5\\xaa\\xaa\\xaa\\xd5\\xaa\" },\n  { \"$sha1$456$xSZGpk6Bp4SA3.cR\", \"$sha1$456$xSZGpk6Bp4SA3.cR$ZuuDg00sSwS8Th2kaInFXO5dzE0O\", \"\\xd5\\xaa\\xd5\\xaa\\xaa\\xaa\\xd5\\xaa\" },\n  { \"$sha1$12$GGXpNqoJvglVTkGU\", \"$sha1$12$GGXpNqoJvglVTkGU$cS77z/5fVKbBLitvpVnIRc09YQOq\", \"\\xe1\\xec\\xe5\\xf8\\xe1\\xee\\xe4\\xe5\\xf2\" },\n  { \"$sha1$12$xSZGpk6Bp4SA3.cR\", \"$sha1$12$xSZGpk6Bp4SA3.cR$FzK5Ah9WgwSdtxI3dGeHK/qyR2Hr\", \"\\xe1\\xec\\xe5\\xf8\\xe1\\xee\\xe4\\xe5\\xf2\" },\n  { \"$sha1$456$GGXpNqoJvglVTkGU\", \"$sha1$456$GGXpNqoJvglVTkGU$pmpqhNVz7HkddH1PTqGuiPEQPnhp\", \"\\xe1\\xec\\xe5\\xf8\\xe1\\xee\\xe4\\xe5\\xf2\" },\n  { \"$sha1$456$xSZGpk6Bp4SA3.cR\", \"$sha1$456$xSZGpk6Bp4SA3.cR$lhLC53WDd/ZG3V34K2ebX5urtYNR\", \"\\xe1\\xec\\xe5\\xf8\\xe1\\xee\\xe4\\xe5\\xf2\" },\n  { \"$sha1$12$GGXpNqoJvglVTkGU\", \"$sha1$12$GGXpNqoJvglVTkGU$nFaf9rBqbWSazj.ooHq1.CT1ieNw\", \"\\xf3\\xf4\\xe5\\xf0\\xe8\\xe1\\xee\\xe9\\xe5\" },\n  { \"$sha1$12$xSZGpk6Bp4SA3.cR\", \"$sha1$12$xSZGpk6Bp4SA3.cR$RcjRuWvnAr32tc/mzFRNbeT4q/I8\", \"\\xf3\\xf4\\xe5\\xf0\\xe8\\xe1\\xee\\xe9\\xe5\" },\n  { \"$sha1$456$GGXpNqoJvglVTkGU\", \"$sha1$456$GGXpNqoJvglVTkGU$rg6RVehnME3TwNGxauBeFYnMohL.\", \"\\xf3\\xf4\\xe5\\xf0\\xe8\\xe1\\xee\\xe9\\xe5\" },\n  { \"$sha1$456$xSZGpk6Bp4SA3.cR\", \"$sha1$456$xSZGpk6Bp4SA3.cR$jMixhjYagayubqsLI2vEj5aOqjyf\", \"\\xf3\\xf4\\xe5\\xf0\\xe8\\xe1\\xee\\xe9\\xe5\" },\n  { \"$sha1$12$GGXpNqoJvglVTkGU\", \"$sha1$12$GGXpNqoJvglVTkGU$tIDqnSXhlW48BmgbQUIx7tf8MXQa\", \"\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\" },\n  { \"$sha1$12$xSZGpk6Bp4SA3.cR\", \"$sha1$12$xSZGpk6Bp4SA3.cR$o4a6tx2N7CYm1d6LYAz0E9TwWgYD\", \"\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\" },\n  { \"$sha1$456$GGXpNqoJvglVTkGU\", \"$sha1$456$GGXpNqoJvglVTkGU$k./eTdqpCL9iHr1fGBG.uOwTcGsH\", \"\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\" },\n  { \"$sha1$456$xSZGpk6Bp4SA3.cR\", \"$sha1$456$xSZGpk6Bp4SA3.cR$G/6PWZSZy84cA9ewI9b0A0rIgl6a\", \"\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\" },\n  { \"$sha1$12$GGXpNqoJvglVTkGU\", \"$sha1$12$GGXpNqoJvglVTkGU$sZDwvUxDQ3dJosrx3z/G4mBak1.4\", \"\\xc3\\xa9tude\" },\n  { \"$sha1$12$xSZGpk6Bp4SA3.cR\", \"$sha1$12$xSZGpk6Bp4SA3.cR$VcZQD6FB.ypIBfQP.yQ1aov.mxeZ\", \"\\xc3\\xa9tude\" },\n  { \"$sha1$456$GGXpNqoJvglVTkGU\", \"$sha1$456$GGXpNqoJvglVTkGU$DoC.EObtIjM8HJLdQgdU7TGp.otl\", \"\\xc3\\xa9tude\" },\n  { \"$sha1$456$xSZGpk6Bp4SA3.cR\", \"$sha1$456$xSZGpk6Bp4SA3.cR$Pm1m/9LlLBZeC0HDbZD9LEFg6fS.\", \"\\xc3\\xa9tude\" },\n  { \"$sha1$12$GGXpNqoJvglVTkGU\", \"$sha1$12$GGXpNqoJvglVTkGU$bk.6epHsYcz1SgOkKq7vn/SVUQ40\", \"C)tude\" },\n  { \"$sha1$12$xSZGpk6Bp4SA3.cR\", \"$sha1$12$xSZGpk6Bp4SA3.cR$bR.kyclVlQuIJlImCWGAEeMz.9DT\", \"C)tude\" },\n  { \"$sha1$456$GGXpNqoJvglVTkGU\", \"$sha1$456$GGXpNqoJvglVTkGU$huGnH6ykSWm/Ar1GTAfGQ0peBDee\", \"C)tude\" },\n  { \"$sha1$456$xSZGpk6Bp4SA3.cR\", \"$sha1$456$xSZGpk6Bp4SA3.cR$7WcpSUFvN2oSR76BmlFNcyXxK9hd\", \"C)tude\" },\n  { \"$sha1$12$GGXpNqoJvglVTkGU\", \"$sha1$12$GGXpNqoJvglVTkGU$NmI1WMCwdS9OEVI4zPbbYkqYB2Ci\", \"Chl\\xc3\\xb6\"\"e\" },\n  { \"$sha1$12$xSZGpk6Bp4SA3.cR\", \"$sha1$12$xSZGpk6Bp4SA3.cR$lckumipQ3drtWpIhZsqgx83Lf5Wv\", \"Chl\\xc3\\xb6\"\"e\" },\n  { \"$sha1$456$GGXpNqoJvglVTkGU\", \"$sha1$456$GGXpNqoJvglVTkGU$G7oxk8nlgYX9DdkageP85uv.r1Xp\", \"Chl\\xc3\\xb6\"\"e\" },\n  { \"$sha1$456$xSZGpk6Bp4SA3.cR\", \"$sha1$456$xSZGpk6Bp4SA3.cR$RVEhA7RCZGHwT7jNcSM50cZEpKYk\", \"Chl\\xc3\\xb6\"\"e\" },\n  { \"$sha1$12$GGXpNqoJvglVTkGU\", \"$sha1$12$GGXpNqoJvglVTkGU$yy1vxUWkEwyNu/CFGd7KmBHWgTuZ\", \"ChlC6e\" },\n  { \"$sha1$12$xSZGpk6Bp4SA3.cR\", \"$sha1$12$xSZGpk6Bp4SA3.cR$frlvEuYifgvSP4/eg/R9wZF7jnc9\", \"ChlC6e\" },\n  { \"$sha1$456$GGXpNqoJvglVTkGU\", \"$sha1$456$GGXpNqoJvglVTkGU$yVCDVt3YW3ydvmpKRovJEuN.w2ao\", \"ChlC6e\" },\n  { \"$sha1$456$xSZGpk6Bp4SA3.cR\", \"$sha1$456$xSZGpk6Bp4SA3.cR$R87otilThKLSoM6e2m2Ok57uEbNV\", \"ChlC6e\" },\n  { \"$sha1$12$GGXpNqoJvglVTkGU\", \"$sha1$12$GGXpNqoJvglVTkGU$lCT6UrllVtJv7hSethu/C6aLVkwW\", \"\\xc3\\x85ngstr\\xc3\\xb6m\" },\n  { \"$sha1$12$xSZGpk6Bp4SA3.cR\", \"$sha1$12$xSZGpk6Bp4SA3.cR$GlrH0ss8fD0OwiQ.DPB5RA0aDNYK\", \"\\xc3\\x85ngstr\\xc3\\xb6m\" },\n  { \"$sha1$456$GGXpNqoJvglVTkGU\", \"$sha1$456$GGXpNqoJvglVTkGU$XbaVbSvVT3bkN6xC/seo.9OD4GqP\", \"\\xc3\\x85ngstr\\xc3\\xb6m\" },\n  { \"$sha1$456$xSZGpk6Bp4SA3.cR\", \"$sha1$456$xSZGpk6Bp4SA3.cR$JjGGspeneGJ.QUCgScmuUkjs7x8B\", \"\\xc3\\x85ngstr\\xc3\\xb6m\" },\n  { \"$sha1$12$GGXpNqoJvglVTkGU\", \"$sha1$12$GGXpNqoJvglVTkGU$8J/rZLUoxASUliYF5qw3roPoQ96U\", \"C\\x05ngstrC6m\" },\n  { \"$sha1$12$xSZGpk6Bp4SA3.cR\", \"$sha1$12$xSZGpk6Bp4SA3.cR$6Ywi4XG3ASJmOkAVGCCW7XAIvyDV\", \"C\\x05ngstrC6m\" },\n  { \"$sha1$456$GGXpNqoJvglVTkGU\", \"$sha1$456$GGXpNqoJvglVTkGU$tdbIJVVY2uis85MwC/OfFTzwGt0o\", \"C\\x05ngstrC6m\" },\n  { \"$sha1$456$xSZGpk6Bp4SA3.cR\", \"$sha1$456$xSZGpk6Bp4SA3.cR$OI34Udh90qNL2N9/FAefW9byMcyd\", \"C\\x05ngstrC6m\" },\n  { \"$sha1$12$GGXpNqoJvglVTkGU\", \"$sha1$12$GGXpNqoJvglVTkGU$.ezYA.nWFgrQVQhlwRbP06XIHKme\", \"C\\x05ngstrCU*U***U*\" },\n  { \"$sha1$12$xSZGpk6Bp4SA3.cR\", \"$sha1$12$xSZGpk6Bp4SA3.cR$NhYiqvdFOXWNsqZ91DOkuj1aue4g\", \"C\\x05ngstrCU*U***U*\" },\n  { \"$sha1$456$GGXpNqoJvglVTkGU\", \"$sha1$456$GGXpNqoJvglVTkGU$NcbU3HfUE6jVnMiMTOaU2dj00SIp\", \"C\\x05ngstrCU*U***U*\" },\n  { \"$sha1$456$xSZGpk6Bp4SA3.cR\", \"$sha1$456$xSZGpk6Bp4SA3.cR$9gvrSuY.A.fH37Fc97tEShuVTD62\", \"C\\x05ngstrCU*U***U*\" },\n  { \"$sha1$12$GGXpNqoJvglVTkGU\", \"$sha1$12$GGXpNqoJvglVTkGU$YYyQxusqQv61BzY6u3Owggjxn/fa\", \"U*U***U*ignored\" },\n  { \"$sha1$12$xSZGpk6Bp4SA3.cR\", \"$sha1$12$xSZGpk6Bp4SA3.cR$7/MDoFThUx.o079a96AvY9L3xgwZ\", \"U*U***U*ignored\" },\n  { \"$sha1$456$GGXpNqoJvglVTkGU\", \"$sha1$456$GGXpNqoJvglVTkGU$s4q5w12aS1fGCGmbUldz4/7VTsgv\", \"U*U***U*ignored\" },\n  { \"$sha1$456$xSZGpk6Bp4SA3.cR\", \"$sha1$456$xSZGpk6Bp4SA3.cR$lGsXGC3bGbH0MdlfnTL4fjYvDms3\", \"U*U***U*ignored\" },\n  { \"$sha1$12$GGXpNqoJvglVTkGU\", \"$sha1$12$GGXpNqoJvglVTkGU$vZ.GOyiM8e833bLP3M822wM16RXj\", \"U*U*U*U*\" },\n  { \"$sha1$12$xSZGpk6Bp4SA3.cR\", \"$sha1$12$xSZGpk6Bp4SA3.cR$wP8g2GEZfpP3uUb7DXNNQkbEkmH/\", \"U*U*U*U*\" },\n  { \"$sha1$456$GGXpNqoJvglVTkGU\", \"$sha1$456$GGXpNqoJvglVTkGU$9LuetbomuuWOK7hOcseKci.bfmtc\", \"U*U*U*U*\" },\n  { \"$sha1$456$xSZGpk6Bp4SA3.cR\", \"$sha1$456$xSZGpk6Bp4SA3.cR$L4F2xOdkXVyk4kyR6YTHi6cKF6fD\", \"U*U*U*U*\" },\n  { \"$sha1$12$GGXpNqoJvglVTkGU\", \"$sha1$12$GGXpNqoJvglVTkGU$.p.GBhRbUvVTYGLHPQtH3Eu76ZCP\", \"U*U*U*U*ignored\" },\n  { \"$sha1$12$xSZGpk6Bp4SA3.cR\", \"$sha1$12$xSZGpk6Bp4SA3.cR$YyXQESPuoS1Qv0YHJ0ckhLkymRz6\", \"U*U*U*U*ignored\" },\n  { \"$sha1$456$GGXpNqoJvglVTkGU\", \"$sha1$456$GGXpNqoJvglVTkGU$ecxGKRGTcmOucUKfGBviHs9i9NDO\", \"U*U*U*U*ignored\" },\n  { \"$sha1$456$xSZGpk6Bp4SA3.cR\", \"$sha1$456$xSZGpk6Bp4SA3.cR$JpDRUyl2ukjgNV/kqWZjKe.Kox0P\", \"U*U*U*U*ignored\" },\n  { \"$sha1$12$GGXpNqoJvglVTkGU\", \"$sha1$12$GGXpNqoJvglVTkGU$5eNtACoA6wV1Cf3ogX6b7I9PZD/v\", \"*U*U*U*U\" },\n  { \"$sha1$12$xSZGpk6Bp4SA3.cR\", \"$sha1$12$xSZGpk6Bp4SA3.cR$k9Vq6RUfBByK8PwFgpk51DvMOXVq\", \"*U*U*U*U\" },\n  { \"$sha1$456$GGXpNqoJvglVTkGU\", \"$sha1$456$GGXpNqoJvglVTkGU$.q2hQd3qeDCo0LM8XFWS1fUwoOBa\", \"*U*U*U*U\" },\n  { \"$sha1$456$xSZGpk6Bp4SA3.cR\", \"$sha1$456$xSZGpk6Bp4SA3.cR$hLm4hssKGL5hKCYAwS32cTvMPkyN\", \"*U*U*U*U\" },\n  { \"$sha1$12$GGXpNqoJvglVTkGU\", \"$sha1$12$GGXpNqoJvglVTkGU$lq.bfcAX3gZt3DyRZNB06JAcQC0w\", \"*U*U*U*U*\" },\n  { \"$sha1$12$xSZGpk6Bp4SA3.cR\", \"$sha1$12$xSZGpk6Bp4SA3.cR$sn5.XhbA2O4hC4v6ChbZiXMf.kfs\", \"*U*U*U*U*\" },\n  { \"$sha1$456$GGXpNqoJvglVTkGU\", \"$sha1$456$GGXpNqoJvglVTkGU$oNe7DeZUgYxDDeUPC6DdaVTkaoOv\", \"*U*U*U*U*\" },\n  { \"$sha1$456$xSZGpk6Bp4SA3.cR\", \"$sha1$456$xSZGpk6Bp4SA3.cR$8UWmNIZWZ.IO.Bitwzg6NjRu8bJm\", \"*U*U*U*U*\" },\n  { \"$sha1$12$GGXpNqoJvglVTkGU\", \"$sha1$12$GGXpNqoJvglVTkGU$HiHiw87aVOp3SjtbFdVU0GjjtyLe\", \"*U*U*U*U*U*U*U*U\" },\n  { \"$sha1$12$xSZGpk6Bp4SA3.cR\", \"$sha1$12$xSZGpk6Bp4SA3.cR$T5uNohp1sY05MZ5Rows3eEU7bhs.\", \"*U*U*U*U*U*U*U*U\" },\n  { \"$sha1$456$GGXpNqoJvglVTkGU\", \"$sha1$456$GGXpNqoJvglVTkGU$arIZAG0ASvSpqcmtFDI4YcNAJGxi\", \"*U*U*U*U*U*U*U*U\" },\n  { \"$sha1$456$xSZGpk6Bp4SA3.cR\", \"$sha1$456$xSZGpk6Bp4SA3.cR$66o3gct6bg9enNwyPOnXLkToLEp.\", \"*U*U*U*U*U*U*U*U\" },\n  { \"$sha1$12$GGXpNqoJvglVTkGU\", \"$sha1$12$GGXpNqoJvglVTkGU$NHnsTLD9c.qqpDj0ivsy3UesXfyY\", \"*U*U*U*U*U*U*U*U*\" },\n  { \"$sha1$12$xSZGpk6Bp4SA3.cR\", \"$sha1$12$xSZGpk6Bp4SA3.cR$QN5qm.mwP7XtG1Jamo3igqY/Mv5u\", \"*U*U*U*U*U*U*U*U*\" },\n  { \"$sha1$456$GGXpNqoJvglVTkGU\", \"$sha1$456$GGXpNqoJvglVTkGU$zQlh1xTnn7PlUkI.Lr4CcGBQrKHs\", \"*U*U*U*U*U*U*U*U*\" },\n  { \"$sha1$456$xSZGpk6Bp4SA3.cR\", \"$sha1$456$xSZGpk6Bp4SA3.cR$eCWSg/IiErpjfaoAY2f3VdCcu7ne\", \"*U*U*U*U*U*U*U*U*\" },\n  { \"$sha1$12$GGXpNqoJvglVTkGU\", \"$sha1$12$GGXpNqoJvglVTkGU$fDEyOBMUBXwWaOsacf.qOdthtnHB\", \"\\xa3\" },\n  { \"$sha1$12$xSZGpk6Bp4SA3.cR\", \"$sha1$12$xSZGpk6Bp4SA3.cR$gV2eKiRwPx5LJbJvB0sYg9KQciVp\", \"\\xa3\" },\n  { \"$sha1$456$GGXpNqoJvglVTkGU\", \"$sha1$456$GGXpNqoJvglVTkGU$1Azk2nQWrVF1xwjl9.wAmhwn1Dy1\", \"\\xa3\" },\n  { \"$sha1$456$xSZGpk6Bp4SA3.cR\", \"$sha1$456$xSZGpk6Bp4SA3.cR$W4r31HbkRL6iJUvu5qkZjxTWLc.5\", \"\\xa3\" },\n  { \"$sha1$12$GGXpNqoJvglVTkGU\", \"$sha1$12$GGXpNqoJvglVTkGU$lUfcqV58n.68./0EShcaDtSYWiNK\", \"\\xa3\"\"a\" },\n  { \"$sha1$12$xSZGpk6Bp4SA3.cR\", \"$sha1$12$xSZGpk6Bp4SA3.cR$tiMzbPt4HESrqCVzPnLf2nd8x9/i\", \"\\xa3\"\"a\" },\n  { \"$sha1$456$GGXpNqoJvglVTkGU\", \"$sha1$456$GGXpNqoJvglVTkGU$rxIHEdG9yaUP9BTgLZNd9ZrjBJWt\", \"\\xa3\"\"a\" },\n  { \"$sha1$456$xSZGpk6Bp4SA3.cR\", \"$sha1$456$xSZGpk6Bp4SA3.cR$WRCz6/eoIIbKcqfauydYda0BwnQD\", \"\\xa3\"\"a\" },\n  { \"$sha1$12$GGXpNqoJvglVTkGU\", \"$sha1$12$GGXpNqoJvglVTkGU$Cv3ybI0CjNOBYjoO8UEJ/sjus9lh\", \"\\xd1\\x91\" },\n  { \"$sha1$12$xSZGpk6Bp4SA3.cR\", \"$sha1$12$xSZGpk6Bp4SA3.cR$IH8M4EDkWIoT8grPgpEY06LZUNN6\", \"\\xd1\\x91\" },\n  { \"$sha1$456$GGXpNqoJvglVTkGU\", \"$sha1$456$GGXpNqoJvglVTkGU$1TFjGzYsp8rNyvt5B0tv2W2YxyBk\", \"\\xd1\\x91\" },\n  { \"$sha1$456$xSZGpk6Bp4SA3.cR\", \"$sha1$456$xSZGpk6Bp4SA3.cR$ldW/R8wxBbUmF2NA7Pi14L/F4cze\", \"\\xd1\\x91\" },\n  { \"$sha1$12$GGXpNqoJvglVTkGU\", \"$sha1$12$GGXpNqoJvglVTkGU$zRceyKwrWMJBT7db4Y.g/UKqe0kK\", \"\\xa3\"\"ab\" },\n  { \"$sha1$12$xSZGpk6Bp4SA3.cR\", \"$sha1$12$xSZGpk6Bp4SA3.cR$7fBVDHRYcA10Xx43bVfgGoLg28D9\", \"\\xa3\"\"ab\" },\n  { \"$sha1$456$GGXpNqoJvglVTkGU\", \"$sha1$456$GGXpNqoJvglVTkGU$irFslG7UibZiH9wJLWFK5UHDVXNj\", \"\\xa3\"\"ab\" },\n  { \"$sha1$456$xSZGpk6Bp4SA3.cR\", \"$sha1$456$xSZGpk6Bp4SA3.cR$wnmxICXdkkBqiRIhbAoPlK16rDxK\", \"\\xa3\"\"ab\" },\n  { \"$sha1$12$GGXpNqoJvglVTkGU\", \"$sha1$12$GGXpNqoJvglVTkGU$VXF5NxVr0bYGLytXPiL7vC3yRwEn\", \"\\xff\\xff\\xa3\" },\n  { \"$sha1$12$xSZGpk6Bp4SA3.cR\", \"$sha1$12$xSZGpk6Bp4SA3.cR$6YO1uAKD1aBOAZHb3lTk8d8kBUNv\", \"\\xff\\xff\\xa3\" },\n  { \"$sha1$456$GGXpNqoJvglVTkGU\", \"$sha1$456$GGXpNqoJvglVTkGU$y7e7hXzJrCSK7m1cLj5WZY26a6My\", \"\\xff\\xff\\xa3\" },\n  { \"$sha1$456$xSZGpk6Bp4SA3.cR\", \"$sha1$456$xSZGpk6Bp4SA3.cR$b8OelPiAHe8mYYG4TzeYFHh4dOX3\", \"\\xff\\xff\\xa3\" },\n  { \"$sha1$12$GGXpNqoJvglVTkGU\", \"$sha1$12$GGXpNqoJvglVTkGU$Pn4YgWByMZwjfLPYPEL08rliEqvO\", \"1\\xa3\"\"345\" },\n  { \"$sha1$12$xSZGpk6Bp4SA3.cR\", \"$sha1$12$xSZGpk6Bp4SA3.cR$QNPXOFIWoTRDvgOK.mx7tqHTBGp/\", \"1\\xa3\"\"345\" },\n  { \"$sha1$456$GGXpNqoJvglVTkGU\", \"$sha1$456$GGXpNqoJvglVTkGU$piLl/2exQRevLdv.Ml2Mi4Ec3nC/\", \"1\\xa3\"\"345\" },\n  { \"$sha1$456$xSZGpk6Bp4SA3.cR\", \"$sha1$456$xSZGpk6Bp4SA3.cR$1AoD3WLAbhK3Fdcxl.Zv5ANbzAQg\", \"1\\xa3\"\"345\" },\n  { \"$sha1$12$GGXpNqoJvglVTkGU\", \"$sha1$12$GGXpNqoJvglVTkGU$kKlvUPVr/IhPd6K3OjQHNgrfjnxX\", \"\\xff\\xa3\"\"345\" },\n  { \"$sha1$12$xSZGpk6Bp4SA3.cR\", \"$sha1$12$xSZGpk6Bp4SA3.cR$TPfIaMJk.EwkF6lLVAQnIAetGZHT\", \"\\xff\\xa3\"\"345\" },\n  { \"$sha1$456$GGXpNqoJvglVTkGU\", \"$sha1$456$GGXpNqoJvglVTkGU$1Z6wO1XiQcPjQ/6562tbi53SkjV8\", \"\\xff\\xa3\"\"345\" },\n  { \"$sha1$456$xSZGpk6Bp4SA3.cR\", \"$sha1$456$xSZGpk6Bp4SA3.cR$J0XLa21Euf1rIa0uprO8a1zCS3vY\", \"\\xff\\xa3\"\"345\" },\n  { \"$sha1$12$GGXpNqoJvglVTkGU\", \"$sha1$12$GGXpNqoJvglVTkGU$aZ6OQv7x7zvChQvsHqzxuPetcBP7\", \"\\xff\\xa3\"\"34\\xff\\xff\\xff\\xa3\"\"345\" },\n  { \"$sha1$12$xSZGpk6Bp4SA3.cR\", \"$sha1$12$xSZGpk6Bp4SA3.cR$CWClZr12514vpnWHc8ySga9.2jSx\", \"\\xff\\xa3\"\"34\\xff\\xff\\xff\\xa3\"\"345\" },\n  { \"$sha1$456$GGXpNqoJvglVTkGU\", \"$sha1$456$GGXpNqoJvglVTkGU$N5bO63BYWVXyYMnGobPm9fNOeV4q\", \"\\xff\\xa3\"\"34\\xff\\xff\\xff\\xa3\"\"345\" },\n  { \"$sha1$456$xSZGpk6Bp4SA3.cR\", \"$sha1$456$xSZGpk6Bp4SA3.cR$yb40wzWbA8NBAx0TPhUyyQ3u6EWT\", \"\\xff\\xa3\"\"34\\xff\\xff\\xff\\xa3\"\"345\" },\n  { \"$sha1$12$GGXpNqoJvglVTkGU\", \"$sha1$12$GGXpNqoJvglVTkGU$VK5HtRgp2UOB/z2JIxxEoHwmA3OM\", \"U\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xff\" },\n  { \"$sha1$12$xSZGpk6Bp4SA3.cR\", \"$sha1$12$xSZGpk6Bp4SA3.cR$eobLeTF37ePbcxR.oK/2PuZqSdWQ\", \"U\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xff\" },\n  { \"$sha1$456$GGXpNqoJvglVTkGU\", \"$sha1$456$GGXpNqoJvglVTkGU$RDsyq3uFVRLbSmg2ObD4SnHSvnQK\", \"U\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xff\" },\n  { \"$sha1$456$xSZGpk6Bp4SA3.cR\", \"$sha1$456$xSZGpk6Bp4SA3.cR$q6f5RKwRTo00xqVXF/pXkLG2SYmK\", \"U\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xff\" },\n  { \"$sha1$12$GGXpNqoJvglVTkGU\", \"$sha1$12$GGXpNqoJvglVTkGU$nbCwTmRDEbY9eNSS.UuOHqfik9EC\", \"\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\" },\n  { \"$sha1$12$xSZGpk6Bp4SA3.cR\", \"$sha1$12$xSZGpk6Bp4SA3.cR$4nj6DOAsCTz4GuvxdAhINzMsWQtX\", \"\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\" },\n  { \"$sha1$456$GGXpNqoJvglVTkGU\", \"$sha1$456$GGXpNqoJvglVTkGU$fAEK1T/oFKsIh9sboI3spfNqNBOM\", \"\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\" },\n  { \"$sha1$456$xSZGpk6Bp4SA3.cR\", \"$sha1$456$xSZGpk6Bp4SA3.cR$3Wbmlp4mK0yT/DtOkvslGV0N8HCp\", \"\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\" },\n  { \"$sha1$12$GGXpNqoJvglVTkGU\", \"$sha1$12$GGXpNqoJvglVTkGU$QS9Wg2yZk2Lm.3U8v6W9DHm36ivX\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\" },\n  { \"$sha1$12$xSZGpk6Bp4SA3.cR\", \"$sha1$12$xSZGpk6Bp4SA3.cR$k7d1KjnjNACPAbiKWMenwUjQCQGX\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\" },\n  { \"$sha1$456$GGXpNqoJvglVTkGU\", \"$sha1$456$GGXpNqoJvglVTkGU$xgz55CjqgNmydkdemqL9Wm4QTgXW\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\" },\n  { \"$sha1$456$xSZGpk6Bp4SA3.cR\", \"$sha1$456$xSZGpk6Bp4SA3.cR$EMrGDUBDdjniuXmmIQ8WT8/r9Fq9\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\" },\n  { \"$sha1$12$GGXpNqoJvglVTkGU\", \"$sha1$12$GGXpNqoJvglVTkGU$aMcJMC3XjD.gP5.glG744i3eKp0p\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789chars after 72 are ignored\" },\n  { \"$sha1$12$xSZGpk6Bp4SA3.cR\", \"$sha1$12$xSZGpk6Bp4SA3.cR$4wF4kUkElJl6mhDvdRld6yR5N21g\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789chars after 72 are ignored\" },\n  { \"$sha1$456$GGXpNqoJvglVTkGU\", \"$sha1$456$GGXpNqoJvglVTkGU$XLArh.YfeVeOlhdyhdSkxHtkQPgA\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789chars after 72 are ignored\" },\n  { \"$sha1$456$xSZGpk6Bp4SA3.cR\", \"$sha1$456$xSZGpk6Bp4SA3.cR$nNSyf1OgbiYzlPhH9wEi1EfytjUc\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789chars after 72 are ignored\" },\n  { \"$sha1$12$GGXpNqoJvglVTkGU\", \"$sha1$12$GGXpNqoJvglVTkGU$940slNzFLWJTrnpfSwL1JxdrUf35\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\" },\n  { \"$sha1$12$xSZGpk6Bp4SA3.cR\", \"$sha1$12$xSZGpk6Bp4SA3.cR$pLaXrLNBULbSM/y03S2PPbbpCi/v\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\" },\n  { \"$sha1$456$GGXpNqoJvglVTkGU\", \"$sha1$456$GGXpNqoJvglVTkGU$7/1wqTR/8w4gG11lkuoqEk76kDTh\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\" },\n  { \"$sha1$456$xSZGpk6Bp4SA3.cR\", \"$sha1$456$xSZGpk6Bp4SA3.cR$5nEQW638iyLrCL60FUfPDym7ldI9\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\" },\n  { \"$sha1$12$GGXpNqoJvglVTkGU\", \"$sha1$12$GGXpNqoJvglVTkGU$6.oXLFCk/sgk7UtgAfrZDKrIDeLv\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\"\"chars after 72 are ignored as usual\" },\n  { \"$sha1$12$xSZGpk6Bp4SA3.cR\", \"$sha1$12$xSZGpk6Bp4SA3.cR$YF5QaIrSoREJPLZTnaZVAtdtkBtC\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\"\"chars after 72 are ignored as usual\" },\n  { \"$sha1$456$GGXpNqoJvglVTkGU\", \"$sha1$456$GGXpNqoJvglVTkGU$L6EVbKBdIYazhXRimAgyM45J3aoP\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\"\"chars after 72 are ignored as usual\" },\n  { \"$sha1$456$xSZGpk6Bp4SA3.cR\", \"$sha1$456$xSZGpk6Bp4SA3.cR$IBK.wDSFrF1.jUbizDLW9STb/EjR\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\"\"chars after 72 are ignored as usual\" },\n  { \"$sha1$12$GGXpNqoJvglVTkGU\", \"$sha1$12$GGXpNqoJvglVTkGU$uI6mOZKK18SwXyU2bPKwNGz06nL/\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has forgotten.\" },\n  { \"$sha1$12$xSZGpk6Bp4SA3.cR\", \"$sha1$12$xSZGpk6Bp4SA3.cR$.SWn8.aXKqe7RiMkc5HoLiQ/CbRm\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has forgotten.\" },\n  { \"$sha1$456$GGXpNqoJvglVTkGU\", \"$sha1$456$GGXpNqoJvglVTkGU$RuaRNYlRkDHYpN3u7beWYym7qhKx\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has forgotten.\" },\n  { \"$sha1$456$xSZGpk6Bp4SA3.cR\", \"$sha1$456$xSZGpk6Bp4SA3.cR$lTINYU41Tl7RnjvMC6tCGCByZlwd\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has forgotten.\" },\n  { \"$sha1$12$GGXpNqoJvglVTkGU\", \"$sha1$12$GGXpNqoJvglVTkGU$FxIi5d2Kp25IMRlRHzo4sEZ9teh2\", \"THE YEAR\" },\n  { \"$sha1$12$xSZGpk6Bp4SA3.cR\", \"$sha1$12$xSZGpk6Bp4SA3.cR$BtIqeltUbAwyCW6I5mLorivdNfwQ\", \"THE YEAR\" },\n  { \"$sha1$456$GGXpNqoJvglVTkGU\", \"$sha1$456$GGXpNqoJvglVTkGU$XHsqKTWefssI8mhXXgMrlZsNPfIJ\", \"THE YEAR\" },\n  { \"$sha1$456$xSZGpk6Bp4SA3.cR\", \"$sha1$456$xSZGpk6Bp4SA3.cR$oP9XJgU7aE5n7Whw0VyjVxxjAGk4\", \"THE YEAR\" },\n  { \"$sha1$12$GGXpNqoJvglVTkGU\", \"$sha1$12$GGXpNqoJvglVTkGU$A7Vifk/FRT1QUrJCaw8Fyi6PuiX7\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and do\" },\n  { \"$sha1$12$xSZGpk6Bp4SA3.cR\", \"$sha1$12$xSZGpk6Bp4SA3.cR$Colp64c2ar0Yygc1ZpDS.tFfLn7k\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and do\" },\n  { \"$sha1$456$GGXpNqoJvglVTkGU\", \"$sha1$456$GGXpNqoJvglVTkGU$drqxGi7mXaSlILtUC0gzzk4UrTNj\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and do\" },\n  { \"$sha1$456$xSZGpk6Bp4SA3.cR\", \"$sha1$456$xSZGpk6Bp4SA3.cR$p.Oj34VIAnJFXFby5iM792QwxaYU\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and do\" },\n  { \"$sha1$12$GGXpNqoJvglVTkGU\", \"$sha1$12$GGXpNqoJvglVTkGU$D83A9oarQDhx8jqd2Ms5Ds9lkYMC\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has f\" },\n  { \"$sha1$12$xSZGpk6Bp4SA3.cR\", \"$sha1$12$xSZGpk6Bp4SA3.cR$Fi3D1aMpBKlVG5tD3PbkkyoqwEgj\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has f\" },\n  { \"$sha1$456$GGXpNqoJvglVTkGU\", \"$sha1$456$GGXpNqoJvglVTkGU$s9kkP3Pp9Ylj2RgsnLcWyHrT1rs6\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has f\" },\n  { \"$sha1$456$xSZGpk6Bp4SA3.cR\", \"$sha1$456$xSZGpk6Bp4SA3.cR$Zt2D/B27LbmI2rKeSK5PctBywc6e\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has f\" },\n#endif // sha1crypt\n\n#if INCLUDE_sha256crypt && defined TEST_sha256crypt\n  { \"$5$rounds=1000$saltstring\", \"$5$rounds=1000$saltstring$TzAJABAaJwl111nyuH1uQy8kjHahyMHq1D7Y09hLQV1\", \"\" },\n  { \"$5$rounds=1000$short\", \"$5$rounds=1000$short$9rs63TM4j6doEhq2MAUYxnS5Mc/aeEhOVfpnwHTpz6D\", \"\" },\n  { \"$5$saltstring\", \"$5$saltstring$FdNfA4gXqvCeO6iZs7G/.wwwoywYZqo0l1pwmfWaBA7\", \"\" },\n  { \"$5$short\", \"$5$short$cLqQczNe1fmrPIy0KIrfq/WfsyygGH83SzXaZDNpS53\", \"\" },\n  { \"$5$rounds=1000$saltstring\", \"$5$rounds=1000$saltstring$4nti.9yeDGrq7dgFVF6jua2B1WVYRoUDP9bEunlHAoB\", \" \" },\n  { \"$5$rounds=1000$short\", \"$5$rounds=1000$short$BkGJgO5w3i5y7cMInvGAtnoOaITfZPQMoII89TwRR56\", \" \" },\n  { \"$5$saltstring\", \"$5$saltstring$HykkwSGwziMgr/9/Jna5DIi6FDwhDkmbAIZ70wQm7x1\", \" \" },\n  { \"$5$short\", \"$5$short$2LqgRiiiGoTGSf/Kca60f5hmY5qLS/I8Pm9DeD3cIRA\", \" \" },\n  { \"$5$rounds=1000$saltstring\", \"$5$rounds=1000$saltstring$PUh3dLhrRUf5DImijCTHA/6RNalgRtHHx.PjXg80gE2\", \"a\" },\n  { \"$5$rounds=1000$short\", \"$5$rounds=1000$short$d54wru8d70L00hRKpuVP5j1CwpjR/Sr.f8IdsBMUx5B\", \"a\" },\n  { \"$5$saltstring\", \"$5$saltstring$7cz4bTeQ7MnNssphNhFVrITtuJYY/1tdvLL2uzLvOk8\", \"a\" },\n  { \"$5$short\", \"$5$short$26OgkZnNPH/fhIJiNDSUG8GpRVc3tG42gPClFWxDDA2\", \"a\" },\n  { \"$5$rounds=1000$saltstring\", \"$5$rounds=1000$saltstring$Ndn3qi4Vkx11hLCK8fYx/utZ8feeqrzddAFNzEVII2A\", \"ab\" },\n  { \"$5$rounds=1000$short\", \"$5$rounds=1000$short$w0L6KFeqIXAW7ys62SmjADL75RsPla2sbOG9aMzgeN0\", \"ab\" },\n  { \"$5$saltstring\", \"$5$saltstring$4Wjlxdm/Hbpo8ZQzKFazuvfUZPVVUQn6v1oPTX3nwX/\", \"ab\" },\n  { \"$5$short\", \"$5$short$dDc6wcJbORAIZqWEh4wEd1f0ik2FgRzg20VpjLnwJj1\", \"ab\" },\n  { \"$5$rounds=1000$saltstring\", \"$5$rounds=1000$saltstring$n1MEWFPd1lEE7/KU5DhSUSLK1IJKM0A7BOA1Fk2uBa1\", \"abc\" },\n  { \"$5$rounds=1000$short\", \"$5$rounds=1000$short$0Ij9XkhowU5BQIHIg1KJcjx4Nhzc/iCx.RamOa64mc1\", \"abc\" },\n  { \"$5$saltstring\", \"$5$saltstring$tDHA0KPsYQ8V.LDB1/fgW7cvROod5ZajSrx1tZU2JG9\", \"abc\" },\n  { \"$5$short\", \"$5$short$PKcRAEJSPWRgSvYSDOgjYdNBO/NQesdEIekzR.MC.B6\", \"abc\" },\n  { \"$5$rounds=1000$saltstring\", \"$5$rounds=1000$saltstring$QTMEAJM8XtlGnH8mydl0lpvaoi8Tfx.zzYENctIj/S1\", \"U*U\" },\n  { \"$5$rounds=1000$short\", \"$5$rounds=1000$short$sqf/wEDeYsKoPjRyXCcrE7HExjVRaMwh.8NOYTU3vH/\", \"U*U\" },\n  { \"$5$saltstring\", \"$5$saltstring$L/ZEDb/ocvEdnc8kd0PfoWLeVTOVNTFbXLW5ASvhNxC\", \"U*U\" },\n  { \"$5$short\", \"$5$short$J5zE3iFFNeXjpqpEylGntITmXwqDokMWugyKHkdDgoD\", \"U*U\" },\n  { \"$5$rounds=1000$saltstring\", \"$5$rounds=1000$saltstring$w7B.PZBQo0HzMEIoQRJCREnXorRX5DBvuQJfDc8JAt2\", \"U*U*\" },\n  { \"$5$rounds=1000$short\", \"$5$rounds=1000$short$1dpaSH3OopbKKF.vz9kIAgHoDHVFyPeE9FXXRuH2EV2\", \"U*U*\" },\n  { \"$5$saltstring\", \"$5$saltstring$WIaR8zhcCgrBuajNZ8.ji/0LvShyVHiYOCQUvPYJwk.\", \"U*U*\" },\n  { \"$5$short\", \"$5$short$jNknpdiAHr.cGSEV3eu4Co564H/IFUk6/WKwoYSOd8C\", \"U*U*\" },\n  { \"$5$rounds=1000$saltstring\", \"$5$rounds=1000$saltstring$BD9vKyRCILdHHPoj6XbXoZDmo5uPjdY86UiDlZKds96\", \"U*U*U\" },\n  { \"$5$rounds=1000$short\", \"$5$rounds=1000$short$VXbLwCUo1D6oEdBR808Vnr24eXXyOPJvJi4LhjZ5d03\", \"U*U*U\" },\n  { \"$5$saltstring\", \"$5$saltstring$ug9WzODAg6NTltop86swjVhibITjtQkuiQ3ruyozXX4\", \"U*U*U\" },\n  { \"$5$short\", \"$5$short$gQ.OanDymM7z7SxBB9TNRd//x1PiwYtzSFzfPBZ6u.B\", \"U*U*U\" },\n  { \"$5$rounds=1000$saltstring\", \"$5$rounds=1000$saltstring$ut2CmAbIX1MifplCLAtPBz5uXi2reY4T0vDeSwoU4P8\", \".....\" },\n  { \"$5$rounds=1000$short\", \"$5$rounds=1000$short$/eA8s2vA7Mf7/vPuxtEb7macFmjbsHDFzyzcQRjBwH/\", \".....\" },\n  { \"$5$saltstring\", \"$5$saltstring$XEgskAvmn0w0uulL7.zemqva..V960QOSKvibYJxDO5\", \".....\" },\n  { \"$5$short\", \"$5$short$yCvwWwNy5kxKzp.dWCO92QqfZLfM2g8v7hpHJMxU8HD\", \".....\" },\n  { \"$5$rounds=1000$saltstring\", \"$5$rounds=1000$saltstring$cFiLTMs.Jr2K8y/P/6CFh7StY6egGmiq52cnuiEoX79\", \"dragon\" },\n  { \"$5$rounds=1000$short\", \"$5$rounds=1000$short$6UOH5fnOVqhx8m/LZDTlROwiLDyQupxaY1Kx.hEV3VD\", \"dragon\" },\n  { \"$5$saltstring\", \"$5$saltstring$bAAndV8SatHm0GHO.MXdaHSuBK/E.jHeO1S/zczf1jD\", \"dragon\" },\n  { \"$5$short\", \"$5$short$O1Ru9GOtCZikhh1oFe07JX0aDFCTmfCTOLGTpYf8JV0\", \"dragon\" },\n  { \"$5$rounds=1000$saltstring\", \"$5$rounds=1000$saltstring$rN1H2WOp.isUIWF1SyyFEmYmZqc8l08twA40A7tnzc4\", \"dRaGoN\" },\n  { \"$5$rounds=1000$short\", \"$5$rounds=1000$short$/EbClmIsqX01e/9bDZWzj5Q8BfTdP1oFh1JOIX0IbYB\", \"dRaGoN\" },\n  { \"$5$saltstring\", \"$5$saltstring$xcUyK6BgpOPipecfDrY1a2f6SD0KmWDc5Ze5a.GDFg.\", \"dRaGoN\" },\n  { \"$5$short\", \"$5$short$PkruwUYqaeygy0qwU.xZefUJoxWXlTYRAvTmu4ew92A\", \"dRaGoN\" },\n  { \"$5$rounds=1000$saltstring\", \"$5$rounds=1000$saltstring$X5oPIIFA8.2EiQg6dAT8gW.Iv7PPwLz.dV/aIQlhUF1\", \"DrAgOn\" },\n  { \"$5$rounds=1000$short\", \"$5$rounds=1000$short$BSGZL.7uzlFmubvJV1fAohCI1yfsL1zlhm8/1.DVsA2\", \"DrAgOn\" },\n  { \"$5$saltstring\", \"$5$saltstring$9.JDRC7yOVZakuuU89Ql4GrR0i5JAFmM8bx3qk.yzHD\", \"DrAgOn\" },\n  { \"$5$short\", \"$5$short$Cx36ARMKWjs9hoGpSC4sPUGHqoyG65Zq6DTOd3MoCp8\", \"DrAgOn\" },\n  { \"$5$rounds=1000$saltstring\", \"$5$rounds=1000$saltstring$2GitaEekG8j/d/3b8ur0nO2M.dBB2SnF0QF46wZgMH4\", \"PAROLX\" },\n  { \"$5$rounds=1000$short\", \"$5$rounds=1000$short$JxWewYMcEW2ywgV6ESnbwpOKb49RqRTOMs98kD1H1b3\", \"PAROLX\" },\n  { \"$5$saltstring\", \"$5$saltstring$XMd91zSqecc6GtwNsvY9RBcWQ5iZpXQyyeLHIumJg6.\", \"PAROLX\" },\n  { \"$5$short\", \"$5$short$OqVtcZCBcQBnYiP66mauhM7/IBLyyEbzX252ZFZDom.\", \"PAROLX\" },\n  { \"$5$rounds=1000$saltstring\", \"$5$rounds=1000$saltstring$X3hlwjc9AzhT.XOra9TAPFOQrrygMbFe1l/lgiYnH/B\", \"U*U***U\" },\n  { \"$5$rounds=1000$short\", \"$5$rounds=1000$short$xLmPAp.tK8NBs4sk0HUbCDXZrwPF2SBIQvWA3cZh4vA\", \"U*U***U\" },\n  { \"$5$saltstring\", \"$5$saltstring$zOjq7Sj.Mq1STxn6LfRGRcVhbb.hHTD8/wrP/m6OUwB\", \"U*U***U\" },\n  { \"$5$short\", \"$5$short$Grsvx2pI8WZBBdHH68WimvWZseU/QInJCp4hz7bynn1\", \"U*U***U\" },\n  { \"$5$rounds=1000$saltstring\", \"$5$rounds=1000$saltstring$Y1D2nLkjfzc0zppUKQvr6t2akwzcxik8LXGA.haEWN7\", \"abcdefg\" },\n  { \"$5$rounds=1000$short\", \"$5$rounds=1000$short$v8fJBDq.7TBS532RQZiLBLKIcZFcQ50Ya/4pN3pnZ50\", \"abcdefg\" },\n  { \"$5$saltstring\", \"$5$saltstring$4Y5UR.6zwplRx6y93NJVyNkxqdlyT64EV68F2mCrZ16\", \"abcdefg\" },\n  { \"$5$short\", \"$5$short$itev2RUhWDo1qyFoBZ4G2GH59SGOR092gZ6Dw50vRM8\", \"abcdefg\" },\n  { \"$5$rounds=1000$saltstring\", \"$5$rounds=1000$saltstring$JwkZk6wXemMg3os6Lno61imo3qbiCUXBTGJ1dv3UIzD\", \"01234567\" },\n  { \"$5$rounds=1000$short\", \"$5$rounds=1000$short$zKyRLozv6G/X7TwpgRFwaBz.khkwZx3yqe/SwYR8GM6\", \"01234567\" },\n  { \"$5$saltstring\", \"$5$saltstring$PLoJBR6Ssa1JeK1dtzugeoYDgKEv1C1bu9lA0sMlId9\", \"01234567\" },\n  { \"$5$short\", \"$5$short$0aGVjAg3euocNTef7xPCnkQvgKA4t7U.W/cOXs7xiYB\", \"01234567\" },\n  { \"$5$rounds=1000$saltstring\", \"$5$rounds=1000$saltstring$Gw34kCUYGK1ecDSye2mJ6rkR4OlP5YJo00f6RNd7EV3\", \"726 even\" },\n  { \"$5$rounds=1000$short\", \"$5$rounds=1000$short$dXJWGG.EUGmsvNwF7fl/msQ8NHMN44vpok/k63b1ttD\", \"726 even\" },\n  { \"$5$saltstring\", \"$5$saltstring$NnZBpEXQtgUXAILBss77/adN/qryK.XDYSlhSCzCo0B\", \"726 even\" },\n  { \"$5$short\", \"$5$short$9tb7z9Vo5XyuE25srHlsupcqfo3uCf.S7mSxx08BkDA\", \"726 even\" },\n  { \"$5$rounds=1000$saltstring\", \"$5$rounds=1000$saltstring$4iFKl/GxUCV5vHaGoBVZSWfIplo1ZgDd/leUxbJ02pD\", \"zyxwvuts\" },\n  { \"$5$rounds=1000$short\", \"$5$rounds=1000$short$7T5eXcJXbhQHoDBaytYshEEPfL11ic5AlcquYr7rrJ1\", \"zyxwvuts\" },\n  { \"$5$saltstring\", \"$5$saltstring$ZtEf6EZNrD0TnCEEXKwocMCBzUX0X3wGfixnJiZTXA.\", \"zyxwvuts\" },\n  { \"$5$short\", \"$5$short$70hQf98iYxO0Gf1XH8ysrx141gT38/5NTrgSMjZ6.d0\", \"zyxwvuts\" },\n  { \"$5$rounds=1000$saltstring\", \"$5$rounds=1000$saltstring$pqZW6kqyGeiRLcN5mu4J3QDGn/28l2iMpKxokNjSr06\", \"ab1234567\" },\n  { \"$5$rounds=1000$short\", \"$5$rounds=1000$short$0Kom8xILqBjR7KI1iTjhfqkphspqFY.7egtFWByXTf/\", \"ab1234567\" },\n  { \"$5$saltstring\", \"$5$saltstring$BkCPxWWwOOkIwsv.2PXz64/DMckCpuJNuX4KbNVv6dA\", \"ab1234567\" },\n  { \"$5$short\", \"$5$short$XzxGMkSLy5F7Ay4.HmRl7e/rk.2y1.MnfQB1CWIhoI4\", \"ab1234567\" },\n  { \"$5$rounds=1000$saltstring\", \"$5$rounds=1000$saltstring$Hn1MNhjZFsbzO6XqZz0rHm3jZfTw1U8WQi9v2pAOYW6\", \"alexander\" },\n  { \"$5$rounds=1000$short\", \"$5$rounds=1000$short$s.59odO3IwUxURX708YNMsW31djTqUk3ewXmoMg4/T/\", \"alexander\" },\n  { \"$5$saltstring\", \"$5$saltstring$NASvps1iAyfFVbJQQZWtoTYaiWEzDqP8YcqCnwG1WMB\", \"alexander\" },\n  { \"$5$short\", \"$5$short$/EVoeDCPif1fCxo6nRjQg78HoEdI2Gr0.FxdjPXkMO7\", \"alexander\" },\n  { \"$5$rounds=1000$saltstring\", \"$5$rounds=1000$saltstring$12KE43GvUv2S.lCD.FT24yy2Gz8.KeGRUWYeUTgQG/D\", \"beautiful\" },\n  { \"$5$rounds=1000$short\", \"$5$rounds=1000$short$rl5ihbSEp3unBa37pL9x3bMCORjU1JVYMC1V8xnZalC\", \"beautiful\" },\n  { \"$5$saltstring\", \"$5$saltstring$C2AMAGzuvgJxOZmNP/T6rDBhQ2zTRK.CXpbG1S.RWO/\", \"beautiful\" },\n  { \"$5$short\", \"$5$short$Z3m8cvUtBOWW/TICiik0gnCW.FNolf5HZeF.4l5WTxC\", \"beautiful\" },\n  { \"$5$rounds=1000$saltstring\", \"$5$rounds=1000$saltstring$4pWYCjU.v282ET..m0e6Y28SLhqtX3ocW26g0dLIZhB\", \"challenge\" },\n  { \"$5$rounds=1000$short\", \"$5$rounds=1000$short$JX85magFHwzAlI.FpT/4GXk0XSah4JVIB7EaS/CV366\", \"challenge\" },\n  { \"$5$saltstring\", \"$5$saltstring$nSg9yOU7v85EG.edc.jZ78Ka/vAmOSv5ZdiEieR6p41\", \"challenge\" },\n  { \"$5$short\", \"$5$short$YtN8juwAK8.02K.WFi94MUAHO5htID0BWv7sDwa53F3\", \"challenge\" },\n  { \"$5$rounds=1000$saltstring\", \"$5$rounds=1000$saltstring$YXFib4zYzUk3bg1GUlp/gw8spbuhihIXp8.HMhFR1aC\", \"chocolate\" },\n  { \"$5$rounds=1000$short\", \"$5$rounds=1000$short$Fb41GKZeDO2mysfetiL3XXLHVpSv7Lf5LS539rxd.y/\", \"chocolate\" },\n  { \"$5$saltstring\", \"$5$saltstring$z/1qMnW24cZekB5Sbv0LFzSkHTgxCABbc0PnRnjpza5\", \"chocolate\" },\n  { \"$5$short\", \"$5$short$/1.yT6KLIOMvLobdCcZ1x2jUMBTN1gO6QhlEzLNzimB\", \"chocolate\" },\n  { \"$5$rounds=1000$saltstring\", \"$5$rounds=1000$saltstring$.TJeUK8SwhVryWkUKzCLK4cfHgsWYpc8JUZzAOtHfzB\", \"cr1234567\" },\n  { \"$5$rounds=1000$short\", \"$5$rounds=1000$short$9./UKvCIa1i9cPxaAaL9nycTcVTkKb3ssgYNH.irxq9\", \"cr1234567\" },\n  { \"$5$saltstring\", \"$5$saltstring$W4PH1hC0FvF1QzrI/pAb2xb8T1WTiGAj.XKN5zbCpuC\", \"cr1234567\" },\n  { \"$5$short\", \"$5$short$byYKlAD1fPpFqbB73q34Kjg5CzMExj0eRq03jhSPES8\", \"cr1234567\" },\n  { \"$5$rounds=1000$saltstring\", \"$5$rounds=1000$saltstring$RxJhYX141E4p73t1p7/IJGJXbY1gKHeUgMsjTcv7vr/\", \"katherine\" },\n  { \"$5$rounds=1000$short\", \"$5$rounds=1000$short$59ya0/bIilo6QjRKAAXN4HQ2COqb.p/PyKd9OD9QwcA\", \"katherine\" },\n  { \"$5$saltstring\", \"$5$saltstring$4XM9x/HGGvQO1odMw2alp8070lFyl0UuSNiX388ZDw2\", \"katherine\" },\n  { \"$5$short\", \"$5$short$1qMMEHF.p57mXoBmn/1uVbikGKL9bIjE1t2mHuPwax4\", \"katherine\" },\n  { \"$5$rounds=1000$saltstring\", \"$5$rounds=1000$saltstring$9RKy/x7FoouKS76XViHdQ9P6I66lWfrAqFYokMohme3\", \"stephanie\" },\n  { \"$5$rounds=1000$short\", \"$5$rounds=1000$short$q7rGjsU6ToOgh/cg2twyLty8ZSzVptf5P5JzdGIhGtA\", \"stephanie\" },\n  { \"$5$saltstring\", \"$5$saltstring$QusAfTywgDjEbZp18TERSYkMMvJj/FjodIIaAndwka0\", \"stephanie\" },\n  { \"$5$short\", \"$5$short$qM3Ld3MchnyBfIm0g4U0SZRer//Guy4QRDy1rkpDb3A\", \"stephanie\" },\n  { \"$5$rounds=1000$saltstring\", \"$5$rounds=1000$saltstring$cWSOVvB28CkzJ0V.xwYrZtiJsDg1yo9PN.tIqHlAgyB\", \"sunflower\" },\n  { \"$5$rounds=1000$short\", \"$5$rounds=1000$short$DvBa9WTAV6Uab37tH96oR9cS6OQ4hL/nHJuTaNIL1D3\", \"sunflower\" },\n  { \"$5$saltstring\", \"$5$saltstring$djXKuk38DBZzNJt5zhLQ02lOKteHN7SbHGGJpFLyhm6\", \"sunflower\" },\n  { \"$5$short\", \"$5$short$s9zT/0obfO8v.U64FJZ2yuWSoo/LWV71Uy5By/ebni0\", \"sunflower\" },\n  { \"$5$rounds=1000$saltstring\", \"$5$rounds=1000$saltstring$pMAkXql6tGOnzxwkOctgd3upr1z65uBwKrDuNBztV75\", \"basketball\" },\n  { \"$5$rounds=1000$short\", \"$5$rounds=1000$short$rtSRz6EpMscNxctAlAC3O/4yMTiHPUxQL1dxzg0UL/5\", \"basketball\" },\n  { \"$5$saltstring\", \"$5$saltstring$2Qa7B6ty34U6dsIgPjZvPB4ajafhobA9Vi5yfnz4.j2\", \"basketball\" },\n  { \"$5$short\", \"$5$short$XHEJwWoI42rN4rzke1nrDPqCkUnUdy8BuCTlGOLL9VC\", \"basketball\" },\n  { \"$5$rounds=1000$saltstring\", \"$5$rounds=1000$saltstring$5XUdMTGZZ3ke86N.zy9olu04KlBqZyXhP.UCB1BwOs2\", \"porsche911\" },\n  { \"$5$rounds=1000$short\", \"$5$rounds=1000$short$.rhqJWTVSXVRjzzPpkeRx2KHakpI.PQGSa8ksI4Y9f0\", \"porsche911\" },\n  { \"$5$saltstring\", \"$5$saltstring$byuieD/21AZCxtnydeGT24JMyziARRCS4gbbbCPr0v/\", \"porsche911\" },\n  { \"$5$short\", \"$5$short$IbXJJiMLPClu9L3wbYp9p.2Ct0eUb87QcYa9//i7d98\", \"porsche911\" },\n  { \"$5$rounds=1000$saltstring\", \"$5$rounds=1000$saltstring$fXkDMdP5GQ2xhn.AaSaP/w4W6eZusrBaxRVrGu0vMt3\", \"|_337T`/p3\" },\n  { \"$5$rounds=1000$short\", \"$5$rounds=1000$short$xlfWYGY4rA2QGhq/HxauZf3XJJedTJePznUXsdoWwR8\", \"|_337T`/p3\" },\n  { \"$5$saltstring\", \"$5$saltstring$yO0RPKJPpCet.RoPrSJk7wj2MquZzqqw5cD9Uerf2wC\", \"|_337T`/p3\" },\n  { \"$5$short\", \"$5$short$7Fh5KVvhymTZfrXYBsZJTr3WfTK4/ceSwm9Esct6B3A\", \"|_337T`/p3\" },\n  { \"$5$rounds=1000$saltstring\", \"$5$rounds=1000$saltstring$jhQcoGF9yioDllOF182q6gAcYiRoAKFvPvki70b6028\", \"thunderbird\" },\n  { \"$5$rounds=1000$short\", \"$5$rounds=1000$short$/nU38mqaYcCUz.xu.bOW8mqW8Tt5HeLTTrGLNmD5S82\", \"thunderbird\" },\n  { \"$5$saltstring\", \"$5$saltstring$/paWdBHd0YsYYU7DT6Vnwm7.zYKvMSzm/yhbJ8xWXAC\", \"thunderbird\" },\n  { \"$5$short\", \"$5$short$ruwod7bCElrLXcAciMldFy4VWE3DTYKL41Mt2F6fQKD\", \"thunderbird\" },\n  { \"$5$rounds=1000$saltstring\", \"$5$rounds=1000$saltstring$z/y8l95GSjij6uHx2xAJer7YCODLtrhIxItWC13D4g5\", \"Hello world!\" },\n  { \"$5$rounds=1000$short\", \"$5$rounds=1000$short$Zn1jA7vGSJxSOcxz82BehM5YBK0V0FxI3Muhq4iKhwC\", \"Hello world!\" },\n  { \"$5$saltstring\", \"$5$saltstring$5B8vYYiY.CVt1RlTTf8KbXBH3hsxY/GNooZaBBGWEc5\", \"Hello world!\" },\n  { \"$5$short\", \"$5$short$hmIdTXQxlIn/fe0KrwbEgPnVteecdmSd59XyxENOB27\", \"Hello world!\" },\n  { \"$5$rounds=1000$saltstring\", \"$5$rounds=1000$saltstring$FPw.JkTq./NjCz2H2CQqMGCp3PZeDxHr.PYE1fAE6S1\", \"pleaseletmein\" },\n  { \"$5$rounds=1000$short\", \"$5$rounds=1000$short$ZdPvzZvIImIpuK5lWQOf9fejM0NmEYYdVaC1aT4mrYA\", \"pleaseletmein\" },\n  { \"$5$saltstring\", \"$5$saltstring$yHu4NCI8wZtVmEi4UlBewMEOd14T6b2X6goRY6eWJo7\", \"pleaseletmein\" },\n  { \"$5$short\", \"$5$short$tc7f9dKpR8fAwl6jiUEkIlRqKggCyow4n/epnG7AXB6\", \"pleaseletmein\" },\n  { \"$5$rounds=1000$saltstring\", \"$5$rounds=1000$saltstring$kE7O7h2srChzp1LlhZhRuAT.upiSmuoxq55eX6ABKh6\", \"a short string\" },\n  { \"$5$rounds=1000$short\", \"$5$rounds=1000$short$sUlltbS3YXuMuo2NNBE4iOBTqSYoW5P3SGoMvpu/bE.\", \"a short string\" },\n  { \"$5$saltstring\", \"$5$saltstring$UWveRLeGMbj458WWHTeetxiIuXlDckEpLhl2OeHyU70\", \"a short string\" },\n  { \"$5$short\", \"$5$short$uKb0CZJW1TkuGBNa8H/Od2dCTmPwq4fdhsnC6oqKe19\", \"a short string\" },\n  { \"$5$rounds=1000$saltstring\", \"$5$rounds=1000$saltstring$hX96QENY7dXdfYWhKjZaNKTnvZ6LZn/I8Cu6sTSXzrA\", \"zxyDPWgydbQjgq\" },\n  { \"$5$rounds=1000$short\", \"$5$rounds=1000$short$2aPm/vabW0Balkld/gbINUnmZ4/6R6d/9wkzVK.2cx.\", \"zxyDPWgydbQjgq\" },\n  { \"$5$saltstring\", \"$5$saltstring$/FM6Opkx4LLCZKMWKtx7cplMgjbEUg.fbmUtj/46Qd9\", \"zxyDPWgydbQjgq\" },\n  { \"$5$short\", \"$5$short$V3q/FqxoOxjk2ZPeFyZElOTz0uKuwTwKaD3rkQWDyY0\", \"zxyDPWgydbQjgq\" },\n  { \"$5$rounds=1000$saltstring\", \"$5$rounds=1000$saltstring$5C92.MkmJW5sYQhA1zsGrr8Eiuckq4bIC4tEf/eRHs1\", \"photojournalism\" },\n  { \"$5$rounds=1000$short\", \"$5$rounds=1000$short$sB53ls3vS.M37dOgIN6/8nVyvIrzkTy/EBtZRb2Jwi6\", \"photojournalism\" },\n  { \"$5$saltstring\", \"$5$saltstring$ODWcOQ1n2vDcY/4Um9g9fQ2rCrUUULx.A7h6XKyc5p9\", \"photojournalism\" },\n  { \"$5$short\", \"$5$short$Gl6HC8b2tRzTC14g.7dcUwbitwTiUQCvG/GNnZoamvC\", \"photojournalism\" },\n  { \"$5$rounds=1000$saltstring\", \"$5$rounds=1000$saltstring$9iemJMGS0YQTqG0BXFl4xbjS5nh./iVHnDS9jp1Htn.\", \"ecclesiastically\" },\n  { \"$5$rounds=1000$short\", \"$5$rounds=1000$short$XkZdp7kQyiL2RZSb6/rSEoD.08dW9J.4CmIzPworvr3\", \"ecclesiastically\" },\n  { \"$5$saltstring\", \"$5$saltstring$O3atAUTtQ5OE5RhXUyifvH7K8xWHdhhVCDKuzGFPTk3\", \"ecclesiastically\" },\n  { \"$5$short\", \"$5$short$YFDKHxfbGUrj2mZCL.2rKqRUWdxSODho9WFJEC7E.VB\", \"ecclesiastically\" },\n  { \"$5$rounds=1000$saltstring\", \"$5$rounds=1000$saltstring$cFArbePYxzVxWakU/iL0X/td47zSG73L5Hi6lXG9Uj5\", \"congregationalism\" },\n  { \"$5$rounds=1000$short\", \"$5$rounds=1000$short$GPo/DSbLsla2hj39B3GHAKkgkyuexKvCn5y7M54pzG8\", \"congregationalism\" },\n  { \"$5$saltstring\", \"$5$saltstring$FVhuycUvkCWxMLNj20kQ3dqUSAFQL/uDyV3tpdb76t1\", \"congregationalism\" },\n  { \"$5$short\", \"$5$short$aHEqHhvf.k.FmeYcxuTdHYwAR1rfP.6SMEg3C1VAC4C\", \"congregationalism\" },\n  { \"$5$rounds=1000$saltstring\", \"$5$rounds=1000$saltstring$Ztz9/LCcvh.EhdTii7HVr6B7k8gg3G91aaX07Y4qNa6\", \"dihydrosphingosine\" },\n  { \"$5$rounds=1000$short\", \"$5$rounds=1000$short$huNMHfh6.djIqkrpVGxNubCBUHVFGE6Tl8wFnMc8F/9\", \"dihydrosphingosine\" },\n  { \"$5$saltstring\", \"$5$saltstring$nnFpMrKDpLiOmV3r27c/u1aXuwM1qa2wmGXDy.WuZH6\", \"dihydrosphingosine\" },\n  { \"$5$short\", \"$5$short$UOoIFo5xkPjolSPuJhqTp0Y.KbODgMzX6PLzhp0wrP8\", \"dihydrosphingosine\" },\n  { \"$5$rounds=1000$saltstring\", \"$5$rounds=1000$saltstring$lGPC7OxE22w.U..pMC15d/vaJpiTQa90MGi5qkpc0hD\", \"semianthropological\" },\n  { \"$5$rounds=1000$short\", \"$5$rounds=1000$short$Wc7kDQm5oc.ncXJKN/ovrGglAvRjyrMjS7HmFOOThf1\", \"semianthropological\" },\n  { \"$5$saltstring\", \"$5$saltstring$gEtvL01MHGrBDm2mXMiHFJ.RrU./Ma/tdJ97IhFqKU4\", \"semianthropological\" },\n  { \"$5$short\", \"$5$short$rgG2hgd8BVoFKz4X5O4Bw8ZGf.yUrtXVojqC/vpkDz/\", \"semianthropological\" },\n  { \"$5$rounds=1000$saltstring\", \"$5$rounds=1000$saltstring$ZvtiW.ojdZ/4D5jSmorHe3cttL2u4sbtf7mrDn8mXD0\", \"palaeogeographically\" },\n  { \"$5$rounds=1000$short\", \"$5$rounds=1000$short$Ouu8bmsjQaJoaeOXRUSWv14xTFVchUdB2BNuf/iz.T0\", \"palaeogeographically\" },\n  { \"$5$saltstring\", \"$5$saltstring$xFg9T9AferqGOgz1tf4BXtca7pmBzSU/ndd.FcbZz/4\", \"palaeogeographically\" },\n  { \"$5$short\", \"$5$short$VlZZTuTHmUBLdXYor9zyFWBDm8yMEGnPi7WNCpswpHC\", \"palaeogeographically\" },\n  { \"$5$rounds=1000$saltstring\", \"$5$rounds=1000$saltstring$Jxz2ELvpKlzfpfyPw8z3djDAQ5rVE2VWgThdmw5FFZ9\", \"electromyographically\" },\n  { \"$5$rounds=1000$short\", \"$5$rounds=1000$short$zxnndt34usJ/tSj4Q8vya2Rn9NV4gho17lkrHGqQhU9\", \"electromyographically\" },\n  { \"$5$saltstring\", \"$5$saltstring$7w0VnvR0veF/DJiBgwbzy/FNE4ZL4ikQiUmRjkTocb8\", \"electromyographically\" },\n  { \"$5$short\", \"$5$short$/kodHpDQUFXMoR8xxqDi29dHOFmqaY5xc9KvKhugIx2\", \"electromyographically\" },\n  { \"$5$rounds=1000$saltstring\", \"$5$rounds=1000$saltstring$WDhu/SslnFKjL7GPYvdIbKSG6jmdDMmvSWkkhhiotV3\", \"noninterchangeableness\" },\n  { \"$5$rounds=1000$short\", \"$5$rounds=1000$short$tias6R5/CDL32Z5E2NfQvLLMZCGkQg3MDXvru8EZYXA\", \"noninterchangeableness\" },\n  { \"$5$saltstring\", \"$5$saltstring$IMhhfBdaQe3Z//6MqTaRLhnoALoBcSOh3Vy.S9HMhi8\", \"noninterchangeableness\" },\n  { \"$5$short\", \"$5$short$RQqbVWGu5mxCLgzwPjj/eJ2Wv/POU5in.ReSSgcvuC/\", \"noninterchangeableness\" },\n  { \"$5$rounds=1000$saltstring\", \"$5$rounds=1000$saltstring$dOmFIPgoW3PBRIyzN6aJmsPJyQJ3xbjL2FTKX162j22\", \"abcdefghijklmnopqrstuvwxyz\" },\n  { \"$5$rounds=1000$short\", \"$5$rounds=1000$short$L/dAUhD2tZtccNIxSubqgapvn2hvJUiR.69dRJKk.u/\", \"abcdefghijklmnopqrstuvwxyz\" },\n  { \"$5$saltstring\", \"$5$saltstring$aGry7pVYhkfltCgHFRyJXTlwefssqT0qxosJrEOX1w9\", \"abcdefghijklmnopqrstuvwxyz\" },\n  { \"$5$short\", \"$5$short$CCHdkpHtQRLrZn5MHY1MxGZsSsSYf28qa9z1uyF5cB7\", \"abcdefghijklmnopqrstuvwxyz\" },\n  { \"$5$rounds=1000$saltstring\", \"$5$rounds=1000$saltstring$qKkE9r5KjCoAOlXOlUy1eCH9GVe/IQZJat39ZctGuX6\", \"electroencephalographically\" },\n  { \"$5$rounds=1000$short\", \"$5$rounds=1000$short$NJX.c8uJBvQ6t1JYszvMVKYZirEWJJL3GUumUtw0DJ.\", \"electroencephalographically\" },\n  { \"$5$saltstring\", \"$5$saltstring$/z7CnEj2tu4OJv.5ZFmmY8kB2joFwjCjVdds8bn0pJ4\", \"electroencephalographically\" },\n  { \"$5$short\", \"$5$short$PkwxjYX3tBIZwAGX0DkbtgcVzavicCK3.sxVteTLx00\", \"electroencephalographically\" },\n  { \"$5$rounds=1000$saltstring\", \"$5$rounds=1000$saltstring$cT0IpGiU69KQJaTowa/7xNkIJijC0Cs3sdANYBIGMr0\", \"antidisestablishmentarianism\" },\n  { \"$5$rounds=1000$short\", \"$5$rounds=1000$short$ExLzGAlW4swzzo3vA9VUECglgmTvYdfai4vTXptH6K8\", \"antidisestablishmentarianism\" },\n  { \"$5$saltstring\", \"$5$saltstring$7bvFUMIVhg.kNNkYPuFV2aqeooTiC9V5ZRmserHWrG4\", \"antidisestablishmentarianism\" },\n  { \"$5$short\", \"$5$short$CVEY4iRE63rZnxGxdW3VklcR7A1fNF5PQnJ3f1pxL49\", \"antidisestablishmentarianism\" },\n  { \"$5$rounds=1000$saltstring\", \"$5$rounds=1000$saltstring$LQiZvWwjYdrFbTN5ymkBxHvng6Zu7f70raxBEOqWwUC\", \"cyclotrimethylenetrinitramine\" },\n  { \"$5$rounds=1000$short\", \"$5$rounds=1000$short$kD6UPSVgOnl6Y8TCvrHFeEa/Th9mOx8T8/N7rpX0od/\", \"cyclotrimethylenetrinitramine\" },\n  { \"$5$saltstring\", \"$5$saltstring$32JKKbGOT7Y8XZNR8EAesDA8FkGcSbbuOG03SSHjybA\", \"cyclotrimethylenetrinitramine\" },\n  { \"$5$short\", \"$5$short$F5nKWudDmv5p8YEJD0ReCNioPBqQMCbjhjVH.r1RV96\", \"cyclotrimethylenetrinitramine\" },\n  { \"$5$rounds=1000$saltstring\", \"$5$rounds=1000$saltstring$pvRk5EF7LhV0HzMYTUQv0kQ7x9w8mdKykut2qQDas1D\", \"dichlorodiphenyltrichloroethane\" },\n  { \"$5$rounds=1000$short\", \"$5$rounds=1000$short$FJZEx924cmXtSHSQs/lj6qoLQdbTYetJ9SNauPdsxc6\", \"dichlorodiphenyltrichloroethane\" },\n  { \"$5$saltstring\", \"$5$saltstring$jO1wWWY2aafB5lfcaLZIrpXJPxabcHX0RRHiFUQmryD\", \"dichlorodiphenyltrichloroethane\" },\n  { \"$5$short\", \"$5$short$/0aLVDWx3n2SLtAZ78JFbwb0R.tS/acVYzI1TdxWk66\", \"dichlorodiphenyltrichloroethane\" },\n  { \"$5$rounds=1000$saltstring\", \"$5$rounds=1000$saltstring$v3fD9XaC9bY.98wO5/ScchiBac3c6x0E3PpD9MQbWL1\", \"multiple words seperated by spaces\" },\n  { \"$5$rounds=1000$short\", \"$5$rounds=1000$short$C2yP42AGMo/MvxjBA3yTIcMT1WqXhX8rWajXmXTp9b/\", \"multiple words seperated by spaces\" },\n  { \"$5$saltstring\", \"$5$saltstring$pMkeCqxu.vtrw0mHNX8yMer/Z9FBDQxQLTOhuNaKD5A\", \"multiple words seperated by spaces\" },\n  { \"$5$short\", \"$5$short$HYDJPFwuZd0fMXq/6S98o3IzpQ1Q4xBHH0Y/blu/c/3\", \"multiple words seperated by spaces\" },\n  { \"$5$rounds=1000$saltstring\", \"$5$rounds=1000$saltstring$DwfeEUfydtq4ygunbHHUAIm8BZ2YBiOk6lrXLq0RA3B\", \"supercalifragilisticexpialidocious\" },\n  { \"$5$rounds=1000$short\", \"$5$rounds=1000$short$eR16tof73KzUkQjmy6TPwSmDfhrIiktrb8.QewY1nZB\", \"supercalifragilisticexpialidocious\" },\n  { \"$5$saltstring\", \"$5$saltstring$fiernEL6ChiHc7nPHkXcjjM9wcR1JiujSpO3M9PxVO3\", \"supercalifragilisticexpialidocious\" },\n  { \"$5$short\", \"$5$short$vZwGOK9.Z0OTKnQsRLjYAXUxKUXziXaPn9Xx6fjaIl5\", \"supercalifragilisticexpialidocious\" },\n  { \"$5$rounds=1000$saltstring\", \"$5$rounds=1000$saltstring$fed1lJ3lW2cumwmE7z56j2M9NKGJ/0cEPnUX6okL/JA\", \"we have a short salt string but not a short password\" },\n  { \"$5$rounds=1000$short\", \"$5$rounds=1000$short$MmIwYWG9YrU4oKUcYNM.GQIpfQfgtDuY60Pogui2lq7\", \"we have a short salt string but not a short password\" },\n  { \"$5$saltstring\", \"$5$saltstring$hAjPzXHWwGr9aUP09hSB6AppvpBlppQ76QOQrVTvOD.\", \"we have a short salt string but not a short password\" },\n  { \"$5$short\", \"$5$short$k38kpRP0CfxHLIcmymaSTFLK.iFfF4tKryDuEGKp6SC\", \"we have a short salt string but not a short password\" },\n  { \"$5$rounds=1000$saltstring\", \"$5$rounds=1000$saltstring$WETcug70j3U1CZ0KSQ7I4ExAfQMLOb3Ybdu.Fobesx.\", \"multiple word$ $eperated by $pace$ and $pecial character$\" },\n  { \"$5$rounds=1000$short\", \"$5$rounds=1000$short$sRnDROv.NNPqURgBm2H7XmSnQAe6pz4NQeIPbQltAs5\", \"multiple word$ $eperated by $pace$ and $pecial character$\" },\n  { \"$5$saltstring\", \"$5$saltstring$Hj0H5p4Ahc5B8Sj19RINIA96syTW/MJRghBIav0By./\", \"multiple word$ $eperated by $pace$ and $pecial character$\" },\n  { \"$5$short\", \"$5$short$LBld60HP1.xjGGVO9FfMs2yj9uDmtn4IhXZH.xfE2G6\", \"multiple word$ $eperated by $pace$ and $pecial character$\" },\n  { \"$5$rounds=1000$saltstring\", \"$5$rounds=1000$saltstring$iyc15a/9G.b4By0AM6Skl40ZFiVQ6Ve.4AWtS7qnRd2\", \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\" },\n  { \"$5$rounds=1000$short\", \"$5$rounds=1000$short$G7puPqxdnBssEpD9payou.77h7mPzKganTdVxIbp2C1\", \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\" },\n  { \"$5$saltstring\", \"$5$saltstring$Jihv1rKDul5NVDfWvK/9SJfRfqzAlp2aG2dN28Xeff0\", \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\" },\n  { \"$5$short\", \"$5$short$YbqMzWqKsXGeoCn/jNKu8RbEoQzDewXnAIfqsYw0di0\", \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\" },\n  { \"$5$rounds=1000$saltstring\", \"$5$rounds=1000$saltstring$IRtLOwX1H1LzYXdcKd410a1MT5McgLbhTxcnfDdQZPC\", \"12345678901234567890123456789012345678901234567890123456789012345678901234567890\" },\n  { \"$5$rounds=1000$short\", \"$5$rounds=1000$short$2Xo2DxeRyhsRVh5XZNbGBH3FjI0.RJ0if1j3Z6mEWh2\", \"12345678901234567890123456789012345678901234567890123456789012345678901234567890\" },\n  { \"$5$saltstring\", \"$5$saltstring$lrNPQ5cNmFI48/TRiyiejPsgxZjX2G91hAnr3tiSI/4\", \"12345678901234567890123456789012345678901234567890123456789012345678901234567890\" },\n  { \"$5$short\", \"$5$short$KwOfci8QXmXpL1x4ExMHKbXI6qRrYIkCvhN8VKawJH5\", \"12345678901234567890123456789012345678901234567890123456789012345678901234567890\" },\n  { \"$5$rounds=1000$saltstring\", \"$5$rounds=1000$saltstring$LQPlWhvLlgkoD59OQPyGFDSuwDFLmtCdDBOEuSjlM38\", \"a very much longer text to encrypt.  This one even stretches over morethan one line.\" },\n  { \"$5$rounds=1000$short\", \"$5$rounds=1000$short$Q.Av/946CD4FpBQd9dK57WSw7gQvjF9i80QZtf9Mg28\", \"a very much longer text to encrypt.  This one even stretches over morethan one line.\" },\n  { \"$5$saltstring\", \"$5$saltstring$GyTEZtFuSijnDwgZAdeQeFYSkAzF3f3QpZGhkJUrWWD\", \"a very much longer text to encrypt.  This one even stretches over morethan one line.\" },\n  { \"$5$short\", \"$5$short$i3halgCPA5Tj950eNUYOu0DzkhP80kE9UzWfE8CAZTC\", \"a very much longer text to encrypt.  This one even stretches over morethan one line.\" },\n  { \"$5$rounds=1000$saltstring\", \"$5$rounds=1000$saltstring$gk1cmhZrzlHbkS/YU0m.PwlXmUwpsAhUpajkCt3TxZ7\", \"\\xd0\\xc1\\xd2\\xcf\\xcc\\xd8\" },\n  { \"$5$rounds=1000$short\", \"$5$rounds=1000$short$vwWI7JOYj5dK1i5E35BUoicYy165qCkWdapQb6Twk7A\", \"\\xd0\\xc1\\xd2\\xcf\\xcc\\xd8\" },\n  { \"$5$saltstring\", \"$5$saltstring$6VnnZXMWFzOeI6ggS3s0OCxFV6AY9qXppMhPApgZyhD\", \"\\xd0\\xc1\\xd2\\xcf\\xcc\\xd8\" },\n  { \"$5$short\", \"$5$short$BFDPnEODDRy1YPioHKSTylA/IOjYXHITojD3S/Y9sY9\", \"\\xd0\\xc1\\xd2\\xcf\\xcc\\xd8\" },\n  { \"$5$rounds=1000$saltstring\", \"$5$rounds=1000$saltstring$yp5FNCpeL6lBQpXi3MZ84oEZwnIQuDIcbFSGJKQegV7\", \"\\xd5\\xaa\\xd5\\xaa\\xaa\\xaa\\xd5\\xaa\" },\n  { \"$5$rounds=1000$short\", \"$5$rounds=1000$short$XVnX3Amv3qP8fIRCimGVTxHaE5mY51uyWjgfCiwQSPA\", \"\\xd5\\xaa\\xd5\\xaa\\xaa\\xaa\\xd5\\xaa\" },\n  { \"$5$saltstring\", \"$5$saltstring$MdEVkH8B3PN/xikOXWPV6nCC8ZaO3cX7ebOsXEXZsO2\", \"\\xd5\\xaa\\xd5\\xaa\\xaa\\xaa\\xd5\\xaa\" },\n  { \"$5$short\", \"$5$short$I6DOrupEBRatUlTLa4RjBdGQv1hSJotXyUJU3U8dCmB\", \"\\xd5\\xaa\\xd5\\xaa\\xaa\\xaa\\xd5\\xaa\" },\n  { \"$5$rounds=1000$saltstring\", \"$5$rounds=1000$saltstring$9E4.qb3MwOEuU1h2sFFrE6XRrvwfMncska/wvO72MFA\", \"\\xe1\\xec\\xe5\\xf8\\xe1\\xee\\xe4\\xe5\\xf2\" },\n  { \"$5$rounds=1000$short\", \"$5$rounds=1000$short$k.tJT4X4nqn/uZOfY0gnleScETyx9LOAExP5MZV17b.\", \"\\xe1\\xec\\xe5\\xf8\\xe1\\xee\\xe4\\xe5\\xf2\" },\n  { \"$5$saltstring\", \"$5$saltstring$VEs9jMJrjQLbyhUejpy6/BdP4TbttCEIVxTfJpXcxV5\", \"\\xe1\\xec\\xe5\\xf8\\xe1\\xee\\xe4\\xe5\\xf2\" },\n  { \"$5$short\", \"$5$short$pYe1e3x0Gu/fk6VNo90twKozMEC3PQWOOlT/dV7VP42\", \"\\xe1\\xec\\xe5\\xf8\\xe1\\xee\\xe4\\xe5\\xf2\" },\n  { \"$5$rounds=1000$saltstring\", \"$5$rounds=1000$saltstring$HriXtU7JfPe7d8yIOJ6zTiOiT9t/nHRRr68kCKApqD9\", \"\\xf3\\xf4\\xe5\\xf0\\xe8\\xe1\\xee\\xe9\\xe5\" },\n  { \"$5$rounds=1000$short\", \"$5$rounds=1000$short$kR3dmjXARctlq2y5mZYiCXREn9WCRe6B21QMFYTJAg5\", \"\\xf3\\xf4\\xe5\\xf0\\xe8\\xe1\\xee\\xe9\\xe5\" },\n  { \"$5$saltstring\", \"$5$saltstring$nj0gZpcBJThrDkdgumO8UTgbgMujx/5x5I3aDUDLPw7\", \"\\xf3\\xf4\\xe5\\xf0\\xe8\\xe1\\xee\\xe9\\xe5\" },\n  { \"$5$short\", \"$5$short$rWKVGxY7USbu82RTnLFbJbp.Ai9l93IK/4Gw.lETit6\", \"\\xf3\\xf4\\xe5\\xf0\\xe8\\xe1\\xee\\xe9\\xe5\" },\n  { \"$5$rounds=1000$saltstring\", \"$5$rounds=1000$saltstring$7UGqH1PUpvOI7nQA53BmYkjX5RSYQVNPIQWEeB9jZ62\", \"\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\" },\n  { \"$5$rounds=1000$short\", \"$5$rounds=1000$short$ZOUU/ePkCUS74VyH0vq5/6UPuNJv11VQqZO.rHVbpX3\", \"\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\" },\n  { \"$5$saltstring\", \"$5$saltstring$RfVPT2pZPJYjGTYVZi/FeHo5RcOJY4KIQpYgP.ssvJ7\", \"\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\" },\n  { \"$5$short\", \"$5$short$1UWCOs5nAZ7BLTyMjP8yrK.P0bVWMBC6ugzP5f7mG72\", \"\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\" },\n  { \"$5$rounds=1000$saltstring\", \"$5$rounds=1000$saltstring$wKWBAS7VQIIVDySNOA30cOS/oRfOdgXW/xxu4UYmeKC\", \"\\xc3\\xa9tude\" },\n  { \"$5$rounds=1000$short\", \"$5$rounds=1000$short$8WIwuXDCLeGI8HEInbZvlH4sPyPF1ZKM.uGs/qT/2x4\", \"\\xc3\\xa9tude\" },\n  { \"$5$saltstring\", \"$5$saltstring$QlnL9RGFsX8B/AGDX0A3uuwAftWodyd.jCzsFuyf8N1\", \"\\xc3\\xa9tude\" },\n  { \"$5$short\", \"$5$short$Zmzn44UVLFYCCOH9DoNjQAKNXDazxBSfCVNEnDvCEsD\", \"\\xc3\\xa9tude\" },\n  { \"$5$rounds=1000$saltstring\", \"$5$rounds=1000$saltstring$8u/3/vJfg7OvAtim1YYxTxHVSbThl7zHu2Avjlp/Ls8\", \"C)tude\" },\n  { \"$5$rounds=1000$short\", \"$5$rounds=1000$short$lWZsDXd.2zW8tdjfvxf.hUWailjSN9UMwH28m7LNyED\", \"C)tude\" },\n  { \"$5$saltstring\", \"$5$saltstring$90AcLQxle/ahUCdPH65xgZXJW1Z556fGB7FdvUOs3sC\", \"C)tude\" },\n  { \"$5$short\", \"$5$short$nNez5uiDjDB4Gm4rASdWdsvMBpu45SW1bUHViMmiDU/\", \"C)tude\" },\n  { \"$5$rounds=1000$saltstring\", \"$5$rounds=1000$saltstring$3KSP.yY6tJfSfw4Izk4oR8bfhs.TLeN4LsON56liBw0\", \"Chl\\xc3\\xb6\"\"e\" },\n  { \"$5$rounds=1000$short\", \"$5$rounds=1000$short$DVxWZCKtQ0y4ybhL..wjjC5yDvaHp6DANjf54g6wy1.\", \"Chl\\xc3\\xb6\"\"e\" },\n  { \"$5$saltstring\", \"$5$saltstring$kfzKVZQMzmV2N.eErPTBpWGknf8uIJagpVtoMGjFHL/\", \"Chl\\xc3\\xb6\"\"e\" },\n  { \"$5$short\", \"$5$short$IJ3QWXGiVakbLkA4QmWIKHjQNhqWWXetg2LWOsO6of7\", \"Chl\\xc3\\xb6\"\"e\" },\n  { \"$5$rounds=1000$saltstring\", \"$5$rounds=1000$saltstring$ENTXAnkT3tf9A02K8MppeXYkb.Wvwc6D.U3Mbj56Ws.\", \"ChlC6e\" },\n  { \"$5$rounds=1000$short\", \"$5$rounds=1000$short$xtzj0nJxBWQay9PBMrqNEcsZmTx/q13uTg7ZlBySCA1\", \"ChlC6e\" },\n  { \"$5$saltstring\", \"$5$saltstring$FGSbqU0MFB.hSy9FfWp.2Ft1O1w6a5b2PgwM0QQ0kEA\", \"ChlC6e\" },\n  { \"$5$short\", \"$5$short$nalt3ZVS7TfvwLcOAfVT6KLmeNe4n3o1epkOKgqtu49\", \"ChlC6e\" },\n  { \"$5$rounds=1000$saltstring\", \"$5$rounds=1000$saltstring$LQoifXWEJ1vdCy16M9hsraudwVrh3kkcqDW.h8th8WD\", \"\\xc3\\x85ngstr\\xc3\\xb6m\" },\n  { \"$5$rounds=1000$short\", \"$5$rounds=1000$short$AQFgaOQ6XsvQFZbdsKsrTL9io1H9dWn6NFaxb27Fwd5\", \"\\xc3\\x85ngstr\\xc3\\xb6m\" },\n  { \"$5$saltstring\", \"$5$saltstring$AM9UjjyFdF4stfb22a/m7hvu6os1zF5HdE8.PwbxSi3\", \"\\xc3\\x85ngstr\\xc3\\xb6m\" },\n  { \"$5$short\", \"$5$short$Bsco/qeAtPyahH0oq7.p2uwGUVUYwtMNGDaB9.zVkm/\", \"\\xc3\\x85ngstr\\xc3\\xb6m\" },\n  { \"$5$rounds=1000$saltstring\", \"$5$rounds=1000$saltstring$ce4ju/M5FuwmUqv/hnPmII.9rAcKPXBT/eDKKCX95/6\", \"C\\x05ngstrC6m\" },\n  { \"$5$rounds=1000$short\", \"$5$rounds=1000$short$o5Y/HQCpLoX9NF8vdqic6qMGzaDfElSYs97Kca.EzV7\", \"C\\x05ngstrC6m\" },\n  { \"$5$saltstring\", \"$5$saltstring$VdoZfDfjYAVHqhzEXWJAMNWkEMhHI2gHV6juIqLZxf6\", \"C\\x05ngstrC6m\" },\n  { \"$5$short\", \"$5$short$WPthUBvSN3f/R3f6Y4uiXdpdc01sJ47Zx5H5nEdPGA0\", \"C\\x05ngstrC6m\" },\n  { \"$5$rounds=1000$saltstring\", \"$5$rounds=1000$saltstring$TBxDXOY54FP0scTIaoMs/Wz9uH9YZIZs5yp5HupgIj5\", \"C\\x05ngstrCU*U***U*\" },\n  { \"$5$rounds=1000$short\", \"$5$rounds=1000$short$Lkrj/zzbbDuRWHzm2yIjooZt4Fp.DwXttqvFClJz.d2\", \"C\\x05ngstrCU*U***U*\" },\n  { \"$5$saltstring\", \"$5$saltstring$kd6OS3hef1oXOVcT6i2S78Qr/gH3xPuNUsmVMwA6aT9\", \"C\\x05ngstrCU*U***U*\" },\n  { \"$5$short\", \"$5$short$tMuBqTyn9wk./frLwensjuJ4ufC/fK3FaSgUUQNQ8t7\", \"C\\x05ngstrCU*U***U*\" },\n  { \"$5$rounds=1000$saltstring\", \"$5$rounds=1000$saltstring$sNW6r1bvoUOElxOBXMF3exrNUcspyJoxoBzHXu6fjo9\", \"U*U***U*ignored\" },\n  { \"$5$rounds=1000$short\", \"$5$rounds=1000$short$deat4nWC5dVTiaTK97lYYbglk83A3TigoXymtxCJs69\", \"U*U***U*ignored\" },\n  { \"$5$saltstring\", \"$5$saltstring$wRpT8u2CoXrRr/C6BeIE0X0J1xOs4JMn9YFrgJMN47C\", \"U*U***U*ignored\" },\n  { \"$5$short\", \"$5$short$Q/t/KhCAoNOUJDD9q25n7VwpSR0t9ywCAd2o.p3UeI5\", \"U*U***U*ignored\" },\n  { \"$5$rounds=1000$saltstring\", \"$5$rounds=1000$saltstring$XOkLSld2i0Gvh.lIuoMlLtDW5wHTzgwBRL/OvVPNYJB\", \"U*U*U*U*\" },\n  { \"$5$rounds=1000$short\", \"$5$rounds=1000$short$8Rg3qoDqd5FApi.NBu7bry88Rf.GM4TBVL3QYemoop1\", \"U*U*U*U*\" },\n  { \"$5$saltstring\", \"$5$saltstring$fIwP.J5WacDL8/2681VIKTI5zY0fE7sRL1TqtKBHGZ1\", \"U*U*U*U*\" },\n  { \"$5$short\", \"$5$short$LVu3ZxISQAbAZjmNU/xaigpFRT4whgI4Phb4p1OyDbA\", \"U*U*U*U*\" },\n  { \"$5$rounds=1000$saltstring\", \"$5$rounds=1000$saltstring$jr8gCV/sfT1vDnLCHqOiY7VS7RGINZ0VENBsDI64EA0\", \"U*U*U*U*ignored\" },\n  { \"$5$rounds=1000$short\", \"$5$rounds=1000$short$a.8SBZG0iEeVbmH.k30b.MH1iIObUvEmpaJQWS08YK2\", \"U*U*U*U*ignored\" },\n  { \"$5$saltstring\", \"$5$saltstring$fhjC7SOvwvZx1OzMqD1x7c6yNa.95FDuIpvwjWLr/OD\", \"U*U*U*U*ignored\" },\n  { \"$5$short\", \"$5$short$M.1lIPdZuX5M2x.uBXOZxl.cRcObSmvaEZ2okOf2sA2\", \"U*U*U*U*ignored\" },\n  { \"$5$rounds=1000$saltstring\", \"$5$rounds=1000$saltstring$eihjeRQCktwBZPwa9ReRRzT5J4lM30s2Vtbp8n247Q.\", \"*U*U*U*U\" },\n  { \"$5$rounds=1000$short\", \"$5$rounds=1000$short$MtnExYMFnmeNYD3WVySFe9c4w1QrGCWIhCjIw.DiREC\", \"*U*U*U*U\" },\n  { \"$5$saltstring\", \"$5$saltstring$6dDpFuPXWJYZpIFWH5cQVtdl19gu7CPQvNq2fQN53KB\", \"*U*U*U*U\" },\n  { \"$5$short\", \"$5$short$TexhQP8iFMHgxQEHQGkWXXCjsyLWFtgj2FSpZlJDzs.\", \"*U*U*U*U\" },\n  { \"$5$rounds=1000$saltstring\", \"$5$rounds=1000$saltstring$THaCwy.hKVG0PqaVSwtbLt1Z21bDBxlHsz8XZx1SCw9\", \"*U*U*U*U*\" },\n  { \"$5$rounds=1000$short\", \"$5$rounds=1000$short$91nEtbnbm7eCjSeyXHKgOHhd73W8AYomC4NjxFlP8E7\", \"*U*U*U*U*\" },\n  { \"$5$saltstring\", \"$5$saltstring$66MMFyc7gSnLUy3Q/vAQfk/nC3aO431Pm6mQI16NVu7\", \"*U*U*U*U*\" },\n  { \"$5$short\", \"$5$short$cXex/yuGjoAWWUQFmLmriov8YT8yiALFuThaOxJ1Y/.\", \"*U*U*U*U*\" },\n  { \"$5$rounds=1000$saltstring\", \"$5$rounds=1000$saltstring$1XjmdUftmdl0vxeQQV.BzzA7dTCyH.hjgE7bYT1Nqb9\", \"*U*U*U*U*U*U*U*U\" },\n  { \"$5$rounds=1000$short\", \"$5$rounds=1000$short$jOD6VK5qHLXWgOqeGtYHpTlyRdsd6OSH.Gz/kxl1Kn.\", \"*U*U*U*U*U*U*U*U\" },\n  { \"$5$saltstring\", \"$5$saltstring$kC5Rv/TpesQjXdphc9nv5emEeIL8/j3SbMzCTx9gm3D\", \"*U*U*U*U*U*U*U*U\" },\n  { \"$5$short\", \"$5$short$K3t1UPv6fXpnZ//jsFWFmhSFQ.IBVSQNbv97YLPFYV.\", \"*U*U*U*U*U*U*U*U\" },\n  { \"$5$rounds=1000$saltstring\", \"$5$rounds=1000$saltstring$bXHL/qe1Ly3kbMYLUQHw0k1rYHGliLylw48Q50JZAN8\", \"*U*U*U*U*U*U*U*U*\" },\n  { \"$5$rounds=1000$short\", \"$5$rounds=1000$short$B1HmaHw/EszlsG1mG6BOrN7ZMgzpPcedUBLrBGZ2Rk1\", \"*U*U*U*U*U*U*U*U*\" },\n  { \"$5$saltstring\", \"$5$saltstring$ON9CgScsA1TVdyqC1NDNmVpR73B58eBuoGMw5uGgP6.\", \"*U*U*U*U*U*U*U*U*\" },\n  { \"$5$short\", \"$5$short$uFpf9oo7x4sVYvGtZIPNEELVgtEw3uQA9kcvVUoR1B9\", \"*U*U*U*U*U*U*U*U*\" },\n  { \"$5$rounds=1000$saltstring\", \"$5$rounds=1000$saltstring$l4GVwOvfBc0YxX8hqcNZBRM/1y9MRmvftllmUeoWNED\", \"\\xa3\" },\n  { \"$5$rounds=1000$short\", \"$5$rounds=1000$short$q.qMjvTXJCFiKWVCcMv8Tb40cSOwPcCd0YXinbU8VHA\", \"\\xa3\" },\n  { \"$5$saltstring\", \"$5$saltstring$O3BXeHQH5EJ57Wn6wQ5g3.V5zAb49Hf6TkK4YgfHzI/\", \"\\xa3\" },\n  { \"$5$short\", \"$5$short$eHufM64jvUn/SJ40GkV9C5K/MQgpt0TloNiPStW/m30\", \"\\xa3\" },\n  { \"$5$rounds=1000$saltstring\", \"$5$rounds=1000$saltstring$qajej7MTwAu9Pz1xQKeOJs6Hp1PityMI1SoCDBVJl5D\", \"\\xa3\"\"a\" },\n  { \"$5$rounds=1000$short\", \"$5$rounds=1000$short$Z/jfDC7CTp5zp9C4Y7TjWcCmHTgyGWlQOkSx9jUywt8\", \"\\xa3\"\"a\" },\n  { \"$5$saltstring\", \"$5$saltstring$.7kFVTI1wLmMXri1d8m7p72ZUifTFIBmLr38ZXBFmO4\", \"\\xa3\"\"a\" },\n  { \"$5$short\", \"$5$short$jiEo6p0ZAkvG5QyYSk113ZRlQK/nDOkiNJh.xHRQsBD\", \"\\xa3\"\"a\" },\n  { \"$5$rounds=1000$saltstring\", \"$5$rounds=1000$saltstring$nj/lBlTLTVe0hliQV8FSOnDzTYqvrRkwpCFusBdhZGB\", \"\\xd1\\x91\" },\n  { \"$5$rounds=1000$short\", \"$5$rounds=1000$short$zL20/QtiyvdXyPBjwH2qa.fPRoCdoWa9ehTExsKyw6A\", \"\\xd1\\x91\" },\n  { \"$5$saltstring\", \"$5$saltstring$d5dyionoZTFvY55JzosR4cuQJrqr6gT.Fb8EzDOINM7\", \"\\xd1\\x91\" },\n  { \"$5$short\", \"$5$short$KK8Ikc6poCc3DXiZsjZTMWMHKPLnXNtKTK7aut24trC\", \"\\xd1\\x91\" },\n  { \"$5$rounds=1000$saltstring\", \"$5$rounds=1000$saltstring$gWBaipSsSFWdKiTrX7.xZMK/rPboX9NJMnqGqb0CBsB\", \"\\xa3\"\"ab\" },\n  { \"$5$rounds=1000$short\", \"$5$rounds=1000$short$QE4iyV1U2sjE8msEYBm/lmb8AqHvCgOutWoQ1HILWDB\", \"\\xa3\"\"ab\" },\n  { \"$5$saltstring\", \"$5$saltstring$/km3mqS/G/x.MFh9KBR0NdlZEmBUISwz3m00o/QagJ6\", \"\\xa3\"\"ab\" },\n  { \"$5$short\", \"$5$short$N0EclrS/e7b5cWD2u/WxVad3cQuSS1zmNKUUwN8jzs3\", \"\\xa3\"\"ab\" },\n  { \"$5$rounds=1000$saltstring\", \"$5$rounds=1000$saltstring$TxRgTZCS8J4zgmjAOdsOsfx7RWenn8RkmHwwrsJNS4.\", \"\\xff\\xff\\xa3\" },\n  { \"$5$rounds=1000$short\", \"$5$rounds=1000$short$WsmbkHWyCQTNyQ3ZwtbHUs9HrPSUfyeiUtmq./SXFx1\", \"\\xff\\xff\\xa3\" },\n  { \"$5$saltstring\", \"$5$saltstring$.COnhsezFfwrVQbP8p00YcYbWxXnsoqC3lwyC3c2425\", \"\\xff\\xff\\xa3\" },\n  { \"$5$short\", \"$5$short$CPPwRKR/a12gBJH4NP5ojHnsjdJra3EeDpJoGjUwjb1\", \"\\xff\\xff\\xa3\" },\n  { \"$5$rounds=1000$saltstring\", \"$5$rounds=1000$saltstring$Xg3ubVsdlDkuqgMEGWfaD53Mca.H7xf.gniv.F/.dG8\", \"1\\xa3\"\"345\" },\n  { \"$5$rounds=1000$short\", \"$5$rounds=1000$short$JdnpVe6R6Gau6ROrAyZK00bWaw9t3qaw4lbgXnnbtSC\", \"1\\xa3\"\"345\" },\n  { \"$5$saltstring\", \"$5$saltstring$de3T6BCjxf1FUQfONzVilPJmezOGs.KOjC9THVRQVa1\", \"1\\xa3\"\"345\" },\n  { \"$5$short\", \"$5$short$GguGYaEbgyLXPsKjrN/qyMHf9k/CiduGgQZIN5HtdO5\", \"1\\xa3\"\"345\" },\n  { \"$5$rounds=1000$saltstring\", \"$5$rounds=1000$saltstring$dM.wMqEAvHsNsWLEXpebQ5mSzDeeZG6fSy6zpuU0dg9\", \"\\xff\\xa3\"\"345\" },\n  { \"$5$rounds=1000$short\", \"$5$rounds=1000$short$kcJnRFGKlJJLwf01rz15C0hz5wHL3PkLumn7LhlzGfB\", \"\\xff\\xa3\"\"345\" },\n  { \"$5$saltstring\", \"$5$saltstring$u7vqjaBFDu7JSukIL7tG/1CzytHYH.6qpRUBPR.hm65\", \"\\xff\\xa3\"\"345\" },\n  { \"$5$short\", \"$5$short$jKhDCbrxTPXa1Bn.H5RdYzfHI5qhRxsPUu4IXU6.PyD\", \"\\xff\\xa3\"\"345\" },\n  { \"$5$rounds=1000$saltstring\", \"$5$rounds=1000$saltstring$EJ1c2KQFGjxtzhqtQRtdz48JBwFIoJx8k1ZT9Jiq4d9\", \"\\xff\\xa3\"\"34\\xff\\xff\\xff\\xa3\"\"345\" },\n  { \"$5$rounds=1000$short\", \"$5$rounds=1000$short$Ek8LCijiYDniJm44bu4A3i7D37rjL5LEk7sl.WIq233\", \"\\xff\\xa3\"\"34\\xff\\xff\\xff\\xa3\"\"345\" },\n  { \"$5$saltstring\", \"$5$saltstring$HNIq3RAe0MXrkVr6dakN8SpMQ6859tmOcJCPQMtpcc.\", \"\\xff\\xa3\"\"34\\xff\\xff\\xff\\xa3\"\"345\" },\n  { \"$5$short\", \"$5$short$EOqEdDik53VTIfabvtwTyfaifyoyLbaT1owJYjUn7Z/\", \"\\xff\\xa3\"\"34\\xff\\xff\\xff\\xa3\"\"345\" },\n  { \"$5$rounds=1000$saltstring\", \"$5$rounds=1000$saltstring$kVNqYJivzIrebWWXn1U4VKlJEntiSvIafG5s029ih67\", \"U\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xff\" },\n  { \"$5$rounds=1000$short\", \"$5$rounds=1000$short$HH3SkCMnBeaxMz.uLK.UFM3dwkr8vfXIMoTWjig7c76\", \"U\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xff\" },\n  { \"$5$saltstring\", \"$5$saltstring$mVZkZPFUSzI9v2BYGPtD5Gzn1bfEopyddGJDNQhdmjB\", \"U\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xff\" },\n  { \"$5$short\", \"$5$short$tgJKveuOwdyG6XoB3yJWh2SAE9ntY2sB58sKWM5/BW0\", \"U\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xff\" },\n  { \"$5$rounds=1000$saltstring\", \"$5$rounds=1000$saltstring$qVGirGMoWjB/Z69NmPiB2B.NS4d.1FoPCiWBzSsc.5C\", \"\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\" },\n  { \"$5$rounds=1000$short\", \"$5$rounds=1000$short$kGy03Xexm3wbL94grcrrUd1k4nrR7.YPaGp1d3nvvr5\", \"\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\" },\n  { \"$5$saltstring\", \"$5$saltstring$ov.Jy9WwaTW/oqxi/qKFeVWCaL2W4MWTq/wVOAYtU5.\", \"\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\" },\n  { \"$5$short\", \"$5$short$opy6rbPVTArhWn97HXMMGbCYxXPkuaZizwAX.XJX/FD\", \"\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\" },\n  { \"$5$rounds=1000$saltstring\", \"$5$rounds=1000$saltstring$VkKzdlE1JejMEL.Y5D5P1gi/Yq6gdBk95RMvZ5oisO/\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\" },\n  { \"$5$rounds=1000$short\", \"$5$rounds=1000$short$I6fwZKRLdSRR8qWPO/fskouT4jW0h.v2fPopUTcCUm2\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\" },\n  { \"$5$saltstring\", \"$5$saltstring$YO0oZW5LlmwquY0etazzwJViUBZbrWWuLTxOu1lYhA1\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\" },\n  { \"$5$short\", \"$5$short$B3AT6NTe5GRCvTJo2P7sIlsVvAp8KLG.E.FL9zfJQG6\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\" },\n  { \"$5$rounds=1000$saltstring\", \"$5$rounds=1000$saltstring$gUqg0.W5wjf/MkQObzLELsDM4zxAF7UJuFoL4sh2E9.\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789chars after 72 are ignored\" },\n  { \"$5$rounds=1000$short\", \"$5$rounds=1000$short$aDe9qvKknPyjgyGHdlnLJZ5ICIan05/rNBXpQiaj2KD\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789chars after 72 are ignored\" },\n  { \"$5$saltstring\", \"$5$saltstring$jH3BNoiawVVVzC50m9189voB49kAVIds.n7fr8YBZ/9\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789chars after 72 are ignored\" },\n  { \"$5$short\", \"$5$short$jN0iwClI0xZHvLgpnY4.kd0H5Vu8d3p8wmz7ypctQ85\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789chars after 72 are ignored\" },\n  { \"$5$rounds=1000$saltstring\", \"$5$rounds=1000$saltstring$la2vBFM8h.w/6nvBM.stp/36ijTb1/3qBnmkHq3srr1\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\" },\n  { \"$5$rounds=1000$short\", \"$5$rounds=1000$short$QE/atedPCMXYCO.Ra8H6v6..wAH2eg9kLxXsFQm8Qy.\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\" },\n  { \"$5$saltstring\", \"$5$saltstring$AgiMWBAjafvFIH7a3dwM58GXLAc7CG9.WLTA6YLalo7\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\" },\n  { \"$5$short\", \"$5$short$wdEGKqXt8nNUdFyyT8AhuLzeu0n7MNKPJoNgrXoQHxB\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\" },\n  { \"$5$rounds=1000$saltstring\", \"$5$rounds=1000$saltstring$Wp7l1F/gGZjObvP4RcNT5i6UZAnH3ZyDrnHw4zf3WI6\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\"\"chars after 72 are ignored as usual\" },\n  { \"$5$rounds=1000$short\", \"$5$rounds=1000$short$s8MvOmxC5urOSwkKxaUtcVaVwUbvQ02KXBloLkkwtd/\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\"\"chars after 72 are ignored as usual\" },\n  { \"$5$saltstring\", \"$5$saltstring$oJTRi6ifiWjXOdSTxz6vidhK2Ravi8s8kdzNm5c69L7\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\"\"chars after 72 are ignored as usual\" },\n  { \"$5$short\", \"$5$short$lN2P/ch0DxoXiTqcTCkbech4t9JDfTivpq2skcDgXu6\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\"\"chars after 72 are ignored as usual\" },\n  { \"$5$rounds=1000$saltstring\", \"$5$rounds=1000$saltstring$KoR2vxitaHbPBeo4pull1WXi9wQmHN/z3GuPwnetZZ1\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has forgotten.\" },\n  { \"$5$rounds=1000$short\", \"$5$rounds=1000$short$Ynx75xSyBUrsFP752fb6gGNv.TWLOZgJ1CbbLelLsi9\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has forgotten.\" },\n  { \"$5$saltstring\", \"$5$saltstring$nINTWgP1LMRNXqxDr7KCC8bNRFfbZqL09gUh28Qx/0/\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has forgotten.\" },\n  { \"$5$short\", \"$5$short$XgYzO6f8kndNameCZWS36MOFqlWxWK1BAEWb1Q63q5.\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has forgotten.\" },\n  { \"$5$rounds=1000$saltstring\", \"$5$rounds=1000$saltstring$gVlj16PP14ChP.LQUqOo.OWuzssfLr/u66.h3DUUj46\", \"THE YEAR\" },\n  { \"$5$rounds=1000$short\", \"$5$rounds=1000$short$n2En3b7G45v27byFLmhXpDPwUySbQpMA6ilTXPhCFdC\", \"THE YEAR\" },\n  { \"$5$saltstring\", \"$5$saltstring$Vv1lzv5eAfcSCbebybS3gutlLuJpqQ21yfFWmt4LVHD\", \"THE YEAR\" },\n  { \"$5$short\", \"$5$short$7pg0D8TVmTf1UaaLMwVW.s5xL.69HZ8XfyXqeoLUrR9\", \"THE YEAR\" },\n  { \"$5$rounds=1000$saltstring\", \"$5$rounds=1000$saltstring$XIo2x0NKFm2167FjhnjfFOqORhi.s30sQAqcWVluIc9\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and do\" },\n  { \"$5$rounds=1000$short\", \"$5$rounds=1000$short$ZnqtIhKDdnYTNy54c81GAnDf03rJmuM7ctF9GcpE6K/\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and do\" },\n  { \"$5$saltstring\", \"$5$saltstring$u6o91TJF8rw.CppQUOeBkNFt7swIg78pit4z9Au0HO1\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and do\" },\n  { \"$5$short\", \"$5$short$XyUWXqKGt5DzxMwYLvv/JDIg1AlIvegbQnOT7QdI8Z7\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and do\" },\n  { \"$5$rounds=1000$saltstring\", \"$5$rounds=1000$saltstring$ZApVfssDWyWtqrFAzBpDVefHwmq/7hUn3AHgzeLLneD\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has f\" },\n  { \"$5$rounds=1000$short\", \"$5$rounds=1000$short$.O9mO3j2c3e4CJzYrYdqLvMp2lC.2CszbSN/XN/u1w7\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has f\" },\n  { \"$5$saltstring\", \"$5$saltstring$pSKQxUa2Hi9KsZs2ZajH5hfUIz1zYNP3fmIhGdJd6JA\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has f\" },\n  { \"$5$short\", \"$5$short$CPXKAGURsmbcVF0TVhJw8KiGh7wAG17hUGKIPCGwML2\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has f\" },\n#endif // sha256crypt\n\n#if INCLUDE_sha512crypt && defined TEST_sha512crypt\n  { \"$6$rounds=1000$saltstring\", \"$6$rounds=1000$saltstring$CF.N.0BYYN72qUcyvvSEsw6BVOF30ljypIAf09OO9srNHWPxyxF8MeuK7MXWjGoVlM.3yAAk/owEEJQEYuWsY1\", \"\" },\n  { \"$6$rounds=1000$short\", \"$6$rounds=1000$short$Ocl6K/qPAcDqPeFvc9A.3r9CpINjXCDnNaLAGbHGaUfW/VAnUhMnVHLP9fLC0f.gFxi5W6DCYe3HkDMICsYY21\", \"\" },\n  { \"$6$saltstring\", \"$6$saltstring$kyGrqt6gmjAdtFLPrflEFifSYLCWWq1pyx95SvqinLDy2UHmj0sTF0MSLMwxPFZc3tu5kQckI8fks0zOPda3n1\", \"\" },\n  { \"$6$short\", \"$6$short$9cWqpgO.6JABL0ADkGtfzxbmgs6aMf6bBGPgf/BfywRVTYst7nGb9Xj7Z.LBrpR8cGEdbOXzUd4c8bJUaBrOT0\", \"\" },\n  { \"$6$rounds=1000$saltstring\", \"$6$rounds=1000$saltstring$z9/OGLq8a1gH78Tr8AOieA72kANE1.AvrdSKbMGFlvl9Xvo/iMuzUr0iwhY0MUGTQ0Ml0axZ8aent6Ku3oE10.\", \" \" },\n  { \"$6$rounds=1000$short\", \"$6$rounds=1000$short$uk5nYPVtjONzRCt.AHJ9AQWXnz06P3rAUmeEm/rEhGdkRpwU4paa7eMPJrnEXuQeT1dG3EW5bAnPBoUXGfpre/\", \" \" },\n  { \"$6$saltstring\", \"$6$saltstring$EJ4I95ilqN/xS610X0E4NakP7nU0ch3o0WjeZfC.dyLIX8Epyw8tRFBHQCeCsWAQ.7EA0RL/OkSnZ98spMVQY1\", \" \" },\n  { \"$6$short\", \"$6$short$cTaRWuqZPPUFmBogM4J5BssQiHsva4xbFVw4Ffz1qc4iXoM1KSlzREiXelBhIhuUDQDeWwezbvZSQPY7yeVEM1\", \" \" },\n  { \"$6$rounds=1000$saltstring\", \"$6$rounds=1000$saltstring$RrPGXWEiJKglBQ7c4Z7ubMQSfj96YZui3FKtC93SVTqGfF2ex1C1SYjoBtBB4ba3rt/BD7RfAsnl9LRml0K1.0\", \"a\" },\n  { \"$6$rounds=1000$short\", \"$6$rounds=1000$short$fLMyq4ATZ565WMG8sNs7yVQoJ6kiQXR.mIdj7DncgVb3BfDZJfIpHJwv9pmj1.X6mXDa4kw3sDEXp.TMrHCSB.\", \"a\" },\n  { \"$6$saltstring\", \"$6$saltstring$MO53nAXQUKXVLlsbiXyPgMsR6q10N7eF7sPvanwdXnEeCj5kE3eYaRvFv0wVW1UZ4SnNTzc1v4OCOq1ASDQZY0\", \"a\" },\n  { \"$6$short\", \"$6$short$H.b6NeQvCMQ5GOPvzn5zXXcNUM2w0yE5a8Oal0EJetFKvqFQ6m2H7Mqzyppvg98IIRXVxUXmgh7oCMe8z/7hP0\", \"a\" },\n  { \"$6$rounds=1000$saltstring\", \"$6$rounds=1000$saltstring$7cb.nX/vTRLhJubZ36w/FqG6Lnc13OhLW0dSlWB9AZACurRv24vCZKJAsx7DRMg0OXEnzf8lHxS1bytPWFHSc0\", \"ab\" },\n  { \"$6$rounds=1000$short\", \"$6$rounds=1000$short$0GyoN.SITegKx6YKFiQB32lwP2DZ0gUycrUqGAQ083JAP1P9h.bzJIvZ/YR9e8sK3ipT8fCkV0KymXGkuvmxM1\", \"ab\" },\n  { \"$6$saltstring\", \"$6$saltstring$q.eQ9PCFPe/tOHJPT7lQwnVQ9znjTT89hsg1NWHCRCAMsbtpBLbg1FLq7xo1BaCM0y/z46pXv4CGESVWQlOk30\", \"ab\" },\n  { \"$6$short\", \"$6$short$h6ONWxgu/DxeSf9K3s9xBLakt6oSmK/AowUBPfsxO0aEdKuCHe9ftyi7TFpM.IaA2LQXbflWOsUErieB4Rpap0\", \"ab\" },\n  { \"$6$rounds=1000$saltstring\", \"$6$rounds=1000$saltstring$6NXfJcHAqOszRoqrAsiHaMLcALd/df4qk51Md4dEGLXrloQi6cyqUbtHDwWpZDzImbFkZCx2eWVTYIGoe1dJi1\", \"abc\" },\n  { \"$6$rounds=1000$short\", \"$6$rounds=1000$short$CRJLGVN4TQNTWduw0Yp7yEH6wT79OmBVoFSEQ8G3ukm9Nus7PUrAjbIGCkEY3PNsosPBjiteaQQfiMADjrvsL/\", \"abc\" },\n  { \"$6$saltstring\", \"$6$saltstring$pClZZISU0lxEwKr1z81EuJdiMLwWncjShXap25hiDGVMnCvlF5zS3ysvBdVRZqPDCdSTj06rwjrLX3bOS1Cak/\", \"abc\" },\n  { \"$6$short\", \"$6$short$Ryq3E6X1uflaH/sejgCmd0x1.7auBVIFWrOIV7TOdgr3jpkhRAKUqgcDaTH9Cz0yspS0dOsLZNr541gtVWIyS.\", \"abc\" },\n  { \"$6$rounds=1000$saltstring\", \"$6$rounds=1000$saltstring$6supY5aNDQVvBGYV4FvM00TPOhNTmySH0kzOVRhxfSAv/0e.9HhbrE/nCxhRiNLaSzDBasxYQX.YrmLmIoQB0/\", \"U*U\" },\n  { \"$6$rounds=1000$short\", \"$6$rounds=1000$short$3uc/HTmhqDdzlkTyQ7JJpMRRfj9d21NxgfS3elz.63bUcqov/Gz.mOrrtW2PJDn/TBTrwJo3XYl7W79wB6Cez0\", \"U*U\" },\n  { \"$6$saltstring\", \"$6$saltstring$hitX40AsX91LfrgfyWiA7hqXb.iu7KxcYOMpo2DsJPdpzpQkHPzdjo.YBVr9cxVFSBHMa8eKgPyXSLuNyUPZo1\", \"U*U\" },\n  { \"$6$short\", \"$6$short$/fj4QrdCNavMCL3fjX/5lb003LqpEVS3VTrdXpFUJeFIJJLfq6nu/3Ol46kjwYSpmQtPgMZ88wrFU9Zz58gli0\", \"U*U\" },\n  { \"$6$rounds=1000$saltstring\", \"$6$rounds=1000$saltstring$QpJyPX8a8xQvTV45BsjKAKz3hRvOjUE6jR/gygc9E2KWdhuqDTzE3UG9iBJCBbentFQTprqgfuot/yb0/wioB/\", \"U*U*\" },\n  { \"$6$rounds=1000$short\", \"$6$rounds=1000$short$f3iK5AFf4ZmvHDzwEcQe51hxUemi8UN4GGujN1D.XqlX4PGugGYX.jYo0T7OBqRS0tDM0DJneUrtODYwlGg7M.\", \"U*U*\" },\n  { \"$6$saltstring\", \"$6$saltstring$LxcShRvMQCHA.zcsI/DA.BiDJuO.NakGsSUgyP3/.CmD1BefgmltDFyv7zhEQfre1pXojfJdtFr43Pnjz8HuS1\", \"U*U*\" },\n  { \"$6$short\", \"$6$short$UxD/GBDw5uZSpQaaGTrdaf2GgAEtQ0F8E4.R2Vqsch5SekTY9dwANzKMuw1E/gtYXQVWBwI9EirBE1QErDD5t1\", \"U*U*\" },\n  { \"$6$rounds=1000$saltstring\", \"$6$rounds=1000$saltstring$aPnsG1a6Q11OEUgdEvb2K/M5tleKAo3UUwOtARzgau3zVpJ3SMm.2Tls1WawZ8CcCstgs0iL8BE5mmeVnDTyn.\", \"U*U*U\" },\n  { \"$6$rounds=1000$short\", \"$6$rounds=1000$short$a..ep.5S4SEVwWuMm2t9fyjLSoeE..lCfuHxqeZeMqA2G7WjU3OK0/rNW5TWDYP3dfdx.oaBieR6wdrG/3MLh0\", \"U*U*U\" },\n  { \"$6$saltstring\", \"$6$saltstring$o.lX/OaU2BzTI4xKucC0wOS/UNGkMMQmo.oR0lK8c02WCKnUDCDwFqIpBVCQIbVQJIQ4Faa9gWyJzey0r8KtF0\", \"U*U*U\" },\n  { \"$6$short\", \"$6$short$KRnh4SZI2RoOsf1IhN/Qr79MJrqHv33Qx453HNa2iqS6CNIbsprMjvtalghXE9OCvtHaVQqKIKv6Zh9EjUZiq0\", \"U*U*U\" },\n  { \"$6$rounds=1000$saltstring\", \"$6$rounds=1000$saltstring$gqEXRsuIypeY0yPmrOsj2wPMOoZLf7NC830BMfX0dPXyWAgXeuHX9Gv.grXCSr.ZTZ7mzGHTb65vt87soTv1b0\", \".....\" },\n  { \"$6$rounds=1000$short\", \"$6$rounds=1000$short$ZKrjx7t0VMhA8dnBQpZ/yCVeS9gdrITs8gHsoxWFhnaGDHXQNe9G5WYH2CQAleFZ9B4t5iBCKBa0Y5pRkL6z..\", \".....\" },\n  { \"$6$saltstring\", \"$6$saltstring$BMjmQjIKt4.nbFKlanQwIjgOR5Jxa/VPrMinnNV9DYJO3jRFy11KBuAgOU3lFdZ7jgT7ZIfrI2rqgAvRng1UV.\", \".....\" },\n  { \"$6$short\", \"$6$short$tQMoNHI/Vly3tDFTKIx2A4z4ay2FGWtVhlGZ98g2VzWa03BOsx3rEhwUUNut8dUYmCGB3saNsJn6Mq3LowfQV.\", \".....\" },\n  { \"$6$rounds=1000$saltstring\", \"$6$rounds=1000$saltstring$En8o/oyzgbyw63JdjWu.Aes3bingJfWRZaiwbYK./iuQnklEsPznYePOdzOSzYo6Tisz7duXW2ipkjAhIke2g/\", \"dragon\" },\n  { \"$6$rounds=1000$short\", \"$6$rounds=1000$short$yvmbqXI2qt9bZWSsZ.WflX6oSrjs5o9EULyuVyxjKq7KIS6bde51ObcKDxLCOIlUF10rJgrI74dk3gnxqQT7T1\", \"dragon\" },\n  { \"$6$saltstring\", \"$6$saltstring$T5Pvevzodw2yOMrxNC1VW2A2CkVUovvfCgmix9t.oPmrAFwOaX1dIyDo3AWgEXnKKludzNtDirvW9vxQhmomC0\", \"dragon\" },\n  { \"$6$short\", \"$6$short$kxo6QdZ2eitvmQSaTxHbeE/s8hH7JtPlafO/igRODmgEU85OgRksEFgthUebJuKayTde6Q1GI5VKjrmELYn6X/\", \"dragon\" },\n  { \"$6$rounds=1000$saltstring\", \"$6$rounds=1000$saltstring$yrI7xfcE05dakMP491u1JNRQyoZuRHmKDSYewYOSa688xW0157Q0dDq8FYtaQ4hSzrl9EbvtzqyQ/3ALHZmlp/\", \"dRaGoN\" },\n  { \"$6$rounds=1000$short\", \"$6$rounds=1000$short$uQsO0zO3H/apaYVK1XT.CZgXvzfrzjD8HtEZ048AhaBqihzVoRbmlR39SVOHnxskhqBYyZHbc9dORNMMFFjuG/\", \"dRaGoN\" },\n  { \"$6$saltstring\", \"$6$saltstring$gQPpfX77fpxMZCcOVWuxxuJ86S0tFGSJIkg.HPg3KHXDQm91bgQ0hl.71kPHPhNakphdI54bCzM8L66OEOgDt.\", \"dRaGoN\" },\n  { \"$6$short\", \"$6$short$3bZaOHFVYyk6mP59idwIFAh5NwQ4YQo2Tnguxf6mwyrhjal/EIGTA4d0aRvJXa1yNsaTwQZnQj.FK5LiGycYl0\", \"dRaGoN\" },\n  { \"$6$rounds=1000$saltstring\", \"$6$rounds=1000$saltstring$tfUZMKR82Xdxy7rP9MSw/r8FHGM/4reAAt96iM9EU5sl6WlXUVqQg/4zxJu.6gUWIyxUSk6469.crqhZuNaYK.\", \"DrAgOn\" },\n  { \"$6$rounds=1000$short\", \"$6$rounds=1000$short$kq4PJSdy8JZtArEHelqkv1ue.vZOPwWsntDsZ50Xc1O0JeIGGxZHfXEnVdZfPu.uAtOKrOp21HxrLE5k9SZwZ1\", \"DrAgOn\" },\n  { \"$6$saltstring\", \"$6$saltstring$woi7zhTQTPiwhwfVPwtZbJUCX4fFU/LVWsB7F1X2.rLSpb19pJxi5hd77H7xFqcin1/y6mpRb4s1ca2idmtrB1\", \"DrAgOn\" },\n  { \"$6$short\", \"$6$short$piblfONXxsf4SeUM.wPXKgIyehV1rXTuewSVFTDtaE/XmRbCmR.v2wwDEUFbzQuxhWsUgERSBCHNLIZXH.SLQ1\", \"DrAgOn\" },\n  { \"$6$rounds=1000$saltstring\", \"$6$rounds=1000$saltstring$aHF6yPAGj5786f.6c6Vpl82sxE8KbJ8dkm3L8dYbAv1WsxlHz8RBIKbkgkcYWy0A3fbP7QrY5bvBD0zq1F9oV1\", \"PAROLX\" },\n  { \"$6$rounds=1000$short\", \"$6$rounds=1000$short$AKP45r11vC6X.wtvc31AthJDoj20oddoJurs604Ad/10/Ya99OhQRg7Sk0v1Yv2T0L072Htq1wUN2Htkieede.\", \"PAROLX\" },\n  { \"$6$saltstring\", \"$6$saltstring$YRWRCWdqhjbClmDQbolZP4zqGT8gDIhSXNzc0Pv0od455wb8PBgTMHF5VUUAzZ6bi5ksJrj/wSKw/jcOwhJiB.\", \"PAROLX\" },\n  { \"$6$short\", \"$6$short$NDdVSOD2Ofd/BBRPxStg1aV05uiAgqbnbmKilz7PHnFv2McaeYKy97JGecnvfFT9voKa48GljriViITsVmPHF1\", \"PAROLX\" },\n  { \"$6$rounds=1000$saltstring\", \"$6$rounds=1000$saltstring$MejmM.FdVO4uPJY/2lmIw8PsF6XsXqNePvqDxg9oHSBQq7R.HVm.kizyaXRKHC4pqqUcE2x/DKSFJNSuUiZyt0\", \"U*U***U\" },\n  { \"$6$rounds=1000$short\", \"$6$rounds=1000$short$lWUCaM7m4FveO2wVFaK2uPu/0P/YFQcUQ3QgvSsyCnKbxtO2krsS21qW34yRBvH5gRa6E4GvvuOcPcZjeg0Mu/\", \"U*U***U\" },\n  { \"$6$saltstring\", \"$6$saltstring$xScdaJUfK9ogPrG3Pr7QPrdwWVTBELr/G6ejjsWl63EmyvrKqfJI8S8alziVwLb/7brxLXdULlBKBkZVMj2uu1\", \"U*U***U\" },\n  { \"$6$short\", \"$6$short$PSXUZOFMY66rAh3BSrBU6aFSLE0vKnUagLBMBeg0cGn94qP4CakAi/nJpS3X95HOzyXAu40smIKHaU1DPAzUy0\", \"U*U***U\" },\n  { \"$6$rounds=1000$saltstring\", \"$6$rounds=1000$saltstring$v6ewfGx3LKwaU6ErzCjUrTPki8Ce1oTrUyjLZfCB6TNk5TB0.BRn3K1Upyi.ayspVIUaVsuWy9jiwHfgO3//v1\", \"abcdefg\" },\n  { \"$6$rounds=1000$short\", \"$6$rounds=1000$short$CVjnpPl4DwiXa1dTuc4bCPS/6G6hzBCuTmcneiqtUVIfexvukN6cWorGEazFACKCY/JtYpl2Y80rqJKtJ6noi.\", \"abcdefg\" },\n  { \"$6$saltstring\", \"$6$saltstring$YBQ5J5EMRuC6k7B2GTsNaXx8u/957XMB.slQmY/lOjKd1zTIQF.ulLmy8O0VnJJ3cV.1pjP.KCgEjjMpz4pnS1\", \"abcdefg\" },\n  { \"$6$short\", \"$6$short$mAM7laJRaAgxZkAbi8JvV76sZ/oESqgfILMv6ipn3VWpdGItIw0kIKgeb6yiaLTOKFs0Tx3Aat3uD6jb/kyVh0\", \"abcdefg\" },\n  { \"$6$rounds=1000$saltstring\", \"$6$rounds=1000$saltstring$yxI4nqKMGR1L1ExV9qklDjFG6E4NKcSlKb3rq97/M0xHyr90dP9z1LSBkkUQVsCMBHKcFiEwIuBcYC5LJ.c7m.\", \"01234567\" },\n  { \"$6$rounds=1000$short\", \"$6$rounds=1000$short$uxm7LbFP/sgIsZgJG5sCGOBoYRbhqrgM6sbb82/ONghu/EfcaW037Il.BR4nq9l3IzQFAVp.ykCqkc7fOn8QT1\", \"01234567\" },\n  { \"$6$saltstring\", \"$6$saltstring$IUhZcWIrPwMl63Oj7MX4VmgPWKlqfnoHFDqCOWKKcHO8c4CEHFwEpEI0CirU4tYz30IqR3eeWkYP9YhMQHmfK1\", \"01234567\" },\n  { \"$6$short\", \"$6$short$wq4c0Xo0CC6WnT5H9RJvP/PQZVxD/X5Mx94QUAhzNnLarEnn7Q9WvS7tjjvv6jQVoAsARytK86UntkddTmRaE1\", \"01234567\" },\n  { \"$6$rounds=1000$saltstring\", \"$6$rounds=1000$saltstring$/2.GiP6ZBy3kXzOKHn7uzID4w87vIJJ7g0MPeI08R1BjyawVjbQKbDaR2Plp8n1gMCsTs2.8Yq7tuGfnDqTrf.\", \"726 even\" },\n  { \"$6$rounds=1000$short\", \"$6$rounds=1000$short$JWUognoEgDLOYnkw7PX0H6Vs2ppz2/gFTHaASLvtob7kty82QkHLetXma5Od5FXf7m6Xpee9PdFDYau12pAX80\", \"726 even\" },\n  { \"$6$saltstring\", \"$6$saltstring$PDwX1LTmFznmuJJK5s18YVjBQx2auusk/d3QGvbziQIcHR5SynNEhnvSCTaLD.cNcHlgu9BwNtFzukKPEWSRN1\", \"726 even\" },\n  { \"$6$short\", \"$6$short$x2Jou.v7wjBpHDIw979qDh7Rj8TAOhQ/YlJ6/axxWFbwt/xn3NRHdrdGAjvboyPsPHx75FDXZyTa3ZIqlrM160\", \"726 even\" },\n  { \"$6$rounds=1000$saltstring\", \"$6$rounds=1000$saltstring$7w5i/bK5wBtam9q/c75Rc6FxMaIQGieE8Sxr93Vby82Rp7qJaX8OJzAKBZlgnBAQJuvrwGV0CUbZYV8B.vZGv.\", \"zyxwvuts\" },\n  { \"$6$rounds=1000$short\", \"$6$rounds=1000$short$1PFgbHD2gubtqao.DYRmi/pEKQgUp9/VeqYiVwlnoXqilGi4ANIhaLYN8mrAVuhPu0wcVk7Z1rW9Sdf7Js6rt1\", \"zyxwvuts\" },\n  { \"$6$saltstring\", \"$6$saltstring$/xSotNhtJDqi7ac9fWq7ezQhiHD79VAY4LId2M6z5Eb.UwKHQUMsx5/RKNE8l8ejxBitkeqAAI8yjK.LQvCs7/\", \"zyxwvuts\" },\n  { \"$6$short\", \"$6$short$4OZ6AWaxNsOK8MNOXBdFxTmaXDCwhhbaVFEzIjx1ruJ/2VQzlZe92r3LJnxI8Bq0DWnrD4yKxty64hAtCZdH.0\", \"zyxwvuts\" },\n  { \"$6$rounds=1000$saltstring\", \"$6$rounds=1000$saltstring$6aqMDQntWWumaowUdKVT.7qAISv4eTdk57XhdJQ80wrtjxhmbv/NwdZVatFHpOKQq3/a0OAIfB7.9Z1ezcE261\", \"ab1234567\" },\n  { \"$6$rounds=1000$short\", \"$6$rounds=1000$short$fW9xxf0lJlojZN8RoX6m6QPY.lmR9hRNFN1JGq9SAj56KDcd2tYC5wBfCYyExX60QvgBO0iXEExD2PgaUoy5G1\", \"ab1234567\" },\n  { \"$6$saltstring\", \"$6$saltstring$88RiumddDjzoI7aZxYoraZfohCDi.diPRtEeU/W8FYpChHMzY3KHcobtvfS.j4vWk.upu2eXxLHJpcTB3iCnM0\", \"ab1234567\" },\n  { \"$6$short\", \"$6$short$kEJ49Mx7ct.fMjF.JQeoawGdrD6hScqA2M58qu9u5d/sFHtFmAkaYEWH7N52qYzjsPdRP6QxllPIGzqr5ceDg1\", \"ab1234567\" },\n  { \"$6$rounds=1000$saltstring\", \"$6$rounds=1000$saltstring$9ap3pOL.0hemQKfgMZBN4i.AMMLnk6TTHoaiqqOj/ZwTfpOzr.5O61iOlrtSTl/s.kqMwx9Qq9vqdnMY599Et.\", \"alexander\" },\n  { \"$6$rounds=1000$short\", \"$6$rounds=1000$short$lwBu6Fuycna18Tv8laX074./jT7L7QJ1OJs1XJo9hHD7sFVI5hByP34PC0Cba2OOs/wUqS94/MWmVwug7nHt30\", \"alexander\" },\n  { \"$6$saltstring\", \"$6$saltstring$sJtcsdgzKCHX5dZ8HLUiuFk0l1KSq2YDhWZQ4d5FWBriG1bj2IQXNa/QnGzXUKtZy8s5WrPQqgIhZSjc255AU0\", \"alexander\" },\n  { \"$6$short\", \"$6$short$gTHcvDR1MN6WQHAyxm2TzF/T9HjM4FWnxDqsoKia6A12h.l/qVmaWeEkIgZ7lDQcxEztdUCM8mSb3un8niAR3/\", \"alexander\" },\n  { \"$6$rounds=1000$saltstring\", \"$6$rounds=1000$saltstring$UCHJCtk1hH3Ln/Omk8Do8TIlajueMYZU5XcHyhdBXZQbpdsR2DBK2FdrA1YtNIfX.IHn2wXdb6j3vbBkmPNWU0\", \"beautiful\" },\n  { \"$6$rounds=1000$short\", \"$6$rounds=1000$short$KkHTzX6kaaTemTaKvJrL6MD4tKCHRjW2uaLOdbf/wt9X2xpr6l0AXSR/fFDGHPZUCYxXMFQxAsMO3mrtb5oPd1\", \"beautiful\" },\n  { \"$6$saltstring\", \"$6$saltstring$uGpzSu67SBz3WdBwL2BYMOb4bWHNEnAN6og/NnWbtmPcV45m0nfmRFicGSTqRU8ciUDWBCjPqXEDd..8XFiQk0\", \"beautiful\" },\n  { \"$6$short\", \"$6$short$lbKkYMxfOZaU4Bt7IYdn.1s8IXajUzgoUaz6Ao0uNZC4xbP32wz3fUMvulXi0SF/BOsrRXZJ/rvES4ZBiTN3z.\", \"beautiful\" },\n  { \"$6$rounds=1000$saltstring\", \"$6$rounds=1000$saltstring$6y0WHB3/Ru6zIBLFakwhSaORlUsUjuKAHlfOAQ94PBheyIk785u2gkhPs9CWYKRTXXLVjHIeWWVtevgi3frw./\", \"challenge\" },\n  { \"$6$rounds=1000$short\", \"$6$rounds=1000$short$b3NVbgqoVE4OPQrxPW1F7Iwd25wqdNAyuqQiYWZ3pqG.adEzvynJ/T2bzSxsTkifOJZcMOgOTsYHfDCBqQsGq1\", \"challenge\" },\n  { \"$6$saltstring\", \"$6$saltstring$IoCnLUypAiOc5N6QOr6HH/I9BF8wX7KbT/vUbp8SMnaCjBiWw.yPXVAiFdnX9B0x6tZtEJgHDL68/AJbMqrzo/\", \"challenge\" },\n  { \"$6$short\", \"$6$short$5u1J1/nW1jX5GQkKoPBnsj4Mp.PwuO6Ch0rwLJADCxI50GpayA448olHvBR3rfNGlanIJ0BwoO2CP2Pytdh7P/\", \"challenge\" },\n  { \"$6$rounds=1000$saltstring\", \"$6$rounds=1000$saltstring$.pwes.io0cSb2UF1WZF/28nM2a3Cq9uq.ix8c/ARfapguyysiDQK.QwPqGz3X.vRq4y4c60H2MJ5NuXqAxVlD.\", \"chocolate\" },\n  { \"$6$rounds=1000$short\", \"$6$rounds=1000$short$9L8I/NANkidvv.gBJT5Xx0Gtx.7Cp2U9Gc7qs5.mmr1G9ETM1B//bwlNLum89Zv64s822ZEhJoLd6v62TRCgt1\", \"chocolate\" },\n  { \"$6$saltstring\", \"$6$saltstring$J.dgq9aSPocnaRtuUkXQxhZkIeXIuAp/LMo69Os4iBeiDa.0QfsfPtJ51oZoBI2Kn2sWdWkfjxUNT3BqNFRSg.\", \"chocolate\" },\n  { \"$6$short\", \"$6$short$ibsxqRXouBAsURuHVgjRqaT6L4MvmtCkHqnBypM9z8yGXU1XqNlMkYOAQA1fIYmCl3MYdqPf3J0ugleTcl2Iu.\", \"chocolate\" },\n  { \"$6$rounds=1000$saltstring\", \"$6$rounds=1000$saltstring$x0Uv0V6qleasFEfgYxxLXRss6kWbyVDEqWI7wPq763yA08gtYezHs4EpiJhZ46bwej99czUMN9wnRNq8khSOZ1\", \"cr1234567\" },\n  { \"$6$rounds=1000$short\", \"$6$rounds=1000$short$vvd8EgisjnZwwHjrPWXBDMzXnnS7rbLkLFmYpPAxK7M05OCC1IWZw2csWpwRVh9uzMtgrsZjvYUVF5DxXzdSf0\", \"cr1234567\" },\n  { \"$6$saltstring\", \"$6$saltstring$Tyubx.MJi8OtoEUtF1R8Awuq1/J4jfOkrGF6p.X73jdOL6S.39EtDXtk5XsMmQbM3ku4pE.hRnV66TKF1idH3.\", \"cr1234567\" },\n  { \"$6$short\", \"$6$short$phqFUlvea4pxo7MPWaXLoqcof2.vJ.SaDxo3MVDsqb52m/c8BTqVDebxvG9tbSwXo3vE.zA3bPNNKKRaziWsV/\", \"cr1234567\" },\n  { \"$6$rounds=1000$saltstring\", \"$6$rounds=1000$saltstring$Ph4ACwjluk48VTJzznay6W/5.dRwQ9r5wmNDc.P16j9YDWbW19/7YjzsovnXBXjuGg5iWikVyp0/BQ4uw6iTr/\", \"katherine\" },\n  { \"$6$rounds=1000$short\", \"$6$rounds=1000$short$PwO9r3LrV6dmtVS4ZxIHgO9PgVd82W3Z9ed8QNSe9rT1fAZ0kcN6dZzUGerS7W2GKm9gLTDZeJ.bqKROrIR5U.\", \"katherine\" },\n  { \"$6$saltstring\", \"$6$saltstring$4MCBo5IK..GdkDABFP.8zxqUehcttV3vZNtR/Y5NiuaPXFQLgYv/baBx8XQNo8Zfw8aeRA9AV9FqRvZybeKM7.\", \"katherine\" },\n  { \"$6$short\", \"$6$short$61GnSHDjJHFjy8bOWDXu8J8FrnuBziBmva6CVLeJrM563X7iwCAhnHUEBveNivoGSeOShCHwpqBlqnf.t9ZNC/\", \"katherine\" },\n  { \"$6$rounds=1000$saltstring\", \"$6$rounds=1000$saltstring$UpHQ9KY/Xt4p5yMcUwdLWna/KbwfaWfG1J.RjguQqIKZc/u3R8zw51SXukAwZBxgQq7hsXBG6r4bHNTFaYoCy1\", \"stephanie\" },\n  { \"$6$rounds=1000$short\", \"$6$rounds=1000$short$tlbidOpGQowQTYOqQCtKuQm0dksBR6/RpuRWiBcm2dkx4t9qk.Zn/GE8hBP2auOLyvkyjDmetQ/WXMGsW6Jpw.\", \"stephanie\" },\n  { \"$6$saltstring\", \"$6$saltstring$Im.hMpdh.xjM0kIiiHSZ6adkhQd6G4W09s/yGM.U8tYUlquUDr4w21McH8QYzKkhfj0lX.7w98rjra6h25/3T.\", \"stephanie\" },\n  { \"$6$short\", \"$6$short$PAjx/sOyQZ7..D.UnTAoNutYjYbrHVWhnytEsTLIUr8VRA8txwUm/UoFFn.js0uEyZMFGJ1hn.wVHz9o7J2N5.\", \"stephanie\" },\n  { \"$6$rounds=1000$saltstring\", \"$6$rounds=1000$saltstring$U4mGRilc6Lx2FZ/G1yEqNjVPp7LUMSJYbotCMEOEoaUg7KC.VBtCRJLH/cTSVWpJTAKboZcst.NxmYXTo6DLM0\", \"sunflower\" },\n  { \"$6$rounds=1000$short\", \"$6$rounds=1000$short$cBh7q85PzwqXZP6emub7VxmiB2stWHreULiaP26avsaKYAN59IAj3irG0b5E/WpCgHZv0X.k7QpeT/4ytRDN7.\", \"sunflower\" },\n  { \"$6$saltstring\", \"$6$saltstring$5uD054AYexrdi30JHVI1zE26.fs.1uWfpJqVTAOAFSZprnXXUXPg/Tr63h0gAoylB1ti1rX02.GDA4suHTFS80\", \"sunflower\" },\n  { \"$6$short\", \"$6$short$lZhCbm0hqVpgf4nr33LKDsprALikyfHZmxoy/WEs3C9WH823Wl3qJ80mQlqO1MpRoMKrdg7R8I2NSh8q.srP.0\", \"sunflower\" },\n  { \"$6$rounds=1000$saltstring\", \"$6$rounds=1000$saltstring$dtC8sK2UqfT.i61CEAXj6jfs3jEazvYUwYhQjZbmrbtKeFVwt7J.0/LB6DpajtwDfU4INJpOETIcGLvnXzNq3.\", \"basketball\" },\n  { \"$6$rounds=1000$short\", \"$6$rounds=1000$short$aDgvcvtehk11aZUyry1fZRQvD4nQ5zAyoeF1HHjS7m3Kvjdmj2DmDLD/YX6n3PWv.lMe6Ib2ifEBphZpESfBF0\", \"basketball\" },\n  { \"$6$saltstring\", \"$6$saltstring$aee/dAuD//0IMOybq6gNvLwBpQXOwcpgCE/WXZaKGio4dp5ZLSTMQinbVe8lLIidHTWH5w6jaRMP8qddl9QZC/\", \"basketball\" },\n  { \"$6$short\", \"$6$short$WQPt1QcAX2IjzgXlTtbtl6KwHD8TUWIzPKroEJpg7x95SuViBCXaS4fm3VV0afTWGMouJiSTQnU4MOWBOqqj7.\", \"basketball\" },\n  { \"$6$rounds=1000$saltstring\", \"$6$rounds=1000$saltstring$VRqKChK2r.wKr.1BnDhc/Cxte3Z1dUFJ7tixjF9LtqaTKsP91Ozaks2n7OnZquFW4DxQtPzilGlXOYEHgHWxg/\", \"porsche911\" },\n  { \"$6$rounds=1000$short\", \"$6$rounds=1000$short$CpiV0i./E6AgJE5m4vDE25G2a3L2EoYlIl2xYNnvSRKrpuCeFrAbL6bwzhcygPi27FKms1378YGS8sbLCalSg0\", \"porsche911\" },\n  { \"$6$saltstring\", \"$6$saltstring$EAbT7BVpwfcxScryVnOnvCADXTcGvu45sE40Tg6a6qkr6R5.tT7j776nmY3kcA2UwIvTBg5OgODuhbp7iPRys/\", \"porsche911\" },\n  { \"$6$short\", \"$6$short$TjnEiKvhycsHcBAFnf.upiakg.XL0I.K0LiH.wieoZ3idVQ3bEFBA3NJkPdMbVg9NWI.3rmbz8eLnJ4m1AqnX.\", \"porsche911\" },\n  { \"$6$rounds=1000$saltstring\", \"$6$rounds=1000$saltstring$aAwIBNJYKFZoHjNG/CdEu3xQysYfnY/CF048B.ozt6zbX/1jMNSp/Q7/sTIaxL2ipIpnIK.2KiYX7bgzTE84O1\", \"|_337T`/p3\" },\n  { \"$6$rounds=1000$short\", \"$6$rounds=1000$short$EswKQIXZn2IOmVDgzLIh.jrebkGyRxJql8VwaJoBBktiVR3XMWU5aZt5RYIaaheJBiH0s5bObz5vJCoAW8eDz.\", \"|_337T`/p3\" },\n  { \"$6$saltstring\", \"$6$saltstring$w7lL5LYs4DhqSBgWtyUFL6HBwPBLkeL4DJZwamoFMMa.f4COi0f1nRdL0InNhyc0PVH5YBxaxlSHgCvi7y4dp.\", \"|_337T`/p3\" },\n  { \"$6$short\", \"$6$short$.G2W3y65U8Vphkt7S4ZAFc8t8viM18mg11RJidkFDV/jSAbX6K69sQXXnz46nIQn21uBQogL8n8FMxTnEKVaA0\", \"|_337T`/p3\" },\n  { \"$6$rounds=1000$saltstring\", \"$6$rounds=1000$saltstring$m2uF6VgzV58EObIU7.nZPU0/uToZxNlxBkeuFB3tOPwSO6rorldb7QHPX.MajjIEsdQYwiaJVxgL8sRbNOoi.0\", \"thunderbird\" },\n  { \"$6$rounds=1000$short\", \"$6$rounds=1000$short$hQ8lU5a0ggbGodMfKgz3CmPUXTdy1KXKKMhqBoXPH9l5MvKGjTralpUjbfinYqNTeRjtkK7ocaOGhk9nlB7fg0\", \"thunderbird\" },\n  { \"$6$saltstring\", \"$6$saltstring$1q0FQv0GRSDkxJykeraC40Mq60nuM0waGlZr9S34T5zAzPB3uf4O3O1eOnH7Aqs/m3SLywSNnIvPQGvZCAcVh1\", \"thunderbird\" },\n  { \"$6$short\", \"$6$short$r0d2pE58rge4cdUpI57OpzMXVWTp46PsKmXkWDryx0Rpe9owr01xmrD2vw2d.gDns5Ssimaiq135mvEdZSAue1\", \"thunderbird\" },\n  { \"$6$rounds=1000$saltstring\", \"$6$rounds=1000$saltstring$Zu2Vknok2/f53APfN687ADnzeNBLcsEgTwvcBHMD2./07rZQAt8vsuKVufD15dyZh.LOLB/uZKf6I3GyON4bp/\", \"Hello world!\" },\n  { \"$6$rounds=1000$short\", \"$6$rounds=1000$short$BM3/GjEUABzKYsQf5Qb5BAuG3hyEj/vNWgdM4jw3CWiBptFRQUVDqFjOd2yMP3RtngUR3G9paxHlcOBgWVNJw.\", \"Hello world!\" },\n  { \"$6$saltstring\", \"$6$saltstring$svn8UoSVapNtMuq1ukKS4tPQd8iKwSMHWjl/O817G3uBnIFNjnQJuesI68u4OTLiBFdcbYEdFCoEOfaS35inz1\", \"Hello world!\" },\n  { \"$6$short\", \"$6$short$5LDNaXtCEHSCdHwfOGbSZlgt54YFW6U0FaxKkvo/rhpm86r2NwXmd8IEQYNV2IJSS.IH8jaJUBAk3K5xRDBXw.\", \"Hello world!\" },\n  { \"$6$rounds=1000$saltstring\", \"$6$rounds=1000$saltstring$mUzaGDDVnOsq2tXwboJuEeMSdwHewrviq2hNFSCSVbOrWAkDHza1wpdVg81sUAfc1ki.xuLyu.h.JJmzHGXJa1\", \"pleaseletmein\" },\n  { \"$6$rounds=1000$short\", \"$6$rounds=1000$short$BugjOC8S3rs0luXd27Rw3SEWUOZ2xSajDQJe/eHFTDd5uEmdTdhFNxgC6tq2UtFto/iSlhZbjdsQr0DngnWx40\", \"pleaseletmein\" },\n  { \"$6$saltstring\", \"$6$saltstring$SqyhDWidy1FyYQvxJS0mCfscyB71Ni5Yi9UsukwaGkrvtN5uj8uxcQrCB9XRTz8SWHp08vMi14NTi36I1YPJR.\", \"pleaseletmein\" },\n  { \"$6$short\", \"$6$short$rLc6/9Uv/lPa6jahU8mQ2DxUh.2OJlTc4jozt6eXBDRV/RBp1xO8Ak1X9k2s35Awl5eQ/ATaGzXd8JR.620ZJ.\", \"pleaseletmein\" },\n  { \"$6$rounds=1000$saltstring\", \"$6$rounds=1000$saltstring$KwZ2liGK6UEbPaJVn8S6WkTloL1plmF42hVNDKYHDfig9ew3zJEvJpwwl.vLWhHYwl5raidHjVu2BRCbSvKcd1\", \"a short string\" },\n  { \"$6$rounds=1000$short\", \"$6$rounds=1000$short$MP4AEo0Y/aosRmucAAG2icn2J4ts6SwQMTGzIwvZTIe33UyicdmYJ7wmWnVmoa1QnhWt/TTbvatI/ksJuZz/S1\", \"a short string\" },\n  { \"$6$saltstring\", \"$6$saltstring$bVgvaXKNXtgwFOF2fBEKsb8Uz9HK/5FuGOwE8bDnB2o72JsLi/2k8iws8LwuIKiqLQNqeqPR9fx2p6yedvsPT1\", \"a short string\" },\n  { \"$6$short\", \"$6$short$l5pisUgX7mbr2YP0LfYbOFex0.SfKFfhUlSn0A8YZmnOlgSYQOrXvl.et4tW3Msf7a08XXGUsH2MSa5lCseeq/\", \"a short string\" },\n  { \"$6$rounds=1000$saltstring\", \"$6$rounds=1000$saltstring$bMEvnXyS4ECr2wz7BCB3phA5lQYcNizxQCgBrpDfXYE3QW5kDsrAs.9g8mh92ntU8hpocIEBhchNH5VeQlHLE0\", \"zxyDPWgydbQjgq\" },\n  { \"$6$rounds=1000$short\", \"$6$rounds=1000$short$5jtfYwHPnFRZJtwnAFICLibEVYe9mnMHuP0xfwwLUqTAyU7.1kcdMjD/1.s6cvX2wwgIxDS.g/pY5nixNx3ZP1\", \"zxyDPWgydbQjgq\" },\n  { \"$6$saltstring\", \"$6$saltstring$WyvtwGlIs3KUKJJN6mU1g1yaCAj.t83bgk6FLnzAfhsv7GQ8TQnOOgs.4yLrafnMjVWHPZXPR1GGxBgaBnZVy.\", \"zxyDPWgydbQjgq\" },\n  { \"$6$short\", \"$6$short$Iqh9FX6VY2sLmIeZcOSXUJdtKLbJ12kXVcmoZr0WTtUqWkf95RXnsSPt2vY690sOzRzNq4V3YcbhigvoXmRXu1\", \"zxyDPWgydbQjgq\" },\n  { \"$6$rounds=1000$saltstring\", \"$6$rounds=1000$saltstring$x23XHQPBtvv99XqYi8OXbEIxUcn1jpMjxxEc/hemGHLlY44h9rDbhb32ZKR25OfHaUdIYapiJvQLjhp9fCOUK/\", \"photojournalism\" },\n  { \"$6$rounds=1000$short\", \"$6$rounds=1000$short$nOAsxg1xCvVTa0xjUCU6wHgyZJQuoYpXhdAIltaNDpbssuHx8L6OZJrWvdhkw4RXFgzxU45ZK6Ovki75BfTmL.\", \"photojournalism\" },\n  { \"$6$saltstring\", \"$6$saltstring$cYSRI2.umeOf1Zloyp78Q0MSog5BRdANlXosmd.wviDS0Ur0wKDker3BUMbndd0X0yz85gIPufTc4NYZLbCGw0\", \"photojournalism\" },\n  { \"$6$short\", \"$6$short$9N3DUaaEiOgaJ53JP6Ke7FhjGFtYQXylz2IjRta79gNeGVmKVSinYkvcAi5G6UoTknaUQXZPr/oTRB8IFUINu1\", \"photojournalism\" },\n  { \"$6$rounds=1000$saltstring\", \"$6$rounds=1000$saltstring$hWNWX0lo44REPtRwK1ebR4yLUqLI7whuGXxCig2XFSZ4acGoAYrmPP6nbqSyHfVmK8rjnIArMj3mo6bTNmZax1\", \"ecclesiastically\" },\n  { \"$6$rounds=1000$short\", \"$6$rounds=1000$short$kLhJNxw7JEQ5O9zZcCj2E6Nfv1v8aLIg7hKRye5wWHRNvrJqIQS3OHb9dryJK.dwWtp2AAzRtLBUzJFaGhmAK.\", \"ecclesiastically\" },\n  { \"$6$saltstring\", \"$6$saltstring$r.476M.nEFbUeZSLRrQeENHijN.0L7SNYFMWxVMHvpLJMy9Q1HkkHu/IAKtqVntMqB73tx4fW1UVcjKEQ.AZQ0\", \"ecclesiastically\" },\n  { \"$6$short\", \"$6$short$wVusyt8KnWVJo.K5S47jAIc4qNIqMDPdEm2pOutL.EarRI3XRTgHyIhKqh4DNX.z/DfJgXiWz7euiuMJqcYOw.\", \"ecclesiastically\" },\n  { \"$6$rounds=1000$saltstring\", \"$6$rounds=1000$saltstring$mKQRVaf.sD1V3/T3o7wxGDxjNdle.W5y8YVW4mjAk9PKiU0kg2X5lJ7yIAMuHEc9bfGagdG8AHAysXvsfgT6r0\", \"congregationalism\" },\n  { \"$6$rounds=1000$short\", \"$6$rounds=1000$short$80.eMXqsJoDW0tAPpzWix8bzvt43eAHApsrjN/lpCRznM.zX1Qlk53OU7SOO7ZI4988d7WxmccjjqDk4mrYQM1\", \"congregationalism\" },\n  { \"$6$saltstring\", \"$6$saltstring$FBZkpnfkH4QKrMQON3/w9za6gBJk5Eqwg10Z6EdGzqR.Mcfkc.gdogU/WGXdJrfYh2GVliXBi3hCd4UT3kTI9/\", \"congregationalism\" },\n  { \"$6$short\", \"$6$short$zyf701bC7P13xL/0KNgubXYvfQVte0BUXH0g1oK3VpGHYXzBR0BxvUUKo0ja4kexx3tnEOGOOZvkLE8vJEEGV/\", \"congregationalism\" },\n  { \"$6$rounds=1000$saltstring\", \"$6$rounds=1000$saltstring$ZjoGdYCsAIeV0fkKa7ASfuVDAfFcpVuJ46IHZ/YMLDXFaQH6n.ak5tdw9.3q14onav3bYnaoCZKhOAqWLEHgB.\", \"dihydrosphingosine\" },\n  { \"$6$rounds=1000$short\", \"$6$rounds=1000$short$4i8XAB5cnJXTIC7b/uV4DLzgp5n2IitFqD6BVKTDZKD7qCEDNG/0kKLez7YZIkBUeYGyhExo7NEjARVSNW6tI.\", \"dihydrosphingosine\" },\n  { \"$6$saltstring\", \"$6$saltstring$yRKwAmrD0cLj08ps.vnxNGSg2b0aJaCtY7PLx5L8GnX3oGICqvrUGQKpDox0xpXQ4hXtd5qcWAeYMFVdEI908.\", \"dihydrosphingosine\" },\n  { \"$6$short\", \"$6$short$YAct39Z1emQ6IWH1Qt/Y8PWtcGq93s3KR2M8GnUObQiJxouo4LSSq72AgyG.CccmyGdbgy6jOe.IYucZzvCuE0\", \"dihydrosphingosine\" },\n  { \"$6$rounds=1000$saltstring\", \"$6$rounds=1000$saltstring$oEk2ySqxtnaPzTYal7O/GgQvICJbU/b7d/Db0b8AG7SgCgctghRuccC3w5s/Ygzu.sFzXZGktVWmh37Nx6wXd/\", \"semianthropological\" },\n  { \"$6$rounds=1000$short\", \"$6$rounds=1000$short$TLov1E55B.7Tals.d1Su0DZHqzGuV/269ihJCM0iTQHunh.eVL8Pm.uZ0.Z7cjolZp.BwJG10L8KOs92fJHEq/\", \"semianthropological\" },\n  { \"$6$saltstring\", \"$6$saltstring$N5HxapGqZn0tb6JD6SafDzmZXRwgLnlqh15JMquXPROFffYTRtU1yDMcvMuxMHbIF3ksh5C1FO9MjSg24l2g21\", \"semianthropological\" },\n  { \"$6$short\", \"$6$short$6XFDEI2eitO3w8HpJPlW2nrfMhOjjVsWVz6WCx07PIj49QC2xy7ic9AedmdI3lCG8yLoGmnhh1ncpQqv9DqlT/\", \"semianthropological\" },\n  { \"$6$rounds=1000$saltstring\", \"$6$rounds=1000$saltstring$t5/Ubu6sYEt7.JNxCEqrkxZIeQ7LMyTlgQH7ps6stEaqCmLmYXO7jObjuAyrzreqBIUCBONhbPYUNLiN8NEQp/\", \"palaeogeographically\" },\n  { \"$6$rounds=1000$short\", \"$6$rounds=1000$short$EngEfM2GWS7VaQ5YxyEPmXz8ICSVy1UUSVPLZXVHFNp7JU7EgFQFQWAmDQamPWVjaj4WYyHW9hmumfhAtBu1d0\", \"palaeogeographically\" },\n  { \"$6$saltstring\", \"$6$saltstring$7JMY9UHRts1MQO4I/uNxn58/OJn/zfWP7MSaMWHQgcPHvQDwf1lYF9I22qpv70qMyOrxx2NOA2hhorXUbH6IG/\", \"palaeogeographically\" },\n  { \"$6$short\", \"$6$short$NVEvchm9nQ/krJHdXLP8eJU3ektp7kl5Gw33zGi8lqmjn9q.lw6GttKvLrmp1Am5FVPCOMVgMeWtv5jqTrFkU1\", \"palaeogeographically\" },\n  { \"$6$rounds=1000$saltstring\", \"$6$rounds=1000$saltstring$W6Lyloew8r1Mxb70JGpKxvZ5LEPX/i0p6ZRxGmMm3WDl31V5RiDPS3XasV3u0pFsJEOETUswoEQKRvBcyNwoo.\", \"electromyographically\" },\n  { \"$6$rounds=1000$short\", \"$6$rounds=1000$short$1GO5TfgN67af/XxnWIQyiQjIlVJtTa5/EAGPY8rj8fi/dRUwHnrYfK2mIK3cjH.xrVTsGHhc8/N2aVQNdsxwg.\", \"electromyographically\" },\n  { \"$6$saltstring\", \"$6$saltstring$lXosHnTI4Q4vxJmEa0nFZfqsrtWbAeRRR68j.U1aqTKpYevn5o7dpqIVp1A1tW8T5h4KTLD/VeoZFk3IvN/6q/\", \"electromyographically\" },\n  { \"$6$short\", \"$6$short$KmubNFQTjZ36AAt9Ek.XY1sjer2outbT7HU1k27VpZjDw8YvH46JwTmBVdYfwyQCLs7O4K2nh4MSfPinS6mMy/\", \"electromyographically\" },\n  { \"$6$rounds=1000$saltstring\", \"$6$rounds=1000$saltstring$R9bZ0a3DdQu3hanlYE2Pk0GFS.Ao0Ou9UsXOxStW4I3nKLS/myLOpqPE/ZK9o6s2vBSZINzylbi0bIC.HgLrU0\", \"noninterchangeableness\" },\n  { \"$6$rounds=1000$short\", \"$6$rounds=1000$short$fxfAaCPtPmPEa33CtbRFE6vDmJjSpI9577x9xXnGFAUzSodbwO.2M9yAUOX6tA6i28MurKAyxRMqQMritEOQp/\", \"noninterchangeableness\" },\n  { \"$6$saltstring\", \"$6$saltstring$cnwbhEunsQtJvc6fXP2rVNvdo81wH60rfVnTijSR2ythHgdkCmcpL8FzC45F.CI5izeS4t4jEqJ9ugw2dkvr00\", \"noninterchangeableness\" },\n  { \"$6$short\", \"$6$short$cIaKgMqjcGNFwq6gQwwsPXE1kDrrMw5kHWzVcuUstKw7oPDOe7CWiRm4PjBp3tZN6ALyrak6900aJOZAKM13O1\", \"noninterchangeableness\" },\n  { \"$6$rounds=1000$saltstring\", \"$6$rounds=1000$saltstring$rJDFb6TSL2s0NkVXDISZcqTV5m9kBxufGz40kKAE8FF0YazTVWjAbJukOMvTvAGD0.nlSmfMsFyB5EVpFUkTi1\", \"abcdefghijklmnopqrstuvwxyz\" },\n  { \"$6$rounds=1000$short\", \"$6$rounds=1000$short$m2FWbVAtZsUsqsTjOEmHfEDk2F/J5poz5t1jyNc4GAuoWb3xIEUJN1NKEObAlAkMZizl3rb1F4t5HapC/sGsW0\", \"abcdefghijklmnopqrstuvwxyz\" },\n  { \"$6$saltstring\", \"$6$saltstring$75lgzikeZZkiiKNx8VOI3jKEfDaLkrqUGNysLY7Ovz6WmI6pBL9g.f9XIFFO8rTUoTe4NUbw7199ZmeOCX294/\", \"abcdefghijklmnopqrstuvwxyz\" },\n  { \"$6$short\", \"$6$short$4xc7GXnum/WJvmAZJQVv67wxo2Yf7ZxulYOSabOwEKRxtU0YmKaVpMXgRKJC.uG0CgCXigSiTYbdvAsDD2CLg1\", \"abcdefghijklmnopqrstuvwxyz\" },\n  { \"$6$rounds=1000$saltstring\", \"$6$rounds=1000$saltstring$2vkYw1yWm1R8iCQFlHQc01dCBR51WqvOsJm/9SKokYZGf2i7OsufGYAHTmRNpZlWumTeBD3RgDznhoxSO0VVC1\", \"electroencephalographically\" },\n  { \"$6$rounds=1000$short\", \"$6$rounds=1000$short$tDJz1QxbHlaRzt9uEfc4KA6rk8Zb22x/yVuXdalO/e2PxEqCAv9/1p90VshXPCRop.gSkggSoPVPZnhzcu4Ry/\", \"electroencephalographically\" },\n  { \"$6$saltstring\", \"$6$saltstring$r9rQolTH4Xp2pytB0lG4PLSNBe78o.IlYv.dHFKPki9mhDcLn1QvqZ3nEkq5ByW9BsLOvufbRaQpnMp63yLgl/\", \"electroencephalographically\" },\n  { \"$6$short\", \"$6$short$oT990cpWHOXJkA0t2UDtadiR1oqM0sMoxQtinW3ZKnAjQtoo7LihXv7OcHJcCJoMjx4fMCc0Ft1t8kf3p3n8E0\", \"electroencephalographically\" },\n  { \"$6$rounds=1000$saltstring\", \"$6$rounds=1000$saltstring$sI1RN.usWbpe6cYqoOzFGmM4CPXcberx6xCfUSsR/NTqxw3h0RZyn1YopsE/Bz48x5Sy1TYEFkDPTvvGuTckn1\", \"antidisestablishmentarianism\" },\n  { \"$6$rounds=1000$short\", \"$6$rounds=1000$short$MFYX73E93p4x9O2gJxrl.pq5hJ9tgMz0fTu19xeWaJ.zxIHSHD0CbpY30MKsCO6ylm8wB9BWiYLpJTQHPXKqb.\", \"antidisestablishmentarianism\" },\n  { \"$6$saltstring\", \"$6$saltstring$irtmeIkR/.d8.5V9.LQRfvtekaEEc3buLskP7j5jUrzrfsxPAcoWf4/HxUtRIqdC85fjUs05hdncrU23axyX90\", \"antidisestablishmentarianism\" },\n  { \"$6$short\", \"$6$short$V2lql4hxhfF9BQndhNy2KJ8qJgzmtYIpmiychW.BdhgEZNEHwdcrNwJsdHOsjz96eE9k7mSAuX4CIWTEg1b3E0\", \"antidisestablishmentarianism\" },\n  { \"$6$rounds=1000$saltstring\", \"$6$rounds=1000$saltstring$LRSuCicXmwuyx9pP2kl6ijVq0QZkCLAG4cR5zqxrbOuM6Gzy7D2NB44tUaGGV7MQL.UNcqYONVCi8Jd.Za9Vf/\", \"cyclotrimethylenetrinitramine\" },\n  { \"$6$rounds=1000$short\", \"$6$rounds=1000$short$h4JahbADRfvQvb3eumZIDFs11y2F1G6ICzL0msni5zt03dmAV3LGhzLxkHxQcG8rZwOsft8ndcAg9MQgX/L9c/\", \"cyclotrimethylenetrinitramine\" },\n  { \"$6$saltstring\", \"$6$saltstring$RpIwnJJB6wpXPS61AKVMn.efTR3aEW5MAKdXvVvykgUTuXGDY4pxz75DN1mOOsVSUVp4e5xHkidoEpNUvKQum0\", \"cyclotrimethylenetrinitramine\" },\n  { \"$6$short\", \"$6$short$.T4cAvYZrWXkMMJrNgjwXWqzj3Htq7JNdi3EZJqqpIcP7oQ0ynYfCVON6zK6k.ATMXubPVXYynUE.cFcJApOO.\", \"cyclotrimethylenetrinitramine\" },\n  { \"$6$rounds=1000$saltstring\", \"$6$rounds=1000$saltstring$LFAaq/iXnkSwestkau8rRT4mTpNr4MrGv8KqpemSR4HW3h0e2h.rhBK1aKGb7mNu6AB0UQ.MYV978eFoodCWB0\", \"dichlorodiphenyltrichloroethane\" },\n  { \"$6$rounds=1000$short\", \"$6$rounds=1000$short$psb2l5uVmivxx/H59WVe27zCblwvgJ02mG04yWkpuwrfu5dmF8wEOcZEYdWcMbTe1aadeF4PZ6pfLhY7QsXpc0\", \"dichlorodiphenyltrichloroethane\" },\n  { \"$6$saltstring\", \"$6$saltstring$kgM6MK/PG.mD78/O28Ub4LG0Tt0oO92PCemAZdYX.ZXBxrIM4TpCj5VixroRE0GURFwLsrL7h2d6TLZE.uYUn0\", \"dichlorodiphenyltrichloroethane\" },\n  { \"$6$short\", \"$6$short$UiRZByrytTaAFjSccJakcbMgFjc34CAf5pKg60SGyMRfdW4A/gqwkL3IGSUXcGaV1MYsr2UlAixQcHXmlWXBA0\", \"dichlorodiphenyltrichloroethane\" },\n  { \"$6$rounds=1000$saltstring\", \"$6$rounds=1000$saltstring$QPmwGefzQF93ovGpF68yHGj/6o1hz.55pJ1znpGlS3R94HsU2PBh6O8GIeDlBwCMuaBeVn.IdkULQAEhnbbwz0\", \"multiple words seperated by spaces\" },\n  { \"$6$rounds=1000$short\", \"$6$rounds=1000$short$ZOrUIMu5dr3NB1W8DRTfTt2EBpS8wfEXhmCx215vJ6TaTtuD9IsuU4R36r8CrFRI9J7Qd9IlJ8AU9X5rDwhJe1\", \"multiple words seperated by spaces\" },\n  { \"$6$saltstring\", \"$6$saltstring$i.b.Cp7T88aRtYzhmKAaMx7uG5H3L0Zgffu1bRPx1LVDZ5eJP6f8.SSO6cSeUq.2hsH53RVweTDrJLhKBoYOz1\", \"multiple words seperated by spaces\" },\n  { \"$6$short\", \"$6$short$Ws3G5sD2stDlxmVMDPZ1YmW6ecs.RvDGBmnmnpAMkmL1GyzGTjweHxR8bESQRybUIaAYZ38ApBZQvyKj.Q8Pb0\", \"multiple words seperated by spaces\" },\n  { \"$6$rounds=1000$saltstring\", \"$6$rounds=1000$saltstring$mnfkLQyHkZdPPPjL3r02kSYe5D.wHzxpKp57Kx8P1Mf96jA.R3p/A5tei/L0IsvjHfdvasay0N2o2o/YFxpdS1\", \"supercalifragilisticexpialidocious\" },\n  { \"$6$rounds=1000$short\", \"$6$rounds=1000$short$KWaVqu3o1/v0c4AwRlhjHni/nStjWNFhJ7Bp4JRjFEGVSMVhL69Yks72eShQSksniVHXmbASVcx3Wp/Yn4FT70\", \"supercalifragilisticexpialidocious\" },\n  { \"$6$saltstring\", \"$6$saltstring$2xhSY.YhTn1fOh3W8NMjyXQyU971s1FC0M2LbQGIaM5ZZXSqcoHxvq7J7YBVMMuDZH312czlbPFvfxWUvqlT10\", \"supercalifragilisticexpialidocious\" },\n  { \"$6$short\", \"$6$short$8qlemEl8gNvy4R27g/AfXhCaB7hnqLkhrUa3bEPRmOPmhlCTWHu5o/zkw3FveLwKEu3AlKZoLU/nnfwSHGSUD/\", \"supercalifragilisticexpialidocious\" },\n  { \"$6$rounds=1000$saltstring\", \"$6$rounds=1000$saltstring$hLdnVwtdrsq2uQ1qznUhkaTC.xlk8dzbSalJJ4fyGeqRCZdTzDv8hDhmqgJdpU1bspQjDxxFdvILumFpmGD/r.\", \"we have a short salt string but not a short password\" },\n  { \"$6$rounds=1000$short\", \"$6$rounds=1000$short$yKjiOaKKa9hmO09NoaGIIFVrNG7WY8CArzJJlZJ5viSZrI9TzqYa2t7AA6THmblNo18mGtDJZYi2nxBwwsjsN.\", \"we have a short salt string but not a short password\" },\n  { \"$6$saltstring\", \"$6$saltstring$t0RxQNZ/Qlu3QMHB.qNAuyNKV49ZOL0OImloFF3LiEslYehfZIdxbknK6lABzSWSLK2ocbPAlFWKTNskYmCR20\", \"we have a short salt string but not a short password\" },\n  { \"$6$short\", \"$6$short$qmfj2meTBr5G2EAGIJ4vjX7RpefsD4JzpEyTAeEUJdzdxlBS6pe8gdMHm5zFftaFSj/2p2bjBwyVS9ZhWpLZt.\", \"we have a short salt string but not a short password\" },\n  { \"$6$rounds=1000$saltstring\", \"$6$rounds=1000$saltstring$FEJucJhvOf.sznbIdzXX/nevTmcAeQ/WxZGbdiLp4NGpdTw9IOy2DvUtHlAQmJ1e7TMBN/rvtwD1trnDwl4LA0\", \"multiple word$ $eperated by $pace$ and $pecial character$\" },\n  { \"$6$rounds=1000$short\", \"$6$rounds=1000$short$aIKPCIfvmmyV0tcgST.lxx7V1l5gHBJwRm7.0ixeLoCc9Nc3tY4uZSLzAp6c9rBo2XJTjgZ8ebkDE.l5Dw5yD1\", \"multiple word$ $eperated by $pace$ and $pecial character$\" },\n  { \"$6$saltstring\", \"$6$saltstring$GI6jHPMfuIzUD8UXE2zBbflRu.szOsYF7hvmbDaGU2Ef6oJYNStCZqud4naoxW4YtG87M0./kBT3P7w/xU4rt0\", \"multiple word$ $eperated by $pace$ and $pecial character$\" },\n  { \"$6$short\", \"$6$short$rRodyi/SnEGpjj93X0SyJvt3q1Zj4ATIwklXEuYw2S8/e2.mafH.cuAG.oBXTQiVaDu1lke70r4IXL9p5FZ811\", \"multiple word$ $eperated by $pace$ and $pecial character$\" },\n  { \"$6$rounds=1000$saltstring\", \"$6$rounds=1000$saltstring$YZc/19.0UTa95tPZLhobLGN/RWx/rpD7wQSGm3o82g3XqNg0QESp7dbnjvGqdDWKH4JHAbB19JtLe.Mz7fmpO0\", \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\" },\n  { \"$6$rounds=1000$short\", \"$6$rounds=1000$short$g8VIp00WyyGpOO6iGLN0v/3FxFlPBTpsvRtmgUyTM7/eBwLnLW3v9ldEYUdcnRaK.YX3BOVBdStnCFU6ssQJM/\", \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\" },\n  { \"$6$saltstring\", \"$6$saltstring$ofHwA1se8kFR9SJr7ScxKEqYZQVPNBzNPtGSki0VRB4LIr/A771XM9.5XyaRzq5QC8h6m3o3F5GDiA1q39/911\", \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\" },\n  { \"$6$short\", \"$6$short$lp08GpKo8AhNOLaK0KDFe3xaOSst8DsfOHZgozk2W4aULPlBGVibH4Qbyrvkken2v9XC.6QCq9iish9wHJ1Gc1\", \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\" },\n  { \"$6$rounds=1000$saltstring\", \"$6$rounds=1000$saltstring$1icV78MRKo2gSp6USFTfZhMIGp0dONMCUADe.jNkhQt1fukWiyIKVSMhX4K5.HhiLcYm6A9lrDSX89TG7CHwV.\", \"12345678901234567890123456789012345678901234567890123456789012345678901234567890\" },\n  { \"$6$rounds=1000$short\", \"$6$rounds=1000$short$EOg0uCzVU4K0q4lBphlMKR8OpR3ZeCcZB6kR2nA4dxv1VJ1aGl0U3Za3q7tVdwOfY0BmxQjBys8l2HiS251XH/\", \"12345678901234567890123456789012345678901234567890123456789012345678901234567890\" },\n  { \"$6$saltstring\", \"$6$saltstring$L0b.Jd9LfRLMzY4Nl34qUXG1pbcXQvL0BDHYY7dTBdjLxDM3YK6QyYOoCMKXbDlqdEdFKYzWpWIhqxJfWOa51/\", \"12345678901234567890123456789012345678901234567890123456789012345678901234567890\" },\n  { \"$6$short\", \"$6$short$rFqhHhA3sDEMZNlVzRpFWLenaMxaZjnaTU1x4HeShmrUkydWFJHLI2MgHCE2xRpS1WthIfB99kEgkL5VK2xOi1\", \"12345678901234567890123456789012345678901234567890123456789012345678901234567890\" },\n  { \"$6$rounds=1000$saltstring\", \"$6$rounds=1000$saltstring$0TO8MCVIN3QPgE7tm3JmEvbLxkEz3rfSDqDUgaL22IjbU61isyTMvRVHt6FxPx8c/tSAs6yRAlAbc96R/PCe20\", \"a very much longer text to encrypt.  This one even stretches over morethan one line.\" },\n  { \"$6$rounds=1000$short\", \"$6$rounds=1000$short$LzCaL0sq/Kjsi33G6vTlwdY6Otwy8r2nOOh0mEzgHO22HTwqFqxtvN/OTYb1AeilygPRyVRur/5fCt4C3407A1\", \"a very much longer text to encrypt.  This one even stretches over morethan one line.\" },\n  { \"$6$saltstring\", \"$6$saltstring$53QDttM5XFD.Uhcc3Efy7XV.zrHuvtZBT.o/f2SKV3xQtXyOrfywMwP0f2HpBrNF2SZtZsbhq.f.OV.UeVZz0.\", \"a very much longer text to encrypt.  This one even stretches over morethan one line.\" },\n  { \"$6$short\", \"$6$short$fYpg6FDLLGgKKgczuklusuWHGzT9K6NxQDXKtdooSBHqgNlAo/Mvwx54PmGeF50XLuyKAqzMqStrYNerssBhQ/\", \"a very much longer text to encrypt.  This one even stretches over morethan one line.\" },\n  { \"$6$rounds=1000$saltstring\", \"$6$rounds=1000$saltstring$uHWrFUW5s8RS9u.dk5CylCJl0sBNl72MrUUrJHZMAKfAAML2CIOw60ALQyn/JlzB.vwyd.f5YuF/xP/WURIl81\", \"\\xd0\\xc1\\xd2\\xcf\\xcc\\xd8\" },\n  { \"$6$rounds=1000$short\", \"$6$rounds=1000$short$01SVVXFQKExUZmFlKe3KbJ.f97g3fKW0xAo9wM0EyPE9b/F2IHtK3UXGFKyvYvibpoz5Z2y.ynzXhWhGXWEH80\", \"\\xd0\\xc1\\xd2\\xcf\\xcc\\xd8\" },\n  { \"$6$saltstring\", \"$6$saltstring$9SPQbC5k4pZ0t4UpGoM.Vx2ujkzeqfuZOriYtbJY4SZYcEwMuigPWSSgJOo6EKqTD9BIGkpLVrt9nHjL.4Flq0\", \"\\xd0\\xc1\\xd2\\xcf\\xcc\\xd8\" },\n  { \"$6$short\", \"$6$short$d5cAhyxswvAEBxLwekQIWzeppZvQdA372KDr046UlygOGI/JDqkOv2TiKwDsk.M75YdR.RIlSgDqVZIFBtC1b.\", \"\\xd0\\xc1\\xd2\\xcf\\xcc\\xd8\" },\n  { \"$6$rounds=1000$saltstring\", \"$6$rounds=1000$saltstring$y98e3CNpayfziP3LVQrwYooPJt3SiNpjwhOOz9YDWZIK7hfoHi92JW6Im03byxtpOw2F0pxbPOVaSWLgziUpb0\", \"\\xd5\\xaa\\xd5\\xaa\\xaa\\xaa\\xd5\\xaa\" },\n  { \"$6$rounds=1000$short\", \"$6$rounds=1000$short$008aNfGm6HeWIzQtsyNNHN/LbKZdFerJI1S/vuBIdI/itiBNixWOYBBX7Vjeq3gSrpI8j.VABomUPri/noOqy.\", \"\\xd5\\xaa\\xd5\\xaa\\xaa\\xaa\\xd5\\xaa\" },\n  { \"$6$saltstring\", \"$6$saltstring$zSKb.dfffBahNYeOdVPph0KLzrpnC.sYJG2co7U3amskV0psOFLJsxlBKQipWNkV6uW8VYNq6lh2CAJgp5lHc0\", \"\\xd5\\xaa\\xd5\\xaa\\xaa\\xaa\\xd5\\xaa\" },\n  { \"$6$short\", \"$6$short$dzyFC763S8QhaYsdATKEhS4Enyjn.5x3lYcgtaWPLd4kZP0OgYE.Aozbip8IGrA7HDjL/O6PRHDHJmgNX9Pmu/\", \"\\xd5\\xaa\\xd5\\xaa\\xaa\\xaa\\xd5\\xaa\" },\n  { \"$6$rounds=1000$saltstring\", \"$6$rounds=1000$saltstring$xbAcWgg3yrJhh1kQBLOML0lX7ruUOcmSFtnlCWfvdhNoLr8S1ITVqDJMqpLkDGxZsUmHlpAGQwbmrF6FH/9pU/\", \"\\xe1\\xec\\xe5\\xf8\\xe1\\xee\\xe4\\xe5\\xf2\" },\n  { \"$6$rounds=1000$short\", \"$6$rounds=1000$short$H7O6M/KIKoNPKD/eU9UInmP2yy18yDpWG6OeBzpn5rObAhiJrgjQ.58fakTOy56horrBoi8.gVJ8V3UFkCtzF/\", \"\\xe1\\xec\\xe5\\xf8\\xe1\\xee\\xe4\\xe5\\xf2\" },\n  { \"$6$saltstring\", \"$6$saltstring$aNvmG6BLAyz8Fs6rx69lSHQJTlPW8eQSmE9HJSw9aMiPAeh/M6qQHc5LJ3X0s6eq555oSVNsumeFhfLkD9/of1\", \"\\xe1\\xec\\xe5\\xf8\\xe1\\xee\\xe4\\xe5\\xf2\" },\n  { \"$6$short\", \"$6$short$lH01Vpje7gW.LNPRyCScyWZo3C7745.dpo7ze1ZTCUN9rLY58N7kAEd3W/gS2PFTbHWdcH01YSds/Wx1lQ75y1\", \"\\xe1\\xec\\xe5\\xf8\\xe1\\xee\\xe4\\xe5\\xf2\" },\n  { \"$6$rounds=1000$saltstring\", \"$6$rounds=1000$saltstring$.g.WGNi7iLuLVZkeTsOXmAbwud95EhzM8zjYdjA1QWiQEPACtSRq1pIuJECsUwvVgXk7coEwtigP87xg6nQtG0\", \"\\xf3\\xf4\\xe5\\xf0\\xe8\\xe1\\xee\\xe9\\xe5\" },\n  { \"$6$rounds=1000$short\", \"$6$rounds=1000$short$xeMNn161B7yjdn/yxMfWIoVIEreVVWDTu1MKnSogkzLXo9uTSrnKe3wDwuztE1knU1XMmTMDGA2Q52vD8d4Jc.\", \"\\xf3\\xf4\\xe5\\xf0\\xe8\\xe1\\xee\\xe9\\xe5\" },\n  { \"$6$saltstring\", \"$6$saltstring$TYs7vsVh7g5sQJr9.uSuJVwRYrG3dp60lkMWy3IZo.tILrQk7B.uGeDhIDWOFey2eI0C7WYO8NjN8tKps4TWe.\", \"\\xf3\\xf4\\xe5\\xf0\\xe8\\xe1\\xee\\xe9\\xe5\" },\n  { \"$6$short\", \"$6$short$aEHDhCGhHm/xMtm0V.FaNxIYmjHSMWZDhgJVeG9zHrPZqJDF0PP.zoJCGC99hayBazoRODwP4FQs9JilGFwHy0\", \"\\xf3\\xf4\\xe5\\xf0\\xe8\\xe1\\xee\\xe9\\xe5\" },\n  { \"$6$rounds=1000$saltstring\", \"$6$rounds=1000$saltstring$n6yjjvpTf5vOYjbZ1aZjqrx/TggPr79pwgjTl2dFI7VNx8oGNLeTle5emEp8tU4q7VPD8rjbwF2MItb7ZLN9h1\", \"\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\" },\n  { \"$6$rounds=1000$short\", \"$6$rounds=1000$short$YZBz3nb0tkiSw4VXXdYnRJobyr01k3IrXmvT.Xqg5xlpx4NzUW7WFVRooLmi8BSLKBqYe5dOH197HElp4TxXC1\", \"\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\" },\n  { \"$6$saltstring\", \"$6$saltstring$Nh.bh2TdtwRRFRiq9No4f2NBOlm2wFGPKtl9rtVLkWtXvuPu7/cekroG/jUdMSVyW./MMqulHZiEZU/UIfUhb/\", \"\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\" },\n  { \"$6$short\", \"$6$short$6WsjdYHCif04SXtslG/IFSeDkvlhiEPkUlzkwTy6BPg4qwZUynwL1l8b.Uutvawr/TsUERyoFSlCiNJEWZRMw.\", \"\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\" },\n  { \"$6$rounds=1000$saltstring\", \"$6$rounds=1000$saltstring$lqSxKTyNJyfspfDPqtL94zhESr4lrEzgEglVOs0bb.UNtwTCy3/77xPq0u4eMFNOBLe4B1wEKZu7E//jALYYw0\", \"\\xc3\\xa9tude\" },\n  { \"$6$rounds=1000$short\", \"$6$rounds=1000$short$DzTgQhcR.H7PNaDMGgZftQTnfYUKeRk51fQjbzSqLV712wJbvyuayaz5XzcMs5mqE9/W7QyrgpdoVrDS.I8VU1\", \"\\xc3\\xa9tude\" },\n  { \"$6$saltstring\", \"$6$saltstring$oyMuy295ywHYFzCNzjJ.pQfbChSPODUMXSPj0eUmlza6ouZkLV5B1GcLYOJ5cuAIs8RBfa.m.vChLPhnzV7Y61\", \"\\xc3\\xa9tude\" },\n  { \"$6$short\", \"$6$short$2kwvr8XBcIJt.cQGjw4l/HoyOQ/1M9K1gL7RKX76.LOvs4xoXsgBNI/8sRVjo3UET/GdEKsum/OOrqTBS6Mfi/\", \"\\xc3\\xa9tude\" },\n  { \"$6$rounds=1000$saltstring\", \"$6$rounds=1000$saltstring$aI8.T1BMUrBKzFge9FnSf9UxICh2qXaka98CL9RMdiDdjfwoOJKoHnItsfQ0L8QwbB6heNAG/xcsIVcJl.ezP.\", \"C)tude\" },\n  { \"$6$rounds=1000$short\", \"$6$rounds=1000$short$twUHZ7RWCTqbFKkhbXWkdKGQ3mboAdqqXi6ylwepTq75xRwrpojEVg89Ecytxhl3vQnv7H3IEo.GCFYYpakYJ0\", \"C)tude\" },\n  { \"$6$saltstring\", \"$6$saltstring$l89fmVBDOQGhgKenz0dZvndaV5YKqYFI31rs2fwt/Hi3xrMd6/penzXFaO6w4DEWHYUfkeNAVjwspRqGBKhIq0\", \"C)tude\" },\n  { \"$6$short\", \"$6$short$eP7XY9WD7L95d7FQyG6aKbJYmLxmyirFkAdOzBVNHohadfApTXliu1/8AekPNdEqKYeNl4QxbO09egjAnd0Wh.\", \"C)tude\" },\n  { \"$6$rounds=1000$saltstring\", \"$6$rounds=1000$saltstring$FpZ0gM0i8QK05LCaxmrLdup7MGQE7zazPQzhRLqnv3WCuy2Mpbv5IvaM99xgwqUXps.mWYi2rUNYBJ/M8xGS21\", \"Chl\\xc3\\xb6\"\"e\" },\n  { \"$6$rounds=1000$short\", \"$6$rounds=1000$short$HAeOK7n6a/Ka6SUpUkVHFlgba6zgPtXvAODDIyprAgwvky8GDQbLlBNXnUjcRWiRZeq8usNJ2/NnQpuP0F/Rv1\", \"Chl\\xc3\\xb6\"\"e\" },\n  { \"$6$saltstring\", \"$6$saltstring$TTqmAriNncf6gEOVEXU2Wgq6xkdKTfG4sbTUa3VSCNrmytU0Zb7T7O2oDvLoTx4rv7AKhjl/lEoAAAYwjVteg/\", \"Chl\\xc3\\xb6\"\"e\" },\n  { \"$6$short\", \"$6$short$4SAQwPI8F4hDophQlxlKgLlADRNvdnHYQuGqx3Wb7Wp7EEgRN6iqasf36IsTH6sQzN8Swt0M9j50BqctnwQxD/\", \"Chl\\xc3\\xb6\"\"e\" },\n  { \"$6$rounds=1000$saltstring\", \"$6$rounds=1000$saltstring$oPGrrC61AnuTL9X0zqAcQl7zbNUjbmukqIfzk17Vw0BMaWqwjfYPhf3Fx0LRgt0USYZmZlR0MdKrZOwx7dUCX0\", \"ChlC6e\" },\n  { \"$6$rounds=1000$short\", \"$6$rounds=1000$short$fu/5N2TO.aYWDv6cyPgWFR.p.OLAMYSXV4qvKd5ynBKqFJCeDi8CmV4QIuAnp8uFfitJnAO1dXuQJaSwH/OJj.\", \"ChlC6e\" },\n  { \"$6$saltstring\", \"$6$saltstring$2TIVIwonPaTL.E9zo4StKddFCtLh4W6EHyx70ouAn/Yb14E4wDRjth5h65VmVe1K2gTz.dn9T3UNqIaTBFjEx/\", \"ChlC6e\" },\n  { \"$6$short\", \"$6$short$yQfcxqnFm5bP0x8fSHaY4gPcytdZ3DhcbKW9ugeU1tYnrp0lwd1pdtnSOd3Cwg4ZXiI01Kh/wRw76fA3zE4Zm0\", \"ChlC6e\" },\n  { \"$6$rounds=1000$saltstring\", \"$6$rounds=1000$saltstring$qNEsE30AUxzt4Wyu6jSYhX5lNm7xX/JBoEpeZ24dY97F7Mst7KyDnty3oroA8Xgm2oTk3CL8sSig0sH6TICMZ.\", \"\\xc3\\x85ngstr\\xc3\\xb6m\" },\n  { \"$6$rounds=1000$short\", \"$6$rounds=1000$short$iZC3Y20GgQQoCliTKHsDRisrB.h8g5Y.HxVfhKC8So1QDLV/Ni5X6kr.eJ.UsI6FLdLqtzQBD0CscI0OqIoxl.\", \"\\xc3\\x85ngstr\\xc3\\xb6m\" },\n  { \"$6$saltstring\", \"$6$saltstring$.QesR2gQR5OtQR8FRy2drKqyBkarrH.ebtlK/iZMywUg3US5JDl/UW9hjzcSNSww0N8Xn8piAqbjEmzs.Qh500\", \"\\xc3\\x85ngstr\\xc3\\xb6m\" },\n  { \"$6$short\", \"$6$short$c/96eeT9kNWuBy9FQ6c.hAJk7EApHKN29sozv7fL8fapNnb5rNa3eebQgZJYHmFjcL.qJhvyAVA0jSfadw1VU/\", \"\\xc3\\x85ngstr\\xc3\\xb6m\" },\n  { \"$6$rounds=1000$saltstring\", \"$6$rounds=1000$saltstring$tjsfeL70n5StiTBhtioiCQQUbWuvPZl0WUtRZgjqgi5kO/DbBLHK0VqE8Js0ftK3i12BheBMv/Sw8psYVdHTZ1\", \"C\\x05ngstrC6m\" },\n  { \"$6$rounds=1000$short\", \"$6$rounds=1000$short$LfhdTfQKM.G7.gJMxUPFqGHQVn5mHe.42pKpq.CB3BEh.k5K7JgCsa8CdofBHgo1xseueAi8/AujKy8MBSh0P0\", \"C\\x05ngstrC6m\" },\n  { \"$6$saltstring\", \"$6$saltstring$LVh4mOHTcPsGlcm95e7OmJulwDcVl8F2d/PEU2GsDYx/AYV3zf6y6K5nug.sWfIbaRmg8pTuBkOLjj1fJesCK.\", \"C\\x05ngstrC6m\" },\n  { \"$6$short\", \"$6$short$JTRpBWXnPzC8TD4FLT2UNG/WUZ8napdn4HsC1n6XsG7xujXuE8TAgOV1GfsBLLgzElLUhzN.uulzMcq/BvqGa0\", \"C\\x05ngstrC6m\" },\n  { \"$6$rounds=1000$saltstring\", \"$6$rounds=1000$saltstring$ZnJfhfyCu.H44gsm31d0lZR94Brlnr7PoGsSJY6wdqw0UR5095GHCl.HmsWDEdoJkwyW/r3LGgITqpo859nAC/\", \"C\\x05ngstrCU*U***U*\" },\n  { \"$6$rounds=1000$short\", \"$6$rounds=1000$short$kxnJ4McbIHqgngO5keKkME6UcOw.HUWjPd2XX2ZidVG.4MWnAji94/u4k2AOEIhhrOh//mYIviRwx1Te2BgSL1\", \"C\\x05ngstrCU*U***U*\" },\n  { \"$6$saltstring\", \"$6$saltstring$ARcJN4T00LHHGdZrSnMYK3GCG1nzQhrF14eAeZb3W3Fb5ZEkCsSAFX7oPYdYothQw.09vdXp9gXzhv2MzSJQM/\", \"C\\x05ngstrCU*U***U*\" },\n  { \"$6$short\", \"$6$short$SWbqaVYzAkO6NnoFwTgF0PGTvU0RqsvO5/jLac4I1C12iYa4WzgqTJeuA40/N/bbjutZ6LEkRRqaFW9xd9Edq1\", \"C\\x05ngstrCU*U***U*\" },\n  { \"$6$rounds=1000$saltstring\", \"$6$rounds=1000$saltstring$clMp3RQ0uaQJZMtAO9qgbn8JCzjS9X/jfP6yIeK66I0jWWmkrIR8D5wDO7WoIpeBcenxgFe1KD6lVcg6J3mta.\", \"U*U***U*ignored\" },\n  { \"$6$rounds=1000$short\", \"$6$rounds=1000$short$K0A0RUj4BoimsKEMr7kKqqfSV.X8.v9itas2BHE6rCKt450KxmyczZuVYSb8VPfH7pyi/dU.DGGY7KKPgPMJI.\", \"U*U***U*ignored\" },\n  { \"$6$saltstring\", \"$6$saltstring$0W5Rdj5MD81NRYg2cR2iIkQjFIGtIGXxP8JiaVu.Tk/Z3Ui72SYzycEtjMu2Qc6HFD/wczVOpN4OusAA3WyEY1\", \"U*U***U*ignored\" },\n  { \"$6$short\", \"$6$short$bX782QNGcL9s5fuGzlFh8e9jtrdFmA/OdtZJADO6KesigMtXUCHt7RevVOJcaWCDGCz57BgAs.am.j6.dOo2L.\", \"U*U***U*ignored\" },\n  { \"$6$rounds=1000$saltstring\", \"$6$rounds=1000$saltstring$jWOGAhbA8zaKHCyf1UW7Ba9G1xjD.0TQ.63WCHWPHg6/qGFR/ve3pQM457QvWNhVh554j3gMUUp5vliH3IvMU/\", \"U*U*U*U*\" },\n  { \"$6$rounds=1000$short\", \"$6$rounds=1000$short$nVAKakB4Y9t46BM7jkyJzmdfBJfOS786wiM2tGNQA2S2hYyrT7368CT4jifRtw2hB6Edcrxuj9ddiBzsYtX8b.\", \"U*U*U*U*\" },\n  { \"$6$saltstring\", \"$6$saltstring$8xidKME3hWgcpxkMIJTKpHSQWqP7Pz5i26k/7tkdM/3ia4unNXdkdtMua/fgVEp9UvwOij/GisU83aV1cFn3u0\", \"U*U*U*U*\" },\n  { \"$6$short\", \"$6$short$c89eemEzAG/bdTaeGawqJBXmfT6Uz81eNXLnKCisJVRFSAp4Wetukl7sZUGdr7aHE.JnFy4SR5tZIJ6IAVcug/\", \"U*U*U*U*\" },\n  { \"$6$rounds=1000$saltstring\", \"$6$rounds=1000$saltstring$vA9sSBNM0OGhuk8/zVEGmnPE5UJQ0Cty8nnnpfjf.j6AFh6vnZtPJOIW5KrlADlamng0qCPTX2/cB2lob9VAw0\", \"U*U*U*U*ignored\" },\n  { \"$6$rounds=1000$short\", \"$6$rounds=1000$short$1WUlGvGT5yxqLbj6jVg2dn35RtUYE3M4OBm.dF3X2BbTXKqfGQcdR2KxgvZ6E/E3IaIrs3Gk30wGYkk12eHKM.\", \"U*U*U*U*ignored\" },\n  { \"$6$saltstring\", \"$6$saltstring$x8WUpqM9x28MUMMonJGLWv.AuQK63nmzqj/LFdPUydpkJQICSnxrZtRLwbygIDeRDlLART7IXcN1T5irL9Blz0\", \"U*U*U*U*ignored\" },\n  { \"$6$short\", \"$6$short$sB0VNp2O.CPxvionlKYE8B7JWAVb5N3bOcCHnhKnEb3H17sRcQFP9y0oBIN.TIK68D74GPkfxGJ3D3djVgO6q1\", \"U*U*U*U*ignored\" },\n  { \"$6$rounds=1000$saltstring\", \"$6$rounds=1000$saltstring$3Gmu79mkWCkOXvDFpq.h9hiIFLVeGstX1lO47su9rcrZLp1WVX7iE6eRPgV5/en8YPgWqWqpAB3gdGXfgZL950\", \"*U*U*U*U\" },\n  { \"$6$rounds=1000$short\", \"$6$rounds=1000$short$0bwHhJmLN12.KCXc5Yx0ySUkB0V7qybZkNp781ze7vhdyLFqg5BU31iQY.kp.48wM24EtaSwdQGaebHqLMWa6/\", \"*U*U*U*U\" },\n  { \"$6$saltstring\", \"$6$saltstring$AfsOGv5ealHbyGZrlI.fpIA3Imnl4C.WalSavWhgiINL2A/9/Wqd872PrREmJpbv0lfVgFgBD8oJZWSv0aeOn0\", \"*U*U*U*U\" },\n  { \"$6$short\", \"$6$short$FpGFMOXTJ3UMXgnTiJtiQAPsxw0cUOgyJdPC3n4XumXDyErGWX1KSCpQAS2A2zXQVnulfi8nnn50XVG/xW/B31\", \"*U*U*U*U\" },\n  { \"$6$rounds=1000$saltstring\", \"$6$rounds=1000$saltstring$ucF9vPzSVeoaG5PiR3UULS3BQyuHezx78af.c4dsuEU2MKL3iENf3n7zLglFFaQqFCD42CkT5bdwtK.OutUTt/\", \"*U*U*U*U*\" },\n  { \"$6$rounds=1000$short\", \"$6$rounds=1000$short$zUfmF1xmQ5aJeZjRB.K42UfSEyKRDVDSthLbbRA1KoADdDWOsuUT9jLkqq04h1qRzVScGzYKDuqUX1A7zWQLU0\", \"*U*U*U*U*\" },\n  { \"$6$saltstring\", \"$6$saltstring$V2AkgtJ7mXyiQV4/YUHVdN.WU9i445RgQ.AJCOpXfMFAVvbARob8OZ0asO2hzBJjfw2osBH6.CEAip1vPFhue.\", \"*U*U*U*U*\" },\n  { \"$6$short\", \"$6$short$ks7wOW3l4dY.Da8YZ381hq0TFJZuQHed3TamxI4FfMlQvgn2UZuQoMSGds8fO4mfxYns5odKkJskfhGJ7LSph1\", \"*U*U*U*U*\" },\n  { \"$6$rounds=1000$saltstring\", \"$6$rounds=1000$saltstring$R9YZaqQkrcPmqqW9vTU5TtIRU4nedTtzRpbREJPWdr49f2kl1lNs7nS4wEhcPjUUGKop2XU81A5nk/lFLlG2N/\", \"*U*U*U*U*U*U*U*U\" },\n  { \"$6$rounds=1000$short\", \"$6$rounds=1000$short$guHXWtwStMlV4XenpNt4gUtFhBlOU4Stw1L0Z5o4eFPq25CLQHlXKzzW0oA4fO5CMS9xrlZszwYpmo5Zm/Qj5.\", \"*U*U*U*U*U*U*U*U\" },\n  { \"$6$saltstring\", \"$6$saltstring$BKMJ16L3.XaWCHsbS.I1GG1TFKJdca1f5lGLor3ruzatqQQfJiWUAXJS8kfPGZCNw.3xNJK1j8fd7PBQmikCW.\", \"*U*U*U*U*U*U*U*U\" },\n  { \"$6$short\", \"$6$short$i4.3mdbVX.AbDRRa7dyj8lamfx1caSAQh5BYCI9NHLAtJbUpUARpC3kcRBkp1F5J5Mw9yrPi7PKtut1vf.XNx.\", \"*U*U*U*U*U*U*U*U\" },\n  { \"$6$rounds=1000$saltstring\", \"$6$rounds=1000$saltstring$PFSRhxM4iFRFcpTYBiAOtHQSwx0P0Y5dbiAJO2./Az4XuY8BPHpEHt3H.uffeJJdQIkAJAc7/FTJZIk4YKuDB0\", \"*U*U*U*U*U*U*U*U*\" },\n  { \"$6$rounds=1000$short\", \"$6$rounds=1000$short$MD3xHDcFA0jQg0mZjNWAiQNr/LwQqwJRoehrDBA.9.rLAWK.wJJYwH2FhgkKUcE/N9STPqSCuPApoGxy4crSM0\", \"*U*U*U*U*U*U*U*U*\" },\n  { \"$6$saltstring\", \"$6$saltstring$MLrB6KAxSMubezmVyywj/.12/6UVFi4e8uJKlBDEPBUNLzczLbJaIuAyG9E1BqB1VhjY.S5n/e0KgS0R/8zu80\", \"*U*U*U*U*U*U*U*U*\" },\n  { \"$6$short\", \"$6$short$Nwq/3dfZoXSeR5KtnYSPQjbPjX2kG2cqJIwbcAFldjrsMLLpnW7AOXPKL93v.Qs/4jMKSA4wGCXdQmq2fFwLd1\", \"*U*U*U*U*U*U*U*U*\" },\n  { \"$6$rounds=1000$saltstring\", \"$6$rounds=1000$saltstring$cfoadzqgR800Al7RBZYRSAwn63dmpU1BETe7n/5XlUKSe6nT8QsfQIx9nvpNa3EjeCLIhKVA/XmU0MDDsDtF3.\", \"\\xa3\" },\n  { \"$6$rounds=1000$short\", \"$6$rounds=1000$short$INiDCgrrVBhH2oDmKa70.OJzfmu2pSakZMPzWkm48/AGaEpxrTny563qx5IN.F41Nc36HzlS1ve7zvmgnfDAp0\", \"\\xa3\" },\n  { \"$6$saltstring\", \"$6$saltstring$ADYH2ZsU27JBhxjlw7RXDfxZbXaVpK4W9bYJdNqqhFVOjYt3/gU6vqWToxOcLNtuhaREGYQ/mLXxEQVFW9rk81\", \"\\xa3\" },\n  { \"$6$short\", \"$6$short$1ZXqXxhqZcG14m3.bN2jnIjfOWespbWzqvv9pakDEytsWB045W8.L/Ep217dDfE3pZImgWkUORsprwbWbaqbb0\", \"\\xa3\" },\n  { \"$6$rounds=1000$saltstring\", \"$6$rounds=1000$saltstring$T2s2OgRAcynEjfKC3/3DwA0Om5qKU10BOp8vk9N8WFIl8/Lk/JvaNTtLIr6FFf2Dfttul1AS6aY/1.YUkLbQJ.\", \"\\xa3\"\"a\" },\n  { \"$6$rounds=1000$short\", \"$6$rounds=1000$short$YdIefl9o7S6nHVk1qVVJ7PZ2XYeSANZLRjtQHRYbdob0If094.dV3aXePEI/KC8KkitLucubwJV/CT8cukVMe0\", \"\\xa3\"\"a\" },\n  { \"$6$saltstring\", \"$6$saltstring$pE3u.AmL.gorMh21dRdH46xHDqPJMGOn0rano.dhDuXBbDD8KeB1n12Q.mE0GRrZEvCn.el5KiCiksWKjGM8b/\", \"\\xa3\"\"a\" },\n  { \"$6$short\", \"$6$short$CIO5DRmcbEZstpV0g6zzheLj6K6VYnHTbHFKILGVQUHMMrhWyz/ZRMccFKYpsIttXXHsjiOLlmDHRQxDiHhID0\", \"\\xa3\"\"a\" },\n  { \"$6$rounds=1000$saltstring\", \"$6$rounds=1000$saltstring$4pYy7FBoMTYoniXE2gMQGly5RSqlhpvbDS5omtNwCf/EhPR0oJNmtaiQtSIRtb8TVszvNp53UxmP3V71MPTes.\", \"\\xd1\\x91\" },\n  { \"$6$rounds=1000$short\", \"$6$rounds=1000$short$4PJE3f3503BMGyo6.aY9iwU5WoxD86YY1YMZUj.ENtDIBDg3kdsD15LOhKVSwVqdqluNFScl8Kon1PjAQiNr8/\", \"\\xd1\\x91\" },\n  { \"$6$saltstring\", \"$6$saltstring$0btQSgkTTtr1nZt680KSHeVHbAAk6J49wwzykSOmgrMXW0dK2IplebW9XCWyAntNybFXnRXIPOQQfril35s351\", \"\\xd1\\x91\" },\n  { \"$6$short\", \"$6$short$EzJP58XRCkxWG64SAn8ETKobdEoFn8EIDHbw/zX5CH93YY9iOY6b46MPrhS/5UJtbWpUm7GU5l0Dvm3iQC6Yl1\", \"\\xd1\\x91\" },\n  { \"$6$rounds=1000$saltstring\", \"$6$rounds=1000$saltstring$2Ht59ZLnAJVqQ4OT0JfbjHLlA5QyMX/4BGHMVH58zZYMrJ8Zl1sNVIldCGk0zGzW7O8wdMr0W2iJmQ8WLmX4b0\", \"\\xa3\"\"ab\" },\n  { \"$6$rounds=1000$short\", \"$6$rounds=1000$short$msJhgJ841qE8e8QPZL000iGc6.HZrRxUAI19sGn9OBpo1dJZuivalgo91zLkCBdDxieYtC5usXZEcQLJHQDWs/\", \"\\xa3\"\"ab\" },\n  { \"$6$saltstring\", \"$6$saltstring$VTS3fHTxGcquer68dZ4HRB4Oa0/EXQHbA9cAFXrcwsp6HftEvW8FmUPaRgJyGxmFzai4LbLga0f.eHAwV3lW51\", \"\\xa3\"\"ab\" },\n  { \"$6$short\", \"$6$short$Yco2oerlIrCu7bOitFiuNPeK5GGE7SEatCEJUcXBeOLobPqwQ0cwJ2SOvJGfRWjbySrgqNSRZAFzv6Oez/3y9.\", \"\\xa3\"\"ab\" },\n  { \"$6$rounds=1000$saltstring\", \"$6$rounds=1000$saltstring$.MLHSFsM6VZptU1wN409BybKpHGtQo63uKV1e.UuROXTLz5TJSI4lFzLOxVLXA6dCvNvQjw.9RucAN.yLamjz.\", \"\\xff\\xff\\xa3\" },\n  { \"$6$rounds=1000$short\", \"$6$rounds=1000$short$C1dEQEgTHGfcd220x2sRsrkL8xBfIlP61AwE0Ccc9KMbOLZzI17y7p1cf3viOlQplEK/VIJ68SjXyi5TjH.4c.\", \"\\xff\\xff\\xa3\" },\n  { \"$6$saltstring\", \"$6$saltstring$eaAbRikHNdlr4mEPeMr8tDrsgiN.bSrv7DdZTJ0Kb893ii5AxBlZWEqn.O0T61mvoL53kdQchRIPDkrqCmFVs.\", \"\\xff\\xff\\xa3\" },\n  { \"$6$short\", \"$6$short$q51.yi9rKiq2ggZbDsvyJ4QU0.PH7giEh0.1dN7yMLgwx4vZaquFuUaNe57mMPno8CilObFBTy1y8DzDXSz4S1\", \"\\xff\\xff\\xa3\" },\n  { \"$6$rounds=1000$saltstring\", \"$6$rounds=1000$saltstring$bJhHkqf9pTlbtNRhvknNEUWn48g1nQ4cVf0EnC3FgQD2S4z93ba5qXCyDdUH0q4ondiumGvHjpz8QEiPvM/9m0\", \"1\\xa3\"\"345\" },\n  { \"$6$rounds=1000$short\", \"$6$rounds=1000$short$65S5U8tpUq8t9.X6fMdeyqwMygKGstI/5FACfNG6urolq4uFg5R1R5b1tQa.UqGAT9R9Hn6hkzCgVjysFNkD30\", \"1\\xa3\"\"345\" },\n  { \"$6$saltstring\", \"$6$saltstring$flE4V9gqvvXm/QJnvX1oOb8bcXXy.mtwdXtOO2PlGaeMxVc6FVv8w3G4pCpLCnJSIWs9t0wTRJGdv0MVSK2VU/\", \"1\\xa3\"\"345\" },\n  { \"$6$short\", \"$6$short$0Ad82qChXGoajTEc6.uvKBWsPh1CNg/gOcOC2lwjzRfCgmqJsjuGkKtyPineorhrkyTpM02NasxuxZnUZin8P.\", \"1\\xa3\"\"345\" },\n  { \"$6$rounds=1000$saltstring\", \"$6$rounds=1000$saltstring$yKfXESMPI59Z/TrG/DPmnFDZGzk0NBB8AS1Ksmw/5eV5rFhJ3OiGAgXlm1QUMZRtQvu8psczVer/CRJypjMEi/\", \"\\xff\\xa3\"\"345\" },\n  { \"$6$rounds=1000$short\", \"$6$rounds=1000$short$kC4oHr0rsvmn0A7RHOv/01ZsZJ1yBykFOFiTBbNG4PnYS3Ib4sY1YIrSx9NfdEVkCtgRjvw5jbmYs2da9W2fl.\", \"\\xff\\xa3\"\"345\" },\n  { \"$6$saltstring\", \"$6$saltstring$j7gw/3zW1xgIPsT8.z2teyd1cw2m6fFKCnbqhx/XLlUdKCw12GiZeDyyDMXk0bksJ57Il/R/c1tnYUD3bFkEO.\", \"\\xff\\xa3\"\"345\" },\n  { \"$6$short\", \"$6$short$BFKpPq/vAq/sr7IWp9M1MZldjRYu/Y5OIE4PBmyeAw4Mubl49zqINvuycugnUSmYf5EzkNJ.tIjv/aQPiFQYa/\", \"\\xff\\xa3\"\"345\" },\n  { \"$6$rounds=1000$saltstring\", \"$6$rounds=1000$saltstring$naCEzI9DpEwm/SpkW2/r3lCd20R6MbS/fgMV47EKgPBdnQ3SU3PJBoTz9kTU3ImIYDRzN53wxv/BQuCk9P2pW0\", \"\\xff\\xa3\"\"34\\xff\\xff\\xff\\xa3\"\"345\" },\n  { \"$6$rounds=1000$short\", \"$6$rounds=1000$short$t.zajUER6gsJLjzHyW5ESeVmjG4UpzLb4JCXxpgl7q5qXVR1UH2Ygnq4Or0b1oTuocp8.QX1Hqfk77xH73bwT0\", \"\\xff\\xa3\"\"34\\xff\\xff\\xff\\xa3\"\"345\" },\n  { \"$6$saltstring\", \"$6$saltstring$SOVyoUV5lm5ghaDHxOE7kphQYEmSZS2VlGp5dUrxgYdIwCs6pI4qF5W7Z5h2rYirPaZBVENAMkcv9E3XAz4vC0\", \"\\xff\\xa3\"\"34\\xff\\xff\\xff\\xa3\"\"345\" },\n  { \"$6$short\", \"$6$short$0sHULbee4AUcYqZT1na6upzJQokEnbrkRXxaBFaxkNm9JTurn5EaDDIYq.1SCJe3CJGnuWM9qtMGNx.1iHtqh.\", \"\\xff\\xa3\"\"34\\xff\\xff\\xff\\xa3\"\"345\" },\n  { \"$6$rounds=1000$saltstring\", \"$6$rounds=1000$saltstring$dvpgvI.4mhAYtOyD9D6xEJ8a.UWej46gyKsTrQog552LNYQ0O1e916wbvsAk0jDhbk3kM/3Jm8KjW8Z2383my/\", \"U\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xff\" },\n  { \"$6$rounds=1000$short\", \"$6$rounds=1000$short$EV8wmcsmm0.SToX7sHV4qqD51uQaF2T3Nipl105jF4e8uadxo5yOeeYLak7SodePcVQkuTYKd3Hvn2wsZ8ZRq.\", \"U\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xff\" },\n  { \"$6$saltstring\", \"$6$saltstring$Px6rvo3I1vcj0PkiLEDLVixte5TFmT97fbXEnyAEDG7VLTxTZ1fDecMUoRMx5PRUz.yWTDjn.75miqMFT11MK.\", \"U\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xff\" },\n  { \"$6$short\", \"$6$short$2nnUc9n55VzsmsAQBj4qiErQUQwwjdUwVD1lOcz5bqtR4fidsgfILgMQoy1KnIi9xMayGH3mIDno2khToTQtZ/\", \"U\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xff\" },\n  { \"$6$rounds=1000$saltstring\", \"$6$rounds=1000$saltstring$IqD0BNFtlXmBnWgHAi4oaHuUyRSM6v9JnMqxJLsCFT2G0U/TzE/V0eWKlxksHbGn7nAA4ftcXAI85T7IksWf//\", \"\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\" },\n  { \"$6$rounds=1000$short\", \"$6$rounds=1000$short$1NfLYMXy9wmDo5EwSO.2qj6C6nYb/eQghFIejexDL1dAmR3npkH7x5WtZP6t6GxMJUjz8IgRF/AjgcTVpkjGu.\", \"\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\" },\n  { \"$6$saltstring\", \"$6$saltstring$fkK/ZI4u46n0tAbp16eXeOREnOVMaf44V3FeB/cYfgvelYxgR8PvR6FtRUUwnSlYXOf456YrkKxh1ur8E4q8U/\", \"\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\" },\n  { \"$6$short\", \"$6$short$SX2.srHh2BTZwj3aSJZVOjA31Yk0Qs1W08o5gqEWe0/jP/J4uKgDYpX3GnozFCXFypx3tmmoQAdyybE4Ymqtb.\", \"\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\" },\n  { \"$6$rounds=1000$saltstring\", \"$6$rounds=1000$saltstring$TRt0WFaSeryA68pUHkFxNfLMoTamHYhboYLeHAU8PJl3sczB6PcXeVSLm4ciYTDGF3awWOHQ/nrYhnfP/srP3.\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\" },\n  { \"$6$rounds=1000$short\", \"$6$rounds=1000$short$KWkvemjbBkVmpG5.4rqLa6foWxsACsEUBhPVuDdYXTdVDWsFxaPRYcpiPfsiK/K0.EHMOqx2mKdleUwKAncCQ/\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\" },\n  { \"$6$saltstring\", \"$6$saltstring$C1x4DCtLXdfvBDuO5l0LJohGrKTCd5DkHCzFcr6I.YY4k4MzX4lRn/Eymio/qiJHZJDqLOWsjiXCIJtBjX7u/0\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\" },\n  { \"$6$short\", \"$6$short$fjfXygfY9TDUZFN9rJI7KIpqbkXw49IsfVmbMYdnh/8rTwFOGVudwJfli.tPfzKl59TYC4KQuirm3BO9KHLH6.\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\" },\n  { \"$6$rounds=1000$saltstring\", \"$6$rounds=1000$saltstring$5Bd6L7C7SUpEXWs8dXzJvdIJ41AjtWiphxBEf6LfrwKSykyq7byQ4QgSixbyjWNYn4o.Fjxx87jcekCNu2HRU1\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789chars after 72 are ignored\" },\n  { \"$6$rounds=1000$short\", \"$6$rounds=1000$short$dSjJVEhhlmqSva/1drYyoSCXF31mJEHuUZaPH7YQYlt5jjxzIF7V74Er.CE91cSnblPvaaFmu4VSCMRbacfUi1\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789chars after 72 are ignored\" },\n  { \"$6$saltstring\", \"$6$saltstring$4Vv94gOcNYi0BxlN.GhQomB7GR83BKINzEjrbJj8pY4j3s7J3UPSw5UCMm2dNbLtLXrmTpLlArH4pVkreOtEZ1\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789chars after 72 are ignored\" },\n  { \"$6$short\", \"$6$short$FDplMXyOzzSAXu9fXGmBPz3dAmX/XTfweZmezTAxvGuIwlJklJXFXZsKnHd5AterTt2TJKIJtOuPLLHOCcUcz.\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789chars after 72 are ignored\" },\n  { \"$6$rounds=1000$saltstring\", \"$6$rounds=1000$saltstring$ha2iJIaQFeY6GCMllr3nYrBsK.QZPyMPSa2CoF0XWektRLYXj0rN7icm03qtZfnSxcXQ0ORZWTKdFrK9NnnIg1\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\" },\n  { \"$6$rounds=1000$short\", \"$6$rounds=1000$short$pSqjkTfNFOJANgCT2lIrtxjdUPdJaIbwPzDLVZhYJd61Dvl.qK2P8kSB1djRlXOy.81ZlCxPx2tcWVrG0Js7S/\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\" },\n  { \"$6$saltstring\", \"$6$saltstring$9z3GMm4CWgnakXrrcu.3OtSBdptT71.vAn/H.dYFAGkUqr/yaN.NpWLhrFRjvVbd6tHT3mPWrBwlFVYAYgCGY0\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\" },\n  { \"$6$short\", \"$6$short$Js8gsW5AQZwcBewLbIaPXb9f.6tQAitBpkreCDsSEg6Q0IKjUwaKDM69aM09hR7juO3.qZKm24Rs9BCwhIkeL.\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\" },\n  { \"$6$rounds=1000$saltstring\", \"$6$rounds=1000$saltstring$xo/8FMRG5rsIK42JlxIFrljJNGpDy7FrbsEc2gvkL3tWTbnrLawlIQtO9BNAa/3ctWJBL8r.5x08ciyC6/zjt/\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\"\"chars after 72 are ignored as usual\" },\n  { \"$6$rounds=1000$short\", \"$6$rounds=1000$short$s7JVyEHSMjfdTb44bEYkeDOeaqcEs1xC8BB38QEqyLvbHmelag/6gMhQsE2yeB/m4gA6KWrxgt0V36enuScik0\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\"\"chars after 72 are ignored as usual\" },\n  { \"$6$saltstring\", \"$6$saltstring$lpmpUkmc1.CRlX3fUfYkqAriUSZQw/BTcSkT5AMROt0XOldAEXpMeCLPbddFVRwdJhUT/G5BDdT8ar12duDsz.\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\"\"chars after 72 are ignored as usual\" },\n  { \"$6$short\", \"$6$short$vNSO.LiJll5YbbuHlfV0iA.jHH6MOwphvlqNxb9iqSatOoyG7KcI5O0AmSvM1inukyHDZMbrm8pD7sz7Yr.Uf/\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\"\"chars after 72 are ignored as usual\" },\n  { \"$6$rounds=1000$saltstring\", \"$6$rounds=1000$saltstring$5zHh8vzmp1yP8U09jY03BRwUNbxRfoqmqyr5zo5QsW8EUoaA1fh2/d.HwLVVGZuEfp4d9THYQtjJjvE.k.LNF1\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has forgotten.\" },\n  { \"$6$rounds=1000$short\", \"$6$rounds=1000$short$b8GYqihRAr8HsGYgrNKE0rqgYqIUKF0.B90P0CAU/818kUOLy.L00w52DEdl7PjoKjNX/UTwU9ncwid92uba.0\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has forgotten.\" },\n  { \"$6$saltstring\", \"$6$saltstring$/rUd972yzYX7DEDZKhzC8/ICeAzy6fpGa8KrARh44wB.qN82ZipJw.8OhyPOlMFYq6tfOOdIAe4sHPMQKixWH.\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has forgotten.\" },\n  { \"$6$short\", \"$6$short$R7iqLyuPtPYLi8TIjebyTcNnotYvQkAOjavothfOSPmOjEZhzKky4zQwNjKdJBZTq4Efgy29zgd4zmEwvPc.80\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has forgotten.\" },\n  { \"$6$rounds=1000$saltstring\", \"$6$rounds=1000$saltstring$q3v0W9tO9bfZQ4Ep9mR8UbDxRurrbS69d29jYKq6/cDC5H5f/sULXpiBHHJpBSM38ENzyiD4mNQPHqwgqrEXe.\", \"THE YEAR\" },\n  { \"$6$rounds=1000$short\", \"$6$rounds=1000$short$AD.qO3XcIk7OQ2mLqo1D4YQR5glYYhRRn4s2UHXwhWMEIIEWM1Itgg.T4bStNoOqYctOlSglkTSQXMttJ/B/0/\", \"THE YEAR\" },\n  { \"$6$saltstring\", \"$6$saltstring$5o0AwCbNt91d5vd1vpi.1LPQjvjqhBPgV5Nb9X8PV9QZqXADhg0F1YtZT86czIA.JBze0VG.OvPe7rqNcKXYg.\", \"THE YEAR\" },\n  { \"$6$short\", \"$6$short$qYiQnpVUJSi2kdrrH.8YC7KpahfqCzOzU.Q/OBJuh5z7ypfAZqLp/zPRvzec.sKnXvcVEer9ya/4sWQVhTWvC0\", \"THE YEAR\" },\n  { \"$6$rounds=1000$saltstring\", \"$6$rounds=1000$saltstring$4ADe9g6C1fd7bkjXm93MX5ju6c8ceT4N6So01LeQkeDmKk996eMT5ewoybuTkvtub/KOOuUvfmVIjzm134mUs.\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and do\" },\n  { \"$6$rounds=1000$short\", \"$6$rounds=1000$short$f49IihvGQysoBWU6X2ZYhbhmIy1F6jnbD2nKQubmXlH09Pmlvu0ClgR.DexZDDQlBQKBPi5J49PBDfaFDyxW60\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and do\" },\n  { \"$6$saltstring\", \"$6$saltstring$RR6MtIURCum8PuEqvuHCH4yIPfgW7SDWIplo0oprxEyPn5iREDsDoEEej6sORhA/zA2T8.JQ7NLRaxkMq71fU/\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and do\" },\n  { \"$6$short\", \"$6$short$qLbQuWGGk4Z6Vfupuvzn5LXJop385TlZWxhSl37bN1cdY.sOmlwcJN4tsXMj7SwNCVtwgzchzKzfYwEB6DOo3.\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and do\" },\n  { \"$6$rounds=1000$saltstring\", \"$6$rounds=1000$saltstring$4LTytAiTGVAwfvtK0DlkMWJZKotvcimOEhCT6B7qO0edp7Tu.BmUP2YgW/LFq.Nk9GeULIPwd6Dz31TY20x72/\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has f\" },\n  { \"$6$rounds=1000$short\", \"$6$rounds=1000$short$PoqbmvF5IEmD.iLzi/LMjuJr1EJPZ3fqm98VtatJbLAikQHB0RAt6gpBytXGZOgPZp/f/HGn4o4RLAsb7xk1N1\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has f\" },\n  { \"$6$saltstring\", \"$6$saltstring$TgW9Lt0wix94P3AFI9AXi9MdzBWXXPBz1.4uTh3wx.3usNfiAqlPDEt62eimfnfgDh.AaMXND53S2Mci3Jyhq/\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has f\" },\n  { \"$6$short\", \"$6$short$MUawXOnh6YJmVmSJlYkzGpxCmQzcNLMASIiALHA5R5nxL2s1EnaeG3of5d6SV6aQmEnLTHAKz4pgOxJCDTOz//\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has f\" },\n#endif // sha512crypt\n\n#if INCLUDE_sm3crypt && defined TEST_sm3crypt\n  { \"$sm3$rounds=1000$saltstring\", \"$sm3$rounds=1000$saltstring$DY/RxQGOgn6Cwtu3J3zls23H/HR.msQ00y43IniBULA\", \"\" },\n  { \"$sm3$rounds=1000$short\", \"$sm3$rounds=1000$short$hdFJtTV19YqAC8eEHE47MmFZfctHPlLKmOFQIv2pni6\", \"\" },\n  { \"$sm3$rounds=5000$saltstring\", \"$sm3$rounds=5000$saltstring$4zfK6aB36s/5LqYV1jSDT2H2H1junxCd23hZZ4l1409\", \"\" },\n  { \"$sm3$rounds=5000$short\", \"$sm3$rounds=5000$short$5vN2Y1nopz.smCAfb7gds.V7mstevRRNpVyIxDduzO9\", \"\" },\n  { \"$sm3$rounds=1000$saltstring\", \"$sm3$rounds=1000$saltstring$sxITr.8FDs0MEXZ0TdglNfItrcUPQtxbBQmRw3Coor9\", \" \" },\n  { \"$sm3$rounds=1000$short\", \"$sm3$rounds=1000$short$DBDe97bnMwomNBamqKYQH4Hat3A3/4TeM6UzjIQyotB\", \" \" },\n  { \"$sm3$rounds=5000$saltstring\", \"$sm3$rounds=5000$saltstring$Ytn77U0zAOwqUcFEzPDlkASOmvjTnZaLRtCxmbt7w55\", \" \" },\n  { \"$sm3$rounds=5000$short\", \"$sm3$rounds=5000$short$NNd4StfvfAADWSaBE0UCKbRtw9j6HHTTf3ObfFKdnK4\", \" \" },\n  { \"$sm3$rounds=1000$saltstring\", \"$sm3$rounds=1000$saltstring$ejuqN9JzrsNNbp3HmsTB9feeYHrLZedwW4hJGIE4M35\", \"a\" },\n  { \"$sm3$rounds=1000$short\", \"$sm3$rounds=1000$short$jNJ78CbhDOdJiASJs7MfMbm5dIRxgq7z1h8CnHDpvi1\", \"a\" },\n  { \"$sm3$rounds=5000$saltstring\", \"$sm3$rounds=5000$saltstring$MpWc86WvXV3mmcDi2EilrIWezQj8bMPhvLmixn9rbZC\", \"a\" },\n  { \"$sm3$rounds=5000$short\", \"$sm3$rounds=5000$short$Zw0RaM0Nza1qSgeY0CAyeQ6/HMeystw9giEdEoVpvL5\", \"a\" },\n  { \"$sm3$rounds=1000$saltstring\", \"$sm3$rounds=1000$saltstring$nxyvt3gZusI2uBLDgB3XblB6OmGmvXHe14K0HDxrBX9\", \"ab\" },\n  { \"$sm3$rounds=1000$short\", \"$sm3$rounds=1000$short$uccxmwfX5Khx1fgNOskLYfgDTIaHKosXJqf1xyI8r0B\", \"ab\" },\n  { \"$sm3$rounds=5000$saltstring\", \"$sm3$rounds=5000$saltstring$4Ujzo48fXYH7yucGMBCepZ2QLZ1q430Q9hN7m9BgBG3\", \"ab\" },\n  { \"$sm3$rounds=5000$short\", \"$sm3$rounds=5000$short$KBbPXLQdLz2DBYAa69uKH4PD/U5Rkg5TpRHO.2EJ9w4\", \"ab\" },\n  { \"$sm3$rounds=1000$saltstring\", \"$sm3$rounds=1000$saltstring$rA2ewUHqiQH5Le9o318IWjgsADyZCgfFXofbx1T1NCD\", \"abc\" },\n  { \"$sm3$rounds=1000$short\", \"$sm3$rounds=1000$short$Ob2BBYUSZZxv.dF1TN.HXtJhmy6vQN0WSQsLG51CNi9\", \"abc\" },\n  { \"$sm3$rounds=5000$saltstring\", \"$sm3$rounds=5000$saltstring$U32OLSWps435lSsn72lk3zD0tHkCMmnE1GC.tOjVvW6\", \"abc\" },\n  { \"$sm3$rounds=5000$short\", \"$sm3$rounds=5000$short$pHV99BN12dlJp3efg3FMo2AcCkn1BxLTrAVFGsoEFI6\", \"abc\" },\n  { \"$sm3$rounds=1000$saltstring\", \"$sm3$rounds=1000$saltstring$4Q3X.Aa1nM7Dh2OKxRXyGzi2wxG7fQifl1KCU6vV/69\", \"U*U\" },\n  { \"$sm3$rounds=1000$short\", \"$sm3$rounds=1000$short$rHM4vOe93Gz5ALhptVmGlWzNlRya6TW.GCvGK4F6BX1\", \"U*U\" },\n  { \"$sm3$rounds=5000$saltstring\", \"$sm3$rounds=5000$saltstring$.ZOeFY689PqIb7QbfsIXjk1ZavWXPWzHuOF8dL4ej..\", \"U*U\" },\n  { \"$sm3$rounds=5000$short\", \"$sm3$rounds=5000$short$FijVuNU6xiNbr6eEOe8nx2Bi9YFr0JPoXi6QRFRzl70\", \"U*U\" },\n  { \"$sm3$rounds=1000$saltstring\", \"$sm3$rounds=1000$saltstring$XuwSVNIXXmZMEG47840kV7CYOAXhZmFvYYlaqF3CVCB\", \"U*U*\" },\n  { \"$sm3$rounds=1000$short\", \"$sm3$rounds=1000$short$pAjwBjYeBK.43Hf3YQvxB9Y2Z7srix0j4ru4GROM6JA\", \"U*U*\" },\n  { \"$sm3$rounds=5000$saltstring\", \"$sm3$rounds=5000$saltstring$txMiXkJXnt/zerIuTZRvBLhJwRieSxQuxvki8DHA136\", \"U*U*\" },\n  { \"$sm3$rounds=5000$short\", \"$sm3$rounds=5000$short$peVnLo0H9RSddJBmXTGoeNvr6DwFgQilW4QFzugLAU3\", \"U*U*\" },\n  { \"$sm3$rounds=1000$saltstring\", \"$sm3$rounds=1000$saltstring$HDnCN25CUyrhJu0EVrZ5QzQmgToRjNSa4eBkl2FUvH4\", \"U*U*U\" },\n  { \"$sm3$rounds=1000$short\", \"$sm3$rounds=1000$short$KeTF4ZbYxwIBP37fuE9I0aEPjBxLCfJdMQ6sUT6LprC\", \"U*U*U\" },\n  { \"$sm3$rounds=5000$saltstring\", \"$sm3$rounds=5000$saltstring$mIoEJ49aqX.gQf5en9Z8VRoR3qC2CcM.9hWZT2dm6N.\", \"U*U*U\" },\n  { \"$sm3$rounds=5000$short\", \"$sm3$rounds=5000$short$vzLs6NYwaJZiNtQqVTz0ikEjNTgfbbgvpAyUDGDplg8\", \"U*U*U\" },\n  { \"$sm3$rounds=1000$saltstring\", \"$sm3$rounds=1000$saltstring$1XFjK.4XTxLSXOWvHmfS0ruYkh0QcgJ54DuY31J.TF0\", \".....\" },\n  { \"$sm3$rounds=1000$short\", \"$sm3$rounds=1000$short$aAdb2TvgmWj8FD9SrSbPYOfHTxnrqoyiqxijhYbPRF3\", \".....\" },\n  { \"$sm3$rounds=5000$saltstring\", \"$sm3$rounds=5000$saltstring$6/CEoyynHobD/QRB3UrZabVxDKc/zUs5gUBg4nhBeA4\", \".....\" },\n  { \"$sm3$rounds=5000$short\", \"$sm3$rounds=5000$short$FN/NW0hZoGgSR5ecTC7KsjpY228f7KWYIm471Sr0aaA\", \".....\" },\n  { \"$sm3$rounds=1000$saltstring\", \"$sm3$rounds=1000$saltstring$YYXZgZLvT/Fq//Mz7PGZOmvN3AbIpZvAcVRDw9NIBa9\", \"dragon\" },\n  { \"$sm3$rounds=1000$short\", \"$sm3$rounds=1000$short$ZUwV2z9FN8sZCVrlZURJ9XwyMJwRXF3vntPnQ5MZHu1\", \"dragon\" },\n  { \"$sm3$rounds=5000$saltstring\", \"$sm3$rounds=5000$saltstring$eT95chxbg0ylgqXn4oyfwfNL9ft29WyfFbWm/mzma78\", \"dragon\" },\n  { \"$sm3$rounds=5000$short\", \"$sm3$rounds=5000$short$N0A8xfgXxC1VDK6DQTvXIzpqpOn4LnHPDcBa4gEVzC/\", \"dragon\" },\n  { \"$sm3$rounds=1000$saltstring\", \"$sm3$rounds=1000$saltstring$xBQklIKTd/y1bgctpBTm7wXqLebDYuWlMHk/9Z0Pk3D\", \"dRaGoN\" },\n  { \"$sm3$rounds=1000$short\", \"$sm3$rounds=1000$short$tBlzdqC0DnY9byrc5Ig.ddeSyyceTgPOQatWIInjtk7\", \"dRaGoN\" },\n  { \"$sm3$rounds=5000$saltstring\", \"$sm3$rounds=5000$saltstring$ykuSz8OGyu2x1xVQqccQKD.DazLFYi8M.Xdaog9hAbA\", \"dRaGoN\" },\n  { \"$sm3$rounds=5000$short\", \"$sm3$rounds=5000$short$nziejcq5svxUfTKYG5klPySdQhjRz67LI.IM3SXB7i9\", \"dRaGoN\" },\n  { \"$sm3$rounds=1000$saltstring\", \"$sm3$rounds=1000$saltstring$UGAndeR6RmXVtTFcoXIRX8zdeeKm.g42tCsazpxjkeB\", \"DrAgOn\" },\n  { \"$sm3$rounds=1000$short\", \"$sm3$rounds=1000$short$D0KbCtU4HAOn7aVCIqXjkE/XKHqgHfjNlDYOkZmFJt0\", \"DrAgOn\" },\n  { \"$sm3$rounds=5000$saltstring\", \"$sm3$rounds=5000$saltstring$V4xR/.Uw42fyGj2pHU3Y5pCXVu89geNV.nuM7DADMx6\", \"DrAgOn\" },\n  { \"$sm3$rounds=5000$short\", \"$sm3$rounds=5000$short$dG/g0ZHy.MUyk1vbTdwIY0mWfi0kbpPbZC1vUO9OArD\", \"DrAgOn\" },\n  { \"$sm3$rounds=1000$saltstring\", \"$sm3$rounds=1000$saltstring$9mL6PAtEdYliRUMm0nzwiAmyYj55hBPQYp8rvKIQW/0\", \"PAROLX\" },\n  { \"$sm3$rounds=1000$short\", \"$sm3$rounds=1000$short$JOakc7TIzgakCcZAp/UBDc50PnIh.4FlYJgHTyoSLd8\", \"PAROLX\" },\n  { \"$sm3$rounds=5000$saltstring\", \"$sm3$rounds=5000$saltstring$Fh588p2obDNmfBNQ/EV1sk4Hs53o/bisQzBc/5yhIt6\", \"PAROLX\" },\n  { \"$sm3$rounds=5000$short\", \"$sm3$rounds=5000$short$pB8toOQ2UvlJguN75WmxKyxKn1KmAVEcKESN/zn7mG0\", \"PAROLX\" },\n  { \"$sm3$rounds=1000$saltstring\", \"$sm3$rounds=1000$saltstring$F534AsJG0XvZywHWgOom.rYJxTCpE3WoIbxYWhzezkA\", \"U*U***U\" },\n  { \"$sm3$rounds=1000$short\", \"$sm3$rounds=1000$short$L1J4HMdo5s5xhJ07p1DCFwJlRCJbeIy0jiaABB0z8J4\", \"U*U***U\" },\n  { \"$sm3$rounds=5000$saltstring\", \"$sm3$rounds=5000$saltstring$333I.hNdFC8mNGS5P89t.b9ldb62NsKz.mCQLchHW67\", \"U*U***U\" },\n  { \"$sm3$rounds=5000$short\", \"$sm3$rounds=5000$short$hQ20kGu1jkeUKn1foc02XZnZoYzfU4D0Amm5Ksav6B2\", \"U*U***U\" },\n  { \"$sm3$rounds=1000$saltstring\", \"$sm3$rounds=1000$saltstring$taYtFABmjxy9s3STG3dov9O.Senab8IDKoGL53s2hc5\", \"abcdefg\" },\n  { \"$sm3$rounds=1000$short\", \"$sm3$rounds=1000$short$nQERoPAD3QmkSsmf5MYPQyKu3kfJJ2NkjmBHwnVxLM/\", \"abcdefg\" },\n  { \"$sm3$rounds=5000$saltstring\", \"$sm3$rounds=5000$saltstring$fKZroPmyPm/kJVVqEN3Kv9wfjgP1tc4D8MkSFMyek03\", \"abcdefg\" },\n  { \"$sm3$rounds=5000$short\", \"$sm3$rounds=5000$short$25nyMuun660zbmb99lNsRuPcp8Xnnxo3DzAp6/PXLg8\", \"abcdefg\" },\n  { \"$sm3$rounds=1000$saltstring\", \"$sm3$rounds=1000$saltstring$fg65oPVYz6Xf9B5vyweEvTucFoRRRvxoy1.TV/163D0\", \"01234567\" },\n  { \"$sm3$rounds=1000$short\", \"$sm3$rounds=1000$short$nyTxtgSjSCd7RUj/Gg5i.ZqrP8kmXGG2h2IZYuWAnDB\", \"01234567\" },\n  { \"$sm3$rounds=5000$saltstring\", \"$sm3$rounds=5000$saltstring$341ZVXHGiF5lVl6/blvPdxBm9OOel8BBlZ968uFss22\", \"01234567\" },\n  { \"$sm3$rounds=5000$short\", \"$sm3$rounds=5000$short$xYtCdSoCC6vOu7f1M3/2m06i1D.ypNhqPwIjLpygEGC\", \"01234567\" },\n  { \"$sm3$rounds=1000$saltstring\", \"$sm3$rounds=1000$saltstring$pi32X.3SMRQItwJ/sGp08YODXnJtjZYj8bMCOsh6Ta/\", \"726 even\" },\n  { \"$sm3$rounds=1000$short\", \"$sm3$rounds=1000$short$OdLgob98CD3ypkHaLiu1Xh5II3VkjCFxno5osH4eh6C\", \"726 even\" },\n  { \"$sm3$rounds=5000$saltstring\", \"$sm3$rounds=5000$saltstring$nTHZRic2COBpxgavH6azq1eJUoNt7DQkDS28ZrkVSpA\", \"726 even\" },\n  { \"$sm3$rounds=5000$short\", \"$sm3$rounds=5000$short$4WNlik8pvLeVwIklbldXHSgSSRbgI9smIX5qqxMVDU.\", \"726 even\" },\n  { \"$sm3$rounds=1000$saltstring\", \"$sm3$rounds=1000$saltstring$7KI2qQ5GQnGJSI8Od5qIUNU.q4HbJDkDA6kBuGo6BC0\", \"zyxwvuts\" },\n  { \"$sm3$rounds=1000$short\", \"$sm3$rounds=1000$short$M6Fa9N0S72cJkYK9FBL1nxYkkd3vt2o0UwVnV03AXR6\", \"zyxwvuts\" },\n  { \"$sm3$rounds=5000$saltstring\", \"$sm3$rounds=5000$saltstring$tXyloQukxjTiFPgYlawck9zzEAWqyyBQTIA1Tw4xpz1\", \"zyxwvuts\" },\n  { \"$sm3$rounds=5000$short\", \"$sm3$rounds=5000$short$Lq6FF9140PVBSlatimf1CL0vniFyuNEY3EogIkmgqB6\", \"zyxwvuts\" },\n  { \"$sm3$rounds=1000$saltstring\", \"$sm3$rounds=1000$saltstring$TM9CWlgsKUa6ZAcmQfGhR/G.2DSdyUIatmwgb7reDv/\", \"ab1234567\" },\n  { \"$sm3$rounds=1000$short\", \"$sm3$rounds=1000$short$DRcn5e4i9fjYUbpsm1x.j/enG.zWBo1BW53FJRt9pC.\", \"ab1234567\" },\n  { \"$sm3$rounds=5000$saltstring\", \"$sm3$rounds=5000$saltstring$JnfpW7SSlTNCKcYyLzdfofJgInlNw3KU989DWPqhYQ/\", \"ab1234567\" },\n  { \"$sm3$rounds=5000$short\", \"$sm3$rounds=5000$short$kBQlhEiwZoX5oNxAampnJBOlAR.rlPC/0LRvR76Sh26\", \"ab1234567\" },\n  { \"$sm3$rounds=1000$saltstring\", \"$sm3$rounds=1000$saltstring$.N/7tWjhx.fR6e59F.o2NxduJZjJ1E8pHCrcWz7A0H7\", \"alexander\" },\n  { \"$sm3$rounds=1000$short\", \"$sm3$rounds=1000$short$nZ5vMVX9c6f0nT7tANvfqZP1x9ozYWIdLjByMz8pcV9\", \"alexander\" },\n  { \"$sm3$rounds=5000$saltstring\", \"$sm3$rounds=5000$saltstring$R7XBnNqBXSsH59U2NGEX/ZFHQcunqkSWL7/4.zt8rH2\", \"alexander\" },\n  { \"$sm3$rounds=5000$short\", \"$sm3$rounds=5000$short$w5ktbxDWw5Ku6uX6xSUEomsAOpOnnh8is4M3kcOAoX2\", \"alexander\" },\n  { \"$sm3$rounds=1000$saltstring\", \"$sm3$rounds=1000$saltstring$PRNbwnnrUqjIbhhmiUgn/o3346RxDleSZBNDJGnGsr4\", \"beautiful\" },\n  { \"$sm3$rounds=1000$short\", \"$sm3$rounds=1000$short$fufvyFFBTbMXAV/94iyt6i5MBnMSt4.MGrDQejWSJn1\", \"beautiful\" },\n  { \"$sm3$rounds=5000$saltstring\", \"$sm3$rounds=5000$saltstring$k8xmg9rXc3wzDj8a/IfTgQzE.HBsLK86ulxT9iw2f16\", \"beautiful\" },\n  { \"$sm3$rounds=5000$short\", \"$sm3$rounds=5000$short$/OG6mE46AseMMBB5rxIUeI.YKyB7kVypQRzcpiTwYy4\", \"beautiful\" },\n  { \"$sm3$rounds=1000$saltstring\", \"$sm3$rounds=1000$saltstring$c6XUPc/ba8IPvtkqlpgeZuBzYa4SgXquMTklvsFLKh5\", \"challenge\" },\n  { \"$sm3$rounds=1000$short\", \"$sm3$rounds=1000$short$gSBwQeI0Wgp7.TQkANKIj97jS9lVIZcXypdjcy3Dnt3\", \"challenge\" },\n  { \"$sm3$rounds=5000$saltstring\", \"$sm3$rounds=5000$saltstring$U4x136Pj4rUNdV8zQNu7O89favMuqAiln8DIcMoKF6D\", \"challenge\" },\n  { \"$sm3$rounds=5000$short\", \"$sm3$rounds=5000$short$Lv7LGEmtQIWQfNHIxBYntKXn80DVvUM7Y98ITJcjFv9\", \"challenge\" },\n  { \"$sm3$rounds=1000$saltstring\", \"$sm3$rounds=1000$saltstring$hoE3dlo5O7mRxczAY9FY3yNmdQ2HgJi49Cf0Ff6cNj1\", \"chocolate\" },\n  { \"$sm3$rounds=1000$short\", \"$sm3$rounds=1000$short$NM/9ITZ9mrzlW2h.7AsaY4qyTThoUq3VfgQG8MeVte5\", \"chocolate\" },\n  { \"$sm3$rounds=5000$saltstring\", \"$sm3$rounds=5000$saltstring$Oi.5kWmhn8kQLKgSPS.x/BwtYx11w/5LetyA/lCoBw2\", \"chocolate\" },\n  { \"$sm3$rounds=5000$short\", \"$sm3$rounds=5000$short$sraphl6DcEsU2rhD9XFnOwGGa8KfSUQd1zc6kBwyCZC\", \"chocolate\" },\n  { \"$sm3$rounds=1000$saltstring\", \"$sm3$rounds=1000$saltstring$UqoBiLh7Bl4B4gfH9bgiQM9rFqyQmBmXbe0qeBOFJK2\", \"cr1234567\" },\n  { \"$sm3$rounds=1000$short\", \"$sm3$rounds=1000$short$vbL9wx4r6p3DUH2J3nbTvSBjD.avTsBM91dLPvqfbB8\", \"cr1234567\" },\n  { \"$sm3$rounds=5000$saltstring\", \"$sm3$rounds=5000$saltstring$OKdl4kX.79ghc56.5cYgz2w3TKkO9gYZUrRG4Rw52//\", \"cr1234567\" },\n  { \"$sm3$rounds=5000$short\", \"$sm3$rounds=5000$short$l7cf63qpDl6T3LiQe2BflvskU.ROdXVoK4MRMfv5kN7\", \"cr1234567\" },\n  { \"$sm3$rounds=1000$saltstring\", \"$sm3$rounds=1000$saltstring$YXMIdEZSCGd648XO.jaU2OZw2wPzbC3myNMszNiOJ6.\", \"katherine\" },\n  { \"$sm3$rounds=1000$short\", \"$sm3$rounds=1000$short$B/SvUAXb2bDV7Xa4iT12iTFaoZbxuS0cPhCx6ZMRGf5\", \"katherine\" },\n  { \"$sm3$rounds=5000$saltstring\", \"$sm3$rounds=5000$saltstring$ej3pc7JZsxTEL1LG/iozcwzpKnjxE/PoGNue0oQnal7\", \"katherine\" },\n  { \"$sm3$rounds=5000$short\", \"$sm3$rounds=5000$short$ajehP5eUVHGoxDinu8h6NfckgTJ5U.OLPcWQVh5yjj8\", \"katherine\" },\n  { \"$sm3$rounds=1000$saltstring\", \"$sm3$rounds=1000$saltstring$HLqUc/WnXFNg7GPTV12IEcHKOylSVmxZpPJZl7/afF.\", \"stephanie\" },\n  { \"$sm3$rounds=1000$short\", \"$sm3$rounds=1000$short$4o/w3sLtsr2K1nXhH8Acx547tRvzMQvaiIVNjqnROo7\", \"stephanie\" },\n  { \"$sm3$rounds=5000$saltstring\", \"$sm3$rounds=5000$saltstring$p6kJszVW2oI3svGpVuNdbE81P0wDogA8Hpk4l4.Elg/\", \"stephanie\" },\n  { \"$sm3$rounds=5000$short\", \"$sm3$rounds=5000$short$cCroEV2lIJnaHrahnL/ElJzC.puOvmcWS8fTS3I9fo1\", \"stephanie\" },\n  { \"$sm3$rounds=1000$saltstring\", \"$sm3$rounds=1000$saltstring$njjDZplG32S8RiKRjgWKy9BR0Y0H8s.v8pfL2t7fna8\", \"sunflower\" },\n  { \"$sm3$rounds=1000$short\", \"$sm3$rounds=1000$short$teVxXLfTZnUrgKWa4UKfM63CjiIl9HMDXU7Q/UlhYr4\", \"sunflower\" },\n  { \"$sm3$rounds=5000$saltstring\", \"$sm3$rounds=5000$saltstring$2kI19jrgMd7dCvxGhNY8iwRI.2rsyBnKkfGm2rOfoAB\", \"sunflower\" },\n  { \"$sm3$rounds=5000$short\", \"$sm3$rounds=5000$short$qatlAf3zxNz5lViGHa4AHS43iTPvRDmWAUebVWmVMQA\", \"sunflower\" },\n  { \"$sm3$rounds=1000$saltstring\", \"$sm3$rounds=1000$saltstring$Ekq0X8MbuAPFmmRslhuXGs6f2DeHB92.vqoOc9UzQY1\", \"basketball\" },\n  { \"$sm3$rounds=1000$short\", \"$sm3$rounds=1000$short$Gx6qFfkffYkppCG595hoQghzIlkKMm758Ain6ZOl/e0\", \"basketball\" },\n  { \"$sm3$rounds=5000$saltstring\", \"$sm3$rounds=5000$saltstring$poqCB9FzryUqt9SwOanhMqFSrSMVNqX3AZ2MQAlDKYD\", \"basketball\" },\n  { \"$sm3$rounds=5000$short\", \"$sm3$rounds=5000$short$2wWjAXu2TipE3Vq.AYBHPEVcKzqEl8tNxr5X3H0EIV0\", \"basketball\" },\n  { \"$sm3$rounds=1000$saltstring\", \"$sm3$rounds=1000$saltstring$8i56XE1WIQF5lUt0Lj/2Vd65WRjT4av6tskB11UlUBA\", \"porsche911\" },\n  { \"$sm3$rounds=1000$short\", \"$sm3$rounds=1000$short$c4rVR12ojhvXB61CQxWYliwrKASQLUTXQRTud6PkZjA\", \"porsche911\" },\n  { \"$sm3$rounds=5000$saltstring\", \"$sm3$rounds=5000$saltstring$ZMStbvdBwprrXD7vwityYtfYSoouHX30EpgpH7Ed2t3\", \"porsche911\" },\n  { \"$sm3$rounds=5000$short\", \"$sm3$rounds=5000$short$65HtHfBI7jDDE.LFRQKjpBcIydiasezxFwuqZZaAKR3\", \"porsche911\" },\n  { \"$sm3$rounds=1000$saltstring\", \"$sm3$rounds=1000$saltstring$QPRooF05NKfdCkLd15NT8F.m62NYsYTOBwgDMdpG5cB\", \"|_337T`/p3\" },\n  { \"$sm3$rounds=1000$short\", \"$sm3$rounds=1000$short$m4KV6Lcbn0fQhymntvugJzx9IBPcMDlONZm0GzwLpV5\", \"|_337T`/p3\" },\n  { \"$sm3$rounds=5000$saltstring\", \"$sm3$rounds=5000$saltstring$KtLvwzxUPkgnCZSdnSFHFDHFNGp3KeWvW2.COP8MGDD\", \"|_337T`/p3\" },\n  { \"$sm3$rounds=5000$short\", \"$sm3$rounds=5000$short$eumtcwyayLmZp9hyz//Yq1/XIq9EARblYosbO6eJH27\", \"|_337T`/p3\" },\n  { \"$sm3$rounds=1000$saltstring\", \"$sm3$rounds=1000$saltstring$bJAURkxnfpTj9GZYBWxHmt4ZYr5yroCxfrC4PYju3tD\", \"thunderbird\" },\n  { \"$sm3$rounds=1000$short\", \"$sm3$rounds=1000$short$9MxC.Inri6Fa4fYwZja9tki40nMuiPlxz3mzoL9B2E8\", \"thunderbird\" },\n  { \"$sm3$rounds=5000$saltstring\", \"$sm3$rounds=5000$saltstring$Tz/UYdlyCJZuH4um3d6u/WQMAHqkXwhHUpwV1..Tqb7\", \"thunderbird\" },\n  { \"$sm3$rounds=5000$short\", \"$sm3$rounds=5000$short$0q8VEiDUanfd/J4j2muPXBFciBihy4G1cW4bVRa1/rD\", \"thunderbird\" },\n  { \"$sm3$rounds=1000$saltstring\", \"$sm3$rounds=1000$saltstring$Pa6kHw.dW3mLTQrRPyPgMDBD9J2Yot.vLuIYEaVOX7A\", \"Hello world!\" },\n  { \"$sm3$rounds=1000$short\", \"$sm3$rounds=1000$short$Xhljz5ONFk7loiwSG5NnUO1CJHNBHOKVMXCoxiWhfD6\", \"Hello world!\" },\n  { \"$sm3$rounds=5000$saltstring\", \"$sm3$rounds=5000$saltstring$6RCuSuWbADZmLALkvsvtcYYzhrw3xxpuDcqwdPIWxTD\", \"Hello world!\" },\n  { \"$sm3$rounds=5000$short\", \"$sm3$rounds=5000$short$IU4UgXlHh91C6vLfqAIjp4AYrf00kYdb3NnaiI0Kt91\", \"Hello world!\" },\n  { \"$sm3$rounds=1000$saltstring\", \"$sm3$rounds=1000$saltstring$FL47naUWWFfU4BgZpmi5jyAAd.plDlfh3U7mufFnrN9\", \"pleaseletmein\" },\n  { \"$sm3$rounds=1000$short\", \"$sm3$rounds=1000$short$kop/QFyf0Ho4I7Cwa.UrbCLDcPqPIeiuftPB6sBawE/\", \"pleaseletmein\" },\n  { \"$sm3$rounds=5000$saltstring\", \"$sm3$rounds=5000$saltstring$cfJY5xu50jB9G/6suGLwfsVVnMpe1DXE7VysG79iTRA\", \"pleaseletmein\" },\n  { \"$sm3$rounds=5000$short\", \"$sm3$rounds=5000$short$kZS.oSc15a/RZAuyk2pS5.V4Y7Ty/46ySmsU2mwxZ00\", \"pleaseletmein\" },\n  { \"$sm3$rounds=1000$saltstring\", \"$sm3$rounds=1000$saltstring$wA3gPvI/bAv7kByrKbiMHvcqugsxvMF9cikErohj0m3\", \"a short string\" },\n  { \"$sm3$rounds=1000$short\", \"$sm3$rounds=1000$short$5j53g0ADwVUooubjKLpu.H5K9DNkhfPnxVUco4XUgIB\", \"a short string\" },\n  { \"$sm3$rounds=5000$saltstring\", \"$sm3$rounds=5000$saltstring$F08Rb8imuSOATNNFxg5RwN3TK3UNlgZ0kdwa.0xY.NC\", \"a short string\" },\n  { \"$sm3$rounds=5000$short\", \"$sm3$rounds=5000$short$BvscFXRN0ds7Q28C2Yx8n4Da.otvCG8qO5vh.A2lRF5\", \"a short string\" },\n  { \"$sm3$rounds=1000$saltstring\", \"$sm3$rounds=1000$saltstring$hDrzE9tpgmDqltcbBBwZZvBYwegA4YNFKSt0weSI.v8\", \"zxyDPWgydbQjgq\" },\n  { \"$sm3$rounds=1000$short\", \"$sm3$rounds=1000$short$QkVf2FU7mv2sWcgJb3QmKfpWjYpu63g.Rb0yxrgo6E6\", \"zxyDPWgydbQjgq\" },\n  { \"$sm3$rounds=5000$saltstring\", \"$sm3$rounds=5000$saltstring$SwA/Mx9kiH1m9Cw/47r8C4unl3CBE6qmon5iWJGevvC\", \"zxyDPWgydbQjgq\" },\n  { \"$sm3$rounds=5000$short\", \"$sm3$rounds=5000$short$mHT/fU8JrTB0RLogTbM/JSaYCPD4qKBLZdMid2ZRVk0\", \"zxyDPWgydbQjgq\" },\n  { \"$sm3$rounds=1000$saltstring\", \"$sm3$rounds=1000$saltstring$m2GKtR5fRtzbmc82jxbyILOn0UmGWV9qPZciOOGJ9J.\", \"photojournalism\" },\n  { \"$sm3$rounds=1000$short\", \"$sm3$rounds=1000$short$u3HEKP5RxNhNLwT07o56ZH7Zvj8nDCbGyALEZ0P2VB6\", \"photojournalism\" },\n  { \"$sm3$rounds=5000$saltstring\", \"$sm3$rounds=5000$saltstring$6HadTv.Cnm7cJAJJrrUTM2TSH8weeBVNkRmGcw3LBh7\", \"photojournalism\" },\n  { \"$sm3$rounds=5000$short\", \"$sm3$rounds=5000$short$fCtA58ScMHvYadFMh4Ph8fgrq7NEl0SdGCEt/Kb4XZC\", \"photojournalism\" },\n  { \"$sm3$rounds=1000$saltstring\", \"$sm3$rounds=1000$saltstring$8TfxxaG/1QWTdtSRMNl8GSrT3Z1wsxGGFGcCre2aNb.\", \"ecclesiastically\" },\n  { \"$sm3$rounds=1000$short\", \"$sm3$rounds=1000$short$C3mQiPFk0bZ6FoZS1X88P1/ODoZB5aFTuMw2opLTw15\", \"ecclesiastically\" },\n  { \"$sm3$rounds=5000$saltstring\", \"$sm3$rounds=5000$saltstring$hwAWuVrU/4pt.hGbSxMdNQ9KIsbuNOgtdrKEGm0rnr3\", \"ecclesiastically\" },\n  { \"$sm3$rounds=5000$short\", \"$sm3$rounds=5000$short$ip29IeV7nQEW7Jb.LTdzDC08S6WSKPY/AY2UvVg299D\", \"ecclesiastically\" },\n  { \"$sm3$rounds=1000$saltstring\", \"$sm3$rounds=1000$saltstring$4JY9H/DVzH52xHjvEp6i.uKxsTDgsFFJtQaZHDMqGzB\", \"congregationalism\" },\n  { \"$sm3$rounds=1000$short\", \"$sm3$rounds=1000$short$l2pX1cF87NzGhoERBly0mVfzCJeecSM8xCbhCDkLCT9\", \"congregationalism\" },\n  { \"$sm3$rounds=5000$saltstring\", \"$sm3$rounds=5000$saltstring$vNPsGPqzz/nR8uRKdfOWPh4Q1HDxC3PEUN2aZJSMAa6\", \"congregationalism\" },\n  { \"$sm3$rounds=5000$short\", \"$sm3$rounds=5000$short$qN6WzXNQl9a4jkIXDux9OpIxv0.R1jebzplWOfmWvE9\", \"congregationalism\" },\n  { \"$sm3$rounds=1000$saltstring\", \"$sm3$rounds=1000$saltstring$go./GUQM8QwIngLU3/EsEmFNbvxT0FW4lgwMrKvKbYC\", \"dihydrosphingosine\" },\n  { \"$sm3$rounds=1000$short\", \"$sm3$rounds=1000$short$jaNN6cmO0VUlPJEDo/wjbpdhA5/BkYPrxreRBUAKcM5\", \"dihydrosphingosine\" },\n  { \"$sm3$rounds=5000$saltstring\", \"$sm3$rounds=5000$saltstring$f.gxXdq9s8TUmuvTNp/O8HoEP4RWJhYAM/Fq0DB4wP2\", \"dihydrosphingosine\" },\n  { \"$sm3$rounds=5000$short\", \"$sm3$rounds=5000$short$X7e/Iv/KKc.O2K8tdOIiVZTy/JJDwoUrTGYrmFQEmTC\", \"dihydrosphingosine\" },\n  { \"$sm3$rounds=1000$saltstring\", \"$sm3$rounds=1000$saltstring$HU/Lo4YeVHHcWJ2KSwwOmvqrtxvxhLj7E0mRwfrYCd/\", \"semianthropological\" },\n  { \"$sm3$rounds=1000$short\", \"$sm3$rounds=1000$short$ez.q6KGYTd4SZi825mrlC7e3jcbr8lUqcJKo0X45fk4\", \"semianthropological\" },\n  { \"$sm3$rounds=5000$saltstring\", \"$sm3$rounds=5000$saltstring$rTWQeoMBv6t9zOvTFa3ZhMS5QNx.lHudyUZSpPc59h9\", \"semianthropological\" },\n  { \"$sm3$rounds=5000$short\", \"$sm3$rounds=5000$short$WH7VNghB2xdFo4UGse8JYAyv3/6iTdFdWpe2b.5Sd85\", \"semianthropological\" },\n  { \"$sm3$rounds=1000$saltstring\", \"$sm3$rounds=1000$saltstring$jp/cWYbbtwMQhiwSC/24ntbIYkCnstA821mOgJDiNp6\", \"palaeogeographically\" },\n  { \"$sm3$rounds=1000$short\", \"$sm3$rounds=1000$short$m.FwWSsKz5Ebeqp6OBqc5Tm5ysE75C/flqMAUDkmFsB\", \"palaeogeographically\" },\n  { \"$sm3$rounds=5000$saltstring\", \"$sm3$rounds=5000$saltstring$7iCK499PfIK9wFP6JMC0D481JQM0O0Tr37ZRIt5PdH7\", \"palaeogeographically\" },\n  { \"$sm3$rounds=5000$short\", \"$sm3$rounds=5000$short$IDTEwM8ID1CijzyOqRlHNbtA0FJ6yAytl6a/5sAJYBA\", \"palaeogeographically\" },\n  { \"$sm3$rounds=1000$saltstring\", \"$sm3$rounds=1000$saltstring$PjX1TR7utV.HK5vM6RFrj8rhMzbGRqVNHUrf9v4RWD0\", \"electromyographically\" },\n  { \"$sm3$rounds=1000$short\", \"$sm3$rounds=1000$short$vNEbtelA7nXFyXK7DWayr/3M0ZOMnguPR/.1ih/3xm7\", \"electromyographically\" },\n  { \"$sm3$rounds=5000$saltstring\", \"$sm3$rounds=5000$saltstring$dywVqkxVM8yASOR1nC8uZ/OTvByy328f0G2.u5jdLS1\", \"electromyographically\" },\n  { \"$sm3$rounds=5000$short\", \"$sm3$rounds=5000$short$o3hBf0JXl7fOu/O6osYNSi6HVk0Sm8gp2JO5Cyws.i/\", \"electromyographically\" },\n  { \"$sm3$rounds=1000$saltstring\", \"$sm3$rounds=1000$saltstring$aRNt242V17/4M6WrFNidc5OGh65D/5RwJ7UZ6cxs/e4\", \"noninterchangeableness\" },\n  { \"$sm3$rounds=1000$short\", \"$sm3$rounds=1000$short$IP0BmdKNDR22hX5sqJqhwNyOaGxxQGJBuhCNoob8cz5\", \"noninterchangeableness\" },\n  { \"$sm3$rounds=5000$saltstring\", \"$sm3$rounds=5000$saltstring$J795RjQ9UE43OIeIDhtTPTByoNrpG/rosxRVK1kcze5\", \"noninterchangeableness\" },\n  { \"$sm3$rounds=5000$short\", \"$sm3$rounds=5000$short$lypG6VWS/x7bRMT2Sula9DOKbn9Kb64h/AaoYm8GT88\", \"noninterchangeableness\" },\n  { \"$sm3$rounds=1000$saltstring\", \"$sm3$rounds=1000$saltstring$6Z/ztHFicqTviv/runc8zvzbNtaSQnxGg2f5BXZME9A\", \"abcdefghijklmnopqrstuvwxyz\" },\n  { \"$sm3$rounds=1000$short\", \"$sm3$rounds=1000$short$FrbF.1un9X4AH8C9ZkT4Ix6X1nlANgLFVuCz6s2TaQ2\", \"abcdefghijklmnopqrstuvwxyz\" },\n  { \"$sm3$rounds=5000$saltstring\", \"$sm3$rounds=5000$saltstring$5CNbkunUr.BKoN.tm26ttEiP7ydrNDrI.tN2nR7O.fA\", \"abcdefghijklmnopqrstuvwxyz\" },\n  { \"$sm3$rounds=5000$short\", \"$sm3$rounds=5000$short$6M2o3he2TIIUqRvPhrgftFV2zOHNixPzB7DeM4WIyVB\", \"abcdefghijklmnopqrstuvwxyz\" },\n  { \"$sm3$rounds=1000$saltstring\", \"$sm3$rounds=1000$saltstring$a2p5myGBwXGcQPuog9IJNm.f.m5LDjrA.CAbO7jWmZ6\", \"electroencephalographically\" },\n  { \"$sm3$rounds=1000$short\", \"$sm3$rounds=1000$short$2D0zqCxOl5/2UtqCF0VQW4KJXqqpn.6XT.HTkTsw2EC\", \"electroencephalographically\" },\n  { \"$sm3$rounds=5000$saltstring\", \"$sm3$rounds=5000$saltstring$/ubRwa8MxujkX4QWuNYhs0Fje1W1oNjK78oGPV3UYt.\", \"electroencephalographically\" },\n  { \"$sm3$rounds=5000$short\", \"$sm3$rounds=5000$short$DYWk1yH/lZd/cYmh1EYRnyPgzu2pHcCMMQ3jks8TbC/\", \"electroencephalographically\" },\n  { \"$sm3$rounds=1000$saltstring\", \"$sm3$rounds=1000$saltstring$K5fvmYZF2QH905s81hkgHHn0uZrKzudqqi7ahWXxmx.\", \"antidisestablishmentarianism\" },\n  { \"$sm3$rounds=1000$short\", \"$sm3$rounds=1000$short$sLI7RjV28kIqCrQwUx29sP64MeVsrTHIYGwtqZMc3vB\", \"antidisestablishmentarianism\" },\n  { \"$sm3$rounds=5000$saltstring\", \"$sm3$rounds=5000$saltstring$lf3Lg3dBDp9p7meEgSGba2ncZxNkn5mQahr6xHX.812\", \"antidisestablishmentarianism\" },\n  { \"$sm3$rounds=5000$short\", \"$sm3$rounds=5000$short$7jF.Bp2lVghCj9hi4xbegdXuiS06TDk6i2ecFkrrqm/\", \"antidisestablishmentarianism\" },\n  { \"$sm3$rounds=1000$saltstring\", \"$sm3$rounds=1000$saltstring$Y6H4YSAz5tCY.dPLDMLDhsVVOrYElP37dBi6vf2GZmA\", \"cyclotrimethylenetrinitramine\" },\n  { \"$sm3$rounds=1000$short\", \"$sm3$rounds=1000$short$GsJwoF7seuSByJ/L30pth2M1ZyM3pV944kkVtAuViL8\", \"cyclotrimethylenetrinitramine\" },\n  { \"$sm3$rounds=5000$saltstring\", \"$sm3$rounds=5000$saltstring$wFq0tGlna4j5F7lV4c2/XC0RkEfXG23N1BPRQ1JoD.C\", \"cyclotrimethylenetrinitramine\" },\n  { \"$sm3$rounds=5000$short\", \"$sm3$rounds=5000$short$xc5rvzORo2dhP9REc1I40LnXRKrx4drRmenjQGh8BlA\", \"cyclotrimethylenetrinitramine\" },\n  { \"$sm3$rounds=1000$saltstring\", \"$sm3$rounds=1000$saltstring$t4bM5DCjZ8RaSdG1Qbw2cLOVg.IaR1HW2RJxbSeXRQA\", \"dichlorodiphenyltrichloroethane\" },\n  { \"$sm3$rounds=1000$short\", \"$sm3$rounds=1000$short$WV7JA0NqJqyjO/mK3RorUe10CIqbNr4c96n87hTi4R.\", \"dichlorodiphenyltrichloroethane\" },\n  { \"$sm3$rounds=5000$saltstring\", \"$sm3$rounds=5000$saltstring$uqqk8cpOeRg1voybWeSMtL.KefcaS/l4JJOr7na2rl9\", \"dichlorodiphenyltrichloroethane\" },\n  { \"$sm3$rounds=5000$short\", \"$sm3$rounds=5000$short$ciTG5kwtd7cx5QkkJ56sgiPU7jqcozb0XTXvgr2SMQC\", \"dichlorodiphenyltrichloroethane\" },\n  { \"$sm3$rounds=1000$saltstring\", \"$sm3$rounds=1000$saltstring$YNqregTjuxWNVpj/YQMOnvBaPuJCWNloXCLoTfcLMeC\", \"multiple words seperated by spaces\" },\n  { \"$sm3$rounds=1000$short\", \"$sm3$rounds=1000$short$Yuypa7VvtaKE2ey.uc80Wujc4NXRbM2b5.FX9K3dvM6\", \"multiple words seperated by spaces\" },\n  { \"$sm3$rounds=5000$saltstring\", \"$sm3$rounds=5000$saltstring$Pokp0eFIyDW5sbDQqg0xPQ8cOS500eP0jM6o.zUeHq/\", \"multiple words seperated by spaces\" },\n  { \"$sm3$rounds=5000$short\", \"$sm3$rounds=5000$short$G8eyyx8QzNgoSpEPyi/hi7DhcRkP6DGK7rQeVLP.nh/\", \"multiple words seperated by spaces\" },\n  { \"$sm3$rounds=1000$saltstring\", \"$sm3$rounds=1000$saltstring$EcMTU3Q8SYyE6/pTTCM3cIQqpAZgQyLVAcreJ5yHPy9\", \"supercalifragilisticexpialidocious\" },\n  { \"$sm3$rounds=1000$short\", \"$sm3$rounds=1000$short$/hcEhkxFZraFqJkQ2ysfcaqHJOq7jhwK9is./c..7i9\", \"supercalifragilisticexpialidocious\" },\n  { \"$sm3$rounds=5000$saltstring\", \"$sm3$rounds=5000$saltstring$RSPHt7ENpT.WkuEBVt67lSATvV9gXg4pvuOpGl02yrD\", \"supercalifragilisticexpialidocious\" },\n  { \"$sm3$rounds=5000$short\", \"$sm3$rounds=5000$short$/ClChT.ZIFeogGi8KaKAJWGRRabtWblPRyYTsr03/V4\", \"supercalifragilisticexpialidocious\" },\n  { \"$sm3$rounds=1000$saltstring\", \"$sm3$rounds=1000$saltstring$mQvSFc4wlX43dWlk8mrOGP.NBvBe8TgBKTx2.sncA/.\", \"we have a short salt string but not a short password\" },\n  { \"$sm3$rounds=1000$short\", \"$sm3$rounds=1000$short$FJQKB.aX2UW3BcossAqf60FPwp5AkJVo16hOXiZMdI8\", \"we have a short salt string but not a short password\" },\n  { \"$sm3$rounds=5000$saltstring\", \"$sm3$rounds=5000$saltstring$FPoSNbUDYr4/nDrQMd0Rz1Skid3ByxrMJMsWxRIRYRC\", \"we have a short salt string but not a short password\" },\n  { \"$sm3$rounds=5000$short\", \"$sm3$rounds=5000$short$oAt.ZgQBnQWSYgjlCVmIk6.nVWUCgofJBqYC8LRjBI1\", \"we have a short salt string but not a short password\" },\n  { \"$sm3$rounds=1000$saltstring\", \"$sm3$rounds=1000$saltstring$2B8UJmSdErl3QM9.6VniqtE78gBAgJkXMAWohxNaFPD\", \"multiple word$ $eperated by $pace$ and $pecial character$\" },\n  { \"$sm3$rounds=1000$short\", \"$sm3$rounds=1000$short$a/hGXCrV1A/vRTnqQttNVcmUca5Zuco02TYEhBpmDR/\", \"multiple word$ $eperated by $pace$ and $pecial character$\" },\n  { \"$sm3$rounds=5000$saltstring\", \"$sm3$rounds=5000$saltstring$DRystZBkjtpanszSepAb5QEK4Z2Yx1cx5b0a877QGK1\", \"multiple word$ $eperated by $pace$ and $pecial character$\" },\n  { \"$sm3$rounds=5000$short\", \"$sm3$rounds=5000$short$PHKwM5ZynGDjb9WFrU9hUKo5DRkDtoBjBYHnSRo15w8\", \"multiple word$ $eperated by $pace$ and $pecial character$\" },\n  { \"$sm3$rounds=1000$saltstring\", \"$sm3$rounds=1000$saltstring$rhtCacI9n9hLTXouopGunTofK4hDbU3PYZeKSbVlY5D\", \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\" },\n  { \"$sm3$rounds=1000$short\", \"$sm3$rounds=1000$short$WejmLB8lKuz4lbn3x91Auf1NeJqjWao/WZ7QEbHNxi6\", \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\" },\n  { \"$sm3$rounds=5000$saltstring\", \"$sm3$rounds=5000$saltstring$xlAhWCVG3.N5KWKihACVhhKVTqAdjJn3OXAUOH2w1d6\", \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\" },\n  { \"$sm3$rounds=5000$short\", \"$sm3$rounds=5000$short$ZcffqmwmwVXJ4hrrOl2ccbxyILWA8i9W8SGq25fOxyC\", \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\" },\n  { \"$sm3$rounds=1000$saltstring\", \"$sm3$rounds=1000$saltstring$xPwOY0J0bDzXKxC0JwB2k80WxyS.jh7j9XQ56Aqk.L4\", \"12345678901234567890123456789012345678901234567890123456789012345678901234567890\" },\n  { \"$sm3$rounds=1000$short\", \"$sm3$rounds=1000$short$A.gR7E3BN9XglvFRbrybVxa7eeVsl7yTsrTieeuVchB\", \"12345678901234567890123456789012345678901234567890123456789012345678901234567890\" },\n  { \"$sm3$rounds=5000$saltstring\", \"$sm3$rounds=5000$saltstring$Rr.CISWFO3kIfAoYFz6TlsyG2tECs1k2EQSpyr7Js42\", \"12345678901234567890123456789012345678901234567890123456789012345678901234567890\" },\n  { \"$sm3$rounds=5000$short\", \"$sm3$rounds=5000$short$TrjtpKkgWB3fi64Nlyi.tbB0xICx.VR0kGEVvpNQx09\", \"12345678901234567890123456789012345678901234567890123456789012345678901234567890\" },\n  { \"$sm3$rounds=1000$saltstring\", \"$sm3$rounds=1000$saltstring$3SqImOMqMzXE4/zdnClNr7Dw4W2TsSt07i04tCdW5f1\", \"a very much longer text to encrypt.  This one even stretches over morethan one line.\" },\n  { \"$sm3$rounds=1000$short\", \"$sm3$rounds=1000$short$9KQ2Prf52xPxP.aQn2pysh36RwqgzyO02VgjdybHZHC\", \"a very much longer text to encrypt.  This one even stretches over morethan one line.\" },\n  { \"$sm3$rounds=5000$saltstring\", \"$sm3$rounds=5000$saltstring$h7I1Om/q6w/QXeFJVqHmT19MvcpIIkxG3Esr5DBFFb.\", \"a very much longer text to encrypt.  This one even stretches over morethan one line.\" },\n  { \"$sm3$rounds=5000$short\", \"$sm3$rounds=5000$short$zcNvuFNNFk7PMrZRDtkoY78E7.hX7OICcpijwJ0FT90\", \"a very much longer text to encrypt.  This one even stretches over morethan one line.\" },\n  { \"$sm3$rounds=1000$saltstring\", \"$sm3$rounds=1000$saltstring$pjacT/KurWRCpgdpG26NevciPkApHNYYraVVjCpjhE/\", \"\\xd0\\xc1\\xd2\\xcf\\xcc\\xd8\" },\n  { \"$sm3$rounds=1000$short\", \"$sm3$rounds=1000$short$NTj4yc.//IQhWSB..IjncFA/Te9O5052FOn1PneoDM0\", \"\\xd0\\xc1\\xd2\\xcf\\xcc\\xd8\" },\n  { \"$sm3$rounds=5000$saltstring\", \"$sm3$rounds=5000$saltstring$k8JOipbAgIVak80YyDTLGBLBlcnefaR0KhERsNtrLF5\", \"\\xd0\\xc1\\xd2\\xcf\\xcc\\xd8\" },\n  { \"$sm3$rounds=5000$short\", \"$sm3$rounds=5000$short$3bo9Pp0BNPLsRiR/1WcehPldb75WvwVE3/2LEWJFk50\", \"\\xd0\\xc1\\xd2\\xcf\\xcc\\xd8\" },\n  { \"$sm3$rounds=1000$saltstring\", \"$sm3$rounds=1000$saltstring$KDvVoMuQcdyc2nxRnXTkm5.2FMvfGM6pYPedrQAyhQ5\", \"\\xd5\\xaa\\xd5\\xaa\\xaa\\xaa\\xd5\\xaa\" },\n  { \"$sm3$rounds=1000$short\", \"$sm3$rounds=1000$short$tOC2KTCZEv13vRqB3LNM0Z8cLsvnJbT/3t/rtxkFla0\", \"\\xd5\\xaa\\xd5\\xaa\\xaa\\xaa\\xd5\\xaa\" },\n  { \"$sm3$rounds=5000$saltstring\", \"$sm3$rounds=5000$saltstring$G3rM/Ys5HanPSdK23EYc1lNJWzq2oq5YYw21M3iNWF.\", \"\\xd5\\xaa\\xd5\\xaa\\xaa\\xaa\\xd5\\xaa\" },\n  { \"$sm3$rounds=5000$short\", \"$sm3$rounds=5000$short$NztksAWS0wdtgwJhi/wJtFGAUKl.BWSWv8bJGr9pOSB\", \"\\xd5\\xaa\\xd5\\xaa\\xaa\\xaa\\xd5\\xaa\" },\n  { \"$sm3$rounds=1000$saltstring\", \"$sm3$rounds=1000$saltstring$9.vBK3LWbonABUZ68LXpCEtckCKHKrIiT/4Db36AKm9\", \"\\xe1\\xec\\xe5\\xf8\\xe1\\xee\\xe4\\xe5\\xf2\" },\n  { \"$sm3$rounds=1000$short\", \"$sm3$rounds=1000$short$DF7yocLwCmjinoChDQX8RVi4p7F6mL89n3pRzoyEJI7\", \"\\xe1\\xec\\xe5\\xf8\\xe1\\xee\\xe4\\xe5\\xf2\" },\n  { \"$sm3$rounds=5000$saltstring\", \"$sm3$rounds=5000$saltstring$.mVbRdHx8JJsg9VZk8NIOIKgz3nda.rvEONL6zsxqT1\", \"\\xe1\\xec\\xe5\\xf8\\xe1\\xee\\xe4\\xe5\\xf2\" },\n  { \"$sm3$rounds=5000$short\", \"$sm3$rounds=5000$short$AKs/pXZzmbVU9sajD34dnNWqqwoNBJvqrkFLUnyv8I3\", \"\\xe1\\xec\\xe5\\xf8\\xe1\\xee\\xe4\\xe5\\xf2\" },\n  { \"$sm3$rounds=1000$saltstring\", \"$sm3$rounds=1000$saltstring$NmfqUx9YVDwmgkZ2sqoMawWDmfJZfuIUbIkq9dHu8N1\", \"\\xf3\\xf4\\xe5\\xf0\\xe8\\xe1\\xee\\xe9\\xe5\" },\n  { \"$sm3$rounds=1000$short\", \"$sm3$rounds=1000$short$rcr9jA4UGZ0soWuAYmEewePPOrdWse4WdwbZKDjnoS3\", \"\\xf3\\xf4\\xe5\\xf0\\xe8\\xe1\\xee\\xe9\\xe5\" },\n  { \"$sm3$rounds=5000$saltstring\", \"$sm3$rounds=5000$saltstring$.d8ucVrbrnwo4inw6/EC4O.Lb6knpehq9R6VmkEurND\", \"\\xf3\\xf4\\xe5\\xf0\\xe8\\xe1\\xee\\xe9\\xe5\" },\n  { \"$sm3$rounds=5000$short\", \"$sm3$rounds=5000$short$jseeqZpGRxS02BBc67/vYDvxd9pUdXHSx8VLwOlmHD6\", \"\\xf3\\xf4\\xe5\\xf0\\xe8\\xe1\\xee\\xe9\\xe5\" },\n  { \"$sm3$rounds=1000$saltstring\", \"$sm3$rounds=1000$saltstring$q/H2LjdeGHR.IZzMolMIjty.yE5st5UXtW4oV7.68nA\", \"\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\" },\n  { \"$sm3$rounds=1000$short\", \"$sm3$rounds=1000$short$PW6/Hy4LSC6oWoWPPvWaoNXTTFNecyiDvtGUoH6Ehq0\", \"\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\" },\n  { \"$sm3$rounds=5000$saltstring\", \"$sm3$rounds=5000$saltstring$XMViHj9DBHI6MTk7Q1Qe.H8/uZSoqgoqOkTlrepLSp0\", \"\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\" },\n  { \"$sm3$rounds=5000$short\", \"$sm3$rounds=5000$short$/nj5uf2KAThGKZ7jzVRdPZETr/NzsEDwO4dEdFJ7JY7\", \"\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\" },\n  { \"$sm3$rounds=1000$saltstring\", \"$sm3$rounds=1000$saltstring$3KCmKfZxpkCGt0icqULgVdGPn0GSw83vkiVDsqq6D.A\", \"\\xc3\\xa9tude\" },\n  { \"$sm3$rounds=1000$short\", \"$sm3$rounds=1000$short$a13CZy/fViEqrCwpjVseQV2672j/7vKG4wPvrUFK/9.\", \"\\xc3\\xa9tude\" },\n  { \"$sm3$rounds=5000$saltstring\", \"$sm3$rounds=5000$saltstring$bZIT68GWYwWdrio4orp.Qq6ITlv4qfdeQa2Poi0nRn/\", \"\\xc3\\xa9tude\" },\n  { \"$sm3$rounds=5000$short\", \"$sm3$rounds=5000$short$4DpCqdQg0PkJtLKcTqLvStVM/FpGiWH/Dbjxs1ifjM2\", \"\\xc3\\xa9tude\" },\n  { \"$sm3$rounds=1000$saltstring\", \"$sm3$rounds=1000$saltstring$.2xRVxrlhADx4W3Be9rjdNmStFD9FkS7GryviSRpIi9\", \"C)tude\" },\n  { \"$sm3$rounds=1000$short\", \"$sm3$rounds=1000$short$Vm9OJsQ/TZ6T6GKEU5yuRbBwjTvcQE.udXfFNYt0Nb0\", \"C)tude\" },\n  { \"$sm3$rounds=5000$saltstring\", \"$sm3$rounds=5000$saltstring$HoImpxJb5lLYnEVGP66uGBOOobHn.wmyL3nV8isMWE5\", \"C)tude\" },\n  { \"$sm3$rounds=5000$short\", \"$sm3$rounds=5000$short$2ynxM1Y/swCUgaFje.QumENYy7Euu62vm0EVGGeBlr9\", \"C)tude\" },\n  { \"$sm3$rounds=1000$saltstring\", \"$sm3$rounds=1000$saltstring$g7VN4eGDLfJHMWxah.mlw.vBaxt42LJ7ajZsnOqH6p4\", \"Chl\\xc3\\xb6\"\"e\" },\n  { \"$sm3$rounds=1000$short\", \"$sm3$rounds=1000$short$oTwpW4ct8VT8hrO5CdOhhH9nCJNVf8t7pzFZ3ifT/CC\", \"Chl\\xc3\\xb6\"\"e\" },\n  { \"$sm3$rounds=5000$saltstring\", \"$sm3$rounds=5000$saltstring$vfJUIyCBz0TumrRQo5ZiYD2FfzVrVJ8EYrUxLHVi6n8\", \"Chl\\xc3\\xb6\"\"e\" },\n  { \"$sm3$rounds=5000$short\", \"$sm3$rounds=5000$short$IiLivkLUbmaE2qe6ZcVOqY9.6Sgd0eHEV5qny6PAjHC\", \"Chl\\xc3\\xb6\"\"e\" },\n  { \"$sm3$rounds=1000$saltstring\", \"$sm3$rounds=1000$saltstring$dfGe19y7IU2K8qJYWCCfJ1ilzXvkEw9m1vG/98VrmW7\", \"ChlC6e\" },\n  { \"$sm3$rounds=1000$short\", \"$sm3$rounds=1000$short$vAeLPzOys4yvNMmBG983zhdgYVbhX2CH0ACsM0Ir5KB\", \"ChlC6e\" },\n  { \"$sm3$rounds=5000$saltstring\", \"$sm3$rounds=5000$saltstring$5Nk62M75Yzx.x1QCROF1Cs8k4M4lsujK6NUpsfCKPP3\", \"ChlC6e\" },\n  { \"$sm3$rounds=5000$short\", \"$sm3$rounds=5000$short$BTN0wDwMLkj6nYLN4rpGnfyVAel8cGpS.tazNGdMt3/\", \"ChlC6e\" },\n  { \"$sm3$rounds=1000$saltstring\", \"$sm3$rounds=1000$saltstring$qZ.aufR92q59TpKyCZyrkqEJI6DE6XU3l0HLXTsns5C\", \"\\xc3\\x85ngstr\\xc3\\xb6m\" },\n  { \"$sm3$rounds=1000$short\", \"$sm3$rounds=1000$short$XDd9nXiAN2RU7bgrzEFrW1bVoeqvhehVlfB5fwtS0DA\", \"\\xc3\\x85ngstr\\xc3\\xb6m\" },\n  { \"$sm3$rounds=5000$saltstring\", \"$sm3$rounds=5000$saltstring$POqI985fRfZBF1exbe.Bips1aPXmvX5sQzWEpCc0Y0D\", \"\\xc3\\x85ngstr\\xc3\\xb6m\" },\n  { \"$sm3$rounds=5000$short\", \"$sm3$rounds=5000$short$aNkolPAy51qGOJrfiudBfHralwHyxGBRHQnpd7/zEo7\", \"\\xc3\\x85ngstr\\xc3\\xb6m\" },\n  { \"$sm3$rounds=1000$saltstring\", \"$sm3$rounds=1000$saltstring$2dKNRRHnLbPCi24SKdPjC0PzbjHfs7SDQtNxCalQqN0\", \"C\\x05ngstrC6m\" },\n  { \"$sm3$rounds=1000$short\", \"$sm3$rounds=1000$short$esWj6taRGsOWBYAKqJH4zQW6BTahcbv4MMG2YtYRUn6\", \"C\\x05ngstrC6m\" },\n  { \"$sm3$rounds=5000$saltstring\", \"$sm3$rounds=5000$saltstring$Yf1bfyz.IbGLtYZzBiWAu32287l0XLSJLpF03lH.I/D\", \"C\\x05ngstrC6m\" },\n  { \"$sm3$rounds=5000$short\", \"$sm3$rounds=5000$short$QIhH0l6gfS4LHUIiMlE.Kjneuv/iVxZZJIoTLO5jhP9\", \"C\\x05ngstrC6m\" },\n  { \"$sm3$rounds=1000$saltstring\", \"$sm3$rounds=1000$saltstring$yki9u1ADIgZnsfPat6zxs5pe1jSJrNQ8bFfDUsD4KY9\", \"C\\x05ngstrCU*U***U*\" },\n  { \"$sm3$rounds=1000$short\", \"$sm3$rounds=1000$short$3Gb.ohhevoNHXiXqYKs56liWBEdTUyZuDnwUAEz0BvB\", \"C\\x05ngstrCU*U***U*\" },\n  { \"$sm3$rounds=5000$saltstring\", \"$sm3$rounds=5000$saltstring$pQuebOxfI1RL8zXNX.k20UF2xKvQSb3KZdmoh.bqk1C\", \"C\\x05ngstrCU*U***U*\" },\n  { \"$sm3$rounds=5000$short\", \"$sm3$rounds=5000$short$bQsT0TqgXR7R91mEUfIs8BZtR07qS3kos9D2Gi1vde1\", \"C\\x05ngstrCU*U***U*\" },\n  { \"$sm3$rounds=1000$saltstring\", \"$sm3$rounds=1000$saltstring$uxWb8p2E9EIevWh0QlYyUzTXYumWuNRzC/zv0U0itb7\", \"U*U***U*ignored\" },\n  { \"$sm3$rounds=1000$short\", \"$sm3$rounds=1000$short$LiPBfbT3vuZoo2RGj478NobNqMiOU.btR.3Z5WxhQ/9\", \"U*U***U*ignored\" },\n  { \"$sm3$rounds=5000$saltstring\", \"$sm3$rounds=5000$saltstring$mZo2OWmexe4iPNcHnl/xWin1C/B0UvfSxghOl4jMkf2\", \"U*U***U*ignored\" },\n  { \"$sm3$rounds=5000$short\", \"$sm3$rounds=5000$short$eqEgDtav1GjFSU8HarH8BeQvi6QnYhxlqA4dBNLrxRB\", \"U*U***U*ignored\" },\n  { \"$sm3$rounds=1000$saltstring\", \"$sm3$rounds=1000$saltstring$CWKgdzzvXINOu7FyuScWgSehKteRBj4ZIJ6a9y14Q.A\", \"U*U*U*U*\" },\n  { \"$sm3$rounds=1000$short\", \"$sm3$rounds=1000$short$sxwi.gem2FV.cAzGukNfO/skVQDNbyON4uakXRxSq31\", \"U*U*U*U*\" },\n  { \"$sm3$rounds=5000$saltstring\", \"$sm3$rounds=5000$saltstring$6CuiX1WtwOj1GQE3ztY24bSz4.nJfpbJHBZR5rrysE/\", \"U*U*U*U*\" },\n  { \"$sm3$rounds=5000$short\", \"$sm3$rounds=5000$short$zTv/7GsE.114IpbG0TMJdzViJJmTBacnMcR2ORHLblC\", \"U*U*U*U*\" },\n  { \"$sm3$rounds=1000$saltstring\", \"$sm3$rounds=1000$saltstring$mptGIXs6YXZrX6U1BZaQZw1ZGawz/JcQlv9GT759/T0\", \"U*U*U*U*ignored\" },\n  { \"$sm3$rounds=1000$short\", \"$sm3$rounds=1000$short$04LuGv/hvv.2/358dG6cBsQp6bO8pLmGqIkVs.e8kO1\", \"U*U*U*U*ignored\" },\n  { \"$sm3$rounds=5000$saltstring\", \"$sm3$rounds=5000$saltstring$NIWB7f5tOCQI.cA6E.Ipv.RC4JW7z0U1sFy7oIgftAB\", \"U*U*U*U*ignored\" },\n  { \"$sm3$rounds=5000$short\", \"$sm3$rounds=5000$short$DlQ.1QPVTW2r3xt7WTQoPkYRlqBJKz0kkKUgnenKcd2\", \"U*U*U*U*ignored\" },\n  { \"$sm3$rounds=1000$saltstring\", \"$sm3$rounds=1000$saltstring$sodhQYgXM5uv87RbLeojt1KIcDBvqqUexBqm/D8LsNB\", \"*U*U*U*U\" },\n  { \"$sm3$rounds=1000$short\", \"$sm3$rounds=1000$short$6yRZiRc7CmZ06AB/4WxXx7PiyYKcNcjKr.gMLoHf3.6\", \"*U*U*U*U\" },\n  { \"$sm3$rounds=5000$saltstring\", \"$sm3$rounds=5000$saltstring$hM.3OAWJnsUpneaLT4Pr0UZtmE8CF3WNELMWsW5gN5A\", \"*U*U*U*U\" },\n  { \"$sm3$rounds=5000$short\", \"$sm3$rounds=5000$short$8e1KHuoQAUGgsmyIwDlLX0epF9GSg2.n7zfkwrJJ7M9\", \"*U*U*U*U\" },\n  { \"$sm3$rounds=1000$saltstring\", \"$sm3$rounds=1000$saltstring$zRqDCuRKAh5IJgGuj5NKHPNgBIwBxt8Ba850jlQtTf9\", \"*U*U*U*U*\" },\n  { \"$sm3$rounds=1000$short\", \"$sm3$rounds=1000$short$154rGtfeDV38jMbl02Sv/nfDCo2VjW/JxQRZkbnBv8A\", \"*U*U*U*U*\" },\n  { \"$sm3$rounds=5000$saltstring\", \"$sm3$rounds=5000$saltstring$up2bu8DjvhIwbuSGXA38uUJIDFk/5cuXBZQzB6P/Lk3\", \"*U*U*U*U*\" },\n  { \"$sm3$rounds=5000$short\", \"$sm3$rounds=5000$short$IsMsxVJrwQ9nCHbwKYhsNHQY0qDkVmbdLM2OviR61w/\", \"*U*U*U*U*\" },\n  { \"$sm3$rounds=1000$saltstring\", \"$sm3$rounds=1000$saltstring$k3dFp7/Ayj/TWDNWJiyMJTCCyfAGhD5VTNMMibim8yC\", \"*U*U*U*U*U*U*U*U\" },\n  { \"$sm3$rounds=1000$short\", \"$sm3$rounds=1000$short$5n3C52cgbhzxpqS8WDBcwTx8grFGxbtxLNPdUGEQcE2\", \"*U*U*U*U*U*U*U*U\" },\n  { \"$sm3$rounds=5000$saltstring\", \"$sm3$rounds=5000$saltstring$RSCAF9dDWvYidRQ.TuM97SiWE/eeOFxEaPosbruJaQ1\", \"*U*U*U*U*U*U*U*U\" },\n  { \"$sm3$rounds=5000$short\", \"$sm3$rounds=5000$short$3A7pimvxSBj.yVkrinakd0iq1LHqpcHKVzuKnDfW2gB\", \"*U*U*U*U*U*U*U*U\" },\n  { \"$sm3$rounds=1000$saltstring\", \"$sm3$rounds=1000$saltstring$WJVlgoPpUiRngzMyRW84qrfKTIiUhtOjDkFPKOesc27\", \"*U*U*U*U*U*U*U*U*\" },\n  { \"$sm3$rounds=1000$short\", \"$sm3$rounds=1000$short$6BJR/TAUf/WrA.mVRBafKccfX4CnqvKZAWgdVeLUdu4\", \"*U*U*U*U*U*U*U*U*\" },\n  { \"$sm3$rounds=5000$saltstring\", \"$sm3$rounds=5000$saltstring$TBN/HcqjW6kYqtl5Hv/F4Y/KX0Rcv8CKrKvpZ0xeyk0\", \"*U*U*U*U*U*U*U*U*\" },\n  { \"$sm3$rounds=5000$short\", \"$sm3$rounds=5000$short$.pnAxWGkq21pbyDsPa.85wTmcIM1izrMTvktrnWxWA4\", \"*U*U*U*U*U*U*U*U*\" },\n  { \"$sm3$rounds=1000$saltstring\", \"$sm3$rounds=1000$saltstring$p4wA9dSMVpCgy8SsjcMMZ3BMCzA4HDLynoCwLdP0lP0\", \"\\xa3\" },\n  { \"$sm3$rounds=1000$short\", \"$sm3$rounds=1000$short$iL7iOoXcKINoapC.16H/91vNKQI48TCRX0C5Y3QHz5A\", \"\\xa3\" },\n  { \"$sm3$rounds=5000$saltstring\", \"$sm3$rounds=5000$saltstring$YhrI4mEX7dj.e317mVqg9g.w048D6chil2wtEIWtfdD\", \"\\xa3\" },\n  { \"$sm3$rounds=5000$short\", \"$sm3$rounds=5000$short$4c228.rgY0vBrXV/sYCqPd8.2aR477Ax828HjSZsdRD\", \"\\xa3\" },\n  { \"$sm3$rounds=1000$saltstring\", \"$sm3$rounds=1000$saltstring$s1XIbDy3XUuLwjC7/nZBafvsCzgHzP7s7BfOtJRqA/6\", \"\\xa3\"\"a\" },\n  { \"$sm3$rounds=1000$short\", \"$sm3$rounds=1000$short$xEYiJNE8HqocOmXep1vM/TP7ouZB.M.fj98wHmLB6BB\", \"\\xa3\"\"a\" },\n  { \"$sm3$rounds=5000$saltstring\", \"$sm3$rounds=5000$saltstring$K2HdSa/5QObAoZqb3S2vAxC.UuBlBGJBv91LKutYB8B\", \"\\xa3\"\"a\" },\n  { \"$sm3$rounds=5000$short\", \"$sm3$rounds=5000$short$r.y93S3vqSBqE9sMGVA2Q.CsfQp9TD/TNSETILtc1/A\", \"\\xa3\"\"a\" },\n  { \"$sm3$rounds=1000$saltstring\", \"$sm3$rounds=1000$saltstring$2wl3x3cTlQr1njn1mCSPTK8XWhQq3TOQWrVnTW7gniC\", \"\\xd1\\x91\" },\n  { \"$sm3$rounds=1000$short\", \"$sm3$rounds=1000$short$yCYFweHyHiTTOnmsJmlySYKuQxhDWuoj6oUM3SXKRJ.\", \"\\xd1\\x91\" },\n  { \"$sm3$rounds=5000$saltstring\", \"$sm3$rounds=5000$saltstring$ylyh7bDLIvuCSsrVlbULqvim.gYyRBbeLgVxSs2hT1B\", \"\\xd1\\x91\" },\n  { \"$sm3$rounds=5000$short\", \"$sm3$rounds=5000$short$xiSWfCR4NKYDRCuznfM4nl3VE8kTjRaZHoMbw9JmEF/\", \"\\xd1\\x91\" },\n  { \"$sm3$rounds=1000$saltstring\", \"$sm3$rounds=1000$saltstring$Pclkzl5B.pvlQY9Jn8jf2ZMutEA3SYZ63LMGulcsw81\", \"\\xa3\"\"ab\" },\n  { \"$sm3$rounds=1000$short\", \"$sm3$rounds=1000$short$d90R4yO02ebyY..oOa0ERhXJyRKcEyR0iqhyfgzRDM3\", \"\\xa3\"\"ab\" },\n  { \"$sm3$rounds=5000$saltstring\", \"$sm3$rounds=5000$saltstring$k89zyHcpSe5LUbxolcCS4LCOwyn/s98BI7Gzs1mUkU8\", \"\\xa3\"\"ab\" },\n  { \"$sm3$rounds=5000$short\", \"$sm3$rounds=5000$short$jq.SxQhWGw88YUuyBn6Sk99mU7DdogDYrxPncymzR60\", \"\\xa3\"\"ab\" },\n  { \"$sm3$rounds=1000$saltstring\", \"$sm3$rounds=1000$saltstring$iqupg7bxbFLJaRvnaU1QpcqN9C4emrG028Y5dXF79G5\", \"\\xff\\xff\\xa3\" },\n  { \"$sm3$rounds=1000$short\", \"$sm3$rounds=1000$short$IoU8JDt2zoHYjvt3Qi1SQ4QVFWNEjSqAU8kb1prsWPC\", \"\\xff\\xff\\xa3\" },\n  { \"$sm3$rounds=5000$saltstring\", \"$sm3$rounds=5000$saltstring$5HNA08VC5DtYdXDDW0N/TnWB/4UVFEIEaXiTv/HB7f1\", \"\\xff\\xff\\xa3\" },\n  { \"$sm3$rounds=5000$short\", \"$sm3$rounds=5000$short$rHdbmQn9Sl4QCXgq/1WrL4odQrwTHB/CUfdnUCtDQG9\", \"\\xff\\xff\\xa3\" },\n  { \"$sm3$rounds=1000$saltstring\", \"$sm3$rounds=1000$saltstring$lrdwMw6.Oj5x/YDFs99emPTYwxlUcEKixin8Ajv/vF5\", \"1\\xa3\"\"345\" },\n  { \"$sm3$rounds=1000$short\", \"$sm3$rounds=1000$short$Kk7/1v.5tDssBFg7GOHMB7gsmEasYxj9Btfa590cV22\", \"1\\xa3\"\"345\" },\n  { \"$sm3$rounds=5000$saltstring\", \"$sm3$rounds=5000$saltstring$LiNtJvS6RI2YY14QNkkMt1BjSoANheB1rLaPp/edJP/\", \"1\\xa3\"\"345\" },\n  { \"$sm3$rounds=5000$short\", \"$sm3$rounds=5000$short$tHrFViXPbqYAL/fhak4wAz.ryg59mUAPlrI6raR1bdA\", \"1\\xa3\"\"345\" },\n  { \"$sm3$rounds=1000$saltstring\", \"$sm3$rounds=1000$saltstring$HwXXJ8rEhvBIjlGKO/o.uIorp0Zh8SPCg21H.t/Akv7\", \"\\xff\\xa3\"\"345\" },\n  { \"$sm3$rounds=1000$short\", \"$sm3$rounds=1000$short$SukeoARm8wGlkmUOjJZ9aWpD6b76xYoEsJXxubXowU2\", \"\\xff\\xa3\"\"345\" },\n  { \"$sm3$rounds=5000$saltstring\", \"$sm3$rounds=5000$saltstring$F9bYz0My0dUbtFyWbQ1wTPdnC7snkdekogVVMa/fP5.\", \"\\xff\\xa3\"\"345\" },\n  { \"$sm3$rounds=5000$short\", \"$sm3$rounds=5000$short$9exqorR1VFRtNsk2UoedwcWF42KBF/WV4ZQlok1idQ6\", \"\\xff\\xa3\"\"345\" },\n  { \"$sm3$rounds=1000$saltstring\", \"$sm3$rounds=1000$saltstring$oimJbqeMdws5mKcOVR6mKuUhwoXXHGZes2uEbvMEVh5\", \"\\xff\\xa3\"\"34\\xff\\xff\\xff\\xa3\"\"345\" },\n  { \"$sm3$rounds=1000$short\", \"$sm3$rounds=1000$short$O0hbPALHTrkRvEy2YLfsusffWOgw9KCRZ35lIwzBOw/\", \"\\xff\\xa3\"\"34\\xff\\xff\\xff\\xa3\"\"345\" },\n  { \"$sm3$rounds=5000$saltstring\", \"$sm3$rounds=5000$saltstring$Ncf3nAk7XJ6tnhZ7T0kOk0VmbJqDNYYWjJFViE3z9/4\", \"\\xff\\xa3\"\"34\\xff\\xff\\xff\\xa3\"\"345\" },\n  { \"$sm3$rounds=5000$short\", \"$sm3$rounds=5000$short$03JbbcLkNvmiTo32nJEkfFsDozcXpBscnwrjN5IGFZ.\", \"\\xff\\xa3\"\"34\\xff\\xff\\xff\\xa3\"\"345\" },\n  { \"$sm3$rounds=1000$saltstring\", \"$sm3$rounds=1000$saltstring$QJ51gEgjm2aHVjuarsCUjgf1dwB6MXk6mGyYMQsAqg.\", \"U\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xff\" },\n  { \"$sm3$rounds=1000$short\", \"$sm3$rounds=1000$short$jt4jKr1UW4KOSAqQO6welW6OzFdIdyI/7bCxNHovJ8C\", \"U\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xff\" },\n  { \"$sm3$rounds=5000$saltstring\", \"$sm3$rounds=5000$saltstring$g7ZH2A7haq9rUKI2ti3vBr8yK9gk8TSJ2cuAxfr4U07\", \"U\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xff\" },\n  { \"$sm3$rounds=5000$short\", \"$sm3$rounds=5000$short$oXjTkK6s8Fu3xkG/oejXOK/hnAN2ZGOF/rv6pDE4oG1\", \"U\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xff\" },\n  { \"$sm3$rounds=1000$saltstring\", \"$sm3$rounds=1000$saltstring$TA3Teg6WZ.uK7AuKTMIAwSIdpCztyWlh89LMzjN2xTD\", \"\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\" },\n  { \"$sm3$rounds=1000$short\", \"$sm3$rounds=1000$short$qff5XdvTAUMP24n5eI8.n2FsEhImceo.mVGhIT0OU.6\", \"\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\" },\n  { \"$sm3$rounds=5000$saltstring\", \"$sm3$rounds=5000$saltstring$e4tvO9ljtjgeUstCxTIrtbUAUKR9wAxfgs0MMf1WIb3\", \"\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\" },\n  { \"$sm3$rounds=5000$short\", \"$sm3$rounds=5000$short$IdsEdCjCB.UY.518v2xNpPZAX9/ZgfhdUEBWBNS/gkC\", \"\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\" },\n  { \"$sm3$rounds=1000$saltstring\", \"$sm3$rounds=1000$saltstring$jmNpRUqvFuuujRC04KafxgGKNXlMDihpcL53rhAOQE6\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\" },\n  { \"$sm3$rounds=1000$short\", \"$sm3$rounds=1000$short$krUh4blLghyzjKZS6Z.bTKgtAmNmgBfVB1Vba0n4Mw8\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\" },\n  { \"$sm3$rounds=5000$saltstring\", \"$sm3$rounds=5000$saltstring$Ecn3a8M02DQsMJwM6CQnSQey42OwAJP.wqE9S/aYG.5\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\" },\n  { \"$sm3$rounds=5000$short\", \"$sm3$rounds=5000$short$FRljXSTGQ6wYCHg1ySOIXzriIFG3pjz4A0zkO4eGeO8\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\" },\n  { \"$sm3$rounds=1000$saltstring\", \"$sm3$rounds=1000$saltstring$64auiZLkLxSrfVQ1g8aRcHWGUX1mg8PIl8otpcZMM06\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789chars after 72 are ignored\" },\n  { \"$sm3$rounds=1000$short\", \"$sm3$rounds=1000$short$fX/bO8RXJoICvyG.B8SSDiHCOv/RgUsoEPeGXuts5mB\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789chars after 72 are ignored\" },\n  { \"$sm3$rounds=5000$saltstring\", \"$sm3$rounds=5000$saltstring$XgHR/ST4xUshi9DmBVLVNv1bKsB1Laq1LVQJIN40KO8\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789chars after 72 are ignored\" },\n  { \"$sm3$rounds=5000$short\", \"$sm3$rounds=5000$short$DpLN8ms7OTxY21AXBTxuEDxehhAwhrYPPEl4S/Sw/k1\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789chars after 72 are ignored\" },\n  { \"$sm3$rounds=1000$saltstring\", \"$sm3$rounds=1000$saltstring$U1CB2ppd1uqzgJceMKBwpmVM4EaEspYo9a34QjCj5W2\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\" },\n  { \"$sm3$rounds=1000$short\", \"$sm3$rounds=1000$short$qqCQmfDh7RnBdGX.kMWcGL7jNZsePB77qkSVXa0CF17\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\" },\n  { \"$sm3$rounds=5000$saltstring\", \"$sm3$rounds=5000$saltstring$l.ZWCZzt/KDvW/a9FZ43oxSO65hnvctSnH7n0ygghl1\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\" },\n  { \"$sm3$rounds=5000$short\", \"$sm3$rounds=5000$short$5cQrS5c7E4w/AbGecOwB/cUGjRPQe0zfVpzkZABbDX7\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\" },\n  { \"$sm3$rounds=1000$saltstring\", \"$sm3$rounds=1000$saltstring$JMwMZydqHG64EVV6eVII6RAik1WyuXl1H2n298BXrH0\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\"\"chars after 72 are ignored as usual\" },\n  { \"$sm3$rounds=1000$short\", \"$sm3$rounds=1000$short$iO0em06EO3srjRcqS/AA18yna8P9CEKENebHo8HUi4C\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\"\"chars after 72 are ignored as usual\" },\n  { \"$sm3$rounds=5000$saltstring\", \"$sm3$rounds=5000$saltstring$5kFTvPbIb1qWj072nOsZ7PNhyQDhspd.CplRn7U1v1D\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\"\"chars after 72 are ignored as usual\" },\n  { \"$sm3$rounds=5000$short\", \"$sm3$rounds=5000$short$QrLERZbdJXMx1vm6qQx6G6U1fetwVv/0G4Hfhzm1tl0\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\"\"chars after 72 are ignored as usual\" },\n  { \"$sm3$rounds=1000$saltstring\", \"$sm3$rounds=1000$saltstring$grLfsJRKyft/TIBZSRK4sd0sSdqTC2ULqmInAJlAVx0\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has forgotten.\" },\n  { \"$sm3$rounds=1000$short\", \"$sm3$rounds=1000$short$Sz5MjikaOXePAN37FBpkNudmGy5aCj1.bIPXMBGt.49\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has forgotten.\" },\n  { \"$sm3$rounds=5000$saltstring\", \"$sm3$rounds=5000$saltstring$Mauhc2OUEVflNQwLhigUeZfSZuxoHuF3JyVUVOPUn63\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has forgotten.\" },\n  { \"$sm3$rounds=5000$short\", \"$sm3$rounds=5000$short$Q35JDXMX70cuxM/Q9HXhVXHwt0atD73GHTmLi3do588\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has forgotten.\" },\n  { \"$sm3$rounds=1000$saltstring\", \"$sm3$rounds=1000$saltstring$SlETijLqYQk6z4ked1kzp/IKvvw7caX7jsDTrWfUkg9\", \"THE YEAR\" },\n  { \"$sm3$rounds=1000$short\", \"$sm3$rounds=1000$short$fqSDVO/JdpQqciZks6eb007ke8dbYxt3OPpMlcoE6M9\", \"THE YEAR\" },\n  { \"$sm3$rounds=5000$saltstring\", \"$sm3$rounds=5000$saltstring$Ngbb.7tnFl7mrfVWvdGNXLEoRXxrBSjkGVqWYXHLwS2\", \"THE YEAR\" },\n  { \"$sm3$rounds=5000$short\", \"$sm3$rounds=5000$short$mbennzyTb/5JoOQMiJ70gG58rQmN93E16kZXx9/pBX/\", \"THE YEAR\" },\n  { \"$sm3$rounds=1000$saltstring\", \"$sm3$rounds=1000$saltstring$VR3tsd3dYK4W7wKt.JPOvIsLuFyU9D4qfX.wz3XKOBD\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and do\" },\n  { \"$sm3$rounds=1000$short\", \"$sm3$rounds=1000$short$WYG.mkN1Edu1bB3sPH59eTCJJcyLUvdC68KRvjCJ3YB\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and do\" },\n  { \"$sm3$rounds=5000$saltstring\", \"$sm3$rounds=5000$saltstring$2HUfCEytJ9jLNw3FwzH/hsWdEYldzoCVmjioGG2UA85\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and do\" },\n  { \"$sm3$rounds=5000$short\", \"$sm3$rounds=5000$short$.7mnyO7YSmWtn9P8KqfBi4MjktgyFWS4Gum640PPsZ8\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and do\" },\n  { \"$sm3$rounds=1000$saltstring\", \"$sm3$rounds=1000$saltstring$Dprot0iG6OCniUDv9gKPN00qDvRJ/j/oKenbdLasiH5\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has f\" },\n  { \"$sm3$rounds=1000$short\", \"$sm3$rounds=1000$short$4NJ3XuMAgEyOaO89mQwx8Zjn0lD50ed36.hlzbWppKC\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has f\" },\n  { \"$sm3$rounds=5000$saltstring\", \"$sm3$rounds=5000$saltstring$O78Q6GPpi6Lb3A6C9MksIrreHNG6RZ/cQrt6thummE5\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has f\" },\n  { \"$sm3$rounds=5000$short\", \"$sm3$rounds=5000$short$4r1RgwZCB.EQL/MJnaw0hxGdvJ0aFp3Wg0FJf7bs6O8\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has f\" },\n#endif // sm3crypt\n\n#if INCLUDE_sm3_yescrypt && defined TEST_sm3_yescrypt\n  { \"$sm3y$j75$.......\", \"$sm3y$j75$.......$jLlybI3.a4oUf75jlH1cAu3iZ25uTH7pMKjmVkEoO53\", \"\" },\n  { \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.$kdJs7YYSxwI3HVtd9/kSgfz3NlXfMCMXy388H5VEnx9\", \"\" },\n  { \"$sm3y$j85$.......\", \"$sm3y$j85$.......$uhXpa0SueOn6bHISmg/NqaSlnLi6X8J.BAhuGbglIN.\", \"\" },\n  { \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.$SSYCKhmjBZNUoJjsTiZ1VABmfTPhK6Oyn/hXa28noO1\", \"\" },\n  { \"$sm3y$j75$.......\", \"$sm3y$j75$.......$.c6X1EvaZx0mgCl5oqsE1HDp3BnzTPSKGUbfgDchQxC\", \" \" },\n  { \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.$5.SnkPGwZKuso4PZEE/3BhF1t1ydAvREolfxqTHdUP0\", \" \" },\n  { \"$sm3y$j85$.......\", \"$sm3y$j85$.......$DknrdPf/FJ9x9929mIabJU.kGWUaWFiy9cM3nLh2TK6\", \" \" },\n  { \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.$Os7dzGeH8dHFWRcqlRC58M2deR/bJmJR9/VtDPeyIzD\", \" \" },\n  { \"$sm3y$j75$.......\", \"$sm3y$j75$.......$7g00F3CMuQHic3UfpjBpkCSThg3x3orBTkxTEiYE5w0\", \"a\" },\n  { \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.$Bhmrgu6Ijdxc7zW5/YXKy0V7XQyz8Lss6T3XwA15sU5\", \"a\" },\n  { \"$sm3y$j85$.......\", \"$sm3y$j85$.......$mDAgxdokxVmmHY4izNqif74VtpLBO3xUjMQmmATGWy1\", \"a\" },\n  { \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.$Sgkp3thH0HT6S0NqIlu4rch5blOcdEYnXlVBC01SUP6\", \"a\" },\n  { \"$sm3y$j75$.......\", \"$sm3y$j75$.......$MKqfwnVesnb48IAZb4nCl32Te3v6FEbr/ZqkhW0j0GC\", \"ab\" },\n  { \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.$3njRzLMJCMFr9obSumTxlpwLWlVyVSaTUrFq0F7hwX8\", \"ab\" },\n  { \"$sm3y$j85$.......\", \"$sm3y$j85$.......$Cdp.AsRB8sGGCplmkWCUEgNTx8BwY7/KFUjF8d7UuA3\", \"ab\" },\n  { \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.$KFODRPgy.RJZ9z8By7e3vCjfKT0hi5.W289KMfeJ45A\", \"ab\" },\n  { \"$sm3y$j75$.......\", \"$sm3y$j75$.......$duiiYQVhOT63KI.mAoLYbyaDvBu8kRypgtoCouFp3r8\", \"abc\" },\n  { \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.$dJnvLFkU0bHXFSHLrkYYdLR0izAunY2NZr0VAgViWq1\", \"abc\" },\n  { \"$sm3y$j85$.......\", \"$sm3y$j85$.......$VjytKeSlu8YK5ZNfFhNKW3krKa04ZZddIXpPDfukSq7\", \"abc\" },\n  { \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.$/1QcmBswh5O4QFCpwsUl5pR0ZMIuNyhL.nzsF8LV2q/\", \"abc\" },\n  { \"$sm3y$j75$.......\", \"$sm3y$j75$.......$N1CaZtLLeIViR/6TG3aFcvbbSIbyNiPphX2aNLf4haD\", \"U*U\" },\n  { \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.$MzejmjV8pdzmwtcsFDeUDMIFwBWIi.5MyM5xa72VzHD\", \"U*U\" },\n  { \"$sm3y$j85$.......\", \"$sm3y$j85$.......$tnU876ka7Pv.R2gydF6xdBA/5ZXHPOfNDFuBICYZvB1\", \"U*U\" },\n  { \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.$unXTppdIcfxCowfz0tPdlE4xM0PCImrP3of01F4Mk15\", \"U*U\" },\n  { \"$sm3y$j75$.......\", \"$sm3y$j75$.......$NFXX1CfvGYhsjYJkdjS8xD4nnt98W.F6wxzDwxnsuh/\", \"U*U*\" },\n  { \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.$zV42Naw8otXZ.Xy8z4ywC9Ez1m19ZV2yqpYivy7gTO6\", \"U*U*\" },\n  { \"$sm3y$j85$.......\", \"$sm3y$j85$.......$JSCIPhasfNUf2pLWvLl1lTBAqfJjhAY/hqw8C2ZRRA1\", \"U*U*\" },\n  { \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.$wQAsuCArN4wwGGc4ArVynvS6LCwnM04Bpk0VT/4pFj/\", \"U*U*\" },\n  { \"$sm3y$j75$.......\", \"$sm3y$j75$.......$aUUUnHAi2dZaYFb3dOcHlMh4AmCN92chCvxk5UZPR59\", \"U*U*U\" },\n  { \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.$TGo.aQYEGUIpinY7pEoZ3gu.uyXKc8L88nBRWT/aaH1\", \"U*U*U\" },\n  { \"$sm3y$j85$.......\", \"$sm3y$j85$.......$p.bCL3SHzOPkk4KRULHeZxNp9Ue6a7cZICgGndJ6HGB\", \"U*U*U\" },\n  { \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.$H8/TF5G4IkO.O1NHWps/KzfZFLRcJjfz4/oQrwjQEs5\", \"U*U*U\" },\n  { \"$sm3y$j75$.......\", \"$sm3y$j75$.......$ODsdOrYVByj8Tic9QQHQ4z0ZJzTyO59qa5XcGcIylv7\", \".....\" },\n  { \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.$BuXD8ccdGd2ovdeSVdrp6pmdx4D8cwwYRBPOJbAwLn8\", \".....\" },\n  { \"$sm3y$j85$.......\", \"$sm3y$j85$.......$k0iAMcPlGz4s7hRsoxfWGoyigXVoCgq4fkl8M/UyU80\", \".....\" },\n  { \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.$xu3OXdk6fdduRyW03wmY1HASHZ8NFOBpvt6dpHZZP99\", \".....\" },\n  { \"$sm3y$j75$.......\", \"$sm3y$j75$.......$n7nhaXDXPRZgDA6D1HvSQT0i0zAbdojGztD2YyY0/S2\", \"dragon\" },\n  { \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.$QwOgiihx2RKmOLEm0kOyqOSRE2crSe85YI2lbbgBDm7\", \"dragon\" },\n  { \"$sm3y$j85$.......\", \"$sm3y$j85$.......$GyOizGgwabSKQPbmlAL9cu/EO2zRKgwsb3bu/BqbjeB\", \"dragon\" },\n  { \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.$APoVSzt7GwevS8bWf0k/Hvr.8qvJdYEGE3T9Vbmbbf1\", \"dragon\" },\n  { \"$sm3y$j75$.......\", \"$sm3y$j75$.......$9Evw3xTqL7937bmisDV0n1xFif7wdBktFEVtXFqGFGB\", \"dRaGoN\" },\n  { \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.$TVUsdgVdVcIQT1obPO3TYxuVx8co4MNGjG1MIV.AMF0\", \"dRaGoN\" },\n  { \"$sm3y$j85$.......\", \"$sm3y$j85$.......$7dKVzz7GXwuaTA/PGDPHnfQSCYXC4jaAgQ5Tkg9jMR7\", \"dRaGoN\" },\n  { \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.$cx.GdLWzo5NldVMYXgKXOFXwQtBH.g2BgtwNM5qKUIB\", \"dRaGoN\" },\n  { \"$sm3y$j75$.......\", \"$sm3y$j75$.......$dtRD0LFz0j7j4uD2dUfRw.SzdzxlT3S78c6VZh0Xzm4\", \"DrAgOn\" },\n  { \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.$Z5ZiB1XPsVGDkJ.3xBD/.lw1xMC9bwDZgkLZ382BJYA\", \"DrAgOn\" },\n  { \"$sm3y$j85$.......\", \"$sm3y$j85$.......$mAe3CdvvUbhRAn6Co3a048JSr52WhBR35lbCEQ6urq5\", \"DrAgOn\" },\n  { \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.$o7HRnupxyF7F9mqSrjOUsnry5xP61T8BZWOh1gj5U..\", \"DrAgOn\" },\n  { \"$sm3y$j75$.......\", \"$sm3y$j75$.......$l6Llo0Yg8DjNHSFp36AfkqJSkzf3mhtx/TRz1rjYLU.\", \"PAROLX\" },\n  { \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.$pD9ukbmxQVkugtT0etgXQceBujs8id5wYOFAUkA57L2\", \"PAROLX\" },\n  { \"$sm3y$j85$.......\", \"$sm3y$j85$.......$S4YsiFtOO80DiqW1DEpOSndijKO0wBF/MWAqGI1kxU1\", \"PAROLX\" },\n  { \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.$lGHflsH0KzhW7iSbtgtF3.tfEFBqpWfseZx9cSSVFgC\", \"PAROLX\" },\n  { \"$sm3y$j75$.......\", \"$sm3y$j75$.......$.zYyWvixCaRsw8OrE2z3n3QKSXJsHIkVFhGCqL75aA1\", \"U*U***U\" },\n  { \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.$027IYCiKaLSsO5bo7gTqkHyGuJLOtfo/mt4jqDymYs0\", \"U*U***U\" },\n  { \"$sm3y$j85$.......\", \"$sm3y$j85$.......$IcHXm.1lii.5704lIHomUVZfpA2EqnJuxJ3liV1TTJB\", \"U*U***U\" },\n  { \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.$fGc5WA8hZjYI2.4AwUfSUFY.ZTsbw3t1MFwcytvkft.\", \"U*U***U\" },\n  { \"$sm3y$j75$.......\", \"$sm3y$j75$.......$1H4EijHWcLYyJ8t8OtLK2Iy4oiPEp/O4NgvejWFtD05\", \"abcdefg\" },\n  { \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.$OC1A9KmjvCUIOvtEl56s2RvYIAkBKG.N5uHXIo7PeF/\", \"abcdefg\" },\n  { \"$sm3y$j85$.......\", \"$sm3y$j85$.......$GW43MQqtmI.Gmv06EDBvln4c4jW1OqGxRmPzPLLrhND\", \"abcdefg\" },\n  { \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.$swX6fdQdbtQ3cF2piJr/xEuyFmhdF2w9m/1dlJ0AKRD\", \"abcdefg\" },\n  { \"$sm3y$j75$.......\", \"$sm3y$j75$.......$oNnrAHuqT/wD.LOa1J7hDghs4lMRef5UBmKYPnTm6a9\", \"01234567\" },\n  { \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.$WrxrrAHUoA.deGhFLFIWVGENWEpPMGbGRRyto9Gcf9A\", \"01234567\" },\n  { \"$sm3y$j85$.......\", \"$sm3y$j85$.......$w4YvlEYOvFMIjqT/RfnHqtJH3Id.eDImwuXiQJdtsxB\", \"01234567\" },\n  { \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.$T3w8/KfzW8jn1kGFcKmdVBCTc8hgISmC/yerAeXHj.B\", \"01234567\" },\n  { \"$sm3y$j75$.......\", \"$sm3y$j75$.......$PBYPxYlSpNj0gB402Iz3o2VpQwaeDNogcR8fW2UitK6\", \"726 even\" },\n  { \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.$18By7IeohK1xNRKtHMcF9R/fIi7r/HH9uy3EG2HTxuB\", \"726 even\" },\n  { \"$sm3y$j85$.......\", \"$sm3y$j85$.......$jPbfSA9ezaMFq/ECEHbppP8AMaR17442cgu1ZJua073\", \"726 even\" },\n  { \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.$HJ.1UjMMS48gnlpjPYLzBAz2Sm4ZefycYjOHeldWu5.\", \"726 even\" },\n  { \"$sm3y$j75$.......\", \"$sm3y$j75$.......$Dr6RYUMF7Px621i5Yisww5w8nvYeRrrJABV4mhSQNn7\", \"zyxwvuts\" },\n  { \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.$lTFRuLKl2Gym8SFfPTpN5DCvURL6PhIF/xEK9XvYkm.\", \"zyxwvuts\" },\n  { \"$sm3y$j85$.......\", \"$sm3y$j85$.......$N1ubDBd6/iSrmMH4NKp0qebykcWWCHLjf9hOsvSLDv1\", \"zyxwvuts\" },\n  { \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.$9l51p7dZv8PjKFTEHhagirbhoZx.zReBJm2zsvgXML2\", \"zyxwvuts\" },\n  { \"$sm3y$j75$.......\", \"$sm3y$j75$.......$nEtNyf17UhAAIbmk9GtBs3V/pJe8sRgz22riNXxDDZD\", \"ab1234567\" },\n  { \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.$0CWnIcPuQ455p.GL5s0mRUlkfXmdsZaaZqx9ad.R.P0\", \"ab1234567\" },\n  { \"$sm3y$j85$.......\", \"$sm3y$j85$.......$9e49exJxWbzwvDf1r4SeeHeU6MGd724D9.0YoCR7bB5\", \"ab1234567\" },\n  { \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.$UaTMpZjMGLEKytKKgolYx3qH4hd77eITA61h7zxGPJ2\", \"ab1234567\" },\n  { \"$sm3y$j75$.......\", \"$sm3y$j75$.......$OiK4NlF/dEPlQI/mrJaLW4G7vdBbGDXo6Z.fmLQp0KA\", \"alexander\" },\n  { \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.$/ZawJw.6VNHlX6T9mfPfxHURaHy2XPwg/nqUXGursW7\", \"alexander\" },\n  { \"$sm3y$j85$.......\", \"$sm3y$j85$.......$7UZEGlYfOSPPcOfZ4TH.xl3XHrxEL9INIDR0Rzp75F3\", \"alexander\" },\n  { \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.$KSOCZY3sw3jpdJN/5ZIcdccZGp7iAcES26e6wKCNbk3\", \"alexander\" },\n  { \"$sm3y$j75$.......\", \"$sm3y$j75$.......$QDGrV9VjD7k11ghi.5erZmIy9VOpEWTRXRdg1E.YxlD\", \"beautiful\" },\n  { \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.$tj4YDl2Eir6.8TwS9cDJTn9e3u4SZowZSZP6ctdmSm6\", \"beautiful\" },\n  { \"$sm3y$j85$.......\", \"$sm3y$j85$.......$aV6eGxDHi9Ykj11NntviVzV98SSwhg1pm5wx.2HIMeA\", \"beautiful\" },\n  { \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.$D9ebHrjc5DYx2ic7mue6eU1IqsA04Sm0ghuskVJJOz5\", \"beautiful\" },\n  { \"$sm3y$j75$.......\", \"$sm3y$j75$.......$StuH5t46SsEIA5swVUEg/kCZ1aH9WJkTtiN2wyhBRD9\", \"challenge\" },\n  { \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.$99Z4ROgAOhOX/U5xxsUGIVyXS7h5WgimgBQXUH0nt79\", \"challenge\" },\n  { \"$sm3y$j85$.......\", \"$sm3y$j85$.......$eIcRElyTJ/q0wodZHUoMhIjQksYgEz7jX.Ff.wrYbvC\", \"challenge\" },\n  { \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.$35W2FXJQa2o3vWlunZqIAJq7iPFyFFeu./bmEYsTO71\", \"challenge\" },\n  { \"$sm3y$j75$.......\", \"$sm3y$j75$.......$cSWOwN1Z.CrbLb74DaIAUTJXYV6PVr6b8St7tPcYBk8\", \"chocolate\" },\n  { \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.$oRDp8o282.u0isJCpSp43XVqEecyy4ijY7hIFBz4YA9\", \"chocolate\" },\n  { \"$sm3y$j85$.......\", \"$sm3y$j85$.......$mnvyFwW75lWUE.DOBviUC/NgQL40eTM9Jx.EFTynAyC\", \"chocolate\" },\n  { \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.$KQkjQN7P97bjR/aB5uLqEgtpHA103w/o7uKHSw4/Kd/\", \"chocolate\" },\n  { \"$sm3y$j75$.......\", \"$sm3y$j75$.......$iN2f2j5KaeXbqy7GKuEX0DdQR/MZxftcVCRxx71Y370\", \"cr1234567\" },\n  { \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.$IW612/DltGUzi2H6A9nwVJhya/gUd7EU.hNu0sWzepC\", \"cr1234567\" },\n  { \"$sm3y$j85$.......\", \"$sm3y$j85$.......$5fzJdtPGiCHQ6zfbQWbe.WY3jcJY6xNbtHgJqezteED\", \"cr1234567\" },\n  { \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.$RZLK9al6PNdvi4HQYJ8x81Q9TJMcjQRjX80Vsg9vkb8\", \"cr1234567\" },\n  { \"$sm3y$j75$.......\", \"$sm3y$j75$.......$N6h96UCWvYOEhn.pYWJviasPwY7L9a3wjXcFI57sAh9\", \"katherine\" },\n  { \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.$DnyFqg/7dXNrlmHSKJEPjmgSxr/uKqg9VYfNrhILJY2\", \"katherine\" },\n  { \"$sm3y$j85$.......\", \"$sm3y$j85$.......$Y7gPCZm1dMkIo7mzScI11xifY/Ia9sCjWsaO2JMxwR6\", \"katherine\" },\n  { \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.$sWiIyn0dfKDKJhqvZJVLMRfWiQZW92XGvTflCH9Duq1\", \"katherine\" },\n  { \"$sm3y$j75$.......\", \"$sm3y$j75$.......$1cKf1LZam2tba5gR9.Rmoh8Y.0QeHyswdrWlmD/xbn9\", \"stephanie\" },\n  { \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.$GvknHkXHdVYAfv33/bAZibWjvii2BHDVLHK5KIubnQ2\", \"stephanie\" },\n  { \"$sm3y$j85$.......\", \"$sm3y$j85$.......$2gqrbmOl5htmtrRYwV4jmEkWpI8q.WW2B5STh2xMdd9\", \"stephanie\" },\n  { \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.$wHuJFnyMU4b0FLbe35e5jYhI9.PQLdbuliaVCNPXHM7\", \"stephanie\" },\n  { \"$sm3y$j75$.......\", \"$sm3y$j75$.......$u.3XWIqa8Cg3wyLMd/XyyyXLTpUiTcaNvQvztQaJvs1\", \"sunflower\" },\n  { \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.$delOpS/UmtueEiPLT8/NgI0CU.Vko5lkSAMgXCXuwl4\", \"sunflower\" },\n  { \"$sm3y$j85$.......\", \"$sm3y$j85$.......$kT7hw.brJzaZhJzM15r4CxZgi/iVPQN/SQAHLACtfe.\", \"sunflower\" },\n  { \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.$K4XykeNaJX7zSuF.sSgmqtAG0RTgq5PyGzXOEfms2l6\", \"sunflower\" },\n  { \"$sm3y$j75$.......\", \"$sm3y$j75$.......$QDfF4DUqQMj/KILwnjOhE3ooIZCDICLJMAdPbJDPmSD\", \"basketball\" },\n  { \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.$8blTSISF.GTK7Po2/3W99JXhJ3ZS8BCC4jWLrSfGNK/\", \"basketball\" },\n  { \"$sm3y$j85$.......\", \"$sm3y$j85$.......$VcOtI28vgGqZWNLSDmA/n681Rh/PNtWPSrX/OtMhU/2\", \"basketball\" },\n  { \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.$UiQ50XHk5GSLuJgpeumeqZYpRLJXG6xjcDedLMSi1aB\", \"basketball\" },\n  { \"$sm3y$j75$.......\", \"$sm3y$j75$.......$sbQENuRjmZNKCdWJJ7Ri/rf9IrmG0m/ZKlWUNmkOZ83\", \"porsche911\" },\n  { \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.$nGaBPBYIzrfPERPpCaKuQ3UIQ3L3TBdcYBjE8zhqYZC\", \"porsche911\" },\n  { \"$sm3y$j85$.......\", \"$sm3y$j85$.......$1hwTcqFRPqfaZmTBs.3WyDf6GN0TDupqB9uSkLCQZ5.\", \"porsche911\" },\n  { \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.$sW.yjH3kcrHCEKQFJ1sLqQf4OL3gC90xRcWfOZX9c.C\", \"porsche911\" },\n  { \"$sm3y$j75$.......\", \"$sm3y$j75$.......$ci4PjgAmcnoAdjcR9YIYmleV/D11dal7kzixZK9Bss7\", \"|_337T`/p3\" },\n  { \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.$kSN2FusfhBYV20X0Mec1B.p9LdMJWcB7H.KSXG.PbV.\", \"|_337T`/p3\" },\n  { \"$sm3y$j85$.......\", \"$sm3y$j85$.......$01dQzRuADp.AEQ4z4Zlcm5GnCrEMu/SLoInm3YrTet1\", \"|_337T`/p3\" },\n  { \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.$IUFwGhqo7GgXHeK1V9F6txeOArMdaPKtgHUxvYZStHC\", \"|_337T`/p3\" },\n  { \"$sm3y$j75$.......\", \"$sm3y$j75$.......$K866xiC/MlK5slzeKUbHxSPu.2c.HePn0Rve4tVTm6A\", \"thunderbird\" },\n  { \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.$6X.YFzEoNH1UcE.6nFEQYr4YAVhrTSHXjjdH6qx/Kj8\", \"thunderbird\" },\n  { \"$sm3y$j85$.......\", \"$sm3y$j85$.......$FZmRulf182LlqO.SC27vzbkCxzXoos3p2nSCq1bNrv.\", \"thunderbird\" },\n  { \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.$8Ae86weM7S.Z4WSjCvdPAD6mmXEI.5FNSWjOZzBIyt4\", \"thunderbird\" },\n  { \"$sm3y$j75$.......\", \"$sm3y$j75$.......$Fl1JJO5mL62Dfrp1fFIfH6NFnbUCi.A1c.PyE6Otzy7\", \"Hello world!\" },\n  { \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.$T5oJ8L.jiL/FeyTFmiU8pkr.Eyetg6OyCSCi0EroP.6\", \"Hello world!\" },\n  { \"$sm3y$j85$.......\", \"$sm3y$j85$.......$9ZzOEPFLt9nOjDqEWWdy6hstVEr1/MLgHfBUvOO3Xo8\", \"Hello world!\" },\n  { \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.$l0odnaaS/w.YV.mPRnRuCKF2DB0xzbyBWNkUehZRyG1\", \"Hello world!\" },\n  { \"$sm3y$j75$.......\", \"$sm3y$j75$.......$hqWYPJmGbf0cDGv5j.AXsAn8AcdVSkbtM9.MNhXnFe1\", \"pleaseletmein\" },\n  { \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.$XJNbhT4iSEOsJ2FM5kZaflHkq0IA0/uZh6J3Mowi7..\", \"pleaseletmein\" },\n  { \"$sm3y$j85$.......\", \"$sm3y$j85$.......$TI7CsxhY2tnTpMRIbN63pB.gss5HSB/u1ilPcd93Qx.\", \"pleaseletmein\" },\n  { \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.$eDSefvnttySbZdZegiFLTuDKvqofEf2j3aaD3c4ili4\", \"pleaseletmein\" },\n  { \"$sm3y$j75$.......\", \"$sm3y$j75$.......$.NZryhrXSak7wdo5kY1CK1AWe5JXUZGiafn0/bl/2l1\", \"a short string\" },\n  { \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.$.C2iqk0wGoRUiOH/yI.h/Igq37hJKgv3LVQvQopY4u.\", \"a short string\" },\n  { \"$sm3y$j85$.......\", \"$sm3y$j85$.......$iRQiAmiPZ5p1FMa0Z..Xq6JkzRB2owpkg7NH9zeuSD9\", \"a short string\" },\n  { \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.$4NwjO9WeREyBQ90PqZpGT6IaThRyxbBFiyCr/30MVT6\", \"a short string\" },\n  { \"$sm3y$j75$.......\", \"$sm3y$j75$.......$TjutbMlOWH6DUKtbmFMQg9RqAQltZz219YAG6Pamxo5\", \"zxyDPWgydbQjgq\" },\n  { \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.$AEitNI6.RwGf7i8wb8E51eALx4KCwYU3/Aljc965e39\", \"zxyDPWgydbQjgq\" },\n  { \"$sm3y$j85$.......\", \"$sm3y$j85$.......$qqpK0pPdWgRU.dQ72MVyZT9a8w8OsIuCLLumF2Q/gC0\", \"zxyDPWgydbQjgq\" },\n  { \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.$RpBjGUNqnS0qP9b8LEq38amBw2UDXvaTH6EnYR1Dgv0\", \"zxyDPWgydbQjgq\" },\n  { \"$sm3y$j75$.......\", \"$sm3y$j75$.......$CzyeCpvPhjvvwX/m35/p9P/h8aKeKmDgCi6unO4XFq2\", \"photojournalism\" },\n  { \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.$nfs1nA9TbVtB0H9hNnDKcO3.KNxuWOEr25q6//MLrID\", \"photojournalism\" },\n  { \"$sm3y$j85$.......\", \"$sm3y$j85$.......$3MCKxDxG8G8FJ57X.bumvvXENHALvCTB8/spk6nez67\", \"photojournalism\" },\n  { \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.$2pmqecyJlmGFtyKFhNBj/6hc4ChxFD08b.hvPPf23C7\", \"photojournalism\" },\n  { \"$sm3y$j75$.......\", \"$sm3y$j75$.......$5qu4rPGth7jS4L2Y0gTBS73LXncfeClWlfC7yxXxXfD\", \"ecclesiastically\" },\n  { \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.$iKO90lf.O.cRTU/he7fbPezuFhP3K5qHdL/FbaCa996\", \"ecclesiastically\" },\n  { \"$sm3y$j85$.......\", \"$sm3y$j85$.......$wl39zAPBDj1nq3f4upMnKxZZGPIR69ovHNqFLzPEFt8\", \"ecclesiastically\" },\n  { \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.$aqv4Bt8FIndQ.84n0blFPSZZSc8cys7xOFXLRErgk68\", \"ecclesiastically\" },\n  { \"$sm3y$j75$.......\", \"$sm3y$j75$.......$7sQUAocNZymwoAdpHWnk/QIN0p1cCtTYgHwucndmJG6\", \"congregationalism\" },\n  { \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.$aq2XUT60eXAbFZp9kWog32/G1wmhSiCiCSL3AU2DRs6\", \"congregationalism\" },\n  { \"$sm3y$j85$.......\", \"$sm3y$j85$.......$Uv1knpWJquIltC2a9CXvOG8zREJ.0HcCk8CyyaFZKF8\", \"congregationalism\" },\n  { \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.$n3qPCFOUhldCDaa00kDcaFN1v3Q.Emq/VgYgQ2DruQ5\", \"congregationalism\" },\n  { \"$sm3y$j75$.......\", \"$sm3y$j75$.......$rDKdIe8NSLNT6y/SkhevQsl4ZlEwQyUaqGoHX9uQuUB\", \"dihydrosphingosine\" },\n  { \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.$sqgBstaMK0RBJOcFvpY2z03f2uu1GBEewsqapmN6aIA\", \"dihydrosphingosine\" },\n  { \"$sm3y$j85$.......\", \"$sm3y$j85$.......$GqTp7cncMzPAvOG2euBc222i0AhPdAZzhlX8En5HgV8\", \"dihydrosphingosine\" },\n  { \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.$y6i6yQGe8lh47fK3BgaL4E8cxZRQrMy6l35LjQZ8dyC\", \"dihydrosphingosine\" },\n  { \"$sm3y$j75$.......\", \"$sm3y$j75$.......$AUmpkePIM8fW33lDy2m16bWgudqefiTWyUo5yY3OeQ5\", \"semianthropological\" },\n  { \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.$nU2jFD4JseH3z7/r1h4JtJlS5AT882bSwEbsf7.hqg6\", \"semianthropological\" },\n  { \"$sm3y$j85$.......\", \"$sm3y$j85$.......$llLsyl3Lp.Ktf8.3ghXU7.Adm5jtcren2phSTn3POxB\", \"semianthropological\" },\n  { \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.$wWF6AVNgm75bUED44hoinCiXArKYNYXiV1o9ESIqpI5\", \"semianthropological\" },\n  { \"$sm3y$j75$.......\", \"$sm3y$j75$.......$u4Qmy2M9BC4xiplWkE9snyOoB9Z/Wr5YRQCuKyCJoK3\", \"palaeogeographically\" },\n  { \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.$4hNATW9eCKWDN0r.NqZRmCKxqIrQEEoDbiBZKPE1R/D\", \"palaeogeographically\" },\n  { \"$sm3y$j85$.......\", \"$sm3y$j85$.......$S6nEbn.ViYkVpaWWAQX9DlEnJMXGgPNNgFCDf6zLu2/\", \"palaeogeographically\" },\n  { \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.$sRlN04EeaCPteV8yrN9JPvuWZD8CsnsaKWZqKe8eoI1\", \"palaeogeographically\" },\n  { \"$sm3y$j75$.......\", \"$sm3y$j75$.......$VcnRaesCGnSfwW/dq.FsPF6HrcW/1E9WQhmzQMifIc5\", \"electromyographically\" },\n  { \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.$Tw/DS4gFoW3tRQmoOuyTKrSHcMPrwd7Txc0wkABqZu2\", \"electromyographically\" },\n  { \"$sm3y$j85$.......\", \"$sm3y$j85$.......$KAHxGO3.Aavpw3u4MWa0IiR5oiGHczEEx/3Ytv5nxM6\", \"electromyographically\" },\n  { \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.$48YaT4jWabKJ3A0ABn9hQKn4F7EvIJrXIkNBNLxYRZ6\", \"electromyographically\" },\n  { \"$sm3y$j75$.......\", \"$sm3y$j75$.......$Tk1pJjxN2ZUhlemYZNfvGUkYcHf0O.4rJmFJVZrUbt1\", \"noninterchangeableness\" },\n  { \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.$dOpRB9P4fh/E.lotj7RK2mpG4uU2qYny0LskZLwZXOC\", \"noninterchangeableness\" },\n  { \"$sm3y$j85$.......\", \"$sm3y$j85$.......$8tInt9IJq9Mz6MhxVak/DS6AsvAtvbpn2wBNUnyyzs0\", \"noninterchangeableness\" },\n  { \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.$GOSd.X91S2Ge.mKSH3Vqu3jXr12rSDsSHAAoR4X9ab5\", \"noninterchangeableness\" },\n  { \"$sm3y$j75$.......\", \"$sm3y$j75$.......$/z0h/0ndkDUILZ.lcf2VcYDZKhIBdiqwcqsF6bHFZi8\", \"abcdefghijklmnopqrstuvwxyz\" },\n  { \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.$e11DJvhbJLIw8asJjzxn1.F.qx1jYh7xZSF3ZztgWb4\", \"abcdefghijklmnopqrstuvwxyz\" },\n  { \"$sm3y$j85$.......\", \"$sm3y$j85$.......$egZJgaZAybJOuson8i5F3BsYjGRbsEgOylne52Aoon6\", \"abcdefghijklmnopqrstuvwxyz\" },\n  { \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.$mwWQn0EZxjR9x7NUiwvHysmOZHSImCZbcd2iVe2oTz5\", \"abcdefghijklmnopqrstuvwxyz\" },\n  { \"$sm3y$j75$.......\", \"$sm3y$j75$.......$0KMOoqBO0G.wrS33WhhU76x65PFzUiMV7Gqt/Zfb0k6\", \"electroencephalographically\" },\n  { \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.$xhg1D7QA.rcONQG4pXpVuM08SVfh4Fb90Dud3Of13H2\", \"electroencephalographically\" },\n  { \"$sm3y$j85$.......\", \"$sm3y$j85$.......$WKl92eNlmXiQ077IJJdaRqEnYNPE0aQn3ltgt68ifH0\", \"electroencephalographically\" },\n  { \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.$0vWE6Uas01XnYNplcnSBF03krpQZMndC1Pk.e9nzV34\", \"electroencephalographically\" },\n  { \"$sm3y$j75$.......\", \"$sm3y$j75$.......$cERU3PEDoPwOEG26AS5p0U1PIDVkrCV2ymgizVolc/D\", \"antidisestablishmentarianism\" },\n  { \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.$ltrA22uM/p0alV3E3avf1EsCMYVjoztc/3mtRRYET7/\", \"antidisestablishmentarianism\" },\n  { \"$sm3y$j85$.......\", \"$sm3y$j85$.......$uqXLmwPoht9SfnV1nbbNNFtitOZ/f8cc65hIawAIQ3D\", \"antidisestablishmentarianism\" },\n  { \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.$j7nBWet2yKGT2fo4x/Y..T7Rj9hOgfYnasDSmGtllRA\", \"antidisestablishmentarianism\" },\n  { \"$sm3y$j75$.......\", \"$sm3y$j75$.......$A2yWp.KyIll2fm07vdLWwhv71b5T2BOaxhe.dU6pj.C\", \"cyclotrimethylenetrinitramine\" },\n  { \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.$RnVi3HhaJZtFsPZEEk0AEvyXthjxIf4AC3f/rHuckOB\", \"cyclotrimethylenetrinitramine\" },\n  { \"$sm3y$j85$.......\", \"$sm3y$j85$.......$yQMYAAfYvhZvfUTa/AK3VE.m.noihmAMaCYprR4Cf5C\", \"cyclotrimethylenetrinitramine\" },\n  { \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.$ywi5v3T3lvxrFt3srzyXJu6i1VX0h.7jpJE/gfVNX.A\", \"cyclotrimethylenetrinitramine\" },\n  { \"$sm3y$j75$.......\", \"$sm3y$j75$.......$/VUsYdM7G3coTWb/Ds2U2PkQu1nf/rbzqVpplZsS186\", \"dichlorodiphenyltrichloroethane\" },\n  { \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.$6MZbxfhSkMYJc.PY9H.ZnYpvmhNMmpHryhNVuGYJJUB\", \"dichlorodiphenyltrichloroethane\" },\n  { \"$sm3y$j85$.......\", \"$sm3y$j85$.......$Hgqjy0lKLdex5.AkXPeQXxD7281U57qyNAIvIUUGmE4\", \"dichlorodiphenyltrichloroethane\" },\n  { \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.$CAD.5MVyCl4t54hiKCKL1ErKD/xjn1wA0IV4hbpGcT5\", \"dichlorodiphenyltrichloroethane\" },\n  { \"$sm3y$j75$.......\", \"$sm3y$j75$.......$1jVjUF4p0gR0MtrjUt/vWUdhv0wm3EPwXGGkniuWzU5\", \"multiple words seperated by spaces\" },\n  { \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.$Zze7WCJFQ93RuclmNvng/RPsZWJK8.9S0xLq8nFKKi7\", \"multiple words seperated by spaces\" },\n  { \"$sm3y$j85$.......\", \"$sm3y$j85$.......$ocKyuGflhycdlUaOeO.RqkZysvZz41UhxaOlENz9PY4\", \"multiple words seperated by spaces\" },\n  { \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.$b9OTfBf6CXmuqXZ.TxnKiw4Btodt83rbUJGJVuhHnD6\", \"multiple words seperated by spaces\" },\n  { \"$sm3y$j75$.......\", \"$sm3y$j75$.......$AudhEDwuWxZJDjgEEaKoLNDtRepeRzD3OpANIP70cX1\", \"supercalifragilisticexpialidocious\" },\n  { \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.$RSO0/dnP4FVgo5EOTQA9Emjg/xKTQEnLKwAt7XBMdR.\", \"supercalifragilisticexpialidocious\" },\n  { \"$sm3y$j85$.......\", \"$sm3y$j85$.......$3mACU.qVO2c1S7ibVvBzCUnM/tod6xFQuzPP8zlLNQ8\", \"supercalifragilisticexpialidocious\" },\n  { \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.$KnaIPquArEqrF7vHnnJo2kgkWmEOfxivx66Hw4J50E5\", \"supercalifragilisticexpialidocious\" },\n  { \"$sm3y$j75$.......\", \"$sm3y$j75$.......$uXmQxhueQtnBjk2ySRyV3zkZ7hcSlhLdTEX41BPlY85\", \"we have a short salt string but not a short password\" },\n  { \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.$SNWfAWhsZGH1Wk/1dFB6Q3TVrj/7ZolVUzh8t4zJE92\", \"we have a short salt string but not a short password\" },\n  { \"$sm3y$j85$.......\", \"$sm3y$j85$.......$AoUL6ulXGcjxTnftWia686Lzcma/7oWI2B78Ixm41N.\", \"we have a short salt string but not a short password\" },\n  { \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.$vVXaL5w375VxaWAW9v1Z7v7BFSqEN0qU.8PsPYB.qm0\", \"we have a short salt string but not a short password\" },\n  { \"$sm3y$j75$.......\", \"$sm3y$j75$.......$xtPYXO0PStqsEupRLAy.55IoCbjFTPsNxgVFnbS2Mp0\", \"multiple word$ $eperated by $pace$ and $pecial character$\" },\n  { \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.$EAWHQFH057lsmdgRW1Evr7lYeLXmMvilEdxN/plEIRA\", \"multiple word$ $eperated by $pace$ and $pecial character$\" },\n  { \"$sm3y$j85$.......\", \"$sm3y$j85$.......$EmbPGLCLep65sot6B1GeeufxsnnFB6lw3dg1n93.Zh/\", \"multiple word$ $eperated by $pace$ and $pecial character$\" },\n  { \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.$7YMN0XcBtzw5umXex6ejdX7CP2AhyAF2fF/dE21DTC1\", \"multiple word$ $eperated by $pace$ and $pecial character$\" },\n  { \"$sm3y$j75$.......\", \"$sm3y$j75$.......$XIRRv/eoRCyRvTmHz5xr.AFokOBDf/qo3MCwXzOmbs.\", \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\" },\n  { \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.$8aDFJ/hdYvd1yIVIcq0E8xszlYiB.2hXZwh1J0J.eRA\", \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\" },\n  { \"$sm3y$j85$.......\", \"$sm3y$j85$.......$PEhAojyPMy1FUCl251CaHIGh2smhyzMjwfLb4Nsdn18\", \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\" },\n  { \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.$ZPxqkG53GDLTInHJOZgHDr88k0us6XUHD41bcxAamG8\", \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\" },\n  { \"$sm3y$j75$.......\", \"$sm3y$j75$.......$..RX2a7Xnhf4P4wVOc7mQtVpBbxb5cZX2vsMYcl9.11\", \"12345678901234567890123456789012345678901234567890123456789012345678901234567890\" },\n  { \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.$issx5PW8M0fliK40Z133/sbqQz6ALp3ir0m3ueh9HpA\", \"12345678901234567890123456789012345678901234567890123456789012345678901234567890\" },\n  { \"$sm3y$j85$.......\", \"$sm3y$j85$.......$QwPVJltRiaZIfxJAnf/mdB19PJNYLX/Coku5DzoGby3\", \"12345678901234567890123456789012345678901234567890123456789012345678901234567890\" },\n  { \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.$3byD/cldHxA2cpgq.2.dD58L/Se2xNx0juWiAoe0Dh8\", \"12345678901234567890123456789012345678901234567890123456789012345678901234567890\" },\n  { \"$sm3y$j75$.......\", \"$sm3y$j75$.......$6t5fIG0kHQgSqWT3Bs3E7oas5MkeCsbRk0UoA5TvMuA\", \"a very much longer text to encrypt.  This one even stretches over morethan one line.\" },\n  { \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.$fVFkjSwka4PD0FBbTD24MTS1EbWt2BA2LgBUsjH59U4\", \"a very much longer text to encrypt.  This one even stretches over morethan one line.\" },\n  { \"$sm3y$j85$.......\", \"$sm3y$j85$.......$WOd.9C/nsVeuC1U4PdxMKvpkM97p0bx6C.njaDOjnM3\", \"a very much longer text to encrypt.  This one even stretches over morethan one line.\" },\n  { \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.$qoZlum5WeZrhHyyhRupgieU0fvvSlowbSPk8YffUD14\", \"a very much longer text to encrypt.  This one even stretches over morethan one line.\" },\n  { \"$sm3y$j75$.......\", \"$sm3y$j75$.......$JglkDc1WF00QU7cPZEL3jmX63URqqc.irI4EVP7jLeB\", \"\\xd0\\xc1\\xd2\\xcf\\xcc\\xd8\" },\n  { \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.$VqyHgXICaZdZTnoQvLNlX1TBpOZQ9QsnSWbOmt8ydg6\", \"\\xd0\\xc1\\xd2\\xcf\\xcc\\xd8\" },\n  { \"$sm3y$j85$.......\", \"$sm3y$j85$.......$44ww/LHyorphVKGehLCyK.JxRg/qLZhTszatV1Du/j9\", \"\\xd0\\xc1\\xd2\\xcf\\xcc\\xd8\" },\n  { \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.$Rgerj6UHJzFAraJLXA0Ba4v77gzAv9nSer0XnnG.asD\", \"\\xd0\\xc1\\xd2\\xcf\\xcc\\xd8\" },\n  { \"$sm3y$j75$.......\", \"$sm3y$j75$.......$NgYe7MVLYoSLBtKdpJqzDuPGs7Ei9qvroWe5VEDZey3\", \"\\xd5\\xaa\\xd5\\xaa\\xaa\\xaa\\xd5\\xaa\" },\n  { \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.$eUL6TKeedsHvV6pMSdoT9XcqsZfXUBMT1/lhA.mR3w.\", \"\\xd5\\xaa\\xd5\\xaa\\xaa\\xaa\\xd5\\xaa\" },\n  { \"$sm3y$j85$.......\", \"$sm3y$j85$.......$E..VBJYqRUJ4Mtb/MJg0Oa3Zs2mcjP4TDrWDzcDIsf7\", \"\\xd5\\xaa\\xd5\\xaa\\xaa\\xaa\\xd5\\xaa\" },\n  { \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.$Ab68hm0/3I/aWvLtXJawxJmwetnDm8GtAEIPyDA2cz6\", \"\\xd5\\xaa\\xd5\\xaa\\xaa\\xaa\\xd5\\xaa\" },\n  { \"$sm3y$j75$.......\", \"$sm3y$j75$.......$gQxRaN2SU.Je7UbR74T06IWg8yMlsukTD1ofRSjLvmA\", \"\\xe1\\xec\\xe5\\xf8\\xe1\\xee\\xe4\\xe5\\xf2\" },\n  { \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.$VWuxzu2V2YMSqSs0uEtFjRYzYV3CSmjQ5t/spGMPvRA\", \"\\xe1\\xec\\xe5\\xf8\\xe1\\xee\\xe4\\xe5\\xf2\" },\n  { \"$sm3y$j85$.......\", \"$sm3y$j85$.......$orNyai1mjjJGLEwxuNBJ/iPwMahEf44W.d2fgk/pVN6\", \"\\xe1\\xec\\xe5\\xf8\\xe1\\xee\\xe4\\xe5\\xf2\" },\n  { \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.$9eGBzgkzRQg.HZYFgPuRKgaS/Q50Jex5eP3Tn7ta0D7\", \"\\xe1\\xec\\xe5\\xf8\\xe1\\xee\\xe4\\xe5\\xf2\" },\n  { \"$sm3y$j75$.......\", \"$sm3y$j75$.......$eR0Of5SlN1Jfs1G3hhrAZmK0Uxtmi6SVUb0gBM5gwv/\", \"\\xf3\\xf4\\xe5\\xf0\\xe8\\xe1\\xee\\xe9\\xe5\" },\n  { \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.$lwTIi6ZEVx1JoejVrkWwu05sezZGi9s8JO/QXRcWzI9\", \"\\xf3\\xf4\\xe5\\xf0\\xe8\\xe1\\xee\\xe9\\xe5\" },\n  { \"$sm3y$j85$.......\", \"$sm3y$j85$.......$EL..8u/q5bl8BwqSjXtoaWHGQcjbMsPlCOqoPtVpJB7\", \"\\xf3\\xf4\\xe5\\xf0\\xe8\\xe1\\xee\\xe9\\xe5\" },\n  { \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.$jJ6JXFYkOSZ9JvDS0bB0gRj9/.QXl/MIrbwY82HuHA3\", \"\\xf3\\xf4\\xe5\\xf0\\xe8\\xe1\\xee\\xe9\\xe5\" },\n  { \"$sm3y$j75$.......\", \"$sm3y$j75$.......$hJCKrP6x9i6xpc4eGZ6eGDVFwIKG9x7QXtfFuc9kYv5\", \"\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\" },\n  { \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.$L.hrcRaZpnBs4xwFvhegNAtLAvNk6Bc52yYpjxSv4bD\", \"\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\" },\n  { \"$sm3y$j85$.......\", \"$sm3y$j85$.......$FlkiUUCRGf/I6U1zOx8.9Bi62EtSjPbabB8KPqnoKu.\", \"\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\" },\n  { \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.$mMQ/3g4hKymi2n.evLQuatQI43j5KV9..A5Y7ql7NR3\", \"\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\" },\n  { \"$sm3y$j75$.......\", \"$sm3y$j75$.......$zzfh7usZ1zSLP0RIEZcReyGH8ox0ojkSu.m1zoczES0\", \"\\xc3\\xa9tude\" },\n  { \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.$X6tdhjPOgIdmDtjW4XTe3iB5xwnQ8.PUhDy8UPr17w/\", \"\\xc3\\xa9tude\" },\n  { \"$sm3y$j85$.......\", \"$sm3y$j85$.......$p8W92RcfBo44EIhCifD9QPE1qtECi6ERH4alck4w1H0\", \"\\xc3\\xa9tude\" },\n  { \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.$bwwJeie56AV3NZMg9US4kZpES7GTYWnr8y0C6pRQCw7\", \"\\xc3\\xa9tude\" },\n  { \"$sm3y$j75$.......\", \"$sm3y$j75$.......$Wkjym1pGft.6WspCbekdhOQSRtwpwMWayzSlFOEBfB/\", \"C)tude\" },\n  { \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.$WvQgfN4FSr1GW7.OYcZZoEUi2nDb.cH5TUkWKCeYZ7C\", \"C)tude\" },\n  { \"$sm3y$j85$.......\", \"$sm3y$j85$.......$hIlueHcE3FxsgyoDjjG27mVXDXvltmOogLSKcEPWLxA\", \"C)tude\" },\n  { \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.$t4vDIwoxmwaMpxM6iqPSbXuTP.g0GyR.Hdtgd1R2pd0\", \"C)tude\" },\n  { \"$sm3y$j75$.......\", \"$sm3y$j75$.......$X7vixvDipDpiFhyoseeVf8LJ2aIci3cBn0r6gpCFMj9\", \"Chl\\xc3\\xb6\"\"e\" },\n  { \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.$KzKH0/WAdiU/WElporyamvW5MgI8bRLS1DnxpoVsUT/\", \"Chl\\xc3\\xb6\"\"e\" },\n  { \"$sm3y$j85$.......\", \"$sm3y$j85$.......$foikgyB9lj7j80oWRnyg5GFVcF.mVw7rhtk36EjG0m5\", \"Chl\\xc3\\xb6\"\"e\" },\n  { \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.$jkbF8eD6jGNnYBGpwZD7P9Fp0osaxqC6XY87bidynA6\", \"Chl\\xc3\\xb6\"\"e\" },\n  { \"$sm3y$j75$.......\", \"$sm3y$j75$.......$GVelwNn3GOtNcpA.BVrhR/omX5cirxyrcmsfEBFkX9B\", \"ChlC6e\" },\n  { \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.$aJQAN9JepFtB8w7I5vLYlY2ko8f6scs0xrLFGvaNqs0\", \"ChlC6e\" },\n  { \"$sm3y$j85$.......\", \"$sm3y$j85$.......$WzvzI2osPFtnHceHoykwPx7McGY0o5Sw.gW8tcjXEU5\", \"ChlC6e\" },\n  { \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.$sDBi6H607ug75T7Die7jHJgPB5TFndLqQ76JKsJ4WF1\", \"ChlC6e\" },\n  { \"$sm3y$j75$.......\", \"$sm3y$j75$.......$.QjdZMSTlu4IUiOQdbKYrscABm8c5T9Iw0aaLLrLsp8\", \"\\xc3\\x85ngstr\\xc3\\xb6m\" },\n  { \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.$v/m/L63vnUJrfJ60gTmNrDbD9yaK3NqLVZfcHfSwfK8\", \"\\xc3\\x85ngstr\\xc3\\xb6m\" },\n  { \"$sm3y$j85$.......\", \"$sm3y$j85$.......$0LsFP0gXIl37AN5.15tY4p/Qe6K8pF3bIgRfVNGJbS6\", \"\\xc3\\x85ngstr\\xc3\\xb6m\" },\n  { \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.$GiZmoWVC7pnefpwEGYTH/tsn715pspvKqPaTl6eWp2/\", \"\\xc3\\x85ngstr\\xc3\\xb6m\" },\n  { \"$sm3y$j75$.......\", \"$sm3y$j75$.......$p8wPhzwQ6dBTi5QUziAFQaaydwFcwg/cIJOklrMUd71\", \"C\\x05ngstrC6m\" },\n  { \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.$EFDFPfC4J1LupzDx7XPfiGJxZs7hSuvBaZv.c5jl266\", \"C\\x05ngstrC6m\" },\n  { \"$sm3y$j85$.......\", \"$sm3y$j85$.......$s5NTd4.d8FtFgdypAtdERo0F30oOfaUzVTzZGiy6tp.\", \"C\\x05ngstrC6m\" },\n  { \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.$mC/cfDifbCoSMDpQVyLkQRlJKoTaQBJhCtcLMvtrnz6\", \"C\\x05ngstrC6m\" },\n  { \"$sm3y$j75$.......\", \"$sm3y$j75$.......$4tXC7Y7YpaG0IUaUiAw8hK2yyNwbEGTGeEaiobVGgI.\", \"C\\x05ngstrCU*U***U*\" },\n  { \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.$a1sK3nmiByf6uwd7xU57w.DXh3/y9caOuv9nHT0sXKC\", \"C\\x05ngstrCU*U***U*\" },\n  { \"$sm3y$j85$.......\", \"$sm3y$j85$.......$jY2tUS2gifNFfJeU3Fy8l.egfAl1y3BKJ/Ozx48GT6C\", \"C\\x05ngstrCU*U***U*\" },\n  { \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.$UMVchHFzS.3VU2EZayj1s/al7thD4U4q8bwwMY2igG5\", \"C\\x05ngstrCU*U***U*\" },\n  { \"$sm3y$j75$.......\", \"$sm3y$j75$.......$9F6Xw9GDD/eGBRW16QS31t0.CtA13wYXD9wsLBZyuLA\", \"U*U***U*ignored\" },\n  { \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.$RDBAUZkkPs1nz5Z8o3qYiVeuLnY7fW90SKMZbgGzZv2\", \"U*U***U*ignored\" },\n  { \"$sm3y$j85$.......\", \"$sm3y$j85$.......$Dk2KUOtqij6YXCZ50idBTWt9s2hbvgIV44avu4vntk.\", \"U*U***U*ignored\" },\n  { \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.$CWJK1uteGW0sD7bj.SlkZd43OdVH/xZRTLf0JZZNAtA\", \"U*U***U*ignored\" },\n  { \"$sm3y$j75$.......\", \"$sm3y$j75$.......$8xhsHrvNSXB6aHdJK5b.gT6KxClWxQrkEjzXmygtu51\", \"U*U*U*U*\" },\n  { \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.$0BafhOLobittF7QyKaKRmvUJwYSBnZXslftc6GmBiV9\", \"U*U*U*U*\" },\n  { \"$sm3y$j85$.......\", \"$sm3y$j85$.......$GTTLijPTaZG/kCEy3Q75imWazPFohb3v8hj5l8aB.c3\", \"U*U*U*U*\" },\n  { \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.$YD04u3k06QzcXaPvsoaTLu1KXpgdqiOkBhJZ0CgwuD7\", \"U*U*U*U*\" },\n  { \"$sm3y$j75$.......\", \"$sm3y$j75$.......$2CRRwq/7kuOpfV.GBA6S/LtxNYca3ExCeKh0aRdmyj3\", \"U*U*U*U*ignored\" },\n  { \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.$mpr./nX21oSVX9HxyrmL590Ps7WQ0Xe2ktFHhBk0oQ9\", \"U*U*U*U*ignored\" },\n  { \"$sm3y$j85$.......\", \"$sm3y$j85$.......$JBDoFnZekbkNoeukQ5iUuI8h/MHqwzGt1Eye1g073ID\", \"U*U*U*U*ignored\" },\n  { \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.$z1v6truw/882nfMSXWneaoYYaz7sl1oyK0bYr2qwxP5\", \"U*U*U*U*ignored\" },\n  { \"$sm3y$j75$.......\", \"$sm3y$j75$.......$yFD5m64w/AIPAv75.teZO9T7ZlQDyu7tE0uwbRdb9vA\", \"*U*U*U*U\" },\n  { \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.$V2iPaC/fm4XxTKaLpkEQpZ3q5t4Y2eJPFmF38mxl0R8\", \"*U*U*U*U\" },\n  { \"$sm3y$j85$.......\", \"$sm3y$j85$.......$PP3FwB/sOjlm8QamjaDHh2R3Ikt7OhcxoUABbjij419\", \"*U*U*U*U\" },\n  { \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.$NjwW/.M/z3A2VZurRcm83ce6lQflPkStxjrWmPaRF12\", \"*U*U*U*U\" },\n  { \"$sm3y$j75$.......\", \"$sm3y$j75$.......$lYfpZ5HLNsh5bXL.gem0qgeTGhzvnfUmVKq4IQgrhv6\", \"*U*U*U*U*\" },\n  { \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.$4CYzwEcr1QbkQ9v0Xn3sQwWeTm7niD.tv8mjrlXNJCD\", \"*U*U*U*U*\" },\n  { \"$sm3y$j85$.......\", \"$sm3y$j85$.......$ggLQushGkKgUyd908pOnPwxTnTGd42rmnl81xWXXZg.\", \"*U*U*U*U*\" },\n  { \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.$PWDJmSYxwWMa51Dznu2wjJM9fQJrkOpeQWEUIr25ug5\", \"*U*U*U*U*\" },\n  { \"$sm3y$j75$.......\", \"$sm3y$j75$.......$sLTmLDtt5obdF7vLcuSS6QS3srkCr5FCLS1YHiaKIz/\", \"*U*U*U*U*U*U*U*U\" },\n  { \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.$6bUvaM9hghAYVoRnUxV1S07g36Y/TTWruZjadHZYXZ4\", \"*U*U*U*U*U*U*U*U\" },\n  { \"$sm3y$j85$.......\", \"$sm3y$j85$.......$TE9S0wSAJS7O.r7N2l4YUw/KmqulkiyAEqjF2RoMkh9\", \"*U*U*U*U*U*U*U*U\" },\n  { \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.$N0bWlQBnIapr/qOoh5tzsk0il/i2nT4OwXV6il7SoT1\", \"*U*U*U*U*U*U*U*U\" },\n  { \"$sm3y$j75$.......\", \"$sm3y$j75$.......$5bBuxhkJhoPSVJlTdXdrGzfmxy54LTh5qJEr9N/jaz.\", \"*U*U*U*U*U*U*U*U*\" },\n  { \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.$QzY8TrqELXDotVg7eKJ3hymqy3NtSKr/TGXALKtGGf5\", \"*U*U*U*U*U*U*U*U*\" },\n  { \"$sm3y$j85$.......\", \"$sm3y$j85$.......$wHjJYZOEr2QSOGHOQU/DUXV2Xab319tYUGmMpflst33\", \"*U*U*U*U*U*U*U*U*\" },\n  { \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.$M2aXy82P3pniVrMho5o.ii/xtVBht6.TV5boFeoEvqD\", \"*U*U*U*U*U*U*U*U*\" },\n  { \"$sm3y$j75$.......\", \"$sm3y$j75$.......$4l3gfaieJEQ2hIsqfO0R3ihFH20wTC.v3IV1J861eZ.\", \"\\xa3\" },\n  { \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.$THdZOHaFgwYzKZ8CaGaqdta0qlg4rHr30.yL58vwYL6\", \"\\xa3\" },\n  { \"$sm3y$j85$.......\", \"$sm3y$j85$.......$kCfU4yn7MC03aZ54uVVNp0rSLSrF1EzFjR.FMvAPua3\", \"\\xa3\" },\n  { \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.$QNkMwZs.dLpzO4CmyXLS7JDStS5.HsRZNVbK/nSbnd3\", \"\\xa3\" },\n  { \"$sm3y$j75$.......\", \"$sm3y$j75$.......$F7LyrC3dBgwS6Y/gRvSpgcMXl.oCurIBK1uOdOs6cz5\", \"\\xa3\"\"a\" },\n  { \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.$XWLHtOWzkP0oR2UJaTGj2CnJE3TtFeEq468S12aok04\", \"\\xa3\"\"a\" },\n  { \"$sm3y$j85$.......\", \"$sm3y$j85$.......$g54TtfHJ/FfBwv.QL47hIlTMgLEaYxDVEgUgtTwz662\", \"\\xa3\"\"a\" },\n  { \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.$ScHOxrRnAVZ5v2LGzaq3te8ncmlBLuMF3A70bd/YcV8\", \"\\xa3\"\"a\" },\n  { \"$sm3y$j75$.......\", \"$sm3y$j75$.......$EL1zhq6oCbR3Jv0T/SkQzkT4qc0gQpKt/c3I2mjZUuA\", \"\\xd1\\x91\" },\n  { \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.$paK9PrSnGaZwUqrexRx6RK.OiMT9e4uuuyiEPRaf2d.\", \"\\xd1\\x91\" },\n  { \"$sm3y$j85$.......\", \"$sm3y$j85$.......$E3WfS8j6gCRtvjcKXi6DkRvPT2RwnK3h3jNj8hFPy05\", \"\\xd1\\x91\" },\n  { \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.$TCKAbO44nBoGdgNnC9duDN9W2elPiz5BEQC.c/1/DE6\", \"\\xd1\\x91\" },\n  { \"$sm3y$j75$.......\", \"$sm3y$j75$.......$WxNXTayEw1N9sMfBKQteo3kKedzeiTDnUxTIkiiIC.6\", \"\\xa3\"\"ab\" },\n  { \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.$FUjT89Q6bKGhz.aNiI6jmHF.h3Toeki60ekucx40WH/\", \"\\xa3\"\"ab\" },\n  { \"$sm3y$j85$.......\", \"$sm3y$j85$.......$NAr1cag/Cw8m/.W.uuTkt3Boaa.w8j7.GAUctQj7i73\", \"\\xa3\"\"ab\" },\n  { \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.$bzmiTpfSam40mMyPhXglmxEu1NvSBd1E/73Qnog.WgC\", \"\\xa3\"\"ab\" },\n  { \"$sm3y$j75$.......\", \"$sm3y$j75$.......$ibmd5LjNFtjwC/0nMzXbECR29RBJgVL9RfgR8YOkD17\", \"\\xff\\xff\\xa3\" },\n  { \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.$xsV3zvygieg9Dy8oFr9.L5NMXbQDev2t3zfMWuTPc6B\", \"\\xff\\xff\\xa3\" },\n  { \"$sm3y$j85$.......\", \"$sm3y$j85$.......$q0G2lIhyrZ0wk/giRyqJgwhg4TtWSYw8B7YL/gb5D88\", \"\\xff\\xff\\xa3\" },\n  { \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.$ys5cdHyU9B9Q8XCVoJp1pCSUl5vG5sVWuDmRpVSfX78\", \"\\xff\\xff\\xa3\" },\n  { \"$sm3y$j75$.......\", \"$sm3y$j75$.......$nkn5h/7A4ufoHNY.JXCpe85KdGB97i.c2CPfNYJ0Xw/\", \"1\\xa3\"\"345\" },\n  { \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.$1zSFBx2oDrVo8YeBuSeFiMqvhBRZIRG5/HGb9bA48H0\", \"1\\xa3\"\"345\" },\n  { \"$sm3y$j85$.......\", \"$sm3y$j85$.......$7UXjuW0C1rHtG8gs.A6.yRSd.Jp9JrbYvp5G7moZvf.\", \"1\\xa3\"\"345\" },\n  { \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.$qtd4FgtdNvMFVAVxJMh6kibm3pweNHO84XXP6S72WxA\", \"1\\xa3\"\"345\" },\n  { \"$sm3y$j75$.......\", \"$sm3y$j75$.......$sJXxdKucpb9vu528RzrtZhoqEMAPokLumbw1hpl8h01\", \"\\xff\\xa3\"\"345\" },\n  { \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.$jwPHL7jjMt1y8qH2HD/mC9BpyvKb6pxrdSFd/C3qCs7\", \"\\xff\\xa3\"\"345\" },\n  { \"$sm3y$j85$.......\", \"$sm3y$j85$.......$Kq66Zz4DS/TIwX9eYETVP1BUcGo0/HQtQdlMZO5mz2D\", \"\\xff\\xa3\"\"345\" },\n  { \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.$JDOZD1if6RoHf4TQWLDwd8uu2N5obPWdNI40A2uvAA.\", \"\\xff\\xa3\"\"345\" },\n  { \"$sm3y$j75$.......\", \"$sm3y$j75$.......$pnzu3MtodIKp/4UecbcDKzanT6DfSME8C8mF09CjFhA\", \"\\xff\\xa3\"\"34\\xff\\xff\\xff\\xa3\"\"345\" },\n  { \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.$CnSsOqOFwZTCFNw2BV/YHad7jcD7aUB8AEozektLwy.\", \"\\xff\\xa3\"\"34\\xff\\xff\\xff\\xa3\"\"345\" },\n  { \"$sm3y$j85$.......\", \"$sm3y$j85$.......$SrZh5/PCD7uZlc/EQJ2MG2.BUwVZ57g6GK7Qu9mYnc4\", \"\\xff\\xa3\"\"34\\xff\\xff\\xff\\xa3\"\"345\" },\n  { \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.$4E1SRUBTrnFcuJGCFD11x3f4uipOt/h1iO.aIi5CDs5\", \"\\xff\\xa3\"\"34\\xff\\xff\\xff\\xa3\"\"345\" },\n  { \"$sm3y$j75$.......\", \"$sm3y$j75$.......$ALUCjqTx2/F4IwLaxTFgAk04ePudG/88lr3qJDCshVB\", \"U\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xff\" },\n  { \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.$ZQhxVXFmkL7KoXgNjP96TvfaRk9CIjcPpwtdrr1S5ID\", \"U\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xff\" },\n  { \"$sm3y$j85$.......\", \"$sm3y$j85$.......$4cLHewnnKS.yskYtL/pcrJd2Flc2wbIKak2TUqJFeFB\", \"U\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xff\" },\n  { \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.$LYeIs/Npq/TmYgxlbBSAdkjultRk8QHlHBkoyThe/93\", \"U\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xff\" },\n  { \"$sm3y$j75$.......\", \"$sm3y$j75$.......$wi2mW6HjPmEJGYtPqLEDDaxVr7SSKXG/46moqrFEdC9\", \"\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\" },\n  { \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.$zh5Uh8eAMrMxFG8Y.rxfXpFkcvymLwTQhfNrMAz2oH8\", \"\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\" },\n  { \"$sm3y$j85$.......\", \"$sm3y$j85$.......$Gz98oPBR5Ik8nzf6pWGxMlYW7E5Q3nRi204PAxahV33\", \"\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\" },\n  { \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.$zjvqsm.prmZpGiM3NzF9OYYKdTxGnngC9heo/KZEKf/\", \"\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\" },\n  { \"$sm3y$j75$.......\", \"$sm3y$j75$.......$qEP3zgPnnCU3cQWvOXUNwaTDBOeRce1mu9DJrZxOlzD\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\" },\n  { \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.$RpIUOMzNUOq8mDI9ZUIIe2nOo.y5PURnU4pA6Ncmbr/\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\" },\n  { \"$sm3y$j85$.......\", \"$sm3y$j85$.......$U.QuzzwJ2J1QPa9DzBHbNY2Wm8eIV3DQ9wh40n4JuZ1\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\" },\n  { \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.$5KOm1SGxZzxC.63yg1UeWP5fGSh.2f.jH6CTEwEyseC\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\" },\n  { \"$sm3y$j75$.......\", \"$sm3y$j75$.......$Ug013u.PK.btjahtTr3g7JPNWD2w5jGaRkQTqtk4Ej/\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789chars after 72 are ignored\" },\n  { \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.$0TpJ2fMqzQTUNO8zBg5M.oaGCb1xPXdf4vcog8Dv4R8\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789chars after 72 are ignored\" },\n  { \"$sm3y$j85$.......\", \"$sm3y$j85$.......$aaOdO/0UErwYEdg0sLrQeFAf5Ui4pqacJIoYS.5TKxC\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789chars after 72 are ignored\" },\n  { \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.$1VlkcRef.IW8Ng1Q2RLq0ffKZx4in2RIM7/wD8jt9/C\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789chars after 72 are ignored\" },\n  { \"$sm3y$j75$.......\", \"$sm3y$j75$.......$uRgAfuVZnLcRrjaRTDsIja4.Ft4TEQDuwQauF0p6lBA\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\" },\n  { \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.$ITEtpuf42kdqFT7RUiE02KBDr5yPnVsNtsEu3YcviP8\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\" },\n  { \"$sm3y$j85$.......\", \"$sm3y$j85$.......$RBvOw9TRa3M9B7jV62tL5ckbZ9LYChqVlGP2uGmidt7\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\" },\n  { \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.$/48D9zWzUcWoqfLq9GP.356v9EcHABfKdHu0p3pU7C3\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\" },\n  { \"$sm3y$j75$.......\", \"$sm3y$j75$.......$W74SfnCWsKe/FTnf5YuJWcCbMn8OGhtA0E7otlfBEn0\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\"\"chars after 72 are ignored as usual\" },\n  { \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.$GUDoqr9BQjMcIKthOvF6AAaHwDNaZDNCnkU1OzV.z28\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\"\"chars after 72 are ignored as usual\" },\n  { \"$sm3y$j85$.......\", \"$sm3y$j85$.......$x3MYlzmKXpNCVb12wpREXx2vwDb8ZeF7QOV9BUZ8EH9\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\"\"chars after 72 are ignored as usual\" },\n  { \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.$YXLWWKC9g2Xac2O2zHKBQxKIkjZ3jqIMV4xTIq1uAIC\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\"\"chars after 72 are ignored as usual\" },\n  { \"$sm3y$j75$.......\", \"$sm3y$j75$.......$ixuJPMBrGHTzA3SMmjW9sZZz64CLQcIDT53zv3P0gB6\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has forgotten.\" },\n  { \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.$qTeO1tmKicVuNmDpshvLjxNLjoMl0b.J0KPsVTyOyo2\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has forgotten.\" },\n  { \"$sm3y$j85$.......\", \"$sm3y$j85$.......$MoCNV91RESTAwoHTaTFXCzV1acGn46OyTFGUxZOSHe0\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has forgotten.\" },\n  { \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.$yq34rt/vGD5hu.V/VZi4nPaURxb0GFGlKS2hxm/8WDD\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has forgotten.\" },\n  { \"$sm3y$j75$.......\", \"$sm3y$j75$.......$QpMdw3klRpIZQ.6EpvNojlH5qPBUEqXh89WaFzgELM6\", \"THE YEAR\" },\n  { \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.$i4UK9TpLkOs/ZAGVCwyr9xLrUY/iYvjh.UNcCPprXbB\", \"THE YEAR\" },\n  { \"$sm3y$j85$.......\", \"$sm3y$j85$.......$DQ74A6lhXMHprQvi62K3NOuY0AtWIBai7feta.W2.x4\", \"THE YEAR\" },\n  { \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.$WsTTrZ0dW06CzYMMiynOfJ108lKkjFS3Uk4yx62hvZ3\", \"THE YEAR\" },\n  { \"$sm3y$j75$.......\", \"$sm3y$j75$.......$Jmx4iYyEDYnYdR4Sirwu6InXG/UZoZKq0cqX08upyB1\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and do\" },\n  { \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.$NLHlg22Sc0t84keMlpBrn4YLj0WJUTtVfyI7wt9O/X/\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and do\" },\n  { \"$sm3y$j85$.......\", \"$sm3y$j85$.......$QzdWDuD0Q7JI1kD3OzQcbmBRwY2vvPNH9gMaR9l1kiC\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and do\" },\n  { \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.$vLaWben/jVffUgVUTXncP4czYXjEt/FPnoF1tUAlZX9\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and do\" },\n  { \"$sm3y$j75$.......\", \"$sm3y$j75$.......$mf4Q7BzVUa5V9N14a0ZVHHnH9zohfu0kwpQBdJFRUXA\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has f\" },\n  { \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j75$LdJMENpBABJJ3hIHjB1Bi.$9WVtJHSgz4OFfU.tx9CKAfpzQEvP7LOieIB1PnPKK3.\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has f\" },\n  { \"$sm3y$j85$.......\", \"$sm3y$j85$.......$HB0qJFxqvVAhno.1hPy0PXJNbKVkzTBsUT1RhQaJrt2\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has f\" },\n  { \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$sm3y$j85$LdJMENpBABJJ3hIHjB1Bi.$It5fnoEMPtvwdNEOif0qQmwvJri39Bzs41GiZx4fen5\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has f\" },\n#endif // sm3_yescrypt\n\n#if INCLUDE_sunmd5 && defined TEST_sunmd5\n  { \"$md5$9ZLwtuTO\", \"$md5$9ZLwtuTO$RZCI6tPskaQD1XDK/Ffsr.\", \"\" },\n  { \"$md5$9ZLwtuTO$x\", \"$md5$9ZLwtuTO$RZCI6tPskaQD1XDK/Ffsr.\", \"\" },\n  { \"$md5$9ZLwtuTO$\", \"$md5$9ZLwtuTO$$0XWUyO5foTuTHGCTvb49N1\", \"\" },\n  { \"$md5$9ZLwtuTO$$\", \"$md5$9ZLwtuTO$$0XWUyO5foTuTHGCTvb49N1\", \"\" },\n  { \"$md5$1xMeE.at\", \"$md5$1xMeE.at$qpW6RLvS68lr/i6KhZdRD.\", \"\" },\n  { \"$md5$1xMeE.at$x\", \"$md5$1xMeE.at$qpW6RLvS68lr/i6KhZdRD.\", \"\" },\n  { \"$md5$1xMeE.at$\", \"$md5$1xMeE.at$$DHOuObSHqAho/a9ri6kgq0\", \"\" },\n  { \"$md5$1xMeE.at$$\", \"$md5$1xMeE.at$$DHOuObSHqAho/a9ri6kgq0\", \"\" },\n  { \"$md5,rounds=12$9ZLwtuTO\", \"$md5,rounds=12$9ZLwtuTO$4Jb86c7oEf7eNt4YR5J9R/\", \"\" },\n  { \"$md5,rounds=12$9ZLwtuTO$x\", \"$md5,rounds=12$9ZLwtuTO$4Jb86c7oEf7eNt4YR5J9R/\", \"\" },\n  { \"$md5,rounds=12$9ZLwtuTO$\", \"$md5,rounds=12$9ZLwtuTO$$nJy1.BHla9NYuuvMBOKSz.\", \"\" },\n  { \"$md5,rounds=12$9ZLwtuTO$$\", \"$md5,rounds=12$9ZLwtuTO$$nJy1.BHla9NYuuvMBOKSz.\", \"\" },\n  { \"$md5,rounds=12$1xMeE.at\", \"$md5,rounds=12$1xMeE.at$s2SenojLvgwlaKoskqK6S/\", \"\" },\n  { \"$md5,rounds=12$1xMeE.at$x\", \"$md5,rounds=12$1xMeE.at$s2SenojLvgwlaKoskqK6S/\", \"\" },\n  { \"$md5,rounds=12$1xMeE.at$\", \"$md5,rounds=12$1xMeE.at$$f8InLGccBbbeLla0lgGGn1\", \"\" },\n  { \"$md5,rounds=12$1xMeE.at$$\", \"$md5,rounds=12$1xMeE.at$$f8InLGccBbbeLla0lgGGn1\", \"\" },\n  { \"$md5$9ZLwtuTO\", \"$md5$9ZLwtuTO$W9EpSlbJtKmRB310cW08Q.\", \" \" },\n  { \"$md5$9ZLwtuTO$x\", \"$md5$9ZLwtuTO$W9EpSlbJtKmRB310cW08Q.\", \" \" },\n  { \"$md5$9ZLwtuTO$\", \"$md5$9ZLwtuTO$$mB1mrzEG652GPT88z9hFf.\", \" \" },\n  { \"$md5$9ZLwtuTO$$\", \"$md5$9ZLwtuTO$$mB1mrzEG652GPT88z9hFf.\", \" \" },\n  { \"$md5$1xMeE.at\", \"$md5$1xMeE.at$mRGUC.fJ7bjQR/VYaVg6s.\", \" \" },\n  { \"$md5$1xMeE.at$x\", \"$md5$1xMeE.at$mRGUC.fJ7bjQR/VYaVg6s.\", \" \" },\n  { \"$md5$1xMeE.at$\", \"$md5$1xMeE.at$$/AEBYWX86Uwi3EMxMyUmc/\", \" \" },\n  { \"$md5$1xMeE.at$$\", \"$md5$1xMeE.at$$/AEBYWX86Uwi3EMxMyUmc/\", \" \" },\n  { \"$md5,rounds=12$9ZLwtuTO\", \"$md5,rounds=12$9ZLwtuTO$idnWS2AKDOWEVU5bak5/X0\", \" \" },\n  { \"$md5,rounds=12$9ZLwtuTO$x\", \"$md5,rounds=12$9ZLwtuTO$idnWS2AKDOWEVU5bak5/X0\", \" \" },\n  { \"$md5,rounds=12$9ZLwtuTO$\", \"$md5,rounds=12$9ZLwtuTO$$8mJYfoL3Y/FH2UMuTRtJa/\", \" \" },\n  { \"$md5,rounds=12$9ZLwtuTO$$\", \"$md5,rounds=12$9ZLwtuTO$$8mJYfoL3Y/FH2UMuTRtJa/\", \" \" },\n  { \"$md5,rounds=12$1xMeE.at\", \"$md5,rounds=12$1xMeE.at$/iVfEhSComOv3UO28XYH0/\", \" \" },\n  { \"$md5,rounds=12$1xMeE.at$x\", \"$md5,rounds=12$1xMeE.at$/iVfEhSComOv3UO28XYH0/\", \" \" },\n  { \"$md5,rounds=12$1xMeE.at$\", \"$md5,rounds=12$1xMeE.at$$Lg2zcwQNW0D85l1LEu9Pg.\", \" \" },\n  { \"$md5,rounds=12$1xMeE.at$$\", \"$md5,rounds=12$1xMeE.at$$Lg2zcwQNW0D85l1LEu9Pg.\", \" \" },\n  { \"$md5$9ZLwtuTO\", \"$md5$9ZLwtuTO$XMEBs0n0S31/6qX/qsg2E.\", \"a\" },\n  { \"$md5$9ZLwtuTO$x\", \"$md5$9ZLwtuTO$XMEBs0n0S31/6qX/qsg2E.\", \"a\" },\n  { \"$md5$9ZLwtuTO$\", \"$md5$9ZLwtuTO$$jt8Vz/QxkBtyChJu1yaW6/\", \"a\" },\n  { \"$md5$9ZLwtuTO$$\", \"$md5$9ZLwtuTO$$jt8Vz/QxkBtyChJu1yaW6/\", \"a\" },\n  { \"$md5$1xMeE.at\", \"$md5$1xMeE.at$PSOmhc/8C3iRpWrXvRZ9S0\", \"a\" },\n  { \"$md5$1xMeE.at$x\", \"$md5$1xMeE.at$PSOmhc/8C3iRpWrXvRZ9S0\", \"a\" },\n  { \"$md5$1xMeE.at$\", \"$md5$1xMeE.at$$KcJO43Bl4spsHXKnZxltJ.\", \"a\" },\n  { \"$md5$1xMeE.at$$\", \"$md5$1xMeE.at$$KcJO43Bl4spsHXKnZxltJ.\", \"a\" },\n  { \"$md5,rounds=12$9ZLwtuTO\", \"$md5,rounds=12$9ZLwtuTO$kdlvW44dPPaNESsdPeFRB.\", \"a\" },\n  { \"$md5,rounds=12$9ZLwtuTO$x\", \"$md5,rounds=12$9ZLwtuTO$kdlvW44dPPaNESsdPeFRB.\", \"a\" },\n  { \"$md5,rounds=12$9ZLwtuTO$\", \"$md5,rounds=12$9ZLwtuTO$$VlpZ3xmSPBUezOQx8tx/D1\", \"a\" },\n  { \"$md5,rounds=12$9ZLwtuTO$$\", \"$md5,rounds=12$9ZLwtuTO$$VlpZ3xmSPBUezOQx8tx/D1\", \"a\" },\n  { \"$md5,rounds=12$1xMeE.at\", \"$md5,rounds=12$1xMeE.at$etrC6qxk3qQeR6eO2AASX0\", \"a\" },\n  { \"$md5,rounds=12$1xMeE.at$x\", \"$md5,rounds=12$1xMeE.at$etrC6qxk3qQeR6eO2AASX0\", \"a\" },\n  { \"$md5,rounds=12$1xMeE.at$\", \"$md5,rounds=12$1xMeE.at$$MMNNm2Be.aQQ6fNR9JrPu.\", \"a\" },\n  { \"$md5,rounds=12$1xMeE.at$$\", \"$md5,rounds=12$1xMeE.at$$MMNNm2Be.aQQ6fNR9JrPu.\", \"a\" },\n  { \"$md5$9ZLwtuTO\", \"$md5$9ZLwtuTO$Sio8a5HlU7o1uou1i8sdE/\", \"ab\" },\n  { \"$md5$9ZLwtuTO$x\", \"$md5$9ZLwtuTO$Sio8a5HlU7o1uou1i8sdE/\", \"ab\" },\n  { \"$md5$9ZLwtuTO$\", \"$md5$9ZLwtuTO$$A5WnMRz8DD8PNcsFgRB0f.\", \"ab\" },\n  { \"$md5$9ZLwtuTO$$\", \"$md5$9ZLwtuTO$$A5WnMRz8DD8PNcsFgRB0f.\", \"ab\" },\n  { \"$md5$1xMeE.at\", \"$md5$1xMeE.at$wm2HLpJsTxGeJbd16hXN8.\", \"ab\" },\n  { \"$md5$1xMeE.at$x\", \"$md5$1xMeE.at$wm2HLpJsTxGeJbd16hXN8.\", \"ab\" },\n  { \"$md5$1xMeE.at$\", \"$md5$1xMeE.at$$ZXvgJMKTk2meSQmGFFxtS/\", \"ab\" },\n  { \"$md5$1xMeE.at$$\", \"$md5$1xMeE.at$$ZXvgJMKTk2meSQmGFFxtS/\", \"ab\" },\n  { \"$md5,rounds=12$9ZLwtuTO\", \"$md5,rounds=12$9ZLwtuTO$esUqrAk4ExA9lTHzqeutA/\", \"ab\" },\n  { \"$md5,rounds=12$9ZLwtuTO$x\", \"$md5,rounds=12$9ZLwtuTO$esUqrAk4ExA9lTHzqeutA/\", \"ab\" },\n  { \"$md5,rounds=12$9ZLwtuTO$\", \"$md5,rounds=12$9ZLwtuTO$$v/7H1VxPixZc8pX.3.2lq.\", \"ab\" },\n  { \"$md5,rounds=12$9ZLwtuTO$$\", \"$md5,rounds=12$9ZLwtuTO$$v/7H1VxPixZc8pX.3.2lq.\", \"ab\" },\n  { \"$md5,rounds=12$1xMeE.at\", \"$md5,rounds=12$1xMeE.at$mMElfrSD3LuRmq8IYIxXr0\", \"ab\" },\n  { \"$md5,rounds=12$1xMeE.at$x\", \"$md5,rounds=12$1xMeE.at$mMElfrSD3LuRmq8IYIxXr0\", \"ab\" },\n  { \"$md5,rounds=12$1xMeE.at$\", \"$md5,rounds=12$1xMeE.at$$eFQwMKsMRRjoBSI075qx9.\", \"ab\" },\n  { \"$md5,rounds=12$1xMeE.at$$\", \"$md5,rounds=12$1xMeE.at$$eFQwMKsMRRjoBSI075qx9.\", \"ab\" },\n  { \"$md5$9ZLwtuTO\", \"$md5$9ZLwtuTO$7FmTpHA5KbiMguiS2NE8f/\", \"abc\" },\n  { \"$md5$9ZLwtuTO$x\", \"$md5$9ZLwtuTO$7FmTpHA5KbiMguiS2NE8f/\", \"abc\" },\n  { \"$md5$9ZLwtuTO$\", \"$md5$9ZLwtuTO$$lVM7wgda0NqS96p1rXpJa.\", \"abc\" },\n  { \"$md5$9ZLwtuTO$$\", \"$md5$9ZLwtuTO$$lVM7wgda0NqS96p1rXpJa.\", \"abc\" },\n  { \"$md5$1xMeE.at\", \"$md5$1xMeE.at$Z9kwgXS5qWfSH43HjURUI1\", \"abc\" },\n  { \"$md5$1xMeE.at$x\", \"$md5$1xMeE.at$Z9kwgXS5qWfSH43HjURUI1\", \"abc\" },\n  { \"$md5$1xMeE.at$\", \"$md5$1xMeE.at$$g7cmsxdKt.wlfudrwT5ZT.\", \"abc\" },\n  { \"$md5$1xMeE.at$$\", \"$md5$1xMeE.at$$g7cmsxdKt.wlfudrwT5ZT.\", \"abc\" },\n  { \"$md5,rounds=12$9ZLwtuTO\", \"$md5,rounds=12$9ZLwtuTO$My0RfHdMxCWOibFsKw0990\", \"abc\" },\n  { \"$md5,rounds=12$9ZLwtuTO$x\", \"$md5,rounds=12$9ZLwtuTO$My0RfHdMxCWOibFsKw0990\", \"abc\" },\n  { \"$md5,rounds=12$9ZLwtuTO$\", \"$md5,rounds=12$9ZLwtuTO$$3u/OIHOy0UMiMfEiW92HL/\", \"abc\" },\n  { \"$md5,rounds=12$9ZLwtuTO$$\", \"$md5,rounds=12$9ZLwtuTO$$3u/OIHOy0UMiMfEiW92HL/\", \"abc\" },\n  { \"$md5,rounds=12$1xMeE.at\", \"$md5,rounds=12$1xMeE.at$YcmnWonUErnpK.mf79DPs/\", \"abc\" },\n  { \"$md5,rounds=12$1xMeE.at$x\", \"$md5,rounds=12$1xMeE.at$YcmnWonUErnpK.mf79DPs/\", \"abc\" },\n  { \"$md5,rounds=12$1xMeE.at$\", \"$md5,rounds=12$1xMeE.at$$8HOuY.OqUc/XDWEsZpJED/\", \"abc\" },\n  { \"$md5,rounds=12$1xMeE.at$$\", \"$md5,rounds=12$1xMeE.at$$8HOuY.OqUc/XDWEsZpJED/\", \"abc\" },\n  { \"$md5$9ZLwtuTO\", \"$md5$9ZLwtuTO$c5LDCIVsF6DEQ5.xab0MC/\", \"U*U\" },\n  { \"$md5$9ZLwtuTO$x\", \"$md5$9ZLwtuTO$c5LDCIVsF6DEQ5.xab0MC/\", \"U*U\" },\n  { \"$md5$9ZLwtuTO$\", \"$md5$9ZLwtuTO$$ckh4W6t3xuZFtIJ6Z/0AC1\", \"U*U\" },\n  { \"$md5$9ZLwtuTO$$\", \"$md5$9ZLwtuTO$$ckh4W6t3xuZFtIJ6Z/0AC1\", \"U*U\" },\n  { \"$md5$1xMeE.at\", \"$md5$1xMeE.at$ubD0.FdyUGtMja6YsRSJd.\", \"U*U\" },\n  { \"$md5$1xMeE.at$x\", \"$md5$1xMeE.at$ubD0.FdyUGtMja6YsRSJd.\", \"U*U\" },\n  { \"$md5$1xMeE.at$\", \"$md5$1xMeE.at$$cZV9P3rpKvkEd0SziHCqY.\", \"U*U\" },\n  { \"$md5$1xMeE.at$$\", \"$md5$1xMeE.at$$cZV9P3rpKvkEd0SziHCqY.\", \"U*U\" },\n  { \"$md5,rounds=12$9ZLwtuTO\", \"$md5,rounds=12$9ZLwtuTO$LYSZ0z8WOsaS2VGQsqOnP1\", \"U*U\" },\n  { \"$md5,rounds=12$9ZLwtuTO$x\", \"$md5,rounds=12$9ZLwtuTO$LYSZ0z8WOsaS2VGQsqOnP1\", \"U*U\" },\n  { \"$md5,rounds=12$9ZLwtuTO$\", \"$md5,rounds=12$9ZLwtuTO$$US3vgHZxnaSdVNbvIr8rE/\", \"U*U\" },\n  { \"$md5,rounds=12$9ZLwtuTO$$\", \"$md5,rounds=12$9ZLwtuTO$$US3vgHZxnaSdVNbvIr8rE/\", \"U*U\" },\n  { \"$md5,rounds=12$1xMeE.at\", \"$md5,rounds=12$1xMeE.at$iQj2/Q9uhHucEHehmJ8J8.\", \"U*U\" },\n  { \"$md5,rounds=12$1xMeE.at$x\", \"$md5,rounds=12$1xMeE.at$iQj2/Q9uhHucEHehmJ8J8.\", \"U*U\" },\n  { \"$md5,rounds=12$1xMeE.at$\", \"$md5,rounds=12$1xMeE.at$$ry39WDfDno9mLYA7EuuRh0\", \"U*U\" },\n  { \"$md5,rounds=12$1xMeE.at$$\", \"$md5,rounds=12$1xMeE.at$$ry39WDfDno9mLYA7EuuRh0\", \"U*U\" },\n  { \"$md5$9ZLwtuTO\", \"$md5$9ZLwtuTO$DGKWEJRQJ0tmrIoJ6ML890\", \"U*U*\" },\n  { \"$md5$9ZLwtuTO$x\", \"$md5$9ZLwtuTO$DGKWEJRQJ0tmrIoJ6ML890\", \"U*U*\" },\n  { \"$md5$9ZLwtuTO$\", \"$md5$9ZLwtuTO$$vSfPyHXf94AXuq5vJ31JI1\", \"U*U*\" },\n  { \"$md5$9ZLwtuTO$$\", \"$md5$9ZLwtuTO$$vSfPyHXf94AXuq5vJ31JI1\", \"U*U*\" },\n  { \"$md5$1xMeE.at\", \"$md5$1xMeE.at$MPTlDmpMkScEuZSS5Qc8n.\", \"U*U*\" },\n  { \"$md5$1xMeE.at$x\", \"$md5$1xMeE.at$MPTlDmpMkScEuZSS5Qc8n.\", \"U*U*\" },\n  { \"$md5$1xMeE.at$\", \"$md5$1xMeE.at$$/w7FbUHGWT19vg6Zg58M10\", \"U*U*\" },\n  { \"$md5$1xMeE.at$$\", \"$md5$1xMeE.at$$/w7FbUHGWT19vg6Zg58M10\", \"U*U*\" },\n  { \"$md5,rounds=12$9ZLwtuTO\", \"$md5,rounds=12$9ZLwtuTO$XDQpYykw91t4mS5ymcBPP0\", \"U*U*\" },\n  { \"$md5,rounds=12$9ZLwtuTO$x\", \"$md5,rounds=12$9ZLwtuTO$XDQpYykw91t4mS5ymcBPP0\", \"U*U*\" },\n  { \"$md5,rounds=12$9ZLwtuTO$\", \"$md5,rounds=12$9ZLwtuTO$$Hi1GLp3D95IJ.BJNG4v5b0\", \"U*U*\" },\n  { \"$md5,rounds=12$9ZLwtuTO$$\", \"$md5,rounds=12$9ZLwtuTO$$Hi1GLp3D95IJ.BJNG4v5b0\", \"U*U*\" },\n  { \"$md5,rounds=12$1xMeE.at\", \"$md5,rounds=12$1xMeE.at$RUFgPpn0wCSHXSxUbzK7q0\", \"U*U*\" },\n  { \"$md5,rounds=12$1xMeE.at$x\", \"$md5,rounds=12$1xMeE.at$RUFgPpn0wCSHXSxUbzK7q0\", \"U*U*\" },\n  { \"$md5,rounds=12$1xMeE.at$\", \"$md5,rounds=12$1xMeE.at$$CGVpnQoyf2hwZMfP01o3x1\", \"U*U*\" },\n  { \"$md5,rounds=12$1xMeE.at$$\", \"$md5,rounds=12$1xMeE.at$$CGVpnQoyf2hwZMfP01o3x1\", \"U*U*\" },\n  { \"$md5$9ZLwtuTO\", \"$md5$9ZLwtuTO$d.IFFJATjxAWAGrwhC4Y5/\", \"U*U*U\" },\n  { \"$md5$9ZLwtuTO$x\", \"$md5$9ZLwtuTO$d.IFFJATjxAWAGrwhC4Y5/\", \"U*U*U\" },\n  { \"$md5$9ZLwtuTO$\", \"$md5$9ZLwtuTO$$EnWzCBpVdzhU2aOPIlObf/\", \"U*U*U\" },\n  { \"$md5$9ZLwtuTO$$\", \"$md5$9ZLwtuTO$$EnWzCBpVdzhU2aOPIlObf/\", \"U*U*U\" },\n  { \"$md5$1xMeE.at\", \"$md5$1xMeE.at$01rSVF4L04dVv2ZG9WDGG0\", \"U*U*U\" },\n  { \"$md5$1xMeE.at$x\", \"$md5$1xMeE.at$01rSVF4L04dVv2ZG9WDGG0\", \"U*U*U\" },\n  { \"$md5$1xMeE.at$\", \"$md5$1xMeE.at$$1I1nVtulqeE0NyvVar4Mg1\", \"U*U*U\" },\n  { \"$md5$1xMeE.at$$\", \"$md5$1xMeE.at$$1I1nVtulqeE0NyvVar4Mg1\", \"U*U*U\" },\n  { \"$md5,rounds=12$9ZLwtuTO\", \"$md5,rounds=12$9ZLwtuTO$dCciDXD7pe48.7IiP3/2G0\", \"U*U*U\" },\n  { \"$md5,rounds=12$9ZLwtuTO$x\", \"$md5,rounds=12$9ZLwtuTO$dCciDXD7pe48.7IiP3/2G0\", \"U*U*U\" },\n  { \"$md5,rounds=12$9ZLwtuTO$\", \"$md5,rounds=12$9ZLwtuTO$$C2qRf6H.0BwggSyymDqki.\", \"U*U*U\" },\n  { \"$md5,rounds=12$9ZLwtuTO$$\", \"$md5,rounds=12$9ZLwtuTO$$C2qRf6H.0BwggSyymDqki.\", \"U*U*U\" },\n  { \"$md5,rounds=12$1xMeE.at\", \"$md5,rounds=12$1xMeE.at$YsA24aNojyria1YOg3bYW/\", \"U*U*U\" },\n  { \"$md5,rounds=12$1xMeE.at$x\", \"$md5,rounds=12$1xMeE.at$YsA24aNojyria1YOg3bYW/\", \"U*U*U\" },\n  { \"$md5,rounds=12$1xMeE.at$\", \"$md5,rounds=12$1xMeE.at$$DeUGw.vRgFjMVEG7aGB/40\", \"U*U*U\" },\n  { \"$md5,rounds=12$1xMeE.at$$\", \"$md5,rounds=12$1xMeE.at$$DeUGw.vRgFjMVEG7aGB/40\", \"U*U*U\" },\n  { \"$md5$9ZLwtuTO\", \"$md5$9ZLwtuTO$XNM8F6G7U/OWjgteUrQsA/\", \".....\" },\n  { \"$md5$9ZLwtuTO$x\", \"$md5$9ZLwtuTO$XNM8F6G7U/OWjgteUrQsA/\", \".....\" },\n  { \"$md5$9ZLwtuTO$\", \"$md5$9ZLwtuTO$$KT1m/mJc2D49JOvROv4iT0\", \".....\" },\n  { \"$md5$9ZLwtuTO$$\", \"$md5$9ZLwtuTO$$KT1m/mJc2D49JOvROv4iT0\", \".....\" },\n  { \"$md5$1xMeE.at\", \"$md5$1xMeE.at$vbHDah.s5mQXxNq7ETrc2/\", \".....\" },\n  { \"$md5$1xMeE.at$x\", \"$md5$1xMeE.at$vbHDah.s5mQXxNq7ETrc2/\", \".....\" },\n  { \"$md5$1xMeE.at$\", \"$md5$1xMeE.at$$dZ1YxYxBE63zWuq4N3HJb1\", \".....\" },\n  { \"$md5$1xMeE.at$$\", \"$md5$1xMeE.at$$dZ1YxYxBE63zWuq4N3HJb1\", \".....\" },\n  { \"$md5,rounds=12$9ZLwtuTO\", \"$md5,rounds=12$9ZLwtuTO$dJ9JQn2KinCwHKQeEO91A.\", \".....\" },\n  { \"$md5,rounds=12$9ZLwtuTO$x\", \"$md5,rounds=12$9ZLwtuTO$dJ9JQn2KinCwHKQeEO91A.\", \".....\" },\n  { \"$md5,rounds=12$9ZLwtuTO$\", \"$md5,rounds=12$9ZLwtuTO$$LDogFpsr23j76cgQjPykA/\", \".....\" },\n  { \"$md5,rounds=12$9ZLwtuTO$$\", \"$md5,rounds=12$9ZLwtuTO$$LDogFpsr23j76cgQjPykA/\", \".....\" },\n  { \"$md5,rounds=12$1xMeE.at\", \"$md5,rounds=12$1xMeE.at$15KPM/GLKsO9YOtvCBGlT0\", \".....\" },\n  { \"$md5,rounds=12$1xMeE.at$x\", \"$md5,rounds=12$1xMeE.at$15KPM/GLKsO9YOtvCBGlT0\", \".....\" },\n  { \"$md5,rounds=12$1xMeE.at$\", \"$md5,rounds=12$1xMeE.at$$BGQbBwo7kyWiiBgxvqMXc/\", \".....\" },\n  { \"$md5,rounds=12$1xMeE.at$$\", \"$md5,rounds=12$1xMeE.at$$BGQbBwo7kyWiiBgxvqMXc/\", \".....\" },\n  { \"$md5$9ZLwtuTO\", \"$md5$9ZLwtuTO$4eWbNuqnNqnGcXTDwhjpQ.\", \"\\xa3\" },\n  { \"$md5$9ZLwtuTO$x\", \"$md5$9ZLwtuTO$4eWbNuqnNqnGcXTDwhjpQ.\", \"\\xa3\" },\n  { \"$md5$9ZLwtuTO$\", \"$md5$9ZLwtuTO$$/pCVufpCfnzsvoBuBrf260\", \"\\xa3\" },\n  { \"$md5$9ZLwtuTO$$\", \"$md5$9ZLwtuTO$$/pCVufpCfnzsvoBuBrf260\", \"\\xa3\" },\n  { \"$md5$1xMeE.at\", \"$md5$1xMeE.at$io2qnLbEYGZO1aznIsCzC1\", \"\\xa3\" },\n  { \"$md5$1xMeE.at$x\", \"$md5$1xMeE.at$io2qnLbEYGZO1aznIsCzC1\", \"\\xa3\" },\n  { \"$md5$1xMeE.at$\", \"$md5$1xMeE.at$$ZvXaZoaKNm1kAe7GrBT7J0\", \"\\xa3\" },\n  { \"$md5$1xMeE.at$$\", \"$md5$1xMeE.at$$ZvXaZoaKNm1kAe7GrBT7J0\", \"\\xa3\" },\n  { \"$md5,rounds=12$9ZLwtuTO\", \"$md5,rounds=12$9ZLwtuTO$Un3SaDBXf8b6MMft7KPPU.\", \"\\xa3\" },\n  { \"$md5,rounds=12$9ZLwtuTO$x\", \"$md5,rounds=12$9ZLwtuTO$Un3SaDBXf8b6MMft7KPPU.\", \"\\xa3\" },\n  { \"$md5,rounds=12$9ZLwtuTO$\", \"$md5,rounds=12$9ZLwtuTO$$rKU2FWNPm4g1kGGeh4chO1\", \"\\xa3\" },\n  { \"$md5,rounds=12$9ZLwtuTO$$\", \"$md5,rounds=12$9ZLwtuTO$$rKU2FWNPm4g1kGGeh4chO1\", \"\\xa3\" },\n  { \"$md5,rounds=12$1xMeE.at\", \"$md5,rounds=12$1xMeE.at$1wncUZbGNo9olsRuFJbUg1\", \"\\xa3\" },\n  { \"$md5,rounds=12$1xMeE.at$x\", \"$md5,rounds=12$1xMeE.at$1wncUZbGNo9olsRuFJbUg1\", \"\\xa3\" },\n  { \"$md5,rounds=12$1xMeE.at$\", \"$md5,rounds=12$1xMeE.at$$UBeMARFRPJhnRA3MCSZ7R0\", \"\\xa3\" },\n  { \"$md5,rounds=12$1xMeE.at$$\", \"$md5,rounds=12$1xMeE.at$$UBeMARFRPJhnRA3MCSZ7R0\", \"\\xa3\" },\n  { \"$md5$9ZLwtuTO\", \"$md5$9ZLwtuTO$KPChp6qUra6Z7AgmXUPze.\", \"\\xa3\"\"a\" },\n  { \"$md5$9ZLwtuTO$x\", \"$md5$9ZLwtuTO$KPChp6qUra6Z7AgmXUPze.\", \"\\xa3\"\"a\" },\n  { \"$md5$9ZLwtuTO$\", \"$md5$9ZLwtuTO$$tf07EYBIjQKctFrlUgSKj.\", \"\\xa3\"\"a\" },\n  { \"$md5$9ZLwtuTO$$\", \"$md5$9ZLwtuTO$$tf07EYBIjQKctFrlUgSKj.\", \"\\xa3\"\"a\" },\n  { \"$md5$1xMeE.at\", \"$md5$1xMeE.at$McbSOwVJjbwQh7Ow9KTG3.\", \"\\xa3\"\"a\" },\n  { \"$md5$1xMeE.at$x\", \"$md5$1xMeE.at$McbSOwVJjbwQh7Ow9KTG3.\", \"\\xa3\"\"a\" },\n  { \"$md5$1xMeE.at$\", \"$md5$1xMeE.at$$sI7MjZFAaI7aHFev6hsH11\", \"\\xa3\"\"a\" },\n  { \"$md5$1xMeE.at$$\", \"$md5$1xMeE.at$$sI7MjZFAaI7aHFev6hsH11\", \"\\xa3\"\"a\" },\n  { \"$md5,rounds=12$9ZLwtuTO\", \"$md5,rounds=12$9ZLwtuTO$oP20mOeOzcSWx5PF8OynY0\", \"\\xa3\"\"a\" },\n  { \"$md5,rounds=12$9ZLwtuTO$x\", \"$md5,rounds=12$9ZLwtuTO$oP20mOeOzcSWx5PF8OynY0\", \"\\xa3\"\"a\" },\n  { \"$md5,rounds=12$9ZLwtuTO$\", \"$md5,rounds=12$9ZLwtuTO$$fxT55wdIKcu1I6I/L7Rgw/\", \"\\xa3\"\"a\" },\n  { \"$md5,rounds=12$9ZLwtuTO$$\", \"$md5,rounds=12$9ZLwtuTO$$fxT55wdIKcu1I6I/L7Rgw/\", \"\\xa3\"\"a\" },\n  { \"$md5,rounds=12$1xMeE.at\", \"$md5,rounds=12$1xMeE.at$3P5H7GuGErAOPB9JI/9.d0\", \"\\xa3\"\"a\" },\n  { \"$md5,rounds=12$1xMeE.at$x\", \"$md5,rounds=12$1xMeE.at$3P5H7GuGErAOPB9JI/9.d0\", \"\\xa3\"\"a\" },\n  { \"$md5,rounds=12$1xMeE.at$\", \"$md5,rounds=12$1xMeE.at$$cxDjtvfWEWwuVcB.G0GpX/\", \"\\xa3\"\"a\" },\n  { \"$md5,rounds=12$1xMeE.at$$\", \"$md5,rounds=12$1xMeE.at$$cxDjtvfWEWwuVcB.G0GpX/\", \"\\xa3\"\"a\" },\n  { \"$md5$9ZLwtuTO\", \"$md5$9ZLwtuTO$WT2EmPo/of6AlJKDUGdFn0\", \"\\xd1\\x91\" },\n  { \"$md5$9ZLwtuTO$x\", \"$md5$9ZLwtuTO$WT2EmPo/of6AlJKDUGdFn0\", \"\\xd1\\x91\" },\n  { \"$md5$9ZLwtuTO$\", \"$md5$9ZLwtuTO$$w6b8PqRIPHXTFoIr3z6bS1\", \"\\xd1\\x91\" },\n  { \"$md5$9ZLwtuTO$$\", \"$md5$9ZLwtuTO$$w6b8PqRIPHXTFoIr3z6bS1\", \"\\xd1\\x91\" },\n  { \"$md5$1xMeE.at\", \"$md5$1xMeE.at$zK/fZmp2D0rPfe1qM9fFw.\", \"\\xd1\\x91\" },\n  { \"$md5$1xMeE.at$x\", \"$md5$1xMeE.at$zK/fZmp2D0rPfe1qM9fFw.\", \"\\xd1\\x91\" },\n  { \"$md5$1xMeE.at$\", \"$md5$1xMeE.at$$X2BVd4NtkuyzM6cnzmRqV.\", \"\\xd1\\x91\" },\n  { \"$md5$1xMeE.at$$\", \"$md5$1xMeE.at$$X2BVd4NtkuyzM6cnzmRqV.\", \"\\xd1\\x91\" },\n  { \"$md5,rounds=12$9ZLwtuTO\", \"$md5,rounds=12$9ZLwtuTO$uNPVV/sftb.VJ6lsFa7D3.\", \"\\xd1\\x91\" },\n  { \"$md5,rounds=12$9ZLwtuTO$x\", \"$md5,rounds=12$9ZLwtuTO$uNPVV/sftb.VJ6lsFa7D3.\", \"\\xd1\\x91\" },\n  { \"$md5,rounds=12$9ZLwtuTO$\", \"$md5,rounds=12$9ZLwtuTO$$s6Tt81LbN8fGUEEddqiuV.\", \"\\xd1\\x91\" },\n  { \"$md5,rounds=12$9ZLwtuTO$$\", \"$md5,rounds=12$9ZLwtuTO$$s6Tt81LbN8fGUEEddqiuV.\", \"\\xd1\\x91\" },\n  { \"$md5,rounds=12$1xMeE.at\", \"$md5,rounds=12$1xMeE.at$W01/eDPaIwJcNRxPVtPma/\", \"\\xd1\\x91\" },\n  { \"$md5,rounds=12$1xMeE.at$x\", \"$md5,rounds=12$1xMeE.at$W01/eDPaIwJcNRxPVtPma/\", \"\\xd1\\x91\" },\n  { \"$md5,rounds=12$1xMeE.at$\", \"$md5,rounds=12$1xMeE.at$$5wP6g38bLMarRh23OoD7A/\", \"\\xd1\\x91\" },\n  { \"$md5,rounds=12$1xMeE.at$$\", \"$md5,rounds=12$1xMeE.at$$5wP6g38bLMarRh23OoD7A/\", \"\\xd1\\x91\" },\n  { \"$md5$9ZLwtuTO\", \"$md5$9ZLwtuTO$1jWZgfH86Iovpv/wyloQ00\", \"\\xa3\"\"ab\" },\n  { \"$md5$9ZLwtuTO$x\", \"$md5$9ZLwtuTO$1jWZgfH86Iovpv/wyloQ00\", \"\\xa3\"\"ab\" },\n  { \"$md5$9ZLwtuTO$\", \"$md5$9ZLwtuTO$$9uuQD6WEaN/IKu3gN6JVL0\", \"\\xa3\"\"ab\" },\n  { \"$md5$9ZLwtuTO$$\", \"$md5$9ZLwtuTO$$9uuQD6WEaN/IKu3gN6JVL0\", \"\\xa3\"\"ab\" },\n  { \"$md5$1xMeE.at\", \"$md5$1xMeE.at$Qqr.jTCkLhbShdBLf9rNF/\", \"\\xa3\"\"ab\" },\n  { \"$md5$1xMeE.at$x\", \"$md5$1xMeE.at$Qqr.jTCkLhbShdBLf9rNF/\", \"\\xa3\"\"ab\" },\n  { \"$md5$1xMeE.at$\", \"$md5$1xMeE.at$$iFg0LwUaGTqVCvKSQjOVZ.\", \"\\xa3\"\"ab\" },\n  { \"$md5$1xMeE.at$$\", \"$md5$1xMeE.at$$iFg0LwUaGTqVCvKSQjOVZ.\", \"\\xa3\"\"ab\" },\n  { \"$md5,rounds=12$9ZLwtuTO\", \"$md5,rounds=12$9ZLwtuTO$PsYRtwkUg9hCqv4O/yE/g0\", \"\\xa3\"\"ab\" },\n  { \"$md5,rounds=12$9ZLwtuTO$x\", \"$md5,rounds=12$9ZLwtuTO$PsYRtwkUg9hCqv4O/yE/g0\", \"\\xa3\"\"ab\" },\n  { \"$md5,rounds=12$9ZLwtuTO$\", \"$md5,rounds=12$9ZLwtuTO$$jNkQvHOp7dK4GxR6p6HUV.\", \"\\xa3\"\"ab\" },\n  { \"$md5,rounds=12$9ZLwtuTO$$\", \"$md5,rounds=12$9ZLwtuTO$$jNkQvHOp7dK4GxR6p6HUV.\", \"\\xa3\"\"ab\" },\n  { \"$md5,rounds=12$1xMeE.at\", \"$md5,rounds=12$1xMeE.at$LH7wvRqMe7/knajmqVeOK/\", \"\\xa3\"\"ab\" },\n  { \"$md5,rounds=12$1xMeE.at$x\", \"$md5,rounds=12$1xMeE.at$LH7wvRqMe7/knajmqVeOK/\", \"\\xa3\"\"ab\" },\n  { \"$md5,rounds=12$1xMeE.at$\", \"$md5,rounds=12$1xMeE.at$$EjVNn27w7Xnq/qnXqeJT50\", \"\\xa3\"\"ab\" },\n  { \"$md5,rounds=12$1xMeE.at$$\", \"$md5,rounds=12$1xMeE.at$$EjVNn27w7Xnq/qnXqeJT50\", \"\\xa3\"\"ab\" },\n  { \"$md5$9ZLwtuTO\", \"$md5$9ZLwtuTO$Zazx59BEvPwTWLZy3AovQ/\", \"\\xff\\xff\\xa3\" },\n  { \"$md5$9ZLwtuTO$x\", \"$md5$9ZLwtuTO$Zazx59BEvPwTWLZy3AovQ/\", \"\\xff\\xff\\xa3\" },\n  { \"$md5$9ZLwtuTO$\", \"$md5$9ZLwtuTO$$DgtKjVqffMoOKKn08dTZ10\", \"\\xff\\xff\\xa3\" },\n  { \"$md5$9ZLwtuTO$$\", \"$md5$9ZLwtuTO$$DgtKjVqffMoOKKn08dTZ10\", \"\\xff\\xff\\xa3\" },\n  { \"$md5$1xMeE.at\", \"$md5$1xMeE.at$T5U9upsDgtz2ooRAz7M3k0\", \"\\xff\\xff\\xa3\" },\n  { \"$md5$1xMeE.at$x\", \"$md5$1xMeE.at$T5U9upsDgtz2ooRAz7M3k0\", \"\\xff\\xff\\xa3\" },\n  { \"$md5$1xMeE.at$\", \"$md5$1xMeE.at$$yRTEPdMa6RMxlpzNCrWVG0\", \"\\xff\\xff\\xa3\" },\n  { \"$md5$1xMeE.at$$\", \"$md5$1xMeE.at$$yRTEPdMa6RMxlpzNCrWVG0\", \"\\xff\\xff\\xa3\" },\n  { \"$md5,rounds=12$9ZLwtuTO\", \"$md5,rounds=12$9ZLwtuTO$sVNjo.XG1R8l4.kYkDSYW0\", \"\\xff\\xff\\xa3\" },\n  { \"$md5,rounds=12$9ZLwtuTO$x\", \"$md5,rounds=12$9ZLwtuTO$sVNjo.XG1R8l4.kYkDSYW0\", \"\\xff\\xff\\xa3\" },\n  { \"$md5,rounds=12$9ZLwtuTO$\", \"$md5,rounds=12$9ZLwtuTO$$C9a8tTmZrw/Wem4ogPmZy/\", \"\\xff\\xff\\xa3\" },\n  { \"$md5,rounds=12$9ZLwtuTO$$\", \"$md5,rounds=12$9ZLwtuTO$$C9a8tTmZrw/Wem4ogPmZy/\", \"\\xff\\xff\\xa3\" },\n  { \"$md5,rounds=12$1xMeE.at\", \"$md5,rounds=12$1xMeE.at$Y075WrJYAWhG6guZuv5D41\", \"\\xff\\xff\\xa3\" },\n  { \"$md5,rounds=12$1xMeE.at$x\", \"$md5,rounds=12$1xMeE.at$Y075WrJYAWhG6guZuv5D41\", \"\\xff\\xff\\xa3\" },\n  { \"$md5,rounds=12$1xMeE.at$\", \"$md5,rounds=12$1xMeE.at$$ErT1cNHJcz36fhkIXUijY.\", \"\\xff\\xff\\xa3\" },\n  { \"$md5,rounds=12$1xMeE.at$$\", \"$md5,rounds=12$1xMeE.at$$ErT1cNHJcz36fhkIXUijY.\", \"\\xff\\xff\\xa3\" },\n  { \"$md5$9ZLwtuTO\", \"$md5$9ZLwtuTO$CfW3l.cN55ZMihBMn1M0//\", \"1\\xa3\"\"345\" },\n  { \"$md5$9ZLwtuTO$x\", \"$md5$9ZLwtuTO$CfW3l.cN55ZMihBMn1M0//\", \"1\\xa3\"\"345\" },\n  { \"$md5$9ZLwtuTO$\", \"$md5$9ZLwtuTO$$7OhaV2/cpeu0122zI9.xD1\", \"1\\xa3\"\"345\" },\n  { \"$md5$9ZLwtuTO$$\", \"$md5$9ZLwtuTO$$7OhaV2/cpeu0122zI9.xD1\", \"1\\xa3\"\"345\" },\n  { \"$md5$1xMeE.at\", \"$md5$1xMeE.at$Gnr1Y2lfuUEgrpgf.cERI.\", \"1\\xa3\"\"345\" },\n  { \"$md5$1xMeE.at$x\", \"$md5$1xMeE.at$Gnr1Y2lfuUEgrpgf.cERI.\", \"1\\xa3\"\"345\" },\n  { \"$md5$1xMeE.at$\", \"$md5$1xMeE.at$$FlohIbjBnn3FIzAgwsxNv0\", \"1\\xa3\"\"345\" },\n  { \"$md5$1xMeE.at$$\", \"$md5$1xMeE.at$$FlohIbjBnn3FIzAgwsxNv0\", \"1\\xa3\"\"345\" },\n  { \"$md5,rounds=12$9ZLwtuTO\", \"$md5,rounds=12$9ZLwtuTO$me1BsjWhTFyWZ4VVIJXXw.\", \"1\\xa3\"\"345\" },\n  { \"$md5,rounds=12$9ZLwtuTO$x\", \"$md5,rounds=12$9ZLwtuTO$me1BsjWhTFyWZ4VVIJXXw.\", \"1\\xa3\"\"345\" },\n  { \"$md5,rounds=12$9ZLwtuTO$\", \"$md5,rounds=12$9ZLwtuTO$$BhSJNaupgjz.UV5ibT/YY0\", \"1\\xa3\"\"345\" },\n  { \"$md5,rounds=12$9ZLwtuTO$$\", \"$md5,rounds=12$9ZLwtuTO$$BhSJNaupgjz.UV5ibT/YY0\", \"1\\xa3\"\"345\" },\n  { \"$md5,rounds=12$1xMeE.at\", \"$md5,rounds=12$1xMeE.at$YJe36.Z6aj/iIl5b0qWNh0\", \"1\\xa3\"\"345\" },\n  { \"$md5,rounds=12$1xMeE.at$x\", \"$md5,rounds=12$1xMeE.at$YJe36.Z6aj/iIl5b0qWNh0\", \"1\\xa3\"\"345\" },\n  { \"$md5,rounds=12$1xMeE.at$\", \"$md5,rounds=12$1xMeE.at$$mBIVMuKh9RF281HXN1Imj/\", \"1\\xa3\"\"345\" },\n  { \"$md5,rounds=12$1xMeE.at$$\", \"$md5,rounds=12$1xMeE.at$$mBIVMuKh9RF281HXN1Imj/\", \"1\\xa3\"\"345\" },\n  { \"$md5$9ZLwtuTO\", \"$md5$9ZLwtuTO$8MwfBX7DAEO587BHA9X9q.\", \"\\xff\\xa3\"\"345\" },\n  { \"$md5$9ZLwtuTO$x\", \"$md5$9ZLwtuTO$8MwfBX7DAEO587BHA9X9q.\", \"\\xff\\xa3\"\"345\" },\n  { \"$md5$9ZLwtuTO$\", \"$md5$9ZLwtuTO$$RqcR1gku7duuWbyp25es20\", \"\\xff\\xa3\"\"345\" },\n  { \"$md5$9ZLwtuTO$$\", \"$md5$9ZLwtuTO$$RqcR1gku7duuWbyp25es20\", \"\\xff\\xa3\"\"345\" },\n  { \"$md5$1xMeE.at\", \"$md5$1xMeE.at$uBZHyzyNGSOPzRmTOJl3I1\", \"\\xff\\xa3\"\"345\" },\n  { \"$md5$1xMeE.at$x\", \"$md5$1xMeE.at$uBZHyzyNGSOPzRmTOJl3I1\", \"\\xff\\xa3\"\"345\" },\n  { \"$md5$1xMeE.at$\", \"$md5$1xMeE.at$$MzXAxvcW9l4TsmCyW1BWo.\", \"\\xff\\xa3\"\"345\" },\n  { \"$md5$1xMeE.at$$\", \"$md5$1xMeE.at$$MzXAxvcW9l4TsmCyW1BWo.\", \"\\xff\\xa3\"\"345\" },\n  { \"$md5,rounds=12$9ZLwtuTO\", \"$md5,rounds=12$9ZLwtuTO$2anjs2wDZkVUCFBAXxGEe1\", \"\\xff\\xa3\"\"345\" },\n  { \"$md5,rounds=12$9ZLwtuTO$x\", \"$md5,rounds=12$9ZLwtuTO$2anjs2wDZkVUCFBAXxGEe1\", \"\\xff\\xa3\"\"345\" },\n  { \"$md5,rounds=12$9ZLwtuTO$\", \"$md5,rounds=12$9ZLwtuTO$$OfNzaWssbxHD4uOSr/Ww7/\", \"\\xff\\xa3\"\"345\" },\n  { \"$md5,rounds=12$9ZLwtuTO$$\", \"$md5,rounds=12$9ZLwtuTO$$OfNzaWssbxHD4uOSr/Ww7/\", \"\\xff\\xa3\"\"345\" },\n  { \"$md5,rounds=12$1xMeE.at\", \"$md5,rounds=12$1xMeE.at$mNSwJceKLy6so7ro3q0rJ0\", \"\\xff\\xa3\"\"345\" },\n  { \"$md5,rounds=12$1xMeE.at$x\", \"$md5,rounds=12$1xMeE.at$mNSwJceKLy6so7ro3q0rJ0\", \"\\xff\\xa3\"\"345\" },\n  { \"$md5,rounds=12$1xMeE.at$\", \"$md5,rounds=12$1xMeE.at$$eaj6Hm2IJUm4OnUgJ3h0h0\", \"\\xff\\xa3\"\"345\" },\n  { \"$md5,rounds=12$1xMeE.at$$\", \"$md5,rounds=12$1xMeE.at$$eaj6Hm2IJUm4OnUgJ3h0h0\", \"\\xff\\xa3\"\"345\" },\n  { \"$md5$9ZLwtuTO\", \"$md5$9ZLwtuTO$5R/cG4CL2Lmc7wTf155mh.\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has forgotten.\" },\n  { \"$md5$9ZLwtuTO$x\", \"$md5$9ZLwtuTO$5R/cG4CL2Lmc7wTf155mh.\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has forgotten.\" },\n  { \"$md5$9ZLwtuTO$\", \"$md5$9ZLwtuTO$$FToplDYTms/5PNpWJoMLH/\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has forgotten.\" },\n  { \"$md5$9ZLwtuTO$$\", \"$md5$9ZLwtuTO$$FToplDYTms/5PNpWJoMLH/\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has forgotten.\" },\n  { \"$md5$1xMeE.at\", \"$md5$1xMeE.at$IHEADoNqjSYpSCy2mz1Z61\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has forgotten.\" },\n  { \"$md5$1xMeE.at$x\", \"$md5$1xMeE.at$IHEADoNqjSYpSCy2mz1Z61\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has forgotten.\" },\n  { \"$md5$1xMeE.at$\", \"$md5$1xMeE.at$$KmAqE3KH7rI83mi9/l1HL1\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has forgotten.\" },\n  { \"$md5$1xMeE.at$$\", \"$md5$1xMeE.at$$KmAqE3KH7rI83mi9/l1HL1\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has forgotten.\" },\n  { \"$md5,rounds=12$9ZLwtuTO\", \"$md5,rounds=12$9ZLwtuTO$UszC7.KA9XJuDuCoSl0at/\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has forgotten.\" },\n  { \"$md5,rounds=12$9ZLwtuTO$x\", \"$md5,rounds=12$9ZLwtuTO$UszC7.KA9XJuDuCoSl0at/\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has forgotten.\" },\n  { \"$md5,rounds=12$9ZLwtuTO$\", \"$md5,rounds=12$9ZLwtuTO$$NkpjxR6Wx0t1JVt7WwoOe1\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has forgotten.\" },\n  { \"$md5,rounds=12$9ZLwtuTO$$\", \"$md5,rounds=12$9ZLwtuTO$$NkpjxR6Wx0t1JVt7WwoOe1\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has forgotten.\" },\n  { \"$md5,rounds=12$1xMeE.at\", \"$md5,rounds=12$1xMeE.at$6PwhEnzhej3fHkbxg1BI/1\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has forgotten.\" },\n  { \"$md5,rounds=12$1xMeE.at$x\", \"$md5,rounds=12$1xMeE.at$6PwhEnzhej3fHkbxg1BI/1\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has forgotten.\" },\n  { \"$md5,rounds=12$1xMeE.at$\", \"$md5,rounds=12$1xMeE.at$$2o/WzMcgZgIP10gFnPSzQ1\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has forgotten.\" },\n  { \"$md5,rounds=12$1xMeE.at$$\", \"$md5,rounds=12$1xMeE.at$$2o/WzMcgZgIP10gFnPSzQ1\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has forgotten.\" },\n#endif // sunmd5\n\n#if INCLUDE_yescrypt && defined TEST_yescrypt\n  { \"$y$j75$.......\", \"$y$j75$.......$/FQush7wojITE6a6KwAF4pUyKZAyYRCYJdWcgqjTeS7\", \"\" },\n  { \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.$tUlUF19mIl6XpRTpX7LBp5ABKS8KSmDfP1gXFrZ6Sy8\", \"\" },\n  { \"$y$j85$.......\", \"$y$j85$.......$zzMmbb9N2eIInsJNTpiAwUZmq5hS27wfdyT35REbpjC\", \"\" },\n  { \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.$vBgoYm4d1h/QcOpqPPYz9LsGfXN2mCFVKmYuethZ796\", \"\" },\n  { \"$y$j75$.......\", \"$y$j75$.......$7sY4klKrG.spYAfDnzO4mVv8pcnkbXLPbRu8mK9c3OB\", \" \" },\n  { \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.$.dXU3P0B6GfV.ZuQ4Pj37gi.zJoXsLmh72N97I5Lcs4\", \" \" },\n  { \"$y$j85$.......\", \"$y$j85$.......$3ZhDisMLJc4kpXpEASNG2.tW0yVgZuSEXLUoxU.jhGD\", \" \" },\n  { \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.$xX8BSaIr7LnZUNhO1aTOEgBaSrWDc8dpOnxgOYhMhjA\", \" \" },\n  { \"$y$j75$.......\", \"$y$j75$.......$Azb4unskovkivqV5L2S5ovdEGpbGNKmfaJnP.BqXgm3\", \"a\" },\n  { \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.$Ve4m3xXQj6CIT78tSP/FDzNIam38Z/rZlUFmHwBcrhD\", \"a\" },\n  { \"$y$j85$.......\", \"$y$j85$.......$f6ebtuCjkC8UHFeQayofExxwYwu79YFyIOXOkA5Mus8\", \"a\" },\n  { \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.$8/.fVqeICb7tzbG/qB1LWS8JeaEzOWqFEeMNYgITxs4\", \"a\" },\n  { \"$y$j75$.......\", \"$y$j75$.......$m4cnrAlrqwYwXTENdmME1U8Wut80qJVbP/Pawl5Ocn/\", \"ab\" },\n  { \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.$JfUZqvntjL1uH381/J1Dd/5aJZdD1CWWWpfsPNLm5d.\", \"ab\" },\n  { \"$y$j85$.......\", \"$y$j85$.......$ih6Nb7ewCX4QP6ez/CGjxHkbQHbEUZHji6.wYP9P8vC\", \"ab\" },\n  { \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.$r1hlKf7zyDI/l/WXaO43BRD2R4dd7R9bUVuWr39W3V1\", \"ab\" },\n  { \"$y$j75$.......\", \"$y$j75$.......$stbr2M6i8w/SU36N/.i6VVEHCMYG2OkDpj/I1wKYZC4\", \"abc\" },\n  { \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.$aN8IREm4mVoXwP2ZkEbfFinwVjML6Krr5zkB50rSJX3\", \"abc\" },\n  { \"$y$j85$.......\", \"$y$j85$.......$OmeNRbjUy/kse/kx039zqvnLEcMwpvMsRr/MKAccHW0\", \"abc\" },\n  { \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.$UvuqvbTEtM2tjSx4PNDuWDTu7ZH82t51dznnOS5InOD\", \"abc\" },\n  { \"$y$j75$.......\", \"$y$j75$.......$B9odMQM/B2QLVLHfsJEC5lAgv3j/JVoUzO6rSxbqEDA\", \"U*U\" },\n  { \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.$qg5uCaJyN9mqNwXudbDtC1qEOS/SINLqwjTdEN5xk52\", \"U*U\" },\n  { \"$y$j85$.......\", \"$y$j85$.......$.mv3bVd1BEBrjfj.7o6SNMXo7F./76n9r7sfp02/rDA\", \"U*U\" },\n  { \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.$kR.1Y8IoXykHJ.i8QnvTf2TYwxwkBPetGGV.3ViURz5\", \"U*U\" },\n  { \"$y$j75$.......\", \"$y$j75$.......$6H1Mg4EQDxxqJ0GHtMNRrbONT4LwKO.gjTFIkVuOj71\", \"U*U*\" },\n  { \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.$7cch1Te3ie5Hyrj.cx6OJEtD5GucuHML1.VC1Ws/KP3\", \"U*U*\" },\n  { \"$y$j85$.......\", \"$y$j85$.......$YiwOtfXn1QOC30s0ASMEsMWPRVoaaFpLgDg27gzvmD9\", \"U*U*\" },\n  { \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.$6fM8sVHyWF77ZlxmtO5CWutdCipgcQJL4fEABM7rrR4\", \"U*U*\" },\n  { \"$y$j75$.......\", \"$y$j75$.......$PACNP8rgVa3N4PjCnsU1y/LaaSLDczCtvx4SVoeAKfC\", \"U*U*U\" },\n  { \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.$Zmsp/YP9Syl0F8xHwa16Yj09NnetFlH90LPtUmVTQkA\", \"U*U*U\" },\n  { \"$y$j85$.......\", \"$y$j85$.......$T94HJZtQZS89indO6tpwqWsG6lz2j1cDtwNBSkp.ga5\", \"U*U*U\" },\n  { \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.$owrjAyK5Mj2kmFTp4wY.8rGcgnms6S9Cc7bnKJhaSf1\", \"U*U*U\" },\n  { \"$y$j75$.......\", \"$y$j75$.......$ZCBDDwUvZmAYolgFx0dEOG.xddgO9j2kCik0j/cfp3.\", \".....\" },\n  { \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.$ZBCjHl.chaOfX8R7SQSSgmjqcbrScEj2RG2Fv0OiyK3\", \".....\" },\n  { \"$y$j85$.......\", \"$y$j85$.......$Era/o8syD90O.jxu00Rd53DBW.2Y0Cv3DjYEpbO9hh.\", \".....\" },\n  { \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.$sHtH6IOD2QxYnWK82wGJaoDoXk1M0eQt9l2fUbqtzW8\", \".....\" },\n  { \"$y$j75$.......\", \"$y$j75$.......$gMy/pYNgzmP49aAL5urUtAK1W.9qMlMJOFZY9tMlYA3\", \"dragon\" },\n  { \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.$KdzgkknR77mrk3X5yAUt9w27j3DuAmnAhuFZy7MAY5C\", \"dragon\" },\n  { \"$y$j85$.......\", \"$y$j85$.......$U3/SnDOqn1VP6YIo4SwaJ0Uy7w4WKrMQoUZZ2ddBN49\", \"dragon\" },\n  { \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.$0LxVYF3PFv8KyPej3fau.J8QjrXe/fqj8G2Uh9YzzdC\", \"dragon\" },\n  { \"$y$j75$.......\", \"$y$j75$.......$wIiGAotJxWMKSkSsp/a.F9I9wITKTH4/cqdbTd58uS1\", \"dRaGoN\" },\n  { \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.$8pqiZU8Sjpl/msFkwFTpOjK/P9yGxUvn77/Yme7cAX4\", \"dRaGoN\" },\n  { \"$y$j85$.......\", \"$y$j85$.......$r92bon9zT3D/KRtNB8GmoC7Oo/.Kwz0NlxsPpK0ExiA\", \"dRaGoN\" },\n  { \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.$gN4fCUcA71HcJYqNCOumS8eQ0suSmd.FPkVc8SkcJE8\", \"dRaGoN\" },\n  { \"$y$j75$.......\", \"$y$j75$.......$RvCYhfAxJV1IiYGsthaHTYADdH2G0apxqjz7oiN.Ay6\", \"DrAgOn\" },\n  { \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.$sT37jX9RwF/E9NiESFgm15cssiiqnmh9F880./vz4k2\", \"DrAgOn\" },\n  { \"$y$j85$.......\", \"$y$j85$.......$rLtG.1kRrOgsaFU7xyyZoKNy0lPRiYMhPPf0AksWSq1\", \"DrAgOn\" },\n  { \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.$/SMJ.RHHu4oox6zfaZv8MeJGf9J6WqZFo3fbrXchSU3\", \"DrAgOn\" },\n  { \"$y$j75$.......\", \"$y$j75$.......$yhucF/AHPHoRCo1pyB/8HqUUknh9Qha5XwmRSWNbzW1\", \"PAROLX\" },\n  { \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.$n6LGRqxG1dss0ne03lEh7N9rSUow3ZqvN5Y9q8ykqw8\", \"PAROLX\" },\n  { \"$y$j85$.......\", \"$y$j85$.......$B7kWn3cIqxkpygmYyPsFqt7viJEo/VWOo4NjXkygBV9\", \"PAROLX\" },\n  { \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.$/tu1HvJEfH69pHd8ucinYj66VDfkWFsZMRsircZ2Zf5\", \"PAROLX\" },\n  { \"$y$j75$.......\", \"$y$j75$.......$5f/J7kwHfEmgNwiDTvlgW.ogkFEg0co85dGb1Y3alz4\", \"U*U***U\" },\n  { \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.$iq6o7U49bdvwtT4YtG1so.gK2G3XxNycAxLrG.l7Yi4\", \"U*U***U\" },\n  { \"$y$j85$.......\", \"$y$j85$.......$2DN0XilWmbEVeUjKnBH6YVKFCRapOi6lzuIpvk6QpOB\", \"U*U***U\" },\n  { \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.$2MhtXIjJe46l4UzEvM8DqE9kwUiXYJ4xOmB0do/mD/.\", \"U*U***U\" },\n  { \"$y$j75$.......\", \"$y$j75$.......$Oexrj8H2hVMPS6roqSJDmrInWLzlOjFgLmuxXm8Qqm5\", \"abcdefg\" },\n  { \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.$Ptc/JaF9eGbpjwj/kdmJVh41nUZ6r68e.9S84trDA2D\", \"abcdefg\" },\n  { \"$y$j85$.......\", \"$y$j85$.......$68kILCeYp.dC4HBZonpV74zWphydKMQPNe.PfGKj0S5\", \"abcdefg\" },\n  { \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.$zrhv2ITCB/LYe7wrMLRga2j5jD4dmY0kyKqx2fba.K4\", \"abcdefg\" },\n  { \"$y$j75$.......\", \"$y$j75$.......$vSDAeHx9Q8hfWNYhDdS/ADenNchyIyWKsORm0p9poOC\", \"01234567\" },\n  { \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.$vrF.0OiBfLX6jtDOQfdX5erkqiw3qpWROI.v/S6SHt.\", \"01234567\" },\n  { \"$y$j85$.......\", \"$y$j85$.......$tILMEe8DtVt9VeilMONf4KbYPQGiUXu2G6OI2dv3cz4\", \"01234567\" },\n  { \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.$lRmA/CtQri0iW/hHOTzQewNaXCDz/bh7JP.StYQmrfD\", \"01234567\" },\n  { \"$y$j75$.......\", \"$y$j75$.......$rFyadMjTjbpLQ3Amr8FdGSPDkj8ty0xjC.5/3SLzcjB\", \"726 even\" },\n  { \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.$k4dSODsKeobDaJRbXpRTR3.qL1rJq0dUdmoJhS4HztC\", \"726 even\" },\n  { \"$y$j85$.......\", \"$y$j85$.......$R/Ecl7fBdNbKFnkIt2SwwXwftNoP01nO9VL5rMrVPC1\", \"726 even\" },\n  { \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.$VRXkfdzwZXHcV4GA.ssGwrNPxD2TKzbhlPnZkwUvCa8\", \"726 even\" },\n  { \"$y$j75$.......\", \"$y$j75$.......$bwGnlPJcAaFY7QiJtQEzLFeGVd.ZOJxegBPFVTPV8j5\", \"zyxwvuts\" },\n  { \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.$B1Dn5/XFjZtl5m/6QQGgMXKU2YjIfn55mTp/1dhNzgA\", \"zyxwvuts\" },\n  { \"$y$j85$.......\", \"$y$j85$.......$XhOpt.z.U.rCweV4yA9B6ZOc2iQWDG.VuCFnUhIwOH0\", \"zyxwvuts\" },\n  { \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.$31GHnkn.dYKV8no..z48s0nnKE7Q5nHkEyZjSTcHzL.\", \"zyxwvuts\" },\n  { \"$y$j75$.......\", \"$y$j75$.......$/28Hn95nD3Xrq3C8IlfTCmyqtC0RMo6sAa3OnQ0zdD5\", \"ab1234567\" },\n  { \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.$8A9gon1kngVBk3LhZMKKU9L4I2dEahDdH9YfPBLocW2\", \"ab1234567\" },\n  { \"$y$j85$.......\", \"$y$j85$.......$Gi5SrS5hrVX3i7heJ7p0pDJZw99B6/Y/8VWSqRi7k4/\", \"ab1234567\" },\n  { \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.$FV0XuI6Wd3lRtW6K8kHISEH5kQd4G/wtm26yJK9Onr5\", \"ab1234567\" },\n  { \"$y$j75$.......\", \"$y$j75$.......$uh/6GkXW.YnzFYoZB41fmhtce4MEJ3FqANOq1QG0RG6\", \"alexander\" },\n  { \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.$BDKkgFmTj5KY.hH4CWNzbSKQRHpBZ3aiPLMVaC1LgfC\", \"alexander\" },\n  { \"$y$j85$.......\", \"$y$j85$.......$PYRih1z.MBBKh/VYlBzOSmD3nCREwnwogWQjFa/Emf9\", \"alexander\" },\n  { \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.$VM/zNStijfS5BuBdaEYTF6nh5DOEKzAdjFlfTP/55cB\", \"alexander\" },\n  { \"$y$j75$.......\", \"$y$j75$.......$wsnn8OuvATBVLwg6JEr36FgStoNAJM0pzn0tBwlaZy3\", \"beautiful\" },\n  { \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.$J3VqPVfvnWXlEFe7FhqBINV4.hIuXSs.RaZfRCR04lC\", \"beautiful\" },\n  { \"$y$j85$.......\", \"$y$j85$.......$UCtZe/e4AQM6MXCP2kZyynmkvYUo3SQy4Ziq9ivE2S7\", \"beautiful\" },\n  { \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.$lptRgOFZYFJrayM07farXlKG4X932yV3LbggAohzUH2\", \"beautiful\" },\n  { \"$y$j75$.......\", \"$y$j75$.......$Wan5nIS.hGTPfs9IkwSR2O2MsBHapbJEiO9Q4kELJ7C\", \"challenge\" },\n  { \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.$k4KIU./8FgH.M0UjpzM17GJQqZkY/ceJrPks6RnQZJC\", \"challenge\" },\n  { \"$y$j85$.......\", \"$y$j85$.......$WDXAloGQvP7gK2eMGIGmppXal0P0e0OAkwGJxvMp1M0\", \"challenge\" },\n  { \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.$tztDZhYuITVT0PEaLV2xqZsu.JW22Q/ydKTOvhjk2G4\", \"challenge\" },\n  { \"$y$j75$.......\", \"$y$j75$.......$FdihoTp4oeAiLvSu0FB4B3SVdQsh9RL58ae2gCFzik4\", \"chocolate\" },\n  { \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.$CrfNUh5xMCUTnoCfOe8Xkn4OIkGuKr1NZfCIXCBOb/7\", \"chocolate\" },\n  { \"$y$j85$.......\", \"$y$j85$.......$wgh3g27cjnpTJqhliv85LcePfmIHFOAs91nGVRBQsG2\", \"chocolate\" },\n  { \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.$Um5DQwznRL0JO54YJd851tWpWgCilzlcb2/VhW80Bj0\", \"chocolate\" },\n  { \"$y$j75$.......\", \"$y$j75$.......$GfJb5gz8E0YlFwUeUe9gtTByiY6jyyF6tq8FfAAZKN.\", \"cr1234567\" },\n  { \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.$R7OKe3JRbE6HNsjX4iWw4M2K/lc7bn6cDcXid1p35q2\", \"cr1234567\" },\n  { \"$y$j85$.......\", \"$y$j85$.......$PJbOqqMBycy29ZI2ns4tilubtkfx0qQZHH3ZQqJu0R7\", \"cr1234567\" },\n  { \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.$fYn2u2yXhbgqGFupd5Fv6tKs02MPkchm/6LJtrEH7LB\", \"cr1234567\" },\n  { \"$y$j75$.......\", \"$y$j75$.......$PZvyjYH68X2v60Sc46lxKw7uC1M/9Ytq4.Ba2UfKDj1\", \"katherine\" },\n  { \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.$jgWFjlO7QV12gOmLRvdzvl5dz81L3a/T1vbMr/8Bdo3\", \"katherine\" },\n  { \"$y$j85$.......\", \"$y$j85$.......$Bb8S5y0Yes1kWP/5Xu2eGKdXJe8aVQFyqvSHFxXvo.B\", \"katherine\" },\n  { \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.$lV2SLFuNrHFvA5u6Quz80OywW9Nd3Zppqfe36Itk1p1\", \"katherine\" },\n  { \"$y$j75$.......\", \"$y$j75$.......$y6Z/2U8B7k.XHl01xCENAfAdhLuv0hoEHi3RfP.7X83\", \"stephanie\" },\n  { \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.$y2qD3I0Dx9wfp44mm3DTuj9qhtXRZ6JuDLs.tl8PRP1\", \"stephanie\" },\n  { \"$y$j85$.......\", \"$y$j85$.......$crMnG.pTDhnRFL6tycNwNmTpDRrSnr7oaiie5v/aC19\", \"stephanie\" },\n  { \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.$rxh/dJN69oAz00rMN4L6sMv1G5y6m7jHCByyqpSYLFC\", \"stephanie\" },\n  { \"$y$j75$.......\", \"$y$j75$.......$3t0Tv4xlsxxIiRAbZRDjFzVPlEkN.xbkMGI2p32ZbAA\", \"sunflower\" },\n  { \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.$lDgPdzesIlqCwfYMD5NZQsCkltW8CBJxdMxeux1xQA3\", \"sunflower\" },\n  { \"$y$j85$.......\", \"$y$j85$.......$FZY2eAZBfHWTGWazFqD96tg7MS4AZDAG3ykgOzmD.35\", \"sunflower\" },\n  { \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.$ePN0k66bV176GoRdGDo5W7S7yH2ZisbyVpbTj1oGLiA\", \"sunflower\" },\n  { \"$y$j75$.......\", \"$y$j75$.......$w6pG21vDZJRBadEErbIgzWJsv1LqprVFJfsOZBQKZM6\", \"basketball\" },\n  { \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.$b68lZZuAfsp1iM5N5kE7a0KpxV6lEhNafQflvxWlYU4\", \"basketball\" },\n  { \"$y$j85$.......\", \"$y$j85$.......$B1i92iBMuTNyacZnVPTneaPw2n8lIUJxbrj.gCU4MP1\", \"basketball\" },\n  { \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.$BvuTmsVWl1B4hTMu8a68niXEIchrSkwY7rK24Eg1HC5\", \"basketball\" },\n  { \"$y$j75$.......\", \"$y$j75$.......$SAL3S.R3yaNpmo4cbhIPtg8sI1GZu5HEkv.1K/BsXZ7\", \"porsche911\" },\n  { \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.$Tm420wgVp91I.KJYcqv6soAIPj0Egq6HcOCmB.Z6/C2\", \"porsche911\" },\n  { \"$y$j85$.......\", \"$y$j85$.......$PvTUZyM10XhZ4TI.SCkks0zaa7oLmHZ3AEm5bxugB/7\", \"porsche911\" },\n  { \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.$S9GqWx7GF2Q5jW5H8/qq1scRC50qcW4adkHzuyaxZL8\", \"porsche911\" },\n  { \"$y$j75$.......\", \"$y$j75$.......$Qz/8Nw3eZ5D6n1ZcVETd/KSGZ6MbTsUJGq74wayf3kD\", \"|_337T`/p3\" },\n  { \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.$phuG.GfilMjsQgP3lUPghPfnNgqb0zLyda9lpkVWJG5\", \"|_337T`/p3\" },\n  { \"$y$j85$.......\", \"$y$j85$.......$08areKle8YW41P7DAd7AxaExVwgSHoLV8BL/BwDXoH0\", \"|_337T`/p3\" },\n  { \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.$fq4YDTQZG2Pegmmq2BtjUfaOlRXY6tAv9e0ceFpTiU7\", \"|_337T`/p3\" },\n  { \"$y$j75$.......\", \"$y$j75$.......$Y/3KOWQGtXCWddmY.jhv4TxXyVnPeFb7EBM5SvTQ7HA\", \"thunderbird\" },\n  { \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.$8PVB/qPJ6.QB02Cw.xXkmH/9jtK552.jV4X3cs/AwKA\", \"thunderbird\" },\n  { \"$y$j85$.......\", \"$y$j85$.......$NdY1ZhskId51bCXTHxhc1Co2C43dkh0/FwP340rDRK7\", \"thunderbird\" },\n  { \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.$IWoHO323xckmD7hz5O8cB3TV3jcVt6nvFBPS3WcFkL5\", \"thunderbird\" },\n  { \"$y$j75$.......\", \"$y$j75$.......$pufaYitKyIkZ.NWfVYAUyRXoTBDYCdJzEUcX42001t.\", \"Hello world!\" },\n  { \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.$7jWcEoQKhxMUMQ0E.6waDjn7XDoqraSK3MjNTjRQ6R4\", \"Hello world!\" },\n  { \"$y$j85$.......\", \"$y$j85$.......$j/S1DCRpqPq6lIR7fBtz4KTgd726qw1LrBaMriTkU15\", \"Hello world!\" },\n  { \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.$Bgn0rf.zRxE/DaHqyxcNw5e0Jin8Fxo6KVUmWxkAFT6\", \"Hello world!\" },\n  { \"$y$j75$.......\", \"$y$j75$.......$4BCCMdYqJIh8un09wEJiNI5xA9HEcq2bR4lB2hHmk7B\", \"pleaseletmein\" },\n  { \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.$LOFz5qVpaHYHlkfy7RM1hH9gRBSqy5mk4KRmFVRFKM4\", \"pleaseletmein\" },\n  { \"$y$j85$.......\", \"$y$j85$.......$pqqOReIA093nDWWsIrXzu7kwnCu10SbTz19KWDf9R.2\", \"pleaseletmein\" },\n  { \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.$bAfr8bOshRhNY74kqJ7IEJD9fzS2/JRu6jYSI5oSKpD\", \"pleaseletmein\" },\n  { \"$y$j75$.......\", \"$y$j75$.......$qd0.mS0ZK.2HVP4wbSbu5RpgqsVHjDZA/5S1Ykfn6s7\", \"a short string\" },\n  { \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.$6v3T8C7.WH9kA4nbq4DmUR7T4vXq48CT9hDfLdi2Zt7\", \"a short string\" },\n  { \"$y$j85$.......\", \"$y$j85$.......$ZlHk88/KmNCcx1e8.fTbOrDLs7vqEmXMbMKaUIDHFSC\", \"a short string\" },\n  { \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.$V54RamiustzxvSKbuVA3bbw2Fz1tJ2v2DG1LzXfyJU1\", \"a short string\" },\n  { \"$y$j75$.......\", \"$y$j75$.......$YwBPJ7vfLRfaZyOjIPwp7PDWj0KZCnEn98sBZKdqdf7\", \"zxyDPWgydbQjgq\" },\n  { \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.$MVXnlaUlLnjxC8.Opa45IbXEnQlFxosD999ArFpyv1C\", \"zxyDPWgydbQjgq\" },\n  { \"$y$j85$.......\", \"$y$j85$.......$U4y9nIzgWDQB5wfu9aokmtWp1kZZ7gc0/uAyUApZMp8\", \"zxyDPWgydbQjgq\" },\n  { \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.$XyPXET3kw.J0C5VhXLS8z342mrNCc4aAD/gw6pDVJSB\", \"zxyDPWgydbQjgq\" },\n  { \"$y$j75$.......\", \"$y$j75$.......$sq19/LDU/9VSUc3U/39p.28J5gDbovkn6dRuJRdrfv.\", \"photojournalism\" },\n  { \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.$4m.JXUU8RUMeiuUOPcCumS0lnETcsS5krf2/gwbSek1\", \"photojournalism\" },\n  { \"$y$j85$.......\", \"$y$j85$.......$Mri/OMLkgc5PNI5.yavGabYbWZuUoriH2jOD51j.7z3\", \"photojournalism\" },\n  { \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.$ffH68z3cM80885GlB567cFXUR1unVj5t0kXhBp6YRh9\", \"photojournalism\" },\n  { \"$y$j75$.......\", \"$y$j75$.......$KrwFvcUOidbUxoPIQ/0G4QprqAMPCr9MNP/LAC2nMG5\", \"ecclesiastically\" },\n  { \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.$uxuo7SJQBjkAPuzhzjftYUcAdkW9JyWspWDcamhZMj5\", \"ecclesiastically\" },\n  { \"$y$j85$.......\", \"$y$j85$.......$TTFj4Z94TTSmHHWEVyxOrAYTqmQOeLyrtttrkZCwim9\", \"ecclesiastically\" },\n  { \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.$uFP4C7KBVOPtHyJMJFPmZni9WwImMXcf7vhB6LNQgn6\", \"ecclesiastically\" },\n  { \"$y$j75$.......\", \"$y$j75$.......$RA.KNb9VR1NtaOKYYbXK30O92aAeijEELrK0tm/lyQ3\", \"congregationalism\" },\n  { \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.$SDrqOyOsh65CSZlU5QwWgK2SCu2Nz/mIAg4IqHtaKRC\", \"congregationalism\" },\n  { \"$y$j85$.......\", \"$y$j85$.......$/boIFwQ1YeYHApfoAcYO1Kdu0jN5kI7maZsIi2LRnwC\", \"congregationalism\" },\n  { \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.$WwdywFM7iMlb4ibJj7UHw0WaMEV9WSXqgvOKFhfBY8B\", \"congregationalism\" },\n  { \"$y$j75$.......\", \"$y$j75$.......$o9BxZefx4cfMy5ns3pqW8GKHp/NFt2qp7FHdkR5vE44\", \"dihydrosphingosine\" },\n  { \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.$KrY1j4hodif5jMyalcrQU7k/OyXznoS7iplWuu/A8d8\", \"dihydrosphingosine\" },\n  { \"$y$j85$.......\", \"$y$j85$.......$WfCJQzJ/GBTrSi78dpmCIz2Cfb4cQ4JccvSYZY55rN.\", \"dihydrosphingosine\" },\n  { \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.$iWwpKnRm12cQWXl7ygqxfcrbGvzt0A8ZEFrnbdX4v0D\", \"dihydrosphingosine\" },\n  { \"$y$j75$.......\", \"$y$j75$.......$NjaFf4yZ8pQb50CeKfNl28sPqNV6XApKlb9pVHmnTA0\", \"semianthropological\" },\n  { \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.$AOJaKlXc2m9fAvHkhDNY3LnvTV1DVk8fVxK9XKxyklA\", \"semianthropological\" },\n  { \"$y$j85$.......\", \"$y$j85$.......$6TlC0yGSrDU9/7OmI1X.kr807CqhURb6jzsB7/Zmn26\", \"semianthropological\" },\n  { \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.$SDmpfFPxUxlWAhXMC3hsiUAdQ5rtq5RwZ93BgUecot4\", \"semianthropological\" },\n  { \"$y$j75$.......\", \"$y$j75$.......$VOayCQJjtTXCQ8MJTCpIJu7aqA69XDKPAcVwkMiJckB\", \"palaeogeographically\" },\n  { \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.$kMOB3hGOWm.5ay03gv7xY0ChoYNnOOjbDPO6c/pLZY4\", \"palaeogeographically\" },\n  { \"$y$j85$.......\", \"$y$j85$.......$7BYcUkHTqy5SJ7HODzTAEVi0iVdtllEjzEsvs0ZtvR5\", \"palaeogeographically\" },\n  { \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.$wdIBFXU0DybvDKphDQReMSe1acXyOKge1mrPIxLut39\", \"palaeogeographically\" },\n  { \"$y$j75$.......\", \"$y$j75$.......$55B82nY8lbxrXopmyZSsX/pJSmHk9dKrgLAzPDO2kHB\", \"electromyographically\" },\n  { \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.$jCK1qDm8Z9S.TE4zuMHDKnoBZYfxr/Uy5RNzOyMs5EB\", \"electromyographically\" },\n  { \"$y$j85$.......\", \"$y$j85$.......$hKbtROb3sVNcMLQlewE.zzZc7pDaPURGFdUNCp.NdQ3\", \"electromyographically\" },\n  { \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.$.MsGXOW6hS5s4FpnTsk.VujgLTJxh0hrePDi4RLxJLD\", \"electromyographically\" },\n  { \"$y$j75$.......\", \"$y$j75$.......$oeux1F0j8ylt4EAUKSn/RRsWoH8NRxZ7/115pKf4OJ7\", \"noninterchangeableness\" },\n  { \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.$jyj.ILc354MhDbE1DzFyCZsk.Hmx7u53AdYX4eP3QBB\", \"noninterchangeableness\" },\n  { \"$y$j85$.......\", \"$y$j85$.......$CZZrxLjJAp.2tRu/z6tu3BIs.2ZrkXqpdLO5TxXAomD\", \"noninterchangeableness\" },\n  { \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.$zMrO/A6oUC7/stkcFKl55HXSBTDez.9q/q6R6F7ZN0C\", \"noninterchangeableness\" },\n  { \"$y$j75$.......\", \"$y$j75$.......$Q6INTIUqVhIISMLT/ZawC1QOmUyqb6pDXT0KUbM8xF2\", \"abcdefghijklmnopqrstuvwxyz\" },\n  { \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.$YNDvFyH.qHNmyrTszZI4SOiQ/qVvSTYDKYjXZyvG05.\", \"abcdefghijklmnopqrstuvwxyz\" },\n  { \"$y$j85$.......\", \"$y$j85$.......$m3x5iypa7ModE9pWOxfuS24RURs5P44U.Z74.9bnMO2\", \"abcdefghijklmnopqrstuvwxyz\" },\n  { \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.$7OqikRK7L3lKAdPmG6j11toBXcw22osyrMftrLEK2IB\", \"abcdefghijklmnopqrstuvwxyz\" },\n  { \"$y$j75$.......\", \"$y$j75$.......$krhhCtPNlJmSH99F.ZwUsIvjbaVelDTjUp5j9RQpnz5\", \"electroencephalographically\" },\n  { \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.$aEiBZ.lsS4g7WuffKVvlqRnhjpjc6vfZD8.VZLZ18w9\", \"electroencephalographically\" },\n  { \"$y$j85$.......\", \"$y$j85$.......$KYGJ3r/PjCRAiKzO1bVhDQ9VaO0PN8hWEyns1ano.J8\", \"electroencephalographically\" },\n  { \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.$jiD3ojm0fPmPFjAzt8HsMWnTGdmxiAgQkVt2My0H7B7\", \"electroencephalographically\" },\n  { \"$y$j75$.......\", \"$y$j75$.......$1SRFYhiNyk1CBif9Eoy/YjV7Im3rXIMx.jocaEYFBp.\", \"antidisestablishmentarianism\" },\n  { \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.$A9xWQtsDkQBVyIXRJIN7nGI6p5SgDfNc5zy42OXf/O1\", \"antidisestablishmentarianism\" },\n  { \"$y$j85$.......\", \"$y$j85$.......$hwSL8szJRB0KZ2gARhwFPJbM1CEAO5oKu4QePBIP.35\", \"antidisestablishmentarianism\" },\n  { \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.$PLbmxP/.HJDfzuILGvSnJ4XKFDW14dDGwgNgjbQ.mw6\", \"antidisestablishmentarianism\" },\n  { \"$y$j75$.......\", \"$y$j75$.......$acP22XrS6a5ERFUnUGxoj1WeSmiDxol0QFWG7XmoXG8\", \"cyclotrimethylenetrinitramine\" },\n  { \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.$zo0ow6WQl3V5Pdf50i9OgXtXkQReigG3w/xI4cvKGRA\", \"cyclotrimethylenetrinitramine\" },\n  { \"$y$j85$.......\", \"$y$j85$.......$oe5YkqbB.uT394t4UBtfPLSfxgCvfbIA4eQkkmkETF.\", \"cyclotrimethylenetrinitramine\" },\n  { \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.$tzvUqJHxICPbgT0YiVHc/D2MXXPz6XioAFxSZD6TH73\", \"cyclotrimethylenetrinitramine\" },\n  { \"$y$j75$.......\", \"$y$j75$.......$gEtqbNXBiWRWRU5LSxoyCbLxxdO4CpFYTDckoR8PMtA\", \"dichlorodiphenyltrichloroethane\" },\n  { \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.$UFQ4WQ.Ae/.enSnCMSHnIV22lcJ/R4HfnGQLMAeEXoC\", \"dichlorodiphenyltrichloroethane\" },\n  { \"$y$j85$.......\", \"$y$j85$.......$xXb9GNRBYY1BJys2R8Nh8p3P/zIbaQ5FRgpjdhMZNcC\", \"dichlorodiphenyltrichloroethane\" },\n  { \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.$uJTtWeFKID4ZLqAdYERWhs0ZOa5nZ2Uf/NNtcScLEs/\", \"dichlorodiphenyltrichloroethane\" },\n  { \"$y$j75$.......\", \"$y$j75$.......$GYg6LLsCbWr5l8H6MgnHGBE43zqZ63zFlANeMi2Me33\", \"multiple words seperated by spaces\" },\n  { \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.$nmEOzm5zwjg8prkf0v9eSLpMUdAmcMhdVGHelR7O805\", \"multiple words seperated by spaces\" },\n  { \"$y$j85$.......\", \"$y$j85$.......$CycUDxoxlqPK9WAwqNxq5jhbO4VBYicZOxjsxtfePj9\", \"multiple words seperated by spaces\" },\n  { \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.$zLZZCV7b8MWGjK364GG5IAs5q9CTIGbjrb0pDlM9Wx7\", \"multiple words seperated by spaces\" },\n  { \"$y$j75$.......\", \"$y$j75$.......$TIRisR6icF961PZADPNUuQ4IyNo3RsLXeHYjcWEs3o7\", \"supercalifragilisticexpialidocious\" },\n  { \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.$MKQFUQSxouxcIfy0zzTkL715uzoMo8OK2H6kSFX6Ad0\", \"supercalifragilisticexpialidocious\" },\n  { \"$y$j85$.......\", \"$y$j85$.......$JptZ9stAo2Kd16dZwa7WKierQpfoToBFOeBlGigcxV7\", \"supercalifragilisticexpialidocious\" },\n  { \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.$e2UBwFQnG5HLb53e4wY.w3eKgqRKSHW72LO9pXdbK/C\", \"supercalifragilisticexpialidocious\" },\n  { \"$y$j75$.......\", \"$y$j75$.......$pMPSS2G8Q.c6cASGpXXcspZDtuelQdeSnFg6Tg8ol27\", \"we have a short salt string but not a short password\" },\n  { \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.$mEOM8D9n74/Tv3oRnrCb8eOE/3yeCsQfe6bXjAWDWS4\", \"we have a short salt string but not a short password\" },\n  { \"$y$j85$.......\", \"$y$j85$.......$Yp2f/ney5DfedEXUrYnnjDve0VZU6DqWc3/RuDD1R81\", \"we have a short salt string but not a short password\" },\n  { \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.$vWwIMvMNdtzA.bhzhR3ddqBoR4Q2HjxwRHAcBqc5CQ1\", \"we have a short salt string but not a short password\" },\n  { \"$y$j75$.......\", \"$y$j75$.......$T7zg5aGkjv7PqdA2ENCtz9f.sEq9qzZJQK440SvGvn9\", \"multiple word$ $eperated by $pace$ and $pecial character$\" },\n  { \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.$9P7F.Z7i3OWeSxxck74puDcbgRyos2peWauAuuCJmU8\", \"multiple word$ $eperated by $pace$ and $pecial character$\" },\n  { \"$y$j85$.......\", \"$y$j85$.......$EctcB4pnSfHgc/3/IjT.e3eaMJYCzOgmT7hI0dl65D4\", \"multiple word$ $eperated by $pace$ and $pecial character$\" },\n  { \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.$jZxEeajWFN6X0CWs6oQH0EFM3ubVpLJGiWeGnWZTS29\", \"multiple word$ $eperated by $pace$ and $pecial character$\" },\n  { \"$y$j75$.......\", \"$y$j75$.......$l3LBuUnjh5p14rHbfaq5RIlOyTJKf1FwUQcMGevD9w1\", \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\" },\n  { \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.$V2eFxIWbmpV5HoMDMO0yAKbNO16AFPp60j3neYyxkGB\", \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\" },\n  { \"$y$j85$.......\", \"$y$j85$.......$fBbahOKwsnsFDz.Fj2m4L5Y1jhYAMa5j1YPV8q898k7\", \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\" },\n  { \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.$m1c4LIhXJURC9VKCOrWnQ.fLRYPgKe1XhQ2lUXTVWD5\", \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\" },\n  { \"$y$j75$.......\", \"$y$j75$.......$dAe4BVoPscaf5jj.jeK4/2Eve2T60PJPeSYWevsFbe6\", \"12345678901234567890123456789012345678901234567890123456789012345678901234567890\" },\n  { \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.$kL5aNawo/K9stdq6ccKp2LKDaWoYgkN608x67.LaP3.\", \"12345678901234567890123456789012345678901234567890123456789012345678901234567890\" },\n  { \"$y$j85$.......\", \"$y$j85$.......$P/Hv6iE3IaOvkGzwravk/jrdgdZuUQXCAkEEq9fR.Y0\", \"12345678901234567890123456789012345678901234567890123456789012345678901234567890\" },\n  { \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.$ScSHwJjPMTEQbfWpv7UInCjQOlY8/jHHPIwvJTCJE/0\", \"12345678901234567890123456789012345678901234567890123456789012345678901234567890\" },\n  { \"$y$j75$.......\", \"$y$j75$.......$f1GovCsVarj5J9DzqXNTF0SDfAOgW0UYyMdoUW6lRD4\", \"a very much longer text to encrypt.  This one even stretches over morethan one line.\" },\n  { \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.$Sl.2H7uWEilpZAJsv5sGqMqGAUnfmbXUXCrGO3c/8QD\", \"a very much longer text to encrypt.  This one even stretches over morethan one line.\" },\n  { \"$y$j85$.......\", \"$y$j85$.......$GavTV1IxKIGHVEWEvjDs3XLEaSmbEuatBGiXM9OVqZ/\", \"a very much longer text to encrypt.  This one even stretches over morethan one line.\" },\n  { \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.$hsvl.lO/qRm/7SX8ugjJ99qGtJ.7T99808PQ8g6QL7B\", \"a very much longer text to encrypt.  This one even stretches over morethan one line.\" },\n  { \"$y$j75$.......\", \"$y$j75$.......$v/AHVX5OCINkV6aEtD0fPZWVuCBpb4zHw5u5crGECP3\", \"\\xd0\\xc1\\xd2\\xcf\\xcc\\xd8\" },\n  { \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.$e84hur2sHb36vxaY96XMO2FgyTJ4NCzmzgQdY0asn78\", \"\\xd0\\xc1\\xd2\\xcf\\xcc\\xd8\" },\n  { \"$y$j85$.......\", \"$y$j85$.......$4TTnF4e8cBMEoVBQB9CgKyjX9qPNBIGuUTHZNybzYW0\", \"\\xd0\\xc1\\xd2\\xcf\\xcc\\xd8\" },\n  { \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.$xoZuC5mHSxpNTAA64K8vRHApeirQySj9XePL0xhB8DD\", \"\\xd0\\xc1\\xd2\\xcf\\xcc\\xd8\" },\n  { \"$y$j75$.......\", \"$y$j75$.......$byyfXzCdVYYaX5HXnrI00ABQoX8u6KBCdU2n1Jw1B92\", \"\\xd5\\xaa\\xd5\\xaa\\xaa\\xaa\\xd5\\xaa\" },\n  { \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.$IQVJw/isQDL3EDGhAIjik2RM1ML5jLp30UDNKRte5YC\", \"\\xd5\\xaa\\xd5\\xaa\\xaa\\xaa\\xd5\\xaa\" },\n  { \"$y$j85$.......\", \"$y$j85$.......$dalk6SpXn9oBRMuoI37yja79J7gf6sXRXoSrML3z/43\", \"\\xd5\\xaa\\xd5\\xaa\\xaa\\xaa\\xd5\\xaa\" },\n  { \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.$ntyIYQCvkO936l7PduoNBHokYfwYg9g5ZON1LMAJap0\", \"\\xd5\\xaa\\xd5\\xaa\\xaa\\xaa\\xd5\\xaa\" },\n  { \"$y$j75$.......\", \"$y$j75$.......$yAXMnMegZ6zoYLa5NyjEZLHxJqKD47c8SHvo4OPnV99\", \"\\xe1\\xec\\xe5\\xf8\\xe1\\xee\\xe4\\xe5\\xf2\" },\n  { \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.$oQgZl/Buh695xmQuzx3PKMlvNtNy8PJqJIg1nGIrbh2\", \"\\xe1\\xec\\xe5\\xf8\\xe1\\xee\\xe4\\xe5\\xf2\" },\n  { \"$y$j85$.......\", \"$y$j85$.......$TDInLXdLRdgX0yoH1eqjObMhhNl3cXEP6fhIILsLSKC\", \"\\xe1\\xec\\xe5\\xf8\\xe1\\xee\\xe4\\xe5\\xf2\" },\n  { \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.$mjoKPDzO7rmL4rgxLHaJ/fKyOYEekYR/q04D6ZdRU43\", \"\\xe1\\xec\\xe5\\xf8\\xe1\\xee\\xe4\\xe5\\xf2\" },\n  { \"$y$j75$.......\", \"$y$j75$.......$z3HAsdyEUCw6oNEQGbjY/SJE67wT/LbxSFm4naco7/0\", \"\\xf3\\xf4\\xe5\\xf0\\xe8\\xe1\\xee\\xe9\\xe5\" },\n  { \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.$zc5xEgCoVgi4LYdlLoGsuuJ7FVw.zHElBNW9mpJSSx3\", \"\\xf3\\xf4\\xe5\\xf0\\xe8\\xe1\\xee\\xe9\\xe5\" },\n  { \"$y$j85$.......\", \"$y$j85$.......$T.A9BfE4lOUYWYsiIE0b4HOcQp89UoHbXBZZAqdF.96\", \"\\xf3\\xf4\\xe5\\xf0\\xe8\\xe1\\xee\\xe9\\xe5\" },\n  { \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.$AiUlAUMfDgRQ6tLRaGXWbZwvxu2TwKgcd8U0DYZamd5\", \"\\xf3\\xf4\\xe5\\xf0\\xe8\\xe1\\xee\\xe9\\xe5\" },\n  { \"$y$j75$.......\", \"$y$j75$.......$cOCyRRwVilnraPa0tjbdRpDZivpGJljtO8GHwzqiFj6\", \"\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\" },\n  { \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.$t.8PPxALiVYgZmrb03uS4vIZTDTgHGf1TlQ.TPlGL9.\", \"\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\" },\n  { \"$y$j85$.......\", \"$y$j85$.......$McwPo7oQ/IkY/DKQxoG3w5yE9rVjZ.gWOrAbXmgm1./\", \"\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\" },\n  { \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.$07UgaNQFuCB/6XhoXP/7wn1FVzkxHLTy1bI/S/Q7.16\", \"\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\\xd5\\xaa\" },\n  { \"$y$j75$.......\", \"$y$j75$.......$sI7RyjhB97WNUwzsZYS5vveZ34q/Iz7x9eYi/px7Kq0\", \"\\xc3\\xa9tude\" },\n  { \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.$zwEkXTpleQb38SUTKZD5XEkaZbn9RJLlzRA7fT1HX21\", \"\\xc3\\xa9tude\" },\n  { \"$y$j85$.......\", \"$y$j85$.......$XOUj8SgY1uyy0UDLubY/Ax..UUFthol9rNePgmYFss9\", \"\\xc3\\xa9tude\" },\n  { \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.$Z1Z2Q1ArPGYVSVqJN41MQZq/17sl1XFsH8AXoFvdPc/\", \"\\xc3\\xa9tude\" },\n  { \"$y$j75$.......\", \"$y$j75$.......$wLsp3pISikh/GgG95SF3zUzdyAgip8Okb6S6NNtlPqB\", \"C)tude\" },\n  { \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.$e0ygMnaqiEFsZijBJdN60j3b3rRvos2iX1AP3cXM3F5\", \"C)tude\" },\n  { \"$y$j85$.......\", \"$y$j85$.......$lx1YjzZHlCLelIGDbT5kW2pCpbOkYOpMRuH/1yrnhYC\", \"C)tude\" },\n  { \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.$n8MhxAIWaaCQJdBnqafj7e0iJu817ZP8WkysKVPfpC7\", \"C)tude\" },\n  { \"$y$j75$.......\", \"$y$j75$.......$J82yPQuk4ANq9kiKs6yITU/gf8oCRQP7UDeUktxWwh4\", \"Chl\\xc3\\xb6\"\"e\" },\n  { \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.$uyzanVvvlqEW5EOu.RVgqK2syNXi6zO5mqCdfx39A/B\", \"Chl\\xc3\\xb6\"\"e\" },\n  { \"$y$j85$.......\", \"$y$j85$.......$uMEe9unOziC8wuBomf/hdHMq6sBKabTPdLscxXptMD.\", \"Chl\\xc3\\xb6\"\"e\" },\n  { \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.$cjbsS2axwGKnoXW0ZeDYG1jYEQkidY2U0aD4EhuSTx3\", \"Chl\\xc3\\xb6\"\"e\" },\n  { \"$y$j75$.......\", \"$y$j75$.......$RatMorOW2rNdLl/TxBppLij1VZTXTenZ2yjMl0ZbcoC\", \"ChlC6e\" },\n  { \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.$iWMKU2bvms4.GDbSDRAmF0o7gWE012ofo5MdVrxbDh5\", \"ChlC6e\" },\n  { \"$y$j85$.......\", \"$y$j85$.......$vreLrIaU69pVDlSVzYg0BXwK09efnvqpeTt/kxWZFa6\", \"ChlC6e\" },\n  { \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.$y/LLie2eoT8E.RONmtIbjc7ceo62JYROChnanaRwDo7\", \"ChlC6e\" },\n  { \"$y$j75$.......\", \"$y$j75$.......$FzvUTzntBI5wPOrRSwo1QjjFFmBVsl.c7wlWiBnuXp.\", \"\\xc3\\x85ngstr\\xc3\\xb6m\" },\n  { \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.$eu0Cv.K1Z.X3P4bdX7.yd4Ej0Yz6aQ9IA5AViQFF5q8\", \"\\xc3\\x85ngstr\\xc3\\xb6m\" },\n  { \"$y$j85$.......\", \"$y$j85$.......$GSUNyeKspjDH8cv3JurJH2kNVGQmctfBDP6v.tfASy9\", \"\\xc3\\x85ngstr\\xc3\\xb6m\" },\n  { \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.$/4EsE62765pCfZHJYRQCtkDfV9JyhozsaVp.r.8TYc6\", \"\\xc3\\x85ngstr\\xc3\\xb6m\" },\n  { \"$y$j75$.......\", \"$y$j75$.......$sp51CQ1zjFYB50g/Vjq8UEaPbzdt9ZOf6UT17IJOX77\", \"C\\x05ngstrC6m\" },\n  { \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.$V8DQ4copC6DaLvhwoGWxZ4DytV9AI5j1qsZi3/oLHiA\", \"C\\x05ngstrC6m\" },\n  { \"$y$j85$.......\", \"$y$j85$.......$pZ.V3JLUMS1DWr54KRDbGNAgaS9naZuVjhJhTRJvYOB\", \"C\\x05ngstrC6m\" },\n  { \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.$FKjrK4BHRv3/l6nUkQs8FpXephngq296TAIpyC55218\", \"C\\x05ngstrC6m\" },\n  { \"$y$j75$.......\", \"$y$j75$.......$/XlK6bqi1ZJAyV4BUDMq33cfunTz2OYx/kwbIp9/hJ2\", \"C\\x05ngstrCU*U***U*\" },\n  { \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.$Aj5AbqAjk1f7sqre2RG7Nb9R3uCborWSoqIMbeIguP4\", \"C\\x05ngstrCU*U***U*\" },\n  { \"$y$j85$.......\", \"$y$j85$.......$XzgWM0r/N0itj48ORBatiByRLmWz83RqWnBDAOuf.rD\", \"C\\x05ngstrCU*U***U*\" },\n  { \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.$El5dG9jHfuX89Q/2xeuoJXCij4Xc6uqYCRTyiDxLqN5\", \"C\\x05ngstrCU*U***U*\" },\n  { \"$y$j75$.......\", \"$y$j75$.......$v4AjSNpQ2WBHuGorhka/XlLtanhEPTlEmU2m8N/DHZ1\", \"U*U***U*ignored\" },\n  { \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.$IbWbU0271Fz8gSoKvx9fm1QEEpLj8rKgCgDSO3FDJy1\", \"U*U***U*ignored\" },\n  { \"$y$j85$.......\", \"$y$j85$.......$oaKB/uHToBz.iSw9avmxDVD4ZTxgvsHUD6ke/jvdwD0\", \"U*U***U*ignored\" },\n  { \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.$j16p/Guq1u287CHWYT.yEkUFRSavNoZyFyjLvpyLZA/\", \"U*U***U*ignored\" },\n  { \"$y$j75$.......\", \"$y$j75$.......$Xfm2A6aPRI6z8YWbSD/GG8etKSaE35/W0DOjcWr5w56\", \"U*U*U*U*\" },\n  { \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.$GkV5eMZq3lOmz56h7npRKav4z/g5.z1knaHu3chxxS5\", \"U*U*U*U*\" },\n  { \"$y$j85$.......\", \"$y$j85$.......$SPL1CMBXFo/bmZ8tfDHWnBiJUPNuthqSMZXkWLUX.l3\", \"U*U*U*U*\" },\n  { \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.$u9l/3Kyw6P5TwcYd74KDAGhd9Mma7k6D0/LZ0ZT2pwA\", \"U*U*U*U*\" },\n  { \"$y$j75$.......\", \"$y$j75$.......$qxSShULhb08vkDQc2O4yVLmWnj/4lT8bR5DO2hcDV91\", \"U*U*U*U*ignored\" },\n  { \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.$V1NwdKXbhWiUXotn/980FtMAf2pFyk3vWKKwNrsiAt4\", \"U*U*U*U*ignored\" },\n  { \"$y$j85$.......\", \"$y$j85$.......$JGSP.n7rV/GT9dkIRs8IxDYk4RTB0PLRSL7JuBbavS6\", \"U*U*U*U*ignored\" },\n  { \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.$vBlbpNldFDun2OfjSSa9w59tVvb8aUCRlUpBgPvJ2aD\", \"U*U*U*U*ignored\" },\n  { \"$y$j75$.......\", \"$y$j75$.......$rfCfKGurRs34Dmotg2vAkDlxO5pBnazZnrigufcrzG2\", \"*U*U*U*U\" },\n  { \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.$cukHtjbLCSv9aBrZAWtFeE84xzIxxqXfqp9.onBvXu9\", \"*U*U*U*U\" },\n  { \"$y$j85$.......\", \"$y$j85$.......$veitwebPg63P7taUH3jhJb/l.jOCSlaHkZpicfKWCV.\", \"*U*U*U*U\" },\n  { \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.$8W0cWmraLxevKbQBUW8xr9CCNN095kVQFN0/S1GuvJ9\", \"*U*U*U*U\" },\n  { \"$y$j75$.......\", \"$y$j75$.......$FZ7amzAcoTYrqSGRm9k7tbHPK6rZ4DUd4vrRgqJ3fO5\", \"*U*U*U*U*\" },\n  { \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.$9Sm1rkplccfpTHizD6Em.WCDpcKJ49eAXzWKL7C3IqC\", \"*U*U*U*U*\" },\n  { \"$y$j85$.......\", \"$y$j85$.......$LF3QWH86ZRG.zOnphNwzFWIukNjLUvcH8BIdzTVfgRA\", \"*U*U*U*U*\" },\n  { \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.$algqGjlxLtpey/0X0uNxDEYupwUjdeDLGopwhEO5Vz/\", \"*U*U*U*U*\" },\n  { \"$y$j75$.......\", \"$y$j75$.......$dCbRg0hkS4JdZvOnMF9rwrVA/RwtxcUx8H37bB/RzLC\", \"*U*U*U*U*U*U*U*U\" },\n  { \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.$h.fmV/gwDw0tKDCTnux6KGlHB1DEAsoHA.OJFO8/LL8\", \"*U*U*U*U*U*U*U*U\" },\n  { \"$y$j85$.......\", \"$y$j85$.......$5ZzGchdUDEhADFTnOSjEw24dPGTKBIIqRMV1VJJXIO6\", \"*U*U*U*U*U*U*U*U\" },\n  { \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.$X2bYomzg0Jg.u5RVNC0qXtKo1htsVlSJl8QoNImGep3\", \"*U*U*U*U*U*U*U*U\" },\n  { \"$y$j75$.......\", \"$y$j75$.......$iWYHAmjkWWPyzN4uWdroXQr3mS5VKiBOeUJE1FXMWiA\", \"*U*U*U*U*U*U*U*U*\" },\n  { \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.$850DnH6XLieRVQJkRfdEQf277Sfsj8rWv.AIe7RLEB9\", \"*U*U*U*U*U*U*U*U*\" },\n  { \"$y$j85$.......\", \"$y$j85$.......$FoamjCm/5l9.ntM1VZpqlt5pCDmX9W9fAJQvNssN9p7\", \"*U*U*U*U*U*U*U*U*\" },\n  { \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.$UFJkwh.EK94X.ZvL4RPTH1SbZRduwgSC21.U2/u9Rz3\", \"*U*U*U*U*U*U*U*U*\" },\n  { \"$y$j75$.......\", \"$y$j75$.......$nG1nBzJeNcJGeZqWO5HOe6LsQ2QP2s4pJ9lDJN0Dri3\", \"\\xa3\" },\n  { \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.$tD6xLg3UzoBB.YaqdU/iCU6x0JV5EfAWs7xhBhj9yj0\", \"\\xa3\" },\n  { \"$y$j85$.......\", \"$y$j85$.......$aOGorl2OKEWMpAKE.nFFsB2xHjrazNF4qcSAY4H6n88\", \"\\xa3\" },\n  { \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.$y1ICnDFiIXV7IU8HwEvY0g00jplC2qKfQI56fmr03pC\", \"\\xa3\" },\n  { \"$y$j75$.......\", \"$y$j75$.......$gOb4YjcxY0krLlRSFD8GpA85nSQ7RUtq3/COYKtxp93\", \"\\xa3\"\"a\" },\n  { \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.$g93fUlB7MNXyVYXEMt5LK5xZuwzbR0KrSmSln6IDlX5\", \"\\xa3\"\"a\" },\n  { \"$y$j85$.......\", \"$y$j85$.......$ZZEi7xmfhpm36jVKgEEF6p90i2WU8MpIYjhDC0V9H55\", \"\\xa3\"\"a\" },\n  { \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.$ppFmdT1TL3FecCJlmf/i8xZ/zeq0q9JCh3FGnHM8ii1\", \"\\xa3\"\"a\" },\n  { \"$y$j75$.......\", \"$y$j75$.......$ub/X/d/wqm7fGbSRcpvpeVtatXBGCVVX/Ex6cqNPyB3\", \"\\xd1\\x91\" },\n  { \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.$PdnQe2EsH7DN4PQO5F3DWtR4UJvfL8u1YPYHdw3t2O5\", \"\\xd1\\x91\" },\n  { \"$y$j85$.......\", \"$y$j85$.......$B5dsi3Em0v5y68xRfW0X6EN5Wna1/n2QMnhbA6Q4UzC\", \"\\xd1\\x91\" },\n  { \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.$ia0jMaasZGmozqz0rroB1AzURW9m2ppA0k2JhhDXp94\", \"\\xd1\\x91\" },\n  { \"$y$j75$.......\", \"$y$j75$.......$M7SObd8LBQb5rGAjT1t2I.3MX/5aBUoxaXYAmS1Bvv/\", \"\\xa3\"\"ab\" },\n  { \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.$Zdm3CXNKAlLjD.X/27zFbzbJhGReP8oWlw7we0eA3X/\", \"\\xa3\"\"ab\" },\n  { \"$y$j85$.......\", \"$y$j85$.......$V5ndJDX5mUb.9HSxgoetpSbbaDV99kyQoPkcKum1It4\", \"\\xa3\"\"ab\" },\n  { \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.$fk.sz1q9mNP9LEw3IXzwNVb.5xdh7LHuM8MonW12Ie1\", \"\\xa3\"\"ab\" },\n  { \"$y$j75$.......\", \"$y$j75$.......$5qt5cv.ymOqAHg89rmmF4nEjL0MRMvkxWPEBtCjFpm0\", \"\\xff\\xff\\xa3\" },\n  { \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.$E1urEsQgaJ4RgiK9WhyiXlAwuR0HxWbM5K.VAiOe1ZD\", \"\\xff\\xff\\xa3\" },\n  { \"$y$j85$.......\", \"$y$j85$.......$MWLdsfTipIOt5OFRt6BvZ6V32KY6vdfHN5lBSaKlAc2\", \"\\xff\\xff\\xa3\" },\n  { \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.$ZHvxQJ0LnwjoB0/hiubRE1nf7g4tMTi.F2SKjj5mGtB\", \"\\xff\\xff\\xa3\" },\n  { \"$y$j75$.......\", \"$y$j75$.......$D3W4QjjSz2D19VlKKiAZdi8ijvsTpsxNJDcRvusJOU4\", \"1\\xa3\"\"345\" },\n  { \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.$FjTL7ogvhXvz/UWjObjzlmUreQCU4y2/kKfazRi1KEC\", \"1\\xa3\"\"345\" },\n  { \"$y$j85$.......\", \"$y$j85$.......$3Ce03eQC1/Byo59IHi9w41hx1x1Fqj4MSxUN2EUpb7B\", \"1\\xa3\"\"345\" },\n  { \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.$dS2TLRRvfRU9k64cUtvaw8qCKrjE7L31fcGaH7WmRP7\", \"1\\xa3\"\"345\" },\n  { \"$y$j75$.......\", \"$y$j75$.......$boq.Ka0WNoKC1sEL0fzbiTpDV.rUrMcYVbZGw0nA3w.\", \"\\xff\\xa3\"\"345\" },\n  { \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.$0XaXni2L0uDbNmbGqNbcvMZ2p.La6TBUqbP3hAlmjc2\", \"\\xff\\xa3\"\"345\" },\n  { \"$y$j85$.......\", \"$y$j85$.......$k4Gk5Q2bCNWNNjYxdhJTYBIXulJrQYkb/RphrrcUae/\", \"\\xff\\xa3\"\"345\" },\n  { \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.$uhTB3iKOUe51NKQ83mRhJjXXBAPjve5Sy6hzgousi/6\", \"\\xff\\xa3\"\"345\" },\n  { \"$y$j75$.......\", \"$y$j75$.......$XAYFhJvyJauPzmIfZKHGpcTexMpXV4ISecJB8VMY4e1\", \"\\xff\\xa3\"\"34\\xff\\xff\\xff\\xa3\"\"345\" },\n  { \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.$TKXyBnX2cXkGXeqLx5JANBew/0nQ5UBSel0YsD22yt7\", \"\\xff\\xa3\"\"34\\xff\\xff\\xff\\xa3\"\"345\" },\n  { \"$y$j85$.......\", \"$y$j85$.......$g9GEPu6PHnbXRPWsWd6fX3U8PKTdBF41LwptRy4oz93\", \"\\xff\\xa3\"\"34\\xff\\xff\\xff\\xa3\"\"345\" },\n  { \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.$TWE2dBRx.jn3LX.BConFVgcLSdJyhvfOESjz1EMMcaA\", \"\\xff\\xa3\"\"34\\xff\\xff\\xff\\xa3\"\"345\" },\n  { \"$y$j75$.......\", \"$y$j75$.......$Nq4j1IZsYEWZBLlqjSt4AlhviyN7bvbvWrgjP6V2EF2\", \"U\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xff\" },\n  { \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.$5QyXXRlR57uked5ysXmCItOvXX4d5zR0ttqafx7Uo51\", \"U\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xff\" },\n  { \"$y$j85$.......\", \"$y$j85$.......$x1o1UfucDdAFjdXzREvO/f6o49Lo3h091xrnvwlnoFB\", \"U\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xff\" },\n  { \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.$ndX0.rOECgKW6OZnBTjfxbcscJdcWDdnr9Tw4degrG8\", \"U\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xffU\\xaa\\xff\" },\n  { \"$y$j75$.......\", \"$y$j75$.......$DzOck5j6dl2zwkbMlFcM04tpFK5PryDwpFI.Mm81/c0\", \"\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\" },\n  { \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.$r1z9RInA2Zcy6JNyEuy8aQjAHXqOZgF0z70zcCmR/N6\", \"\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\" },\n  { \"$y$j85$.......\", \"$y$j85$.......$p.9UI8XwpIn5Z/zR9D5FA5WVLCqr0D70B43s/qrDgTC\", \"\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\" },\n  { \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.$Zvdn9FqFFKCwm8AM/J58sQYerb6uxacC00SQzVllO21\", \"\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\\xaaU\" },\n  { \"$y$j75$.......\", \"$y$j75$.......$F0rjxBIyFkN54IVLBaKuM5YfEfLCid.cRdUgqU7F1m3\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\" },\n  { \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.$ZgTUWYYUx76vUOHZF0X27Rq9go43bzjSmecsreE0zo7\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\" },\n  { \"$y$j85$.......\", \"$y$j85$.......$ROueloIUt1VztPrvAgyjIMk0quqc9HG6M.BtxYIsvA.\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\" },\n  { \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.$A168ps.AKPbIXUE/wXjlE570CqBkRY7sJGXUC9d3703\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\" },\n  { \"$y$j75$.......\", \"$y$j75$.......$LPJMBkV8tc7ramZ1xWMLqoBVL4aBijXbWajjn4Vl3j3\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789chars after 72 are ignored\" },\n  { \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.$VyvQwJiydQK/7/IH2YN5xE2b9XuSqDrEGACYlWoi/T2\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789chars after 72 are ignored\" },\n  { \"$y$j85$.......\", \"$y$j85$.......$EBF/PgI1CrfkVbX5yoLX17I/rujRO6.Uk7C23pHTsj1\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789chars after 72 are ignored\" },\n  { \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.$319JYYAC5.f59Sjoe1Bai9oV5jBNssg2YuN7tUIsKf6\", \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789chars after 72 are ignored\" },\n  { \"$y$j75$.......\", \"$y$j75$.......$/JddBodz08R8Q5/Tm1.L.owqz/tnyE9pNHW/FMEr/T8\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\" },\n  { \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.$rOvJTqqIT7O0IxWztHPXlwM51x8OH6TDccKgvETfzEB\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\" },\n  { \"$y$j85$.......\", \"$y$j85$.......$zhMXhnmP.gcaiEKILOQ0uPSqcOn2Nfplf0Q0D.erAQC\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\" },\n  { \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.$/BIM1ElpX1fPxuYbjHwOojsDjRDxQQxl.DFSXERgSo9\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\" },\n  { \"$y$j75$.......\", \"$y$j75$.......$cCGRbVjL0QnKuM0Ia7JrF23BKJPsXBU5xco4JeDI261\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\"\"chars after 72 are ignored as usual\" },\n  { \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.$AvPvZNd5IAQFLQbERhlzfBq2276rzjKbD8RPiSxhMv.\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\"\"chars after 72 are ignored as usual\" },\n  { \"$y$j85$.......\", \"$y$j85$.......$oB2vJZ3pZWQB5NfqUOWkdDH7neDH96F4OWSqWP3adb/\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\"\"chars after 72 are ignored as usual\" },\n  { \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.$uFCPlt7crGqlxHcgP5VhNa/Y.TGV3rfrLf1818lF0s8\", \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\"\"chars after 72 are ignored as usual\" },\n  { \"$y$j75$.......\", \"$y$j75$.......$rH24sjf97yDTkvsCoaOjnMZO1TYYsUzU7XYvclwbXVD\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has forgotten.\" },\n  { \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.$GvVaUBsKJZRpLNffGI63DblLjvrJoswzwIKthTrHXPA\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has forgotten.\" },\n  { \"$y$j85$.......\", \"$y$j85$.......$7717E6WQ3N3SEk7pLxFR/pTBqAYrMQMm4/fSoiHtdF/\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has forgotten.\" },\n  { \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.$hMM1/N5eNTtPpY3oX/KRhSzvP/3NKATqL0yiHqyZBJ3\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has forgotten.\" },\n  { \"$y$j75$.......\", \"$y$j75$.......$6v6FMOgOfETtKAUsUjzlPEFqKzbkDZzXMu4cgRJKjP5\", \"THE YEAR\" },\n  { \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.$s0qvYYdO0C7xT6wRA3w1OvwQN1QFKFzQOjgDrNuprK6\", \"THE YEAR\" },\n  { \"$y$j85$.......\", \"$y$j85$.......$ZGmePNljl4FLa/oy7BUoETfx2Oxd8.ApP7.0JN82eSB\", \"THE YEAR\" },\n  { \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.$9bzSqsy.tgf3vABDP.Wuq0kUG2dQzR03IMMoqvle5I0\", \"THE YEAR\" },\n  { \"$y$j75$.......\", \"$y$j75$.......$HQLzXiMk5aoX4p5YhGs7gxpvSsaFgoyYtNbl8qwkff/\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and do\" },\n  { \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.$YHrsISjCmnYp5VOu2Z9LJ35ZFNKBVX4O588QmRjyVP3\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and do\" },\n  { \"$y$j85$.......\", \"$y$j85$.......$Vj0u6joQCGHbEGpEZo2lmqr607HKbbk8syGAIW5s7/D\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and do\" },\n  { \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.$D9U3XZCYxppcyiDqgrOBTXPCGw/5gR.mLQC7n7YM.H1\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and do\" },\n  { \"$y$j75$.......\", \"$y$j75$.......$4cpAwkBU2/aPOo0jOEv.jKHALwkIm249pwTl8ip3oJ7\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has f\" },\n  { \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j75$LdJMENpBABJJ3hIHjB1Bi.$U1mZ5XnIo.cxARAIbDW4yEX0XTQkIMrebpv3ozgRf6D\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has f\" },\n  { \"$y$j85$.......\", \"$y$j85$.......$jM1iuAyD3Sv3mHsjAEfqLcqT2pCN24.Oio37k6YgB47\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has f\" },\n  { \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.\", \"$y$j85$LdJMENpBABJJ3hIHjB1Bi.$tyD22ALWYD5Wl5tkIhSB0QXxBvBQls96l2AVKjX/ei3\", \"THE YEAR 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has f\" },\n#endif // yescrypt\n"
  },
  {
    "path": "test/ka-tester.c",
    "content": "/* Test crypt() API with \"known answer\" hashes.\n\n   Written by Zack Weinberg <zackw at panix.com> in 2019.\n   To the extent possible under law, Zack Weinberg has waived all\n   copyright and related or neighboring rights to this work.\n\n   See https://creativecommons.org/publicdomain/zero/1.0/ for further\n   details.  */\n\n#include \"crypt-port.h\"\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <errno.h>\n\n/* The precalculated hashes in ka-table.inc, and some of the\n   relationships among groups of test cases (see ka-table-gen.py)\n   are invalidated if the execution character set is not ASCII.  */\nstatic_assert(' ' == 0x20 && 'C' == 0x43 && '~' == 0x7E,\n              \"Execution character set does not appear to be ASCII\");\n\n/* This test verifies three things at once:\n    - crypt, crypt_r, crypt_rn, and crypt_ra\n      all produce the same outputs for the same inputs.\n    - given hash <- crypt(phrase, setting),\n       then hash == crypt(phrase, hash) also.\n    - crypt(phrase, setting) == crypt'(phrase, setting)\n      where crypt' is an independent implementation of the same\n      hashing method.  (This is the \"known answer\" part of the test.)\n\n   The independent implementations come from the Python 'passlib'\n   library: <https://passlib.readthedocs.io/en/stable/>.\n   See ka-table-gen.py for more detail.\n\n   This file is compiled once for each hash, with macros defined that\n   make ka-table.inc expose only the subset of the tests that are\n   relevant to that hash.  This allows the test driver to run the\n   known-answer tests for each enabled hash in parallel.  */\n\nstruct testcase\n{\n  const char *salt;\n  const char *expected;\n  const char *input;\n};\n\nstatic const struct testcase tests[] =\n{\n#include \"ka-table.inc\"\n\n  /* Sentinel.  */\n  { 0, 0, 0 },\n};\n\n/* Print out a string, using \\xXX escapes for any characters that are\n   not printable ASCII.  Backslash, single quote, and double quote are\n   also escaped, by preceding them with another backslash.  If machine-\n   parsing the output, note that we use the Python semantics of \\x, not\n   the C semantics: each \\x consumes _exactly two_ subsequent hex digits.\n   (For instance, \\x123 means 0x12 0x33.)  */\nstatic void\nprint_escaped (const char *s)\n{\n  const unsigned char *p = (const unsigned char *)s;\n  for (; *p; p++)\n    {\n      unsigned char c = *p;\n      if (c == '\\\\' || c == '\\\"' || c == '\\'')\n        {\n          putchar ('\\\\');\n          putchar (c);\n        }\n      else if (0x20 <= c && c <= 0x7E)\n        putchar (c);\n      else\n        printf (\"\\\\x%02x\", (unsigned int)c);\n    }\n}\n\n/* Subroutine of report_result.  */\nstatic void\nbegin_error_report (const struct testcase *tc, const char *tag)\n{\n  printf (\"FAIL: %s/\", tc->salt);\n  print_escaped (tc->input);\n  printf (\": %s \", tag);\n}\n\n/* Summarize the result of a single hashing operation.\n   If everything is as expected, prints nothing and returns 0.\n   Otherwise, prints a diagnostic message to stdout (not stderr!)\n   and returns 1.  */\nstatic int\nreport_result (const char *tag, const char *hash, int errnm,\n               const struct testcase *tc, bool expect_failure_tokens)\n{\n  if (hash && hash[0] != '*')\n    {\n      /* We don't look at errno in this branch, because errno is\n         allowed to be set by successful operations.  */\n      if (!strcmp (hash, tc->expected))\n        return 0;\n\n      begin_error_report (tc, tag);\n      printf (\"mismatch: expected %s got %s\\n\", tc->expected, hash);\n      return 1;\n    }\n  else\n    {\n      /* Ill-formed setting string arguments to 'crypt' are tested in a\n         different program, so we never _expect_ a failure.  However, if\n         we do get a failure, we want to log it in detail.  */\n      begin_error_report (tc, tag);\n\n      if (hash == 0)\n        printf (\"failure: got (null)\");\n      else\n        printf (\"failure: got %s\", hash);\n\n      /* errno should have been set.  */\n      if (errnm)\n        printf (\", errno = %s\", strerror (errnm));\n      else\n        printf (\", errno not set\");\n\n      /* Should the API used have generated a NULL or a failure token?  */\n      if (hash == 0 && expect_failure_tokens)\n        printf (\", failure token not generated\");\n      if (hash != 0 && !expect_failure_tokens)\n        printf (\", failure token wrongly generated\");\n\n      /* A failure token must never compare equal to the setting string\n         that was used in the computation.  N.B. recrypt uses crypt_rn,\n         which never produces failure tokens, so in this branch we can\n         safely assume that the setting string used was tc->salt\n         (if it generates one anyway that's an automatic failure).  */\n      if (hash != 0 && !strcmp (tc->salt, hash))\n        printf (\", failure token == salt\");\n\n      putchar ('\\n');\n      return 1;\n    }\n}\n\nstatic int\ncalc_hashes_crypt (void)\n{\n  char *hash;\n  const struct testcase *t;\n  int status = 0;\n\n  for (t = tests; t->input != 0; t++)\n    {\n      errno = 0;\n      hash = crypt (t->input, t->salt);\n      status |= report_result (\"crypt\", hash, errno, t,\n                               ENABLE_FAILURE_TOKENS);\n    }\n\n  return status;\n}\n\nstatic int\ncalc_hashes_crypt_r_rn (void)\n{\n  char *hash;\n  union\n  {\n    char pass[CRYPT_MAX_PASSPHRASE_SIZE + 1];\n    int aligned;\n  } u;\n  const struct testcase *t;\n  struct crypt_data data;\n  int status = 0;\n\n  memset (&data, 0, sizeof data);\n  memset (u.pass, 0, CRYPT_MAX_PASSPHRASE_SIZE + 1);\n  for (t = tests; t->input != 0; t++)\n    {\n      strncpy(u.pass + 1, t->input, CRYPT_MAX_PASSPHRASE_SIZE);\n      printf(\"[%zu]: %s %s\\n\", strlen(t->input),\n             t->input, t->salt);\n      errno = 0;\n      hash = crypt_r (u.pass + 1, t->salt, &data);\n      status |= report_result (\"crypt_r\", hash, errno, t,\n                               ENABLE_FAILURE_TOKENS);\n\n      errno = 0;\n      hash = crypt_rn (u.pass + 1, t->salt, &data, (int)sizeof data);\n      status |= report_result (\"crypt_rn\", hash, errno, t, false);\n    }\n\n  return status;\n}\n\nstatic int\ncalc_hashes_crypt_ra_recrypt (void)\n{\n  char *hash;\n  const struct testcase *t;\n  void *datap = 0;\n  int datasz = 0;\n  int status = 0;\n\n  for (t = tests; t->input != 0; t++)\n    {\n      errno = 0;\n      hash = crypt_ra (t->input, t->salt, &datap, &datasz);\n      if (report_result (\"crypt_ra\", hash, errno, t, false))\n        status = 1;\n      else\n        {\n          /* if we get here, we know hash == t->expected */\n          errno = 0;\n          hash = crypt_ra (t->input, t->expected,\n                           &datap, &datasz);\n          status |= report_result (\"recrypt\", hash, errno, t, false);\n        }\n    }\n\n  free (datap);\n  return status;\n}\n\nint\nmain (void)\n{\n  int status = 0;\n\n  /* Mark this test SKIPPED if the very first entry in the table is the\n     sentinel; this happens only when the hash we would test is disabled.  */\n  if (tests[0].input == 0)\n    return 77;\n\n  status |= calc_hashes_crypt ();\n  status |= calc_hashes_crypt_r_rn ();\n  status |= calc_hashes_crypt_ra_recrypt ();\n\n  return status;\n}\n"
  },
  {
    "path": "test/preferred-method.c",
    "content": "/* Copyright (C) 2018 Björn Esser <besser82@fedoraproject.org>\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\n#include \"crypt-port.h\"\n#include <stdio.h>\n\n#define PASSPHRASE \"Ob-La-Di, Ob-La-Da\"\n\nint\nmain (void)\n{\n  const char *pm = crypt_preferred_method();\n  int retval = 0;\n\n#if defined HASH_ALGORITHM_DEFAULT\n  if (pm == NULL)\n    {\n      printf (\"FAIL: crypt_preferred_method returned NULL.\\n\");\n      retval = 1;\n    }\n  else\n    {\n      printf (\"PASS: crypt_preferred_method returned \\\"%s\\\".\\n\", pm);\n\n      char gs[CRYPT_GENSALT_OUTPUT_SIZE];\n      struct crypt_data cd;\n\n      crypt_gensalt_rn (NULL, 0, NULL, 0, gs, sizeof (gs));\n\n      if (strncmp (gs, pm, strlen (pm)))\n        {\n          printf (\"FAIL: crypt_preferred_method: \\\"%s\\\" \", pm);\n          printf (\"differs from default prefix.\\n\");\n          printf (\"crypt_gensalt returned: \\\"%s\\\".\\n\", gs);\n          retval = 1;\n        }\n      else\n        {\n          printf (\"PASS: crypt_preferred_method: \\\"%s\\\" \", pm);\n          printf (\"is the same as default prefix used by \");\n          printf (\"crypt_gensalt.\\n\");\n        }\n\n      crypt_gensalt_rn (pm, 0, NULL, 0, gs, sizeof (gs));\n\n      if (gs[0] == '*')\n        {\n          printf (\"FAIL: crypt_preferred_method: \\\"%s\\\" \", pm);\n          printf (\"is not a valid prefix for crypt_gensalt.\\n\");\n          printf (\"crypt_gensalt returned: \\\"%s\\\".\\n\", gs);\n          retval = 1;\n        }\n      else\n        {\n          printf (\"PASS: crypt_preferred_method: \\\"%s\\\" \", pm);\n          printf (\"is a valid prefix for crypt_gensalt.\\n\");\n        }\n\n      if (strncmp (gs, pm, strlen (pm)))\n        {\n          printf (\"FAIL: crypt_preferred_method: \\\"%s\\\" \", pm);\n          printf (\"does not generate a setting for \");\n          printf (\"the intended method.\\n\");\n          printf (\"crypt_gensalt returned: \\\"%s\\\".\\n\", gs);\n          retval = 1;\n        }\n      else\n        {\n          printf (\"PASS: crypt_preferred_method: \\\"%s\\\" \", pm);\n          printf (\"does generate a setting for \");\n          printf (\"the intended method.\\n\");\n        }\n\n      crypt_r (PASSPHRASE, gs, &cd);\n\n      if (cd.output[0] == '*')\n        {\n          printf (\"FAIL: crypt_preferred_method: \\\"%s\\\" \", pm);\n          printf (\"is not a valid prefix for crypt.\\n\");\n          printf (\"crypt returned: \\\"%s\\\".\\n\", gs);\n          retval = 1;\n        }\n      else\n        {\n          printf (\"PASS: crypt_preferred_method: \\\"%s\\\" \", pm);\n          printf (\"is a valid prefix for crypt.\\n\");\n        }\n\n      if (strncmp (cd.output, pm, strlen (pm)))\n        {\n          printf (\"FAIL: crypt_preferred_method: \\\"%s\\\" \", pm);\n          printf (\"does not generate a hash with \");\n          printf (\"the intended method.\\n\");\n          printf (\"crypt returned: \\\"%s\\\".\\n\", gs);\n          retval = 1;\n        }\n      else\n        {\n          printf (\"PASS: crypt_preferred_method: \\\"%s\\\" \", pm);\n          printf (\"does generate a hash with \");\n          printf (\"the intended method.\\n\");\n        }\n    }\n#else\n  if (pm != NULL)\n    {\n      printf (\"FAIL: crypt_preferred_method returned: \\\"%s\\\" \", pm);\n      printf (\"instead of NULL.\\n\");\n      retval = 1;\n    }\n  else\n    {\n      printf (\"PASS: crypt_preferred_method returned NULL.\");\n    }\n#endif\n\n  return retval;\n}\n"
  },
  {
    "path": "test/short-outbuf.c",
    "content": "/* Copyright (C) 2018 Björn Esser <besser82@fedoraproject.org>\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\n#include \"crypt-port.h\"\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n\nstruct testcase\n{\n  const char *exp_rn;\n  const char *exp_ra;\n};\n\nstatic const struct testcase testcases[] =\n{\n  { \"\",   \"*0\" },\n  { \"*\",  \"*0\" },\n  { \"*0\", \"*0\" },\n};\n\nint\nmain (void)\n{\n  bool ok = true;\n  char result[5];\n\n  for (size_t i = 0; i < ARRAY_SIZE (testcases); i++)\n    {\n      size_t s = i + 1;\n      int j = (int) s;\n      char *outbuf = malloc (sizeof (char) * s);\n\n      crypt_rn (\"@@\", \"@@\", outbuf, j);\n\n      if (!strncmp (testcases[i].exp_rn, outbuf, s))\n        {\n          strcpy (result, \"PASS\");\n        }\n      else\n        {\n          strcpy (result, \"FAIL\");\n          ok = false;\n        }\n\n      printf (\"Test %zu.0: %s, expected: \\\"%-2s\\\", got: \\\"%-2s\\\"\\n\",\n              s, result, testcases[i].exp_rn, outbuf);\n\n      crypt_ra (\"@@\", \"@@\", (void **) &outbuf, &j);\n\n      if (!strncmp (testcases[i].exp_ra, outbuf, strlen(outbuf)))\n        {\n          strcpy (result, \"PASS\");\n        }\n      else\n        {\n          strcpy (result, \"FAIL\");\n          ok = false;\n        }\n\n      printf (\"Test %zu.1: %s, expected: \\\"%-2s\\\", got: \\\"%-2s\\\"\\n\",\n              s, result, testcases[i].exp_ra, outbuf);\n\n      j = -1;\n\n      crypt_ra (\"@@\", \"@@\", (void **) &outbuf, &j);\n\n      if (!strncmp (testcases[i].exp_ra, outbuf, strlen(outbuf)))\n        {\n          strcpy (result, \"PASS\");\n        }\n      else\n        {\n          strcpy (result, \"FAIL\");\n          ok = false;\n        }\n\n      printf (\"Test %zu.2: %s, expected: \\\"%-2s\\\", got: \\\"%-2s\\\"\\n\",\n              s, result, testcases[i].exp_ra, outbuf);\n\n      free (outbuf);\n      outbuf = NULL;\n      j = sizeof (struct crypt_data);\n\n      crypt_ra (\"@@\", \"@@\", (void **) &outbuf, &j);\n\n      if (!strncmp (testcases[i].exp_ra, outbuf, strlen(outbuf)))\n        {\n          strcpy (result, \"PASS\");\n        }\n      else\n        {\n          strcpy (result, \"FAIL\");\n          ok = false;\n        }\n\n      printf (\"Test %zu.3: %s, expected: \\\"%-2s\\\", got: \\\"%-2s\\\"\\n\",\n              s, result, testcases[i].exp_ra, outbuf);\n\n      free (outbuf);\n    }\n\n  return ok ? 0 : 1;\n}\n"
  },
  {
    "path": "test/special-char-salt.c",
    "content": "/* Copyright (C) 2020-2021 Björn Esser <besser82@fedoraproject.org>\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\n/* Simple test to ensure compatibility of our implementations of the\n   md5crypt, sha256crypt, and sha512crypt hashing method with the ones\n   found in other commonly used libcrypt libraries.  Their implementations\n   allow for any ASCII character (with one exception to the colon ':'\n   character, that has special meaning in the Unix shadow file) to be\n   present in a salt string.  */\n\n#include \"crypt-port.h\"\n\n#if INCLUDE_md5crypt || INCLUDE_sha256crypt || INCLUDE_sha512crypt || INCLUDE_sm3crypt\n\n#include <stdio.h>\n\nstruct testcase\n{\n  const char *setting;\n  const char *expected;\n};\n\nstatic const struct testcase testcases[] =\n{\n#if INCLUDE_md5crypt\n  {\"$1$\", \"$1$$Nxrr.XTiS6AY.7S2ye3OA1\"},\n  {\"$1$\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\", \"*0\"},\n  {\"$1$\\x02\\x02\\x02\\x02\\x02\\x02\\x02\\x02\\x02\\x02\\x02\\x02\\x02\\x02\\x02\\x02\", \"*0\"},\n  {\"$1$\\x03\\x03\\x03\\x03\\x03\\x03\\x03\\x03\\x03\\x03\\x03\\x03\\x03\\x03\\x03\\x03\", \"*0\"},\n  {\"$1$\\x04\\x04\\x04\\x04\\x04\\x04\\x04\\x04\\x04\\x04\\x04\\x04\\x04\\x04\\x04\\x04\", \"*0\"},\n  {\"$1$\\x05\\x05\\x05\\x05\\x05\\x05\\x05\\x05\\x05\\x05\\x05\\x05\\x05\\x05\\x05\\x05\", \"*0\"},\n  {\"$1$\\x06\\x06\\x06\\x06\\x06\\x06\\x06\\x06\\x06\\x06\\x06\\x06\\x06\\x06\\x06\\x06\", \"*0\"},\n  {\"$1$\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\", \"*0\"},\n  {\"$1$\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\", \"*0\"},\n  {\"$1$\\x09\\x09\\x09\\x09\\x09\\x09\\x09\\x09\\x09\\x09\\x09\\x09\\x09\\x09\\x09\\x09\", \"*0\"},\n  {\"$1$\\x0a\\x0a\\x0a\\x0a\\x0a\\x0a\\x0a\\x0a\\x0a\\x0a\\x0a\\x0a\\x0a\\x0a\\x0a\\x0a\", \"*0\"},\n  {\"$1$\\x0b\\x0b\\x0b\\x0b\\x0b\\x0b\\x0b\\x0b\\x0b\\x0b\\x0b\\x0b\\x0b\\x0b\\x0b\\x0b\", \"*0\"},\n  {\"$1$\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\", \"*0\"},\n  {\"$1$\\x0d\\x0d\\x0d\\x0d\\x0d\\x0d\\x0d\\x0d\\x0d\\x0d\\x0d\\x0d\\x0d\\x0d\\x0d\\x0d\", \"*0\"},\n  {\"$1$\\x0e\\x0e\\x0e\\x0e\\x0e\\x0e\\x0e\\x0e\\x0e\\x0e\\x0e\\x0e\\x0e\\x0e\\x0e\\x0e\", \"*0\"},\n  {\"$1$\\x0f\\x0f\\x0f\\x0f\\x0f\\x0f\\x0f\\x0f\\x0f\\x0f\\x0f\\x0f\\x0f\\x0f\\x0f\\x0f\", \"*0\"},\n  {\"$1$\\x10\\x10\\x10\\x10\\x10\\x10\\x10\\x10\\x10\\x10\\x10\\x10\\x10\\x10\\x10\\x10\", \"*0\"},\n  {\"$1$\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\", \"*0\"},\n  {\"$1$\\x12\\x12\\x12\\x12\\x12\\x12\\x12\\x12\\x12\\x12\\x12\\x12\\x12\\x12\\x12\\x12\", \"*0\"},\n  {\"$1$\\x13\\x13\\x13\\x13\\x13\\x13\\x13\\x13\\x13\\x13\\x13\\x13\\x13\\x13\\x13\\x13\", \"*0\"},\n  {\"$1$\\x14\\x14\\x14\\x14\\x14\\x14\\x14\\x14\\x14\\x14\\x14\\x14\\x14\\x14\\x14\\x14\", \"*0\"},\n  {\"$1$\\x15\\x15\\x15\\x15\\x15\\x15\\x15\\x15\\x15\\x15\\x15\\x15\\x15\\x15\\x15\\x15\", \"*0\"},\n  {\"$1$\\x16\\x16\\x16\\x16\\x16\\x16\\x16\\x16\\x16\\x16\\x16\\x16\\x16\\x16\\x16\\x16\", \"*0\"},\n  {\"$1$\\x17\\x17\\x17\\x17\\x17\\x17\\x17\\x17\\x17\\x17\\x17\\x17\\x17\\x17\\x17\\x17\", \"*0\"},\n  {\"$1$\\x18\\x18\\x18\\x18\\x18\\x18\\x18\\x18\\x18\\x18\\x18\\x18\\x18\\x18\\x18\\x18\", \"*0\"},\n  {\"$1$\\x19\\x19\\x19\\x19\\x19\\x19\\x19\\x19\\x19\\x19\\x19\\x19\\x19\\x19\\x19\\x19\", \"*0\"},\n  {\"$1$\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\", \"*0\"},\n  {\"$1$\\x1b\\x1b\\x1b\\x1b\\x1b\\x1b\\x1b\\x1b\\x1b\\x1b\\x1b\\x1b\\x1b\\x1b\\x1b\\x1b\", \"*0\"},\n  {\"$1$\\x1c\\x1c\\x1c\\x1c\\x1c\\x1c\\x1c\\x1c\\x1c\\x1c\\x1c\\x1c\\x1c\\x1c\\x1c\\x1c\", \"*0\"},\n  {\"$1$\\x1d\\x1d\\x1d\\x1d\\x1d\\x1d\\x1d\\x1d\\x1d\\x1d\\x1d\\x1d\\x1d\\x1d\\x1d\\x1d\", \"*0\"},\n  {\"$1$\\x1e\\x1e\\x1e\\x1e\\x1e\\x1e\\x1e\\x1e\\x1e\\x1e\\x1e\\x1e\\x1e\\x1e\\x1e\\x1e\", \"*0\"},\n  {\"$1$\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\", \"*0\"},\n  {\"$1$                \", \"*0\"},\n  {\"$1$!!!!!!!!!!!!!!!!\", \"*0\"},\n  {\"$1$\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\", \"$1$\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"$epL1smbL5e8WnI4OmGUIQ.\"},\n  {\"$1$################\", \"$1$########$BTXbxyZ1vI4TivVy61i3y.\"},\n  {\"$1$$$$$$$$$$$$$$$$$\", \"$1$$Nxrr.XTiS6AY.7S2ye3OA1\"},\n  {\"$1$%%%%%%%%%%%%%%%%\", \"$1$%%%%%%%%$b.qcij9q4onx9Z11Io6Rm0\"},\n  {\"$1$&&&&&&&&&&&&&&&&\", \"$1$&&&&&&&&$VED/ZzenKsKk0VWdWPvZd.\"},\n  {\"$1$''''''''''''''''\", \"$1$''''''''$ug/mEvIhArMo2ZmDR.ukL0\"},\n  {\"$1$((((((((((((((((\", \"$1$(((((((($D1sJfyMGDYn68nzKKauI20\"},\n  {\"$1$))))))))))))))))\", \"$1$))))))))$koy9i6GsfoQJUdGDeKje..\"},\n  {\"$1$****************\", \"*0\"},\n  {\"$1$++++++++++++++++\", \"$1$++++++++$N3V3THe53iandIYWj9u3Z0\"},\n  {\"$1$,,,,,,,,,,,,,,,,\", \"$1$,,,,,,,,$0LQlmUbUFJ.0UMPEHhJOJ1\"},\n  {\"$1$----------------\", \"$1$--------$Ik.e0Cgi84iak0gQPBRU81\"},\n  {\"$1$................\", \"$1$........$YNN4lBU4qVf9ienSk8brr/\"},\n  {\"$1$////////////////\", \"$1$////////$1PzmjkqpnpM2Xx9sUHZrJ1\"},\n  {\"$1$0000000000000000\", \"$1$00000000$WIv0qOX13MxRPPkNATuzz/\"},\n  {\"$1$1111111111111111\", \"$1$11111111$kfWauknBJcj7MOR0nPgWG1\"},\n  {\"$1$2222222222222222\", \"$1$22222222$pN8.GpS.W6mUUsBd3w0aP0\"},\n  {\"$1$3333333333333333\", \"$1$33333333$A36NAKszUDbvHb2RGqIL5.\"},\n  {\"$1$4444444444444444\", \"$1$44444444$meQvyWbhi5NZtY7q60pKc/\"},\n  {\"$1$5555555555555555\", \"$1$55555555$lWRVMPymhoz3hU/1FZ5f70\"},\n  {\"$1$6666666666666666\", \"$1$66666666$Exx.2frtfKms4Iw22klhE0\"},\n  {\"$1$7777777777777777\", \"$1$77777777$42lxQ94MiNIq60eIwMX3G0\"},\n  {\"$1$8888888888888888\", \"$1$88888888$7uqcuVSxDGygAoyYUppiH/\"},\n  {\"$1$9999999999999999\", \"$1$99999999$s7b4BUN.GQWtpw9H1.DIa.\"},\n  {\"$1$::::::::::::::::\", \"*0\"},\n  {\"$1$;;;;;;;;;;;;;;;;\", \"*0\"},\n  {\"$1$<<<<<<<<<<<<<<<<\", \"$1$<<<<<<<<$TMxdcN3jjYkKA1tduDLFq.\"},\n  {\"$1$================\", \"$1$========$JmHCPrUJf5ZwatxiIEQzd1\"},\n  {\"$1$>>>>>>>>>>>>>>>>\", \"$1$>>>>>>>>$hc9L8QUv8Sr48QqgT9OU/1\"},\n  {\"$1$????????????????\", \"$1$????????$kl3sFY2vkCbiT1jGkTk4D.\"},\n  {\"$1$@@@@@@@@@@@@@@@@\", \"$1$@@@@@@@@$qG.6p.sulKDSneQYdmumq.\"},\n  {\"$1$AAAAAAAAAAAAAAAA\", \"$1$AAAAAAAA$rARmimYWpVtDMOkOCHZsV0\"},\n  {\"$1$BBBBBBBBBBBBBBBB\", \"$1$BBBBBBBB$ycTOhmpddCcf7lVvKX0tJ/\"},\n  {\"$1$CCCCCCCCCCCCCCCC\", \"$1$CCCCCCCC$meJSeRpVQnG8QHFUxconF.\"},\n  {\"$1$DDDDDDDDDDDDDDDD\", \"$1$DDDDDDDD$aeVX.La08fM6hqD4fwu3m/\"},\n  {\"$1$EEEEEEEEEEEEEEEE\", \"$1$EEEEEEEE$l7d7o3eXNRs1SjnbIKEgw/\"},\n  {\"$1$FFFFFFFFFFFFFFFF\", \"$1$FFFFFFFF$CxqkiERpodlM9sU3YBeGf1\"},\n  {\"$1$GGGGGGGGGGGGGGGG\", \"$1$GGGGGGGG$z6TSf5KIElqpRoooKKqTv/\"},\n  {\"$1$HHHHHHHHHHHHHHHH\", \"$1$HHHHHHHH$hoDSzfcrTMYCWkoJhy6sE0\"},\n  {\"$1$IIIIIIIIIIIIIIII\", \"$1$IIIIIIII$TkU6VWUwWZUeFYOXwtAq51\"},\n  {\"$1$JJJJJJJJJJJJJJJJ\", \"$1$JJJJJJJJ$WGaWHRzJ6KqPyTTNHz5Sx/\"},\n  {\"$1$KKKKKKKKKKKKKKKK\", \"$1$KKKKKKKK$jrb7xaFxBqUOSTL2Mqpuz0\"},\n  {\"$1$LLLLLLLLLLLLLLLL\", \"$1$LLLLLLLL$gjCuwxKCso6nkNlA/H1t4/\"},\n  {\"$1$MMMMMMMMMMMMMMMM\", \"$1$MMMMMMMM$nDq6vl28MDntXIk7XjhYa0\"},\n  {\"$1$NNNNNNNNNNNNNNNN\", \"$1$NNNNNNNN$xOFVP1RpOGrEbbCqj5wQR/\"},\n  {\"$1$OOOOOOOOOOOOOOOO\", \"$1$OOOOOOOO$6nRSEBBy1ugB2IpKUmjBZ/\"},\n  {\"$1$PPPPPPPPPPPPPPPP\", \"$1$PPPPPPPP$V.oSP3Xx4yLeNMwbHtVri0\"},\n  {\"$1$QQQQQQQQQQQQQQQQ\", \"$1$QQQQQQQQ$j5CplJvskamHbbJr/KDdc/\"},\n  {\"$1$RRRRRRRRRRRRRRRR\", \"$1$RRRRRRRR$ggNTLaAVAnOGIqWBWxezW.\"},\n  {\"$1$SSSSSSSSSSSSSSSS\", \"$1$SSSSSSSS$/CE/Y6QawKcGuhWKYyRdu0\"},\n  {\"$1$TTTTTTTTTTTTTTTT\", \"$1$TTTTTTTT$WADhbmdTKuZwV.qGr2jUN0\"},\n  {\"$1$UUUUUUUUUUUUUUUU\", \"$1$UUUUUUUU$qkEJoJb4OnrFpH6bnH4g5/\"},\n  {\"$1$VVVVVVVVVVVVVVVV\", \"$1$VVVVVVVV$2wuSe47ONM48I0MEMRITG.\"},\n  {\"$1$WWWWWWWWWWWWWWWW\", \"$1$WWWWWWWW$vH/XOSxWseOr.Fw5EdFxr/\"},\n  {\"$1$XXXXXXXXXXXXXXXX\", \"$1$XXXXXXXX$70M55QoHBsLko.FFc6Cp11\"},\n  {\"$1$YYYYYYYYYYYYYYYY\", \"$1$YYYYYYYY$ntauSgB0OwKqb8.ik6HMM/\"},\n  {\"$1$ZZZZZZZZZZZZZZZZ\", \"$1$ZZZZZZZZ$j1htqKO9MRZP455gQ4OBR1\"},\n  {\"$1$[[[[[[[[[[[[[[[[\", \"$1$[[[[[[[[$YOdsKzhIoPKXHuBW8ffeo0\"},\n  {\"$1$\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\", \"*0\"},\n  {\"$1$]]]]]]]]]]]]]]]]\", \"$1$]]]]]]]]$6zvmbgSu3saeTevjvPBA70\"},\n  {\"$1$^^^^^^^^^^^^^^^^\", \"$1$^^^^^^^^$Wv2rkpIRDuiQ.Blobxcx8.\"},\n  {\"$1$________________\", \"$1$________$LUlsmTnGQigLnnlsnkX8o0\"},\n  {\"$1$````````````````\", \"$1$````````$oKci.FIXaRhOaiOcA6Mzi/\"},\n  {\"$1$aaaaaaaaaaaaaaaa\", \"$1$aaaaaaaa$.yfukZepOC7STW9Bwbw0f1\"},\n  {\"$1$bbbbbbbbbbbbbbbb\", \"$1$bbbbbbbb$B8AEHJyJP9pdKiVqdezmU.\"},\n  {\"$1$cccccccccccccccc\", \"$1$cccccccc$CjWos3pM1lGi2p84Ta4kG0\"},\n  {\"$1$dddddddddddddddd\", \"$1$dddddddd$i9ye4TY0noHzrRDXPNzpu/\"},\n  {\"$1$eeeeeeeeeeeeeeee\", \"$1$eeeeeeee$NTNWA/D.glIRU/hTgj5/x.\"},\n  {\"$1$ffffffffffffffff\", \"$1$ffffffff$VERjgO485ZgxByW.ZW5Pr.\"},\n  {\"$1$gggggggggggggggg\", \"$1$gggggggg$.d7Evd2ZuF5.5HKiC9ztA1\"},\n  {\"$1$hhhhhhhhhhhhhhhh\", \"$1$hhhhhhhh$8yUmO.8la8.NKuY93.vN0/\"},\n  {\"$1$iiiiiiiiiiiiiiii\", \"$1$iiiiiiii$Nm7qy3PE/l67qH5ChuGO8.\"},\n  {\"$1$jjjjjjjjjjjjjjjj\", \"$1$jjjjjjjj$eozS0hxT1TYnIGyS97ytQ1\"},\n  {\"$1$kkkkkkkkkkkkkkkk\", \"$1$kkkkkkkk$vgL1OKMr7doJdjjG1Nn2C0\"},\n  {\"$1$llllllllllllllll\", \"$1$llllllll$hcK96/tM.gWe1IAI6MS7E1\"},\n  {\"$1$mmmmmmmmmmmmmmmm\", \"$1$mmmmmmmm$y1uAEuAGCYBBtWVqCZSek1\"},\n  {\"$1$nnnnnnnnnnnnnnnn\", \"$1$nnnnnnnn$.6Ky5wTLYM5HLS5FbwSrZ1\"},\n  {\"$1$oooooooooooooooo\", \"$1$oooooooo$syXICQSw8utrPrAOz41yZ1\"},\n  {\"$1$pppppppppppppppp\", \"$1$pppppppp$Qd0rS5ZsHCXWjZeJkGCDZ/\"},\n  {\"$1$qqqqqqqqqqqqqqqq\", \"$1$qqqqqqqq$NKTfQNaTgQdMzqwSH/yH01\"},\n  {\"$1$rrrrrrrrrrrrrrrr\", \"$1$rrrrrrrr$eCx3wAEkuOeWKq.TxmGZ31\"},\n  {\"$1$ssssssssssssssss\", \"$1$ssssssss$dmgoNRxFJ.Uvvi48RkcdV.\"},\n  {\"$1$tttttttttttttttt\", \"$1$tttttttt$d1OszLtpuCf0I6KjqFXd30\"},\n  {\"$1$uuuuuuuuuuuuuuuu\", \"$1$uuuuuuuu$y4iwsDsCwenDsUI0hGg72.\"},\n  {\"$1$vvvvvvvvvvvvvvvv\", \"$1$vvvvvvvv$IKlHLyWn9rUXcumgVCVwC.\"},\n  {\"$1$wwwwwwwwwwwwwwww\", \"$1$wwwwwwww$RavCRC59VdCiezcgyiIwC1\"},\n  {\"$1$xxxxxxxxxxxxxxxx\", \"$1$xxxxxxxx$GZDIpernfuj7a/Iy2CTL70\"},\n  {\"$1$yyyyyyyyyyyyyyyy\", \"$1$yyyyyyyy$bNX5MvbK.MKW6x8MNYhgW0\"},\n  {\"$1$zzzzzzzzzzzzzzzz\", \"$1$zzzzzzzz$Bz5/HkvZ/FJMCOCNWfXEg0\"},\n  {\"$1${{{{{{{{{{{{{{{{\", \"$1${{{{{{{{$pzvQi.ekvLBgGAGyu/EmW/\"},\n  {\"$1$||||||||||||||||\", \"$1$||||||||$MQEVd9ZBTfnBpn3fHH9vV0\"},\n  {\"$1$}}}}}}}}}}}}}}}}\", \"$1$}}}}}}}}$SP2cIcNL58YC/LwTmJEed0\"},\n  {\"$1$~~~~~~~~~~~~~~~~\", \"$1$~~~~~~~~$3smC2d7JWcLL2lGnzsVww1\"},\n  {\"$1$\\x7f\\x7f\\x7f\\x7f\\x7f\\x7f\\x7f\\x7f\\x7f\\x7f\\x7f\\x7f\\x7f\\x7f\\x7f\\x7f\", \"*0\"},\n  {\"$1$\\x80\\x80\\x80\\x80\\x80\\x80\\x80\\x80\\x80\\x80\\x80\\x80\\x80\\x80\\x80\\x80\", \"*0\"},\n  {\"$1$\\x81\\x81\\x81\\x81\\x81\\x81\\x81\\x81\\x81\\x81\\x81\\x81\\x81\\x81\\x81\\x81\", \"*0\"},\n  {\"$1$\\x82\\x82\\x82\\x82\\x82\\x82\\x82\\x82\\x82\\x82\\x82\\x82\\x82\\x82\\x82\\x82\", \"*0\"},\n  {\"$1$\\x83\\x83\\x83\\x83\\x83\\x83\\x83\\x83\\x83\\x83\\x83\\x83\\x83\\x83\\x83\\x83\", \"*0\"},\n  {\"$1$\\x84\\x84\\x84\\x84\\x84\\x84\\x84\\x84\\x84\\x84\\x84\\x84\\x84\\x84\\x84\\x84\", \"*0\"},\n  {\"$1$\\x85\\x85\\x85\\x85\\x85\\x85\\x85\\x85\\x85\\x85\\x85\\x85\\x85\\x85\\x85\\x85\", \"*0\"},\n  {\"$1$\\x86\\x86\\x86\\x86\\x86\\x86\\x86\\x86\\x86\\x86\\x86\\x86\\x86\\x86\\x86\\x86\", \"*0\"},\n  {\"$1$\\x87\\x87\\x87\\x87\\x87\\x87\\x87\\x87\\x87\\x87\\x87\\x87\\x87\\x87\\x87\\x87\", \"*0\"},\n  {\"$1$\\x88\\x88\\x88\\x88\\x88\\x88\\x88\\x88\\x88\\x88\\x88\\x88\\x88\\x88\\x88\\x88\", \"*0\"},\n  {\"$1$\\x89\\x89\\x89\\x89\\x89\\x89\\x89\\x89\\x89\\x89\\x89\\x89\\x89\\x89\\x89\\x89\", \"*0\"},\n  {\"$1$\\x8a\\x8a\\x8a\\x8a\\x8a\\x8a\\x8a\\x8a\\x8a\\x8a\\x8a\\x8a\\x8a\\x8a\\x8a\\x8a\", \"*0\"},\n  {\"$1$\\x8b\\x8b\\x8b\\x8b\\x8b\\x8b\\x8b\\x8b\\x8b\\x8b\\x8b\\x8b\\x8b\\x8b\\x8b\\x8b\", \"*0\"},\n  {\"$1$\\x8c\\x8c\\x8c\\x8c\\x8c\\x8c\\x8c\\x8c\\x8c\\x8c\\x8c\\x8c\\x8c\\x8c\\x8c\\x8c\", \"*0\"},\n  {\"$1$\\x8d\\x8d\\x8d\\x8d\\x8d\\x8d\\x8d\\x8d\\x8d\\x8d\\x8d\\x8d\\x8d\\x8d\\x8d\\x8d\", \"*0\"},\n  {\"$1$\\x8e\\x8e\\x8e\\x8e\\x8e\\x8e\\x8e\\x8e\\x8e\\x8e\\x8e\\x8e\\x8e\\x8e\\x8e\\x8e\", \"*0\"},\n  {\"$1$\\x8f\\x8f\\x8f\\x8f\\x8f\\x8f\\x8f\\x8f\\x8f\\x8f\\x8f\\x8f\\x8f\\x8f\\x8f\\x8f\", \"*0\"},\n  {\"$1$\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\", \"*0\"},\n  {\"$1$\\x91\\x91\\x91\\x91\\x91\\x91\\x91\\x91\\x91\\x91\\x91\\x91\\x91\\x91\\x91\\x91\", \"*0\"},\n  {\"$1$\\x92\\x92\\x92\\x92\\x92\\x92\\x92\\x92\\x92\\x92\\x92\\x92\\x92\\x92\\x92\\x92\", \"*0\"},\n  {\"$1$\\x93\\x93\\x93\\x93\\x93\\x93\\x93\\x93\\x93\\x93\\x93\\x93\\x93\\x93\\x93\\x93\", \"*0\"},\n  {\"$1$\\x94\\x94\\x94\\x94\\x94\\x94\\x94\\x94\\x94\\x94\\x94\\x94\\x94\\x94\\x94\\x94\", \"*0\"},\n  {\"$1$\\x95\\x95\\x95\\x95\\x95\\x95\\x95\\x95\\x95\\x95\\x95\\x95\\x95\\x95\\x95\\x95\", \"*0\"},\n  {\"$1$\\x96\\x96\\x96\\x96\\x96\\x96\\x96\\x96\\x96\\x96\\x96\\x96\\x96\\x96\\x96\\x96\", \"*0\"},\n  {\"$1$\\x97\\x97\\x97\\x97\\x97\\x97\\x97\\x97\\x97\\x97\\x97\\x97\\x97\\x97\\x97\\x97\", \"*0\"},\n  {\"$1$\\x98\\x98\\x98\\x98\\x98\\x98\\x98\\x98\\x98\\x98\\x98\\x98\\x98\\x98\\x98\\x98\", \"*0\"},\n  {\"$1$\\x99\\x99\\x99\\x99\\x99\\x99\\x99\\x99\\x99\\x99\\x99\\x99\\x99\\x99\\x99\\x99\", \"*0\"},\n  {\"$1$\\x9a\\x9a\\x9a\\x9a\\x9a\\x9a\\x9a\\x9a\\x9a\\x9a\\x9a\\x9a\\x9a\\x9a\\x9a\\x9a\", \"*0\"},\n  {\"$1$\\x9b\\x9b\\x9b\\x9b\\x9b\\x9b\\x9b\\x9b\\x9b\\x9b\\x9b\\x9b\\x9b\\x9b\\x9b\\x9b\", \"*0\"},\n  {\"$1$\\x9c\\x9c\\x9c\\x9c\\x9c\\x9c\\x9c\\x9c\\x9c\\x9c\\x9c\\x9c\\x9c\\x9c\\x9c\\x9c\", \"*0\"},\n  {\"$1$\\x9d\\x9d\\x9d\\x9d\\x9d\\x9d\\x9d\\x9d\\x9d\\x9d\\x9d\\x9d\\x9d\\x9d\\x9d\\x9d\", \"*0\"},\n  {\"$1$\\x9e\\x9e\\x9e\\x9e\\x9e\\x9e\\x9e\\x9e\\x9e\\x9e\\x9e\\x9e\\x9e\\x9e\\x9e\\x9e\", \"*0\"},\n  {\"$1$\\x9f\\x9f\\x9f\\x9f\\x9f\\x9f\\x9f\\x9f\\x9f\\x9f\\x9f\\x9f\\x9f\\x9f\\x9f\\x9f\", \"*0\"},\n  {\"$1$\\xa0\\xa0\\xa0\\xa0\\xa0\\xa0\\xa0\\xa0\\xa0\\xa0\\xa0\\xa0\\xa0\\xa0\\xa0\\xa0\", \"*0\"},\n  {\"$1$\\xa1\\xa1\\xa1\\xa1\\xa1\\xa1\\xa1\\xa1\\xa1\\xa1\\xa1\\xa1\\xa1\\xa1\\xa1\\xa1\", \"*0\"},\n  {\"$1$\\xa2\\xa2\\xa2\\xa2\\xa2\\xa2\\xa2\\xa2\\xa2\\xa2\\xa2\\xa2\\xa2\\xa2\\xa2\\xa2\", \"*0\"},\n  {\"$1$\\xa3\\xa3\\xa3\\xa3\\xa3\\xa3\\xa3\\xa3\\xa3\\xa3\\xa3\\xa3\\xa3\\xa3\\xa3\\xa3\", \"*0\"},\n  {\"$1$\\xa4\\xa4\\xa4\\xa4\\xa4\\xa4\\xa4\\xa4\\xa4\\xa4\\xa4\\xa4\\xa4\\xa4\\xa4\\xa4\", \"*0\"},\n  {\"$1$\\xa5\\xa5\\xa5\\xa5\\xa5\\xa5\\xa5\\xa5\\xa5\\xa5\\xa5\\xa5\\xa5\\xa5\\xa5\\xa5\", \"*0\"},\n  {\"$1$\\xa6\\xa6\\xa6\\xa6\\xa6\\xa6\\xa6\\xa6\\xa6\\xa6\\xa6\\xa6\\xa6\\xa6\\xa6\\xa6\", \"*0\"},\n  {\"$1$\\xa7\\xa7\\xa7\\xa7\\xa7\\xa7\\xa7\\xa7\\xa7\\xa7\\xa7\\xa7\\xa7\\xa7\\xa7\\xa7\", \"*0\"},\n  {\"$1$\\xa8\\xa8\\xa8\\xa8\\xa8\\xa8\\xa8\\xa8\\xa8\\xa8\\xa8\\xa8\\xa8\\xa8\\xa8\\xa8\", \"*0\"},\n  {\"$1$\\xa9\\xa9\\xa9\\xa9\\xa9\\xa9\\xa9\\xa9\\xa9\\xa9\\xa9\\xa9\\xa9\\xa9\\xa9\\xa9\", \"*0\"},\n  {\"$1$\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\", \"*0\"},\n  {\"$1$\\xab\\xab\\xab\\xab\\xab\\xab\\xab\\xab\\xab\\xab\\xab\\xab\\xab\\xab\\xab\\xab\", \"*0\"},\n  {\"$1$\\xac\\xac\\xac\\xac\\xac\\xac\\xac\\xac\\xac\\xac\\xac\\xac\\xac\\xac\\xac\\xac\", \"*0\"},\n  {\"$1$\\xad\\xad\\xad\\xad\\xad\\xad\\xad\\xad\\xad\\xad\\xad\\xad\\xad\\xad\\xad\\xad\", \"*0\"},\n  {\"$1$\\xae\\xae\\xae\\xae\\xae\\xae\\xae\\xae\\xae\\xae\\xae\\xae\\xae\\xae\\xae\\xae\", \"*0\"},\n  {\"$1$\\xaf\\xaf\\xaf\\xaf\\xaf\\xaf\\xaf\\xaf\\xaf\\xaf\\xaf\\xaf\\xaf\\xaf\\xaf\\xaf\", \"*0\"},\n  {\"$1$\\xb0\\xb0\\xb0\\xb0\\xb0\\xb0\\xb0\\xb0\\xb0\\xb0\\xb0\\xb0\\xb0\\xb0\\xb0\\xb0\", \"*0\"},\n  {\"$1$\\xb1\\xb1\\xb1\\xb1\\xb1\\xb1\\xb1\\xb1\\xb1\\xb1\\xb1\\xb1\\xb1\\xb1\\xb1\\xb1\", \"*0\"},\n  {\"$1$\\xb2\\xb2\\xb2\\xb2\\xb2\\xb2\\xb2\\xb2\\xb2\\xb2\\xb2\\xb2\\xb2\\xb2\\xb2\\xb2\", \"*0\"},\n  {\"$1$\\xb3\\xb3\\xb3\\xb3\\xb3\\xb3\\xb3\\xb3\\xb3\\xb3\\xb3\\xb3\\xb3\\xb3\\xb3\\xb3\", \"*0\"},\n  {\"$1$\\xb4\\xb4\\xb4\\xb4\\xb4\\xb4\\xb4\\xb4\\xb4\\xb4\\xb4\\xb4\\xb4\\xb4\\xb4\\xb4\", \"*0\"},\n  {\"$1$\\xb5\\xb5\\xb5\\xb5\\xb5\\xb5\\xb5\\xb5\\xb5\\xb5\\xb5\\xb5\\xb5\\xb5\\xb5\\xb5\", \"*0\"},\n  {\"$1$\\xb6\\xb6\\xb6\\xb6\\xb6\\xb6\\xb6\\xb6\\xb6\\xb6\\xb6\\xb6\\xb6\\xb6\\xb6\\xb6\", \"*0\"},\n  {\"$1$\\xb7\\xb7\\xb7\\xb7\\xb7\\xb7\\xb7\\xb7\\xb7\\xb7\\xb7\\xb7\\xb7\\xb7\\xb7\\xb7\", \"*0\"},\n  {\"$1$\\xb8\\xb8\\xb8\\xb8\\xb8\\xb8\\xb8\\xb8\\xb8\\xb8\\xb8\\xb8\\xb8\\xb8\\xb8\\xb8\", \"*0\"},\n  {\"$1$\\xb9\\xb9\\xb9\\xb9\\xb9\\xb9\\xb9\\xb9\\xb9\\xb9\\xb9\\xb9\\xb9\\xb9\\xb9\\xb9\", \"*0\"},\n  {\"$1$\\xba\\xba\\xba\\xba\\xba\\xba\\xba\\xba\\xba\\xba\\xba\\xba\\xba\\xba\\xba\\xba\", \"*0\"},\n  {\"$1$\\xbb\\xbb\\xbb\\xbb\\xbb\\xbb\\xbb\\xbb\\xbb\\xbb\\xbb\\xbb\\xbb\\xbb\\xbb\\xbb\", \"*0\"},\n  {\"$1$\\xbc\\xbc\\xbc\\xbc\\xbc\\xbc\\xbc\\xbc\\xbc\\xbc\\xbc\\xbc\\xbc\\xbc\\xbc\\xbc\", \"*0\"},\n  {\"$1$\\xbd\\xbd\\xbd\\xbd\\xbd\\xbd\\xbd\\xbd\\xbd\\xbd\\xbd\\xbd\\xbd\\xbd\\xbd\\xbd\", \"*0\"},\n  {\"$1$\\xbe\\xbe\\xbe\\xbe\\xbe\\xbe\\xbe\\xbe\\xbe\\xbe\\xbe\\xbe\\xbe\\xbe\\xbe\\xbe\", \"*0\"},\n  {\"$1$\\xbf\\xbf\\xbf\\xbf\\xbf\\xbf\\xbf\\xbf\\xbf\\xbf\\xbf\\xbf\\xbf\\xbf\\xbf\\xbf\", \"*0\"},\n  {\"$1$\\xc0\\xc0\\xc0\\xc0\\xc0\\xc0\\xc0\\xc0\\xc0\\xc0\\xc0\\xc0\\xc0\\xc0\\xc0\\xc0\", \"*0\"},\n  {\"$1$\\xc1\\xc1\\xc1\\xc1\\xc1\\xc1\\xc1\\xc1\\xc1\\xc1\\xc1\\xc1\\xc1\\xc1\\xc1\\xc1\", \"*0\"},\n  {\"$1$\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\", \"*0\"},\n  {\"$1$\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\", \"*0\"},\n  {\"$1$\\xc4\\xc4\\xc4\\xc4\\xc4\\xc4\\xc4\\xc4\\xc4\\xc4\\xc4\\xc4\\xc4\\xc4\\xc4\\xc4\", \"*0\"},\n  {\"$1$\\xc5\\xc5\\xc5\\xc5\\xc5\\xc5\\xc5\\xc5\\xc5\\xc5\\xc5\\xc5\\xc5\\xc5\\xc5\\xc5\", \"*0\"},\n  {\"$1$\\xc6\\xc6\\xc6\\xc6\\xc6\\xc6\\xc6\\xc6\\xc6\\xc6\\xc6\\xc6\\xc6\\xc6\\xc6\\xc6\", \"*0\"},\n  {\"$1$\\xc7\\xc7\\xc7\\xc7\\xc7\\xc7\\xc7\\xc7\\xc7\\xc7\\xc7\\xc7\\xc7\\xc7\\xc7\\xc7\", \"*0\"},\n  {\"$1$\\xc8\\xc8\\xc8\\xc8\\xc8\\xc8\\xc8\\xc8\\xc8\\xc8\\xc8\\xc8\\xc8\\xc8\\xc8\\xc8\", \"*0\"},\n  {\"$1$\\xc9\\xc9\\xc9\\xc9\\xc9\\xc9\\xc9\\xc9\\xc9\\xc9\\xc9\\xc9\\xc9\\xc9\\xc9\\xc9\", \"*0\"},\n  {\"$1$\\xca\\xca\\xca\\xca\\xca\\xca\\xca\\xca\\xca\\xca\\xca\\xca\\xca\\xca\\xca\\xca\", \"*0\"},\n  {\"$1$\\xcb\\xcb\\xcb\\xcb\\xcb\\xcb\\xcb\\xcb\\xcb\\xcb\\xcb\\xcb\\xcb\\xcb\\xcb\\xcb\", \"*0\"},\n  {\"$1$\\xcc\\xcc\\xcc\\xcc\\xcc\\xcc\\xcc\\xcc\\xcc\\xcc\\xcc\\xcc\\xcc\\xcc\\xcc\\xcc\", \"*0\"},\n  {\"$1$\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\", \"*0\"},\n  {\"$1$\\xce\\xce\\xce\\xce\\xce\\xce\\xce\\xce\\xce\\xce\\xce\\xce\\xce\\xce\\xce\\xce\", \"*0\"},\n  {\"$1$\\xcf\\xcf\\xcf\\xcf\\xcf\\xcf\\xcf\\xcf\\xcf\\xcf\\xcf\\xcf\\xcf\\xcf\\xcf\\xcf\", \"*0\"},\n  {\"$1$\\xd0\\xd0\\xd0\\xd0\\xd0\\xd0\\xd0\\xd0\\xd0\\xd0\\xd0\\xd0\\xd0\\xd0\\xd0\\xd0\", \"*0\"},\n  {\"$1$\\xd1\\xd1\\xd1\\xd1\\xd1\\xd1\\xd1\\xd1\\xd1\\xd1\\xd1\\xd1\\xd1\\xd1\\xd1\\xd1\", \"*0\"},\n  {\"$1$\\xd2\\xd2\\xd2\\xd2\\xd2\\xd2\\xd2\\xd2\\xd2\\xd2\\xd2\\xd2\\xd2\\xd2\\xd2\\xd2\", \"*0\"},\n  {\"$1$\\xd3\\xd3\\xd3\\xd3\\xd3\\xd3\\xd3\\xd3\\xd3\\xd3\\xd3\\xd3\\xd3\\xd3\\xd3\\xd3\", \"*0\"},\n  {\"$1$\\xd4\\xd4\\xd4\\xd4\\xd4\\xd4\\xd4\\xd4\\xd4\\xd4\\xd4\\xd4\\xd4\\xd4\\xd4\\xd4\", \"*0\"},\n  {\"$1$\\xd5\\xd5\\xd5\\xd5\\xd5\\xd5\\xd5\\xd5\\xd5\\xd5\\xd5\\xd5\\xd5\\xd5\\xd5\\xd5\", \"*0\"},\n  {\"$1$\\xd6\\xd6\\xd6\\xd6\\xd6\\xd6\\xd6\\xd6\\xd6\\xd6\\xd6\\xd6\\xd6\\xd6\\xd6\\xd6\", \"*0\"},\n  {\"$1$\\xd7\\xd7\\xd7\\xd7\\xd7\\xd7\\xd7\\xd7\\xd7\\xd7\\xd7\\xd7\\xd7\\xd7\\xd7\\xd7\", \"*0\"},\n  {\"$1$\\xd8\\xd8\\xd8\\xd8\\xd8\\xd8\\xd8\\xd8\\xd8\\xd8\\xd8\\xd8\\xd8\\xd8\\xd8\\xd8\", \"*0\"},\n  {\"$1$\\xd9\\xd9\\xd9\\xd9\\xd9\\xd9\\xd9\\xd9\\xd9\\xd9\\xd9\\xd9\\xd9\\xd9\\xd9\\xd9\", \"*0\"},\n  {\"$1$\\xda\\xda\\xda\\xda\\xda\\xda\\xda\\xda\\xda\\xda\\xda\\xda\\xda\\xda\\xda\\xda\", \"*0\"},\n  {\"$1$\\xdb\\xdb\\xdb\\xdb\\xdb\\xdb\\xdb\\xdb\\xdb\\xdb\\xdb\\xdb\\xdb\\xdb\\xdb\\xdb\", \"*0\"},\n  {\"$1$\\xdc\\xdc\\xdc\\xdc\\xdc\\xdc\\xdc\\xdc\\xdc\\xdc\\xdc\\xdc\\xdc\\xdc\\xdc\\xdc\", \"*0\"},\n  {\"$1$\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\", \"*0\"},\n  {\"$1$\\xde\\xde\\xde\\xde\\xde\\xde\\xde\\xde\\xde\\xde\\xde\\xde\\xde\\xde\\xde\\xde\", \"*0\"},\n  {\"$1$\\xdf\\xdf\\xdf\\xdf\\xdf\\xdf\\xdf\\xdf\\xdf\\xdf\\xdf\\xdf\\xdf\\xdf\\xdf\\xdf\", \"*0\"},\n  {\"$1$\\xe0\\xe0\\xe0\\xe0\\xe0\\xe0\\xe0\\xe0\\xe0\\xe0\\xe0\\xe0\\xe0\\xe0\\xe0\\xe0\", \"*0\"},\n  {\"$1$\\xe1\\xe1\\xe1\\xe1\\xe1\\xe1\\xe1\\xe1\\xe1\\xe1\\xe1\\xe1\\xe1\\xe1\\xe1\\xe1\", \"*0\"},\n  {\"$1$\\xe2\\xe2\\xe2\\xe2\\xe2\\xe2\\xe2\\xe2\\xe2\\xe2\\xe2\\xe2\\xe2\\xe2\\xe2\\xe2\", \"*0\"},\n  {\"$1$\\xe3\\xe3\\xe3\\xe3\\xe3\\xe3\\xe3\\xe3\\xe3\\xe3\\xe3\\xe3\\xe3\\xe3\\xe3\\xe3\", \"*0\"},\n  {\"$1$\\xe4\\xe4\\xe4\\xe4\\xe4\\xe4\\xe4\\xe4\\xe4\\xe4\\xe4\\xe4\\xe4\\xe4\\xe4\\xe4\", \"*0\"},\n  {\"$1$\\xe5\\xe5\\xe5\\xe5\\xe5\\xe5\\xe5\\xe5\\xe5\\xe5\\xe5\\xe5\\xe5\\xe5\\xe5\\xe5\", \"*0\"},\n  {\"$1$\\xe6\\xe6\\xe6\\xe6\\xe6\\xe6\\xe6\\xe6\\xe6\\xe6\\xe6\\xe6\\xe6\\xe6\\xe6\\xe6\", \"*0\"},\n  {\"$1$\\xe7\\xe7\\xe7\\xe7\\xe7\\xe7\\xe7\\xe7\\xe7\\xe7\\xe7\\xe7\\xe7\\xe7\\xe7\\xe7\", \"*0\"},\n  {\"$1$\\xe8\\xe8\\xe8\\xe8\\xe8\\xe8\\xe8\\xe8\\xe8\\xe8\\xe8\\xe8\\xe8\\xe8\\xe8\\xe8\", \"*0\"},\n  {\"$1$\\xe9\\xe9\\xe9\\xe9\\xe9\\xe9\\xe9\\xe9\\xe9\\xe9\\xe9\\xe9\\xe9\\xe9\\xe9\\xe9\", \"*0\"},\n  {\"$1$\\xea\\xea\\xea\\xea\\xea\\xea\\xea\\xea\\xea\\xea\\xea\\xea\\xea\\xea\\xea\\xea\", \"*0\"},\n  {\"$1$\\xeb\\xeb\\xeb\\xeb\\xeb\\xeb\\xeb\\xeb\\xeb\\xeb\\xeb\\xeb\\xeb\\xeb\\xeb\\xeb\", \"*0\"},\n  {\"$1$\\xec\\xec\\xec\\xec\\xec\\xec\\xec\\xec\\xec\\xec\\xec\\xec\\xec\\xec\\xec\\xec\", \"*0\"},\n  {\"$1$\\xed\\xed\\xed\\xed\\xed\\xed\\xed\\xed\\xed\\xed\\xed\\xed\\xed\\xed\\xed\\xed\", \"*0\"},\n  {\"$1$\\xee\\xee\\xee\\xee\\xee\\xee\\xee\\xee\\xee\\xee\\xee\\xee\\xee\\xee\\xee\\xee\", \"*0\"},\n  {\"$1$\\xef\\xef\\xef\\xef\\xef\\xef\\xef\\xef\\xef\\xef\\xef\\xef\\xef\\xef\\xef\\xef\", \"*0\"},\n  {\"$1$\\xf0\\xf0\\xf0\\xf0\\xf0\\xf0\\xf0\\xf0\\xf0\\xf0\\xf0\\xf0\\xf0\\xf0\\xf0\\xf0\", \"*0\"},\n  {\"$1$\\xf1\\xf1\\xf1\\xf1\\xf1\\xf1\\xf1\\xf1\\xf1\\xf1\\xf1\\xf1\\xf1\\xf1\\xf1\\xf1\", \"*0\"},\n  {\"$1$\\xf2\\xf2\\xf2\\xf2\\xf2\\xf2\\xf2\\xf2\\xf2\\xf2\\xf2\\xf2\\xf2\\xf2\\xf2\\xf2\", \"*0\"},\n  {\"$1$\\xf3\\xf3\\xf3\\xf3\\xf3\\xf3\\xf3\\xf3\\xf3\\xf3\\xf3\\xf3\\xf3\\xf3\\xf3\\xf3\", \"*0\"},\n  {\"$1$\\xf4\\xf4\\xf4\\xf4\\xf4\\xf4\\xf4\\xf4\\xf4\\xf4\\xf4\\xf4\\xf4\\xf4\\xf4\\xf4\", \"*0\"},\n  {\"$1$\\xf5\\xf5\\xf5\\xf5\\xf5\\xf5\\xf5\\xf5\\xf5\\xf5\\xf5\\xf5\\xf5\\xf5\\xf5\\xf5\", \"*0\"},\n  {\"$1$\\xf6\\xf6\\xf6\\xf6\\xf6\\xf6\\xf6\\xf6\\xf6\\xf6\\xf6\\xf6\\xf6\\xf6\\xf6\\xf6\", \"*0\"},\n  {\"$1$\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\", \"*0\"},\n  {\"$1$\\xf8\\xf8\\xf8\\xf8\\xf8\\xf8\\xf8\\xf8\\xf8\\xf8\\xf8\\xf8\\xf8\\xf8\\xf8\\xf8\", \"*0\"},\n  {\"$1$\\xf9\\xf9\\xf9\\xf9\\xf9\\xf9\\xf9\\xf9\\xf9\\xf9\\xf9\\xf9\\xf9\\xf9\\xf9\\xf9\", \"*0\"},\n  {\"$1$\\xfa\\xfa\\xfa\\xfa\\xfa\\xfa\\xfa\\xfa\\xfa\\xfa\\xfa\\xfa\\xfa\\xfa\\xfa\\xfa\", \"*0\"},\n  {\"$1$\\xfb\\xfb\\xfb\\xfb\\xfb\\xfb\\xfb\\xfb\\xfb\\xfb\\xfb\\xfb\\xfb\\xfb\\xfb\\xfb\", \"*0\"},\n  {\"$1$\\xfc\\xfc\\xfc\\xfc\\xfc\\xfc\\xfc\\xfc\\xfc\\xfc\\xfc\\xfc\\xfc\\xfc\\xfc\\xfc\", \"*0\"},\n  {\"$1$\\xfd\\xfd\\xfd\\xfd\\xfd\\xfd\\xfd\\xfd\\xfd\\xfd\\xfd\\xfd\\xfd\\xfd\\xfd\\xfd\", \"*0\"},\n  {\"$1$\\xfe\\xfe\\xfe\\xfe\\xfe\\xfe\\xfe\\xfe\\xfe\\xfe\\xfe\\xfe\\xfe\\xfe\\xfe\\xfe\", \"*0\"},\n  {\"$1$\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\", \"*0\"},\n#endif\n#if INCLUDE_sm3crypt\n  {\"$sm3$\", \"$sm3$$HhPEDu1bjf.xru5vFLDfb/JywfIdph0sazvY4rLf7vD\"},\n  {\"$sm3$\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\", \"*0\"},\n  {\"$sm3$\\x02\\x02\\x02\\x02\\x02\\x02\\x02\\x02\\x02\\x02\\x02\\x02\\x02\\x02\\x02\\x02\", \"*0\"},\n  {\"$sm3$\\x03\\x03\\x03\\x03\\x03\\x03\\x03\\x03\\x03\\x03\\x03\\x03\\x03\\x03\\x03\\x03\", \"*0\"},\n  {\"$sm3$\\x04\\x04\\x04\\x04\\x04\\x04\\x04\\x04\\x04\\x04\\x04\\x04\\x04\\x04\\x04\\x04\", \"*0\"},\n  {\"$sm3$\\x05\\x05\\x05\\x05\\x05\\x05\\x05\\x05\\x05\\x05\\x05\\x05\\x05\\x05\\x05\\x05\", \"*0\"},\n  {\"$sm3$\\x06\\x06\\x06\\x06\\x06\\x06\\x06\\x06\\x06\\x06\\x06\\x06\\x06\\x06\\x06\\x06\", \"*0\"},\n  {\"$sm3$\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\", \"*0\"},\n  {\"$sm3$\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\", \"*0\"},\n  {\"$sm3$\\x09\\x09\\x09\\x09\\x09\\x09\\x09\\x09\\x09\\x09\\x09\\x09\\x09\\x09\\x09\\x09\", \"*0\"},\n  {\"$sm3$\\x0a\\x0a\\x0a\\x0a\\x0a\\x0a\\x0a\\x0a\\x0a\\x0a\\x0a\\x0a\\x0a\\x0a\\x0a\\x0a\", \"*0\"},\n  {\"$sm3$\\x0b\\x0b\\x0b\\x0b\\x0b\\x0b\\x0b\\x0b\\x0b\\x0b\\x0b\\x0b\\x0b\\x0b\\x0b\\x0b\", \"*0\"},\n  {\"$sm3$\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\", \"*0\"},\n  {\"$sm3$\\x0d\\x0d\\x0d\\x0d\\x0d\\x0d\\x0d\\x0d\\x0d\\x0d\\x0d\\x0d\\x0d\\x0d\\x0d\\x0d\", \"*0\"},\n  {\"$sm3$\\x0e\\x0e\\x0e\\x0e\\x0e\\x0e\\x0e\\x0e\\x0e\\x0e\\x0e\\x0e\\x0e\\x0e\\x0e\\x0e\", \"*0\"},\n  {\"$sm3$\\x0f\\x0f\\x0f\\x0f\\x0f\\x0f\\x0f\\x0f\\x0f\\x0f\\x0f\\x0f\\x0f\\x0f\\x0f\\x0f\", \"*0\"},\n  {\"$sm3$\\x10\\x10\\x10\\x10\\x10\\x10\\x10\\x10\\x10\\x10\\x10\\x10\\x10\\x10\\x10\\x10\", \"*0\"},\n  {\"$sm3$\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\", \"*0\"},\n  {\"$sm3$\\x12\\x12\\x12\\x12\\x12\\x12\\x12\\x12\\x12\\x12\\x12\\x12\\x12\\x12\\x12\\x12\", \"*0\"},\n  {\"$sm3$\\x13\\x13\\x13\\x13\\x13\\x13\\x13\\x13\\x13\\x13\\x13\\x13\\x13\\x13\\x13\\x13\", \"*0\"},\n  {\"$sm3$\\x14\\x14\\x14\\x14\\x14\\x14\\x14\\x14\\x14\\x14\\x14\\x14\\x14\\x14\\x14\\x14\", \"*0\"},\n  {\"$sm3$\\x15\\x15\\x15\\x15\\x15\\x15\\x15\\x15\\x15\\x15\\x15\\x15\\x15\\x15\\x15\\x15\", \"*0\"},\n  {\"$sm3$\\x16\\x16\\x16\\x16\\x16\\x16\\x16\\x16\\x16\\x16\\x16\\x16\\x16\\x16\\x16\\x16\", \"*0\"},\n  {\"$sm3$\\x17\\x17\\x17\\x17\\x17\\x17\\x17\\x17\\x17\\x17\\x17\\x17\\x17\\x17\\x17\\x17\", \"*0\"},\n  {\"$sm3$\\x18\\x18\\x18\\x18\\x18\\x18\\x18\\x18\\x18\\x18\\x18\\x18\\x18\\x18\\x18\\x18\", \"*0\"},\n  {\"$sm3$\\x19\\x19\\x19\\x19\\x19\\x19\\x19\\x19\\x19\\x19\\x19\\x19\\x19\\x19\\x19\\x19\", \"*0\"},\n  {\"$sm3$\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\", \"*0\"},\n  {\"$sm3$\\x1b\\x1b\\x1b\\x1b\\x1b\\x1b\\x1b\\x1b\\x1b\\x1b\\x1b\\x1b\\x1b\\x1b\\x1b\\x1b\", \"*0\"},\n  {\"$sm3$\\x1c\\x1c\\x1c\\x1c\\x1c\\x1c\\x1c\\x1c\\x1c\\x1c\\x1c\\x1c\\x1c\\x1c\\x1c\\x1c\", \"*0\"},\n  {\"$sm3$\\x1d\\x1d\\x1d\\x1d\\x1d\\x1d\\x1d\\x1d\\x1d\\x1d\\x1d\\x1d\\x1d\\x1d\\x1d\\x1d\", \"*0\"},\n  {\"$sm3$\\x1e\\x1e\\x1e\\x1e\\x1e\\x1e\\x1e\\x1e\\x1e\\x1e\\x1e\\x1e\\x1e\\x1e\\x1e\\x1e\", \"*0\"},\n  {\"$sm3$\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\", \"*0\"},\n  {\"$sm3$                \", \"*0\"},\n  {\"$sm3$!!!!!!!!!!!!!!!!\", \"*0\"},\n  {\"$sm3$\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\", \"$sm3$\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"$rotR.HwtkJKBXpNsFTuZB4R3viMAQUfrYmcGjocBPM1\"},\n  {\"$sm3$################\", \"$sm3$################$9n039tE799I46RPFM.o9E41MvlKcUvz9tLrfQcsEdZC\"},\n  {\"$sm3$%%%%%%%%%%%%%%%%\", \"$sm3$%%%%%%%%%%%%%%%%$661EqK8/5q69rZHLFpmYyYBQWcmX/LiUe8RyaGLRKlD\"},\n  {\"$sm3$&&&&&&&&&&&&&&&&\", \"$sm3$&&&&&&&&&&&&&&&&$VmSc06G/ZI.t6W0LWlZHjLMn3kWi3r7i5CDdMirqIp/\"},\n  {\"$sm3$''''''''''''''''\", \"$sm3$''''''''''''''''$s4KixzCP9YBybPlaFpTJxEHSCbYkc/vudwSmtY9/qF1\"},\n  {\"$sm3$((((((((((((((((\", \"$sm3$(((((((((((((((($zsgVpKMSuppBhZDuDvfH8cEVVPkvJQ1DBkZa9hszMN2\"},\n  {\"$sm3$))))))))))))))))\", \"$sm3$))))))))))))))))$H12uGU70P8sKLt6hiVN7kZN9KhJcxaqWauLQslli/qC\"},\n  {\"$sm3$++++++++++++++++\", \"$sm3$++++++++++++++++$N.4x7wI.768Jp/LeMryviDUd2dXWwCHFYmc25qgws5.\"},\n  {\"$sm3$,,,,,,,,,,,,,,,,\", \"$sm3$,,,,,,,,,,,,,,,,$EuBOskVycfHLyCbhd1/LXSCvzcxsEslq2Q2kRhbTGf3\"},\n  {\"$sm3$----------------\", \"$sm3$----------------$UykKwOl45sxrgWbzkSX2e1KJeh86Cdut6k.MLVB2QC.\"},\n  {\"$sm3$................\", \"$sm3$................$41qwH0Q2iCPIJRIRHU.TiSm/TUhqD7pYY1pfwRmLHQ6\"},\n  {\"$sm3$////////////////\", \"$sm3$////////////////$pQlGWtRKKVR3XHbFZhcd8mvTZNriAav0alSCZQf3ar5\"},\n  {\"$sm3$0000000000000000\", \"$sm3$0000000000000000$5SihUZa0diNkVMWju/Dgmw96rE7Ya7nduLr.2NdSTo9\"},\n  {\"$sm3$1111111111111111\", \"$sm3$1111111111111111$RYiw/RShgd9geFnT9et0oiTINSbzgZiInliGLklJbx5\"},\n  {\"$sm3$2222222222222222\", \"$sm3$2222222222222222$toe8tenehDVdnbp3J9ej36ZEUcbigkWbdKa2vhgB580\"},\n  {\"$sm3$3333333333333333\", \"$sm3$3333333333333333$BsgOwxWAye3esGMecZA.CWBDaxkQF6VtHHUyHvfZ1h4\"},\n  {\"$sm3$4444444444444444\", \"$sm3$4444444444444444$rBDZf61BLefacVapw4Oidmcg3v2SxY/dPFrTnZK0TtB\"},\n  {\"$sm3$5555555555555555\", \"$sm3$5555555555555555$nLvDt7JxzhIsVQNzsTBUK4C5cpe/ObEtkpJtsxVdyZ9\"},\n  {\"$sm3$6666666666666666\", \"$sm3$6666666666666666$1VliklUe.bMtXGRfvXK1pqPQVddn5Q3D9UJv/ixQp14\"},\n  {\"$sm3$7777777777777777\", \"$sm3$7777777777777777$B8NCD50PzK6hPicvC9hkPrvYbhaSkmz.vZlGc0TAat9\"},\n  {\"$sm3$8888888888888888\", \"$sm3$8888888888888888$As83spSU14r1YzwQ.iHfybJ6zvPju9VpP1u2vqmeqfC\"},\n  {\"$sm3$9999999999999999\", \"$sm3$9999999999999999$ybFZUgqh80x4FMTRyh99Xc.AlYyEGrNkIqZ6EPsnQe0\"},\n  {\"$sm3$::::::::::::::::\", \"*0\"},\n  {\"$sm3$;;;;;;;;;;;;;;;;\", \"*0\"},\n  {\"$sm3$<<<<<<<<<<<<<<<<\", \"$sm3$<<<<<<<<<<<<<<<<$ed.OwIxIwaByO8R7jf4HJE8IeefxD.lRYMpoX9eNOuC\"},\n  {\"$sm3$================\", \"$sm3$================$DEKH.cIvUJjFPex/AxVDIQU925IHAuuCeanH4MbPVd9\"},\n  {\"$sm3$>>>>>>>>>>>>>>>>\", \"$sm3$>>>>>>>>>>>>>>>>$OqR4fJiVv.mnsryKt3cL8XpQgKRVmuZIg2fF8QSIcG4\"},\n  {\"$sm3$????????????????\", \"$sm3$????????????????$wPIbzWinDJcdmugdaOJ6Qhr2sFqyye9DTjnxll/9zw8\"},\n  {\"$sm3$@@@@@@@@@@@@@@@@\", \"$sm3$@@@@@@@@@@@@@@@@$McJNNmlRv/OngIUCEdj2kvNAmfN6EOdWu6eaU0AC.39\"},\n  {\"$sm3$AAAAAAAAAAAAAAAA\", \"$sm3$AAAAAAAAAAAAAAAA$QVnx1uttJDvm4tHlr4dysQTENEdms40gPSDsXfoBhND\"},\n  {\"$sm3$BBBBBBBBBBBBBBBB\", \"$sm3$BBBBBBBBBBBBBBBB$615myiFdDt9/s5YAhqY35sDbgHgvqABzHTPZY8qltv7\"},\n  {\"$sm3$CCCCCCCCCCCCCCCC\", \"$sm3$CCCCCCCCCCCCCCCC$NljEz23Shmj2b9gR4CK65fkgaIYbOfhW.TbaKKXvdg9\"},\n  {\"$sm3$DDDDDDDDDDDDDDDD\", \"$sm3$DDDDDDDDDDDDDDDD$6hhg8Vuwixb8LnVzwvS4MDZpkOBBFnVAZmgUye2bmg5\"},\n  {\"$sm3$EEEEEEEEEEEEEEEE\", \"$sm3$EEEEEEEEEEEEEEEE$L7GuK5kdMMUnzpG4ghruHWvyPaMNZxkqijePlHzPGW.\"},\n  {\"$sm3$FFFFFFFFFFFFFFFF\", \"$sm3$FFFFFFFFFFFFFFFF$CKjNBsUkFP1O8kyuetByO8qTIAOFpFQYHNktDR56tx3\"},\n  {\"$sm3$GGGGGGGGGGGGGGGG\", \"$sm3$GGGGGGGGGGGGGGGG$ZspbB5E685aZG7V3HzSCb98kf/Xqq1enk4v8bUkAkS3\"},\n  {\"$sm3$HHHHHHHHHHHHHHHH\", \"$sm3$HHHHHHHHHHHHHHHH$740Kc6mj/hbVIi1jFbohimaHjJ5UW8BlhnO9JJxzYA0\"},\n  {\"$sm3$IIIIIIIIIIIIIIII\", \"$sm3$IIIIIIIIIIIIIIII$EDqGkw7oXp/WP1vt467mSDRmNevEs26RkmWHn5rGh8B\"},\n  {\"$sm3$JJJJJJJJJJJJJJJJ\", \"$sm3$JJJJJJJJJJJJJJJJ$eYMJPEJHwSn4dVaSsGFSh28609C.I2f9O57GaqBXVt.\"},\n  {\"$sm3$KKKKKKKKKKKKKKKK\", \"$sm3$KKKKKKKKKKKKKKKK$y70uJ/vpCD/4iGu6CLW5RbPoaEhFToyBIBK37OxNNyD\"},\n  {\"$sm3$LLLLLLLLLLLLLLLL\", \"$sm3$LLLLLLLLLLLLLLLL$eoLMHi6kcbQmUT619rOHg2RkfKqvZGWu3HEGbUa8olC\"},\n  {\"$sm3$MMMMMMMMMMMMMMMM\", \"$sm3$MMMMMMMMMMMMMMMM$UCgx1Tm7mN3r3bOSJhB9zHpdPFax4j33d7npFLKxcYB\"},\n  {\"$sm3$NNNNNNNNNNNNNNNN\", \"$sm3$NNNNNNNNNNNNNNNN$y4PlpQbyQdaamI.slv5JmS.YQv1txLkIwmk6k7CVttD\"},\n  {\"$sm3$OOOOOOOOOOOOOOOO\", \"$sm3$OOOOOOOOOOOOOOOO$oAgyc2rpzZQIH2MW9UiE2GAd.w5rQJDiNkp6F4WKQR5\"},\n  {\"$sm3$PPPPPPPPPPPPPPPP\", \"$sm3$PPPPPPPPPPPPPPPP$Oa/r5NmFHcjhpcTL.eqrlU5ZaF3gFZW4DCMtbDwjXa3\"},\n  {\"$sm3$QQQQQQQQQQQQQQQQ\", \"$sm3$QQQQQQQQQQQQQQQQ$FvQmpACpogoRqU6lImLJIUhhNeyqDx.pzs.PM4SYK/8\"},\n  {\"$sm3$RRRRRRRRRRRRRRRR\", \"$sm3$RRRRRRRRRRRRRRRR$y82r9hNLOEIu1YGxOpnY9W5aN/RPkdoEqotDXOpvrQ4\"},\n  {\"$sm3$SSSSSSSSSSSSSSSS\", \"$sm3$SSSSSSSSSSSSSSSS$1xrhD5tFFRyHnRoDC2x20ZuH9yQX0oTWJTMlCc7moz.\"},\n  {\"$sm3$TTTTTTTTTTTTTTTT\", \"$sm3$TTTTTTTTTTTTTTTT$.ZfNLRvLuvEucTiQotv0GxIQ7m2MIH75EvbOkunPCE9\"},\n  {\"$sm3$UUUUUUUUUUUUUUUU\", \"$sm3$UUUUUUUUUUUUUUUU$6s0rERfzx.5Y4y86nxV4qSacYjhV7gj5/njuvUptCC8\"},\n  {\"$sm3$VVVVVVVVVVVVVVVV\", \"$sm3$VVVVVVVVVVVVVVVV$P66ODLYxQzJkwrlxIAz9SiqLHyHMDRE3WbcxZVZge18\"},\n  {\"$sm3$WWWWWWWWWWWWWWWW\", \"$sm3$WWWWWWWWWWWWWWWW$KCOfBl4lt9JmbdbTq50lerZWwjG9yDWQTmiHLyGf3F8\"},\n  {\"$sm3$XXXXXXXXXXXXXXXX\", \"$sm3$XXXXXXXXXXXXXXXX$MvWWfbbjjwTstV.I45mKeXPodrXKJfKP3JowNf8oPS.\"},\n  {\"$sm3$YYYYYYYYYYYYYYYY\", \"$sm3$YYYYYYYYYYYYYYYY$K5RgEOXt0IwK5YYjJSFxx2dDgtcGdLSRLQ5wgSNuvM6\"},\n  {\"$sm3$ZZZZZZZZZZZZZZZZ\", \"$sm3$ZZZZZZZZZZZZZZZZ$bXbOyyE/lNafvCIXs1vxjTS9qnxxFBW/t1emzhAhTB5\"},\n  {\"$sm3$[[[[[[[[[[[[[[[[\", \"$sm3$[[[[[[[[[[[[[[[[$VBpnOTvA6cbEw2dga7d4rKUNPA7ZDmH5/lYrhc9.DPA\"},\n  {\"$sm3$\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\", \"*0\"},\n  {\"$sm3$]]]]]]]]]]]]]]]]\", \"$sm3$]]]]]]]]]]]]]]]]$W0Y5yUpXYmrbJwMFu..6vzpKpGvW.QHtNs0SUXxELl6\"},\n  {\"$sm3$^^^^^^^^^^^^^^^^\", \"$sm3$^^^^^^^^^^^^^^^^$Z.fBSo1IsC11naMAy/SbZNpFsdmIPdSAk0ea178FHM9\"},\n  {\"$sm3$________________\", \"$sm3$________________$z.MrCO.StIK/piDWn9geSKrDuuFClBPffZBZ2vRI010\"},\n  {\"$sm3$````````````````\", \"$sm3$````````````````$Lfd2TyYUjFnK5xc7rYC2WjWLky.ivWo7BYIivZiBSvC\"},\n  {\"$sm3$aaaaaaaaaaaaaaaa\", \"$sm3$aaaaaaaaaaaaaaaa$xCVY.YbpISXGfs1znx5f1er4ZfMmvy3tOT6dKMssub.\"},\n  {\"$sm3$bbbbbbbbbbbbbbbb\", \"$sm3$bbbbbbbbbbbbbbbb$POZlgEI.maXDED6iaKRzS/b.9wEtfPqy178V5mF/3u1\"},\n  {\"$sm3$cccccccccccccccc\", \"$sm3$cccccccccccccccc$vwqpi5/j0..HatglZVP.sLG9cDbUG3BdCQjJqjeVgd.\"},\n  {\"$sm3$dddddddddddddddd\", \"$sm3$dddddddddddddddd$jR8EmJC9z2hc5J4xUXY5.DxfMVD6thTnnm4lUTIR3h5\"},\n  {\"$sm3$eeeeeeeeeeeeeeee\", \"$sm3$eeeeeeeeeeeeeeee$4mWcyWAeLhMOZURPu0/P3x6R3H8sK4czLDNiIaojXV6\"},\n  {\"$sm3$ffffffffffffffff\", \"$sm3$ffffffffffffffff$sXNxxiWxealPK6A25IRkQGYwtLdp3pppktpFyMmvHp4\"},\n  {\"$sm3$gggggggggggggggg\", \"$sm3$gggggggggggggggg$NbXuIsg0DSg40l1xsfW7thXy0fLhlvWsoDpDqLVoYP4\"},\n  {\"$sm3$hhhhhhhhhhhhhhhh\", \"$sm3$hhhhhhhhhhhhhhhh$OK69HzW12PVP26o0R62TziUY8fjMx4T9Lsp/ba7mwV6\"},\n  {\"$sm3$iiiiiiiiiiiiiiii\", \"$sm3$iiiiiiiiiiiiiiii$LOHzx6lA1QBG5BebnTmsGCNTrS29KMu4iJ7BgMOMgh2\"},\n  {\"$sm3$jjjjjjjjjjjjjjjj\", \"$sm3$jjjjjjjjjjjjjjjj$CybcR8TV4Ogim.t45WA7KiGB14sco8RLwhkpogJHwP2\"},\n  {\"$sm3$kkkkkkkkkkkkkkkk\", \"$sm3$kkkkkkkkkkkkkkkk$z6ECqf30WpcXY9bkTZyil79npM.x8GXWVtfjnqo4I42\"},\n  {\"$sm3$llllllllllllllll\", \"$sm3$llllllllllllllll$qEgEdKFyNgr3na1/XoaicAA2fr1eRqKAALS/K2V5qM1\"},\n  {\"$sm3$mmmmmmmmmmmmmmmm\", \"$sm3$mmmmmmmmmmmmmmmm$w.am8GBYSsJFE0MXxZvyVYCq2qUTyXXPKaM2hjdF1K/\"},\n  {\"$sm3$nnnnnnnnnnnnnnnn\", \"$sm3$nnnnnnnnnnnnnnnn$VbDIQ7phZwxaRxM2VY0xg/7mNuQiFNKilVi8vBXqlI4\"},\n  {\"$sm3$oooooooooooooooo\", \"$sm3$oooooooooooooooo$M6lub.VPCcLNeqJQzaGG5wJX4X/wxzNmaaPH59renLB\"},\n  {\"$sm3$pppppppppppppppp\", \"$sm3$pppppppppppppppp$3LXjalmIyjnuhmp.ToydE1.Y29SME06iWz.GwbtRueC\"},\n  {\"$sm3$qqqqqqqqqqqqqqqq\", \"$sm3$qqqqqqqqqqqqqqqq$vq3esHm8bIEsYGAVCno.mlx5JYzDvVltS96kj7CRVv0\"},\n  {\"$sm3$rrrrrrrrrrrrrrrr\", \"$sm3$rrrrrrrrrrrrrrrr$oQ.VFcTK5dToElTi0DpPaXj/zXf5GWwxdh4OXZhlAn.\"},\n  {\"$sm3$ssssssssssssssss\", \"$sm3$ssssssssssssssss$/ROaq.PHX8TYaRIlTtjR45FgjHD4WE20DxtNs9cUWd0\"},\n  {\"$sm3$tttttttttttttttt\", \"$sm3$tttttttttttttttt$gjec8y8rnvqlm5AGevnusnCU3ER9ah8tGhWUtqM/0i9\"},\n  {\"$sm3$uuuuuuuuuuuuuuuu\", \"$sm3$uuuuuuuuuuuuuuuu$LqeUCy/yOcaADjaUPIhbGDbh/Jy5SvPI5h3.khbhJz5\"},\n  {\"$sm3$vvvvvvvvvvvvvvvv\", \"$sm3$vvvvvvvvvvvvvvvv$FKjdE0qSfRn47TjZQM36eeaD9u/sdtLIpTn5iobBnE1\"},\n  {\"$sm3$wwwwwwwwwwwwwwww\", \"$sm3$wwwwwwwwwwwwwwww$dIo08ED5QpbJOx/xNZjcBEVf/ApUIqKCfE0CoMZqe72\"},\n  {\"$sm3$xxxxxxxxxxxxxxxx\", \"$sm3$xxxxxxxxxxxxxxxx$uqEgp0ez71drTLD.JuyWoGJEvuhRkr8C/Zsg6cxtmH0\"},\n  {\"$sm3$yyyyyyyyyyyyyyyy\", \"$sm3$yyyyyyyyyyyyyyyy$B8C1f1/j.BXi4JpN8CncjmtGmFiszAerGWwCYW4uVy6\"},\n  {\"$sm3$zzzzzzzzzzzzzzzz\", \"$sm3$zzzzzzzzzzzzzzzz$jBwR/9Ns9jjcTnPVkd17j5tyd9DELu3Hk5whtx3Mil5\"},\n  {\"$sm3${{{{{{{{{{{{{{{{\", \"$sm3${{{{{{{{{{{{{{{{$i.QtmWhYhF1TF5Jm5BRlahJTMfW7MSpXKrwDwJIJWf/\"},\n  {\"$sm3$||||||||||||||||\", \"$sm3$||||||||||||||||$oaNC4l5cg5OMZ49H86OfLeZ5cEJTCvSzjlARrH5Ry6/\"},\n  {\"$sm3$}}}}}}}}}}}}}}}}\", \"$sm3$}}}}}}}}}}}}}}}}$xg.U9oYOumcnXlOBWd.SivWFM3EZVrXlnXRIQkZ1fa7\"},\n  {\"$sm3$~~~~~~~~~~~~~~~~\", \"$sm3$~~~~~~~~~~~~~~~~$fG6QnaQxzvRSESuTO02UL9ffMKsWuzGd5eyy6Lasbe8\"},\n  {\"$sm3$\\x7f\\x7f\\x7f\\x7f\\x7f\\x7f\\x7f\\x7f\\x7f\\x7f\\x7f\\x7f\\x7f\\x7f\\x7f\\x7f\", \"*0\"},\n  {\"$sm3$\\x80\\x80\\x80\\x80\\x80\\x80\\x80\\x80\\x80\\x80\\x80\\x80\\x80\\x80\\x80\\x80\", \"*0\"},\n  {\"$sm3$\\x81\\x81\\x81\\x81\\x81\\x81\\x81\\x81\\x81\\x81\\x81\\x81\\x81\\x81\\x81\\x81\", \"*0\"},\n  {\"$sm3$\\x82\\x82\\x82\\x82\\x82\\x82\\x82\\x82\\x82\\x82\\x82\\x82\\x82\\x82\\x82\\x82\", \"*0\"},\n  {\"$sm3$\\x83\\x83\\x83\\x83\\x83\\x83\\x83\\x83\\x83\\x83\\x83\\x83\\x83\\x83\\x83\\x83\", \"*0\"},\n  {\"$sm3$\\x84\\x84\\x84\\x84\\x84\\x84\\x84\\x84\\x84\\x84\\x84\\x84\\x84\\x84\\x84\\x84\", \"*0\"},\n  {\"$sm3$\\x85\\x85\\x85\\x85\\x85\\x85\\x85\\x85\\x85\\x85\\x85\\x85\\x85\\x85\\x85\\x85\", \"*0\"},\n  {\"$sm3$\\x86\\x86\\x86\\x86\\x86\\x86\\x86\\x86\\x86\\x86\\x86\\x86\\x86\\x86\\x86\\x86\", \"*0\"},\n  {\"$sm3$\\x87\\x87\\x87\\x87\\x87\\x87\\x87\\x87\\x87\\x87\\x87\\x87\\x87\\x87\\x87\\x87\", \"*0\"},\n  {\"$sm3$\\x88\\x88\\x88\\x88\\x88\\x88\\x88\\x88\\x88\\x88\\x88\\x88\\x88\\x88\\x88\\x88\", \"*0\"},\n  {\"$sm3$\\x89\\x89\\x89\\x89\\x89\\x89\\x89\\x89\\x89\\x89\\x89\\x89\\x89\\x89\\x89\\x89\", \"*0\"},\n  {\"$sm3$\\x8a\\x8a\\x8a\\x8a\\x8a\\x8a\\x8a\\x8a\\x8a\\x8a\\x8a\\x8a\\x8a\\x8a\\x8a\\x8a\", \"*0\"},\n  {\"$sm3$\\x8b\\x8b\\x8b\\x8b\\x8b\\x8b\\x8b\\x8b\\x8b\\x8b\\x8b\\x8b\\x8b\\x8b\\x8b\\x8b\", \"*0\"},\n  {\"$sm3$\\x8c\\x8c\\x8c\\x8c\\x8c\\x8c\\x8c\\x8c\\x8c\\x8c\\x8c\\x8c\\x8c\\x8c\\x8c\\x8c\", \"*0\"},\n  {\"$sm3$\\x8d\\x8d\\x8d\\x8d\\x8d\\x8d\\x8d\\x8d\\x8d\\x8d\\x8d\\x8d\\x8d\\x8d\\x8d\\x8d\", \"*0\"},\n  {\"$sm3$\\x8e\\x8e\\x8e\\x8e\\x8e\\x8e\\x8e\\x8e\\x8e\\x8e\\x8e\\x8e\\x8e\\x8e\\x8e\\x8e\", \"*0\"},\n  {\"$sm3$\\x8f\\x8f\\x8f\\x8f\\x8f\\x8f\\x8f\\x8f\\x8f\\x8f\\x8f\\x8f\\x8f\\x8f\\x8f\\x8f\", \"*0\"},\n  {\"$sm3$\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\", \"*0\"},\n  {\"$sm3$\\x91\\x91\\x91\\x91\\x91\\x91\\x91\\x91\\x91\\x91\\x91\\x91\\x91\\x91\\x91\\x91\", \"*0\"},\n  {\"$sm3$\\x92\\x92\\x92\\x92\\x92\\x92\\x92\\x92\\x92\\x92\\x92\\x92\\x92\\x92\\x92\\x92\", \"*0\"},\n  {\"$sm3$\\x93\\x93\\x93\\x93\\x93\\x93\\x93\\x93\\x93\\x93\\x93\\x93\\x93\\x93\\x93\\x93\", \"*0\"},\n  {\"$sm3$\\x94\\x94\\x94\\x94\\x94\\x94\\x94\\x94\\x94\\x94\\x94\\x94\\x94\\x94\\x94\\x94\", \"*0\"},\n  {\"$sm3$\\x95\\x95\\x95\\x95\\x95\\x95\\x95\\x95\\x95\\x95\\x95\\x95\\x95\\x95\\x95\\x95\", \"*0\"},\n  {\"$sm3$\\x96\\x96\\x96\\x96\\x96\\x96\\x96\\x96\\x96\\x96\\x96\\x96\\x96\\x96\\x96\\x96\", \"*0\"},\n  {\"$sm3$\\x97\\x97\\x97\\x97\\x97\\x97\\x97\\x97\\x97\\x97\\x97\\x97\\x97\\x97\\x97\\x97\", \"*0\"},\n  {\"$sm3$\\x98\\x98\\x98\\x98\\x98\\x98\\x98\\x98\\x98\\x98\\x98\\x98\\x98\\x98\\x98\\x98\", \"*0\"},\n  {\"$sm3$\\x99\\x99\\x99\\x99\\x99\\x99\\x99\\x99\\x99\\x99\\x99\\x99\\x99\\x99\\x99\\x99\", \"*0\"},\n  {\"$sm3$\\x9a\\x9a\\x9a\\x9a\\x9a\\x9a\\x9a\\x9a\\x9a\\x9a\\x9a\\x9a\\x9a\\x9a\\x9a\\x9a\", \"*0\"},\n  {\"$sm3$\\x9b\\x9b\\x9b\\x9b\\x9b\\x9b\\x9b\\x9b\\x9b\\x9b\\x9b\\x9b\\x9b\\x9b\\x9b\\x9b\", \"*0\"},\n  {\"$sm3$\\x9c\\x9c\\x9c\\x9c\\x9c\\x9c\\x9c\\x9c\\x9c\\x9c\\x9c\\x9c\\x9c\\x9c\\x9c\\x9c\", \"*0\"},\n  {\"$sm3$\\x9d\\x9d\\x9d\\x9d\\x9d\\x9d\\x9d\\x9d\\x9d\\x9d\\x9d\\x9d\\x9d\\x9d\\x9d\\x9d\", \"*0\"},\n  {\"$sm3$\\x9e\\x9e\\x9e\\x9e\\x9e\\x9e\\x9e\\x9e\\x9e\\x9e\\x9e\\x9e\\x9e\\x9e\\x9e\\x9e\", \"*0\"},\n  {\"$sm3$\\x9f\\x9f\\x9f\\x9f\\x9f\\x9f\\x9f\\x9f\\x9f\\x9f\\x9f\\x9f\\x9f\\x9f\\x9f\\x9f\", \"*0\"},\n  {\"$sm3$\\xa0\\xa0\\xa0\\xa0\\xa0\\xa0\\xa0\\xa0\\xa0\\xa0\\xa0\\xa0\\xa0\\xa0\\xa0\\xa0\", \"*0\"},\n  {\"$sm3$\\xa1\\xa1\\xa1\\xa1\\xa1\\xa1\\xa1\\xa1\\xa1\\xa1\\xa1\\xa1\\xa1\\xa1\\xa1\\xa1\", \"*0\"},\n  {\"$sm3$\\xa2\\xa2\\xa2\\xa2\\xa2\\xa2\\xa2\\xa2\\xa2\\xa2\\xa2\\xa2\\xa2\\xa2\\xa2\\xa2\", \"*0\"},\n  {\"$sm3$\\xa3\\xa3\\xa3\\xa3\\xa3\\xa3\\xa3\\xa3\\xa3\\xa3\\xa3\\xa3\\xa3\\xa3\\xa3\\xa3\", \"*0\"},\n  {\"$sm3$\\xa4\\xa4\\xa4\\xa4\\xa4\\xa4\\xa4\\xa4\\xa4\\xa4\\xa4\\xa4\\xa4\\xa4\\xa4\\xa4\", \"*0\"},\n  {\"$sm3$\\xa5\\xa5\\xa5\\xa5\\xa5\\xa5\\xa5\\xa5\\xa5\\xa5\\xa5\\xa5\\xa5\\xa5\\xa5\\xa5\", \"*0\"},\n  {\"$sm3$\\xa6\\xa6\\xa6\\xa6\\xa6\\xa6\\xa6\\xa6\\xa6\\xa6\\xa6\\xa6\\xa6\\xa6\\xa6\\xa6\", \"*0\"},\n  {\"$sm3$\\xa7\\xa7\\xa7\\xa7\\xa7\\xa7\\xa7\\xa7\\xa7\\xa7\\xa7\\xa7\\xa7\\xa7\\xa7\\xa7\", \"*0\"},\n  {\"$sm3$\\xa8\\xa8\\xa8\\xa8\\xa8\\xa8\\xa8\\xa8\\xa8\\xa8\\xa8\\xa8\\xa8\\xa8\\xa8\\xa8\", \"*0\"},\n  {\"$sm3$\\xa9\\xa9\\xa9\\xa9\\xa9\\xa9\\xa9\\xa9\\xa9\\xa9\\xa9\\xa9\\xa9\\xa9\\xa9\\xa9\", \"*0\"},\n  {\"$sm3$\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\", \"*0\"},\n  {\"$sm3$\\xab\\xab\\xab\\xab\\xab\\xab\\xab\\xab\\xab\\xab\\xab\\xab\\xab\\xab\\xab\\xab\", \"*0\"},\n  {\"$sm3$\\xac\\xac\\xac\\xac\\xac\\xac\\xac\\xac\\xac\\xac\\xac\\xac\\xac\\xac\\xac\\xac\", \"*0\"},\n  {\"$sm3$\\xad\\xad\\xad\\xad\\xad\\xad\\xad\\xad\\xad\\xad\\xad\\xad\\xad\\xad\\xad\\xad\", \"*0\"},\n  {\"$sm3$\\xae\\xae\\xae\\xae\\xae\\xae\\xae\\xae\\xae\\xae\\xae\\xae\\xae\\xae\\xae\\xae\", \"*0\"},\n  {\"$sm3$\\xaf\\xaf\\xaf\\xaf\\xaf\\xaf\\xaf\\xaf\\xaf\\xaf\\xaf\\xaf\\xaf\\xaf\\xaf\\xaf\", \"*0\"},\n  {\"$sm3$\\xb0\\xb0\\xb0\\xb0\\xb0\\xb0\\xb0\\xb0\\xb0\\xb0\\xb0\\xb0\\xb0\\xb0\\xb0\\xb0\", \"*0\"},\n  {\"$sm3$\\xb1\\xb1\\xb1\\xb1\\xb1\\xb1\\xb1\\xb1\\xb1\\xb1\\xb1\\xb1\\xb1\\xb1\\xb1\\xb1\", \"*0\"},\n  {\"$sm3$\\xb2\\xb2\\xb2\\xb2\\xb2\\xb2\\xb2\\xb2\\xb2\\xb2\\xb2\\xb2\\xb2\\xb2\\xb2\\xb2\", \"*0\"},\n  {\"$sm3$\\xb3\\xb3\\xb3\\xb3\\xb3\\xb3\\xb3\\xb3\\xb3\\xb3\\xb3\\xb3\\xb3\\xb3\\xb3\\xb3\", \"*0\"},\n  {\"$sm3$\\xb4\\xb4\\xb4\\xb4\\xb4\\xb4\\xb4\\xb4\\xb4\\xb4\\xb4\\xb4\\xb4\\xb4\\xb4\\xb4\", \"*0\"},\n  {\"$sm3$\\xb5\\xb5\\xb5\\xb5\\xb5\\xb5\\xb5\\xb5\\xb5\\xb5\\xb5\\xb5\\xb5\\xb5\\xb5\\xb5\", \"*0\"},\n  {\"$sm3$\\xb6\\xb6\\xb6\\xb6\\xb6\\xb6\\xb6\\xb6\\xb6\\xb6\\xb6\\xb6\\xb6\\xb6\\xb6\\xb6\", \"*0\"},\n  {\"$sm3$\\xb7\\xb7\\xb7\\xb7\\xb7\\xb7\\xb7\\xb7\\xb7\\xb7\\xb7\\xb7\\xb7\\xb7\\xb7\\xb7\", \"*0\"},\n  {\"$sm3$\\xb8\\xb8\\xb8\\xb8\\xb8\\xb8\\xb8\\xb8\\xb8\\xb8\\xb8\\xb8\\xb8\\xb8\\xb8\\xb8\", \"*0\"},\n  {\"$sm3$\\xb9\\xb9\\xb9\\xb9\\xb9\\xb9\\xb9\\xb9\\xb9\\xb9\\xb9\\xb9\\xb9\\xb9\\xb9\\xb9\", \"*0\"},\n  {\"$sm3$\\xba\\xba\\xba\\xba\\xba\\xba\\xba\\xba\\xba\\xba\\xba\\xba\\xba\\xba\\xba\\xba\", \"*0\"},\n  {\"$sm3$\\xbb\\xbb\\xbb\\xbb\\xbb\\xbb\\xbb\\xbb\\xbb\\xbb\\xbb\\xbb\\xbb\\xbb\\xbb\\xbb\", \"*0\"},\n  {\"$sm3$\\xbc\\xbc\\xbc\\xbc\\xbc\\xbc\\xbc\\xbc\\xbc\\xbc\\xbc\\xbc\\xbc\\xbc\\xbc\\xbc\", \"*0\"},\n  {\"$sm3$\\xbd\\xbd\\xbd\\xbd\\xbd\\xbd\\xbd\\xbd\\xbd\\xbd\\xbd\\xbd\\xbd\\xbd\\xbd\\xbd\", \"*0\"},\n  {\"$sm3$\\xbe\\xbe\\xbe\\xbe\\xbe\\xbe\\xbe\\xbe\\xbe\\xbe\\xbe\\xbe\\xbe\\xbe\\xbe\\xbe\", \"*0\"},\n  {\"$sm3$\\xbf\\xbf\\xbf\\xbf\\xbf\\xbf\\xbf\\xbf\\xbf\\xbf\\xbf\\xbf\\xbf\\xbf\\xbf\\xbf\", \"*0\"},\n  {\"$sm3$\\xc0\\xc0\\xc0\\xc0\\xc0\\xc0\\xc0\\xc0\\xc0\\xc0\\xc0\\xc0\\xc0\\xc0\\xc0\\xc0\", \"*0\"},\n  {\"$sm3$\\xc1\\xc1\\xc1\\xc1\\xc1\\xc1\\xc1\\xc1\\xc1\\xc1\\xc1\\xc1\\xc1\\xc1\\xc1\\xc1\", \"*0\"},\n  {\"$sm3$\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\", \"*0\"},\n  {\"$sm3$\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\", \"*0\"},\n  {\"$sm3$\\xc4\\xc4\\xc4\\xc4\\xc4\\xc4\\xc4\\xc4\\xc4\\xc4\\xc4\\xc4\\xc4\\xc4\\xc4\\xc4\", \"*0\"},\n  {\"$sm3$\\xc5\\xc5\\xc5\\xc5\\xc5\\xc5\\xc5\\xc5\\xc5\\xc5\\xc5\\xc5\\xc5\\xc5\\xc5\\xc5\", \"*0\"},\n  {\"$sm3$\\xc6\\xc6\\xc6\\xc6\\xc6\\xc6\\xc6\\xc6\\xc6\\xc6\\xc6\\xc6\\xc6\\xc6\\xc6\\xc6\", \"*0\"},\n  {\"$sm3$\\xc7\\xc7\\xc7\\xc7\\xc7\\xc7\\xc7\\xc7\\xc7\\xc7\\xc7\\xc7\\xc7\\xc7\\xc7\\xc7\", \"*0\"},\n  {\"$sm3$\\xc8\\xc8\\xc8\\xc8\\xc8\\xc8\\xc8\\xc8\\xc8\\xc8\\xc8\\xc8\\xc8\\xc8\\xc8\\xc8\", \"*0\"},\n  {\"$sm3$\\xc9\\xc9\\xc9\\xc9\\xc9\\xc9\\xc9\\xc9\\xc9\\xc9\\xc9\\xc9\\xc9\\xc9\\xc9\\xc9\", \"*0\"},\n  {\"$sm3$\\xca\\xca\\xca\\xca\\xca\\xca\\xca\\xca\\xca\\xca\\xca\\xca\\xca\\xca\\xca\\xca\", \"*0\"},\n  {\"$sm3$\\xcb\\xcb\\xcb\\xcb\\xcb\\xcb\\xcb\\xcb\\xcb\\xcb\\xcb\\xcb\\xcb\\xcb\\xcb\\xcb\", \"*0\"},\n  {\"$sm3$\\xcc\\xcc\\xcc\\xcc\\xcc\\xcc\\xcc\\xcc\\xcc\\xcc\\xcc\\xcc\\xcc\\xcc\\xcc\\xcc\", \"*0\"},\n  {\"$sm3$\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\", \"*0\"},\n  {\"$sm3$\\xce\\xce\\xce\\xce\\xce\\xce\\xce\\xce\\xce\\xce\\xce\\xce\\xce\\xce\\xce\\xce\", \"*0\"},\n  {\"$sm3$\\xcf\\xcf\\xcf\\xcf\\xcf\\xcf\\xcf\\xcf\\xcf\\xcf\\xcf\\xcf\\xcf\\xcf\\xcf\\xcf\", \"*0\"},\n  {\"$sm3$\\xd0\\xd0\\xd0\\xd0\\xd0\\xd0\\xd0\\xd0\\xd0\\xd0\\xd0\\xd0\\xd0\\xd0\\xd0\\xd0\", \"*0\"},\n  {\"$sm3$\\xd1\\xd1\\xd1\\xd1\\xd1\\xd1\\xd1\\xd1\\xd1\\xd1\\xd1\\xd1\\xd1\\xd1\\xd1\\xd1\", \"*0\"},\n  {\"$sm3$\\xd2\\xd2\\xd2\\xd2\\xd2\\xd2\\xd2\\xd2\\xd2\\xd2\\xd2\\xd2\\xd2\\xd2\\xd2\\xd2\", \"*0\"},\n  {\"$sm3$\\xd3\\xd3\\xd3\\xd3\\xd3\\xd3\\xd3\\xd3\\xd3\\xd3\\xd3\\xd3\\xd3\\xd3\\xd3\\xd3\", \"*0\"},\n  {\"$sm3$\\xd4\\xd4\\xd4\\xd4\\xd4\\xd4\\xd4\\xd4\\xd4\\xd4\\xd4\\xd4\\xd4\\xd4\\xd4\\xd4\", \"*0\"},\n  {\"$sm3$\\xd5\\xd5\\xd5\\xd5\\xd5\\xd5\\xd5\\xd5\\xd5\\xd5\\xd5\\xd5\\xd5\\xd5\\xd5\\xd5\", \"*0\"},\n  {\"$sm3$\\xd6\\xd6\\xd6\\xd6\\xd6\\xd6\\xd6\\xd6\\xd6\\xd6\\xd6\\xd6\\xd6\\xd6\\xd6\\xd6\", \"*0\"},\n  {\"$sm3$\\xd7\\xd7\\xd7\\xd7\\xd7\\xd7\\xd7\\xd7\\xd7\\xd7\\xd7\\xd7\\xd7\\xd7\\xd7\\xd7\", \"*0\"},\n  {\"$sm3$\\xd8\\xd8\\xd8\\xd8\\xd8\\xd8\\xd8\\xd8\\xd8\\xd8\\xd8\\xd8\\xd8\\xd8\\xd8\\xd8\", \"*0\"},\n  {\"$sm3$\\xd9\\xd9\\xd9\\xd9\\xd9\\xd9\\xd9\\xd9\\xd9\\xd9\\xd9\\xd9\\xd9\\xd9\\xd9\\xd9\", \"*0\"},\n  {\"$sm3$\\xda\\xda\\xda\\xda\\xda\\xda\\xda\\xda\\xda\\xda\\xda\\xda\\xda\\xda\\xda\\xda\", \"*0\"},\n  {\"$sm3$\\xdb\\xdb\\xdb\\xdb\\xdb\\xdb\\xdb\\xdb\\xdb\\xdb\\xdb\\xdb\\xdb\\xdb\\xdb\\xdb\", \"*0\"},\n  {\"$sm3$\\xdc\\xdc\\xdc\\xdc\\xdc\\xdc\\xdc\\xdc\\xdc\\xdc\\xdc\\xdc\\xdc\\xdc\\xdc\\xdc\", \"*0\"},\n  {\"$sm3$\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\", \"*0\"},\n  {\"$sm3$\\xde\\xde\\xde\\xde\\xde\\xde\\xde\\xde\\xde\\xde\\xde\\xde\\xde\\xde\\xde\\xde\", \"*0\"},\n  {\"$sm3$\\xdf\\xdf\\xdf\\xdf\\xdf\\xdf\\xdf\\xdf\\xdf\\xdf\\xdf\\xdf\\xdf\\xdf\\xdf\\xdf\", \"*0\"},\n  {\"$sm3$\\xe0\\xe0\\xe0\\xe0\\xe0\\xe0\\xe0\\xe0\\xe0\\xe0\\xe0\\xe0\\xe0\\xe0\\xe0\\xe0\", \"*0\"},\n  {\"$sm3$\\xe1\\xe1\\xe1\\xe1\\xe1\\xe1\\xe1\\xe1\\xe1\\xe1\\xe1\\xe1\\xe1\\xe1\\xe1\\xe1\", \"*0\"},\n  {\"$sm3$\\xe2\\xe2\\xe2\\xe2\\xe2\\xe2\\xe2\\xe2\\xe2\\xe2\\xe2\\xe2\\xe2\\xe2\\xe2\\xe2\", \"*0\"},\n  {\"$sm3$\\xe3\\xe3\\xe3\\xe3\\xe3\\xe3\\xe3\\xe3\\xe3\\xe3\\xe3\\xe3\\xe3\\xe3\\xe3\\xe3\", \"*0\"},\n  {\"$sm3$\\xe4\\xe4\\xe4\\xe4\\xe4\\xe4\\xe4\\xe4\\xe4\\xe4\\xe4\\xe4\\xe4\\xe4\\xe4\\xe4\", \"*0\"},\n  {\"$sm3$\\xe5\\xe5\\xe5\\xe5\\xe5\\xe5\\xe5\\xe5\\xe5\\xe5\\xe5\\xe5\\xe5\\xe5\\xe5\\xe5\", \"*0\"},\n  {\"$sm3$\\xe6\\xe6\\xe6\\xe6\\xe6\\xe6\\xe6\\xe6\\xe6\\xe6\\xe6\\xe6\\xe6\\xe6\\xe6\\xe6\", \"*0\"},\n  {\"$sm3$\\xe7\\xe7\\xe7\\xe7\\xe7\\xe7\\xe7\\xe7\\xe7\\xe7\\xe7\\xe7\\xe7\\xe7\\xe7\\xe7\", \"*0\"},\n  {\"$sm3$\\xe8\\xe8\\xe8\\xe8\\xe8\\xe8\\xe8\\xe8\\xe8\\xe8\\xe8\\xe8\\xe8\\xe8\\xe8\\xe8\", \"*0\"},\n  {\"$sm3$\\xe9\\xe9\\xe9\\xe9\\xe9\\xe9\\xe9\\xe9\\xe9\\xe9\\xe9\\xe9\\xe9\\xe9\\xe9\\xe9\", \"*0\"},\n  {\"$sm3$\\xea\\xea\\xea\\xea\\xea\\xea\\xea\\xea\\xea\\xea\\xea\\xea\\xea\\xea\\xea\\xea\", \"*0\"},\n  {\"$sm3$\\xeb\\xeb\\xeb\\xeb\\xeb\\xeb\\xeb\\xeb\\xeb\\xeb\\xeb\\xeb\\xeb\\xeb\\xeb\\xeb\", \"*0\"},\n  {\"$sm3$\\xec\\xec\\xec\\xec\\xec\\xec\\xec\\xec\\xec\\xec\\xec\\xec\\xec\\xec\\xec\\xec\", \"*0\"},\n  {\"$sm3$\\xed\\xed\\xed\\xed\\xed\\xed\\xed\\xed\\xed\\xed\\xed\\xed\\xed\\xed\\xed\\xed\", \"*0\"},\n  {\"$sm3$\\xee\\xee\\xee\\xee\\xee\\xee\\xee\\xee\\xee\\xee\\xee\\xee\\xee\\xee\\xee\\xee\", \"*0\"},\n  {\"$sm3$\\xef\\xef\\xef\\xef\\xef\\xef\\xef\\xef\\xef\\xef\\xef\\xef\\xef\\xef\\xef\\xef\", \"*0\"},\n  {\"$sm3$\\xf0\\xf0\\xf0\\xf0\\xf0\\xf0\\xf0\\xf0\\xf0\\xf0\\xf0\\xf0\\xf0\\xf0\\xf0\\xf0\", \"*0\"},\n  {\"$sm3$\\xf1\\xf1\\xf1\\xf1\\xf1\\xf1\\xf1\\xf1\\xf1\\xf1\\xf1\\xf1\\xf1\\xf1\\xf1\\xf1\", \"*0\"},\n  {\"$sm3$\\xf2\\xf2\\xf2\\xf2\\xf2\\xf2\\xf2\\xf2\\xf2\\xf2\\xf2\\xf2\\xf2\\xf2\\xf2\\xf2\", \"*0\"},\n  {\"$sm3$\\xf3\\xf3\\xf3\\xf3\\xf3\\xf3\\xf3\\xf3\\xf3\\xf3\\xf3\\xf3\\xf3\\xf3\\xf3\\xf3\", \"*0\"},\n  {\"$sm3$\\xf4\\xf4\\xf4\\xf4\\xf4\\xf4\\xf4\\xf4\\xf4\\xf4\\xf4\\xf4\\xf4\\xf4\\xf4\\xf4\", \"*0\"},\n  {\"$sm3$\\xf5\\xf5\\xf5\\xf5\\xf5\\xf5\\xf5\\xf5\\xf5\\xf5\\xf5\\xf5\\xf5\\xf5\\xf5\\xf5\", \"*0\"},\n  {\"$sm3$\\xf6\\xf6\\xf6\\xf6\\xf6\\xf6\\xf6\\xf6\\xf6\\xf6\\xf6\\xf6\\xf6\\xf6\\xf6\\xf6\", \"*0\"},\n  {\"$sm3$\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\", \"*0\"},\n  {\"$sm3$\\xf8\\xf8\\xf8\\xf8\\xf8\\xf8\\xf8\\xf8\\xf8\\xf8\\xf8\\xf8\\xf8\\xf8\\xf8\\xf8\", \"*0\"},\n  {\"$sm3$\\xf9\\xf9\\xf9\\xf9\\xf9\\xf9\\xf9\\xf9\\xf9\\xf9\\xf9\\xf9\\xf9\\xf9\\xf9\\xf9\", \"*0\"},\n  {\"$sm3$\\xfa\\xfa\\xfa\\xfa\\xfa\\xfa\\xfa\\xfa\\xfa\\xfa\\xfa\\xfa\\xfa\\xfa\\xfa\\xfa\", \"*0\"},\n  {\"$sm3$\\xfb\\xfb\\xfb\\xfb\\xfb\\xfb\\xfb\\xfb\\xfb\\xfb\\xfb\\xfb\\xfb\\xfb\\xfb\\xfb\", \"*0\"},\n  {\"$sm3$\\xfc\\xfc\\xfc\\xfc\\xfc\\xfc\\xfc\\xfc\\xfc\\xfc\\xfc\\xfc\\xfc\\xfc\\xfc\\xfc\", \"*0\"},\n  {\"$sm3$\\xfd\\xfd\\xfd\\xfd\\xfd\\xfd\\xfd\\xfd\\xfd\\xfd\\xfd\\xfd\\xfd\\xfd\\xfd\\xfd\", \"*0\"},\n  {\"$sm3$\\xfe\\xfe\\xfe\\xfe\\xfe\\xfe\\xfe\\xfe\\xfe\\xfe\\xfe\\xfe\\xfe\\xfe\\xfe\\xfe\", \"*0\"},\n  {\"$sm3$\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\", \"*0\"},\n#endif\n#if INCLUDE_sha256crypt\n  {\"$5$\", \"$5$$.9cmwUsB0JN26/tNlJo6GVzbqQBfZNC8a9LW5Oa2eb4\"},\n  {\"$5$\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\", \"*0\"},\n  {\"$5$\\x02\\x02\\x02\\x02\\x02\\x02\\x02\\x02\\x02\\x02\\x02\\x02\\x02\\x02\\x02\\x02\", \"*0\"},\n  {\"$5$\\x03\\x03\\x03\\x03\\x03\\x03\\x03\\x03\\x03\\x03\\x03\\x03\\x03\\x03\\x03\\x03\", \"*0\"},\n  {\"$5$\\x04\\x04\\x04\\x04\\x04\\x04\\x04\\x04\\x04\\x04\\x04\\x04\\x04\\x04\\x04\\x04\", \"*0\"},\n  {\"$5$\\x05\\x05\\x05\\x05\\x05\\x05\\x05\\x05\\x05\\x05\\x05\\x05\\x05\\x05\\x05\\x05\", \"*0\"},\n  {\"$5$\\x06\\x06\\x06\\x06\\x06\\x06\\x06\\x06\\x06\\x06\\x06\\x06\\x06\\x06\\x06\\x06\", \"*0\"},\n  {\"$5$\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\", \"*0\"},\n  {\"$5$\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\", \"*0\"},\n  {\"$5$\\x09\\x09\\x09\\x09\\x09\\x09\\x09\\x09\\x09\\x09\\x09\\x09\\x09\\x09\\x09\\x09\", \"*0\"},\n  {\"$5$\\x0a\\x0a\\x0a\\x0a\\x0a\\x0a\\x0a\\x0a\\x0a\\x0a\\x0a\\x0a\\x0a\\x0a\\x0a\\x0a\", \"*0\"},\n  {\"$5$\\x0b\\x0b\\x0b\\x0b\\x0b\\x0b\\x0b\\x0b\\x0b\\x0b\\x0b\\x0b\\x0b\\x0b\\x0b\\x0b\", \"*0\"},\n  {\"$5$\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\", \"*0\"},\n  {\"$5$\\x0d\\x0d\\x0d\\x0d\\x0d\\x0d\\x0d\\x0d\\x0d\\x0d\\x0d\\x0d\\x0d\\x0d\\x0d\\x0d\", \"*0\"},\n  {\"$5$\\x0e\\x0e\\x0e\\x0e\\x0e\\x0e\\x0e\\x0e\\x0e\\x0e\\x0e\\x0e\\x0e\\x0e\\x0e\\x0e\", \"*0\"},\n  {\"$5$\\x0f\\x0f\\x0f\\x0f\\x0f\\x0f\\x0f\\x0f\\x0f\\x0f\\x0f\\x0f\\x0f\\x0f\\x0f\\x0f\", \"*0\"},\n  {\"$5$\\x10\\x10\\x10\\x10\\x10\\x10\\x10\\x10\\x10\\x10\\x10\\x10\\x10\\x10\\x10\\x10\", \"*0\"},\n  {\"$5$\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\", \"*0\"},\n  {\"$5$\\x12\\x12\\x12\\x12\\x12\\x12\\x12\\x12\\x12\\x12\\x12\\x12\\x12\\x12\\x12\\x12\", \"*0\"},\n  {\"$5$\\x13\\x13\\x13\\x13\\x13\\x13\\x13\\x13\\x13\\x13\\x13\\x13\\x13\\x13\\x13\\x13\", \"*0\"},\n  {\"$5$\\x14\\x14\\x14\\x14\\x14\\x14\\x14\\x14\\x14\\x14\\x14\\x14\\x14\\x14\\x14\\x14\", \"*0\"},\n  {\"$5$\\x15\\x15\\x15\\x15\\x15\\x15\\x15\\x15\\x15\\x15\\x15\\x15\\x15\\x15\\x15\\x15\", \"*0\"},\n  {\"$5$\\x16\\x16\\x16\\x16\\x16\\x16\\x16\\x16\\x16\\x16\\x16\\x16\\x16\\x16\\x16\\x16\", \"*0\"},\n  {\"$5$\\x17\\x17\\x17\\x17\\x17\\x17\\x17\\x17\\x17\\x17\\x17\\x17\\x17\\x17\\x17\\x17\", \"*0\"},\n  {\"$5$\\x18\\x18\\x18\\x18\\x18\\x18\\x18\\x18\\x18\\x18\\x18\\x18\\x18\\x18\\x18\\x18\", \"*0\"},\n  {\"$5$\\x19\\x19\\x19\\x19\\x19\\x19\\x19\\x19\\x19\\x19\\x19\\x19\\x19\\x19\\x19\\x19\", \"*0\"},\n  {\"$5$\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\", \"*0\"},\n  {\"$5$\\x1b\\x1b\\x1b\\x1b\\x1b\\x1b\\x1b\\x1b\\x1b\\x1b\\x1b\\x1b\\x1b\\x1b\\x1b\\x1b\", \"*0\"},\n  {\"$5$\\x1c\\x1c\\x1c\\x1c\\x1c\\x1c\\x1c\\x1c\\x1c\\x1c\\x1c\\x1c\\x1c\\x1c\\x1c\\x1c\", \"*0\"},\n  {\"$5$\\x1d\\x1d\\x1d\\x1d\\x1d\\x1d\\x1d\\x1d\\x1d\\x1d\\x1d\\x1d\\x1d\\x1d\\x1d\\x1d\", \"*0\"},\n  {\"$5$\\x1e\\x1e\\x1e\\x1e\\x1e\\x1e\\x1e\\x1e\\x1e\\x1e\\x1e\\x1e\\x1e\\x1e\\x1e\\x1e\", \"*0\"},\n  {\"$5$\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\", \"*0\"},\n  {\"$5$                \", \"*0\"},\n  {\"$5$!!!!!!!!!!!!!!!!\", \"*0\"},\n  {\"$5$\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\", \"$5$\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"$IcbPfVlA.OKFHHR2I4noozy9uUvPh4YQQ5sHzvnG7A6\"},\n  {\"$5$################\", \"$5$################$tZlGRcmONL7295tQG1dOXPeIiDTMFpQ5H7Bde1ImpB7\"},\n  {\"$5$$$$$$$$$$$$$$$$$\", \"$5$$.9cmwUsB0JN26/tNlJo6GVzbqQBfZNC8a9LW5Oa2eb4\"},\n  {\"$5$%%%%%%%%%%%%%%%%\", \"$5$%%%%%%%%%%%%%%%%$YHB.sYi3as/2N2AwT0I7N9J.EGSQiamsBQjp8j6lSoB\"},\n  {\"$5$&&&&&&&&&&&&&&&&\", \"$5$&&&&&&&&&&&&&&&&$4oI9Wfty8ldlgbZHaRMQy6MBtO./RPe5BzNdYFvsRm7\"},\n  {\"$5$''''''''''''''''\", \"$5$''''''''''''''''$4fEpjZD1/JVDY7kCN5WMChbLbzurZm8HYJTIABoCYUB\"},\n  {\"$5$((((((((((((((((\", \"$5$(((((((((((((((($Z2HXAU0EkiVyIOzHbutfuKpYET4rVnN9WGrY0B1UVt2\"},\n  {\"$5$))))))))))))))))\", \"$5$))))))))))))))))$s.vQuKjcyxh0GA4uT3NpzutBhYefNl3XzhZ8S6HFxrC\"},\n  {\"$5$****************\", \"*0\"},\n  {\"$5$++++++++++++++++\", \"$5$++++++++++++++++$1KHSxdU2GMHr.JMUPLXgTt2c4ecpTPEIcF3gyli/qp8\"},\n  {\"$5$,,,,,,,,,,,,,,,,\", \"$5$,,,,,,,,,,,,,,,,$7KkI4Coa5cA4yZkhPJiIPFi88djn2RdZIdw4uyqQEUC\"},\n  {\"$5$----------------\", \"$5$----------------$mSaWjPpj2YF659UA/tuqnlyubF4dk7jvQegmE0rWA82\"},\n  {\"$5$................\", \"$5$................$W/v8EEWv1B6Dve1bi0HbAyllF5g4TkxQH2.xYrdxN.7\"},\n  {\"$5$////////////////\", \"$5$////////////////$33BfmIgmhgRtT2vlfY3SRqs7lTi3brXBU0FIy8FaAn9\"},\n  {\"$5$0000000000000000\", \"$5$0000000000000000$eR21UOvSFdYsepsAlt3eZMsjRy8T9ScbPpuKIShlivB\"},\n  {\"$5$1111111111111111\", \"$5$1111111111111111$bySBjJ4r0QdUw/fgomcB7uzl4LjvJ65XyOyMdtHZxQ3\"},\n  {\"$5$2222222222222222\", \"$5$2222222222222222$yuZndC7TYE2j6FuS0bEJsX92Iu5iWdaHMX6l9eAEYW8\"},\n  {\"$5$3333333333333333\", \"$5$3333333333333333$xA0Pfyll.4Vzhn9l3V/aBht2p.AVY3QiZUEuGIC19W0\"},\n  {\"$5$4444444444444444\", \"$5$4444444444444444$vIya5BnS8SPjCiEA7gcEAa.TcuMcVu3MtuLcx2GIcA3\"},\n  {\"$5$5555555555555555\", \"$5$5555555555555555$jDmTar0YvVlBA5vVNpoJnWs3068L7jO9ttRmAU/FzR8\"},\n  {\"$5$6666666666666666\", \"$5$6666666666666666$vSBmNVyAn14oQBjBkoF6Q48MTV4Bu5qW/fyre6L94kD\"},\n  {\"$5$7777777777777777\", \"$5$7777777777777777$d5UbZ4jniwMil/pZXZM1EaM/JgLzZPosbP85sU3A9c6\"},\n  {\"$5$8888888888888888\", \"$5$8888888888888888$i0dOqdLRFCW6tofALeQlF2gjZVCWQAej6NdQDyuLNJ1\"},\n  {\"$5$9999999999999999\", \"$5$9999999999999999$CEmRQOHPWAwLCZI3XnswPssRh9Tpkx4dVwIiIwnGsvD\"},\n  {\"$5$::::::::::::::::\", \"*0\"},\n  {\"$5$;;;;;;;;;;;;;;;;\", \"*0\"},\n  {\"$5$<<<<<<<<<<<<<<<<\", \"$5$<<<<<<<<<<<<<<<<$E0pdB/7wA41LmFDfODIv7TBUlX5eXIMpxAl3yG8fnUA\"},\n  {\"$5$================\", \"$5$================$E6DSf64H4ccRpeFzxY2ohyOgUmqISQaHQe/589h8ap7\"},\n  {\"$5$>>>>>>>>>>>>>>>>\", \"$5$>>>>>>>>>>>>>>>>$bn5mLiXIVhqRLuFhx2DeSOGOP1kJjvVSa752SGiQN38\"},\n  {\"$5$????????????????\", \"$5$????????????????$eoE8xbResh/24NojQoK.rtKkn273RYxIDUQxhnW6dq1\"},\n  {\"$5$@@@@@@@@@@@@@@@@\", \"$5$@@@@@@@@@@@@@@@@$3i7VYDfPzWYla8vo11pZjLBDetTFv91Qthzp8F/D5I8\"},\n  {\"$5$AAAAAAAAAAAAAAAA\", \"$5$AAAAAAAAAAAAAAAA$VUpd0T9ADzWfkEFV3opuuUXuOKQqK9z2PwhFhG1tbg.\"},\n  {\"$5$BBBBBBBBBBBBBBBB\", \"$5$BBBBBBBBBBBBBBBB$fa7J/F.WdiyMbAIcj5Fy3lYRNRtx2Z2Saluo3QNeq/1\"},\n  {\"$5$CCCCCCCCCCCCCCCC\", \"$5$CCCCCCCCCCCCCCCC$N8Af2vgy2oUYPWsZJK4amWU6GEvgOzqn39AfWnGdnU5\"},\n  {\"$5$DDDDDDDDDDDDDDDD\", \"$5$DDDDDDDDDDDDDDDD$cqbztx0HqFgxi2AkDyeW9VQDFTPJqgWAwf.otoqcNq8\"},\n  {\"$5$EEEEEEEEEEEEEEEE\", \"$5$EEEEEEEEEEEEEEEE$zJZjssAORvqD1rBWcfFVXM1DW89W.R9yvKsdNODm3H7\"},\n  {\"$5$FFFFFFFFFFFFFFFF\", \"$5$FFFFFFFFFFFFFFFF$9swLQspTseegU2GZSD5oAkdCj7qyiQ2Fp8Ol5Ofrs6A\"},\n  {\"$5$GGGGGGGGGGGGGGGG\", \"$5$GGGGGGGGGGGGGGGG$JwKDv.wdK2EDvhCo/AL.Nkhjbp7Cq0V.IYtdIVmS/1C\"},\n  {\"$5$HHHHHHHHHHHHHHHH\", \"$5$HHHHHHHHHHHHHHHH$1dByOvQtmP83itXuRwBRejTs911SoKAgGgQiPrkvqmD\"},\n  {\"$5$IIIIIIIIIIIIIIII\", \"$5$IIIIIIIIIIIIIIII$Z/ldZHX2MiJHPnVcJCOY/AEjrWAG2to0RoT9qfIZsRD\"},\n  {\"$5$JJJJJJJJJJJJJJJJ\", \"$5$JJJJJJJJJJJJJJJJ$fhwQW6rdMJary.ixfiX/Dt9hmCpd0996dALH78CJ8sC\"},\n  {\"$5$KKKKKKKKKKKKKKKK\", \"$5$KKKKKKKKKKKKKKKK$HHwts31Cns.ctW5icGIsxZl4AW0Gytgt..vdo91dHm2\"},\n  {\"$5$LLLLLLLLLLLLLLLL\", \"$5$LLLLLLLLLLLLLLLL$d28JjgKAP3qlPfZYJs3hdSzaB5J7K.V06pLkuojR7f0\"},\n  {\"$5$MMMMMMMMMMMMMMMM\", \"$5$MMMMMMMMMMMMMMMM$P4Wo0Hj8GL1q9oT.zJMhChwwsbGDLle6WfY4Lo8uPi3\"},\n  {\"$5$NNNNNNNNNNNNNNNN\", \"$5$NNNNNNNNNNNNNNNN$YlRLxmjBFuF5g0XhKJBHaXnUdyEWK7OKW/HGcLMwcG3\"},\n  {\"$5$OOOOOOOOOOOOOOOO\", \"$5$OOOOOOOOOOOOOOOO$DRn.JeS9KRIyaJ1Y7YBd3r6uoBjqzdL4yXYUI3XfvC0\"},\n  {\"$5$PPPPPPPPPPPPPPPP\", \"$5$PPPPPPPPPPPPPPPP$pMCZDx.QilOTudd58i6D2rcQGZxBb9xsrnONsSN6UdA\"},\n  {\"$5$QQQQQQQQQQQQQQQQ\", \"$5$QQQQQQQQQQQQQQQQ$iPnfE5yCEEHvOaGPmqOGiOMrx2G7BAyj45GbI98xX.7\"},\n  {\"$5$RRRRRRRRRRRRRRRR\", \"$5$RRRRRRRRRRRRRRRR$0RG0Haiy4MIGpX1Cb6m0VxK5SgqWU0APzN/yxKiH5r5\"},\n  {\"$5$SSSSSSSSSSSSSSSS\", \"$5$SSSSSSSSSSSSSSSS$JUGG5tCs4CVVQK98ab4wBR5at/yesizfu9eod.b5LhA\"},\n  {\"$5$TTTTTTTTTTTTTTTT\", \"$5$TTTTTTTTTTTTTTTT$A0mm2hkjlmS/4N74qNPtQM7XaVCkHhkbTpvjXBLwQL1\"},\n  {\"$5$UUUUUUUUUUUUUUUU\", \"$5$UUUUUUUUUUUUUUUU$ax8OTuPrxaBU76nbA7MdLvRD5Ghybn.kZdAU7gjcrU4\"},\n  {\"$5$VVVVVVVVVVVVVVVV\", \"$5$VVVVVVVVVVVVVVVV$OQehmGBGe/3ZIQZ9aWOKr2CttBP8SDx0K3U2bqJ85/1\"},\n  {\"$5$WWWWWWWWWWWWWWWW\", \"$5$WWWWWWWWWWWWWWWW$EjlH0vYOYZhvVhWruuWqpLC0t2NJzdq5zlnGoIX2bOB\"},\n  {\"$5$XXXXXXXXXXXXXXXX\", \"$5$XXXXXXXXXXXXXXXX$pVapyZeNqGWfLPAvds.35hdaULvCehrErqrZmlDrGI7\"},\n  {\"$5$YYYYYYYYYYYYYYYY\", \"$5$YYYYYYYYYYYYYYYY$bqL8kl.IRvZ6EH2j1jxMX.N5Jycve5I1QF3eYV1sTk1\"},\n  {\"$5$ZZZZZZZZZZZZZZZZ\", \"$5$ZZZZZZZZZZZZZZZZ$BpQW6V.Sned2/ey686Jf/9QyWsal.H7xZ4JZdKvtSf.\"},\n  {\"$5$[[[[[[[[[[[[[[[[\", \"$5$[[[[[[[[[[[[[[[[$Kxx8t7j2tckrKdkQcne.g8WeieU9oanqykH7unPFC8D\"},\n  {\"$5$\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\", \"*0\"},\n  {\"$5$]]]]]]]]]]]]]]]]\", \"$5$]]]]]]]]]]]]]]]]$v/dsYHRr8uSei9wHdHYKgR1kE6/ssXtQe.Cj5w7pnJ7\"},\n  {\"$5$^^^^^^^^^^^^^^^^\", \"$5$^^^^^^^^^^^^^^^^$p2NLBCuJP2PuLLKYazCIVBHi0deXJSG6MIhK37HqC/D\"},\n  {\"$5$________________\", \"$5$________________$AHciRH92K4w7nTLbBn1tZq2wvR9M6LjS2UYbYXCTis1\"},\n  {\"$5$````````````````\", \"$5$````````````````$xYEXvr4fcBaOc3vrrlggJulFVQc9F5Y90nV.vDS9v0C\"},\n  {\"$5$aaaaaaaaaaaaaaaa\", \"$5$aaaaaaaaaaaaaaaa$xOxMjsC8uGeIeuWiWjuqSpfwUDrq4KGPdOTKyd0KfJ8\"},\n  {\"$5$bbbbbbbbbbbbbbbb\", \"$5$bbbbbbbbbbbbbbbb$Jb7o7yezHNA9X2ZGhqCSWdPWEJ3D7k/VsuKhMGN1IL5\"},\n  {\"$5$cccccccccccccccc\", \"$5$cccccccccccccccc$9/rqDusRqEopAIW.t5dYMmgNvmnk5WI2G2L8WrmvOJ1\"},\n  {\"$5$dddddddddddddddd\", \"$5$dddddddddddddddd$98UTIoNQDn5V2pNRK9RuKVDExLOFmnhHXB9OnJX9Vt.\"},\n  {\"$5$eeeeeeeeeeeeeeee\", \"$5$eeeeeeeeeeeeeeee$yH9ZoFyknDt6Dc05jg7MBeeE0XMPxOsTMV5vSlUZYX8\"},\n  {\"$5$ffffffffffffffff\", \"$5$ffffffffffffffff$ZQI3fYusr0D2ZkXM.x3LR9Uww3v3RmMvQGLS/43EFnA\"},\n  {\"$5$gggggggggggggggg\", \"$5$gggggggggggggggg$/UJVmABMZxxloTI7Z.TNEtPiejlmWcPH9Q4xcbP93K8\"},\n  {\"$5$hhhhhhhhhhhhhhhh\", \"$5$hhhhhhhhhhhhhhhh$yHqyY4G5Gq966erkXmBaw1rO6ir.Fw80Ex1dQUHHCE8\"},\n  {\"$5$iiiiiiiiiiiiiiii\", \"$5$iiiiiiiiiiiiiiii$nLWcRRmLTRGJ.dKBRCtRKukfCfCceGq7PMtsR4rNrQ5\"},\n  {\"$5$jjjjjjjjjjjjjjjj\", \"$5$jjjjjjjjjjjjjjjj$ZLZfaKGuAqH1p5KhJ8..oThpB1wXZsu8SYO6sg5Dc.3\"},\n  {\"$5$kkkkkkkkkkkkkkkk\", \"$5$kkkkkkkkkkkkkkkk$Z120Z4aa9ajtl8YN.OXSbS87Z4XCkP5LEX/tdDxDBY1\"},\n  {\"$5$llllllllllllllll\", \"$5$llllllllllllllll$ExDgrdZcQuwFAqfWwIXwU8FO9IoQYGh.paiXLnksHR9\"},\n  {\"$5$mmmmmmmmmmmmmmmm\", \"$5$mmmmmmmmmmmmmmmm$JaWuf4lmgatfz4GWMRhkNmodXwuwx2HLGbqajxxI2H7\"},\n  {\"$5$nnnnnnnnnnnnnnnn\", \"$5$nnnnnnnnnnnnnnnn$HNrcFfckFkhxPuf65oiVAeVZ4ReR7cT5n3cx5bBQZgA\"},\n  {\"$5$oooooooooooooooo\", \"$5$oooooooooooooooo$g6DVh2i3Mv1lVu4tbRjg.voWFRVDFvdVwjHlNBS2p/6\"},\n  {\"$5$pppppppppppppppp\", \"$5$pppppppppppppppp$n45WFITWV.YlZafkp4giNBbFJ7E0K3hk.4ATQQWmpfB\"},\n  {\"$5$qqqqqqqqqqqqqqqq\", \"$5$qqqqqqqqqqqqqqqq$aZlTD3j/FbEH7JtiYQzNWqHMpsrzOMGdi7NYwa3R5q/\"},\n  {\"$5$rrrrrrrrrrrrrrrr\", \"$5$rrrrrrrrrrrrrrrr$NZUVfiRHu8kdnjiwUiMdBBZ.DoJCAO4STgltaUv0p.B\"},\n  {\"$5$ssssssssssssssss\", \"$5$ssssssssssssssss$onSPRcYGEGSFWK.PtbsWLuKL9MLoSTXcWMp989oUdu9\"},\n  {\"$5$tttttttttttttttt\", \"$5$tttttttttttttttt$evmPxXoulgYCuuPtM0RsqUDlbQcY5VyALX4YB/jzuZC\"},\n  {\"$5$uuuuuuuuuuuuuuuu\", \"$5$uuuuuuuuuuuuuuuu$zA7OLW4DbHif04U.BxAOsmKQIGOszsDFpgKs4/lDbnC\"},\n  {\"$5$vvvvvvvvvvvvvvvv\", \"$5$vvvvvvvvvvvvvvvv$ByQtI4ZSnpYYeycSmlI7X0KOWin/frKXnkGvPbkrH/8\"},\n  {\"$5$wwwwwwwwwwwwwwww\", \"$5$wwwwwwwwwwwwwwww$rYx8MlvDNcbwsDWkPSyglFUbjuTbedp5Ud5px3OXjQ/\"},\n  {\"$5$xxxxxxxxxxxxxxxx\", \"$5$xxxxxxxxxxxxxxxx$LOl2z2Jw4dWgqW4ukK.IcVS9REnxkVPpMm/vFKcrnO9\"},\n  {\"$5$yyyyyyyyyyyyyyyy\", \"$5$yyyyyyyyyyyyyyyy$ubCS2POH1zfaPYiEnKZTnkwLqjisxunxmplxwNkG/m/\"},\n  {\"$5$zzzzzzzzzzzzzzzz\", \"$5$zzzzzzzzzzzzzzzz$lPqbXBcwOQ81XXT7xKjJIGVr4ChEWRmrZdHgv0am1v7\"},\n  {\"$5${{{{{{{{{{{{{{{{\", \"$5${{{{{{{{{{{{{{{{$ZJN/mpIRViDP0XULRTfFiemdciu8dAnbkcOQfLF0YD0\"},\n  {\"$5$||||||||||||||||\", \"$5$||||||||||||||||$0wYgvq83T4NnAIcE.rtIiEZqr75cYFLFIHaiYF6eNG2\"},\n  {\"$5$}}}}}}}}}}}}}}}}\", \"$5$}}}}}}}}}}}}}}}}$CFAky4H9RLcJjTh0wClEOdEVQiL/mHu9i6ogNXFCA0B\"},\n  {\"$5$~~~~~~~~~~~~~~~~\", \"$5$~~~~~~~~~~~~~~~~$AT92oDPwlSlTL9uTxyAG1mEs.9iJYpKvuNUKzoJIyIA\"},\n  {\"$5$\\x7f\\x7f\\x7f\\x7f\\x7f\\x7f\\x7f\\x7f\\x7f\\x7f\\x7f\\x7f\\x7f\\x7f\\x7f\\x7f\", \"*0\"},\n  {\"$5$\\x80\\x80\\x80\\x80\\x80\\x80\\x80\\x80\\x80\\x80\\x80\\x80\\x80\\x80\\x80\\x80\", \"*0\"},\n  {\"$5$\\x81\\x81\\x81\\x81\\x81\\x81\\x81\\x81\\x81\\x81\\x81\\x81\\x81\\x81\\x81\\x81\", \"*0\"},\n  {\"$5$\\x82\\x82\\x82\\x82\\x82\\x82\\x82\\x82\\x82\\x82\\x82\\x82\\x82\\x82\\x82\\x82\", \"*0\"},\n  {\"$5$\\x83\\x83\\x83\\x83\\x83\\x83\\x83\\x83\\x83\\x83\\x83\\x83\\x83\\x83\\x83\\x83\", \"*0\"},\n  {\"$5$\\x84\\x84\\x84\\x84\\x84\\x84\\x84\\x84\\x84\\x84\\x84\\x84\\x84\\x84\\x84\\x84\", \"*0\"},\n  {\"$5$\\x85\\x85\\x85\\x85\\x85\\x85\\x85\\x85\\x85\\x85\\x85\\x85\\x85\\x85\\x85\\x85\", \"*0\"},\n  {\"$5$\\x86\\x86\\x86\\x86\\x86\\x86\\x86\\x86\\x86\\x86\\x86\\x86\\x86\\x86\\x86\\x86\", \"*0\"},\n  {\"$5$\\x87\\x87\\x87\\x87\\x87\\x87\\x87\\x87\\x87\\x87\\x87\\x87\\x87\\x87\\x87\\x87\", \"*0\"},\n  {\"$5$\\x88\\x88\\x88\\x88\\x88\\x88\\x88\\x88\\x88\\x88\\x88\\x88\\x88\\x88\\x88\\x88\", \"*0\"},\n  {\"$5$\\x89\\x89\\x89\\x89\\x89\\x89\\x89\\x89\\x89\\x89\\x89\\x89\\x89\\x89\\x89\\x89\", \"*0\"},\n  {\"$5$\\x8a\\x8a\\x8a\\x8a\\x8a\\x8a\\x8a\\x8a\\x8a\\x8a\\x8a\\x8a\\x8a\\x8a\\x8a\\x8a\", \"*0\"},\n  {\"$5$\\x8b\\x8b\\x8b\\x8b\\x8b\\x8b\\x8b\\x8b\\x8b\\x8b\\x8b\\x8b\\x8b\\x8b\\x8b\\x8b\", \"*0\"},\n  {\"$5$\\x8c\\x8c\\x8c\\x8c\\x8c\\x8c\\x8c\\x8c\\x8c\\x8c\\x8c\\x8c\\x8c\\x8c\\x8c\\x8c\", \"*0\"},\n  {\"$5$\\x8d\\x8d\\x8d\\x8d\\x8d\\x8d\\x8d\\x8d\\x8d\\x8d\\x8d\\x8d\\x8d\\x8d\\x8d\\x8d\", \"*0\"},\n  {\"$5$\\x8e\\x8e\\x8e\\x8e\\x8e\\x8e\\x8e\\x8e\\x8e\\x8e\\x8e\\x8e\\x8e\\x8e\\x8e\\x8e\", \"*0\"},\n  {\"$5$\\x8f\\x8f\\x8f\\x8f\\x8f\\x8f\\x8f\\x8f\\x8f\\x8f\\x8f\\x8f\\x8f\\x8f\\x8f\\x8f\", \"*0\"},\n  {\"$5$\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\", \"*0\"},\n  {\"$5$\\x91\\x91\\x91\\x91\\x91\\x91\\x91\\x91\\x91\\x91\\x91\\x91\\x91\\x91\\x91\\x91\", \"*0\"},\n  {\"$5$\\x92\\x92\\x92\\x92\\x92\\x92\\x92\\x92\\x92\\x92\\x92\\x92\\x92\\x92\\x92\\x92\", \"*0\"},\n  {\"$5$\\x93\\x93\\x93\\x93\\x93\\x93\\x93\\x93\\x93\\x93\\x93\\x93\\x93\\x93\\x93\\x93\", \"*0\"},\n  {\"$5$\\x94\\x94\\x94\\x94\\x94\\x94\\x94\\x94\\x94\\x94\\x94\\x94\\x94\\x94\\x94\\x94\", \"*0\"},\n  {\"$5$\\x95\\x95\\x95\\x95\\x95\\x95\\x95\\x95\\x95\\x95\\x95\\x95\\x95\\x95\\x95\\x95\", \"*0\"},\n  {\"$5$\\x96\\x96\\x96\\x96\\x96\\x96\\x96\\x96\\x96\\x96\\x96\\x96\\x96\\x96\\x96\\x96\", \"*0\"},\n  {\"$5$\\x97\\x97\\x97\\x97\\x97\\x97\\x97\\x97\\x97\\x97\\x97\\x97\\x97\\x97\\x97\\x97\", \"*0\"},\n  {\"$5$\\x98\\x98\\x98\\x98\\x98\\x98\\x98\\x98\\x98\\x98\\x98\\x98\\x98\\x98\\x98\\x98\", \"*0\"},\n  {\"$5$\\x99\\x99\\x99\\x99\\x99\\x99\\x99\\x99\\x99\\x99\\x99\\x99\\x99\\x99\\x99\\x99\", \"*0\"},\n  {\"$5$\\x9a\\x9a\\x9a\\x9a\\x9a\\x9a\\x9a\\x9a\\x9a\\x9a\\x9a\\x9a\\x9a\\x9a\\x9a\\x9a\", \"*0\"},\n  {\"$5$\\x9b\\x9b\\x9b\\x9b\\x9b\\x9b\\x9b\\x9b\\x9b\\x9b\\x9b\\x9b\\x9b\\x9b\\x9b\\x9b\", \"*0\"},\n  {\"$5$\\x9c\\x9c\\x9c\\x9c\\x9c\\x9c\\x9c\\x9c\\x9c\\x9c\\x9c\\x9c\\x9c\\x9c\\x9c\\x9c\", \"*0\"},\n  {\"$5$\\x9d\\x9d\\x9d\\x9d\\x9d\\x9d\\x9d\\x9d\\x9d\\x9d\\x9d\\x9d\\x9d\\x9d\\x9d\\x9d\", \"*0\"},\n  {\"$5$\\x9e\\x9e\\x9e\\x9e\\x9e\\x9e\\x9e\\x9e\\x9e\\x9e\\x9e\\x9e\\x9e\\x9e\\x9e\\x9e\", \"*0\"},\n  {\"$5$\\x9f\\x9f\\x9f\\x9f\\x9f\\x9f\\x9f\\x9f\\x9f\\x9f\\x9f\\x9f\\x9f\\x9f\\x9f\\x9f\", \"*0\"},\n  {\"$5$\\xa0\\xa0\\xa0\\xa0\\xa0\\xa0\\xa0\\xa0\\xa0\\xa0\\xa0\\xa0\\xa0\\xa0\\xa0\\xa0\", \"*0\"},\n  {\"$5$\\xa1\\xa1\\xa1\\xa1\\xa1\\xa1\\xa1\\xa1\\xa1\\xa1\\xa1\\xa1\\xa1\\xa1\\xa1\\xa1\", \"*0\"},\n  {\"$5$\\xa2\\xa2\\xa2\\xa2\\xa2\\xa2\\xa2\\xa2\\xa2\\xa2\\xa2\\xa2\\xa2\\xa2\\xa2\\xa2\", \"*0\"},\n  {\"$5$\\xa3\\xa3\\xa3\\xa3\\xa3\\xa3\\xa3\\xa3\\xa3\\xa3\\xa3\\xa3\\xa3\\xa3\\xa3\\xa3\", \"*0\"},\n  {\"$5$\\xa4\\xa4\\xa4\\xa4\\xa4\\xa4\\xa4\\xa4\\xa4\\xa4\\xa4\\xa4\\xa4\\xa4\\xa4\\xa4\", \"*0\"},\n  {\"$5$\\xa5\\xa5\\xa5\\xa5\\xa5\\xa5\\xa5\\xa5\\xa5\\xa5\\xa5\\xa5\\xa5\\xa5\\xa5\\xa5\", \"*0\"},\n  {\"$5$\\xa6\\xa6\\xa6\\xa6\\xa6\\xa6\\xa6\\xa6\\xa6\\xa6\\xa6\\xa6\\xa6\\xa6\\xa6\\xa6\", \"*0\"},\n  {\"$5$\\xa7\\xa7\\xa7\\xa7\\xa7\\xa7\\xa7\\xa7\\xa7\\xa7\\xa7\\xa7\\xa7\\xa7\\xa7\\xa7\", \"*0\"},\n  {\"$5$\\xa8\\xa8\\xa8\\xa8\\xa8\\xa8\\xa8\\xa8\\xa8\\xa8\\xa8\\xa8\\xa8\\xa8\\xa8\\xa8\", \"*0\"},\n  {\"$5$\\xa9\\xa9\\xa9\\xa9\\xa9\\xa9\\xa9\\xa9\\xa9\\xa9\\xa9\\xa9\\xa9\\xa9\\xa9\\xa9\", \"*0\"},\n  {\"$5$\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\", \"*0\"},\n  {\"$5$\\xab\\xab\\xab\\xab\\xab\\xab\\xab\\xab\\xab\\xab\\xab\\xab\\xab\\xab\\xab\\xab\", \"*0\"},\n  {\"$5$\\xac\\xac\\xac\\xac\\xac\\xac\\xac\\xac\\xac\\xac\\xac\\xac\\xac\\xac\\xac\\xac\", \"*0\"},\n  {\"$5$\\xad\\xad\\xad\\xad\\xad\\xad\\xad\\xad\\xad\\xad\\xad\\xad\\xad\\xad\\xad\\xad\", \"*0\"},\n  {\"$5$\\xae\\xae\\xae\\xae\\xae\\xae\\xae\\xae\\xae\\xae\\xae\\xae\\xae\\xae\\xae\\xae\", \"*0\"},\n  {\"$5$\\xaf\\xaf\\xaf\\xaf\\xaf\\xaf\\xaf\\xaf\\xaf\\xaf\\xaf\\xaf\\xaf\\xaf\\xaf\\xaf\", \"*0\"},\n  {\"$5$\\xb0\\xb0\\xb0\\xb0\\xb0\\xb0\\xb0\\xb0\\xb0\\xb0\\xb0\\xb0\\xb0\\xb0\\xb0\\xb0\", \"*0\"},\n  {\"$5$\\xb1\\xb1\\xb1\\xb1\\xb1\\xb1\\xb1\\xb1\\xb1\\xb1\\xb1\\xb1\\xb1\\xb1\\xb1\\xb1\", \"*0\"},\n  {\"$5$\\xb2\\xb2\\xb2\\xb2\\xb2\\xb2\\xb2\\xb2\\xb2\\xb2\\xb2\\xb2\\xb2\\xb2\\xb2\\xb2\", \"*0\"},\n  {\"$5$\\xb3\\xb3\\xb3\\xb3\\xb3\\xb3\\xb3\\xb3\\xb3\\xb3\\xb3\\xb3\\xb3\\xb3\\xb3\\xb3\", \"*0\"},\n  {\"$5$\\xb4\\xb4\\xb4\\xb4\\xb4\\xb4\\xb4\\xb4\\xb4\\xb4\\xb4\\xb4\\xb4\\xb4\\xb4\\xb4\", \"*0\"},\n  {\"$5$\\xb5\\xb5\\xb5\\xb5\\xb5\\xb5\\xb5\\xb5\\xb5\\xb5\\xb5\\xb5\\xb5\\xb5\\xb5\\xb5\", \"*0\"},\n  {\"$5$\\xb6\\xb6\\xb6\\xb6\\xb6\\xb6\\xb6\\xb6\\xb6\\xb6\\xb6\\xb6\\xb6\\xb6\\xb6\\xb6\", \"*0\"},\n  {\"$5$\\xb7\\xb7\\xb7\\xb7\\xb7\\xb7\\xb7\\xb7\\xb7\\xb7\\xb7\\xb7\\xb7\\xb7\\xb7\\xb7\", \"*0\"},\n  {\"$5$\\xb8\\xb8\\xb8\\xb8\\xb8\\xb8\\xb8\\xb8\\xb8\\xb8\\xb8\\xb8\\xb8\\xb8\\xb8\\xb8\", \"*0\"},\n  {\"$5$\\xb9\\xb9\\xb9\\xb9\\xb9\\xb9\\xb9\\xb9\\xb9\\xb9\\xb9\\xb9\\xb9\\xb9\\xb9\\xb9\", \"*0\"},\n  {\"$5$\\xba\\xba\\xba\\xba\\xba\\xba\\xba\\xba\\xba\\xba\\xba\\xba\\xba\\xba\\xba\\xba\", \"*0\"},\n  {\"$5$\\xbb\\xbb\\xbb\\xbb\\xbb\\xbb\\xbb\\xbb\\xbb\\xbb\\xbb\\xbb\\xbb\\xbb\\xbb\\xbb\", \"*0\"},\n  {\"$5$\\xbc\\xbc\\xbc\\xbc\\xbc\\xbc\\xbc\\xbc\\xbc\\xbc\\xbc\\xbc\\xbc\\xbc\\xbc\\xbc\", \"*0\"},\n  {\"$5$\\xbd\\xbd\\xbd\\xbd\\xbd\\xbd\\xbd\\xbd\\xbd\\xbd\\xbd\\xbd\\xbd\\xbd\\xbd\\xbd\", \"*0\"},\n  {\"$5$\\xbe\\xbe\\xbe\\xbe\\xbe\\xbe\\xbe\\xbe\\xbe\\xbe\\xbe\\xbe\\xbe\\xbe\\xbe\\xbe\", \"*0\"},\n  {\"$5$\\xbf\\xbf\\xbf\\xbf\\xbf\\xbf\\xbf\\xbf\\xbf\\xbf\\xbf\\xbf\\xbf\\xbf\\xbf\\xbf\", \"*0\"},\n  {\"$5$\\xc0\\xc0\\xc0\\xc0\\xc0\\xc0\\xc0\\xc0\\xc0\\xc0\\xc0\\xc0\\xc0\\xc0\\xc0\\xc0\", \"*0\"},\n  {\"$5$\\xc1\\xc1\\xc1\\xc1\\xc1\\xc1\\xc1\\xc1\\xc1\\xc1\\xc1\\xc1\\xc1\\xc1\\xc1\\xc1\", \"*0\"},\n  {\"$5$\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\", \"*0\"},\n  {\"$5$\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\", \"*0\"},\n  {\"$5$\\xc4\\xc4\\xc4\\xc4\\xc4\\xc4\\xc4\\xc4\\xc4\\xc4\\xc4\\xc4\\xc4\\xc4\\xc4\\xc4\", \"*0\"},\n  {\"$5$\\xc5\\xc5\\xc5\\xc5\\xc5\\xc5\\xc5\\xc5\\xc5\\xc5\\xc5\\xc5\\xc5\\xc5\\xc5\\xc5\", \"*0\"},\n  {\"$5$\\xc6\\xc6\\xc6\\xc6\\xc6\\xc6\\xc6\\xc6\\xc6\\xc6\\xc6\\xc6\\xc6\\xc6\\xc6\\xc6\", \"*0\"},\n  {\"$5$\\xc7\\xc7\\xc7\\xc7\\xc7\\xc7\\xc7\\xc7\\xc7\\xc7\\xc7\\xc7\\xc7\\xc7\\xc7\\xc7\", \"*0\"},\n  {\"$5$\\xc8\\xc8\\xc8\\xc8\\xc8\\xc8\\xc8\\xc8\\xc8\\xc8\\xc8\\xc8\\xc8\\xc8\\xc8\\xc8\", \"*0\"},\n  {\"$5$\\xc9\\xc9\\xc9\\xc9\\xc9\\xc9\\xc9\\xc9\\xc9\\xc9\\xc9\\xc9\\xc9\\xc9\\xc9\\xc9\", \"*0\"},\n  {\"$5$\\xca\\xca\\xca\\xca\\xca\\xca\\xca\\xca\\xca\\xca\\xca\\xca\\xca\\xca\\xca\\xca\", \"*0\"},\n  {\"$5$\\xcb\\xcb\\xcb\\xcb\\xcb\\xcb\\xcb\\xcb\\xcb\\xcb\\xcb\\xcb\\xcb\\xcb\\xcb\\xcb\", \"*0\"},\n  {\"$5$\\xcc\\xcc\\xcc\\xcc\\xcc\\xcc\\xcc\\xcc\\xcc\\xcc\\xcc\\xcc\\xcc\\xcc\\xcc\\xcc\", \"*0\"},\n  {\"$5$\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\", \"*0\"},\n  {\"$5$\\xce\\xce\\xce\\xce\\xce\\xce\\xce\\xce\\xce\\xce\\xce\\xce\\xce\\xce\\xce\\xce\", \"*0\"},\n  {\"$5$\\xcf\\xcf\\xcf\\xcf\\xcf\\xcf\\xcf\\xcf\\xcf\\xcf\\xcf\\xcf\\xcf\\xcf\\xcf\\xcf\", \"*0\"},\n  {\"$5$\\xd0\\xd0\\xd0\\xd0\\xd0\\xd0\\xd0\\xd0\\xd0\\xd0\\xd0\\xd0\\xd0\\xd0\\xd0\\xd0\", \"*0\"},\n  {\"$5$\\xd1\\xd1\\xd1\\xd1\\xd1\\xd1\\xd1\\xd1\\xd1\\xd1\\xd1\\xd1\\xd1\\xd1\\xd1\\xd1\", \"*0\"},\n  {\"$5$\\xd2\\xd2\\xd2\\xd2\\xd2\\xd2\\xd2\\xd2\\xd2\\xd2\\xd2\\xd2\\xd2\\xd2\\xd2\\xd2\", \"*0\"},\n  {\"$5$\\xd3\\xd3\\xd3\\xd3\\xd3\\xd3\\xd3\\xd3\\xd3\\xd3\\xd3\\xd3\\xd3\\xd3\\xd3\\xd3\", \"*0\"},\n  {\"$5$\\xd4\\xd4\\xd4\\xd4\\xd4\\xd4\\xd4\\xd4\\xd4\\xd4\\xd4\\xd4\\xd4\\xd4\\xd4\\xd4\", \"*0\"},\n  {\"$5$\\xd5\\xd5\\xd5\\xd5\\xd5\\xd5\\xd5\\xd5\\xd5\\xd5\\xd5\\xd5\\xd5\\xd5\\xd5\\xd5\", \"*0\"},\n  {\"$5$\\xd6\\xd6\\xd6\\xd6\\xd6\\xd6\\xd6\\xd6\\xd6\\xd6\\xd6\\xd6\\xd6\\xd6\\xd6\\xd6\", \"*0\"},\n  {\"$5$\\xd7\\xd7\\xd7\\xd7\\xd7\\xd7\\xd7\\xd7\\xd7\\xd7\\xd7\\xd7\\xd7\\xd7\\xd7\\xd7\", \"*0\"},\n  {\"$5$\\xd8\\xd8\\xd8\\xd8\\xd8\\xd8\\xd8\\xd8\\xd8\\xd8\\xd8\\xd8\\xd8\\xd8\\xd8\\xd8\", \"*0\"},\n  {\"$5$\\xd9\\xd9\\xd9\\xd9\\xd9\\xd9\\xd9\\xd9\\xd9\\xd9\\xd9\\xd9\\xd9\\xd9\\xd9\\xd9\", \"*0\"},\n  {\"$5$\\xda\\xda\\xda\\xda\\xda\\xda\\xda\\xda\\xda\\xda\\xda\\xda\\xda\\xda\\xda\\xda\", \"*0\"},\n  {\"$5$\\xdb\\xdb\\xdb\\xdb\\xdb\\xdb\\xdb\\xdb\\xdb\\xdb\\xdb\\xdb\\xdb\\xdb\\xdb\\xdb\", \"*0\"},\n  {\"$5$\\xdc\\xdc\\xdc\\xdc\\xdc\\xdc\\xdc\\xdc\\xdc\\xdc\\xdc\\xdc\\xdc\\xdc\\xdc\\xdc\", \"*0\"},\n  {\"$5$\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\", \"*0\"},\n  {\"$5$\\xde\\xde\\xde\\xde\\xde\\xde\\xde\\xde\\xde\\xde\\xde\\xde\\xde\\xde\\xde\\xde\", \"*0\"},\n  {\"$5$\\xdf\\xdf\\xdf\\xdf\\xdf\\xdf\\xdf\\xdf\\xdf\\xdf\\xdf\\xdf\\xdf\\xdf\\xdf\\xdf\", \"*0\"},\n  {\"$5$\\xe0\\xe0\\xe0\\xe0\\xe0\\xe0\\xe0\\xe0\\xe0\\xe0\\xe0\\xe0\\xe0\\xe0\\xe0\\xe0\", \"*0\"},\n  {\"$5$\\xe1\\xe1\\xe1\\xe1\\xe1\\xe1\\xe1\\xe1\\xe1\\xe1\\xe1\\xe1\\xe1\\xe1\\xe1\\xe1\", \"*0\"},\n  {\"$5$\\xe2\\xe2\\xe2\\xe2\\xe2\\xe2\\xe2\\xe2\\xe2\\xe2\\xe2\\xe2\\xe2\\xe2\\xe2\\xe2\", \"*0\"},\n  {\"$5$\\xe3\\xe3\\xe3\\xe3\\xe3\\xe3\\xe3\\xe3\\xe3\\xe3\\xe3\\xe3\\xe3\\xe3\\xe3\\xe3\", \"*0\"},\n  {\"$5$\\xe4\\xe4\\xe4\\xe4\\xe4\\xe4\\xe4\\xe4\\xe4\\xe4\\xe4\\xe4\\xe4\\xe4\\xe4\\xe4\", \"*0\"},\n  {\"$5$\\xe5\\xe5\\xe5\\xe5\\xe5\\xe5\\xe5\\xe5\\xe5\\xe5\\xe5\\xe5\\xe5\\xe5\\xe5\\xe5\", \"*0\"},\n  {\"$5$\\xe6\\xe6\\xe6\\xe6\\xe6\\xe6\\xe6\\xe6\\xe6\\xe6\\xe6\\xe6\\xe6\\xe6\\xe6\\xe6\", \"*0\"},\n  {\"$5$\\xe7\\xe7\\xe7\\xe7\\xe7\\xe7\\xe7\\xe7\\xe7\\xe7\\xe7\\xe7\\xe7\\xe7\\xe7\\xe7\", \"*0\"},\n  {\"$5$\\xe8\\xe8\\xe8\\xe8\\xe8\\xe8\\xe8\\xe8\\xe8\\xe8\\xe8\\xe8\\xe8\\xe8\\xe8\\xe8\", \"*0\"},\n  {\"$5$\\xe9\\xe9\\xe9\\xe9\\xe9\\xe9\\xe9\\xe9\\xe9\\xe9\\xe9\\xe9\\xe9\\xe9\\xe9\\xe9\", \"*0\"},\n  {\"$5$\\xea\\xea\\xea\\xea\\xea\\xea\\xea\\xea\\xea\\xea\\xea\\xea\\xea\\xea\\xea\\xea\", \"*0\"},\n  {\"$5$\\xeb\\xeb\\xeb\\xeb\\xeb\\xeb\\xeb\\xeb\\xeb\\xeb\\xeb\\xeb\\xeb\\xeb\\xeb\\xeb\", \"*0\"},\n  {\"$5$\\xec\\xec\\xec\\xec\\xec\\xec\\xec\\xec\\xec\\xec\\xec\\xec\\xec\\xec\\xec\\xec\", \"*0\"},\n  {\"$5$\\xed\\xed\\xed\\xed\\xed\\xed\\xed\\xed\\xed\\xed\\xed\\xed\\xed\\xed\\xed\\xed\", \"*0\"},\n  {\"$5$\\xee\\xee\\xee\\xee\\xee\\xee\\xee\\xee\\xee\\xee\\xee\\xee\\xee\\xee\\xee\\xee\", \"*0\"},\n  {\"$5$\\xef\\xef\\xef\\xef\\xef\\xef\\xef\\xef\\xef\\xef\\xef\\xef\\xef\\xef\\xef\\xef\", \"*0\"},\n  {\"$5$\\xf0\\xf0\\xf0\\xf0\\xf0\\xf0\\xf0\\xf0\\xf0\\xf0\\xf0\\xf0\\xf0\\xf0\\xf0\\xf0\", \"*0\"},\n  {\"$5$\\xf1\\xf1\\xf1\\xf1\\xf1\\xf1\\xf1\\xf1\\xf1\\xf1\\xf1\\xf1\\xf1\\xf1\\xf1\\xf1\", \"*0\"},\n  {\"$5$\\xf2\\xf2\\xf2\\xf2\\xf2\\xf2\\xf2\\xf2\\xf2\\xf2\\xf2\\xf2\\xf2\\xf2\\xf2\\xf2\", \"*0\"},\n  {\"$5$\\xf3\\xf3\\xf3\\xf3\\xf3\\xf3\\xf3\\xf3\\xf3\\xf3\\xf3\\xf3\\xf3\\xf3\\xf3\\xf3\", \"*0\"},\n  {\"$5$\\xf4\\xf4\\xf4\\xf4\\xf4\\xf4\\xf4\\xf4\\xf4\\xf4\\xf4\\xf4\\xf4\\xf4\\xf4\\xf4\", \"*0\"},\n  {\"$5$\\xf5\\xf5\\xf5\\xf5\\xf5\\xf5\\xf5\\xf5\\xf5\\xf5\\xf5\\xf5\\xf5\\xf5\\xf5\\xf5\", \"*0\"},\n  {\"$5$\\xf6\\xf6\\xf6\\xf6\\xf6\\xf6\\xf6\\xf6\\xf6\\xf6\\xf6\\xf6\\xf6\\xf6\\xf6\\xf6\", \"*0\"},\n  {\"$5$\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\", \"*0\"},\n  {\"$5$\\xf8\\xf8\\xf8\\xf8\\xf8\\xf8\\xf8\\xf8\\xf8\\xf8\\xf8\\xf8\\xf8\\xf8\\xf8\\xf8\", \"*0\"},\n  {\"$5$\\xf9\\xf9\\xf9\\xf9\\xf9\\xf9\\xf9\\xf9\\xf9\\xf9\\xf9\\xf9\\xf9\\xf9\\xf9\\xf9\", \"*0\"},\n  {\"$5$\\xfa\\xfa\\xfa\\xfa\\xfa\\xfa\\xfa\\xfa\\xfa\\xfa\\xfa\\xfa\\xfa\\xfa\\xfa\\xfa\", \"*0\"},\n  {\"$5$\\xfb\\xfb\\xfb\\xfb\\xfb\\xfb\\xfb\\xfb\\xfb\\xfb\\xfb\\xfb\\xfb\\xfb\\xfb\\xfb\", \"*0\"},\n  {\"$5$\\xfc\\xfc\\xfc\\xfc\\xfc\\xfc\\xfc\\xfc\\xfc\\xfc\\xfc\\xfc\\xfc\\xfc\\xfc\\xfc\", \"*0\"},\n  {\"$5$\\xfd\\xfd\\xfd\\xfd\\xfd\\xfd\\xfd\\xfd\\xfd\\xfd\\xfd\\xfd\\xfd\\xfd\\xfd\\xfd\", \"*0\"},\n  {\"$5$\\xfe\\xfe\\xfe\\xfe\\xfe\\xfe\\xfe\\xfe\\xfe\\xfe\\xfe\\xfe\\xfe\\xfe\\xfe\\xfe\", \"*0\"},\n  {\"$5$\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\", \"*0\"},\n#endif\n#if INCLUDE_sha512crypt\n  {\"$6$\", \"$6$$t2FbUVbthAvIU7XM/8/NizHqHc/gcVkV6TK7SSXPCv.uHfMVKKmKs1ezXF8vtKC6ACvY0g/lmErEnI4Jy8WY9/\"},\n  {\"$6$\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\", \"*0\"},\n  {\"$6$\\x02\\x02\\x02\\x02\\x02\\x02\\x02\\x02\\x02\\x02\\x02\\x02\\x02\\x02\\x02\\x02\", \"*0\"},\n  {\"$6$\\x03\\x03\\x03\\x03\\x03\\x03\\x03\\x03\\x03\\x03\\x03\\x03\\x03\\x03\\x03\\x03\", \"*0\"},\n  {\"$6$\\x04\\x04\\x04\\x04\\x04\\x04\\x04\\x04\\x04\\x04\\x04\\x04\\x04\\x04\\x04\\x04\", \"*0\"},\n  {\"$6$\\x05\\x05\\x05\\x05\\x05\\x05\\x05\\x05\\x05\\x05\\x05\\x05\\x05\\x05\\x05\\x05\", \"*0\"},\n  {\"$6$\\x06\\x06\\x06\\x06\\x06\\x06\\x06\\x06\\x06\\x06\\x06\\x06\\x06\\x06\\x06\\x06\", \"*0\"},\n  {\"$6$\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\", \"*0\"},\n  {\"$6$\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\", \"*0\"},\n  {\"$6$\\x09\\x09\\x09\\x09\\x09\\x09\\x09\\x09\\x09\\x09\\x09\\x09\\x09\\x09\\x09\\x09\", \"*0\"},\n  {\"$6$\\x0a\\x0a\\x0a\\x0a\\x0a\\x0a\\x0a\\x0a\\x0a\\x0a\\x0a\\x0a\\x0a\\x0a\\x0a\\x0a\", \"*0\"},\n  {\"$6$\\x0b\\x0b\\x0b\\x0b\\x0b\\x0b\\x0b\\x0b\\x0b\\x0b\\x0b\\x0b\\x0b\\x0b\\x0b\\x0b\", \"*0\"},\n  {\"$6$\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\\x0c\", \"*0\"},\n  {\"$6$\\x0d\\x0d\\x0d\\x0d\\x0d\\x0d\\x0d\\x0d\\x0d\\x0d\\x0d\\x0d\\x0d\\x0d\\x0d\\x0d\", \"*0\"},\n  {\"$6$\\x0e\\x0e\\x0e\\x0e\\x0e\\x0e\\x0e\\x0e\\x0e\\x0e\\x0e\\x0e\\x0e\\x0e\\x0e\\x0e\", \"*0\"},\n  {\"$6$\\x0f\\x0f\\x0f\\x0f\\x0f\\x0f\\x0f\\x0f\\x0f\\x0f\\x0f\\x0f\\x0f\\x0f\\x0f\\x0f\", \"*0\"},\n  {\"$6$\\x10\\x10\\x10\\x10\\x10\\x10\\x10\\x10\\x10\\x10\\x10\\x10\\x10\\x10\\x10\\x10\", \"*0\"},\n  {\"$6$\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\\x11\", \"*0\"},\n  {\"$6$\\x12\\x12\\x12\\x12\\x12\\x12\\x12\\x12\\x12\\x12\\x12\\x12\\x12\\x12\\x12\\x12\", \"*0\"},\n  {\"$6$\\x13\\x13\\x13\\x13\\x13\\x13\\x13\\x13\\x13\\x13\\x13\\x13\\x13\\x13\\x13\\x13\", \"*0\"},\n  {\"$6$\\x14\\x14\\x14\\x14\\x14\\x14\\x14\\x14\\x14\\x14\\x14\\x14\\x14\\x14\\x14\\x14\", \"*0\"},\n  {\"$6$\\x15\\x15\\x15\\x15\\x15\\x15\\x15\\x15\\x15\\x15\\x15\\x15\\x15\\x15\\x15\\x15\", \"*0\"},\n  {\"$6$\\x16\\x16\\x16\\x16\\x16\\x16\\x16\\x16\\x16\\x16\\x16\\x16\\x16\\x16\\x16\\x16\", \"*0\"},\n  {\"$6$\\x17\\x17\\x17\\x17\\x17\\x17\\x17\\x17\\x17\\x17\\x17\\x17\\x17\\x17\\x17\\x17\", \"*0\"},\n  {\"$6$\\x18\\x18\\x18\\x18\\x18\\x18\\x18\\x18\\x18\\x18\\x18\\x18\\x18\\x18\\x18\\x18\", \"*0\"},\n  {\"$6$\\x19\\x19\\x19\\x19\\x19\\x19\\x19\\x19\\x19\\x19\\x19\\x19\\x19\\x19\\x19\\x19\", \"*0\"},\n  {\"$6$\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\", \"*0\"},\n  {\"$6$\\x1b\\x1b\\x1b\\x1b\\x1b\\x1b\\x1b\\x1b\\x1b\\x1b\\x1b\\x1b\\x1b\\x1b\\x1b\\x1b\", \"*0\"},\n  {\"$6$\\x1c\\x1c\\x1c\\x1c\\x1c\\x1c\\x1c\\x1c\\x1c\\x1c\\x1c\\x1c\\x1c\\x1c\\x1c\\x1c\", \"*0\"},\n  {\"$6$\\x1d\\x1d\\x1d\\x1d\\x1d\\x1d\\x1d\\x1d\\x1d\\x1d\\x1d\\x1d\\x1d\\x1d\\x1d\\x1d\", \"*0\"},\n  {\"$6$\\x1e\\x1e\\x1e\\x1e\\x1e\\x1e\\x1e\\x1e\\x1e\\x1e\\x1e\\x1e\\x1e\\x1e\\x1e\\x1e\", \"*0\"},\n  {\"$6$\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\", \"*0\"},\n  {\"$6$                \", \"*0\"},\n  {\"$6$!!!!!!!!!!!!!!!!\", \"*0\"},\n  {\"$6$\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\", \"$6$\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"$y4ikCocrdkHNvDZKBGFtSBVNOKsVqCkyAbM40IRT0wRp8zkgj54tc07lPBRodv4Rpu6WT14CHJknrW/9fTwGZ/\"},\n  {\"$6$################\", \"$6$################$0lXBH7m76aEK5kQdOwPfWOyYPemgcfRbu9Rw/9Bc7SRfFuMv3PZYue6Bn.t1SO.pku7tne.AY0icRIfr2nHuG.\"},\n  {\"$6$$$$$$$$$$$$$$$$$\", \"$6$$t2FbUVbthAvIU7XM/8/NizHqHc/gcVkV6TK7SSXPCv.uHfMVKKmKs1ezXF8vtKC6ACvY0g/lmErEnI4Jy8WY9/\"},\n  {\"$6$%%%%%%%%%%%%%%%%\", \"$6$%%%%%%%%%%%%%%%%$k9bX/iMS0GLlfZjzuP/ONSSo7dlEzqwGY2aY1jm2A6ZJBIadOxXlBJjNFjHOQ.fa.PIIyRssqGTUTFpTOtztU1\"},\n  {\"$6$&&&&&&&&&&&&&&&&\", \"$6$&&&&&&&&&&&&&&&&$skVA0eRt3uM2yrsQHaYxEacC63wF9/99RUp7Pnk8aQh9CCXSpd0l3CM9g8.cwCcrRSMfMod0oO2EnAoXnoNJd1\"},\n  {\"$6$''''''''''''''''\", \"$6$''''''''''''''''$qOfgIMYACfO5W.FEno/Z8JEU9ixO70Sisy.ZyC27.hNCauDc1UssoMAn3S5ppnHzKNwL7M0CAFzMjKt2XDQK4.\"},\n  {\"$6$((((((((((((((((\", \"$6$(((((((((((((((($kJwg/5cH1DxiDMVw9/UB0VpeuqWv8vxLUZSQUhWxs0ND4.olXVb9wg9USMBSv0mXmzDMuTG0N/O1nFHFiEyr..\"},\n  {\"$6$))))))))))))))))\", \"$6$))))))))))))))))$S5sVQD7UjSWaFs4gGijIm4bs/DH.DVe2G8LuckweSH5s2YkGD.EOoVSSKJ7UYb3J2IvyqonYSHMJyiitzvRxx/\"},\n  {\"$6$****************\", \"*0\"},\n  {\"$6$++++++++++++++++\", \"$6$++++++++++++++++$pMPSwZco12aGZGv42JNb7DhWN02wliGAmvO/W5c5quH/Gx/gMDuIyhmVB3FEFMesO8/Kg0Z93FBwWs9S7mdlX1\"},\n  {\"$6$,,,,,,,,,,,,,,,,\", \"$6$,,,,,,,,,,,,,,,,$r2Cyr1grJ01AvsYn8Zljv4YLt6.mO0vjDwAD4Guc1GTXurKMF1VvSKTIG7eiB4xNPaHmVqVouXcxYYNFo3cZV1\"},\n  {\"$6$----------------\", \"$6$----------------$a1D5NaZ7Jd1t9/5tKCN/cgmdoFqw0F7PdyTwTLjAh0m07Bg.F/t4CdxKznMRVyvIzBcPuYy8VHnJD7IFxR8Bj.\"},\n  {\"$6$................\", \"$6$................$xkyddLV1z75ZjVK8QlC9547T8tsNpiZWjHJvkSWVOM.Ao/4qwd.c/TtoSJ0MmwyN7blC5rzoG59MdcceI7V/m0\"},\n  {\"$6$////////////////\", \"$6$////////////////$89PmHUAIFKYJ7FKaiU7G5tAtQ/pN2.Y6ix0dvbcQzSELt3ansXuGJS7D3JqYukb9JS/lSVeYoIBpPUKc5UF6D1\"},\n  {\"$6$0000000000000000\", \"$6$0000000000000000$MZwTpzth7AFVFvmYJhgKVvtXQ3q665hbFB0XNT6x1zZgkik0uMp3TdlNEbkCggqbGi0CRCpL80X50I9MIYV.R0\"},\n  {\"$6$1111111111111111\", \"$6$1111111111111111$B/qsncOwVkh1Y/QsBD7QNrfSfwoIPZKEWVdtRfydZk0Z1l2M1sfHqRCxyHUBTVC8JJI3JwqePZor8H75qYzHQ/\"},\n  {\"$6$2222222222222222\", \"$6$2222222222222222$OYIMW2GpZF.u5iY2JkJn1q0Be3L1RU4vKvBzJoGaVapqE.notZ0X6YUVFBMIY1IgSu1gsFaCS6VupS4yhPlu5.\"},\n  {\"$6$3333333333333333\", \"$6$3333333333333333$qAl/VDu4THkJPwesyyEQMHj9ZJlNCrTckx.wlQOuFpO3AP1v0yaqlKxeLKr8/A7/tovJuHjrLvOP.D39jaLWQ0\"},\n  {\"$6$4444444444444444\", \"$6$4444444444444444$rCmiLxgLMGvUYPULk.vYKWGbWAiWDzEfRqCUenVLECSOjseJ9jP6pxEiDOuw/owCuH6/miUJGwoQOat5ENm/b/\"},\n  {\"$6$5555555555555555\", \"$6$5555555555555555$MTaDmYPznCdZTP9fShnjNWJsdsPaMmJfHx9NXzGpiVZz0aqpF2vYw.tXXz8wYHLDpZthqpcqppKb83d42UKn3/\"},\n  {\"$6$6666666666666666\", \"$6$6666666666666666$mzCKrq0VrJQT0iLeFw8Ff4PXyS9no98H0Rr5zAllcdGC7KFHlVTcTLvaEfSivxHqsAcP16WTn9MRIbJgPINfg1\"},\n  {\"$6$7777777777777777\", \"$6$7777777777777777$UHZrbj4F.gdace5WIrAmGaqE1XBBG5WZX72C7i3YAR9jVv4dzjvbYOJUmYiAYafZ1WaIBidAsZas8.8xCOM4N/\"},\n  {\"$6$8888888888888888\", \"$6$8888888888888888$oJQcSrcBjvsVObW7M9aW9KVDf4nUzfALbBKuU0znYkqfdr3ms1Q4F4uF0p1tmc5.AFXqSK5XNu4bZ3RMMywNX/\"},\n  {\"$6$9999999999999999\", \"$6$9999999999999999$lShnYSRrSGXk/pMhUK2qqlXYB7vQi6COb.YT2/ZvyBmY/RCDCt9oBXi7kZpX8FxUIRC2D9lOFtxWpbLIbLJFM1\"},\n  {\"$6$::::::::::::::::\", \"*0\"},\n  {\"$6$;;;;;;;;;;;;;;;;\", \"*0\"},\n  {\"$6$<<<<<<<<<<<<<<<<\", \"$6$<<<<<<<<<<<<<<<<$IzHC9GvicnkYsJPc76ZnI/QS7/me9q5/kVLmIlWZzIUo3zpliZ0svdxvb73BM7WhAcfIfv7hvTCIt8/MsJ1iY.\"},\n  {\"$6$================\", \"$6$================$ks8n9O0rxQI408VzbA5KlSkpFwJjQyKg4owCQeHBvLs/TfiNZQwp75aZA6Ne6xIs1LIlnMrNhfu34hcwpALWX1\"},\n  {\"$6$>>>>>>>>>>>>>>>>\", \"$6$>>>>>>>>>>>>>>>>$ae3ShFy5aIq/ozlB3UBwZlm7P8AKn0DQqZ9oMyA0q4aIjLOYpIKNglhKLU.KY4kTX/zPHLe9pLis.B89DwLgR.\"},\n  {\"$6$????????????????\", \"$6$????????????????$TtylS7/us9mPCLMzAF4kb.DN1hTnlB/OXKcsdFcoMDt9JC9m7C7L7T5nlti8OF9U0E16NrqkcaCfChpoSeO1r/\"},\n  {\"$6$@@@@@@@@@@@@@@@@\", \"$6$@@@@@@@@@@@@@@@@$QEjlvm6.tPwaAws0U8bHfU/ElffdJOFZqAZ4HrT9a539EPJt.3TP6mL3eE.yQtRLIM4IKT3bAKCnBzeIH9XTp/\"},\n  {\"$6$AAAAAAAAAAAAAAAA\", \"$6$AAAAAAAAAAAAAAAA$pmN8p/Q2O6DIubIh7Y7TqwUDoFMRFzRsBJMpqhAoa00YEy7I2TvxVg1VyVFOP0aOhLv5mTB4SfKnHPB0GH/Lc/\"},\n  {\"$6$BBBBBBBBBBBBBBBB\", \"$6$BBBBBBBBBBBBBBBB$38jJoryxwIItUBBJLGPCifls9RzTVmapELwm91rwnY2qGLUGgV99mk6yXScu0P4mr7atgAd6mgHIP1O3t.wEx/\"},\n  {\"$6$CCCCCCCCCCCCCCCC\", \"$6$CCCCCCCCCCCCCCCC$07sW36CtP8XueaTwHGtTMBOXrBew4VFm0jwj4i1FmyWFoRXA0vTbwG.3BZ840nvjo7reW4o96o2iW0oX6fMbY/\"},\n  {\"$6$DDDDDDDDDDDDDDDD\", \"$6$DDDDDDDDDDDDDDDD$J5Kpz3nqJ3fSgwzYUsLoHsQyVe6ZKRXAkg4qJUKNM37C4CbNa2Kz/TgDVMfm6xB0P1QXHlueFjbW9mpLQu9oY.\"},\n  {\"$6$EEEEEEEEEEEEEEEE\", \"$6$EEEEEEEEEEEEEEEE$KLANbns1faG0VtS3NM7QYwUCV5YN/AiHd2KcHFKHUje0WaA7tiOkQgp58ppdw7dqYOwAt7BY0mCRdn90mA6mU.\"},\n  {\"$6$FFFFFFFFFFFFFFFF\", \"$6$FFFFFFFFFFFFFFFF$..8YbJ8DCIWBcNH5POWVhKEvcuz9cdtdOG/mbDPMQHhaU3DMfFv2NMIKnJChkmgbxhuoLKMOOCnv4lWV6PX44/\"},\n  {\"$6$GGGGGGGGGGGGGGGG\", \"$6$GGGGGGGGGGGGGGGG$u2WsXEETmQghsHTQ0DaofeEUb3UBi572elJYhRqmXMpjPm/7j2hEf8Vijtj/ml8qPjcHCdLQuYYaAWBmcnCqs1\"},\n  {\"$6$HHHHHHHHHHHHHHHH\", \"$6$HHHHHHHHHHHHHHHH$kPznwkW7ucXCzHtg9aaJ5asDnw48qKswyjLOSwmsXkF1Ugmv9508ORO/SXaHzYm377WQWE64bCPElYboD1dY90\"},\n  {\"$6$IIIIIIIIIIIIIIII\", \"$6$IIIIIIIIIIIIIIII$vSJgk2qjP66NNpM/MB58K6VNYWfVN8G5JDMT9YRDj/CzlrD3PdJmfy.ILZxEZw/2Pph06t/H4pr4B92wdJabR1\"},\n  {\"$6$JJJJJJJJJJJJJJJJ\", \"$6$JJJJJJJJJJJJJJJJ$NtS1J3/SVL1DjL6QQ7nDOCVUF/awovpSqLYQx4a/HXeZmFDxIE91Stg2oRr.TUsWPR3VXCIs9A12p3F1OoIM10\"},\n  {\"$6$KKKKKKKKKKKKKKKK\", \"$6$KKKKKKKKKKKKKKKK$4df7QnhT78fHr3Yr9ez05FRQWzszzZPnkuG7gPnJmAG5ieH03zfywDJvOVEpdNxuKci/i5TVd6mJLJCdhABnj.\"},\n  {\"$6$LLLLLLLLLLLLLLLL\", \"$6$LLLLLLLLLLLLLLLL$kP9hFAAJGrjBWIK584qYGzRucH3V4ZAnw4uHb0z6ri94gut984Ulrqk9dlsWztXX2wQK3TwdgWmC0ncD/gXiL.\"},\n  {\"$6$MMMMMMMMMMMMMMMM\", \"$6$MMMMMMMMMMMMMMMM$GTXNzFI6VGkJhZkDt.IdPZBOb9TE1ETHJuNsF.BzvVSoFWlaIRHW5IHmbyqbg6eMlhXNTJ9fJ2WcG3uYG97WU.\"},\n  {\"$6$NNNNNNNNNNNNNNNN\", \"$6$NNNNNNNNNNNNNNNN$uPLWLmXuw7eA54ynnQXJ4DCrFLIvxucQfB3ZnD7joNB4USKcd9qD61Haa7dcIh8CqMCOQFJswZg/8s9txOi/e1\"},\n  {\"$6$OOOOOOOOOOOOOOOO\", \"$6$OOOOOOOOOOOOOOOO$2WDhTCe.fILClG88sDZZEvowkFEwkeyjO56RQeOKGUrkwuO1VAXwOtiWNats56he9f7AJHKvGXkzq1GLwvT0x.\"},\n  {\"$6$PPPPPPPPPPPPPPPP\", \"$6$PPPPPPPPPPPPPPPP$CsGQkUS5yfDCvouG2ELPpyvb16PrVrjSbTFw/SAdno4xZRc4jMiDasW1xDMa8lOerVEyhRDeAfvZ0nc2ZCDpU/\"},\n  {\"$6$QQQQQQQQQQQQQQQQ\", \"$6$QQQQQQQQQQQQQQQQ$9dq9MRwFZIneAVNNNo2DyI8/0uKrTKXv8iwfu43XbCFtW1YFk/6iW2.vpzeIoohz4hZHFiNsE8OCeLmDAmIpG/\"},\n  {\"$6$RRRRRRRRRRRRRRRR\", \"$6$RRRRRRRRRRRRRRRR$GtSCVJx6/ZvUWrYpD9URyae061UswUDuqUeRaS2Z2ttyVSRzMQLjA6o7c3Dwkc2eGNPTSzpQUpvDdmqlZ4m2x1\"},\n  {\"$6$SSSSSSSSSSSSSSSS\", \"$6$SSSSSSSSSSSSSSSS$H.Dn4giCeiyRBW5S83Nq9rireF/./RYP72WPzg3UCQHjhMO0zmLV8Li0xbeHJXwuCFxkCErhxGA7m82XV1s5T.\"},\n  {\"$6$TTTTTTTTTTTTTTTT\", \"$6$TTTTTTTTTTTTTTTT$A65fsPuGvM8KjuAxku5EIHGuS/hBJYQ0PUbofZffIEK02AB/uGOikl30WqOJpfFdKWZr9q0NTtO/4kCmOD58g.\"},\n  {\"$6$UUUUUUUUUUUUUUUU\", \"$6$UUUUUUUUUUUUUUUU$8sQbCkXeG8/3kuGmpbtvo15c.EYmQvqdE1j2kQ8vP3WLfS05yVVsEaytID2zJLBQpg9qNi2uy7KdrDTG0sciF1\"},\n  {\"$6$VVVVVVVVVVVVVVVV\", \"$6$VVVVVVVVVVVVVVVV$Rm1be9Sg3miBmZGpMpCnbNY.Iyz8aug7ator7kgckT6e390jMS833.os8Y1S1mrxbYbwbzemxx8D5BfH7U5.b1\"},\n  {\"$6$WWWWWWWWWWWWWWWW\", \"$6$WWWWWWWWWWWWWWWW$Kqmzc1SThYGjwmbcjZhVgzeSopzW9rIU/VbWW3pSb6TzvnvhDi9uUFZlPN.79tSF.DR77PXnP7Q4R0l1gMDPd0\"},\n  {\"$6$XXXXXXXXXXXXXXXX\", \"$6$XXXXXXXXXXXXXXXX$KHkpQUvbQ95J.8y9iyeeAbduXiM8VSquW4auE0067SUtAIrYMVmvSrxTDoFFl1W03BLW6oT8m5FJbIe.HhrDi.\"},\n  {\"$6$YYYYYYYYYYYYYYYY\", \"$6$YYYYYYYYYYYYYYYY$x2WHwrNrf/qp4SEdZesD4JZpnf.DMmB5Zy3jC/GaYJHJb..ZwdA5Z3z7KqP.2uYJqfRoa/cpcWqB8ZZ9MvQrn0\"},\n  {\"$6$ZZZZZZZZZZZZZZZZ\", \"$6$ZZZZZZZZZZZZZZZZ$xWF6lbDczxbjDeDQfHNabpEdqmOp1hu7IFHU3AW2uxK1Q55Qhrx0jK7yAM/CCU79dmT2MBMCJP/G2o6UBoRjR0\"},\n  {\"$6$[[[[[[[[[[[[[[[[\", \"$6$[[[[[[[[[[[[[[[[$dBp6Z.qt5DOG3HcfXKIWCslDlNgvcM0AYfFKYdYlCUgqAh2/8Lc19yiAdVuWVj4avJtOVREeA2UHRZuiiUcFY1\"},\n  {\"$6$\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\", \"*0\"},\n  {\"$6$]]]]]]]]]]]]]]]]\", \"$6$]]]]]]]]]]]]]]]]$Yvco5E.ZnJk70S1mBe7.ul9Qv93ZP3gtTk8qcYnKiWE9u8RGn2R5i3oBx/Dz0asccDNuYITN.RFBsKQeMYTQd1\"},\n  {\"$6$^^^^^^^^^^^^^^^^\", \"$6$^^^^^^^^^^^^^^^^$nBQ4e7tRXokFDZNuFZUW0wO/kMWIFh6wZlBT4m/jNEu02G9SWFfb9q65H5tB81H9sGR0rzSXvqWvauO8GoL8S1\"},\n  {\"$6$________________\", \"$6$________________$RCncF7GLNSTeiXTvScoU855UNcTWc0WCEeEql.uwz6aaIiPmPCBBmp.c8HJglimBDKvv7cJJpfhjiJnKOhKNi1\"},\n  {\"$6$````````````````\", \"$6$````````````````$O0EzXiLYXQcd7rZauStyori1GHiAiGV.mkDQAYRPJMYvJiYnhYHtfoxMb2kkHk4DfCi9/vARhWYLMSQxQUY8X/\"},\n  {\"$6$aaaaaaaaaaaaaaaa\", \"$6$aaaaaaaaaaaaaaaa$HvV5Pg0tE0/7mpvSbO0FUm.4xHi7r3JYligZBiGOmm926kVVg8VBJ4QgSrWVwXtqYpvBoJhtIe/HMB5wHQlTQ.\"},\n  {\"$6$bbbbbbbbbbbbbbbb\", \"$6$bbbbbbbbbbbbbbbb$GWA7ESqunT3P9cz8HyZWeTWcIh3DJT62eTczPylgaEEanRIOw5VvAgIj5dzsx9OQv/xL7jdxdXS7pH5nCHR0n1\"},\n  {\"$6$cccccccccccccccc\", \"$6$cccccccccccccccc$1bZ8Z0n.1.fkTrGehCgnOw/QjuB9qist8yDhuqiKPaHTxa9iVk.1etQ0g3zNuiO8..T1wAfPuD5fy8kFAyoxC.\"},\n  {\"$6$dddddddddddddddd\", \"$6$dddddddddddddddd$4CHU4zgyc9iJdxLyXzCY8XzMzbvz23rD5vwRc4LOtVDjDgxavqkxgYDS71IFumL/qCK13.d9l/MgdUPnE29EW.\"},\n  {\"$6$eeeeeeeeeeeeeeee\", \"$6$eeeeeeeeeeeeeeee$sYcbpxDWs3TQhFudTzHlEzyoB07oZi1kcGnLJnCHU6OpxGinRAUjUVzVyTDWs9ZKTbCfeW9YXuSz87GGF6pAp/\"},\n  {\"$6$ffffffffffffffff\", \"$6$ffffffffffffffff$MHt4IeZsFoNZXaibWBtHb/IQVUFoQ8GjayC3uQM0FWpGmtpRdnYcxa3mZJW8QGjOHhmYrG9zHca1/gxZBhmiA/\"},\n  {\"$6$gggggggggggggggg\", \"$6$gggggggggggggggg$RvFpqAiZYpgEYKrqgB8TRcUm.HHf2no5IM26azGTIleRbZeCsZBhdiFhNYmTpjjmWZajmrePTCm/utW2dsQh3.\"},\n  {\"$6$hhhhhhhhhhhhhhhh\", \"$6$hhhhhhhhhhhhhhhh$LawQ9KCZkYaXmXGT1UcEsmOq/kx9WQx0MejadhNKj0seppOAoI1LNE5oBEdPOMOdFL6mahHIDsg3UyfuHuXF00\"},\n  {\"$6$iiiiiiiiiiiiiiii\", \"$6$iiiiiiiiiiiiiiii$4ek2WaF1vMFgGI2IKd7aMrZN15iA3fNvLf94D/PF5S56Inv5TepuFG//ufoCFfRx6JMJ4ei5kbzgLNX7H4yq61\"},\n  {\"$6$jjjjjjjjjjjjjjjj\", \"$6$jjjjjjjjjjjjjjjj$nyXrZM4DruCulpp.78f3BFjWA7W7fEuyqUrnFqeLdtEZeoIBnqULrw./8V0QT/QFiVf2XvGts9w042798vbsf1\"},\n  {\"$6$kkkkkkkkkkkkkkkk\", \"$6$kkkkkkkkkkkkkkkk$B9elLzYl/KnzeKIQ4o.TtuQlPClwm64NT4O4Rf3..lo/mnDRQFGFEnVGPE5h16vUBrhnNZzMX7qyAE6BAfsbD1\"},\n  {\"$6$llllllllllllllll\", \"$6$llllllllllllllll$4IoCGvQh3HA9EwqOHf4EhtpMLmvtiiu.NT0QGkiQPRlde8CeofwSNUjihD3e9kEwFKpdZKgyhYmIOZL5YuPkL.\"},\n  {\"$6$mmmmmmmmmmmmmmmm\", \"$6$mmmmmmmmmmmmmmmm$g2lab03qXNQrYZQglcjAgWmEbDw48yalW0YbmYF/ik77kxTQ5b.XUtHNZu5eWs9QBjv2u3epXAmDs.Nk1lKO0.\"},\n  {\"$6$nnnnnnnnnnnnnnnn\", \"$6$nnnnnnnnnnnnnnnn$hLDWmZssa25zOQAnoxETmCKtrsqxXw0sT01L1LGpn91WLqAyBJjNcN.Fol.uBcYvkUc.TPM4VjgYlsToykzwR0\"},\n  {\"$6$oooooooooooooooo\", \"$6$oooooooooooooooo$HzxnSVJUvuc50Uy6PoZVQmVtgE/CZJ36mN8czr9lRUh3q.YCBNP0VPfc3DlmwGRavViNjELpYkqdjky6jZpsf/\"},\n  {\"$6$pppppppppppppppp\", \"$6$pppppppppppppppp$/XQduHAyM3gF2BJIucWGPeL3uMguiuAoCoFk/r8yPhj/bdXF8oSzpto7dI/ToVrSWQSpq8Gbcq9TMpYMk2bcV1\"},\n  {\"$6$qqqqqqqqqqqqqqqq\", \"$6$qqqqqqqqqqqqqqqq$Zf32Lr4ZWTzklzMD2URBKXarGQjqfPulqUCSJ/FNgCx/AFoLixjSxxGr/F54agkatM.yxN2b6r.4VaOgJzLp/.\"},\n  {\"$6$rrrrrrrrrrrrrrrr\", \"$6$rrrrrrrrrrrrrrrr$55E7q5YLvBVJ640e.dBckt2Yr010n3CSCNhErgsDtRUcxCQe5WPr/VvXHHadZzRBaA5Arx4QtCIqQAhfiouaL.\"},\n  {\"$6$ssssssssssssssss\", \"$6$ssssssssssssssss$mMOS7/bpCnU6q66dgucBA76GD5U76iQ1eH5Auqrp/o59TLK7vJToUY8syxe18ZCyEKXCB88LbldEgx316cD1I0\"},\n  {\"$6$tttttttttttttttt\", \"$6$tttttttttttttttt$N1PIDJt9hUMyr1NlBAVBgP5S3xe6woFUik83Fo.LcQOgPQ0/fwH85zzpSrxPrGNmeO4XDw/mYx.QBskwA5qO21\"},\n  {\"$6$uuuuuuuuuuuuuuuu\", \"$6$uuuuuuuuuuuuuuuu$UIy5pdkRqtXwwJHs07VSpdzJVB.JYuET/iDa6PECFUVyEYGEXyuuUse6umRKZOS54fXg78BTJxsPhMcjjkEzY.\"},\n  {\"$6$vvvvvvvvvvvvvvvv\", \"$6$vvvvvvvvvvvvvvvv$AYvRqfz59J233HXW71U4eEZv.HRAP9m5lALriFsY7hJg377G7Z2nu/7dQBGJZe76tM.yg89Ig4t1SGj/iTc/T/\"},\n  {\"$6$wwwwwwwwwwwwwwww\", \"$6$wwwwwwwwwwwwwwww$VmS/m9M8S.v3sqmnHxtPzD4RjA6F/1qsU/GJQMelFVl1ItdKtSsgRsYyF3bUO9lOfX4XJK.avj/m2Ybnbd/.Z/\"},\n  {\"$6$xxxxxxxxxxxxxxxx\", \"$6$xxxxxxxxxxxxxxxx$rBzF2pkrsh09n25F26pG3waeIV758datdZonnyi5CsFksOl4Y0fcNf34LGpVPj0s.kEZ04O.JPRdJdeiRo94I1\"},\n  {\"$6$yyyyyyyyyyyyyyyy\", \"$6$yyyyyyyyyyyyyyyy$PDltzKb/ZJrjCZXYrUZ0YRzITKKkJdNOD7QUFrKsdUNjv6TWhKjb97HlN8Ia4BP4EDsHxkDaP2CGtd0k0TEGP.\"},\n  {\"$6$zzzzzzzzzzzzzzzz\", \"$6$zzzzzzzzzzzzzzzz$mRVbjzrCc9gglrQuHL2CLkt0jBd6IxGIHzGmdrufY1DS4L/KmixXJ1a0jagCWr6JbO0W2HbYzduVRBXvmbDz4/\"},\n  {\"$6${{{{{{{{{{{{{{{{\", \"$6${{{{{{{{{{{{{{{{$wEw3hFJgTIwMkapwV81fJNoVx9iKzgR.ivUROgb8o/KMcMUP8JZvBFyfo1t6xFG7enHMwOKHVvYnhki/nKeHD.\"},\n  {\"$6$||||||||||||||||\", \"$6$||||||||||||||||$4JldrmpooVZmxae9lZKlE6PDLwMGIjvtUWp45S6Phl72H5YPfD7Uk/nND.Ksnesf6VPq/9W10Il2nmZ3WLit41\"},\n  {\"$6$}}}}}}}}}}}}}}}}\", \"$6$}}}}}}}}}}}}}}}}$WE9yMayOYHdYipzj6cUqFAkoFLLQvK3eGdN.NUAiWVTfriv7aIG5D0MedHs89iiWl766S9UptxUbZubRetaXB/\"},\n  {\"$6$~~~~~~~~~~~~~~~~\", \"$6$~~~~~~~~~~~~~~~~$cZRB//NhFoC73bB.bJn/djYKqtFn9r7VBtrdEeGbLS8082wZlOpUilIJAfOkNFk.LPQEAKsZ4hcrKzZdSp9vN0\"},\n  {\"$6$\\x7f\\x7f\\x7f\\x7f\\x7f\\x7f\\x7f\\x7f\\x7f\\x7f\\x7f\\x7f\\x7f\\x7f\\x7f\\x7f\", \"*0\"},\n  {\"$6$\\x80\\x80\\x80\\x80\\x80\\x80\\x80\\x80\\x80\\x80\\x80\\x80\\x80\\x80\\x80\\x80\", \"*0\"},\n  {\"$6$\\x81\\x81\\x81\\x81\\x81\\x81\\x81\\x81\\x81\\x81\\x81\\x81\\x81\\x81\\x81\\x81\", \"*0\"},\n  {\"$6$\\x82\\x82\\x82\\x82\\x82\\x82\\x82\\x82\\x82\\x82\\x82\\x82\\x82\\x82\\x82\\x82\", \"*0\"},\n  {\"$6$\\x83\\x83\\x83\\x83\\x83\\x83\\x83\\x83\\x83\\x83\\x83\\x83\\x83\\x83\\x83\\x83\", \"*0\"},\n  {\"$6$\\x84\\x84\\x84\\x84\\x84\\x84\\x84\\x84\\x84\\x84\\x84\\x84\\x84\\x84\\x84\\x84\", \"*0\"},\n  {\"$6$\\x85\\x85\\x85\\x85\\x85\\x85\\x85\\x85\\x85\\x85\\x85\\x85\\x85\\x85\\x85\\x85\", \"*0\"},\n  {\"$6$\\x86\\x86\\x86\\x86\\x86\\x86\\x86\\x86\\x86\\x86\\x86\\x86\\x86\\x86\\x86\\x86\", \"*0\"},\n  {\"$6$\\x87\\x87\\x87\\x87\\x87\\x87\\x87\\x87\\x87\\x87\\x87\\x87\\x87\\x87\\x87\\x87\", \"*0\"},\n  {\"$6$\\x88\\x88\\x88\\x88\\x88\\x88\\x88\\x88\\x88\\x88\\x88\\x88\\x88\\x88\\x88\\x88\", \"*0\"},\n  {\"$6$\\x89\\x89\\x89\\x89\\x89\\x89\\x89\\x89\\x89\\x89\\x89\\x89\\x89\\x89\\x89\\x89\", \"*0\"},\n  {\"$6$\\x8a\\x8a\\x8a\\x8a\\x8a\\x8a\\x8a\\x8a\\x8a\\x8a\\x8a\\x8a\\x8a\\x8a\\x8a\\x8a\", \"*0\"},\n  {\"$6$\\x8b\\x8b\\x8b\\x8b\\x8b\\x8b\\x8b\\x8b\\x8b\\x8b\\x8b\\x8b\\x8b\\x8b\\x8b\\x8b\", \"*0\"},\n  {\"$6$\\x8c\\x8c\\x8c\\x8c\\x8c\\x8c\\x8c\\x8c\\x8c\\x8c\\x8c\\x8c\\x8c\\x8c\\x8c\\x8c\", \"*0\"},\n  {\"$6$\\x8d\\x8d\\x8d\\x8d\\x8d\\x8d\\x8d\\x8d\\x8d\\x8d\\x8d\\x8d\\x8d\\x8d\\x8d\\x8d\", \"*0\"},\n  {\"$6$\\x8e\\x8e\\x8e\\x8e\\x8e\\x8e\\x8e\\x8e\\x8e\\x8e\\x8e\\x8e\\x8e\\x8e\\x8e\\x8e\", \"*0\"},\n  {\"$6$\\x8f\\x8f\\x8f\\x8f\\x8f\\x8f\\x8f\\x8f\\x8f\\x8f\\x8f\\x8f\\x8f\\x8f\\x8f\\x8f\", \"*0\"},\n  {\"$6$\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\", \"*0\"},\n  {\"$6$\\x91\\x91\\x91\\x91\\x91\\x91\\x91\\x91\\x91\\x91\\x91\\x91\\x91\\x91\\x91\\x91\", \"*0\"},\n  {\"$6$\\x92\\x92\\x92\\x92\\x92\\x92\\x92\\x92\\x92\\x92\\x92\\x92\\x92\\x92\\x92\\x92\", \"*0\"},\n  {\"$6$\\x93\\x93\\x93\\x93\\x93\\x93\\x93\\x93\\x93\\x93\\x93\\x93\\x93\\x93\\x93\\x93\", \"*0\"},\n  {\"$6$\\x94\\x94\\x94\\x94\\x94\\x94\\x94\\x94\\x94\\x94\\x94\\x94\\x94\\x94\\x94\\x94\", \"*0\"},\n  {\"$6$\\x95\\x95\\x95\\x95\\x95\\x95\\x95\\x95\\x95\\x95\\x95\\x95\\x95\\x95\\x95\\x95\", \"*0\"},\n  {\"$6$\\x96\\x96\\x96\\x96\\x96\\x96\\x96\\x96\\x96\\x96\\x96\\x96\\x96\\x96\\x96\\x96\", \"*0\"},\n  {\"$6$\\x97\\x97\\x97\\x97\\x97\\x97\\x97\\x97\\x97\\x97\\x97\\x97\\x97\\x97\\x97\\x97\", \"*0\"},\n  {\"$6$\\x98\\x98\\x98\\x98\\x98\\x98\\x98\\x98\\x98\\x98\\x98\\x98\\x98\\x98\\x98\\x98\", \"*0\"},\n  {\"$6$\\x99\\x99\\x99\\x99\\x99\\x99\\x99\\x99\\x99\\x99\\x99\\x99\\x99\\x99\\x99\\x99\", \"*0\"},\n  {\"$6$\\x9a\\x9a\\x9a\\x9a\\x9a\\x9a\\x9a\\x9a\\x9a\\x9a\\x9a\\x9a\\x9a\\x9a\\x9a\\x9a\", \"*0\"},\n  {\"$6$\\x9b\\x9b\\x9b\\x9b\\x9b\\x9b\\x9b\\x9b\\x9b\\x9b\\x9b\\x9b\\x9b\\x9b\\x9b\\x9b\", \"*0\"},\n  {\"$6$\\x9c\\x9c\\x9c\\x9c\\x9c\\x9c\\x9c\\x9c\\x9c\\x9c\\x9c\\x9c\\x9c\\x9c\\x9c\\x9c\", \"*0\"},\n  {\"$6$\\x9d\\x9d\\x9d\\x9d\\x9d\\x9d\\x9d\\x9d\\x9d\\x9d\\x9d\\x9d\\x9d\\x9d\\x9d\\x9d\", \"*0\"},\n  {\"$6$\\x9e\\x9e\\x9e\\x9e\\x9e\\x9e\\x9e\\x9e\\x9e\\x9e\\x9e\\x9e\\x9e\\x9e\\x9e\\x9e\", \"*0\"},\n  {\"$6$\\x9f\\x9f\\x9f\\x9f\\x9f\\x9f\\x9f\\x9f\\x9f\\x9f\\x9f\\x9f\\x9f\\x9f\\x9f\\x9f\", \"*0\"},\n  {\"$6$\\xa0\\xa0\\xa0\\xa0\\xa0\\xa0\\xa0\\xa0\\xa0\\xa0\\xa0\\xa0\\xa0\\xa0\\xa0\\xa0\", \"*0\"},\n  {\"$6$\\xa1\\xa1\\xa1\\xa1\\xa1\\xa1\\xa1\\xa1\\xa1\\xa1\\xa1\\xa1\\xa1\\xa1\\xa1\\xa1\", \"*0\"},\n  {\"$6$\\xa2\\xa2\\xa2\\xa2\\xa2\\xa2\\xa2\\xa2\\xa2\\xa2\\xa2\\xa2\\xa2\\xa2\\xa2\\xa2\", \"*0\"},\n  {\"$6$\\xa3\\xa3\\xa3\\xa3\\xa3\\xa3\\xa3\\xa3\\xa3\\xa3\\xa3\\xa3\\xa3\\xa3\\xa3\\xa3\", \"*0\"},\n  {\"$6$\\xa4\\xa4\\xa4\\xa4\\xa4\\xa4\\xa4\\xa4\\xa4\\xa4\\xa4\\xa4\\xa4\\xa4\\xa4\\xa4\", \"*0\"},\n  {\"$6$\\xa5\\xa5\\xa5\\xa5\\xa5\\xa5\\xa5\\xa5\\xa5\\xa5\\xa5\\xa5\\xa5\\xa5\\xa5\\xa5\", \"*0\"},\n  {\"$6$\\xa6\\xa6\\xa6\\xa6\\xa6\\xa6\\xa6\\xa6\\xa6\\xa6\\xa6\\xa6\\xa6\\xa6\\xa6\\xa6\", \"*0\"},\n  {\"$6$\\xa7\\xa7\\xa7\\xa7\\xa7\\xa7\\xa7\\xa7\\xa7\\xa7\\xa7\\xa7\\xa7\\xa7\\xa7\\xa7\", \"*0\"},\n  {\"$6$\\xa8\\xa8\\xa8\\xa8\\xa8\\xa8\\xa8\\xa8\\xa8\\xa8\\xa8\\xa8\\xa8\\xa8\\xa8\\xa8\", \"*0\"},\n  {\"$6$\\xa9\\xa9\\xa9\\xa9\\xa9\\xa9\\xa9\\xa9\\xa9\\xa9\\xa9\\xa9\\xa9\\xa9\\xa9\\xa9\", \"*0\"},\n  {\"$6$\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\", \"*0\"},\n  {\"$6$\\xab\\xab\\xab\\xab\\xab\\xab\\xab\\xab\\xab\\xab\\xab\\xab\\xab\\xab\\xab\\xab\", \"*0\"},\n  {\"$6$\\xac\\xac\\xac\\xac\\xac\\xac\\xac\\xac\\xac\\xac\\xac\\xac\\xac\\xac\\xac\\xac\", \"*0\"},\n  {\"$6$\\xad\\xad\\xad\\xad\\xad\\xad\\xad\\xad\\xad\\xad\\xad\\xad\\xad\\xad\\xad\\xad\", \"*0\"},\n  {\"$6$\\xae\\xae\\xae\\xae\\xae\\xae\\xae\\xae\\xae\\xae\\xae\\xae\\xae\\xae\\xae\\xae\", \"*0\"},\n  {\"$6$\\xaf\\xaf\\xaf\\xaf\\xaf\\xaf\\xaf\\xaf\\xaf\\xaf\\xaf\\xaf\\xaf\\xaf\\xaf\\xaf\", \"*0\"},\n  {\"$6$\\xb0\\xb0\\xb0\\xb0\\xb0\\xb0\\xb0\\xb0\\xb0\\xb0\\xb0\\xb0\\xb0\\xb0\\xb0\\xb0\", \"*0\"},\n  {\"$6$\\xb1\\xb1\\xb1\\xb1\\xb1\\xb1\\xb1\\xb1\\xb1\\xb1\\xb1\\xb1\\xb1\\xb1\\xb1\\xb1\", \"*0\"},\n  {\"$6$\\xb2\\xb2\\xb2\\xb2\\xb2\\xb2\\xb2\\xb2\\xb2\\xb2\\xb2\\xb2\\xb2\\xb2\\xb2\\xb2\", \"*0\"},\n  {\"$6$\\xb3\\xb3\\xb3\\xb3\\xb3\\xb3\\xb3\\xb3\\xb3\\xb3\\xb3\\xb3\\xb3\\xb3\\xb3\\xb3\", \"*0\"},\n  {\"$6$\\xb4\\xb4\\xb4\\xb4\\xb4\\xb4\\xb4\\xb4\\xb4\\xb4\\xb4\\xb4\\xb4\\xb4\\xb4\\xb4\", \"*0\"},\n  {\"$6$\\xb5\\xb5\\xb5\\xb5\\xb5\\xb5\\xb5\\xb5\\xb5\\xb5\\xb5\\xb5\\xb5\\xb5\\xb5\\xb5\", \"*0\"},\n  {\"$6$\\xb6\\xb6\\xb6\\xb6\\xb6\\xb6\\xb6\\xb6\\xb6\\xb6\\xb6\\xb6\\xb6\\xb6\\xb6\\xb6\", \"*0\"},\n  {\"$6$\\xb7\\xb7\\xb7\\xb7\\xb7\\xb7\\xb7\\xb7\\xb7\\xb7\\xb7\\xb7\\xb7\\xb7\\xb7\\xb7\", \"*0\"},\n  {\"$6$\\xb8\\xb8\\xb8\\xb8\\xb8\\xb8\\xb8\\xb8\\xb8\\xb8\\xb8\\xb8\\xb8\\xb8\\xb8\\xb8\", \"*0\"},\n  {\"$6$\\xb9\\xb9\\xb9\\xb9\\xb9\\xb9\\xb9\\xb9\\xb9\\xb9\\xb9\\xb9\\xb9\\xb9\\xb9\\xb9\", \"*0\"},\n  {\"$6$\\xba\\xba\\xba\\xba\\xba\\xba\\xba\\xba\\xba\\xba\\xba\\xba\\xba\\xba\\xba\\xba\", \"*0\"},\n  {\"$6$\\xbb\\xbb\\xbb\\xbb\\xbb\\xbb\\xbb\\xbb\\xbb\\xbb\\xbb\\xbb\\xbb\\xbb\\xbb\\xbb\", \"*0\"},\n  {\"$6$\\xbc\\xbc\\xbc\\xbc\\xbc\\xbc\\xbc\\xbc\\xbc\\xbc\\xbc\\xbc\\xbc\\xbc\\xbc\\xbc\", \"*0\"},\n  {\"$6$\\xbd\\xbd\\xbd\\xbd\\xbd\\xbd\\xbd\\xbd\\xbd\\xbd\\xbd\\xbd\\xbd\\xbd\\xbd\\xbd\", \"*0\"},\n  {\"$6$\\xbe\\xbe\\xbe\\xbe\\xbe\\xbe\\xbe\\xbe\\xbe\\xbe\\xbe\\xbe\\xbe\\xbe\\xbe\\xbe\", \"*0\"},\n  {\"$6$\\xbf\\xbf\\xbf\\xbf\\xbf\\xbf\\xbf\\xbf\\xbf\\xbf\\xbf\\xbf\\xbf\\xbf\\xbf\\xbf\", \"*0\"},\n  {\"$6$\\xc0\\xc0\\xc0\\xc0\\xc0\\xc0\\xc0\\xc0\\xc0\\xc0\\xc0\\xc0\\xc0\\xc0\\xc0\\xc0\", \"*0\"},\n  {\"$6$\\xc1\\xc1\\xc1\\xc1\\xc1\\xc1\\xc1\\xc1\\xc1\\xc1\\xc1\\xc1\\xc1\\xc1\\xc1\\xc1\", \"*0\"},\n  {\"$6$\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\", \"*0\"},\n  {\"$6$\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\", \"*0\"},\n  {\"$6$\\xc4\\xc4\\xc4\\xc4\\xc4\\xc4\\xc4\\xc4\\xc4\\xc4\\xc4\\xc4\\xc4\\xc4\\xc4\\xc4\", \"*0\"},\n  {\"$6$\\xc5\\xc5\\xc5\\xc5\\xc5\\xc5\\xc5\\xc5\\xc5\\xc5\\xc5\\xc5\\xc5\\xc5\\xc5\\xc5\", \"*0\"},\n  {\"$6$\\xc6\\xc6\\xc6\\xc6\\xc6\\xc6\\xc6\\xc6\\xc6\\xc6\\xc6\\xc6\\xc6\\xc6\\xc6\\xc6\", \"*0\"},\n  {\"$6$\\xc7\\xc7\\xc7\\xc7\\xc7\\xc7\\xc7\\xc7\\xc7\\xc7\\xc7\\xc7\\xc7\\xc7\\xc7\\xc7\", \"*0\"},\n  {\"$6$\\xc8\\xc8\\xc8\\xc8\\xc8\\xc8\\xc8\\xc8\\xc8\\xc8\\xc8\\xc8\\xc8\\xc8\\xc8\\xc8\", \"*0\"},\n  {\"$6$\\xc9\\xc9\\xc9\\xc9\\xc9\\xc9\\xc9\\xc9\\xc9\\xc9\\xc9\\xc9\\xc9\\xc9\\xc9\\xc9\", \"*0\"},\n  {\"$6$\\xca\\xca\\xca\\xca\\xca\\xca\\xca\\xca\\xca\\xca\\xca\\xca\\xca\\xca\\xca\\xca\", \"*0\"},\n  {\"$6$\\xcb\\xcb\\xcb\\xcb\\xcb\\xcb\\xcb\\xcb\\xcb\\xcb\\xcb\\xcb\\xcb\\xcb\\xcb\\xcb\", \"*0\"},\n  {\"$6$\\xcc\\xcc\\xcc\\xcc\\xcc\\xcc\\xcc\\xcc\\xcc\\xcc\\xcc\\xcc\\xcc\\xcc\\xcc\\xcc\", \"*0\"},\n  {\"$6$\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\", \"*0\"},\n  {\"$6$\\xce\\xce\\xce\\xce\\xce\\xce\\xce\\xce\\xce\\xce\\xce\\xce\\xce\\xce\\xce\\xce\", \"*0\"},\n  {\"$6$\\xcf\\xcf\\xcf\\xcf\\xcf\\xcf\\xcf\\xcf\\xcf\\xcf\\xcf\\xcf\\xcf\\xcf\\xcf\\xcf\", \"*0\"},\n  {\"$6$\\xd0\\xd0\\xd0\\xd0\\xd0\\xd0\\xd0\\xd0\\xd0\\xd0\\xd0\\xd0\\xd0\\xd0\\xd0\\xd0\", \"*0\"},\n  {\"$6$\\xd1\\xd1\\xd1\\xd1\\xd1\\xd1\\xd1\\xd1\\xd1\\xd1\\xd1\\xd1\\xd1\\xd1\\xd1\\xd1\", \"*0\"},\n  {\"$6$\\xd2\\xd2\\xd2\\xd2\\xd2\\xd2\\xd2\\xd2\\xd2\\xd2\\xd2\\xd2\\xd2\\xd2\\xd2\\xd2\", \"*0\"},\n  {\"$6$\\xd3\\xd3\\xd3\\xd3\\xd3\\xd3\\xd3\\xd3\\xd3\\xd3\\xd3\\xd3\\xd3\\xd3\\xd3\\xd3\", \"*0\"},\n  {\"$6$\\xd4\\xd4\\xd4\\xd4\\xd4\\xd4\\xd4\\xd4\\xd4\\xd4\\xd4\\xd4\\xd4\\xd4\\xd4\\xd4\", \"*0\"},\n  {\"$6$\\xd5\\xd5\\xd5\\xd5\\xd5\\xd5\\xd5\\xd5\\xd5\\xd5\\xd5\\xd5\\xd5\\xd5\\xd5\\xd5\", \"*0\"},\n  {\"$6$\\xd6\\xd6\\xd6\\xd6\\xd6\\xd6\\xd6\\xd6\\xd6\\xd6\\xd6\\xd6\\xd6\\xd6\\xd6\\xd6\", \"*0\"},\n  {\"$6$\\xd7\\xd7\\xd7\\xd7\\xd7\\xd7\\xd7\\xd7\\xd7\\xd7\\xd7\\xd7\\xd7\\xd7\\xd7\\xd7\", \"*0\"},\n  {\"$6$\\xd8\\xd8\\xd8\\xd8\\xd8\\xd8\\xd8\\xd8\\xd8\\xd8\\xd8\\xd8\\xd8\\xd8\\xd8\\xd8\", \"*0\"},\n  {\"$6$\\xd9\\xd9\\xd9\\xd9\\xd9\\xd9\\xd9\\xd9\\xd9\\xd9\\xd9\\xd9\\xd9\\xd9\\xd9\\xd9\", \"*0\"},\n  {\"$6$\\xda\\xda\\xda\\xda\\xda\\xda\\xda\\xda\\xda\\xda\\xda\\xda\\xda\\xda\\xda\\xda\", \"*0\"},\n  {\"$6$\\xdb\\xdb\\xdb\\xdb\\xdb\\xdb\\xdb\\xdb\\xdb\\xdb\\xdb\\xdb\\xdb\\xdb\\xdb\\xdb\", \"*0\"},\n  {\"$6$\\xdc\\xdc\\xdc\\xdc\\xdc\\xdc\\xdc\\xdc\\xdc\\xdc\\xdc\\xdc\\xdc\\xdc\\xdc\\xdc\", \"*0\"},\n  {\"$6$\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\", \"*0\"},\n  {\"$6$\\xde\\xde\\xde\\xde\\xde\\xde\\xde\\xde\\xde\\xde\\xde\\xde\\xde\\xde\\xde\\xde\", \"*0\"},\n  {\"$6$\\xdf\\xdf\\xdf\\xdf\\xdf\\xdf\\xdf\\xdf\\xdf\\xdf\\xdf\\xdf\\xdf\\xdf\\xdf\\xdf\", \"*0\"},\n  {\"$6$\\xe0\\xe0\\xe0\\xe0\\xe0\\xe0\\xe0\\xe0\\xe0\\xe0\\xe0\\xe0\\xe0\\xe0\\xe0\\xe0\", \"*0\"},\n  {\"$6$\\xe1\\xe1\\xe1\\xe1\\xe1\\xe1\\xe1\\xe1\\xe1\\xe1\\xe1\\xe1\\xe1\\xe1\\xe1\\xe1\", \"*0\"},\n  {\"$6$\\xe2\\xe2\\xe2\\xe2\\xe2\\xe2\\xe2\\xe2\\xe2\\xe2\\xe2\\xe2\\xe2\\xe2\\xe2\\xe2\", \"*0\"},\n  {\"$6$\\xe3\\xe3\\xe3\\xe3\\xe3\\xe3\\xe3\\xe3\\xe3\\xe3\\xe3\\xe3\\xe3\\xe3\\xe3\\xe3\", \"*0\"},\n  {\"$6$\\xe4\\xe4\\xe4\\xe4\\xe4\\xe4\\xe4\\xe4\\xe4\\xe4\\xe4\\xe4\\xe4\\xe4\\xe4\\xe4\", \"*0\"},\n  {\"$6$\\xe5\\xe5\\xe5\\xe5\\xe5\\xe5\\xe5\\xe5\\xe5\\xe5\\xe5\\xe5\\xe5\\xe5\\xe5\\xe5\", \"*0\"},\n  {\"$6$\\xe6\\xe6\\xe6\\xe6\\xe6\\xe6\\xe6\\xe6\\xe6\\xe6\\xe6\\xe6\\xe6\\xe6\\xe6\\xe6\", \"*0\"},\n  {\"$6$\\xe7\\xe7\\xe7\\xe7\\xe7\\xe7\\xe7\\xe7\\xe7\\xe7\\xe7\\xe7\\xe7\\xe7\\xe7\\xe7\", \"*0\"},\n  {\"$6$\\xe8\\xe8\\xe8\\xe8\\xe8\\xe8\\xe8\\xe8\\xe8\\xe8\\xe8\\xe8\\xe8\\xe8\\xe8\\xe8\", \"*0\"},\n  {\"$6$\\xe9\\xe9\\xe9\\xe9\\xe9\\xe9\\xe9\\xe9\\xe9\\xe9\\xe9\\xe9\\xe9\\xe9\\xe9\\xe9\", \"*0\"},\n  {\"$6$\\xea\\xea\\xea\\xea\\xea\\xea\\xea\\xea\\xea\\xea\\xea\\xea\\xea\\xea\\xea\\xea\", \"*0\"},\n  {\"$6$\\xeb\\xeb\\xeb\\xeb\\xeb\\xeb\\xeb\\xeb\\xeb\\xeb\\xeb\\xeb\\xeb\\xeb\\xeb\\xeb\", \"*0\"},\n  {\"$6$\\xec\\xec\\xec\\xec\\xec\\xec\\xec\\xec\\xec\\xec\\xec\\xec\\xec\\xec\\xec\\xec\", \"*0\"},\n  {\"$6$\\xed\\xed\\xed\\xed\\xed\\xed\\xed\\xed\\xed\\xed\\xed\\xed\\xed\\xed\\xed\\xed\", \"*0\"},\n  {\"$6$\\xee\\xee\\xee\\xee\\xee\\xee\\xee\\xee\\xee\\xee\\xee\\xee\\xee\\xee\\xee\\xee\", \"*0\"},\n  {\"$6$\\xef\\xef\\xef\\xef\\xef\\xef\\xef\\xef\\xef\\xef\\xef\\xef\\xef\\xef\\xef\\xef\", \"*0\"},\n  {\"$6$\\xf0\\xf0\\xf0\\xf0\\xf0\\xf0\\xf0\\xf0\\xf0\\xf0\\xf0\\xf0\\xf0\\xf0\\xf0\\xf0\", \"*0\"},\n  {\"$6$\\xf1\\xf1\\xf1\\xf1\\xf1\\xf1\\xf1\\xf1\\xf1\\xf1\\xf1\\xf1\\xf1\\xf1\\xf1\\xf1\", \"*0\"},\n  {\"$6$\\xf2\\xf2\\xf2\\xf2\\xf2\\xf2\\xf2\\xf2\\xf2\\xf2\\xf2\\xf2\\xf2\\xf2\\xf2\\xf2\", \"*0\"},\n  {\"$6$\\xf3\\xf3\\xf3\\xf3\\xf3\\xf3\\xf3\\xf3\\xf3\\xf3\\xf3\\xf3\\xf3\\xf3\\xf3\\xf3\", \"*0\"},\n  {\"$6$\\xf4\\xf4\\xf4\\xf4\\xf4\\xf4\\xf4\\xf4\\xf4\\xf4\\xf4\\xf4\\xf4\\xf4\\xf4\\xf4\", \"*0\"},\n  {\"$6$\\xf5\\xf5\\xf5\\xf5\\xf5\\xf5\\xf5\\xf5\\xf5\\xf5\\xf5\\xf5\\xf5\\xf5\\xf5\\xf5\", \"*0\"},\n  {\"$6$\\xf6\\xf6\\xf6\\xf6\\xf6\\xf6\\xf6\\xf6\\xf6\\xf6\\xf6\\xf6\\xf6\\xf6\\xf6\\xf6\", \"*0\"},\n  {\"$6$\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\", \"*0\"},\n  {\"$6$\\xf8\\xf8\\xf8\\xf8\\xf8\\xf8\\xf8\\xf8\\xf8\\xf8\\xf8\\xf8\\xf8\\xf8\\xf8\\xf8\", \"*0\"},\n  {\"$6$\\xf9\\xf9\\xf9\\xf9\\xf9\\xf9\\xf9\\xf9\\xf9\\xf9\\xf9\\xf9\\xf9\\xf9\\xf9\\xf9\", \"*0\"},\n  {\"$6$\\xfa\\xfa\\xfa\\xfa\\xfa\\xfa\\xfa\\xfa\\xfa\\xfa\\xfa\\xfa\\xfa\\xfa\\xfa\\xfa\", \"*0\"},\n  {\"$6$\\xfb\\xfb\\xfb\\xfb\\xfb\\xfb\\xfb\\xfb\\xfb\\xfb\\xfb\\xfb\\xfb\\xfb\\xfb\\xfb\", \"*0\"},\n  {\"$6$\\xfc\\xfc\\xfc\\xfc\\xfc\\xfc\\xfc\\xfc\\xfc\\xfc\\xfc\\xfc\\xfc\\xfc\\xfc\\xfc\", \"*0\"},\n  {\"$6$\\xfd\\xfd\\xfd\\xfd\\xfd\\xfd\\xfd\\xfd\\xfd\\xfd\\xfd\\xfd\\xfd\\xfd\\xfd\\xfd\", \"*0\"},\n  {\"$6$\\xfe\\xfe\\xfe\\xfe\\xfe\\xfe\\xfe\\xfe\\xfe\\xfe\\xfe\\xfe\\xfe\\xfe\\xfe\\xfe\", \"*0\"},\n  {\"$6$\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\", \"*0\"},\n#endif\n};\n\n\nstatic void\nfprint_not_printable_as_hex (FILE *stream, const char *string,\n                             bool with_cstring_escape)\n{\n  for (size_t i = 0; string[i] != '\\0'; ++i)\n    {\n      if (with_cstring_escape)\n        {\n          /* The backslash '\\' is screen-printable,\n             but needs blackslash '\\' escape for c strings. */\n          if (string[i] == '\\\\')\n            {\n              fputs (\"\\\\\\\\\", stream);\n              continue;\n            }\n\n          /* The quotation mark '\"' is screen-printable,\n             but needs blackslash '\\' escape for c strings. */\n          if (string[i] == '\"')\n            {\n              fputs (\"\\\\\\\"\", stream);\n              continue;\n            }\n        }\n\n      /* The character is uncoditionally screen-printable.  */\n      if (string[i] >= ' ' && string[i] <= '~')\n        {\n          fputc (string[i], stream);\n          continue;\n        }\n\n      /* The character is NOT screen-printable,\n         and needs conversion to hex notation.  */\n      fprintf (stream, \"\\\\x%02x\", (unsigned char) string[i]);\n    }\n}\n\nint\nmain (void)\n{\n  bool ok = true;\n  const char *phrase = \"foobarbaz\";\n  struct crypt_data cd;\n\n  for (size_t i = 0; i < ARRAY_SIZE (testcases); ++i)\n    {\n      crypt_r (phrase, testcases[i].setting, &cd);\n\n#if 0 /* Print the test array to stdout.  */\n\n      fputs (\"{\\\"\", stdout);\n      fprint_not_printable_as_hex (stdout, testcases[i].setting, true);\n      fputs (\"\\\", \\\"\", stdout);\n      fprint_not_printable_as_hex (stdout, cd.output, true);\n      fputs (\"\\\"},\\n\", stdout);\n      ok = false; /* Ensure this always returns an error on exit.  */\n\n#else /* Operate in real test mode.  */\n\n      if (strcmp (cd.output, testcases[i].expected) != 0)\n        {\n          fputs (\"FAIL:     \", stderr);\n          fprint_not_printable_as_hex (stderr, testcases[i].setting, false);\n          fputs (\"\\nexpected: \", stderr);\n          fprint_not_printable_as_hex (stderr, testcases[i].expected, false);\n          fputs (\"\\ngot:      \", stderr);\n          fprint_not_printable_as_hex (stderr, cd.output, false);\n          fputs (\"\\n\\n\", stderr);\n          ok = false;\n        }\n\n#endif\n    }\n\n  fprintf (stdout, \"%s\\n\", ok ? \"PASS\" : \"FAIL\");\n  return ok ? 0 : 1;\n}\n\n#else\n\nint\nmain (void)\n{\n  return 77; /* UNSUPPORTED */\n}\n\n#endif\n"
  },
  {
    "path": "test/symbols-compat.pl",
    "content": "#! /usr/bin/perl\n# Written by Zack Weinberg <zackw at panix.com> in 2017 and 2020.\n# To the extent possible under law, Zack Weinberg has waived all\n# copyright and related or neighboring rights to this work.\n#\n# See https://creativecommons.org/publicdomain/zero/1.0/ for further\n# details.\n\n# This test is only run if we are building a shared library intended\n# to be binary backward compatible with GNU libc (libcrypt.so.1).\n# It locates any installed version of libcrypt.so.1, and verifies that\n# each public symbol exposed by that library is also exposed by our\n# libcrypt.so.1 with a matching symbol version.\n#\n# Due to limitations in Automake, this program takes parameters from\n# the environment:\n# $lib_la - full pathname of libcrypt.la\n# $SYMBOL_PREFIX - prefix, if any, added to global symbols defined from C\n# $CC, $NM - names of tools to run (defaults to 'cc' and 'nm' respectively)\n# $CFLAGS, $LDFLAGS - options to pass to $CC when linking (default: empty)\n\nuse v5.14;    # implicit use strict, use feature ':5.14'\nuse warnings FATAL => 'all';\nuse utf8;\nuse open qw(:std :utf8);\nno  if $] >= 5.022, warnings => 'experimental::re_strict';\nuse if $] >= 5.022, re       => 'strict';\n\nuse FindBin ();\nuse lib $FindBin::Bin;\nuse TestCommon qw(\n    compare_symbol_lists\n    ensure_C_locale\n    find_real_library\n    get_symbols\n    popen\n    sh_split\n    skip\n    subprocess_error\n    which\n);\n\n# Some differences between the symbols exported by heritage libcrypt.so.1\n# and our libcrypt.so.1 are expected:\n#\n#  * All of the symbols we define with GLIBC_2.xx version tags are\n#    compatibility symbols (nm prints only one @); naturally,\n#    glibc-provided libcrypt.so.1 defines some of those symbols as\n#    linkable symbols (two @).\n#\n#  * Older versions of libcrypt defined five symbols as linkable,\n#    with the XCRYPT_2.0 version tag, which are now compatibility-only:\n#    crypt_gensalt_r, xcrypt, xcrypt_gensalt, xcrypt_gensalt_r, and\n#    xcrypt_r.\n#\n# This sub is applied to the symbol listing from the system-provided\n# libcrypt.so.1; it edits that listing so that the comparison below\n# succeeds despite any expected differences.\nsub filter_expected_differences {\n    my $symbols = shift;\n    my %filtered;\n    my $formerly_linkable = qr{\n        ^ (?: crypt_gensalt_r\n            | xcrypt(?: _r)?\n            | xcrypt_gensalt(?: _r)?\n          ) @@\n    }x;\n    for my $s (keys %{$symbols}) {\n        $s =~ s/\\b@@(?=GLIBC_)/@/;\n        $s =~ s/\\b@@(?=XCRYPT_2\\.0)/@/ if $s =~ $formerly_linkable;\n        $filtered{$s} = 1;\n    }\n    return \\%filtered;\n}\n\nsub find_system_libcrypt {\n    # Ask the compiler whether a libcrypt.so.1 exists in its search\n    # path.  The compiler option -print-file-name should be supported\n    # on all operating systems where there's an older libcrypt that we\n    # can be backward compatible with.\n    state @CC;\n    if (!@CC) {\n        @CC = which($ENV{CC} || 'cc');\n        skip('C compiler not available') unless @CC;\n    }\n\n    state @CFLAGS;\n    if (!@CFLAGS) {\n        @CFLAGS = sh_split($ENV{CFLAGS} || q{});\n    }\n    state @LDFLAGS;\n    if (!@LDFLAGS) {\n        @LDFLAGS = sh_split($ENV{LDFLAGS} || q{});\n    }\n\n    my $fh =\n        popen('-|', @CC, @CFLAGS, @LDFLAGS, '-print-file-name=libcrypt.so.1');\n    my $path;\n    {\n        local $/ = undef;    # slurp\n        $path = <$fh>;\n    }\n    close $fh or subprocess_error($CC[0]);\n\n    chomp $path;\n    # If we get back either the empty string or the same string we put\n    # in, it means there is no libcrypt.so.1 on this system.\n    if ($path eq q{} || $path eq 'libcrypt.so.1') {\n        skip('no system-provided libcrypt.so.1');\n    }\n    return $path;\n}\n\nsub get_our_symbols {\n    return get_symbols(find_real_library(shift, 'shared'));\n}\n\nsub get_their_symbols {\n    return filter_expected_differences(get_symbols(find_system_libcrypt()));\n}\n\n#\n# Main\n#\nmy $lib_la = $ENV{lib_la} || '/nonexistent';\nif (!-f $lib_la) {\n    print {*STDERR} \"usage: lib_la=/path/to/library.la $0\";\n    exit 1;\n}\n\nensure_C_locale();\nexit compare_symbol_lists(\n    get_our_symbols($lib_la),\n    get_their_symbols(),\n    'symbol versions',\n    1,    # extra symbols are allowed\n);\n"
  },
  {
    "path": "test/symbols-renames.pl",
    "content": "#! /usr/bin/perl\n# Written by Zack Weinberg <zackw at panix.com> in 2017 and 2020.\n# To the extent possible under law, Zack Weinberg has waived all\n# copyright and related or neighboring rights to this work.\n#\n# See https://creativecommons.org/publicdomain/zero/1.0/ for further\n# details.\n\n# Check that all of the symbols renamed by crypt-port.h\n# still appear somewhere in the source code.  This test does not attempt\n# to parse the source code, so it can get false negatives (e.g. a word used\n# in a comment will be enough).\n#\n# Due to limitations in Automake, this program takes parameters from\n# the environment:\n# $lib_la - full pathname of libcrypt.la\n# $SYMBOL_PREFIX - prefix, if any, added to global symbols defined from C\n# $NM, $CPP, $CPPFLAGS - nm utility, C preprocessor, and parameters\n\nuse v5.14;    # implicit use strict, use feature ':5.14'\nuse warnings FATAL => 'all';\nuse utf8;\nuse open qw(:std :utf8);\nno  if $] >= 5.022, warnings => 'experimental::re_strict';\nuse if $] >= 5.022, re       => 'strict';\n\nuse File::Temp ();\n\nuse FindBin ();\nuse lib $FindBin::Bin;\nuse TestCommon qw(\n    compare_symbol_lists\n    ensure_C_locale\n    find_real_library\n    get_symbols\n    popen\n    sh_split\n    skip\n    subprocess_error\n    which\n);\n\nsub list_library_internals {\n    # We are only interested in symbols with the internal prefix,\n    # _crypt_.\n    return get_symbols(find_real_library(shift, 'static'),\n        sub { $_[0] =~ /^_crypt_/ });\n}\n\nsub list_symbol_renames {\n    state @CPP;\n    if (!@CPP) {\n        @CPP = which($ENV{CPP} || 'cc -E');\n        skip('C compiler not available') unless @CPP;\n    }\n    state @CPPFLAGS;\n    if (!@CPPFLAGS) {\n        @CPPFLAGS = sh_split($ENV{CPPFLAGS} || q{});\n    }\n\n    my $tmp = File::Temp->new(\n        DIR      => '.',\n        TEMPLATE => 'symbols-renames-XXXXXX',\n        SUFFIX   => '.c',\n        EXLOCK   => 0,\n    );\n    print {$tmp} qq{#include \"crypt-port.h\"\\n};\n\n    my $fh = popen('-|', @CPP, @CPPFLAGS, '-dD', $tmp->filename);\n    local $_;\n    my %symbols;\n    my $pp_define = qr{\n        ^\\#define \\s+\n            [a-zA-Z_][a-zA-Z0-9_(),]* \\s+\n            (_crypt_[a-zA-Z0-9_]*) \\b\n    }x;\n    while (<$fh>) {\n        chomp;\n        s/\\s+$//;\n        if ($_ =~ $pp_define) {\n            print {*STDERR} \"| $1\\n\";\n            $symbols{$1} = 1;\n        }\n    }\n    close $fh or subprocess_error($CPP[0]);\n    return \\%symbols;\n}\n\n#\n# Main\n#\nmy $lib_la = $ENV{lib_la} || '/nonexistent';\nif (!-f $lib_la) {\n    print {*STDERR} \"usage: lib_la=/path/to/library.la $0\";\n    exit 1;\n}\nif (($ENV{HAVE_CPP_dD} // 'yes') eq 'no') {\n    skip('cpp -dD not available');\n}\n\nensure_C_locale();\nexit compare_symbol_lists(\n    list_library_internals($lib_la),\n    list_symbol_renames(),\n    'renames',\n    0,    # extra symbols not allowed\n);\n"
  },
  {
    "path": "test/symbols-static.pl",
    "content": "#! /usr/bin/perl\n# Written by Zack Weinberg <zackw at panix.com> in 2017 and 2020.\n# To the extent possible under law, Zack Weinberg has waived all\n# copyright and related or neighboring rights to this work.\n#\n# See https://creativecommons.org/publicdomain/zero/1.0/ for further\n# details.\n\n# Test that all global symbols in the static version of the library\n# (libcrypt.a) are either listed as global and supported for new code\n# in libcrypt.map.in, or begin with a _crypt prefix.  Also test that\n# all of the global, supported for new code, symbols mentioned in\n# libcrypt.map.in are in fact defined.\n#\n# Due to limitations in Automake, this program takes parameters from\n# the environment:\n# $lib_la - full pathname of libcrypt.la\n# $lib_map - full pathname of libcrypt.map.in\n# $SYMBOL_PREFIX - prefix, if any, added to global symbols defined from C\n# $NM, $CPP, $CPPFLAGS - nm utility, C preprocessor, and parameters\n\nuse v5.14;    # implicit use strict, use feature ':5.14'\nuse warnings FATAL => 'all';\nuse utf8;\nuse open qw(:std :utf8);\nno  if $] >= 5.022, warnings => 'experimental::re_strict';\nuse if $] >= 5.022, re       => 'strict';\n\nuse FindBin ();\nuse lib $FindBin::Bin;\nuse TestCommon qw(\n    error\n    ensure_C_locale\n    find_real_library\n    get_symbols\n    compare_symbol_lists\n);\n\nmy $symbol_prefix = $ENV{SYMBOL_PREFIX} || q{};\n\nsub list_library_globals {\n    # Symbols that begin with _crypt_ are private to the library.\n    # Symbols that begin with _[_A-Y] are private to the C\n    # implementation.  All other symbols (including any that begin\n    # with _Z, which are C++ mangled names) are part of the library's\n    # public interface.\n    return get_symbols(\n        find_real_library(shift, 'static'),\n        sub { $_[0] !~ /^_(?:[_A-Y]|crypt_)/ },\n    );\n}\n\nsub list_expected_globals {\n    my ($lib_map) = @_;\n    open my $fh, '<', $lib_map\n        or error(\"$lib_map: $!\");\n\n    local $_;\n    my %symbols;\n    while (<$fh>) {\n        chomp;\n        s/\\s+$//;\n        next if /^($|#|%chain\\b)/;\n\n        my @fields = split;\n        $symbols{$fields[0]} = 1 if $fields[1] ne '-';\n    }\n    return \\%symbols;\n}\n\n#\n# Main\n#\nmy $lib_la  = $ENV{lib_la}  || '/nonexistent';\nmy $lib_map = $ENV{lib_map} || '/nonexistent';\nif (!-f $lib_la || !-f $lib_map) {\n    print {*STDERR} \"usage: lib_la=/p/lib.la lib_map=/p/lib.map $0\";\n    exit 1;\n}\n\nensure_C_locale();\nexit compare_symbol_lists(\n    list_library_globals($lib_la),\n    list_expected_globals($lib_map),\n    'globals',\n    0,    # extra symbols not allowed\n);\n"
  }
]