pax_global_header00006660000000000000000000000064151743131620014515gustar00rootroot0000000000000052 comment=485090e7131630b191305316571c06e4ecac3a35 pyenv-pyenv-485090e/000077500000000000000000000000001517431316200142755ustar00rootroot00000000000000pyenv-pyenv-485090e/.agignore000066400000000000000000000000231517431316200160640ustar00rootroot00000000000000./versions ./cache pyenv-pyenv-485090e/.dockerignore000066400000000000000000000000461517431316200167510ustar00rootroot00000000000000.git/ .python-version .vscode/ .idea/ pyenv-pyenv-485090e/.editorconfig000066400000000000000000000003451517431316200167540ustar00rootroot00000000000000# Editor configuration, see https://editorconfig.org root = true [*] end_of_line = lf charset = utf-8 # Makefiles always use tabs for indentation [Makefile] indent_style = tab indent_size = unset # Allow user-defined tab width pyenv-pyenv-485090e/.github/000077500000000000000000000000001517431316200156355ustar00rootroot00000000000000pyenv-pyenv-485090e/.github/CODEOWNERS000066400000000000000000000001021517431316200172210ustar00rootroot00000000000000* @pyenv/pyenv-core-maintainers @pyenv/pyenv-core-committerspyenv-pyenv-485090e/.github/FUNDING.yml000066400000000000000000000013251517431316200174530ustar00rootroot00000000000000# These are supported funding model platforms github: [pyenv] # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] patreon: # Replace with a single Patreon username open_collective: pyenv # Replace with a single Open Collective username ko_fi: # Replace with a single Ko-fi username tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry liberapay: # Replace with a single Liberapay username issuehunt: # Replace with a single IssueHunt username otechie: # Replace with a single Otechie username custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] pyenv-pyenv-485090e/.github/ISSUE_TEMPLATE/000077500000000000000000000000001517431316200200205ustar00rootroot00000000000000pyenv-pyenv-485090e/.github/ISSUE_TEMPLATE/bug_report.md000066400000000000000000000075251517431316200225230ustar00rootroot00000000000000--- name: Bug report about: Create a report to help us improve title: '' labels: '' assignees: '' --- ### Prerequisites * [ ] Make sure your problem is not listed in [the common build problems](https://github.com/pyenv/pyenv/wiki/Common-build-problems). * [ ] Make sure no duplicated issue has already been reported in [the pyenv issues](https://github.com/pyenv/pyenv/issues?q=is%3Aissue). For build errors, a reported issue typically mentions a key error message. This key error message is often not in the 10 last build log lines reported to the console but is rather earlier in the build log -- typically, it's the first error message encountered in the log. * [ ] Make sure you are reporting a problem in Pyenv and not seeking consultation with Pyenv usage. * GitHub issues are intended mainly for Pyenv development purposes. If you are seeking help with Pyenv usage, check [Pyenv documentation](https://github.com/pyenv/pyenv?tab=readme-ov-file#simple-python-version-management-pyenv), go to a user community site like [Gitter](https://gitter.im/yyuu/pyenv), [StackOverflow](https://stackoverflow.com/questions/tagged/pyenv), etc, or to [Discussions](https://github.com/orgs/pyenv/discussions). * [ ] Make sure your problem is not derived from packaging (e.g. [Homebrew](https://brew.sh)). * Please refer to the package documentation for the installation issues, etc. * [ ] Make sure your problem is not derived from plugins. * This repository is maintaining `pyenv` and the default `python-build` plugin only. Please refrain from reporting issues of other plugins here. ### Describe the bug A clear and concise description of what the bug is. Do specify what the expected behaviour is if that's not obvious from the bug's nature. #### Reproduction steps Listing the commands to run in a new console session and their output is usually sufficient. Please use a Markdown code block (three backticks on a line by themselves before and after the text) to denote a console output excerpt. Usually not needed for build errors (since the arguments can already be seen in the debug trace) unless you are using an unusual invocation (e.g. setting environment variables that affect the build). #### Diagnostic details - [ ] Platform information (e.g. Ubuntu Linux 24.04): - [ ] OS architecture (e.g. amd64): - [ ] pyenv version: - [ ] Python version: - [ ] C Compiler information (e.g. gcc 7.3): - [ ] Please attach the debug trace of the failing command as a [gist](https://gist.github.com/): * Run `env PYENV_DEBUG=1 2>&1 | tee trace.log` and attach `trace.log`. E.g. if you have a problem with installing Python, run `env PYENV_DEBUG=1 pyenv install -v 2>&1 | tee trace.log` (note the `-v` option to `pyenv install`). - [ ] If you have a problem with installing Python, please also attach `config.log` from the build directory * The build directory is reported after the "BUILD FAILED" message and is usually under `/tmp`. - [ ] If the build succeeds but the problem is still with the build process (e.g. the resulting Python is missing a feature), please attach * the debug trace from reinstalling the faulty version with `env PYENV_DEBUG=1 pyenv install -f -k -v 2>&1 | tee trace.log` * `config.log` from the build directory. When using `pyenv install` with `-k` as per above, the build directory will be under `$PYENV_ROOT/sources`. - [ ] If the problem happens in another Pyenv invocation, turn on debug logging by setting `PYENV_DEBUG=1`, e.g. `env PYENV_DEBUG=1 pyenv local 3.6.4`, and attach the resulting trace as a gist - [ ] If the problem happens outside of a Pyenv invocation, get the debug trace like this: ``` export PYENV_DEBUG=1 # for Bash export PS4='+(${BASH_SOURCE}:${LINENO}): ${FUNCNAME[0]:+${FUNCNAME[0]}(): }' # for Zsh export PS4='+(%x:%I): %N(%i): ' set -x set +x ``` pyenv-pyenv-485090e/.github/ISSUE_TEMPLATE/feature_request.md000066400000000000000000000020271517431316200235460ustar00rootroot00000000000000--- name: Feature request about: Suggest an idea for this project title: '' labels: '' assignees: '' --- **Describe the intended use case** * What your general environment is if it's relevant to the feature request and is not a generic console with a typical Pyenv installation (CI, server with a custom setup, cloud environment, IDE) * What you are trying to achieve * What specifically you are doing for that regarding Pyenv * Where you are stuck **Describe the solution you'd like** A clear and concise description of what you want to happen. **Describe alternatives you've considered** A clear and concise description of any alternative solutions or features you've considered. [ ] In particular, did you consider [writing a plugin](https://github.com/pyenv/pyenv/blob/master/README.md#pyenv-plugins)? Note that if your plugin has general applicability, you can publish it in the 3rd-party plugin catalog on the Pyenv Wiki as per the link above. **Additional context** Add any other context or screenshots about the feature request here. pyenv-pyenv-485090e/.github/PULL_REQUEST_TEMPLATE.md000066400000000000000000000017621517431316200214440ustar00rootroot00000000000000Make sure you have checked all steps below. ### Prerequisite * [ ] Please consider implementing the feature as a hook script or plugin as a first step. * pyenv has some powerful support for plugins and hook scripts. Please refer to [Authoring plugins](https://github.com/pyenv/pyenv/wiki/Authoring-plugins) for details and try to implement it as a plugin if possible. * [ ] Please consider contributing the patch upstream to [rbenv](https://github.com/rbenv/rbenv), since we have borrowed most of the code from that project. * We occasionally import the changes from rbenv. In general, you can expect changes made in rbenv will be imported to pyenv too, eventually. * Generally speaking, we prefer not to make changes in the core in order to keep compatibility with rbenv. * [ ] My PR addresses the following pyenv issue (if any) - Closes https://github.com/pyenv/pyenv/issues/XXXX ### Description - [ ] Here are some details about my PR ### Tests - [ ] My PR adds the following unit tests (if any) pyenv-pyenv-485090e/.github/dependabot.yml000066400000000000000000000002731517431316200204670ustar00rootroot00000000000000version: 2 updates: - package-ecosystem: "github-actions" directory: "/" schedule: interval: "monthly" groups: github-actions: patterns: - "*" pyenv-pyenv-485090e/.github/workflows/000077500000000000000000000000001517431316200176725ustar00rootroot00000000000000pyenv-pyenv-485090e/.github/workflows/add_version.yml000066400000000000000000000034251517431316200227160ustar00rootroot00000000000000name: Add versions on: workflow_dispatch: {} schedule: # Every N hours - cron: '0 */4 * * *' permissions: contents: write pull-requests: write jobs: add_cpython: runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 - uses: actions/setup-python@v6 with: python-version: 3 cache: 'pip' cache-dependency-path: plugins/python-build/scripts/requirements.txt - run: pip install -r plugins/python-build/scripts/requirements.txt - name: check for a release run: | python plugins/python-build/scripts/add_cpython.py --verbose >added_versions.lst && rc=$? || rc=$? echo "rc=$rc" >> $GITHUB_ENV - name: set PR properties if: env.rc == 0 shell: python run: | import os import sys versions=[l.rstrip() for l in open("added_versions.lst")] with open(os.environ['GITHUB_ENV'],'a') as f: f.write(f'branch_name=auto_add_version/{"_".join(versions)}\n') f.write(f'pr_name=Add CPython {", ".join(versions)}\n') os.remove("added_versions.lst") # https://github.com/peter-evans/create-pull-request/blob/main/docs/concepts-guidelines.md#authenticating-with-github-app-generated-tokens - name: Generate Github token if: env.rc == 0 uses: actions/create-github-app-token@v3 id: generate-token with: app-id: ${{ vars.PYENV_BOT_APP_ID }} private-key: ${{ secrets.PYENV_BOT_PRIVATE_KEY }} - name: Create Pull Request uses: peter-evans/create-pull-request@v8 if: env.rc == 0 with: branch: ${{ env.branch_name }} title: ${{ env.pr_name }} token: ${{ steps.generate-token.outputs.token }} pyenv-pyenv-485090e/.github/workflows/macos_build.yml000066400000000000000000000021731517431316200227010ustar00rootroot00000000000000name: macos_build on: [pull_request, push] permissions: contents: read # to fetch code (actions/checkout) jobs: macos_build: strategy: fail-fast: false matrix: python-version: - "3.10" - "3.11" - "3.12" - "3.13" - "3.14" runs-on: macos-latest steps: - uses: actions/checkout@v6 - run: | brew install openssl readline sqlite3 xz tcl-tk@8 libb2 zstd # https://github.com/pyenv/pyenv#installation - run: pwd - env: PYENV_ROOT: /Users/runner/work/pyenv/pyenv run: | echo $PYENV_ROOT echo "$PYENV_ROOT/shims:$PYENV_ROOT/bin" >> $GITHUB_PATH bin/pyenv --debug install ${{ matrix.python-version }} bin/pyenv global ${{ matrix.python-version }} bin/pyenv rehash - run: python --version - run: python -m pip --version - shell: python # Prove that actual Python == expected Python env: EXPECTED_PYTHON: ${{ matrix.python-version }} run: import os, sys ; assert sys.version.startswith(os.getenv("EXPECTED_PYTHON")) pyenv-pyenv-485090e/.github/workflows/modified_scripts_build.yml000066400000000000000000000307061517431316200251310ustar00rootroot00000000000000name: modified_scripts on: [pull_request] jobs: discover_modified_scripts: runs-on: ubuntu-latest outputs: versions: ${{steps.modified-versions.outputs.versions}} versions_cpython_only: ${{steps.modified-versions.outputs.versions_cpython_only}} versions_macos_build_exclude: ${{steps.modified-versions.outputs.versions_macos_build_exclude}} steps: - uses: actions/checkout@v6 - run: git fetch origin "$GITHUB_BASE_REF" - shell: bash run: > versions=$(git diff "origin/$GITHUB_BASE_REF" --name-only -z | perl -ne 'BEGIN {$\="\n";$/="\0";} chomp; if (/^plugins\/python-build\/share\/python-build\/(?:([^\/]+)|patches\/([^\/]+)\/.*)$/ and -e $& ) { print $1.$2; }' \ | sort -u); EOF=$(dd if=/dev/urandom bs=15 count=1 status=none | base64); echo "versions<<$EOF" >> $GITHUB_ENV; echo "$versions" >> $GITHUB_ENV; echo "$EOF" >> $GITHUB_ENV; versions_cpython_only=$(grep -Ee '^[[:digit:]]' <<<"$versions") EOF=$(dd if=/dev/urandom bs=15 count=1 status=none | base64); echo "versions_cpython_only<<$EOF" >> $GITHUB_ENV; echo "$versions_cpython_only" >> $GITHUB_ENV; echo "$EOF" >> $GITHUB_ENV; - run: pip install packaging - name: Build exclusions JSON shell: python run: | import os import json import random import re import subprocess import packaging.version result=[] for line in os.environ['versions'].splitlines(): if m:=re.match(r'([^-]+)-(\d+\.\d+)-(\d+\.\d+.\d+)', line): name, version = m.group(1), packaging.version.Version(m.group(3)) # Miniconda dropped MacOS x64 support if (name == 'miniconda3' and version >= packaging.version.Version('25.9.1')): result.append({'os':'macos-15-intel','python-version':line}) if m:=re.match(r'([^-]+)-(\d+\.\d+)', line): name, version = m.group(1), packaging.version.Version(m.group(2)) # Anaconda dropped MacOS x64 support if name == 'anaconda3' and version >= packaging.version.Version('2025.12'): result.append({'os':'macos-15-intel','python-version':line}) if m:=re.match(r'graalpy-(community-)?-(\d+\.\d+.\d+)', line): version = packaging.version.Version(m.group(2)) # GraalPy dropped MacOS x64 support if version >= packaging.version.Version('25.0.2'): result.append({'os':'macos-15-intel','python-version':line}) EOF = str(random.getrandbits(15*8)) with open(os.environ['GITHUB_ENV'],'w') as f: f.write(f"versions_macos_build_exclude_json<<{EOF}\n") json.dump(result, f) f.write(f'\n{EOF}\n') - id: modified-versions run: | echo "versions=`echo "${{ env.versions }}" | jq -R . | jq -sc .`" >> $GITHUB_OUTPUT echo "versions_cpython_only=`echo "${{ env.versions_cpython_only }}" | jq -R . | jq -sc .`" >> $GITHUB_OUTPUT echo 'versions_macos_build_exclude=${{ env.versions_macos_build_exclude_json }}' >> $GITHUB_OUTPUT macos_build: needs: discover_modified_scripts if: needs.discover_modified_scripts.outputs.versions != '[""]' strategy: fail-fast: false matrix: python-version: ${{fromJson(needs.discover_modified_scripts.outputs.versions)}} os: - macos-14 - macos-15 - macos-15-intel - macos-26 exclude: ${{fromJson(needs.discover_modified_scripts.outputs.versions_macos_build_exclude)}} runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v6 - run: | #envvars export PYENV_ROOT="$GITHUB_WORKSPACE" echo "PYENV_ROOT=$PYENV_ROOT" >> $GITHUB_ENV echo "$PYENV_ROOT/shims:$PYENV_ROOT/bin" >> $GITHUB_PATH - run: | #prerequisites brew install openssl openssl@1.1 readline sqlite3 xz zlib if [[ "${{ matrix.python-version }}" =~ pypy.*-(src|dev) ]]; then export PYENV_BOOTSTRAP_VERSION=pypy2.7-7 echo "PYENV_BOOTSTRAP_VERSION=$PYENV_BOOTSTRAP_VERSION" >> $GITHUB_ENV pyenv install $PYENV_BOOTSTRAP_VERSION fi - run: | #build pyenv --debug install ${{ matrix.python-version }} && rc=$? || rc=$? if [[ $rc -ne 0 ]]; then echo config.log:; cat $TMPDIR/python-build*/*/config.log; false; fi pyenv global ${{ matrix.python-version }} # Micropython doesn't support --version - run: | #print version if [[ "${{ matrix.python-version }}" == "micropython-"* ]]; then python -c 'import sys; print(sys.version)' else python --version python -m pip --version fi # Micropython doesn't support sys.executable, os.path, older versions even os - env: EXPECTED_PYTHON: ${{ matrix.python-version }} run: | #check if [[ "${{ matrix.python-version }}" == "micropython-"* ]]; then [[ $(pyenv which python) == "${{ env.PYENV_ROOT }}/versions/${{ matrix.python-version }}/bin/python" ]] || exit 1 python -c 'import sys; assert sys.implementation.name == "micropython"' else python -c 'if True: import os, sys, os.path correct_dir = os.path.join( os.environ["PYENV_ROOT"], "versions", os.environ["EXPECTED_PYTHON"], "bin") assert os.path.dirname(sys.executable) == correct_dir' fi # bundled executables in some Anaconda releases cause the post-run step to hang in MacOS - run: | pyenv global system rm -f "$(pyenv root)"/shims/* macos_build_bundled_dependencies: needs: discover_modified_scripts if: needs.discover_modified_scripts.outputs.versions_cpython_only != '[""]' strategy: fail-fast: false matrix: python-version: ${{fromJson(needs.discover_modified_scripts.outputs.versions_cpython_only)}} os: ["macos-14", "macos-15", "macos-15-intel"] runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v6 - run: | #envvars export PYENV_ROOT="$GITHUB_WORKSPACE" echo "PYENV_ROOT=$PYENV_ROOT" >> $GITHUB_ENV echo "$PYENV_ROOT/shims:$PYENV_ROOT/bin" >> $GITHUB_PATH - run: | #prerequisites brew install sqlite3 xz zlib "$GITHUB_WORKSPACE/.github/workflows/scripts/brew-uninstall-cascade.sh" openssl@3 openssl@1.1 readline if [[ "${{ matrix.python-version }}" =~ pypy.*-(src|dev) ]]; then export PYENV_BOOTSTRAP_VERSION=pypy2.7-7 echo "PYENV_BOOTSTRAP_VERSION=$PYENV_BOOTSTRAP_VERSION" >> $GITHUB_ENV pyenv install $PYENV_BOOTSTRAP_VERSION fi - run: | #build pyenv --debug install ${{ matrix.python-version }} && rc=$? || rc=$? if [[ $rc -ne 0 ]]; then echo config.log:; cat $TMPDIR/python-build*/*/config.log; false; fi pyenv global ${{ matrix.python-version }} - run: | #print version python --version python -m pip --version - env: EXPECTED_PYTHON: ${{ matrix.python-version }} run: | #check python -c ' import os, sys, os.path correct_dir = os.path.join( os.environ["PYENV_ROOT"], "versions", os.environ["EXPECTED_PYTHON"], "bin") assert os.path.dirname(sys.executable) == correct_dir' ubuntu_build: needs: discover_modified_scripts if: needs.discover_modified_scripts.outputs.versions != '[""]' strategy: fail-fast: false matrix: python-version: ${{fromJson(needs.discover_modified_scripts.outputs.versions)}} os: - ubuntu-22.04 - ubuntu-24.04 runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v6 - run: | #envvars export PYENV_ROOT="$GITHUB_WORKSPACE" echo "PYENV_ROOT=$PYENV_ROOT" >> $GITHUB_ENV echo "$PYENV_ROOT/shims:$PYENV_ROOT/bin" >> $GITHUB_PATH - run: | #prerequisites sudo apt-get update -q; sudo apt-get install -yq make build-essential \ libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev \ curl llvm libncurses5-dev libncursesw5-dev \ xz-utils tk-dev libffi-dev liblzma-dev if [[ "${{ matrix.python-version }}" =~ pypy.*-(src|dev) ]]; then export PYENV_BOOTSTRAP_VERSION=pypy2.7-7 echo "PYENV_BOOTSTRAP_VERSION=$PYENV_BOOTSTRAP_VERSION" >> $GITHUB_ENV pyenv install $PYENV_BOOTSTRAP_VERSION fi - run: | #build pyenv --debug install ${{ matrix.python-version }} && rc=$? || rc=$? if [[ $rc -ne 0 ]]; then echo config.log:; cat $TMPDIR/python-build*/*/config.log; false; fi pyenv global ${{ matrix.python-version }} # Micropython doesn't support --version - run: | #print version if [[ "${{ matrix.python-version }}" == "micropython-"* ]]; then python -c 'import sys; print(sys.version)' else python --version python -m pip --version fi # Micropython doesn't support sys.executable, os.path, older versions even os - env: EXPECTED_PYTHON: ${{ matrix.python-version }} run: | #check if [[ "${{ matrix.python-version }}" == "micropython-"* ]]; then [[ $(pyenv which python) == "${{ env.PYENV_ROOT }}/versions/${{ matrix.python-version }}/bin/python" ]] || exit 1 python -c 'import sys; assert sys.implementation.name == "micropython"' else python -c 'if True: import os, sys, os.path correct_dir = os.path.join( os.environ["PYENV_ROOT"], "versions", os.environ["EXPECTED_PYTHON"], "bin") assert os.path.dirname(sys.executable) == correct_dir' fi # bundled executables in some Anaconda releases cause the post-run step to break - run: | pyenv global system rm -f "$(pyenv root)"/shims/* ubuntu_build_tar_gz: needs: discover_modified_scripts if: needs.discover_modified_scripts.outputs.versions_cpython_only != '[""]' strategy: fail-fast: false matrix: python-version: ${{fromJson(needs.discover_modified_scripts.outputs.versions_cpython_only)}} os: ["ubuntu-latest"] runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v6 - run: | #envvars export PYENV_ROOT="$GITHUB_WORKSPACE" echo "PYENV_ROOT=$PYENV_ROOT" >> $GITHUB_ENV echo "$PYENV_ROOT/shims:$PYENV_ROOT/bin" >> $GITHUB_PATH echo "_PYTHON_BUILD_FORCE_SKIP_XZ=1" >> $GITHUB_PATH - run: | #prerequisites sudo apt-get update -q; sudo apt-get install -yq make build-essential \ libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev \ curl llvm libncurses5-dev libncursesw5-dev \ xz-utils tk-dev libffi-dev liblzma-dev if [[ "${{ matrix.python-version }}" =~ pypy.*-(src|dev) ]]; then export PYENV_BOOTSTRAP_VERSION=pypy2.7-7 echo "PYENV_BOOTSTRAP_VERSION=$PYENV_BOOTSTRAP_VERSION" >> $GITHUB_ENV pyenv install $PYENV_BOOTSTRAP_VERSION fi - run: | #build pyenv --debug install ${{ matrix.python-version }} && rc=$? || rc=$? if [[ $rc -ne 0 ]]; then echo config.log:; cat $TMPDIR/python-build*/*/config.log; false; fi pyenv global ${{ matrix.python-version }} - run: | #print version python --version python -m pip --version - env: EXPECTED_PYTHON: ${{ matrix.python-version }} run: | #check python -c ' import os, sys, os.path correct_dir = os.path.join( os.environ["PYENV_ROOT"], "versions", os.environ["EXPECTED_PYTHON"], "bin") assert os.path.dirname(sys.executable) == correct_dir' pyenv-pyenv-485090e/.github/workflows/no-response.yml000066400000000000000000000017701517431316200226720ustar00rootroot00000000000000name: No Response # Both `issue_comment` and `scheduled` event types are required for this Action # to work properly. on: issue_comment: types: [created] schedule: # Schedule for ten minutes after the hour, every hour - cron: '10 * * * *' permissions: {} jobs: noResponse: permissions: issues: write # to update issues (lee-dohm/no-response) runs-on: ubuntu-latest steps: - uses: lee-dohm/no-response@v0.5.0 with: token: ${{ github.token }} daysUntilClose: 30 responseRequiredLabel: need-feedback closeComment: > This issue has been automatically closed because there has been no response to our request for more information from the original author. With only the information that is currently in the issue, we don't have enough information to take action. Please reach out if you have or find the answers we need so that we can investigate further. pyenv-pyenv-485090e/.github/workflows/pyenv_tests.yml000066400000000000000000000020541517431316200230010ustar00rootroot00000000000000name: pyenv_tests on: [pull_request, push] permissions: contents: read # to fetch code (actions/checkout) jobs: pyenv_tests: strategy: fail-fast: false matrix: os: - ubuntu-22.04 - ubuntu-24.04 - macos-14 - macos-15 - macos-15-intel - macos-26 runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v6 - run: | if test "$RUNNER_OS" == "macOS"; then brew install coreutils fish fi - run: pwd - env: PYENV_ROOT: /home/runner/work/pyenv/pyenv run: | echo $PYENV_ROOT echo "$PYENV_ROOT/shims:$PYENV_ROOT/bin" >> $GITHUB_PATH - name: Run test on the host run: | make test - name: Run test with docker if: ${{ ! contains(matrix.os, 'macos') }} run: | make test-docker - env: PYENV_NATIVE_EXT: 1 run: | (cd src; ./configure; make) bats/bin/bats test/{pyenv,hooks,versions}.bats pyenv-pyenv-485090e/.github/workflows/scripts/000077500000000000000000000000001517431316200213615ustar00rootroot00000000000000pyenv-pyenv-485090e/.github/workflows/scripts/brew-uninstall-cascade.sh000077500000000000000000000005761517431316200262570ustar00rootroot00000000000000#!/bin/bash declare -a packages rdepends packages=("$@") # have to try one by one, otherwise `brew uses` would only print # packages that require them all rather than any of them for package in "${packages[@]}"; do rdepends+=($(brew uses --installed --include-build --include-test --include-optional --recursive "$package")) done brew uninstall "${packages[@]}" "${rdepends[@]}"pyenv-pyenv-485090e/.github/workflows/ubuntu_build.yml000066400000000000000000000024621517431316200231220ustar00rootroot00000000000000name: ubuntu_build on: [pull_request, push] permissions: contents: read # to fetch code (actions/checkout) jobs: ubuntu_build: strategy: fail-fast: false matrix: python-version: - "3.10" - "3.11" - "3.12" - "3.13" - "3.14" runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 - run: | sudo apt-get update -q; sudo apt install -yq make build-essential libssl-dev zlib1g-dev \ libbz2-dev libreadline-dev libsqlite3-dev curl \ libncursesw5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev # https://github.com/pyenv/pyenv#installation - run: pwd - env: PYENV_ROOT: /home/runner/work/pyenv/pyenv run: | echo $PYENV_ROOT echo "$PYENV_ROOT/shims:$PYENV_ROOT/bin" >> $GITHUB_PATH bin/pyenv --debug install ${{ matrix.python-version }} bin/pyenv global ${{ matrix.python-version }} bin/pyenv rehash - run: python --version - run: python -m pip --version - shell: python # Prove that actual Python == expected Python env: EXPECTED_PYTHON: ${{ matrix.python-version }} run: import os, sys ; assert sys.version.startswith(os.getenv("EXPECTED_PYTHON")) pyenv-pyenv-485090e/.gitignore000066400000000000000000000001771517431316200162720ustar00rootroot00000000000000/shims /version /versions /sources /cache /libexec/*.dylib /src/Makefile /src/*.o /bats /bats-*/ /default-packages .idea *.un~ pyenv-pyenv-485090e/.vimrc000066400000000000000000000000431517431316200154130ustar00rootroot00000000000000set wildignore+=versions/*,cache/* pyenv-pyenv-485090e/CHANGELOG.md000066400000000000000000002335001517431316200161110ustar00rootroot00000000000000# Version History ## Release v2.6.28 * pyenv-latest: fast path for when there is an exact match by @native-api in https://github.com/pyenv/pyenv/pull/3437 ## Release v2.6.27 * commands: fast path for --sh, replace sort|uniq with sort -u by @jakelodwick in https://github.com/pyenv/pyenv/pull/3423 * which: update the `pyenv help global` tip by @native-api in https://github.com/pyenv/pyenv/pull/3424 * Bump actions/create-github-app-token from 2 to 3 in the github-actions group by @dependabot[bot] in https://github.com/pyenv/pyenv/pull/3428 * python-build: advise user with no c compiler by @exurd in https://github.com/pyenv/pyenv/pull/3294 * Add CPython 3.13.13, 3.14.4, 3.15.0a8 by @pyenv-bot[bot] in https://github.com/pyenv/pyenv/pull/3432 * Add miniforge3 26.1.1-2, 26.1.1-3 by @native-api in https://github.com/pyenv/pyenv/pull/3433 ## Release v2.6.26 * versions: fast path for --bare --skip-aliases by @jakelodwick in https://github.com/pyenv/pyenv/pull/3411 * Fix MacPorts OpenSSL formula detection by @tekintian in https://github.com/pyenv/pyenv/pull/3417 * rehash: streamline executables discovery; fix regression by @native-api in https://github.com/pyenv/pyenv/pull/3418 * rehash: simplify source.bash pipeline by @jakelodwick in https://github.com/pyenv/pyenv/pull/3419 * Add CPython 3.15.0a7 by @pyenv-bot[bot] in https://github.com/pyenv/pyenv/pull/3421 ## Release v2.6.25 * Add miniforge3-26.1.0-0 by @native-api in https://github.com/pyenv/pyenv/pull/3413 * Add CPython 3.12.13 by @pyenv-bot[bot] in https://github.com/pyenv/pyenv/pull/3414 ## Release v2.6.24 * CI: add_version: use Github App token to create PR by @native-api in https://github.com/pyenv/pyenv/pull/3406 * Add Anaconda3-2025.12-2 by @binbjz in https://github.com/pyenv/pyenv/pull/3408 * rehash: Drop redundant sort -u from make_shims call by @jakelodwick in https://github.com/pyenv/pyenv/pull/3410 * Add CPython 3.10.20, 3.11.15 by @pyenv-bot[bot] in https://github.com/pyenv/pyenv/pull/3412 ## Release v2.6.23 * Add CPython 3.15.0a6 by @native-api in https://github.com/pyenv/pyenv/pull/3403 ## Release v2.6.22 * Add CPython 3.13.12 by @github-actions[bot] in https://github.com/pyenv/pyenv/pull/3401 ## Release v2.6.21 * Add GraalPy 25.0.2 by @msimacek in https://github.com/pyenv/pyenv/pull/3395 * Add CPython 3.14.3 by @github-actions[bot] in https://github.com/pyenv/pyenv/pull/3400 ## Release v2.6.20 * CI: adjust CPython PR generation logic by @native-api in https://github.com/pyenv/pyenv/pull/3392 * Add CPython 3.15.0a5 by @nedbat in https://github.com/pyenv/pyenv/pull/3393 ## Release v2.6.19 * Add CPython 3.15.0a4 by @nedbat in https://github.com/pyenv/pyenv/pull/3390 ## Release v2.6.18 * Fix an infinite loop if a shim is symlinked to and called from a different location with "system" version active by @native-api in https://github.com/pyenv/pyenv/pull/3375 * CI: Update and cleanup workflow scripts by @native-api in https://github.com/pyenv/pyenv/pull/3372 * Add PowerShell support by @fblanchetNaN in https://github.com/pyenv/pyenv/pull/2749 * rehash: support older BSD `mktemp` by @native-api in https://github.com/pyenv/pyenv/pull/3376 * rehash: report final lock acquisition error while silencing provisional ones; init: don't silence automatic rehash by @native-api in https://github.com/pyenv/pyenv/pull/3377 * pyenv launcher: introduce and export _PYENV_INSTALL_PREFIX by @rockandska in https://github.com/pyenv/pyenv/pull/3334 * README: Document how to change Python version in a shell spawned from a Python-based program (e.g. Jupyter) by @native-api in https://github.com/pyenv/pyenv/pull/3380 * Recognize an argument to -j in MAKEFLAGS when building extensions in 3.10-3.11 and latest 3.5-3.9 by @native-api in https://github.com/pyenv/pyenv/pull/3379 * CI: add a script to autogenerate CPython build scripts by @native-api in https://github.com/pyenv/pyenv/pull/3358 * Add miniconda3-25.11.1-1 by @binbjz in https://github.com/pyenv/pyenv/pull/3382 * CI: exclude unsupported MacOS-x64 for recent Miniconda versions by @binbjz in https://github.com/pyenv/pyenv/pull/3385 * Auto-accept TOS for miniconda3-25+ by @native-api in https://github.com/pyenv/pyenv/pull/3386 * Add anaconda-2025.12-1 by @native-api in https://github.com/pyenv/pyenv/pull/3387 * CI: automatically check for CPython releases and generate PRs by @native-api in https://github.com/pyenv/pyenv/pull/3388 ## Release v2.6.17 * Add miniforge 25.9.1-0, 25.11.0-1 by @13steinj in https://github.com/pyenv/pyenv/pull/3371 * miniconda3-latest: auto accept TOS by @native-api in https://github.com/pyenv/pyenv/pull/3373 * Add CPython 3.15.0a3 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/3374 ## Release v2.6.16 * rehash: Fix hanging for 60 seconds when shims directory is not writable due to Linux Landlock by @native-api in https://github.com/pyenv/pyenv/pull/3367 * Add Miniconda3-25.9.1-3 by @binbjz in https://github.com/pyenv/pyenv/pull/3368 * sh-rehash: Fix erroneously executing rather than printing a command by @native-api in https://github.com/pyenv/pyenv/pull/3369 * Add CPython 3.13.11, 3.14.2 by @cesarcoatl in https://github.com/pyenv/pyenv/pull/3370 ## Release v2.6.15 * Add CPython 3.13.10 by @jsirois in https://github.com/pyenv/pyenv/pull/3364 ## Release v2.6.14 * CI: Bump actions/checkout from 5 to 6 in the github-actions group by @dependabot[bot] in https://github.com/pyenv/pyenv/pull/3360 * Fix "ld: symbol(s) not found" for C system calls in some MacOS versions if XCode is for a newer major MacOS version by @native-api in https://github.com/pyenv/pyenv/pull/3362 * Add CPython 3.14.1 by @nedbat in https://github.com/pyenv/pyenv/pull/3363 ## Release v2.6.13 * CI: Replace macos-13 with macos-15-intel by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/3356 * Add Miniconda3-25.9.1-1 by @binbjz in https://github.com/pyenv/pyenv/pull/3357 * Add CPython 3.15.0a2 by @nedbat in https://github.com/pyenv/pyenv/pull/3359 ## Release v2.6.12 * Add graalpy-25.0.1 by @msimacek in https://github.com/pyenv/pyenv/pull/3350 * Add CPython 3.9.25 by @nedbat in https://github.com/pyenv/pyenv/pull/3355 ## Release v2.6.11 * Support building against Homebrew Tcl/Tk 9 by @native-api in https://github.com/pyenv/pyenv/pull/3343 * Add CPython 3.13.9 by @nedbat in https://github.com/pyenv/pyenv/pull/3346 * Add CPython 3.15.0a1 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/3347 ## Release v2.6.10 * Add CPython 3.12.12, 3.11.14, 3.10.19, 3.9.24 by @nedbat in https://github.com/pyenv/pyenv/pull/3344 ## Release v2.6.9 * CI: modified-scripts-build: fix CPython-specific jobs never firing by @tuzi3040 in https://github.com/pyenv/pyenv/pull/3338 * CI: modified-scripts-build: fix output variable for CPython-specific workflows by @native-api in https://github.com/pyenv/pyenv/pull/3340 * Add CPython 3.14.0 by @SnoopJ in https://github.com/pyenv/pyenv/pull/3339 * Add CPython 3.13.8 by @jsirois in https://github.com/pyenv/pyenv/pull/3341 ## Release v2.6.8 * Use Zlib from XCode SDK in a way compatible with XCode 16 and CLT by @JarheadStever in https://github.com/pyenv/pyenv/pull/3301 * Add miniforge 25.3.0-1, 25.3.0-2, 25.3.0-3, 25.3.1-0, skip miniforge 25.3.0-0 by @native-api in https://github.com/pyenv/pyenv/pull/3306 * Fix Readline and OpenSSL detection for MacPorts without the corresponding package by @native-api in https://github.com/pyenv/pyenv/pull/3317 * Bump actions/checkout from 4 to 5 in the github-actions group by @dependabot[bot] in https://github.com/pyenv/pyenv/pull/3318 * Fix rehash hook for pipx/pipx.x/pipx.xx by @rockandska in https://github.com/pyenv/pyenv/pull/3320 * Add miniconda 25.7.0-2 by @native-api in https://github.com/pyenv/pyenv/pull/3323 * Support curl from a snap by @native-api in https://github.com/pyenv/pyenv/pull/3329 * CI: Bats test suite in docker by @rockandska in https://github.com/pyenv/pyenv/pull/3324 * Add GraalPy 25.0.0 by @msimacek in https://github.com/pyenv/pyenv/pull/3331 * Upgrade pip detetcion in pip-rehash to accept multiple variations by @rockandska in https://github.com/pyenv/pyenv/pull/3330 * Add CPython 3.14.0rc3 by @nedbat in https://github.com/pyenv/pyenv/pull/3333 * Use TCLTK_* and pkg-config for 3.11+ linking with Homebrew Tcl/Tk; add PYTHON_BUILD_TCLTK_FORMULA envvar by @native-api in https://github.com/pyenv/pyenv/pull/3327 ## Release v2.6.7 * Skip Zlib from XCode for XCode 16+ by @native-api in https://github.com/pyenv/pyenv/pull/3298 * Don't fail the build if `xcodebuild` fails by @native-api in https://github.com/pyenv/pyenv/pull/3302 * Add CPython 3.14.0rc2 and 3.13.7 by @nedbat in https://github.com/pyenv/pyenv/pull/3303 ## Release v2.6.6 * Add anaconda3-2025.06-0, anaconda3-2025.06-1, miniconda3-25.3.1-1, miniconda3-25.5.1-0, miniconda3-25.5.1-1 by @native-api in https://github.com/pyenv/pyenv/pull/3295 * Add CPython 3.13.6 by @cesarcoatl in https://github.com/pyenv/pyenv/pull/3297 ## Release v2.6.5 * Bump OpenSSL to 3.5.1 in the latest releases and branch tips in CPython 3.12 - 3.15 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/3287 * Add Jython 2.7.4 by @cesarcoatl in https://github.com/pyenv/pyenv/pull/3290 * Add CPython 3.14.0rc1 by @nedbat in https://github.com/pyenv/pyenv/pull/3293 * Add GraalPy 24.2.2 by @msimacek in https://github.com/pyenv/pyenv/pull/3291 ## Release v2.6.4 * Backport bpo_36106 to 3.5.10 and 3.6.15 by @native-api in https://github.com/pyenv/pyenv/pull/3280 * (regression) Use Zlib from XCode SDK in MacOS without Homebrew or Macports by @native-api in https://github.com/pyenv/pyenv/pull/3282 * Add PyPy v7.3.20 by @jsirois in https://github.com/pyenv/pyenv/pull/3284 * Add CPython 3.14.0b4 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/3285 ## Release v2.6.3 * README: Re-promote "Python versions with extended support" to a section by @native-api in https://github.com/pyenv/pyenv/pull/3276 * Support linking to MacPorts ports installed from binary archives by @0916dhkim in https://github.com/pyenv/pyenv/pull/3272 * Add CPython 3.14.0b3 by @nedbat in https://github.com/pyenv/pyenv/pull/3278 ## Release v2.6.2 * Add CPython 3.13.5 by @nedbat in https://github.com/pyenv/pyenv/pull/3269 ## Release v2.6.1 * Add CPython 3.9.23, 3.10.18, 3.11.13, 3.12.11, 3.13.4 by @nedbat in https://github.com/pyenv/pyenv/pull/3266 ## Release v2.6.0 * python-build: Support patch paths with spaces/special characters by @native-api in https://github.com/pyenv/pyenv/pull/3251 * Add CODEOWNERS file by @native-api in https://github.com/pyenv/pyenv/pull/3247 * README: make fish PATH add conditional on the directory existing by @BooleanCat in https://github.com/pyenv/pyenv/pull/2786 * Add --bare option to `pyenv version` by @jjwatt in https://github.com/pyenv/pyenv/pull/2783 * README: Add shell setup instructions for nushell by @jordanst3wart in https://github.com/pyenv/pyenv/pull/2916 * Add MacPorts support for python-build by @studnitskiy in https://github.com/pyenv/pyenv/pull/3186 * python-build: fix `has_broken_mac_readline` when Readline is explicitly configured by @fofoni in https://github.com/pyenv/pyenv/pull/3254 * Add CPython 3.14.0b2 by @nedbat in https://github.com/pyenv/pyenv/pull/3259 ## Release v2.5.7 * Point 3.14-dev to `3.14` branch by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/3246 ## Release v2.5.6 * Add GraalPy 24.2.1 by @msimacek in https://github.com/pyenv/pyenv/pull/3238 * Fix get-pip URLs for 3.7, 3.8 and Pyston by @dmrlawson in https://github.com/pyenv/pyenv/pull/3242 * [CI] Cache `uname` and `sw_vers` output in Python-Build for easier mocking in tests by @native-api in https://github.com/pyenv/pyenv/pull/3244 * Add CPython 3.14.0b1 and 3.15-dev by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/3245 ## Release v2.5.5 * Add graalpy 24.2 by @msimacek in https://github.com/pyenv/pyenv/pull/3215 * Switch 3.9+ to OpenSSL 3 by @native-api in https://github.com/pyenv/pyenv/pull/3223 * Add miniforge3-24.11.3-1, miniforge3-24.11.3-2, miniforge3-25.1.1 by @native-api in https://github.com/pyenv/pyenv/pull/3224 * Add CPython 3.9.22, 3.10.17, 3.11.12, 3.12.10, 3.13.3, 3.14.0a7 by @native-api in https://github.com/pyenv/pyenv/pull/3233 ## Release v2.5.4 * Add anaconda3-2025.1.1-2 by @binbjz in https://github.com/pyenv/pyenv/pull/3198 * Add PyPy v7.3.19 by @jsirois in https://github.com/pyenv/pyenv/pull/3205 * Add CPython 3.14.0a6 by @nedbat in https://github.com/pyenv/pyenv/pull/3213 ## Release v2.5.3 * Add PyPy v7.3.18 by @dand-oss in https://github.com/pyenv/pyenv/pull/3184 * Add Miniconda3 25.1.1-0 by @binbjz in https://github.com/pyenv/pyenv/pull/3190 * Add miniforge3-25.1.1-0, miniforge3-24.11.3-0 by @native-api in https://github.com/pyenv/pyenv/pull/3191 * Add CPython 3.14.0a5 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/3194 * Add Miniconda3 25.1.1-1 by @binbjz in https://github.com/pyenv/pyenv/pull/3192 * Update hashes for Python 3.14.0a5 tarballs by @jsirois in https://github.com/pyenv/pyenv/pull/3196 * rehash: Do not execute conda-specific code if conda is not installed by @ChristianFredrikJohnsen in https://github.com/pyenv/pyenv/pull/3151 ## Release v2.5.2 * Fix OpenSSL version parsing in python-build script by @threadflow in https://github.com/pyenv/pyenv/pull/3181 * Add GraalPy 24.1.2 by @msimacek in https://github.com/pyenv/pyenv/pull/3176 * Add CPython 3.12.9 and 3.13.2 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/3183 ## Release v2.5.1 * CI: use Ubuntu 24.04; use ubuntu-latest for the ubuntu_build check by @native-api in https://github.com/pyenv/pyenv/pull/3144 * Fix: mistake in configuration hints in `pyenv init` and manpage by @ChristianFredrikJohnsen in https://github.com/pyenv/pyenv/pull/3145 * README: Add recommended curl arguments to suggested installer invocation by @JayBazuzi in https://github.com/pyenv/pyenv/pull/3155 * Add miniforge3-24.11.2-0, miniforge3-24.11.2-1 by @native-api in https://github.com/pyenv/pyenv/pull/3163 * Fix "Unsupported options" error building bundled OpenSSL <3.2.0 by @native-api in https://github.com/pyenv/pyenv/pull/3164 * Add CPython 3.14.0a4 by @nedbat in https://github.com/pyenv/pyenv/pull/3168 ## Release v2.5.0 * `pyenv init -` performance improvements; recommend using `pyenv init - ` by @ChristianFredrikJohnsen in https://github.com/pyenv/pyenv/pull/3136 * Add miniconda3-24.11.1-0 by @binbjz in https://github.com/pyenv/pyenv/pull/3138 * Add miniconda3-24.3.0-0 by @native-api in https://github.com/pyenv/pyenv/pull/3139 * CI: only run macos_build_bundled_dependencies and ubuntu_build_tar_gz for CPython by @native-api in https://github.com/pyenv/pyenv/pull/3141 * Add miniforge3 and mambaforge3 24.1.2-0, 24.3.0-0, 24.5.0-0, 24.7.1-0, 24.7.1-1, 24.7.1-2, 24.9.0-0, 24.9.2-0, 24.11.0-0, 24.11.0-1 by @native-api in https://github.com/pyenv/pyenv/pull/3142 * Skip broken miniforge3/mambaforge3 22.11.0-0, 22.11.0-1, 22.11.0-2 in the generation script by @native-api in https://github.com/pyenv/pyenv/pull/3143 ## Release v2.4.23 * README: explain using multiple versions by @Finkregh in https://github.com/pyenv/pyenv/pull/3126 * Support PACKAGE_CPPFLAGS and PACKAGE_LDFLAGS by @native-api in https://github.com/pyenv/pyenv/pull/3130 * Adjust suggested shell startup code to support Pyenv with Pyenv-Win in WSL by @native-api in https://github.com/pyenv/pyenv/pull/3132 * Support nonexistent versions being present and set in a local .python-version by @native-api in https://github.com/pyenv/pyenv/pull/3134 * Add CPython 3.14.0a3 by @nedbat in https://github.com/pyenv/pyenv/pull/3135 ## Release v2.4.22 * Speed up building bundled OpenSSL by @native-api in https://github.com/pyenv/pyenv/pull/3124 * CI: add building modified scripts with bundled MacOS dependencies by @native-api in https://github.com/pyenv/pyenv/pull/3123 * CL: + test modified scripts with tar.gz source by @native-api in https://github.com/pyenv/pyenv/pull/3125 * Fix 404 for openssl-3.4.0 release in build 3.13.1 by @dlamblin in https://github.com/pyenv/pyenv/pull/3122 ## Release v2.4.21 * Add CPython 3.13.1t by @makukha in https://github.com/pyenv/pyenv/pull/3120 * Prefer tcl-tk@8 from Homebrew due to release of Tcl/Tk 9 with which only 3.12+ are compatible by @native-api in https://github.com/pyenv/pyenv/pull/3118 ## Release v2.4.20 * README: Fix Markdown in "Notes about python releases" by @noelleleigh in https://github.com/pyenv/pyenv/pull/3112 * README: correct link to shell setup instructions by @shortcuts in https://github.com/pyenv/pyenv/pull/3113 * Add CPython 3.9.21, 3.10.16, 3.11.11, 3.12.8 and 3.13.1 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/3117 ## Release v2.4.19 * Add CPython 3.14.0a2 by @nedbat in https://github.com/pyenv/pyenv/pull/3110 * Add quick start section and gif demo to accompany it. by @madhu-GG in https://github.com/pyenv/pyenv/pull/3044 ## Release v2.4.18 * Add miniforge3-24.9.2-0 by @goerz in https://github.com/pyenv/pyenv/pull/3106 ## Release v2.4.17 * Add miniconda3-24.9.2-0 by @binbjz in https://github.com/pyenv/pyenv/pull/3096 * Add Anaconda3-2024.10-1 by @binbjz in https://github.com/pyenv/pyenv/pull/3097 ## Release v2.4.16 * Add GraalPy 24.1.1 by @msimacek in https://github.com/pyenv/pyenv/pull/3092 * Add CPython 3.14.0a1 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/3093 ## Release v2.4.15 * CI: replace set-output with GITHUB_OUTPUT by @tuzi3040 in https://github.com/pyenv/pyenv/pull/3079 * Make uninstall yes/no prompt consistent with others by @dpoznik in https://github.com/pyenv/pyenv/pull/3080 * Add CPython 3.13.0 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/3081 * Avoid shadowing of virtualenvs with the name starting with "python-" by @aarbouin in https://github.com/pyenv/pyenv/pull/3086 * Support free-threaded CPython flavor in prefix resolution by @native-api in https://github.com/pyenv/pyenv/pull/3090 ## Release v2.4.14 * Add CPython 3.12.7 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/3078 * Add CPython 3.13.0rc3 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/3077 ## Release v2.4.13 * docs: Use `--verbose` with performance CPython build instructions by @caerulescens in https://github.com/pyenv/pyenv/pull/3053 * Fix latest version resolution when using `python-` prefix by @edmorley in https://github.com/pyenv/pyenv/pull/3056 * Fix tgz checksum for 3.9.20; fallback OpenSSL URLs and checksums by @native-api in https://github.com/pyenv/pyenv/pull/3060 * Fix OpenSSL 3.3.2 download URLs by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/3059 * Add GraalPy 24.1.0 by @msimacek in https://github.com/pyenv/pyenv/pull/3066 ## Release v2.4.12 * Add CPython 3.13.0rc2 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/3049 * Add CPython 3.8.20, 3.9.20, 3.10.15, 3.11.10 and 3.12.6 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/3050 ## Release v2.4.11 * Add /usr/etc/pyenv.d to hooks path by @tomschr in https://github.com/pyenv/pyenv/pull/3039 * Add miniconda3-24.7.1-0 by @binbjz in https://github.com/pyenv/pyenv/pull/3040 * Add PyPy v7.3.17 by @jsirois in https://github.com/pyenv/pyenv/pull/3045 ## Release v2.4.10 * Add CPython 3.12.5 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/3030 ## Release v2.4.9 * Add miniforge3-24.3.0-0 by @goerz in https://github.com/pyenv/pyenv/pull/3028 * Add CPython 3.13.0rc1 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/3029 ## Release v2.4.8 * Fix pyenv-uninstall not having the debug tracing invocation by @native-api in https://github.com/pyenv/pyenv/pull/3020 * Add CPython 3.13.0b4 and 3.13.0b4t by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/3019 * README: Remove reference to Fig by @ThomasHaz in https://github.com/pyenv/pyenv/pull/3018 * Fix tests failing if plugins are installed by @native-api in https://github.com/pyenv/pyenv/pull/3022 * pyenv-latest: replace -q with -b and -f, document as internal by @native-api in https://github.com/pyenv/pyenv/pull/3021 ## Release v2.4.7 * Add support for anaconda3-2024.06-1 by @binbjz in https://github.com/pyenv/pyenv/pull/3009 * Fix debug build for X.Yt-dev by @native-api in https://github.com/pyenv/pyenv/pull/ ## Release v2.4.6 * CI: push MacOS jobs to MacOS 13 and 14 by @native-api in https://github.com/pyenv/pyenv/pull/3002 * Add 3.13.0b3t and exclude it from `pyenv latest` by @colesbury in https://github.com/pyenv/pyenv/pull/3001 * Speed up `pyenv prefix` by not constructing advice text when it would be discarded by @Erotemic in https://github.com/pyenv/pyenv/pull/3005 ## Release v2.4.5 * Add CPython 3.13.0b3 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2996 ## Release v2.4.4 * Add support for miniconda3 24.5.0-0 with py3.12, py3.11, py3.10, py3.9 by @binbjz in https://github.com/pyenv/pyenv/pull/2994 * Add support for free-threaded Python by @colesbury in https://github.com/pyenv/pyenv/pull/2995 ## Release v2.4.3 * Add miniconda3 24.4.0-0 by @binbjz in https://github.com/pyenv/pyenv/pull/2982 ## Release v2.4.2 * Add script to install graalpy development builds by @timfel in https://github.com/pyenv/pyenv/pull/2969 * Correct the Explanation of PATH Variable Lookup by @Y-askour in https://github.com/pyenv/pyenv/pull/2975 * Document PYTHON_BUILD_CURL_OPTS, PYTHON_BUILD_WGET_OPTS, PYTHON_BUILD_ARIA2_OPTS by @native-api in https://github.com/pyenv/pyenv/pull/2976 * Add sed and greadlink to shim exceptions by @native-api in https://github.com/pyenv/pyenv/pull/2977 * Add CPython 3.13.0b2 by @jsirois in https://github.com/pyenv/pyenv/pull/2978 * Add CPython 3.12.4 by @xxzgc in https://github.com/pyenv/pyenv/pull/2981 ## Release v2.4.1 * Add CPython 3.12.3 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2941 * Add CPython 3.13.0a6 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2942 * Add PyPy v7.3.16 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2948 * Add CPython 3.14-dev, update 3.13-dev by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2960 * Add CPython 3.13.0b1 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2959 ## Release v2.4.0 * Add CPython 3.13.0a4 by @saaketp in https://github.com/pyenv/pyenv/pull/2903 * Handle the case where `pyenv-commands --sh` returns nothing by @aphedges in https://github.com/pyenv/pyenv/pull/2908 * Document default build configuration customizations by @native-api in https://github.com/pyenv/pyenv/pull/2911 * Use Homebrew in Linux if Pyenv is installled with Homebrew by @native-api in https://github.com/pyenv/pyenv/pull/2906 * Add miniforge and mambaforge 22.11.1-3, 22.11.1-4, 23.1.0-0 to 23.11.0-0 by @aphedges in https://github.com/pyenv/pyenv/pull/2909 * Add miniconda3-24.1.2 by @binbjz in https://github.com/pyenv/pyenv/pull/2915 * Minor grammar fix in libffi backport patch in 2.5.x by @cuinix in https://github.com/pyenv/pyenv/pull/2922 * Add CPython 3.13.0a5 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2924 * Add CPython 3.8.19 and 3.9.19 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2929 * Add GraalPy 24.0.0 by @msimacek in https://github.com/pyenv/pyenv/pull/2928 * Add CPython 3.10.14 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2930 * Add Jython 2.7.3 by @cesarcoatl in https://github.com/pyenv/pyenv/pull/2936 * Add CPython 3.11.9 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2938 * Add anaconda 2024.02 by @native-api in https://github.com/pyenv/pyenv/pull/2939 ## Release v2.3.36 * Add a Dependabot config to auto-update GitHub action versions by @kurtmckee in https://github.com/pyenv/pyenv/pull/2863 * Bump the github-actions group with 1 update by @dependabot in https://github.com/pyenv/pyenv/pull/2864 * Add installation prefix to `python-config --ldflags` output by @mhaeuser in https://github.com/pyenv/pyenv/pull/2865 * Add support for miniconda3 23.11.0-1, 23.11.0-2 with py3.11, py3.10, py3.9, py3.8 by @binbjz in https://github.com/pyenv/pyenv/pull/2870 * Add micropython 1.20.0 and 1.21.0 by @cpzt in https://github.com/pyenv/pyenv/pull/2869 * Make "Automatic installer" command in the README a copy-able code block by @ryan-williams in https://github.com/pyenv/pyenv/pull/2874 * Add PyPy 7.3.14 by @dand-oss in https://github.com/pyenv/pyenv/pull/2876 * Add graalpy-23.1.2 by @msimacek in https://github.com/pyenv/pyenv/pull/2884 * Add CPython 3.13.0a3 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2885 * Add PyPy v7.3.15 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2886 * Update pypy3.9-7.3.13 checksums by @ecerulm in https://github.com/pyenv/pyenv/pull/2887 * Add CPython 3.12.2 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2899 * Add CPython 3.11.8 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2898 ## Release v2.3.35 * Add CPython 3.12.1 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2861 ## Release v2.3.34 * Fix graalpy-community to use a separate package name by @native-api in https://github.com/pyenv/pyenv/pull/2855 * Move 3.11.5+ to OpenSSL 3 by default by @native-api in https://github.com/pyenv/pyenv/pull/2858 * Add CPython 3.11.7 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2860 ## Release v2.3.33 * Add miniforge3-23.3.1-1 by @goerz in https://github.com/pyenv/pyenv/pull/2839 * Add support for miniconda3-3.11-23.10.0-1 by @binbjz in https://github.com/pyenv/pyenv/pull/2843 * Add support for miniconda3 23.10.0-1 with py3.10ã€py3.9ã€py3.8 by @binbjz in https://github.com/pyenv/pyenv/pull/2844 * Add CPython 3.13.0a2 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2849 * python-build: Document PYTHON_BUILD_HOMEBREW_OPENSSL_FORMULA and PYTHON_BUILD_HTTP_CLIENT by @native-api in https://github.com/pyenv/pyenv/pull/2853 ## Release v2.3.32 * Describe --no-rehash option in the manpage by @fsc-eriker in https://github.com/pyenv/pyenv/pull/2832 * Make adding $PYENV_ROOT/bin to PATH independent of other software by @native-api in https://github.com/pyenv/pyenv/pull/2837 * Make `pyenv init` output insertable to startup files by @native-api in https://github.com/pyenv/pyenv/pull/2838 ## Release v2.3.31 * Add new anaconda and miniconda definitions by @aphedges in https://github.com/pyenv/pyenv/pull/2824 ## Release v2.3.30 * Fix intermittent "broken pipe" in tests by @native-api in https://github.com/pyenv/pyenv/pull/2817 * Add CPython 3.13.0a1 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2818 * Add PyPy 7.3.13 by @dand-oss in https://github.com/pyenv/pyenv/pull/2807 * Fix linking against Homebrew's Tcl/Tk 8.6.13 in MacOS by @startergo in https://github.com/pyenv/pyenv/pull/2820 ## Release v2.3.29 * Add CPython 3.11.6 by @thecesrom in https://github.com/pyenv/pyenv/pull/2806 * Add GraalPy 23.1.0 definition using the faster Oracle GraalVM distribution by @eregon in https://github.com/pyenv/pyenv/pull/2812 * Install ncurses from Homebrew, if available by @aphedges in https://github.com/pyenv/pyenv/pull/2813 ## Release v2.3.28 * Prioritize 'zlib from xcode sdk' flag correctly by @native-api in https://github.com/pyenv/pyenv/pull/2791 * Prefer OpenSSL 3 in Homebrew in 3.13-dev by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2793 * Add CPython 3.12.0rc3 by @saaketp in https://github.com/pyenv/pyenv/pull/2795 * Add graalpy-23.1.0 and split between graalpy and graalpy-community by @msimacek in https://github.com/pyenv/pyenv/pull/2796 * Update the OpenSSL dependency for Python 2.7.18 by @lpapp-foundry in https://github.com/pyenv/pyenv/pull/2797 * Add CPython 3.12.0 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2804 ## Release v2.3.27 * Prefer OpenSSL 3 in Homebrew since 3.12 by @native-api in https://github.com/pyenv/pyenv/pull/2781 * Fix get-pip urls for older pypy versions by @TimPansino in https://github.com/pyenv/pyenv/pull/2788 * Update openssl url for 3.12.0rc2 by @zsol in https://github.com/pyenv/pyenv/pull/2789 ## Release v2.3.26 * Prevent `grep` warning in `conda.bash` by @aphedges in https://github.com/pyenv/pyenv/pull/2768 * fix a typo in README.md by @xzmeng in https://github.com/pyenv/pyenv/pull/2769 * use -I with ensurepip by @xaocon in https://github.com/pyenv/pyenv/pull/2764 * Add CPython 3.12.0rc2 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2778 ## Release v2.3.25 * Add CPython 3.8.18, 3.9.18, 3.10.13, 3.11.5 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2763 ## Release v2.3.24 * README update: Added UNIX reference near Automatic installer by @VictorieeMan in https://github.com/pyenv/pyenv/pull/2744 * Fix FreeBSD tests in MacOS CI by @native-api in https://github.com/pyenv/pyenv/pull/2748 * Add CPython 3.12.0rc1 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2752 * [Add an updated Anaconda and Miniconda installers](https://github.com/pyenv/pyenv/commit/db871427c7a232e18ee7a6dc0182989a646ccca9) ## Release v2.3.23 * Add CPython 3.12.0b4 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2741 * Add new anaconda and miniconda definitions by @aphedges in https://github.com/pyenv/pyenv/pull/2742 ## Release v2.3.22 * Add CPython 3.12.0b3 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2730 * Add Cinder 3.10 and Cinder configure patches by @filips123 in https://github.com/pyenv/pyenv/pull/2739 ## Release v2.3.21 * Add graalpy-23.0.0 by @msimacek in https://github.com/pyenv/pyenv/pull/2724 * Add PyPy 7.3.12 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2726 * Fix occasional 'libexec/pyenv-latest: line 39: printf: write error: Broken pipe' by @native-api in https://github.com/pyenv/pyenv/pull/2729 ## Release v2.3.20 * Backport bpo-42351 to 3.5.10 by @native-api in https://github.com/pyenv/pyenv/pull/2717 * Add missing patches for Python 3.7/3.8/3.9 by @tomkins in https://github.com/pyenv/pyenv/pull/2718 ## Release v2.3.19 * Add CPython 3.7.17, 3.8.17 and 3.9.17 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2711 * Add CPython 3.11.4 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2715 * Add CPython 3.10.12 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2714 * Add CPython 3.12.0b2 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2713 ## Release 2.3.18 * Fix not showing symlink contents for unselected versions in `pyenv versions` by @native-api in https://github.com/pyenv/pyenv/pull/2675 * Correct link in has_tar_xz_support else branch of 3.10.11 and 3.11.3 by @mirekdlugosz in https://github.com/pyenv/pyenv/pull/2677 * Fix #2682: Correct pyenv_user_setup.bash file by @tomschr in https://github.com/pyenv/pyenv/pull/2687 * fix: updating heredoc delimiter to be random and unique by @aviadhahami in https://github.com/pyenv/pyenv/pull/2691 * Support ksh alternative names by @kpschoedel in https://github.com/pyenv/pyenv/pull/2697 * Add CPython 3.12.0b1 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2701 * Update 3.12-dev and add 3.13-dev by @t0b3 in https://github.com/pyenv/pyenv/pull/2703 ## Release 2.3.17 * Try locate `readlink` first in pyenv-hooks, fix #2654 by @Harry-Chen in https://github.com/pyenv/pyenv/pull/2655 * Add CPython 3.12.0a7 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2668 * Add CPython 3.11.3 by @mirekdlugosz in https://github.com/pyenv/pyenv/pull/2671 * Add CPython 3.10.11 by @mirekdlugosz in https://github.com/pyenv/pyenv/pull/2670 ## Release 2.3.16 * Add Miniforge3-22.11.1-4 by @jlec in https://github.com/pyenv/pyenv/pull/2642 * Add Anaconda3-2023.03 by @anton-petrov in https://github.com/pyenv/pyenv/pull/2648 ## Release 2.3.15 * Add miniconda 23.1.0-1 by @aphedges in https://github.com/pyenv/pyenv/pull/2635 * Add CPython 3.12.0a6 by @saaketp in https://github.com/pyenv/pyenv/pull/2638 ## Release 2.3.14 * Fix indentation by @rafrafek in https://github.com/pyenv/pyenv/pull/2620 * Support for "BusyBox version" of "head" by @schuellerf in https://github.com/pyenv/pyenv/pull/2629 * bpo-27987 for v3.5.10 and v3.6.15: align by 16bytes on 64bit platforms by @chaimleib in https://github.com/pyenv/pyenv/pull/2630 * bpo-36231 for v3.5.10: fix Unsupported MacOS X CPU type in ffi.h by @chaimleib in https://github.com/pyenv/pyenv/pull/2633 * README: clarify behavior of `pyenv latest` by @mrienstra in https://github.com/pyenv/pyenv/pull/2634 ## Release 2.3.13 * Fix pyenv-latest to ignore virtualenvs by @native-api in https://github.com/pyenv/pyenv/pull/2608 * Show symlink contents in non-bare `pyenv versions' by @native-api in https://github.com/pyenv/pyenv/pull/2609 * Ignore virtualenvs in `pyenv latest' in a clean way by @native-api in https://github.com/pyenv/pyenv/pull/2610 * Fix link resolving in pyenv-versions by @laggardkernel in https://github.com/pyenv/pyenv/pull/2612 * Add CPython 3.11.2 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2615 * Add CPython 3.10.10 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2616 * Add CPython 3.12.0a5 by @Afront in https://github.com/pyenv/pyenv/pull/2614 ## Release 2.3.12 * Undefined name: do not forget self when accessing flavor by @cclauss in https://github.com/pyenv/pyenv/pull/2595 * Fix wrong libpython being linked to in MacOS by @native-api in https://github.com/pyenv/pyenv/pull/2596 * Fix `:latest` by @native-api in https://github.com/pyenv/pyenv/pull/2599 * Fix `pyenv which` to support auto-resolved prefixes by @native-api in https://github.com/pyenv/pyenv/pull/2601 * Add more recent build of nogil Python. by @colesbury in https://github.com/pyenv/pyenv/pull/2602 ## Release 2.3.11 * Add CPython 3.12.0a4 by @Afront in https://github.com/pyenv/pyenv/pull/2590 * Add a script to add the latest miniforge and mambaforge versions by @smcgivern in https://github.com/pyenv/pyenv/pull/2560 * Add missing Miniforge/Mambaforge versions (4.10.2-0 - 22.9.0-3) by @smcgivern in https://github.com/pyenv/pyenv/pull/2591 * Fix using dependencies from Ports in FreeBSD that are not searched with pkg-config by @native-api in https://github.com/pyenv/pyenv/pull/2593 * Fix priority for user-supplied configure and make flags by (**_only set --enable-shared if user hasn't supplied --disable-shared_**) @native-api in https://github.com/pyenv/pyenv/pull/2592 * Fix a compilation error in 3.8.10+ and 3.9.5+ when linking against Op… by @native-api in https://github.com/pyenv/pyenv/pull/2594 ## Release 2.3.10 * Remove stray newline after python-build installation by @tklauser in https://github.com/pyenv/pyenv/pull/2566 * Allow multiple versions for pyenv-install by @rockandska in https://github.com/pyenv/pyenv/pull/2568 * --enable-shared by default by @anton-petrov in https://github.com/pyenv/pyenv/pull/2554 * Fix non-bash output while detecting shell by @ianchen-tw in https://github.com/pyenv/pyenv/pull/2561 * add pypy 7.3.11 release by @dand-oss in https://github.com/pyenv/pyenv/pull/2576 * Mention how to build for maximum performance by @hauntsaninja in https://github.com/pyenv/pyenv/pull/2579 * Add miniconda 22.11.1-1 by @aphedges in https://github.com/pyenv/pyenv/pull/2583 * Add Fig as autocomplete suggestion by @brendanfalk in https://github.com/pyenv/pyenv/pull/2574 * Fix using dependencies from Ports in BSD with no pkg-config by @native-api in https://github.com/pyenv/pyenv/pull/2586 ## Release 2.3.9 * Add -latest suffix to miniforge3 by @nwh in https://github.com/pyenv/pyenv/pull/2551 * Add PyPy 7.3.10 by @dand-oss in https://github.com/pyenv/pyenv/pull/2553 * Add miniforge3 and mambaforge 22.9.0-2 by @smcgivern in https://github.com/pyenv/pyenv/pull/2559 * Fix compilation error when building OpenSSL 1.1.1q in MacOS 11+ for 3.9.16 by @lisbethw1130 in https://github.com/pyenv/pyenv/pull/2558 * Add `openssl` patches for 3.7.15, 3.7.16, and 3.8.16 by @samdoran in https://github.com/pyenv/pyenv/pull/2564 * Add support for Anaconda3-2022.10 by @huypn12 in https://github.com/pyenv/pyenv/pull/2565 ## Release 2.3.8 * Export detected shell environment in pyenv-init by @ianchen-tw in https://github.com/pyenv/pyenv/pull/2540 * Add CPython 3.12.0a3 by @saaketp in https://github.com/pyenv/pyenv/pull/2545 * Add CPython 3.11.1 by @anton-petrov in https://github.com/pyenv/pyenv/pull/2549 * Add CPython 3.10.9 by @rudisimo in https://github.com/pyenv/pyenv/pull/2544 * Add 3.7.16, 3.8.16, 3.9.16 by @chadac in https://github.com/pyenv/pyenv/pull/2550 ## Release 2.3.7 * Add Python version 3.11 to the macOS build by @jbkkd in https://github.com/pyenv/pyenv/pull/2510 * Don't use Zlib from XCode SDK if a custom compiler is used by @native-api in https://github.com/pyenv/pyenv/pull/2516 * Change line endings from CRLF to LF by @hoang-himself in https://github.com/pyenv/pyenv/pull/2517 * Fix resolution of a name that's a prefix of another name by @native-api in https://github.com/pyenv/pyenv/pull/2521 * GitHub Workflows security hardening by @sashashura in https://github.com/pyenv/pyenv/pull/2511 * Add nushell to activate list by @theref in https://github.com/pyenv/pyenv/pull/2524 * Fix compilation error when building OpenSSL 1.1.1q in MacOS 11+ for 3.9.15 and 3.8.15 by @twangboy in https://github.com/pyenv/pyenv/pull/2520 * Add simple `.editorconfig` file by @aphedges in https://github.com/pyenv/pyenv/pull/2518 * Support `aria2c` being a snap by @native-api in https://github.com/pyenv/pyenv/pull/2528 * Add CPython 3.12.0a2 by @saaketp in https://github.com/pyenv/pyenv/pull/2527 * Add --no-push-path option by @isaacl in https://github.com/pyenv/pyenv/pull/2526 * Fix typo in README.md by @weensy in https://github.com/pyenv/pyenv/pull/2535 * Copy auto installer oneliner to readme by @spookyuser in https://github.com/pyenv/pyenv/pull/2538 ## Release 2.3.6 * Add CPython 3.10.8 (#2480) * Add CPython 3.7.15, 3.8.15, and 3.9.15 (#2482) * Add CPython 3.11.0 (#2493) * Add CPython 3.12.0a1 (#2495) * Add graalpy-22.3.0 (#2497) * Auto-resolve prefixes to the latest version (#2487) * It must be a full prefix -- the actual searched prefix is `[-.]` * Other flavors are likely sorted incorrectly atm * Prereleases and versions with some suffixes (`-dev`, `-src`, `-latest`) are not searched * `pyenv uninstall` has been excluded from the resolution feature: deleting a dynamically selected installation could be problematic * Fix OpenSSL 1.1.1q compilation error in MacOS 11+ (#2500) * Link to Tcl/Tk from Homebrew via pkgconfig for 3.11+ (#2501) * Fix syntax error in `pyenv init -` if PYENV_ROOT has spaces (#2506) ## Release 2.3.5 * Add CPython 3.10.7 (#2454) * Docs: update Fish PATH update (#2449) * Add CPython 3.7.14, 3.8.14 and 3.9.14 (#2456) * Update miniconda3-3.9-4.12.0 (#2460) * Add CPython 3.11.0rc2 (#2459) * Add patches for 3.7.14 to support Apple Silicon (#2463) * Add ability to skip all use of Homebrew (#2464) * Drop Travis integration (#2468) * Build CPython 3.12+ with --with-dsymutil in MacOS (#2471) * Add Pyston 2.3.5 (#2476) ## Release 2.3.4 * Add CPython 3.11.0rc1 (#2434) * Add support for multiple versions in `pyenv uninstall` (#2432) * Add micropython 1.18 and 1.19.1 (#2443) * CI: support Micropython, deleted scripts; build with -v (#2447) * Re-allow paths in .python-version while still preventing CVE-2022-35861 (#2442) * CI: Bump OS versions (#2448) * Add Cinder 3.8 (#2433) ## Release 2.3.3 * Use version sort in `pyenv versions` (#2405) * Add CPython 3.11.0b4 (#2411) * Python-build: Replace deprecated git protocol use with https in docs (#2413) * Fix relative path traversal due to using version string in path (#2412) * Allow pypy2 and pypy3 patching (#2421, #2419) * Add CPython 3.11.0b5 (#2420) * Add GraalPython 22.2.0 (#2425) * Add CPython 3.10.6 (#2428) ## Release 2.3.2 * Add CPython 3.11.0b2 (#2380) * Honor CFLAGS_EXTRA for MicroPython #2006 (#2007) * Add post-install checks for curses, ctypes, lzma, and tkinter (#2353) * Add CPython 3.11.0b3 (#2382) * Add flags for Homebrew into `python-config --ldflags` (#2384) * Add CPython 3.10.5 (#2386) * Add Anaconda 2019.10, 2021.04, 2022.05; support Anaconda in add_miniconda.py (#2385) * Add Pyston-2.3.4 (#2390) * Update anaconda3-2022.05 MacOSX arm64 md5 (#2391) ## Release 2.3.1 * Version file read improvements (#2269) * Add CPython 3.11.0b1 (#2358) * Update 3.11-dev and add 3.12-dev (#2361) * Add CPython 3.9.13 (#2372) * Add miniconda 4.12.0 (#2371) * Fix endless loop in `pyenv init -` under SSH in some shell setups (#2374) * CI: Add tests for modified Python build scripts (#2286) ## Release 2.3.0 * Bump openssl 1.1 to 1.1.1n for CPython 3.7 3.8 3.9 (#2276) * Doc Fix: Escape a hash character causing unwanted GitHub Issue linking (#2282) * Add CPython 3.9.12 (#2296) * Add CPython 3.10.4 (#2295) * Add patch for 3.6.15 to support Xcode 13.3 (#2288) * Add patch for 3.7.12 to support Xcode 13.3 (#2292) * Add CONTRIBUTING.md (#2287) * Add PyPy 7.3.9 release 2022-03-30 (#2308) * Add Pyston 2.3.3 (#2316) * Add CPython 3.11.0a7 (#2315) * Add "nogil" Python v3.9.10 (#2342) * Support XCode 13.3 in all releases that officially support MacOS 11 (#2344) * Add GraalPython 22.1.0 (#2346) * Make PYENV_DEBUG imply -v for `pyenv install` (#2347) * Simplify init scheme (#2310) * Don't use Homebrew outside of MacOS (#2349) * Add `:latest` syntax to documentation for the `install` command (#2351) ## Release 2.2.5 * Add CPython 3.10.3 * Add CPython 3.9.11 * Add CPython 3.8.13 * Add CPython 3.7.13 * Add CPython 3.11.0a6 (#2266) * Add PyPy 7.3.8 (#2253) * Add miniconda3-3.7-4.11.0, miniconda3-3.8-4.11.0, miniconda3-3.9-4.11.0 (#2268) * Add pyston-2.3.2 (#2240) * Fix UnicodeDecodeError for CPython 3.6.15 and 3.7.12 (#2237) * python-build: add URL for get-pip for Python 3.6 (#2238) * Bump openssl to 1.1.1n for CPython 3.10.x ## Release 2.2.4 * Added docstrings to several undocumented functions (#2197) * Fix incorrect pypy 2.7-7.3.6 sha256 hashes (#2208) * Fix a regression in include paths when compiling ctypes in 3.6.15/3.7.12 (#2209) * Revert "Disable coreutils on M1 Apple Silicon with arm64 (#2020)" (#2212) * CPython 3.11.0a4 (#2217) * CPython 3.9.10 and 3.10.2 (#2219) * miniconda3-latest: added Linux-aarch64 (#2221) * Add GraalPython 22.0.0 (#2226) ## Release 2.2.3 * Add new pypy versions (pypy2.7-7.3.2~7.3.5) to the version list (#2194) * Fix Python 3.7.12 compilation on macOS arm64/M1. (#2190) * Fix Python 3.6.15 compilation on macOS arm64/M1. (#2189) * Add Anaconda3-2021.11 (#2193) * CPython 3.11.0a3 (#2187) * Fix errant "echo" in README install instructions (#2185) * Add Miniforge and Mambaforge 4.10.3-10 (#2184) * Add CPython 3.10.1 (#2183) * Fix 3.6.15 build on macOS (#2182) ## Release 2.2.2 * Add support for macOS Apple M1 (#2164) ## Release 2.2.1 * Add CPython 3.9.9 (#2162) * Add CPython 3.9.8 (#2152) * Add Add micropython 1.17 (#2158) * Add Add micropython 1.16 (#2158) * Patch 3.10.0 configure, fixes https://bugs.python.org/issue45350 (#2155) * Use command and type instead of which (#2144) * Add definition of pyenv help in COMMANDS.md #2139 * Use OpenSSL 1.0 for CPython 2.7.18 ## Release 2.2.0 * Adding PyPy release 7.3.7 (Python 3.7 and 3.8). (#2132) * Append Homebrew custom prefix to search path (#1957) * Add documentation for init command (#2125) * Add setup instructions for the case when one installs Pyenv as part of a batch job (#2127) * Add documentation for completions command (#2126) * Default --with-universal-archs to universal2 on Apple Silicon (#2122) * Update README.md (#2120) * Add GraalPython 21.3.0 (#2117) * Pypy ver 7.3.6 - python 3.7 and python 3.8 (#2111) * Discover Tcl/Tk reliably and use active version (#2106) * Fish installation instructions (#2104) * Add CPython 3.11.0a1 (#2099) ## Release 2.1.0 * Fix mambaforge-pypy3 build (#2096) * Add Python 3.10.0 (#2093) * Add documentation for exec command (#2090) * Add documentation for shims command (#2091) * Add documentation for hooks command (#2089) * Add documentation for root command (#2088) * Add documentation for prefix command (#2087) * Update to Pyston's v2 package of the 2.3.1 release (#2078) * Add pyston-2.3.1 support (#2075) * Don't update conda when installing pip (#2074) * Improve `add_miniconda.py` (#2072) * GitHub actions tests (#2073) * Fix sed commands (#2071) * macOS: fix the build of Python 2.7.18 on macOS 11.5.2 (Big Sur) + Apple Silicon (#2061) ## Release 2.0.7 * Update setup instructions in the Readme (#2067) * Allow tcl-tk as argument or try with homebrew by default (#1646) * Allow system Python in sbin (#2065) * Prevent addition of duplicate plugin dirs to PATH (#2045) * Disable coreutils on M1 Apple Silicon with arm64 (#2020) * Add Python 3.10.0rc2 (#2053) * Add space after `yes/no` prompt (#2040) * Add CPython v3.6.15 and v3.7.12 (#2052) * Add missing Python 2.6.x definitions and patches (#2051) * Fix build of ossaudiodev in Linux/FreeBSD for Python 2.6 (#2049) * Fix build of ossaudiodev in Linux/FreeBSD for Python 3.1 (#2047) ## Release 2.0.6 * Add CPython 3.9.7 (#2044) * Add CPython v3.8.12 (#2043) * Adapt conda.bash for bash associative array (#2037) ## Release 2.0.5 * Move man page to location where it can be automatically found by man (#2032) * Update checksums for CPython 3.10.0rc1 (#2025) * Remove 3.9.3 (#2022) * Add CPython 3.10.0rc1(#2023) ## Release 2.0.4 - Added scripts for rolling releases of Miniforge (#2019) - Update pyston-2.3 (#2017) - Add GraalPython 21.2.0 (#2018) - Add CPython 3.10.0b4 (#2013), (#2005) - Add Pyston 2.3 (#2012) ## Release 2.0.3 * Remove PATH warning (#2001) * Add Python 3.6.14, 3.7.11, 3.8.11, and 3.9.6 (#1996) * Miniforge minor update to 4.10.1-5 (#1992) * Suggest that fish users init in interactive mode (#1991) ## Release 2.0.2 * Miniforge minor update to 4.10.1-5 (#1992) * Suggest that fish users init in interactive mode (#1991) * Add 3.10.0b3 (#1988) * Revert "Drop inferring version to install from `pyenv local`" (#1984) * Use system Python3 for tests (#1979) * Check for shims in path with pure Bash (#1978) * Update setup instructions for debian, ubuntu etc. (#1977) ## Release 2.0.1 * Drop inferring version to install from `pyenv local` (#1907) * Create mambaforge-4.10.1-4 (#1971) * Add 3.10.0b2 recipe (#1966) * Fix .bashrc `echo` install syntax error (#1965) * Add explicit Zsh instructions for MacOS (#1964) * Install pip with pyston (#1955) * Mention log file if an error happened before building, too (#1537) * Add pypy3.7-7.3.5 (#1950) ## Release 2.0.0 * Support for CPython 3.9.5 has been added. * Support for CPython 3.8.10 has been added. * Support for CPython 3.10.0b1 has been added. * Support for GraalPython 21.1.0 has been added. * Support for Anaconda 2021.05 has been added. * Support for Miniforge3 4.10.1-1 has been added. * CPython 3.10-dev target branch renamed. * CPython 3.10-dev and 3.11-dev updated. * Bump OpenSSL to 1.1.1x for all Pythons that support MacOS 11 * Update generated configuration files before run ./configure * Full shell configuration instructions placed into `pyenv init` * Prevent build from installing MacOS apps globally * ldflags_dirs is not needed for Python and causes failures * Report cache filename at download * Add micropython 1.15 * Correct URLs for Stackless builds and add Stackless 2.7.16 ## Breaking changes * Split startup logic into PATH and everything else (https://github.com/pyenv/pyenv/issues/1649#issuecomment-694388530) ## 1.2.27 * Add GraalPython 21.1.0 (#1882) * Add CPython 3.10.0a7 (#1880) * Docs(README): fix info about version-file separator (#1874) * List versions starting with a dot (#1350) * Feat: support (skip) commented lines in version-file (#1866) * pypy3.7-7.3.4 (#1873) * Create miniforge3-4.10 (#1868) * Add CPython 3.9.4 (#1865) ## 1.2.26 * Add CPython 3.9.4 (#1865) ## 1.2.25 * bpo-43631: update to openssl 1.1.1k (#1861) * Add CPython 3.9.3 and 3.8.9 (#1859) * Add micropython 1.14 (#1858) * Shell detect improvements (#1835) * Test(init): remove misleading detect from parent shell case arg (#1856) * Add GraalPython 21.0.0 (#1855) ## 1.2.24 * GitHub Actions: Add $PYENV_ROOT/shims to $PATH (#1838) * Add Python 3.10.0a6 (#1839) * Remove the "Using script's directory as PYENV_DIR if shim is invoked with a script argument" feature (#1814) * Update GET_PIP_URL (#1844) * GitHub Action to build Python versions on Ubuntu (#1794) * Make work in nounset (-u) mode (#1786) * Update miniforge3-4.9.2 (#1834) * Added aarch64 for Linux in anaconda_architecture() (#1833) * Hook script to add latest suffix for install command (#1831) * Fix error link (#1832) * Clarify proxy variable names in readme (#1830) * Travis CI: Add Xcode 12 on macOS 10.15.5 (#1708) * Added --nosystem argument (#1829) * Add CPython 3.8.8 (#1825) * Add CPython 3.9.2 (#1826) * Add manpage (#1790) ## 1.2.23 + python-build: Add CPython v3.7.10 (#1818) + python-build: Add CPython v3.6.13 (#1817) * python-build: Add PyPy 3.7-c-jit-latest (#1812) * python-build: Add PyPy 3.7 (#1718, #1726, #1780) * python-build: Add miniconda3 4.9.2 (#1763) * python-build: Add miniconda3 4.8.3 (#1763) * python-build: Add miniconda3 4.8.2 (#1763) * python-build: Add Miniforge3-4.9.2 (#1782) * python-build: Fix download links for some PyPy and Stackless versions (#1692) * python-build: Add PYENV_DEBUG option (#1806) * python-build: Fix get-pip which dropped support for legacy Python (#1793) * pyenv-help: Fix `sed: RE error: illegal byte sequence` (#1714) * pyenv-versions: Fix not printing asterisk for current version in Bash 3 (#1815) * pyenv-prefix: "system" python - support cases where python3 is in PATH but not python (#1655) * pyenv-which: Added fallback to system executable (#1797) * pyenv-rehash: Use associative arrays for better performance on bash >= 4 (#1749) * pyenv-rehash: Try to sleep in 0.1 sec steps when acquiring lock (#1798) * pyenv: Use a better PS4 as recommended by Bash Hackers Wiki (#1810) ## 1.2.22 + python-build: Add LDFLAGS for zlib on macOS >= 1100 (#1711) + python-build: Add the CPython 3.9.1 (#1752) + python-build: Change order of LDFLAGS paths (#1754) + python-build: Docker config for testing python-build (#1548) + python-build: Put prerequisite for installation before install (#1750) + python-build: Add GraalPython 20.3 (#1736) + python-build: Add CPython 3.8.7 + python-build: Added anaconda3-2020.11 (#1774) + python-build: Added arm64 architecture support in python-build for macOS (#1775) ## 1.2.21 * python-build: Add CPython 3.9.0 (#1706) * python-build: Add CPython 3.8.6 (#1698) * python-build: Add CPython 3.7.9 (#1680) * python-build: Add CPython 3.6.12 (#1680) * python-build: Add CPython 3.5.10 (#1690) * python-build: Add Jython 2.7.2 (#1672) * python-build: Add Graalpython 20.1.0 (#1594) * python-build: Add Graalpython 20.2.0 (#1594) * python-build: Add Anaconda3-2020.07 (#1684) * python-build: Add micropython-1.13 (#1704) * python-build: Fix PyPy download links (#1682) * python-build: Support for `PYTHON_BUILD_MIRROR_URL` when checksums do not exist (#1673) * pyenv: Search for plugins in `PYENV_DIR` and `PYENV_ROOT` (#1697) * pyenv-help: Fix 'sed: RE error: illegal byte sequence' (#1670) ## 1.2.20 * python-build: Add CPython 3.8.5 (#1667) * python-build: Add CPython 3.8.4 (#1658) * python-build: Add CPython 3.7.8 * python-build: Add CPython 3.6.11 * pyenv-install: Make grep detection more robust (#1663) * python-build: Fix has_tar_xz_support function on FreeBSD. (#1652) ## 1.2.19 * python-build: Add CPython 3.8.3 (#1612) * python-build: Add CPython 2.7.18 (#1593) * python-build: Add CPython 3.10-dev (#1619) * python-build: Add anaconda3-2020.02 (#1584) * python-build: Add stackless 3.7.5 (#1589) ## 1.2.18 * python-build: Update download URLs for old OpenSSL releases (#1578) * python-build: Prevent `brew: command not found` messages that are not errors (#1544) ## 1.2.17 * python-build: Add CPython 3.8.2 * python-build: Add CPython 3.7.7 (#1553) * python-build: Add Miniconda versions newer than 4.3.30 (#1361) * python-build: Add Micropython 1.12 (#1542) * python-build: Add Add CPython 3.9.0a4 * pyenv: Fix sed illegal byte sequence error (#1521) ## 1.2.16 * python-build: Add CPython 3.8.1 (#1497) * python-build: Add CPython 3.7.6 (#1498) * python-build: Add CPython 3.6.10 (#1499) * python-build: Add CPython 3.5.9 (#1448) * python-build: Add PyPy 7.3.0 (1502) ## 1.2.15 * python-build: Add CPython 3.7.5 (#1423) * python-build: Add CPython 2.7.17 (#1433) * python-build: Add CPython 3.5.8 (#1441) * python-build: Add PyPy 7.2.0 (#1418) * python-build: Add anaconda3-2019.10 (#1427) * pyenv-help: Show text for all pyenv commands in pyenv-help (#1421) ## 1.2.14 * python-build: Add CPython 3.8.0 (#1416) * python-build: Add Anaconda-2019.07 (#1382) * python-build: Add Micropython 1.11 (#1395) * python-build: Fix compatibility issues with Homebrew installed Tcl/Tk (#1397) * pyenv-exec: Do not use `exec -a`, do not mangle PATH for system Python (#1169) ## 1.2.13 * python-build: Add CPython 3.7.4 * python-build: Add CPython 3.6.9 ## 1.2.12 * python-build: Find zlib from Xcode or brew on Mojave (#1353) * python-build: Add PyPy 7.1.1 (#1335) * python-build: Add CPython 3.8.0b1 ## 1.2.11 * python-build: Fix `posix_close` name collision in 2.4 builds (#1321) * python-build: Add CPython 3.4.10 (#1322) * python-build: Add Anaconda 2019.03 * python-build: Allow overriding the preference of OpenSSL version per definition basis (#1302, #1325, #1326) * python-build: Imported changes from rbenv/ruby-build 20190401 (#1327) * python-build: Use GNU Readline 8.0 on macOS if brew's package isn't available (#1329) ## 1.2.10 * python-build: Force y, Y, yes or YES to confirm installation (#1217) * python-build: Add PyPy 7.0.0, 7.1.0 * python-build: Add CPython 2.7.16, 3.5.7 and 3.7.3 * python-build: Install `python-gdb.py` (#1190, #1289) * python-build: Add micropython 1.10 * python-build: Prefer Homebrew's OpenSSL 1.1 over 1.0 (#839, #1302) ## 1.2.9 * python-build: Add CPython 3.7.2 and CPython 3.6.8 (#1256) * python-build: Add anaconda[23]-5.3.1 (#1246) * python-build: Add Anaconda 2018.12 (#1259) * python-build: Fix ironpython-dev git repo url (#1260) * python-build: Add `OPENSSL_NO_SSL3` patch for CPython 3.3.7 (#1263) ## 1.2.8 * python-build: Add CPython 3.7.1 * python-build: Add CPython 3.6.7 * python-build: Add anaconda[23]-5.3.0 (#1220) ## 1.2.7 * python-build: Add CPython 3.5.6 (#1199) * python-build: Add CPython 3.4.9 ## 1.2.6 * python-build: Added CPython 3.6.6 (#1178) * python-build: Check wget version iff wget is going to be used (#1180) ## 1.2.5 * python-build: Add CPython 3.7.0 (#1177) * python-build: Add micropython 1.9.4 (#1160) * python-build: Add anaconda[23]-5.2.0 (#1165) * pyenv: Fix `seq(1)` is not available on OpenBSD (#1166) ## 1.2.4 * python-build: Add CPython 2.7.15 * python-build: Add PyPy 6.0.0 * python-build: Allow overriding HTTP client type based on environment variable `PYTHON_BUILD_HTTP_CLIENT` (#1126) * python-build: Use version-specific `get-pip.py` when installing 2.6 and 3.2 (#1131) * pyenv: Merge rbenv master (#1151) * pyenv: Make `pyenv-rehash` safer for multiple processes (#1092) ## 1.2.3 * python-build: Add CPython 3.6.5 * python-build: Set openssl PKG_CONFIG_PATH for python 3.7 (#1117) * python-build: Add ActivePython versions 2.7.14, 3.5.4, 3.6.0 (#1113) * python-build: Unset `PIP_VERSION` before invoking `get-pip.py` as a workaround for `invalid truth value` error (#1124) ## 1.2.2 * python-build: Add PyPy3 5.10.1 (#1084) * python-build: Add CPython 3.5.5 (#1090) * python-build: Add Anaconda[23]-5.1.0 (#1100) * python-build: Fix checksum issue for CPython 3.4.8 (#1094) * python-build: Prevent Anaconda from installing a `clear` shim (#1084) ## 1.2.1 * python-build: Add CPython 3.6.4 * python-build: Add PyPy[23] 5.10 ## 1.2.0 * python-build: Import changes from ruby-build v20171031 (#1026) * python-build: Ignore LibreSSL bundled with macOS 10.13 (#1025) * python-build: Skip passing `--enable-unicode` to CPython 3.3+ (#912) * python-build: Add CPython 3.3.7 (#1053) * python-build: Add micropython 1.9.3 * python-build: Add PyPy 5.9.0 * python-build: Add Miniconda[23] 4.3.14, 4.3.21, 4.3.27, 4.3.30 * python-build: Add Anaconda[23] 5.0.1 * python-build: Update Anaconda[23] 5.0.0 to 5.0.0.1 bugfix release ## v1.1.5 * python-build: Add CPython 3.6.3 * python-build: Add CPython 3.7.0a1 * python-build: Add Anaconda[23] 5.0.0 ## v1.1.4 * pyenv: Workaround for scripts in `$PATH` which needs to be source'd (#100, #688, #953) * python-build: Add support for PyPy3 executables like `libpypy3-c.so` (#955, #956) * python-build: Add CPython 2.7.14, 3.4.7, 3.5.4 (#965, #971, #980) * python-build: Add Jython 2.7.1 (#973) ## v1.1.3 * python-build: Add CPython 3.6.2 (#951) ## v1.1.2 * pyenv: Fix incorrect `pyenv --version` output in v1.1.1 (#947) ## v1.1.1 * python-build: Update links to Portable Pypy 5.8-1 bugfix release, affects pypy2.7-5.8.0 and pypy3.5-5.8.0 definitions (#939) ## v1.1.0 * python-build: Add PyPy 5.7.1 (#888) * pyenv: Merge rbenv master (#927) * python-build: Add PyPy 5.8.0 (#932) * python-build: Anaconda[23] 4.4.0 * python-build: Add micropython-dev ## 1.0.10 * python-build: Add Anaconda2/Anaconda3 4.3.1 (#876) * python-build: Make miniconda-latest point to miniconda2-latest (#881) * python-build: Fix typo in MacOS packages for anaconda2-4.3.0/4.2.0 (#880) ## 1.0.9 * pyenv: Migrate project site from https://github.com/yyuu/pyenv to https://github.com/pyenv/pyenv * python-build: Add PyPy2 5.7.0 (#872, #868) * python-build: Add PyPy3 5.7.0-beta (#871, #869) * python-build: Add CPython 3.6.1 (#873) * python-build: Add Pyston 0.6.1 (#859) * python-build: Change default mirror site URL from https://yyuu.github.io/pythons to https://pyenv.github.io/pythons * python-build: Upgrade OpenSSL from 1.0.2g to 1.0.2k (#850) ## 1.0.8 * pyenv: Fix fish subcommand completion (#831) * python-build: Add Anaconda2/Anaconda3 4.3.0 (#824) * python-build: Use CPython on GitHub as the source repository of CPython development versions (#836, #837) * python-build: Fix checksum verification issue on the platform where OpenSSL isn't available (#840) ## 1.0.7 * python-build: Add CPython 3.5.3 (#811) * python-build: Add CPython 3.4.6 (#812) * python-build: Fix tar.gz checksum of CPython 3.6.0 (#793) * python-build: Jython installer workaround (#800) * python-build: Disable optimization (`-O0`) when `--debug` was specified (#808) ## 1.0.6 * python-build: Add CPython 3.6.0 (#787) ## 1.0.5 * python-build: Add CPython 2.7.13 (#782) * python-build: Add CPython 3.6.0rc2 (#781) * python-build: Add Anaconda 4.2.0 (#774) * python-build: Add Anaconda3 4.2.0 (#765) * python-build: Add IronPython 2.7.7 (#755) ## 1.0.4 * python-build: Add PyPy 5.6.0 (#751) * python-build: Add PyPy3 3.5 nightlies (`pypy3.5-c-jit-latest` #737) * python-build: Add Stackless 2.7.12 (#753) * python-build: Add Stackless 2.7.11 * python-build: Add Stackless 2.7.10 * python-build: Add Pyston 0.6.0 * python-build: Add CPython 3.6.0b4 (#762) ## 1.0.3 * python-build: Add CPython 3.6.0b3 (#731, #744) * python-build: Add PyPy3.3 5.5-alpha (#734, #736) * python-build: Stop specifying `--enable-unicode=ucs4` on OS X (#257, #726) * python-build: Fix 3.6-dev and add 3.7-dev (#729, #730) * python-build: Add a patch for https://bugs.python.org/issue26664 (#725) * python-build: Add Pyston 0.5.1 (#718) * python-build: Add Stackless 3.4.2 (#720) * python-build: Add IronPython 2.7.6.3 (#716) * python-build: Add Stackless 2.7.9 (#714) ## 1.0.2 * python-build: Add CPython 3.6.0b1 (#699) * python-build: Add anaconda[23] 4.1.1 (#701, #702) * python-build: Add miniconda[23] 4.1.11 (#703, #704, #706) * python-build: Remove `bin.orig` if exists to fix an issue with `--enable-framework` (#687, #700) ## 1.0.1 * python-build: Add CPython 3.6.0a4 (#673) * python-build: Add PyPy2 5.4, 5.4.1 (#683, #684, #695, #697) * python-build: Add PyPy Portable 5.4, 5.4.1 (#685, #686, #696) * python-build: Make all HTTP source URLs to HTTPS (#680) ## 1.0.0 * pyenv: Import latest changes from rbenv as of Aug 15, 2016 (#669) * pyenv: Add workaround for system python at `/bin/python` (#628) * python-build: Import changes from ruby-build v20160602 (#668) ## 20160726 * python-build: pypy-5.3.1: Remove stray text (#648) * python-build: Add CPython 3.6.0a3 (#657) * python-build: Add anaconda[23]-4.1.0 * pyenv: Keep using `.tar.gz` archives if tar doesn't support `-J` (especially on BSD) (#654, #663) * pyenv: Fixed conflict between pyenv-virtualenv's `rehash` hooks of `envs.bash` * pyenv: Write help message of `sh-*` commands to stdout properly (#650, #651) ## 20160629 * python-build: Added CPython 2.7.12 (#645) * python-build: Added PyPy 3.5.1 (#646) * python-build: Added PyPy Portable 5.3.1 ## 20160628 * python-build: Added PyPy3.3 5.2-alpha1 (#631) * python-build: Added CPython 2.7.12rc1 * python-build: Added CPython 3.6.0a2 (#630) * python-build: Added CPython 3.5.2 (#643) * python-build: Added CPython 3.4.5 (#643) * python-build: Added PyPy2 5.3 (#626) * pyenv: Skip creating shims for system executables bundled with Anaconda rather than ignoring them in `pyenv-which` (#594, #595, #599) * python-build: Configured GCC as a requirement to build CPython prior to 2.4.4 (#613) * python-build: Use `aria2c` - ultra fast download utility if available (#534) ## 20160509 * python-build: Fixed wrong SHA256 of `pypy-5.1-linux_x86_64-portable.tar.bz2` (#586, #587) * python-build: Added miniconda[23]-4.0.5 * python-build: Added PyPy (Portable) 5.1.1 (#591, #592, #593) ## 20160422 * python-build: Added PyPy 5.1 (#579) * python-build: Added PyPy 5.1 Portable * python-build: Added PyPy 5.0.1 (#558) * python-build: Added PyPy 5.0.1 Portable * python-build: Added PyPy 5.0 Portable * python-build: Added anaconda[23]-4.0.0 (#572) * python-build: Added Jython 2.7.1b3 (#557) ## 20160310 * python-build: Add PyPy-5.0.0 (#555) * pyenv: Import recent changes from rbenv 1.0 (#549) ## 20160303 * python-build: Add anaconda[23]-2.5.0 (#543) * python-build: Import recent changes from ruby-build 20160130 * python-build: Compile with `--enable-unicode=ucs4` by default for CPython (#257, #542) * python-build: Switch download URL of Continuum products from HTTP to HTTPS (#543) * python-build: Added pypy-dev special case in pyenv-install to use py27 (#547) * python-build: Upgrade OpenSSL to 1.0.2g (#550) ## 20160202 * pyenv: Run rehash automatically after `conda install` * python-build: Add CPython 3.4.4 (#511) * python-build: Add anaconda[23]-2.4.1, miniconda[23]-3.19.0 * python-build: Fix broken build definitions of CPython/Stackless 3.2.x (#531) ### 20151222 * pyenv: Merge recent changes from rbenv as of 2015-12-14 (#504) * python-build: Add a `OPENSSL_NO_SSL3` patch for CPython 2.6, 2.7, 3.0, 3.1, 3.2 and 3.3 series (#507, #511) * python-build: Stopped using mirror at pyenv.github.io for CPython since http://www.python.org is on fast.ly ### 20151210 * pyenv: Add a default hook for Anaconda to look for original `$PATH` (#491) * pyenv: Skip virtualenv aliases on `pyenv versions --skip-aliases` (pyenv/pyenv-virtualenv#126) * python-build: Add CPython 2.7.11, 3.5.1 (#494, #498) * python-build: Update OpenSSL to 1.0.1q (#496) * python-build: Adding SSL patch to build 2.7.3 on Debian (#495) ### 20151124 * pyenv: Import recent changes from rbenv 5fb9c84e14c8123b2591d22e248f045c7f8d8a2c * pyenv: List anaconda-style virtual environments as a version in pyenv (#471) * python-build: Import recent changes from ruby-build v20151028 * python-build: Add PyPy 4.0.1 (#489) * python-build: Add `miniconda*-3.18.3` (#477) * python-build: Add CPython 2.7.11 RC1 ### 20151105 * python-build: Add anaconda2-2.4.0 and anacondaa3-2.4.0 * python-build: Add Portable PyPy 4.0 (#472) ### 20151103 * python-build: Add PyPy 4.0.0 (#463) * python-build: Add Jython 2.7.1b2 * python-build: Add warning about setuptools issues on CPython 3.0.1 on OS X (#456) ### 20151006 * pyenv: Different behaviour when invoking .py script through symlink (#379, #404) * pyenv: Enabled Gitter on the project (#436, #444) * python-build: Add Jython 2.7.1b1 * python-build: Install OpenSSL on OS X if no proper version is available (#429) ### 20150913 * python-build: Add CPython 3.5.0 * python-build: Remove CPython 3.5.0 release candidates * python-build: Fixed anaconda3 repo's paths (#439) * python-build: Add miniconda-3.16.0 and miniconda3-3.16.0 (#435) ### 20150901 * python-build: Add CPython 3.5.0 release candidates; 3.5.0rc1 and 3.5.0rc2 * python-build: Disabled `_FORTITY_SOURCE` to fix CPython >= 2.4, <= 2.4.3 builds (#422) * python-build: Removed CPython 3.5.0 betas * python-build: Add miniconda-3.10.1 and miniconda3-3.10.1 (#414) * python-build: Add PyPy 2.6.1 (#433) * python-build: Add PyPy-STM 2.3 and 2.5.1 (#428) * python-build: Ignore user's site-packages on ensurepip/get-pip (#411) * pyenv: Import recent changes from ruby-build v20150818 #### 20150719 * python-build: Add CPython `3.6-dev` (#413) * python-build: Add Anaconda/Anaconda3 2.3.0 * python-build: Fix download URL of portable PyPy 2.6 (fixes #389) * python-build: Use custom `MACOSX_DEPLOYMENT_TARGET` if defined (#312) * python-build: Use original CPython repository instead of mirror at bitbucket.org as the source of `*-dev` versions (#409) * python-build: Pin pip version to 1.5.6 for python 3.1.5 (#351) #### 20150601 * python-build: Add PyPy 2.6.0 * python-build: Add PyPy 2.5.1 portable * python-build: Add CPython 3.5.0 beta releases; 3.5.0b1 and 3.5.0b2 * python-build: Removed CPython 3.5.0 alpha releases * python-build: Fix inverted condition for `--altinstall` of ensurepip (#255) * python-build: Skip installing `setuptools` by `ez_setup.py` explicitly (fixes #381) * python-build: Import changes from ruby-build v20150519 #### 20150524 * pyenv: Improve `pyenv version`, if there is one missing (#290) * pyenv: Improve pip-rehash to handle versions in command, like `pip2` and `pip3.4` (#368) * python-build: Add CPython release; 2.7.10 (#380) * python-build: Add Miniconda/Miniconda3 3.9.1 and Anaconda/Anaconda3 2.2.0 (#375, #376) #### 20150504 * python-build: Add Jython 2.7.0 * python-build: Add CPython alpha release; 3.5.0a4 * python-build: Add CPython 3.1, 3.1.1, and 3.1.2 * python-build: Fix pip version to 1.5.6 for CPython 3.1.x (#351) #### 20150326 * python-build: Add Portable PyPy binaries from https://github.com/squeaky-pl/portable-pypy (#329) * python-build: Add CPython alpha release; 3.5.0a2 (#328) * python-build: Add pypy-2.5.1 (fixes #338) * pyenv: Import recent changes from rbenv 4d72eefffc548081f6eee2e54d3b9116b9f9ee8e #### 20150226 * python-build: Add CPython release; 3.4.3 (#323) * python-build: Add CPython alpha release; 3.5.0a1 (#324) * python-build: Add Miniconda/Miniconda3 3.8.3 (#318) #### 20150204 * python-build: Add PyPy 2.5.0 release (#311) * python-build: Add note about `--enable-shared` and RPATH (#217) * python-build: Fix regression of `PYTHON_MAKE_INSTALL_TARGET` and add test (#255) * python-build: Symlink `pythonX.Y-config` to `python-config` if `python-config` is missing (#296) * python-build: Latest `pip` can't be installed into `3.0.1` (#309) #### 20150124 * python-build: Import recent changes from ruby-build v20150112 * python-build: Prevent adding `/Library/Python/X.X/site-packages` to `sys.path` when `--enable-framework` is enabled on OS X. Thanks @s1341 (#292) * python-build: Add new IronPython release; 2.7.5 #### 20141211 * pyenv: Add built-in `pip-rehash` feature. You don't need to install [pyenv-pip-rehash](https://github.com/pyenv/pyenv-pip-rehash) anymore. * python-build: Add new CPython release; 2.7.9 (#284) * python-build: Add new PyPy releases; pypy3-2.4.0, pypy3-2.4.0-src (#277) * python-build: Add build definitions of PyPy nightly build #### 20141127 * python-build: Add new CPython release candidates; 2.7.9rc1 (#276) #### 20141118 * python-build: Fix broken `setup_builtin_patches` (#270) * python-build: Add a patch to allow building 2.6.9 on OS X 10.9 with `--enable-framework` (#269, #271) #### 20141106 * pyenv: Optimize pyenv-which. Thanks to @blueyed (#129) * python-build: Add Miniconda/Miniconda3 3.7.0 and Anaconda/Anaconda3 2.1.0 (#260) * python-build: Use HTTPS for mirror download URLs (#262) * python-build: Set `rpath` for `--shared` build of PyPy (#244) * python-build: Support `make altinstall` when building CPython/Stackless (#255) * python-build: Import recent changes from ruby-build v20141028 (#265) #### 20141012 * python-build: Add new CPython releases; 3.2.6, 3.3.6 (#253) #### 20141011 * python-build: Fix build error of Stackless 3.3.5 on OS X (#250) * python-build: Add new Stackless releases; stackless-2.7.7, stackless-2.7.8, stackless-3.4.1 (#252) #### 20141008 * python-build: Add new CPython release; 3.4.2 (#251) * python-build: Add new CPython release candidates; 3.2.6rc1, 3.3.6rc1 (#248) #### 20140924 * pyenv: Fix an unintended behavior when user does not have write permission on `$PYENV_ROOT` (#230) * pyenv: Fix a zsh completion issue (#232) * python-build: Add new PyPy release; pypy-2.4.0, pypy-2.4.0-src (#241) #### 20140825 * pyenv: Fix zsh completion with multiple words (#215) * python-build: Display the package name of `hg` as `mercurial` in message (#212) * python-build: Unset `PIP_REQUIRE_VENV` during build (#216) * python-build: Set `MACOSX_DEPLOYMENT_TARGET` from the product version of OS X (#219, #220) * python-build: Add new Jython release; jython2.7-beta3 (#223) #### 20140705 * python-build: Add new CPython release; 2.7.8 (#201) * python-build: Support `SETUPTOOLS_VERSION` and `PIP_VERSION` to allow installing specific version of setuptools/pip (#202) #### 20140628 * python-build: Add new Anaconda releases; anaconda-2.0.1, anaconda3-2.0.1 (#195) * python-build: Add new PyPy3 release; pypy3-2.3.1 (#198) * python-build: Add ancient CPython releases; 2.1.3, 2.2.3, 2.3.7 (#199) * python-build: Use `ez_setup.py` and `get-pip.py` instead of installing them from tarballs (#194) * python-build: Add support for command-line options to `ez_setup.py` and `get-pip.py` (#200) #### 20140615 * python-build: Update default setuptools version (4.0.1 -> 5.0) (#190) #### 20140614 * pyenv: Change versioning schema (`v0.4.0-YYYYMMDD` -> `vYYYYMMDD`) * python-build: Add new PyPy release; pypy-2.3.1, pypy-2.3.1-src * python-build: Create symlinks for executables with version suffix (#182) * python-build: Use SHA2 as default digest algorithm to verify downloaded archives * python-build: Update default setuptools version (4.0 -> 4.0.1) (#183) * python-build: Import recent changes from ruby-build v20140524 (#184) #### 0.4.0-20140602 * python-build: Add new Anaconda/Anaconda3 releases; anaconda-2.0.0, anaconda3-2.0.0 (#179) * python-build: Add new CPython release; 2.7.7 (#180) * python-build: Update default setuptools version (3.6 -> 4.0) (#181) * python-build: Respect environment variables of `CPPFLAGS` and `LDFLAGS` (#168) * python-build: Support for xz-compressed Python tarballs (#177) #### 0.4.0-20140520 * python-build: Add new CPython release; 3.4.1 (#170, #171) * python-build: Update default pip version (1.5.5 -> 1.5.6) (#169) #### 0.4.0-20140516 * pyenv: Prefer gawk over awk if both are available. * python-build: Add new PyPy release; pypy-2.3, pypy-2.3-src (#162) * python-build: Add new Anaconda release; anaconda-1.9.2 (#155) * python-build: Add new Miniconda releases; miniconda-3.3.0, minoconda-3.4.2, miniconda3-3.3.0, miniconda3-3.4.2 * python-build: Add new Stackless releases; stackless-2.7.3, stackless-2.7.4, stackless-2.7.5, stackless-2.7.6, stackless-3.2.5, stackless-3.3.5 (#164) * python-build: Add IronPython versions (setuptools and pip will work); ironpython-2.7.4, ironpython-dev * python-build: Add new Jython beta release; jython-2.7-beta2 * python-build: Update default setuptools version (3.4.1 -> 3.6) * python-build: Update default pip version (1.5.4 -> 1.5.5) * python-build: Update GNU Readline (6.2 -> 6.3) * python-build: Import recent changes from ruby-build v20140420 #### 0.4.0-20140404 * pyenv: Reads only the first word from version file. This is as same behavior as rbenv. * python-build: Fix build of Tkinter with Tcl/Tk 8.6 (#131) * python-build: Fix build problem with Readline 6.3 (#126, #131, #149, #152) * python-build: Do not exit with errors even if some of modules are absent (#131) * python-build: MacOSX was misspelled as MaxOSX in `anaconda_architecture` (#136) * python-build: Use default `cc` as the C Compiler to build CPython (#148, #150) * python-build: Display value from `pypy_architecture` and `anaconda_architecture` on errors (pyenv/pyenv-virtualenv#18) * python-build: Remove old development version; 2.6-dev * python-build: Update default setuptools version (3.3 -> 3.4.1) #### 0.4.0-20140317 * python-build: Add new CPython releases; 3.4.0 (#133) * python-build: Add new Anaconda releases; anaconda-1.9.0, anaconda-1.9.1 * python-build: Add new Miniconda releases; miniconda-3.0.4, miniconda-3.0.5, miniconda3-3.0.4, miniconda3-3.0.5 * python-build: Update default setuptools version (3.1 -> 3.3) #### 0.4.0-20140311 * python-build: Add new CPython releases; 3.3.5 (#127) * python-build: Add new CPython release candidates; 3.4.0rc1, 3.4.0rc2, 3.4.0rc3 * python-build: Update default setuptools version (2.2 -> 3.1) * python-build: Update default pip version (1.5.2 -> 1.5.4) * python-build: Import recent changes from ruby-build v20140225 #### 0.4.0-20140211 * python-build: Add new CPython release candidates; 3.3.4, 3.4.0b3 * python-build: Add [Anaconda](https://store.continuum.io/cshop/anaconda/) and [Miniconda](http://repo.continuum.io/miniconda/) binary distributions * python-build: Display error if the wget does not support Server Name Indication (SNI) to avoid SSL verification error when downloading from https://pypi.python.org. (#60) * python-build: Update default setuptools version (2.1 -> 2.2) * python-build: Update default pip version (1.5.1 -> 1.5.2) * python-build: Import recent changes from ruby-build v20140204 #### 0.4.0-20140123 * pyenv: Always append the directory at the top of the `$PATH` to return proper value for `sys.executable` (#98) * pyenv: Unset `GREP_OPTIONS` to avoid issues of conflicting options (#101) * python-build: Install `pip` with using `ensurepip` if available * python-build: Add support for framework installation (`--enable-framework`) of CPython (#55, #99) * python-build: Import recent changes from ruby-build v20140110.1 * python-build: Import `bats` tests from ruby-build v20140110.1 #### 0.4.0-20140110.1 * python-build: Fix build error of CPython 2.x on the platform where the `gcc` is llvm-gcc. #### 0.4.0-20140110 * pyenv: Reliably detect parent shell in `pyenv init` (#93) * pyenv: Import recent changes from rbenv 0.4.0 * pyenv: Import `bats` tests from rbenv 0.4.0 * python-build: Add new CPython releases candidates; 3.4.0b2 * python-build: Add ruby-build style patching feature (#91) * python-build: Set `RPATH` if `--enable-shared` was given (#65, #66, 82) * python-build: Update default setuptools version (2.0 -> 2.1) * python-build: Update default pip version (1.4.1 -> 1.5) * python-build: Activate friendly CPython during build if the one is not activated (8fa6b4a1847851919ad7857c6c42ed809a4d277b) * python-build: Fix broken install.sh * python-build: Import recent changes from ruby-build v20131225.1 * version-ext-compat: Removed from default plugin. Please use [pyenv-version-ext](https://github.com/pyenv/pyenv-version-ext) instead. #### 0.4.0-20131217 * python-build: Fix broken build of CPython 3.3+ on Darwin * python-build: Not build GNU Readline uselessly on Darwin #### 0.4.0-20131216 * python-build: Add new CPython releases; 3.3.3 (#80) * python-build: Add new CPython releases candidates; 3.4.0b1 * python-build: Add new PyPy releases; pypy-2.2.1, pypy-2.2.1-src * python-build: Update default setuptools version (1.3.2 -> 2.0) * python-build: Imported recent changes from ruby-build v20131211 * pyenv: Fix pyenv-prefix to trim "/bin" in `pyenv prefix system` (#88) #### 0.4.0-20131116 * python-build: Add new CPython releases; 2.6.9, 2.7.6 (#76) * python-build: Add new CPython release candidates; 3.3.3-rc1, 3.3.3-rc2 * python-build: Add new PyPy releases; pypy-2.2, pypy-2.2-src (#77) * python-build: Update default setuptools version (1.1.6 -> 1.3.2) * python-build: Imported recent changes from ruby-build v20131030 #### 0.4.0-20131023 * pyenv: Improved [fish shell](http://fishshell.com/) support * python-build: Add new PyPy releases; pypy-2.1, pypy-2.1-src, pypy3-2.1-beta1, pypy3-2.1-beta1-src * python-build: Add ancient versions; 2.4, 2.4.1, 2.4.3, 2.4.4 and 2.4.5 * python-build: Add alpha releases; 3.4.0a2, 3.4.0a3, 3.4.0a4 * python-build: Update default pip version (1.4 -> 1.4.1) * python-build: Update default setuptools version (0.9.7 -> 1.1.6) #### 0.4.0-20130726 * pyenv: Fix minor issue of variable scope in `pyenv versions` * python-build: Update base version to ruby-build v20130628 * python-build: Use brew managed OpenSSL and GNU Readline if they are available * python-build: Fix build of CPython 3.3+ on OS X (#29) * python-build: Fix build of native modules of CPython 2.5 on OS X (#33) * python-build: Fix build of CPython 2.6+ on openSUSE (#36) * python-build: Add ancient versions; 2.4.2 and 2.4.6. The build might be broken. (#37) * python-build: Update default pip version (1.3.1 -> 1.4) * python-build: Update default setuptools version (0.7.2 -> 0.9.7) #### 0.4.0-20130613 * pyenv: Changed versioning schema. There are two parts; the former is the base rbenv version, and the latter is the date of release. * python-build: Add `--debug` option to build CPython with debug symbols. (#11) * python-build: Add new CPython versions: 2.7.4, 2.7.5, 3.2.4, 3.2.5, 3.3.1, 3.3.2 (#12, #17) * python-build: Add `svnversion` patch for old CPython versions (#14) * python-build: Enable mirror by default for faster download (#20) * python-build: Add `OPENSSL_NO_SSL2` patch for old CPython versions (#22) * python-build: Install GNU Readline on Darwin if the system one is broken (#23) * python-build: Bundle patches in `${PYTHON_BUILD_ROOT}/share/python-build/patches` and improve patching mechanism (`apply_patches`). * python-build: Verify native extensions after building. (`build_package_verify_py*`) * python-build: Add `install_hg` to install package from Mercurial repository * python-build: Support building Jython and PyPy. * python-build: Add new CPython development versions: 2.6-dev, 2.7-dev, 3.1-dev, 3.2-dev, 3.3-dev, 3.4-dev * python-build: Add new Jython development versions: jython-2.5.4-rc1, jython-2.5-dev, jython-2.7-beta1, jython-dev * python-build: Add new PyPy versions: pypy-1.5{,-src}, pypy-1.6, pypy-1.7, pypy-2.0{,-src}, pypy-2.0.1{,-src}, pypy-2.0.2{,-src} * python-build: Add new PyPy development versions: pypy-1.7-dev, pypy-1.8-dev, pypy-1.9-dev, pypy-2.0-dev, pypy-dev, pypy-py3k-dev * python-build: Add new Stackless development versions: stackless-2.7-dev, stackless-3.2-dev, stackless-3.3-dev, stackless-dev * python-build: Update default pip version (1.2.1 -> 1.3.1) * python-build: Update default setuptools version (0.6.34 (distribute) -> 0.7.2 ([new setuptools](https://bitbucket.org/pypa/setuptools))) #### 0.2.0 (February 18, 2013) * Import changes from rbenv 0.4.0. #### 0.1.2 (October 23, 2012) * Add push/pop for version stack management. * Support multiple versions via environment variable. * Now GCC is not a requirement to build CPython and Stackless. #### 0.1.1 (September 3, 2012) * Support multiple versions of Python at a time. #### 0.1.0 (August 31, 2012) * Initial public release. pyenv-pyenv-485090e/COMMANDS.md000066400000000000000000000263531517431316200160310ustar00rootroot00000000000000# Command Reference Like `git`, the `pyenv` command delegates to subcommands based on its first argument. The most common subcommands are: * [`pyenv help`](#pyenv-help) * [`pyenv commands`](#pyenv-commands) * [`pyenv local`](#pyenv-local) * [`pyenv global`](#pyenv-global) * [`pyenv shell`](#pyenv-shell) * [`pyenv install`](#pyenv-install) * [`pyenv uninstall`](#pyenv-uninstall) * [`pyenv rehash`](#pyenv-rehash) * [`pyenv version`](#pyenv-version) * [`pyenv versions`](#pyenv-versions) * [`pyenv which`](#pyenv-which) * [`pyenv whence`](#pyenv-whence) * [`pyenv exec`](#pyenv-exec) * [`pyenv root`](#pyenv-root) * [`pyenv prefix`](#pyenv-prefix) * [`pyenv latest`](#pyenv-latest) * [`pyenv hooks`](#pyenv-hooks) * [`pyenv shims`](#pyenv-shims) * [`pyenv init`](#pyenv-init) * [`pyenv completions`](#pyenv-completions) ## `pyenv help` List all available pyenv commands along with a brief description of what they do. Run `pyenv help ` for information on a specific command. For full documentation, see: https://github.com/pyenv/pyenv#readme ## `pyenv commands` Lists all available pyenv commands. ## `pyenv local` Sets a local application-specific Python version by writing the version name to a `.python-version` file in the current directory. This version overrides the [global version](#pyenv-global), and can be overridden itself with the [`pyenv shell`](#pyenv-shell) command. $ pyenv local 2.7.6 When run without a version number, `pyenv local` reports the currently configured local version. You can also unset the local version: $ pyenv local --unset Previous versions of pyenv stored local version specifications in a file named `.pyenv-version`. For backwards compatibility, pyenv will read a local version specified in an `.pyenv-version` file, but a `.python-version` file in the same directory will take precedence. ### `pyenv local` (advanced) You can specify multiple versions as local Python at once. Let's say if you have two versions of 2.7.6 and 3.3.3. If you prefer 2.7.6 over 3.3.3, $ pyenv local 2.7.6 3.3.3 $ pyenv versions system * 2.7.6 (set by /Users/yyuu/path/to/project/.python-version) * 3.3.3 (set by /Users/yyuu/path/to/project/.python-version) $ python --version Python 2.7.6 $ python2.7 --version Python 2.7.6 $ python3.3 --version Python 3.3.3 or, if you prefer 3.3.3 over 2.7.6, $ pyenv local 3.3.3 2.7.6 $ pyenv versions system * 2.7.6 (set by /Users/yyuu/path/to/project/.python-version) * 3.3.3 (set by /Users/yyuu/path/to/project/.python-version) venv27 $ python --version Python 3.3.3 $ python2.7 --version Python 2.7.6 $ python3.3 --version Python 3.3.3 You can use the `-f/--force` flag to force setting versions even if some aren't installed. This is mainly useful in special cases like provisioning scripts. ## `pyenv global` Sets the global version of Python to be used in all shells by writing the version name to the `$PYENV_ROOT/version` file. This version can be overridden with [`pyenv local`](#pyenv-local) or [`pyenv shell`](#pyenv-shell). $ pyenv global 2.7.6 The special version name `system` tells pyenv to use the system Python (detected by searching your `$PATH`). When run without a version number, `pyenv global` reports the currently configured global version. ### `pyenv global` (advanced) You can specify multiple versions as global Python at once. Let's say if you have two versions of 2.7.6 and 3.3.3. If you prefer 2.7.6 over 3.3.3, $ pyenv global 2.7.6 3.3.3 $ pyenv versions system * 2.7.6 (set by /Users/yyuu/.pyenv/version) * 3.3.3 (set by /Users/yyuu/.pyenv/version) $ python --version Python 2.7.6 $ python2.7 --version Python 2.7.6 $ python3.3 --version Python 3.3.3 or, if you prefer 3.3.3 over 2.7.6, $ pyenv global 3.3.3 2.7.6 $ pyenv versions system * 2.7.6 (set by /Users/yyuu/.pyenv/version) * 3.3.3 (set by /Users/yyuu/.pyenv/version) venv27 $ python --version Python 3.3.3 $ python2.7 --version Python 2.7.6 $ python3.3 --version Python 3.3.3 ## `pyenv shell` Sets a shell-specific Python version by setting the `PYENV_VERSION` environment variable in your shell. This version overrides application-specific versions and the global version. $ pyenv shell pypy-2.2.1 When run without a version number, `pyenv shell` reports the current value of `PYENV_VERSION`. You can also unset the shell version: $ pyenv shell --unset Note that you'll need pyenv's shell integration enabled (step 3 of the installation instructions) in order to use this command. If you prefer not to use shell integration, you may simply set the `PYENV_VERSION` variable yourself: $ export PYENV_VERSION=pypy-2.2.1 ### `pyenv shell` (advanced) You can specify multiple versions via `PYENV_VERSION` at once. Let's say if you have two versions of 2.7.6 and 3.3.3. If you prefer 2.7.6 over 3.3.3, $ pyenv shell 2.7.6 3.3.3 $ pyenv versions system * 2.7.6 (set by PYENV_VERSION environment variable) * 3.3.3 (set by PYENV_VERSION environment variable) $ python --version Python 2.7.6 $ python2.7 --version Python 2.7.6 $ python3.3 --version Python 3.3.3 or, if you prefer 3.3.3 over 2.7.6, $ pyenv shell 3.3.3 2.7.6 $ pyenv versions system * 2.7.6 (set by PYENV_VERSION environment variable) * 3.3.3 (set by PYENV_VERSION environment variable) venv27 $ python --version Python 3.3.3 $ python2.7 --version Python 2.7.6 $ python3.3 --version Python 3.3.3 ## `pyenv install` Install a Python version (using [`python-build`](https://github.com/pyenv/pyenv/tree/master/plugins/python-build)). Usage: pyenv install [-f] [-kvp] pyenv install [-f] [-kvp] pyenv install -l|--list -l/--list List all available versions -f/--force Install even if the version appears to be installed already -s/--skip-existing Skip the installation if the version appears to be installed already python-build options: -k/--keep Keep source tree in $PYENV_BUILD_ROOT after installation (defaults to $PYENV_ROOT/sources) -v/--verbose Verbose mode: print compilation status to stdout -p/--patch Apply a patch from stdin before building -g/--debug Build a debug version To list the all available versions of Python, including Anaconda, Jython, pypy, and stackless, use: $ pyenv install --list Then install the desired versions: $ pyenv install 2.7.6 $ pyenv install 2.6.8 $ pyenv versions system 2.6.8 * 2.7.6 (set by /home/yyuu/.pyenv/version) You can also install the latest version of Python in a specific version line by supplying a prefix instead of a complete name: $ pyenv install 3.10 $ pyenv install 3 See the [`pyenv latest` documentation](#pyenv-latest) for details on prefix resolution. An older option is to use the `:latest` syntax. For example, to install the latest patch version for Python 3.8 you could do: pyenv install 3.8:latest ## `pyenv uninstall` Uninstall Python versions. Usage: pyenv uninstall [-f|--force] ... -f Attempt to remove the specified version without prompting for confirmation. If the version does not exist, do not display an error message. ## `pyenv rehash` Installs shims for all Python binaries known to pyenv (i.e., `~/.pyenv/versions/*/bin/*`). Run this command after you install a new version of Python, or install a package that provides binaries. $ pyenv rehash ## `pyenv version` Displays the currently active Python version, along with information on how it was set. Usage: pyenv version [--bare] --bare show just the version name. An alias to `pyenv version-name' $ pyenv version 2.7.6 (set by /home/yyuu/.pyenv/version) $ pyenv version --bare 2.7.6 ## `pyenv versions` Lists all Python versions known to pyenv, and shows an asterisk next to the currently active version. $ pyenv versions 2.5.6 2.6.8 * 2.7.6 (set by /home/yyuu/.pyenv/version) 3.3.3 jython-2.5.3 pypy-2.2.1 ## `pyenv which` Displays the full path to the executable that pyenv will invoke when you run the given command. $ pyenv which python3.3 /home/yyuu/.pyenv/versions/3.3.3/bin/python3.3 Use --nosystem argument in case when you don't need to search command in the system environment. ## `pyenv whence` Lists all Python versions with the given command installed. $ pyenv whence 2to3 2.6.8 2.7.6 3.3.3 ## `pyenv exec` Usage: pyenv exec [arg1 arg2...] Runs an executable by first preparing PATH so that the selected Python version's `bin` directory is at the front. For example, if the currently selected Python version is 3.9.7: pyenv exec pip install -r requirements.txt is equivalent to: PATH="$PYENV_ROOT/versions/3.9.7/bin:$PATH" pip install -r requirements.txt ## `pyenv root` Displays the root directory where versions and shims are kept. $ pyenv root /home/user/.pyenv ## `pyenv prefix` Displays the directories where the given Python versions are installed, separated by colons. If no version is given, `pyenv prefix` displays the locations of the currently selected versions. $ pyenv prefix 3.9.7 /home/user/.pyenv/versions/3.9.7 ## `pyenv latest` Displays the latest installed or known version with the given prefix Usage: pyenv latest [-k|--known] -k/--known Select from all known versions instead of installed Only full prefixes are searched: in the actual name, the given prefix must be followed by a dot or a dash. Prereleases and versions with specific suffixes (e.g. `-src`) are ignored. ## `pyenv hooks` Lists installed hook scripts for a given pyenv command. Usage: pyenv hooks ## `pyenv shims` List existing pyenv shims. Usage: pyenv shims [--short] $ pyenv shims /home/user/.pyenv/shims/2to3 /home/user/.pyenv/shims/2to3-3.9 /home/user/.pyenv/shims/idle /home/user/.pyenv/shims/idle3 /home/user/.pyenv/shims/idle3.9 /home/user/.pyenv/shims/pip /home/user/.pyenv/shims/pip3 /home/user/.pyenv/shims/pip3.9 /home/user/.pyenv/shims/pydoc /home/user/.pyenv/shims/pydoc3 /home/user/.pyenv/shims/pydoc3.9 /home/user/.pyenv/shims/python /home/user/.pyenv/shims/python3 /home/user/.pyenv/shims/python3.9 /home/user/.pyenv/shims/python3.9-config /home/user/.pyenv/shims/python3.9-gdb.py /home/user/.pyenv/shims/python3-config /home/user/.pyenv/shims/python-config ## `pyenv init` Configure the shell environment for pyenv Usage: eval "$(pyenv init [-|--path] [--no-push-path] [--no-rehash] [])" - Initialize shims directory, print PYENV_SHELL variable, completions path and shell function --path Print shims path --no-push-path Do not push shim to the start of PATH if they're already there --no-rehash Add no rehash command to output ## `pyenv completions` Lists available completions for a given pyenv command. Usage: pyenv completions [arg1 arg2...] pyenv-pyenv-485090e/CONDUCT.md000066400000000000000000000064641517431316200157300ustar00rootroot00000000000000# Contributor Covenant Code of Conduct ## Our Pledge In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. ## Our Standards Examples of behavior that contributes to creating a positive environment include: * Using welcoming and inclusive language * Being respectful of differing viewpoints and experiences * Gracefully accepting constructive criticism * Focusing on what is best for the community * Showing empathy towards other community members Examples of unacceptable behavior by participants include: * The use of sexualized language or imagery and unwelcome sexual attention or advances * Trolling, insulting/derogatory comments, and personal or political attacks * Public or private harassment * Publishing others' private information, such as a physical or electronic address, without explicit permission * Other conduct which could reasonably be considered inappropriate in a professional setting ## Our Responsibilities Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. ## Scope This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. ## Enforcement Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting one of the project maintainers listed below. All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. ## Project Maintainers * Yamashita, Yuu <> * Daniel Hahler <> * Josh Friend <> ## Attribution This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version] [homepage]: http://contributor-covenant.org [version]: http://contributor-covenant.org/version/1/4/ pyenv-pyenv-485090e/CONTRIBUTING.md000066400000000000000000000145361517431316200165370ustar00rootroot00000000000000General guidance ================ * The usual principles of respecting existing conventions and making sure that your changes are in line with the overall product design apply when contributing code to Pyenv. * We are limited to Bash 3.2 features That's because that's the version shipped with MacOS. (They didn't upgrade past it and switched to Zsh because later versions are covered by GPLv3 which has additional restrictions unacceptable for Apple.) You can still add performance optimizations etc that take advantage of newer Bash features as long as there is a fallback execution route for Bash 3. Formatting PRs ============== We strive to keep commit history one-concern-per-commit to keep it meaningful and easy to follow. If a pull request (PR) addresses a single concern (the typical case), we usually squash commits from it together when merging so its commit history doesn't matter. If however a PR addresses multiple separate concerns, each of them should be presented as a separate commit. Adding multiple new Python releases of the same flavor is okay with either a single or multiple commits. Authoring installation scripts ============================== Adding new Python release support --------------------------------- The easiest way to add support for a new Python release is to copy the script from the previous one and adjust it as necessary. In many cases, just changing version numbers, URLs and hashes is enough. Do pay attention to other "magic numbers" that may be present in a script -- e.g. the set of architectures and OS versions supported by a release -- since those change from time to time, too. Make sure to also copy any patches for the previous release that still apply to the new one. Typically, a patch no longer applies if it addresses a problem that's already fixed in the new release. For prereleases, we only create an entry for the latest prerelease in a specific version line. When submitting a newer prerelease, replace the older one. Adding version-specific fixes/patches ------------------------------------- We accept fixes to issues in specific Python releases that prevent users from using them with Pyenv. In the default configuration for a Python release, we strive to provide as close to vanilla experience as practical, to maintain [the principle of the least surprise](https://en.wikipedia.org/wiki/Principle_of_least_astonishment). As such, any such fixes: * Must not break or degrade (e.g. disable features) the build in any of the environments that the release officially supports * Must not introduce incompatibilities with the vanilla release (including binary incompatibilities) * Should not patch things unnecessarily, to minimize the risk of the aforementioned undesirable side effects. * E.g. if the fix is for a specific environment, its logic ought to only fire in this specific environment and not touch execution paths for other environments. * As such, it's advisable to briefly explain in the PR what each added patch does and why it is necessary to fix the declared problem Generally, version-specific fixes belong in the scripts for the affected releases and/or patches for them -- this guarantees that their effect is limited to only those releases.

Backporting upstream patches

Usually, this is the easiest way to backport a fix for a problem that is fixed in a newer release. * Clone Python, check out the tag for the appropriate release and create a branch * Apply existing patches if there are any (with either `patch` or `git am`) and commit * Cherry-pick the upstream commit that fixes the problem in a newer release * Commit and `git format-patch` * Commit the generated patch file into Pyenv, test your changes and submit a PR Deprecation policy ------------------ We do not provide official support for EOL releases and environments or otherwise provide any kind of extended support for old Python releases. We do however accept fixes from interested parties that would allow running older, including EOL, releases in environments that they do not officially support. In addition to the above requirements for release-specific fixes, * Such a fix must not add maintenance burden (e.g. add new logic to `python-build` that has to be kept there indefinitely) * Unless the added logic is useful for both EOL and non-EOL releases. In this case, it will be considered as being primarily an improvement for non-EOL releases. * Support is provided on a "best effort" basis: we do not actively maintain these fixes but won't actively break them, either, and will accept any corrections. Since old releases never change, it's pretty safe to assume that the fixes will continue to work until a later version of an environment introduces further incompatible changes. Advanced changes / adding new Python flavor support --------------------------------------------------- An installation script is sourced from `python-build`. All installation scripts are based on the same logic: 1. Select the source to download and other variable parameters as needed. This includes showing an error if the user's environment (OS, architecture) is not supported by the release. Binary releases that only officially support specific distro(s) typically show a warning in other distros instead. 2. Run one of the `install_*` shell functions `install_*` shell functions defined in `python-build` install Python from different kinds of sources -- compressed package (binary or source), upstream installation script, VCS checkout. Pick one that's the most appropriate for your packaging. Each of them accepts a couple of function-specific arguments which are followed by arguments that constitute the build sequence. Each `` in the build sequence corresponds to the `install_*_` function in `python-build`. Check what's available and add any functions with logic specific to your flavor if needed. We strive to keep out of `python-build` parts of build logic that are release-specific and/or tend to change abruptly between releases -- e.g. sets of supported architectures and other software's versions. This results in logic duplication between installation scripts -- but since old releases never change once released, this doesn't really add to the maintenance burden. As a rule of thumb, `python-build` can host parts of logic that are expected to stay the same for an indefinite amount of time -- for an entire Python flavor or release line. pyenv-pyenv-485090e/LICENSE000066400000000000000000000021041517431316200152770ustar00rootroot00000000000000Copyright (c) 2013 Yamashita, Yuu Copyright (c) 2013 Sam Stephenson Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. pyenv-pyenv-485090e/MAINTENANCE.md000066400000000000000000000021731517431316200163440ustar00rootroot00000000000000Creating a release ================== The release of the new version of Pyenv is done via GitHub Releases. Release checklist: * Start [drafting a new release on GitHub](https://github.com/pyenv/pyenv/releases) to generate a summary of changes. Type the would-be tag name in the "Choose a tag" field and press "Generate release notes" * The summary may need editing. E.g. rephrase entries, delete/merge entries that are too minor or irrelevant to the users (e.g. typo fixes, CI) * Update `CHANGELOG.md` with the new version number and the edited summary (only the changes section) * Push the version number in `libexec/pyenv---version` and `plugins/python-build/bin/python-build` * Minor version is pushed if there are significant functional changes (not e.g. bugfixes/formula adaptations/supporting niche use cases). * Major version is pushed if there are breaking changes * Commit the changes locally into `master` * Create a new tag locally with the same name as specified in the new release window * Push the changes including the tag * In the still open new release window, press "Publish release". The now-existing tag will be used.pyenv-pyenv-485090e/Makefile000066400000000000000000000117731517431316200157460ustar00rootroot00000000000000TEST_BATS_VERSION = v1.10.0 TEST_BASH_VERSIONS = 3.2.57 4.1.17 TEST_UNIT_DOCKER_PREFIX = test-unit-docker TEST_UNIT_DOCKER_TARGETS = $(foreach bash,$(TEST_BASH_VERSIONS),$(addsuffix -$(bash),$(TEST_UNIT_DOCKER_PREFIX)) $(addsuffix -gnu-$(bash),$(TEST_UNIT_DOCKER_PREFIX))) TEST_PLUGIN_DOCKER_PREFIX = test-plugin-docker TEST_PLUGIN_DOCKER_TARGETS = $(foreach bash,$(TEST_BASH_VERSIONS),$(addsuffix -$(bash),$(TEST_PLUGIN_DOCKER_PREFIX)) $(addsuffix -gnu-$(bash),$(TEST_PLUGIN_DOCKER_PREFIX))) TEST_BATS_IMAGE_PREFIX = test-pyenv-docker-image TEST_BATS_IMAGE_TARGETS = $(foreach bash,$(TEST_BASH_VERSIONS),$(addsuffix -$(bash),$(TEST_BATS_IMAGE_PREFIX)) $(addsuffix -gnu-$(bash),$(TEST_BATS_IMAGE_PREFIX))) .PHONY: test-docker: $(TEST_UNIT_DOCKER_PREFIX) $(TEST_PLUGIN_DOCKER_PREFIX) # Run all unit test under bats docker .PHONY: $(TEST_UNIT_DOCKER_PREFIX) $(TEST_UNIT_DOCKER_PREFIX): $(TEST_UNIT_DOCKER_TARGETS) # Run each unit test under bats docker .PHONY: $(TEST_UNIT_DOCKER_TARGETS) $(TEST_UNIT_DOCKER_TARGETS): DOCKER_IMAGE = $(TEST_BATS_IMAGE_PREFIX) $(TEST_UNIT_DOCKER_TARGETS): GNU = $(if $(findstring -gnu-,$@),True,False) $(TEST_UNIT_DOCKER_TARGETS): BASH = $(filter $(TEST_BASH_VERSIONS),$(subst -, ,$@)) $(TEST_UNIT_DOCKER_TARGETS): DOCKER_TAG = bash-$(BASH)-gnu-$(GNU) $(TEST_UNIT_DOCKER_TARGETS): INTERACTIVE = $(if $(findstring true,$(CI)),,-ti) $(TEST_UNIT_DOCKER_TARGETS): $(TEST_UNIT_DOCKER_PREFIX)-% : $(TEST_BATS_IMAGE_PREFIX)-% $(info Running test with docker image '$(DOCKER_IMAGE):$(DOCKER_TAG)') docker run \ --init \ -v $(PWD):/code:ro \ -v /etc/passwd:/etc/passwd:ro \ -v /etc/group:/etc/group:ro \ -u "$$(id -u $$(whoami)):$$(id -g $$(whoami))" \ $${BATS_TEST_FILTER:+-e BATS_TEST_FILTER="$${BATS_TEST_FILTER}"} \ $${BATS_FILE_FILTER:+-e BATS_FILE_FILTER="$${BATS_FILE_FILTER}"} \ $${CI+-e CI="$${CI}"} \ $(INTERACTIVE) \ $(DOCKER_IMAGE):$(DOCKER_TAG) \ test/run # Run all plugin test under bats docker .PHONY: $(TEST_PLUGIN_DOCKER_PREFIX) $(TEST_PLUGIN_DOCKER_PREFIX): $(TEST_PLUGIN_DOCKER_TARGETS) # Run each plugin test under bats docker .PHONY: $(TEST_PLUGIN_DOCKER_TARGETS) $(TEST_PLUGIN_DOCKER_TARGETS): DOCKER_IMAGE = $(TEST_BATS_IMAGE_PREFIX) $(TEST_PLUGIN_DOCKER_TARGETS): GNU = $(if $(findstring -gnu-,$@),True,False) $(TEST_PLUGIN_DOCKER_TARGETS): BASH = $(filter $(TEST_BASH_VERSIONS),$(subst -, ,$@)) $(TEST_PLUGIN_DOCKER_TARGETS): DOCKER_TAG = bash-$(BASH)-gnu-$(GNU) $(TEST_PLUGIN_DOCKER_TARGETS): INTERACTIVE = $(if $(findstring true,$(CI)),,-ti) $(TEST_PLUGIN_DOCKER_TARGETS): $(TEST_PLUGIN_DOCKER_PREFIX)-% : $(TEST_BATS_IMAGE_PREFIX)-% $(info Running test with docker image '$(DOCKER_IMAGE):$(DOCKER_TAG)') docker run \ --init \ -v $(PWD):/code:ro \ -v /etc/passwd:/etc/passwd:ro \ -v /etc/group:/etc/group:ro \ -u "$$(id -u $$(whoami)):$$(id -g $$(whoami))" \ $${CI+-e CI="$${CI}"} \ $(INTERACTIVE) \ $(DOCKER_IMAGE):$(DOCKER_TAG) \ bats $${BATS_TEST_FILTER:+--filter "$${BATS_TEST_FILTER}"} plugins/python-build/test/$${BATS_FILE_FILTER} # Build all images needed for bats under docker .PHONY: $(TEST_BATS_IMAGE_PREFIX) $(TEST_BATS_IMAGE_PREFIX): $(TEST_BATS_IMAGE_TARGETS) # Build each image needed for bats under docker .PHONY: $(TEST_BATS_IMAGE_TARGETS) $(TEST_BATS_IMAGE_TARGETS): DOCKER_IMAGE = $(TEST_BATS_IMAGE_PREFIX) $(TEST_BATS_IMAGE_TARGETS): GNU = $(if $(findstring -gnu-,$@),True,False) $(TEST_BATS_IMAGE_TARGETS): BASH = $(filter $(TEST_BASH_VERSIONS),$(subst -, ,$@)) $(TEST_BATS_IMAGE_TARGETS): DOCKER_TAG = bash-$(BASH)-gnu-$(GNU) $(TEST_BATS_IMAGE_TARGETS): $(info Building docker image '$(DOCKER_IMAGE):$(DOCKER_TAG)') docker build \ --quiet \ -f "$(PWD)/test/Dockerfile" \ --build-arg GNU="$(GNU)" \ --build-arg BASH="$(BASH)" \ --build-arg BATS_VERSION="$(TEST_BATS_VERSION)" \ -t $(DOCKER_IMAGE):$(DOCKER_TAG) \ ./ .PHONY: test test-build test-unit test-plugin # Do not pass in user flags to build tests. unexport PYTHON_CFLAGS unexport PYTHON_CONFIGURE_OPTS test: test-unit test-plugin test-unit: bats PATH="./bats/bin:$$PATH" test/run test-plugin: bats cd plugins/python-build && $(PWD)/bats/bin/bats $${CI:+--tap} $${BATS_TEST_FILTER:+--filter "$${BATS_TEST_FILTER}"} test/$${BATS_FILE_FILTER} PYTHON_BUILD_ROOT := $(CURDIR)/plugins/python-build PYTHON_BUILD_OPTS ?= --verbose PYTHON_BUILD_VERSION ?= 3.8-dev PYTHON_BUILD_TEST_PREFIX ?= $(PYTHON_BUILD_ROOT)/test/build/tmp/dist test-build: $(RM) -r $(PYTHON_BUILD_TEST_PREFIX) $(PYTHON_BUILD_ROOT)/bin/python-build $(PYTHON_BUILD_OPTS) $(PYTHON_BUILD_VERSION) $(PYTHON_BUILD_TEST_PREFIX) [ -e $(PYTHON_BUILD_TEST_PREFIX)/bin/python ] $(PYTHON_BUILD_TEST_PREFIX)/bin/python -V [ -e $(PYTHON_BUILD_TEST_PREFIX)/bin/pip ] $(PYTHON_BUILD_TEST_PREFIX)/bin/pip -V .SECONDARY: bats-$(TEST_BATS_VERSION) bats-$(TEST_BATS_VERSION): rm -rf bats ln -sf bats-$(TEST_BATS_VERSION) bats git clone --depth 1 --branch $(TEST_BATS_VERSION) https://github.com/bats-core/bats-core.git bats-$(TEST_BATS_VERSION) .PHONY: bats bats: bats-$(TEST_BATS_VERSION) ln -sf bats-$(TEST_BATS_VERSION) bats pyenv-pyenv-485090e/README.md000066400000000000000000000750021517431316200155600ustar00rootroot00000000000000# Simple Python Version Management: pyenv [![Join the chat at https://gitter.im/yyuu/pyenv](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/yyuu/pyenv?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) pyenv lets you easily switch between multiple versions of Python. It's simple, unobtrusive, and follows the UNIX tradition of single-purpose tools that do one thing well. This project was forked from [rbenv](https://github.com/rbenv/rbenv) and [ruby-build](https://github.com/rbenv/ruby-build), and modified for Python. ### What pyenv _does..._ * Lets you **change the global Python version** on a per-user basis. * Provides support for **per-project Python versions**. * Allows you to **override the Python version** with an environment variable. * Searches for commands from **multiple versions of Python at a time**. This may be helpful to test across Python versions with [tox](https://pypi.python.org/pypi/tox). ### In contrast with pythonbrew and pythonz, pyenv _does not..._ * **Depend on Python itself.** pyenv was made from pure shell scripts. There is no bootstrap problem of Python. * **Need to be loaded into your shell.** Instead, pyenv's shim approach works by adding a directory to your `PATH`. * **Manage virtualenv.** Of course, you can create [virtualenv](https://pypi.python.org/pypi/virtualenv) yourself, or [pyenv-virtualenv](https://github.com/pyenv/pyenv-virtualenv) to automate the process. ---- ## Table of Contents * **[Installation](#installation)** * [Getting Pyenv](#a-getting-pyenv) * [Linux/UNIX](#linuxunix) * [Automatic Installer](#1-automatic-installer-recommended) * [Basic GitHub Checkout](#2-basic-github-checkout) * [MacOS](#macos) * [Homebrew in macOS](#homebrew-in-macos) * [Windows](#windows) * [Set up your shell environment for Pyenv](#b-set-up-your-shell-environment-for-pyenv) * [Restart your shell](#c-restart-your-shell) * [Install Python build dependencies](#d-install-python-build-dependencies) * [Upgrade Notes](#e-upgrade-notes) * **[Usage](#usage)** * [Install additional Python versions](#install-additional-python-versions) * [Prefix auto-resolution to the latest version](#prefix-auto-resolution-to-the-latest-version) * [Python versions with extended support](#python-versions-with-extended-support) * [Switch between Python versions](#switch-between-python-versions) * [Making multiple versions available](#making-multiple-versions-available) * [Uninstall Python versions](#uninstall-python-versions) * [Other operations](#other-operations) * [Upgrading](#upgrading) * [Upgrading with Homebrew](#upgrading-with-homebrew) * [Upgrading with Installer or Git checkout](#upgrading-with-installer-or-git-checkout) * [Uninstalling pyenv](#uninstalling-pyenv) * [Pyenv plugins](#pyenv-plugins) * **[How It Works](#how-it-works)** * [Understanding PATH](#understanding-path) * [Understanding Shims](#understanding-shims) * [Understanding Python version selection](#understanding-python-version-selection) * [Locating Pyenv-provided Python Installations](#locating-pyenv-provided-python-installations) * [Advanced Configuration](#advanced-configuration) * [Using Pyenv without shims](#using-pyenv-without-shims) * [Running nested shells from Python-based programs](#running-nested-shells-from-python-based-programs) * [Environment variables](#environment-variables) * **[Development](#development)** * [Contributing](#contributing) * [Version History](#version-history) * [License](#license) ---- ## Installation ### A. Getting Pyenv ---- #### Linux/Unix
The Homebrew option from the [MacOS section below](#macos) would also work if you have Homebrew installed. ##### 1. Automatic installer (Recommended) ```bash curl -fsSL https://pyenv.run | bash ``` For more details visit our other project: https://github.com/pyenv/pyenv-installer ##### 2. Basic GitHub Checkout This will get you going with the latest version of Pyenv and make it easy to fork and contribute any changes back upstream. * **Check out Pyenv where you want it installed.** A good place to choose is `$HOME/.pyenv` (but you can install it somewhere else): ``` git clone https://github.com/pyenv/pyenv.git ~/.pyenv ``` * Optionally, try to compile a dynamic Bash extension to speed up Pyenv. Don't worry if it fails; Pyenv will still work normally: ``` cd ~/.pyenv && src/configure && make -C src ```
#### MacOS
The options from the [Linux section above](#linuxunix) also work but Homebrew is recommended for basic usage. ##### [Homebrew](https://brew.sh) in macOS 1. Update homebrew and install pyenv: ```sh brew update brew install pyenv ``` If you want to install (and update to) the latest development head of Pyenv rather than the latest release, instead run: ```sh brew install pyenv --head ``` 3. Then follow the rest of the post-installation steps, starting with [Set up your shell environment for Pyenv](#b-set-up-your-shell-environment-for-pyenv). 4. OPTIONAL. To fix `brew doctor`'s warning _""config" scripts exist outside your system or Homebrew directories"_ If you're going to build Homebrew formulae from source that link against Python like Tkinter or NumPy _(This is only generally the case if you are a developer of such a formula, or if you have an EOL version of MacOS for which prebuilt bottles are no longer provided and you are using such a formula)._ To avoid them accidentally linking against a Pyenv-provided Python, add the following line into your interactive shell's configuration: * Bash/Zsh: ~~~bash alias brew='env PATH="${PATH//$(pyenv root)\/shims:/}" brew' ~~~ * Fish: ~~~fish alias brew="env PATH=(string replace (pyenv root)/shims '' \"\$PATH\") brew" ~~~
#### Windows
Pyenv does not officially support Windows and does not work in Windows outside the Windows Subsystem for Linux. Moreover, even there, the Pythons it installs are not native Windows versions but rather Linux versions running in a virtual machine -- so you won't get Windows-specific functionality. If you're in Windows, we recommend using @kirankotari's [`pyenv-win`](https://github.com/pyenv-win/pyenv-win) fork -- which does install native Windows Python versions.
### B. Set up your shell environment for Pyenv ---- The below setup should work for the vast majority of users for common use cases. See [Advanced configuration](#advanced-configuration) for details and more configuration options. #### Bash
Stock Bash startup files vary widely between distributions in which of them source which, under what circumstances, in what order and what additional configuration they perform. As such, the most reliable way to get Pyenv in all environments is to append Pyenv configuration commands to both `.bashrc` (for interactive shells) and the profile file that Bash would use (for login shells). 1. First, add the commands to `~/.bashrc` by running the following in your terminal: ```bash echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc echo '[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc echo 'eval "$(pyenv init - bash)"' >> ~/.bashrc ``` 2. Then, if you have `~/.profile`, `~/.bash_profile` or `~/.bash_login`, add the commands there as well. If you have none of these, create a `~/.profile` and add the commands there. * to add to `~/.profile`: ``` bash echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.profile echo '[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.profile echo 'eval "$(pyenv init - bash)"' >> ~/.profile ``` * to add to `~/.bash_profile`: ```bash echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile echo '[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile echo 'eval "$(pyenv init - bash)"' >> ~/.bash_profile ``` **Bash warning**: There are some systems where the `BASH_ENV` variable is configured to point to `.bashrc`. On such systems, you should almost certainly put the `eval "$(pyenv init - bash)"` line into `.bash_profile`, and **not** into `.bashrc`. Otherwise, you may observe strange behaviour, such as `pyenv` getting into an infinite loop. See [#264](https://github.com/pyenv/pyenv/issues/264) for details.
#### Zsh
Add Pyenv startup commands to `~/.zshrc` by running the following in your terminal: ```zsh echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc echo '[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc echo 'eval "$(pyenv init - zsh)"' >> ~/.zshrc ``` If you wish to get Pyenv in noninteractive login shells as well, also add the commands to `~/.zprofile` or `~/.zlogin`.
#### Fish
1. If you have Fish 3.2.0 or newer, execute this interactively: ```fish set -Ux PYENV_ROOT $HOME/.pyenv test -d $PYENV_ROOT/bin; and fish_add_path $PYENV_ROOT/bin ``` 2. Otherwise, execute the snippet below: ```fish set -Ux PYENV_ROOT $HOME/.pyenv test -d $PYENV_ROOT/bin; and set -U fish_user_paths $PYENV_ROOT/bin $fish_user_paths ``` 3. Now, add this to `~/.config/fish/config.fish`: ```fish pyenv init - fish | source ```
#### Nushell
Add the following lines to your `config.nu` to add Pyenv and its shims to your `PATH`. Shell integration (completions and subcommands changing the shell's state) isn't currently supported. ~~~ nu $env.PYENV_ROOT = "~/.pyenv" | path expand if (( $"($env.PYENV_ROOT)/bin" | path type ) == "dir") { $env.PATH = $env.PATH | prepend $"($env.PYENV_ROOT)/bin" } $env.PATH = $env.PATH | prepend $"(pyenv root)/shims" ~~~
#### Microsoft PowerShell
Add the commands to `$profile.CurrentUserAllHosts` by running the following in your terminal: ~~~ pwsh echo '$Env:PYENV_ROOT="$Env:HOME/.pyenv"' >> $profile.CurrentUserAllHosts echo 'if (Test-Path -LP "$Env:PYENV_ROOT/bin" -PathType Container) { $Env:PATH="$Env:PYENV_ROOT/bin:$Env:PATH" }' >> $profile.CurrentUserAllHosts echo 'iex ((pyenv init -) -join "`n")' >> $profile.CurrentUserAllHosts ~~~
### C. Restart your shell ---- for the `PATH` changes to take effect. ```sh exec "$SHELL" ``` ### D. Install Python build dependencies ---- [**Install Python build dependencies**](https://github.com/pyenv/pyenv/wiki#suggested-build-environment) before attempting to install a new Python version. You can now begin using Pyenv. ### E. Upgrade Notes ---- **if you have upgraded from pyenv version 2.0.x-2.2.x**
The startup logic and instructions have been updated for simplicity in 2.3.0. The previous, more complicated configuration scheme for 2.0.0-2.2.5 still works. * Define environment variable `PYENV_ROOT` to point to the path where Pyenv will store its data. `$HOME/.pyenv` is the default. If you installed Pyenv via Git checkout, we recommend to set it to the same location as where you cloned it. * Add the `pyenv` executable to your `PATH` if it's not already there * run `eval "$(pyenv init -)"` to install `pyenv` into your shell as a shell function, enable shims and autocompletion * You may run `eval "$(pyenv init --path)"` instead to just enable shims, without shell integration
---- ## Usage ![Terminal output example](/install_local_python.gif) ### Install additional Python versions To install additional Python versions, use [`pyenv install`](COMMANDS.md#pyenv-install). For example, to download and install Python 3.10.4, run: ```sh pyenv install 3.10.4 ``` Running `pyenv install -l` gives the list of all available versions. ----
Notes about python releases **NOTE:** Most Pyenv-provided Python releases are source releases and are built from source as part of installation (that's why you need Python build dependencies preinstalled). You can pass options to Python's `configure` and compiler flags to customize the build, see [_Special environment variables_ in Python-Build's README](plugins/python-build/README.md#special-environment-variables) for details. **NOTE:** If you are having trouble installing a Python version, please visit the wiki page about [Common Build Problems](https://github.com/pyenv/pyenv/wiki/Common-build-problems). **NOTE:** If you want to use proxy for download, please set the `http_proxy` and `https_proxy` environment variables. **NOTE:** If you'd like a faster interpreter at the cost of longer build times, see [_Building for maximum performance_ in Python-Build's README](plugins/python-build/README.md#building-for-maximum-performance).
---- #### Prefix auto-resolution to the latest version All Pyenv subcommands except `uninstall` automatically resolve full prefixes to the latest version in the corresponding version line. `pyenv install` picks the latest known version, while other subcommands pick the latest installed version. E.g. to install and then switch to the latest 3.10 release: ```sh pyenv install 3.10 pyenv global 3.10 ``` You can run [`pyenv latest -k `](COMMANDS.md#pyenv-latest) to see how `pyenv install` would resolve a specific prefix, or [`pyenv latest `](COMMANDS.md#pyenv-latest) to see how other subcommands would resolve it. See the [`pyenv latest` documentation](COMMANDS.md#pyenv-latest) for details. ---- #### Python versions with extended support For the following Python releases, Pyenv applies user-provided patches that add support for some newer environments. Though we don't actively maintain those patches, since existing releases never change, it's safe to assume that they will continue working until there are further incompatible changes in a later version of those environments. * *3.7.8-3.7.15, 3.8.4-3.8.12, 3.9.0-3.9.7* : XCode 13.3 * *3.5.10, 3.6.15* : MacOS 11+ and XCode 13.3 * *2.7.18* : MacOS 10.15+ and Apple Silicon ---- ### Switch between Python versions To select a Pyenv-installed Python as the version to use, run one of the following commands: * [`pyenv shell `](COMMANDS.md#pyenv-shell) -- select just for current shell session * [`pyenv local `](COMMANDS.md#pyenv-local) -- automatically select whenever you are in the current directory (or its subdirectories) * [`pyenv global `](COMMANDS.md#pyenv-global) -- select globally for your user account E.g. to select the above-mentioned newly-installed Python 3.10.4 as your preferred version to use: ~~~bash pyenv global 3.10.4 ~~~ Now whenever you invoke `python`, `pip` etc., an executable from the Pyenv-provided 3.10.4 installation will be run instead of the system Python. Using "`system`" as a version name would reset the selection to your system-provided Python. See [Understanding shims](#understanding-shims) and [Understanding Python version selection](#understanding-python-version-selection) for more details on how the selection works and more information on its usage. ---- #### Making multiple versions available You can select multiple Python versions at the same time by specifying multiple arguments. E.g. if you wish to use the latest installed CPython 3.11 and 3.12: ~~~bash pyenv global 3.11 3.12 ~~~ Whenever you run a command provided by a Python installation, these versions will be searched for it in the specified order. [Due to the shims' fall-through behavior]((#understanding-python-version-selection)), `system` is always implicitly searched afterwards. ---- ### Uninstall Python versions As time goes on, you will accumulate Python versions in your `$(pyenv root)/versions` directory. To remove old Python versions, use [`pyenv uninstall `](COMMANDS.md#pyenv-uninstall). Alternatively, you can simply `rm -rf` the directory of the version you want to remove. You can find the directory of a particular Python version with the `pyenv prefix` command, e.g. `pyenv prefix 2.6.8`. Note however that plugins may run additional operations on uninstall which you would need to do by hand as well. E.g. Pyenv-Virtualenv also removes any virtual environments linked to the version being uninstalled. ---- ### Other operations Run `pyenv commands` to get a list of all available subcommands. Run a subcommand with `--help` to get help on it, or see the [Commands Reference](COMMANDS.md). Note that Pyenv plugins that you install may add their own subcommands. ## Upgrading ### Upgrading with Homebrew If you've installed Pyenv using Homebrew, upgrade using: ```sh brew upgrade pyenv ``` To switch from a release to the latest development head of Pyenv, use: ```sh brew uninstall pyenv brew install pyenv --head ``` then you can upgrade it with `brew upgrade pyenv` as usual. ### Upgrading with Installer or Git checkout If you've installed Pyenv with Pyenv-installer, you likely have the [Pyenv-Update](https://github.com/pyenv/pyenv-update) plugin that would upgrade Pyenv and all installed plugins: ```sh pyenv update ``` If you've installed Pyenv using Pyenv-installer or Git checkout, you can also upgrade your installation at any time using Git. To upgrade to the latest development version of pyenv, use `git pull`: ```sh cd $(pyenv root) git pull ``` To upgrade to a specific release of Pyenv, check out the corresponding tag: ```sh cd $(pyenv root) git fetch git tag git checkout v0.1.0 ``` ## Uninstalling pyenv The simplicity of pyenv makes it easy to temporarily disable it, or uninstall from the system. 1. To **disable** Pyenv managing your Python versions, simply remove the `pyenv init` invocations from your shell startup configuration. This will remove Pyenv shims directory from `PATH`, and future invocations like `python` will execute the system Python version, as it was before Pyenv. `pyenv` will still be accessible on the command line, but your Python apps won't be affected by version switching. 2. To completely **uninstall** Pyenv, remove _all_ Pyenv configuration lines from your shell startup configuration, and then remove its root directory. This will **delete all Python versions** that were installed under the `` $(pyenv root)/versions/ `` directory: ```sh rm -rf $(pyenv root) ``` If you've installed Pyenv using a package manager, as a final step, perform the Pyenv package removal. For instance, for Homebrew: ``` brew uninstall pyenv ``` ## Pyenv plugins Pyenv provides a simple way to extend and customize its functionality with plugins -- as simple as creating a plugin directory and dropping a shell script on a certain subpath of it with whatever extra logic you need to be run at certain moments. The main idea is that most things that you can put under `$PYENV_ROOT/` you can also put under `$PYENV_ROOT/plugins/your_plugin_name/`. See [_Plugins_ on the wiki](https://github.com/pyenv/pyenv/wiki/Plugins) on how to install and use plugins as well as a catalog of some useful existing plugins for common needs. See [_Authoring plugins_ on the wiki](https://github.com/pyenv/pyenv/wiki/Authoring-plugins) on writing your own plugins. ---- ## How It Works At a high level, pyenv intercepts Python commands using shim executables injected into your `PATH`, determines which Python version has been specified by your application, and passes your commands along to the correct Python installation. ### Understanding PATH When you run a command like `python` or `pip`, your shell (bash / zshrc / ...) searches through a list of directories to find an executable file with that name. This list of directories lives in an environment variable called `PATH`, with each directory in the list separated by a colon: /usr/local/bin:/usr/bin:/bin Directories in `PATH` are searched from left to right, so a matching executable in a directory at the beginning of the list takes precedence over another one at the end. In this example, the `/usr/local/bin` directory will be searched first, then `/usr/bin`, then `/bin`. ### Understanding Shims pyenv works by inserting a directory of _shims_ at the front of your `PATH`: $(pyenv root)/shims:/usr/local/bin:/usr/bin:/bin Through a process called _rehashing_, pyenv maintains shims in that directory to match every Python command across every installed version of Python—`python`, `pip`, and so on. Shims are lightweight executables that simply pass your command along to pyenv. So with pyenv installed, when you run, say, `pip`, your operating system will do the following: * Search your `PATH` for an executable file named `pip` * Find the pyenv shim named `pip` at the beginning of your `PATH` * Run the shim named `pip`, which in turn passes the command along to pyenv ### Understanding Python version selection When you execute a shim, pyenv determines which Python version to use by reading it from the following sources, in this order: 1. The `PYENV_VERSION` environment variable (if specified). You can use the [`pyenv shell`](https://github.com/pyenv/pyenv/blob/master/COMMANDS.md#pyenv-shell) command to set this environment variable in your current shell session. 2. The application-specific `.python-version` file in the current directory (if present). You can modify the current directory's `.python-version` file with the [`pyenv local`](https://github.com/pyenv/pyenv/blob/master/COMMANDS.md#pyenv-local) command. 3. The first `.python-version` file found (if any) by searching each parent directory, until reaching the root of your filesystem. 4. The global `$(pyenv root)/version` file. You can modify this file using the [`pyenv global`](https://github.com/pyenv/pyenv/blob/master/COMMANDS.md#pyenv-global) command. If the global version file is not present, pyenv assumes you want to use the "system" Python (see below). A special version name "`system`" means to use whatever Python is found on `PATH` after the shims `PATH` entry (in other words, whatever would be run if Pyenv shims weren't on `PATH`). Note that Pyenv considers those installations outside its control and does not attempt to inspect or distinguish them in any way. So e.g. if you are on MacOS and have OS-bundled Python 3.8.9 and Homebrew-installed Python 3.9.12 and 3.10.2 -- for Pyenv, this is still a single "`system`" version, and whichever of those is first on `PATH` under the executable name you specified will be run. **NOTE:** You can activate multiple versions at the same time, including multiple versions of Python2 or Python3 simultaneously. This allows for parallel usage of Python2 and Python3, and is required with tools like `tox`. For example, to instruct Pyenv to first use your system Python and Python3 (which are e.g. 2.7.9 and 3.4.2) but also have Python 3.3.6, 3.2.1, and 2.5.2 available, you first `pyenv install` the missing versions, then set `pyenv global system 3.3.6 3.2.1 2.5.2`. Then you'll be able to invoke any of those versions with an appropriate `pythonX` or `pythonX.Y` name. You can also specify multiple versions in a `.python-version` file by hand, separated by newlines. Lines starting with a `#` are ignored. [`pyenv which `](COMMANDS.md#pyenv-which) displays which real executable would be run when you invoke `` via a shim. E.g. if you have 3.3.6, 3.2.1 and 2.5.2 installed of which 3.3.6 and 2.5.2 are selected and your system Python is 3.2.5, `pyenv which python2.5` should display `$(pyenv root)/versions/2.5.2/bin/python2.5`, `pyenv which python3` -- `$(pyenv root)/versions/3.3.6/bin/python3` and `pyenv which python3.2` -- path to your system Python due to the fall-through (see below). Shims also fall through to anything further on `PATH` if the corresponding executable is not present in any of the selected Python installations. This allows you to use any programs installed elsewhere on the system as long as they are not shadowed by a selected Python installation. ### Locating Pyenv-provided Python installations Once pyenv has determined which version of Python your application has specified, it passes the command along to the corresponding Python installation. Each Python version is installed into its own directory under `$(pyenv root)/versions`. For example, you might have these versions installed: * `$(pyenv root)/versions/2.7.8/` * `$(pyenv root)/versions/3.4.2/` * `$(pyenv root)/versions/pypy-2.4.0/` As far as Pyenv is concerned, version names are simply directories under `$(pyenv root)/versions`. ---- ## Advanced Configuration Skip this section unless you must know what every line in your shell profile is doing. Also see the [Environment variables](#environment-variables) section for the environment variables that control Pyenv's behavior. `pyenv init` is the only command that crosses the line of loading extra commands into your shell. Coming from RVM, some of you might be opposed to this idea. Here's what `eval "$(pyenv init -)"` actually does: 1. **Finds current shell.** `pyenv init` figures out what shell you are using, as the exact commands of `eval "$(pyenv init -)"` vary depending on shell. Specifying which shell you are using (e.g. `eval "$(pyenv init - bash)"`) is preferred, because it reduces launch time significantly. 2. **Sets up the shims path.** This is what allows Pyenv to intercept and redirect invocations of `python`, `pip` etc. transparently. It prepends `$(pyenv root)/shims` to your `$PATH`. It also deletes any other instances of `$(pyenv root)/shims` on `PATH` which allows to invoke `eval "$(pyenv init -)"` multiple times without getting duplicate `PATH` entries. 3. **Installs autocompletion.** This is entirely optional but pretty useful. Sourcing `/completions/pyenv.bash` will set that up. There are also completions for Zsh, Fish and PowerShell. 4. **Rehashes shims.** From time to time you'll need to rebuild your shim files. Doing this on init makes sure everything is up to date. You can always run `pyenv rehash` manually. 5. **Installs `pyenv` into the current shell as a shell function.** This bit is also optional, but allows pyenv and plugins to change variables in your current shell. This is required for some commands like `pyenv shell` to work. The sh dispatcher doesn't do anything crazy like override `cd` or hack your shell prompt, but if for some reason you need `pyenv` to be a real script rather than a shell function, you can safely skip it. `eval "$(pyenv init --path)"` only does items 2 and 4. To see exactly what happens under the hood for yourself, run `pyenv init -` or `pyenv init --path`. `eval "$(pyenv init -)"` is supposed to run at any interactive shell's startup (including nested shells -- e.g. those invoked from editors) so that you get completion and convenience shell functions. `eval "$(pyenv init --path)"` can be used instead of `eval "$(pyenv init -)"` to just enable shims, without shell integration. It can also be used to bump shims to the front of `PATH` after some other logic has prepended stuff to `PATH` that may shadow Pyenv's shims. * In particular, in Debian-based distributions, the stock `~/.profile` prepends per-user `bin` directories to `PATH` after having sourced `~/.bashrc`. This necessitates appending a `pyenv init` call to `~/.profile` as well as `~/.bashrc` in these distributions because the system's Pip places executables for modules installed by a non-root user into those per-user `bin` directories. ### Using Pyenv without shims If you don't want to use `pyenv init` and shims, you can still benefit from pyenv's ability to install Python versions for you. Just run `pyenv install` and you will find versions installed in `$(pyenv root)/versions`. You can manually execute or symlink them as required, or you can use [`pyenv exec `](COMMANDS.md#pyenv-exec) whenever you want `` to be affected by Pyenv's version selection as currently configured. `pyenv exec` works by prepending `$(pyenv root)/versions//bin` to `PATH` in the ``'s environment, the same as what e.g. RVM does. ### Running nested shells from Python-based programs In addition to altering `PATH`, `pyenv exec` sets `PYENV_VERSION` in the executed program's environment to ensure that it won't spontaneouly switch to using a different Python version. Some Python-based programs (e.g. Jupyter) can spawn nested shell sessions. `pyenv version` in such a shell would dutily report that the current version was set by an environment variable. Depending on your use case, this version lock may be undesirable. In this case, you need to change or unset the environment variable, either directly or via `pyenv shell`. To automate this, you can do so in your shell's interactive startup file, detecting the nested shell session via some characteristic environment variable that the spawning application sets. E.g. in Jupyter's case (as of this writing), it's `JUPYTER_SERVER_ROOT`, and the corresponding `~/.bashrc` line may look like this: ```bash [[ -n $JUPYTER_SERVER_ROOT ]] && unset PYENV_VERSION ``` ### Environment variables You can affect how Pyenv operates with the following environment variables: name | default | description -----|---------|------------ `PYENV_VERSION` | | Specifies the Python version to be used.
Also see [`pyenv shell`](COMMANDS.md#pyenv-shell) `PYENV_ROOT` | `~/.pyenv` | Defines the directory under which Python versions and shims reside.
Also see [`pyenv root`](COMMANDS.md#pyenv-root) `PYENV_DEBUG` | | Outputs debug information.
Also as: `pyenv --debug ` `PYENV_HOOK_PATH` | [_see wiki_][hooks] | Colon-separated list of paths searched for pyenv hooks. `PYENV_DIR` | `$PWD` | Directory to start searching for `.python-version` files. See also [_Special environment variables_ in Python-Build's README](plugins/python-build/README.md#special-environment-variables) for environment variables that can be used to customize the build. ---- ## Development The pyenv source code is [hosted on GitHub](https://github.com/pyenv/pyenv). It's clean, modular, and easy to understand, even if you're not a shell hacker. Tests are executed using [Bats](https://github.com/bats-core/bats-core): bats test bats/test/.bats ### Contributing Feel free to submit pull requests and file bugs on the [issue tracker](https://github.com/pyenv/pyenv/issues). See [CONTRIBUTING.md](CONTRIBUTING.md) for more details on submitting changes. ### Version History See [CHANGELOG.md](CHANGELOG.md). ### License [The MIT License](LICENSE) [pyenv-virtualenv]: https://github.com/pyenv/pyenv-virtualenv#readme [hooks]: https://github.com/pyenv/pyenv/wiki/Authoring-plugins#pyenv-hooks pyenv-pyenv-485090e/bin/000077500000000000000000000000001517431316200150455ustar00rootroot00000000000000pyenv-pyenv-485090e/bin/pyenv000077700000000000000000000000001517431316200210362../libexec/pyenvustar00rootroot00000000000000pyenv-pyenv-485090e/completions/000077500000000000000000000000001517431316200166315ustar00rootroot00000000000000pyenv-pyenv-485090e/completions/pyenv.bash000066400000000000000000000006261517431316200206350ustar00rootroot00000000000000_pyenv() { COMPREPLY=() local word="${COMP_WORDS[COMP_CWORD]}" if [ "$COMP_CWORD" -eq 1 ]; then COMPREPLY=( $(compgen -W "$(pyenv commands)" -- "$word") ) else local words=("${COMP_WORDS[@]}") unset words[0] unset words[$COMP_CWORD] local completions=$(pyenv completions "${words[@]}") COMPREPLY=( $(compgen -W "$completions" -- "$word") ) fi } complete -F _pyenv pyenv pyenv-pyenv-485090e/completions/pyenv.fish000066400000000000000000000010351517431316200206440ustar00rootroot00000000000000function __fish_pyenv_needs_command set cmd (commandline -opc) if [ (count $cmd) -eq 1 -a $cmd[1] = 'pyenv' ] return 0 end return 1 end function __fish_pyenv_using_command set cmd (commandline -opc) if [ (count $cmd) -gt 1 ] if [ $argv[1] = $cmd[2] ] return 0 end end return 1 end complete -f -c pyenv -n '__fish_pyenv_needs_command' -a '(pyenv commands)' for cmd in (pyenv commands) complete -f -c pyenv -n "__fish_pyenv_using_command $cmd" -a \ "(pyenv completions (commandline -opc)[2..-1])" end pyenv-pyenv-485090e/completions/pyenv.pwsh000066400000000000000000000013111517431316200206710ustar00rootroot00000000000000$scriptblock = { param($wordToComplete, $commandAst, $cursorPosition) $words = $commandAst.ToString() if ( $wordToComplete ) { $matches = (($words[0..$cursorPosition] -join '') | Select-String -Pattern "\s+" -AllMatches).Matches if ( $matches ) { $cursorPosition = $matches[-1].Index - 1 } } $words = $words[0..$cursorPosition] -join '' -split "\s+" if ( $words.Count -ge 2 ) { pyenv completions $words[1] | where { $_ -match $wordToComplete } } else { pyenv commands | where { $_ -match $wordToComplete } } } Register-ArgumentCompleter -Native -CommandName pyenv -ScriptBlock $scriptblock pyenv-pyenv-485090e/completions/pyenv.zsh000066400000000000000000000004521517431316200205210ustar00rootroot00000000000000if [[ ! -o interactive ]]; then return fi compctl -K _pyenv pyenv _pyenv() { local words completions read -cA words if [ "${#words}" -eq 2 ]; then completions="$(pyenv commands)" else completions="$(pyenv completions ${words[2,-2]})" fi reply=(${(ps:\n:)completions}) } pyenv-pyenv-485090e/install_local_python.gif000066400000000000000000020461341517431316200212170ustar00rootroot00000000000000GIF89a€¥÷1 ÿ       "     "!!!#'!  !"!".#$'"7%'?# ,G&,,(+- /K 5V!! "!+"0#(<#8$&"$8Y%%.%>c&(3&?''/'E((%(('()*(,<(Dm*)1*-3*Ju++(++4+C+F+F+N|,Q‚--+-L..0./3.T‡//-/Q0/80X0[2202^2_˜33/3cž43<45/4504524g¥5525645Z6636646676G 6[‘6^76276476?7867b7dŸ7f7h§8618m 997:9@;^;d;g<<<>c&(3&?''/'E((%(('()*(,<(Dm*)1*-3*Ju++(++4+C+F+F+N|,Q‚--+-L..0./3.T‡//-/Q0/80X0[2202^2_˜33/3cž43<45/4504524g¥5525645Z6636646676G 6[‘6^76276476?7867b7dŸ7f7h§8618m 997:9@;^;d;g<<<>)e”TNie•X^©e–\îøá}àÈá–dRÙ‡ sä‡_sÌaGœtÖigœz$ÈŒ|öÑçŸ~ è ‚J衆&Šè¢Š6Ê裎F 餒VJ饖fŠé¦švÊé§ž† *¨ùã¨Ö¹Ç‰rߌ ÿ:ç¬rÖ:§Œ¥Ö 'šÈë‰Ì¡æGlÞ«È&«ì²ÌºQªŸ]F[æ´ÒVKíµÖf‹í¶ÚvËí·ÞÚØÇ!n¤‘ìn «nºì¢{n"1Æhn³ô*›F›&æKàžÂ®9Çž{¸‘(lðÁ÷á,~¼êëp¯?,qÄOlqÅ_¬qƧ&‡Œ0'qƪp "§\p"ζÚê«¢Æ|èäëQ±«ºŠ&œðìsÏ@ÿì3(•¤±çÆHsœôÒJ7ÍôÓNG µÃ¼:»sÐX 4(8ÛGip’õØZƒœÆ×ÏŽé!:âöÛŽè¡£ ¦ÚÜ›_£+öÞ|÷ÿíwÏiÀ«öà2Nøá†'ŽøâŠ7ÎøãŽGùŸÀ¦òߘó Ê!ã—Ï™‡Î‰øÉ(y ~Èh †øÁ`Ìw~Š_¿Ä¶™óÕ¢ûMôÙ“ŸüðÂOüñÆ'üòÊ;Ú5  ô}ÁOˆ×{|Þ;æ ¤fÚÂÂ6›øbŒ1¾¬ÊëÜ|Öí/¯èF/ýÈ~k"Ú¦3¯óû÷Ï¿¡‰pY¤@ðùï€ÿCà¢*w¹½MN}ÈÜæ:×1Mzœ˜^æÒµ«G©Qµ‹Û!ìg´£úÐ=Úá 6bW¶‹•Ý8R,8é t{‹•»ô0‡JH¯hoR`ÿ‡(Ä":Š€­‚„« =õ¡‰Z@– Hô!€Ú‚´°V‹€7"àxˆü]1€øa" ÙGÄ6qSÏ“ŸØˆV e@C¼Á (®ç&íù­7€ôMßÌ6ý˜‘P ”ŒÜ¶G€#…*D¡>êá 6 Ê}¹ã—ÎüF x°Cñ`;„áC¾ÙV‡t£*߸Ê!ú) \ƒ¤#-HÁr‚Ö! e¨C‹«’ÂÄ xõAëPÇ5F—-ˆA FKDnÉ2gjAwûÙ‚6[ ÌXýa¥8[FËɱ=¬X?ÖÉV”Rsœ3¦q8GVØóž¼ãÿ¦qÂeÿ ¨•Cðð‘õHè$ëAIÃ’1ÄÝÍæÀ¶ø¨E?6ªylôzãï‚HÎ’Žó¤Š‹Õ/”Q a°¥¨D3¤ñ‹<)ƒýhÆ4ø f@¢ÐàD/ëx<ƒé+Ü  a0<üE4z‘†V0CÏÅ ÑÄ9رi¨Ä2¢Q‹-ˆ!Œg„Jת¼8:°çȇ2@QŒ| £"Í ÃäÇ9&Büب`•½½Ò3[b@[õBÁ9Ї¾ GBïaÉÚ£¡í¨ÝŸ09QMž€Ýh%¨±QxôᜧD¬IWËÖÖV [(G?àÁuÿðã¬H‡:òÑŠ®£Ì€F?~Û `ô£ëÇÊVx¿P:Ò |üVÂÈ<æ a 7ꃤЄkÌ#ò(E6æ‘iTCgK×uçÚú:Žò#+ø ¹¡üh$Î9Ay^кH°‚G²¾ísf_¨ËÑ*DåÇ`pF ë|Øcý¸ éÑÂÕAK†þªè çÚ~œÃ¬PÆ7@9‘q öÍ1kKšŸ-xc¬È3¼H#üÇ9´Óhäòð`[Žu¤aÊÐ-;ÆQŒyì!éC>¨‘Žx Aç0.(œÜ iPƒÿQC? q~4CÞ˜é ñŽh4C«8Þ±ŽçV±U‚ýÆÀŒÜ]@ÂzÅ^_3X  J#—–F-ÞÙ³îR­†b+ÁÕ&þ3•|Z$)Y}t8ûH( GÐM¢wû—©6¹·Jè"Ñ+E Ð!›ò¬ª´ —Ò@hAéŲ7ÜyTcÑ6†`g'ÏaØèE?@QåQpw¨†7€‘@ÄÃC˜G6’¹x¤Ã»shÆ<Š‘vdCÑhB>¦1oðcÎL4¦r¬‘Ù~ç2y¬¬êèÎO0ÍÓ G>F>ra4poÿVT?á5Þ–³êá„:Ú¡ÂI‚ØÃ#Ö­‘jçNżãZ+ÛQ\£´i°±÷¾¦ì¦G|ˆ®Ò9æQ ~(ƒð@Ç<šÑj$§:åGæ!JcìHľå1Žu¬£êHC<âÓbPC®ü i?žñI7S Eåz/³œjôWaQ¼×ÓNh7Ö¯ÊàG<²þ rŽ‘î#= ý÷¿Ø”žNv¨ï£‰j`ã×ÈF)¼83@8‚ ¬®ˆ÷ÑáʦÐ`0Ä­gØ"]ÇoŽ•Å3ø‘D£üÇ/P+†= iñÐg|±…i¬cñÆ4С xœÏèþÿ9àqÓxìz^G:ÐaŽ&dëx†õ[á†í²C{àD9¢¬aÔÀ 0àµÐQÑ0ÑîP Þ€ ³X0}ø)rÂÀh éàyä@@AÇbº óP‚%hrç4:øa¦ &(rº 0ˆBs` ‘„±æj"¦í° `Òs¸FCeCùå¤Et‚%X›6=ESHø„Ò7<0‚,“3s`.b€.i ÷r…ä2…i`.sÐ ó€Ê  ÍÀCs éÀ¤s…æ²Ê0n´Ô0Á†n6ó†Q…2Sh”‡@a{PWð@`{•=ô¤_Ù Þÿ¨ xeX¡j”ã*€Ðy[ðE¨-®×Ž@s’%k’ÕP•Ô0턽çYÀÇ ½`» `±¨ Ì#Ö‡¸è‡ä*®2ˆù¡'À(PWtE¼Â‹»2£0ìè a’Þ J„Dn ò0 ¬+gDFÿtä‹ës‹º8Ž©&M'ç@ÓñP Ÿ—Ah`‹¨"æ2œ†r+)K„D®)!äsY‘D …B=è—¨ŠÁ&@÷VÔDÉD‰ 9MÈtäX‘¹ˆ)iÓ‰­'(±²[è=ù,–'bpê£rÚÈFi‘†ˆÜÃU‹˜ˆ“6GôzŠ7’€ÿ²/üäzŽ+¾@s”Bà° WDRüÂ{ é{¼F“)3HÍg”,¹’RY<¿P~‚E9Ia_£a2•^i):#=ï&a³=˜“r $$üغ7ˆ.d àÐíé³`…”¡Dˆ–?¤xQ9˜_ÉVâX˜„Ù’Ž—‚h¹G’¶y€É iÀ•8©8{:é:¯Ãœé‰†ÂY¹ÆŠeC6d?Îw˜‰‰˜ª™š¬YD•30¤9š< ÒdLg›¤©‚”@†Ð›º—XÙ—µ*a£2*#M­™œ«¹œÊ¹cébœ*ƒ.Ð’!£ K‡šýšB8#³MõR/Úÿ”ÌYžÍižè9a"^î2åòžó²,ºT# £KáI/Ó”‡*iR·Ã—¡ñ"M0 Z Z Û´¦#5 :5 ú ¡:¡Z¡3'Zp z ×Ät\9M¢ºt­t‹Ü¹0~°¢®òHô¢0Ú*FÉ•\ &6&8z£:ª 9Ê£:š£@ú£B¤D:¤FZ¤Hz¤Jš¤Lº¤NÚ¤Pú¤R¥T:¥VZ¥Xz¥Zš¥\º¥^Ú¥WÔD1:¦'Χ>d:¦¹+áò$+š:;r&a+)*+ &4º*|z*}Ú§]‰#z8J£rj¨ˆ*§or¨sÿº•Œj¨Gš¨’ú¨”:©–Z©˜z©šš©œº©žÚ© ú©¢ª¤:ª¦Zª¨zªªšª¬ºª®Zª7b¦~:« #’Z«¸ê§6ª~€§r¡pR§Ä,‚ –¦0ºXHDa(aÏú¬”¬ÐZ­Ñj­Øz­Úš­Üº­ÞÚ­àú­â®ä:®æZ®èz®êš®ìº®îÚ®ðú®ò¯ô:¯öš­Ç*8#5°&R°+°\T°Zt°›°‹°[ÄE «°û°±ZÔ°k±›±»±Û±û±² ;²"[²${²&›²(»²*Û²,û².³0;³;°6ÿ{³8›³:»³4Û³»Eb`VB{°ðA,&P%à%IÛ´Jû´I›Ik/ ´@PWË´`$pG˵ÐN[¶P{¶f›¶Ok]Û¶l˶f«´%@¶$Pu{·v›·x»·zÛ·|û·~¸€;¸‚[¸„{¸†›¸ˆ»¸ŠÛ¸Œû¸Ž¹;¹’[¹”{¹–›¹˜»¹šÛ¹œ‹¸" í)KÈ’°&'`%%­ûº®»%@ % !€( «û»I %`!0. «K4À¼ÎÛ¼Ðû¼Òû%@½Ö[½Õ+½ÑK¿ËºH‹ÿ º(àä[¾æ{¾è›¾ê»¾ìÛ¾îû¾ð¿ò;¿ô[¿ö{¿ø›¿ú»¿üÛ¿þû¿Ü¿­(ÐÄ™"ê2°&/P8ðÀ)P%P)€)àº1Á<`G Qp& ) Â7ÐÀ7 Á" @ ð3970»4€L8Œ5\5@1€Ã@̽Œ¿KÁ6ÜÃ?l@üÃ2€M,0ÀXà`É{Å2€ÅZœÅ\¼Å^ÜÅ`üÅbÆd<Æf\Æh|ÆjœÆl¼ÆnÜÆpüÆrÇt<Çv\Çx|ÇzœÇ|¼Ç~ÜÇe\/ PÙà Óð Ïÿ " ¼&·›Û ¼ °º/ ³ð ¢€»Å ’ü€À—ÊŒp0¯<&€3€»,¶Œ¬Û˼+ º¬! ¸«Ë.À»(€ Ì¬Ì+Ð0 ½Å|ÍÄœÍØ¼ÍÚÜÍÜüÍÞÎà<Îâ\Îä|ÎæœÎè¼ÎêÜÎìüÎîÏð<Ïò\Ïô|ÏöœÏø¼ÏúÜÏü¼ÎÖìBP×0ßPÌ. üÀWðÐOPB GPop7@$ðf¨ à žfÀ"Àj)ðGÀ™ 7À¡P6ÿ Ñ6 I dÀ ÀeðY,àLÁ3€+àQðQ 6@ NÝ.P2€B01 €Ã9´N ã Ë@¶ܽjÝËkÝÖlýÖn×p=×r]×t}×v×x½×zÝ×|ý×~Ø€=Ø‚]Ø„}؆؈½ØŠÝØŒ=Ø €bP åðˆã€ è²Ð7â@ ¨ ± ¢ ¨ °ðÙ±  § ³ð¹@, 6- <@@ j0¹@ ²íÉQp §€ À< §à ³@ ¾Ëº7ào ¦ 02ÿ- ž &ýN ¸À8Ð8`4àÅ ‘€ HÃØ{½ø}ßúßü½ßþÝßþßà>à^à~à žà ¾àÞàþàá>á^á~ážá^E ­Pßâ ™m§, f @™ GðOðÛ( ²ÀW0 Û"p ¤PO WÀ³@e` W O o0©PÐ ¢ ° Q0 Y¨ðâŠp &Ó<À%À¨À ¨0G ŠÀ5 º. Ì `DÐràLà€ ã Áð%@݃^è¾{è†ÿžèˆ¾èŠÞèŒþèŽé>é’^é”~閞阾éšÞéœþéžê >ê¢^ê¤~ꦞ꨾êªnéðá!þˆâ€ zàš}7)ž™Š ð§ §@ <ð¤°É©àÚ @ ¦ä©0ä³po oÀåoÀ²`ð¨¡à §(€ q j M ” ²ð²Pp²ððÃ~ Bà3àÈ»L@a U€ ÒPÒ ìØÿØñŸñ¿ñßñÿñò ?ò"Ï×-¬`#.Û`¶ ­â—ÿ…p @ o Œp 3€æ4ð·Àí™ÀìŒ 0ðÑ>EN¢À±í²À å ¤ Q Y¨à À¯`ÒdP…@æŠ …€ @°)€9žàÀp€dK°÷ °*ð xp ½Ða]ò$Ÿøˆ¿øŠßøŒÿøŽù?ù’/×ë"Nâ´þòq7` jà tðžp±° <ð²î8Ÿ¡` ð¨Ó¤@ ™ Û<@ OàÐO°Â¨ ¢0 qQð ž ,0§` ï"¬Ë3  ¢ … Jÿîžð O  àì° °ÇûË9ªÀ Íð Ý€€Ë•Oùö_ÿøÿúŸÿü¿ÿ£„@‚ DxPaB† 6„øP!Œ„ˆieî[8qÛì¸@äH’%Mž$iG%W¢DÉ‚áÈ›2WÔÜà%N”7G4)ƒÁ&OvÆy2á©2<AõFM1F<‘ÊCSq̨á!F )f pQâÊŸ+%HÜ ) %z ÃS!† kÀAe×´hx0À Q±ÄÅ?vòdÉ•)_¶œófÍ9öôhÑ¥9w(‚±ÜFqØò€D[vI4ÿ4ˆÈ AÄ$d ¾5¨Ð!Fr68äΠ†ˆ+™:뤷ֺk®¿Ž¸Ã]AüjƒU¡P¬o][²ôÖ|;n«½¦l»ëÆûnu—æ³l³g“ÚE½ó&|pà GüðŒ9»#¿ÿŽ mµO¼rÊ/·>q}mä`"%¹HJr­Œâ$5YIN~­‘Oüc'E¹IR^ì’%Ü(UYJVÚê“cÜâ*eÙJZÖé”1Ìä,uYK^6è•uŒe/…¹Kbr.5îêÛý˜Ëa6³˜Ï¬šØš—E?š×ÿtf6rËeò›ßÔf3iHk†œç¬%7AwHt¶Óœš§!ùNwÖs“ê„;é¹O{â1ž÷+g?ù9Ð8âóoúhB IJQz UhD•hP³!¢•hZÍyf£]!E¡fQ–¤laãˆËŽžÔ¤/åŸHCFR—Ö¦ÔÛè:jSžÞ”ÇdÚö”¹NfúÔ¨=¥]Nó¹Ó£6©•“é¼hêTª>Õ“)æP—ÚÒªvÕªx‹*°ŠúU²zµnJ=(S˺V³&-¬€š*[åÚVr¡µ¢j¥ë\õª4 &³Dõæ^›WWb}ÝêC ;XÆî®¯žÓêÿAǺXÊ6VCv)^-[YÎ6ñ±½‹lE'»YÒvV4˜©fM[ZÖVæ­ôíjeÛÚh2ï°Ž %mg»[ȼöl±Õmpy[ÔJUµÂEîn}+2à7¹´-.°Žë\ênv¹€kîs«»ØèÂuºÚ/a¯µìn7¼‚í.½¾k^ö²u¼‘+ïyÛëÔôžm½òÅoSß[¢øÎ7¿V­¯Èîë_Ût¿¡ëï ìÑnÀ †pF»/8ÂmpÔlat´©ð…;ìÎ GnÃ"Fq;?¼ÃT¦ØÅ&-q‰N<âksÅ 1uœÍC«5ÞqBolÄÙȳìqìfÿ|d&‹rÈP l›¼Ï$ÓfÉRÆr)Ÿ×,w™—UNÉ•§ìeAn¹Èd3"Á(1£ÙÍf4s”ÓüæU®Ùˆmžsž­çÓYÏ´´ó#ûg?;ù³BE¬då\hBK2йet¤Égá5ZÒ‹|4ž/miRšÓ›d¦ êOÃÑÓ¤FuE=èT·z¢‡¦&`û\jW3qÕn¬5­»xj]ç:‰·Ž¤¯{=GX‡v¤g¶°Çìd7[мV¶³gÈìhW[‚Ж¶µHílwû„ØÖ¶· Èíp—»|à·¹—mØâVÓé†wæÐ­îxWÜõ¦÷õæo~ïÞùîwñö pÿ‚_îß/xêŽp†kîà o8æqŠ_Uš·å»+¾qXM<â×ÚÃ?>rÄyä$'šÈO¾r‹™å,G—Ê_>s;Ñ¢]4Íu>4™Ã|ç{³9n‘ís¢[¨ç?/ºc÷Ù›;çIG:ÛØAw:êP¯•˱~õ7}ë_ŸÖ¹v_N}¥À´:ÙÇN'±«Ýí—ñúÚß^š¶ËÝûÜëÝïºx»3žö½ÿ=4}/|â•xªžÕЇ<ƒoøÈ Ìì±N,®+OùÌL~óŸoãÏNNÂsôŒñ¼éÕž÷Ó«>õ­‡<ëUú×Ï~벇½ákŸû½ãÿÞö‘ßýï‹î{ÞÏ=øÅ_;ñ…_øã/ŸåÊG>Ù›ý¨CßùrŸþõ9n}êc=ûÝ×9÷µõïââ?ÑËŸ~”£ßü;_ÿûî~ö¯<þõ8ýåÿòûïßÜúÇ¿ë¿ 8ô¿À´6$À„KÀ¬7T@„{À 6 „À|«À 7 ´@|ÛÀt5äÀr Á”6Át;Á$5DÁjkÁ6tÁl›Á”4¤A_ËÁ,5ÔÁdûÁ!ô3!ÂV+Â$l4$4BZ[Â'D3'dBP‹Â*Ì3*”BK»Â-Ì2-ÄÂHëÂ0œ20ôB=Ã3Ü13$Cÿ:KÃ6426TÃ1{Ã9ì09„C2«ÃåÓ?õÓ@ÔAÔB%ÔC5ÔDEÔEUÔFeÔGuÔH…ÔI•ÔJ¥ÔKµÔLÅÔMÕÔNåÔOõÔPÕQUG]”°‹9S7Xƒ9Xƒ9u$8 U°Õ[ÅÕ\ÕÕ]åÕ^õÕ_Ö`Öa%Öb5ÖcEÖdUÖeeÖfuÖg…Öh•Öi¥Öj}ÖÀV€€måÖmµP€Xu¤q%×r5×sE×tU×ue×vu×w…×xE‰0¥×:­×{µ×|Å×}Õ×~å×õ×€ØØ‚%؃5Ø„EØ…U؆e؇u؈…؉•Ø±Š¥Ø‹µØŒÅØÕØŽåXŒ‰1•ב%Ù’5Ù“EÙ”UÙ•eÙ–uÙ—…Ù˜•Ù™¥ÙšµÙ›ÅÙœÕÙåÙžõÙŸÚ Ú¡%Ú¢5Ú£EÚ¤UÚ¥eÚ¦uÚ§…Ú¨•Ú©¥ÚªµÚ«ÅÚ¬ÕÚ­åÚ®õÚ¯Û°Û±%Û²5Û³EÛ´UÛµeÛ¶uÛ·…Û¸•Û¹¥ÛºµÛ»ÅÛ¼ÕÛ½åÛ¾õÛ¿ÜÀÜÁ%ÜÂ5ÜÃEÜš !ù ,! MÄH° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç Cn ²¤É“(Sª\ɲ¥Ë—0cR@R¦Í›8sêÜɳ§ÏŸiÖJ´¨Ñ£H“*]Ê´©Ó§P£JJµªÕ«X³jÝʵ«×¯`ÊK¶¬Ù³hÓª]˶­Û·pãÊK·®Ý»xóêÝË·¯ß¿€ L¸°áÈ+^̸±ãÇsÂ;¹²åË"åaÞ̹³çÏ CO'º´éÈ¥N«^8 !ù ,y*ÿøgП48¨‡ \$P’Å‹’Iä"ÐG‹9>¶ÐE" ¬Š [Iì“:´ûG“f= )ÊØ±£‡"ÒýÛGÔ= ;RhÐ`À‰ Cýíûwt…€ä°ºuLL€uQýQ­pãê]ò„+Aè>bª°£A¯rp+e.,U 2®6øuíAƒiÁÊEJpŒº½ÎmðíTß·q)à¸êà¼fÑÒ]p+õ¯ŒÇv¯±jF(€º¡DÿnÆÑ Ø· $ ÍØñ Št•òcX¸™Ë^ÅA"¬ô‘C]N™œy–xA#ÀG( ð"†B)RÀ¸q"lj0Ì',‘=Œøñà _"ÿÿýI D!ù ,}*ÿôùÓG€Áƒ ú3èÂ?| à3±bÁ‹ 2¸hPÇ—$I RÀ"„] ré²² Ë-rÄÜð„%B%p’(Ñ¡%ÂM¦(BŒ% Ê(!ã…Ó4&èùGµj´DJÜ0ØCGŒ=j¼ØA¿}h÷ýkV Ç‰ PXч+”ù篯Z¶?N´8èå^D6è`ª¯ßµ~ÀÃà7"9Ò•:0)&Çg!÷ â ¶_†Qðì¾Ùö@ÂiË È1曜½ŽÕ:k{b2‡§'Dˆfnš‚©Á!ï€q¢ò3sPDlPDU臻lP† ʤ³âÀlt¶Ó« `PAFŒSæ–5Ð>ôð÷%ÄÐË07ÄÁTUùóÏ•Q†R $°T ;ÈᆆrÈ… 1U†=ŒˆT AÐRKÁX` 8ÈPc $¢ŒKÉpPeæxD i¤F&iP@!ù ,¤!ù ,ƒ*ÿHðOƒ ì#€OCJT8hÑ¢Š]’ÄqcB.\tá2²K—"ZœPÙ‚ bx(1³D„PņéÌÙƒÃ@8bà(!£Äßþ)] …C @wÜ(qcG¬ýÛçk=( j ±`ƒŽ ¨ •«¿®J:¬À¡/-ˆü*¦¶­o»"ñyª€uJrp£Ö Šj€ßîCÒA…€šf.€häEìSÀš0cW­º`ÔFïS"ÆÀ †mÓqD‰‚¶g—p ‰'Ø¢ýŠæ&¶[¸µBÁ°ƒ”a͆m€ü\ø@;¨vnH0 [Ù´-£?€ øëoéäáÚ¯ƒƒ9nÈ! ,À@{1õB /@ÁƒPpAƒÉU ÒP‚8èàá 9œ@m1$(À 2Èà +Âp Ú¦ŒùÕH¢B ш£@!ù ,¤!ù ,‡+ÿÈG@ÁƒûP¨Pà¢-’(Q¤‹’.]„( Ë@.]@‚ ٢ʼn-6ñ"°„€%b¼ŒIÓÃa8q A&G%€ å äŸÑ£ßüàøãÆ;tôèABI=û²þ³6ÇT¬x!Á‚ G®úÃúÛ€¹¹°!T¨^ÁzÙ·–­Û¥|¨&Àœ—ÔÖÂæŒßµûÚ¾å(à™³ÓšÐômoßÈ!Rp®YiÄhêE-[®pr»!€ÈÒRkâå1ÛkJfø¬TjÊ„2×ûóÖ·27 ü¥%«IÊè:â;2pÀ88w(ЄŽj€HÀÝ9lŸ7vØtÇÓ2öõ÷[ðB% P)Èá†êa…0”@288`P"P`á@À >A”„@ÁƒQé B'È„ŸK 0!P´Ý '4ø€æ¡@*¾DÙŽ” Q@!ù ,‘+ÿÀ‡ A}$L8Pà E#.’D±bC\ºdÜHF@‹'N´Ø@¥ËÀ%P¢¼ñ@Q±a0‡SÂÁƒÀ2pâì1àÙ¿Ÿ@9¨!`Ç;Œ– ’ Ù¿}ûüEÕSh:"âˆX²d1zôlëÂÖ¦9~îË‘ l™2ân]{!n¹!ù ,¤!ù ,¤!ù ,˜+ Ãì#PA‚J’t‰á„\È<9ѢŠTº¼AQ±a ‡SÂÁƒ€¢ý[ÉR‘ƒ€$höoß>7õT€éÍ›þüýÓ¦œI?ƒ %*CÀ³fÅj*ý§èçÂDº4BÓr3¥‡SÎÄvmª¨@Ò±DÍêp«–lÓÞv5‹’¦Ò®7bð D›Ã‡{Œ„ƒ"P  "!ã7t¨¨±ƒFÂÅ'`Ȩ!Cðg¦O«N!ù ,‘+ÿHÏ@ƒö° C‚‹Eœ(éRÅŠ‹:ì±cÇ-Zœh±ÁGc”Pɲ„‡^ņÉ,ÆŠB ”dÐÐɳF…zÿ‚uWàÎ;h¼PJƒ†yþöEý§.Q”¬X‚kôþù›º®@œmX8q£D‰ÂŽÝ÷¯ìYÏ:›¶ ÇÊ·ä’5;pœ€+˜›ô@G'r€;xÇÀpG2ðÍ/ ·‘'¦«®(A4 lÆ@Ç 0n°¨0š*aéŽxèñž °eä8ÁB4eºe¯ ¼!C`1%d” £Ä ãsmßÀ@@t2¤Ç[ˆ±óFÜã¶Þ?Pºø•2SöW×l ÍÝG7º¡…7à¤ßD ``@Nàí§ß 7è ‚lgÝa„ ƒ5<¸!AÍtŸ†#âçŠ!ù ,œ*ÿH°`A@€ ä#€a#"LhpÐ"‹]’´Q’$„)Ð¥$—’O6´X¹ò‰*$ Æ(13F eŠ Û9¬X 0 Ò1tè¿þ)]ª+Áƒ/hÐèõ‡]ÿöiÝ÷ƒW¬ÀÀ`Eˆzeõç«×O8qâBV%4X)¥v[· zÄ¥+àÁ¤uV £†ÕoÛ® vܰCÅ Ë* XÓU€[¨Sk³r*@†2JÈØÁ`Ø´#èNÜ í62Ašª9”ÁÖŒZ^´»&,`fêÔ8(P£w*@ß¿Ÿ ‹°áDÑ£'JÄ8a4G ?†I•ZLÓƒdÐÐÊ•FŠ%h4(ÁAË¿³h­ ø!àG/jìø±c+ º°Tв¯oßÔÁ A‡ˆàAG…Ñ1àë¯ò¾Óô UI+Ã’…ÊQ¡L³_P(XÙWÙßåÌl8+C›³cˈ`°BŒ]¨”-cÖ,ÐÂ+ëJ5XТÜ~¯n}9ðBz¨à k[9b$vÀ îwp×€‰WÐ!„‚zØ•¡Á7E °n] ã2Ñ ÓÌ7JœÊ/ì8Šû¡Øf$Àº4sL ‹3Ë43 ƒÔ¥Ç– %”Ø@pà €âÓ —Ùf1(UÂ=ô€Ã 'löÃ%XÑZe€‰H–@b‰ Ý ‡n<©%$CVJf)Ö U}TÀ Xe…e’eƒ 7Àp=Y‘BWΩ¦i.T§xö©P@!ù ,¼)ÿ h À‚&ô¡†*ì#>}, ¤ÈQ¢ÀA‹-9H€¤“—NFHF@—.\ºáÒ²E‹6[Pé’ðĉ1|nÈA@±aH‡#ÂÁƒA5hȸQBÆÔþiÝZ¦B„hÐÀñãÇ‘Ñþí[»¶LØ„j„𠀇i÷ùÛë¯L\bn ÁáˆR9¤©åë/L¼ aÇnÔœ©âl1ß2nØÐ@À¤ X¥« Ú°fž÷v•¡CÀn£üºFBÁ1g°õ~¦€c 6= R££€õuì¾Ihâ% Y)"?¾Ic¶JgᲉ'k<¦¤‚•bÍ&ÈËx¶&Q¢CöÙ/>°G8ùÄŠ1ö{ ÅP‚2Ä‚z¸!‡zÈуGÈÐ P1T0ÁcÉTUÞà 2ìPC‡dÁˆáŒ *!ù ,¤!ù ,Ç)ÿ(h Áƒ ôG!‡|ö‰(Q@‹.”hÐÆD’B^’tiÑÀ.(»p!ƒ’‹0aé"ðĉ%Nl8Q¢Ä¯cÂ;¡„5^Ð(!£ÄÒ}ÿ¢F]7ˆ€2hìøÑH ôüíûÏ\*¬HáAƒBÔóGª¹hÛ\¡)”®aGHÌ­[¶@èä$xÆŽU5i ‹ý‡nÀajÎ<“@9ôþ¾{˜X5ÍÌè!§$ôh¼¤=ð,µžqP\O&-@¡Ó¢P¤J=Ñ»a+º€¡T(Vzý8>ÚpÚ¥"èÀРõähq”GÀ‘#G‰5N|÷GÙ2Φ%<4•ᡌ9nî[!°i ó1UP0Áà0L5ˆC 7À°C >´àA1Xx†!ù ,Ë)ÿ$PA‚*ð§àŸA #ä3QE}d̨pÑ Dƒ<.tIRII’$váÒ¥e—'ZÈ”ùDá‰%`l8q‚‚œdÂ+f…BÂ/^Ä!ãGcÿ¢J-Õ FA^ìØñƒaÿö‰Ý÷¯”ƒ(±b…‡" »ÏŸ?²¡ª$R¢]Ên5Ö.Þ;:à𬚰hG×½û/¯r¡ð­s SΛx@ŸqP"h²fnZº†+7À!`€€oVJ@C])]¢ýÉN, ¥̘ ;¦—èôt@D©eËD|¸€ ”TˆÑ Á`ž]p9züpª^8UâûzÀ)£Ã9r¸ ?” N4” ƒ‚D`–1¨à…LÝà 5$V¡DÉp ˆ!ޏP@!ù ,¤!ù ,¤!ù ,¤!ù ,¤!ù ,)Ñ#ÿH° Áƒ*\Ȱ¡Ã‡#JœØPÅ‹3jÜȱ£Ã?ôH²¤É“(%ö!ȧ/SÊœI³&ÅA‹-Â9Ȧϟ@k’Ð… —.dº Ê´©Ó‹N”ˆqâÄ0V'bD^T¡— ">y 3)åE— táŽ=þdˆ#NéeCU¤$–MþsK:|©&EW2©eŒ\®)§Ccºé$šsæÉP›Y çz*¦Žvš‰§ ˆZ +<î㨡q&*¨’+ºh)uQJ*(Š˜sÍ6Û`cÎ$dª©ž`@´:@xšh ?èðC¸Ö k¢àfP—»j l°z!ù ,7$ ÿ € (‚*\Ȱ¡Ã‡#JœH±¢Å‹3jÜÈ1"‚˜tI²¤É“(Sª\™Ðƒ€ %°œI³¦Í›89vP‘CÅŠ7JäJÔæŽ¢c M¨t¡À 7l £„ W9fݸB@׊4R<¤ÁQ(Á¦ÑVT»t­Ù’JãZl*ðD4tx€Q¢jG6ÈPcëÄŽN”؆Ã82ÊqõÄ ¶¡^´,à ²Iœ08H…ca¿H€Ð9¬¢†ÂžyÀ0H®‰7Ž”óèE"³?²ÙàEn± ¯é(€tx!PRo:z¡oePƒ]z€B±à¹œpðÄ:Ž ‚ Ü ¨€@Ûàuœb¾öoÇo@E¬o¢°Œ dPs›¥QVàÚ7†!å²åDˆ8¾ÑŒ£Ð€Ò Û­BÁ¸mðbÖC3X¡ &:1!=õÿ2†^€ƒÖƒÍuñm\ãk/P5ʱ6´íbF9b  ¯"Å0@γ;@{šÀ À¸Æa` ßÐpP ¿0Xe` Çö=Û Pð²7°2ÖPYÜ—\ 9Ó0 ÒÑ × éà!ÔÐ þ…0 ßÀ ß0GÑ`GŠ ìq“Á5%í€s ´ Õ  Wp T¦Ö$p"Òà  !à ípBÑÎPÛ V@V`aÆÖr` Ù·0'Ͱ ëÀ ÎP<‰DË€rÒ°L<²8À½@ H $pÿ’ç†#ÒV!#B Bq¬•`UãA €lAð1 .–9@@ æàÃâ]F‘–áªá.à.™Å#Ú!Ë*à"©´‚0-´")’JÚÑ&€Á@*±ˆ1`?QÉq#`µSùG ±a"dáV0ÿpÀLÿ Y°¤©m£4ð߈j™L6=ñ+)•}i`‚z:𠜃ÜѼñ¦dqÜ8¡ô‚e 4SÓ p ÿ°Àºÿ"M7¡*¡E‚¬|ª«H³q<Ê:ªˆÑê«È£mÑ%À­P) `£,ð,  µ0 ¨€; 6 #O° ¤0 ˜"£ð” Ê­9ú&ʓݯ)€9:¤5’ 1$$  Áॡ½ú«þàÂJ¬3ª¢6ø‘­,‹'`[€S>àBÿÀ€9À0³Y l ›ð YE BB°sð ˜ÀD0 fq0l°-€˜Il@Ðl01ÛbJ60–áEsŽA;G %ð7@ÑÇ Í á²û0²%ûKkÑžiá{º¸zz²-›9@ ¨Ð £  Žà¯±à0¸ £° l›€ £P ‘S° [à»À¨¤à” ¦ÀEP ¦ð ¹À®S °   >@ ©à»” 70jé°"0´€ ´pà£@ C["@vî  ÿð#à.@ð×C Š  @ð}²¾z¸$;¬/ö¸“{¿øë90 g° sp›B0Qð ¨ Œ@ 9µpºŸ " ¨`S° Yеl h@ I0 4[½B‹ €»µp- › Œ ÜëE >P>° ŽàŒ >°´à>‚×qËð`t@`Pc “ð þ a¿ˆK¿“¿Z¼Å ±¿[࿎° O› £ ¨Ð,À´pº 0 ` ¦pQ`Á:ÁlÀqÐÂŽ`´«€©P£°  ©0  sÿh@ B –@ µpµ°p«¨  ›à"@cäFÐC0tP6PrÀYÕ01k¸Wl²öËź̲û‹™0Œ B° q Ž` -p²0S Aû nl ¨ Ç´êú¨  ¤ ³@³¹à𠦀|ͬµÄ[•` >ÀY0s0"à³à.Œ B :ਹ°Æ“„ RðPа‹70¡ eÕ“Ö9V<¿!’Å»\Ñ“K¨`‡àŸ ¨0 v  ªàQ  !MÌíŠ B« ÆK ,<»9` Sÿ°\I  –KÌ©` ²ð +à±€ ¨0É" «A³ «0ðÁ  ­°"PO¦¼§2À /$ Ü0E ¿"+ÑõkÑl}¿*`IQ0Y€´q`Sp> 3Œê¨[À×*,LQL0g°Ñl»B  l³2']{`ë¦0f ³Im¨:p!%0³S–6³†Í¼Ë2 XyäD>£ü]­™y¡¹¼øA4PO¾=E>å8±äTþK‚”HIWÞå!ù ,¤!ù ,¤!ù ,¤!ù ,v>£HP`‰‚öh°á@Ü"Œ1PÉ%î` à›€ÈÀ-XoÈ(£ÄJ˜ ”‡Ë›2Z&±²àÊ–4dü<¡Ã%Bœ2n°,‘ã  ®œZ¢j §ŒŠ³ëT‘iRý¹´¥À¨Çz;S¤×® ߎe V­Ú¸vqÒ+÷&Þ¾búÍÛ3!჆ÃuÈ—jÀ!ù ,¤!ù ,¤!ù ,¤!ù ,¤!ù ,¤!ù ,vE©”£Çƒ=j\¸°† D@¡ÀÊ4[¶l£39d0ܱ€Õ¿“(ƒèÁ°ƒSÿöÉÜ÷OW‚ u4€¹ÏŸ?š½ °CÀŽ—1}½™sgÒŸÿ‚²ŒQô(O¥Q™.ÔyªT¢U‘öôªU ×§@…‚5*k¯²ÎŽM;5l×¥8–øFK_,a~€°X´ Wl‘¨1nDÉ0 !ù ,¤!ù ,v>ÿHP`Œ‚ä¥0áA¶5,øp 8êȈðá‚9–Ø0ð†Â2JÄPY„gPtüø±!–)KÜX`@€Q’% 2hDÐål™SfÃ<,‘éÍÜýÛºu…e¬¼±ãF¬éþí[ëÞ†‡+ÅbhРÀêÔúó÷d–A¯[ÍäÈ»Ïß¾¾Ä XÙ£A¯yÆ™ƒ¶1_¿€ËÀa¹Ü„ÜN™ÓûØ­dÊ ~]sà`Ú¯rz?ÿ ˜´.t'€SÍòë;Ür÷Lš¹÷öÝ-št/l¥–¹Àرñƒ°…}A ÞÜÓCæ 燙¢·Ž\1FŒ nÊ% -þYQ`1ȰUTaPA .ˆh¦„Ò 1Ph’@!ù ,}>ÿXb ÁƒcˆqB‡]' œ(CŒ¸MÜ8Æß4ȱä %9¾™R` âh)°¢(Í”€ˆq‘È=ˆüØ!¡Œ @È(ƒÄ€§žFØq°„Õ%dÈ¡¤Ù²¯ËœišjpéÅ%vDÐó¯­Ûh~´ÚÐ* rüíÛ»ï_³r+èpƒÄ‚0rpóÏŸã¾{,CAÉ/"tè åøñ?g€ ,G„F:V4¡ÓÔY¯ß’D(`-X€aÔD#åß>Ï å* mY0åÜ€kS¦±çÈ lûõ€Â3tÓ°ýí:¸hGTpaPD5ÛÎa SáF‚6ç 8Ø<ôp0n°Bwì†óÏ©×ÑEºôrC ÐçÚ_¹TB ,U =`†–qDA¥µÃRKaPèÁweMb 7°ÃLà !ù ,„Eÿ £Ç :`AÊ? ,ƒ¢Š$n4Àq@‚– q0†Œ="”j¶lKe=Jd˜ãÄ 8~ øö¯§O(nð°ãÅ=€°öoŸSû”€ˆ!à„‚2:(P¢Ó}þÂF!TÀ/-” k6 À×°P•” *@"à¦-;׃ZS¸cË2@¬œƒÑ†Mû+V.]I˜±£fíÜ/¿`“ ­ÃaÙNè8â•qܹÜ8rMš°iu0–*TIÐG‚)ëámã¹Äè°Yâc„¥¦ qÃ& ¤Gø>MW@Œ¹%d”(¡¤Œ–0ßµ”•¨]ûu0TÀ^¢Èòscàˆqƒ~õ€!ù ,¤!ù ,ˆEÿ(ƒ$/*à(ðŽ @éQAÃ0JÈ("ÅŽÀƒÂ€Há¢%J ¸!ƒÆÌ4jÖ 0ÉÙ²fË–1ƒRâC7J¨€C†4qÄø1àÙ¿«XE0:P‰™;vô€qâÆÇ?0û·¯í>z"ì˜ …08`PàDÉ’hÆÖŸáz*p¨‡B‡R§‚;a+ô„Zûöp\ ËÉI0MÝ)lѰB—#A´fÇ {¾+lœÀgÎHc@¸Âi€NKìÎþGбl`¹f¦ àû‡‚fÍô˜+@9â»¶ ¬èñã‡iĨsûñ`Rµ×œÉNþY¶i¤•*`mY€PéüpBàÌ£GÝFxéE¥LÒ€·èpB¡wó)§ƒ 2Ä14  ø%C P•àl4ÉðÃx1ÔˆCQ:dà =ôÀ!rp-'@ˆmƒF%C (Z„åG-âFXjäRT€_– À’G!™¥KCÞ°ãŽc !ù ,¤!ù ,“DÿH°`‚ê(Q"Â%%`¦CÇ=p$XâF‰ @tØ@€0±Q€ 'bÖ¡‚ðfËr6ÓA£€qĈ™ã¥Ž õþ)Uên@–@ ÆØ³„Œ=(Ðó·¯ë¿t~D1P†Œ pX-ƒÆzÿöqý§®À‚ŠÊÑâêÕoÿù›[÷` „Τ9¸ƒ- påî£kw£¹Iv¬ wðäÂ!ø †Ù«1G&\9!³Oc4æ,˜µa$ºÁ°#†ÇÔã²¾›pƒ Ù›{¦|;(ÛçÀ;/ÈRÀZ†•Ûp-j†VÂhJ‰–½?Ç@Cö¸£Wœ1c¡‡!ù ,žDÿH° ÀêQvℌ8€ü˜øHBœ(‘€@à £à :vÔØ±£‚›fË–5SÖ,L…’o脱Dƒ ~ýJTW‚c”€Á!L¯# týÛGuß¿S v |cG%Ñ”DêÏŸUV ´ŒqÃA)gºˆ$èEÖì?V tl…ˆAO3uP HÝWölZ1*õZ\`º„íâÕ+ð¡Œ&‘ƒ26²a­‰— 1À · ¾›wo‰#¬š±#¦gðj´ Ëqd3bÍJ©–ܺr‰Ý $`À¶äá-ïøÑCIƒág‹ (iù8Çe´„Ñ‚%̹{WZ‚† ï+ Oè+D¶lq !ù ,¤!ù ,¦EÿˆQC2v\x#ÆVôèqC¡1J”ÀQ" %zðP À€“"Ä@CŠ7hÐ8A3£¬4[ÆsY3Enl,Æ 4O”!@GMÿ¢J]6@Ç%nô ñM¦?zD˜ôoŸÙ}ÿŽ èA„„Œ à dƒ @õÇm±=tÀÀ H«fa8,ÕÕL˜²|ý¡MVà‡ ~ÁcümGƒaØ~9“£ç_d´Ç+á ·:Ìé šÓ{ûþ£l¹Fƒ`Õ(ù¦èi߸AQdZwê$8øE­nŠ*p(âæ’wW‡Vê3·JÒMŠ0ìÙ0s¥JŸN X€. zNEøqË =Ã,ŠPí£o8ðV5À$0ÀäÞ_=ÑC];,µƒP8ìÐCe`x¼]´ÔŠ $P ôFZÐXÆ! Ô"‹9.$@`@!­ÄÔŽ.úøbC á0!ù ,²EÿÐQ¢(@JœØq„ÈŽ@~œ(Ä28ˆ(¢Á€@ (àŒ(kÈøAU³e0›“QbâI”'*Ä82 Ý¿Ÿ?ýõè0q7€È¢¤À·û¢ú«·£fŒ‘z$èíÆÇ§ûü‰­÷ÄÄ`V„’¶îY³ `ÅNíQs¢¦zˆ¥¦ËAܱ?<Ü‘`‚DÊa0àïܺÝàPf\N¡Ê%+X µgJh9wDAÇõèN,ÇÊŒؤýŠÀM3àÎ7ÄÀA! ±f´m?X ‚Œ%pTH°à´íœ'^,AóõçaǪXº÷PÊh 3Þ É‰Ý‘w €¡öçz§cwŒ‹)!ù ,¸=ÿ(pÁƒöÀ PF‡¨ Å@ @ŒÈM‡€k ëQQ€FˆÖ†âFAÀ9†m`í—Ào”Óá`¦À”|1P‰ÏJaëÑ2¡‚ƒ0Jà A‡Ž;J@RãH r.ˆ1ðD‰2j¼(Ñ¡@nDX°á„C5Jä8£D– n¶ÌY¨ Þ¡÷ 78hùG¹²µ?éãÖ=8XÙGšô¿i8 P℆p€²ÏŸí}ÿ¨ È|ʆ2ÄšõÂ0Ú¶?ܺ{ TrÕ±SÔŽý0~<÷îƒ dœhÁJ5nÅo[†WN°ÄŽ Ñ¬ÝbÆ-Lmñºy 0'àˆçÚàνqä©Ô LóÌ)椣Å{ÕÅwÐ2¾1 1šœ²àãT@ {% І¡ƒýÀÂ^;€VBx xc}Á(Z„¡a(AÔ‹0ãY`dpðÐ>–pC K.†P@!ù ,»?ÿHPÀ…gs\…CÁ‡… ÈA ‚b@Ü(°Á‰6è°¨ƒÇ‚    £Ž„NBìbÎÍ1n,”9°œ@„zàŒ±s£ŠŽé ƒC3E€üØÑ#‡ Ž'hÜèÀ (0 @‡iÄ ñ£ÇŽ<[Öl™Ý#^>ŒQCÆ @ @íŸáÃm*Ü ˜Cï e”%ÓR¢@´û2g.CA¯@‡ÜØ ¥W»S\Þ篵?ζèƆØP[Æìú5…ű] dÖ p¥"¨æí6Á*|‹Q·Sv³nþ{ã·%: Œ§°|{kç #p\¶• P¾7çÅÕé¸ñàØ¸c;¬f± t„@“°ÒC %ìЋ3;<ÃÜyÝ=%ÈÀà  w ƒ:ì°ƒ†Ôé@D}ÜáGF¢˜!„…aàxC É @Œf(@`P$<ä#A@jøã 9å”Ñ@!ù ,¤!ù ,¤!ù ,¤!ù ,Å?ÿÀ ‡€>*\(`Ç#B\ 1¢m*V,qCã ÊôL !£Ä"?zôøá`aŒ7p(Á¢D‰ (P €g SÜ8‘òG $ˆ1[Æ´Ù-:P ¬Q"Gƒ rœ8±ïŸW¯ë8Xadž[Íxm¸ƒž¿}pÿ™`0†@:@L’–BŽõþù{+·ÀX tà( è›_À‚ Ï­+°ŽJ£@2ðà®æ '´ŒcB¨qjˆ¨7X2]v8б#‚f ;Rx–,:á‰B•SÐòg¹¯c có8i·Œó>Ì«Y 8(ÈYŒÃnÐÉGØ@£„ Èø^x¬T7JÄ€±#‡éà)Ã.Q2†|ùV„¡…€e@QCü%X`PƒÀ†`IÆpƒ…1àCl!ù ,¤!ù ,ÊEÿ¨#Ç 0p`6Í” ?œ(°Ä‰ Jô(pë€ô 8±Ä 1b舠§Ù²e.›iÙQ‚¤4jÀ¸ñã@±@ƒ–J°ÃfŠ%`”ø‘`Ø¿}P÷ý Õ`GŒ‰pÐ!£„ŒMŸúó'•jÑ«#ìHA£DŒ¥œî[¶Á ŠX°ðê¬\ºS« @+`‹]ßþˆ+–là»…Vè±·í×°s›<0¶(áþÕlצ€5Üúm\÷,E[3Î\òÀXpí‹y¬¿À®êèÁÖ­hÖmv]^bi-a ‡ùaZàÛÄÍ)`¨°½BõŠÌßâˆqƒ¼ Š!ù ,¤!ù ,ÓEÿl L%nüèጠ;JÜÑ`س9rœˆÌ‘ÜÅ 7bà ±á׳eÊ–5ûµA†@:TœLùc½@ÒSÐC ŒGªdàîß¾§ÿÚ1ØC@ HOíÁ@Þ?`ÿ¹KQ@Œ«YcP„çÔß>±S«¢•â ®^Á¾uÇ ¨¬2HèXˆ£Û}náRµ*CÆ…^æ¶é71_¿€;()SæƒÃ–ãb={£C=TÞÛW `¤7v¬mËzq‰³0´–ØÑõkØË®Ñ•1qíªo+—áÁJ˜0Zž[ñ ÑækÀ*TȾ]¢ëä¯oÈH)~¤À€!ù ,¤!ù ,ÛEÿQ¢Ù48düè Ä :J$q$š97p` À€.Ü€!ðEŒJvÈÀ±AK³e/aê‰pC Ž“ )üXÀêŸÏŸÃô£‘aÍ4aˆPêß¾§ûþýJðC  £§Ð=KÀôŸ¿¯Qƒ%Ø!°DŒ˜5ãÚtØÁ ñ¢ÄŽÎÖvuë/ìØ²2d0È{`ïÛ¸såDø·YÃ}áþð£ŽÌœXpÊéa¹bȈqãB(tÌä„òY,ÙÐal(åL‘&ÖaAÇ8{F„:m=¹Dì=€8hûy®³Ðexø&Œëe*Klܸ‡ 0„§P"ôv‚è˸A:ó!ù ,¤!ù ,¤!ù ,¤!ù ,ÛEÿ(°Œ GÔàÐãÇ{œ(@F ::pÑcA€€¤8P 7dÔ€±#­fËb2#vBÉ0rÄÀ!ãÆëþ º„€#è0X"F‰ÐýÛGÕ½,ÐC†Áš= HÝçÏß?z ÂP!`™€?¾Â(ñ#êÔ²gÓ  !Ð@®NiÈv,^z%Ò¨áW@¸4RРk—¬Y´% LУ„ Á„ÅÞ½œxà Í’81×i]×õVÄAà2MRz.<úlé’†¢°Ã3eØy)Þx0ÀA¦»E[ö=Ñ«Ž;^xõúz´UÙ:%Ýn¼”2Z¤·‚”äQã^r €¡úî Âoº3Æ ÿí !ù ,¤!ù ,èDõHp ÞÐ!„ 1zü¸ãÇŽ‚8Nœ€Q¢Ä B(0 Bƒ74ž¸±£%ËšÅ\æL„`äPé 9ÿ‚ •à‡À7a¥ä§¿}P÷ý{6àG %dÈÀ]rü‰}:µª€2+ÐC` ´\¹}…+V®Ù1JàX«÷íX²sëbÅ E/ØÃ~¢LØ-_Ätí2v|9òÙ´ƒ[†<5óâ­PÀí%MU2èʆã–V, -Z(7‡Ñ²K% Ê8{—CÇ0TP^CÁ´ÐïzŒqƒúp‚!ù ,¤!ù ,îCß8°ÁƒÞHx°„Ã8æh&§Ä=zxÂ! PD 8`܈ACJ9[Fs™2" ”СRÆJ °ýJ ‡“b”Q"FÔþí›: †…d0eúªT`÷=‰!"Ó]£îëOìU-´.µèumرÊÎE[—­Ûpårí{÷h^³MÓ~½û6îVºjýâÕ{V±Ý¶Vg}lY²aʉ c¾*@éc9Ã`ÑF 'šž+C@… (`¨[@íÓ%|¯>0 !ù ,¤!ù ,ôEÿ<±¬L…1JüèñcáB ðpB8J”(P`€ÇvÐ(CÆ " e”¸Q¬Ù²—ÎXEØ!GŒ 4èAâÈ¿Ÿ@Íè!°DŒ ºšÝ¢pãG=û¢þã6àÉ'4Q3× †Óþ N@T€QBmëê4¬XªV$Ü7^ë}K6†J5°úæG§a÷;Wð¶ 8¾&Û#†Ù›JÙv2\’+7@)Õa·Š©Vþ[=ÌzÝ@Ì—q /nP€ˆ^Ï}ÿ¦ QB‡Ž¦´SW•XBe„2´„‘®¥ ”‹Bo^ ¼ƒ ›Ý,k7ÓÛ´, !ù ,û=ÿ(°Áƒ&,'P—1(„À0 ª dÆM!  Ë1‘`5–HÃà7t+yCÅìþ˜ˆƒDŽ8p”(±c(Pvè€1P '@ A¡@Xt0( % 4hìx0ÉÙ²eÍÐBá c‡Œ%TÄÀñã@³xójj°C0JôÐq¤€²ûïû§( ;Jœ8‘àÀ†‡÷ùÛüo’ƒ¾‘IìøÕ¬T€eˆ7/žäX@'¨]#vÎͰԜ=÷Ò ”:ˆ=#†{uë# n¹£f­³b¸ýuþ,àBïsG`Q€Z³?ã YfM˜´PÇ¢OïûÐC]ʂȬºsk0N”HP Áiõº¹ædE1@wõ5^ %0È` G”¡EbÑÃA2”áƒ`Ða ¤áˆ âà 'Æ0P@!ù ,ú>ÿH° @J\Èp 9J@iHqà²m°(sa`7)²Z'° º6N„d(LÀ09”°a%Ã=(‰i ‡6Û !°Ù7n´˜èåDµ­”‚‚$%<ìøäG@m ˆA£„%b$P m€9”(p¡Œ0JäÅqƒC°fË–)kÖ‹‚  Æ á¼-6àqÃA½˜1Ëðc¡B•;z¨€qBÇŽ:"Ìû·¯õ¿u z,.ˆX€vxÐ1!Aªÿùó·ï»9 "Ô!0T…&-;¦ÈÁê}Ä_'Ø1{¡5æB%ÎPTNز` è n9E Âª(¥®  ®g‡Í½â7iÜ@ 8åè’Þzþ´—A8 2ü°C (@/é( _qüu'Ð-)È @Ñðâ@(ÓÄÍê —àq ô‹/èЋ¿hÁ½,Ó‹l¨]5À‚ 00 @xÀo Üœ‹ ”ƒ@¤@ _õW §í ¥*7B1Е֚V„†X„… -案åIW|bЧX鉨 1ze!ù ,DÿHp`‡‚ –(£Ž…2zü°r¤D ,,ñ¢c 9 B „%j Aƒ‹ bš-“9Ó …cäH¡ãD‹:ôúG´h¯8äÐ#Ž7tô Ò€Õ¿}X÷ýÓ•  V(q†ƒ èºêÏŸV] pb¨„Å^Í~q°º¯íÛ®Í ðkC„fÖz=³Â×ïÖ¸N¥ЂŽÖžuP –­Û­€š»Å¡ƒ›iåªíhünRRx!Àƒr½ByþÛ!„Ëž3GèÔîÇIÖÑÄ$bÊ4¸uœko (ËX¡À ¨÷@m ™i¦%@8<¾zh2à ˆÁ°„ ?Â`цÿ“9 d߀2€PA HÁI1$´ÝƒöÉpC bÔ`@!ù ,)$KÿH° Áƒ PÈp¡Ã†JŒHq¢ÅŠ/jÌÈÑ" 68r ÂAPT ²¥Ë—0cºD°ðŸ> Ð3‘ >6ûÜЇèÍ£B“"]ª´)Ó§N£B*µ*Õ«V³bÝÚgѾÊK¶ìXšƒºÖé³¶ŽL¶pÛÆ+·.Ý»vóâÝ«·/ß¿~ pKx°áÂuǼ8±€?ù„l¶²åËÝDÉ9¥çÎ,‚¾z`i̘O£6«ú4ϯM¯žMÛ¥—Û\¸ÐÍ{·ïÞÀû˜[xðãÆ“×ݹsåÃw_ž»ºõëÕcߎ]`÷ïÓ½wÿa>~|íóµ 8Á>F ïãß_"~}ûøáß—Ÿ¾þÿà~Ö÷ß{&8à€ 6ˆ_ö¡~Rh` $`¨a†"ˆÞ‡•°A8ì@C '¦ˆâŠ*¶Èâ‹.Ò @Œ0ÖHã6æˆãŽ:öÈã>Ú8#‹CÒð‘H¾ @’ 6Y–%È C î=he„Z8!–\^x¡–]†)æ~Z‚9æ™hžƒ F.ÙæŒJ:)gL¤@C”šYašiÒÇ矀*è ^–°B‡® ¢ˆÎéèL0Ȱf•„Vj)–fxiž{n*¦@õM)ª£Êðè©á)à «¶Êê«®Æÿ 묲ÖJë­¦®*®¼Úêk¯Àþ*¬¢Á;ì±+ÀP‚²Ì Ð,ªÐ !´B +¨ª­¨ÛvËí·Þ† n©âFIj¹ãš›+ºì¦[ê¹î¶+o¼ÙÖkè½Ñæ‹€9xï¿êÎ+0ÀË;ÐÀóž{pÁ #<î@¦æ‹ê´!œ‚¤gÜðÆÛ‹.Ä·K*¨ÃÇ­É!¯û­Ä, °o¿wr,sÊ4Ç»pÍÞ4óÎÚ¢|rËW|±{ümxü  ßü—³ÄÉ/}¤£ßñ׳§aÍl ¤ Þ’†8ÁýíhìVÖfç?ó™Á\Ìž—Á©î†|Ûÿzˆ3&¬‚EtX‰8DÝ xBL"進(2-†FÌ¢K§E#ÎPj9ßö‡E)†«ŒZ ÜÆ@hÆ.zÍp¬bǜȻñµ±ƒTÔZñhÅ;ÆqpLôã eÆ<ry8C` ‡È0Ø òŒdsT2Q“!"è¾¦Ñ ‰éB£$7™HIº’žû̶g®qЂ8¤ÜEHËž2€žtå,C™¶21ƒ}œ_¿V>² †"#!)iI`ò#å¥ yù?`ª1š¹T[6¹¸<_¾2¥‹âþ¾ùÃë¥ ™l ]ÞŒ‰8lª2s$_*õW¼xþ-väk%:‰)ÿKÅ¡‚ý›æ"·¨¶†Piû¢@¹ÉÈ×Åï¡ÜÝ3_·@ÔŠã£(+»™I±ý å[Ø º36^T—ʬå9KªG„`‚A@ n°ËhšÑ¥%¤"­Hõ‘³¦òdÞVZLþ¯(;-c€UÙ D%IÅ'ÍãQ¯•TS`)«©4¥,£[»ª {šÀ%6l5x¢©T×H¼’Q­dd½£(çÙÅî“…<KE†§Bu”k=¢I¥˜Í¡Öõ ëû] I´NI­€¥a©úHGÖ®ý4( ]À?®Æ¯Ql`m6Ø© ¯ªÉÜb\»ÊK½ Ò±3­d¿:Y§ÿÓ«‡ÝãáòZÚ"b¤ZÁSC;Ú×NS›¨Ü¦9›¾¡ÎU…EMZek´~ì¹™Õâmk«±EÚ±‚v¬f0k6áþu­ç"® qêK²—£gEÚFêS¤&¦d¨üÆêÚ³t6¦‚,,9èõ‚‹hFÅžmHÀCN Á¨õ¨O¥Q‚SoÒ\ðwúÝðòpœ@¬e Ü7ˆ˜©`à,gº“4HÁzX,ظ'`qKcäX8ˆÁ 6‚Üd0`OL0iª‰$É,vÖ N€IGÙYT¦R‹§å‚LTžÒž^aÇ=VÚ«â%sü^Z½N^ÿ'Ð t€RU9Ç?.ˆb ƒÄÀ?°‚`p別à¦:Á n€ :8ÁÂØCe “˜n‰“råë@JX¾tŽÍÕe.Rp™õiK÷ïÔÑ&fhâ"¤ƒ ØÁ|Xüž#s€2¢6`PD€z¨;BÑÀ‡è@8…o`Á%¢€.¾Ž¸X× Á‘°ÉÅ7è0îrCÛ™18ÁH(àÃ`ÀM‚uOù= ÀÀ‘¡Š‚ tÀÒrK¸“$‡š°àšhG:¬Pü(þA@ð(@0 A´P (”[ÿà+ô ƒÁ @   €,(¡ØÊ€Ž#¼ nP]_“=B j Dú@€B¸a ` VØ7Ž€…$¹PE6€b ÚЮÍem@6Ÿr¤8@x+üîx?ÈÀŒh|ƒ (Ã8¼ð7Œ J†5°qŒD@ß0Ç$"àm¨œ?Ø€&¬±xV< ä 7¶a`@æ8p@EpãØpê,t áЃ¬ð 7,àæ0G4N<iLCß8ÅXÁ nPC €B5Ò¡‹d¾ßø†5´ V˜ƒÜ`Æÿ6 klcš À (ЋaD`ÜyÿÝë”tœbÒh@ °Ñ‹$c r°—šð~P¡à;° §À:P Z è°J ÌpÓ ÇVçàs Ðåð ð Ô@NvP ÃÁ€   éP@ ¿P æ@JðqèÐ `s° 0 ÃÐ@èð P Ñ0º°V`éà ÔX·:ÐÔð °iòw†,s ê 6¨  ÔPÜP}Dà Ö0 ìp ê§ßÀlÞ†ÙÀ 0mz@ Ô` ê hçÐÿP ã°~"¨PeÐÃР̰R7Q8к° ` Â༠ ÖP Ô0  tÇ ßÀ Šv:àÒ°„§—Jp¡p  ×?šPÞ÷ §0"T†Þ††Ò4ÐÃàÕÀ ð àá ãp Û°p ½ðø‡ ° ¥¹h ˰a`Vpè …¥•(ç° rÀÄ0 Ãp ?àÀ{¡ð ^Pÿ@ Áp 0àŠéÈh“p ê  Ð °‹ €zà‹ å0ŒØÐ@€Œ eð èÿ0 °2@wÓø“ƒ€ Ñ nÍ’Ò°ΰ @ ÕP¡ ¬ð~ÇX ”w0 Í ?àØ Ð í€xL™Öà  J€¥Ð0Ûð  ŠUa’ΰÒ€ æ 0 e@P ¿k€ –¬ DÔP °?pÃ@D9½À ˜÷‡  zðÔ Ð Êð~@ÙšBÕ&P*m¬D ÕÐ Ú@ˆÅÀ êð Ò`%€„€ ’ד` Ôà ¤wD Õ°Ð åP D@nP ÛÀ Âÿ@AkBš¥ð=p¬ð Ü€ ¡° ºà~ÖÍðzÍ™·p è`Õ0   ÙG PЬ€k?` šð¿àžÔ9w’ÜÀ„®y¡N‚:ÐI–dmç„mG  0ðJPGpG6d%puFvJ0o0 l`upd0@Gh@GГ±&ò&i>$°ŠVi˜tœ's0ÐJ€*Š=É?€¢' #9 d«÷~Ùnïa†º¦ PpZÀ‚N†Im‡—%Ðv Àµ' ¹&yJ˜Äu†I8à©*4Ïÿt6w¢¨E*ŠÚ=z ð b›6Q„ʨlú©µA ÑÐ Îà ÍP”1•i›©™†­úbš†p³*«´ ±j«¹ ª¾º¢ª ÿ0¬ÄÚ àmjú«Êº¬UcÀ ÿ°Òºÿp úƬؚ­U#ªÐºþàÔª €¬ÚZ®æê(ÎÚ­ßJ­Öjtçú®ðªÏ­ëúâJ®ñš¯úú$óê­àZ­×º¯;°.Á­ôú¯÷Šp»° ›®Ë®˰K°ë¯á:® ;±û®k±ë®²çj°ßú­öбÉ*²* ª;­'K{+³ØºVàq6:û2›³Øš§¿¦nÀ§)«³Bû“;`}fiA;´J;ð·´N˦Wö´Rëš7µVû“Q{µZ+7!ù ,*€fÿH° Áƒôô‡¡Ã†}þ$œH±¢Å‹3füÓPÇiI²¤É“‹¤\©²åÉ—0cÊœI³&Â;<ÄÀㆠ{숡³àΞGÆ ¨ÍŠ7nµ £ƒŒCpØQD v”CÆŽRì + ÂW,žN¤Q#B±6_Ü`U*‚ x è)ôoÐ[a0pÀBŒ˜• eÜÐqCE‡¬” ÐƒB¨dºh |£Çcà8ZVÙ2PßÀQõŽÛc—R„AìëØ¢âØqcàíÀ¹ ÖЀe^: @0¸@ ƒ¯dȨ0 Ú¤´üÿjÇŠAY ,8ÁÊ:+èÀ ©Y»\Ëp0Àá±Òðà ]äæ@  Ð@n£K8ÔÀ¸VA BæZƒ` ÔÿÆ€.å £ˆVÜ¢?袄 ¥CL`€E3¿XÁ ` + ìн,Ó‹@ñÍ)Ä”²Á (QÎ( ÀA)ËœÂQ q ä  ñK2zøÂnº(#G@ô’ +?ðC2ÃÈAA äp‹2š(&Ç)9¶! §(ó ¼ ÀV€@ PC 5Ã$`…:ŠP :7hä1ØXáðÿÓWpÃJ=`J3·Dó P¤ÃÍ1ê°A r sD 8PPL:ŘóKxáà=¤J“¤ƒD ÖXÃŒ9rp6êÓL) Dã©3XD „.é ÓÀ8óM2é°2€.òüÒÌ7@4ð 7Ã<J=4 7 ”PœüN·pÃÁÏ,€4É$àA¿ ³Î)tÀ6¡Ü›Ø”Wƒ„ò‹3ê¡„¶ü‚ ”aÎ'º'“˜“Ó ­°ËD€3ÏÐ :uP ‡pðM1,T D3 h±N ÃMº|Óæ(2À3Öÿ°t2PÐK10-€”²N)Á°§p“C9“0 ‰9ÇðRŽ.ÜöM_8Ð@6§Ü1ßüB :XN ”òÍ A›£Dgr´î6Ü@ÁÁÄ€9 É79psJÄ´CM5æ8ƒÁÔüÒy[š`cN4@€ÐCÓ ãz Eš .ØdÉM( „!9ØÈxzîd@ͬC 5ì°â€ØX†5<fD(Ç-"À lLb>¡À6X€¶L ŠH\ «mƒ(:vð7+¤c8P€C ÀËÀÆÐ pèàDÈ &0^ÜK8hÀÿt ]°-m¿ -ôì @_€À MT P@5¢Q”@ ej\“]$`Ò°"°Œzƒ§˜’2æq!MèbÎ(ŲP n# h5Ba yXA ì@X:nñ€œàÒÐ(° nü‚ÄžRpð€aÔ#:6¤ñ‹gœ¢ç †Jðƒf,ƒ樜"XajœÂ ˆÆ7†QÄüŠD@G) g, h5ì–! Á@B 8 ˆ^€ eh†ïnð¥f°âz¨€.ž¡Œf (AJ)‡!ÍÐD/”ðƒ^”›ˆ ³ÿ eü $`E3ˆ¡ˆü„›ZXF(° (a@‚6À ET 87Ó2&¡˜Pt¬ÍhçnV  éáÈA/£‡bxów2À+~Af  . € q bÔçu@ ¤§_“Jž‹‚  j @`•¨ZJŸ?MÀ@®“€$?ÒRÑSl¸@†¦zù$@j*€²F@5€À N € €Hu@3eðóŒF+ÈáÌ2˜ü ¨ÁÁpÕü ?@NL#˜¦õl`ô)”HvÍŒ­€7œ‘` (¶[ èЂA ‚ë(`kC‡g|‘4€çèA ˆ‹€àÂVpŠp{ò sX#;–.—l”\  ÚªéNj`Zð¥C šˆh»Mü “1“ǬDÉHZÍ`(¼ÊAÿƒ@bƒž¬Ã~!³žó s(CVè  BP 8=©z°8ca%°+Ê ‡r4ã‡{Ösð wl£¿‰â@ÜQº<€¾ì@10P"°Ã^C{Í! ¢±0ÓcÖç”ÀkÐvv4%€…ÇjyËé<Â"T\“y'%ð@Ø:en¶YA ÒÙXš1l>)³3½YFC÷(ŽÕAH \ã`öÖã^2´I”䃸x*8Z Š"%Ç[À­fÅ1~&⤥8F0¨PÓ‚”`¥hŒ(ï x8Å6šmü`ǹA&±ñj”à ÿŠný i¸èЧq Žp‚a¡ ñ@Ê„ƒ5¢ƒ žÄÝ`ÌH€¯c.`tc`T‚‚AR¢ãÓ‡¥Á$jx‰˜—éÏS©ñ ¨@<즛Q%g44p:®ñƒßÃXr6Jp‚âÄ âŽÁ0Œ¡u€¸Ȳ¸7À½f<àëw¯ ƒa $€ê–ÅIV|ãP*ä€Nl`{4yÉߘÏ8†3ܰí2Èãß›Ä<Þ5 ÛÂàš¶á iàÜë­?¯zqŒe,£\%xh@(b£œ½÷S0â#èâÄTÿÅ“?}©ˆ ÀžTý ÀNˆü4ÈAÀq.ùe¢kÌrv'æ&[¶1 :0›õ§oú÷ +`UÿÁá% $ H'°$ 1®! (v%€$ÀÍÕñåQ Á†á‚%Xh¹‘ƒ‘"Ð7 n9„¬¦7ð%à‚BÈw~Bìf‚'IˆPÀk—µc6Xƒ4X‚É¡ƒ3x8È;¸ƒa؃aˆ%bg±#— àð ½phX¨˜^(…¦æð ÜÀΠ<0hYè<¸T[ÿHƒC‰’ȈˆX‰h?ÈA(‰¨^¬ ¬À‚²‰ØšPzp2nøpV@)æ`D:öˆJˆƒŽ‰µ˜‹œ¸‹¹x‹¼‰Ž˜8œh]ß³ÚòRW‡¨T'€·r8U ¶³c¿hƒd¨‹Ü˜ÞØÝ(™(1Ü(v@°"èðO·(v ÓÑX(…±A Ðr °à(†=¸þ¸‹”øÜ(ލ†ÜØðfš@-¨OH^ÜçEß%v7°J€ ã‹ɉ!ß’ ™ˆ‡„Üè†Z@§pk8MØøa6Ït0 ‚x7ÿf"9#)’@ Žñ€ÃØ’ÈMVà_DàÕÓÀ}±v b  ëÐ ®ñÑÐ5PÀ Å–ø‹”dù“º(Ž&¹‹ƒ× í  Ö]aÐ}AÃÓ_ËðDqêð PwVPq"û8–fY–†™ˆDiÅX0@Dð?@bVI¸O—Á ub@Ú'°Æå`˜…á–?Ù‘ÚØˆãHŠ[ø‘SâÆkø‘ÐL8u%¸•(BØ€o'n¾ùšc9œÂ9‰9f(ƒ‰IŒøv§å…oxÁ†£1[fØ…\ø…ÌÙÿá…2HÍÙšµÈ…-VVYÖnÑ6x  ¨!w±#ᜠüJp Ë0 J°Y=à·Ð àåž' 0Š VfŸáœi™…8q„ à@ <;A;Xj'rÆú é@Ô¡ŸE©„Qw  Ço!è ÑP báw@TZ p# ΀!*jª‰éiÐPL4ŠÑ…“½R àp¨ÑÂsaPº° n7¤Á¢Š¦@ Îðõ£¨Õ@¡° 21­ÕPú ±8íÉ¥ Q¤äˆœ¹Á1Ö€_¥"Ñ" Í -IÆfª ´¼ÿ ¥xÚ¥Ïi”Âé0 ÔÐfŠ 'R Ó ƒ¸ czÓu0 —y*zêš9D·@ÒÐ Ï aóP:;pu æpqÀ—?Êp=èÐ תá¥ú)œÍ¢ÃP­Ç š¢+…§Ñ«ep 5Ð z È ÃPêoúªGUPgѱb%v¨‘ ™ÁsEeìÚ®‘ꢦåÚ5G€ð[ÎZê\Èj)]Å1©Am[ùÙ’Éa]1Ploª•&D°eA#G`;žä¸Tow0 ÜÿÀ Ò’OíE›±@ é`Ù1°/«dÍ¢§@aíp'Î…“º€Ø£ÊÕ³tBtõ²¡±‘¯Ð‘¢ sJÁe@ ½° H–\ª+/g´G ž/ʽ@Ahp€±Ñ  ¡0Æ¡ÁÑV€ß¡£Z«oǵAµ€¢Q¡¥P p à° gú¸‚+…«ªa`¡ H™7àǰÕ€îð vPÑ,J`zt››ûép P GP@ ’@qP Õ‡r n? §ÐH “°¬@)µ‹›Ö ì€ ßP¡‹s/ ðT¡ÿ@ ùÑjéÀ—¦v5õÅ \;½q"Q‘\ÝդŅ ) Vè¶ì‹n@m¯+³î9±!FcmǾÛe·ÛµIK§›·‘°LÐ!`ÁÀMŠ© l0¯ã7ÁF}½Ð º[´áy>Âð % §R†öÁ ÜYg ŸBG0›DeÀç!ÀÓ,eP Ë€3“s1Œ¬„ ês¬GÑp£:–\ÇTp ̰bvÄÀ¶¢æ£\$Ô Ï¥ ¥]â¶°9BÊÅ©!p ˰ŠÿËMJ` :  Û%ñ   {çÆ q„Ò@ €vÿbXR Âô êp Ê]b…%t p€„\œ” —ºBš€€¥ÅØÀÇ )50 B´²ú;½ £ ô0 ŧ B»Š+W´$¬¬k¶Í0 bR˵SrÐ ¿ ÁP¾ç}BÒAˆ¥À[· ?%ºÐ Á0 š¨› Yòêv%í×cÐcÄ0÷TPU›üƶEÙi·¤õ³©%—Åzûì%0$Bfb* ¼Ï4‚Jp, Y ð¤,]ðV $ñ|Ѐ¡ð ý5 F]kˆ¢<ÜÒP´ÿ¦¡}ÄÛ¡¡ ¡ÀzЬ(·R;ÅÁJz`GpðK—Î`5é°)âaeÛ ÜÐ'~[à„àð m|Ð5CtšÊD‘ åàEÒÆW hǪ Üh ¨á$GQº§` À à^„; Óî…|$%rK Ð@ ê` 謻×Àvv «GÒDRê  Z ËÂVà@Ôrn Àb°T?P (C¶Á0 Šv fzØ   êà–ß`E У9·$°  ÓàÐIíCÈÌ^ß  90Éb-$2Š‘e)€„!'…ý:àÿ‘!¾ÊyErÃ;¡fœœC¡)âÃ*KÒëÏÇõ°ò=dƒ\Î̾°!™…,Æ b2à™Qq|Ð70hÁ Ë`Ùu˵  Ä A)@:ð-üqð]º¥@ Á@ æðv÷³ ì`!Êc¾O&ÄHp¯‡]6'€sÊ8uÌå+8z'˜Ð zߨ’âê+­r[Æã0Å ‰vƒç©“pBRÞ |0p×p  ! Ö@mÊÇR0 ?@ ^ åÃ\|Ó0 @Qèl†%Ê€½R,;¶å—±Ûëp Îÿ°Á@ç18Í à¿C? ¾šà Í` ì@ £ Z6Š äüÓ [ÌŃ‡ËŸú”aSôÀ«ÀÀjÐŽñ@ Jg.pa9@ã›ìarÀ ½ Ía )·ô;‚'Z  ¨§`Ík®åJ°ÓëKÈͲì ÏNU'±lw£æ&-¶ÁMY™•°õýºë½ë½I¥ñЄlÙàœ¯6 a. tàûlÙG@z ÈáaD`ïr»+ràá$-rÃà èp ~…Äæ`>«­Véð Ö}Ä8Pr  7  íðÓOk0ðCµøºÑßÿ@Þ×îÆÙâ ] Ô¥i]­FkprŒ~Ä3$ á0‚õº ¬ àзQ&Ä  ÓàÓ‡–ß…+x  éàÜ:FÇ Öð·0õ"ÊÞ)ÐÁdŠuéŒ@²[À¡åk^©‘­ºÑ0&kÞXó\$Åç$ ͪ\š@)ƒÆ —@qGP )&nD` Œa`κÐ?ÓsзŒÖði— Z -˜Ö¡ ýû±x7aP 7;‡ð¯à@]ë À­øšàª»¿° ‚î®ÍazÀűH&Àke»EÀð ïž5Ñȵ ¥›!'Xÿ>Á– °ð Ð!G °h§d ’©Ó?hÄP«^`Â%ð ô^¿ ªZrq§ÐC! 10(`G9íÌápãàAš•ãuLN '~RäH’%MžDy0Ž @¨+åâA‰5DsfmG 20h)§ÅŽSEšT)Iƒ%z`£ 1z4øå¬T¹'îp éÜ´oÛ¬`è¸TíZ¶%c܈‚1@ÜÁÁJ5 š¸9àCÆ&ÑÓE‚Ú³;Ú>†¼6F Ô¢9ð¡ÄŽÊÒé’¶NW‰8€´ŽHSã:D†% Îÿ¤-hàA@ § ”à ©Y³jë„PXª PÒM@<ÂLÙÕ­_íEÚ´jŠ8`(CïTƒ§œ2a÷yÄüˆ Ý´tŠ"صžv aN±ºå-@(á‡RŠè†¬˜d¦B ‰8PD—ÓÒ/ÃÇbˆH€ *¡‚’Ì&r »bh -£4¤q)ÁzØá‡™ ÚC„Þ’¡„(Â«1É¥hÀ ÅtIÅ"@nÆ•8xÀ •äÒ¤ Ð£ Jò#ÂPD=vI0 ¬Pd‡»¤“¤"(ånÐQ†RÔBr¾‘ Ò&ZéÿVÐáÆš# ª3Ò6Áónvì£ °(ç„F4j2"ÎapˆaÀ1IWåƒ 4Ð!M"a"@Õ‘f9düÊIÒ!"€`°¡`ËUé„¡ˆá†Lš"âŠa†¡F-ÐòBGlt)‡cMÒ 8!ŠÁ-à S‰il7…ÅœIXé%È]u‡1Çh@(ÈŽ:$êk–i@"h!uˆ`™i@`%iÓƒeô88+Ê™µEŽ åvôðó‡oniŒk¢ eS8ö˜N¸Åœj°ÁF <8Y *Ѓ¢C@ζ¡¹ÿ‡ ¬†›_6·ç 9Ä`pàßÝà`0 h€û†l ˆnè`ì`èÚký8܇¾ñëÑ üƺ•ð»k‡ZõŽG2ÇÇE4Èg\Éx `Àìšj I° H ƒ¼3—í´Pf176@r2%ž©Æšg”8ÔÖ J‘†š©0g=¿ÂJ‰æ–hÒ‚ü4 C^X9åg¿Š iÜQ¤Øâi`¢ÕÖ× ¾awgÜô}{õï!ƒOk]œHS-¸ùFfN¨JÂbtØG~ó{Ì:p‚o £^|ÛÍÂЃGUp¹K´Ð1‰ø!Ðÿx @5ž!“‰Pé ˆ 0fD F'’Á—6è=êÏxF0€ü€g)( é52`EÐÂ’#˜C ÈkˆÎdÇÔ°Æ$0ÀðœÂxB‡5Ò1‰=îùÁnñ y”ƒS´Žë°ŠSÔÑ dúÁ$R E”B$è@Gh0 +€ Er`…&N1‰ëÁ16Xb@ÛÌ‚ g7h@ Ëô€´¹‰l P#«c¤ì pQ‰z°JÄò-¥ìÁâD¹¬†ï"Q0Ê6 _¼Ë,i¹ MÈ'ÀQ6#M„B]ùÈ dP%LB,ÿØñ„¹”„¢Ö@G3J Çz7¤Aw© Ð6¶ñ k4¯cÛTÊ À# È“ÀßAeŽ   ¡At êžøT 6À ¨ãxÞOÔ1gÀ,Š (`Ã=B‚¨Z´¤ƒc€9iý"4e›Wb <@éÐBÚR*θ"V—AR°8h` ؽ„Á 0aHÇ)¦#Å¡¶  ÐDP •ü@bkk‰5”Q/³–àC+p‚®ªå­Šh‡2 €À ²Š&±ŒR,ãeÊ¡ àè¨Æÿ¾äðšº&…3¬à5®I0Ç Üà ä0 kTC˜æ¬Á NÊa¹ã/°UY¤°$Dm£,tàfÙlJ(P+Ü–(e¢íQn Âè@¡ X è 7xn RÀ‚)Õ].“{í >JåWpTÎ!½Ë”±/R8‚u½ñ@è"é]Ê•Dêájrù£…fPCuàH4A iíì¬J Žp jTÃBïIÀRŠgœ¢ê@jOú£Ž[„":€M¢5Œ^ôB^|h†{é€Î¥#&™ú‰9q„²ï—À6Ž‘”ʸ$¢€"@ÿ,.óYažêpF#?"ƒaLã^褑™‚§”ã< æA~`…”¬¨‹`^tƒ_LcnÈ©–K×®`£…øÑ ´&@ƒH£…Ž1 DJPó4cå“óHH g,`LëéEP=+ $ÆLt±+ ‡A00˜ý‘0ÀŠÖà,¸(žL–"Œéˆ†c$,aˆHæÀÆ7Æ¡DYŽZ%Í™„‰CA«èádêB¡‡8ï.zhBÊ ‰I<C¾V €É˜­y>2镃DÀÙ1 À¶Ç`[%GäQ™ÌkÊ2&AŠñ¨µ·}4$ø‰û‘ÿsòÛŸ@J¡ $; ™­'TNª:øA6lk˜ÃøÓëÖ± lDƒwÄ‹Á¸Ñ%ð$ãáÊð7üs:ùÛÔ7. !5x@/¶agg|¾žƒhܪÑ`x¯ò“jl…Ø/?O° lXÒ+®ƒÂ/t vÀ¹V áÌ3tQs¡è7—ta{ÂüzMR@6ŽQ/Ýh+OOpµ\þr…âP€Jdpð$^-ÁF1"Fƒ#)èé¸;¬Ñ)úN“p3B¡‹;Æ\¡ˆ@„Êg¬ƒŸ1ø:» Ô ga€TÆvŠlÿ6² ·B+•hTƒÜA©áEY÷³D6å, `¢C¬/ 6}ŠN¸ÔI@Êy%¤øå7š÷GÏ+¸y®o”3ÖAB¸‡FÎoâ¸yýæóƒ«(’ÙG¸À¤€º‰`›ä¿DÓ§2ȉã£Ïijànˆ†#è¯øgøl † ’ºQë¦ffX‡³È¨èY$M`D)"@‡^PMx¬3új€ °1¦tÐ(hÕñˆ"øV¢”?ø°P(üÑ là†u†2òyAjø†t°†'à€|“³¼ sè…?YëC ÿv ™ Ò8(¸¥£142}*m€Œ3!þH¡ð32!x¡•`j !¬ÛZ€'ñ¥#ø…¡¦0€0XšÁè=@¬#(ƒ€Á:$¼È¢Ù£é€0˜­#nH‡g Ç‚‡a@=`”t "è;”±/уIÆßPˆ2x”Ø2P9Ø!L2h¹ˆÐ‚d,lZ·x€×0 °¤Ak„Iˆ1I I°%Œˆ¡7-YœÈa%‚+wc/ prk¯KÒ‰…دA9X¤ ‰ÍÐV`…P€&øƒ€0H¤‰{¹ã1j0i0@œÓ‚ÿuÀݰ‹SH‡Œ´ŒÃ6×Ñ+x€0h‡Y‘%@ù† (B."T¬RñëªÐ’ ž(щd@S2/²º .£®øÉH!qrêvk·ËQÈ!'rºÇh2éÓ7þȤ¸A.-‰‹L Ÿsm3¸ŒK7h°jð„ÙÊ6½BC£¨8-˜n KMÇT†Ip™ š‘:£Í[@Á)〒›„3"ùë€@«‹^ n€‚É¢€¢ì'Õ€Ø˃Ã&ü)$è¼Ñ8Ðu †m‡³ Îð¦P;p𣣠%=Œ"+ˆèÐ…y(¨†;ãÂØ–Å¢pa2£KøT! ¼ÑŒËB‡ê†jèÐ- ÿEH‡€`¸ʸÈ)…€8ÆSb(ƒu˜Àˆ±ŠaP„ €½Ï €r¨5‘ôµRë…y¸†mO(ƒUløsèÀæáY|ËóÔj°ñ¬+ +=`U%@Ђ‰{+-ЃO³ +¨ÁŠ(Ëóó% ˆ€`õ¶ ¸ž·ŠÀáS<ÐŒk;?S2«wù¨@¨.J„Ê{1G~kë‰ÂH˜®-ñ?h'ù»E(±$„» ¨ë¼I VþJMhi0‡i8þâu¨†jXƒ8£ˆø0y°öÔ2š‚‚°ÿvЌ¹0P—šÔc!+б@Õ®j Ê<uè5ÆÀ,bÀ†_`Êl$å {¹&}j@TTjÒ'%†RPWÑuŒ!2 %T–`("ÀAk¸öÑv¸€ jèP€×±‚ ê ÔdVØÝpK+èŸ t¸`†iÀ €‚®X‰¨sƒÙ¡‹P˜‡fÐ…aƒvˆ ÇP§_XÜdÂuèè I†vpQÈÛ”ê&F“†i`¸€ÚLÑ/ii8¢dÂgˆ‰4º˘a0?l£>Ô)€ÀŸ(‰Îȉ?ˆø™ÿØå\‚;øí¼®!Y?•X%‘|?[¥U2Ǧ;"vé¥é A[™^é”3} ÖÀJ/œs àF‘@¡ÀʳÊŧГƒ¬Á†PPÂüÙ-‡B‰BÛM*„ÙïõµÂÐbP„a`‡08¨ƒ8lhÿ0”ªø‰dP$7DM¸ã·ÑAÜ”%m ³Ð®*¢€)e^Ì0ƒø(…tp;ü(µsð^ùˆÐÍtpTlë pÖJC¨•‡0(jpÔÄ ›¸kp†ŶГ™Fn,5V8 €a°èˆA€ˆj%ôÅ'8l`†8‚T‚ÿbP¢;­A5¢ðßãä€f°†(¥ßCRœ‡màM¨PÅñè èOµvr¬v†Î‘y0‡m0‡`HQ¬ó€#°9(986€Û„Ôá2ð!”¸3+(ƒLFùóf¥ Ð ƒ(Ò9߃h¸‰¡VÖÆ%DGù/…(¥h*“¥·èm ÒÁª€‘ÐÇ ‘·ÃºЄ^8… ‡º€Iø…RèÖUˆIè]€‚ ¸a༼oˆ†o¨†Ý m†1š†k‘%þ€Öì8¬Äºh9€‹åAð@+€ÐŸK&€oP†çQë€hŽt „·9ˆÿR»mHnÕ‰ƒR‡Â•?¿I€gŸ¬•ö¹…y†Pø 4¼‹,¼‰u¸,ãm:bø"p8æXau(( Ãbx©’ˆ’jØÃó»Ë[àØËƒÐ- Ñtȶ„jw)‘`[kÙ—û™R˜gø>í€×q‡R@C¸¢`P¥I¬u†ÎÑk(†fX4[h-»“Pxgx†h æ€‚Ž¢€…€‚dˆ†R(§ A?ap†Ç^Âà^ªÐ¾I~§€ûXÎòˆ]ñ3G#y/ëôð›XŠ"«àV NíØ•(È¡ílýÞdZÂVÑŒÿVî%Á`VÁÕ× ÆÄ:Ÿhn؆RЄj(jhž^ã›hpxˆ•±;Ñ„`ƒ_`1ÀìTb e€‚a+RótˆÜË8×!Ñ5álP8øx¨†a :í62Øã×t÷FéuÀ"u™d•˜ap98¾ªia2Æ À‚œ &ÅQy°‚⎠ŸlØ€2(‡Ãó“!2‡_HÝN1!Ó (a°†ˆñ Àvh°vˆ†"ƒ; ã†eØ€#h@‚fؕױ1¢ Ø[?Ž+¨#b 1ùƒTyІo@™-*yørÈEùENÿJ=ø†ÇuV_s J+I¹#Pˆ KvW»¨<„²Š#ØëéÛï>(áþ:§Á¯Ã/sä›mnù|¯´VSJùÎnŽmxôƒp€ØM€ô>¸)…aÐ…Hªþ¢€PVpȉ(8…iùCñïøâŒSø´²x€d€5i`ê Â#ðÂgh†BŠðY¢¦H%°LŸ¼ †ˆ— ‰É+€ÈôQ¸´Úü Pêeà†cˆÙcÿsPPQ?8ÈiØÙ`êÙyø6å…¡%‘…IÐ…v`…v݈PtÏèÛ b-ð©%ÿ4…ˆ"ÓÛ`ºƒ˜^ñ “¨2èŠø©Ûh€ gdxq;2x_ëÈyx†aX7ð€‡R °»^‡YI乯€ºŽ×;·ÄÌf`†ÉÖßTfØ"T‚ax†PÈ©8¥¡¦`h†›¿€6×·Ý0N‰ ÝNšŒá¤öÞÝá¬]üãÒâ-^êH^vd^»_%±‡Ñi›^a*ÊQGN4‰"BÍ8p¥ À€€R ÚjÝK²jø†#¼€ˆEsº9À¡ñÑÈ é‰Ä78Îf‡£÷f-è…²KúgÉp8"Уÿ¡6§r"P„k¹õñj  …PÙ°ÞDR‚°WíPs=8…0 í%$‚b]Taej †t€ƒ¢ ‰°`k˜†·¾~»€58‡Ö€½Q](F{ …ð•yЃˆeÕ"Ä`ð „ 2lèð!ĈqD€RNW'`à  GVç( VÍŒJPT¤®GSå8”hó&Μop€òí +:bt€òLO…VÒêŽXƒ=œ…¢ à‡¹`ª=spC'ذbîhÐ Þ¶oå4aQ^)=(°*Wn‘ް–àMßÌYƒ‚ÇØÿÄŠÅîøŠ•)RÀñ5F ; —8¸#¥€n@âëâÔª#z Ááugƒ±ÄQ Ð1@Ì6è‘ÆêàÂ6Þ¸¦B?v0”ú£ÇȇSWí ˆÆxP Á /à€võôŠœ:֋Ȇí 1œ*v‹„âµ(;vŒX)½©7àM88p 7ÍpÃMùéÁ2é8Èp háL3Ë´ãLÌ8¢M (!CD°J$Cr £D p„f 0Àß(j$ ùÐih¡Ž£¡×·lÓÌ7Ëœ `A?4ðË67$— á€ÿÓtµÝ…;49.r¤óKˆ•aöbÖÀˆ]Ú©Ÿ Þ€YAm1©‹:@ÌI¶EEr¨cMw:cMÔƒGÁ$é€3Ò4`™Jx €™Êœä(«²BÏ3Ç4#ÇkaÈsJˆLƒÍ2ê(bí “@­s ¬ÞIÑ$Ç(³ 3n€àÅ$¹@³Ì$ضÃ0ÝÞ࿘:²CRT^äA öUŒVP ´X t†nºBÞ°CsTÙÈá@°‹˜ûïGoÜ囼¹¨Pmt1Ž• B AN<"f¯‘YBøÂÈÁÿ7@lPMò"¬ŒŠ`ÃÍ8·¸‹Pmè± a^ppqet}³Í4PÔ|3Ìêb+ìÈQŽ%èPN0'èEá€é°’C6ÌD5â9PAé„â€|e’SG Ÿ2p`’HÓL›lhå-èôàrfÞÂ5Ó¤“$ß%Î 6D °á«Å°Cjj$BÂC£4Ï4m%QÍ1¥dóËÞWrV˜ÃJÒ ðÂJv£sÁÃT• €R(êP+æxd;u»AaÎ2?hñÃÇPHƒeßò„9Â8ÃÏ”r°sÊëÓÔN½pLöÒN6ÿj±ÅAí”ÒÀ"p p”#:ð€ëÖñ ôºXZ5…4ú‰:Ϲ`eŽp Ôi6¢¹ NE„18hÂ9 âõ `)” "DÂÀ8„ôÆ6a“ âƒüâÍ8¢3ˆ1½  :(<þ!E)Ö£ELL×`“uüc^ôÇ<æwÅ;•€x"÷áü#Œ£n( ±‹kü=ÄÇ!• æ˜ÆŽÒxGzxkvúÀ/XÁ’yä›!Itìü ‚Ü­É!@aÈ#íèH=nr@2 @:¦¡\²û*%‰8 ‹SPlàt%$a™ž4=¥ÙèÆê²~9¨£1Æ\³:08”`…iN ”i&‰:Ó t€Û\"6 t*Ü``å‘ÔõæS#˜Öm»s…Þ•ÈÎt‡µ+_μ¹óçУKŸN½ºõëØ³kßν»÷ïàˬO¾¼ùóèÓ«_Ͼ½û÷ðãËŸO¿¾ýûøóëßÏ¿¿ÿÿ(à€hà&¨à‚ 6èàƒF(á„Vhá…f¨á†vèᇠ†(âˆ$–hâ‰(¦¨âŠ,¶èâ‹0Æ(ãŒ4Öhã8æ¨ãŽ<öèã@)äDiä‘H&©ä’L6éä“PF)å”TViå•X^W@–ãÉ€íÙ #”Aš ”&Tiɉ!ù ,¤!ù ,¤!ù ,¤!ù ,}t(£DÁƒ 8h°a … 2,¨0†Ä‹ư8QbB1:2Th#F+J+€£„É‘ )àxé1á‘ –1£Á„Ô ôð‰P`) 7hAÆ ¢?îØ¨4ªÀ§OEV”±ñ¤B¬>!VCa@!ù ,¤!ù ,¤!ù ,¤!ù ,¤!ù ,¤!ù ,zýxC@Œ „¡°áÀ‚&d( Ç-6,ˆ#Á€ ÈPãG„_Ïš©tvŒCÂ$" ÷¯fÍzF”qãW uÿö õ7/+4•nº þüý£—é‡Õ‚`U*=£#(*§dÀÓ}Q§V­¸`Ú1 ΦýztG=枨P WjÑ‘2D[¦àG¾SÁr(cN Ãr÷ýû{ Á3g v@îšøh (?JÀèq˜óב+:Œ¸Qb³PÉó&L*CP´XÁbÅ ”O/A£D*p àR` á'`È­#Ž7`D .@§Ã€!ù ,¤!ù ,¤!ù ,xÿH° Á*Ä!ðÆA2 Ê @P 06XBá@eÂ8±Q¡#l P[9s6$,0Í›7~ü€EÉA€@ ±„ £%npÀ4€Ó7^€x! FÄ*’öØ¡ƒgÍÂ6‹¦ jG„#l8¡@ &ý›K×Ù€'. ¸q¢—– ¡Ž)Ó”@‘¿}ˆ÷ýSV ÇE´Ð91Ö™ºSeþùÛ¬xY¼zPûµ džžQâ™ó?ÏŽO@rB Eº´an}øucŒ‹)¸±ƒ1pæ èáÝù7A%n¤°ñAA2jr˜¿¾[u`‚%v¨0 7EÚaÄ  ·hÑÖéʼÏõ2îqÄð¢Ô°a“€Þf½y¶CA%•Â(@ÁÚ‡ßA1Ôp9üa‰)ÆX%¸W 9è C 7è`ÅŠ,ÑAM’˜Ã |e´Á7vƒ%x€V‚1¤pB^#• 7 Ã=vDT D¤RhQ)@@!ù ,} 1È(  €oÀaP@‰ 14T¢Ð ƒþðPp[Ãqè flH² 4v$5!ù ,¤!ù ,xÿHp Œ *\HðF J\øP‡Ï 6qa õ D'@I¹‰ nˆA@‰=0.”QÇ‘#@v”8XB&? ”ÐÑbÁ=Kxèàag ¤K (0`ê€; ÞØ)Mš1vü ù£™Y³ÏN9È*°@„˜8œ"ÅÑÁA  üÛËwÛ€#àµÄ Pz5›ʾÇÿQû+à¡€tºô€qCB}s·,•}þRïûW2Ak tÀ8A#7L;–Àqj«[¶œí–%`x–Áùµd|«fíZÀ7sm6ä ¼u®jÊ¢£Äž.œà1lÚ-b+ƒµÒÒS/:—9'J„)Óp‰Ò @|Á0œ@ëüÁ Xó ‡•ÑÌ:è #ÇxòµFŸ@“\€¥°B`qÌ0ÄüR†eY9œp‚ 4× @(Áâ|á0ÛŒ8èDÓ ;ô“cGÙC4T&ãSNÑ47@aÅ–PhAD 0P 3ViæAlÀi‚à QùU•q1è PWíÙ§Q!ù , ^‡ÿH° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠTH`¤É“(Sª\ɲ¥Ë—0cʼH äÌ›8sêÜɳ§ÏŸ@Ö´´¨Ñ£H“*]Ê´©Ó§P£JJµªÕ«X³jÝʵ«×¯`ÊK¶¬Ù³hÓª]˶­Û·pãÊK·®Ý»xóêÝË·¯ß¿€ L¸°áÈ+^̸±ãÇ#K–êŽØä˘3·Œ§¹³çÏ C‹}2éÓ¨CŸJͺµë×°cËžM»¶íÛ¸sëÞÍ»·ïßÀƒ N¼¸ñãÈ“+_μ¹óçÐ ÷‰-H@õëÖ³cß®½;÷ïÞÃÿ/¾<ùóæÓ£_¯¾=û÷îãß/¿|ÏAðï4ПAƒH"€€ùˆß °È }ø÷Gü!È Ihá„^¨a†nèa‡ ~(bˆ$Žhb‰(ž¨bŠ,®èb‹0¾(cŒ4Îhc8Þ¨cŽ$HÑtþÁ‡D‹(ø Rˆä’I2éd“P>)e’B‰ü!É BB$„`9%’a–ùå™f¦‰æšj¶Éæ›nÆ çœrÖyätx çžzöÉçŸ~ è ‚J衆&Šè¢Š6Ê裎F 餒VJé¡BN·R}Ô$\Ú)*B¦ ‚:$–Ó-R¤GÆÿêct´æVA]pÁE¼v!€¯Àþ*l°Äkl±È«l²Ì.묯 5+í³ÔNkmµÆÖzpëm·à~+n¸äŽ;îN¼ ÄíB”àïÆ ï¼ñ– @ í ƒ@îÒ뮽ðö+Ð Ëk0½¬pÂÇ€o $œñÄŸ°ðÅ c¬qÆoìqÇ ,rÈ$lrÉ(Ÿ¬rÊ,¯ìrË0¿,sÌ4ϯ ÇAÈ€¾ìP‚ %Ð  C'C KÝ7ÈÀ@LôÕ%¼U-À4ðÑM'õÙf§öÚfÓA0-÷Òt«m7Ûxß­wÞ|ïÿíw߀ÿ-xà„nxሮxâŒ/îxã?.yä”?. %”@„Îð!ÉÎÑ@ „ro =¤ðB =à³:Üp¯?PÝ #Ô1à°Ã=ÐBíÜÐà ÔËqÿû7Äýô½ïð³ñ8€C?à C 2ì þQË|Ò#-Ù ð{ÔÚ‹ßCöø Ðúø:L¿ëüËÐÿÿþ (Àð€ àäX¹2ðŒ '(Á Rð‚D Nƒ <£ €slï’ÁØð®l@vÉ{†"*‚4` (€Ø€0oÿ<°$³€[Ø€©ÌuõH‚8€0¢ÿ(0¨i @ 8;$š±Œh<£ÓÈÆ5º±Œs‹cÝæ(Ç:ÒñŽvÌ#÷¨Ç>òñ~ $ )ÈBò†L$"©ÈF2ò‘ŽÌ#Ñ0'€#€ÚÀ8b€ܰ„€€t!lîr§PÆ1@ ”A½€‚û8`D0@" È’·ITÀ“²Thð‚ˆ7@&2I ]X²·°ŽÐ È:ð @–á Xò·Bˆ' ìÀÌ£AŽá† ì X¥.%@!4@ >¸ÿÏ~ò“ŸÚ (E ½j`Y2Oã¡ÄÝ:à€ÜÛ8v³Q n؆ÒAsÄÇ@Ç1Ê!€$“ƒ*8A”ˆ Ä ±BžQ œ’ Øå3ÀA u$t ãØ\5…±>Š"´¢˜‹j ¤JÕ©ZµªX½ªV³ÊÕ­ZU `=H yf/£†T·È2Ð9€©¬äÀ zEŠÔ~%˜šAJdpƒIÇZ©’.:h3ž1¾d±!ÁÆq $ 8©@P, $HAÊ1‰Zv@´ÙKÞ0*€üˤ‹íåf+ÛÚÿÒö¶¶Í-nw«ÛÞòö·¾ .p‡+Üâ÷¸ÆM.r—«Üæ2÷¹Î.t§+ÝêR÷º²6bšàŠ¥ÃaHoð … @ÕÈýÀaºÄÛ`…ý®œw&e@(ÊѾs¡}1è]RŽ ¸ ˆ@5zäà°†I•PpѤöÀ-²‘K¶T å°iìPæÙë_aM1U uL¡!‚MO0Hƒ¢Ɇ@~†l¬†tXMI’ l çØ´ Eìà?¨_þðå¿dèX ãh”¿6œ@v¨Ý-0ƦNT ܈Mr€ÿÖ¸qH :‹ "XßÈç6ú¹Ï€þ³ MèAºÐˆ>´¢ÍèE;ºÑ~´¤#MéI[ºÒQ$H/’ ÛÀ¥°b(xÁ(!ŸÇø†0^Ù `ÃP°d8à » ¤i3tWð9€©«Ì§NÂdCwQÛÜ*7+t4 \­ÀRP~Rßø…ȹœQÅàŠÿ⊃¢­°Œ‚,Œ_´Â»+ ƒ D )Ð&jÿ1ãÝØnÀ Ò[ë›ÀÂ]ˆ9½  ·ÿÍt¸Wþ“M ¶öÀ r@.y—£¤@®È‚k a$ñÄA Z¸yÀ·<@ÆiÙ5` àb ‚œ %¸á ‘Ö€øoi‰ €,€±/xº¦Zk2¨@D‹D4å¶e¹Þq2n”Û 0ÐALÕ{R„¤ó ù¤] N !þ«Ê™E•ËÎ ²Syoq_Þ}R6ˆÊû¾÷ÒûÄåà §Ž'v¾˜/ A 6Hö“V!a<ˆæBúôž!4½ð‹Bú¿$ªšUHJP×û$PÁTW_ ̯ù_gãÀ¦®òá{.¨W}ÿí ¢€£¾è>A Ð˜v Ñ 63z‚Õ¥àþø‡gîEÿýþ«¥ø!U ±P·Àn¥rïZb4váVa=>Þ³}•稧4 1EPf;V W*7¡•f Ð:¡~¸‚e€Ñ3ró{]6èà{/&—~JÄ#ƒ,øƒq‘W£78¥ ¢´cS'5(‚GÃ?û"¡„Tø.H0Ø4pS·P<þãz2`„0R'F7ÔWU…l(Bè5 ÁRû‚‚¡ð:šå'@Nïr ¸³sm8ˆgq…œD6pxéUm1…ÿ1Q¼V;ÁVõUm >„˜‰hñ†>HFP@N&PÐf/à3n5¤Dpt¦‰°ø†(Y˜ˆ1n"0F" ;2Pr"”KDóÐ"ÀÑ‹Ì(œ¸:°/2Ð{þã;=`=ÅÄz°£tØŒÞx³ˆ%ˆØ‰¶„{@‚ À”wƒÌ¶;ßøŽ\zXÄ–QxQ;–#WQ(¯ áÈ/Z¸ÛÀ ÝXÎ` æ€ySó ñGR9‘Sár·¸7G–é5^“<ŽE‘&‰7)V7àpw(@QÐy‘÷¢ !ÿ…“'¹“Ja‘6y0 ðQÓX—'ogX<"YBÖ N<ù”<‘’1¨{Å3”×pº(u2p c5ä? ‚JDÔ`oPy–§y qCÕ7DSQø. p ÛP0Fõ35ï%‰–~R¹’ ' <ó`WI]¤ù˜=á“öØ85eàðn—(Eþó…P~˜™¢yi‹1@²ã|¢•ESvÑ•°£Y›+!™ó¨|ýH„'e=­C޶9œQšè? @9pcSXQqÉפó.²@ÿ@9þÓ@Ç4S4 ¨ʤAe!{) œ(`“˜Ê¦‚Ê›{6;Ä;ú9ª¬ªioŠO'Z²C:FóupÉ à|'U]©š­ ¡¥Z–Ä LU52ž¿¨À ¿ ‚Q¤•¿j¢šj”jv ñyÚT«îC$¤”ñQ~ÑÚžÁ:™õ#56f??rЭÛ7®:­A›‘=¤Ä{4ø®½fòŠå G`PPþ“LøBM)þú€OT^ ¶]ÿ  ôjWú±÷.Ô+ ΠލD4h7Я{+=W*ø”Äó‡6&R'Š0O8ÿW~ey²™úª^ññ2Ê ö.ðÀkPpŒå€:[›[–Q™Gð 1™…éôšÛ­M{;\(µ$§µ›O8@×f/wè:¼º}—Úµ&ù´ ±?¢g>F#·ÒʳÎ9/ AX ªq«·I·íâKº*0­SL*Ç 2pJ¸gùµÿ¹ àÀR˜‰Dð àPŒ¬gT8¸”ûŽt[â F5pEé »9e¦ðy¥+š–ëKPðT§ìˆ$ô ÚÀy‘&u‡“[»¦«£1•át`*0™&¥ Y çà˜ÙCºÈ ·ÿ+ˆl6ŠÊaFÄ bI% KŠ€ßó½OI· ´Ý®öÕG§ôEðû˜á+É`Õà˜´[“…c jTHÀ4ý»“OûI:6Ÿa:=Ð&7pµ“^ @µÜÀ~ù¿¶†5g‰ª¸’Û|*wuìÀÊkÌ»¼Ò¹‹/ðy.:«'`°G¤ø“- •ÿ›‚¸2šÕw™æ½?Lˆ§ûI·Ç²y+67¨Kl»|köfr¾§²¾7nã÷™U\¸/\¡¦YU L­€¿ï„w_F›Ra|’áÛSSgf8°Ïð Ö€ª#Ô·Y c­9Çßxº=ÿàJëùSCi¥Iä„D÷’ƈL‘·»•®p_\ (øöÒ{=pÈ™œ¼ä¶£e\FŸD%½%2DZ$J\4n¦<Ч áëÇ0 pm­£cõ k¦”H_¶Ë‰<ÆêË£ÁX„ Å<ÔT•$2*ÔPnJÌÌ@ÄoEkYJ$´Œ; _ñ ÓæÍ°ø´2p†€sO ¤âÅÎO¹É·›þ£.ª¸:žˆ‚ÂkÏmH·7 ¥ 1 gÚ¨5†ÄTJ÷Å ‹ALBà žê§2h/¸³[ÑlH·šÐ°Uç¡®S›½P,•n¹)Ò„x»8ÿ×:øë­ùrCç †P€5É2M…§ë@:¼Kû¨ ¯«Ô :ÔÌΚ„Î';Ñð…äÐÔñ*V Õ@°þãIa'½T\4€nP õåÕ}ÅV$šP(×w­³lçàÑàA”üa}5llýƒO[nÀDJ²#žåÁ `k¼¶s´û×Tø¿ëpÌFéVzõAÝa°†Ë0Ð’ÝONÄ ÀÀö¢×Tvf‹E/$àZr<ÚlÄ [ùC: ¤G ßìÙí½wtÛp0^¸ÁXÖ@‡Dó€Wô Wv¼ýÍrÿKNe0EZ¡@¾g‹Ô úগ²÷†ˮCc4õS zõI% 4D³/¸cyåáø¿ u´»±ËPËïpsPMºÐjìMãávº}pJ Œ%y,;a Mòc iäÂÎÒ£8wòRG€ÍÈ=o°ƒå¥G·eà™Õ”Úûë:©ãY-e²4Îf^zÿÉ04À].5<}Ççïû=Ð^çÑÿqºÒpœ'ÁcØeŽèÞÎ]ÞÝ[:ài-éae¸aÍ—€÷4uDzWÎé+÷¿ä° ç@ ˜iåÛD<›”تžbâ DŽY1°ºjÖÔ@kY¹nçníK\Äàu S +KùÆâ `_3n[Op1 fUöû5ÔlúËq»70EÑ^'?À V5tqPjJXòÛ‡ûÇñ´iµ†"ë=åPž¡;­3 ÿVØÎŸûÉ®uŠ/¶Œ Q·ÿýÁõ¸—®¡÷¡£þ;ør?ÐÃ{>Ãõ—x5À !@à@‚ D˜PáB† >„QâDŠ-^ĘQãFŽ=~ QAWKÄ(1¡ .äP£ L &8ð†Í;CþTèP¢EEšTéÒq+* „•'MRÈAà ­K½~VìX²eÍ­* äÁ“)†°MÀ²2í ´"0œ%]ÞˆpJÀ·ježEœXñbÆ?VØô`Z„ý-†\ 4 z’N@„oMŸFZõjÖi×lK™` ÿ¸K°ÙÂ#¯ àÌZøpâÅ×(Ù lÃ2~$ˆë!…¿‘_Çž]ûvÅ®M¢d>²éÊTX£Ãƒ ]éÇ]þ|úõíwT^ùÀXåP)88hƒªQF ™p€€¸/B '¤;ïØ/¡ËRb s"F€ âf šRG*d±E_t,?‚öˆ¶Ùfô²F€ pN ~Øq›^8 F%—d²I‹.„-C„*` ‚ ò0ø‘*ªô‰@Ür²L3ÏD“!JR€vòIKƒ|ò’Á­àL3O=÷lÊ‚bkˆN’s2>E4ÿÑúÖ¨MH`ƒ }´†P@Aå´SOó“ @²â˜4èg¨fÕ…´èàSYg¥õ,F½d虄´€—SJ° ;hÇGGkE6Ye) u Q hà 7Ωv!Î.cðØe¿7\„nõV  '>g8;¬*+Rqç¥wÙfÇ”r&¸*aÐAnPA ´x {(ônq­7b‰¿%W!4èN€aªºˆõ†¤QQ6ÛP^y'f¹å<ï._ƒüª HèM bèm ]ØaäØy‡ ˆPb——fZÏŠª¦0ü2ÿj„r t‘«i¯¿næg Êk (RHA %b`ÁœU©ŸÞÎl»ïvñéƒnÀ =6=s€ê’‹áÊ‘(X òêÆ»qDZ[fƒtèA`ˆ†<«üò•=ôáô^NiƼªÏÿ–a½NØTtÙgo,r2õ3\(õà.«ƒai'¾xÆH?Èl°Ý}$•0à5®h”° ŽcàÀ m(§š¼b7>|ñÑ"é»Û§$¶AÙ$‹à¶XH•ü¿~û“Bž ¾AþAM"AVÕ%ë¥.V»†©î·@zÄváÙW cºæ) E9JbЂÔdÿu a!’?6é€6¢ @D6ªTàJ†Ž! BÖ°!œ®³‰Ë@ô@ ô¨ §pÀ¹¶¸Æ5*"‹3H´Ôž Šw´_BƒTN`A†%´€ídwoJ]†9<6²n¬Ûå0W¨XÎM,¬ÊHt¡9Ò“ÆÓãÌЀl#‘ ç-`úd,ÃÉ0°Jz–œ:ßL¯ˆ!1ªA Vlàƒ²D¦ËBiU9c¼\Hÿ²< ™×ÿ ePDuD‘ ÔÀp:ƒÐωØDgÓ–9¨@B+0,H‰ž‘“½/°Lg>›¦ÍHêC/ÄRgä0#ÃGÜ(ƒ>*±u6ªä¤L8“µöYªt Åè×ÜÛ8ƒ ðŒÆ!Øfº J'í¨‚H-£/µWù0t¾„lã8× #„ä¿)L…:/HFd*aAv4T¦zª¡aŠ òˤ™h KmjV‘¥MX®5èÖA¤iÁ­ÈäŒÔjZ÷ôTP PZa88àuúŠì’Aµö5QÚ@àB¤&„ƒ{³£_k&¶ €y†ÿ(•—pdCWúºANärÝ-Ö³g*êhŠ0Œ ë¾fˆ n@ó³¯í“L£DSgyYSÉÐsLØöVIuŽ˜a Á ¤½ÐÕ@r‹0œ£Cômt-$Û?I–ì::¨–0Å ˆìDŽ ·ÒE¯} ÙžrX¡„S°~(€k$CA@øÁNXl”£Xéðvت x ‰^A\E^´gXêHp€%¼¢bà ¼T–: Ý ˆ à LZÞ —x8¥¹"  «að×9¡ ¢þØ„;÷x5lß ’tÒÇGf÷ÿ× Lªœ£|ÀQ âØ•wHÆòYžÊZ^cŠP#IÃØƒpÙl–Õ£3$¹Ä$[iJbÍw. [KPW­x“RÖë‡p<ÚVmÖ×HEsp¦È'ÎhP"¾ìËЗ>JCÍšS/Ý 8B¨)y.iÚÅtª½I„”=Øœt’ÊJ‹®sc[–Áá «Úײ<Š6Ïth´¼”2Ðvð œDGXô¯¥=”Ðöˆ“Vè!ÕÁR:ò täpŽ®½žvº#òTª*á'¤ƒ9hbL€\ñõ@@WÝÿÆ«ÛçÿœÌcølòaní– 4€%@7À%>dêŠÊº ôA†wÖ‚Xrâ¿`²"T¦Ö}r=A¾rŠä5Õ¥­A4QÄŽƒ¯  dPpΙå?W¢ ÔrDƒ‡éõ ¹$×x'Ð¥ŽO¼Üâ1¿§´ÀŽ$R ô[ºJÆúŸOÝì)* b¥Ž¨#X Þ‘µÀÁìa\ùì ²^iF|r¥у¨(tÿûÄ!yƒW àÒ L`@ö @ÁTt±—ijÅ_LÚ .& DônHŠЋm¼¸ó?‡¤½€Baëá…Fíx!ùÿˆŒ¬ˆöë?ÞØÂPÃ¥€Ù@H¶¯vE83RXáÃ^è áLP´ ÕÖ+Aäx8VøwÖÅaÜöSEò~Ä\v Iå„ãÖcÿøj~ëj%0Èk‘»Ì8‚Èžâ?€k¬ò•‰‰2}1@k@ +ªhø M §ƒˆ×:¹0¦ T·ÆZÙCÛÐÚ¼kxÙ(8Vk°ƒ.¹À¥‹R‡þ9'œ6M"€€PP(Ø™$z3 4;~Ú€Þ¸À•™ ’‰a¹&Ó¹ÿ8½žñ {C³‚ ÌA‡[¨€[ICÀ(‘I8B‹À**Nªñ@LU¬Ðʆoªä#ˆöAµHt‡a ˆ B‡§ÄÐèb«`7©8¬–6 9ªÎèLу¬NÀ ‹!•8/ xLÙ)#­Í})²$(Ùð7‚°¤ eR­zDˆÉ¤ªÈŽ)ˆÆ«ÒÞÊHÓ;·ƒ  ™`Í ±ÿuüRéR¢p€Rx¬q †²+j-¡­d• r½6U«§Š•¹Î„`½ˆ`ö D@õ-V; u¼NÁáRsÔ±Oõ³4¸Jzô‚ˆB÷)éH‘NZÒLŨÅ[ 3ˆuÀ€‘jÁÙ+Uõ+¶j®‰8™ÃR‰tȉÝ軑s€›<>^õ,7ª<‚°Z’ªà†Ý;‚ÛˆjmuÖ´âÄh¸¥påÒ S …”=%]±7'ûÖ ­N‚¸ÉéÛ><KI 9¨WŒW¦b+è(XK˜7Ì/ÄŽ›Äö;¥€]¬ÿ¢Ú”M¡“‘ðK€¥Ø¡rRodœ‰—»ˆEýXµ ­mà†,2Ç€²ÙXù†BMÙŒj¬ †vH¨´ˆhÔ¿¤Ò›}©¢²+€ AYm¬A#ˆ»Ø þ$Z¡2"ð›#èܨ]ÐÖó0°§ ª©*HÒ ˆžÃ“« ¢‘»çáŠ2°¶Ù0#Û|j,"(‡^X:Ì)© Ãö†ÂÀ¨¹¹ÛŠ­N% P¡)›ÎC½Ñ¸^êFL\¼ÝT/ü…x؆øð„ƒ¨žaQà@9‡ ÅÍ](HÚ%à-@€kLˆ]½ ”uÝÿdj¬ 8¼ËáMˆ¼²ž©ÚßÅ#®òªrô’‚qÒ`$ù«0t^tb+pLÉ ]œœi€óR¿aÄíÞU­Î€‹[˜Ád9)»­(Al_Ozª¡´kà Ù8íâ°Ä"Ð.WiÝý½¦¢º_‚H,ÀÞØ ÔÂTF&!ýM1á b@R‚ˆÒÀà×=ÅŸÕHˆ† Œ†$â{óÖþ¤†‰Þ¶$Óz ô¨×¤adZ/¶í$:ùÔR¿ˆ£š€ð â îÜý;tä2xˆšchÊþùi)ŒiÔ?bO ­ÝX•ÿsqAVAiŸH”2.c-âDK9£€Í,)C’9nàyÕ1øª€7€a$¿?òcY²Ã ™àØ€É+ ªðY\dGR2 À€ˆM~OÊÔ ÔÐxæÝäðyª ¼ti63¤¯åä䥠 " v€2H‡R¨¼ŸíGq1€U¾Cg6zD8,Û² òøÔâ;ô@âzµÛ{¡Æ‡eàŒ\Í]d-{6èÿ-**yà‚ ÖöhAÛÕ‰Ö˜hØî,I~4Ñ „­x£S‚àà¡¢B_ã€èGRk”(•é¤ si±/÷1ˆ‘”jzÓkŽ‹l8]‚`T­r坯òŒØ=Ÿr/‘+¿ÑC¶^ ¢š²Ù1tAGƒÆëû ¶öˆP-=8¾Ý9ì¼®NhfÀ†w›dô¥FÝ¿¨r^àǦ_}Ê耛ÙÕhÜŠS‰•m±­N>õüÍk@Gô8wˆèŸÿ’xàמÆÎf(Î †óà!"øéûÀËPÛîGš× âaíë ð€(ô‰ð«€¸‚bâè%ª6øƒ­–÷Û ÏØ‰þy[àŒ)¤ŠðBò.ž¢ŠqŸÂ¤š’ûü.o—3 ¼d#(ë5ô‰l‡rÐrÒôà† ZÂØJÓiokó^®v ç‚8,FDup؈æpã ­¨é Sˆ_qÙ ‚@©¸2Ð…v˜’ ¼§¥É¯³ElK{°h–ª» §ÀÆ&òÇy*À¢¥“K¬Âåè© @­rÚq£È ÿû*Ü=r QWÓYc"£1wNäPOÐ j-ˆÇŠ´'ršóµ¦sz©ÊþiFý©H"0XÊé 8êA¯Û)jˆiÛМL Å’ŽXÖõˆÉ¥tÙÑÃøŸ}r¡”àôš…hh†\og€â=õ:ïÜX_"“^XÚ‰€ŠD (€¸ˆ†öi—úõÙ¹-±bp"¹•@)0SõSX†ap†؇ußƒŠ¼v¼¹—”è8°#`¤ÝpÈ”H øè™lhjHhu÷‡„wwk÷lZ)ŒÿÐÓq†‰”™QŠ سhçe@x…÷Ioød™w¨€I0"((¬šæI ¨¼CíôP9ùvy†/yÇÉÈ ¿¹Å˜¡¦( €Á¬Õ”£;¸"kg¨†x†Oø‘ÿù¯i¸ BBœP Ø» ؈ÂAe`¸ †rP‚HwžßzŸïú» úhfzKóº^(‡Â€2pƒ$l[€p€[à@ö¬Ç{w‡÷½gš¯ß€0@+Ð P {s£¯r±$†#Pz¨†e†08øÊ¯vžÆ|—‘X•Øÿk:Í,­ä€¸€"a †c`(ˆ}…·|’¯}§B?˜ HPœHKY$ÌY€Ñ”R/ØñO¬×ú˜ýè·› ?©1ÁQ½’¦dFì#ˆë£8‚gÿöÜçO2lèð!Ĉ'R¬hñ"ÆŒ7rìèñ#È"G’,iò$Ê”2tõ 4^Üð£ΛJÄ`س'CžBo–bÊÑ£=T2mêô)Ô¨R§R­jõ*VŠNÈHñbg‰%`Œ- CÀÙ´h×’m[‚…ær8‘õ.Þ¼z÷òíë÷ïS–Àèš‚†ÌEˆËlÌø±ãÆ5`ä¨ ã,àÌš7sîìù3hŒžU(£DÃÓ¦¬nÍúµB ¡gÓ®mû6îÜËÖíû7ðà‡g!ù ,! M†ÿH° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç Cn ²¤É“(Sª\ɲ¥Ë—0cR@R¦Í›8sêÜɳ§ÏŸiÖJ´¨Ñ£H“*]Ê´©Ó§P£JJµªÕ«X³jÝʵ«×¯`ÊK¶¬Ù³hÓª]˶­Û·pãÊK·®Ý»xóêÝË·¯ß¿€ L¸°áÈ+^̸±ãÇsÂ;¹²åË"åaÞ̹³çÏ CO'º´éÈ¥N«^ͺµë×°cËžM»¶íÛ¸sëÞÍ»·ïßÀƒ N¼¸ñãÈ“+_μ¹óçУKŸN½ºõëØ³kßν»÷ïàËÿO¾¼ùóèÓ«_Ͼ½û÷ðãËŸO¿¾ýûøóëßÏ¿¿ÿÿ(à€hà&¨à‚ 6èàƒF(á„Vhá…f¨á†vèᇠ†(âˆ$–hâ‰(¦¨âŠ,¶èâ‹0Æ(ãŒ4Öhã8æ¨ãŽ<öèã@)äDiä‘H&©ä’L6éä“PF)å”TViå•Xf©å–\véå—`†)æ˜d–iæ™h¦©æšl¶éæ›pÆ)çœtÖiçxæ©çž|öé矀*è „j衈&ªè¢Œ6êè£F*餔Vj饘fªé¦œvêé§ †*ꨤ–jꩨ¦ªêª¬¶êê«°Æÿ*무Öjë­¸æªë®¼öêë¯À+ì°Äkì±È&«ì²Ì6ëì³ÐF+í´ÔVkíµØf«í¶Üvëí·à†+î¸ä–kî¹è¦«îºì¶ëî»ðÆ+ï¼ôÖkï½øæ«ï¾üöëï¿,ðÀlðÁ'¬ð 7ìðÃG,ñÄWlñÅg¬ñÆwìñÇ ‡,òÈ$—lòÉ(§¬òÊ,·ìòË0Ç,óÌ4×lóÍ8ç¬óÎ<÷ìóÏ@-ôÐDmôÑH'­ôÒL7íôÓPG-õÔTWmõÕXg­õÖ\wíõ×`‡-öØd—möÙh§­öÚl·íöÛpÇ-÷Üt×m÷Ýxç­÷Þ|÷ÿí÷߀.øà„nøáˆ'®øâŒ7îøãG.ùä”Wnùå˜g®ùæœwîùç S+C胰ÃÖÏÄëœrDÕ@ ÔUã…£3Mî%Ä@B ½÷ÃPœ°Ã%4-ƒ %0 1”@ @=7ÄÀtö4ô^ ÑóL3ä?£Ë8h¯45¤Có%àÀÁ>ÿÔ_?;ľ´°p ½“èá}ðæ(€ð–†-`@ð“=þáþ#øÓÐÑ è z1à÷aA .°h=À Ѓt”ÂÈcžHÁfÐh ¨ r Pc;Ða ÅtV~&Äáñ ü@7àN@ƒ Lðˆ€†èB9H€tØ=@AF´á ‡VŒ- $žØÀ ˆa,W,¡“6 C’£~Aˆ x`„jTÑN €d€ <°€àÀŠ5ôGݘ4áp`ˆ*2i ô R(XÁ•¯Á)•ƒïÙàÀvÉho–I£ „)Lì09ŸÔFÇLÜ B !ù ,?} {Ø@Æ@nðCºƒBœ# !ù ,3yÿHPÀ¯‚ö@h.¡C ‰8œˆP E2<`¤ñ‚BŒ#8àøÑƒä8–(A# %:ÈÀAa@8`H90F ˜;v”¬ 'Z³£Íž•¡ÀS Œ0( uØ¿«XY1Ø!p¦Š:tMv¢×¿}h÷ý;Å`¡ (nx8‚NÚ1e'~õçOí©\oÀ¸! oa$(loßµm †£ÄpæÌ-;Ðx_¿€iˆ~)£Ç$9¡Ø•ÒåØod8ø,Q!ÅgÍX{~ü—« X°xá 7b·ZC^xž°ôl{f-³»AsÝÑKO…Dn^¦%€ÞìËœpáÆ‰ $€¡à<_ÿJHØgÐ=$p^ZéõT‚Oz„V@Ñ =”P 0Px l aHB4ðÒˆ4ÜÉýQ$F,€P@!ù ,¤!ù ,)gÿH° ÁƒûPÈp¡Ã†JŒHq¢ÅŠ/jŒˆ! -0RÒH#S’\)@H…ûü‘Is¦M™|nÎÄ3gÍŸ: Jt¨Ñ¢A;$ÔÇåÙë¼,*Ð¥Õ–X¯jå#€ÏU€}TJ¶¬Ù³h•"¨CˆPÕ¬- ’D·®Ý»xóÞ]t7Ñ@­p Lx°áˆ¿šåBE—Ç\K¦ÒÂGåË–3Wö¡¹3gΘ/çÝ¢qäÓ’Q«NÍzµkÖJ_ˆMöÀ%N”(»w JzéÞ«¸ñ㉮ ùqæÃAÁÀ[ ïë¾³cß®½ûîëßÃÿ÷N{Ù'n¼Q†÷0J舠§^½}õèéßÏÿ¾ýýþñ'à}ûàWO( ä0P 0è`ƒ>(a„JXB ’5á†BhÖ 2Ð2hâèO5ÎLãŽ<ñÈ#ãŒò¤#Í4ðÈÈÎ4Îl3Œñ¤<ë<Ó 3×УÉ9Äð“PF)å”TViå•XRiÖ$Èð†ñ…)Ÿ“ £‹0§œÏ3Î=Âr;ñÌÃÌ)à=4ÂH5V( 5ô„ÂÀ %¼ ‚¢Œ.êh£>*i¤”Nji¥˜žu4”À† Ò0ôÌSÏ<^”Ã'?γÎ$ìüÿØŽ©ÖÈQ§<­Êó'/ÿ)éÀ4¤ì°ÂKì±Æ&‹ì²Ê6KƒÌ>+@²[žƒ*œ€‚¶ÜÞ©ð˜óÌ)³²*ã<êè+®oV£ÉBI5a¤™N=š4  4„èo¿ÿ+pÀlpÁ¬°´eÅWÂh'äqÄ9P@ê:·Àq ›né&º„Äê1<“XCO¼¯:¿R(£Á ñÌÓlsÍ8ß<³:çìsÏ=›e€§D³gt 5|Ûj;“l³êöäa¹Ê ¡ê ©¦)€v+ô† :È.ÄMîï;¶Á ÐŽCºÔeÅÿ7¦kä¸qñ èp¾1‰"Óqøæt àp$>›)Áàs”ø @ ÄexO 4p p ÖtÄEJÅuàê€ðb2 @ ½8ÇçàÙÔuð§E=À½ Í€ çà|Ñ?P·€#Ñp Ê…pè0 D×Áà@À@â² Òp €é @zà  þ#ÍÀä dçÔ@ ¿€–‚°´gZð É …†G°À Ì0m§@š0 Å  ¬Ä†z0 \uàÖ 9`}=  Pà§tÀ ËÐ J`1Ë0 Çÿ0 GP`àu€‚b˜{–¬õfžÒqœèxÉ eRV °æ‡kù×’gh0€k €Pº¸Š§Ä 0r™8†F†n‹V1€=ÐŒ9ÀR7¢i=°nvd)—nœ&7ÐŒÍ!7°? ŒÃøJvä·Á/—£7$e…¸PÁ$:ÍÓ 7à"Lå¨f2pYÁ0°1ÃÐG@O¸6 bå'LÃÆhû8[•§ÖP¾Æ0 ’À ê0_÷ à  šG7€JPÀ a€EgÙT€G£‘³  ¡ÿ`¥ µT6& ¿V@z  H° ¨µ5µJ$ V@a°¾e4€4ð£;/@“´Å PB§/¶ 4 wZ€VÀãÕp æÐ_²tÉG@ å@ è Üð Ü À;‡ä ÊФç•SEaP ê  @Žˆò$à`ØÀ ã ¡°p„8k?°ÊÀ 0 î7P¿—§0Zd©ŒŠùQ%pb÷ Ž7‹&D&B‰r%ÀvÑ 'ðJ0 Êp ˆZ`V í0 ‡£JÀåP”ßð~µéQdIÿ€ İ<‘FöUÓq$7;„PP ÏÀ ±Ö]X`P98 ¥p à ÄÀ Ç~ßùQ4 ®P/‘Q£¦¡ “pÀ šË‘X À/Öís¿àVpÛð  Š 0 é€zpV žÀ ä @dQ °¡ê`` Fà° ¡0š޾ÙoÏ` ÑVpr0TÜ 0@;À Øð+5êQ—&f?`H²´Rò?pdFFR>°'7 ÂT‘P1€ Ån B’÷gaZNˆö¤"µ§º“8p4 5ÀDpÿó,’'-pÆÖk˜ø§yÔiC&: Ôä›;ÐDÀëMäXX¦Ž–:[¼Q ÀÇH$k„Xy P0)€˜¸|Qõf¦šªi!YP`<0!YšP Çð/yØ ·ð8°rf‚†Ô¤ qH"͈fŠ oÌP 0fU%…'ð Ó€”Î@СlùfvÔP Ô°Q ‹€°&¨j@6®²0õr1‡Œ8ðX –( èEeð ê` Ï0’!ÅaGP ÄÐ Ñà`ËÐ £Âp Á Æ¥°eÿÑJp ËP H@geS¸ˆvŽ%YeÀ w¬¬PÎp m€Ùä\·gÒP;íð @s†iX eUšÀ¡ùh³1^——P #=xœkÙM¥p êÀ IVÖp psG¦UZ°& Ó/è–Ô°   ÑF’;P©6‹!,DPâÔiÄ|é€Á˜   1(©Ö  ð¨¤ Ф  ú)¢û ì@ 9 0 æpÛ   [bkv%Ð `TÇ07‡ `þ×—F PëP\Å wËG`VÐ`é Pœ°³·ÿ—-P$À"Ø€f»‹Ö áà Ü Ÿ±8?@·P ò0 ¬ðÑ ¥é NËÄ µÁˆ7Î@ ·ÐÓp¼§ Ò  ¿P꛾!YZ  ÄÐ Op!H=@§p ¿p ¥@Šð þISaFºÀ z0`ö˜O9  Á  ¿@ ¬ xà«Á!YÇH3©ð8P‹µºUŽTZ Eˆ2°0`ö& @ZÚ´ Ð ÍÉ'ˆÄuÄQÖx¦ñ©kÊQ5ð©=ð,$ŽèËhŸZ­+UÅ á˜Állm¦Ö„hÿ ‘i—#|…œG0ÙV*u†È`oC`kº(P,`lÉH¥vÁÉc+ÜÁà¾yÍÐcdg’6&·ìAj1Ð)‚&Ÿº©Æªå)ƒVÀ’ç¸H,YV0 P  ì eY6)0 ¼ VÀuò! êð ã:9 ,khXð +‰:PêJP~šŒÊJAR €érÉÖ4ç´ p Ç0 Tw2p£A  Õ—™û“’Ñ5Ïà ÐѰ æéÎÈ8^e€ ë° [5©4 €r€ DP »×‰#· ÜÁÐPæÿ    Õ¥ð m„ÀÅ­®P' ¾W³õ¬ ÒaàÌÒðØð ¹z )ÐO5È»Ÿí (ç`üÄ '¿A]6°ÖP ¼…Se Tæð ØÀë€DR}'ÀSa ŸZÀà ;\bú£? Ðe}Jåz np ì ëÕÈPp ê  ’ ãà Fv Ðð0 ذ¿ƒ(X' “Ð é cÙÚØæ®à°£"†ÔH™»tàÒ  ‡¢5€(2°BqXðe@ ^ÚÊ—† Ö€ËÆÌÆ¨ÿô@Šl™¼AÐ×Ó)rb¾E«Z R೸mJuJ1‰ŒN’ö´¥*°=&a":ödGÙÄQ ÐÈ ÙDȸÝ!µ ’öÕ±J=ÐÐb’¬¨È…e§|ßa±AÖ"$€G[Z†"ðXp\ää(â#î²  2HÏÒ¡Ð ËàowvÇŒ= ZÐN !?äöY"á˜r ÈѠ Ôc&ŽJÎБa p ôð Ð@ ¥ÀU"…!K ÕÀ?k0`ªÆÁØÝÂÚsÈa ÀåÿàX˜©o«—epuØ ”M©h¬Ë  Îð €eÐ ÏRJP ٹй~n©p#Q· TÙȽn –@P ¡0u  XåÀ ¡P4åà³»ºÀÑ_Å Á`aPép  zȨümZ ö³( R½»_åðºÐ jÝ œÈÖ ½ R?`PPÂø·Ò ¸Ø ð> ÒнÍPŒÉ%Ðpãp ´†ž"Y_åX:U®pÔàX%` ·<Ž  åÀ ¨«ºJðĸWW Öð ÁŠPJð #yê©Ú»'Ú UÊÿ(©+ˆ¼DàG@ Ñ ê`“ çgÓ„¨P€ó«½ZÒ°ïÊ` à´æ6ìQÚkîÌ¿0Ñð ã ÄAçÐ ÖÕ  0a¹ Á \p ß° ’@R¿!yÔ ÕÐ œP` ïC š@\‰×R,¦Ç p ÿ5áßV à à ðh' rPÞ:À Ä ]vtÛr ½  “ ÃÁðŸ¸P`ßîð«ÆÄ77Ûe«¶Ú•Ð↷޹´é! Æ‘‚ `«„({ŽrŠ ^¢‰åÔ¯Ï7 ¦=À)R¦€„!t¹û½ÈÙŽÑÿ¿ ãXo€*0€‰M"TßE·Íß{tiìá H!rh%,0"°ø˜@ç_ŠL!@`   Vø!íµµXàíNÐ$™aìžšeÁ¥Hʨ äPÇ öZµä‚F™"8Út܉F6“ ê!a¬¹À)æ¡‹„b§ÐÃ)ˆà|C: Bnz°`œà5À6ÚÑ‹T ÿ܃JaÊ ûz@ẔŽ#t  7ê#¡tÜàÖFœñ +4ÃÐB:°P€h4Ã:c@@PPƒmP<ð‚ 8£ ˆ¢A éð…ÄxÄß ƒp kP‡P  ˜€jJ€ l †äÓ„ SL‡™ h¶F³©£’¦`PEX•·`…^Ð"`…`Ђæ†[Ð…^°‚¸*ƒS +JStœ„Ðp8VÀ=(€SlùÊB$£%ÜPÿÀ9ø…P ´…À=ø (ЏÿIÐ]¤ÛÐEà€‰ÄH](GÀ, ±‡˜ Є2¸¼ >,€ 4еJÇin±!€ƒù¹˜€9³(ý˜.ÍÐt…دƒÜ "‚ˆ€x€Ø©¤{€p[È2 ÈÊ¥r­¯d€ük¤3 XÀ€¥€Ë)Šä:è ˜|Ïj ¡00ö±«X¬Ð@Ò±(öÁ”‡€IX@€0Ðõ¡° {ˆÊjеª, cŠâš1ù¡@°¡8ª°°Û G•P  ÇnbÀœú­«HŠŸ°‰”Ú€P‰¥z› Šº|/ÿà€H©­ŒË «Í›{.\¡ÆsZ4»b±r è:‰ˆ M˜Ì©ˆ˜ŒÛh«fÀ Ú +8‚˜NsAú ‚ðY+‚ È¾ÑÛùΚ4´·:ˆ¢P°ðë’±X °èò)+Ðò¸9j|- à ¥P§Ǩ€fƒPŠ(€iÐ…Œü© °HÊP3£¨¼Ü pŸx шÔ(¨£ºÑõ!‹ÐŒËTŠ %s(k°èT €û1Q<·£RRâ(ICR¥Š€EЃ -=ø <8=P@ P„êPÿ+ ±¸$è9X¤Ú°%P„­€:«5Å2Ð89­Ñr8=è¼x E°é:U›ã%¸?œ½²Š€F(ø ƒ¨xj`€eà RtÃÑ8gмy†oÀ†gØ€K°v4Bh- †u¸Ä0ª¸n¨" †q(‡f€€‡ox†Û€f˜†HA닆sHj†Pul ‚óqUsà…[]Eiø/`A…œ…xŒ‹c€ø p¸…bÐ…xf6(ƒt( (U¥ B0¸RaQƒKdÉ»ö €gi€¨ÇÿPèºaf°ªãM €sH0¤ptX s  eh†Ø€  M ¶€k€SHIV˜@aŽíê Çp†+éHwÅ€#`n6qh-»j”l(…´‘?˜Ä ( †j¨DØ+†à‘ ]ñ–IsÁ à"8'9• e8u†µÓ„Ѓr€‚`Aš)Èšï+›(Wh€8µA(h€é»rs-¨À/„‹‹€™X•à"€‡|I% Ψ-@Vø…‚‚*ÔC·þ9ÅQ€lø»Y€ x€p!ÐQ€8 Ø9 ÿß³ h@ ]((!`A#XœMúº,ž8ï ¿_Ü[H1%t&ŒÕaŸÛ”€^°˜ ¥p˜èWŸ³¨öÒ ø†^9H(ÝŸ¾k [ ÒUB¸…#PØb¨m'ô€°w8ºh7=(Wð‚(ø[¨,rX‡Å²H˜`†o(g –(¢Àa²‰ý¥b…RHfx €hX†À‰€gÀ†5p `Žeˆ¿¥•³[€²´R]ÑXe†SèA“Ãb ± ЄåS„ÿøl,aC øtøð l¸g°mx@SÀø¤i%àŽV%†¦¡ÊXVà¾(¡†Ž³j€†_@:É%%•l؆cø¨jh†À£g؆i8Òhjø²UQpˆ% ½ÜŽ×ÀpŸ ¤IŸÀÚ¸ FšŠJ»÷§¸µÍ8‡I˜Ÿ’ùUœ„ªdcîßÙ ˆ‰ €¥Q¥˜¤•¸5[.Ä9 Ÿg[.g/£Š g½¼¸°¾T Œ8ªÆÈH@B ñh‰Äl¦ô¬£ “¥ÅQшË[¸©ŸÜµz’=«ÿ %@Rˆ¯:ª¢è™ð ÍšŽÇqA«pgêòI)“X‹´HÖʬU1+q–\è M« S/Õ  ‚°0ž1õ_t#i½ØTì(¬–؉¥Š®ƒ#ðB ðs€½¸mË,©¼2\ùèi`€Ø¥sçÔ»Âô,Ä4L@Z*±° Š˜ n¢Ï¡¾Ú½År c)ªêªNºÛVg°’ø‘_hÕÕÑ <ª(±ëF󉿥®¬´¡8ËÇ(ƒI€ 8K%R)ê‚€ŸÞ8kÜ` P½L½,h†Yµ¦€2Xuÿ¥ˆhgØ^P‡Sè‘Èvç a˜†iÀ½ö fx»é^˜j`… ^7º``Ø0p¯ëœR(†` ›S·Yü°PbixæºξksPÀ«ˆ xgÀ%P¡PÒí€bPe-FîFS’^ЄS(9`j@9@V‚^Qø†P`/@‡f8…a€påSh™wЄ`0Þ³i(vˆ†(ƒ_¸V(-H•]N‹Ä€ôàß £Þ‰†·³èìÄxÓƒÿ¾×K‰(…Ó³®ÐpP§Ip†gXaÉS@P‡82m0ñÿj"(,°#g¸˜-/ˆ,à`•¬ÑÄeÃâŽjXÐrÀŒÖȧÑa[q÷artûV(]=Ò°Ö…oðAè…+V"Ð…r€`…qðj( á2`›hì`a;Epˆqs  ãA‚Ú" ¨kIV‡^Ðò_ø‰‹ Ÿƒ–`ðEgÀ(f ‚–ùP.¯ôèl€µ#†`…t8‚ Ðm7€ðîrj(UT7²¶hßo€‚ºÜÎ4 >—X´ÈRÀ ØI`†eÈÕcˆ8PX¤ÜWcZ€jÿfg1 ù†epx  j8†¸7Ђ?\†v8†‘†qxoämH›8lHõ´Y€c¸b`‡©«t4„‡<* Õ‚gúyÀ†L(˜‡_Hñz€Ðtˆ(~o‡f(€x€[8‡j(‡6 —x“9Ð=€Ù0hˆI+Ð…I Ñ-M¸9 ,ä0@•˜Hê€P`°/ Ð]S»á›yæ·/…¯œˆTah(˜„Âö€–´ªhR„[HT Ûú8 °ë ‡Èæ½p€¥/cN•÷ñHÑÚ °®…#Ì6fÐOÓw®£ˆ9«}ÿŒhGˆ¨»*¸ ØÍÇ•“\¦%3 ð©8 ¡g¨Ÿ 't~«ê>{è¾ iñèĪà%Ôk Ìúiä'k£þëß6ŒÈ©³Z€¬…„lÍõðÊAˆ RÄ`ð €"8ˆàáFˆ%ìè„7rìèñ#Â7nà(QðFŒ2 ²¸‘ã¥Hƒ2pÄQâfŽ1JС!D(PLâ˜É1ÆÎeÊ@ÜX‹¢Iz~x؈#E?*déõëW›408p ã,* Áƒ5dÔ¬à€C‰7.@ ƒÆ† vÖà0€Ø4ÿ7(<ˆÐ‡hìÖ™ˆò‘tçÀQƒâæÁB™Ûv ‡®`W³6XB†‡0š&ݸF‰"=vZ™¤é‡0”ÑdEÀ‹ n4éBh™IcpSFX´7dOb%ªeN™SBc JÊ) @a#Dæ‚°ÆlA‚­÷{½ÁÁŠ4ÒP LSŽ2æôÒ€ÏL3 5]àÕL9ÖHÅ cM8n$Ì:Çló ü‚Î4éD“€Ró ]1ì0£%àÀ!è(aÙAþ)b3ŠD ZBÄ©cE·|ÓMze’ˆ’N)L JFpƒ—L‚Î/ÿœr$VÈ Å:’04cP¤Åê„2À7Ò4 CŠ”¢Ž&[6 €Eí@Á—P0iÐt(1Ì0Ò¬£At•æÜ +æôBSNŠÚ#ZXC3êèR5ÁÊ741M5Τ#Àάøx¡À-ã$0 5@ñÍRs2pŒ4 ˆqê3ëœBÅP³ à€èœ<ò(Ô×LÙÖ(Cz¤3É-ä…:*¼;$pŒ50°.P3Ì«ß4 Ë70M2Ð[40I:2Ð 7[å”F:J  Œ443Ípºg)Á°’m dÚÖÿ $€ P€4Ï4°ƒ:ø„êhÀ0ØlÐ+¼¢¦ 7DèBO¾Ö@)æDPJ9P„21 ”±1“ô¢Då0£H:üc±èPÊÍ0G¬CÁÖèðË<¥D€.ŽÁÐÁ°sJÞñÍ)P G1¡øJ4ä`M0 ô@5Ôh’΂8=êk9,cÍ1Ïœ’À2· È39l Œ5Ë8£ËLB 6Ë‘.5Sƒ·,ÀѸр>#ŒD0ú3U”A,óM7ßüRƒŸòq´csÊn4œ`Í/ àÐѰÍ£›s^BDÀ½ÜÇÐÿ*À °¿XàÕ8€"¸]"@tàý£€ø¨° dK?0‹Âж€ À@B<ÐÈ,%€Á*`€ €˜ˆÝç¤àŒ$ÙRd€3ŸÌ‡¹a¯ˆ„g5ÙéB)"4Ét¦@¤ˆ7@bû¨]1"2ÕNlCؤŒ^H”¯fXÈéÿEDaŒdL®- , äôäÃrBèñÉD~‚ƒXúÄ‹#‘.u0’$™4`&¯ˆÍ%4u¼#€UƒCýÈšs™j®øƒb&ý+08 iÁ•ˆï‡ÔÈDR@ƒ8Ýé¡à"T¼‘±HjnG²DÀ™ŒÚsÿÀ Üô)LÇuÀ?”bŒÿÐùQÍÃ4¬ÃŽlÄ D@4`CÉ”ˆZÐUèÂ3°ãàÙ–(C5Xø`@1(ƒ3PƒJõëXC/"Hƒ5 çáç0À€°‚36„t@ È4Ø ,CK•µÆMD @˜fEèAÕ@AÐ5œäViÔžÖ]VB+ièPÏ>ƒ@+LÂ$C)$@¤1h^êe30Ì'C;(Â`ý@ŒÈ$°ÃŠ`Á-BÔ”AÅõc¤0̇5’Xò5|Ã7xÅPA9tU—jËÜÂt¶«h7¤”Ât®Ã0F½P8ÿÃìÀÀ¤Ä i…̉ÇHC]”4°ƒFÅÀV›%J§fK€Íƒ&<À‹ÜŒäÇIxÀ®i±¨XÞ:„‚lC/”ÁßœpŽ6@¦(ßhUfZôŒ& €P5@ œ+(èœW(˜O—âÀÏrƒ3š =MÔÈÿ3„Hœ†UÃ4@AnˆÈAü%˜ƒ",À0lßâ$±©åËQÃ9ăõPÀsÐÚˆFZƒ9´¤@øZüÀ°Â7À:ä&-E¢”É»”fÉÁž)·YŒi!"ïMTG((_ @A˜«ü@ `€"h‚hA ¬g)„ò‡¡ÄÀ*B(NÎèAÏR² È€u`A(°²"$®Mœ+Šý¨S ¼Óâ1IaèJpk!=RÔ^ËíDåi¨PŸ¶@õaè)„Õ«AD@pÈDÿ|‡~€3RÄt³c$nŒDQ\ŠuÿÅ ˆÞ{¢‘9Qž*2i‹ùýDÎ]Qäi¨ÌÈ1áót<¥,ùr!…“UTïöÄ ), $^†jàg¤ºÆÈ5†ÒqÀÊŒ¥Úh:“;kéÚÙˆí¢¾D¼@žb‘!ºDDw¾LQ ŽÍŽÕ„yN‚"¸˜@Á)”B)HG\…*A¥té/C‚¢ ”…«n'q@  5º(êÉÀ\€ÂF”@ @p’åÁ ´.;3‰†"`éÈC3˜…-熀d%íÃ…“°Â)¨-H[(h»•À6T tÀ$°Â· êdCAZhAèÿAaã2 Ì ÞÌ`—ÂùÜÞCX TuDËåù‚ft—9è  ~äg²ù‡ZéÊ4LÃ9 ƒ9æêJ5`AÐ@4|›X(¤ƒ|H;œÍ²:DÃ:¬ˆDƒrIC3ÕÎØHäȾn„xo µ(È+2ç Ts€.³‚´°ŠŸÂ7D'¢Ã' Ù<ÀŽlÈ0ȃ¿(Áœ(:¼¢6@P }3Î¥PQ"Êeuê ö~,€Æ¥,clg¦§„V$Þ¸.ƒ6ð«pà @A5\Ë9œd1ÀÜYo9AÜB9¼#÷& 4³€Äÿ"3¨Ã´Ü€²:Ã)yr·HDhD{CVS°Û#©ËºK—Ê‹2KÀÚ6æX/lÃÀ4ìWÐÀB,Œ:ø–è.Y‚YL]AA,CÇ3J TRÊGÞ†)€Ðyü,JAÀ€Ï¯P ¤¼ûÙöÃÙÎÐE(‘]ÊœRÔrÙ5Å­Ñ9X1ÑŒÜêQÓÕë‡Óçt#õ€y}´³¨!õ á^ üG„S™žžE¥~RÕÛÓÛíÑØu…Ò'[‰QGˆÄ èAÔ Ѐ Ü€ªÕ)Y8ÄÝ€å¢$ýÿ:Ó+Ò½v­3ó1aÙ^IüMìPkºÄ°€I”Ëô€*¹ÀJàÁÌ¡èB1€æL`)|€@0`5pòFìÙì8Í ]F47ƒ:v²½†Z0DøÝpÏ]Ð…hÐô§D» Œèü¨Üp«áàm u`P¬?)ÅÀ0`·¢DR$ƒÃÐA€*0Ã:H°ƒ )A*p`q¥0ðÍK6(‚.x€¦Šh¸áV×÷ࢃbu „Zùî¤"Ž$¶F™$¤–âÚ p`ð÷½ùÿTj©¦%)x¥¢á…vèAï-à{à!„7h‡n(Ý÷> ª5ú¶†—w쪕W Ño (@÷µvh@ RþÑ Ø;àp‚2 0€${ŸÉjµƒl)8 žR˜‡ƒø D2à^RJP‚”/$Ûõü¦¾„Ay£žé—@X!¡Ð^±·5ô §XIú B79° °àG´»¡)@ €Sx ¿ &`n[€pšœ€Šè"x‘4Ü¡Æ@ÔØ*¤úa‡D€â¡MÑø†5DÆ4„à 'ª†’00?(§V7ÐÿÃ-n¡«èA¥(Å bà9Ü1ÀAN ]è!…¡Ô=LBDØZ zHŒh4 ‡aò†?xàGÐ: äЄ:”Ѐo c méU:X€ž4 z‹4ε´e<ƒHh5Ò!%b(@ Î0§5Ê€Hãш† À sLŠ(@dŽDËÜâL¤±ŒhLã$PõF(€4@CaJÈpŠopÀË ÆôHH9¤Ã ¸Å7ØhÍâøZ8+ÖqŠLcUÝ PŠS8f¬@Çp¦ ©šF‚(£JX‡ÿpú  §ÐÅ:B”ÆÄÛ:7£Ä`N“X‡0`Žj$eí‹€Ìq sØt iqJ"‡pDãè`‘‹Šo ;9F9"åŒh$|ÒÄ9pê r$@Ô@’–ôã_ŠøÆ3–‘ŽS@@ÌØ†3nàPLØ0ààuÀæ Æ7¨\‹sâÍ*YaŽÌñ­jÔ2 ¤L]¬ôEÓY7j$ƒMØH@(à€9.Ø*5pÈÁ ÊÑ4ðŒh@™›ÍÁ4¸(À æÀP BhÑP¢„‰½En@wPÿƒÞ²¥D·à†‚Aáfc;3­@(Ê¡VÌ£?A‡3XA (¤€ÙQ‹ˆqÇ–*ÕhF«Ö n„ó0o&0À “`F;†¡`À¨ºÀozÁ f C ·™K1¤glãšmÀl¬–Z?¿ †&ŒS(@ÅÐÁn!€a ãØ@œ1`àÍ Î@/HS fAeˆÌI ^P Á˜F/Š¡,à-…*¸Ot‘Z%LC°Â€ržá† ìÀ8ˆ†@(½ƒcPãxb”Ó«ª: NtÀv°Z„ ÄôÜ­u _LPx’Ò€¼ÿu` p@U[0E® €»p¢ß"ì\DصkÀ²? ê´˜P);À­z€Iâ”`Z/tøG<ÄUuÕcŸ4hnQz¬Ûøº´>oÏM¡´PtpînOˋܠ¶RHQrÃ3i ð†Leáá_•bìö%d*7ȼuЃ‹çÐBÔS$Büæm$"¼! Ǥ[ùÄ'¯”€1  ý’¨ðûQ\—SbXlÀ΂[‹@2 _G ‚2˜ *Çr‡”P{Þæ•n@¤”€7ÈÁ×;À«öµ¯$hëJƒ`]ëå~A yŒpÿãýãÀ0þøƒ…ìà¥À6zqÒÝà§À†9ôP•Ký!)œ€Òh« D€¨À'/€ @€»£@*9lÀ°@º L €2ÕË€[¡±Bº,È0œ±­%µðùE( ú€ƒó¬X;¢zrÆç\ Aá†.@@e¨Š# BM°1 Q .i†¾To0£¸E„¬D8@`cÕxFÚ\k°Bñ$ÙËÓs8t5G´ŸáýªIH Æ¡Þdùò” Ü`Ρ.¨av@/€Jô€X!ä`~…” ÐáÊÀÿ"%Ø¡ J!Ž@Æac°¬I4Hƒª e8` Ds0¢€# ªèúGŽÀ’ïà‚!?ØážãE4RÌ–#]`Ó`òÄ#r`xáîɱŽ@IÂ@Žèc ÔC?NÁn@X!’bHk5b|8@ Ðna¨¡B  q@€ÌA“ µ­ ´¡ž\ôêÁz#¦ard°„Bá`H¾±+Iä€I JðNÚƒ"`”œ¡‘p%˜`P4‡r‚®Ü)Àn:HèœPª†n|p¸ÿ  ÚÁ ©A¿ÁD¶!ˆ`†¡€O6 tÀ ÖÁÀý ±@ñ~E`¥VE\V>逧åF€„A(`k”Àñ¨ ~A(àTˆ ^%bà€ˆQ« °A¸e¸ªá1Jáh@ òÃÒ`ŽÁ”ÊeFb¸A «+_zá³ÒaGô #¹å`zæ$³Ü¡Y&à-äᨉšÁñn`8ØcpêÊ¡ÒÁv#¡Q#)à b¦Ž zÀ \¯–¬àvo4ô@ L ¬Þˆç `w¬ G(@•v&ÿ¬&EŽàlV®TI•¬ N ¬@0= ô Ò+¬@khÌ1U© Œ qÀø¤kGs|&OàpDmt„O(gxÇrÄÄ/·f@(¯rp@V8„åüôTONà6à6e…jÇv4‡u:@uTïlnä°‘ÐÇoH€ø‡8Ú‡ºîÉ+HF€ òâq`ÀàGæ0.ˆçÊçø¤7™V(èÇ+$àt€ÐB3°~@DŠx§^€"Îá@È~j…çb*b<à3Œ “§)d€çˆÉ`ì-!J‚ä¨6“åÈ­{Hè…¼MrÒNÿjà¢Ç=ÕswÜ“dN@v¸ç;Gô ‚¸ÇC-ÎØˆ N¡t)ÐÍ 8àN!’6@±eb X‰* üò³ñ0$¸v@C¥‡¨ˆh‚ "@iàB9`¶* À(—nàÜHöÀJ?ˆ¨aØá@Ä<»fÀ¡DfO´Î>aJ(¬aJädH—ow`@~¡” J`ôàIy¥¡z PmWJáAÂîSË p"0 UµNàNáfIµ•’‘ãnö/ê’¨D&Ar@^‚šRâQ :@²áýÄA0V´à2¢ ÀÿÀ©¾¡Âš&" " ¨aK¢ ÀÊ!ÒaS‚¡Ë†Fžœa3@ÐYŽ€€çƒWà2!z Xá@ ,*ˆŽxsX€¨¡`nnJm& \á©Tê\ ¸¡6  ž4œ Éd ~ jÖA  ^ ¶!ˆ&Sä¬A`§Xá J!àÐ6ªr`gg#€F–ÄJ8-$è*M¬ ‚>tÀp€%Àá†Á®®F¶áªD†¡pÄ;æÐ/€Êk¬`"«I(«&aœ4+tÀÚ)âxÖ@¶F{ÿlÓB(€ÒÀa6€d8 xÉ Ò!pJÕ'P DÂa¸\F¾a»Q¹ŽÁS¸á¹>OÔšëž~*TÊ »  G¤¡dW%£t@B!Tá Í!`Å„ <@À@ n€&`ZÄÒV0 ¾¡ÚÇ<ó³nAèáŽH«4Aæá ÌáÒ’gØÖá¸FL¤53Øa=ö…ŽNÁ‰Ð(r``BÁÜa&R ØA t€Ê‚Áž¢poŠAhàÔána4¡dñ@ÔfzAz!°ì÷@ÿˆ!&`&‚áJp ¤áˆfèƒ6€û~ÁŽà´àΚ¡„á0€>˜„AÄŒßj&ÑÿÊ€¯E„A:À!J¡ž:@”a>þe:@<Îa_û5ªAEI˜ÄI`ñ´à¶àŠÁš¡}ÄdŽaâ™vŒ)Šá,Næ¤N¬t*ˆ™EÀ«Uœ#¥ã@ºÑ¨"øô äà×áU¬á<I¦dz#¸J &Á^åV Ëâ¨Á.à¦%"Š!cˆêtz!‹v`¢JÀ¾(€–AZ˜›vÂ>¬EŠ‹$`¬ÁÎ(Êa¦!Z{Â!¼@ÇCEÀÀx°ä€ýP’âþêâ!dÌ!aJzaÿp*·Æuœc`*;æKÊáª.³mùP~à-@ï”`†@ hàZÀ   ”@hF£ÄQ\6àz@ B (M.Ë`àÒÛõཪ{Å Ê cp)  G BÞà: z”Ô Ž  Dõ{>Ý¡]GplóH@LÈæ. ¢n6) —öÆVvIpZ“*j”\Ghtiyp<¢Î5¥g6é;9W£’éú“™AèC¾SÝBDrÀ>´5ÄÎx Bx>›˜ª'y0N!r”ê‡~Vh8K†z&ĵM~–pæä™¶ææì‡9m/AaåæÏ^À­lÏ ÿÂÔ“îþA¹Hî§}ÒDn¨üŒb}ŽBzʧ­¨LÈoL= º­"yÝó…‚Ü&¡Xav¥tL¾zÁ .k:àyá.~ÁK Ú —Òˆ@Ô(’ô•`’Sà@¤*:Ç à6ÀŠœõi?æØ ŽÀ¤Õ'–¡^¬†³˜Š!ä!ªfšÉ-„!–¶4a8)vg‚Aà@89@nA„y…XaDä ‡†g@`8I"ƒ¡†ý‚²‡€nð DÉÀu¬ì€G…2ëÜÀ–¬Â…Jøñã[¨20º|ÿ 3¦Ì™4cÆaÅÙ°eÖ 4¨–ޏe 0;F ›› 9ªakMK„hßœ¥Ó4`˜»`Ò¬m¨Ð¬3vÏ”y6¬Y5" 0ÞÁÐCÛéVâ`(‡ƒR舜f-ÂH—78ô0WÊÁàšŒ;^(cC^½(˜Ö @)n8h¹ÅKÀ°ºÌ•°ˆAÎ:+šQŒ[‚#è¬(通´ äè ¶n% 0ü‘ ™5.ïîhÀŠ›°o½¸Q€+ÃaŒ%~ fù8¼x˜20*×,Ø9]¨ Š›,àžýwl€³g €è eθRNÃPSß”Q:>#ÿÍš˜ÃŒ0è°â@Í| ìÀ/æ(I8PÂ{™ƒÁ`#Xy8tD|wƒãíøX0# €£ËeïÅ×@/Û@5ùŦÀD ˆ:G@Œ5ƒ ‚rX‘8d4Ï9§Dp‚“èÑP§|CÄ&1„Åéa%˜‰T‚m É@ÁàLR@K<.ʘ¬|ã 1ó°ç 1€“”sJ/óÓæHóË2VlpM5Á¨#@É`3é(òÀ4ÑhÒ5T7‰2ó°ÁpTðÜ$óDÓË1r€Àíè²@Lc 1éȬé$“ÿÀèqL;Òœ²C[Œž S 2œÀJ4ºôB+/š˜õ‹”bŸ.¡TÐì2Ïè²C³ÊÛÀÁ¤áßr Æ9º! Ÿ”æÕ€‚_»Ä E,€Ûˆ†9øÓ†jPã¿kÒAyÐGÉcá@Ìý”à]õÃHG;Ò¡ ˆ ëhFhFp”cDèÀjóë˜_ê  G¸Á<@„îà7!Áž 0„G C~W#ha8É~×d{AA :øA 0Ѓ2ÁÉ2é´`-œy!@ø*Dl£( ’Gør^(ð+x kHÏ HP”@q8ÿI:°PP $ FZr¿Îy0€ÁCî$é¼p΋6?åÉ¥5C@ #Œp€ÌëS Rùa¯ÑŽ)óÒ†˜º%Fôá£_R=  Ô‘Ëžµ  ­Ô4Ùâª'¼éé ÏëÜjÿÈÇU”Ø4Q”UO ƒT0&0xA Œ¼OÃmn48~rƒ \ —ÆwÏà€0 „IÀf9ScÄx&J8±ØÝ˜uåàv1LA᧨<.s-¹èÞR˜øÈÃÁæV—nèAUÝA¶ñ‹bMãDÀÀbƒIã PÚnh¯R [ëÆ8´¥ÿ(q€2PÀÑ&\à € èÊ< ëBاo%QA8·Pþæ9$apÐ&Gfž8T‰_ >ôéŽÜ37ÜÑ<4Àÿ /PžùVš)Àòæ:4 o7ôk²ƒt2Á0©)4X8lbiê-]C¹VpcÈ=rq2½C@paod–*P@%€iþö'ÐC2ðjç@‘t(°¿à p$Ð)$;åáÔð ß  /¤}Í" Qz ¥<!Öð†ah<¦˜}ÝóBG@3–¦£Jà-sSDZŠC(1p¤£'`/"°(Qf5@SÔEHÓ?àuùy"zð nÀ í0 D<q 3··}À³Øà ¢2 XŸNW#„ öþ7b*Dà ´ ;pŽºð Üÿ P¥¥ÒÀIÕJÂð¡@Õ«  ÒàwººZ”s80%]è6só3 `¿À $L¦Å ÙàJ€YG a0 W‘†Ø°ÃÀ ðzàuÀM I¸NG@êÀ >ð Íp\ë ŠÐN?p¿ðóÔýŠOé O‡©pê² ¥Åxp2ðŽG 9 ´…èP Í0Q_ (¶ ×°Q (È =@€1 ë@ À ÓPzÊ/ÕઠR:up ?52ET nt -± +ò9p1;1 ßШE´1L¤‹øÿ ¬p™£ŸN‡‰ÁO€*iE ÆVp ç€)W>•(P³è{õ [R õT â ´†Å T¶X ÇPךÁpaj #Ó|ëØ‘#JK¥¼   ˜>òZ0 ðÀ P £A«>ÀÚº¥ Áq“ðò¤ '0~ÁX É¥8€0d­$¡ ¥@,°PAD€©0`ÁõGà XP Z èP Ù"Q‚±ÜÀ DPÇP©§xP0 þõ®Óð  Ø€?Ðwÿ7 €½P"h]%Ô`a\QOê·°Z  ÿÔ0bœ2éi:Ïq îÀbjB"à,½@’z@àpÑ@$à2 .ù ÜPÒm‘¢¸¬¦¬*,PœrJiDpг FÅZ ¸£ƒ:p(À@`$Ð:J-Œž;JP0:¦mð / @° _w=y0ŸŸbš}ê‚RÓ9yº„pCfا@A§¤ %< 2À,Ç%²ŸÀƒ À,*¸Pçx'/F è¬?škSÆ ðIlÜá=ÿ–rì9q÷™Èsv  Ù“1MG Ó:6AŸ8²2Aœå&ÿžã>¨Ã=ÜQ>,5“–Ÿ§.ð §ŸKØO @¥¿œUHÊ.16×AÉNç9s2ÓC9£“nÕ™ž¤nÖü8¿#=𾽄b% Ä{ï»xK?P Å G±Í“15Ó :m½§Êì­Ðúš3RmÇ 50ðPsl\7K³-15cÊÒqG ø¯9·˜ä Øð H ÉåÓõº@€i!´BæÐ èu›ÞÚ¬À ÊàZt ¥ð Ã@‚Y ÇÀ ‹`2Q uð¥r T¤¬À Ë ? Á{ ¬Ð Ç áÿK%q r}!Ô>u GÐ=;|èÏàE¤ìt7¡f8 Úà §€© Ç0tÜ §º Ô@ Í ÓêP Y¼à Ûp Ü@ daSMOÀ\-AW]à†‡Ó J…1x鰸̕L(r HXºÓp‚ñA’1‚ê0½ÐV @"̯=e ° æhê ~²E( Ä‚árÔƒb  Öû„žqÔàÛ$iÛ‘1 U^È èÀª©_jƒWÇp ®x¶ìû àbá ÝûQD "¢rR Èų ò R æ0ÿ ¥!9ЈÒ#8Äð =À€‡æD ˆŠ`-¡0h׊½JÐ5âË’ç#¹ÎW$éÚ Úp /KVQi|¢° 9È%Ã(²bZÇX}gÒ‹È&VPX'¨uðB¿£JК¥ bÛÐÏp@9î% hí k ˜S àÔ“2Ù0‡|ÁŠ@º0 ó@ ×Ä Nâ ògJÉ`خ³ÒÑ0 §0‘·ð §Ð ¿âñ>Ï ô0 ­Ð,òÐ ÝÒ¡9°Ÿëà’=Ä@!*MäÍZ겡౑ §àa  =0šÐÿ ºP 4'}?} À š@kGú 0ÅÀ ¥ J[ ¬ «1L¤É ÓÍ %òàO-1e0& +qmÄ ,ãÊäû€pð¨pP‰™=P0«% 7Ýóu×2 ­5\C™K›2ð3…i‚‚¦9vpSàÍA­˜.±w³?ÓÙ⹡VëÂéù2·£Ê”m_Ã6×rO; #.Ó¥s:óü¦ Ý­³Ï*Í¨è¬ A9žNl³L>Iî©È0I1P¡¦&¤±óoŒ‚?¢\;ŠƒÊ ;Þ âËåI>ãcÉ.ÿIî6Ë518HOUŽ0q"'q¢6¡zp'êôcø;Ì£”9ðÉvº>'s2Ìòž ¤èUž@ ð¢Ã#`œw! eq2™3áAàP ‡Šà Û  Ü34@n å 9 ;ä+5:Gptœ$ D@D”dK¥Ð‚EÐúëSòmÚëü0ÐEˆŸ¿O6ñ½ Öó Ì ^ð…¶„”ÿ7B ݘå«Jñ… v]J°Ñ×à ´½° >y¿ü;VßJÀàÔP €– Ãà¹"÷<g‹ m‘ðé6ÿP6­A  o`£ ]Û8ÈHXÑâEŒ5n¼H‘ˆœ0ŠÒiJ0íZaÛäèSFŽ9]&­ EdÒ%ên¡ØÖl@°uDô¤S¢]/£Ñ(ÑFS:E4(À@@ Ñt¹âöBÀŠ;œúƪÙ/ndÄH(#‚t¥¢2·ƒã]¼y+²}AÄ™5jët¨,€¦®'Že“¦nØfÒä Ð@ºn}+0ŒZ%ßÊ„A§dÀ1iKŸY›¶î”ƒº–õêáà5·°9¨HÇØo§”õâF†€ã8Þš+ÕŒn½Ñ¥ïñC0n@"\ëU€š0¡ÀE€ÿ iË0›V F—s ØŒ’Z(¢ÃœS¢€Ø´”Áf ¸a%‚~‰f˜ hfiÊi§ v8avˆà)Xfh€á‚bà ¡‡t)î¸éZÌk‡ˆ©f€Pä¬ðB)çÍ(Ãb dR %Ðåpš @FüÌÑsNQ? àyJ‰àh@¬˜DfÎ!DˆˆFòt0'/Òa…rhæ@6À¦"ÌfØrñP¶ í (¤±Æ™² ˆæ—ìÙ!g®É46Ð%n¢Q"‚SÆG%øEü¬ÑƒP°‘¦'ÿ´˜ÆšfÀñr‡Ø’8(€j %ØÑ…(˜d›r˜Á„Ò)&fݸ¦œgr áPp H€zøáÜs1` p(¢qð(Œ- J8„Ž+!!b¡Äwߥ %8øŠƒ ˆ¡Ý½,’n¸W€{î·×>tŒQ×]àäÕfþ|é€! Ì‘fÙi· Týþ×_tÑó÷_!îW2(ú üuà¬à@ØñÚÍOs©ëœ(˜6 ¦-hÉ;`ï’?  ?(ÀìöQ;ëÐsLàl¶A*σ3¼È dঠ„D!îÜU> Æð‚4$b»EF‡,)€&ì¡ß‚øD!b°ˆ4DÀ jÐ[„‚ñ£ž?¬÷Ã(†ñ‰S¤¡ 'D ;ìb aE8RŒ34cÐz°ìÐr'ÌÜy¸ž ^bœ£ÍH0w¥ Z°‚ àHxýQ’‘¤ä$ÿÃBzð$Øà ( ˆ` @,YITžò’‰ãY& h€Ý ¬…‹ÁXp\®qbäeà\YDE‡iÃ<1YLdó—3 !ù ,¤!ù ,¤!ù ,¤!ù ,¤!ù ,yŽ8P†€ ”Q¢G‚a #*4hà …0ÜXB‚;ŠdxQ`Œ‘(šÔ˜¥€&[nˆ!G†'Kh¥ãÉ›%2 ,€£ÄO£H RÀqôæ@;€r°³ ¦2R+ÐC¦ÐRn4 ò†×Š/cŒ)ð¢Y  aªM™ÐmV´+aJÄ+1 !ù ,*fÿ4H ÀE$%2ÈР¤†#Dq¢€?}0JÜȱ£Ç 9þÔcŸ.ªLÉråJ@„¥¤(ãÉ8sêÜi0ÑB† Z4´(Ñ£F“"]:tÐQ§IòœJµjG.T°jÍÊu«×®`µréÂ+Ù.T¬ª]†ˆ%:ıãF %ðêÍãÆŽyaø‘·°^)dxØðÛl#K6(#FC%hphP A‰%d„œ¹B‚'NÈÐà €ƒ¾™SÐ-ƒF‰ 0Ô¦my²ïª8ôfH÷’SÃtáЃF ç²AèéÕëÇl,ºˆ…â8…wï€ctÿैû÷ßè©Êˆ(¸Â¤jϸa#âÆèО¥kgE†eØè—Ì9fà :

,»ƒGap ìp  eb,¨%&Be° ;` Âà%à -œÿù5Â7¤§{` ·P$&©DjÜÉÜDØ[»> ¢qG0à y0@yÒ²P¢@Ô  p ÌòØ0™=à1¥ð Íg9 @ C è0 Ã`ηð xdÇÒœ^Ù»k¼]˜+ à` ÇÀÒp5epJàÊÙ 9¥`ÈÀ п0 É0 Xp–æ<Ê0”Ïð ¬ð ¬ÐhPÀ b»êÉ}I+[ÑÅÆ<Ì| ½ ½°!šhØ0 ìXVÀ i1`rPßÐ ¡ÔÐ Dp§1Pé*7ð ¼°•ÿ9ˆ¦JP e`ÍÐÑPÁ ÔÒŒÃBÝБ+¥° ÛÀ ¼ ¦¡à=§yãºw£ÏÀ à,Šr눛yKŠP Ò@ Êp ò1 z@0Á ÉxÓ\×Ú5Rv ·Ä±ÐÖåMÀZí cC3x0‰àW%ÀÀ·D~…¥âÜÁ™šøZë”ê¤E-ÊÛÛÐìv ÇF-¹¢‰Sš(ЇݿT×$$x¹o'-%Àxé9s!gw  \¹¢»»‘˶9ܬv™º–(º¼Î&-•$ÂÙÇu2êÆÖM¶Eu+ÿô¶Ú½½³kÊ™vzExvq&x½Ñ&ñ q‘]²»ZÿÓx càÞUÁß©eÃ1 à5rØ j K³a›'‚q ÎæÚ§ ám39 Ê QÁA ç ! Äð"Ð*¡@zœ ½p õ)ÇñT6bšìp Ø»?Ð ÂÀ å€ Їy:dÖÀͰÎCEì€ÒfÚ›€š:P à•l“@gPDѰ Fžð Î` -X†÷Å5åj›¡€?àL.EÒ ð Ð Ï äçLNÐ p_e"`²sÿð ¶ø¡¢‘ 0 ÌÐ'Ö“¥ ã9‡çº ÁÀè‡(¢˜§Ñ.p)"éðÇp‘Ñ u t Jqý Vp®²4à Ð̶a^-4`› âÀšà c~Ç®ýPàóh ½Ð.€‘±IÌÏ%À € Ñ# šÓ ;P æ ß~G`ã¿Ð šàì)K²¡`x1 c5Ò ·  º rV 齈ð»í,`»ç›(ëñ†T À @‘ Î0¸·NvýÚŸ>XØeÚÙ¥[~1åʹ¡ÿ1 `]ðz)–rð #/ó<'Âr G°`–V*ó!A€î©¨ KûW}ñ·MÖÅéL/Õ  À*šZKcõr ê²õ …t ¡p)g7ÕÎð ]/yZ¿¡=Ç 5ÓuÊ1¢/¡P $À ·Ð¤h߯âsP ߀,ð" ¥0gmÊxÂæO†+%  ºð Á" VJÍ^é!K,1?Hú´é0é=ðñ‡meè €‘Îá ’ èñ¸ ØÕ™A 1û¯_,=ð ÛÉÀ%• ÿP¨À!ñÎP¨¢Ù85`+¾q@2p)—ââ¦×ÑzMuà ۧrWéaM"(!à†0D˜PáB†aÜ€ACFŒ:` €!£aÂ7.ìXâà"eˆÑB@ލ=tH½Áµ‡N=ÿXîèaX"=0„9ÆõòÀ«—YöÈñú¥×“;zE“v !̓NM‹¦ˆ‚Ú 7.Üš6ì„ÙÊ1OÜÀPø€¸é rÀ/MvPXÃC‡)Þ®„X‚ó"HK±zà˜f˜@ƒIÔq ‡Òå b âÊÞF“ ¶æÒ—{`à—iä0‡°‰ÓšlJ¡ÀMpã(`¦bœYà‡˜y¦&PÄ* &˜Ê9%‚ÐQD t´HÀfØàs’]©XÆšj€ pàào À"+8ÐAyÃ88x+šæ€º»€˜o8ˆà Ûn(GRØ!‚¦9€@ðš>!hà™hó¡*sŽ/Àa1Æ¥C;=hÀ2¤º(¢9€€Ç€f|*J€Â9º Ý=`ÿ4ÈA|²ƒ'œ`ϰRp‚KL¢4èÀ7†€¹Ýà$ „&º÷ì€XxÁ÷LEk`cÎ8‚ôôt9€ÍXÇ6ŠP@ô˜ °jH£rðÀ7Ì u°"?p5ÊàIæ/ ‰tä ÖÆB‘Ži C (î g(@"'!Ê`Žjh#õéÐaHE 醎€@k¤ƒ÷‘C9ªW<à0B,XtP V”óL/¬PEôB:º€BJ€…RtD Â)X¡‡ìà§(…"8°,ÀÁhÀ:²=èBÿPÂ$b=„Ábe¸Å$VòMüz JœS¬8ò7E, ((ƒ.ÑÐ W“èd( …[èá Ì÷Œ" ä$ƒé^0p€/À R°©0€ØÌ#@œÜø†‰:€y+Q DD8à %p@G*И›E4ÅÕ^b€ „®.pÛ ´R`à£YA%S6Ó“”° =8A°&Bݪ@jW‚ÜÀV8Å0ඃ§&mûO6ƒËÈà*)¡È@Œ²ª¨E«¤Â¢Ò“Ë$4ª•¡I?xä— à§ÿa‚‰heSÙÁ(ðïÖ³Ÿ%ˆf6›ÄôÀ¯2 O0 ,È´¯õ,P’UØᦀ1Ê]¾¡Ž”n ¶¿j€{€rä5€@/À± %€ °Ã…nt˓ķå—^¨+¾¡I×»ßýˆ@²ƒê‚+.xÕ»^†ìÀ¥Ø†JaŽ'x€­ìůz•Ú‹t`ãî FGØ’_{·µ±‚n±Ž2ü¥À†nnÐØ©ˆ+„5üÚ‘ÄŸpð†EüYªˆè´ÏULâ‘PeÅ/Ž aPL¤.†qŽÁ²aÕÈSu³5ÆAÌëÏLn#äÏ ´í•‡nr h ‚CZÃ;øÁW|ki S`@ëaˆ zÚ*? X€M«ësت„+7Ј–²ƒè@:ØAw™>\œ81ÅœëÖ׈´s2J;7å"4ÿØ@Ú \ƒÀüc :Äòp#EànÀÒÀDtƒP‚RXµu†“ÄI5X€E¢‚µÚD‡9‰à iP—E  ¸S8žU’HH:…th'ú£ÅŸ›ˆ Ýé èÅòø v„ PŠbüŠ ‚2@”ª`F°˜ˆ¨€‘±™Æ¯è:èÛÆ¯Xžo” HV°=!Çß ‘ð€gðsЃClÇ™€Œ vÐГeíNÌ(–#Rà€¢IÄÜp,K(Éj›Æ¬‰¡X QäÌwÄMø1 €@ìI øt¨Çÿ† ȉpÎt(iø7§t#u ƒÐ.þ È¡¢K]€St&.MÄöÑ2¬¹Kœ$ÇPu Xj˜Eï¤f(ø3 ÓëIû€(D*—ÝD£h€XZMP«Àá›FŸ0 «]ˆøtPfÄ ¨°G†¨w}´9ÅÀÜ „l(aØ” Í€€[(uЬ-F»ø†cu(%ó ï…`P‡t¦==¥âÊ €fðXµ8 p€(‡¤Ù:¼-bøn8Il§Hý3ÜCEÜÆÃÑ[p†_ø½)Qƒ ‚Êu)ÕUt/::Hÿjˆ€!äTðz+ÀÈf,AtÐ…#H‡ô>„@¤ bÈj•Ä ³¤r(‡gÈ F„ ‚Ðt`‡tx†Ø(¥¤"˜ƒûV$À(°(@ÇÓ}½M©"Áb tÃØP,Ô ;þ|ˆ¯ÒOÜõ ü%¼ øÚ6€û<ˆˆ(€ ˆŠóìſɧ^è >ˆÄÞ(‹`ཛ p†t7¨«ÓŠÜ†„°Çn`Š€s2¬¤H¬¤+@9¨‹Ø@½Ç_²‚s âå; ¦Hæ †Q(ÈÀ‚€³‚hŠ(„¯{\€š …g‡ÿh8¨¹-Š<#`…gX°I‘( DÜFÙÔ7€X§luG©rJw1´²°á+˜†„8˽Êß§ÖXT§ Ø€ :‘K Æ hƒtЃvÊ XøZ€¨ãLŸàkh†8 ~XC©°‚P¯jLEh‡o[¡tlÌø(`æ¾ñVA"xÛEVÁ£,B.S°bBþS(aƒ´@Ô$Æ-†"aâ @Òž”´s†XôˆŠ˜„fQqNåvºgHkΑ˜¸j šLÉ¡ ¸Òg˜ˆ“KÑÿ ’†u¨`‡¶ZÈÿU]89hX²ˆXÈÉxÚhØÙl+VíÅuö‹ÍÐÐ+€‹×M²ð:»·qNÄ»`åö‘3ŠÈó@ïsØ:Ķ´†o ‡`¨ÊêR'`œ†qà±ŵ¬&-8…v¨”)t Qù‹¡PHA ›ƒ7:‚‘,Z”ˆ€€K’¡¨X†c¨%˜š(ÛM”­ZÝéð«ÕQlP€I(•¡Â®CÇX™8‚oà…¸Þ)t€a`jøw†ÐÅC5Tla¦Ív†Xƒ3Ix%h!aPM `¶éÿ¶‰ ØjÕ;™Jˆº€˜lˆdÞÞ0eþeVækЦˆ#‚#pé•h›yñÆ Ã€ðïð: { Ø9s¨@[èjŸ_x†fog †Nb耇àoþ® HÐX‡؇÷‡yÐgŠdå(ð}ð‡}ø—ä^„‚pðð‡ ÿz`£žœ¤+ð ÷‡§€Jcð ‡ð÷ðò&Ç pçpoï>$‹‘Uñ_ð…DExðŸð¨É 8€/qwñoì?r!_HýŒñ—p$e%°‚+¿r(`î“ÅÓgá[û^HªxˆÚ¨ ˆ fvåEŠ !ù ,S`2ÿH° ÁƒÊA0F‡#JœHQ C A”€qc Ê CŠœãÆ9(Üè8²¥K—wlXfî[© 2`t(ñ²§O‰jøŠ¬ü\ÊTࢠ¨`N€%ž5ÝÊU`ƒ®`}#&àZ°Xê¹@*AåpXK7b©èˆ`@R®®_„`œx!Æ‘¿ˆ Ê(AAãÅŽ&žŒP2å¿d¾Ì¹³çÏ C‹ÍÔi¿–-ŸîZ¡à‚Õ°cWœ+{íæÚ¸sëÞÍ»·ïßÀƒ N¼¸ñãÈ“+_μ¹óçУKŸN½ºõëØ³kßν»÷ïàËÿO¾¼ùóèÓ«÷É Ev¥Ù¬Wþk;Üë=´7žÏ¿¿ÿÿ(à€J”ƒªTÂm¶W8 ÔÂCù9æ”_Ò¨¥À %Ж tXýpÌZÊ„ÔC?¼F×b!ÖÅÌh ñ„] ^·h½hÖšm†–eÙ„†Á_,]Ç`L6éä“PF)å”TViå•Xf©å–\véå—`†Ù[ $d÷уbþµcvIZç:¤)çœtÖiçxæ©çH¬ìÖ6ÚÉ“Ý]~j衈&ªè¢Œ6êè£F*餔Vj饘fªé¦œvêé§ †*ꨤ–jꩨ¦ªêª¬¶êê«°ÆA*무Öjë­¸æªë®¼Ò¹âvRgã@0\÷MwÅV×Ax0luö*í´ÔVkíµØf«íRlëíRûhnv!ù ,¤!ù ,-ŠRÿH° Áƒ 䢰¡Ã‡#JœHñà‹8t”¨È±£Ç ¾(b‚4h„\ɲ%ȬèƪD .sêÜypGVÕž‘‹FÏ£H¤ƒÆrÚAÁPciÒ«;c4ä%N%`t€¢Iµ)°ªýhMàFÆ€N‰‰œ P‡€'zPЄm]¯=d”¸±¶qD:À±Q ­;Üè€WÀ69`[¢F‰ ŠÒÉÁ@‡ã×#8 (£‡@%b(ø# !¤ ‰×76@H #]©:NÌ…M]!„ðœ `PP‰‡Ï,ÿ£¶ì78qb®›±a uDxLû|fÍþžTLÀŠÓÌ/?,CnìQ÷Õ@Ü™&ÃuÜp‚ p€ ÜPa`S ÀmC€ŠÝ$À‚ 6¦Ø ;ü°Ã 7ÝÔeŠé £ŽþðC=Ü$ÉIW1¨Xz-º˜[n—ݰ䓊Å 'äp%– Ôƒ -ä B*h4¥’*6éä€ðœpfX*PÀÁ $ÀpÚ@T@ 'ܤ‚ „–@ 1T©"‹jºÄdz2T ‡5ß|£ ‰Öxåʤƒ$pÐK¥ÖèÁ Xæ e7``Å:ÃDÿ@£b®µX”RÆ)ë¸QA’ObyJ0êXÁ·”…4æpPCJ2°¡4ÃŽ2dÊd­I-É¡Î$P¦ç; €:VDA h’Î2œ{ÓœòŒ3Íd·;M)p `AM:T`®t7Űìbå HM=0¬=lã†3Î< t¬ðJ®X#¥,³±4Òˆ.cÁ ;,ð‹9D à (ЈCÊ(@4˰ƒ•ŒTn‘6ÐÙão6Å€Cr¤cl œr޲FGB‹‘ð9Ó¨³Î- ì@èŠNóD¨¤¥X ;§ ÿ E4rP  9h¢Ž=pPŠ:¡E'\ É3½ G)“XS $Y÷QŠíÐÀ-æ¬}Ì8`P†;¥4ðÃǤ³Î9Ä(P ;Û˜S9@ðK;=³À8sÌ:Ð07£Ÿ£\z@@@ö Ã:ô@$P…×+a…àç CÖï°Öÿ@D7¤–ÉÍ; ”X ôŸ¿ÿú+ÀL”?ýùï< k¦E·úµ¤UJÆ/zñ‹`Xð‚üÅ3HA zp‚½  0°°¿d[©ó˜8@õ¨Ç>öQz݆7´á éÁÃÒ°‡6´!ÿgHÃz„â-Œ¡ßWT˜&6Ѓ;¦Á i´cñG<¶¨EyœãÏ€G×! f\c]Ì¢<Ö¨Žf0ãÕ ‡&`¦E1Q`Ms"BÔðâ®8…;°¸E5ÎCŠP;æ1f°b„X=ÖˆF,ÒƒZ`†0⨉ÉLeé¹cõx­éó¨Ç<´`zp1h„%;.±Èx ²×p,)¹ÆKö"†<œãî¨BPÖˆ” Iä@vŒƒ§¸¢<*9MXªƒ‹œ&<.) FN³šô°FJQ tÔ£“R"&—4JddkÌd‡.äpŒI¢‘—ÖĦ7çÑÿEdÞk¤$;Ʊ‚¡ˆ›:+ƒGwD™Ì„e;4q W2²’°L‡>« gØ–û¼h<úàœ ¡é“ël§C=0’‡¡xÆ$ãqŽAj‘³”‡=yáŒV²êøæ4ë‘2°£ ¨cC‰¹Ò‚$ꚨFËN1‰EÎc'ø',¯Ñ "£¢ÁȈá xèTEÈ"=š¡‹c"r|À ìµNu6u [SD;¤Ñ +b‘ŸÏX‡%«!€gàŒÖà3Â8Mt<¤éx3ª19ÒÑŽumè]! DŒV–šA¬¡N…ˆJ4òðž•­a<â:×’-¥wˆ) ™EBÿ4 …Ü¢m»XM5®±:£™ŒI+âV†~}ž¬(xa|Ь°ÜéB׺aˆ®v™;>- ³…) ¢›¸¹NÔJ ìôƒ(à?¢á@0€<`'Ø@}‹¢ 4 ¾õ­/:°€à;!STêÎ 6358N Ü#€ü ëÇ6ü³ƒ O¸6Ù@D̑¨ª‰±X: ÅÎs+©C‚š’\Ì-)Å`˜4Xke^åie…;¦zJ ¡7ÈÕÉ `|†äZq@5Ì“šì SDòC•eä-¯DÒrC’$× È^–ˆVv€e­ÿdÉŒPà ¤ °rš™Â5MöQ_˜õD¤ÄtÀ ¿h†""$ƒèA «ÚsEpÀ+˜ÃØ F„@Ðx O0h@ƒœ‚ðÆànX!ב´š‡¦ k éÐC€Ð M,£JØ@záŒa@A1  †ª#uLãX•¬ò¤$›Z€Â6t±"°m-Cž‘èIP °†ª;P†^¤c§€B¦­ÐÝà¶±1°1Œj CG8Ç)–z­Îˆ‘ºЃxàe@nŽLo 0ºö tnC¦êA¾¾Á\i#ÿà÷e•ð Epà§÷“­ ˆlçÖ‚:Ü%€CØÁä 9àf÷+5~€ûÁrÀÄé Cò nD#0P‚F+@¨4ÃUÔäàŒv˜ƒP(¦áo+8˜ê=Á€zasxaºh JðƒS(Áâ6Á@)ˆq "l ÅøÅ0~qŒåÅhÞ‚ pÎH˜ü‚ó¨O ˜hÔ p-)ÇÍ+Ìä=Žƒ™!(ÐêM ´§=ò~¶Oæ@Ö#¢(ïÌf–AÌáœ|0 4pþŠÖˆÐ™.HyÏ?sÿõ"ýbÂ<Pø†8àÚK7‹!Iö<~˜8”¡ÃP÷a;P?€J„§'…bõ^% >2r  ÕƒPUáÐrÅã àϰ ¥Y 8;À 6.Á 0€ººP P ßÐO§kÚrL%H ÄÐ ¬Àiü6¬aÐÊ Í P°å@¡6‘R?8ÄM(èoæ`aÀÃ0 ÁP G°Æã É ÃtRY8Gp* Ði9Р.Ppüf9š r“€è  ƒ-Ý?8}k™ôg%ô"ÚG:½Â! £ìtƒ°Y+Çánê%*Î< “àÚ$[a0 «!´%¨éF §ð 6cè$›Ñ@ÎÀí뎳¥V ¿à2 Ñ   ѰËpŒ¯¶ð èpÙпÙ4”v  n“áç¯aÐO¾FÝ ð Hÿ…zïÚ„buùå:î!¢PÀÌ€çÔ@œ5Oа"7ð'Àÿ50o( Íð„×P7^ô)tÛ€ Ü —Šñ"@« `§ aÞdPzÀ =mg®­1 Vеø^+yßÀ p*+´$kGñâA$WÖaOtµró€c†œ>fI?£=|ÝmÚ­¥8ÛÑ0ì];£Ñ•í³‹qúѳaò%£WÍ4±g$ápä-q ÈñæÓA^Zpx%ƒÁÒgf‰”I¢5ÇQ‰ðX@åŽiË—·…z ¤ÿýú¯¨ræz–:= Pì!ç'0SÝ`vX0ÃQ º7aúˆå.0C*ì(±ƒŒ.Ü ëW€ ¡óЀ„588ˆPC@‰ œˆ†1b€8" Ü8VXÞŒAƒ”mæÊ±Š 㦴lÛVNC>… ãÄôh‚‚J©tðbøª” „)ñ"‡›N(RäŽ0P4…Ù@ ” ”„9¡‡š5EzLú¦d8((ÑTæB‰Z „²ÂÆ Bc°\£„·f v Åñ@š³;A Íé µÇÿ¶] U·î"tHû†íEÕÖY›F¨iënQˆPêÜ‘¼ºq b[9z”ûÖì[¨ÍªEh°‚³sç¦c 'Ý3pÜ D TΚ¹^ °¨“ær˜€vè¡H¸à%°!††â@ nzY&\úì&Ìa%,Ò c¡ÝNtj€`Ìù-~¨ nô€„ ¦v¨áQ ¨Fš±&€Æ£cè…Â0 %Ì‘ƒÚœ Àƒ ôPG“ Ì9ekž à”tŽ€BR¨f~ˆ <0pƒgÖÙ&‡b)†ØÁæsšy@¤–>+Áÿœ[¾9ÅœI"8 EIY:&ûb¥›Nù&0Åy".Æ€#qnpËW.27žiÉ `@‚ü,9‘eŸ²é€rœÿ¨ ¥fÉÀ@˜¨‰”¤¤M–øà|Ц >Œg$¨3ÅhF¡²Ã¡1À-8¨@9YÜä Gô§o@7¬#,ɧFe:SŒ¾E1xÁ .f`C ;¤iP…:T–Pf¼ˆFƔȋÕ©Oç 0 j¬eC¡ºU®¢h F«¤ÁŽa@´«gEëP@ ‡cc¬¹´QZåÚUKõ žH‡ : Â¹ö•¨ºÁ ` E į‡%j‡¤´ ±ªÿD 6H–ಗըÔ0ЀbÖ³e´  " ô³§¤ ¢ƒŽmtƒ ë 'je{>•ª(ߎü9[Þ:C: €E…´·ÇmIô ¨o¸†Entc7«Iœ‚æ8e£;[rYAaÀ0¬AÇíJ÷Ò°F(Ò¡ Øi·¼§m@Qˆà lôbŠ}ïqIÐÆ ÆÍ¯geà!r%(A ì×$4*0ÐÔ€ÈI”,­ˆjà.}>H€²•‚ÈÓÂ.ž HÃ&¸” .Ši`£J‡Ü퉡J.%¤ãš( Ï@@ÏhG(bÿØToõ%G0G(€Ð Œ°•$ÈèÀQ ÁµÉ\-ЬuL#jŒ¨K ¬d†8öËOEp¸+¬#à,Á @ð‹u9¶oèkh@ÛÀ0€3¢’hF­|Å `@ŠC¡½°"¤C¾IÆÕ”# ç RPi§2 qèÈ:¨A¦ÞdB¬<ÐÁŒ¨zÐfõ Ý<´È!Š(%6ý„…R(âØ¬ ¶L3=¡” X nb°Yô4ó3À޶ñ, }¢ƒd¸ûµß¶ñœêîk++ ‡R ¡1…7Z#À t`^0c¾Ñªçÿ´ ÔpÆÀ~áy§Ã Xvî…kô·ŠP”®Û¸·âCš|ôŠF!˜âÇè¶½ Þc4ìä(è€0h`ƒê`ïbàq˜Ïô$ø‘zA¸¹çCb 6ü€jçøèAåb„u`ô§§öP¦D0TppÀ ÝU)‚ÛÕ€¡‰«CpŒœEJƒœ}9Â즅ìò37ˆ5¾Q%Gº]% €í&Ñ‹2ü•ûv;¸Œ4û}k:p€¾a-ºèÑŒЋ-Ùñ[ËAJ¡é•# ¡­™ØgÆ·ýóNÑèç1 Lƒx/ˆ(ù\ŠRÿýõP|(Ôq‚è‚te¥¹çΗû÷’ꬎPÀöJ ¢e¦»þù7ÂzaŽm(®}gÉXQŽv¤£ òþóé„aG¸÷0¥? 9&ë/ÿ¼Ð p§i<–H!n{€Kû¾I™¬(Ý$žk@§Ð‰  € ¨îb…S8…Rpƒoã@`Š k€yxC)AZ£ €pxAqÚ¡Ãi Ø:»Á1:«ƒ‰Q‰$'>Ú!.¢9P+¸y€¡AB§À¥zY§`b/©!­ªB§H0žÉÀà€X‡ ì”Ãÿ0€j(*  ,0 ‘øŒ[páˆ\Ú@."5¢Uc Ð=¼‰ÿ +xȳq)%Dĉ¡$ Qò ¤Ä§(Qk¦ø5 kCJ´…€cÐ}r:J$ž†tù…ND‘˜7vèƒûZ$ØbØiÀ†“âEÝP£ßˆbà%÷bìàŠ ¯ãK¾b Ôvƒ†j(°Æ§€flø7àB G–xè€0ЃÀ€uÔ¶Q#lŠC´ÆzÑ®vA°H)%u¤G.ú­à‘ˆ?Jä¡IÐ-xzÌ>Àj0‡:`4ÿˆøt8˜†gP€p0k¤ .- –q¸¯„ Ëk3‡ aÉ*”†Ó98…rð½b„P9€e † ÀH–nøu8…ÐGˆD0 i8 È¢,ªX€x€ ²Ê¢Ê¯<À¢Äp nÂHÇh $WZGiÚ7nH‡y‰4›ÉœšS †uX<ÕƒÈÌÛ÷a‰¸ZCMœ˜èNý<×û%`c< Ð=,;µ,J©qjP•3“Òbl¥XŸ28‡`X€O¥G[ü+ëɈŒå:‡PX†ëb<ëDÄÌ‹<0¡SìbVJü°2P(]ø†Ž{ ¾oH‡ch€H6z„Eøs˜" 1§Ä ø+8 Ä Ã-}NÊð ËL¿#T€šJ 8‡š°ýÏ‘p€à€ª´SÿM €DHU·Ó³`…aÈÏ ½`…_°×P¢À ¤¨i(/˜G\ú*–‡PxÎ(ÅáÄ€0P,@•eØ‘]²&¨Ññxs•Š=:ß)…(‚a¸ÊB€´8œm@Ícn4ÅnÊ3æÛK‡­ºmZ,€aÀ à‰s‰Gë<³»@ÁuP‚ƒÃ  ƒ>ÙèÀ›(:ÁRÚžµšc†˜Y‘P–˜„fpj¸•8Â*¬, g 3*b€ P™Px†ex†`Ðyª°*ŒX~aKœÀ»€ÀMÿä@H:MêYâºÐÿTÚÃ_Z ¶„§›`S­µKÀÀ§ÅÜ$Z (t ‘ûÚ-QuCÊðØ_àP€%&ˆìÍ<=À€¢+Ü0-@9pº½Á]_¢+ªY¥Ä×Ð,(HÉð:÷­@TÍùÐÀßh†‚(Þ¤E™{aHvH‡eh4„H€Ú¼ ‰ÃÞ=´Û’¢B±;ßßû¥àÕ®ìŽYº(þmÀÐÏõ6Mnj@ßþ>0áX‚®@ðyöê`Z”(° À½¢ ¸t°bá |Oø†áŠLˆÄ€2oq†P¨²¢Ä,(†cX†–f˜VWä€TjÕq@ƒ}ݾd‰ð€*®@Dñ€#ø } G?jU¡Š¢ä±PBÀ¹rµJk;(‡_(ÖœÍhˆQä¥E™MMMˆ€¦\Çœ p€!¡ äbŒWBH‡oqÓpl€-ù†o(g¨Ê&&Ö’0áH!>â¹à«¾ !ù ,.…QÿH° ÁƒÖHȰ¡Ã‡#Jœè†Œ ”A±£Ç C”¡„•€SDª\ÉRåƒ`Üœ•“¶á„€-sêÜI%1 (bg…§Ñ£9uLФH£J˜£ ƒ%`œØN˜SÊE(GjÑ.ШÁq¬[±:4‹V€Á *ÞêÝY‚`ßcó(S¥ïÞÃ+‰¤pŠ™gˬ`h‹¸òGÊaD À7,‹¦¸!Ž~ôÀ<º5Ⱦ8\ËîøG?NlžÍâÆÜÊu E¡tï·¬Æøâ9¥ÂKw$åq©O¸c`“wÿ,‘·/ P´N ˆëno¨-@Fépð c ´PɰCšX£/П[;@EŸZÜ$½P]_%à$C XqÊ3ÔäPB (,ÈÓUm7ì €æPU '\ @ 7<ðÀ SŠ7dhbKŠ0twý ôƒ¡t„:ÀPA„¢‰½°ã† É- ËÀŽ@ „Í@04`æDPŒ9ß”£K0h…T^^ÆÁJôÁ†æp× %¡Ä‹ÖP(AÄ 'Tª¢2¼§„ dxW}}‚Dh €&C 3‚p ”ZÂÈÿ°Á%pPS¥0 ‚ÖšB8°g¨ ƒ:ôè0ôà ?\Úl = [†*”€ÃµY][í]×ûQ¯,P@¢ªÕ´%T€$ÜàAæ6pƒ Ü-»áº%$A¨j(îD§– „.Çür2lˆê©è1L0?Œ¨E/Çœ²AÃAn»êˆÁh²A³ ò9ðC8É4ÎX£  ¤ óy8TðŒ9îXQÂËTÃL:Í<Ðà §ƒ¬ÐÃÌ0Ђ‚'K4*`ÀŽ&Ðð‚Óö0AæXÁ Dl+ëô€£ çYÄÓT³Œ½OŸ5D£ÊpD(Å`ÿã·ãÀ鈭• ôb1ÄpÞµ5,M/Í8ãÀ²]Þ2Ž„A:ÍT€ù¶¨þF¸dÛm :§D ƒ )ÔàA hBMÏ,S€Ú&kÎÃÜ^ „9­ŸZÁˆ1~:hìð 1p·!ã4`ÀÍ3Š`c ™œïMÝ€à coz1b XaÔJ 1<€¨ÁrPªÃ1ÔLsŽ:¬ø×÷ÀW®QÌÀ:¬ ”A§hÀ(ÀŠiÄ#¬H€4䡌fcR <~°p`™$¤°>1à@~‘Œ`@çQ1€ߘdÍ8EÿXA e`@Ü0X¸ƒ ¡À!Û$ôÂð¥‹Ib 3€VROЀ4 žI€jwq‹D'€€j𴧪Šq˜ zÀdž=ZºÖ~0H¨Z=ØA hpT¬3*Á r°ƒ:Z¤wqáub@9´ƒíø$;FIÊRšr”¢<%)CùIxL"± kò&KPiÒ58¹Aä@yÀc½œ‡0‡)Ì^Êc˜½„=‚IÌaÆîˆ=BÑ€®–ÜHă(B§'¤1yS˜æœÇ1àP‡vs¢Å)ÐQNsÊ#ò G6Öÿ =4ƒX3¤,¯IKŽl(T¹t€Ú1v€Ã 騧=ŽiȼÆ7Ú! M”S¢ùœ†+èvÔMM鍯C¬nò’õhGÎA|NTšìJ9—Yrâ˜@Ý)5A n3 U©6 Õ']òr·pÃ?'jÏxÌC„À¨9¥Ù aÐã˜V5'=ÈÑÕ0£š¨¦R“z#ƒ"´“óhÇ7œQ ­~¬WÕ©XŸ!Šx„ŸwÍ':°ÐŽR4@ y«Ï@™šX/9u™0ýÐWϹUz¬Cî̧5&᎚~t˜ù\¦<‘ÃZ3©lU¬[‡ÔÍoZcØð7zÙŽ^ÿ¤c²ð‡ÐáŽyl£áø¤Uçñ aX•àhè2êP ¶W¨]læL¤Lb8VŠÆ<¬º(tƒ¤J#„&á z𠧸Ä-ÚR2ü’ϸ„(JaŽ“žv­k½£‰8)‡rF³œ~Åg€Ÿéy´~…¦;ì×­ÚT½Í'RtͶrk<«’" ‡z@öà æ)LaZ{øÃ'q=¨i6QQµáÚˆ~Yû¶g8ÃÆÎȱŽwœc÷ØÇ<Öñ3†ìŒh”¡·Dˆ*P@ÑHå<8וp.*{™€29€I‡hhYÄÊ”~!bXÿ@èj挓d$ã?¸"Š!]TkÎ|lâàš1Œ#Ä¦Ì ¹Vò70i”IDPÕM¦{t<HI2D†QÚDpÀ¦$€ XäŽ2ÈÞ³ä•0@ÐÕ¦¸ã¶4ä9aNOÓ¼™†@( …FXÁF:\á€`Z@+õàÛ'Ž” Ù0 H äê6€dR®P C?7àÀñXÂiTØ®Ùð€r {dÓ ^”iÎÈa0‡Iˆ0ŽhT#ex@)À± kè(€5†AïRpƒÚ“f®¹f—`f=H@5ˆá ]X# 8Â:œ+üàéøÅêÀ@ýlž=¨€t›€”å1ÈòOzk#¡ÈÆ/0÷Î5‰÷Š(A¢9°Hp Ñð ßPp¿ Á}V À·ð8À+fŒ1(Ò'ÀI¥{ÔÐVðÏð € ÇÉp Àßð Îõk1&Ž}V=`V0) @ Íz Jì `n=绥 CPþX ÖPÄ@ `  ZPPí` Ö Õ ` ·Ð Ó €)•‘T’Gÿ@°  ùMP  À|. Ô` ¤,6c6 )À'@†ŠPÁ0 ò  0 ãÀ Òp ²Âiã÷ÅX6)t¤| C ¡ð$  Á  ep-  ¥@¡AKgYì²–à WÁp1 ˜Ö¤!²æI2¨b7Ð7°mQ¼sgeŒÐÊÒ}Ñ/ñ‰a''ù°$TÞV†t¦õñ)2–Kâ˜ð t2yÙ&Å0 jÄl³5øB 0 ÑÐ@ð@4ÀQi4À}AˆwCŠp ÿ‘e 9@ éÀ? V NŸ ³V à YÃVP·ñP;x19²X¸¿`orP ëÀ ÕP ð¨¨,fq èP çð Í`övHPzÐa`¹X… ·à8·Pë ÂÕÀ pz4  E €{dÒŠC€ ·PÓ@ 0 ÕÀƒÜ ×2ØÈÖ  €Š ÏÐ Xà™Ê@  è €Îp6Û°ÖÐ ‡å41 0=zpp âDŠ-"Œ!CƆ ˆ}QBa ßJ(§«‘]Z¬öRæÌ‡4J@¸ @—9ƒ epÀbîÛ¶v&9ØASéÂS/=,…ZBI1V§Ô%kÐC!P°hIŒ¨e]JC(ÃìÌ;žaÛ6¬„­ [vØ @S„ký:lšVí_‹}K4xÀàA‰ƒ1 ÐHãAÈ„-_¾èxᲕ5?Ž!²Ä࿤îèù’±Ã7``ŒÑ#Å‹Ï ÿW4- )ă;vôˆQ;!Ž…Ïl,€ˆÇ7PH]ñcá¸1`x­‚D2ú*ü,ƒó-ÓÆhüc‘70HÀ¡º $O@9XဠC¤³BœÁ l å°F0@D@ɰE È ÿDX‡ €…t@7Àú9VÀ ç(ÃXdr‹Ã €z‚”C A (j°"å6¬ÑŒ8ÀÑ@Š ƒ £ø78€2 Crˆ@ý–!l`såÐÁÿ@‡f é8BÖ´P€Õ908Á d(ϰFn‚PL‚Ø@\°“y`¡À@ 0¶c ŽL „ilÃ]D Ášñh˜ŽÎX8–!Á DƒzЀ ` lLÃr`Á7Ì1 u  ˜†9ò%9íò ˜:tl £É¬:„‘jAÑÿpFVFÃ¥ ”×à:&A LÖ(À" tT#ºÈJ¬‘ެpÑÖ@Ç)( ”tàš8…HƒÐ@¬°ÂôÀŠPàJè@ ¬0‰PŒ?E)ä@&“hB˜²ñ häƒ. i¬<ÊÁ à€N¡Lê@=Ø€ÂÐd?‘C(B¡î z(Cb`£0œB2,ôpH` §(Lô¤h@^`ƒ4`'ŒÀ€>¡ xkPV`@7AcWôÀ nän?9A¹R`¬@éi9¸ÿζÑ$v÷yÔX#@Ðè ° F(ÚBq ®70[ …šŒÌ†Š„ºT°ƒØ„;xÁ6'”¼@bŽ!†zB‘ø5jÑW¼¶ ‡0ÈÁk SY„`ê4ѹÐ×2‚)ìí§xeqL øˆÇÆœ ²=éízælQxÀ“ò°9ˆëÉx8é.$70~0CŒ(?ƒ!˰"„¡P=育»ÊØ%#€‚`€‚¯§yPÉBÐá†tµ¾ ÎFÈ¡ŽP†Ä/†±CðµÅ{ÛÀcó Ð…KÀ 8˜ß8‚èÿÛc&w˜$2ØÍ  Wèr)øp“µ¼x—2;pÀ)¾‘ƒS˜C \zH`¶¼f—p¶%2Pg/ÒÁ5xPcOI‹ Àf>ˤ ¹é   W¤C@}FôR* €# ÄŽû± œ¡ƒÉ&ÚÒyCB3!4 ¿ùô¥Í<ãgÓh¶M¨½+jV«å3iÇ|®Ú²ÚÖú¡ì øô€žÚäÖ¿~HFJ@„f`1'•‘0°E­D@Ö°Ê-keû1åˆa3%»ÚË®€ÄYsÀ€Eßv³­¬‹˜#$1º­ÝÍàÈ$P â-o[c:0/—ÍÿŒˆßÀþJnlà Á l.Q  CéÄ«M 4@«ñ… 6j¤%éyŒ©[!°2À¥öIy&à€ §¼Ãua~p Æi"áë)Áô ‰#tÙæ&B¥«‹Ò•ãÓ°B—MÀa¨C{ÑÈÑ1£$…4|$*Íì§PЂàìxn­¯¢ƒ©”plH#%‰A0ƒ®E@#+oûZ˜c •¼è…3Ú1 ´ág›ã+ÅÚ½x¨Ðx4€À¨‘M&4D8‚„My¿è 'hÀHС@iþù²K j0 ø°=`;éË’s=Qÿ@θÅ2Ø1‰…$ i_à;˜1‰^÷y fÖ+¬o&ÌØ Æ5˜¡•,?_)]B*ÐÙ¼S HÜpã}ÌìF©‹ÝØßao× õü{Ü|)FÀúï1`º·†ÖX2„± i MP^È—îCÀµˆlÓà–K™Às=HMèW0‡ ä1ˆÇal`…s¨Ñ ÁÛØ(€[µ¿°»1‡^H€%š6„1vâ++°+!ì°¥¢€‰‚œåš<$¤‰öÀ€ÅÈ: „B†ÝȲž°Â+TˆýèEs‘¨ Š€(/”‰¸-ÿVЄ0:Ÿð%˜„RP‚òxB5´‹x€[8™kÒ:¨:y° áCéà%0‡I€ È4¤,¨C(¿ÛC>D“…mø…jø ˜+€‹¼­ZDˆØ(yh†SH‡^À;„(øKù»Uœˆh€Ph‡€` š˜¬ý˜"XœKY ^|ÿQ„t l óh #¡€ )€ŒpFˆ¸€•BÓ¸BIƒ_h‡gЄæÛÄUÜ3jЪ" ?<X¡†eh¾oä  Œ ‰[¨“H²óGÞ¤8²Ð苤øßð€ÿ.äÄl䌹Zˆˆ*”©¹…lˆ ² X´…(–1‘Dˆ{H#=¸0‡fyˆo`É„ À£±šD%ЄKuè… ÌIˆèByI¸Àpsx‚;J—`ŒXg˜xɽªLˆ}C±a뻬óJÖ˜ŽPªÕc€S@óºxôGRˆ p¨eˆ@_+ˉ`Ђ EÜK„(»øŽ‹ô€°‚tiÆÁLÇé€{Ù&W[ˆ<ÊLª/‘ ,LƒÛKµØûàs¹´¨#Là¡RÐ-ا/ô€®ôÊý¸¯otЃØ< ǼL”bÿ ¢gð͉¸€‚lÐ7¸†[H¬ât’€^HsØ *èdˆ”qÚ€Í1¸ÌÉXKz€_( ÔN†+@‡gèu†HYO…Ð 7pipÎxü[O#QÅðF†`€óCǽ<ˆû#VlÀÈÁ¤y ñÌÉI¡ Ø'ƒˆP‘Œ%œp8†@½ûdj9H‡_XÌÔÎ Ôu°†k€€ÔºOè@tªp·û2ÑÙQ^at0—àÒè&u Á[؆ µ Õø†a¸nXhÉ,Ñr j€($•Ò€D‘ƒ`Žÿõ“Ò° è@R.OØ8±  |™LÚÔNð((…þt¾õìDa@D\;)­œ‚M;CZF–°P–Ä#è»î@T„h>eDL=¼€o˜„Ø¥»Ï0HE8†v˜M)ý(b‰†aØ9eÉfKˆð«Ó ß@àpF,ÐèL6ŒÆÌHå@±^… ÈN,ô€àÞÃUÒóªe@p Ù[ˆp(pÀÉ/,”8‚QúbpF.Á]PuÈC€”"SWÈ™…ŽF$M˜uÈ3/\а%øUóÀ`s¨gдàX €hˆ†ÿi»Vlå€d2ØbMtØ€°%β°è8‚t ˆ¯™TÝ«âƒùÂPÆh`j¤˜›Ž P™°òSÀE@%à7Å €.h†Ä‹²‹.s"jˆHI=@64—7ÂÔØ ð‚Ð…s€Ÿ³E Xn ‚#øs³Ú „2h†t`t …`€è€f@iº€¹š¬-1sІs(† Ð@E³c1†:+P‚œðÏÍP+Ð-ÈCe½ÂР æà½/ à€~\H°« ¼¶UPÑHŽ 5Ó(€ H <ÊTØ€R0j>ÿsËTa€hÐM 2Uí¼¶#àQ ØÐâÔˆ PÑ28‚…-3•ÒfsœMYØ8Íõ ,u©2KÖ-ËŸ€‚tPh©ÍA)m€e0‡dH‡P€JKÐûœH¼P86…Î[d€à‹9¬ÍŠÃ;Þœ$ ü¿úš<:—F­ÊƒX´¸ÆÖP¸Ž2¨¯ZÙ4AMà†q8ìmŽèsè™ Ø›a„?s †!ûDˆ×Á^z® É…3MH‡fsLV¦­®yLõJ_<²SX^à† €$Ý(K-…׋ÝÀV<2Vnȉÿž(<úeÄÔcZIe †û-Ec‰kÛ®¹Û‚aÉ Heì…'P]à¯`QJû-›xã½]j†è2„¸ÐtXux†B¹ªd‹‚¹·d­ (H[%¨-ÄõG‘Øà)úz ÿð‘耢õ‰²Œ nyuÖ£Œõ0±äcNô€u †¢£`å8g(y¨oÄÁ’Û˶°*t¨šPö @ªfÍWÅ"+ ˜Ž¯”Ò[98¤|¥Êå›rH Cy©ïÌ 8…hˆi`Y€b« è´] 8…fP×.D-†L¦Dˆ6U”RŽõT„ ÿÙh„°Haˆ]å¢^`‡[ 9OØ€À†bØL ؘÛà=åe †¬øéâ|8›V=‚ão”¨†i8‚0xà£LUvp˜AÎÔÐ#8 À½vŒf³€!ù ,5UfÿH ¼‚*\Ȱ¡Ã‡ z (¢Å‹3jÜȱcÆrCŠI²¤É‡ÑNª\YPS;–0YÊ“G/¦Í¯nêôèn§ÏŸ@ƒ J´¨Ñ£H“*]Ê´©Ó§P£JJµªÕ«X³jÝʵ«×¯`ÊK¶¬Ù³hÓž¡Ö⎶o0€K·®Ý»xóêÝË·¯ß¿€;jX¢GàÈ+^̸±ãÇ#Kž`~L€"÷ÈH€ A³ˆå«:BèAɆ&‰ÁÉNz’›ì¤&‡ÁÉc|òš†0†¡ ýèi\a˜¯b)?é¡õØÇ>êA^úÒ—¹Ü%/q¹Ë_3˜Â EíèXIíÉ–ÕÒN d=´CÇp;änz3ò oÜNu8ãÕ˜Ç7» y¤Ã” =4‘†­Å™í’%mò)ÿ<@éø3n w¨Só@h<æA O( e†.˜AbÐc¡òà¦<èA -D#טgíòIR}¶‹)ÑÌÎ4) ‡^ÖcZ(ÇEJÓxЃ“`GBmZm¸!£ *=¦q \ö’ž8*éIñ¹0ù©¥)À- Nšrsê „NJiˆ‚Aª5ŠP˜C¤C3©Z— Kiv¬¥ëà!ޱӄfTXÕêU‹š8@²¥ F).ÑŽ½®£Ù˜)5nñƒ_L¶D`†0˜›J£í¤3\A =£š(ma’›ÜþÄ rh5ž1 ªÎÃÒX^³á i0Ãó¸Æ3žQàÚªCUM‡4œÁ"ÕžŠ¥/s?s–þò²¡1=†iÙõ²½DñˆÁúZù®hJE©|èÓZwÀƒœß´±7oÌãnÚØÆåõq7唞®»g¨0ì”i¦tÆÐÁ”„)‹ñÊVþ"ˆ`F(aËVÎò•ÅØe%¸ µ«²×aH¤‚lÿ5OÁ ” ƒ`@x—ž9PüR €ô+Ï@Â0ˆ5 n€¯–ìdÜàŒ V·n7 æ†Ìu½à<X‡X$p€#WÄA¼cŽr°‚Ò!«¶U‚¸£r{ ޶Ô@Là•ñ€&t!øH É@Gœã¨Aa  N€À @aH6AV¢=y:qˆÒœÐñ:(»Òë  ÛrœJø†¨± ,@€"ò<¸Nt0mÂp C0[¹c ¼ÃîgŸ¢êE6ó`G7ÿQò€k¯\ƒ@°.ÑaØ@ÃrpàÂ„ŠØZàì@TPj å°Z  sp 8Øy,M€1Ö@Øxwt".䀎 H¿C±%舀YiPZ†éÂaІ¨Yf‡¹D—ˆ ’Á¤C8Â9€vX§-"B¸°wIÃøÍ–ÂÁ„ñ nx‚%PB5Ü€U@æ0:&aŽy[¡óh‹AѲ'‘z}NXÕ ¿° DàG'¸mhŽ{²>!™“{Ý×ì(|êSM•@"n÷ß_KG"áižB¬Æä?8Ôirí|‰¦X€ÿ°W¼ O½¯P ¨^Ò˜÷ ò‚ÉÁÄxÂÜ݃d‘Ú8p$8€Z0 Ï ~€’= ó'9À è`*ÔpÍÒ H@- à$%¥€ HéÜ àuó€pb*pê @Á ÍÐ „¦Á ÄÐ& PÔ š@ ì@ ÑPî—22gtp2R5Ð &r ÛÐ pì ® ZÓÀ ¼À }³qØ0 @X  è ¥Æ“=F—v; ÖÃP Ãð…ép Ð!P0M1ÿPmØ=@ð eP™Æza‡4p7ÀÔÐ .º P0z°?®€!Ðð‡’ÈPð A³œÆ%9  ê€/šÀ8°ÄPpáV€¬X0ÀkPƒ ÐÙWP ½0õsæ i¬÷ Ð!?°'°rÓÏp@P}s=° çà Ô_r í CvØÒ€ Å ¿‘=¿@x8€1ep /x¿À ãs;P‡GäÞ1 §ðÂÐ ¿Ð GP º@ _Ó‚¿ÂÆ")€ à:8 ÿ €6kñ#0r÷NÒ8~Š”…ÀG³qno‚F=wt;ð~ˆ¢éBRB-;!Oq$Þ¦E:à‹@Wø‹oBwVóE}Ú¡Ò "K‰ò‹w4Dà7ã·]Ñd§£2²h#’–#Õ‡–Ö’p¡Q™Gs£•0À»µ’vÀ2ÐÐï‚(ÔÖL.ˆ2SDr”:a`‰p? Jpl^Æ(4b> p}Íç| €p€'i¤M¡.Ã9eТ°"ã0  9ÀtËÀ7is¹Ézæ 4T?   Ð × ½ÐJÿèÀ   ÖС@%èàOÄO¨×sPÀ Ïp xZ`P î° Äð ë`‡å0 ¡ð  ³Xݧ|P ÇP À‚8ÿ a (º  šK” çT;&å‚ ñõò8Á° 0 ð€ Ä@z 4— é úä‚Üð ÖàÝ"n$I9Ð Öà Ö` Ó€ ØÐ ŒÕP Pr$5 `hE##K¶3Pw{O °,óE0wLõ{ß…!/eÙ(’VI(K8²0§#¾—=]÷5€•9ÿp“7ðòâ**ÓƒÔBK…ÉO‡‡’B'P- À<^"—s“!ª—{*À=ÜG˜ó‡ž"DÐ0“Ð Ñ =`x50 Zp”²x9 rQ¡  Ð2€•=AH2sÄÆ%ª×fŃºà Â0Ò@‰@ ¥ Gy¨Å@ ð°G à02ÐZ"*²V ð ëÀR– Ò `~#‘P09 s€ð Ñà à8JÊÀ}oâVz³H„ Ö@ € º “€Y±hÀ“™Ô@ ¬ÀÑÿn€Äð å°p¬0¥˃˜²6Ѻ9Kx: vÓ0x  P ¬V˜yX€?0a3 ÔÎp ðÕÐ p Ò0=ÍUi)9"sZðt)° èð;>¢ AºPÛ   ç@ : Ö° ¿p·å°‹—0…)ÓV`D0ºÓ  êУºÙö?PeدeÒ @ éIé2€Lh ò+LG½° ñp ºÐÒÀ Ô ÍP+0 åÐ “ÀŒÒs³ Ö í0 Ö` ÏP ¡Ð  õ ÿ÷+B½ å»rÀ ̶ÓÒ:P à ÿÑ-ŒÒ1p º zð=À ½  ËãDà úw­S Lçuƺø®s(²Ô p8¢“°LÒl)ßB•Yäx!(D?M†)QV$,ZT•2 •§s»F»!Dzr' {†60Ðh=‡|´j}R§|ó×l]1EÕâÂP° ðT†§z×'iÖ§¢  “dO°S½æ°ƒ¦PÇ(qr6Øâ”ÙC QOM%5°<*–ˆp“±gDPpv觨Õ}Ê0+Fÿèh¤ÕØœ£P ç  æ  Š+0*Ë _‡ì|;1+8°~° ¥  l¢ì¬€ àÅ'àžn0mçÆÖrÙÀÉ"¼ªŸ p  —ë¡í=Ò3 ¥À p'%¥¢áJð à $ E8e Z°ºÀ ¬0 ?ð̰ Ï0  ÓÜXSa§{ Ð ð Üà 8Z Ë€Œ¡°‚3Ðøp¡lMõà)Y'š1^\æ@ àQr 077;à%½üˆ`Y ¼`>%@ ÒPO¦Ë SI ÿyZˆq5±™ôÖkŠV.ç±4 /¦Értz{?r„ì+Ð,†¡aWWKÕО•(4MeÉî¦x±˜ .×#%e)•®‚$ *8‚yÁ(â–L¶ÐnæL‘#z„Eœ6MYÄ4p¹-_×-îFtj!k‚걕ÒL |QÓÖw¨q¤ ×±ä”jÑ ÀHG~xÂC莤ª%#‚¯´†¦Ë—Zp}sð|9Çr¤rÍT5­\}- Ê0am0ú”™§ Ï M¦P š;à e -óåsAaÓ ~#Âu‡Å7×ÖQ}u²a…­\òÿY+£Í Ï >g#K§½í lË@ƒR` §Ü.] $°i[ &ø, à7%pªÎÁ™q§U_Ý]_›ºV‘ÍÝlEGÐPë€TíB-8P—kWô¡ Ô Õ°ß@ ¡p51. "'Ñà ¾ "¾âÀLh@Ð a°™¨á3ÍÝ°íØ‰-ä­Í(* Ó *7-×!Pi'€ Iè†J ßÐ^]0Å@p0€ Ò@@ÑP ïã`·P§`‘¡.1a(åÚ4MäMäOvµÝ à jÌ6Œr,•·àÁÿ° ` ºP* Ö´À™yràGe3À_Ð ØÐÖ€¶Ã0 _Û¶F:çNÝà1¦à³4ç³í °p{½à„-¼q9ëá? Ïð è€ rº×p  ŠÝ ¸zÀ„ @ Ó0=ë@ Û ÃHô4N–ËznäwîÔzÕ™——:3 }§pA æ Ð]ÎÀ èÀ‹À¾ " ÆG²yn ÓàºÃ` Ð*p$0 ŒèU—a¹Ìí†zRò‰ê^Ò æ@ æ Œn@®@@ÁPa]H   Á0@ðÉÿó “Pˆ"—.Ç>ì0 pÔ Ñ` šÐà½Åœ©§z/KkÝ<ß.M?¦cPMšÀ ¡0>Mñ î'ÐËV ùKnŠ€Æ£z¡Ð ­ïGš¡À z  à0¥p Š0@¥pîH0$ð™jõŽ|/sGoç‡ äÓ7§Q“X½z À*10:yÁ r,à½É(j‘ŸŸy Qûø9%€¤"B­äß0ಟII‡z؋ݖcªû­‡•¶£k‡!ER0{]7 «E N,Ž“k K•÷¤z XÝ;ÑÖÌÔ0jÿ¡ÆàÒ¤ß|'üàÛá:‡}È,n,ŸÒ*ÀÇ©nV-Ò9.ƒ®ÝËÍL«·OãÒýF}-!@@(”(Q°` 8ÈãDÄP¨†Àol £Æ:PÐqC¡ŒN´P¨£À™*ÞH‘ãEœ´\Gƈ2i.P¢GA DKÜУH€ž08*ÄEŽsl€âåÑ‚;(‡½dÓ¦¥‰7”#(€Z§@à,ÐBŠ=ø~cÀh)i¦aÅÀ•ü›QÁ€- bH79¬Q„‚Þ„çZ¾æunñÍ9"È1]°à€_–Jã šyX‰@¿îï7Yáj†á ®% Ê ‹hTCÛ²þ¨/êÑÉè@Ç7Â`ûÅAÜÃ6tÕ-ÐÿƒÕz¼…pcXÐLpÐfôß(EzÀÖPY1(ÍN €S”k½á€Øá b¨ƒô±a•…üÀ kš†5¸f5ô”@ ÁXÆ2Ôa öuP‰_DÙ\s("?¨D  0G YF: à<)C)B¡„,¨ÎÊ h°=@¡ö«£1R §#ÔSž@D$Dž,}Ûœ¾8ש”(d†•|N©øÅÉŒ²S—KÖɆ"I2…/xð˜E¼§dÄ9Wˆöl·½•H+ Á@p•Œe  ¦G@Ðà€x TViºEƒYõ€ÿ €XŒ*HÊ lÂèÒk†¨‰"Á™%øR’Àç45¸²Þ‡2+(b?ˆY(ЃILâÉ Ž  +P»×‚°ÄLÀÑ(Ãx×'iÜ¢=àÀA>sßä-$¹À@ÉE <8àÀj0]# ÀÀ%ÒQ4‡h€ödÐ,`:ØDn Pi|éfÂaY0€n˜ãº(ÎBn0Õolá`)49…ºp“…‚ÈŠt #­8Â)NaÈ #‚v°hBc‰´PŠ2lePZ¬ L¢ÖÅÿ$"0 sXaØ*J!ëü@V(…6P9¼ùÆ :ˆ7šQ¢D`Í”€P8@Ò1ÂAŒˆ•S Â4¶Qgl@ÓX5¢!‡X!ëèÅ€ƒ[ñxÂ5¸ñh Ôå`F9JfTãÃzÆšQŽsDã ÐR4²Ž',ÌÕ8‡0 uHãåpÌÙƒÓY :€6„ÑÑÅ@¡ßø…3†±ÃM=æ`E¼p´AôY§€0ÌQ°è€©ÕÃD –P£ È6bh ›:£(7Jqs ºàƼ€-(mà@’ÿÑ ÄEëоÁŠXÃ…:Ž…tŒw è°ÌÊ€ÏX7r ™·`„J`6tñ gp0$ãDÇ-ÌqŠsdOzú"Æ~ð¯üš¨À"·k¼˜ `†3r`9æp†3Ö ˜C Ѓ9  €jôâÖ À ÀŒh4àö5~Q€rœ¢98Ç$”Ð08ƒ ðÀ-ª!0T 5(6ŽBö4¸îEv„‡ŒUè`+ôp=DÀ”ÐzÆ ¶ôŠHÎ.fÀäš q5ÜH iÈ¡Š8 âE ƒ (Å6®A®ÿ(€°Ýj¨wj¬·Ò!(˜C pÆ2©]Üâ Ëld/¾Ádõ`(Ð:494,z;8U ÌïsP{ŽöJÀ%6Š^ЋØhF”à+„áÊ€þe yܧ€á$‚¡”ã“à†3 Îo¬'l‘Ê0YuôÀØƈáiilÃGê¸x4œQ® L`2À€šq ]¬£X5š¬4ƒ“°†4ð›fPÃ`OG(¸Ñê~u¡˜F5¸Ó3EP„`À/¬1zjÈ!¤@B3+À jT£P¸A7ÿ jß Ñhõ‚@„elÿC ¨Ã3Ü úõ ؈"…h@a¿Ø 8qPƒ8ÈÆ4*@£‘Œ–`ËÀÆ3”ð#†t%ô«‘9¸Û‰l€ ˆž09˜ÈQ@"Š¿Áq èt˜„ˆ„8]˜¸€`Þê` ÇÀ’û‹h€§€€ Àœ žÑi¤@&€`€(‹è Þ€À¡ l¤Gº|Š’°Šˆ€¨¡8§€9Ƙ˜AˆÐØtiÓSB @¼èkøÀG*'Þ¤Ù1ÞP‘‰(=ŠŽhËù³z*¥é‘ ð TRÃÿ{«p”à ŠÞˆ8¤¡À;¸›£Xž¾Ñâ!Ðİ%‹jÃD±0ßZp*H$ EÉé^ª¤^! Ò)x£ ÄDJ"ý‘hbˆ† µhR$Eç(…k•t´„EXléAˆ8h¿#ÐŒxÅ\ü"Ò8Àè…g ¬#x(Fcü"%ˆêƒ‚jØ=(úøjT"À¡h€aXb˜v8hÀ€ qü ¡01;ax®`( Ð…V²GФ^HzT€¸sØi”Ä‚GP‹ÿ€%ƒOB¨ ƒ ‰T • ž©: Ô1ª5Ë ‘^§3$‹8°É XjD—ü¢¸à€x”˜Fžü ¥¢€‰ †hPÔ‰ìáô> €ˆFHS &×t(ƒ`…oHë’%¦%̈”S Þxè7dtÈÿQül÷T e(iQ ‹ –“ƒ2ðKŠkKWÊ̈€Wf ÐyU[NQµfaP‡P´îöžØ_ˆ†R8Ió®æHÁ°3÷öD!‰¥ïg¡œÍoý>‹ @Æçîne¤€[‡½d)îï Å …_X‡PWÛYŒT´MáW–Э¡C OZœéðÁPp —$)}æýíðÅŠc… €N†^ðø7]@vPIƒ»5ï#àê9,P+€‚—Ì‘é„ð ð °ØÁþÕRìÄd§ˆœ²> MÀ0 ¬$ÿL€7‰H”YUÿV•ÁwÓЃûÝîýÜÙ^àŽT*P=ø…_íWÕuh‡ÙºXIÒj¸Mi¨›cˆ#éë H5wÏW|Š PsàŠì…f>l nâÍ>% €°†gH‘’tS^ቅA‡ƒ²]5jí l†jhЏ-rkkð%äò¬L ²=ÂÉB®ðˆx2=8TûF’lšÙm$J$ÉxXŠ­ê·mšÞ   †t𼼈°Ž#t€.5£é•ö‚¼ZmÇpƒ›oTébø  [=× 6*p˜„á^ö°T!N xh†Mwˆ1ÿf˜†ràŠ8uXˆ#`‡qøf8…]wj<Ø  ¨€f”™SPòî(g8†^íÝRhi(P†ƒ{V8¤~Ub€xؾy ob(€0§qþìM~ KŒ@‰ˆY‰þøøíKL†ˆP p2•8eÄ«hŸ–ÈQfû‚¸€2°LÛn‰¸êü6³kx†Š†ø¹g{ u€è…m (Þ{÷~KtxyV0V„๿c?‡Sˆ¹{7‹ÃO|^ЋÄüµÝnPø†@Û¿=ýøÐn(i ¬êØoÿ킺‚\Œý À»\îõ_½ŠÏW‰xí¹.Ù´Í€r“å€!¨wÙÑ)] ›þÆ£è™2à…a°‚¨t&\)ù†gà0–‚“ˆyPPæùálð2X+]wÔ1JÀ€A‚Ä·PhÈàð!Ĉ'R¬hñ"ÆŒ#âpPÊœ%Á°M¸ñPF‰~˜+õ †À2gÒ¬i⎬¸ ûÖë2b $H¢‡9… KÜlêôiÍÍA92Âz¸AâHË—%b@-köìÃ䨃ÀZ3¬2Ê@IyƒB„r“Рö/`Š$þˆðl›³ÿtr(”p!€Y49sgM׎ sî‘E‡z”Èñk™œ :N¤& Bššcö«ÆfϺã€ÑA“)XD¦°ƒ  êˆ0 À2†î®n6´ÐˆôÀ¡ùáŽì8zü蚬õô7™:$Kv3ÓòÝŸ¬¯þ~YôiM¸ƒh}òmE„CìáwàF¿`à@wƒŽ:Zpàf5l 6‡ ‡Mò' J/êÈAV5DÛ.èÆnr0º1F ¦oà€JµªÕ«X³j ³DŒ­ ]‚EøtlÁ#Ëš]˶b…¶pãÊK·®Ý»xóêÝË·¯ß¿€ L¸°áÈ+^̸±ãÇ#KžL¹²å˘3kÞ̹³çÏ C‹Mº´éÓ¨S«^ͺµë×°cËžM;¢Kjq#Ìm ´j@!ù ,*…\ÿH° ÁƒüHaJœH±¢Å‹3|èOŸ† 5ŠI²¤I„ƒNª\ÉÒ$•.\PØ¥¥Í›8– ÃC )væJt% 9^8QC 1xJub ;n(auÄ‹?š¦Ø4E  UÓQBG„OÔ…ÙpãA)X8¨‚†/Ô fy¶i šŠ±ÚVf‡RËNuÀPJˆ šJi 1¸óHeð¤ )³jí¬88†ŽØ·_šYÛ‹ƒžskÌq"‡Óž¸´ ’urL*G"Œ9"mÌ)éC·õ‰;8X±fކւ9ÿðbJ™vÖ¬q㥷SºªEÀq½¾DeäXIÑ`3r¤êL²ƒ@ìÐ@0ÒP£ ?Ø'aA ܰA ôA(å¸òÌÇ8``‡&&ðÆ KX@‡@@ D`¥PÇ2–ÂÄÀuZ˜5–ñ€|.tŸë‰N!€j()ª2àâô,p(?hÀ/ÀQŸPñ:x@4€ôŒè€r£$W 0Ìt8ƒ­´ o@Í+°B:J1ÿPêÐÄ4ðŒeÀ]BIgOJà€”ƒÀA (@œÀuz%vP"˜c  ΃Ž}#šØÆ5º?F,™%èr £2è"¦ƒ,À æøÁ X a l”$ŠƒaLCèH+"0®Äñ) èÅ6œÁr@¡(÷ÊÏópÇ9¤ u´¹Ð¯ž‡:jz8#n†´†%]Ív”BÓ Œr”=­«PC˜Ñõ`“ ]á7Z†35B‡ÙÍŒæ05¯½,^g;Áúú´˜’8 tPCÕðÂ8*ÌŽ[ ãËíàFÊáak¸!ìP¡éÁ^L{ÚX1AP`{„Š´·¯uåI€#¥ÿÅ4ÀÌ/€#ž$!lL^Èá—¸…‡']CÓãž+¾kmÛ{źZœR 7ÚЄ.4<žŽlyLýé‘Vu›-œé‚\Ê-Æ÷1»- è¡ñN»Úév´§½íjw{Ü=.'ÑTçÎù‚Gþ'í4ãï[c3?xÁ>ð€7¼âøÁ—!XécÞ¥¢'åòýOQIÓÀùàm¸}Ðù·‘žó ½èYËù·q@Xl Â0¡[ŸÓÂ0 êÔoëAnŠ­)!+“`Æ3~ñ†øTÄ3Ž¡PDò™DòlÌ[‹9Æÿ4ÊyÞˆÍ81Êœ³‚ÐB: °…¹`Ú€ÿ¸£ðA¯tDÅâàG}„& `  1A ´?#J0á …S$7eLG4e¢ò"šR}’/ó§0QU2Àá¡D ÛÀ ó#º~°` üwNl¡wØ£~ˆ±%¡%COa‚J¸„Q'à  À ßçB„äbyZHÜqGr 9Pë0:.³=+4B‚Ò†±ß …(' )„Pµ%æÿ0`¯çJ¤…1°ÑÔ!G`+¢š Dp0 ,¸,·R‰Øó9.³GöÒ<‘@ 7‚ À‚?A€mh{pÒb8y1°G70|;1Œp‚¦:‚Haã[cÇô¡*O!ôá„2y{·Œú’"‰uœQ+5 ;!ËÂ%ðV u#<9"q3y4ÀHåP·pOÁêSPEôzP è ½Ð=ÐM\Ã;X/Ó&¢äG¬ DðzPrP;DG P “À Âð2 ¥Á r •8?óˆ<ÁG7À ÎÿðPðåÐ ÙPp å€ × `‹ÖpSÉ ì ”F(&7(î÷05=Ö@ Ñ  áÁG°ÍG°GºpkA„ ÃÀeˆn ,•Cú²C7Ð;ÀÕ  ½  × å PÐ8À?Д Jð Ú—& /‘¨é `#“¢  Ñ€¡ðP0z@ ç¥å  ”ù ràU´:Š ó—p Ö> ëFè @PpŠ0Ÿ“åà X ’ rð Î`?;ðØÿ劕à ÕP82cp°9pÛd “@'p”ö>A$ÔÀ Ô  p ß`æ@ P0Q§€ Ü Á’™ÅBƒRh81 ›ÅTR0†ƒ2PI˜w@vØ Ú/¢“:7@g¸2,n"‹•PM‘&; Ez’6|2y/ y²:p"(0õ".r*°‡£/×’£JZ;[R8ÕФ*äø› @©HJRÑ'Ù<¡(Šð9Oq&î¢ÃXä0á˜wlq:ª¸<àp4&Ó'À‚ó@éPPðcÑðJ*>tØsÿÁ>2™‡q Ò ßPN% iÒ §ÀÀ ºàŸÓŠº„Å@Ã`¥p h9 í ÛP Ö  @ Úàð )Qz×’µC hÙ1a0Ôðr Jì  @3? ç`r€G Áªor÷ÈXÄP `^èa Ø J°Õp QÚ¶„'À„°nÀžD°.5ÀÑà Ê¡P )zP$ð4 h… §ÐöSªËƒ Ó08P+€& ß@ n¥ R“„ ­ëP+¾vZØ  0?A5ê¨t¿ÿ  šp@ŠÐ ¬ ð?8k¤d±‰3‹a7N‘g´8 à72°% °¶r¨|b´r#J "/°Syÿ‚BÒ´q2>j²K;±;´¶x®ƒ>bä@›l"M%ÐD$B4@*hˆ!{x÷7!t`R¤&ÚJI¢42"0}[@)Ä#{IS@.ꢕCÑ û¿`Ü@§°¶™ š0,(}ñzÙ@ Ò@±,ð,0(ä’•ó … X  é°J æp úá=ÄBº' P0À@`dÿ"Zðû§6la ¾’CÃð…ø¹ú @&kbL  é@ èð !ó…$€­Šàa€~ ·£V…ø·pë <¡•§´”o\™" PÓ`*å` ·PÒp ¹J ÊòC‰ñ§)nÀ Öð)` ¡ú8@6Y  ç    !ü ép ¬q“¬À éZíh5 H«P °­6€ ¬ù8 à ª±­PPâÎÐ ¡  ¥  Ü@†JP¾j31à€p X@º·  Òð/Á¡Ït^ÿâ7@"7 Ô0¡`š *Y À îð Iò7³óƒä`S P : z@¢Ôð üD{3.ô¤Õ )L P Ø rÀ cžàdx3‰`HŠ9PÛŒH.J.R+ÓØpðº%700tñ74(Æäœ±,ôá}ÆÄT¿»\J³77PZSª—SEIs¢ÀS+íÊŒaÈ”Çð¤òÔ´@MXz€ Ð%| €¡S»D$ê Ò`*%Ü  ¸z Ô°.ð5óT}ó ¶b¯4,noæªN^ ”ž™1¾ó2Pàé`î‘© à–Tõźà~ôt Ó nÀBÄ" ÑPI°}“§ p k]óœOí}žóüS¨H‰¨8ˆIT<` Å—má07ÒÎq p]µ ìÀ§pÅÀ °— ÁÐ VóC<ʰõΰ “p š0KH° ·ð =’„h¿óß&háo¯w¯ÿDϼžGÄðí@å !eÐ ì  Ýþ^ðá° À°ø^€."D`@Û qdÝ´šÊ•j£KN Ëä=sp£„Œ‰)^¬£„FŒ-~ôHQÈ9fÜ(@¥€4UÃf­Ô¼˜óaÇ…c߸} ¶Ä ÍX=èA5n¡"ìˆqãF äL“&`X ¥ªY{&§Ã=è.YÈq†D‰!'Ê‘ãÄE1Njl R@ǽ$Ý^\X@ 4˜P·D‰Nœˆ1á0 a°€A† sÈKÑîPˆJ!‚ƒ8“XÀ!E 0ÿ«ø[‡ÆÁ)GŠN¹°ð‰{û÷[\p`†zÐPµÇT•4jèÐqF‰í:ìŽ,QC|o“ƒs`ßQ±vÁ;pÈX»¶DÛãʼnËðPbùG•€ûÛ7n¸ú˜Óo9Áš,Áè ¡.í ¬®•6cˆ¸ 3 °„÷ü ÀÍú[I¿knû31Åß–ÃጇN¼O¹ ÷za‚T8a%+á±¹ ,O¤l ‚Áì¼”üà ”pÁÍH@¥ ì(µæbh ¼Q‡À®¶¨°Óa»Àv`¡šYiÛzÌA?ьӃ{ØA†˜¤ÿÇF_ÀD•šdS%.Ó¡—i¨9eƒÀd ƒ¤©F¥f€ð Êh›S(Xó††q†…KWŠ!Pà‚Îr "Hr¥J 1]&ér³%V¥5VO @Ð`¥ †ÕP°šˆ@Xý8ÀŠh‚€”†Rèá]JáÆfœ‚I¢Q‡¦£@vÐù¥fX°Ls¦a•Ø5…,âi€‚È*á’W×àæ Jp#h¨r !f¬éÁ7‰wæ¹ç…Ýõ¹?nØas~i€eye8¡JIG‡Ú‚Ûÿ‡ ¦ø‚i&r€P8h±Ç&»áC{P€™k@Ð0¼¹ËÁhœa@ÿìð‹j.˜dt.»pÃÅ®à‚1G  …áΠ$ÔQ$‚5­µÔ®°6ìu‚™f_(=z¬i¶ ¦.È“ Ì9†ôz¨v–䨆u¢)Ã¥î7¾þÕKøA“RN9E ÃU£¡„Ål¦eè”pŠP”¢„Šô@ûUðp )Aµ@,$ÄÿlCW¬¾T&x 9 ˆº,¸BŸ1dF„r”Jb˜ éxgJZ¡dI±Ð‡es€>ÀÂÆ„ô³Ô|Jøç‡OìC8´ƒ @ HZÐD•À•ä=ЃãnE2Jl‹ÜÇ6ÂÀº¬ Æ:®± MP€_–šzARD Je¤ÄvðDìŽÆ¡+°% EçE«ªF9Žâ¨1Ò’C¨ñgÜ‚TaÛJzài袺pU.¹ÊQ.¬1Øñ‹•ñF5hÀ)¦±n°¢ae0V‘poßà "(üà§ÐA9tA Óš*ÿ ¨À½^|£€:˜”Ìáv¤#s7¨ä5…)ƒ#,ã·XG1ðBFçJ€ÒÑ PN>SÀKЃfXãÁÀ€¢p •À1·£À ¡ç2 ‚ÄbH°€ð&øe_h ƒÖ Égkg`äâžIŠ!$ˆ• Ê&ƒ¬å&¢ý6§Â…Iª‘‚qT …#ÔÎ5**cëà NÐ'ßÌÇDyÁF cÒ=oB½ *¢‘Æ6\Ñvž“ŒH2Âý ©±Rˆ§ “"w&d› `>+i@pPœdYtAƒêHhiU*œÉ`@g$ ¥L‚7Já¢Ó‘øÆ/ ‡s8´;kÀ%Öqâ^áz0Ç-° „ c¡Ì.C:Êgd…éÅ)Êa ÃJ˜Æ3p‹rÀ€ãèÅ›Ÿ1 (`¡+Æ)Ö1‰l™CÑØF¬ÀŽeX¬¨Js‚©” Ò؆2« @0q1Xf)<[ŒÖ¬‚v‹<ø@¡'üI0€h2`5zÑ 4`Âh@9BÿkH ¬þÅÎ ¢?¸À8.!‡r¤'À " tÔàú@9n€# CJH‡àŒe,@XT@ªkƒ™Èš:pycÃ0‡œ …AtÜâ™çÈ\ƒvŒüÀ7h&74 tÖèÅú­ j(â;`6Ð! jL#FÓDÜp($à,oÆ~Ðf8£G¨€"ÌA\j£åpí Ð1 % C p3À^€£ŒzI lD OÐ+ˆ€¹„!PîP“$s°bV8GRLÞ€q:Ø€r̓ %˜+ôÜ(\ÿãÍ(S3²Ò"dÕÌ€0¸áÐ2 Cr¨À(•1 ïæèÁ¨ñ‹Tã€>ÏaR3#ibà `A]®FfAPŠ:¶dÄ@/‚žˆ¢#%ib‡ x:±i†|‰†#x˜c(‡i Ð…h`‡oh1è€ ˆzƒ„"؆“ø†q ƒ2‡ˆÀ P„r¨†`XÛÀ†a(½³†t†ð<,(€h¾ `À€0(løc£ ˜WkºÐW+1xi€œ' À‚oÀs裿êÚ E+˜°¸ÿE8ГƒS`–Pà4€EØ`CM…2P”o(E( Ø lè…•™ƒRÐ 89(( (9ˆE‘ƒè+`5GáˆF M˜„#x ð€2À× +(…0@ð€0ðÃÁ¨%- D“˜‹8 ͨˆ“™0 ˜¬`q@!Ñ °¼bsЄ ļˉ(¨€ Â&™ hÂh?‰à˜ Ø€Ê% "H5¡X9"ÄRi)²®*D ÄïH+ú9Â?Ë­° ‘èˆúil”€MðWt£ ¤H,±”HÿH \áý8˜!š’ I©Ð¬JÔÑÃ-ÑG†9IxºŠ¨ €€¸†±*”ô™¢)¥[t”¢¾À Ђ ª ÎÐɤ„\»PÅ(‡uøÚð+¥DI(˜°Z ûlÀ†#€©±Ê:‚ü€,»¨7¨U#‚ˆªËkrœß“†þ1°½9ª¸T§Íh’Abn V@‡0€pGóË@Ú!šˆ#èªÐt¸spj ˆqŠZ‰RiL(jK±C-É­"(Sø<ø­hÍUÂØ¢PHš )ñR¢¹€5 ×ü¡ÍÈ’ÿ½‚ @¬jÒP€Bëß¼$ qªŸ ŒÀ¹°,Öcβy*…ù)òIÑ-µø¸Î ‚ZG"Žå\B’˜ªñŒ"è‘Ká€#nX˜P‚gàa  2”ÏÕÙ¢ì|J¹…¹R uà…ÐúÙ¢½:àR‚r8‘˜uІÊ{É…ž©°‹Ý¢Ñ8FÓ]8s ­Ÿ›4 ÀP‡åÀ4VÀWpѹ°N5œÍ9À“öˆ9H¹Yó&jK' …žx‚µÑ0‡^(kh èøQ'-›mi ‚8•È’sàÿmè‚å|2õÒ"ÐX j¢ˆ=MøOšÈ8]!‰Ú6¸( åèR?›H˜ò€hICè8™Œ³Ü‹"G]xPV€R¸‘þð%˜„RpÀœÔÔ Ž\A‚tp¢ŠâÀ ÈsïJVž±‹Š“Î ‚wZ†v˜ ¨=’§dÝÖåàÆšè ¸€ ²Ú › 1ÔœQ}׆ñtZÔùðŒè>»ƒüÜï¹€rH;¨ œ€UVÿPuU²ˆ†^hvÈœèX€Ìø‚``gЄœÙ Šmj8ÁP€€Ðg i˜„À8gÐçx€R°†i¨†e7–mB‘¨ø’HX)r ª(HsQU¤Íý¸”³‚!ÑUaprW­ÐÞ*ÑÀ#š2Û Y“p€O"‘Ű/Ã訷%ü`¶½Dd#¾,T½m˜ï€£i¸„}ÃUUÑõPkGÇ=œÕƒtЄaàÑ®²\ÃÁл&c…sØJ)ÜÏ]**u€¸…pÝ`LÕÝ™ às†Øó{ÿÛ-›ìc¸o°(Ð _ÞÑ €=(Ä%I^=‘Ð*À€MŒÈèµÑ‘H©Þ ‘͘CÓ^=+%qXŽíÎ2¬ñu˜º¸9Xט¹ÀÐ*Lt¬,ÛÏÍ€€WP‡¯pså(†t˜víSíÍn3=è.í‹%ÄlÍZÕ}L|k†À ‹Òˆ‰0v_7r€R˜‡e…t % ¶ÞˆC Þ_Ã%ŸP`‡€®4Ø­è×RH±6ÜÀQu ‚ÉÕœA¢yGˆ-€½²¥î'ãu¸͹t(†,ùµah‡ÿh(…•]àäÕš>O*O•€€a)jˆ†i(†œab³5I€p8“¨Ú5© §-F2Ž^ 츘ÍÐ*‹ª­ ”ª&³5‘Q‘˜Šxda‹ò€§ƒ´€¬>NVOŒÂŠÍÑ™ª'€UÝèU•€]pÐOt  “Fqià¢ä]VÛÀHPE BP‡^Y‹ M {s"ËíVÎX‹\Ás x‘‰P!lP’M¶\ÈZ ÅyiÈb“Ðb9‡…r6±FVÝsž!¨;‚~Š „{^ ¹°¢ÏEø|KÈùhÿÃ$H‰Éy¿6 n ¥båVž‹„I·µxk(™¹€aˆJ‰a9 þÜ_ÀŠò°Ø€0P=xŠ?ZT'€‚7}ŸþÜ…~g(8ÿ0g< ÁÊ!äÖÚÅp¨UNßåäŽ7uè~Ñ «5¹•R'D†¸tÜáDÊ$Ê ¨š1kp€À™þÜÕ÷° žÄ`…_P=Cà ˆÍ`îI]Š}I ëy†Á#–ð´Ž ±VëÀ ä5ÛP Œ‚i‡>kyiHQuÍHÁ³v\Ãr+~Å:E°•±È‘ªoñ[Òøü\¶‘—ÿŒ€€+‡mð;¥5‡•0Ýň^¸ˆ¼ù°Štƒ.{™Ñ&ù‹Q‰rØbàœÒ »S{†o𣀂I9Ñ•xmµ\ájwi€sX—i~ŽQ‰€Šf‡aX×PÛ8ìU=m ” ƒfx†Sð•¸e ˆ`—P¸IkÛ%Ø$ äjY‰^¿€ ßô ’é!³2ŽìY÷­94‰’ìJàmcG‰MiiÔ¹Å]jrß>e²oЊÇA¢Íð›q`† ŠßV*ƒuUP™7°tèdÛ…€oÿà<‰ˆ•P¶èJîqäÀHÁQk-s&*·]Eq€²8…h`…¼Üç9g €Ö}]]à† Cg˜8oHøŸ+Hg˜œpˆ@ÇÑUM‡˜š€@-Š’êè]¿ªcrvõ q¡Ú}õåø’¹mãY×H+¸…^°ÖÆu‡$a0‡>Ö_ßµÐq(ëNuÛ Jýð×…6ö 9‚ƒp€ª›v ’$†O.7ö 7º€oÐ=³ˆi+d†Ìt…©hvÛ€ˆ€Pˆm †>ÉöïEØ(€y÷ä H>÷ÒÅeÏ%”^½†k ¹qÿ½=@€‰] 0‘@æx%’öm¦Ø‹`­t0‡Te €[ O)Õê x†o(‡(7sW×ÔÞ¤Š`bø¼&RŽš¸òRp-—TiÁ(†IÐuñEŠ…Ó‘ÀtPßiä‰. 5x°æP¢À€ˆ†hH€ôø÷ëô§‘ ®+=Á:«PM‡ j°XyŽè8“™ˆXŒ€€ŽêÅ`ˆ½h˜†aXj fÕú »˜,}0YßVdÖËÇT„FÆ €ü¨ x‚cÐgˆ†¤9îé ip€PøsaY†ø¨ÿm‡ù "ÀªÓ6 žº¾§cÑo†mP$8È`n–e1y£fH‡u@‡a¨JùÙ¢at8‡ —¨Q-`sÐt(† @'œ÷Óû- A°q¬„ÜL%èj¢ ë%dÐø¡D”#%Æàð!Ĉ'R¬hñ"ÆŒ04äèˆ ÊɱD‰ $nÈ@#Å 2d¼1’C‡-3òìéóçÏŽ36Ô¡Ã#  oÈÔ±ƒ%ШR§¥ZAÀ ‡ c”Pq¢€ 7¸Â8!”*Ú´j}º‰¸“D‡SÊôDÀQvãÚ¼z÷^¤á³t“"¨({–/âÿÄT•‚P’NgÒ0Å«ø2æŸ7"èIWF‰+s1VÍlúôD™Ó•.ôŽ…¨gÓv¸YºÏ®ÆµÜYûwæGÒ)Š<­ÁL3GÌà‡bæ˜=¦cãáæÚÑâ(ÑáV³Iz\·¼ý<Õ%„}‰þýZ;zœÈ ÿ~j8´Ú– ‘+ eµ”~çÉPÂ~Âa [9Cè à 4øUà}-Õ&ßÃL'˜½ ÃŽx=ø†á{7p@„9ÁX¡Î-uÒ hrK:¡DPÃ…,¢G¡š¤ÓËLã@r:• C”SÊ5”@ ÀíÐ+ß°Ò /ÛÜ`àŸ@0˜ c($•å{84pÊ7§ó 7lÔR +‘#•5(Åæy;™IJÁ 7ŒY *p@ƒ9¡4@ƒl€jÁ :Äè ìð‚3ؘÃn¤£Ë±­h)shN9̼p . Œ?(  :ê¤ Ä€%«§Å )a§ˆx Ÿ@;qÃ?[ìlÇ–4ÖVÏ+P%€P)¶Ú uصåj÷R骻 ;ˆ€î»÷•SçÆ°\½èÅÀÂQ5”Ö/~)ÐPCLaG0|ôþ!ù ,*…[ÿH° ÁƒþQ˜°¡Ã‡#JœH±áŸ>/.¬È±£Ç  8r¤ÀAPªL²¥Ë—¹P(“ËÀ.pêÌ ³§Ï—bàØá¡„‡)dPÊtéϧP'ÊØÁ¡4À¸£ ¯`¿ÊPµ¬Ù‚80X¦«Æ 7¶Ž!ƒ®]²góF½±Š9iÜ¢Q€q"lj¸ˆ·*Æ«·qKok08¶ ur4¸¥‘‚³çΠ‹þƒàŽÔšù±M—2JÄž-»vÖѸ;æXX6aÕ‚1Ðq‚°ñâÈ ç^±Drô@Í Š’Ö¸Ö¦M›¹÷‡$””ÿÙÁ‚Á2k Ð3¡Fç1àËã»ýƒ%"ür÷#,é8s 5Èð um§à} ÓÓCP 3ÂüÐA ''w²5(¢ $‚)°€A&vVXmq'âˆ;ô£R;hE}ð 4ÛŒ@ú˜U}ž @}A&yÐ ½v’JF9²ÅÐ×5Zt Ã ÄàeA%HÉÜ ±À¤ü`…9epà¦p0Õ@1쥘¢Á0•R!M9ÒœƒEr`6rÐÌ2,°h9â) Á óÍ Ä´…ßsÀ0ÔÀÊ7aÎ$Ü)©Y%tÿ D/ÄRBÖ€ç@F;°’Ì:Jl`Žš€Ó¡«¯–ÅÍD£  T#ŒZ”cEì,£Ì1¬üÀÀ3Ä0³L:4Û˜l ,ðÀ“U€.î@¡C7¼,…:4 ‰9èèAAºêæE :ô B $5†!!Øpà 1”pÃ7ÜDÀUÁzåPšq¹ …1Ü€A HÁA˜%lEÈÃÆ0¤\C B\xàf _’‰ÍŽÕGC oý 2 0x ÔŽGj…´^(dL— )8PÀ¦Å9xB}Ì^Ý“ÒíPÊ1§tW Y•†¶Õj7FXÿ°N8—Ž·w4Ä0]/ÖxâAi• ƒÍ¥Ž396,^ùr1Ðà€ä ¾9n7Ð@/Ô°Á £ç¶¡Â|Ó­À­ãßn³Œ0V{^Þ*@ôNæï¢)e£SÈÆ::†è{óP•° JåaãÔÿĊ߀J«õMß}O;PPÊ)H#Ðñç—UZ4†:}›Oÿàhâ·Ù_Yt°€S¤Ã  š£¢Lr€@v¶À¨(BºPt ‚»U°' h;°an´‰.UûàKbó á:@Q<¨Â–À 1»ÁÁ¤VÃöà‡Š9 ÿÂĽFDbä“B#‚DÃ0šÑ‹ÄHzNôÈ"ÀŠi,ãÔS³è€ (ƒ§ GÆÄVpE4¤Å6v¤[œ„5Ò ÙÑ#Ûñ@ÊÚéï`*ˆ—J€(A¡xëºÇ”4À ¤ ò½DC %pÀ0@éf\ãæ°Î&y>.Y- xä@. €cü⥨€‚Q ü€‘¡Ü@«[èàgÆãè˜"TÊg;hf0Àº~ @ †—€ .4ˆ€`Æl2àcñÐ!7›ìà;¸ÁvâY›Á3š;xgnÖÿÎ-mM?¼bÌ"Ž6ŒÁXDÈI>±: ÆBƒÉ (¸Á†à³CJBôPÂN@›øÀ€‘@ BP¬G+X¯Â v0–Xé¿ä¨A'ƒT@Ûø†9†CÚÀ@hÆ:Ôp åÇ7XÅ•­…=ÐÜA è@Ý©ÚÚÉ+( š`‡ÀèR@ºH‡:‚R\ÂÎ0ÇTÀ‚ÂtjpÆ:”!Á¿*³u³á@à…t(Âc2 ÁBwP€2 Ã ÔŒ@#5‘Ž›-­$€ p‹f˜v7õfƒÿXcˈ•2 –pb4@žíé, … ° º(Ç2'ÏH‡$¬†:Ø¡ DS¬yë)4q 7Ü‚¡ˆ@  PÇÆE §X‡&0[¬#Zpƒr >j§f•ƒ5¨¡ÒùˆyËÄ£Nn|ãPYN¼€@àèH‡9ˆ¡€i¨#ÁPÈz¡Ž€À€¢†q_úœ/6T’ÁÔƒ„é@n?èNû“æ_¾sÿÍ5ŠUÂÞ ÄwÊS)åÃñèJ€ƒr²èšƦ  @hB ›…fÑ MhÈJæ[ç«n 0ã˜VÆ2–a.pzøÖ16m.LÚÓµ§M} f9*_—²‚HzD2˜€êQ}ì£ôà5°‡l_óºØ¿&6±‘ìPÜ×nz¦õðò#Iá@×íx†0˜±ŽyÄCà÷·Áq e¸Üéh†0¦!x¸ûÝßN1„ñ‹iÐCÐC÷Ýi¿ªsPÑ M´cò˜‡ÂÁ=c„ ìP83zñŒI ƒá7=¨Q†ô^ãÞù摌@D–Y‹iºÿ¦G°é¡sÐCá07=Ø1‰ˆË¼ÝpC<`¾ðëBå*w¶¾I.½E[Lt!=ÚÑ]ÀÃÛúÎkóyÀƒÒÂÎõyXC¡ÐÄ7êï¹Å‡è#?º”p tvãÄ€z¸·>uèÁæñ˜9!Æñ­3œéhÇ1ê0¡ó»èý¾5H$zä]š¨†ãcÞîy¤ƒß¹;.!Éï|á Wx<ŽRtùC •v5'&¶ëá/×D40r¼Ý3¿Äçãq‹hêì(×wNrt¡¦&Ú÷#µ+ rš †(„ŠP|ëØ@6úNpéBò¼Pÿ-Í=zD#2oÆ)~á†cݰAüá«íü ¹Þ«ÆÓ5OÌÏcÏ@ ÑóÓ Ñ0 ðpêP ¡·Ô àP~šÐC76ËGrÍÂx*÷{<§r0·r¿×X~/§pÁlòrfç#óçMam„íPƒíà8hƒîpƒ6Xƒ;؃8øƒ7˜ƒ68˜.Ì$#ñqgNa3r9pìukV…k=ðN«OC±…V¸G€0Gpsv 7b`ÍGNh•‚Hà38T‡%B£H+0%ZЙCWàP @WðJ†#)ƒBÿaEUƒN¬$)×%ß ½´ˆ)ä ÀKÑ3æ â³Ñ$Oè„ð AîU!ÃG3¿ ÊV_¢x÷!8²äe \†N²±P¸X9—øU!Ãzô‡H)p_IhrÎúvvîUŒvÄKÃtÂ\tÃzÕØD å¯Xf8Ž1 !'\!#ìØ™ä3¸Móc±#ÃLk˜E7 /†ÓÛÄcaG™D¡¥!Y’… ‰eØd«˜Qmt ϰ Op=u2=SxôC2ÀaP Òp  YDp PP“ØC@HÄÿ@ ×0FR"  P2À À$R ÕÐ\ˆ@\ 7N/Ì:DàXPާð Ï@Ä Ê%PÔ0 @¡` ìP ÒPYA)…'pÓp zÛÐ p#T ¿ @ ØÀ Ç ÃØÀe$`¬€§ðцŽó:O9b Ä` à €¥7à§`°M€™ ðPß(D´@^€.pp=PÔàjºÐPPz@=f øó¡€ÜPš0œè`³ ëe’ýÖCT!”0Î`   í ¸¬€ þB1„yjªFÐ" º°¸" °&¾ÒÍ  ÑÀTP“P Ü€‡àØŒ=t¿P+P-Ãe`P  Æ ¬ =°æB. ðKòèD)ðð²ÕÁÀ '0 ò •Ö° J  ¥°@ê Ò5PFWCÔ¥pQrçá Ô``j ½0 ÓBÁŒNÿäh°4t Sš™c¨00àÙXk5¦±†D1CkÁô1§(YòOg—zÚÈSñôU\¬c}(±4'ESiS°3Z„¶vAàhd¨Â:„¡î5 ”E  Ï0 ÄðKu¢ eÊg=U4ðu¥ àI,0HÒ_²@  Íð Ý@ «9ÖP   ád9Ù"Å"À$ ^q¤•»?5P ¡°B ë° êî!Yuñ,Ñà Ñð °’€-ZIͽŸ Ç€ ÂàH0 ß@—1\°24ÿÐÖ0 §ÀÑP„Âp àP·0§€VT“È“Ñ Ò «ÙÖÀ ¶&e ReÀTзà Ù C©aºÓÒÀ °<µ&c£—ÅEq p[Ze  —‘†(Ú+@ ü ê@ Õ€ ºÂåà„Pk*)]R^`GàÑš  êànBà 5X‘…iaé 0 ÖÀ0Œ$³Õ`$Ô“šñ° Ñ8 Ü«ÍÐ3 æPq µ0ÅvÇp ÄÀÓÀJ˜£ àºPÁ°IÍÓ}V€¥À kÿ0 ½À;¦0É¥ r wx¥  Š ¸%@¥@»µã%1P"ÃC6óêTR> `'8ð®ŒÅÀC¯A°¡EC­Ó8#Ù­ˆGñd‹`&Gt V4Å:B¤PÓCt1'Ur¯¸0µšã'…·t¢Ìam*– ”l…gBXM|–2ühBƒôüAº<ºðKóhðU‚Ê&±Œ °:°¨Á[TˆÔx>Â5F«³E©¢ rð mÒš`Pa ¼¬aðPWtµ­s½;PðDeõ Û«XЧp×`¡ÿŸôÞ¸ à±f{1xc$ÝP ÁäL Óñ òr žÒø §À àŽ'`èPpgH+"[ýŠõG½Ù  Pзþ˹ò­7îð ÍàdP@ß`±Üp=Ì7#ô—„J°Á azJÀ Á  % Ô +ü¥ëp ¥P rð À Ñ2  i× ]M§PУÑáÀ; ËÐ ßPÄ V@©¡p ©‹è® òÓÍç; €Â:¯t `d# 0 Ë§/À6£,SÅ` Ì ¯ÿ¤C ·0D% Ñ)ÕºÙeôÕe¡Ë¬&zÒ3;*FJ¡ËF"%yÊ ;¤>Ó`4ñá °4éHt!ÜŽa'“TÝÇ£<ù¤\HRIû¼7ÐRª';YQûÔ‡þXkAi=‘¦$£ªñmvZ#íUIaÒá1€HYS#Ðè;Ó&Ž1úó±±Õ¾MÎ4”Ôm8à,¼`[N°1@ 9îÎSþGƒgÁoôüÓÔfkª‡†76Ò>^æ‹Câ!dQ ¼fµÑg·0 Òà˜ƒPP ´¡P%à§GSÈp }ÿ4PN<ã=Þ0ƒ†0seƒ 2/Hžz¶Vz° ˜{YÔ¤ŽPT ý‡Y`EÌ0½ PgSµ„Á% Ç@ `¢C)[gô3%Ðù…EŽžN¬ Ô/˜_žÔ ÀPìà’Ä82P~aÑñ¥ cYz€–ß` väC7@X`ÞÅ0 2| pÖV0Gà X-ç@®Ž "ò8Âîï¿z†`Ä –ü´=…Ù…í‚ îN–Dß0 erÃ@rØ ¢`¾ p½p Çò÷`*æðhÊÞ®Ìæ®ÔðjÿGÌ€ tS=eFÔUrZ@¢t^Õ  p ˜ PتzpPë Î0 à Ø°ÖÐ  Ô@Áçb'öi×èH«9+/:¯È ¿)„L2‚ZpD Ñ0 éÀ z€"P ·ð9€p å€ zÂéá.lÓë0 Õ` ½©ä Îêg¿ùnªÈ~öEPà2DÀ˜™C·€í7 ~=À Ë  ~¯ö×À QÃ5/Ðgêá@ÅVÜ  VDÓ@ ÖÐ%bßühWægèü>nI½€Õ`ýD–m@®ÿªyòð þ @Úð ð ¡ ±l’À ÇÀÒÀD@ Ú0 â®X¡«^°9nÀ¸Q"¡Œ 6„èPÀć#^”hQ#F2&~døCÑ)M1:$ü!@ɆF 8¥‡¥A9X@ÜCÀ­0bÈø ñĤReäpPBSL‰h:²Æ 16ìx5)Å«%&}¶kÄeFháE¬nž¸1¡ÁÄ*¨¦ˆ@ᆇ%$гD_†1N@h@!Ž8"0ˆ ‰"X”€®ß®Y3vô ñ#ÙÏ3vfH±,è7vÜ ü1aÒ5ÿè˜Øçœ8zx ­ÛµŒ…7tÜhªGÂ1vX5MVlßÕ oÈÀÑ$VÏwÿªZ;ø¦ÕͶmt +€ì×sûÂdûÆVÍÕ¼yÂXuzÔI"Ø4&r€ôTÃÀËI†s3Oà \ <9ð4ùø§ İDó>œÈ%&ºóz˜ä#7zAµ²b(nŒA‡ ãM$²H#Dò#(¬ùfm´¨®„”²±fo@’¢"Ðy–a`‡B<±À’4²C6ß,K§#€„ošIà¹Ünäà„¦9&L¿vûÑŠiÀ¼¡ÿ‡†á› „3RI'(‚˜¦™Ûâ,¡† Ê@§ 㔡¤af(Ѓš[ÀMJg¥µÈzˆ@uܨ·ëRÛ¡a°i€±²h8!‡2UõiJѤœ ­µZk€²‡ ¬@‡v8!Eì ]¸Î¯H6‚LÓºe› t) Y¯Å·V€àæN¡ªn8hKIÒƒì`Ø!%dO@šcp t²AÇiPÌ·ã7ûÚn&aE^˜È™c€i`k ž X¿4§E”ÀŠzA8D‡~“(®™ˆ›aF}¦˜Š&”,ŒÁÿejÞ9¬¹fj´@*Wg¨#ºl$AH æ¸°;jà$Š`h€Ü:h o¨²ƒªÒlÁ1ì!Qš3…Î)§RÒ)†ÖÜ¿ÆÄmp͉\ü++‡!-ìc7GRìP½ÿrŠƒ8°ð£ÀSǽD0`TkÄkÜ5­·QƒsG¾D(°&šINÁ¢Cê@šyX™:yí1dˆ†ªF »¡`{q¦Vøi{÷«û gÊ9§œ2¼p¬ø¦ mn‰À8ö>í5å)°Z`j<à9åqL3zn”"°!`(àÿåÐpP ÈV`Ç3–¡ldÐ…AÂPÃä@(N! #ð‚ÇP5°@ò¼p{487À1ŽrèaT¡.°Œãy2ÛŽ:–¦ýèÐBO€‚$„Aš BGJ•"Ð Q7ƒXp!|- p€h€ YÍ¥,EÜOí‚w¤†Tà@ yjB°`´Zœ¢JÒ€ÀyÎí̲•éépß)'«ƒ” Y‘[:.ó,§Çá¤yv¤@“&Ò¤IxC l€/(eE0„Hø%>BSÐWSJÀ ÍvX@H°ŸÖ€`mÿˆÁº"çX“:p$œ´#4ä(¡bÊÉ ô`Ôà:ŒsÔøL†ˆ11HÎOš‚ƒÁ7%P‚^ãIä”=˜ÊÛH-„"i„Ÿ *@„PhB ÷úÈ•P”¸À–I2e-ó† %eÀƒJ€hÜ¢X˜À%9p œ`m‡@j@\€@át€^Ø€&ÒQ‚`';ÀÀÚ¦U‚Èî0A¸¨Ò—#HƒJtƒ3{ƒ0”Cd¬`Û+P†rXÃ¥°T’z@‚p'§(´  uƒVØÀtá -t V0Y ˆ ˆ\ ¥…ÿþv ‡2”lpCJpX= ÖÀ´ ˆqXáVpª^Y¡  zÀ+ÖÐT%7ØÙQ°á ,B1ÔPF„ÆÝ6Ò„Ž<2I B5¼öŒBAt†`…g°Cy Å9” €_|ƒPà†5¸‘Ó˜£Ç(‡+° l …Í€€2ÊQŽgôb´êxÆ5ÌLÂÔ0Ç0€…uH£æCj@I¦  B°A.r@ ÜF4”Á–qN„æ`°Ž£Ð±H¬€0¾1 %ü€ à†‚¤`ÔèàYÁXÃ_Ï (ÿX $ºøÆ¶Ìa(˜# 1œ T€êÐþÁŠ`£Pª M€ÄÈZP‚ƒràëØ†¨’N)Ö`Å7¢ñÛÀF'%0Ç-PlŽINÇH°#¥o„¢=xÁ*` ÿ ËxÆB5kœãÑXÇ0€M@耂¨ñ‹STƒÁjÆ3@/—ÃîúEÌq K¥CG8‡ð f4UØ"I{@-T£Ù¸)ÁM8p„v„"zH‡ìzL· 8¯ÖC¸h¤œzPP¾¡‡HŽ-»Å²¦ l ƒX5Nª ÿ@¡½§@³9€°€R`®XÀ° g@¢Š(GIg=€oôk–Îá…8ƒv“+N±"((/N  ¤$”¬€ ‚üà?‰À7ü5 Xß„M DªY "˜ÒÎÐ8P=ƒe8 N€y¼b(…¹‡¡YsTÎpÀw¾¡öÀ½øÆ$ÜI¨#èwŽŽPPƒ(ƒ:¼p€h8£;Ø@"Ðýõ÷ë †JZg0Àí˨46¢À8ÇÐNÁgþM¸À$¤dЀ„ˆ6ôÀ€^XƒÕƆ6À løÿ 1(5¨q rcÓ€Rp–>f/xAŽÑï¸Áw'\O0Œ§[á¼Î8Bzñ]ܼ&vG`†ð{! 5£‡÷@Žaf(¡%Õ2b€_Xc$¾¥“¿X€€Æ€&Àˆ `Hè ‰€Š€¡€dÀt˜áº(9 Â ›p€À:K ¨›Ù‰X€†P¼ò¸‘†L‘È›"j€”›țԨ™¼8ñˆs ØРѼÜÀ !& ¥eИ Pj`…ÉûœŽ“Pª§ßhŽ5i O"ÂÿyŽ)œ¥D¤ÈŽøQb“œ”¨àˆ #œžÕÀ‰0LŠ„øŸ@Dq2¢ýXŽ…BCÐàžQ(aÁÞxDÍÑñ-®’ˆ<¶(®M|(؀̱Š  P„u@è 1E÷AE¬J:;iPlPeªÅäá…%g„s@EZ F÷!‘¨,¨† ƒrØ€iÆGÔaa‡e¨†n$›l|¡ƒ_8Fvè…`qt¡ð 8M0‡ ðçbG — %(ƒ,Å{$ H¨`HíÁ§P¥ ;È÷ù‰ ‡|ÈäiŽÿ Ѓ¿úC>¬HÍÁÐ…t¨sŠìÈÔùt`7‹†09Éäq Ó4ƒ|IÁ‘\1]V0R¼IÜq t#™Ÿô€F ÊÁ(P9€c¨¡ªŽLJ|y€gà¾b…o1ɪÚb¨†[¸€š#¯Ü˜‹Èð ¤DË¡”ä¸={Kkñ¤À‰x¨Š®¬K6)  ·\¬h€iªüK™ "˜†oj°œ ¸€SÀsЃÖ:žÆd“ºRt`7˜ˆÀÑÀLVXvAÍH8Ò,ƒ Ø€ !°£q(8ÿØ„“º‚j؆tÀ†#A$8sšNªx‚ÀJ‡ð¹K…"x+à”¿œÎý8À€€(gˆ†‰ƒ茀Àª=bÌñ\€Ê/X‡_p h-@"(¸²Ï#ù…ÄPtà†tˆPZ¸…rh‡tp†8 úa‚Ýá‰@‡g@ËÅÚû­«#H‡P‰- 2M‡08W(‡Œ}ÞdS]@‡ Å4FÕÐ3­+®©#6^ÿ(  X3E€f  ÞûýP†o¢PxxBãçu'@ŸPÐ º2_ãe¦*€ Г³Ô`¹xcTýÄB´á¬á°0f¼ßPz€^0v„ €M¶   ø Žx¸W'àM>‚EìÛ‚·ŠŒHFU:ã¸Wáê}ÆÈ0#˜9nßx¦]ÓB&aø]( %¸¨ï]àÃâuÝSn‘çX“©Óœ´ *Œ“èjŠ€´‘оÄ⺤£P„aøZä}‚ðiƒ²=–„a 7 €q‘ÝØœžÍ’†th%ÿ:ú À†ß€0ÈMÙØÜ»®VK_îÈ ìˆ90øÈ(u€¼½Oº‘ikR‹×¢Äét.¿p ¢³¿¯¸]V( `f¨† ¹‘ß}l8†ÃK$á¼$×bŒ‹C‰’Òƒu°¨t°†'JŠùÐs8‚vBÒGÉ¢ƒ‚L͉¬t°!Ý5 ØF¥R¡ÒSáa7ÐF,98‡_£ 9P€ µa°))7ë€q¹éØ ÔQé] xˆšêèвj‡#@‘x$`‡rg8…YÄå—<ÂBê…fˆ¼RàPh†aX‰êPb(Îfh†SÐ@Ñ=P‡`šÑ‰iúCx (Œq.‹(€´)Ñ&çÆô€N¬ŽH‰b–·€X=R,o9bg:™³ ¶77èþʨgÈ­@03%(bP€LÒ`b <+ *n@ ‘ÞӜԃs8…hðI eáp=x«ßþÉåcåh\(^à†ŸeáÉÎïýf€XmMÕšÍ|"8Ê£daÀøwËêÅ Æà‹bNo.qÞÝqÃŇÜ[!‡“€!ù ,?jÿH° ÁƒOà谡Ç#Jœøpƒ3jÜÈQ⯎ CŠÔ¸a¤É“'¢\ÉRb7JthI³&Á'`(!„ÍŸ+Qàäé!УH“*]Ê´©Ó§P£JJµªÕ«X³jÝʵ«×¯`ÊK¶¬Ù³hÓª]˶­[¥mÊx»r.ÝŽ7NÄà)ÀîÝŒ$ræäûW# ‚uÞHx±c¨~KžL¹²å˘3kÞ̹³çÏ C‹Mº´éÏ‘Is€B:F9¥#”–A¡4 ræ‰N}º·ïßÀƒ N¼¸ñãÈ“+_μ¹eÞ ùØ)úå´'Ep„Ýœ9¸ÿhí‚ žln  š€‰qÖ!€Ú2EÙ ¸ö›Àa (áFÍD@‚@ @g:n¨#@€Ó DX8NAŠÔ–™:`@P`*q&à > pƒ0” hôv‚s4Öhã8æ¨ãŽ<öèã@)äDiä‘H&©ä’L6éä“PF)å”TViå•Xf©å–\véå—`†)æ˜d–iæ™áðØŠÊÐ }sTI”Â&D3 °dØÈ9Ñ2˜ãŒ éS;þÅŸ@–ÖÇW鄂椔Vj饘fªé¦œvêé§ †*ꨤ–jꩨ¦ÊÑ‘†_¢5U ‹@åˆFDkÃýàAipö5…¤•2Q¢é°ëh,¨ªlsǘö€9Ë6$ìhð  _´Øf«í¶Üvëí·à†+î¸ä–k®·) ô h~•Q-¶À Ä D!ù ,.‚YÿH° Á%b,xCŽ…#JœH±¢Å‹w°˜€Â )â(#B‚5^`\ɲ¥Ë‹@J Ó$äÀ%TÐsL/ƒ z‘P9wÒôÈ9ðÄ…I霨¨Õ«W0h­ÁŽ”>_èH0-š9XÓª})CÆÖ®:˜ Ô!ÀÚ0¥æn­ÝË7b‡98‹æà†Š¦™m³À Þ­9úJž ãFgÒô(Hƒƒ’jæž;¡æäÓj¨ˆ€™³4jt˜¢‡'Êœ ƒêßX1<vN,>;f®™ƒÀ£[…"€³fa:ÌHÆaÎXmÿ+½|ËÉA>l‚ÏUšŸÏ22›Òؼ£=ýÿDÑSC0h P/D×1” îij(ìP ƒô`„ú&À ,@PJ:a“ ÐЇÖÔ!ˆêƒ %ô@4Ñ09¥8ðbƒ8 #ÿ°C UQ“Œ2§XŒW Áh%ŽHšçA %è°äTsÌ2§\óK8àHä•3f)] 4œ° ;ìø ˜sÊýég›nFCš<W§¤ãE/éô@ÂUþ‰e ÑAQB¿°CD7P°L9ß”‚Á~ÊX*¥å•ÐV DTÿÉj‘¦ú‡êiÂ@«#áÀÁ‹$½Hëƒ1Þ*݃5Ð “=¤ð“‹ T¬±óqxi Î:Û&‘¦Q ܇ ݰú(‘Ó=@WÂÐÉ ®²Þ¢&àˆ7Ä@AH¤SÐ@C:Тûœçó8ºÐƒyÌ#éóÐÄtÐLÉ r z¸ƒí ÇÓÇNöy¸£dÿz<Ä^ö§ËCtë»&@—IÍŠ)¥" nNgp"¡(á›^øµ_ƒ ¡PD3è!õÎ&D l:ÕÕ)Õ^=¸ðø2:ïôÖÏã؈ãÓÃqy,c„Ï}áéA ]Ôcð G(¦úœ° !ƺº>z¨Cè ‡ë¾öu‚„;=¾Aˆxè>ûÔЃÿ3¨!Î ÊÅÏ{¼ÚÛõuœÂ ›÷¾á'?u\Ÿõk¿Å1è!ÿù£‘nð œGwéw|ñ¢|r`vé0 ¡ ßG}ó÷×sôÀ ¥àvÔWt¹ç|^À¡ð/è')µBs{—%ìG(X¬à Ò7}Õ' hW~ÓP å×s…—t»‡‚ñдÆ}R€FB?6—%7“pÒ°€^PbǧpÒ7í` mìÀ{^ÆÑtó° ·À…Ø` é ƒÀy6)’r%r+%¡ àP pH ¹Çrð ÒW—0 šÀ‚Á s íP~Ô@ðÐ|Ò ¢p ê0€?˜†Žÿ(P‚€l÷tF×zM§“ç}¬×s˜È‰n—{‡D"(z4Gz õ‚ôŠ(¨Š¬¸Š°ØŠ­øŠ¯8‹¡ 82¢>Æ÷ k’u|×Pp Â(ŒÄPŒÆhŒÃxŒÉxŒÈxJĸ Z€óã‹`dLÔ°çJïñÚ¯”áÞx޾µ¯ÄL"L$„ !<¾H#ap ÒÐ n@¶”Z”ÕG¬ð Π? "Ò  ==`K ÉšpP€­u=¡ ã ŠÕŽ¾sôñª",â$0¡8‘2zi= Fi$½x’ Qk.)ÿ¢&pÿ‰â´¢E$à3ÒDÓ@õ%‚5Y\$z1ZÉ-IIpÀ ×´²J=€‘u4Y”F‘2„X$R°fVL>q=má."óŽB8—ô V@Ý£,}ö‚4&"55ÔE' "¥I€ñ ãPHÄ'Q\²PQ‰"½ ÀÎ` à‘Ä –'p ê  PÐz 7Ð)P a€Z Ø0 V '¢ z ÛEßu' #Ò@4P¬ÐJp-v eÀ·P×` аU `¡°?Ö@ e€BÿY>Í"KÕ@ ÒÐ Õ pë° @4 ép ઠ—vÁ?$ð e0ŸE%€ã3>q ·0 Ùð ðæ@°u§ ü24€¹ù% æ8”†EÄ™Y;ÐѰf€ß hžp _ À“Jð rð/™D50¬À KA(ê Ëp„…è `_'0Ñ`oz€P æ eÐG7ð ©Ô¢E= `æ@nèÔ ÛP „°UG0 rp™µbÒÀ Òð£’ÀLå0 ª©nØÀ r!XT^Cmq7“ißUÿP%9ÁDà_™–9•©’X”Ô3С.$‘B›1 .œRI2¤•zUÑ!0€ªÅ•9-Ñ;êÓmIôBµåá`8I&„ãÉB¢>$p˜7 Ç ãÁ.: O¤â•?H?%E@VEœµbG / pOå…A<H-iG0pX©£Å½@ Ä  Ç@ ÇP¦¿p º°™8°%VòG–€p ´& í Ö  ÕÀ @ ÚpIå  B¢~$=Ðx)a² hJ`ì0 p"@pç`Zÿz⩆` Ñ5 `  Z06aÐÔp6Ò  Ð{±F%½¨“#Ô>‘‰7Ñ@4šp4J€Š0úX p h$Kb’Q„S<;ðB€!àß  ÔàXнPÑP Ë  ì  ÒˆÙšDŠÀ*@V*m±aà›ŠÐG P Â$  Šp^¡÷G?0+!(½™9QÐ"°ª`aÊ¢†Çê; aD7â«Á%Ÿ·âò"8€.Ÿ—=³2‚X¤%0Ð 1/ ·¬ßE")€Y*&Q½Ã‹öºÕóÕ05À. ±%ÝQöÿ…4|>Ru©«#ĨÁ`Üp·Ð¨ Ð š0",4ð5à. Á ž )P09&à"4+ê‹kV`ð éàM³ Š€Ï¢-‰&e0 „?z0 „e½úeR[>sOð Ó°ØÀ€ ¿è%ÁÔÏà‘QÜ 'М“Ðm /P#´@à·€ìà ’&§eE&‘G@0ß0  å°P ¼0Òp °¯ $B±PPÊ€ :€ ºéB§PeÐÂèÀ´ûÏ֑ͧÿ €Ç@ª@ƒ{Hæ QÚ P? ÐÖÀ   ÁÐ VÐÂçð_à Ú0 ¬  Và*Üp ßœ$uK!ì  o¥@ æ@PZ Î à€#Û0 ðI Ð4¥àº —² Ì–½·\ä$Ý Ã`AÖ€ ÒàÐ^n@ ÜP l[ª–&é, Ï0 À¥0ÎUÊ@æp @½Þr#’Ì @' p<¿¢H  {#}f|ð`•ÙSèÊŽ° 0'Ç87›Ò»;»Ê‚»5‘&"½ð‚$‘»õr$€ovÿt#¡…­¼òHŠ•¼ÝãWQËÚ™µÀ#´*å<¢‹˜Ë\e|1½-MÔ7”YB"¸ Íϳ»6âa"µ.!' @þ%\-Ëâ.PážÐ'A:À 7ðAÄ-v—D  ! ÏQibO4pe¤ àP@Ì` ÙÅÿxû 몳Qt¸”|#p–:Pš¡ î0 áG ‰< Üð‚g„»×QÔ P: „ 0ÀÕ  P~㲚€‰òD`·Ì\…”N$ ± ràZÐPÃ@ %°adƒ´ÔP Ù´½ÀÁ ÿP/–=D½” F•F1`ZÅ©ƒ¡p4G Šp5ð¬ð§¥@€§F 7ÀPß0~vÛ·`Ó` Ç ž±êÐiµÃ’D;àZX50>/€=Ë r ÷Ae1P@á¡,UswÈ-c:‘¯âg$±.À@»’À ©2ÀgpX’wh‹*7Z¤ìR©Ä <÷]á,ùÞСCuŒ¼4hà(Ãå :Tˆqb-m1hô 1\#Á:zàÁyG;ìFß±ƒ·êôqc÷c>_–ãƒëíï$ñ\i<þD0A¾~CAÞï$‚âZ¯ÚZ’®AþRP?÷pH°¶ør¯6ZRoètSñÂ_„1Fºþ£¯ý:„PÆ–h)Ql©–h 6±ÃŒ( Í%"9Ô1J)§¤òÅ‚¡F]0p;~˜Æ²q¦‡\Œƒ2žáæ–ÜëáežQ®J;ïÄóÀô:€"š–ØÑEH Kè!V4Ù†ÿštø-†(ÐÄ™tša‡ ˜„së2OO?‘9@+A,¡"ئ”E‘Ĉ†™»Af°Âê@6ØKذrziÀ½cˆ³tδ INÐ!‚i–a@‡„qF“r€€VXq…}š±fƒbC¤i¦ôT „rp`JIТš4á&_Ç%Ôæ›fËÉË8€BEÞä‹‚î…`fh u„©†an,¸d*cˆ@—oˆ€`ª¼N Å.† û¬% d¸„¤Yf€ôfiÔù“—¦bxΡ&œa0±ÿ%â«ÀbØg°i© ä°†u¤Á‚‚Å Âe:n¿ÔC€PJ‘£„_ËÀ ªäP® È[ŽeM49‚X”£N¹'±„ N«ÀÅJ¡ ¨ïW$=h€±6Ȱƒ Ø¥¼u3Lнró ‡®ùªv¨1=×§RÕQ90ð·3 r`£g^F:£é­èÀÈ Òa’Àÿk¾û) fj°™Äbþ4Š3zN¡·Sïßo©†ª9Σ±«!‡•Íá bðð™C½À€²Žs•iÜ¢·HÉؼܼ€¿†È’塜‚ÿ+0• NŽZ€_À£ ßèÀUŽS(a¿À@AÜÀ[”  àÏ Y—@@¿€á‰Ž hOdG:&A±òe5(™œ¡‹` +@˜€˜°s„fô‚ë†R"ðŒ–ààD€ã9zAXU±BãRB™Åô,#K½à@ @ļ@o$`Æ$*`ÇU@ËÖDZâ€GVˆ(R’’——AG à hÀÈ¥é¦%„Éè\"»¤1`A v(¥„ç@]›eåD• p;Žâžž Ÿ\æŽ1HNu^„œ®qÎA—YÏ n JOÁàÿ ~úÒ€ñ‡„º„€.Éà$h€-ƒYÌõÅBváQKX÷ÎpŒ›¾ " Ä2— :u~£Vx¡.*ðŒS<=:HL¬¢Ê®á4°JxJPÜ€šv05Y49xŠ@”—œ4Ðᡈa lüâLS0²Q MP’ Æ6œAŒrJ'ˆÇ6Ç |CBƒŽX11nØÜ À±‘È  H ¶ ¬åoÀ2žL`éPU:P‚<À® Œ.€h“? 8Â/tÁ¾^8€w$j€0ÌQŠC1ÉB4ˆ@ÿ0Òq‰k<5ø'‚b`Sдê;À E4 ذ†&0P<£˜ŠF.À °•Â=xF3¨ñ *$€øÀ~qŒ -ØØš"Ì‘°cР:X7¦áXA3mFÕft˜É3Pµ–€`Ü(ˆÀ€’ßèô€(„SFšXÇ¡zñƒÈÁ§ ¾d…oü¢2(ƒ:äP€gHc·H‡"Ja+ ÖÈ40€S˜ãœ¸…ŽÐà#X!z`1B±M  æpÃ3¾q+°ãG0Ç-Ѓ Øu#ÙÁÒ6Ö€: A Õ°F:ÿÚÉÚ”Àœ:&¦Àõp+ÀÀTÀpc PË P ]0à ˜Æ0`ŽP ÓÀB–Û6 €æPÂÀ¡ =c*Pkj0E<+ÔøÅr ¤CJ@‡ðŒe, e(E('Ÿ[¥á£}rpb”ƒ„x€.¦±s8C €3èᆠ¤àÔøÆøäp€£é€Ê0p\-Mg±†00‰s¼ÄÁHÀ¯‘cV`p30"öÄ Z(Ç7¾1žËÿàæ°F~†`þûªŽÜ Xø7ØÌ¤Ì蜃ö:wè!fX …Á8tr†ÀN ˆIXÁ;ø†&ä … Ü„mz@zN€(„B ²ˆ+€‚¢8M ð"@$9žb²EÐb€0p¿„ª(Ð+° ð€.(ƒÎ§˜(`¸ê‹)` pHQzM"ž¿øª¸Œ ˜A ˆ}âèsh±¢Eøkp&È&jóÙà€Ô`"p¤ÚÈ!À€Bh‰¬z€Ù˜ ¤Ú,‘Ú@<ÿÑPò*y5ÄÙa)ÀÈ‘kê ŠÔéçƒ8€jˆ¾øèÐ hªI(µx? Uþx€$”†`x†u .áVÕah? ¬£Zýž°‚e¸T=˜€˜ö©–RØ­i(3AÖ(‰EH€n»ói‹ €(€xYÌV)©šyâµèóØQ²&HM×i22”ÜùÈzõ”ªÒÍ!åWPù ëú†c¸©€ý”¥j9H‡^XgDX*ÁÎÿu°lh™cX)y ñ,÷ÔèØ;A™ùb…“4”*Ð’Õ‘¨€2X(€[‡3¥Õ’e£à\Ôo.n¨´¡×Z-‡p›„j‰e¯ hˆr¨†'(ˆqY‰Erù˜  "pšÄ¡ U¦:Ó¸ŽpÎç¢Éœ­U#A¦ê€ Žß8)¢tЩµM½‰¨Ld –ÌŒ0AØ,YsÊõ€SXÕhQN°‚SÐ([¶ÍV«®tð:9`¸¸„ÁR¨X%íX859°ÎPž^ªŠørÐÒ½À[ža-p †mH†èGYúF])ÿÂEØp€R˜‡c¸„t†d$ùøÔÞ}]Ñ­WŒú á-…v¸³ÛŠ™«¸8>­8„­SÔ+ø8±tPî´†¨¸ ë*µ)XýÆŽí/tŒŸÓË/PËÙãEP†v˜†S0¾¤\å€l†IP¦ †h`… ¨ ¾x€á x‰†aèb<à%†ã Þ(€`ÉI‘΀x0'°}Ðå!¥²QŽwe”ðH~Ä–¥)  Ò›QUžfQô°¦ ñ b¬Bx§‚h ˆEÆPÉôĶèS‡Ï(–À-x¶aÚችÿ8BƒÓ—àK¾dEò·8ãlU€µÍª@'åB‚›™Á4,H¾¸x8F4QÒäP€hˆ†ñ*µ\$t…eh‰ÄÌãt}$ç<~7M ¦Š¯2‡ ,pΉÚx ˆ!fi­lâ¨e8… ¾¸…mÀµìØèK¨˜äj€A¤8¸ðn8¥QÕ,>Ïa¸@(€‡^p ƒtpƒÕ¹˜Uph‰'ØÐŽ’õŽ ø€¨gºò5ŒSý ¹#ÄhbŽuÙ‚èðBpeõKL¼¦öèF¡‘ÿSJëqh¾pe(€QN½  ¥¸‹FÔ…aЃ@Ô]$n¶‰ùÅ[Ç*u0åþH(„Ye`àEc:l‰ Ѓv˜†hx¾à€<Ò𓸎ŽP 9g" †aÐl(…X¬¾ö9)ÖæóL¸˜z Œm  èCF‡‘Ú“@ë—P„th dÒ€¬N\³‹# Ø’Äœ¹„îü† À¢Q¾ ‰X(ê((‡4S]ðÁ†Xr°°°¡i„Í!-8†fˆ™å±¦àHjߘXWŒ¤••¼æ 'ž }ÒÔÑÕÿ_‘aÑÑÕ‰eÚ¸P{$»&‘–éŽôË @D$vÙ €6°rpù`î(¡Blx(˜³yénI“0Pší…€ùÞòF.^,gp…rè $h÷‰C‡Rx¥„vùjdõ‹»Øõîµ'¤n„m™û[†0‡càš¿Åoá1=à†r†#€ Ìžðùgä!îðV*ˆ¾ÙÄöñ¾Øò¥ïX˜m€(ªILq=QpGQqñ€åsQ°\ªqqbdø8ˆ×"·ª¸r¸êobò/,BÛâ™)ÇW>(wÅávh ˜Æ6’ ¸€`ÿ»0Aü0°Ëû¥Ox†v°]ÐV„^—ea+h½è˜hb`†^ÐÐwÓqõèàK ‘¶Â5ǨÑz}e+I&æfbQŽäðzÍ‹H·×–ð€lÚa•Õ¶¸s7%ˆnê Ê þ¢åi,õ ø"+¿ p¿ÜÔ]=f¾è…›f×s±o€¡"ÙzÕ›8ɪ¯ÿP(7X‡RÐ:5QP‚^7øâÙ X9 ¯0Ï`V H€fа;S9¬z•Ò«¯-å‹RHj°ûŽˆlÌóóz¥˜µw½qÍ/üp eXÅjøV»XÀ »fPr—^Ò:)ù@Êù"‚Á9lì "†Sh†gˆ'ÛœЊ€¾ï½H¡©¨"`:9@Z fdBP‚ºÑømçrn€-x–­UN"”h†tXtŠ© XŽì… ¾¸-X‡rt ¶L7]žø  òŠ©ÙIv‚#8‚WÊVRÜNqQPõ%ÎÁ /Oñ\ÇòÂ7üÃ?;G|1GŸXÇïXȇ‘€!ù ,2T=)ÿHp * *\Ȱ¡Ã‡Ot ±¢Å‹;`Üȱ¡F‚5:Šìxm¤É“(S¼¡²¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ(ͽa(Ä J]zrÓ§P£JJµªÕ«X³jÝʵ«×¯`ÊK¶¬Ù³hÓª]˶­Û·pãÊK·®Ý»xóêÝËw¨(W(©ºMÀ‚¾&Í•à€¸±ãÇ#KžLùæ ¬%bD°ªôj§•C‹Mº´éÓ¨S«^ͺµë×°cËžM»¶íÛ¸sëÞÍ»wi'XÅ ÚÖ Yeøî¹y¹óçУKŸN½ºõëØ³kßν»÷ïàË,O¾¼ùóèÓ«_Ͼ½û÷ðãËŸO¿¾ýûøóëßï°ÚUgV:GB@!ù ,.‚XÿH° ÁƒÞØQ"¡Ã‡#JœH±âA;&(Aã…Å CŠ)pX/%"R\ɲeHE­a»å͛8*pfMÀu“(äJTd¡²…F ˆŒE£J…x¢DjàÒƒ ãÄÔ¯`öXÐlZ+BQ¶­Ô ¬5  \°ÝêÍù"+u¤¡ƒBåÞÃ.;è Š1+n ž\1AÂ=&$H‚ Ê #þÈkðF=j†^0GCª 6”áµíƒ.Ü!ƒmA"8üð*êíÐ0´ÁÆŽÙ‚ ’ø­Ü@Çm‡aÕóA Ñ.ÿ8fŽÈ0t=fƒD€fÑž <°€5b€¤°>t‰8M87PÓ8@ëèâ@ • CÍHƒWmíÁ)ê;¬<!bÄÃNÑ$p}  L²L(ßhÁˆˆõÀB9DCM?äJ¸±Á0àt€Žˆ97ꨃ<@ZpsÎ6r€À$b^AqÄJè@‚AV!Á¨÷eXp gv @^ ä[ ‘öfX=ÐÀVlK"$Ãh4\$€oº„ ”PCD%ÈÀA ¤À£qÚh[7lF2½è‚ 4”• • Ôª§ŸÿEP˜óÌ6Ò¬ƒª¯Vê+¬±Þô[=0 6@¡ŽÄÀ곿þìP2là PÓ JpÓ‹;À°ë®ÐB;íP:ì`œ5Ãl#Œ5wé åF ì¹#ÍyÂ8`«í?x ®¸¼Ö{/¾#• !1è`,6(ˬ³öÚ‹°K74 Œ;@tÐÜšk ãVüìÅ.ÅÀÃàP‚d£þb&2¤J®Å£\Ñwšq$Ð¥m²JC ©ú&­Î6ÑЃA=ÜP)ÑOõš3Ò$=+¨Ê°SS’ª×Þ[T¶×,Åpà @ÁMdÄ&m‚ š—h»JXÿANT €4`@Ãh'À°CgçMQ;ì Ã®GPS5è„"Ü|Ã8ÃL 8s ;Q (ÁXÊps¤;PÜPÎ/üBM§Œƒæ(BݪW¤ð0Êœ²A\à…9VhÑŽĮ£åè¡É7äYüDéA¡Ì3¬,o0 `aa°sÌ0ÔrDéÄ0sÌØ}_,@Á †5ð wXáÛø´ )èÐCü¤?ˆt 7Ð œ2kDV¸€ª± n#è7°® VD{3N6p„là1ÀŽ€6 `Hm@êÿ\èï ÊKEë Ü$¨ ‘ˆÙUFR®EAq%¦)A@ +víŠÁ¡ zÀŠeܬ£Kzˆup#‰R£KzS€^X#.û¢%Àa`#½ÙãJ*•1aü1‚$ÉàÇ ˜&‘$qÖì8<’)ŒˆaŽv4CóÁ$HxƒøC‘åG òËX¦LT¥ñ–æYÚò0%(–6!Äæ–ANJ`NäšÅ‚±cZ¤ˆƒÐâL‰l;¡†bYÍ„ô@º@‡Ù͇¤ X¡0GÀÔ!Èlä ï½Ó ,XÀ2Öqÿrp£ ˜Ô=R‚5Š!1Ï@r‚] `XáæB¢Œ†&½P€´*£)œŠñ aÁ‡  (pŠh£ÖÈ¥3Qêt  jìDD9„ƒ@:ð¸äFmr[0]HãHÁÖ¬(Èn 9‹@ 0§Ô@UlSæ†á ¨ª‚=JI°(A "À™Äµ+Ö…!Šà¹4-äcÀ/0¸)/(Á8Ðe…'« 8‚TPãQ 0 œ ÍàF4ÐAôæUúûV‚¥ ¡P­0tÑ&ÿ¸A4PAÊ ‹`”â Ûª¾$ R1ØU Àr9S€£6#€p ' ^°¢ 0 £¾ˆÏ•ܘ—W»êArU…ƒôQ;Bt`š`·)¨J¿z°§]eÐjn¨”ÀÀ. 8°IUjkšWª‚Ä=+àMÁ¨ê5h) P @UöFâªxà OèÈ Ü† #R(«ˆdVr©ŽUšDçÌAŒ ì Á0XŒ3ÖÁ(èræÇ84ñ¿—­‡(ƒ<ŠYÔ¢í)´ÒÃÁEàÑW8À q‹tX$…"NÀ t€íÿÀÜ ž‘Žeàå£ycU])Ѐ2¤C%"×Õp>3sà¨@B‘—ùê(ÐÁzÑ g4çê•KàZ10瘮×6 3c ƒ¬F3àKôn€ذÂ3œ±—ý_ЂôЋoL¬dO¡€Ìܱ)`Ü S… Ü›˜.Ò`†2Íaª± h€pŸ;çRŠ}F‡"—^p#  ÉÞ´vl˜ê`‡.P ÿ'¡è…xÁMTVÀÆ$ Xë…"  v”¢ zH×NQ "T zЂ5¨ñŠO7ˆ@)JÈ ]pÀRZÿPG(þ€bœãæ8`²q9#G€éø lÊ}£c+!m¨² X”¿‘‰\p@‚ WÌËÒµƒ\ ¢î%Bæ”·Q /A°Ž€£d/€Ú€¸]í-»ÚÏ>÷¹'`8¹¦Ê¨¯ç)ƒ{F3ïŒÂþðƒ'|â _øJ;ÞÒ‹†*È„íSØÖC=ê±}Ôƒ }è9ïyÐo¾ô¢=é=_PàeQ&‹–x]õ%D@ž Æ1Ö1xøþ÷ñG6„AŒvÿÌøE4‚/æ7?ó@G0~Ñ iÐC j v´Ë÷P„ÿVžŒI´cÍGï籌S@Ðo†0¤1‰`ÐCêo>=¨1Â[]ÿÎæ^#^•2 l¦GaP÷—½Gí0 ìÐ{ñ@õð n}ø·ûw ¢‡}ÚÇ}Sm8‚mrÓ ½ ˆ~Ч\Fð@ÑP ˜~Ø j&ÿGE±W/áw‡q€'ÈÂà Ã0ù—~/ƒ¨„`êç€ì îÐ k0¡àßñƒ°w2}W‚·Gó@†š@ ÷'dø|ó z0Ð×’€†éW†-¨„òð@¥tQ#‚²·W8r€z (“`}„Ø çGˆôÀ“ÿ0ƒ„è ÔðyêÇã~ð †ÐÓ[XEóƒÒb4B¨8Ðg¨ ½ ¥J¨p ôPÓp :p Ó@º ÄÐ Äàø -‰ôÀ ¥Ð nÀ õ  Š@ø&¶§ð° Ô ,ׇóÒ` Ó@ó@Õ0 ÒP î€ë é·áxe‚z&D¾r3@è}ë‘y¢§„øH†ù¸y”hü˜úX†H†ôàz á4tsaò^´Ç$Dèì‘9‘ìÐy‘Ù)‘)‘òp rV±+Åádi´ZLâD1Бs50Y*PP€]Ø…ÿà8$kC<ñK³W·†#Ã%p&²Q €P`2%~%Hå’(Q&HY€‘(Vs1PA4°Ï „Á&ß çÀ“0dä 5p3©‚2/P ¥Xa`ö´>Ø…2-pm X =éÆ*•’GZù&(9°·…€mR¡ZC'‰/0` $УhY䘥y’ •[UŠ™Y0}ˆ/“àõ$¼°¬•¼0¼R4Ó Læ à ‡6'ô˜R‘•RÁgjÔ0$@‰ ñ¾>)HkƒcWlNv6Œÿrð]`1éB/€‡¸-€K)‘S kC_=Pb° Ôàoñ¡‰²žªSPÃ& Ó K ›±” °E‘‚oÓÀÃÀ=àaÐJ5/£8 Ð Ô;€W@Êp Ñ !ôÇ0 ÍÀ@ d…o̱qeP".ô–7f;°ÔÀ “  ´JÀØoa ÖP Ä@ñÉØðs%¡€º oED4ð–R,ìr>Õ pè @ð@GÐ@T1@YŠçék p5B¤?ZÀê²A£ @ß  åÿ@ ðÐ;×µ —À.@çVß ÐYãBPap WÃÃð  TXð;ã ÀÐë  °G P ƒ…5DШð§.ô òð¼AÛànÌ@è °A0 ç°Ê(VU¸- 0gÛà epj.¤”Z úÕDÀ š¢ 3 ·ª6º¤º  ?€V  ¥À §ð6õÅHÉÅžœQ €iPQÛD4é 7Bž Ð )á[ÔÿZAP¡8²!>©.³Aô1¤;Ð/*²ÀêBvC²q„gS”ªCå*¤ØÿU7Ð1@30`'~Êw$HD°)€A'ð4à4‹j? W'€_@¦†ƒ3jT4‘8,`CG¤ßPpV  ]ðoV 6XprFØ€5u<’ ߀ Ö XÀ®€ØP¥Îœ0 Ë@›#¨F5­ó 'Ê :$¥§€ 0 æ@VÀ´‘ѶjD+û ÀìrÏÃ>î xÓPp5R ÜÐ\&³GPp ¿  «Ã0e°>Z€›¥P rð   ðq¡k.{4+ °äö½FÅ P€Ú2®§rr%pƒšÐÿ Fõ¥"' @2NJÀÔ  & ÑðÉ{t5Q3RÐ^Q\œ`“m'YE‰„^•B#ë'’H¢º.$6:B²5eƒeµßƒ´ÚÅE$ð"+eC’u€é&”(ID2Сà#Ç@.I¡P/#^j3.¨¬ð x4F#ÛEŸ.¨:\ ºp ÔðoÜv ðfbÄilÅ@ ì´< º Ð4@ÖEDû ër` ëÖðX¦á®®ðûTz Ó@ §Pà PPDà­°ª³p È pzÀ ÄP;ÿµb ž¹„ Ò ì  êРĤ`·0§`6”øb£Yšð æ @ ` ¬PRE+Š G~à ÓÏÀ GÐrÃ@ Ц  .ßF©šuÖ  @w  w«  ë@»ü ê0 ÕÍ  å à ä¤?PZðø¶€³Ø  `±/cI*é @ Ò ÌÖ° 7ÇÖ@,ò=¿ÐÒð ÕŰK æ 6‚P•r€~t ì ÔÀ Ó` š€p õð @¢|.¡ÀZšP P)ÿPu/@faÐ\Oq20 ¥Pe5%  § ê"@  'åÇÅ*Àº"®1]f1Ù†“’¡E p#P¡]A´4 ‘"¹Æa5d£RÛ¹ž¥9PaNF'·W |UêÃQbÕ ED¥*/˜8ôe€¾d×54ƒÃx F½ÐÃÕò2PœH9§¶ €F¸ äyžÃÕ™`ô¤y/p¦µ\zÈßJZP pSeà” TKdô{Ei:0_9À ˜ fŒp èP æ¸/ªmÔ`góëÙP¤–@ ’ ?a¼ qj;`èÿàz÷‡r pÑ «`ºÁ Ë>í kfP#—Û`‰ F§àJð ¼0 »K Äe0V°§LeÐ ð 06ÉyE(pÚkâ31 Ñ §À =@Æë ·áͼ{´³=4ÌÌ §Ͱq¬°'àÞ€Cñ8€‘šˆ!°Ñ¹t`•âBÞx³ @€g½*^È5¶+{-¥…B7¹ä4ïØ_Mƒ5öµž¡iq­ØâÝ))l(Ôb6ô)9¾ô“¸UóÕ&’Qa?°µBä®*á,ž˜({™ÎJq­×®Ò5—Ç)¡(æUä)ŒUáÿ»’»Ñj64à  ÀÎÒ €5¡KÍH`Ä{Ã6pÁQbÀ–Ì܈nê¥>è³Wè_ÈD*SÎŽ„€Ùè%  w ÚPð¤h„?}C½)UVôp ðB´6 ¡°7šÉê…®Á­†¾äµ{è—Yz@ edj1V38p$ÒÀVª9@Í0*] € ¬ + ›\vÄ@Å?ÀgGÎ*Y\ 57C€~Ø™KîE84ÌH¿–Ò€ë’6S90Fç ŠÑ-•‚PÆë0S:A2à‰½¡Ô Óð P¡@ Öp ÿÑbG ßši ÏwØŒA¨ÁÙº¹dÊàAUä’Y ~N 90%þßO V`d+æ Â%À Ï  “\“è<P·¬`©bå;ô¬NðÛ‡ðO¿+f4 Ž]¦µ0lV@ ÃÑ\8ð®<ôUc« Jàe`=P‚Û PÖð  Õ0Ò  ààs?úµ ÷ì㤟*Ï  }*€â;€~¿Cßœ éra×p Ð4ÕÌ Ö ã<@ ݬÒ@ ÓÀ àåPßàªë•úmŸê ýõÿ½’MÉ&éÐ GÐ º³ çð¬ð>烰Öð àK©B‡†ΪÀš´Á®AP㇌ÒªQóPB†DŠ-V¤ãEŽ%4vü( ãÈ%œìÁ ºkè¦í€±¡Ì¼S DfN¸`*4`íW‚z•£&*Ž0tÄÀsÛ²uÒ‘ö6Mܪ×ëAŒK~Ĉv"Zµ%' p÷âI¸=ô„ÒÄF»G$‚¸+ ”œ4`–òb¢=§´`¸á1† 10( ¥EK 0˹÷‡¢&SŒY£F¸2j”(¡ÃÝÊ%ÿpÀH!‚†Ä‰f)O„A—$G‘"%ÒŽ7ÂM1’—ˆÛ9…P ƒ‡'6€œ¶Ä *` Á<Ý$‡Z:lã»aœ -|7ì·p3 .8ïà3Ž8¸XCNNòˆ®¬l‡“žƒ!¸ØÃá†ÐÖ‚Ï6ppN¢¤¬²O MÁñü[p“H(Î$ÚœÒ?vKŽ®t@B¶èÊÐ" q(1?#D2É$û;"%Ÿ„²6ª;ò9®¼)¹")+a4èï &è.J3Ï®Eï˜B³Í KPBM´-”“ð"«¸äbØAŽP¬à€2*CÝD4ÿQEŸ„¾ üdèà°¡foDt°PÒ‘ç˜$$á„tÒÂEWeµÍŽ# eàP‘,ã €iˆIˆüàTbšeØ„ÙÆš°µUgŸ5’.¸aišI€ÇK؃2Òñ‚;ÚzS@Xz @jN‡¬¡…7^zˆ`uʸ@ÇÚzh€l"pŽ6d€`føá‚iBÑä ›7âUÑ…"["È!G.Á]F%P£  †õtÙ¦‡£¬PUb—ƒ¶Ñ%Þe†zÓAâfiøÁ£Èæ˜*èålÐqG^†Qîz0çÿ›Pt™Ä0Ðqª‘F` ÁhNÚ¡(J1ÇšP”xµ]Òç¨ï†ÒŠjNâfX íµœÑ$‚‡(F zÀ@kª( R„ˆñÆ<ÉNJ`¹#K¸®†€¼¡Hà@¸* ¨ÌQá¨=Á·Æ“0äâŸGó»å@(a6MÂ*‚¾û3=æ›k52¹"Ðã›I&÷¾ý'iˆgä(Å Ôl-†¤‘ç”d(’û(œT£J ð!ÃÕ¸…4@ ¶†ÍG9Ì!à Gÿ°7ÂÀ ]ü/€ôÞddð"PÀÔ€ Þu8CàF)0A p7 €Ñ)Æ‘ƒäÐ;¤ÑŒu`Cèá¹%‡#`à…¨ÁÓ€áÃF:¤a?»Eñy1Â7¾Q59PàWÐAˆNA¬.ˆkÝÛK  0 =üŠù‰Á v È0('¤ 9ÈDÃËOë4‚ RQ|ÊOtp»%HÒPŠz—Å©‘=¤Q’=<œ¡ŒÓø ؤ-4sB’±a¥ p ß¹‘–Èø pZ $ºÐ’ÂHÄÀò±õàÄ6ñÄUá¤'á…#)’X"–=i nY€f¨°â8 -2#\Š—Êèˆp{Q$ëÉÆ â€f¬T‰¢Á†#à€b,Çâ逸zÄp SS‚"ŠG )Q€ Àk¨€ôÙ€Ç~”à8|Ñvhlh‡ÿf¨† £ (0à]huÐ…ˆØ'ì_ê…И€˜ÞÚ ”tŸ29 €#°‚(%šLI›¤ uäÿ3& |¦@Ç“ŽøÃ_D¸èÂD¤l“8ŸÀB4«„žä°)Eˆ+à‘aôJ—¡Œx^@j0‡:™³l¨"‚s8˜†g¨¹ìž¢J6+ØVø ¾LÊPW0 ®4ÌÌé¨dÓƒÆ0•2ËÈ| €$€e¨‹Ë¡ÔLÌéhnøu8 ‚¨ÓtÈ<†+Ü€(&Ù|72x'ÿÞ ¿1kÞ\•RG»™ˆpÎäl¨©Ö!ß° Ȱ$é\”ܘ€íD¬¢Žè8Nïl“Y¼øµr°#‰ Và†tЯîDÏ'9$§ŠöD‡RÐ=‚뤌S †u(ðËÏ6‰ˆ‹¸@ÑÈB䀦r²Æ…Òâö¤†–Ø$€ 9#0‡eïЈ8‚ Ðt”ø”3!qQ%á’ÖxÐè(gˆ Ò‘ñè€@¹hÑ}’TšÄ¡$P"(ƒuè\ª8T‚Å€ÚÂO(=ØE@pHÿg¸®üx¼vXÓ`2u8)ÀìГ)%ÈÓ2ÀŠM; €Ø<¢ ¸Ÿ DB}QÀ¼A-‘€T‰ (€0½Tx …`(ƒkêTg9“j«ÐRMÎøt(ˆ«ØDVE”¨€d ƒÌ“´UDé(M›V@‡ÉÌ_’H69(V0‡Ð,dMPÐ\jpTi…’¢`†quØÐ¦ºn=+Á †h `%sE¦˜Á»[ 5W÷ƒŠ°Îè„W¬”_åYOxeÍr¤qÁÅÈ) Ø\$ØñØ-˜†¶)ÿÏёЅoP‡:»ÈI‚€°†g€‚P—¢ (· š"’4W›š„oð“'ˆi1¦ÝÀÐ(‡íR"ÓKµRX‡j¨†t „›-‘í¢˜F\JiÅ|›9g˜'ÅÅñ¸'§‰F$Ø;u Ðn¨€ÚŠdÒP°¸ÿ ÚN}%°˜À†fp€ÖŠÔcsª°¥«ûk€qY§è3vH‡gذWn- ,€ˆBH%À(°(À‘=5WiñÍ2¢¨€fãȼ×ÚIB ×xWž„:VM =듈]ÿ˜Á hÑ#XÀ-(†a€`ЄÞÂ_Zަ8Û•Í'& Ѫhx†f€‡ŠÉEpXV}‚fznX€(‡j3K±x%ˆC\β x€±Ù#ÑÈ Ȇ``Êë_#‰OÚ¨$n¹E`¹àL`¬z¤4f€¡0Í €R(§q‡^ –{b‡R°€8]¦ Vh&%Xº!a ‚-Sáü¨E¼ #ì@ÁÚÖ Æ0ÚÈ€­áÏ™ˆfâ!>’Ú!#Fâ-Ò1nˆ"˜Ç&>-#((b bùÌÕu€?ÞÛbö —`0‡m¸ÿ"ÀÆ1¦‹ñ»…o¸6F›8…tP¹Ø6¦ÄdMȰT6^–`(n -`F9~p¹-ªU}Aâè€ èဠ)udÜ ÃOØ €ÜYÈ&8…b å“@gHÀ èÒ1n8‚tÐx†iP€@à-ŽŠd+%`…rðÁ®aÊñ˜tpÖ‰Ûþµ©•+æcÆ=¡âˆªtPpjhj”c xb(fPM€íJ*~¸f˜.eв ÅOÖÎCDY”ãûXb¡^dÕLÖâõg*ŽC£@v˜„Ж1Ë{ ˜V€Õèhi èY xhîß ‰Ð }§Œ¶Õ¨”}€Ýi… h&uLiiiU  ‚6H]X`ÝîÐtX‡ÆÍyT*æ–#¸$LÆ1–¼%Q®éençWÆê#Y¬®Ã«vdÓ]G®êU !ù ,7dTÍÿHP¯‚*\Ȱ¡Ã‡…YƒH±¢E‹1»v±£Ç»FÈ“(àU-@‰”0cÊœI³¦Í›8sêÜ ‘ÏŸo<JTÀ¸¢D…!]Ê´©Ó§P£JJµªÕ«X³jÝʵ«×¯`ÊK¶¬Ù³hÓª]˶­Û·pãÊK·®Ý»xóêÝË·¯ß¿€ L¸°áÈ+^,@FÜŒpkÈp ¹m‰•ÛÊáÀ¸³Å˜áöøñ2.ϨS«^ͺµë×°cËžM»¶íÛ¸sëþënÎo¿ ¾»x×Òi“ xQ·½çž0N½ºuê7äꀹÛi×ËxO¾¼ùóèÍgðܲ@:ð~ƒ€r®W›_.ù;€]Zà D@™¥§à‚ ÊÖ^ƒ uÀ\P …N4l-0Ð6vèᇠ†(âˆ$–h¢YÌUI ®5 [æ€pâŒ4Öh£`ÇÈõ€97 PŠhs¡sÊE!ù ,¤!ù ,¤!ù ,¤!ù ,}w(£DÁƒ4ÈðFB #–"C‰ʈq±£ŒbHäX‚Ä@+9Jœ(PZ%TÆœ™™îÀÈP€É2 nz48ZC ¤pçE…7’°#†Õ¤£bÔ(òj΄µz|˜cÅ„!ù ,¤!ù ,¤!ù ,}¿ØãÇ‚*Ä‘`€C‡p(°#¯gÍ2:#ÆA  7z€÷¯dÉz> „¡£Àºûbú›A¢@?¼Üçoß?š%Bɡ󟿣ÿèE¸1pÚ‚/úKJA…BEyNUjSà—0‘*ýèA@˜YÅÖlª@ÁΞ?SƸáÀÛ©4» 葯\:ZîŒW¯J¬(V %ÅÀ%"w ÀÊ?Æ€qG7`Ì8P†é‰!ù ,*%gÿH° €E JȰ¡Ã‡#JœH±¢Å‹3jÜ(q!Ç CŠI²¤É“ !L¸°¥—0_ÊDI³¦Í›8sFäÒ¥§ÏŸ@êJ´¨Ñ£%$5è¡ V‘ô)ˆW³ ÂƒŠ¥ K4õP4Ù£#w€EË–#„1J 8b‚&ðpÂб!’¦À!bD‰6ÒH±¸1ãÇdH”Ìrä‚7npà°#FËAeÀA†ç¶¨)ÞØ‘CGk;tÄÖA£F >Ð,I1%ËŽ'‚¯‘B…T„,aÁ↠2j¼HÁ8ºŒj¤Ð¡‡Œ eDÿÇ^]Çuê £Hž,P0,.ȸƎkÌ×ÏxGÅ)à×Ãàဃgž6P 2ì ƒ=<(ÀàyFà€áàxþÀŠ Ä â€8<¸=(è_‰©e@d AŒÜ0B^”à H D.qL0 )H € "H B 2ŠÐB$¤ BI È(ãW7ˆA/|e¥'ä“d v1–yÕ™\E Ô•@óK¢ @ 0P,hÐ@V `Pƒ üy$8Dð@ 8ðiP 4`Z ” $Àx%4@£rhTš@4ŠDÿЙ‰V`Z4PY’ùÙ€’‰Ö"MÔűQ A„IœG-¤ B²SàÂF›€2>ˆ Bäl²‰>²E lDa´8l°Dh´ AgLa†-€ ß¿/(µí6èà-qL‘C ,ä …䕃7ð…4æpÓ o Tr°rK1eT….Gh°ƒ.XDpÄ/ÉÈ¥„òK0GD0I)TP+k €ÁÏppòXAÌ0PP€Ã§è1 Óh1L1¡@Íü,p D0ÇÈAš”¢Ë0G”ÐÁº(ÃÊÃe€¤˜¢Ê(²Ìÿ‘%¨l %D!ËÞ«Äm*£ÔÉYì²E »œÁ)>Ìñ *qQ *Ÿ™A°¤"Ë'!AK, ärH ž‰ð Ä¡J+«Ì¡C‚2J· @ÁŽ. ìÐA ,|pÁ CÍ$š@±h;8 Ë<Ä$ó :¤sJ“¨£„ÜTÃŒ9e(0Í:§`óL¬ sÃÎPÓ‡= ˆ:P 7(:ž! lüàmëà†0œ†`ÃÊXÒ´@Œuhâ4ø6¨áŒtÈ¡Ï`+¨!PÀÕ7ƒºá96qˆClBKˆB6WFÐÂY¨ÿÊÕ DÂ(0´j‘…3D" ¨ˆÂ(âàY0B› Ò&R‚)äbr­¸!#Záä >ÈÁt KH€ª BrÁˆ4Þ  ‚3&q A tƒÀ M”ƒÃøUT04€å¸@°ñ‹ ƒxF30 s$š À46©‰otàßÐÌqAüÕ(ÖÐŰ¡ Hc˜d/ðtè"à€ÖŠ, 0ÈÔ6TÙ€S¤ F3àŒh@æ B¾QŒ ( ) r!MÃΛÐ@&Z1ŠV`îˆ>’$à; 8Â'ˆÂ,–˜ÿ68"™°'W±… Ø¡6(|”Š9ä@~cÃ,„J¨‚ÈÀÌ ,Ђ „)R t@)À¼cœ`„12P5ÐA¶ ø6ài0£r@7&€e°ƒÕ0G3 @ b àPBœ± 9|ÃA®Ü†1 %˜ ¨†:¨a tü¢H‡"*à è‚æ òp„bЩ@Œj Í€"Æ…hæFÛÂ)ΓS†›Ä!"!„]ÄÁž°ÐT1­\ [£€%H¡‚(Ðb E`b>!RT­>¡ESÿ`` µØ Tñ‰Š¦Â8C §°»YTB‡…l d!fÐÀ v %KØÀ:°¼à©z dñ²ƒôÂ7~«h˜cœ Æ6r „#¡Ópª&¸4MXC“ ˆA>Ul4CX€4¢!6"ä @‡*—0 Š`( ©mè¡`…9"i¼O“‚ªHœƒtô"nìI € ‚ Ÿ°ƒ%>‘TŒb­P…L;ŠOXVH¨È@$T‘ƒtnÜBZ…(Aª )€4)¤Bo£hLŠ-3BGE’n 9Ìÿ«8„¨ PPÀ" "èÜÑ‹ $4x*ÀŠf<#Û ,s܆6‡ÀEЃ¬‚6¢ñ‹g”"ÖXÆSÓôàôÐÛ* Pƒ¥86™!ŒgèGHÇ$d5´h £ÜP4Ñ‹u4£DøÁ7¦ÁŒtèa&Àþ¤× ftRp¥ŒK‚€  Y˜‚¾4„8l¡ŸöšÂ¦‡$| ‰ è'¥£°î9D!q E¾:'زá -°Á˜0‡8A>hE ÎÀ-=Å@*àP²0‡,¼à9 ¸½mЗãÖ7PgJ`…^Xƒ·ÿ6 yÍkS4à ØAŸl ¿î…"àŠI4@ ½JQŒ³„A˜Ä2z,Ÿ-£º°®zñµ¸À­ÇÐÂ\{ÁfC °Â1š±Ö¡‡B%'‚J±ŒeLbÑÛ¦ H0# ˆ@K9ÐÒbô‚ Jjî•4I HHL61ŠL¡²g( B H@°A\W&üyAðû&`ƒÒ§I)ha @€ô%@(ô€ÎÜ´ÁøPè”ÂÌP€ƒp ª4€9h@ˆ¿€¥4JXŸ§@” $ªS78ÁNêøéQ1¸ÿŸB~  9 ƒ ( ¥JÜw”d&â*Ð@òŸÿÈäÿá-”%p*àx€žRw3âl°€q!8 -*Ð.Å!¬&£A€: ‚'(Ppž¡ 7PzÀ Ð%½0 4«ñ®1vÁ ts⃞‘"*ÒF(HøH(!$ò R#9x?rôg#¨YH‘‘:B–ázdè)ž‚0°8P%4ð% 'Ô‘/"ÀH Ç…W¸‡ŸYx0p€‡˜Aš’‚À `!rÿ±…ôÇXŽx)G÷ ˆq1ˆx‰•X k4Áb†®7`_X†Á9ˆ'àJrÎá5B1Œ„ˆN‘ƒ Üåaò%à2’œ( mp0Ð1 á$p91r”V#!}ØKÁB*7Áó½ (²:Rkføzq(%Àqˆú @g¢/Àý¸$ÔÚqq ’Ò0 ­\1®7*­âÄæzRåµ@P¥¨‡—‚Ð ÒþÅ"ò¨rN±XŒ28Õ Äp?à²,"dQ “ÿð*/æÜ‰2 3Ö  Á”Ꭱá61(%‰ˆŒøg Ö á"B|žÒ‡òøgEƒ bà fS ]Q”[±’Ó@°C ÄàuÅ'Å:B? q‘ajÁVv9€%ð ßP—Ès% ›1=? ?pÌX^¬€ É $pJ@êXÄ€ 8q ° ÑJÐ{™A^Ḡ™ø ß èuš:Ò0i«?€?0W €kH7€Z`fヰ›ÐD`]€Eó8À ¡0ÖÐ °›]Ø*"ø¥ ÷ÃX;À@ÿp ƒ`x%?@ž±µ‰«¦‹zy ` Ã0^ä.Ó ""R›?àº9ižñVp J0‘t‰4ÈGðlµbÒ  ‹Â¬°æ ͉ð ÜÀ Î0 ß0 @>š·¢ÒÐ é°îS  àpH…E ØÀ Ï@ª¶”SÔ@¡=€a@ ܰ ±Æ·Påð '€¤´ÔÓ$ è  ß  ॆ©mÕ£ Ø€†…Í`Ï àÕð Üp  ß°iã @ÏषöÁÍPš%0 Öà>å ð Ùÿ°Ab€9Ð è é  0 Õ ¥¡àz° ?œæ;Ø$l®TyeѰ^ `U.êª@ Nš ·ô ©4Ä À»Ú=0š`G#ä p ÔP9à ãPšV Íp¨P°Ê¢Å P åÀ a€6G ßPǰð Õà àP êɬ° °‡0 Ãð Åð–qÙ Ãt  HÐÕ?àp;à= J   Öá æÀ Ð Î àp Öp cçg” àU¦UÕúseà“àl@ ¿ÀS¿P P|Øhðrÿ>rÜÐ p` `¡áÛÀ tìp a “pÔ@ p åÐÌð ¿0¥@Ì™V¥uzFœ€k Ì0v z`Ò   é¬ “p©ØÐÍ€  çð€HàHÑÀ µz=«ëZàA° •´ ¸¤ èä p ÔËP 0¬@ß@´‘2 ÅÐ%èP €HE… åíÀ 0P ë`: %<è 3 6+ê L… Ùðîéæð5²À r ?4ÃX ö "@z€ ÄÿÐ|ˆv e0=°ºp  ššÀ½À ΀ aà ®ð θ,IeVP="æ ¥P 0 êp §P Ô`ˆ/ÉËð‘ < ÖЬô² ‘r ß0¿[àÕp €¥P¹&vÁ ÏÛ‰%2ëp ¹R ÒÄw eÐ ·  Ñ?Ö0 æ€ PM€å¢Õð P ÛÀ‚æð©Ó Ðe`VP§ñ†8u ÓbÖPI:õßP ¶4¬p åà  ·?ØÀ ¥°ÅGP4Aœ±Cª¥[ß@ "£/¦çÿPÜÀ²†¹`å ª’ öSÑà P ÁðTÛ O¨—9•%À„ð—ଠçÐ6P ǰ Vд Πr°p ¬  ì@ ËP @“ eð ·Ð Ïc&œé°aß±r èp @ ê Ë@ Yÿ`?N¢© Òb×ðbV° Ç` ^L‘€ »Àš0ÀÕ@<è@¼G J3 ¥ r° PÈð ¿@¬ä=P×àΠ \×Þ“½€ÄÕ¤uE¼ ¥€M=€_ÁЫÎð ÐÁBƒ¸b\ ÿ`Á €Û@ ×@ ð yJkŠà×ðK  Î ¥ù ð·ÅS^½0 ÀŒ+ßBË %£ä °¬P Üp&zn@+šÌX€ºW!%PÊN¯—bš`¤à§0ÏðŒJ  4@Ã;~]Å*`4ä `˜¬ aÀÌÁðÌ1¦§ ËzP¯âW†$>`=W%+G ì û# Ê0Öé !Ø¡P9Ð #Ü0ÔLE µ `míàðÌ Ðzp0 œ" rà ¼àÌ0Z€ÆÜÀºÿ` p›!} à@PàA@°¿VPº§Œ ËÐøÃ°ÚšÀËÄ Û}½¢†y¶ ¼·° ¯­å¡€€èà°»ìbÛÔzZк Âd¢ž°G &S|]ÀÛn §VÃðTã@ 1E¬ytÌX# þ À pG[#| ßÀ ­˜D OzR¡ §;KÕðî  ÍÍÑ=½ ѼÜ` rÀÛºð Ûp î J@ åÐ À"èÁP”šÒ'­íàÇ€öZ¹^?{5Ê ÀRÍa` ßÿð Ói'0\Ö°¸º Ñ?P©œÖðì  p, ›6 ð%Íp Ñ k @ < •7ÃpäßÐ k- øIÁÀb‚¥“šÁ'-í€lÅäº Õ  p ±òÈÖ$ð“Òà P“'Ô6ÕÎPÛ V4ÜpË7Ðr` Ù·ÀVͰ ä Âµä° ÒPIP¹8À½@  ¡'HÀž7PeèP€À5hðm“­,=såøA‹—RŠÀ_:?š·=ñÏxRP A#= @€4<(Î rÏ”ÿÍ §áÐø”ÆHð€™11¯¨.Còœº \(³Ò B£™©Ž @ 1%ÐúçƒMœÁË0a ˆ0€SèÌJ°¾®× Óà%pHð17 zRƒRY"ž² %³š­²½yÖUˆªw”^¡”>òàQëÙÈæ©—JáØP ÙvéP éà®"PÙój‹´:ââQ%ÿgnÚ ·æñX#àá nã)Ù—LW‰5pw,G ßPN“ŒAÞwú¡ÚÈâ0 $P³Ë°–"ŒÚ¸[ÿÁ K‹Yi%À˜>¹A|ˆ’åu¯ 9@@à^npʓϭ‚ŒIA*‘†è?QB€À2bàÁ¡ '`8C@ 1,zð€bAtØ!DÁp`À소Ž-[Jt)f‰‡7TÜp$Ç0È(q#P sHD!SŸ%btÕ"†—Q;ʼŠ«Õƒ;XvR‚N®1zDD+Ù´h}F…èòŽ;¬ÆŒèp© œ80}QÆlŽj“­Š—1”ìp ³åÇ1ìVuyør[®˜«Z¼úÙsh—îâ…ùµ# š 2h¸‘!CàŸ1ÿpÒÑ0aË‚_<:”F /XJŽ(¹ç0”KЃƒ<`{ÚjóÐX)GýúÐI«=1<’/JœÐ*CüÞ`P€Û0r¼ýN¢( ¿\¢ìù‰—8€Û˜Àp wÒ 1¶Q]TrøZ5¬ÐÞ’CÐÁ(Љf¢ZqÐo+ZpU”` ¹8Ü&F‘GBQ E„ Ó-€B¤ˆÄ,ô– Gpà¦ÀÀ'Rq‚cƒŽ¨„)|À,ÌaSfá¨âB:ÐÁ‹r±På€P0Í60ðÿ l>'”C6~!!-5@è8A¶ñ‹PàèÆÅ„ øÀÉÈVÖ7~à€IT#Ì`À @cϸ(ò/Ь„o •PÀ5¢V-°¶ ø:Ú^”ã,ØÆ)v& „ Ùi”€,ø¹ÌÍpHä` Ÿ$üÌ €Î4¬çP ðàé €(`¶rCj¶–®aÁ†OŸ*FUÌÂ6=—µ°eŠ dB> )œ Æ!NaSˆB’  R ÂZˆB*L!‹O¬À±@*<,ðK*Af‹UÌA@(Z±€ÿ ÊÜÏOjÀ’´±âÑ7ôP ušÔ¾4ÇÆ£z°Â9±†4†RÀÊ@(ÒñÜóp¼Â–aìF)ðÌ(!“x1¢1Ê[8@=À†hè1™†g8s˜.x€cøb(Zk%i¸…Øš–H pŠ; tXMˆ˜YùºMKŒ €‚rˆ] ‰i¨aˆ^x€P˜ëz†³Y†g8†„2¼;–X3H‚,ˆ‚)Èlj3˜‚3ð ðœ(@%d*X‚8ˆ‚8`‚ 8T`ÚY!P60ƒ-Èà‘88ƒÓñS˜ƒ»ÉÿÖà’¼™‚È*Ä#øaŸ¥‰€‚[ iP‘ φRX†0¨€H7@% P‚`H†lª€R°,-¸»è€P† À #f fÐÐV €Ð+ =e… 8ˆJ!†eH %¥ô9‹9Ñ¡2À€ 9X†`ð¡—¿°²à€ù¡Íh ¯C.åj ab†^PˆÐeЯëeà¡ I †d˜„ ¨5ÔŽxqÑ€×ceø–|¬×8 ˜@ fÉ%ŒËñ*0š8—ˆ·\y:¼ ÿÔÐp=ÉHÑŽ=H9/a€`ø†Hƒ»]:²ˆ‹ÑêpUi˜«ˆ€pFÎŒÁ˜ˆ 'hûP›©Ž“H€ Ž‹I€ˆº`€²ë‹ (€8籨 É´}ê'ßH›X€«Èš€žÑ¨¸ÉŒiGw|’°èØrZŠhû¹IQPûé ‚ÒÀÜ— ˜€yd‘%hŸ€8L8ƒ((±¡8L˜Ìh˜ÈKíð + ³Z‹ƒSà€Dy]è…ˆ›äà•Gé ì¸ ÛऻØ Œ¡xÿ¸-;Û¡ÈÆÞ¤Í8ÉÍè(Œlìݤ¨¸’x»°F°‹Š` |[æ|ØÛ$N`KcA€À•ÑÈ‹‡°8舧àÀ¨±y À §({ÉÈ´ŠŽð€XP‹<ó°'íL …xŠ´ð¤RØz¨‡ Ý]€(ÏÑ Ê˜(0Ϋ,QõQ¹A€òãL蘉ÊP€h À¦ÿ€ÿy”ËP8ÐŽˆˆ‰€O— ’#‘KíŽÓÐÎê€Âà$‰è`…øøÒè… ‚55S ¯ÿ«ðŸ]Ó4Å; èˆ=z 3ƒÆ…°8’ ‰(T˜LÈ„)è€"©ê4Ô°"‰àÔX°ÞˆŠŒzYŠˆØÔŽÈý‰«ˆE­ k€Sø‡}ðØ1¥48Ö`Öa è8 ÊlC±°û*ÊüJ  ‘ðhØT(TH‚Ab¡âH²:Ì`ÈÛÿ¼’€O ÐV=ÂSÈÑáé è›ð"m@ 8…m°†^x-e\ÕU^õUj$Ö‰¥ØÿŠ%¯hO…QÈSÈ‚ ˜Ñ#…)и¢Hˆ6`/RU8ƒ ˜\˜‚˜3ÐTˆ!ÈP`hs!&¨\0£ ðXøRðXذŰ)…Yø€9`ZP ‚ hšg˜ X¸€‚;xWØb ]È]¹Õ\ÝÕ^í…_}S‹µÛ»­XŒ…JàXPÈ„ C  ˜ƒZˆƒJ¨6 *Y8ƒlQÂhk.Ê‚MHSÀ„VЛZ¨ZT… 8„\0JÈ…$ÈU€…(ØØ`Ðq±è¼)ÈH‚Y„$0ð@l]X€pÿ*¸‚ °!˜€`°V˜„0R´ØR‡ÛˆÅÛè•޻ݨ,à5;xª,8HS@…ÀS d«VúJ7ð¯,ð#°§b½YÅe„TxQj‰…8ˆY˜ `ƒYаХ3øSd“ [‚ Up„(ÀòS“žØ'xƒ4 ƒ;P^q†tø†[¸2ñ$ç…Ø¹íÎé%áNÓB/FȄȅQ˜‚¢òGH…úº¯e³SHÿš°HÈ‚ %…9ð5R¢Xú•€"À…8Y ·8…ÆÁ„UHÇ!à3 …+ô3ØZˆ<ºغèØ€ 0ÿ° €^ †o(¥aX–ÛXÆã<¶µ 4Ø;P¯/âNÄ=0ªÖeû^ؼöÝ4ˆ‚øŠƒHØ„)˜VRèßšƒ5„\XhS@÷j÷@H2ÚS…x&Ø‚Zà ‚hÐÀN­#ЃIк…Ër[:öÕÖãeffcÉØ,°„8„HÈ€8 …LÐXpﯗńOЀC× Tá3˜€OÈ„(‚X\˜©Q(×8Ô3 (§Ê–(à€8e(‚MPp‘"ZFxN«a]P€hW>ÿ …¯9‡ex‹9†Û¶ãföè¾  ÷ðψWˆà€ xŒ( €W1—Q@&x‚}Ë€?»ÞéÐßq‰Ö` pê=Ú°qy8`ˆ¿ —À Ð…SP¬°Œ·Ý‡³®ã…éµfk¬° Ð ŽÞ˜Ó¦°– ˜ ä=!@…!DÔˆX–Ðx *Ø`Œ–PPi ›¨¶ è)ÏŽ°]ðÒÌþ‡`¨'¶öìeî’ñÂë­ëà k§@ 8 x`È(ëˆÔîˆ:­Î)5–Ç®[ÿŒ°D›En¨k nn˜ÀÆÏVn&Š%ŠWíˆæ6í¶¹ˆ°Ó–n-yKŠ €ïo\îñfnç6oÕnÒvîÚnn$ÐQän©ŒðÍHnòÆo<>ïóžôÆîýöï.Éï'pŠíôN4Wð¼æïwðVOðîìFpÇð ‡ËU —p]o ñÿ!q¯pQ=q'ñwñ _pþÎn÷Fñ·qq—ñWñ÷q×ñ —p¯À7òñnpoïõ>ð?ò'ÇïïoÅfòñè6ñ"‡ò-ÿèöÖŽ¼îð÷ñs.7sÿnò2ïðçÑ0Oqÿ†î3—s=6qò;Ÿó<7a·s%Ïñ8×ó@ÇÛÇòOsôDÞ,U27oßqE—t‹ÕñBçpÞòI×ô`Ít<7tßôPQ?¿s?õSÑR¯tRGõV‡K8‡t/‡s ¯òçvõ['¯n6s"‡ ¼^s\öcõ6¯ñQ]ñYöe¿C?p*v o §rf·öÓøpiWu1ök÷öd'õp×òoÿöY÷Þpv@'wo?w>ÿðu/÷,÷X¯uD‡wkwövçu'¿wfïôGwô|ïw|o÷‚xk/xs7ôƒötßöcgxÿ‚¯p7÷%§õ‰øeWöhG÷þ~÷÷V÷Œwõ‹gu0GïŽù[×öŠgtOyW¿t–Wø:yTÏ÷¯`uK¿ðš·ùý¶ O¯øçùI_yz—v£õ¡'zy¿ù!?z¥_ú‡7x¨ßô„ød§z¢÷x©oz ÏúI·z®ÿúDû©{=çú°?û@/{©_{´o{qû<ûmŸû9Oû¼¿{9¯ûpßû3Ï{µÿ{(ï{Uü-|±?|ÂOüsßuô^|oü‡ö)ü/|Ç_óѾ| ïúŽÿ÷§gp$]ñå÷Î_kœ÷r;ws¦grË¿r»vj—èqÔ÷lšÿ|‹'rÿc'tŶ}òþx!Gúm á ýÓÿ}fz™Ïü§¨Ô¶õäÿìà7õ²wþÀÕ¤—~4Ç}%gþR§D…þíWîÐÏ|Šn¯}ògæóoùp/möO}÷ü¹Ž~ùïò$ïuá_þ®1,hð „ 2lèð!Ĉ'R¬hñ"A%4j̸± Ç!eàX䯔S PY2eŒ-Mb¬ió&Μ:wÖT)ó¤Ç‘>gž$9Ó%ɤ@QÒ,Êó)Ô¨R§BMêÓ(Ó«Z• µÊõ`ȘA—R-kö,Ú¨[K¼ú²ëÛµ]å J6-Þ¼z÷œÛ1«_‘‚GÆ…vë]ÿ¾Š3~Š8caº'¯)´1æÌš-.*÷3åÀ–Ýn.mút_ÒNCƒn=w´I¬¨gÓÎëuíQÖ¹].[uíà©ÎÝÍú¸dŸ°oîÜ&òèly¿¦ûü:vÎÔ“ûK”òï¦ÙÇ“Ox;6õÂÝÎ×òúöåçÓÏR=e÷\ï7 ôglõ HÞy«y†ž"½Y€4ЀÈXH‘ÆRo¡%¡„^×YjÒE· AzxâsÝ…È]†,"d"Š1¢vÛ‰¨U‰2ê\q«Ùø£xí8äi8Ngƒ@'$‘MbÖ‚JŽhŒ²9y¥vÞ(bE)#–ÿaR$¥‘#ÊçÐ@7ÈÃz4ÈpÃ’bʹ”—dþ1×Ð 9§Ԝ6d˜…A(RÞÅ×eKbô“ ‘š§Þ¡€QøW¥öÕ¥›Jú)Cqâ)™Sÿ}èž ª*‘Š–÷Xz-=ªÐ@1ÀpAü¹êªÖª%[¿â¶¡8œÐçhò*)˜NwãwR›£•˪'™QJLJÕZ)…²>»Ý«[~{nC 1(ì–¢¢û.b“±Ë®ºïÚkP¼Ù*X®k÷úkj‹Ð p³.ýû¯|fRŠo~|¯žcå™è™ÁæÕºÞ>Ìkĉ)`1wæÆç^f^¡5î×#‚ÿ–üíc–®t™‚ kú²½ÃF‹¿Úî‹3º­¶k.ÐðÂuTÏú]ô·*¬´»L«:4‹SJm-ÔT“|5¨Z“‰¤²\z´ÚDzÃb/{r€S ½m—ª¶ 7k{à`xŸj±AÒ-f4Š«'á5/™çßr[0ã†?*ïÖ‰_ièÙ);Ý8ä’+Þ™×Iç§y˜œgw¢ O®š×Z›~zêYG½º‡®JôDOŠí°£Õ:ï£ê©ÈÀç®{c½»M0{veZª`ßQúsØÄÛæ]ÞK·—¶ÞL÷©ÜÿÜàÜ[9üðÒG$¾ËÉ»ûÏ;»ßòìÛµr¸øqÿîÿ›¿“· ŠJþýäö¢ê{Ó¤²²¢ýÝd}O›ÝÙ"Ø2®l{ˆbž¼W8¿1°v–Ë—¡(V&îàg(ýz\ÌxÖÁ,e‹t>KAV.‘j…¬’‡Ã¥´ y'³¡D”æÂ’Ëpë›Wù€(3ÑxêÙõèG9%:¤_N´YXÂ)RqPVl!ä²xEåu1]c>4m¨´Ð }؉Q2“…’ ‰Qà‘nÒe(5–mâM!ý™¤í§ÏŽ%;câ3tK…ªÏbõƒÒ7µ´šš*†jü§ÀbªÑ™Šg“#µ' ‡ƒYNè&–·HM&oS¬ž¾¸s #¬ ¹(c¦²·²ö`wÓd×öøÈ¸ì0~ŸL9s]wÊT~+Y Ü¬ÛšÔËE®û|jɻѓ¢FäïÌŒIc¯‚wdØœ… ½íur¼Nqœ‘4ÀKZØ¿ýC2Š,g Kv¡p¶ÓzÚª±Ã¹ø¿‹¾*Í’šA¿™Ó6MlJ—§—¶r\ì"‘.ºÇ'´ì¨êeW«pŽ´¨›‹[ýš™Öi•s:1 j÷s&¯Z¼EÏPV¡¤œ%1m{êîÍ*‚g>±‘g¦Ò‘½mÌšdÿæ©EæJ ––—àC-Ò h½e†[?~T³u jaGö§¡]´ûê˜Êo˜m]*®iÍ<6º–ÞÑݱ¯+ŠÐóÚ̹&,¬åÙë‡ÛºÞ@ òŽ)NãùvÊ g¥½¬qsã2g‹¹Ìp6¸µøÆ³ÝÝ2R´Î¨ÓéãøÜî<—ùÐíÓpyµ=nŽþgç·+mdI›»Îö/â~éƒ[M¸¾™ÍÛF¤¦“ÃçÕz5™–£”ã!ísDëðØÊU’_·õÁ“¢œŒMN¸Ó'ˆõvýã>Kwàæ*r»ó•ãX2߃ýò‘“utƒoåXhë½D"Ÿcó.ÔèB~¦",º)ÿ==íÇVµ?çì+ݹg°<Ѐ׶…GFZ=Cx›{s[d.õÅɲ¢wû±‹êú€ZÝìÊõº¼S.y§’Þ¾’vÉG¨:÷ûæÝܻƛݶXÇú¿©³ô­ãº^hðÞµ.ßÞýÂO~[Èï>1—þÀoœm)k7ÅA_µyÁ_˜íÿhc/Eóà¸î¹c9í8”ê›´UÿáÛ]ÌÜgÝžšÍ˜¿z]S]N8©‘ؽ͞õ]ÛÁž¥9™E=_¨ù{ •\a×á\‘}™Þùžt•:=—òi øE™=io8ûUÜ|EOŠõ`Èñày©@%“‰Óhÿaõ€ž‰é_ ³’…”ã9\¹yÏâÝ’å ¹¡VËeѹ҉߰^¥”~ÓÕœ “¢ÈW.¡àòÔŸ‚ß–‘JóiRF ÛæåZ¤±ó ×Ý`üØî9ß¼ÜÇݨ%ÍŽ_ïa&û¥Èu">"ÚY‘õ bù)ae­ )ö“héË%˜)B±eTðÅ\çÅ]ÿuÌ´- uqXI¹Ñœ!Û…ßãe[/VHµ!žU "ÚFI RžgQ&áñU_5bÆÑËnHâýq nÙÁ py¢Ñ[†["> ó£rŸÝUR âR"þ֞͞^Ñú=öÉ–eW—1•‚ cm`ïí"FX–UŸçÅ"çTBnaœ­ÎšÞÑÖÐ¥Å磇‘„—HYíhÏÅKí¢„é‘õYÔY?ªWxl# )œH¦–.–$ªVîM…Üäœé}—hDK6d÷0TAá…-Þ—„@ÜðÏ^ŒÏ”õ¤o°U•8.–Ÿ2Ž¡p8åOšV¢FUšdW¦H]ücX6R•凘”5¢¥W^²%°áTÂå^ÜdL€ ]ÇMæås!ù ,¤!ù ,¤!ù ,¤!ù ,¤!ù ,vQ}Ð` Áƒ… ä¡C –ˆCƒ'2X P†qô(!ƒb‰; ’,q£ –+=~ü81†Œ›&AªÙòeKoÒ¤x³dŒ•;aúŒù1hÍ¢9K$ý hÓ¡E"í³«Õ@3†ý*À«WƒcÏLKV@@!ù ,¤!ù ,¤!ù ,¤!ù ,¤!ù ,¤!ù ,vQ¦à` Áƒƒ Üp¡C7îhPj½z÷é ð@` =°úGòŸ¿½18ñÔ¿}þüíC™ ‡G \”IsË:cÎìUS@Œ!ƒò$ês`Ë—BiÚ<ŠSéÐM>Ýyu*ÒœP—bcë¾³4ì‘@WÉ’Á ôø(P=ܪYÛËm’cÈÀ0 °a € þуñ‰!ù ,¤!ù ,¤!ù ,¤!ù ,¤!ù ,¤!ù ,vQÿÐ` Áƒ"6Œ„%@Œ¡0áÄ2dèQQ`‰104ÀQBÆÇ ì  §žËzôü)+Àq F“1p£DnPÐóÏ_Q£Îü@q`É’ @pØFŠ;ÈñÇÕß¾Íh¼ù± %V(À8Ñ£ $ˆvýÚL)Sƒ%v8Е.6e ˜“ÓÀÊ7V]½‚-ð‡F7oìe§%‡¹P¦%0Œ–£Šë.mêqGƒ_×0˜¶l@©r°úEÚ@=üPd‘8P4dGL ´¤!ù ,~QÿH°`A, ŒQ"!ŒCÀ%d\ðP¢@KÀ(£GiûèÕ[I …!cœùc¶þþé܇¤CEƒ7:ˆÔÁCÖþíóÇ”çKƒ ‰Ü8”’.mÚó§Asr3W.ZV¥LýíƒòR‡ÀÔ”†­@)t]` E -WŸ¤ 4'PWfétñ×lš_µl&spãš²lJ ,;÷ëØ0(ZÓòlpX„ šÀ–˜´#tÓÈ õPØAAW¸mØÂT{<ÚkA #À8²ãì¾ãþê)yj’ ;üðM§õJ@øȰ;I zq$£f­<5" $‚d¸^FƒâÃ'áQ`Èõ~ôЯ¿¾ÿ…!ù ,¤!ù ,‡QÿHP€(ÒˆQ°  ;–˜(ðaC‚1bàxc  ?2|(£DÉ“%@¡W¯e½}Ô „p’f‰&KÜà dß¿ŸþþqÐC`Œˆ dИX‚ˆGöù›êÛ€™"€ÁƒŒ% (yÐÓŸÔªD>ËÁ™5gåJåJõŸU¬¬°Ök€4l ~q;A׬ݴum£6€Ú°š¶•­{·a°I¤ Š”zS [-*°œ@=ePÛê”Âhñ ´¦‰Á³a4U{-izHzℌ޼ÜÇüðL‹Oo攑ü§õßü`è1'Î’%zP)³F¾·_ ":œ.½Ä€÷ï0ØÈ Ê’8ôÐÿã‡ú‹4]T_}!ù ,’Qÿ,!P  7LX° Œq$HbC1nô¸ÈÑ` Kü( l_½“'õP2FÈ= 4ûçïŸÍŠ"ìà°£D , ˜¹ÏŸ¿}ÿôD8HÁCnü`@ÔhÍœ]èUmƒaΖý+j4éÒ^ß„9·f¶RÄÆZÅA"8" ¨ý:’î„X²5•üö£/i\T-‹U“¹ |S§+ÀâÀKXûÁ„³uG†Êe\×g‰%NtØ!sì¾×þ»t R†Ðg7o*r°CáË;œâVÍšµâV8Ä8X;$ŽH C ˆÌC‚ðãGï?®; T8Þ¢ˆ!ù ,’Qÿ8°„ 1$ȰaÄpH‘â~\(0aB KÐHAÃ` ðꩬ·Ï\‚Â8!À I1JÜ @ïŸOÿØÐ(à†@7 Š”Q’Ž =÷ùÛ÷o]ŒUüØaP9e”Ø¡§¿©U‡ d5€µzQ£`rGŽ fÑZÅ*€sZøÅ€+‰=xþ;KÕ*ÑŒ~¢³ÂAÇ 3ñ.Ö{uà‘¿Rk°ãÆ :3N«1”€ ÞrÀjP77î,°G u¼C‡ ª9¥¹pƒI°$pÐà@oê>ªéðåX3¬Rêù9ßnÑ„½‹!£C4lÖ¬UÃv ô ÅêWZ À€ÿ,~í§_? ˆàRÄwá!ù ,¤!ù ,Rÿ( A vÄpƒà@;zôØb”QâF‰:ÜÚW¯d½}§L£D :nôHÐ럿6ÿ±b°C†Ž2d@pÃMÉšûüùÛ§3ÁÊŸ¸ Eä迤KuòÔÈqGƒ^å°UÕuU)SVN¡vu §”HÍjUèrã ŠÆA)À«lV´=`øìA¸·qÿòjwÃ$tP¬b=ëtcGP¢K.Xⳋ-LjqäÇ(Èî[ ú)Ç>âð §í·(TkYÆ“¸Q³f­6=0dC…¢@A9ÁÞ.eüè±ýÇëË3:Œ10 !ù ,¤!ù ,¦QÿH° À  "ì!Ž„2*Ð!FÁ2ÄÀ±ãFB;ÊÈ(°Œ2PªŒaR€Ž“êɬGÏß° O²LÉÓä 9húçïÑËü@„Æ%8Ü(Á²…Bÿíóçoß¿cæ8Q¢ V0ŒÄ ÃŠ’C·výZ`©€x•cö­„°qã&GQ®^Á2TÒÁ/uGʤ³’€Z´VˆLÒŠø_2¥Žˆh¬Z#ß)àeÎÙ)q;+ „ƒ_Õ@ù6‰Âƒ2¿ÒÝ’Ãyîç¥Jr0f-sŠ0h*ãÀš²2‡çÎæ¶¬.iέ)sr ìÛ·i>6s«¬nè%NœHy† ~tHwŸº=Ä=í„%ìàÀPF5È h+EÈ“8P6ÕXc 5Ü„òOõ$â@7`0À‰'  ¢J$ „C?ÐH#ˆÅ(޵Øã@!ù ,±QÿHa ÁƒâÀ@‡ ô#¡Â=Jñ£‡E%b„„qãGkûꩬ7¯‡7B–Ùá„ÉrÿüýÛ¹/ã@2tPPRìH‡ßþíó·´žK7‰qBǤtм HºÔŸ¿z;4 Ŀ逮oì°YÛÀM©×¯?( HÅ VÌAá°Õ­W°b”º°C™ran õûÕeE¿€SJ‰Å]‹  Y‚PÐ…Êùm½¸¥íÝAAظm"’¾Õ,à‡€ DÊÀ CI¶û‚Ãñ8™7@ì€n§s:‹Ôǃ`ܪYÛ>-‡€ÇgŠ!ƒA€èÏ¿<²}Èã{L(Ãâ@ð!ù ,¸Rÿ £„€KHAÆÀ‡1bôØñPF 8&„Q‰7@@©G’ä¾h~DãÇ$tp°âïŸÍšÔR 8& B ŽH”aeŸ¿£ûþåT‰N”0H(ÑòBÑ£þ’NÐ㢀jX"ܺVÍš¤#F‘*ÕY®' VYiVMIÚ¬ÿ¶vˆA…PÖ¨}ã†å®V|OÜ0×+A¨me ¯Ý+€ åB)¨f®0Ö¤KbÓá6iϨEþбºmTȹÏß¾æN l°ãƃRå"àˆé¯êQs8—ÞÀ¡8 1†þ³ŠtJ zàˆPj\†õª-›S€ƒ=´­ #ѹXÏ&豃-81¨’E—uáä¤ÓÓƒ†L²IÏ–St¡ÇŸÑ8\®úqÝ#7`È8qôŒî»z2†€%J$Ƣĉ£3g® PW†îãÆOH³Æ¼·apØFX¸õ Øñt×­÷ ø1~üŽï‚§ø= !ù ,ÆQÿHPA1Æ0ˆã Ã# (1±âË f4øPÆ/r¸ãF :üòG¯žË}¡ìHQ‰H'`€£Ç€aÿüý ú¯Tƒ†vp6ðFŒ9rœØ‘è>þöý‹9“@È „±ðÄV±jÙpAFˆÂä‰hÿ]ÍZT¦À0â‚°#†S’gÓòe;®pvàˆAãÄy÷®õË@‡ŽG ËœX¯Ú­GD¥1PÎ%JL-­¹ïnãDÞp윀 :d« r@±V£ •Ô¯KÈ ‘âG‚`z÷iG=ó¢ôï?8J¾oC5~—#‚&nÔ¬Y«†Í …óe|_H!À€ÿÿmpÃE4é§ßB?ô`‚ø˜F!ù ,ÈXÜ @‡Ž* c!‚%!ù ,ÐQÿ8°D 7*\(ð  K€Ñ€áBƒNУGŠ…2 –¸Ñ  Øí«Çrߺ;2–)£ƒŽ#764÷Ï_ÏòÄ8³Ž®À•ûVjÏ}þöýsÇ ‡@fÆ!G”`ë(ÀûU*Õ1Jè€(ráԉíéÏ'U«i–Ø!Ô6u·œ’:U¨F‘!KX)嬚ƒ§„ïÔ{ãƒÒ)j7جa¢!qT(*Ì0vGÜu.Œ—mŒˆ-ýƪϺ>áÁ,2-‡?4`h zŸñ© ZçYDŒ èý›>}ž´‹êÅq¡6kà±5‹PC¡ÞÞ# X¿>AB“µíø£G}åæÂ?¨1 !ù ,RØÿH° Áƒ*\Ȱ¡Ã‡#Jœ1†€(jÜȱ£Ç ?–°cÇ‹(Sª\ɲã 2JÄY"¦Œ–8sêÜé‘ š1gÆäI´¨Ñ£(à¨ÉÔ&Ò§P£rTG„ͦ5¥jÝÊÕ`:"%°:íJ¶,T7„Š5˶mNjKÅfuK·.Ht¡",½:֮߿×iáƒïÜç^¼xBa¹WÔøñ£åŒ3ÛVîM( (P`tŸšS³•¡Ö° äDsF»Y49>«Þ­ÕuS°uýN¼W‚,ò^~ô¦oç°ú·¯ú¾·ì`Îý©ë°§ïóçﺮãÉ»«ßé|`{ÑoQ'=ûöõø¡†Ÿ_þßyäÊå' OññWŸv&ÈÓ~ãõ÷_z F¸R xŸ„¢Ä }þ¡`† nD!‡ö…h"G°ÉGyxâ‹1h]‡8ÀhcD;@¡ãŽ?ÜèãC%`ÀÁCz Ї?&YPZL*‡¤’PŽå” !ù ,¤!ù ,¤!ù ,¤!ù ,¤!ù ,¤!ù ,^ÔAðEŠ8 Ø!@F …<°ð@ÃaŠŠ).¾ QBR„!£DF^ôr"!J œ¹QFŒ!GÊð°BfJƒ4XJ¤³D Ÿ4jÞ)’¤‡’GQê²(TI+.Íé´äÕ©8«Æô*0†VœMwzí(à†Œ a‰Ž-!£¡@›hu>¥ËöVªrùÖ­ÛpkÚ½%ú *pè˱ Úl|8±ÝÅ dKøn Ê#xˆ¬øoc±¤%ÝTtjÌ X‘ZáêÈ·S!ù ,¤!ù ,¤!ù ,¤!ù ,¤!ù ,¤!ù ,]¶@° Áƒ¬`±ã‡C ,¾ x €‹ ÀP!r¢5sæ¬Y49hœøQ׿—0{%øqðã­ûöùÛ÷ïVƒ5ÜÔ¹óŸ®=‚õWô mâdÊóhÒ¨B§6}*ƒ ˬD«"%X‚ Ô°=Ÿ,!ã#+­b¯’5à-Z§P ºÕêÏèX¬vsŠÅA (J (†B¡8Hžì` ÇJà±"„åƒ!ù ,¤!ù ,¤!ù ,¤!ù ,¤!ù ,¤!ù ,]›@° Áƒ „Xø"Å )F€À 4d¤H‘!R„!£ÄFDühcŒ%PÒ8ÈR$I+b¦$Èò"—%bĤ Ò¦ %…mùfÒ¥F‘–xªR@O—N§ŒÁ³èÈ£%K”AãjÓ©ZÇÖü*U¬A³@ÃBe¶B>ã"$h@%]»d쀰`ƒ!ù ,¤!ù ,\´ÿH° Áƒ*\ÈᇃØJœH±bB33j܈PÇ 9zð`£DȉNnä@Фʗ ÑáL)˜„áñæÂ4zö”á§Ï£„#Ço=Ø£‡‚)tÈXáR¨cĨú‡Â@ĸ±£„Û©wìè!ö` =vx[jŒƒ7züÈ RC‡SÂEÈÃß‚o4 €.`èy×A³«…L£„Äbt- B b+8Ð1:t¿ $HP”µZ›Ä€¸@Ñkl@\àÁG rš-k¦Œˆ5Óˆ—°Z,rbìÿø+·‡G ºœýª€ƒ•eÏôP¸q«RŸô vfYó¬Å ÄHW úÁ– [z@ÁVšœBÁFíP–@_ÍeÖT1€E/ÍÅ GÓ$Äs%`1L3·°XÐ ”13º ¸t°cN0=”Ð@ 4àf‡¿4@j%8€Ø|(âL:ÜP‚§¨sLtÝÀ¤.ÐÇ@0pI2ÀA;L H;Ì,³N0,PÔ `€ÁÖh€ 0C n>ÆÀDA 0_A8D ˆ4†–ó¬áp3߸ƒ$C2è<“ßq7L  ;/²ÿB‰)%@Ô@ $ðrŠ2Ãô€ÂaLÇ ;SNªëÁpJ3ÎL²Á èñMôÝÍ0 ´ÕC3ÍL‚Z½”²Ì/:ÐpÁ%ÏèÒ‹Ô5Sz £D ó€0a€pA/r”Í:ÕD3IÇLÊ3^”ÐÁ4x€4¸õý8 ËY ¾Š£ˆ†3Ôø MD`cñ›Ðw ,` 485X±`#ˆ?`@2¤Q,à 9„B4Žè P7¬Öƒh˜#)1IrP]8@K<ü tÒQq ß Fâ'¨L ~Š@Ða5€ ù‹Ÿ6ö—ó/¶Â•®jЪ@Õ¨@"-´£ `À1¤€xöâ8À6Ò‡ÿI˜£Ω¦A pzƒFfEHCúoü`×Dœzí€Ø¢Y0ÒÅ ß(E€Áh àÐÖQ†ýqƒ„Øh¸áHx ±ã@ e~E®ëÛN¦q€Âð˜I<EÈ ‰H€Ö¡‡ x@ Š(@ÿéÂyñ%«û~îš ‡N·*ýw‹AN—0¥ú[:Ô©ÅQ“n¥jµhV±\›:\ù2ìÔ¡Wo !À¨Ö´^ʈÑö.Ó¸sëžÝG˜i^{wöüǘq/¢äÒ@O5i˜¥UÓCáªÞ+t=€ކ’Ž<ò£uëÓ÷ @âF 7T¬aêÙ!tÜÆ"¤ì†+A÷!ù ,¤!ù ,¤!ù ,¤!ù ,¤!ù ,¤!ù ,iÜ  P@:f@8”+(@A6„ÆC$t@Ù£B=)ä‘F&‰ä’J6Éä“9zxXPy•Œõñ!ìýçå"^ f€þ‰9c|h¾G&AÿÍçfšp¾)'{RF'ˆÝ©çMxÔÅŸ Ð… „*‡&Šè¢ŠÊ¢rÑ…¤”Nji¥’.4覅ª§ *j¨¤Ž*êS“6Ê說¶Êê«®Æÿ 묲ÖJë­¶æŠë®ºöÊ믾 ì°ÂKì±Æ6Z§!pB xPÑVëÁ@Òz B œƒ´ðA á ÔÁ $ p‚ÔvàA eËí¼ÙZko·çæ{B¾÷^[¼×|ïÀ×’ €Á¬°G 7¼ð \› èVLñÅgŒñÆwÌñLJ òÈ"—LòÉ&§ŒòÊ*·ÌòË.Ç óÌ2×LóÍ"T‡@p„ 8@[B mô@1”`C” A1„B +” ƒÕM{ ƒpB5¼Ð´ $ØPöÙf§öÚ0ÐöÛn»½¶Ú6 ƒÝM—€Aßÿí7ÞŽ·/nøá ®ø )°€@ÐjtôäEWNùå–gŽùæšwÎù瞇ú袗Nú馧ŽúꪷÎúë®Çûì¥Ë Cãìl%A´­ƒ¨pC 7¨ ƒ IË ¼@Iˆ к*¬ B0ÜÃðtÍî5ì°ÃôJÛ Ã :Ø`~ùÜpƒ 2˜ï¾ %¯ƒÕÄ«þúíãà~û4¤Ð? 1à€@á%í€%ÀðÒG¼ñ5px5À@ƒ»E°ùÝ@x´Ê $;ø`BzPÁþ %€.Ð$x0 š 'X§ÚÍjÔÚ8š¹€`kÓÿdç  aÚ @|@à€21 R8"˜€&0¤ Ú³] $ ¤àjhœš XÐ5 ¬ +ˆĆ;‰ ®q,è@¢‚ôñÚÚã €t€Úò(`ÈÄQ{dá#áH„à!È$ ‚8î’@: „€(À(k€Àqpd:KF†à xܹJÙ€‚͆Ð9Z` £ - È ’L ªÈ(‚ø€H’Œâ 8È2»é<6˜Á Hf¶°…h¯xH ĈÔÈ^pÿ€#!Í·n ¤Û`¡íè‡ èA Ç  @ˆ°njÁJ@D9Ï^­HÛü‡»¦ÁKÔÂ0‚ô€©D½‚pà'%†BJ”ôD ¥·¼LçÀÀ['ˆiÈÁ»ddŒ …TÁˆ La ³`ƒ "«šA lˆ‚@ì S°¡»0Å(hÕTLU-ðÁ,ÜZ ;x ŽXËÁµVŠYb«)‚A€·lÀ6pA2ZòB ÊØa7KAH`Í(‡ uà9A0¯‚;P¬@b™Ð6 $%HtÛÿl@ ì€äï:Ñ ÀÕ€$OŸQ†¬k]•œrÇÜå:·¹Ð}®t£KÝéZ·ºØ½®v³ËÝíz·»àý®xÃKÞñš·¼Ì-ˆ+b§ …)<¹ ‚0-"ÈDÓ0‹|ª@ŠPß‘ZHÔ*ô+·Ž@×ôA |  GÀÂE`-²‚…A X×"Æ©…°äˆÀjka ÄΨ¬@Æ!ì°š…@ì×I<`µÙð¨@°âÇ ¤2jp¨6`:*PYBJã @i2ƒµ ç 3zÅLæ1›¹Ìh>³šÓÌæ5»¹ÿÍ¿cÙ›Ìe$¤H…) R_¦ –@´ ,80B›À¡@‹3H ª°ßŸ[­ 2Š–èoömgtMÏ™ÈÁ $-€ùä ÀÀ$‚ûϢͅ½€m¢!ïPÌÈ92 ‚|˜ =xfA\,€r P ¬ˆhŒ4YÛÐ,nƒ#|Šœ½F'gäú¡µ†f‹jÿb×i/A‘ J $¤6H,ܶUdÁ¿q„¦iá?Ë1 n(4àˆX°«¸÷T-üÖHzØ|h J@‚Ûr´Æ,¨¬¬r7‚À+¡ˆÀ34K‚¸x]Dÿ˜ 4VjÙ=VÃH€ªƒÄ œŸU²@¨u„”€†¨^PÙ0ÈTµèå1c‚| p@\˜tޤÍX³Ö³Îõ­{½ë`ÿºØÏ+Â9覦 P¼À­Å,ºYßiZzÏ1Ü[-V‚ÈB µ˜ÓZa=#Q_Þ¢ @ˆUbÃ`Â@T!ùm ¤; ¦F´H à^È»RÒ³³ ÈÁ6æ!Р28Z "ÐkTÀr7Ìe bX^0?ÂIs+€ßÚ³ !ÒÒ\»xè8¹ëcnt3³Ó™ƒsðD‚hà«<%Hÿ=µˆ ÌšlH ¨UO|zÕ´g VÇ>ÂZ𥸾*ÀO£¶÷F¥'P ÕÐkgÁ 0G=Pa VÀ=ÀS¿À šð(5p[ÄÀ2P,àO6%u•$@U!dÐ6D€k!l¸‚ p[IW€?С@ƒ°-4}ÏavaÀ€YtÆ4ddÎó4Cøg’&6Løg#pÚ ‰FMÙƒÁ„ Îyà¿äÓ6.$D8pF€¥4ñ”­„RS„¡„ °7°›…A40œ%€ÿ@ÀÓ/`7 ÀvãOGÃ>“x8 = àL1Ðà>%У%‚8ÐKK#ˆ¾…2°"ÐÄ£ZäBÒg„ÎQ}‘:€Ö³.p8B$R"”A‘$0?ýƒÆc>j-ös7)àI!iD³@~tDó.4R ôAc·u7_Öm£€q(ðeqF9Auw£Ž(euVÇ-áôÒGCHóAuÑtTÏØ¿ø Œo„á…ED*ðŒÓcWÇ\ô˜é3=2@FDVã?±>6@F/ðFq$pô‘Ò×5ÈÿöãBšxuÜâáDá„t—W41TsHis7 Ô¦”Iù”Nis8psé•P¹_a@8ð(•V¹” ùK1@T"!’Q“¡“ùˆ`+ 'UA4pqDq-(`;Ê“%Ð6|W³_* 61iIv´)@Ž /¿4€$4àBxYj={”Ùt-AS/@4ÐÒ6ó²_BCš¦Ù64À!’¾T4w£5Ï"6i–2p-9nCŽá7/4p™ 1‘û(;à…³–ma‘ÁXz Ôq_#œ ¡X¿ð0˜$p.ëcþ?+™40i7ÿ£ ‘7àŠÖI4=)+•77LÕr”éA )ØÀ"è61ôæÂq¿D™0°@Å08 A-Ö  peB69œ€ Ï8–ß5§EÕÐ?Ÿ|fOu*8·_±”PÔÈÙm©ÄQ z7vI ¡¡¿¸ ;€ÄSI¿¦?`>=€IÃa\A- HŒ‘ 7ÀX( @@¶c0°ŸVGm·Vl,%6øzþÄ(êO¼W$—1L™¥!ôŠñcÀ”!jE‹ûuTÀ3A2õ¦ ayéø‘©\ð‡ !¨lžw8€§)ªÊÿyÄ'‚%é5!p7ÁÀ[éšàgº ¼µGÇ” Îp„LµEÕ` 3F0¥Q{Сáç–·Ð ”A å@k1'(H°º:–:°ˆº–kM£V à° ê¬ð à0 €¥B vÁbs Ü0?v ×0 eÀ'À ÖÇYÔ š°ˆ:ðcUX¢5·Gåà ×6Z;„t{ÄT.*ëŠÏðcö*ºP %·B!ÅTº0I%°…ǰCÉÐ6¡PªXIå0É•´®ß ÐÜÆ{‹Š+ª.*§1ÚY“pÄYÏàCÀSrÿOOö­„®K¡ ËðŠ:@T (8(Í*ŠàYO&ëÊ ²9Ä­° ºPY °@qTð­¡ >ky ´± œ• {Dc §J…Á· †ÈÔ° 4TY:ÐK€y«"t7;àŠqLP[¹VYJ° •Ø0 OJ?Àà°«Q OÈj¹ÆS8xnx8 3w[»fyÈ'¥Ó 0 êq'‹JH°G…A‘ú5¥†ªÄŠp!µˆÜ@ ØKÖ@?à¡Ð+$ç@-Ä B6s2*ÇF”Mê§[S6@•ôXÿðºàšå`ùŸ?ù®º¦lAkÚðãÖYáÄPZ ÔC6äZ3» ¡À 0»kе·Ô‚n i;.” 1¯Ð ×à;Ò SÍ0 …v×P`©JÐ<-‹¸ç p¥«eàék ¥ €¡ ßPŒ%Q“¢±k)[#lHA0êIP†X€<… @-¥ ̇p° Ђ« Çp ðº¿s  XueÁÀr£Z ÐVµ1 „$¾H“xИ¨Ú[RlÃÑàDÁP€¢}ŒØp³Ø"0±ÝÿÖ=`QYžwÀUs;{¾WI;ÀÊP ÀXJ*ÑÀT˰R ÀbÙ/Çà·œõ¤ÍÐK8ÁÕ`²–Ñ{ÒVjðk³Må Ð²É K`LléÃ.PPL?|³;ÇêR4æO_Ue`«°‚Î@%@“€4IšE4VP¾,µ e@k¿€‚9cK+ePIZ` p ;Ts2 «±nÐý§Bé£5Oü{+ÈmAmŠ5 1,g  Õðc.ô¡ÍK4a XÛ0Z䳜q‘ËÎk{±1àÄÆÏ€ƒÁÀØÐ¼Ú`0r@c¥@ÿ»R×b©±ÐJ SÅÄ7'åÑÚ+x³‘ä7[ ±äb¥ð ÊxÌjÄ9¥óhÄ^GVÐkßt„S¿á ×VjVƒAצ7À :‰¼«Ðñ Û\ëû G0 ßà 0[7AcpÎ㛡÷×q2ÀØ Œ,“P°®Üæ¬ê¢ÎÐÕÐq;teD€-°q+0{7ºt®ÚÏ1³Œ|77 ZõiL°Gªeȃ¡Èj€×ÙÕpL­ ϰÆEC­D|o-Çf½ÛăÜð +¤Ê:Q`~]º pÎD Õa‘Ìÿ4TqÔÌ’-2 D%`‚þ9qæ½×9-Ô¢*@ÜDÔ²Õ“ßGEÇeŠ¢°0`‚JÐ"`s “ð@0/0´kzCWC4ë+ä6Ôã‚1ðeJ@ÑwÏ $=gG?¦ 2ä6ã£>mCpPÐl·cYò™jC'Àƒ ðëKôK˜9 €(„\¦uµPBij_:@4S:´1´¹T”ê¡™9p@0 l!õa€*Q"‡ÕâAÊÝ@,ç†NN´V£ÜÒP1İt7ÄB4ù·ôSæø»§*Ÿxÿ“9w³øƒcð=O ù~T=T™ò~ôþñÆô^‘Ì?uc-{0°ë²‹©&ÿÂsI9 ?åSغ5ðedC»-ó‡å90‘6W+å0(@4* çŒc“m#6q<¸GUm7²N‚oê/0AÿÉú‰Ri*™v#þx“x2°ªãnŽ÷—!´ÝTFCOÞßÓJʰɴ:@éQB†‚e”p„àB26CÀ…4Ä`Ø!7Nô Ç;.Êð Â¤€%¾d“! 4mʈ£Lž=}þTèP¢EEšTéR¦M“*|uŽ'‚ŠÈð†€ 2(±B„LTGÜ!@„E |$uU€U°,dŒàa`L„R„`Ã` NœK0ÃÖ*6t¸á7ÅÂ5ò#hQ& p›  ‘$¨ ÒÁé¼7"8ÀƒCŸGÿž…QAÀ‚1zf°àʼˆOÓæ†—€R´'|Ð2…Å2Ó–"8à$ç1Ãô^£ OÓÎ1ØC|ƒ"ãˆP`áo 4ú¬ÞSçEþNýÿ0@$°@‰Râ'Z`‹-¢`(‚|(a„ž²ˆi ‚˜Ðà“Ldxk‹…â8C‡DÐ0$Z€ 6|x¡£V Ȧ˜# b¡VŒ bHÁ ,³bšo¶qæ>†@ÓEfˆ`!t ((ˆ™R7N †˜…ô2<ˆ"8å¶dàì+K¸áf‚!(Ø‘RÄ f¡Òú’¶D›©;3wªNÿ>¸£Ž¡mdÚkù²aK4ah™d¢ˆ %Ý/?£ö;°TSOE5UUU…J*™ È”Tšc¡LTYhUFY…«˜$ B‰ PjahÖQìUZÑ`…b´á g!(±H%PA‰vªA„€®Úº¤SžäY舕´‰À $g:#*J|†!RÇS‚’a%ÏH ¨v¨’Jßx*¡„¦k˜ Bê‹!|1èiµGׄ¡šk†1g¡”…\¨—U_†9f™g¦ù¿1{2 %8D` …”–° 6b]/3ˆsÄ ˜`Ȇ>ñkÿ ™zöÐ"¢¥ iv¡p "R¡§q ¦Ðbr€—q à˜¡aÆx¡i¦œ:' ÊÁ”¡½çx{t¡¢ ‡0Ð"Öžï–€ÇQá„"ÏR€q"ÀA ˜b0— ^¸aÝùJÀhq¶ £Ì™Ú†¶uu€Î…Êxà °f¡·kf¾y矇>ÀVyʹA‚ƒOp5Å0Y(l_M±Œ ¯—‰íP%mŸr„!&h9C§çªuV"@PÐHhAÀP è!(ÖXàÊ8EäIÖ(àˆ¡p!Í`†ÆQƒŽ1ÿd Ì0 |gr€pì€3`3À’Ûuf–ÖÔŸ…€LØ€î&¢tqðaO´á ô­¦Nàp ¼mÁÄ¢·E.vыͻõZr†MĤVŽ0–Va!d €j*< ñÅWÎRKÐ4PƦâ°Ä¬,Òq!¸b‘v¡–©xÛ> âøÄeiÑFgàH9ÞnX²TŸB± "L q§Iê™2¤°¼@ €¯ €lcÀ‚9Ô³µRä€Tª´À Ð1¢‚AhÈ#Æwº3šÂ¡'Þ C!gÿ»Á°œ ìd5}úb8Å9NrJOQcY¾…‰QŒÀZ³dÁ`©¢oqcL"Ã|Äh IÅ,@Á î-ä,pV` Z,$.H„4,`ÒÀ jPƒM>cÛ@¡ib²/(¡;§X{‚°”€Cn J‚œ Ã@ßÌÎ,`QÀ®!’„r>r@1ðÅBÆu<úô$ÅÃ)a@¢:bwŸg°B/7€.h# œR®Êp1VVN¶¶Õ­oeH_•È…lrg–ŠÃŽF-Œ IÂB»Wõhž[È‚‰è²|Î C`Ìÿ r°ƒiň /A"™à²A(@&ƒ‘²Y¨AäCVc ;éÉ2rpGΦ ü¼ÍIÉÔ0šÄÒ¹ÉKË@¢ j€ïÄœ=‰ð þä!1ˆŒí²T>™<³'"-È z\=U*1 ­Vá:^ò–—yÓã‰eç‚XÅØíˆ㳿à…\É„"!€À.ÄêYHǤ6Éü…2š!HÇ~:0ìHH©îœV¤(%G¤Ë“êD·2ÑÎ^RۆĀ/¨ /b(ˆ `A,P6LÕ@Ã<ùXL"l  ¸¨bš×ÈGFrÌäÿ*XJ!ˆÞ{ƒØèàÉ‘)n )iK[ Xp¬d`“—UdæŽô… /PABàù†&‹ÛqHžDD2xDd‚ƒð”¦ñáX|óœÔa•)ZÉ=‘‚Ðä8|»zì0Ã:uŒ‡’f.ĺ2HÚh_õа/•Lr¬e=률W&0@Aœ×\†ØàÄ€] rà„Ð'@±/ÓŒÀb»˜ ý#Á c68H Æs|yQ ‘H r}‘CÊ'¨Á $" !‹s´‘ð<éGH@¼?U&‹—Á *fšÐ@éþî¢nI±Šm@à àH Å€ÞÜY×Tàð)<2‡ ÿÄæÈŠA’èAñD~‰,¢Bé7ðeø¾Ýú×Ç~\{   ÒA pàÄÔ`²"Ai,Ô+`BïÚŽLlƒ` ©8)¢ –0¨!(h½Œ Sª›ÚAˆÐÁƒ­Ð¸pˆ  »8ÒˆoŠ«wùISžà´Nêˆ0:°°©˜x$@!L³Ù€ Ø k‰th Is0¨“ð!Bq€P¸"Žé œú̾(”Â)”‰¸[XÙ„‡š•˜x,üj¯o‰‰XÀZ@ƒó‰‰-\Á•3° ÿT(£T°°¨šH›$à•Qˆ`²¸;Ø— $„ˆœº…}cˆ[@‡gà†eX%\ Cªg°›–©hæÊ8•éÐ…•I† Øz”KÐŽµ¹†ä‰7IžIàŒûpˆ! Ø †ÓÏ Â]äE*¤8Ÿø„ýÚ3Hˆ_i‡’ aTÈ4…(0…OÈ€9 Cb©œ8JCÕà Û‰‹€;‚,(Xž`õ"Š`)˜†…HH‡Š€å˜Ç)–r€kpžÇé…u€)Ђ˜†g,èhB=°´‹œ0ÿµIƒ€x)*‘º^É”5+ûñ ¡QŒ¢á 3C†ˆŸ­©‚ ‘CšP©™È‚C8„,°Š†€3X¨!ˆJ6lC- À*P‚È` x–ÒÐ"†À  Ú€rˆà.‚˜†`ˆi¢`8-°*#‰àŒ*"×Ð…+ rh%“…äé†qøz˜“©ªÃ-"€Ö‚5‘dÌÆ$¯_$ˆà ¨04…–x'†(#dl°)À– ù«ô¨>#!À•Pmœ…±„¢éã6…T¸A‹‚ÐÔP¢Š<ÐÀrÒé Zˆ(9.(AK€y$røuä0·€”‘Ú¨ù ¦IP.žód ›‰¸ Ѓx´Û¡ ƒÏ'…Rq‚Ìî#ˆ,HFð!ˆHC÷IÆ ÐÒ¯` †É̹؄Hø€±È$PÿKˆ &„-œ0…üº ¤<¬\Y‚ è>4‚X‡[`€@3.‚(tXNR¹…s¸¶©¾#!‚ž'ê˜ÀüH™ðÎ…h€`‡—²‚û|Á‚` º †èÜF`©7™8…¸ª(ÕÕ]¥’ì¾@ø¸V°P¯øªÀH° È/ª‰!Êg}V†€°ŒÈ‰ŽQ=Ô+ @?`#@ZͨšWÀ€ p™XRž ÀÓà Œ¨ÜÑç"Ð=Ð6Љ2‚5cŒ°8 ( ÿ°¸€8‚¨«Ebk8#¸ªx 8Ðë!†å€nr8^eÙ–%)Ea£"º ü2Æë²ˆ@ºšP/÷éW@‚èPÚ)ÚŽ07¢É]ƒ¹J;:ÀÃ6ˆ[\%/ŒÌÀ˜)*‰@ˆŠàÉAš€n ‚±—˜<8褉y<³J!Š•uÙ¼Õ[¦ðU°8â°6ñHÍVpó±å\4‰”`#ý‰mµÿ ÒŠø³³4`ÚF{’“×…’‰©è ˆ.èDÜBY³Åä‰JU¸³=Û[¸Õñ‰<ÃÛ½åÝÞõÿ˜Ý»XJ€’‹ñ¸­XÛi=HY”Y€ˆ<‚‰ÉU=M…Â3žHáÍ {Û° ÍïªXË Ü…Ø»ªÊr€  ˆŒåá{³ÞÓ(EY^ _ßõßÿ_EcàꀺTÂ™ì½øŽ‰X]#Åи ØÐ@« ¢ =q“oÛ‹˜É°7é2·)Ù€­€ÈØq«A†Ð -ÒîW̵Ȋè¼ÐC´˜h¼âì„áá€Å1 íŒ ´à%fbTÙ øQMc€päÑpØè’ê`‚Ð ËR (ŸRH‡>ùÿÊàâé¤Ù‰±XÐ@†ˆ˜ÝZ.   ãx!j˜N0‚x±Ø‹¾)y]Ì0êWÎX-@ÌÀŒó hE¶™8šàß&ÖäM&¾ _ÀŒ5‘Îxh¥})xä}¡‘Ò  !p(¦Š¡—ÊŠˆpR¨€Äù…2Ø€I#ˆàá—2à ø=(.¸è” ƒ ¸e@Üá°z=x!ÛŒˆ€£OõÔº" z‚çÀ®'’P7´Õ %îTN†çx ˜%NÙ­Ô!pÐp †8Ò9@Q) ¸™iÂY› ‰ºmð„ð$ˆÿepz"‘²ÑX-‡¸†å"à…”9…2Hœ ˜pð¡m`®å€xOŒ( 4‚¸ž5Í`)Ð ,q ¼Þó‚ÈA} °Ë3G“礎ç¾-¨†fX€ÈІf¾°ÂG‚ÈΨb§à ‰¶a(€=áYˆ1¦ ­… rÄ °Xíp„´Ô ¢“P±gH¢Ô! h¥0@ÝЋ˜^‘Zæ‚UÄñ)ä}¤VêÊfbzî”)Q jXWÁ®#`kHìxäP X“È€Q††åÄý€Ý"‚i"ÒÈf„´EŒ8%ÿëúxd-¸¢»–Š[ ”$ˆ”T„À5 Љ—Ì t(®O¢1ÓØèaШ€H0Ý `<ˆØ€ °AÜ2ËVoxöä½ÀŒxzÑ!‚vá§u,n †¯ì Jj¢Â¢Ô")„˜>N€ªÞk†àŒs€NáX t°P0QpX€œäéóVÓ}°mÓ€„èà©P†éXr°šµ1C!{×üÇ…˜% Ê^ï×Û)…jtX†#À€µÚXšl8 MHà¢é£(ãj€ñE‡Ýj€I`.npˆGb¢ÿÆVÂp€Ò‚ ª‰Heh€®«’o b†j€7¯¨fX ‚€^(‡ÐsíÞŠÕè…op†l@+ E˜‡[x1 Ð-§†ñ”’#¸#p€c¸†h(˜OÚ$7Ø$à†o83oòZç]_5S.† sC! ˆ>Ô…Ð0`Îè“KH!,yó_8ºâe† «Vxs¸âZ Ò¨ÙÆ”@Œ\µ w€Ò9%ð¡áK!±A© xöxW±zñØ8›0è€;…GÆ)î“`Ppƒ^ȉP®Gž#'A=žÀ‹‰4Y[‡øÿ–r„ؘµ àŒáx›&ˆ‰ ãùÐ8Û™žÁÓÑ c$ pÐfÈ Z† ²ŠÐ'`£9€OêNÐD°6]Túk‡ë˜´-K-,¶ Ñ(à¬(ŒØƒE¢‹®H­»øãˆ{—à>Ã\öòcçÕ´U UZ&¨‰¸˜…è h3©´·¹Î´ùbŠè ⱘX¦¤ wüPó‰lÚ ³ûÆòŸ0€u¶6¶ü:ðPºCI\ã5´Wº8p€˜pG™À·*f0$Î|\ÄÅT¹üã,³[µuüÚßU~ ´ÝÞÿÝm¸Oƒ]Ü¢<32‰ Ü˜cÛGþ]x¹½("™yýNLºN”0·ê×Г}OþíßEÜ×YØ‹1Þ÷"í/'â׉ãçþôoÌåoþÓH[¿þŽÉ~õ§ÿ^Äýu~ƒxó¿ô,hð „ 2lèð!Ĉ'R¬hñ"ÆŒ7r”¨D¡1JÀ((£#Ê”*;ÆÐR`Ë—+gÒ¬ió&Μ:wò4xDÀ«s œ”QÂàÉžJ—2mêô)Ô¨R§*ý˜0¤Ñ–I©rí)Sf×°bÇ’-k¶àÏ COŽ<ëö-ܸrçÒj!ÖEëòíë÷/àÀnÓ 5HÔåQÿÁŠ3nìøqÄ»Cõê°2æÌš7sæJx-â΢G“.m:£dÔ÷žníú5lÍŸ ³Mû6îܺݦ.˜—õîà‡¿9iñäÊ—3§Ø»9ôèÒ§ 8n’:öìÚM?ßîý;xÈÖÓ/o~n÷óê׳—:¾=üøòm¦Ÿoÿ>~ŠïóóïïŸ`}ÿ 8`|ûx ‚ä˜ ƒ Ng ƒJXÜ‚Zxalb¸!‡£UØ!ˆ!:¦¡ˆ%šèׇ'ª¸â`@Æ"Œ1ò’E¢9êxSŠ;úø#G89$‘õX$’I&$¤’M:y¤“Qɤ”Uþ¥•YÚH¥–]ƈ¥—ÿažÈ¥˜e†¦™ibH¦šmJˆ&Y—¹9'glŽeyrgYrêù§bvvUTe€ºŸƒZ¶è¡þ%(W{ç(¥r%é¢~Vº©Yj§¡žu©XšŠzêTžbŠ*«b‘–©­Êª”ªTÅ:+®<½ªh®½öTëT·ú:ìL»®J,²4+•°É:‹šcÍ>;mDËF%-µÙ>d¬­Úz[‘µPaû-¹ql¹é6îSãª[î¹Ì¾;ïAì:å.½ÚÆ{m¾ýVçb`øúûì¾âL¯½M |0²·Ëð» 3µ0ľ:|oÅéJ¬pÆé^|Åç¹qœ×‰ŒêÇݵÕÊÿ'³J²X‰Mêr¨)cÚ2Í­Âü©@!符Í? ]-À˜šT¡Cs4¿-û¬´˜;£Û3Ô¢2ÝmÕ¡J5×výuN[ƒõÕcC-¶ÙJ—¶Ðh³ýóÚoÓì¶Ü.Ç]·ÈtãÝñÝ{W¬·ß÷øÁ€>ðà‡÷k¸âù&Þø¼ŒCþîã“k\´åŠWžù·’sþíæŸgë¹èÙ†^ú³¤£Nðê„«Þzðûýºì׎7í·ãzºî¸æÞ{«¼¯3æÃs-¼ñ§þž|Í̃½¼ó•"}¥ÐSßèô×7j½ö€fß= ÜƒŸç÷ã\¼ù|§ÿ³øëíþÜèÃpùó›Ù¾ýÿaÖŸ˜øó¯åþþ§%ÿ °J,`•ˆÀ'-p` l`’A%=p‚D’ §$¿ šŽƒÛ YÂrUp„9  uTÂÒ…,¬Ñ _#Ê0F1¬¡ŠhˆÃÝp‡%Ò¡MÔà ‚ˆD Ѹ!#*‘CIl¢…˜Å =qŠ’¢%TÅ,2‹\lпx /ŠAa,£€ÈˆÆqýQ£ýÓÆ8âŽtÌÏï8;êÑ>yì#|øÈpi¤!ÙóÇDž‘Œ<Ï"© IžO-”|ß%ÝÉLnÇ‘œôÎ&?‰OŠ2;¡,¥tH‰Êr•JR¥+¡sÊÿX.–´\Î,oI!]f)—¼Ž-9_ S7Á,ænˆ‰ÌÛs™¸Q¦3_ÓÌhšÔ<Í4¯Ùkj“4Ùìfi¸ ÎÎ|sœ¢§95SÎtnì„Ì:߉wʳ1ñ¬çˆZ‰ÏÝsŸ‹¡§?ÓÏ€ EÑAy¨Ï„¾‰¡cZ¨C4ЈÒÅ ËD/‹jtFu"D?šF‘nˆ£$KFOz£ª4?)miXL Sª¼t¦T‘©Mí’S0²t§ôi‚p T¦Ôt¨MªQ{RÔ¤Òª§L-ÏRŸº¤J'Q­*N¨ŠÕš\u«5ѪWWÒÕ°®¬dEÉXÏŠ³ªBu#imëFØ WŒ¼u®‘«]+R×¼‚Ë©|­å_!é×Àî’°äÁ«a²×Ä:±Œ]È]ÆñXSv²¹ù '®Q€!ù ,! MXÿH° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç Cn ²¤É“(Sª\ɲ¥Ë—0cR@R¦Í›8sêÜɳ§ÏŸiÖJ´¨Ñ£H“*]Ê´©Ó§P£JJµªÕ«X³jÝʵ«×¯`ÊK¶¬Ù³hÓª]˶­Û·pãÊK·®Ý»xóêÝË·¯ß¿€ L¸°áÈ+^̸±ãÇsÂ;¹²åË"åaÞ̹³çÏ CO'º´éÈ¥N«^ͺµë×°cËžM»¶íÛ¸sëÞÍ»·ïßÀƒ N¼¸ñãÈ“+_μ¹óçУKŸN½ºõëØ³kßν»÷ïàË“O¾¼ùóèÓ«_Ͼ½û÷ðãËŸO¿¾ýûøóëßÏ¿¿ÿÿ(à€hà&¨à‚ 6èàƒF(á„Vhá…f¨á†vèᇠ†(âˆ$–hâ‰(¦¨âŠ,¶èâ‹0Æ(ãŒ4Öhã8æ¨ãŽ<öèã@)äDiä‘H&©ä’LrDJ“!¦ð !@é! Vâ!ù ,¤!ù ,iÀ Ø  à9fD@BÀ±`ÂQ¸P… àð‚¢?ˆQräÈ …°òW¯e=¬ìXàÖ?þnþÓ%³`J›ûpîÛ™ ‡€jþ êoè-3ü\*”¨Q¤J™:…ê3kUžW§j%Uì×¢GÍ6%Û•ÕÒ}p­MÚëŸÝ»½z Çš´¿Òªé¡U †@‡B8Žü˜Lä‡c7T¬¸ãd Š1t¨øÈÙ#è£!ù ,¤!ù ,¤!ù ,¤!ù ,¤!ù ,¤!ù ,gÕ(ðÁƒHX‡À²K·ì…ÁÂ<°AÀ0~tPf`‡Op 0p¨Á  8q"ÇŽ=d”#ÆAHðL!´„P •”ç §%b`EˆTi¡7°B…:°*O§E·Mʬب°ŠV«P®lO<}KV ҀŪ›4†‡Yù,øîZ†Ûu ·ìÆ{,|8ñÓ„—gN¨rg»¤ub¦Üw³iÉCS ˆ ·µìÛâ!ù ,¤!ù ,¤!ù ,¤!ù ,¤!ù ,¤!ù ,¸ÿH° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜÈñâItI²¤É“(Sª\ɲ¥EõN…tI³¦Í›8sêÜ9ÒB:i·àI´¨Ñ£H“*5¸Áœ…mA‡.JµªÕ«X ^Hׂ T¡YÊK¶ìÆ­O¼táÕ¬Û·pㆽ Ž ¡5\ª•’Ë·¯ß¿4é®YCÈU0yÂf^̸±ã†Ô­avÊ·iÏ<Þ̹ó_ºÑè {FȳéӨŨwÌ‹µ_Ò HMM»¶íœ  ¨m…ÛÀƒ O)²5^Ó+_NQ$óçУ3< YºõëË=aßν»÷ïàËÿO¾¼ùóèÓ«_Ͼ½û÷ðãËŸO¿¾ýûøóëßÏ¿¿ÿÿ(à€hà&¨à‚ 6èàƒF(á„Vhá…f¨á†vèᇠ†(âˆ$–hâ‰(¦¨âŠ,¶èâ‹0Æ(ãŒ4Öhã8æ¨ãŽ<öèã@)äDiä‘H&©ä’L6éä“PF)å”TViå•Xf©å–\véå—`†)æ˜d–iæ™h¦©æšl¶éæ›pÆ)çœtÖiçxæ©çž|öé矀*è „j衈&ªè¢Œ6êè£F*餔Vj)Ml P;—º‡ £[§ë!PP@”@*zÀçðG(qÄ7 ƒ«¯ŠG¬øSϰõøÃJ;ô:Üò?þ<û.È*ëk³ÿìí>Ó&Ѓ1Xû³Îjë··0¬¸ßýZ.´ÑRûm¸ìrGn¶Ûþ“îºõrç.¾çv;o¿Ûýk.·Ôê@°¿ØµFA}$HZ Ðå™f2©æš` ò‡ RÇ :¡igšwtçžd†é™\å„å}öÁ‡¡„&Ú‡¢„â'›FêtÊ$ˆ£Œ.ªi¦Š ò&A›†Êinz*À£fö9檪¶Êê«®Æÿ ë¬ 9é©$’\‚뮸êêk®À^²H™’klg¤Òk°Ìþꬕñ!È"Î6k­®‹|ê•$žtÛmAžî¸âŠ{É ¦«îº/uÙî‚p[.¹ôÎ[®‚ÃJ£·üöÛo¹ÂåÀƒlpÁ¬p / %‹Ôa“Èko½w»ªìvì1\nâíÅ$Ó뉰¤ö!‰Œ%·,îÊ,a)ˆ N‰D3÷‘àDœÌ˜îÇ@ýUœ|+‘'œ  ï"HSóI~Öç¦ Õ\ÅG¤1ÇBwí5Q¤Æ®ÖænLgÖZK¢-J–ºG'pwrè":®­Ð˜—ŒQÏt†ÿi÷×€>ÑF$IÁ¢ „´Ò},"ŠÞ=]’ | {$Ò 0ÈtŽ 0ô!úÄ%²èÊ É"ÃN[)AÃ)øì´Ã¶Èàö 3ÂÀ ¸e“ZÚ…+ ×½~7B\.;çžG/J¦?¤sê4³M6à€sM6¿Ä7¡²×nþù%žz)×°³;Ù”ò{îŒ;žº'¥ä¯ÿ½ÿ÷@t:´ ò¿PN }€0=NpÍj`ªÿ.ñ v°£Õ(G;Ü¡ŠËV* úFHˆÜ{ÓXG0.Á‹uPx'3ÛðR'‰ º£8tÇ/$g@ÂsÏ çœÎÄyÛQÙ!8cíØ†äÆç·zñ‹QAJÁf„©ÄX‡+v6Åyªq3È+æHÇÄÄ àé$Â4!¢pb;j`Ð ÝÚ * ê‚ì˜Æ3JŒgcÊ‹]ÁÈÉ/ž° §hÇ/vÆ‹v¬±Á“ñ f¸ò•§žÚÈTÀO) nJÈ›èu.ñFô:1'‡\¯ ®h/"ŠEP£äbù:IÍNŠ‘ å¸FÀ¬QŽƒ¸‘Pökã%\‘Žu¨CëXG/<(<"D AžAè9`xC Jôœ" ÂÿÈœŽ‹p…á! gÈ£ÚXAX͆V3dóˆ$‚Áp8ì8ÿÆ&¬8ña•œ¨ƒHGÊF–Íò‡ÙäB>EÏÏÝsÀÌ'2ˆ9ă¨Lož1Ø¡vð",Ç2í(®lÉÓ¡H¥¼ѰÐêÈ/ª¡ ßÁŽq‚Xe4Îs¤èHG:x!¹v.*%äçÔAÎÅ‘#D™ú‰@ ÎïµyßÛaÁ ÆRF Ô¡©=kJ¡ÖèÕ“®t=•]wt-–¶ØœaKš¥î±VZeCzHK”¢›sîçˆ3аsYl;›ÝúJʶØCQÅõ[­VÄl ±¹‚N€.Bþ9‘­Ù÷Á@ÛnEÀYŠˆâ¤ô­È›à%:ÑW F`1Ö²±|Nñ±²:?»˜¿Y}’_LbÕ-*ļpK~" u%.1€ULd69ê°4.™'Çã&9cݒ΍bX]âÊXβ–³|¸FùËF.–«»åŽþáM§»'ÔÌæjù*ÿËPºñO(•àƒÑQuÀÃH÷Ìg>Wº8³ 9“²>À!Ï|¨C¢­h>ë¹P•rS¨ŒËèJ7šR‚5ïD^G4L-JZ5¦8èR÷&—D•ª¹&º?ðÁÕ«&¢*'”› $º ’î¦*Çë"úšÖ¦¶’>kQͳأòŠBBçf ûÙІJ2íh[ûÚá‚´m¶T„Ø·¸Ò†5˜[æþrŒûÝðÎH¾‡>˜_ˆJï~ûû!%øAºà‰cðnÞpØŒ@ à;üá‘ÁàÄ g4ãÁ  ÎñŽÄG`å3\Is+¼HÿO¹¸K@„5ˆbäÌ ¾âm•ÛüÚ yAIÎ 8áæ@7X錘ÝÜJI̓Ît0Ë@:/zÅ{þó¦[ÝÔ1ÈÐwÞŒ’¯!éK¿ºØ!uWÝçÁØ×^߬ `ëEï:3Îöº§¸ìSG»Ý÷N[·Ã=æ^OºHR¾¾¡x?{Õ?~øÆÑïDüÜ¿N 8þò^L<Õ òtÌ{žvçºÌ)? |þô´Ó¼ÞúÖ -ôq½ààúÚwMõ‹È lÏ{uÁ^òøž}ç{O|cáÞ »/¾òÕô{¹  –O}5¿ ɯ¾öuÓ|ÙC_*@Áÿöǯ›ë“ÿü±é~ÏI/’†£ÿý 1?üçßõ?)9 ¿þ#ÿýû_0öGza÷(ýW€v˜€øý—8^±€Ðg˜^Ñj§èˆüö$Øýn%˜‚?‚1‚*ø‚<Ñîƒ4!H Xƒ:˜òG$;øƒ(qƒ@8„+уDx„Á‚H¸„q€Lø„¡„P8…á„Tx… ¡„ˆ…\¨VØ…`8R†dHýGV†]¨…jX†_؆WȆp†o8‡P¨„.h‡WX‡z¸„c؇{yy—{>ˆ~¨u‘ç|ìgˆXȇŒÿ„øˆL舒¨ƒ‘X‰GH‰˜ƒ—¸‰@(›Ñžøƒ,˜£H„ (0|§ø‚¥h±­¨ƒ©hz³È‰ˆ(zë'xð ·¸ƒu8 ¿ø7H{ñW*0Œh… Í(n§ŒÈ‚2 ±4ànÒ˜ý·àÙ'2u¬ØþÇ‚p2PÉ8爎(@4 ŽÐ(¨Ž%ÐŽï¨Þ(ˆŠGõx»Y€üè ;7ˆiøˆ ™Ž¹{»HsýèŽ9ô(‘Ù‘¸)’ ø‘™&¹$ù+ù(9‘/©-9““!ÿi“ðW“:¹8©’=y~<”ó÷“I”Õ7”H‰~F¹”ã§”N9~M•Iy‘ÀÇ~°‘.I•Ú7•\©|Pù•Ëç•bÙ{aY–ÄG–hY{g¹–¶§–n‰zm—­—téysy—Ÿg—zéxyÙ——Ç—€ix9˜‡'˜†iw…™˜{‡˜Œ¹v‹ù˜l瘒yu‘Y™bG™˜Ét—¹™M§™žysš@š¤™r£yš*gšªÉq©ÙšÇš°ép¯9›'›¶Ùoµ™›þ†›¼ùn»ù›ðæ›ÂnÁYœâFœÈimǹœ×¦œÎùlÍÐÔ‰uV©ˆ‚—• y«)›} ÿ ”ÞùoÓYž¥fèùe繞`¦žî©bíŸDŸôù`óyŸdž«')“ú9nù õeŸÚwÙé}"ØúnÚ ƒ5 JX:¡%¡ŠTš¡Ô„¡ZMú¡`ä¡"ÊI!Z¢%D¢(šyü™{ÿ™“+ f*£#t¢4j>3z£æc£::;9Ú£³Ã£@ 8?:¤€#¤FÚ5Eš¤·×¢™’Gɤ„µ¤R 4HZ¥C¥XÚ1Wº¥ë¢¥^ª.]¦Æ¦dZ,cz¦‘b¦j )iÚ¦k¦pj}N*žP:§Õ$§xª$oº§Ê¡§~Ú}¨¼¨„Z~u*/Jž‡ÿŠ>†Ú¨¯1¨ú:©¡!©–•š©ž©œê›ú©‘á©¢¡ZªŽAª¨ê§ºªƒ¡ª®:­«€«´ ³z«}a«ºÚ¹Ú«˜¨þ9žQ ¬Çò«Æú¼š¬p¬Ì:Ëú¬dá¬Ò ÑZ­aA­ØÚ׺­˜ ¹ %é­b*¬‹Z¬äª$Úš®PÑ­ìëú®&h®Ä*¯q ®÷'Zi¯’â®üÊñú¯Aá¯+[°>A°»‚øŠ•ûº°K¢°Ë;±3!±;›±0±kƒ »û±ˆúi§J²š²É *©ôz§/ ;³<ÿ³)k³œQ³:kÛ³'Á³@Û„8 £C˪,+®[y´ñ³LÛBû´á´R«Q[µAµX{W»µ¡µ^K]¶¶dc{¶ a¶jëiÛ¶^X´Œ ·nñ¶t{l{· a·zk†r‹®}Û|¸P÷·„;­I«¯.{¸d‘·Œ+ƒ¸Žû¸‘Û·“˸•«·—{¸™{·›K¸K·Ÿ¸¡ ·£Û·¥Û¶§«·©«¶«{·­{¶¯K·±K¶³ ·µ¶·Û¶¹ëµ»«¶½»µ¿{¶Á‹µÃK¶Å[µÇ¶É+µËëµÍû´Ï»µÑË´Ó‹µÕ{´×[µÙ;´Û+µÝÿ ´ßû´áÛ³ã˴嫳ç{´ék³ë;´í;³ï ´ñû²óÛ³õ«²÷«³ùK²ûk³ýû±ÿ;³̱ü²œ±¬² l± L² <±ü± ±̱¼°œ±Œ°l±êGwJû¸Êšˆ'«¨õJÂ_»¸* &ž(,³/L,,².\ÃTQvÍpÂÃJÃ: ¯ˆè )Š;®AÌ­ü™o3œ³I ‚Zçr#§8‘•)P²øÄ_±S÷ áÃÄþ9ƒZ%#Xdà ÄÀ ¿k³7ÆT'uG0s€ooœoýÑA%à<È‚\È„|ȆœÈˆÙ¼ÈŠÜÈŒüÈŽÉ<É’\É”|É–œÉ˜¼ÉšÜÉœüɞʠ<Ê¢\ʤ|ʦœÊ¨¼ÊªÜʬ<É$p$s qéÖ±nr´w ¿|'GJ‡ƒÆ|ÌÈœÌʼÌÌÜÌÎüÌÐÍÒ<ÍÔ\ÍÖ|ÍØœÍÚ¼ÍÜÜÍÞüÍàÎâ<ÎäìÍÑAÐ̱ÎÂÎîÜÎðüÎòÏô<Ïö\Ïø|ÏúœÏü¼ÏþÜÏýÏÐ=Ð]Ð}Ð Ð ½ÐÝÐýÐÑ=Ñ -ý¡!ù ,a’ÿH° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ#B„ôH²¤É“(Sª\ɲ¥Ë—0cÊ$Í™8sêÜɳ§ÏŸ@ƒº¬ ²¦Ð£H“*]Ê´©ÓžD‹Š|JµªÕ«X³jIT¤Í‘[ÊK¶¬Ù£Q‹=˶­Û·pã&L«V®Ý»xóê J·îÞ¿€ ,‘(µ_ +^̸1ܨ‡m:žL¹²å¦5ŸyêåÏ C‹6i@@i PÀ€¯GËžM»vBOp{åe8i}.yºtI@qÛ2 P®\ óåБKŸþ²9AIEÀ‰f˙ߟ‹ÿ‡n òïæ¢×Úg`AïÛË0¿=õûøYbÇK3k]ü‘HLßÕGß·P‚6¸Õ ý1ˆ„Nha…,’߆v´_/OÑL5]ô¡K}üñ‡ +¶Èâ‹ë 4¡@Ò£CÖøÔ œxâã?вÛB)É v¨ä’ }·HvÁ<чˆÔèLvñ³¢")5ªÞ ä¼(G5˜ArC†§JÑñd؇>ð។aô‰‘p€Ü5†È=B@bl Q‘Î Œr€Ã·h†9ÊaWÐKT\¤0Çõ2Ñ‹QÒØ†4n Èé¬YxOpmlC×¼×=²­ø0Úà'ÚÁ 2¨Mw¹ A uc—çØe9ÎÈ‚Š”ÃÌg¹H•ÿÂTMQ¼Ç4ôå#±y`F3ªP„‡ÛäH¬˜c¢¤Qp {Ø$ø¬XÚÊk¢ à+øŠ‘˜°jŸ>Wº¡b.ÑM;ãE5bHhJ3dë” °(Èr„96[Dà±6áÈG^3ŽR‹ÃTƒÜ“¥P풌ٔtemDñI‘‰ºè=zÜC'ÑžAyt–A)£ÊÖé¸Ô!H­)nz(ŸnD<6c!ÁWB˜u!ê”ÈSÛJXäLµŸ)(z¨Qþë9)5% Ò2…È’YÁ,¬fe“!ÄB¤YÄ4áj×–¨!ú¿äÄÚ8¹7Åáêfg»—ÿn ­imn4¶œy¹V!·âW—IpBÈM®r—»ÜS¹¶Ð­LÛ!æZ—¹i:ÑÈŽ{Ýîî&M¥Ê„z&‰òš÷¼è=¯Œ*Ýö=uYzçk^?‰¢B¯|é[ÞKHâ])b !ÜÍ?Ô®C' ¬É+X èt¯„÷ò'Á¾ð…ñ€`PdÃuÐp†GŒ‡«@– ¦­N;á ¦9ìÍ ­2`ÛøÆ2 !ŽwÌã–4ðÇA@‡Lä¬ HæB R‚";ùÉ!Ãê ÂAùÊX^àÀ€ãpr–ÇLf‚Ôá†0^Qæ6“ùÿiF0°6!»ùÎC–Dœå¼†›àùÏ6ö€ã,Œ_Ä€Nt‹Kðƒ,îÙÐd€@kMièz€Æ!4]éNo–ÑŽ–s0 -é$ÁÓ¨fé¥3-ç«:Õ°†*¨õ,jRÇúÖù\5œ[½i\ûZ‘³~´"mtà×ȶ®5ýj€ ÙÐî[°k=lÑÎvÖÍëfkûÛ»š¶œqdkƒûܔ⶚{îv3IÜ£.·»çÝ!u»Zœ¦·¾©or{ßG޽Ùð‚˦ßò6¸ÂC3po/üá”Aø¿!NñÆ4ßÏøb$nn{0Ï÷ÇGŽŽ“üäwÿ 9ÊW“³üågQ9Ìg>—ÓüæY‘9Îw^›óüçLÑ9ЇŽŸýè?:Ò—¾£3ýé2Q:Ô§î§Sýê)‘:Ö·^«sýëÑ:ØÇ~¯“ýì;Ú×î³³ýí Q;ÜçÎäFÓzÜ o2Ý÷n¹ó}înÿ;Üe¾7þï.‡Ááÿî÷Å£ÝåzwüÜ/ù±'¾ò“Çô®×ípÌ¿=ðžÿºÊúÏÛýÑ /=Û)¯zªƒ¾õTg=ìŸþúÙ?]ö¶GzístÜó~è»ÿýÐ}/|ž¿ø<'>òo~üåß\å pþÔ9ÎéC]ùÖg¹É Ђì/]çŠ÷>ÿÑ·/€¤@âúèO ¤ÿçÛgÿùߟ|Í3ã`¿ÜOœÇ_ó×Ïg݆úÇ8sÿ€ së×~ ¨€§Wkòfò‡~ør¸ør ˆˆrˆ€!HrX‚"H€œg€ˆ‚&8xGl€ è‚7‚68r'˜ƒ7¨‚÷†hùׂ<˜q;8„‡ƒFXqE˜„‡„LøpKø„ç„RhpQX…G…XpW¸…ô¦…^Ho]†í†dØncx†àf†jniØ†ÙÆ†p˜mo8‡É&‡v˜lu˜‡¾†‡|èk{ø‡±æ‡‚kXˆ¨Fˆˆˆj‡¸ˆ•ÿ¦ˆŽXi‰‰‰”˜h“x‰xf‰šˆg™Ø‰mƉ ØfŸ8Šc&Ц8f¥˜ŠW†Š¬xe«øŠN抲èd±X‹CF‹¸8d·¸‹;¦‹¾¸c½Œæƒ½„HŒžƒñ&ƒ¨Œ›hŒ¯†Œ$d6ŒÖè^À˜†ÜhiÒÈ‚ÉøYæä¸YÛxŽ´eŽêHXéØŽšÅŽðUï8m%ö¸Rõ˜²ÆŒþfm3È€üÈcû8ú„¹H™Â„ YE ùVäIBY‘%D‘©lᄸ‘‹æøŒ )aY’µ£‘(Y4'¹’F£’.I.-“ “4©+3ÿy“á&’ÎHƒ:‰Ž)Ôø“ñÈ“I’DÙV9™”wb“L¹$Kù”Kâ”RÉ!QY•B•X‰W¹•ø¡•^9]–Ó–dicy–¶a–j9iÙ–³Á–p)o9—¢!—vùu™—Ÿ—|Y{ù—•á—‚éY˜ŽA˜ˆ¹‡¹˜g”¦”Žé09™ƒ¡˜–•™™€™œ¹›ù™zᙢ‰¡YšwAš¨)§¹šq¡š®ù­›n›´É³y›ga›ºY¹Ù›dÁ›À)¿9œa!œÆ©Å™œYœÌyËùœVáœÒIÑYOAØÙ×¹L¡Þ©ÝÿžIžäyãyžBažê éÙž?ÁžðÙï9ŸÚ=¤ ¤DªCz¤ a¤JzIÚ¤Á¤PJO:¥!¥V*Uš¥Xj¥[j¥]:¥_:¥a ¥c ¥eÚ¤gÚ¤iª¤kª¤mz¤oz¤qJ¤sJ¤u¤w¤yê£{ê£}º£º£Š£ƒŠ£…Z£‡Z£‰ÿ*£‹*£ú¢ú¢‘Ê¢“Ê¢•š¢—š¢™j¢›j¢:¢Ÿ:¢¡ ¢£ ¢¥Ú¡§Ú¡©ª¡«ª¡­z¡¯z¡±J¡³J¡µ¡·¡¹ê »ê ½º ¿º ÁŠ ÃŠ ÅZ ÇZ É* Ë* ÍúŸÏúŸÑÊŸÓÊŸÕšŸ×šŸÙjŸÛjŸÝ:Ÿß:Ÿá Ÿã ŸåÚžçڞ骞몞ízžïzžýVm‘é“Yê›A9”ùœþh¯YƒýºóJžõÚ“9°Ê¹¯©°Çù¯+° ˜vw®F)„‹MfN¨'’f2)°±ZAD0eV£f´d@&+?]àe®ÿPRÖq1»)ÐhdЄSeuölQ1P0€´J›´L»´NÛ´Pû´RµT;µV[µX{µZ›µ\»µ^Ûµ`ûµb¶d;¶f[¶h{¶j›¶l»¶nÛ¶pû¶r·t;·VìwŒÖpdU´á‚;¸„[¸†{¸ˆ›¸Š»¸ŒÛ¸Žû¸¹’;¹”[¹–{¹˜›¹š»¹œÛ¹žû¹ »¹ÖVºÖ&r}ª»º¬Ûº®ûº°»²;»´[»¶{»¸›»º»»¼Û»¾û»À¼Â;¼Ä[¼Ä;`qÉ; Íû¼Î½Ð;½Ò[½Ô{½Ö›½Ø»½ÚÛ½Üû½Þ-¾à;¾â[¾ä{¾æ›¾è»¾êÛ¾ìû¾î¿ð;¿ò[¿ô{¿ö›¿øK¾!ù , ^‡ÿH° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱãACŠI²¤É“(Sª\ɲ¥Ë—AœI³¦Í›8sêÜÉs%2{ j@@Ñ£F‡*]Ê´©S–D%`€ªÕ¦H³>EÉI@ׯ^ÃnK¶¬Y²—¤½Ä¶íÚ¥žÄ+÷¬È?ðêÍk·¯ß¿€Sâ-8èOáÃm,@PAÇKŽìX ãÅ|÷jθ³çÏ +ö4º4éÊ-7«æ¬÷rÞÕ°ùÊvjøÏ"Å”'랺·ï߀ýN|øp—ƒ ´¼9óçÎÿéSX@Ÿáг;_n[ñu×Cÿ°ÿ ¶.ݹœºrξ½{ž}¬Ÿ6m¦ú†ê¯ tœž¼°`¥5Ö%‹¸ˆ$J"I"6X €ïE(á„)¡6ÐaµaˆØJl!xà‡†¢œXx‰‡¦è $ã5µˆ*Ƹ¢$ð¡…8æ¨ãFöˆ!Jƒð¡V(ʘ"[ñ dä’‹Ügu=)Æ “*¦ÞŽXf©%”Šu飉‘´—ZƒIåƒý—™gØ•pÔ1T“mÎx uWj©çžÆ7ššƒ Bß|ÖÄ‹DÎÈfƒHTç‘òõ!©Pƒxòaƒ fª Š4ªi!Ÿ †úžapà±ÈŸÅ¡$^—”Ùà ‹ÔÿGF¦§‹žÉÉq‚)T“lÊ Ç°²Ú†)‹x~*ê²ÌvÆÜ¼p²Æ©©ªt(—.bÛ-ÁÜ"ˆŒHÞãp¦Áz$n’&ÉS¥Ù(4ÔL#€4·k Íæ«¯g’aN;dÀAmž"­Jf‘qÎ8Òˆb®ƒ¶¶¨'W¼`Š÷õ:''(J‡(=#:ÒÀÑ1êî«òÊOÁúD6ÒXó‡ÀP®tm¢· Î-ƒ¼²3}Ty§¸˜ÖQ 8èœsŽæÜB+Ä‘N¥¥(ö²’Ä ôô½,wí5Sý‚#Ê)åÈzªJ·ê¡Õàcò¿ˆÝ‡™ Ħ$¢ˆRŠÞ¢´ÿбd5nÜñÇqr‹@Ô˜|/Ê_7îøM’</ üBެ‚ÞˆÒÍþ!J9¯ôÑê+æˆ4ÄC+é  œ#Ìë¯; iiR¯Kµž ðŠ‚—ðጊsýøðÄ·6/OL9К2Ii»zÑÌ̇Ȓð¡}¨Ã-À! ºÕHP0z¢'ˆÂFŠÂ^¤qBUª˜Ü[&1¹"6zò“é—6ª¡Žt¸Â( &’b Dpx5L× õ¨É‰«ƒÃt¹†5(±@æÚOú†ÂÅ'ÖÈ d !P:se*Â8æQ‡iC +=¢GœqJP²Q|b¤©Vø’$¥8Á©‰SÏŒ'Abœ"€à€ÙðÅÿ!éÉhQ¶\Ó£nã®,nl Db‘<úÂøìrp`5jzQ‡NdV·ðŽZ‘ÓPâSRˆxj›_Ík^á47µ´U-ÝCÙu ó­·°õ¯4’ÄhbÕ¥øJ® ÁKWõJÙÊs!r’«\S»£?ýwM¯z馾õØe=ì“ûúÙGWö¶nís\Üó>Ä¢þ½Ö=-ü±¿ø`'>òÓ~üå›]ùÎ{ó£ÏvèS¿îÓ¿¾Ü­¯ý½g¿ûxç>ÿøÿýñû]üæ?|ùÓOxô³¿ñë¿âÝ/ÿÉÇ¿þ§?þ3ÿý[^ÿþ÷yý€œ€Xzx€¢g€ ¸z Ø€¨Ç€{8®'x{˜´‡Ø{øºç"\»W‚NF‚(hb!¸‚µå{.¸F'ƒžƒ4C3xƒjdƒ:˜?9؃/ă@Hö“éH‘B9!/Y”!“Hl;¹”9¡”NÙG•Ré“TéMy•4•Z‰SÙ•^i•`^Y9–©&–fÙje™–*Á•l #kù–‰–rÉ‘AY—F—x)’w¹—¨—~‰’q˜+ ˜„é’ƒy˜1i˜ŠI“}Ù˜cá–lù•r)™iI™oi™f‰™“ɘiœy™žù™š›9𤙔‰™š¥‰š¬Yl«ùš¡™cišµéš²É¶ –´É›±™›Ñ›]¹›Ã‰›À™Ä©•©œ¿yœ ±œW™œÑiœÎÙlÍYaI”ØùŽ×¹T)áIÞ —YžþHžÞ)žQ žíÙè #ê¹ìé”îiŸð‰ž÷¹”õÉŸó‰ý‰”‹Ð ÚŸ[I Gf 6qa9¦ 5ÁaYæ 4Á j*fšš¡3q¡úú¡/ /&¢*ñ‰b& pô ¥À[°¢,ñ ¼p à£2ú¼µ£(£*!ù ,%ÿHP ",Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤IŽ—¤\©²åÉ—0cÊœI³¦Í›8sê$)H@ÏŸ>w J´¨Ñ£H“ í©‘©È?J£JJµªÕ«:-؇ç E}+¶,Y¬hÓª]˶-Á®ÉÊ+*T‡ Ê*pÑ݆ƒ8qÈé’aÁˆ 6ì¶±ãÇ#¿,LùRåË–-Ö8¢$AyûüÝGPéÓ¦Mçe,¹µë×°)þª7¯íA·ÿ¤.w/ÃÚ¸ƒç>Ho‡—þèÎ\¸ °±£KŸNݨ$ÑÄ›ÛV-IRÊ—ƒÿ/¾ü Ñ)yt©nòðË“‡^½¾ýûIuK…Ëç½|ÔËgš@p  |’w^A]â_|øUhá…5g ]Ùi(Óu–|¢u÷@ ¦HÞlËf\yf•%ˆ‚Їá8æÈÑ^©žrЉ"€¾×¥J¥¶]Yê‰Í“Ò1¯Æš×¬à6ìp[_ 0Ž<¯p±«x7ùZ'ÏÖá+Ê(*X»ÅËç´wYë߉®$Ö‰k×íÃ8çÌÖÛ`Í/T\LíLêR2´}‘J¯Ñª'ÈwÙ„#P8à@«{ÿ¢:ï"pxâP‰H¨óØdS%I¸RD9¼Ýo6ùšH·Œ3Ð8ÁºÜ’ÿ`,‚}tуw1ìžçõ Õ í ·È/•bo —mùå:ñ²l[¼$M’,€ 9Óô¼ç¡,”O”Í5®èºøªßÖ’‹¬! Aç°*«ñž÷¦˜o¼Lw=!ÐdrÎ/]œ·hë-RÇ‘¹¾ÞÞ’\ò·‚xt†0ÂàѧT¶¸â|\"ÊûúÂÿ¾’ U~üýøŽ0SÁì«Iè–ãG d~^Òc/&©j dˆ`õJª/uAÝwàp½rK*Í"ˆ—¿š#à àÀ p¤c·HÒôþ#œ¹Õ!N á›÷ê$§¯,â‡?DÐÿP†.NU°8H4Že¿:ñ‰98~Ah0#¢p…(†:ôGE5ÚÖ¸º{E(>çéL•æ0*¨‰PŒcþÜs6m°£çp…6¨@†ÃÍðŒâSߌ…C7®Œ‡„1£! (ÇFÊQOÐÆ8.Ð g0ÃT¸N¾Ø!æ˜æ<}ë”v:œ¬Y©€£dNàèÈV^îi[$C)Ê¡fð&íÉiŠ´KÒgFìò‹F•©bòò˜¢)æ"T²Ù ;ÐŒ¦4¥9LgºòšÅëø»Rð"KÇ™Éh¦Iξ šqD²¼Ö·v–3š*áDß|cM–س%÷ôÉV°ÉTOÌé¥+¹ÂÉ (ôœEtç™m'AT–pD¡ Øë‚†èD|èCF7ªÑ®tÅ¡ý ©åˆ“R½i"'ÂCCðä·–Bä;ÙÉ>EJÓš6%)!ù ,Ão(ÿ4° Áƒ \Ȱ¡Ã‡#JœH±"‹ 1¬È±£Ç3ŠÔ²¤É“!Iª,ˆ²¥Ë—ÿ¼œI³¦™ɴɳgG@súJ”aРE“=šs§Ò§:lÊT'Ô«cB¬J«W‡:õáÔëѯ_•ºÐlW´^ zè)Ü»`©êŠ·ïͺMýú,Øï^½…F˜Ø°U¡#„,¹ï +÷í3hKÍP»4 ‡ Ð^OÀP­úÆ‚RìP€ê 2bÈÐ#Á)yÑr\¸]Û+Žºž•â¶CŒʼnîž.`G]Ö ÃÆŽÝѓƘ°~ëZ‹'˜oQ"|RòÙ|zrŒ[‡ ÐÝqüÖ¶'€ôñ„2Øô‚~D‘· ¢ôâ:ôHÓÀöÄ_å5#Ï)æ<‘íUØÓ œ²Ï2Ò(. Ÿˆ5Ýà€&Û:Á˜Ã…0öœpÁ2ê4ÓbC±‡´÷"’6Aw!B¹Ÿ8X)ž‹Zž!ù ,Ä+!ÿ(ðOŸ‚*8hÑ  ä’"—‹ ’8Að ?Š)0Á2PªLÉReÆ2`ÊŒ)c¡I‚4gÊX³¦Âœ@gfä©3èРH‡ @Z4#S JŸÂ\:´¨N¥­ÒÄ:0FSŸ\K˜œÊu`‰8€-»#«oÊl«‹^3 nÈíQà—³^Ô€H#¡;úVàlZ†Sfäû«Z‹"Ψ5ðPãÄzYËÑçÉ3j ¸¹o¯kOÕiÁ,…Õ {e{"‰»rõž5€1”25fìn[CI⬶eUÏÙµ`ÔB1 Ãâ§Ð.(cŽÜ¸%Ž%c‡hëœ-Øݦ€ vt8AhˆúêÅ —@¬%WI!ù ,Ë:Ý!° Áƒc” ˆð Œ2J441F†,ôðÃÁŽ…cô`íX€/b )°ÄÜØ¹:ðC€Âˆ c¼Ä&jÚ¯=R(TÙò%·R-¶õDãÀ„Foùð¢tÀUº„y‹Ë8à~%ªf/.ƒÈtɦ‹Áާ[¿ñªSg»uõ4AxkóÇlÂÐQ#VíŽ$l4*ض[Öˆ@8qÂàHjÌ,‹&Ø0l ”ÑáH aÀ© Å GC4pP€¢BB„7ƒà€#cÁ1r !ù ,¤!ù ,¤!ù ,`qÿH° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠTˆ`¤É“(Sª\ɲ¥Ë—0cÊÔȩΙ8sêÜɳ§ÏŸ@ƒ&$´¨Ñ£H“*]Ê´©Ó§P£JJµªÕ«X³jÝʵ«×¯`ÊK¶¬Ù³hÓªL$ð¤·ÔÊK·.]A‚‰ÙëF[@}ì L¸pÓA‰¹é 2`úÆ l¸²å˘Wòa›Ú»{üøÙ{Ì !H€2«^ͺuDH} ‰ -Ú^h{ÐúºÞÍ»7ë?³íÙ}ïžm{Èê°õͼ¹ó´u€ ·—_ñê¶ßñyν»w­Äÿ¿§O¾~ò¶WÑ÷÷ðã# ?ž_yýŒÛ†&&®üÿSxïˆVzæéÇþ èàƒzD?âWžuÃ!#†{vèá‡ýˆÈ¨O~öè£?ïtBˆ0Æ(# 8qÃíçQ2öè#„‚DwÜtò#Nƒ?&©¤|rS mŠãâ’TVù\lÔ 2â¼óŽ8ÀàQÇ{¤få™h®X^n¸Á—n˜™æœt^†ÈÖ©çž• Â矀*è „j衈&ªè¢Å#£F*Ôr’Vj©L]i¦—vê)Jœ~*ꨤ–jꩨ¦ªêª¬¶êê{1¼ÿ*kª±Îj«¨1Ä€ƒ ·öÚé 2à @­¾Ëh ì ÃÂë,¡±"KA0ÀÀ³ØŠA½èqÊ)Ù†»g¬?`Ž:Ïòzä#%“gIDÞB’„Ü$ò:¹RFR‘¢löVº²Y e*9XC¸”5qair–Å;À0€b ÐAԀɼœà=èÁ¦YƒÕ1sy(¨›Â¶_^³xª ÷Íå¡n Þ,'ð!ù ,a…ÿˆÁ@*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI¡I'S¢\‰ð¡Ê—,c’œ9‘Í›8sêÜɳ§ÏŸ@ƒR´éI@Ñ£F“"Eúp©Ò§Nm ¹¨ÏÀ?W`ݪµ+Ö©`ÊK¶¬Ù³¹ªõ q­[¶oÑJ¬ÓçÏ »xïêÍ›W®ß¿€ lÖnŸ½ˆù&dUaâÇŠ±6&ÜuPºuêâ“ù²gÌŸïRMº´éÓ”ÿü©cùræ×°AcƺH€ ƒöùÌ[6oÜ“ Ê '6ñ:Å“#_çkpÔУKŸN£ëãÊ•- îîìÌÃÿç^Î"Qž8yZ¾½'÷îÿÀÉݵºýûøó›¶›Y½úõß{ždv› æ¨à‚ .Ri\æÉ%Vhá…r" ‚ܦ߇ †(¢P‚ ÒÜ„œ`xᄦ艉ƒ"ß%,ªhcŠœ4÷Õ`ÃÕ‘¢@R¸¡e#iä‘HjÔÇ"þdz(âhbU&^ ŽViå•—ÀqXjjyã†x˜ä™h¦yd‰'fi!”-¦ç"Æ8#Šnj‰£Ž”õÈå›þÁ©â|Ï©i衈¢¶d“ª‡Gqrª·¥•SǤXBé–W¦è%}ƒEXG>‡@È-r¡†š™è«°Æÿ*›àé&1ÑCáz\NèI2^Šç’H²ˆ±’dÉ)ŸÂõç$…Ô´ÃŽ<î°Ã1ª^H¨¬Üvë-P‹ òì%¥°³O=û°s QRjž¥˜îzÊ)®Ô{Š(Êrù)˜£VÈÉ ¯ì³?êÌãÏ?íÀQ#«~ëðÃD«­’˜SÏ1žS:’ÈI#óû±‹‹ð²Ï?þ¤ì1µ.«ZŸÎV¸È-ÿ# 5(·ã£¶DFìóÏ@?®“‹œRO4 ÃñÌ>®tŒi¥Urù£(¼Tm5¾8êû%a¢.<ÍædS 1×Ì#ÂþnØpÐl·íóÄY.âÊ>ØŠ²ˆ0þÜÒñœ¿†ÿ|§²’”Í4Ò.Í+’Hm%³<ÆLá"¯ø# {} 3ãnëöæœË:t…’ˆ2;’Ô!É:óàÛî¿ïFõÌôÔ#»ì,GééÖ¡†¹+sŸ,J59“±°Ú®vnüñIÚÕ&ÉÇìãÎ5îìM²é}Ü·Âæ{ Üwï´Ë; æ§…¢,®0áø³Ï<¼ÚeÏÈÇ/ˆ‹’5’Ã=ì“;-’Ô.%5OHâó ‡(ŒZaj_\ëÚh‡iüC`SŸÀüñŠl1¬xó ¡£ó90Jv³LU4Ö|YX»Ò„\amhc6Ô›ârô²fíLH¥°šÿ­–9øðˆHMýîç"^‰¢ÄGغK)ËJZƒµ˜8&B0w’jî"£½dˆxIL£SÂ:œðŠ™’Ä ²ä+ŽjÏ)ØÃÆý0CpÌS…4·ÆB2,KŒ§h$5)U±E\¤q'˜aNL*úà!7ÉIŸ°©Êd =!Ÿ»Ìh‘bÚSÅןK$ “<+T'gIË$–b•¬ˆK7划QÍ¥D1 bæñ=hU-—ÉLŽÈ(3ì9¦1ÝS 7ZÒ(Çd€ˆ‰ž.…/TpàÆIÎrš“œuXX#ËfºóQç9çiÎ:pa ¨’Ï=ÅCÿÏq‡ na0á@…‚ô EèƒÚ φ6´.u CAŸ@ŠZ´¢}‚F J7v‡&ÂhBGzÐùœf‹Hi"R”¦ôX05KAåКڔ>.e©N[ºÓžÞf2|èPOyJÔ&‚¡•äÃøÐ¦2Õ7²ù¦M§êЭÐÅ©MÍ*VŸZ¨­jõ«X½*UÇJÖ²šõ¬h¥*ÒÊÖ¶: Zä:W·Úõ®†BŽX‡¹ž ¯€ ¬ˆ~ð RËØÆâgÑ Æ4ªAŒÅ:ö²˜5 JQixi™ ­‘dÐÐ#áwž%Ü8EËZ• ¦œõ,5¤‘ÎÖÿÚÖ>2(AnáiÚØRc¶p½­p§“[Ò’¶™G@l§\Ë÷¹¦1®n_»ÌÞv–¹Ò.t·Kã  ¸ºefr—Û\îš·»ÓÝmuÉ@Þì:÷¼ð-‹tÁ ^ZŽ÷ºå¯~Í’Þþ·“Ö•­{÷Kà°Ì7½âU.~\àO…¾á­e€±«][x'¦ïwgy_WøÂ Î „ë `{ø½!N±HF^ïn²ÃF±ŠgÌ‘ ÷—Ã&Ž1w ÿ¶xÃ/Îq~yLdŒ°x·Ôå$Œ‡\ä&SäÈþ¯!—Ì`'[Y"6@’ƒÜÞ_ùË ±±w¥\H*{Ìhˆ˜·|H3Ë8ÿÍiÖ°‹Û,ä*Ã9ÎQH„KÜå7ßÙÊdž3—|æ?™Ì®s¡ Íh%+ÚÏŽ´Ý,éJúÄ–Îô)­éN‘Óžµü@-êRwŽÔ¦N5ÛP­êVGŒÕ®Žµ·`-ëZÊֶε¡p­ë^'‰×¾öˆ€-ìbë‡ØÆNvu­ìfC‡ÙÎŽ6i -íj †ÚÖζ\°­ín“…ÛÞ÷TÀ-îrû„ÜæNwNЭîv“„ÝîŽ÷Gà-ïzk„Ö ¸½÷=jWüøE8 `HÇ2€€è"¿ÇNqŠ|(†@„ñœBhƒ:ÐƒŠ›ü!ÿ? °€$ ,pÀnÀ€'ÏùB^‚ü`:è J tÄ@Í 8Dv }wÑI†cðƒÿ¼ä‘Á ~ptt$G»E¾Nv£+äë¨A;EÄžµ·Ý#n/¥€œ`¸LÚ£C"ÀŽ °¹!/^ ” ð xÜò©ÿ]"G/8 ¥3Dó¯Í¼à/T€óöÈkÙËñÌ…/„a exŸ!G9ÌqtN°Cä=n„wJœR ‚hK64 bÒdаÀ‰Ø“‚ŒdjŠÊÔò—™°{µy“Ì&n<ƒjÕp-S›dž#’¨.i@P€PWÔзh+ %î‰ãZi7mõï67pPgĨŽ60€À©¡7Õ{–“ÁؾV¹« ` €À ²§!©¤14`Y‚žoŽ´äHIÃ¥Ò †"ÆâQ“†ô£ºçHïIH‰š’5í)Mkc9¼Õ¦;éP?™µÛÐ,m!õ@NÊÓÚf‰UiR³JÕ ©=ýiNªÔ®j5¨EkZÕ:C„ÞPh™9A N‚þÕUŒ M^4p½"ÕrcÓ€ôZ;3ÈÁ(ΰ‰9â!ÎB@ 8b9˜B-Ø P˜"Ž@…¦°Š,´ Y`ƒ#Ð0ŠÇá@$LPBI¨ÅVàp ØA>Ѐ„°„"Œ€«°ƒæð÷%Ì"BX¯ F„`È¡/h‚!è0†+ŒAzø²\°Ì/JVçË–/ÑU¿zÖ·~õF’¾¦3bE*> TìÿÂ,¶ŠQdÀ¦ .-² ƒ³³¡lxz$Ü>‹-H ©XÁ(6âTÌÁ²(8V!„ `"µ Dž‹3H «ˆBØûO¼$@p‚!H!WPƒ&°ïˆp¸ Qœ;=ž+Ÿs½„À”@ƒ=¤Ú›FÈ!Ø…8p¹k@X…È‚¼´â;>êZ…-À»¨…"оXp;Zˆ„ 0± Ø„Tð)È…²‹…QØ€LHQ‹ãŠhYˆ p„Xð'ÔÜçÉMÐ €Р¸€ 8X€P(ƒk™‘0¥X@0K½ dÃÿ6tÃ7t!Ø#@67Gø Ð6GH…¿c‚TH…Qè@ ¨; ÈUh¤S…OèÀlËX‚'ð%P…~Ë…­cSP…YÈ„ðVضZ˜ƒÉÙ1 P @Yˆ…UˆƒD#C…%8¹^X°¥¸ `i˜†jÀ†2˜œ›Ë9S6t@8TÆedÆfÌŒ ;!˜&¨®ÀCƒ)ˆ‚åÓ&`Á,H‚(œO+;x3H3X ØT°4¨„$UØ‚)˜!!ØmôS®,à'SR@*sL‚÷Ù&0ƒ3›¸…2¨K²8‚ÿPgÀŠp2=cÜ95tÆÉ‘t=ØËŒÀÒ,`±Àâ±À°˜„ISÄ0`Iƒ±Sü4L`„IÔ:€%ðZ°¬ÚX˜,¡R´$ð#±ÊŒÐ=—ÙPÀè².û‡_h@¬"ɱ$˲,3“€ÛŠŠ(²€¤¨‹Ò–·¬¨"ƒÔ³¸Kˆȱ  A!À‹ ‹ª(o|/±Äžº„K›DÌÙ¸Ü (8‚Y¥S:¨‡z؇z °XC³$ÍÒ4ÍÕBKœÁµ€ èâà ’¬1Ë™~*HP‚#ðMß”.ÿ8Íá$Îâ¨ÔTÍÚ0Lœ²¨ÜXµ´ (ØM€#|¢+Û4ÎìÔÎíìã°!Øâ™ÂŠ6’x’ˆ¢ó"îTÏõdÏîü·Š-²,+ñlÏú´OÒDÎûÔÏýäO ÌÏþÐPiûÏ5ÐEP ô΄z«uÐ…е*ХРµÐá˜Ð ÕÐ åÐj[PøìÐÑÍÐ5ÑíÏEÑeQõTÑ…Ñ5͕ѵѤÑÕÑeÃåÑRÕóÑ %Ò"¶!5Ò$UR2CÒ%uÒ'e­&…Ò)¥Rƒ’Ò*ÅÒ,ÃO-õÒ/]3.•00%Ó2}¡+5Ó4USÿ@Ó5uÓ/mÓ7•Ó*Ó9µS'­Ó;ÕÓ"ÍÓ=õSíÓ?Ô ÔA5T-ÔCUÔMÔEuÔ mÔG•T ÔIµÔ­ÔKÕTÍÔMõÔýìÔOÕö ÕQ5Õí,ÕSUUâLÕUuUüÓ}ÕY}ÐV¥Õ[uF[ÅÕ]…C]åÕ_@_Öa-ÉXObEV5ÖdeVîÖf…V]Öh¥ÖÖjÅV²|ÖlåVÛÖn×ûÖp%WÕ×rEWµ:×teW‚Z×v…×¢»Öx¥× {×zÅ×›¹×|å×àØ×~XÞø×€%Xš×‚EØØ„MØ…eØ‚u؇ ؈•Øÿ~¥ØŠÍ׋ŨzÕØ×ŽõØvÙMב%Ùr5Ù“ ×”UÙneÙ–ÍÖ—…Ùj•Ù™ÖšµÙfÅÙœMÖåYbõÙŸÖ Z^%Ú¢ÅÕ£EZZUÚ¥}Õ¦uÚU…Ú¨=Õ©¥ÚQµÚ«ýÔ¬ÕÚMåÚ®½Ô¯ÛIÛ±}Ô²5ÛEEÛ´=ÔµeÛAuÛ·ýÓ¸•Û=¥Ûº½Ó»ÅÛ9ÕÛ½}Ó¾õÛ5ÜÀMÓÁ%Ü25ÜÃÓÄU\/eÜÆÍÒÇ…\:=ØÉ­Xɵ\(ÅÜÌÅÓÊå܆õÜÏ…ØÐ݉%ÝÒµØÓEÝŒUÝÕåØÖuÝ…ÝØÙ٥ݒµÝÛEÙÜÕÝ•åÝÿÞuÙßÞ˜Þá¥Ùâ5Þ›EÞäÕÙåeÞžuÞçÚè•Þ¡¥Þê5ÚëÅÞ¤ÕÞíeÚîõÞ§ßð•Úñ%ߪ5ßóÅÚôUß­eßöõÚ÷…ß°•ßù%Ûúµß³ÅßüUÛýåß¶õßÿ…Ûà¹%à¶ÛFà¼UàæÛvà¿…àÜ ¦àµà FÜ ÖàÅåàvÜáÈá¦Ü÷ìRþ^S_–U._>VVÕ͵áûÄá®ÏæaöôáVVbô%â"^ß#Fb÷Uâ%Žß&vbú…â(¾ß)¦býµâ+îß,Öbæâ.à/cã1Nà26cÿFã4~à5fc vã7®à8–c ¦ã:Þà;ÆcÖã=á>öcä@>áïlaBncCŽaD†cE®aFvÓ †ä7”äInÃJ¶ä`-áL¶PLædôäO.ÖAe" åR~½M~Û›ÚÕSÆV œ@ ìÔTW¦Ö] €P€˜ eKµef­£ €g†[ˆE˜ŠtÕ`nVÉÒ…z`f€jÍšUgFÖ:Š€0à†jp†…‰_–TmfV ø†o(ƒ0ž[5çaÍëñ(`æfVe¶…PnMh çrÞg°ç8‚oè çƒ6Ûèÿ%ø†rP,}&eàÍØ‡sƒh¶l†h„îèt(‡f8Ò[aG^àHV؇娇h¸æ‡ÞhŽÆ v˜iX‡_3ž–éŽ P€LZZáÞžÞX"ñùœV>é±ee¤fÐGFe-篖V©k ë²~¶³Fk5SëµF³¶vk3ƒë¸fÒ¬¦kûœë»n°¼Ök…µë¾^O¾lìÁŽÒ¿6lí,ìÄN­ÅfìÍrìÇVWÄ–ìáŒìʶRÊÆìÒ¼ìͨÎöl¶ÒìÐÖÖÑ&m’íÓ>SÓVmeíÖnÆÔ†m‘íÙÆ™Ú¶m›ÁíÜÆÐŸ×æm7Üíߎànß îâXßFî<îåÆ ‹$²vîûì€#èéžîú„nìÎnö¬îëNêîÞÐíoñ¾ÐïænóÞN®‰îòVo EoC¯~o-–X­ïó.I€‰i°bXúÎï­2…fˆbX„5€p …2€8ÈŒE~p%‚:`ð oƒ6€ ¸ð• ñÙ!ù ,_ƒÿ8ðÁƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0Kh¦Å™1+.XG`Ÿžz JhΣH“*]Ê´©Ó:=ûàá3µ*Õ¡Qù úcPW¨EP[•gÐ>Nò‡­À¶pÄMK·®Ý»xó"m«[¸pàüY+V®a¾~‡Ê ¬¡¨Çˆ’Ly²åƘ3kÞ̹1œKC‹®Lù’À™3‰^Íúñ ¾yëÀÅÉSíÛ¶sã¾-êÒšÎÀƒ N|ã"Úº“߀[òN‚ž˜+Ÿ^Û“mQ¿=‹²Î½»÷ïœÖ$ÿ*N¾¼ùóœÿ. zwQÏ®YO}á¼|fW¯¿¾÷Aè(à€¶à ´mgÝvqמủ’š|œ<ÈŸw f×X«Ù'^ †(âˆÍ”ˆ‚ z"Êuä wœÀ'Nóõ§âô݇W~Èu7TñQ‡$úFâ‘H&)¢AƸ @ÌHÃL…“9ãL5­Qáw—téå~*Æ(Z~W<îÐ3;îs‰w|¨äœtÖ ÜLê9èJ;þìã;® ãdÕˆ¡+ (˜¶£~ JrË?”²CÏ?ÈÊþÙéé§ ÒÅd‚* Î>ÌpÌ>êHfåŠ6iÿi¡(’ôâ”RÊ ‚ ŠI¦^ÞI‹?˜^b ®òübtr†êì³Ð¦„§‚½¹âÏ4”EãÏ-®Z'f¡ö!TŠ“ÝéxÕÑÊË?é€ã 3à¨Y§FFkï½øn4ª“¦a*$¸ ]Œ5$+w½" 5ÓPãð-oö:Ù¯yywɺÄÿSÎ?þÐó ŠjÈôÜtƒºœãN=îÿ ~to‹,"‰öÜoo1ñà‡_Üçp„^ö霺…_Vå{Žý^kÁ)·øøç™ñÖÿÞàŒºõWÈP€ÒŸ(*¨†\ “„A A(3´Ù u’c›1ðƒ | žº£Á~m Z2¡ O˜´ÔÎ}¤ádÆÂÚÐ%‘‘a +C(, sÿ(s¿ºÔ„ éoÈÄ&†¤[!ƒD²*á‚€b¬Ø($0E¼K×ð„2šñŒh<£\pâÄ6ºÑ"‚¨ Ê(€'ÔñŽvÌã@ÊÈ…19+I£ éø„5@±1Øö° !ÛÐ'II‰B{,c¤&wÂÉMÎh0ùž<ÙÉR2r'‹É„*ÉÊVº„dJL_‚YÊÒ,®Ì¥.w)@Ä‘—À fݺÀböQ˜ÈLf¾Ú —߬á™ÊŒ¦4?•€­¡- ˜¦6·)"8¬ÁÓ°†3LãEnšóœå¹D5À‘ r4CŠèŒ§<…ã vf£Õ0Ê<÷ÉÿϼœbÙÐ>ëÆ~ô 9éB=ŠO<¨DaòŠq\C ÕÀC9'ÊÑŽŽ¤¢ Í( Jšô¤©èEºQ”ºô¥)F5JR˜Úô¦ QéL[ŠÓžÂT¦,­©O‡úR²”¨H-*@w*Ô¤:U¢FéS§:Q Š´©Tͪ<£ªQ­zuŸV¥©JúÕ²n“«<5«Z…Ö‘Žu­pE&ZãJW¶.5¨o­«^[9×½ú••mÅê_{þö°L l^ËX¶±U bÉÙʂﱖͬð&«ÙÎn³ž ­Ò8+ÚÒŽ ´¦Mm´H«ÚÖ: µ®mX+ÛÚÿ* ¶¶Í­ˆh«ÛÞ·¾ îyx+Üâ’¸ÆM.pˆ«Üæn¹În^˜+ÝêÚºÖÍ.S¨«Ýî&»Þ ïK¸+Þò²¼æM¯IÈ«Þö~Ô¢;u¯|Ï{׫.v¾ø zóËߊ°·¿–È~L`†ü·ÀNÈ€Ì`¸Á ^0„ üà S¾Gµ°†\_±RvÖ0ˆó[á“ÃR51ˆK¬bùЏÅíe1ŒÕûâ›WÆ6.os^óØ»;þ±v},äì¹ÈÕ%2’¥{ä%;WÉNnn“£œ\(SÙ¸S¾²p­¬åàf¹Ë½å2˜uûå1ÛVÌf®m™Ó[4³Ùÿµk~³jÝ,çÔÆ¹Î¥¥3žE{ç={VÏ~îlŸY@Ú²ƒ>td ­hÈ&ºÑŒe4¤ûèIVÒ–l¥3íWLsz¯›þt]=-jº†ºÔp%5ª×zêU›UÕ®.k«cíUXÓZ«³¾5Um­ë©æº×Nå5°“úëaUØÆj±“ÝSd3§Ë~¶M-ퟢ¸«Õæs‡ÝúálW6ÚÞ>)µÃmRp“»£ã>7GÍ­n¨n[°í¾ôµÓ₩»Þe7¾ûyï}óSßþžg¿¾Õyü°?ø9®ps&¼ág58ÄAýîûN\­ ¿¸4®qef¼ãÉä8ÈíºÒãÿïöÉw-ñ•Ë:å.¯uËcŽk˜Óœå%Çöͳ*òvæ>¶ÍƒŽÔ’=?º®ô¥½éÐ:Ô£RO½ÙR¿ºµ«Îm­ß”é^¯aÒÃB°“ýƒc?ûÍ®vÉ>½íëÎ:Ü«úö¹G”ív_Úó~Y¹óÝ {ÿûfý.x°Ö½ð'<âãøÅÓ ïŽüá#ïpÅS>â\‡÷å¹ ùÍ—¬ñž?­åCïñÉ“¾ô9§÷éKŸy‹¯>š½½@/{hžöÏ¢=îCuû݃J÷¾÷Tïƒo'àŸNÃ?þœŒ¯ü$%¿ùHb>ôIôüéHúÖQõ³"ìsŸ@Ûÿþÿ€¼/þ…¿üè!?úÍsþõ—Gýî/NûãOøÓ_8ó¿pì¯ÿÎä¿ÿœÁ¨ÿ7€™!€Ø˜€z€ ˆ ø€wá€XXtAè¸M¡¸‚J‚$ˆ#x‚Ga‚*)Ø‚ez0¸4/8ƒ-Á‚6H_©—ƒÃƒƒ<˜5øƒ(áƒB¸^£W„÷B„Hø^;¸„s£„NA…!…TØSx…a…Z¨YØ…Á…`x_8†!†fHe˜†þ%ƒl¸|Gø†Îç†r}qX‡ÔG‡xx}w¸‡Ú§‡~Ø}}ˆàˆ„8~ƒxˆægˆŠ˜~‰ÿ؈ìLjø~8‰ò'‰–X•˜‰ø‡‰œ¸›ø‰þ牢€¡XŠHЍx€§¸Š ¨Š®Ø€­‹‹´8³x‹h‹º˜¹Ø‹È‹Àø¿8Œ"(ŒÆX‚ŘŒ(ˆŒÌ¸‚ˈg2 Ó8š…†Ñ%% ÜˆhÑXgܸâhŽæŒoV㘎ßöo–ŽáHŽ…Æ…Žï8Ž‹ÆŽçèŽÛ¸Ž­§r®FîèMÈlõØ÷ØÀï(ñõlYÞˆ½¦ö¸Žilúhå(‘ ™‘yÙ‘ ‘fŽu–‘ ™aÉT®§kÕH׈`­%Åÿe“:©m!k6¹@Ð=ð8 69“kù 0 p”)ir>)ÉD° ¿p Í ðg&9f8À¥PÍÐ íÀ ðTi‘ Ùk1€Zð Õ° êÀ Ђ6–5Ûð “? –=Ik1@D° Û —$É.é¥f“4pܧ;€˜q)—/€™äP €o)™xE™¨V'ð åp Й}™˜´ö À è0 °§y“ l?P è0Í %ЛåH›«v   û@ Ñ@ÖЖ}™”®† í` ÓÀÉ|9“Êó¹œàè)È~9f7€;°=pëÉžãéj™gíÉfõ™œŸ lý‰šö¥šÏøŠ÷Y ¯hÊŠº µ¨ *‹ ¡»¡Š‹z¡Áh¡ê‹Ú¡ÇÈ¡ JŒ:¢Í(¢&ªŒ%š¢.¸Ÿ,Š…4ù¢0Úz2Ú1ð‘k8‰7àÀŠU£Lq£‘£¸£=ú£@ªBê`1š¤a¤>ZqNš7zLÊuSªPФYU*®€b†Ñ¥Ga¤ Nã  äÀ Qdšk`6ÕÀ ’Ðnú¦J¡Oxšp §µ§Iq§!ù ,]yÿáH° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠÉÐÉ“(Sª\ɲ¥Ë—0cÊhrÍŸ™âÜɳ§ÏŸ@ƒ J´dÑ£H“*]Ê´)Çš7‘êtJµªÕ«X—šÌºr+ׯ`Ê;ñ¦ k*Ö$˶­Û·pyZ3HÃuò’à5b߸€ L¸¡Ù„‰ êsÌaZŠk KžL¹ò×¹u5îýû³åÏ C‹–yXã㉑G«^ͺµÆ¹‰ìfÜ ÙµíÛ¸s¤­EÙºƒ ^xQZàÉxvh—ñçУKGÈiºõëØ‰ž@E£À.ÙËÿŸû ùóèÓ§?Ë[½û÷ÓßO¿>öE¼·ÛßÏ¿G2] h CuLÇ‚6è u¬ÑÇ%ÀQǃf8ß…¯TN4ž¦áˆ$fÇI6æ€sŽ3"–èâ‹ÃuqË9áŒCŽ6DŒ<öȸB£Ûäèã‘H‚FÆ+CÞȇN;&)å”py@P“ÝP©å–lÅÐ5©Í\–i¦U2`e˜5’“å™pÆ™”—` &™ræ©gOi®ig›oî)è /Ñɦcªè¢$õy% ŒF*iG†þ‰(ž“fª)DŽê榠†ºP¥wŠjª©Zú马‚Jj›‰¶ÿ*k¤©b9ë­Œ¾z)®¼îY+¤½+§®7b*ì±Zþjc È6;%±±:+­Ê®:íµÏBÝÐF'½ÑJ7-ÒNG ÓRWÔVg}ÕZwÍ©š.ëõØ”~éi´d§MÖj·m×n·ÍvÜnÃM7Ùsß¶Ýzwÿwß^ó ¸Õžµà†G]xâR#θҋ?Þ´ã’yåFSŽ¹Ï—o´æžçÜyè:ƒNºÌ£Ÿ^³éª·œzë.³»É¯Ïž²ì¶‡\{î"ãλƻÿÞ±ïÂW|ñ¼ÃÇ/±òÎ'Ü|ô CO½ÀÓ__°õÚ÷›}÷þr¾½ßŸ¯øæÇ[~úò¢Ï¾ºë¿ß®ûò—ýæÒ·÷ï®þþ»Vÿˆ-ÐY< ´ ¨Àc%°Èb {õÀ K‚¼U3ˆ+ r°Uü ¬<(BTÍSà*aÂH¨BP…°…¢b! 3õÂnJ†6¤Õ U•Âê ‡>TT ÿƒ) QPC<¢¢Œ¨Ä<%±‰‚b"áôÄ)æIŠV,S³',r1Y;´Õçg6U¡mŒáÚ"·äÅ5"In|VKGþ…XuìVó#8òÑG{üc‰ü(H²"$"KtÈE>H‘ŽÔP##y HRr\s„Õ¶.9+Krò@“üd<)J…²”ﺣØPy«S²r>¤|¥}\)K÷IJ–ó¡%.ï¥Jkí2Tºüåxn)Ìô³˜Ù!&2÷•É]-sRÊ|fxŽ)MéD³š×¡&6ŸsÍm¬™Åò¦{ÙCq^œg4§œº©Îáh³¸a'ì›gÂÎù°uì ›g¿î9°}ÞëŸýh¼z¯…®ë¡ñšh¹.º®~« Jаù²Êã€ö2YL[”Ò–.§§#MsºÉ£þt¥Q˜êLoÚŒm5\&½jÊÚ¢¦¶Ó8%Ÿ[ Ô`RÆÑ <øš£¨Ð‰Î1t8ãØ“!Ã)¦¡gC»0u¸ð‡6$HG×Ì‚²­ípæ !ù ,¤!ù ,¤!ù ,rrò8°‡€&ĠЃfÜpØÃM(kDZâPN@Ó"˜ô°Í % GHœó8ðĆœð!À 7Š HÀ/g`”¨AC†ÀißÊMÓ"`‡ƒ J`áÄ%<ȈC` Ätl‰;ÀÊ•QâÆ )z]+Ðißtc¼,X¡BÀˆé*l8áâljž(¸2a”g•˹sVµ†‹V,Àoc˨1ó ùqéÆN[‹nLpôè׆cÛ^L{àîȦ—þM·÷pÙ¤»ÖökÈŸ?ŸÛp@!ù ,¤!ù ,¤!ù ,¤!ù ,¤!ù ,¤!ù ,vwÇ䰣ǃ?~ÈÈPà "(C qDCMšGiÔEXÈpG]ÿRªVàGà NýÛGsß¿^ z4ÔÑ@æ>þlöJ ³dÌ™@…&رsϤ7 hòiЛ t Ã)Ò«½¤ ˆC@Õ¯Ju4µ*T,Y³ ØbU˰«L @ÿýr[v‡Sõ×û§++ò,RẎˆ†YˆØp‚ĉ@°+±€0n„>! ä²e!sV͵ê€!ù ,x… 3¸o @)(9Âa 4h¤H¢„E‹RÈð¢ 7C@É’#7ª4!ù ,¤!ù ,¤!ù ,¤!ù ,¤!ù ,vwoq£D 2bà(!°¡À#Ê(qã ‡'Æ(±±#Æ%2†™#É“r\鱣ʈ0aªI3¤Ã–,Y‚¬IS€ >Qžœ)´äÏ ‘*ýH5kS¯ !ù ,¤!ù ,¤!ù ,¤!ù ,¤!ù ,¤!ù ,vwÇ䰣ǃ?~ÈÈPà "(C qDCMšGiÔEXÈpG]ÿRªVàGà NýÛGsß¿^ z4ÔÑ@æ>þlöJ ³dÌ™@…&رsϤ7 hòiЛ t Ã)Ò«½¤ ˆC@Õ¯Ju4µ*T,Y³ ØbU˰«L @ÿýr[v‡Sõ×û§++ò,RẎˆ†YˆØp‚ĉ@°+±€0n„>! ä²e!sV͵ê€!ù ,x… 3¸o @)(9Âa 4h¤H¢„E‹RÈð¢ 7C@É’#7ª4!ù ,¤!ù ,¤!ù ,¤!ù ,pa E1° @2J$\XàB…F„ˆpâËZTxcB„/vÜH°¢Èƒ$Gb@’£GŠ!3šŒxdÍ›q¼!ù ,qrÿHP`‚‚ V@Xb` 2d•°œ &€„@ee*Ü`aà„5h*ˆQ`‰“ôœ0¦Àf ²À!£@+UÀØP"†‡ 0J܈q£(?~p ñ£!A7ê £„Œ`  À€H”A#…@)hUz#Â0jÒòNkbà¶4Ô–h+ÃkŒÚý[¼xßžcÐø* Û;nD-îß¾Ïþæm <°Ä‰¤`10h0 Duž÷ùûGBÖ‚0NßÀ hدh“À–=»6i‚]w4è%¯—.t$:§M2Áµ7ô !6Vå<û«ÛG{tŒ„%”ÿ²Á´`á§×¶>»]ér4(WÊœxòô˜‡ÞÜÒN4Ö|³ÀpþWBØ-gÍ$ÁX!ÜåGPz óÍ Ü0l :Hß[jÅÀAšhðCœãO=ûÐ(š†oÃ4ETGñƒ@TVSa2À Ã 1¤%€àA€XB×URr©u›‡¥Zd¦•˜5Efdš!ù ,¤!ù ,¤!ù ,¤!ù ,¤!ù ,}qÿ”!° Áƒ1 \ÈP‡5„H¡Áen6Œ @“Å…'ˆ$$ÀZ>ÒÁAÀ4ß>,! Æ@¤ˆbÇ2JüÜq°DÐ1‚îØáa€ÓN#-©Q¤14@™&­«4j¥LpµªÒ zþ©]-À‚=`íQ züíÛ»ï_³oÀ@£'NóÏŸã¾Í ô0¨ç”cJ8üVÊñc¿€k 4„¹[J™›äY/è1¨6,À¯j¤ ƒÒø³³Ð£-K`¥œ"p^Üôvý¶@ßxEpÐl]4i=÷ýX@5:dàkwª@^í¯c „ÒáFEæ”88ï¸@2pôJ7ÌA…ìžýó›sÅ`à)§hTûÔÓ`=ÿ0cŸAÅÀ@WÝpÄ?px]E)…CPG àAp‚hD–‹Æ€ƒA0ÒH¡Lê !ù ,¤!ù ,¤!ù ,¤!ù ,ƒrÿ(c Áƒ–€! †À n¸ÑaŒL‹(p‚€Ä2$2 Çîˆ00¶ˆ8nÄà€G ?~Üè‘ó¦Á2eÆ(Ñ£A€’è`°‹'J ÝÑ@5iX¥EëáS€Œ§'dHýàÛ¿³h¡p€(àÄ…D{ `íß¾»ûê)áPà *0(à¡@Ý}þïCÂa ŽcZ `i-]»‰ý-îÐ7T: PÎ9û…N 5ÌŠ•4¸,±q D#6 µæ½}ȰŒ5kå¬ÚÞ§Ú ¿¶] ðÃðpÜàøQ­3kzN#NÝX: npYØ¡k«‡3ç;ÇP PP7³ÝâmAˆcŽ#œVÏ€yÂAû• ÖMJqÄGACB%X‚%tàA æ6‚½—› "TAå–[@!ù ,¤!ù ,ˆqÿ! †Àƒ*4¨°¡@( e(ñ`;0@çJ! I¨#´d1'àÀ †!¤`ð‡lÒy(@‰B™{PГPÓ:nàÎuL£KÜÀÐáÆŽ%ˆùñL¨0`œ¸!£D‡dx -Û7n $X¢Ä %NÀñã™´¿ÑªérPƒ¡W%$¾JöȿǿØ)à ›;^¼`Ñ#‡ŽJêùÛGúŸµ= Þ‘@@)8`„’}þrïû‡m€Í´ÔtaÃ-]Äš)9‚[·iߟ”Ìœ¢ÔÔM¢&CóÑÿ®A´OøìÙiËhêv;7xñ©bûV¬À4bBƒò}·x›i#P =8 1êm…hÎÁgPÔDÍ)T£L¡œÃŸ{þ‚·sÊh¢GV„‡á _ %Ô@ 1D@Á4ÀÜ?îñ6^A=ì°7à •GÔ³’õüS‹ M4PbTÂxÄ•?`éAeuI#fyÐ"84ДI%¥4d晹‰L!ù ,’qÿHP` *,hEÀÁ… ô°¡!+4ÀÐH¢à37ÐA!Ç7JȱC€‡00è `5Ñ”ôø!°‹(²º@S€ì4hM€"vÛ¤Ó%àDÁ,œÐr œÀUÄ(Á!† ³~ôxACmBIPÉâ…‡;"0 @€nt(#¤@2DÈ€y#B¨jѤIžf…pÂKCÆ @<ûGº´ž 8 ì!ƒ‹0$`öoŸí}þôD¸L°€€Ð(á@³Úþ’ÿ;m˜ ”šzmØ0émÜÊuëP8mÀ)tDH¥;V yöÍ‚£±¡[)纔Çîoùn…ߎÌv6©Ü€ãôÙ—ž@Ü"ÖL³ŒqæÕ§o¡£Ã 'p3˜œƒdFP)Ÿ‘ È-9$ á†*ä€J1PÀÀ·!‡ a7ô°CËüSÏ>õü˜bApÉ Ò‘=qÄKAƒjDi¤‘%€àA€ðDIÐJÍu¥BB4¦@!ù ,“qÿHP€  *\H0F † )@)ø ‡72ˆCàÒà£Ä ™)üD •‚ÓNA€(M%ÂØ@ìA;,á7zˆøcƒŽcÈABÆ 2tÀ5@€c(,A#Å‹ilh6MZ4iÔ†9è¨p'r­A¡Þ¿¿Ý è±F:`”ÄAaž¿}ÿ¥+5bƒ*Tœ€q£½ûÿSW ‡Ø‚z†¸¡øÄ Ÿý‰&]¹`´h t䀡ÃçÐûF—>=°D¹I¹Kæ{6å…àDpÖ›£Æ„ßÎM+<–ûÄ ¬8<ÿn“œöÂ5NOĸ±ãlÐÙ‰ÜÐ^oIïÉ ¯Ý0…wDÉ žlþü³ÎpcÉQ&E Ï>õDè:¥-$V ë•` ?(ñÃòÇjXÂC%tà)È _A$Ct $ãMÝ8ã@!ù ,¤!ù ,œrÿc Á Ê080 %<Èxað 2bœpÑ Å;,ÐL@ƒjxÈ!£Ã8¼#ˆ8Xì˜)`Ï-jæ€Ã 4Ü€á! dìèñc‡D22,Œ%nÜÐAa@ÒbØQTà‹…!Æ(¡#‚jѤI‹FM¸e@ìZÆŽ¿þ)^¬+A1 εZ¸]ÿöiÞ÷ƒ –˜‹ƒÂ‚7NÀ¼ÏŸ?Ξ‡†XTO0äôê•Ù5ìÏop½‘[•ʤ±êýº³cƒre4 ö«À7MË[7÷¼Sàѹ–Q cŽkßÎ äÊ„lÏ¢à­ýww_çf¤ ž¦ô¡ÇÊs-Ñ È¡ ¸pП%€™k®¥÷Ò`%à0•…þÔSÏ>õøs „ q(× JqÄ.Þ7“–B xÐ)ð„Ñ…Fù˜"A1!ù ,¦rÿ  P†€*TØà†€2J0¸p¡!–À± âBc”ˆqãG2ÒaâÉŒ2RйȉG~ì@(P¤È•, €hŠ0F*A#1jÒ¢R[†áR@ ÈûÇ•k½;êÀQb‡Ž=¬û·¯í?yvnX°±B%´cëÏß¿y`”ö#‚"gÎä Ø»¯ï߸1ŽaK ±cä(°ãëwÞƒ°X˜&-Áƒp¬ÒñÝ÷÷„VTKW [¹Pkwþ,à™΢)8ñƒÁæÆ¬=¿PD˜mÓšQ³’Û±ç°;<ÜÀ¥W°PŽûLKîZdD°»·ïî°#ÞØÑãÇuþêí«çÏ]y˜EôÃ9åÄA%€àA€@ÃB%‘KLÈSB.´aO!ù ,§rÿD@° Áh*|€Cá@ƒÌ20A¡€Ô8™‹d„”Q ƒ“N¢C¤€<È(QB›jæv øMÀKÀPBäL6ôØ£;8,-xC…È4K`½qâ… „aGA³A± Í‘jÒâJ«ÊY1 -ãDšþ ¼l@¼9à8ù"†1Tü 0Éß¾Ëûþ+ðÃàC2b¤hð A€ÀûüYþW¬@‚:è!X†Ã‰¿J5[vê_êÕ­;LGÜ“:ØqÓõ‹•jÕ™7¿Nè[0Dб*p@‘o蚘/` µo·)§¨…ÀÏ£».øL@*rlPNÑ„“|·Ú1â¤7éqéL²ƧÙ|ì@A?”ÐC)P”¡€ò —PEyÈÁ€ýóœ?N—Ð Gá à îSõüC g …TâL8qÄC±M=þX"Mtà)W’zÅÐPA.õ’–R!ù ,°rÿHp` 1 *$a`ƒ2RÐPâÆƒ‚$È`£9°ð B9':¨hà„9<œ8qPa¹Á¾ v¡D‰-NèhHpƒ€<”¨pÄ~üè!•Ã@AtˆQÇ 4p,0 l€D –à*ÃCŽ5ü¢&­î´g=ÊXëóDŒÐý<Øß Þòcï :€øöoŸeõv”øB„<Èà  Á„”÷ùó÷¯Þ8>ƒA޳gº¤^ÝZ3AðèøF¬×1»W×Ë›Xà€ ¬¤ãU#ÂäÊ«1ëØLDJU†C÷ 5våÌ jÀáAÇ…ZÜýàv^;w‚;0”¡ælš5Éa–Þ@_yÐC(ÁèbÅuª)·]A{íå@ à`^v­õBsExC;ü06˜ÕSÏ>ô<¨W úÔƒ@ñÃ@L´PíÅÕf%tàA,r¨Tq…CsDÞ˜¤@P5Ça@!ù ,¶rÿ(ÇÀ*\(GŒ2"∠€ØÂrÏéXxC@‰)`Ð#@Iž @rà‰…2ÒH±£€eztàŒ%:$ –(A¢ã$tPÜ€Ñ@`=Ö‚ €á¡„‡0(   Œ:èìQ#aG«cœ@Ñ‘%&0w.…4dЀ¨ãƉ2¼xQÃÁ©jѤ)–¦„ÃN/ÔÞ(Á`C×1jЀڿϠËP,pG-`!&º«=~ xöoŸmÛ¢ t â†Ëä\ˆãw¢ÕöÇÜ_™ ¤ÞÊqAδcV6ìÀP¦Ù³P”ïÿkîb†Á…ÕºPn@1÷lØ:(´Ç7 :l@7šLÐ+æD0€4Å4³\s¹a03"¨ ß„ÂÁ¿XspÎ8¨süE';elà@Ùè1§¤³AÖ#"y¹ DM5?tÀÊ2íHÓ‹7Xs4éÐy%0œ2Œ.à ‰ºSFâáhA °pC0@$Ä€MÉýCž?M´Ã 7À¶Ã;LvX?àÌ?õìh=aPð˜@2@¤h¢&ætÄ?@zDd fi 1JPU xÐ ¼“‰ Ócy!ÄPt ¤êA!ù ,¤!ù ,Ærÿ€!° Áƒ’hnGB <8@ $îÐÁ€¢€sJ <ㆊr¨)™8R€Œ$:¨8±á‘2~tØÑCŒJÀTãÄ (UºÀ¡B…žˆZ™´«Ò¨{àðŽ’0n„cß¿³g× èñS,‰9tô€Q‚ž¿}xÿ™ðC`…&0HÀáE½þîê-ÐC & NõæLK‡Ã‰Í¢+ÐW€:E ž±Ó­ÌŠ÷²-Z€gÏè)÷µÙs|«öºÙEã ÐCœzíOjÍz˧Äö?ÜÑy) -ö¤t‰›UýSË“ôDTPRª‡ó½9ȸ  R ö÷q—1Jì¸#FôìSÏ€þ|“[A/%ˆÓG0è B8EøR xP!)ð“A8!Ø!‚ Épˆm(@@!ù ,Ìsÿ¨càl*LØAà¶£±¶l¡Ås”6љńÜ8#²šfê À!E„:rôÈSŽ%t” !£„â†E%b”è1AµhÒ¢R+S!ÆÂ'JÈø‘ Ø¿¯`O-è‘0‡€7vôàìß¾·ûþ…r°Ãª@ )”6(ð €0·þËm°C€]% (‹F,BÛ}ãÎ-(À“4(L‹vjÙ_€ýI&¬ðÈÁgH.zôÍäl¨Í¶#.,`ÀÀ4PwJWëÁ¯ª°ã™´g㨀†,z·Â2ýú%gõñP ’ Lp C… J$`Xp)Òˆâ¸ÑcWÖõêí«çOSø…ZXGüPà@Ôð‘ *Ut!)¤”R É@ƒ… É Ða!ù ,¤!ù ,rÓ$ÿH° Áƒ*\Ȱ¡Ã‡#JœxpÅ‹3jÜȱ£F KyI²¤É“aäÁâ³SÁ”¡œI³¦MŒæ87PØÍŸ@ƒþüöL@Zš Ð%´©Ó§_…ÁF‡:Ȁʵ«Wƒ2nܸzF 1dÄøÊ¶mÐ J”1· téºÝËפŒ2jÐLXíܾˆgÔ!@ljÇro ­»U±åË $`@‚D‰)^Žq¸2æÓ¨0ì 4RÐxA£nêÛ¨Y+ƒ!lj-N” m·ñ¾Îˆ,À·ضKo RZ9kV˜ãñéàÙÿX®WƒÄÓFϪ3pz&Ô¨KüpûûB{ p³aÇpÊë @‚X` ø%HR8ü×\^H@a!= ¨à†5ø €+ÿԳωÿÜÂÀ¶xчD·ü³?8þ£K=°–‹@6´Œ 4c7ú³OŠ+é¤Ùg$6â¸äŽ=þøä– 'À‘U*©c,rifD`&y%>žé&CiZ9f™oÖ‰PœbbÙ¦|ÊH¥šsö)è”HÊ©§–ƒ¾9#‰'¢¨"c‰ò9£.ÿTji/d©È!Í3 :#¨´)Ÿ 0@ªÀ¢§¾ùC?ÌúƒZ±ž k®\!ù ,|$4ÿ @° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠ©ªT$Q B²¥Ë—0c†$ ³¦Í nêÜɦ€3+ñ„He¨Ñ£H“òô¡ôc4šJ%™ƒA;–¦C„Öõ`øJd’²*”(«q-Û·Oh!@„ 0àêÝË—`Œ‰ÿ<@" *n¨‘vªà†îqÑ-åoXLøGß…#? ÀÀ 5:ܸQ¢D ·Eî@W¶€ÐmäÐÚ n„¯+¬å ;pnÐ=ÔN(:0†28€ÀqÐøAÞÇ967H™~oÿ·.Þ·xÍÊW?¸¶„pð8QÂ$JÈÐ/€rnÍiFu6pƒl8¬à_`¦™k5øØÙhÛ„ÐùáoÉ…=(ÑßAè`ˆª÷ƒ®Øâmžƒ;” „gžzPä¸çÔc‹1¬H€Çá âm¶ÅÀd’ý1yCŠ;à蛕*þåÁGÃÕÈAôðm˜ãHF9¸Aq#J°Æ7Ð1ŒÄ  xF3àk¸pçE‚ jXƒØÁ4ÌAuhBÓÀÆ4ÔáŠ(¢?x5†QµLÂ@8xò²ƒ cÏàÆ2®x-4@ç€ÂœaŽr8#UÕ¸/áX jP@̈Fzà€P”ºà†ð‹1*¡Žæ Æà¬pŽhTÃcxÆ6dyƒqq#e0_ œQŽoDƒÆ7’x ô §ø†˜äÿMü¢¿@ 2CYzH€Ð€eHcÑŒÀÔqŠ@á7+¬QD…!“1¢ÁpL¢ÃF3 ƒ¼ ˆP@ÇÄé kàVhf >`jEH+‰¡(hAŠH€5´%H<170øF)Ȩ Kê š€5¢Q€_ #Ê`Æ-¸1‰mrøÁ7Üp(-˜cy؆&¦qŒ`8#9kÃ4¨€^˜cš‡"@ j0€ÚH€ÎÊi²  FŸÌ˜8€é8ÁБT”ÀÑ@0Èq`ƒ ¸F40 ŽêÁkúF(ЯjÿÀ‚9ä°lô"Ï Æzð =D ì F>¦ˆu(¡VXDË! <àêPÒq‹ì5Ñt@vh-Œ…€=€À)ä1 9ˆÆ7ž¡‡ h‹9¸:Ð wjb–Õ60„f¶£Ød ®g°¢wÕìn#ƒ ”!XDQŽÛåVë †0¶QDà%îBD• YEàÚê6H`ŽI´ŒRÃvM˜#¨Æ-€ŽR4`¢V¨k)¢!‡mD`(%Æ:ná4C™HËFœq‹^AvŒ£ðí㯅g|cÍF)¦!‡oD µV {7ÅÄ;p 1Ï@nÏPœÕé`V§`ø6šPØ B÷ " è Zпa€óµ³Q«áJí ¬ šóôp ¶—yPP eðÜ0v¬ð ÀaB“P09JàGÀ ìÀ àÀ Z €P@^€{¬³aÀ °—?°Dpa“0 ´ –¤TÄ¥ð “A§Ôk1l0€9àÉFÑP )t `IËGcà Ãà40Ð ã (ÿpz@ Û` ·@Ò€ÉP ¬@:;ÍÐ Ðð/Ü V =T šP,:ÀNΈn½@ Ï@®`O  ε+áß  9„¦D %°Ïp  òU 5 º  ÌÒ 'p ÜAÚ•Š@8ð5ÑPÄp §° ~¦ZÎð °€ Î ƒå º0š :pcÅ Ôp @ Îwhã½p˜…ßÀN»ØJrÀs  Ý€ $ÇtU Ò@/NÛp5àÔ° ËD5Ç€9¡ðhÔà’:°e0 Û€ ¥ÿp9À nÄ Î 8½Üð 2W“0 8ð‰±²|ña·yèQà‚G7ðÇ $à#(°.å0=ð5$°r"FRrÀ uobùE'•Bps# @,Po0ù ¹sP öc.m-ð•”ÂðÐT @FƒIrð âA=™¹Жvò••B%Ä,ðyŒsn):–ö'¿À6O…¸•6Òƒ Y" †IC¶‚}§â–7ÐŒrÀJÁð8˜!ªô€(Ô:€„² œÿ?1àÀ¢0vb+ƒ#@2Ж ÓØ  €txxzpi ' °Y ß0 @Cq4)@2€00¡ó ‡Ñ  -F‚V "4”'*Rjx ; „Ñà1q’ÀÁ¡ŒrÔá$pù¢tAR" ¢å¡‡â#Ð! ”q“!-Ú ‡ÁœÀðT-2à¿`E=€%ð%ú8>º$,;Ú5  ŒÆ-Z¤(è¡ÕÑ ‚«áK"%-j Nryº *•ˆzÉ7 = šÑ70_: ;ðtïæ§7@ ÿ ;ŽÚ Ú#¤ Zƒò4Ù¡ Ñ£¡ÁP0ºa.1#ãšâ ‚¨áAÛŽDB=î¶;éǤ¾a(ð¥I‚’É…Z²úy‚q€Ì±ÂšÆ*ê#«Zª!]*§Q5Ÿü±$Ð À(WÒ¢ïÛ:4ÇÐ¥ PìúËz.Z "C"P£©!!¯aäáÐÁ¤0Z¬ÍêújªQ¤ !) z !–§#Õ «c Â¥à Î@)°z  Ñð 8 ’¹r Ñ0 ½p?ûj¯Ú‘©}ùj¯øÊ1»ŸýQŠÿà  æðÀè¡À ÜÐZ P2Á`Ñp~5Ä ê  "—,ûR;µ0‘„ Àšà”¹ `è` á¦kêðgcoº` ÐNE©àJµr;·#Q&½P²?07µHz¶sr 0b~ä*€]{T °:³tÛ¸Ž»©6jòõ s’«4"—é ¶1ÀcX´µš!qU zpÇ]Þɸ›ºª[  @ã`u˜áhStè ;v\èÀ ‡9˜Øz(:€š=Æ{¼Áíwæp[1ð¡ð1ÐJX€Gö ¼–ÂX  4ÿô^[UÁ:Áмèk¼­Ô å å° DÀ,a0ÌØð Ü 7”Ô Áõ Pà®4Õ@»IËp1*[;°éûÀ Á Õ§ ¥Ð78`§`;¦z_× š€šÐe½À hËep Ô!ap º0 ÄkG¶4 Á6¬:º’™»I® 2ïæ Àp>à6°FÂ*ý # BÚɉ‘µ¬¥Š¡ Ê~qËó*:ð@·Ó‹Oì“\É£¸À™œº$0Øáaƒœ°³Àð £P!Ëu*0hð Ÿ`¥) "ðê, €¬ƒl¯¹òÎ[!Ï ,›Â ¡‚ñê÷Ȝ̽pfÍ Á§ì:PKâBàœ!9àЪ Í› í/ÐBðФS€ SMÊ*9*PEà*Ò>Èÿ«­¹2ÊBÐ+ à5'!pªü ($ c+:`Ì’LИȽ£`Ÿ f0v ¦ gÀB0 ´Õq Ÿ` ¤° g=«:° h ¨°I£>0   ©0ð›@ ²à©0 ¤  [06@'Ф ¦ÐŒ ¨0 > ÎG@ ³µ/ðAÔ6 cºÀ ¥ðÏÓ˧ ÐÈLÉÉSº4¡£ € ™ 0S  € 0µ°vP l › Qð ¨ QðÖ=P f€›¨ÿp­À>° › ¤ À´q S ª0 B@Ý:ð#À,%Ð*` òÝ×9¹0D¡Ýêp €Apc`<ÐÐ Û ¥,`M=ÛOmÛQÛ«[Õ£°‘0Œ° ÀW ¤à–`  ´À £ Ž€ 1ª9P YÀ‡™ Œ ×¸p`­€£ P±0*  l° E …° Ÿ€ ¹À°´°- ´ [`/@=`™Pctið9@ æ`à ¦±=ÛÍá¸íá»Û£ÀÝ$ÿž >P ˜P˜ -` ­ 0nÑ£0–@ 6pÝSÐ>Ž™0# sà´0 °ð£PãK° l¸P 0²à@ © 0~Öq° L :ŽàÞ ý©•)àÈãH°§p ÛÀ 9D~ÌP­ª„î¸UM g và›à¹àÞ­ -°µ˜° g ¤žK ›r½¨àYP ‡B0 ¤À³€ µà ° }‡  Ð¥v:-›@å© °Œpí"pJÀ F¶0ÀÍ/€¡àu·ÿ§àЮ̃þít›•ŒÀq@ PÎŽà˜à½}Î¹Ž çîxÍô[`ïŸà+°Å Œð þ2€â ‡Ý æþ L0'#à”@ –ðÒ>À­*V&on'2/†2 òd¿ð•ÃêÔµ­ÌÞÎósk) Ïwa7€ñwñ’ïvòŒw1òŒ:÷WE [ €¬8 ðÊ"P«0¦¯·‹ñ/ / ù§ÚÄÑÀ_£·pIÅ{OÉ”¬ ¨ø‹a7Ð6'°'_L)€Cs*`Øê;°, ©%Pyý™0hD£E/*]Êt¡€€!ù ,¤!ù ,¤!ù ,¤!ù ,¤!ù ,¤!ù ,v›¾ˆ1° ÁƒˆCFÆ ,AaCE HÀˆ(ðD/]@†$râ Á XýÛ·Ïß¾½숸£Á©•þ\ÂLÐc Á næÔÙ+ÁÌ„:lâ$ÊÓ§ Bs¾,zT`Ò›-™öŒñ3è¿¡SF¼º4ìÖ®Q™V}ª4«Ù‚z´eùRƒµ@UþÛ»7XpqP(ÓŒÙ2ÃÎäPÁñF…"°¸DÄpôø±y³ Ë rMz´è€!ù ,¤!ù ,¤!ù ,¤!ù ,¤!ù ,¤!ù ,v›[1° ÁƒTXBFà |è°bD†)6xPcF‡=zä8PdÆGÊè˜òdB“I¶ÔˆæA–0kÎDXr'Ä—>yý™0hD£E/*]Êt¡€€!ù , c‹ÿH° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠ\H`¤É“(Sª\ɲ¥Ë—0cÊäH äÌ›8sêÜɳ§ÏŸ@Ö´´¨Ñ£H“*]Êt$Q‚ ”JU@Õ«V³bݪµ+ׯ^Â+¶,Ù³fÓ¢]«¶-Û·nãÂ+·.Ý»vóâÝ›v'ß¿m>U “È+NÌx±ãÆKŽLy²åʘ/kÎÌy³çΠ?‹Mz´éÒ¨O«NÍzµëÎ[ËvûµíΞ à ?Mƒ N¼¸ñã „ã{`AÈ£KŸN½zÂçÿôqN:P>ƒôÿ€€àoxÔqÈg‘wëðãËŸò7ôíuòë߰΢Aƒl÷GxáQ‡(@zØ)'Ð ‚ü&á€Nha…^¨a†F˜u0'"".ÄÒ§âŠ,¶ˆÐ‰À±‰%Ö(sáè_Ûõ±†A4ä@?²( w﹨ä’LJ—ˆz†I”›@uG D‹  pée—`~)f˜dŽif™] £–Û5éæ›p2y%D†¡(@‘tjù$|ò!@› ý¡Ü”e硈&ªÓsF”žŠUÔcH) €ˆnPÉ'ŸÒ›ëe§è¨¤–ZŸÐyB(C¢äÝo€Fÿ¤ª@Û5J©A}¬g+Cp9'd ©Äk,–ŒN”Û£YþAF¤­—$G€¤¸«@‰@øis¡6t B}\{ì¸ä^ª«´j«¨ +ES®¡k¬M‹ÐµÏA‚Ð=ñ‘w¾dAÄ,—Ö«ðÂ¥.’,Bþ$´l‘ÎB+Q·AÜ“‰ë®r¡Þã/Aüº1­¸¡F©P<àzÌðË0·x®³ ð­@ߌ³«Ü´/äI”ó"dï@OšP’"'ä©CStð€ôÆlõÕò9¼«4=#À+M,PÅ*_¬Æ• ôªBWB#?íãʵ%ŽBáb­÷ÞðÍÿ\3Á=»ïU}Ð4êí®áí6î3ã6Ô4DQ³ÐÔ ó­ùæÂiðCb @öArTpg‹žö@.«IÜÁÞqB)'” ‘ùÚÇêœ÷î;PWþMÐ<Ê3­ðrrdÑAK*P¦؃?²7]¯é|P0ÅÛx¿‡/~OJç~<¥K1ÍeˆzHžB‚ñ@ÕßK»D7)/ïã÷ï¿JÁ›¡Q>¡/rí9 â«¡-oqÙ$Ò6²m¥{\àâ=wýïƒ DIâ'„¬oh™_Gâ§/’äxšyîGýU)„8Ì¡G¨IH€ŽÛNÿâ@õ@Ð#„Ä Tø¶±e©uí D:EZñŠy¢E(¶†tE„‰ñ"`$7pŒ <’ NFC/>ä†XŒ£­G37"dV…³˜Crã‰5ø)sHô” Ÿ‡Æ£íF4£¾WÅ9:ÒŠC¼œô7¶Ù‘ƒ‰”VOðUHEÄaü{¤(uˆ£ŠÀ¡K>ºH­ZbH‡@ÎDqÏ(gyEAµ)T?Êåv¹œ‚´I9ÏšŽ^Éè¬Í OÚN0)B5Z:ó™ QŽŸŠô„‰„Ò$×DÈÓ®e¨,ySßl$4ǹ7Aä"¹ª×!’M—¼Gœë#9çIO7õa„Y§>¿YÿÏ~ú³8ëÄ2Ðô q*BºœÀ¡}¨D# Q–R   pÀÐŽÊ'%©HCJÒ‘‚„€ú!• 0ÀÀ£0éQ@p„í¸¢ u`©@ P™úô81@P‡*Ô¢•¨ý+Á¢ ŒTú©T§º“(a™aéx¨ÊÕ®ªÄKõªXÇê«.d«dM«Z×ÊÖ¶òd)¡xÜJ׺b„ vÍ«ZeP¸d<6Ы`KØÂŽ•¯ñkAÐjØÆ:ö±%'b¢X‚06²˜Í¬f7;¾É ¤²OP9KZV ´¨¥g:ôðF H­lý)•ÙÿÚöŠ«U¬kç*ÑÞö·³4€oKÜÎöµµ¡Èp‹Ë\+ ·§Í®ær‹Ü×öVºØ ás_šÝîÂŒºèI®wÇÛ?œ€¼è-x$Þôº—o½ñÁ{ç[ªõîö²ôÍo¹ð«ßþ.ɾíõ¯€‹€ÚøÀ,°us€à'Ê/p°„á£`ÞvÂ^’K3ÌáãTx<çí°ˆUä›x)tOÌâã¸Å0.JŠã‡¿6Î1Lf¬ãûøÇÅJ1‡Lä"3IÈ;…‘—<àÀ%frƒ‘¼ŽJùÊXβB¨¬å.{ùË3á2˜ÇLæ2ƒDÌhGN«5„ÿ¯V~ Vì˜y¬ØD¶Ar D¡€QYrƒ„ðùÎ M±0 f°CÊøÎq‹8  DHU0@ßAdðƒC d8BÊÐsœBÃÀ¥À5èa;ˆ_w€êGÛ¹2P*¤ÐÄr#Ö ƒ@à ‚ @ $TpƒX»Ÿæ†@Ìp ù´*-€iÛ 0ˆ5œ‘``H 'ÐÀÞ2X.¢¯f;#» ƒb[xvÀ1 ‰I``P¶H ‚0Cé>÷²SX 'ò ìá*t´:ÿPu¼ãl%Ütç-6]Ї ¤%¸ n |\ J J”5 @)²p‚,\ ˆ²bÀÇš€o^hƒ¤@ Z R0vìûXŠVè0¨¹ ¯Áf-€x %pÀ@î)4Ï R ,к *Ðèù77{QU¬æXž 醰IðiAcü"@ÌîfË3ž»õ "¼Ã§à/øz½a?<€å è©çp6«ù µ3Á’î $¶€ ðmv}Ÿ=f1(´ßƒªçtý€1 rЃ± @~·rÿ X.ô`ò¶–?pà(€? B<œoºD_ƒ}t?7Ðu¼§' ÊGd÷}€F÷fv˜ä=PÐe~èGHõfʵ«å“õë§@5h[‚¾Õ‚¡‚i•v%°i!'0à<7Yó÷R|5°''ðRA%€ÃÅD‚õV*@ •n À{ÁÇÑ7Zü'll U=(t)HXT«eƒYH5a=hod÷u!·Zˆ X)àYo‚l8ZQ&0„‘ 1YGUDU‡,Qbû'‡Á‚¡où‚8|~8[ÿÐSKe’w5 …vaöÖ[%@ƒ=ñ'%v¼Gv;ð8YŽGzfv4ðA'‚§;P/`v7‹B•€0°s€z aAçnÆç‡¤¨ V@Š@Ї {shTšWǸ~ø¶\Auo1z@ :ð¹Hr¨‡‚*RçGŠø¦?ø7p^娀‰lË7v1Ž#Á"°G€ºFR(è|£Œ~÷R/Uh·XÀøR HgÏø†êÇW’Wt‡÷Pprú¦gt¥h‚Ægê0YW9g’'¿P¥@‚† ç°@:ƒÇ‹ÿá[^#~Q\“ çy±:ÀvÃÐ  Q|挅6!(yã@Õ l70Z1Pp ~–f làPÇ xÁ(q¦~V›¶ZKÈ °bïveW±unðÆ÷‹P—÷YG[dž‘m‚f²{4 =%„%À€à5n†Œ(zayt‡wÁ‘An:Ç]i‡ X[׃Ô(†aÉ BRˆõ œf:å× uñ ìPA¹{ÕSÙà ƒyX  6°i=Õlqç§u À‘PñˆXÄÀv4àl‚vF¢Fl1ÿpƒQ o©G0pʰ ?'])5`mxÔ‡)D KxobÇÊv šÀ¬¹vwˆUŠðiçw’“*Fx9io4oà€mqX°i'ày  *À‘g:UwöIV`gõAt5 @`‘JpÛV áwVQ'ú¢„T€ˆ)çðqA‡w¼XH˜]ɇvûþhÐ…BÇV€˜À£@ I‘ǨjtG§hÂxXÇ^¯õˆ°80u猀˜0± ÏÀ‹PU ÉKež€“ xè)/ÿàwb‰1Ø•(*ðÕ0 ¶ÇŠPi°Â` àœV jÚöžß€˜ Ü µÆ—æ÷ùv^^ó}÷)§u@ ×õ–=Ÿ0†ÍWè00€Xp¥@XT8n²vZ2’Àº€˜  × £ 7k2ª "ðˆÉvQ €VkËY€0Ú€ pe€^³ PË02Š?ðiÑÀƒ7jÖÐT߀yâ–<š§i6›` JÀf y—&nnv”虓0ª©à¿à­¡mÏèyÒ°; aÇ åÀ  ö*×`‚ Ûÿ m ;ÀÌ à£X@V(T1І‡y!ŸQ À™„õ ` »ŠÛÐlÍ€šÊ¦ ?Àp:0˜"pºàn¡¨ß·¨ÑÉg0 £/Å €ÒÀ>ú‹@ ¥Hç ° n¹„¡i±HáPKŒçP φš€¹}°p]©kf‰o=pZË ffo!©í8Ö â*ƒeyà5 Œàv è9ˆ¡ å°40k5p­ Š ¯¬Åt¡ Г: f zZá)“00‚&zÐnp›è Z°Í ›ðI¢ö)pOI àW½@²IÿJj+¿ ;Pì ‚;Ë  å0~§…˜ð½p è*(€¦½ŠZÍ–´$ ggKl³vié°+*Ù à–'€Z°}°Tz@~whp‹öÈ{î ‘9pÜp ‚‹X1pZÒà Ò[‰HVBFtºÚ5ÀÛp ¿[…¦mn ;àÓ?p^YKñ–¨–(Ù)×`jÑÀß×uηiÒP0å «(ùŒ:¢Š±~曲ƚРG9§p !Œ;×uÌð³7 œÀG7˜s% `žpŒCg °ŸY»¦•+y³ÿ k‡Ú^ólñÉ‘|¶ aw ¿  €>qáP  “ Dp ¢(ºû¿axãðÉ€Ì Ià çfû‡X% £ ;† š'ÂÐta€šj›ÖlÑ)k=pü‹)‘¿,0YÓÐ 'P: nÖ)¬À?UG j pÄÊfžÆ¹ P0Ô–=Õtï×SËG»Á{Aµb'‰«~†…ã÷lÊ0Çg[Ð q†w j¦  ¸òL…Õ`žá)ö9Ä×Õu†*Vv›»J:`gª¦‹äp büw e@0Ðð»ªV;ÿ`mçU’ '9@E÷¿s†w@2P£Àpq°† Ï@šPk:Ѓx1¨ÓÌ&Š`–*‡¦Ö»¯¶Å « 1ÈgÕ Q” j ÏÎìi·zqn¡j¡ÇW¯–)ï)§#7 ¬Ð<ºŸÊu›·çÕiàÕlÁp“ ð z;€‚KlW Šjk×¥ à£P?àg  æiàg v}8àx 0 Ø/ÉWÐu0 ÌVŠHàÊå'"{;Š  +ûéf¤È21 J€7°¦ Ð ·ÿs­puiˆC˜·IÄE(îÀ£zÆ ]¹uag½«JЖ mg 0r¼¨×P °ž*€X·iŸŠ rt2°\3"nj-t7ZÛ]nÆ­¡ .ƒDÇvËÀv9 ¸¿‹GPŒ+Úßp¢} 7=° v™­Úf Šà–ˆ,ϦNº@¾)jüu2ÀÍæ|Ìín‡ê­"ÀfÑYb餈¼P0 P0àw!iŸÑ ™há}! ÓP@º åÀˆ·ªb½|y—Vh"¼Æîm‚…ö¿Y-!Ya€p¶ï7ÑÿMye  2ÚnG°{¬ —Æ5‡&€å°¯„-Ιn.$tq @±¶ µæ c§M:õŠ0 ä°9@a3+Ë@ mÌZ¥°ÚñlÎ@m ^w Ø²9.èp›¡ jèp ¼ÈÎx°ÃpÍo韼‡e ·¿­2 #ÇW ÅkA[o1q¿k P"¡ 0 VÀ ¡À MG Üph¼P°uLkDPÞçœÖPiZ@ ™½a»QÈÑp š>› Ô΀®‡&¯§õl·9paÅ ËÊÆ‹áõ‡ÕK [ŸÙʽ ÁP)**ÿp·°ïjqJ ã ¯€ë] »¾Û€ ¡ hP ¶ÿû Úv:@„ yoŽÊçÅ °pI¥P;Ui'*àå+s\z+ p„ц $$pÃXmÖ¹kÚu=0ÙˆÍèƒ_v·ð'p^%~óÔ0Е)tEþ–tYA…=ywE­s%0ÛÚ¨p7°Ó|×eÐW¸×çénX¬AÅàWðö–ð˜ÀlXñ=[À÷´]÷R ð”O{wag•xK‘ŠHROpf‡@Ú¸iáLÞÿ°{…†ƒQ¡@@:@oÚí‹[åÞO+’9Pj͈ñˆp8xZõnóš'PÕ#Æ æ aP@¸ÑD 9\4X£‚SÔãF … slPQ"Ɔpt°‚€‚3a”Ä™SçNž=}þTèP¢E݉ Æ‹6<²ˆ"ÆŠ'PÀx±C €XS 8qÃÊJ”¸!âã ;HÆ á’¤€¸9R¼qCaY…/j(Ë¡Ì60<À8CäÄ0hÄeÁ¢Ä /h ¦ÌQF-oÞŒ1—ÆË³)hl¼ëa$Î0`œ%Y«^›ÿ_lÄ¡’nÇ‚9B«Ž¡pÈUʨÐÀí ‘/˜Z–¶¡â¹qˆ<›×CŒ5D˜fí¸ct&¡En jHf Ø¥€¯UÐP±!ŠÐòal¦I! ¢@pb2¨ >Ú.®“‡ÎnÀ¡>@` âšL‡¬NÈ¡º²ÞÚ° ÓεHˆT¸a$tp­°· í†h`ÇðT «„® ‹†vœëÉê …‚>»¬0ƒÜëáI¤®Ä2K-·äK˜ G!<@TrR†RÁ°&S8’§²Ê2Q>Þ8*© :4уÎrÚsN…"¬1… ¢Áÿ4ùø¢oDÄæ4´NL4®@U*.6³èÄGÝä§Ó˜À3’FêhœtÓ³8EËJ4º›<TO&[sʼnÑðþ+U/F÷,‰¤@0«°°Db–9ga¨/ÚoNÁecòÐEå›´Û[B,ÜÆ"íÕ¿qÅ wÛ›êÔ5ÀZì2^y祷Þ. (+…êRX!„N’Í/Ê@[P¦KQ„atÅ–v-×ÛG÷Úð#žÒ5hbFq*Q†¹6¥i®ÐBó¸äí¬¸œjƒVʺIeƒPÍ”äL+u5®G3-yÛ’6–“¨²ôÊøµ îjÔÊKúLʦ_¯¸¸ˆ6­ÿêJ­Æúj­±´k¶®t[¯µ·l³ÏF»ìÃ4hLƒÊD ºv¸!‡nÒÈ©HÈ»ˆ@JjAJUÁãÂlàÀ¸ºË«ÓÐÚF¼jÈ[…$Uè¯nPÁŒ¯ÖÚ¸`‡ Ê`ÀtÓía‡ÊÓBg½¡3èμJúÜzí&Új¨ý KWõÈ#u˜{S¢Ý2\9äj+A´ÿaN!KWÑD™ÓwVé€ÎiÖ ¥œ«DŽÎ_úgºòVl÷½†ßýâ;èY¹Ç?ý÷¿RƒU(ŽTà?ì¢$À€,@M(É& œÔŽ‚D@ èËÿ[1ðÀ âËD.ÁŠ(Òñ¯ÕÈtB5%//h²JB#- %©R¦íð9àJ7“C¥À„@br€< QHˆv(4@ @â –€˜å?æÛ úÔh>6®Ñmßкw²oÆ?¤+ Ñ ¦˜ÝÔ]çä9®žœg÷›_¹ÀÇ?F6Ò‘HY›˜Èd¦Æ Y€D0"“"°A0ƒ°!B˜€Á„Tb ¨„·Ø¡–qð_FY ø`f˜ƒAD#•[pÄTð ,ÁŒ@C^°UEqeÿ@¬¡äLBÁ0J¢ª2<@Ìx†˜X„"ŒP„A®C*…´$ Ä€a:€Aît†" ƒè ¨A„ÈDã¬à…Bt¨ ƒ(!1“!ýÞ·QŽ­FÁÂc¹˜¾ŽrTGƲ `—¾,eÍj,5ج¶)=Ò¦7Åi¼ àR ª°Ã ;©ŠHˆ¨ÐI-6qÂZ `ƒAü)€T @E&Ì)¨B!>À* B‹H€@"@ë N‚CÌB!€#@!„dD9yàj0 …t†;áÅ9š„ øÌ!€_ ¡% €ÿÒñE…0‰Ñ‚ˆqxS!JàÀë¸q háæFD‰°NM@ J(‡3„M8”B4H2äÉ3xá¯}‹T_û„ÅQâª/‘%E®Pâ7\åÔ¹Ï}d$Û6I<•–‘`IH‘O¶Ä €%LAA¯ G!g0(ÆL­jà ¡…TŠH”EX‚AJàZPâ„b5ˆVsà”L60î0XààÆ2ª‰/‚c‘ÀÀ9Ér(Ä¡Ó`F™Â¡n„QŠpÀàâ— (8B”˜ Ê V3Q‡.„ã T€0àë"ûŒ¼íyá3”ÿЀ /d0…n¯€«\Ÿ…´K-dqïe.w9Ê;êëÉ’˜Â9³â ^ƒ8À:qD0i^;¨¢’8QE0£*ÿÕb®L€Í` @£x @PdÀCPˆh@Ì =i@¤ÁŒÒB–Ó¸8ŽQdƒhþlF3âI—Ǥ€ñ¢° j¤ãÐ…”0=p€B , \ôphBJ¼Æ\¨AêȆ©nØ o½L¶ië¯¹ÕÆv¶!‰¶ Àm(“Sq‚‰'˜¥¦ÕjÀðtIÀjh…dÂ)|6t ²ÐTzË@‚`ÂuAÐÿ¯ Ñ«O5ˆ5p‚„ ¾ÞÀŠ%ø¤`bL(u˜X%Þ]IB±Z!*ö™®a9à ÐJpf3 C;Â@/^ZPì©‹üéÑ€¤@t¤_mjÊMÏRY uªW=K;Ms\A×X($­ Ø(L@ ¼”ÞèÊ"üƪš7¤3#ƒƒ›À4°A^5H ‚h| `ÇÎ[^²ƒÁ‘V›4ö 8z<ï°ˆ­u3pØm*ä%aÊ8•éI/5ˆ€ Ð\7¨ˆA¦a(ƒ&©†Ï³iE¤ÿC ‹Æ3¾a C¹ËO·º–®|æ7]ºÞž¤A0)&°='wfûàZºæ—σ>ÄÈ, …Î ñ6HUrª˜®`‚L@C¨ƒ(œ–:ü뤜b(áòòÔ‰jX5À"s8‚êÀ ""9à«Üˆ=È(”!",*µ(—ëÏ2‹Ãâ…ÙR'ƒh,¢:=h¬2 €¸0>l»¬æ‹ºšrÁ”ÁkÊ ä‰ @À ,r„ú¢>Jp ½Sˆ\ ´ºÚ 1&TPÄà @¼ú"'ˉH莈’’ £*' h€±(ø!ÿØÐ”I€±ð€‚ø!ð/*‹(4§0Ê@2êÂ/Á‰€óh€OI,Ä6[iŸÀœŠåƒÄI¼©çû¶29‚à!œ0/ŸhXÀ`µ ‚™7¨¹ ¼¸Pìh`™ð˜(¼7 l3§øŒÀPÚ…(ƒP¸ æq ÁEnê-³xD…¸œÊʘ˜S•p°À/Ù"8މCä à‹/iAJd.DÇu„: ٱȋe¤) ™`“p޼q ™”u &A-ÂÀB¯ a“#•°À¼PˆÁ€ÐÿHñ"•à€®€ˆBñ°2Ù8ú€d£7:ˆ’ˆ„<1 £)ˆI$ãú„I ˆ&ÄvQ¤P! dœæb—(ˆhvJ§„Jý±Dê‘#øØsÄÁIʑ藀€aBzÚ¨…–ûÙ ¯¼’ø«ÐJœXø˜¹·’ø"€°”ä "A¤“ˆ¡‘¨˜Êx œé–àð€dŒ!n¡# "s®Ž$ø™¡hì r”Gž<’¨KñŽ1˜ÑÜ‰ëØ“ŽP ÄJ¨”º¨„Í.C°èo"‚Ç4‹™è€“)ǘ ÿ”ØŠS¨±ˆ Ba‹Ø)B”‚ˆúZ#¢ò»@…¸·a(#pHœHiˆ,Ëp>ªÑ‹›ˆ …˜=è°qú¹ ¤@IV»-špKà+…ê)’ ØH•Ð ’0¶m€„/ ˜ ûœ™Ãp—ª ¨¾.PIÁ)! ¸)ñ˜ Âˆ5Ð{ Š À‚`´ðƒÔ¯­`¨ €×)ƒ ðÇùèˆÛª Üš™Ø¬2åÑy™Ê·1&J§cp=œ X½Œ€‚‘@ ð€ ¨M³ š;² poyõ‰ ˜ªR1ˆÚó>Ÿ¨60‹Äº0ˆÿÏ«ÉÄP"µp½¸9… €8(¨ÎAu"Ì+…!²$Pkª&ª(9ÐÓ¤[Ó})9"ØŽ²¨5¸H’ù,-xïz‘°‚xÒ) %øhû¬³ø+X§B­ ¼ˆ”5“ŽÆIR)r"àÓ " á€YÀ³€Ú€û!†Ø|ÍeÖèÂÒZÏ)‹ =0‡Ã:‚Åd9#5ÂÂ&؆l(i8M€¢œÎœ(…™×,jà‰w5ˆeH=@+P"tPd)Ïõñ¢jx 06—£†×qƒYÏcx0œ¨p°1ƒø¡ÿ)Á“†êCƒÐƒÈiXOG͆Œe…|]¬˜† 3ØrðF›Ä —c0",™U'}z†˜ Ÿ3ˆc˜=h†gH±Íáp¼XÓ‰–וk(qUˆ‘#¬ à ƒ ‡›%”kÏÍóL§”ÄfåÚ£øQp Ò’HÖœ(X8ÄR"…À† èɰ(£Z»--è8pX0j†wM”ËрƉ5%·™¸8¤Û‰Bµ«jØ0Q1>Š w¢€I¸½@‡P(#"Ë Â£%sÀJ Àʱ€Ú,ƒŒe,k‚Ϫ/" ƒÀEpú”%†Ø1¹ÿ5φ"Ó§Åú!WPˆP]Pè0åˆ5£å…p†jÀ°žhTèDƒ€"×c…€^¨ÝpUVuìÚó=¥ŽÃ‚á’—Û'@‡-"¶ÁÊkØ€ÜÝYƒ(ÐY…ðÆ:Á--À-wZÓŠ†a(±¼û ŠJÎ5è°BÛ¢’X'rXÐ8w*R…pmPÏmrØ>§c[ˆKÓ<ƒ(#©½âÅÆpPˆ‹ pX'”M-e:â[Ûµ-,q"cC½a°±Ú=…kè†Rϸ" ø¡d=‡2(€Å‰$õš9ú ÍNÏgp†¨µ"Û†j*ÔÿI ¡òGôuãk*‰n»D3A‹ºÉð.œà€û´&pÈ#ƒÙÒƒ Zû]ƒpŽJ½vð{þZLlÂ.¾x‹‚[(Š×@¤ÚXŠÙ®’hfT¾¸€ZNʼn€²ŒŽØŽÁ‘Ç¡É'´5›“S˜/reqKcÂ#[’àù˜`”G<¡QQyx­MéÅh"ÿ“·$KÛ\/’gÍ–Â-ÚØ¢ö·ä˜©áL†yŒ_Ù˜©;öæñõgÄ#d¹j­ç©Ûô€ ÇmPi‹¨&èÏ ðu Æ¹ÿk\Œ’ü{2œh ÍeE6ösDMiòª eÑÞœI‘Ñ–Ž(Év bi"‘DÄ(¾ø …ä#Xq _/Ž 5¤ÏÄœ°iƘ"eÒAÓ —ôI iÕÄÙ×XÁÔt?ßN§ãŽ’ô) &šñ®(´PSG™ .ˆŠH€p€Lʆ§6šú‰ú9®Šûm‰ú+ÊôY¤ôQw£šùŸºoã»ï­6vÁe¥úÄûšù f*äxœÐ<'„ò“ ®¨§GŸÐ|Ÿ0ü³éüœìL*C>óšÏ/ ‡ĩW|fµú3ñ˜¬ç‰‡åû‘"°ˆñÿŸ˜-j}ª;±þ}¤@üá7þ”Á(ž(/ÂôqR"Áò5x€8Ýo¾¸p€@ˆão:Óç~â·²ï×Ñ×ÏÙ× dá…têRFÙöb"`{]šV¨ÿ( þû׈%d”ˆ!à ƒ18xV.B8d¤A: `è@8I0bȈáA€%€Hèò%̘2gÒ¬ió&Μ:wê¤Q’'РB‡iÐ`ѤJ—2mê4'Å„ãâA@€%Tˆú’Ä š5*ÈA¨ã‚€s½ÞØ Æ rœ á)Þ¼z÷Ò$Iƒ/àÀC Âlø0âÿăµ"…yäl‰r1kÐbŽˆG®õ@AÀaB,\X1êÔª}6Ví:ðÑײgÓ†éõàÔƒU^5@BÆ ®·þ:HŽ›’“eè!ü¬í /Õ:S"ðƒ.؆0ÂŽÚâÇçôKþ¼PÂè׳§-PƉÖ.¡”êuªØk‹Fxë`KìB °‘|í)8k :h” >8!…/ —›» p$\W1Ø@ˆ Qt‰Epw)pP p7’ ´IDIX!FÉðWª$‘EÖ„@W/” ™´Ã :x@YBݰƒ a ÐB;–'@“ÿ.­‚‘D6Xf{±¡¹&yRe•HÒðEÃÁ$ÂK6è!Ÿ!à 7˜ .ÕIT˜.…›š×èxCB:é„H·¤L6܃9„©Â À °B !œB +d"„€Â ]ÙiÓ¡2qÅg—RÔX @ñ”2ø“°µ©Y,²‚¹©œHŠðlL*tP«$”Â4¤Àh pàA  ´E / ¤ÁA7$¬튫K•Êhc7ì©P‰šPƒ—ÉÂö£¿®I0Á¯!)f%ÄnLŸPD­pk ‘ž$êú ×nŒ”AuD™ø @ÿµ$ƒ $k ÁH6 ¼v¦ÎŠÛ3ÐC-›!œDŠ °ÅKèŠ*ld° )£Ð‚ÐÕQÄAQ T„µ¨ ´²«ÌÁ×­b†*C,h0…ؤL¡Ž´‚¨$€=ˆàÖA$pwk4`2›HK¾×UœÎñI$lÒ¢ŸÂP.f¸4KÒH puG[0-ÀÞÄQÄÕ+¢#Õ"@ ±<¬t %x Liº¦ÔÀDìLЭé°Ò@ <€‘Ð CZx“óųö{ýÜ=øº„¡†WЂfd"À!Hpt*a’ÊûUœ™ÿÖê°ËAŒ Ô~ÙrUpå‚*; D`ƒÖR 4 $ œBH Jpsm@$p‚KRžsä"á{ŠãNØ”©°…9©œÎ @„d.b@**–‹§Ä¨VGD—9±Å!˜_ ”&Æ¡ª¨] Ⱦ¢ëv ©@–ÀˆÛi@]9( lðƒ  %5€A ¤ p¸Ð)Ük£R¾ÇÉ ­|8ŸØV ¦HÈ2'5—ÜJ <ƒò0ã;L!€§ËÄý:' ÜýѪøpЕ¬ Ð]ç8à@ DxB6¢ƒ˜… ÈA‚!€ÿoÌ1Ž«eQXˆË] €FÄ!b‡ œ™ÛH2„0"ÄAÄ%€e$¼K‚–@PlBÛñ¸f‰¤ @5HA VÀRa™;È¢‚xày@²¤‚pJÑÈÍIfÅË›¼q <‘£A VG8)ÀC­*ç¨\’(—ÌåHÁ â4 vàŒ‚j!C€‹£@—|0 h  sÂÁ ` ÓA@O"ÈN?d.mÌÀÙÁ j@$@¡XÀ⊓*u©‘k*. `¨`1` < „d Õ d°tÊ9(U pªøÈÿ€£çz€ÎúÒèÀmlA¬Ô¥×•@œR PSœ`@§êÁWC ƒEm«±'ƒVKU›t²5A¨e…µPÞĉ„= ­rµ1…m O<(L¼ô®Ø´&?¨Íl—n Û¾xRn0+\¬ NKÃÉbðrìá6ïMÿœ•ð’þ;â]8Ä^q£283S ÄÈ1gႤ8Çljñ_ìc#É8dCF“m‹ã#§fÇq“d% 9Ê<*²•Ë”äÙ.9ˇqr½Ì£)s¹Êbv–ÏÜ£-öËjæ ˜¡ü摹ÍfžózÒŒç±9³nÞóSâLa@“§Î~¾3¡Å£çD³§Ï–ý3£•"hG5†~4¢+ýšEkz<Žž,¤;-”I‹Z<—u¦K­N«Z6Ÿ†j¨[­RËú5§†uªk-Vë5¯nj¬{]Z Ûg²-¯.‹^+Û0¿Vj°›m›3ëÄ<–³´ sk`ç:ÛNaÿ¶·÷òì„F;Ü£•Љ£‹bl›Û{Ço²Û­pËÛIeo¹ÍMìzãeÛÐî6¿‡Bï€'÷ÞÈn.Á‡Mm¢YûɃNx.ß½ÝxC\)¯¸PÆmÐ|‡{ßx°®Ý/åâ$߉ÆÊqo{üäAñ7¹îòš˜|æ58¼nóõ’Në~øÎoóË<è0©¹Ñe’r^®<Û-OºM†®ò¢CƒZ©:P–¾Ë¦KûéX®Äß;ò¯ßéd¯Î'®s›{ýìñ û€Çîö™˜ýìZÇ%×›Ýö¹+î–;ß~õÀÓäîµÌ»²÷Îw©3êX¯;Ù ?GÄ[ñsgüÖÿ_uÈ]òp¤¼°-ïvÌã]óPç<Ö=ßFÐ÷Zôg'ýáMŸtÔW]õ.d½®]OvØO^öF§=ÔmßBÜ×Z÷_çýç}tà']ø*$¾¬uä¯^ù;g¾ÑBè·ZúU§þí­osì]ûá㾪½uð_ü3'ÿÎÍ>ô—ZýIgÿóÝïrøÛ\þÝ£¿¨ÙŸÑáßöéßÉñßÌùŸö`§ `Ðàù É! Ë)àä0 ¦9àÎAàüIàÇQàÉY ä``¥i Íqàÿy Æ É‰ u­ÝÌ™àÌ¡àª`űàǹ ã`¤É ËÑàÚ Äá Æé`Ðð £ùàÉÿá aÂaÅ!Ð a¢)!É1á á%Bœö š~î \&ÜêLÚb\á\ܶ ºÜV\Náò[ÜLîÙB\‚áÖ[ òÛ L!âÙ!&\"²á"Ê[#ÖÛ#úK$ÎÙ$\%â¡náAd¢¼mb²tâ›}bÀ…"!^b»™b»¡"²¨¢š±"¿¹"$¢¹É¢¹Ñb±Øâ™áb½é"'òb¸ùb¸£°£˜£¼c*"£·)£·1#¥8£—Ac»Ic-Rc¶Yc¶a£…åáÉq£¹yc0‚£´‰£´‘#¤hc–¡c¸©ÿc3²c³¹c³Ác€™#ÉÑ£·Ùc6⣲飲ñãùãÇd¶ d9Ž")d±!äšÈ£•1¤´9d<d±I¤°Q$šXd”ad³id?Bäzd¯d™ˆ$“‘¤²™dB¢$ᩤ®±¤”)$ÆÁd±ÉdEr¤°Ùd­ád‘¸ä‘ñ¤°ùdHe¯ ¥¬%‘å!e¯)eK2¥®9e«AeH¥Q¥®YeNÒdài¥ªq%‹édÅe­‰eQbe­™e©¡å˜©%ı¥¬¹eTÂ¥¬É¥¨Ñe…xeŽáe«éeWòe«ùe§¦£Øe¦ªfZ’%ß)¦¦1æ„&Af©If]RÿæÜYf¥a&9&Áq¦¨yf`"¦ª‰f¤‘¦˜fÀ¡f§©fc‚¦Û¹&£Áæ‚h&ŒÑ¦¦Ùff²f©éf¢ñ¦‚øæŠg¥ giâæÙ'¡!gšÈ&¿1g¤9glB'ÙI' Q'{(çˆa'£igo§¨yçžçzˆ§‡‘g¢™gr¢g§©'ž±'z¸§†Á'¡Égurç×Ùçœáçyèg…ñ' ùgxÒ§¦ è›h¡Yg½!èž)h{2h¥9¨šAh¤H¨¼Q(žYh~bh¤iè™q¨©yh»èœ‰h’(£™¨˜¡¨±¨¨¾-œý¥ížß¹€>Þà‘"LШ{ØhÇá¨Ï]ÿО‹Fèn^ ©Kél胱è›5i‡>ééE©”"•ʆ•*–ª™–¦(—Ξ—~©„©­)Ë!iÃ…›ži¦éï­é—º©ÀÀ©ÓÉ©º)éŽ_ž.ŸžJ)ŸªÆ˜X™ž™é¡^_¢ 颦F£Ø£ŠY¤V)Œ&šŒzÙ¥ZšŸv ö† ²iß…\ÎMêøU*)ŽªÏ”ªÞ*V¤ªªvª˜~*¡…j–Éjbdª~mª—é꛺êûÁê+bk}k–kŸ"ëþ)+á1ëa8k|A«•I+£ò* ùª•a«¶ÑjâÙªŽªª®°ªÚQëZkà‘«`hÿ+{qk”y+¦‚랉k”É+äôË9¢+®Öi¡R™»N ¼ò¿6޹VžÀ:Ü N_Á–ÙÁ~`ÂÎÝÂò½–—½2¾’jÅ®àź]ÆzOÆÞÃÒé—~ì¬†ì Ž¬Ý¥Ý{ì?¦,»I)Ë«¾â¿2YÉêÅÆ‚WÇYÎ6ëÎÎYÏÙÏæEÐn×ÐYÑfëѾYÒÙÒöÛɶžÍ.éâM¬¹ìÂläÉì€ÑìBnmÄ~Ÿ×Ø>¡ØvÙb˜Ùî$ÚªkÔ–kÛ¢áÛ¦^ܺØÜ®eÝæêÚbZÞÒáÞÖ^ßÙßÞ% Dº .»ŠÛDÙnð%.•-.ÄIn¤ý›ãìÊ.ª®¬Q®MT­]- em¯q®ô\B<.ÁFnÜM.N nŽ©®S4ív¹.ì"„ì†.íþíVk›bn™in¹îAH††|.ÄÚ­èâéÖI½9<ÇKà.éî ±®®q.â Ät/òŠOúZ Ü@aAœ/B\‚ÔAì®/þ"W ÜÁKÀÁK€éNmþpbÀ@ûʸD@[@L €O0W°_0g°o0w°0‡°0 —° Ÿ0 §° ¯0 ·° ¿0 Çð ¯@ÀAØ0Bà°ïpf]ÿ0vB1M!ù ,! M¦ÿH° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç Cn ²¤É“(Sª\ɲ¥Ë—0cR@R¦Í›8sêÜɳ§ÏŸiÖJ´¨Ñ£H“*]Ê´©Ó§P£JJµªÕ«X³jÝʵ«×¯`ÊK¶¬Ù³hÓª]˶­Û·pãÊK·®Ý»xóêÝË·¯ß¿€ L¸°áÈ+^̸±ãÇsÂ;¹²åË"åaÞ̹³çÏ CO'º´éÈ¥N«^ͺµë×°cËžM»¶íÛ¸sëÞÍ»·ïßÀƒ N¼¸ñãÈ“+_μ¹óçУKŸN½ºõëØ³kßν»÷ïàËÿO¾¼ùóèÓ«_Ͼ½û÷ðãËŸO¿¾ýûøóëßÏ¿¿ÿÿ(à€hà&¨à‚ 6èàƒF(á„Vhá…f¨á†vèᇠ†(âˆ$–hâ‰(¦¨âŠ,¶èâ‹0Æ(ãŒ4Öhã8æ¨ãŽ<öèã@)äDiä‘H&©ä’LrDJ“!¦ð !@é! Vf©å–\véå—`†)æ˜d–iæ™h¦©æšl¶éæ›pÆ)çœtÖiçxæ©çž|öé矀*è „j衈&ªè¢Œ6êè£F*餔Vj饘fªé¦œvêé§ †*ꨤ–jꩨ¦ªêª¬¶êê«°Æÿ*무Öj«b1pC »özkn4`€AÃûëm4x…ZXѬÇÚÖÃéü³Ïµÿг ¹FûÚ 0ü0€:ÿøcn¶Üàmk¹î€A'@î>çÒƒA·ë²Š”1®µõV n¾ªá/åXƒ è¼O¶÷âKph7p`…:¥%:ö²Ö H"†î+ZSI‡œ©=pú3¨Tªû $åhŽ„0dœxùÕ¨œ±Uk £†ˆ=„u;–cµ=`ÐèÀvoU¸µêÈ‘¢Äm«öh.Û‚'h8Žjø(Î0䌶ŒÂ7`@v²ÀBžÈ+uæ¾zo Êq£aC%zàö¯¸q±(ú¤¨PÆŽ§œ-[ÆlºŽe`ŽÆ‹ _ v¬C&ðãGí ßN_û|ùøSf§/}@!ù ,¤!ù ,‡œÿ(£DÁƒŒqƒ!C… J„(† 9`C  ‚CT∖“'±ô(AQ¢È1z`öoŸ¿›ÿôDÀáQ†@C ü1 YÍ›þrF¸1F‰1`¸!T¦Q›8íìY°+e”h±ÂêТGýíSúQG §28hAW­µoZ0àxk5mR<}†ì …œtš¦ÝbÀSÑ«7×êlûÖ †0ÙŽX“óLW‚0ôÅúw«à1ä^#r³®1Ž@ùQ²Z¶ Üv¼q9Ü‘m„¢õj¡—¹hI+ Œƒ¡ V¢ýxV¦X)ž}‘)[NKDj‚B‡?¶…¢àê¾÷þ³üXn‰Æ€"àG€hÿ( VLyô’Kltš<³ 3Ë4Ó eEt H0ÅPàáTHH}Ä‘c?üЃŠù䢉/¶ØQ‹4ÒGãB!ù ,‘œÿHP@ KĈqƒ¡Ã#&D£‡ 0b!bD–(E‹I-X ”ø(¡Ë„8.ÐûçÏß¾ëü`I1ÅfÖ¼¹®@– 1ŒÂP›8 ìˆ E-?FBò”¨Q‚"ÄÑ[0¾±’GjÑçH+èÓ«o 4™ÛÐ5êÑ €àP"æÂ,k6 ï[‚ p(iC‡fÒ²éaàø«\¤Q"dž0ðªeì!ù ,¤!ù ,¤!ù ,¤!ù ,¤!ù ,¤!ù ,œp £DÁƒ$h°áA2"|8p¢Ã„cXDèA 1 „Ò!¤GºàˆqQ·9N„DWFà%XN0í%:/Ü GK‘ zä<*ðH‰¥”‚x´`Æ Q+VUHu'Wˆ!ù ,¤!ù ,˜œ®ãFÁ‚‚ÀP†c qD‹+µÜ(±GfÿöùéP h’ä?“2$zd)rä?=j¤\ÙÒ¦œ 1côàYÓßÍ“;iºÔAFÊJm2E)àÔžF™ÞˆƒèR¤@x•JÁ  hî[ëojÊÑþÉ«(ÂV7(hz¶¬™ßfP8ÜÅ!@‡tLPÆ?"÷`œP¢Ä„!ù ,¤!ù ,¤!ù ,“  wŒ!° À 88p¸#€A P ” DFÁrGN™À µe”+Å€[¨b{hö º ³-Ú3Î &€mž‡!ð2ç¡€A?ä”ëÁ¨À°Xs¦£Çƒ2€A«eÌY‘‘@×?¢6á>@¡Ü)eÀY±Àoä!ÁPÝfžoæA·8X™j·Eq†XAFÂ%^BÝG\u\uc$Ä¡üå¯Уëý‡À–qPÐÓlÙ²îÎÊô(^){ í HƒoAžïñcÇûïWJü8q`Uòíçy!ù ,¤!ù ,¦œÿÈXBFÁ7b$\( ¡@‚#rÀ€a"E‡ #”Š-V>ZñàP£Á;°û·Ïß¾ò àˆ!ðF‰%fþHÐŸÿæAØ! F„1pF¨Ðƒ'K—A!Üh¨GNŒ0ô”)á´¥¿¨DcP³¦¤G5næ˜ èÙòå¼3$PÒ ¸ rÖiYçè[¢8ì(0Ù‚Ûn¥{ê.Í ? Hs@Á·Sê}¸ƒŽ¬Ôúµ®_¯A#ÄíÇ`ܰ• ÀÖoƒoà€B‚•û‚ÃTMófN”7z÷¯yóz ›¼)£B¯f˘-k6ŒÍÜ8OÊX0 €ù d|ÏmrÇ÷?ÞcœŸqþzú1ÞŸ!ù ,¤!ù ,¤!ù ,¤!ù ,¦œÝÄp#FÁ‚2J$\( ¡@%*`ÀÀA"ˆ… K8lXâ+Z¬€üácB‡=ðú·ÏŸ¿}ÿX1ØaR¡€ z±té/¦‚ÊÀ@gË—>wĪQ€"(F]Â<õ“© 2ªE¶©LšV4 Õ+ &ÊH “'̯5¯ÂXPöm´AÂ`Ûõí̸æêêÚS&^†7ùî[ìlÚ”¿þIž¬ënX8(èi¶lgge*Ȩé0ó€NÀ ciÚÒ=~ìøA»5Ó¸Üx5·ÃÝ{û!ù ,¤!ù ,¤!ù ,œ›ûƒàÀƒ$x#FÆ1JÈXâ  2& À€CÇ JDœ¨1á‰P°hYJ ‘K ,˜ã½þüíû§îÀ˜ÞÐAáfÎëô a¢8uþKú“)Éz:@Ý'µçR S`TêºUl P˼\wªKÐcdSghPJ^T¤hÁV`ÁÁaìÁü‡óãV%*,x° uŒ ^˜a@!ù ,¤!ù ,œ›eÿ ƒàÀƒ*\Ȱ¡Ã†1D„Ȱ €20j´ø°£Ç#Nd81Æ 8bÔHC"F‚_rI³&I‰8âà€¡' ÆÌHÔàÀ‘6mÆ@ªFŠ–aœCÆJ%Z²j±båÆÁ‚D‡¾ÉÁCR› 8ä\øTFD©0Ò`€Ú¿}þòÁ«@%b”¸xp 7rÈØ!Ê~¢ÄyÃ$Õ“+c#åÈ#PG<Y"·+ö:šƒ•vñê…ÂiJ2– °ƒA˜f”ñ­Ô€‘)DÀ‰D„ K=ðt‡@ »#t ˆA¸Å¬¨9ÿ`¼3ë&98Àz€®^6ø¡£œiwóúÛg¥ï@9”p„% F Vü’Ž&ŠÆM)Vh €fYq„a¨õVLòÃy@ÑCŠ‘–Šì Ö z”¢ˆY7P „"JPàP(¢E :”1 5ʷýp@5ùéeEms€&è(Á@)èlÐK8ëP 'hc 5é„AÑ|óM4D0Í7Í”£KЬ3¤5J87 7Ñps˘³ 7]P@3çˆ×§˜ƒM9’\Â-æXs:DƒN¢¿\°|s Ö4¹_~-  XÓKÒÿ£z|CAœŽ383M½¤£ƒè¸R5Ò»Mа£ Ô$ã€or Ca¬3 Ö8Ó°R[ ·XꜲ. °L3äºC¬ps±éÇ_mÏ~ð‹5;˜ãÆhÎ7Ü@8¡kMÍH¬ôVóK¥lƒ"çüÀÀ0ÕDà5Â0`r)æì€.ßT@C½Œ»î4³Œ4éÜp 8ÔPB;8ÐŒ3ôC d£ËǚʟÁ7§46ÑHÓÀLòÖ–ÀÍ)WÀ2Ô 0À4ËPM0 o3"èÿÀ1ÔDàæ/M?@å cs&9G@ëè +ŠtŠ9'Pð÷6ÓÌ7ì0A(ãÄÐÃLÊvjmÌà‰@GÀ@A2ô”Á”Q&4p`Û¿d“€&ë”rÊ:Š,pÍ0œRÎz°s éèò\5Ã4ÐC¹è#G:Á8 ããÞƒ5ÊX¡I)'ÐðÍ3rè"G ÃPܰÀÝ Á¯Õ¨ˆ3¸!Þ(ÀêØ^U0 nP㈆&ÀÓŒžèbÙ¸E0à V@Ѩ€"ÌÁŒmã<h+"€ LÂÛPÆD  ‹qéÀ5ÒÀF5tƒÜIƒÒ(C€ÿ”¦a„+Œùê¬F¤@gaȆ2pŒ810@NpY´”3‰tT@e¡€ZFÁ] n Æ3Ѐ g Ê º£µ\ÄãútÔƒªíã‡äKdê‚HCDàat#“p&©‰Áüâëô ÷éAj.‚ ¦œÙ$ÙNÁix3],Q‰˜XR ¨\J €ÿ¦0›ø—Ä@e1aÊ%¢L8ç(™"ЬE$Ð\ˆI“š”âË`Ƽ–AkÎD0ˆ KAšI“Òx$b¶dçM˜yƒ ø @H0(ƒ¨ó%g ¨@!rƒ´?¨£Bú –:ô¡‘gBú ÑŠ:T™!ù ,ü¤€"° Á‚ý !ù ,¤!ù ,¤!ù ,ô˜ÿH° Áƒ$€¡Ã† #JœH±¢Å‹3jÜȱ£Ç Ir¤É’%ôQ)PdK0]®„Ió Ê“Wêd9³äŸ:‹ýéã²fF¢uVI4è E3.ššh©Ä?‚°FÌ*´%Q2p²j´hdШõ‘äTí²§N$IÐSI.ñr©§ ÛAtLý£–‹a2@ÿHð÷OY¨rGö4ÙñT¢Œe¥ÌY a·àÀ\Ž×ÿ‘”Í»j—êü@†ù×éƒú.çã4+—ç‹ðÜ •+áµôTóDdkPÑsáQÑG{ññŠ6Tð"(O¬¤ß^‹0H† kÆÅp0·xÏÕAŒ0pDÇQ%>qË5ˆ1$’ŠÇ0š4¢ˆ" 5¼Àq‰3ÑüCŒ9õÓÌ·Ds 3ÄQÊ<î<óŒ;òpÒG3Â< *Nà ¼4CŒž¬ÅÖ"ÍHSÊ¢8#+\ˆf—c’¬ñK=¼Ä)Œ3¥8L/ÑàÁË3½@éÌ"Ä0G0ΰóÏ3Ìüã  BZ) PB Ç/Ì㌮8Ë0C>ã ÄDéc3½ñÿ20’JsÉL‹¬ÁŽ?óì#©6¼°O=¢”³O;Fjã²Ä8óO)ô°S;ì¸R:†SG=õÈãO)Ïì3O=·<óÏ®èPqßçÔCÏ<¢ S:ÒlóÌ$Â&ÒÔ³†0ÿÈ#.=ô€ã+æÐ3͹þlÎ>ž´3O;þÀŒ?îì£Ní쎽zëÊ5çþC ÀõŒ£Ž»òÔ1ÏÍprŽ4øZÿãŽ4Ï,¢Î:\óO0ë´#L=ÌÔsŒ<ÖTÊ8ôSO0õ4êÏgÿ¸rNÐþÃË?·¸ÓŽ(ÿ3Í>Tà p4BóÊ?Á²ð6ðì³=ÑI³O< ´ÂÞ²õà×Ô“ÍÜõD³†‘”×±O4Ìì#‰;èÜ’ä>· #ÜÛVCÆ>ÕÌCN õãŒ?OlC3ì´³Åb;s :þ¤óx"Í5ôØF"”F…`øƒëPÇâxa¾ÊUê É;E=´QRD£b‹—<~Á½SÎë@Ý/¨±¨CÄxû”ºß£aÍ8†;ÜA…°E$$&4ZÅoÒø‡4ÿæ!")jfKáêÐ!Š­Õãó:ÄÆŽ"õB^ÍøG3*å zÈ,]¨=Ú1 üÂ@6œ8€¥B|¢ÀzA-a0û`Œ³ºøÅuìÃd0—4²xŠtÐCjå0˜'d†:Õù£qçøí.±sdâhG;.álp©f;F¥Á‰:o åH‡+æÑ pŒ#ôH¤Žæá5aT£|˜‡ýä¡vlƒ ;F;œ¡.‚`ðÈÆN¡z\Ïð‡°‚D8ðBbΨƒ5&F tLc A™ ÈAIX“·(‡è Wœë ÑœæŽñ_–h],Å5ØAÿ…Ç¡ðgå🨱¬v”‚õxEˆ!yƒ h{3ÚŒD³÷œÇ+DÓ’ñ¡E|©ÃÖ€8Œt ÐáJ½Ó<|ªç`3Ø”}lÃüãKºÄE„+µÀHYÒœæˆ+Ž!C4¦qœ?œHl|XÃ%¦Á¸'Qa…Û‚Ô‡5ÍIÅþ•hû@PR¼Ú›æpa()ºÚºšd =Œ]žBšE¢*šyÌHXÀáçpÇ<Êñ2rA+ '§æÁ‰õXV)p!KPtC &¥­IÈRW°#›“åÄ êŒvClE™Ë"£œ¦,y’<#’²f*phF5¨óÀ…,‚± EŠ"– dµBNš“’g=Ï͉m7ƒT•øU,AÊH…rÝ‘‡:¡ÌK‡>å½ññjAÐâÆù»w5ŠJ~;·ðU*qRb[«„2¿Å r[ò߈üøÝoUR´¨d(ÖoB2¬a…¸ ¶IFª»Þƒ!ù ,z¤ÿH° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹ö”±£Ç CŠI²¤É“ñ°hÐŽ(cÊœI³¦Í›8ü8fΟ@ƒ JáΈƒÖ‘T´©Ó§P£JÔç(Ä•¬ #µ«×¯`sb K¶¬Ù³9© ]˶­Û·3ëÀK·®ÝŠÙîêÝË·!—™ì„zêK¸°áÈ'®#šâÇ#+|%¹²åËaÞ̹³çÏ C‹Mº´éÓ¨S«^ͺµë×°cËžM»¶íÛ¸sëÞÍ»·ïßÀƒ N¼¸ñãÈ“+_μ¹óçУKŸN½ºõëØ³kßν»÷ïàËÿO¾¼ùóèÓ«_Ͼ½û÷ðãËŸO¿¾ýûøóëßÏ¿¿ÿÿ(à€hà&¨à‚ 6èàƒF(á„Vhá…f¨á†vèᇠ†(âˆ$–hâ‰(¦¨âŠ,¶èâ‹0Æ(ãŒ4Öhã8æ¨ãŽ<öèã@)äDiä‘H&©ä’L6éä“PF)å”TViå•Xf©å–\véå—`†)æ˜d–iæ™h¦©æšl¶éæ›pÆ)çœ(Æp t>…§%ÈÐg 4ä Øéç¡%ݧ 8Áp %ÜPèŸ~Ò°(£6=z $ú§¢4ô‰iM„ ¤„%P ¨ 1”0êM=|ÿSŠ8|*C¨—¾zR 84  6 Z)«®ê*S Ò­ú ª¨ÆÒ´A ®Új´1q€ Ô ê³¹b’¤¥”碪Zz­¸%1 •;4k+®ìÆTí°ëº‰lI2ü ppà ©êì­Ð²‰§ 6„P@S@0B÷Z[lrv¤‚¤:¨ Тvv à Ô±H+?²-šž%c

–¸ü"?˜Ù·n5ÈlXA D  dà $ „ZÄ!£ Å$ ‚ˆ "AÀ„Q€ŸðÁ5 °OcÌ€ÀäÈÇ ”@dÙã@Þ8¶P€JƒÙ@j°#ÐÁØÀ>°Éd2P™À4y7Qn@ ™L®@Œ2~¨‚N)X ”$Èä.Ð'Mj’èÀ(wY‚`—‚€-Gð6NZà”òsæ)9p:€a“1è€žÑ 7`NfGL¢?ÆÙÄ`$ s6;Îr‡9 •¦P‰L¢/ð*qÿ†T°A›E! ,ÁQA&¦ÐOb>r`‰30"> ¦€ F,A9¨ìÀ€1øØ@vÀLÄ¡ A,áRÛ‘àš°õÄ€ãSœ`!\á N¸BNp…*pÀMýRŠ„ Tá "HäXÀÊ;¤á .ŽêHÎcë€ÐÔ¦b² HÃJ° €Á `ê 0!pAª€ ym dð \a MÐ@`ï@ÈrÀ ÖÈl3Â' Q‰äüG0 ÅÅ í8È)HŠQ ‚D&怊MÿL ¹Å(hÁ lb™˜(20…ZdA»@ÃFA„OŒ¢l B-LÁZ"[˜Å'XëƒÌBŒPE& Å´ùŒŽ˜Åo#¡!Ô6˜(‚>…yü‚?=p¨àÂ0Y¯æ! wxòÖG8áwÈÃî «>"@h^P…7Üa U`Aîð†4<¨B#<` P ¨‚`<†44b0Â# †4ayPÃò0¾’Ø“A0„Àp'\ $ƒ^íúâ&$€ÔÐÃ$"/p~vœþ(gNGä`gØÄ(±‰ aÿ lø*tÀ\t ¸lÈ€œ%àX¼ ª8®qÙà6Œ"›ˆƒf>›‚ÛÍ@x+€TXBsP………(aDXÅ0= ! ú&°rG· «ØBŒ‹u|âÐõ-6Q5FBE0Cÿ.²Ð‚XŒÂ›H4@…,dAÌkÅ&Z€ \ø€EØÀr± @§P L³ϤLiµ”ôkÁöw`pc0wÇd<ÐXèd=àwA°$ x- m ­T~0ívnpÐ:&KÓf°`‚C0nNð*Pú–ÌÖVaõNàNÀä*†0úSJ€¡PÖ0 p1ž•Df¢EZ|ª…Ÿ@ •ð FŽ` š&j f$ @ ð}>pf«ð »Àªµ|>P9°ªð\ügP¤° ´` à­@ ° qÿPnÔG" `±° ªÐ[BÀZ­µ"õõD‰325õx$@VEMpCð` q°+à*þ¥(`'" ÿG8€“ÙFð ZàAIGuvâ<€a4=ð†PÊF?(è0ÀÖ•QA`C€@CÀ+–)€”6€\ÔE"‰*Ð3* A+B5àiÿ§™‘¡-*8ºœtvr$0Š#C6aôRÀ 2ÀC,TÀG:ÙI{3‹"5p¥‘¥4øC@2À0E$3Y:]ÊtAdS¦“DE‘$38ðþÒ2:àšPô€§ô°º0¡ö‘R9 R1À™>*3icZ ¨áy9^:è󜊋Ú8¡I‘*÷Y¨%À)ÐL²œ>z2Aa'Fcª_.’Š¥¥ªˆ !ù ,¤!ù ,¤!ù ,¤!ù ,¤!ù ,Û¨®Ü EÀ6Nlƒa‡†u(t€A…76< ¡C 6B,q‡Œ0n¨„£Ž1bìˆqã#D%däÜÙR§Œ›b ³èÉž9oʸA³)S'EøÓçN;uNý‰Ó*Ôš=pEøB ³hÏbµ ´ÄG·pÝ.•Ê•[±'óÒ̺s*–€f ´*_¯6ý>LX©ØÅlýv…œT²a¯S!ù ,¤!ù ,¤!ù ,¤!ù ,ߨ°H0 ‚a±7XâF‡ hŒ€¡ r¾aㆠ›¹P vì±€Õ¿—0‡èC Œ JýÛÇsß¿_ ~ÜÁ@§¿£>ƒ%P9PGÎHÿ+ ´¦œF£*íAðÆÓ}Z© ˆq£ÖGý%MÀÕ¦S`ÕJkuÇÓ´kÛ | UîT®1jžõ÷’ðV‚:hªG1½}ºØ¬Y‚ƒÃ8 !ù ,ܦ ÿH° Áƒb \ÈP€Œ„ul°" Û@ n`ÈAÄœB×ã„ÉzÀÑCE‡’¸Aá…`œ C‡ ¥NmøA´‚0PÜ0 £é Oo €ªã( (0 ‚”(Â(!ƒ,Ù1Ì*¼ ··Ü°™ÓÕà¨À‡:Ç–-«×¬ äüLXZ€KŒ]\B‡cÇ$`èPc9þöiÞ÷ÏÙ•óžÈKAnt`ÐᆀeüÉÎüïÙÄv¢8±ûF„ÏQ Å@I3*”$+5›¶mÐƦqã®yºJ¡k¡\¯¥ÌéÜiÎÙ6î¼OèX  \„Ôˆ¸…­€4aJþÍ.ÿ¹ Œ2ìà@/Û<Ð@4Í$Å7¡|ã…úÉÆßy¥µCº¨Åßè2Áǰ͘íW[Éà+íH³ 6;¤@òœ’@‰žHabêbM¬ÁLbŽàèŠ=¤b½|3€ ¤Œ:¿4ÀA„é÷O4·DVRÂ7”pƒ&šl@CeÔS=sî³LÐä$ÄÖC4@P ()´Ð ÿtÃ!¤¨!ù ,¤!ù ,¤!ù ,ì¦ÿHp Œ‚ 8xPaÁ2J܈Áð ˆNÜAS) 5JÄÀñ£Ç’:`ˆ!° ¸(ÑA€8ozh¸Räo4øeÎ6lܰ)é0¢Ó ~Àö¯ªU(b\”¡#G %¡ ü@íß¾³g­`¸!`‡€'tøf¥À€jfýé݇•å…#Í hÂÆÎ5ÓòîUËV@¨t= ”BwkRƒ²ûôúã›uà±z€+ó€¬âÍŒ”àfà (ßôÄ0yoßttPbNŽ]Ìšù®è@‡ Ѷ=;Üvg)n´ A¤T¯ ‰3k‡2\`-Tœ2Xð €µþ¬ú»½¢ 4v)m½z÷éqo¼²g ‘%ÀAr‚CñÄ“!ù ,ð§ÿH°`Áu€±°C%dȸAP†A7NÀÐÈ1F‰ Cö€PÀƒS:Œ8 eË vÄãF‰8$–¨am¶Ÿæ†Å,èAF (ÜÁˆ¿P¡š ð#† GÂØ¡×©?<訷¯ì¾Ûü¸œ€4LS ‡#õüé=Ë­ÀÈ‚ÓÜ$x挘´69òîý÷M­A=G8SWª5 ŠýñðW€Â6 t8Æ €"pxõjfìx [=H;6@Ó7(™7ÿ%10@ Òˆ˜t;÷?n­wpx&ÀY˜Ô˜e·ê³i{ÄÈ!ÄSº `hÐS¦‚’ID—EÛú„Q 0FÀ ÃCƒg¡>Ça‰åt” ÒÐÃ<õÔC=ûPSÀZX$a„U`È äá@DId”E¥P¢‰! „Ј%­èb‹©(P@!ù ,¤!ù ,¤!ù ,¤!ù ,¤!ù ,¤!ù ,û§ÿ8PÆÀ¤!áÀqT˜P20–Øñ££ÇÒC#Ž0  AZÔ¸£Á©rظqÃö †‰KŒ,)£Ç€fÿ’*ÕÔ`‡Â2jÈøÁqÀ²û²îó§( Š4hpHC«[ýíû7ÉÓ„X@p(š®hý©eëUa5GÊ5»µNÏ0¬z×¶}KÐÜ„Rè6`æŒ⽓ú6X+p'›f9­?¶U´J€jħU áF ¢SBáÙ7jçv»|zRj âðP"+-x±n]«èm5‚pPc2 0jûwš<[_¼¸‘&ކí£G¯^}=&2t8T£ t@ p ƒE4Ñ ›í‡IA ÃWàP 1˜àf†„ r U¡$$ÈÐH4pHÑA ¾#E!!dãf!ù ,¤!ù ,û§ÿHp Œ‚1 *\(ð ŒÞqƒ¡E3–Ñã‡G;^4¸±äà (€ ‘Æ(CƆhß°qÃö­Y„Š#M–˜¹B½H‘Êðca 7vèØQŒ8zìˆ0ïß¾¯ÿÖ%©0FŒ @¸ã‚ <8 ÷ÏŸ¿}ÿØè¡PK Ym p*Y1jzе‹—ÝX˜‰˜s&@Ý©ËÚM:VNqÝ»y÷*,A@:–U L(æ”teœwlÄãŽSÑ —¶Ì¢ SÊlÐzùBwbàj΀ /S\žWä tT„˜ð ÍÉÄÐŒZ€0éŒöWû‡Ão@¥B‰2z6™Ô¡ë>Ðbé €4Ѓ‰Ä%T Pð]IýÓNÖDA01Hƒ ʰìÔC‰õ˜ÃÀÑ‚H”‚F3À t°A '4ƒb´Q‚@4FÝ '$ô!ŒC”‚C:TBE3Ñ`UCAÆx[QbtÂ04Г…)À”HR™P PÙåšA2äBDšI¤EzÞ©çm·!ù ,§ÿ8PA1*$hPF ƒ ÈÀpáÁ‡cÈøÁ±#E‹:Ô¸!À€¨ðq`Ä1JìØÑcGEß°qã†íÛ¤;B,Q¢A‚èúÇ´i¯AîÐ!@G ¿¢I;5àÖ¿}`÷ýÓ• Ç ”#6l¦S_ýù«‹ATň Ü@âAÖŽ…Š;wlY‹hè¸Õì[V„éÚ=ÀJ9-N ³öä}ré&X  ¹06@Ðì\Ð…u-Øñ˜€Æi…ƒƒhÑ^‡«ÀlÄiÚ¨³æ\5lêʽÀìB 1:e¥kdÃÆF‚ð#B2,õÇ”=Ù Þ !cš Ní£W¯V³É_A4dT‚t€p (} ‰„ àP '`¨F4H$bL7À“ 2x¸…IÔâ ÀТ@‚è"Du@” )ØRA.IãBñ54¢ˆCþø!H!ù , ®(àD‚ŽÐ`@!ù ,¤!ù ,§ÿ(c À4XP@‰† càˆ¡p¡Œ‡/öøÁ±£ÅŒ%b”¸‘ À€Àað†H‘w3Fe÷-Ѽ ÆqQcsõèi¯×Ž‚qÿP”ÑC‡ò@¨8c`ŒÁƒ/!Ð¥À wÃøÂé7œð_BðÉWBíT‘@»9ÔÐC$xàSúY´B-”Ð@ÊwІv¸àB!ù ,¤!ù ,§ÿHP†ƒc\Xð` (Ä!CˆKàèñ£cÇ /:ÌxƒÃ€Nˆ #äÁ!Þ¨†6n6ͱj€Ãâß2nD˜ô¯¨Qg~l ´éŽ Šü훺ïß²=: 8²DŒ%jTÐóÏŸÙªÌ(Ø£„€¦2dô€ ¨ìY«Xª ñç×’6<¨kVê¿´k+àhG9ZÛ5|µGÃŒ?¢™{¶ î¾»ˆFèid¹„ïVXdÓ%RÀpÚp3µ0#~¥ㆌ´ÿM¥œWÀ ‰¦øÚ;B]£þþÝ^›"a ?qDÐS½îûˆ%E°lQÀò¦8àЃ@— Ðx q©DƒÇËÛHrà|…ÁÓK! €¥1Ô”@$¼ôŸ~öÅW^E&x „b(P@!ù ,§ÿ8PA1*4(£„À„7dÜPX°DÆ1vüظ±ÇB‹ cÈh`À€%^ ¹£°rظŴöÃÃ@+0÷¯§O"®lxãGlÿö)õW†8-‚2`[RXëý*2* H÷aezä© b”¸ámŽªW³¨ H%rä@+6kY‚ bpÐôíÛ)Üâ2‹ÇŽjeÔø¡c@رõþ (á!¢ µ%t°Ú×ß¾#67¦!QdËŠ3w Y :ÁýóçsÔ²V£GiûèÕS>Èì"oc,Q‰ 6* Ép$kÜbb3÷‹A‚ÞÀåŸÏŸÜüˆ(ÃÆ%`È`eŸS§ÿ¨ ø1ðb‰ @Ȩ‘@É>`÷ý«6à&Ä%<ühf…ÃŽešêõ'–,Õ"x(Áá[¯¡ÐaùvlÙP*¹Á —ÔgÍ8¦k˜ª@p¥pSÎ˶I?&×=,p8&H›†íÄÑ••±ã«zÇXm­,Á8Rd,¥BÓ¹£-K,Aãj¾Püý”Þ[yÅ wÈ¡„^½ïôöIL+ |`sŒ-9tXÏCB2R„O†^@$øĆ• Å`B-4}öID|B( Ê÷Þ|ü]˜‚jxáD!ù ,$¨ÿ(@FÁc TH°¡A% BðãG‹?0$ø0¢G 9 @‰ &<éqGƒ[å°qã&Ó ‡%zŒÑc€´@ƒê‰€ƒà:nÀˆñcÇ‘Îþ훺ϟ , qâ„‚ 7:$H€¡À3©þÒZ%Jl39´<£Ö+ÀÙªþª^ÍZn`: DÊ5 eN3´jå-ú«šgÏôJeB³g‡ñêÅ*°Œ9,ÜBøÕŽšµm½š!N«¸¨€ ­ý`PªœŽ=DÕl•sC:68 -tfµk]ä@£M·J5Ø]usÖ d¼(qà vÿùe ú¯uÃ2RÄ(±ÇËöÑ£W~ß 4_/‡$p ¿ ”BN]— N)D D• 7h$€rç!tB0œ°ƒy$€„r”ƒ þv݇¦¨¡Œ!ù ,.¨ÿ(c`Á,!ƒa‰=~DŒ¸#F†–(`€Ç dX\CcÃÓ¸aSYn™f”±aß¿›7Ù ø! ‡€%‚Þˆ±£ zþö)ý‡®@‘nœ¸ÑÀÁ‚èýó—ô_ºu]¸AáW/eÔ4ÍÛÚ5Ó‘åNEˆ@Ý©[Š´rµù•§@fÖ&@˜ölÀ…¬lù¾ˆ-™ˆÁÃ&ä8šØ+X'tÔ€ MØ´îk»X€5] T;¦H½\½ð+ Ôô„!A£ƒhÒ>6H!CF 1hÖÃéË?SÐ(#FÉîêÑÓ^[‚àiˆC”Y:l(!`d{44ùþ†Â% ê`ß" ë÷adÐ 0Pà} ÄåÅŸ{ɇ`{$¡…¹!ù ,.¨ÿH° A1”Q‚!Ã2~ôøãÇ …epXb…B€ÇA9ÊÀAÓ7lܸaû¦'‚I„ctlXâGaÿ‚ eÅ`Ç‚=dôر£ÄŽ=Ž$øõoŸÕ}ÿN1è1GCTØ¢A‚¨îóçë©;Ž-ª–fÔ˜mèU•­Û­¿  0 ¦ÔžMv„ïÚ¶Yá À°¬ZÒ€°¡µir:Ö²V®qÀ,àA  0ãfŽˆc¿‘ã P! GØah¤pàº[¬JÿE-pCEAìpVMÚ7$·MK&B ˆ4J”x9Å*̵¸OcB d$ í/h}­º ¢ ÇŽ è²=õÐC`]ùé„RF<é4Yt€Aú}EЂ ƒ&½ @Bž´Ñ‡%܈ f¤ÐW n¸áz }•  ”ˆ0b8Ž0Џ =b¤!ù ,:¨ÿHP€Œ‚c TˆP Œ#B,xãÇÜ`8P¢Ç‰qp`€Édp±åŽ0" ¸AA7lØnš+åÁ‡1Jàh!Ɖ–3”úÇ´i²?ê0¨R†a·"=qˆMÿö‰Ý÷oX1:,à€ÃXŠp£‰ 4ÖŸ?²f£b0m™ G¤M u¡F %ͨ [À×ïß²gF¬ "r¶5[Ðcµj¥ÐÓÓ÷r`ÕF¸€CÇ€gÅp°¢®L€SÛ*ûœY@3ßÂTè!Ú²ʤÓaÒ·S­‰GXÀœ°24Ãà’u¡«Ö2ñ¹¹ÙË,]9ezK7-Ý$EÙýCLÛ dÈ¡ +¬è¢L¢‹ð%–kÅ5 4È@A 4À9ÀTÆ”?ø Bá°ƒŒ1• =< I=ôÐÃã>¿$°ÃOµ$Bp@`PA9dДQ.$@ ½Ð• ÙØÐ W @C˜[T%A •æ–\RA$ 4æJP²ù¤Éæšvê‰'A!ù ,¤!ù ,D¨ÿ8PÁ1*$(£DÆ1vüè1qbÂ…:,ƒFƒB( à"ÂŒ7ÊÈá€Ø7kܰq£Fca •)P÷¯gO'J,±£( oÔè Ü¿}PýÑ»QRŒ$hpC‡ €`î©¿³õn ¤±aà01ëEíY³h©Æ`ðƒƒ@QæŽ8%Õ©u¾áõW†Pm„ À\„SßD§‡ÛâzzthÅ¢tNqƒã›ÅûÎ2vLP])ĸ-`õ  מcç-¹L@ƒa¤ (5@—99Î)‚-»^C‚Ý@¡”IbLoÚàT8ãƒ1nDஇ7Jp€îŸ?Ÿõ<>ˆƒcDŽ?(pÍ>ôÔS <5a$F7•€ t°2˜„‘A=†U *¸`FUuuQ… bèˆÁ`•‡$PB%tP $zè"z,^ˆbU&!ù ,¤!ù ,¨N"ÿH° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹-ʸ1£Ç CŠI²¤I“2J¤\©ò¤Ë—0cÊœI"Ë›:ÖÜɳ§ÏŸ?U Å ´¨Ñ£H“2Üc¨SJ£JJµ¤Œ7šÞl µª×¯`ÃL@!†Ö§bÓª]+µ†[7veK·®]“¬XáíÝ¿€_Äð­Th7̸±ã‚;¸Š #®@-ly̹3]ØJ9@Œ³£g@y^ͺ*r“+û=°QHëÛ¸ÒP¥ÃV‚D8˜à ¸¹“+ƒe@äH/#ýò娳”qãÆÓ–å¸õÏŸyÿt1Ø¡½½û‰r¿o$0þß>óûÒ'è! Æûÿ&¤ÓJ9 DyûÜ—ß-ëèàƒå^KÚ‡Ÿ~üùá†ÊEP… ú³`ƒ–¨]|( â…ºìgâ‹'´¢ˆú±ãÊyh`}÷ÑØ"8‰ÝŒùµh£HâF$†I6Ùˆ ލƒ“Tv&/ÿd©e/.jXå—€Ñׯ2ÄsÌ1Ë´A `¶Ø pÀ04¸©ç_;ôƒ=èð /ô·ç¡l­pB°IÃ\ˆFº–—’V¥–fªT@!ù ,²à#ÿ@° Áƒ*\Ȱ¡Ã‡#JœH±¢E‰f.j¤¸D@Ž CŠI² Д\Y†–0cʉà„3EÂÈɳ§O…Jpx¡A„ *Þ‰"bŒ‹8<ýIµêC*vè¸q†Œ¤ ·NµØlCQ .½!cáQKŒ±Ôª]»¼ðÁ…:JÄ+µ0a‚@Ä«P‡[`Hkp*‡ hH½Q¢bÆ…c` €¡ˆ£#”ú®ë˜yE‘3IŽ8d´Õ-GmAXQR¢îÓÜKcÈÀ#jk=Â(²A@[ƒKÈ ãÁ:‡#“”`ÿ`Š( p€8"GNÏ_Ë™×+xÖÌaó²aƒÜð€Ï¡À T3LðÉEC_ Ô @8@ÐaÜP+ß`ƒN0,vÐÔ´c 8`àÆ7Ü|£ä„C“˜#O3’•Á 7åLC„`óY0  8äpN3ȱC†eô….êè¢É PŒzÀçÁzh¢Ci]˜§|…”ÂŽTÂeðò ŠPóÌÎXÓÀ“yEÒ8Ó@ PhòêôògšBFz4 Ë6 Í4¬£r¬£D(Ö°C4Z4Í7ѬÓK4ÿSÎ6Ö<Á@3éóM1j%xpË8?tÚœò\= £I€¤n=ÂÑzC” À6Á0P—¤äV”×·œSŠ0ì°@4ͰL4 8ðÃ7P ðà4Ô$ÐK9h²ŽlsÌÍ`3@tW팚˜ÃÎ- ô0×\3²bNÃG Ãa)è”1žTSÝA¶ 8öC¡ ÅdåÆ<‘°ÂÎ4Ò¸²Aš”“7¥¨¦…9e€°ƒÔ, 8–rÓAÂXÃg3ȯŒ-¦„¿àËÁ…íÆ5€:¥X‰NÄ¥–Ù6ðVm¤SÊ£2çýP^FbÿÊ@4Ô€A5ÒTÃjZ”cE5 ­4Ó·”ÁËLƒ°3U{=®r0@èœ \©•@)ßDÀæ”@(æô ×ã PÀ3Tï@Áà°2z¿¥ ôbÎ:ì@ °B.ìPÂæô¢ÅÊÖ@)æœ`…:Á„²Ž»Ñ<€.£Iɽ Ê3ëXB—˜cEmÉÁŒ:¡”Á@1.úF3ЃƒPÏÁ k‚£!J‡ /fñÍJñŒ @75h€ÖÁ60¯ذFÀ V@ÏÈBQkü¢†0 P†h(ápa‹€.ÿ¬ j(¢º«‘(€<àà+ƒep£DðÀÑÈD „-ª†äPŽjdãºÀ@í.8Ÿ§€Æ!Ò ( šÁ, 8{À“hƒ 4 :7€dàÀ `€¨ƒ \àI Ae2X2uÙ 4àmÐ `<pOéŒ%( “ L…”‚üà=Àåjòi/`ËjæÔ jXA}Ê¡A€ó@É`8xR ÐBÍ$7€&e¨YD›2‚¦A¼ GhŠSæô&¤2h‘ç°ó5ï¼ &0€Àž˜À "ÿGÁ Sra@œÆò,F²„#W°¨ ¡ !(¤.†‰V4$QŽ„ " Ås#O± àøë\ì"2È&€>p|ãàHG(z5l v\M6×)€L@*È€bp„À¨H Á Xð¡¶R’Õ MT?úFžRT!_ŠSC>Jt£èÀ´:É«^µª yJ ®p…Ø@ªî€<Vtb@ÿYfNñ¾úuøAšNP‚­Ü¡ÅQÀƒ¤øÀSÐ@¡‚œ '°leªœ :Ð@ªXV‡ÀV»Fì”n}ŠUA9£ÚZÿ¸à Aø@ –ÖÝ>e·ÖÙ­GWàÑŽ® Ah‚ jð€Á¦j¸Â÷:&4¡G§ÛQkÒÀ¸© Þ† 1 îvƒ{a,X¦ä€§™ (Å?öÁß}üã ðÕ: Ìh " J$ôÈ@B.â QŒbÁx°æ*¢0›øÄ'|pà d ÝÁ7œ‚õÄ"x œ4eÅÈ@#Ðå¤ š‰]S°&¼ @.Àôg)¸À`П X e»”7p(à w`Á>?8Á@ï ¬l¬ÿR3 Ö¼ X`|,Aœ/0:ó9C$ @N@ˆÔ‘S–Á >Àå à  °T ÙÒC^U›ßýúÃþ F,6Ìáv`&’€,DâŒRذ 6¨‚ ØÄ(ì &h€ ™ˆB61ŒbðÁ(ÎЂL°Á‡ðÁ F`†M`BÖ>pDa‰'œæ¡!¸ l°ƒ9€"9H¦‰MÌ¡/xAB¡GOÈÑA V`54ÁFœ†*Ø€­pÁÀ†+€a AØ@ÀÀ‚°Õc C#Òá¿‚ Xà'pœÿøAü ch‚F„a <¸ÀƆ!¼`APêÐÐçNA €>5TAHCè†*T@Ö Æ4šÕ0@¿Ÿõ?D-àb¦*19`‚ ¨ØD¶P PŒ‚qÈõ,0! PL` µØB vq†)ŒÂvoE| TØ•˜h R´Â>˜E,!‹M<Å(EÁ"¡ŠL”^I€E& "ˆ€P˜Ç/ !°ÀGl°)¼¨Â¤®†;ü.Â#œ‚;ä wxÃœðˆ ¸àW8øžoð L= hÂÿ®à‡4Ð.àAîpì[ ày†&<äiàÁòð54bà\† ‹†0W`UpÞG<çHüMÐÃP z ¡¶Ÿj£–&:0 Y §ö °g0h—Ž  µÀð ¨ Ž` 1³-P YÀŽÀ£à›°x³@aŽ€ "Py«À€ • q  $&S0KE@ s€…³ B  Ÿ0†fÙt Z0hMp~ips.@$0t`N C@Þ<ÐMfÑä€P~ÀÀ~NHÿ@f! eÞçÐ Hj°CàÊÅ~pc‰wÀ.Wp‚ˆf ZrpiàdˆØpy`ã—ˆÀ.ð i0ðEæ ZP²äu`‚cWe7 hànŒ° € ­à¤` =` ¦aSxƒÖ„'«„BH„lð °z>0…`­£ – s`ª`À² ¹¶ »À ag [@ L0Y° © B 5·ç×D6o༷‡q¸H°i †Ð wMàAЊoðcÐ:0~wÿÐÞ×6U°È€yÐ,À~ Ф.r—F°=ЊtPi2©eP’3wÏrtÀ 0q€’„7À Öð r Œáú‚b'j¤F9 Ô˜ E° – ©÷fP gº–Ú¨I@ h@ƒY`x-b°ÀE° xyvàeȵ08  £PŸ >àIÐ…K- Ÿp‰yI €w`K·n#hJv€€@d{ht0w€`ð)G†Àc9Wfá·8‰ÐÉ:™Np˜xoPŠä7Kÿy€”í×ÈYMù”50~0èÐP´8!NðÀG}Ê%8 ÃÇ;ðÇÔ?Ö0 Àèôuÿv"(ѨpŸ`–ð 𠦀 © > ¨ ŸP q£@  ¦Ð-ð }§—-@ h˜§g8 ± Y@I0 ¹y#ài— ¹À§zp¦ ©°@¨ ¨0 ©±7{= •8°CМÐDUðFpFàHÀ.@o`h;à¦wàW )àj€~'°‘sª@ |Û‰}:§q¨ˆê—˜Öùÿ 9gMPi#iÐ×5õi-~pàcÐ~ .$@~¨H§PCàP ^Dœö–Î(—…QLàK`†K -KPLàQ@¬> KÀ" L €¬B¬0¤€ ° L ²ÀB°J÷Èš$ > s I€`¬E²¶P­Q°¬\š“$ËQÀV°Qúù§._6à}U0qzú÷G…’V,À¥ ¸×CÀб+@$ðAÀ:‘è‡C€° ër²?p{,ÿp^.†%À'°°C`}:»O%`t- ÚÑ Å@ÔÒL —Zà"µ À€ê†"nv`F1/`7ð9`nk”-¹€–Gåw"@³fo%A6´ pKQG¡O+ 0@ 0eq§ñ¥oDVÀØ~ù=û|‚&fÔG'0Z4°Oè;ÁS‘«·ØÉRð°´{²«Kú%À¥Rá‹Gu1À]:´@Æ[?v(hAÂA°• ü]»•·÷ˆy%\i²±¾˜*pY+pKq4¡Pô0ÅóPº€7ÑO‘Àd^œ´*€Q!PPµP€û[700”RlYK¸ deÇO,ŒÇ Ç$•šûctõÁ\vö Â#@W©´ÚSpYz^ÛÇ@r`ñc20n?–'PÁ1#ð¾èuÊñ] ¼ýñ½TQ¢Ü20rš \:ÆuƲh¶lË'ÀGWóN•Z Á²•AUU̱oœ,ÁdJRñc„ȇ/æÙ‹ *XA…XL‚ã^yÈÂV=èYÑá.Ã.$¢27<ž@ú€¿†ŒÐ<¶ýÿÎ㞺ðˆH¬HK¶Ã Ž€Y¢C"³Â$ZñŠXÌ¢·ÈÅ.zñ‹` £ÇHÆ2šñŒhL£×ÈÆ6ºñpŒ£çHÇ:ÚñŽxÌ£÷ÈÇ>úñ€ ¤ IÈBòˆL¤"ÉÈF:ò‘Œ¤$'IÉJZò’˜Ì¤&7ÉÉNzò“  ¥(GIÊRšò”¨L¥*WÉÊVºò•°Œ¥,gIËZÚò–¸Ì¥.wÉË^úò—À ¦0‡IÌbó˜ÈL¦2—ÉÌf:ó™ÐŒ¦4§IÍjZóšØÌ¦6·ÉÍnzó›à §8ÇIÎršóœèÉ(Ò¹MàÀ`'6q ÏzÚóžøÌ§>÷ÉÿÏ~úóŸ ¨@JЂô M¨BÊІ:ô¡¨D'JÑŠZô¢ͨF7ÊÑŽzô£ ©HGJÒ’šô¤(M©JWÊÒ–ºô¥0©LgJÓšÚô¦8Í©NwÊÓžúô§@ ªP‡JÔ¢õ¨HMªR—ÊÔ¦:õ©PªT§JÕªÂDVmJ °U…lu«X¥Vꓯ¤« kV©‚V”¨µ'mmY òÖµ"EôŒ«@¶JƒD¯ ™ëB+¾úU /  +”@°c}¬]•‚Á$4:0‘ºz•%˜%HhòØ $¦ì]ózÖ‚`•žG€ÂDb@[†ÿÜ@;¸k0 µxe ƒ°ê¶«2 @ Z£ì ² q,8@ IJ8H @@]ܸ[¥gB@@ÏÛ¸×HRÀh}€@vàÚ‚ˆW Ù@ pÛÜ¢x@·\ˆy¯›]-Ä™=+}R‚h½ùÝëBBQx ½eˆ b…ã— (°.…A¬W ¸ï@<,à Èú»]˜ãµ¢òúÎ5ÖÔ¹@ªôb°™ªŽ1€K@¶Ën¡BÔJ°® U PÌ0Ç-ÂiL#V"H7T%€$ŸãÿDVhï@ðƒ ìkZ“¨Àb BÔàGÈ F”K]VÐ8)0ðš WñÒ–X8²,`Ãwãh€Ð!\zWr€¦ü‚*DÞ+0%` À1"°ÞBÅàXHjEß1G€¹¡”å+€Ãj–9È60PÆš'S&òj8ÀÇ©Î0k‚¼Ú à€ì¬œl9p »ß XlV¤Ú™1:z 2D`\D¦·¸Û(AÔá[P€¾ ÐÁ¨G}Û5€ÅÏ6 .bŽ=Ó ç(ÃÎ$ñ†5 Û8‚@ÒT=8ëV1ÿ†œ/ü@šÀ¹[ w³ºH²XÍ6p¬7?1®zŸ¸î®À&9dÚè ÁŒ9 ëì ¡GÁJ †D"!]ˆÂ "‚ D0BÖkÖŽç Õ1:€¨@¼ S6¹Z9”ÀË€ù¦+k„‚= €‚ƒjÁ¸´A^Íq{  ËÐ:|Mˆ¼ =ˆÀ€‚­& “È å†[,þ 96«³K  äÁ½@±L $ `ƒ1¯ @ 6õ@| Þb "ÐA tƒÀWŒï’}@WÕØAÿ VPƒò#Ò G¹R‚¬Àý+Ø@¦!;§í8Ør,z‡áp001† Ïn    ŒbZlÝÆݵ ºÀP&€~'&éF:PtcvÆ Ëp*ÀG]Ѱ ñRaÜ Y+ Q qô&{æRÐf#f*Öƒf') €iöX@/l±H·õ„ )216P_x60†~• *Jwcø/ cu_2ð† Pin8Âå†Â%q'Tç€Uì7ˆpHPTg7?Ðn#ÿ°`øc·eÐ^bHÌ…4°ð‰XÐ7pˆN7mÂEí5‡E0mµU7_¦µgÇ‹•Z0m—ˆ%pÁ8Œ/…Q2~UbÞe‰\·uͶ:P*°¾µ! îwoHBÐ…ZF7-"l[ 6 )PïøŽ‰µ*p\•`~*°_+À.p×8~ûE%°Ž%fl‰áe;0†6P8Жx[·5‡8ð;ÀZP Ï`Z&¦k?€# rÓ r¬u4P'p5ð˜UŠUYº…Œ; %ÿ.`´Õv_uj·*V@]%Pï”7 |Ò×löø1`b €Ð8•7/u‰•ÈGW±f0p§\Xµ•§5a™–p˜‘i)–yhU\{ØXH¨XÑWxiYú×W\–`E—h%Xq…VH7p) 0ï4né[qyÉ%p¢È“éÅ•AV–µ’4`Xü·—¡•[+€^›I—Ã%V6\‚`mGÍF—géL •5›€%îw1 –—Ä…|[9W¾Yp*à†ôÔ–(­œœÅ…—£uYüç^¾‰Uƒ)›=ØZ<)‡ í‘@ÿÙŽhù˜Ú)apx|$pW@’õš !,öU¸`2¹_¥Xh¥‰Šu 0h¹³'‘ Ÿ­õ—•j §9 Ã‘8 +Ðo:p: ¥Ùñ´}!¡ô_h]7ÀR˜…h‰pùc¸'$`+9 {h‘‰~•l*`ìG_,™¯¥X™•—w™\…É~5`, ¤+PŠc\5ð¨n+% MZeFà,@À10†*p“¡8°.š\8à’0@0‡_šs(¤ú[ oäøXÐŽ,€~¥XF n)à}Èð(™ÿeu;,Œ‡W=p˜Ûvž¾ÈU0ðôæ[,ð7ðXµsV©É›h•Y·Vú–j8•šj¹ÿ¥2@[* o¦U±šöè Àt!0w p„Á¥f¸ÔE]ÇÊK0 …Ê c˜fYH’! †©¶UWz„¹‘!`aNW•Š…UÎ(M ¼5c±ÎÈ#p—`Ê{6Z4`pÛø°p)¸¨ Q˜õ)ð]£+sŠUeUV¤ °ðnˆV@°   ëwÀ¨‡ÁXšÆ°ùš¯2ÐÊÿ‡X@ ‡°7  àôD c6Hòå mÅ`… Ð]cÀö–`µ ÀYme}{ç^7€V€0pªÇÄ…v°¼—f–° v Pe‘ |p„sàL0I€ Ð]¸NX(|sëoëi– ŽŽ>}ŒàE •·¥׸€° à/0L ™0-PšZÖq0@ðb6ð”2`j … MYW0ôåU `À/à[W€°›ºûrw »¹Ë~Á À»º{¼å°;Mð°¯-&c Oi°½ïÿØA0WZe°ë0i@¼i€¾V Ôà§8‰¥f9gPà V€xø[b ˜a‘_Ç0 WÂçm˜©z=¨\¡ e£¦r(¨V ¥À¿Pæ,—¸ž'`™Z¯fKL¶'© ¦ ð¶(<´@f§ ° A·cwÂ)‚  ± Õ*>° 'L ›*p†Á%iFÃqÂs áh®½ðpñ¦Å=€UF@‘jÐjXÕ¼uaÐ`@¼ák,W0WP˜\ ¯ËƱ“Çk«Kt0jà¼o0¾H¼æuipÄ›]yÿ@i°Çc Æ`µÕ ŠàrÉ¥X‰åc6–n°//§c @lÁI‹+#S(‘ŠjÛ †V%€@]ïÕ0%`C¦ “V´ön1 º x±5`h¨–Pƃʴ_w p¬1 ¤Ð• ‘ ÃS…I´À…˜ Új¼± ­"ÚJ|q@Ãáø /Ày:–xÇ;iPl°ºµ,C yÀ.`ÇyP¥Û[ÄKVlll™U±›U]j`Fðúu¼$ °yÀ[Ü¡È7Ð(ý%@¯–øÆ»yÿ,ã»n†€@H60PZ8 iß@lÅ0º° î–@oeK7“`7è@uÔ; ›gò ìZ_*a 1@Ÿw0°Ñm¡!l+°^ÏB”‘ 2§/Á° ¡rÌTÂh \¸ ÝÂaÍ0ŒÂ7´¡k á{E@ t« 'ŽÜ+Ãf÷Âà{P z» h f@ðø,à·±¦ÊW=Á\l»Mj0Ç, ÒàA`Û[Û÷6àt6€Ò%ÇC@¼_jpá.PÓ(Ýü*€Ÿ†ºº1íÛÿ»½{f)@  $ ,_×P( ð ” €j16&J¡° æÆYã ºÝF§,»Òmå0pR[[UŠQÎ@޾˜nÀYå`kænWR4mr“R‹w`Ô…,£F]à€`ذ/¾ÈTÚsp|;Ù¦vðÂYP l–‹…öH hQ­'<DÐuŸ=µ0Î8ŒÏ>L0ÎI¯2l‘pÂ> Xx"¼PŠlajm=H¯¬Û;-Œ° ÍÆ°$Í)¯ÖWpop@p í¼ë5ôÚÆ$ÿ;Š.pèðU€‡8ÀÝ{öÁ]¯ÞXµ“*€íåÕPysÅ( p.ë¥ ›Îk¾s2ØæBuñ X-Ð~¨iñr[² ¶UôµU ö,=cæ€ `ZÚÝÂ=P¬ 0&`ƒ¡kÛÀ§° À3ø¼îšÇd{¦ÀŸ`¼w¨å±NuÛÄ}ûÖ¸"°¹  µ0£ðÂÛ— £ /; ¹¬-Z/\ÚD.¤@ áhj½ÀZº™u_; \oP¨¿°=°Ó5`a†ðæ%%°º@“ -jÿ°“ŽNC`ÀÆÀÄÛÖo€Ò(ò é‘<)À«{ cÀÆv,ëëœZ@ß’Ç\zu%Ûð%àa0ûÒ4€Ñ Íà¾| ,g+´ÎÉPcpß—™E¹«¿u®ÞU6ey- ¼:ã'Ê  èp%Tr åÐ,3¼iL%ÌïÈê·¡Úš"E°Îª§­š…‘ ›; Q Ê›ú…Ù s@äð@Ëi «¯ôf¤˜Wz—»¨z¾“;¹;}¾5Í$P@ðæ!°Uæªnšn®'À¥ÅV_ÿê¼½K6` »2¦Án)°.ÀÅé­ç±“'`lÁnþ6ý©Á — {m°É;ðjQî1:(%@a.QHB†B+@sAáz ¸†€‘%K”ÆøX’¤NH…>…UêTªU­^ÅšUëV®]½~ Õ€ "ŠqƒìG4^Ca‰£2h˜ ¡†…ŽèxÉW† ÐËN¨HÖšB¡:H¤!Y@ŠÁ/X¼x!÷ÃÏ,|t!cD cŒX!t 2ÿBÜô ´fˆ*ìûãN¨¸áƒ‡B„øXbtyŒ|>T@îÂo®HÁˆ+ hR8j¿s°ãp‰Ü0(¤ãæa…Ü*¼¡ƒ: kHR)ALЃ[ð£Ÿèr+Hð`$ JPi$,œ(…°¯H èr@Ø`'â±FoÄ1Gw¬ñjØAÀT€N…¹¨AŽû(6µ>ê.lP(ÆZˆ‚ˆj{aÔrK¾Í¢AÖ’T)ùœŠM8ÍvØáÊKah°¡„>ÃÊù¤Sh Ò,!æ”Kÿ# aúT(Qú¤ÒIò³ÏDÚ!…n˜‡>e°T¹4`^ TQOµ!VXÅ¡ËÐbP‹Ôzì#>Ú’¬îŒS¡J†zØ¡Éhƒ‰ÚÚ®}iÚ‰¢S¶Ü¢A2Öb˜H¾‰¶­ÁÛÍ€dÖÛp€3Y·$Û”G{ïÅ7_}÷ÍÑJ`h‚VC›(4КrÊD )к„6Ðv¸A®Ãõ#  ÀVÚz˜*¨¦> LNlj"à`ÉÛ"x€†¨œO*éâY¡ > è¨z¥©m›ªÊ½¬V>ú«•ŸFêJXùÿ0©ëš:͹ªFú¥Ç¾Ž:ì«Ç»l~ÏF;mµ×öʈpC7Œ\uIÔ*¡‡¿>ʦÀaÇž<¡p–u2J㌵.ó7ÐÉOލ@$˜îWœ$Á¤¨Œõ©be0ú£¦wDŒh¶…JÔ±mO¿ê\lk+áèi³½Ú¦­åouß>xái4àÜ œk¬àà¾JÀ@†¢ùá0ãú€.§"È[€Ÿxà†<ÇÔX üŠuÌGk>ºaƒ2ÆIžCý¦0E>r@è~°Á·¸«ˆÏ€¸ZÜð|÷¤YK[B‘]t²åÀkÉv Ä`5¸Á|!`ÿ¼ŠˆVE9üÀ ·Êò´Iôà'VøÈ&+D ™ÜEX&¨g%`àG @©V¤!#:&!¦_($8Ð Ù8¨¶¨Î+4]í ¸EÜuÑtScÅ8F¬<„ pÔñ+u!!ñ‚¤1ŽgEæÐF6 `!…ŒCÐÁ>šìG,HA ˜‚  åP¤|B!= ÃkŽÊÌG D€ À0à•‚”‰ŒRš½‚ÈØ9P‹§„e,e9Ë« ºHG(p‹ÔQÌ€&@p Á|É7øLn|dJ<‡˜LWƒ’•c2€ÿÝŠ•<¡StwªÁõÐè-!©AwP`EXÆ  ÃÚà«rAZÖÓž÷Ü rŠÄý¡p€QÈq!õ¼„DÛÉ0ª‘FgôQY™²à…`çIìš@µ@D¼˜D.ïó‘põ@œAzÉõi$v’QZ/횎Z»WJ…žøÄiNuжE pÀ§~ kx p C(ä00Óø‘p@Å- | d ƒ•¥Ë)€–Õ áúÖS”ðé0'¦´D øâYÓÖÕ®wM›-?¢7$• (!‚PªñÍ(D ñ¥Îa³h­d€ÿ:”MX|ûˆp kVµò)Æ`-£„Iî}Å,Sx‡[É6*´eo|å;ߨ܀ðÀ¹d …`ujÐ(¼"0Òœä§Á4"ü5ÐhÆ…t€WvÀeƒ T .u.Û‚°DA¬1â[éË•’èà/~±àT<Á›®ØÆ7Îi ¤‰Öxmv½âk$#µÜ`õ‚€ÿhd¡Ü€»^e”=<ΰM± ŽNW:}qÙ*5F¥Nn€Æ”9Çœ |q¼f6ߪƒÀ¨RУ¡µ6((r­Â5¤¼Ùv¹´Á#d GtÕ ˜kÄ!˜\%;×BrT` ƒ0#ßÀ´9ªa”–ª¹ÍŸµ;<‘›Î-08ÁÅ£ „K2mJ$gR`– ŒàõÒ"ØäÆèúZ¥6u”2¾ àzƆ Ò>pŒ’`! ÛŸ½xº£TNÑa£/“ ‘@vB6R~€uüÃÜæÞ‡Ò H×P·ÛÝœtT°$º‘”3))&ì £iÿ&ŒÌ`ÿ‡¼[Á¶ê´7kM=œ-¹Ó‰ô{¾ERƧRÚÈe[Ôb\ )e"Òjt¤i¦/~¤°BYA Ô †ÐvÿyJ zLÉ2LüX1ètЃ˜ãû@º?èqN³ûÝO‡ºÚÜV¥·ìüc+Òa-ì"Rð¥'A­Ã¾|B Ø7_¥¤*@O/‘a’cC+Í';Œ©ùD$²¢OM$%’£ÃFð› 8…Ñ]»@±eð“Ôgçi„BdÂèÄ—`ND‘ɶž½•@h$èU©:på8ÇZ1ßÖi„¢z À0±^‹ð€x`è8º?üñz|ÿï½Nzð…/ä@v8„"±¾dížoÁGR±u…D" XÂ&þ‚vĈ hç«#q(ÿ1A!úVˆ¼Žœé¤Àø˜ƒ¶óN¢  AZ!W‰”Fq‚ h‚—p‚ÏSˆ* y Ú€…È5ü‰@…p¡À!Hàh …H$‰¼TñÀU XÀè 4p…¸†Áš- Єg8†j`…À½}Ð=Þc:›¾á3Â# hRShÂñ¿0Pà‹\…`ÆXØBÆ8…@¡P6(‚]`B¿-í›>ÿ U°ƒYè…a À„Y@¿ûHí³„·Ð¤ÍÖè  #‰ôÀ< ?àUé ©…à?ø:A|ƒ8G¨@¡˜Ä—h)¸CüˆA‰<…‚ 0”;x‰;PYœE…p C bøˆ@­Ø¸…x`MH"0: ܽÞK³"DÂftƬx?…°íK‚-ˆ…X>€ëSˆM8CÈ mDŒ"X…9KpÂXlT¿˜9nü…ø£…ˆ´k·+HHWLƒ4 @ðŸà‘€*`ij'ȃ –&pDÿ\ƒÅ¨™¸¢P½ €|‰<?˜Aÿ9î²PƒÐOœÅDT¨ßˬ— €z¹[úª †^ø†ÜKÆ!ü=E{ƤTJ0€‚z ShCðô9ü¾0…ÜCº¹Æ³Ë€M„" …3PUØÆh…ù3G.$‹LøƸGȈ˜‚&LÇ%I“Ph # ¡ƒ`˜DS¼¿€7Å °º§H`t'F¸ Õs1ù ÊL|‰Ø ppÀ Ø < ±D׉ÈÜX:¡)™e€b)N¹¥ÿm@i†¡DFÞÃIÑaÆ¥dN¥tÊô6XÃÍ0Ç"€]Χó#Ë/üPH2¤…O¿µPèÎhlÂu!ã…èó‰º ÃÒ…2à€èy6ð¢È ë' EXEU±Ä \0ìAPþ¸È@ðÄ'{ ”TˆTÔ…‚G˜Ðtš9ˆÉÙô…˜AUÁŽÖH¥ú§z ¦º…u€0‡P0Î \ºcÓæRæ€0>4…CÀ´C»H€X¾+ x‰Tð…Y0;6ˆ 6RxqOUà 7\Gà€"ˆÊz ÿ³H…7<ƒ HR0…tdlc€ТX#ÍX°€È»  T€œEïb CŒ¼ ôƒ*8š xƒõ= È×ÉÅìÐ8ˆ1ðK¬$Ê 5x`Ù̃—hÐÃLV kkௗøEV`‡il¸=¢DÎeDÊ Ö§3H‚"ÓíÔ!&Sð>©¬Ëm| NÑ!ë|ÃP¾90;P…0< 0 &`‚úH…®¤›Èµðë|î`W])•'ɯÛq¢ §Ø@…¨-į•PÌn«ºX D?iPŒº‘ ÿ°,{0M…xPp:ƒpÉ0”#;DqÄp@ 8†ê "¦ÒkÀ‚S8̽}B¥`Ö ý´° X@´X*³à °<P»üR;µ úûˆñó1•δàŒнÊãû˜y㙉Ÿ½HOš²(Øp€‹€ª!‰Í ·hÁ8Œ ÇTˆU…[¸ ð€Àœˆ(` — ÈÔÀ ¸Œˆ x» úx`5ÈëøiQ™øCˆéø‰ÝX9ƒŠè)n€èP‡Ø=s«‡ä\7 Úÿß]3¡K"¶¢»¹›ÚAއ @„{Ù鸻Ù¡x?Ĉ•è-Z‚"È&ˆ" €ÞI) „ Tã*R»ûœw™”¨·K•Êœ–“R” L(DZ‘˜·£¢]¹ÛÁ0à—pDBiy¶Êš!à~ ;Sÿ•°Ài‰Þ©((pØHl¨‡y n‡õê]àeá§#Z`’s¡ª)XèŽh00´ëe««ÃÒ™Žsá Ê-ÆÃŒØhšî Ï©ŽÛiAµ)–[PÙŒ2‰yâɽ\’ˆ•ÁÛ;@µPà‰` ÿá(X2€y Üd){kà%“¸0¤¨ãD²¼]I‘bÐ㯉½lŠðˆ Pä ¨Ê%BßmáHf¯])µ–ã"dË5˜@vB µ -kÛ¢jû¢×š'Îx‰p ?ѹmú"Qö±Ç£Œs/¡` ¹ðä^óĨ8ª¨"ß2“­ æyZNI6æø"ó5Üée{/@3X¾dm›-­ð2g¶äFãšf†æ/û5¬ åºØ²c© ° š™úÙcVgÛtPVòf๠w6çoÖ)O[ç|¶­d¶g}Æ-|öç€Þ©vhùè‚FhZâgnNèº:膆h2"èÿˆÆ«‡¦è‹Ö …öYŒŽ%‹æèž‰iœòè‘6é´¹†>iX*é•vé|Ù•Uzi–.æ™¶i•¾i jéöé°@Éùi1êé¡6j­Èiz>j¶)ê¥vê©j¥~êµiê©¶êH꫞ªÖ꩎ê®V ®ë¥Îê±ö±6ë¡þê´þ´fë.ë·N·–ë™^ëºVºÆë•Vf©ÞëÑë¿i‘l~ ìÂÆhökľ¢šfì›&ìǾ—Öì†VìÊæÊÆl„ŽìÍÎÍöl¾ìоÐ&í|îìÓ¦ÓVmcíÖ Ö†íHNíÙî Ù¶màíëÜnlÿHæm¾ëßf%Çn„Žëâ¦)ßFîuîåNnçþèã†îGžnŒnîê¦nìŽhéÖnënˆ¾îïönñ6î9^ìâÆmò6 Vï£loænñNï÷ŽºÚVïù¦ïwKi®nüÎow³oòöïÿµ×nï'ðO pù&îoN¿ïwpæ\ðïFð ¿1p Çð¤¬ðî¾ð§¯ý>oáqŸ¯˜vðGñøŠo çð?BöNp—ñÛzqñ¾ðŽpåæñ¨Ëqí¶ñ ¿+ßp 7òwrì.ò%ß)$gp%‡òPkòþÞñ*o7)‡q*×ò6Ûmú~ò/¿§'òÿ,'s6Óð)Os—«Gó6Ïð0ï1—sY2s'ó;§¯5ïr>GÂ<Çr/td¦óßóB/AŸn;Wt1:ôô•GnGŸô)ºòFOôL¯-.×qB÷t¼ÚtèÆôQÏ P?sQGõº*uç>õVU×sV—õœzõåŽõ['ð]çußÉõKïô`Ç'F7õb7öz"ñüöeWd‡ue‡vYòóP¯vv~ó_§öl?¥k_uo·1i×õnw1÷Z?÷ßöÿ~öu¿—fss‡÷)"wb·õz£aGoz×w òuw÷÷Ç ~7ñ'øY¯t8Ï÷„× ƒÿíÿwwø¡õAŸxR7ogGø‹÷Šçô†çxáxÞ–ø Ov7ù߉ô$_yº÷~Wù—_›t·xš?öv×ø™Çy´±ùïù2×ùyçù ß—ŸOy£gö¡¯óWú{Aúi/ú§Ç—˜?ø©§z{iy6ÏzXBy©ïzXùÜ.ù°Š¯/w¬7{{Û.ûµß…çvµ‡ûiûÙ~ûº¯I¹xº×{°¸{ØÎ{½øÿ{MÏx¢?|²úˆwúÅ÷ yoz¿‡ü­h|’üÊߊ¨O{ÍÇ Ë'ûÌ÷|¬à||ýá}·ýÓ¯ŠÒ—yÖi¦Gtʇ}©üÙ¯ýßI}ÿ¼_ýÜŠÀoíÁ¯ûÂW|ßgàWmá‡{´7}ã_ä?må_{æ}çWè'mé7{ê¿zë¿þÄŸ|ïOîw|Úÿ‰Si—?~Ù}Áï}ñwýî_ÿ}iÿàïÿòŸú—}I,hð „ 2lèð!Ĉ'R¬hñ"ÆŒ!’À!@†€G’,iò$ʉ2J€Léò%̘2gÒ¬©ÑÆ ‘6wòìéóàÊ–?‡-jô(Ò„?†Lêô)ÔA£R­jõ*Vœ:±ríúrª×°bÇ’½èäÖ²j×eÉö-ܸWUܰ‘V.^±`óòíë&hÿ†º·0âÿÄŠÒµ»øñÐÃ'SîxpåÌ.%kîìÙk㻟GcäLú4ꢗ›¦nýÐ´ëØ²]†žm;!ìÛºwO\-šwëÜÀ‡7ظømáÈ—óöÍ<µòçÒcã¼1=¸ÛëÚmÛ8Ëz»æèàÇWÖJþ³øóê/żþqú÷òùšŸ?9¾ýükÛ×ÿ¿†UŸ€…X ‚Tñ÷[‚lØ „H!^RxaOÝ1Å †aYØ!ˆ3M¢Z’x"JΡ¨Wv+ºØÓq/Že¢Œ5R¤¢Vј# ÕÖãU;9¤A8™”Gù£’O%Ù$FBIÔ“SæÈ¤•FU™¥ŒRrÉÓ–_®¨B`ŠYS˜gª¹¦Ff²yd@!ù ,! MËÿH° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç Cn ²¤É“(Sª\ɲ¥Ë—0cR@R¦Í›8sêÜɳ§ÏŸiÖJ´¨Ñ£H“*]Ê´©Ó§P£JJµªÕ«X³jÝʵ«×¯`ÊK¶¬Ù³hÓª]˶­Û·pãÊK·®Ý»xóêÝË·¯ß¿€ L¸°áÈ+^̸±ãÇsÂ;¹²åË"åaÞ̹³çÏ CO'º´éÈ¥N«^ͺµë×°cËžM»¶íÛ¸sëÞÍ»·ïßÀƒ N¼¸ñãÈ“+_μ¹óçУKŸN½ºõëØ³kßν»÷ïàËÿO¾¼ùóèÓ«_Ͼ½û÷ðãËŸO¿¾ýûøóëßÏ¿¿ÿÿ(à€hà&¨à‚ 6èàƒF(á„Vhá…f¨á†vèᇠ†(âˆ$–hâ‰(¦¨âŠ,¶èâ‹0Æ(ãŒ4Öhã8æ¨ãŽ<öèã@)äDiä‘H&©ä’LrDJ“!¦ð !@é! Vf©å–\véå—`†)æ˜d–iæ™h¦©æšl¶éæ›pÆ)çœtÖiçxæ©çž|öé矀*è „j衈&ªè¢Œ6êè£F*餔Vj饘fªé¦œvêé§ †*ꨤ–jꩨ¦ªêª¬¶êê«°Æÿ*무Öj«_2ë­¼íÊëo%äê미ÉP±¼«+²¸ÕñÌâÖA 1,íµØf«í¶Üvëí·à†+î¸ä–kî¹è¦«îºì¶ëî»ðÆ+ï¼ôÖkï½ø &¬µù"ì¿ý&fìÀü<Ø¿Æ|ؾÆÄð@ûV[­Â€ù:1Ÿêúï³2ÄðÃ=€²7`\×À—ð¬´ì²;p±Éq¡ll 2t…9ß”óÍ7éôÂ@4×õìÑ%Üÿ4í´4üpCÃE³Õƒ Æö@­ ”±Ï×_ÿóL@È€ƒÌU»•0x  1Ü0@þÔíÏ>bG}ÃÌi¯ëEM)(ñŒÑÌ)ûØw4ü€vßl¹"p̧˜£‡ÝwçM4äm50À4Ç Ë6H3Œÿ(þ㎃îV4Í$ Ä7¥€cÝ®ý¹ìk=PÎ-D@L;Ï0 ç‹7<[ß\“Ãx!O),ß{¿?ŸÖ$àÀ€&å±ôÝwãýŒóÞ«¥2 ìÓË0ítÓ°óÝ>Y“ ˆ" ÀÁÂ@°ˈÚþÒb¬@ ; .pTÐxx‰•`SSYÒâ7”LKèö¸²Ebhƒá£!ù ,íÀÿ(C@A1$ÈРÆJx°„ ‹%n”èÁqG?.tx±d  ¨\Y¢¡I“= K÷í[¹rߎx©c ‹=XûG´¨ ;dܸ1†  ˜öoŸU«PDÜÀ#!ŒnlHÐ`ÃjUý©Ýg…W†Ïä(4ÍZ¯ÕÒ®…¡ëÀRèvXI7L“99Òôúc‹a)ÃbŽ™ƒrCZ³ÄûÔ.æËs›œÇØI«–ífÍŒÄÐàÖ· ˆ$@›yo߆vlxn7=Tk/¶Ò¸!'0\:¥©íÚû83l€FpúÏ_Q|U=D~FDD«7žûyJn3ly¢F .DÐÁB <‰d_ ?á ” \-ÕRDÄ A$AÈP€!ù ,¤!ù ,ñÀÿ(P†ƒ1L¨°!Aƒ:ÐŒW/A Ãh xãÄ ‹jT@ vYq:ë¨ëŠ„áPÀ—4RÄ@ðIO¨¿í´/TzºŽëèɧWÏUˆ]R|qáBÿPÀBG½Ò 7à²ÔAFD C:¸P@!ù ,¤!ù ,Àÿ(C@Á‚ÄHÈ!Bƒ JlH°„ ‹%hüØH¤44ˆñ" 0 @/d,x±f‰&¡û6®Ü·t“"Ô ÁcŒ1v$èõ¯©Ó^ z4¬‰cÇŽ týÛ·Ïß¾º耡°âÅh(ÐÚÕ+Ø;ZpÄ‘fĤ-Spk«?··Ä5Ã.»iT°+å×­®¨ /Þà äœ"§ªõmû5ð`’2ATvS T6¶¿>–*pîd%é‚P&íTã΂iZ,¬Ä'5uus~ËZîëršB¹9°™+îÏ5y§Ó3 ­þšf_™ä=Gdü7`pªÞ¹`€8ØC€:( Lûµ`€cÈõ~”XX-”¦ «Pà³àÉ`"cGƒiÁ(´yôAkÍt¨XPmØ…Ûÿ û •´äXÑ1 ùcÁ¾ 6à4?|Gûç/é> ѢŽÔ§Õ›7=y@3DX"Œ$À°H`vtQP%Ä$ƒSSAµP‚*äR…ex!†!ù , È!P Ž‚KX@`˜gØ6,Q¸‚!ù , Àÿ(@FA‚cP¨á@† „H°aÄ‚%b”±ñaŒ;~ô9‡Ã…Sr2†Œ Ä0ÀƒI…{ÜàÇ •w4Еî[9£æ¬p0yƒƒ€6vX€á'Ï=Dûǵ«ž 7jqfMS;š)аsÇF" œýÛGwŸ?9LèJ  †É©€cjŒ<›ë¯ñ] 2,FÓ´@¶hnþê‰ÖãA±PÍ;–ÁäÀ6P6Q”®T„¨Ó¤.Eh»£)X Å ¶…rcÃkë&)ݘ´izœ¸¡#\( 9t4˜ÖJ€Å¸›ë³&؀ʼn ²) #ð´cÖÈ ·4Á;8ôŠÖÎZ±#¡¨ã…ßà sw7PJ“°Ê)¥üP†t`·9Vßs ÁC 8Ð$lð2èÀVþtõ  7P§ƒ7Àp:ö@1õÌCô|AÁ !IG9ê@ ¨Ã $tW^ÙA ¡¤Ñ—±Ô (ÖÙIItš4Q—¡9P@!ù ,&Èb .hÐ@‡ÀR¸&0 !ù ,À.,ÿH° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹eШ£Ç CŠI²¤I„ v<ɲ¥Ë—0c’”Q‚¦Íš5eêÜɳ§Ï™8oÚÜø³¨Ñ£Hw 4©Ó§P£JäÈtéJ©X³jEŽªM jØJ¶¬Y“"|µZ“ÀK·îÄ^jÁ^˜Ê®ß¿€¤ÃR3Xn¸±ã­z"ì`Ûñ@‹Ç˜3C="£G ÃK nÒLºôÎjdÜÐ+Ѐg>Ù1M»¶InËÈ`;p…À%¶ƒ ÇHBÉ$ «¶ÑÁ† c‡KŸÞÃÕÉo´Æ ß1¨‹ÿOÆ×ìaç(òð©ÃøÌ1 'P”sŽâ @x;x52àpC| ÚEYA%Ür £€ C ô@ ”¡ tÐà‰t¥t 0è°À3Í0 ƒJp…x ‚&¡„1PÆ…¢Ä{(‰Õ^Eˆæ”A ß°À/Ø`pÂ3ÖTó p° 7Ï`£‰ZF–Y— :4ÀL4 °À7§ ‹5h±!°C l3ô`æ sÁæÈ± l#e/Õpp3ßXS íasK.Hè§Z¥YÌ4 Ü@ÛÄ )$p„.ëhÿÖ°§ æ*U=˜3‰;ÔÐÀ3ÓñÍ6u3 +é„ßèRª®ÔBÅÀ2Ö(°ƒžXÍ3ÄSËTCM(à€A3šPHïV¯@óþT¯B÷”/AûÂ[P¿QŠø&P 8àÀu Ø@‡5À€òreÀ“ƒ ?ôÐqÇš†€`½ X €)°ÐCÈî0B'^Íÿ¨óÍ:ãÛ3K0<„«A<-€ $ÐÐ3Î(ï»ñµÔÈt]=,èÝ»/¼€C 4€­‘ êÀâ !„`pÏ6Ü@öΉÍs '-Ñ 0ÜP÷@øÿ³@ò›s¾~5`Ë)”@B ‡p²@Þ9oÚ+ìÝ´¾,¸BÈÞ °BÚië+@ Üà\äCHC„¬ƒN:è ³N) lœsyýBØ4È@hptu{ð¸çß t/¬­3ïát¿s ”7 }hùAá•p 5,¯ß…Ã=Ð Txp ‚ ô9xïAd?¾'ƒq qèN6¾ ‘ÃÁ@`»ô€§ø‡'(Œôàjg9À tà•lë*8„À°ÀBÈD4—œà2øñJH°øà lð BЂàÀ:HÁÉÿrƒ¢@+øá¾„¸­„ dAlÀá‡qŒ3H j† Œ€1ÁBp° m' "ÌÈÁ”¥ mzc†Ð ¨@<ƒH`F„€‰s#ØjpF²@2âX„ísŒÛwԆĥ @È ÐÆ‚1þ± R¸AËpð=ˆ!¤È Šìã•ûøÇ/,ø³Ç ÁËåd ‚ O/è’„‹8d`¤ð%n¼Ø #¨@H±‰LŒÂ˜€2LQ¾Á ¡ÃM î9èf V nfà'ó@6ƒÅ¥¬ 5¸@èÀÿ‚ làÿÜ@ ü @ôŸèÀ þ‰6‚Zà w`Á8„F8Á àúx¡`ÜF7` ”.@h R0‚ \à7 ÉK?ðµ^ ¤!Á(®Ò èÀ@½0g(~:ÛAJñ85–ÁH@3s€P‚•ˆÃ&’À,lâ–B NP"lÀ&FqˆMDaQøÄX0Š)x€qЀ@l"‘¨D43|"LÐk&æàLAy{›@àƒ@ŒÂØ Á¾~à§ÐÂVàl';SÃE›08a U°Ak70ÿTc¸Æ„ \a !xnC0†;Üá `X ±Û+ô`™NPoIÀÿ @¸Àk«†&¸)¹CxÀ)¤! C Á†ð†4\á¯j4‚!ŒA Uè{ópÜ*D@Ø †4’¡‚ž¥‰©ûxê?‚Q€Ôò1- Å(P1aKd`Œ@*>1-ÔŸ 2°‰Y8BŸÐÀjaìâ S¸æ(F¡Š8ø ¤˜-14Ôš©(‚f‘Š@Äâ¥ÁòÌ)‚H˜X›Ð€b± 6P¢"æñ‹ì C0‚D]€ƒŒÀoègî0?Œ!ÿ.¸Bx„G8ÁwÈÚß@'ðÀs  +t€M0Þ@IB~ N¸€ª #Ðawÿà ,ºæÜ€c°€üº à p:¸€¨h>à‡+l€i°ª½{è0÷¡y‚ -j‹ZÀCDYÀ\^ jhq]F_à à\À‚X Ó@Ÿ®qŽi”¡2x×]©`;ƒfyv´1¼‰¤"Œ…)|€ S SÄøÄ(2` Sœ` ´˜‚ÔÍK Ã ˆCf‘ÖC˜B£Å„Š9t@ gÃ*„ Lìb•È@j± œaoB$¿1v ÐA‚ r'€a8Øšp‚ ÚäC˜óÆ`h0\`?¥@ÿ@ý€IÃü.ð­ÏKô;8a¨Â˺èDgº~è\Ѓ§áFP,@c@Àíu=jv¾•­uµ6iýô/`'ðS )tÇ@ ã@0slMÕwÌfÏvÒÆ™ »° ©Ð:&làm £ •×L oS° 7 -ðU¨ÐW¹ B aà«Àh Sàª@ Bð ‹ÇBÀQP/­ð >ð °àEÀ¹€ DÀ r@+Ð@$•>ÛwP]Ø—ApFà0ßGw^Ú'k~i=ÿpv‰èË—N yp)w4wà}löPv†sU j¸U &vFC/ЀýägMð<0€sNðFàðci u900Ö0 `;{—`ʶ` ö`Ža±aŽð $f ™` ©`†¤€b"&à&˜7ð «° »À6€WàD I    ç&e @ ³pà­0 ° b"pGKvGS` ¹ +´„¦` £ðX#°e]VŸ³5 ëås$ Ö÷ÿ‡j½ÅÇ‹:@iwàU0€'†àæ1RgjÐå! h­ö„˜_<ÿ1§uoðã%}~`£.Ðf’æÈ (D.Ðiy h$Ð`•j$@ªx‰p Õ à@ V€²T%¸ŒQÕl¤KàB`†ÕQ°E:`CIày) ÷E°wäL ˜> Q€ ›pŸB0 [PBPìäƒBÐ%>Ðz>‚&A£”5˜æt‚¹—±z&‚O¾U$<A“;@(W,ph°y20™i½ctk.Ì'$àÌ?5À|À|0itæ%ðÎ À?$̧4™ÿÃíõðCg:'+A€•qè0PË@ 7Ð#ÉØw´xf!% ùc¡<* 1  °< / ÿ¨WllÐK@ h æ¾! 0`C°×M ÁN ËS ¸?ï‚>ê••ÕùW ÐzX4 ]ð<ð' 3v˜>ì?>4‘¤çƒ‡%Ài†ð&5 3Ú4LjàØ¢‘R/z3è“>çc@ÁŠ ©Á3=Ð4A$ 'X%ð+°nóžd£áá6n³§&Y¥ó6'Ð" éôy‰zª3}½š2oÙ66“§ï’§Cs©ƒ2ïc5A×)@2°œ¤C]È91Ð1‘‘JW‘J쑪2@œAÀò.W¨*èY#ð82p«®ª¬z=°'q  ô ó0ò@·À‚⟠‚&h2 L ‘eÒ®yZ;ó¢=#£ÜÊœP> ‘RHU1Y”3Ðîú®p©º’/òZ‹Úc«¢ƒ2$±­£ãÔ£'8P R¯!ù ,¤!ù ,¤!ù ,¤!ù ,¤!ù ,¤!ù ,ßÚP c À‚Ê(±°!ÄJtX!ʼn ^Ü8#G=b4(’"Á%’LÙðdD–%V–|òåL™,]Â\ˆ³$Áƒ6M&D™q`@!ù ,¤!ù ,¤!ù ,¤!ù ,¤!ù ,¤!ù ,ßÚµc À‚Æñ£GÆ8”±a@‹/DDƒFBëÐ¥C‡n]©; ö`pêŸË— ô@(àFƒPÿöéÜ÷ï—L‚w4(õÏŸQžÁ¤¨chΣÿ‚øT€P¢Fý!MÐÃ`S¢û J¥#¨Ó¬[»2uVkÔ©U¯ËÕ+[±?Ë èÑ åK—Âê¼A=yóæÉ£w‹AWŽ<4˜Là ‰AqìÐŒãòÀ€!ù ,¤!ù ,¤!ù ,¤!ù ,¤!ù ,¤!ù ,ßÚP c À‚Ê(±°!ÄJtX!ʼn ^Ü8#G=b4(’"Á%’LÙðdD–%V–|òåL™,]Â\ˆ³$Áƒ6M&D™q`@!ù ,¤!ù ,¤!ù ,¤!ù ,¤!ù ,¤!ù ,ßÚµc À‚Æñ£GÆ8”±a@‹/DDƒFBëÐ¥C‡n]©; ö`pêŸË— ô@(àFƒPÿöéÜ÷ï—L‚w4(õÏŸQžÁ¤¨chΣÿ‚øT€P¢Fý!MÐÃ`S¢û J¥#¨Ó¬[»2uVkÔ©U¯ËÕ+[±?Ë èÑ åK—Âê¼A=yóæÉ£w‹AWŽ<4˜Là ‰AqìÐŒãòÀ€!ù ,¤!ù ,¤!ù ,¤!ù ,¤!ù ,¤!ù ,ßÚÿ c À‚1&4x°„ ‡{ôø1q"Ç!â``@ fÌØƒÁ³uèÒ©äB$Ä%nü°îŸM›ûHX±F ;ˆ @÷oŸQôZ$ƒƒ :$ ºÏŸ¿I –À!T4eÖnHWÔê¿zJ ÊÀáà–¼SŠÒ)1WvÖZw4е-Bi½¾•½Šö Á zm[À@š0ÁUífXBï­ua(  Ù*R†e܈ÀŠÝ´rÕ P5K/e½º¬A %”¬Ñª“Õ"îÅ­@Ôý»j³0e ”„Ý#A5zò¢Ï[§44 %`ŽnÐÀw —Ê ó!;У!ù ,æÚÿ(c`Á"ÈPF ‡{ü(ñÆB‚3Êè0 ã€"XÄ±Ž VЩLgŽÝ/8fŒQ"†Œ nþéÜ)-À8öpxƒBû’îû÷l@ "}ŒeþùÛº4Ú€ŸX=€" K„#ÏNíÛŠ”©ÓRÐéiÀmXSßä°m묀dX+@-˜­\Ý>mð¬ƒ#ßNq³¢eoׯ.”»E!±vÏèe»´éSÔJ”aE^©£÷¨Ä ¥¾‰ 7i[ÓM– ¶N×rvjý' 3ŽªõÈÙP4ÌÞÀ8€Ú¿}P¡5z£Äƒ ;*0h°¡éS`÷Aáðˆ49 QÃö €Ó}`ý‰Å`T ¹aÐýRdδ¯aÇ>œF ±sZ”Hc °Ü©Ý 8¶.5k¥¦9Kv ¬¾uXp„ÁÛ¸së p°ƒ„³qÓ¾éÑ 7pg?HÜ ÁAO)=^á ‡, Ž9jh%ÀZP þ L ã K4£'o^wycBTI1F…УïpâÊ„;pÄ?0 !ù ,¤!ù ,ðÚÿ(@FÁƒcP¨ A% BŒQâG‹w8(1b Š0ˆÙ@£Ã()–ÈQ.]:tèÖ-[`r`GЉøûÇ“§¹=°CG‰:vìÀqâG=û¢þã6à‡0ˆãF\òÔÔ߀ X0I`/ †-kFÍ ²g©Z]sN€p¥ HKg¥™5x÷M@@9H¢Q íXEáŽ$F[Õ!µ_ *Ðô ÊfªA€;qõˆÑ“À™6›·³@r¶J0Ùhr³÷ÕÊZ@(9;@„±ÂáH§P¥êÐBF„"VàñÁÅl(À ¨p‘!Ä(wDд]ºtèÖ…z°C`Aˆ%$ ð#¯@ƒöJPÓ¡Œ DÇ*BVÿöù۷=ljüa%³ nEõ7Õ*ƒ¢eÈHðLYb¥–½šÕ F¢)kà@ר¹gİ«6ï2¾~åV¥{c£C ¢CüwqàŒc@níc\²‹±âˆÑá „Ìq›tª²ÙšZKcÐrêTªT­bM˜¹Ž ø êO7li}÷hPŠž¼yòäÑ;Å ®MÂc€à˽‡ j $½Gùòà!ù ,Ûÿ(!ƒ Á=~$D(P Á‚q00 Å8ÊÀQ"FG=D[‡.]:uØ6dÜb =´ûG“f½ 2b4èQ"‡O? ¬û·¯¨¿yn(ÐCÆ  €H0tŸ¿}ÿèMˆ±´)]ب… 0ÔŸÙ¬2&R¡ÔºRÃÔPGôì< 2–*)ðìÙàN¥«ë­Z ¤1{À›.t„³âƒbß @Y'g°ÕÂôÒ ØvÊlÛÊIPõªä¼ÂtðÐC“¢B‰'šA…œ%DèQ`fM´yoÜècÈÜèÉ›>O…Œ.]ވРƒî Ènpóè!ù ,Ûÿ(PF ƒÆÇœˆð E e8P€#lj*м(ÇŽÊÖ¡KÇÒcX”92ääþéÔéˆ1dôØ£M;n4¹ãÇlÿöù“ZH†%"4pPá†Q P(Q"lƒ Jõ篪‡%0 Ôa]Ö¬éâp¤X^V¶EeÛVÉU …¥Ó’€•:V§tÉ€rKO¨tJ¬ fëV`4pû5À± ô¸pKZ4všªmn{¤ƒ’š9`mXpºôhÑà–9MZÀ…’½v*Ÿ Ž X @]¨͸U8á%Á2i¬°|»Äœp½Úäf.ÚP¬qÃÆ¬‚nÏžÁ‹={ßsD‚vé0‰&JÄP¥”jíCz7dQQ`PˆÚ7;éäßOYtà ;Ä Ó‰% =òÄ8O;?ÀÒH¤b[õ¸HáR&)P@!ù ,"Ûÿ,ƒ Á="Ü!P  ) Ê(Q¢@8`(0 ;vô‚ˆ¹t(Ñ­;¶ ‡Ã9"0pЕ8sb ð#†%–mcÖ ”}ûü!ýGmÀRȀŒ[£Iý)ýWm€K§4ì`p ›¬Z·Zs*ð¡ tas€Vë>®^H[wëB¹ vM{wíS+ÚtQ€ÐËšƒíâýÊ7†Så@P’U-[ítE8AÄÚ8aG:ßíúÕ 78 ¥‡³Ò¥]Ÿ àÀabì  øË9Ûg7JøÆQB‰¼çÏé9+ {¢uƒ%hw Â†®O ,¸Gùò8!ù ,#Ûÿ8PF ƒôø±p¡€#"øV@ƒ3F›–ïÀ ¾5 @±ìÄzÙøØ™%ç­ì• ’RŠ8L¬‰XiÓÅ{ ˆ0Q†Ñ›jsZŽxCäìÇèÉ[.o^™ m Bí]âF… doPâ!HÓëVDZƒüzuê©D b0#á >Œ…•*ƒeÈàP°W%X”Ðq`nYªh’\+pØ1XÔÈQ˜¬T»x ¨ae0܈\ËfÑD(@ ‘§Ô…áB/"bQcXB¤rÙ‹ð£Á°yD ¾|–(k“B).EÏŽÜû²›½[ÐhAÀ1Jp7ˆÐ£À0 @«¦­˜saŒ;°¢'ož$4¹ãÆåèÉ[OÏœƒé5Ç?ìÛ Áuû‘b|ŒcGÿþ!ù ,CÚÿH°àÀ £DÆ îøÑƒ"ň –ˆ¡QÆA @²À@eÈÐÁ2 cì`Ðl9tèÒq»‘0aC < áÒ¡€Òý[ºt_Ž+ĨыZ5^j½±ã@¹ûÂú«—£g„Hœõºµî—ƒPo 5÷ÏŸÝõ^(Œp£žQkpãÜt÷ÝÍ;ðŽ;tP7LA¨0Ž »˜T|eÌ\†­ƒ sÙ¬Ø^oàhðËÜ%^ÐØpHÄvÇr¨@Vå 8(ACk©R |mýz µI=Ü¥£öØÈqdƒ¸Ýz †‚²C¦P¥äÀàX¦Œé`ÅÖ#Ø C‰ HÁF%T@Á(ÅX|— \qÓF2à°CÔÐ#φó°SÐC}&P 1PЀ'žhˆƒhZÈ“@!ù ,Qä @°@@!ù ,OÚÿ(C@Á\(°DŒ2–øÑƒ"Å @Ü#â€Bp€ƒ Ä;vôèJº—èЭ ¶ ‡I0hà Ì¿Ÿ@©øF‰~m³vM”}P¡þ‹6àGC0&P“¦ˆ+þÂúÛ÷OZU0NÜp0í‘ ˆ[öìÃ/8,3WbÉšµ)ÇÑPŽœ FMÉ\Ág1P¸âÆ„ B}“³/p]›)ÄpQfiÖ{6kU ?®ë[ÊãÏ;DÔ¢I“’a Ž…ÜÚ Ä ”ÀਿÓÎ6ŒxãÆŽ¬Ì“Ç]½eŠG/±DƒóÉLfH>âÃ8àÃ/)0 !ù ,¤!ù ,¤!ù ,ÚUÿH° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3&”¡±£Ç CŠI²$HŽ2J¤\i²¥Ë—0cÊœù0e •8YÒÜɳ§ÏŸ@wè€q£ÄÍ•**]Ê´©S‡ 6EJõ©Õ«X³¾ E!‡ÑœIµŠK¶¬C-NPÅi¶­Û·X7@ˆqâkU¸xóêÙ†‚޵)÷ LØ£µ=ìæ,̸±c†æ~œ˜ ö±åËŽ±9ØV'æÏ#¡€6Ià À%$a2oê‰+t„pL‡‡1:è…ÍŠ€%v´žx„BŒ£'Џ B ‡s®r, "÷D &é œ pVÖÿhàÃp‰ d _1· BÈqCÀô„2\%q#…}1¤À‚¹±@C}$YçÂ$@DƒÁðÛ÷(@ @œr‹&†…çAt\g‹Mt‚œ( /‡›…´ Â€ð½Hu冣@;>´Â©éˆ 6 x¡y꽈#ŽÚ£…8n @R”p[A=êh‚öÅÀ8¼¸Ã§üãÏ?hþ#L„èJ$Vhƒ*ܰ—7eá *ä„‘Ä 5ò)+p¤A9<[1¬@ |’îYgÕ¹B¥ØÉ¥‹ „ %¤Pƒ §ÊÀ‘¤ª P § ÿôj à0 =œC AaÃtõé*ª÷ë°4 já±õÆ&ާÒj8p¹J\9 „òÏ>þø³Ï?Á$ðƒ›oÚ—Ü@Ä ˆ A '¼ Á¾*ÕBBäÂF "Âr7Ø›b L6Ç(£Ä‚ õîkC )è«,èkï/ ¤‚|€*¤0Á¼°ÂˆOTÃAÂÃ$àŒó l`CÏà°ÁÐx`ÃÐ#x0ô 81† М‡0B äL‚€lðÁ#„©õ –@Â9_ðB Jã,€Õ 1DjlG] t}¤ÿQÅxºœÒÀt¹Yʸ垛nìv„B”ûÀÄ 8X>EÜ(å±°!Á&ŸÅ$ø…'¬®#£PNJ"La:ç)ˆ CƒŠPC‚&±APÆ ‚¶‹pbQØ~ ý&AÌʰ`@ÀCAð0)p? A !êöA°~s¯iÜÑûAÜáD÷“ÄA¼0>÷ÜK ¶ç=p Ý ÂX@‚ÈÍ[‚ºçðGn< R€ò ?ÂÒ ðí æG3ˆ'p-Ž\æBWÖÕ£ÈE„ÈÁ(R‘ŠQ¬‚  D+ÿH‹8L€ ¨ÈÅ(dÄM¤‚µ D¦ 3ø`…x*„pF‚ )f‘ Pa³ E%@à\‚¹ˆƒ¸$€‘!´PÅ4ЂL £ðÁr”`áÎkD \`ˆ l  w0èð¤Á/@B#®àIÒa“×k€`ˆ4„à wȃ!ÔЃš¡òŽ Â‘‡+ˆ€w˜dŒ`0øa–jŒЈ7|’9C‘†\`wxÄR°€áwx>Àƒ14¢j`R™‡<€Á¿°F)X¡IqŒ‹áãlˆ‘´ bŸ`„#61ÿ(ï¨Hj…8Ô¢‰±Â&`!‚(¨" :¨EΉ)À‚ ¨ˆƒha @l‘PEЋ,¬ Ÿ &L!È.%PA*@±ƒL´ÂO¹D„Ђp Ü(Ŧ4†4ܯ êÃÀÀ3'¼¡ w0Bö—‡ 4¡H`Ô €+ä<ÈÃüQ%\á<¨Á‚Ð0ÁU €Ðz? ÁwCÌi+4‚{¨‚†ÐV˜¯®r , VÀ‚4¨Ap‚î÷5@À p¤°.äµ;ˆ@)ÀÁŒ[€….Œ§ãf3zJäžgØÄ± ÿئH*|°R ûÄ($P‰€FŒ=(LHàq Â*Î;¤£…oaÄb`Ã,„ @ˆ‘ ÊÅ$`†YDa™˜)æ°‚ H˜Àp…7˜sàÁ†À '¨ÁtB:€a jø€ l&TõjÞ¹ œ•%XëÔB×Ða Ï+ j ¼ö’@Ð*,`?áÀèð¼Å+ø€cðºN2›¸&98XJÖ»Å7ÐáŒðˆ; xaãЕȹ¶"öÅdˈL\Ñ"À*ràˆTL`ÿ ¹@C61Š X¸«˜‚JІMD!£ª˜ÃF!H BŸ E–0 6°@™xn*Š 8€bhÐÀFç 8Ìb "èâPR ÈàGø\p4 ¼À)Á#ǰlÀÀ†&.ÉÌn`Âi¸€. ÕZn`¦ƒ .°Vû­¸ Ø*†à‡&àõ ¸<ܰ֒Æb=¶ŽóÀâ @A k½*t›,¸™Wy`Ô 7Ú¾À„€R”½h@wtÐ-Ë“µ5ürCrH 4€‚•øD h‰,¤b-ÈÂ*"±‰] ¬`È„*Z „XŒ"ÿ‚)„°„8°a BÀ*6‘ ;L` ´(,|@f‚›¸2  ŒÌ³ÈÄÆ9@LÌSÀ@ ŽV4à1@ Êæã!l€·~Ã8 {3HF8B¤Ý¿HØÀÌ0ë·°Õ $¾ª‡4LÒÛzÏÃúú5Ìr0Â#š w@óY° šÒ†®¹ j@wýJ9† –`®`hBŒb ã¥ˆÖЃ‚›iË¿è²Â+Ò‚9L!f(Ä&0…LbŽd6±Ü)L`‡àÀr[Ð,d‚ ÕÀ!Hñ§)ø äs¨„|À‚daŽXBÿˆ` ;ÂBÁ¥†r¨8|b=à€†Ÿ 4ÌçD¨F)0½Ô ÉiйÑFpAàV`°kZ5)2aØ3A@d j€/oãU`ðÝ4!0M@!Ðà¡w=Ts†à4M`#0ø5 $ ƒc0LvöX/@3` C p€c€T1hT Íð ßà $-äz0´Z“p³·!°20tp"_˜#C—s´/ò’£ 2 q1£sStqn(³i0F‘%à†-SC÷…ÖA _ÿqƒAð±À€Ð3M U¥4x5c0iÐFðòñ6ÀƒR4$@`'ðÀlÐ346pÐKwÐàAd!' Œúf]åMèæ7°)`[çò$Õ"W0WA’ò 8!Y‡4`‘2`+XP+ÞÁe’&h2 °.èH( %Z¹$¡ ê3 ‡¹!!^/€" #pe Á•nÙZ7¢,qÉ#Öc@ Ð23µ˜Y™p©$¢x8)“˜u9P‹³•J²ÀX·#?Õ º  šù X€çx•3±#*À~“9š-‘uݱ,T(+ Q”O¢š/‰8qŽ7À °› À€¯)šNA›rÉÄéªy;Ð˹œÁ)œ !ù ,)ëz ƒŒ!° Áƒ*\Ȱ¡Ã‡Ê0#¢Å‹4`ÜÈ‘aŠzlèH²¤É“JlH‘Ë`–(7’ŠIÓᇚ&aâÜ)€*Œx2ß¿ˆ/kÞ‹8ñfÍÃ~þZÀh¾¥1ž!ù ,¤!ù ,¤!ù ,âçï¸CÀŽ¥¡ÃÃÀ‡w\ø…îÔ€b@ˆc9ÁzMÒ¤iÒF2Tô(°îŸ¿0ë•€xcÇÒýÛç'=–h°€D<_Ö!tÃR§ääÜéO)‡)vL£FÍYtT÷ý£ç0Ž rÖ… °ì>žc¯ ”£Ù7l§ ­:væ\ vôbwÁ-ߥcp(sLS°s +õ+”eÔ¤i °×êC 0ˆQÀÜηþè‘TŽ:ˆ h æ>¹4opõK—ï^¬Rœd-ÃA ’3žøõŽÏw !ù ,æçÿÐ!A(=@ÔxáP)DHœx#ưuº$tàà@€ 6`X±D =r8°ñC“ËP0µx¸!@FŒŠ"È€AοŸ@¥ ø!Ž1d숡£BûöAý÷¬@n”ÀA Oý‰Ý÷/ÚPaHäØ ‡•rÄŽ¥:઀f> °B7 Ý)(r§>;+ „ èzèõ-.TÁuX+uáH:B´ Ó˜¬Ù×¹‘n=æu.y˜9% ¤qÓΔr=žÄ¡‘eÖš;׬] %$h@Á Ô¨dÅ¡5F‰;~Pð ô§P¢2 #%Eªâ^ºÒëú¥§áã/‘ ¾ýï'Êo½Çÿþå!ù ,¤!ù ,ëçÿH£D‡?¡ôQÆË‰#vÀH1EŠLH¡À < qƒ¢€/Jĸñc!–Pš4…‚¹Ãd 0NÈ(QâÇkÿ‚ µÂ!ÆÀ2rÖðгµûüEÝgCIhÈ !F žFõ'JÑn.È ¢§ =Ä’-k•â­¢ÒµˆÀ­T4¨s÷™5:Ð…KæNP°êïTº%õD îˆ¢Ä°…’˜¬à³H§C’¹¶%ì,µêh·Ekð$.Mó6³þl´™fD0†¢F¬YÎc! \ÀÀÉ4ˆ@ì¾ë¼êPŽ:ˆ3À&th]ÝSìÜyƒ‚¢_ºâÇÿQ‚¢ ëKìÄ! ÿÿõ&Ð}ùí´Ã= ˆ F!ù ,ðçÿk€À G€ÂXáðC2¼H:¡C‡Aƒ/JD`D J€˜Â"4¸pC@Œ‹1nĈQâF‰›;^hÚª§- ¸1´(Q›@öý[ºÔÜ€uœ€1têÐ8~Ôó·¯ë?nt`/0pp ÆV\¿>½¨HÀ 9V@ÐEÓ)+oã‚+‹Ø~Eˆ`œ3j§èýƒ«l& H! Z¯ªQKáÈ[¯ƒ/ ¨¡¯¡{9¸¡®à¹êš´ö¹B5]tÔ¦üï[XÕ·ÈÓ¡·_Z \y® ¥ [¦)†c¡(œZØA½øqÕPÈAö޵»*ÝöôåÅOÜÀqã‰þ0ÕT„ %@ )” C 0Œ§Ëƒþ¢ ö©æR 4-¸  tÈ@J2Th¡† *¸C'ž(“A!ù ,¤!ù ,úçÿ1€ã†+z<ÈÀƒÆ )hÐè"Œ€2j@AF :zøP€Œ $P ãÆ1<â(3¦Œ<(ÒÄSS(= d¼ôH4f‰%îp@ïŸS§í üCÀ+b½ZBkŒ:bD˜÷oŸÙëô¨:‡,8¤!ƒ rŒýç¯ï?vR©d¥D+¬B¹±áH©P'öö݇V-[B™£fí1߬{– éä¿ÙbØÑa±2”0ö À‚ozäñõG9íÚ z`ÐrN ‡2€íÙºSðvûC=•íGÐiàƒlÎÊhrs‚ìiß—¯6hfîÔ¯S t}{BBGŠ­AGþ:º²¨`VxžØCRÀqç.ä°pÚ°#ÂY+ÐÝ•7aŒ 4ð0ŒXµrBõÊ i;zÜ*ôûQ¥J{[Y¨©%`XÅ`¥—®ÿºüiùD~8`À‚ 0@CÊÆÞ7¤g¡y¤!ù ,¤!ù ,çÿèPB ¢ z€ø¡)”VÀ!CD)hDpÐ`À"ÒˆQB†Œ7hpУ©eKE p ñ‚¤Œ’? ´ûÇ“'½7bx(Q‚¤Š=¬û·¯©¿y ÊÈH´dK÷ùó÷jÐ,`ÜØÑC¬ÿ¶r… ñDŠ,8±C)Sûº£,¬Jøñc©Z½$lF­ÚµoºÐÝ]»÷Ä`%:Ò¤ ëVÄ,—à°Ã… Ç~ìà0°DŽ2+•˜S”`Rc³ÛæPÍ6nÃ*8 F͆ª{a‡SÀE“r57éÂà !Û|aG‚_Öè€]¸Ö¸…ot\’®T„Üÿ}.]€\¹Ž”ÚÁ3BY´}¿|_¢Dƒþ:8PÕUVeÕ–@ï¹…Y 1”À½è"¡.¿ÈAÕÄŸ\1ÄàAL &paBîÍebƒ=ìbŠ !ù ,¤!ù ,æÿHP …‚5…‚BƒÀ2V ¼èQŠ€I%: c‡0p¨ÐÀƒ" T1ðF :nìÁ¡L(M85Mº1PF ^РQ£ßþ)UºHF”ÈãŒ?`û·¯«¿zD@t­ÁŽh•håê¯m½iZ1Wƒ  jdåÆÖß?°b–ÍA5Ö|÷µý · …/dÐ`Ñ£À¶¾Ã\³†²^Vì¶±@MrÜ(±ƒÈkIÕ,ðA 1nDF€ыß>ˆÃCŒŽ5ÛÛŸbÀÑ¢½ë@AÖ­]Ÿÿð@0F %bà3ÐñéR¥þŽt(¾ý÷“zéš?2ÙRð‚o*uÔ)°µ rš‚„`dg[jŒk#'ÏÍj4Ja0j Ä×S´¸©ê2ͥѺ˜œÉ;¥ ÎL#È Ô:¢R×¶wàʺè¼ Ÿ*˜@½ü3ðÜݪL©½i™zšØ™uÔ€ÍÑZ·ì«¬–øWg‡Gjë” ¡ÿÞu‚ƒL,¼àÖ#ã謕mï² `Ày¢%gb©€Ÿ`Xl d]V“:+À"Í8 !g5$Ëfüç…Üà3–Æãì±, WŸ0ЀrcÁîóË€öÕ• ¤t%* J°×â@4ÀAjp¼ÀÐ:(Á6!9@+àÒ VpÌ}§§)` nƒÈ@*ØÁ 6mÊß`Ó¹¶@j°‚½ž *€Ú j ‚ƒï•½µži ƒÄ 9¥îcƒØ@+XÍ„ocç`Óü€ X@Ê4(4Ö‰Á¦«½°àÍ)] ~•%°àýÿ ˜MpI ¡^\ X€­Èã`Ó4ÙX €ß;@…CÈ tpƒM÷ßÄ4@7À?€—T48°PC,PtGa  £†E~4 Øg;P=@7Ðɰ ÌÐYã2¡;û³22àÜå92€A½ 7÷v0Ù$<ôTx6!Ð6!0  `güT F(É×O'ˆCE …ñ*@MEh%6„áiõwY’à'd%°UÀ‰v0ƒv`ç&Eð…r9ÓVÀa~PHJ%Àa,pmЈ6ÿ ¤”‡ÓÖÆa2ðwo¤´4(û£Q '^°øvñI§à3 óÖ>àÐ<¸C=°c‡7.³bj'5€04:@Ç °5Úw¯(cÃ%ýOxu ¶#@SQâ#˳7=ðUHµ;!J­"ÐàÀV#ŸÀ„ž¨‘Ÿ Œ0I QÐ÷S"JÈ—$› Ž ðO  €EÀ‘@Fˆws0p#ð‚ýS `-ð%P4Ãs%â%Pña0„èø&^cà‰á| F`0g)ÿÙA`Šá$ M 5 @¡N°0à ¡FÐ5N gjôU0m¤4 E×0 Ó° P#Fш;äDÑ ¹Äpƒ:Á $À‹Œ%Ð/À69X<À µ Õ \QäA×[l¦5”oQ Êu,Íè ´´vC6h¤ -¿F"PÏC ŽP„ëh Lˆ±  „Y Jˆ ![@ á° •#5!ðOs# ²À³ÐOÁ•0BÑ xƒods8y8éÊ)M•W`<à Å”BY~c’ácÿ`Êw“Ñ WwT7  FB¡`1 ?»R~æ!КI› p±L² µ^˜£*° ªpq0’Ð>°L £ Kª¥v€8‘Û £bS(z­p®°¿Ä;0Ê©ŸÁpp:ó‘Ñ+'à¤DS& ”ð®;ˆ¢ëœ“«5jµžð}ÑâÙf8‡jžèºî©|@sàžÀ—¡\¥VäP ÍÒ4)(Í0ÔC¨TÂÿå?ì$SQŠ@Î%Ù  äàp#IÈá p ps?àp½+7åCÕ(óà‰[6š Bt¯;K”î&Ý£P£#ÒŠ$ÄËd5>ÄWPƒ­ÿD ñË!%ûX$ 1y*ÀO" „J˜-E/ì"“5â5É’‡È<À¼åyÆèÌ<,°~``ðÑ8Ñ‡Ê S†sƾxoÌ4vÓ4Ì;2 ŸbÊO—ÄoÆ<èü;P8Ä l£h?¥ 9ðKä@p ½Åã˜×P :næ(`†*à¥ðJ š ÿÐ7àd“  GpéU a° ° >4Ò%à@ãG CôòØâs­Œt[6))xÔa°(ÐVÀHD(Ь:†!º©vþD@Bº™ÖICY*ì8~IgÐ4³p9W-RI·5KÿD³@ ›°T40OX.` ð±cP:5М!°Ñ(-gÈj Il›VÓ4«Qwà08 ÙÑ,o8IHç €@lž¶5ml8·?⥤:ÖæËŒt¼#58' ùãY¸pÖ@lÀÆVÓ'0} ¦H7Û4ÿKÓ—œ›Và ÐHW€ÓÑØ7”sÚmld3£ÝV³;zƒoeÝ Ö¶tã‰Ö¦"p¦RN49g: òØ`w͘æ…+°=PÙ’¸Ç,ĸ¸K\ã·i/ðá9õNŒÄˆ4@³ÜvGsF1*€ËV!þMʉ/'*8|=€ÞE7¬6ä$E'$`‡•Æ47@€% zÕ7äj(åTsÃl‡6ðcI®M1Àå`Nå9:ÀjEwæ7 ^a å\¢²æK¼€!îÐs¾Ä!.4sâuv68Ðçuîç!ÞçþG6}Þç™ ˆÿ® \’çw.çsN2\FZþTŒN}Þ2;ˆ!19+—4% º©)àfvHrÜ&Õ*@¬gO0`êCÎm!ä°nê´>ë¶®âbºl`ˆv•2"sHn4%#0Ij+2"µg‡Ö†T½µ/®0`í'°90y(ðâ7Ðíà^íàNJC06€ƒ²¥Wz±îé¦2°Uº-†nVï-Ã@eTVâXïþþï{8n8(}(`ððïïMNn†ðOwðð oÏ_Ÿðßñå"t'2ÍJ lI°Ó¦rIw!Ò‡wÙpÿ–t`j”‡s*ŽsÅMÜ<ÿߟ&zÖÆÝ–¶o-Nf$0I*eí+°Ö^0§§&7|I^P³³|›F.àÜšy#žâ2 âOE0ÿ²ÍBS!ðbšä#¾Ím6c7^µ|¸÷­¾²fr_µ8ånV&P{–5àn͆áͳø;,ÿòl}ß÷ÌÇ4‘Vþ0G F9FfÐ6ùèfôú“wÄS˜d4`Ãö2 ›!,,ê/ÀOöêG>"ÀÄ^ÊÙ#"€ái8ãÇÄ ~8dèïS8êÓÆÙe÷åFâEÌ;‡Iÿ$ðÌòÿ 4¤DÏÍC©'^x”,°‡ó ТZ9ˆôüÅyY2’‡Ô4%À,pÄÛö5AB€2ØÀ àŽÆ ü "Æ@pLÄ( † 0Hc …)@DYC *‚(Q#áÀ:6QdÍ2d²ÅàFTÀ>&*… 2hШJ§þü©±êV®]½~VìX²eÍžE›V­R™ˆ¢¢fLlœQ7Š*€Ø"/Å)E&P\u‰O>h ØA‘I‰•A¦`a’h‰-(z(ƒEŽ/žbFM#Å H(Pƒbä /ÿ† ¼ýb`ŠšCXÀÎóX@¨R–ˆÌ£è‰®”èx[€ñ¿ƒ°íÂÈn#RÀ" `Ëà1$¸ôÇÊcÆüF‰ù7R,S…r*8b'Šž¢HþN(‡ @ðærÊÈ&º!û C£Bë!lˆò@ʨD­LDñDS$p-_„1Fg¤±F¯0À3Šfˆ‘Xø1*¿L ;ˆrŒ !(b‹CF‰£ˆZH1e•–\eG4€G¬@‡N8á†È"•UbA#ª(G.ƒ¢¡$è (>ï î°A90RTÿ?¸@Q\4:òh$7\”O¢ølD€Áò£ ¢,UNQ>óÂ…4ÅTÈJhU:‚S?ü¸T½A¸b¨kf3hµÕÈšjê%¥4IG€²©Hlâ¨8§€—ÂÇšož¹ ŸVa™p`…80(Šj¡„<è°ªõ „|÷Õ·_~ÿõ7`€¶±`ƒF8a…Ë2 ¢,é‹(RRʯT2…ƒ)¬ÔQ€H ’¢\01H.âŒZ¦Ða·’ë.b[Ù$‡MRi ZæpøDPb ÊKC nsÁ@0ÆèàâjbQEo{¤ÿÔ7vC ”‚„ ²€…š¤~äŠF¥¨Ò¢G†Bj‚ûmµG*{ƒ‰Œ>áì£ aT€»µsáÂCBpÀдº?ÊÀ´Î!ê¿81 &ª@øf È†ŠFΑ@ÂA ø%ò–u@@ºÁôHŠ¢èÀ¾æ½wß>ø¨pØŒôKT …"¿rh“1EB+&Jú#‹H‚@b#*•9àK‚¸Ÿ£ù8¢¥Í3h1¹KÖÿà†{/Àa°§ÇHáN>‚ îõ$JÀ(â‚X` .ðÀ‚2¢+xÀ€p®.@0¼ÿP¢H§0À‚ŒáH J`´HðwNBøTu•P¨ŒtÊ­`ò¢ºà4×ÈáVH‡kÊ!ƒÿôâ(áÅÀäî èQæôÐKÆÀ6œE‘¡Ñ©R:€PäLoåG:ÎÑŽu¤£ðô¸G>öñEH›(Â=Ft€z:`„[ B=æÀ¯µH&@F”ZŒO’L]àw¡Èb ã¶âÇPä2€‚èó\@w2àÀÒ€¿ª80w@î  TAnXÔÔ–5 Å fƒ ‚B0,jk¹ƒ0à Ú`wÿÈ j`´ò\ÁA ¦üV ¢Œ o¢ZV@'—9Bdˆrj  / ƒ;U+x´0‰¼ í,AË<¥‡0 „ZŠÁž™FŠw© ‹V´QjÔiHEJ€¡‚ Ÿ°ƒ#@Ñ2é‘/fÈ…$çG `‚/@&(Ò¼(Œ/ ]‚E”r1ÇÐl‘(Af‚Œb]Òi¤Ç+i P ˆpÀ¼€22ØŸ@À§ $8‹ J5·-<àlRШ»]q«‚ îæÀ»}ð€`Ø@#Vå(GMš,Xƒó„@ j(Ïÿ®(2¢FðiUÖ@*P Cà gÉ(Œ8=€"[€(G”ˆÑ2P(Q:„B Oz¢“b*e±ƒŒB7Š.%@0à¤H•»\æ6-À!è²…6e 8#~p2X" ±—ј!zY0ß@ˆÀ$ò‡(‚:B 2‘Ý9irp@mÈ:Y&>æt@ Ô…vð‚̨±WP 0ÓOé<·¹€2uŠ QoØ@ pÐM£­õLU”J¼­ep8¡CVµ‚ ÀFÈÌ)8°Š:ÈC2æŒÁ­4бÑÿÂŒmpã3Ñ Eš1ElÀ>Ì H 'f„‚œÀ~c‚`@žš 5„A„@hqÚŽ@E¨2ÊøˆàÉœwvn =hæBWóåü"žœ¬˜m¡HGNVÝPä§µ8Eò4 | <¹@žnd€ûÜ`Xèˆ2^ƒÜîÂÁ pYÑr@$2h„Â,³U)Fkjð„x®(Á6ðà (›>)À^@ÖEF 9¸A"(ˆÈ ³¸ IøÓ(Þxà €ºhþp`@j°»**¥& `@zbŸ|ä0pÀJðgÿ8À#Ïœ@`Ÿœä„(1ØPÐj¬ˆ¤ .T€ЛÐyÈwƒ¶¨@w+h™$¢NŠ–"&×@VàpI§º! N¬‚øÀ‘ˤI4 Š0\è¨ÐDdcˆÄãOqù@Ô°»œø)¸ÁšÀ7v–i 0ØÁÎßì@$E@1Eåà 6 Í]äŽt“ó ƒÅ:mp¦ó—>{ç¯Þÿ½÷Çy*¹ZA®*Ú„†u8ÀAOhb¨+48;å•2‘3ND5Ÿ·O`¥ü óyêU¿ú‚•@òPÑ|Ô+¿y­°3$0 V£œÿ@.08£ìÃ„ßøÅÉ>Yz+³_&±ûöüÃVŽòO¾mL‚¤àóÞ? bP§Ê@>ò܇Š‘S2Í$]¹×†fßçŒP~·$’< ¢ÿª˜n'í o Š>»<#Š[¨Ýð8ÖcÀtÀ¯Ø‰€>´€8È(ôS‘‡ã¨ ,µ ¦;;±˜ˆ@rò7ðé¨ Lƒý#: A”Á(Û‰è3ìù ô Ïc?q—÷{À Â!̲ûS=“39¢h¾ ‹§#:1…™@¢ ?@ƒÿ£‘)$Â-äÂA‹@ ü8 A:<ˆ¦ëBƒ±Áüª<Ãÿ6tÃ7Œ ×ÓÂ@CÂäZB8¬‘*d´ÀB<ôÃ?Â/œC‘ä#ˆ2ŒA@L‹4ÄAñ¼DTÄH”DA“CdÂ=œÄ&´ÂLäÄNtÃÅ)Á$LôDá!ÅRDÅT´‘JTÅVtÅW„EJ¬¿X¤ÅZ´Å[<VÄÅ]äÅ^ôůE0üÅa$Æb|E]4ÆdTÆeŒÄ`Df„Æh”ÆCÆi´ÆkÄÆ@sÆläÆnôFá©ÆoÇq$ÇÄrDÇtTG±ÇutÇwtÇs„Çy¤Gq”CÖ©Ç|ÔGk”Ç}ôÇ$Æ{È$È^ìÇ‚DÈ„DETȆtHN<ȇ”ȉìB†¤Èÿ‹ÄÈ!œÅŒäÈŽ¹vôÈIåÚÆ‘4É“ì#DÉ•dÉ„)É–„ɘ¬•”Éš´I³xÉ›ÔÉ šäÉŸÊçØÈ $J ôÉ¢Dʘʤdʘ´È¦„J˜ŒÈ¨¤Ê|ʪÄʜʬäJ‰¼Ê®K‰Üʰ$ËüʲDËË´dËy<ʶ„Ëu\˸¤Kr|˺ÄËnÌɼäËo¼Ë¾LhÜËÀ$LiüËÂDÌ_ÌÄdÌ€|½Æ„Ìd\ÌȤL[<ÌÊÄÌ…\ÊÌäÌc|ÌÎMXœËÐ$ME¼ÌÒDM7ÍÔdÍ3<ËÖ„Í7\ÍØ¤M|ÍÚÄÍ@\œgÌÍÞ¤F#ôÍÿà|ÀÙÎâd®Û4Îä ´ÍTÎæ<ÎÏtÎèþì£û?Õ ðCé=IÃ[ X3 hp»?Ðïó50üMG T庖 ÂÔ£‡&<ýôü~}NÒ, ‚ 1Èu D“Î3é ³îç÷¾Ãú:‰€JP‚ì X Æ4 tȹ›žïÚÄ;°üJðØÀÕÆ”PŽRÔzìPp ʤˆÁ JÐ"ËÔ8F”€Mœð|ÔûÁ «là˜P«8Hv@j°£Ò¨ (=kà*@AöŠÈ’ÿqXb†AŒgH G ¢…XA.¶d`%È^ Ø€,€ÏÓô¨qÅjmÑ)y–±b€ƒü«8Ð8…Ï9òÜù„Åñ_1HA NÞB ¼E/ü‘’.&ÿÅ€¸’ˆüP™8l=À%.opÊ"!ù ,¤!ù ,$æ#ÿ(l Áƒ¼!àˆEhÄP"F‰J&…*ŽPèXb…&“êHÂ^È,!ãb q”pЀAžb8Ø@€Š:NÀq£DŠeœ@↊'J(ÒÄUS(9dàûb …=ÈQ3†Œ¨4ir¨÷¯nÝu~È ñöà‰6hÊè¡cG‰1pàØ!½ûüíû—®@2 >À& ¬4ðÐƆ HpxìO2å?ÀPÀ0ENä8!æÔ)%vl°rª”ÕÿZO®lØC‰ƒêS ÄÙ³gÕ´4pƒMZµ`è*è»æ ÚHM¥Ð Ð Ý…5'wÍ\á¯Gœ3‰ÖP³ :Ä0Ð5ßL#Gâñg™)ÄÞ-á(5Ç8pD<ó .7¡BLƒM¡˜£+óÃâmÏXCâ~&þ P1iÁÁ¼TsÌ1¬8 Ç3Ô8ãE¬IxB0õÔAS0À5pÀÀ–t@dûä˜Ð7ìÀM8ôP& õ`¦ Ðe×?xõPá@5å‰YEqµõK¬èÒ‹.‚†B(f&Pž|Fe Diµ¡8PŸ}俦f&!ù ,0çÿ8° 2dÄø1°”€xˆHPÆ ^ÈàÐ`€Ç 8Pð@ÀHŠuÀ¸¢”PšbÆT‡ 1P ,AãB‰? ûG´è©;hÈ ¡S@‰„~Èø‘à׿}þüíûw´ÇÒ„(;`€’®Ì€ ‚]ͺõ(Žà6}RNO)9ÔbÕÊ•Á%&R´& sÔ¦­³Òk-ߣ;d”Œr‡€'éX  6Œ•ã¶~›¤‚®Ì‚fÄt}î{#gN  ˜“SÀ±[«O…&XŒblurDc†{o[¤(E¸áˆ3-tRm¼oˆdXÐÀ) RàUàÀê¾ó[K5ÀQ¡ Ë^°(ѣĊeµà:Á×hç”d’áPA½è¢K‚½@Á€FøßdÞPA&°@BØâ°C#Žƒ‡!ù ,:çÿXbÇ@? ,¥gEbÊ(!c„ƒ‹ @8(0`@€dÄ@aà 'bÄСBG=¡4ÉÔ¤ˆƒH‰Sä ¸c¼@ÎkPƒÆ@2&¾8qCÆíþí›úO^ƒ2b€£Ä… p'Õß¾ª pÜªÌ ÚhÑ£ëHÔ}þü¡Ýáá :E4S猚®ueÏÊs€´„]¤-sðàXºͫתÁ 8›°€™³?Å«¸Á‘Ê0MÙô‚ªÿqÞ+0ÀgÑ4p­ÁÓ»f«2h¥€^"è‚þcAÔÝžR¤!é…7zÞB¥ /-l2v”ˆAC=îyAÒ[ðyàÄ®øel(ÕkúôSÜ„ÓD÷ÅÐ@ ˜@*dEÆ€C;PØç!ù ,Cçÿ„ÐC€ƒdà¸! Œ‡!´hBxÈ4¨À!c‚pèHQÀ‰2n¨ÐA∦—/CA¡!Jš'6õ¯§Ïc~PÜ!ã‰2~<à¹oŸ¿}ÿ†%èA1Á0NhLÀÔßÓÄ‚Æ@È*L DJÒÑõë°;JP|[æ›5kÃÚB ûC®Ü =D›Æ€…ž^ÝÂ¥¨ã$¸S€,еU„9ND¸&,†ˆ½B}{ù Ž n©Ó¥ëe¾q”ØqÁ5j/ÿ%m™b‰ß10`P@Ó¿¦M+ E(£DŒÙ;~4(åó§å± k—”^ºÀ‡oCÅæèÇè`ÁÇåKfO#F÷ï›§!ù , çS"ÿH° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹/Ê(QF‡TC€ŒŒ(Sª\ɲ¥Ë—0QR(±±…4+A2¦ÏŸ@ƒ Jt! :Â@q œoÜØQ²¨Õ«X³jÍZB@Wš`7Š¥i²ìÖ³hÓª]›*ª8qÆK÷$Û»xóêm9:¬ ‘‚F‰¹cÅšÝ˸±ãÇ;b8" ”4X°HLö¤]È C‹>Ë@Ž€kÕŠyÐÌâpزŸGËžMû¥ÀÔxPBÃC ˆÁÖN¼øÅÇ•‚ÐãÅF'êÂ.H` ‚ÌD2νûì Ø† ÿ Á0 ׉§ $P]> ñN¿~ãt­¨«„ÿéÄ^uíÙgàxÅ@+âÛoÁtPpÂj/° ‚M€à‡ þTÒ ,@`EH–BÕ@Á ,P@`[ˆ8æˆÒg=T×k, I;ꬳŽ:í„Ò:6éäDž ôc€AêòÏ•Xö’@Tõä—`.Ä• À-ÿì³?ûüs È…)眹"Cœ™¦?lþ£Ë–]Ò)è ™‰æš}¾'¡Œ6ä¡|¶ù'—^:j©£†îÙ矋^ê)£yBº) Ÿ–:h¦ˆJš@§¦¶úe¨šªoÊ¥«´>‰ªšª²Z뮚i%–Wjù¯Ä‚hf(ó¸ãŽ<îÌSJº+­w(ã (°A ]Më-}9èC¸:èpƒ ߦËÝ'´p¸9œpnI•ªk¯hçž ¯¼OÝë/mQþ+pmô:ðÁx!ù , "hÑB`0JØá„C„' „°E3jÌ# !ù , ñåÿ P€h *ˆj¡Ã‡#JœH±¢Å‹3jÜÈQ"‚ ä0Å”ÀOfE(«EÇ—0cÊœI³&Å `gÊgh˜"àGEDØ\Ê´©Ó§ oT)Aˆ 4pР!„ˆ &h ªÙ³hÓ:Œ! „‡4*8ˆP⇠ D#‡Œ*n¨ˆQV€Tµˆ+žÉVà 0H`@…» ¸B†%d„.!-Û»:bÄX!µñC¬=81bñÄ)–²P(ƒÆY }—ࡃÃ&±S§nºv§àÈŒ@…Š6F‹¾‹YÛ”rÿqÂôÂ6¾fáÙá¶zØà~¡ŒîÞ'v'±´ŒpPXAø À]DÝ%¨P2€†0 h`Ap Ð”°~;4pÊ? †8L?ä§f‚­ƒ`7”À" ‡ÝðBŸd¡Á”XWk¬˜ "GEh`Ý 0ºƒ0°uC HÂU`=yØ„5è .€D8¬` T4`Vƒ+dy¦jÓÅ C–$ ÑD5|ÀÃFtp¦@8¼‰1Ô ¦÷Ý—_Ÿ7$˜¥@6F !šŸšª PƒRX* èQF2˜×a)ÿì³?ûüóK;df€dÿ ‚²Ò@«XL§B䇣Œ2AØ0Bx6p5*˜`2Šˆ0¬²½ÀÁbÝpB´jÐA„®•¶ëX'à°ÕHà C ,¤à[ ¤ÂN¼‘Â|€Á°°Á*Ük÷'@ÜÂÔ À†¸pÁA4â¤p »WlðÁ¦ýl¡gc@ 90|1 %°; $¤`C\€A£÷n`q\@|€rP&¤5¦C¤žŠê?ÁhbAˆÄˆ%˜ÌñIlÊ(‘,¡A sŒ2G*ld°É(Ž€EI|2…£dÿ!)lŒ (løÊ›`⃠6°1ÊØø°É™l’,RY‚”ŒÂˆéeqöç#ÔÃ-e``ïÀÐnؽфMŒ1ÆcTჸ; c€a{T‘Æjž0†!y¼1FAb;.äBo¤Ä.¤û<¼U¬0ÂÞ«ñ¡¾%l0Äj\!Ð C¨Q? æ¢ÿÆÂî@òQ@ØF4”¡üŒªTþ¸Z0ЃÌ ¨EIሠÌá[ Å'&°…\l⫈Û&fÁˆTŒ"S EZ° 4ˆNÁŠE| RÄa˜ÿr‰OàÂDE*âŠOˆiVÑŠ2¡ŠC¤X,,qJø@€Â‘Hì¿r„)DÿŠs.Aq8A,!8È¢HL0CÔF„\ÌAˆ³X‚Z1 4øà×ÑÁ$ «|ÑO cp ”ç„ ØÀ j2ÆÜÁ # Žf'ä!#Ð¥îX˜,¸‚‡*l C, …<4a¦W€ÆðIžºô 0‚S-° €á ØÁÑ6p ¤A 4Ø@ü¼<âWÈ, €¦£5ÐA =P Mue©"(A Rgšh˜#6Ñ‚T ¢m¦ø%LÁ+\”ó…“]ç,f¸ x:â  `Á&v˜B Ø!7(x¥Š9ä@v(è,„Lÿìb”È@¯Ð -Ð" ˆ‚#HÑŠ%p`%(p°  W0½Œð°± jhVÉ Œá ºäM›pÓ XRzØ\é„`ì¥-@ªô,@Ô&ì ‘¸ªúƒè7«£ü@¼JàÀyÓYð¸^áÁN0ï\`2÷Èàh'ÃA(@Œi|C˜Ža˜iµT¨DzÉ(Î`MFd¢»øÕ&R¡ƒ9Ђ C<ƒÜ^¨ÏŒ3Y¨Å¦0Š`⨰è*>ÁTŒBŽ˜EâP‹½©L0ç…À&ø-pr4èƒ"LáSÈ…4P—_Èÿ@¢(@Ö xo÷Ê—¶›GÁy€@C! wà/ýÐ=ÁõAho^z@RÑAˆëü{£Qõ pBB `#D k5B!Kº‚á }†hïÇó5:h5|)ÿ ß là‚ÞAc$˜OBnƒ:•¼jøAÆœ‚Ft jhDQ/À]RÀû¦‘†îjÕÔ5ð€ÀЈF<È Á«mp<úáUÀ@—ªžëz ®>§À)ªÁ sL ¨‰#Øl­A{BðŠPfä` OðÁt,¡y?A„0#!à9‚¿È„Ql¢LÂ,ÎPf°xÂDàƒ%æ ¹! ‹¼ƒ½QÐûáEp‚à  G }6p…°Ÿé™Üsy  ¡¨xA˯à$tà,ÂX[…="¡ú.8AKï=x ,h©ÿöçH áÁ ‚àÒ°à7Ð# J~$Ü! 2- xÀÿù+\.Pà§GGÐV  Ã02W’lUc*ÍfX)–# "0/ @£  /p(ø7@89gh°I0 f/@(Àà> +5¸la>y6X!!+@q.ùq»á&üÁF;W¬d]2…J$ 7pNÐoÀ6€C'CÐ*€'ðã^Œ²@æe?°!p52À‡îÅ6t†`h/#0ðÿüQø"# z­R" rb®R% Ñ"«!­±#‚Ñ#Ž1†1…q -‘§o!'Ð$OR(w„á„¥„Ã±Š†Q€µa¾ÑqÀ7P1À=e %Ð|:5¼A Ža"ø!bâÁG% a’ü$`ĘnrŽÑP"­Á‰ 0 óàîî@¬Ð›ø%€\¢AŠ£øJ„ËX%* TR"! #Àua )Œ±ˆ©çfh „Ø1¡¢ÃaŽ$™bÂu=&YŽËH"y%RÒ’Ë.ÚH/©° À °  x¦{©ÚÁª‘H0a"&©e2(ÞaWâ&óbeò”.Zii:°: 9À$B)¹¡qŽ4á„lA)°z4¹H¹5] sywy‘Š'³‹å±5 !Šjy iÑK)%ñј„é˜ù!0€0°‹¹•©{ ™œÙ™q ˆé™¢9ššéަ)!ù ,¤!ù ,¤!ù ,¤!ù ,ßðÿH0Â@ƒ ‘‡@Š&$&Ð’϶I(Cà2“È8òQ@B‰YB‡ P(ãG„zèpHPF‰8vìÀ!£Á HЧÏ?w4ˆæNÝ:uìÌ•X)àg‰¯0Jü°îŸY³û@ÄXé´ÄŽ;~@÷oŸ?»ôôÚ¡… ¤«ëÏß¿zjÙÊ j3lº ¶k8/A· nÉ %Gs„ #^ÛQƺ¶A0­×·Ðÿ,ï•Ú+„Ò‚½¦|˜CÏn± Cݤ݅cëèÖ«uÓÌU @—7=ßë²vdRÕ÷ák]Þ•6·Æ–={CϯG°ÀС#µyí๓§Ž¼×”€B/8 À*Ð ¤±Õ 2¤B\:äÃ=(´ÖW%¤@C 7ÈpˆðÄÑJ1x Ê1ˆHâZ ´Œ2JT[(*!ù ,æïÿHpà‹‚*\¸Ð\„ØV+X® 7 ê %ð€‹]ˆñc ‘JÜ@Là ‚%J0H°àD P P¢G 8ê¸QÆ HK€(À`f‚‚îh´jQ¬¬ÛºN»a JÆx¢ªÍ:(ÈùǶ­´=`«C…Q%dÜàPÆß¾¿ûþ=+ð£¬@`”¨©BG¾þ"w®€k· @™¦åi§öEöû/á/¸I§§ÁµaX}“3šôà7Æ ( mYìo ¨ý:òotàhz+`f ”|»õ –Ú“ì0CŒs¬&DœÏÚÆK'7,pÚ‰ À+•½dÁÚ¹ $CFƒRß1m€e×{ÈS1ë°kµÅÖ[•µC 1” GÜ@ò¸#b;ô“€råÓN f¸€0Âx ”a†8`¨b;ðÈã è&P^ ª(C‚yP‚eݸ¤Š,9ÐX%ÔXБG”%C m‰!ù ,¤!ù ,¤!ù ,íóÿ„!° A*P¢F…`„‰=v\(ãF‰8tèØñ`@‚R–Xø±„Œ1JôPp̺u8×)¡0¦ 1aô€íŸÑ£V0Ü8XbG‰2vÜ 2€Ú¿}X±Báã Œ nlpaC«ûü©Ý—téÁirhª¦M´jýíÛ£«Asܤ»Õ¦œiWó²Uª€cèä`¡ÖL@âµP0ÀØ([™ÇØ=›F-Ô´Ëz­T¸q‚ ß XË¡@‰¼˜5sÊŽ ÍÊUã¦çtÚµªY»ÈF n.É©z«ÞÌ› :¨C : V°v)‡¥~ôuY‡Œ šÍkç®~;$Ò X ³}‰ÿ8D À€ , À )t¥Ÿ@/ùÔÞEèÁJ õä’2Da…eø’@ z° ‡$–Ø¡‰!ù ,ñïÿœ ° Áƒ ZKÈpBô08@ÀØ ¢ I „ sX€P—€S A†p¢ƒÀh’8d!ÐA7b@ €£„Œ? Ó¢%ñÃß¿·oÍ ø°g ;ð²­ço_ßÜ LHA€ƒ*dPx€áÁ…|ýýý6÷ ¶`.sÖÌ ‘ÿ\ÐÍ·S¤¥;¢ Û†ÐûþQ¦+€Ø¹2Z¦QK} À¤oJ`@z@i½HS6@S¸à’E/øMG‚JD;@7(¹M‘Ȭà©Ó˜k*]rìÙbœ9©ÌŽV hP¢…ß}V€Y”pT@ƒ pÐS?Ä×?rÑfR1Ä Z?¬#;î´3O4 ìƒ@'Ê Z,X ĸ€°PB|©˜£Z>áÐÃ?öà éXPŠGHCg­èÓA7žÈä”TV‰bA!ù ,ûðÿHð8‚W $x‡mŠ@BÀ‰… –d À\)ÃhCÀ‹7 TÔÂ@bR°ÈA³$Á7,XÀ¡ P¸±C‹4ÆP¢Ä;tP ƒ8ܰ4éÒ1À6ݱ@—;uëÒ²“CWe”+÷Ç€fÿòêÕä`«¯dĈ±ìÊþíó·oß¿IŠÆ€+ Á†ĸ¡À2Åþ?Žà°"§œm°pêX2СG~;[Eé ( llÇ“H ,€kºH¤Sâ{qìI $,Gd0i¡¾yþ-›òRߎ\‚X³Û°íÎý=nࡹ#2.P›fÀgçÀû.ÄBC.9: Xc­×AôGô^zå™_J…5ØdõBO;ît(PW`sÍ% ( ¢Š °°Ð@%Ê5X;ÐH# \-DBr!DB 9¾¨c`0 iä‘HŽ¨Ô‹!ù ,¤!ù ,¤!ù ,¤!ù ,¤!ù ,¤!ù ,üðÿHpA‚**ð`ÃÀ2K¨°¢Àoƒ C†- ”¦p˜2JÄ(Rd 4v8` =~äì±c¢È0<ìØÑŽ’&e€Cd‰'¢¦”Q;uëÔ±£Æ gÅ•1TÀPY½hѺ+Ð#†B1nÿx*ãg¦Y+ãàT5lÌ pãî¹Iåäh¸±›œPP ¡Î)a°Â€pûtgx €“LD”SJ`pÄ7Îh’CÛзàh¹¤S(1Ž"äPÃ^à 7 ¨`=´äÀ1(ðÀDt 8“DD<€îQˆß‘˜])BÁæprAXa5ÛDS€ÞåhD `E aiAD 4p‚“ÈÑÃ!—`”Ý C TP–u(•u Dpçk±ý3[x÷É ÖZ“ö†Ö<3;œÊÃNR&‡ZXc­6Ð ( ª (€‚©&õ.E*_ƒ¤Ã=຃a÷Ä–A”•&ÓA)+aÇÃ@ …Úë³ÐF+-¬½!ù , ðÿHðÁƒ &@ Á‹!l  µzN$$+ê& šxl g  q”¸¡ÁjìØð`C;0H €C Ò(±cG2 $Ê €ƒ{È8JPÆÖ2 bP’n:³îŠ1*à(W2––(Ñ (ÿòêÅàÇ@oÔHƒi´I  ìó·¯ñ?jz¼ø B¯ è*CA±¿ÏûþUà7áµc?((úF­+‹A?Ž¥æ’À-ÿì³?ûüs w©g†i~Çå›qúCç?º$P枈ø_p±i›pÎ9èy&j)yú©P—‘ Zg¡wEwé¨-Bú “&p"©¬ç(Cœu:(¨ˆÚê­ó™Šj·¨Šë¯Æ*é§ Ö ì±ãéꩾ"ëìt]²¨œÌ†úìµÂ¹ùe˜`öR,¶àάœbî)¬(d¸ì†v ,°ób‚±íæ Y:ì C¿8è+°c dëÀëup W!ù ,ö•5ÿH° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹ÊÈȱ£Ç CŠI²¤I“%Ò8ɲ¥Ë—0cÊœ)rG'hêÜɳ§ÏŸ@’J´¨Ñ£H“ ˜&‹Ò˜¤žJJ•&…•UG0¸I@”¦8ÊJ¶¬Ù³2¬`Æ`XDÐÊk]Œ´ …† lî¸K¸°áÃZ8CPC&¤P9L¹²eª*’øØìc²“ä¸Lº´iž':á‡)h¡¡„‡§sëÞ ÁŠ'N¬!#…Œµ!OQïçÐs0°‚E‡Ø=„ÐÎ=9EÛÑËÿ/ Á,R¤ð°¾={õ1và°+€~Œ7âØ‘_@ "OØ$Ø|ݰC 5 6Þ‚ UÞ !ØPB 2PH!A+”ÀäE€A~$ÐahâÌ èW"vEÐÀ<Cƒ8æ(ÓtÁå@B ? d '€ðÃ)·èÑAšñ£&ZT°C)º(rC¡HƒŽ.¬xÓè"ŒŠ„2‰¥Œ¦ãšl’ÀêÙPáœn$ ÓP#Í3Dp€Î- @±Ž" 8cM4Ò@qÁ/פÓÌ00Pp :Ò˜3IæT“5æ°RÁ 1´)꨽™B7ÈYB «®*À Xÿ±Î$pпXÀ0Ô(ðC:¬Á 9 pŠ5Dê@€.Õ8°ÒðÒ‹3 ÜDê¶Ü:dj ª²:§vr@L9ÜèÒZ˜cE5·DÀA/ãp#L;8 ‹5üÐ@(îH#Í6áx€Mϰò ¶ vëðÃ}›* ªpP ;aœÐ€¡ØüR(²N(ÊÞ‚,h’Ž"rÈ¡DÖ |˵ÙB¬óÃ߆káF2ÄÀî2§sŽt Ç<ÇtÅ1·ÜòrL¬"%èPÍ3šs å”!.ÁD“@Ã;§-ªÄªÒ9G3M4“ÀØ@ /G€ƒ¿ÿ\ nÀ 5ÍP‚ÍLãÌ%….“„¢‹h«myŽ=W(n„Zâä§5ÔD0X %&@A 8ÈPC‰ t^ $€ €Aè}ùï:²M1s‚ý°Ãg ü„*@ÐÛuß};ìpßóÕßpa­k ü÷ ÂYƒ ­Sýé_;ŸƒDðŒà_…¿PýOƒ Ù Cè'ƒ ð Ò+ÿ,b'\'iàCêGŸ‚¬ghçÿê‚Ȉ A zp‚)p pÀ@(`ÄÜMÐ,SV”„Ð`¶¸ÁPíŠ ¡ 0 7th…(aDd'ŠPƒ (€‚ð|1Q˜Æ0ʰÀêòÅÞñ|àî2(G0Æ€«Š ¬:´AGÄHˆ¼ÐhÉ8²’/|!úzç¼/þ±~€‘A@@°bL80à©… kˆuȃÁ l(AŒ§¨Æ6¢=ÐŒ¡Ç6ÆAŒ„`†"B'ÀЀA“ÁÄ ”ì ¸Apà€^£ÜóÀ tª”s à\‰!pÿ g0@Ò(ArÐDä§?ÓËêC.õ @†0€×Á@ªO[¨ƒhª¬`‚sT¨z^Ѝ¥ƒT/Aö,' t ÓÊ©5ŠPŒhz† t@ÐWÁ¯ƒúËhJX@ÖÝXéÜ7?£•&Œr'~òSέ¢à.КG®¬TD‘ AµÖ3TxÜ:€ƒ 4ã 8 äÓ=Žœõ Az pP‚Ÿ9hFírxs%=h€.œ µ•?&üf ó ]4À(Ù/–Œa@¡5¬«~ a¨# ‰$¬¶+ÿ”€ÁÆ$°± Ô€ 2hç8´  9x± ì 6–ª; P`õ«€Ø8Oä*‘,P˜1là>ºÀ«:p8/à  .À_ èhÀ ÐDQ‘8`YDÔGD€FÐA; thâ½ðTP ì—龊d£¸À‚”ð1T·z†3 48âuî NðÜ(ËÐsa ã è ÎX‘  t ˜¾7 Á"0]»PMw%PA>ä`ü) HÉ'0,ÃUàrH$LLåFJD€àÊ1‰Ø…;øX4>k7r ÿ–ƒ¡ |4¬„áPˆ *pá`p1Øoï:Ç27·pýÛ2^@ƒ – ÀÀN×ÝAˆÀ(8ëáÀ4Üt¸XºC;ˆ€"¾1Wƒtàë°àdˆ ë¸„ïØƒXÌcÁ| à2 ¨ÕEº‡¬@â î€ÑzÀ%<ƒÖ¸Ä* ‰lpƒIsF:Öfl †Ym1¸áŒo¸â£;‚Ê` %@8‰èM÷)¾q‚h¢Åø1Hp‚#ÏãÆ¹“©¦ ä°{ÖPŽ&7½àcÊ0 Y« ŸðP@   Ù`:Øô«Áz-= DÖ€ ' Pí0 Ö‰¨¥° F›§ÿ•šzå éÈË0 ຠP°&㚀®ÍÊp ßèap• À]³“Àˆp¯p(ð‚:@¶VѰ À èðÌ¢`°a`cÜhP³R*0À½à  ßÐ  í»»Peð"@åp P!Ã9 ðM*¥À  ëЄ© ±Ä òp ‰ø[fV÷*†Ÿ{ŒZå ú°lo¦6]1   ßÀ Z@¼åà €P ¡ÒàÎ!a à™€"½ð³@¹»»/Pxf¶ðäæ9² ”·²»ÜpÏ Póÿp 0w“âc—ÖàÖPÔ “* ò0R  çép Uq+Ò m;€¿ð ÖÀ —Àp.­ j³‰ ÜÀ àG+8 ê %ËpqªZ°ðã@2ðtǰ=àbÿ6F"š„@«Rž® «ÛO LÙ®$@¬à‚ÙàÏ ¬‰xzíf ày" -(ÉÜ 2Æ à° ê ­Ç@ ”3©ÃÀ “P ZJp PÏ 5pà° Ö€’p? Ô€ `=ógÛ0   æ€p¯ Ò (T  Ì p …˜ÇÐaZðs %@ÑÿgÌ0Ê7ðÔÐ yEÌP­ ‰ßP«?0 æ` Š0ÄP 7 Ni ñ àÃÒà(Ãr£ñ Ÿ"©û »éг%°Í`ç Тëª^²Uµa Ó0mp äp ߆;õ§€2ÀÂð ¼% Tå ÔÀ ‡M«çÀØrЊ gKÖZ{BQ?V û›I8 " œ­¶r þIX%ðZP?)ðe HJ t̘7:z PN@ÚZ`1p0C<ÎJ@Zà–q:ÊúÄAqE V@ÌñV$P¼%ÿ€GЯ˜¤J€‚;`-1£ª& 9€_w:°ÜD@1Ó)(OŠ Pð6ioÚ-* a°¹ fO@Þú­ò´©ÐÚ–Rö­;PЬp•ù!á“PFb†G F? €—UV PÐu¨cbB-ÞDzrP+7 étmÚ­²Á½ 7à“àÛÑ ­*8ÜhüJâ\¼³Äìù `;©Ý'ðÝe`\ n1I£Ýj.¦zP;`(L<=PŠp·£Š n0 ¶Þâ|è=›Çÿ¤jßТBde»“Ka£^¤R»#"b¤,PùJkA"@e0—„4p æ»$@ GÙhF»ÃB¨ƒDÄ»G2MÑ7=á1%a0pßõ€¿p[ß­@t™Gªds÷4$p”p]”H¬2]A$Ft%FS$¦;ð`O”Æ í$i§”õ=@fàRóV« °!ŸK†/ð·#îä‚:°B¾îR‡ÞºÐå”4KWN0À ™B"4ÆAfT£.‘ò%€&`7"ìpÜH µ"0Ðâfq&ÿ_?Ê’DAÄ*Ø]bH”®‘÷æAÐÎD»ãë¶^û¥GiKGjÇ."vñìK?Ô’Å •@à±:p¢‘+€³¹„+ÀC9  *Œö;Àh"$BÁÑRwbPÎs#DI¬sEÏdP6°b8€áÀ……B%€4uò‘º5À,0ö,À?*ã$”9a1( ¶¥N¤¶1€M°¶5 NuO'?ú+°0ÐÝe Ù0pƯ¢Ü¿@ \ º ¨lÅh-t÷,TXAûzo8K)O*ŒSw‚r ö#éUÓ]NòQóÿt'(”ADpLvra…ïýú*‡_Oý#Xäº aOšä:5„F}/L-Ä:íüòþ!€FŽ 2b Á 7`ÄH1!Ä'TœÈÀ!„ mذÂCˆ+lܰQBÀ^¼Äñ‡™5e¾(Q¥Dˆ…‰)|àÀ‡,„ðÀ !Dp”"„ %‹²H"‹(\ˆá‘§Èa²ð˜árƒJ„˜—áD–Y†N¸A‰$$É¿£ücáÿ0À¸ ˆ!À5"ˆ¶pGàzˆ^ˆÄ6Û5òpBŠ‚¸£ )‚¡xhbˆH`Áˆ­‡`­ƒh‚‡B@¢k#šp èŠÜ¾Á}¡êçRؼ‰ :˜ü5DOáģ•zÊqÇ}øý'˜~xí`Ýwç½wß: …QLIe”U☠’âc™#&R¡eUØÐ`“VH©… ¦È%‹vACT|`#RØð¡–>iÙÂyRfY%|˜¥ø\æÐàFJPA„3d‘Åô ó TŒbEè ”°V4`è@ Pu™”€w8UA":¼!ÿi0 ‚Ј+xàwx G?¸ÀwHà އFÀ°t£Ã1Ré°`°\î@?4Á,|ƒ!èpª&<‚DyàfØ5œjtxÄX0 ¤aˆtÂx†FäA .(•ïpá(Ÿ|íh_þè׿~·G>öÑ™>qFlÂyQHQ`‡Uá lÊ€õ| Sp ªÈB j‘…3D" ¦0)âàƒUTBŸ Å"‘ ‘mò¦ø„,ÁJdg-(Á T‘‰ 8"9H-(ÑäÀ85Bñ€ á o¨‚®à‚Pàj#ÿدš@#äAÈÚÐ%Œ( ¸/(ºGÁ¸Â€‚€ó €P…úá |AÔàl> ¥z4Ø@á…º;LÅsðÀ‘ L[`Ä2SL! g°ãÀt„àS°Ä†óS"OÁJÀ³° ˜`Ã8Ѓ­2" "èˆ M@`‚J º;¾Ô C¨B® y\`DcàÀ J †+Ü“Îzƒ0@¸À c¸Â\p…!”à FX•HÏÌÿ¾ÉWhÂAéà0¡PAÃèV°oä'_*˜Õ ǃ+>\ >~{h~ Mà@ˆk„¢ °«i¥sé¡·ßýX²T—2°‚/e Ny´óÇ.‰KÒ–@Øú!H‚\Ð ˆ€ ‡¹Ÿ”©ÈˆÈ€Ä €6ûs   Ý€ ‰0ø€ˆ€gñ1'`¸ ('{8 ¸_1‚‚XÜŸ øc¹ ØLA"ÜÂâ‚aY B¼ Ðj„*Øÿø€)¬H– 8´ˆp–C“€PP„Ø èÿšò ö{¿9¤ÃÌp€åˆÞ°ˆPó4ЉÀCï/Y/ñ@ˆ‰ðÈ È@˜‚(ÄKÛÃ> Il’özŠ"ˆ8Bô`Qi‚âà HÛ‹•!ƒ&Ð ‰˜{ñô ¹ˆ˜ÿ #¨ ˆ‘ñ(Á‰¸Åˆ¨ís¢ˆ¨©¹@ û?Ô+ЉÀÄX ÆÜ©Ãr4GÑCª¸’'QçØÏ û;F)žè̸@0¤€ ð€°€Ë`ÿ( P öb{4 r¹€`}Ì  A¹P’#Ñ©_¼°ŒOLˆP‚R(8 …S€‚:Ç’4É=Z½‹ IG?ºÀ5Ô úP‘°Fƒ¹ÀühÉœ€ÆþÈI×ÀŒà€J¡d˜©“DʤTÊ¥ûöýû•ঠ/îàéÓÐÁŠB,ÈôçÓ`~È©´ªS¡Q !C§×«Y· ÐQVàÒžVÁJø‹àN¸_¡¦å:ðmÓ«sPhI/Ú›|ö¨T(щâ€9“æ­StPRªT(ϧ tˆì‘CƒÓ§pˆAš Ž¯_³!ù ,Ûÿ(ðÆ ßNE(±£G š¤ HQ`…I榕(ÑÃAh c` ‚1d€PR†ˆ4ébÅêÖ­S–Àa²„ dÈè1`Ý¿£GëupòÁ1J¨ÐÑ‘æþíÛêh”Qâà(€N«¿}ÿè-=I±,‡0šJõ² í>þâ~­(@ºæ5s¶mAÖ¿på2PB¬Î n¡ó á7·½ìa¹ð ÄÙ86Œ›ÛÈs{ŠYW9 ¬éúü7ôàŠ2NŸ‚·ì˜:߯çeÄÚ~MÓÀ/`Á„ ãhðË\€$°j@åJDö&ýâðãGQ¤IW,K¡Ôôœ UŠ¿¦œ„‘…QÅ 4  d÷Yd¥´N8P@!ù ,æÿŒAƒ€I@ ³C‡%1JÜQB†Œ8¤H0€Á‚*à!ð†Œ%â(„Õ-V0uÉÁ€CÀÊ'`T¼AAοŸ@¥ ø!`Ç0r ¼ÁAξ§Oÿ9ÐC@;0z€q#`ýíû÷l¨@(Ž”úÑ!‡&MûÂŽ-[õ¶;Ò•J ]¨°bÉ=!`ۯǨhÖLÉ?¹‚{@x­Y9æ l›då1عfs!Ú¶jä]U 4ÑëÅwµ`¢Ò&]ØÁJº2 TC¦+EMÜž=QF¬XÐDmÊ(1¬q‰>þŒºÄ ¤',ñ£T(ó¡N•ÁpCàô8zŒ/Ñ ¾} í%Nß?~ÿþÕ$@@!ù ,éÿ(ð‡•% ‘ãÈ$-vœˆáÅ 2Jl A!A‚0è0qà %n”€qƒ]¬`Þbõ£DÉ1Vž€QâÇlÿ‚ µÂ!ÆD8p”P¡£‡OjÿöIõ·Ï †a8À°£ƒ1T‹ê¯ì>(E'Þ…BŽS¿Â€º¯,U«X'ªÓr‚Ú6iæ6е{6íÄhx™SàÙ°hdÍâ-Y*À1vÓ¦¡#&-2U´F'ªH 9e –|uà$H@ᶬ37«?è…‚ Z˜E[¦#wÕ«:2芃ƒÐZ8'A12ÞØÑÈkB‡^2ÍÉ@ N„çqlpS*T©ö¡rØ(q`ÎŒÚ4ØÏßfh‚2€_  €Ã(€Q!ù ,¤!ù ,¤!ù ,ðÿ( ‡Š P(ñCËV8 HC2J8à #F‚ øHPÆ@1JÄQƒÆJV·XÉÔ¥H‡)cȘ1¥ @üý:Ô\n$EڱĎ;v0¬çoŸÕÜü°¡¢Œ(0`pª¿ªX ô¨C • é‘y¢‡Y´ß´ä& \˜ÒÔõâÆlþ³h¹©¥(ÀY³Ò¢ÐôMÇÝ}ÿòn(M€¹h¤  )”Ëi×R´¢¤A´Ñ“¸FŒY3ãc¡P{¬ Ý쳘«&x¬Ìƒ^¥”vµí¤ÉîháF‡?¨Z > ‡Îwd7Üc%"B‰þ+`sÉ=U–È¡©T(û¥äpüþž'ü4 ` PùÇä5Ø‘@!ù ,ûÿÜaEG( ¢§CexØp"†-0€AKÄ€£Ä e~õbu‹•.%dÄ(!ƒ&ÍšýÛÉSSƒjâ¸QóG‚eÿö)Ý÷oR„Jà¨Äîóǵ© :(”™ä¡C9Z¹2u µÙVèr(`mXR®þ¼5‚8MÊé±»ÕßÚ§•$p¶LË9ÉîvôUÀ·#4Yk €Î‡¡ 8¢¡·y¡¤\™Xn=ÓQ`uh bȸñ AÊ’.Õ£‡H“;~ääÉ“2Ñ 6usðR*T©ê¥ˆ€€½fŒ4?~;w›ÞcìÀ±~=Ä€!ù ,¤!ù ,¤!ù ,¤!ù ,¤!ù ,¤!ù ,üÿ(°A3:äPˆã‡–:và HQ@ ÍžØp#Fƒ,HàÀbE7J”8rÄCÇ¥t±ºÅJ—&1Â8£DŒ 8È(±ÃA½H‘Â+ðcà 0PÞHñbh æùÛÇõߺ;dxÐAA€Œ”°£è¼þâþc— ‡€äXä`%”Êbä€ðvßÖ¹`pn‡€cÖÈ8Ay0=¸réÚ-ÇAÇ7¾•j #%ŒY1ïCìøó€g̰˜;ÒAG 7rÑÁeIýÓN]9Q Uku I(¥”¡"LTÑ>ÐÀ†FðÔIf- D$âP!ù ,¤!ù ,%ÿ( Ä+:NÀ(A°!Á$Ê(ÒÒ‡KÄ(ÁÁŒ1„Ä(  ( Â KÈcã™U4$!BÉ-V¬~ê*ƒfÙHe*5 ãŒ8LúGµª³?¹qÇ76Æáµ‡Žzìøá@‘¿}p÷ý[V GF\K”pP¡@„—10PˆàÆŽ (PÐóoŸ¿·ÿšaéaãÌ=B)ú¥hC rôL ¦ˆ…Í¡(ú÷r³º•Þà dÝ7aæJQhP¬]³hÃôJ÷ÌÜ­2¬Ë•œ•`MGÒÐ Û†ÃÐqhPáˆ:MmëÓÔÚ5l0fÎVbNOMåˆ8ÍA VÚU£†m\©òËM&e1@—N(°òÍ ÐçÀ@¡N)VÈ‘Ãj­-w^Aêц7·¤#  43M4à@A3Öœ"L/*™€"Ñ‚ßóL0'Ü@A)ºP@ÃFü"M4“Ähž]uX[8CM<€ƒH5 ¬—\ËШ•^? c…A\‘…eH;¬ÁTUQ%Y#áUc p ÑžuÆDD)¡”h)Z`p¥CÑi™L$aY D©K&…T£ °›nŠ–@!ù ,¤!ù ,ÿèaC=VJìÀÑAŽ"(2p (B†Å 0Ȉ Á€D1ð…Œ1nôèÁA‘.V·X½Ü1Ñb‰“7@`îŸOŸþŽxØ#†Œ=t”vÃÚ¿}PýÕ;ÒA†€Xœð‹[²Øžú»ÈPÁ4q(aE—¹i¬n„Ý7V*Õåz5(3 ]µeJæÖ-{V!s?:ˆÖë#7±c§v@M€5t #L¢ÀcºdÍ,£dÇ Ò‚U( 8ò]Á‚-l`Ïýè,J ½By`»ž’ÉD@)ã…æF­G¤Ñ£(qàè1àÛO D@Ô'¼‰²Ž rJ…*¥>Të­žœ_âF„øóÃ(ŸüIí 8P@!ù ,!ÿ£…2z””øq†MP0<(€C 1pT˜ A H@E8JÜ#ÆV¬nÅÔ¥‡ÃŽ0œ€cÁ† Pþ ÊmÀ¿Êl¸±#”• PöI•ú¯šQÁ“sbCišDõGvß?kz œWÀk HP@ Ý©ÿ¨¥!ðb‰=~ô(t¨PlŠË%°>~¼ŽPèK…*冯åÉ—h@Ÿ>ƒ 1¨SŒ_Ëÿï !ù ,$ÿ(Ä ÂLR" Z©?tôˆAPÀ Ð(!…20Ð Á‚%( ”! 2JÜ€¡ƒƒ]·Xé¼$å8`(A4Œ9HûÇ´©ž8J…ƒL3‰ xöoŸ×}þäP`)€ÂiôÀA…Ž ¸‚õGWÔ yÁ¡L© &YqÖ•®¿bɺÀ.”ƒVЕú¡NQ³Â†íF˜[Ú4qÃF,.æÃ‰Àñc[Z‰ ¤ÁëP@®á°wUô\`‡ƒI£KG;x,ÁuR¡ ;E¤òå¹uï œM€3"¥ˆmppJ×sÃÅÉJLð¢ƒ;8 ü¬f‚=Z–À±#&Û2M]Q@ÌÉÀA¥„RJ¡BÅô_ 0ÐÀ„.È @eHÑôu8P@!ù ,¤!ù ,,-ÿH° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹)Õ@G‰%0ŠI²¤É“(Sª4X… :NÀ(!#äÊ›8sêÜÉÓä%nxœ dÏ£H“*]JŽ¢ kJeJµªÕ«Hwì¨yƒ¦×šXÊKV"…1Š~¥Y¶­Û·bMâCêZ¸xóêÕ™ŽU„§Q¿îL¸ðÅ]íÚ5̸±cƒ?¦]+ã±å˃‡!JÙ&æÏ ÇöxjèÓ¨©ÃÀYq !4pKŒÔLW$qa`‡nàŽÀà£qÅ<ì8‘Cø@$Cjˆ˜ƒÄ ™b´M±·Á*R¬ÿ©#Œ€γ;ô W«Z×B¤¸~#­êK¾xÈ↠õi×éõT™ŽÄF•í– 8@˜  *x ] 7Ü@‚ Å€ ;ÜwP `˜ \-–\ ØÀÛu`_‡ê]Xã@6 ô”E€¥P=€€Á@Úˆ_ Iã“é–ß@€eŽSbé¤;P€}6b¹PehWA8ð¥v9È—D°vP@!Ý¢z2t³éåÚbÄ7ßJPSFÑhâÀΈ‚”J*C]4P©5?°UÙ‰”ÞwC½4S@)ÒDp~u t©@pÿÍ)LJ ¡@–Ö©ŽÙ%xb Ò„ƒÚ±ºk„ž!A;4°Ì0 <µ¬zʺÊRѰ²€.Øp#\J¡•(M:ÍPðÂËpà 1`tÉ ÃÍ7¡P°'\ƒz–¤ ƒM|SJ`€ /m ªt1 7Ø)À'í3Î4@\ÐÁ )­ÌAÂP3À-à$PÇ2TLC¿eG&æA4ðÖ£ä¼Á0T\ƒ ŒƒÅxAv1 t:PŠ9=ÜL‚Ö4I\B À”ÐÁ P+õaŠ&Ô×A$@ÿp‚ }‡¤ÑÔ[7,PÆ“˜¡°¢‡4Ù@ðT›ÜÅ0Õ\ã@ JSJ(ê Ã@·F`Í2Gè¡„dÅ]ü: 6ÏPƒlÐË7ÜüÖP#M4ÒA(û2£ãe˜F§\c 3ÙÓ`ƒM)D0 7ÔXM§”“Œ9Ä\€Á3¬Š4!íà5š9ˆ-À?cÍ3G8.€€3~Q7PãÓ€NQcp#C5 +TC Øé~‘%TCøA5ÁM쫸ŠÀ2œáŒoè"Ѝ†¸´Bj˜CÇÂ@ªñ i@¡š¸F2ÿ¸q ·AáܰF(.@ Lã èA€[ £gçÒN Œj8 > À@ž!ˆ †3äp„€eK„INÐ kl€À†5  ¾hbšÅ:&…tˆbºPb!Y¡küÂslÆ3à€_X£ê8Å7~…P„èX9Š¡…uHãTì8… ÃÀlü"šÁ* ˆr(¬âÂÐŽclÀÅÀ0°á-¤C"øF1HàŒg̬rЃ:¬@oÜb¿ÀÆ䧉o!h`JQ`¡/: F0À(v¸Arh7–qMXH˜F3°ÿƒpÃ|”ÆJÑM„Az(€2¸q=è8¨€'K œÂæ8Å£@¹”ÝàİÆFw@ƒ˜ã ø—@8pŒm|C“È C€¤€Ü Upz €kʨÆ e@=ÀF¢ŠSrÑ8X  `Ü5 ÊØÔQ¡ÐƒfP£ëƒ1•0fLc¬Ø†(°…U£HkPü§Œ”¦ŒK÷Ñ!:´0p9@ è Â/ª1=´ƒ“F:(®ì€¡&5àÈÑ9Qt?`+¸q€g4çë…"ž± 4 ¦ê@÷œ±_P;HÀ3–Ñ€ÿXAaÀ$ÐQ‚R|£À+ffŽaè‰ÑŠÆ2¾è=XR¨ …^¥ƒ£“Á¤‘ªI9'$GÀi¢™î+p€&$pƒ¨ã–A $µP؆nW,V°£Ñp+bÀ€d”1ZÁhF µÀ x V0‡€Ž㔬r°S$ÀºÀ)¶±²æÝóU1ˆÝv™(̬Áx†2¦1ÜI°£™Ïøc¹Ñ%@–zøF­à Lôt³œ9ÁI  ÿ °.à?b¤´&$`ź&ÂxOÆd¥Ò!ßj§ˆÀ4ÑŒt Ãÿ»t^ðs§tAeÀ€†"©À€Ã©bÐf\c °˜”²”zåèAlŨ`ØÐEµ^€SøöÐS Y +lãü=Eó´°%X¡G0Ç$PÝ`0cÁÜ Ö1À wèAéÐDÄ…Öp@9%êg›ŽÈÖ pŽP =``—ë¨ñŒTÀÆ›ÄU5Q€h¡àbÀ¾¡ –I£‡øÁ}™‘Òì€ÍøF5tE8¯ƒVo4ˆñÅ ÈÁ(Ç0 °ƒ8Cè€Ì ÙZz߈@ „Û€2(͸x$™è”@aÿèA0Zü§I£ä¹À1¬A¤ Û; :  ¿pIP Bð6j^½`·ø‡npÓlœ"‰ÄÀ œQŽr<ãeàÆøâ`˜ÃÛ¸E‚ú¨hý‚›ò‚Ö™,gÀ”·ø':¢Öm8 hNÀ$¾Q»m`@éÈsˆnÀ(È£ @ÒÁCnܳ 0G3ð ø6\Å@7¨}À MT€· Ç)¼4æ{ §Kš˜‡0ðƒ ô¢Ø;ª IŽ2#Û Fp j¤#ÓЄ¾¶/Bol.v®KD  ÇÔ³K¢aŽo˜ƒøA†áŽˆ D+ÿ;¶1 "´ãÚ8G1:ÐŒãâ7Hª9Ì ,Ð¥èFWÀ1x±€òž@ aóJ ¼¡aÀ3:p8€JðVr%ÀΠ ÇRpG°JpHJ ?0‚+ceÀ$ «#J°%‚r €À Çð((&\u/e°WX°ð»„zÐ2ðr`!"€.(54 èfe“‚!@9'e"G@Pr 6zp'@G =790€%Ѐ‰fl”&¬  nÄ*1`‚Æ"%ÐP 4ð5Pe ‡?ÿ@Pïtˆ?`ˆP€? @XtÁŒq'Úá‰QdBPð¿V"€&÷ñð*!.²h€ˆX‹¢!³¬1Œ ‹9ó4r!¬qŠ#;]Â é° CVƒ€VBÁ¨"Pб!¡5Ð0¢6pBqÃkc'в6 àC¢0‹€ÜA1$×V^)Ù"‹†à±ÂŠr² Py$‹† ø·¢3¥éQ: Ba9²7 N’Rù‘4ù$'ÿ) uÁ4’ ˜wˆA¡r8ø7#Ùaâ„ù±+±%:™:!M Vx88€2÷AiDù$4P¯B)à’R„g¿Ð j© ÁP! qµ#HB—"  ø§7 "`^!)&A˜4Ò‹"ð?Ò$tØq˜ И,Y%9% %6ðM ÿ’Q#Ðg2ÐŽ *;°§ð°›Ã0:÷¢ˆ*à— * 0)+p*àY#0SÐ-À!½Éœ7Ð^PE  @º ‡Ó›ê¡0à›E÷’¦È›Üÿ $¹Ä™Éâ„RÀ$–ì鄯–1ð•©,;ðb8à<À5@.ÐAàÞ!5ÞÁŽ©y Z_9ìù` Ù‘Üñ†$) : a ïÉJ ˆ $`PÀ©ù7sT ÿ°0ºÿÀA*ur©°—"€£Ó(à µ0 ¤À * xy—P>P Hz-À::â¤;*9š;š”‡ã£Â¥ZºRëø$ÍòC`<°p§1p(³tª4p!‘§8`yºPoÀðAàN`Ž)Yÿ©•7“§(cpZ¨»Q¨5Y©§Œz< Æq©‹J€yú2ð W`(C0 ½0'êÑ à¢ûàþ £ÁP™Hšƒ‘È9KÞ'Y€É™"YÀ©À°  Yà"à[P:€KP˜° >à¤`+`Ò:òÁB°Y…-@®Y:ð1°ô:"[  @œhÎ\E4`!°8! 0WpA`F±AM0$€KkMà%0M±KMyPF A`N0Cp,ÐAÐ+ÿ[,бCÀ@±MÀ< Mð±0´‹¡<à[)àÿ  #À àGëw ëHð æðO“†!ö6«/j«¸E¡9@ ¨ £° Fz¨ð ¸p­° £ l  Ð ¤ • SP f »ð¯¤àq° ¤ÀEP ¨0 ¹ÀÀ¨  ²° 'à«Ð –;"°1 /°b… ª  q >ð ¨ £P²ˆÄ}ú'§6à+`¨nºUp†`t@0wPðW°wpoàcpWð<ðy0)ðyÿ`¼iÐAptp00wyG¾oð‰  æð~@op<àà›jÀ`†ðo #ài¼†`àjÐÔËm¾tph“P Xàn²7`¶µz«ÿ«»ú£À›`Œ° °I²ë‡@ B€»ð·› *° ¨àQ  ðZ ÅŠ Y€ S¹ [ ð ¤ ™Ð -0¹0 ›0Ž Ôº:™Ø± P ±àI Œà9)ðD 8C opMp7p`@à\ÁwÿðAÐRà~:à¿pyÀ<Ð/ûA`Ø À6`¨ïëôkj ¼l.@c ½c`–HàWC@Ë Œ½yAÑk i@àô;þ[Ì`† ~B` KÇ3Ò m"À:–fk«(ÌAµù.|›03¬‘ ¤ ¨à˜` ð¸À@»à¦ Q° IllÀq àÏ>€ gsÐ '0 4,­0! s0l0 B ”Ð ­B [ Y@ LÀ‡€ ¦à-2 *šM0}$oÿ%@¼\Kì‹ð0=Àwð°FÐú+Ìiðñi`À$À½ì'àËp`±š¼†ª¬ Ët0‚ÐlFF€,€c@#ÐoCi ;—½œÖ.л¢Iw0ÿqÓšP ÀwðÕE«h›Â寙–áÂh äœ B° sPÏ©Œ À—«›0 `L '´0>P [° °¤`¸>@ Œà² ¸¦€¤m5  ›PvÐÆ€– f»«``ª `"`J<õQôؘO½2Ww´ˆÿl: ÀÅœÐt pF-Öè[KóÉ.§åë-²ðjEm+0ÔÖWàAÀ´ìÞ\à.à"ÌYÀÎÈ#0àAp>6†pÕ¤z Z×°N4© €Ø(œ«5z9€ h v  p© qк>0«  ° q H*™  -P¦` ›ðÃB€ KàfB ²@ £;Y  ¨€Î:@In¹Ž  9ú—v@ £ Û£€ ™€ Q í  €šÍ$ o  àWðMp·ÀÉÿë |¾ó›!P Àñí|.p¨NÐk”¾jÀHð¾н°ìÿ›êÛРàmš¼wÐÉ(PqM€Ap¾iðá€t`jê)iÐ×N§° ÍÐB8):À*Ž«‹Í«{‘…Àg0Åš·Àg0Ôš”sçg`q0‡vçs€ ÅYE ±qÀ9À÷J s@° sÀ°hÝé—)shP hÐ"Ðh‡0ß7mÍS4) )PÉ@ 0NUWÀÀ|6°Ê`PUÐ) iÿÐÊM™³WP.WP±W 7--ÏÐU0 Pæ tðÇ; ê;?6ðHp%Oªq£cÐ1 ó7oÓ‡^`` RŠ`Ÿ0  0å?Læ!ðŠ/`š±dþ…Pò†`ŠÍ/–?!Q]p<\O»!p!§Zë.ð¾ÐÐt¾ð¢y»¼ñ0y©¥_¨+°0È~Àà/ÉŽ) ¦jPÿoÐð7ªN¸ýZ9üª 7 Z ž#êì/£ŠM:Òž sŒÍ:`+€Ÿ±"‡‡,Tœhq"Ä TÜhbÇ 8tÈÀ¡A„Eæ0q#Ä ‡ Cxh1gJ‰*¼„) F‡:nLÁâÆD$Jè!#ÆÐ˜/7ðCÀ ,XàHуC0C@à Á¢Š,lÆHŠ6^Ú¸‘S@ÎX¤x¹B®L·^n0RÅÅŠ^¾UzC€\’J«\qâℌ—S¤¼¶Z™h  Qà ”E{48õOô?ÿ†èQTõjÖ­]¿†›1c¥/Ò•Þ¦ ³vÌÝ+èF^ "ƒÕ·•—¹{õnÜÌé*‡I£hs£6ļp]¦ŒÖsO_úœ·mñ46\ÐüË íBß Üùí?yËxADÓ¤ýü¡„Œ-@$p¹Ö¨Ã<çX‹á¡õ`ÒA…_ƒŽ¼U«!Ø2ÓM†û®BðD|©¸(ü.þsmÁab„" ‘F.Ä1Gwä±G2ÈwÛA#NH%—d²I'Ÿ„òÂÚ`¸J*YŒ2K-·ä²K/—²²Ê/¡ !ù ,(ÝÉ”!° Áƒ*\Ȱ¡Ã‡#JœH±¢E„0bu`гhSäÜêÕ«@X¤+—(Ù‚2häÝKC'Ù¶a þ{7(á¡»Þìz˜pP¡º½¹0AĘ?®üX±ÀÌ“ƒº=ì¹3cÄ!ù ,¤!ù ,¤!ù ,¤!ù ,¤!ù ,â2ÿ(P†’2ev”èA°a HL€€ R¬—Ç_·blø#Àº(QîÛ 0FŒ=tôøQÝ¿}8ýÑ1Ɔ à(î¦?ÿêÀ(D™R¥†…PtßÑ;îp Kž²fߨ´ŠT)F\ͰíÔ7£ey ØÑ@6 ¤{K6)7ÜB×aÀ5]|ýíÃ*w++wÍš©ë`®_À‚³éŠ6)@Õ«Yç6è5.À5oâÄÊc zza òc€ºHQÖëpÑe…7èØ g’qãŠN Œ!ƒ¡7*8pzGzرCÇ 8œgL! „Œà0”ËIPû0ž žñâòûõ³Û'!ù ,¤!ù ,æ.ÿHP€Ž‚ t °aÂt‘ D®•;' 2 B„XÂC IÜðP$ `À@9pG6oìð0CH(Pˆ!ãgÍ(UšBd 1n”ˆñT@H&ýêÅuë“?ŸŠ•!vä×þ©]kà ?pРÑc.]Pqþ@íß¾¿¡p¨È,ƒO.Á €}÷ù›¼¯í[m•°:ò+-vÜ &'@5¿“ýí ‘Ù6 +Ò* G– Ö²=3cjÊ– ý`5Ížøeî€g¢ýVÍZà³fʘÓÂ-T€cí¨QÝCGLÚôÕn9°6ÌA„gߨÕH Œ+Z œ–L¹ú²tVt€"ôôâ@ PpÓÌ-ÎÈáÔ¹%"Èé`ÁA@±Ì3ÇœYj« &@CÉ É7Î8°ƒ 0lp@ð…šdè½õU%ü’Ìà =èpÄÖüãÏZþ°†ƒUO5äT' ”š(2É–“L$•8‘EÖH(ÉPA¸çÞ@! 0ÖX"ɰƒN7è ÃeVA–›mTJ'ä0Sž|Ve”C7ÀðD}6êУVúèŸ!ù ,¤!ù ,¤!ù ,¤!ù ,¤!ù ,¤!ù ,ð0§Hp Œ‚*,¡¡ #BtøP¢D‡3Zx÷i½ñ+%n–­kFlƒ]¼þö­5(`9ÍÔ6|±Þ­% Ðœ–ªUλX7Mœ¡”Ós£ÀaÒ˜©•8ÑA‰¹0 êŽN\ZÀƒ0``‹ÆêÂkÞ˜ph¹ÁM³i'Ž+f+pÇL 0([ù®bÌn”W¸#ÇŽ¹Ö°^õ×;(I29„Ñ4‰þ¤I:`Ž?¡b¦ LAD“@*À€‚LípƒêÀUHÜÀŸMUƒ…À1ÑŒiHW!:d"… •!ù ,¤!ù ,ï.ÿ(C@Áƒb$\8°¡Ã‡#.Dˆ†‹*CF ?–Èq‚dŽ7@”hhq¢È0tìèñcÇŽ+7ÜÒc‰ ‚HPÀ qƸC¤]¿zI¦©BÁ‡%bĈ@¡i "ÿŠ5àÇÀôÁa’?:ü¨çoŸÝÜ ôhXA/P[ ‡týÕý÷m€Ù̳ ڱP½rÌU¼8ïއô4x–NYºf/nüX ‡oȈMZ€Pß\Ôû§x^½/x@N† ¤  iÕ¾¹9Xâo™)X0i”ݽÿmªÐcc ž‚’ Ú2æè¾sŽ>]  rDÓâ@W©XCtâ‘gÄÆ \  lÞx­É ôð“:|$þ…åc”7Nytà 7üƒ"“h¢IŒm`€aŠ%$ "e7A8à€ ‰„cH?퀃'Ý AåˆRYe 'd©”)ôSŽ7\Ä¢Dd–¹SDWÈ!ù ,¤!ù ,û.ÿ1° @1*\Ȱ¡@‚ „! ¡B%0j,‘Ɖ 7bŒ!ãÇŽ:zô¸8#G $( 3ˆGf„)'˜®^@AáðÐeŒ?4ûÇ´©&8IfLùã@²û²îó7ÉÁ%2–`P Ä€eXýùÛ÷oRœ=d€øqk˜œh·ªmë34¦m‹¦J±´kÛ¾`Î&uDH[6 ±?¾;&•»À ÜÁ¤CÌVÑ[Mß6<ÞÀY³Êz/wýšÎä7iÁÖ¹!fùŸiœtT°²,Z)yÕÊöŠlŒ p(<ñïà1<ÀÐñãÇÙ—›ÎKny† ’¬hš¤i½&"%rºÔÈÁƒö ”(6F 5ìƒ*è@‘Dõ 7œà`TäA1Àà‘ :¤¡†íg‘!ù ,¤!ù ,û. ÿHP Œ‚ÆHȰ!Á…<Èp!Œˆ'– Ø0Ç ˆel)á=tìØñ#ÈŒDÊ$¹qà äÌÉAÆKŠ4gÊ8¹ƒ–_½’ö †…HBiFHÀ@À^ÿ²jí• ‡B;bÆ(ãÆÊ2v(ê¥ K€[ÿöÉÝ÷Oƒ°{ʈ¡A‚%”H£V •Sqýù£«««%ê=šNýRbÇ ²+•xqݻܠÆíY:= ˜µëUm2„úŠô>ÅŒ œ´ˆ€hÒ«6@ :(%8bÅ Y80_´šÕ´ž$ Ø .HDÀ‘A Öw;ˆï`@@à8u ¸Áÿ0à¸`@:˜œÞ—¼Ôï‰%€¢ 5"B` “ |À9 š@. ƒ dPH)äðp  ¹…^PÄ ~SDI4Pƒ”`\Ž4 @¶1jˆÈÖn'i® Û€¡eú¸tò“ž å—1œ1%f„uÀ’¡€BAH €q Çi0ƒ:)€qG¸*c4ó™ÎŒÅ|䃇tÒ*f|  ¾†”pqä0âȇ|!rSHtp?t@2šŽpEì` çˆ ÿ…sˆaÌ@p4°3à8EvàN¬`q×tQ ² D¢ ¦ÈCÖ· ‚˜!ˆ)"$$„ ¡ÅBz`” ™ É&A á;ÜS y˜cB\ 0€áB² SÔ€xB6°p)IaADP›jm åØ" I Hu ˆ¶(¿ÍQ|â[Ÿ@(€¨u 7À⎠<„„c9Æ(€W„ƒ(A*ÄU×°eÚÊØþIó±&Ò* B‹LDÈ‚.Z XÖ•˜%*ŠÀ,Aª˜l-‚ŒT ©@.6‚ÿh@ ¸¡ÒUdâ¶Q©v)Ü€5ˆ"þÀù äAÀòƒƒ ,Ø@ò‚è>N!~ ˆñS‚„wÎ%H#¤ Á¨ajNÇ0†Ç± –©€UrŒ¨-ÜÈ3bŽ[ÐR ؆@h°MÁðªÎÉE€@}É[¢@‰ƒÀPæÀÈ*=©•–¡(‡@ŒÐRΨ%m9à …7¸ç-|Ø?ø5³„)* TÀœ ¬HHàÇäÑÁÎPÑLL¡µq„ªI$L€Ë°DD¶°¡À­Õ“<43ÿkÑ hнòes%gAÀÍø à¾==£Ô°àm¦A<€hpèP,Ñ é¦/øz‰Í̦S BäÒþ´@ÜàWp,ñx h|K06Gþ ƒÈ2 b¾d±±Ì…=¾&ªtÜ8Y O ôWz¸ˆ8%‚8@±Æf]ôB\:Á@, Ààk‘ ª÷`híp€å‚õ·m÷[²ÍŒ€ª˜ƒ@z}?xn0Pž§±ìÜ`™±{Ü,X FÃ…4b¥ô@<-#|L½ÀÙ@˜ª ÙÃî6pƒ h» °ÿÃ8 hP°*„¼È3ƽˆ¸—ä!ÁÌø,ð~«VA@à€V„·c@÷n@ž/' ðZ¤ €[}pb-°\bX²dt€€KDs@*€TÀ2À2 ã[ã:»Z+€dQad€è 7po4‘È´ÈÀða7ÈÕ?«ÌÀêž t €À•ü(€«¡`…mEëÁÐÚÉ Ü|0ȳ V/Io° Ûwí»¦   U‡§ pÀ`f®ïjB¬ßú¸BäÊ€z¾®·«~ÀÝxÆÛý@€ÃUst¾` ¶¿ÂcYžÇÓÿÅ ‚ÜP+òλ§ < ƒöc^•惧¿ŸOå=Ï`¶&aAf8ÿ ¤`L#Ö³A(qE,úÃ>\òRH„p@d/Òw!`zA,$D|*48E,7 9°>]#6@Bý†<%ÐZXâxÀr‹c8”E)àAÝ“«ÇM®w0‡åIé%òsrŽÓ,;8\þ'ôI˜-î´>ɳ„u¶~@ð‘ózñ2ÅRA¨þ€Qärÿ×}\W|+´MúW†+”@”†2d‚n¥y; VíC]×Vuø€TÈ„3„ÿ£V¿Ò4á”@6MsÔZ×!Ð7`ÊÿĈéÅ?9Ð,9zxO-Y’?' >(0‚T†ä\¦×,Ï”gØVžV>ªäˆÎôL«wC±Xƒ‹EuX#÷89d¥ã\JÈ>¼ÖpxàDXb?¡XÍÒðq£±€i؇3‘×,48h‚M#CØŒ¢Heè/p @ræh‚ì“aúÓ‡0 CÇA8b1ðP0 9({ý'Œ m¹,ûWãlÐfv7G/p90‰¿u_óqßöm¨w•(ÐLa£Q¥#€*àk„øXHÅRÃÅ) 9,É’„“¤8G$““%Nÿ B`iMÀ÷•;ø+âs,“+ðˆŒÕˆ‰×;Á’ÛzÜW½…He6à\:°p€(=ð}n¥B¨Éò+\2ŽØvBWŽÅXC,|O: !Ddi€!dwtO{؇çx#·5˜‘"€Tl–d¤p[""ÐZ)Žc œµDp[@„¨­ua!€R¡M0+00ésÀu[*Ð=°“þFš!0‚6D»ˆ^Ž3…l–%•Öšhwp_ž^ÀT÷hFµ9r°$ #wðtæi@# lÖ=YB#=Qÿ$pÃ(ÀTž6]ÉéJbKY2o1°@P(Їà0P¨“xV´8pA•aTø¨è‡‡Ÿ[D àDÓ4PêL%ò40à[„A¡Põè8Z?õ8CÁ2o5Rvà Lp[Ÿ –ÅS L f%J‘5!• Eðø–€î‹Pd1¤@J죒°}Yâ,°nø#72%W ;Ÿv–æ¥j0à¥%h;Ó%0  ëÃVZ7…Z– ‘°v®‰)!0ˆ6O,i;pN`i9Õ8Pá° S4Åpá%T}Fh˜S>ELäEiª¥à¥æ…žaá•~`GtŒz_CSU0]ƒ^0<à]ÿ›k04 ðvk4NñF!¦Q˰ F+ `IëÔ†\²O¶ôJ «qJ‰%p¦µðe0LZ0>´´P ¦†X±lqMøx#0QY Îʬ&eÒc ªÐZåZ¯¤ÔLî*Ü*P£[õ&îÊ¡¥¸> Q ‘[´*®¤°™g@ЕžFtðo ,°~jP°“à°y@Ðq)pOtú8iš+µg{è)»2å°)ÀžÓL9u9%2;Ùä.¦%M+0^‡ÖÓ•±À×8 TN88[ÿ”¤ Q p èmvIŠ×%)`Õª¤J:XaIXGÇÀÕõCGDàà KÄIÔ Gã@b@ÀQPLp ÿ»r‘g¬p;QH&™p¦€ Kæ•y¸jÖ¤¨ài¥å*H¶@ú– g P&x[ QÀ•¤ÀÃÑZ•PÃB@f*°ÍÂg°•F5p_kqSÙ”¦50]+³p TLµ`¦ —S1 »P¼àN ’L5ÙäF.°õå“ðu\„Fq2ëg¶oš_/г#i[mÚ  ‡siÿ+FÛ¦ y“PGÀ€È¸>'ðm®Ä ŸK@;à0 €®¤ʶc¦† pm¬ûCqK $ÿË8;p’Š#PSR£®–;œQ ̬€ 8À*u£ƒ› jv”[ÂÁE9 ¤ £€ -ðášE„ÊÊd'Ä<+ÀRn@*ÐiYœQpM;Åä)äEžkZA ³h²›yý¼!›h€Åq°AÆÙå÷üÛEgj æÃгÇp÷,Åti §’ ÁÉePùD î°D°Úö¾ëK]PÙ  B S@ÿp ¢Ê?–WJpð¿PÚP%nPŸ`­ª  ƒtlC+X*`ø «HUŽ8# QÅ,Í›€ ­f ÐQð × #¥õº¤1-PM§…Z˜¥Eð *e®` *¥0°@`%ý:o]­©#òpu; ,ÐLmY^±]~:Ù Tšy_o`~Pàij@ uL…ÙohUÀäµÑÅÏÒlœ±aF~à§,P‰æÚ§;•¦),~ÐypÀå~@hé”SR£ åÐUÁÉE ©¼“ñ «,õ`¢:CM4ÀTóÿ°-D…R£AÄR¦f „€kšðÓ Ždj:°°šÀÀ æÀ àÀ}OÍ¢ àH£ŒËŽ0C•Ð鈶‚!ð$p¾°Ýó%ðƒ2”<‡ Š‹ÊqÈRi#@60NvAâ£:ÎEIÀÑ¡´À{'`^E0áè,7°@õ·`ȳ…¡È@ˆ'ÿ€Îå§$w&8Vñ§´EJh;yx>%jõHà;bÝ®Žx5ÿMÿãsHAèx”p5ñFx> VKˆ<«wrPI/€T4`86z YE”?‹¨@ÝIâJGJ+Py¡Ô,×uíè¾]6 ä€Ö,ænîF%J4×d@%p],À{ž¹JþZítÈ,ÝÔMÕn8ée„ˆ¯~T8D`›Æqn°wxü– ç…¡–X”x±m¶F€ÇwM©~Õ5Òí~_ga8„øùÃïÁ‘cH“ÿ-±¨/Ÿ÷]#iàöŽÄBŠ4H‰Û/ÿÐpd‰É÷%>gµÿ/k8í ÿ/‡5íÀ„ì<›,”“þ7Ð@¹3‚ËãˆC@ x£B2<|H ˆ&T8C€ÃŠ=~ôȢȇ"žÜX¥Œc´¬¨rãÌ'b¤™SçNž=}þTèP¢EEš´£)`ØxÉRªÊ…o”̉ã’;RÐPQ‘ã 7V”XBÀ ÚÒPkC£N'®>-AB€Þœ%<„ø8Dˆ°%=Ôø*L$7f8PrdÊP”È«âïdÎÏ®ð÷!åΜó Ì CÌ‘J]·.)ÓdG’ÿ5¶EýZ÷nÞ½}ÿ\§)JØÈùR@8rÀ"ÅU"4‘"{q¦ÀiÃfraÛ:ð¹NµaÝ—X~ŠŠ¬ÑÖÆ~äùýÓø/@ô/­Â²ûJ@ dpA é ƒ(7áz:I&¬°b©#Ù*´ § G$±DOD(î ¢jª+ò"*ê"Šæ¡Sôª@§ËV¸¢·l#ï…ô^@2=^X²I&‘4²4„Pm²*º ¹õŽ K# S”¬#ÚÌfC©L5‰ÄÍL7ß„3N9!2 F¶Ô)g~èà°B叿¬èÿ"aN ?ÏÑD€r*råûF 3(Ò6=Ê ¥!8%5TS#›³DÚÒh®T_…5VY‡2€Ñ°š©6  ¢b@Ax ‡ª&€ ¨ˆ—‡´)#š^*@‡Œ2uéDO1ÍvÛ¡D}Õ[Xu¥­ÜŽDwVu×e÷Õ:¸s&« Úæ0Àχè@ÒmŠ«hXëHÜvFX[·ìs5a‡†øµZ Ãö#|Ùk*J€‚IˆÔ]víWX=‚ƒ#f¹åÑ­Øe™gvùÝxÉ=´#@8™˜”ðYtNj˜OiF:éVeXi§Ÿ^wâ[u2úÿ¡ zˆ ­Š‚y( bÀƒið@˜à™Iîèk52j¹†9î¹ïÆ8›ûûH˜K $9ä@Yj·È-5€ÛÈvƒ8CÌR r°S³*Pž‘Ô /©Ñ ÕOWÅàô9AdPŸÀ€’a (Ò‘DĨN<Æ5ˆ” KYHúF€àb°6"`ÍBäcâ²Ô¿*‚ `@1 D¨ÏœHCèÕ €€€vUF“(„â ¨@nZT€Y‰@ pÄ: %GÌ‘Ä6ZÇ€0À@ZKȇp`RÀÆC0Àx uyHXŽ C=äCµiMq ƒ œ´­ä¬j0°ƒ4ÃP;È)ÿ(Pnà@¬ÓÆ´‘RtH- ’Ĭ2šÐZbVû @reÒD®â`¤04]) "àĈQë@"°‘%Š#pÐ ‘¯Ýñ$í\å³A„À@ Úˆ/›’äyœµîLÀufÔ¼¿À8.ÔdY¢¾v`Õ_ à7ì8ÊðΛ‚DAœjhB­ØøÆPÀq t¤P‰† p”`!Æ8~ ò>ddÆ7âÎ0€Ô`Ào©¶2äTÎPB¿†1)üëªÄBÛUË0ÖWã!#6Ô\, wúTÊxH†ÿq LãÇ’ KÖᎀÑÅ(Å^º`äœ| «I‚!° ìQÇ0`8(,×ciZ¨@Aäõ]PÃP€“h…j"ܰƠò/ 2­64‘Xƒ&$9º¬¡ …ihñ›yÆ2¸á3- ÔPDZQŽª €Ï@´|èí s¯y‰(E' @ ÖÌÙºÀ3B‡á´8×G$øÒâC&€AøYLņ³ ç'¾³'Â`‡n!(AÇ"KTê³0-ÃR+GZÈQEÆšŽh±$øD6à'Y‘zq}Ç-/ÓX˜D:~ÀÿaðošW¶ZÁ-•Ž’ë!õ%Á hüCi­"!-Àx­ð -b¡DHš/œ´ÓÎQ‡"F ÿjÀIàŌW„7ŒtÐ06`‰Qˆ; †CÄÛˆ·(@ ì÷!ƒ{HHëëçiw9HäÊlpcI‡H<uTãøÞÁŒ Â,lX!ܘ¦³Ѓi«²¾Üt½µ?äÖéQñõf.RR 8œ ·/¬ ÐDrçŠü †¥ö¾Ýøï ?¤à•ÔA†úûˆä ð1‚í‘Håüþþ2×&°åÓõõé5~åÓÀCÿ$Û0 9~`@ŽæKí=óC¬#Ô¨’À}ÈÇz@oDŠˆ;I+0 sl ÔèEÍRôŠ ™ZÃ}ˆüÔÀÈ;ÝÁP’fø›Ë%5 îÔDˉt@›Uô²¯ÙèehÊ,¹•9™nð“Å/¸JŒ™”( Ø9ÉújpÀ ¸‘jH78¤Ž8e¨†À–eøI"ÉDˆ"ˆCE¸°˜†lØ)‡•)‰aÔBІsÐÖÄJ‡BsX’‡Ð¢f¨‡r1Âjø Èg˜g ‚–rð±8kª)8?³”& 6°º=+6Ò"* ”±áì02/8åÉ (xèˆr±ŠàÈŠ4E`–Y‡Z»Ot¸$úÌ% 3]€ÌÒw<€: ¼ u´ÂÿNÓÍHoZÖø;`7Ò+ƒŸL,„Ô  êˆãKÐ,‰4)~q2º‚¾Ð'+øOr6ˆ¸4`D¾`Äé‡h‰9‚oâ˜x¨˜€ÉŠhÎÊ)¾ˆ·#­ˆ^éLÌ9¬‹¥‡x€î J+ì|!š—L;ˆ`†=邈P ¿B €‰G_•"(@ð¦r‹§Ã€ [ ˆˆ7è¼8¾(|ˆ@ë/ÖPG"T'ȃuœ åP<¨ÕØ€F=Å@/Ñ" Óß9*A•S]Ç0¡ uÌ*•H³¨0ª-™Ñ°ˆªY-,¡¨HŠëÕÿj‰…¨‰C- a}ÍÜçè— ³à¸°”¹ÈQg}) q‰€ “}MÃÙTµC‡fx€ƒÜןª°å Ø8ÔM= æÈ‘6ªœ}B8c¶I9P¬‡¨‹xˆ¯`Xð€hEÙ¬-èx‰‡òÕ Úˆ“²©Cz­Ž@Ô¢YlQ-:X¸²¼‚ˆ±)‹zýâ #ê '  ’ÀûX"ÙR¢£…¥“æ!¤“X$ªP:“ ˆ`°8Õ¢üp¨‹»D\Prrø’£a r•‚àÝÇU<ÿn (·C­Uò¸‰h °‚o»Ð XÝ$ ‚ : cZœÑàP%à&ûH¡ éÈÍ^e©‘@R‰Y*>ú&jº¡°Té§» 0 21йÈí=$hYÐÜÍ!Ž×Ù’ÄX•_RŒÐP³)¨Š—¨‹mŠ˜þpˆ¨®,y-Õ‡&  ! ¸Ý2½F œpŒ-zˆ´H“…Š×u‹¯àá_#™( (¥ŽØÿ( °å]äÙ  O±`#Hªð‘‰°¸\¼Ø¸€øÀΉ p »ˆ¼• ¡óq®ÿ½àÛŒ…Á’X­ ·‚ÈH p¤Ÿ"C–8ˆÈ ü¥ ß(ŸÞ@ ù9`§©ÊQŒyH£0r"'(€ úX¨ÙEˆЀP˜Ýû88¨R(ÃéµpºÜ2Ê Pv OѸdàH¤Xú¨ˆä±ˆ’X‰š£‡pÙS°76aéÏ §ÈÝL®ÃI¤ˆ—ø Ž… Äè‹ã€°Ч6qÑùQËMXpÔ,c’ `"§ÀG¶8Þ¤ªPžPHÄÀ%ê—xn^L‰qaÛ§† Þø×B&"ÿÖÁ@ÑíX|ˆ8P …ôeÈÀ  &˜h*) Èh@¸°Êš€6Ò€`¶cŽ¶Ð€ Ð̀Ȁ ؈hY}r®‹¥aˆ0gÀ‰… ØØ€ ÉÁ sN{Н cµxˆ¸´þÚ€G®%ª f#A/‰€ ˆêÇe ˆõèâ¸5xˆÀŒÎ³)‚ ‰^aœ¥ºæ(ŒÂI$‘ðAˆ0   –¸¬—Å©€çЈ±qÀ€Ò h€ã9+‰†í¼YJ†‘‡Ø‚)à&xˆÿT éM¨ð³"@ °„O€"xˆêÊ+Vîò0›)€ˆÂ ŠÀ&0&xxk`É!Ó¯M ƒŠ‚è€b €!((–#8Ý÷–Í!H¨#‰õ`þ€‚¨†ð€#XïŠp(€ ˜¨°n²Y âàÀ<°90J°mj“Š…55­=” §iáÎ:…[7Ú@&ݹu dˆ0ˆ€½S‚{ €Ä’ äØ&ò„!Rðm …‡`„‡…@xSxˆY iHò*ß…-ð`ƒ$é8Ȉ!¨4Ѐÿ$@%òZ¨(ù’YP*ÿð€'(:/þµ¸ ~¡ƒ» :1¸à?()ˆð0œGà‡ƒõÐp5 BˆÐpÉ¡ƒ<`tµ ôŠx„A÷+#`tˆpÂ΃7ô;ð5Ð&8o0„õ¦BFgu¸ƒŠh€‚‹”2 Ñ»Š[‡\µ/ ¾Õ÷Ò¢¸tX#Í!tÅls§бŠ5&‹Y-(Ð8…Ùãã"G÷–‰äŽHX Ö@ƒŠðíHxˆ)XȈ GPø@P…FÝ+o…’j°äÈXdLPÿàm; ' `Ͷ×-˜*`õ]€[?@œx½8õ~Q¢î&l¢úÜ¢èùŠà  ƒYØuÉaôÿÏï/od^sÖpȃ+Ð ’‡ }0(tø€óÞ绀ù–7H0çà€P¸?¹¯Ñ”mp€“ü7åë'»Î䣰#(w²‚r@‚¡'9ML²Šð±Ž †Ï“¹pê(àA %JÈ0èð!Ĉ'R¬hñ"ÆŒ7rìèñ#È"=žÙ40Sv&82•cà„h‚àH€ ´²´pÈÄ`œv$0¥A© j ¨áPUJƒ3®ðBÀŠ3»hØ€CË‘7J üPD /ØPâ…* `+@Í…+~ ÎØC, æ@CÀ•ÿj, fÀy4bð¯€F7zÞ@#§€†Uö^~lTZ5©T%@.Ôd)ô4¸ŸK<¤Ô@©âÐ( @LåÄ-¬b‰I8@ÁŽ. è CCX…àÁ@Ct°‚o PØ^j±F™ Š=’!1P˜vK’Å׎‚ñÐH[¤¨ „]–Õ°Dÿ°€£8€iÈiÐÑw°6Ð &Ào0ÃŒžP@CŒt²bP:a@ô$3§ T€A¡ # Dà 0@$Ð9Ù)€5 ‘ré!€:(òƒép„§LÐ^Ÿù¹ú*¬±Ê:+­!Ãeá#%À‡€qˆpÆ@"Ø”ÅMÌq![8dG®/(눰ø0P®­àè@;œ‰†ÛVr“'tpÄvèÀPh¤€X„ÂR81eßÙ°V Nåh wµµÿä’I–Ðo}c\ŒcLÁogA4D 7! Û@ÿØ´Ãa·…'/ÓhRç@aTðWÍH#@¤êP ¦P Ó¹gP8D3P vU°éaÉPLý<С +@)p Ã{µš}6Úi«-ë"d ¬d¥Ô80÷@d ©6<‰"ŽÈ 0JBì"í£'üú²*qX ‘ïQqåP 'Œ…h{e¯lÐÄ*DGa#œ °DÜp‚ '8tÛ¿`Æ0±B6xÀVÙ?|ÜË) 'óªñÈÇXq ­×uÁïB‡âPŒÃõ2Î@´7‰y3ÛÀ@Ø-ÀødÝà@­>êA?tXˆ:Áø!ZBÿ Ĩÿ@ê¯ý?(À@9PÁ dP×I*=¹Áïø:Û€Æ6Iˆ²„£Ü`;8 T‚”€o2¨ÚCÒªlª)ñR_F0ÿd C(ß$Õ„ Æc0‚ƒÜF…í9 ^@ƒà`‰6¸ÁaB`˜\á; AÙb³y%Ä+HÌ@R0¯Æ«o1L o0¦Äà*°‚BB=áH¤8¨ºÍptgËõï‚K“ÈU Ò*Ìh¤l4 "©ÈEʧ€'PA ‚÷·¸Îs¬NŸú”ƒä@]DWÌR𯪉à!Ø h€Å‡TGŽ $bÿâ¹ÿtn"`Ú€ þeƒ ( /˜×T·J¾„OòJàUsQG­›`ôÇ÷™Ñ”·ô &‡£¬@0ÐAÀlð¯”`^ÁÁË(ƒà±ñZ@¼äXÆŠr>òt'#ó©Ï}ò3#ŽDDìk!à›Âêiµ¥A°Øhâºy•à*-(H(p8o†Q¡(àß¡"ÝÄ‘Be Ê¥ › Y¦SpfÁÐ fWa¦(ç‘'4–(˜ Zºs® +HA"P‚`à7Ø@ Yg¯Ð( ˜ "ð›„F9 æ¦8€µŸf=+ZÓ@Gêÿ@tujÀKÈÇJ‰Ä §Ã‘Ã@éGŠrWùÖ@˜1¯Q`-ŒHuйy.µÈa1Ǫ€…Àn8’ÈK ÓÄ@ª†ÿb&;W`IÛlª® ì›phôG„ ¨kÀ-°i„0€A9ƒ(:T !Çp™B$•%¢n¹@AF«Öå2·¹ÎÝHU åP ØCv`ƒ`@-¡¡@S1€ J•”àùŒÌ«©  *`ÎÄÀy†¢'DEà’â@ @ ;ÔI ¢«Z œGƒ¤€à€+‚p NL®Zœ€FýÄ2P”ãÿ$p$å;,ûšo Wux]|MLk2PK P0üy `/XG ¦â,&·P„lƒÃ©$Ô°W¡p ‡, =45 @ÁPèsÃ,æ1«Õ(ÀÑ Ê1\à e/R‡HcqY3œ² j ¬°F5ša7ü¬ÍØ€"ÌS  àOSž6€‡ÌÌ€’°è#mmÛ€ý³ðXc Âàª5¬àäDh!‚5>EHà€Ã‡ý4–@Û Aäð‹w[-à£q²HaqÀi¬çXÀŸDÐàÜb%ú%_Cdj儜o zØÿò¦ÀLæq“»Ü, A®t 8š~ˆ& ‚¯ Û!=X4{:EˆÀ A9Ž‘éI;Ä XØD@æÀHãE»Á‘l9Ƥ¯t”àH˜ö;:"{Ð…~#ЃßC4xvªÌ!- ã÷¦“~†×GµÐA¶öó(aÑò{È1²1>ôxE‚ìVŠ,‡´¹œj jð›j̬%¨A¥0ëÛhÃ<æ>;ÚÓ~n\–ŠÅ€@¢w,#9ˆÂ{¬Ñç?‰Š`JPsr°Œ$ÌÀ÷Cê=p0€XÀ)‚ƒƒðÔ²î‘AAÿÃ`*ƒDUp¤ºCÔ¦àÔ š 8Á ®dfˆ†3Ð ‡pcøÙ¤G€%n3"›@:&&´Y~ë¡#žÑŒ™a@ÁÀÆ2ƒ¨ÖʘÂn;ÛF,'*(Wq¤•j??úÇl€ n`00OÆòiÞC:YÀ£Óëí˜߀ûzLZ8D€õD؈TÊUyTøø›+l4@4,è9DqÜB6$˜žC`OF €šq€¨Å¯õ.8Dl ÀÖè€hŒ:hÂÐ0Cx@¦5’ 8T€ ¸[`-JLL¥hÔÕüFw<˜ÿ „×í (G° „êDNx0@ØüD}Ü“)Wú…¡&R9ýíÀmÃ)Lš5@ Dá@@„O¯)ôƒ|Š÷ @;àUØ Dô„ƒÈ€yÜ~õI •ßè‘ZøÛ0„‡3< ™@¨…šÀ¼p„GÓT˜A@À_ü < <©Y\ €Ì! Ǩé€ÂhŒØAD¥È¢` dÃ)¸ZD,À_¼À$¨¨8Ä1˜ÓÈTÈ)A\ÝX/ÄÖp #ñ @#æ‡ùy!Ž¡6nãÙ€°9DNhÀÆŸôB5Ø—A€É6A›=MºA[<Úø!Tÿr ŠÙ™Jè8|Ú¸7<ПŒC4,Z´Á¢LQÕÀ5’Å¢ ßüÀ¨Ù)†8dÃ6ƒÐdCôZ(ØØ<•",Jv WуCðÂ@ð^°Þš @3|Ã@ÀÑ„r’õ!…¡°ä5lÃ$4€ ”ÁÀ@ T€4”8œÃ-¸ <Áà ªû@¯ €6(`\9,ZÕüZ6hê¸ÊÑÀ÷ À•%7®%[¦41è‚«É@ $!—‘Í`XN˜l ªœ˜Cl®YèQA4]wª  `†yǘSüEx$ÃÔkyÀ €F P€”ÿýÅ`”Á9ÈA”Õ‘<YlYf帚ô ÔÒpÙP)Ñ@à4Ä–‘ ”@`AÀZ<¤˜¼Y|“hÎ@|Ù«M à  ° HJè‘éÎ{ôY¼”JHMÇY0ÊO‘ßÔ‰öaÀm$„ʨ ùT˜ÊhÄY<ÑUáx@Ô×øa…‡†Æ’!áI{DΓ0„ÊÈ€ãÉHØ@D€PŸû`ED8ž†À‹ØTÀoˆQSÝè€nf x+Áÿ ¤@8À¼ÜTH)˜„ØsR@ c…±XŒp@ L)T€Š¹O} Ì ø €pá§›¾i|è'æ}T<…FCˆŸ°é¹Ç è ôÔøO¡Ô9É€ÝDSÿœ¨ eR¼E A4%ÌÅàXÌ$ÄßH¨õI]í@T™¼ ѱ@]Í…*„C°ÓBõ§,±Qµ ÀˆQ Ô€jd*+*Oñ”{T«*D=±çG¨ \½&œ«±~„~bÒ ÍS^ÍTLÓš=RL. 6RëÒ8R¥@Cˆ·v«·~k ¨@x@ƒ t@Ü ìVŸD£ÒeCHŠ,ÿÀaÀ@ÁÐk å« 1륹SP5ˆ€J•¥B‘À¨X`À†úª|x¡CÔOŒ¤žC@À’«Å^¬Dè§tùD¼‡Ø@àDˆ“X° pWlKÀ*Ì ´€´æ„  @̪€ äÀôµùˆ“8ùÎp(Ìí¬Ï&Œjx¡ «:DI!íC ¹¦ •·Ø X ¨À÷iŽ4ñÍIQŒd­·„·õ ¥¼]†Æ’^RC\Ö@¶¢%l(|ñ Ýž ì| ¾mŸzÛÌZD¸ ¬¢NP€ÝQT¥ü@+ÆF.ÆÀ†üʯDÄnįØÀ8ÿĆô„P,…LÀ—ÊÀ¯9q]–çŒÓCü Y´Q½@ke&9É›”ÔôÏmDÍUG¥ÀÆËżÅQ²Î°;ýÎOµÊX„Æà@ç¢Ö ŒÈØ€jÈÀ€ – X€Ç(¯ZG8ÅXœ¯ à¨phŒ 0@ 8à[ TšC¨–ú2€€€±% r*9õ@¬ƒìÃC$—äðÅ:ÊO€‹éÕ8Ä'<„°‡ADBM¤DÜÀü¯nȯ@e«€@’EŠí²ņlठŽü@.áY=’ÌÊÕDx€Ž2/Ä ™  DÌÿËèÔDÉ8„ep€ÑA„úþ°ì`˜Ó¾ÀÆÅì‹9ƾh€8àáÄ ¬@ ¬À ô²¡ <’+ᇽÅlÜ‚0¼™D¬†G›±GŒèÀÑÍž"0"ãç „)¤‚N D¯€‚*B… EUÄ„#×B³¼$ÁCÅ.\SL@ÈŠˆB¤*,…豈—q’°AUÌÂ@Á‰ø@ÀF¨4@lÀ 4„l@ ˜Ð0FÐÁš˜j°eü• „d D4§°ÆšTói „edÉÐHî,DP@ÐE” •x ßÁ^Ä€jÂ,ÿói† AîR£ƛؑ@ ¼ ¼€ÍÃ24ƒ@XßN„ßCœ¢ÙíWåeYàÖ›mßtp°Aøƒ‚LS"w4[Â$A0Á&˜Â ØÁ@lSˆ´@&,*[Ë@ BÁ,ô Š€*À®àD+@TÔÄUOÁO €%,5-¨´ô„jqHÁÄ³ì‹ ¤îÀÆØóäAø,´G;Äœì…TŒ«†œATAÇüTk(K`€jø\[Æcô²<eìÅÁn€¨£¼Å,†ŽÐˆ@ã@:þÂ|@€/áÀøœƒLÿZq DÇx •LW©ƒEC(C~­Œ[(¯ŠDDÀ!{´ms#ÄtD\H$ ‚-S…LuìBP„°<²B*´À…PÈ@ü´ AUu*,õRÌ„ÌB`€¨‚#ë€Ó@T¤!@\ ðð€íK7 e,óx…A4i ÄXÅä…ïô PÉÅ ³`°†H‚ÁôÜóÁ„ÜTsûÝ@ÛÀÄì…›q`°@Ó²@ DFߤÅ@ ƒ4ôšß“C;ÊA¥˜GÅ8è˜tJ¼a€+€ƒidÃ,ÃÓxâøéLÃò%*Epÿám9ú€Ê’‹°D#÷ÄO‡,wQäÄ*dAJL°ƒ¬2-Q\HÞüÄH(H#ÈÂ@ ‹%8%<Äp ‹h€ayA¯Àú²`€IW,Dô…` „³E˜ó’°€HB\#\ÁÀ³è·H¸ŒÁ€9;•€€¡_A3AaTÀ’v]dÉ1?‰Ž0Æ_Ä€<ûÕµjé‚98Ï¢a‰A,ü ÌLhÂÂ_3üa”Á8Šü†0Ǩ’Jò+’?;Ú!À@ì‡`jA-ŒB†uÞ@„nû@‚pòû4*SP)$H lK&[k ÿQ€KU`€„dÂ& yã°5ê@ ŒI.QÐA„œŽ1}Ä`DDÎ2‹‰óøÁ4É_|D<³¬ze4Æ–¸Éz+Ä à@…ÛÀ3«ÁšŒ@›ÜAÙ^{œõ¥ô!F@°)V 2–á]:ø-ïáW~Ũ±b”š°{0Yò@4;´'=úÅÁ)ØAlA€®°P2°¨®¨¬J KƳAƒüô ¨E“s@8²AhfÀô ÈÀ0ÂäÀ ¼„¨4Rý§/é¿7D`x…ßð ¹ÀÌËc8Ö@8ÁðÀ¼t€¤ÁÕa8A`¬e ÿµ\F¸À˰õsž€Èð@œ °L`\LÇÔ heHF‹L—ÑL³0ò„.4t `À:…œ4„Á¬à@ZTÞ„Þ‚«ƒ3ð<]’SC€ÏC4;ù)=÷/×p€K‡p»B¸¼k@(Å L@Ø@h€dQ†à „„ R©€ZdÀ½@Ø0P )İa#„ N„! ÃÀ!NLÜ@ƒE  cø„G‰…2@(¡òÂ@—$<°h$à\ qB€Ä -W ØÃÂ6X8ºp ‘óô¸ðGˆ.¢PÑÿæ‰0>È¢ã@ ap˜‚­Õ hh8)Asþ"7 Ü-qcC‚7Dªò&È@ì@†‡ R HA‡`¼9A‡=štiÓ§Q§V½šukׯaÇ–=›ví£*Vܸ!@E -tÀØ1ðDŽ*B àâÆŠ…5T܈nCF rå,‘# ž+Z¨xÑù®Š!Bhaq5VôØ¡¹ž?nÐx!ahHqHA†j£ú ðJaÔR)„XÁ£÷lΩ»B’á…'ªÁ©ìr †%¡»î’aÀ Xèí jÿ¸¡NX…ª:bK@pÜ0ÆÑ8bÀ^J(†È›ˆ…Hˆ¡‡¾ª`ð`‡J(á‡J ±‡ÀÚµÏlkÓÍ7áŒSÎ9é¬s5Dëʼn& éI?bq > )§Ý uI† ƒðÎÏ*­t"êv›HE CKtP—j ÍPOsJ”P6bT´P;u P•rR*Q@?#UOTI½‹vx†6 JÏRÕ¼5'FÕTU>ÕÜMM˜d’«ì¬ÖÚk±ÍVÛmOC†|UQQ+ý´ÕRˆÔKÚɆH°áyéwÞ ©K÷ÝM³ÕRÕdˆQHW]º!‰)žØâŠ1¾ØÏŠÍ,‚x dÊ æÖä“QNYe“ñ8åV`5C«pdrE qviß@U\Ùg×B‚,`])3Né¥)f1ÑrH‡¨aýÙ꫱ÎZk¼õÓßmiøO!Hoð0Ò³ÁJ_'×ûzk­wCÈmÿ\sùXr(ï0ßîÛ￯­årS^Èðvc©Ý q¤ |ë cwNTÕ-Nïþ’ÜóÏA÷»k¶ßžâÈCÿÛôÔYoÝõ×KsØi¯}6SmÏ]÷ÝUýhÞ^øá‰/^öâ‘O^ùå™·Ú÷Õ›ÿ^ú驯´ã­Ï^ûí¹þùîÁ_üñEß“üóÑO_ýj¿_ßý÷áß4ìå¯ßþûÉoÿýùïŸyúý@°vú#à˜À¾P tà¹e@N‚l-˜A n°[ß"ABbP„%4a%xB®Ð$dá a¿Ɔ5Ÿ m˜CVo†;ôᓇC ‘ˆºëa‘˜DÖ Q‰Mt¢è<ø»'N‘Š 4_±˜ÅŸQ‹]ô"˜øE1Ž‘6\$ãÑx§+¦‘m¼S¡çF9¦1Œs´ãÍxG=~±Ž{ô#óøGA>±ƒ4$yHE±‹tÂdùHIư‘“´¤ #yIMа’›ô¤3ùIQR°“£4% áxJU†°”«te SùJYN°•³´eüByK]¾¯–»ôeþbùKa⯗Ã4föryLeZ¯˜Ëtæò’ùLi*¯™Ó´&ð¢yMmò®šÛôæë²ùMqº®›ã4§äÂyNu®œëtgÖÒùNyb­ó´'ÊâyO}ž¬žûô§µòùO²o5(<ƒyP…ú¬Ÿ uhlº¶8>”¢rÂSE1Ê­€!ù ,! M>ÿH° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç Cn ²¤É“(Sª\ɲ¥Ë—0cR@R¦Í›8sêÜɳ§ÏŸiÖJ´¨Ñ£H“*]Ê´©Ó§P£JJµªÕ«X³jÝʵ«×¯`ÊK¶¬Ù³hÓª]˶­Û·pãÊK·®Ý»xóêÝË·¯ß¿€ L¸°áÈ+^̸±ãÇsÂ;¹²åË"åaÞ̹³çÏ CO'º´éÈ¥N«^ͺµë×°cËžM»¶íÛ¸sëÞÍ»·ïßÀƒ N¼¸ñãÈ“+_μ¹óçУKŸN½ºõëØ³kßν»÷ïàËÿO¾¼ùóèÓ«_Ͼ½û÷ðãËŸO¿¾ýûøóëßÏ¿¿ÿÿ(à€hà&¨à‚ 6èàƒF(á„Vhá…f¨á†vèᇠ†(âˆ$–hâ‰(¦¨âŠ,¶èâ‹0Æ(ãŒ4Öhã8æ¨ãŽ<öèã@)äDiä‘H&©ä’LrDJ“!¦ð !@é! Vf©å–\véå—`†)æ˜d–iæ™h¦©æšl¶éæ›pÆ)çœtÖiçxæ©çž|öé矀*è „j衈&ªè¢Œ6êè£F*餔Vj饘fªé¦œvêé§ †*ꨤ–jꩨ¦ªêª¬¶êê«°Æÿ*무Öj«_2ë­¼íÊëo%äê미ÉP±¼«+²¸ÕñÌâÖA 1,íµØf«í¶Üvëí·à†+î¸ä–kî¹è¦«îºì¶ëî»ðÆ+ï¼ôÖkï½ø &¬µù"ì¿ý&fìÀü<Ø¿Æ|ؾÃ*ìðÃG,ñÄWlñÅg¬ñÆwìñÇ ‡,òÈ$—lòÉ(§¬òÊ,·ìòË0Ç,óÌ4×lóÍ8ç¬óÎ<÷ìóÏ@-ôÐDmôÑH'­ôÒL7íôÓPG-õÔTWmõÕXg­õÖ\wíõ×`‡-öØd—möÙh§­öÚl·íöÛpÇ-÷Üt×m÷Ýxç­÷Þ|÷ÿí÷߀.øà„nøáˆ÷Ëð@ÕVø¾5ü·¯‹ä8à#œ‚%Àp‚ç0lîwæÆ>û =èº;°0º®— Àí·Gpƒ—ë»±ÑËðÃÿâ8ŒûLòÏóÐ73@½çýï³2Üð€þìãý>ÿ,3À| »üŠüãÏúà/S@~ÿ[‚ì8 ÿÏ>ìÿÃÌøåÃC²ëýÖ×½ð½/~Ï*(ФÜùöÖ¸ùå ßxÒGÀö0oÙÈ¿rà†IÈÁÌŸô&ˆ7êñ.sˆP¨¾ü¹~x»A dƒÈ.X1ÀiXîPoãÝõJÀ¼Úðƒ|ûÝ ˆ½ç±o¤ –€ ‰IxQš°Â´&÷;< g<#¨Õ?ó•Nv:ÐAæ¨bvÆ:Ö NÀG>>?ÝÙ`Y NÌ‹aSïªm[;+Ó¢Nýç¯7VŸ1:”Ѥh’uE8"þÖH¡Áï "4'\ª²c;Ðg¯uî܃ oôDÉ”§ü„­'ê/bÄé'P@!ù ,.ÿHP  ư° Ã 6,8ñaÁƒ2´±„ %b” ‘BÆ 'ÐØhñ£K)XìС£GÍ;¾TA"OŸ"Ĩ!H—$rèêÅTW0Ed5x4d JþiÝŠ-À‡=âøxƒ”}þö©ýGm@Ž=4!5Á´þÒþ«6à«Á¢2@ü8u„ŽRzðêåûVFƒcÜ("FºS ܤS¤xßÞ¾*pÀ1ƒ ŽI  ,‰ÎŸß>äV*Eår\c…¶5Ð'A½ÁÚ±oD”Àæë÷!ˆ5üªçlÁÙ¼z7/xc² Vžé`ip=¯gæEºäP ˆò‹ƒ=ºcG(þ¶æÇ&ÿbÕ1à0É€jR7€eÔK"•ÐÀ6Ð9QõR %Ô·’ÖBFT‚¤54T…ˆ!KS¡XT‹!ù ,%.ÿ(P†ƒcPH A„ Jœxp A…'>,! „ )Â81R@ †=ªŒ!ã…€:`êØACãÊ0TP( gÏU~”゜`ºz)íE„C¡*ˆö¯ªU7 ÄqÃ#Ž?8û·¯ì>r"àHÙŽ ”ðŒ¬¿»h³ T"Æ)-YY Ó îY¼i×”³ iÜž¥SÒÌ.b½—Q À*ËB[¾›˜ 5]~¹›F-ݲʇýý“£×)±mJÜBg¥÷ÃxѪÝ!^³1€X‹v«™"Øxgg½A0ÂŽ Pˆ9KöclláŠRfèz£ƒ [>K›èÂ8<”ðxcÇ‘Te[-ýth h¡É$N¢I ¤ÐE%ÄÐ 8TÐ@PØG(tJóɰÃ8€H\†=$|ÿÅ€‰ ” G JÄb‹ Q!ù ,..ÿ(@FÁ1$$(РA‚ F|xÐ!B…–pX"† 2`œ #AS¢¤‘¢‡—01rDI³Œ8s6¸Q€ÊŽ67ÜêE´×¯Pp ¬‰2FŠ õþI•ºn@…2bt¼±Gôüíû]+dBƒèýó'ö_º=ÊÁ £ƒ&9§†…‘KwŸÝhšÓƒáA5uÊžš7·îݼIsAZµ(¶Œx 9iHᇈц/DBä…Õ ¾Â¶{và²S$T;¶@ØÊ±ñ$VÆ]Hq/Ì;±J”xáF‰ãû,+P¸Ã{ ;6rˆ:õ_Uë5µj-¡GÓ¤û;DL©U†‡4ð€€ PÐB@iW = ‡Þ ù4“O%„O T!F Q¤P„Ke(Ñ@!ù ,1.ÿHP†ƒ*ˆ0aÃ…JØ0†‹ e”Ш1F –ð²àÆ“qô豃e%"r,£„ èLP€L‡OÂ8qcC™_½’öúÅgF”4w$ö¯ªUV ^.”áQ‡" ~ýÛGvß¿Rv”XC  D;ÖŸ?³§¼¤ Á2rœƪØ}vñ¦áF€jë–9cU ™µeÒ”ôª{÷_^­ŽPð ‡oÊ<(p8±çÅLsÌ’B(lå¢AØŒ¸ó© 2ÐↂDÔbÅoµ s”ØqŒ¯szt5÷ â‹§œ9o;5 ØößÐ3ž¸Þe¹'¸±ÇD PõW•?úµÅà 0ÜpCJh2‰‚šhr„S ½U„6Á>à€•€ÃGŰà ;à°C‰4ÐÑZµHQ E$PLÒøÓ ÉHQ„!ù ,9/ÿH° Aƒ1$þîæíAÕ°S?HôL´%J ›”À1ä»ÄôÄ& šDz¥[Ö`G„dåš© ¥ˆîi¼abLƒ'^pv쯒uг¦Éwä©÷4÷Œˆ¤5âÇ “¾².98Á#éz_N,(êܸ…­úã듵$P/å”Ò€¡€SM(XD 7½¨ÃKoÿµ·ƒA¥lÀA(Ñ<ã¡"!L4½(àßoŽ%@9À@A0@%4P@Ñep¤ 0èPR'•pƒDæè•?ÿ3€vÁpƒ”TNi¥”$¡‰&“p©  V`f¦™e¶äÀ°Ù•yÕœRa•P;à°Ã {â &T2…t‘L"µ”4Ðç˜d–¦£ŽŽÔ“Š‹bÄF!ù ,¤!ù ,D/ÿH°  *\H!C…–ˆñp Œ3–ØÑ£GŽ 5jÜÑ É&o,ÄÈò" ¡~õšÙKŒ† ENü Ý¿Ÿ?÷å@Q  =nÄ(qÇÌýÛGÕ_½¥K8(AÆ $Q@ê>þþÕÃaÑÉ8„ j˜›fÑZ½8Â1tY `%¯˜³r ÊME«–í@(& øõÁ)s%  +óm1Úz|(“‹Eé@œúÖ 7=ÜŸ­§’àºÀæœâæ79±Ï~†QB  ѾñJ7l€.t r Sœ1m¢#&@— z‚msh!ŒHgáV‰ÌA‚$NTpÀ‚F¼S«^§¨C Ž7·Ã1€Oi%@q Áàƒ7tP†&“P¨‰"ÅUPq%tØ¡ 4ÁˆXÑR(N$ÃN9µCE9%„"vJi£‡ æXŒ%$†!ù ,¤!ù , 1S"ÿH° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3”¡±£Ç CŠI²$H%Pª4ɲ¥Ë—0cÊ|¨2¥MŽ3sêÜɳgÏš@KøJ´¨Ñ£ ƒ€©Ó§P£’Üã¦Õ¦R³jÝÊáƒn\MÙµ¬Ù³PËp«­Û·pa>3w¤Ê7ãêÝËWcsš"ÈhK@@á·Dê˸qߨN= £„å ` ‡€-ŽC‹Fû[)ÁxÙ’=l˜óè×°µ>¨QŽ•ƒªƒÙ2m­™ÀAÇNÜg‰_r0X.q#Þ¦¬¤Ð A€ßÎ¥ Êñ>ÿ' ] "@ !ˆ*ºËŸ¯ñ†€2ƯÄ*€RôÈ3Ï€õœÂÀ`Fß‚ >$ÞXñ‡·üãÏ?þ£K=(Øà‡ n!Bþ±òÏ>(î£!‡!¶è¢@J uèr¢?þ¨xË/öb„»­TŠö Lr‡P4a…8æøÏ- h×ä– ò—…7Z¹!‚rifƒSZxä•Yžéæ‡D†‰dd¾i§|iV©c›wö¹]‰'¦Èf~úÚ„6fˆa/|ê¨hL¢Ž9”š£Ž&úè¦|)0ApÀTàÂ’œ¦ª—/øðC:$‘à ,¨jk\X&@ 0Ð+ ¨Þ*,i•9ì±f‹ì²E!ù ,7C&ÿH° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹-bÈȱ£Ç CŠI²c˜’(Sª\ɲ¥Ë†ÎƽœI³¦Í›6S(GÐÌ&œ@ƒ J”!š¢H“*]ÊÒÓ§P£J5ˆ ÇÔ«X³Eà!B'ÜÐJ¶¬Ù‘'Z¨8q£Æ8ZœK·nCH¨x‘BÆ1JÈ0(c°À1:ÊÀ‘ð† à 1Vab»˜3 Ä £†"”\‚àà “'cð àòBȦ1`QBB6 aÇ‚àPZ³ñº @(…®[¸e9ØVŽÌAI0%¶#<ÓÅ ãàA0ÿ.ãÁ“]ã P 8k—.Ð hCÀŽg鬱1 Û7gGpÛ ü¢7æÜ² +ç`Vx5  :Vx²Î0 äPÂX È@BèÈTL –¢x¢ P;¤ØA1` +n(ƒŽ Tº8cŽ@?SŠßDÓÀtö5ÐL49” °=håSÉ1Ð 7 Í40|†V|£Ä)å°³M5a4 5ј£ ÜòÍ7Ëà1Ô4óÍ)6P 2`°z¬£D®•@(åœ À D0À/à@ÀØ@2<ÐŒ5“”Á¦W–ÊTr–C!ê€5Â\ÿŠÍ)”aŽ%ô4f6³Ín¬sJéô2@3;Þbq3 ´“TƒN/ôàš³°2äd8üÁ6Å4ã@ëõ‚5ëÜâÀ¸¦¶[4ÀŠ;Ü„ãÌò‚³À5·<‚å”ãÔ€&ßH˜iÇP3€3ÎàÆ7P`Àd`að"4°  åekNb1ôÀ3ØôÈ)É?ÜPÀ0;FæîÌB¡ªË8Gä°€,è€Í0Û!Z|ƒ;D@Í0”ŽÂ$@L5;€åLyYb7Dà@ Sʺl0ã œòMi8$0Ì7?T0.¤˜8P:ZÿHóß7ÁÛ/áTC"¸ÐÀ0óã@@aÎ$ èàÀÒŽÃA¢Šô`Î0U G9Vp0L¢‡¬¬#¸ÑLÅ8ÈP‚.æDº¡ƒÐë±2 iRÑ€³ àÌÓ„ê-Ýt C )¼PîèAA[ó5a00M0nãí0æ”# N63’Z“Û@2é|cÎ/èZŠÕÁŒ|ê3S˜‚-i0À@ B€4P„'h ›AUÁezšËÖä²§ áêV}:–Ël’£ÈP3˜HÁ¦Ü*€`â`>uÅ+\À%äÀv?X« j0#Ô@'{kk ËX³–°“ÙëdX@‡7Àƒñ‹a£Øº"á%¬…íD (Å?öÁÚ}üã °éAÝ…€ÿh@Àm B‚ øV04„P‹8dਘ@HÀd@/ÈÀDðƒH‚Œhs«¬à˜À<°äÓ·v«OA<  hŽ1o>=:tà!ÈoFk°!‚e»@,ðl ˆØÀ| œà¸@S#üTá ,([üP là!ø@Ù0†+< Fhœ 4Á<»µnÝ„&¸@½^A bƒ&¼!Wh‚ ‚p‡*a»%Aœ`„l€¼6B†¥ k'!àf]l@ÜNà @Àƒ*Ⱥ!ØšP…o³€ó÷P…<¼¡ RÁ¢QŽm8ŠPMíj±üÉ0@F‘ŠXbs˜@%PŠXØ!SP…,F1 6h`±ÿE-"!)ìb -Ø…žIáƒ@llðA.P¡ò8P ¦HÅ*@qÐ"£ÈÅ!èù‚”À"ˆÃ,R¡Š8hФÅ(žÐ(ºXÀ àÝ „<øïªÐC܆HAá‚ _Áyðw#À@+<‚.ÈÃN †;4‚iÀAò@:4b0 ?†ð wxÃ#œ`0Ð>@Di>0 – Œ >´À>p8ðGð “'0oð`àWÀ)À`peSj`t0y6MÐ@pt p~À@ãöAPpw`n°x#øUpo@"à~`@p`pw0C¸ƒ—§dCðJVv` …p#`j@à›×zol7ðY$°t'…—Ó0 @Q—Zªµ çpÆÄ<0qg° s@}ÿ ­@ ©€ >€ ¦0\´ uਠQ° ë×~Ž›à€q@«p`©°£ð Õ `ªqg0 B • ³°¹°`´À`­ ™@#€' `NÐc@W°«'k÷,è‚H o0jÐwxMࢗŽiðÁ”ƒwÀp„>èf‡`‹ç,pW`…Xw.@…``{)°`@Àç¸8j %ƒ~ЄˆwyoP¢v‡#L@ÒB G€pTfe…Ø|7%·ŒÿȘ »0` ¨Ð‡ à—› à‰6ŠYà쇠¤à«@µàÇ… ð ¦ÀQ@ gЪð P ±àpŒàY  È`² ! ]ßw"Tm P˜°Hñv|—aNãhzkØ~ÐùSYp zFv F„.púè)€lPYðŽF°W éwA`wÐw`{, ’~à@0†0ÙcUðwH°v~0x¥q‡æT¢°Âã"ˆ ·| WS‡8 l :ù €tq ªÐéÿ‹»`\£€  ²Ð>` ¦ 2ç¨DSðK  ¨@ µq!t£Àž©` *Ç îE"0³@ ´`À£° Ÿ Q  î  €÷¶K­vt?Ž’g·o¾×ð©§ycÀ'ð…Ç‘Mðz` V,à…ÐŒ×jÀÇw‚—…¸wA@*Ú´¢Azo)é¨<€{¸w€zm§<ÐTc`¤U-Íð Ñð “P‚“É7“ηA]¦g[S`Ál°ô§S0Y0QÀhÀqÿ E9SQq` yB UÇhÐ)ðLZ¦0‰ê(¥-Ð+@@–‡` ª…S = D  Š5`iQ"9#0kAPLPj!\¥ÊÄUê%+J* J òLdÕ,;@*Z˜ÅÄ®:»2°F@®¥Q,ÿ0nmÁ_èjPÃ;àL2w…½'_µÞ¥ÐL0k.ગáLñ+®Zt%"Ø8À2°œuo‚roÁÄ5¤[vÈç1…ÁÂ@³U“ôT—²;4À&\Â4vj" MåMñT.¼)Ä$”ˆ‘±dÂ&6F Ò$ˆŒ&c4dãÀG2sF8!ù ,¤!ù ,¤!ù ,¤!ù ,ßKL”Q‚ Á‚ 8ȡ‚ʸ0¢E‚%F\8QãÁŒ7ÊèòcÂ’"Iz,Ò#ÇŠ+[–|¹ãÉš4QNT(%Ï›"!ù ,¤!ù ,¤!ù ,¤!ù ,¤!ù ,¤!ù ,ßK¬ŒãGƒq\(€ ‡#RPÈ0+ĆiFLNŠ1ô`pêŸÉ“à ô`¨£A©ûbîû÷+ÁJ‚v0xé¯çÌ`v°t Óç? 7Cêäi¨Ð…-_îkª²¡Òÿzúût¨TªIsbÕÊõ©À¨E·­ŠsÑ©jkšpc¬Iÿ„± i‘!@€þ:‚áB'v"¤a7pÈ,Ô±€€!ù ,¤!ù ,¤!ù ,¤!ù ,¤!ù ,¤!ù ,ßKL”Q‚ Á‚ 8ȡ‚ʸ0¢E‚%F\8QãÁŒ7ÊèòcÂ’"Iz,Ò#ÇŠ+[–|¹ãÉš4QNT(%Ï›"!ù ,¤!ù ,¤!ù ,¤!ù ,¤!ù ,¤!ù ,ßK¬ŒãGƒq\(€ ‡#RPÈ0+ĆiFLNŠ1ô`pêŸÉ“à ô`¨£A©ûbîû÷+ÁJ‚v0xé¯çÌ`v°t Óç? 7Cêäi¨Ð…-_îkª²¡Òÿzúût¨TªIsbÕÊõ©À¨E·­ŠsÑ©jkšpc¬Iÿ„± i‘!@€þ:‚áB'v"¤a7pÈ,Ô±€€!ù ,¤!ù ,ßKÿ”Q‚ Á;züPØ£‡À‡ Æ(£A‹<X°#ÁNFrØ/1ÈPé‘âëþÉ”¹ÄÆŽwü8RÝ¿}@ýÑ‘r¥Ä4,FèùÓŸ¿ô<ÜœxbécºøÜçj‡,q@pVn™4-æš>¥G%Çô¨+S S®Oë}U©ò†ƒ[ß*üx¹µ+[·JÀU¤ÎJ çÝkTqiß‚=³’/Ô¶)O,ñ¢W³a$ÿÓ Öà‰ 4ˆÜtTˆKL„q"G#Òý{*³n¾_Oá…žç„ê¤ Í1b ²g§°q*Î;dà>t@!ù ,æKÿ £DÁƒ=~$Lx#†‡ 4X"†A2f¡`Ä)î(¡d˜I“Å&QÐqĉcÄØÑ¡€œ8sN @äĉˆ;Fü!Cަ2þö)Ý÷ïÙ>BdPÆ zq³òÏŸW¦Ïüãã-"$JÜúEL¯_›èñÑœÀI ’™;¶Žš¸IåŽ})C‡é4xVí/\°s?b€c”teôò òØ(p8‚N€dœË¥ ÚÙ¤ͨiZÇ J׸a? ¦„CaËt Óy5hT«&(à Ò¯ž÷¨X¢ÇŽ Üàô×õ_4±ÇR'!C†@rô¨'…Cxc–(¡¾} 7Þ‡ ‰CF7äZ@!ù ,íKÿŒQBFÁ1üè±pá@  Î)yïÛ¾o¹â0Ø"g¾Ÿ=6X u´áɧ+ìñÞµ‘ÿùëéϳbQœ©–ƒBz¢Ëé#ò£€‹„kÊÀ½{ ë³ t‰CFyT=!ù ,óKâ”Q‚ Á?z$L¸Cà@Æ(@±bÜH0Æ_ÃB#*BCˆ9ôðÃß¿—/Í ø¡Q€J‚ëùÛÇó¶™bÄHÄþvþã6 ‡Ãˆs&UÊ”fЛAAJµéPKàˆ!5é¾¥@¯J¬PB+׳L{|µÙG ŽN…›–,Á¬ÈÓ•@É[´rmÒ-p™ž[÷¢µê·Ù0”UºÍëâ°?d°<ûÒå·¾DU²pCH9„¼€˜+#õA rçÆ 4ãÀ›2p—±£·À€!ù ,÷Kð(@F ƒqôø±paŒ"´hÝ…uëîÌÚ3(S³ ËÊu™µ° È+昸ðÕÃW#[]K¹²eƒm3»W³`Ïqë °+iPNI‹ÜJÀ.zIú³H¨Û.\¸t©³(h^ž}‹Î\»6ÝÒŠÛrʳyßœB?Ÿ¾“úOŸ—³k§ º{çï ³ ÿZ#‹*uøp¡²Æ-ûvʱËݧz2]ñéC­»k¢À±dØÇ"kPAÆ"ptQàUdýÑò1¡€½ýÑ—[Î5§u vâs?mgâ‰3uäÝŠàµ8HÁ0s 1¯DsŠ$ÏPL’0#À?ÑPã1ÎHâŠ4œÄ'òÈ3ëÐã ÌILp3Í/d¸â 1ψRÇ%¨õÁŒ4·¬Á‰ÓÜÒÅ<õ¦WcŠÑigx:6Š|öyR‹,ÚÙ"]œó<þ´ãO:®°ÃÎ>®T“è?ÎHóO;ÿÒÌ“™N³Ï%ŒÃ˶ê¸CF=̬Î;äSOóÐÅ>׬3Ïô¨#Ì?¢¨û‹°ÎÐ@¦ãÏ3—€S }H#Ï4aòÆìÇÍj&íÈ$OTíÉÖJ=¥Ð <ÓÔsM=ÓгM«[‡Úðâ(é´Ó²0õsÍ6Âì³=çQ8þm Ï:›Ö ½ìÀ³ =Ô<±O5u€³ª‚}\"M5óœc×Rw¶' %Ç-wB(×½"]d˜³­?Ì”ÿ#:ô<ó5íÐãL¦ÔìÓG=åÜ"5õ´S1ô”ÃN;çÔ:Ï<‡cÍ>Ìì£#ðÇd!Ï<‚ÇWï>ÖDƒñk§÷a­ÝÔ6÷î%ã~;qdT#ô<ÄP£/ò £M4È£#3ÎÌÓ‡;`³³Ž:è<ñ·0ìäØÎ”òÔƒ/¢œã0Ä$*O0ÂÑ)=ÒÔ1Í<ðÎ5p ’Z"¿û^-ïYÿ(×Ô|8àÎÖ°†¢Ž u¨C{Ø `g®¨‡:˜=ADë(ÆØ fü£èÄa` k¿ÿpE¶yKwØ'.ç;?dÛ ÿUhý†.úD"LCb#Åñ`)Èás‰â‚êØVcšÑd‰ec›^T(Óð/2ž±Mýw;ºÑO©h~8ïd…!VyћȰ†>ðÄ59aІþP2ØN|pVÀÈ.e)HPÞHÉJ:2:äŒ` r—ÔÔ¦D¼`œìâÇH*G"›™dB2iÉVºrZQå\2™PÄC‰ã+wÉË^úò—À ¦0‡IÌbó˜ÈL¦2—ÉÌf:ó™ÐŒ¦4§IÍjZóšØÌ¦6·ÉÍnzó›à §8ÇIÎršóœèL§:×ÉÎvºóðŒ§<çIÏzÚóžøÌ§>÷ÉÿÏ~úóŸ ¨@JЂô M¨BÊІ:ô¡¨D'JÑŠZô¢ͨF7ÊÑŽzô£ ©HGJÒ’šô¤(M©JWÊÒ–ºô¥0©LgJÓšÚô¦8Í©NwÊÓžúô§@ ªP‡JÔ¢õ¨HMªR—ÊÔ¦:õ©PªT§JÕªZõªXͪV·ÊÕ®zõ«` «XÇJÖ²šõ¬hM«Z×ÊÖ¶ºõ­p«\çJ׺Úõ®xÍ«^÷Ê×¾úõ¯€ ¬`KØÂö°ˆM¬bËØÆ:ö±¬d'KÙÊZö²˜Í¬f7ËÙÎzö³  ­hGKÚÒšö´¨M­jWËÚÖºöµ°­lgKÛÚÿÚö¶¸Í­nwËÛÞúö·À ®p‡KÜâ÷¸ÈM®r—ËÜæ:÷¹Ð®t§KÝêZ÷ºØÍ®v·ËÝîz÷»à ¯xÇKÞòš÷¼èM¯z×ËÞöº÷½ð¯|çKßúÚ÷¾øÍ¯~÷Ëßþú÷¿°€LàøÀN°‚Ìà;øÁް„'Lá [øÂΰ†7Ìá{øÃ ±ˆGLâ›øÄ(N±ŠWÌâ»øÅ0ޱŒgLãÛøÆ8αŽwÌãûøÇ@²;+ƒùÈF¶.’—œäé2™ÉÔ5²”ŸLÝ'O¹Q¶ò‘«|e(O·Ë]æ²–±]ÌKžêº©Œ¹ÿÈSíòM€ë(žµÌT$50D6o €ˆâ4@³”—z‚A7`A7pæ7«3ÁtDdàæhE„B‚@ ` U€¦µEùœd&¦9= @ +ˆ RP^¿ *hZ L "6°A¬‚éU?ÄËÈ вyÐãÚõÐÅHÀMK“Ó@0M^ $4¦KÐÈ@!XÁ Ê‚x{ ×%2€à@98¦“íl:Ùà7ºUM…cw¸ ^pië@(ÐA§1½°â ÿ‡?þÑ‹ôÀÎÿ§æ˜Ë©ì˜[ H x hÐ&2QïüºçHÁ 0F8" "PÁ ràf$›Ð§uÂo€ðrD1xAº¥}æX]ÿ†Á@ ®ê,@zÀš¢œâûð‡?öAr“Óz›V.§NÀ”6Á D ˆ€8ð»„0 6H£A Jp‚¨'À 4€†TÌa¤Hâ9ˆ # @ œÀ8ó§2x^/Ð€ÒƒŽƒœ'8‘S@|¤»¡ØF5nÁm†wüíqŸ{Ýu€ò´ ™Å(AŠ)` ¤€Åÿ(¦ `"Žˆ2° R€¢Y˜@`1…È >@Å|0…Q°Á¦ ¤0 K 9@ ©€ Y E@ ‘0 ݧ7 +T7Bð ² Ioà‡ ›à§GÊ °%pÐ+@p Úp Ì𠄦im}rGw%×w‡V×7 ¸   phÀÚ÷}»0‘P ë· ²À¤@ 0³-° Y` °  q๠S Ÿ0sP q` ¹- ¦0¨0 L' …7£` [0€³L€E`òÐ .àUÿÀ€0 Öp Š,Ðlð|p—ƒÓW}iÕ£`‘0‡° 0Žð ¦@ :€ ¦ Ià„yP ¦`Q° YPµlàqð  ŒE@ ŽÇ¦Ú'B  qàª`Àªàä'¹àxg@ Iठ‡ÀɦyPÐ0@Nðj@w ,@ÑÜP  nqƒ(};؃h%Šh° sÀ™Ð´0 Y ¦Ð–‹B° Ž· £–€ °‹Sp¿È‘¤ £0>@ qPŒ© £ Π Œ q B s´ÿP v°xß(áÈ l ¹€têæp0À;ÀCРI ™ÿ€ ¤åg± l0Ø~q(6ð ð'K ³ð L Oð X :{Pк ›¹ж‰P ÕPèÐ Lç|\Ù›Ÿ–hu˜¹9Ð5 ; :Ð9;P*pL—:PáÖ ™£ð ¤ÀÞ˜sÐnA§• > s (Ðàf¡p‡!к×!P+Ÿ–GL!à¡% =êÁÀ €e6ØÐ·fZw¿¹V'àsô)n»†e5ð640†÷o½¶kô‰e* +Y °°€§y¨yBŠ q¸01pk™sg&à¶j7`y*P€e¹–k«† e€xš¸ ðq!r¿Pk—rc•©¡‰—ršH„¶oŸ®–7°+ળj¡´Š ¦! æÀ ßð Ü`š ›JÊVµ:»*k‘0 0Ðl#P©ÖZ鸫¬ÕjxÚjP2€0ð ¯°fתX˜–k Q¯+¡«?ÐýÚ¯xjYúšçÊV!ù ,¤!ù ,¤!ù ,¤!ù ,¤!ù ,¤!ù ,vNÿ8P†€*\xP‚W÷)¡Ôá‰%nÈI§HIªWýa=šT@ ‡ã¬”*ÇŽ7Õ¬b]ˤ€lNx)'§ÄY½jµ"]ø¶ .% Œ“âpV¾] jS’‚ƒ•qeRXV»v±[‡zpPb.ªz³nÍLP…;(·-GÞ´¥Û6¸†Ê”`±¼¯y½ÙiL§)áE2:Üð¨÷[c A'ˆ£DŒ2Ðï` ·oï±A°„‡ôÝšßV€0@½•Qcè%?ôÐ`ƒ 7PF9$¡!ù ,¤!ù ,†WÿH°àÀU *(£Ä bØ@b"% ,£„Œ7h¬À ¡6Ü@±ðĉ"o¼T2žMzõ¤ Ø¡ðŒ5R4t¨dß¿£þþq+ðC¢@@B¸áÀÙ¯6HÙçÏß>£ØD•aðÓ†%ø ×®`™J$W››ÒªECJÇ[¯ÿÂF%¨E †¢}#’Œ[‰¿q›´B7´Ãhâæ¶+`Á? ¬P-±¡8×óÙiA—§õ­3ÜÀb VðíZÑ„ÐdÍög¹mØ  J?n”È!ãÈê¯F­<†< >åˆáÈÑóÿ¾lÐ#G÷%z`ûFŸ›¹a x*ìØ°aÇ `4€ƒFôç^G?ôÐ`ƒú!hY®!ù ,¤!ù ,¤!ù ,¤!ù ,‘NÿHPÁƒÞ£DB„øø‡Œ$.<`$<¤`CÄFoÞ°RÀ)†N‚ ! WN¤Q@•ž6îŒ9ifË1uÚÐH@ tâd1°DÎ Tu–ð€aÃb È¸!†‡o”èñ‚‹(TЀC„I4”ñÂF‰ŠÕ£G˜^=9T$AF 6Nèà쟿˜ÿ)¢°c Œ6pØðc@³ûüùÛ÷OO…f\Pƒ‚#œN­º5gçJQÐpk¸gv«¾ìö ä¬+%Ý©b¨—ûî,`R9¬Æa‰@ìY²ì½›Çþ~܆å±ófþ[`9nÖ…"‚Ε|íê ”ÍübN9Ò( \zõðhÅ ¦¡¶Ï…þƒ*”P”öLf™)âw\¤âZ °b7ß|£Ä&Ð^%4´à〃­x‘?üЃ’? ™A'Ù!ù ,“P)8° ‹ ìHÈ!¡C' !ù ,˜Xÿpcƒ… jøðadž¬AB…Š*V„à€CŽŒH”Qâ†É0nt`WžËzßlˆRŽ6JR¨÷¯gOv€A°›Hܨ@ïß>ûþ©Kð#†"PžØpädž MýAý·®ÀÎt,¦Y9] š>:µª@tÁ0K‡£ºaÇ–=+PX5½Î„!§DîØºVÖûl@Æ£hNX€fÑÈ)§džÓÇT#G#Ò€™³e¸5þ'V³Ù:äȡÆŒæAÝ5]j2h (á!F xúü×naÎI’Œ!côoÜÀ›)kö‡U¢ÛKh‡q@€÷Ȉ€Q2€–8¡bG 184©b„C„»-ÂX\ÆŽÔêÉ›Gž¼‘ KäÝlCÇ€rÿB‡Þ·h^†¨/ê(îß>¯ëõð0P³m|sí¯w½Òw”Î{cŽÕ»_ûž-0Aâ$8Q yo¿ÜÈAΰarXr_N{ E‹¦I‰÷Œš=Ò”bõH(=öq‹œke4ëÊ'•"$fR‰*@A T ~êC7ЀH5ðÈ{Ödü̧Ié2@¡ SŸ¥ RDÓZòd 8Å?ü±Sžö"œˆðH20HÁ 6ð‚„ 5ð¢P d9è bàޤ `Á¦àLD¡/ð€l „ k½N ‚  €" ë>Ÿ*É„Üà)HAGq™:¤_¡ÐÃÚ)‚êtþðÇ>þñÓ @%4@DIŠ -ðÀg=Ðal(Fш€Ÿ:PÁ T  ÿ qˆ)’ Îvmë D€ƒNŠ`õ'lp‚€àx Ah1D, dé¢ANÁ lè‚Ãéc#;ÙŸâê²9ØÄ(F Tdq@*H1 ø ±ÀD*Ø0P­0ƒ¢‹,´@hð)¢P„,€‚ E€E$H1 &Ø—¸0ì‹ õ¢b "€ B€Ò4&á¸E0 ‚ø¢â>H ”ÐŒID Ø"W‚¸Ä(F/:ª'±â•,e`Y䀽£ØÄ'2!-l £ …â‹88¢üÝÄ,¶@ -OaYÐA-Ì…O,ÿ™€ˆ@ ›âD-ÎàZDÁª o–;Ê‘®§£0Å(‚$¬ÂKÈBDð(¸£@;B®„H!!c…&`Y›äÉä]òyðä-D"‡Ø„² P¤DÀ,2°„U¤v¤#`aƒ(¨"͵ÈY3Û¨•€R!€Q€BBPEB ŠCH€ ª‚¶ˆCÔ÷ ¹HíV‘«‚Q‰{š"€8A i ÃÔ<#߸ÅÎbdT+¹² qò(¶°‰90"-¨(¦°‰VøÀ¦À6-ÎÕfã-˜-¦€ƒd³!YÿEHtY•H…Ö‹mUÌ¡±`„â° !d€´¨%2PZ¨{QÈ€Ί\DA;8Áè€ Fà <ô£o„"ÒÁ©“\ÞE(OFÃ'Q‰M¡shÁ(TÑ6ìù`îø($àS´ ³pDv±…(¢ÍF¹ê n<Ïq¨Ä,’ЂT˜â ¦E¬n€Î d¨ ó(Bð6DÁ ¹ÈH@„hhÂÐÀ >pE*BºÐ7leÓ~™ìKŽ•@œü 3`"ÀDAŠLÛ9È„) Žgâ8Ä(|@‚C˜"æhè8ÿ&: "ä ©ˆ*TÎÙCÜÚ ömE&²<…Æ8e£ xÂ'T ÞaòÅ?`  ì  Ö 5  €Á5 îøÑƒ:õƒ!ù ,|mÿ(PÁƒLȰ¡Âƒ1DDXBFE…#Æ8ƒ¡Å…#„qBcŠ(e¤€Aʼn/_üˆ2 rêé¬Goß²?ÒŒQ¢Æ=ÿüùKúÏÙ€¨ ú1Æ9þöeÝ×t@ÐJìèQ"Æ Š’*åÚì)Ád ˜“ãÀÊ·SJ×vý* Ç9M¦- ŒZµYÿ5+Ðc iË”*Û)+ˆ¹:ýª@À´cr\;¶íÖ¼lÝ ”“nÒ ½æK€µb¯Ò 8wŒ‹ PØ):P[ïâÆP£1k(`ÝG=5ß8Ä63§§ÂÑàÃG2Ã]°bŒ$6Ðà`›µ÷Ö¾±j°ã`Y2˜Ç1 ¿õ dÐPe×Ãþ !ù ,‚oÿ(P†ƒcPH°aÁÂ8ÁÐ!A% ˜c¡E*N`Œ!ƒÆ‰'Oœ@£a *!–R`Ú>zõrÒSâ"L‘%bÐÄöÏ_Ñû”p ˆÒƒÈ~ °†tß>IAT,¡£Ç‰? t@ôª?¬P–4'GÁ/s梠j«’ƒYK *×BMCzÖ®Z×x`–Ž×­pÌ×ÍZQ€’ËÎýRFÌJ5Âg“8¡B(seN(‚A·0åzüˆÐëÛ¶l^¨F;úBŽ- ä8òcnU«õî2TáÆ?NtÊíŸõëiô(#0Jô$hð뛵óÖªýÈÈ4FP™; ˜O?ceŒ#e øñ£Gÿ!ù ,¤!ù ,‡mÿH° À*\˜P†‡ dHPF ˆ`œ€±£E‡cl8qàÇ‹%b” !àÄ $NH!‘äC”E¡W¯'½}Ô ô¨˜eŒ/Žìûç¯é?n~Ô(@ÇF28€è dŸ?¯K­ *€‚%\îå„®M¿þÃ6@*„`‘ˆàÌš3s¥jxmº”n±°Ö«€´l ~u;1X.]©uéâFmÀ4a4uƒR/ná± ,ؤÓˆÐÄ´é¹u'¦ƒœ0¨ꛕ҄q÷èaV7kšD 6@S5(•OKÍÇC'otB8RzŸùÖ„ Äá„Q”Žü›Oÿ[Ý› q^Lñƒ6k~óKÞ=d’~*   ‚4pCIé'C?PH!!ù ,‡mÿH° @c\Ȱ¡Ã‡T¨ð!C%R<ÃâÅŒ"„q‚¢Åˆ0ª”q‚ %N”HQña‰oþHpl½z@ë鉀Ã!Fœ81)ÐìŸ?Nÿ ½añÆ4nìè1 é>û¾-:ŠA Nô Q¢D^Ÿî“¡‡§èªVB°gËþ}}úOѵ@¨¦« ¸nÐ…q í1ÁréJØmšã# ªýR’®EàÁPÇ<¶ð‘½¤é² .á¡›ËÐcÜ V¾©ÓUóm¢­åÁáÙ:"ÅQk†x3£‡;0V,ò‡Is4íŸùó†©ÚTys‡V߬ɷ†MKõFSæŒ!#B€È~åtÔ ?ôà?¨!ù ,¤!ù ,‘mÿHp Œ‚*\ÈPáÁƒcØÐ %R£¢EAr<ÑqãÂŒ(c¤ˆAâ‰$H¤ Q¢@”c”èAÁ]=z?÷™KÐcâÅ£1*-ƒzÿüEý·®@Š8J0-‘U«N2bD€º¯ì?u~ ¬PBÀް8~äÌãé¿}þöµšCƒ^Ô"Ü(qãD Pý)¦š– ƒ2´4°ökA•%rØU¬mQ‚ ¢Ór!G‰™7çe¬V`8~ ¤¦Àt;'^íyà·ppËÁ°=RÔ@uuÕÖ{” àLÀZYÀ(q‚9gÆŸ“NA!ÀÃR7Ææ5‹zDƒ)3¾¨PïŸ}ûíø&\º´iØX# 7Ë8°ÃBüáTÀ 2˜ %ˆÑöPá@!ù ,¤!ù ,›n ÿH° Áƒ1”!€¡Â‡ 6„X0† )J”Q‚¡D AÄHC@HSv\)1$‰ Jyr¢Ê›î`n½z?ÛE¸àÊ+‘"ø#»þ¢þ£·@ljšGK”ØpâD‰%btÀîß>ûþÍ{ ¢è@‡a¿–°rbÒrhaPö¬?µtÀÀZâ%à¦Q³fbÖ¢™ë¥Î,Zµt¨ #lŒJÖ+ð,šƒÇíÊ<ùÑWêZ(Nž`ˆƒtn”ú¶CÁ1i |µœvÞP·uÜPNBI:9B‘£Ñ`Ù3E´ƒêºÁ“ ÇŸ0¬DݳÔžMhÐ,"|‰Æ1Ѓ€ãc67[5(@ L3‘@YQý5ß-$@mP¤ó p€ :° ÀšµOZò8pƒƒ& 7eD%¨pCF= Ï?4ÒXƒ )E‚ 2 ÅQ ÝA3ÜXc$7Ï`P“AI±žE 0À”Ã’ ±”ÓI1ìðC_~YS@!ù ,§nÿH° *\È0¡ŒD(¢€%b¼¸"Ä4<œñ‚Ä…ʸAѾz0éíVà‡ÃŒ8w4ÐôÏŸ¿žÿ”è¡Q@ %Jl8QG ' Lú·Ïß¾}ÿŽÕ4¨Jޱ&Û*0Â1_Ž`)nX€_ÒîšÅš¶Ç@Ì¢5`‰¥±^ËÐÂ{v¯Íƒ8ø¡ ;eLj… Õ3/Zµ" tàô¶_¼ÈáYõl±Ÿ98&Ç r¬}ûö«¬ëÆoà4# G~0˜zõêk›7f@C† 2°þÇž}³Ž'–0ª¢Œ e¸YÛ¯¼Tƒ!TßCÕqÀ"ÊW_u?ôá?(P@!ù ,¨nÿH° Á&DÈPB… Â81±¢2".P‘¢G)h8ùP#É1P¢$qÂà '.šPBFÍ8<ÔPm½z@éõ(aÒfÊvX9ðíŸ?§ÿöé!QƒJÜ(cA(nÜ´p‹ºÏŸ¿z;® ôðƆ?vXs†ÅÁزfëý` B€0…Üä0ÐCÝ8kVîš=;t 1…½¨UÀÑ`Ú¯ÀE]¬—­ÀeÒ8Ôul•¨ýÚP )^Æj— ìa©W·Þü´^ϡ艱ÃAµ_¸æœÖ È`‡Ý!Z/ »ñþël²‡›6 ;¸»¯,ZµK€G)Ý¿÷ïýí5¹ÞfþYÛô Ù$àM;00À–¤Ñ€öðÃ:8R@!ù ,¹nÿ(0†ƒ4ˆð B‚)`œ€!€F J„‘‚Å † Ò£„Á'R Q‚Fƒ,o”Q‚(ôê餷/Z”ô˜YâF PüýûçO)µ?`›Äá kšhÙçë¾Ó…rdÃ-§ P°ÂµéWj¢V›Ä@Ó7r’°mÚõ\  HÊ8A.”Þ¶}áF}°C"á4%ØÊ÷­Xjœ(Qã›&”Ýú‹YF‹=À…Rºoغ“8†MÝ·gz[ŽZ2Æ%;”üØ»¯8ØËDKp(áaíÒçÿ°A@³úÌJ¬a³Æý›®;Z¯b€yó8~fïßã0!ù ,¼nÿ(C@A1$Èp`Áƒ6œH°ÄC‹i¤ !‘¢B‹ !j,¸°£Cƒ €8\`¢â ÷"º¹ìçÎûÎëŽØtºV èBf`ñAƒtÿØå·øE}´góTp jkrXgPŸðáÖ™/Ð~þÑA'`€¡]—W<æåŠ4\2‹ ôL5#Ð)°'ƒó$$ u ´Æ+E#$ô Dâ%Í D†på&ãm4j—à8N…"Aì ´ŽŠ Y(@;¹’Ð?Õ3‘Q!@6уÄ8 €9N–pýQ^Bþ $ =àà‰íÄGP9ug@EÎAoÄ @œ„à@áYégl\â…a n Âß iƒÐ/HªsP™ 2:mƒÐ3³Ž;MSP˜ü4j3ÎH詨.eè…™#’UÿãÏ^äÄi¦1 Batëx ]à!¦jì±a}9…Í9³Á¡+AíDC!‰¿iÈc…' pK§)º~ã"kî¹XÕ1pÈÁì®ÆÁ!¼ÀQ¶=ÃA>ˆX(Ì òÇ"u¬¡¦Aª¡«ðÂSÙ^"‘îõž4p¤ÿǦŽþÑÇ:²HÅܱ@#'"r"ã.òG"‚Œ*3Ã4×lÔ ­61q7„Ü{öõQÇÎÌ-·œÍH'½•À‹œßÈ¢ $1_ðá±ÒXg©Ì4ÆZ‡-öØd—möÙh§­öÚl·íöÛpÇ-÷Üt×m÷Ýxç­÷Þ|÷ÿí÷߀.øà„nøáˆ'®øâŒ7îøãG.ùä”Wnùå˜g®ùæœwîùç ‡.ú褗nú騧®úꬷîúë°Ç.ûì´×nûí¸ç®ûî¼÷îûïÀ/üðÄoüñÈ'¯üòÌ7ïüóÐG/ýôÔWoýõØg¯ýöÜwïý÷à‡/þøä—oþù觯þúì·ïþûðÇ/¿Z£ÌO¾8ØàýáãÀÿÿ  HÀð€L ÈÀ:ðŒ 'HÁ Zð‚Ì 7ÈÁzðƒ ¡GHšð„(L¡ WȺð…0Œ¡ gHÃÚð†8Ì¡wÈÃúð‡@ ¢ÿ‡HÄ"ñˆHL¢—ÈÄ&:ñ‰PŒ¢§HÅ*ZñŠXÌ¢·ÈÅ.zñ‹` L 0Æ0î­Œfô› ü‡Æ4Þ 2pãÞÖHF9Þmp´#Þ÷ÉÿÏ~úóŸ ¨@JЂô M¨BÊІ:ô¡¨D'JÑŠZô¢ͨF7ÊÑŽzô£ ©HGJÒ’šô¤(M©JWÊÒ–ºô¥0©LgJÓšÚô¦8Íé1K©Ó‰È€2ÈeO‚¢5"1(ê „zT…Ð 4h*R{ÊÓÜ@¦;8HV¢ƒ® ¬Ô®JV–”©!«BâÈ0à'`A¦‚!„•@4jִޱ9BXYµb@­qCa4i8( ‚”¡š°lemø#¸• ²Yc PIu„žr†ä°8J `Æ›t#ÿüb ?Øë9äDë|¡ýž´ÒŸ€ /„­,+; €Êî 9ƒN¡ŽÊZç@5 à€PWÑY“!%¼VàP€@@]ë@ï}¯Z 4dhEALqá H²‚„d€ ¡…Aú…ÆØ@ ŽƒR0$ô5!¨ÁAÔ\†Ø ¡€„/ ­D®™lYð´¶!ˆ P\§žÄ‘•?À8T›UMl£LßM+µ¨!€rx*¯Âx@]Iœ r8C°?h€‰‚-(€µ”]×:¢y¯Ð/db Bˆ%p‚$áÿ ¤(°‚Ë<RdÈE%ò L ¡ï&² ‚Ø÷ ¨A Âp„”`›,A6ÛÜá °ÈZ\:€Ä`°ÀüP!€xƒ\ €F€¡²(¾°@>pHX 1öI Ì:FÈAmhs ” Eà¸`Ö@Ì4;í]À J@ƒ¶A €@„TräÕR’&#`Çí¼øÂW0HŸð óy þˆ,2è‚l!!SH*âˆx […,&,dNÁ êšk XFPˆ† ’‚6sZ •m„C..€ì¦Á!CÈ­s ÁÓoÿà°Rv@në•’”KgÀüÚ˜b†<Ѐ75@'Èyશ à!1¤,ô­äÀ§xÀUcP‚ª./¾a6€A΀_ šÎAô@r` àù n D ;ÀèW '¨`-PA n†ðÎ÷®Ä V`Èú![Há bT\aâÞÈâ ä‚\ < ø…±@ÊÏDU/ÁP‚˜¸Œ»6|At°%#Ç@6p‹Ì’±ˆjB $Ü8]9 ƒ‹>–Ì3·H0Ük@ðA^`d€ Ï×4p‚«fàùèÿÛAf z!(Ù G×] !(péK¿ö\?68A¸"ƒøÄ*€!ðTfÐf2v´¶paðb1€aÿ•û#$PuAj‰fHbªc ¹ç£G1°?©çrf•Ì% ˜`ƒ£]þC/]ÜŃ0AXb<÷{WÕ40F p/ЄM=ò…6pw2°x'z+ * 2`0Ð…:XŽF2 €+P*€°†4P0`úG_dD_Ž6a%`¤uU«D'€: V¡ExAk%€X A6QÿUkØaðo }±J%&VÚfw7‰qy€‘WûçhqD‰8@V_–€5uÑ};0†|¸¾wcćdt=Ð,G–ˆG»–U©T‰ª×¤w­˜<ŸE4€‘µ†£õ p6pŒø8ð7¶pŒ( ׈»¶kl' uwUKÀ™°n±pQ€hmv\l`[œöµØLFj9‰iX™2V f¦œ 9f‘Š/VAÐC€b)hàá=÷6D `0hàG‰9ÔÀëÕ>àô•²àà@mppm:ZÎYfh .ÿ0`Ð@,·FŬÔZ~Àûl?°q|;‚,v\Œc ªÖØÀypywy@@k èW°’ü{PaÜMb]AÐÁç]š0ØVÞ«À%Îp à7L·2ÄÚ¡›°o¦`g@ CͰnkæ?»}q‚àÚŠ83(l° ï§` ´€h[° Q€_© ‘Ð/'Ð;@Åq2–{t# Θ·h=°ç b¦, jêÑb$`¡öÇ.Fým«F †¶ß­õcp((ÿh­%aÊYuæ‚`l;z¬g™À Ö@¡Ò‹PYªÍA@_ö%g6Ž°Ôª°§P?` qk›fÜäÇä÷|µ°çP€nw‡'ð|´­°¿´ ÐÇ}ü1`PèþSÿüßpA$Ö‡Íjªß´b4 qÐb`‡-`ÐZ`P™'ØR°Èx'އA‰ôž™wyA@b(vÞA@W‘÷Y±&>þ3ªcÔÐYCn¨ v°f16@Ý/çêa ×§ vÕñõöêI°~Bðfÿ‘ì?=¦€ væø3Ôž8pq ó  L pŸ?W|ô¨z!>k‘C@jÀ\(†ÖÛøœF(‚ö×øíüž¯qÐiýmÞ€=)@k|.žœ¦2@Ùù*rhÝn-]æ ÏŠ­ »Wá $FÇHw°ñ§†çÉÀ"0ñ.„m¶hoI0h`Y S0`â\Ž€úxæ_b'o^—"Àv\-wb·T8°ö›†Çë wsÜ÷GñcxxÊ$ ÅåHààËîî–híà&Î@mTœÏAÿÈj.àm¢6C`$àÑAðÅÙP<´¹×bÀùóîà)@M/z0ï°§¡‡‚‚e”(C€3GìÆL«' ^°LÁBðB!F’%MžD™RåJ–-]¾„SæLš5mÞĉ³„5¬(˜£¡0ÜРa$A>aÜ„‘ Á2T\l*ÀŽ 1JL£† 2R&ü*GA'n¼xAðC[³z~ èDÀY\¬+ €8RÐxñáÕ J\Ø  ^É4 0«˜`#dÜ0ð W‚‹Ë‚𨊀«-¶|¹`Œ¬ÿbxpQ¡Y³1bÐhP0Å‹ø>YᢃœÍ?‡]útêÕ­Ë$¡Â-In€¾¡âF‹t`N¡#! 'rœ´`Ö$6Tæ˜Vr ª6RÜG̬óxÿ‚d°!A^ „»€&ä  JH!³† ‡ÈP³Md`…2À… ù«*l á0Ð"dá#œ(‘J(‘?Þd¨!]Ì"²*j`² vØ … Èï Éx+3ÌbÜAvðj©‹´¼®L3ÏD3M5×T!‹ó­.z«ê„ªÂσ`(O…rP!>%¥} !+Kà`…xmƒ˜ÝC8AaxJB€°y×åÕp¡£ÅøÈ‘p`  XË Kò@Õ‹Íâ•"„ ‚ :Èrf¶*Òrèr˜éÁ‚®ò™ç+Ó “®‚9Û^!†í,hgf“!†dÈÏàõ®f®§§¾zë¯g Tø …³ÕZÝ¢¦J]ZÈà¦zÁÑP¸Ø S„ ŸDˆkÎî^ÿNè_ @P6|]Ì.%ðW T°:ˆ |“AHp-Îii4ˆLAtv‘„àÿQ€Ub@‚Œà¾):Ѓ<€©@ Jp T!7ð\0EÈá"œBÉh¼Ã'x}% H>ƒ(U…f¹ÁÌ@‚„0Ðzò”)È ­†=2–ÑŒgdÊ PÌMgCÅüè&€H¤Bv¼Èü„2?¨B9¸(¦ˆ LŒBõÀ!bø@™¸È‹$¯´¨âKå¸: $†¥×Ô¶Œô–Ã)p¸¡¬¤F€‘ p@øA˜ƒ‚` (€²qŒ‚Ð.%;¸”€94€ã(‡ZpãEƒ ÅÿÀ6¨†ÅTC… 8`œâË 0²-è¡Ñï„gô R‹%È,T’‹©0B2‰…ddÐÊd"-(A’ÐH4ðW(`ð+I PN/¢ žÍˆ”Ø\@²AŒmá RK:b `hͪ50Ü™Ž3 0x‰ ÞTÂÐzŸÿ1‰‚€câLjAˆY><@9 {™¡MLàကÍl£[Í«ïè»f6·M°oAêw‘ÖüÊŸQŸ{ƒ%ÐâS©°K!$ 8[.ÐP ‚èÀŽg¨¨Àä£M @ŽæÂ&|çP‘ 4AU"Ó l„ ¤d­nÁ&Wñ·æÙèXOŠ‘ˆ™$Iæ2 r¼Ù…¨x€o8œÕîÀ ‘ÆW!€2D  a(ZpöàË*LÀ—ƒ/ƒ#g@)Ö)=7—ÛÜ綉 ÉG~oö$H*Ø=¨d€¤ðÁ¯Ra ?ž­hÊ– ŠÿH\Z6Å4P<þP6XÖEF A¦° cÝ€à)R1ÇCÄš[öÒ(TRD@3¨ŠaFAˆo͈r“£ U53êÔwÔRMÈc¬@@â6²A·XÓ'ÒÒr/¢B,@à³Àбê’«‹^Ñ=v²—}%öY—bÐÙå@=)­ tД‹µF*°—rð‚è`áQñì> ª°`#ˆ8Aú­‚öuGGˆÁAÿnÀØmQæ` )5dÑ­¿@å‘ZŒj<€Jñáè8¼^©³§YÂL zP#A Á ¾ä(­ÿN J €ÎÌb̳H îÿ€rby,è0_AÐ[%ôT8OÈ Ú÷क़yo·Ì>~ò»§“Ág†÷¤@_S¼ 6ÿ¯(Œkiغî˜Ïøl!§R˜ ˜‘è@AÀÈ_ ’öˆšd‘ è!÷j)Àt`2U™w‰¬x»è€f¹ªÈµ8ýS Ù Ø‚è ˆ™È’ÁDÙ¨X“!Ýðµ’£ò ”¯8‚ÐF‰V¡§Q ŒØª^ñŽîH±P›Ó c±ª‹à޵Â9/ixw9ŒÿÈÿ ¶u:l•“•#¹ÏHˆ’iA>ìAñÃÐ#¾“¨ô–?ì”ÂEdÄrC€7J€( €•w‘‹ˆ¬Ò–‘»‰ Á¿ðPüK‘lšÁa°8ĈP ¡W‘Zš‚È0ã€Qé°`Ó¡ ?J)žY @Ĉ‰i eLÆ”¿F”ÆiD·G¤%øxùà69è$@l˜øq Kšð€ž"†[ÈÚ Ö8‹] À¬ ^A ˆa-À€ a”w)‰@têDjtȇ„H˜˜h5Vaÿ‹(k N ‰_¡ ÄaŽàx.Ö 4r Pˆø¾‰+PýP¡šâÈ’h€žà%8‡6¨€;¤^LLfŒÈ¢4Ê£,ˆàÐÒ©†‚u"ˆVÈvœ¢üÓˆ €Êš3!Høºˆ_Qý‡¸˜pÐEÀX!´ü²ˆ¦i«•‹ºš†Dʹ¤K Œ­`²B‚ȹ‹¸%ÒA‡˜s†pˆ‹À¦‚ˆP±X· †¡`/rŒHDÈ’€Ê3»Å ¢¬ËÒ4M³s€Uc´©‰Ìˆä#‡ pMæé»1(‡àʪ†uØ™ÿ‹û(ˆq  *t(ƒ’x)¨…x9Eé“Zѹ<ÍëÄÎøºª`¸…tò!1ë€Ðr‰-#ˆl  †@O HL*D`0µ£( 0”À `Ëô€/“œÐïP'#ù¤ô>U§£PP%ÒÌÎ µP¾ ëb/‚`/tóˆŒhò5o§S †¹²)qâ€Þ$ЙÂT9"põH- ‡ˆo½^‡ à»xÐ…ø4Ð(+ƒ4š¸MB„F¯¼Ð(•Òé˜%Úø»ˆ ½#ˆ*-&mÃiØËøìŽèªlÐ 1:ÿ تk0)`®€Ì,ˆe¯è©‚€‚00:"們œ&e µaY‰hœÒDUTçÒ>átð¢Ïˆ bh(˜Vhµ[ÀÕ9 €éS™z #ˆÈ Hê bÒ†‚`²È`†Rx"Ø4Šà€<½)(Ð`‚Ð…°•§øA'¹ –j±’“(]ÔfuÖ•ÈÏàŽq«ª¸À¡€À €Øæ¸/ à˜ ¨PﲕRUų#9Õò€Ÿ{×ÉQ›µ*ˆ"ä7¹ˆž(Ì ˜ºÖ ’BÅ’cµrCËI D}ÖˆuÖªÀÿÉðm‘ƒ¨œLj"Øu-ˆy|ˆÓÙ´Öø(Q;³àÆŽ«Åø2 óØIˆà ƒ\¡/£ÝûqüÉVAE <)Ö&5Ô„J1y™¯X‰…Z)õ®ü³´ ‰HCQÈNÆkœ¯¸Š‡ÅŒ„èDwÙÁˆjq—AÛ…|F•XŠxÜYÉNQH“ T“ؖгœÝؼļº¨%ÜDýŠŒåBïÛ‘(@⣩Œ‰§€ø–•¬Š5¤Î^AH:™–‹±œÀ¸R–xÛ©! et ³R“ØØH¢@k€€¨ÝD,ÜÜ­P ÿ¬U àÏ`(E(¿³4…#ˆÈœt1"°…ÊHèŒhŸöI ¹ ”‡ƒ¯çÄŸ@˜Ò²— IÊY–*¥«éÏX˜ÆiÛ øÉ·`zý«¨«]½ˆyQ£x÷øÞ?:8Ï @NÐùŒØKÐÝ žÒ8X0¡‚HÞ¯àè‰ü* -lAùŠ˜6€˜ E‘ Pˆ°\à_Èê»±›ºXÓ`ÉЀ@Að.ð_xNĘ#àR4ªâlõÈ*Rè$ n”y4/Éí…è€ÿ–Œ°‚ _² ä"hÊޝP2SŒX­‚Õà?ŽÈP°S˜‚³I…K{$?ò£¢ø„T4<¢…3°´)8,H…¨¨(ó „ËËMž °“ŽEÀ¤Y¤‡ @9²O{Ùq×БSb(¹’@‡ã9†ßz¥hªÒrx†¯xQS'™* *y¡¦ô †jàµS#T+ˆràR 2EÀ 0µšän®Ðòp#P ^ [¨Õª…˨¢ ä‚(¨]Ø‚-…$˜ŸXˆƒ»#ô¹,`„\`‚°£(¨¨°¬¸Ï"Rø•‚:Ð*S (ˆÿµaMkC‰@‡P(e€˜3ªq:Ϫ»ˆsÀ‚èÜXËÐqbZN-ð€\" jèpã#!±/#¦c¨h’?öæ BÞ%€òÈ‚L¸,A"ˆO0|»# ௠CrS »¯’ˆ°Áq¨‹Ø 0ŽR¤,!¸3 €XX,|9ðð®7PƒùSVÐÇ‹ø…ÚÒK‹l¨9‚¸m j †Üà À¦# i Ø[Å-ˆ¤2Ip¼.uÀ}ّ鸬:‚½êÑFJu4È„@¨„MðK`´‚˜ À[¬اL"4À„´,ÿÈ/¨jˆ Y…²GȯC˜€B+SF:XÀà›¾È ˆÞPxÌíJJÈI‚Pïö¶‚pøøk v <(P!ÈÎèd¯S%†c8"ÒÈc2×#æ’•$í—Æ(ˆMÈgŒH-ɧ]¸¡H…«øí‹0/À[…M.²„ó9V˜á´S˜y#J&ÂZç¦Ð5Ñ»ˆ[…mèN”à2PzH¾Єr¨\€‰Ì ò„Ê­c`øÐÌ\fx†Ð ½€™õ.ièoöÄ7.*pØa€µ†^`!%³$®Ó/- $úòa?u«[î5ÕAËJÒŽ‚ …QØätVþ9›ÚX0áð•m÷þáÛ ú5 ²–ÁA½¾ˆjÐ@Å# 0™µØ%è²ø¹Ïд8!Ÿ|­B‡0xŠ‘,‹ÂCP‚Й2ƒw-©ÿ§ªº-Ï+b·x²3ýxZC´ ÅŒ< P#ÎbXT`¤‘ÈŠ©£ºÖ°‰Â ØòAÃuÐoY-9à€K¿ˆY¤`†hª€ $ #:0DaúÈ 0þ‚Æ‘\eÅÝԵ貺ø¬/ö_” L Öù°!Š­ ”UÜ0Qá8¡_¬[‚Ñ?·‡¶5ˆÁM û« ‘ð&ž˜xÐk™X˜¡uŽ2ÖúÃÇøÿSšxƺh¾?Fdûɯەü`*ûQË¥úly‹_IÖ§ â–¨|6‰5ÄGýø2v¢5Ý©_v¤}ޏRð‹ j{û••—9öÿ›êÔ÷ý‡ÌxYÙx®9“,Íï}Dñü†y)é÷Ÿƒþç—þè§þé·þêÇþë×þèÿýî—§ÕOþé‘}™ûÚ‡¸Pˆh#ïgÝ þD£“¹ KA~Ò·  N)¹ ¥oÿþ,hð „ 2lèð!D‚Ä ñ"FŒ nÌ8°cG"G’,iò$Ê”*W²léò%̘ ”(! „ ™:]†Üéó'РB‡-jTèÄŠ=2mêô)Ô¨R§R•JÓ&ΪZ·ríêõ+ذ*“Zkö,Ú´jײ5yõfζrçÒ­k÷.R‹Kñòíë÷/`»o³.lø0â ÄGÉîUìø1äÈ’^•Ax2æÌš7ãÈù3èТ©!ù , b‡ÿH° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠd`¤É“(Sª\ɲ¥Ë—0cÊÜ äÌ›8sêÜɳ§ÏŸ@IÖ J´¨Ñ£H“*]Ê´©Ó§P£JJµªÕ«X³jÝʵ«×¯`ÊK¶¬Ù³hÓª]˶­Û·pãÊK·®Ý»xóêÝË·¯ß¿€ L¸°áÈ+^̸±ãÇ#/†wL²å˘cÊË̹³çÏ C‹~ n´éÓ¦K¡^ͺµë×°cËžM»¶íÛ¸sëÞÍ»·ïßÀƒ N¼¸ñãÈ“+_μ¹óçÐG 0½:õëÖ³cß>=ºw®Ý ÿê8¾¼È?}þD¯žâ ?ïãß/¿>ýûãyò°_`ÿïF$ÈÓ È@í „ÀD|Ô!€ƒ†ÄÇÿùG¡E}á†vÈᇆØ{t¸G…¦¸PzBÈ}’¡‚î‰g£Hù”#E‹Ðã>Rž@CªhäA‹ Òã‹Ô ¢ä@ ‚Õ…BSV)€•X^©å”`ÿahƒºB lð‚ˆ`+àç0ŽQ APøtá áÇ8E@p‹j¤ã¿8hX¡ŒP` §è+Bñ xh z f8#:°ÁJAŒ_„Á /Ž¡‡ x ×8G1zñ¤à^;l@1p b(!X¸Å 0@„^¡Q•ÊV Z/˜C Ð7&¡ =@ëXÆ-nPIèâŠFDp7€ô'€p np ¥èÅ-41Œl@ÃXF).P È!£ÙE¨1 ]ô"€Â-zÀRè ëA94áP'¸Áq ]ÿ X½…8p^à Õ‚QKÁØ^ü ¡Ð. ‡S$ëJ0‡"@[l ·HÊPŒ`(¡]J8…ŽŒ#T  Ä(Æ$bE4£ñ£Áº0ŒahˆE/~уì ÈF°O³< @ >ñp@‚ >ø…9¬q¼´ VÐk8#Ë ÊÑ‹ˆArˆÀ4¤A g@a¥F9~ñ C=#Ç(+Pi cÝàÅX0ÖJUªÜ8EZÐ]|CÏ8ň@j0£)>Å4fÌŠ çÔ6@Ø0ÜÁŒjpƒaX‡p tè ÿ0 `0g8àÎx.ÁŽgD#Ph/ÐA s4cË05~,€h"[¤ÆfUkô”å˜:¨Á_, ÊÐ…¥ÐtøY“h€¦‡f @êЬA ì ½°NÀ7h1äñ‹f`#ëPDN‘@ÁÒxÆ7n ãß(F†ñ 4€Î`À jÄ‹Ù?HÀ0 HSƒ È_;¬1 g( ßh3ŽA¸2,c)~z, sÚ£…m†¸#  sô S.‹²J`|°Á¡À"4ñ‹PœÂ }Á#Ÿ u”B ÿXÁn‘C Â9zá´€8E5ÐJXC!·¸¬á…gè‚7íA ræp@ étÐfd#‹PÀ-ÈÑ€4ã:50 °À8sp n,àæ`EžÑŒPã èo½hƒ7cÁeÀ@}„lƒ ±ô Ž7Ô6` fàåE(Šrì@¸¢¡‹[<£D¸Å/°a€Â:4‘+ààZ9Ž;_8@xInÀR­–ÄÀÊÍq ¯;cœ€±`÷aÀ.&Ý2ðè×ÿ7B!üŒÿã€5ê΀o”Â%¯$6 ‡d7à:ÀANð 9,ßðJÜ0 з P ßÀ2cæ 3G @OøT@ä`$ 0„`t44)@/p Ü`ÄРä Öp PZ%Ø 7Р Õ€ã î` ÕPÕØPÏÀ ¿à ÙÒA:°]ç`°`ÑPØ @ íP Õ@ΰð æö'ÀMg:ÀË ow ¿0¡ePVÐwÓ,á’ À ÑÇ æÀ` ºÐè @é Äà@Ò Üÿàß0aÖ€¥P ÂÐŽu uà ¼€t P % ×0xFD0~P ¿sÛ z`?àÓ ð¬pf:‚-àLlÇ0 Pi¨ ßPý7Ò°UFh € º¬p 4Àw †…M¦LLÃÍÐ b`@°à€Õ0‰¬ÀqX <$ à`½°=@VPz h8 ÎEÕ@€Ø: ]šc/@x`'@útÄ£`äò/ p4) PìPЉf 9À0P² ¢Æs0 è`.@Gÿ A8„½pS:ÐB;ôHP€r@”ƒÀÒ0v¿ð ? >Ð5пP €.›´_lÄ` TJ†Ô`ΟgF°]z@;Àp ÈÕp `ºŒ÷É ¡ Žè×p DÐp æpP` eà žÕ @:É7Ê0vD€´wwP ¯(ÐòŒÁà° º0âÒJPþ%ǰ 0IJVcù ÀÌ@ $ GC¬` ¬@ Ò0 @ZÜÀ Åt0 Ö@w·h Ë€J@ eߠɹGÿ039VÐ ÜP×G ЇI¡° Ùe€B¤d¡,7 tOô"@%[(@. ù%2Àað ÂÐ Ý Ð]0Âà2HÀ Ä@ á 0[„Æ % ÑÀŠÌÀ pWÓ  à pù" ‘¿ù{Г¿ ¶Ô Eè\Ðnó5v"lòŒÀkp ô €fÄ;È7 ;ࡀ˭ø é åEÎ@ §@ `à‡Ç0 Ï€ ǰ= [æP@ ÒÐà  §°ßrPCE“p—”snÿvÜÐ · Á 29€'äÆ:P î° Óð )Y¥€¨að Î ÏjàÐ   æP™ò Ö”‹ qÜ¥Àyæð¦ÎPQ‡;@ÒeÖl¡ ìp ¡pCù ψÏH èf·†€{øù éW@™@‰Ú-%=ÛBE?  û&f·EpE 6¬° ˰–;@V¡à Â@'-PlÃà?º£¥–B.äR ð ÓÀ4Àz@ Ìp "P#ÂÀ Á`0¥°ª€ S/  ·Ð Í` nX9ÿ :fC9 Ϥ½Pp Eu§à ½Ð–¡0 ep P  =Ð^üÊ  h€2$Q¦E¥Ðþ6 ¡À 2ðœHÛ að· P½àeÀ ¥§ p Á€S9p9°“@ öÒÇ@ ·Ð µÐp:;@Zp Ë?@´ º@MÀ ÃÀD À º nwC8¡0UÍRzÐ Ëp<p½pv¨0; PÐ: Í  ÎÐXàoË È “ lk6 à Ë |áJûÙŸ H.*0+ƒ#'Í2E”唨(`›4D…‘]ÿw,.ÔGÄ ˤÐ4 ª‘ Õà€,Ð àÝR’ À9à;ð£Ä'À¯„Dñš½°%S¥¼•(ÏÔõr.³Ò’ô8àÀÂÌHÄJ€2ð6p<œ@L8°@38@’Ô¿.Ðô0 ðAe@=4°‘1p½ä9ÞÈE Ð.=À é ¶–5ý(I€‡SZ }Ò p>8Ð7‹>vÒKÙc'8,Ies €'1g `Dá¯Äž‘d½çó’yëÀ¡e $Û?Å ãúþi®Ú¤åÿ²*ðZé®P@7:MÃQÅð°{“7õòÀcÃ8/pyóyýb/÷Ò4GÓ6%£'X@²JÃ4 Ó5: -Ѹl+Q5V£%4 ½°'et4Q0AýÌC>8Ð;t#fs×Ó572 ?·ÍÛ#– =·ü4ÑL.ãk“üyPÍBE­Éü7«¢>¡'á3¸l7Ý?€Ë%S>ØS2ÍÜ<)Ó7É®ƒÌÇ{@pÐu ¼úDNÅBTT/Ð4 œƒ>¬: c' ÒÿB9ôRÌÈ\FÌ‚ÌwóÁ±J'¿V)äãKwC>fD>Yc'UªÓIíÌ*Î;@Xƒ2Ë, dÔ,I0ÄŒÔúçÑT2`D£Ñ$ƒqB««¬Ô ±Ö=2p=×ÉŒ>ܓͽ iÈ]Àd`@1Áõ’Ò’=@C0%c¢ôH(JyBT "P4 êšÌv'Þ"?ÞR6ö2Ù]ÌÍÒÒQ: ;Pʲ4&CÌ7=̵]ÛJÖqÑôÚ ÁÔ@.âÂÊšع)€u/eÛ3¥Û8p„ÂÖ1ð¿±*?@'°ÊIs£ÿíÊrÆ7½×_q¼Ù!{ 8‘2jØ1 ã zÍ7 B@ f0˜ v>;}Ó+ÀSà•Xá"óÞG5 ßa/vá@ÍÛ±ÂÉÍ+.×ÍÚ  zPŸ\,« ü3qvX1Äìßã-}râÜ6*0Xލ ¨N%^6vRâpuà7p4ɲ Ö0{ Ð@ çp YM`4ÐMª ëp y‡Óµ˜Õ )[ׄ“ è` Â78%À}>”5°«“ÔÃ|ÔeáHmÛºMÞ\QÈpà èp$؃])$Ð- *#4"-%ÿ`ß³Àð Ÿ2÷\6*€2*0h€ s¨`à'0É? Ù‰Î,2'‡Î,ÌÝ,$^¢"À, ÀÚ}¢Ò'`W{1/ Éäz¥À Öp ª²0í:JðF÷b‡MdÌ;p{Ô®p¤ÕD S/¡í›0?д›j'ðGÍ7 ×?P⊀z€™ýP@0Ý2§ÀÍ¥P=›.ÎÍÝúygÎPÔ3çvBrÛ™ëÎÍJ·ð s7{4ì™ÎJà5«ÄDJ°QÊ’ÓüNçXnÛ;mç^q¼à æ¥Q b‘™0 £` ¨0 é¦0 S >€ ©ÿ` ª° ¤ ¨°0©+° gà)ïS là­€ ¨@ K 9`ª` fó¤° £ò…¾Ò*€ µŸ   À ®é¨ð >P$@ËàN¡ò g6à§€ ÄRár4ôÂJ¬@–Û@  nðø& À åPÎ Ð à `9º i  Ó0u19Ü æP ^3·ËPÄ€ f† —0½PìÀzZ§p EGPA! Y²ðA"6‰cãð!6$`$F©\âPA;$ˆc–"40cŽ@¦¡Zâ Z– ‚”Va‚„d8ˆHèÀ‰7ÒxÃ4< â™t¸9…‚„³Š…~¹F¤Q&€S¾i›^`[NÉfš¦&M¸Bjz!âÿœ0(Ð*¿dÈJ‘o”8ì—jPâE ø¥œf41,ÊÑ‚ƒ0¸¤j¾ç‡NØæv¸!Õ… ´(á4&+8 ¡fœé-…÷dÀŠm¨ød Á9è~`àvt9Ep£itáëcÊYF‘ d`oÙißUN¶x¤·^{ïÅ7_}÷å·@Dc“9ÙDZÜÄ”*E!Va#ƒMF™ÀTnˆb•)ZØÅ 60É‚!F™£E$?”F‡U™#Yáq!4À„–ZÉ@Z^dƒ&2(Oh‰Bƒ@€ÀÔxHრŒàA†èEÿ™oBy`õvX ¬˜¦˜j@n”(@t†Y†M †˜Bùæ‡z·š½NˆÁ/¿vì›#dpÀÒ”(G PduzqÀ²q¬`­†r~a ”qzH4°nh®phm×Û^‹ƒR¢qF‹ vЙz`AYøˆ3¹ô˜sȖa˜9¦©¡ÐEj"ˆ!‚IŽQ§pH4w¯?ý½~·ç¾{ï¿?|ý‘#‘b ±Å±3’$Á©HÅnÒ‚´`5Xph²Qtàÿ lHBra¤àÑÐDÖNàš\Kzƒ.4± ]Œ­V©ÁnÑMˆAšÀÀz1cP`‡ P‡»€…€@+p#5¼ EôÀŠ0‡@à€`X£ˆS„ó´Àk<£2€:&Aô š(5ÎÁ¹ TCØ0 ‡t”Á7íº&à€ € 1h€0¬QW G‹ÊiÖ³¢ŸGR`è€Â( sLa(:“^¤:˜„ bô^·Ä^õÄ·K^öÒ—¿ôe>a†LÌÁ™ÈÀ!P± PŒÂ-ÈD+0 4d  ÿÈ%œIJÀ­@Æ(¡"Ý€ ±È,FQ´©0ƒ|ЊHSÀÀ F ¼ "Â'p1Š$h@›@,A„”@ íÐÅinð‚¤€,À@(ªñ t0£Q¿ÁŠt‘i ãÒB;Ôõƒ ôâØÀ†& aàØèÁ .ð vüà<·ñË @…h|cÛXÆÝ¦Á€#pC8¸!- F9¬¡ÜÒˆ6~pƒ ˆâPÜ @° t<£ÉYÏ _@»ªø Ô@‡.pà¨wÇÍ»DÐ t4˜7¶q‹xBÛ@ÿ)* ƒc|ÒP‚ЃKÎ^˜ŸmhE;Zý`2Ðr`ˆ@-( pPˆ 9Á :@½ÍÈ@2ÐL FPR€QB.¶ ¼• øYYÌÁh"¨Êî€ò€@2Hn ‚x 2€A’Ä@6h¯6°_œBV¹áéð k@@ ѺA ˆ Ô 7€ÀÃè€z;`É ´(,‡ZÚ ((á Ãa€Aðp€›åÀ6\‚ ¨¸7 0°(LEÄJ ”õâÚWåp€P  É,gò‚Opÿ,Àá ” î@jL4©çi—®ÜƒdÏê’´_s˜Å¼/œ6¯N€‚ÈVYÀ N0çØÀ*ÀÁ J˜‚Œ$ ž:…,D!B0…0‚ +HA Tà ""°Á ´Üž¤@8ØÁ T ƒ —`xšKð¨ 0€o{ Ch ¤:h€.¨¡dE„Dþ"µrj†pàœàU'x±”ã7ÄóÅÀ±O@ìH+¿¦b×m¬Íbs q/ FëàWÝ@l²‡ß÷Ð@¨$ Ü“:((Jwñ¹Ê‡+ÓÞÿew Â¯y‰²M÷v!’W¹„ÏÃ#>fŠWÜâ×{eéÄYZ¿JlFƒä@߯€ âûHˆ@lTl›Øï€¦c,aY›>|Ky VP‚äJã8‡Í#O@‚ÓݽV€k\ëœ`iF·|vö6[>îý y›öæ ?êÑÁ¶MŸ.¦å:èAÕmŽò\Å ;è–aE¯Ç6ÀUÂ0 `ªÓżW7»}rëÉKËtÍßqÉxŒWÞò—­ÙÝ ^>çyó…ǹêìwÈÇ·9PùÊSþè¨Ë€zɉ Ïyöû§ã0ˆtœSîô\Éÿ  >A€k@²'¾èîÀ«AÓqü4Ûù‘ºß¸¸ƒ (ßóqï×Û{à lÛÕ‹¯ÏÐ’g?6îå@ Ðt÷J7à¹Ùçåø¿o:W[ÿ|¿,è×gò˜ÀÀ]ºP–P-ˆM#9úh&;´*ÐH5ÐH@p÷€‹bè<{âã H÷r/M›ü8“ºB/è›:H‰ €1­Ó¸¬ø0öê¸úk>H:íã". °0€¼Ó»"%ì;û˜±Øà… Ȩû:Ђ_8]˜ÂÛx?`/àˆ¼Û8­ìѺ-ã¿ê™èãÁüè2ÿÊÀ7„Ã83KÍ»|Å3]©(:í3¿Ÿl<Á¸j`†Ë2“[’7þk<ˆ“<]ò²úÈ¿˜ƒ¼J”ÃLÔÄMŸXísã—Ås_BÁÐ9`%à€Ý¡?û=ƒÄ4ÔžK¬C7äÄ\ÔÅ]äÅ^Ì{ó °‚Rxip¤4d»‰{Ĉë¬ÿóÅg„Æh”Æiœ`?ó"MÀ†uàà²þƒEðkÆYÄDj4ÇsDÇt¬¸È8ð€Ѓt جù3¼IŒÄqä,uôÇÈ€ä%£ž#«€ ‚êˆi1Ã2ŒùàGHȉ¤ÈŠ´HÿÉ•0–jhsÀ†ísÄ0œÄFŒHF¼È“DÉ”¬È$5=†dÐ…Ð,‰ÃÇp¤DfÌ%.‹E•äÉžôI`‚3îAÁ¨õ³ ‘ÜIYT¶ÓÉœ¤É¤üɨüÉÔs»Y®Ó©;¾)Çî¹»­« 1ó;ÅØÈŠØ0Â=l0ù Dú@»Ë;ó«I’œKû£;x¹Ëº”ʽƒ›Zš 'Ó7h/а‚Ф e²cÀ™G9P‚m¨8êaÐW/ ‡^8%H€cˆŒj€ è+ð P8‚Ë® >aÔ-ÿvPœGRè€PèuЂâ<…PxÂú-öÜ;‘ʆPQ†\m6‹Hú0É\¥Ùšõ¬(kX†ø3j€ŒnP— †nè†g ¹h8‡s¸eˆ"pkÀg ‚ MÈÖm-@±%  †tÐ ê±i†n „×ys(©‹]Ž =8%€‘j€Xq€à†P(n`pÀë†rxu†  €Rø†o°,`V8fø†fØ€jë}½ €LQ‡IXȸ"S+@‡0Ø€€`€IH šk6誼*vÓšô€Õ’ɼ|H›ÅÝÜ¥íü°ÿf€è€nˆ†`†hH,PB€1«†h8áè9h70]˜ rÐVe‰­Š(iX8rh†p†g€^@"8yÐ`Ù¨EH‡K s(Þc˜†ÀV(Îm(…haH‡aL‡E‡_Øj†¸€+Hh‘HHЂjPfˆ€åhY ¤Ìp/+öïGÂM€Œux3Ñ"àpÙ²YMÆZÔÝÖÝíôݤÚ 0`¸…j¸"˜†k8†0à hbˆ†è8†ku † ˆál틬†èÀÀŽÿY)qÀ£_ †xdép˜TŽYc‡p¸©­€2@‡pfX€F‰•°+(+ ´ sÐ ßùmЄ…Ô…eè… ##( ¸¡»Š+%¤2˜1l søÍzWIBX9 £ްCïSQG™ I öå\ÕÎk8†¨ ¸†S^˜† ¸²PˆPJ¦@^»as€‚†dØÞPøÈ  †`˜¬`€h8ô•p(…j€8€ÍMÈ_t )Õ †fÀ†zDÀÓ8di(,0FN%€R€d] ÿ Mp€g†ÛXœ bnÚ¼!3¦,X` è8lvÜ(ÀÜΘ€ Øt(…½ª §ã¢âDÁª€‘îG\¬Õ_&jí‚à†hx-V(^¨W(…ƒuX (lÐ"È–oˆ9p‡aˆ€  =øÐhj¨ªË0_ò;s°a¸”‘²V€=0ѵ•ÇÆØNfýQy˜† ¯ Àb0XàÐs(X"À†h šmX€¸*‹€ˆ¶UVT=…((˜†´¢#ˆ"Mø/T-(Ђ‹aip• …PЂÿeX"9+(0À€c(†â¿¬®IìAGÁ³S¤î¬sËü(Ë¢®<¨ZnP!õ˜†R€[† €‚±í†Jex‚i‡e g¸†f¸†`ˆ€ b@‡hèµat8…`l@s°†:¶M šh˜€ PsxtÐƒÐÆ/|Ön0 9¨uÐ…È9݇«a@+¸†2h€Kà†o +hV˜•­PÁ}8p€rSav8…°›bHu8e`€i8*‡)v8‚F †r°SPégMpY&>€Z‰¢€2h‡ÿPh­î¥tÈ^NÇë–C8ÇnîÆ8ª‚¨ ÁU{é@å°~:51"ÐPˆ ¨€ÌèP‚(ÈÐ8‚ÑX3W£Ð(0\(°GÉ£šSX¸…rhe)±8‚°ÌÀ’“Ø€(®€ ›3á0!Ä/_‰2x€ïó€89ˆ»ø©`2ïì‚$QÛ»Ý ȧU³:¾²·]gºàðG’<˜¥N5D²éÞÊ1³nì×T½æ›w:·¸9[Ó°Ì«`¯¥Û•ûµùЀ]á+ð» P¸H¾ÿß,—h½óÂ+k(…|¥¼ ;À` ð–VŒe·¨ë64½cCh/.ZÙ¸!iÙ¹µk¨äÓᕞ—á Ñh´º‹wÊCWœ]ùƒÊ}Ô—í³—]>.’sðsçã9ó›³/ä: 3A©_9:³wvÏÛ<½Ô¢ýAàÐQ 1}·h/c˜åó@ª0H£ÓÒ:kƒ1°l¼`ZŽº·>K^É2ÔÒõŠºàqÙ8´Œ;Z1YzCÐú‹nëá¢fCP“P¡•óÛP[aÕƒs÷ÚjZ9:Úô8ü×o/Ð!¶øÊ>ùXüÿ¬ý±j}¿µÛO;­{uD_Ð;¢ö›yt‹ Ø«x' Ñ©)€·ö@3F;œõZîxûؼ×H5x€(0ÄÏe`€ ÷"@ ›äx$÷*@ÿˆ*JÀ HP@‰ 0d£!D†4RÐ8qƒA"ìhøðaÄ"2Àp#"H‘704ˆáaA‰‘kDp #%Dœ>îìéÐ'Pž)q<€p"¦Š7QÊ„xã8˜æQ š vlXP€€x2ÔX AC DxñÆÎà )Þ¼z÷òíë÷/àÀ‚ü b ÿ;zȶ‰I§(à x¢ ‰SΚ SÂaÇŽ+pü(QÊœ=:éEäD2NèXÜ³Ç :¸\‚†€š”- Uá†ìä2:@éÕL†?N- Åd‰ÈÃêÚ¬ÌÊKÄH£LÅe{0þék nirP*Ô /bXÜñãÆC=,vC -Öb½”±Amêpi;LÅPGeôR¿±C 4¼ÐC 2”B h : ÐR8¡„-Öžj7ü0!c.U)¥\ ¡4°€ iÆ Ã6â #{q0I/ă h²· 4`p +ÿ„L3r0¡G„’Ì0' Ç0Í”²AC½Áz4ÓŒ3¥p°Ta :(¡…z(¢%ÜPApà 41ÔHU^A7DpM9ÁpóÍ4pƒ ]õ+ÑÐ@Z¬óD£¾Ð‚g‘WBÐCÊ¥ è2Ñ4“N/Ä&ƒlš†Â;Í4°"Ø03 :e`à 7EÚÃ9ÓC `%C¦%ÐL0T à 4ŠAO8É€ÃP¤3ÉÓ8³ªäÐÁZÜÔ 8R ìzRXL’,€¨£zà@£œDCh’e¬sDè€È1Ó ÿ/`ðÍ/[¥C 3p <@e PùÀY'ÄÐÁºF×<´1¡ÇÂp(,~ ŽFÊPŽ2p Ke€•*Ì€#(Ã9Â@äfèbà37¬q p çD€€] o-Hã"¥À5[ T}ƒ;<¿j@!Á€ºnêÕŒoT@àv5°ÝÒB|Ô$ :30Ü@0l:ô‚ÿ5 5À#ÅëFè2Äe@Î5Û‰Ðà3ù°±ê*‡r4¢Æ b˜D E>ãE RzöÊGÈþJD ‡÷†YôJùä³cŒsUœq@Ë O…E.§tH4Àu $ÄñGñ„4BŸDÝÐn\¨4_Ä1DïÔÅÂ…R‡„=#‹RnRK4'CtÏÌ?t9gõR"@ ¼@$ÆAƒ7¢w\ ä Ðd\ ´€Y“‡ì¯ÌdÀ'|B ä@÷ €´À ˜õÄ, Á BˆÀœ€Y‹À €€ä@pÀ  €@PpÏŸ“‡Ü@¬À¯ƒ@ 䀨€Ó Ü¡lÈÀ @² ÐÀèÂ7pÃ/Œ7€d{ Á@A€À ü€t ( 0`±¿€ì@ÿÁ`Hix(ÁSŒ'÷À4. (A ¨Ò O `LÙ`ÁÀň¬(*ºc‘ËÜXA °”¨¦—ù¡‡üÇ‹|ËÞlcy—;òvs2•´üNd{ËŸÌC¹ÿ(ÅCÀWJ¿6 ³*`ÿù=÷6Ð7Ïÿ¹oýoÿ3E9b(=g'ºÓãW |Â(&¤BhÀÀ, ÂÕûÀ&¬B&ÄH(Â(ÈHÀÌBè@. A¨ºl(Äà( )D&ÐB,Ĩ£‚Ô[ýìw „À+cŒB.ŒB€@ Ì* (øÀ¯ÿA40­lÀ‰€ äÌ-xÙ0ÜÂ°Ô 8ÀHFÃmN€êA†Øä˜C9H Äã64CÔÀ¡5p Ûä 8F(@(|öÂ6ôÆ3”ƒ9C¼7D5pÃDÀ1lÃŽö€( )WC9€ƒ4l3@3”ƒ`+|6lüué¼ü÷:ýÏÿkS8l‡„C‹v…<@”!à@ƒe |Q‚F‰2R”xâD‹ iÈȸQãE‚A&00F  P9râJ—/aÆ”9“fM›7qæÔ¹“gOŸ* äuhT&P›$˜É’ä*qr±aT‹M†L¸²Œ5!ÿ ­,=j¡1³) ,G­Øø * ©O(åÊ(W”ªH%EJE 08‘ƒ©(£PH2ËN‘)>XˆPÒNW<ª\âÂH„_Ùti CÀ§u<еÎʆs¥Hk`Xµ¥Ò)9@íWlkt}cÆ\Øz9À‘ã´ :Êi* bÜ"pøæ)‚uÏ.@a¡…œa~”ØÀaœ¦&­““Ãܯξ58U®†ú¬PƒP*°¢ 4ð¥ŠJ"I¢’ tHÂ)œÐ 1¼Pà 9ÜÐCˆa¥ƒ@<`Éò " œC®kÿ%ß„Á¿EtIp 7¸ÖU³mî¯/Ú½ ÃAÜ«.€†Ð}× à@ˆuèé2b‚\7É$ïøÀQ>"”Ç XtàEŸoއ¾^˜– ñª£óϹÏ5nÉçÝÞÔQÝùL²mtá?«€z   -4 dõ "ƒü`]?HH z‚œ =ÐAz_ =ô`—ÁT>eè 0ù D@ Á®d}£@Bnðƒàà^ç¯7ä` ô`ý@D%j@rX¨ouð­´ìŽ©ôà"  ‚¡êÍ$†ü^@¤o@ðÛÐâ " ÿÒÿ"ÿ"EâD. BCïNú"ŠØX⌆!=X¢$‚ü¬/DDNDŠPº¯Øb@¼Ð/DÄ+Dîm%:À †¡áÆËHP{à^T›ð!È ŠÁ tl¬¦O†î»ð­O¬ ØK&4.Âlï÷xïoèð0ñˆ¯ýð× €¡ˆX HHl #ô) à®k Œ€T` `ZT¥[2OH`À†€ RàXàò®4*@¾ tì  ZÔ« ötA  ¹XÀš`n  40Ï»ÿÒK"v@¨¡7¢Qñ‚@X@"€Ë‘ t‘í<`Š@ÀtÊ‘ h¥ ±Œ‹ÔÑС €‚@`Ààî"¯$påª!"…©b .¥8@.'RH ¼K jÅ€€nà" Ø" Æ«`#  àv` :@0’@MR[àîn‹šÁ ?òÎ`uò¤~`BAmf"ÕjM÷<è„§*ÿ°+½òè<€~Á¬áTV N£pàä ¢áHè6ê„AÀ ˜!~ÿD@ÂᢡR€z`¤A@ z„á˜R@-_ làp¥˜!Dtá[Ü 8 ö2–îÌA¢a6€ä$zÀŽA~!ä€Ê`z`ŸŠA 8 /®k VKÌá@ºá¢¡6@ÑV“.@Š!N¡áÝ4!ŽRt@°!d ŽaX¡”à&¡¤¡<àDzó¶Aàˆ†¡ ¬€t þ¬eï” ô ˜£Ad Ba†áÜàÂà0R Ž À œá¡< nA”áàn( zv`4ÿËA€…J ô@–Hž¡´`N ‚!œ¡Ž>œÁNÁ5aˆÁ7•N*T0€tAŽlñ ¦a&‘ Ùþ«Ó F D+yî+Á4Lf …a¨¡Òc­rˆ ˆas~ ¸AÂ%°à¬¡n¬@›!B!œŒªáÆ!ËAQ¦¡‚¡Z€-ǪqXÇ4Åì’“Ba *&a&ÁU²ŽlUm„Á†!È! @&¡zÁÚó4¢Tò¢aÄn؈aÂ`§ÐA¶A%š¤œÁÿàÒá¢õîn`¶€ÊÁСQ‰atá4AZ @ÒœA&¦ao¾! ‡~ ¬à^ƒ!q"’màä†at@ Ò!@Êðh†Á–oÌA°ÁàÈÀŽ%V"/Òáडp#š0 Ü¡V ¬ >~!öó åCº´–aÒ! \…V«á‡ˆsm~oèäÐ6çp‚÷Ätj©Vb"@Ö 4A `¸ B<èДn€N €ž¡~ ŽÏ€ª¡6âà 6ÿ À¬àXœ¡¼I¥0 ð´î•¶A î4ö.' z À–žÌj€Žá  ÈA.âñ2‹^€2± ÐÁ R 4áN ²ÁÀnAÜ ˆàrT´€@”¡< Ž. NáXà8à táÖ †A¸€ºåÔA>«á ÀAô ~à¤áQkÆ!„¦Ì»ð/`ë¶Àáb‡^­áà¬á0ç à~Xáþ @¡° ÍˆÀ&vN¡ÌA šA'ËÿÀ Îw(€ä@N€„€äàr†a|1}€(Àáõ8À Ô¤¸rù°Eð蜶j™¸‰qªKÜ àº($¸B¡ÎÁ"ƒª%.!6@¦!\Àh°.À Úa¬¡ž¡°¡ œAzÁ@"UV ÊO;€@z`¶¡`ƒÚÁP·a:à~¡WC Xà’@¢¡*`€@Àa¾A H€|l¸<@à·"@6–µÌaS‰ ´À1KÁ6¿“ÎÁ°Ba.~a_)äàŽó¸¶!ÿ<¡e€•àº!  zƒ})@Ì`‚!îz‚#28ÀºpE¤!"À‚aÄEÆÁ Ô!sÀá€u€²¡`5KÁ&à@ªáØ/–ÁôîõÎAŸKá<ÊA âé0€¬’áñN@ˆå Z0 *t‡…a|˜âJà?3øˆ¸¦mú¦6 RGÖžî  Êãn‡A¨ÅöspÀŽâî²a& á¬àZD°Àn¡FØ2 ¢8 ÌA8·Z ¦Ù€ÀA. ~€à¬¡ÿSàP@#ίŠ Ð!bRÔaÔ†MïÌ&+À Ì! .ò•Á¡6@sà†&!N`Ì"8º ¦Áà˜¾É âá˜k@ ž•ÿ· @`Ü žxA=˜˜Aœ Ê@xáUÙv¬T55Δ¡7 ’™!x¡š¥¡^ü0ÀÔõŽ\ñŒ« àÁ¸¡|šJaкÜd`13W¢az€N[6`À¡æ6žÁgÀˆá¨AÌAÞ7œ!¤ „¡j ¶Ö,z!Ú¹hA¸¬àŽ¡èA:¸a³OÁÒ‰¦¡àaà¸R`äáQ@Úá°Á:@FtȨ ²q4È¡ʦ¶íÒ  mztJñ^®äÀ² a^ï¼ " ÿ‚6¼8@ª¡ªaJ  ÓžM`Ê©¡” °A}OvÀ´NØÂÙ½ÝÃt`w¯)ŠDBB!zÁ7k ¬${l`~¡ÚZàjS:*„¬JáˆHB'Xì$î¬;x:@ nA4aB`n€~Ž@ Tˆ¬ bÀW÷\ÜÜý÷ßèNc Ì AÌ)¤XØ{NÀpÒñ´¬B@[Dë›" t9€ `*<¥!FÍr@Jj0 #`8Lê‘PubÀú7,D$îV’#càb˜:V ”8X#Ž;ŽŒ¡Cƒ1` ÃA7dP À!B‰‚;8$HA@ [Fÿ†;:œ¬à@† 8à #B…”¸a²ÐJhÈ€q"ÆQ Jô`ЬZ€‰2~¼Õ@ ©''Æp@AÇ)ĈÀ‡G*Vtz.Ĺn¾ AâA„{`àá†ôd 7TÀ!ñ-Ò pP\8´èѤK›>:µêÕ¬[»~ ;¶ìÙ´kÏ>°AÅ‹'”q°Ô=zèôêÖ *×øÑ ,pìøcE‰:zì¨a†Že¤p œð G”€pƒ8h·;êÃ(|‡Â20– \a?°Ê4LFTPýo'@uÿRadP};P$ƒ„;°!D;è ƒl “S Q†ƒ Æ·C|þðÜ s]ah;XgP 2œ ãBrÉðrLÂÁí@ (ƒwâpà 7Ô`"=öž]2ÐÀáf]T>¥Ã—êéƒb1pGœ\ðÉ  Jõ¨i[žzîÉgŸ~þ h ¶€‚A9ä🙠`Z PHXtð¨ðh IC[…apÁ„ä‹h‹Á Ϋ(BÒµ^ã«hÄURÂ-\ t#pgvPh('xl€ lh à~–À:Ð(P“¼·ð"PÖ€ ¡ô3fìq Ò@ žqÌà Í0 ë8Jp Ì Ã@  Âzp À Äp ÑP Ç`VÐ Ð ÛÀÓð ?PÙ Ͱ =0 Ñ Š€ð ½° ÍPÊ ÒÀ ÀÐ ®p Ó   FÈ àDÀ Óp À/Ã0 ÂÐìA Óp P°Îpè ¿@5ÐÏÐ p%å犯hLÿ¤0 ©0 ª``›© ¹€ £° ø· ªð ´ð 0»`:° g0£à›0 ­E° ¨€ ¹p«0 ¦@ >à³ Ž@ ˜p,)À à, Œ@  ° Ž€v¨ ° Eàòð ¬8<$`ŸtˆŠ CQt` ÖÀ Ê  ×UÕPyêX°ÃÀÌ“ ë` à ÓÎà¡@ à°V ŠPð PÂðzš ‚Û° ¬€ÇPÖD Ä aJè Ô 0 òÀ š`¡0P ìp ½  °ÿ Òp ñ; Ï@y=€Y ×p pÕ€ ¬p zŠ@ Ô0 z€0PXæ€Pt°˜™?90 fvð Y€Ÿ` -à³ðSP l ›` ` ¦Q0 Y µlàh@ûW´0€ ¦]—L@ lp±àªàvEÀLÐ>° ‡ s° B «° I°ÍQ?À eÀІpi0cÀz€:Íp¿vPš€= ê ° IpÛÒ‘Ù Ø ÏÀ P Âç à Ò00¥Ïà §àÿz0»º¿ Çp PÕ@ ô)  àð“JÊ Óà P   é°0 Ö@p ÔPì  P çàŠ?P1y p:ÀÌð @+‚é¤OZ?Фp›0Œ° "p‹˜‰ >€ ¨€u³€ 0 à¨Q° Y€»üÇËèñG g½Xl—B sàªÀÅ™™P »À°µp´°µH E0(Pp@60RÀWM`Jà Ü€ Z\övFÛFRV€ÿað½P °!£Û × V½ºP §p !  °Ûp   Û  àð  ßð4À ð ¥P½` Ð Ò°  'Z Á¥ ç  Õ% @ P åð p ßðÀ îZzàÕ€ƒÓЬð¬óIÍ J ËP`ŸõJ ¥k±€B˜U:‡ Ú ¦ v° >Œgp™£gZQP§IP f €Ç>@ ›Ð£àu‘ ›Y š-`‹-° ©àvQ`f થ>ë-À~”‰°&Rµ6@ÿÐ`Æu`T× p«ðñ}ë à@€Ÿð )+·†ØpÖ Ñ   ذ½Ð ÛÀG YÓ° Õ0 æÐ± ¥0:Á` @ãÐ P ¿P®¬ªçÒà ðÓ¯:PM& ÒÐâÙ¯5Šè ÐjQë@p]ÕÍð €Wqˆy±É«¼€"‹¨§v`   ¥¦à© ›I ¶¨uÀ³… -€ª »À³˜æ(ªp‹µ€¤@ «€ Hަ u"phO‡g «  l0K@ÿ Œ B @óÐ &75€9`YÓ@ 8ˆ°ÎönÀ æ vÙÄ€ Á°Ù°;° a£åpß Óð š; ð€&° ìð åÀJ:¬0aÀipÛ@ ÄЀ§Á° Û‘Û0¯Ù¡§p0ºÕ0 çà 1°ÎÀÃUD ¬aÁPÏ@ Ç  èÇŠE¥`ǬJ`Ô¤V¶¼ƒLȰÑS Q°I˜SÀé&BB€È"S‘¬hWÉ• Œ¦À"˜ë‹QÇ"EðÈbçÿ­0‘|ÝÖl6`"°YÀa§LYP6 ;p ,Á2P,@pÍ© ÑÐ JÀg5B*@9½ é䥠 Ù)ÀÞÜ?  9  0¤Ò9 ¸Î º+0¼€ @+8°½Ð ¢ VÀ‡“P º  G  0 aP 0 ß ½%1 eýñ¥Ð a€;.Z p%Ѭ`ÿ‡Ö,q0 Á€­¿p„¿VÈ3MÓ«ai"0v#wÆo'Ô!u8i„ñvP'Ìv v@‹Š #6pwÿ«œ vwJ"5)²w>CÔN7´öµMú5>/š p ³´ð{Kr¾ðC“Ö4à @äé éðY÷*‡š>¨¡°.Z{ßš6@:œ¦ 4€ €yøB1Q “ }ÑJ}…û‘Àº¡ ç  E• À¶|P0ŠAÁ ÐV"/ Նܪ]ÓËÍÜ…Á! ÏÆÁâdò6mÑÆ7Ð϶oWhˆ¼Xäl-`,*€Èð±/¶+íGâæÖ*€¡rV=€o©rV€Æ!?ÐUgÕÿìm. ´" Á"ê¶’N=;0Jp z`Ï5xUжܧ@$ÆãrB%粞֑N\²+°à­ -‚'^âFÝA ZÙÀhž”Njã´Ö%ÂFêôMº8{¡ÛÜKî'f6¡¡äªmi O¾$6Vž!/  rȃ@"ZR]ýZnTJB/€åPaa+¤wfãF&„1°ê%¶ì.ÜçoCƒKcevÑÞA6@•eÿ6§$Ü¡wnD!þs\R4•. ÀOÆé‘CØÀe<õpt>ç¨Ñ›NêPÎä«nÿL0`µ”!-=(€,÷!m)"÷q*Ír•^í½<\R"[ò*¶.à@G²r(Ð-„±âb6'ކÌÂ@[Òc*`r2Õf+Ó¢÷©Y&e'`o 22ÛNíØEíæÑÄ¡]uHö&=€.¶²9L“Nn-J 24BqÏî+G3%)±1Bü!!ÛÒ4 a.´‚'îñ{1¬ŽòJô3  fpå01/ Ú#¶l¯®#jãß)ð6Ð'¡ñ3¢‚>&+¡<@Að[kl0)ðÿ$@W¿µpV%ð•HÀàc°âyà°)徿°œ1ÐÍ2€õ2H4`n\OßÖ÷‰R6àN0øââPWm# >¿cà$Ì p ¡Åý›f- õ°9¹ 'à P8àXÇŸA1  )@VþRqÒ0å0Y£‡ƒî~&i‚pç R¢ü#%Ð Ez)ÎöŽ3q9Pê)Ïýõƒ S ¦0¯žB@9 6 E / :àqüQßë/ïŸQõ„ÑCó#%lÿ”¸qÇ 0lÄØ±áʘ .€ð`Á£‡ <^”È‚‰%hd´!À@ÆäÂÃF;NX)‘âà .H¼9ÑE‰>)–q2FF›$2–¢GN,RØÌXã‹NÖ(Ñ昌+<ô*Çí DeÈ8qâ-J€ø憌a~@)¥î–"% ¤û!‡ÃÂè‰Â%eô”ðð£ ß”-Ø!ÀógÏ1@ -z‡r­é@‹¢‡c@©«èÈ aÅ=±CQ¨2‡qC±½Æ[â9HŒfÞÜùsèÑ¥O§^ÝúuìÙµoçÞÝûwél|eÿ*ÖhUžÇÞ"Âó+V€@Š–g9¥2å9…"<‹`Ø`F ¥èâ'è C iHƒŽx¸ã îxã<ª¸Œ;\ØŽ4p #<yØÔÈƒŽ 8" ?Bä€:Þ ãŽ!,#Ópá#î Ð \£?Àpaƒ! T¯®¸Ãà :ØaH?Ôp¡ [¼Â]°Ñå—RzðK‚¸…gfƒ#ЙD-ÒÑB“lÖ±fš6xœhÖ &ˆ1‡l Xàu”g ^Àƒ²†F‹ÁƒvU4øz„ÎѤ(ÐÑcÿaЊ †›h¶Ñe€^¾±¦9"8âu†i  NAçšrIà”u–ÁfšÀÓv[n»õö[pÃ7»TìHE"Vñ 2`ä³\<;ׇO>sOƒ^À¡¿uWH¢Ï¢@„>s@æ~H‚+ÒààƒÈà ?X0" Œx$$ä!;tÂ&xxĈœ4$:"1†xDÄ40ƒI”ä!J ®x¤ ›°`?À2¢'~nâ'08é 5n¸`i'`Jƒ‚¥¯à¡ RÐ,ÐÜf˜R !_´ipà–u h Vp晈¡¦ l'Œlp ÿmÐ…œôX§Xl˜ ÀÒä@§ëņ+Ñ>M„h€r  *È¡gš àk Ð$%p†™&¦œŽ‹ÀœaøTà™e ¡‡tn9À™ÔOQ d¥ òq£—~zê«·þzæÞ-â¾Ïny›’å³Y<‹Ã34˜[%‰(_B¡„* ˜R TX€#>“ƒ(A§x@jà·–°ó H >Ð0 ! AP.°n@+#ƒ†`ƒX ön œ„"©¡ xƒHÀ‚+L¨K.HCb¨Ñÿ‚á UÀAyß0„sÓMøP^‚ D ‡'HÁ Œ ¨á88®Pƒ A †¸Â& r”#ÀKÇo°¶r0£½¨À (p„uœqÿ5x£5²Ñ,ãÉzÆ" k˜e¨Á8Ƭ0 (@aØà†2tÔÒ†4BÁ¨š¾¡ àÐCað \¢Ø †&Z³ ]@Ô76°AŒD€Ø8ª¡ ¸àxF`B¤ šx^Ò¡giÀ^ð“¾Ú¥\à]ža8=â$~¸ê;•Ž 2Å3%@æ7Ÿ xF6u×bì& ,ðe 6‚ `ÂJŒÀñøÙpÙ“šð¬ !0ÐBCJ[~ØÀ<°üçKû„,¸@¦˜ <_~+à@ó;Pz'¸ ÿþž]}ùu ùÒ^Áñ€Õs@¬ET¼¤¹ÛÀJ‹(x†j ¼ðð? Ü`+ˆ€7¡ˆ(   8h€Ð"<È.$p,Ç AÌ® ³ €@ ˆ €„$A` ¨€Ä€x¿tx¿0£Ÿ8Á|«¿<'|B(Œxºjx’Xç"ƒÀ€„ÑP8ƒâBŒŽ{1¼¸0C‚X€üC˜šГÀ ÈX R)(:¨‚K1¨‚ØØñº¬ÀÿXˆˆµ¥Ÿ¢JdºJ .8°xŸÚDÀX °HtE_òNtEL”Tä‰Ðƒ280„Cµˆ€Rx†з€e¸†2à”HÃÍ«œ J€S(‡… ˜pg`X ,€m8ΘÄ;4S ŠYpýVšY›¥Ù;ÿmº›ÍVi­ËÍ[Î8­Y¡}Vr-Z£õ€^Øè€qhà³èØ€‚W8‡SЃ¨€h8‡R”ˆfÐ…u¹a=`n¸ Ä‹ ¼ªfà—í¸`9V ‡út(…P˜t ðÂê܈†’mÛ(RtàµHë’Ò¡Ü¥\ËmË1­Ü™íÙæÔÜËÅYìHúˆ p€Òh¸æ¨ ¸Tâ1SÍ\2{8DlÄ&@ÐL€ 0¦Àý,Ía€LæÍÌYLæÄÄ3}Ó³–‹ôÙžß>Cåd ÌÅÜó”S-UbµöV:µß·tO<k+k4µm;…kåŽk/ÁÿøÐÆXâÃÄh[¸Z:Bbˆ•ÛEÄÐÿ Ü/-ˆ¸‹3ˆ6½î ò¥µ€CðÄ(…+_rE«`Ä‹ÈÒ ¥Ó±–Î0½mþ&å+³)%ŠÙÃÖÌ}m·6îðÖÖ¼-­T1& òB€ÎRctÌeÎåþð=Evn†œ3àDØN p¢ ¾À’ˆMÀHùÁÓÿ†QKüÙÛH÷5= H€¼Ë«Ö¶O Lø€å Ž¶ŽOç@•‚ ¸ŽY,ÆÊ¡ÿÜí…òæDk2s3/óÏx PË(áÊ9s9Gó9?s¿ó(ñº‚Ȫ“\Ê)'L+°Ãök?ùÿ™ ç΀{âS¨âó¦t˜BIÎd•t8ÃI÷ž´FÃÿÂlIŒp/¤ùüÏ»¼ŸÑ€H¦*$h,ªLÎè@ãòéTºTÔÒñËÌuQ ]öÑ«6È㼋1wk¥÷ÈDÏ®õZ·œVÌÄÊiºŸ‚º ÇžþM€‚ˆ€0  ]ÿ)eÇsu_e  |p,Xq¨qÈ! 6˜P…z'' ³,86ø„Q8ƒÆ—w'ŠNox Zqx¯N\€w¨x¢Ð€wm3Å~,Q£ ”PV0À E‰£%(@Ñ„C %z¸I“’P¥ €à¥ ±X@pªv-Û¶nßÂ+w.ݺvïâÍ«w/ß¾| äødª(Ug(•ªÕ– BFå*Ì&Ã&S¤jÅÉ0…V–»ØA%dJ QlžäejV >>Ñše‡ƒY¤HÍÿBÃáF 1d„Ð0­T­sX2ejT‘U±•r€ãÃ… Ö7ÄA‚ ªÜ¡óF|ˆ4tDðȆDx:~ª\“Ç… :ipÐÉÓ(ÏßÜqGñÆ#yTÁíå1„`4¢F„@l`wäD cøá.\0D~¨Á‚C`øF#° ß#%Z˜Gw\Ñ@/ØÜÂK(8tôÑ ÜÒÎ3ÕLCéh²@éÈñ@3æ`c DƒÎ1æ 3€.ßÀ€0×Dpƒ(Ž6΀£È “Î3ÖS@)ç\cÎ) ¸áŒ:ßH3IrP³Ž&tP:Š`PŽ.ÿÔà—£B©¤“RZ©¥}µ0J Ÿ8I$L1…Ÿ¢ÁµLqêd›¨ÂÄ'¨|0k-ÔbÆ›D‘J ©ÄQ-›ø@Ê(8² q ÚB*£¼†Š ”BE)¨°l ¤’C´ÌÑÂ>È@æ9¬8`¤ÑMÔÀWŒAÂN¼áÄMøáÂ~o)ÐAcÌQA<2 - ØDc ñH¤!àüºp‡<4†W„;8a¸ 1 @ÿÄ ¼‚èðA4²€1„ x`ôÛÀÞ0† „kf*ØÀÅÖ:Èð5ÁP €Ð ØYI0Ìet@-7h€.¶á€<£˜„9v€#(ƒÍ`†9¦1i#š‡ à5$˜ “Gn .9$@åB’! ì VhG4š!uh¡˜†0"€ôÑÙÁ㦠@ŸÛ$';éÉOvÒ£ËÄ‘ Ô>ˆ„)tàˆTÈŽv”…pç(Ìb *è21RœAW>ÈÅôX)‚QŒ"B˜T KH`ª(‚A TÄÁ5ÿ´ˆõV‘ x@v@•Ppƒ¾• 8x°|' 4œ×ÿôw\à #Ê  Óp'ðËfú¹ ãs‡šYƒÈAíc2?4a4ºÀ>x…F0„¡,̃扢 P‰2HÁÌNÀC~µÓ;úäjPƒŽ$ÐsÄ@JÁŠm袃óÈÒ¶ä€Lã 5¤q "$à"“`…&ÂÐiCßøNA aüQ'€GÞv„s(¢¦åXÚ1¢á€`À ëÐE(N!‡ÈÀÓFù’mh‚7 @¶aV蔂,a kØ· ¨`Ã'áP ÒQ0ÿ…,V°…Z0»È (H‘HdK²#>#Sø` ‡˜C„° T8"Ž˜Àh‰Q¨B>HE*1ÚÈ@È€b0VÙA AÁ†9pF% Â7Ná¼ 5ÁNà¼ÁˆÁwÂ{‡}!aPzù¼¡! b jð9áAxq…|vŒ÷‚z6‹>" jðƒ.вŽÚ·…iHƒ†°„`f4ØÀî†*Œ!ACh„ÁÀƒ”@W0Bq aôÖ¥£nV¸£¬P!8@RÐc€I9nQ†[L"Ó`†ÿÏA¸qÃ¥ÓåìøÕjÈá̈@–!ˆ ÒxFBÁŠ,­Â`[ Æ‚Ž^(¡:øÆ/Ê =¼ï°zÞ3Ÿûl©X" @C1-֔Ϛ(æ°‰,LÀ±Ø;¥Ί8€ÒŽ`V ¢ð!¨Â›ˆD@ƒ3ŒW(Bo3±‰$ˆ7Plpøà¤`„hsˆO\/Ádì¸ÈÙ!p×Ô`Ø· `Ä$"Ó7ÈS»&ƒ‚‚ \ o؈¶ö@fF¸øI¯1<C?ü ¾¡ Ó‚,œ‚rafMø .pÿ5¤+øÀÄ=) ü~ÃþÍpqWzx8ÈÑ \NK»Å8–ñ ]D`8Â:ô\@ÔÀ†4Á€cè¢zˆ†h€apc§@y›ÀÑ k8ƒˆ€.ˆ‘òt€ΈR/de°"å 6¸As"œ" h@0š1„ÜÏj_;ÛÛ”L`4pkâÖ6Þ9@ƒºÃ€î)Îp3 ÜÀÂ"E„P‹ãi@,°p‰ûpKÒEA²}#ŒT¸‘|å5`ЃÀ}¼I6ëCà# ¨Q,àÀD0‚|€Ãch„J yõÿÈ”#„2øÈrƒ»ˆ*àÀé7À"x¤!È}.@ƒîà9<î¤]ÿ A œp±+t@¾€´Oƒ¤`ܾA a˜àš8€‚mÃD@¼”„ÍYÕ@@8¨\à8€ï½—ý›‘I:”Á@€GÄ@8RZÀ0`tÕp@GÄp –<€È9ÀT„ÛÙà âàaÅÀ ¬À ¬@ ÄÀ Èš x¨ðà ¨À Ð ¡,á;ÉÚ¸†ä€ŒÊˆ€t„ ÀÀ ®e€€,a Þ ›Gô Þ€ÿ ˜á x€&Á€à@olUo¤SlÀЀúÅh’&ÙWÔ ²Ù Ð[ ÜÀl@v œÀ ´‹&¡á^ G¼!ù¥€vA› Ì ÊâG¤Àz¢v©Ÿlˆñ¹eÐ hR ´K£œžä¥€&ÝÀ ÈAD‘Zà@”B3\€¨D ƒ5„ àìÀ ˆÉ<£JpU4zù% G”ÀDCÐåÄ€V© È5"F\cG”@€ÛpZºÅ ”@]®ÄWÖ¢Z”%>òe_úå^0DÜ ®a²Ñ¾@v$[B²²ù^ ðFB&¤Ü@E ÝVúcJ&¦Z¼P âoüã$fRZÀ@oŒæ ¢ ôˆ&­À'ª£;Þ@ äÀ³±â#% WÅæ–ÀUváh>*²¨ÿm~DPþaÈTl§Ln¥Tr„D~^ÚeÚI#r ô@ĹŠŠ&HnãV¦.ÒÒíåb.[@01’c‚€"”‚ÈPÈþåÜ¡@A Øè°’h±m«:®¦ܪ©ÏJ®¬Înâ®+®²-ÿÅZ,£Â©ðÂîëîèÐÙÅ^fnó²§Pä½.—a@$…X:€¨dF€©/ ­©^2í¡N¨œÖé…Þëhhúb¨ð¦-ž¾iJ"ï‚âîîz¬È.êÅjçÇ«¾î¬–© æ/_0¯ó"pª ¼Saæ§ 4J¢Ù¨ÀWêÀWBî ¢ârcªß'î"²y@Ĺ®a®"ø&[ #Û*ÚÀcþ è! ‘q¢—N$­¾° |ÞHýRêpÐÖn(Û;!-anÌ\ ëÕ¢jþ¡ Ìa‰æéZtžúvhìΨÿ^±ãr$­}¥lp^&‘¦©G`pîj ÐÀtqÿ[PãñÕX9îc&YNWMãÎpãqa• ±í¾(ŽjÀ œ@XPbP¼h è€eBŽä‚¦¢ Ë¡L¤"“_D(bäh’ß'ù5ò@R°ä—«ø~é ´¤tÀz„ZНO&d@º^«¨Œª ØÀ çVÒfÒÈa]¾(Ì£F\#£iy²¯,{è9â«xÀ4@àåq®(,³¯íjR0¬ñZ€À8ÀuðZ`@TÀG€@<z¾ð& 4À æçq>Rßç©c¨€?¡0”€@¨cÛ@!g5jÀ œ€ÿ\à'®€¬¡À;ݰeCט÷ Fî"4*åéíã*rÕ ð¨Ó)^` ø#Ö!fÒ)Ö¥ üÛ,ö Ѐ ô@ðzñ.‚¦GÈ´Q²bH¦€—p¾ÔA2ðYÚ€!¼„‚ä'‚Þ xb´Ë\ ˜(Á³gÂÀ¨îlJèàø^4ŠI ЀLïs]W¨4ÿ€&hX3ùÕ@#~O#å'Gœ"„BX33{Äè&XÁ¸ÅM”ZxèÁ$ô€3²b7Fœèõ^W¥>“¶`…t@݉Câ€hÀˆÀ °€ Ø@,A.pÖ(Дf ÿZ€ê˜+òà­Dp`À âÜÍÝ&fòéÉ¡tWOÒ¨ä]zÄr®¦uGîò EF(‹bXG&ÉËýÉ X€¤A €í~Á‡0±oÀ t€ÒÀ@îÕ—_l€.ŽÀ|"  ·4Av5¥u,ÌÏóx@ ¼À|DÑ @Î4Šò‚ :@&U ?N€©ýˆ”! h8€!LÀΦÀÙQ(ÔAA3°CœôÛt Ô³` À”–øxÀ0 Ã6$€JücC9`:謥GˆÅ7¸˜ÀPC8|Ã7”HtE€ÿ4°Ã50N˜ÜniÃù&!@ ´n% x@$Ak žÁ$*¬ (Áày 0Ò1Ad%D)haAãuè@,uç@A:P$E‟7Èá @ºT0NjG¨d&ÕÀB£ Á,D®Ë€P—€ u 5GA A À¼ñž±_P,Ä÷}@P¿bS µP×Bü@¸ÀV=DPAŒÀ » ¨2 ¶{" ;t€‰”A¸@ ˜{DµGƒ9€Ã2lŸZ”ÀXÈA)ôü€Ÿä- vÞ–@XÁ$hHXAxÿÜÈÁ›#å8ƒ2@Ïq„Â$@Ë Ì‘&„Œp”B(|+XÃpá›KóR0@/¨C0Å7Z1XÃØþ€"üÀlC40@(%GÈ•.@È|œ;}ç @¨a¬Âh€Ä*ºc\Æ':eXF-ÌÁLA­xh‚ši Ò(h}((äÂ**ÜíhÀ²ùÈd)‡ˆ@ `BëBˆ”YW|x7¾&uwÁ€‡xÜÁ¬€y¼@z€A„ÇøÁÉô€‡ ÀÈÈåõåÏÈäˆ0”‚‚9‰áS ‡ ÿ"6‚ L…4‹$Û  Hx ˆ ‰±@ŒÈÈ8@/\Ã)èBI( Ó´ƒ3€* Ä&€ÉA<”`,€4XI9¤‘.@¥ÒÁ$לBˆ¼ðp¤Ü)2‚ŒQÓ$ˆ“26\³aD:Nî4ñãbHž!FñˆA‡Ž‹1y€ɃúÑ!ÀÜ äƒñ1AU¹ æ+‚¸¸“ÆE0¶òÈÉ…!~À·Q%ùù*\¸x£æÆ…&èƒÐI³a?'€0€ c ~p€•pŽa%vºÁ[Ô!âpt€™h8fšnA'¢If€h¦ r6M¶a¥¥ph e ¢cÀQŠtJÀk.8Š<Ðb’RÔ)j`‡žpx€tÖÑÄ*a€!†hØÿÁa®y Ê"(#ELàH8ebØÆœÚ“Ï>ýüÐ@õ3‡Q¶ˆdJ6™`RHQ…0AE!V! ”Q$pÄ¢`+‡]²`ÃŽ82‘ Ô"hÙUUV” „HeŽT™C6V‚Q¾ØÐ@ˆZÎÀ Z˜Ha“YF‰‡(!n Á 0®x#1hð€:‚Ø`ƒ*Ô0‚ŽÜxèàŽ+ÒxãƒîC??‚°à1À ‡ ¸";:0Ήò¸b„w-¢'XH‚;Ƹ ¹úÞUÀˆFŒ°À† Æ0dÜ@ÔPC€Àx„Ž;ò bCvØÿ ƒ2¦ l`á^ÆA§vÚ¡^²Çf äf àvœq¦œi˜æ˜&çˆrTâ(:"ˆf™Ž(@f"XÀšaàF~ð€ƒ0°™¦un© ]°iàt¢(†# 8f›À§%á#zh`k(³Ђi ‡¡„‰:ˆ`€^Ê<†Á=õÔU_u¦(La$vqäNs`$•JsÁt” AE…(h™"‡\²Øb“¹Ø UÕ@$ÈÄ”¸’ ZØ8A•H$˜c4˜cRâÀÀR\ãX…‰^ðaå58!"r@6¸ÿ€¨áêÙœ0®rå­ÉƒÒÓÿ@  ˜Wîà‡+tlÍà‚p'„``ðrÓ„…]á‚Ãs !Fø V8‚¼ëYÆ® /¸€¸B#€`Ti4³ÀnÀb½hÀ `â]€ÃS;†00iXã F9ŠIXGÇ€&°æ€SPƒÒ Gè'#@XÀ3ž€DqÖ Æ(€,ƒ(6n+Z#"x‰Dè4 :P‡*Á#0HI/ªQp m ^ƒü Œ‰(0ÿ€[”COTlÝ.yÙK_þ²)9@@qG€Ây™B+T¡ƒ,䛨E2P¾ DB›‘L%vÁ†$BQD˜`)T`¢ŽÈh±‰Q¤Â>0E*0ÑNh@˜€ @€ UXB›à@"‡@äb è€ÊÁ *y )(Áb@ a5×(¸žvAôX¶òð†”à@ÎÙÀ˪à‡1(Œ:UÁ#®°/—ˆâ‰@¶øˆ4¨ÁCxá#š€``™n<°‚ŒLÿ*©º.˜›z$Ù»Œ@PôBÁ‡hª$2±Âð8@RÿÐ#AÊÁ =èB  3ÖˆŽ#”àà€G)"PVŠàÀbUPŠuœ‚ê°N±Ž[°¢RÚz1Fr@B’Od€bãÕÇd[˜£$8Á&! t„ ØF9&Á =F4@ƒ(CZFôd:`>ºÑ•î  °»)Ì lIJ°‰CØ>HA>‡Mda|ŒÐ@,¡˜aqE&P‰Q!QðTa‡LX¢)ðÀ@±‰$hÀ©`„%2!Ǩ@7èÁ ^ ƒ@Œâ>ŠO°Â 8B6J‘' ÿ5WPÃd ƒ C˜Nxp¾ÆqÃtr°¿u}À©%pŠÇп4ÁihÂXPÀé|@8NИuî¥.'Øà_i‚ûhÀ#¤AË#À®£È2VÆ U5W¡ AiÔP… èÁàд'8 ÝÄÐÆ)(%¨Ã ÐÁô0jDC»ÅäàŒÀaàÖ€AçJ@‚PÚ =ðÑ)*°[Xƒš¨@.ÀŠjPãÈ1ª1Œf„¢ÐàÅ6ˆq/ À#7 À/¨aghAÑXºFbÖƒi`#ÖЬQ kðZZp3ƒ,Ã×ÿ b ¹éžÝéV÷P 0 ¼Þ2Ð@Þ”`Þó Þ-o .ßô® .LŠQ”s¬úwV0o Œ`> …$ Ç„€Š7@Á B`ƒygÀ!ÏÀÈÿ-hQL;q±‚ÀâÈ` ÁH®/7b Äc XÆ~hB»@"€ýýÜ6N š Pàç,XzR³îÀIÒK¶.“™Å4¨Ø3‚ˆzêhz(`ãœÌåÀJ¡‰¬¢y¯~ñ0 !¨¼œ H@€D 5À@–óø„`9™Çüÿæ;ЀP€á`@Ë+˜o@.YÓŸ ¤G¼TÀpÁ?€ h@VÐÄ^óŒ_<ÓÀ€,à˜WîMïÏ/ ›ïóº©_}ë?×7¨Á n=áïîº÷oð}ä á—HøÕŸ~ïÀ;21°VÜ/ DƒLlAt‰"h@Lbnb༠U`&¢Jgú&‚l Å^€µj@v઀£:À˜ œ z@£šà Hð#Àgplb`TàòïR@'"C‚€ÀÀ0ØT Î|Æg'} Ôà €Àô`jÿÀWà $hP€P2®Ê@ N8"”bÀ«–¡~€ŠHD´@ZN Œkzàh vàâáðÞPLÀF"N Vƒw  i ã0n@àÐ{@ׯ qq`LŒ«~ Vƒ#èPLJ° w Îz` kâ„ѹ®ÏO…J ΄â$vÂÜx‚#n`1CèM‚ÞœE0/ ‹âBP@å(B£lìÁ…’\l‰¤0)êh'ö‡ %‚÷Ð'Èì:g'´‘'ª1l8§Ï   ¢:Í’€|ƹôP(Ê‘: ߱뺎"æ ÿk'Ü0dâ±¢ðJ _` D Ñ A¢è^N!e@!Ñ!2#R"'Òs(tÀ#‚‚Å õð_qoÐùÄ e1(n` ñ‘pt BI8ñ%÷êÔʯêÕ°A@ °a^- P UôRËï"`”¹h°ÁZ‚¦A25 £¡Øá àÀÀár‚Dˆ$.ÉžaŠd€¬¸áŽjÀ)sEï }‡˜ˆ‹8º:àRûÿìÞp  BA4§´° ´ °<àBA´ d«  š(•ÀŒ"~@¦Ø*=à+™2ý*À ¬ 8À%ï­Ê  nb®hV@8@ JA À D@LU@¦äà@@ €¶´ @ :)ÀŒ5A rÓÖˆÉ׈;Ù“?¹O 0_.JžÒoò*`^’ˆ\¢’6à)K Y iñ9Óˆw¹<€ŽÁ² ­ë.–>KÍhI=³Rˆó”K ’[q‚DW<à’8'+ƒx“A™›»Ù›ŸÑ&K@CQB²r 5#‚½M+Ù™0kó" ÿQ›WÔ˜ÁòÞ^î”—Øqœ±tX‹th»²™¯ð%/uŸ%‰%Ð3'bE©ò›#Z¢'º¡qòå@â)¥ð Ú&mR-µt³Y—ƒ¸£q’Ž•8œaEºtÜÚä8öYðšŽåjõ@— h™ 4ªløX‚Ù,cŸMÿó¡={—gú¬G›´ ”q’Z BŽˆ@´V ˜NNá’E@š8d nä @ A›…[Ò&¡8 J¡äï%ô œ›8 NUš nlëºëäô”ê¸ äô1RX[\òåšr–qº´ß¾‹õ¤Ô¸ëþ œAªt B!ä@Ê ¢¡ªa³pD†Á”Á–Ìá D?”W+Ó&!  n2S·²²ÐB«A( ªažá.@¤aBá1; À¡ÀAÀ š!0@¸áhåà8i‘½‘š¤Mÿº£ã[É—\59ÍæÒ¡`t!”A`²\ÐÁÀ–!E²<Ê~€·d„ ÂÚ¹‰fd¨a ’àn!€Ù¶:  `!8``€`p-†W À˜Aš’p÷.€†!\2¬_2´ÉÉ‘œÉ™Ü$ ÆR’‚þ„$ÂV³4OŒBtAéša!w¹á>„¢áÐA `ðh¾aÑŸA¬À €NY„V ŽRÀô ¨!VBˆ¡ˆ&ýŽ¡®¡J£À!.`„ rú”Öåÿ ¬ XaxmÅyÓ…¦?Ýß$ "a"gAª(\àå>@Æ P®À(✱ ð•' á `â}É>àe@"¶!lb²tj Ž"€޶tÀÝÇa¼¥»¤AØ¿ S[åHkÙ;Q)ÀMƒ¡8 ¤aÆ[”ÀÎ}*@z,pàÖ! ¢´¸AVOÌ! àôi@¾Ák´ÔA—K÷½¤×^´ÿ½¬ Z ";Çàg!,>„‚þ1¢tà ¤`ç–Âà à\$ ¾ äò"ü€d _ò ²³eÕé("ÿ0&Ðj~ÑHTèá" Âà‚a‚!¯öª¯ˆ~`ä!*À.×–1€æJ9 ^YA„¡Ä‰àTm¹µ€¾*¬`ÂÀÂ…! ~À[•!êK!V"áÂu nÁÌáž0ÚíÏŸ"à~ P1p>AG"6aÐÀUŽõ§áI X H° Á æÈqˆA2Æè°¡IA4ðÐD “‡ CŠ)ƒœfà±CD;èÚ6ÌZ©:Q''B „¢Qs&§0V Nö A¡Ä5hÐ(!ƒªŒ ¥²))¡ƒB(ÿjÔ–A±£™4DQFmš&„U£V확„¦Q»Õ¯^ ´4C¢—^$JÐHQÕecª¿$I¹²å˘3kÞ̹³çÏ C @Ð"‚€ ¢Sƒ´‘ABU5Pn,ƒ„$hpþ ࢠ*TÜ81°D‰ ˆ7|À¡Âö;bø cC Õ•‘ HáA@)M0¥ÄÑภà€!‡š´;®oX änphðÂe„,ÈàX %(]x $ÀÀœPP` 0@™V_Tq@ß8ÈA;€ÀUhÁ %N%c‘½äv8æ¨ãÿŽ<öè#gœÐ‚ *Àðãg+¨ € +ä J†ÄÂ… ÀA ,yæc)Ð  8¨Wâ/H…ƒ 8¼ ˜hªS˜GZ(C XZx 86^šCÁ;p1Ò@Át%ܰC7´ƒ 1Ä_•O ô˜…õe¦;J`t7´(¤ŽjªéK^‡C|ŠºÔ)£ÒÅÀXA—Æi뭸檫 ð:¨IR ÄZhd£ Åpà dh!p—B´„PíHUY(ÞS±jf5@&gKä)©m‹¨fw àA –µ+Ð t*A8\ÀŸ@0ð@À@é¶é taÿU"LÕ@.u[0A OVx†¤îCFê1­ïêñÇ ‡,2I.©€ è`ƒ+‡PÐ 6œ°UÙCAòÞ{dÂÝ'Ë6-ôÐD=ô@ÏV&s.„ÐËJ—›dg™¼7²Ðà F†êµÄ:?´0É3ü”dd[*Ð ²†=òÛpÇ-wj%D{aºT§‹C -¬ ƒ-l—½†)ƒ èqÊ,Àà7«:ºÃ²4`i¤q!•ƒæwnƒWÊ1¥ ÆÑ¤ñvÛÍɺ@¦+ûì´×NûS14Dâ[ÂÊẂ %œpBî CzCïÆaþæ´ÂÀÿÏ<“ž|d5¢MëõÖ߈ýcÞƒ6÷ä»”ñÜ觯þú"•°c2¼ŸÂ 6Œ0˜80*Ø`½/˜v üL@GÀ+¬¡€œIpÀ¾"ð€œ¨,8žqF /ƒïƒ,ûÝÂL®Ë)†»[ÙÐ35€1«Ûæ‚V‚4ÝàW6€™sÈÃú°‡øa `³ú±`+ÈA uß¡ R!ˆlÀ/¡ð¦# †gƒÍyé‹_ £žŠ%PíŒàûž³eòaÏRktc爽°mVncŸ÷ÈÇ8@Vó[A Rà³äàp!à@)ªQ bÜÓÿÃn M$@Ô°3”f cÕp†8i\ƒ=ð@3¤ eT hA Zp‚ˆà1’ÊÇKÎ,xA XÀ‚á¼ x6æb–Ù%aª€˜²‚! Ià°àdAãt®ù«n¦é›Þ '8ljÔ€.Þ :à*²˜80 ^À‚°¦{5kðáPÑçL@f ƒíŒ ‹#š<ƒ1ô¡ èB!µ°êõñ¢ͨj< ¿Y® -PÁZЂ@á§Ã)ˆàj0ã’ç8‚Âñ +¼‚! Â0²A+t@Ý8¨A ˜ãåp†ÿ3ޱ€¾Ù@ÝÀæÌ(Õ‚ZõNeL 9ØNv$A:…P¸à…Ö$A X³–ÀŒæŒ«ûæ*׺Òõ®*ˆ–XS€ƒvzf¥Wkà}žÕ«f Ð ÜÀ«|(‰÷P†Iô²••f7 Q:h*›““FGKÚÒZyÝÜ B ‚/õ‡£ 8ž¡‰9@æ`À3˜ÁTC¥8zÀ€[X£)h€&Ô1 ,ƒ¸Fœá ^8#:8žÝSÐ…¶„*1Ø\U†ÉЄR‹Š `¨˜(†`J7A.W'ÝÕ®ø½/UˆåÎ9ÉH@Äš'dÍÿ9¥ª¼o¼Ä*Á}©^ƒÎq2œpg%Lá…2¦bj3­†7lZ€”¥dp@-(ã× Bž¶¡ lPB1°A+œÀº¨NPŠvDCÓ†°!†g°â×ÝÁ Î[a461Äi´jêä [™ÊÝqU6'å,'4t Ëìø®lå17™Ìý,çŒÄá6»£8kmåÆxP€Ø!‡üõÂÒØÀ €à…P@¥ÀÏ-ÂÑ€P@çðÂZ`£ ϸÅ/ž‘€téÌUNsúe ›Í=5¨Ù¨YT_VmÝ[õ™/L°7ÛúÖsóp @¼Æÿp@ Õ°Æ7ž‘ƒøæÀ¬€€   j\#GÀ¬€ l0Ãà…9œŒ |£ ÑÐô3Ѓc–ÚÕè–uºSÆV«[\–]·DãýnW«Ùs¸Î·¾G&çþ2%°Â$ôP²4`倂Í<E(b V”0 @PåXЄz ,ü J@‚8àB.¿±Éî–weUÇ”×{yùBcNfU¯\¡´Þ·Îw®«]Cy|Ê_–Æa¬ã ˆ 6ï†8è @¦D` 8`º  HFߣ7C[ ¶³Ù<{ó†£dÖíPqÝéRiG»˜Õ>oˆªÿÝ`bËVØi±ƒŠÏÝ)ç–bÖÌóžG!èÚÛ³·¨T  }í«š‘è@5˜ß |†ƒ”éUËŖ%Ó\’Âe¢žôÔñäímg5d–õ©Š¢ï62›Ú¤c8¹7TNÈê|¬Üþ°ë «aíºÛCHM5e-¾C›ß³ä6žGöÂúø(Å’µßÉS‘™ÕÅ "FÅjYH­/3þôc¬Q{ØC²øúƒ¦B*Ø~¶±0ÀkC ›Ât2ÿAº1LÅ)’°_^R%€¦÷¬g!°vêê·=âÓÿ1 €l$e˜ÒD1¨wÚRù1jMTPÀ`‘j1X1(Z¶)/A=¯Wp7¢€FØ-ëw‚O脺·ƒ‘’%OHÍ*ˆâ×Ñ- ¥9PØ„‡’%ˆ,'HRH~g˜~íG02P‚jX0ÛrTx…öw‡•ÑZBXk? ¬  /`’"¦Çpš 9pG0 ¬Ð0°9æt#PP ¬p z@' >Òa#×(â=ðƒ:ðqŠ"ƒa  ðU5)% ‹÷ÒD'H Ð‘H7Ð%¢­ŠfX °«"“")‘Ó(вŠ ÿ V0‹Ÿ590‘-.ñ“ð’²,ŠÒF91PÆ4/í(:pJ ( а*ÃQŒ2“SŠFR5ÀŒ£ÐÈ{"º1 ZБâŒÜX~Š)’?à3V¸á˜3áÕ‘èŒY(¿ûXØè§D«^0ð²~`Âê(U¿H{¥çŒ2`$̸c!e öRUÀ(, ’žX!fˆ‡HIfà Õ(/7@š° Õ`Ò`81P"²Ѱí0° æ@ éÐ /r) p î@ Ø `rzWßÐg†è UÐcyP Íÿ PƒŽÂÌ0 ‘h€ˆ"ÔG5=ÐÎ0 P è À0 @-QÄ ‰š  0tÈ ÅОéÀš 0 q†f¡Pm ( °›*À51¡ à0Jð°Wâ7 @00°P$0I*€Ð ÁpšþDz âQ‘€ €Î9!QUÀ ˜)®™•™ÖËòS›wR$ÖÒÀJ²   åÀf%x€0 ã0 D0 %0ö¹ ¿p˜å'ÿtKω ˜ò·÷É@9€Ð0@9z@ÑÙ `ÜÉ ÏÊãž“Ä,ÒihÓÃðI9¥ÙQÅàÁ S‹ @ì0 Hº<¦G æ ¢)G ½ ̓02€cÓ›(1=Ä I÷†z  ¥°¢ º`(*P Ó`ºp ö7ÐÇ rp ÕàQ? D€€g#`æP  Ü º`yÂr  “ÀPšP Zp [Pp ÁuV æqŠ W î§  z@;`«·0 Øp›Õð “P -xÿšPzyÒ‚Üp ‰8«Z •¨š8r@“°ªŠ° eкx ×° · Êap Z°ŒP¬Êƒ6 þ*àn –˜"0@Š`·p ?`«¬p aÂX  ¼àS-è· P;P ºà¿ Ì  ûŠ%€ ¬thø®¿z =°J  ¸¤ЍǰÁ  GàÕÐ ÑDЖ¨p!rP §/q“0‰Ó@ÚgúyzÐ z º ©%À§Ð Š`ž$¸ª“€@çª e°8`žß &H¥z 5  ÿëð ¡ÐGùz;@¬åPpÎ)05är€#‡@¬€sB Æ8¶Ôð Pð±]B*‚ÙÀ ÐP ÃF §ÑPÔð á Ø€Í ö¢'÷! ìð à@ ë “™@Ð,± ° ÒÀš“°Ñ` åÀI¥Ñ€ÃË€Û0Ø àc9lP7ÐRÄÀÖUy FÑJ×p `ì; í0 ¨Í ÃPŠ ?ÐÖ¾÷Á ÛP é€ æ` Ó° !äð  ß@ åÀ Ð Õ ¤ÕÀ p åð )ËÿнÖ`P0ªè èp Pì b) À î@ Ô ®j ™PßP Ü@ $`ËÀº9@ ÜP Û Ö€ Òð  Ï ÒÐ e°P à ˜®ÂÃË  ë °\= Ò°Ï @ äпÁÐ=@ Û»P°] &üŠ‹9 ÇÀ2`¬P Ã¥@@ ìà ÑP À ßà ÔPÉ%Ð cé;@Õ{½Ã0Ã½Ë æ`µ1! 2L€{[Ë!•§0 ¬Ð #1$ÜÀËà8(9 Vqé0rÎè$ð }<%ÿë! ªú ®À ß 9Êžjè ¡Íp °9ЕëÐ Íàp ÔH0çû\èP  ÊDÕiºÇJ`Š@°\Zäp Á ê@Ê0 ‹äÛÐÔÐ àß0 5j¦›JØ Ñð ¼ÀiG ‹T @ çì`Iu¼  åð0 }| ¼ÐhÃÐ Š° Z° 5€ÓR[0q½·° `ç`TíS  Ì@“ e ãÀ ° Çã©V ŠàÏÙÛ Ù$€“àP°·0y¹ ÿØ0DÏÓ`–å1²Äð ð'?@AÛ àÊØÐ ~Ü;A¥æð P§0Ïð—ÑÀ ÐJ0:0ÂJÐ ÛP§ '°Œ  Ò·" €,àœªKk]P Û ¢Á ç\ºE À›Ãº@ ¦à@ =€è ÙÏêÇ Àæl„¶L¥'à   aÀËG?޶é@;°z ™0@îËÓ/ð;A×P 9YBbeÀßÈZr` ã eÐÒí ÒpÒP ÔP☼ ° ÿÑ@Öð p Û0Ðsk¡,AÃ@ ðØ¡@3S Ml›ðü}  Ñ`Ñ`ß áëÀ ÄÏ °p 'q ']Ïp Äàl¢í ð¡ÏڗဵçðØAÖ^1θà “0 aÐâÀ ¡p Zæ0  æ  @ ½Ï§ëÍà =.•å03~žæp;z躵 Ìi ºa@Øú "ÌÖ0 ~ÜC›£ÍPÃ0ü ÐH jR²¥ ´«ãPnlæÍ¢¼Ç0 0Õ0   ã å °rPZ:ÿÖÀ p ÜPÁP kѰ  à PÔ  f 'eËÀê“àÓ Ù0½ p Í ×ð Ñ€ª=àÃ0 HZä pé T­ Ç@Þ½` ãé­·)P5ä°êœ / JÎØZ€Dð2 «t€7@?0‰Òt l¬Ûâ© ^4£¹ Õ0§ÁÀézPJPåA Àƒô\ÞÕP ð«Á ùA0›óå  (Â'ãÀ ãŠ~  êp@.än€ `mV Z@ æ`D×àÍp ÿ½Ð = PÁ °J`çšPÔ â¥À Xk°Õ 'ù使Š@ G  Ð ÚÀ ŠðG€RM©ÜÛZã ÀÎÀ^=%ÕÀ P·VepR’þ ýÜ HßäP ²ë?š ˜àÔ¨{êó® Z0ôJúÒP§Ђ?ð ŠP5-5 0+= ÎÉÄ€ ÚÀ \˜IÓ€¬P9Ý8´Ó¾ Ð åÀÜþ  Ú²Š¾)áp$T)9r@ˆv ›¦zÖM’#ÊŽâ9Ø!GƒG¶=KÐc@/iJ`(Ç*ÿ€uV°˜S 1=›æ@‡€ŒEšTéR¦M>…UêTªU­^µ¢Ñ¢IG²z¦ëÙ:9haêÁŠ”¹¦È3xºt±:Râ®u?JD֬׶kJ”4l¬Ör¸5L“µf ´€;ŠX(B¡;¥gkW‰ÉëÅìzÑÓÇÑ¢=ô²!Æ¡Òq ®×€cçNe£6À±RÔ䘛pë«SÄ´xæ,eŒ àäDëõK„rº,~s0 §_ô&%È6,+st J^°“ÌéÀ¶cš™äš0Ê¢"ÖÉF·Ìç”rÿ–éé„r~{£_Æ E4QG ¶ †8Ь±¦2jJ`šf8¦^š)ç ÂH§ ~˜@“ufLG X¨€š^¡Œr†ÑL“ôP'™ÈòâÀšg4Â=Ì9„¢np@uzá_ÜFt”(Vè9%‚8P¢b&!Âp‚™Ï ¬Hg™_.*`gÐ$Hˆ  pxH?pr8á„i¤Ñä]nH@j¸A€tFm’IÀ 7ž)G‘0(R°¡†9ÖQbj–i ¤Q&¡°"¶XcE6YeML)(PÄžQ„¶¬ Æ¨ Æšiÿª92j¤©æ%Z+EH ài¨aæR 7±Äl#&vè@“h¦!f0pÃåá~©F™ f;J† ªJ tèJ ͨˆÔ0c:l‚‚Šn)E^¬ ¦‡v¥‘æ—ÊX b¸b¬ÐEMzI@iæ…vfFŽŽBI@cdÀ`’i†9¦¬9f»Ja% a 8† ±ˆØ&ßdpxA†–N ¤t ¦š_l]F R>ef  Šx#è…•˜¡¨²JPb(Û‚R¦‰F b˜`€jtéµ9ž‘f™0ÿÚTä_]b ƒÓ«Ñ#k”Ù·(Æ–¦½º†E*Ø!9Ò‘7†g5‘f(£Zbh€ößR0  ñÊXÆ/pØ h~ˆ†—Ø"âjž ŃNù¥‚bè ”…Ù=šŸ†V¬Æ®gfq§ €rðjAlY„`%8A åfD‚˜àQ Œ’€è` H€p‚Ü  np2€^/À¡ HS(`CG7¨ P‚\° hà$Ò )1ˆЀp€?Єà@¢€DÐÄÆpÀmhBEÅÿ€` ÀзíNˆÐÂ$¶r”!:{²ÁPÇ 1‰#©ÌE `&”à1F1 b@€…e”ƒ,ìA:ô·uÀ ÂH‡6£ €8ÎØ€Ï¡…$€ €˜T Î°P•`—]´c0´Iü"rÁ 8€ÂtàÏB¡^@ƒLS™7˜:ƒ°Ò…)ÜÁ–Q 02ØÁ%ÀÁŒ-å@!ÇÒ¸_ àž (€nÀtà˜¤!M@ÂÇ0 D¡¨ºD$rÌ›($è ¨È€„Ñ‘7Øgt!…vÿ¬‚'EiJU:Á„dó“A p°lÅ:øAt ì`(= wÊJVîÀ¨4¨RiàÄÄ¥z(æÔ q?xéQvЃ,h;ý Rðƒf,£«JâGSNtUy»ÁN¢ƒÔUÃ2jvS‡î±4¥ùL© 1£5T;ˆ©Ü*ƒÌT‡(Ë ÏÝàš›Æ$.Å&£ ’˜"¦Q ñ(; IK‚Ø¢ìT(€ ÜzƒD€º ÀnPNÅvQw[i ˆá?„Š(@Õo[úƒ¤¦€1j¨&‚ä²Ò(3€ 4¿ÄTÿËh¼²U¢à`6Øõ§ÈT”—’Ñ­O\mHŽ‚ Îhò% cÊ RuŒ´ÅïÈyƒÄp`VXæJ¼`7X)€ üÚE£Ä”œ1PA¨n Ù£ F”’ Tpd¸Y%XA…ãÑP)X+®QB ˜¥Ä´YJ Á d˜‚H84éQjpÖÈž 2 ’•lÏ£¨À¹ùu"RêªâÛ`W~qIJ‹İÀ´¡ t_ Že0°ÁG#P Ìf+ ˆqv7P€ Ѻ1Ø£½´l”¢ôÌ4h”»ÈÊ#8É~ŽÐT¢ä,pâVð[áìú³ö-ÿ3¥¡HÔÀ· r¥ÉübÄ€Ù¤~–ÊrcFàÔ|Ö2ªýI/ÙÁ·Æu®¯Ø (ª6J‘]­@8¦V)‚`3øf#ä÷0yî B&c'Å)îJ¦q¼‚ØÀ/ØÀ lT£¤`Æ´‘A êÆ±r–@¬÷vîÉRÐÔ ¼úÞ{Þ2žRí@ø×{æG0†1¬àÀ¾ÁR~” P2Í´EóˆBSx3wÀDá2ŸÅ lVŸv~´a+øþMé­î ²æ€*Ð>Ã)™îŠ•Â1xVº6ò-y‡utQœÒD6¥±‰kYϤŸ­ÿu=uªW]Á .-CÈ œ$ XÐfÐÀ!*¡Ô 7¨A VÀvh@qDDPb\y#.b›‚¼ôäc´w p¸‚¬C‘c}#ƒL¸Ý‘7· Æ„t=Ä‘×z…“Zƒ‡˜c~ ^P Á @ x †&@‡õ"s’S°³ G¦ p uì{~4à²Û‘_|0<òˆÚ bêD±Ö4)p‚V`nêA ˜ òñ\Ô:~åK/SÊãÀ‰8¸ø*˜FÓÂâÖ ZJú$§¶(4@¬(´ jØMÀ j˜ÿ„°—˜r9{I¸Ä*ºñ+5 ¤@ÉÃÀ Œ@. ®<»¹¡ã@ܲ ”<Ü€}ÛC°€+¸ø€‚<¨ D˜Ã ø@IÜ^  è€`8¤Ät“I´¢ð€=¤€‚“=”÷€=ÜÃ7Üÿ€;ƒ X,@i(82 Œ¹ À€ ؘà²KÚ‡z0ˆ(¨kÁ€ 1ìy䲨€ Æ ”˜Ã °¢P €ÛÓˆ†h€"( ²Y&÷q£ $<»À¤ ÁÔÇ|äÇÛ¹ÄÚÇ­H€ìÀ_ÈATÈ…<)ÈJˆ„L„OHØ‚Q…MH‚<„Q8„T` …H…)È€((É …,PR@ƒXP`ƒ;…M ¨6 P˜‚ ðO°ƒM& §hBG‚ð€‹ÉH ‚^(‹ÊÛ  ÿóxƒ&¸€&ƒ4¸´L0ƒ´ä´L5‚ Hˈ1ƒPƒ;ÈC‚;5è¨:HƒºÔ<0Hƒ1@‚ ¨‚4:¨‚Ø)@K5 Ø€&xƒ± :x0x…1ϼß+#Í+H# ƒ<¸:¸‚á†hx†bÀ3ñ+7*…jhn8(¨†2p€# †Ú l‡apŸcx†f˜ˆ‹˜;…hà€Èâàxfî\_Èpï^Û‚"ð"Ðê*‚öÀni(‚@R X‚QL…((‚þn078a—Á"H…9hï`+±a€È!hb;d@6¨+`Gã: ͼ‚*Ä  ØÜ3=ÓTÅÛ (¸ÁM `p!Ü à=pw½+è°TàrŒ/XÙsN5‘g¯«x€¾Ãys«Ì4øŽ/•ß[pKK¡Ðx‘¯<% †` sè@ŽÀ  ™jVø†Ê«¼ ÐE°‚¢€6ùÿ+p5P+HÄèl(âúr€ª#À€\R‚ËÑ 8ïó<»ú„+EpЀq*(áÁY§PZwu­±|ŒuõãÖÇä†@ÓõÇ·P)”b«üfvÁvCÄ@B$„ È3`3h%…-È€˜:Œ ¶Èá 'Äã&{T#¬F<;ÂÍOj{ à"¤Ø€pRÄðpþÀÔGh¸4ÛO¶¨v‚GP øÂz+ÈÅR,ØÄºyð‡°¯DN6yy±1緽ɋšxƒF0„!w«c2`ÜÿáÄ1xØ@¢ŽŠäP¸!C¡Âta+€¡Ä ÉÔ±r°£„ "|”ÁDŒbÊè0SÊœ8(1'§Jœ 8\¼ˆƒC„%0rèP”B¨J1•á¡Æ¢¶ÍÙõkЋ8elõZ‚kX_·²%ËÖ«Z¸cÕ–í:ãµ`÷²íë÷/àÀ‚.lø0âÄŠ3n¼µÃÖ1vH¾2†Š…˜7 Ð 2n„edÈ !D 9n¨ {#Æ@/pÑqBÅ 0tÈ q¶lÂÈXïHaƒ®o·m¬ ±"¬×‹@xœðð6pÐððƒÇ ;VÀ8A³³ÿ %hÄ ñB@ ²ÆÏw>á‚Êo/J–‘"J6¤Àƒ;x uÕ°Ã 7èÐC ÇmeC!(C9è Dù‘UÂP¤Ä_ZtðCJjÅ€[ ÅNèÁEÖBP¼·Pge½e‘h‘iÅ£ ¢I†ÒB3Òå–YhiÅU\L’õd“q=ùÛ_S*·d]}éÔY 0¤¥”bI9¦cešy&šiª¹æ`l€/8° ,­p‚XÐyä˜2¨Ã œP‚/`ôÂm)àdh /ÔP1pðÀk1ÑÇMp`ƒfnáXW ÒWL6|`C (€l2ð 88€ —ÒÿR êÛ ÆéôY $P@zÊõ• §7„àÁ©2§Ö Q €A D`Ãq^¦àAL4T°@¾MÛÀ„äAµÅÀ °Á 0äÈ$a[²õQVAõ•g˜3~Ù–¾ƒ¥¥$›Ÿ)¦±+¼0à ;Ì–›Û^¤  hb…8Ý€ê= ¹C~ùa´È9ÝpšüPB —œƒ =è°Â ˜õBzP`Å$ÞÁpÑ2H¶p(R°­ÇÖ7ôðZ ?tL¬ ÷€ÃE5¬@óI áÐÁ$X€4J8X„?`ol÷ÀiÔ$çU‚"zTœÓ¯±ZC l ÿ¸É”-»B L´s)ºè±åQh!lz°¢ˆÖiq +PT‡)• ‡.¥‡±ÁÏþ" Ý\ʹhÖ^z®z”P pëŠ%LïÃû¶{ïÁ ?<ñ… ºCФEæœÀFÀ@95Ð@8Plµ¨7Ùº”s‚×WÀ@4ð@ xðž pL5ÜRN Tõ7Lz‘ÿŽŽPLà$°Z °W ¥ÀMTÒãk©ˆ@F`•¤@/pßv0…tL"{ ¸È¬j ƒ bàV2€ÔÞ›j5à,;1†Ñ‹Äƒ tIR€x N `ÿ*´­¤£ †6¦‘Ž`\@Ú*"´w\# PB5¬a sèáYO jj¤CÔ˜DE¸;» ìH³›ãóÈà¯~ü# é07•` F2ƒlÜ¢¥àÀ0@„[èâ8B(N¡‡Ph‚($(E/ÊÐ?+v`§H@JqŠ2ÜB”˜ü+z0‚xà§8F4ÀŠk”á#&ÊP+h"# 5 ¥ÝJ@Å$‚¡ ˆ að&¡ªh⊘€´ ‰Iü PB) ”ƒR(! 8†4@„R¡'°RŠ_ˆÒ E0ÿ–‚}–¢ÐA/z!¨‡Ý|܈IN-p P,¡@‚¬1 ÔØÞ<V¨ƒ·šœBzàaT£4øA8ÀkDƒ=È×Y€˜«ˆzœ“¤ôS<õŽ‚<*R“ªÔ¥ƒ¢@ÌaxààhÆ:zÁ%d£Õ‡¼°i¬c>€4À ŸT 87dЀ`¤£è F58 ˆhCÑ8˜ag¬#—§X‡3¬1Ž8€Á+Êq!”CײTÖ0†vTC•-@5œ‘”£ :žqV@î F4´Á(¨cÐD:”ÿ‚ÁŠØ[:X‘€2¨CˆF9¢qŽ…>`êhF4tQ€cd£Ó0.†‘f4àÆ9œÜ”Éx8”ЀR„ú¬ˆÀMUðP8 ³-ƒ3¤ÑBßl+&5H1ªá€” ;H5šÁ´0Ó@‡5ˆQT¢lÂC½0–˜ªá s¸ÃsÓàŒf4`Ø1àü p8~¡„môrF)4QRàr‡°F/°÷‹fèaVà†ç,7Œu„A Å €5¤€S ã 0‡&P ^LùèzaøJh4ðŸÔ¡ S£“l(Æ-ÿ¥ØFnat Š(@4–g8£DX2ðƒÀSÅÖ@)ÔQJˆ6D`ÊÀºt0ƒ»18‚šY<Žõž£ G(À lLp8p+/°ô<@Ïë°¬ o°ʹ:À%@€Û0 $C*A(nq‹u(£\Ã0ì„jámëÑÃÞþ6¸Ã-§Bõ1= 7N1€^\#̘ðŒf@aG¸ÆCÁ wLcå˜Æ"gè`Á`†¨¡…m!å`Æ1Ò¡‡2œ †”og˜R˦=6–RpœÂ$6H@ € ”ÿV`+¶ÁÌ·Ì€"ÜA jl£ÐÅ5„nÄúßÀ8Bì`–u«"̃jü"½hG¿ËA<@Ä`€t@Pp£Í8B €piîr èƒôŽ”Û»+jü[ DÁÀ6Jr¼t¿ø@yVÀîh!»4€Ä0 ¨„Úg, `ˆ…{°@ µ Q°JTÏ–@€“~„“@» )0@T͆r(H¢Þè]I¶é…¶5êéuIÿšdͤ'¥V* á$Ü«¨ÛÄD~ô€ÐLFÔœ‡´ŒÇ<áCàlPÆIPÛ8dÄ@Ë€LzÌ €ÌVÜZzĤð‡BäHH”ƒà€¼f)D!x—t ¨¢ÄI°ÊE,ÅM-۸J°, ô€úœÀûÔÀÓÄDPˆ\J•L¹¶Œ[8Í´¦ÇRP-íÀjlETÀ,ÅptŒßÐ’ÕœµvLÐ ›¿ªG»Çp´ŒÀÆ…¥pÉ¥ì‰p€Á8 í*xòQŽtaÆÅZªÆnìàDHìIžôŒà†ZÄ ¦äˆ nÈ…õ‹¤œ„€ ¹(Ìþ‡Í¦œÜìÿÄl$@•&§!)ÍúEQ(^`z”‡¼ÀÆI–G ˆ‘`‰•l ðL­ „ô@•ÖáAí£>É B‡E¼EÂZÊoxFÕÐŒ ÇÚFe¬ÈrFÂØN™ ÇÞ-Þú^N,­‡pÀ œ¬r̨”Æ’FN—˜¬¼4n—<îEÇà–À„€Ø €€D.ä’I…Õ½ðëXÈŒÁ øG‚Üʨ€I ŒÀ¸Å^z@kaoôÆÛ,ï­<¯ó*V ôOèöEÊK‚DÀ¼*Åõ>ÌÒF KÛÿæ­ùž¯ÁP!n¬,kdnäœÀÁ(˜0&ü ¶`K ØÀþž,ÁØÁØZ¡ÀŒZ‰VÈV„€e¼†Ql‡þ†DBÇïïþ² «T©ð«ÈÙÀÁQ Ä ꈾ˜ÅB Û°@tÀTѨAl€ ̨‚•èðqðohXðVT°ÃÿÚ ì.M,ïEø0Ÿ…AøðLÂO¨l\qJÍòBĈp ü€/m€F,Ã/(€Ç,䦔LjÀ0ƒýƒß,†dœ,«ôGdÀm§œŒ D 43 ƒ>b.lÀˆ[°HJ¢¯"/2`”€ÿP“P“ Dr$ŸÐ€€Á*ÄA€Â(h8=íߦÀßj@ #0)$Hà üPÀ!òàa#Écˆ z¼Ãˆ7 ÜÀC?Œ€‚+1‚‡?ô@A ÆÐ ?‚pAÅ Z´àÿŠG®¨â‘&,"é j¸B'Îæ€… Õ°á‚&qˆ!šøç+‚›èP#8ÊSôÀæ—p¡n¸Š=ˆHç "øEžfŒ*ˆs4I†9ë$ç†2Ö™„n”É)šÊ(ÇŠ#4B‰k¤)ì0e­|<Àà †pfœj`ˆ`×8 ˜ft a98PÀœ`<àb(¡t~Q šj ÀÊ+LÙ÷§_þùé¯ßþgs¸7´ÑÒEeRPá|"›&`¯ T"€9p„*2Q 6h`v˜€|ƒ$¨bªHÅ4àLÿÐBq˜€Lñ SÈ" '{Dˆ £ )@(„Ql>0Œä”¬­4À°Œ pBfV  ¤à j(Á TÐ7:©'Ø@èpƒ°ÀAxC#Þà9!yXPÆÐˆa€t¸BZô¢4øa M2‚Ï`& Í``A~6 5à,(’¯à\á~Pƒ ç„;(H&ÖÇ9¢q(Nq;pÀ-Ô1 tDƒ2àÜ¡ ì@ Æ7¬á†HƒN“ø†" s|£JHÀŸX纞€Ã×Cp€eáGQ–d°ƒÄàÿ=~ñ€\àåÀ7XÑ Jœ0È3À± jX!¬ †:Ð1I<àæØ8äVp' –5¿kÞ¡ uèC!Šø ÌF®À5xAŠp‚ Ò@€%`FÙQè@KÅ("1Š(g©n Pt#ð,æp"¼ 1¸â T`ödp2 „@5€§‚¤Úà2 ’6€4Ò,àÁ@B„&iØŠJà‚¤¼ÂVð«„>+&ÿú‚Ø;Ø€ `ðWüCt˜O &R ¬Àÿ ã €„œ A Ð:0W¸ ¬W, H;×¹zÀ<B 47Œ^PÈ"å Ћl  H 0ò lë$Ђ~à#=€Âhðʪ€ÀD8B pð<Í•A ^dbŽuƒ…JS7€BõT€ @AkÀ Ž@„òÒà@(CnÀ@AaƒŽ (A=À@ ~ „œ =˜k” ,ƒñF”¶ð…¥E €RÁ“H€ƒˆ@)Á (‚„Ö²¿}Ryð$ ¤`ÈAÐ0…,A[Ð@VðÞhà9Z1‡…`$€­ÿ &ÒÈèô%h DðHõ/ hÀäØ`›%ØÙ("@!FÁ„1†CvÙWø@ X@]r!HÁO»YLd °R<@‚Sä°Çr…4k2æàNj”HPÞc½!êÀ!YvÚ ÖÏNþm ÈH‚À@P„(°ƒá–2L×H€º$ƒc¨£ØÁ `ƒü®0r@‚cŸ˜À ‚]bdÍX"˜€h€ÄÄÄÀÛlÌ €f @بP‚݈WY%(”è ‚*/*PîÀ±0pœà˜A7{ÿÐZny(€Ay_`˜*Ÿ¶ˆ7 Ò ^€¬U{A$Ü HŒÁ èûk$f<ƒé’ n„Ä!%;ÐA4§, É;èÁv@KüvqO‘âl;kx €´GÊ pHYO1V ŠNJ©'›·C p,®Q UÖðWYÕ¨9ï:²ŽòÃ+ 4çø¬Éþ¥×@Í)°‚Ö-uÃD3é1ø¡²šPe½í†gLx¹Î˜ ÇÞž|yÇ[eñ&…›^{ÁAzÑ0APßÊ}c“¨DÇloð‚``?ºÈqͯêôÊÕLßÿ$à4`“õ‚€ p€„mÀ$€8 ÁòOÀìÜ ¨O@vP¬·=ëE7;R Þës½€_RÈ®uÜ_¡‘w2çñϘ(:çæßú„‘Žëä¼N+ö Zé} ›O¼6ï}P¼$ÌPƒÛ¼2.oÂBîÜnñ¯þFoI°ã‡Ã¤"tÁ * zà)^ÀÁd °@áT€4A: †NP z ‚lj è§Ï²ªB N¡B!´BÀU èl@t¡¬Î n¡`–Æî>@zá‚AZé·ºíl«ü ƒ”ðÎ ×PÿþØp° …ì%Ó0ë”Îëý0þŠ®é°üt@üˆ®ÿ‡±óñ+Õþ`ŒþË’ë‘320SM±¶¡À¢!Ö!öBŽ@œAša¬À¤’!˜at >Ü@œzÁ¤AUÚØ:àäàªAq´¾Œ¨@‚çJz ˜¡ ü0Îø"àÖAÿ1{òèÔ±/Ïr9•³9™ó9ýOç:Ÿ31¬N 3;Ár0¹³;Co#YaˆaÖA@¤!Ê$z`Ž`N ¨á€ÀaJAP`¦Á ¦!äÀ~¶´N@¾táù`à  hì*ơϠîÊ@&Th€ï\IN!ÌfI;Q”:³“"S´EQEµ.1ú]´E½óFq´ÂLñÖ!‚APP¬à̰€Ü€r FbBa€¶á€ªaœÁ@¾Á(ÕÒ¨n`@@С·`€0€lÀˆ(€*tÿn`”z¡n€³@à(e0 !¬ ðâ‘Ea´FU”PStÍò/ ÷²Q •Ûðór´R-ZL1# b (@¾až¬   JàP%B"àÐ!àÒÓšA@Ç @€-K *`#@@rž´@Äb@œ08à)®á€ô”@ ®¯"à Ò¹`€ü õ[#UõP \ɵßQËR]u)õRá5^3ƒ~¾$ü(å›Na–tsœáŽ`r1JTàÌ!†¡t´"†PõK ¢A²Á€@ÿ Ü¡ 0 HÀžÚa!ÀazánAVâÌK8ÀVwm qÂõfÍu]õQý2g¼ø1F%gé0 ßU^‘6i(@„¡ßç  ÐÁ()¯ô ¢¡ "@4ä v€°€žA6À/N `®Ëü\IÌ–¬äÀ ©F€b!B”ÁhUr(àˆ¡ú8€úVZeÇ•h}6R#;'—9ѵ!ûP/ËUr QF•6tE1 0@`Ëðv Êg»¯úÍÀO\8  €‡vŠ Ôüb€ÿ  @ñb OS`¬dàu7l@w `\ñè6 l·Ý„V뼕h“îrÙõs“³!yö+×UF‘1ª“:Ç×.Gw~Cwq’Í …á Tëp`~`(OÖúwýWÂ`ºD|`«ü /áz€- ŰÉçtàmÀN›ž^°”8FeRç±QjÏÛ·:iÔK`”Ê7)~–ëÒ:Ár†aô/C„Ã]÷QQ5±üðñ+òhé·ˆ+•Í8Ëêbõ¼Š.qpBŸboŠ­ØÈíŠÇLÄ+9Y”íÔlM'Ä(È^ãÏhÑîšN rÿíñ|_´qÏr )ü¬îÜû1!‡¸"‡´<`õÈk鸎¯©ó’†¸èÄ XàAA7sw†)9‡Û·1&±C‡57’õxR8”/õ)ŠKëYÔ‰c`D ©Hl°’2bdYÄp@2@äT KôüÚn¸¢¤"'` ÏÖðî’—/qëÐ56 ŽçO‘ÓX‰åî~HÑ ›TÌ€éï#1TÀÆ` ¢Ps7PI¯¹ófp1®“ì¶IÖ°|Y¿7"sØh1y’%Y”ù¹Ÿ#ƒðrh@bÚ¦p†„€Ì ]2ÁúV ¦p¢¯ˆ˜€ÿ*! D ØXMŒ/’ N«YÔTù†nŒÇ ç)’ªˆ²n¥{y% ‚ÀÐ/Àìh.¡GÍpqè)n¦ € ã‚€œ $Ì+­ ìŒó|Úðh RN3·BÀ©— ÀÀ‚Z‘bM}zߪ  b k€&A @Ö4wqÖìì²é*@’ïÂu‡/ÙŸõz¯£…MDÀHlÁD@XYZE4 h¡[솞ªZËöÔ Lá4ºÚ› †4€"D€`H“bÀB{°G²uêcPÎZ9@—« 1hàªà 06 §ºÌË2îÆ(ÿÑ*M<êÅNp@kjÆ‹LÄ , ÓdzêÄ(7I`l•I€¼š(‚Fà2n»?€ˆê´8`üì6àÜ;bŠ‹Ü[Ä< E8@R±X!ÓÈ«&à:@©qÒt!f颉-";°ò,1ŸA™¯)¼Â/ÃZ @‡4€ Pab¢@ZÀ6!bãHá² ¢‡t ²À3² ¢ØÀPÁ^j D æ ijà„F@ÖCÁY@V`F@6¡€–N€ HaÅ} ªkô ú`B>)>`ÞÀÌFHÀàÿ À Æ >Þà 8€ÍÕ€Ð|ÍY€Ò` n€ÓîàÒ  XÏÞ >@“ÀÀ¡œÀ`A  BJŒÀ†€â†† >ÄF ò@ ¼Æ 0¤ª@ jFFÞ  üà , ¸fkšàbþè‰ún˜þéy ÕÕÀ«jä Œ`Õ/@åÇÀ ®ÀµšàÔ  †€n¢&!´ ¼~@3¡  dš©Þþ›·í-ÃØ¡=ð¡Ýò' 2!a2` ÚIÁ,!&` $hT\*ÁJ 7f¼7~#6A!Þ#9Rá^Ê5d!J`:ªCŠ@¦ â` D r9Ø`˜@ÇSaÿ„@ºÄ¼ ”œÀÞ ÓÕ€³Yà œÀ½‡~è€çÏʪ€BX@Hä䃠 j&´FÚ»¹7À b ÂÆšà­„D2¤¬Fékl@€Æà> |¤­â‚5%8\y¤&M£;ÀÜr¡D ð¡Äié¶•ª #†€‘8”*‡C…PÒÉÌZ#kÖÄ!@¤È2Fê´ 4¨Ð¡D‹=Š4©Ò¥L›:} 5ªÔ©T«65àcÔ™MsmʱJ+(S-,™’ „› ŸFe°„êEZSBÔÊÂ&RREFÍ)¢V£T!FB«jŽUv$Äÿ™UD¦Z»eHËF–UQ.Ç5+І`ÀƒGCœð¸¡É›6>Tyc„Î<<.Œ¹“çʆtÆXp’'ˆ…+t,‚`±Áa‚äqÂÂO•†Æ(°î„†EwŒ;ââÎ Fòù°#ú :Š_`‘bàŠ Wü8iÒ„òA÷ ˆÆ%È@Á¿4SŽ&ô4Ò œR1pPè”Ñ@/2í”H%DPBN#qhU‹.¾cŒ2ÎHc62Õ‚V\U²I»ÌÁÁ(©´ÀF.YRËZ Œ2Y*$±Šhì²Å£èÈ' ˜‘Ö(Y¤ÊvÐ’…ÿµ$¡C*¨ìEŠ"äàƒ-„P)¤D1 )9±…YÔ²…ÑÌ$èðAN\0‚%¨áÄ5lP…¹íÆCø‘Ü}ÍÉöÖùaÄ.\pEMáA8!@#ëшcð–^‚å¡úÈ5Áž{ìp8alà7 ñH<øì#` !- СÆ

à09”C 6èÐB -œ/B Q˹ô’›Ü Øÿ"¨° ˆ *AËb1 ¬ Q¸A n°Øàö;bô %Á J@"Üî'þ¢¥š°‘Œ =` nà‚ð9NØ@ R ž°à$B{„#¤ 5‰dàÄÀ5pz`ƒØ`, ‘ NC¸`/€ jàÔ¤$Ø¢q#”‡1 ÁÚz‚°àö𡉸A0tÑ€.&ï&èŽP (! =ø N”Èà4HQ Hl{œì¤'? Jà /)¤Ò”% ££r’Å0A `ÿP¿)TIKHE  ‚¬`–/( P‘ÀÄ uK hðÔÈ`h0dG"ƒ€@= Ü&Ÿ³ÁM±|¥På0È€$`›pPƒb=‚u$ÀA „ØDܽ '–”Á H`ƒ{Êà| Põ p€Š£,GBK @ yÐÍV0’x@¢4ˆ¨MX€¾É ŠÐv0HŸ ÀÀBSPPàƒDÙDcàm¦4”<í©OÊa›%¸Æ9¨ Ð7•ÉMn–@Ü„A4 Œ¤90ÐOTèÀ,XÄk.S¥6ÙiM¾‰ƒÿh~³nBlë\ðhŽ$Œ7HÞ]Iƒ° °*bÁ&ßj!Òà:Ø~TàÂ8J0 eëG›ƒft¨* HiÂO ´'"Šcpž¸µD@m­k_ […Õí•1ðO60x`)ÁPK€Ñefs™*8.?ÐÕÜs˜`½Á º(w§Ù4Mü” fp$üj]ʳþÄ °A¥ëEàÄuñ— FJ€ð½Ù4+Xk0 Ø% J[“ÕŽD›/¸ç-£”‰êÅ]Š ¶ªh»@nmÍ àØjxÃî0U`ÀÔ£zq5ØAfS°‚ènÿAˆ¤MTÅ¥-Á–±êdW´ *oe…¢æZ÷!XÁ `°ÝGR˜$À0’I£;ÐÁdâÄà¹=XéÄðƒÈ€šÐ~`PÞ`Ûv°í@ÁøEâËL)w³•j6±g>“(µ;è²OÖ\ƒ`â»ÝJP EؤÐ7xäšIR“lâ } i+Œ`‹zÔ¤þé„’X–³&)F‚4JÖeJ«GrjÖ¥Ö#IÁŸÜÀšÜ  Æ/8­g>¯ h@†ælù (A8P#@ ¨Æ1ÐÜÿ ($0  ¤!i CØÁTùœìlê[Ï hÀЬ1  YPº@pX[¿­dˆÑ‹¬×Ù€ (Ѐ‘\Êœ¾žC=F}ÛÃ¥.¹ÉO®=Ü M¡jM6¡¦e½QÉÚ`=…hcÎØÀ¾C.V°âX¨Àtñ€êâzpÆ:œq +4@Ç8E0z@(áÅÃ80‰RÜbH<°€l£ ØAÝ~ÎñdÏò·8jp -Pàº8†NÓP(âÉpø~ VŒìdž8°Þ¡k‚(Ã)J!¯ã@Ê}ÿ®Ê+lߨŠå¤/½éO£ÖyÑÄ Æ$D¡{{~!šÇ1–Žè §À$Ôq90Cˆԣ‘b˜Ã è5¬ÑŒtè¡ÌhÇ-¨AøÊ@§àF)`o.süq×·ÇwŽR@ê€Â ª‘ f˜Ą̃†:ˆÑŒSÀÕ Æ3ÊpG—ÇÐ=@² êp p ò Ì0?ðo÷qæ(£7`ˆzÈèB¡¡ð Ô àg~À åP.Ðzð Í ãP Ï¥@Á£0Ñ À ÓapJ 5ÎÿØÐ Aq'Yày%€…;ÀÇp„Ìp„·€Ê PÓ0 ð@à °'x2H &hë ð à¬À‚P“ !ÙÔyŸ‡M¢'z¸c舉¥–0 Õ€ÓpÉF{¿`/ Ë0r`e𠊰`åðx´7 ÚP   Üp  ×0Íà ¡8V@gGÓà àwoÈöÒP=· à¡@0 åPØÀ  í@ ÕPÑ€@‚ÐX  ×PÏ  Ð0 Äà è 0 耰 ÿ· ¡›GFZ$w ‰iéS$0§H z  §I rÐ æP Áàð å0 å`p"Ò@  »“Î  ‹P8ˆðp ×0!o‡o5rà WJ rŽ›çmÙp   äðJ @0 ÁÀ7p9àl: ½à)ò  ëP  ãÀ·  ûïUTÈ?çg)zé— ˜ ³jÀ ºø à °yÙ´p î ‹ò0 ôp àÖ · ` Êàè?ÿÀ Ôp ë0 ð J(í'×° ÎÀ¬@Œâ'eÂøV.54 õÀ 3qšÙ Îp ðÖ0 °5?À gšÐÜgÖP aÄ êð °‚h§àþxa™où˜é©žë#ƒ4MVð Ö0 zÀ_zV‘½p ¬à W òÈF;Pe° Ï À ÒY½ ÇP(2U â ¿ðGÐ ÍÀ “Pp@©oµe"ËÔW"gÍ °Z7 Í Z°›¬0 P]T ÍÐ “'¡ð Ì`£rp(¿`œ PzÐ × eš†— wzÿÉžO ¥“k(÷s0™? ‰ à €4°¥`Ë qËTPnCÓ‘;Àl¢ 0°Xé†Ñ–"ÎVý"e¶¹o‰Ø¤`n4Z"àl×Ö¹5Єp 0!2‘å¶§7Ôl8Ð[vmÈö¡"§Q*ª£ê"¥TNuX–¥dJ5…ˆC±Zn…]E«¦Aù²o1@V †oœ†zp peŽÒ à¥û¶fŠoVTlÖ@;ð}%Z›W=° Ò gÀ•g Ú—R6F7Ð(­?g9þ˜â:` fa¶^Òº^o¶VÈ6\ÿ™i~–i}Iªýê¯QÑüÚ@Elô^³*=]Ñ…Û$a®4«Ze‚8¡I,¥Iƒ«Ü´Vþ¸ ¹IõJ­T€­þ’ Pm!áq–lc¤RŸÖ¤VŒH6Ѥ횯€Jr)¥õi¸ª¯Kшÿj´G+ðXÖe@TGö_P7'ÐE¬Š³7AÅ—#\t´ UÄå@fB4äE=P¥ÑiA$S4¥ `ƒ'RN Ô4ð¾†o,ôkH³‚¯<»o¼ÅkŠHà:´AA³©—æ ûZ´H‹¹™›¥ ÛPÍÿOk¸#ùÅ 3åÏÐ Pœl|&'! 6ïu¥À ß°§‘M±´L8 ê€ 6D æ@ PЇu ØÀÇaV á0Ä Uã@|U:Ar.;³å‹`çù§N!³è»—ÞJT3;D…³«¹õk¿Ca   åаw˜‚Zþ¢é @ðP æÒ) U=0)`-@¬?p\)EVT ¥PÅ ØÊg±ÔJ=p òW;Îp J ™ `oZyº€ ÏÐ%Á šÀ®p.z«`L ®èkÄÞŠÄFÌ[DÿÛ¾úú§7²ð{ÄŽû¾÷kÅW úÛ Ñ@ %PØ™ŠJ€!ìÀ ØžX Ñ€¢ÀÀ ãð Í  @ ×Ð ßp 3\¹» ˜“°O¼Ê”"Y4p‚èP 0 çp±Æq—$ƒÎp.ÐPØp‡7000àkž:Åå;Ê웳Y‹¤¬Ê¥¼ÊNú¸X Ëõ«ú;H  ë àm0 Ö@ åP° Û@Ëp К¡€çÐ À è°¬`$pÌ[þT“€ êÀ €­1GI˜å [G€§ ¡ð!Pæy1PÙÉ|öÿöàê ‡DTœ¬ Ðp'¹É¶Äùš¾­Ð ¿¯Ë }´ À íлÊ À àÐ×p P©X7$š€Ñ·Ð P­ÎÐ p“PP^)¦o  ì< öÖJ&æq8€¸ Î¬ÐÎçPŠù«+ìÑ`ÉpÆ:ð ËioŸ ¸@«ÐU­ÊDŒÐYmÕ¦L¿íÕ£ªº9À}s9 ÛàHh9apR!m–Í(‹á€@ Ó@ºr€ƒÇÁœ À¹Œ³T5À7Ð`é  M84-…‚4ÀÏà ÐÀ} ÿÀiˤ¶¾r[­Õ3[Ðó{Ú¦]ÕUüÕ¯=ªÖá@§l¦ð ó0 âH’è !7×?À~“Pä à Î°×æÓS”»2@™“½ ‡”'Ï€­„7p‘P@ ÕPÔ0 ÍWº gDÓ 2Ð00 ÔÐV­ä½FÕ«ÍßGœ°¬ÝßYÍаMàêyú[ €lØí°Ï;@0 à` aÀÒð ¯X = ¿@áð ? ÌÀ ¡È Pð3L{ÄPß`º?0ð€PÀìPºàPP ÕéÃÑÑ`ত¨ëÿ Z îáÍ|ªdßàέy鸓kåUîÚîåi$ÐHøtw\•”'€G`lÖeÚ¢´»wP°#UöE@€ÍEåÇ2Ð?€;PØvç†%J€Sù?ÀS³›õõpt~PpG8hP éD I÷ú³–«ÐR5Ð9KÊMa¸¥ÞÄZþĤz¡úå¯np6  ) PÍ@‹@-PL#ñüÀÀ„"¡u eE/ LÑ%÷d @(µL%P6·ÞÔQJþ¢UdV‚¤Á-E @y  pˤpÆÕ£ÿÅ‹Hê;»—Oa¸ˆÛê Å¨ˆ2›°°NðÙÙ|ÊU7J°-pÅ.L:dbÕªØD=)B(A4¡W9Qïæ§6T$Pºå‡oܤoåyÝ”öéŸF~ÉSï6o«ºl9ÁBî¥AÉs¹A jY‹óC_ðG^7µNU,Ðè'Pò¼õpA06R/¾E"0æò÷:²"ªí·T…±4埚"&,Ú¡œ«Ky8!ðo¿g.oY÷õvÏ l%0pü• ÀF.¯õLŒô‡ŸžЕ7ÀU*PIþ¤+ È2€5>ÀK0Y°K…Q!ÿÐUþäE KÀ ð?\u‹YTbAM%V:@åM2*°y\*)–Y%WûIJ "I8ÀZý(:Àüãz èbF1 ­ ßpfh$Æ•$¶S"1®?€ÅXòŠ'ÀBñÍ`=p¿À w?Ð XÀ0Ph"Áf‹øùŸ¹€U2ˆ¡!ƒ„ /”!AH-6F¡2(`…ˆ)2ŒáÓ(R•r€˜`0CŒ3d(CF“6B´|aC@ *3È8±bÄA )X”°±¨Œ8lܰLJÇ‚ý CÀÕ«7(4XPà ÿH¨Ѓ ¼ÂÐáÀA‚ vDpCk1°ê-Ñ B0ªR [`‚Œ 4¸£€cÖni)A¡€3EvTh £‡_z±Ž&]ÚôiÔ©U¯fÝÚõkرeϦ]Ûömܹuï– E–-g¢°ñb ›@[ZtH%N–Tl2€• Bâi' †M˜Tø•e›)lБ$q*П9ãCÀ7N¨ð@ÂÆ”çšA6æ˜bTP‹#É%Ž ¢HÅU>YÁ‡UR¥–Cò{Á*[à`ŽYPYe Še”MFB h‡—«:èÁ… .HA€c¨™D%v z™gb¾9‡tN`uøœi–1§ ¨Qç”kž€tpHÀ™iÐ+8€‚lN)纖iç˜czÿ)`t†G˜´`¥it)#-†a'PÂV´Pg p°ód”SVye–[v96ßFAc“9ù$*¢˜âTT`d²¨eÑF1È–¢À%‹r±“-HIb”8XµC‚MHÑ`“T@ˆ"—3V0% ìˆåtðamˆX¥ QŇ$hqćrðÀ"˜Q¤‚† ƒ0œCMÊ©†˜ DPS€è¥ À&˜„¡&€hš@˜rÀg˜†4„Ày²Mh,¯@P"O¸e›8&œpŠu€rP4]—JÀ¸ÑÄ"ÿÐcrnIÀÚ—»÷þ{ðÃÿûFÙb“@*ÙDPM%SLLqh6$ød ,e„(fÉ¢…]d ŽˆC&âÌB:h… H±‰ !s,!6¬B¨Ä,rq ,f@h Ì¡©ØRp‚ 7 š0„1С $ø5§ u¨¿¸†ð¤ÑŒ´¡rÇ$À vP£å`F¨AŒ„G¸3˜ØƒÜ€_þB‡ rü Ìp†~€0¸ÃÖÐÆ6 P‚PãÐA `p×E :H5ÚЈq|‹dd#ùHH^%fÿ[ˆD ‘‰"ìb¨D*NpˆX¼` ¹@ÃÖF‘G ‚«ÈÂC²…OŽ˜EÕV‰ |‚"àZ¦P‹3´ŸÀ€#æ¦,âSàfa‰¸É‚;-À@r±Ü€z¸£ D°p‚32@(äp_0€{“Ü9DP€mì1Ï0Ç48À€`lc?øÁg¤1Œ¨îÐD5žÁŒè Œˆ¹íÒQ ðBh€2žñlÀ é˜ްƒ$f¿Ð Ü = ` `6¨ÑŒíÅ@/3åP$mzSœæT§°É,ØŠCXâ#@Å(æ ŠVø ¤ÿÅ.â H@P-ð)Rñ‰]QhÁ¢P!È‚¨U¡RÑ U€b×tÐ'xÁ Nì7Pg^  ¼(ôÊ9ˆd * AR°ƒ„+p¢ "‚" a /ØW ò³m²`—¢AH‰rsÛÀ&ƒlŠ t0H†[H)¶ T°âaË`P€Â8«Ò¡ èáÊR¤.~Q5Ý`=àH‡mm½ì`4½I¹_ð] 9Ì”×öô Myq ‡¶wkÿã ë¡6‹){pÀ^ðà}J¤æ“> Ü@„À r˲mƒ ȉ  A  ’IÿPÁ ˆ)è ‰,ô€àAìÁô?ÒÀ@a[¾]“?P=ü B 4ƘÁ * ¾æk>Ò+¾¿C>Ò£?&½.üBa»@+ì@2,C3œ XˆÏ8†iˆ€p¸ÆÊ2(@¥øP(ÀؤhФøC§(DCôCDD?LB"D>+d±Xþð»ýÃ&ÌB€ȾÞ6vûD0lÄ!¬ÂQ4ÅGL‰qBE!“4ÅÔKK²tD´ìÂåƒÉ´¼I¸ŒË@[ɱ xì†R]° h–Rx†ÿsx‚Ø€k` °Du6S Èì¹ÈœÌž[K·ìFɱ´LÎ,½Î”KÐ Í2€¨€n8}ÉH—¨l(‘Ph1P‡/ Ã¼Я,’3Ë{¼ÇÞ¼LálI¬NãÌÀ—ìLçãLÑlNçt$X€^è† ØϘE‡h†i˜+ †nè†`è €i­U ËÝTÎãDŶdÂRdO{ÏùkOù¬ÂçÌOýüžø…R8 £ )Î#ø "ѸOö|Ï+¼ŠÑÓÂ& à§è§=´”ÐË|Iú”I !KÌÜO-Ñ“!€pÿ›# йû×3« ‹– É}DÖ{ÐL,BuPG¼@Ò¸ $€€ ÐP/ŒÐÅB„Ð/œÒO¤? e=ÏÌL04Q/ýR8é€hX@ÑÐ ø³–¦ E”¶°Nâ£Ò(¥Ò" Ñ[ÃS=ÍS)ÅR~¹™ò€Ñ0Ò2x†f8Ôfˆ†Ù"3(qäBûË ˜SJ­ÔÜØh° šâÔš2´l‚‰ >-¬@¬@´äó3SS)mU+ CzRzÛŒÑØ`…ØU^ †øÄÓÄ×èÓHÝ.µTdMÖØØX»Y»‰û[h @`ÿ&à30åR$£>ºH&@¡‡ À¬@8׬0W²0H×ýxÕMâ“Üòe¼†f`VXuZ¨ÝžùÌZÑL>Ö<ˆ=!U°ƒ ¨„Qˆ\p„ 8[GQ ­‘…GÁ„ %3ð]0ƒ( ¨žñ”\@PÈ…9(Þ÷qªššFà`žÅ+RX…@Ȧ„O(Ø%p‡ƒ}Q‚f©7b Eð஥=ݧý‡¨í`}ÝÖUX4ÈQ0š9„M€$˜‚A…p„Uø ˆ˜PHpSà€þ1ƒ¨r„-–O¨ÿZ¸ L0 øŽ‚ZØ‚H:„TðX!ð𻑀CÀ…"X‚g˜ 8‚bP„5‚Áƒ+P„oÀ†bè©ÄŠH]mÚÿZî:`¸t]2.¸…3 FØ„ ø„=1ø1õ¢é…S²ShÿÑ 6x`r›3È;H‡0…@8U˜ƒýš… ª„\¨Jˆ °‘3 &˜€8 ]P  ‹@¤°¡!ƒ7p‚ 9˜s°(x½«ˆœ/FÝø©5à3îG3îe@Sà™©™Ps* ÀXÈ;˜…%4È€`A%S ÿ(X3p%3!Y¨HI]ª®YQRŽ´LÈadŠƒ9¬‚&F¦hâa[ÓE²§fÙ€Ð,’l ©wëâ[ãíæ2æe…þ®ñ‚4*õ¢²U˜*P…¢rª ˜È„¹ñ=…¬ÊT˜‚ˆ& ›X SÈ`SQ…Yø ‚SA…Z°Í5º‚ˆƒYhZ˜ƒ H‚PX`‚ %‡^X€¨ÞsŠ `…í¤†³Zn€ƒ.X]¶¶†^h† ëîZkž‚$Й^aƒ3˜‚30µáˆ‚3Hx¥˜3к6H‚ÿ 0ƒþÊ;X!ˆ60ƒÿa -`^1 &…0WÝÃç@iÈÃM‚Ìø=¸·ÝË2V˜†h(ƒ’áb/ößÔc²~Å_~íïJ ÚF´À˜Hˆ¨µèm ¨ƒ`Àˆ“ÛˆLØ„J ›\¨[{WÝ~Î… š€Ó)Œµµ«0  XÑ6 (MЃë«ÐÓãÖÞ=Ù†m†ŽoH:®-ü®­ÈoÈo™õoüÞïý®-“@!Hv•×ôV3`Ø—›}ל)xU¤Z~7w•(P‚Р©X¦%XN(ú†Å’Ø>ñœ:NÜD qqwqP hœ¹+ ½Ø oð¾ Ñ+8r$')ƒo'ÃorG:€0šoÙ iÕ‹ Gw=U ± àg Œ»Y(¾'/óGšÂU…@3es7';HÒ‹r£²NŒrCsW AT& I1þ^à: !)¥ÁÔP2¤tù B”Ýïm£É Nw  f„(8 › 3Ãd8Õž@ÿFàCŒX£ˆq—ÈÄ&:ñ‰PŒ¢»*ölŠ FIô€+d­€½Ã¢ÇHÆ2šñŒhL£×ÈFÐDam<ãâ(\ÐñŽxÌãqVƤ )h—’FAêQŒ@hÀ3Ðè¡C:ò‘4 Ø"IÉJZò’˜Ì¤&7ÉÉNzò“  ¥(GIÊRšò”¨L¥*WÉÊVºò•°Œ¥,gIËZÚò–¸Ì¥.wÉË^úò—À ¦0‡IÌbó˜ÈL¦2— %žQ_Ì<_2bH N#5 dÀÒ˜ŠL‘)ET1Ç3¢A±HcëeF  8ƒ¡R„4Ò`†T‰&ùÙj¿³9³Œ‚QL5õÉ=Wô M¨BÊPÒ…±#àr Ê’Iç](¡»2ðÁ(PjÁFt8áY°¢ ƒä‘”ÅIíˆÆ(`t|[ ‰#ø—‚ÕħL©@®ù’– Õ!ù ,¤!ù ,¤!ù ,¤!ù ,v}T £DÁƒDÈ0áBƒ*ŒHñ A+RœØáÅŒ!rÔh#H’%F†4)p¥È(->t©’äG—žìHæÊž=i*Œ!€¨Î¢!ù ,¤!ù ,¤!ù ,¤!ù ,¤!ù ,¤!ù ,v}¿€ãÇȈ1pà "(0 Â†Ët©’äG—žìHæÊž=i*Œ!€¨Î¢!ù ,¤!ù ,¤!ù ,¤!ù ,¤!ù ,¤!ù ,v}¿€ãÇȈ1pà "(0 Â†Ët©’äG—žìHæÊž=i*Œ!€¨Î¢!ù ,¤!ù ,¤!ù ,¤!ù ,¤!ù ,¤!ù ,v}¿€ãÇȈ1pà "(0 Â†ËIã”é%Y‚Œ\R ã”_¹e–?^)fwVÆX¦{k’gw!ù ,¬ÚLPBFÁ‚d h°!Â… :T¨P¢Å†'^,Hq#Å…12Œ¨1#È‹ Mj4q%Â$=fô(Ñ%F…)KBL9SåÎ8!ù ,¤!ù ,¤!ù ,v}T £DÁƒDÈ0áBƒ*ŒHñ A+RœØáÅŒ!rÔh#H’%F†4)p¥È(->t©’äG—žìHæÊž=i*Œ!€¨Î¢!ù ,¤!ù ,¤!ù ,¤!ù ,¤!ù ,¤!ù ,v}¿€ãÇȈ1pà "(0 Â†˃*´(Ñ£F“"]ª´)Ó§N£BÝIQªÕ©BQ<@ð’¯`¿ KVlÙ³fÓ¢]«¶-Û·nãÂ+·.Ý»vóâÝ«·/ß¿~,¸0áÆ#^¬¸/§¯p ,YP˘/ÌÌy¤çÏ C‹Mº´éÓ;«ÖÜYáê׬7£~¸Æ`Ÿ‚}þô´ûòîß¼ƒ÷žM¼¸ñãÈ“+_ŽððçÀ£×ÉÉ"è±hå•Xf©¥Fä-²¤@C†¦¢HBå ’ˆå“b9(—˜7Ð"ƒÐigxÞ©gž|îégŸxV·H !Q&ºf”@^RGu[F*餔²8Hi"ºè¦Œz²ˆx}x¥è¨›rxéhâ ’ ÕAš ‚üÿñEeæVé­¸æª+jè-¢æDžˆB%z—ˆRѬ„´ ‰À*`¬ëZÐ……2ã—5úè²»vëí·àBti¦±ùiuIRtIf#™É}‹Ä‹"¹% Q¬ˆNTk½áöëï¿ßöúkAžî˜P°Ã~5°Dœ’ ÿAòÇ€ÒÉÅŸi/AÔ”Èn×df¼‰˜i¶¼¹ ðÊ,·l)¦ +9c/ÄüÂ!ÁMžû¶=æóÉ_a¶qA*¿Ú$| ‰Å_ÌÉÅ’T ÑùÄL5ÓXS 5ÔðbоR»,öØd/'0Ïœ”B9æœ3(³„p•Åò¬d)xçÍdÏÃÿTe‹4çÚ Jr1$ˆÒÉ”)1 Ó&rÕ—¸‚N:éHsM:êTø@(‹Wö褗>Ú¸1 ðÌ9½pÂK9Òà ¤Îé$‰åê`Î9/8‚ôeC` u3K>à´Ì ú°d>èæ´ÌЧLe‚¸G8µ¤¥–‹|ä#×É*ÖL–Ǽå2gÙ8@6"C„óäÜØŠÿ¢ ròk«Lç:Ann³žóüßðìùÏ|NÙ*+<„P ±kíÌèFƒ RŸ³Œ¡MéJ‹’ dX¦âðXúÓ [Ö†0¬áÔ§¶@¨WÍj±ýk5ªS=” Õ¸Î5®n YgÕº¶°o%ƒÀZÖšÞô°—Íì+ñzÖ¨&C³§MmùZÓØNH0ªÍín›)¬¡Më‚€ ÞN·º=Sè`Ü™þum"ì`ÝøÎ÷Fb‚Ì:ÞšNHôMð‚G¤ÝÆ>5ÀOmð†;\"üöw´±-í‡[üâA8¼±Íp„Äã 'xÄÇ=ñŠD!ÿOy¾5Þq.!4P¹Ì»=òL‹â†.Ÿ÷@ @”ÏüçÔn÷«ÉÀ‹cƒ¢è‚Î B ;}ÙüÞ ‰ŒSCÀ ›xºÖ…ý"páÇF…Ññ­›}Ø1×ÁîC²›üìpÏu׿ö±g:îxouÚ×~ô±<ï€õÜÁ.vbãîA@àOç½Ó½í'HOy¾î†G|å7bdzÝïo&ÏùÒ3÷ò…?üÒÓ»^¶žï»á#?¼þö—E½ÝWïiÜûþ¢±‡|èOü¦ê>óK/ÉÀ‹Ï|QôÍþE¯zé[ßùj<ô¯Ïý2R_ó,é}ÿ÷Ç?¶çÏ~ø' ¿úËöýÕ#ÀëËÌïvƒŒ@þøXû ‚€[çÿÿßB´ÇzX€Ý²˜€Þ"€Ã×z ø€’‚€¡x=ˆ% x|—zà'z‚)’"X‚+"¡xGð&Ø‚ÌA‚ð .XƒÉ‚Q6¸ƒÅƒ<øƒÇƒ@8„¦áƒDx„¤!„H¸„#a„Lø„!¡„P8…á„Tx…!…X¸…a…\ø…¡…`8†—}Ÿw~d˜†!†j¨†^؆pȆp8†o8‡i(‡vÈ…u˜‡`ˆ‡|x…{ø‡[臂…u…x…((~‰hˆfÿ({õ׈wØ»7‘’8…˜‰L¨„/À‰ŽÈwÂgŠS(„ঈ„0x0þ‡«x„Bˆ³¸„NHz·H‹”ˆ|»H…›ø‹;ˆƒŒ(Œ.ŒÆè‚ĘŒ@h„~Ìȃ„!h„’qÔhƒJX5 Ùh‚ÖÞø%ˆƒŠ§:ä¸^¨Žë¸æøq6€+ðŽèŒîhhŽ1õȈú(èù€¹ i€©i€ 9‘‘ôh‘è„M§‘ ¨„ãè‘è„ " ‘½X}–(s0'™NØ@ /ù‹XŒ5ÿ9~Ö˜“x“< “8Šôö“ù·ˆD‰øx”ñ7JÙ|Ù”êÇ”PI|È8•Ì·ŒVÉ}Ö(“Yy}>Ù•Ö·“`i}7É•cÉ|by–Íg”f©–¿W•nizX—o”Û·s#€tù{F’{ùzpù—”‡‚ ˜v‰†…y•)ùQM‰YzbéDÉyæø“ ™‡‰;‡n—I™‹¹zÀ™IyÖh‹£Yyæ§Iš™9€Š·šƒù™A ›p‡Øh›€·Œ¨›q˜¾ tRœ3œÄ)sÃyœ)gœÊr‹(a Í t^8Ó©uRø×ét̹'…çÅÿÙšÃ'žO—œæipÝ™ž‡žì©oëùžøæžò¹nñYŸéFŸøém÷¹ŸÜöœÐ þiqý9 Ó’êpNx êpñØ  ׊/¡ 7— Ÿäy¡'„˧¡ø–”šo_¢ö™¡‰G¢"*›(Zpº¢¡¦Ÿ.ºjÖÈ 1úŸ*ú5Zm*¹£Ôf¡@Êl-:¤6¢F u&:Iz 7~MJ¤Kš‚QÊlHZ¥¹ö”XlB¨Š[ªwS*4ú¥­Ö¥¹I¦2¦¯ˆ¦¸fŽ^ʦŸæ„ª §«¦„4I§q¦¯‰§‚÷¤@fu|êh^ˆ‚:¨Gú¤áÿ€ˆJ¨KêŠjiF9©”–‹–Zgž¸©vV¤žŠYJ¨©¡:eV¨ƒ¥Ze]šªUª¬zW0úª–å„'n²zb±z«w•‹¤ª«æ•«¾ÊT¼¬¬ÄjQ®z¬Ú$„é'ƒÊº\Éú¬ d¬ÒJ˜Z­Ë%„Ί­°§¦¶Ç­³E­àÚB×:®¢ª¨æÚ­¢x—ѽš®N%®ðŠ>Ã:¯x%¯öj:Nø­ù¯èÚ¯»ª¦ «ŠJ>w§»MFH* [ kQÄ8pg±Ü´°‹Q›±ë­ËMøú±+­"»2BZ²dä„€²¡²,.$û²áâ²2»€ÿ[³dDŒµ‰³úz³<»B8?›>1;´¹B³F[)VHI{>„Ù´¥³¯Pk>O;µeㄽiµì‡®ªµåç³^K6H¶Wb…£@¶cc”]‹¶# ¶lË2cû¶#©r›¶[·,S´x›"q»·óa…[ä·3û¯‚Û/NÈ…Û/B(š‰Û-zÛ¸ñÑ·»;¹Û!¹–‹•›¹Ê!„$ —œ{+Rº¸r²¤)$yº·‚¹ª{›Ûº³q“k »è¶´›%²{»[âƒ8©»*R©¾›%å¼VbºÄ‹"¯{¼ á¹ÊË" Ú°Íû»èú£Ñ{"´Z½ÒKw˜|Ø«"ÉÛ½ÿq¥àß;¾!„mi¾ïQ¾ê›Ì:í Z¿ïÁºôkÖø¹oz¿Aˆ®À¿/¨§|¹„;ÀÉa„\aÀ«¨`™€ ܃zºŒæÈ¸ŒÖèlÄX÷ÖÁ¬¦º(§a¿&œì›ÂÂ,l+üÂáÂ2<1\ÃAÃ8|Ã8¬Ã5ÌÃ5,„ðÇ8 ¹h’E¼¼w›ÄFl»L…üÄ"Ä2\µRüTü‹øŒW<Åzº³]¬>,ÃVhšaìcüÂYÌÂJˆÁgœkœÂiÌÂqlÂsœÂu,ÂwlÂyÜÁ]÷8€o }œÁ|†‡WžƒÿÜ…\Á‡ ‰ÊF,°È±“³KÉñÈmɘìÁ/À‚ˆ k P'°¿ qjG} Gw ·ÀÉ©œ%`ký]p 4s ui¥<¨<Ë'Ps.dà'©%L6·¦½5K'ÐtDÐÊ,oV—ÐÍÞüÍàÎâ<Îä\Îæ|ÎèœÎê¼ÎìÜÎîüÎðÏò<Ïô\Ïö|ÏøœÏú¼ÏüœÏ{jªF’*ÌÑ»q ½Ð ÝÐ ýÐÑ=Ñ]Ñ}ÑѽÑÝÑýÑÒ =Ò"]Ò$}Ò&Ò(½Ò*ÝÒ,ýÒ.Ó0Òß¡ !ù ,b„ÿH°à@*Lh°¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠIrâ“ 5¢\ÉpaÉ—9 I¦Í›8sêÜɳ§ÏŸ@g ð4´(Ñ£F“"]*´¦Ó¦Pƒþü#€ªU©X³jÝʵ«×¯¯Š­Jv,Uˆf˪½*PØ}ξK·®Ý»xó6L›-Y¿úèmèVÀ ‚ƒ÷´¸1ãƒ#KžL¹r]Á gÞì¶ó¢AŸu6œ¨`"A§K¯%¸èÏ ?šSõ$Ê('QžrëÞMÔ²ïßÀƒ ÿ{§KJ“35|x 'ÞPŸæ–9ùϢdz_Úν{÷áàËÿï¶ïèÓs÷Ôš 'íÇÕw^Ù“üûÛ©“ßÏ¿¿ÿ öá‡^|HR‡@Ú ˜ž'…õ1ˆƒ0i&F³)¨ž~ÿe¨á†^$ˆ$ZÈÝqD æ–ˆ#®§VNg!‚ˆjyŠùuhã8Ú¢wïÍ8ßv8<þ!˜ƒ˜á „X'P’™w‰SV™ Èå¨å–\þöáŽÝ)È…—”¸‘3ÅÖM„ô $ŸA²" æv¯õÁGŒI2`—€*è]wnÇ‹0¼\âçȈ z’D*é…Fö NDšH"ȹERRIÌ4ÒTC4ÒܲhŠƒ¶êê«>}ÿé$¢HS9åHS –fž˜ž(À;cš+ÚDH`kà¡(ptòÙbÙ9k)å˜cN4ÕœsÎ4øˆ!¬à†+îG`.â 9‰ÞÎ3«VÙ¨Tr²È)å¤s:øÆ#'•"  ‚1Ç1¼à!É ‚LøP¨ÜIR 9æ¨# 1êl;–ãvìñÇɱ(àS‡'u3Ž(í’Ø™žrŠ3Ÿ"±k¾ô¦$d´ãÏ+‘! cÍI$mw‹”bŽ3̈ 3ÕTÓ‡· Wm5È;ÒzÎ-‹°'€9¥¬J £CÎ*€0gÄò¾ý^Z"€¼ IoÕ¡GkNFy⌣ÿsË”™=SM·?^møáƒŠòx,ä"÷ÈFN2xˆ¬ä& ÉNŽ2e˜,å*KÊVβ]¨¬å.ÓË^3W¸,æ2kÌfN³OȬæ6óÿÍnŽ3LØ,ç:—ÎvγGè¬ç>sÏ~tEø,èBOІN´A­èFÑŽV4£#ÝhHSºÐ“¾´¡-­i?gºÓæ4¨óüéQëYÔ¦–s©S]gT³ºÍ«~µ›]-k3ǺÖi¦5®Ã|ë]‹Y×¾Ör¯ƒÝe$w€Øu¦²ƒ‘-gWXòe¶›©Ì=H{Ö’.¯mçasÛÉÀþv’™Œˆ;×Ùï¶²Ùs{™Üî63o^'7¿®·š‘|së;Ë\ö÷¿­ eݼÊ\6øÁ¥ å,\ÊÞ~xÃ-qG¼â.¦8ÆQ|ñ£XãqÇCb“|Ã#ÿ?ù†M®r§¼åf9Ìüò™Xæ6·oÍsn_œóœ½;ÿ9{}.tï½èÞ%:Ò«{ô¥WWéN7nÓ£n\¨S}·S¿ún­®uÖf½ë¬å:ØMûõ±›Vìf÷lÙÓîY´³=³k{fÝ.wËÆ½î–¥;Þ#{÷½GVï~wlßïXÀ>±ƒ?|b ¯xÂ&¾ñ„e<äûøÉVò–÷kå3ïWÌs~¯›ÿü^=/z¼†¾ôx%=êëJd d «—-ûÙ2™öµ—}ºáKÜçþ´§ÿ}\U/|·¿øn%>ò×züå¯UùÎGkó£VèSÿ©Ó¿þS­¯}óÞ{ÁÝÿ,ÿ÷Ã/Ñì“¢ã?¿=ͯþ{¦¿ýäd?üËùþù/Sþögfýóßïç›ÿµ8Iø7€•$€˜`þ7b ¸x»·n èx Èbxy8a(X˜4„€ˆaøƒå"ˆ8X‚¿C‚(x5'¸‚ˆ£‚.2-ƒWƒ4Ø13xƒ cƒ:.9؃Ã@ø*?8„á"„F8(E˜„¯‚„L(Kø„ƒâ„R¸%TÖÀU˜V@Ö_[˜V­÷…Ïw!bˆ}!X8p†ßE†lÈ|iø†\è†r(}qX‡m¨mˆ‡8…|È!Tø‡ýᇂ˜!XˆäAˆˆxdt¸ˆåÿw‡Žè~‰ë‰”H“x‰ñg‰š¨™Ø‰÷lj 8K‡8Š–¡ˆ¦¥˜Š“Ьh«øŠƒáв8±X‹xA‹¸8·¸‹u¡‹¾ˆ½ŒoŒÄXÃxŒ^aŒÊøÉØŒ[ÁŒÐèÏ8X!Ö¸Õ˜@܈Ûø=áâáXŽ:AŽèØ縎7¡Žî¨í/ôxóx#aúøùØ Á9ÿ8! ™ Ù ùá©Y‘† (¹‘A‘Y’An¥E’82’(Y ¹’¡’.)-“ “19“4ÿY6é’8™“Aó‰>™!=”;¹’Cé“E‰’G™“II’KI“M’O“Qé‘Sé’U¹‘W¹’Y‰‘[‰’]Y‘_I’a)‘c’eùgé‘iÉk¹‘m™o‰‘qisY‘u9w)‘y {ù}ÙÉ©ƒ™…y‡i‰I‹9 ‘鎓ٕ¹Ž—©™‰Ž›yYŽŸI¡)Ž£¥ù§éީɫ¹Ž­™¯‰Ž±i³Y޵9·)޹ »ù½ÙŒ¿ÉÁ©ŒÃ™ÅyŒÇiÉIŒË9ÍŒ?P Ê^d@AéÑé‹Ó™]ù^”E²»ØÕ9\Ø)žûAž¸hžß‰žê¹!ì¹‹Þ \ûñ©!p ^Á03陟ã! ·À _$ø  ÿ‘Zÿ‰ ü¡Z!ù ,[ÿøG@A\xp Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(öQȱ!‡ c|™å ‰ZtsÑ¢?ƒ*4¨€›5“*]Ê´©Ó§P£Jšq§ Љee¨S`Ÿ£<Ãî+–§Àœ.©^”““§‡ž8 KwîÜK ÕêÝË·¯ß¿€ÄËé’áÈ/^¬çÀ¯vëRä$WÀUÁ /$V’ÏÏ A „¹´éÓ¨S«NÍÉ'Ù×<ý4›ó¢®‚.yr]6ÙE’ðª^ÔÚwïã·W+_μ¹óç/ 2NÝ5^>yW7^™àeÀƒ8mÿ?>68ôóèÓ«_¿´à¥?äy&z(ÑÏK’Joœ¸åÿ¥-rI|ã%ÇÞ&¨à‚ÒÑg[XœYeØ ¤Ç wm˜…aY¡‘GÚ‚$–h≂¹ßX² Ç‹±Uß}ù-´†ý tÕw‚ 8X‰¼Çk¼Èl#¢¨ä’L6y~?Žuä-ÁÜBY¶ r]v½ ÂGu€¹Òqm˜–_ö6Ð4Ó tdgNÆ)çœtÂ$À{bý!8àŒ'@Égßøé÷ÚN”Å—$îäߎ¦ùHV¢ ôŒ@èHGYIÖéé§ "%YØcå+Õá„ pa¥ÿƒŽçÔz‹ªe•iÙ™}¥9¥3 ´)œ¡k챫©r³Æ"küŽª²5h¡6ºˆ(Üv‹çorA`ƒaQZŽÇ\rË1P³)Y"+ï¼ôR5*O}xRÎ+uHRª¢Ô!!O[ZXV—#ŒÂ4,@°éÊ¡`¾â+Ê9®øtIÎ0lyõ†,òÈ))»|DSÇ‹—æ'(††•¥Ù„#ͯ¼Ö£b&`YpxBŽè\BŒ@ÒÁ)ÉL7ítFØí7é-ãPÃî8Áô!”XZ:ÔZoAFc“Çf¹âVZx¿%LN8å¸ÂŒC—âS„ñ>­÷ÞL÷ÿÜŠåž2+ÎH3Y„>l”2ó!J5Ùdsäü‚XÙl»ö誣p Î8çžcÎ@£óvÞ|§®ú±uÜ%Úuľò-àH[lMV¾G Ä®(§}TϱVœ”RŠ(Ë7Ïmló¡¾úôÔËé÷·ò9ú®LpX‰E軯A†ùæC<ßΗïÈë^·;²ÓOÿœI_ýþü—Ø:¹ÕéCðX”» 9Ê34ŽÄÖ&-Â>|`oô׿ Z0=×À'œÅ‘G–Cˆû“ˆmIL¡ Óó¿×°kÑ#¦¶Ò4ð„béà wÈÃÔ|{8_Bÿðc:ª}™Œ ƒ’•&jå‰NÌŠ€zHÅ* ®Š‰B'ú¤„Šˆg°„! "I*ÍñÃÆà¸±m Ž'bÅ:ÚQ*8Hböh˜7J¢0xIDà‰>‘p v071ðôá6¤‰äh& Ò èŽ˜ÌdSþÀ‡ÃÜ)"x‘¤g"b Hb‘²QM«ZçÖ¹2šŒ¥,KöWRë–±»¥@°ø>à;À¤0ƒÉ‡:Tˆ•³L¦2—ÉÌf:ó™ÐŒ¦4§IÍjZóšØÌ¦6·ÉÍnzó›à §8ÇIÎršóœèL§:×ÉÎvºóðŒ§<çIÏzÚóžøÌ§>÷ÉÿÏ~úóŸ ¨@Jн˜£áBAjÎ. ½à'ÊЊ‚ó&¼/naÑŽzs¿ÐhF=JRoŽ´¤(­&HEšÒ–^ó¤.)3WÊ ˜Êô¦Ë´)NwzGšê”§@µãOƒJTú´¨HµâP“ÊT굩P½àR£JU§=µªX]ÝT³ÊÕy]µ«`eÚVÃJVO}µ¬hEÖXÓÊÖ%µ­p¥ÓZãJ×½µ®xEÑ\óÊWèܵ¯€=Ð^KØÔüµ°ˆuÎ`ËØ¿¶±=Íb#KY©<¶²˜íËd3ËÙ¤\¶³ …ÊfCKZ‘|¶´¨MÉhSËÚŒœ¶µ°ÉjcK[ˆÿ¼¶¶¸½Èls[ÛÛòö·Ù-p[ëÛáW¸ÆEmq“Ë[ä27´Ë}nm+]ÎF·º°¥.v+{Ýí¦V»Þ…lwÃKZð’7±ã=ogÍ«^¦·½˜e/|ûúÞùFV¾öÅk}óËXüò7®ûýoaý+`¶¸À€%0‚ËzàçUÁkƒ#LWS8«¾p[-¬aªf¸Ãhå0ˆ›úá‡UÄ&Fj‰SÌU³8¨+~qU],ãÆ¸ÆP¥1Žezã'UÇ>niƒLT ¹¤C>2O¬äŽ&¹É7e2”úä)»TÊV&h•³ŒR,s9 [þ²G½,f†¹Ì%3š÷yæ5TÿÍnÆg›ã,P8Ó¹žs¾ó?í¬gyæ¹Ïüä3 ßùçAçSІfg¡mOD3:‹~ô<-isFºÒð¤4¦ÇyéM·SÓžg§C­NP“º›£>õ9M­jm¦ºÕäd5¬¯ùêY‡SÖ¶¦f­smR^Çt×¾Þ&®ƒýL`›Ã>öLCZSe_ÙÙ$56´§™ìiËRÚÖ†fµ³Ils»™Ûþ¶½-ne†»ÜU$7ºeyîuóPÝîÎd»ãmTfÏ›Þ;¼7¾+ï}+Õßüì7À{¨ï;ÕÞïgÁ®:3<… øÞ.ñ F¼âVE8ƽq?k¼ã“9<).r­–Ü$ÿ?9ß.®r¯~¼åìd9Ì•ò™7Mæ6UÍs>2œóܬ/ÿy9}.ô9í¼èó":Òtô¥KéNwkУÞkª£zêVvÖ¹Ùô­× ê^_P×Ã.'°“Ac?{“Ì®öõ¤½íJb;ÜÑóö¹›HîvNÝó¾ ¼ó9{ÿ;‚ü.øÕ¾ðë!<âQsøÅ£GñŽÖ#KÈS>0¿|s,¯y¿d¾óÊá<èá7ùÑÿÛôã.=ê ¾ú:~¾õ¥=ì¡òúÙFö¶oJísïÜó^)»ÿý^|/ü”¿øT!>òMrüåGEùÎIó£ïèS$Ó¿þR¬¯ýŽd¿û5á>ÿø5òýñŸDüæ¿HùÓOô³Ÿ"ëHÜ/Rª¾þ"£?þÿýsDÿþç*÷€ò€þ׈¸˜€±€ø×€HX8Qòw\èr,õõ¢ïÇ"($È~&x‚)˜~+(‚-h~/ø18~3Ø5~7ˆ9Ø};8=¨}?è€Ax}C˜€EH}GH€I}K€Mè|OèQ¸|S¸Uˆ|WˆYX|[X](|_(aø{cø~eÈ{gÈ~i˜{k˜~mh{oh~q8{s8~u{w~yØz{Ø}}¸z¨}ˆzƒx}…hz‡H}‰8z‹”}zè|‘Øy“¸|•¨y—ˆ|™xy›X|HyŸ(|¡y£ø{¥èx§È{©¸x«˜{­ˆx¯h{±Xx³8{µ(x·{¹øw»Øz½Èw4u‚#HŒÆ2ŒÆX€É¨s̶Œj匟‚ŒÐè)½€‚ÓX'ƒQ#E×('up Õø ¥ÀÜØq‚*‚cŽs²êX'Dâ!ù ,#ÿH° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£ÇûpüÃg L $à$È—0cÊœI³¦Í›8sz´ˆ§Ïž@þii²hÃE- :y‰SÓ§œtJJµªÕ«X³jÊU@W†‰. €J֩٦Ŋ,xIÒ >ƒRþÔçܸxSjÝË·¯ß¿€S\:·° à 9 ÊûöOÝÇŽ^$éà%ÆréÞlØ®àÏ C‹Mš¢$»˜SËðV’Xžß­úðŸËçŽÍÜ9.gÎoK N¼¸ñ©p ÷ùÝy©>ñfN=¥È¡}7ßÎûñïàËÿo°­]àÞç&§»¸ëµi¯^}(ËÃßrfÍÿ>s¤ä(à€úURa-´FKvvRq"sµö'Þ ”a› ´ ‡u4`$–hâ‰Õµ™fõâfpµvÉZžÈ×Ùu@¨ãz…Ýv_†ú!(MA¯¼X؈(&©ä’Ltàað ĉŠsAÞÈ’”—,Âcp ´áa["´ aH6©æšlŠGå ä[ŒîÍ›‡%R:ÁaR¸á7P ùçdm&ªè¢£'Bž°VåsNØãA’|yAcê•Й›¥É訤–*•q"¤^{ïÁ&™©ÿ䉑¶ är8*t¨H•™êë¯À‚äh”yéÛƒ•:h8Û ´ê¦Ù©Çv<kíµØ>Ô‡Z…éyP*&÷G«ÅÕ™A]Ôñ^uÙšÖ]ƒôzÐ),Á%ˆ¨Ùæ«o°Ø=)Ò•Úä#]¹Ä+Æ*À5¸J¹ÕqI˜—éö!Bç nJøîëñÇŠn›é¹Àñ0A§]jgn祄‡AÇ€‡§}lûã»xI,Š(ðìs¹¨Ý òÐD·Ùï|C­dð Ö<(®ìÅI†S9'ÄUuÉu< G×]·\mÑd—}¢ÈTlaŽ<µ2J-³—Rtoç#ƒÎÎY”Ò{Sã+´Ù€NÞÑÜ!È[pÙA]8…Ð „TÜ‹÷Ö±à”WÚ‘×çA¶ÑWøÝø±´±j¤ÿmùé¨ F8é´5-|ëÎæ9»X+d¸ß™¼©÷î;VWöÁIÂÏGñ¸››J OÒóËE¯Y]Ãó±ˆÖa PÙöÚwϽ¼œ,ýûøäÛD—$èï½öê¿–Òb^­¿}úôs?\éyÉþü÷?Öÿü+Ÿ8“uÝ‹2bI Çâ¿ÿµ¤'ƒKDÜ'¾ð‚¬Ê Ž·+\HŽ4FB…è(ƒ(Lá^*8•€!ù ,+ü#P  ‚L8¨'A *D(`À€!ù ,¤!ù ,¤!ù ,¤!ù ,¤!ù ,¤!ù ,¤!ù ,¤!ù , ]…ÿH° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠDH€ 'S¢ɲ¥Ë—0cÊœI³¦Í—'oZä$€§Ïž yêJ´¨Ñ£H“*ÅèI@Ó§N£B…*t©ÁÿÐÊuëB­VÊK¶¬Ù³»‚ §àŸAoãÂ+7® ´xóêÝË7)W¸‚þ,¸0áÀ[¤Ë¸nãAbù,B pÑ >u0kÎÌy³æ>‰ûŠMº´é‡¸öùÓGPë×®cÃ^M;µ€ÖuXë®Í›5æ?|l[­#pêÞÈuÿYÔòíÓУKŸ>¶OÉ‚eß®½;÷í‹øXÿœÛ±y¸áWßuÖµVN—âËŸO_>'æÎ×RßÏ¿¿±Ùw |h`ðÅ&H"u$R߃.’Ý"K%ÒÖV\"‰†nèa‡J"Inÿ•hâ‰(6ÄÚ ~øá|^¦š‹-Öøáj‚µ”ˆ@@â#$|'Ð]ÅFã‘6^R{)6éä“Ò5WÇ"ñ!ù"ˆ—,²$n&‰d•+¾$ˆ €¸!†nðq—l¥æ¥—"–§”tÖi'Y5'_—óÁÇ'‡ñɘ§•onˆcKƒ$2ˆƒ 2À@âF`Ld¤ˆX"XeˆK Pé †*ªMƒL¹)ŸÄÕAß‹ZBVj—4Öÿw¥$aŽÄG"x$Í;÷ðÃ=ï ã†$’›4DzuÀAeˆ#¦–ã¨ÔVk-€+îY¥$Â4#  ›ªkH.bî¹H:$}@"ޝ¿öú+4uy‘à^M:笣Î9çó¬‡#ºzíÁ'çÉâ|‹d3Ï·Âȳͳà J.ˆÜBOÍT £*ˆêŠT0%Û“>'Ýë;¬!„o—ƒÀLÏ>’D³=é\Mp§Ÿm÷Ý¢2¼é"¥Ìÿã žÀÁÌ<®PÉ*ÝŸ:à+·ÜÂø+¢€Üܺb¼ËÏ=ú€O?äÓ«=À¸H›.s(Ì×L#Š0Ó°³9k§´=ãmûíN Mt)ô,Ê ¿ÐSx¸—8Ý‹ˆÒÌ3Î4ïÌ) *\HT/?™ ÐÉ)C#]Úå"0ÿ2 (}lÃŽ§ @7îðÇ¢Þz²Ž9 2³(Šg¹å«áÄ+à±CU|¢ÕäDR½wÄëœÓÊzå=ðYªï¦& iÔn]€–œäGÂNGw›úƒ0桎i¤ƒÍH ‡˜S˜ãa‰X CÉ`8¬M$Õÿµ—9°¥ b]øZã"Q0ƒó Ç/ª3vÜâT[  ·ÈžÐïC‹èÅ9àqŽ^l€‚‰‘8‹¹‚ðˆ#<ÜqÀ|]¦nA„ñ+{製҇çøñŽN‹tâžñ¶˜}0f1ƒžìvÖÅJZò,(Ô}0Sª¢ãc{Í @Ä·iTƒ¨¤Æ+¢w i±¤G,ÙQÖ½6Ôn gË’(×8ÆñòXüß%‡IL¥|KñáD~¡W°HZa£Æ4‡5XÓš «ÒG™­Å’{)ã‡8 Á…`pC‹àÙl\#ÂóðœI& •Nä‰òi±â„>õ©ÿ¸ ¹’%‰0¯_‰£rxν˜ˆL¹(‹xŒ§D'ê‘cª#ZS + ms$}H„! q¼ãâê¤C䜅jçœ(JÓšbdž1ã¸lÈÑ$eM$ê)“†êâÜÆ¥K„ˆzz$ˆÚô©P¥ˆEsZ%ÄM³§`ÒâKÁUˆ¸É@ ëmÜÕ²š5|©YÄ>ÃV¸Ð†’€O2ÁV¹ª‰,hVêÀ‡Îøu3}ÅLn\ѳö©ZiV_ù€Æ:¶±xlfàP¯¼b†²ŸÎu6+ñdæ²Á¹åRªYÍ5Á´¨=­j­IÚNÍô°°µi`XSÚkÿÚöš«%ò({™ëä•´Ö<ímm»Û5d¦°HYN"ÒɘAX湂8‘.ÛêFÕ9ÎÄcΗ‚‡»Û‹u’"Zm¥œè€gÙÀ®Ñºð-+W:ËYΪ·¾±/}÷[ßr’7¾0Þ‰\øÀvâÈÐ;øÁu"ƒàBøÂΰ†7Ìá{øÃ|)ˆGLâ›øÄ(N±ŠWÌâ»øÅ0ޱŒgLãÛøÆ8αŽwÌã³ÅÇ@f±‚¹ä"˜´®à…(,lä&ox ¿p^)˜ìä*;˜ žpF3˜á bÔa Vs€aÀ"pAÎàò–/$æ6W÷ÿ)À™µÜŒ4³ÙÍx>+™Í,Šgp9ÍyôYá,g47£Î̸³ MÑ=ŸÙÏÍc£'MSBÏùÐv¦´¦áéè>ÿYÒ›õ0-mhD+ZÔ¨&a§! èT»º„¤¦s¦_MkÜÁ@|f5¨kÍëÛ]ÚÔ½6ÐD@x:ÒÂNöÏ~=ke;›ZÄ6¶®ŸMíj1;ÑÕζ¢}ìVkûÛPºö©ÁMîþp{ÚåN·‰Ä­îvïçÜŸv·¼©ÃîyÛ›4ðFö½÷=šzóûßhÉ··Np³ø»à_ŠÀwð†+åà¸N.ñŠâÏøK(®ñŽËã¹G8.ò’‡ä&ÿOyEH®ò–cå.9CX.óš?æ6Ïù@h®óžç>¯9σt ÝåC?ºÎ®ô”'½é5g:ÔEþô©»\êVïxÕ³žr¬sÝâ[ÿºÈ½.öˆ‡½ì';Ú~öµ[\ín'xÛãq¸Óßs¿{Âí®w{ç½ïç;àÝý÷Áó[ð†OwáooÄ3Ü‹¼»/ùlG¾òé¦<æŸ}ù̓[óžOvçCŸmГ¾×£?ý³M¯zZ§¾õÉf=ìSýúÙ÷Zö¶uísOkÜóžÒ»ÿ}ª}/üE¿ø¡&>òó|üåSZùÎosó£¿hèSßÊÓ¿~ž­¯ý&g¿ûmæ>ÿøƒüýñ[YüæïqùÓßdô³_ÇëÝ/ÿÇ¿þ=¦?þi|ÿýëXÿþcý€7€èbx€4f€ ¸b Ø€1Æ€ˆb8.&Xb˜+†bø(æ"Øa!X‚%F‚(¨a'¸‚ ¦‚.xa-ƒƒ4è`3xƒfƒ:h`9؃ƃ@`?8„WVjÍf„äWlÝÆpJXdBø„±U„R`QX…†E…X_W¸…e¥…^[]†O†dhXcx†4e†jXVi؆ņpøTo8‡ï$‡vHSu˜‡Ã„‡|(Q{ø‡•䇂øNXˆ[Dˆˆ8L‡¸ˆ$ÿ¤ˆŽXI‰ð‰”¸E“x‰¶c‰šHB™Ø‰vÉ ?Ÿ8Š>#Цh;¥˜ŠƒŠ¬h7«øŠÖ⊲è3±X‹£B‹¸ˆ0·¸‹ ¢‹¾h-½ŒuŒÄ8*ÃxŒObŒÊ*ÉØŒ)ÂŒÐX'Ï8&"Öø$Õ˜þܘ"ÛøïÆ„è&ŽVˆ„ØfŽðåêøáØŽÐÁŽðÈï8¥!ö8õ˜¢üûø{áYYxA)¹f¡¹ ‘c‘‰y‘Va‘ipè8nÙ‡äo!IQY’GÁ‘('¹’D¡’.ùp“Ä“4y-ÿy“5a“:I9Ù“2Á“@y?9”7’úf”\T”JÉBÙ”7“P)?O9•/Á”VùU™•,•\É[ù•''•by7aY–á•hyg¹–¡–nIm—/G–tÙŠH9pw™0p¹—1—~9}˜3——NH˜Öf—ˆ)*€¹˜1˜Žy™ ™”I“y™a™š)™Ù™Á™šù™ 9¢y™¤Yš…&k騚Ëh˜®™`Š›'’š¥yš”i› ‰›‘©›É›Žé›š œ‹)œ—Iœˆiœ”‰œ„©œ‘ɜ霎 ~)‹I{iˆ‰w©„Étéÿ žq)ž~Ižniž{‰žk©žwÉžhéžt Ÿe)ŸqIŸbiŸn‰Ÿ_©ŸkÉŸ\éŸh  Y) eI Vi b‰ S© _É Pé \ ¡M)¡YI¡Ji¡V‰¡F©¡SÉ¡Cé¡P ¢@)¢MI¢=i¢J‰¢:©¢FÉ¢7é¢C £4)£@I£1é›2pœ³*1°)*?%@¤C*;:Ÿ=Ú$;*"vqkñ£í¤wB¥'$p[š¥%Ф÷¹¤)Ò¤p=Ð;€¦?"F¥ñi¥vò£:°PvZ°7 IúŸbŠ";ŠPÏph‡ z@2à¦õÿ §M²"6¥;À·ð–z©ÁP?ðžú2Ч=À§ðûPªûð½;PžŽZ'“:ªûàþpª©ÚœÊš y";ú£¡Ê ¤*«´ªª¬*m$ù$; ñª¿:«¨š¶ª¤¸J'@q&½º¬ÁºŒšŸ† fPòPÊ«Ìú Îz«˜ÖšP²ªÖʾj®Ùº­ýÙ­P n âJ®¢Š­ÿ€®Ï¦Ñ % Õz­òÚ¬Úšžöú$ €¬4€¤:°° ¬Íj«ôú ê' «°jª¨ªû¦Æ–f‘æ­NB¤±;z9 V`P0³Dvà}—}¶®¹ê©Pš;±)ÀpE«"´[ D°žvhìŠ"? ¥N*5³0Ë,.—k°jö Á`MO¦h[Ÿš³hùîCž@ Ìð  A›M²§aZ sklzk‘z—kT&!ù ,]‚ÿH° A‚‚*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠT˜p¤IŠƒNª\ɲ¥Ë—0cʜɱ›RêÌÉs§Ï>)5 ÂIbÂA*ÖT²¨Ó§P£JJµê@uúÔÙʵkÖ¯ZµâCpPŸ°`Ó¢­sóO"¢V zK·+œ¤qóêÝË·¯ß—I ²[NáÆëÖùƒ7©âº‰·þ…#@”'˘/kΜYÛ¿ C‹M4>œ<]źµëÍš·"]glη7  Ì÷VO—8.¼8ñáÀájZº¹óçУg¬\TpNØ=¥ÆÎ]{öKžv ÿH'õqãè‘§æ½wpîÛµËO_Àš›ÒóëßÏß9mÛÂÍ'`jªm—šx9•Wà€ ÂÇž^¾Á\ƒš÷`f¨á†3 &ˆ(dG`kª&Ÿá±§ }N¸^_îy7Ÿk­-hÞ%r¨ãŽ<öHQ‹¤x%ö&Úx ‹Ø¤ €¹‰bàv9Z¡‹òý!™@uHBŸpUú(æ˜drøÇ`•…Hà%—Í1šx`ŠA­( ›x'‘ž„IUŒ"¦VM;ìÈ;ì#É‚lúYæ£F:Bœ+ììSÏ>ì¸Þ|K6¹ŠâÊ©¨JY •}]ɧ$·ìÿã?ëÌãÏ?íTf Ž’öê믽¡ âwçÔCŒ'ÄÔƒÎ%–H§@vr"Ê"¼ìóϬ³³ˆe|:* ºµ—Tsm;}Xv£·À¶ëî»&QŠb€’¸RO4i:³Ï+’¨šÝn¢>Y*/¢º¬öf$–‹ÄzŽ6¥“Í<òÔá/˜ðf¬ñÆÉÖ°žHòÊ>Ä´ˆ0þܲ¨³»ÕÉâ%§D343Kóʧݸ•Œ!ßâ0—•ò:óX¼'¯'­ôÒÉ;$p¢ÈÃŽ$]Öz°)9ê‚!óBO=`ƒM̶2rÂ.T®Êׇ+ãþ#€¹þ´³†¿É1m÷ÝL{œ&vÓ2ÿS;׸³O4z 8HmÐò¹æ÷5Þ¯j9óå^w—ðŒ¦ûŽ?ûÌó ϗ܇÷褻ët€©I" ;ô´#L:íXJ mM²†ž©YwË<ôôÞûØkwöS¾Õ1!ˆÔü3®¬œ3ÏïžÃ—.ýôê=ìv¢H²ˆ ’ôA §RbŸÈR‰Ïx‰+×l£¾ú¼0‹eôEMþ])×_0èðS¯ÿþÎÎçj˜ñ<ž7;&E`{Ú ‡O9¨U¿áÓ%AÁ ZPDuãŸ7¨ë©)IIÊž—f4>— ˆF¬a”|òס­À„0ŒO9HÃNJkO+éVÀÚ!P‡ œ’ðÿ h1‘AH³¡—!a}ðˆF…gꤸ™g…:3^q¸ÃÅ.bGOId¢Çø Q&<Äñ"‰ã Ú9É;×Izºã‰Ïì%BÒB¡QH2úñ2 öHH×le9h`!õ¸ûàB»¡ CIÄXÒ0dàùÉÉNšddèBaxÉR. k8PÀ2L’”•Œå× É¿ü–TÈ¥.wÉK]vIž ¦0=R2< ÇL&2—ÙË'p9 m¸ÐÌe*S™TH%hR¤A,›Þ\„ö$­IbA¦:×9›”ó›ðg<ç)-!Džøœg>ÿ²àÇ&ZØÂhä‘ìL¨BbGƒ|E=YP†Dt¡ͨF7ÊÑŽzô£ )éÖ10Ž "M©J{U‡6@K,\©Lgúœ6´a ¤©Nwºè@.ãDÇÓ¢µ4”ÉiLÊÔ¦Ê$©8ªS§JÕª$u’UͪV‹òÊ¥nõ«`•Èa:˰šõ¬é*Z×ÊVŠŒõ•Dm«\çzµÒõ®w+YãŠ×¾®•7®ôª_ËS^Ã8%¬bà bTÃÔx‚KYªŠ¢Ó˜F5ž!ØÊz£%xÈP kLƒÔÆgWËÓˆ`´¥À,j¥ÑPÖÿÚV¤¡…­igÛÙÛú®…­lS[Ûß7£¹%ínSÛÛã:׆Á%ípiûÜê*4¹¥=-s­Ë]uF7¶Ú¥nwÇÛIì.WÍ%¯zíöÝéw½ð¥a ¢Üð¦7¾øÝ˜tÃûÞüúwz¢@vyûßkp¿³í¯¼´x» ŽðèL\ [¸Áy0z/Ìá¤QX¼q»|ÞûŠøÄùù°‚QÌb‘ؾ-Žñ£T,ã÷èŶ±ŽuDãû¸?8†ð‡¬ŸùÈÎ ò†‘Ìäæ¹ÉPö‹’Må*«äÉVÎ2U¦¬å.[Ë^óL¸,æ2ÌfN³JȬæ6³ÿÍnŽsGØ,ç:ÎvÎ3Eè¬ç>[Ï~ôBø,èB7ІN4¡Íh‚ ºÑ^4¤ýèIëYÒ–.t¥3]gLsÚÏ›þ´›=-ê<‡ºÔi&5ªå|êU‹YÕ®ns«cÝeXÓÚ̳¾µ•m­ë0çº×Pæ5°µüëa#YØÆ®r±“=dd3»ÉË~öŽ-í#G»Ú5¦6¶|ím·XÛÞÖq·Ã}bp“[Æã>w‡Í­n§»Ýf7¼Eüîy3XÞöæp½ó]`|ó[Âûþw~ý-ð¼àð%8Âÿ{ð…“WáÇoÃ#Î]ˆS|½¿øs-®ññf¼ãÆå8È­ûñ‘ßVä&ÿwnÉS¾Z”³ü·+ye].sÛÆ¼æŠ¥9Î?{óûUç>§lσ~W °C?º\®ô¾&½éke:Ôéúô©›UêVokÕ³þU¬s­[ÿzV½.ö°†½ìS%;Ú·zöµ3Uín¯jÛã^T¸ÓÝ©s¿»Ní®÷£æ½ï2å;àyú÷Á§Tð†§iáRÄ3~¥‹|G/y‘F¾ò¥<æ?zùÍ/TóžçhçCÏNГ>££?ý0M¯z…¦¾õžd=ì×ùúÙRö¶físOFÜ󾓻ÿ=}/ü?¿ø6$>òÇxüåsPùÎ_bó£Ï?èS¿†Ó¿>õ¬¯ý f¿û¥ã>ÿø÷÷ýñãMüæŸ^ùÓÏ4ô³ŸtëÒÜ/ÿ»Å¿þ£?þ—vÿý¿KÿþÇ1ý€À€˜1x€½b€ è. ؀€ø+8d"()˜>‚8cà•`xxVb#¨Rx‚â*è#)Ø‚‚0¸#/8ƒü!ƒ6¸!5˜ƒùƒ<ˆ!;øƒÐáƒB¸AX„ÍA„H(G¸„£¡„NøM… …TXSx…}a…Z(YØ…zÁ…`ø_8†V!†fÈe˜†S†l˜kø†Pá†rXqX‡EA‡x(w¸‡2¡‡~ø}ˆ/ˆ„Hƒxˆ,aˆŠ‰ÿ؈'Áˆè8‰"!‰–¸•˜‰‰œh›ø‰ቢ¡XŠAЍè§¸Š¡Š®¸­‹‹´ˆ³x‹a‹ºX¹Ø‹ Á‹À(¿8Œ !ŒÆøŘŒŒÌÈËøŒáŒÒxÑ(ÔXqϘÚ8ÜÈŒÞøÂÅ_äX€%cç,ᘌãøíhŒï¨ñ8ŒóXõŒ÷(ùØ‹ûøŒý¨‹ÿÈŒy‹™ŒI‹iŒ ‹ 9Œ éŠ Œ¹ŠÙ‹‰Š©‹YŠy‹)ŠI‹!ù‰#‹%ɉ'éŠ)™‰+¹Š-i‰/‰Š19‰3YŠ5Þ ‰7)Š9Ùˆ;ù‰=©ˆ?ɉAyˆC™‰EIˆGi‰IˆK9‰Mé‡O ‰Q¹‡SÙˆU‰‡W©ˆYY‡[yˆ])‡_Iˆaù†cˆeɆgé‡i™†k¹‡mi†o‰‡q9†sY‡u †w)‡yÙ…{ù†}©…Ɇy…ƒ™†…I…‡i†‰…‹9†*ÆWëX& †‘9™’R™]x™˜é˜c)\‚š"ZõE 3cš½" ÑP Ôp %Úe’! Î Ä`;TF›¢qUŒ’é›:òŸ!:6!ù ,^…ÿH° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç þ I²¤É“(Sª\ɲ¥Ë—0ütQPŸ˜/ûÔ°³'O<|åƒÇ'ΣH“*]Ê´)Ó?ul%ˆG@ÕªD}µ)HàÈ:>wJ6hU}º:MŽ·pß¶;÷íÚ»xóêÝË矺ãÂLW ‘}Ë¥ËX ྠ5¹2åË–+CÞ̹³çÏzÿ,ªãVe…˜)sr+Ù«ÀÔ™aS¦Ù—´(NžpëÎÍ{·nk@ N¼¸ñŒ#xR^pùrÏ9¦\€ïÞØ/¯Îާï̇ÿ/^@¢ãèÓ«_ZTnòã¡+÷DyMë5ÏÅë'~ùT½;Ýß~û °†Zì%¨à‚ ²ÇH¸9wš|-'@ÔMFà€Ö¹g dnõÇBû‘AVƒ(¦¨âŠÁ!ˆ{œ(wTÉ ä}—߈õ'ây£x´ Ô%úÕ‡ ‹L6éä‚]ÁqS„š1# 31VØ¡kzXÞAzÈÝ^!Þ(€5ò¸CÏ<î¸sÌ%ò-g"OÖiçžÁ1ŒµãÏ>þ¸£åwÓéçs ýÈ—2 ôÏ£ìÐóò%¡Kâ©é¦œ*¥@Š"I:û#Ê1û¨#‰[Êœ†#þÿâ>Ê mÒmâ|ñâϤgÒ*OrâÍÙé±È&»Ri¹‰§?ÒTͬ‡jàŽàTŠâÑy£ôIÂË?é€s 3ଧ’ʶëî»}jÝrp»-1ÀÊw¡«]^*€4ÔL05· ”ë‡}•)Ð%ã3:ô°*ç‰ðVlñÅ1+]Œô´3P¤ã(u;žVÏ>(£| mŠî®(ƒ¼ò«¥\#캘b¬óÎïÊKåªþ̳Í<о6âijU÷%&6MÐÁcê塜”2í>ÿSÎ?þÐŒ{ˆÉóØdsªq£Ä¸S<ĬœòM(Y>'.=õä·yÐuÿ»(òd¿Öjø-—¸ÇnÙŒ7΢Ï".2ˆhƒ#<¼.7ˆ[#)Íã6ä€3ÎèúŠ âw8ºÒK/°.ë`œ·Ž×n{zg‡]YPóìa}$ãüapÜ¡ÎíNÙæ¯«6Ï|æ‹ß.ýôÃA®{A­ùà«^òØc‡º&l<}¦•o~÷¯R¯þúéÉçõ6v¼¡ñ9Ÿß{ñáVœ&™3û  S¢4%mh?IΆԿñ@m3”1`ÿp“>Zð‚HÙ'v3AÞX+8ß¡`v°Ã«· o-ðkM2…Áº°$Ù‰Ej´*ˆÈ3QSÌþì‡.Pá…@ bHÿú0*ìP‡<|Kp¨@"„ \0wÈAÔ OÈ¢‹ð.rQ‹`üa„HÆ2R¤7‰â°Æ.ºÑ‹`\#OþЕ™€ mÔ"÷ØÆ=ä&}Ió$Óƒ8/2,4£"¹®ÔP2ç!ddø&Ƀ$G’˜H&ш¢D2ò“ 4 Ó‡² ¤4Ê]ÆXÊPºò•·+—`IËZ–ÍDàBº€K[úò—írƒÚà†6Àa T¦2—i'"¤˜¤‘¡˜IÍjª<æ[ÀBkzó›ì)zÒ<МèLçp° 8pÓQS§<ç ¸t³-ô̧>›ÂÿÎm‚…'Éܧ@ºÁœé i¦IІ:´$uÌNªÒ͇Zô¢ÁZÊvbô£ HD·i€†ô¤(UˆF9ªÐ€¦ô¥!©”ê@Q—Âô¦]©[ºÐŠâô§¨”„ÁŒ[¸Ó¦@Mj>#ZgœãåøE<•JUzŠ@d8E9ÆŽrTƒ£U «É½Àµ¯~›4ßïî÷¿êÁosL`õô·ÀN€Ë›àoæÀŽ0q,á ƒÂÎ0d(¬áïñS8,â/Ä&NqLH¬â»Å.Ž1JX,ã—Æ6ÎqGh¬ãkÇ>2Ex,ä"GÈFNòBˆ¬ä&#ÉN޲@˜,e)C¹ÊM¦2–›|å-YË^6r—Ãd0“9Èc>³ŽÍ¬f§¹ÿÍ5f3œküæ9»XÎvvqóœb<ó9Å{þ³ˆý,hºÐ&4¢;|èE[XÑŽ¶p£#aHS:“¾t‚-­égºÓæ4¨ üéQïWÔ¦Þo©S]_T³º¾«~5{]-köÆºÖæ¥5®Í{ë]oW×¾Þn¯ƒM]`›ºÃ>6r­lä&»ÙÁe6´ƒûìiÓVÚÖ¦mµ³ÍZls›µÛþög½-îφ»Ü–%7º-{îuVÝî.l»ã­WxÓ[¯ó¾·Xí­o±æ»ßTå7À©úïUàjÁ~S„3ü¦ xJ.ñ”F¼â!¥8ÆCzñcTãÇhÇCþP“ü¡#ÿ?9AM®r‚¦¼åûd9Ì÷ùò™ÓSæ6§gÍs®Nœó\;ÿ98}.tp½èÖ$:Ò­yô¥3SéNgfÓ£Î×Ð’—êòŽ«f‹ë_¬ÿê^÷åÔÃNK°“–c?»+Í®vW¦½íŸd;Ü?ùö¹+RîvǬÖS«Þ¼ÝêïõûOë.ø â½ðA$<â]xøÅ»PñŽ¿`ã#AÈS>€“¿|-¯ùõe¾óëã<è§÷ùÑOOô¦·]éSo;Ô³¾q«}ã\/{²Å¾öÐÝûm½‹ûÞ¾÷;£=ð1öûá_LøÆ¯Xñ“/ä3ß]Ë~»œ/ýdE¿úÈ¢>ö;uýíËW÷\÷þÿ7»/~ˆ=„w„D8b6x„•'ƒ}§„4„NxbLH_Q¨>PX…Ha„XxW¸…1¡…^]†/6…]G†:3†h¸`¸†+¡†nˆm‡3–„t8{fx‡°g‡z˜{ˆµ{M؇;‡‚øsXˆAˆˆÈ‡¸ˆÿ¡ˆŽ˜‰‰”h“x‰a‰š8™Ø‰Á‰ Ÿ8Š!ЦØ¥˜Š Ь¨«øŠ ኲx±X‹A‹¸H·¸‹¡‹¾(½ŒŒ¾8ŒÁhŒ»ˆŒ¾¨Œ¸ÈŒ»èŒµ¸(²Hµh¯ˆ²¨¬È¯è©ެ(ަHŽ©hŽ£ˆŽ¦¨Ž ÈŽ£èŽ (šHh—ˆš¨”È—è‘”(ŽH‘h‹ˆŽ¨ˆÈ‹è…‘ˆ(‘‚H‘…h‘}ˆ‘‚¨‘zÈ‘}è‘w’z(’tH’wh’qˆ’t¨’nÈ’qè’k“n(“hH“kÒh“dˆ“h¨“aÈ“dè“^”a(”[H”^h”Xˆ”[¨”UÈ”Xè”Q•U(•NH•Qh•Jˆ•N¨•GÈ•Jè•D–G(–AH–Dh–>8_Ĉ'j¹ƒlÙ–vò–8]åpWr9—~…V——üWdXwI…~©"dYË¥VúS˜ü•oÁ Ù°Yèà øÄ˜MBAq Ó  Îp 7h™è ÿdmQQš rp WGåNÿªÙ p›q¹Y›N¼ù$¾é› !ù ,¤!ù ,¤!ù ,¤!ù ,qxÿ(0Áƒ”¡0! *H”(à¡A„cœ@‚àF †„qãŒ0HžÈx0# È”ᆀÂJS¨Ÿ¡ô|¼8Ð` ò°)Ujm !q•ÁÊ7Hà[™ c¡Ä"=~‰`. X…UÍÕ<©#A[ iÜ@Öœ(u0hûV€ŽãÎ=j7 Þp”è¡ì_“‚ ã„‚!U(roÀ8Q÷.Bû^†‘ÙmÈmrØüšnãÇ)˜, ²_˜»¸ ÇÞ”k‚¾aá°W€XÞ ¨SR –2@Ò}@X CóßÌ•[_Μ¹¼­O.o]À‚÷ó'(QÂó^Ïépƒ€ö@KÖGÐID5äàƒM¦‚*T4P@!ù ,¤!ù ,d‡ÿH€ƒ*Lh Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“.\©²åJ”0c ô$àRÍ›6sâÜ)³§ÏŸ@ƒ J´¨Q”:“îTÊ”çѧ JuªÕªUÿ@Ýʵ«×¯`Êzµ,V³¥ <ËvìÇ>‚àÊKwî\·xóêÝË·ïS¸SíÖ,øáˆ÷ñ Q«À?}þü4¹2åË–ÿ,r̸³çÏ C»KYPf̨[vhšôéפP=è’íÛ¸së^¤V´ïßÀƒ ç¸xñ"Ýœ.%_®¼ùrI¥û,’”ÜvuÝ·¯KZZ’(4Ãÿ/^<øÍ½‡«_Ͼ}_Aƒj àÄÉ“ýûøóã_4uÐ"OßÍDÞ€áÙ7ß%éù×%–Gàƒž\‡ܹgá…feÿy „ Þ·Ù"u0"ˆˆò¡l} T"‚$â¢.TaT¬È‘(Û À™†@)äM6Hƒ8ˆ ‚”È'ßyrãO‡E&Ùd²=vÑ‚n!±)æ˜db(]—Hˆ$R"šuÉÉbƒLyR"„@–ˆ$H²ÈeSýH‘iª™}ØY梌6ê—‹-ŠbÞL~ò‘’L:¹”ôÕÔf„t̨ÀˆÒI'€%8Ñ‚ãTi|‹Xÿºæ—ª:jë­¸rõ®Yß/ÄãáC" à&ƒ4Eô¡Žà%+a–=ˆ¨¤’*Ê%-*Šc¡qÂŒ5ÕhsM5Õðò¢€åªîºìRÙ&’‰R:é¨cM)ÌÎ$Ê’MÚDl)Üê|*râéOÓŽzªÂ¢šÊ ±šlM®¨³Î:Ôl³;ÖÈÚ¬„µ¶+òÈ$GÌ!œ—H“Î/œð‚Î4þTì±pJòŠ:ìäœs/’Ìäì„>ñ ©Î#jÑ¢vIF„¦8Ð%«ÓŽÌÀ³Ž5=„nÈ%wíuׇõšl)鳨ĤsJÌúò«éC¯Ä-w”qj°O‚àAm'íìÿÃË4<Óðv‚J$ñÓKãL)¿8³6Ûò×”W^r‹šÁyÊ:¼xw /ë¸ÂöÌoN/1Ì£:3§Èü³Oˆ$Lª;yS-ª\³–£Ó¹Ây¼’HŽÇàm§­åÈ'_fØð N5—ðGM8·=ÕÛ3A}N:é Ã}çÙ}°Lˆü! ©T#ÑèG¶¥ È$É)êà, 3í\=þÇ|Ô¨üÿ$æzE`¨CÎІ:ˆQŸ‰‰¨EozˆÁê@A ƬKØò‰dö¦>oÐŽ}¦JWEš&3QCèàÜ3Ö¡pÜ@uãÑdrÀÚ08Ì›Ôç¨qŽrMÃõ™Õfÿ$s CEÈã0‡9Ê¡DðÕm>œÐJ‹bR'ï˜JÞU;ç Q˜Æ!‰0ü&6üYÌb³;Zç3Iôïx7Œ£;3@8 ä~’„$~‘õùjÙ2‘CJáŒg²®pÝ¥R8“‚{ÛÛù€Ñ‰¸`„„u+…Ü6)·nÉIs ¥(=“ÃêÉL‹àÅ6Dçº!þ¡ˆùâD\ f-kNòßI¨’ˆIVkTž(_‚Â.9ä6’@¦mfåÆDÀq”ÐŒ&Têhºˆ,Ó!žd⇠2RƒÒ…/ÅÙ @`î’»Ã&ŠÂ÷IJóðJ)« ÓÙÇ•°ÔÈ-‹£ÿË“¨F*§:'”V¥aŠ‘›±O3Ÿφ:´$Ô䈇´ÙAvÓYßì‰j(”¨DIËGî$¡ºä ’ŽJ’8LHÊÒ–n$l*B’IKšÍ+ås¦Úg.…¢šAbFq1!Ò"›àô¨Û©“K—ÊTdë8ÒL›Å Uñ¨ ‚|Ÿ‚i¨¤ŽrêCV™•¬Ì¹DiVÚÔ¶ºÕEÉdŽ\›sVúxÂO¨CØlsÖÉ­õa³ÕO P„øé@„:‘% .ÿì©e"#?±È­˜ÍìC0'™Xm&5˜1Í’êį,y–Fš%e/#X¥–«Fù"Ä|1†ÿj–uèCnõ*ZRv–Ò¬p‡«–*õÇM.r‘»Ûäz hq®n§ÛÜêN—$ŠTf;E© uUªõí®ŠC!ìBw¸èM/eÅ»ÞöÒ²1î/{ñÂÖôÚ÷¾Ê³”Tö‡ßþúWy] ¸@ü÷ÀYÈà…0¬a N°„'|«´a †ÃƒÉ PøÃ R ð`/@øÁ±ŠWl¡ÀÁÄ(0‡YLãûfÄppŒ#lãû˜19>1Nü üøÈHÞJ ˆá!o8Å!A’§Lå ° A²“×*{ùË>I‰u¬e?DÊ`N³š;ÂdùÿÄP^³œç¬17YÈfŽ2÷Ìç´ùÍ[î³ -;ëøÉ3& t@èF{ùÏC悸€bG[Z͆^C)^Hé5\úÓþÈÀ f˜º]ðôCNêVÓXÌ\¸DêŽÁ bäÙÕ¸®ñˆ'-ëc,ã¶Nt®‡â€\ðÖê‚Mìfƒx×5™u­oíìjØØÈV6­™mínûÚ½Þ6µâírgÛÉ–6·‚€˜ûÝM·º©­xÛ»¥èÖö´…-ÜàÞ§¼—MorüàÐÌ÷¼ùð†Csàâf¸Ã'.G…\âÏx!¾o{ü†øÇG@ޝ›ä(ÿ§\È;žò–{Íäôv¹Ì×µò“Ïü渂9ÆqÎs2Õ<æ=º˜t.ô¢ûüØé¾¸Ñ—>$¢3ýéúùΡNuà8½êXŽÔ³Îõà\½ë`ÿÌÖÃNöÎ|½ìhÏËØÓÎv·œ½ípïÊÚ‚æ¸Û(o¿»Þ‡2÷½û=(yÿ»àaÒwP@ƒO#‘¿¼æ+RùÍ{"…¯ÀçGO³#€ô¨@ßOŸúÑŸÝÐn½æW/ûÏ¿~ı¯ýã Ýkþö¾¿|æƒ?ù¯¤Ùñ?üå;>ðÎw|ó£?xèSðÓ¿¾ß­¯}¿žÝüÿÛ=ð‚ð{éú^·0óoÿi wëݯ÷ìÓ¿íÜ¿Ûí¯´Ÿ×û‡~ñç €p÷w´·€l—v…·ÿd—w¹gYy( a—w*àH€J÷2 ‚](uü·‚L§‚.¸t-ƒEƒ4(t3xƒ=gƒ:Ès9؃7ǃ@8s?8„.'„FØrE˜„(‡„LHrKø„ç„RèqQX…G…XHqW¸…§…^Øp]††dpcx†÷f†jhoiØ†ïÆ†phno8‡Þ&‡vØmu˜‡Õ†‡|èl{ø‡Ä懂8lXˆ¸Fˆˆèj‡¸ˆ ÿ¦ˆŽøi‰–‰”èh“x‰„f‰š8h™Ø‰}Ɖ ÈgŸ8Št&Ц8g¥˜Šk†Š¬¨f«øŠ`抲øe±X‹UF‹¸He·¸‹I¦‹¾ˆd½Œ?f|ÄHl}gǘkÀ¸Œ6–ŒÎèjÍ,VxuGŽfz؈‰$(rzÖÙ%Èn(p‚âHhÖ˜Ž–wèÈŽ}ð8ho÷Žó¸g…g÷ŠäŽìVûHgÃ6é_yýe y_ Ùöʼn^9‘Ã%‘©Y™‘™…‘éVù‘må‘"ÉT!Y’KE’(‰oßÈr+ée*ù’u’2éP1Y“ðÿD“8 O7¹“Ѥ“>M=”¢”D)JCy”×’6§”,–”NiCF•7•T @Sy•×.©•ÅÆ”@ç•f•bi9YY–ÈC–hù5g¹–”£–nY2m—]—t)2}€wy_ÆØ{i_™·y‘\Ù”%P~ƒ)\s™˜ëb—Œy+‹ù˜9W˜a)™˜™–é(Ž™™‹‚™œ¹(›ù™c♢9&¡YšCBš¨Ùt”9u«9“`隯)p­9›m¥š¶™!§™›‚›¼i!»ù›íá›ÂÉÁYœêAœÈ9ǹœÁ¡œÎiuµ9›ÔÉ“Óy?iÚ)”ÙÙEÉàÿ‰”ß9žK™mhžsÔœêéÐÙž}Ážð¹ï9Ÿz!Ÿö‰õ™ŸnWžü™<ûùŸaŸ Z ^A *wâ¹ •£  ¡O¡jz¡Ea¡Êw Ú¡#á :¢@!¢&Ú%š¢=¢,Jxú¢“yGé)£¹²¢6zƘ£‚£<ºxþù££BZ&ÿglE*&>š¤á¢LêKú¤á¤RºQZ¥A¥XŠWº¥¡¥^Z]¦¦d*cz¦a¦júiÚ¦¥¤pÊo:§À¦vªzDš§Ì)§|úœ{ú§ÒI£å(¨É¨†*xj§uÿ:§‹:§ § §‘Ú¦“Ú¦•ª¦—ª¦™z¦›z¦J¦ŸJ¦¡¦£¦¥ê¥§ê¥©º¥«º¥­Š¥¯Š¥±Z¥³Z¥µ*¥·*¥¹ú¤»ú¤½Ê¤¿Ê¤Áš¤Ãš¤ÅZ¤ÇZ¤É*¤Ægp‰  ­¡ñ¬Ô*«‡|×úË*¤Íú£Ýú£ßÊ£áʣ㚣嚣çj£éj£ë*£í*£ïú¢ñú¢óÊ¢õÊ¢÷𢷭±ŽþjvåI$ Ëy‚ë ¸°î‰¨{ŸßI°Ëûj¢;z±ô ±;o'f«Ÿ;²`qÀV™&+èæ 5º²y1b¢æ²Ë¦a ÿ³ô)£¨Ck¼ ²8pPÁ@ ¼ÐCv³A«Gc”–c&6cë7à%`µX{µZ›µ\»µ^Ûµ`ûµb¶d;¶f[¶X[µ¸‡¶gÛ¶lû¶n·p;·r[·t{·v›·x»·zÛ·|û·~¸€;¸‚[¸„›µÑQ‹bq& Œ’;¹”[¹–{¹˜›¹š»¹œÛ¹žû¹ º¢;º¤[º¦{º¨›ºª»º¬Ûº®ûº°»«ë]&µ»´îáºË¼»»¾Û»Àû»Â¼Ä;¼Æ[¼È{¼Ê›¼Ì»¼ÎÛ¼Ðû¼Ò½Ô;½Ö[½Ø{½Ú›½Ü»½*¡!ù ,a‡ÿH° @*Lh°¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²$Á…(Mª\ÙГN/c„ɲ¦Í›8sêÜɳ§Ï.ƒ ú³¨Ñ£H“*]Ê´©Ó›D‘ªU©Oqþù3(«×¯`ÊK¶ã ¨ev½8HŸµiãÊK·nÏ®‚À•¸WР>Ñ È+1ª[ÀeEå䉱ãÆ?–$Ø®å˘3kvˆ6²gÉž=¹Ô+5êçÓ’cM{éå%N°cËž[€¤Í¸sëÞíõ N­_ N|øpN¢HÛJœ¶sà£Ójl¼¸uãëðÞν»w•}n_ÿ_ýRkI}þÆ.O¾yô›„Ó&¸h/ç¡ìó7Ðú»ÿÿÈÙ"ü­×^y¶m…lú±SN‰èõ"ˆ$2H}Rý%bMwàÙ (âˆ$â6Hâ•'š'ù—^6XÜk:ù&P€äȆ)õÍG&!Þ!†6¼¯cÂþHv:Qôì=+ ‹¸Æ$ÚñŽFi`­îõ˜®P#ˆÀ± ‡Nœ>ÔÁ†üS ºT<–på„Б$&)‰D€ñ!¢â$m³ÉI¦mˆEÄ£(Gy”%æW‹X”m´cÅê¬hE‹âÀàC1âBqkäðS$Ԁ̀$¥0‡™=>=¶ä@¹%˜¸D—Ž\±lWGdòCº•CÌnzs$¦Ä&ݪX>lòm–8£ nyý‰SE— ã7çIÏŽ4°@¶Â¦A\òÿÎëš_‰’”JP‚‰¡¬§B:IL1}-R%zñ‡ÆÐ« ‹Ø%¿‚(Èå£] cs£j2ô¤ó¬’H}éÌ¡ˆ†U—°Ð "ôROˆÂ¦  ŠhrÓ’…Xœ¤d¢†Š¨¢&j“X‰ŠQÊToâå6D¥¤T‹JÉE܆+T êT¥zÔIZu“èË_¢>À¬€ùÃ!ךVVò¨©p]èY6¤Ö:ÔxÀ«^ózÖ³ÞuCn%Ø_ÍJؾö°ÿÉ‹IãÊØQ´±¬d'KÙÊZö²˜Í¬f7ËÙÎzö³  ­hGKÚÒšö´¨M­jë¹Õºöµ=9lgKÛÚÿÚö¶a‘-nwËÛÞúö·Ñ-p‡KÜâ÷¶'¸Áq—{Ú.t ÌîiÁ4ƒ®t·KZWã»ï ¸KÞÌ."¿èE0x!€5”÷½™•aŸ~ñ öº¾ø­¬$‚Ñ õ²7¿žì~yA_û* ÀŽë~û»Þ;®.p{€[¸ž öïIHpá3Âõ°àá“2à ˆJ0^»‰ 6pBdðâ/ÅÿJ`ãW/Æ"€|LdÎá¸ÈHö×pà$;ÙdG~²”K¶ä&OùʦŠ2–·\§*sùËKÒ2˜ÇL"/“ùÌ3š×ì3³ùÿÍ»Q3œç¼7ÓùΖ‘3ž÷<;óùÏdÑ3  ?úÐN4¢­C3úÑEQ4¤'ÍGSúÒ7Q³p1Íi–XºÓ ‰¤CMj|ºÔ¨Öˆš7à†T»z#fnñ«gm‘QÓúÖ13qÍë\óWývDb-ìb DÍ0v±½Œe [ÌÍvv¯½Œ€H{Ú¿NñA®m‡˜É#¶v¸Mk5ïšÜ³¦¶µÑîlç˜Ý¸®r…áÝn¿›Þíö¶Œñýj[ó›Ó§þ÷¥ý-pJ¼à&8Â}ð…/ZáGtÃ#NhˆS|пøŸ-®q>S[O¸» ²éšÚ&ÿgøÈUœrFg¼åpÖ4ÈaŽñõJÜ™9Í7¾r‚Èzç{vóÏ~g9¯›èx~9ÒÇÌñ¥3Ýæß¶²Ó“Þó©{êû¶zÑ«®õ­ë;È]ŸsÓÃ>e¥“ýÉc?»“Í®v$§½íEf;Ü}üö¹÷Xîv¯qÝóþb¼óÝÄ{ÿ{‰ý.ø¾ð&<â|øÅ;XñŽGpã#`ÈS>¿“¿<~-¯ù÷f¾óåå<è¹ûùÑoWô¦néSÏ\Ô³þ¸«½q]/{âÆ¾öÃ¥=î{ûÝûV÷¾çm[àÿ¶Ã?¾m¯|Ú&¿ù³e>ô_ûüé»VúÖWmõ³ŸZìsÿ´Ûÿ¾ÿi½/~Ò†¿ü£•7úC_õ¬ŸôXq´ßßz® $ ô_®›“ØÛ¿ÿú8€hoxz(uh{ÿ·€¹—€8{ ¿ø€xÅE~(`ØÈg (|8‚Î'‚&‚˜‚$øuÈ‚µu~0a(8ƒ°%ƒ6ˆR˜ƒ'…ƒ<¸P;øƒ åƒBHOAX„óD„HèMG¸„ݤ„N8LM…Â…T8JSx…¢d…ZxGYØ…vÄ…`c58†%†f¨@_˜†jX‚lxYkø†?æ†rHYqX‡ƒ†xhde¸‡vH‡~ØXwˆ(£‡„x2ƒxˆTˆŠÈT‰ÿ؈åbˆ‰}8‰M%‰–ˆ*˜‰Yƈœh„•ø‰@艢Ȅ¡XŠ ¸‚¨x‰§¸Š¦¨Š®Øƒ­‹RHŠ´¸…³x‹Xh‹º†¹Ø‹^È‹ÀxD›8Œi&ŒÆ˜@ŘŒß‰ÌèËøŒÜáŒÒØÑXq†ŒØh6׸¸Aިݎ™ŽäXg¿xŽecŽêˆãØŽuÁŽðhï8r!öØgé˜æ‚ü˜õøcá9ûX§BYh¹t¢™‘O‘Ùy‘La‘Ùh Ù‘%‘ y9’$©&) %™’?!’,Ù+ù’•†’2ÙŒY“6ÿ ‹8ù7¹“ÓH“>É1”5á’Déi 8oG™$F¹”&1”NYM•¢ \T©’@™•—•\ij[ù•ñØ“bIaY–÷H–h©:¹–m¦–n g—é‚ H—ÙØ–x™v¹—?©—~ùp˜5—„Y‘ƒy˜ˆ ˜ŠÙ•‰Ù˜i˜é‘}9™å(™–y’•™™y†™œÙ’ù™‘晢9“›Yšiɘ¨Y—7w—«iªùš yš² ›ÀV›qᕨ9•»š¸™i¤ù›+¡›¥É›Åé›Â‰”±™œ‘I›Ì¹˜·ùœ³ÙšÒY˜ËYšIØ Ú¶ˆéœÞ‰Æÿ)šÄIžÁžQžŸ9žë‰œèéìÉ™ê)Ÿçùžªæžö kõ™Ÿ1Ÿ™Ÿÿ‰Ÿü‰j™þi û9 q “Y  *  Z ™ J¡ ¡Ãf5€¡3 ‹CÆ¡:Q¡9¡#*‚¢9A¢Š)¢+z¡(z>ú¢¡¢‡if9 £Ày8Z•v©”;ªœÑù£6áf° ¤*A£„if,`¤GÊu$PrL –›ynQ8V]U:œXw_à~Y:uÀ ü% ® ]_Z] ·Ð ®àVgЦí,6§0@§vZ§xz§zš§|º§~Ú§€ú§‚¨„:¨†Z¨ˆz¨Šš¨Œ¦º¨ŽÚ¨ú¨’©”:©–Z©˜z©šš©œº©žÚ©…ztáÖ¥pª¨šªªºª¬Úª®úª°«²:«´Z«¶z«¸š«ºº«¼Ú«¾ú«À¬Â:¬ÄZ¬Æj«o궬À¬ÎÚ¬Ðú¬Ò­Ô:­ÖZ­Øz­Úš­Üº­ÞÚ­àú­â®ä:®æZ®èz®êš®ìº®îÚ®ðú®ò¯ô:¯öZ¯àZ!ù ,]ƒÿHp §‚/!\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠ©ñ I'Iª¤øG@Ë—.c®œI³¦Í›8sêÜɳ§Æ– äógL˜HíC´¨Ó§P£JJµê¤X•¾:0«×˜M­$*HТ?ƒÈ]«V-Ú?aÅÊK·®Ý»;±ÝÛ–í¢A}úÈš6íÐD‚+&:¨ð®t$hò’å˘/qZ¯çÏ C‹ÆËI!ÊÓ'S <¸¨OË>z'£ÖL»ti–o{¾4h‘ïß¾{ ÿK|‘éÑÈ“+_Î<¤^I’‚N¸§Ahqoλ÷·‰ÿ¯k<|õóÓIjξ½û÷ìy£ŸÿwÂ:éÓ÷ÍÛõcØVI¦_zÔ­ß&¨ T’\’˜YÕA˜žY($˜@f¡o.ý›kb—È€ç%²ˆ|,¨âŠ,¶¸Q–¥5â_3ª7ß ëá'‰òØcêE’I&ápÜeøt.6éä“M òXƒpVZuÀGpÕU(À…üÆ#’œü˜\åQ—ˆ–p¬±†–|P׊PÖiçÍ)Ic3&È-ÁÜÛ }Ö—c~RG‹.Z%’å$Ix¢‘‘Ó(€4E#À+q'ˆx–jê©vQi%v 㪞 ÿ•ž—`ŠYß"žäš+'’é[™@YUšÄÕ!J9I³¥ps¦ˆê³ÐF«“P{Ú›`àܲÈ+ñ‘è¡;¦WG)äœ#Ð9çÜR‡t>vàH:f„©pÆ´1)+ݨÒöëï¿#-yI•fñÁ 8Á¬!É¿€#ʺÃÑj¯tI"Š(¥\,ÊÀé-¬@ÂREloõ äÉ--{+·ìòËQË'`ž”óJ’ðáŠË ®ÕõÁI0Â]´(°Wž»DN5ï_}ˆò)tœ\¸%qK’ óÖ\»,0Ág­M–u‚BÉǧo|]Ç+àHSm}–9{]¡}xrÌ@û#ñ‰¥{UPw­K`ì€˘(ne¢ó9ðÊ]ÚêöIÀáÓ_o¼”㥧n !`s9½ÜíKy[„‰®U‡:à¡….„¡y8ä,Úð†ŸIãèÓ>9YæB×™aÝÿ¢CÄ.iâDu|c¢&ª0C8Œ¢wC! U°K é õÓ˜¡ÐzOÓøj8Å2š±(:Þ˜0WC1Ò.€M“ÊÓܨµ3ÚñŽ9!Š·¨¤âÄVb<Ñ CF•ë­°;‚(L"i~áñ‘TIKRԟ '‘Ã1‹iëï`'QúQ–&ÓQåBÅKeƒV©ÊV^‘Œ¥,?"¥âA:­deƒ,Ó .’¹¥0sy™èG6 ƒŒTÒwÜ8S!ÐÄM3gIÍj²DJ(Ä¥43c@s=p gKƳÍfv³ LA¢\vZóðDˆ°ðCOÄËž éà ñyÿςԳ…îtOgâIP‚´ M¨BÊІ:ô¡¨D'JÑŠZô¢ͨF7ÊÑŽzô£ ©HGJÒ’šô¤(M©JWÊÒ–ºô¥0©LgJÓšÚô¦8Í©NwÊÓžúÔTDÈAºðÓ¢b4{§ø…~Á .ÀÁ¨P•(–Ê ^üeQͪC ` ªVǪЩþ¢ª¼ «ZÊÕ€tX«\«iV´Îõ®Ôl«@ÞJ†¸âõ¯w¬+XKX;êõ«i…kaEÁ¦•±½áaùê×ÈZöv޽¬fË7ÙÄöu³ íZfCKÚ­u6¬Ÿ-­jý5ÚÕºVZ§UìkgkªÖÿÒö¶wŠmjqËÛ&Ù¶·Àe‘n+Üâ"è·ÆMî{†«Üæ¶¹Î.r˜+ÝꊺÖÍ®]¨«ÝîÒ»Þ ïT¸+ÞòF¼æM/OÈ«Þöê½îïLØ+ßúª¾öͯGè«ßþr¿þ pEø+àOÀN0C¬à#Áv0ƒ#aS8Á¾°‚-¬ag¸Ãæ0ˆûûáûWÄ&¶o‰Sœ_³8¾+~±|],cõƸÆí¥1ŽË{ã›WÇ>önƒ^ 9»C>²v¬dé&¹ÉÕe2”›ûä);WÊV6n•³œ\,s¸[þrp½,f܆¹Ì¼%3šg{æ5ÓVÿÍn^m›ãìZ8Ó™´s¾sií¬çÍæ¹Ï å3 -ûçA_VІfl¡ YD3š°‹~ta-i¼FºÒ¥4¦åzéMÏUÓž&k§C­VP“:«£>µVM­j£¦ºÕPe5¬}úêYÿTÖ¶Þi­sÍS\ó§»þuN}-ìš»Ø6%6²ezìeÏTÙÎ~i³£ ShS›¥Ó¾vK­­í”f»Û*å6¸MúíqŸTÜæi¹ÓMRt³¤ë~wHÝ-ïŽÆ»Þ¥7¾5zï}oTßþ¾h¿ŽQ€œ¢?xE ®ðˆ&¼áR¥ê`!®Õ‡Sü¡ ¿8C-®q†f¼ã å8Èúñ‘Tä&ÿ'hÉSþN”³ü+y^ BY™[âµyN]®sYƼçä9Ð!ùó¡ßQèF,Γnlš{–¸LßöÒ£Îl§£êT÷Ô³.m«Ë–ë+-:Ø%ëõÝŽ¥b?û‘®v¦½íæc;ÜÏ÷ö¹ÛNîvÇìÖóNR¼ó=quÿ{×ü.xÑî½ð%<âaøÅ»LñŽoYã#ÿ/ÈSžµ‡¿ôÝóüé·GúÖoNõ³Ïìs_9Ûÿ~ÿr¼/þÑ„¿ü¢!?úAsþõFýîÇKûãøÓ¿.ó¿?]쯹ä¿ÿbÁXÿ7€T!€(˜€Q€ ø ø€Ná€èX=A¸¸:¡ˆ‚7‚$X#x‚4a‚*¸)Ø‚*Á‚08/8ƒ"!ƒ65˜ƒƒ<Ø;øƒáƒB¨AX„A„HxG¸„¡„NHM……TSx…a…ZèYØ… Á…`¸_8†!†fHe˜††lV™÷†¥â†l¸†oH‡ih‡lˆ‡f¨‡iȇcè‡fˆ`(ˆcHˆ]hˆ`ˆˆZ¨ˆ]ÿȈWèˆZ‰T(‰WH‰Qh‰Tˆ‰N¨‰QȉKè‰NŠH(ŠKHŠEhŠHˆŠB¨ŠEÈŠ?èŠB‹<(‹?H‹9h‹<ˆ‹6¨‹9È‹3è‹6Œ0(Œ3HŒ-hŒ0ˆŒ*¨Œ-ÈŒ'èŒ*$('H!h$ˆ¨!ÈèŽ(ŽHŽhŽˆŽ¨ŽÈŽèŽ (H h ˆ¨ Èè(Hýgˆú§ýÇ÷çú‘ô'‘÷G‘ñg‘ô‡‘î§‘ñÇ‘ëç‘î’è'’ëG’åg’臒⧒åÇ’ß—YB%‡¨²½€X4)-·pVÁP 9-¯À § ^ð“¤g”ž‡3)!ù ,%ÿH° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£ÇŒ‚>B )²¤É“(Sª\ɲ¥Ë—0cjL$€æ¢A7sâÄ)³§ÏŸ@ƒ JTâŸA$a.êÓN—D}JÕ©Õ¢X³jÝʵ«WLB•J6ªÙ²§.Œ:háÑ·ƒŽöô‡®Ýº_óêÝË·¯_„‹ÑKXPaÂGÆ]ü'¡ »’œ"´Û‡±e¸p àó·³çÏ CwŒú§.æË–é4Mõé·†´+ÐtÜ»¸Y›Ö,º·ïßÀ{¾Íz®nÃÂLž»¹îä²Y$À:Á³kßÎý§$IŒ·ÿ޽èmîØ«wŽ~6^ƒ˜›†O¿íq¦j»ëßÏ¿?Æá…‡@ñ•FtÉw—k †uA‰<&k ´FÇ=…vèa‡¤‰—Ôuu·š‰Ø¥X™ní @â¡W†”}hã8jWXxóTÅ!¸\ŒGqbä%N-E‚ak=CP…Òq²aŽXf©%W!¶veRuPWÚ‰¦Ñ$Ê8èpŽè¼R¦µø"|ÆÍ˜`[æ©çž@ WÇ%áÄ›žÀWWeÊMG$o¢ $ÉŠ­98Ÿ“¶5Ð1Q#•´YÉç§ †êQ—\yšµÝ%cª¶ýyqÿäIñ‡‡æ¸Ø%R§ad‰*ì°ÄB4g X’‡ ©¨]#Ô¬¤ªMw¨A’I’©Åvë-±á•–vãP£)8ÁÔqÞwÈ  ^cdpÑE„¹brr¾Wš\ü¢Ø¤ß,p¨ÃU†]4 \›Gµ+Ð% ²a6e“+ÆVjTMÂh©0SŽA· lòÉ[f |ÜZži}d'ÏÕÁ 1hÊŒ@x$VSͺðQ6j´ 0ÊL7í_Áq%2H„‹¬áеƒ8,•‚•qFÆ×dÔkÛ¡NuLgrƒ`G®Ý¶•9-÷ÜÜ…{(n}Œ –ªÙÔD3ÞSk&x†í¢¾p#¥¸ ‹S—(ÝGî™\bRVÞ’ZCcuº]µ4U¾‹’—nú_£³'³¬œsž/Iƹ&{ƒžnûíY'»mZºû쟣çTi@fØñˆõñ8îÌ7Ó|Ň[¼Ê@òaiM-ÅÇÛo}òÜo6^s ”íù ¯~úηï¾Lë«ß÷ø7%²ˆ'ù™Ïþù}·Ü„ÜŠßþØ÷¾~óKÏN’r–‚|§o—ÄT“˜’Õf ): 7n½Š"«H@!ù ,+ü#P  ‚L8¨'A *D(`À€!ù ,¤!ù ,¤!ù ,¤!ù ,¤!ù ,¤!ù ,¤!ù ,¤;pyenv-pyenv-485090e/libexec/000077500000000000000000000000001517431316200157105ustar00rootroot00000000000000pyenv-pyenv-485090e/libexec/pyenv000077500000000000000000000064151517431316200170050ustar00rootroot00000000000000#!/usr/bin/env bash set -e if [ "$1" = "--debug" ]; then export PYENV_DEBUG=1 shift fi if [ -n "$PYENV_DEBUG" ]; then # https://wiki-dev.bash-hackers.org/scripting/debuggingtips#making_xtrace_more_useful export PS4='+(${BASH_SOURCE}:${LINENO}): ${FUNCNAME[0]:+${FUNCNAME[0]}(): }' set -x fi abort() { { if [ "$#" -eq 0 ]; then cat - else echo "pyenv: $*" fi } >&2 exit 1 } if enable -f "${BASH_SOURCE%/*}"/../libexec/pyenv-realpath.dylib realpath 2>/dev/null; then abs_dirname() { local path path="$(realpath "$1")" echo "${path%/*}" } else [ -z "$PYENV_NATIVE_EXT" ] || abort "failed to load \`realpath' builtin" READLINK=$(type -P readlink) [ -n "$READLINK" ] || abort "cannot find readlink - are you missing GNU coreutils?" resolve_link() { $READLINK "$1" } abs_dirname() { local path="$1" # Use a subshell to avoid changing the current path ( while [ -n "$path" ]; do cd_path="${path%/*}" if [[ "$cd_path" != "$path" ]]; then cd "$cd_path" fi name="${path##*/}" path="$(resolve_link "$name" || true)" done echo "$PWD" ) } fi if [ -z "${PYENV_ROOT}" ]; then PYENV_ROOT="${HOME}/.pyenv" else PYENV_ROOT="${PYENV_ROOT%/}" fi export PYENV_ROOT if [ -z "${PYENV_DIR}" ]; then PYENV_DIR="$PWD" fi if [ ! -d "$PYENV_DIR" ] || [ ! -e "$PYENV_DIR" ]; then abort "cannot change working directory to \`$PYENV_DIR'" fi PYENV_DIR=$(cd "$PYENV_DIR" && echo "$PWD") export PYENV_DIR shopt -s nullglob _PYENV_INSTALL_PREFIX="$(abs_dirname "$0")" _PYENV_INSTALL_PREFIX="${_PYENV_INSTALL_PREFIX%/*}" export _PYENV_INSTALL_PREFIX for plugin_bin in "${_PYENV_INSTALL_PREFIX}"/plugins/*/bin; do PATH="${plugin_bin}:${PATH}" done # PYENV_ROOT can be set to anything, so it may happen to be equal to the base path above, # resulting in duplicate PATH entries if [ "${_PYENV_INSTALL_PREFIX}" != "$PYENV_ROOT" ]; then for plugin_bin in "${PYENV_ROOT}"/plugins/*/bin; do PATH="${plugin_bin}:${PATH}" done fi export PATH="${_PYENV_INSTALL_PREFIX}/libexec:${PATH}" PYENV_HOOK_PATH="${PYENV_HOOK_PATH}:${PYENV_ROOT}/pyenv.d" if [ "${_PYENV_INSTALL_PREFIX}" != "$PYENV_ROOT" ]; then # Add pyenv's own `pyenv.d` unless pyenv was cloned to PYENV_ROOT PYENV_HOOK_PATH="${PYENV_HOOK_PATH}:${_PYENV_INSTALL_PREFIX}/pyenv.d" fi PYENV_HOOK_PATH="${PYENV_HOOK_PATH}:/usr/etc/pyenv.d:/usr/local/etc/pyenv.d:/etc/pyenv.d:/usr/lib/pyenv/hooks" for plugin_hook in "${PYENV_ROOT}/plugins/"*/etc/pyenv.d; do PYENV_HOOK_PATH="${PYENV_HOOK_PATH}:${plugin_hook}" done PYENV_HOOK_PATH="${PYENV_HOOK_PATH#:}" export PYENV_HOOK_PATH shopt -u nullglob command="$1" case "$command" in "" ) { pyenv---version pyenv-help } | abort ;; -v | --version ) exec pyenv---version ;; -h | --help ) exec pyenv-help ;; * ) command_path="$(command -v "pyenv-$command" || true)" if [ -z "$command_path" ]; then if [ "$command" == "shell" ]; then abort "shell integration not enabled. Run \`pyenv init' for instructions." else abort "no such command \`$command'" fi fi shift 1 if [ "$1" = --help ]; then if [[ "$command" == "sh-"* ]]; then echo "pyenv help \"$command\"" else exec pyenv-help "$command" fi else exec "$command_path" "$@" fi ;; esac pyenv-pyenv-485090e/libexec/pyenv---version000077500000000000000000000011711517431316200206140ustar00rootroot00000000000000#!/usr/bin/env bash # Summary: Display the version of pyenv # # Displays the version number of this pyenv release, including the # current revision from git, if available. # # The format of the git revision is: # -- # where `num_commits` is the number of commits since `version` was # tagged. set -e [ -n "$PYENV_DEBUG" ] && set -x version="2.6.28" git_revision="" if cd "${BASH_SOURCE%/*}" 2>/dev/null && git remote -v 2>/dev/null | grep -q pyenv; then git_revision="$(git describe --tags HEAD 2>/dev/null || true)" git_revision="${git_revision#v}" fi echo "pyenv ${git_revision:-$version}" pyenv-pyenv-485090e/libexec/pyenv-commands000077500000000000000000000015641517431316200206040ustar00rootroot00000000000000#!/usr/bin/env bash # Summary: List all available pyenv commands # Usage: pyenv commands [--sh|--no-sh] set -e [[ -n $PYENV_DEBUG ]] && set -x # Provide pyenv completions if [[ $1 = "--complete" ]]; then echo --sh echo --no-sh exit fi if [[ $1 = "--sh" ]]; then sh=1 shift elif [[ $1 = "--no-sh" ]]; then nosh=1 shift fi IFS=: paths=($PATH) shopt -s nullglob { if [[ -n $sh ]]; then for path in "${paths[@]}"; do for command in "${path}"/pyenv-sh-*; do echo "${command##*/pyenv-sh-}" done done else for path in "${paths[@]}"; do for command in "${path}"/pyenv-*; do command="${command##*/pyenv-}" if [[ -n $nosh ]]; then if [[ ${command:0:3} != "sh-" ]]; then echo "$command" fi else echo "${command##sh-}" fi done done fi } | sort -u pyenv-pyenv-485090e/libexec/pyenv-completions000077500000000000000000000010621517431316200213300ustar00rootroot00000000000000#!/usr/bin/env bash # Usage: pyenv completions [arg1 arg2...] set -e [ -n "$PYENV_DEBUG" ] && set -x COMMAND="$1" if [ -z "$COMMAND" ]; then pyenv-help --usage completions >&2 exit 1 fi # Provide pyenv completions if [ "$COMMAND" = "--complete" ]; then exec pyenv-commands fi COMMAND_PATH="$(command -v "pyenv-$COMMAND" || command -v "pyenv-sh-$COMMAND")" # --help is provided automatically echo --help if grep -iE "^([#%]|--|//) provide pyenv completions" "$COMMAND_PATH" >/dev/null; then shift exec "$COMMAND_PATH" --complete "$@" fi pyenv-pyenv-485090e/libexec/pyenv-exec000077500000000000000000000030241517431316200177200ustar00rootroot00000000000000#!/usr/bin/env bash # # Summary: Run an executable with the selected Python version # # Usage: pyenv exec [arg1 arg2...] # # Runs an executable by first preparing PATH so that the selected Python # version's `bin' directory is at the front. # # For example, if the currently selected Python version is 2.7.6: # pyenv exec pip install -r requirements.txt # # is equivalent to: # PATH="$PYENV_ROOT/versions/2.7.6/bin:$PATH" pip install -r requirements.txt set -e [ -n "$PYENV_DEBUG" ] && set -x # Provide pyenv completions if [ "$1" = "--complete" ]; then exec pyenv-shims --short fi PYENV_VERSION="$(pyenv-version-name -f)" PYENV_COMMAND="$1" if [ -z "$PYENV_COMMAND" ]; then pyenv-help --usage exec >&2 exit 1 fi if [[ -n $_PYENV_SHIM_PATH ]]; then PROGRAM="$(echo "$PYENV_COMMAND" | tr a-z- A-Z_ | sed 's/[^A-Z0-9_]/_/g')" NR_PYENV_SHIM_PATHS_PROGRAM="_PYENV_SHIM_PATHS_${PROGRAM}" export -- "$NR_PYENV_SHIM_PATHS_PROGRAM=$_PYENV_SHIM_PATH${!NR_PYENV_SHIM_PATHS_PROGRAM:+:${!NR_PYENV_SHIM_PATHS_PROGRAM}}" unset PROGRAM NR_PYENV_SHIM_PATHS_PROGRAM unset _PYENV_SHIM_PATH fi PYENV_COMMAND_PATH="$(pyenv-which "$PYENV_COMMAND")" PYENV_BIN_PATH="${PYENV_COMMAND_PATH%/*}" export PYENV_VERSION OLDIFS="$IFS" IFS=$'\n' scripts=(`pyenv-hooks exec`) IFS="$OLDIFS" for script in "${scripts[@]}"; do source "$script" done shift 1 if [ "${PYENV_BIN_PATH#${PYENV_ROOT}}" != "${PYENV_BIN_PATH}" ]; then # Only add to $PATH for non-system version. export PATH="${PYENV_BIN_PATH}:${PATH}" fi exec "$PYENV_COMMAND_PATH" "$@" pyenv-pyenv-485090e/libexec/pyenv-global000077500000000000000000000025051517431316200202370ustar00rootroot00000000000000#!/usr/bin/env bash # # Summary: Set or show the global Python version(s) # # Usage: pyenv global <..> # # Sets the global Python version(s). You can override the global version at # any time by setting a directory-specific version with `pyenv local' # or by setting the `PYENV_VERSION' environment variable. # # can be specified multiple times and should be a version # tag known to pyenv. The special version string `system' will use # your default system Python. Run `pyenv versions' for a list of # available Python versions. # # Example: To enable the python2.7 and python3.7 shims to find their # respective executables you could set both versions with: # # 'pyenv global 3.7.0 2.7.15' # set -e [ -n "$PYENV_DEBUG" ] && set -x # Provide pyenv completions if [ "$1" = "--complete" ]; then echo system exec pyenv-versions --bare fi versions=("$@") PYENV_VERSION_FILE="${PYENV_ROOT}/version" if [ -n "$versions" ]; then pyenv-version-file-write "$PYENV_VERSION_FILE" "${versions[@]}" else OLDIFS="$IFS" IFS=: versions=($( pyenv-version-file-read "$PYENV_VERSION_FILE" || pyenv-version-file-read "${PYENV_ROOT}/global" || pyenv-version-file-read "${PYENV_ROOT}/default" || echo system )) IFS="$OLDIFS" for version in "${versions[@]}"; do echo "$version" done fi pyenv-pyenv-485090e/libexec/pyenv-help000077500000000000000000000067531517431316200177400ustar00rootroot00000000000000#!/usr/bin/env bash # # Summary: Display help for a command # # Usage: pyenv help [--usage] COMMAND # # Parses and displays help contents from a command's source file. # # A command is considered documented if it starts with a comment block # that has a `Summary:' or `Usage:' section. Usage instructions can # span multiple lines as long as subsequent lines are indented. # The remainder of the comment block is displayed as extended # documentation. set -e [ -n "$PYENV_DEBUG" ] && set -x # Provide pyenv completions if [ "$1" = "--complete" ]; then echo --usage exec pyenv-commands fi command_path() { local command="$1" command -v pyenv-"$command" || command -v pyenv-sh-"$command" || true } extract_initial_comment_block() { LC_ALL= \ LC_CTYPE=C \ sed -ne " /^#/ !{ q } s/^#$/# / /^# / { s/^# // p } " } collect_documentation() { # `tail` prevents "broken pipe" errors due to `head` closing the pipe without reading everything # https://superuser.com/questions/554855/how-can-i-fix-a-broken-pipe-error/642932#642932 $(type -P gawk awk | tail -n +1 | head -n1) ' /^Summary:/ { summary = substr($0, 10) next } /^Usage:/ { reading_usage = 1 usage = usage "\n" $0 next } /^( *$| )/ && reading_usage { usage = usage "\n" $0 next } { reading_usage = 0 help = help "\n" $0 } function escape(str) { gsub(/[`\\$"]/, "\\\\&", str) return str } function trim(str) { sub(/^\n*/, "", str) sub(/\n*$/, "", str) return str } END { if (usage || summary) { print "summary=\"" escape(summary) "\"" print "usage=\"" escape(trim(usage)) "\"" print "help=\"" escape(trim(help)) "\"" } } ' } documentation_for() { local filename filename="$(command_path "$1")" if [ -n "$filename" ]; then extract_initial_comment_block < "$filename" | collect_documentation fi } print_summary() { local command="$1" local summary usage help eval "$(documentation_for "$command")" if [ -n "$summary" ]; then printf " %-9s %s\n" "$command" "$summary" fi } print_summaries() { for command; do print_summary "$command" done } print_help() { local command="$1" local summary usage help eval "$(documentation_for "$command")" [ -n "$help" ] || help="$summary" if [ -n "$usage" ] || [ -n "$summary" ]; then if [ -n "$usage" ]; then echo "$usage" else echo "Usage: pyenv ${command}" fi if [ -n "$help" ]; then echo echo "$help" echo fi else echo "Sorry, this command isn't documented yet." >&2 return 1 fi } print_usage() { local command="$1" local summary usage help eval "$(documentation_for "$command")" [ -z "$usage" ] || echo "$usage" } unset usage if [ "$1" = "--usage" ]; then usage="1" shift fi if [ -z "$1" ] || [ "$1" == "pyenv" ]; then echo "Usage: pyenv []" [ -z "$usage" ] || exit echo echo "Some useful pyenv commands are:" print_summaries $(exec pyenv-commands | sort -u) echo echo "See \`pyenv help ' for information on a specific command." echo "For full documentation, see: https://github.com/pyenv/pyenv#readme" else command="$1" if [ -n "$(command_path "$command")" ]; then if [ -n "$usage" ]; then print_usage "$command" else print_help "$command" fi else echo "pyenv: no such command \`$command'" >&2 exit 1 fi fi pyenv-pyenv-485090e/libexec/pyenv-hooks000077500000000000000000000023341517431316200201220ustar00rootroot00000000000000#!/usr/bin/env bash # Summary: List hook scripts for a given pyenv command # Usage: pyenv hooks set -e [ -n "$PYENV_DEBUG" ] && set -x # Provide pyenv completions if [ "$1" = "--complete" ]; then echo exec echo rehash echo version-name echo version-origin echo which exit fi PYENV_COMMAND="$1" if [ -z "$PYENV_COMMAND" ]; then pyenv-help --usage hooks >&2 exit 1 fi if ! enable -f "${BASH_SOURCE%/*}"/pyenv-realpath.dylib realpath 2>/dev/null; then if [ -n "$PYENV_NATIVE_EXT" ]; then echo "pyenv: failed to load \`realpath' builtin" >&2 exit 1 fi READLINK=$(type -P readlink) if [ -z "$READLINK" ]; then echo "pyenv: cannot find readlink - are you missing GNU coreutils?" >&2 exit 1 fi resolve_link() { $READLINK "$1" } realpath() { local path="$1" local name # Use a subshell to avoid changing the current path ( while [ -n "$path" ]; do name="${path##*/}" [ "$name" = "$path" ] || cd "${path%/*}" path="$(resolve_link "$name" || true)" done echo "${PWD}/$name" ) } fi IFS=: hook_paths=($PYENV_HOOK_PATH) shopt -s nullglob for path in "${hook_paths[@]}"; do for script in "$path/$PYENV_COMMAND"/*.bash; do realpath "$script" done done shopt -u nullglob pyenv-pyenv-485090e/libexec/pyenv-init000077500000000000000000000205471517431316200177500ustar00rootroot00000000000000#!/usr/bin/env bash # Summary: Configure the shell environment for pyenv # Usage: eval "$(pyenv init [-|--path] [--no-push-path] [--detect-shell] [--no-rehash] [])" set -e [ -n "$PYENV_DEBUG" ] && set -x # Provide pyenv completions if [ "$1" = "--complete" ]; then echo - echo --path echo --no-push-path echo --no-rehash echo --detect-shell echo bash echo fish echo ksh echo pwsh echo zsh exit fi mode="help" while [ "$#" -gt 0 ]; do case "$1" in -) mode="print" ;; --path) mode="path" ;; --detect-shell) mode="detect-shell" ;; --no-push-path) no_push_path=1 ;; --no-rehash) no_rehash=1 ;; *) shell="$1" ;; esac shift done # If shell is not provided, detect it. if [ -z "$shell" ]; then if shell=$(tr '\0' ' ' 2>/dev/null &2 } function init_dirs() { mkdir -p "${PYENV_ROOT}/"{shims,versions} } function print_path() { # if no_push_path is set, guard the PATH manipulation with a check on whether # the shim is already in the PATH. if [ -n "$no_push_path" ]; then case "$shell" in fish ) echo 'if not contains -- "'"${PYENV_ROOT}/shims"'" $PATH' print_path_prepend_shims echo 'end' ;; pwsh ) echo 'if ( $Env:PATH -notmatch "'"${PYENV_ROOT}/shims"'" ) {' print_path_prepend_shims echo '}' ;; * ) echo 'if [[ ":$PATH:" != *'\':"${PYENV_ROOT}"/shims:\''* ]]; then' print_path_prepend_shims echo 'fi' ;; esac else case "$shell" in fish ) echo 'while set pyenv_index (contains -i -- "'"${PYENV_ROOT}/shims"'" $PATH)' echo 'set -eg PATH[$pyenv_index]; end; set -e pyenv_index' print_path_prepend_shims ;; pwsh ) echo '$Env:PATH="$(($Env:PATH -split '"':'"' | where { -not ($_ -match '"'${PYENV_ROOT}/shims'"') }) -join '"':'"')"' print_path_prepend_shims ;; * ) # Some distros (notably Debian-based) set Bash's SSH_SOURCE_BASHRC compilation option # that makes it source `bashrc` under SSH even when not interactive. # This is inhibited by a guard in Debian's stock `bashrc` but some people remove it # in order to get proper environment for noninteractive remote commands # (SSH provides /etc/ssh/sshrc and ~/.ssh/rc for that but no-one seems to use them for some reason). # This has caused an infinite `bashrc` execution loop for those people in the below nested Bash invocation (#2367). # --norc negates this behavior of such a customized Bash. echo 'PATH="$(bash --norc -ec '\''IFS=:; paths=($PATH); ' echo 'for i in ${!paths[@]}; do ' echo 'if [[ ${paths[i]} == "'\'\'"${PYENV_ROOT}/shims"\'\''" ]]; then unset '\'\\\'\''paths[i]'\'\\\'\''; ' echo 'fi; done; ' echo 'echo "${paths[*]}"'\'')"' print_path_prepend_shims ;; esac fi } function print_path_prepend_shims() { case "$shell" in fish ) echo 'set -gx PATH '\'"${PYENV_ROOT}/shims"\'' $PATH' ;; pwsh ) echo '$Env:PATH="'"${PYENV_ROOT}"'/shims:$Env:PATH"' ;; * ) echo 'export PATH="'"${PYENV_ROOT}"'/shims:${PATH}"' ;; esac } function print_env() { case "$shell" in fish ) echo "set -gx PYENV_SHELL $shell" ;; pwsh ) echo '$Env:PYENV_SHELL="'"$shell"'"' ;; * ) echo "export PYENV_SHELL=$shell" ;; esac } function print_completion() { completion="${_PYENV_INSTALL_PREFIX}/completions/pyenv.${shell}" if [ -r "$completion" ]; then case "$shell" in pwsh ) echo "iex (gc $completion -Raw)" ;; * ) echo "source '$completion'" ;; esac fi } function print_rehash() { if [ -z "$no_rehash" ]; then case "$shell" in pwsh ) echo '& pyenv rehash' ;; * ) echo 'command pyenv rehash' ;; esac fi } function print_shell_function() { commands=(`pyenv-commands --sh`) case "$shell" in fish ) echo \ 'function pyenv set command $argv[1] set -e argv[1] switch "$command" case '"${commands[*]}"' source (pyenv "sh-$command" $argv|psub) case "*" command pyenv "$command" $argv end end' ;; pwsh ) cat < # # -k/--known Select from all known versions instead of installed # -b/--bypass (internal) On a resolution failure, do not print an error message # but rather print the argument unchanged # -f/--force (internal) Same as -b but also do not return a failure exit code set -e [ -n "$PYENV_DEBUG" ] && set -x while [[ $# -gt 0 ]] do case "$1" in -k|--known) FROM_KNOWN=1 shift ;; -b|--bypass) BYPASS=1 shift ;; -f|--force) FORCE=1 BYPASS=1 shift ;; *) break ;; esac done prefix=$1 exitcode=0 IFS=$'\n' if [[ -z $FROM_KNOWN ]]; then if [[ -d $PYENV_ROOT/versions/$prefix ]]; then echo "$prefix" exit $exitcode; fi DEFINITION_CANDIDATES=( $(pyenv-versions --bare --skip-envs) ) else DEFINITION_CANDIDATES=( $(python-build --definitions ) ) fi if printf '%s\n' "${DEFINITION_CANDIDATES[@]}" 2>/dev/null | grep -qxFe "$prefix"; then echo "$prefix" exit $exitcode; fi suffix="" if [[ $prefix =~ ^(.*[0-9])t$ ]]; then suffix="t" prefix="${BASH_REMATCH[1]}" fi # https://stackoverflow.com/questions/11856054/is-there-an-easy-way-to-pass-a-raw-string-to-grep/63483807#63483807 prefix_re="$(sed 's/[^\^]/[&]/g;s/[\^]/\\&/g' <<< "$prefix")" suffix_re="$(sed 's/[^\^]/[&]/g;s/[\^]/\\&/g' <<< "$suffix")" # FIXME: more reliable and readable would probably be to loop over them and transform in pure Bash DEFINITION_CANDIDATES=(\ $(printf '%s\n' "${DEFINITION_CANDIDATES[@]}" | \ grep -Ee "^$prefix_re[-.].*$suffix_re\$" || true)) DEFINITION_CANDIDATES=(\ $(printf '%s\n' "${DEFINITION_CANDIDATES[@]}" | \ sed -E -e '/-dev$/d' -e '/-src$/d' -e '/-latest$/d' -e '/(a|b|rc)[0-9]+$/d' \ $(if [[ -z $suffix ]]; then echo "-e /[0-9]t\$/d"; fi) )); # Compose a sorting key, followed by | and original value DEFINITION_CANDIDATES=(\ $(printf '%s\n' "${DEFINITION_CANDIDATES[@]}" | \ awk \ '{ if (match($0,"^[[:alnum:]]+-")) { print substr($0,0,RLENGTH-1) "." substr($0,RLENGTH+1) "..|" $0; } else { print $0 "...|" $0; } }')) DEFINITION_CANDIDATES=(\ $(printf '%s\n' "${DEFINITION_CANDIDATES[@]}" \ | sort -t. -k1,1r -k 2,2nr -k 3,3nr -k4,4nr \ | cut -f2 -d $'|' \ || true)) DEFINITION="${DEFINITION_CANDIDATES[0]}" if [[ -n "$DEFINITION" ]]; then echo "$DEFINITION" else if [[ -z $BYPASS ]]; then echo "pyenv: no $([[ -z $FROM_KNOWN ]] && echo installed || echo known) versions match the prefix \`$prefix'" >&2 else echo "$prefix" fi if [[ -z $FORCE ]]; then exitcode=1 fi fi exit $exitcode pyenv-pyenv-485090e/libexec/pyenv-local000077500000000000000000000036331517431316200200740ustar00rootroot00000000000000#!/usr/bin/env bash # # Summary: Set or show the local application-specific Python version(s) # # Usage: pyenv local [-f|--force] [ [...]] # pyenv local --unset # # -f/--force Do not verify that the versions being set exist # # Sets the local application-specific Python version(s) by writing the # version name to a file named `.python-version'. # # When you run a Python command, pyenv will look for a `.python-version' # file in the current directory and each parent directory. If no such # file is found in the tree, pyenv will use the global Python version # specified with `pyenv global'. A version specified with the # `PYENV_VERSION' environment variable takes precedence over local # and global versions. # # can be specified multiple times and should be a version # tag known to pyenv. The special version string `system' will use # your default system Python. Run `pyenv versions' for a list of # available Python versions. # # Example: To enable the python2.7 and python3.7 shims to find their # respective executables you could set both versions with: # # 'pyenv local 3.7.0 2.7.15' set -e [ -n "$PYENV_DEBUG" ] && set -x # Provide pyenv completions if [ "$1" = "--complete" ]; then echo --unset echo system exec pyenv-versions --bare fi while [[ $# -gt 0 ]] do case "$1" in -f|--force) FORCE=1 shift ;; *) break ;; esac done versions=("$@") if [ "$versions" = "--unset" ]; then rm -f .python-version elif [ -n "$versions" ]; then pyenv-version-file-write ${FORCE:+-f }.python-version "${versions[@]}" else if version_file="$(pyenv-version-file "$PWD")"; then IFS=: versions=($(pyenv-version-file-read "$version_file")) for version in "${versions[@]}"; do echo "$version" done else echo "pyenv: no local version configured for this directory" >&2 exit 1 fi fi pyenv-pyenv-485090e/libexec/pyenv-prefix000077500000000000000000000033751517431316200203020ustar00rootroot00000000000000#!/usr/bin/env bash # Summary: Display prefixes for Python versions # Usage: pyenv prefix [...] # # Displays the directories where the given Python versions are installed, # separated by colons. If no version is given, `pyenv prefix' displays the # locations of the currently selected versions. set -e [ -n "$PYENV_DEBUG" ] && set -x # Provide pyenv completions if [ "$1" = "--complete" ]; then echo system exec pyenv-versions --bare fi if [ -n "$1" ]; then OLDIFS="$IFS" { IFS=: export PYENV_VERSION="$*" } IFS="$OLDIFS" elif [ -z "$PYENV_VERSION" ]; then PYENV_VERSION="$(pyenv-version-name)" fi PYENV_PREFIX_PATHS=() OLDIFS="$IFS" { IFS=: for version in ${PYENV_VERSION}; do if [ "$version" = "system" ]; then if PYTHON_PATH="$(PYENV_VERSION="${version}" pyenv-which python --skip-advice 2>/dev/null)" || \ PYTHON_PATH="$(PYENV_VERSION="${version}" pyenv-which python3 --skip-advice 2>/dev/null)" || \ PYTHON_PATH="$(PYENV_VERSION="${version}" pyenv-which python2 --skip-advice 2>/dev/null)"; then shopt -s extglob # In some distros (Arch), Python can be found in sbin as well as bin PYENV_PREFIX_PATH="${PYTHON_PATH%/?(s)bin/*}" PYENV_PREFIX_PATH="${PYENV_PREFIX_PATH:-/}" else echo "pyenv: system version not found in PATH" >&2 exit 1 fi else version="$(pyenv-latest -f "$version")" PYENV_PREFIX_PATH="${PYENV_ROOT}/versions/${version}" fi if [ -d "$PYENV_PREFIX_PATH" ]; then PYENV_PREFIX_PATHS=("${PYENV_PREFIX_PATHS[@]}" "$PYENV_PREFIX_PATH") else echo "pyenv: version \`${version}' not installed" >&2 exit 1 fi done } IFS="$OLDIFS" OLDIFS="$IFS" { IFS=: echo "${PYENV_PREFIX_PATHS[*]}" } IFS="$OLDIFS" pyenv-pyenv-485090e/libexec/pyenv-rehash000077500000000000000000000130151517431316200202470ustar00rootroot00000000000000#!/usr/bin/env bash # Summary: Rehash pyenv shims (run this after installing executables) set -e [ -n "$PYENV_DEBUG" ] && set -x SHIM_PATH="${PYENV_ROOT}/shims" PROTOTYPE_SHIM_PATH="${SHIM_PATH}/.pyenv-shim" # Create the shims directory if it doesn't already exist. mkdir -p "$SHIM_PATH" declare last_acquire_error acquire_lock() { # Ensure only one instance of pyenv-rehash is running at a time by # setting the shell's `noclobber` option and attempting to write to # the prototype shim file. If the file already exists, print a warning # to stderr and exit with a non-zero status. local ret set -o noclobber last_acquire_error="$( { ( echo -n > "$PROTOTYPE_SHIM_PATH"; ) 2>&1 1>&3 3>&1-; } 3>&1)" || ret=1 set +o noclobber [ -z "${ret}" ] } remove_prototype_shim() { rm -f "$PROTOTYPE_SHIM_PATH" } release_lock() { remove_prototype_shim } if [ ! -w "$SHIM_PATH" ]; then echo "pyenv: cannot rehash: $SHIM_PATH isn't writable" >&2 exit 1 fi declare acquired tested_for_other_write_errors declare start=$SECONDS PYENV_REHASH_TIMEOUT=${PYENV_REHASH_TIMEOUT:-60} while (( SECONDS <= start + PYENV_REHASH_TIMEOUT )); do if acquire_lock; then acquired=1 # If we were able to obtain a lock, register a trap to clean up the # prototype shim when the process exits. trap release_lock EXIT break else #Landlock sandbox subsystem in the Linux kernel returns false information in access() as of 6.14.0, # making -w "$SHIM_PATH" not catch the fact that the shims dir is not writable in this case. #Bash doesn't provide access to errno to check for non-EEXIST error code in acquire_lock. #So check for writablity by trying to write to a different file, # in a way that taxes the usual use case as little as possible. if [[ -z $tested_for_other_write_errors ]]; then ( t="$(TMPDIR="$SHIM_PATH" mktemp)" && rm "$t" ) && tested_for_other_write_errors=1 || { echo "pyenv: cannot rehash: $SHIM_PATH isn't writable" >&2; break; } fi # POSIX sleep(1) doesn't provide subsecond precision, but many others do sleep 0.1 2>/dev/null || sleep 1 fi done if [ -z "${acquired}" ]; then if [[ -n $tested_for_other_write_errors ]]; then echo "pyenv: cannot rehash: couldn't acquire lock"\ "$PROTOTYPE_SHIM_PATH for $PYENV_REHASH_TIMEOUT seconds. Last error message:" >&2 echo "$last_acquire_error" >&2 fi exit 1 fi unset tested_for_other_write_errors # The prototype shim file is a script that re-execs itself, passing # its filename and any arguments to `pyenv exec`. This file is # hard-linked for every executable and then removed. The linking # technique is fast, uses less disk space than unique files, and also # serves as a locking mechanism. create_prototype_shim() { cat > "$PROTOTYPE_SHIM_PATH" </dev/null 2>&1; then rm -f "$SHIM_PATH"/* fi break done } # The basename of each argument passed to `make_shims` will be # registered for installation as a shim. In this way, plugins may call # `make_shims` with a glob to register many shims at once. make_shims() { local file shim for file; do shim="${file##*/}" register_shim "$shim" done } if ((${BASH_VERSINFO[0]} > 3)); then declare -A registered_shims # Registers the name of a shim to be generated. register_shim() { registered_shims["$1"]=1 } # Install all shims registered via `make_shims` or `register_shim` directly. install_registered_shims() { local shim file for shim in "${!registered_shims[@]}"; do file="${SHIM_PATH}/${shim}" [ -e "$file" ] || cp "$PROTOTYPE_SHIM_PATH" "$file" done } # Once the registered shims have been installed, we make a second pass # over the contents of the shims directory. Any file that is present # in the directory but has not been registered as a shim should be # removed. remove_stale_shims() { local shim for shim in "$SHIM_PATH"/*; do if [[ ! ${registered_shims["${shim##*/}"]} ]]; then rm -f "$shim" fi done } else # Same for bash < 4. registered_shims=" " register_shim() { registered_shims="${registered_shims}${1} " } install_registered_shims() { local shim file for shim in $registered_shims; do file="${SHIM_PATH}/${shim}" [ -e "$file" ] || cp "$PROTOTYPE_SHIM_PATH" "$file" done } remove_stale_shims() { local shim for shim in "$SHIM_PATH"/*; do if [[ "$registered_shims" != *" ${shim##*/} "* ]]; then rm -f "$shim" fi done } fi shopt -s nullglob # Create the prototype shim, then register shims for all known # executables. create_prototype_shim remove_outdated_shims # shellcheck disable=SC2046 make_shims $(pyenv-versions --executables) # Allow plugins to register shims. OLDIFS="$IFS" IFS=$'\n' scripts=(`pyenv-hooks rehash`) IFS="$OLDIFS" for script in "${scripts[@]}"; do source "$script" done install_registered_shims remove_stale_shims pyenv-pyenv-485090e/libexec/pyenv-root000077500000000000000000000001571517431316200177630ustar00rootroot00000000000000#!/usr/bin/env bash # Summary: Display the root directory where versions and shims are kept echo "$PYENV_ROOT" pyenv-pyenv-485090e/libexec/pyenv-sh-rehash000077500000000000000000000010711517431316200206560ustar00rootroot00000000000000#!/usr/bin/env bash set -e [ -n "$PYENV_DEBUG" ] && set -x # Provide pyenv completions if [ "$1" = "--complete" ]; then exec pyenv-rehash --complete fi shell="$(basename "${PYENV_SHELL:-$SHELL}")" # When pyenv shell integration is enabled, delegate to pyenv-rehash, # then tell the shell to empty its command lookup cache. case "$shell" in pwsh) echo "& (get-command pyenv -commandtype application) rehash" ;; *) echo "command pyenv rehash" esac case "$shell" in fish | pwsh ) # no executable cache ;; * ) echo "hash -r 2>/dev/null || true" ;; esac pyenv-pyenv-485090e/libexec/pyenv-sh-shell000077500000000000000000000065171517431316200205250ustar00rootroot00000000000000#!/usr/bin/env bash # # Summary: Set or show the shell-specific Python version # # Usage: pyenv shell ... # pyenv shell - # pyenv shell --unset # # Sets a shell-specific Python version by setting the `PYENV_VERSION' # environment variable in your shell. This version overrides local # application-specific versions and the global version. # # should be a string matching a Python version known to pyenv. # The special version string `system' will use your default system Python. # Run `pyenv versions' for a list of available Python versions. # # When `-` is passed instead of the version string, the previously set # version will be restored. With `--unset`, the `PYENV_VERSION` # environment variable gets unset, restoring the environment to the # state before the first `pyenv shell` call. set -e [ -n "$PYENV_DEBUG" ] && set -x # Provide pyenv completions if [ "$1" = "--complete" ]; then echo --unset echo system exec pyenv-versions --bare fi versions=("$@") shell="$(basename "${PYENV_SHELL:-$SHELL}")" if [ -z "$versions" ]; then if [ -z "$PYENV_VERSION" ]; then echo "pyenv: no shell-specific version configured" >&2 exit 1 else echo 'echo "$PYENV_VERSION"' exit fi fi if [ "$versions" = "--unset" ]; then case "$shell" in fish ) echo 'set -gu PYENV_VERSION_OLD "$PYENV_VERSION"' echo "set -e PYENV_VERSION" ;; pwsh ) echo '$Env:PYENV_VERSION, $Env:PYENV_VERSION_OLD = $null, $Env:PYENV_VERSION' ;; * ) echo 'PYENV_VERSION_OLD="${PYENV_VERSION-}"' echo "unset PYENV_VERSION" ;; esac exit fi if [ "$versions" = "-" ]; then case "$shell" in fish ) cat <&2 false end EOS ;; pwsh ) cat <&2 false fi EOS ;; esac exit fi # Make sure the specified version is installed. if pyenv-prefix "${versions[@]}" >/dev/null; then OLDIFS="$IFS" IFS=: version="${versions[*]}" IFS="$OLDIFS" if [ "$version" != "$PYENV_VERSION" ]; then case "$shell" in fish ) echo 'set -gu PYENV_VERSION_OLD "$PYENV_VERSION"' echo "set -gx PYENV_VERSION \"$version\"" ;; pwsh ) echo '$Env:PYENV_VERSION, $Env:PYENV_VERSION_OLD = "'"${version}"'", $Env:PYENV_VERSION' ;; * ) echo 'PYENV_VERSION_OLD="${PYENV_VERSION-}"' echo "export PYENV_VERSION=\"${version}\"" ;; esac fi else echo "false" exit 1 fi pyenv-pyenv-485090e/libexec/pyenv-shims000077500000000000000000000005741517431316200201260ustar00rootroot00000000000000#!/usr/bin/env bash # Summary: List existing pyenv shims # Usage: pyenv shims [--short] set -e [ -n "$PYENV_DEBUG" ] && set -x # Provide pyenv completions if [ "$1" = "--complete" ]; then echo --short exit fi shopt -s nullglob for command in "${PYENV_ROOT}/shims/"*; do if [ "$1" = "--short" ]; then echo "${command##*/}" else echo "$command" fi done | sort pyenv-pyenv-485090e/libexec/pyenv-version000077500000000000000000000014211517431316200204600ustar00rootroot00000000000000#!/usr/bin/env bash # Summary: Show the current Python version(s) and its origin # Usage: pyenv version [--bare] # # --bare show just the version name. An alias to `pyenv version-name' set -e [ -n "$PYENV_DEBUG" ] && set -x exitcode=0 OLDIFS="$IFS" IFS=: PYENV_VERSION_NAMES=($(pyenv-version-name)) || exitcode=$? IFS="$OLDIFS" unset bare for arg; do case "$arg" in --complete ) echo --bare exit ;; --bare ) bare=1 ;; * ) pyenv-help --usage version >&2 exit 1 ;; esac done for PYENV_VERSION_NAME in "${PYENV_VERSION_NAMES[@]}"; do if [[ -n $bare ]]; then echo "$PYENV_VERSION_NAME" else echo "$PYENV_VERSION_NAME (set by $(pyenv-version-origin))" fi done exit $exitcode pyenv-pyenv-485090e/libexec/pyenv-version-file000077500000000000000000000012261517431316200214000ustar00rootroot00000000000000#!/usr/bin/env bash # Usage: pyenv version-file [

] # Summary: Detect the file that sets the current pyenv version set -e [ -n "$PYENV_DEBUG" ] && set -x target_dir="$1" find_local_version_file() { local root="$1" while ! [[ "$root" =~ ^//[^/]*$ ]]; do if [ -f "${root}/.python-version" ]; then echo "${root}/.python-version" return 0 fi [ -n "$root" ] || break root="${root%/*}" done return 1 } if [ -n "$target_dir" ]; then find_local_version_file "$target_dir" else find_local_version_file "$PYENV_DIR" || { [ "$PYENV_DIR" != "$PWD" ] && find_local_version_file "$PWD" } || echo "${PYENV_ROOT}/version" fi pyenv-pyenv-485090e/libexec/pyenv-version-file-read000077500000000000000000000024111517431316200223060ustar00rootroot00000000000000#!/usr/bin/env bash # Usage: pyenv version-file-read set -e [ -n "$PYENV_DEBUG" ] && set -x VERSION_FILE="$1" function is_version_safe() { # As needed, check that the constructed path exists as a child path of PYENV_ROOT/versions version="$1" if [[ "$version" == ".." || "$version" == */* ]]; then # Sanity check the value of version to prevent malicious path-traversal ( cd "$PYENV_ROOT/versions/$version" &>/dev/null || exit 1 [[ "$PWD" == "$PYENV_ROOT/versions/"* ]] ) return $? else return 0 fi } if [ -s "$VERSION_FILE" ]; then # Read the first non-whitespace word from the specified version file. # Be careful not to load it whole in case there's something crazy in it. IFS="$IFS"$'\r' sep= while read -n 1024 -r version _ || [[ $version ]]; do if [[ -z "$version" || "$version" == \#* ]]; then # Skip empty lines and comments continue elif ! is_version_safe "$version"; then # CVE-2022-35861 allowed arbitrary code execution in some contexts and is mitigated by is_version_safe. echo "pyenv: invalid version \`$version' ignored in \`$VERSION_FILE'" >&2 continue fi printf "%s%s" "$sep" "$version" sep=: done <"$VERSION_FILE" [[ $sep ]] && { echo; exit; } fi exit 1 pyenv-pyenv-485090e/libexec/pyenv-version-file-write000077500000000000000000000015231517431316200225300ustar00rootroot00000000000000#!/usr/bin/env bash # Usage: pyenv version-file-write [-f|--force] [...] # # -f/--force Don't verify that the versions exist set -e [ -n "$PYENV_DEBUG" ] && set -x while [[ $# -gt 0 ]] do case "$1" in -f|--force) FORCE=1 shift ;; *) break ;; esac done PYENV_VERSION_FILE="$1" shift || true versions=("$@") if [ -z "$versions" ] || [ -z "$PYENV_VERSION_FILE" ]; then pyenv-help --usage version-file-write >&2 exit 1 fi # Make sure the specified version is installed. [[ -z $FORCE ]] && pyenv-prefix "${versions[@]}" >/dev/null # Write the version out to disk. # Create an empty file. Using "rm" might cause a permission error. > "$PYENV_VERSION_FILE" for version in "${versions[@]}"; do echo "$version" >> "$PYENV_VERSION_FILE" done pyenv-pyenv-485090e/libexec/pyenv-version-name000077500000000000000000000035061517431316200214040ustar00rootroot00000000000000#!/usr/bin/env bash # Summary: Show the current Python version # # -f/--force (Internal) If a version doesn't exist, print it as is rather than produce an error set -e [ -n "$PYENV_DEBUG" ] && set -x while [[ $# -gt 0 ]] do case "$1" in -f|--force) FORCE=1 shift ;; *) break ;; esac done if [ -z "$PYENV_VERSION" ]; then PYENV_VERSION_FILE="$(pyenv-version-file)" PYENV_VERSION="$(pyenv-version-file-read "$PYENV_VERSION_FILE" || true)" fi OLDIFS="$IFS" IFS=$'\n' scripts=(`pyenv-hooks version-name`) IFS="$OLDIFS" for script in "${scripts[@]}"; do source "$script" done if [ -z "$PYENV_VERSION" ] || [ "$PYENV_VERSION" = "system" ]; then echo "system" exit fi version_exists() { local version="$1" [ -d "${PYENV_ROOT}/versions/${version}" ] } versions=() OLDIFS="$IFS" { IFS=: any_not_installed=0 for version in ${PYENV_VERSION}; do # Remove the explicit 'python-' prefix from versions like 'python-3.12'. normalised_version="${version#python-}" if version_exists "${version}" || [ "$version" = "system" ]; then versions+=("${version}") elif version_exists "${normalised_version}"; then versions+=("${normalised_version}") elif resolved_version="$(pyenv-latest -b "${version}")"; then versions+=("${resolved_version}") elif resolved_version="$(pyenv-latest -b "${normalised_version}")"; then versions+=("${resolved_version}") else if [[ -n $FORCE ]]; then versions+=("${normalised_version}") else echo "pyenv: version \`$version' is not installed (set by $(pyenv-version-origin))" >&2 any_not_installed=1 fi fi done } IFS="$OLDIFS" OLDIFS="$IFS" { IFS=: echo "${versions[*]}" } IFS="$OLDIFS" if [ "$any_not_installed" = 1 ]; then exit 1 fi pyenv-pyenv-485090e/libexec/pyenv-version-origin000077500000000000000000000007141517431316200217510ustar00rootroot00000000000000#!/usr/bin/env bash # Summary: Explain how the current Python version is set set -e [ -n "$PYENV_DEBUG" ] && set -x unset PYENV_VERSION_ORIGIN OLDIFS="$IFS" IFS=$'\n' scripts=(`pyenv-hooks version-origin`) IFS="$OLDIFS" for script in "${scripts[@]}"; do source "$script" done if [ -n "$PYENV_VERSION_ORIGIN" ]; then echo "$PYENV_VERSION_ORIGIN" elif [ -n "$PYENV_VERSION" ]; then echo "PYENV_VERSION environment variable" else pyenv-version-file fi pyenv-pyenv-485090e/libexec/pyenv-versions000077500000000000000000000122561517431316200206530ustar00rootroot00000000000000#!/usr/bin/env bash # Summary: List all Python versions available to pyenv # Usage: pyenv versions [--bare] [--skip-aliases] [--skip-envs] [--executables] # # Lists all Python versions found in `$PYENV_ROOT/versions/*'. # # --bare List just the names, omit `system' # --skip-aliases Skip symlinks to other versions and to virtual environments # --skip-envs Skip virtual environments (under /envs) # --executables Internal. Overrides other options. # Optimally get a deduplicated list of all executable names in Pyenv-managed # versions and environments for `pyenv rehash' # set -e [ -n "$PYENV_DEBUG" ] && set -x unset bare skip_aliases skip_envs executables # Provide pyenv completions for arg; do case "$arg" in --complete ) echo --bare echo --skip-aliases echo --skip-envs exit ;; --executables ) executables=1; break ;; --bare ) bare=1 ;; --skip-aliases ) skip_aliases=1 ;; --skip-envs ) skip_envs=1 ;; * ) pyenv-help --usage versions >&2 exit 1 ;; esac done versions_dir="${PYENV_ROOT}/versions" # Fast path for rehash: skip filtering and link resolution if [[ -n "$executables" ]]; then if [ -d "$versions_dir" ]; then shopt -s dotglob nullglob # MacOS 12+ and FreeBSD 15 support `xargs -r -0' and `basename -a' # `sort -u` is simpler and a bit faster than `awk '!seen[$0]++'`, with the same result for rehash purposes printf '%s\0' "$versions_dir"/*/bin/* "$versions_dir"/*/envs/*/bin/* | xargs -0 -r basename -a | sort -u shopt -u dotglob nullglob fi exit 0 fi if ! enable -f "${BASH_SOURCE%/*}"/pyenv-realpath.dylib realpath 2>/dev/null; then if [ -n "$PYENV_NATIVE_EXT" ]; then echo "pyenv: failed to load \`realpath' builtin" >&2 exit 1 fi READLINK=$(type -P readlink) if [ -z "$READLINK" ]; then echo "pyenv: cannot find readlink - are you missing GNU coreutils?" >&2 exit 1 fi resolve_link() { $READLINK "$1" } realpath() { local path="$1" local name # Use a subshell to avoid changing the current path ( while [ -n "$path" ]; do name="${path##*/}" [ "$name" = "$path" ] || cd "${path%/*}" path="$(resolve_link "$name" || true)" done echo "${PWD}/$name" ) } fi if [ -d "$versions_dir" ]; then versions_dir="$(realpath "$versions_dir")" fi if ((${BASH_VERSINFO[0]} > 3)); then declare -A current_versions else current_versions=() fi if [ -n "$bare" ]; then include_system="" else hit_prefix="* " miss_prefix=" " OLDIFS="$IFS" IFS=: if ((${BASH_VERSINFO[0]} > 3)); then for i in $(pyenv-version-name || true); do current_versions["$i"]="1" done else current_versions=($(pyenv-version-name || true)) fi IFS="$OLDIFS" include_system="1" fi num_versions=0 exists() { local car="$1" local cdar shift for cdar in "$@"; do if [ "${car}" == "${cdar}" ]; then return 0 fi done return 1 } print_version() { local version="${1:?}" if [[ -n $bare ]]; then echo "$version" return fi local path="${2:?}" if [[ -L "$path" ]]; then # Only resolve the link itself for printing, do not resolve further. # Doing otherwise would misinform the user of what the link contains. version_repr="$version --> $(readlink "$path")" else version_repr="$version" fi if [[ ${BASH_VERSINFO[0]} -ge 4 && ${current_versions["$1"]} ]]; then echo "${hit_prefix}${version_repr} (set by $(pyenv-version-origin))" elif (( ${BASH_VERSINFO[0]} <= 3 )) && exists "$1" "${current_versions[@]}"; then echo "${hit_prefix}${version_repr} (set by $(pyenv-version-origin))" else echo "${miss_prefix}${version_repr}" fi num_versions=$((num_versions + 1)) } # Include "system" in the non-bare output, if it exists if [ -n "$include_system" ] && \ (PYENV_VERSION=system pyenv-which python --skip-advice >/dev/null 2>&1 || \ PYENV_VERSION=system pyenv-which python3 --skip-advice >/dev/null 2>&1 || \ PYENV_VERSION=system pyenv-which python2 --skip-advice >/dev/null 2>&1) ; then print_version system "/" fi shopt -s dotglob nullglob versions_dir_entries=("$versions_dir"/*) if sort --version-sort /dev/null 2>&1; then # system sort supports version sorting OLDIFS="$IFS" IFS=$'\n' versions_dir_entries=($( printf "%s\n" "${versions_dir_entries[@]}" | sort --version-sort )) IFS="$OLDIFS" fi for path in "${versions_dir_entries[@]}"; do if [ -d "$path" ]; then if [ -n "$skip_aliases" ] && [ -L "$path" ]; then target="$(realpath "$path")" [ "${target%/*}" == "$versions_dir" ] && continue [ "${target%/*/envs/*}" == "$versions_dir" ] && continue fi print_version "${path##*/}" "$path" # virtual environments created by anaconda/miniconda/pyenv-virtualenv if [[ -z $skip_envs ]]; then for env_path in "${path}/envs/"*; do if [ -d "${env_path}" ]; then print_version "${env_path#${PYENV_ROOT}/versions/}" "${env_path}" fi done fi fi done shopt -u dotglob nullglob if [ "$num_versions" -eq 0 ] && [ -n "$include_system" ]; then echo "Warning: no Python detected on the system" >&2 exit 1 fi pyenv-pyenv-485090e/libexec/pyenv-whence000077500000000000000000000014011517431316200202420ustar00rootroot00000000000000#!/usr/bin/env bash # Summary: List all Python versions that contain the given executable # Usage: pyenv whence [--path] set -e [ -n "$PYENV_DEBUG" ] && set -x # Provide pyenv completions if [ "$1" = "--complete" ]; then echo --path exec pyenv-shims --short fi if [ "$1" = "--path" ]; then print_paths="1" shift else print_paths="" fi whence() { local command="$1" pyenv-versions --bare | while read -r version; do path="$(pyenv-prefix "$version")/bin/${command}" if [ -x "$path" ]; then [ "$print_paths" ] && echo "$path" || echo "$version" fi done } PYENV_COMMAND="$1" if [ -z "$PYENV_COMMAND" ]; then pyenv-help --usage whence >&2 exit 1 fi result="$(whence "$PYENV_COMMAND")" [ -n "$result" ] && echo "$result" pyenv-pyenv-485090e/libexec/pyenv-which000077500000000000000000000061431517431316200201030ustar00rootroot00000000000000#!/usr/bin/env bash # # Summary: Display the full path to an executable # # Usage: pyenv which [--nosystem] [--skip-advice] # # Displays the full path to the executable that pyenv will invoke when # you run the given command. # Use --nosystem argument in case when you don't need to search command in the # system environment. # Internal switch --skip-advice used to skip printing an error message on a # failed search. set -e [ -n "$PYENV_DEBUG" ] && set -x # Provide pyenv completions if [ "$1" = "--complete" ]; then exec pyenv-shims --short fi system="system" SKIP_ADVICE="" PYENV_COMMAND="$1" while [[ $# -gt 0 ]] do case "$1" in --skip-advice) SKIP_ADVICE=1 shift ;; --nosystem) system="" shift ;; *) shift ;; esac done remove_from_path() { local -a paths_to_remove IFS=: paths_to_remove=($1) local path_to_remove path_before local result=":${PATH//\~/$HOME}:" for path_to_remove in "${paths_to_remove[@]}"; do while true; do path_before="$result" result="${result//:$path_to_remove:/:}" if [[ ${#path_before} == "${#result}" ]]; then break; fi done done result="${result:1:${#result}-2}" echo "$result" } if [ -z "$PYENV_COMMAND" ]; then pyenv-help --usage which >&2 exit 1 fi OLDIFS="$IFS" IFS=: versions=(${PYENV_VERSION:-$(pyenv-version-name -f)}) IFS="$OLDIFS" declare -a nonexistent_versions for version in "${versions[@]}" "$system"; do if [ "$version" = "system" ]; then PROGRAM="$(echo "$PYENV_COMMAND" | tr a-z- A-Z_ | sed 's/[^A-Z0-9_]/_/g')" NR_CUSTOM_SHIM_PATHS="_PYENV_SHIM_PATHS_$PROGRAM" SEARCH_PATH="$(remove_from_path "${PYENV_ROOT}/shims${!NR_CUSTOM_SHIM_PATHS:+:${!NR_CUSTOM_SHIM_PATHS}}")" PYENV_COMMAND_PATH="$(PATH="$SEARCH_PATH" command -v "$PYENV_COMMAND" || true)" else # $version may be a prefix to be resolved by pyenv-latest version_path="$(pyenv-prefix "${version}" 2>/dev/null)" || \ { nonexistent_versions+=("$version"); continue; } # resolve $version for hooks version="$(basename "$version_path")" PYENV_COMMAND_PATH="$version_path/bin/${PYENV_COMMAND}" unset version_path fi if [ -x "$PYENV_COMMAND_PATH" ]; then break fi done OLDIFS="$IFS" IFS=$'\n' scripts=(`pyenv-hooks which`) IFS="$OLDIFS" for script in "${scripts[@]}"; do source "$script" done if [ -x "$PYENV_COMMAND_PATH" ]; then echo "$PYENV_COMMAND_PATH" else if (( ${#nonexistent_versions[@]} )); then for version in "${nonexistent_versions[@]}"; do echo "pyenv: version \`$version' is not installed (set by $(pyenv-version-origin))" >&2 done fi echo "pyenv: $PYENV_COMMAND: command not found" >&2 if [ -z "$SKIP_ADVICE" ]; then versions="$(pyenv-whence "$PYENV_COMMAND" || true)" if [ -n "$versions" ]; then { echo echo "The \`$PYENV_COMMAND' command exists in these Python versions:" echo "$versions" | sed 's/^/ /g' echo echo "Note: See 'pyenv help global' for tips on allowing multiple" echo " Python versions to be found at the same time." } >&2 fi fi exit 127 fi pyenv-pyenv-485090e/man/000077500000000000000000000000001517431316200150505ustar00rootroot00000000000000pyenv-pyenv-485090e/man/man1/000077500000000000000000000000001517431316200157045ustar00rootroot00000000000000pyenv-pyenv-485090e/man/man1/pyenv.1000066400000000000000000000476621517431316200171460ustar00rootroot00000000000000.TH PYENV 1 "24 Apr 2023" "PYENV" .SH NAME pyenv \- Simple Python version management .SH SYNOPSIS .B pyenv \fI\, \/\fR[\fI\,\/\fR] .SH DESCRIPTION pyenv lets you easily switch between multiple versions of Python\. It's simple, unobtrusive, and follows the UNIX tradition of single\-purpose tools that do one thing well\. .P To start using pyenv .IP "1." 3 \fBAppend\fR the following to \fB$HOME/.bashrc\fR .P .RS 15 .nf if command -v pyenv 1>/dev/null 2>&1; then\n eval "$(pyenv init - bash)" \n fi .fi .RE .RS 3 .P .nh Appending this line enables shims. Please make sure this line is placed toward the end of the shell configuration file since it manipulates \fBPATH\fR during the initialization\. .hy .TP 13 .B Debian note: Modify only your \fB~/\.bashrc\fR file instead of creating .br \fB~/\.bash_profile\fR .P .RS 0 \fBZsh note\fR: Modify your \fB~/\.zshrc\fR file instead of \fB~/\.bashrc\fR .P \fBWarning\fR: If you configured your system so that \fBBASH_ENV\fR variable points to \fB\.bashrc\fR\. You should almost certainly put the above mentioned line into \fB\.bash_profile\fR, and \fBnot\fR into \fB\.bashrc\fR. Otherwise you may observe strange behaviour, such as \fBpyenv\fR getting into an infinite loop. See #264 .UR https://github\.com/pyenv/pyenv/issues/264 .UE for details. .RE .RE .IP "2." 3 \fBRestart your shell so the path changes take effect\.\fR You can now begin using pyenv\. .P .RS 15 exec "$SHELL"\fR .RE .IP "3." 3 \fBInstall Python versions into \fB$(pyenv root)/versions\fR\.\fR For example, to download and install Python 3\.6\.12, run: .P .RS 15 .B pyenv install 3.6.12\fR .RE .P \fBNOTE:\fR If you need to pass configure option to build, please use \fBCONFIGURE_OPTS\fR environment variable. If you are having trouble installing a python version, please visit the wiki page about Common Build Problems .UR https://github\.com/pyenv/pyenv/wiki/Common\-build\-problems .UE .P \fBProxy note\fR: If you use a proxy, export \fBHTTP_PROXY\fR and \fBHTTPS_PROXY\fR environment variables. .P .SS "Stop using pyenv" The simplicity of pyenv makes it easy to temporarily disable it, or uninstall from the system\. To \fBdisable\fR pyenv managing your Python versions, simply remove the \fBpyenv init\fR line from your shell startup configuration\. This will remove pyenv shims directory from PATH, and future invocations like \fBpython\fR will execute the system Python version, as before pyenv\. .IP "" 0 .P \fBpyenv\fR will still be accessible on the command line, but your Python apps won't be affected by version switching\. .IP "" 0 .SH COMMAND LINE OPTIONS Like \fBgit\fR, the \fBpyenv\fR command delegates to subcommands based on its first argument\. .SS "Some useful pyenv commands are:" .TP 5 .B commands List all available pyenv commands .TP .B exec Run an executable with the selected Python version .TP .B global Set or show the global Python version(s) .TP .B help Display help for a command .TP .B hooks List hook scripts for a given pyenv command .TP .B init Configure the shell environment for pyenv .TP .B install Install a Python version using python\-build .TP .B local Set or show the local application\-specific Python version(s) .TP .B prefix Display prefix for a Python version .TP .B rehash Rehash pyenv shims (run this after installing executables) .TP .B root Display the root directory where versions and shims are kept .TP .B shell Set or show the shell\-specific Python version .TP .B shims List existing pyenv shims .TP .B uninstall Uninstall Python versions .TP .B version Show the current Python version(s) and its origin .TP .B version\-file Detect the file that sets the current pyenv version .TP .B version\-name Show the current Python version .TP .B version\-origin Explain how the current Python version is set .TP .B versions List all Python versions available to pyenv .TP .B whence List all Python versions that contain the given executable .TP .B which Display the full path to an executable .PP See `pyenv help ' for information on a specific command. For full documentation, see \fBCOMMAND REFERENCE\fR section .SH OPTIONS .TP .B \-h, \-\-help Show summary of options. .TP .B \-v, \-\-version Show version of program. .SH COMPARISON .P .B "pyenv does\|\.\|\.\|\. .P .IP \(bu 4 Let you \fBchange the global Python version\fR on a per\-user basis\. .IP \(bu 4 Provide support for \fBper\-project Python versions\fR\. .IP \(bu 4 Allow you to \fBoverride the Python version\fR with an environment variable\. .IP \(bu 4 Search commands from \fBmultiple versions of Python at a time\fR\. This may be helpful to test across Python versions with tox .IP "" 0 .P .B "In contrast with pythonbrew and pythonz, pyenv does not\|\.\|\.\|\." .IP \(bu 4 \fBDepend on Python itself\.\fR pyenv was made from pure shell scripts\. There is no bootstrap problem of Python\. .IP \(bu 4 \fBNeed to be loaded into your shell\.\fR Instead, pyenv's shim approach works by adding a directory to your \fB$PATH\fR\. .IP \(bu 4 \fBManage virtualenv\.\fR Of course, you can create virtualenv yourself, or pyenv\-virtualenv to automate the process\. .SH "How It Works" At a high level, pyenv intercepts Python commands using shim executables injected into your \fBPATH\fR, determines which Python version has been specified by your application, and passes your commands along to the correct Python installation\. .SS "Understanding PATH" When you run a command like \fBpython\fR or \fBpip\fR, your operating system searches through a list of directories to find an executable file with that name\. This list of directories lives in an environment variable called \fBPATH\fR, with each directory in the list separated by a colon: .IP "" 4 .nf /usr/local/bin:/usr/bin:/bin .fi .IP "" 0 .P Directories in \fBPATH\fR are searched from left to right, so a matching executable in a directory at the beginning of the list takes precedence over another one at the end\. In this example, the \fB/usr/local/bin\fR directory will be searched first, then \fB/usr/bin\fR, then \fB/bin\fR\. .SS "Understanding Shims" pyenv works by inserting a directory of \fIshims\fR at the front of your \fBPATH\fR: .IP "" 4 .nf $(pyenv root)/shims:/usr/local/bin:/usr/bin:/bin .fi .IP "" 0 .P Through a process called \fIrehashing\fR, pyenv maintains shims in that directory to match every Python command (\fBpython\fR,\fBpip\fR,etc...) across every installed version of Python .P Shims are lightweight executables that simply pass your command along to pyenv\. So with pyenv installed, when you run, say, \fBpip\fR, your operating system will do the following: .IP \(bu 4 Search your \fBPATH\fR for an executable file named \fBpip\fR .IP \(bu 4 Find the pyenv shim named \fBpip\fR at the beginning of your \fBPATH\fR .IP \(bu 4 Run the shim named \fBpip\fR, which in turn passes the command along to pyenv .IP "" 0 .SS "Choosing the Python Version" When you execute a shim, pyenv determines which Python version to use by reading it from the following sources, in this order: .IP "1." 4 The \fBPYENV_VERSION\fR environment variable (if specified)\. You can use the \fBpyenv shell\fR command to set this environment variable in your current shell session\. .IP "2." 4 The application\-specific \fB\.python\-version\fR file in the current directory (if present)\. You can modify the current directory's \fB\.python\-version\fR file with the \fBpyenv local\fR command\. .IP "3." 4 The first \fB\.python\-version\fR file found (if any) by searching each parent directory, until reaching the root of your filesystem\. .IP "4." 4 The global \fB$(pyenv root)/version\fR file\. You can modify this file using the \fBpyenv global\fR command\. If the global version file is not present, pyenv assumes you want to use the "system" Python\. (In other words, whatever version would run if pyenv weren't in your \fBPATH\fR\.) .IP "" 0 .P .nh \fBNOTE:\fR You can activate multiple versions at the same time, including multiple versions of Python2 or Python3 simultaneously\. This allows for parallel usage of Python2 and Python3, and is required with tools like \fBtox\fR\. For example, to set your path to first use your \fBsystem\fR Python and Python3 (set to 2\.7\.9 and 3\.4\.2 in this example), but also have Python 3\.3\.6, 3\.2, and 2\.5 available on your \fBPATH\fR, one would first \fBpyenv install\fR the missing versions, then set \fBpyenv global system 3\.3\.6 3\.2 2\.5\fR\. At this point, one should be able to find the full executable path to each of these using \fBpyenv which\fR, e\.g\. \fBpyenv which python2\.5\fR (should display \fB$(pyenv root)/versions/2\.5/bin/python2\.5\fR), or \fBpyenv which python3\.4\fR (should display path to system Python3)\. You can also specify multiple versions in a \fB\.python\-version\fR file, separated by newlines or any whitespace\. hy .SS "Locating the Python Installation" Once pyenv has determined which version of Python your application has specified, it passes the command along to the corresponding Python installation\. .P Each Python version is installed into its own directory under .nf \fB$(pyenv root)/versions\fR\. .fi .P For example, you might have these versions installed: .IP \(bu 4 \fB$(pyenv root)/versions/2\.7\.8/\fR .IP \(bu 4 \fB$(pyenv root)/versions/3\.4\.2/\fR .IP \(bu 4 \fB$(pyenv root)/versions/pypy\-2\.4\.0/\fR .IP "" 0 .P As far as pyenv is concerned, version names are simply the directories in \fB$(pyenv root)/versions\fR\. .SS "Managing Virtual Environments" There is a pyenv plugin named pyenv\-virtualenv which comes with various features to help pyenv users to manage virtual environments created by virtualenv or Anaconda\. Because the \fBactivate\fR script of those virtual environments are relying on mutating \fB$PATH\fR variable of user's interactive shell, it will intercept pyenv's shim style command execution hooks\. We'd recommend to install pyenv\-virtualenv as well if you have some plan to play with those virtual environments\. .SH "Advanced Configuration" Skip this section unless you must know what every line in your shell profile is doing\. .P \fBpyenv init\fR is the only command that crosses the line of loading extra commands into your shell\. Coming from rvm, some of you might be opposed to this idea\. Here's what \fBpyenv init\fR actually does: .IP "1." 4 \fBSets up your shims path\.\fR This is the only requirement for pyenv to function properly\. You can do this by hand by prepending \fB$(pyenv root)/shims\fR to your \fB$PATH\fR\. .IP "2." 4 \fBRehashes shims\.\fR From time to time you'll need to rebuild your shim files\. Doing this on init makes sure everything is up to date\. You can always run \fBpyenv rehash\fR manually\. You can disable this functionality by adding \fB--no-rehash\fR to the end of your \fBpyenv init\fR command line. .IP "3." 4 \fBInstalls the sh dispatcher\.\fR This bit is also optional, but allows pyenv and plugins to change variables in your current shell, making commands like \fBpyenv shell\fR possible\. The sh dispatcher doesn't do anything crazy like override \fBcd\fR or hack your shell prompt, but if for some reason you need \fBpyenv\fR to be a real script rather than a shell function, you can safely skip it\. .IP "" 0 .P To see exactly what happens under the hood for yourself, run \fB"pyenv init \-"\fR\. .SH "Uninstalling Python Versions" As time goes on, you will accumulate Python versions in your \fB$(pyenv root)/versions\fR directory\. .P To remove old Python versions, \fBpyenv uninstall\fR command to automate the removal process\. .P Alternatively, simply \fBrm \-rf\fR the directory of the version you want to remove\. You can find the directory of a particular Python version with the \fBpyenv prefix\fR command, .P e\.g\. \fBpyenv prefix 2\.6\.8\fR\. .SH "Command Reference" .P The most common subcommands are: .SS "pyenv commands" Lists all available pyenv commands\. .SS "pyenv local" Sets a local application\-specific Python version by writing the version name to a \fB\.python\-version\fR file in the current directory\. This version overrides the global version, and can be overridden itself by setting the \fBPYENV_VERSION\fR environment variable or with the \fBpyenv shell\fR command\. .IP "" 4 .nf $ pyenv local 2\.7\.6 .fi .IP "" 0 .P When run without a version number, \fBpyenv local\fR reports the currently configured local version\. You can also unset the local version: .IP "" 4 .nf $ pyenv local \-\-unset .fi .IP "" 0 .P Previous versions of pyenv stored local version specifications in a file named \fB\.pyenv\-version\fR\. For backwards compatibility, pyenv will read a local version specified in an \fB\.pyenv\-version\fR file, but a \fB\.python\-version\fR file in the same directory will take precedence\. .P You can specify multiple versions as local Python at once\. .P Let's say if you have two versions of 2\.7\.6 and 3\.3\.3\. If you prefer 2\.7\.6 over 3\.3\.3, .IP "" 4 .nf $ pyenv local 2\.7\.6 3\.3\.3 $ pyenv versions system * 2\.7\.6 (set by /Users/yyuu/path/to/project/\.python\-version) * 3\.3\.3 (set by /Users/yyuu/path/to/project/\.python\-version) $ python \-\-version Python 2\.7\.6 $ python2\.7 \-\-version Python 2\.7\.6 $ python3\.3 \-\-version Python 3\.3\.3 .fi .IP "" 0 .P or, if you prefer 3\.3\.3 over 2\.7\.6, .IP "" 4 .nf $ pyenv local 3\.3\.3 2\.7\.6 $ pyenv versions system * 2\.7\.6 (set by /Users/yyuu/path/to/project/\.python\-version) * 3\.3\.3 (set by /Users/yyuu/path/to/project/\.python\-version) venv27 $ python \-\-version Python 3\.3\.3 $ python2\.7 \-\-version Python 2\.7\.6 $ python3\.3 \-\-version Python 3\.3\.3 .fi .IP "" 0 .SS "pyenv global" Sets the global version of Python to be used in all shells by writing the version name to the \fB~/\.pyenv/version\fR file\. This version can be overridden by an application\-specific \fB\.python\-version\fR file, or by setting the \fBPYENV_VERSION\fR environment variable\. .IP "" 4 .nf $ pyenv global 2\.7\.6 .fi .IP "" 0 .P The special version name \fBsystem\fR tells pyenv to use the system Python (detected by searching your \fB$PATH\fR)\. .P When run without a version number, \fBpyenv global\fR reports the currently configured global version\. .P You can specify multiple versions as global Python at once\. .P Let's say if you have two versions of 2\.7\.6 and 3\.3\.3\. If you prefer 2\.7\.6 over 3\.3\.3, .IP "" 4 .nf $ pyenv global 2\.7\.6 3\.3\.3 $ pyenv versions system * 2\.7\.6 (set by /Users/yyuu/\.pyenv/version) * 3\.3\.3 (set by /Users/yyuu/\.pyenv/version) $ python \-\-version Python 2\.7\.6 $ python2\.7 \-\-version Python 2\.7\.6 $ python3\.3 \-\-version Python 3\.3\.3 .fi .IP "" 0 .P or, if you prefer 3\.3\.3 over 2\.7\.6, .IP "" 4 .nf $ pyenv global 3\.3\.3 2\.7\.6 $ pyenv versions system * 2\.7\.6 (set by /Users/yyuu/\.pyenv/version) * 3\.3\.3 (set by /Users/yyuu/\.pyenv/version) venv27 $ python \-\-version Python 3\.3\.3 $ python2\.7 \-\-version Python 2\.7\.6 $ python3\.3 \-\-version Python 3\.3\.3 .fi .IP "" 0 .SS "pyenv shell" Sets a shell\-specific Python version by setting the \fBPYENV_VERSION\fR environment variable in your shell\. This version overrides application\-specific versions and the global version\. .IP "" 4 .nf $ pyenv shell pypy\-2\.2\.1 .fi .IP "" 0 .P When run without a version number, \fBpyenv shell\fR reports the current value of \fBPYENV_VERSION\fR\. You can also unset the shell version: .IP "" 4 .nf $ pyenv shell \-\-unset .fi .IP "" 0 .P Note that you'll need pyenv's shell integration enabled (step 3 of the installation instructions) in order to use this command\. If you prefer not to use shell integration, you may simply set the \fBPYENV_VERSION\fR variable yourself: .IP "" 4 .nf $ export PYENV_VERSION=pypy\-2\.2\.1 .fi .IP "" 0 .P You can specify multiple versions via \fBPYENV_VERSION\fR at once\. .P Let's say if you have two versions of 2\.7\.6 and 3\.3\.3\. If you prefer 2\.7\.6 over 3\.3\.3, .IP "" 4 .nf $ pyenv shell 2\.7\.6 3\.3\.3 $ pyenv versions system * 2\.7\.6 (set by PYENV_VERSION environment variable) * 3\.3\.3 (set by PYENV_VERSION environment variable) $ python \-\-version Python 2\.7\.6 $ python2\.7 \-\-version Python 2\.7\.6 $ python3\.3 \-\-version Python 3\.3\.3 .fi .IP "" 0 .P or, if you prefer 3\.3\.3 over 2\.7\.6, .IP "" 4 .nf $ pyenv shell 3\.3\.3 2\.7\.6 $ pyenv versions system * 2\.7\.6 (set by PYENV_VERSION environment variable) * 3\.3\.3 (set by PYENV_VERSION environment variable) venv27 $ python \-\-version Python 3\.3\.3 $ python2\.7 \-\-version Python 2\.7\.6 $ python3\.3 \-\-version Python 3\.3\.3 .fi .IP "" 0 .SS "pyenv install" Install a Python version .IP "" 4 .nf Usage: pyenv install [\-f] [\-kvp] pyenv install [\-f] [\-kvp] pyenv install \-l|\-\-list \-l, \-\-list List all available versions \-f, \-\-force Install even if the version appears to be installed already \-s, \-\-skip\-existing Skip the installation if the version appears to be installed already python\-build options: \-k, \-\-keep Keep source tree in $PYENV_BUILD_ROOT after installation (defaults to $PYENV_ROOT/sources) \-v, \-\-verbose Verbose mode: print compilation status to stdout \-p, \-\-patch Apply a patch from stdin before building \-g, \-\-debug Build a debug version .fi .IP "" 0 .P To list the all available versions of Python, including Anaconda, Jython, pypy, and stackless, use: .IP "" 4 .nf $ pyenv install \-\-list .fi .IP "" 0 .P Then install the desired versions: .IP "" 4 .nf $ pyenv install 2\.7\.6 $ pyenv install 2\.6\.8 $ pyenv versions system 2\.6\.8 * 2\.7\.6 (set by /home/yyuu/\.pyenv/version) .fi .IP "" 0 .SS "pyenv uninstall" Uninstall Python versions\. .IP "" 4 .nf Usage: pyenv uninstall [\-f|\-\-force] ... \-f Attempt to remove the specified version without prompting for confirmation\. If the version does not exist, do not display an error message\. .fi .IP "" 0 .SS "pyenv rehash" Installs shims for all Python binaries known to pyenv (i\.e\., \fB~/\.pyenv/versions/*/bin/*\fR)\. Run this command after you install a new version of Python, or install a package that provides binaries\. .IP "" 4 .nf $ pyenv rehash .fi .IP "" 0 .SS "pyenv version" Displays the currently active Python version, along with information on how it was set\. .IP "" 4 .nf $ pyenv version 2\.7\.6 (set by /home/yyuu/\.pyenv/version) .fi .IP "" 0 .SS "pyenv versions" Lists all Python versions known to pyenv, and shows an asterisk next to the currently active version\. .IP "" 4 .nf $ pyenv versions 2\.5\.6 2\.6\.8 * 2\.7\.6 (set by /home/yyuu/\.pyenv/version) 3\.3\.3 jython\-2\.5\.3 pypy\-2\.2\.1 .fi .IP "" 0 .SS "pyenv which" Displays the full path to the executable that pyenv will invoke when you run the given command\. .IP "" 4 .nf $ pyenv which python3\.3 /home/yyuu/\.pyenv/versions/3\.3\.3/bin/python3\.3 .fi .IP "" 0 .SS "pyenv whence" Lists all Python versions with the given command installed\. .IP "" 4 .nf $ pyenv whence 2to3 2\.6\.8 2\.7\.6 3\.3\.3 .fi .IP "" 0 .SH "Environment variables" You can affect how pyenv operates with the following settings: .TP 28 .B name (default) .B description .TP 28 .B PYENV_VERSION Specifies the Python version to be used. Also see \fBpyenv shell\fR .TP .B PYENV_ROOT (\fB~/.pyenv\fR) Defines the directory under which Python versions and shims reside. Also see \fBpyenv root\fR .TP .B PYENV_DEBUG Outputs debug information. .br Also as: \fBpyenv --debug \fR .TP .B PYENV_HOOK_PATH Colon\-separated list of paths searched for pyenv hooks\. .TP .B PYENV_DIR (\fB$PWD\fR) Directory to start searching for \fB\.python\-version\fR files\. .TP .B HTTP_PROXY,HTTPS_PROXY Proxy Variables .TP .B CONFIGURE_OPTS Pass configure options to build. .TP .B PYTHON_BUILD_ARIA2_OPTS Used to pass additional parameters to \fBaria2\fR .UR https://aria2\.github\.io/ .UE If the \fBaria2c\fR binary is available on PATH, pyenv uses \fBaria2c\fR instead of \fBcurl\fR or \fBwget\fR to download the Python Source code\. If you have an unstable internet connection, you can use this variable to instruct \fBaria2\fR to accelerate the download\. In most cases, you will only need to use \fB\-x 10 \-k 1M\fR as value to \fBPYTHON_BUILD_ARIA2_OPTS\fR environment variable .SH "License" The \fBMIT\fR License pyenv-pyenv-485090e/plugins/000077500000000000000000000000001517431316200157565ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/.gitignore000066400000000000000000000001151517431316200177430ustar00rootroot00000000000000/* !/.gitignore !/version-ext-compat !/python-build /python-build/test/build pyenv-pyenv-485090e/plugins/python-build/000077500000000000000000000000001517431316200203745ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/LICENSE000066400000000000000000000021111517431316200213740ustar00rootroot00000000000000Copyright (c) 2013 Yamashita, Yuu Copyright (c) 2012-2013 Sam Stephenson Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. pyenv-pyenv-485090e/plugins/python-build/README.md000066400000000000000000000372531517431316200216650ustar00rootroot00000000000000# python-build python-build is a [pyenv](https://github.com/pyenv/pyenv) plugin that provides a `pyenv install` command to compile and install different versions of Python on UNIX-like systems. You can also use python-build without pyenv in environments where you need precise control over Python version installation. See the [list of releases](https://github.com/pyenv/pyenv/releases) for changes in each version. ## Installation ### Installing as a pyenv plugin (recommended) Since python-build is bundled with pyenv by default, you do not need to do anything. ### Installing as a standalone program (advanced) Installing python-build as a standalone program will give you access to the `python-build` command for precise control over Python version installation. If you have pyenv installed, you will also be able to use the `pyenv install` command. git clone https://github.com/pyenv/pyenv.git cd pyenv/plugins/python-build ./install.sh This will install python-build into `/usr/local`. If you do not have write permission to `/usr/local`, you will need to run `sudo ./install.sh` instead. You can install to a different prefix by setting the `PREFIX` environment variable. To update python-build after it has been installed, run `git pull` in your cloned copy of the repository, then re-run the install script. ### Installing with Homebrew (for OS X users) Mac OS X users can install python-build with the [Homebrew](http://brew.sh) package manager. This will give you access to the `python-build` command. If you have pyenv installed, you will also be able to use the `pyenv install` command. *This is the recommended method of installation if you installed pyenv with Homebrew.* brew install pyenv Or, if you would like to install the latest development release: brew install --HEAD pyenv ## Usage Before you begin, you should ensure that your build environment has the proper system dependencies for compiling the wanted Python Version (see our [recommendations](https://github.com/pyenv/pyenv/wiki#suggested-build-environment)). ### Using `pyenv install` with pyenv To install a Python version for use with pyenv, run `pyenv install` with exact name of the version you want to install. For example, pyenv install 2.7.4 Python versions will be installed into a directory of the same name under `~/.pyenv/versions`. To see a list of all available Python versions, run `pyenv install --list`. You may also tab-complete available Python versions if your pyenv installation is properly configured. ### Using `python-build` standalone If you have installed python-build as a standalone program, you can use the `python-build` command to compile and install Python versions into specific locations. Run the `python-build` command with the exact name of the version you want to install and the full path where you want to install it. For example, python-build 2.7.4 ~/local/python-2.7.4 To see a list of all available Python versions, run `python-build --definitions`. Pass the `-v` or `--verbose` flag to `python-build` as the first argument to see what's happening under the hood. ### Custom definitions Both `pyenv install` and `python-build` accept a path to a custom definition file in place of a version name. Custom definitions let you develop and install versions of Python that are not yet supported by python-build. See the [python-build built-in definitions](https://github.com/pyenv/pyenv/tree/master/plugins/python-build/share/python-build) as a starting point for custom definition files. #### Adding definitions with a Pyenv plugin You can add your own definitions with a [Pyenv plugin](https://github.com/pyenv/pyenv?tab=readme-ov-file#pyenv-plugins) by placing them under `$PYENV_ROOT/plugins/your_plugin_name/share/python-build`. ### Default build configuration Without the user customizing the build with environment variables (see below), `python-build` builds Python with mostly default Configure options to maintain the principle of the least surprise. The exceptions -- non-default options that are set by default -- are listed below: | Option/Behavior | Rationale | |-----------------|-----------| | `--enable-shared` is on by default. Pass `--disable-shared` to Configure options to override | The official CPython Docker image uses it. It's required to embed CPython. | | argument to `--enable-universalsdk` is ignored and set to `/` | | `--with-universal-archs` defaults to `universal2` on ARM64 architecture | the only dual-architecture Macs in use today are Apple Silicon which can only build that one | | argument to `--enable-framework` is ignored and set to a specific value | CPython's build logic requires a very specific argument to avoid installing the `Applications` part globally | | argument to `--enable-unicode` in non-MacOS is overridden to `ucs4` for 2.x-3.3 | | `MACOSX_DEPLOYMENT_TARGET` defaults to the running MacOS version | #### Integration with 3rd-party package ecosystems ##### Homebrew Homebrew is used to find dependency packages if `brew` is found on `PATH`: * In MacOS, or * If the running Pyenv itself is installed with Homebrew Set `PYTHON_BUILD_USE_HOMEBREW` or `PYTHON_BUILD_SKIP_HOMEBREW` to override this default. When Homebrew is used, its `include` and `lib` paths are added to compiler search path (the latter is also set as `rpath`), and also Python dependencies that are typically keg-only are searched for in the Homebrew installation and added individually. **NOTE:** Homebrew is not used in Linux by default because it's rolling-release which causes a problem. Upgrading a Python dependency in Homebrew to a new major version (that `brew` does without warning) would break all Pyenv-managed installations that depend on it. You can use a [community plugin `fix-version`](https://github.com/pyenv/pyenv/wiki/Plugins#community-plugins) to fix installations in such a case. ##### MacPorts MacPorts Homebrew is used to find dependency packages if `port` is found on `PATH` in MacOS. Set `PYTHON_BUILD_USE_MACPORTS` or `PYTHON_BUILD_SKIP_MACPORTS` to override this default. ###### Interaction with Homebrew If both Homebrew and MacPorts are installed and allowed to be used, Homebrew takes preference. There first ecosystem where any of the required dependency packages is found is used. ##### Portage In FreeBSD, if `pkg` is on PATH, Ports are searched for some dependencies that Configure is known to not search for via `pkg-config`. (Later versions of CPython search for more packages via `pkg-config` so this may eventually become redundant.) ### Special environment variables You can set certain environment variables to control the build process. * `TMPDIR` sets the location where python-build stores temporary files. * `PYTHON_BUILD_BUILD_PATH` sets the location in which sources are downloaded and built. By default, this is a subdirectory of `TMPDIR`. * `PYTHON_BUILD_CACHE_PATH`, if set, specifies a directory to use for caching downloaded package files. * `PYTHON_BUILD_MIRROR_URL` overrides the default mirror URL root to one of your choosing. * `PYTHON_BUILD_MIRROR_URL_SKIP_CHECKSUM`, if set, does not append the SHA2 checksum of the file to the mirror URL. * `PYTHON_BUILD_SKIP_MIRROR`, if set, forces python-build to download packages from their original source URLs instead of using a mirror. * `PYTHON_BUILD_HTTP_CLIENT`, explicitly specify the HTTP client type to use. `aria2`, `curl` and `wget` are the supported values and by default, are searched in that order. * `PYTHON_BUILD_CURL_OPTS`, `PYTHON_BUILD_WGET_OPTS`, `PYTHON_BUILD_ARIA2_OPTS` pass additional parameters to the corresponding HTTP client. * `PYTHON_BUILD_SKIP_HOMEBREW`, if set, will not search for libraries installed by Homebrew when it would normally will. * `PYTHON_BUILD_USE_HOMEBREW`, if set, will search for libraries installed by Homebrew when it would normally not. * `PYTHON_BUILD_HOMEBREW_OPENSSL_FORMULA`, override the Homebrew OpenSSL formula to use. * `PYTHON_BUILD_MACPORTS_OPENSSL_FORMULA`, override the MacPorts OpenSSL formula to use. The default is `openssl3 openssl`. * `PYTHON_BUILD_TCLTK_FORMULA`, override the Homebrew Tcl/Tk formula to use. * `PYTHON_BUILD_SKIP_MACPORTS`, if set, will not search for libraries installed by MacPorts when it would normally will. * `PYTHON_BUILD_USE_MACPORTS`, if set, will search for libraries installed by MacPorts when it would normally not. * `PYTHON_BUILD_ROOT` overrides the default location from where build definitions in `share/python-build/` are looked up. * `PYTHON_BUILD_DEFINITIONS` can be a list of colon-separated paths that get additionally searched when looking up build definitions. * `CC` sets the path to the C compiler. * `CONFIGURE_OPTS` lets you pass additional options to `./configure`. * `MAKE` lets you override the command to use for `make`. Useful for specifying GNU make (`gmake`) on some systems. * `MAKE_OPTS` (or `MAKEOPTS`) lets you pass additional options to `make`. * `MAKE_INSTALL_OPTS` lets you pass additional options to `make install`. * `_CFLAGS`, `_CPPFLAGS`, `_LDFLAGS` let you pass additional options to `CFLAGS`/`CPPFLAGS`/`LDFLAGS` specifically for building `` (Python itself or a dependency library) from source as part of the build script. `` should be a capitalized name of the package without version (technically, capitalized first argument to `install_package` without version). E.g. for CPython, it's "`PYTHON`", for Readline, "`READLINE`", for PyPy (only applies when building it from source), "`PYPY`". Check the source of the build script you're using if unsure. * `_CONFIGURE_OPTS`, `_MAKE_OPTS`, `_MAKE_INSTALL_OPTS`, `_MAKE_INSTALL_TARGET` allow you to specify configure and make options for building `` (same as above). "Make install target" would replace "`install`" in the `make install` invocation. ### Applying patches to Python before compiling Both `pyenv install` and `python-build` support the `--patch` (`-p`) flag that signals that a patch from stdin should be applied to Python, Jython or PyPy source code before the `./configure` and compilation steps. Example usage: ```sh # applying a single patch $ pyenv install --patch 2.7.10 < /path/to/python.patch # applying a patch from HTTP $ pyenv install --patch 2.7.10 < <(curl -sSL http://git.io/python.patch) # applying multiple patches $ cat fix1.patch fix2.patch | pyenv install --patch 2.7.10 ``` ### Building for maximum performance Building CPython with `--enable-optimizations` will result in a faster interpreter at the cost of significantly longer build times. Most notably, this enables PGO (profile guided optimization). While your mileage may vary, it is common for performance improvement from this to be in the ballpark of 30%. ```sh env PYTHON_CONFIGURE_OPTS='--enable-optimizations --with-lto' PYTHON_CFLAGS='-march=native -mtune=native' pyenv install --verbose 3.6.0 ``` You can also customize the task used for profile guided optimization by setting the `PROFILE_TASK` environment variable, for instance, `PROFILE_TASK='-m test.regrtest --pgo -j0'` will run much faster than the default task. ### Checksum verification If you have the `shasum`, `openssl`, or `sha256sum` tool installed, python-build will automatically verify the SHA2 checksum of each downloaded package before installing it. Checksums are optional and specified as anchors on the package URL in each definition. (All bundled definitions include checksums.) ### Package download mirrors python-build will first attempt to download package files from a mirror hosted on GitHub Pages. If this fails, it will fall back to the official URL specified in the definition file. You can point python-build to another mirror by specifying the `PYTHON_BUILD_MIRROR_URL` environment variable. Package mirror URLs are constructed by joining `$PYTHON_BUILD_MIRROR_URL` with the SHA2 checksum of the package file as specified in the URL in the installation script (the part after the hash sign). E.g.: ``` https://mycache.example.com/0419e9085bf51b7a672009b3f50dbf1859acdf18ba725d0ec19aa5c8503f0ea3 ``` If you have replicated the directory structure of an official site, the easiest way to adapt would be to make symlinks at the mirror's root: ``` 0419e9085bf51b7a672009b3f50dbf1859acdf18ba725d0ec19aa5c8503f0ea3 -> 3.10.10/Python-3.10.10.tar.xz ``` The rationale is to abstract away difference between directory structures of sites of various Python flavors and their occasional changes as well as to accomodate people who only wish to cache some select downloads. This also allows to mirror multiple sites at once. If the mirror being used does not have the same checksum (*e.g.* with a pull-through cache like Artifactory), you can set the `PYTHON_BUILD_MIRROR_URL_SKIP_CHECKSUM` environment variable. If you don't have an SHA2 program installed, python-build will skip the download mirror and use official URLs instead. You can force python-build to bypass the mirror by setting the `PYTHON_BUILD_SKIP_MIRROR` environment variable. The official python-build download mirror is provided by [GitHub Pages](http://yyuu.github.io/pythons/). ### Package download cache Python-build will keep a cache of downloaded package files at the location specified by the `PYTHON_BUILD_CACHE_PATH` environment variable if it exists. The default is `~/.pyenv/cache`, so you can enable caching by just creating that directory. The name of the would-be cached file is reported by Pyenv in the "Downloading <filename>..." message. It's possible to warm up the cache by manually putting the file there under an appropriate name. ### Keeping the build directory after installation Both `python-build` and `pyenv install` accept the `-k` or `--keep` flag, which tells python-build to keep the downloaded source after installation. This can be useful if you need to use `gdb` and `memprof` with Python. Source code will be kept in a parallel directory tree `~/.pyenv/sources` when using `--keep` with the `pyenv install` command. You should specify the location of the source code with the `PYTHON_BUILD_BUILD_PATH` environment variable when using `--keep` with `python-build`. ## Getting Help Please see the [pyenv wiki](https://github.com/pyenv/pyenv/wiki) for solutions to common problems. [wiki]: https://github.com/pyenv/pyenv/wiki If you can't find an answer on the wiki, open an issue on the [issue tracker](https://github.com/pyenv/pyenv/issues). Be sure to include the full build log for build failures. ## Contributing ### Testing new python versions If you are contributing a new python version for python-build, you can test the build in a [docker](https://www.docker.com/) container based on Ubuntu 18.04. With docker installed: ```sh docker build -t my_container . docker run my_container pyenv install ``` To enter a shell which will allow you to build and then test a python version, replace the second line with ```sh docker run -it my_container ``` The container will need to be rebuilt whenever you change the repo, but after the first build, this will be very fast, as the layer including the build dependencies will be cached. Changes made inside the container will not be persisted. To test *all* new versions since a particular revision (e.g. `master`), `cd` to the root of your `pyenv` repo, and run this script: ```sh set -e set -x docker build -t pyenv-test-container . git diff --name-only master \ | grep '^plugins/python-build/share/python-build/' \ | awk -F '/' '{print $NF}' \ | xargs -I _ docker run pyenv-test-container pyenv install _ ``` - Build the docker image with the **t**ag pyenv-test-container - Look for the names files changed since revision `master` - Filter out any which don't live where python-build keeps its build scripts - Look only at the file name (i.e. the python version name) - Run a new docker container for each, building that version pyenv-pyenv-485090e/plugins/python-build/bin/000077500000000000000000000000001517431316200211445ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/bin/pyenv-install000077500000000000000000000211641517431316200237030ustar00rootroot00000000000000#!/usr/bin/env bash # # Summary: Install a Python version using python-build # # Usage: pyenv install [-f] [-kvp] ... # pyenv install [-f] [-kvp] # pyenv install -l|--list # pyenv install --version # # -l/--list List all available versions # -f/--force Install even if the version appears to be installed already # -s/--skip-existing Skip if the version appears to be installed already # # python-build options: # # -k/--keep Keep source tree in $PYENV_BUILD_ROOT after installation # (defaults to $PYENV_ROOT/sources) # -p/--patch Apply a patch from stdin before building # -v/--verbose Verbose mode: print compilation status to stdout # --version Show version of python-build # -g/--debug Build a debug version # # For detailed information on installing Python versions with # python-build, including a list of environment variables for adjusting # compilation, see: https://github.com/pyenv/pyenv#readme # set -e [ -n "$PYENV_DEBUG" ] && set -x # Add `share/python-build/` directory from each pyenv plugin to the list of # paths where build definitions are looked up. shopt -s nullglob for plugin_path in "$PYENV_ROOT"/plugins/*/share/python-build; do PYTHON_BUILD_DEFINITIONS="${PYTHON_BUILD_DEFINITIONS}:${plugin_path}" done export PYTHON_BUILD_DEFINITIONS shopt -u nullglob # Provide pyenv completions if [ "$1" = "--complete" ]; then echo --list echo --force echo --skip-existing echo --keep echo --patch echo --verbose echo --version echo --debug exec python-build --definitions fi # Load shared library functions eval "$(python-build --lib)" usage() { pyenv-help install 2>/dev/null [ -z "$1" ] || exit "$1" } definitions() { local query="$1" python-build --definitions | $(type -P ggrep grep | head -n1) -F "$query" || true } indent() { sed 's/^/ /' } unset FORCE unset SKIP_EXISTING unset KEEP unset VERBOSE unset HAS_PATCH unset DEBUG [ -n "$PYENV_DEBUG" ] && VERBOSE="-v" parse_options "$@" for option in "${OPTIONS[@]}"; do case "$option" in "h" | "help" ) usage 0 ;; "l" | "list" ) echo "Available versions:" definitions | indent exit ;; "f" | "force" ) FORCE=true ;; "s" | "skip-existing" ) SKIP_EXISTING=true ;; "k" | "keep" ) [ -n "${PYENV_BUILD_ROOT}" ] || PYENV_BUILD_ROOT="${PYENV_ROOT}/sources" ;; "v" | "verbose" ) VERBOSE="-v" ;; "p" | "patch" ) HAS_PATCH="-p" ;; "g" | "debug" ) DEBUG="-g" ;; "version" ) exec python-build --version ;; * ) usage 1 >&2 ;; esac done unset VERSION_NAME # The first argument contains the definition to install. If the # argument is missing, try to install whatever local app-specific # version is specified by pyenv. Show usage instructions if a local # version is not specified. DEFINITIONS=("${ARGUMENTS[@]}") [[ "${#DEFINITIONS[*]}" -eq 0 ]] && DEFINITIONS=($(pyenv-local 2>/dev/null || true)) [[ "${#DEFINITIONS[*]}" -eq 0 ]] && usage 1 >&2 # Define `before_install` and `after_install` functions that allow # plugin hooks to register a string of code for execution before or # after the installation process. declare -a before_hooks after_hooks before_install() { local hook="$1" before_hooks["${#before_hooks[@]}"]="$hook" } after_install() { local hook="$1" after_hooks["${#after_hooks[@]}"]="$hook" } # Plan cleanup on unsuccessful installation. cleanup() { [ -z "${PREFIX_EXISTS}" ] && rm -rf "$PREFIX" } trap cleanup SIGINT OLDIFS="$IFS" IFS=$'\n' scripts=(`pyenv-hooks install`) IFS="$OLDIFS" for script in "${scripts[@]}"; do source "$script"; done COMBINED_STATUS=0 for DEFINITION in "${DEFINITIONS[@]}"; do STATUS=0 # Try to resolve a prefix if user indeed gave a prefix. # We install the version under the resolved name # and hooks also see the resolved name DEFINITION="$(pyenv-latest -f -k "$DEFINITION")" # Set VERSION_NAME from $DEFINITION. Then compute the installation prefix. VERSION_NAME="${DEFINITION##*/}" [ -n "$DEBUG" ] && VERSION_NAME="${VERSION_NAME}-debug" PREFIX="${PYENV_ROOT}/versions/${VERSION_NAME}" [ -d "${PREFIX}" ] && PREFIX_EXISTS=1 # If the installation prefix exists, prompt for confirmation unless # the --force option was specified. if [ -d "${PREFIX}/bin" ]; then if [ -z "$FORCE" ] && [ -z "$SKIP_EXISTING" ]; then echo "pyenv: $PREFIX already exists" >&2 read -p "continue with installation? (y/N) " case "$REPLY" in y | Y | yes | YES ) ;; * ) { STATUS=1; [[ $STATUS -gt $COMBINED_STATUS ]] && COMBINED_STATUS=$STATUS; }; continue ;; esac elif [ -n "$SKIP_EXISTING" ]; then # Since we know the python version is already installed, and are opting to # not force installation of existing versions, we just `exit 0` here to # leave things happy continue fi fi # If PYENV_BUILD_ROOT is set, always pass keep options to python-build. if [ -n "${PYENV_BUILD_ROOT}" ]; then export PYTHON_BUILD_BUILD_PATH="${PYENV_BUILD_ROOT}/${VERSION_NAME}" KEEP="-k" fi # Set PYTHON_BUILD_CACHE_PATH to $PYENV_ROOT/cache, if the directory # exists and the variable is not already set. if [ -z "${PYTHON_BUILD_CACHE_PATH}" ] && [ -d "${PYENV_ROOT}/cache" ]; then export PYTHON_BUILD_CACHE_PATH="${PYENV_ROOT}/cache" fi if [ -z "${PYENV_BOOTSTRAP_VERSION}" ]; then case "${VERSION_NAME}" in [23]"."* ) # Default PYENV_VERSION to the friendly Python version. (The # CPython installer requires an existing Python installation to run. An # unsatisfied local .python-version file can cause the installer to # fail.) for version_info in "${VERSION_NAME%-dev}" "${VERSION_NAME%.*}" "${VERSION_NAME%%.*}"; do # Anaconda's `curl` doesn't work on platform where `/etc/pki/tls/certs/ca-bundle.crt` isn't available (e.g. Debian) for version in $(pyenv-whence "python${version_info}" 2>/dev/null || true); do if [[ "${version}" != "anaconda"* ]] && [[ "${version}" != "miniconda"* ]]; then PYENV_BOOTSTRAP_VERSION="${version}" break 2 fi done done ;; "pypy"*"-dev" | "pypy"*"-src" ) # PyPy/PyPy3 requires existing Python 2.7 to build if [ -n "${PYENV_RPYTHON_VERSION}" ]; then PYENV_BOOTSTRAP_VERSION="${PYENV_RPYTHON_VERSION}" else for version in $(pyenv-versions --bare | sort -r); do if [[ "${version}" == "2.7"* ]]; then PYENV_BOOTSTRAP_VERSION="$version" break fi done fi if [ -n "$PYENV_BOOTSTRAP_VERSION" ]; then for dep in pycparser; do if ! PYENV_VERSION="$PYENV_BOOTSTRAP_VERSION" pyenv-exec python -c "import ${dep}" 1>/dev/null 2>&1; then echo "pyenv-install: $VERSION_NAME: PyPy requires \`${dep}' in $PYENV_BOOTSTRAP_VERSION to build from source." >&2 exit 1 fi done else echo "pyenv-install: $VERSION_NAME: PyPy requires Python 2.7 to build from source." >&2 exit 1 fi ;; esac fi if [ -n "${PYENV_BOOTSTRAP_VERSION}" ]; then export PYENV_VERSION="${PYENV_BOOTSTRAP_VERSION}" fi # Execute `before_install` hooks. for hook in "${before_hooks[@]}"; do eval "$hook"; done # Invoke `python-build` and record the exit status in $STATUS. python-build $KEEP $VERBOSE $HAS_PATCH $DEBUG "$DEFINITION" "$PREFIX" || \ { STATUS=$?; [[ $STATUS -gt $COMBINED_STATUS ]] && COMBINED_STATUS=$STATUS; } # Display a more helpful message if the definition wasn't found. if [ "$STATUS" == "2" ]; then { candidates="$(definitions "$DEFINITION")" if [ -n "$candidates" ]; then echo echo "The following versions contain \`$DEFINITION' in the name:" echo "$candidates" | indent fi echo echo "See all available versions with \`pyenv install --list'." echo echo -n "If the version you need is missing, try upgrading pyenv" declare brew_prefix if brew_prefix="$(brew --prefix 2>/dev/null)" && [[ $_PYENV_INSTALL_PREFIX/ == "$brew_prefix/"* ]]; then printf ":\n\n" echo " brew update && brew upgrade pyenv" elif [ -d "${_PYENV_INSTALL_PREFIX}/.git" ]; then printf ":\n\n" echo " cd ${_PYENV_INSTALL_PREFIX} && git pull && cd -" else printf ".\n" fi } >&2 fi # Execute `after_install` hooks. for hook in "${after_hooks[@]}"; do eval "$hook"; done # Run `pyenv-rehash` after a successful installation. if [[ $STATUS -eq 0 ]]; then pyenv-rehash else cleanup break fi done exit "${COMBINED_STATUS}" pyenv-pyenv-485090e/plugins/python-build/bin/pyenv-uninstall000077500000000000000000000036171517431316200242510ustar00rootroot00000000000000#!/usr/bin/env bash # # Summary: Uninstall Python versions # # Usage: pyenv uninstall [-f|--force] ... # # -f Attempt to remove the specified version without prompting # for confirmation. If the version does not exist, do not # display an error message. # # See `pyenv versions` for a complete list of installed versions. # set -e [ -n "$PYENV_DEBUG" ] && set -x # Provide pyenv completions if [ "$1" = "--complete" ]; then echo --force exec pyenv versions --bare fi usage() { pyenv-help uninstall 2>/dev/null [ -z "$1" ] || exit "$1" } if [ "$1" = "-h" ] || [ "$1" = "--help" ]; then usage 0 fi unset FORCE if [ "$1" = "-f" ] || [ "$1" = "--force" ]; then FORCE=true shift fi [ "$#" -gt 0 ] || usage 1 >&2 versions=("$@") for version in "${versions[@]}"; do case "$version" in "" | -* ) usage 1 >&2 ;; esac done declare -a before_hooks after_hooks before_uninstall() { local hook="$1" before_hooks["${#before_hooks[@]}"]="$hook" } after_uninstall() { local hook="$1" after_hooks["${#after_hooks[@]}"]="$hook" } OLDIFS="$IFS" IFS=$'\n' scripts=(`pyenv-hooks uninstall`) IFS="$OLDIFS" for script in "${scripts[@]}"; do source "$script"; done uninstall-python() { local DEFINITION="$1" local VERSION_NAME="${DEFINITION##*/}" local PREFIX="${PYENV_ROOT}/versions/${VERSION_NAME}" if [ -z "$FORCE" ]; then if [ ! -d "$PREFIX" ]; then echo "pyenv: version \`$VERSION_NAME' not installed" >&2 exit 1 fi read -p "pyenv: remove $PREFIX? (y/N) " case "$REPLY" in y | Y | yes | YES ) ;; * ) exit 1 ;; esac fi for hook in "${before_hooks[@]}"; do eval "$hook"; done if [ -d "$PREFIX" ]; then rm -rf "$PREFIX" pyenv-rehash echo "pyenv: $VERSION_NAME uninstalled" fi for hook in "${after_hooks[@]}"; do eval "$hook"; done } for version in "${versions[@]}"; do uninstall-python "$version" done pyenv-pyenv-485090e/plugins/python-build/bin/python-build000077500000000000000000002402221517431316200235120ustar00rootroot00000000000000#!/usr/bin/env bash # # Usage: python-build [-kpv] # python-build --definitions # python-build --version # # -k/--keep Do not remove source tree after installation # -p/--patch Apply a patch from stdin before building # -v/--verbose Verbose mode: print compilation status to stdout # -4/--ipv4 Resolve names to IPv4 addresses only # -6/--ipv6 Resolve names to IPv6 addresses only # --definitions List all built-in definitions # --version Show version of python-build # -g/--debug Build a debug version # PYTHON_BUILD_VERSION="2.6.28" OLDIFS="$IFS" set -E shopt -s extglob [ -n "$PYENV_DEBUG" ] && { export PS4='+(${BASH_SOURCE}:${LINENO}): ${FUNCNAME[0]:+${FUNCNAME[0]}(): }' set -x } exec 3<&2 # preserve original stderr at fd 3 lib() { parse_options() { OPTIONS=() ARGUMENTS=() local arg option index for arg in "$@"; do if [ "${arg:0:1}" = "-" ]; then if [ "${arg:1:1}" = "-" ]; then OPTIONS[${#OPTIONS[*]}]="${arg:2}" else index=1 while option="${arg:$index:1}"; do [ -n "$option" ] || break OPTIONS[${#OPTIONS[*]}]="$option" index=$(($index+1)) done fi else ARGUMENTS[${#ARGUMENTS[*]}]="$arg" fi done } if [ "$1" == "--$FUNCNAME" ]; then declare -f "$FUNCNAME" echo "$FUNCNAME \"\$1\";" exit fi } lib "$1" READLINK=$(type -P readlink) if [ -z "$READLINK" ]; then echo "pyenv: cannot find readlink - are you missing GNU coreutils?" >&2 exit 1 fi resolve_link() { $READLINK "$1" } abs_dirname() { local path="$1" # Use a subshell to avoid changing the current path ( while [ -n "$path" ]; do cd_path="${path%/*}" if [[ "$cd_path" != "$path" ]]; then cd "$cd_path" fi name="${path##*/}" if [[ $name == ".." ]]; then cd .. path="$PWD" else path="$(resolve_link "$name" || true)" fi done echo "$PWD" ) } capitalize() { printf "%s" "$1" | tr a-z A-Z } sanitize() { printf "%s" "$1" | sed "s/[^A-Za-z0-9.-]/_/g; s/__*/_/g" } colorize() { if [ -t 1 ]; then printf "\e[%sm%s\e[m" "$1" "$2" else echo -n "$2" fi } os_information() { if type -p lsb_release >/dev/null; then lsb_release -sir | xargs echo elif type -p sw_vers >/dev/null; then echo "OS X ${_PYTHON_BUILD_CACHE_SW_VERS:=$(sw_vers -productVersion)}" elif [ -r /etc/os-release ]; then source /etc/os-release echo "$NAME" $VERSION_ID else local os="$(cat /etc/{centos,redhat,fedora,system}-release /etc/debian_version 2>/dev/null | head -n1)" echo "${os:-$(uname -sr)}" fi } is_mac() { [ "${_PYTHON_BUILD_CACHE_UNAME_S:=$(uname -s)}" = "Darwin" ] || return 1 [ $# -eq 0 ] || [ "$(osx_version)" "$@" ] } can_use_homebrew() { if locked_in; then locked_in homebrew && rc=$? || rc=$?; return $rc fi [[ -n "$PYTHON_BUILD_USE_HOMEBREW" && -n "$PYTHON_BUILD_SKIP_HOMEBREW" ]] && { echo "error: mutually exclusive environment variables PYTHON_BUILD_USE_HOMEBREW and PYTHON_BUILD_SKIP_HOMEBREW are set" >&3 exit 1 } [[ -n "$PYTHON_BUILD_USE_HOMEBREW" ]] && return 0 [[ -n "$PYTHON_BUILD_SKIP_HOMEBREW" ]] && return 1 is_mac && command -v brew &>/dev/null && return 0 # In Linux, if Pyenv itself is installed with Homebrew, # we assume the user wants to take dependencies from there as well by default local brew_prefix command -v brew &>/dev/null && \ # tests can have non-functional `brew' stub aliased to `false' # in Bash 3.2, var="$(cmd)" errexits on failure even if part of a conditional chain brew_prefix="$(brew --prefix || true)" && [[ -n "$brew_prefix" ]] && \ [[ $(abs_dirname "${BASH_SOURCE}") == "$(abs_dirname "${brew_prefix}")"/* ]] && \ { lock_in homebrew; return 0; } # do not check the same stuff multiple times PYTHON_BUILD_SKIP_HOMEBREW=1; return 1 } can_use_macports() { if locked_in; then locked_in macports && rc=$? || rc=$?; return $rc fi [[ -n "$PYTHON_BUILD_USE_MACPORTS" && -n "$PYTHON_BUILD_SKIP_MACPORTS" ]] && { echo "error: mutually exclusive environment variables PYTHON_BUILD_USE_MACPORTS and PYTHON_BUILD_SKIP_MACPORTS are set" >&3 exit 1 } [[ -n "$PYTHON_BUILD_USE_MACPORTS" ]] && return 0 [[ -n "$PYTHON_BUILD_SKIP_MACPORTS" ]] && return 1 is_mac && command -v port &>/dev/null && return 0 # do not check the same stuff multiple times PYTHON_BUILD_SKIP_MACPORTS=1; return 1 } locked_in() { if [[ -z "$1" ]]; then [[ -n $_PYTHON_BUILD_ECOSYSTEM_LOCKED_IN ]] else [[ $_PYTHON_BUILD_ECOSYSTEM_LOCKED_IN == "$1" ]] fi } lock_in() { _PYTHON_BUILD_ECOSYSTEM_LOCKED_IN=${1:?} } # 9.1 -> 901 # 10.9 -> 1009 # 10.10 -> 1010 osx_version() { local -a ver IFS=. ver=( ${_PYTHON_BUILD_CACHE_SW_VERS:=$(sw_vers -productVersion)} ) IFS="$OLDIFS" echo $(( ${ver[0]}*100 + ${ver[1]} )) } build_failed() { { echo colorize 1 "BUILD FAILED" echo " ($(os_information) using $(version))" echo if ! rmdir "${BUILD_PATH}" 2>/dev/null; then echo "Inspect or clean up the working tree at ${BUILD_PATH}" fi if file_is_not_empty "$LOG_PATH"; then colorize 33 "Results logged to ${LOG_PATH}" printf "\n\n" echo "Last 10 log lines:" TAIL=`tail -n 10 "$LOG_PATH"` echo "$TAIL" if echo "$TAIL" | grep -q "no acceptable C compiler found"; then printf "\n" echo "Are the build dependencies for Python correctly installed?" echo "Please consult to the Wiki page for more info." echo "https://github.com/pyenv/pyenv/wiki#suggested-build-environment" fi fi } >&3 exit 1 } file_is_not_empty() { local filename="$1" local line_count="$(wc -l "$filename" 2>/dev/null || true)" if [ -n "$line_count" ]; then words=( $line_count ) [ "${words[0]}" -gt 0 ] else return 1 fi } num_cpu_cores() { local num case "${_PYTHON_BUILD_CACHE_UNAME_S:=$(uname -s)}" in Darwin | *BSD ) num="$(sysctl -n hw.ncpu 2>/dev/null || true)" ;; SunOS ) num="$(getconf NPROCESSORS_ONLN 2>/dev/null || true)" ;; * ) num="$({ getconf _NPROCESSORS_ONLN || grep -c ^processor /proc/cpuinfo; } 2>/dev/null)" num="${num#0}" ;; esac echo "${num:-2}" } install_package() { install_package_using "tarball" 1 "$@" } install_nightly_package() { install_package_using "nightly_tarball" 2 "$@" } install_git() { install_package_using "git" 2 "$@" } install_hg() { install_package_using "hg" 2 "$@" } install_svn() { install_package_using "svn" 2 "$@" } install_jar() { install_package_using "jar" 1 "$@" } install_zip() { install_package_using "zip" 1 "$@" } install_script() { install_package_using "script" 1 "$@" } install_package_using() { local package_type="$1" local package_type_nargs="$2" local package_name="$3" shift 3 local fetch_args=( "$package_name" "${@:1:$package_type_nargs}" ) local make_args=( "$package_name" ) local arg last_arg for arg in "${@:$(( $package_type_nargs + 1 ))}"; do if [ "$last_arg" = "--if" ]; then "$arg" || return 0 elif [ "$arg" != "--if" ]; then make_args["${#make_args[@]}"]="$arg" fi last_arg="$arg" done pushd "$BUILD_PATH" >&4 "fetch_${package_type}" "${fetch_args[@]}" make_package "${make_args[@]}" popd >&4 echo "Installed ${package_name} to ${PREFIX_PATH}" >&2 } make_package() { local package_name="$1" shift pushd "$package_name" >&4 setup_builtin_patches "$package_name" before_install_package "$package_name" build_package "$package_name" $* after_install_package "$package_name" cleanup_builtin_patches "$package_name" fix_directory_permissions popd >&4 } compute_sha2() { local output if type shasum &>/dev/null; then output="$(shasum -a 256 -b)" || return 1 echo "${output% *}" elif type openssl &>/dev/null; then local openssl="$(command -v "$(brew --prefix openssl 2>/dev/null || true)"/bin/openssl openssl | head -n1)" output="$("$openssl" dgst -sha256 2>/dev/null)" || return 1 echo "${output##* }" elif type sha256sum &>/dev/null; then output="$(sha256sum -b)" || return 1 echo "${output%% *}" else return 1 fi } compute_md5() { local output if type md5 &>/dev/null; then md5 -q elif type openssl &>/dev/null; then output="$(openssl md5)" || return 1 echo "${output##* }" elif type md5sum &>/dev/null; then output="$(md5sum -b)" || return 1 echo "${output%% *}" else return 1 fi } has_checksum_support() { local checksum_command="$1" local has_checksum_var="HAS_CHECKSUM_SUPPORT_${checksum_command}" if [ -z "${!has_checksum_var+defined}" ]; then printf -v "$has_checksum_var" "$(echo test | "$checksum_command" >/dev/null; echo $?)" fi return "${!has_checksum_var}" } verify_checksum() { local checksum_command local filename="$1" local expected_checksum="$(echo "$2" | tr [A-Z] [a-z])" # If the specified filename doesn't exist, return success [ -e "$filename" ] || return 0 case "${#expected_checksum}" in 0) return 0 ;; # empty checksum; return success 32) checksum_command="compute_md5" ;; 64) checksum_command="compute_sha2" ;; *) { echo echo "unexpected checksum length: ${#expected_checksum} (${expected_checksum})" echo "expected 0 (no checksum), 32 (MD5), or 64 (SHA2-256)" echo } >&4 return 1 ;; esac # If chosen provided checksum algorithm isn't supported, return success has_checksum_support "$checksum_command" || return 0 # If the computed checksum is empty, return failure local computed_checksum=`echo "$($checksum_command < "$filename")" | tr [A-Z] [a-z]` [ -n "$computed_checksum" ] || return 1 if [ "$expected_checksum" != "$computed_checksum" ]; then { echo echo "checksum mismatch: ${filename} (file is corrupt)" echo "expected $expected_checksum, got $computed_checksum" echo } >&4 return 1 fi } http() { local method="$1" [ -n "$2" ] || return 1 shift 1 PYTHON_BUILD_HTTP_CLIENT="${PYTHON_BUILD_HTTP_CLIENT:-$(detect_http_client)}" [ -n "$PYTHON_BUILD_HTTP_CLIENT" ] || return 1 "http_${method}_${PYTHON_BUILD_HTTP_CLIENT}" "$@" } detect_http_client() { local client for client in aria2c curl wget; do if type "$client" &>/dev/null; then echo "$client" return fi done echo "error: please install \`aria2c\`, \`curl\`, or \`wget\` and try again" >&2 return 1 } http_head_aria2c() { aria2c --dry-run --no-conf=true ${ARIA2_OPTS} "$1" >&4 2>&1 } http_get_aria2c() { # aria2c always treats -o argument as a relative path local out dir_out; if [[ -n "$2" ]]; then out="$(basename $2)"; dir_out="$(dirname $2)"; else out="$(mktemp "out.XXXXXX")"; dir_out="$TMPDIR"; fi # In Ubuntu, aria2c is only available as a snap. Snaps cannot read or write /tmp # (files cannot be found, any write result is silently discarded). local aria2c_is_snap; if [[ $(command -v aria2c) == "/snap/"* ]]; then aria2c_is_snap=1; fi if [[ -n $aria2c_is_snap ]]; then local real_dir_out="$dir_out" # presumably, snaps can always write to under $HOME dir_out="$HOME" fi if aria2c --allow-overwrite=true --no-conf=true -d "${dir_out}" -o "${out}" ${ARIA2_OPTS} "$1" >&4; then [ -n "$2" ] || cat "${dir_out:-.}/${out}" else false fi ret=$? if [[ -n "$2" && -n $aria2c_is_snap ]]; then mv "$dir_out/$out" "$real_dir_out/$out" fi return "$ret" } http_head_curl() { curl -qsILf ${CURL_OPTS} "$1" >&4 2>&1 } http_get_curl() { local out; # Curl is also available as a snap. Snaps cannot read or write /tmp # (files cannot be found, any write result is silently discarded). local curl_is_snap; if [[ $(command -v curl) == "/snap/"* ]]; then curl_is_snap=1; fi if [[ -n $2 && -n $curl_is_snap ]]; then out="$HOME/$(basename "$2")"; else out="$2"; fi curl -q -o "${out:--}" -sSLf ${CURL_OPTS} "$1" || return $? if [[ -n $out && -n $curl_is_snap ]]; then mv "$out" "$2"; fi } http_head_wget() { wget -q --spider ${WGET_OPTS} "$1" >&4 2>&1 } http_get_wget() { wget -nv ${WGET_OPTS} -O "${2:--}" "$1" } fetch_tarball() { local package_name="$1" local package_url="$2" local mirror_url local checksum local extracted_dir if [ "$package_url" != "${package_url/\#}" ]; then checksum="${package_url#*#}" package_url="${package_url%%#*}" if [ -n "$PYTHON_BUILD_MIRROR_URL" ]; then if [[ -z "$PYTHON_BUILD_DEFAULT_MIRROR" || $package_url != */www.python.org/* ]]; then mirror_url="${PYTHON_BUILD_MIRROR_URL}/$checksum" fi fi fi local tar_args="xzf" local package_filename="${package_name}.tar.gz" if [ "$package_url" != "${package_url%bz2}" ]; then if ! type -p bzip2 >/dev/null; then echo "warning: bzip2 not found; consider installing \`bzip2\` package" >&4 fi package_filename="${package_filename%.gz}.bz2" tar_args="${tar_args/z/j}" fi if [ "$package_url" != "${package_url%xz}" ]; then if ! type -p xz >/dev/null; then echo "warning: xz not found; consider installing \`xz\` package" >&4 fi package_filename="${package_filename%.gz}.xz" tar_args="${tar_args/z/J}" fi if ! reuse_existing_tarball "$package_filename" "$checksum"; then # Report the cached file name -- sometimes, it's useful to know (#1743) echo "Downloading ${package_filename}..." >&2 http head "$mirror_url" && download_tarball "$mirror_url" "$package_filename" "$checksum" || download_tarball "$package_url" "$package_filename" "$checksum" fi { if tar $tar_args "$package_filename"; then if [ ! -d "$package_name" ]; then extracted_dir="$(find_extracted_directory)" mv "$extracted_dir" "$package_name" fi if [ -z "$KEEP_BUILD_PATH" ]; then rm -f "$package_filename" else true fi fi } >&4 2>&1 } find_extracted_directory() { for f in *; do if [ -d "$f" ]; then echo "$f" return fi done echo "Extracted directory not found" >&2 return 1 } fetch_nightly_tarball() { local package_name="$1" local package_url="$2" local package_pattern="$3" fetch_tarball "$1" "$2" if [ ! -e "${package_name}" ]; then local nightly_package_name="$(echo ${package_pattern})" if [ -e "${nightly_package_name}" ]; then ln -fs "${nightly_package_name}" "${package_name}" fi fi } reuse_existing_tarball() { local package_filename="$1" local checksum="$2" # Reuse existing file in build location if [ -e "$package_filename" ] && verify_checksum "$package_filename" "$checksum"; then return 0 fi # Reuse previously downloaded file in cache location [ -n "$PYTHON_BUILD_CACHE_PATH" ] || return 1 local cached_package_filename="${PYTHON_BUILD_CACHE_PATH}/$package_filename" [ -e "$cached_package_filename" ] || return 1 verify_checksum "$cached_package_filename" "$checksum" >&4 2>&1 || return 1 ln -s "$cached_package_filename" "$package_filename" >&4 2>&1 || return 1 } download_tarball() { local official_source="www.python.org/ftp/python" if [ -n "$PYTHON_BUILD_MIRROR_URL_SKIP_CHECKSUM" ]; then local package_url="$(echo "$1" | sed -e "s|.*//${URL_BASE:-$official_source}|$PYTHON_BUILD_MIRROR_URL|g")" else local package_url="$1" fi [ -n "$package_url" ] || return 1 local package_filename="$2" local checksum="$3" echo "-> $package_url" >&2 if http get "$package_url" "$package_filename" >&4 2>&1; then verify_checksum "$package_filename" "$checksum" >&4 2>&1 || return 1 else echo "error: failed to download $package_filename" >&2 return 1 fi if [ -n "$PYTHON_BUILD_CACHE_PATH" ]; then local cached_package_filename="${PYTHON_BUILD_CACHE_PATH}/$package_filename" { mv "$package_filename" "$cached_package_filename" ln -s "$cached_package_filename" "$package_filename" } >&4 2>&1 || return 1 fi } has_tar_xz_support() { [[ -z $_PYTHON_BUILD_FORCE_SKIP_XZ ]] && tar Jcf - /dev/null 1>/dev/null 2>&1 } fetch_git() { local package_name="$1" local git_url="$2" local git_ref="$3" echo "Cloning ${git_url}..." >&2 if type git &>/dev/null; then if [ -n "$PYTHON_BUILD_CACHE_PATH" ]; then pushd "$PYTHON_BUILD_CACHE_PATH" >&4 local clone_name="$(sanitize "$git_url")" if [ -e "${clone_name}" ]; then { cd "${clone_name}" git fetch --force "$git_url" "+${git_ref}:${git_ref}" } >&4 2>&1 else git clone --bare --branch "$git_ref" "$git_url" "${clone_name}" >&4 2>&1 fi git_url="$PYTHON_BUILD_CACHE_PATH/${clone_name}" popd >&4 fi if [ -e "${package_name}" ]; then ( cd "${package_name}" git fetch --depth 1 origin "+${git_ref}" git checkout -q -B "$git_ref" "origin/${git_ref}" ) >&4 2>&1 else git clone --depth 1 --branch "$git_ref" "$git_url" "${package_name}" >&4 2>&1 fi else echo "error: please install \`git\` and try again" >&2 exit 1 fi } fetch_hg() { local package_name="$1" local hg_url="$2" local hg_ref="$3" echo "Cloning ${hg_url}..." >&2 if type hg &>/dev/null; then if [ -n "$PYTHON_BUILD_CACHE_PATH" ]; then pushd "$PYTHON_BUILD_CACHE_PATH" >&4 local clone_name="$(sanitize "$hg_url")" if [ -e "${clone_name}" ]; then { cd "${clone_name}" hg pull --force "$hg_url" } >&4 2>&1 else { hg clone --branch "$hg_ref" "$hg_url" "${clone_name}" cd "${clone_name}" hg update null } >&4 2>&1 fi hg_url="$PYTHON_BUILD_CACHE_PATH/${clone_name}" popd >&4 fi hg clone --branch "$hg_ref" "$hg_url" "${package_name}" >&4 2>&1 else echo "error: please install \`mercurial\` and try again" >&2 exit 1 fi } fetch_svn() { local package_name="$1" local svn_url="$2" local svn_rev="$3" echo "Checking out ${svn_url}..." >&2 if type svn &>/dev/null; then svn co -r "$svn_rev" "$svn_url" "${package_name}" >&4 2>&1 elif type svnlite &>/dev/null; then svnlite co -r "$svn_rev" "$svn_url" "${package_name}" >&4 2>&1 else echo "error: please install Subversion and try again" >&2 exit 1 fi } fetch_jar() { local package_name="$1" local package_url="$2" local mirror_url local checksum if [ "$package_url" != "${package_url/\#}" ]; then checksum="${package_url#*#}" package_url="${package_url%%#*}" if [ -n "$PYTHON_BUILD_MIRROR_URL" ]; then mirror_url="${PYTHON_BUILD_MIRROR_URL}/$checksum" fi fi local package_filename="${package_name}.jar" if ! reuse_existing_tarball "$package_filename" "$checksum"; then echo "Downloading ${package_filename}..." >&2 http head "$mirror_url" && download_tarball "$mirror_url" "$package_filename" "$checksum" || download_tarball "$package_url" "$package_filename" "$checksum" fi # Must use full path to jar and destination directory: # http://bugs.jython.org/issue2350 { if $JAVA -jar "$PWD/${package_name}.jar" -s -d "$PWD/${package_name}"; then if [ -z "$KEEP_BUILD_PATH" ]; then rm -f "$package_filename" else true fi fi } >&4 2>&1 } fetch_zip() { local package_name="$1" local package_url="$2" local mirror_url local checksum if [ "$package_url" != "${package_url/\#}" ]; then checksum="${package_url#*#}" package_url="${package_url%%#*}" if [ -n "$PYTHON_BUILD_MIRROR_URL" ]; then mirror_url="${PYTHON_BUILD_MIRROR_URL}/$checksum" fi fi local package_filename="${package_name}.zip" if ! reuse_existing_tarball "$package_filename" "$checksum"; then echo "Downloading ${package_filename}..." >&2 http head "$mirror_url" && download_tarball "$mirror_url" "$package_filename" "$checksum" || download_tarball "$package_url" "$package_filename" "$checksum" fi { if unzip "$package_filename"; then if [ -z "$KEEP_BUILD_PATH" ]; then rm -f "$package_filename" else true fi fi } >&4 2>&1 } fetch_script() { local package_name="$1" local package_url="$2" local mirror_url local checksum if [ "$package_url" != "${package_url/\#}" ]; then checksum="${package_url#*#}" package_url="${package_url%%#*}" if [ -n "$PYTHON_BUILD_MIRROR_URL" ]; then mirror_url="${PYTHON_BUILD_MIRROR_URL}/$checksum" fi fi local package_filename="${package_name}.sh" # TODO: extract suffix from ${package_url} if ! reuse_existing_tarball "$package_filename" "$checksum"; then echo "Downloading ${package_filename}..." >&2 http head "$mirror_url" && download_tarball "$mirror_url" "$package_filename" "$checksum" || download_tarball "$package_url" "$package_filename" "$checksum" fi mkdir -p "$(dirname "${package_name}/${package_filename}")" mv -f "${package_filename}" "${package_name}/${package_filename}" } build_package() { local package_name="$1" shift if [ "$#" -eq 0 ]; then local commands="standard" else local commands="$*" fi echo "Installing ${package_name}..." >&2 [ -n "$HAS_PATCH" ] && apply_patch "$package_name" <(cat "${package_name}.patch") for command in $commands; do "build_package_${command}" "$package_name" done } package_option() { local package_name="$1" local command_name="$2" local variable="$(capitalize "${package_name}_${command_name}")_OPTS_ARRAY" local array="$variable[@]" shift 2 local value=( "${!array}" "$@" ) eval "$variable=( \"\${value[@]}\" )" } build_package_warn_eol() { local package_name="$1" { echo echo "WARNING: $package_name is past its end of life and is now unsupported." echo "It no longer receives bug fixes or critical security updates." echo } >&3 } build_package_warn_unsupported() { local package_name="$1" { echo echo "WARNING: $package_name is nearing its end of life." echo "It only receives critical security updates, no bug fixes." echo } >&3 } build_package_standard_build() { local package_name="$1" if [ "${MAKEOPTS+defined}" ]; then MAKE_OPTS="$MAKEOPTS" elif [ -z "${MAKE_OPTS+defined}" ]; then MAKE_OPTS="-j $(num_cpu_cores)" fi # Support YAML_CONFIGURE_OPTS, PYTHON_CONFIGURE_OPTS, etc. local package_var_name="$(capitalize "${package_name%%-*}")" local PACKAGE_CONFIGURE="${package_var_name}_CONFIGURE" local PACKAGE_PREFIX_PATH="${package_var_name}_PREFIX_PATH" local PACKAGE_CONFIGURE_OPTS="${package_var_name}_CONFIGURE_OPTS" local PACKAGE_CONFIGURE_OPTS_ARRAY="${package_var_name}_CONFIGURE_OPTS_ARRAY[@]" local PACKAGE_MAKE_OPTS="${package_var_name}_MAKE_OPTS" local PACKAGE_MAKE_OPTS_ARRAY="${package_var_name}_MAKE_OPTS_ARRAY[@]" local PACKAGE_CFLAGS="${package_var_name}_CFLAGS" local PACKAGE_CPPFLAGS="${package_var_name}_CPPFLAGS" local PACKAGE_LDFLAGS="${package_var_name}_LDFLAGS" if [ "$package_var_name" = "PYTHON" ]; then if can_use_homebrew; then use_custom_tcltk || use_homebrew_tcltk || true use_homebrew_readline || true use_homebrew_ncurses || true if is_mac -ge 1014; then # While XCode SDK is "always available", # still need a fallback in case we are using an alternate compiler use_xcode_sdk_zlib || use_homebrew_zlib || true else use_homebrew_zlib || true fi fi if can_use_macports; then use_custom_tcltk || true use_macports_readline || true use_macports_ncurses || true if is_mac -ge 1014; then # While XCode SDK is "always available", # still need a fallback in case we are using an alternate compiler use_xcode_sdk_zlib || use_homebrew_zlib || true else use_macports_zlib || true fi fi if can_use_homebrew; then use_homebrew || true fi if can_use_macports; then use_macports || true fi if is_mac -ge 1014 && ! can_use_homebrew && ! can_use_macports; then use_xcode_sdk_zlib || true fi use_freebsd_pkg || true use_dsymutil || true use_free_threading || true fi ( if [[ -n "${!PACKAGE_CFLAGS}" ]]; then export CFLAGS="${CFLAGS:+$CFLAGS }${!PACKAGE_CFLAGS}" fi if [[ -n "${!PACKAGE_CPPFLAGS}" ]]; then export CPPFLAGS="${CPPFLAGS:+$CPPFLAGS }${!PACKAGE_CPPFLAGS}" fi if [[ -n "${!PACKAGE_LDFLAGS}" ]]; then export LDFLAGS="${LDFLAGS:+$LDFLAGS }${!PACKAGE_LDFLAGS}" fi if [ -z "$CC" ] && is_mac -ge 1010; then export CC=clang fi ${!PACKAGE_CONFIGURE:-./configure} --prefix="${!PACKAGE_PREFIX_PATH:-$PREFIX_PATH}" \ "${!PACKAGE_CONFIGURE_OPTS_ARRAY}" $CONFIGURE_OPTS ${!PACKAGE_CONFIGURE_OPTS} || return 1 ) >&4 2>&1 { "$MAKE" "${!PACKAGE_MAKE_OPTS_ARRAY}" $MAKE_OPTS ${!PACKAGE_MAKE_OPTS} } >&4 2>&1 } build_package_standard_install() { local package_name="$1" local package_var_name="$(capitalize "${package_name%%-*}")" local PACKAGE_MAKE_INSTALL_OPTS="${package_var_name}_MAKE_INSTALL_OPTS" local PACKAGE_MAKE_INSTALL_OPTS_ARRAY="${package_var_name}_MAKE_INSTALL_OPTS_ARRAY[@]" local PACKAGE_MAKE_INSTALL_TARGET="${package_var_name}_MAKE_INSTALL_TARGET" { "$MAKE" "${!PACKAGE_MAKE_INSTALL_TARGET:-install}" $MAKE_INSTALL_OPTS ${!PACKAGE_MAKE_INSTALL_OPTS} "${!PACKAGE_MAKE_INSTALL_OPTS_ARRAY}" } >&4 2>&1 } # Backward Compatibility for standard function build_package_standard() { build_package_standard_build "$@" build_package_standard_install "$@" } build_package_autoconf() { { autoreconf } >&4 2>&1 } build_package_python() { local package_name="$1" { "$PYTHON_BIN" setup.py install } >&4 2>&1 } remove_windows_files() { cd "$PREFIX_PATH" rm -f bin/*.exe bin/*.dll bin/*.bat } build_package_jython() { build_package_copy { if [ -x "${PREFIX_PATH}/bin/jython" ] && [ ! -x "${PREFIX_PATH}/bin/python" ]; then ( cd "${PREFIX_PATH}/bin" && ln -fs jython python ) fi } >&4 2>&1 fix_jython_shebangs } fix_jython_shebangs() { # Workaround for Jython 2.7+ (#458) for file in "${PREFIX_PATH}/bin"/*; do case "$(head -n1 "${file}")" in "#!"*"/bin/jython" ) sed -i.bak "1 s:.*:#\!${PREFIX_PATH}\/bin\/jython:" "${file}" ;; "#!"*"/bin/python2.7"* ) sed -i.bak "1 s:.*:#\!\/usr\/bin\/env python:" "${file}" ;; esac rm -f "${file}.bak" done } build_package_jython_builder() { ant >&4 2>&1 ( cd "dist" && build_package_jython ) } build_package_pyston2_2() { # currently supported version 2.2 and 2.3 build_package_copy mkdir -p "${PREFIX_PATH}/bin" "${PREFIX_PATH}/lib" local bin shopt -s nullglob for bin in "bin/"*; do if [ -f "${bin}" ] && [ -x "${bin}" ] && [ ! -L "${bin}" ]; then case "${bin##*/}" in "pyston"* ) ( cd "${PREFIX_PATH}/bin" && ln -fs "${bin##*/}" "python" ) ;; esac fi done shopt -u nullglob } build_package_pyston() { # currently supported version 2.3.1v2 and higher build_package_copy } build_package_ironpython() { mkdir -p "${PREFIX_PATH}/bin" cp -fR . "${PREFIX_PATH}/bin" chmod +x "${PREFIX_PATH}/bin/"*.exe ( cd "${PREFIX_PATH}/bin" && ln -fs ipy.exe python ) } build_package_ironpython_builder() { xbuild Build.proj /t:Stage "/p:Mono=true;BaseConfiguration=Release" >&4 2>&1 ( cd "Stage/Release/IronPython-"* && build_package_ironpython ) } build_package_micropython_1_9() { # supported version 1.9.3 and 1.9.4 build_package_micropython "with_axtls" } build_package_micropython() { # supported version 1.10 and higher if [ "${MAKEOPTS+defined}" ]; then MAKE_OPTS="$MAKEOPTS" elif [ -z "${MAKE_OPTS+defined}" ]; then MAKE_OPTS="-j $(num_cpu_cores)" fi { cd mpy-cross "$MAKE" $MAKE_OPTS cd ../ports/unix [ "$1" = "with_axtls" ] && "$MAKE" $MAKE_OPTS axtls "$MAKE" $MAKE_OPTS CFLAGS_EXTRA="-DMICROPY_PY_SYS_PATH_DEFAULT='\".frozen:${PREFIX_PATH}/lib/micropython\"' $CFLAGS_EXTRA" "$MAKE" install $MAKE_INSTALL_OPTS PREFIX="${PREFIX_PATH}" ln -fs micropython "${PREFIX_PATH}/bin/python" mkdir -p "${PREFIX_PATH}/lib/micropython" }>&4 2>&1 } pypy_architecture() { case "${_PYTHON_BUILD_CACHE_UNAME_S:=$(uname -s)}" in "Darwin" ) case "$(uname -m)" in "arm64" ) echo "osarm64" ;; "x86_64" ) echo "osx64" ;; * ) return 1 ;; esac ;; "Linux" ) case "$(uname -m)" in "armel" ) echo "linux-armel" ;; "armhf" | "armv6l" | "armv7l" ) echo "linux-armhf" ;; "i386" | "i486" | "i586" | "i686" | "i786" ) echo "linux" ;; "ppc64" ) echo "linux-ppc64" ;; "ppc64le" ) echo "linux-ppc64le" ;; "x86_64" ) echo "linux64" ;; "aarch64" ) echo "linux-aarch64" ;; * ) return 1 ;; esac ;; "CYGWIN"* | "MINGW"* ) echo "win32" ;; "FreeBSD" ) case "$(uname -m)" in "x86_64" ) echo "freebsd64" ;; * ) return 1 ;; esac ;; * ) return 1 ;; esac } graalpy_architecture() { case "${_PYTHON_BUILD_CACHE_UNAME_S:=$(uname -s)}" in "Darwin" ) case "$(uname -m)" in "x86_64" ) echo "macos-amd64" ;; "arm64" ) echo "macos-aarch64" ;; * ) return 1 ;; esac ;; "Linux" ) case "$(uname -m)" in "x86_64" ) echo "linux-amd64" ;; "aarch64" ) echo "linux-aarch64" ;; * ) return 1 ;; esac ;; esac } pyston_architecture() { pypy_architecture } # Note: not used by graalpy >= 23.3.0 anymore build_package_graalpython() { build_package_copy ln -fs "${PREFIX_PATH}/bin/graalpython" "${PREFIX_PATH}/bin/python" } build_package_pypy() { build_package_copy mkdir -p "${PREFIX_PATH}/bin" "${PREFIX_PATH}/lib" local bin shopt -s nullglob for bin in "bin/"*; do if [ -f "${bin}" ] && [ -x "${bin}" ] && [ ! -L "${bin}" ]; then case "${bin##*/}" in "libpypy"* ) ( cd "${PREFIX_PATH}/lib" && ln -fs "../bin/${bin##*/}" "${bin##*/}" ) ;; "pypy"* ) ( cd "${PREFIX_PATH}/bin" && ln -fs "${bin##*/}" "python" ) ;; esac fi done shopt -u nullglob } build_package_pypy_builder() { if [ -f "rpython/bin/rpython" ]; then # pypy 2.x if [ -z "${PYPY_OPTS}" ]; then local PYPY_OPTS="--opt=jit --batch --make-jobs=$(num_cpu_cores)" fi python "rpython/bin/rpython" ${PYPY_OPTS} "pypy/goal/targetpypystandalone.py" >&4 2>&1 elif [ -f "pypy/translator/goal/translate.py" ]; then # pypy 1.x if [ -z "${PYPY_OPTS}" ]; then local PYPY_OPTS="--opt=jit" fi ( cd "pypy/translator/goal" && python "translate.py" ${PYPY_OPTS} "targetpypystandalone.py" ) 1>&4 2>&1 else echo "not a pypy source tree" 1>&3 return 1 fi { mkdir -p "bin" "lib" local pypy for pypy in "pypy"*; do if [ -f "${pypy}" ] && [ -x "${pypy}" ] && [ ! -L "${pypy}" ]; then mv -f "${pypy}" "bin/${pypy##*/}" fi done local libpypy for libpypy in "libpypy"*; do if [ -f "${libpypy}" ] && [ -x "${libpypy}" ] && [ ! -L "${libpypy}" ]; then mv -f "${libpypy}" "bin/${libpypy##*/}" fi done } >&4 2>&1 build_package_pypy } activepython_architecture() { case "${_PYTHON_BUILD_CACHE_UNAME_S:=$(uname -s)}" in "Darwin" ) echo "macosx10.9-i386-x86_64" ;; "Linux" ) case "$(uname -m)" in "i386" | "i486" | "i586" | "i686" | "i786" ) echo "linux-x86" ;; "x86_64" ) echo "linux-x86_64" ;; * ) return 1 ;; esac ;; * ) return 1 ;; esac } build_package_activepython() { local package_name="$1" { bash "install.sh" --install-dir "${PREFIX_PATH}" } >&4 2>&1 } anaconda_architecture() { case "${_PYTHON_BUILD_CACHE_UNAME_S:=$(uname -s)}" in "Darwin" ) case "$(uname -m)" in "arm64" ) echo "MacOSX-arm64" ;; * ) echo "MacOSX-x86_64" ;; esac ;; "Linux" ) case "$(uname -m)" in "armv7l" ) echo "Linux-armv7l" ;; "aarch64" ) echo "Linux-aarch64" ;; "i386" | "i486" | "i586" | "i686" | "i786" ) echo "Linux-x86" ;; "ppc64le" ) echo "Linux-ppc64le" ;; "x86_64" ) echo "Linux-x86_64" ;; * ) return 1 ;; esac ;; * ) return 1 ;; esac } build_package_anaconda() { local package_name="$1" { bash "${package_name}.sh" -f -b -p "${PREFIX_PATH}" } >&4 2>&1 } build_package_miniconda() { build_package_anaconda "$@" # Workaround to not upgrade conda when installing pip # see https://github.com/pyenv/pyenv/issues/2070 "${PREFIX_PATH}/bin/conda" install --yes "pip" "conda=$(${PREFIX_PATH}/bin/conda --version | cut -d ' ' -f 2)" } build_package_copy() { mkdir -p "$PREFIX_PATH" cp -fR . "$PREFIX_PATH" } before_install_package() { local stub=1 } after_install_package() { local stub=1 } setup_builtin_patches() { local package_name="$1" local package_patch_path="${DEFINITION_PATH%/*}/patches/${DEFINITION_PATH##*/}/${package_name}" # Apply built-in patches if patch was not given from stdin if [[ -n "$HAS_STDIN_PATCH" ]] && package_is_python "${package_name}"; then cat >"${package_name}.patch" HAS_PATCH=true elif [[ -d "${package_patch_path}" ]]; then { find "${package_patch_path}" -maxdepth 1 -type f -print0 } 2>/dev/null | sort -z | xargs -0 cat 1>"${package_name}.patch" HAS_PATCH=true fi } cleanup_builtin_patches() { local package_name="$1" rm -f "${package_name}.patch" unset HAS_PATCH } fix_directory_permissions() { # Ensure installed directories are not world-writable find "$PREFIX_PATH" -type d \( -perm -020 -o -perm -002 \) -exec chmod go-w {} \; } require_java7() { local version="$(java -version 2>&1 | grep '\(java\|openjdk\) version' | head -n1)" if [[ $version != *[789]* ]]; then colorize 1 "ERROR" >&3 echo ": Java 7 required. Please install a 1.7-compatible JRE." >&3 return 1 fi } require_gcc() { local gcc="$(locate_gcc || true)" if [ -z "$gcc" ]; then { echo colorize 1 "ERROR" echo ": This package must be compiled with GCC, but python-build couldn't" echo "find a suitable \`gcc\` executable on your system. Please install GCC" echo "and try again." echo if is_mac; then colorize 1 "DETAILS" echo ": Apple no longer includes the official GCC compiler with Xcode" echo "as of version 4.2. Instead, the \`gcc\` executable is a symlink to" echo "\`llvm-gcc\`, a modified version of GCC which outputs LLVM bytecode." echo echo "For most programs the \`llvm-gcc\` compiler works fine. However," echo "versions of CPython newer than 3.3.0 are incompatible with" echo "\`llvm-gcc\`. To build newer versions of CPython you must have the official" echo "GCC compiler installed on your system." echo colorize 1 "TO FIX THE PROBLEM" if type brew &>/dev/null; then echo ": Install Homebrew's GCC package with this" echo -n "command: " colorize 4 "brew install gcc@4.9" else echo ": Install the official GCC compiler using these" echo -n "packages: " colorize 4 "https://github.com/kennethreitz/osx-gcc-installer/downloads" fi echo echo echo "You will need to install the official GCC compiler to build newer" echo "versions of CPython even if you have installed Apple's Command Line Tools" echo "for Xcode package. The Command Line Tools for Xcode package only" echo "includes \`llvm-gcc\`." fi } >&3 return 1 fi export CC="$gcc" if is_mac -ge 1010; then export MACOSX_DEPLOYMENT_TARGET=${MACOSX_DEPLOYMENT_TARGET:-10.9} fi } locate_gcc() { local gcc gccs IFS=: gccs=($(gccs_in_path)) IFS="$OLDIFS" verify_gcc "$CC" || verify_gcc "$(command -v gcc || true)" || { for gcc in "${gccs[@]}"; do verify_gcc "$gcc" && break || true done } return 1 } gccs_in_path() { local gcc path paths local gccs=() IFS=: paths=($PATH) IFS="$OLDIFS" shopt -s nullglob for path in "${paths[@]}"; do for gcc in "$path"/gcc-*; do gccs["${#gccs[@]}"]="$gcc" done done shopt -u nullglob printf :%s "${gccs[@]}" } verify_gcc() { local gcc="$1" if [ -z "$gcc" ]; then return 1 fi local version="$("$gcc" --version 2>/dev/null || true)" if [ -z "$version" ]; then return 1 fi if echo "$version" | grep LLVM >/dev/null; then return 1 fi echo "$gcc" } require_llvm() { local llvm_version="$1" if is_mac -ge 1010; then if [[ "$PYTHON_CONFIGURE_OPTS" != *--llvm-* ]]; then case "$llvm_version" in 3.2 ) package_option python configure --prebuilt-name="llvm-3.2-x86_64-apple-darwin13.tar.bz2" ;; 3.[56] ) local llvm_config="$(locate_llvm "$llvm_version")" if [ -n "$llvm_config" ]; then package_option python configure --llvm-config="$llvm_config" else local homebrew_package="llvm@$llvm_version" { echo colorize 1 "ERROR" echo ": Rubinius will not be able to compile using Apple's LLVM-based " echo "build tools on OS X. You will need to install LLVM $llvm_version first." echo colorize 1 "TO FIX THE PROBLEM" echo ": Install Homebrew's llvm package with this" echo -n "command: " colorize 4 "brew install $homebrew_package" echo } >&3 return 1 fi ;; esac fi fi } locate_llvm() { local llvm_version="$1" local package llvm_config shopt -s nullglob for package in `brew list 2>/dev/null | grep "^llvm"`; do llvm_config="$(echo "$(brew --prefix "$package")/bin/llvm-config"*)" if [ -n "$llvm_config" ] && [[ "$("$llvm_config" --version)" = "$llvm_version"* ]]; then echo "$llvm_config" break fi done shopt -u nullglob } require_java() { local java="$(command -v java || true)" if [ -z "$java" ]; then { echo colorize 1 "ERROR" echo ": This package must be installed with java, but python-build couldn't" echo "find a suitable \`java\` executable on your system. Please install Java" echo "and try again." echo } >&3 return 1 fi export JAVA="$java" } # Let Jython installer to generate shell script instead of python script even if there's `python2.7` available in `$PATH` (#800) # FIXME: better function naming unrequire_python27() { export PATH="${BUILD_PATH}/bin:${PATH}" mkdir -p "${BUILD_PATH}/bin" if command -v python2.7 1>/dev/null 2>&1; then echo false > "${BUILD_PATH}/bin/python2.7" chmod +x "${BUILD_PATH}/bin/python2.7" fi } require_distro() { for arg; do if [[ "$(cat /etc/issue 2>/dev/null || true)" == "$arg"* ]]; then return 0 fi done { echo colorize 1 "WARNING" echo ": This binary distribution is built for the following distro(s): $@." echo "installed binary may not run expectedly on other platforms." echo } >&2 return 1 } require_osx_version() { function version { echo "$@" | awk -F. '{ printf("%d%03d%03d%03d\n", $1,$2,$3,$4); }'; } local required_version="$@" local osx_version="${_PYTHON_BUILD_CACHE_SW_VERS:=$(sw_vers -productVersion)}" if [[ $(version $osx_version) -ge $(version $required_version) ]]; then return 0 fi return 1 } configured_with_package_dir() { local package_var_name="$(capitalize "$1")" shift 1 local PACKAGE_CONFIGURE_OPTS="${package_var_name}_CONFIGURE_OPTS" local PACKAGE_CONFIGURE_OPTS_ARRAY="${package_var_name}_MAKE_OPTS_ARRAY[@]" local arg flag for arg in ${CONFIGURE_OPTS} ${!PACKAGE_CONFIGURE_OPTS} "${!PACKAGE_CONFIGURE_OPTS_ARRAY}"; do if [[ "$arg" == "CPPFLAGS="* ]]; then for flag in ${CPPFLAGS} ${arg##CPPFLAGS=}; do if [[ "$flag" == "-I"* ]]; then local header for header in "$@"; do if [ -e "${flag##-I}/${header#/}" ]; then return 0 fi done fi done fi done return 1 } # `python-config` ignores LDFLAGS envvar. Adding to LIBS is the only way to add extra stuff # to `python-config --ldflags` output append_ldflags_libs() { local args="$1" export LDFLAGS="${LDFLAGS:+$LDFLAGS }$args" export LIBS="${LIBS:+${LIBS% } }$args" } prepend_ldflags_libs() { local args="$1" export LDFLAGS="$args${LDFLAGS:+ $LDFLAGS}" export LIBS="$args${LIBS:+ $LIBS}" } use_homebrew() { can_use_homebrew || return 1 # unless Homebrew is at the default /usr/local, need to add its paths to # compiler search to be able to use non-keg-only deps from there if command -v brew &>/dev/null; then local brew_prefix="$(brew --prefix 2>/dev/null || true)" # /usr/local/lib:/usr/lib is the default library search path if [[ -n $brew_prefix && ( ( $brew_prefix != "/usr" && $brew_prefix != "/usr/local" ) #when -isysroot is passed to Apple CLang, /usr/(local) are excluded from the default search path || ( is_mac && osx_using_default_compiler && $CFLAGS =~ (^|\ )-isysroot\ ) ) ]]; then export CPPFLAGS="${CPPFLAGS:+$CPPFLAGS }-I${brew_prefix}/include" append_ldflags_libs "-L${brew_prefix}/lib -Wl,-rpath,${brew_prefix}/lib" lock_in homebrew fi fi } use_macports() { can_use_macports || return 1 local port_location="$(command -v port)" if [ -n "$port_location" ]; then local prefix="${port_location%/bin/port}" export CPPFLAGS="-I${prefix}/include${CPPFLAGS:+ $CPPFLAGS}" prepend_ldflags_libs "-L${prefix}/lib -Wl,-rpath,${prefix}/lib" export PKG_CONFIG_PATH="$prefix/lib/pkgconfig${PKG_CONFIG_PATH:+:$PKG_CONFIG_PATH}" lock_in macports fi } needs_yaml() { if ! configured_with_package_dir "python" "yaml.h"; then if can_use_homebrew; then use_homebrew_yaml && return 1 elif can_use_macports; then use_macports_yaml && return 1 fi fi } use_homebrew_yaml() { can_use_homebrew || return 1 local libdir="$(brew --prefix libyaml 2>/dev/null || true)" if [ -d "$libdir" ]; then echo "python-build: use libyaml from homebrew" export CPPFLAGS="-I$libdir/include${CPPFLAGS:+ $CPPFLAGS}" export LDFLAGS="-L$libdir/lib${LDFLAGS:+ ${LDFLAGS% }}" lock_in homebrew else return 1 fi } use_macports_yaml() { can_use_macports || return 1 if [[ $(port -q installed libyaml | awk '{print $3}') == "(active)" ]]; then echo "python-build: use libyaml from MacPorts" lock_in macports else return 1 fi } use_freebsd_pkg() { # check if FreeBSD if [ "FreeBSD" = "${_PYTHON_BUILD_CACHE_UNAME_S:=$(uname -s)}" ]; then # use openssl if installed from Ports Collection if pkg info -e openssl; then package_option python configure --with-openssl="/usr/local" fi # check if 11-R or later release="${_PYTHON_BUILD_CACHE_UNAME_R:=$(uname -r)}" if [ "${release%%.*}" -ge 11 ]; then # Use packages from Ports Collection. # # Unlike Linux, BSD's cc does not look in /usr/local by default # where Ports-installed packages are, but they are available via pkg-config. # Surprisingly, CPython's Configure only uses pkg-config # to locate some of the dependencies and not others. # Here we detect those that are (as of this writing) known # to not be searched via pkg-config. # # XXX: As a side effect, this would pick up any other libs from Ports # that are searched via compiler if pkg info -e readline || pkg info -e sqlite3; then export CPPFLAGS="${CPPFLAGS:+$CPPFLAGS }-I/usr/local/include" export LDFLAGS="${LDFLAGS:+$LDFLAGS }-L/usr/local/lib -Wl,-rpath,/usr/local/lib" fi fi fi } has_broken_mac_readline() { # Mac OS X 10.4 has broken readline. # https://github.com/pyenv/pyenv/issues/23 if ! is_mac || configured_with_package_dir "python" "readline/rlconf.h"; then # Not applicable. return 1 fi if can_use_homebrew; then use_homebrew_readline && return 1 fi if can_use_macports; then use_macports_readline && return 1 fi return 0 } use_homebrew_readline() { can_use_homebrew || return 1 if ! configured_with_package_dir "python" "readline/rlconf.h"; then local libdir="$(brew --prefix readline 2>/dev/null || true)" if [ -d "$libdir" ]; then echo "python-build: use readline from homebrew" export CPPFLAGS="-I$libdir/include${CPPFLAGS:+ $CPPFLAGS}" export LDFLAGS="-L$libdir/lib${LDFLAGS:+ $LDFLAGS}" lock_in homebrew else return 1 fi fi } use_macports_readline() { can_use_macports || return 1 if ! configured_with_package_dir "python" "readline/rlconf.h"; then if [[ $(port -q installed readline | awk '{print $3}') == "(active)" ]]; then echo "python-build: use readline from MacPorts" lock_in macports else return 1 fi fi } use_homebrew_ncurses() { can_use_homebrew || return 1 local libdir="$(brew --prefix ncurses 2>/dev/null || true)" if [ -d "$libdir" ]; then echo "python-build: use ncurses from homebrew" export CPPFLAGS="-I$libdir/include${CPPFLAGS:+ $CPPFLAGS}" export LDFLAGS="-L$libdir/lib${LDFLAGS:+ $LDFLAGS}" lock_in homebrew else return 1 fi } use_macports_ncurses() { can_use_macports || return 1 if [[ $(port -q installed ncurses | awk '{print $3}') == "(active)" ]]; then echo "python-build: use ncurses from MacPorts" lock_in macports else return 1 fi } prefer_openssl11() { # Allow overriding the preference of OpenSSL version per definition basis (#1302, #1325, #1326) PYTHON_BUILD_HOMEBREW_OPENSSL_FORMULA="${PYTHON_BUILD_HOMEBREW_OPENSSL_FORMULA:-openssl@1.1 openssl}" export PYTHON_BUILD_HOMEBREW_OPENSSL_FORMULA PYTHON_BUILD_MACPORTS_OPENSSL_FORMULA="${PYTHON_BUILD_MACPORTS_OPENSSL_FORMULA:-openssl11 openssl3 openssl}" export PYTHON_BUILD_MACPORTS_OPENSSL_FORMULA } prefer_openssl3() { # Allow overriding the preference of OpenSSL version per definition basis (#1302, #1325, #1326) PYTHON_BUILD_HOMEBREW_OPENSSL_FORMULA="${PYTHON_BUILD_HOMEBREW_OPENSSL_FORMULA:-openssl@3 openssl@1.1 openssl}" export PYTHON_BUILD_HOMEBREW_OPENSSL_FORMULA # Set MacPorts OpenSSL formula names for MacPorts environment PYTHON_BUILD_MACPORTS_OPENSSL_FORMULA="${PYTHON_BUILD_MACPORTS_OPENSSL_FORMULA:-openssl3 openssl openssl11}" export PYTHON_BUILD_MACPORTS_OPENSSL_FORMULA } build_package_mac_readline() { # Install to a subdirectory since we don't want shims for bin/readline. READLINE_PREFIX_PATH="${PREFIX_PATH}/readline" # Tell Python to use this readline for its extension. export CPPFLAGS="-I${READLINE_PREFIX_PATH}/include${CPPFLAGS:+ $CPPFLAGS}" export LDFLAGS="-L${READLINE_PREFIX_PATH}/lib${LDFLAGS:+ $LDFLAGS}" # Make sure pkg-config finds our build first. export PKG_CONFIG_PATH="${READLINE_PREFIX_PATH}/lib/pkgconfig${PKG_CONFIG_PATH:+:$PKG_CONFIG_PATH}" build_package_standard "$@" } has_broken_mac_openssl() { is_mac || return 1 local openssl_version="$(/usr/bin/openssl version 2>/dev/null || true)" if [[ $openssl_version = "OpenSSL 0.9.8"?* || $openssl_version = "LibreSSL"* ]]; then if can_use_homebrew; then use_homebrew_openssl && return 1 fi if can_use_macports; then use_macports_openssl && return 1 fi fi return 0 } use_homebrew_openssl() { can_use_homebrew || return 1 command -v brew >/dev/null || return 1 for openssl in ${PYTHON_BUILD_HOMEBREW_OPENSSL_FORMULA:-openssl}; do local ssldir="$(brew --prefix "${openssl}" || true)" if [ -d "$ssldir" ]; then echo "python-build: use ${openssl} from homebrew" if [[ -n "${PYTHON_BUILD_CONFIGURE_WITH_OPENSSL:-}" ]]; then # configure script of newer CPython versions support `--with-openssl` # https://bugs.python.org/issue21541 package_option python configure --with-openssl="${ssldir}" else export CPPFLAGS="-I$ssldir/include ${CPPFLAGS:+ $CPPFLAGS}" export LDFLAGS="-L$ssldir/lib${LDFLAGS:+ $LDFLAGS}" fi export PKG_CONFIG_PATH="$ssldir/lib/pkgconfig/:${PKG_CONFIG_PATH}" lock_in homebrew return 0 fi done return 1 } use_macports_openssl() { can_use_macports || return 1 command -v port >/dev/null || return 1 local port_location="$(command -v port)" local prefix="${port_location%/bin/port}" # MacPorts uses a different package naming convention and does not use the @ symbol. for openssl in ${PYTHON_BUILD_MACPORTS_OPENSSL_FORMULA:-openssl3 openssl}; do if [[ $(port -q installed ${openssl} | awk '{print $3}') == "(active)" ]]; then echo "python-build: use ${openssl} from MacPorts" if [[ -n "${PYTHON_BUILD_CONFIGURE_WITH_OPENSSL:-}" ]]; then # configure script of newer CPython versions support `--with-openssl` # https://bugs.python.org/issue21541 package_option python configure --with-openssl="${prefix}" fi lock_in macports return 0 fi done return 1 } build_package_mac_openssl() { # Install to a subdirectory since we don't want shims for bin/openssl. OPENSSL_PREFIX_PATH="${PREFIX_PATH}/openssl" # Put openssl.conf, certs, etc in ~/.pyenv/versions/*/openssl/ssl OPENSSLDIR="${OPENSSLDIR:-$OPENSSL_PREFIX_PATH/ssl}" # Tell Python to use this openssl for its extension. if [[ -n "${PYTHON_BUILD_CONFIGURE_WITH_OPENSSL:-}" ]]; then # configure script of newer CPython versions support `--with-openssl` # https://bugs.python.org/issue21541 package_option python configure --with-openssl="${OPENSSL_PREFIX_PATH}" else export CPPFLAGS="-I${OPENSSL_PREFIX_PATH}/include ${CPPFLAGS:+ $CPPFLAGS}" export LDFLAGS="-L${OPENSSL_PREFIX_PATH}/lib${LDFLAGS:+ $LDFLAGS}" fi # Make sure pkg-config finds our build first. export PKG_CONFIG_PATH="${OPENSSL_PREFIX_PATH}/lib/pkgconfig${PKG_CONFIG_PATH:+:$PKG_CONFIG_PATH}" # Hint OpenSSL that we prefer a 64-bit build. export KERNEL_BITS="64" OPENSSL_CONFIGURE="${OPENSSL_CONFIGURE:-./config}" local nokerberos [[ "$1" != openssl-1.0.* ]] || nokerberos=1 # switches introduced in OpenSSL 1.1.1 local notests [[ $(openssl_version $1) -ge 10101 ]] && notests=1 # switches introduced in OpenSSL 3.2 local extra_no_features [[ $(openssl_version $1) -ge 30200 ]] && extra_no_features=1 # Compile a shared lib with zlib dynamically linked. package_option openssl configure --openssldir="$OPENSSLDIR" zlib-dynamic no-ssl3 shared ${nokerberos:+no-ssl2 no-krb5} ${extra_no_features:+no-docs no-apps} ${notests:+no-tests} build_package_standard "$@" # Extract root certs from the system keychain in .pem format and rehash. local pem_file="$OPENSSLDIR/cert.pem" security find-certificate -a -p /Library/Keychains/System.keychain > "$pem_file" security find-certificate -a -p /System/Library/Keychains/SystemRootCertificates.keychain >> "$pem_file" } # openssl-1.0.1k -> 10001 # openssl-3.2.1 -> 30201 openssl_version() { local -a ver IFS=- ver=( ${1:?} ) IFS=. ver=( ${ver[1]} ) [[ ${ver[2]} =~ ^([[:digit:]]+)[[:alpha:]]$ ]] && ver[2]="${BASH_REMATCH[1]}" echo $(( ${ver[0]}*10000 + ${ver[1]}*100 + ${ver[2]} )) } # Post-install check that the openssl extension was built. build_package_verify_openssl() { "$RUBY_BIN" -e ' manager = ARGV[0] packages = { "apt-get" => Hash.new {|h,k| "lib#{k}-dev" }.update( "openssl" => "libssl-dev", "zlib" => "zlib1g-dev" ), "yum" => Hash.new {|h,k| "#{k}-devel" }.update( "yaml" => "libyaml-devel" ) } failed = %w[openssl readline zlib yaml].reject do |lib| begin require lib rescue LoadError $stderr.puts "The Ruby #{lib} extension was not compiled." end end if failed.size > 0 $stderr.puts "ERROR: Ruby install aborted due to missing extensions" $stderr.print "Try running `%s install -y %s` to fetch missing dependencies.\n\n" % [ manager, failed.map { |lib| packages.fetch(manager)[lib] }.join(" ") ] unless manager.empty? $stderr.puts "Configure options used:" require "rbconfig"; require "shellwords" RbConfig::CONFIG.fetch("configure_args").shellsplit.each { |arg| $stderr.puts " #{arg}" } exit 1 end ' "$(basename "$(type -P yum apt-get | head -n1)")" >&4 2>&1 } use_homebrew_zlib() { can_use_homebrew || return 1 local brew_zlib="$(brew --prefix zlib 2>/dev/null || true)" if [ -d "$brew_zlib" ]; then echo "python-build: use zlib from homebrew" export CPPFLAGS="-I${brew_zlib}/include${CPPFLAGS:+ ${CPPFLAGS}}" export LDFLAGS="-L${brew_zlib}/lib${LDFLAGS:+ ${LDFLAGS}}" lock_in homebrew rc=0 fi } use_xcode_sdk_zlib() { # If a custom compiler is used, including XCode SDK will likely break it osx_using_default_compiler || return 1 local sdkroot="$(xcrun --sdk macosx --show-sdk-path 2>/dev/null || true)" [[ -z ${sdkroot} || ! -d ${sdkroot} ]] && return 1 # Since Xcode 16 / macOS SDK 15, Apple tightened how the linker uses SDK content: # forcing -L "$SDK/usr/lib" now leads to odd link failures. echo "python-build: use zlib from xcode sdk" # Since 3.9.1 (bpo-41116), CPython's setup.py logic can search default SDK's sysroot itself # so we don't need to do anything # Since 2.7.12 and 3.5.2 (Issue #25136), distutils knows to look for Apple XCode 7+ stub libraries (.tbd) # when searching in the SDK # Since 2.7.4 and 3.2.1 (issue #7724), setup.py and distutils can search in the MacOS SDK when # it's explicitly specified with -isysroot #distutils.unixcompiler and setup.py specifically search CFLAGS for "-isysroot" export CFLAGS="${CFLAGS:+$CFLAGS }-isysroot ${sdkroot}" #while one can get away with adding it just to CFLAGS, this may cause linker failures #if XCode is for a different major MacOS version (e.g. reported for XCode 12.4 on MacOS 10.15) export LDFLAGS="${LDFLAGS:+$LDFLAGS }-isysroot ${sdkroot}" return 0 } osx_using_default_compiler() { [[ "${CC:-clang}" == "clang" && "$(command -v clang 2>/dev/null || true)" == "/usr/bin/clang" ]] } use_macports_zlib() { can_use_macports || return 1 if [[ $(port -q installed zlib | awk '{print $3}') == "(active)" ]]; then echo "python-build: use zlib from MacPorts" lock_in macports else return 1 fi } use_homebrew_tcltk() { can_use_homebrew || return 1 local tcltk_formula # Since https://github.com/Homebrew/homebrew-core/commit/f10e88617b41555193c22fdcba6109fe82155ee2 (10.11.2024), # tcl-tk is 9.0. It's supported in CPython since 3.14.0a1 (gh-124111) but is not officially supported as of 3.14.0 # so we prefer 8 for tcltk_formula in ${PYTHON_BUILD_TCLTK_FORMULA:-tcl-tk@8 tcl-tk}; do local tcltk_prefix="$(brew --prefix "${tcltk_formula}" 2>/dev/null || true)" if [ -d "$tcltk_prefix" ]; then echo "python-build: use ${tcltk_formula} from homebrew" # In Homebrew Tcl/Tk 8.6.13, headers have been moved to the 'tcl-tk' subdir. local tcltk_includes="$(sh -c 'cd '"$tcltk_prefix"'/lib; . ./tclConfig.sh; . ./tkConfig.sh; echo "$TCL_INCLUDE_SPEC $TK_INCLUDE_SPEC"')" # Homebrew Tcl/Tk 9 is built with external libtommath. CPython's build as of 3.14.0 does not detect that and fails to link to tommath symbols local tcltk_cflags if sh -c '. '"$tcltk_prefix"'/lib/tclConfig.sh; echo "$TCL_DEFS"' | grep -qwFe '-DTCL_WITH_EXTERNAL_TOMMATH=1'; then tcltk_cflags="-DTCL_WITH_EXTERNAL_TOMMATH=1" fi # For some reason, keg-only tcl-tk@8 successfully links with Tkinter without specifying rpath, with `/opt' rpath # so no need to translate /Cellar path to /opt path local tcltk_libs="$(sh -c 'cd '"$tcltk_prefix"'/lib; . ./tclConfig.sh; . ./tkConfig.sh; echo "$TCL_LIB_SPEC $TK_LIB_SPEC"')" # Since 2.7.6, 3.3.3, 3.4.0 (Issue #1584): --with-tcltk-includes + --with-tcltk-libs Configure options # Since 3.11.0 (bpo-45847): `pkg-config` call, TCLTK_CFLAGS + TCLTK_LIBS override if [[ -n "$PYTHON_BUILD_TCLTK_USE_PKGCONFIG" ]]; then # pkg-config is not present out of the box in MacOS. # There's no way to provide a fallback only if it's is not present # and Configure's logic of detecting if it's present is complicated. # So we just override it always export TCLTK_CFLAGS="$tcltk_includes${tcltk_cflags:+ $tcltk_cflags}" export TCLTK_LIBS="$tcltk_libs" else package_option python configure --with-tcltk-includes="$tcltk_includes" package_option python configure --with-tcltk-libs="$tcltk_libs" [[ -n $tcltk_cflags ]] && export CFLAGS="${tcltk_cflags}${CFLAGS:+ $CFLAGS}" fi #set in either case as a failsafe export PKG_CONFIG_PATH="${tcltk_prefix}/lib/pkgconfig${PKG_CONFIG_PATH:+:$PKG_CONFIG_PATH}" lock_in homebrew return 0 fi done return 1 } # FIXME: this function is a workaround for #1125 # once fixed, it should be removed. # if tcltk_ops_flag is in PYTHON_CONFIGURE_OPTS, use user provided tcltk use_custom_tcltk() { local tcltk_ops="$(get_tcltk_flag_from "$PYTHON_CONFIGURE_OPTS")" if [[ -z "$tcltk_ops" ]]; then return 1 fi local tcltk_ops_flag="--with-tcltk-libs=" # get tcltk libs local tcltk_libs="${tcltk_ops//$tcltk_ops_flag/}" # remove tcltk-flag from configure_opts # this allows for weird input such as # --with-tcltk-libs=' -L/custom-tcl-tk/lib -ltcl8.6 -ltk8.4 ' PYTHON_CONFIGURE_OPTS="${PYTHON_CONFIGURE_OPTS//"$tcltk_ops_flag"/}" PYTHON_CONFIGURE_OPTS="${PYTHON_CONFIGURE_OPTS//$tcltk_libs/}" # remove quotes, because there mess up compilations PYTHON_CONFIGURE_OPTS="${PYTHON_CONFIGURE_OPTS//"''"/}" PYTHON_CONFIGURE_OPTS="${PYTHON_CONFIGURE_OPTS//'""'/}" echo "python-build: use tcl-tk from \$PYTHON_CONFIGURE_OPTS" # echo "PYTHON_CONFIGURE_OPTS=${PYTHON_CONFIGURE_OPTS}" package_option python configure --with-tcltk-libs="${tcltk_libs}" # IFS="$OLDIFS" } # FIXME: this function is a workaround for #1125 # once fixed, it should be removed. # Get tcltk-flag and options from `$1` # expects one argument containing a string of configure opts, eg. `PYTHON_CONFIGURE_OPTS` # returns tcl_tk flag or an empty string if nothing was found. get_tcltk_flag_from() { IFS=$'\n' # parse input string into array local opts_arr=( $(xargs -n1 <<<"$1") ) # iterate through `opts_arr`, break if `--with-tcltk-libs=` was found. for opts in ${opts_arr[@]}; do # `--with-tcltk-libs=` must be the prefix. if [[ "$opts" == "--with-tcltk-libs="* ]]; then # return echo "$opts" break fi done IFS="$OLDIFS" } # Since 3.12, CPython can add DWARF debug information in MacOS # using Apple's nonstandard way, `dsymutil', that creates a "dSYM bundle" # that's supposed to be installed alongside executables # (https://github.com/python/cpython/issues/95973). use_dsymutil() { if [[ -n "$PYTHON_BUILD_CONFIGURE_WITH_DSYMUTIL" ]] && is_mac; then package_option python configure --with-dsymutil fi } use_free_threading() { if [[ -n "$PYTHON_BUILD_FREE_THREADING" ]]; then package_option python configure --disable-gil fi } build_package_enable_shared() { package_option python configure --enable-shared } build_package_auto_tcltk() { if is_mac && [ ! -d /usr/include/X11 ]; then if [ -d /opt/X11/include ]; then if [[ "$CPPFLAGS" != *-I/opt/X11/include* ]]; then export CPPFLAGS="-I/opt/X11/include${CPPFLAGS:+ $CPPFLAGS}" fi else package_option python configure --without-tk fi fi } package_is_python() { case "$1" in Python-* | jython-* | pypy-* | pypy[0-9].+([0-9])-* | stackless-* ) return 0 ;; esac return 1 } apply_patch() { local package_name="$1" local patchfile patchfile="$(mktemp "${TMP}/python-patch.XXXXXX")" cat "${2:--}" >"$patchfile" local striplevel=0 grep -q '^diff --git a/' "$patchfile" && striplevel=1 patch -p$striplevel --force -i "$patchfile" } build_package_symlink_version_suffix() { if [[ "${PYTHON_CONFIGURE_OPTS_ARRAY[*]} $CONFIGURE_OPTS $PYTHON_CONFIGURE_OPTS" == *"--enable-framework"* ]]; then if [ -e "${PREFIX_PATH}/bin" ]; then # Always create `bin` as symlink to framework path if the version was built with `--enable-framework` (#590) rm -rf "${PREFIX_PATH}/bin.orig" mv -f "${PREFIX_PATH}/bin" "${PREFIX_PATH}/bin.orig" fi # Only symlinks are installed in ${PREFIX_PATH}/bin ln -fs "${PREFIX_PATH}/Library/Frameworks/Python.framework/Versions/Current/bin" "${PREFIX_PATH}/bin" fi # Not create symlinks on `altinstall` (#255) if [[ "$PYTHON_MAKE_INSTALL_TARGET" != *"altinstall"* ]]; then shopt -s nullglob local version_bin="$(ls -1 "${PREFIX_PATH}/bin/python"* | grep '[0-9]$' | sort | tail -1)" suffix="$(basename "${version_bin}" | sed -e 's/^python//')" if [ -n "${suffix}" ]; then local file link for file in "${PREFIX_PATH}/bin"/*; do unset link case "${file}" in */"python${suffix}-config" ) # Symlink `pythonX.Y-config` to `python-config` if `python-config` is missing (#296) link="${file%/*}/python-config" ;; */*"-${suffix}" ) link="${file%%-${suffix}}" ;; */*"${suffix}" ) link="${file%%${suffix}}" ;; esac if [ -n "$link" ] && [ ! -e "$link" ]; then ( cd "${file%/*}" && ln -fs "${file##*/}" "${link##*/}" ) fi done fi shopt -u nullglob fi } verify_python() { build_package_symlink_version_suffix if [ ! -x "${PYTHON_BIN}" ]; then { colorize 1 "ERROR" echo ": invalid Python executable: ${PYTHON_BIN}" echo echo "The python-build could not find proper executable of Python after successful build." echo "Please open an issue for future improvements." echo "https://github.com/pyenv/pyenv/issues" return 1 } >&3 fi } try_python_module() { if ! "$PYTHON_BIN" -c "import $1"; then { colorize 1 "WARNING" echo ": The Python $1 extension was not compiled${3:+ $3}. Missing the ${2:-$1}?" return 0 } >&3 fi } verify_python_module() { if ! "$PYTHON_BIN" -c "import $1"; then { colorize 1 "ERROR" echo ": The Python $1 extension was not compiled. Missing the ${2:-$1}?" echo echo "Please consult to the Wiki page to fix the problem." echo "https://github.com/pyenv/pyenv/wiki/Common-build-problems" echo return 1 } >&3 fi } # Post-install check for Python 2.1.x build_package_verify_py21() { verify_python "${2:-python2.1}" try_python_module "readline" "GNU readline lib" verify_python_module "binascii" "binascii" # fixme: zlib doesn't link correctly on 64-bit Linux, due to being in # /usr/x86_64-linux-gnu instead of /usr/lib try_python_module "zlib" "zlib" try_python_module "bz2" "bzip2 lib" } # Post-install check for Python 2.2.x build_package_verify_py22() { verify_python "${2:-python2.2}" try_python_module "readline" "GNU readline lib" verify_python_module "binascii" "binascii" # fixme: zlib doesn't link correctly on 64-bit Linux, due to being in # /usr/x86_64-linux-gnu instead of /usr/lib try_python_module "zlib" "zlib" try_python_module "bz2" "bzip2 lib" } # Post-install check for Python 2.3.x build_package_verify_py23() { verify_python "${2:-python2.3}" try_python_module "readline" "GNU readline lib" verify_python_module "binascii" "binascii" # fixme: zlib doesn't link correctly on 64-bit Linux, due to being in # /usr/x86_64-linux-gnu instead of /usr/lib try_python_module "zlib" "zlib" try_python_module "bz2" "bzip2 lib" } # Post-install check for Python 2.4.x build_package_verify_py24() { verify_python "${2:-2.4}" try_python_module "readline" "GNU readline lib" verify_python_module "zlib" "zlib" try_python_module "bz2" "bzip2 lib" } # Post-install check for Python 2.5.x build_package_verify_py25() { build_package_verify_py24 "$1" "${2:-2.5}" try_python_module "sqlite3" "SQLite3 lib" } # Post-install check for Python 2.6.x build_package_verify_py26() { build_package_verify_py25 "$1" "${2:-2.6}" verify_python_module "ssl" "OpenSSL lib" } # Post-install check for Python 2.7.x build_package_verify_py27() { build_package_verify_py26 "$1" "${2:-2.7}" } # Post-install check for Python 3.0.x build_package_verify_py30() { verify_python "${2:-3.0}" try_python_module "bz2" "bzip2 lib" try_python_module "curses" "ncurses lib" try_python_module "ctypes" "libffi lib" try_python_module "readline" "GNU readline lib" verify_python_module "ssl" "OpenSSL lib" try_python_module "sqlite3" "SQLite3 lib" if [[ -n $DISPLAY ]]; then try_python_module "tkinter" "Tk toolkit" "and GUI subsystem has been detected" fi verify_python_module "zlib" "zlib" } # Post-install check for Python 3.1.x build_package_verify_py31() { build_package_verify_py30 "$1" "${2:-3.1}" } # Post-install check for Python 3.2.x build_package_verify_py32() { build_package_verify_py31 "$1" "${2:-3.2}" } # Post-install check for Python 3.3.x build_package_verify_py33() { build_package_verify_py32 "$1" "${2:-3.3}" try_python_module "lzma" "lzma lib" } # Post-install check for Python 3.4.x build_package_verify_py34() { build_package_verify_py33 "$1" "${2:-3.4}" } # Post-install check for Python 3.5.x build_package_verify_py35() { build_package_verify_py34 "$1" "${2:-3.5}" } # Post-install check for Python 3.6.x build_package_verify_py36() { build_package_verify_py35 "$1" "${2:-3.6}" } # Post-install check for Python 3.7.x build_package_verify_py37() { build_package_verify_py36 "$1" "${2:-3.7}" } # Post-install check for Python 3.8.x build_package_verify_py38() { build_package_verify_py37 "$1" "${2:-3.8}" } # Post-install check for Python 3.9.x build_package_verify_py39() { build_package_verify_py38 "$1" "${2:-3.9}" } # Post-install check for Python 3.10.x build_package_verify_py310() { build_package_verify_py39 "$1" "${2:-3.10}" } # Post-install check for Python 3.11.x build_package_verify_py311() { build_package_verify_py310 "$1" "${2:-3.11}" } # Post-install check for Python 3.12.x build_package_verify_py312() { build_package_verify_py311 "$1" "${2:-3.12}" } # Post-install check for Python 3.13.x build_package_verify_py313() { build_package_verify_py312 "$1" "${2:-3.13}" } # Post-install check for Python 3.14.x build_package_verify_py314() { build_package_verify_py313 "$1" "${2:-3.14}" } # Post-install check for Python 3.15.x build_package_verify_py315() { build_package_verify_py314 "$1" "${2:-3.15}" } # Post-install check for Python 3.x rolling release scripts # XXX: Will need splitting into project-specific ones if there emerge # multiple rolling-release scripts with different checks needed build_package_verify_py3_latest() { build_package_verify_py311 "$1" "3" } # Copy Tools/gdb/libpython.py to pythonX.Y-gdb.py (#1190) build_package_copy_python_gdb() { if [ -e "$BUILD_PATH/$1/Tools/gdb/libpython.py" ]; then local version_re='-([0-9]\.[0-9]+)' [[ "$1" =~ $version_re ]] local python_bin="$PREFIX_PATH/bin/python${BASH_REMATCH[1]}" cp "$BUILD_PATH/$1/Tools/gdb/libpython.py" "$python_bin-gdb.py" fi } build_package_ez_setup() { local ez_setup="ez_setup.py" rm -f "${ez_setup}" { if [ "${EZ_SETUP+defined}" ] && [ -f "${EZ_SETUP}" ]; then echo "Installing setuptools from ${EZ_SETUP}..." 1>&2 cat "${EZ_SETUP}" else [ -n "${EZ_SETUP_URL}" ] echo "Installing setuptools from ${EZ_SETUP_URL}..." 1>&2 http get "${EZ_SETUP_URL}" fi } 1> "${ez_setup}" "${PYTHON_BIN}" "${ez_setup}" ${EZ_SETUP_OPTS} 1>&4 2>&1 || { echo "error: failed to install setuptools via ez_setup.py" >&2 return 1 } build_package_symlink_version_suffix } build_package_get_pip() { local get_pip="get-pip.py" rm -f "${get_pip}" { if [ "${GET_PIP+defined}" ] && [ -f "${GET_PIP}" ]; then echo "Installing pip from ${GET_PIP}..." 1>&2 cat "${GET_PIP}" else [ -n "${GET_PIP_URL}" ] echo "Installing pip from ${GET_PIP_URL}..." 1>&2 http get "${GET_PIP_URL}" fi } 1> "${get_pip}" "${PYTHON_BIN}" -s "${get_pip}" ${GET_PIP_OPTS} 1>&4 2>&1 || { echo "error: failed to install pip via get-pip.py" >&2 return 1 } build_package_symlink_version_suffix } # Pip <21 (in 2.7 and derivatives like PyPy-2.7) doesn't support -I build_package_ensurepip_lt21() { build_package_ensurepip lt21 } build_package_ensurepip() { local mode="$1" local ensurepip_opts # Install as `--altinstall` if the Python is installed as `altinstall` (#255) if [[ "$PYTHON_MAKE_INSTALL_TARGET" == *"altinstall"* ]]; then ensurepip_opts="--altinstall" fi local python_opts="-I" if [[ $mode == "lt21" ]]; then python_opts="-s"; fi # FIXME: `--altinstall` with `get-pip.py` "$PYTHON_BIN" $python_opts -m ensurepip ${ensurepip_opts} 1>/dev/null 2>&1 || build_package_get_pip "$@" || return 1 build_package_symlink_version_suffix } version() { local git_revision # Read the revision from git if the remote points to "python-build" repository if GIT_DIR="$PYTHON_BUILD_INSTALL_PREFIX/../../.git" git remote -v 2>/dev/null | grep -q /pyenv; then git_revision="$(GIT_DIR="$PYTHON_BUILD_INSTALL_PREFIX/../../.git" git describe --tags HEAD 2>/dev/null || true)" git_revision="${git_revision#v}" fi echo "python-build ${git_revision:-$PYTHON_BUILD_VERSION}" } usage() { sed -ne '/^#/!q;s/.\{1,2\}//;1,2d;p' < "$0" [ -z "$1" ] || exit "$1" } list_definitions() { { for DEFINITION_DIR in "${PYTHON_BUILD_DEFINITIONS[@]}"; do [ -d "$DEFINITION_DIR" ] && ls "$DEFINITION_DIR" | grep -xv patches done } | sort_versions | uniq } sort_versions() { sed 'h; s/[+-]/./g; s/.p\([[:digit:]]\)/.z.\1/; s/$/.z/; G; s/\n/ /' | \ LC_ALL=C sort -t. -k 1,1 -k 2,2n -k 3,3n -k 4,4n -k 5,5n | awk '{print $2}' } unset VERBOSE unset KEEP_BUILD_PATH unset HAS_PATCH unset DEBUG unset IPV4 unset IPV6 PYTHON_BUILD_INSTALL_PREFIX="$(abs_dirname "$0")/.." IFS=: PYTHON_BUILD_DEFINITIONS=($PYTHON_BUILD_DEFINITIONS ${PYTHON_BUILD_ROOT:-$PYTHON_BUILD_INSTALL_PREFIX}/share/python-build) IFS="$OLDIFS" parse_options "$@" for option in "${OPTIONS[@]}"; do case "$option" in "h" | "help" ) version echo usage 0 ;; "definitions" ) list_definitions exit 0 ;; "k" | "keep" ) KEEP_BUILD_PATH=true ;; "v" | "verbose" ) VERBOSE=true ;; "p" | "patch" ) HAS_STDIN_PATCH=true ;; "g" | "debug" ) DEBUG=true # Disable optimization (#808) PYTHON_CFLAGS="-O0 ${PYTHON_CFLAGS}" ;; "4" | "ipv4") IPV4=true ;; "6" | "ipv6") IPV6=true ;; "version" ) version exit 0 ;; esac done [ "${#ARGUMENTS[@]}" -eq 2 ] || usage 1 >&2 DEFINITION_PATH="${ARGUMENTS[0]}" if [ -z "$DEFINITION_PATH" ]; then usage 1 >&2 elif [ ! -f "$DEFINITION_PATH" ]; then for DEFINITION_DIR in "${PYTHON_BUILD_DEFINITIONS[@]}"; do if [ -f "${DEFINITION_DIR}/${DEFINITION_PATH}" ]; then DEFINITION_PATH="${DEFINITION_DIR}/${DEFINITION_PATH}" break fi done if [ ! -f "$DEFINITION_PATH" ]; then echo "python-build: definition not found: ${DEFINITION_PATH}" >&2 exit 2 fi fi PREFIX_PATH="${ARGUMENTS[1]}" if [ -z "$PREFIX_PATH" ]; then usage 1 >&2 elif [ "${PREFIX_PATH#/}" = "$PREFIX_PATH" ]; then PREFIX_PATH="${PWD}/${PREFIX_PATH}" fi if [ -z "$TMPDIR" ]; then TMP="/tmp" else TMP="${TMPDIR%/}" fi # Check if TMPDIR is accessible and can hold executables. tmp_executable="${TMP}/python-build-test.$$" noexec="" if mkdir -p "$TMP" && touch "$tmp_executable" 2>/dev/null; then cat > "$tmp_executable" <<-EOF #!${BASH} exit 0 EOF chmod +x "$tmp_executable" else echo "python-build: TMPDIR=$TMP is set to a non-accessible location" >&2 exit 1 fi "$tmp_executable" 2>/dev/null || noexec=1 rm -f "$tmp_executable" if [ -n "$noexec" ]; then echo "python-build: TMPDIR=$TMP cannot hold executables (partition possibly mounted with \`noexec\`)" >&2 exit 1 fi if [ -z "$MAKE" ]; then if [ "FreeBSD" = "${_PYTHON_BUILD_CACHE_UNAME_S:=$(uname -s)}" ]; then if [ "$(echo $1 | sed 's/-.*$//')" = "jruby" ]; then export MAKE="gmake" else # var assignment inside $() does not propagate due to being in subshell : "${_PYTHON_BUILD_CACHE_UNAME_R:=$(uname -r)}" if [ "$(echo "$_PYTHON_BUILD_CACHE_UNAME_R" | sed 's/[^[:digit:]].*//')" -lt 10 ]; then export MAKE="gmake" else export MAKE="make" fi fi else export MAKE="make" fi fi if [ -n "$PYTHON_BUILD_CACHE_PATH" ] && [ -d "$PYTHON_BUILD_CACHE_PATH" ]; then PYTHON_BUILD_CACHE_PATH="${PYTHON_BUILD_CACHE_PATH%/}" else unset PYTHON_BUILD_CACHE_PATH fi if [ -z "$PYTHON_BUILD_MIRROR_URL" ]; then PYTHON_BUILD_MIRROR_URL="https://pyenv.github.io/pythons" PYTHON_BUILD_DEFAULT_MIRROR=1 else PYTHON_BUILD_MIRROR_URL="${PYTHON_BUILD_MIRROR_URL%/}" PYTHON_BUILD_DEFAULT_MIRROR= fi if [ -n "$PYTHON_BUILD_SKIP_MIRROR" ]; then unset PYTHON_BUILD_MIRROR_URL fi if ! has_checksum_support compute_sha2 && ! [ -n "$PYTHON_BUILD_MIRROR_URL_SKIP_CHECKSUM" ] ; then unset PYTHON_BUILD_MIRROR_URL fi ARIA2_OPTS="${PYTHON_BUILD_ARIA2_OPTS} ${IPV4+--disable-ipv6=true} ${IPV6+--disable-ipv6=false}" CURL_OPTS="${PYTHON_BUILD_CURL_OPTS} ${IPV4+--ipv4} ${IPV6+--ipv6}" WGET_OPTS="${PYTHON_BUILD_WGET_OPTS} ${IPV4+--inet4-only} ${IPV6+--inet6-only}" # Add an option to build a debug version of Python (#11) if [ -n "$DEBUG" ]; then package_option python configure --with-pydebug fi if [[ "$CONFIGURE_OPTS $PYTHON_CONFIGURE_OPTS" != *"--enable-framework"* && "$CONFIGURE_OPTS $PYTHON_CONFIGURE_OPTS" != *"--disable-shared"* ]]; then package_option python configure --enable-shared fi # python-build: Specify `--libdir` on configure to fix build on openSUSE (#36) package_option python configure --libdir="${PREFIX_PATH}/lib" # python-build: Set `RPATH` if `--enable-shared` was given (#65, #66, #82) if [[ "$CONFIGURE_OPTS $PYTHON_CONFIGURE_OPTS ${PYTHON_CONFIGURE_OPTS_ARRAY[@]}" == *"--enable-shared"* ]]; then # The ld on Darwin embeds the full paths to each dylib by default if [[ "$LDFLAGS" != *"-rpath="* ]] ; then prepend_ldflags_libs "-Wl,-rpath,${PREFIX_PATH}/lib" fi fi # python-build: Set `RPATH` if --shared` was given for PyPy (#244) if [[ "$PYPY_OPTS" == *"--shared"* ]]; then prepend_ldflags_libs "-Wl,-rpath=${PREFIX_PATH}/lib" fi # Add support for framework installation (`--enable-framework`) of CPython (#55, #99) if [[ "$CONFIGURE_OPTS $PYTHON_CONFIGURE_OPTS" == *"--enable-framework"* ]]; then if ! is_mac; then echo "python-build: framework installation is not supported outside of MacOS." >&2 exit 1 fi create_framework_dirs() { local version="$(echo "$1" | sed -E 's/^[^0-9]*([0-9]+\.[0-9]+).*$/\1/')" mkdir -p "${PREFIX_PATH}/Library/Frameworks/Python.framework/Versions/${version}" ( cd "${PREFIX_PATH}/Library/Frameworks/Python.framework/Versions" && ln -fs "${version}" "Current") local path for path in include lib share; do mkdir -p "${PREFIX_PATH}/Library/Frameworks/Python.framework/Versions/Current/${path}" ln -fs "${PREFIX_PATH}/Library/Frameworks/Python.framework/Versions/Current/${path}" "${PREFIX_PATH}/${path}" done } create_framework_dirs "${DEFINITION_PATH##*/}" # the `/Library/Frameworks` suffix makes CPython build install apps under prefix rather than into /Applications (#1003) package_option python configure --enable-framework="${PREFIX_PATH}/Library/Frameworks" #FIXME: doesn't properly handle paths with spaces. Fix by parsing *OPTS into arrays. CONFIGURE_OPTS="${CONFIGURE_OPTS//--enable-framework?(=*([^ ]))?( )/}"; CONFIGURE_OPTS="${CONFIGURE_OPTS% }" PYTHON_CONFIGURE_OPTS="${PYTHON_CONFIGURE_OPTS//--enable-framework?(=*([^ ]))?( )/}"; PYTHON_CONFIGURE_OPTS="${PYTHON_CONFIGURE_OPTS% }" fi # Build against universal SDK if [[ "$CONFIGURE_OPTS $PYTHON_CONFIGURE_OPTS" == *"--enable-universalsdk"* ]]; then if ! is_mac; then echo "python-build: universal installation is not supported outside of MacOS." >&2 exit 1 fi package_option python configure --enable-universalsdk=/ #FIXME: doesn't properly handle paths with spaces. Fix by parsing *OPTS into arrays. CONFIGURE_OPTS="${CONFIGURE_OPTS//--enable-universalsdk?(=*([^ ]))?( )/}" CONFIGURE_OPTS="${CONFIGURE_OPTS% }" PYTHON_CONFIGURE_OPTS="${PYTHON_CONFIGURE_OPTS//--enable-universalsdk?(=*([^ ]))?( )/}" PYTHON_CONFIGURE_OPTS="${PYTHON_CONFIGURE_OPTS% }" if [[ "$CONFIGURE_OPTS $PYTHON_CONFIGURE_OPTS" != *"--with-universal-archs"* ]]; then # in CPython's configure.ac, --with-universal-archs defaults to 'intel' which means i386 + x86_64 # since 2.7.5 and 3.3.0 -- i.e. in all non-EOL versions # Apple Silicon cannot build these, in it, it rather makes sense to default to Universal2 binaries if [[ $(arch) == "arm64" ]]; then package_option python configure --with-universal-archs=universal2 fi fi fi # Compile with `--enable-unicode=ucs4` by default (#257) if [[ "$PYTHON_CONFIGURE_OPTS" != *"--enable-unicode="* ]]; then if ! is_mac; then # Skip specifying `--enable-unicode` for CPython 3.3+ (#912) case "${DEFINITION_PATH##*/}" in "2."* | \ "3.0" | "3.0."* | "3.0-"* | \ "3.1" | "3.1."* | "3.1-"* | \ "3.2" | "3.2."* | "3.2-"* ) package_option python configure --enable-unicode=ucs4 ;; esac fi fi # Unset `PIP_REQUIRE_VENV` during build (#216) unset PIP_REQUIRE_VENV unset PIP_REQUIRE_VIRTUALENV # pydistutils.cfg may corrupt install location of Python libraries (#35, #111) if [ -e "$HOME/.pydistutils.cfg" ]; then { colorize 1 "WARNING" echo ": Please make sure you remove any previous custom paths from your $HOME/.pydistutils.cfg file." } >&2 fi # Download specified version of ez_setup.py/get-pip.py (#202) if [ -z "${EZ_SETUP_URL}" ]; then if [ -n "${SETUPTOOLS_VERSION}" ]; then EZ_SETUP_URL="https://bitbucket.org/pypa/setuptools/raw/${SETUPTOOLS_VERSION}/ez_setup.py" unset SETUPTOOLS_VERSION else EZ_SETUP_URL="https://bootstrap.pypa.io/ez_setup.py" fi fi if [ -z "${GET_PIP_URL}" ]; then if [ -n "${PIP_VERSION}" ]; then { colorize 1 "WARNING" echo ": Setting PIP_VERSION=${PIP_VERSION} is no longer supported and may cause failures during the install process." } 1>&2 GET_PIP_URL="https://raw.githubusercontent.com/pypa/pip/${PIP_VERSION}/contrib/get-pip.py" # Unset `PIP_VERSION` from environment before invoking `get-pip.py` to deal with "ValueError: invalid truth value" (pypa/pip#4528) unset PIP_VERSION else # Use custom get-pip URL based on the target version (#1127) case "${DEFINITION_PATH##*/}" in 2.6 | 2.6.* ) GET_PIP_URL="https://bootstrap.pypa.io/pip/2.6/get-pip.py" ;; 2.7 | 2.7.* | pypy2.7 | pypy2.7-* ) GET_PIP_URL="https://bootstrap.pypa.io/pip/2.7/get-pip.py" ;; 3.2 | 3.2.* ) GET_PIP_URL="https://bootstrap.pypa.io/pip/3.2/get-pip.py" ;; 3.3 | 3.3.* ) GET_PIP_URL="https://bootstrap.pypa.io/pip/3.3/get-pip.py" ;; 3.4 | 3.4.* ) GET_PIP_URL="https://bootstrap.pypa.io/pip/3.4/get-pip.py" ;; 3.5 | 3.5.* | pypy3.5 | pypy3.5-* ) GET_PIP_URL="https://bootstrap.pypa.io/pip/3.5/get-pip.py" ;; 3.6 | 3.6.* | pypy3.6 | pypy3.6-* ) GET_PIP_URL="https://bootstrap.pypa.io/pip/3.6/get-pip.py" ;; 3.7 | 3.7.* | pypy3.7 | pypy3.7-* ) GET_PIP_URL="https://bootstrap.pypa.io/pip/3.7/get-pip.py" ;; 3.8 | 3.8.* | pypy3.8 | pypy3.8-* | pyston* ) GET_PIP_URL="https://bootstrap.pypa.io/pip/3.8/get-pip.py" ;; * ) GET_PIP_URL="https://bootstrap.pypa.io/get-pip.py" ;; esac fi fi # Set MACOSX_DEPLOYMENT_TARGET from the product version of OS X (#219, #220) if is_mac; then if [ -z "${MACOSX_DEPLOYMENT_TARGET}" ]; then MACOS_VERSION="${_PYTHON_BUILD_CACHE_SW_VERS:=$(sw_vers -productVersion)}" MACOS_VERSION_ARRAY=(${MACOS_VERSION//\./ }) if [ "${#MACOS_VERSION_ARRAY[@]}" -ge 2 ]; then export MACOSX_DEPLOYMENT_TARGET="${MACOS_VERSION_ARRAY[0]}.${MACOS_VERSION_ARRAY[1]}" fi fi fi python_bin_suffix() { local version_name version_info case "$1" in 2.* | 3.* ) version_name="$1" version_name="${version_name%-dev}" version_name="${version_name%-rc*}" version_name="${version_name%rc*}" version_name="${version_name%%*([^0-9])}" version_info=(${version_name//./ }) echo "${version_info[0]}.${version_info[1]}" ;; stackless-2.* | stackless-3.* ) version_name="${1#stackless-}" version_name="${version_name%-dev}" version_name="${version_name%-rc*}" version_name="${version_name%rc*}" version_info=(${version_name//./ }) echo "${version_info[0]}.${version_info[1]}" ;; esac } SEED="$(date "+%Y%m%d%H%M%S").$$" LOG_PATH="${TMP}/python-build.${SEED}.log" PYTHON_BIN="${PREFIX_PATH}/bin/python$(python_bin_suffix "${DEFINITION_PATH##*/}")" CWD="$(pwd)" if [ -z "$PYTHON_BUILD_BUILD_PATH" ]; then BUILD_PATH="${TMP}/python-build.${SEED}" else BUILD_PATH="$PYTHON_BUILD_BUILD_PATH" fi exec 4<> "$LOG_PATH" # open the log file at fd 4 if [ -n "$VERBOSE" ]; then tail -f "$LOG_PATH" & TAIL_PID=$! trap "kill $TAIL_PID" SIGINT SIGTERM EXIT fi prepend_ldflags_libs "-L${PREFIX_PATH}/lib" export CPPFLAGS="-I${PREFIX_PATH}/include${CPPFLAGS:+ $CPPFLAGS}" unset PYTHONHOME unset PYTHONPATH trap build_failed ERR mkdir -p "$BUILD_PATH" source "$DEFINITION_PATH" [ -z "${KEEP_BUILD_PATH}" ] && rm -fr "$BUILD_PATH" trap - ERR pyenv-pyenv-485090e/plugins/python-build/install.sh000077500000000000000000000007301517431316200224010ustar00rootroot00000000000000#!/bin/sh # Usage: PREFIX=/usr/local ./install.sh # # Installs python-build under $PREFIX. set -e cd "$(dirname "$0")" if [ -z "${PREFIX}" ]; then PREFIX="/usr/local" fi BIN_PATH="${PREFIX}/bin" SHARE_PATH="${PREFIX}/share/python-build" mkdir -p "$BIN_PATH" "$SHARE_PATH" install -p bin/* "$BIN_PATH" for share in share/python-build/*; do if [ -d "$share" ]; then cp -RPp "$share" "$SHARE_PATH" else install -p -m 0644 "$share" "$SHARE_PATH" fi done pyenv-pyenv-485090e/plugins/python-build/scripts/000077500000000000000000000000001517431316200220635ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/scripts/.gitignore000066400000000000000000000000061517431316200240470ustar00rootroot00000000000000/venv pyenv-pyenv-485090e/plugins/python-build/scripts/README.md000066400000000000000000000015461517431316200233500ustar00rootroot00000000000000# Scripts for updating python-build Install dependencies with `pip install -r requirements.txt`. ## add_miniconda.py ```_add_miniconda usage: add_miniconda.py [-h] [-d] [-v] Script to add non-"latest" miniconda releases. Written for python 3.7. Checks the miniconda download archives for new versions, then writes a build script for any which do not exist locally, saving it to plugins/python- build/share/python-build. Ignores releases below 4.3.30. Also ignores sub- patch releases if that major.minor.patch already exists, but otherwise, takes the latest sub-patch release for given OS/arch. Assumes all miniconda3 releases < 4.7 default to python 3.6, and anything else 3.7. optional arguments: -h, --help show this help message and exit -d, --dry-run Do not write scripts, just report them to stdout -v, --verbose Increase verbosity of logging ``` pyenv-pyenv-485090e/plugins/python-build/scripts/add_cpython.py000077500000000000000000000526301517431316200247420ustar00rootroot00000000000000#!/usr/bin/env python3 """Script to add CPython releases. Checks the CPython download archives for new versions, then writes a build script for any which do not exist locally, saving it to plugins/python-build/share/python-build. """ import argparse import dataclasses import hashlib import io import itertools import logging import operator import os.path import pathlib import pprint import re import subprocess import sys import typing import urllib.parse import jc import more_itertools import packaging.version import requests import requests_html import sortedcontainers import tqdm logger = logging.getLogger(__name__) CUTOFF_VERSION=packaging.version.Version('3.10') EXCLUDED_VERSIONS= { } here = pathlib.Path(__file__).resolve() OUT_DIR: pathlib.Path = here.parent.parent / "share" / "python-build" T_THUNK=\ '''export PYTHON_BUILD_FREE_THREADING=1 source "${BASH_SOURCE[0]%t}" ''' def adapt_script(version: packaging.version.Version, previous_version: packaging.version.Version) -> typing.Union[pathlib.Path, None]: previous_version_path = OUT_DIR.joinpath(str(previous_version)) with previous_version_path.open("r", encoding='utf-8') as f: script = f.readlines() result = io.StringIO() for line in script: if m:=re.match(r'\s*install_package\s+"(?PPython-\S+)"\s+' r'"(?P\S+)"\s+.*\s+verify_py(?P\d+)\s+.*$', line): existing_url_path = urllib.parse.urlparse(m.group('url')).path try: matched_download = more_itertools.one( item for item in VersionDirectory.available[version].downloads if existing_url_path.endswith(item.extension)) except ValueError: logger.error(f'Cannot match existing URL path\'s {existing_url_path} extension ' f'to available downloads {VersionDirectory.available[version].downloads}') return new_package_name, new_package_url = matched_download.package_name, matched_download.url new_package_hash = Url.sha256_url(new_package_url, VersionDirectory.session) verify_py_suffix = str(version.major)+str(version.minor) line = Re.sub_groups(m, package=new_package_name, url=new_package_url+'#'+new_package_hash, verify_py_suffix=verify_py_suffix) elif m:=re.match(r'\s*install_package\s+"(?Popenssl-\S+)"\s+' r'"(?P\S+)"\s.*$', line): item = VersionDirectory.openssl.get_store_latest_release() line = Re.sub_groups(m, package=item.package_name, url=item.url + '#' + item.hash) elif m:=re.match(r'\s*install_package\s+"(?Preadline-\S+)"\s+' r'"(?P\S+)"\s.*$', line): item = VersionDirectory.readline.get_store_latest_release() line = Re.sub_groups(m, package=item.package_name, url=item.url + '#' + item.hash) result.write(line) result_path = OUT_DIR.joinpath(str(version)) logger.info(f"Writing {result_path}") result_path.write_text(result.getvalue(), encoding='utf-8') result.close() return result_path def add_version(version: packaging.version.Version): previous_version = VersionDirectory.existing.pick_previous_version(version).version is_prerelease_upgrade = previous_version.major==version.major\ and previous_version.minor==version.minor\ and previous_version.micro==version.micro logger.info(f"Adding {version} based on {previous_version}" + (" (prerelease upgrade)" if is_prerelease_upgrade else "")) VersionDirectory.available.get_store_available_source_downloads(version) new_path = adapt_script(version, previous_version) if not new_path: return False VersionDirectory.existing.append(_CPythonExistingScriptInfo(version,str(new_path))) cleanup_prerelease_upgrade(is_prerelease_upgrade, previous_version, version) handle_t_thunks(version, previous_version, is_prerelease_upgrade) print(version) return True def cleanup_prerelease_upgrade( is_prerelease_upgrade: bool, previous_version: packaging.version.Version, new_version: packaging.version.Version)\ -> None: if not is_prerelease_upgrade: return previous_version_filename = str(previous_version) new_version_filename = str(new_version) new_version_path = OUT_DIR / new_version_filename logger.info(f'Git moving {previous_version_filename} ' f'to {new_version_filename} (preserving new data)') data = new_version_path.read_text() new_version_path.unlink() subprocess.check_call(("git","-C",OUT_DIR, "mv", previous_version_filename, new_version_filename)) new_version_path.write_text(data) del VersionDirectory.existing[previous_version] def handle_t_thunks(version, previous_version, is_prerelease_upgrade): if (version.major, version.minor) < (3, 13): return # an old thunk may have older version-specific code # so it's safer to write a known version-independent template thunk_name = (str(version) + "t") thunk_path = OUT_DIR / thunk_name previous_thunk_name = str(previous_version) + "t" if is_prerelease_upgrade: logger.info(f"Git moving {previous_thunk_name} to {thunk_name}") subprocess.check_call(("git","-C",OUT_DIR, "mv", previous_thunk_name, thunk_name)) logger.info(f"Writing {thunk_path}") thunk_path.write_text(T_THUNK, encoding='utf-8') Arguments: argparse.Namespace def main(): global Arguments Arguments = parse_args() logging.basicConfig(level=logging.DEBUG if Arguments.verbose else logging.INFO) cached_session=requests_html.HTMLSession() global VersionDirectory VersionDirectory = _VersionDirectory(cached_session) VersionDirectory.existing.populate() VersionDirectory.available.populate() for initial_release in (v for v in frozenset(VersionDirectory.available.keys()) if v.micro == 0 and v not in VersionDirectory.existing): # may actually be a prerelease VersionDirectory.available.get_store_available_source_downloads(initial_release, True) del initial_release versions_to_add = sorted(VersionDirectory.available.keys() - VersionDirectory.existing.keys()) logger.info("Versions to add:\n"+pprint.pformat(versions_to_add)) result = False for version_to_add in versions_to_add: result = add_version(version_to_add) or result return int(not result) def parse_args(): parser = argparse.ArgumentParser(description=__doc__) parser.add_argument( "-d", "--dry-run", action="store_true", help="Do not write scripts, just report them to stdout", ) parser.add_argument( "-v", "--verbose", action="store_true", default=0, help="Increase verbosity of logging", ) parsed = parser.parse_args() return parsed T = typing.TypeVar('T', bound=object) K = typing.TypeVar('K', bound=typing.Hashable) class KeyedList(typing.List[T], typing.Mapping[K, T]): key_field: str item_init: typing.Callable[..., T] = None def __init__(self, seq: typing.Union[typing.Iterable[T], None] = None): super().__init__() self._map = {} if seq is not None: self.__iadd__(seq) # read def __getitem__(self, key: K) -> T: return self._map[key] def __contains__(self, key: K): return key in self._map def keys(self) -> typing.AbstractSet[K]: return self._map.keys() # write def append(self, item: T) -> None: key = self._getkey(item) if key in self: raise ValueError(f"Key '{key:r}' already present") super().append(item) self._map[key] = item def __iadd__(self, other: typing.Iterable[T]): for item in other: self.append(item) return self def __delitem__(self, key: K): super().remove(self[key]) del self._map[key] def clear(self): super().__delitem__(slice(None,None)) self._map.clear() # read-write def get_or_create(self, key: K, **kwargs): try: return self[key] except KeyError as e: if self.item_init is None: raise AttributeError("'item_init' must be set to use automatic item creation") from e kwargs[self.key_field] = key item = self.item_init(**kwargs) self.append(item) return item # info def __repr__(self): return self.__class__.__name__ + "([" + ", ".join(repr(i) for i in self) + "])" # private def _getkey(self, item: T) -> K: return getattr(item, self.key_field) del T, K @dataclasses.dataclass(frozen=True) class _CPythonAvailableVersionDownloadInfo: extension: str package_name: str url: str class _CPythonAvailableVersionDownloadsDirectory(KeyedList[_CPythonAvailableVersionDownloadInfo, str]): key_field = "extension" @dataclasses.dataclass(frozen=True) class _CPythonAvailableVersionInfo: version: packaging.version.Version download_page_url: str downloads: _CPythonAvailableVersionDownloadsDirectory = dataclasses.field( default_factory=lambda:_CPythonAvailableVersionDownloadsDirectory() ) class CPythonAvailableVersionsDirectory(KeyedList[_CPythonAvailableVersionInfo, packaging.version.Version]): key_field = "version" _session: requests.Session item_init = _CPythonAvailableVersionInfo def __init__(self, session: requests.Session, seq=None): super().__init__(seq) self._session = session def populate(self): """ Fetch remote versions """ logger.info("Fetching available CPython versions") for name, url in DownloadPage.enum_download_entries( "https://www.python.org/ftp/python/", r'^(\d+.*)/$', self._session, make_name= lambda m: m.group(1) ): v = packaging.version.Version(name) if v < CUTOFF_VERSION or v in EXCLUDED_VERSIONS: continue logger.debug(f'Available version: {name} ({v}), {url}') self.append(_CPythonAvailableVersionInfo( v, url )) def get_store_available_source_downloads(self, version, refine_mode=False): entry = self[version] if entry.downloads: #already retrieved return additional_versions_found =\ CPythonAvailableVersionsDirectory(self._session) if refine_mode else None exact_download_found = False for name, url in DownloadPage.enum_download_entries( entry.download_page_url, r'Python-.*\.(tar\.xz|tgz)$', self._session): m = re.match(r'(?PPython-(?P.*))\.(?Ptar\.xz|tgz)$', name) download_version = packaging.version.Version(m.group("version")) if download_version != version: if not refine_mode: raise ValueError(f"Unexpectedly found a download {name} for {download_version} " f"at page {entry.download_page_url} for {version}") entry_to_fill = additional_versions_found.get_or_create( download_version, download_page_url=entry.download_page_url ) else: exact_download_found = True entry_to_fill = entry entry_to_fill.downloads.append(_CPythonAvailableVersionDownloadInfo( m.group("extension"), m.group('package'), url )) if not exact_download_found: actual_version = max(additional_versions_found.keys()) logger.debug(f"Refining available version {version} to {actual_version}") del self[version] self.append( additional_versions_found[ actual_version ]) class _CPythonExistingScriptInfo(typing.NamedTuple): version: packaging.version.Version filename: str class CPythonExistingScriptsDirectory(KeyedList[_CPythonExistingScriptInfo, packaging.version.Version]): key_field = "version" _filename_pattern = r'^\d+\.\d+(?:(t?)(-\w+)|(.\d+((?:a|b|rc)\d)?(t?)))$' def populate(self): """ Enumerate existing installation scripts in share/python-build/ by pattern """ logger.info(f"Enumerating existing versions in {OUT_DIR}") for entry_name in (p.name for p in OUT_DIR.iterdir() if p.is_file()): if (not (m := re.match(self._filename_pattern, entry_name)) or m.group(1) == 't' or m.group(5) == 't'): continue try: v = packaging.version.Version(entry_name) if v < CUTOFF_VERSION: continue # branch tip scrpts are different from release scripts and thus unusable as a pattern if v.dev is not None: continue logger.debug(f"Existing version {v}") self.append(_CPythonExistingScriptInfo(v, entry_name)) except ValueError as e: logger.error(f"Unable to parse existing version {entry_name}: {e}") def pick_previous_version(self, version: packaging.version.Version) \ -> _CPythonExistingScriptInfo: return max(v for v in self if v.version < version) class _OpenSSLVersionInfo(typing.NamedTuple): version: packaging.version.Version package_name: str url: str hash: str class OpenSSLVersionsDirectory(KeyedList[_OpenSSLVersionInfo, packaging.version.Version]): key_field = "version" def get_store_latest_release(self) \ -> _OpenSSLVersionInfo: if self: #already retrieved return self[max(self.keys())] j = requests.get("https://api.github.com/repos/openssl/openssl/releases/latest").json() # noinspection PyTypeChecker # urlparse can parse str as well as bytes shasum_url = more_itertools.one( asset['browser_download_url'] for asset in j['assets'] if urllib.parse.urlparse(asset['browser_download_url']).path.split('/')[-1].endswith('.sha256') ) shasum_text = requests.get(shasum_url).text shasum_data = jc.parse("hashsum", shasum_text, quiet=True)[0] package_hash, package_filename = shasum_data["hash"], shasum_data["filename"] del shasum_data, shasum_text, shasum_url # OpenSSL Github repo has tag names "openssl-" as of this writing like we need # but let's not rely on that # splitext doesn't work with a chained extension, it only splits off the last one package_name, package_version_str = re.match(r"([^-]+-(.*?))\.\D", package_filename).groups() package_version = packaging.version.Version(package_version_str) package_url = more_itertools.one( asset['browser_download_url'] for asset in j['assets'] if urllib.parse.urlparse(asset['browser_download_url']).path.split('/')[-1] == package_filename ) result = _OpenSSLVersionInfo(package_version, package_name, package_url, package_hash) self.append(result) return result class _ReadlineVersionInfo(typing.NamedTuple): version : packaging.version.Version package_name : str url : str hash : str class ReadlineVersionsDirectory(KeyedList[_ReadlineVersionInfo, packaging.version.Version]): key_field = "version" def get_store_latest_release(self): if not self: self._store_latest_release() return self._latest_release() def _store_latest_release(self): candidates = ReadlineVersionsDirectory() pattern = r'(?Preadline-(?P\d+(?:\.\d+)+)).tar\.gz$' for name, url in DownloadPage.enum_download_entries( 'https://ftpmirror.gnu.org/readline/', pattern, VersionDirectory.session): m = re.match(pattern, name) version = packaging.version.Version(m.group('version')) candidates.append(_ReadlineVersionInfo( version, m.group('package_name'), url, "" )) max_item = candidates._latest_release() hash_ = Url.sha256_url(max_item.url, VersionDirectory.session) permalink = 'https://ftpmirror.gnu.org/readline/' +\ os.path.basename(urllib.parse.urlparse(max_item.url).path) result = _ReadlineVersionInfo( max_item.version, max_item.package_name, permalink, hash_) self.append(result) return result def _latest_release(self): return self[max(self.keys())] class _VersionDirectory: def __init__(self, session): self.existing = CPythonExistingScriptsDirectory() self.available = CPythonAvailableVersionsDirectory(session) self.openssl = OpenSSLVersionsDirectory() self.readline = ReadlineVersionsDirectory() self.session = session VersionDirectory : _VersionDirectory class DownloadPage: class _DownloadPageEntry(typing.NamedTuple): name: str url: str @classmethod def enum_download_entries(cls, url, pattern, session=None, make_name = lambda m: m.string ) \ -> typing.Generator[_DownloadPageEntry, None, None]: """ Enum download entries in a standard Apache directory page (incl. CPython download page https://www.python.org/ftp/python/) or a GNU mirror directory page (https://ftpmirror.gnu.org// destinations) """ if session is None: session = requests_html.HTMLSession() response = session.get(url) page = response.html table = page.find("pre", first=True) # some GNU mirrors format entries as a table # (e.g. https://mirrors.ibiblio.org/gnu/readline/) if table is None: table = page.find("table", first=True) links = table.find("a") for link in links: href = link.attrs['href'] # CPython entries are directories name = link.text # skip directory entries if not (m:=re.match(pattern, name)): continue name = make_name(m) yield cls._DownloadPageEntry(name, urllib.parse.urljoin(response.url, href)) class Re: @dataclasses.dataclass class _interval: group: typing.Union[int, str, None] start: int end: int @staticmethod def sub_groups(match: re.Match, /, *args: [typing.AnyStr], **kwargs: [typing.AnyStr])\ -> typing.AnyStr: repls={i:repl for i,repl in enumerate(args) if repl is not None} repls.update({n:repl for n,repl in kwargs.items() if repl is not None}) intervals: sortedcontainers.SortedList[Re._interval]=\ sortedcontainers.SortedKeyList(key=operator.attrgetter("start","end")) for group_id in itertools.chain(range(1,len(match.groups())), match.groupdict().keys()): if group_id not in repls: continue if match.start(group_id) == -1: continue intervals.add(Re._interval(group_id,match.start(group_id),match.end(group_id))) del group_id last_interval=Re._interval(None,0,0) result="" for interval in intervals: if interval.start < last_interval.end: raise ValueError(f"Cannot replace intersecting matches " f"for groups {last_interval.group} and {interval.group} " f"(position {interval.start})") if interval.end == interval.start and \ last_interval.start == last_interval.end == interval.start: raise ValueError(f"Cannot replace consecutive zero-length matches " f"for groups {last_interval.group} and {interval.group} " f"(position {interval.start})") result+=match.string[last_interval.end:interval.start]+repls[interval.group] last_interval = interval result+=match.string[last_interval.end:] return result class Url: @staticmethod def sha256_url(url, session=None): if session is None: session = requests_html.HTMLSession() logger.info(f"Downloading and computing hash of {url}") h=hashlib.sha256() r=session.get(url,stream=True) total_bytes=int(r.headers.get('content-length',0)) or float('inf') with tqdm.tqdm(total=total_bytes, unit='B', unit_scale=True, unit_divisor=1024) as t: for c in r.iter_content(1024): t.update(len(c)) h.update(c) return h.hexdigest() if __name__ == "__main__": sys.exit(main()) pyenv-pyenv-485090e/plugins/python-build/scripts/add_miniconda.py000077500000000000000000000320721517431316200252150ustar00rootroot00000000000000#!/usr/bin/env python3 """Script to add non-"latest" miniconda releases. Written for python 3.7. Checks the miniconda download archives for new versions, then writes a build script for any which do not exist locally, saving it to plugins/python-build/share/python-build. Ignores releases below 4.3.30. Also ignores sub-patch releases if that major.minor.patch already exists, but otherwise, takes the latest sub-patch release for given OS/arch. Assumes all miniconda3 releases < 4.7 default to python 3.6, and anything else 3.7. """ import logging import re import string import sys import textwrap from argparse import ArgumentParser from collections import defaultdict from dataclasses import dataclass from enum import Enum from functools import total_ordering from pathlib import Path from typing import NamedTuple, List, Optional, DefaultDict, Dict import requests_html logger = logging.getLogger(__name__) CONDA_REPO = "https://repo.anaconda.com" MINICONDA_REPO = CONDA_REPO + "/miniconda" ANACONDA_REPO = CONDA_REPO + "/archive" auto_accept_tos_fmt="""export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true """.strip() install_script_fmt = """ {auto_accept_tos} case "$(anaconda_architecture 2>/dev/null || true)" in {install_lines} * ) {{ echo colorize 1 "ERROR" echo ": The binary distribution of {tflavor} is not available for $(anaconda_architecture 2>/dev/null || true)." echo }} >&2 exit 1 ;; esac """.lstrip() install_line_fmt = """ "{os}-{arch}" ) install_script "{tflavor}{suffix}-{version_py_version}{version_str}-{os}-{arch}" "{repo}/{tflavor}{suffix}-{version_py_version}{version_str}-{os}-{arch}.sh#{md5}" "{flavor}" verify_{py_version} ;; """.strip() here = Path(__file__).resolve() out_dir: Path = here.parent.parent / "share" / "python-build" class StrEnum(str, Enum): """Enum subclass whose members are also instances of str and directly comparable to strings. str type is forced at declaration. Adapted from https://github.com/kissgyorgy/enum34-custom/blob/dbc89596761c970398701d26c6a5bbcfcf70f548/enum_custom.py#L100 (MIT license) """ def __new__(cls, *args): for arg in args: if not isinstance(arg, str): raise TypeError("Not text %s:" % arg) return super(StrEnum, cls).__new__(cls, *args) def __str__(self): return str(self.value) class SupportedOS(StrEnum): LINUX = "Linux" MACOSX = "MacOSX" class SupportedArch(StrEnum): AARCH64 = "aarch64" ARM64 = "arm64" PPC64LE = "ppc64le" S390X = "s390x" X86_64 = "x86_64" X86 = "x86" class Flavor(StrEnum): ANACONDA = "anaconda" MINICONDA = "miniconda" class TFlavor(StrEnum): ANACONDA = "Anaconda" MINICONDA = "Miniconda" class Suffix(StrEnum): TWO = "2" THREE = "3" NONE = "" PyVersion = None class PyVersionMeta(type): def __getattr__(self, name): """Generate PyVersion.PYXXX on demand to future-proof it""" if PyVersion is not None: return PyVersion(name.lower()) return super(PyVersionMeta,self).__getattr__(self, name) @dataclass(frozen=True) class PyVersion(metaclass=PyVersionMeta): major: str minor: str def __init__(self, value): (major, minor) = re.match(r"py(\d)(\d+)", value).groups() object.__setattr__(self, "major", major) object.__setattr__(self, "minor", minor) @property def value(self): return f"py{self.major}{self.minor}" def version(self): return f"{self.major}.{self.minor}" def version_info(self): return (self.major, self.minor) def __str__(self): return self.value @total_ordering class VersionStr(str): def info(self): return tuple(int(n) for n in self.replace("-", ".").split(".")) def __eq__(self, other): return str(self) == str(other) def __lt__(self, other): if isinstance(other, VersionStr): return self.info() < other.info() raise ValueError("VersionStr can only be compared to other VersionStr") @classmethod def from_info(cls, version_info): return VersionStr(".".join(str(n) for n in version_info)) def __hash__(self): return hash(str(self)) class CondaVersion(NamedTuple): flavor: Flavor suffix: Suffix version_str: VersionStr py_version: Optional[PyVersion] @classmethod def from_str(cls, s): """ Convert a string of the form "miniconda_n-ver" or "miniconda_n-py_ver-ver" to a :class:`CondaVersion` object. """ miniconda_n, _, remainder = s.partition("-") suffix = miniconda_n[-1] if suffix in string.digits: flavor = miniconda_n[:-1] else: flavor = miniconda_n suffix = "" components = remainder.split("-") if flavor == Flavor.MINICONDA and len(components) >= 2: py_ver, *ver_parts = components py_ver = PyVersion(f"py{py_ver.replace('.', '')}") ver = "-".join(ver_parts) else: ver = "-".join(components) py_ver = None return CondaVersion(Flavor(flavor), Suffix(suffix), VersionStr(ver), py_ver) def to_filename(self): if self.py_version: return f"{self.flavor}{self.suffix}-{self.py_version.version()}-{self.version_str}" else: return f"{self.flavor}{self.suffix}-{self.version_str}" def default_py_version(self): """ :class:`PyVersion` of Python used with this Miniconda version """ if self.py_version: return self.py_version elif self.suffix == Suffix.TWO: return PyVersion.PY27 v = self.version_str.info() if self.flavor == "miniconda": # https://docs.conda.io/projects/conda/en/latest/user-guide/tasks/manage-python.html if v < (4, 7): return PyVersion.PY36 if v < (4, 8): return PyVersion.PY37 else: # since 4.8, Miniconda specifies versions explicitly in the file name raise ValueError("Miniconda 4.8+ is supposed to specify a Python version explicitly") if self.flavor == "anaconda": # https://www.anaconda.com/docs/tools/anaconda-org/release-notes if v >= (2025,6): return PyVersion.PY313 if v >= (2024,6): return PyVersion.PY312 if v >= (2023,7): return PyVersion.PY311 if v >= (2023,3): return PyVersion.PY310 if v >= (2021,11): return PyVersion.PY39 if v >= (2020,7): return PyVersion.PY38 if v >= (2020,2): return PyVersion.PY37 if v >= (5,3,0): return PyVersion.PY37 return PyVersion.PY36 raise ValueError(self.flavor) def requires_tos_accept(self): """ requires to accept TOS for installation """ return self.flavor == Flavor.MINICONDA \ and self.version_str.info() >= (25,) class CondaSpec(NamedTuple): tflavor: TFlavor version: CondaVersion os: SupportedOS arch: SupportedArch md5: str repo: str py_version: Optional[PyVersion] = None @classmethod def from_filestem(cls, stem, md5, repo, py_version=None): # The `*vers` captures the new trailing `-1` in some file names (a build number?) # so they can be processed properly. miniconda_n, *vers, os, arch = stem.split("-") ver = "-".join(vers) suffix = miniconda_n[-1] if suffix in string.digits: tflavor = miniconda_n[:-1] else: tflavor = miniconda_n suffix = "" flavor = tflavor.lower() if ver.startswith("py"): py_ver, ver = ver.split("_", maxsplit=1) py_ver = PyVersion(py_ver) else: py_ver = None spec = CondaSpec( TFlavor(tflavor), CondaVersion(Flavor(flavor), Suffix(suffix), VersionStr(ver), py_ver), SupportedOS(os), SupportedArch(arch), md5, repo, py_ver ) if py_version is None and py_ver is None and ver != "latest": spec = spec.with_py_version(spec.version.default_py_version()) return spec def to_install_lines(self): """ Installation command for this version of Miniconda for use in a Pyenv installation script """ return install_line_fmt.format( tflavor=self.tflavor, flavor=self.version.flavor, repo=self.repo, suffix=self.version.suffix, version_str=self.version.version_str, version_py_version=f"{self.version.py_version}_" if self.version.py_version else "", os=self.os, arch=self.arch, md5=self.md5, py_version=self.py_version, ) def with_py_version(self, py_version: PyVersion): return CondaSpec(*self[:-1], py_version=py_version) def make_script(specs: List[CondaSpec]): install_lines = [s.to_install_lines() for s in specs] return install_script_fmt.format( install_lines="\n".join(install_lines), tflavor=specs[0].tflavor, auto_accept_tos = auto_accept_tos_fmt if specs[0].version.requires_tos_accept() else "" ).lstrip() def get_existing_condas(name): """ Enumerate existing Miniconda installation scripts in share/python-build/ except rolling releases. :returns: A generator of :class:`CondaVersion` objects. """ logger.info("Getting known %(name)s versions",locals()) for p in out_dir.iterdir(): entry_name = p.name if not p.is_file() or not entry_name.startswith(name): continue try: v = CondaVersion.from_str(entry_name) if v.version_str != "latest": logger.debug("Found existing %(name)s version %(v)s", locals()) yield v except ValueError as e: logger.error("Unable to parse existing version %s: %s", entry_name, e) def get_available_condas(name, repo): """ Fetch remote miniconda versions. :returns: A generator of :class:`CondaSpec` objects for each release available for download except rolling releases. """ logger.info("Fetching remote %(name)s versions",locals()) session = requests_html.HTMLSession() response = session.get(repo) page: requests_html.HTML = response.html table = page.find("table", first=True) rows = table.find("tr")[1:] for row in rows: f, size, date, md5 = row.find("td") fname = f.text md5 = md5.text if not fname.endswith(".sh"): continue stem = fname[:-3] try: s = CondaSpec.from_filestem(stem, md5, repo) if s.version.version_str != "latest": logger.debug("Found remote %(name)s version %(s)s", locals()) yield s except ValueError: pass def key_fn(spec: CondaSpec): return ( spec.tflavor, spec.version.version_str.info(), spec.version.suffix.value, spec.os.value, spec.arch.value, ) if __name__ == "__main__": parser = ArgumentParser(description=__doc__) parser.add_argument( "-d", "--dry-run", action="store_true", help="Do not write scripts, just report them to stdout", ) parser.add_argument( "-v", "--verbose", action="store_true", default=0, help="Increase verbosity of logging", ) parsed = parser.parse_args() logging.basicConfig(level=logging.DEBUG if parsed.verbose else logging.INFO) existing_versions = set() available_specs = set() for name,repo in ("miniconda",MINICONDA_REPO),("anaconda",ANACONDA_REPO): existing_versions |= set(get_existing_condas(name)) available_specs |= set(get_available_condas(name, repo)) # version triple to triple-ified spec to raw spec to_add: DefaultDict[ CondaVersion, Dict[CondaSpec, CondaSpec] ] = defaultdict(dict) logger.info("Checking for new versions") for s in sorted(available_specs, key=key_fn): key = s.version vv = key.version_str.info() reason = None if key in existing_versions: reason = "already exists" elif key.version_str.info() <= (4, 3, 30): reason = "too old" elif len(key.version_str.info()) >= 4 and "-" not in key.version_str: reason = "ignoring hotfix releases" if reason: logger.debug("Ignoring version %(s)s (%(reason)s)", locals()) continue to_add[key][s] = s logger.info("Writing %s scripts", len(to_add)) for ver, d in to_add.items(): specs = list(d.values()) fpath = out_dir / ver.to_filename() script_str = make_script(specs) logger.info("Writing script for %s", ver) if parsed.dry_run: print(f"Would write spec to {fpath}:\n" + textwrap.indent(script_str, " ")) else: with open(fpath, "w") as f: f.write(script_str) pyenv-pyenv-485090e/plugins/python-build/scripts/add_miniforge.py000077500000000000000000000125551517431316200252370ustar00rootroot00000000000000#!/usr/bin/env python3 'Adds the latest miniforge and mambaforge releases.' from pathlib import Path import logging import os import string import requests logger = logging.getLogger(__name__) logging.basicConfig(level=os.environ.get('LOGLEVEL', 'INFO')) MINIFORGE_REPO = 'conda-forge/miniforge' DISTRIBUTIONS = ['miniforge'] DISTRIBUTIONS_PRE25 = ['miniforge', 'mambaforge'] SKIPPED_RELEASES = [ '4.13.0-0', #has no Mambaforge. We already generated scripts for Miniforge '22.11.1-0', #MacOS packages are broken (have broken dep tarballs, downloading them fails with 403) '22.11.1-1', #MacOS packages are broken (have broken dep tarballs, downloading them fails with 403) '22.11.1-2', #MacOS packages are broken (have broken dep tarballs, downloading them fails with 403) '25.3.0-0', #marked as prerelease, no Linux version '25.11.0-0', #regression reported in constructor, re-released as 25.11.0-1 with hotfix bumping to constructor>=3.14 (was >=3.12, 3.13 implicit) ] install_script_fmt = """ case "$(anaconda_architecture 2>/dev/null || true)" in {install_lines} * ) {{ echo colorize 1 "ERROR" echo ": The binary distribution of {flavor} is not available for $(anaconda_architecture 2>/dev/null || true)." echo }} >&2 exit 1 ;; esac """.lstrip() install_line_fmt = """ "{os}-{arch}" ) install_script "{filename}" "{url}#{sha}" "miniconda" verify_py{py_version} ;; """.strip() here = Path(__file__).resolve() out_dir: Path = here.parent.parent / "share" / "python-build" def download_sha(url): logger.info(f'Downloading SHA file {url}') tup = tuple(reversed(requests.get(url).text.replace('./', '').rstrip().split())) logger.debug(f'Got {tup}') return tup def create_spec(filename, sha, url): flavor_with_suffix, version, subversion, os, arch = filename.replace('.sh', '').split('-') suffix = flavor_with_suffix[-1] if suffix in string.digits: flavor = flavor_with_suffix[:-1] else: flavor = flavor_with_suffix spec = { 'filename': filename, 'sha': sha, 'url': url, 'py_version': py_version(version), 'flavor': flavor, 'os': os, 'arch': arch, 'installer_filename': f'{flavor_with_suffix.lower()}-{version}-{subversion}', } logger.debug(f'Created spec {spec}') return spec def version_tuple(version): return tuple(int(part) for part in version.split('-')[0].split(".")) def py_version(version): """Suffix for `verify_pyXXX` to call in the generated build script""" version_tuple_ = version_tuple(version) # current version: mentioned under https://github.com/conda-forge/miniforge?tab=readme-ov-file#requirements-and-installers # transition points: # https://github.com/conda-forge/miniforge/blame/main/Miniforge3/construct.yaml # look for "- python " in non-pypy branch and which tag the commit is first in if version_tuple_ >= (24,5): # yes, they jumped from 3.10 directly to 3.12 # https://github.com/conda-forge/miniforge/commit/bddad0baf22b37cfe079e47fd1680fdfb2183590 return "312" if version_tuple_ >= (4,14): return "310" raise ValueError("Bundled Python version unknown for release `%s'"%version) def supported(filename): return ('pypy' not in filename) and ('Windows' not in filename) def add_version(release, distributions): tag_name = release['tag_name'] download_urls = { f['name']: f['browser_download_url'] for f in release['assets'] } # can assume that sha files are named similar to release files so can also check supported(on their names) shas = dict([download_sha(url) for (name, url) in download_urls.items() if name.endswith('.sha256') and supported(os.path.basename(name)) and tag_name in name]) specs = [create_spec(filename, sha, download_urls[filename]) for (filename, sha) in shas.items() if supported(filename)] for distribution in distributions: distribution_specs = [spec for spec in specs if distribution in spec['flavor'].lower()] count = len(distribution_specs) if count > 0: output_file = out_dir / distribution_specs[0]['installer_filename'] logger.info(f'Writing {count} specs for {distribution} to {output_file}') script_str = install_script_fmt.format( install_lines="\n".join([install_line_fmt.format_map(s) for s in distribution_specs]), flavor=distribution_specs[0]['flavor'], ) with open(output_file, 'w') as f: f.write(script_str) else: logger.info(f'Did not find specs for {distribution}') def main(): for release in requests.get(f'https://api.github.com/repos/{MINIFORGE_REPO}/releases').json(): version = release['tag_name'] if version in SKIPPED_RELEASES: continue logger.info(f'Looking for {version} in {out_dir}') # mambaforge is retired https://github.com/conda-forge/miniforge/releases/tag/24.11.2-0 if version_tuple(version) >= (24, 11, 2): distributions = DISTRIBUTIONS else: distributions = DISTRIBUTIONS_PRE25 if any(not list(out_dir.glob(f'{distribution}*-{version}')) for distribution in distributions): logger.info(f'Downloading {version}') add_version(release, distributions) if __name__ == '__main__': main() pyenv-pyenv-485090e/plugins/python-build/scripts/requirements.txt000066400000000000000000000002361517431316200253500ustar00rootroot00000000000000more_itertools requests-html fake_useragent<2 lxml[html_clean] packaging requests sortedcontainers tqdm jc @ git+https://github.com/native-api/jc@haslib_mode pyenv-pyenv-485090e/plugins/python-build/share/000077500000000000000000000000001517431316200214765ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/000077500000000000000000000000001517431316200241145ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/2.1.3000066400000000000000000000013341517431316200245010ustar00rootroot00000000000000require_gcc install_package "readline-6.2" "https://ftpmirror.gnu.org/readline/readline-6.2.tar.gz#79a696070a058c233c72dd6ac697021cc64abd5ed51e59db867d66d196a89381" mac_readline --if has_broken_mac_readline install_package "Python-2.1.3" "https://www.python.org/ftp/python/2.1.3/Python-2.1.3.tgz#1bcb5bb587948bc38f36db60e15c376009c56c66570e563a08a82bf7f227afb9" standard verify_py21 #install_package "setuptools-1.4.2" "https://pypi.python.org/packages/source/s/setuptools/setuptools-1.4.2.tar.gz#263986a60a83aba790a5bffc7d009ac88114ba4e908e5c90e453b3bf2155dbbd" python #install_package "pip-1.1" "https://pypi.python.org/packages/source/p/pip/pip-1.1.tar.gz#993804bb947d18508acee02141281c77d27677f8c14eaa64d6287a1c53ef01c8" python pyenv-pyenv-485090e/plugins/python-build/share/python-build/2.2.3000066400000000000000000000013341517431316200245020ustar00rootroot00000000000000require_gcc install_package "readline-6.2" "https://ftpmirror.gnu.org/readline/readline-6.2.tar.gz#79a696070a058c233c72dd6ac697021cc64abd5ed51e59db867d66d196a89381" mac_readline --if has_broken_mac_readline install_package "Python-2.2.3" "https://www.python.org/ftp/python/2.2.3/Python-2.2.3.tgz#a8f92e6b89d47359fff0d1fbfe47f104afc77fd1cd5143e7332758b7bc100188" standard verify_py22 #install_package "setuptools-1.4.2" "https://pypi.python.org/packages/source/s/setuptools/setuptools-1.4.2.tar.gz#263986a60a83aba790a5bffc7d009ac88114ba4e908e5c90e453b3bf2155dbbd" python #install_package "pip-1.1" "https://pypi.python.org/packages/source/p/pip/pip-1.1.tar.gz#993804bb947d18508acee02141281c77d27677f8c14eaa64d6287a1c53ef01c8" python pyenv-pyenv-485090e/plugins/python-build/share/python-build/2.3.7000066400000000000000000000013341517431316200245070ustar00rootroot00000000000000require_gcc install_package "readline-6.2" "https://ftpmirror.gnu.org/readline/readline-6.2.tar.gz#79a696070a058c233c72dd6ac697021cc64abd5ed51e59db867d66d196a89381" mac_readline --if has_broken_mac_readline install_package "Python-2.3.7" "https://www.python.org/ftp/python/2.3.7/Python-2.3.7.tgz#969a9891dce9f50b13e54f9890acaf2be66715a5895bf9b11111f320c205b90e" standard verify_py23 #install_package "setuptools-1.4.2" "https://pypi.python.org/packages/source/s/setuptools/setuptools-1.4.2.tar.gz#263986a60a83aba790a5bffc7d009ac88114ba4e908e5c90e453b3bf2155dbbd" python #install_package "pip-1.1" "https://pypi.python.org/packages/source/p/pip/pip-1.1.tar.gz#993804bb947d18508acee02141281c77d27677f8c14eaa64d6287a1c53ef01c8" python pyenv-pyenv-485090e/plugins/python-build/share/python-build/2.4.0000066400000000000000000000013241517431316200245000ustar00rootroot00000000000000require_gcc install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline install_package "Python-2.4" "https://www.python.org/ftp/python/2.4/Python-2.4.tgz#ff746de0fae8691c082414b42a2bb172da8797e6e8ff66c9a39d2e452f7034e9" standard verify_py24 install_package "setuptools-1.4.2" "https://pypi.python.org/packages/source/s/setuptools/setuptools-1.4.2.tar.gz#263986a60a83aba790a5bffc7d009ac88114ba4e908e5c90e453b3bf2155dbbd" python install_package "pip-1.1" "https://pypi.python.org/packages/source/p/pip/pip-1.1.tar.gz#993804bb947d18508acee02141281c77d27677f8c14eaa64d6287a1c53ef01c8" python pyenv-pyenv-485090e/plugins/python-build/share/python-build/2.4.1000066400000000000000000000013321517431316200245000ustar00rootroot00000000000000require_gcc install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline install_package "Python-2.4.1" "https://www.python.org/ftp/python/2.4.1/Python-2.4.1.tgz#f449c3b167389324c525ad99d02376c518ac11e163dbbbc13bc88a5c7101fd00" standard verify_py24 install_package "setuptools-1.4.2" "https://pypi.python.org/packages/source/s/setuptools/setuptools-1.4.2.tar.gz#263986a60a83aba790a5bffc7d009ac88114ba4e908e5c90e453b3bf2155dbbd" python install_package "pip-1.1" "https://pypi.python.org/packages/source/p/pip/pip-1.1.tar.gz#993804bb947d18508acee02141281c77d27677f8c14eaa64d6287a1c53ef01c8" python pyenv-pyenv-485090e/plugins/python-build/share/python-build/2.4.2000066400000000000000000000013321517431316200245010ustar00rootroot00000000000000require_gcc install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline install_package "Python-2.4.2" "https://www.python.org/ftp/python/2.4.2/Python-2.4.2.tgz#2653e1846e87fd9b3ee287fefc965c80c54646548b4913a22265b0dd54493adf" standard verify_py24 install_package "setuptools-1.4.2" "https://pypi.python.org/packages/source/s/setuptools/setuptools-1.4.2.tar.gz#263986a60a83aba790a5bffc7d009ac88114ba4e908e5c90e453b3bf2155dbbd" python install_package "pip-1.1" "https://pypi.python.org/packages/source/p/pip/pip-1.1.tar.gz#993804bb947d18508acee02141281c77d27677f8c14eaa64d6287a1c53ef01c8" python pyenv-pyenv-485090e/plugins/python-build/share/python-build/2.4.3000066400000000000000000000013321517431316200245020ustar00rootroot00000000000000require_gcc install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline install_package "Python-2.4.3" "https://www.python.org/ftp/python/2.4.3/Python-2.4.3.tgz#985a413932f5e31e6280b37da6b285a3a0b2748c6786643989ed9b23de97e2d5" standard verify_py24 install_package "setuptools-1.4.2" "https://pypi.python.org/packages/source/s/setuptools/setuptools-1.4.2.tar.gz#263986a60a83aba790a5bffc7d009ac88114ba4e908e5c90e453b3bf2155dbbd" python install_package "pip-1.1" "https://pypi.python.org/packages/source/p/pip/pip-1.1.tar.gz#993804bb947d18508acee02141281c77d27677f8c14eaa64d6287a1c53ef01c8" python pyenv-pyenv-485090e/plugins/python-build/share/python-build/2.4.4000066400000000000000000000013321517431316200245030ustar00rootroot00000000000000require_gcc install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline install_package "Python-2.4.4" "https://www.python.org/ftp/python/2.4.4/Python-2.4.4.tgz#92be6e20cbc3111d9dd0c016d72ef7914c23b879dc52df7ba28df97afbf12e2e" standard verify_py24 install_package "setuptools-1.4.2" "https://pypi.python.org/packages/source/s/setuptools/setuptools-1.4.2.tar.gz#263986a60a83aba790a5bffc7d009ac88114ba4e908e5c90e453b3bf2155dbbd" python install_package "pip-1.1" "https://pypi.python.org/packages/source/p/pip/pip-1.1.tar.gz#993804bb947d18508acee02141281c77d27677f8c14eaa64d6287a1c53ef01c8" python pyenv-pyenv-485090e/plugins/python-build/share/python-build/2.4.5000066400000000000000000000013321517431316200245040ustar00rootroot00000000000000require_gcc install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline install_package "Python-2.4.5" "https://www.python.org/ftp/python/2.4.5/Python-2.4.5.tgz#6ae6f67a388a7f70ed3a20eebab5aae995ee433089d1f1724095c62f4b7389a1" standard verify_py24 install_package "setuptools-1.4.2" "https://pypi.python.org/packages/source/s/setuptools/setuptools-1.4.2.tar.gz#263986a60a83aba790a5bffc7d009ac88114ba4e908e5c90e453b3bf2155dbbd" python install_package "pip-1.1" "https://pypi.python.org/packages/source/p/pip/pip-1.1.tar.gz#993804bb947d18508acee02141281c77d27677f8c14eaa64d6287a1c53ef01c8" python pyenv-pyenv-485090e/plugins/python-build/share/python-build/2.4.6000066400000000000000000000013321517431316200245050ustar00rootroot00000000000000require_gcc install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline install_package "Python-2.4.6" "https://www.python.org/ftp/python/2.4.6/Python-2.4.6.tgz#b03f269e826927f05c966cf4f4414f3c93ee2314960859e7f8375e24e82f8b02" standard verify_py24 install_package "setuptools-1.4.2" "https://pypi.python.org/packages/source/s/setuptools/setuptools-1.4.2.tar.gz#263986a60a83aba790a5bffc7d009ac88114ba4e908e5c90e453b3bf2155dbbd" python install_package "pip-1.1" "https://pypi.python.org/packages/source/p/pip/pip-1.1.tar.gz#993804bb947d18508acee02141281c77d27677f8c14eaa64d6287a1c53ef01c8" python pyenv-pyenv-485090e/plugins/python-build/share/python-build/2.5.0000066400000000000000000000013141517431316200245000ustar00rootroot00000000000000install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline install_package "Python-2.5" "https://www.python.org/ftp/python/2.5/Python-2.5.tgz#d7bbf42e36003c6065cd19f3e67d283521858515ee923220f654131cebe1d8f2" standard verify_py25 install_package "setuptools-1.4.2" "https://pypi.python.org/packages/source/s/setuptools/setuptools-1.4.2.tar.gz#263986a60a83aba790a5bffc7d009ac88114ba4e908e5c90e453b3bf2155dbbd" python install_package "pip-1.3.1" "https://pypi.python.org/packages/source/p/pip/pip-1.3.1.tar.gz#145eaa5d1ea1b062663da1f3a97780d7edea4c63c68a37c463b1deedf7bb4957" python pyenv-pyenv-485090e/plugins/python-build/share/python-build/2.5.1000066400000000000000000000013221517431316200245000ustar00rootroot00000000000000install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline install_package "Python-2.5.1" "https://www.python.org/ftp/python/2.5.1/Python-2.5.1.tgz#1f5caee846049ca30d996f9403eefdb996295c4af664867e35dcc5eb36e4e7e8" standard verify_py25 install_package "setuptools-1.4.2" "https://pypi.python.org/packages/source/s/setuptools/setuptools-1.4.2.tar.gz#263986a60a83aba790a5bffc7d009ac88114ba4e908e5c90e453b3bf2155dbbd" python install_package "pip-1.3.1" "https://pypi.python.org/packages/source/p/pip/pip-1.3.1.tar.gz#145eaa5d1ea1b062663da1f3a97780d7edea4c63c68a37c463b1deedf7bb4957" python pyenv-pyenv-485090e/plugins/python-build/share/python-build/2.5.2000066400000000000000000000013221517431316200245010ustar00rootroot00000000000000install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline install_package "Python-2.5.2" "https://www.python.org/ftp/python/2.5.2/Python-2.5.2.tgz#834afe8a88adaf623b05ac5dd6700dd5bb5d0d5553fc74ad529359a3496e4ae3" standard verify_py25 install_package "setuptools-1.4.2" "https://pypi.python.org/packages/source/s/setuptools/setuptools-1.4.2.tar.gz#263986a60a83aba790a5bffc7d009ac88114ba4e908e5c90e453b3bf2155dbbd" python install_package "pip-1.3.1" "https://pypi.python.org/packages/source/p/pip/pip-1.3.1.tar.gz#145eaa5d1ea1b062663da1f3a97780d7edea4c63c68a37c463b1deedf7bb4957" python pyenv-pyenv-485090e/plugins/python-build/share/python-build/2.5.3000066400000000000000000000013221517431316200245020ustar00rootroot00000000000000install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline install_package "Python-2.5.3" "https://www.python.org/ftp/python/2.5.3/Python-2.5.3.tgz#c3fee607d20a77dfb72ea2e627eb4d95d25c735603435abde62c57015a0445bd" standard verify_py25 install_package "setuptools-1.4.2" "https://pypi.python.org/packages/source/s/setuptools/setuptools-1.4.2.tar.gz#263986a60a83aba790a5bffc7d009ac88114ba4e908e5c90e453b3bf2155dbbd" python install_package "pip-1.3.1" "https://pypi.python.org/packages/source/p/pip/pip-1.3.1.tar.gz#145eaa5d1ea1b062663da1f3a97780d7edea4c63c68a37c463b1deedf7bb4957" python pyenv-pyenv-485090e/plugins/python-build/share/python-build/2.5.4000066400000000000000000000013221517431316200245030ustar00rootroot00000000000000install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline install_package "Python-2.5.4" "https://www.python.org/ftp/python/2.5.4/Python-2.5.4.tgz#3d3b205611ee503a38a9433d5645a571668420bb219242c7f51af85f05664da6" standard verify_py25 install_package "setuptools-1.4.2" "https://pypi.python.org/packages/source/s/setuptools/setuptools-1.4.2.tar.gz#263986a60a83aba790a5bffc7d009ac88114ba4e908e5c90e453b3bf2155dbbd" python install_package "pip-1.3.1" "https://pypi.python.org/packages/source/p/pip/pip-1.3.1.tar.gz#145eaa5d1ea1b062663da1f3a97780d7edea4c63c68a37c463b1deedf7bb4957" python pyenv-pyenv-485090e/plugins/python-build/share/python-build/2.5.5000066400000000000000000000013221517431316200245040ustar00rootroot00000000000000install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline install_package "Python-2.5.5" "https://www.python.org/ftp/python/2.5.5/Python-2.5.5.tgz#03be1019c4fe93daeb53ba9e4294bf22a8ed4cb854cbd57e24e16f6bf63e2392" standard verify_py25 install_package "setuptools-1.4.2" "https://pypi.python.org/packages/source/s/setuptools/setuptools-1.4.2.tar.gz#263986a60a83aba790a5bffc7d009ac88114ba4e908e5c90e453b3bf2155dbbd" python install_package "pip-1.3.1" "https://pypi.python.org/packages/source/p/pip/pip-1.3.1.tar.gz#145eaa5d1ea1b062663da1f3a97780d7edea4c63c68a37c463b1deedf7bb4957" python pyenv-pyenv-485090e/plugins/python-build/share/python-build/2.5.6000066400000000000000000000013221517431316200245050ustar00rootroot00000000000000install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline install_package "Python-2.5.6" "https://www.python.org/ftp/python/2.5.6/Python-2.5.6.tgz#c2e4377597241b1065677d23327c04d0f41945d370c61a491cc88be367234c5d" standard verify_py25 install_package "setuptools-1.4.2" "https://pypi.python.org/packages/source/s/setuptools/setuptools-1.4.2.tar.gz#263986a60a83aba790a5bffc7d009ac88114ba4e908e5c90e453b3bf2155dbbd" python install_package "pip-1.3.1" "https://pypi.python.org/packages/source/p/pip/pip-1.3.1.tar.gz#145eaa5d1ea1b062663da1f3a97780d7edea4c63c68a37c463b1deedf7bb4957" python pyenv-pyenv-485090e/plugins/python-build/share/python-build/2.6.0000066400000000000000000000011021517431316200244740ustar00rootroot00000000000000install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline install_package "Python-2.6" "https://www.python.org/ftp/python/2.6/Python-2.6.tgz#7c2f21a968a737a59ed0729f4b1dc154dc3aa183c20be96055186fe43c6742d0" standard verify_py26 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/2.6.1000066400000000000000000000011101517431316200244740ustar00rootroot00000000000000install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline install_package "Python-2.6.1" "https://www.python.org/ftp/python/2.6.1/Python-2.6.1.tgz#fb65e93678e1327e3e8559cc56e1e00ed8c07162b21287a3502677892c5c515c" standard verify_py26 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/2.6.2000066400000000000000000000011101517431316200244750ustar00rootroot00000000000000install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline install_package "Python-2.6.2" "https://www.python.org/ftp/python/2.6.2/Python-2.6.2.tgz#e37ecdf249f248f4fea227adbca09c778670b64fcb5e45947ec3e093cbc12c86" standard verify_py26 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/2.6.3000066400000000000000000000011101517431316200244760ustar00rootroot00000000000000install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline install_package "Python-2.6.3" "https://www.python.org/ftp/python/2.6.3/Python-2.6.3.tgz#a71b55540690425fd82ab00819aeb92c1b23cbb4730a0ccd2e25c833b22a812e" standard verify_py26 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/2.6.4000066400000000000000000000011101517431316200244770ustar00rootroot00000000000000install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline install_package "Python-2.6.4" "https://www.python.org/ftp/python/2.6.4/Python-2.6.4.tgz#1a25a47506e4165704cfe2b07c0a064b0b5762a2d18b8fbdad5af688aeacd252" standard verify_py26 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/2.6.5000066400000000000000000000011101517431316200245000ustar00rootroot00000000000000install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline install_package "Python-2.6.5" "https://www.python.org/ftp/python/2.6.5/Python-2.6.5.tgz#b331dafdce3361834fee783795d4f68ae7cf7d379e9137c2d8e8531cea615ede" standard verify_py26 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/2.6.6000066400000000000000000000011101517431316200245010ustar00rootroot00000000000000install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline install_package "Python-2.6.6" "https://www.python.org/ftp/python/2.6.6/Python-2.6.6.tgz#372f66db46d773214e4619df1794a26449158f626138d4d2141a64c2f017fae1" standard verify_py26 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/2.6.7000066400000000000000000000011101517431316200245020ustar00rootroot00000000000000install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline install_package "Python-2.6.7" "https://www.python.org/ftp/python/2.6.7/Python-2.6.7.tgz#a8093eace4cfd3e06b05f0deb5d765e3c6cec65908048640a8cadd7a948b3826" standard verify_py26 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/2.6.8000066400000000000000000000011101517431316200245030ustar00rootroot00000000000000install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline install_package "Python-2.6.8" "https://www.python.org/ftp/python/2.6.8/Python-2.6.8.tgz#5bf02a75ffa2fcaa5a3cabb8201998519b045541975622316888ea468d9512f7" standard verify_py26 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/2.6.9000066400000000000000000000011101517431316200245040ustar00rootroot00000000000000install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline install_package "Python-2.6.9" "https://www.python.org/ftp/python/2.6.9/Python-2.6.9.tgz#7277b1285d8a82f374ef6ebaac85b003266f7939b3f2a24a3af52f9523ac94db" standard verify_py26 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/2.7-dev000066400000000000000000000010251517431316200251170ustar00rootroot00000000000000prefer_openssl11 install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline install_git "Python-2.7-dev" "https://github.com/python/cpython" "2.7" standard verify_py27 copy_python_gdb ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/2.7.0000066400000000000000000000011221517431316200244770ustar00rootroot00000000000000install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline install_package "Python-2.7" "https://www.python.org/ftp/python/2.7/Python-2.7.tgz#5670dd6c0c93b0b529781d070852f7b51ce6855615b16afcd318341af2910fb5" standard verify_py27 copy_python_gdb ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/2.7.1000066400000000000000000000011301517431316200244770ustar00rootroot00000000000000install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline install_package "Python-2.7.1" "https://www.python.org/ftp/python/2.7.1/Python-2.7.1.tgz#ca13e7b1860821494f70de017202283ad73b1fb7bd88586401c54ef958226ec8" standard verify_py27 copy_python_gdb ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/2.7.10000066400000000000000000000015231517431316200245650ustar00rootroot00000000000000install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-2.7.10" "https://www.python.org/ftp/python/2.7.10/Python-2.7.10.tar.xz#1cd3730781b91caf0fa1c4d472dc29274186480161a150294c42ce9b5c5effc0" standard verify_py27 copy_python_gdb ensurepip else install_package "Python-2.7.10" "https://www.python.org/ftp/python/2.7.10/Python-2.7.10.tgz#eda8ce6eec03e74991abb5384170e7c65fcd7522e409b8e83d7e6372add0f12a" standard verify_py27 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/2.7.11000066400000000000000000000015231517431316200245660ustar00rootroot00000000000000install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-2.7.11" "https://www.python.org/ftp/python/2.7.11/Python-2.7.11.tar.xz#962b4c45af50124ea61f11a30deb4342fc0bc21126790fa1d7f6c79809413f46" standard verify_py27 copy_python_gdb ensurepip else install_package "Python-2.7.11" "https://www.python.org/ftp/python/2.7.11/Python-2.7.11.tgz#82929b96fd6afc8da838b149107078c02fa1744b7e60999a8babbc0d3fa86fc6" standard verify_py27 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/2.7.12000066400000000000000000000015231517431316200245670ustar00rootroot00000000000000install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-2.7.12" "https://www.python.org/ftp/python/2.7.12/Python-2.7.12.tar.xz#d7837121dd5652a05fef807c361909d255d173280c4e1a4ded94d73d80a1f978" standard verify_py27 copy_python_gdb ensurepip else install_package "Python-2.7.12" "https://www.python.org/ftp/python/2.7.12/Python-2.7.12.tgz#3cb522d17463dfa69a155ab18cffa399b358c966c0363d6c8b5b3bf1384da4b6" standard verify_py27 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/2.7.13000066400000000000000000000015231517431316200245700ustar00rootroot00000000000000install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-2.7.13" "https://www.python.org/ftp/python/2.7.13/Python-2.7.13.tar.xz#35d543986882f78261f97787fd3e06274bfa6df29fac9b4a94f73930ff98f731" standard verify_py27 copy_python_gdb ensurepip else install_package "Python-2.7.13" "https://www.python.org/ftp/python/2.7.13/Python-2.7.13.tgz#a4f05a0720ce0fd92626f0278b6b433eee9a6173ddf2bced7957dfb599a5ece1" standard verify_py27 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/2.7.14000066400000000000000000000015441517431316200245740ustar00rootroot00000000000000prefer_openssl11 install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-2.7.14" "https://www.python.org/ftp/python/2.7.14/Python-2.7.14.tar.xz#71ffb26e09e78650e424929b2b457b9c912ac216576e6bd9e7d204ed03296a66" standard verify_py27 copy_python_gdb ensurepip else install_package "Python-2.7.14" "https://www.python.org/ftp/python/2.7.14/Python-2.7.14.tgz#304c9b202ea6fbd0a4a8e0ad3733715fbd4749f2204a9173a58ec53c32ea73e8" standard verify_py27 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/2.7.15000066400000000000000000000015441517431316200245750ustar00rootroot00000000000000prefer_openssl11 install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-2.7.15" "https://www.python.org/ftp/python/2.7.15/Python-2.7.15.tar.xz#22d9b1ac5b26135ad2b8c2901a9413537e08749a753356ee913c84dbd2df5574" standard verify_py27 copy_python_gdb ensurepip else install_package "Python-2.7.15" "https://www.python.org/ftp/python/2.7.15/Python-2.7.15.tgz#18617d1f15a380a919d517630a9cd85ce17ea602f9bbdc58ddc672df4b0239db" standard verify_py27 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/2.7.16000066400000000000000000000015231517431316200245730ustar00rootroot00000000000000install_package "openssl-1.0.2q" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2q.tar.gz#5744cfcbcec2b1b48629f7354203bc1e5e9b5466998bbccc5b5fcde3b18eb684" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-2.7.16" "https://www.python.org/ftp/python/2.7.16/Python-2.7.16.tar.xz#f222ef602647eecb6853681156d32de4450a2c39f4de93bd5b20235f2e660ed7" standard verify_py27 copy_python_gdb ensurepip else install_package "Python-2.7.16" "https://www.python.org/ftp/python/2.7.16/Python-2.7.16.tgz#01da813a3600876f03f46db11cc5c408175e99f03af2ba942ef324389a83bad5" standard verify_py27 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/2.7.17000066400000000000000000000015231517431316200245740ustar00rootroot00000000000000install_package "openssl-1.0.2q" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2q.tar.gz#5744cfcbcec2b1b48629f7354203bc1e5e9b5466998bbccc5b5fcde3b18eb684" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-2.7.17" "https://www.python.org/ftp/python/2.7.17/Python-2.7.17.tar.xz#4d43f033cdbd0aa7b7023c81b0e986fd11e653b5248dac9144d508f11812ba41" standard verify_py27 copy_python_gdb ensurepip else install_package "Python-2.7.17" "https://www.python.org/ftp/python/2.7.17/Python-2.7.17.tgz#f22059d09cdf9625e0a7284d24a13062044f5bf59d93a7f3382190dfa94cecde" standard verify_py27 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/2.7.18000066400000000000000000000015411517431316200245750ustar00rootroot00000000000000export PYTHON_BUILD_HOMEBREW_OPENSSL_FORMULA="openssl@1.1 openssl@1.0 openssl" install_package "openssl-1.1.1v" "https://www.openssl.org/source/openssl-1.1.1v.tar.gz" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-2.7.18" "https://www.python.org/ftp/python/2.7.18/Python-2.7.18.tar.xz#b62c0e7937551d0cc02b8fd5cb0f544f9405bafc9a54d3808ed4594812edef43" standard verify_py27 copy_python_gdb ensurepip_lt21 else install_package "Python-2.7.18" "https://www.python.org/ftp/python/2.7.18/Python-2.7.18.tgz#da3080e3b488f648a3d7a4560ddee895284c3380b11d6de75edb986526b9a814" standard verify_py27 copy_python_gdb ensurepip_lt21 fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/2.7.2000066400000000000000000000011301517431316200245000ustar00rootroot00000000000000install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline install_package "Python-2.7.2" "https://www.python.org/ftp/python/2.7.2/Python-2.7.2.tgz#1d54b7096c17902c3f40ffce7e5b84e0072d0144024184fff184a84d563abbb3" standard verify_py27 copy_python_gdb ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/2.7.3000066400000000000000000000011301517431316200245010ustar00rootroot00000000000000install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline install_package "Python-2.7.3" "https://www.python.org/ftp/python/2.7.3/Python-2.7.3.tgz#d4c20f2b5faf95999fd5fecb3f7d32071b0820516224a6d2b72932ab47a1cb8e" standard verify_py27 copy_python_gdb ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/2.7.4000066400000000000000000000011301517431316200245020ustar00rootroot00000000000000install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline install_package "Python-2.7.4" "https://www.python.org/ftp/python/2.7.4/Python-2.7.4.tgz#98c5eb9c8e65effcc0122112ba17a0bce880aa23ecb560af56b55eb55632b81a" standard verify_py27 copy_python_gdb ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/2.7.5000066400000000000000000000011301517431316200245030ustar00rootroot00000000000000install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline install_package "Python-2.7.5" "https://www.python.org/ftp/python/2.7.5/Python-2.7.5.tgz#8e1b5fa87b91835afb376a9c0d319d41feca07ffebc0288d97ab08d64f48afbf" standard verify_py27 copy_python_gdb ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/2.7.6000066400000000000000000000011301517431316200245040ustar00rootroot00000000000000install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline install_package "Python-2.7.6" "https://www.python.org/ftp/python/2.7.6/Python-2.7.6.tgz#99c6860b70977befa1590029fae092ddb18db1d69ae67e8b9385b66ed104ba58" standard verify_py27 copy_python_gdb ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/2.7.7000066400000000000000000000015151517431316200245140ustar00rootroot00000000000000install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-2.7.7" "https://www.python.org/ftp/python/2.7.7/Python-2.7.7.tar.xz#2983e3cd089b30c50e2b2234f07c2ac4fb8a5df230ab8f2e1133a1d8b208da78" standard verify_py27 copy_python_gdb ensurepip else install_package "Python-2.7.7" "https://www.python.org/ftp/python/2.7.7/Python-2.7.7.tgz#7f49c0a6705ad89d925181e27d0aaa025ee4731ce0de64776c722216c3e66c42" standard verify_py27 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/2.7.8000066400000000000000000000015151517431316200245150ustar00rootroot00000000000000install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-2.7.8" "https://www.python.org/ftp/python/2.7.8/Python-2.7.8.tar.xz#edde10a0cb7d14e2735e682882d5b287028d1485c456758154c19573db68075a" standard verify_py27 copy_python_gdb ensurepip else install_package "Python-2.7.8" "https://www.python.org/ftp/python/2.7.8/Python-2.7.8.tgz#74d70b914da4487aa1d97222b29e9554d042f825f26cb2b93abd20fdda56b557" standard verify_py27 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/2.7.9000066400000000000000000000015151517431316200245160ustar00rootroot00000000000000install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-2.7.9" "https://www.python.org/ftp/python/2.7.9/Python-2.7.9.tar.xz#90d27e14ea7e03570026850e2e50ba71ad20b7eb31035aada1cf3def8f8d4916" standard verify_py27 copy_python_gdb ensurepip else install_package "Python-2.7.9" "https://www.python.org/ftp/python/2.7.9/Python-2.7.9.tgz#c8bba33e66ac3201dabdc556f0ea7cfe6ac11946ec32d357c4c6f9b018c12c5b" standard verify_py27 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.0.1000066400000000000000000000023141517431316200244760ustar00rootroot00000000000000install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline install_package "Python-3.0.1" "https://www.python.org/ftp/python/3.0.1/Python-3.0.1.tgz#7d5f2feae9035f1d3d9e6bb7f092dbf374d6bb4b25abd0d2d11f13bba1cb04de" standard verify_py30 if [[ "Darwin" == "$(uname -s)" ]]; then # https://github.com/pyenv/pyenv/issues/456 { echo colorize 1 "WARNING" echo ": pyenv cannot install setuptools-1.4.2 to CPython 3.0.1 on OS X." echo "setuptools and pip will not be available until you install them manually." } >&2 else install_package "setuptools-1.4.2" "https://pypi.python.org/packages/source/s/setuptools/setuptools-1.4.2.tar.gz#263986a60a83aba790a5bffc7d009ac88114ba4e908e5c90e453b3bf2155dbbd" python install_package "pip-1.3.1" "https://pypi.python.org/packages/source/p/pip/pip-1.3.1.tar.gz#145eaa5d1ea1b062663da1f3a97780d7edea4c63c68a37c463b1deedf7bb4957" python fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.1.0000066400000000000000000000016311517431316200244770ustar00rootroot00000000000000install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline install_package "Python-3.1" "https://www.python.org/ftp/python/3.1/Python-3.1.tgz#99a034cf574ea3c26412b0a0728126d7fd6ea9593d099d807a25d216ed031e6a" standard verify_py31 install_package "setuptools-17.1.1" "https://pypi.python.org/packages/source/s/setuptools/setuptools-17.1.1.tar.gz#5bf42dbf406fd58a41029f53cffff1c90db5de1c5e0e560b5545cf2ec949c431" python install_package "pip-1.5.6" "https://pypi.python.org/packages/source/p/pip/pip-1.5.6.tar.gz#b1a4ae66baf21b7eb05a5e4f37c50c2706fa28ea1f8780ce8efe14dcd9f1726c" python pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.1.1000066400000000000000000000016371517431316200245060ustar00rootroot00000000000000install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline install_package "Python-3.1.1" "https://www.python.org/ftp/python/3.1.1/Python-3.1.1.tgz#5d85d7bff11c4db44920af99f64f4227c816f897f6bfa9dd8a2611165ca5f0a1" standard verify_py31 install_package "setuptools-17.1.1" "https://pypi.python.org/packages/source/s/setuptools/setuptools-17.1.1.tar.gz#5bf42dbf406fd58a41029f53cffff1c90db5de1c5e0e560b5545cf2ec949c431" python install_package "pip-1.5.6" "https://pypi.python.org/packages/source/p/pip/pip-1.5.6.tar.gz#b1a4ae66baf21b7eb05a5e4f37c50c2706fa28ea1f8780ce8efe14dcd9f1726c" python pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.1.2000066400000000000000000000016371517431316200245070ustar00rootroot00000000000000install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline install_package "Python-3.1.2" "https://www.python.org/ftp/python/3.1.2/Python-3.1.2.tgz#dffbc0561a161a4a576c6059e6990a9859a0be16ba9b5736eabe4abbb2700d1c" standard verify_py31 install_package "setuptools-17.1.1" "https://pypi.python.org/packages/source/s/setuptools/setuptools-17.1.1.tar.gz#5bf42dbf406fd58a41029f53cffff1c90db5de1c5e0e560b5545cf2ec949c431" python install_package "pip-1.5.6" "https://pypi.python.org/packages/source/p/pip/pip-1.5.6.tar.gz#b1a4ae66baf21b7eb05a5e4f37c50c2706fa28ea1f8780ce8efe14dcd9f1726c" python pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.1.3000066400000000000000000000016371517431316200245100ustar00rootroot00000000000000install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline install_package "Python-3.1.3" "https://www.python.org/ftp/python/3.1.3/Python-3.1.3.tgz#6311823aeda8be6a7a2b67caaeff48abce6626c9940ba7ed81f9c978666a36bd" standard verify_py31 install_package "setuptools-17.1.1" "https://pypi.python.org/packages/source/s/setuptools/setuptools-17.1.1.tar.gz#5bf42dbf406fd58a41029f53cffff1c90db5de1c5e0e560b5545cf2ec949c431" python install_package "pip-1.5.6" "https://pypi.python.org/packages/source/p/pip/pip-1.5.6.tar.gz#b1a4ae66baf21b7eb05a5e4f37c50c2706fa28ea1f8780ce8efe14dcd9f1726c" python pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.1.4000066400000000000000000000016371517431316200245110ustar00rootroot00000000000000install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline install_package "Python-3.1.4" "https://www.python.org/ftp/python/3.1.4/Python-3.1.4.tgz#fadc05ea6d05360cff189944a85ecd2180bbc308784d168b350450e70bbdd846" standard verify_py31 install_package "setuptools-17.1.1" "https://pypi.python.org/packages/source/s/setuptools/setuptools-17.1.1.tar.gz#5bf42dbf406fd58a41029f53cffff1c90db5de1c5e0e560b5545cf2ec949c431" python install_package "pip-1.5.6" "https://pypi.python.org/packages/source/p/pip/pip-1.5.6.tar.gz#b1a4ae66baf21b7eb05a5e4f37c50c2706fa28ea1f8780ce8efe14dcd9f1726c" python pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.1.5000066400000000000000000000016371517431316200245120ustar00rootroot00000000000000install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline install_package "Python-3.1.5" "https://www.python.org/ftp/python/3.1.5/Python-3.1.5.tgz#d12dae6d06f52ef6bf1271db4d5b4d14b5dd39813e324314e72b648ef1bc0103" standard verify_py31 install_package "setuptools-17.1.1" "https://pypi.python.org/packages/source/s/setuptools/setuptools-17.1.1.tar.gz#5bf42dbf406fd58a41029f53cffff1c90db5de1c5e0e560b5545cf2ec949c431" python install_package "pip-1.5.6" "https://pypi.python.org/packages/source/p/pip/pip-1.5.6.tar.gz#b1a4ae66baf21b7eb05a5e4f37c50c2706fa28ea1f8780ce8efe14dcd9f1726c" python pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.10-dev000066400000000000000000000010701517431316200251720ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-1.1.1n" "https://www.openssl.org/source/openssl-1.1.1n.tar.gz#40dceb51a4f6a5275bde0e6bf20ef4b91bfc32ed57c0552e2e8e15463372b17a" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline install_git "Python-3.10-dev" "https://github.com/python/cpython" 3.10 standard verify_py310 copy_python_gdb ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.10.0000066400000000000000000000016141517431316200245600ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-1.1.1n" "https://www.openssl.org/source/openssl-1.1.1n.tar.gz#40dceb51a4f6a5275bde0e6bf20ef4b91bfc32ed57c0552e2e8e15463372b17a" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.10.0" "https://www.python.org/ftp/python/3.10.0/Python-3.10.0.tar.xz#5a99f8e7a6a11a7b98b4e75e0d1303d3832cada5534068f69c7b6222a7b1b002" standard verify_py310 copy_python_gdb ensurepip else install_package "Python-3.10.0" "https://www.python.org/ftp/python/3.10.0/Python-3.10.0.tgz#c4e0cbad57c90690cb813fb4663ef670b4d0f587d8171e2c42bd4c9245bd2758" standard verify_py310 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.10.1000066400000000000000000000016141517431316200245610ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-1.1.1n" "https://www.openssl.org/source/openssl-1.1.1n.tar.gz#40dceb51a4f6a5275bde0e6bf20ef4b91bfc32ed57c0552e2e8e15463372b17a" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.10.1" "https://www.python.org/ftp/python/3.10.1/Python-3.10.1.tar.xz#a7f1265b6e1a5de1ec5c3ec7019ab53413469934758311e9d240c46e5ae6e177" standard verify_py310 copy_python_gdb ensurepip else install_package "Python-3.10.1" "https://www.python.org/ftp/python/3.10.1/Python-3.10.1.tgz#b76117670e7c5064344b9c138e141a377e686b9063f3a8a620ff674fa8ec90d3" standard verify_py310 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.10.10000066400000000000000000000016221517431316200246400ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-1.1.1o" "https://www.openssl.org/source/openssl-1.1.1o.tar.gz#9384a2b0570dd80358841464677115df785edb941c71211f75076d72fe6b438f" mac_openssl --if has_broken_mac_openssl install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.10.10" "https://www.python.org/ftp/python/3.10.10/Python-3.10.10.tar.xz#0419e9085bf51b7a672009b3f50dbf1859acdf18ba725d0ec19aa5c8503f0ea3" standard verify_py310 copy_python_gdb ensurepip else install_package "Python-3.10.10" "https://www.python.org/ftp/python/3.10.10/Python-3.10.10.tgz#fba64559dde21ebdc953e4565e731573bb61159de8e4d4cedee70fb1196f610d" standard verify_py310 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.10.11000066400000000000000000000016221517431316200246410ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-1.1.1o" "https://www.openssl.org/source/openssl-1.1.1o.tar.gz#9384a2b0570dd80358841464677115df785edb941c71211f75076d72fe6b438f" mac_openssl --if has_broken_mac_openssl install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.10.11" "https://www.python.org/ftp/python/3.10.11/Python-3.10.11.tar.xz#3c3bc3048303721c904a03eb8326b631e921f11cc3be2988456a42f115daf04c" standard verify_py310 copy_python_gdb ensurepip else install_package "Python-3.10.11" "https://www.python.org/ftp/python/3.10.11/Python-3.10.11.tgz#f3db31b668efa983508bd67b5712898aa4247899a346f2eb745734699ccd3859" standard verify_py310 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.10.12000066400000000000000000000016221517431316200246420ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-1.1.1o" "https://www.openssl.org/source/openssl-1.1.1o.tar.gz#9384a2b0570dd80358841464677115df785edb941c71211f75076d72fe6b438f" mac_openssl --if has_broken_mac_openssl install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.10.12" "https://www.python.org/ftp/python/3.10.12/Python-3.10.12.tar.xz#afb74bf19130e7a47d10312c8f5e784f24e0527981eab68e20546cfb865830b8" standard verify_py310 copy_python_gdb ensurepip else install_package "Python-3.10.12" "https://www.python.org/ftp/python/3.10.12/Python-3.10.12.tgz#a43cd383f3999a6f4a7db2062b2fc9594fefa73e175b3aedafa295a51a7bb65c" standard verify_py310 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.10.13000066400000000000000000000016221517431316200246430ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-1.1.1o" "https://www.openssl.org/source/openssl-1.1.1o.tar.gz#9384a2b0570dd80358841464677115df785edb941c71211f75076d72fe6b438f" mac_openssl --if has_broken_mac_openssl install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.10.13" "https://www.python.org/ftp/python/3.10.13/Python-3.10.13.tar.xz#5c88848668640d3e152b35b4536ef1c23b2ca4bd2c957ef1ecbb053f571dd3f6" standard verify_py310 copy_python_gdb ensurepip else install_package "Python-3.10.13" "https://www.python.org/ftp/python/3.10.13/Python-3.10.13.tgz#698ec55234c1363bd813b460ed53b0f108877c7a133d48bde9a50a1eb57b7e65" standard verify_py310 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.10.14000066400000000000000000000016221517431316200246440ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-1.1.1o" "https://www.openssl.org/source/openssl-1.1.1o.tar.gz#9384a2b0570dd80358841464677115df785edb941c71211f75076d72fe6b438f" mac_openssl --if has_broken_mac_openssl install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.10.14" "https://www.python.org/ftp/python/3.10.14/Python-3.10.14.tar.xz#9c50481faa8c2832329ba0fc8868d0a606a680fc4f60ec48d26ce8e076751fda" standard verify_py310 copy_python_gdb ensurepip else install_package "Python-3.10.14" "https://www.python.org/ftp/python/3.10.14/Python-3.10.14.tgz#cefea32d3be89c02436711c95a45c7f8e880105514b78680c14fe76f5709a0f6" standard verify_py310 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.10.15000066400000000000000000000016221517431316200246450ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-1.1.1o" "https://www.openssl.org/source/openssl-1.1.1o.tar.gz#9384a2b0570dd80358841464677115df785edb941c71211f75076d72fe6b438f" mac_openssl --if has_broken_mac_openssl install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.10.15" "https://www.python.org/ftp/python/3.10.15/Python-3.10.15.tar.xz#aab0950817735172601879872d937c1e4928a57c409ae02369ec3d91dccebe79" standard verify_py310 copy_python_gdb ensurepip else install_package "Python-3.10.15" "https://www.python.org/ftp/python/3.10.15/Python-3.10.15.tgz#a27864e5ba2a4474f8f6c58ab92ff52767ac8b66f1646923355a53fe3ef15074" standard verify_py310 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.10.16000066400000000000000000000016221517431316200246460ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-1.1.1o" "https://www.openssl.org/source/openssl-1.1.1o.tar.gz#9384a2b0570dd80358841464677115df785edb941c71211f75076d72fe6b438f" mac_openssl --if has_broken_mac_openssl install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.10.16" "https://www.python.org/ftp/python/3.10.16/Python-3.10.16.tar.xz#bfb249609990220491a1b92850a07135ed0831e41738cf681d63cf01b2a8fbd1" standard verify_py310 copy_python_gdb ensurepip else install_package "Python-3.10.16" "https://www.python.org/ftp/python/3.10.16/Python-3.10.16.tgz#f2e22ed965a93cfeb642378ed6e6cdbc127682664b24123679f3d013fafe9cd0" standard verify_py310 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.10.17000066400000000000000000000016641517431316200246550ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-3.2.4" "https://github.com/openssl/openssl/releases/download/openssl-3.2.4/openssl-3.2.4.tar.gz#b23ad7fd9f73e43ad1767e636040e88ba7c9e5775bfa5618436a0dd2c17c3716" mac_openssl --if has_broken_mac_openssl install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.10.17" "https://www.python.org/ftp/python/3.10.17/Python-3.10.17.tar.xz#4c68050f049d1b4ac5aadd0df5f27941c0350d2a9e7ab0907ee5eb5225d9d6b0" standard verify_py310 copy_python_gdb ensurepip else install_package "Python-3.10.17" "https://www.python.org/ftp/python/3.10.17/Python-3.10.17.tgz#8fcda0fbdc131859a4a4223abb925fd522a77e3fb3b52c46cea5f3bc2ae0cd9f" standard verify_py310 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.10.18000066400000000000000000000016641517431316200246560ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-3.2.4" "https://github.com/openssl/openssl/releases/download/openssl-3.2.4/openssl-3.2.4.tar.gz#b23ad7fd9f73e43ad1767e636040e88ba7c9e5775bfa5618436a0dd2c17c3716" mac_openssl --if has_broken_mac_openssl install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.10.18" "https://www.python.org/ftp/python/3.10.18/Python-3.10.18.tar.xz#ae665bc678abd9ab6a6e1573d2481625a53719bc517e9a634ed2b9fefae3817f" standard verify_py310 copy_python_gdb ensurepip else install_package "Python-3.10.18" "https://www.python.org/ftp/python/3.10.18/Python-3.10.18.tgz#1b19ab802518eb36a851f5ddef571862c7a31ece533109a99df6d5af0a1ceb99" standard verify_py310 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.10.19000066400000000000000000000016641517431316200246570ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-3.2.4" "https://github.com/openssl/openssl/releases/download/openssl-3.2.4/openssl-3.2.4.tar.gz#b23ad7fd9f73e43ad1767e636040e88ba7c9e5775bfa5618436a0dd2c17c3716" mac_openssl --if has_broken_mac_openssl install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.10.19" "https://www.python.org/ftp/python/3.10.19/Python-3.10.19.tar.xz#c8f4a596572201d81dd7df91f70e177e19a70f1d489968b54b5fbbf29a97c076" standard verify_py310 copy_python_gdb ensurepip else install_package "Python-3.10.19" "https://www.python.org/ftp/python/3.10.19/Python-3.10.19.tgz#a078fb2d7a216071ebbe2e34b5f5355dd6b6e9b0cd1bacc4a41c63990c5a0eec" standard verify_py310 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.10.2000066400000000000000000000016141517431316200245620ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-1.1.1n" "https://www.openssl.org/source/openssl-1.1.1n.tar.gz#40dceb51a4f6a5275bde0e6bf20ef4b91bfc32ed57c0552e2e8e15463372b17a" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.10.2" "https://www.python.org/ftp/python/3.10.2/Python-3.10.2.tar.xz#17de3ac7da9f2519aa9d64378c603a73a0e9ad58dffa8812e45160c086de64c7" standard verify_py310 copy_python_gdb ensurepip else install_package "Python-3.10.2" "https://www.python.org/ftp/python/3.10.2/Python-3.10.2.tgz#3c0ede893011319f9b0a56b44953a3d52c7abf9657c23fb4bc9ced93b86e9c97" standard verify_py310 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.10.20000066400000000000000000000016641517431316200246470ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-3.6.1" "https://github.com/openssl/openssl/releases/download/openssl-3.6.1/openssl-3.6.1.tar.gz#b1bfedcd5b289ff22aee87c9d600f515767ebf45f77168cb6d64f231f518a82e" mac_openssl --if has_broken_mac_openssl install_package "readline-8.3" "https://ftpmirror.gnu.org/readline/readline-8.3.tar.gz#fe5383204467828cd495ee8d1d3c037a7eba1389c22bc6a041f627976f9061cc" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.10.20" "https://www.python.org/ftp/python/3.10.20/Python-3.10.20.tar.xz#de6517421601e39a9a3bc3e1bc4c7b2f239297423ee05e282598c83ec0647505" standard verify_py310 copy_python_gdb ensurepip else install_package "Python-3.10.20" "https://www.python.org/ftp/python/3.10.20/Python-3.10.20.tgz#4ff5fd4c5bab803b935019f3e31d7219cebd6f870d00389cea53b88bbe935d1a" standard verify_py310 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.10.3000066400000000000000000000016141517431316200245630ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-1.1.1n" "https://www.openssl.org/source/openssl-1.1.1n.tar.gz#40dceb51a4f6a5275bde0e6bf20ef4b91bfc32ed57c0552e2e8e15463372b17a" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.10.3" "https://www.python.org/ftp/python/3.10.3/Python-3.10.3.tar.xz#596c72de998dc39205bc4f70ef0dbf7edec740a306d09b49a9bd0a77806730dc" standard verify_py310 copy_python_gdb ensurepip else install_package "Python-3.10.3" "https://www.python.org/ftp/python/3.10.3/Python-3.10.3.tgz#5a3b029bad70ba2a019ebff08a65060a8b9b542ffc1a83c697f1449ecca9813b" standard verify_py310 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.10.4000066400000000000000000000016141517431316200245640ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-1.1.1n" "https://www.openssl.org/source/openssl-1.1.1n.tar.gz#40dceb51a4f6a5275bde0e6bf20ef4b91bfc32ed57c0552e2e8e15463372b17a" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.10.4" "https://www.python.org/ftp/python/3.10.4/Python-3.10.4.tar.xz#80bf925f571da436b35210886cf79f6eb5fa5d6c571316b73568343451f77a19" standard verify_py310 copy_python_gdb ensurepip else install_package "Python-3.10.4" "https://www.python.org/ftp/python/3.10.4/Python-3.10.4.tgz#f3bcc65b1d5f1dc78675c746c98fcee823c038168fc629c5935b044d0911ad28" standard verify_py310 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.10.5000066400000000000000000000016141517431316200245650ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-1.1.1o" "https://www.openssl.org/source/openssl-1.1.1o.tar.gz#9384a2b0570dd80358841464677115df785edb941c71211f75076d72fe6b438f" mac_openssl --if has_broken_mac_openssl install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.10.5" "https://www.python.org/ftp/python/3.10.5/Python-3.10.5.tar.xz#8437efd5b106ef0a75aabfbf23d880625120a73a86a22ade4d2e2e68d7b74486" standard verify_py310 copy_python_gdb ensurepip else install_package "Python-3.10.5" "https://www.python.org/ftp/python/3.10.5/Python-3.10.5.tgz#18f57182a2de3b0be76dfc39fdcfd28156bb6dd23e5f08696f7492e9e3d0bf2d" standard verify_py310 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.10.6000066400000000000000000000016141517431316200245660ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-1.1.1o" "https://www.openssl.org/source/openssl-1.1.1o.tar.gz#9384a2b0570dd80358841464677115df785edb941c71211f75076d72fe6b438f" mac_openssl --if has_broken_mac_openssl install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.10.6" "https://www.python.org/ftp/python/3.10.6/Python-3.10.6.tar.xz#f795ff87d11d4b0c7c33bc8851b0c28648d8a4583aa2100a98c22b4326b6d3f3" standard verify_py310 copy_python_gdb ensurepip else install_package "Python-3.10.6" "https://www.python.org/ftp/python/3.10.6/Python-3.10.6.tgz#848cb06a5caa85da5c45bd7a9221bb821e33fc2bdcba088c127c58fad44e6343" standard verify_py310 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.10.7000066400000000000000000000016141517431316200245670ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-1.1.1o" "https://www.openssl.org/source/openssl-1.1.1o.tar.gz#9384a2b0570dd80358841464677115df785edb941c71211f75076d72fe6b438f" mac_openssl --if has_broken_mac_openssl install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.10.7" "https://www.python.org/ftp/python/3.10.7/Python-3.10.7.tar.xz#6eed8415b7516fb2f260906db5d48dd4c06acc0cb24a7d6cc15296a604dcdc48" standard verify_py310 copy_python_gdb ensurepip else install_package "Python-3.10.7" "https://www.python.org/ftp/python/3.10.7/Python-3.10.7.tgz#1b2e4e2df697c52d36731666979e648beeda5941d0f95740aafbf4163e5cc126" standard verify_py310 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.10.8000066400000000000000000000016141517431316200245700ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-1.1.1o" "https://www.openssl.org/source/openssl-1.1.1o.tar.gz#9384a2b0570dd80358841464677115df785edb941c71211f75076d72fe6b438f" mac_openssl --if has_broken_mac_openssl install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.10.8" "https://www.python.org/ftp/python/3.10.8/Python-3.10.8.tar.xz#6a30ecde59c47048013eb5a658c9b5dec277203d2793667f578df7671f7f03f3" standard verify_py310 copy_python_gdb ensurepip else install_package "Python-3.10.8" "https://www.python.org/ftp/python/3.10.8/Python-3.10.8.tgz#f400c3fb394b8bef1292f6dc1292c5fadc3533039a5bc0c3e885f3e16738029a" standard verify_py310 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.10.9000066400000000000000000000016141517431316200245710ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-1.1.1o" "https://www.openssl.org/source/openssl-1.1.1o.tar.gz#9384a2b0570dd80358841464677115df785edb941c71211f75076d72fe6b438f" mac_openssl --if has_broken_mac_openssl install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.10.9" "https://www.python.org/ftp/python/3.10.9/Python-3.10.9.tar.xz#5ae03e308260164baba39921fdb4dbf8e6d03d8235a939d4582b33f0b5e46a83" standard verify_py310 copy_python_gdb ensurepip else install_package "Python-3.10.9" "https://www.python.org/ftp/python/3.10.9/Python-3.10.9.tgz#4ccd7e46c8898f4c7862910a1703aa0e63525913a519abb2f55e26220a914d88" standard verify_py310 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.11-dev000066400000000000000000000011421517431316200251730ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 install_package "openssl-1.1.1k" "https://www.openssl.org/source/openssl-1.1.1k.tar.gz#892a0875b9872acd04a9fde79b1f943075d5ea162415de3047c327df33fbaee5" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline install_git "Python-3.11-dev" "https://github.com/python/cpython" 3.11 standard verify_py311 copy_python_gdb ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.11.0000066400000000000000000000016661517431316200245700ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 install_package "openssl-1.1.1q" "https://www.openssl.org/source/openssl-1.1.1q.tar.gz#d7939ce614029cdff0b6c20f0e2e5703158a489a72b2507b8bd51bf8c8fd10ca" mac_openssl --if has_broken_mac_openssl install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.11.0" "https://www.python.org/ftp/python/3.11.0/Python-3.11.0.tar.xz#a57dc82d77358617ba65b9841cee1e3b441f386c3789ddc0676eca077f2951c3" standard verify_py311 copy_python_gdb ensurepip else install_package "Python-3.11.0" "https://www.python.org/ftp/python/3.11.0/Python-3.11.0.tgz#64424e96e2457abbac899b90f9530985b51eef2905951febd935f0e73414caeb" standard verify_py311 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.11.1000066400000000000000000000016661517431316200245710ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 install_package "openssl-1.1.1s" "https://www.openssl.org/source/openssl-1.1.1s.tar.gz#c5ac01e760ee6ff0dab61d6b2bbd30146724d063eb322180c6f18a6f74e4b6aa" mac_openssl --if has_broken_mac_openssl install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.11.1" "https://www.python.org/ftp/python/3.11.1/Python-3.11.1.tar.xz#85879192f2cffd56cb16c092905949ebf3e5e394b7f764723529637901dfb58f" standard verify_py311 copy_python_gdb ensurepip else install_package "Python-3.11.1" "https://www.python.org/ftp/python/3.11.1/Python-3.11.1.tgz#baed518e26b337d4d8105679caf68c5c32630d702614fc174e98cb95c46bdfa4" standard verify_py311 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.11.10000066400000000000000000000016761517431316200246520ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 install_package "openssl-3.2.2" "https://openssl.org/source/old/3.2/openssl-3.2.2.tar.gz#197149c18d9e9f292c43f0400acaba12e5f52cacfe050f3d199277ea738ec2e7" mac_openssl --if has_broken_mac_openssl install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.11.10" "https://www.python.org/ftp/python/3.11.10/Python-3.11.10.tar.xz#07a4356e912900e61a15cb0949a06c4a05012e213ecd6b4e84d0f67aabbee372" standard verify_py311 copy_python_gdb ensurepip else install_package "Python-3.11.10" "https://www.python.org/ftp/python/3.11.10/Python-3.11.10.tgz#92f2faf242681bfa406d53a51e17d42c5373affe23a130cd9697e132ef574706" standard verify_py311 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.11.11000066400000000000000000000016761517431316200246530ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 install_package "openssl-3.2.2" "https://openssl.org/source/old/3.2/openssl-3.2.2.tar.gz#197149c18d9e9f292c43f0400acaba12e5f52cacfe050f3d199277ea738ec2e7" mac_openssl --if has_broken_mac_openssl install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.11.11" "https://www.python.org/ftp/python/3.11.11/Python-3.11.11.tar.xz#2a9920c7a0cd236de33644ed980a13cbbc21058bfdc528febb6081575ed73be3" standard verify_py311 copy_python_gdb ensurepip else install_package "Python-3.11.11" "https://www.python.org/ftp/python/3.11.11/Python-3.11.11.tgz#883bddee3c92fcb91cf9c09c5343196953cbb9ced826213545849693970868ed" standard verify_py311 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.11.12000066400000000000000000000017361517431316200246510ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 install_package "openssl-3.2.4" "https://github.com/openssl/openssl/releases/download/openssl-3.2.4/openssl-3.2.4.tar.gz#b23ad7fd9f73e43ad1767e636040e88ba7c9e5775bfa5618436a0dd2c17c3716" mac_openssl --if has_broken_mac_openssl install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.11.12" "https://www.python.org/ftp/python/3.11.12/Python-3.11.12.tar.xz#849da87af4df137710c1796e276a955f7a85c9f971081067c8f565d15c352a09" standard verify_py311 copy_python_gdb ensurepip else install_package "Python-3.11.12" "https://www.python.org/ftp/python/3.11.12/Python-3.11.12.tgz#379c9929a989a9d65a1f5d854e011f4872b142259f4fc0a8c4062d2815ed7fba" standard verify_py311 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.11.13000066400000000000000000000017361517431316200246520ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 install_package "openssl-3.2.4" "https://github.com/openssl/openssl/releases/download/openssl-3.2.4/openssl-3.2.4.tar.gz#b23ad7fd9f73e43ad1767e636040e88ba7c9e5775bfa5618436a0dd2c17c3716" mac_openssl --if has_broken_mac_openssl install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.11.13" "https://www.python.org/ftp/python/3.11.13/Python-3.11.13.tar.xz#8fb5f9fbc7609fa822cb31549884575db7fd9657cbffb89510b5d7975963a83a" standard verify_py311 copy_python_gdb ensurepip else install_package "Python-3.11.13" "https://www.python.org/ftp/python/3.11.13/Python-3.11.13.tgz#0f1a22f4dfd34595a29cf69ee7ea73b9eff8b1cc89d7ab29b3ab0ec04179dad8" standard verify_py311 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.11.14000066400000000000000000000017361517431316200246530ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 install_package "openssl-3.2.4" "https://github.com/openssl/openssl/releases/download/openssl-3.2.4/openssl-3.2.4.tar.gz#b23ad7fd9f73e43ad1767e636040e88ba7c9e5775bfa5618436a0dd2c17c3716" mac_openssl --if has_broken_mac_openssl install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.11.14" "https://www.python.org/ftp/python/3.11.14/Python-3.11.14.tar.xz#8d3ed8ec5c88c1c95f5e558612a725450d2452813ddad5e58fdb1a53b1209b78" standard verify_py311 copy_python_gdb ensurepip else install_package "Python-3.11.14" "https://www.python.org/ftp/python/3.11.14/Python-3.11.14.tgz#563d2a1b2a5ba5d5409b5ecd05a0e1bf9b028cf3e6a6f0c87a5dc8dc3f2d9182" standard verify_py311 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.11.15000066400000000000000000000017361517431316200246540ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 install_package "openssl-3.6.1" "https://github.com/openssl/openssl/releases/download/openssl-3.6.1/openssl-3.6.1.tar.gz#b1bfedcd5b289ff22aee87c9d600f515767ebf45f77168cb6d64f231f518a82e" mac_openssl --if has_broken_mac_openssl install_package "readline-8.3" "https://ftpmirror.gnu.org/readline/readline-8.3.tar.gz#fe5383204467828cd495ee8d1d3c037a7eba1389c22bc6a041f627976f9061cc" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.11.15" "https://www.python.org/ftp/python/3.11.15/Python-3.11.15.tar.xz#272179ddd9a2e41a0fc8e42e33dfbdca0b3711aa5abf372d3f2d51543d09b625" standard verify_py311 copy_python_gdb ensurepip else install_package "Python-3.11.15" "https://www.python.org/ftp/python/3.11.15/Python-3.11.15.tgz#f4de1b10bd6c70cbb9fa1cd71fc5038b832747a74ee59d599c69ce4846defb50" standard verify_py311 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.11.2000066400000000000000000000016661517431316200245720ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 install_package "openssl-1.1.1s" "https://www.openssl.org/source/openssl-1.1.1s.tar.gz#c5ac01e760ee6ff0dab61d6b2bbd30146724d063eb322180c6f18a6f74e4b6aa" mac_openssl --if has_broken_mac_openssl install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.11.2" "https://www.python.org/ftp/python/3.11.2/Python-3.11.2.tar.xz#29e4b8f5f1658542a8c13e2dd277358c9c48f2b2f7318652ef1675e402b9d2af" standard verify_py311 copy_python_gdb ensurepip else install_package "Python-3.11.2" "https://www.python.org/ftp/python/3.11.2/Python-3.11.2.tgz#2411c74bda5bbcfcddaf4531f66d1adc73f247f529aee981b029513aefdbf849" standard verify_py311 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.11.3000066400000000000000000000016661517431316200245730ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 install_package "openssl-1.1.1s" "https://www.openssl.org/source/openssl-1.1.1s.tar.gz#c5ac01e760ee6ff0dab61d6b2bbd30146724d063eb322180c6f18a6f74e4b6aa" mac_openssl --if has_broken_mac_openssl install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.11.3" "https://www.python.org/ftp/python/3.11.3/Python-3.11.3.tar.xz#8a5db99c961a7ecf27c75956189c9602c968751f11dbeae2b900dbff1c085b5e" standard verify_py311 copy_python_gdb ensurepip else install_package "Python-3.11.3" "https://www.python.org/ftp/python/3.11.3/Python-3.11.3.tgz#1a79f3df32265d9e6625f1a0b31c28eb1594df911403d11f3320ee1da1b3e048" standard verify_py311 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.11.4000066400000000000000000000016661517431316200245740ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 install_package "openssl-1.1.1s" "https://www.openssl.org/source/openssl-1.1.1s.tar.gz#c5ac01e760ee6ff0dab61d6b2bbd30146724d063eb322180c6f18a6f74e4b6aa" mac_openssl --if has_broken_mac_openssl install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.11.4" "https://www.python.org/ftp/python/3.11.4/Python-3.11.4.tar.xz#2f0e409df2ab57aa9fc4cbddfb976af44e4e55bf6f619eee6bc5c2297264a7f6" standard verify_py311 copy_python_gdb ensurepip else install_package "Python-3.11.4" "https://www.python.org/ftp/python/3.11.4/Python-3.11.4.tgz#85c37a265e5c9dd9f75b35f954e31fbfc10383162417285e30ad25cc073a0d63" standard verify_py311 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.11.5000066400000000000000000000016641517431316200245730ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 install_package "openssl-3.2.0" "https://www.openssl.org/source/openssl-3.2.0.tar.gz#14c826f07c7e433706fb5c69fa9e25dab95684844b4c962a2cf1bf183eb4690e" mac_openssl --if has_broken_mac_openssl install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.11.5" "https://www.python.org/ftp/python/3.11.5/Python-3.11.5.tar.xz#85cd12e9cf1d6d5a45f17f7afe1cebe7ee628d3282281c492e86adf636defa3f" standard verify_py311 copy_python_gdb ensurepip else install_package "Python-3.11.5" "https://www.python.org/ftp/python/3.11.5/Python-3.11.5.tgz#a12a0a013a30b846c786c010f2c19dd36b7298d888f7c4bd1581d90ce18b5e58" standard verify_py311 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.11.6000066400000000000000000000016641517431316200245740ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 install_package "openssl-3.2.0" "https://www.openssl.org/source/openssl-3.2.0.tar.gz#14c826f07c7e433706fb5c69fa9e25dab95684844b4c962a2cf1bf183eb4690e" mac_openssl --if has_broken_mac_openssl install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.11.6" "https://www.python.org/ftp/python/3.11.6/Python-3.11.6.tar.xz#0fab78fa7f133f4f38210c6260d90d7c0d5c7198446419ce057ec7ac2e6f5f38" standard verify_py311 copy_python_gdb ensurepip else install_package "Python-3.11.6" "https://www.python.org/ftp/python/3.11.6/Python-3.11.6.tgz#c049bf317e877cbf9fce8c3af902436774ecef5249a29d10984ca3a37f7f4736" standard verify_py311 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.11.7000066400000000000000000000016641517431316200245750ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 install_package "openssl-3.2.0" "https://www.openssl.org/source/openssl-3.2.0.tar.gz#14c826f07c7e433706fb5c69fa9e25dab95684844b4c962a2cf1bf183eb4690e" mac_openssl --if has_broken_mac_openssl install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.11.7" "https://www.python.org/ftp/python/3.11.7/Python-3.11.7.tar.xz#18e1aa7e66ff3a58423d59ed22815a6954e53342122c45df20c96877c062b9b7" standard verify_py311 copy_python_gdb ensurepip else install_package "Python-3.11.7" "https://www.python.org/ftp/python/3.11.7/Python-3.11.7.tgz#068c05f82262e57641bd93458dfa883128858f5f4997aad7a36fd25b13b29209" standard verify_py311 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.11.8000066400000000000000000000016641517431316200245760ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 install_package "openssl-3.2.1" "https://www.openssl.org/source/openssl-3.2.1.tar.gz#83c7329fe52c850677d75e5d0b0ca245309b97e8ecbcfdc1dfdc4ab9fac35b39" mac_openssl --if has_broken_mac_openssl install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.11.8" "https://www.python.org/ftp/python/3.11.8/Python-3.11.8.tar.xz#9e06008c8901924395bc1da303eac567a729ae012baa182ab39269f650383bb3" standard verify_py311 copy_python_gdb ensurepip else install_package "Python-3.11.8" "https://www.python.org/ftp/python/3.11.8/Python-3.11.8.tgz#d3019a613b9e8761d260d9ebe3bd4df63976de30464e5c0189566e1ae3f61889" standard verify_py311 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.11.9000066400000000000000000000016641517431316200245770ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 install_package "openssl-3.2.1" "https://www.openssl.org/source/openssl-3.2.1.tar.gz#83c7329fe52c850677d75e5d0b0ca245309b97e8ecbcfdc1dfdc4ab9fac35b39" mac_openssl --if has_broken_mac_openssl install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.11.9" "https://www.python.org/ftp/python/3.11.9/Python-3.11.9.tar.xz#9b1e896523fc510691126c864406d9360a3d1e986acbda59cda57b5abda45b87" standard verify_py311 copy_python_gdb ensurepip else install_package "Python-3.11.9" "https://www.python.org/ftp/python/3.11.9/Python-3.11.9.tgz#e7de3240a8bc2b1e1ba5c81bf943f06861ff494b69fda990ce2722a504c6153d" standard verify_py311 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.12-dev000066400000000000000000000012161517431316200251760ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 export PYTHON_BUILD_CONFIGURE_WITH_DSYMUTIL=1 install_package "openssl-3.1.2" "https://www.openssl.org/source/openssl-3.1.2.tar.gz#a0ce69b8b97ea6a35b96875235aa453b966ba3cba8af2de23657d8b6767d6539" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline install_git "Python-3.12-dev" "https://github.com/python/cpython" 3.12 standard verify_py312 copy_python_gdb ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.12.0000066400000000000000000000016641517431316200245670ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 install_package "openssl-3.1.2" "https://www.openssl.org/source/openssl-3.1.2.tar.gz#a0ce69b8b97ea6a35b96875235aa453b966ba3cba8af2de23657d8b6767d6539" mac_openssl --if has_broken_mac_openssl install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.12.0" "https://www.python.org/ftp/python/3.12.0/Python-3.12.0.tar.xz#795c34f44df45a0e9b9710c8c71c15c671871524cd412ca14def212e8ccb155d" standard verify_py312 copy_python_gdb ensurepip else install_package "Python-3.12.0" "https://www.python.org/ftp/python/3.12.0/Python-3.12.0.tgz#51412956d24a1ef7c97f1cb5f70e185c13e3de1f50d131c0aac6338080687afb" standard verify_py312 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.12.1000066400000000000000000000016641517431316200245700ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 install_package "openssl-3.1.2" "https://www.openssl.org/source/openssl-3.1.2.tar.gz#a0ce69b8b97ea6a35b96875235aa453b966ba3cba8af2de23657d8b6767d6539" mac_openssl --if has_broken_mac_openssl install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.12.1" "https://www.python.org/ftp/python/3.12.1/Python-3.12.1.tar.xz#8dfb8f426fcd226657f9e2bd5f1e96e53264965176fa17d32658e873591aeb21" standard verify_py312 copy_python_gdb ensurepip else install_package "Python-3.12.1" "https://www.python.org/ftp/python/3.12.1/Python-3.12.1.tgz#d01ec6a33bc10009b09c17da95cc2759af5a580a7316b3a446eb4190e13f97b2" standard verify_py312 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.12.10000066400000000000000000000017361517431316200246500ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 install_package "openssl-3.3.3" "https://github.com/openssl/openssl/releases/download/openssl-3.3.3/openssl-3.3.3.tar.gz#712590fd20aaa60ec75d778fe5b810d6b829ca7fb1e530577917a131f9105539" mac_openssl --if has_broken_mac_openssl install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.12.10" "https://www.python.org/ftp/python/3.12.10/Python-3.12.10.tar.xz#07ab697474595e06f06647417d3c7fa97ded07afc1a7e4454c5639919b46eaea" standard verify_py312 copy_python_gdb ensurepip else install_package "Python-3.12.10" "https://www.python.org/ftp/python/3.12.10/Python-3.12.10.tgz#15d9c623abfd2165fe816ea1fb385d6ed8cf3c664661ab357f1782e3036a6dac" standard verify_py312 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.12.11000066400000000000000000000017361517431316200246510ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 install_package "openssl-3.5.1" "https://github.com/openssl/openssl/releases/download/openssl-3.5.1/openssl-3.5.1.tar.gz#529043b15cffa5f36077a4d0af83f3de399807181d607441d734196d889b641f" mac_openssl --if has_broken_mac_openssl install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.12.11" "https://www.python.org/ftp/python/3.12.11/Python-3.12.11.tar.xz#c30bb24b7f1e9a19b11b55a546434f74e739bb4c271a3e3a80ff4380d49f7adb" standard verify_py312 copy_python_gdb ensurepip else install_package "Python-3.12.11" "https://www.python.org/ftp/python/3.12.11/Python-3.12.11.tgz#7b8d59af8216044d2313de8120bfc2cc00a9bd2e542f15795e1d616c51faf3d6" standard verify_py312 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.12.12000066400000000000000000000017361517431316200246520ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 install_package "openssl-3.5.1" "https://github.com/openssl/openssl/releases/download/openssl-3.5.1/openssl-3.5.1.tar.gz#529043b15cffa5f36077a4d0af83f3de399807181d607441d734196d889b641f" mac_openssl --if has_broken_mac_openssl install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.12.12" "https://www.python.org/ftp/python/3.12.12/Python-3.12.12.tar.xz#fb85a13414b028c49ba18bbd523c2d055a30b56b18b92ce454ea2c51edc656c4" standard verify_py312 copy_python_gdb ensurepip else install_package "Python-3.12.12" "https://www.python.org/ftp/python/3.12.12/Python-3.12.12.tgz#487c908ddf4097a1b9ba859f25fe46d22ccaabfb335880faac305ac62bffb79b" standard verify_py312 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.12.13000066400000000000000000000017361517431316200246530ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 install_package "openssl-3.6.1" "https://github.com/openssl/openssl/releases/download/openssl-3.6.1/openssl-3.6.1.tar.gz#b1bfedcd5b289ff22aee87c9d600f515767ebf45f77168cb6d64f231f518a82e" mac_openssl --if has_broken_mac_openssl install_package "readline-8.3" "https://ftpmirror.gnu.org/readline/readline-8.3.tar.gz#fe5383204467828cd495ee8d1d3c037a7eba1389c22bc6a041f627976f9061cc" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.12.13" "https://www.python.org/ftp/python/3.12.13/Python-3.12.13.tar.xz#c08bc65a81971c1dd5783182826503369466c7e67374d1646519adf05207b684" standard verify_py312 copy_python_gdb ensurepip else install_package "Python-3.12.13" "https://www.python.org/ftp/python/3.12.13/Python-3.12.13.tgz#0816c4761c97ecdb3f50a3924de0a93fd78cb63ee8e6c04201ddfaedca500b0b" standard verify_py312 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.12.2000066400000000000000000000016641517431316200245710ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 install_package "openssl-3.2.1" "https://www.openssl.org/source/openssl-3.2.1.tar.gz#83c7329fe52c850677d75e5d0b0ca245309b97e8ecbcfdc1dfdc4ab9fac35b39" mac_openssl --if has_broken_mac_openssl install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.12.2" "https://www.python.org/ftp/python/3.12.2/Python-3.12.2.tar.xz#be28112dac813d2053545c14bf13a16401a21877f1a69eb6ea5d84c4a0f3d870" standard verify_py312 copy_python_gdb ensurepip else install_package "Python-3.12.2" "https://www.python.org/ftp/python/3.12.2/Python-3.12.2.tgz#a7c4f6a9dc423d8c328003254ab0c9338b83037bd787d680826a5bf84308116e" standard verify_py312 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.12.3000066400000000000000000000016641517431316200245720ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 install_package "openssl-3.2.1" "https://www.openssl.org/source/openssl-3.2.1.tar.gz#83c7329fe52c850677d75e5d0b0ca245309b97e8ecbcfdc1dfdc4ab9fac35b39" mac_openssl --if has_broken_mac_openssl install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.12.3" "https://www.python.org/ftp/python/3.12.3/Python-3.12.3.tar.xz#56bfef1fdfc1221ce6720e43a661e3eb41785dd914ce99698d8c7896af4bdaa1" standard verify_py312 copy_python_gdb ensurepip else install_package "Python-3.12.3" "https://www.python.org/ftp/python/3.12.3/Python-3.12.3.tgz#a6b9459f45a6ebbbc1af44f5762623fa355a0c87208ed417628b379d762dddb0" standard verify_py312 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.12.4000066400000000000000000000016641517431316200245730ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 install_package "openssl-3.2.2" "https://www.openssl.org/source/openssl-3.2.2.tar.gz#197149c18d9e9f292c43f0400acaba12e5f52cacfe050f3d199277ea738ec2e7" mac_openssl --if has_broken_mac_openssl install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.12.4" "https://www.python.org/ftp/python/3.12.4/Python-3.12.4.tar.xz#f6d419a6d8743ab26700801b4908d26d97e8b986e14f95de31b32de2b0e79554" standard verify_py312 copy_python_gdb ensurepip else install_package "Python-3.12.4" "https://www.python.org/ftp/python/3.12.4/Python-3.12.4.tgz#01b3c1c082196f3b33168d344a9c85fb07bfe0e7ecfe77fee4443420d1ce2ad9" standard verify_py312 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.12.5000066400000000000000000000016641517431316200245740ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 install_package "openssl-3.3.1" "https://www.openssl.org/source/openssl-3.3.1.tar.gz#777cd596284c883375a2a7a11bf5d2786fc5413255efab20c50d6ffe6d020b7e" mac_openssl --if has_broken_mac_openssl install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.12.5" "https://www.python.org/ftp/python/3.12.5/Python-3.12.5.tar.xz#fa8a2e12c5e620b09f53e65bcd87550d2e5a1e2e04bf8ba991dcc55113876397" standard verify_py312 copy_python_gdb ensurepip else install_package "Python-3.12.5" "https://www.python.org/ftp/python/3.12.5/Python-3.12.5.tgz#38dc4e2c261d49c661196066edbfb70fdb16be4a79cc8220c224dfeb5636d405" standard verify_py312 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.12.6000066400000000000000000000017301517431316200245670ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 install_package "openssl-3.3.2" "https://github.com/openssl/openssl/releases/download/openssl-3.3.2/openssl-3.3.2.tar.gz#2e8a40b01979afe8be0bbfb3de5dc1c6709fedb46d6c89c10da114ab5fc3d281" mac_openssl --if has_broken_mac_openssl install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.12.6" "https://www.python.org/ftp/python/3.12.6/Python-3.12.6.tar.xz#1999658298cf2fb837dffed8ff3c033ef0c98ef20cf73c5d5f66bed5ab89697c" standard verify_py312 copy_python_gdb ensurepip else install_package "Python-3.12.6" "https://www.python.org/ftp/python/3.12.6/Python-3.12.6.tgz#85a4c1be906d20e5c5a69f2466b00da769c221d6a684acfd3a514dbf5bf10a66" standard verify_py312 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.12.7000066400000000000000000000017301517431316200245700ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 install_package "openssl-3.3.2" "https://github.com/openssl/openssl/releases/download/openssl-3.3.2/openssl-3.3.2.tar.gz#2e8a40b01979afe8be0bbfb3de5dc1c6709fedb46d6c89c10da114ab5fc3d281" mac_openssl --if has_broken_mac_openssl install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.12.7" "https://www.python.org/ftp/python/3.12.7/Python-3.12.7.tar.xz#24887b92e2afd4a2ac602419ad4b596372f67ac9b077190f459aba390faf5550" standard verify_py312 copy_python_gdb ensurepip else install_package "Python-3.12.7" "https://www.python.org/ftp/python/3.12.7/Python-3.12.7.tgz#73ac8fe780227bf371add8373c3079f42a0dc62deff8d612cd15a618082ab623" standard verify_py312 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.12.8000066400000000000000000000017301517431316200245710ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 install_package "openssl-3.3.2" "https://github.com/openssl/openssl/releases/download/openssl-3.3.2/openssl-3.3.2.tar.gz#2e8a40b01979afe8be0bbfb3de5dc1c6709fedb46d6c89c10da114ab5fc3d281" mac_openssl --if has_broken_mac_openssl install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.12.8" "https://www.python.org/ftp/python/3.12.8/Python-3.12.8.tar.xz#c909157bb25ec114e5869124cc2a9c4a4d4c1e957ca4ff553f1edc692101154e" standard verify_py312 copy_python_gdb ensurepip else install_package "Python-3.12.8" "https://www.python.org/ftp/python/3.12.8/Python-3.12.8.tgz#5978435c479a376648cb02854df3b892ace9ed7d32b1fead652712bee9d03a45" standard verify_py312 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.12.9000066400000000000000000000017301517431316200245720ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 install_package "openssl-3.3.2" "https://github.com/openssl/openssl/releases/download/openssl-3.3.2/openssl-3.3.2.tar.gz#2e8a40b01979afe8be0bbfb3de5dc1c6709fedb46d6c89c10da114ab5fc3d281" mac_openssl --if has_broken_mac_openssl install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.12.9" "https://www.python.org/ftp/python/3.12.9/Python-3.12.9.tar.xz#7220835d9f90b37c006e9842a8dff4580aaca4318674f947302b8d28f3f81112" standard verify_py312 copy_python_gdb ensurepip else install_package "Python-3.12.9" "https://www.python.org/ftp/python/3.12.9/Python-3.12.9.tgz#45313e4c5f0e8acdec9580161d565cf5fea578e3eabf25df7cc6355bf4afa1ee" standard verify_py312 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.13-dev000066400000000000000000000012701517431316200251770ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 export PYTHON_BUILD_CONFIGURE_WITH_DSYMUTIL=1 install_package "openssl-3.5.1" "https://www.openssl.org/source/openssl-3.5.1.tar.gz#529043b15cffa5f36077a4d0af83f3de399807181d607441d734196d889b641f" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline install_git "Python-3.13-dev" "https://github.com/python/cpython" 3.13 standard verify_py313 copy_python_gdb ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.13.0000066400000000000000000000017301517431316200245620ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 install_package "openssl-3.3.2" "https://github.com/openssl/openssl/releases/download/openssl-3.3.2/openssl-3.3.2.tar.gz#2e8a40b01979afe8be0bbfb3de5dc1c6709fedb46d6c89c10da114ab5fc3d281" mac_openssl --if has_broken_mac_openssl install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.13.0" "https://www.python.org/ftp/python/3.13.0/Python-3.13.0.tar.xz#086de5882e3cb310d4dca48457522e2e48018ecd43da9cdf827f6a0759efb07d" standard verify_py313 copy_python_gdb ensurepip else install_package "Python-3.13.0" "https://www.python.org/ftp/python/3.13.0/Python-3.13.0.tgz#12445c7b3db3126c41190bfdc1c8239c39c719404e844babbd015a1bc3fafcd4" standard verify_py313 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.13.0t000066400000000000000000000001241517431316200247420ustar00rootroot00000000000000export PYTHON_BUILD_FREE_THREADING=1 source "$(dirname "${BASH_SOURCE[0]}")"/3.13.0 pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.13.1000066400000000000000000000017301517431316200245630ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 install_package "openssl-3.4.0" "https://github.com/openssl/openssl/releases/download/openssl-3.4.0/openssl-3.4.0.tar.gz#e15dda82fe2fe8139dc2ac21a36d4ca01d5313c75f99f46c4e8a27709b7294bf" mac_openssl --if has_broken_mac_openssl install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.13.1" "https://www.python.org/ftp/python/3.13.1/Python-3.13.1.tar.xz#9cf9427bee9e2242e3877dd0f6b641c1853ca461f39d6503ce260a59c80bf0d9" standard verify_py313 copy_python_gdb ensurepip else install_package "Python-3.13.1" "https://www.python.org/ftp/python/3.13.1/Python-3.13.1.tgz#1513925a9f255ef0793dbf2f78bb4533c9f184bdd0ad19763fd7f47a400a7c55" standard verify_py313 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.13.10000066400000000000000000000017351517431316200246500ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 install_package "openssl-3.6.0" "https://github.com/openssl/openssl/releases/download/openssl-3.6.0/openssl-3.6.0.tar.gz#b6a5f44b7eb69e3fa35dbf15524405b44837a481d43d81daddde3ff21fcbb8e9" mac_openssl --if has_broken_mac_openssl install_package "readline-8.3" "http://ftpmirror.gnu.org/readline/readline-8.3.tar.gz#fe5383204467828cd495ee8d1d3c037a7eba1389c22bc6a041f627976f9061cc" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.13.10" "https://www.python.org/ftp/python/3.13.10/Python-3.13.10.tar.xz#bc673c04375a1a3f0808c27ba8f0411ab811ad390a8740318ccb9c60fad8fd77" standard verify_py313 copy_python_gdb ensurepip else install_package "Python-3.13.10" "https://www.python.org/ftp/python/3.13.10/Python-3.13.10.tgz#de5930852e95ba8c17b56548e04648470356ac47f7506014664f8f510d7bd61b" standard verify_py313 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.13.10t000066400000000000000000000001021517431316200250170ustar00rootroot00000000000000export PYTHON_BUILD_FREE_THREADING=1 source "${BASH_SOURCE[0]%t}" pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.13.11000066400000000000000000000017351517431316200246510ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 install_package "openssl-3.6.0" "https://github.com/openssl/openssl/releases/download/openssl-3.6.0/openssl-3.6.0.tar.gz#b6a5f44b7eb69e3fa35dbf15524405b44837a481d43d81daddde3ff21fcbb8e9" mac_openssl --if has_broken_mac_openssl install_package "readline-8.3" "http://ftpmirror.gnu.org/readline/readline-8.3.tar.gz#fe5383204467828cd495ee8d1d3c037a7eba1389c22bc6a041f627976f9061cc" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.13.11" "https://www.python.org/ftp/python/3.13.11/Python-3.13.11.tar.xz#16ede7bb7cdbfa895d11b0642fa0e523f291e6487194d53cf6d3b338c3a17ea2" standard verify_py313 copy_python_gdb ensurepip else install_package "Python-3.13.11" "https://www.python.org/ftp/python/3.13.11/Python-3.13.11.tgz#03cfedbe06ce21bc44ce09245e091a77f2fee9ec9be5c52069048a181300b202" standard verify_py313 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.13.12000066400000000000000000000017361517431316200246530ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 install_package "openssl-3.6.1" "https://github.com/openssl/openssl/releases/download/openssl-3.6.1/openssl-3.6.1.tar.gz#b1bfedcd5b289ff22aee87c9d600f515767ebf45f77168cb6d64f231f518a82e" mac_openssl --if has_broken_mac_openssl install_package "readline-8.3" "https://ftpmirror.gnu.org/readline/readline-8.3.tar.gz#fe5383204467828cd495ee8d1d3c037a7eba1389c22bc6a041f627976f9061cc" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.13.12" "https://www.python.org/ftp/python/3.13.12/Python-3.13.12.tar.xz#2a84cd31dd8d8ea8aaff75de66fc1b4b0127dd5799aa50a64ae9a313885b4593" standard verify_py313 copy_python_gdb ensurepip else install_package "Python-3.13.12" "https://www.python.org/ftp/python/3.13.12/Python-3.13.12.tgz#12e7cb170ad2d1a69aee96a1cc7fc8de5b1e97a2bdac51683a3db016ec9a2996" standard verify_py313 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.13.12t000066400000000000000000000001021517431316200250210ustar00rootroot00000000000000export PYTHON_BUILD_FREE_THREADING=1 source "${BASH_SOURCE[0]%t}" pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.13.13000066400000000000000000000017361517431316200246540ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 install_package "openssl-3.6.2" "https://github.com/openssl/openssl/releases/download/openssl-3.6.2/openssl-3.6.2.tar.gz#aaf51a1fe064384f811daeaeb4ec4dce7340ec8bd893027eee676af31e83a04f" mac_openssl --if has_broken_mac_openssl install_package "readline-8.3" "https://ftpmirror.gnu.org/readline/readline-8.3.tar.gz#fe5383204467828cd495ee8d1d3c037a7eba1389c22bc6a041f627976f9061cc" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.13.13" "https://www.python.org/ftp/python/3.13.13/Python-3.13.13.tar.xz#2ab91ff401783ccca64f75d10c882e957bdfd60e2bf5a72f8421793729b78a71" standard verify_py313 copy_python_gdb ensurepip else install_package "Python-3.13.13" "https://www.python.org/ftp/python/3.13.13/Python-3.13.13.tgz#f9cde7b0e2ec8165d7326e2a0f59ea2686ce9d0c617dbbb3d66a7e54d31b74b9" standard verify_py313 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.13.13t000066400000000000000000000001021517431316200250220ustar00rootroot00000000000000export PYTHON_BUILD_FREE_THREADING=1 source "${BASH_SOURCE[0]%t}" pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.13.1t000066400000000000000000000001241517431316200247430ustar00rootroot00000000000000export PYTHON_BUILD_FREE_THREADING=1 source "$(dirname "${BASH_SOURCE[0]}")"/3.13.1 pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.13.2000066400000000000000000000017301517431316200245640ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 install_package "openssl-3.4.0" "https://github.com/openssl/openssl/releases/download/openssl-3.4.0/openssl-3.4.0.tar.gz#e15dda82fe2fe8139dc2ac21a36d4ca01d5313c75f99f46c4e8a27709b7294bf" mac_openssl --if has_broken_mac_openssl install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.13.2" "https://www.python.org/ftp/python/3.13.2/Python-3.13.2.tar.xz#d984bcc57cd67caab26f7def42e523b1c015bbc5dc07836cf4f0b63fa159eb56" standard verify_py313 copy_python_gdb ensurepip else install_package "Python-3.13.2" "https://www.python.org/ftp/python/3.13.2/Python-3.13.2.tgz#b8d79530e3b7c96a5cb2d40d431ddb512af4a563e863728d8713039aa50203f9" standard verify_py313 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.13.2t000066400000000000000000000001241517431316200247440ustar00rootroot00000000000000export PYTHON_BUILD_FREE_THREADING=1 source "$(dirname "${BASH_SOURCE[0]}")"/3.13.2 pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.13.3000066400000000000000000000017301517431316200245650ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 install_package "openssl-3.4.1" "https://github.com/openssl/openssl/releases/download/openssl-3.4.1/openssl-3.4.1.tar.gz#002a2d6b30b58bf4bea46c43bdd96365aaf8daa6c428782aa4feee06da197df3" mac_openssl --if has_broken_mac_openssl install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.13.3" "https://www.python.org/ftp/python/3.13.3/Python-3.13.3.tar.xz#40f868bcbdeb8149a3149580bb9bfd407b3321cd48f0be631af955ac92c0e041" standard verify_py313 copy_python_gdb ensurepip else install_package "Python-3.13.3" "https://www.python.org/ftp/python/3.13.3/Python-3.13.3.tgz#988d735a6d33568cbaff1384a65cb22a1fb18a9ecb73d43ef868000193ce23ed" standard verify_py313 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.13.3t000066400000000000000000000001241517431316200247450ustar00rootroot00000000000000export PYTHON_BUILD_FREE_THREADING=1 source "$(dirname "${BASH_SOURCE[0]}")"/3.13.3 pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.13.4000066400000000000000000000017301517431316200245660ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 install_package "openssl-3.4.1" "https://github.com/openssl/openssl/releases/download/openssl-3.4.1/openssl-3.4.1.tar.gz#002a2d6b30b58bf4bea46c43bdd96365aaf8daa6c428782aa4feee06da197df3" mac_openssl --if has_broken_mac_openssl install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.13.4" "https://www.python.org/ftp/python/3.13.4/Python-3.13.4.tar.xz#27b15a797562a2971dce3ffe31bb216042ce0b995b39d768cf15f784cc757365" standard verify_py313 copy_python_gdb ensurepip else install_package "Python-3.13.4" "https://www.python.org/ftp/python/3.13.4/Python-3.13.4.tgz#2666038f1521b7a8ec34bf2997b363778118d6f3979282c93723e872bcd464e0" standard verify_py313 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.13.4t000066400000000000000000000001241517431316200247460ustar00rootroot00000000000000export PYTHON_BUILD_FREE_THREADING=1 source "$(dirname "${BASH_SOURCE[0]}")"/3.13.4 pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.13.5000066400000000000000000000017301517431316200245670ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 install_package "openssl-3.5.1" "https://github.com/openssl/openssl/releases/download/openssl-3.5.1/openssl-3.5.1.tar.gz#529043b15cffa5f36077a4d0af83f3de399807181d607441d734196d889b641f" mac_openssl --if has_broken_mac_openssl install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.13.5" "https://www.python.org/ftp/python/3.13.5/Python-3.13.5.tar.xz#93e583f243454e6e9e4588ca2c2662206ad961659863277afcdb96801647d640" standard verify_py313 copy_python_gdb ensurepip else install_package "Python-3.13.5" "https://www.python.org/ftp/python/3.13.5/Python-3.13.5.tgz#e6190f52699b534ee203d9f417bdbca05a92f23e35c19c691a50ed2942835385" standard verify_py313 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.13.5t000066400000000000000000000001241517431316200247470ustar00rootroot00000000000000export PYTHON_BUILD_FREE_THREADING=1 source "$(dirname "${BASH_SOURCE[0]}")"/3.13.5 pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.13.6000066400000000000000000000017271517431316200245760ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 install_package "openssl-3.5.2" "https://github.com/openssl/openssl/releases/download/openssl-3.5.2/openssl-3.5.2.tar.gz#c53a47e5e441c930c3928cf7bf6fb00e5d129b630e0aa873b08258656e7345ec" mac_openssl --if has_broken_mac_openssl install_package "readline-8.3" "http://ftpmirror.gnu.org/readline/readline-8.3.tar.gz#fe5383204467828cd495ee8d1d3c037a7eba1389c22bc6a041f627976f9061cc" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.13.6" "https://www.python.org/ftp/python/3.13.6/Python-3.13.6.tar.xz#17ba5508819d8736a14fbfc47d36e184946a877851b2e9c4b6c43acb44a3b104" standard verify_py313 copy_python_gdb ensurepip else install_package "Python-3.13.6" "https://www.python.org/ftp/python/3.13.6/Python-3.13.6.tgz#6cf50672cc03928488817d45af24bc927a48f910fe7893d6f388130e59ba98d7" standard verify_py313 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.13.6t000066400000000000000000000001241517431316200247500ustar00rootroot00000000000000export PYTHON_BUILD_FREE_THREADING=1 source "$(dirname "${BASH_SOURCE[0]}")"/3.13.6 pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.13.7000066400000000000000000000017271517431316200245770ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 install_package "openssl-3.5.2" "https://github.com/openssl/openssl/releases/download/openssl-3.5.2/openssl-3.5.2.tar.gz#c53a47e5e441c930c3928cf7bf6fb00e5d129b630e0aa873b08258656e7345ec" mac_openssl --if has_broken_mac_openssl install_package "readline-8.3" "http://ftpmirror.gnu.org/readline/readline-8.3.tar.gz#fe5383204467828cd495ee8d1d3c037a7eba1389c22bc6a041f627976f9061cc" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.13.7" "https://www.python.org/ftp/python/3.13.7/Python-3.13.7.tar.xz#5462f9099dfd30e238def83c71d91897d8caa5ff6ebc7a50f14d4802cdaaa79a" standard verify_py313 copy_python_gdb ensurepip else install_package "Python-3.13.7" "https://www.python.org/ftp/python/3.13.7/Python-3.13.7.tgz#6c9d80839cfa20024f34d9a6dd31ae2a9cd97ff5e980e969209746037a5153b2" standard verify_py313 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.13.7t000066400000000000000000000001241517431316200247510ustar00rootroot00000000000000export PYTHON_BUILD_FREE_THREADING=1 source "$(dirname "${BASH_SOURCE[0]}")"/3.13.7 pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.13.8000066400000000000000000000017271517431316200246000ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 install_package "openssl-3.6.0" "https://github.com/openssl/openssl/releases/download/openssl-3.6.0/openssl-3.6.0.tar.gz#b6a5f44b7eb69e3fa35dbf15524405b44837a481d43d81daddde3ff21fcbb8e9" mac_openssl --if has_broken_mac_openssl install_package "readline-8.3" "http://ftpmirror.gnu.org/readline/readline-8.3.tar.gz#fe5383204467828cd495ee8d1d3c037a7eba1389c22bc6a041f627976f9061cc" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.13.8" "https://www.python.org/ftp/python/3.13.8/Python-3.13.8.tar.xz#b9910730526b298299b46b35595ced9055722df60c06ad6301f6a4e2c728a252" standard verify_py313 copy_python_gdb ensurepip else install_package "Python-3.13.8" "https://www.python.org/ftp/python/3.13.8/Python-3.13.8.tgz#06108fe96f4089b7d9e0096cb4ca9c81ddcd5135f779a7de94cf59abcaa4b53f" standard verify_py313 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.13.8t000066400000000000000000000001021517431316200247460ustar00rootroot00000000000000export PYTHON_BUILD_FREE_THREADING=1 source "${BASH_SOURCE[0]%t}" pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.13.9000066400000000000000000000017271517431316200246010ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 install_package "openssl-3.6.0" "https://github.com/openssl/openssl/releases/download/openssl-3.6.0/openssl-3.6.0.tar.gz#b6a5f44b7eb69e3fa35dbf15524405b44837a481d43d81daddde3ff21fcbb8e9" mac_openssl --if has_broken_mac_openssl install_package "readline-8.3" "http://ftpmirror.gnu.org/readline/readline-8.3.tar.gz#fe5383204467828cd495ee8d1d3c037a7eba1389c22bc6a041f627976f9061cc" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.13.9" "https://www.python.org/ftp/python/3.13.9/Python-3.13.9.tar.xz#ed5ef34cda36cfa2f3a340f07cac7e7814f91c7f3c411f6d3562323a866c5c66" standard verify_py313 copy_python_gdb ensurepip else install_package "Python-3.13.9" "https://www.python.org/ftp/python/3.13.9/Python-3.13.9.tgz#c4c066af19c98fb7835d473bebd7e23be84f6e9874d47db9e39a68ee5d0ce35c" standard verify_py313 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.13.9t000066400000000000000000000001021517431316200247470ustar00rootroot00000000000000export PYTHON_BUILD_FREE_THREADING=1 source "${BASH_SOURCE[0]%t}" pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.13t-dev000066400000000000000000000001261517431316200253620ustar00rootroot00000000000000export PYTHON_BUILD_FREE_THREADING=1 source "$(dirname "${BASH_SOURCE[0]}")"/3.13-dev pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.14-dev000066400000000000000000000012701517431316200252000ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 export PYTHON_BUILD_CONFIGURE_WITH_DSYMUTIL=1 install_package "openssl-3.5.1" "https://www.openssl.org/source/openssl-3.5.1.tar.gz#529043b15cffa5f36077a4d0af83f3de399807181d607441d734196d889b641f" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline install_git "Python-3.14-dev" "https://github.com/python/cpython" 3.14 standard verify_py314 copy_python_gdb ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.14.0000066400000000000000000000017271517431316200245710ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 install_package "openssl-3.6.0" "https://github.com/openssl/openssl/releases/download/openssl-3.6.0/openssl-3.6.0.tar.gz#b6a5f44b7eb69e3fa35dbf15524405b44837a481d43d81daddde3ff21fcbb8e9" mac_openssl --if has_broken_mac_openssl install_package "readline-8.3" "http://ftpmirror.gnu.org/readline/readline-8.3.tar.gz#fe5383204467828cd495ee8d1d3c037a7eba1389c22bc6a041f627976f9061cc" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.14.0" "https://www.python.org/ftp/python/3.14.0/Python-3.14.0.tar.xz#2299dae542d395ce3883aca00d3c910307cd68e0b2f7336098c8e7b7eee9f3e9" standard verify_py314 copy_python_gdb ensurepip else install_package "Python-3.14.0" "https://www.python.org/ftp/python/3.14.0/Python-3.14.0.tgz#88d2da4eed42fa9a5f42ff58a8bc8988881bd6c547e297e46682c2687638a851" standard verify_py314 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.14.0t000066400000000000000000000001021517431316200247370ustar00rootroot00000000000000export PYTHON_BUILD_FREE_THREADING=1 source "${BASH_SOURCE[0]%t}" pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.14.1000066400000000000000000000017271517431316200245720ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 install_package "openssl-3.6.0" "https://github.com/openssl/openssl/releases/download/openssl-3.6.0/openssl-3.6.0.tar.gz#b6a5f44b7eb69e3fa35dbf15524405b44837a481d43d81daddde3ff21fcbb8e9" mac_openssl --if has_broken_mac_openssl install_package "readline-8.3" "http://ftpmirror.gnu.org/readline/readline-8.3.tar.gz#fe5383204467828cd495ee8d1d3c037a7eba1389c22bc6a041f627976f9061cc" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.14.1" "https://www.python.org/ftp/python/3.14.1/Python-3.14.1.tar.xz#8dfa08b1959d9d15838a1c2dab77dc8d8ff4a553a1ed046dfacbc8095c6d42fc" standard verify_py314 copy_python_gdb ensurepip else install_package "Python-3.14.1" "https://www.python.org/ftp/python/3.14.1/Python-3.14.1.tgz#8343f001dede23812c7e9c6064f776bade2ef5813f46f0ae4b5a4c10c9069e9a" standard verify_py314 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.14.1t000066400000000000000000000001021517431316200247400ustar00rootroot00000000000000export PYTHON_BUILD_FREE_THREADING=1 source "${BASH_SOURCE[0]%t}" pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.14.2000066400000000000000000000017271517431316200245730ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 install_package "openssl-3.6.0" "https://github.com/openssl/openssl/releases/download/openssl-3.6.0/openssl-3.6.0.tar.gz#b6a5f44b7eb69e3fa35dbf15524405b44837a481d43d81daddde3ff21fcbb8e9" mac_openssl --if has_broken_mac_openssl install_package "readline-8.3" "http://ftpmirror.gnu.org/readline/readline-8.3.tar.gz#fe5383204467828cd495ee8d1d3c037a7eba1389c22bc6a041f627976f9061cc" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.14.2" "https://www.python.org/ftp/python/3.14.2/Python-3.14.2.tar.xz#ce543ab854bc256b61b71e9b27f831ffd1bfd60a479d639f8be7f9757cf573e9" standard verify_py314 copy_python_gdb ensurepip else install_package "Python-3.14.2" "https://www.python.org/ftp/python/3.14.2/Python-3.14.2.tgz#c609e078adab90e2c6bacb6afafacd5eaf60cd94cf670f1e159565725fcd448d" standard verify_py314 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.14.3000066400000000000000000000017301517431316200245660ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 install_package "openssl-3.6.1" "https://github.com/openssl/openssl/releases/download/openssl-3.6.1/openssl-3.6.1.tar.gz#b1bfedcd5b289ff22aee87c9d600f515767ebf45f77168cb6d64f231f518a82e" mac_openssl --if has_broken_mac_openssl install_package "readline-8.3" "https://ftpmirror.gnu.org/readline/readline-8.3.tar.gz#fe5383204467828cd495ee8d1d3c037a7eba1389c22bc6a041f627976f9061cc" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.14.3" "https://www.python.org/ftp/python/3.14.3/Python-3.14.3.tar.xz#a97d5549e9ad81fe17159ed02c68774ad5d266c72f8d9a0b5a9c371fe85d902b" standard verify_py314 copy_python_gdb ensurepip else install_package "Python-3.14.3" "https://www.python.org/ftp/python/3.14.3/Python-3.14.3.tgz#d7fe130d0501ae047ca318fa92aa642603ab6f217901015a1df6ce650d5470cd" standard verify_py314 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.14.3t000066400000000000000000000001021517431316200247420ustar00rootroot00000000000000export PYTHON_BUILD_FREE_THREADING=1 source "${BASH_SOURCE[0]%t}" pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.14.4000066400000000000000000000017301517431316200245670ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 install_package "openssl-3.6.2" "https://github.com/openssl/openssl/releases/download/openssl-3.6.2/openssl-3.6.2.tar.gz#aaf51a1fe064384f811daeaeb4ec4dce7340ec8bd893027eee676af31e83a04f" mac_openssl --if has_broken_mac_openssl install_package "readline-8.3" "https://ftpmirror.gnu.org/readline/readline-8.3.tar.gz#fe5383204467828cd495ee8d1d3c037a7eba1389c22bc6a041f627976f9061cc" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.14.4" "https://www.python.org/ftp/python/3.14.4/Python-3.14.4.tar.xz#d923c51303e38e249136fc1bdf3568d56ecb03214efdef48516176d3d7faaef8" standard verify_py314 copy_python_gdb ensurepip else install_package "Python-3.14.4" "https://www.python.org/ftp/python/3.14.4/Python-3.14.4.tgz#b4c059d5895f030e7df9663894ce3732bfa1b32cd3ab2883980266a45ce3cb3b" standard verify_py314 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.14.4t000066400000000000000000000001021517431316200247430ustar00rootroot00000000000000export PYTHON_BUILD_FREE_THREADING=1 source "${BASH_SOURCE[0]%t}" pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.14t-dev000066400000000000000000000001261517431316200253630ustar00rootroot00000000000000export PYTHON_BUILD_FREE_THREADING=1 source "$(dirname "${BASH_SOURCE[0]}")"/3.14-dev pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.15-dev000066400000000000000000000013341517431316200252020ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 export PYTHON_BUILD_CONFIGURE_WITH_DSYMUTIL=1 install_package "openssl-3.6.0" "https://github.com/openssl/openssl/releases/download/openssl-3.6.0/openssl-3.6.0.tar.gz#b6a5f44b7eb69e3fa35dbf15524405b44837a481d43d81daddde3ff21fcbb8e9" mac_openssl --if has_broken_mac_openssl install_package "readline-8.3" "https://ftpmirror.gnu.org/readline/readline-8.3.tar.gz#fe5383204467828cd495ee8d1d3c037a7eba1389c22bc6a041f627976f9061cc" mac_readline --if has_broken_mac_readline install_git "Python-3.15-dev" "https://github.com/python/cpython" main standard verify_py315 copy_python_gdb ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.15.0a8000066400000000000000000000017401517431316200250160ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 install_package "openssl-3.6.2" "https://github.com/openssl/openssl/releases/download/openssl-3.6.2/openssl-3.6.2.tar.gz#aaf51a1fe064384f811daeaeb4ec4dce7340ec8bd893027eee676af31e83a04f" mac_openssl --if has_broken_mac_openssl install_package "readline-8.3" "https://ftpmirror.gnu.org/readline/readline-8.3.tar.gz#fe5383204467828cd495ee8d1d3c037a7eba1389c22bc6a041f627976f9061cc" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.15.0a8" "https://www.python.org/ftp/python/3.15.0/Python-3.15.0a8.tar.xz#28f1b6358609042ebcc81488ec24569519f50804bb07dc23cc707b281b031c69" standard verify_py315 copy_python_gdb ensurepip else install_package "Python-3.15.0a8" "https://www.python.org/ftp/python/3.15.0/Python-3.15.0a8.tgz#1aadddd942e7c80e92fd2d83ab36887cec860c48fa9a2b47efe8c5acaa4a29f3" standard verify_py315 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.15.0a8t000066400000000000000000000001021517431316200251710ustar00rootroot00000000000000export PYTHON_BUILD_FREE_THREADING=1 source "${BASH_SOURCE[0]%t}" pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.15t-dev000066400000000000000000000001261517431316200253640ustar00rootroot00000000000000export PYTHON_BUILD_FREE_THREADING=1 source "$(dirname "${BASH_SOURCE[0]}")"/3.15-dev pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.2.0000066400000000000000000000016311517431316200245000ustar00rootroot00000000000000install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline install_package "Python-3.2" "https://www.python.org/ftp/python/3.2/Python-3.2.tgz#27b35bfcbbf01de9564c0265d72b58ba3ff3d56df0615765372f2aa09dc20da9" standard verify_py32 install_package "setuptools-17.1.1" "https://pypi.python.org/packages/source/s/setuptools/setuptools-17.1.1.tar.gz#5bf42dbf406fd58a41029f53cffff1c90db5de1c5e0e560b5545cf2ec949c431" python install_package "pip-7.1.2" "https://pypi.python.org/packages/source/p/pip/pip-7.1.2.tar.gz#ca047986f0528cfa975a14fb9f7f106271d4e0c3fe1ddced6c1db2e7ae57a477" python pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.2.1000066400000000000000000000016371517431316200245070ustar00rootroot00000000000000install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline install_package "Python-3.2.1" "https://www.python.org/ftp/python/3.2.1/Python-3.2.1.tgz#7cff29d984696d9fe8c7bea54da5b9ad36acef33ff5cf0d3e37e4d12fb21c572" standard verify_py32 install_package "setuptools-17.1.1" "https://pypi.python.org/packages/source/s/setuptools/setuptools-17.1.1.tar.gz#5bf42dbf406fd58a41029f53cffff1c90db5de1c5e0e560b5545cf2ec949c431" python install_package "pip-7.1.2" "https://pypi.python.org/packages/source/p/pip/pip-7.1.2.tar.gz#ca047986f0528cfa975a14fb9f7f106271d4e0c3fe1ddced6c1db2e7ae57a477" python pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.2.2000066400000000000000000000016371517431316200245100ustar00rootroot00000000000000install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline install_package "Python-3.2.2" "https://www.python.org/ftp/python/3.2.2/Python-3.2.2.tgz#acc6a13cb4fed0b7e86716324a8437e326645b8076177eede5a0cad99ec0313c" standard verify_py32 install_package "setuptools-17.1.1" "https://pypi.python.org/packages/source/s/setuptools/setuptools-17.1.1.tar.gz#5bf42dbf406fd58a41029f53cffff1c90db5de1c5e0e560b5545cf2ec949c431" python install_package "pip-7.1.2" "https://pypi.python.org/packages/source/p/pip/pip-7.1.2.tar.gz#ca047986f0528cfa975a14fb9f7f106271d4e0c3fe1ddced6c1db2e7ae57a477" python pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.2.3000066400000000000000000000016371517431316200245110ustar00rootroot00000000000000install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline install_package "Python-3.2.3" "https://www.python.org/ftp/python/3.2.3/Python-3.2.3.tgz#74c33e165edef7532cef95fd9a325a06878b5bfc8a5d038161573f283eaf9809" standard verify_py32 install_package "setuptools-17.1.1" "https://pypi.python.org/packages/source/s/setuptools/setuptools-17.1.1.tar.gz#5bf42dbf406fd58a41029f53cffff1c90db5de1c5e0e560b5545cf2ec949c431" python install_package "pip-7.1.2" "https://pypi.python.org/packages/source/p/pip/pip-7.1.2.tar.gz#ca047986f0528cfa975a14fb9f7f106271d4e0c3fe1ddced6c1db2e7ae57a477" python pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.2.4000066400000000000000000000016371517431316200245120ustar00rootroot00000000000000install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline install_package "Python-3.2.4" "https://www.python.org/ftp/python/3.2.4/Python-3.2.4.tgz#71c3139908ccc1c544ba1e331a3c22b3f1c09f562438a054fd6f4e2628de8b9a" standard verify_py32 install_package "setuptools-17.1.1" "https://pypi.python.org/packages/source/s/setuptools/setuptools-17.1.1.tar.gz#5bf42dbf406fd58a41029f53cffff1c90db5de1c5e0e560b5545cf2ec949c431" python install_package "pip-7.1.2" "https://pypi.python.org/packages/source/p/pip/pip-7.1.2.tar.gz#ca047986f0528cfa975a14fb9f7f106271d4e0c3fe1ddced6c1db2e7ae57a477" python pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.2.5000066400000000000000000000016371517431316200245130ustar00rootroot00000000000000install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline install_package "Python-3.2.5" "https://www.python.org/ftp/python/3.2.5/Python-3.2.5.tgz#5eae0ab92a0bb9e3a1bf9c7cd046bc3de58996b049bd894d095978b6b085099f" standard verify_py32 install_package "setuptools-17.1.1" "https://pypi.python.org/packages/source/s/setuptools/setuptools-17.1.1.tar.gz#5bf42dbf406fd58a41029f53cffff1c90db5de1c5e0e560b5545cf2ec949c431" python install_package "pip-7.1.2" "https://pypi.python.org/packages/source/p/pip/pip-7.1.2.tar.gz#ca047986f0528cfa975a14fb9f7f106271d4e0c3fe1ddced6c1db2e7ae57a477" python pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.2.6000066400000000000000000000021721517431316200245070ustar00rootroot00000000000000install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.2.6" "https://www.python.org/ftp/python/3.2.6/Python-3.2.6.tar.xz#1d12b501819fd26afafbf8459be1aa279b56f032b4c15412de0a713ce0de7bdc" standard verify_py32 else install_package "Python-3.2.6" "https://www.python.org/ftp/python/3.2.6/Python-3.2.6.tgz#fc1e41296e29d476f696303acae293ae7a2310f0f9d0d637905e722a3f16163e" standard verify_py32 fi install_package "setuptools-17.1.1" "https://pypi.python.org/packages/source/s/setuptools/setuptools-17.1.1.tar.gz#5bf42dbf406fd58a41029f53cffff1c90db5de1c5e0e560b5545cf2ec949c431" python install_package "pip-7.1.2" "https://pypi.python.org/packages/source/p/pip/pip-7.1.2.tar.gz#ca047986f0528cfa975a14fb9f7f106271d4e0c3fe1ddced6c1db2e7ae57a477" python pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.3.0000066400000000000000000000011101517431316200244710ustar00rootroot00000000000000install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline install_package "Python-3.3.0" "https://www.python.org/ftp/python/3.3.0/Python-3.3.0.tgz#cfe531eaace2503e13a74addc7f4a89482e99f8b8fca51b469ae5c83f450604e" standard verify_py33 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.3.1000066400000000000000000000011101517431316200244720ustar00rootroot00000000000000install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline install_package "Python-3.3.1" "https://www.python.org/ftp/python/3.3.1/Python-3.3.1.tgz#671dc3632f311e63c6733703aa0a1ad90c99277ddc8299d39e487718a50319bd" standard verify_py33 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.3.2000066400000000000000000000011101517431316200244730ustar00rootroot00000000000000install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline install_package "Python-3.3.2" "https://www.python.org/ftp/python/3.3.2/Python-3.3.2.tgz#de664fca3b8e0ab20fb42bfed1a36e26f116f1853e88ada12dbc938761036172" standard verify_py33 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.3.3000066400000000000000000000011101517431316200244740ustar00rootroot00000000000000install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline install_package "Python-3.3.3" "https://www.python.org/ftp/python/3.3.3/Python-3.3.3.tgz#30b60839bfe0ae8a2dba11e909328459bb8ee4a258afe7494b06b2ceda080efc" standard verify_py33 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.3.4000066400000000000000000000011101517431316200244750ustar00rootroot00000000000000install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline install_package "Python-3.3.4" "https://www.python.org/ftp/python/3.3.4/Python-3.3.4.tgz#ea055db9dd004a6ecd7690abc9734573763686dd768122316bae2dfd026412af" standard verify_py33 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.3.5000066400000000000000000000011101517431316200244760ustar00rootroot00000000000000install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline install_package "Python-3.3.5" "https://www.python.org/ftp/python/3.3.5/Python-3.3.5.tgz#916bc57dd8524dc27429bebae7b39d6942742cf9699b875b2b496a3d960c7168" standard verify_py33 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.3.6000066400000000000000000000014551517431316200245130ustar00rootroot00000000000000install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.3.6" "https://www.python.org/ftp/python/3.3.6/Python-3.3.6.tar.xz#5226e4bf7a530c3ff2bcde0c94e0e09e59a8bcde0114fe0268bc925bdabb5d3f" standard verify_py33 ensurepip else install_package "Python-3.3.6" "https://www.python.org/ftp/python/3.3.6/Python-3.3.6.tgz#0a58ad1f1def4ecc90b18b0c410a3a0e1a48cf7692c75d1f83d0af080e5d2034" standard verify_py33 ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.3.7000066400000000000000000000014551517431316200245140ustar00rootroot00000000000000install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.3.7" "https://www.python.org/ftp/python/3.3.7/Python-3.3.7.tar.xz#85f60c327501c36bc18c33370c14d472801e6af2f901dafbba056f61685429fe" standard verify_py33 ensurepip else install_package "Python-3.3.7" "https://www.python.org/ftp/python/3.3.7/Python-3.3.7.tgz#992461a9598e85a45323512d4e60fa6c1d5aaef0956bf9db98733cc5aa9b05e1" standard verify_py33 ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.4-dev000066400000000000000000000010051517431316200251130ustar00rootroot00000000000000prefer_openssl11 install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline install_git "Python-3.4-dev" "https://github.com/python/cpython" "3.4" standard verify_py34 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.4.0000066400000000000000000000014551517431316200245060ustar00rootroot00000000000000install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.4.0" "https://www.python.org/ftp/python/3.4.0/Python-3.4.0.tar.xz#f13686c0a2d45e7146759e9d5d1cbd8097a0606483c0cf7730e1e13f58b14cbe" standard verify_py34 ensurepip else install_package "Python-3.4.0" "https://www.python.org/ftp/python/3.4.0/Python-3.4.0.tgz#d2c83ea0217769a73e8b1ee33ffbca814903f8568e30f8d13e68e3d1f743449c" standard verify_py34 ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.4.1000066400000000000000000000014551517431316200245070ustar00rootroot00000000000000install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.4.1" "https://www.python.org/ftp/python/3.4.1/Python-3.4.1.tar.xz#c595a163104399041fcbe1c5c04db4c1da94f917b82ce89e8944c8edff7aedc4" standard verify_py34 ensurepip else install_package "Python-3.4.1" "https://www.python.org/ftp/python/3.4.1/Python-3.4.1.tgz#8d007e3ef80b128a292be101201e75dec5480e5632e994771e7c231d17720b66" standard verify_py34 ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.4.10000066400000000000000000000013741517431316200245670ustar00rootroot00000000000000install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline has_tar_xz_support \ && src="https://www.python.org/ftp/python/3.4.10/Python-3.4.10.tar.xz#d46a8f6fe91679e199c671b1b0a30aaf172d2acb5bcab25beb35f16c3d195b4e" \ || src="https://www.python.org/ftp/python/3.4.10/Python-3.4.10.tgz#217757699249ab432571b381386d441e12b433100ab5f908051fcb7cced2539d" install_package "Python-3.4.10" "$src" standard verify_py34 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.4.2000066400000000000000000000014551517431316200245100ustar00rootroot00000000000000install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.4.2" "https://www.python.org/ftp/python/3.4.2/Python-3.4.2.tar.xz#1c6d9682d145c056537e477bbfa060ce727f9edd38df1827e0f970dcf04b2def" standard verify_py34 ensurepip else install_package "Python-3.4.2" "https://www.python.org/ftp/python/3.4.2/Python-3.4.2.tgz#44a3c1ef1c7ca3e4fd25242af80ed72da941203cb4ed1a8c1b724d9078965dd8" standard verify_py34 ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.4.3000066400000000000000000000014551517431316200245110ustar00rootroot00000000000000install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.4.3" "https://www.python.org/ftp/python/3.4.3/Python-3.4.3.tar.xz#b5b3963533768d5fc325a4d7a6bd6f666726002d696f1d399ec06b043ea996b8" standard verify_py34 ensurepip else install_package "Python-3.4.3" "https://www.python.org/ftp/python/3.4.3/Python-3.4.3.tgz#8b743f56e9e50bf0923b9e9c45dd927c071d7aa56cd46569d8818add8cf01147" standard verify_py34 ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.4.4000066400000000000000000000014551517431316200245120ustar00rootroot00000000000000install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.4.4" "https://www.python.org/ftp/python/3.4.4/Python-3.4.4.tar.xz#a797d3820155ec6cb654a652b9acfb11792d4e7d568eef1f9199009e042b6ba2" standard verify_py34 ensurepip else install_package "Python-3.4.4" "https://www.python.org/ftp/python/3.4.4/Python-3.4.4.tgz#bc93e944025816ec360712b4c42d8d5f729eaed2b26585e9bc8844f93f0c382e" standard verify_py34 ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.4.5000066400000000000000000000014551517431316200245130ustar00rootroot00000000000000install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.4.5" "https://www.python.org/ftp/python/3.4.5/Python-3.4.5.tar.xz#ee64b1c8a47461009abf25252332d29a4e587cb4f0c1c96aa793a3732e9d898a" standard verify_py34 ensurepip else install_package "Python-3.4.5" "https://www.python.org/ftp/python/3.4.5/Python-3.4.5.tgz#997aca4dd8692f3c954658a3db11c1d0862bcbf8eadd6a164746eb33d317c034" standard verify_py34 ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.4.6000066400000000000000000000014551517431316200245140ustar00rootroot00000000000000install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.4.6" "https://www.python.org/ftp/python/3.4.6/Python-3.4.6.tar.xz#f13428bbe6aa9e3b9b6499502dc488c26096349ed7a21f7a0c1db90911115f40" standard verify_py34 ensurepip else install_package "Python-3.4.6" "https://www.python.org/ftp/python/3.4.6/Python-3.4.6.tgz#fe59daced99549d1d452727c050ae486169e9716a890cffb0d468b376d916b48" standard verify_py34 ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.4.7000066400000000000000000000014551517431316200245150ustar00rootroot00000000000000install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.4.7" "https://www.python.org/ftp/python/3.4.7/Python-3.4.7.tar.xz#8714cf2b56dd36922dec8fa184d4936e1001c22fb439798cb73dda069e129d1b" standard verify_py34 ensurepip else install_package "Python-3.4.7" "https://www.python.org/ftp/python/3.4.7/Python-3.4.7.tgz#1614734847fd07e2a1ab1c65ae841db2433f8b845f49b34b7b5cabcb1c3f491f" standard verify_py34 ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.4.8000066400000000000000000000014551517431316200245160ustar00rootroot00000000000000install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.4.8" "https://www.python.org/ftp/python/3.4.8/Python-3.4.8.tar.xz#29a472fa902c7b2add152f5e1e82e0885a8d360645689c1db5d1949a7e8ac3ea" standard verify_py34 ensurepip else install_package "Python-3.4.8" "https://www.python.org/ftp/python/3.4.8/Python-3.4.8.tgz#8b1a1ce043e132082d29a5d09f2841f193c77b631282a82f98895a5dbaba1639" standard verify_py34 ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.4.9000066400000000000000000000014551517431316200245170ustar00rootroot00000000000000install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.4.9" "https://www.python.org/ftp/python/3.4.9/Python-3.4.9.tar.xz#59629676ba2b01a798f5211d8f63c26ee52f1d5133cf37583e0bf1bad50c2bd9" standard verify_py34 ensurepip else install_package "Python-3.4.9" "https://www.python.org/ftp/python/3.4.9/Python-3.4.9.tgz#e02e565372750a6678efe35ddecbe5ccd5330a8a2e8bbe38d3060713492e3dab" standard verify_py34 ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.5-dev000066400000000000000000000010251517431316200251160ustar00rootroot00000000000000prefer_openssl11 install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline install_git "Python-3.5-dev" "https://github.com/python/cpython" "3.5" standard verify_py35 copy_python_gdb ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.5.0000066400000000000000000000015151517431316200245040ustar00rootroot00000000000000install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.5.0" "https://www.python.org/ftp/python/3.5.0/Python-3.5.0.tar.xz#d6d7aa1634a5eeeca6ed4fca266982a04f84bd8f3945a9179e20b24ad2e2be91" standard verify_py35 copy_python_gdb ensurepip else install_package "Python-3.5.0" "https://www.python.org/ftp/python/3.5.0/Python-3.5.0.tgz#584e3d5a02692ca52fce505e68ecd77248a6f2c99adf9db144a39087336b0fe0" standard verify_py35 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.5.1000066400000000000000000000015151517431316200245050ustar00rootroot00000000000000install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.5.1" "https://www.python.org/ftp/python/3.5.1/Python-3.5.1.tar.xz#c6d57c0c366d9060ab6c0cdf889ebf3d92711d466cc0119c441dbf2746f725c9" standard verify_py35 copy_python_gdb ensurepip else install_package "Python-3.5.1" "https://www.python.org/ftp/python/3.5.1/Python-3.5.1.tgz#687e067d9f391da645423c7eda8205bae9d35edc0c76ef5218dcbe4cc770d0d7" standard verify_py35 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.5.10000066400000000000000000000015041517431316200245630ustar00rootroot00000000000000prefer_openssl11 install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.5.10" "https://www.python.org/ftp/python/3.5.10/Python-3.5.10.tar.xz#0f0fa8685c1dc1f1dacb0b4e7779796b90aef99dc1fa4967a71b9da7b57d4a28" standard verify_py35 ensurepip else install_package "Python-3.5.10" "https://www.python.org/ftp/python/3.5.10/Python-3.5.10.tgz#3496a0daf51913718a6f10e3eda51fa43634cb6151cb096f312d48bdbeff7d3a" standard verify_py35 ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.5.2000066400000000000000000000015151517431316200245060ustar00rootroot00000000000000install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.5.2" "https://www.python.org/ftp/python/3.5.2/Python-3.5.2.tar.xz#0010f56100b9b74259ebcd5d4b295a32324b58b517403a10d1a2aa7cb22bca40" standard verify_py35 copy_python_gdb ensurepip else install_package "Python-3.5.2" "https://www.python.org/ftp/python/3.5.2/Python-3.5.2.tgz#1524b840e42cf3b909e8f8df67c1724012c7dc7f9d076d4feef2d3eff031e8a0" standard verify_py35 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.5.3000066400000000000000000000015361517431316200245120ustar00rootroot00000000000000prefer_openssl11 install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.5.3" "https://www.python.org/ftp/python/3.5.3/Python-3.5.3.tar.xz#eefe2ad6575855423ab630f5b51a8ef6e5556f774584c06beab4926f930ddbb0" standard verify_py35 copy_python_gdb ensurepip else install_package "Python-3.5.3" "https://www.python.org/ftp/python/3.5.3/Python-3.5.3.tgz#d8890b84d773cd7059e597dbefa510340de8336ec9b9e9032bf030f19291565a" standard verify_py35 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.5.4000066400000000000000000000015361517431316200245130ustar00rootroot00000000000000prefer_openssl11 install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.5.4" "https://www.python.org/ftp/python/3.5.4/Python-3.5.4.tar.xz#94d93bfabb3b109f8a10365a325f920f9ec98c6e2380bf228f9700a14054c84c" standard verify_py35 copy_python_gdb ensurepip else install_package "Python-3.5.4" "https://www.python.org/ftp/python/3.5.4/Python-3.5.4.tgz#6ed87a8b6c758cc3299a8b433e8a9a9122054ad5bc8aad43299cff3a53d8ca44" standard verify_py35 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.5.5000066400000000000000000000015361517431316200245140ustar00rootroot00000000000000prefer_openssl11 install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.5.5" "https://www.python.org/ftp/python/3.5.5/Python-3.5.5.tar.xz#063d2c3b0402d6191b90731e0f735c64830e7522348aeb7ed382a83165d45009" standard verify_py35 copy_python_gdb ensurepip else install_package "Python-3.5.5" "https://www.python.org/ftp/python/3.5.5/Python-3.5.5.tgz#2f988db33913dcef17552fd1447b41afb89dbc26e3cdfc068ea6c62013a3a2a5" standard verify_py35 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.5.6000066400000000000000000000015361517431316200245150ustar00rootroot00000000000000prefer_openssl11 install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.5.6" "https://www.python.org/ftp/python/3.5.6/Python-3.5.6.tar.xz#f55cde04f521f273c7cba08912921cc5642cfc15ca7b22d5829f0aff4371155f" standard verify_py35 copy_python_gdb ensurepip else install_package "Python-3.5.6" "https://www.python.org/ftp/python/3.5.6/Python-3.5.6.tgz#30d2ff093988e74283e1abfee823292c6b59590796b9827e95ba4940b27d26f8" standard verify_py35 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.5.7000066400000000000000000000014761517431316200245210ustar00rootroot00000000000000prefer_openssl11 install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.5.7" "https://www.python.org/ftp/python/3.5.7/Python-3.5.7.tar.xz#285892899bf4d5737fd08482aa6171c6b2564a45b9102dfacfb72826aebdc7dc" standard verify_py35 ensurepip else install_package "Python-3.5.7" "https://www.python.org/ftp/python/3.5.7/Python-3.5.7.tgz#542d94920a2a06a471a73b51614805ad65366af98145b0369bc374cf248b521b" standard verify_py35 ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.5.8000066400000000000000000000014761517431316200245220ustar00rootroot00000000000000prefer_openssl11 install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.5.8" "https://www.python.org/ftp/python/3.5.8/Python-3.5.8.tar.xz#55a345c78ee3afbc2e60678442aad7bcc384ddea5bb95f8d66edc4868d4847d4" standard verify_py35 ensurepip else install_package "Python-3.5.8" "https://www.python.org/ftp/python/3.5.8/Python-3.5.8.tgz#18c88dfd260147bc7247e6356010e5d4916dfbfc480f6434917f88e61228177a" standard verify_py35 ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.5.9000066400000000000000000000014761517431316200245230ustar00rootroot00000000000000prefer_openssl11 install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.5.9" "https://www.python.org/ftp/python/3.5.9/Python-3.5.9.tar.xz#c24a37c63a67f53bdd09c5f287b5cff8e8b98f857bf348c577d454d3f74db049" standard verify_py35 ensurepip else install_package "Python-3.5.9" "https://www.python.org/ftp/python/3.5.9/Python-3.5.9.tgz#67a1d4fc6e4540d6a092cadc488e533afa961b3c9becc74dc3d6b55cb56e0cc1" standard verify_py35 ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.6-dev000066400000000000000000000010251517431316200251170ustar00rootroot00000000000000prefer_openssl11 install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline install_git "Python-3.6-dev" "https://github.com/python/cpython" "3.6" standard verify_py36 copy_python_gdb ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.6.0000066400000000000000000000015151517431316200245050ustar00rootroot00000000000000install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.6.0" "https://www.python.org/ftp/python/3.6.0/Python-3.6.0.tar.xz#b0c5f904f685e32d9232f7bdcbece9819a892929063b6e385414ad2dd6a23622" standard verify_py36 copy_python_gdb ensurepip else install_package "Python-3.6.0" "https://www.python.org/ftp/python/3.6.0/Python-3.6.0.tgz#aa472515800d25a3739833f76ca3735d9f4b2fe77c3cb21f69275e0cce30cb2b" standard verify_py36 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.6.1000066400000000000000000000015151517431316200245060ustar00rootroot00000000000000install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.6.1" "https://www.python.org/ftp/python/3.6.1/Python-3.6.1.tar.xz#a01810ddfcec216bcdb357a84bfaafdfaa0ca42bbdaa4cb7ff74f5a9961e4041" standard verify_py36 copy_python_gdb ensurepip else install_package "Python-3.6.1" "https://www.python.org/ftp/python/3.6.1/Python-3.6.1.tgz#aa50b0143df7c89ce91be020fe41382613a817354b33acdc6641b44f8ced3828" standard verify_py36 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.6.10000066400000000000000000000015441517431316200245700ustar00rootroot00000000000000prefer_openssl11 install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.6.10" "https://www.python.org/ftp/python/3.6.10/Python-3.6.10.tar.xz#0a833c398ac8cd7c5538f7232d8531afef943c60495c504484f308dac3af40de" standard verify_py37 copy_python_gdb ensurepip else install_package "Python-3.6.10" "https://www.python.org/ftp/python/3.6.10/Python-3.6.10.tgz#7034dd7cba98d4f94c74f9edd7345bac71c8814c41672c64d9044fa2f96f334d" standard verify_py37 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.6.11000066400000000000000000000015441517431316200245710ustar00rootroot00000000000000prefer_openssl11 install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.6.11" "https://www.python.org/ftp/python/3.6.11/Python-3.6.11.tar.xz#741ebdcbc4e3937a5ff23517dd455ebf7d543ea9fef6f5cf6f46e575d6c4fda4" standard verify_py37 copy_python_gdb ensurepip else install_package "Python-3.6.11" "https://www.python.org/ftp/python/3.6.11/Python-3.6.11.tgz#96621902f89746fffc22f39749c07da7c2917b232e72352e6837d41850f7b90c" standard verify_py37 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.6.12000066400000000000000000000015441517431316200245720ustar00rootroot00000000000000prefer_openssl11 install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.6.12" "https://www.python.org/ftp/python/3.6.12/Python-3.6.12.tar.xz#70953a9b5d6891d92e65d184c3512126a15814bee15e1eff2ddcce04334e9a99" standard verify_py37 copy_python_gdb ensurepip else install_package "Python-3.6.12" "https://www.python.org/ftp/python/3.6.12/Python-3.6.12.tgz#12dddbe52385a0f702fb8071e12dcc6b3cb2dde07cd8db3ed60e90d90ab78693" standard verify_py37 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.6.13000066400000000000000000000015441517431316200245730ustar00rootroot00000000000000prefer_openssl11 install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.6.13" "https://www.python.org/ftp/python/3.6.13/Python-3.6.13.tar.xz#a47a43a53abb42286a2c11965343ff56711b9e64e8d11bf2c6701a4fb8ce1a0f" standard verify_py37 copy_python_gdb ensurepip else install_package "Python-3.6.13" "https://www.python.org/ftp/python/3.6.13/Python-3.6.13.tgz#614950d3d54f6e78dac651b49c64cfe2ceefea5af3aff3371a9e4b27a53b2669" standard verify_py37 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.6.14000066400000000000000000000015321517431316200245710ustar00rootroot00000000000000prefer_openssl11 install_package "openssl-1.1.1k" "https://www.openssl.org/source/openssl-1.1.1k.tar.gz#892a0875b9872acd04a9fde79b1f943075d5ea162415de3047c327df33fbaee5" mac_openssl --if has_broken_mac_openssl install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.6.14" "https://www.python.org/ftp/python/3.6.14/Python-3.6.14.tar.xz#2663a7a0cfbd00fc76269dce4317db0b54be53c0f4d705aabb32b87efa02d5ae" standard verify_py36 copy_python_gdb ensurepip else install_package "Python-3.6.14" "https://www.python.org/ftp/python/3.6.14/Python-3.6.14.tgz#70064897bc434d6eae8bcc3e5678f282b5ea776d60e695da548a1219ccfd27a5" standard verify_py36 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.6.15000066400000000000000000000015321517431316200245720ustar00rootroot00000000000000prefer_openssl11 install_package "openssl-1.1.1k" "https://www.openssl.org/source/openssl-1.1.1k.tar.gz#892a0875b9872acd04a9fde79b1f943075d5ea162415de3047c327df33fbaee5" mac_openssl --if has_broken_mac_openssl install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.6.15" "https://www.python.org/ftp/python/3.6.15/Python-3.6.15.tar.xz#6e28d7cdd6dd513dd190e49bca3972e20fcf455090ccf2ef3f1a227614135d91" standard verify_py36 copy_python_gdb ensurepip else install_package "Python-3.6.15" "https://www.python.org/ftp/python/3.6.15/Python-3.6.15.tgz#54570b7e339e2cfd72b29c7e2fdb47c0b7b18b7412e61de5b463fc087c13b043" standard verify_py36 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.6.2000066400000000000000000000015151517431316200245070ustar00rootroot00000000000000install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.6.2" "https://www.python.org/ftp/python/3.6.2/Python-3.6.2.tar.xz#9229773be41ed144370f47f0f626a1579931f5a390f1e8e3853174d52edd64a9" standard verify_py36 copy_python_gdb ensurepip else install_package "Python-3.6.2" "https://www.python.org/ftp/python/3.6.2/Python-3.6.2.tgz#7919489310a5f17f7acbab64d731e46dca0702874840dadce8bd4b2b3b8e7a82" standard verify_py36 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.6.3000066400000000000000000000015151517431316200245100ustar00rootroot00000000000000install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.6.3" "https://www.python.org/ftp/python/3.6.3/Python-3.6.3.tar.xz#cda7d967c9a4bfa52337cdf551bcc5cff026b6ac50a8834e568ce4a794ca81da" standard verify_py36 copy_python_gdb ensurepip else install_package "Python-3.6.3" "https://www.python.org/ftp/python/3.6.3/Python-3.6.3.tgz#ab6193af1921b30f587b302fe385268510e80187ca83ca82d2bfe7ab544c6f91" standard verify_py36 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.6.4000066400000000000000000000015151517431316200245110ustar00rootroot00000000000000install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.6.4" "https://www.python.org/ftp/python/3.6.4/Python-3.6.4.tar.xz#159b932bf56aeaa76fd66e7420522d8c8853d486b8567c459b84fe2ed13bcaba" standard verify_py36 copy_python_gdb ensurepip else install_package "Python-3.6.4" "https://www.python.org/ftp/python/3.6.4/Python-3.6.4.tgz#7dc453e1a93c083388eb1a23a256862407f8234a96dc4fae0fc7682020227486" standard verify_py36 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.6.5000066400000000000000000000015151517431316200245120ustar00rootroot00000000000000install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.6.5" "https://www.python.org/ftp/python/3.6.5/Python-3.6.5.tar.xz#f434053ba1b5c8a5cc597e966ead3c5143012af827fd3f0697d21450bb8d87a6" standard verify_py36 copy_python_gdb ensurepip else install_package "Python-3.6.5" "https://www.python.org/ftp/python/3.6.5/Python-3.6.5.tgz#53a3e17d77cd15c5230192b6a8c1e031c07cd9f34a2f089a731c6f6bd343d5c6" standard verify_py36 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.6.6000066400000000000000000000015151517431316200245130ustar00rootroot00000000000000install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.6.6" "https://www.python.org/ftp/python/3.6.6/Python-3.6.6.tar.xz#d79bc15d456e73a3173a2938f18a17e5149c850ebdedf84a78067f501ee6e16f" standard verify_py36 copy_python_gdb ensurepip else install_package "Python-3.6.6" "https://www.python.org/ftp/python/3.6.6/Python-3.6.6.tgz#7d56dadf6c7d92a238702389e80cfe66fbfae73e584189ed6f89c75bbf3eda58" standard verify_py36 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.6.7000066400000000000000000000015361517431316200245170ustar00rootroot00000000000000prefer_openssl11 install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.6.7" "https://www.python.org/ftp/python/3.6.7/Python-3.6.7.tar.xz#81fd1401a9d66533b0a3e9e3f4ea1c7c6702d57d5b90d659f971e6f1b745f77d" standard verify_py37 copy_python_gdb ensurepip else install_package "Python-3.6.7" "https://www.python.org/ftp/python/3.6.7/Python-3.6.7.tgz#b7c36f7ed8f7143b2c46153b7332db2227669f583ea0cce753facf549d1a4239" standard verify_py37 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.6.8000066400000000000000000000015361517431316200245200ustar00rootroot00000000000000prefer_openssl11 install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.6.8" "https://www.python.org/ftp/python/3.6.8/Python-3.6.8.tar.xz#35446241e995773b1bed7d196f4b624dadcadc8429f26282e756b2fb8a351193" standard verify_py37 copy_python_gdb ensurepip else install_package "Python-3.6.8" "https://www.python.org/ftp/python/3.6.8/Python-3.6.8.tgz#7f5b1f08b3b0a595387ef6c64c85b1b13b38abef0dd871835ee923262e4f32f0" standard verify_py37 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.6.9000066400000000000000000000015361517431316200245210ustar00rootroot00000000000000prefer_openssl11 install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.6.9" "https://www.python.org/ftp/python/3.6.9/Python-3.6.9.tar.xz#5e2f5f554e3f8f7f0296f7e73d8600c4e9acbaee6b2555b83206edf5153870da" standard verify_py37 copy_python_gdb ensurepip else install_package "Python-3.6.9" "https://www.python.org/ftp/python/3.6.9/Python-3.6.9.tgz#47fc92a1dcb946b9ed0abc311d3767b7215c54e655b17fd1d3f9b538195525aa" standard verify_py37 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.7-dev000066400000000000000000000010701517431316200251200ustar00rootroot00000000000000prefer_openssl11 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-1.1.1k" "https://www.openssl.org/source/openssl-1.1.1k.tar.gz#892a0875b9872acd04a9fde79b1f943075d5ea162415de3047c327df33fbaee5" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline install_git "Python-3.7-dev" "https://github.com/python/cpython" "3.7" standard verify_py37 copy_python_gdb ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.7.0000066400000000000000000000016131517431316200245050ustar00rootroot00000000000000prefer_openssl11 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.7.0" "https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tar.xz#0382996d1ee6aafe59763426cf0139ffebe36984474d0ec4126dd1c40a8b3549" standard verify_py37 copy_python_gdb ensurepip else install_package "Python-3.7.0" "https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tgz#85bb9feb6863e04fb1700b018d9d42d1caac178559ffa453d7e6a436e259fd0d" standard verify_py37 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.7.1000066400000000000000000000016131517431316200245060ustar00rootroot00000000000000prefer_openssl11 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.7.1" "https://www.python.org/ftp/python/3.7.1/Python-3.7.1.tar.xz#fa7e2b8e8c9402f192ad56dc4f814089d1c4466c97d780f5e5acc02c04243d6d" standard verify_py37 copy_python_gdb ensurepip else install_package "Python-3.7.1" "https://www.python.org/ftp/python/3.7.1/Python-3.7.1.tgz#36c1b81ac29d0f8341f727ef40864d99d8206897be96be73dc34d4739c9c9f06" standard verify_py37 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.7.10000066400000000000000000000016071517431316200245710ustar00rootroot00000000000000prefer_openssl11 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-1.1.1k" "https://www.openssl.org/source/openssl-1.1.1k.tar.gz#892a0875b9872acd04a9fde79b1f943075d5ea162415de3047c327df33fbaee5" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.7.10" "https://www.python.org/ftp/python/3.7.10/Python-3.7.10.tar.xz#f8d82e7572c86ec9d55c8627aae5040124fd2203af400c383c821b980306ee6b" standard verify_py37 copy_python_gdb ensurepip else install_package "Python-3.7.10" "https://www.python.org/ftp/python/3.7.10/Python-3.7.10.tgz#c9649ad84dc3a434c8637df6963100b2e5608697f9ba56d82e3809e4148e0975" standard verify_py37 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.7.11000066400000000000000000000016071517431316200245720ustar00rootroot00000000000000prefer_openssl11 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-1.1.1k" "https://www.openssl.org/source/openssl-1.1.1k.tar.gz#892a0875b9872acd04a9fde79b1f943075d5ea162415de3047c327df33fbaee5" mac_openssl --if has_broken_mac_openssl install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.7.11" "https://www.python.org/ftp/python/3.7.11/Python-3.7.11.tar.xz#ddb4196ab5c4f69e895920a422cb60d42b46e2de2b173ce7fd57f1435459a734" standard verify_py37 copy_python_gdb ensurepip else install_package "Python-3.7.11" "https://www.python.org/ftp/python/3.7.11/Python-3.7.11.tgz#b4fba32182e16485d0a6022ba83c9251e6a1c14676ec243a9a07d3722cd4661a" standard verify_py37 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.7.12000066400000000000000000000016071517431316200245730ustar00rootroot00000000000000prefer_openssl11 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-1.1.1k" "https://www.openssl.org/source/openssl-1.1.1k.tar.gz#892a0875b9872acd04a9fde79b1f943075d5ea162415de3047c327df33fbaee5" mac_openssl --if has_broken_mac_openssl install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.7.12" "https://www.python.org/ftp/python/3.7.12/Python-3.7.12.tar.xz#f77bf7fb47839f213e5cbf7827281078ea90de7e72b44f10d7ef385ea8c43210" standard verify_py37 copy_python_gdb ensurepip else install_package "Python-3.7.12" "https://www.python.org/ftp/python/3.7.12/Python-3.7.12.tgz#33b4daaf831be19219659466d12645f87ecec6eb21d4d9f9711018a7b66cce46" standard verify_py37 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.7.13000066400000000000000000000016071517431316200245740ustar00rootroot00000000000000prefer_openssl11 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-1.1.1n" "https://www.openssl.org/source/openssl-1.1.1n.tar.gz#40dceb51a4f6a5275bde0e6bf20ef4b91bfc32ed57c0552e2e8e15463372b17a" mac_openssl --if has_broken_mac_openssl install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.7.13" "https://www.python.org/ftp/python/3.7.13/Python-3.7.13.tar.xz#99f106275df8899c3e8cb9d7c01ce686c202ef275953301427194693de5bef84" standard verify_py37 copy_python_gdb ensurepip else install_package "Python-3.7.13" "https://www.python.org/ftp/python/3.7.13/Python-3.7.13.tgz#e405417f50984bc5870c7e7a9f9aeb93e9d270f5ac67f667a0cd3a09439682b5" standard verify_py37 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.7.14000066400000000000000000000016071517431316200245750ustar00rootroot00000000000000prefer_openssl11 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-1.1.1n" "https://www.openssl.org/source/openssl-1.1.1n.tar.gz#40dceb51a4f6a5275bde0e6bf20ef4b91bfc32ed57c0552e2e8e15463372b17a" mac_openssl --if has_broken_mac_openssl install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.7.14" "https://www.python.org/ftp/python/3.7.14/Python-3.7.14.tar.xz#4157ae31eb81af19e81c36882610491b0fb8f50e00fa8a17b095c88908b9c45c" standard verify_py37 copy_python_gdb ensurepip else install_package "Python-3.7.14" "https://www.python.org/ftp/python/3.7.14/Python-3.7.14.tgz#82b2abf8978caa61a9011d166eede831b32de9cbebc0db8162900fa23437b709" standard verify_py37 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.7.15000066400000000000000000000016071517431316200245760ustar00rootroot00000000000000prefer_openssl11 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-1.1.1q" "https://www.openssl.org/source/openssl-1.1.1q.tar.gz#d7939ce614029cdff0b6c20f0e2e5703158a489a72b2507b8bd51bf8c8fd10ca" mac_openssl --if has_broken_mac_openssl install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.7.15" "https://www.python.org/ftp/python/3.7.15/Python-3.7.15.tar.xz#5911475a07ac2b53d746e88a0716af6d2b4734941919136ea0d33fb9c75b9714" standard verify_py37 copy_python_gdb ensurepip else install_package "Python-3.7.15" "https://www.python.org/ftp/python/3.7.15/Python-3.7.15.tgz#cf2993798ae8430f3af3a00d96d9fdf320719f4042f039380dca79967c25e436" standard verify_py37 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.7.16000066400000000000000000000016071517431316200245770ustar00rootroot00000000000000prefer_openssl11 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-1.1.1q" "https://www.openssl.org/source/openssl-1.1.1q.tar.gz#d7939ce614029cdff0b6c20f0e2e5703158a489a72b2507b8bd51bf8c8fd10ca" mac_openssl --if has_broken_mac_openssl install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.7.16" "https://www.python.org/ftp/python/3.7.16/Python-3.7.16.tar.xz#8338f0c2222d847e904c955369155dc1beeeed806e8d5ef04b00ef4787238bfd" standard verify_py37 copy_python_gdb ensurepip else install_package "Python-3.7.16" "https://www.python.org/ftp/python/3.7.16/Python-3.7.16.tgz#0cf2da07fa464636755215415909e22eb1d058817af4824bc15af8390d05fb38" standard verify_py37 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.7.17000066400000000000000000000016071517431316200246000ustar00rootroot00000000000000prefer_openssl11 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-1.1.1u" "https://www.openssl.org/source/openssl-1.1.1u.tar.gz#e2f8d84b523eecd06c7be7626830370300fbcc15386bf5142d72758f6963ebc6" mac_openssl --if has_broken_mac_openssl install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.7.17" "https://www.python.org/ftp/python/3.7.17/Python-3.7.17.tar.xz#7911051ed0422fd54b8f59ffc030f7cf2ae30e0f61bda191800bb040dce4f9d2" standard verify_py37 copy_python_gdb ensurepip else install_package "Python-3.7.17" "https://www.python.org/ftp/python/3.7.17/Python-3.7.17.tgz#fd50161bc2a04f4c22a0971ff0f3856d98b4bf294f89740a9f06b520aae63b49" standard verify_py37 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.7.2000066400000000000000000000016131517431316200245070ustar00rootroot00000000000000prefer_openssl11 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.7.2" "https://www.python.org/ftp/python/3.7.2/Python-3.7.2.tar.xz#d83fe8ce51b1bb48bbcf0550fd265b9a75cdfdfa93f916f9e700aef8444bf1bb" standard verify_py37 copy_python_gdb ensurepip else install_package "Python-3.7.2" "https://www.python.org/ftp/python/3.7.2/Python-3.7.2.tgz#f09d83c773b9cc72421abba2c317e4e6e05d919f9bcf34468e192b6a6c8e328d" standard verify_py37 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.7.3000066400000000000000000000016131517431316200245100ustar00rootroot00000000000000prefer_openssl11 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.7.3" "https://www.python.org/ftp/python/3.7.3/Python-3.7.3.tar.xz#da60b54064d4cfcd9c26576f6df2690e62085123826cff2e667e72a91952d318" standard verify_py37 copy_python_gdb ensurepip else install_package "Python-3.7.3" "https://www.python.org/ftp/python/3.7.3/Python-3.7.3.tgz#d62e3015f2f89c970ac52343976b406694931742fbde2fed8d1ce8ebb4e1f8ff" standard verify_py37 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.7.4000066400000000000000000000016131517431316200245110ustar00rootroot00000000000000prefer_openssl11 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.7.4" "https://www.python.org/ftp/python/3.7.4/Python-3.7.4.tar.xz#fb799134b868199930b75f26678f18932214042639cd52b16da7fd134cd9b13f" standard verify_py37 copy_python_gdb ensurepip else install_package "Python-3.7.4" "https://www.python.org/ftp/python/3.7.4/Python-3.7.4.tgz#d63e63e14e6d29e17490abbe6f7d17afb3db182dbd801229f14e55f4157c4ba3" standard verify_py37 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.7.5000066400000000000000000000016131517431316200245120ustar00rootroot00000000000000prefer_openssl11 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.7.5" "https://www.python.org/ftp/python/3.7.5/Python-3.7.5.tar.xz#e85a76ea9f3d6c485ec1780fca4e500725a4a7bbc63c78ebc44170de9b619d94" standard verify_py37 copy_python_gdb ensurepip else install_package "Python-3.7.5" "https://www.python.org/ftp/python/3.7.5/Python-3.7.5.tgz#8ecc681ea0600bbfb366f2b173f727b205bb825d93d2f0b286bc4e58d37693da" standard verify_py37 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.7.6000066400000000000000000000016131517431316200245130ustar00rootroot00000000000000prefer_openssl11 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.7.6" "https://www.python.org/ftp/python/3.7.6/Python-3.7.6.tar.xz#55a2cce72049f0794e9a11a84862e9039af9183603b78bc60d89539f82cf533f" standard verify_py37 copy_python_gdb ensurepip else install_package "Python-3.7.6" "https://www.python.org/ftp/python/3.7.6/Python-3.7.6.tgz#aeee681c235ad336af116f08ab6563361a0c81c537072c1b309d6e4050aa2114" standard verify_py37 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.7.7000066400000000000000000000016131517431316200245140ustar00rootroot00000000000000prefer_openssl11 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.7.7" "https://www.python.org/ftp/python/3.7.7/Python-3.7.7.tar.xz#06a0a9f1bf0d8cd1e4121194d666c4e28ddae4dd54346de6c343206599f02136" standard verify_py37 copy_python_gdb ensurepip else install_package "Python-3.7.7" "https://www.python.org/ftp/python/3.7.7/Python-3.7.7.tgz#8c8be91cd2648a1a0c251f04ea0bb4c2a5570feb9c45eaaa2241c785585b475a" standard verify_py37 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.7.8000066400000000000000000000016131517431316200245150ustar00rootroot00000000000000prefer_openssl11 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-1.1.1j" "https://www.openssl.org/source/old/1.1.1/openssl-1.1.1j.tar.gz#aaf2fcb575cdf6491b98ab4829abf78a3dec8402b8b81efc8f23c00d443981bf" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.7.8" "https://www.python.org/ftp/python/3.7.8/Python-3.7.8.tar.xz#43a543404b363f0037f89df8478f19db2dbc0d6f3ffee310bc2997fa71854a63" standard verify_py37 copy_python_gdb ensurepip else install_package "Python-3.7.8" "https://www.python.org/ftp/python/3.7.8/Python-3.7.8.tgz#0e25835614dc221e3ecea5831b38fa90788b5389b99b675a751414c858789ab0" standard verify_py37 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.7.9000066400000000000000000000016011517431316200245130ustar00rootroot00000000000000prefer_openssl11 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-1.1.1k" "https://www.openssl.org/source/openssl-1.1.1k.tar.gz#892a0875b9872acd04a9fde79b1f943075d5ea162415de3047c327df33fbaee5" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.7.9" "https://www.python.org/ftp/python/3.7.9/Python-3.7.9.tar.xz#91923007b05005b5f9bd46f3b9172248aea5abc1543e8a636d59e629c3331b01" standard verify_py37 copy_python_gdb ensurepip else install_package "Python-3.7.9" "https://www.python.org/ftp/python/3.7.9/Python-3.7.9.tgz#39b018bc7d8a165e59aa827d9ae45c45901739b0bbb13721e4f973f3521c166a" standard verify_py37 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.8-dev000066400000000000000000000010701517431316200251210ustar00rootroot00000000000000prefer_openssl11 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-1.1.1k" "https://www.openssl.org/source/openssl-1.1.1k.tar.gz#892a0875b9872acd04a9fde79b1f943075d5ea162415de3047c327df33fbaee5" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline install_git "Python-3.8-dev" "https://github.com/python/cpython" "3.8" standard verify_py38 copy_python_gdb ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.8.0000066400000000000000000000016131517431316200245060ustar00rootroot00000000000000prefer_openssl11 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.8.0" "https://www.python.org/ftp/python/3.8.0/Python-3.8.0.tar.xz#b356244e13fb5491da890b35b13b2118c3122977c2cd825e3eb6e7d462030d84" standard verify_py38 copy_python_gdb ensurepip else install_package "Python-3.8.0" "https://www.python.org/ftp/python/3.8.0/Python-3.8.0.tgz#f1069ad3cae8e7ec467aa98a6565a62a48ef196cb8f1455a245a08db5e1792df" standard verify_py38 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.8.1000066400000000000000000000016131517431316200245070ustar00rootroot00000000000000prefer_openssl11 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.8.1" "https://www.python.org/ftp/python/3.8.1/Python-3.8.1.tar.xz#75894117f6db7051c1b34f37410168844bbb357c139a8a10a352e9bf8be594e8" standard verify_py38 copy_python_gdb ensurepip else install_package "Python-3.8.1" "https://www.python.org/ftp/python/3.8.1/Python-3.8.1.tgz#c7cfa39a43b994621b245e029769e9126caa2a93571cee2e743b213cceac35fb" standard verify_py38 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.8.10000066400000000000000000000020761517431316200245730ustar00rootroot00000000000000prefer_openssl11 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 # Avoid a compilation error when linking against OpenSSL built with SSLv3 support (fixed in 3.10.0) (#2181) export PYTHON_CFLAGS="-DOPENSSL_NO_SSL3${PYTHON_CFLAGS:+ $PYTHON_CFLAGS}" install_package "openssl-1.1.1k" "https://www.openssl.org/source/openssl-1.1.1k.tar.gz#892a0875b9872acd04a9fde79b1f943075d5ea162415de3047c327df33fbaee5" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.8.10" "https://www.python.org/ftp/python/3.8.10/Python-3.8.10.tar.xz#6af24a66093dd840bcccf371d4044a3027e655cf24591ce26e48022bc79219d9" standard verify_py38 copy_python_gdb ensurepip else install_package "Python-3.8.10" "https://www.python.org/ftp/python/3.8.10/Python-3.8.10.tgz#b37ac74d2cbad2590e7cd0dd2b3826c29afe89a734090a87bf8c03c45066cb65" standard verify_py38 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.8.11000066400000000000000000000020761517431316200245740ustar00rootroot00000000000000prefer_openssl11 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 # Avoid a compilation error when linking against OpenSSL built with SSLv3 support (fixed in 3.10.0) (#2181) export PYTHON_CFLAGS="-DOPENSSL_NO_SSL3${PYTHON_CFLAGS:+ $PYTHON_CFLAGS}" install_package "openssl-1.1.1k" "https://www.openssl.org/source/openssl-1.1.1k.tar.gz#892a0875b9872acd04a9fde79b1f943075d5ea162415de3047c327df33fbaee5" mac_openssl --if has_broken_mac_openssl install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.8.11" "https://www.python.org/ftp/python/3.8.11/Python-3.8.11.tar.xz#fb1a1114ebfe9e97199603c6083e20b236a0e007a2c51f29283ffb50c1420fb2" standard verify_py38 copy_python_gdb ensurepip else install_package "Python-3.8.11" "https://www.python.org/ftp/python/3.8.11/Python-3.8.11.tgz#b77464ea80cec14581b86aeb7fb2ff02830e0abc7bcdc752b7b4bdfcd8f3e393" standard verify_py38 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.8.12000066400000000000000000000020761517431316200245750ustar00rootroot00000000000000prefer_openssl11 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 # Avoid a compilation error when linking against OpenSSL built with SSLv3 support (fixed in 3.10.0) (#2181) export PYTHON_CFLAGS="-DOPENSSL_NO_SSL3${PYTHON_CFLAGS:+ $PYTHON_CFLAGS}" install_package "openssl-1.1.1k" "https://www.openssl.org/source/openssl-1.1.1k.tar.gz#892a0875b9872acd04a9fde79b1f943075d5ea162415de3047c327df33fbaee5" mac_openssl --if has_broken_mac_openssl install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.8.12" "https://www.python.org/ftp/python/3.8.12/Python-3.8.12.tar.xz#b1d3a76420375343b5e8a22fceb1ac65b77193e9ed27146524f0a9db058728ea" standard verify_py38 copy_python_gdb ensurepip else install_package "Python-3.8.12" "https://www.python.org/ftp/python/3.8.12/Python-3.8.12.tgz#316aa33f3b7707d041e73f246efedb297a70898c4b91f127f66dc8d80c596f1a" standard verify_py38 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.8.13000066400000000000000000000020761517431316200245760ustar00rootroot00000000000000prefer_openssl11 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 # Avoid a compilation error when linking against OpenSSL built with SSLv3 support (fixed in 3.10.0) (#2181) export PYTHON_CFLAGS="-DOPENSSL_NO_SSL3${PYTHON_CFLAGS:+ $PYTHON_CFLAGS}" install_package "openssl-1.1.1n" "https://www.openssl.org/source/openssl-1.1.1n.tar.gz#40dceb51a4f6a5275bde0e6bf20ef4b91bfc32ed57c0552e2e8e15463372b17a" mac_openssl --if has_broken_mac_openssl install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.8.13" "https://www.python.org/ftp/python/3.8.13/Python-3.8.13.tar.xz#6f309077012040aa39fe8f0c61db8c0fa1c45136763299d375c9e5756f09cf57" standard verify_py38 copy_python_gdb ensurepip else install_package "Python-3.8.13" "https://www.python.org/ftp/python/3.8.13/Python-3.8.13.tgz#903b92d76354366b1d9c4434d0c81643345cef87c1600adfa36095d7b00eede4" standard verify_py38 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.8.14000066400000000000000000000020761517431316200245770ustar00rootroot00000000000000prefer_openssl11 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 # Avoid a compilation error when linking against OpenSSL built with SSLv3 support (fixed in 3.10.0) (#2181) export PYTHON_CFLAGS="-DOPENSSL_NO_SSL3${PYTHON_CFLAGS:+ $PYTHON_CFLAGS}" install_package "openssl-1.1.1n" "https://www.openssl.org/source/openssl-1.1.1n.tar.gz#40dceb51a4f6a5275bde0e6bf20ef4b91bfc32ed57c0552e2e8e15463372b17a" mac_openssl --if has_broken_mac_openssl install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.8.14" "https://www.python.org/ftp/python/3.8.14/Python-3.8.14.tar.xz#5d77e278271ba803e9909a41a4f3baca006181c93ada682a5e5fe8dc4a24c5f3" standard verify_py38 copy_python_gdb ensurepip else install_package "Python-3.8.14" "https://www.python.org/ftp/python/3.8.14/Python-3.8.14.tgz#41f959c480c59211feb55d5a28851a56c7e22d02ef91035606ebb21011723c31" standard verify_py38 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.8.15000066400000000000000000000020761517431316200246000ustar00rootroot00000000000000prefer_openssl11 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 # Avoid a compilation error when linking against OpenSSL built with SSLv3 support (fixed in 3.10.0) (#2181) export PYTHON_CFLAGS="-DOPENSSL_NO_SSL3${PYTHON_CFLAGS:+ $PYTHON_CFLAGS}" install_package "openssl-1.1.1q" "https://www.openssl.org/source/openssl-1.1.1q.tar.gz#d7939ce614029cdff0b6c20f0e2e5703158a489a72b2507b8bd51bf8c8fd10ca" mac_openssl --if has_broken_mac_openssl install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.8.15" "https://www.python.org/ftp/python/3.8.15/Python-3.8.15.tar.xz#5114fc7918a2a5e20eb5aac696b30c36f412c6ef24b13f5c9eb9e056982d9550" standard verify_py38 copy_python_gdb ensurepip else install_package "Python-3.8.15" "https://www.python.org/ftp/python/3.8.15/Python-3.8.15.tgz#924d46999df82aa2eaa1de5ca51d6800ffb56b4bf52486a28f40634e3362abc4" standard verify_py38 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.8.16000066400000000000000000000020761517431316200246010ustar00rootroot00000000000000prefer_openssl11 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 # Avoid a compilation error when linking against OpenSSL built with SSLv3 support (fixed in 3.10.0) (#2181) export PYTHON_CFLAGS="-DOPENSSL_NO_SSL3${PYTHON_CFLAGS:+ $PYTHON_CFLAGS}" install_package "openssl-1.1.1q" "https://www.openssl.org/source/openssl-1.1.1q.tar.gz#d7939ce614029cdff0b6c20f0e2e5703158a489a72b2507b8bd51bf8c8fd10ca" mac_openssl --if has_broken_mac_openssl install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.8.16" "https://www.python.org/ftp/python/3.8.16/Python-3.8.16.tar.xz#d85dbb3774132473d8081dcb158f34a10ccad7a90b96c7e50ea4bb61f5ce4562" standard verify_py38 copy_python_gdb ensurepip else install_package "Python-3.8.16" "https://www.python.org/ftp/python/3.8.16/Python-3.8.16.tgz#71ca9d935637ed2feb59e90a368361dc91eca472a90acb1d344a2e8178ccaf10" standard verify_py38 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.8.17000066400000000000000000000020761517431316200246020ustar00rootroot00000000000000prefer_openssl11 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 # Avoid a compilation error when linking against OpenSSL built with SSLv3 support (fixed in 3.10.0) (#2181) export PYTHON_CFLAGS="-DOPENSSL_NO_SSL3${PYTHON_CFLAGS:+ $PYTHON_CFLAGS}" install_package "openssl-1.1.1u" "https://www.openssl.org/source/openssl-1.1.1u.tar.gz#e2f8d84b523eecd06c7be7626830370300fbcc15386bf5142d72758f6963ebc6" mac_openssl --if has_broken_mac_openssl install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.8.17" "https://www.python.org/ftp/python/3.8.17/Python-3.8.17.tar.xz#2e54b0c68191f16552f6de2e97a2396540572a219f6bbb28591a137cecc490a9" standard verify_py38 copy_python_gdb ensurepip else install_package "Python-3.8.17" "https://www.python.org/ftp/python/3.8.17/Python-3.8.17.tgz#def428fa6cf61b66bcde72e3d9f7d07d33b2e4226f04f9d6fce8384c055113ae" standard verify_py38 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.8.18000066400000000000000000000020761517431316200246030ustar00rootroot00000000000000prefer_openssl11 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 # Avoid a compilation error when linking against OpenSSL built with SSLv3 support (fixed in 3.10.0) (#2181) export PYTHON_CFLAGS="-DOPENSSL_NO_SSL3${PYTHON_CFLAGS:+ $PYTHON_CFLAGS}" install_package "openssl-1.1.1u" "https://www.openssl.org/source/openssl-1.1.1u.tar.gz#e2f8d84b523eecd06c7be7626830370300fbcc15386bf5142d72758f6963ebc6" mac_openssl --if has_broken_mac_openssl install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.8.18" "https://www.python.org/ftp/python/3.8.18/Python-3.8.18.tar.xz#3ffb71cd349a326ba7b2fadc7e7df86ba577dd9c4917e52a8401adbda7405e3f" standard verify_py38 copy_python_gdb ensurepip else install_package "Python-3.8.18" "https://www.python.org/ftp/python/3.8.18/Python-3.8.18.tgz#7c5df68bab1be81a52dea0cc2e2705ea00553b67107a301188383d7b57320b16" standard verify_py38 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.8.19000066400000000000000000000020761517431316200246040ustar00rootroot00000000000000prefer_openssl11 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 # Avoid a compilation error when linking against OpenSSL built with SSLv3 support (fixed in 3.10.0) (#2181) export PYTHON_CFLAGS="-DOPENSSL_NO_SSL3${PYTHON_CFLAGS:+ $PYTHON_CFLAGS}" install_package "openssl-1.1.1u" "https://www.openssl.org/source/openssl-1.1.1u.tar.gz#e2f8d84b523eecd06c7be7626830370300fbcc15386bf5142d72758f6963ebc6" mac_openssl --if has_broken_mac_openssl install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.8.19" "https://www.python.org/ftp/python/3.8.19/Python-3.8.19.tar.xz#d2807ac69f69b84fd46a0b93bbd02a4fa48d3e70f4b2835ff0f72a2885040076" standard verify_py38 copy_python_gdb ensurepip else install_package "Python-3.8.19" "https://www.python.org/ftp/python/3.8.19/Python-3.8.19.tgz#c7fa55a36e5c7a19ec37d8f90f60a2197548908c9ac8b31e7c0dbffdd470eeac" standard verify_py38 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.8.2000066400000000000000000000016131517431316200245100ustar00rootroot00000000000000prefer_openssl11 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.8.2" "https://www.python.org/ftp/python/3.8.2/Python-3.8.2.tar.xz#2646e7dc233362f59714c6193017bb2d6f7b38d6ab4a0cb5fbac5c36c4d845df" standard verify_py38 copy_python_gdb ensurepip else install_package "Python-3.8.2" "https://www.python.org/ftp/python/3.8.2/Python-3.8.2.tgz#e634a7a74776c2b89516b2e013dda1728c89c8149b9863b8cea21946daf9d561" standard verify_py38 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.8.20000066400000000000000000000020761517431316200245740ustar00rootroot00000000000000prefer_openssl11 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 # Avoid a compilation error when linking against OpenSSL built with SSLv3 support (fixed in 3.10.0) (#2181) export PYTHON_CFLAGS="-DOPENSSL_NO_SSL3${PYTHON_CFLAGS:+ $PYTHON_CFLAGS}" install_package "openssl-1.1.1u" "https://www.openssl.org/source/openssl-1.1.1u.tar.gz#e2f8d84b523eecd06c7be7626830370300fbcc15386bf5142d72758f6963ebc6" mac_openssl --if has_broken_mac_openssl install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.8.20" "https://www.python.org/ftp/python/3.8.20/Python-3.8.20.tar.xz#6fb89a7124201c61125c0ab4cf7f6894df339a40c02833bfd28ab4d7691fafb4" standard verify_py38 copy_python_gdb ensurepip else install_package "Python-3.8.20" "https://www.python.org/ftp/python/3.8.20/Python-3.8.20.tgz#9f2d5962c2583e67ef75924cd56d0c1af78bf45ec57035cf8a2cc09f74f4bf78" standard verify_py38 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.8.3000066400000000000000000000016131517431316200245110ustar00rootroot00000000000000prefer_openssl11 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.8.3" "https://www.python.org/ftp/python/3.8.3/Python-3.8.3.tar.xz#dfab5ec723c218082fe3d5d7ae17ecbdebffa9a1aea4d64aa3a2ecdd2e795864" standard verify_py38 copy_python_gdb ensurepip else install_package "Python-3.8.3" "https://www.python.org/ftp/python/3.8.3/Python-3.8.3.tgz#6af6d4d2e010f9655518d0fc6738c7ff7069f10a4d2fbd55509e467f092a8b90" standard verify_py38 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.8.4000066400000000000000000000016011517431316200245070ustar00rootroot00000000000000prefer_openssl11 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-1.1.1k" "https://www.openssl.org/source/openssl-1.1.1k.tar.gz#892a0875b9872acd04a9fde79b1f943075d5ea162415de3047c327df33fbaee5" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.8.4" "https://www.python.org/ftp/python/3.8.4/Python-3.8.4.tar.xz#5f41968a95afe9bc12192d7e6861aab31e80a46c46fa59d3d837def6a4cd4d37" standard verify_py38 copy_python_gdb ensurepip else install_package "Python-3.8.4" "https://www.python.org/ftp/python/3.8.4/Python-3.8.4.tgz#32c4d9817ef11793da4d0d95b3191c4db81d2e45544614e8449255ca9ae3cc18" standard verify_py38 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.8.5000066400000000000000000000016011517431316200245100ustar00rootroot00000000000000prefer_openssl11 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-1.1.1k" "https://www.openssl.org/source/openssl-1.1.1k.tar.gz#892a0875b9872acd04a9fde79b1f943075d5ea162415de3047c327df33fbaee5" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.8.5" "https://www.python.org/ftp/python/3.8.5/Python-3.8.5.tar.xz#e3003ed57db17e617acb382b0cade29a248c6026b1bd8aad1f976e9af66a83b0" standard verify_py38 copy_python_gdb ensurepip else install_package "Python-3.8.5" "https://www.python.org/ftp/python/3.8.5/Python-3.8.5.tgz#015115023c382eb6ab83d512762fe3c5502fa0c6c52ffebc4831c4e1a06ffc49" standard verify_py38 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.8.6000066400000000000000000000016011517431316200245110ustar00rootroot00000000000000prefer_openssl11 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-1.1.1k" "https://www.openssl.org/source/openssl-1.1.1k.tar.gz#892a0875b9872acd04a9fde79b1f943075d5ea162415de3047c327df33fbaee5" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.8.6" "https://www.python.org/ftp/python/3.8.6/Python-3.8.6.tar.xz#a9e0b79d27aa056eb9cce8d63a427b5f9bab1465dee3f942dcfdb25a82f4ab8a" standard verify_py38 copy_python_gdb ensurepip else install_package "Python-3.8.6" "https://www.python.org/ftp/python/3.8.6/Python-3.8.6.tgz#313562ee9986dc369cd678011bdfd9800ef62fbf7b1496228a18f86b36428c21" standard verify_py38 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.8.7000066400000000000000000000016011517431316200245120ustar00rootroot00000000000000prefer_openssl11 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-1.1.1k" "https://www.openssl.org/source/openssl-1.1.1k.tar.gz#892a0875b9872acd04a9fde79b1f943075d5ea162415de3047c327df33fbaee5" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.8.7" "https://www.python.org/ftp/python/3.8.7/Python-3.8.7.tar.xz#ddcc1df16bb5b87aa42ec5d20a5b902f2d088caa269b28e01590f97a798ec50a" standard verify_py38 copy_python_gdb ensurepip else install_package "Python-3.8.7" "https://www.python.org/ftp/python/3.8.7/Python-3.8.7.tgz#20e5a04262f0af2eb9c19240d7ec368f385788bba2d8dfba7e74b20bab4d2bac" standard verify_py38 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.8.8000066400000000000000000000016131517431316200245160ustar00rootroot00000000000000prefer_openssl11 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-1.1.1i" "https://www.openssl.org/source/old/1.1.1/openssl-1.1.1i.tar.gz#e8be6a35fe41d10603c3cc635e93289ed00bf34b79671a3a4de64fcee00d5242" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.8.8" "https://www.python.org/ftp/python/3.8.8/Python-3.8.8.tar.xz#7c664249ff77e443d6ea0e4cf0e587eae918ca3c48d081d1915fe2a1f1bcc5cc" standard verify_py38 copy_python_gdb ensurepip else install_package "Python-3.8.8" "https://www.python.org/ftp/python/3.8.8/Python-3.8.8.tgz#76c0763f048e4f9b861d24da76b7dd5c7a3ba7ec086f40caedeea359263276f7" standard verify_py38 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.8.9000066400000000000000000000016011517431316200245140ustar00rootroot00000000000000prefer_openssl11 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-1.1.1k" "https://www.openssl.org/source/openssl-1.1.1k.tar.gz#892a0875b9872acd04a9fde79b1f943075d5ea162415de3047c327df33fbaee5" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.8.9" "https://www.python.org/ftp/python/3.8.9/Python-3.8.9.tar.xz#5e391f3ec45da2954419cab0beaefd8be38895ea5ce33577c3ec14940c4b9572" standard verify_py38 copy_python_gdb ensurepip else install_package "Python-3.8.9" "https://www.python.org/ftp/python/3.8.9/Python-3.8.9.tgz#9779ec1df000bf86914cdd40860b88da56c1e61db59d37784beca14a259ac9e9" standard verify_py38 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.9-dev000066400000000000000000000010651517431316200251260ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-1.1.1k" "https://www.openssl.org/source/openssl-1.1.1k.tar.gz#892a0875b9872acd04a9fde79b1f943075d5ea162415de3047c327df33fbaee5" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline install_git "Python-3.9-dev" "https://github.com/python/cpython" 3.9 standard verify_py39 copy_python_gdb ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.9.0000066400000000000000000000016051517431316200245100ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-1.1.1k" "https://www.openssl.org/source/openssl-1.1.1k.tar.gz#892a0875b9872acd04a9fde79b1f943075d5ea162415de3047c327df33fbaee5" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.9.0" "https://www.python.org/ftp/python/3.9.0/Python-3.9.0.tar.xz#9c73e63c99855709b9be0b3cc9e5b072cb60f37311e8c4e50f15576a0bf82854" standard verify_py39 copy_python_gdb ensurepip else install_package "Python-3.9.0" "https://www.python.org/ftp/python/3.9.0/Python-3.9.0.tgz#df796b2dc8ef085edae2597a41c1c0a63625ebd92487adaef2fed22b567873e8" standard verify_py39 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.9.1000066400000000000000000000016051517431316200245110ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-1.1.1k" "https://www.openssl.org/source/openssl-1.1.1k.tar.gz#892a0875b9872acd04a9fde79b1f943075d5ea162415de3047c327df33fbaee5" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.9.1" "https://www.python.org/ftp/python/3.9.1/Python-3.9.1.tar.xz#991c3f8ac97992f3d308fefeb03a64db462574eadbff34ce8bc5bb583d9903ff" standard verify_py39 copy_python_gdb ensurepip else install_package "Python-3.9.1" "https://www.python.org/ftp/python/3.9.1/Python-3.9.1.tgz#29cb91ba038346da0bd9ab84a0a55a845d872c341a4da6879f462e94c741f117" standard verify_py39 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.9.10000066400000000000000000000020751517431316200245730ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 # Avoid a compilation error when linking against OpenSSL built with SSLv3 support (fixed in 3.10.0) (#2181) export PYTHON_CFLAGS="-DOPENSSL_NO_SSL3${PYTHON_CFLAGS:+ $PYTHON_CFLAGS}" install_package "openssl-1.1.1l" "https://www.openssl.org/source/openssl-1.1.1l.tar.gz#0b7a3e5e59c34827fe0c3a74b7ec8baef302b98fa80088d7f9153aa16fa76bd1" mac_openssl --if has_broken_mac_openssl install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.9.10" "https://www.python.org/ftp/python/3.9.10/Python-3.9.10.tar.xz#0a8fbfb5287ebc3a13e9baf3d54e08fa06778ffeccf6311aef821bb3a6586cc8" standard verify_py39 copy_python_gdb ensurepip else install_package "Python-3.9.10" "https://www.python.org/ftp/python/3.9.10/Python-3.9.10.tgz#1aa9c0702edbae8f6a2c95f70a49da8420aaa76b7889d3419c186bfc8c0e571e" standard verify_py39 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.9.11000066400000000000000000000020751517431316200245740ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 # Avoid a compilation error when linking against OpenSSL built with SSLv3 support (fixed in 3.10.0) (#2181) export PYTHON_CFLAGS="-DOPENSSL_NO_SSL3${PYTHON_CFLAGS:+ $PYTHON_CFLAGS}" install_package "openssl-1.1.1n" "https://www.openssl.org/source/openssl-1.1.1n.tar.gz#40dceb51a4f6a5275bde0e6bf20ef4b91bfc32ed57c0552e2e8e15463372b17a" mac_openssl --if has_broken_mac_openssl install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.9.11" "https://www.python.org/ftp/python/3.9.11/Python-3.9.11.tar.xz#66767a35309d724f370df9e503c172b4ee444f49d62b98bc4eca725123e26c49" standard verify_py39 copy_python_gdb ensurepip else install_package "Python-3.9.11" "https://www.python.org/ftp/python/3.9.11/Python-3.9.11.tgz#3442400072f582ac2f0df30895558f08883b416c8c7877ea55d40d00d8a93112" standard verify_py39 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.9.12000066400000000000000000000020751517431316200245750ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 # Avoid a compilation error when linking against OpenSSL built with SSLv3 support (fixed in 3.10.0) (#2181) export PYTHON_CFLAGS="-DOPENSSL_NO_SSL3${PYTHON_CFLAGS:+ $PYTHON_CFLAGS}" install_package "openssl-1.1.1n" "https://www.openssl.org/source/openssl-1.1.1n.tar.gz#40dceb51a4f6a5275bde0e6bf20ef4b91bfc32ed57c0552e2e8e15463372b17a" mac_openssl --if has_broken_mac_openssl install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.9.12" "https://www.python.org/ftp/python/3.9.12/Python-3.9.12.tar.xz#2cd94b20670e4159c6d9ab57f91dbf255b97d8c1a1451d1c35f4ec1968adf971" standard verify_py39 copy_python_gdb ensurepip else install_package "Python-3.9.12" "https://www.python.org/ftp/python/3.9.12/Python-3.9.12.tgz#70e08462ebf265012bd2be88a63d2149d880c73e53f1712b7bbbe93750560ae8" standard verify_py39 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.9.13000066400000000000000000000020751517431316200245760ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 # Avoid a compilation error when linking against OpenSSL built with SSLv3 support (fixed in 3.10.0) (#2181) export PYTHON_CFLAGS="-DOPENSSL_NO_SSL3${PYTHON_CFLAGS:+ $PYTHON_CFLAGS}" install_package "openssl-1.1.1n" "https://www.openssl.org/source/openssl-1.1.1n.tar.gz#40dceb51a4f6a5275bde0e6bf20ef4b91bfc32ed57c0552e2e8e15463372b17a" mac_openssl --if has_broken_mac_openssl install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.9.13" "https://www.python.org/ftp/python/3.9.13/Python-3.9.13.tar.xz#125b0c598f1e15d2aa65406e83f792df7d171cdf38c16803b149994316a3080f" standard verify_py39 copy_python_gdb ensurepip else install_package "Python-3.9.13" "https://www.python.org/ftp/python/3.9.13/Python-3.9.13.tgz#829b0d26072a44689a6b0810f5b4a3933ee2a0b8a4bfc99d7c5893ffd4f97c44" standard verify_py39 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.9.14000066400000000000000000000020751517431316200245770ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 # Avoid a compilation error when linking against OpenSSL built with SSLv3 support (fixed in 3.10.0) (#2181) export PYTHON_CFLAGS="-DOPENSSL_NO_SSL3${PYTHON_CFLAGS:+ $PYTHON_CFLAGS}" install_package "openssl-1.1.1n" "https://www.openssl.org/source/openssl-1.1.1n.tar.gz#40dceb51a4f6a5275bde0e6bf20ef4b91bfc32ed57c0552e2e8e15463372b17a" mac_openssl --if has_broken_mac_openssl install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.9.14" "https://www.python.org/ftp/python/3.9.14/Python-3.9.14.tar.xz#651304d216c8203fe0adf1a80af472d8e92c3b0e0a7892222ae4d9f3ae4debcf" standard verify_py39 copy_python_gdb ensurepip else install_package "Python-3.9.14" "https://www.python.org/ftp/python/3.9.14/Python-3.9.14.tgz#9201836e2c16361b2b7408680502393737d44f227333fe2e5729c7d5f6041675" standard verify_py39 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.9.15000066400000000000000000000020751517431316200246000ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 # Avoid a compilation error when linking against OpenSSL built with SSLv3 support (fixed in 3.10.0) (#2181) export PYTHON_CFLAGS="-DOPENSSL_NO_SSL3${PYTHON_CFLAGS:+ $PYTHON_CFLAGS}" install_package "openssl-1.1.1q" "https://www.openssl.org/source/openssl-1.1.1q.tar.gz#d7939ce614029cdff0b6c20f0e2e5703158a489a72b2507b8bd51bf8c8fd10ca" mac_openssl --if has_broken_mac_openssl install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.9.15" "https://www.python.org/ftp/python/3.9.15/Python-3.9.15.tar.xz#12daff6809528d9f6154216950423c9e30f0e47336cb57c6aa0b4387dd5eb4b2" standard verify_py39 copy_python_gdb ensurepip else install_package "Python-3.9.15" "https://www.python.org/ftp/python/3.9.15/Python-3.9.15.tgz#48d1ccb29d5fbaf1fb8f912271d09f7450e426d4dfe95978ef6aaada70ece4d8" standard verify_py39 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.9.16000066400000000000000000000020751517431316200246010ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 # Avoid a compilation error when linking against OpenSSL built with SSLv3 support (fixed in 3.10.0) (#2181) export PYTHON_CFLAGS="-DOPENSSL_NO_SSL3${PYTHON_CFLAGS:+ $PYTHON_CFLAGS}" install_package "openssl-1.1.1q" "https://www.openssl.org/source/openssl-1.1.1q.tar.gz#d7939ce614029cdff0b6c20f0e2e5703158a489a72b2507b8bd51bf8c8fd10ca" mac_openssl --if has_broken_mac_openssl install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.9.16" "https://www.python.org/ftp/python/3.9.16/Python-3.9.16.tar.xz#22dddc099246dd2760665561e8adb7394ea0cc43a72684c6480f9380f7786439" standard verify_py39 copy_python_gdb ensurepip else install_package "Python-3.9.16" "https://www.python.org/ftp/python/3.9.16/Python-3.9.16.tgz#1ad539e9dbd2b42df714b69726e0693bc6b9d2d2c8e91c2e43204026605140c5" standard verify_py39 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.9.17000066400000000000000000000020751517431316200246020ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 # Avoid a compilation error when linking against OpenSSL built with SSLv3 support (fixed in 3.10.0) (#2181) export PYTHON_CFLAGS="-DOPENSSL_NO_SSL3${PYTHON_CFLAGS:+ $PYTHON_CFLAGS}" install_package "openssl-1.1.1u" "https://www.openssl.org/source/openssl-1.1.1u.tar.gz#e2f8d84b523eecd06c7be7626830370300fbcc15386bf5142d72758f6963ebc6" mac_openssl --if has_broken_mac_openssl install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.9.17" "https://www.python.org/ftp/python/3.9.17/Python-3.9.17.tar.xz#30ce057c44f283f8ed93606ccbdb8d51dd526bdc4c62cce5e0dc217bfa3e8cee" standard verify_py39 copy_python_gdb ensurepip else install_package "Python-3.9.17" "https://www.python.org/ftp/python/3.9.17/Python-3.9.17.tgz#8ead58f669f7e19d777c3556b62fae29a81d7f06a7122ff9bc57f7dd82d7e014" standard verify_py39 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.9.18000066400000000000000000000020751517431316200246030ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 # Avoid a compilation error when linking against OpenSSL built with SSLv3 support (fixed in 3.10.0) (#2181) export PYTHON_CFLAGS="-DOPENSSL_NO_SSL3${PYTHON_CFLAGS:+ $PYTHON_CFLAGS}" install_package "openssl-1.1.1u" "https://www.openssl.org/source/openssl-1.1.1u.tar.gz#e2f8d84b523eecd06c7be7626830370300fbcc15386bf5142d72758f6963ebc6" mac_openssl --if has_broken_mac_openssl install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.9.18" "https://www.python.org/ftp/python/3.9.18/Python-3.9.18.tar.xz#01597db0132c1cf7b331eff68ae09b5a235a3c3caa9c944c29cac7d1c4c4c00a" standard verify_py39 copy_python_gdb ensurepip else install_package "Python-3.9.18" "https://www.python.org/ftp/python/3.9.18/Python-3.9.18.tgz#504ce8cfd59addc04c22f590377c6be454ae7406cb1ebf6f5a350149225a9354" standard verify_py39 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.9.19000066400000000000000000000020751517431316200246040ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 # Avoid a compilation error when linking against OpenSSL built with SSLv3 support (fixed in 3.10.0) (#2181) export PYTHON_CFLAGS="-DOPENSSL_NO_SSL3${PYTHON_CFLAGS:+ $PYTHON_CFLAGS}" install_package "openssl-1.1.1u" "https://www.openssl.org/source/openssl-1.1.1u.tar.gz#e2f8d84b523eecd06c7be7626830370300fbcc15386bf5142d72758f6963ebc6" mac_openssl --if has_broken_mac_openssl install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.9.19" "https://www.python.org/ftp/python/3.9.19/Python-3.9.19.tar.xz#d4892cd1618f6458cb851208c030df1482779609d0f3939991bd38184f8c679e" standard verify_py39 copy_python_gdb ensurepip else install_package "Python-3.9.19" "https://www.python.org/ftp/python/3.9.19/Python-3.9.19.tgz#f5f9ec8088abca9e399c3b62fd8ef31dbd2e1472c0ccb35070d4d136821aaf71" standard verify_py39 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.9.2000066400000000000000000000016171517431316200245150ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-1.1.1i" "https://www.openssl.org/source/old/1.1.1/openssl-1.1.1i.tar.gz#e8be6a35fe41d10603c3cc635e93289ed00bf34b79671a3a4de64fcee00d5242" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.9.2" "https://www.python.org/ftp/python/3.9.2/Python-3.9.2.tar.xz#3c2034c54f811448f516668dce09d24008a0716c3a794dd8639b5388cbde247d" standard verify_py39 copy_python_gdb ensurepip else install_package "Python-3.9.2" "https://www.python.org/ftp/python/3.9.2/Python-3.9.2.tgz#7899e8a6f7946748830d66739f2d8f2b30214dad956e56b9ba216b3de5581519" standard verify_py39 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.9.20000066400000000000000000000020751517431316200245740ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 # Avoid a compilation error when linking against OpenSSL built with SSLv3 support (fixed in 3.10.0) (#2181) export PYTHON_CFLAGS="-DOPENSSL_NO_SSL3${PYTHON_CFLAGS:+ $PYTHON_CFLAGS}" install_package "openssl-1.1.1u" "https://www.openssl.org/source/openssl-1.1.1u.tar.gz#e2f8d84b523eecd06c7be7626830370300fbcc15386bf5142d72758f6963ebc6" mac_openssl --if has_broken_mac_openssl install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.9.20" "https://www.python.org/ftp/python/3.9.20/Python-3.9.20.tar.xz#6b281279efd85294d2d6993e173983a57464c0133956fbbb5536ec9646beaf0c" standard verify_py39 copy_python_gdb ensurepip else install_package "Python-3.9.20" "https://www.python.org/ftp/python/3.9.20/Python-3.9.20.tgz#1e71f006222666e0a39f5a47be8221415c22c4dd8f25334cc41aee260b3d379e" standard verify_py39 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.9.21000066400000000000000000000020751517431316200245750ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 # Avoid a compilation error when linking against OpenSSL built with SSLv3 support (fixed in 3.10.0) (#2181) export PYTHON_CFLAGS="-DOPENSSL_NO_SSL3${PYTHON_CFLAGS:+ $PYTHON_CFLAGS}" install_package "openssl-1.1.1u" "https://www.openssl.org/source/openssl-1.1.1u.tar.gz#e2f8d84b523eecd06c7be7626830370300fbcc15386bf5142d72758f6963ebc6" mac_openssl --if has_broken_mac_openssl install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.9.21" "https://www.python.org/ftp/python/3.9.21/Python-3.9.21.tar.xz#3126f59592c9b0d798584755f2bf7b081fa1ca35ce7a6fea980108d752a05bb1" standard verify_py39 copy_python_gdb ensurepip else install_package "Python-3.9.21" "https://www.python.org/ftp/python/3.9.21/Python-3.9.21.tgz#667c3ba2ca98d39ead1162f6548c3475768582e2ff89e0821d25eb956ac09944" standard verify_py39 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.9.22000066400000000000000000000021421517431316200245710ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 # Avoid a compilation error when linking against OpenSSL built with SSLv3 support (fixed in 3.10.0) (#2181) export PYTHON_CFLAGS="-DOPENSSL_NO_SSL3${PYTHON_CFLAGS:+ $PYTHON_CFLAGS}" install_package "openssl-3.0.16" "https://github.com/openssl/openssl/releases/download/openssl-3.0.16/openssl-3.0.16.tar.gz#57e03c50feab5d31b152af2b764f10379aecd8ee92f16c985983ce4a99f7ef86" mac_openssl --if has_broken_mac_openssl install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.9.22" "https://www.python.org/ftp/python/3.9.22/Python-3.9.22.tar.xz#8c136d199d3637a1fce98a16adc809c1d83c922d02d41f3614b34f8b6e7d38ec" standard verify_py39 copy_python_gdb ensurepip else install_package "Python-3.9.22" "https://www.python.org/ftp/python/3.9.22/Python-3.9.22.tgz#76f4daef4ffce6fd107280a0db8d108b1f896c1c22f09d8300efd90a69c4298b" standard verify_py39 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.9.23000066400000000000000000000021421517431316200245720ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 # Avoid a compilation error when linking against OpenSSL built with SSLv3 support (fixed in 3.10.0) (#2181) export PYTHON_CFLAGS="-DOPENSSL_NO_SSL3${PYTHON_CFLAGS:+ $PYTHON_CFLAGS}" install_package "openssl-3.0.16" "https://github.com/openssl/openssl/releases/download/openssl-3.0.16/openssl-3.0.16.tar.gz#57e03c50feab5d31b152af2b764f10379aecd8ee92f16c985983ce4a99f7ef86" mac_openssl --if has_broken_mac_openssl install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.9.23" "https://www.python.org/ftp/python/3.9.23/Python-3.9.23.tar.xz#61a42919e13d539f7673cf11d1c404380e28e540510860b9d242196e165709c9" standard verify_py39 copy_python_gdb ensurepip else install_package "Python-3.9.23" "https://www.python.org/ftp/python/3.9.23/Python-3.9.23.tgz#9a69aad184dc1d06f6819930741da3a328d34875a41f8ba33875774dbfc51b51" standard verify_py39 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.9.24000066400000000000000000000021421517431316200245730ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 # Avoid a compilation error when linking against OpenSSL built with SSLv3 support (fixed in 3.10.0) (#2181) export PYTHON_CFLAGS="-DOPENSSL_NO_SSL3${PYTHON_CFLAGS:+ $PYTHON_CFLAGS}" install_package "openssl-3.0.16" "https://github.com/openssl/openssl/releases/download/openssl-3.0.16/openssl-3.0.16.tar.gz#57e03c50feab5d31b152af2b764f10379aecd8ee92f16c985983ce4a99f7ef86" mac_openssl --if has_broken_mac_openssl install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.9.24" "https://www.python.org/ftp/python/3.9.24/Python-3.9.24.tar.xz#668391afabd5083faafa4543753d190f82f33ce6ba22d6e9ac728b43644b278a" standard verify_py39 copy_python_gdb ensurepip else install_package "Python-3.9.24" "https://www.python.org/ftp/python/3.9.24/Python-3.9.24.tgz#9a32cfc683aecaadbd9ed891ac2af9451ff37f48a00a2d8e1f4ecd9c2a1ffdcb" standard verify_py39 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.9.25000066400000000000000000000021421517431316200245740ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 # Avoid a compilation error when linking against OpenSSL built with SSLv3 support (fixed in 3.10.0) (#2181) export PYTHON_CFLAGS="-DOPENSSL_NO_SSL3${PYTHON_CFLAGS:+ $PYTHON_CFLAGS}" install_package "openssl-3.0.16" "https://github.com/openssl/openssl/releases/download/openssl-3.0.16/openssl-3.0.16.tar.gz#57e03c50feab5d31b152af2b764f10379aecd8ee92f16c985983ce4a99f7ef86" mac_openssl --if has_broken_mac_openssl install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.9.25" "https://www.python.org/ftp/python/3.9.25/Python-3.9.25.tar.xz#00e07d7c0f2f0cc002432d1ee84d2a40dae404a99303e3f97701c10966c91834" standard verify_py39 copy_python_gdb ensurepip else install_package "Python-3.9.25" "https://www.python.org/ftp/python/3.9.25/Python-3.9.25.tgz#a7438eabd3a48139f42d4e058096af8d880b0bb6e8fb8c78838892e4ce5583f2" standard verify_py39 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.9.4000066400000000000000000000016041517431316200245130ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-1.1.1k" "https://www.openssl.org/source/openssl-1.1.1k.tar.gz#892a0875b9872acd04a9fde79b1f943075d5ea162415de3047c327df33fbaee5" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.9.4" "https://www.python.org/ftp/python/3.9.4/Python-3.9.4.tar.xz#4b0e6644a76f8df864ae24ac500a51bbf68bd098f6a173e27d3b61cdca9aa134" standard verify_py39 copy_python_gdb ensurepip else install_package "Python-3.9.4" "https://www.python.org/ftp/python/3.9.4/Python-3.9.4.tgz#66c4de16daa74a825cf9da9ddae1fe020b72c3854b73b1762011cc33f9e4592f" standard verify_py39 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.9.5000066400000000000000000000020731517431316200245150ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 # Avoid a compilation error when linking against OpenSSL built with SSLv3 support (fixed in 3.10.0) (#2181) export PYTHON_CFLAGS="-DOPENSSL_NO_SSL3${PYTHON_CFLAGS:+ $PYTHON_CFLAGS}" install_package "openssl-1.1.1k" "https://www.openssl.org/source/openssl-1.1.1k.tar.gz#892a0875b9872acd04a9fde79b1f943075d5ea162415de3047c327df33fbaee5" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.9.5" "https://www.python.org/ftp/python/3.9.5/Python-3.9.5.tar.xz#0c5a140665436ec3dbfbb79e2dfb6d192655f26ef4a29aeffcb6d1820d716d83" standard verify_py39 copy_python_gdb ensurepip else install_package "Python-3.9.5" "https://www.python.org/ftp/python/3.9.5/Python-3.9.5.tgz#e0fbd5b6e1ee242524430dee3c91baf4cbbaba4a72dd1674b90fda87b713c7ab" standard verify_py39 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.9.6000066400000000000000000000020671517431316200245210ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 # Avoid a compilation error when linking against OpenSSL built with SSLv3 support (fixed in 3.10.0) (#2181) export PYTHON_CFLAGS="-DOPENSSL_NO_SSL3${PYTHON_CFLAGS:+ $PYTHON_CFLAGS}" install_package "openssl-1.1.1k" "https://www.openssl.org/source/openssl-1.1.1k.tar.gz#892a0875b9872acd04a9fde79b1f943075d5ea162415de3047c327df33fbaee5" mac_openssl --if has_broken_mac_openssl install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.9.6" "https://www.python.org/ftp/python/3.9.6/Python-3.9.6.tar.xz#397920af33efc5b97f2e0b57e91923512ef89fc5b3c1d21dbfc8c4828ce0108a" standard verify_py39 copy_python_gdb ensurepip else install_package "Python-3.9.6" "https://www.python.org/ftp/python/3.9.6/Python-3.9.6.tgz#d0a35182e19e416fc8eae25a3dcd4d02d4997333e4ad1f2eee6010aadc3fe866" standard verify_py39 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.9.7000066400000000000000000000020671517431316200245220ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 # Avoid a compilation error when linking against OpenSSL built with SSLv3 support (fixed in 3.10.0) (#2181) export PYTHON_CFLAGS="-DOPENSSL_NO_SSL3${PYTHON_CFLAGS:+ $PYTHON_CFLAGS}" install_package "openssl-1.1.1k" "https://www.openssl.org/source/openssl-1.1.1k.tar.gz#892a0875b9872acd04a9fde79b1f943075d5ea162415de3047c327df33fbaee5" mac_openssl --if has_broken_mac_openssl install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.9.7" "https://www.python.org/ftp/python/3.9.7/Python-3.9.7.tar.xz#f8145616e68c00041d1a6399b76387390388f8359581abc24432bb969b5e3c57" standard verify_py39 copy_python_gdb ensurepip else install_package "Python-3.9.7" "https://www.python.org/ftp/python/3.9.7/Python-3.9.7.tgz#a838d3f9360d157040142b715db34f0218e535333696a5569dc6f854604eb9d1" standard verify_py39 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.9.8000066400000000000000000000020671517431316200245230ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 # Avoid a compilation error when linking against OpenSSL built with SSLv3 support (fixed in 3.10.0) (#2181) export PYTHON_CFLAGS="-DOPENSSL_NO_SSL3${PYTHON_CFLAGS:+ $PYTHON_CFLAGS}" install_package "openssl-1.1.1l" "https://www.openssl.org/source/openssl-1.1.1l.tar.gz#0b7a3e5e59c34827fe0c3a74b7ec8baef302b98fa80088d7f9153aa16fa76bd1" mac_openssl --if has_broken_mac_openssl install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.9.8" "https://www.python.org/ftp/python/3.9.8/Python-3.9.8.tar.xz#675ce09bf23c09836bf1969b744b1ea4c1a18c32788626632525f08444ebad5c" standard verify_py39 copy_python_gdb ensurepip else install_package "Python-3.9.8" "https://www.python.org/ftp/python/3.9.8/Python-3.9.8.tgz#7447fb8bb270942d620dd24faa7814b1383b61fa99029a240025fd81c1db8283" standard verify_py39 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/3.9.9000066400000000000000000000020671517431316200245240ustar00rootroot00000000000000prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 # Avoid a compilation error when linking against OpenSSL built with SSLv3 support (fixed in 3.10.0) (#2181) export PYTHON_CFLAGS="-DOPENSSL_NO_SSL3${PYTHON_CFLAGS:+ $PYTHON_CFLAGS}" install_package "openssl-1.1.1l" "https://www.openssl.org/source/openssl-1.1.1l.tar.gz#0b7a3e5e59c34827fe0c3a74b7ec8baef302b98fa80088d7f9153aa16fa76bd1" mac_openssl --if has_broken_mac_openssl install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.9.9" "https://www.python.org/ftp/python/3.9.9/Python-3.9.9.tar.xz#06828c04a573c073a4e51c4292a27c1be4ae26621c3edc7cf9318418ce3b6d27" standard verify_py39 copy_python_gdb ensurepip else install_package "Python-3.9.9" "https://www.python.org/ftp/python/3.9.9/Python-3.9.9.tgz#2cc7b67c1f3f66c571acc42479cdf691d8ed6b47bee12c9b68430413a17a44ea" standard verify_py39 copy_python_gdb ensurepip fi pyenv-pyenv-485090e/plugins/python-build/share/python-build/activepython-2.7.14000066400000000000000000000012321517431316200273010ustar00rootroot00000000000000# Download source: http://downloads.activestate.com/ActivePython/releases/2.7.14.2717/ case "$(activepython_architecture 2>/dev/null || true)" in "linux-x86_64" ) install_package "ActivePython-2.7.14.2717-linux-x86_64-glibc-2.12-404899" "http://downloads.activestate.com/ActivePython/releases/2.7.14.2717/ActivePython-2.7.14.2717-linux-x86_64-glibc-2.12-404899.tar.gz#0b514b0edb6b847524d44637f56fdebcedb007864c61f8500e68bc2015dad937" "activepython" verify_py27 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Active Python is not available for $(activepython_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/activepython-3.5.4000066400000000000000000000012261517431316200272220ustar00rootroot00000000000000# Location source: http://downloads.activestate.com/ActivePython/releases/3.5.4.3504/ case "$(activepython_architecture 2>/dev/null || true)" in "linux-x86_64" ) install_package "ActivePython-3.5.4.3504-linux-x86_64-glibc-2.12-404899" "http://downloads.activestate.com/ActivePython/releases/3.5.4.3504/ActivePython-3.5.4.3504-linux-x86_64-glibc-2.12-404899.tar.gz#c65e7384bcff715399ef077aea5a17a9f60c3f5de3532a3767497af1d555f092" "activepython" verify_py35 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Active Python is not available for $(activepython_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/activepython-3.6.0000066400000000000000000000017201517431316200272160ustar00rootroot00000000000000# Download source: http://downloads.activestate.com/ActivePython/releases/3.6.0.3600/ case "$(activepython_architecture 2>/dev/null || true)" in "linux-x86_64" ) install_package "ActivePython-3.6.0.3600-linux-x86_64-glibc-2.3.6-401834" "http://downloads.activestate.com/ActivePython/releases/3.6.0.3600/ActivePython-3.6.0.3600-linux-x86_64-glibc-2.3.6-401834.tar.gz#edd17d3221d9744fe27d37842b325f55d0261e69073de3be54e29c1806fe57ae" "activepython" verify_py36 ;; "linux-x86" ) install_package "ActivePython-3.6.0.3600-linux-x86-glibc-2.3.6-401834" "http://downloads.activestate.com/ActivePython/releases/3.6.0.3600/ActivePython-3.6.0.3600-linux-x86-glibc-2.3.6-401834.tar.gz#fafa22ad3346532384866ad009da0c9f23323167dff9de5995f94e827a5eba32" "activepython" verify_py36 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Active Python is not available for $(activepython_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/anaconda-1.4.0000066400000000000000000000016151517431316200262440ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86" ) install_script "Anaconda-1.4.0-Linux-x86" "https://repo.continuum.io/archive/Anaconda-1.4.0-Linux-x86.sh#065284c5de369c9b89dcae79e7169ce9b734dc3bbe6c409a67a5ec6480cc0f40" "anaconda" verify_py27 ;; "Linux-x86_64" ) install_script "Anaconda-1.4.0-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda-1.4.0-Linux-x86_64.sh#85ae8a0a6e3a41cf7845be3def36ed40582d3dc6e6a50e99063eaf6f1abee24e" "anaconda" verify_py27 ;; "MacOSX-x86_64" ) install_script "Anaconda-1.4.0-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda-1.4.0-MacOSX-x86_64.sh#e5d5dae6e93bb7df528abc19f5ed3a69cc4bc867836bdc56886c5a3768fccde7" "anaconda" verify_py27 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Anaconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/anaconda-1.5.0000066400000000000000000000016151517431316200262450ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86" ) install_script "Anaconda-1.5.0-Linux-x86" "https://repo.continuum.io/archive/Anaconda-1.5.0-Linux-x86.sh#ca7e356dc1b8c8ef27dfb74b32c77563df704c6ddb39e69cac65ec416ebfe8e5" "anaconda" verify_py27 ;; "Linux-x86_64" ) install_script "Anaconda-1.5.0-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda-1.5.0-Linux-x86_64.sh#f4cdc194f076e1b438c8a34e7e5f53e70c2200b411b2d0af719e23fe35c6411e" "anaconda" verify_py27 ;; "MacOSX-x86_64" ) install_script "Anaconda-1.5.0-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda-1.5.0-MacOSX-x86_64.sh#c69609f0f48f33ca5a12d425a9e4d0fc91b2c09d0345a590e1d77726446727aa" "anaconda" verify_py27 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Anaconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/anaconda-1.5.1000066400000000000000000000007261517431316200262500ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "MacOSX-x86_64" ) install_script "Anaconda-1.5.1-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda-1.5.1-MacOSX-x86_64.sh#6d3c86a2fdbaeeec2a6c251d5c9034a32b7c68a0437f2fac0b8f25125fe6866f" "anaconda" verify_py27 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Anaconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/anaconda-1.6.0000066400000000000000000000016151517431316200262460ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86" ) install_script "Anaconda-1.6.0-Linux-x86" "https://repo.continuum.io/archive/Anaconda-1.6.0-Linux-x86.sh#d6aeedfcb39d648fdfb5bd72c4d0b3063a9d4f4866baf5052aa0645bf5d2c07a" "anaconda" verify_py27 ;; "Linux-x86_64" ) install_script "Anaconda-1.6.0-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda-1.6.0-Linux-x86_64.sh#20f5b70193af4b0b8f10aa0e66aabca552846ec8f4958757ff3f4b79ef7b3160" "anaconda" verify_py27 ;; "MacOSX-x86_64" ) install_script "Anaconda-1.6.0-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda-1.6.0-MacOSX-x86_64.sh#e03317888c36c07451a349577b426f435a75075d1ee71e204eb9d5dd23936f5e" "anaconda" verify_py27 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Anaconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/anaconda-1.6.1000066400000000000000000000016151517431316200262470ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86" ) install_script "Anaconda-1.6.1-Linux-x86" "https://repo.continuum.io/archive/Anaconda-1.6.1-Linux-x86.sh#745b9452fd18720deefb465a6687c0d66df8f11edceadcee758082dea1b8e812" "anaconda" verify_py27 ;; "Linux-x86_64" ) install_script "Anaconda-1.6.1-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda-1.6.1-Linux-x86_64.sh#81d1819ba08069343f228b9c819cdba0e4d15f2142c0c033657599808c3960fb" "anaconda" verify_py27 ;; "MacOSX-x86_64" ) install_script "Anaconda-1.6.1-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda-1.6.1-MacOSX-x86_64.sh#bbc15de34208ce8af5aceedeea1334636fe94c578b9890896729f1a61ace5e4f" "anaconda" verify_py27 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Anaconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/anaconda-1.7.0000066400000000000000000000016151517431316200262470ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86" ) install_script "Anaconda-1.7.0-Linux-x86" "https://repo.continuum.io/archive/Anaconda-1.7.0-Linux-x86.sh#af372a27a1887e11061485e2a854c535775fd519713e028c38901f90c869cd83" "anaconda" verify_py27 ;; "Linux-x86_64" ) install_script "Anaconda-1.7.0-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda-1.7.0-Linux-x86_64.sh#6115cfae55a0746b4ae4128be839c99db39d02124160d9c531ca086c4d606582" "anaconda" verify_py27 ;; "MacOSX-x86_64" ) install_script "Anaconda-1.7.0-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda-1.7.0-MacOSX-x86_64.sh#046b592245bc2c11e733acb9700dc50947f2eff0f30fec4a4a5bf79368dfa14b" "anaconda" verify_py27 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Anaconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/anaconda-1.8.0000066400000000000000000000016151517431316200262500ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86" ) install_script "Anaconda-1.8.0-Linux-x86" "https://repo.continuum.io/archive/Anaconda-1.8.0-Linux-x86.sh#2c08a5cd6ccaa9dc84063b0ee9b007aa82e35a75c340fb272b394896de853608" "anaconda" verify_py27 ;; "Linux-x86_64" ) install_script "Anaconda-1.8.0-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda-1.8.0-Linux-x86_64.sh#69f42966d918f4197040e4dd126d2e3cc3c267bb49869dbf2d6ef277ed5de8b7" "anaconda" verify_py27 ;; "MacOSX-x86_64" ) install_script "Anaconda-1.8.0-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda-1.8.0-MacOSX-x86_64.sh#5844ca595b5930399a1213db64ab53e9b7e2fc1c26d8f11769c161fe4f5661e6" "anaconda" verify_py27 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Anaconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/anaconda-1.9.0000066400000000000000000000016151517431316200262510ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86" ) install_script "Anaconda-1.9.0-Linux-x86" "https://repo.continuum.io/archive/Anaconda-1.9.0-Linux-x86.sh#16471e90b3deb7be1b3d449d8883983d81f035dfaa1a3391497de20577de6f66" "anaconda" verify_py27 ;; "Linux-x86_64" ) install_script "Anaconda-1.9.0-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda-1.9.0-Linux-x86_64.sh#855f1265e4c0b40d50f5a3a0fe7bae05b1cccb0a5301b378a19e0a8f7262913a" "anaconda" verify_py27 ;; "MacOSX-x86_64" ) install_script "Anaconda-1.9.0-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda-1.9.0-MacOSX-x86_64.sh#722fe4d4406e88c5023e7ee21dc1401bb2a540d6c031d303f0330a95e60131fd" "anaconda" verify_py27 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Anaconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/anaconda-1.9.1000066400000000000000000000016151517431316200262520ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86" ) install_script "Anaconda-1.9.1-Linux-x86" "https://repo.continuum.io/archive/Anaconda-1.9.1-Linux-x86.sh#9aa39c05f723fee18c54a9cc1729986193216affedbae125ca5faa067403030a" "anaconda" verify_py27 ;; "Linux-x86_64" ) install_script "Anaconda-1.9.1-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda-1.9.1-Linux-x86_64.sh#f6455e06a72b8cc11c8a96fb88a85518a2f7b2a1d6f1065f777d7ab4386f022d" "anaconda" verify_py27 ;; "MacOSX-x86_64" ) install_script "Anaconda-1.9.1-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda-1.9.1-MacOSX-x86_64.sh#7e4358adbaae2db9e17d1e0e4263b9a0174394c8f115c89d285c3f0f9206f75b" "anaconda" verify_py27 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Anaconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/anaconda-1.9.2000066400000000000000000000016151517431316200262530ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86" ) install_script "Anaconda-1.9.2-Linux-x86" "https://repo.continuum.io/archive/Anaconda-1.9.2-Linux-x86.sh#1f7c850d0b98c011a717b3b757d82077accf0704dd7627f6962267bfb4476aad" "anaconda" verify_py27 ;; "Linux-x86_64" ) install_script "Anaconda-1.9.2-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda-1.9.2-Linux-x86_64.sh#7181d399833a2549a9584255bb477487f2fde1fda4c7f7215d6034ea2fcfa21e" "anaconda" verify_py27 ;; "MacOSX-x86_64" ) install_script "Anaconda-1.9.2-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda-1.9.2-MacOSX-x86_64.sh#be4611ca671f80b984fa330d4ecf82244c388abbdb5c7679a4e6e806b4dca52f" "anaconda" verify_py27 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Anaconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/anaconda-2.0.0000066400000000000000000000016151517431316200262410ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86" ) install_script "Anaconda-2.0.0-Linux-x86" "https://repo.continuum.io/archive/Anaconda-2.0.0-Linux-x86.sh#efb9d3987134d484d88a9d915437b1bd568d065b4fefbd538e0281694bd90888" "anaconda" verify_py27 ;; "Linux-x86_64" ) install_script "Anaconda-2.0.0-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda-2.0.0-Linux-x86_64.sh#3aa27ddf4a0ba5046ba52b97da99e20eb0614273d905bd73e016852451908917" "anaconda" verify_py27 ;; "MacOSX-x86_64" ) install_script "Anaconda-2.0.0-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda-2.0.0-MacOSX-x86_64.sh#ad6271ad21403166bf54d0734ba8c7f7eb65bb78a70d67c58c15b6874cddc81e" "anaconda" verify_py27 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Anaconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/anaconda-2.0.1000066400000000000000000000016151517431316200262420ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86" ) install_script "Anaconda-2.0.1-Linux-x86" "https://repo.continuum.io/archive/Anaconda-2.0.1-Linux-x86.sh#e8ffc63f31673b5ce41a95796a1f729ddcf4c7db19d6dbe29bedaeaaf8478505" "anaconda" verify_py27 ;; "Linux-x86_64" ) install_script "Anaconda-2.0.1-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda-2.0.1-Linux-x86_64.sh#074204fa26872b4a946123071d15b8390c0e5441352c6b65b2abd32511bff240" "anaconda" verify_py27 ;; "MacOSX-x86_64" ) install_script "Anaconda-2.0.1-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda-2.0.1-MacOSX-x86_64.sh#4ecda163c6f46e70cc6a1fe62dece4c6ecd6474845129cc95a1d4e18c42f8015" "anaconda" verify_py27 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Anaconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/anaconda-2.1.0000066400000000000000000000016151517431316200262420ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86" ) install_script "Anaconda-2.1.0-Linux-x86" "https://repo.continuum.io/archive/Anaconda-2.1.0-Linux-x86.sh#fd70c08719e6b5caae45b7c8402c6975a8cbc0e3e2a9c4c977554d1784f28b72" "anaconda" verify_py27 ;; "Linux-x86_64" ) install_script "Anaconda-2.1.0-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda-2.1.0-Linux-x86_64.sh#191fbf290747614929d0bdd576e330c944b22a67585d1c185e0d2b3a3e65e1c0" "anaconda" verify_py27 ;; "MacOSX-x86_64" ) install_script "Anaconda-2.1.0-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda-2.1.0-MacOSX-x86_64.sh#128fd4f53e0895e0d23f33e924ae32e01171c2914b044d2b157a9497108109cf" "anaconda" verify_py27 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Anaconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/anaconda-2.2.0000066400000000000000000000016151517431316200262430ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86" ) install_script "Anaconda-2.2.0-Linux-x86" "https://repo.continuum.io/archive/Anaconda-2.2.0-Linux-x86.sh#6437d5b08a19c3501f2f5dc3ae1ae16f91adf6bed0f067ef0806a9911b1bef15" "anaconda" verify_py27 ;; "Linux-x86_64" ) install_script "Anaconda-2.2.0-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda-2.2.0-Linux-x86_64.sh#ca2582cb2188073b0f348ad42207211a2b85c10b244265b5b27bab04481b88a2" "anaconda" verify_py27 ;; "MacOSX-x86_64" ) install_script "Anaconda-2.2.0-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda-2.2.0-MacOSX-x86_64.sh#20570e2f3911e38a78d8f888f3ff445d6c0cf97a2fca40d6956b48d12aaef339" "anaconda" verify_py27 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Anaconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/anaconda-2.3.0000066400000000000000000000016151517431316200262440ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86" ) install_script "Anaconda-2.3.0-Linux-x86" "https://repo.continuum.io/archive/Anaconda-2.3.0-Linux-x86.sh#73fdbbb3e38207ed18e5059f71676d18d48fdccbc455a1272eb45a60376cd818" "anaconda" verify_py27 ;; "Linux-x86_64" ) install_script "Anaconda-2.3.0-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda-2.3.0-Linux-x86_64.sh#7c02499e9511c127d225992cfe1cd815e88fd46cd8a5b3cdf764f3fb4d8d4576" "anaconda" verify_py27 ;; "MacOSX-x86_64" ) install_script "Anaconda-2.3.0-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda-2.3.0-MacOSX-x86_64.sh#c4bb59a57bf44dde80612041bbbcfd2e5cab8534842209ef456da7a46f919c33" "anaconda" verify_py27 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Anaconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/anaconda-2.4.0000066400000000000000000000000531517431316200262400ustar00rootroot00000000000000source "${BASH_SOURCE%/*}/anaconda2-2.4.0" pyenv-pyenv-485090e/plugins/python-build/share/python-build/anaconda-4.0.0000066400000000000000000000000531517431316200262360ustar00rootroot00000000000000source "${BASH_SOURCE%/*}/anaconda2-4.0.0" pyenv-pyenv-485090e/plugins/python-build/share/python-build/anaconda2-2.4.0000066400000000000000000000016241517431316200263270ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86" ) install_script "Anaconda2-2.4.0-Linux-x86" "https://repo.continuum.io/archive/Anaconda2-2.4.0-Linux-x86.sh#478a8fdde3a6e4040a68c57d7bdd6fab1a4f7f6e813948d46dad54867014c124" "anaconda" verify_py27 ;; "Linux-x86_64" ) install_script "Anaconda2-2.4.0-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda2-2.4.0-Linux-x86_64.sh#49d19834da06b1b82b6fa85bc647d2e78fa5957d0cbae3ccd6c695a541befa6b" "anaconda" verify_py27 ;; "MacOSX-x86_64" ) install_script "Anaconda2-2.4.0-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda2-2.4.0-MacOSX-x86_64.sh#53c9123c9d508555100805fdb44d9845511c937e7a34f237beb19168d655e070" "anaconda" verify_py27 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Anaconda2 is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/anaconda2-2.4.1000066400000000000000000000016241517431316200263300ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86" ) install_script "Anaconda2-2.4.1-Linux-x86" "https://repo.continuum.io/archive/Anaconda2-2.4.1-Linux-x86.sh#2388cc714567afe7697bf43b4063ff0ea2150a71b9beb17f75bc7e4879d9bf28" "anaconda" verify_py27 ;; "Linux-x86_64" ) install_script "Anaconda2-2.4.1-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda2-2.4.1-Linux-x86_64.sh#2de682c96edf8cca2852071a84ff860025fbe8c502218e1995acd5ab47e8c9ac" "anaconda" verify_py27 ;; "MacOSX-x86_64" ) install_script "Anaconda2-2.4.1-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda2-2.4.1-MacOSX-x86_64.sh#f4bd45a21e0dff106e36d11cfd532f2b5050d3b792cc0627ab231089341d2040" "anaconda" verify_py27 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Anaconda2 is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/anaconda2-2.5.0000066400000000000000000000016241517431316200263300ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86" ) install_script "Anaconda2-2.5.0-Linux-x86" "https://repo.continuum.io/archive/Anaconda2-2.5.0-Linux-x86.sh#4911047df51c46661f551d6022aee21a7e5d31df051d3433b8ff3ea3c2e771bb" "anaconda" verify_py27 ;; "Linux-x86_64" ) install_script "Anaconda2-2.5.0-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda2-2.5.0-Linux-x86_64.sh#e10abf459cde4a838bd6fc5ca03023c3401b81ad470627acde5a298d56715321" "anaconda" verify_py27 ;; "MacOSX-x86_64" ) install_script "Anaconda2-2.5.0-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda2-2.5.0-MacOSX-x86_64.sh#e7aa3b41210ee7ccf3c12e5b5ea43190d1811b58eaeca8584ccffa468ac8a346" "anaconda" verify_py27 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Anaconda2 is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/anaconda2-2018.12000066400000000000000000000016511517431316200265010ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86" ) install_script "Anaconda2-2018.12-Linux-x86.sh" "https://repo.anaconda.com/archive/Anaconda2-2018.12-Linux-x86.sh#e086c041695c0e50642aee8f4e7adad3185c6ce1d11737665653497d2edd78fd" "anaconda" verify_py27 ;; "Linux-x86_64" ) install_script "Anaconda2-2018.12-Linux-x86_64.sh" "https://repo.anaconda.com/archive/Anaconda2-2018.12-Linux-x86_64.sh#1821d4b623ed449e0acb6df3ecbabd3944cffa98f96a5234b7a102a7c0853dc6" "anaconda" verify_py27 ;; "MacOSX-x86_64" ) install_script "Anaconda2-2018.12-MacOSX-x86_64.sh" "https://repo.anaconda.com/archive/Anaconda2-2018.12-MacOSX-x86_64.sh#5c590b1b3cdc2eedd52edce0caabbce6665d84084d31b913e789e8c46a94859d" "anaconda" verify_py27 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Anaconda2 is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/anaconda2-2019.03000066400000000000000000000016541517431316200265050ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-ppc64le" ) install_script "Anaconda2-2019.03-Linux-ppc64le" "https://repo.continuum.io/archive/Anaconda2-2019.03-Linux-ppc64le.sh#3ab35c11b50ff26965266655d7dc76cf229336ee11b8b0c364ec1ba596ba9e07" "anaconda" verify_py27 ;; "Linux-x86_64" ) install_script "Anaconda2-2019.03-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda2-2019.03-Linux-x86_64.sh#cedfee5b5a3f62fcdac0a1d2d12396d0f232d2213d24d6dc893df5d8e64b8773" "anaconda" verify_py27 ;; "MacOSX-x86_64" ) install_script "Anaconda2-2019.03-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda2-2019.03-MacOSX-x86_64.sh#414917d00deaeefa38719992e6437470f54793718ef4bedcd66b0e5a30dbe4b6" "anaconda" verify_py27 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Anaconda2 is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/anaconda2-2019.07000066400000000000000000000016541517431316200265110ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-ppc64le" ) install_script "Anaconda2-2019.07-Linux-ppc64le" "https://repo.continuum.io/archive/Anaconda2-2019.07-Linux-ppc64le.sh#ee7f61dab233cdd0acb376ad55e977b16fdc03602f87a98dafb10d5fe9f5a190" "anaconda" verify_py27 ;; "Linux-x86_64" ) install_script "Anaconda2-2019.07-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda2-2019.07-Linux-x86_64.sh#189e16e7adf9ba4b7b7d06ecdc10ce4ad4153e5e3505b9331f3d142243e18e97" "anaconda" verify_py27 ;; "MacOSX-x86_64" ) install_script "Anaconda2-2019.07-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda2-2019.07-MacOSX-x86_64.sh#3e63919eed116826e683ed7d480d06517de79564788fbc27cb8d8879697eb654" "anaconda" verify_py27 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Anaconda3 is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/anaconda2-2019.10000066400000000000000000000015131517431316200264750ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-ppc64le" ) install_script "Anaconda2-2019.10-Linux-ppc64le" "https://repo.anaconda.com/archive/Anaconda2-2019.10-Linux-ppc64le.sh#6b9809bf5d36782bfa1e35b791d983a0" "anaconda" verify_py27 ;; "Linux-x86_64" ) install_script "Anaconda2-2019.10-Linux-x86_64" "https://repo.anaconda.com/archive/Anaconda2-2019.10-Linux-x86_64.sh#69c64167b8cf3a8fc6b50d12d8476337" "anaconda" verify_py27 ;; "MacOSX-x86_64" ) install_script "Anaconda2-2019.10-MacOSX-x86_64" "https://repo.anaconda.com/archive/Anaconda2-2019.10-MacOSX-x86_64.sh#311aeb49cbe6d296f499efcd01a73f5e" "anaconda" verify_py27 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Anaconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/anaconda2-4.0.0000066400000000000000000000016241517431316200263250ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86" ) install_script "Anaconda2-4.0.0-Linux-x86" "https://repo.continuum.io/archive/Anaconda2-4.0.0-Linux-x86.sh#41341c840cea4185ef5bd82520c1de72b42e7dc43c703fb13b032f04dc0e3573" "anaconda" verify_py27 ;; "Linux-x86_64" ) install_script "Anaconda2-4.0.0-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda2-4.0.0-Linux-x86_64.sh#ae312143952ca00e061a656c2080e0e4fd3532721282ba8e2978177cad71a5f0" "anaconda" verify_py27 ;; "MacOSX-x86_64" ) install_script "Anaconda2-4.0.0-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda2-4.0.0-MacOSX-x86_64.sh#aa7ba6e1a40e08e672660c00c3151f0124faa61b598d75bdd07ebe1d24873ef6" "anaconda" verify_py27 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Anaconda2 is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/anaconda2-4.1.0000066400000000000000000000016241517431316200263260ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86" ) install_script "Anaconda2-4.1.0-Linux-x86" "https://repo.continuum.io/archive/Anaconda2-4.1.0-Linux-x86.sh#54c06cd1b11cb687db6ba3613df443c057f769cdb87693e11674d956d8e5d081" "anaconda" verify_py27 ;; "Linux-x86_64" ) install_script "Anaconda2-4.1.0-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda2-4.1.0-Linux-x86_64.sh#3b7e504ca0132fb555d1f10e174cae07007f1bc6898cad0f7d416a68aca01f45" "anaconda" verify_py27 ;; "MacOSX-x86_64" ) install_script "Anaconda2-4.1.0-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda2-4.1.0-MacOSX-x86_64.sh#8b2c2a32f5e0da75cf8c81c568124cc1ea701a58cd46b7816133573a7f5b7b45" "anaconda" verify_py27 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Anaconda2 is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/anaconda2-4.1.1000066400000000000000000000016241517431316200263270ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86" ) install_script "Anaconda2-4.1.1-Linux-x86" "https://repo.continuum.io/archive/Anaconda2-4.1.1-Linux-x86.sh#1ab001c7a469345a90d549ebf4afa3376f0f3a57a0df5f042cac7d773b0e0b0d" "anaconda" verify_py27 ;; "Linux-x86_64" ) install_script "Anaconda2-4.1.1-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda2-4.1.1-Linux-x86_64.sh#9413b1d3ca9498ba6f53913df9c43d685dd973440ff10b7fe0c45b1cbdcb582e" "anaconda" verify_py27 ;; "MacOSX-x86_64" ) install_script "Anaconda2-4.1.1-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda2-4.1.1-MacOSX-x86_64.sh#3b2fb323eb26c1c58788f63c41e164c20c417f7f24e30b8057e92ab4d6102b70" "anaconda" verify_py27 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Anaconda2 is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/anaconda2-4.2.0000066400000000000000000000016241517431316200263270ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86" ) install_script "Anaconda2-4.2.0-Linux-x86" "https://repo.continuum.io/archive/Anaconda2-4.2.0-Linux-x86.sh#618b720f309fe8da4f235415f11b6ce3db0a16d702ca67fdceeecf6bec78c32a" "anaconda" verify_py27 ;; "Linux-x86_64" ) install_script "Anaconda2-4.2.0-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda2-4.2.0-Linux-x86_64.sh#beee286d24fb37dd6555281bba39b3deb5804baec509a9dc5c69185098cf661a" "anaconda" verify_py27 ;; "MacOSX-x86_64" ) install_script "Anaconda2-4.2.0-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda2-4.2.0-MacOSX-x86_64.sh#a8b3ef86233635d9dcc3499dc384980762a0b42d354a318f8307029c399db452" "anaconda" verify_py27 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Anaconda2 is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/anaconda2-4.3.0000066400000000000000000000016241517431316200263300ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86" ) install_script "Anaconda2-4.3.0-Linux-x86" "https://repo.continuum.io/archive/Anaconda2-4.3.0-Linux-x86.sh#b80d471839e8cf7b100e59308720cc13c141deb1ba903a4776c9a05f613e5078" "anaconda" verify_py27 ;; "Linux-x86_64" ) install_script "Anaconda2-4.3.0-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda2-4.3.0-Linux-x86_64.sh#7c52e6e99aabb24a49880130615a48e685da444c3c14eb48d6a65f3313bf745c" "anaconda" verify_py27 ;; "MacOSX-x86_64" ) install_script "Anaconda2-4.3.0-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda2-4.3.0-MacOSX-x86_64.sh#834ac0287062929ab5930661735ee617fd379bdfe79f3e0a20aebd614835b6c5" "anaconda" verify_py27 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Anaconda2 is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/anaconda2-4.3.1000066400000000000000000000016241517431316200263310ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86" ) install_script "Anaconda2-4.3.1-Linux-x86" "https://repo.continuum.io/archive/Anaconda2-4.3.1-Linux-x86.sh#4519ac724d5120d21bb80289c5509c0d1fd9f99c6e9b9a4c6fb352d8bda4aede" "anaconda" verify_py27 ;; "Linux-x86_64" ) install_script "Anaconda2-4.3.1-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda2-4.3.1-Linux-x86_64.sh#e9b8f2645df6b1527ba56d61343162e0794acc3ee8dde2a6bba353719e2d878d" "anaconda" verify_py27 ;; "MacOSX-x86_64" ) install_script "Anaconda2-4.3.1-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda2-4.3.1-MacOSX-x86_64.sh#35261360f2b01793f441b29715a94052dceaef1137866b7323c76be83c5bcc1a" "anaconda" verify_py27 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Anaconda2 is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/anaconda2-4.4.0000066400000000000000000000016241517431316200263310ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86" ) install_script "Anaconda2-4.4.0-Linux-x86" "https://repo.continuum.io/archive/Anaconda2-4.4.0-Linux-x86.sh#452aa91ac83d3b6a68b79cea3042170ec591d468d6966307ff9af18fdbce9fbf" "anaconda" verify_py27 ;; "Linux-x86_64" ) install_script "Anaconda2-4.4.0-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda2-4.4.0-Linux-x86_64.sh#2d30b91ed4d215b6b4a15162a3389e9057b15445a0c02da71bd7bd272e7b824e" "anaconda" verify_py27 ;; "MacOSX-x86_64" ) install_script "Anaconda2-4.4.0-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda2-4.4.0-MacOSX-x86_64.sh#ab95aef1110c2a385fd39a17e5f11dfbaabce25c1a5944598de164d7a2772969" "anaconda" verify_py27 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Anaconda2 is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/anaconda2-5.0.0000066400000000000000000000016341517431316200263270ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86" ) install_script "Anaconda2-5.0.0.1-Linux-x86" "https://repo.continuum.io/archive/Anaconda2-5.0.0.1-Linux-x86.sh#00fbd979c815ede0bbad48fb4ef62cda333c7ad6330184962862a3072479267b" "anaconda" verify_py27 ;; "Linux-x86_64" ) install_script "Anaconda2-5.0.0.1-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda2-5.0.0.1-Linux-x86_64.sh#18730808d863a5c194ab3f59dd395c1a63cbd769c9bfb1df65efe61ee62fc6d6" "anaconda" verify_py27 ;; "MacOSX-x86_64" ) install_script "Anaconda2-5.0.0-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda2-5.0.0-MacOSX-x86_64.sh#d85198c63657924fae11b6ea5961f50d81d09a1185d6f0a9a9d5bc69eb788ccc" "anaconda" verify_py27 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Anaconda2 is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/anaconda2-5.0.1000066400000000000000000000016241517431316200263270ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86" ) install_script "Anaconda2-5.0.1-Linux-x86" "https://repo.continuum.io/archive/Anaconda2-5.0.1-Linux-x86.sh#88c8d698fff16af15862daca10e94a0a46380dcffda45f8d89f5fe03f6bd2528" "anaconda" verify_py27 ;; "Linux-x86_64" ) install_script "Anaconda2-5.0.1-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda2-5.0.1-Linux-x86_64.sh#23c676510bc87c95184ecaeb327c0b2c88007278e0d698622e2dd8fb14d9faa4" "anaconda" verify_py27 ;; "MacOSX-x86_64" ) install_script "Anaconda2-5.0.1-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda2-5.0.1-MacOSX-x86_64.sh#e3a9a5c84cb89ff079b0781ba773a3433d490fe0cfc24042c613a5674748d87b" "anaconda" verify_py27 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Anaconda2 is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/anaconda2-5.1.0000066400000000000000000000016241517431316200263270ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86" ) install_script "Anaconda2-5.1.0-Linux-x86" "https://repo.continuum.io/archive/Anaconda2-5.1.0-Linux-x86.sh#5af0c7a09a5f3aaf3666c0b362246d342d80e782128ef043998c9ead5ad41df7" "anaconda" verify_py27 ;; "Linux-x86_64" ) install_script "Anaconda2-5.1.0-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda2-5.1.0-Linux-x86_64.sh#5f26ee92860d1dffdcd20910ff2cf75572c39d2892d365f4e867a611cca2af5b" "anaconda" verify_py27 ;; "MacOSX-x86_64" ) install_script "Anaconda2-5.1.0-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda2-5.1.0-MacOSX-x86_64.sh#b686e01aeadb33526d9c154a0ac6f691dfad135080df96fb44d3ae1e4b128521" "anaconda" verify_py27 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Anaconda2 is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/anaconda2-5.2.0000066400000000000000000000016241517431316200263300ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86" ) install_script "Anaconda2-5.2.0-Linux-x86" "https://repo.continuum.io/archive/Anaconda2-5.2.0-Linux-x86.sh#402758c24767e9eb3b77312c388725a058f76e03316464797c3ca404e6eebc2c" "anaconda" verify_py27 ;; "Linux-x86_64" ) install_script "Anaconda2-5.2.0-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda2-5.2.0-Linux-x86_64.sh#cb0d7a08b0e2cec4372033d3269979b4e72e2353ffd1444f57cb38bc9621219f" "anaconda" verify_py27 ;; "MacOSX-x86_64" ) install_script "Anaconda2-5.2.0-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda2-5.2.0-MacOSX-x86_64.sh#d7d46e566306da5979cd5632079497fe6103b980e3a089ccf27a9f30cbee84dc" "anaconda" verify_py27 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Anaconda2 is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/anaconda2-5.3.0000066400000000000000000000016241517431316200263310ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86" ) install_script "Anaconda2-5.3.0-Linux-x86" "https://repo.continuum.io/archive/Anaconda2-5.3.0-Linux-x86.sh#58d4229ad7097e1f3387d7f6582dcf2bbc684bffea284cd25096bd87530ba590" "anaconda" verify_py27 ;; "Linux-x86_64" ) install_script "Anaconda2-5.3.0-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda2-5.3.0-Linux-x86_64.sh#50eeaab24bfa2472bc6485fe8f0e612ed67e561eda1ff9fbf07b62c96443c1be" "anaconda" verify_py27 ;; "MacOSX-x86_64" ) install_script "Anaconda2-5.3.0-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda2-5.3.0-MacOSX-x86_64.sh#bea3eb7667d265c8fe678ddde8432ac1f8286224baae498d092bb068b8185e88" "anaconda" verify_py27 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Anaconda2 is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/anaconda2-5.3.1000066400000000000000000000016241517431316200263320ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86" ) install_script "Anaconda2-5.3.1-Linux-x86" "https://repo.continuum.io/archive/Anaconda2-5.3.1-Linux-x86.sh#a38017dfa59141c63ec9882a15bd35e7ce63810ae0d1bcf47c79b7fb9f83e969" "anaconda" verify_py27 ;; "Linux-x86_64" ) install_script "Anaconda2-5.3.1-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda2-5.3.1-Linux-x86_64.sh#f0650ad2f9ca4ae3f3162d7204a32950bc794f37f322eb47b5ad9412454f998c" "anaconda" verify_py27 ;; "MacOSX-x86_64" ) install_script "Anaconda2-5.3.1-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda2-5.3.1-MacOSX-x86_64.sh#df81e9d5d7d4c6595609a8d353eab80102a83b49cf8c19e5c1e5ad4ac0f39328" "anaconda" verify_py27 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Anaconda2 is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/anaconda3-2.0.0000066400000000000000000000016241517431316200263240ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86" ) install_script "Anaconda3-2.0.0-Linux-x86" "https://repo.continuum.io/archive/Anaconda3-2.0.0-Linux-x86.sh#439761159d5604e182951650a478dd53caff52e9dccf17c20ae66689b7b289dd" "anaconda" verify_py34 ;; "Linux-x86_64" ) install_script "Anaconda3-2.0.0-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda3-2.0.0-Linux-x86_64.sh#57ce4f97e300cf94c5724f72d992e9eecef708fdaa13bc672ae9779773056540" "anaconda" verify_py34 ;; "MacOSX-x86_64" ) install_script "Anaconda3-2.0.0-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda3-2.0.0-MacOSX-x86_64.sh#776a1cf8a8e898b41bb6558c093632cc922698dc48486fee35d1e8eae3f604fa" "anaconda" verify_py34 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Anaconda3 is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/anaconda3-2.0.1000066400000000000000000000016241517431316200263250ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86" ) install_script "Anaconda3-2.0.1-Linux-x86" "https://repo.continuum.io/archive/Anaconda3-2.0.1-Linux-x86.sh#21293fabbd3d5cfbb1afe0c9a8b39e0bc4d283cd7dbe3c84a60b335481a41ef3" "anaconda" verify_py34 ;; "Linux-x86_64" ) install_script "Anaconda3-2.0.1-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda3-2.0.1-Linux-x86_64.sh#3c3b834793e461f3316ad1d9a9178c67859a9d74aaf7bcade076f04134dd1e26" "anaconda" verify_py34 ;; "MacOSX-x86_64" ) install_script "Anaconda3-2.0.1-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda3-2.0.1-MacOSX-x86_64.sh#7a08509d4e45efcc7055a6d06d8406a773716500bd869a4e85312ff131155bd6" "anaconda" verify_py34 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Anaconda3 is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/anaconda3-2.1.0000066400000000000000000000016241517431316200263250ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86" ) install_script "Anaconda3-2.1.0-Linux-x86" "https://repo.continuum.io/archive/Anaconda3-2.1.0-Linux-x86.sh#657cb599004c21e37ce693515ea33922e0084fd7c159ef1b96b57c86eed8385f" "anaconda" verify_py34 ;; "Linux-x86_64" ) install_script "Anaconda3-2.1.0-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda3-2.1.0-Linux-x86_64.sh#af3225ccbe8df0ffb918939e009aa57740e35058ebf9dfcf5fec794a77556c3c" "anaconda" verify_py34 ;; "MacOSX-x86_64" ) install_script "Anaconda3-2.1.0-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda3-2.1.0-MacOSX-x86_64.sh#efdb7e9d1e539cbed62dc3874b0de6a141f36684e6fbc05018e072b217e24077" "anaconda" verify_py34 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Anaconda3 is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/anaconda3-2.2.0000066400000000000000000000016241517431316200263260ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86" ) install_script "Anaconda3-2.2.0-Linux-x86" "https://repo.continuum.io/archive/Anaconda3-2.2.0-Linux-x86.sh#223655cd256aa912dfc83ab24570e47bb3808bc3b0c6bd21b5db0fcf2750883e" "anaconda" verify_py34 ;; "Linux-x86_64" ) install_script "Anaconda3-2.2.0-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda3-2.2.0-Linux-x86_64.sh#4aac68743e7706adb93f042f970373a6e7e087dbf4b02ac467c94ca4ce33d2d1" "anaconda" verify_py34 ;; "MacOSX-x86_64" ) install_script "Anaconda3-2.2.0-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda3-2.2.0-MacOSX-x86_64.sh#81a2089ea6127717f146454e99ea0be2bd595193e4151bb05b4c15749b1d8124" "anaconda" verify_py34 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Anaconda3 is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/anaconda3-2.3.0000066400000000000000000000016241517431316200263270ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86" ) install_script "Anaconda3-2.3.0-Linux-x86" "https://repo.continuum.io/archive/Anaconda3-2.3.0-Linux-x86.sh#4cc10d65c303191004ada2b6d75562c8ed84e42bf9871af06440dd956077b555" "anaconda" verify_py34 ;; "Linux-x86_64" ) install_script "Anaconda3-2.3.0-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda3-2.3.0-Linux-x86_64.sh#3be5410b2d9db45882c7de07c554cf4f1034becc274ec9074b23fd37a5c87a6f" "anaconda" verify_py34 ;; "MacOSX-x86_64" ) install_script "Anaconda3-2.3.0-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda3-2.3.0-MacOSX-x86_64.sh#6a0c94a49f41f9fda0138c8e966bd7b0a8965d6648fd21ffbd645d1453848ba5" "anaconda" verify_py34 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Anaconda3 is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/anaconda3-2.4.0000066400000000000000000000016241517431316200263300ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86" ) install_script "Anaconda3-2.4.0-Linux-x86" "https://repo.continuum.io/archive/Anaconda3-2.4.0-Linux-x86.sh#f6080c6493cefc603cfeb67aaf6c3c4c6b80a66788f03db48ffd3cfa52017c0a" "anaconda" verify_py34 ;; "Linux-x86_64" ) install_script "Anaconda3-2.4.0-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda3-2.4.0-Linux-x86_64.sh#fb4e480059e991f2fa632b5a9bcdd284c7f0677814cd719c11d524453f96a40d" "anaconda" verify_py34 ;; "MacOSX-x86_64" ) install_script "Anaconda3-2.4.0-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda3-2.4.0-MacOSX-x86_64.sh#f0cd785dbed0bab28dfc08a391c9de1b01633422fa317cb8365513a1ae5ae074" "anaconda" verify_py34 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Anaconda3 is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/anaconda3-2.4.1000066400000000000000000000016241517431316200263310ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86" ) install_script "Anaconda3-2.4.1-Linux-x86" "https://repo.continuum.io/archive/Anaconda3-2.4.1-Linux-x86.sh#00d13413f5b8129e863dabcc2296a181c697056c5ed210739a0aa06454ab7038" "anaconda" verify_py34 ;; "Linux-x86_64" ) install_script "Anaconda3-2.4.1-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda3-2.4.1-Linux-x86_64.sh#0735e69199fc37135930ea2fd4fb6ad0adef215a2a7ba9fd6b0a0a4daaadb1cf" "anaconda" verify_py34 ;; "MacOSX-x86_64" ) install_script "Anaconda3-2.4.1-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda3-2.4.1-MacOSX-x86_64.sh#22a3267638da9b7d64210d7da90d8762da7948234c21c0010a74f2621ee0ef68" "anaconda" verify_py34 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Anaconda3 is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/anaconda3-2.5.0000066400000000000000000000016241517431316200263310ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86" ) install_script "Anaconda3-2.5.0-Linux-x86" "https://repo.continuum.io/archive/Anaconda3-2.5.0-Linux-x86.sh#22ac26c8bde7c4153ea859f6f6d8aca93bbf1e213d800167ad5ea530c62959af" "anaconda" verify_py35 ;; "Linux-x86_64" ) install_script "Anaconda3-2.5.0-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda3-2.5.0-Linux-x86_64.sh#addadcb927f15cb0b5b6e36890563d3352a8ff6a901ea753d389047d274a29a9" "anaconda" verify_py35 ;; "MacOSX-x86_64" ) install_script "Anaconda3-2.5.0-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda3-2.5.0-MacOSX-x86_64.sh#9bb0f926927db210f8c2a8de881213d1a44c7b3d6dbcb93dfa6b99ed4bbd3e61" "anaconda" verify_py35 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Anaconda3 is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/anaconda3-2018.12000066400000000000000000000016511517431316200265020ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86" ) install_script "Anaconda3-2018.12-Linux-x86.sh" "https://repo.anaconda.com/archive/Anaconda3-2018.12-Linux-x86.sh#7895052814921d45ed0585d1fb19f8edd6fbd02b61639310f770e2ebe85cd975" "anaconda" verify_py37 ;; "Linux-x86_64" ) install_script "Anaconda3-2018.12-Linux-x86_64.sh" "https://repo.anaconda.com/archive/Anaconda3-2018.12-Linux-x86_64.sh#1019d0857e5865f8a6861eaf15bfe535b87e92b72ce4f531000dc672be7fce00" "anaconda" verify_py37 ;; "MacOSX-x86_64" ) install_script "Anaconda3-2018.12-MacOSX-x86_64.sh" "https://repo.anaconda.com/archive/Anaconda3-2018.12-MacOSX-x86_64.sh#4ccd3944d994fd47e5701c341725a63e984f8c042bf4dc19c9dfc7c135e7d8e4" "anaconda" verify_py37 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Anaconda3 is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/anaconda3-2019.03000066400000000000000000000016541517431316200265060ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-ppc64le" ) install_script "Anaconda3-2019.03-Linux-ppc64le" "https://repo.continuum.io/archive/Anaconda3-2019.03-Linux-ppc64le.sh#b4ecfca3b6d6c284a3f9370f6a5ccfac1b6be7fa75af9f6750a98fb315601ebb" "anaconda" verify_py37 ;; "Linux-x86_64" ) install_script "Anaconda3-2019.03-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda3-2019.03-Linux-x86_64.sh#45c851b7497cc14d5ca060064394569f724b67d9b5f98a926ed49b834a6bb73a" "anaconda" verify_py37 ;; "MacOSX-x86_64" ) install_script "Anaconda3-2019.03-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda3-2019.03-MacOSX-x86_64.sh#b232f0b16181f48667d2ca89c04a4ee4b3932475282b41c52acb87b4cdafcaaf" "anaconda" verify_py37 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Anaconda3 is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/anaconda3-2019.07000066400000000000000000000016541517431316200265120ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-ppc64le" ) install_script "Anaconda3-2019.07-Linux-ppc64le" "https://repo.continuum.io/archive/Anaconda3-2019.07-Linux-ppc64le.sh#e788094f7a18bfe14038accb26c8809a81291ed97f1fce29425f366aa8105548" "anaconda" verify_py37 ;; "Linux-x86_64" ) install_script "Anaconda3-2019.07-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda3-2019.07-Linux-x86_64.sh#69581cf739365ec7fb95608eef694ba959d7d33b36eb961953f2b82cb25bdf5a" "anaconda" verify_py37 ;; "MacOSX-x86_64" ) install_script "Anaconda3-2019.07-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda3-2019.07-MacOSX-x86_64.sh#dcbddbab37c5b5f3873fe24d2617a4325bc7da28c0cd1d23a2edc7f0ebe08b7d" "anaconda" verify_py37 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Anaconda3 is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/anaconda3-2019.10000066400000000000000000000016541517431316200265040ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-ppc64le" ) install_script "Anaconda3-2019.10-Linux-ppc64le" "https://repo.continuum.io/archive/Anaconda3-2019.10-Linux-ppc64le.sh#118c579f625555e1b116f0c3fd3842772e8fa0254cb2262c1c94e9eb40ba5160" "anaconda" verify_py37 ;; "Linux-x86_64" ) install_script "Anaconda3-2019.10-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda3-2019.10-Linux-x86_64.sh#46d762284d252e51cd58a8ca6c8adc9da2eadc82c342927b2f66ed011d1d8b53" "anaconda" verify_py37 ;; "MacOSX-x86_64" ) install_script "Anaconda3-2019.10-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda3-2019.10-MacOSX-x86_64.sh#4f77299ff4170cda64fdfcc27ac609a37d654c158f36c9ff25048793fe8a3a49" "anaconda" verify_py37 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Anaconda3 is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/anaconda3-2020.02000066400000000000000000000016541517431316200264750ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-ppc64le" ) install_script "Anaconda3-2020.02-Linux-ppc64le" "https://repo.continuum.io/archive/Anaconda3-2020.02-Linux-ppc64le.sh#d6d1827a38b988cbbe714d6e0357c9e251c84641a0c70cda51861ed9abb38804" "anaconda" verify_py37 ;; "Linux-x86_64" ) install_script "Anaconda3-2020.02-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda3-2020.02-Linux-x86_64.sh#2b9f088b2022edb474915d9f69a803d6449d5fdb4c303041f60ac4aefcc208bb" "anaconda" verify_py37 ;; "MacOSX-x86_64" ) install_script "Anaconda3-2020.02-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda3-2020.02-MacOSX-x86_64.sh#d237e6c976eb9c58368ca156a51bd913d63a3b5fea32689342733c99d14b6f2e" "anaconda" verify_py37 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Anaconda3 is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/anaconda3-2020.07000066400000000000000000000016541517431316200265020ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-ppc64le" ) install_script "Anaconda3-2020.07-Linux-ppc64le" "https://repo.continuum.io/archive/Anaconda3-2020.07-Linux-ppc64le.sh#0df7c3784973ab46a9ef9848aced01311d08a71d79a18d5ed79dccdae8c8dea7" "anaconda" verify_py38 ;; "Linux-x86_64" ) install_script "Anaconda3-2020.07-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda3-2020.07-Linux-x86_64.sh#38ce717758b95b3bd0b1797cc6ccfb76f29a90c25bdfa50ee45f11e583edfdbf" "anaconda" verify_py38 ;; "MacOSX-x86_64" ) install_script "Anaconda3-2020.07-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda3-2020.07-MacOSX-x86_64.sh#3980c2a57fde5de2ccfdf0d7973f95ac1a3fa63351642e6735c50fc3791ef0f1" "anaconda" verify_py38 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Anaconda3 is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/anaconda3-2020.11000066400000000000000000000016541517431316200264750ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-ppc64le" ) install_script "Anaconda3-2020.11-Linux-ppc64le" "https://repo.continuum.io/archive/Anaconda3-2020.11-Linux-ppc64le.sh#870535ada0a8ae75eeda8cd2bf7dde853ac9f4949b20e1b5641f1843a655f3b8" "anaconda" verify_py38 ;; "Linux-x86_64" ) install_script "Anaconda3-2020.11-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda3-2020.11-Linux-x86_64.sh#cf2ff493f11eaad5d09ce2b4feaa5ea90db5174303d5b3fe030e16d29aeef7de" "anaconda" verify_py38 ;; "MacOSX-x86_64" ) install_script "Anaconda3-2020.11-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda3-2020.11-MacOSX-x86_64.sh#ec11e325c792a6f49dbdbe5e641991d0a29788689176d7e54da97def9532c762" "anaconda" verify_py38 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Anaconda3 is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/anaconda3-2021.04000066400000000000000000000023271517431316200264760ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Anaconda3-2021.04-Linux-aarch64" "https://repo.anaconda.com/archive/Anaconda3-2021.04-Linux-aarch64.sh#14f48f5d1310478b11940a3b96eec7b6" "anaconda" verify_py38 ;; "Linux-ppc64le" ) install_script "Anaconda3-2021.04-Linux-ppc64le" "https://repo.anaconda.com/archive/Anaconda3-2021.04-Linux-ppc64le.sh#e5c8220526b95293e669734f91194acc" "anaconda" verify_py38 ;; "Linux-s390x" ) install_script "Anaconda3-2021.04-Linux-s390x" "https://repo.anaconda.com/archive/Anaconda3-2021.04-Linux-s390x.sh#e61fac26bf61bc5c3e3c1a93abc4d8e2" "anaconda" verify_py38 ;; "Linux-x86_64" ) install_script "Anaconda3-2021.04-Linux-x86_64" "https://repo.anaconda.com/archive/Anaconda3-2021.04-Linux-x86_64.sh#230f2c3c343ee58073bf41bd896dd76c" "anaconda" verify_py38 ;; "MacOSX-x86_64" ) install_script "Anaconda3-2021.04-MacOSX-x86_64" "https://repo.anaconda.com/archive/Anaconda3-2021.04-MacOSX-x86_64.sh#3caed29ad5564b3567676504669342dc" "anaconda" verify_py38 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Anaconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/anaconda3-2021.05000066400000000000000000000016541517431316200265010ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-ppc64le" ) install_script "Anaconda3-2021.05-Linux-ppc64le" "https://repo.continuum.io/archive/Anaconda3-2021.05-Linux-ppc64le.sh#097064807a9adae3f91fc4c5852cd90df2b77fc96505929bb25bf558f1eef76f" "anaconda" verify_py38 ;; "Linux-x86_64" ) install_script "Anaconda3-2021.05-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda3-2021.05-Linux-x86_64.sh#2751ab3d678ff0277ae80f9e8a74f218cfc70fe9a9cdc7bb1c137d7e47e33d53" "anaconda" verify_py38 ;; "MacOSX-x86_64" ) install_script "Anaconda3-2021.05-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda3-2021.05-MacOSX-x86_64.sh#0407bee87eeecad521f1e38eb607b0a85babef4c1b47516dc5c090e152eba5d5" "anaconda" verify_py38 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Anaconda3 is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/anaconda3-2021.11000066400000000000000000000016541517431316200264760ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-ppc64le" ) install_script "Anaconda3-2021.11-Linux-ppc64le" "https://repo.continuum.io/archive/Anaconda3-2021.11-Linux-ppc64le.sh#7eb6a95925ee756240818599f8dcbba7a155adfb05ef6cd5336aa3c083de65f3" "anaconda" verify_py39 ;; "Linux-x86_64" ) install_script "Anaconda3-2021.11-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda3-2021.11-Linux-x86_64.sh#fedf9e340039557f7b5e8a8a86affa9d299f5e9820144bd7b92ae9f7ee08ac60" "anaconda" verify_py39 ;; "MacOSX-x86_64" ) install_script "Anaconda3-2021.11-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda3-2021.11-MacOSX-x86_64.sh#6a9217d1a08c599f860045d56ef64fc6c3e3112b55cc97f3d07c573d7bbcdb58" "anaconda" verify_py39 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Anaconda3 is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/anaconda3-2022.05000066400000000000000000000026351517431316200265020ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Anaconda3-2022.05-Linux-aarch64" "https://repo.anaconda.com/archive/Anaconda3-2022.05-Linux-aarch64.sh#7e822f5622fa306c0aa42430ba884454" "anaconda" verify_py39 ;; "Linux-ppc64le" ) install_script "Anaconda3-2022.05-Linux-ppc64le" "https://repo.anaconda.com/archive/Anaconda3-2022.05-Linux-ppc64le.sh#166b576c7e9d438b0a80840f94b44827" "anaconda" verify_py39 ;; "Linux-s390x" ) install_script "Anaconda3-2022.05-Linux-s390x" "https://repo.anaconda.com/archive/Anaconda3-2022.05-Linux-s390x.sh#00ba3bf29ac51db5e0954b6f217fa468" "anaconda" verify_py39 ;; "Linux-x86_64" ) install_script "Anaconda3-2022.05-Linux-x86_64" "https://repo.anaconda.com/archive/Anaconda3-2022.05-Linux-x86_64.sh#a01150aff48fcb6fcd6472381652de04" "anaconda" verify_py39 ;; "MacOSX-arm64" ) install_script "Anaconda3-2022.05-MacOSX-arm64" "https://repo.anaconda.com/archive/Anaconda3-2022.05-MacOSX-arm64.sh#24d985d2d380c51364d4793eb1840d29" "anaconda" verify_py39 ;; "MacOSX-x86_64" ) install_script "Anaconda3-2022.05-MacOSX-x86_64" "https://repo.anaconda.com/archive/Anaconda3-2022.05-MacOSX-x86_64.sh#5319de6536212892dd2da8b70d602ee1" "anaconda" verify_py39 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Anaconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/anaconda3-2022.10000066400000000000000000000026351517431316200264760ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Anaconda3-2022.10-Linux-aarch64" "https://repo.anaconda.com/archive/Anaconda3-2022.10-Linux-aarch64.sh#dac187c9fa6cae4ad663937f0ef79c8f" "anaconda" verify_py39 ;; "Linux-ppc64le" ) install_script "Anaconda3-2022.10-Linux-ppc64le" "https://repo.anaconda.com/archive/Anaconda3-2022.10-Linux-ppc64le.sh#8dee159ac42f80eca8ce99ddbfd94099" "anaconda" verify_py39 ;; "Linux-s390x" ) install_script "Anaconda3-2022.10-Linux-s390x" "https://repo.anaconda.com/archive/Anaconda3-2022.10-Linux-s390x.sh#ef2a6accc4d0d77756130198cb481358" "anaconda" verify_py39 ;; "Linux-x86_64" ) install_script "Anaconda3-2022.10-Linux-x86_64" "https://repo.anaconda.com/archive/Anaconda3-2022.10-Linux-x86_64.sh#80256bd7a55509665c4179fd61516745" "anaconda" verify_py39 ;; "MacOSX-arm64" ) install_script "Anaconda3-2022.10-MacOSX-arm64" "https://repo.anaconda.com/archive/Anaconda3-2022.10-MacOSX-arm64.sh#3a5d726f90e11270990e520905cf8466" "anaconda" verify_py39 ;; "MacOSX-x86_64" ) install_script "Anaconda3-2022.10-MacOSX-x86_64" "https://repo.anaconda.com/archive/Anaconda3-2022.10-MacOSX-x86_64.sh#83fe2cbd4b32eeb63e99c3e15d72be85" "anaconda" verify_py39 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Anaconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/anaconda3-2023.03000066400000000000000000000031431517431316200264740ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Anaconda3-2023.03-Linux-aarch64" "https://repo.anaconda.com/archive/Anaconda3-2023.03-Linux-aarch64.sh#613797154d9383355677f7dfee10db32b2c327cbedabddcb303598f242c79883" "anaconda" verify_py310 ;; "Linux-ppc64le" ) install_script "Anaconda3-2023.03-Linux-ppc64le" "https://repo.anaconda.com/archive/Anaconda3-2023.03-Linux-ppc64le.sh#eafeaccca96f60ebb0aa0052d9baac8eaa2ee422358ee35b12f60f37e8a3ebb2" "anaconda" verify_py310 ;; "Linux-s390x" ) install_script "Anaconda3-2023.03-Linux-s390x" "https://repo.anaconda.com/archive/Anaconda3-2023.03-Linux-s390x.sh#2648337081c3ce4b760457c5f00fb768ecd7d1d0957051ef5252ab380bb78233" "anaconda" verify_py310 ;; "Linux-x86_64" ) install_script "Anaconda3-2023.03-Linux-x86_64" "https://repo.anaconda.com/archive/Anaconda3-2023.03-Linux-x86_64.sh#19737d5c27b23a1d8740c5cb2414bf6253184ce745d0a912bb235a212a15e075" "anaconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Anaconda3-2023.03-MacOSX-arm64" "https://repo.anaconda.com/archive/Anaconda3-2023.03-MacOSX-arm64.sh#d27ee5432438972e90548e3dfa89490c5dc38a723f4dcd53061f0bd9d53b1bd0" "anaconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Anaconda3-2023.03-MacOSX-x86_64" "https://repo.anaconda.com/archive/Anaconda3-2023.03-MacOSX-x86_64.sh#cc37b1eb85bdc2ade3f95201a746cdc63ee4fbfae48ee9d0c7a3cf319562452d" "anaconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Anaconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/anaconda3-2023.03-0000066400000000000000000000031651517431316200266350ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Anaconda3-2023.03-0-Linux-aarch64" "https://repo.anaconda.com/archive/Anaconda3-2023.03-0-Linux-aarch64.sh#613797154d9383355677f7dfee10db32b2c327cbedabddcb303598f242c79883" "anaconda" verify_py39 ;; "Linux-ppc64le" ) install_script "Anaconda3-2023.03-0-Linux-ppc64le" "https://repo.anaconda.com/archive/Anaconda3-2023.03-0-Linux-ppc64le.sh#eafeaccca96f60ebb0aa0052d9baac8eaa2ee422358ee35b12f60f37e8a3ebb2" "anaconda" verify_py39 ;; "Linux-s390x" ) install_script "Anaconda3-2023.03-0-Linux-s390x" "https://repo.anaconda.com/archive/Anaconda3-2023.03-0-Linux-s390x.sh#2648337081c3ce4b760457c5f00fb768ecd7d1d0957051ef5252ab380bb78233" "anaconda" verify_py39 ;; "Linux-x86_64" ) install_script "Anaconda3-2023.03-0-Linux-x86_64" "https://repo.anaconda.com/archive/Anaconda3-2023.03-0-Linux-x86_64.sh#19737d5c27b23a1d8740c5cb2414bf6253184ce745d0a912bb235a212a15e075" "anaconda" verify_py39 ;; "MacOSX-arm64" ) install_script "Anaconda3-2023.03-0-MacOSX-arm64" "https://repo.anaconda.com/archive/Anaconda3-2023.03-0-MacOSX-arm64.sh#d27ee5432438972e90548e3dfa89490c5dc38a723f4dcd53061f0bd9d53b1bd0" "anaconda" verify_py39 ;; "MacOSX-x86_64" ) install_script "Anaconda3-2023.03-0-MacOSX-x86_64" "https://repo.anaconda.com/archive/Anaconda3-2023.03-0-MacOSX-x86_64.sh#cc37b1eb85bdc2ade3f95201a746cdc63ee4fbfae48ee9d0c7a3cf319562452d" "anaconda" verify_py39 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Anaconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/anaconda3-2023.03-1000066400000000000000000000031651517431316200266360ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Anaconda3-2023.03-1-Linux-aarch64" "https://repo.anaconda.com/archive/Anaconda3-2023.03-1-Linux-aarch64.sh#54e600faa2af63a25717af30ecaddf1ee428cdfebd3721a70f41462e232e8153" "anaconda" verify_py39 ;; "Linux-ppc64le" ) install_script "Anaconda3-2023.03-1-Linux-ppc64le" "https://repo.anaconda.com/archive/Anaconda3-2023.03-1-Linux-ppc64le.sh#a31f2d6da83534cff7c994403cc11fa634b31fcd10eb4153d00233345ee084b2" "anaconda" verify_py39 ;; "Linux-s390x" ) install_script "Anaconda3-2023.03-1-Linux-s390x" "https://repo.anaconda.com/archive/Anaconda3-2023.03-1-Linux-s390x.sh#5af1406c6350b4ba6839c49faa32a3c90f2b9845a03c35843f118dd9dd013421" "anaconda" verify_py39 ;; "Linux-x86_64" ) install_script "Anaconda3-2023.03-1-Linux-x86_64" "https://repo.anaconda.com/archive/Anaconda3-2023.03-1-Linux-x86_64.sh#95102d7c732411f1458a20bdf47e4c1b0b6c8a21a2edfe4052ca370aaae57bab" "anaconda" verify_py39 ;; "MacOSX-arm64" ) install_script "Anaconda3-2023.03-1-MacOSX-arm64" "https://repo.anaconda.com/archive/Anaconda3-2023.03-1-MacOSX-arm64.sh#85152324c423fedbeed2e7491cb32e597eaeb1b86ae7a61ff7597b401fd053ce" "anaconda" verify_py39 ;; "MacOSX-x86_64" ) install_script "Anaconda3-2023.03-1-MacOSX-x86_64" "https://repo.anaconda.com/archive/Anaconda3-2023.03-1-MacOSX-x86_64.sh#3593921c8a5516db82f0d7dd1c691f7ee7794236852e7da614e9ad6e93eeb342" "anaconda" verify_py39 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Anaconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/anaconda3-2023.07-0000066400000000000000000000031651517431316200266410ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Anaconda3-2023.07-0-Linux-aarch64" "https://repo.anaconda.com/archive/Anaconda3-2023.07-0-Linux-aarch64.sh#5f4865448c1111fb80cb49abff0f9b38b2970857dba7a4627c499ba102b82af5" "anaconda" verify_py39 ;; "Linux-ppc64le" ) install_script "Anaconda3-2023.07-0-Linux-ppc64le" "https://repo.anaconda.com/archive/Anaconda3-2023.07-0-Linux-ppc64le.sh#98efb73758680b84f890d818b5748d7a08e82c4b825d597f7e3c4467125da278" "anaconda" verify_py39 ;; "Linux-s390x" ) install_script "Anaconda3-2023.07-0-Linux-s390x" "https://repo.anaconda.com/archive/Anaconda3-2023.07-0-Linux-s390x.sh#f6933a8b70d346d423e089843fc151c46bdaee4e3e4e4fd0fb81ca06b8766892" "anaconda" verify_py39 ;; "Linux-x86_64" ) install_script "Anaconda3-2023.07-0-Linux-x86_64" "https://repo.anaconda.com/archive/Anaconda3-2023.07-0-Linux-x86_64.sh#ac738639aba0b676a618911600d0a0e7825ee7fd10efb6b3d95cc2e570d9ee7b" "anaconda" verify_py39 ;; "MacOSX-arm64" ) install_script "Anaconda3-2023.07-0-MacOSX-arm64" "https://repo.anaconda.com/archive/Anaconda3-2023.07-0-MacOSX-arm64.sh#23a9deb80acb145c65375bd73cbaa8793be81447278c4db7be50ef7c32a58635" "anaconda" verify_py39 ;; "MacOSX-x86_64" ) install_script "Anaconda3-2023.07-0-MacOSX-x86_64" "https://repo.anaconda.com/archive/Anaconda3-2023.07-0-MacOSX-x86_64.sh#b6ea24fe16544d5b2d5adf6c913c1fc89a6dbdef12a4caff76ff574b33d0f3cb" "anaconda" verify_py39 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Anaconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/anaconda3-2023.07-1000066400000000000000000000031731517431316200266410ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Anaconda3-2023.07-1-Linux-aarch64" "https://repo.anaconda.com/archive/Anaconda3-2023.07-1-Linux-aarch64.sh#2ebe549375f3f5ffec9558a8a8405ebd697e69c8133b8f9c1c5cd4ff69d1cc74" "anaconda" verify_py311 ;; "Linux-ppc64le" ) install_script "Anaconda3-2023.07-1-Linux-ppc64le" "https://repo.anaconda.com/archive/Anaconda3-2023.07-1-Linux-ppc64le.sh#ee149f55ebdd3f15fc1db4e9cddb5126da62e7a193fa15026c9fa009a2575d0a" "anaconda" verify_py311 ;; "Linux-s390x" ) install_script "Anaconda3-2023.07-1-Linux-s390x" "https://repo.anaconda.com/archive/Anaconda3-2023.07-1-Linux-s390x.sh#49aad1bc077334f30177443c234f3c982f1c9751fc78c4c29fb4cf736e4f61ef" "anaconda" verify_py311 ;; "Linux-x86_64" ) install_script "Anaconda3-2023.07-1-Linux-x86_64" "https://repo.anaconda.com/archive/Anaconda3-2023.07-1-Linux-x86_64.sh#111ce0a7f26e606863008a9519fd608b1493e483b6f487aea71d82b13fe0967e" "anaconda" verify_py311 ;; "MacOSX-arm64" ) install_script "Anaconda3-2023.07-1-MacOSX-arm64" "https://repo.anaconda.com/archive/Anaconda3-2023.07-1-MacOSX-arm64.sh#322045ad100dcc380decde5812db58c617901c6a8ac46dd7818080fe3ae19f8e" "anaconda" verify_py311 ;; "MacOSX-x86_64" ) install_script "Anaconda3-2023.07-1-MacOSX-x86_64" "https://repo.anaconda.com/archive/Anaconda3-2023.07-1-MacOSX-x86_64.sh#803b2d0c5a142af3de14b410517c2c8889eaceb1b784d4c121512ebda13af6f8" "anaconda" verify_py311 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Anaconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/anaconda3-2023.07-2000066400000000000000000000031731517431316200266420ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Anaconda3-2023.07-2-Linux-aarch64" "https://repo.anaconda.com/archive/Anaconda3-2023.07-2-Linux-aarch64.sh#75967bc2113d9e336e670e1e557c9198d8b98e59fb9adb82cbe0e71ce5f7c2db" "anaconda" verify_py311 ;; "Linux-ppc64le" ) install_script "Anaconda3-2023.07-2-Linux-ppc64le" "https://repo.anaconda.com/archive/Anaconda3-2023.07-2-Linux-ppc64le.sh#7a72e301fb3b8e175a96b6457fc84654dd2eb98942528d9988760779b92847e4" "anaconda" verify_py311 ;; "Linux-s390x" ) install_script "Anaconda3-2023.07-2-Linux-s390x" "https://repo.anaconda.com/archive/Anaconda3-2023.07-2-Linux-s390x.sh#121743a62210249dd9fb9d6527d545d08f6bf6d2624d51ad4b5d168cb3e860d6" "anaconda" verify_py311 ;; "Linux-x86_64" ) install_script "Anaconda3-2023.07-2-Linux-x86_64" "https://repo.anaconda.com/archive/Anaconda3-2023.07-2-Linux-x86_64.sh#589fb34fe73bc303379abbceba50f3131254e85ce4e7cd819ba4276ba29cad16" "anaconda" verify_py311 ;; "MacOSX-arm64" ) install_script "Anaconda3-2023.07-2-MacOSX-arm64" "https://repo.anaconda.com/archive/Anaconda3-2023.07-2-MacOSX-arm64.sh#8b08ca8a94dd5fda20d134fea13fa6c55c70d20d4b5a7a1c80d311aeb0cd7a88" "anaconda" verify_py311 ;; "MacOSX-x86_64" ) install_script "Anaconda3-2023.07-2-MacOSX-x86_64" "https://repo.anaconda.com/archive/Anaconda3-2023.07-2-MacOSX-x86_64.sh#a2f7d0c19f60d00742154db21bfb3976d82215ff58396353f4dc729828bd2f49" "anaconda" verify_py311 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Anaconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/anaconda3-2023.09-0000066400000000000000000000031731517431316200266420ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Anaconda3-2023.09-0-Linux-aarch64" "https://repo.anaconda.com/archive/Anaconda3-2023.09-0-Linux-aarch64.sh#69ee26361c1ec974199bce5c0369e3e9a71541de7979d2b9cfa4af556d1ae0ea" "anaconda" verify_py311 ;; "Linux-ppc64le" ) install_script "Anaconda3-2023.09-0-Linux-ppc64le" "https://repo.anaconda.com/archive/Anaconda3-2023.09-0-Linux-ppc64le.sh#5ea1ed9808af95eb2655fe6a4ffdb66bea66ecd1d053fc2ee69eacc7685ef665" "anaconda" verify_py311 ;; "Linux-s390x" ) install_script "Anaconda3-2023.09-0-Linux-s390x" "https://repo.anaconda.com/archive/Anaconda3-2023.09-0-Linux-s390x.sh#ee817071a2ad94e044fb48061a721bc86606b2f4906b705e4f42177eeb3ca7c5" "anaconda" verify_py311 ;; "Linux-x86_64" ) install_script "Anaconda3-2023.09-0-Linux-x86_64" "https://repo.anaconda.com/archive/Anaconda3-2023.09-0-Linux-x86_64.sh#6c8a4abb36fbb711dc055b7049a23bbfd61d356de9468b41c5140f8a11abd851" "anaconda" verify_py311 ;; "MacOSX-arm64" ) install_script "Anaconda3-2023.09-0-MacOSX-arm64" "https://repo.anaconda.com/archive/Anaconda3-2023.09-0-MacOSX-arm64.sh#34121775d9e30a6ea12af0a462e1881670b0c175b426e06fd7b1581625ebd69b" "anaconda" verify_py311 ;; "MacOSX-x86_64" ) install_script "Anaconda3-2023.09-0-MacOSX-x86_64" "https://repo.anaconda.com/archive/Anaconda3-2023.09-0-MacOSX-x86_64.sh#0c64a2c634fe31335079d97340c277c81b3f0c9dfe862a06599570640ac897a4" "anaconda" verify_py311 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Anaconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/anaconda3-2024.02-1000066400000000000000000000026151517431316200266350ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Anaconda3-2024.02-1-Linux-aarch64" "https://repo.anaconda.com/archive/Anaconda3-2024.02-1-Linux-aarch64.sh#28c5bed6fba84f418516e41640c7937514aabd55e929a8f66937c737303c7bba" "anaconda" verify_py311 ;; "Linux-s390x" ) install_script "Anaconda3-2024.02-1-Linux-s390x" "https://repo.anaconda.com/archive/Anaconda3-2024.02-1-Linux-s390x.sh#3e2e8b17ea9a5caafd448f52e01435998b2e1ce102040a924d5bd6e05a1d735b" "anaconda" verify_py311 ;; "Linux-x86_64" ) install_script "Anaconda3-2024.02-1-Linux-x86_64" "https://repo.anaconda.com/archive/Anaconda3-2024.02-1-Linux-x86_64.sh#c536ddb7b4ba738bddbd4e581b29308cb332fa12ae3fa2cd66814bd735dff231" "anaconda" verify_py311 ;; "MacOSX-arm64" ) install_script "Anaconda3-2024.02-1-MacOSX-arm64" "https://repo.anaconda.com/archive/Anaconda3-2024.02-1-MacOSX-arm64.sh#14a1c80af18c2c2e743e63cdb41228cd554a3fdb250563b6978348c80b6860f6" "anaconda" verify_py311 ;; "MacOSX-x86_64" ) install_script "Anaconda3-2024.02-1-MacOSX-x86_64" "https://repo.anaconda.com/archive/Anaconda3-2024.02-1-MacOSX-x86_64.sh#944aee9b90f7d8a2a997d0337cb37219757f22e76c10de38c7c68191c6b5b226" "anaconda" verify_py311 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Anaconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/anaconda3-2024.06-1000066400000000000000000000026151517431316200266410ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Anaconda3-2024.06-1-Linux-aarch64" "https://repo.anaconda.com/archive/Anaconda3-2024.06-1-Linux-aarch64.sh#b4be0ad2052236882402902a31d32cd37635d3db194a42f977be0d68a8ff1a31" "anaconda" verify_py312 ;; "Linux-s390x" ) install_script "Anaconda3-2024.06-1-Linux-s390x" "https://repo.anaconda.com/archive/Anaconda3-2024.06-1-Linux-s390x.sh#1b3f4ef4147137fb1861f8251679ea96e651a7c405993c61e39441e43ee2dd11" "anaconda" verify_py312 ;; "Linux-x86_64" ) install_script "Anaconda3-2024.06-1-Linux-x86_64" "https://repo.anaconda.com/archive/Anaconda3-2024.06-1-Linux-x86_64.sh#539bb43d9a52d758d0fdfa1b1b049920ec6f8c6d15ee9fe4a423355fe551a8f7" "anaconda" verify_py312 ;; "MacOSX-arm64" ) install_script "Anaconda3-2024.06-1-MacOSX-arm64" "https://repo.anaconda.com/archive/Anaconda3-2024.06-1-MacOSX-arm64.sh#f9e0795431910ee4ac341c0cc2a0b62e6c497440789b4117c20736db45b34204" "anaconda" verify_py312 ;; "MacOSX-x86_64" ) install_script "Anaconda3-2024.06-1-MacOSX-x86_64" "https://repo.anaconda.com/archive/Anaconda3-2024.06-1-MacOSX-x86_64.sh#9b2aa48bfc58e337176d8b5f3776692815807e1346ec12ebcc46a01801bb4ee0" "anaconda" verify_py312 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Anaconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/anaconda3-2024.10-1000066400000000000000000000026151517431316200266340ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Anaconda3-2024.10-1-Linux-aarch64" "https://repo.anaconda.com/archive/Anaconda3-2024.10-1-Linux-aarch64.sh#489c608e8bddd2cf29dfbdd811cf99087cd6b6a0615d41c6f9058ce340594b65" "anaconda" verify_py312 ;; "Linux-s390x" ) install_script "Anaconda3-2024.10-1-Linux-s390x" "https://repo.anaconda.com/archive/Anaconda3-2024.10-1-Linux-s390x.sh#e00bd5e6c275695e8050a45aa85790315f504c95243dfe3632f505284310f3c4" "anaconda" verify_py312 ;; "Linux-x86_64" ) install_script "Anaconda3-2024.10-1-Linux-x86_64" "https://repo.anaconda.com/archive/Anaconda3-2024.10-1-Linux-x86_64.sh#3ba0a298155c32fbfd80cbc238298560bf69a2df511783054adfc151b76d80d8" "anaconda" verify_py312 ;; "MacOSX-arm64" ) install_script "Anaconda3-2024.10-1-MacOSX-arm64" "https://repo.anaconda.com/archive/Anaconda3-2024.10-1-MacOSX-arm64.sh#f64ed797ce23ae1d07ead949bfb6ff630b9fa8269ca8aef8ea2efa82172ece47" "anaconda" verify_py312 ;; "MacOSX-x86_64" ) install_script "Anaconda3-2024.10-1-MacOSX-x86_64" "https://repo.anaconda.com/archive/Anaconda3-2024.10-1-MacOSX-x86_64.sh#ad3eea1cc969e9dfd4d571fc266aae06ec119f651d7cb19c0dc187b73e2bfab1" "anaconda" verify_py312 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Anaconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/anaconda3-2025.06-0000066400000000000000000000022451517431316200266400ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Anaconda3-2025.06-0-Linux-aarch64" "https://repo.anaconda.com/archive/Anaconda3-2025.06-0-Linux-aarch64.sh#e6177f844f6156f07978c85b1f18ca3b7724d5ab5dba44b88a7f6b2452ba6271" "anaconda" verify_py313 ;; "Linux-x86_64" ) install_script "Anaconda3-2025.06-0-Linux-x86_64" "https://repo.anaconda.com/archive/Anaconda3-2025.06-0-Linux-x86_64.sh#08db13f6db5dd4f99b3a6db96c68d064d50ea23742013b70f588e3a27a5204da" "anaconda" verify_py313 ;; "MacOSX-arm64" ) install_script "Anaconda3-2025.06-0-MacOSX-arm64" "https://repo.anaconda.com/archive/Anaconda3-2025.06-0-MacOSX-arm64.sh#195f234204e2f18803cea38bbebefcaac5a3d8d95e2e4ee106d1b87b23b9fc4a" "anaconda" verify_py313 ;; "MacOSX-x86_64" ) install_script "Anaconda3-2025.06-0-MacOSX-x86_64" "https://repo.anaconda.com/archive/Anaconda3-2025.06-0-MacOSX-x86_64.sh#8625a155ff1d2848afa360e70357e14c25f0ac7ac21e4e4bf15015bc58b08d06" "anaconda" verify_py313 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Anaconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/anaconda3-2025.06-1000066400000000000000000000022451517431316200266410ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Anaconda3-2025.06-1-Linux-aarch64" "https://repo.anaconda.com/archive/Anaconda3-2025.06-1-Linux-aarch64.sh#98dfb82732991f3f4d385a265da5fd2190d65ec31ceafa0b93f3c5edf4431a5b" "anaconda" verify_py313 ;; "Linux-x86_64" ) install_script "Anaconda3-2025.06-1-Linux-x86_64" "https://repo.anaconda.com/archive/Anaconda3-2025.06-1-Linux-x86_64.sh#82976426a2c91fe1453281def386f9ebebd8fdb45dc6c970b54cfef4e9120857" "anaconda" verify_py313 ;; "MacOSX-arm64" ) install_script "Anaconda3-2025.06-1-MacOSX-arm64" "https://repo.anaconda.com/archive/Anaconda3-2025.06-1-MacOSX-arm64.sh#f9366a024ac6f043dc224986c54f1b4e1226e6ccb6291d83bdadb489f159d847" "anaconda" verify_py313 ;; "MacOSX-x86_64" ) install_script "Anaconda3-2025.06-1-MacOSX-x86_64" "https://repo.anaconda.com/archive/Anaconda3-2025.06-1-MacOSX-x86_64.sh#58139fe195337f3041259e3a611339ed3afa4d164cc9aa2a7e8e84c0673e3670" "anaconda" verify_py313 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Anaconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/anaconda3-2025.12-1000066400000000000000000000016671517431316200266450ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Anaconda3-2025.12-1-Linux-aarch64" "https://repo.anaconda.com/archive/Anaconda3-2025.12-1-Linux-aarch64.sh#9ba6b32919dfd1964377a4ac5c5e4de645b6bd09efab4a25aaf6e121a60e525c" "anaconda" verify_py313 ;; "Linux-x86_64" ) install_script "Anaconda3-2025.12-1-Linux-x86_64" "https://repo.anaconda.com/archive/Anaconda3-2025.12-1-Linux-x86_64.sh#132f1f312d05e391906b959ad83aa411b97ece55966bb34df011ef41ba60a35c" "anaconda" verify_py313 ;; "MacOSX-arm64" ) install_script "Anaconda3-2025.12-1-MacOSX-arm64" "https://repo.anaconda.com/archive/Anaconda3-2025.12-1-MacOSX-arm64.sh#f998f0918b9f06e08c3444f2b2c897fd3036da6725441ca064aa71ad47c75481" "anaconda" verify_py313 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Anaconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/anaconda3-2025.12-2000066400000000000000000000016671517431316200266460ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Anaconda3-2025.12-2-Linux-aarch64" "https://repo.anaconda.com/archive/Anaconda3-2025.12-2-Linux-aarch64.sh#be13a20f31d82508a061984fa3555369cfd8e4692643721415c19e7dc2e9e0f9" "anaconda" verify_py313 ;; "Linux-x86_64" ) install_script "Anaconda3-2025.12-2-Linux-x86_64" "https://repo.anaconda.com/archive/Anaconda3-2025.12-2-Linux-x86_64.sh#57b2b48cc5b8665e25fce7011f0389d47c1288288007844b3b1ba482d4f39029" "anaconda" verify_py313 ;; "MacOSX-arm64" ) install_script "Anaconda3-2025.12-2-MacOSX-arm64" "https://repo.anaconda.com/archive/Anaconda3-2025.12-2-MacOSX-arm64.sh#8d0b858358456d4ee159feb0c4ee6d635590b777f8b9ffa4aa7553c469aae2b6" "anaconda" verify_py313 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Anaconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/anaconda3-4.0.0000066400000000000000000000016241517431316200263260ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86" ) install_script "Anaconda3-4.0.0-Linux-x86" "https://repo.continuum.io/archive/Anaconda3-4.0.0-Linux-x86.sh#e1469fa0d24de12f33661ce3d7a06d77968be8822f366a61a0018a3850ab56b0" "anaconda" verify_py35 ;; "Linux-x86_64" ) install_script "Anaconda3-4.0.0-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda3-4.0.0-Linux-x86_64.sh#36a558a1109868661a5735f5f32607643f6dc05cf581fefb1c10fb8abbe22f39" "anaconda" verify_py35 ;; "MacOSX-x86_64" ) install_script "Anaconda3-4.0.0-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda3-4.0.0-MacOSX-x86_64.sh#704a776c0cf3fcca6e0c5a1e6b6043728229cfac813bff28f003157771824036" "anaconda" verify_py35 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Anaconda3 is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/anaconda3-4.1.0000066400000000000000000000016241517431316200263270ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86" ) install_script "Anaconda3-4.1.0-Linux-x86" "https://repo.continuum.io/archive/Anaconda3-4.1.0-Linux-x86.sh#7764093f337a43e4962b12d01508c1a385f0f62c1ddc006b69af95ae763fc4c2" "anaconda" verify_py35 ;; "Linux-x86_64" ) install_script "Anaconda3-4.1.0-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda3-4.1.0-Linux-x86_64.sh#11d32cf4026603d3b327dc4299863be6b815905ff51a80329085e1bb9f96c8bd" "anaconda" verify_py35 ;; "MacOSX-x86_64" ) install_script "Anaconda3-4.1.0-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda3-4.1.0-MacOSX-x86_64.sh#4c45c8d75665fa5194ebe4e355d3427f5aa385f77eb2b5002c0c78d8ae7f2200" "anaconda" verify_py35 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Anaconda3 is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/anaconda3-4.1.1000066400000000000000000000016241517431316200263300ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86" ) install_script "Anaconda3-4.1.1-Linux-x86" "https://repo.continuum.io/archive/Anaconda3-4.1.1-Linux-x86.sh#931626363f4030c7a1e8897549b1d3589dc3f429874dc3dd8a79869ecf5c895c" "anaconda" verify_py35 ;; "Linux-x86_64" ) install_script "Anaconda3-4.1.1-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda3-4.1.1-Linux-x86_64.sh#4f5c95feb0e7efeadd3d348dcef117d7787c799f24b0429e45017008f3534e55" "anaconda" verify_py35 ;; "MacOSX-x86_64" ) install_script "Anaconda3-4.1.1-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda3-4.1.1-MacOSX-x86_64.sh#7c3c06e9281c41f1213d357cb5f233fd99d6d0db6bdba8d9fd7cfad1f1a85df9" "anaconda" verify_py35 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Anaconda3 is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/anaconda3-4.2.0000066400000000000000000000016241517431316200263300ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86" ) install_script "Anaconda3-4.2.0-Linux-x86" "https://repo.continuum.io/archive/Anaconda3-4.2.0-Linux-x86.sh#1a8320635f2f06ec9d8610e77d6d0f9cb2c5d11d20a4ff7fcda113e04b0a8a50" "anaconda" verify_py35 ;; "Linux-x86_64" ) install_script "Anaconda3-4.2.0-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda3-4.2.0-Linux-x86_64.sh#73b51715a12b6382dd4df3dd1905b531bd6792d4aa7273b2377a0436d45f0e78" "anaconda" verify_py35 ;; "MacOSX-x86_64" ) install_script "Anaconda3-4.2.0-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda3-4.2.0-MacOSX-x86_64.sh#95448921601e1952e01a17ba9767cd3621c154af7fc52dd6b7f57d462155a358" "anaconda" verify_py35 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Anaconda3 is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/anaconda3-4.3.0000066400000000000000000000016241517431316200263310ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86" ) install_script "Anaconda3-4.3.0-Linux-x86" "https://repo.continuum.io/archive/Anaconda3-4.3.0-Linux-x86.sh#f7ce2eeec3e42c2ba1ee3b9fcd670478fd30f4be547c6e0a675d183c4ca9dd9b" "anaconda" verify_py36 ;; "Linux-x86_64" ) install_script "Anaconda3-4.3.0-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda3-4.3.0-Linux-x86_64.sh#e9169c3a5029aa820393ac92704eb9ee0701778a085ca7bdc3c57b388ac1beb6" "anaconda" verify_py36 ;; "MacOSX-x86_64" ) install_script "Anaconda3-4.3.0-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda3-4.3.0-MacOSX-x86_64.sh#c53059b810c5e7a9a5ef9c46a7ed76675dfc7183f4ea867b4d81449cbd5a093d" "anaconda" verify_py36 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Anaconda3 is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/anaconda3-4.3.1000066400000000000000000000016241517431316200263320ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86" ) install_script "Anaconda3-4.3.1-Linux-x86" "https://repo.continuum.io/archive/Anaconda3-4.3.1-Linux-x86.sh#7b70bdba282a18ddbdc167afe8131f7532076cb1df8d3fbbd13e79ca3afaa2c1" "anaconda" verify_py36 ;; "Linux-x86_64" ) install_script "Anaconda3-4.3.1-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda3-4.3.1-Linux-x86_64.sh#4447b93d2c779201e5fb50cfc45de0ec96c3804e7ad0fe201ab6b99f73e90302" "anaconda" verify_py36 ;; "MacOSX-x86_64" ) install_script "Anaconda3-4.3.1-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda3-4.3.1-MacOSX-x86_64.sh#a42267203e207cb5e0f539e0d879ead12e436311825c7114d0edd880d001b539" "anaconda" verify_py36 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Anaconda3 is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/anaconda3-4.4.0000066400000000000000000000016241517431316200263320ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86" ) install_script "Anaconda3-4.4.0-Linux-x86" "https://repo.continuum.io/archive/Anaconda3-4.4.0-Linux-x86.sh#b0e492206d43067314b25963bc7d1f012096ca0323b7629f4ebcd071b03905b5" "anaconda" verify_py36 ;; "Linux-x86_64" ) install_script "Anaconda3-4.4.0-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda3-4.4.0-Linux-x86_64.sh#3301b37e402f3ff3df216fe0458f1e6a4ccbb7e67b4d626eae9651de5ea3ab63" "anaconda" verify_py36 ;; "MacOSX-x86_64" ) install_script "Anaconda3-4.4.0-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda3-4.4.0-MacOSX-x86_64.sh#10fe58f09ae524df2548d17b8bb1e75db17da597a6ec10d695ce01387a2d7422" "anaconda" verify_py36 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Anaconda3 is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/anaconda3-5.0.0000066400000000000000000000016341517431316200263300ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86" ) install_script "Anaconda3-5.0.0.1-Linux-x86" "https://repo.continuum.io/archive/Anaconda3-5.0.0.1-Linux-x86.sh#407576899d3aa546bc3c2c4a13cbc18ab5bab372c3388ea80087f29b32184bee" "anaconda" verify_py36 ;; "Linux-x86_64" ) install_script "Anaconda3-5.0.0.1-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda3-5.0.0.1-Linux-x86_64.sh#092c92427f44687d789a41922ce8426fbdc3c529cc9d6d4ee6de5b62954b93b2" "anaconda" verify_py36 ;; "MacOSX-x86_64" ) install_script "Anaconda3-5.0.0-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda3-5.0.0-MacOSX-x86_64.sh#23df1e3a38a6b4aaa0ab559d0c1e51be76eca5d75cb595d473d223c8d17e762d" "anaconda" verify_py36 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Anaconda3 is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/anaconda3-5.0.1000066400000000000000000000016241517431316200263300ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86" ) install_script "Anaconda3-5.0.1-Linux-x86" "https://repo.continuum.io/archive/Anaconda3-5.0.1-Linux-x86.sh#991a4b656fcb0236864fbb27ff03bb7f3d98579205829b76b66f65cfa6734240" "anaconda" verify_py36 ;; "Linux-x86_64" ) install_script "Anaconda3-5.0.1-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda3-5.0.1-Linux-x86_64.sh#55e4db1919f49c92d5abbf27a4be5986ae157f074bf9f8238963cd4582a4068a" "anaconda" verify_py36 ;; "MacOSX-x86_64" ) install_script "Anaconda3-5.0.1-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda3-5.0.1-MacOSX-x86_64.sh#f438a0af923bc1edc7bca53f496c59a668d1a08b48c768f443ad7f5ea2b8b3f8" "anaconda" verify_py36 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Anaconda3 is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/anaconda3-5.1.0000066400000000000000000000016241517431316200263300ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86" ) install_script "Anaconda3-5.1.0-Linux-x86" "https://repo.continuum.io/archive/Anaconda3-5.1.0-Linux-x86.sh#0e940272517d8f8a6f26316a19e4be2bdaea8477a3a32cc2ecee7b48fd0fae84" "anaconda" verify_py36 ;; "Linux-x86_64" ) install_script "Anaconda3-5.1.0-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda3-5.1.0-Linux-x86_64.sh#7e6785caad25e33930bc03fac4994a434a21bc8401817b7efa28f53619fa9c29" "anaconda" verify_py36 ;; "MacOSX-x86_64" ) install_script "Anaconda3-5.1.0-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda3-5.1.0-MacOSX-x86_64.sh#be705b3c3a0ca29ee32ce7658890bb5edb32a9eadedc09dec3d7e3cfbfd23cb7" "anaconda" verify_py36 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Anaconda3 is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/anaconda3-5.2.0000066400000000000000000000016241517431316200263310ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86" ) install_script "Anaconda3-5.2.0-Linux-x86" "https://repo.continuum.io/archive/Anaconda3-5.2.0-Linux-x86.sh#f3527d085d06f35b6aeb96be2a9253ff9ec9ced3dc913c8e27e086329f3db588" "anaconda" verify_py36 ;; "Linux-x86_64" ) install_script "Anaconda3-5.2.0-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda3-5.2.0-Linux-x86_64.sh#09f53738b0cd3bb96f5b1bac488e5528df9906be2480fe61df40e0e0d19e3d48" "anaconda" verify_py36 ;; "MacOSX-x86_64" ) install_script "Anaconda3-5.2.0-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda3-5.2.0-MacOSX-x86_64.sh#c8089121dc89ffe8f9a0c01205bab75a112821a13d413152d6690f5eef094afa" "anaconda" verify_py36 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Anaconda3 is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/anaconda3-5.3.0000066400000000000000000000016241517431316200263320ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86" ) install_script "Anaconda3-5.3.0-Linux-x86" "https://repo.continuum.io/archive/Anaconda3-5.3.0-Linux-x86.sh#c15ffac2ae35179a15dc5872e5bb405b4027a0fd76c6817e9cee39545bc5ca0b" "anaconda" verify_py36 ;; "Linux-x86_64" ) install_script "Anaconda3-5.3.0-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda3-5.3.0-Linux-x86_64.sh#cfbf5fe70dd1b797ec677e63c61f8efc92dad930fd1c94d60390bb07fdc09959" "anaconda" verify_py36 ;; "MacOSX-x86_64" ) install_script "Anaconda3-5.3.0-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda3-5.3.0-MacOSX-x86_64.sh#bc073b6e6d3b2ef29d01a2caf1de7c206c95968231ef0492d958eae1a314b4e9" "anaconda" verify_py36 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Anaconda3 is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/anaconda3-5.3.1000066400000000000000000000016351517431316200263350ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86" ) install_script "Anaconda3-5.3.1-Linux-x86.sh" "https://repo.continuum.io/archive/Anaconda3-5.3.1-Linux-x86.sh#5dab8b2c95595df7fa55b88643f8372135c14faabd9ec05a34021551bb0999a1" "anaconda" verify_py36 ;; "Linux-x86_64" ) install_script "Anaconda3-5.3.1-Linux-x86_64.sh" "https://repo.continuum.io/archive/Anaconda3-5.3.1-Linux-x86_64.sh#d4c4256a8f46173b675dd6a62d12f566ed3487f932bab6bb7058f06c124bcc27" "anaconda" verify_py36 ;; "MacOSX-x86_64" ) install_script "Anaconda3-5.3.1-MacOSX-x86_64.sh" "https://repo.continuum.io/archive/Anaconda3-5.3.1-MacOSX-x86_64.sh#23c373abce2463d4df495f5a1c7e8b0faec6eda09542d98f41ed65a0fa0dbde0" "anaconda" verify_py36 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Anaconda3 is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/cinder-3.10-dev000066400000000000000000000027271517431316200264460ustar00rootroot00000000000000if [ "$(expr substr "$(uname -s)" 1 5)" != "Linux" ]; then { echo colorize 1 "ERROR" echo ": Cinder currently only supports Linux." echo return 1 } >&2 fi if [[ $(${CC:-gcc} -dumpversion 2>/dev/null) != 10 ]] && (command -v "gcc-10" >/dev/null) && (command -v "g++-10" >/dev/null); then echo "python-build: setting the compiler to GCC 10" export CC="gcc-10" export CXX="g++-10" fi if [[ $(awk -F. '{print $1}' <<< "$(${CC:-gcc} -dumpversion)") -lt 10 ]]; then { echo colorize 1 "ERROR" echo ": Cinder requires at least GCC 10." echo return 1 } >&2 fi require_distro Fedora 32 &> /dev/null || { echo colorize 1 "WARNING" echo ": Cinder officially only supports Facebook's Docker" echo "images which are based on Fedora 32. It may fail to build" echo "on a system with a different GCC and/or Glibc version." echo } >&2 prefer_openssl11 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-1.1.1n" "https://www.openssl.org/source/openssl-1.1.1n.tar.gz#40dceb51a4f6a5275bde0e6bf20ef4b91bfc32ed57c0552e2e8e15463372b17a" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline install_git "Cinder-3.10-dev" "https://github.com/facebookincubator/cinder" "cinder/3.10" standard verify_py310 copy_python_gdb ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/cinder-3.8-dev000066400000000000000000000027241517431316200263720ustar00rootroot00000000000000if [ "$(expr substr "$(uname -s)" 1 5)" != "Linux" ]; then { echo colorize 1 "ERROR" echo ": Cinder currently only supports Linux." echo return 1 } >&2 fi if [[ $(${CC:-gcc} -dumpversion 2>/dev/null) != 10 ]] && (command -v "gcc-10" >/dev/null) && (command -v "g++-10" >/dev/null); then echo "python-build: setting the compiler to GCC 10" export CC="gcc-10" export CXX="g++-10" fi if [[ $(awk -F. '{print $1}' <<< "$(${CC:-gcc} -dumpversion)") -lt 10 ]]; then { echo colorize 1 "ERROR" echo ": Cinder requires at least GCC 10." echo return 1 } >&2 fi require_distro Fedora 32 &> /dev/null || { echo colorize 1 "WARNING" echo ": Cinder officially only supports Facebook's Docker" echo "images which are based on Fedora 32. It may fail to build" echo "on a system with a different GCC and/or Glibc version." echo } >&2 prefer_openssl11 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-1.1.1k" "https://www.openssl.org/source/openssl-1.1.1k.tar.gz#892a0875b9872acd04a9fde79b1f943075d5ea162415de3047c327df33fbaee5" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline install_git "Cinder-3.8-dev" "https://github.com/facebookincubator/cinder" "cinder/3.8" standard verify_py38 copy_python_gdb ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/graalpy-22.3.0000066400000000000000000000041401517431316200262150ustar00rootroot00000000000000# Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved. # # Permission is hereby granted, free of charge, to any person obtaining a copy of # this software and associated documentation files (the "Software"), to deal in # the Software without restriction, including without limitation the rights to # use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies # of the Software, and to permit persons to whom the Software is furnished to do # so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. VERSION='22.3.0' BUILD='' graalpy_arch="$(graalpy_architecture 2>/dev/null || true)" case "$graalpy_arch" in "linux-amd64" ) checksum="9853036fcde0b115026d8802a4f671b62d7a17fccb269c1e8b5fbf80cef10e23" ;; "linux-aarch64" ) checksum="c48c5d9ff5699046c0629181a40a3116172e1c508c851f0993dcca45d86349c0" ;; "macos-amd64" ) checksum="cc8454f460b5730e778d5b8f79385cf92c39321fbf27d44bb9ca90584670f921" ;; "macos-aarch64" ) checksum="9a388834f28fbb86ff9588d9a150a4d26e9bec28be06c3d60ebe20079f855e41" ;; * ) { echo colorize 1 "ERROR" echo ": No binary distribution of GraalPy is available for $(uname -sm)." echo } >&2 exit 1 ;; esac if [ -n "${BUILD}" ]; then urlprefix="https://github.com/graalvm/graalvm-ce-dev-builds/releases/download/${VERSION}-${BUILD}" else urlprefix="https://github.com/oracle/graalpython/releases/download/vm-${VERSION}" fi install_package "graalpy-${VERSION}${BUILD}" "${urlprefix}/graalpy-${VERSION}-${graalpy_arch}.tar.gz#${checksum}" "copy" ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/graalpy-23.0.0000066400000000000000000000041471517431316200262220ustar00rootroot00000000000000# Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. # # Permission is hereby granted, free of charge, to any person obtaining a copy of # this software and associated documentation files (the "Software"), to deal in # the Software without restriction, including without limitation the rights to # use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies # of the Software, and to permit persons to whom the Software is furnished to do # so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. VERSION='23.0.0' BUILD='' graalpy_arch="$(graalpy_architecture 2>/dev/null || true)" case "$graalpy_arch" in "linux-amd64" ) checksum="25e4fa7c1d45db6dcac5bfa4d1a0aa9ef5581623dc5903ce98d246c5d394639c" ;; "linux-aarch64" ) checksum="e2a00b2b6485282b4a04aa382e30d696e00d20eb2fe1736debbe2d9df2a8737a" ;; "macos-amd64" ) checksum="1578902976e6aaf45b9758931f0bddbb29c5c9bdca62c67591d6e153340c2a4f" ;; "macos-aarch64" ) checksum="cc40e1d47610c5f4a825a1a7c3ffe8b163c71b5d042d16aebd1a65451d4309a5" ;; * ) { echo colorize 1 "ERROR" echo ": No binary distribution of GraalPy is available for $(uname -sm)." echo } >&2 exit 1 ;; esac if [ -n "${BUILD}" ]; then urlprefix="https://github.com/graalvm/graalvm-ce-dev-builds/releases/download/${VERSION}-${BUILD}" else urlprefix="https://github.com/oracle/graalpython/releases/download/graal-${VERSION}" fi install_package "graalpy-${VERSION}${BUILD}" "${urlprefix}/graalpython-${VERSION}-${graalpy_arch}.tar.gz#${checksum}" "copy" ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/graalpy-23.1.0000066400000000000000000000050341517431316200262170ustar00rootroot00000000000000# Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. # # Permission is hereby granted, free of charge, to any person obtaining a copy of # this software and associated documentation files (the "Software"), to deal in # the Software without restriction, including without limitation the rights to # use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies # of the Software, and to permit persons to whom the Software is furnished to do # so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. VERSION='23.1.0' BUILD='' colorize 1 "GraalPy 23.1 and later installed by python-build use the faster Oracle GraalVM distribution" && echo colorize 1 "Oracle GraalVM uses the GFTC license, which is free for development and production use, see https://medium.com/graalvm/161527df3d76" && echo colorize 1 "The GraalVM Community Edition variant of GraalPy is also available, under the name graalpy-community-23.1.0" && echo graalpy_arch="$(graalpy_architecture 2>/dev/null || true)" case "$graalpy_arch" in "linux-amd64" ) checksum="afbb81f034e77aecf4717fe14f2a7403aa1b82f0abf53a2e55e46bd49efe8c39" ;; "linux-aarch64" ) checksum="be1e21ea245ddbdb9c266e670d6f1e76a55c693f98cee44aa74a76b249e53f96" ;; "macos-amd64" ) checksum="6445537c597567ccf5ae37d296ecd988a92149fb4a1fb57088811e75f19c6da4" ;; "macos-aarch64" ) checksum="f1b9b22cd8c0afb7eabd59fad554c23f452fbafcdffccf8a22eca037199d62ae" ;; * ) { echo colorize 1 "ERROR" echo ": No binary distribution of GraalPy is available for $(uname -sm)." echo } >&2 exit 1 ;; esac if [ -n "${BUILD}" ]; then { echo colorize 1 "ERROR" echo "Oracle GraalPy currently doesn't provide snapshot builds. Use graalpy-community if you need snapshots." echo } >&2 exit 1 fi url="https://github.com/oracle/graalpython/releases/download/graal-${VERSION}/graalpy-${VERSION}-${graalpy_arch}.tar.gz#${checksum}" install_package "graalpy-${VERSION}" "${url}" "copy" ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/graalpy-23.1.2000066400000000000000000000050351517431316200262220ustar00rootroot00000000000000# Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. # # Permission is hereby granted, free of charge, to any person obtaining a copy of # this software and associated documentation files (the "Software"), to deal in # the Software without restriction, including without limitation the rights to # use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies # of the Software, and to permit persons to whom the Software is furnished to do # so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. VERSION='23.1.2' BUILD='' colorize 1 "GraalPy 23.1 and later installed by python-build use the faster Oracle GraalVM distribution" && echo colorize 1 "Oracle GraalVM uses the GFTC license, which is free for development and production use, see https://medium.com/graalvm/161527df3d76" && echo colorize 1 "The GraalVM Community Edition variant of GraalPy is also available, under the name graalpy-community-23.1.2" && echo graalpy_arch="$(graalpy_architecture 2>/dev/null || true)" case "$graalpy_arch" in "linux-amd64" ) checksum="ea9c61845968dd396f57bbb6bb6ccf1608b198dffd99c6fe2e5c03d836e40a74" ;; "linux-aarch64" ) checksum="715cc67f551a009a04814e7201bc33e629ba6c329e7d32c265a3ebf8619f4a66" ;; "macos-amd64" ) checksum="e9e5977077ef4986fce0f8416b81c1c468add9f3f123edfb223b54a5d34a95c6" ;; "macos-aarch64" ) checksum="46c859233c7c5ce44fc44e97f17a1685dc3f8516785c2e419f8661ed7b5185b1" ;; * ) { echo colorize 1 "ERROR" echo ": No binary distribution of GraalPy is available for $(uname -sm)." echo } >&2 exit 1 ;; esac if [ -n "${BUILD}" ]; then { echo colorize 1 "ERROR" echo "Oracle GraalPy currently doesn't provide snapshot builds. Use graalpy-community if you need snapshots." echo } >&2 exit 1 fi url="https://github.com/oracle/graalpython/releases/download/graal-${VERSION}/graalpy-${VERSION}-${graalpy_arch}.tar.gz#${checksum}" install_package "graalpy-${VERSION}" "${url}" "copy" ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/graalpy-24.0.0000066400000000000000000000050411517431316200262150ustar00rootroot00000000000000# Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. # # Permission is hereby granted, free of charge, to any person obtaining a copy of # this software and associated documentation files (the "Software"), to deal in # the Software without restriction, including without limitation the rights to # use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies # of the Software, and to permit persons to whom the Software is furnished to do # so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. VERSION='24.0.0' BUILD='' colorize 1 "GraalPy 23.1 and later installed by python-build use the faster Oracle GraalVM distribution" && echo colorize 1 "Oracle GraalVM uses the GFTC license, which is free for development and production use, see https://medium.com/graalvm/161527df3d76" && echo colorize 1 "The GraalVM Community Edition variant of GraalPy is also available, under the name graalpy-community-${VERSION}" && echo graalpy_arch="$(graalpy_architecture 2>/dev/null || true)" case "$graalpy_arch" in "linux-amd64" ) checksum="f0d194dea76da26093b9b01b78c0fcabbd8714640b08fcd2a9b05b9ded3e2039" ;; "linux-aarch64" ) checksum="5bf0fd9d115c3ecd6bfb89a2fac7b9ba9343841c3928d14eac471b9b1ad1266e" ;; "macos-amd64" ) checksum="1e2e51ea618bd6f6fe9a0248486b5962f6258193249c0657dc0480fd2b92d772" ;; "macos-aarch64" ) checksum="d5597711839a41506beb129f9d8015f8997a1db1e0c79972636834d955d4ef61" ;; * ) { echo colorize 1 "ERROR" echo ": No binary distribution of GraalPy is available for $(uname -sm)." echo } >&2 exit 1 ;; esac if [ -n "${BUILD}" ]; then { echo colorize 1 "ERROR" echo "Oracle GraalPy currently doesn't provide snapshot builds. Use graalpy-community if you need snapshots." echo } >&2 exit 1 fi url="https://github.com/oracle/graalpython/releases/download/graal-${VERSION}/graalpy-${VERSION}-${graalpy_arch}.tar.gz#${checksum}" install_package "graalpy-${VERSION}" "${url}" "copy" ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/graalpy-24.1.0000066400000000000000000000050411517431316200262160ustar00rootroot00000000000000# Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. # # Permission is hereby granted, free of charge, to any person obtaining a copy of # this software and associated documentation files (the "Software"), to deal in # the Software without restriction, including without limitation the rights to # use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies # of the Software, and to permit persons to whom the Software is furnished to do # so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. VERSION='24.1.0' BUILD='' colorize 1 "GraalPy 23.1 and later installed by python-build use the faster Oracle GraalVM distribution" && echo colorize 1 "Oracle GraalVM uses the GFTC license, which is free for development and production use, see https://medium.com/graalvm/161527df3d76" && echo colorize 1 "The GraalVM Community Edition variant of GraalPy is also available, under the name graalpy-community-${VERSION}" && echo graalpy_arch="$(graalpy_architecture 2>/dev/null || true)" case "$graalpy_arch" in "linux-amd64" ) checksum="95819091eee7c21566601c22536768204b7c75e9b59e522a10961612a1dd6298" ;; "linux-aarch64" ) checksum="838662e07ce745708d58a50e5e030f9af608306c4595adb3a8e7ac1f6e7d8b6a" ;; "macos-amd64" ) checksum="4bee92fdf97ef9e2f9a8dfc56030b9f40860019bf57c9cd097a4b86baaf31d94" ;; "macos-aarch64" ) checksum="520888b407e47c8bbc91b0830d540a1eb1a6919ad0ce5be3e657e54f77ee0fba" ;; * ) { echo colorize 1 "ERROR" echo ": No binary distribution of GraalPy is available for $(uname -sm)." echo } >&2 exit 1 ;; esac if [ -n "${BUILD}" ]; then { echo colorize 1 "ERROR" echo "Oracle GraalPy currently doesn't provide snapshot builds. Use graalpy-community if you need snapshots." echo } >&2 exit 1 fi url="https://github.com/oracle/graalpython/releases/download/graal-${VERSION}/graalpy-${VERSION}-${graalpy_arch}.tar.gz#${checksum}" install_package "graalpy-${VERSION}" "${url}" "copy" ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/graalpy-24.1.1000066400000000000000000000050411517431316200262170ustar00rootroot00000000000000# Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. # # Permission is hereby granted, free of charge, to any person obtaining a copy of # this software and associated documentation files (the "Software"), to deal in # the Software without restriction, including without limitation the rights to # use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies # of the Software, and to permit persons to whom the Software is furnished to do # so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. VERSION='24.1.1' BUILD='' colorize 1 "GraalPy 23.1 and later installed by python-build use the faster Oracle GraalVM distribution" && echo colorize 1 "Oracle GraalVM uses the GFTC license, which is free for development and production use, see https://medium.com/graalvm/161527df3d76" && echo colorize 1 "The GraalVM Community Edition variant of GraalPy is also available, under the name graalpy-community-${VERSION}" && echo graalpy_arch="$(graalpy_architecture 2>/dev/null || true)" case "$graalpy_arch" in "linux-amd64" ) checksum="b7ec8b6ead8f0ad19d212617f75c305b38d419bfd3ac6c9e82e9339282699ab9" ;; "linux-aarch64" ) checksum="cb97bbef83372f00c7ea5f351bcb3c1ad36255ebd7d3cff9267d604ad183c28a" ;; "macos-amd64" ) checksum="3f4583cf8438237a2061460d4df9025d04eaaae0beadb3626ccdcebf9cfe725a" ;; "macos-aarch64" ) checksum="23d2397d90ebbd51747541f029ed80b7740fe36b23a45d4616ddad9b60f2c6cb" ;; * ) { echo colorize 1 "ERROR" echo ": No binary distribution of GraalPy is available for $(uname -sm)." echo } >&2 exit 1 ;; esac if [ -n "${BUILD}" ]; then { echo colorize 1 "ERROR" echo "Oracle GraalPy currently doesn't provide snapshot builds. Use graalpy-community if you need snapshots." echo } >&2 exit 1 fi url="https://github.com/oracle/graalpython/releases/download/graal-${VERSION}/graalpy-${VERSION}-${graalpy_arch}.tar.gz#${checksum}" install_package "graalpy-${VERSION}" "${url}" "copy" ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/graalpy-24.1.2000066400000000000000000000050411517431316200262200ustar00rootroot00000000000000# Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. # # Permission is hereby granted, free of charge, to any person obtaining a copy of # this software and associated documentation files (the "Software"), to deal in # the Software without restriction, including without limitation the rights to # use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies # of the Software, and to permit persons to whom the Software is furnished to do # so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. VERSION='24.1.2' BUILD='' colorize 1 "GraalPy 23.1 and later installed by python-build use the faster Oracle GraalVM distribution" && echo colorize 1 "Oracle GraalVM uses the GFTC license, which is free for development and production use, see https://medium.com/graalvm/161527df3d76" && echo colorize 1 "The GraalVM Community Edition variant of GraalPy is also available, under the name graalpy-community-${VERSION}" && echo graalpy_arch="$(graalpy_architecture 2>/dev/null || true)" case "$graalpy_arch" in "linux-amd64" ) checksum="859292dddb7deb47280e445afa61aa58326900e15fbf0d3fa8044f1a1ce23594" ;; "linux-aarch64" ) checksum="5ad46ba7ef58f2b3871cb99aa244ef9bf6e6e4206770e027603e3c323ba3e67b" ;; "macos-amd64" ) checksum="e2eed01618ae788b24e01ab423ff27382e15faa1ecb7c8eb7e9809b022c74fe8" ;; "macos-aarch64" ) checksum="daa1fa51129f1bc4e5f0f2251ce7d0e039019eb9569579bb41aaa905407fa6a3" ;; * ) { echo colorize 1 "ERROR" echo ": No binary distribution of GraalPy is available for $(uname -sm)." echo } >&2 exit 1 ;; esac if [ -n "${BUILD}" ]; then { echo colorize 1 "ERROR" echo "Oracle GraalPy currently doesn't provide snapshot builds. Use graalpy-community if you need snapshots." echo } >&2 exit 1 fi url="https://github.com/oracle/graalpython/releases/download/graal-${VERSION}/graalpy-${VERSION}-${graalpy_arch}.tar.gz#${checksum}" install_package "graalpy-${VERSION}" "${url}" "copy" ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/graalpy-24.2.0000066400000000000000000000050411517431316200262170ustar00rootroot00000000000000# Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. # # Permission is hereby granted, free of charge, to any person obtaining a copy of # this software and associated documentation files (the "Software"), to deal in # the Software without restriction, including without limitation the rights to # use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies # of the Software, and to permit persons to whom the Software is furnished to do # so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. VERSION='24.2.0' BUILD='' colorize 1 "GraalPy 23.1 and later installed by python-build use the faster Oracle GraalVM distribution" && echo colorize 1 "Oracle GraalVM uses the GFTC license, which is free for development and production use, see https://medium.com/graalvm/161527df3d76" && echo colorize 1 "The GraalVM Community Edition variant of GraalPy is also available, under the name graalpy-community-${VERSION}" && echo graalpy_arch="$(graalpy_architecture 2>/dev/null || true)" case "$graalpy_arch" in "linux-amd64" ) checksum="06381ebe89a242bbb66afdc7dc35d21ae537f7eb130f16db1f0e94c2a65249ba" ;; "linux-aarch64" ) checksum="a80f4fe8c4b2ad53af6e5090bab462c7d0797b9b281e35bfc8284b703610c5cf" ;; "macos-amd64" ) checksum="dafd706de39041887d016ef84413f5252d085b03ad47a44a6f680f40ed1a87e4" ;; "macos-aarch64" ) checksum="108ad4c15b814aecc5b69b83a10a3a5e8982c656c4b639740d034a4783eb3839" ;; * ) { echo colorize 1 "ERROR" echo ": No binary distribution of GraalPy is available for $(uname -sm)." echo } >&2 exit 1 ;; esac if [ -n "${BUILD}" ]; then { echo colorize 1 "ERROR" echo "Oracle GraalPy currently doesn't provide snapshot builds. Use graalpy-community if you need snapshots." echo } >&2 exit 1 fi url="https://github.com/oracle/graalpython/releases/download/graal-${VERSION}/graalpy-${VERSION}-${graalpy_arch}.tar.gz#${checksum}" install_package "graalpy-${VERSION}" "${url}" "copy" ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/graalpy-24.2.1000066400000000000000000000050411517431316200262200ustar00rootroot00000000000000# Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. # # Permission is hereby granted, free of charge, to any person obtaining a copy of # this software and associated documentation files (the "Software"), to deal in # the Software without restriction, including without limitation the rights to # use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies # of the Software, and to permit persons to whom the Software is furnished to do # so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. VERSION='24.2.1' BUILD='' colorize 1 "GraalPy 23.1 and later installed by python-build use the faster Oracle GraalVM distribution" && echo colorize 1 "Oracle GraalVM uses the GFTC license, which is free for development and production use, see https://medium.com/graalvm/161527df3d76" && echo colorize 1 "The GraalVM Community Edition variant of GraalPy is also available, under the name graalpy-community-${VERSION}" && echo graalpy_arch="$(graalpy_architecture 2>/dev/null || true)" case "$graalpy_arch" in "linux-amd64" ) checksum="55872af24819cb99efa2338db057aeda0c8f9dd412a4a6f5ea19b256ee82fd9e" ;; "linux-aarch64" ) checksum="2a80800a76ee6b737d6458ba9ab30ce386dfdd5b2b2bec3ee6bc51fd8e51e7c2" ;; "macos-amd64" ) checksum="4bc42b36117c9ab09c4f411ec5a7a85ed58521dd20b529d971bb0ed3d0b7c363" ;; "macos-aarch64" ) checksum="61e11d5176d5bb709b919979ef3525f4db1e39c404b59aa54d887f56bf8fab44" ;; * ) { echo colorize 1 "ERROR" echo ": No binary distribution of GraalPy is available for $(uname -sm)." echo } >&2 exit 1 ;; esac if [ -n "${BUILD}" ]; then { echo colorize 1 "ERROR" echo "Oracle GraalPy currently doesn't provide snapshot builds. Use graalpy-community if you need snapshots." echo } >&2 exit 1 fi url="https://github.com/oracle/graalpython/releases/download/graal-${VERSION}/graalpy-${VERSION}-${graalpy_arch}.tar.gz#${checksum}" install_package "graalpy-${VERSION}" "${url}" "copy" ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/graalpy-24.2.2000066400000000000000000000050411517431316200262210ustar00rootroot00000000000000# Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. # # Permission is hereby granted, free of charge, to any person obtaining a copy of # this software and associated documentation files (the "Software"), to deal in # the Software without restriction, including without limitation the rights to # use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies # of the Software, and to permit persons to whom the Software is furnished to do # so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. VERSION='24.2.2' BUILD='' colorize 1 "GraalPy 23.1 and later installed by python-build use the faster Oracle GraalVM distribution" && echo colorize 1 "Oracle GraalVM uses the GFTC license, which is free for development and production use, see https://medium.com/graalvm/161527df3d76" && echo colorize 1 "The GraalVM Community Edition variant of GraalPy is also available, under the name graalpy-community-${VERSION}" && echo graalpy_arch="$(graalpy_architecture 2>/dev/null || true)" case "$graalpy_arch" in "linux-amd64" ) checksum="604b7abf6c58038a30866e52da43818af63bcd97909af8b1a96523c7f0e01414" ;; "linux-aarch64" ) checksum="c9be459ab9479892b88dd63f8f88cbc7b1067f4cb27ff17f4761b36de6bd73af" ;; "macos-amd64" ) checksum="2f4d5e7dbdf90e38778dfcb8ca3e1ec7eee257ef726b1937d5bc91b54cdddf9b" ;; "macos-aarch64" ) checksum="f4a2ae01bae0fa53ec0d19f86d73c6dcc2a162d245552030183b84bfdd8f7635" ;; * ) { echo colorize 1 "ERROR" echo ": No binary distribution of GraalPy is available for $(uname -sm)." echo } >&2 exit 1 ;; esac if [ -n "${BUILD}" ]; then { echo colorize 1 "ERROR" echo "Oracle GraalPy currently doesn't provide snapshot builds. Use graalpy-community if you need snapshots." echo } >&2 exit 1 fi url="https://github.com/oracle/graalpython/releases/download/graal-${VERSION}/graalpy-${VERSION}-${graalpy_arch}.tar.gz#${checksum}" install_package "graalpy-${VERSION}" "${url}" "copy" ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/graalpy-25.0.0000066400000000000000000000050411517431316200262160ustar00rootroot00000000000000# Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. # # Permission is hereby granted, free of charge, to any person obtaining a copy of # this software and associated documentation files (the "Software"), to deal in # the Software without restriction, including without limitation the rights to # use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies # of the Software, and to permit persons to whom the Software is furnished to do # so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. VERSION='25.0.0' BUILD='' colorize 1 "GraalPy 23.1 and later installed by python-build use the faster Oracle GraalVM distribution" && echo colorize 1 "Oracle GraalVM uses the GFTC license, which is free for development and production use, see https://medium.com/graalvm/161527df3d76" && echo colorize 1 "The GraalVM Community Edition variant of GraalPy is also available, under the name graalpy-community-${VERSION}" && echo graalpy_arch="$(graalpy_architecture 2>/dev/null || true)" case "$graalpy_arch" in "linux-amd64" ) checksum="8ca62fc996b4dcad146ff37139d22a8478959bde73789bfdd1e396287cd09dff" ;; "linux-aarch64" ) checksum="e0008c00e8e925268d592de808839d913609e9f29b0e0dd9b69c795aabb64e2a" ;; "macos-amd64" ) checksum="1709a02b2abc93cf698b95ddd6d8bbf43ddc7b268b09a9e5bced4e637d37369f" ;; "macos-aarch64" ) checksum="4dfff34a4cfeb2c11441ce807c455719945b7f580bdec47d36daba342925a413" ;; * ) { echo colorize 1 "ERROR" echo ": No binary distribution of GraalPy is available for $(uname -sm)." echo } >&2 exit 1 ;; esac if [ -n "${BUILD}" ]; then { echo colorize 1 "ERROR" echo "Oracle GraalPy currently doesn't provide snapshot builds. Use graalpy-community if you need snapshots." echo } >&2 exit 1 fi url="https://github.com/oracle/graalpython/releases/download/graal-${VERSION}/graalpy-${VERSION}-${graalpy_arch}.tar.gz#${checksum}" install_package "graalpy-${VERSION}" "${url}" "copy" ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/graalpy-25.0.1000066400000000000000000000050411517431316200262170ustar00rootroot00000000000000# Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. # # Permission is hereby granted, free of charge, to any person obtaining a copy of # this software and associated documentation files (the "Software"), to deal in # the Software without restriction, including without limitation the rights to # use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies # of the Software, and to permit persons to whom the Software is furnished to do # so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. VERSION='25.0.1' BUILD='' colorize 1 "GraalPy 23.1 and later installed by python-build use the faster Oracle GraalVM distribution" && echo colorize 1 "Oracle GraalVM uses the GFTC license, which is free for development and production use, see https://medium.com/graalvm/161527df3d76" && echo colorize 1 "The GraalVM Community Edition variant of GraalPy is also available, under the name graalpy-community-${VERSION}" && echo graalpy_arch="$(graalpy_architecture 2>/dev/null || true)" case "$graalpy_arch" in "linux-amd64" ) checksum="b5baff786753ebb774300fcf68a9bca4d14cbb8099f055637bee11786abb2d57" ;; "linux-aarch64" ) checksum="f3315d1a3f13e7fcd785d0ca9b954d251da5f5d0dedae094c28a0566a239e4fd" ;; "macos-amd64" ) checksum="10b0721d52397f0cc85f038900318da2203711cbcfae7899e3faed49d3dc6221" ;; "macos-aarch64" ) checksum="389e0732f4d79e30335b70d41b6e8a2d769b435512fcb41675eb3dce4fc4d014" ;; * ) { echo colorize 1 "ERROR" echo ": No binary distribution of GraalPy is available for $(uname -sm)." echo } >&2 exit 1 ;; esac if [ -n "${BUILD}" ]; then { echo colorize 1 "ERROR" echo "Oracle GraalPy currently doesn't provide snapshot builds. Use graalpy-community if you need snapshots." echo } >&2 exit 1 fi url="https://github.com/oracle/graalpython/releases/download/graal-${VERSION}/graalpy-${VERSION}-${graalpy_arch}.tar.gz#${checksum}" install_package "graalpy-${VERSION}" "${url}" "copy" ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/graalpy-25.0.2000066400000000000000000000046761517431316200262350ustar00rootroot00000000000000# Copyright (c) 2026, Oracle and/or its affiliates. All rights reserved. # # Permission is hereby granted, free of charge, to any person obtaining a copy of # this software and associated documentation files (the "Software"), to deal in # the Software without restriction, including without limitation the rights to # use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies # of the Software, and to permit persons to whom the Software is furnished to do # so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. VERSION='25.0.2' BUILD='' colorize 1 "GraalPy 23.1 and later installed by python-build use the faster Oracle GraalVM distribution" && echo colorize 1 "Oracle GraalVM uses the GFTC license, which is free for development and production use, see https://medium.com/graalvm/161527df3d76" && echo colorize 1 "The GraalVM Community Edition variant of GraalPy is also available, under the name graalpy-community-${VERSION}" && echo graalpy_arch="$(graalpy_architecture 2>/dev/null || true)" case "$graalpy_arch" in "linux-amd64" ) checksum="8967e4bae1c5040d62dbc98976f2099d5c36c00a79944e99b848d455e618ecdf" ;; "linux-aarch64" ) checksum="805f3526296e04692b27ca001ba97674e53d0f036412d9ffc29aeb8b51517ab6" ;; "macos-aarch64" ) checksum="c771688b8636932026180bdd9b5e3d6116316fa868faf7e602a60ba020c7bade" ;; * ) { echo colorize 1 "ERROR" echo ": No binary distribution of GraalPy is available for $(uname -sm)." echo } >&2 exit 1 ;; esac if [ -n "${BUILD}" ]; then { echo colorize 1 "ERROR" echo "Oracle GraalPy currently doesn't provide snapshot builds. Use graalpy-community if you need snapshots." echo } >&2 exit 1 fi url="https://github.com/oracle/graalpython/releases/download/graal-${VERSION}/graalpy-${VERSION}-${graalpy_arch}.tar.gz#${checksum}" install_package "graalpy-${VERSION}" "${url}" "copy" ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/graalpy-community-23.1.0000066400000000000000000000042261517431316200302430ustar00rootroot00000000000000# Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. # # Permission is hereby granted, free of charge, to any person obtaining a copy of # this software and associated documentation files (the "Software"), to deal in # the Software without restriction, including without limitation the rights to # use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies # of the Software, and to permit persons to whom the Software is furnished to do # so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. VERSION='23.1.0' BUILD='' graalpy_arch="$(graalpy_architecture 2>/dev/null || true)" case "$graalpy_arch" in "linux-amd64" ) checksum="720334d90d52b5337db018ad6582953e9383c27188f08810250c2fe14a11db5a" ;; "linux-aarch64" ) checksum="c7dc4f94413e667070f7d46f57af04c4db53383e721be9637b58cb030dfa1f58" ;; "macos-amd64" ) checksum="13583382ba716231edce1b71d53e9efba776fef003ef2f515bda9c00a831779a" ;; "macos-aarch64" ) checksum="5bc39af6938c507ec169b02a34237b6f4b286982e5be04b3109c171becc1949d" ;; * ) { echo colorize 1 "ERROR" echo ": No binary distribution of GraalPy is available for $(uname -sm)." echo } >&2 exit 1 ;; esac if [ -n "${BUILD}" ]; then url="https://github.com/graalvm/graalvm-ce-dev-builds/releases/download/${VERSION}-dev-${BUILD}/graalpy-community-dev-${graalpy_arch}.tar.gz" else url="https://github.com/oracle/graalpython/releases/download/graal-${VERSION}/graalpy-community-${VERSION}-${graalpy_arch}.tar.gz#${checksum}" fi install_package "graalpy-community-${VERSION}${BUILD}" "${url}" "copy" ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/graalpy-community-23.1.2000066400000000000000000000042261517431316200302450ustar00rootroot00000000000000# Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. # # Permission is hereby granted, free of charge, to any person obtaining a copy of # this software and associated documentation files (the "Software"), to deal in # the Software without restriction, including without limitation the rights to # use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies # of the Software, and to permit persons to whom the Software is furnished to do # so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. VERSION='23.1.2' BUILD='' graalpy_arch="$(graalpy_architecture 2>/dev/null || true)" case "$graalpy_arch" in "linux-amd64" ) checksum="27577bded9dd742c7b9b8e5315cec286657edb5842968cc966aa451ddc8729d9" ;; "linux-aarch64" ) checksum="c993484132b9e196d351570ba6a74632eb8695767e383ca86ba1092c4484ff7a" ;; "macos-amd64" ) checksum="e74d586f114b33e55e1a6849672e1a0ea5bd372d8f4a501b532d221c61915d3c" ;; "macos-aarch64" ) checksum="d269f5fdb3e8ae323554de2876ef25d43aaa86867edc41f2b76ea53a27ee3662" ;; * ) { echo colorize 1 "ERROR" echo ": No binary distribution of GraalPy is available for $(uname -sm)." echo } >&2 exit 1 ;; esac if [ -n "${BUILD}" ]; then url="https://github.com/graalvm/graalvm-ce-dev-builds/releases/download/${VERSION}-dev-${BUILD}/graalpy-community-dev-${graalpy_arch}.tar.gz" else url="https://github.com/oracle/graalpython/releases/download/graal-${VERSION}/graalpy-community-${VERSION}-${graalpy_arch}.tar.gz#${checksum}" fi install_package "graalpy-community-${VERSION}${BUILD}" "${url}" "copy" ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/graalpy-community-24.0.0000066400000000000000000000042261517431316200302430ustar00rootroot00000000000000# Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. # # Permission is hereby granted, free of charge, to any person obtaining a copy of # this software and associated documentation files (the "Software"), to deal in # the Software without restriction, including without limitation the rights to # use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies # of the Software, and to permit persons to whom the Software is furnished to do # so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. VERSION='24.0.0' BUILD='' graalpy_arch="$(graalpy_architecture 2>/dev/null || true)" case "$graalpy_arch" in "linux-amd64" ) checksum="a77892d8d6b897b70b4226aa1b6abc8c41e824ae98d727429542b0157ae6f8d9" ;; "linux-aarch64" ) checksum="201e2bad0ed59efc89654a77ae1634302111b3ffb9af53f9ee63ab43b735e5c3" ;; "macos-amd64" ) checksum="7c816beb8c8b46ee0de60861f739c274efbc744304aa9034bffbd0319f13701d" ;; "macos-aarch64" ) checksum="7f5540a28cf5c2c628cd003c3eb86bfa0a07175dae7d9b6528b40c44c4927402" ;; * ) { echo colorize 1 "ERROR" echo ": No binary distribution of GraalPy is available for $(uname -sm)." echo } >&2 exit 1 ;; esac if [ -n "${BUILD}" ]; then url="https://github.com/graalvm/graalvm-ce-dev-builds/releases/download/${VERSION}-dev-${BUILD}/graalpy-community-dev-${graalpy_arch}.tar.gz" else url="https://github.com/oracle/graalpython/releases/download/graal-${VERSION}/graalpy-community-${VERSION}-${graalpy_arch}.tar.gz#${checksum}" fi install_package "graalpy-community-${VERSION}${BUILD}" "${url}" "copy" ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/graalpy-community-24.1.0000066400000000000000000000042261517431316200302440ustar00rootroot00000000000000# Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. # # Permission is hereby granted, free of charge, to any person obtaining a copy of # this software and associated documentation files (the "Software"), to deal in # the Software without restriction, including without limitation the rights to # use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies # of the Software, and to permit persons to whom the Software is furnished to do # so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. VERSION='24.1.0' BUILD='' graalpy_arch="$(graalpy_architecture 2>/dev/null || true)" case "$graalpy_arch" in "linux-amd64" ) checksum="89c7f8bd8f91639adc815949458d56ea9bffaa286249360d244fc6a6885c220a" ;; "linux-aarch64" ) checksum="8f52958486606328a9692a0c0553f2cd3afd1c86c9df97ae47a703afc2e804a8" ;; "macos-amd64" ) checksum="1b01102ca9cbfe8164e935ca834226db76e8ca9359a5585ba686430593cbc02d" ;; "macos-aarch64" ) checksum="cd0d6064bbb4f92d50d2b85ed46f6a9c22a5ae775f15cc264508da8f026eecaa" ;; * ) { echo colorize 1 "ERROR" echo ": No binary distribution of GraalPy is available for $(uname -sm)." echo } >&2 exit 1 ;; esac if [ -n "${BUILD}" ]; then url="https://github.com/graalvm/graalvm-ce-dev-builds/releases/download/${VERSION}-dev-${BUILD}/graalpy-community-dev-${graalpy_arch}.tar.gz" else url="https://github.com/oracle/graalpython/releases/download/graal-${VERSION}/graalpy-community-${VERSION}-${graalpy_arch}.tar.gz#${checksum}" fi install_package "graalpy-community-${VERSION}${BUILD}" "${url}" "copy" ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/graalpy-community-24.1.1000066400000000000000000000042261517431316200302450ustar00rootroot00000000000000# Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. # # Permission is hereby granted, free of charge, to any person obtaining a copy of # this software and associated documentation files (the "Software"), to deal in # the Software without restriction, including without limitation the rights to # use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies # of the Software, and to permit persons to whom the Software is furnished to do # so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. VERSION='24.1.1' BUILD='' graalpy_arch="$(graalpy_architecture 2>/dev/null || true)" case "$graalpy_arch" in "linux-amd64" ) checksum="42a6b563271174161a1abca4b045b0602d8e27c12204f3cadd31265fd3ff6d19" ;; "linux-aarch64" ) checksum="a513ea3036a48a6cee8cfa666bff7b5e6b1a1b6cf623400109fbf856476e9bd3" ;; "macos-amd64" ) checksum="7f5591074dbd701faa6dec6ea10391bc2d8af736fe8370c5675a11842959edd7" ;; "macos-aarch64" ) checksum="53f6161d0f9871efaf1f62f2c1894152da0bb2b504a95ebad6f35b19de994f77" ;; * ) { echo colorize 1 "ERROR" echo ": No binary distribution of GraalPy is available for $(uname -sm)." echo } >&2 exit 1 ;; esac if [ -n "${BUILD}" ]; then url="https://github.com/graalvm/graalvm-ce-dev-builds/releases/download/${VERSION}-dev-${BUILD}/graalpy-community-dev-${graalpy_arch}.tar.gz" else url="https://github.com/oracle/graalpython/releases/download/graal-${VERSION}/graalpy-community-${VERSION}-${graalpy_arch}.tar.gz#${checksum}" fi install_package "graalpy-community-${VERSION}${BUILD}" "${url}" "copy" ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/graalpy-community-24.1.2000066400000000000000000000042261517431316200302460ustar00rootroot00000000000000# Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. # # Permission is hereby granted, free of charge, to any person obtaining a copy of # this software and associated documentation files (the "Software"), to deal in # the Software without restriction, including without limitation the rights to # use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies # of the Software, and to permit persons to whom the Software is furnished to do # so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. VERSION='24.1.2' BUILD='' graalpy_arch="$(graalpy_architecture 2>/dev/null || true)" case "$graalpy_arch" in "linux-amd64" ) checksum="d1bf37fb9edf8065e6dab4f351d2006acaff2b2e692cfaea07199380c892ee0c" ;; "linux-aarch64" ) checksum="2568d5f7f3b9d8827de33eb864783c1fed4bc3e729a6fd14e072311c5105346f" ;; "macos-amd64" ) checksum="29f9f19604bf2f7d255add89fa5639d6aab6877799414cb820398fed8ef3d5bb" ;; "macos-aarch64" ) checksum="dcc4fa73cdb866e88c51219ddf9b9689b62633fc8304649372fe8ada4e03957d" ;; * ) { echo colorize 1 "ERROR" echo ": No binary distribution of GraalPy is available for $(uname -sm)." echo } >&2 exit 1 ;; esac if [ -n "${BUILD}" ]; then url="https://github.com/graalvm/graalvm-ce-dev-builds/releases/download/${VERSION}-dev-${BUILD}/graalpy-community-dev-${graalpy_arch}.tar.gz" else url="https://github.com/oracle/graalpython/releases/download/graal-${VERSION}/graalpy-community-${VERSION}-${graalpy_arch}.tar.gz#${checksum}" fi install_package "graalpy-community-${VERSION}${BUILD}" "${url}" "copy" ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/graalpy-community-24.2.0000066400000000000000000000042261517431316200302450ustar00rootroot00000000000000# Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. # # Permission is hereby granted, free of charge, to any person obtaining a copy of # this software and associated documentation files (the "Software"), to deal in # the Software without restriction, including without limitation the rights to # use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies # of the Software, and to permit persons to whom the Software is furnished to do # so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. VERSION='24.2.0' BUILD='' graalpy_arch="$(graalpy_architecture 2>/dev/null || true)" case "$graalpy_arch" in "linux-amd64" ) checksum="a3be9d91af186e270819cd3983507e073eeba33a303c5e5bec05ed1ac6078262" ;; "linux-aarch64" ) checksum="6d5792eaebdf7847e1e75089f5d1f15f3762e55b8c69ea5631108c0e737cbf45" ;; "macos-amd64" ) checksum="4a16be069341bdb3597d39c09eb11bfb994504f1c4c4b114cbb4489555229b6f" ;; "macos-aarch64" ) checksum="bed8b15bc260a899766a2051d87c6fe9172c30751fa9c2e9a7ea2f5c8c49b781" ;; * ) { echo colorize 1 "ERROR" echo ": No binary distribution of GraalPy is available for $(uname -sm)." echo } >&2 exit 1 ;; esac if [ -n "${BUILD}" ]; then url="https://github.com/graalvm/graalvm-ce-dev-builds/releases/download/${VERSION}-dev-${BUILD}/graalpy-community-dev-${graalpy_arch}.tar.gz" else url="https://github.com/oracle/graalpython/releases/download/graal-${VERSION}/graalpy-community-${VERSION}-${graalpy_arch}.tar.gz#${checksum}" fi install_package "graalpy-community-${VERSION}${BUILD}" "${url}" "copy" ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/graalpy-community-24.2.1000066400000000000000000000042261517431316200302460ustar00rootroot00000000000000# Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. # # Permission is hereby granted, free of charge, to any person obtaining a copy of # this software and associated documentation files (the "Software"), to deal in # the Software without restriction, including without limitation the rights to # use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies # of the Software, and to permit persons to whom the Software is furnished to do # so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. VERSION='24.2.1' BUILD='' graalpy_arch="$(graalpy_architecture 2>/dev/null || true)" case "$graalpy_arch" in "linux-amd64" ) checksum="96c1f332604f8425df0bb694d435d932cdf21c302e452cd10cf78a1626ba90a0" ;; "linux-aarch64" ) checksum="676eefe6011a1a2c01997c7a3cea92817f0d9de7e608d561eb5255a1e5350eff" ;; "macos-amd64" ) checksum="0d0a50cc93457bdebab992af287a275d0b364fcbd90b68cdf08ae9c64e3a1aca" ;; "macos-aarch64" ) checksum="ec31fc1f024938e6dc193013a365c23ad3d532498c93c80c3af607a853964909" ;; * ) { echo colorize 1 "ERROR" echo ": No binary distribution of GraalPy is available for $(uname -sm)." echo } >&2 exit 1 ;; esac if [ -n "${BUILD}" ]; then url="https://github.com/graalvm/graalvm-ce-dev-builds/releases/download/${VERSION}-dev-${BUILD}/graalpy-community-dev-${graalpy_arch}.tar.gz" else url="https://github.com/oracle/graalpython/releases/download/graal-${VERSION}/graalpy-community-${VERSION}-${graalpy_arch}.tar.gz#${checksum}" fi install_package "graalpy-community-${VERSION}${BUILD}" "${url}" "copy" ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/graalpy-community-24.2.2000066400000000000000000000042261517431316200302470ustar00rootroot00000000000000# Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. # # Permission is hereby granted, free of charge, to any person obtaining a copy of # this software and associated documentation files (the "Software"), to deal in # the Software without restriction, including without limitation the rights to # use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies # of the Software, and to permit persons to whom the Software is furnished to do # so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. VERSION='24.2.2' BUILD='' graalpy_arch="$(graalpy_architecture 2>/dev/null || true)" case "$graalpy_arch" in "linux-amd64" ) checksum="384642677b76c26d6be1cf6bce2bc94d49df53845dd506414d95e2322bc9ac5d" ;; "linux-aarch64" ) checksum="b91dbf13945443320c7ed0c806af174689f94125b5708d3818cbd8d99ee18b40" ;; "macos-amd64" ) checksum="46b8800a675f27745705c4db363306836fd7e706d4c01d75582f535ed1cea6c0" ;; "macos-aarch64" ) checksum="c280e6c629c45e00bd91f038c001ce02956e92ad206e6582c2a1634751695468" ;; * ) { echo colorize 1 "ERROR" echo ": No binary distribution of GraalPy is available for $(uname -sm)." echo } >&2 exit 1 ;; esac if [ -n "${BUILD}" ]; then url="https://github.com/graalvm/graalvm-ce-dev-builds/releases/download/${VERSION}-dev-${BUILD}/graalpy-community-dev-${graalpy_arch}.tar.gz" else url="https://github.com/oracle/graalpython/releases/download/graal-${VERSION}/graalpy-community-${VERSION}-${graalpy_arch}.tar.gz#${checksum}" fi install_package "graalpy-community-${VERSION}${BUILD}" "${url}" "copy" ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/graalpy-community-25.0.0000066400000000000000000000042261517431316200302440ustar00rootroot00000000000000# Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. # # Permission is hereby granted, free of charge, to any person obtaining a copy of # this software and associated documentation files (the "Software"), to deal in # the Software without restriction, including without limitation the rights to # use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies # of the Software, and to permit persons to whom the Software is furnished to do # so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. VERSION='25.0.0' BUILD='' graalpy_arch="$(graalpy_architecture 2>/dev/null || true)" case "$graalpy_arch" in "linux-amd64" ) checksum="628d5e2af40b2a3ca694bbea169388394dd30fe0727a3f1b4c92319d7bb788d5" ;; "linux-aarch64" ) checksum="7065492dea48a31adb5894379cd35acfd479c5a4158f3496f1485adedacf9bbb" ;; "macos-amd64" ) checksum="1b866e651f0016cfdc8d5d4f8e64023cd26024755d4fe5bef86d02f1a9b701ec" ;; "macos-aarch64" ) checksum="cec1e964f75ca5e881830e8670acea9486d589c1db909adf2ba974f16650bb58" ;; * ) { echo colorize 1 "ERROR" echo ": No binary distribution of GraalPy is available for $(uname -sm)." echo } >&2 exit 1 ;; esac if [ -n "${BUILD}" ]; then url="https://github.com/graalvm/graalvm-ce-dev-builds/releases/download/${VERSION}-dev-${BUILD}/graalpy-community-dev-${graalpy_arch}.tar.gz" else url="https://github.com/oracle/graalpython/releases/download/graal-${VERSION}/graalpy-community-${VERSION}-${graalpy_arch}.tar.gz#${checksum}" fi install_package "graalpy-community-${VERSION}${BUILD}" "${url}" "copy" ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/graalpy-community-25.0.1000066400000000000000000000042261517431316200302450ustar00rootroot00000000000000# Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. # # Permission is hereby granted, free of charge, to any person obtaining a copy of # this software and associated documentation files (the "Software"), to deal in # the Software without restriction, including without limitation the rights to # use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies # of the Software, and to permit persons to whom the Software is furnished to do # so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. VERSION='25.0.1' BUILD='' graalpy_arch="$(graalpy_architecture 2>/dev/null || true)" case "$graalpy_arch" in "linux-amd64" ) checksum="5ac049e3e13a9b04eead81851e59dfc794278ffec1933ff429378c1a70c88d32" ;; "linux-aarch64" ) checksum="2ea15f932e6e25b21edd0a2713b294ce91c1dca571414fcdff297028f1313de5" ;; "macos-amd64" ) checksum="f7834df0a7c5087de746ae0b0143eda8cfc456c34ddccdc64817491a10e5294b" ;; "macos-aarch64" ) checksum="f89b15b75f456240089dd50e06128aa7357371ee85098a04dc4a4cd34a65f0c9" ;; * ) { echo colorize 1 "ERROR" echo ": No binary distribution of GraalPy is available for $(uname -sm)." echo } >&2 exit 1 ;; esac if [ -n "${BUILD}" ]; then url="https://github.com/graalvm/graalvm-ce-dev-builds/releases/download/${VERSION}-dev-${BUILD}/graalpy-community-dev-${graalpy_arch}.tar.gz" else url="https://github.com/oracle/graalpython/releases/download/graal-${VERSION}/graalpy-community-${VERSION}-${graalpy_arch}.tar.gz#${checksum}" fi install_package "graalpy-community-${VERSION}${BUILD}" "${url}" "copy" ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/graalpy-community-25.0.2000066400000000000000000000040631517431316200302450ustar00rootroot00000000000000# Copyright (c) 2026, Oracle and/or its affiliates. All rights reserved. # # Permission is hereby granted, free of charge, to any person obtaining a copy of # this software and associated documentation files (the "Software"), to deal in # the Software without restriction, including without limitation the rights to # use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies # of the Software, and to permit persons to whom the Software is furnished to do # so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. VERSION='25.0.2' BUILD='' graalpy_arch="$(graalpy_architecture 2>/dev/null || true)" case "$graalpy_arch" in "linux-amd64" ) checksum="8db86f13c0b701bab0780e8821052a40303c08b83fdc9c21da06605d14d4cc79" ;; "linux-aarch64" ) checksum="98f7b9dea867c45cde5c2886b7544bd267242b2fa93586f2c9d3d38e88d5d109" ;; "macos-aarch64" ) checksum="c64bef17f34d42327d5c3fe40c05eddf791c3653cc8366f6bf1149b51ce9d517" ;; * ) { echo colorize 1 "ERROR" echo ": No binary distribution of GraalPy is available for $(uname -sm)." echo } >&2 exit 1 ;; esac if [ -n "${BUILD}" ]; then url="https://github.com/graalvm/graalvm-ce-dev-builds/releases/download/${VERSION}-dev-${BUILD}/graalpy-community-dev-${graalpy_arch}.tar.gz" else url="https://github.com/oracle/graalpython/releases/download/graal-${VERSION}/graalpy-community-${VERSION}-${graalpy_arch}.tar.gz#${checksum}" fi install_package "graalpy-community-${VERSION}${BUILD}" "${url}" "copy" ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/graalpy-dev000066400000000000000000000043231517431316200262540ustar00rootroot00000000000000# Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. # # Permission is hereby granted, free of charge, to any person obtaining a copy of # this software and associated documentation files (the "Software"), to deal in # the Software without restriction, including without limitation the rights to # use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies # of the Software, and to permit persons to whom the Software is furnished to do # so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. JSON_URL=https://raw.githubusercontent.com/graalvm/graal-languages-ea-builds/main/graalpy/versions/latest-ea.json colorize 1 "GraalPy 23.1 and later installed by python-build use the faster Oracle GraalVM distribution" && echo colorize 1 "Oracle GraalVM uses the GFTC license, which is free for development and production use, see https://medium.com/graalvm/161527df3d76" && echo colorize 1 "Release builds of the GraalVM Community Edition variant of GraalPy are available, with names starting with graalpy-community-" && echo json=`http get "$JSON_URL"` version=`expr "$json" : '{.*"version":[^"]*"\([^"]*\)'` base_url=`expr "$json" : '{.*"download_base_url":[^"]*"\([^"]*\)'` graalpy_arch="$(graalpy_architecture 2>/dev/null || true)" case "$graalpy_arch" in "linux-amd64" ) ;; "linux-aarch64" ) ;; "macos-amd64" ) ;; "macos-aarch64" ) ;; * ) { echo colorize 1 "ERROR" echo ": No binary distribution of GraalPy is available for $(uname -sm)." echo } >&2 exit 1 ;; esac url="${base_url}/graalpy-${version}-${graalpy_arch}.tar.gz" install_package "graalpy-${version}" "${url}" "copy" ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/graalpython-20.1.0000066400000000000000000000037321517431316200271100ustar00rootroot00000000000000# Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved. # # Permission is hereby granted, free of charge, to any person obtaining a copy of # this software and associated documentation files (the "Software"), to deal in # the Software without restriction, including without limitation the rights to # use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies # of the Software, and to permit persons to whom the Software is furnished to do # so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. VERSION='20.1.0' BUILD='' case "$(pypy_architecture 2>/dev/null || true)" in "linux64" ) graalpython_arch="linux" checksum="8df5d3797876d63e5b0fed6460b1943d53160fa3c3a589d0c1ce68c23646dd93" ;; "osx64" ) graalpython_arch="macos" checksum="7fe5aca69a64fd411d9b424b68118f2225daf96509ee1e0fcc4252a19887d9c7" ;; * ) { echo colorize 1 "ERROR" echo ": No binary distribution of GraalPython is available for $(pypy_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac if [ -n "${BUILD}" ]; then urlprefix="https://github.com/graalvm/graalvm-ce-dev-builds/releases/download/${VERSION}-${BUILD}" else urlprefix="https://github.com/oracle/graalpython/releases/download/vm-${VERSION}" fi install_package "graalpython-${VERSION}${BUILD}" "${urlprefix}/graalpython-${VERSION}-${graalpython_arch}-amd64.tar.gz#${checksum}" "graalpython" ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/graalpython-20.2.0000066400000000000000000000037321517431316200271110ustar00rootroot00000000000000# Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved. # # Permission is hereby granted, free of charge, to any person obtaining a copy of # this software and associated documentation files (the "Software"), to deal in # the Software without restriction, including without limitation the rights to # use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies # of the Software, and to permit persons to whom the Software is furnished to do # so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. VERSION='20.2.0' BUILD='' case "$(pypy_architecture 2>/dev/null || true)" in "linux64" ) graalpython_arch="linux" checksum="9ba0447523a6cf6f8b74fef2b918672762b7d7f67be9f5be8ab6b479f173cfd7" ;; "osx64" ) graalpython_arch="macos" checksum="e06f8e6f5766483d5613eca6a4703cec8a93236443c7c6f2866b31307e62bbe6" ;; * ) { echo colorize 1 "ERROR" echo ": No binary distribution of GraalPython is available for $(pypy_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac if [ -n "${BUILD}" ]; then urlprefix="https://github.com/graalvm/graalvm-ce-dev-builds/releases/download/${VERSION}-${BUILD}" else urlprefix="https://github.com/oracle/graalpython/releases/download/vm-${VERSION}" fi install_package "graalpython-${VERSION}${BUILD}" "${urlprefix}/graalpython-${VERSION}-${graalpython_arch}-amd64.tar.gz#${checksum}" "graalpython" ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/graalpython-20.3.0000066400000000000000000000037321517431316200271120ustar00rootroot00000000000000# Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved. # # Permission is hereby granted, free of charge, to any person obtaining a copy of # this software and associated documentation files (the "Software"), to deal in # the Software without restriction, including without limitation the rights to # use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies # of the Software, and to permit persons to whom the Software is furnished to do # so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. VERSION='20.3.0' BUILD='' case "$(pypy_architecture 2>/dev/null || true)" in "linux64" ) graalpython_arch="linux" checksum="121508c64c2f18e9a57294d38a4c090c7a9417087f8549e120d0050906e2c82f" ;; "osx64" ) graalpython_arch="macos" checksum="1a80bf3fde2dc2d0fdc92605176c281835d912c26847346150b3be82d2a250e0" ;; * ) { echo colorize 1 "ERROR" echo ": No binary distribution of GraalPython is available for $(pypy_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac if [ -n "${BUILD}" ]; then urlprefix="https://github.com/graalvm/graalvm-ce-dev-builds/releases/download/${VERSION}-${BUILD}" else urlprefix="https://github.com/oracle/graalpython/releases/download/vm-${VERSION}" fi install_package "graalpython-${VERSION}${BUILD}" "${urlprefix}/graalpython-${VERSION}-${graalpython_arch}-amd64.tar.gz#${checksum}" "graalpython" ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/graalpython-21.0.0000066400000000000000000000037321517431316200271100ustar00rootroot00000000000000# Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved. # # Permission is hereby granted, free of charge, to any person obtaining a copy of # this software and associated documentation files (the "Software"), to deal in # the Software without restriction, including without limitation the rights to # use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies # of the Software, and to permit persons to whom the Software is furnished to do # so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. VERSION='21.0.0' BUILD='' case "$(pypy_architecture 2>/dev/null || true)" in "linux64" ) graalpython_arch="linux" checksum="df2317bf57461e6a59840921f05a019a3bdf5e59f867b44ab36804d536224d7f" ;; "osx64" ) graalpython_arch="macos" checksum="3d4c02286d682228843cca2f4a0faeed7a0a64a9558eea5ceb7992a680bd61e6" ;; * ) { echo colorize 1 "ERROR" echo ": No binary distribution of GraalPython is available for $(pypy_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac if [ -n "${BUILD}" ]; then urlprefix="https://github.com/graalvm/graalvm-ce-dev-builds/releases/download/${VERSION}-${BUILD}" else urlprefix="https://github.com/oracle/graalpython/releases/download/vm-${VERSION}" fi install_package "graalpython-${VERSION}${BUILD}" "${urlprefix}/graalpython-${VERSION}-${graalpython_arch}-amd64.tar.gz#${checksum}" "graalpython" ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/graalpython-21.1.0000066400000000000000000000037321517431316200271110ustar00rootroot00000000000000# Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved. # # Permission is hereby granted, free of charge, to any person obtaining a copy of # this software and associated documentation files (the "Software"), to deal in # the Software without restriction, including without limitation the rights to # use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies # of the Software, and to permit persons to whom the Software is furnished to do # so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. VERSION='21.1.0' BUILD='' case "$(pypy_architecture 2>/dev/null || true)" in "linux64" ) graalpython_arch="linux" checksum="fb48d041e4113cf8a0d0535402eaa64af112b1999839ebee49f431963af3ece1" ;; "osx64" ) graalpython_arch="macos" checksum="3efb2257b21ce7fdab5d3986f571ad531a5c1c73d23468431a5c8440ee49c2f6" ;; * ) { echo colorize 1 "ERROR" echo ": No binary distribution of GraalPython is available for $(pypy_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac if [ -n "${BUILD}" ]; then urlprefix="https://github.com/graalvm/graalvm-ce-dev-builds/releases/download/${VERSION}-${BUILD}" else urlprefix="https://github.com/oracle/graalpython/releases/download/vm-${VERSION}" fi install_package "graalpython-${VERSION}${BUILD}" "${urlprefix}/graalpython-${VERSION}-${graalpython_arch}-amd64.tar.gz#${checksum}" "graalpython" ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/graalpython-21.2.0000066400000000000000000000037321517431316200271120ustar00rootroot00000000000000# Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved. # # Permission is hereby granted, free of charge, to any person obtaining a copy of # this software and associated documentation files (the "Software"), to deal in # the Software without restriction, including without limitation the rights to # use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies # of the Software, and to permit persons to whom the Software is furnished to do # so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. VERSION='21.2.0' BUILD='' case "$(pypy_architecture 2>/dev/null || true)" in "linux64" ) graalpython_arch="linux" checksum="17399e168743ae8b7b3faa9870ce24213fb514a04a8966bd4bd10844baf039da" ;; "osx64" ) graalpython_arch="macos" checksum="b365278cba49d6e2e0c018d1f5a1e81fa0304be5fe6c086532630443c605b8c0" ;; * ) { echo colorize 1 "ERROR" echo ": No binary distribution of GraalPython is available for $(pypy_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac if [ -n "${BUILD}" ]; then urlprefix="https://github.com/graalvm/graalvm-ce-dev-builds/releases/download/${VERSION}-${BUILD}" else urlprefix="https://github.com/oracle/graalpython/releases/download/vm-${VERSION}" fi install_package "graalpython-${VERSION}${BUILD}" "${urlprefix}/graalpython-${VERSION}-${graalpython_arch}-amd64.tar.gz#${checksum}" "graalpython" ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/graalpython-21.3.0000066400000000000000000000037321517431316200271130ustar00rootroot00000000000000# Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved. # # Permission is hereby granted, free of charge, to any person obtaining a copy of # this software and associated documentation files (the "Software"), to deal in # the Software without restriction, including without limitation the rights to # use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies # of the Software, and to permit persons to whom the Software is furnished to do # so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. VERSION='21.3.0' BUILD='' case "$(pypy_architecture 2>/dev/null || true)" in "linux64" ) graalpython_arch="linux" checksum="b17bbc9753fb04f03290660952acfd212020676603970323780f190509b061b9" ;; "osx64" ) graalpython_arch="macos" checksum="feecbd2567a43aeaeb5ca6a7385ef3d5bd2c94e563b64afee7dcce0c8f87a1c9" ;; * ) { echo colorize 1 "ERROR" echo ": No binary distribution of GraalPython is available for $(pypy_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac if [ -n "${BUILD}" ]; then urlprefix="https://github.com/graalvm/graalvm-ce-dev-builds/releases/download/${VERSION}-${BUILD}" else urlprefix="https://github.com/oracle/graalpython/releases/download/vm-${VERSION}" fi install_package "graalpython-${VERSION}${BUILD}" "${urlprefix}/graalpython-${VERSION}-${graalpython_arch}-amd64.tar.gz#${checksum}" "graalpython" ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/graalpython-22.0.0000066400000000000000000000037341517431316200271130ustar00rootroot00000000000000# Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved. # # Permission is hereby granted, free of charge, to any person obtaining a copy of # this software and associated documentation files (the "Software"), to deal in # the Software without restriction, including without limitation the rights to # use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies # of the Software, and to permit persons to whom the Software is furnished to do # so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. VERSION='22.0.0.2' BUILD='' case "$(pypy_architecture 2>/dev/null || true)" in "linux64" ) graalpython_arch="linux" checksum="e80c6051a609e7e1403b96992951814e967cf6deb9ca2507e691769d01970d55" ;; "osx64" ) graalpython_arch="macos" checksum="5b0476321162557a7b43e6cdadfc187280bc40a3452d327a4ae8d624afaa5336" ;; * ) { echo colorize 1 "ERROR" echo ": No binary distribution of GraalPython is available for $(pypy_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac if [ -n "${BUILD}" ]; then urlprefix="https://github.com/graalvm/graalvm-ce-dev-builds/releases/download/${VERSION}-${BUILD}" else urlprefix="https://github.com/oracle/graalpython/releases/download/vm-${VERSION}" fi install_package "graalpython-${VERSION}${BUILD}" "${urlprefix}/graalpython-${VERSION}-${graalpython_arch}-amd64.tar.gz#${checksum}" "graalpython" ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/graalpython-22.1.0000066400000000000000000000037321517431316200271120ustar00rootroot00000000000000# Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved. # # Permission is hereby granted, free of charge, to any person obtaining a copy of # this software and associated documentation files (the "Software"), to deal in # the Software without restriction, including without limitation the rights to # use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies # of the Software, and to permit persons to whom the Software is furnished to do # so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. VERSION='22.1.0' BUILD='' case "$(pypy_architecture 2>/dev/null || true)" in "linux64" ) graalpython_arch="linux" checksum="06862993573b64bd64c802aace9135192a4ba28a15d8260c42c5de632ad616bc" ;; "osx64" ) graalpython_arch="macos" checksum="88b22ea4a5cb8345b680d15cc385dff7a8ab858fdf0e182c79c6c3b74755de6c" ;; * ) { echo colorize 1 "ERROR" echo ": No binary distribution of GraalPython is available for $(pypy_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac if [ -n "${BUILD}" ]; then urlprefix="https://github.com/graalvm/graalvm-ce-dev-builds/releases/download/${VERSION}-${BUILD}" else urlprefix="https://github.com/oracle/graalpython/releases/download/vm-${VERSION}" fi install_package "graalpython-${VERSION}${BUILD}" "${urlprefix}/graalpython-${VERSION}-${graalpython_arch}-amd64.tar.gz#${checksum}" "graalpython" ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/graalpython-22.2.0000066400000000000000000000037321517431316200271130ustar00rootroot00000000000000# Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved. # # Permission is hereby granted, free of charge, to any person obtaining a copy of # this software and associated documentation files (the "Software"), to deal in # the Software without restriction, including without limitation the rights to # use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies # of the Software, and to permit persons to whom the Software is furnished to do # so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. VERSION='22.2.0' BUILD='' case "$(pypy_architecture 2>/dev/null || true)" in "linux64" ) graalpython_arch="linux" checksum="75a7e5d7afc158169fd87df9c69c3801aa0293dd727ba09facad6b01e1b6dee5" ;; "osx64" ) graalpython_arch="macos" checksum="575d78ae2be8d4ce4adbc9c61229b6f1271f557f0f3ec410a494de7b29986dd7" ;; * ) { echo colorize 1 "ERROR" echo ": No binary distribution of GraalPython is available for $(pypy_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac if [ -n "${BUILD}" ]; then urlprefix="https://github.com/graalvm/graalvm-ce-dev-builds/releases/download/${VERSION}-${BUILD}" else urlprefix="https://github.com/oracle/graalpython/releases/download/vm-${VERSION}" fi install_package "graalpython-${VERSION}${BUILD}" "${urlprefix}/graalpython-${VERSION}-${graalpython_arch}-amd64.tar.gz#${checksum}" "graalpython" ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/ironpython-2.7.4000066400000000000000000000004121517431316200267130ustar00rootroot00000000000000install_zip "IronPython-2.7.4" "https://github.com/IronLanguages/main/releases/download/ipy-2.7.4/IronPython-2.7.4.zip#23358ebfd728adcc0b63ef44cb7db578d662d904b6f676c5292595286892796c" ironpython # FIXME: have not confirmed to install setuptools into IronPython yet pyenv-pyenv-485090e/plugins/python-build/share/python-build/ironpython-2.7.5000066400000000000000000000004121517431316200267140ustar00rootroot00000000000000install_zip "IronPython-2.7.5" "https://github.com/IronLanguages/main/releases/download/ipy-2.7.5/IronPython-2.7.5.zip#d2651084a61a43379ce6c031f4f29c5e01ba96d1ff89a5282376dd4b84439b5b" ironpython # FIXME: have not confirmed to install setuptools into IronPython yet pyenv-pyenv-485090e/plugins/python-build/share/python-build/ironpython-2.7.6.3000066400000000000000000000004201517431316200270550ustar00rootroot00000000000000install_zip "IronPython-2.7.6.3" "https://github.com/IronLanguages/main/releases/download/ipy-2.7.6.3/IronPython-2.7.6.3.zip#dfd00598f4752104f90c248c1662eafbebf7ead24e17531d852ffc32a5a8075b" ironpython # FIXME: have not confirmed to install setuptools into IronPython yet pyenv-pyenv-485090e/plugins/python-build/share/python-build/ironpython-2.7.7000066400000000000000000000003231517431316200267170ustar00rootroot00000000000000install_zip "IronPython-2.7.7" "https://github.com/IronLanguages/main/releases/download/ipy-2.7.7/IronPython-2.7.7-win.zip#657c134ff6d6f0ed86557d9455dcdfeac11823944f7aa36d72a41cc5444c4a89" ironpython ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/ironpython-dev000066400000000000000000000002601517431316200270220ustar00rootroot00000000000000install_git "ironpython-dev" "https://github.com/IronLanguages/ironpython2.git" master ironpython_builder # FIXME: have not confirmed to install setuptools into IronPython yet pyenv-pyenv-485090e/plugins/python-build/share/python-build/jython-2.5-dev000066400000000000000000000010611517431316200264260ustar00rootroot00000000000000require_java install_hg "jython-2.5-dev" "https://hg.python.org/jython" "2.5" jython_builder install_package "setuptools-1.4.2" "https://pypi.python.org/packages/source/s/setuptools/setuptools-1.4.2.tar.gz#263986a60a83aba790a5bffc7d009ac88114ba4e908e5c90e453b3bf2155dbbd" python # pip (>= 1.3) does not work properly since it uses HTTPS for downloads # * https://github.com/pyenv/pyenv/issues/15 install_package "pip-1.2.1" "https://pypi.python.org/packages/source/p/pip/pip-1.2.1.tar.gz#12a9302acfca62cdc7bc5d83386cac3e0581db61ac39acdb3a4e766a16b88eb1" python pyenv-pyenv-485090e/plugins/python-build/share/python-build/jython-2.5.0000066400000000000000000000015461517431316200260200ustar00rootroot00000000000000require_java install_jar "jython-2.5.0" "https://downloads.sourceforge.net/project/jython/jython/2.5.0/jython_installer-2.5.0.jar#e3d8209ef9eb143df8101a5da6b3482cf457084e3a6247031fd510d71c13ab98" jython # distribute (>= 0.33) does not support Jython prior to 2.5.2 # * https://github.com/pyenv/pyenv/issues/15 # * https://bitbucket.org/tarek/distribute/issue/367/importing-setuptoolssandbox-fails-on install_package "distribute-0.6.32" "https://pypi.python.org/packages/source/d/distribute/distribute-0.6.32.tar.gz#8970cd1e148b5d1fea9430584aea66c45ea22d80e0933393ec49ebc388f718df" python # pip (>= 1.3) does not work properly since it uses HTTPS for downloads # * https://github.com/pyenv/pyenv/issues/15 install_package "pip-1.2.1" "https://pypi.python.org/packages/source/p/pip/pip-1.2.1.tar.gz#12a9302acfca62cdc7bc5d83386cac3e0581db61ac39acdb3a4e766a16b88eb1" python pyenv-pyenv-485090e/plugins/python-build/share/python-build/jython-2.5.1000066400000000000000000000015461517431316200260210ustar00rootroot00000000000000require_java install_jar "jython-2.5.1" "https://downloads.sourceforge.net/project/jython/jython/2.5.1/jython_installer-2.5.1.jar#229dfd1ed9728aa7e00c71f111d08fa777a4edcd03383779c74216765098f9c5" jython # distribute (>= 0.33) does not support Jython prior to 2.5.2 # * https://github.com/pyenv/pyenv/issues/15 # * https://bitbucket.org/tarek/distribute/issue/367/importing-setuptoolssandbox-fails-on install_package "distribute-0.6.32" "https://pypi.python.org/packages/source/d/distribute/distribute-0.6.32.tar.gz#8970cd1e148b5d1fea9430584aea66c45ea22d80e0933393ec49ebc388f718df" python # pip (>= 1.3) does not work properly since it uses HTTPS for downloads # * https://github.com/pyenv/pyenv/issues/15 install_package "pip-1.2.1" "https://pypi.python.org/packages/source/p/pip/pip-1.2.1.tar.gz#12a9302acfca62cdc7bc5d83386cac3e0581db61ac39acdb3a4e766a16b88eb1" python pyenv-pyenv-485090e/plugins/python-build/share/python-build/jython-2.5.2000066400000000000000000000012371517431316200260170ustar00rootroot00000000000000require_java install_jar "jython-2.5.2" "https://downloads.sourceforge.net/project/jython/jython/2.5.2/jython_installer-2.5.2.jar#1b7168b961e31ddd89012a36cde611c340dadfd8b60b81c4248b026730ee2f29" jython install_package "setuptools-1.4.2" "https://pypi.python.org/packages/source/s/setuptools/setuptools-1.4.2.tar.gz#263986a60a83aba790a5bffc7d009ac88114ba4e908e5c90e453b3bf2155dbbd" python # pip (>= 1.3) does not work properly since it uses HTTPS for downloads # * https://github.com/pyenv/pyenv/issues/15 install_package "pip-1.2.1" "https://pypi.python.org/packages/source/p/pip/pip-1.2.1.tar.gz#12a9302acfca62cdc7bc5d83386cac3e0581db61ac39acdb3a4e766a16b88eb1" python pyenv-pyenv-485090e/plugins/python-build/share/python-build/jython-2.5.3000066400000000000000000000012631517431316200260170ustar00rootroot00000000000000require_java install_jar "jython-2.5.3" "https://search.maven.org/remotecontent?filepath=org/python/jython-installer/2.5.3/jython-installer-2.5.3.jar#05405966cdfa57abc8e705dd6aab92b8240097ce709fb916c8a0dbcaa491f99e" jython install_package "setuptools-1.4.2" "https://pypi.python.org/packages/source/s/setuptools/setuptools-1.4.2.tar.gz#263986a60a83aba790a5bffc7d009ac88114ba4e908e5c90e453b3bf2155dbbd" python # pip (>= 1.3) does not work properly since it uses HTTPS for downloads # * https://github.com/pyenv/pyenv/issues/15 install_package "pip-1.2.1" "https://pypi.python.org/packages/source/p/pip/pip-1.2.1.tar.gz#12a9302acfca62cdc7bc5d83386cac3e0581db61ac39acdb3a4e766a16b88eb1" python pyenv-pyenv-485090e/plugins/python-build/share/python-build/jython-2.5.4-rc1000066400000000000000000000012771517431316200265100ustar00rootroot00000000000000require_java install_jar "jython-2.5.4-rc1" "https://search.maven.org/remotecontent?filepath=org/python/jython-installer/2.5.4-rc1/jython-installer-2.5.4-rc1.jar#2fa6821ef506804ca77f87631a21878c11d743f8a7fa9ed26e55dfd7696204d1" jython install_package "setuptools-1.4.2" "https://pypi.python.org/packages/source/s/setuptools/setuptools-1.4.2.tar.gz#263986a60a83aba790a5bffc7d009ac88114ba4e908e5c90e453b3bf2155dbbd" python # pip (>= 1.3) does not work properly since it uses HTTPS for downloads # * https://github.com/pyenv/pyenv/issues/15 install_package "pip-1.2.1" "https://pypi.python.org/packages/source/p/pip/pip-1.2.1.tar.gz#12a9302acfca62cdc7bc5d83386cac3e0581db61ac39acdb3a4e766a16b88eb1" python pyenv-pyenv-485090e/plugins/python-build/share/python-build/jython-2.7.0000066400000000000000000000011341517431316200260130ustar00rootroot00000000000000require_java unrequire_python27 install_jar "jython-2.7.0" "https://repo1.maven.org/maven2/org/python/jython-installer/2.7.0/jython-installer-2.7.0.jar#b44352ece72382268a60e2848741c96609a91d796bb9a9c6ebeff62f0c12c9cf" jython case "$(pypy_architecture 2>/dev/null || true)" in "osx64"|"win32" ) # Jython does not seem to work properly on OSX/windows unless JAVA_HOME is set if [ -z "${JAVA_HOME+defined}" ]; then colorize 1 "WARNING: " echo "Please ensure that your JAVA_HOME environment variable is set correctly!" echo "See http://bugs.jython.org/issue2346 for details." fi ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/jython-2.7.1000066400000000000000000000011341517431316200260140ustar00rootroot00000000000000require_java unrequire_python27 install_jar "jython-2.7.1" "https://repo1.maven.org/maven2/org/python/jython-installer/2.7.1/jython-installer-2.7.1.jar#6e58dad0b8565b95c6fb14b4bfbf570523d1c5290244cfb33822789fa53b1d25" jython case "$(pypy_architecture 2>/dev/null || true)" in "osx64"|"win32" ) # Jython does not seem to work properly on OSX/windows unless JAVA_HOME is set if [ -z "${JAVA_HOME+defined}" ]; then colorize 1 "WARNING: " echo "Please ensure that your JAVA_HOME environment variable is set correctly!" echo "See http://bugs.jython.org/issue2346 for details." fi ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/jython-2.7.2000066400000000000000000000011341517431316200260150ustar00rootroot00000000000000require_java unrequire_python27 install_jar "jython-2.7.2" "https://repo1.maven.org/maven2/org/python/jython-installer/2.7.2/jython-installer-2.7.2.jar#36e40609567ce020a1de0aaffe45e0b68571c278c14116f52e58cc652fb71552" jython case "$(pypy_architecture 2>/dev/null || true)" in "osx64"|"win32" ) # Jython does not seem to work properly on OSX/windows unless JAVA_HOME is set if [ -z "${JAVA_HOME+defined}" ]; then colorize 1 "WARNING: " echo "Please ensure that your JAVA_HOME environment variable is set correctly!" echo "See http://bugs.jython.org/issue2346 for details." fi ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/jython-2.7.3000066400000000000000000000011341517431316200260160ustar00rootroot00000000000000require_java unrequire_python27 install_jar "jython-2.7.3" "https://repo1.maven.org/maven2/org/python/jython-installer/2.7.3/jython-installer-2.7.3.jar#3ffc25c5257d2028b176912a4091fe048c45c7d98218e52d7ce3160a62fdc9fc" jython case "$(pypy_architecture 2>/dev/null || true)" in "osx64"|"win32" ) # Jython does not seem to work properly on OSX/windows unless JAVA_HOME is set if [ -z "${JAVA_HOME+defined}" ]; then colorize 1 "WARNING: " echo "Please ensure that your JAVA_HOME environment variable is set correctly!" echo "See http://bugs.jython.org/issue2346 for details." fi ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/jython-2.7.4000066400000000000000000000011341517431316200260170ustar00rootroot00000000000000require_java unrequire_python27 install_jar "jython-2.7.4" "https://repo1.maven.org/maven2/org/python/jython-installer/2.7.4/jython-installer-2.7.4.jar#6001f0741ed5f4a474e5c5861bcccf38dc65819e25d46a258cbc0278394a070b" jython case "$(pypy_architecture 2>/dev/null || true)" in "osx64"|"win32" ) # Jython does not seem to work properly on OSX/windows unless JAVA_HOME is set if [ -z "${JAVA_HOME+defined}" ]; then colorize 1 "WARNING: " echo "Please ensure that your JAVA_HOME environment variable is set correctly!" echo "See http://bugs.jython.org/issue2346 for details." fi ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/jython-dev000066400000000000000000000006231517431316200261270ustar00rootroot00000000000000require_java unrequire_python27 install_hg "jython-dev" "https://hg.python.org/jython" "default" jython_builder ez_setup # pip (>= 1.3) does not work properly since it uses HTTPS for downloads # * https://github.com/pyenv/pyenv/issues/15 install_package "pip-1.2.1" "https://pypi.python.org/packages/source/p/pip/pip-1.2.1.tar.gz#12a9302acfca62cdc7bc5d83386cac3e0581db61ac39acdb3a4e766a16b88eb1" python pyenv-pyenv-485090e/plugins/python-build/share/python-build/mambaforge000066400000000000000000000022651517431316200261440ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-ppc64le" ) install_script "Mambaforge-Linux-ppc64le" "https://github.com/conda-forge/miniforge/releases/latest/download/Mambaforge-Linux-ppc64le.sh" "miniconda" verify_py3_latest ;; "Linux-x86_64" ) install_script "Mambaforge-Linux-x86_64" "https://github.com/conda-forge/miniforge/releases/latest/download/Mambaforge-Linux-x86_64.sh" "miniconda" verify_py3_latest ;; "Linux-aarch64" ) install_script "Mambaforge-Linux-aarch64" "https://github.com/conda-forge/miniforge/releases/latest/download/Mambaforge-Linux-aarch64.sh" "miniconda" verify_py3_latest ;; "MacOSX-arm64" ) install_script "Mambaforge-MacOSX-arm64" "https://github.com/conda-forge/miniforge/releases/latest/download/Mambaforge-MacOSX-arm64.sh" "miniconda" verify_py3_latest ;; "MacOSX-x86_64" ) install_script "Mambaforge-MacOSX-x86_64" "https://github.com/conda-forge/miniforge/releases/latest/download/Mambaforge-MacOSX-x86_64.sh" "miniconda" verify_py3_latest ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Mambaforge3 is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/mambaforge-22.11.1-3000066400000000000000000000031421517431316200270770ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Mambaforge-22.11.1-3-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-3/Mambaforge-22.11.1-3-Linux-aarch64.sh#898134462553de6b16cdcf649b2fc5f46b7bff5ac92b12cae7f6a46eeb973c8d" "miniconda" verify_py310 ;; "Linux-ppc64le" ) install_script "Mambaforge-22.11.1-3-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-3/Mambaforge-22.11.1-3-Linux-ppc64le.sh#446b3c31293cfec57dc651fbd0aadb9b9663746863e7601b2aa25aa005907192" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Mambaforge-22.11.1-3-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-3/Mambaforge-22.11.1-3-Linux-x86_64.sh#dc7b120aa6f12004e406498cb605c752bd6e4bfe18da169dfe119b91d0c8c8ce" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Mambaforge-22.11.1-3-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-3/Mambaforge-22.11.1-3-MacOSX-arm64.sh#a85225bc54ba3c5caaf202817b4f49578d6134e6818c8fbc75173af69a80847d" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Mambaforge-22.11.1-3-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-3/Mambaforge-22.11.1-3-MacOSX-x86_64.sh#0b17731c449ab96b3c5e39553fd68fbe1e4c68e9b016126ccf68a8f00a4a3a38" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/mambaforge-22.11.1-4000066400000000000000000000031421517431316200271000ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Mambaforge-22.11.1-4-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-4/Mambaforge-22.11.1-4-Linux-aarch64.sh#96191001f27e0cc76612d4498d34f9f656d8a7dddee44617159e42558651479c" "miniconda" verify_py310 ;; "Linux-ppc64le" ) install_script "Mambaforge-22.11.1-4-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-4/Mambaforge-22.11.1-4-Linux-ppc64le.sh#9ad024c2ed11e1c75324515727c70384f073be1373111c34b14b7212944e7e0d" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Mambaforge-22.11.1-4-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-4/Mambaforge-22.11.1-4-Linux-x86_64.sh#16c7d256de783ceeb39970e675efa4a8eb830dcbb83187f1197abfea0bf07d30" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Mambaforge-22.11.1-4-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-4/Mambaforge-22.11.1-4-MacOSX-arm64.sh#a551be4b416a05f31ba3605f78694f1e21559533744c45ded0c4bfeb7666f317" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Mambaforge-22.11.1-4-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-4/Mambaforge-22.11.1-4-MacOSX-x86_64.sh#0f0f746330259c6f9c3678fdbdb6195dddad4b9bac921a6de07c62a60234ad8d" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/mambaforge-22.9.0-0000066400000000000000000000031231517431316200270210ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Mambaforge-22.9.0-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.9.0-0/Mambaforge-22.9.0-0-Linux-aarch64.sh#6076cfb0c2f88efa3e5e125dc54f3c0f8219cfe1ae9d9258a5abe42dbcf21a13" "miniconda" verify_py310 ;; "Linux-ppc64le" ) install_script "Mambaforge-22.9.0-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/22.9.0-0/Mambaforge-22.9.0-0-Linux-ppc64le.sh#a17530e0e981991db5f6875e949dc22554f2ed0dd2b1bbb40ce677c910a2dc51" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Mambaforge-22.9.0-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.9.0-0/Mambaforge-22.9.0-0-Linux-x86_64.sh#7049f5ebdd6e2aee7611874599ab14445cd63070cdb63db2e00ae0b90d7c6132" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Mambaforge-22.9.0-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.9.0-0/Mambaforge-22.9.0-0-MacOSX-arm64.sh#d116ea977a2117068d290a961212f10fdaf1cc6ad156ea14b3979e2e4c0499d9" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Mambaforge-22.9.0-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.9.0-0/Mambaforge-22.9.0-0-MacOSX-x86_64.sh#03b0af9a3d343da8107edaf75713cea3b79c71aacbbeb8f06507d0dbd26c5218" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/mambaforge-22.9.0-1000066400000000000000000000031231517431316200270220ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Mambaforge-22.9.0-1-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.9.0-1/Mambaforge-22.9.0-1-Linux-aarch64.sh#2f60c1faadcf0660ac9a97e00c64edf8fd241664387a156685de4b72f36c657c" "miniconda" verify_py310 ;; "Linux-ppc64le" ) install_script "Mambaforge-22.9.0-1-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/22.9.0-1/Mambaforge-22.9.0-1-Linux-ppc64le.sh#525cf02648ad50a221c1f1ca5ecc4c05be6cbe829e7d994c17507b439d923e55" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Mambaforge-22.9.0-1-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.9.0-1/Mambaforge-22.9.0-1-Linux-x86_64.sh#cba9a744454039944480871ed30d89e4e51a944a579b461dd9af60ea96560886" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Mambaforge-22.9.0-1-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.9.0-1/Mambaforge-22.9.0-1-MacOSX-arm64.sh#90c9c6eccdef8d938c4f31d44f2553c706b89955a4750adbd09d7eeefbedc603" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Mambaforge-22.9.0-1-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.9.0-1/Mambaforge-22.9.0-1-MacOSX-x86_64.sh#0afa53d38735762ee2a43174ee4ce726f076a1526f24122bd2faf7d0e005b61b" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/mambaforge-22.9.0-2000066400000000000000000000031231517431316200270230ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Mambaforge-22.9.0-2-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.9.0-2/Mambaforge-22.9.0-2-Linux-aarch64.sh#26cf4a5cd3a3b9085f75911b459b969d6ff8ab426ef9a8e7ce3b47cc683ead86" "miniconda" verify_py310 ;; "Linux-ppc64le" ) install_script "Mambaforge-22.9.0-2-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/22.9.0-2/Mambaforge-22.9.0-2-Linux-ppc64le.sh#e13044cdbce8542896dd8b7128a00b691c119e7ad6e872c7de93ec9954b4775d" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Mambaforge-22.9.0-2-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.9.0-2/Mambaforge-22.9.0-2-Linux-x86_64.sh#d2bb6c33f2373131fc71283baae9eb81a279708d007e55d627d85abe30c2d0eb" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Mambaforge-22.9.0-2-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.9.0-2/Mambaforge-22.9.0-2-MacOSX-arm64.sh#21959f1a17a662b3f260e8b04fe2dfe82f1246746875a72f513d39159d8b816b" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Mambaforge-22.9.0-2-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.9.0-2/Mambaforge-22.9.0-2-MacOSX-x86_64.sh#844fc1ac61967990f0cfb9e516e8b0704ac2e500854588fd9851d2790d817bab" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/mambaforge-22.9.0-3000066400000000000000000000031231517431316200270240ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Mambaforge-22.9.0-3-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.9.0-3/Mambaforge-22.9.0-3-Linux-aarch64.sh#bd9694b1558f4ee6c4eef081cefc57dbb32ceb6406e497018f0c7d2dab5b61dd" "miniconda" verify_py310 ;; "Linux-ppc64le" ) install_script "Mambaforge-22.9.0-3-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/22.9.0-3/Mambaforge-22.9.0-3-Linux-ppc64le.sh#f19dc098452ddbd73caa83792aaacd63674be20898ac63b38ad687e5148199f8" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Mambaforge-22.9.0-3-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.9.0-3/Mambaforge-22.9.0-3-Linux-x86_64.sh#29f6374464307732c2c9d6711cdbca4d685c632f31e8bf1a5565276c65e0069b" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Mambaforge-22.9.0-3-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.9.0-3/Mambaforge-22.9.0-3-MacOSX-arm64.sh#eebe06970fec4cb1445bba106e65f57084b753d39766bf213edf4e02b14e27c1" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Mambaforge-22.9.0-3-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.9.0-3/Mambaforge-22.9.0-3-MacOSX-x86_64.sh#a3ccaf7b93b6f99bc2018f2a6f3cd95489940731f11fb9bf6adf1a44a7ba4e17" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/mambaforge-23.1.0-0000066400000000000000000000031231517431316200270120ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Mambaforge-23.1.0-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-0/Mambaforge-23.1.0-0-Linux-aarch64.sh#01c29a399ad63c9aa28a69a622e9273e9bb8c5d504f1858ba789c5ca63ba1187" "miniconda" verify_py310 ;; "Linux-ppc64le" ) install_script "Mambaforge-23.1.0-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-0/Mambaforge-23.1.0-0-Linux-ppc64le.sh#ec0b8b10fbb9a7eb1b9c6ddf0487d0e8e0b16926791b84afc1623b43f45d1faf" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Mambaforge-23.1.0-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-0/Mambaforge-23.1.0-0-Linux-x86_64.sh#0598ec82e02233e0e242b12129349416225dd07c2318f0ec1cfce4d7d9c397d8" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Mambaforge-23.1.0-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-0/Mambaforge-23.1.0-0-MacOSX-arm64.sh#538ea7a9d24cad041a2b7fd71cf49f433137f9b4bc8e11408f2285e99cf79f96" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Mambaforge-23.1.0-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-0/Mambaforge-23.1.0-0-MacOSX-x86_64.sh#61d95ff7a7bbe465a416f5ad43460fb1a50e621ed15233cc4e3441a03bb48cd4" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/mambaforge-23.1.0-1000066400000000000000000000031231517431316200270130ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Mambaforge-23.1.0-1-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-1/Mambaforge-23.1.0-1-Linux-aarch64.sh#d9d89c9e349369702171008d9ee7c5ce80ed420e5af60bd150a3db4bf674443a" "miniconda" verify_py310 ;; "Linux-ppc64le" ) install_script "Mambaforge-23.1.0-1-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-1/Mambaforge-23.1.0-1-Linux-ppc64le.sh#f7065963c9c7eba0ea80ad6431903ddb89fe1ec34c47967cbb8a5247c613b30b" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Mambaforge-23.1.0-1-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-1/Mambaforge-23.1.0-1-Linux-x86_64.sh#cfb16c47dc2d115c8b114280aa605e322173f029fdb847a45348bf4bd23c62ab" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Mambaforge-23.1.0-1-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-1/Mambaforge-23.1.0-1-MacOSX-arm64.sh#e519a74734f963c2fe744557115f8862fa573dea0de581b0b4a22cbd31127448" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Mambaforge-23.1.0-1-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-1/Mambaforge-23.1.0-1-MacOSX-x86_64.sh#e33f9d426d62759e7c4adf5431fdd91a23df71732b5e22b699cace52255e8196" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/mambaforge-23.1.0-2000066400000000000000000000031231517431316200270140ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Mambaforge-23.1.0-2-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-2/Mambaforge-23.1.0-2-Linux-aarch64.sh#a1a3f7cd517e97ef9b0f8e4c1afeb659c7c69849e623904297984e79b1f29b37" "miniconda" verify_py310 ;; "Linux-ppc64le" ) install_script "Mambaforge-23.1.0-2-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-2/Mambaforge-23.1.0-2-Linux-ppc64le.sh#fa7e75949d227c12d152efce5ae494ad5725fb0f71151dfdbdddd60e3d265dde" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Mambaforge-23.1.0-2-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-2/Mambaforge-23.1.0-2-Linux-x86_64.sh#8c9244094375379cfe1b6317afc9e693924d0f58ea5c68c64cde4463847c1e31" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Mambaforge-23.1.0-2-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-2/Mambaforge-23.1.0-2-MacOSX-arm64.sh#a58be683b4c00c32591eedc7a6675c8a4d3c7cbf3ef3808f4513033de46be7c8" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Mambaforge-23.1.0-2-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-2/Mambaforge-23.1.0-2-MacOSX-x86_64.sh#f7c53778a47579d886441747a7fe697d020da3b1726f3f7fe7d7e779c3d506e2" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/mambaforge-23.1.0-3000066400000000000000000000031231517431316200270150ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Mambaforge-23.1.0-3-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-3/Mambaforge-23.1.0-3-Linux-aarch64.sh#b7038f4f4d972fa2589dd9edd014940b94600589f924cc6d35a9b11d37506c25" "miniconda" verify_py310 ;; "Linux-ppc64le" ) install_script "Mambaforge-23.1.0-3-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-3/Mambaforge-23.1.0-3-Linux-ppc64le.sh#b89f25891ce072a0de5f6f1f5889609dc1eee71ac1301c8ddb7538bd608f273c" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Mambaforge-23.1.0-3-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-3/Mambaforge-23.1.0-3-Linux-x86_64.sh#7a6a07de6063245163a87972fb15be3a226045166eb7ee526344f82da1f3b694" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Mambaforge-23.1.0-3-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-3/Mambaforge-23.1.0-3-MacOSX-arm64.sh#75368b03ac79b170537748a600ea847e35d83a4fef9ea438c34217b7e28b9330" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Mambaforge-23.1.0-3-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-3/Mambaforge-23.1.0-3-MacOSX-x86_64.sh#7e4dd16067bbb4ab41616f3378d0c788302818c7fe13806fe8e97707471c9004" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/mambaforge-23.1.0-4000066400000000000000000000031231517431316200270160ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Mambaforge-23.1.0-4-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-4/Mambaforge-23.1.0-4-Linux-aarch64.sh#95c354268f62e32d57c84f2e1a0caf9b19f77c894ecc83008db0e5e666ce3d43" "miniconda" verify_py310 ;; "Linux-ppc64le" ) install_script "Mambaforge-23.1.0-4-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-4/Mambaforge-23.1.0-4-Linux-ppc64le.sh#70ed57b9d32457c172c208b16a839937e2dd77e3fa1bff5ef1cb2f1a7da102ba" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Mambaforge-23.1.0-4-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-4/Mambaforge-23.1.0-4-Linux-x86_64.sh#6ca38e02be99c410644c283bac74601f296dd10995ce1c8d345af995a39b5916" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Mambaforge-23.1.0-4-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-4/Mambaforge-23.1.0-4-MacOSX-arm64.sh#baa1ae638537766cac808efba09175ba21878b34288476dc7bbd01347145721f" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Mambaforge-23.1.0-4-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-4/Mambaforge-23.1.0-4-MacOSX-x86_64.sh#26937ea98870531e51da942b7f6cc26cc9af49bb16390486ee6dde9e0dc2c597" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/mambaforge-23.10.0-0000066400000000000000000000031421517431316200270730ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Mambaforge-23.10.0-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.10.0-0/Mambaforge-23.10.0-0-Linux-aarch64.sh#38d86db6ef78caa0ac001c48f454112df2a1e90cd6884dba03a3265393f762b2" "miniconda" verify_py310 ;; "Linux-ppc64le" ) install_script "Mambaforge-23.10.0-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/23.10.0-0/Mambaforge-23.10.0-0-Linux-ppc64le.sh#8f28c516ef441c0691d94a7cf3917b8c77eda4ac378c89bd491d4d8ff4f887c8" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Mambaforge-23.10.0-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.10.0-0/Mambaforge-23.10.0-0-Linux-x86_64.sh#cf2782419e118db664653a6e63bbf212a24cbc3126c413aa5886fd0f7d20d3c0" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Mambaforge-23.10.0-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.10.0-0/Mambaforge-23.10.0-0-MacOSX-arm64.sh#8b300c413195f33c3965445213de2b76bbf5fcbe9087aa80b8d6bf81a21b5764" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Mambaforge-23.10.0-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.10.0-0/Mambaforge-23.10.0-0-MacOSX-x86_64.sh#8f1ddb27deffe5e631b3ce69fc3f880c7f3710ee08a42fee64e2b2e1a039683f" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/mambaforge-23.11.0-0000066400000000000000000000031421517431316200270740ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Mambaforge-23.11.0-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.11.0-0/Mambaforge-23.11.0-0-Linux-aarch64.sh#71320f28280b4e41f37469f6b0ae85e31ba9c26a87c7ee69cecaae3eaa5a4057" "miniconda" verify_py310 ;; "Linux-ppc64le" ) install_script "Mambaforge-23.11.0-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/23.11.0-0/Mambaforge-23.11.0-0-Linux-ppc64le.sh#148b18f94b5a0878d5fa1190b41cad5a803eca1cd15429e26571fef11422e2b2" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Mambaforge-23.11.0-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.11.0-0/Mambaforge-23.11.0-0-Linux-x86_64.sh#3dfdcc162bf0df83b5025608dc2acdbbc575bd416b75701fb5863343c0517a78" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Mambaforge-23.11.0-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.11.0-0/Mambaforge-23.11.0-0-MacOSX-arm64.sh#dd832d8a65a861b5592b2cf1d55f26031f7c1491b30321754443931e7b1e6832" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Mambaforge-23.11.0-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.11.0-0/Mambaforge-23.11.0-0-MacOSX-x86_64.sh#c6ac073b80cedb313561bc11c2e61b0bd102b74df0363ed6c1e90303b322092a" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/mambaforge-23.3.0-0000066400000000000000000000031231517431316200270140ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Mambaforge-23.3.0-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.3.0-0/Mambaforge-23.3.0-0-Linux-aarch64.sh#ae506f8013fc3f487dd3c9a4fde0b1a529b02bb5478921913c46a115dbcd7d1f" "miniconda" verify_py310 ;; "Linux-ppc64le" ) install_script "Mambaforge-23.3.0-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/23.3.0-0/Mambaforge-23.3.0-0-Linux-ppc64le.sh#f8c0e24abaedfcf611c70451d0bb771f453a0eb4cc0bbbb0670f9753817827a6" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Mambaforge-23.3.0-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.3.0-0/Mambaforge-23.3.0-0-Linux-x86_64.sh#f8b12a9815575b0fec9c85100053ef24e59043194546826fb565288c51ba930d" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Mambaforge-23.3.0-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.3.0-0/Mambaforge-23.3.0-0-MacOSX-arm64.sh#82ed548de9de74d2b6dda9830f581d897eb82694c1df79d957eaef9066dd7ef4" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Mambaforge-23.3.0-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.3.0-0/Mambaforge-23.3.0-0-MacOSX-x86_64.sh#d4603c9b380d5daa923f8d0543de5df57ba971a1562a519c6e3fe1240963012a" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/mambaforge-23.3.1-0000066400000000000000000000031231517431316200270150ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Mambaforge-23.3.1-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.3.1-0/Mambaforge-23.3.1-0-Linux-aarch64.sh#6e4feeafeff69f35a7455a35f763eb6d5a1e946e7b9b321099640ac93e619a53" "miniconda" verify_py310 ;; "Linux-ppc64le" ) install_script "Mambaforge-23.3.1-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/23.3.1-0/Mambaforge-23.3.1-0-Linux-ppc64le.sh#6518bf3aa2499a4c76fee54d33450d386a1d4c1bf2e0b2ddaec03f8f7b4319d2" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Mambaforge-23.3.1-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.3.1-0/Mambaforge-23.3.1-0-Linux-x86_64.sh#c425dcc3501692f23564d8b0a7b3ba69166c61424e9ce0d825f64f9479dcafa1" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Mambaforge-23.3.1-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.3.1-0/Mambaforge-23.3.1-0-MacOSX-arm64.sh#71e7ea4295d22f0c7ab08b334c07d9540e10775c8abd456314e186625cfb3bf1" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Mambaforge-23.3.1-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.3.1-0/Mambaforge-23.3.1-0-MacOSX-x86_64.sh#b7b5fe0690528a4d449597e49edb2595625f2cf29e0473fd2a8d2dabc4d948f5" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/mambaforge-23.3.1-1000066400000000000000000000031231517431316200270160ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Mambaforge-23.3.1-1-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.3.1-1/Mambaforge-23.3.1-1-Linux-aarch64.sh#32dcc92b4f0b0108ac0734721fb65172395f6c39ecdcaf5bf63edc01f0932020" "miniconda" verify_py310 ;; "Linux-ppc64le" ) install_script "Mambaforge-23.3.1-1-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/23.3.1-1/Mambaforge-23.3.1-1-Linux-ppc64le.sh#93fa681cadda8b73bd93a1bf2f60aaa577fe02ef537ee5300eab33af2b45f6d0" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Mambaforge-23.3.1-1-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.3.1-1/Mambaforge-23.3.1-1-Linux-x86_64.sh#dbe92c011a1315b9626e2f93a165892f4b89177145bc350b3859a483a3642a24" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Mambaforge-23.3.1-1-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.3.1-1/Mambaforge-23.3.1-1-MacOSX-arm64.sh#1b07c1a231a18f21da6aac1abe87dd173ce141ce7612f06eab962eb9f8353a27" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Mambaforge-23.3.1-1-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.3.1-1/Mambaforge-23.3.1-1-MacOSX-x86_64.sh#ee707e117c4eb54b7a02a0ba1b2fc2b60325ce6f767e76274e45dbe7743efa7d" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/mambaforge-24.1.2-0000066400000000000000000000031231517431316200270150ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Mambaforge-24.1.2-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.1.2-0/Mambaforge-24.1.2-0-Linux-aarch64.sh#937b2dab9a988d83a4a9e574148d1410204bdb3d137905083570e5a1a0a995e4" "miniconda" verify_py310 ;; "Linux-ppc64le" ) install_script "Mambaforge-24.1.2-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/24.1.2-0/Mambaforge-24.1.2-0-Linux-ppc64le.sh#68b28e441171cef9e4da81a1a99264a4b41c4bf99f8c132af9ec38c67fd41694" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Mambaforge-24.1.2-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.1.2-0/Mambaforge-24.1.2-0-Linux-x86_64.sh#b172a8d2ff1c452768dd1beffb8d61880dde89f14e855de7e2459963af33828c" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Mambaforge-24.1.2-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.1.2-0/Mambaforge-24.1.2-0-MacOSX-arm64.sh#b828ec3189393501d859b001f0dcfdf953140bb9506875ae997eb7ff641f6d19" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Mambaforge-24.1.2-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.1.2-0/Mambaforge-24.1.2-0-MacOSX-x86_64.sh#3d3f50d7fa16b65ec507c062e6a337ba9c812650c796eb06495930b8cdd5d471" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/mambaforge-24.11.0-0000066400000000000000000000031421517431316200270750ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Mambaforge-24.11.0-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.0-0/Mambaforge-24.11.0-0-Linux-aarch64.sh#5816a4a11f08b0caba33c38365f65d81f3659fd73da498a87ab4510a58a9abd5" "miniconda" verify_py312 ;; "Linux-ppc64le" ) install_script "Mambaforge-24.11.0-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.0-0/Mambaforge-24.11.0-0-Linux-ppc64le.sh#1d530dd326f9b8e29a8005cba28a239f00c7979337d642cc89531b4755fb69b7" "miniconda" verify_py312 ;; "Linux-x86_64" ) install_script "Mambaforge-24.11.0-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.0-0/Mambaforge-24.11.0-0-Linux-x86_64.sh#ae30935839c9e88458ce0605a251fa3f1ade623e3b9709f859460545577779f1" "miniconda" verify_py312 ;; "MacOSX-arm64" ) install_script "Mambaforge-24.11.0-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.0-0/Mambaforge-24.11.0-0-MacOSX-arm64.sh#5535232048d9e2430f165153636bbf781f21128132908e9db455130198c79dc5" "miniconda" verify_py312 ;; "MacOSX-x86_64" ) install_script "Mambaforge-24.11.0-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.0-0/Mambaforge-24.11.0-0-MacOSX-x86_64.sh#f3849b245e724c0d3efde9deb125041b6a78aff69867691e1f7ecff79c40cbd1" "miniconda" verify_py312 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/mambaforge-24.11.0-1000066400000000000000000000031421517431316200270760ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Mambaforge-24.11.0-1-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.0-1/Mambaforge-24.11.0-1-Linux-aarch64.sh#7a02a83679a04e164a7ed5a95fe18688032012a4619a2dba6051dada20a437c3" "miniconda" verify_py312 ;; "Linux-ppc64le" ) install_script "Mambaforge-24.11.0-1-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.0-1/Mambaforge-24.11.0-1-Linux-ppc64le.sh#7f985f2dba06a62dcebeaf832ac926ba85707552134b5be310e9a28e869550e1" "miniconda" verify_py312 ;; "Linux-x86_64" ) install_script "Mambaforge-24.11.0-1-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.0-1/Mambaforge-24.11.0-1-Linux-x86_64.sh#fad8afeb7a0247e8e8fd7a82e9306c694421d2e9b6b341752c73737fbebe4d73" "miniconda" verify_py312 ;; "MacOSX-arm64" ) install_script "Mambaforge-24.11.0-1-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.0-1/Mambaforge-24.11.0-1-MacOSX-arm64.sh#30d47bb61b337d2a2e166cc56923267089a6be526faf9677666af178a0059f0d" "miniconda" verify_py312 ;; "MacOSX-x86_64" ) install_script "Mambaforge-24.11.0-1-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.0-1/Mambaforge-24.11.0-1-MacOSX-x86_64.sh#2303dcacb52860660e3f290d06e9313acb9e8826bfa6c1ca10972fedc9e3b388" "miniconda" verify_py312 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/mambaforge-24.3.0-0000066400000000000000000000031231517431316200270150ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Mambaforge-24.3.0-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.3.0-0/Mambaforge-24.3.0-0-Linux-aarch64.sh#7f2a0282819f1a12bb44628a836b96fe9dfb21a5920fb8331325c47f91bf9a81" "miniconda" verify_py310 ;; "Linux-ppc64le" ) install_script "Mambaforge-24.3.0-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/24.3.0-0/Mambaforge-24.3.0-0-Linux-ppc64le.sh#4550d7cb6ea9bb145ae2aae7b02734a642ef24bda0abfc9b1b6d8d6abf0b7749" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Mambaforge-24.3.0-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.3.0-0/Mambaforge-24.3.0-0-Linux-x86_64.sh#0be3654cc3b9c43d3aeeeca5efe6d2f31e9f7711702f3818529b367b3db677fb" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Mambaforge-24.3.0-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.3.0-0/Mambaforge-24.3.0-0-MacOSX-arm64.sh#de7c7f229d05104de802f1f729a595736b08139c4ae59ba8ba0049050d63c98f" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Mambaforge-24.3.0-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.3.0-0/Mambaforge-24.3.0-0-MacOSX-x86_64.sh#5455900cf1298f21333b7c0d1ec159952e1ef5426563cc97eb7e42053d608afc" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/mambaforge-24.5.0-0000066400000000000000000000031231517431316200270170ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Mambaforge-24.5.0-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.5.0-0/Mambaforge-24.5.0-0-Linux-aarch64.sh#a19c4d40dc4aa9084d729f3fbed36fd7a741bb8a0ef4f7df4bc92c5157817ba8" "miniconda" verify_py312 ;; "Linux-ppc64le" ) install_script "Mambaforge-24.5.0-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/24.5.0-0/Mambaforge-24.5.0-0-Linux-ppc64le.sh#db6432e76bac0547d65f06e1e0559a0d12147e9020e0cce99c8b07a9c8f2824d" "miniconda" verify_py312 ;; "Linux-x86_64" ) install_script "Mambaforge-24.5.0-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.5.0-0/Mambaforge-24.5.0-0-Linux-x86_64.sh#afee51df9c542d2e1bef249ad167197ba90fd4386fd32a63383dc95efba4bdfe" "miniconda" verify_py312 ;; "MacOSX-arm64" ) install_script "Mambaforge-24.5.0-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.5.0-0/Mambaforge-24.5.0-0-MacOSX-arm64.sh#88514feaad5bf03605242bd4e767829ad9695587ef51621329343d9960771d2b" "miniconda" verify_py312 ;; "MacOSX-x86_64" ) install_script "Mambaforge-24.5.0-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.5.0-0/Mambaforge-24.5.0-0-MacOSX-x86_64.sh#1dfb244bce67bc6d9c0900cce2bf9d9feaf66ba60e811b7c98c6e580394d0ccc" "miniconda" verify_py312 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/mambaforge-24.7.1-0000066400000000000000000000031231517431316200270220ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Mambaforge-24.7.1-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.7.1-0/Mambaforge-24.7.1-0-Linux-aarch64.sh#09221afebba644eabccb5a83a92ba7e1bf88ff17171f80f77f95aa81cad225cc" "miniconda" verify_py312 ;; "Linux-ppc64le" ) install_script "Mambaforge-24.7.1-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/24.7.1-0/Mambaforge-24.7.1-0-Linux-ppc64le.sh#1ba05b444bea703097054a25aee2ebb7b04236632791f08f28db82491e005b52" "miniconda" verify_py312 ;; "Linux-x86_64" ) install_script "Mambaforge-24.7.1-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.7.1-0/Mambaforge-24.7.1-0-Linux-x86_64.sh#e72ecc1f1b170ee804da298e54ed616ce82543ce84a8b83f63cb0ada2e4bfa50" "miniconda" verify_py312 ;; "MacOSX-arm64" ) install_script "Mambaforge-24.7.1-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.7.1-0/Mambaforge-24.7.1-0-MacOSX-arm64.sh#204be9ff318a5b23f9466f8bbbf18f7e180c6ed393ffc2a9859d8ab06c474248" "miniconda" verify_py312 ;; "MacOSX-x86_64" ) install_script "Mambaforge-24.7.1-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.7.1-0/Mambaforge-24.7.1-0-MacOSX-x86_64.sh#668e69e89e41c5e9bae4431cf4040346eb6e484831577a28795c44039f70798d" "miniconda" verify_py312 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/mambaforge-24.7.1-1000066400000000000000000000031231517431316200270230ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Mambaforge-24.7.1-1-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.7.1-1/Mambaforge-24.7.1-1-Linux-aarch64.sh#34ea804e678d71c747d5a7fc99f97ffea395252c8acaf0c66e6dc6812585573b" "miniconda" verify_py312 ;; "Linux-ppc64le" ) install_script "Mambaforge-24.7.1-1-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/24.7.1-1/Mambaforge-24.7.1-1-Linux-ppc64le.sh#3ee3e1d127adeea1950ed1b73ccbc7e4d9f2a25e98f5a18c09e8a3bb8a905d05" "miniconda" verify_py312 ;; "Linux-x86_64" ) install_script "Mambaforge-24.7.1-1-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.7.1-1/Mambaforge-24.7.1-1-Linux-x86_64.sh#7b47af948c8a5d786bc7036eb918ba1254273a820bacd83596316919cd097a14" "miniconda" verify_py312 ;; "MacOSX-arm64" ) install_script "Mambaforge-24.7.1-1-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.7.1-1/Mambaforge-24.7.1-1-MacOSX-arm64.sh#5994a2ad9cd40b2c79cc67173b9be42ec04b7b5d65ad17443bd67d68740bc403" "miniconda" verify_py312 ;; "MacOSX-x86_64" ) install_script "Mambaforge-24.7.1-1-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.7.1-1/Mambaforge-24.7.1-1-MacOSX-x86_64.sh#4fc2637e40282562a1139827cf36e98a71dfdd9b3306967210f9d02badf65447" "miniconda" verify_py312 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/mambaforge-24.7.1-2000066400000000000000000000031231517431316200270240ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Mambaforge-24.7.1-2-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.7.1-2/Mambaforge-24.7.1-2-Linux-aarch64.sh#fd99046ef2394198c56df8988f50bbd18967edbc36d7fb29a4814f46ee5ab210" "miniconda" verify_py312 ;; "Linux-ppc64le" ) install_script "Mambaforge-24.7.1-2-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/24.7.1-2/Mambaforge-24.7.1-2-Linux-ppc64le.sh#3a09b99214c47d744c1e80a52de3e26b4a0420463cb50bade04b454af8ace591" "miniconda" verify_py312 ;; "Linux-x86_64" ) install_script "Mambaforge-24.7.1-2-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.7.1-2/Mambaforge-24.7.1-2-Linux-x86_64.sh#4ce9db89d22e3ebd4e5c5d0b745613e25dcef79fba4d67760b09d76f15020d4c" "miniconda" verify_py312 ;; "MacOSX-arm64" ) install_script "Mambaforge-24.7.1-2-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.7.1-2/Mambaforge-24.7.1-2-MacOSX-arm64.sh#5920c685a6bedb7d71fe0caafd5fafdb41a664ff6f41ee637fd683e283e4d771" "miniconda" verify_py312 ;; "MacOSX-x86_64" ) install_script "Mambaforge-24.7.1-2-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.7.1-2/Mambaforge-24.7.1-2-MacOSX-x86_64.sh#ec0ec07816a97080443472e052a6777c1e3870a83cadba1254bfa3bc60f65a6c" "miniconda" verify_py312 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/mambaforge-24.9.0-0000066400000000000000000000031231517431316200270230ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Mambaforge-24.9.0-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.9.0-0/Mambaforge-24.9.0-0-Linux-aarch64.sh#2d83f58793e9e303746747a683833aec5b9178fb1a313a3f9a56df2d319e23a5" "miniconda" verify_py312 ;; "Linux-ppc64le" ) install_script "Mambaforge-24.9.0-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/24.9.0-0/Mambaforge-24.9.0-0-Linux-ppc64le.sh#cc083e40b1891611b26b0f63b5df3422cb4f8e1a29204f55caea514ead528eb2" "miniconda" verify_py312 ;; "Linux-x86_64" ) install_script "Mambaforge-24.9.0-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.9.0-0/Mambaforge-24.9.0-0-Linux-x86_64.sh#77fb505f6266ffa1b5d59604cf6ba25948627e908928cbff148813957b1c28af" "miniconda" verify_py312 ;; "MacOSX-arm64" ) install_script "Mambaforge-24.9.0-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.9.0-0/Mambaforge-24.9.0-0-MacOSX-arm64.sh#ceb3dac98c1618f652aed493dc9488155ac7ca2c8abaccd18b93e58034a462c6" "miniconda" verify_py312 ;; "MacOSX-x86_64" ) install_script "Mambaforge-24.9.0-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.9.0-0/Mambaforge-24.9.0-0-MacOSX-x86_64.sh#046d8eedabafc798c88f3764e71b6ca22728ccbf04806b68450421cb6ebdaae6" "miniconda" verify_py312 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/mambaforge-24.9.2-0000066400000000000000000000031231517431316200270250ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Mambaforge-24.9.2-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.9.2-0/Mambaforge-24.9.2-0-Linux-aarch64.sh#f142244dd08dc1a7dbb95a48f22e2c0cba01602bc0b6b0425520460d278c2f4d" "miniconda" verify_py312 ;; "Linux-ppc64le" ) install_script "Mambaforge-24.9.2-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/24.9.2-0/Mambaforge-24.9.2-0-Linux-ppc64le.sh#0c442d49787dea24847690e85744566cc901641b2c0ffd3f4e6579c9c4306a94" "miniconda" verify_py312 ;; "Linux-x86_64" ) install_script "Mambaforge-24.9.2-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.9.2-0/Mambaforge-24.9.2-0-Linux-x86_64.sh#9e122fbb925a96011b876fcf118d70c55cbe982b6ee001fe23aa8a2600d649d1" "miniconda" verify_py312 ;; "MacOSX-arm64" ) install_script "Mambaforge-24.9.2-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.9.2-0/Mambaforge-24.9.2-0-MacOSX-arm64.sh#85f1c04493513a4552a14ed32b785c0b5484ecfafa827ef413605fd20e5d5cea" "miniconda" verify_py312 ;; "MacOSX-x86_64" ) install_script "Mambaforge-24.9.2-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.9.2-0/Mambaforge-24.9.2-0-MacOSX-x86_64.sh#f845ed82244fe553dc4d1b3a7c134e3c0ede26a84d2d279cfa93bdcb0fc739b0" "miniconda" verify_py312 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/mambaforge-4.10.1-4000066400000000000000000000024561517431316200270260ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86_64" ) install_script "Mambaforge-4.10.1-4-Linux-x86_64" "https://github.com/conda-forge/miniforge/releases/download/4.10.1-4/Mambaforge-4.10.1-4-Linux-x86_64.sh#9eb335cb559644a6e462c077ebc129af51b7329817574fb707b994dafdddf2af" "miniconda" verify_py38 ;; "Linux-aarch64" ) install_script "Mambaforge-4.10.1-4-Linux-aarch64" "https://github.com/conda-forge/miniforge/releases/download/4.10.1-4/Mambaforge-4.10.1-4-Linux-aarch64.sh#eb7d10c758afbd59432a8f08294bc3ac053e747e1997ff5d6a1141a276b6d0e5" "miniconda" verify_py38 ;; "MacOSX-arm64" ) install_script "Mambaforge-4.10.1-4-MacOSX-arm64" "https://github.com/conda-forge/miniforge/releases/download/4.10.1-4/Mambaforge-4.10.1-4-MacOSX-arm64.sh#90a75e9fa9fedfe991a9eaf65cae62ef5cdb6a8fda9375654f31b3b6cf99ef06" "miniconda" verify_py39 ;; "MacOSX-x86_64" ) install_script "Mambaforge-4.10.1-4-MacOSX-x86_64" "https://github.com/conda-forge/miniforge/releases/download/4.10.1-4/Mambaforge-4.10.1-4-MacOSX-x86_64.sh#b8a849f0cf2923940a2fcda47a5f7181fa855dfc5c1b59134ac7e8b3735e0f71" "miniconda" verify_py38 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/mambaforge-4.10.1-5000066400000000000000000000024561517431316200270270ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86_64" ) install_script "Mambaforge-4.10.1-5-Linux-x86_64" "https://github.com/conda-forge/miniforge/releases/download/4.10.1-5/Mambaforge-4.10.1-5-Linux-x86_64.sh#069e151cae85ed4747721e938e7974aa00889a1ae87cff33ddbdde9530fc4c6d" "miniconda" verify_py38 ;; "Linux-aarch64" ) install_script "Mambaforge-4.10.1-5-Linux-aarch64" "https://github.com/conda-forge/miniforge/releases/download/4.10.1-5/Mambaforge-4.10.1-5-Linux-aarch64.sh#64739b6eb0108ff3873d4edb32d2760db166cc822797234654c888c0f7063b9d" "miniconda" verify_py38 ;; "MacOSX-arm64" ) install_script "Mambaforge-4.10.1-5-MacOSX-arm64" "https://github.com/conda-forge/miniforge/releases/download/4.10.1-5/Mambaforge-4.10.1-5-MacOSX-arm64.sh#20553cd410ae250cd1cabce04e7478f57439ab1d55cb1c6a157998d96bee1b7d" "miniconda" verify_py39 ;; "MacOSX-x86_64" ) install_script "Mambaforge-4.10.1-5-MacOSX-x86_64" "https://github.com/conda-forge/miniforge/releases/download/4.10.1-5/Mambaforge-4.10.1-5-MacOSX-x86_64.sh#871fc6471ff8de7aa609db5f1a8e99bfaea6dabbbd2c41fa61c26ef82daa6832" "miniconda" verify_py38 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/mambaforge-4.10.2-0000066400000000000000000000031231517431316200270130ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Mambaforge-4.10.2-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.2-0/Mambaforge-4.10.2-0-Linux-aarch64.sh#cbc5329fa22f4d7ff10f66e59024b186d37653b9da31d841d23092a701f46b1f" "miniconda" verify_py310 ;; "Linux-ppc64le" ) install_script "Mambaforge-4.10.2-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.2-0/Mambaforge-4.10.2-0-Linux-ppc64le.sh#c682e2e1f07e2da07cbe6252559af363bb0b67aa315527887fe2dd5123ca8760" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Mambaforge-4.10.2-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.2-0/Mambaforge-4.10.2-0-Linux-x86_64.sh#1e89ee86afa06e23b2478579be16a33fff6cff346314f6a6382fd20b1f83e669" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Mambaforge-4.10.2-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.2-0/Mambaforge-4.10.2-0-MacOSX-arm64.sh#87768fed0097edf58a129981129142db2651ab5d1591e19c5840ade186b443c5" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Mambaforge-4.10.2-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.2-0/Mambaforge-4.10.2-0-MacOSX-x86_64.sh#5a396db66672b5e6557e692bcb3cb527bcbe7c24b9c4a1c67b4449f8ef67cd47" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/mambaforge-4.10.3-0000066400000000000000000000031231517431316200270140ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Mambaforge-4.10.3-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-0/Mambaforge-4.10.3-0-Linux-aarch64.sh#d6d4fdf1d722c4afe9fdf5e372369321d5de9b491fdada22255665b122453fc7" "miniconda" verify_py310 ;; "Linux-ppc64le" ) install_script "Mambaforge-4.10.3-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-0/Mambaforge-4.10.3-0-Linux-ppc64le.sh#cdda287122007bdc6b96ed62fb17c7c8213e38b3598ad6db03d8301c81d7d594" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Mambaforge-4.10.3-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-0/Mambaforge-4.10.3-0-Linux-x86_64.sh#5c3914235c0db8a8925d294a17d196fca7e6eab9175406fc78ed90fde34297db" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Mambaforge-4.10.3-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-0/Mambaforge-4.10.3-0-MacOSX-arm64.sh#17a38bf23ef3f2864eb3c1ebf1c07389635ad9ff65f0692f438c1f6286feef63" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Mambaforge-4.10.3-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-0/Mambaforge-4.10.3-0-MacOSX-x86_64.sh#43986b8c2a6b3535c2fa920c8001187c89695c0aaaa96c25696adb7746e0eb54" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/mambaforge-4.10.3-1000066400000000000000000000031231517431316200270150ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Mambaforge-4.10.3-1-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-1/Mambaforge-4.10.3-1-Linux-aarch64.sh#e830d626bcf8fccde1e64567fa9974d87fa45026c3baa73c889bab9a7fa60647" "miniconda" verify_py310 ;; "Linux-ppc64le" ) install_script "Mambaforge-4.10.3-1-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-1/Mambaforge-4.10.3-1-Linux-ppc64le.sh#ade3331e4946dc149c97346941c635ddef1b99d63ec0781027a0ae0d156f62d7" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Mambaforge-4.10.3-1-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-1/Mambaforge-4.10.3-1-Linux-x86_64.sh#72c623cc9ce300c5ad54e0b383e428b13e5c640e74529295ab61fbbfa1a8acaa" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Mambaforge-4.10.3-1-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-1/Mambaforge-4.10.3-1-MacOSX-arm64.sh#5d1e6ae4eb424290271fe25e7f8c3e8165ba5730a4817f92a157566f44c7e363" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Mambaforge-4.10.3-1-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-1/Mambaforge-4.10.3-1-MacOSX-x86_64.sh#a8b0e666c893eb21769c00ab4ba603d28590f4c92d1fafe6ca2eb959cecf76ce" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/mambaforge-4.10.3-10000066400000000000000000000024721517431316200271030ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86_64" ) install_script "Mambaforge-4.10.3-10-Linux-x86_64" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-10/Mambaforge-4.10.3-10-Linux-x86_64.sh#8b789c619d03760e606a9c9b3d098414653f6037b80f16174ad94f0ee0c679d8" "miniconda" verify_py38 ;; "Linux-aarch64" ) install_script "Mambaforge-4.10.3-10-Linux-aarch64" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-10/Mambaforge-4.10.3-10-Linux-aarch64.sh#60a1d50c92fe1d48e2744effca9e7b51bfd5cc4e863dbcdb762ed48020703e3a" "miniconda" verify_py38 ;; "MacOSX-arm64" ) install_script "Mambaforge-4.10.3-10-MacOSX-arm64" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-10/Mambaforge-4.10.3-10-MacOSX-arm64.sh#72bc86612ab9435915b616c2edb076737cbabe2c33fd684d58c2f9ae72e1957c" "miniconda" verify_py39 ;; "MacOSX-x86_64" ) install_script "Mambaforge-4.10.3-10-MacOSX-x86_64" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-10/Mambaforge-4.10.3-10-MacOSX-x86_64.sh#7c44259a0982cd3ef212649678af5f0dd4e0bb7306e8fffc93601dd1d739ec0b" "miniconda" verify_py38 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/mambaforge-4.10.3-2000066400000000000000000000031231517431316200270160ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Mambaforge-4.10.3-2-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-2/Mambaforge-4.10.3-2-Linux-aarch64.sh#63294acfe2859c4a7b86151836da3253fd0370e9e0cd821be6ffb18a029c3a7a" "miniconda" verify_py310 ;; "Linux-ppc64le" ) install_script "Mambaforge-4.10.3-2-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-2/Mambaforge-4.10.3-2-Linux-ppc64le.sh#8162d50d3111a4c0746c7a4e51094eea3011966816768c4d3638fe40050d6e59" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Mambaforge-4.10.3-2-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-2/Mambaforge-4.10.3-2-Linux-x86_64.sh#e4228930af7102de20019efdf45e4e9c056b6ae354cb2e344249e53a11f71175" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Mambaforge-4.10.3-2-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-2/Mambaforge-4.10.3-2-MacOSX-arm64.sh#49132e1e2593b4ab3762ff238e76dfc5f5bd670fe23c622c5051607709f93a0b" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Mambaforge-4.10.3-2-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-2/Mambaforge-4.10.3-2-MacOSX-x86_64.sh#cbd143702ed1d1176fa3b480eca1ec6eb0e32a2c9eab7134877ff32dabae91e0" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/mambaforge-4.10.3-3000066400000000000000000000031231517431316200270170ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Mambaforge-4.10.3-3-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-3/Mambaforge-4.10.3-3-Linux-aarch64.sh#c53eda563935e7ed5d07816477758374f4c541d912ee5732f2f9ace37d9fab75" "miniconda" verify_py310 ;; "Linux-ppc64le" ) install_script "Mambaforge-4.10.3-3-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-3/Mambaforge-4.10.3-3-Linux-ppc64le.sh#3b762a3cf77fffebc56d3ecdefe590bf065139b36f556bb57f7f83a0ebe8561b" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Mambaforge-4.10.3-3-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-3/Mambaforge-4.10.3-3-Linux-x86_64.sh#a012c24e1cc3bcbe74a1e5693e510830e7c2956e85877b08d1e28707a0bd8d75" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Mambaforge-4.10.3-3-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-3/Mambaforge-4.10.3-3-MacOSX-arm64.sh#6cbae54d7a2d99cdcf747d74412a0c6490c8240cbb2d870655f61a9600bc2f06" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Mambaforge-4.10.3-3-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-3/Mambaforge-4.10.3-3-MacOSX-x86_64.sh#69f626a18eb1a6fda52d9f005114604acff1fd2d7c10d46e56543dca7d78f30d" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/mambaforge-4.10.3-4000066400000000000000000000031231517431316200270200ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Mambaforge-4.10.3-4-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-4/Mambaforge-4.10.3-4-Linux-aarch64.sh#f37435d5e2bc3eb14ec7f5bc64f9c45997f8e0a6d2fef3a7bb1ffa19f118817b" "miniconda" verify_py310 ;; "Linux-ppc64le" ) install_script "Mambaforge-4.10.3-4-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-4/Mambaforge-4.10.3-4-Linux-ppc64le.sh#68319a11298b8c13a15960cd9d2a5777fd34420b73587a7f2e8e4757752f3252" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Mambaforge-4.10.3-4-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-4/Mambaforge-4.10.3-4-Linux-x86_64.sh#5017562c434185b4d9d311274c14717077f6c09a238a4d34a1caf7618d26ddd4" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Mambaforge-4.10.3-4-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-4/Mambaforge-4.10.3-4-MacOSX-arm64.sh#901f2c2b4be08cadf6968f408d4a1ee632ddb011a07ce4b480b83d8da142255f" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Mambaforge-4.10.3-4-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-4/Mambaforge-4.10.3-4-MacOSX-x86_64.sh#b5fd40995aebd7631f761324eb425ee813fb4604ce8d8fde3c03cb60cac1716e" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/mambaforge-4.10.3-5000066400000000000000000000031231517431316200270210ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Mambaforge-4.10.3-5-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-5/Mambaforge-4.10.3-5-Linux-aarch64.sh#5e471d796d7b1749949c0c0d79841e00f1b477833ce82b4b05b7b9886a1735eb" "miniconda" verify_py310 ;; "Linux-ppc64le" ) install_script "Mambaforge-4.10.3-5-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-5/Mambaforge-4.10.3-5-Linux-ppc64le.sh#892ccb32b847978062c8045e96827a403d59fe64f318e0b92303be6a08e4d3f7" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Mambaforge-4.10.3-5-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-5/Mambaforge-4.10.3-5-Linux-x86_64.sh#2692f9ae27327412cbf018ec0218d21a99b013d0597ccaefc988540c8a9ced65" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Mambaforge-4.10.3-5-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-5/Mambaforge-4.10.3-5-MacOSX-arm64.sh#1c7517e204814f7227ef0d2e0fbf95b43f6afae978e882cd017779e31f8b26cb" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Mambaforge-4.10.3-5-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-5/Mambaforge-4.10.3-5-MacOSX-x86_64.sh#547823784a2b79641f29d06f70f74ae25775eec1680c6cca14888c4907441f5c" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/mambaforge-4.10.3-6000066400000000000000000000031231517431316200270220ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Mambaforge-4.10.3-6-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-6/Mambaforge-4.10.3-6-Linux-aarch64.sh#b6d3c0af4ba6202dc9994e70933d2de47ef8c4e6891afce768889a7d44e1db28" "miniconda" verify_py310 ;; "Linux-ppc64le" ) install_script "Mambaforge-4.10.3-6-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-6/Mambaforge-4.10.3-6-Linux-ppc64le.sh#9d50677aeff37b56b0d6067339aad8c964942e28fc74a24a7602416a3dcc35b2" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Mambaforge-4.10.3-6-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-6/Mambaforge-4.10.3-6-Linux-x86_64.sh#c63907ba0971d2ca9a8775bd7ea48b635b2bdce4838b2f2d3a8e751876849595" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Mambaforge-4.10.3-6-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-6/Mambaforge-4.10.3-6-MacOSX-arm64.sh#c753e99380e3f777d690e7131fc79c6f9cb8fb79af23fb53c7b8a0ade3361fec" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Mambaforge-4.10.3-6-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-6/Mambaforge-4.10.3-6-MacOSX-x86_64.sh#955a6255871d9b53975e1c1581910844bcf33cbca613c7dba2842f6269917da6" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/mambaforge-4.10.3-7000066400000000000000000000031231517431316200270230ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Mambaforge-4.10.3-7-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-7/Mambaforge-4.10.3-7-Linux-aarch64.sh#ac95f137b287b3408e4f67f07a284357b1119ee157373b788b34e770ef2392b2" "miniconda" verify_py310 ;; "Linux-ppc64le" ) install_script "Mambaforge-4.10.3-7-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-7/Mambaforge-4.10.3-7-Linux-ppc64le.sh#21c0190d2462eea68c78a600ce28828238d6a450858a289d7d4c03d9a2551ee8" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Mambaforge-4.10.3-7-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-7/Mambaforge-4.10.3-7-Linux-x86_64.sh#fc872522ec427fcab10167a93e802efaf251024b58cc27b084b915a9a73c4474" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Mambaforge-4.10.3-7-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-7/Mambaforge-4.10.3-7-MacOSX-arm64.sh#49c7ba06fe663c634929d5d85b4c06840f4ab9844744be691aab90848c52444e" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Mambaforge-4.10.3-7-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-7/Mambaforge-4.10.3-7-MacOSX-x86_64.sh#94ed8b8a647f48a815590958217aabebd4a3e3e10edaf2c5772d50a75727773a" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/mambaforge-4.10.3-8000066400000000000000000000014321517431316200270250ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "MacOSX-arm64" ) install_script "Mambaforge-4.10.3-8-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-8/Mambaforge-4.10.3-8-MacOSX-arm64.sh#f40271609a59bad71e7b1c6fa61a36065ea35222a9497614bc970572594e1f5a" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Mambaforge-4.10.3-8-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-8/Mambaforge-4.10.3-8-MacOSX-x86_64.sh#4f3dfd9475ed226f6a4478fe5c0585117528700557fe06fb9db054a354f07951" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/mambaforge-4.10.3-9000066400000000000000000000031231517431316200270250ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Mambaforge-4.10.3-9-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-9/Mambaforge-4.10.3-9-Linux-aarch64.sh#91fcdf2dfca49d68daaa9927d38f77a82718b5b72333180f9855e5b2cfa07c3b" "miniconda" verify_py310 ;; "Linux-ppc64le" ) install_script "Mambaforge-4.10.3-9-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-9/Mambaforge-4.10.3-9-Linux-ppc64le.sh#4873079e88bcda0225af7c6acf59b48b272bb147ab9506e1b80cdab035a53b02" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Mambaforge-4.10.3-9-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-9/Mambaforge-4.10.3-9-Linux-x86_64.sh#f53ab6584385a4648608993de2a66bb84b9255c87e1f4315bb39cbfc05b19e87" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Mambaforge-4.10.3-9-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-9/Mambaforge-4.10.3-9-MacOSX-arm64.sh#968fe531ee2d9900409853085e6b458077144c1674061a5501938e3581b5adf4" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Mambaforge-4.10.3-9-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-9/Mambaforge-4.10.3-9-MacOSX-x86_64.sh#d669b345a7612552a9a218e3499b7a3a7c8deec2925d203155bd0922250b2823" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/mambaforge-4.11.0-0000066400000000000000000000031231517431316200270120ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Mambaforge-4.11.0-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.11.0-0/Mambaforge-4.11.0-0-Linux-aarch64.sh#9ad5db1775ed7f6a390774a7b7a2aeac3992499ee4b01e801f53528857112dc0" "miniconda" verify_py310 ;; "Linux-ppc64le" ) install_script "Mambaforge-4.11.0-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/4.11.0-0/Mambaforge-4.11.0-0-Linux-ppc64le.sh#6fe80e207d409eb6c0922e068aa23aff5032083d9a5c2aacecc446a1d20f357b" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Mambaforge-4.11.0-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.11.0-0/Mambaforge-4.11.0-0-Linux-x86_64.sh#49268ee30d4418be4de852dda3aa4387f8c95b55a76f43fb1af68dcbf8b205c3" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Mambaforge-4.11.0-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.11.0-0/Mambaforge-4.11.0-0-MacOSX-arm64.sh#7703e27a2ceadb747a69f2c6a88b3cb859cb4bb4268fc85b03739e22d0eb160b" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Mambaforge-4.11.0-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.11.0-0/Mambaforge-4.11.0-0-MacOSX-x86_64.sh#2039f744e272d47878f0bc2ae372f03c7f07881f39a93d693d5445744f36f19d" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/mambaforge-4.11.0-1000066400000000000000000000031231517431316200270130ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Mambaforge-4.11.0-1-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.11.0-1/Mambaforge-4.11.0-1-Linux-aarch64.sh#8b2cd64b89c7e92a444dd2df993a4c0aeda20b1d090aeef8956bbb3fa5c526fe" "miniconda" verify_py310 ;; "Linux-ppc64le" ) install_script "Mambaforge-4.11.0-1-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/4.11.0-1/Mambaforge-4.11.0-1-Linux-ppc64le.sh#c7fb2000b4447a410fd18d334a9b658f8682b19962fe0e22d1d003078dc89dfe" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Mambaforge-4.11.0-1-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.11.0-1/Mambaforge-4.11.0-1-Linux-x86_64.sh#32eb24c99062d5c97d1b8ab55cae19e37cca08464a3249e5eac65339927697e9" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Mambaforge-4.11.0-1-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.11.0-1/Mambaforge-4.11.0-1-MacOSX-arm64.sh#ce002867552011148b77e1df022465c584d25d0aec02fc15fdc96b68a0da1545" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Mambaforge-4.11.0-1-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.11.0-1/Mambaforge-4.11.0-1-MacOSX-x86_64.sh#11b0e24649ca1931cfcc92ff2b3a67d43e7f2485a1f57b7f512b5b7cd6f3f27c" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/mambaforge-4.11.0-2000066400000000000000000000031231517431316200270140ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Mambaforge-4.11.0-2-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.11.0-2/Mambaforge-4.11.0-2-Linux-aarch64.sh#dc24d61b3c57fde5bb05367a9514bcdf7acd820f97ef913e94781c78dff55f8d" "miniconda" verify_py310 ;; "Linux-ppc64le" ) install_script "Mambaforge-4.11.0-2-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/4.11.0-2/Mambaforge-4.11.0-2-Linux-ppc64le.sh#8936568238c0ab4ae6444390cbe22853f8852080b5bc85912e1d41c8d3bbaea7" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Mambaforge-4.11.0-2-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.11.0-2/Mambaforge-4.11.0-2-Linux-x86_64.sh#5708db10e2e84035f9ed5700731435bf4027c73b0d5d41562cb5cf5dd9048925" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Mambaforge-4.11.0-2-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.11.0-2/Mambaforge-4.11.0-2-MacOSX-arm64.sh#8265d0902b6c3914a64afa7899c6398b1db7005603ad5d190dc0f0c87e8a8446" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Mambaforge-4.11.0-2-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.11.0-2/Mambaforge-4.11.0-2-MacOSX-x86_64.sh#e6312bcd55bac1036ce0d3c52a36bf57d3f65d3ec4f36f6267617dbb7edfe16d" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/mambaforge-4.11.0-3000066400000000000000000000014321517431316200270160ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "MacOSX-arm64" ) install_script "Mambaforge-4.11.0-3-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.11.0-3/Mambaforge-4.11.0-3-MacOSX-arm64.sh#7f16bf19722987cba7b077a010276262d8c3b521cb5c759f0b981e0fb0877d50" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Mambaforge-4.11.0-3-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.11.0-3/Mambaforge-4.11.0-3-MacOSX-x86_64.sh#e0e60c1542d087b514c3a81a1d4df9f0cc1d127b5245f1685bf77b2562ad6314" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/mambaforge-4.11.0-4000066400000000000000000000031231517431316200270160ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Mambaforge-4.11.0-4-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.11.0-4/Mambaforge-4.11.0-4-Linux-aarch64.sh#e2105e962f19a764c33d986f6e6850a3ce9aef9efc9571c7293b5274c335231d" "miniconda" verify_py310 ;; "Linux-ppc64le" ) install_script "Mambaforge-4.11.0-4-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/4.11.0-4/Mambaforge-4.11.0-4-Linux-ppc64le.sh#d50a94a0fd367242db4bf5121ba4fd9356e171c79444d2226081275baa31e63a" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Mambaforge-4.11.0-4-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.11.0-4/Mambaforge-4.11.0-4-Linux-x86_64.sh#3f3a9177c3ce022a5f7f8798aab360af004c6c1e4963d0e91fc005e54bc1e271" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Mambaforge-4.11.0-4-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.11.0-4/Mambaforge-4.11.0-4-MacOSX-arm64.sh#d0a86d865d3881f26bc0e677a83b7fdff700536e654cd8490c8fdc1731f93f6c" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Mambaforge-4.11.0-4-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.11.0-4/Mambaforge-4.11.0-4-MacOSX-x86_64.sh#9b385902da43fba025ba8a02e628057217fe75cace15af26add5748ab443abbb" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/mambaforge-4.12.0-0000066400000000000000000000031231517431316200270130ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Mambaforge-4.12.0-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.12.0-0/Mambaforge-4.12.0-0-Linux-aarch64.sh#44e0a9f7c32e855e82a24af4df9a65ecf35a12b6eede8822b24dcf2308289d40" "miniconda" verify_py310 ;; "Linux-ppc64le" ) install_script "Mambaforge-4.12.0-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/4.12.0-0/Mambaforge-4.12.0-0-Linux-ppc64le.sh#44de866d661a441f5e32605ce4708b3323f80348ccb5e0568e52a25a3de0d81e" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Mambaforge-4.12.0-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.12.0-0/Mambaforge-4.12.0-0-Linux-x86_64.sh#6c6fd04d688ceb7e6b540bba059dd3a541d60602e9adece3abaf754d15c83484" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Mambaforge-4.12.0-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.12.0-0/Mambaforge-4.12.0-0-MacOSX-arm64.sh#59d847b17148ebd27a4b31775d0047302cf9f8f8dae7db1e75bf037f0a823d48" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Mambaforge-4.12.0-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.12.0-0/Mambaforge-4.12.0-0-MacOSX-x86_64.sh#2301f866fb239ce6cda3e741e00be22ff7aa5ff76ba5683509ebae58df917546" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/mambaforge-4.12.0-1000066400000000000000000000031231517431316200270140ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Mambaforge-4.12.0-1-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.12.0-1/Mambaforge-4.12.0-1-Linux-aarch64.sh#c6ee5819f700926485197c864ed1190e8ca9d436cf15b100ed8a35540f1c46ea" "miniconda" verify_py310 ;; "Linux-ppc64le" ) install_script "Mambaforge-4.12.0-1-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/4.12.0-1/Mambaforge-4.12.0-1-Linux-ppc64le.sh#87dc485c6c82592102b8704e0e59cf9ce2fef762c369011a3e132fa72549d730" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Mambaforge-4.12.0-1-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.12.0-1/Mambaforge-4.12.0-1-Linux-x86_64.sh#10f7194e7356e46e41ddf6add800a2f175a801211ed62869ad8c0c301d493c34" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Mambaforge-4.12.0-1-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.12.0-1/Mambaforge-4.12.0-1-MacOSX-arm64.sh#234504f4db1d04966218f0c1ad73418a15e7e9bdf714d166bc5e86b917291cc2" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Mambaforge-4.12.0-1-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.12.0-1/Mambaforge-4.12.0-1-MacOSX-x86_64.sh#e68c3b8f94db17aae3b33f2bacb950c613c06b170507002d72231ff320b9ad7c" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/mambaforge-4.12.0-2000066400000000000000000000031231517431316200270150ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Mambaforge-4.12.0-2-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.12.0-2/Mambaforge-4.12.0-2-Linux-aarch64.sh#6b67bdd1552dfd6a2257c4c3da0ead19a4d34f68c16fb3e5b4bbc728b60cd200" "miniconda" verify_py310 ;; "Linux-ppc64le" ) install_script "Mambaforge-4.12.0-2-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/4.12.0-2/Mambaforge-4.12.0-2-Linux-ppc64le.sh#f8700febc99cbda9cbe9ff52364477ed6a04efdf15a0aa499d8ea8be4a58998c" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Mambaforge-4.12.0-2-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.12.0-2/Mambaforge-4.12.0-2-Linux-x86_64.sh#8cb16ef82fe18d466850abb873c7966090b0fbdcf1e80842038e0b4e6d8f0b66" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Mambaforge-4.12.0-2-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.12.0-2/Mambaforge-4.12.0-2-MacOSX-arm64.sh#2e2be9d976da31b62ab314881d3c6ed3f65c76e3ea69cc4b59fb344780109026" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Mambaforge-4.12.0-2-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.12.0-2/Mambaforge-4.12.0-2-MacOSX-x86_64.sh#562c2bcbabff10387f130acea72b960454fa3d90b593126e4e4febcf6da763d3" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/mambaforge-4.12.0-3000066400000000000000000000031231517431316200270160ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Mambaforge-4.12.0-3-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.12.0-3/Mambaforge-4.12.0-3-Linux-aarch64.sh#379796ce7d0f6515093bdde06f45df1bd7261c4104f13f53a5cd30f9acba44d9" "miniconda" verify_py310 ;; "Linux-ppc64le" ) install_script "Mambaforge-4.12.0-3-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/4.12.0-3/Mambaforge-4.12.0-3-Linux-ppc64le.sh#ae6fb19467c147c77cf31b044aaae155109bc0e952965d98990fa8d2b2e7bfdd" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Mambaforge-4.12.0-3-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.12.0-3/Mambaforge-4.12.0-3-Linux-x86_64.sh#93d481e4f12dce9f2ffe46904dc8cf88485c7b27fc4d18dd8e900e2c3ab83f80" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Mambaforge-4.12.0-3-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.12.0-3/Mambaforge-4.12.0-3-MacOSX-arm64.sh#6c3b82eb0edce21b58d0bcafc9afbbc498e140a8229b70275afcdf9e17db47d1" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Mambaforge-4.12.0-3-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.12.0-3/Mambaforge-4.12.0-3-MacOSX-x86_64.sh#17ecce907a048240970cc9a546369aed07bcd21f30116ad43249360dce69edcd" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/mambaforge-4.13.0-1000066400000000000000000000031231517431316200270150ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Mambaforge-4.13.0-1-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.13.0-1/Mambaforge-4.13.0-1-Linux-aarch64.sh#69e3c90092f61916da7add745474e15317ed0dc6d48bfe4e4c90f359ba141d23" "miniconda" verify_py310 ;; "Linux-ppc64le" ) install_script "Mambaforge-4.13.0-1-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/4.13.0-1/Mambaforge-4.13.0-1-Linux-ppc64le.sh#ff41608c73da7deb01f741682e9b6c92435f4b2aff2aecde353093d3125126cf" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Mambaforge-4.13.0-1-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.13.0-1/Mambaforge-4.13.0-1-Linux-x86_64.sh#412b79330e90e49cf7e39a7b6f4752970fcdb8eb54b1a45cc91afe6777e8518c" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Mambaforge-4.13.0-1-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.13.0-1/Mambaforge-4.13.0-1-MacOSX-arm64.sh#6263560d2b0902942841667721dad3621c05f704f6b080d968ad355aeca51486" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Mambaforge-4.13.0-1-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.13.0-1/Mambaforge-4.13.0-1-MacOSX-x86_64.sh#bc42d606b67ace370847deb849e7d1ea2879b0be78bb1be51b020c3cb4e5bef2" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/mambaforge-4.14.0-0000066400000000000000000000031231517431316200270150ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Mambaforge-4.14.0-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.14.0-0/Mambaforge-4.14.0-0-Linux-aarch64.sh#37221b8d818951fab125c0bfb6cc6e83dac059f66892d2544a83192828d8e2c4" "miniconda" verify_py310 ;; "Linux-ppc64le" ) install_script "Mambaforge-4.14.0-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/4.14.0-0/Mambaforge-4.14.0-0-Linux-ppc64le.sh#607bbd38aa21af4c79a663f2a183a06cca054efdd8d617c17370522504c7be1e" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Mambaforge-4.14.0-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.14.0-0/Mambaforge-4.14.0-0-Linux-x86_64.sh#d47b78b593e3cf5513bafbfa6a51eafcd9f0e164c41c79c790061bb583c82859" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Mambaforge-4.14.0-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.14.0-0/Mambaforge-4.14.0-0-MacOSX-arm64.sh#35d05a65e19b8e5d596964936ddd6023ae66d664a25ba291a52fec18f06a73b6" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Mambaforge-4.14.0-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.14.0-0/Mambaforge-4.14.0-0-MacOSX-x86_64.sh#949f046b4404cc8e081807b048050e6642d8db5520c20d5158a7ef721fbf76c5" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/mambaforge-4.14.0-1000066400000000000000000000031231517431316200270160ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Mambaforge-4.14.0-1-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.14.0-1/Mambaforge-4.14.0-1-Linux-aarch64.sh#f721dc44d5aba7a24c6f76408979d125e7ed7f1ba56397ff073a9cfd1611f71c" "miniconda" verify_py310 ;; "Linux-ppc64le" ) install_script "Mambaforge-4.14.0-1-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/4.14.0-1/Mambaforge-4.14.0-1-Linux-ppc64le.sh#da6cbf1abe89fae4e1246aa64e86e8e155e7938c462f968265266af61fda64cc" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Mambaforge-4.14.0-1-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.14.0-1/Mambaforge-4.14.0-1-Linux-x86_64.sh#d9c8337bda234cf53d2743f32efaab41cbc9d942b8fb52b8588996ef0300c82f" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Mambaforge-4.14.0-1-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.14.0-1/Mambaforge-4.14.0-1-MacOSX-arm64.sh#48aca11999c866058c8201cbd01361cd1bf35044e36655874238cd57c06b389d" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Mambaforge-4.14.0-1-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.14.0-1/Mambaforge-4.14.0-1-MacOSX-x86_64.sh#e0f2c280e5cd4b4211151a9d8e40c3f86b1b53fdb4b4fbb907603409581e696f" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/mambaforge-4.14.0-2000066400000000000000000000031231517431316200270170ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Mambaforge-4.14.0-2-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.14.0-2/Mambaforge-4.14.0-2-Linux-aarch64.sh#af6b683bb6bf3170a29b1fe37c1356d4b7fd94f9c38019d33d3d1933a5a5f41a" "miniconda" verify_py310 ;; "Linux-ppc64le" ) install_script "Mambaforge-4.14.0-2-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/4.14.0-2/Mambaforge-4.14.0-2-Linux-ppc64le.sh#ab2cfff59870fbd946d26ed55fc47def32de25879b994eac6c464d079ed39c68" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Mambaforge-4.14.0-2-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.14.0-2/Mambaforge-4.14.0-2-Linux-x86_64.sh#ac3cabd483712a216f1dddeb92a7f8e198a771390c6627aa94791ab6abc7fae8" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Mambaforge-4.14.0-2-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.14.0-2/Mambaforge-4.14.0-2-MacOSX-arm64.sh#28b45f0949cb734347656e27acb6feb6da6ff12f93cb8c7546d7195e1ae1beba" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Mambaforge-4.14.0-2-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.14.0-2/Mambaforge-4.14.0-2-MacOSX-x86_64.sh#efd4ea95da961c8005a28ecb8bde719d0fd408ccac92dafaaa37eab133ff7a52" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/mambaforge-pypy3000066400000000000000000000020611517431316200272200ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-ppc64le" ) install_script "Mambaforge-pypy3-Linux-ppc64le" "https://github.com/conda-forge/miniforge/releases/latest/download/Mambaforge-pypy3-Linux-ppc64le.sh" "miniconda" verify_py3_latest ;; "Linux-x86_64" ) install_script "Mambaforge-pypy3-Linux-x86_64" "https://github.com/conda-forge/miniforge/releases/latest/download/Mambaforge-pypy3-Linux-x86_64.sh" "miniconda" verify_py3_latest ;; "Linux-aarch64" ) install_script "Mambaforge-pypy3-Linux-aarch64" "https://github.com/conda-forge/miniforge/releases/latest/download/Mambaforge-pypy3-Linux-aarch64.sh" "miniconda" verify_py3_latest ;; "MacOSX-x86_64" ) install_script "Mambaforge-pypy3-MacOSX-x86_64" "https://github.com/conda-forge/miniforge/releases/latest/download/Mambaforge-pypy3-MacOSX-x86_64.sh" "miniconda" verify_py3_latest ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Mambaforge with PyPy3 is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/micropython-1.10000066400000000000000000000005771517431316200270000ustar00rootroot00000000000000has_tar_xz_support \ && src="https://micropython.org/resources/source/micropython-1.10.tar.xz#8488ec243217c4578f1cf2ed20e749344b01510a52d443da95304949cf7abfdb" \ || src="https://github.com/micropython/micropython/releases/download/v1.10/micropython-1.10.tar.gz#207de28a243d5be59c1d5433670a5c76472ece532b446cc25da6cf3c6e943fbc" install_package micropython-1.10 "$src" micropython pyenv-pyenv-485090e/plugins/python-build/share/python-build/micropython-1.11000066400000000000000000000005771517431316200270010ustar00rootroot00000000000000has_tar_xz_support \ && src="https://micropython.org/resources/source/micropython-1.11.tar.xz#c3d4918149e3b9427a318a8a78efb928f2b724123832f1feb4d7921af490269d" \ || src="https://github.com/micropython/micropython/releases/download/v1.11/micropython-1.11.tar.gz#2edda4ffe283899af6d7b59dd0a0a59f8b845fe0f26017f1a180661338eca35f" install_package micropython-1.11 "$src" micropython pyenv-pyenv-485090e/plugins/python-build/share/python-build/micropython-1.12000066400000000000000000000005771517431316200270020ustar00rootroot00000000000000has_tar_xz_support \ && src="https://micropython.org/resources/source/micropython-1.12.tar.xz#181bfe82ba310a3f91540ee70d373f247141db3f9de8082fb189145df085d1b4" \ || src="https://github.com/micropython/micropython/releases/download/v1.12/micropython-1.12.tar.gz#98fd02366bca23a61c77bbf2b999a45cfc237132db66b5b0874378a5446d81ba" install_package micropython-1.12 "$src" micropython pyenv-pyenv-485090e/plugins/python-build/share/python-build/micropython-1.13000066400000000000000000000005771517431316200270030ustar00rootroot00000000000000has_tar_xz_support \ && src="https://micropython.org/resources/source/micropython-1.13.tar.xz#fb5434ec1fd2f7d06733696b020a992e69005532bcb97a9b4158ec1fffbc9c1e" \ || src="https://github.com/micropython/micropython/releases/download/v1.13/micropython-1.13.tar.gz#9ab32eb2c19a682f6de7e9b4226de849c42cb92e1ecb4cf56438a75d763bd451" install_package micropython-1.13 "$src" micropython pyenv-pyenv-485090e/plugins/python-build/share/python-build/micropython-1.14000066400000000000000000000006231517431316200267740ustar00rootroot00000000000000has_tar_xz_support \ && { install=install_package; src="https://micropython.org/resources/source/micropython-1.14.tar.xz#97306156fdeab120a1244626c75a929bb820722afdfc1317dbd5dadef388d94c"; } \ || { install=install_zip; src="https://micropython.org/resources/source/micropython-1.14.zip#9aff4d9d8231d93cb9dac2b239ff947d1f123a0fe7a58614c252474cdd3b88d9"; } $install micropython-1.14 "$src" micropython pyenv-pyenv-485090e/plugins/python-build/share/python-build/micropython-1.15000066400000000000000000000006231517431316200267750ustar00rootroot00000000000000has_tar_xz_support \ && { install=install_package; src="https://micropython.org/resources/source/micropython-1.15.tar.xz#52d020b3adef6c2bd2b6c8aba672f381c3c99d2b90130ac8d0d7414999cb4e13"; } \ || { install=install_zip; src="https://micropython.org/resources/source/micropython-1.15.zip#8a0c6b5914a1d1eaf63f4b3c226db5049107f1bc1c6046e4dda8d4c5c4657e97"; } $install micropython-1.15 "$src" micropython pyenv-pyenv-485090e/plugins/python-build/share/python-build/micropython-1.16000066400000000000000000000006231517431316200267760ustar00rootroot00000000000000has_tar_xz_support \ && { install=install_package; src="https://micropython.org/resources/source/micropython-1.16.tar.xz#48271fb5da97efc22325c3fc1d87ba45b32bab25673206d8d8136c25e4ff29a9"; } \ || { install=install_zip; src="https://micropython.org/resources/source/micropython-1.16.zip#427adc00d2a99d102e4ce46d9eb4933d168e863f859bb3ce5b84735f0899c1ed"; } $install micropython-1.16 "$src" micropython pyenv-pyenv-485090e/plugins/python-build/share/python-build/micropython-1.17000066400000000000000000000006231517431316200267770ustar00rootroot00000000000000has_tar_xz_support \ && { install=install_package; src="https://micropython.org/resources/source/micropython-1.17.tar.xz#e322f915cee784de0f8614779cdb88fce175956975b3864e2d1898a53638a2f7"; } \ || { install=install_zip; src="https://micropython.org/resources/source/micropython-1.17.zip#4dfc60e2ba67e89c0b794c0533bb4e43a10d4e38095d0640b64b4faa9160f244"; } $install micropython-1.17 "$src" micropython pyenv-pyenv-485090e/plugins/python-build/share/python-build/micropython-1.18000066400000000000000000000006231517431316200270000ustar00rootroot00000000000000has_tar_xz_support \ && { install=install_package; src="https://micropython.org/resources/source/micropython-1.18.tar.xz#96fc71b42ed331c64e1adc5a830ec4f29f2975c23e8751109c03f32b80fa3eb4"; } \ || { install=install_zip; src="https://micropython.org/resources/source/micropython-1.18.zip#90fa8049cf275310638b9e9c77121f6042f7250b814ef622f9522befde009f57"; } $install micropython-1.18 "$src" micropython pyenv-pyenv-485090e/plugins/python-build/share/python-build/micropython-1.19.1000066400000000000000000000006311517431316200271370ustar00rootroot00000000000000has_tar_xz_support \ && { install=install_package; src="https://micropython.org/resources/source/micropython-1.19.1.tar.xz#940e3815e8c425c6eaed3a2aa30d320220cc012a2654b6e086e1b6f0567df350"; } \ || { install=install_zip; src="https://micropython.org/resources/source/micropython-1.19.1.zip#7047ce208627457c6881850527edb78189a1855a974aa34e2d929c9a3b3c5cc3"; } $install micropython-1.19.1 "$src" micropython pyenv-pyenv-485090e/plugins/python-build/share/python-build/micropython-1.20.0000066400000000000000000000006311517431316200271260ustar00rootroot00000000000000has_tar_xz_support \ && { install=install_package; src="https://micropython.org/resources/source/micropython-1.20.0.tar.xz#098ef8e40abdc62551b5460d0ffe9489074240c0cb5589ca3c3a425551beb9bf"; } \ || { install=install_zip; src="https://micropython.org/resources/source/micropython-1.20.0.zip#6a2ce86e372ee8c5b9310778fff7fca1daa580afa28ea755f1a303675a8612b7"; } $install micropython-1.20.0 "$src" micropython pyenv-pyenv-485090e/plugins/python-build/share/python-build/micropython-1.21.0000066400000000000000000000006301517431316200271260ustar00rootroot00000000000000has_tar_xz_support \ && { install=install_package; src="https://micropython.org/resources/source/micropython-1.21.0.tar.xz#abd2152613559d3f44728668346e78be9d93458133a03b700baf222c322fd4d5"; } \ || { install=install_zip; src="https://micropython.org/resources/source/micropython-1.21.0.zip#12521faacc7191353f2739267bd9fd2a5e60ea04fb47df74f8e22b6bf59ba967"; } $install micropython-1.21.0 "$src" micropythonpyenv-pyenv-485090e/plugins/python-build/share/python-build/micropython-1.9.3000066400000000000000000000006071517431316200270630ustar00rootroot00000000000000has_tar_xz_support \ && src="https://micropython.org/resources/source/micropython-1.9.3.tar.xz#3aa37065f5ea8df372d36253d0ae6333c68572e577df8558d4b7b93e070c624d" \ || src="https://github.com/micropython/micropython/releases/download/v1.9.3/micropython-1.9.3.tar.gz#f94c0b4834edca625b86c0846c89e609ee8fbdbe98e7f719d5108d74b6b4945e" install_package micropython-1.9.3 "$src" micropython_1_9 pyenv-pyenv-485090e/plugins/python-build/share/python-build/micropython-1.9.4000066400000000000000000000006071517431316200270640ustar00rootroot00000000000000has_tar_xz_support \ && src="https://micropython.org/resources/source/micropython-1.9.4.tar.xz#1d358d99e908a94fd6dd0d6b448ee56c5830b609cf27a42e0db3bee40cc52a9e" \ || src="https://github.com/micropython/micropython/releases/download/v1.9.4/micropython-1.9.4.tar.gz#0db042011bffcbd65362b67eb3cca87eaefa9f2a55b747fa75e922c706b8ce1a" install_package micropython-1.9.4 "$src" micropython_1_9 pyenv-pyenv-485090e/plugins/python-build/share/python-build/micropython-dev000066400000000000000000000001321517431316200271620ustar00rootroot00000000000000install_git micropython-dev https://github.com/micropython/micropython master micropython pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda-2.2.2000066400000000000000000000016351517431316200264440ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86" ) install_script "Miniconda-2.2.2-Linux-x86" "https://repo.continuum.io/miniconda/Miniconda-2.2.2-Linux-x86.sh#c6c7847066dbf459f3934f7fc870d2b0919cf2cbdad78601e85c2c720daadc9d" "miniconda" verify_py27 ;; "Linux-x86_64" ) install_script "Miniconda-2.2.2-Linux-x86_64" "https://repo.continuum.io/miniconda/Miniconda-2.2.2-Linux-x86_64.sh#1cb05546029363279b0d6be5d66e7254b7e2b52637a02601483771f6248dde43" "miniconda" verify_py27 ;; "MacOSX-x86_64" ) install_script "Miniconda-2.2.2-MacOSX-x86_64" "https://repo.continuum.io/miniconda/Miniconda-2.2.2-MacOSX-x86_64.sh#69139f6c3988b9dc7900e8e65a1f265745b185b6a60e577fe2fd4ff84646c94e" "miniconda" verify_py27 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda-3.0.0000066400000000000000000000016351517431316200264410ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86" ) install_script "Miniconda-3.0.0-Linux-x86" "https://repo.continuum.io/miniconda/Miniconda-3.0.0-Linux-x86.sh#ffd2fb01d0c379d5e11a07f0712ebbddae73f24fe266d1af3c3fd93cc383ca8b" "miniconda" verify_py27 ;; "Linux-x86_64" ) install_script "Miniconda-3.0.0-Linux-x86_64" "https://repo.continuum.io/miniconda/Miniconda-3.0.0-Linux-x86_64.sh#09b3a81ea0421260ae5f8a1ba8a6a21b1e9f0c745d43b997010f11ad1920dbe3" "miniconda" verify_py27 ;; "MacOSX-x86_64" ) install_script "Miniconda-3.0.0-MacOSX-x86_64" "https://repo.continuum.io/miniconda/Miniconda-3.0.0-MacOSX-x86_64.sh#8f825d04146a8229154c54cf07e9cafd9b1fe44dbcfe92c36020a502489e04da" "miniconda" verify_py27 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda-3.0.4000066400000000000000000000016351517431316200264450ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86" ) install_script "Miniconda-3.0.4-Linux-x86" "https://repo.continuum.io/miniconda/Miniconda-3.0.4-Linux-x86.sh#b3f392e042469a598e2cd74886d1e15c4708e190a4b188f50fa61c057d7a0ffe" "miniconda" verify_py27 ;; "Linux-x86_64" ) install_script "Miniconda-3.0.4-Linux-x86_64" "https://repo.continuum.io/miniconda/Miniconda-3.0.4-Linux-x86_64.sh#39f75a6d1619109b96756b4882d962ee12e40e07aa6d662eec10a88f19950eaa" "miniconda" verify_py27 ;; "MacOSX-x86_64" ) install_script "Miniconda-3.0.4-MacOSX-x86_64" "https://repo.continuum.io/miniconda/Miniconda-3.0.4-MacOSX-x86_64.sh#a457695a2c1216ee91f23d6a1cf2a911178382ee25fd5166ad21d45d5e57de5b" "miniconda" verify_py27 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda-3.0.5000066400000000000000000000016351517431316200264460ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86" ) install_script "Miniconda-3.0.5-Linux-x86" "https://repo.continuum.io/miniconda/Miniconda-3.0.5-Linux-x86.sh#7f1b78d7380c664f65d811e76f3515c46689947634752e711693202a7451b85b" "miniconda" verify_py27 ;; "Linux-x86_64" ) install_script "Miniconda-3.0.5-Linux-x86_64" "https://repo.continuum.io/miniconda/Miniconda-3.0.5-Linux-x86_64.sh#5439a10dc7ff66fa48f5b40290adfad01e58db3b03317d87f90aaf72deda862a" "miniconda" verify_py27 ;; "MacOSX-x86_64" ) install_script "Miniconda-3.0.5-MacOSX-x86_64" "https://repo.continuum.io/miniconda/Miniconda-3.0.5-MacOSX-x86_64.sh#5ba297923cb06ed7077c4ee5e4213bc7db2878dbec9ccba1d4c9c61d5e2697ee" "miniconda" verify_py27 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda-3.10.1000066400000000000000000000016431517431316200265220ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86" ) install_script "Miniconda-3.10.1-Linux-x86" "https://repo.continuum.io/miniconda/Miniconda-3.10.1-Linux-x86.sh#509ee56f1590705472fdac4a00aa7191f79a6a09daf4af088e92f93c648d815e" "miniconda" verify_py27 ;; "Linux-x86_64" ) install_script "Miniconda-3.10.1-Linux-x86_64" "https://repo.continuum.io/miniconda/Miniconda-3.10.1-Linux-x86_64.sh#363f56f5608d1552325549e7371fcf460c5ed45484eb300058e3b99c997808b5" "miniconda" verify_py27 ;; "MacOSX-x86_64" ) install_script "Miniconda-3.10.1-MacOSX-x86_64" "https://repo.continuum.io/miniconda/Miniconda-3.10.1-MacOSX-x86_64.sh#61a1e468a79cca45a518b1760033e7af89108bf88487afead79f96e3229b422a" "miniconda" verify_py27 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda-3.16.0000066400000000000000000000016431517431316200265270ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86" ) install_script "Miniconda-3.16.0-Linux-x86" "https://repo.continuum.io/miniconda/Miniconda-3.16.0-Linux-x86.sh#57e9659848e6322cb18c1c4a5c844a4f7dc5e784dbd8977245769ff9db28dade" "miniconda" verify_py27 ;; "Linux-x86_64" ) install_script "Miniconda-3.16.0-Linux-x86_64" "https://repo.continuum.io/miniconda/Miniconda-3.16.0-Linux-x86_64.sh#b1facded0d33850e3a467d6e4589830be477bd4f819407b99b033a4d22601e4d" "miniconda" verify_py27 ;; "MacOSX-x86_64" ) install_script "Miniconda-3.16.0-MacOSX-x86_64" "https://repo.continuum.io/miniconda/Miniconda-3.16.0-MacOSX-x86_64.sh#e93517696d4ede4f8ff21ea42272f24508023b83f1e2e2c989d1b32ab19347a9" "miniconda" verify_py27 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda-3.18.3000066400000000000000000000000551517431316200265300ustar00rootroot00000000000000source "${BASH_SOURCE%/*}/miniconda2-3.18.3" pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda-3.3.0000066400000000000000000000016351517431316200264440ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86" ) install_script "Miniconda-3.3.0-Linux-x86" "https://repo.continuum.io/miniconda/Miniconda-3.3.0-Linux-x86.sh#415119946afab438ee2ec9d9cd063977da780029d5561d2558101233913f226a" "miniconda" verify_py27 ;; "Linux-x86_64" ) install_script "Miniconda-3.3.0-Linux-x86_64" "https://repo.continuum.io/miniconda/Miniconda-3.3.0-Linux-x86_64.sh#e071ff3ffb9b4df65edf5e780d576c901753fecccd10e5af629138036aa51de3" "miniconda" verify_py27 ;; "MacOSX-x86_64" ) install_script "Miniconda-3.3.0-MacOSX-x86_64" "https://repo.continuum.io/miniconda/Miniconda-3.3.0-MacOSX-x86_64.sh#9e9a65c69a1f4ec3b4df05f477b517dfa1088182344bfe8009f58d0b4bd00e5c" "miniconda" verify_py27 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda-3.4.2000066400000000000000000000016351517431316200264470ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86" ) install_script "Miniconda-3.4.2-Linux-x86" "https://repo.continuum.io/miniconda/Miniconda-3.4.2-Linux-x86.sh#f198359f0b34f7efa704235d24126160930b7ea7205127880f3acb0a47999413" "miniconda" verify_py27 ;; "Linux-x86_64" ) install_script "Miniconda-3.4.2-Linux-x86_64" "https://repo.continuum.io/miniconda/Miniconda-3.4.2-Linux-x86_64.sh#97d4e234f6abca0c53c606b8a7a73b909cc05a7703c512f4ea855de83b753db1" "miniconda" verify_py27 ;; "MacOSX-x86_64" ) install_script "Miniconda-3.4.2-MacOSX-x86_64" "https://repo.continuum.io/miniconda/Miniconda-3.4.2-MacOSX-x86_64.sh#f428977cbef0d5b78379d886735c75e446a482ecb6b5605837d6c2738ddcd074" "miniconda" verify_py27 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda-3.7.0000066400000000000000000000016271517431316200264510ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86" ) install_script "Miniconda-3.7.0-Linux-x86" "https://repo.continuum.io/miniconda/Miniconda-3.7.0-Linux-x86.sh#cada23bbaab6f21053d45f6d76cf311dffb2f234659fcef0b6a33a6d769317cb" "miniconda" verify_py27 ;; "Linux-x86_64" ) install_script "Miniconda-3.7.0-Linux-x86_64" "https://repo.continuum.io/miniconda/Miniconda-3.7.0-Linux-x86_64.sh#ed6fd3f85dc43ca10e41355bf3efc40bffd64f2364aecad24ac68a9f1009a469" "miniconda" verify_py27 ;; "MacOSX-x86_64" ) install_script "Miniconda-3.7.0-MacOSX-x86_64" "https://repo.continuum.io/miniconda/Miniconda-3.7.0-MacOSX-x86_64.sh#9a8e731a2a3bd6ab3d5b7304c3c783c04582386142fe39ceb7d5bfabdd74d8eb" "miniconda" verify_py27 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda-3.8.3000066400000000000000000000016271517431316200264550ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86" ) install_script "Miniconda-3.8.3-Linux-x86" "https://repo.continuum.io/miniconda/Miniconda-3.8.3-Linux-x86.sh#253a95fac2dbcc01ad5ce5a78d241a362482e1fbb24b1000ea5e217f55825cb6" "miniconda" verify_py27 ;; "Linux-x86_64" ) install_script "Miniconda-3.8.3-Linux-x86_64" "https://repo.continuum.io/miniconda/Miniconda-3.8.3-Linux-x86_64.sh#7ac19397731ffb212ed5534c29cd25f5f4c0c81669707ba6da8635cf1431c114" "miniconda" verify_py27 ;; "MacOSX-x86_64" ) install_script "Miniconda-3.8.3-MacOSX-x86_64" "https://repo.continuum.io/miniconda/Miniconda-3.8.3-MacOSX-x86_64.sh#e19e16b7969fb256d68f7de3a4e02331ba04e1c48a262d2b9f66db106e016257" "miniconda" verify_py27 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda-3.9.1000066400000000000000000000016351517431316200264530ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86" ) install_script "Miniconda-3.9.1-Linux-x86" "https://repo.continuum.io/miniconda/Miniconda-3.9.1-Linux-x86.sh#f3cdc8d774acce05462eb07d2676162c519e1e5d35c98d1dc3d6eb7b262da0b2" "miniconda" verify_py27 ;; "Linux-x86_64" ) install_script "Miniconda-3.9.1-Linux-x86_64" "https://repo.continuum.io/miniconda/Miniconda-3.9.1-Linux-x86_64.sh#64f2b5047f944bb9b06e46c7281e9edffd412981c93e31d4c111287a1d30fef4" "miniconda" verify_py27 ;; "MacOSX-x86_64" ) install_script "Miniconda-3.9.1-MacOSX-x86_64" "https://repo.continuum.io/miniconda/Miniconda-3.9.1-MacOSX-x86_64.sh#ea529626cfb3519eebee83c40965f0a58375e0826c6777b759eb0c42ca9970d2" "miniconda" verify_py27 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda-latest000066400000000000000000000000551517431316200272720ustar00rootroot00000000000000source "${BASH_SOURCE%/*}/miniconda2-latest" pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda2-2.7-4.8.3000066400000000000000000000015551517431316200270440ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-ppc64le" ) install_script "Miniconda2-py27_4.8.3-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda2-py27_4.8.3-Linux-ppc64le.sh#120b300120b1362831f2075cc0bd452f" "miniconda" verify_py27 ;; "Linux-x86_64" ) install_script "Miniconda2-py27_4.8.3-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda2-py27_4.8.3-Linux-x86_64.sh#19ce7d0039ab349914d928e7f32b1c1b" "miniconda" verify_py27 ;; "MacOSX-x86_64" ) install_script "Miniconda2-py27_4.8.3-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda2-py27_4.8.3-MacOSX-x86_64.sh#14e2d294decc5a48a449b588f5819c10" "miniconda" verify_py27 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda2-3.18.3000066400000000000000000000016521517431316200266160ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86" ) install_script "Miniconda2-3.18.3-Linux-x86" "https://repo.continuum.io/miniconda/Miniconda2-3.18.3-Linux-x86.sh#1eceb3a763ab784af41a46dfd96a520659957b5fefdc1f4d53f00de43b539be0" "miniconda" verify_py27 ;; "Linux-x86_64" ) install_script "Miniconda2-3.18.3-Linux-x86_64" "https://repo.continuum.io/miniconda/Miniconda2-3.18.3-Linux-x86_64.sh#dd16e093aec2346af4e8f383a9dedb9a3d6c1a0cb7637b180e1e0790dfa55e81" "miniconda" verify_py27 ;; "MacOSX-x86_64" ) install_script "Miniconda2-3.18.3-MacOSX-x86_64" "https://repo.continuum.io/miniconda/Miniconda2-3.18.3-MacOSX-x86_64.sh#c90b37e4ba866ac2195ddf9ffe5549311279041def27ade29f661f5707d43c94" "miniconda" verify_py27 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda2 is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda2-3.19.0000066400000000000000000000016521517431316200266140ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86" ) install_script "Miniconda2-3.19.0-Linux-x86" "https://repo.continuum.io/miniconda/Miniconda2-3.19.0-Linux-x86.sh#869d65bed0927ff78973947f619558ed8be282851632449631d1923e3ac814d6" "miniconda" verify_py27 ;; "Linux-x86_64" ) install_script "Miniconda2-3.19.0-Linux-x86_64" "https://repo.continuum.io/miniconda/Miniconda2-3.19.0-Linux-x86_64.sh#646b4d5398f8d76a0664375ee6226611c43ee3d49de3eb03efe7480e3c3b9ebf" "miniconda" verify_py27 ;; "MacOSX-x86_64" ) install_script "Miniconda2-3.19.0-MacOSX-x86_64" "https://repo.continuum.io/miniconda/Miniconda2-3.19.0-MacOSX-x86_64.sh#32915acbfc8491e9fbe12b90a611a76b84e15f2cdef5272f576bfe77a4ef7061" "miniconda" verify_py27 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda2 is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda2-4.0.5000066400000000000000000000016441517431316200265310ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86" ) install_script "Miniconda2-4.0.5-Linux-x86" "https://repo.continuum.io/miniconda/Miniconda2-4.0.5-Linux-x86.sh#fc85229837ef2f0571e0c369e6de8ae7339b6cd9f16449efce0a2a01f0bec110" "miniconda" verify_py27 ;; "Linux-x86_64" ) install_script "Miniconda2-4.0.5-Linux-x86_64" "https://repo.continuum.io/miniconda/Miniconda2-4.0.5-Linux-x86_64.sh#ada5b7942e519829bc5e8e638d525e009676a7a598cf3dd80f041f6d5e39ddbb" "miniconda" verify_py27 ;; "MacOSX-x86_64" ) install_script "Miniconda2-4.0.5-MacOSX-x86_64" "https://repo.continuum.io/miniconda/Miniconda2-4.0.5-MacOSX-x86_64.sh#7471adcdf7ff1f4e7464617992f57fb7f6f58dbc16ce2455d441dc2c2660e350" "miniconda" verify_py27 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda2 is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda2-4.1.11000066400000000000000000000016521517431316200266060ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86" ) install_script "Miniconda2-4.1.11-Linux-x86" "https://repo.continuum.io/miniconda/Miniconda2-4.1.11-Linux-x86.sh#5c4f6e121ddcbd24c7f7d3e7a6ce06c60cf2c98b14895620f1d7805d75bc5a9f" "miniconda" verify_py27 ;; "Linux-x86_64" ) install_script "Miniconda2-4.1.11-Linux-x86_64" "https://repo.continuum.io/miniconda/Miniconda2-4.1.11-Linux-x86_64.sh#4cdd4707c8bd2959551e40c6d4561ebec2711e034a04305e2dd1f88f038edb04" "miniconda" verify_py27 ;; "MacOSX-x86_64" ) install_script "Miniconda2-4.1.11-MacOSX-x86_64" "https://repo.continuum.io/miniconda/Miniconda2-4.1.11-MacOSX-x86_64.sh#a974389c7aab8058f14fa7d4bc00e5bb5316a3da4b0ca1463b854701532297d7" "miniconda" verify_py27 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda2 is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda2-4.3.14000066400000000000000000000016511517431316200266120ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86" ) install_script "Miniconda2-4.3.14-Linux-x86" "https://repo.continuum.io/miniconda/Miniconda2-4.3.14-Linux-x86.sh#3ff873687fa5cd40f3d32ac8578003b97e98090b8fc1fa969bcfd087897f598d" "miniconda" verify_py27 ;; "Linux-x86_64" ) install_script "Miniconda2-4.3.14-Linux-x86_64" "https://repo.continuum.io/miniconda/Miniconda2-4.3.14-Linux-x86_64.sh#2dc629843be954fc747f08ffbcb973b5473f6818464b82a00260c38f687e02f1" "miniconda" verify_py27 ;; "MacOSX-x86_64" ) install_script "Miniconda2-4.3.14-MacOSX-x86_64" "https://repo.continuum.io/miniconda/Miniconda2-4.3.14-MacOSX-x86_64.sh#de5ec11463073f2d9cb4c7ea18e128ba24142d9065926a977262e61c66f61ae8" "miniconda" verify_py27 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda2-4.3.21000066400000000000000000000016511517431316200266100ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86" ) install_script "Miniconda2-4.3.21-Linux-x86" "https://repo.continuum.io/miniconda/Miniconda2-4.3.21-Linux-x86.sh#180b46832849ecba5cfb19e1cd60a38f98e02ac2fd1517648771af8f049b7d50" "miniconda" verify_py27 ;; "Linux-x86_64" ) install_script "Miniconda2-4.3.21-Linux-x86_64" "https://repo.continuum.io/miniconda/Miniconda2-4.3.21-Linux-x86_64.sh#5097d5ec484a345c8785655113b19b88bfcd69af5f25a36c832ce498f02ea052" "miniconda" verify_py27 ;; "MacOSX-x86_64" ) install_script "Miniconda2-4.3.21-MacOSX-x86_64" "https://repo.continuum.io/miniconda/Miniconda2-4.3.21-MacOSX-x86_64.sh#ec996889bed2f4bfbd6775222dcd5e1633e50b203e56643944611501a79b8037" "miniconda" verify_py27 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda2-4.3.27000066400000000000000000000016611517431316200266170ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86" ) install_script "Miniconda2-4.3.27.1-Linux-x86" "https://repo.continuum.io/miniconda/Miniconda2-4.3.27.1-Linux-x86.sh#3d80246ff3942599669f86c10468e25af482cdd1197c3168027ef6680c857f95" "miniconda" verify_py27 ;; "Linux-x86_64" ) install_script "Miniconda2-4.3.27.1-Linux-x86_64" "https://repo.continuum.io/miniconda/Miniconda2-4.3.27.1-Linux-x86_64.sh#f7bb442faeed33330564bfc33188a9dcd4ebe2ab3771aa89a823c03e67197e1d" "miniconda" verify_py27 ;; "MacOSX-x86_64" ) install_script "Miniconda2-4.3.27-MacOSX-x86_64" "https://repo.continuum.io/miniconda/Miniconda2-4.3.27-MacOSX-x86_64.sh#7e3d2bc3e48f1daca127062a59e518df37f279aa750ca595c2c8c9569eff2fba" "miniconda" verify_py27 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda2-4.3.30000066400000000000000000000016551517431316200266140ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86" ) install_script "Miniconda2-4.3.30-Linux-x86" "https://repo.continuum.io/miniconda/Miniconda2-4.3.30-Linux-x86.sh#3727dcc1561be246c052d6be210b5fd748bf32407cb7e06d0322fe4f79c77482" "miniconda" verify_py27 ;; "Linux-x86_64" ) install_script "Miniconda2-4.3.30-Linux-x86_64" "https://repo.continuum.io/miniconda/Miniconda2-4.3.30-Linux-x86_64.sh#0891000ca28359e63aa77e613c01f7a88855dedfc0ddc8be31829f3139318cf3" "miniconda" verify_py27 ;; "MacOSX-x86_64" ) install_script "Miniconda2-4.3.30.1-MacOSX-x86_64" "https://repo.continuum.io/miniconda/Miniconda2-4.3.30.1-MacOSX-x86_64.sh#1d4eb025ce58e6f0d5e19b39191ca17dee1fe3b2fd7d425a7418d99fe01fd65e" "miniconda" verify_py27 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda2-4.3.31000066400000000000000000000015111517431316200266040ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86" ) install_script "Miniconda2-4.3.31-Linux-x86" "https://repo.anaconda.com/miniconda/Miniconda2-4.3.31-Linux-x86.sh#4067ba22e1d687f92b11531a0b30b17f" "miniconda" verify_py27 ;; "Linux-x86_64" ) install_script "Miniconda2-4.3.31-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda2-4.3.31-Linux-x86_64.sh#da2dd466d26e33a2b1f72fdb853a8ff0" "miniconda" verify_py27 ;; "MacOSX-x86_64" ) install_script "Miniconda2-4.3.31-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda2-4.3.31-MacOSX-x86_64.sh#2c499488605bafd9e13a430f299f1489" "miniconda" verify_py27 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda2-4.4.10000066400000000000000000000020251517431316200266030ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-ppc64le" ) install_script "Miniconda2-4.4.10-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda2-4.4.10-Linux-ppc64le.sh#c6bf34cef423be4cda46df61fd09e069" "miniconda" verify_py27 ;; "Linux-x86" ) install_script "Miniconda2-4.4.10-Linux-x86" "https://repo.anaconda.com/miniconda/Miniconda2-4.4.10-Linux-x86.sh#1e8bf30cb77548f6aae9f4444b826fcb" "miniconda" verify_py27 ;; "Linux-x86_64" ) install_script "Miniconda2-4.4.10-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda2-4.4.10-Linux-x86_64.sh#dd54b344661560b861f86cc5ccff044b" "miniconda" verify_py27 ;; "MacOSX-x86_64" ) install_script "Miniconda2-4.4.10-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda2-4.4.10-MacOSX-x86_64.sh#20e0f8851c93331f763635c89840c39c" "miniconda" verify_py27 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda2-4.5.1000066400000000000000000000020151517431316200265230ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-ppc64le" ) install_script "Miniconda2-4.5.1-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda2-4.5.1-Linux-ppc64le.sh#02a0628652df3ab5917568606fecb8c3" "miniconda" verify_py27 ;; "Linux-x86" ) install_script "Miniconda2-4.5.1-Linux-x86" "https://repo.anaconda.com/miniconda/Miniconda2-4.5.1-Linux-x86.sh#9da5b43024d7edba30d0359c547cd2e5" "miniconda" verify_py27 ;; "Linux-x86_64" ) install_script "Miniconda2-4.5.1-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda2-4.5.1-Linux-x86_64.sh#332aeff0bb6b45bbf7e220dec17ba867" "miniconda" verify_py27 ;; "MacOSX-x86_64" ) install_script "Miniconda2-4.5.1-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda2-4.5.1-MacOSX-x86_64.sh#ad96c4012ca4d84d94f94d9c2f90a889" "miniconda" verify_py27 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda2-4.5.11000066400000000000000000000020251517431316200266050ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-ppc64le" ) install_script "Miniconda2-4.5.11-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda2-4.5.11-Linux-ppc64le.sh#b85a019f75ff87714eb3254dd1f3390f" "miniconda" verify_py27 ;; "Linux-x86" ) install_script "Miniconda2-4.5.11-Linux-x86" "https://repo.anaconda.com/miniconda/Miniconda2-4.5.11-Linux-x86.sh#187c460ffc6ea5f890b512320b2994c6" "miniconda" verify_py27 ;; "Linux-x86_64" ) install_script "Miniconda2-4.5.11-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda2-4.5.11-Linux-x86_64.sh#458324438b7b0e5afcc272b63d44195d" "miniconda" verify_py27 ;; "MacOSX-x86_64" ) install_script "Miniconda2-4.5.11-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda2-4.5.11-MacOSX-x86_64.sh#a444da43ad50a83c332ea1fb7a5bb96c" "miniconda" verify_py27 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda2-4.5.12000066400000000000000000000020251517431316200266060ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-ppc64le" ) install_script "Miniconda2-4.5.12-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda2-4.5.12-Linux-ppc64le.sh#e441328782c71c7ce71cc2a668df0451" "miniconda" verify_py27 ;; "Linux-x86" ) install_script "Miniconda2-4.5.12-Linux-x86" "https://repo.anaconda.com/miniconda/Miniconda2-4.5.12-Linux-x86.sh#56c90370226fd410c9b0086bd693d9c0" "miniconda" verify_py27 ;; "Linux-x86_64" ) install_script "Miniconda2-4.5.12-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda2-4.5.12-Linux-x86_64.sh#4be03f925e992a8eda03758b72a77298" "miniconda" verify_py27 ;; "MacOSX-x86_64" ) install_script "Miniconda2-4.5.12-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda2-4.5.12-MacOSX-x86_64.sh#76041da218ab91e2c9538a5dc19cd14e" "miniconda" verify_py27 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda2-4.5.4000066400000000000000000000020151517431316200265260ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-ppc64le" ) install_script "Miniconda2-4.5.4-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda2-4.5.4-Linux-ppc64le.sh#3e26ee6447c8025609ea1e410f768417" "miniconda" verify_py27 ;; "Linux-x86" ) install_script "Miniconda2-4.5.4-Linux-x86" "https://repo.anaconda.com/miniconda/Miniconda2-4.5.4-Linux-x86.sh#a638ae058a0ce15c5b289d151c488045" "miniconda" verify_py27 ;; "Linux-x86_64" ) install_script "Miniconda2-4.5.4-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda2-4.5.4-Linux-x86_64.sh#8a1c02f6941d8778f8afad7328265cf5" "miniconda" verify_py27 ;; "MacOSX-x86_64" ) install_script "Miniconda2-4.5.4-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda2-4.5.4-MacOSX-x86_64.sh#35f4ca99d33ed56f68745eeaf1449274" "miniconda" verify_py27 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda2-4.6.14000066400000000000000000000015251517431316200266150ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-ppc64le" ) install_script "Miniconda2-4.6.14-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda2-4.6.14-Linux-ppc64le.sh#76eeccfcf127bb29ce71a279ebd185a9" "miniconda" verify_py27 ;; "Linux-x86_64" ) install_script "Miniconda2-4.6.14-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda2-4.6.14-Linux-x86_64.sh#faa7cb0b0c8986ac3cacdbbd00fe4168" "miniconda" verify_py27 ;; "MacOSX-x86_64" ) install_script "Miniconda2-4.6.14-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda2-4.6.14-MacOSX-x86_64.sh#6665a5911f92dce1cf6d1021249af9db" "miniconda" verify_py27 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda2-4.7.10000066400000000000000000000015251517431316200266120ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-ppc64le" ) install_script "Miniconda2-4.7.10-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda2-4.7.10-Linux-ppc64le.sh#dee73c820a4e3af712f0b3ff02f57264" "miniconda" verify_py27 ;; "Linux-x86_64" ) install_script "Miniconda2-4.7.10-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda2-4.7.10-Linux-x86_64.sh#3bc6ffc6cda8efa467926dfd92a30bca" "miniconda" verify_py27 ;; "MacOSX-x86_64" ) install_script "Miniconda2-4.7.10-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda2-4.7.10-MacOSX-x86_64.sh#f540257a4b1df264e6f72c75f75620bb" "miniconda" verify_py27 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda2-4.7.12000066400000000000000000000027021517431316200266120ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-ppc64le" ) install_script "Miniconda2-4.7.12-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda2-4.7.12-Linux-ppc64le.sh#59325e5b37e93f39ab4b3987abe1b7dd" "miniconda" verify_py27 ;; "Linux-x86_64" ) install_script "Miniconda2-4.7.12-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda2-4.7.12-Linux-x86_64.sh#5a218d9dce3a77905d17ae87ac72a1e8" "miniconda" verify_py27 ;; "MacOSX-x86_64" ) install_script "Miniconda2-4.7.12-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda2-4.7.12-MacOSX-x86_64.sh#2498099a426fcaafd1068fd6d79e3a6d" "miniconda" verify_py27 ;; "Linux-ppc64le" ) install_script "Miniconda2-4.7.12.1-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda2-4.7.12.1-Linux-ppc64le.sh#f00e3c5881c2629a9b516cc7a62bbc3c" "miniconda" verify_py27 ;; "Linux-x86_64" ) install_script "Miniconda2-4.7.12.1-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda2-4.7.12.1-Linux-x86_64.sh#23bf3acd6aead6e91fb936fc185b033e" "miniconda" verify_py27 ;; "MacOSX-x86_64" ) install_script "Miniconda2-4.7.12.1-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda2-4.7.12.1-MacOSX-x86_64.sh#5a10de42eb90c1c21dbda191f1ec19b1" "miniconda" verify_py27 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda2-latest000066400000000000000000000013471517431316200273610ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86" ) install_script "Miniconda2-latest-Linux-x86" "https://repo.continuum.io/miniconda/Miniconda2-latest-Linux-x86.sh" "miniconda" verify_py27 ;; "Linux-x86_64" ) install_script "Miniconda2-latest-Linux-x86_64" "https://repo.continuum.io/miniconda/Miniconda2-latest-Linux-x86_64.sh" "miniconda" verify_py27 ;; "MacOSX-x86_64" ) install_script "Miniconda2-latest-MacOSX-x86_64" "https://repo.continuum.io/miniconda/Miniconda2-latest-MacOSX-x86_64.sh" "miniconda" verify_py27 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda2 is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-2.2.2000066400000000000000000000016431517431316200265260ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86" ) install_script "Miniconda3-2.2.2-Linux-x86" "https://repo.continuum.io/miniconda/Miniconda3-2.2.2-Linux-x86.sh#55a8d6fbd680a4959525c600f3d30475af54b338beee7cd1b44a10d8122e3ee4" "miniconda" verify_py33 ;; "Linux-x86_64" ) install_script "Miniconda3-2.2.2-Linux-x86_64" "https://repo.continuum.io/miniconda/Miniconda3-2.2.2-Linux-x86_64.sh#4fb79fd66c228e221e8e6627570c84efb785f90ede576d6697e91f906b515548" "miniconda" verify_py33 ;; "MacOSX-x86_64" ) install_script "Miniconda3-2.2.2-MacOSX-x86_64" "https://repo.continuum.io/miniconda/Miniconda3-2.2.2-MacOSX-x86_64.sh#040065c06fdeaade1bec67418573608763f6c8c481e0e4e6a9f267598767ab33" "miniconda" verify_py33 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.0.0000066400000000000000000000016431517431316200265230ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86" ) install_script "Miniconda3-3.0.0-Linux-x86" "https://repo.continuum.io/miniconda/Miniconda3-3.0.0-Linux-x86.sh#1280ea8cbfcbd3f2a490b094657f2af7872752629b4895b88163f6d0d50dca83" "miniconda" verify_py33 ;; "Linux-x86_64" ) install_script "Miniconda3-3.0.0-Linux-x86_64" "https://repo.continuum.io/miniconda/Miniconda3-3.0.0-Linux-x86_64.sh#6bfa6dd73140f00b15e49a8092ec74dbbb96ad28d68a5e05dedd9b427539fcaf" "miniconda" verify_py33 ;; "MacOSX-x86_64" ) install_script "Miniconda3-3.0.0-MacOSX-x86_64" "https://repo.continuum.io/miniconda/Miniconda3-3.0.0-MacOSX-x86_64.sh#b693cfdd2c4b819cd2e977b7200277e7374bcc1578a3d1975255a28887896597" "miniconda" verify_py33 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.0.4000066400000000000000000000016431517431316200265270ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86" ) install_script "Miniconda3-3.0.4-Linux-x86" "https://repo.continuum.io/miniconda/Miniconda3-3.0.4-Linux-x86.sh#1046256accc3b752f4625658e7d845d65c14c7fbb7346579ee828adf7139471d" "miniconda" verify_py33 ;; "Linux-x86_64" ) install_script "Miniconda3-3.0.4-Linux-x86_64" "https://repo.continuum.io/miniconda/Miniconda3-3.0.4-Linux-x86_64.sh#afe03bbed5001a5352e81c018e0bb14e6ade2baa09ecf689febfd6edecb5e93a" "miniconda" verify_py33 ;; "MacOSX-x86_64" ) install_script "Miniconda3-3.0.4-MacOSX-x86_64" "https://repo.continuum.io/miniconda/Miniconda3-3.0.4-MacOSX-x86_64.sh#986525923231b4796c1eb13f2e4defae9aad5ed09b3e32c01b7ebb0aad4ad870" "miniconda" verify_py33 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.0.5000066400000000000000000000016431517431316200265300ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86" ) install_script "Miniconda3-3.0.5-Linux-x86" "https://repo.continuum.io/miniconda/Miniconda3-3.0.5-Linux-x86.sh#014d0e44b752d9e91373a3c56252b62c0f29b628a8584f8b5515c7c3d8acc6be" "miniconda" verify_py33 ;; "Linux-x86_64" ) install_script "Miniconda3-3.0.5-Linux-x86_64" "https://repo.continuum.io/miniconda/Miniconda3-3.0.5-Linux-x86_64.sh#eaf8c5005645eecd18cc09d2da2a69314057a9e36eadc5084120bc1deffa332b" "miniconda" verify_py33 ;; "MacOSX-x86_64" ) install_script "Miniconda3-3.0.5-MacOSX-x86_64" "https://repo.continuum.io/miniconda/Miniconda3-3.0.5-MacOSX-x86_64.sh#7c088951665e2c35574f6dde81189467d80806caff47872887525ed3d0b4dbd0" "miniconda" verify_py33 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.10-22.11.1-1000066400000000000000000000033421517431316200274020ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py310_22.11.1-1-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_22.11.1-1-Linux-aarch64.sh#48a96df9ff56f7421b6dd7f9f71d548023847ba918c3826059918c08326c2017" "miniconda" verify_py310 ;; "Linux-ppc64le" ) install_script "Miniconda3-py310_22.11.1-1-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-py310_22.11.1-1-Linux-ppc64le.sh#4c86c3383bb27b44f7059336c3a46c34922df42824577b93eadecefbf7423836" "miniconda" verify_py310 ;; "Linux-s390x" ) install_script "Miniconda3-py310_22.11.1-1-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py310_22.11.1-1-Linux-s390x.sh#a150511e7fd19d07b770f278fb5dd2df4bc24a8f55f06d6274774f209a36c766" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Miniconda3-py310_22.11.1-1-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_22.11.1-1-Linux-x86_64.sh#00938c3534750a0e4069499baf8f4e6dc1c2e471c86a59caa0dd03f4a9269db6" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Miniconda3-py310_22.11.1-1-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_22.11.1-1-MacOSX-arm64.sh#22eec9b7d3add25ac3f9b60621d8f3d8df3e63d4aa0ae5eb846b558d7ba68333" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py310_22.11.1-1-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_22.11.1-1-MacOSX-x86_64.sh#7406579393427eaf9bc0e094dcd3c66d1e1b93ee9db4e7686d0a72ea5d7c0ce5" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.10-23.1.0-1000066400000000000000000000033261517431316200273230ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py310_23.1.0-1-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.1.0-1-Linux-aarch64.sh#80d6c306b015e1e3b01ea59dc66c676a81fa30279bc2da1f180a7ef7b2191d6e" "miniconda" verify_py310 ;; "Linux-ppc64le" ) install_script "Miniconda3-py310_23.1.0-1-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.1.0-1-Linux-ppc64le.sh#9ca8077a0af8845fc574a120ef8d68690d7a9862d354a2a4468de5d2196f406c" "miniconda" verify_py310 ;; "Linux-s390x" ) install_script "Miniconda3-py310_23.1.0-1-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.1.0-1-Linux-s390x.sh#0d00a9d34c5fd17d116bf4e7c893b7441a67c7a25416ede90289d87216104a97" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Miniconda3-py310_23.1.0-1-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.1.0-1-Linux-x86_64.sh#32d73e1bc33fda089d7cd9ef4c1be542616bd8e437d1f77afeeaf7afdb019787" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Miniconda3-py310_23.1.0-1-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.1.0-1-MacOSX-arm64.sh#cc5bcf95d5db0f7f454b2d800d52da8b70563f8454d529e7ac2da9725650eb27" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py310_23.1.0-1-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.1.0-1-MacOSX-x86_64.sh#bfb81814e16eb450b1dbde7b4ecb9ebc5186834cb4ede5926c699762ca69953b" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.10-23.10.0-1000066400000000000000000000033641517431316200274050ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py310_23.10.0-1-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.10.0-1-Linux-aarch64.sh#3b8698e433dd9e8f948f94939b176b7819807bedb86020b81e2fca674d3df3b4" "miniconda" verify_py310 ;; "Linux-ppc64le" ) install_script "Miniconda3-py310_23.10.0-1-Linux-ppc64le.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.10.0-1-Linux-ppc64le.sh#8ba2b32ee15be9e43c3712d9235e8c6f1350de733e72f67ef035c878eee134e5" "miniconda" verify_py310 ;; "Linux-s390x" ) install_script "Miniconda3-py310_23.10.0-1-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.10.0-1-Linux-s390x.sh#ab037a5df6414fe48979285769a61bf99e46d1efd1c98bd3b0a9ab767862f86b" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Miniconda3-py310_23.10.0-1-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.10.0-1-Linux-x86_64.sh#c7a34df472feb69805b64df6e8db58363c5ccab41cd3b40b07e3e6dfb924359a" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Miniconda3-py310_23.10.0-1-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.10.0-1-MacOSX-arm64.sh#a1477dfb4edfe922c2d1ed8dce90c16e6c57b3008f9503fae804acfda67736ae" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py310_23.10.0-1-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.10.0-1-MacOSX-x86_64.sh#bea320962dce404ecc1f6f4b0c0462cd3300df8ab165e5cb5bcee372c498535f" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.10-23.11.0-1000066400000000000000000000027621517431316200274070ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py310_23.11.0-1-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.11.0-1-Linux-aarch64.sh#30b3f26fee441c5d70bd50ec06ea1acaa0e373ad30771165eada3f6bdf27766a" "miniconda" verify_py310 ;; "Linux-s390x" ) install_script "Miniconda3-py310_23.11.0-1-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.11.0-1-Linux-s390x.sh#54bfe6a47e24ddaa74b02c88d64596c1234fdf6c3789740471dea2bf3c685392" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Miniconda3-py310_23.11.0-1-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.11.0-1-Linux-x86_64.sh#6581658486be8e700d77e24eccafba586a0fbafafadcf73d35ab13eaee4b80b1" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Miniconda3-py310_23.11.0-1-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.11.0-1-MacOSX-arm64.sh#570f66f7264d8ba3195fc0755baed35320842b36fb34ef16bdc142f1dc616cae" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py310_23.11.0-1-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.11.0-1-MacOSX-x86_64.sh#6517332e5af2088a0413dd9f536f258814efb6d5b9f78011a6f2ea53e2874484" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.10-23.11.0-2000066400000000000000000000027621517431316200274100ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py310_23.11.0-2-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.11.0-2-Linux-aarch64.sh#85bb96bca04b75f2081b4c0f7f10476fd67fba1637c18b07272aa3a518df5596" "miniconda" verify_py310 ;; "Linux-s390x" ) install_script "Miniconda3-py310_23.11.0-2-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.11.0-2-Linux-s390x.sh#fd506291eb51641e8cd3164c09fec31826f26dc446c3da9bb4c88fe35c95dfe7" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Miniconda3-py310_23.11.0-2-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.11.0-2-Linux-x86_64.sh#35a58b8961e1187e7311b979968662c6223e86e1451191bed2e67a72b6bd0658" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Miniconda3-py310_23.11.0-2-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.11.0-2-MacOSX-arm64.sh#958a8d6e14d9eb843b24ba4019a1b62e0dedd819d844247485fd0c0ea4acbc61" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py310_23.11.0-2-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.11.0-2-MacOSX-x86_64.sh#07a6f46146993510d5d839ee014fc2229f7870d92aa73a52f11dd240833f08fb" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.10-23.3.1-0000066400000000000000000000033261517431316200273250ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py310_23.3.1-0-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.3.1-0-Linux-aarch64.sh#6950c7b1f4f65ce9b87ee1a2d684837771ae7b2e6044e0da9e915d1dee6c924c" "miniconda" verify_py310 ;; "Linux-ppc64le" ) install_script "Miniconda3-py310_23.3.1-0-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.3.1-0-Linux-ppc64le.sh#b3de538cd542bc4f5a2f2d2a79386288d6e04f0e1459755f3cefe64763e51d16" "miniconda" verify_py310 ;; "Linux-s390x" ) install_script "Miniconda3-py310_23.3.1-0-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.3.1-0-Linux-s390x.sh#ed4f51afc967e921ff5721151f567a4c43c4288ac93ec2393c6238b8c4891de8" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Miniconda3-py310_23.3.1-0-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.3.1-0-Linux-x86_64.sh#aef279d6baea7f67940f16aad17ebe5f6aac97487c7c03466ff01f4819e5a651" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Miniconda3-py310_23.3.1-0-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.3.1-0-MacOSX-arm64.sh#9d1d12573339c49050b0d5a840af0ff6c32d33c3de1b3db478c01878eb003d64" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py310_23.3.1-0-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.3.1-0-MacOSX-x86_64.sh#5abc78b664b7da9d14ade330534cc98283bb838c6b10ad9cfd8b9cc4153f8104" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.10-23.5.0-3000066400000000000000000000033261517431316200273310ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py310_23.5.0-3-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.5.0-3-Linux-aarch64.sh#a632110a9ebddd8528b26241663ee9368d218e36b40e570072774897762f1de8" "miniconda" verify_py310 ;; "Linux-ppc64le" ) install_script "Miniconda3-py310_23.5.0-3-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.5.0-3-Linux-ppc64le.sh#5ed0af4645f49c4412e33a3f94396bcb3eb25f4a3ccb0bfe5bc23ef06bad6f3f" "miniconda" verify_py310 ;; "Linux-s390x" ) install_script "Miniconda3-py310_23.5.0-3-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.5.0-3-Linux-s390x.sh#5701eba074e3c2894949370ab456df48361a2efaad9b11209dbf8258ddf1e331" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Miniconda3-py310_23.5.0-3-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.5.0-3-Linux-x86_64.sh#738890e7a6f0719a942c632a0aab1df7a5a592c5667d0495d1f0495990a709ba" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Miniconda3-py310_23.5.0-3-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.5.0-3-MacOSX-arm64.sh#ff2121c0a8245bbe63ff70cdb76b492c831889225f9c5277e096f08fd03e7f17" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py310_23.5.0-3-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.5.0-3-MacOSX-x86_64.sh#03a98ff5d1c813d7bf969203fe404d7a6f149b335c2077703656807721603495" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.10-23.5.1-0000066400000000000000000000033261517431316200273270ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py310_23.5.1-0-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.5.1-0-Linux-aarch64.sh#d6a99c45326f8e849b18964090f0f5ac56bc4f173a6b18a4a5057bc09bd128f3" "miniconda" verify_py310 ;; "Linux-ppc64le" ) install_script "Miniconda3-py310_23.5.1-0-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.5.1-0-Linux-ppc64le.sh#920a8d8f9a6aa6bc1cd2ddf56cb0af779b3c70eb82d61fb05397814adfc0837f" "miniconda" verify_py310 ;; "Linux-s390x" ) install_script "Miniconda3-py310_23.5.1-0-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.5.1-0-Linux-s390x.sh#63962e4c21e13b680f62d8c7cf11fb1a4a2192188d0d7c0a0994099470b65567" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Miniconda3-py310_23.5.1-0-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.5.1-0-Linux-x86_64.sh#9f4cd0a9f7289a1e03b79fe6d06bab0769c46c33a774ea8a94dc3c1883344d85" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Miniconda3-py310_23.5.1-0-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.5.1-0-MacOSX-arm64.sh#dde48d596695115a05218d694b20212d900a66c005a1926a9018a756b1188f1f" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py310_23.5.1-0-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.5.1-0-MacOSX-x86_64.sh#4e5315e39ce5be6d64fb0bf0a62aa6e8d09224542fa5b9a4d695c599bd6f66b0" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.10-23.5.2-0000066400000000000000000000033261517431316200273300ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py310_23.5.2-0-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.5.2-0-Linux-aarch64.sh#24f7fe91032538cf2d9748facabae346e45e46ca21bb5f2d5875b7865dca6fa4" "miniconda" verify_py310 ;; "Linux-ppc64le" ) install_script "Miniconda3-py310_23.5.2-0-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.5.2-0-Linux-ppc64le.sh#3a76e4e400271d1589770dac8f696b03d1faf45fee57da38e8c399b6cb0daadb" "miniconda" verify_py310 ;; "Linux-s390x" ) install_script "Miniconda3-py310_23.5.2-0-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.5.2-0-Linux-s390x.sh#7a65b8593db0ec4b561b9968daca7c7c4f5f95cb21fe717ba895fded924bc056" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Miniconda3-py310_23.5.2-0-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.5.2-0-Linux-x86_64.sh#ea5e6e8a3d5a0247b9df85382d27220fac8e59b5778fd313c5913879cd9baafc" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Miniconda3-py310_23.5.2-0-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.5.2-0-MacOSX-arm64.sh#71b7ca2ae4068504f9c6dab30fd6e83694086241156af1e319d598befe0f3a26" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py310_23.5.2-0-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.5.2-0-MacOSX-x86_64.sh#13c57188a4bcb7462a7580c9ddf8ff2d301e353c835d33042a51a231667cf25d" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.10-23.9.0-0000066400000000000000000000033261517431316200273320ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py310_23.9.0-0-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.9.0-0-Linux-aarch64.sh#bc0f7f0a1c83cdf1330726168518b55454d092c64593f82872a50c4b5742b958" "miniconda" verify_py310 ;; "Linux-ppc64le" ) install_script "Miniconda3-py310_23.9.0-0-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.9.0-0-Linux-ppc64le.sh#fa9d79e1df278dc72e5935fec3c87c6897a9388895a2a47b0ed49935d71c92e7" "miniconda" verify_py310 ;; "Linux-s390x" ) install_script "Miniconda3-py310_23.9.0-0-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.9.0-0-Linux-s390x.sh#e10a160a44b0356f2ce59ce562855461499202976197ca7e1bf25ccb51dabb57" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Miniconda3-py310_23.9.0-0-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.9.0-0-Linux-x86_64.sh#b272a5f843762f0a18f6b70a162cd554a43a06adcd6f5a2102840e41907fffe5" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Miniconda3-py310_23.9.0-0-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.9.0-0-MacOSX-arm64.sh#3178aad8c75b30830e97d9a232433df1dfbe6cd34f55e0d7769cfaa17aa49e84" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py310_23.9.0-0-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.9.0-0-MacOSX-x86_64.sh#88266dda3e812bf6789fceeb9cfcfbbcada860aa4050ae2a781812fbd077ed35" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.10-24.1.2-0000066400000000000000000000027311517431316200273240ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py310_24.1.2-0-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.1.2-0-Linux-aarch64.sh#e560e737ac0e625dcc19ca2927457c2944434a61280daae2594632aca76d1422" "miniconda" verify_py310 ;; "Linux-s390x" ) install_script "Miniconda3-py310_24.1.2-0-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.1.2-0-Linux-s390x.sh#014fd09da9f7ecae040d586a6ff4218e508bf0e5e0232be6383ff37973a337c7" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Miniconda3-py310_24.1.2-0-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.1.2-0-Linux-x86_64.sh#8eb5999c2f7ac6189690d95ae5ec911032fa6697ae4b34eb3235802086566d78" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Miniconda3-py310_24.1.2-0-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.1.2-0-MacOSX-arm64.sh#01110da80119c11078d2b39a499b6dc086c5fd4b413f4b333d32feb3b03cbe7b" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py310_24.1.2-0-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.1.2-0-MacOSX-x86_64.sh#f078682fca26350717c1940650c227f9843fe9f3f0ecc87bf2665bccc5c64f9c" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.10-24.11.1-0000066400000000000000000000027621517431316200274100ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py310_24.11.1-0-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.11.1-0-Linux-aarch64.sh#70fa20d714ba54114c41990a7222a49bd3c833a0f602bd0e0df507bb2f787035" "miniconda" verify_py310 ;; "Linux-s390x" ) install_script "Miniconda3-py310_24.11.1-0-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.11.1-0-Linux-s390x.sh#c5021ecb894cc7b1bb2d62f2156bdaf3e642235b501998bcc730024b07515c74" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Miniconda3-py310_24.11.1-0-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.11.1-0-Linux-x86_64.sh#7a3cdbb78a642b2b6dd0687c9e09824e53330368ab57406e27d88e25c4fe4e40" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Miniconda3-py310_24.11.1-0-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.11.1-0-MacOSX-arm64.sh#73d7eb2569e976c6da1946723a3b8bebf0f2aaccef80b28f8eef69fd835572b1" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py310_24.11.1-0-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.11.1-0-MacOSX-x86_64.sh#2f8be5e7beeda8d161be2254d1d1d7e786ca8d11602bd1b7dde1134fcad365fa" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.10-24.3.0-0000066400000000000000000000027311517431316200273240ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py310_24.3.0-0-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.3.0-0-Linux-aarch64.sh#cacbd0c4b829dae73ddbcee6b30674dc7aa20bf6dea720929fb01d4b6279f743" "miniconda" verify_py310 ;; "Linux-s390x" ) install_script "Miniconda3-py310_24.3.0-0-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.3.0-0-Linux-s390x.sh#fb0f113b0ad2eb9a05b017f49d4a27960ff9ec3d8ec0b580b79efb8c84d15d8e" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Miniconda3-py310_24.3.0-0-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.3.0-0-Linux-x86_64.sh#def595b1b182749df0974cddb5c8befe70664ace16403d7a7bf54467be5ea48b" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Miniconda3-py310_24.3.0-0-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.3.0-0-MacOSX-arm64.sh#ceae63e7c99b4ff33ddb1a9973956d829d4a00d39f1f7c6e2056e0e076059535" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py310_24.3.0-0-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.3.0-0-MacOSX-x86_64.sh#094c5a94818caf41deba41411876c3cffa918efdf8ada40dc32bcc535d181c78" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.10-24.4.0-0000066400000000000000000000027501517431316200273260ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py310_24.4.0-0-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.4.0-0-Linux-aarch64.sh#68f3a537bf2ba8031961c8be6b52236c75478c797e0333e055539f02147676b8" "miniconda" verify_py310 ;; "Linux-s390x" ) install_script "Miniconda3-py310_24.4.0-0-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.4.0-0-Linux-s390x.sh#d5d06f9aa66d9cc9a23d6278826cb09f44f8e005b8b8fcf2664bef02e61ca751" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Miniconda3-py310_24.4.0-0-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.4.0-0-Linux-x86_64.sh#fdaa5afdea8c07b6f2203b8f95abe0e4e8c4d3fd3c10d19fe590311446591ffa" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Miniconda3-py310_24.4.0-0-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.4.0-0-MacOSX-arm64.sh#21f0b7c653518a6eb6135593c509cefc78fdff839bb2e887d36bc03eda607faf" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py310_24.4.0-0-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.4.0-0-MacOSX-x86_64.sh#c2eed72ff97b4eb81bc1171616b0ff48a440a2e1ad5638e1899b80286767c568" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.10-24.5.0-0000066400000000000000000000027501517431316200273270ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py310_24.5.0-0-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.5.0-0-Linux-aarch64.sh#edcf076c80846beded0b72e98811cf7b93d0abc2ae93c060efc76f8da1e6fc45" "miniconda" verify_py310 ;; "Linux-s390x" ) install_script "Miniconda3-py310_24.5.0-0-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.5.0-0-Linux-s390x.sh#e00f3d03d13fc4fa394a5d20a5476087237ee6cb029eba3b02322acc104b530b" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Miniconda3-py310_24.5.0-0-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.5.0-0-Linux-x86_64.sh#b3d73db6a05069fbdf20dc33fc9b6a29fa7198578f0d090c639f5ca0e84102bd" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Miniconda3-py310_24.5.0-0-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.5.0-0-MacOSX-arm64.sh#e422602aa19140c600b5889e5b41a0d7187640107ea82fcb5da857dd25330148" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py310_24.5.0-0-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.5.0-0-MacOSX-x86_64.sh#6d7c1cc138adfc4bb2ccbb8a22eb8e9eb13a366b6af0d63245b643e6c3a3c708" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.10-24.7.1-0000066400000000000000000000027501517431316200273320ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py310_24.7.1-0-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.7.1-0-Linux-aarch64.sh#8a5f3510b91f9641c72046f82974a2b95f0b7fee7ed3a9f8223fd5e447c13a2e" "miniconda" verify_py310 ;; "Linux-s390x" ) install_script "Miniconda3-py310_24.7.1-0-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.7.1-0-Linux-s390x.sh#f0fa28fb5ee38ac1950fdb22cbef435f08dbe1846690a7757298e5021152ad38" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Miniconda3-py310_24.7.1-0-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.7.1-0-Linux-x86_64.sh#684cda724bc37e3bbbb342e440fc4cac515c92e91a489eb4359feca35382894b" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Miniconda3-py310_24.7.1-0-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.7.1-0-MacOSX-arm64.sh#0205a5fca4648832f1a0a3862149722dded533cabbb1d274609f883690e7ee72" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py310_24.7.1-0-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.7.1-0-MacOSX-x86_64.sh#fb3406a97b59c665640ab427694844676c9c4d3ab7ca551866381b4e547b4dcf" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.10-24.9.2-0000066400000000000000000000027501517431316200273350ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py310_24.9.2-0-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.9.2-0-Linux-aarch64.sh#5d022f16ecb01d33ac8c85a87a0a8dccfb025dc90b20dbd56c4b9ae8f9727578" "miniconda" verify_py310 ;; "Linux-s390x" ) install_script "Miniconda3-py310_24.9.2-0-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.9.2-0-Linux-s390x.sh#93d75b306151f96a460a80d8849d85636929a90490f44004f4296a0b8399ccc5" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Miniconda3-py310_24.9.2-0-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.9.2-0-Linux-x86_64.sh#364869f004c6259268b09a667ed476080bf4f44e9c4ab06a293146df8990d43f" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Miniconda3-py310_24.9.2-0-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.9.2-0-MacOSX-arm64.sh#d666284d5dd9290b446de5dc20e8498545867c7730799cba8f52e97a45db42d2" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py310_24.9.2-0-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.9.2-0-MacOSX-x86_64.sh#7359ff3963ab3ccdc5eec244c610270b456a9584477cb645aa7539924bdd0482" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.10-25.1.1-0000066400000000000000000000030031517431316200273150ustar00rootroot00000000000000export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py310_25.1.1-0-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_25.1.1-0-Linux-aarch64.sh#d8a975d2194aab5ace390c273c5328be89342b956711c1648d02c87e4c4ffeb1" "miniconda" verify_py310 ;; "Linux-s390x" ) install_script "Miniconda3-py310_25.1.1-0-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py310_25.1.1-0-Linux-s390x.sh#087d1cb3708da2a07def69e925731a87b500a9b5befec5e7666422480a5edc67" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Miniconda3-py310_25.1.1-0-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_25.1.1-0-Linux-x86_64.sh#2346f43213d3e96abca95d0a7df2575d52c66030f2feb90d3d58ed3eabe76aa3" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Miniconda3-py310_25.1.1-0-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_25.1.1-0-MacOSX-arm64.sh#e52fabc1c331e79cb4a348eea0ac9fc75742609ed5a41370a1e8790a97c13449" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py310_25.1.1-0-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_25.1.1-0-MacOSX-x86_64.sh#3d9720b16428a924b09f460f942be1f841c28d9ceeff9149051a8f4241745839" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.10-25.1.1-1000066400000000000000000000030031517431316200273160ustar00rootroot00000000000000export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py310_25.1.1-1-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_25.1.1-1-Linux-aarch64.sh#a72a3247d4c5843bf9ba3e902218ada02e2b75b16260541befd7ac0961077fa9" "miniconda" verify_py310 ;; "Linux-s390x" ) install_script "Miniconda3-py310_25.1.1-1-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py310_25.1.1-1-Linux-s390x.sh#072b62a97432048e5ad1e9a987c6739de719192f6c19c79b06d1e05424cd4c35" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Miniconda3-py310_25.1.1-1-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_25.1.1-1-Linux-x86_64.sh#585972959914f1f9be463284d477717eb10f7306bda63f2ec3c4c86047b9dd72" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Miniconda3-py310_25.1.1-1-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_25.1.1-1-MacOSX-arm64.sh#0be344f9eb9e7cf7c2d45598922674e599739c9a9f6c5ee1436238005da9dd03" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py310_25.1.1-1-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_25.1.1-1-MacOSX-x86_64.sh#497d6deb3932f8f0257a3db515419e871a0f1ecb155e0fd80d13ca7bbccbecac" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.10-25.1.1-2000066400000000000000000000030031517431316200273170ustar00rootroot00000000000000export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py310_25.1.1-2-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_25.1.1-2-Linux-aarch64.sh#5f61143e93d9d48a82aa99a1d7b1c77561f599b9a67ab954862e6e8d6a25c0cc" "miniconda" verify_py310 ;; "Linux-s390x" ) install_script "Miniconda3-py310_25.1.1-2-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py310_25.1.1-2-Linux-s390x.sh#89d689248a6855da3e6087cfeebaad6886e4ef46b4e96671bf251bb9aa6b1499" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Miniconda3-py310_25.1.1-2-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_25.1.1-2-Linux-x86_64.sh#7f298109ab95b5436632973a04189a125282cc948f1dd1b03fa9cb6c71443915" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Miniconda3-py310_25.1.1-2-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_25.1.1-2-MacOSX-arm64.sh#119e3196d9e67f8eb0f88d4a3188849b5b8bf14a8dd87873c0bff7ce016eea52" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py310_25.1.1-2-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_25.1.1-2-MacOSX-x86_64.sh#543d635dcd34256ac87ffe7a242259cf8f639d51a503da4e4eb3e29ecf406302" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.10-25.11.1-1000066400000000000000000000020251517431316200274020ustar00rootroot00000000000000export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py310_25.11.1-1-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_25.11.1-1-Linux-aarch64.sh#cbac1da35d4c8635384f58b9a776c23fcb3c4dc0b936b8d4d0526f2d0a4b1c4c" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Miniconda3-py310_25.11.1-1-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_25.11.1-1-Linux-x86_64.sh#f6174765edd75e1ef2bb3f16e99266d291deebf6532f2f7e800569afc084d0eb" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Miniconda3-py310_25.11.1-1-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_25.11.1-1-MacOSX-arm64.sh#c83c7a20dd45442ef05321637872bdd9ee13395098e9bb1a22a28b1dccdd9a31" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.10-25.3.1-1000066400000000000000000000024141517431316200273250ustar00rootroot00000000000000export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py310_25.3.1-1-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_25.3.1-1-Linux-aarch64.sh#7879e8e2c89d26d8c4776fbad72656afda697e67e2e70b9b8eef368b111d2253" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Miniconda3-py310_25.3.1-1-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_25.3.1-1-Linux-x86_64.sh#fa277fc23e40625d4c12a00c0378b4bbb2baee96660796431ee76185fe1b5025" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Miniconda3-py310_25.3.1-1-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_25.3.1-1-MacOSX-arm64.sh#79036d813ac3035b8d833ea427df6ccd02d25798d7abb5e5b4423f6642088a33" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py310_25.3.1-1-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_25.3.1-1-MacOSX-x86_64.sh#adf482eea0ffa1f6ead1cb217ee0a2cc8c0732399782a609c4333dc96bf9d6a6" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.10-25.5.1-0000066400000000000000000000024141517431316200273260ustar00rootroot00000000000000export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py310_25.5.1-0-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_25.5.1-0-Linux-aarch64.sh#6886af5e5db79dfb4429cde937b6f806d02b0e98dd11249c74917661fc7b1f4b" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Miniconda3-py310_25.5.1-0-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_25.5.1-0-Linux-x86_64.sh#aa8cbd6aa7ef85d0528616d2dffce8bd0b51924e7ddd18734ede6c1c63c462d0" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Miniconda3-py310_25.5.1-0-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_25.5.1-0-MacOSX-arm64.sh#169baa18136f7ee46052ec4e1719401e1b99427bba3cf0507da0a6980b7e32a1" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py310_25.5.1-0-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_25.5.1-0-MacOSX-x86_64.sh#7d7aa6302fe696afa5b46b3c8f6eaf80fcf3c1355df0c3a8910514cf02bf02af" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.10-25.5.1-1000066400000000000000000000024141517431316200273270ustar00rootroot00000000000000export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py310_25.5.1-1-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_25.5.1-1-Linux-aarch64.sh#630f724622a3f45f66b3b08f708bc44e2cb595ad147f68750271c6352cb4d734" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Miniconda3-py310_25.5.1-1-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_25.5.1-1-Linux-x86_64.sh#84bd8f60fea2e09f1fa72f258132337aff7a20ec1e12dea9d1eff96830cf3d8c" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Miniconda3-py310_25.5.1-1-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_25.5.1-1-MacOSX-arm64.sh#4e8309e9c0ed87fe5f5ffc77ae71201f51939f5c163d00f6867154f1b9cee41a" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py310_25.5.1-1-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_25.5.1-1-MacOSX-x86_64.sh#564e63a326cf73b2ab9a4a8be5bdf51996388f10a8eb4170071cb74f836d1e4e" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.10-25.7.0-2000066400000000000000000000024141517431316200273310ustar00rootroot00000000000000export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py310_25.7.0-2-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_25.7.0-2-Linux-aarch64.sh#e13bd0e0b4f70841f78aea8a978eb35cd6afb0af3e2d2b8f85d24636bb56bc21" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Miniconda3-py310_25.7.0-2-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_25.7.0-2-Linux-x86_64.sh#647b55a8da07136fa2543fbf6b9719d3a4c2369dec5dd31d2c4bda2b51107717" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Miniconda3-py310_25.7.0-2-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_25.7.0-2-MacOSX-arm64.sh#623c2e81b87516753d902aee0003e7126ab34817f27d46c6fd2c097435cab470" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py310_25.7.0-2-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_25.7.0-2-MacOSX-x86_64.sh#cd6f9cd295cecab025884175c59a0d0bd2ff919ebf60abfa1bd5e5b36772876e" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.10-25.9.1-1000066400000000000000000000020171517431316200273320ustar00rootroot00000000000000export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py310_25.9.1-1-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_25.9.1-1-Linux-aarch64.sh#28fc3db9c7ee63cedab38b0e6006409f1f448be7ffc57b270623efd4422b0608" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Miniconda3-py310_25.9.1-1-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_25.9.1-1-Linux-x86_64.sh#04a8b03d8b0ec062d923e592201a6fd88b7247c309ef8848afb25c424c40ac39" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Miniconda3-py310_25.9.1-1-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_25.9.1-1-MacOSX-arm64.sh#fb3fbef60259b36b0248c73fecdd974f8554d5fccfe0a7b8a45eb06dedbe8a85" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.10-25.9.1-3000066400000000000000000000020171517431316200273340ustar00rootroot00000000000000export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py310_25.9.1-3-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_25.9.1-3-Linux-aarch64.sh#bc58460f17ec60d6c920d4352dd4d5e465aa22b56580bd4cd57c9693859761ec" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Miniconda3-py310_25.9.1-3-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_25.9.1-3-Linux-x86_64.sh#e4dea08f67e7093433c34d02b8947b093a902f1120b283758d5200bd92db594c" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Miniconda3-py310_25.9.1-3-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_25.9.1-3-MacOSX-arm64.sh#3b54f297df4c9f3e45ce692a87984e79d13761a45469d37e852a8b216215ccf0" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.10-26.1.1-1000066400000000000000000000020171517431316200273230ustar00rootroot00000000000000export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py310_26.1.1-1-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_26.1.1-1-Linux-aarch64.sh#0a78d6620113acd42d840925514c0f5eec9f2e1e8ae4394755c401b3b605875b" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Miniconda3-py310_26.1.1-1-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_26.1.1-1-Linux-x86_64.sh#4410410a6343f688bbfd48d80eb23e3125964e254e4c18802679d2e61b06876e" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Miniconda3-py310_26.1.1-1-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_26.1.1-1-MacOSX-arm64.sh#cadb31098a13b7dcc016594f54b01bcf1371161ba762a9ac3ba0d8f04b2615e2" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.10.1000066400000000000000000000016511517431316200266040ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86" ) install_script "Miniconda3-3.10.1-Linux-x86" "https://repo.continuum.io/miniconda/Miniconda3-3.10.1-Linux-x86.sh#e9b751fa8bc5372731512e058fa3867ad9e54983b48d462b4c8f7a031953c2bc" "miniconda" verify_py34 ;; "Linux-x86_64" ) install_script "Miniconda3-3.10.1-Linux-x86_64" "https://repo.continuum.io/miniconda/Miniconda3-3.10.1-Linux-x86_64.sh#cbd86f49008319416d1e57f9ac43a42445058f06aaeebe5ab974769887a8628b" "miniconda" verify_py34 ;; "MacOSX-x86_64" ) install_script "Miniconda3-3.10.1-MacOSX-x86_64" "https://repo.continuum.io/miniconda/Miniconda3-3.10.1-MacOSX-x86_64.sh#58ba40cbd1cf5bba680f94321d2ce22685a2b06ad9252044f06a0018fe99bd62" "miniconda" verify_py34 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.11-23.10.0-1000066400000000000000000000033641517431316200274060ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py311_23.10.0-1-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.10.0-1-Linux-aarch64.sh#a60e70ad7e8ac5bb44ad876b5782d7cdc66e10e1f45291b29f4f8d37cc4aa2c8" "miniconda" verify_py311 ;; "Linux-ppc64le" ) install_script "Miniconda3-py311_23.10.0-1-Linux-ppc64le.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.10.0-1-Linux-ppc64le.sh#1a2eda0a9a52a4bd058abbe9de5bb2bc751fcd7904c4755deffdf938d6f4436e" "miniconda" verify_py311 ;; "Linux-s390x" ) install_script "Miniconda3-py311_23.10.0-1-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.10.0-1-Linux-s390x.sh#ae212385c9d7f7473da7401d3f5f6cbbbc79a1fce730aa48531947e9c07e0808" "miniconda" verify_py311 ;; "Linux-x86_64" ) install_script "Miniconda3-py311_23.10.0-1-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.10.0-1-Linux-x86_64.sh#d0643508fa49105552c94a523529f4474f91730d3e0d1f168f1700c43ae67595" "miniconda" verify_py311 ;; "MacOSX-arm64" ) install_script ""Miniconda3-py311_23.10.0-1-MacOSX-arm64.sh "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.10.0-1-MacOSX-arm64.sh#5043144d7eaea2286e30d091b62fcf50f7ed983b092230e56c370b592e7a57f2" "miniconda" verify_py311 ;; "MacOSX-x86_64" ) install_script ""Miniconda3-py311_23.10.0-1-MacOSX-x86_64.sh "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.10.0-1-MacOSX-x86_64.sh#8c50faa3880fdef96967477af09d41c52332998beeee7ef8116c79d4f5023d72" "miniconda" verify_py311 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.11-23.11.0-1000066400000000000000000000027621517431316200274100ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py311_23.11.0-1-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.11.0-1-Linux-aarch64.sh#63c06a1974695e50bbe767a030903d169e637e42d5b7b6d30876b19a01fbbad8" "miniconda" verify_py311 ;; "Linux-s390x" ) install_script "Miniconda3-py311_23.11.0-1-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.11.0-1-Linux-s390x.sh#04586c734987a39114b81384014c2cfa89360c518371b6fa249d3062efca27fe" "miniconda" verify_py311 ;; "Linux-x86_64" ) install_script "Miniconda3-py311_23.11.0-1-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.11.0-1-Linux-x86_64.sh#5b3cefe534e23541f5f703f40d4818e361c3615dbf14651a0f29554c3fc3d0fd" "miniconda" verify_py311 ;; "MacOSX-arm64" ) install_script "Miniconda3-py311_23.11.0-1-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.11.0-1-MacOSX-arm64.sh#7901f8f272478657bd023cfd6d832b53213053897efd23c1061bcc35c68c0637" "miniconda" verify_py311 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py311_23.11.0-1-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.11.0-1-MacOSX-x86_64.sh#7ee24fb01fbe1081d6dd600805f5f9c6a3a12714670ecad65a6dfcf870c8a74d" "miniconda" verify_py311 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.11-23.11.0-2000066400000000000000000000027621517431316200274110ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py311_23.11.0-2-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.11.0-2-Linux-aarch64.sh#decd447fb99dbd0fc5004481ec9bf8c04f9ba28b35a9292afe49ecefe400237f" "miniconda" verify_py311 ;; "Linux-s390x" ) install_script "Miniconda3-py311_23.11.0-2-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.11.0-2-Linux-s390x.sh#53a9e9eb97cd6e318f4f184add069436e1a46124cf864bf2d7bd67043e50e471" "miniconda" verify_py311 ;; "Linux-x86_64" ) install_script "Miniconda3-py311_23.11.0-2-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.11.0-2-Linux-x86_64.sh#c9ae82568e9665b1105117b4b1e499607d2a920f0aea6f94410e417a0eff1b9c" "miniconda" verify_py311 ;; "MacOSX-arm64" ) install_script "Miniconda3-py311_23.11.0-2-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.11.0-2-MacOSX-arm64.sh#5694c382e6056d62ed874f22692224c4f53bca22e8135b6f069111e081be07aa" "miniconda" verify_py311 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py311_23.11.0-2-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.11.0-2-MacOSX-x86_64.sh#2b7f9e46308c28c26dd83abad3e72121ef63916eaf17b63723b5a1f728dc3032" "miniconda" verify_py311 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.11-23.5.0-3000066400000000000000000000033261517431316200273320ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py311_23.5.0-3-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.5.0-3-Linux-aarch64.sh#6e3e60e7093194b3435fde19efc54d0dd78be393bf5b7487cc28cd1039ebed4d" "miniconda" verify_py311 ;; "Linux-ppc64le" ) install_script "Miniconda3-py311_23.5.0-3-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.5.0-3-Linux-ppc64le.sh#c1ab8b5d629f66a1609e456a0d6a83a2896af6dc0b2b702025cb19456030eacd" "miniconda" verify_py311 ;; "Linux-s390x" ) install_script "Miniconda3-py311_23.5.0-3-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.5.0-3-Linux-s390x.sh#42e7cc490fc81d9b1dc56cf8bd951e084e804824d60aca3a4b15d35c57ad373e" "miniconda" verify_py311 ;; "Linux-x86_64" ) install_script "Miniconda3-py311_23.5.0-3-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.5.0-3-Linux-x86_64.sh#61a5c087893f6210176045931b89ee6e8760c17abd9c862b2cab4c1b7d00f7c8" "miniconda" verify_py311 ;; "MacOSX-arm64" ) install_script "Miniconda3-py311_23.5.0-3-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.5.0-3-MacOSX-arm64.sh#c4ce7311d2d1c729bf8d98e6d5aa2581ce0b08a1480985e63efaf8529b2fc6ca" "miniconda" verify_py311 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py311_23.5.0-3-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.5.0-3-MacOSX-x86_64.sh#2503d9e852fcaf85adca825bde84bdc297b118fd2c14316e4f27a93a190a7bdd" "miniconda" verify_py311 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.11-23.5.1-0000066400000000000000000000033261517431316200273300ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py311_23.5.1-0-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.5.1-0-Linux-aarch64.sh#a7a68db6676075aa20991d3fac6d7cfdb2bb3c815c0c17ea26fac96241486c6b" "miniconda" verify_py311 ;; "Linux-ppc64le" ) install_script "Miniconda3-py311_23.5.1-0-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.5.1-0-Linux-ppc64le.sh#63d6756dd9956e3ff581381fd319088fe23af53df8ccad8c6f029c89f5a1e534" "miniconda" verify_py311 ;; "Linux-s390x" ) install_script "Miniconda3-py311_23.5.1-0-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.5.1-0-Linux-s390x.sh#4472acdf8bab722a6dc4ef0b59636feac12b3520ef3d88c1bebd11106b596a96" "miniconda" verify_py311 ;; "Linux-x86_64" ) install_script "Miniconda3-py311_23.5.1-0-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.5.1-0-Linux-x86_64.sh#333779c9cae3fe14735949a8dcb9657b9e55ada69e9c60f191c5d582b2deac20" "miniconda" verify_py311 ;; "MacOSX-arm64" ) install_script "Miniconda3-py311_23.5.1-0-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.5.1-0-MacOSX-arm64.sh#52b3a134a73d48204e7517fb5b4378bece65a048e9a32c9276eb3fd51989b976" "miniconda" verify_py311 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py311_23.5.1-0-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.5.1-0-MacOSX-x86_64.sh#834a194e6d790eade3db98a78ec3f2857df13bb8b6661a26a34e67462561015b" "miniconda" verify_py311 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.11-23.5.2-0000066400000000000000000000033261517431316200273310ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py311_23.5.2-0-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.5.2-0-Linux-aarch64.sh#3962738cfac270ae4ff30da0e382aecf6b3305a12064b196457747b157749a7a" "miniconda" verify_py311 ;; "Linux-ppc64le" ) install_script "Miniconda3-py311_23.5.2-0-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.5.2-0-Linux-ppc64le.sh#92237cb2a443dd15005ec004f2f744b14de02cd5513a00983c2f191eb43d1b29" "miniconda" verify_py311 ;; "Linux-s390x" ) install_script "Miniconda3-py311_23.5.2-0-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.5.2-0-Linux-s390x.sh#221a4cd7f0a9275c3263efa07fa37385746de884f4306bb5d1fe5733ca770550" "miniconda" verify_py311 ;; "Linux-x86_64" ) install_script "Miniconda3-py311_23.5.2-0-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.5.2-0-Linux-x86_64.sh#634d76df5e489c44ade4085552b97bebc786d49245ed1a830022b0b406de5817" "miniconda" verify_py311 ;; "MacOSX-arm64" ) install_script "Miniconda3-py311_23.5.2-0-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.5.2-0-MacOSX-arm64.sh#c8f436dbde130f171d39dd7b4fca669c223f130ba7789b83959adc1611a35644" "miniconda" verify_py311 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py311_23.5.2-0-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.5.2-0-MacOSX-x86_64.sh#1622e7a0fa60a7d3d892c2d8153b54cd6ffe3e6b979d931320ba56bd52581d4b" "miniconda" verify_py311 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.11-23.9.0-0000066400000000000000000000033261517431316200273330ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py311_23.9.0-0-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.9.0-0-Linux-aarch64.sh#1242847b34b23353d429fcbcfb6586f0c373e63070ad7d6371c23ddbb577778a" "miniconda" verify_py311 ;; "Linux-ppc64le" ) install_script "Miniconda3-py311_23.9.0-0-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.9.0-0-Linux-ppc64le.sh#07b53e411c2e4423bd34c3526d6644b916c4b2143daa8fbcb36b8ead412239b9" "miniconda" verify_py311 ;; "Linux-s390x" ) install_script "Miniconda3-py311_23.9.0-0-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.9.0-0-Linux-s390x.sh#707c68e25c643c84036a16acdf836a3835ea75ffd2341c05ec2da6db1f3e9963" "miniconda" verify_py311 ;; "Linux-x86_64" ) install_script "Miniconda3-py311_23.9.0-0-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.9.0-0-Linux-x86_64.sh#43651393236cb8bb4219dcd429b3803a60f318e5507d8d84ca00dafa0c69f1bb" "miniconda" verify_py311 ;; "MacOSX-arm64" ) install_script "Miniconda3-py311_23.9.0-0-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.9.0-0-MacOSX-arm64.sh#4215f6fc572207f73a8f64692b4936b1952051f4cd620eec2ebd1f946e98b886" "miniconda" verify_py311 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py311_23.9.0-0-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.9.0-0-MacOSX-x86_64.sh#4b60eb49cf8fea6272bd2060878ab02cbab187dffd2fd732685c3c92a60b62ed" "miniconda" verify_py311 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.11-24.1.2-0000066400000000000000000000027311517431316200273250ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py311_24.1.2-0-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.1.2-0-Linux-aarch64.sh#1e046ef2d9d47289db2491f103c81b0b4baf943a9234ac59bd5bca076c881d98" "miniconda" verify_py311 ;; "Linux-s390x" ) install_script "Miniconda3-py311_24.1.2-0-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.1.2-0-Linux-s390x.sh#0489909051fd9e2c9addfa5fbd531ccb7f8f2463ac47376b8854e5a09b1c4011" "miniconda" verify_py311 ;; "Linux-x86_64" ) install_script "Miniconda3-py311_24.1.2-0-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.1.2-0-Linux-x86_64.sh#3f2e5498e550a6437f15d9cc8020d52742d0ba70976ee8fce4f0daefa3992d2e" "miniconda" verify_py311 ;; "MacOSX-arm64" ) install_script "Miniconda3-py311_24.1.2-0-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.1.2-0-MacOSX-arm64.sh#b5c4f646144fa4760bd5f6114ff2e6b49a3ef7c57b993f569adceea784f21a52" "miniconda" verify_py311 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py311_24.1.2-0-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.1.2-0-MacOSX-x86_64.sh#3b26c0867561d0988040193c8efd9f53ca922026f735367436aa05b467b1f187" "miniconda" verify_py311 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.11-24.11.1-0000066400000000000000000000027621517431316200274110ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py311_24.11.1-0-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.11.1-0-Linux-aarch64.sh#a8846ade7a5ddd9b6a6546590054d70d1c2cbe4fbe8c79fb70227e8fd93ef9f8" "miniconda" verify_py311 ;; "Linux-s390x" ) install_script "Miniconda3-py311_24.11.1-0-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.11.1-0-Linux-s390x.sh#bb499b18dbcbb2d89b22f91fe26fe661f5ed1f1944fdc743560d69cd52a2468f" "miniconda" verify_py311 ;; "Linux-x86_64" ) install_script "Miniconda3-py311_24.11.1-0-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.11.1-0-Linux-x86_64.sh#807774bae6cd87132094458217ebf713df436f64779faf9bb4c3d4b6615c1e3a" "miniconda" verify_py311 ;; "MacOSX-arm64" ) install_script "Miniconda3-py311_24.11.1-0-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.11.1-0-MacOSX-arm64.sh#862af4d7cb257219c6b280848049e09e1aff27acd06d5422359f2249f938e282" "miniconda" verify_py311 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py311_24.11.1-0-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.11.1-0-MacOSX-x86_64.sh#388f669ab95d659b4c97353f756ce93ed2000ec0114edaec9688f8541fa4bcab" "miniconda" verify_py311 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.11-24.3.0-0000066400000000000000000000027311517431316200273250ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py311_24.3.0-0-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.3.0-0-Linux-aarch64.sh#49082882752167cdea60e1aeedac7b73136bdfdd63b9bb3aca3c038901544458" "miniconda" verify_py311 ;; "Linux-s390x" ) install_script "Miniconda3-py311_24.3.0-0-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.3.0-0-Linux-s390x.sh#8e52dd1300c9462367d303a596a931e6ef8db422c7c79194efa6fdb152c92b61" "miniconda" verify_py311 ;; "Linux-x86_64" ) install_script "Miniconda3-py311_24.3.0-0-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.3.0-0-Linux-x86_64.sh#4da8dde69eca0d9bc31420349a204851bfa2a1c87aeb87fe0c05517797edaac4" "miniconda" verify_py311 ;; "MacOSX-arm64" ) install_script "Miniconda3-py311_24.3.0-0-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.3.0-0-MacOSX-arm64.sh#b7663626fedf8395d3fed78383b08060a13bd6747003bdb2a39220407f55cf65" "miniconda" verify_py311 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py311_24.3.0-0-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.3.0-0-MacOSX-x86_64.sh#fdd6294aaa0472f7ddeac89deacceec1469e76bd2a16ac11f37b4ab584fe5089" "miniconda" verify_py311 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.11-24.4.0-0000066400000000000000000000027501517431316200273270ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py311_24.4.0-0-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.4.0-0-Linux-aarch64.sh#d3ed9ff565c7341a4e4c957443ccb4f12f3dd5a087549099e7f199c36469e55c" "miniconda" verify_py311 ;; "Linux-s390x" ) install_script "Miniconda3-py311_24.4.0-0-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.4.0-0-Linux-s390x.sh#f2bea598cb72ed838a6e62b7dd8fbf1c3941a92783ba686822f70108c8c2e543" "miniconda" verify_py311 ;; "Linux-x86_64" ) install_script "Miniconda3-py311_24.4.0-0-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.4.0-0-Linux-x86_64.sh#7cb030a12d1da35e1c548344a895b108e0d2fbdc4f6b67d5180b2ac8539cc473" "miniconda" verify_py311 ;; "MacOSX-arm64" ) install_script "Miniconda3-py311_24.4.0-0-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.4.0-0-MacOSX-arm64.sh#a396cf4ca0088cf2d78517b28732b61697cdcb698528300946ef6409353eca86" "miniconda" verify_py311 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py311_24.4.0-0-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.4.0-0-MacOSX-x86_64.sh#b7f3adebd2b25dbefdc85e16f5ee130ac0d1167f416078f961e90f277476b115" "miniconda" verify_py311 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.11-24.5.0-0000066400000000000000000000027501517431316200273300ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py311_24.5.0-0-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.5.0-0-Linux-aarch64.sh#94a742af7bf5c7bae3dba6bd07d84d94b858b839e15af2ea0cd10fdf2bde8a73" "miniconda" verify_py311 ;; "Linux-s390x" ) install_script "Miniconda3-py311_24.5.0-0-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.5.0-0-Linux-s390x.sh#002963f32aebe1091d5da9a82416831f3c11217e6b4ea164c655f0d11f0cff80" "miniconda" verify_py311 ;; "Linux-x86_64" ) install_script "Miniconda3-py311_24.5.0-0-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.5.0-0-Linux-x86_64.sh#38b203bb1f2be78b735ebc00162f29e8e73fcd9a619ed5980490a72193ee1f58" "miniconda" verify_py311 ;; "MacOSX-arm64" ) install_script "Miniconda3-py311_24.5.0-0-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.5.0-0-MacOSX-arm64.sh#a3d62f20f09e8079db76379090f21b7ae34832dadeb5a250e4fab324c8328727" "miniconda" verify_py311 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py311_24.5.0-0-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.5.0-0-MacOSX-x86_64.sh#9e7dc7e0fbf0e9b2ff6bafdae9bf6ef122ae92d53533c2bbeb73433c0c6a4bd9" "miniconda" verify_py311 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.11-24.7.1-0000066400000000000000000000027501517431316200273330ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py311_24.7.1-0-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.7.1-0-Linux-aarch64.sh#f0ade904394ac5058dc293dd242a8af5c2005d28e020185691df32a5cc7ce0a0" "miniconda" verify_py311 ;; "Linux-s390x" ) install_script "Miniconda3-py311_24.7.1-0-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.7.1-0-Linux-s390x.sh#124b8f0df8c23e673409a68320f594a32e4e9e9608a3a6be1fddc0d597410e01" "miniconda" verify_py311 ;; "Linux-x86_64" ) install_script "Miniconda3-py311_24.7.1-0-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.7.1-0-Linux-x86_64.sh#a098a5b1581d8fd078c430b82e27106602223e335efef708a124e723814d120c" "miniconda" verify_py311 ;; "MacOSX-arm64" ) install_script "Miniconda3-py311_24.7.1-0-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.7.1-0-MacOSX-arm64.sh#9e7a3e0b835c0b18d561041a49311280ed58a7424a3324da370e69d4350eabcd" "miniconda" verify_py311 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py311_24.7.1-0-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.7.1-0-MacOSX-x86_64.sh#e459d9478ece4415e1a2e9b127da7240823e7d1bf6207a4d92779081b351f773" "miniconda" verify_py311 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.11-24.9.2-0000066400000000000000000000027501517431316200273360ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py311_24.9.2-0-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.9.2-0-Linux-aarch64.sh#c4c12d969be6a02cb7370a0c717400e8eec79dea722ef0fba98d745048948980" "miniconda" verify_py311 ;; "Linux-s390x" ) install_script "Miniconda3-py311_24.9.2-0-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.9.2-0-Linux-s390x.sh#8de1e23f3e0a097bc3b9173a1b4b56544bd34d2831b70a71a9d528eeab0dbe90" "miniconda" verify_py311 ;; "Linux-x86_64" ) install_script "Miniconda3-py311_24.9.2-0-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.9.2-0-Linux-x86_64.sh#62ef806265659c47e37e22e8f9adce29e75c4ea0497e619c280f54c823887c4f" "miniconda" verify_py311 ;; "MacOSX-arm64" ) install_script "Miniconda3-py311_24.9.2-0-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.9.2-0-MacOSX-arm64.sh#7358a1d53e7f857a9b87af148d20cdd00f3a91eca9f663371dfa3d830c375033" "miniconda" verify_py311 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py311_24.9.2-0-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.9.2-0-MacOSX-x86_64.sh#5d4229c322629cf2932c3a4e181501c98dae35b866c96d208b6688b0e2381604" "miniconda" verify_py311 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.11-25.1.1-0000066400000000000000000000030031517431316200273160ustar00rootroot00000000000000export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py311_25.1.1-0-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_25.1.1-0-Linux-aarch64.sh#737f02e2e6c192afbef000f6dba79f4dbbe852193c6890243516ea50d916d31c" "miniconda" verify_py311 ;; "Linux-s390x" ) install_script "Miniconda3-py311_25.1.1-0-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py311_25.1.1-0-Linux-s390x.sh#6244e894c56afc095eba0d2c2e88125af1a6a661187b136b8d1abc1392cca8eb" "miniconda" verify_py311 ;; "Linux-x86_64" ) install_script "Miniconda3-py311_25.1.1-0-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_25.1.1-0-Linux-x86_64.sh#9bc631a7edfc015bbf944d5f48c3852e7c0c83aeae0359b75bee9f402942413a" "miniconda" verify_py311 ;; "MacOSX-arm64" ) install_script "Miniconda3-py311_25.1.1-0-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_25.1.1-0-MacOSX-arm64.sh#0189917c28f8c3a8e9f113532225d4878e6f018d215739ccff92f99750fe7083" "miniconda" verify_py311 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py311_25.1.1-0-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_25.1.1-0-MacOSX-x86_64.sh#af0d2916b3e3aad814f246a85c48ec9658e2b5f4d1cc7f09246d197fa18169c8" "miniconda" verify_py311 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.11-25.1.1-1000066400000000000000000000030031517431316200273170ustar00rootroot00000000000000export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py311_25.1.1-1-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_25.1.1-1-Linux-aarch64.sh#288aa5b21b97db7f09bf6da03323b3a3b97d461a4c5bf666be58312eb6b6e311" "miniconda" verify_py311 ;; "Linux-s390x" ) install_script "Miniconda3-py311_25.1.1-1-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py311_25.1.1-1-Linux-s390x.sh#e0c755e9e2e26f75cccda56fe978e7a964ed559f474486421a0022b7351bc108" "miniconda" verify_py311 ;; "Linux-x86_64" ) install_script "Miniconda3-py311_25.1.1-1-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_25.1.1-1-Linux-x86_64.sh#03a253f7ca5cf1fdfca2aedced769d8479cb559b7c92e70f24c176fd9d23bc8e" "miniconda" verify_py311 ;; "MacOSX-arm64" ) install_script "Miniconda3-py311_25.1.1-1-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_25.1.1-1-MacOSX-arm64.sh#871ca583ee0be45d5fa36eba4143a6701e775c500c7b30ac519ef1a0205d78c3" "miniconda" verify_py311 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py311_25.1.1-1-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_25.1.1-1-MacOSX-x86_64.sh#deb025449147280611e6ca8bf89291cddb6eab06e2bff0114ac05f6f67b5ca89" "miniconda" verify_py311 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.11-25.1.1-2000066400000000000000000000030031517431316200273200ustar00rootroot00000000000000export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py311_25.1.1-2-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_25.1.1-2-Linux-aarch64.sh#8a1d4407fce7ec552ac6ed655ce93d83549e02b819cacefbb7f640f9051e638b" "miniconda" verify_py311 ;; "Linux-s390x" ) install_script "Miniconda3-py311_25.1.1-2-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py311_25.1.1-2-Linux-s390x.sh#0b4d5a3f16dcb2d230ba5dfdfdb848c854006aab6dd1bd3dbf29fcddf04b07a4" "miniconda" verify_py311 ;; "Linux-x86_64" ) install_script "Miniconda3-py311_25.1.1-2-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_25.1.1-2-Linux-x86_64.sh#d8c1645776c0758214e4191c605abe5878002051316bd423f2b14b22d6cb4251" "miniconda" verify_py311 ;; "MacOSX-arm64" ) install_script "Miniconda3-py311_25.1.1-2-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_25.1.1-2-MacOSX-arm64.sh#140b80b4d285bbbcc8616891876ec3613e46acbedb02321b9ddc03ff0784c584" "miniconda" verify_py311 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py311_25.1.1-2-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_25.1.1-2-MacOSX-x86_64.sh#41c4ed1ce9f44049346a7efd8311919f82a8115637eced8796b5d18599f50cae" "miniconda" verify_py311 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.11-25.11.1-1000066400000000000000000000020251517431316200274030ustar00rootroot00000000000000export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py311_25.11.1-1-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_25.11.1-1-Linux-aarch64.sh#ed0c6cc091802bc4d1440260d60d431b263f22d5cb9be5df71e7ff176c8f1cd8" "miniconda" verify_py311 ;; "Linux-x86_64" ) install_script "Miniconda3-py311_25.11.1-1-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_25.11.1-1-Linux-x86_64.sh#cf5fe14f1be074b82908f188ff759b61ddf87ed15a766f8641182ebf190832b4" "miniconda" verify_py311 ;; "MacOSX-arm64" ) install_script "Miniconda3-py311_25.11.1-1-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_25.11.1-1-MacOSX-arm64.sh#5d76efda2d459389e35d5406494230bb78635bdb99500bda7d7eb3c4e3742f1c" "miniconda" verify_py311 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.11-25.3.1-1000066400000000000000000000024141517431316200273260ustar00rootroot00000000000000export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py311_25.3.1-1-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_25.3.1-1-Linux-aarch64.sh#8d2470bdbee7e93d9b4972a3272b63673ba62113282378f98f23b423cc61ef59" "miniconda" verify_py311 ;; "Linux-x86_64" ) install_script "Miniconda3-py311_25.3.1-1-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_25.3.1-1-Linux-x86_64.sh#6239d42dacc169e290ac37516b2eb6751763edbd977b237e9688884c7b4ea706" "miniconda" verify_py311 ;; "MacOSX-arm64" ) install_script "Miniconda3-py311_25.3.1-1-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_25.3.1-1-MacOSX-arm64.sh#dc08b8f6fb2acb4f1c8b076a59226e29acf0a9dbeb7b5f643a8c19eb0d14a294" "miniconda" verify_py311 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py311_25.3.1-1-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_25.3.1-1-MacOSX-x86_64.sh#2494921f81db2c9b72e26e4aced35d5c58ea2a61ce040efd77ed2957ba4d8d3f" "miniconda" verify_py311 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.11-25.5.1-0000066400000000000000000000024141517431316200273270ustar00rootroot00000000000000export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py311_25.5.1-0-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_25.5.1-0-Linux-aarch64.sh#3862c5ecba0949c3bdbeeb7d072664215924fbccb25f0d3f33782362c5405e22" "miniconda" verify_py311 ;; "Linux-x86_64" ) install_script "Miniconda3-py311_25.5.1-0-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_25.5.1-0-Linux-x86_64.sh#a921abd74e16f5dee8a4d79b124635fac9b939c465ba2e942ea61b3fcd1451d8" "miniconda" verify_py311 ;; "MacOSX-arm64" ) install_script "Miniconda3-py311_25.5.1-0-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_25.5.1-0-MacOSX-arm64.sh#23a6d150c1fc7426147f9458c20ec73fa97aa369e19152997b7206f23b983d66" "miniconda" verify_py311 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py311_25.5.1-0-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_25.5.1-0-MacOSX-x86_64.sh#cc23ad95d62e1d3c5754c2ead09f2c56bfe1112b38b69a4edc140a0a2c8d5300" "miniconda" verify_py311 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.11-25.5.1-1000066400000000000000000000024141517431316200273300ustar00rootroot00000000000000export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py311_25.5.1-1-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_25.5.1-1-Linux-aarch64.sh#39a6d853df41b74aabe37dd666732f7556f81584af789693d7e3005d7a04c64f" "miniconda" verify_py311 ;; "Linux-x86_64" ) install_script "Miniconda3-py311_25.5.1-1-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_25.5.1-1-Linux-x86_64.sh#94b4cb34b583ce549fb17e3b5e93b6e4adfd4605cf0aa4d5f00bd06f620182e2" "miniconda" verify_py311 ;; "MacOSX-arm64" ) install_script "Miniconda3-py311_25.5.1-1-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_25.5.1-1-MacOSX-arm64.sh#73b8ef14c88fa2bf9b74c70f7a888a0a19941a67929e4879850a67c948d4ac58" "miniconda" verify_py311 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py311_25.5.1-1-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_25.5.1-1-MacOSX-x86_64.sh#1060cbd0001c12c3e89bf39413c430cc481a894f065923a03e599c8426020229" "miniconda" verify_py311 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.11-25.7.0-2000066400000000000000000000024141517431316200273320ustar00rootroot00000000000000export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py311_25.7.0-2-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_25.7.0-2-Linux-aarch64.sh#28ca561ec2d9a1ae72fbf3f833b8918c747ce21f57d79e218e47bf7d4d2ce792" "miniconda" verify_py311 ;; "Linux-x86_64" ) install_script "Miniconda3-py311_25.7.0-2-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_25.7.0-2-Linux-x86_64.sh#e072c062a7e017732c97963ef0d9a1cb474b92b7f25c8a032f9632cfe75add4f" "miniconda" verify_py311 ;; "MacOSX-arm64" ) install_script "Miniconda3-py311_25.7.0-2-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_25.7.0-2-MacOSX-arm64.sh#c5edc119ec1bf31d3be6e088ea7c66314561ed21ccffd72e3484586e27aa7719" "miniconda" verify_py311 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py311_25.7.0-2-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_25.7.0-2-MacOSX-x86_64.sh#c05bab0c09ed67ed536c827ae39600d16217d559dcdad8820a04f32473276963" "miniconda" verify_py311 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.11-25.9.1-1000066400000000000000000000020171517431316200273330ustar00rootroot00000000000000export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py311_25.9.1-1-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_25.9.1-1-Linux-aarch64.sh#4e0723b9d76aa491cf22511dac36f4fdec373e41d2a243ff875e19b8df39bf94" "miniconda" verify_py311 ;; "Linux-x86_64" ) install_script "Miniconda3-py311_25.9.1-1-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_25.9.1-1-Linux-x86_64.sh#238abad23f8d4d8ba89dd05df0b0079e278909a36e06955f12bbef4aa94e6131" "miniconda" verify_py311 ;; "MacOSX-arm64" ) install_script "Miniconda3-py311_25.9.1-1-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_25.9.1-1-MacOSX-arm64.sh#5d5f58477f40d23e491394a7114a318724f1f9161e2b8bd08c5845c47b036b72" "miniconda" verify_py311 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.11-25.9.1-3000066400000000000000000000020171517431316200273350ustar00rootroot00000000000000export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py311_25.9.1-3-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_25.9.1-3-Linux-aarch64.sh#92a4df72178d87626072b39aca8fa4721f29d192ed0d70e268586f63b41f7657" "miniconda" verify_py311 ;; "Linux-x86_64" ) install_script "Miniconda3-py311_25.9.1-3-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_25.9.1-3-Linux-x86_64.sh#e331037f492848e68764b0c430912b2417b977d654706009ac8eb475e03ae0a2" "miniconda" verify_py311 ;; "MacOSX-arm64" ) install_script "Miniconda3-py311_25.9.1-3-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_25.9.1-3-MacOSX-arm64.sh#6d92abcee72a7aa4de3694f718fbb523f261efdb5027c7448907b9cfd6507e89" "miniconda" verify_py311 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.11-26.1.1-1000066400000000000000000000020171517431316200273240ustar00rootroot00000000000000export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py311_26.1.1-1-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_26.1.1-1-Linux-aarch64.sh#1726ea55308160a32e82d90a6f4914caa46f58fe157442224f2faf92fdef1e0e" "miniconda" verify_py311 ;; "Linux-x86_64" ) install_script "Miniconda3-py311_26.1.1-1-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_26.1.1-1-Linux-x86_64.sh#52d1f19154b0716d7dc0872f0d858702640da08a4e53fd0035ba988608203d6b" "miniconda" verify_py311 ;; "MacOSX-arm64" ) install_script "Miniconda3-py311_26.1.1-1-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_26.1.1-1-MacOSX-arm64.sh#720266b29d46b8da1b466342aa02d7d04683670bf2bf53576cc70d89253f60ca" "miniconda" verify_py311 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.12-24.1.2-0000066400000000000000000000027311517431316200273260ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py312_24.1.2-0-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.1.2-0-Linux-aarch64.sh#942a057a52ec99f0fca4f413b87b332f6e61fad95c05fa7cabc003ae0b4471de" "miniconda" verify_py312 ;; "Linux-s390x" ) install_script "Miniconda3-py312_24.1.2-0-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.1.2-0-Linux-s390x.sh#7ee6a3c41a825eca3b1c9e3c7155c67f7c26e31a75d7dc4f78f75a4c438e3009" "miniconda" verify_py312 ;; "Linux-x86_64" ) install_script "Miniconda3-py312_24.1.2-0-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.1.2-0-Linux-x86_64.sh#b978856ec3c826eb495b60e3fffe621f670c101150ebcbdeede4f961f22dc438" "miniconda" verify_py312 ;; "MacOSX-arm64" ) install_script "Miniconda3-py312_24.1.2-0-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.1.2-0-MacOSX-arm64.sh#1c277b1ec046fd1b628390994e3fa3dbac0e364f44cd98b915daaa67a326c66a" "miniconda" verify_py312 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py312_24.1.2-0-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.1.2-0-MacOSX-x86_64.sh#bc45a2ceea9341579532847cc9f29a9769d60f12e306bba7f0de6ad5acdd73e9" "miniconda" verify_py312 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.12-24.11.1-0000066400000000000000000000027621517431316200274120ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py312_24.11.1-0-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.11.1-0-Linux-aarch64.sh#9180a2f1fab799fd76e9ef914643269dcf5bad9d455623b905b87f5d39ae140f" "miniconda" verify_py312 ;; "Linux-s390x" ) install_script "Miniconda3-py312_24.11.1-0-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.11.1-0-Linux-s390x.sh#105bce6b0137f574147b8fdfd5e3a7d6c92f3ea9fbf3e0de61331ea43586e9af" "miniconda" verify_py312 ;; "Linux-x86_64" ) install_script "Miniconda3-py312_24.11.1-0-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.11.1-0-Linux-x86_64.sh#636b209b00b6673471f846581829d4b96b9c3378679925a59a584257c3fef5a3" "miniconda" verify_py312 ;; "MacOSX-arm64" ) install_script "Miniconda3-py312_24.11.1-0-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.11.1-0-MacOSX-arm64.sh#9d5c5782d24a09075e45f131693d24907d8c45a4e6205c51d4d3a81b72dc5ad7" "miniconda" verify_py312 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py312_24.11.1-0-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.11.1-0-MacOSX-x86_64.sh#71419eaf7f0bc016c41e8e27815609e76f2d6bcfc39426c19ca5e5cf7a2ea36f" "miniconda" verify_py312 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.12-24.3.0-0000066400000000000000000000027311517431316200273260ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py312_24.3.0-0-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.3.0-0-Linux-aarch64.sh#05f70cbc89b6caf84e22db836f7696a16b617992eb23d6102acf7651eb132365" "miniconda" verify_py312 ;; "Linux-s390x" ) install_script "Miniconda3-py312_24.3.0-0-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.3.0-0-Linux-s390x.sh#b601cb8e3ea65a4ed1aecd96d4f3d14aca5b590b2e1ab0ec5c04c825f5c5e439" "miniconda" verify_py312 ;; "Linux-x86_64" ) install_script "Miniconda3-py312_24.3.0-0-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.3.0-0-Linux-x86_64.sh#96a44849ff17e960eeb8877ecd9055246381c4d4f2d031263b63fa7e2e930af1" "miniconda" verify_py312 ;; "MacOSX-arm64" ) install_script "Miniconda3-py312_24.3.0-0-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.3.0-0-MacOSX-arm64.sh#72d4e9198a6884c0bd86cce2b4a3e8abb05415776e3b142c4b1de625bbaf4c50" "miniconda" verify_py312 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py312_24.3.0-0-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.3.0-0-MacOSX-x86_64.sh#fd71a4bf03fbb21d4b4d25245f17bef6308dfec478e901a60594dfa02e4605eb" "miniconda" verify_py312 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.12-24.4.0-0000066400000000000000000000027501517431316200273300ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py312_24.4.0-0-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.4.0-0-Linux-aarch64.sh#832d48e11e444c1a25f320fccdd0f0fabefec63c1cd801e606836e1c9c76ad51" "miniconda" verify_py312 ;; "Linux-s390x" ) install_script "Miniconda3-py312_24.4.0-0-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.4.0-0-Linux-s390x.sh#e973f1b6352d58b1ab35f30424f1565d7ffa469dcde2d52c86ec1c117db11aad" "miniconda" verify_py312 ;; "Linux-x86_64" ) install_script "Miniconda3-py312_24.4.0-0-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.4.0-0-Linux-x86_64.sh#b6597785e6b071f1ca69cf7be6d0161015b96340b9a9e132215d5713408c3a7c" "miniconda" verify_py312 ;; "MacOSX-arm64" ) install_script "Miniconda3-py312_24.4.0-0-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.4.0-0-MacOSX-arm64.sh#f4925c0150d232d95de798a64c696f4b2df2745bb997b793506bdfd27bf91e11" "miniconda" verify_py312 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py312_24.4.0-0-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.4.0-0-MacOSX-x86_64.sh#1413369470adb7cf52f8b961e81b3ceeb92f5931a451bef9cb0c42be0ce17ef3" "miniconda" verify_py312 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.12-24.5.0-0000066400000000000000000000027501517431316200273310ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py312_24.5.0-0-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.5.0-0-Linux-aarch64.sh#70afe954cc8ee91f605f9aa48985bfe01ecfc10751339e8245eac7262b01298d" "miniconda" verify_py312 ;; "Linux-s390x" ) install_script "Miniconda3-py312_24.5.0-0-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.5.0-0-Linux-s390x.sh#bd2a0a8ea34c84c860868d5b8efde07afc51cdede76b64dd94e9c3fd2d65257e" "miniconda" verify_py312 ;; "Linux-x86_64" ) install_script "Miniconda3-py312_24.5.0-0-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.5.0-0-Linux-x86_64.sh#4b3b3b1b99215e85fd73fb2c2d7ebf318ac942a457072de62d885056556eb83e" "miniconda" verify_py312 ;; "MacOSX-arm64" ) install_script "Miniconda3-py312_24.5.0-0-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.5.0-0-MacOSX-arm64.sh#12e678b8156aea69a132568b6176a019c7a1ba753ddf5caedf086d3c5460fe92" "miniconda" verify_py312 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py312_24.5.0-0-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.5.0-0-MacOSX-x86_64.sh#b1c87c8334ea878d30a9976c1860b1004e6d55bdec5228089fec40be81156363" "miniconda" verify_py312 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.12-24.7.1-0000066400000000000000000000027501517431316200273340ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py312_24.7.1-0-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.7.1-0-Linux-aarch64.sh#bdace1e233cda30ce37105de627e646ae8e04b036373eacfcd7fa8e35949f1b7" "miniconda" verify_py312 ;; "Linux-s390x" ) install_script "Miniconda3-py312_24.7.1-0-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.7.1-0-Linux-s390x.sh#5a454c59314f63a0b860e2ed27d68f4a2516c77a7beda919fc11d3cd03c6b2d2" "miniconda" verify_py312 ;; "Linux-x86_64" ) install_script "Miniconda3-py312_24.7.1-0-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.7.1-0-Linux-x86_64.sh#33442cd3813df33dcbb4a932b938ee95398be98344dff4c30f7e757cd2110e4f" "miniconda" verify_py312 ;; "MacOSX-arm64" ) install_script "Miniconda3-py312_24.7.1-0-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.7.1-0-MacOSX-arm64.sh#e7ef5a899f9383d14d5b15aef61d54a8cd9bf3c4de18a372af0455d8f5f78cd2" "miniconda" verify_py312 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py312_24.7.1-0-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.7.1-0-MacOSX-x86_64.sh#5cfb85d81d94dfe3ef3265f2247aef32a35aeb450ea71c3a204cefed384fb87d" "miniconda" verify_py312 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.12-24.9.2-0000066400000000000000000000027501517431316200273370ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py312_24.9.2-0-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.9.2-0-Linux-aarch64.sh#86b8df7481646cf87e77873e9789adb7569b58248d3aa629eb2da35e6f2e2eed" "miniconda" verify_py312 ;; "Linux-s390x" ) install_script "Miniconda3-py312_24.9.2-0-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.9.2-0-Linux-s390x.sh#876db345b31db6d2b96ab1e2aedfbcea8af6b951a3218e6fd36f657452d1305c" "miniconda" verify_py312 ;; "Linux-x86_64" ) install_script "Miniconda3-py312_24.9.2-0-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.9.2-0-Linux-x86_64.sh#8d936ba600300e08eca3d874dee88c61c6f39303597b2b66baee54af4f7b4122" "miniconda" verify_py312 ;; "MacOSX-arm64" ) install_script "Miniconda3-py312_24.9.2-0-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.9.2-0-MacOSX-arm64.sh#08d8a82ed21d2dae707554d540b172fe03327347db747644fbb33abfaf07fddd" "miniconda" verify_py312 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py312_24.9.2-0-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.9.2-0-MacOSX-x86_64.sh#ce3b440c32c9c636bbe529477fd496798c35b96d9db1838e3df6b0a80714da4e" "miniconda" verify_py312 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.12-25.1.1-0000066400000000000000000000030031517431316200273170ustar00rootroot00000000000000export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py312_25.1.1-0-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_25.1.1-0-Linux-aarch64.sh#ae9d3ea83df97e78fd51c452d0bc75005a28d504c22db6f1000822293f916b54" "miniconda" verify_py312 ;; "Linux-s390x" ) install_script "Miniconda3-py312_25.1.1-0-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py312_25.1.1-0-Linux-s390x.sh#fa0b443ea73c71abd29eb51212c7b032d5089cbb2761aa07f91668b903a2a575" "miniconda" verify_py312 ;; "Linux-x86_64" ) install_script "Miniconda3-py312_25.1.1-0-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_25.1.1-0-Linux-x86_64.sh#832de27a5a35b7963f0d83466abada3eb138e51985255f190e0dc350427a9dd1" "miniconda" verify_py312 ;; "MacOSX-arm64" ) install_script "Miniconda3-py312_25.1.1-0-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_25.1.1-0-MacOSX-arm64.sh#24821d2c87598ae0f8e697e612cdf41d0dbc9ae563cae8aacd878d50d1a86e1e" "miniconda" verify_py312 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py312_25.1.1-0-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_25.1.1-0-MacOSX-x86_64.sh#65f91c564abced759ce7fca099239b7ed4ae9835cb4b64a11923cd3b5f57f5f1" "miniconda" verify_py312 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.12-25.1.1-1000066400000000000000000000030031517431316200273200ustar00rootroot00000000000000export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py312_25.1.1-1-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_25.1.1-1-Linux-aarch64.sh#c8a2112c5ed07196a0e7cf0682ff39c9a28eac5862df49659af7d4f6906efa70" "miniconda" verify_py312 ;; "Linux-s390x" ) install_script "Miniconda3-py312_25.1.1-1-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py312_25.1.1-1-Linux-s390x.sh#f644f5c18985078e6cd1af9c517f9634dbb3199a86f75eb90a9fb303289ebf0b" "miniconda" verify_py312 ;; "Linux-x86_64" ) install_script "Miniconda3-py312_25.1.1-1-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_25.1.1-1-Linux-x86_64.sh#2cc524b9b47b268e1a3ecca1f7f3c1bb4142f42a10001c88fb69c6664ca8a9a6" "miniconda" verify_py312 ;; "MacOSX-arm64" ) install_script "Miniconda3-py312_25.1.1-1-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_25.1.1-1-MacOSX-arm64.sh#c8f316330308f712b94dd7ac2a6048f87d6b364c3354f4e619ed4aef6d99dfad" "miniconda" verify_py312 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py312_25.1.1-1-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_25.1.1-1-MacOSX-x86_64.sh#29fce1ea800ff167e2f44d5a0dbd33124384b33520fd481378908e94de68b1a1" "miniconda" verify_py312 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.12-25.1.1-2000066400000000000000000000030031517431316200273210ustar00rootroot00000000000000export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py312_25.1.1-2-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_25.1.1-2-Linux-aarch64.sh#6d05b9f9b7f327b90797a4cf56d68c81578bab2f63257a3e7a8b72cb0f0e4b5d" "miniconda" verify_py312 ;; "Linux-s390x" ) install_script "Miniconda3-py312_25.1.1-2-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py312_25.1.1-2-Linux-s390x.sh#55c681937c27e13a8ed818d1fec182e623e0308fffc1b10605896dac15f90077" "miniconda" verify_py312 ;; "Linux-x86_64" ) install_script "Miniconda3-py312_25.1.1-2-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_25.1.1-2-Linux-x86_64.sh#4766d85b5f7d235ce250e998ebb5a8a8210cbd4f2b0fea4d2177b3ed9ea87884" "miniconda" verify_py312 ;; "MacOSX-arm64" ) install_script "Miniconda3-py312_25.1.1-2-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_25.1.1-2-MacOSX-arm64.sh#16e7eea739d470d0c3451e9bb779bbfa169b98cfb283d2d6508945e0c6b36ada" "miniconda" verify_py312 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py312_25.1.1-2-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_25.1.1-2-MacOSX-x86_64.sh#0df9f4b7d063a78d18fd02af2b0a97121879af00b535ea79ee23d68d1005e6f8" "miniconda" verify_py312 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.12-25.11.1-1000066400000000000000000000020251517431316200274040ustar00rootroot00000000000000export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py312_25.11.1-1-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_25.11.1-1-Linux-aarch64.sh#f51aa82c395a2c5854c28ef8b7a24e252d5daca4a7a054ec8d9d6847d1d84518" "miniconda" verify_py312 ;; "Linux-x86_64" ) install_script "Miniconda3-py312_25.11.1-1-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_25.11.1-1-Linux-x86_64.sh#498ddb7c091002e4fd76e3496d91d2d915b183d1d850bef6e060fd45e2523213" "miniconda" verify_py312 ;; "MacOSX-arm64" ) install_script "Miniconda3-py312_25.11.1-1-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_25.11.1-1-MacOSX-arm64.sh#febaaeddd0deff2d3b034f7ef99efcab7169549d9be4175e1870170d59377a58" "miniconda" verify_py312 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.12-25.3.1-1000066400000000000000000000024141517431316200273270ustar00rootroot00000000000000export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py312_25.3.1-1-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_25.3.1-1-Linux-aarch64.sh#4b8078ef311bad880b2497c098d734cd0e7316410a4f4fa1a8dbf6ab9ade98ea" "miniconda" verify_py312 ;; "Linux-x86_64" ) install_script "Miniconda3-py312_25.3.1-1-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_25.3.1-1-Linux-x86_64.sh#8937a2c9a86cfc5495ba2234476f89686beff5c8e0569b1ed5771a927c75107b" "miniconda" verify_py312 ;; "MacOSX-arm64" ) install_script "Miniconda3-py312_25.3.1-1-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_25.3.1-1-MacOSX-arm64.sh#a0986857f44b8e22eaa65965d462921cf22c0624fef0fb9ad005811e43152ab8" "miniconda" verify_py312 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py312_25.3.1-1-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_25.3.1-1-MacOSX-x86_64.sh#ef6583760e507a08006618c4c425075989a7c9b990ec463538bd95e329ac07f8" "miniconda" verify_py312 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.12-25.5.1-0000066400000000000000000000024141517431316200273300ustar00rootroot00000000000000export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py312_25.5.1-0-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_25.5.1-0-Linux-aarch64.sh#9bd5765f163568f4ac85b8189aa2b260d1febb1080d085bb2535a3cae2d7f0e4" "miniconda" verify_py312 ;; "Linux-x86_64" ) install_script "Miniconda3-py312_25.5.1-0-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_25.5.1-0-Linux-x86_64.sh#b99e5bcdf8cd2df9ffd11019eac8a20cf84598267941500935d62e14a0e2a6f6" "miniconda" verify_py312 ;; "MacOSX-arm64" ) install_script "Miniconda3-py312_25.5.1-0-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_25.5.1-0-MacOSX-arm64.sh#016845b69dc9476cc3aa950b6577c9d596aae705258ee30b3261b4d258033426" "miniconda" verify_py312 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py312_25.5.1-0-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_25.5.1-0-MacOSX-x86_64.sh#bf9f441d20e6af3f6035e07e892e245161a4dc4962cae3346ef77c75a62b033d" "miniconda" verify_py312 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.12-25.5.1-1000066400000000000000000000024141517431316200273310ustar00rootroot00000000000000export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py312_25.5.1-1-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_25.5.1-1-Linux-aarch64.sh#b007c6307c9a2081b8abfa0ff16caf0117226a7a9485031853fea125795de7ca" "miniconda" verify_py312 ;; "Linux-x86_64" ) install_script "Miniconda3-py312_25.5.1-1-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_25.5.1-1-Linux-x86_64.sh#e3228df32afc6d43cb190a416b91937cdcd1c6308d9fe652274539a07142966f" "miniconda" verify_py312 ;; "MacOSX-arm64" ) install_script "Miniconda3-py312_25.5.1-1-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_25.5.1-1-MacOSX-arm64.sh#b7fef84af2ae88c395e29bde17707b9b33e34a36e431a083f5f38348c75fa89f" "miniconda" verify_py312 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py312_25.5.1-1-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_25.5.1-1-MacOSX-x86_64.sh#f9501093dc8a509179fb7ac6c230ae5c35405fca47d8c95bfa97d9327781727a" "miniconda" verify_py312 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.12-25.7.0-2000066400000000000000000000024141517431316200273330ustar00rootroot00000000000000export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py312_25.7.0-2-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_25.7.0-2-Linux-aarch64.sh#edc03373d75b3a06de594a7f819ad351bd2fa7602854f392107998e62468c783" "miniconda" verify_py312 ;; "Linux-x86_64" ) install_script "Miniconda3-py312_25.7.0-2-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_25.7.0-2-Linux-x86_64.sh#188b5d94ab3acefdeaebd7cb470d2fb74a3280563c77075de6e3e1d58d84ab0a" "miniconda" verify_py312 ;; "MacOSX-arm64" ) install_script "Miniconda3-py312_25.7.0-2-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_25.7.0-2-MacOSX-arm64.sh#8d67e7824088d7aa3bde938a4fc4365bb39ba1f710104cfe7bd9cfb9a99bd8d2" "miniconda" verify_py312 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py312_25.7.0-2-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_25.7.0-2-MacOSX-x86_64.sh#e8f6aed58d708cc544ba6bacbebad86787cb8df56667ff4729ad2fe36af32846" "miniconda" verify_py312 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.12-25.9.1-1000066400000000000000000000020171517431316200273340ustar00rootroot00000000000000export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py312_25.9.1-1-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_25.9.1-1-Linux-aarch64.sh#11ab86931679e6d9b15112f2e866dad1fcbd89a039a6442c0bce7b86fd282f0a" "miniconda" verify_py312 ;; "Linux-x86_64" ) install_script "Miniconda3-py312_25.9.1-1-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_25.9.1-1-Linux-x86_64.sh#a0def9c732d94b156529ef7db8edd6e1862cee784a27a4961870dca86e89fba4" "miniconda" verify_py312 ;; "MacOSX-arm64" ) install_script "Miniconda3-py312_25.9.1-1-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_25.9.1-1-MacOSX-arm64.sh#6bf3d8cac26587f6e53f05cd781f9201d2918c37dc3ef20677b383e250568100" "miniconda" verify_py312 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.12-25.9.1-3000066400000000000000000000020171517431316200273360ustar00rootroot00000000000000export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py312_25.9.1-3-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_25.9.1-3-Linux-aarch64.sh#8c5c1d38011fed8053d7bdaaf7fab372c3f71dbb77791e07692fb8059b7828bd" "miniconda" verify_py312 ;; "Linux-x86_64" ) install_script "Miniconda3-py312_25.9.1-3-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_25.9.1-3-Linux-x86_64.sh#07fc00c146a481f7ae2657a31eb7ec0d5d77a107b981d58ab5d7cd8bc99be778" "miniconda" verify_py312 ;; "MacOSX-arm64" ) install_script "Miniconda3-py312_25.9.1-3-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_25.9.1-3-MacOSX-arm64.sh#67108a40cca0ae1a59b74672341d94ed6641430e10371616426c31c2014e19b9" "miniconda" verify_py312 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.12-26.1.1-1000066400000000000000000000020171517431316200273250ustar00rootroot00000000000000export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py312_26.1.1-1-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_26.1.1-1-Linux-aarch64.sh#0a84d50ec92fbb248e31bff0a5888bf2f4dc322fc979e94ecc6e9946d0324ce7" "miniconda" verify_py312 ;; "Linux-x86_64" ) install_script "Miniconda3-py312_26.1.1-1-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_26.1.1-1-Linux-x86_64.sh#eef1283cdc9d37f55743778ea4567e91aa28c2e3be4adab529dda324c3c897a2" "miniconda" verify_py312 ;; "MacOSX-arm64" ) install_script "Miniconda3-py312_26.1.1-1-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_26.1.1-1-MacOSX-arm64.sh#4a1e3630353121edad84fe79982a99ad8001425e27313c34f7ba9b6cec95d3dd" "miniconda" verify_py312 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.13-25.11.1-1000066400000000000000000000020251517431316200274050ustar00rootroot00000000000000export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py313_25.11.1-1-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py313_25.11.1-1-Linux-aarch64.sh#9f39cc8c46ca37afed5e563cc234b3add34fea2f1119e076dcae7a377ca6b8ee" "miniconda" verify_py313 ;; "Linux-x86_64" ) install_script "Miniconda3-py313_25.11.1-1-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py313_25.11.1-1-Linux-x86_64.sh#e0b10e050e8928e2eb9aad2c522ee3b5d31d30048b8a9997663a8a460d538cef" "miniconda" verify_py313 ;; "MacOSX-arm64" ) install_script "Miniconda3-py313_25.11.1-1-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py313_25.11.1-1-MacOSX-arm64.sh#9f84ad10ea513fb59bb714933bc8dc092bd25fdb03c236868f5d5af3c26a1fd4" "miniconda" verify_py313 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.13-25.3.1-1000066400000000000000000000024141517431316200273300ustar00rootroot00000000000000export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py313_25.3.1-1-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py313_25.3.1-1-Linux-aarch64.sh#4caa0c266ab726b440ccad40a74774167494e001da5de281b74f2d5673e4ace9" "miniconda" verify_py313 ;; "Linux-x86_64" ) install_script "Miniconda3-py313_25.3.1-1-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py313_25.3.1-1-Linux-x86_64.sh#53a86109463cfd70ba7acab396d416e623012914eee004729e1ecd6fe94e8c69" "miniconda" verify_py313 ;; "MacOSX-arm64" ) install_script "Miniconda3-py313_25.3.1-1-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py313_25.3.1-1-MacOSX-arm64.sh#d54b27ed4a6d3c31fedbad6f9f488377702196b0d8d89854e8e7d01f701f225b" "miniconda" verify_py313 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py313_25.3.1-1-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py313_25.3.1-1-MacOSX-x86_64.sh#614c455b74d85abe98c2d0fb9b00628bbf2d48932ea4b49ec05b5c4bee7e9239" "miniconda" verify_py313 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.13-25.5.1-0000066400000000000000000000024141517431316200273310ustar00rootroot00000000000000export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py313_25.5.1-0-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py313_25.5.1-0-Linux-aarch64.sh#368d5250682c12d3e1810e8cf5ce4f08e95ccc56c96dcf559567a6b4f72b203d" "miniconda" verify_py313 ;; "Linux-x86_64" ) install_script "Miniconda3-py313_25.5.1-0-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py313_25.5.1-0-Linux-x86_64.sh#ae15e3f987bdf93edfd6f9dd35b122c34ac72555822f80f5c7c8642595a13197" "miniconda" verify_py313 ;; "MacOSX-arm64" ) install_script "Miniconda3-py313_25.5.1-0-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py313_25.5.1-0-MacOSX-arm64.sh#2559c460b128c0c1c0ce5e9d00fd03160baa7c15ae9f758eaaaab5506d442416" "miniconda" verify_py313 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py313_25.5.1-0-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py313_25.5.1-0-MacOSX-x86_64.sh#8507e1fcea7f744af3c858b8df4666d60ed42d383442fd560fe8f97949249d88" "miniconda" verify_py313 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.13-25.5.1-1000066400000000000000000000024141517431316200273320ustar00rootroot00000000000000export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py313_25.5.1-1-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py313_25.5.1-1-Linux-aarch64.sh#b7d611dcaa638efd700a4a4eb24fbcb9f7b94cc1773d7c655959c330d0b68e16" "miniconda" verify_py313 ;; "Linux-x86_64" ) install_script "Miniconda3-py313_25.5.1-1-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py313_25.5.1-1-Linux-x86_64.sh#612af113b49db0368e2be41ac4d51b7088eebd5f31daeeb89f23fff8f920db58" "miniconda" verify_py313 ;; "MacOSX-arm64" ) install_script "Miniconda3-py313_25.5.1-1-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py313_25.5.1-1-MacOSX-arm64.sh#2ec6f7981770b3396a9ab426e07ac8ef5b12b4393aa2e4bcc984376fe3aa327e" "miniconda" verify_py313 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py313_25.5.1-1-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py313_25.5.1-1-MacOSX-x86_64.sh#4152f260040d452bfe00c67ac6b429aec7ff3b98f62bab8abe4c468e98e51891" "miniconda" verify_py313 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.13-25.7.0-2000066400000000000000000000024141517431316200273340ustar00rootroot00000000000000export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py313_25.7.0-2-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py313_25.7.0-2-Linux-aarch64.sh#350dc95067e0c87bcaa67367e60ea1caae01872adeb945c760bb4a67518d9673" "miniconda" verify_py313 ;; "Linux-x86_64" ) install_script "Miniconda3-py313_25.7.0-2-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py313_25.7.0-2-Linux-x86_64.sh#dda3629462ba1cfa72eb74535214c2e315c77f1cfb0f02046537e99f1bf64abc" "miniconda" verify_py313 ;; "MacOSX-arm64" ) install_script "Miniconda3-py313_25.7.0-2-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py313_25.7.0-2-MacOSX-arm64.sh#5c0137ef38c153649da28ca31a420b9c12c94cf636319beb8c925396d797fe62" "miniconda" verify_py313 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py313_25.7.0-2-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py313_25.7.0-2-MacOSX-x86_64.sh#9c88674b1a839eeb4cff006df397a05ea7d896472318fd84b7070278f9653dc6" "miniconda" verify_py313 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.13-25.9.1-1000066400000000000000000000020171517431316200273350ustar00rootroot00000000000000export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py313_25.9.1-1-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py313_25.9.1-1-Linux-aarch64.sh#a0de4562c368a8b5ca4385843f405684c79bea7aa3b75d7513ff99c0c6435d51" "miniconda" verify_py313 ;; "Linux-x86_64" ) install_script "Miniconda3-py313_25.9.1-1-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py313_25.9.1-1-Linux-x86_64.sh#6022714da22986097bbefa13dab3d957257fef04e1c37d1ebd3645b5b99bc9d4" "miniconda" verify_py313 ;; "MacOSX-arm64" ) install_script "Miniconda3-py313_25.9.1-1-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py313_25.9.1-1-MacOSX-arm64.sh#491f35ab841c99225e5680209d5455a2f5278551378781c0dfeaf2586d7ae3df" "miniconda" verify_py313 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.13-25.9.1-3000066400000000000000000000020171517431316200273370ustar00rootroot00000000000000export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py313_25.9.1-3-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py313_25.9.1-3-Linux-aarch64.sh#036053e7e6e5866435bc1a11711b41293e5bf0776bb4aa9a7ea46d01f30eda31" "miniconda" verify_py313 ;; "Linux-x86_64" ) install_script "Miniconda3-py313_25.9.1-3-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py313_25.9.1-3-Linux-x86_64.sh#6bec65fcb0c66596a5058c6767d25d89a537eb83ee84684ec0fa5a4fbfb32647" "miniconda" verify_py313 ;; "MacOSX-arm64" ) install_script "Miniconda3-py313_25.9.1-3-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py313_25.9.1-3-MacOSX-arm64.sh#751b360885e8de7a350e3484542ccbfe7ff3d55cce794255167991dfa7ed79e1" "miniconda" verify_py313 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.13-26.1.1-1000066400000000000000000000020171517431316200273260ustar00rootroot00000000000000export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py313_26.1.1-1-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py313_26.1.1-1-Linux-aarch64.sh#07c82b5aec04d5f0f3e4b246835b6bc85e104821cbcb0a059c7ea80f028503f4" "miniconda" verify_py313 ;; "Linux-x86_64" ) install_script "Miniconda3-py313_26.1.1-1-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py313_26.1.1-1-Linux-x86_64.sh#f6dfb5b59614fd7b2956b240b2575a9d58203ec7f7a99f85128158a0fdc5c1d7" "miniconda" verify_py313 ;; "MacOSX-arm64" ) install_script "Miniconda3-py313_26.1.1-1-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py313_26.1.1-1-MacOSX-arm64.sh#745f97a6553ebdce0bfdaafe00b0d1939784b38cdaadb3378ca7868a51616a65" "miniconda" verify_py313 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.16.0000066400000000000000000000016511517431316200266110ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86" ) install_script "Miniconda3-3.16.0-Linux-x86" "https://repo.continuum.io/miniconda/Miniconda3-3.16.0-Linux-x86.sh#faedb7a75584d48d563f0f9b449cb00bf8d05ddb3e1ede1936bf522f03f0e1e2" "miniconda" verify_py34 ;; "Linux-x86_64" ) install_script "Miniconda3-3.16.0-Linux-x86_64" "https://repo.continuum.io/miniconda/Miniconda3-3.16.0-Linux-x86_64.sh#3becbcdd36761711850cffa11064b87cfe067dbeb4a5eda544dc341af482de87" "miniconda" verify_py34 ;; "MacOSX-x86_64" ) install_script "Miniconda3-3.16.0-MacOSX-x86_64" "https://repo.continuum.io/miniconda/Miniconda3-3.16.0-MacOSX-x86_64.sh#36fe954548a6900249270f9632b76252e247313cc9d551c096d7e1f526a88631" "miniconda" verify_py34 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.18.3000066400000000000000000000016511517431316200266160ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86" ) install_script "Miniconda3-3.18.3-Linux-x86" "https://repo.continuum.io/miniconda/Miniconda3-3.18.3-Linux-x86.sh#7f6b432daacfbe67ac5fd5b3e3bc5bca75642e4e099e967b1353a5b0a828b036" "miniconda" verify_py35 ;; "Linux-x86_64" ) install_script "Miniconda3-3.18.3-Linux-x86_64" "https://repo.continuum.io/miniconda/Miniconda3-3.18.3-Linux-x86_64.sh#6eee19f7ac958578b0da4124f58b09f23422fa6f6b26af8b594a47f08cc61af4" "miniconda" verify_py35 ;; "MacOSX-x86_64" ) install_script "Miniconda3-3.18.3-MacOSX-x86_64" "https://repo.continuum.io/miniconda/Miniconda3-3.18.3-MacOSX-x86_64.sh#b81c9b27eb9a91e3183e51000dbf986bfe91f99acfa1a4e3bc849ddacc7bf934" "miniconda" verify_py35 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.19.0000066400000000000000000000016511517431316200266140ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86" ) install_script "Miniconda3-3.19.0-Linux-x86" "https://repo.continuum.io/miniconda/Miniconda3-3.19.0-Linux-x86.sh#9789463cad35cdb3ee4cda5a9c3767cad21491faacc071fcd60eb38a9f75098e" "miniconda" verify_py35 ;; "Linux-x86_64" ) install_script "Miniconda3-3.19.0-Linux-x86_64" "https://repo.continuum.io/miniconda/Miniconda3-3.19.0-Linux-x86_64.sh#9ea57c0fdf481acf89d816184f969b04bc44dea27b258c4e86b1e3a25ff26aa0" "miniconda" verify_py35 ;; "MacOSX-x86_64" ) install_script "Miniconda3-3.19.0-MacOSX-x86_64" "https://repo.continuum.io/miniconda/Miniconda3-3.19.0-MacOSX-x86_64.sh#40ec9c2726262addd330c24f62853de47430482965f0bb8cba47d8cd995bec29" "miniconda" verify_py35 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.3.0000066400000000000000000000016431517431316200265260ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86" ) install_script "Miniconda3-3.3.0-Linux-x86" "https://repo.continuum.io/miniconda/Miniconda3-3.3.0-Linux-x86.sh#80957b9c4b8d5674e13693cdf6be3e73ff1a109fa26faaefd4f0dbeb11a57295" "miniconda" verify_py33 ;; "Linux-x86_64" ) install_script "Miniconda3-3.3.0-Linux-x86_64" "https://repo.continuum.io/miniconda/Miniconda3-3.3.0-Linux-x86_64.sh#07fbf1b54c7a03a524a34ec0078d4c39499fe7cdf3dce209e686ef5e0433722f" "miniconda" verify_py33 ;; "MacOSX-x86_64" ) install_script "Miniconda3-3.3.0-MacOSX-x86_64" "https://repo.continuum.io/miniconda/Miniconda3-3.3.0-MacOSX-x86_64.sh#131b6a351987caab78410082e81d9cb51db262301cb9b8f09656bc94cddc51e4" "miniconda" verify_py33 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.4.2000066400000000000000000000016431517431316200265310ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86" ) install_script "Miniconda3-3.4.2-Linux-x86" "https://repo.continuum.io/miniconda/Miniconda3-3.4.2-Linux-x86.sh#9629cb8f1d633d1bfff59985fa93493eae3c18590893631bc5c1ae57d880e659" "miniconda" verify_py33 ;; "Linux-x86_64" ) install_script "Miniconda3-3.4.2-Linux-x86_64" "https://repo.continuum.io/miniconda/Miniconda3-3.4.2-Linux-x86_64.sh#ea2eb831c89fedb8cd5e7d1cc4d299726684b8d8ccd0fdf16f039bd316dccf78" "miniconda" verify_py33 ;; "MacOSX-x86_64" ) install_script "Miniconda3-3.4.2-MacOSX-x86_64" "https://repo.continuum.io/miniconda/Miniconda3-3.4.2-MacOSX-x86_64.sh#8dbad17efb24dc04473fef911239a09e9bf4219cdcfef7b9e263f5f129a8f38d" "miniconda" verify_py33 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.7-22.11.1-1000066400000000000000000000027271517431316200273360ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py37_22.11.1-1-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py37_22.11.1-1-Linux-aarch64.sh#ebba2f7e33ce5594c50e6422477106e6bb327310838fbac3db89d2eaebcde943" "miniconda" verify_py37 ;; "Linux-ppc64le" ) install_script "Miniconda3-py37_22.11.1-1-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-py37_22.11.1-1-Linux-ppc64le.sh#dda16ae14992697e3c90b56fe9de819f5f3b1dcb3ac7a31d24ab5736ccd5f129" "miniconda" verify_py37 ;; "Linux-s390x" ) install_script "Miniconda3-py37_22.11.1-1-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py37_22.11.1-1-Linux-s390x.sh#3c71628865164c3f8b461f8e4b2a353ff1367eed61c83b9c3e14fc201608b1a7" "miniconda" verify_py37 ;; "Linux-x86_64" ) install_script "Miniconda3-py37_22.11.1-1-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py37_22.11.1-1-Linux-x86_64.sh#22b14d52265b4e609c6ce78e2f2884b277d976b83b5f9c8a83423e3eba2ccfbe" "miniconda" verify_py37 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py37_22.11.1-1-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py37_22.11.1-1-MacOSX-x86_64.sh#e51d459aae45bb6b86c2716738b778b788785e6e1ea4b2ed244a0fdd754feb19" "miniconda" verify_py37 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.7-23.1.0-1000066400000000000000000000027151517431316200272520ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py37_23.1.0-1-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py37_23.1.0-1-Linux-aarch64.sh#31c1d635fae931b7c0687018cc87e918e8098ed5dd5e76a658e10c57e00ef864" "miniconda" verify_py37 ;; "Linux-ppc64le" ) install_script "Miniconda3-py37_23.1.0-1-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-py37_23.1.0-1-Linux-ppc64le.sh#d2de534bfa46aa34ef0b115a309de7e8a681683af65faf86bcee6a00460f07be" "miniconda" verify_py37 ;; "Linux-s390x" ) install_script "Miniconda3-py37_23.1.0-1-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py37_23.1.0-1-Linux-s390x.sh#72a8fa9aca5abaf99771110746b1345a33d390c9b29a7b4daffe6a2ff00f2366" "miniconda" verify_py37 ;; "Linux-x86_64" ) install_script "Miniconda3-py37_23.1.0-1-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py37_23.1.0-1-Linux-x86_64.sh#fc96109ea96493e31f70abbc5cae58e80634480c0686ab46924549ac41176812" "miniconda" verify_py37 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py37_23.1.0-1-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py37_23.1.0-1-MacOSX-x86_64.sh#bdfb2f01c0a3917bf258daffc65b69bfe07e29753be624aaf9cbda5ba02f43f4" "miniconda" verify_py37 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.7-4.10.1000066400000000000000000000012321517431316200271050ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py37_4.10.1-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py37_4.10.1-Linux-aarch64.sh#bcb84cfe1f5ccf477fa73fc87d2f4125" "miniconda" verify_py37 ;; "Linux-s390x" ) install_script "Miniconda3-py37_4.10.1-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py37_4.10.1-Linux-s390x.sh#0738d7c00290860d60870103c710e4c2" "miniconda" verify_py37 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.7-4.10.3000066400000000000000000000024311517431316200271110ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py37_4.10.3-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py37_4.10.3-Linux-aarch64.sh#19815e497b045246307f9317bcb4fb93" "miniconda" verify_py37 ;; "Linux-ppc64le" ) install_script "Miniconda3-py37_4.10.3-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-py37_4.10.3-Linux-ppc64le.sh#a926bbaf28d59ac1264799e3ca770a44" "miniconda" verify_py37 ;; "Linux-s390x" ) install_script "Miniconda3-py37_4.10.3-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py37_4.10.3-Linux-s390x.sh#a82215f8abf68e44a8666a658ac4cdf9" "miniconda" verify_py37 ;; "Linux-x86_64" ) install_script "Miniconda3-py37_4.10.3-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py37_4.10.3-Linux-x86_64.sh#9f186c1d86c266acc47dbc1603f0e2ed" "miniconda" verify_py37 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py37_4.10.3-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py37_4.10.3-MacOSX-x86_64.sh#b88a2eb66917c55a6bd1973fabaf05b3" "miniconda" verify_py37 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.7-4.11.0000066400000000000000000000024311517431316200271070ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py37_4.11.0-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py37_4.11.0-Linux-aarch64.sh#07e8dfaf467e5432d402a79b11085783" "miniconda" verify_py37 ;; "Linux-ppc64le" ) install_script "Miniconda3-py37_4.11.0-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-py37_4.11.0-Linux-ppc64le.sh#cf7cbccc16bf82365bbf0129f646ff45" "miniconda" verify_py37 ;; "Linux-s390x" ) install_script "Miniconda3-py37_4.11.0-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py37_4.11.0-Linux-s390x.sh#1dc6dbf1951e65217d07cf30887360a8" "miniconda" verify_py37 ;; "Linux-x86_64" ) install_script "Miniconda3-py37_4.11.0-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py37_4.11.0-Linux-x86_64.sh#7675bd23411179956bcc4692f16ef27d" "miniconda" verify_py37 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py37_4.11.0-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py37_4.11.0-MacOSX-x86_64.sh#0dde31d693fbcb4feb1eb4292cba4371" "miniconda" verify_py37 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.7-4.12.0000066400000000000000000000024311517431316200271100ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py37_4.12.0-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py37_4.12.0-Linux-aarch64.sh#dbac5ea2d2a1dfcf864f5ad0ac775647" "miniconda" verify_py37 ;; "Linux-ppc64le" ) install_script "Miniconda3-py37_4.12.0-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-py37_4.12.0-Linux-ppc64le.sh#57a654d3f143db5230d181cad7a938c1" "miniconda" verify_py37 ;; "Linux-s390x" ) install_script "Miniconda3-py37_4.12.0-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py37_4.12.0-Linux-s390x.sh#2f6c9cb12b37dca5d7d29a4b5d04ffdd" "miniconda" verify_py37 ;; "Linux-x86_64" ) install_script "Miniconda3-py37_4.12.0-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py37_4.12.0-Linux-x86_64.sh#770bac2587bc7380198b4f0741115b11" "miniconda" verify_py37 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py37_4.12.0-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py37_4.12.0-MacOSX-x86_64.sh#161c0c4b88410149beb73d1eea6ec937" "miniconda" verify_py37 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.7-4.8.2000066400000000000000000000015551517431316200270450ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-ppc64le" ) install_script "Miniconda3-py37_4.8.2-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-py37_4.8.2-Linux-ppc64le.sh#e50662a93f3f5e56ef2d3fdfaf2f8e91" "miniconda" verify_py37 ;; "Linux-x86_64" ) install_script "Miniconda3-py37_4.8.2-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py37_4.8.2-Linux-x86_64.sh#87e77f097f6ebb5127c77662dfc3165e" "miniconda" verify_py37 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py37_4.8.2-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py37_4.8.2-MacOSX-x86_64.sh#e0320c20ea13d04407424ecf57b70eaf" "miniconda" verify_py37 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.7-4.8.3000066400000000000000000000015551517431316200270460ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-ppc64le" ) install_script "Miniconda3-py37_4.8.3-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-py37_4.8.3-Linux-ppc64le.sh#ae06d853a09764d86e400cd797c2e922" "miniconda" verify_py37 ;; "Linux-x86_64" ) install_script "Miniconda3-py37_4.8.3-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py37_4.8.3-Linux-x86_64.sh#751786b92c00b1aeae3f017b781018df" "miniconda" verify_py37 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py37_4.8.3-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py37_4.8.3-MacOSX-x86_64.sh#d1754f1e192e078b4d207a8b2e5607b0" "miniconda" verify_py37 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.7-4.9.2000066400000000000000000000024171517431316200270440ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py37_4.9.2-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py37_4.9.2-Linux-aarch64.sh#eb76394f962a84fb6af4ed8bf115b904" "miniconda" verify_py37 ;; "Linux-ppc64le" ) install_script "Miniconda3-py37_4.9.2-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-py37_4.9.2-Linux-ppc64le.sh#5bdc8650a2d1b32c8fd6eed9ed61aef5" "miniconda" verify_py37 ;; "Linux-s390x" ) install_script "Miniconda3-py37_4.9.2-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py37_4.9.2-Linux-s390x.sh#aa9207a1111352af948b8932d7823dce" "miniconda" verify_py37 ;; "Linux-x86_64" ) install_script "Miniconda3-py37_4.9.2-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py37_4.9.2-Linux-x86_64.sh#3143b1116f2d466d9325c206b7de88f7" "miniconda" verify_py37 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py37_4.9.2-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py37_4.9.2-MacOSX-x86_64.sh#cfe1b551b169d6386f5f4b7df40cdac4" "miniconda" verify_py37 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.7.0000066400000000000000000000016431517431316200265320ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86" ) install_script "Miniconda3-3.7.0-Linux-x86" "https://repo.continuum.io/miniconda/Miniconda3-3.7.0-Linux-x86.sh#d5143303a8159a5b7388cc1d09aa6d9bc029c2c5f8cb53230a5fcf07d9ee149c" "miniconda" verify_py34 ;; "Linux-x86_64" ) install_script "Miniconda3-3.7.0-Linux-x86_64" "https://repo.continuum.io/miniconda/Miniconda3-3.7.0-Linux-x86_64.sh#dba631db9938216af83ca9793605a73fae8b8e5ef966c15b9e89c09bf405de26" "miniconda" verify_py34 ;; "MacOSX-x86_64" ) install_script "Miniconda3-3.7.0-MacOSX-x86_64" "https://repo.continuum.io/miniconda/Miniconda3-3.7.0-MacOSX-x86_64.sh#fd4df5a944801019ef56a348bdcb483a7fdbf376c98aeacb25a78e5bc9bb4158" "miniconda" verify_py34 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.8-22.11.1-1000066400000000000000000000033201517431316200273250ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py38_22.11.1-1-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_22.11.1-1-Linux-aarch64.sh#ff65684bce7a7ad7abb698ff649195816ee0f47a4f17cb9632a44abf69357ea5" "miniconda" verify_py38 ;; "Linux-ppc64le" ) install_script "Miniconda3-py38_22.11.1-1-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-py38_22.11.1-1-Linux-ppc64le.sh#59fd0901f9fa1ba6b07e734adff4d6c5215e9d7f13ad37f0044af22e9b72194a" "miniconda" verify_py38 ;; "Linux-s390x" ) install_script "Miniconda3-py38_22.11.1-1-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py38_22.11.1-1-Linux-s390x.sh#5bdc6ead307c098b32ba8473b7cbbe87eb80f8eca9adba03f47848bcb34a9b38" "miniconda" verify_py38 ;; "Linux-x86_64" ) install_script "Miniconda3-py38_22.11.1-1-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_22.11.1-1-Linux-x86_64.sh#473e5ecc8e078e9ef89355fbca21f8eefa5f9081544befca99867c7beac3150d" "miniconda" verify_py38 ;; "MacOSX-arm64" ) install_script "Miniconda3-py38_22.11.1-1-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_22.11.1-1-MacOSX-arm64.sh#bf75dbf193db6895c62b2bb963cab2534a8bbdf0ac956f270da8d7a19f4d1b54" "miniconda" verify_py38 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py38_22.11.1-1-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_22.11.1-1-MacOSX-x86_64.sh#6c4cea3c355326f503d15ae97e5126437529a595499e3ce304cd0f247e935da8" "miniconda" verify_py38 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.8-23.1.0-1000066400000000000000000000033041517431316200272460ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py38_23.1.0-1-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.1.0-1-Linux-aarch64.sh#10ea91cc579a64a3a88727119ac3f55839562f55118458b82824b544bc74f90d" "miniconda" verify_py38 ;; "Linux-ppc64le" ) install_script "Miniconda3-py38_23.1.0-1-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.1.0-1-Linux-ppc64le.sh#d89faee2d839c7e8a2c96f3ca60295c08e837c2f134f6bb9e9e21b707babedc2" "miniconda" verify_py38 ;; "Linux-s390x" ) install_script "Miniconda3-py38_23.1.0-1-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.1.0-1-Linux-s390x.sh#3d1e06eddaef0976530c54ed7dda80df62705c16513634e58f7d1c4567227b9e" "miniconda" verify_py38 ;; "Linux-x86_64" ) install_script "Miniconda3-py38_23.1.0-1-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.1.0-1-Linux-x86_64.sh#640b7dceee6fad10cb7e7b54667b2945c4d6f57625d062b2b0952b7f3a908ab7" "miniconda" verify_py38 ;; "MacOSX-arm64" ) install_script "Miniconda3-py38_23.1.0-1-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.1.0-1-MacOSX-arm64.sh#8dfab7797151a31b16c174da9a5bc09529d5859f21e77f0655ea9b18209cc926" "miniconda" verify_py38 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py38_23.1.0-1-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.1.0-1-MacOSX-x86_64.sh#5d789cda38b23245ffed6b88c60b7479d984bbf20e3b70d66cd150f04a9c25c5" "miniconda" verify_py38 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.8-23.10.0-1000066400000000000000000000033421517431316200273300ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py38_23.10.0-1-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.10.0-1-Linux-aarch64.sh#aee297bdefb15cfee9e2cb4c0881f811ce18c1a066ac75b811b21967ccd41acd" "miniconda" verify_py38 ;; "Linux-ppc64le" ) install_script "Miniconda3-py38_23.10.0-1-Linux-ppc64le.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.10.0-1-Linux-ppc64le.sh#1d7ccb2fa31042116b38ec518a63428d9cf87adba8771ffa9f0e3241f6b5a72a" "miniconda" verify_py38 ;; "Linux-s390x" ) install_script "Miniconda3-py38_23.10.0-1-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.10.0-1-Linux-s390x.sh#095bfb828b3155e6a345b7e821010451dfd291e8373b618a3b72a050a1c7a909" "miniconda" verify_py38 ;; "Linux-x86_64" ) install_script "Miniconda3-py38_23.10.0-1-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.10.0-1-Linux-x86_64.sh#6842afb93a64fd4f04daa0f49f4618857d2327ead1366851eb0e49f1ae460f00" "miniconda" verify_py38 ;; "MacOSX-arm64" ) install_script "Miniconda3-py38_23.10.0-1-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.10.0-1-MacOSX-arm64.sh#c5ece9fce0a2f3c68600476e4256146f03511f82f76d05324eedbdc9eb06bed7" "miniconda" verify_py38 ;; "MacOSX-x86_64" ) install_script ""Miniconda3-py38_23.10.0-1-MacOSX-x86_64.sh "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.10.0-1-MacOSX-x86_64.sh#0e6921f44b4278aa178969f59da57ca4ced2a55ef7730c774296f1de1801c561" "miniconda" verify_py38 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.8-23.11.0-1000066400000000000000000000027431517431316200273350ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py38_23.11.0-1-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.11.0-1-Linux-aarch64.sh#3b28bce7689d42c85190e86738f152efc88a7d17cbcd90b4eb8cb92be42e3bff" "miniconda" verify_py38 ;; "Linux-s390x" ) install_script "Miniconda3-py38_23.11.0-1-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.11.0-1-Linux-s390x.sh#38e4050d6b73814071c065d36c41c6fea553fbf973e72e6375b958fcff747b69" "miniconda" verify_py38 ;; "Linux-x86_64" ) install_script "Miniconda3-py38_23.11.0-1-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.11.0-1-Linux-x86_64.sh#ad3cb53ddfbadd190172b864337572206733ae75515fcfb17157cc8f2cb907a5" "miniconda" verify_py38 ;; "MacOSX-arm64" ) install_script "Miniconda3-py38_23.11.0-1-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.11.0-1-MacOSX-arm64.sh#89b1b0428e68fea63af15193237f2efed9a3c80cffa2fc221cca0af2465d3fd2" "miniconda" verify_py38 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py38_23.11.0-1-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.11.0-1-MacOSX-x86_64.sh#5056bea02062a198991a09c8c9c02c39735ad2d26cdbf21863eaa799bcacd8ab" "miniconda" verify_py38 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.8-23.11.0-2000066400000000000000000000027431517431316200273360ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py38_23.11.0-2-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.11.0-2-Linux-aarch64.sh#6e439ae5373d35b78a3f45775fa69f0afddd0c0a9e5e545cd2f75f913a6d143b" "miniconda" verify_py38 ;; "Linux-s390x" ) install_script "Miniconda3-py38_23.11.0-2-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.11.0-2-Linux-s390x.sh#4d53356e80b3be7e90dbcf021d40cd3d7f889cf4d19574c9957ba22f5a9d98f2" "miniconda" verify_py38 ;; "Linux-x86_64" ) install_script "Miniconda3-py38_23.11.0-2-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.11.0-2-Linux-x86_64.sh#cb908ddbd603d789d94076ea4dd3f8517b15866719e007725dca778a8dfab823" "miniconda" verify_py38 ;; "MacOSX-arm64" ) install_script "Miniconda3-py38_23.11.0-2-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.11.0-2-MacOSX-arm64.sh#5b0258717b9c53c90fc9255ef739d766325fc284761b637837e3d378bb12d3e3" "miniconda" verify_py38 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py38_23.11.0-2-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.11.0-2-MacOSX-x86_64.sh#143d79c7018c66ef452a27711090367dc36e0046ae765f514bc2b1c2b4f76746" "miniconda" verify_py38 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.8-23.3.1-0000066400000000000000000000033041517431316200272500ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py38_23.3.1-0-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.3.1-0-Linux-aarch64.sh#ad491ebad6efec7470fe2139c8b407a895cb2c828b3233b97da6e4f22cae0cde" "miniconda" verify_py38 ;; "Linux-ppc64le" ) install_script "Miniconda3-py38_23.3.1-0-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.3.1-0-Linux-ppc64le.sh#8aa819800ba3ec88ad8518a9e4fc71ada8087547300fc53527c4ecc8072a4d50" "miniconda" verify_py38 ;; "Linux-s390x" ) install_script "Miniconda3-py38_23.3.1-0-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.3.1-0-Linux-s390x.sh#e4d83bb9f0900c9128504f7e3c4d3b9e5eaf3b87c4bb5190a3086947e92bd3fa" "miniconda" verify_py38 ;; "Linux-x86_64" ) install_script "Miniconda3-py38_23.3.1-0-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.3.1-0-Linux-x86_64.sh#d1f3a4388c1a6fd065e32870f67abc39eb38f4edd36c4947ec7411e32311bd59" "miniconda" verify_py38 ;; "MacOSX-arm64" ) install_script "Miniconda3-py38_23.3.1-0-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.3.1-0-MacOSX-arm64.sh#e0151c68f6a11a38b29c2f4a775bf6a22187fa2c8ca0f31930d69f2f013c0810" "miniconda" verify_py38 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py38_23.3.1-0-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.3.1-0-MacOSX-x86_64.sh#eb7b2d285f6d3b7c9cde9576c8c647e70b65361426b0e0e069b4ab23ccbb79e2" "miniconda" verify_py38 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.8-23.5.0-3000066400000000000000000000033041517431316200272540ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py38_23.5.0-3-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.5.0-3-Linux-aarch64.sh#853e1c3c24f1c4cc2a1c57b05059740127724a2b346f887e3f0bb92a6cd05fe1" "miniconda" verify_py38 ;; "Linux-ppc64le" ) install_script "Miniconda3-py38_23.5.0-3-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.5.0-3-Linux-ppc64le.sh#5bef0b71b9c9c6a27e534894e913e47e545793a549a8815bb4a66a8c9d793d45" "miniconda" verify_py38 ;; "Linux-s390x" ) install_script "Miniconda3-py38_23.5.0-3-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.5.0-3-Linux-s390x.sh#e0271bc3af023053258cfe01059d53769bbd32dc5542b5c96280d29dcd8568f6" "miniconda" verify_py38 ;; "Linux-x86_64" ) install_script "Miniconda3-py38_23.5.0-3-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.5.0-3-Linux-x86_64.sh#f833ae8ad96db31d4f2a09d12f1b188721c769d60d813d7e6341c19e77bc791f" "miniconda" verify_py38 ;; "MacOSX-arm64" ) install_script "Miniconda3-py38_23.5.0-3-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.5.0-3-MacOSX-arm64.sh#5daf6837136d08a17f039b29993f67207ba90dcc90abe94c6d5a8925f6888076" "miniconda" verify_py38 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py38_23.5.0-3-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.5.0-3-MacOSX-x86_64.sh#54ead65ad1ff77d9cba2512a8765d64e6b7d8ae154e2fc1a6fcb01395b9a8cf3" "miniconda" verify_py38 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.8-23.5.1-0000066400000000000000000000033041517431316200272520ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py38_23.5.1-0-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.5.1-0-Linux-aarch64.sh#dcf57b73c3db9b4ce5ab1407f0573c83241b5041f2c6fd590959a091ca518b4c" "miniconda" verify_py38 ;; "Linux-ppc64le" ) install_script "Miniconda3-py38_23.5.1-0-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.5.1-0-Linux-ppc64le.sh#1c141b28ffe6dee40fc04c0d175da22270b86c63ec67e71798cd15183d10bcf2" "miniconda" verify_py38 ;; "Linux-s390x" ) install_script "Miniconda3-py38_23.5.1-0-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.5.1-0-Linux-s390x.sh#1c7c2188cad19a1a00bf8a5895af8bd67a06f983ea02d34ad3cdb40cb6a86224" "miniconda" verify_py38 ;; "Linux-x86_64" ) install_script "Miniconda3-py38_23.5.1-0-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.5.1-0-Linux-x86_64.sh#05c1284d67d35abcc3a9b814cd124ec351020b9172962bcc166bf2f2ac22ea5e" "miniconda" verify_py38 ;; "MacOSX-arm64" ) install_script "Miniconda3-py38_23.5.1-0-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.5.1-0-MacOSX-arm64.sh#044bc2a3eab865448924bf2aeab069a7a61a174b132c58f6e9a88cf14c5b647c" "miniconda" verify_py38 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py38_23.5.1-0-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.5.1-0-MacOSX-x86_64.sh#ed617d73092e9f0b696f2b55e68126d751040ef6700c2ea38bc913bf18fd8956" "miniconda" verify_py38 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.8-23.5.2-0000066400000000000000000000033041517431316200272530ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py38_23.5.2-0-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.5.2-0-Linux-aarch64.sh#cd39b811ac9a2f9094c4dfff9ec0f7ec811d6ad7ede5ab3f1a31d330ab3a2c55" "miniconda" verify_py38 ;; "Linux-ppc64le" ) install_script "Miniconda3-py38_23.5.2-0-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.5.2-0-Linux-ppc64le.sh#6fc3bf00d4fe0c724fab884d93b981acbc22bb8fc41c144df6d2fc080ff80e25" "miniconda" verify_py38 ;; "Linux-s390x" ) install_script "Miniconda3-py38_23.5.2-0-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.5.2-0-Linux-s390x.sh#b840fd5a8474a3e6831cd50a64eadf73239c6ad7deeebf2c3d3fe366220b2722" "miniconda" verify_py38 ;; "Linux-x86_64" ) install_script "Miniconda3-py38_23.5.2-0-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.5.2-0-Linux-x86_64.sh#e2a4438671e0e42c5bba14cb51de6ce9763938184d6ca2967340bbe972bbe7e6" "miniconda" verify_py38 ;; "MacOSX-arm64" ) install_script "Miniconda3-py38_23.5.2-0-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.5.2-0-MacOSX-arm64.sh#782bd1a401b20b41227a086adae98e270bbc942c3b7621788fb5574a9583142e" "miniconda" verify_py38 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py38_23.5.2-0-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.5.2-0-MacOSX-x86_64.sh#6dc8bfb3b382c31be1755545ae6afc5fbdf8a67726ffdb8a05b917204bd08779" "miniconda" verify_py38 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.8-23.9.0-0000066400000000000000000000033041517431316200272550ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py38_23.9.0-0-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.9.0-0-Linux-aarch64.sh#c59fbb2565812573f39b88425ef48607de70d1feadc522204811555e58bb972c" "miniconda" verify_py38 ;; "Linux-ppc64le" ) install_script "Miniconda3-py38_23.9.0-0-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.9.0-0-Linux-ppc64le.sh#4d1903b396de1c3473a81b2794f0d9792b30b4e9d98ae1c9dcfeef3aba15435b" "miniconda" verify_py38 ;; "Linux-s390x" ) install_script "Miniconda3-py38_23.9.0-0-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.9.0-0-Linux-s390x.sh#57cf786d2c30aed186a14e9319c596579750ef75d1c8c039734492b5e6d6762c" "miniconda" verify_py38 ;; "Linux-x86_64" ) install_script "Miniconda3-py38_23.9.0-0-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.9.0-0-Linux-x86_64.sh#3c684c1c22d3a0e6bd5ab28186fd7b068b5c552f0937ee927ad117f35a5573fc" "miniconda" verify_py38 ;; "MacOSX-arm64" ) install_script "Miniconda3-py38_23.9.0-0-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.9.0-0-MacOSX-arm64.sh#694facc3601da8a93592d6f947818c2064d6854ca1f2a7e5b40b3e2e91e65baa" "miniconda" verify_py38 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py38_23.9.0-0-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.9.0-0-MacOSX-x86_64.sh#6fab242ca8200a1d59e54c5cc1abb89f7519a136da234e2ab77a30fb87c4ce7d" "miniconda" verify_py38 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.8-4.10.1000066400000000000000000000015551517431316200271160ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py38_4.10.1-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_4.10.1-Linux-aarch64.sh#34aba2af867e5411eff7fddd80982aa9" "miniconda" verify_py38 ;; "Linux-s390x" ) install_script "Miniconda3-py38_4.10.1-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py38_4.10.1-Linux-s390x.sh#ff0ed5428dd94a6f5c64c92a59a73165" "miniconda" verify_py38 ;; "MacOSX-arm64" ) install_script "Miniconda3-py38_4.10.1-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_4.10.1-MacOSX-arm64.sh#1bb73c5cd765d135e2b874fc0f08d50c" "miniconda" verify_py38 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.8-4.10.3000066400000000000000000000024311517431316200271120ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py38_4.10.3-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_4.10.3-Linux-aarch64.sh#1b84ae526853a0301d0c04b68b718ea8" "miniconda" verify_py38 ;; "Linux-ppc64le" ) install_script "Miniconda3-py38_4.10.3-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-py38_4.10.3-Linux-ppc64le.sh#12ddb1b94f30f8fc633c3223b0398d2f" "miniconda" verify_py38 ;; "Linux-s390x" ) install_script "Miniconda3-py38_4.10.3-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py38_4.10.3-Linux-s390x.sh#44e34b6ee8a47db8c28834f86ada6d41" "miniconda" verify_py38 ;; "Linux-x86_64" ) install_script "Miniconda3-py38_4.10.3-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_4.10.3-Linux-x86_64.sh#14da4a9a44b337f7ccb8363537f65b9c" "miniconda" verify_py38 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py38_4.10.3-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_4.10.3-MacOSX-x86_64.sh#cb609591c280423e999fc421cdb779d3" "miniconda" verify_py38 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.8-4.11.0000066400000000000000000000027541517431316200271200ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py38_4.11.0-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_4.11.0-Linux-aarch64.sh#18344281ba44bdd1e38c8ae0f05a8758" "miniconda" verify_py38 ;; "Linux-ppc64le" ) install_script "Miniconda3-py38_4.11.0-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-py38_4.11.0-Linux-ppc64le.sh#adec9893a69557f1eaadce56f24f6614" "miniconda" verify_py38 ;; "Linux-s390x" ) install_script "Miniconda3-py38_4.11.0-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py38_4.11.0-Linux-s390x.sh#b337e6834c940774e762cfb420ec7b91" "miniconda" verify_py38 ;; "Linux-x86_64" ) install_script "Miniconda3-py38_4.11.0-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_4.11.0-Linux-x86_64.sh#252d3b0c863333639f99fbc465ee1d61" "miniconda" verify_py38 ;; "MacOSX-arm64" ) install_script "Miniconda3-py38_4.11.0-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_4.11.0-MacOSX-arm64.sh#1075216b8a7458b8fb86f6386dc5a4a9" "miniconda" verify_py38 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py38_4.11.0-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_4.11.0-MacOSX-x86_64.sh#e0ab9762f3d20d23bbff4b804a03cb08" "miniconda" verify_py38 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.8-4.12.0000066400000000000000000000027541517431316200271210ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py38_4.12.0-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_4.12.0-Linux-aarch64.sh#72cb127e8f455b692e3c8a9009b34f7c" "miniconda" verify_py38 ;; "Linux-ppc64le" ) install_script "Miniconda3-py38_4.12.0-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-py38_4.12.0-Linux-ppc64le.sh#2023a9a4008a9e1c4c317f3b1a6a99cd" "miniconda" verify_py38 ;; "Linux-s390x" ) install_script "Miniconda3-py38_4.12.0-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py38_4.12.0-Linux-s390x.sh#f5692dec773b021dea5074b6f6bc3464" "miniconda" verify_py38 ;; "Linux-x86_64" ) install_script "Miniconda3-py38_4.12.0-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_4.12.0-Linux-x86_64.sh#9986028a26f489f99af4398eac966d36" "miniconda" verify_py38 ;; "MacOSX-arm64" ) install_script "Miniconda3-py38_4.12.0-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_4.12.0-MacOSX-arm64.sh#c8796b213b0dee4426e442f6eb059b40" "miniconda" verify_py38 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py38_4.12.0-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_4.12.0-MacOSX-x86_64.sh#215d80a3912d71c2272e37c63340f48a" "miniconda" verify_py38 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.8-4.8.2000066400000000000000000000015551517431316200270460ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-ppc64le" ) install_script "Miniconda3-py38_4.8.2-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-py38_4.8.2-Linux-ppc64le.sh#8dbe9589f7ba6e17428ac57658802eb2" "miniconda" verify_py38 ;; "Linux-x86_64" ) install_script "Miniconda3-py38_4.8.2-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_4.8.2-Linux-x86_64.sh#cbda751e713b5a95f187ae70b509403f" "miniconda" verify_py38 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py38_4.8.2-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_4.8.2-MacOSX-x86_64.sh#589972cf83097c97e70c41813f2fe3a2" "miniconda" verify_py38 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.8-4.8.3000066400000000000000000000015551517431316200270470ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-ppc64le" ) install_script "Miniconda3-py38_4.8.3-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-py38_4.8.3-Linux-ppc64le.sh#a48a5db8c22c47cea7b04af2c3af2a1f" "miniconda" verify_py38 ;; "Linux-x86_64" ) install_script "Miniconda3-py38_4.8.3-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_4.8.3-Linux-x86_64.sh#d63adf39f2c220950a063e0529d4ff74" "miniconda" verify_py38 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py38_4.8.3-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_4.8.3-MacOSX-x86_64.sh#3fe6d972d40ee60f2e8496cf943ad852" "miniconda" verify_py38 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.8-4.9.2000066400000000000000000000024171517431316200270450ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py38_4.9.2-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_4.9.2-Linux-aarch64.sh#2359284ff562247fc2da4b68334ccac7" "miniconda" verify_py38 ;; "Linux-ppc64le" ) install_script "Miniconda3-py38_4.9.2-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-py38_4.9.2-Linux-ppc64le.sh#b05f6c543ce0c593761bbfb4e6548ff6" "miniconda" verify_py38 ;; "Linux-s390x" ) install_script "Miniconda3-py38_4.9.2-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py38_4.9.2-Linux-s390x.sh#29a7a50a29954d26a64e1a651a9e6f83" "miniconda" verify_py38 ;; "Linux-x86_64" ) install_script "Miniconda3-py38_4.9.2-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_4.9.2-Linux-x86_64.sh#122c8c9beb51e124ab32a0fa6426c656" "miniconda" verify_py38 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py38_4.9.2-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_4.9.2-MacOSX-x86_64.sh#cb40e2c1a32dccd6cdd8d5e49977a635" "miniconda" verify_py38 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.8.3000066400000000000000000000016431517431316200265360ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86" ) install_script "Miniconda3-3.8.3-Linux-x86" "https://repo.continuum.io/miniconda/Miniconda3-3.8.3-Linux-x86.sh#2345cf595864ee0a139f6dd1572070442445baace0dec7a4937267169708f929" "miniconda" verify_py34 ;; "Linux-x86_64" ) install_script "Miniconda3-3.8.3-Linux-x86_64" "https://repo.continuum.io/miniconda/Miniconda3-3.8.3-Linux-x86_64.sh#26483a27b56d3567596b866076cb6de75c4b7e376fe359720ec27fca2c05ceec" "miniconda" verify_py34 ;; "MacOSX-x86_64" ) install_script "Miniconda3-3.8.3-MacOSX-x86_64" "https://repo.continuum.io/miniconda/Miniconda3-3.8.3-MacOSX-x86_64.sh#86be2f1d55755670e0a21902584768b69732b31e87af22d1cca856f3d9e5c20d" "miniconda" verify_py34 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.9-22.11.1-1000066400000000000000000000033201517431316200273260ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py39_22.11.1-1-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_22.11.1-1-Linux-aarch64.sh#031b6c52060bb75e930846c0a66baa91db8196f0d97fd32f3822c54db6b7c76a" "miniconda" verify_py39 ;; "Linux-ppc64le" ) install_script "Miniconda3-py39_22.11.1-1-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-py39_22.11.1-1-Linux-ppc64le.sh#16cc2d74644cf838d2761723c01172e0b704674317630480902ef429af29bd0b" "miniconda" verify_py39 ;; "Linux-s390x" ) install_script "Miniconda3-py39_22.11.1-1-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py39_22.11.1-1-Linux-s390x.sh#ed6176aa6b52e22d939ea5c0c38f9f3cf52d2519a5d0dcb414936287893a31f9" "miniconda" verify_py39 ;; "Linux-x86_64" ) install_script "Miniconda3-py39_22.11.1-1-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_22.11.1-1-Linux-x86_64.sh#e685005710679914a909bfb9c52183b3ccc56ad7bb84acc861d596fcbe5d28bb" "miniconda" verify_py39 ;; "MacOSX-arm64" ) install_script "Miniconda3-py39_22.11.1-1-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_22.11.1-1-MacOSX-arm64.sh#eca5e241faea19d4b352aba819f99f42e2336fdbeecb04f5bc89c9ca786ea798" "miniconda" verify_py39 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py39_22.11.1-1-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_22.11.1-1-MacOSX-x86_64.sh#9a537f3a1b472098754c59a30b94822f1e9458405af831172aaa8f8124e9df88" "miniconda" verify_py39 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.9-23.1.0-1000066400000000000000000000033041517431316200272470ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py39_23.1.0-1-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.1.0-1-Linux-aarch64.sh#5e67416a574c49e19dc21d5b9ed586400863a685bc4e34b4d933ea8c7c1ed2da" "miniconda" verify_py39 ;; "Linux-ppc64le" ) install_script "Miniconda3-py39_23.1.0-1-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.1.0-1-Linux-ppc64le.sh#cf5d7cad2b0eb260903b3661ee3fa822eecb25cf3c9b14bc9de10d72963d3d5a" "miniconda" verify_py39 ;; "Linux-s390x" ) install_script "Miniconda3-py39_23.1.0-1-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.1.0-1-Linux-s390x.sh#5159322f15d9e2b22b3cf90fe88b336d84f62189178c872a9288a339d86f5d20" "miniconda" verify_py39 ;; "Linux-x86_64" ) install_script "Miniconda3-py39_23.1.0-1-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.1.0-1-Linux-x86_64.sh#5dc619babc1d19d6688617966251a38d245cb93d69066ccde9a013e1ebb5bf18" "miniconda" verify_py39 ;; "MacOSX-arm64" ) install_script "Miniconda3-py39_23.1.0-1-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.1.0-1-MacOSX-arm64.sh#a7133a703e41ea0b1738196fb03f72b22250327adea94521c9dd6100c304dc63" "miniconda" verify_py39 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py39_23.1.0-1-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.1.0-1-MacOSX-x86_64.sh#d78eaac94f85bacbc704f629bdfbc2cd42a72dc3a4fd383a3bfc80997495320e" "miniconda" verify_py39 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.9-23.10.0-1000066400000000000000000000033421517431316200273310ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py39_23.10.0-1-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.10.0-1-Linux-aarch64.sh#e7558e2a628ce2f40e8ea792763b942ba587b01b33a677d2d22e7372ec50dbb7" "miniconda" verify_py39 ;; "Linux-ppc64le" ) install_script "Miniconda3-py39_23.10.0-1-Linux-ppc64le.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.10.0-1-Linux-ppc64le.sh#cd92b3272d85c94ef54b685d49fbbd9d36c6680e6b518f1806c039ddb34fc754" "miniconda" verify_py39 ;; "Linux-s390x" ) install_script "Miniconda3-py39_23.10.0-1-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.10.0-1-Linux-s390x.sh#1aa4b984316faa9917c0dce8656bf3b32941def86397815adbe124185b7d3cdb" "miniconda" verify_py39 ;; "Linux-x86_64" ) install_script "Miniconda3-py39_23.10.0-1-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.10.0-1-Linux-x86_64.sh#3dbb87a74f80c84ae166a380bf51da8ef75699ce97c234e3e196afa20d1a9319" "miniconda" verify_py39 ;; "MacOSX-arm64" ) install_script "Miniconda3-py39_23.10.0-1-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.10.0-1-MacOSX-arm64.sh#adfac9e92405a6fdb60cc3b39018cb5084d096799be8f82fa88d26dadbe719b6" "miniconda" verify_py39 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py39_23.10.0-1-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.10.0-1-MacOSX-x86_64.sh#6d26cbe11e964bf573c459420154139d922ffa2e5c690c9c1e9bdb84f17f83af" "miniconda" verify_py39 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.9-23.11.0-1000066400000000000000000000027431517431316200273360ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py39_23.11.0-1-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.11.0-1-Linux-aarch64.sh#a8a9c37882209680d9258e57ce5d5ca0e186f0159e703736b9f5122e94864083" "miniconda" verify_py39 ;; "Linux-s390x" ) install_script "Miniconda3-py39_23.11.0-1-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.11.0-1-Linux-s390x.sh#719c653d7e4b724566c2a9fa365f7b6dbb830d279513ae62e02e11144722c1c9" "miniconda" verify_py39 ;; "Linux-x86_64" ) install_script "Miniconda3-py39_23.11.0-1-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.11.0-1-Linux-x86_64.sh#d36c0f778b6b164223a174acafbe8556b841b67e53cb84b3eb24f1956b62121a" "miniconda" verify_py39 ;; "MacOSX-arm64" ) install_script "Miniconda3-py39_23.11.0-1-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.11.0-1-MacOSX-arm64.sh#1f345d26837e505713aa7b9332cc740c7f2319c7208dc6bd7b95b6a251a9b665" "miniconda" verify_py39 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py39_23.11.0-1-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.11.0-1-MacOSX-x86_64.sh#7b05aff168e441ec500e038bb3e252e5b01f3059a74f92fb7f3a7630eb6a6b13" "miniconda" verify_py39 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.9-23.11.0-2000066400000000000000000000027431517431316200273370ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py39_23.11.0-2-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.11.0-2-Linux-aarch64.sh#465f30688bae46f73b8497bb601face6b652092ace0e515c898e2a64f8c0f15f" "miniconda" verify_py39 ;; "Linux-s390x" ) install_script "Miniconda3-py39_23.11.0-2-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.11.0-2-Linux-s390x.sh#ff1de437a3f9110d8d7665c1f6d178bb797150689264bec5d0d8b36604e3823a" "miniconda" verify_py39 ;; "Linux-x86_64" ) install_script "Miniconda3-py39_23.11.0-2-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.11.0-2-Linux-x86_64.sh#b911ff745c55db982078ac51ed4d848da0170f16ba642822a3bc7dd3fc8c61ba" "miniconda" verify_py39 ;; "MacOSX-arm64" ) install_script "Miniconda3-py39_23.11.0-2-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.11.0-2-MacOSX-arm64.sh#0234becafc167a475fbbcd9a59dda0eec288343695ff6b9645b34fcb9f124bb5" "miniconda" verify_py39 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py39_23.11.0-2-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.11.0-2-MacOSX-x86_64.sh#cc22270c81080d50e518f74d36a151fd3727e2cd6fccc4b1fd345f9a852d5762" "miniconda" verify_py39 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.9-23.3.1-0000066400000000000000000000033041517431316200272510ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py39_23.3.1-0-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.3.1-0-Linux-aarch64.sh#e93ccab720b57f821e0d758f54e9aee9bd2f0ea931ebb26b78d866704437a296" "miniconda" verify_py39 ;; "Linux-ppc64le" ) install_script "Miniconda3-py39_23.3.1-0-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.3.1-0-Linux-ppc64le.sh#d2bcef86812863adaf11fcda6df829aa508760cbde4a19174cf0fec03e8498f5" "miniconda" verify_py39 ;; "Linux-s390x" ) install_script "Miniconda3-py39_23.3.1-0-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.3.1-0-Linux-s390x.sh#d0b658566edd239dd50fc28ab1d3a57b8b0da707481b3b18c27d11273c4fdb5a" "miniconda" verify_py39 ;; "Linux-x86_64" ) install_script "Miniconda3-py39_23.3.1-0-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.3.1-0-Linux-x86_64.sh#1564571a6a06a9999a75a6c65d63cb82911fc647e96ba5b729f904bf00c177d3" "miniconda" verify_py39 ;; "MacOSX-arm64" ) install_script "Miniconda3-py39_23.3.1-0-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.3.1-0-MacOSX-arm64.sh#c74474bab188b8b3dcaf0f0ca52f5e0743591dbe171766016023d052acf96502" "miniconda" verify_py39 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py39_23.3.1-0-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.3.1-0-MacOSX-x86_64.sh#54d739715feb0cd5c127865215cc9f50697709d71e9ee7da430576c5a1c8010d" "miniconda" verify_py39 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.9-23.5.0-3000066400000000000000000000033041517431316200272550ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py39_23.5.0-3-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.5.0-3-Linux-aarch64.sh#f77868e96eee904cd137ebe463439258d76281830bb9e2bd330d23aea1ddd31a" "miniconda" verify_py39 ;; "Linux-ppc64le" ) install_script "Miniconda3-py39_23.5.0-3-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.5.0-3-Linux-ppc64le.sh#4bbda8ba3b8d1d26f04a469bbe29b3ef626a8b10b823f64314719e132f7c3696" "miniconda" verify_py39 ;; "Linux-s390x" ) install_script "Miniconda3-py39_23.5.0-3-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.5.0-3-Linux-s390x.sh#7ef72ef1411b028788c81308238b604cba46315cb42e70a2d65511c05440ebca" "miniconda" verify_py39 ;; "Linux-x86_64" ) install_script "Miniconda3-py39_23.5.0-3-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.5.0-3-Linux-x86_64.sh#b7fc320922235ccbaacba7b5a61e34671e75f3a2c7110c63db0c6a9f98ecf8a8" "miniconda" verify_py39 ;; "MacOSX-arm64" ) install_script "Miniconda3-py39_23.5.0-3-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.5.0-3-MacOSX-arm64.sh#d006d99f86850510f9aed1a81e16a4213a4829e7ea6913f0c42054b4b0ac05a7" "miniconda" verify_py39 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py39_23.5.0-3-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.5.0-3-MacOSX-x86_64.sh#86ae780b5c5a32c45bc0f2e146941afea6dd1ca48e8d5e1bf99a83df255a0a78" "miniconda" verify_py39 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.9-23.5.1-0000066400000000000000000000033041517431316200272530ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py39_23.5.1-0-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.5.1-0-Linux-aarch64.sh#ac438ca1a76d78622cc7768d94988e5673983f60f0302941ce05ea4e11e1376e" "miniconda" verify_py39 ;; "Linux-ppc64le" ) install_script "Miniconda3-py39_23.5.1-0-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.5.1-0-Linux-ppc64le.sh#a981947722decf258e4a21f06ab5ddd545c709ba959957121a3e3b89b3dd860a" "miniconda" verify_py39 ;; "Linux-s390x" ) install_script "Miniconda3-py39_23.5.1-0-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.5.1-0-Linux-s390x.sh#b3ea1e4ce80901b70b49d14bc4a008d910410ddd58dead9c4c220834f5aa46c2" "miniconda" verify_py39 ;; "Linux-x86_64" ) install_script "Miniconda3-py39_23.5.1-0-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.5.1-0-Linux-x86_64.sh#960b7aa0294d6d828739ad5542fe1d8b81bb602be401ad00febdf9d29bf37514" "miniconda" verify_py39 ;; "MacOSX-arm64" ) install_script "Miniconda3-py39_23.5.1-0-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.5.1-0-MacOSX-arm64.sh#63aaa53c1f6139d667f8e308a2849632efeb575e6223d075ab8a8c15850478d6" "miniconda" verify_py39 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py39_23.5.1-0-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.5.1-0-MacOSX-x86_64.sh#056b43eb844aac487e5f6e0f748c528a34cd3d38c8409f239a75bf89ffede3b9" "miniconda" verify_py39 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.9-23.5.2-0000066400000000000000000000033041517431316200272540ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py39_23.5.2-0-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.5.2-0-Linux-aarch64.sh#ecc06a39bdf786ebb8325a2754690a808f873154719c97d10087ef0883b69e84" "miniconda" verify_py39 ;; "Linux-ppc64le" ) install_script "Miniconda3-py39_23.5.2-0-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.5.2-0-Linux-ppc64le.sh#dc5aee01ee36a154b8070e6948b9a43773b6942476a144bc89e6135ac5beac58" "miniconda" verify_py39 ;; "Linux-s390x" ) install_script "Miniconda3-py39_23.5.2-0-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.5.2-0-Linux-s390x.sh#40ece8784a9e7dd521ab354ffc816bb466842ae3eee681a93647945c5070c9b4" "miniconda" verify_py39 ;; "Linux-x86_64" ) install_script "Miniconda3-py39_23.5.2-0-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.5.2-0-Linux-x86_64.sh#9829d95f639bd0053b2ed06d1204e60644617bf37dd5cc57523732e0e8d64516" "miniconda" verify_py39 ;; "MacOSX-arm64" ) install_script "Miniconda3-py39_23.5.2-0-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.5.2-0-MacOSX-arm64.sh#1b10164086354b39a46ff928eef5797ff57e0fa9706ccaf7d4e621b416541479" "miniconda" verify_py39 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py39_23.5.2-0-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.5.2-0-MacOSX-x86_64.sh#dcbbdf92dc2954c79002b64ed53d3451e191dbdde0b30c67334f41dc6ca46ac1" "miniconda" verify_py39 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.9-23.9.0-0000066400000000000000000000033041517431316200272560ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py39_23.9.0-0-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.9.0-0-Linux-aarch64.sh#b3ae7a36e3adbe9f9ab152b645d8d20b09bd25b4f0a9be15bfb4d36aafdedd98" "miniconda" verify_py39 ;; "Linux-ppc64le" ) install_script "Miniconda3-py39_23.9.0-0-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.9.0-0-Linux-ppc64le.sh#f7699ab404cbcba918e1977cc54ee8573902835d3272e3d80b5a107f8c5b5b38" "miniconda" verify_py39 ;; "Linux-s390x" ) install_script "Miniconda3-py39_23.9.0-0-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.9.0-0-Linux-s390x.sh#eab9add06fe3b0beb9b54b3ab3fc57b944dc370a3c9342216082f7747d6c74a7" "miniconda" verify_py39 ;; "Linux-x86_64" ) install_script "Miniconda3-py39_23.9.0-0-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.9.0-0-Linux-x86_64.sh#9200a10c762186391c35709382ed7cfa6578a051c9c76ea58f998df62c5afab0" "miniconda" verify_py39 ;; "MacOSX-arm64" ) install_script "Miniconda3-py39_23.9.0-0-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.9.0-0-MacOSX-arm64.sh#3143f830fdff011a3d389fdb53b8021e90b662615a1ed62a0bcad099cef35c26" "miniconda" verify_py39 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py39_23.9.0-0-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.9.0-0-MacOSX-x86_64.sh#763c08ad5bdf159d32e406bd3b03394e1fba6923f1936271ca27c8073f744ac2" "miniconda" verify_py39 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.9-24.1.2-0000066400000000000000000000027171517431316200272600ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py39_24.1.2-0-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.1.2-0-Linux-aarch64.sh#b3e7d8ad4a4c9106594b268ab1cd9494ce982eaf7734bb2cd13a47e14e92a43e" "miniconda" verify_py39 ;; "Linux-s390x" ) install_script "Miniconda3-py39_24.1.2-0-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.1.2-0-Linux-s390x.sh#c1e5b7cee62b465a919b88a9c5658c426c6633f1fbcb568d2cff36a13aef6b97" "miniconda" verify_py39 ;; "Linux-x86_64" ) install_script "Miniconda3-py312_24.1.2-0-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.1.2-0-Linux-x86_64.sh#b978856ec3c826eb495b60e3fffe621f670c101150ebcbdeede4f961f22dc438" "miniconda" verify_py39 ;; "MacOSX-arm64" ) install_script "Miniconda3-py39_24.1.2-0-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.1.2-0-MacOSX-arm64.sh#2a7e44373bdf47caae991ff8d7d275a2ded51ed0e8e457c7edc9ecd45e48cda4" "miniconda" verify_py39 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py39_24.1.2-0-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.1.2-0-MacOSX-x86_64.sh#d4e81df5beaa73dbbb9e1e91065e8f8222e9a9d44a2e7271aedd6e4a5054c541" "miniconda" verify_py39 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.9-24.11.1-0000066400000000000000000000027431517431316200273370ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py39_24.11.1-0-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.11.1-0-Linux-aarch64.sh#35411dc715549d0a95f4814c4f318a3d0addfafc3a25fa7e89e2ba47e8d87b4d" "miniconda" verify_py39 ;; "Linux-s390x" ) install_script "Miniconda3-py39_24.11.1-0-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.11.1-0-Linux-s390x.sh#c130a7064c5c513c42280ec41a5f8c93aaab522ecd6bd0f2138c8c9f78d4f522" "miniconda" verify_py39 ;; "Linux-x86_64" ) install_script "Miniconda3-py39_24.11.1-0-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.11.1-0-Linux-x86_64.sh#3ea8373098d72140e08aac9217822b047ec094eb457e7f73945af7c6f68bf6f5" "miniconda" verify_py39 ;; "MacOSX-arm64" ) install_script "Miniconda3-py39_24.11.1-0-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.11.1-0-MacOSX-arm64.sh#a8a07c4255882de2f132ed2d4cfaa3bdf89370de71ba8cd3914e013f5bffcc68" "miniconda" verify_py39 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py39_24.11.1-0-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.11.1-0-MacOSX-x86_64.sh#5ca59fa5a4835587ba6ea73169a7e55862771cf9b0618d0549b7b484fe1a2e67" "miniconda" verify_py39 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.9-24.3.0-0000066400000000000000000000027121517431316200272530ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py39_24.3.0-0-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.3.0-0-Linux-aarch64.sh#860f532a33501cf0eccc2677048e21db4a12151938d181821af3e5d30e2dc390" "miniconda" verify_py39 ;; "Linux-s390x" ) install_script "Miniconda3-py39_24.3.0-0-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.3.0-0-Linux-s390x.sh#1570e27adba2dcc24b182c21cd4e793ab5719aa5b1f7f8e29c16ec74d6d9a16f" "miniconda" verify_py39 ;; "Linux-x86_64" ) install_script "Miniconda3-py39_24.3.0-0-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.3.0-0-Linux-x86_64.sh#1c3d44e987dc56c7d8954419fa1a078be5ddbc293d8cb98b184a23f9a270faad" "miniconda" verify_py39 ;; "MacOSX-arm64" ) install_script "Miniconda3-py39_24.3.0-0-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.3.0-0-MacOSX-arm64.sh#f091e4e2d7c2521d40c8c2e561c344a401cf9900e4efa122bf1c93fd6ae5cc9c" "miniconda" verify_py39 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py39_24.3.0-0-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.3.0-0-MacOSX-x86_64.sh#ed7cfddd313f3ec568f95abae38b337ebf339cddd378ee2f91c86e5da53374e5" "miniconda" verify_py39 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.9-24.4.0-0000066400000000000000000000027311517431316200272550ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py39_24.4.0-0-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.4.0-0-Linux-aarch64.sh#6f09fd08165a9fdccb2a2c64e9bbcf68ce58a9bfb571600306eb44d29718b13f" "miniconda" verify_py39 ;; "Linux-s390x" ) install_script "Miniconda3-py39_24.4.0-0-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.4.0-0-Linux-s390x.sh#8766e30b038087e7da2bb9a8bca4ca3f2ed621659f0ea8954ffab789f4a8f192" "miniconda" verify_py39 ;; "Linux-x86_64" ) install_script "Miniconda3-py39_24.4.0-0-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.4.0-0-Linux-x86_64.sh#edd7610f2e2b25d15f6ffa81ca94de0748dd107096871459a7966dcf9a564ea9" "miniconda" verify_py39 ;; "MacOSX-arm64" ) install_script "Miniconda3-py39_24.4.0-0-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.4.0-0-MacOSX-arm64.sh#74f3de552d93712cc7c531f690b78d6acad8e3812da43fc3a1acbc5c39243480" "miniconda" verify_py39 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py39_24.4.0-0-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.4.0-0-MacOSX-x86_64.sh#d3ad5e0bf74aa1cb838df2f73e4be4e5d9a0f259a05b5223199ea1f6f6edf9f3" "miniconda" verify_py39 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.9-24.5.0-0000066400000000000000000000027311517431316200272560ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py39_24.5.0-0-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.5.0-0-Linux-aarch64.sh#b716e3bc556e9ab7a4f206b04b53bd57c24e94956598d89fc78863b115cce9e8" "miniconda" verify_py39 ;; "Linux-s390x" ) install_script "Miniconda3-py39_24.5.0-0-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.5.0-0-Linux-s390x.sh#c2d6bec964a96130eb5f1c4ea46993cf10f7957d45ac31d9aa94c34b5ebfed32" "miniconda" verify_py39 ;; "Linux-x86_64" ) install_script "Miniconda3-py39_24.5.0-0-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.5.0-0-Linux-x86_64.sh#07a2435123fd8f41e6528baa5f272ce754fd8acaef08ce7081afb00227b8754a" "miniconda" verify_py39 ;; "MacOSX-arm64" ) install_script "Miniconda3-py39_24.5.0-0-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.5.0-0-MacOSX-arm64.sh#f5f63a0de44b7b0872f3c00dca71b896933ccc844a93bf120aad6df66b6475b3" "miniconda" verify_py39 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py39_24.5.0-0-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.5.0-0-MacOSX-x86_64.sh#b65d7f01820bdfe1abb6b4dd84d48e6c62a6d72ee0cc400a4e8bb4ea89ff1c84" "miniconda" verify_py39 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.9-24.7.1-0000066400000000000000000000027311517431316200272610ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py39_24.7.1-0-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.7.1-0-Linux-aarch64.sh#dc6d508f463b19def014d34b61297df30cc15eeac9cf47eb372634812b6721e6" "miniconda" verify_py39 ;; "Linux-s390x" ) install_script "Miniconda3-py39_24.7.1-0-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.7.1-0-Linux-s390x.sh#31553ed04ff777deefbb76bb194a2212ccf1168f2757f36794a567f58bb94ae1" "miniconda" verify_py39 ;; "Linux-x86_64" ) install_script "Miniconda3-py39_24.7.1-0-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.7.1-0-Linux-x86_64.sh#2006a61abc8b4fd04de5eb92620e1f72bada713cc84b5b4899463095e1210556" "miniconda" verify_py39 ;; "MacOSX-arm64" ) install_script "Miniconda3-py39_24.7.1-0-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.7.1-0-MacOSX-arm64.sh#f50fceaf2d42c898559adae1ee17c22c452824a909370fdec8d4fcf844696f06" "miniconda" verify_py39 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py39_24.7.1-0-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.7.1-0-MacOSX-x86_64.sh#f5035c0595f791a822fbf3bf5b555e8e68fe33437affa3811b125ebd39efbe81" "miniconda" verify_py39 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.9-24.9.2-0000066400000000000000000000027311517431316200272640ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py39_24.9.2-0-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.9.2-0-Linux-aarch64.sh#4607ec9145ad9c0413e6300dab3febe442e265efce486176ef1f8518ba8bfaeb" "miniconda" verify_py39 ;; "Linux-s390x" ) install_script "Miniconda3-py39_24.9.2-0-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.9.2-0-Linux-s390x.sh#5ccde79ed4c333f0e236f36338ed5db111a2fff50859235c4f8fffd2045a6655" "miniconda" verify_py39 ;; "Linux-x86_64" ) install_script "Miniconda3-py39_24.9.2-0-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.9.2-0-Linux-x86_64.sh#4b540d78e5bdd770b39216c0563424ef6656504cbe24c67b2d0454c2eb7afe93" "miniconda" verify_py39 ;; "MacOSX-arm64" ) install_script "Miniconda3-py39_24.9.2-0-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.9.2-0-MacOSX-arm64.sh#4d5abecbb3264def02ad95ed6c888016f95631649b848da552a1066c52bcd1da" "miniconda" verify_py39 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py39_24.9.2-0-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.9.2-0-MacOSX-x86_64.sh#7535da558c8821d967e026288eaec75d9a159ec760d75c869fd10fa58d3986c3" "miniconda" verify_py39 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.9-25.1.1-0000066400000000000000000000027641517431316200272620ustar00rootroot00000000000000export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py39_25.1.1-0-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_25.1.1-0-Linux-aarch64.sh#6813ed27242f8c6a000fcdc0b2bb93253411a22ef110eec915b7d1a4aab3587b" "miniconda" verify_py39 ;; "Linux-s390x" ) install_script "Miniconda3-py39_25.1.1-0-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py39_25.1.1-0-Linux-s390x.sh#8220e1e67cc73a51d90108f5bdf5451aefae0b00d400958ae7d42e21d9a32999" "miniconda" verify_py39 ;; "Linux-x86_64" ) install_script "Miniconda3-py39_25.1.1-0-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_25.1.1-0-Linux-x86_64.sh#13a5870ab5b5c75f23a54eac2ba8dbff38bd4bd33d52aecbc6154ca0ff488e10" "miniconda" verify_py39 ;; "MacOSX-arm64" ) install_script "Miniconda3-py39_25.1.1-0-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_25.1.1-0-MacOSX-arm64.sh#6d60e9a8e0f531e09791f033529a6142ceb39ec7d23f8fc8231d287e39cdb30d" "miniconda" verify_py39 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py39_25.1.1-0-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_25.1.1-0-MacOSX-x86_64.sh#3752cbfae31526e53cae1b2976e183787fc98782c63bbd048853ed8860616051" "miniconda" verify_py39 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.9-25.1.1-1000066400000000000000000000027641517431316200272630ustar00rootroot00000000000000export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py39_25.1.1-1-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_25.1.1-1-Linux-aarch64.sh#ae55c260fd250154627f74d0ede010c99c20741698d7d687b2dfca0aa14ce2d5" "miniconda" verify_py39 ;; "Linux-s390x" ) install_script "Miniconda3-py39_25.1.1-1-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py39_25.1.1-1-Linux-s390x.sh#6957a17c17e86fe43ba3c2e18dcfc1415710410c4a36f7a1c46fbc64aab4fb27" "miniconda" verify_py39 ;; "Linux-x86_64" ) install_script "Miniconda3-py39_25.1.1-1-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_25.1.1-1-Linux-x86_64.sh#c5ec876718798ccd6ce93ce38eb3253ef103244ea6efaa8c978df19047ba916a" "miniconda" verify_py39 ;; "MacOSX-arm64" ) install_script "Miniconda3-py39_25.1.1-1-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_25.1.1-1-MacOSX-arm64.sh#d717fb09b137a048d9b2f6ee9d3e7ef63ab841e35d80cb37f40d20ac949915c2" "miniconda" verify_py39 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py39_25.1.1-1-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_25.1.1-1-MacOSX-x86_64.sh#a01dd65f2463bdec15abc1f796847912c67caaf78ea1c67f038ec02aa8c3adaf" "miniconda" verify_py39 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.9-25.1.1-2000066400000000000000000000027641517431316200272640ustar00rootroot00000000000000export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py39_25.1.1-2-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_25.1.1-2-Linux-aarch64.sh#5afee04df06c923462341cfc87727100a67fa854550d0d7a2e6295005168e6b7" "miniconda" verify_py39 ;; "Linux-s390x" ) install_script "Miniconda3-py39_25.1.1-2-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py39_25.1.1-2-Linux-s390x.sh#94a10a8a43dfd0360ecad9df24ef768db1b776d1a76fc2df1928d76c0bbb5535" "miniconda" verify_py39 ;; "Linux-x86_64" ) install_script "Miniconda3-py39_25.1.1-2-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_25.1.1-2-Linux-x86_64.sh#b40682cedf1e1755c02555f8d3d98aadb4607a68da7caf72a9bbe1fb9ae0b904" "miniconda" verify_py39 ;; "MacOSX-arm64" ) install_script "Miniconda3-py39_25.1.1-2-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_25.1.1-2-MacOSX-arm64.sh#b50b4c46b481d3c9cb4befdbcf18087748d85eee9148c56a35f199940d607933" "miniconda" verify_py39 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py39_25.1.1-2-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_25.1.1-2-MacOSX-x86_64.sh#92109afe5edcc06d3a3c61b0faf1edd3e3e2539eaad637d2711305ccd0065046" "miniconda" verify_py39 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.9-25.3.1-1000066400000000000000000000024001517431316200272500ustar00rootroot00000000000000export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py39_25.3.1-1-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_25.3.1-1-Linux-aarch64.sh#435f9b5640716dd770e9abe404c54db7d3493cb61a814c5de1fe345ea017d4a6" "miniconda" verify_py39 ;; "Linux-x86_64" ) install_script "Miniconda3-py39_25.3.1-1-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_25.3.1-1-Linux-x86_64.sh#2d94390e8858c72f6a28080954fd640ae4449d08d7b9d4ff8c94ad39beaf5f46" "miniconda" verify_py39 ;; "MacOSX-arm64" ) install_script "Miniconda3-py39_25.3.1-1-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_25.3.1-1-MacOSX-arm64.sh#5838abb6f108de3f42aaaf3c3bb0747879b4202f70332e7ffb81dc3fa6b518a4" "miniconda" verify_py39 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py39_25.3.1-1-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_25.3.1-1-MacOSX-x86_64.sh#51e293033a02582295e5795b7ec440ac322251a46894c20bca65dd15399bd447" "miniconda" verify_py39 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.9-25.5.1-0000066400000000000000000000024001517431316200272510ustar00rootroot00000000000000export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py39_25.5.1-0-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_25.5.1-0-Linux-aarch64.sh#e4311fcce812cce6a914e7a82fb1180d278eaa705e40be6789795781d375fe53" "miniconda" verify_py39 ;; "Linux-x86_64" ) install_script "Miniconda3-py39_25.5.1-0-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_25.5.1-0-Linux-x86_64.sh#eac177f8c3bf584c1816aded4a0e2d9201253a4305cd0cbc8c1d4adbe6bde96d" "miniconda" verify_py39 ;; "MacOSX-arm64" ) install_script "Miniconda3-py39_25.5.1-0-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_25.5.1-0-MacOSX-arm64.sh#562d7f0632a9f6ee636c6457b45daa200ca44890d920f6d671dfa44c6150b052" "miniconda" verify_py39 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py39_25.5.1-0-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_25.5.1-0-MacOSX-x86_64.sh#47b52b6c817c5cb41877e24f78d34add775065f8815e5205a9c3d7dada3306c7" "miniconda" verify_py39 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.9-25.5.1-1000066400000000000000000000024001517431316200272520ustar00rootroot00000000000000export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py39_25.5.1-1-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_25.5.1-1-Linux-aarch64.sh#a1078a803928d8f8f1fd29a2bdad6689f19239844ee3beb84372f66f00cbfb19" "miniconda" verify_py39 ;; "Linux-x86_64" ) install_script "Miniconda3-py39_25.5.1-1-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_25.5.1-1-Linux-x86_64.sh#33778762cb69381ce01de7f60bf4350935d3b31169e541fc9fbffbab5712670a" "miniconda" verify_py39 ;; "MacOSX-arm64" ) install_script "Miniconda3-py39_25.5.1-1-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_25.5.1-1-MacOSX-arm64.sh#8c6968889bbebb3df94ce441775c1e7cfecae2fefb3955b09ac3b7b619bf7208" "miniconda" verify_py39 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py39_25.5.1-1-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_25.5.1-1-MacOSX-x86_64.sh#83884da278a084d5d1923613af229aa4c384eebe197b48cb996a4c862d850e7f" "miniconda" verify_py39 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.9-25.7.0-2000066400000000000000000000024001517431316200272540ustar00rootroot00000000000000export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py39_25.7.0-2-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_25.7.0-2-Linux-aarch64.sh#18befc78dbfca5bbdc2c8085f2bedd0345a5fbf7d0f1e189fddaf2d17f31d3af" "miniconda" verify_py39 ;; "Linux-x86_64" ) install_script "Miniconda3-py39_25.7.0-2-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_25.7.0-2-Linux-x86_64.sh#790e8ea347cf49ba250fceacdc0b022237a9150717b9e4c17f2e70abc075c05d" "miniconda" verify_py39 ;; "MacOSX-arm64" ) install_script "Miniconda3-py39_25.7.0-2-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_25.7.0-2-MacOSX-arm64.sh#914254c199cf3584ac918259dda70410d6deba2a6f73b0ec8728010e6afb75b0" "miniconda" verify_py39 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py39_25.7.0-2-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_25.7.0-2-MacOSX-x86_64.sh#dab8685fca4398bc7471cc4fd3fb1afe7ee3b43767bba28d788f9aa9961a702d" "miniconda" verify_py39 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.9-25.9.1-1000066400000000000000000000020061517431316200272600ustar00rootroot00000000000000export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py39_25.9.1-1-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_25.9.1-1-Linux-aarch64.sh#983ef280dec1d0f965b6b6133c585ce902e07136105d4977aa5de3aa027cfa55" "miniconda" verify_py39 ;; "Linux-x86_64" ) install_script "Miniconda3-py39_25.9.1-1-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_25.9.1-1-Linux-x86_64.sh#d8d13344b46a057659397b9ca1a948d184bf59f04efa8864df8c01f7557e2baa" "miniconda" verify_py39 ;; "MacOSX-arm64" ) install_script "Miniconda3-py39_25.9.1-1-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_25.9.1-1-MacOSX-arm64.sh#857f09c2be8feaf3664064a2e324e96656104a9a45ab0a657a49c03754855b77" "miniconda" verify_py39 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.9-25.9.1-3000066400000000000000000000020061517431316200272620ustar00rootroot00000000000000export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py39_25.9.1-3-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_25.9.1-3-Linux-aarch64.sh#2cf395401906b6968cfd2bc5b522ad4dca40374987e790c4daa83f049d132841" "miniconda" verify_py39 ;; "Linux-x86_64" ) install_script "Miniconda3-py39_25.9.1-3-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_25.9.1-3-Linux-x86_64.sh#0ac18f10d17ca918247b4606df82be38eba6e23380a7eddb25b47ef6ccdb920e" "miniconda" verify_py39 ;; "MacOSX-arm64" ) install_script "Miniconda3-py39_25.9.1-3-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_25.9.1-3-MacOSX-arm64.sh#f05dcd060e3915a0a3a9dece324d2eb88268fa251fff2fb63d48e232c5fab510" "miniconda" verify_py39 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.9-4.10.1000066400000000000000000000012321517431316200271070ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py39_4.10.1-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_4.10.1-Linux-aarch64.sh#67fb85a56aa7fda6e2fc5cdeb2aafec0" "miniconda" verify_py39 ;; "Linux-s390x" ) install_script "Miniconda3-py39_4.10.1-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py39_4.10.1-Linux-s390x.sh#089da98e758bbc4a0e784d75340ec5d0" "miniconda" verify_py39 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.9-4.10.3000066400000000000000000000024311517431316200271130ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py39_4.10.3-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_4.10.3-Linux-aarch64.sh#d4e7afa2783cd85532d59d7ccb9ec268" "miniconda" verify_py39 ;; "Linux-ppc64le" ) install_script "Miniconda3-py39_4.10.3-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-py39_4.10.3-Linux-ppc64le.sh#07ea41c691bdcc7d9c71cae1a1a88151" "miniconda" verify_py39 ;; "Linux-s390x" ) install_script "Miniconda3-py39_4.10.3-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py39_4.10.3-Linux-s390x.sh#633ae4c5382ca883f1f38a7d8c472f85" "miniconda" verify_py39 ;; "Linux-x86_64" ) install_script "Miniconda3-py39_4.10.3-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_4.10.3-Linux-x86_64.sh#8c69f65a4ae27fb41df0fe552b4a8a3b" "miniconda" verify_py39 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py39_4.10.3-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_4.10.3-MacOSX-x86_64.sh#09bb30a9204ced74ce3c06762cb442fc" "miniconda" verify_py39 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.9-4.11.0000066400000000000000000000027541517431316200271210ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py39_4.11.0-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_4.11.0-Linux-aarch64.sh#f25b8ff2dbebe0285360ef1b4c883da6" "miniconda" verify_py39 ;; "Linux-ppc64le" ) install_script "Miniconda3-py39_4.11.0-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-py39_4.11.0-Linux-ppc64le.sh#305e55110a3ad9384230e5fe396ccd89" "miniconda" verify_py39 ;; "Linux-s390x" ) install_script "Miniconda3-py39_4.11.0-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py39_4.11.0-Linux-s390x.sh#26e904d1f42bf8cece2b99a698c10a46" "miniconda" verify_py39 ;; "Linux-x86_64" ) install_script "Miniconda3-py39_4.11.0-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_4.11.0-Linux-x86_64.sh#4e2f31e0b2598634c80daa12e4981647" "miniconda" verify_py39 ;; "MacOSX-arm64" ) install_script "Miniconda3-py39_4.11.0-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_4.11.0-MacOSX-arm64.sh#c19959eafcb84a26e00af5d9f55826eb" "miniconda" verify_py39 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py39_4.11.0-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_4.11.0-MacOSX-x86_64.sh#d1303e5c7510b2ef444b9ba474551733" "miniconda" verify_py39 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.9-4.12.0000066400000000000000000000027541517431316200271220ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py39_4.12.0-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_4.12.0-Linux-aarch64.sh#9baf936183f3479c97bff16fe62fb56c" "miniconda" verify_py39 ;; "Linux-ppc64le" ) install_script "Miniconda3-py39_4.12.0-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-py39_4.12.0-Linux-ppc64le.sh#2244290b6c899106901bbefad21aa49d" "miniconda" verify_py39 ;; "Linux-s390x" ) install_script "Miniconda3-py39_4.12.0-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py39_4.12.0-Linux-s390x.sh#f8d3b0ad1cf6a3a7175cd76d7e121820" "miniconda" verify_py39 ;; "Linux-x86_64" ) install_script "Miniconda3-py39_4.12.0-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_4.12.0-Linux-x86_64.sh#7843dd7d0a2c53b0df37ca8189672992" "miniconda" verify_py39 ;; "MacOSX-arm64" ) install_script "Miniconda3-py39_4.12.0-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_4.12.0-MacOSX-arm64.sh#f7448cfeb278f2a84ed903db02d5525c" "miniconda" verify_py39 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py39_4.12.0-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_4.12.0-MacOSX-x86_64.sh#143b9bb03b6e4865be4ebbf40b108772" "miniconda" verify_py39 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.9-4.9.2000066400000000000000000000024171517431316200270460ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniconda3-py39_4.9.2-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_4.9.2-Linux-aarch64.sh#af1c16d821569ebf1bdaf549fcba7d27" "miniconda" verify_py39 ;; "Linux-ppc64le" ) install_script "Miniconda3-py39_4.9.2-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-py39_4.9.2-Linux-ppc64le.sh#73b8d60454389905b1d209f1b0c211d9" "miniconda" verify_py39 ;; "Linux-s390x" ) install_script "Miniconda3-py39_4.9.2-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py39_4.9.2-Linux-s390x.sh#ae66aa46e565c97bf3485275b370c7e5" "miniconda" verify_py39 ;; "Linux-x86_64" ) install_script "Miniconda3-py39_4.9.2-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_4.9.2-Linux-x86_64.sh#b4e46fcc8029e2cfa731b788f25b1d36" "miniconda" verify_py39 ;; "MacOSX-x86_64" ) install_script "Miniconda3-py39_4.9.2-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_4.9.2-MacOSX-x86_64.sh#0658832393a50f5a578bcad825304886" "miniconda" verify_py39 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-3.9.1000066400000000000000000000016431517431316200265350ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86" ) install_script "Miniconda3-3.9.1-Linux-x86" "https://repo.continuum.io/miniconda/Miniconda3-3.9.1-Linux-x86.sh#1a9f8abfc63080c2d764039335a24465388533cca86472224c994ed8d32c4d48" "miniconda" verify_py34 ;; "Linux-x86_64" ) install_script "Miniconda3-3.9.1-Linux-x86_64" "https://repo.continuum.io/miniconda/Miniconda3-3.9.1-Linux-x86_64.sh#6c6b44acdd0bc4229377ee10d52c8ac6160c336d9cdd669db7371aa9344e1ac3" "miniconda" verify_py34 ;; "MacOSX-x86_64" ) install_script "Miniconda3-3.9.1-MacOSX-x86_64" "https://repo.continuum.io/miniconda/Miniconda3-3.9.1-MacOSX-x86_64.sh#e32523e3fdf0addab008e816c54eb6ae6eb6d62b1122d1e0dc4f4313a97b0591" "miniconda" verify_py34 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-4.0.5000066400000000000000000000016431517431316200265310ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86" ) install_script "Miniconda3-4.0.5-Linux-x86" "https://repo.continuum.io/miniconda/Miniconda3-4.0.5-Linux-x86.sh#3c06b31b0f70d21f4f62021b8db98929faa3a99ebe6b5b1a2999576d16c30e35" "miniconda" verify_py35 ;; "Linux-x86_64" ) install_script "Miniconda3-4.0.5-Linux-x86_64" "https://repo.continuum.io/miniconda/Miniconda3-4.0.5-Linux-x86_64.sh#a7bcd0425d8b6688753946b59681572f63c2241aed77bf0ec6de4c5edc5ceeac" "miniconda" verify_py35 ;; "MacOSX-x86_64" ) install_script "Miniconda3-4.0.5-MacOSX-x86_64" "https://repo.continuum.io/miniconda/Miniconda3-4.0.5-MacOSX-x86_64.sh#5673d23ed00515dbb7d236bc0db239c875db54ba1cd0976d907d0552dc58928f" "miniconda" verify_py35 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-4.1.11000066400000000000000000000016511517431316200266060ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86" ) install_script "Miniconda3-4.1.11-Linux-x86" "https://repo.continuum.io/miniconda/Miniconda3-4.1.11-Linux-x86.sh#4e89584027016060ce4e1dc40b8cb9e1c2dfd0d9f99335fca48d419ec90753c5" "miniconda" verify_py35 ;; "Linux-x86_64" ) install_script "Miniconda3-4.1.11-Linux-x86_64" "https://repo.continuum.io/miniconda/Miniconda3-4.1.11-Linux-x86_64.sh#efd6a9362fc6b4085f599a881d20e57de628da8c1a898c08ec82874f3bad41bf" "miniconda" verify_py35 ;; "MacOSX-x86_64" ) install_script "Miniconda3-4.1.11-MacOSX-x86_64" "https://repo.continuum.io/miniconda/Miniconda3-4.1.11-MacOSX-x86_64.sh#c4e3ba528721278f74e68ef070493a27d920ba10432dd2c2d563774799eda79c" "miniconda" verify_py35 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-4.2.12000066400000000000000000000016511517431316200266100ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86" ) install_script "Miniconda3-4.2.12-Linux-x86" "https://repo.continuum.io/miniconda/Miniconda3-4.2.12-Linux-x86.sh#64dae61d366ada1d5c6baf345a466c95b68eb6df574ee454fc234a7a99943702" "miniconda" verify_py35 ;; "Linux-x86_64" ) install_script "Miniconda3-4.2.12-Linux-x86_64" "https://repo.continuum.io/miniconda/Miniconda3-4.2.12-Linux-x86_64.sh#c59b3dd3cad550ac7596e0d599b91e75d88826db132e4146030ef471bb434e9a" "miniconda" verify_py35 ;; "MacOSX-x86_64" ) install_script "Miniconda3-4.2.12-MacOSX-x86_64" "https://repo.continuum.io/miniconda/Miniconda3-4.2.12-MacOSX-x86_64.sh#da15fd52352dcefc944a32cd54c8ec3cfc68cfbbadcb86dbea72fe681c7a7a70" "miniconda" verify_py35 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-4.3.11000066400000000000000000000016511517431316200266100ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86" ) install_script "Miniconda3-4.3.11-Linux-x86" "https://repo.continuum.io/miniconda/Miniconda3-4.3.11-Linux-x86.sh#ebda072999dd24bbede7cf3d99fb781187aa9148f71826edadbac0a55ce278cb" "miniconda" verify_py36 ;; "Linux-x86_64" ) install_script "Miniconda3-4.3.11-Linux-x86_64" "https://repo.continuum.io/miniconda/Miniconda3-4.3.11-Linux-x86_64.sh#b9fe70ce7b6fa8df05abfb56995959b897d0365299f5046063bc236843474fb8" "miniconda" verify_py36 ;; "MacOSX-x86_64" ) install_script "Miniconda3-4.3.11-MacOSX-x86_64" "https://repo.continuum.io/miniconda/Miniconda3-4.3.11-MacOSX-x86_64.sh#81f127e36249064d0f87b5d5dfa4d6094c6d5998f36a7bc80cb5028b4e32b7a2" "miniconda" verify_py36 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-4.3.14000066400000000000000000000016511517431316200266130ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86" ) install_script "Miniconda3-4.3.14-Linux-x86" "https://repo.continuum.io/miniconda/Miniconda3-4.3.14-Linux-x86.sh#4e3bf0348537770b2768de1e013ebccf2b4d66ce6e7a2942b254a53d3486c394" "miniconda" verify_py36 ;; "Linux-x86_64" ) install_script "Miniconda3-4.3.14-Linux-x86_64" "https://repo.continuum.io/miniconda/Miniconda3-4.3.14-Linux-x86_64.sh#902f31a46b4a05477a9862485be5f84af761a444f8813345ff8dad8f6d3bccb2" "miniconda" verify_py36 ;; "MacOSX-x86_64" ) install_script "Miniconda3-4.3.14-MacOSX-x86_64" "https://repo.continuum.io/miniconda/Miniconda3-4.3.14-MacOSX-x86_64.sh#fa5bf41893336138e262ada14ae7a67824df62c6c87351bb250bde203c253d67" "miniconda" verify_py36 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-4.3.21000066400000000000000000000016511517431316200266110ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86" ) install_script "Miniconda3-4.3.21-Linux-x86" "https://repo.continuum.io/miniconda/Miniconda3-4.3.21-Linux-x86.sh#f6a3190b1ada3f7d7a0eb8080cc927216d6c910f2adb5ffdc21817cb71a4fe68" "miniconda" verify_py35 ;; "Linux-x86_64" ) install_script "Miniconda3-4.3.21-Linux-x86_64" "https://repo.continuum.io/miniconda/Miniconda3-4.3.21-Linux-x86_64.sh#e9089c735b4ae53cb1035b1a97cec9febe6decf76868383292af589218304a90" "miniconda" verify_py35 ;; "MacOSX-x86_64" ) install_script "Miniconda3-4.3.21-MacOSX-x86_64" "https://repo.continuum.io/miniconda/Miniconda3-4.3.21-MacOSX-x86_64.sh#0f12382bbcd89c4141b0ace621813876723b569daa270b77d9c61323d2d5a881" "miniconda" verify_py35 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-4.3.27000066400000000000000000000016611517431316200266200ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86" ) install_script "Miniconda3-4.3.27.1-Linux-x86" "https://repo.continuum.io/miniconda/Miniconda3-4.3.27.1-Linux-x86.sh#15fb3364174544d16f452f50eedc32a8a90e27d2fccddff7313654259322105b" "miniconda" verify_py36 ;; "Linux-x86_64" ) install_script "Miniconda3-4.3.27.1-Linux-x86_64" "https://repo.continuum.io/miniconda/Miniconda3-4.3.27.1-Linux-x86_64.sh#640f505f06f87d75bebc629e4a677ebb185ea9a34eb6d7c199db0753ffc42f62" "miniconda" verify_py36 ;; "MacOSX-x86_64" ) install_script "Miniconda3-4.3.27-MacOSX-x86_64" "https://repo.continuum.io/miniconda/Miniconda3-4.3.27-MacOSX-x86_64.sh#768651bc018eba0e698659dae94fc858b21081334c483c80a069883820208f18" "miniconda" verify_py36 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-4.3.30000066400000000000000000000016551517431316200266150ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86" ) install_script "Miniconda3-4.3.30-Linux-x86" "https://repo.continuum.io/miniconda/Miniconda3-4.3.30-Linux-x86.sh#5d0c59c3d93b56dea90af1be96a9f36aa7f35605d9f821e8b86c1aa31d3b4e4b" "miniconda" verify_py36 ;; "Linux-x86_64" ) install_script "Miniconda3-4.3.30-Linux-x86_64" "https://repo.continuum.io/miniconda/Miniconda3-4.3.30-Linux-x86_64.sh#66c822dfe76636b4cc2ae5604816e0e723aa01620f50087f06410ecf5bfdf38c" "miniconda" verify_py36 ;; "MacOSX-x86_64" ) install_script "Miniconda3-4.3.30.1-MacOSX-x86_64" "https://repo.continuum.io/miniconda/Miniconda3-4.3.30.1-MacOSX-x86_64.sh#43d05d914139e6249498fe24cf97390a16eb95b56fc05b7f39470ff8b176d1af" "miniconda" verify_py36 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-4.3.31000066400000000000000000000015111517431316200266050ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86" ) install_script "Miniconda3-4.3.31-Linux-x86" "https://repo.anaconda.com/miniconda/Miniconda3-4.3.31-Linux-x86.sh#df2f9770d83df8269f3f43f1e60285e6" "miniconda" verify_py36 ;; "Linux-x86_64" ) install_script "Miniconda3-4.3.31-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-4.3.31-Linux-x86_64.sh#7fe70b214bee1143e3e3f0467b71453c" "miniconda" verify_py36 ;; "MacOSX-x86_64" ) install_script "Miniconda3-4.3.31-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-4.3.31-MacOSX-x86_64.sh#03c2dedc466886459e968157c63197f3" "miniconda" verify_py36 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-4.4.10000066400000000000000000000020251517431316200266040ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-ppc64le" ) install_script "Miniconda3-4.4.10-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-4.4.10-Linux-ppc64le.sh#57ca0b05eb96868b83aa69e4567b86ae" "miniconda" verify_py36 ;; "Linux-x86" ) install_script "Miniconda3-4.4.10-Linux-x86" "https://repo.anaconda.com/miniconda/Miniconda3-4.4.10-Linux-x86.sh#e770b4e45ac596c35f6393db988c5c33" "miniconda" verify_py36 ;; "Linux-x86_64" ) install_script "Miniconda3-4.4.10-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-4.4.10-Linux-x86_64.sh#bec6203dbb2f53011e974e9bf4d46e93" "miniconda" verify_py36 ;; "MacOSX-x86_64" ) install_script "Miniconda3-4.4.10-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-4.4.10-MacOSX-x86_64.sh#268ec716435aa19212901510f00815fd" "miniconda" verify_py36 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-4.5.1000066400000000000000000000020151517431316200265240ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-ppc64le" ) install_script "Miniconda3-4.5.1-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-4.5.1-Linux-ppc64le.sh#454e3b786937eeaa50fb7bee991ac19e" "miniconda" verify_py36 ;; "Linux-x86" ) install_script "Miniconda3-4.5.1-Linux-x86" "https://repo.anaconda.com/miniconda/Miniconda3-4.5.1-Linux-x86.sh#5d6627bfad03b87f1ad4173ebbeb933d" "miniconda" verify_py36 ;; "Linux-x86_64" ) install_script "Miniconda3-4.5.1-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-4.5.1-Linux-x86_64.sh#0c28787e3126238df24c5d4858bd0744" "miniconda" verify_py36 ;; "MacOSX-x86_64" ) install_script "Miniconda3-4.5.1-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-4.5.1-MacOSX-x86_64.sh#ac87d2074bd50103468b8681084236f6" "miniconda" verify_py36 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-4.5.11000066400000000000000000000020251517431316200266060ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-ppc64le" ) install_script "Miniconda3-4.5.11-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-4.5.11-Linux-ppc64le.sh#4b1ac3b4b70bfa710c9f1c5c6d3f3166" "miniconda" verify_py36 ;; "Linux-x86" ) install_script "Miniconda3-4.5.11-Linux-x86" "https://repo.anaconda.com/miniconda/Miniconda3-4.5.11-Linux-x86.sh#d8c3ea1bd25cf02c4ea92df4d31ef652" "miniconda" verify_py36 ;; "Linux-x86_64" ) install_script "Miniconda3-4.5.11-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-4.5.11-Linux-x86_64.sh#e1045ee415162f944b6aebfe560b8fee" "miniconda" verify_py36 ;; "MacOSX-x86_64" ) install_script "Miniconda3-4.5.11-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-4.5.11-MacOSX-x86_64.sh#7f7613bf98023f7d6ffe5df53c3a00a0" "miniconda" verify_py36 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-4.5.12000066400000000000000000000015111517431316200266060ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86" ) install_script "Miniconda3-4.5.12-Linux-x86" "https://repo.anaconda.com/miniconda/Miniconda3-4.5.12-Linux-x86.sh#38f586a269ac74f5f10195867c4f96ae" "miniconda" verify_py36 ;; "Linux-x86_64" ) install_script "Miniconda3-4.5.12-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-4.5.12-Linux-x86_64.sh#866ae9dff53ad0874e1d1a60b1ad1ef8" "miniconda" verify_py36 ;; "MacOSX-x86_64" ) install_script "Miniconda3-4.5.12-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-4.5.12-MacOSX-x86_64.sh#a583d1e174e1dc960e87fb4b026a9370" "miniconda" verify_py36 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-4.5.4000066400000000000000000000020151517431316200265270ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-ppc64le" ) install_script "Miniconda3-4.5.4-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-4.5.4-Linux-ppc64le.sh#05c1e073f262105179cf57920dfc4d43" "miniconda" verify_py36 ;; "Linux-x86" ) install_script "Miniconda3-4.5.4-Linux-x86" "https://repo.anaconda.com/miniconda/Miniconda3-4.5.4-Linux-x86.sh#0fcc79d640d82b7d36ea39654a82dd9d" "miniconda" verify_py36 ;; "Linux-x86_64" ) install_script "Miniconda3-4.5.4-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-4.5.4-Linux-x86_64.sh#a946ea1d0c4a642ddf0c3a26a18bb16d" "miniconda" verify_py36 ;; "MacOSX-x86_64" ) install_script "Miniconda3-4.5.4-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-4.5.4-MacOSX-x86_64.sh#164ec263c4070db642ce31bb45d68813" "miniconda" verify_py36 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-4.6.14000066400000000000000000000015251517431316200266160ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-ppc64le" ) install_script "Miniconda3-4.6.14-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-4.6.14-Linux-ppc64le.sh#6d3bd64dfc436f38755cde1a3ad40799" "miniconda" verify_py36 ;; "Linux-x86_64" ) install_script "Miniconda3-4.6.14-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-4.6.14-Linux-x86_64.sh#718259965f234088d785cad1fbd7de03" "miniconda" verify_py36 ;; "MacOSX-x86_64" ) install_script "Miniconda3-4.6.14-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-4.6.14-MacOSX-x86_64.sh#ffa5f0eead5576fb26b7e6902f5eed09" "miniconda" verify_py36 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-4.7.10000066400000000000000000000015251517431316200266130ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-ppc64le" ) install_script "Miniconda3-4.7.10-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-4.7.10-Linux-ppc64le.sh#f406a65d6362b33b22520186555c8d88" "miniconda" verify_py37 ;; "Linux-x86_64" ) install_script "Miniconda3-4.7.10-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-4.7.10-Linux-x86_64.sh#1c945f2b3335c7b2b15130b1b2dc5cf4" "miniconda" verify_py37 ;; "MacOSX-x86_64" ) install_script "Miniconda3-4.7.10-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-4.7.10-MacOSX-x86_64.sh#9cc5819a400a3fd5c7363792483fef1e" "miniconda" verify_py37 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-4.7.12000066400000000000000000000027021517431316200266130ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-ppc64le" ) install_script "Miniconda3-4.7.12-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-4.7.12-Linux-ppc64le.sh#bd5c2331edcbe87391465e6acf2d3f10" "miniconda" verify_py37 ;; "Linux-x86_64" ) install_script "Miniconda3-4.7.12-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-4.7.12-Linux-x86_64.sh#0dba759b8ecfc8948f626fa18785e3d8" "miniconda" verify_py37 ;; "MacOSX-x86_64" ) install_script "Miniconda3-4.7.12-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-4.7.12-MacOSX-x86_64.sh#677f38d5ab7e1ce4fef134068e3bd76a" "miniconda" verify_py37 ;; "Linux-ppc64le" ) install_script "Miniconda3-4.7.12.1-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-4.7.12.1-Linux-ppc64le.sh#9de38932ed6a8865562e6057b578694f" "miniconda" verify_py37 ;; "Linux-x86_64" ) install_script "Miniconda3-4.7.12.1-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-4.7.12.1-Linux-x86_64.sh#81c773ff87af5cfac79ab862942ab6b3" "miniconda" verify_py37 ;; "MacOSX-x86_64" ) install_script "Miniconda3-4.7.12.1-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-4.7.12.1-MacOSX-x86_64.sh#621daddf9de519014c6c38e8923583b8" "miniconda" verify_py37 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniconda3-latest000066400000000000000000000022111517431316200273510ustar00rootroot00000000000000export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-x86" ) install_script "Miniconda3-latest-Linux-x86" "https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86.sh" "miniconda" verify_py3_latest ;; "Linux-x86_64" ) install_script "Miniconda3-latest-Linux-x86_64" "https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh" "miniconda" verify_py3_latest ;; "Linux-aarch64" ) install_script "Miniconda3-latest-Linux-aarch64" "https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-aarch64.sh" "miniconda" verify_py3_latest ;; "MacOSX-x86_64" ) install_script "Miniconda3-latest-MacOSX-x86_64" "https://repo.continuum.io/miniconda/Miniconda3-latest-MacOSX-x86_64.sh" "miniconda" verify_py3_latest ;; "MacOSX-arm64" ) install_script "Miniconda3-latest-MacOSX-arm64" "https://repo.continuum.io/miniconda/Miniconda3-latest-MacOSX-arm64.sh" "miniconda" verify_py3_latest ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniconda3-latest is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniforge-pypy3000066400000000000000000000020511517431316200270760ustar00rootroot00000000000000 case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-ppc64le" ) install_script "Miniforge-pypy3-Linux-ppc64le" "https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge-pypy3-Linux-ppc64le.sh" "miniconda" verify_py3_latest ;; "Linux-x86_64" ) install_script "Miniforge-pypy3-Linux-x86_64" "https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge-pypy3-Linux-x86_64.sh" "miniconda" verify_py3_latest ;; "Linux-aarch64" ) install_script "Miniforge-pypy3-Linux-aarch64" "https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge-pypy3-Linux-aarch64.sh" "miniconda" verify_py3_latest ;; "MacOSX-x86_64" ) install_script "Miniforge-pypy3-MacOSX-x86_64" "https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge-pypy3-MacOSX-x86_64.sh" "miniconda" verify_py3_latest ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniforge with PyPy3 is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniforge3-22.11.1-3000066400000000000000000000031411517431316200270400ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniforge3-22.11.1-3-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-3/Miniforge3-22.11.1-3-Linux-aarch64.sh#6ee6fbbaaf900f090e9786b093ad829f0d3e6224d8c50ee37d5fc2c1317b2521" "miniconda" verify_py310 ;; "Linux-ppc64le" ) install_script "Miniforge3-22.11.1-3-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-3/Miniforge3-22.11.1-3-Linux-ppc64le.sh#bfccb07a65500c7ed2a7eb363c720caf69dc6baaa36ef52b1224df270c215c2c" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Miniforge3-22.11.1-3-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-3/Miniforge3-22.11.1-3-Linux-x86_64.sh#b96991615834e66a34f3653f12597b5938425bb00a0ce47dc493ea03ecf6f339" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Miniforge3-22.11.1-3-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-3/Miniforge3-22.11.1-3-MacOSX-arm64.sh#f416cc5ceb8420d12d078254f161f7c59fd41ca4dfcd86ce6a67c9c34069a15e" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Miniforge3-22.11.1-3-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-3/Miniforge3-22.11.1-3-MacOSX-x86_64.sh#9e590b6635d97a81fcb8b5366384317db544629b290f34423f3710a6917d2d58" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniforge3-22.11.1-4000066400000000000000000000031411517431316200270410ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniforge3-22.11.1-4-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-4/Miniforge3-22.11.1-4-Linux-aarch64.sh#2beb7624679016dcd4758ffb9b18efe4ba79af95e2357a606a4945f8ee64dbe6" "miniconda" verify_py310 ;; "Linux-ppc64le" ) install_script "Miniforge3-22.11.1-4-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-4/Miniforge3-22.11.1-4-Linux-ppc64le.sh#d689249d97e170d4dedd54291eb6680243ef83b39900ecb1d6df0679c70434d4" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Miniforge3-22.11.1-4-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-4/Miniforge3-22.11.1-4-Linux-x86_64.sh#737d1b2666528416706a916b355c43ff58deeaebf5ca906bc1a551e96c73ab8e" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Miniforge3-22.11.1-4-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-4/Miniforge3-22.11.1-4-MacOSX-arm64.sh#7be6b8b25eb328d6df048a7b533514097a6d30ff348d0f28671059c98c4c31aa" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Miniforge3-22.11.1-4-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-4/Miniforge3-22.11.1-4-MacOSX-x86_64.sh#d3bd39dc391552a037a95230786c026165c042499fa365aae0da4002d9530731" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniforge3-22.9.0-0000066400000000000000000000031221517431316200267620ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniforge3-22.9.0-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.9.0-0/Miniforge3-22.9.0-0-Linux-aarch64.sh#e3d8d8a2ca641a70f3aee492fff22f67ced642bded34a260827a1fa82437a999" "miniconda" verify_py310 ;; "Linux-ppc64le" ) install_script "Miniforge3-22.9.0-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/22.9.0-0/Miniforge3-22.9.0-0-Linux-ppc64le.sh#7db5858e7de6d730b92c3a6d1138f21ada88396876fa9fec65115d15e2f922e2" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Miniforge3-22.9.0-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.9.0-0/Miniforge3-22.9.0-0-Linux-x86_64.sh#24b704203a4cdabd99362f52a9836c55219579814eb904188675e077b488be38" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Miniforge3-22.9.0-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.9.0-0/Miniforge3-22.9.0-0-MacOSX-arm64.sh#e9eb55f8409e5f227c5ecc5f5d0024e4d81148454a763b95b612447a1585cc2c" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Miniforge3-22.9.0-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.9.0-0/Miniforge3-22.9.0-0-MacOSX-x86_64.sh#c6e4fc3e9dca2375e91a3bc2f27c01634bb1841ab4d284a3a83b4181ae79b16d" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniforge3-22.9.0-1000066400000000000000000000031221517431316200267630ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniforge3-22.9.0-1-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.9.0-1/Miniforge3-22.9.0-1-Linux-aarch64.sh#786777d47b27f490701ecb42c61b245bd945c34bc9ce8d7e90f4b87f430297a1" "miniconda" verify_py310 ;; "Linux-ppc64le" ) install_script "Miniforge3-22.9.0-1-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/22.9.0-1/Miniforge3-22.9.0-1-Linux-ppc64le.sh#f51ea2fe47b2481a42e67747573690e13cac796c6f18ba1af1d198850c35c23a" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Miniforge3-22.9.0-1-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.9.0-1/Miniforge3-22.9.0-1-Linux-x86_64.sh#47f4b8ef9c5e2ba28eb3c17d27c4d0709f59ea3ab78d7d87c2d34e0c7ad439d5" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Miniforge3-22.9.0-1-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.9.0-1/Miniforge3-22.9.0-1-MacOSX-arm64.sh#8631692804809f14ac9da0c2d277bcede715854da6b1a3fa81822ba961dc546b" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Miniforge3-22.9.0-1-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.9.0-1/Miniforge3-22.9.0-1-MacOSX-x86_64.sh#0b56334b4ed62076fbf6973fd3ced9d41190b73ab27432c8db224ca42e614207" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniforge3-22.9.0-2000066400000000000000000000031221517431316200267640ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniforge3-22.9.0-2-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.9.0-2/Miniforge3-22.9.0-2-Linux-aarch64.sh#3d75758c4d98181946b29d391323209752c5a111530738b5e36eba77e8e026aa" "miniconda" verify_py310 ;; "Linux-ppc64le" ) install_script "Miniforge3-22.9.0-2-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/22.9.0-2/Miniforge3-22.9.0-2-Linux-ppc64le.sh#e84ffc9f018d5b23601106f299fefd25a75afb6fdd3416037ce4b561781156fc" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Miniforge3-22.9.0-2-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.9.0-2/Miniforge3-22.9.0-2-Linux-x86_64.sh#180aefcbcf8a9f24123adb9e64e16c9bb16bc3f129bd79a5912ff44f295cc405" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Miniforge3-22.9.0-2-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.9.0-2/Miniforge3-22.9.0-2-MacOSX-arm64.sh#6ac610dabf9a64574ec83b158b2eb6023bc3de0de9a0c528d4fa876df2a27d13" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Miniforge3-22.9.0-2-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.9.0-2/Miniforge3-22.9.0-2-MacOSX-x86_64.sh#d7f50abd340f63515b2059ed462548f5d395e2f9d7847a98c5428998504f5bff" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniforge3-22.9.0-3000066400000000000000000000031221517431316200267650ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniforge3-22.9.0-3-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.9.0-3/Miniforge3-22.9.0-3-Linux-aarch64.sh#3862fd31ed24d9254cecd8b080dc741b556a6e371b4615880173a782c7cf3b27" "miniconda" verify_py310 ;; "Linux-ppc64le" ) install_script "Miniforge3-22.9.0-3-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/22.9.0-3/Miniforge3-22.9.0-3-Linux-ppc64le.sh#914e0ae86d5ce473379841041e52c7891aa65e46be7892c2258cb439a83dd301" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Miniforge3-22.9.0-3-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.9.0-3/Miniforge3-22.9.0-3-Linux-x86_64.sh#0df76d7a8e66c4f96478ff71b90b7a8df04c19474f3d36dd77ace53e75aa47e4" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Miniforge3-22.9.0-3-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.9.0-3/Miniforge3-22.9.0-3-MacOSX-arm64.sh#c3065cbfaef72966599fc658a2724f5109b0315f7b9ffc6078fd061b084942f4" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Miniforge3-22.9.0-3-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.9.0-3/Miniforge3-22.9.0-3-MacOSX-x86_64.sh#45a1314dad30baececc43b4ecef839a17e43860a6a9c77e87ab1d4297796fa9d" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniforge3-23.1.0-0000066400000000000000000000031221517431316200267530ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniforge3-23.1.0-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-0/Miniforge3-23.1.0-0-Linux-aarch64.sh#4972174d7bc88c636f50257fd2dc718abfd648b227dacbde4c8db716d05bb08b" "miniconda" verify_py310 ;; "Linux-ppc64le" ) install_script "Miniforge3-23.1.0-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-0/Miniforge3-23.1.0-0-Linux-ppc64le.sh#21ccc195bdee24caf9eef5e8fdd250d3fba9147a68e1cd114c2375cb03ba6043" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Miniforge3-23.1.0-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-0/Miniforge3-23.1.0-0-Linux-x86_64.sh#9bbcc29e8e43151bd4634fbe086e3d7914aba3963ac6b1e8d59c530435bd33d9" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Miniforge3-23.1.0-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-0/Miniforge3-23.1.0-0-MacOSX-arm64.sh#0aece610f84e023d062e1c88bfc6033dd60101ec9b79819f87fc1b009263989b" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Miniforge3-23.1.0-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-0/Miniforge3-23.1.0-0-MacOSX-x86_64.sh#a9665fec3c8c1abd572666d4c49d512b3c27082324a1713ca2fde6efb8ce7856" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniforge3-23.1.0-1000066400000000000000000000031221517431316200267540ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniforge3-23.1.0-1-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-1/Miniforge3-23.1.0-1-Linux-aarch64.sh#9083f5aa0a125bfbc1a8e8d5eb57812a2761b884e0806a75ebc3c95be894791e" "miniconda" verify_py310 ;; "Linux-ppc64le" ) install_script "Miniforge3-23.1.0-1-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-1/Miniforge3-23.1.0-1-Linux-ppc64le.sh#6b9d4af128f6378ec688ce412fb1a4fe8ce298df9d05bb7092637c8047faeb26" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Miniforge3-23.1.0-1-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-1/Miniforge3-23.1.0-1-Linux-x86_64.sh#7a5859e873ed36fc9a141fff0ac60e133b971b3413aed49a4c82693d4f4a2ad2" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Miniforge3-23.1.0-1-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-1/Miniforge3-23.1.0-1-MacOSX-arm64.sh#147ee54acc6ebd5148d712945fed29c4e01a247528f28fd958615f63bfc75687" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Miniforge3-23.1.0-1-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-1/Miniforge3-23.1.0-1-MacOSX-x86_64.sh#7c737a78918164c5a07a6489b8429f9788aadb58536434c0d34316e7686dc424" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniforge3-23.1.0-2000066400000000000000000000031221517431316200267550ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniforge3-23.1.0-2-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-2/Miniforge3-23.1.0-2-Linux-aarch64.sh#ca662b0c5620cc4f70afe75a674b212a424bb16da103251d07afe8cfa268983c" "miniconda" verify_py310 ;; "Linux-ppc64le" ) install_script "Miniforge3-23.1.0-2-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-2/Miniforge3-23.1.0-2-Linux-ppc64le.sh#34e7db7d071b15abb07603108d5a74c4878aa25be30005163ed9bdbafe8ecf79" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Miniforge3-23.1.0-2-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-2/Miniforge3-23.1.0-2-Linux-x86_64.sh#ee75d00832ef4aeb1ae04ac62ffb1dc917409696cfbe50f5f93125ab9b165278" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Miniforge3-23.1.0-2-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-2/Miniforge3-23.1.0-2-MacOSX-arm64.sh#05891e572dedd62c128c51ed7cdcceba191155779f5ea1abdf0e57e3fba8a982" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Miniforge3-23.1.0-2-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-2/Miniforge3-23.1.0-2-MacOSX-x86_64.sh#1d837379b50b57bf009b6a6956a7cff10dc25ca52a940a35b7090f2e9b6c5482" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniforge3-23.1.0-3000066400000000000000000000031221517431316200267560ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniforge3-23.1.0-3-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-3/Miniforge3-23.1.0-3-Linux-aarch64.sh#2e180aa558ff38481ec5147b7f06060c3c8cfbd12894abe31b5f75fc23f7d09a" "miniconda" verify_py310 ;; "Linux-ppc64le" ) install_script "Miniforge3-23.1.0-3-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-3/Miniforge3-23.1.0-3-Linux-ppc64le.sh#00722f3dd257143816d94d8fc97a3c43ccc3046e31956240d14c210268ccc64e" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Miniforge3-23.1.0-3-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-3/Miniforge3-23.1.0-3-Linux-x86_64.sh#d4e4750ac95508512c52ff33fa71834e7839e8c51224694a544aecdd655ce29c" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Miniforge3-23.1.0-3-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-3/Miniforge3-23.1.0-3-MacOSX-arm64.sh#85f4f38d3502871c09d94ab2fd43fe221284eb33c361c486c2b420a726328a7e" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Miniforge3-23.1.0-3-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-3/Miniforge3-23.1.0-3-MacOSX-x86_64.sh#846df715e78ef3b875d1cbf17ed124e261f5ece2dd0e2556310cf4dfbc1238f6" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniforge3-23.1.0-4000066400000000000000000000031221517431316200267570ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniforge3-23.1.0-4-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-4/Miniforge3-23.1.0-4-Linux-aarch64.sh#bf6a4b9d3e0195b9c64b58f0e28738edc259a214f362edbc23884e82ad59cb8c" "miniconda" verify_py310 ;; "Linux-ppc64le" ) install_script "Miniforge3-23.1.0-4-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-4/Miniforge3-23.1.0-4-Linux-ppc64le.sh#0e49480e6a3429d9578bdbdc154d623375273b3e8c205353c1cc9d6e0cce1f59" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Miniforge3-23.1.0-4-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-4/Miniforge3-23.1.0-4-Linux-x86_64.sh#35c531207d2a8d212215bdb7f998c926f24bc8686e1cf46a693a3ea375613a7f" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Miniforge3-23.1.0-4-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-4/Miniforge3-23.1.0-4-MacOSX-arm64.sh#de48052b85900a3878cedbb25add7e17b14d5bdfba8ba523791851a10a6b84fe" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Miniforge3-23.1.0-4-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-4/Miniforge3-23.1.0-4-MacOSX-x86_64.sh#a43f4e34aa27b5cb849027b01b03931df52f768fc8b82b1f72f40ff064abb6f3" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniforge3-23.10.0-0000066400000000000000000000031411517431316200270340ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniforge3-23.10.0-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.10.0-0/Miniforge3-23.10.0-0-Linux-aarch64.sh#3760323416d2ce48ca8445386a8c12b453a92f111614dd1870f0ea684d6d32a8" "miniconda" verify_py310 ;; "Linux-ppc64le" ) install_script "Miniforge3-23.10.0-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/23.10.0-0/Miniforge3-23.10.0-0-Linux-ppc64le.sh#d1a5287138cc4bcc70dad3d1dcf770d8ec13f93c82aeea481bb727860b0f4b5c" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Miniforge3-23.10.0-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.10.0-0/Miniforge3-23.10.0-0-Linux-x86_64.sh#da66ba24d5ffdf4c339ec8923de9e207f682f2027f9f382103080dea4407ef33" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Miniforge3-23.10.0-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.10.0-0/Miniforge3-23.10.0-0-MacOSX-arm64.sh#057b6ba35d5872b33b6342183546bd0d5e838460bb019a2fe4db2208eb042135" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Miniforge3-23.10.0-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.10.0-0/Miniforge3-23.10.0-0-MacOSX-x86_64.sh#a1785d943daba4f23dac64fc389b4e5929aee6d20eb8ba245671887249238df9" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniforge3-23.11.0-0000066400000000000000000000031411517431316200270350ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniforge3-23.11.0-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.11.0-0/Miniforge3-23.11.0-0-Linux-aarch64.sh#775968746d062a14bd84db3ae72f18f60f4acf229bd840625805e87668486bf4" "miniconda" verify_py310 ;; "Linux-ppc64le" ) install_script "Miniforge3-23.11.0-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/23.11.0-0/Miniforge3-23.11.0-0-Linux-ppc64le.sh#a77f1293dbc2a70c5b58f495f70dfc143f3455ca9da9edbc1afa66157c1c722a" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Miniforge3-23.11.0-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.11.0-0/Miniforge3-23.11.0-0-Linux-x86_64.sh#73576b96409ed38a7ca596bece058e8c77c6ef3eab42af7cfdf2ae975e8f3928" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Miniforge3-23.11.0-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.11.0-0/Miniforge3-23.11.0-0-MacOSX-arm64.sh#9382007611d4ad7201976a33cd65aaf2b3de582285b76c894d8c71eac544bfe1" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Miniforge3-23.11.0-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.11.0-0/Miniforge3-23.11.0-0-MacOSX-x86_64.sh#6e586a93cc8c6d21deb543d46740806795eae4ff16a76bc5f8a57673e3044c73" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniforge3-23.3.0-0000066400000000000000000000031221517431316200267550ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniforge3-23.3.0-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.3.0-0/Miniforge3-23.3.0-0-Linux-aarch64.sh#ca3ccf3006d7923b91157c434c4a9ba58b99812a00cf48aa83f2835ea3f7d167" "miniconda" verify_py310 ;; "Linux-ppc64le" ) install_script "Miniforge3-23.3.0-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/23.3.0-0/Miniforge3-23.3.0-0-Linux-ppc64le.sh#4b12965a0c0746110480c61440ba836022db72cdfed69616de3dfa66ba7c92df" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Miniforge3-23.3.0-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.3.0-0/Miniforge3-23.3.0-0-Linux-x86_64.sh#17484f59cbe983abb953cc33e7a4c0ee0b33153de61d5465bb1aaf176e43d038" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Miniforge3-23.3.0-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.3.0-0/Miniforge3-23.3.0-0-MacOSX-arm64.sh#37ca7c33fefcfb45deef58eaa690970c7392a87f01a076f932dd7f3f684888d7" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Miniforge3-23.3.0-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.3.0-0/Miniforge3-23.3.0-0-MacOSX-x86_64.sh#32f797ba073ae153bd1fd36a556833c0082c3cd44ac25f13fc5228258aadf7a5" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniforge3-23.3.1-0000066400000000000000000000031221517431316200267560ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniforge3-23.3.1-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.3.1-0/Miniforge3-23.3.1-0-Linux-aarch64.sh#b71277b8b40a6817d923fde0b858f56a4504f4e9b659d343dd8eae9d9473ab7f" "miniconda" verify_py310 ;; "Linux-ppc64le" ) install_script "Miniforge3-23.3.1-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/23.3.1-0/Miniforge3-23.3.1-0-Linux-ppc64le.sh#434b461d309110bfeb72198541a541985aa197e3b605de27978c15f31d1520ef" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Miniforge3-23.3.1-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.3.1-0/Miniforge3-23.3.1-0-Linux-x86_64.sh#9be723d231609919fa3e3bb06f899a9a9c22e92e570bada8129a1bf50fee8d73" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Miniforge3-23.3.1-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.3.1-0/Miniforge3-23.3.1-0-MacOSX-arm64.sh#32632039d6f457e56589591bd893f62cba85e31379ec8b663f8b06f35b0860e7" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Miniforge3-23.3.1-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.3.1-0/Miniforge3-23.3.1-0-MacOSX-x86_64.sh#e9447f308499d99821c48293fe258bb47595f238140cd9c834f57321d3839cd0" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniforge3-23.3.1-1000066400000000000000000000031221517431316200267570ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniforge3-23.3.1-1-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.3.1-1/Miniforge3-23.3.1-1-Linux-aarch64.sh#dc5d94b83251621f088bd82df896ea45e63597293ece7ccd923b2346aed34b89" "miniconda" verify_py310 ;; "Linux-ppc64le" ) install_script "Miniforge3-23.3.1-1-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/23.3.1-1/Miniforge3-23.3.1-1-Linux-ppc64le.sh#2eafa28fee5f1dfffb01feaca70de000f8e8335e1f659603ef0b9a40b9d1f213" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Miniforge3-23.3.1-1-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.3.1-1/Miniforge3-23.3.1-1-Linux-x86_64.sh#b3e14bd70f99bc8959445fad3532128a6af36c5e77bc62226db0e80d1df0e9e9" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Miniforge3-23.3.1-1-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.3.1-1/Miniforge3-23.3.1-1-MacOSX-arm64.sh#51d15ed1471ef8633f99574dc0c43fc972ce1981ebf08eade4d9b249bb7640e4" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Miniforge3-23.3.1-1-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.3.1-1/Miniforge3-23.3.1-1-MacOSX-x86_64.sh#d8eef4816b28f1bfc099d8fc2cdac4fb0ebbe1ddd27f4acb66d83d66c260cb63" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniforge3-24.1.2-0000066400000000000000000000031221517431316200267560ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniforge3-24.1.2-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.1.2-0/Miniforge3-24.1.2-0-Linux-aarch64.sh#f881e2fa24aa898c25fac3250ccb213e8b892fdd95851f000dce93c419e8f89a" "miniconda" verify_py310 ;; "Linux-ppc64le" ) install_script "Miniforge3-24.1.2-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/24.1.2-0/Miniforge3-24.1.2-0-Linux-ppc64le.sh#858b9acbcca1e3f67298a56095f547f2c540d79e1020918cf0d8d6a8af407542" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Miniforge3-24.1.2-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.1.2-0/Miniforge3-24.1.2-0-Linux-x86_64.sh#dbadb808edf4da00af35d888d3eeebbfdce71972b60bf4b16dbacaee2ab57f28" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Miniforge3-24.1.2-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.1.2-0/Miniforge3-24.1.2-0-MacOSX-arm64.sh#b372d2189e5752e92a4b4bbc4a91b8a08a4f0612d39c0762111c8dd60914b1c7" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Miniforge3-24.1.2-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.1.2-0/Miniforge3-24.1.2-0-MacOSX-x86_64.sh#e447e7e0173e94ea8725a4c6675c29bcd3082f8fff7948b47e05af72b12d1261" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniforge3-24.11.0-0000066400000000000000000000031411517431316200270360ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniforge3-24.11.0-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.0-0/Miniforge3-24.11.0-0-Linux-aarch64.sh#47cfd3caf3a0a6f56ebbfc7da775306fe076b8e49b14d3fd88b5463ab324c185" "miniconda" verify_py312 ;; "Linux-ppc64le" ) install_script "Miniforge3-24.11.0-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.0-0/Miniforge3-24.11.0-0-Linux-ppc64le.sh#877e3992041e36f49ce16681e5b24e23617ad044d1a077cf21b5cce90896e244" "miniconda" verify_py312 ;; "Linux-x86_64" ) install_script "Miniforge3-24.11.0-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.0-0/Miniforge3-24.11.0-0-Linux-x86_64.sh#5fa69e4294be07229a94a1c1e8073fbf63894c757c2136f98c87b48f9d458793" "miniconda" verify_py312 ;; "MacOSX-arm64" ) install_script "Miniforge3-24.11.0-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.0-0/Miniforge3-24.11.0-0-MacOSX-arm64.sh#3c7c115de0ed6103b7d2e5c1fe969c2c9fd3aec4a454c1d5aa9b5721414413e0" "miniconda" verify_py312 ;; "MacOSX-x86_64" ) install_script "Miniforge3-24.11.0-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.0-0/Miniforge3-24.11.0-0-MacOSX-x86_64.sh#1f0527ec14784de0766d8405a674868e51afb869ea16c915fb2672256209ecfd" "miniconda" verify_py312 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniforge3-24.11.0-1000066400000000000000000000031411517431316200270370ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniforge3-24.11.0-1-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.0-1/Miniforge3-24.11.0-1-Linux-aarch64.sh#21e5af2d961a19535e1ba8d67d8ce46c522b6e616dea826c6987ff4db8499b73" "miniconda" verify_py312 ;; "Linux-ppc64le" ) install_script "Miniforge3-24.11.0-1-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.0-1/Miniforge3-24.11.0-1-Linux-ppc64le.sh#20847d0978fbf301da2f9d66ae47dc9da8c080cc1e3f70acb2264e3b6ff99ceb" "miniconda" verify_py312 ;; "Linux-x86_64" ) install_script "Miniforge3-24.11.0-1-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.0-1/Miniforge3-24.11.0-1-Linux-x86_64.sh#936836bb2dd546a7ab5999bed2a2d1ce8416c5359e28199df8b384529a85dcac" "miniconda" verify_py312 ;; "MacOSX-arm64" ) install_script "Miniforge3-24.11.0-1-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.0-1/Miniforge3-24.11.0-1-MacOSX-arm64.sh#6c2ff0b7cf1b6300a3dc6125da8e78407d3ffd3a7359742957fcca0cd7cd7604" "miniconda" verify_py312 ;; "MacOSX-x86_64" ) install_script "Miniforge3-24.11.0-1-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.0-1/Miniforge3-24.11.0-1-MacOSX-x86_64.sh#5f42fb48c528b2f60a659d0cc19adb74a4098d8a1519ac7fe0724273eae050c5" "miniconda" verify_py312 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniforge3-24.11.2-0000066400000000000000000000031411517431316200270400ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniforge3-24.11.2-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.2-0/Miniforge3-24.11.2-0-Linux-aarch64.sh#4f182710a6394f81eda2a6f8578c63d4b52842ad8a9c6b54c7a4cf43513cf118" "miniconda" verify_py312 ;; "Linux-ppc64le" ) install_script "Miniforge3-24.11.2-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.2-0/Miniforge3-24.11.2-0-Linux-ppc64le.sh#6fb5e999d256eeb79c0ce793145966b995b22ff1001ec0fd662be2ba4a4fb538" "miniconda" verify_py312 ;; "Linux-x86_64" ) install_script "Miniforge3-24.11.2-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.2-0/Miniforge3-24.11.2-0-Linux-x86_64.sh#e6ac45dc94bbc93a31802ed8b74f41b653a132e9f5d4d6b028ae00c5a9c563ba" "miniconda" verify_py312 ;; "MacOSX-arm64" ) install_script "Miniforge3-24.11.2-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.2-0/Miniforge3-24.11.2-0-MacOSX-arm64.sh#f62f38d92e4ae015d82d1aa4aad392747f4e1a61d75deece3a68bdaf472e3ca7" "miniconda" verify_py312 ;; "MacOSX-x86_64" ) install_script "Miniforge3-24.11.2-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.2-0/Miniforge3-24.11.2-0-MacOSX-x86_64.sh#9dd0058e927986bc53d0685f6ac995267f7d8edbd178b4a47692bf08bfd7b11c" "miniconda" verify_py312 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniforge3-24.11.2-1000066400000000000000000000031411517431316200270410ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniforge3-24.11.2-1-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.2-1/Miniforge3-24.11.2-1-Linux-aarch64.sh#ef4e191fc6843f343d51b31310d36eacbc1de2899ea233190ff63188ffe30894" "miniconda" verify_py312 ;; "Linux-ppc64le" ) install_script "Miniforge3-24.11.2-1-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.2-1/Miniforge3-24.11.2-1-Linux-ppc64le.sh#ddda150ca836abaa03e718945687614f9b8fd9694dffd7f3d73d416ba2027e0d" "miniconda" verify_py312 ;; "Linux-x86_64" ) install_script "Miniforge3-24.11.2-1-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.2-1/Miniforge3-24.11.2-1-Linux-x86_64.sh#c79c7326a846d6df9ec824e19ccc99454d8f5009e37888df301b23eef11280ca" "miniconda" verify_py312 ;; "MacOSX-arm64" ) install_script "Miniforge3-24.11.2-1-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.2-1/Miniforge3-24.11.2-1-MacOSX-arm64.sh#8bde418e8f5030b887535940cad3b531adf128a38b99e58ba6a26e68e9d5ad06" "miniconda" verify_py312 ;; "MacOSX-x86_64" ) install_script "Miniforge3-24.11.2-1-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.2-1/Miniforge3-24.11.2-1-MacOSX-x86_64.sh#50a00997a0f08737d076e93f964dffcb51bc4792fd9371344fd244ab97bcf61c" "miniconda" verify_py312 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniforge3-24.11.3-0000066400000000000000000000031411517431316200270410ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniforge3-24.11.3-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.3-0/Miniforge3-24.11.3-0-Linux-aarch64.sh#d3f2b771857009ec804faeeef191352186194cb5737a831e55c6347a5f47cb8f" "miniconda" verify_py312 ;; "Linux-ppc64le" ) install_script "Miniforge3-24.11.3-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.3-0/Miniforge3-24.11.3-0-Linux-ppc64le.sh#8f8a2eadc773e4c9a3d4587a08b24646e0b2374e0ea0ac538a499303c2527fd2" "miniconda" verify_py312 ;; "Linux-x86_64" ) install_script "Miniforge3-24.11.3-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.3-0/Miniforge3-24.11.3-0-Linux-x86_64.sh#2e1ad2188fe69fcdd522c2b20c08c800a5c7411b775eca768318b1540ed32e53" "miniconda" verify_py312 ;; "MacOSX-arm64" ) install_script "Miniforge3-24.11.3-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.3-0/Miniforge3-24.11.3-0-MacOSX-arm64.sh#dbead9822b1932ecc1b3238311a843400462b38e302bbd067ef373aa39dedd4f" "miniconda" verify_py312 ;; "MacOSX-x86_64" ) install_script "Miniforge3-24.11.3-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.3-0/Miniforge3-24.11.3-0-MacOSX-x86_64.sh#1f8e16f2f8e7538c2ef1d08cbb8f2feadc75907e31dbcde75a10ca788fc03abb" "miniconda" verify_py312 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniforge3-24.11.3-1000066400000000000000000000031411517431316200270420ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniforge3-24.11.3-1-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.3-1/Miniforge3-24.11.3-1-Linux-aarch64.sh#64ee999aaa1e81968345382569780dae499bdc680751b1b408e2030c51397d49" "miniconda" verify_py312 ;; "Linux-ppc64le" ) install_script "Miniforge3-24.11.3-1-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.3-1/Miniforge3-24.11.3-1-Linux-ppc64le.sh#db36c2024ca0b7216a91faebb20de11bca3d8baa4e3c8b253a65e3d9149f6e72" "miniconda" verify_py312 ;; "Linux-x86_64" ) install_script "Miniforge3-24.11.3-1-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.3-1/Miniforge3-24.11.3-1-Linux-x86_64.sh#2163c5c29661ae2850c00a9d03af82db795b822d391ae68a5f8cce62a7483a54" "miniconda" verify_py312 ;; "MacOSX-arm64" ) install_script "Miniforge3-24.11.3-1-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.3-1/Miniforge3-24.11.3-1-MacOSX-arm64.sh#a2c3cfe749325634b2c29103f7c65a160e9c0ddc6b3c35528b0921ba3f6e9a91" "miniconda" verify_py312 ;; "MacOSX-x86_64" ) install_script "Miniforge3-24.11.3-1-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.3-1/Miniforge3-24.11.3-1-MacOSX-x86_64.sh#304bb96966caeb96e7ccd1859bf81f6abf15de667c144bf3600cbeaf3491033c" "miniconda" verify_py312 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniforge3-24.11.3-2000066400000000000000000000031411517431316200270430ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniforge3-24.11.3-2-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.3-2/Miniforge3-24.11.3-2-Linux-aarch64.sh#d61942220d28e2103ad6303de808fec52d2e276fa698e2ae5d8ab865e194c504" "miniconda" verify_py312 ;; "Linux-ppc64le" ) install_script "Miniforge3-24.11.3-2-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.3-2/Miniforge3-24.11.3-2-Linux-ppc64le.sh#7e312337a1a34c88802ff300a50ff785c6db85a8e518ee1cdc0d58085e0ad08e" "miniconda" verify_py312 ;; "Linux-x86_64" ) install_script "Miniforge3-24.11.3-2-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.3-2/Miniforge3-24.11.3-2-Linux-x86_64.sh#65af53dad30b3fcbd1cb1d4ad62fd3a86221464754844544558aae3a28795189" "miniconda" verify_py312 ;; "MacOSX-arm64" ) install_script "Miniforge3-24.11.3-2-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.3-2/Miniforge3-24.11.3-2-MacOSX-arm64.sh#a20f9dd033fcdb26329abab726bfddf22de44bf1d37030bb212cf52120b26618" "miniconda" verify_py312 ;; "MacOSX-x86_64" ) install_script "Miniforge3-24.11.3-2-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.3-2/Miniforge3-24.11.3-2-MacOSX-x86_64.sh#164f9891ca2338d9c748d1d007d081d1206ae255264df201493204b93b8ba484" "miniconda" verify_py312 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniforge3-24.3.0-0000066400000000000000000000031221517431316200267560ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniforge3-24.3.0-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.3.0-0/Miniforge3-24.3.0-0-Linux-aarch64.sh#6c879fe354d3e26b8d960cff6b1f3cb9d2e58c79c5c07f23fff62469dc5c1480" "miniconda" verify_py310 ;; "Linux-ppc64le" ) install_script "Miniforge3-24.3.0-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/24.3.0-0/Miniforge3-24.3.0-0-Linux-ppc64le.sh#b7710f5dbab9a49995e027cc72cc729ad54506fbba7b936b56737d1437aa6504" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Miniforge3-24.3.0-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.3.0-0/Miniforge3-24.3.0-0-Linux-x86_64.sh#23367676b610de826f50f7ddc91139a816d4b59bd4c69cc9b6082d9b2e7fe8a3" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Miniforge3-24.3.0-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.3.0-0/Miniforge3-24.3.0-0-MacOSX-arm64.sh#9b3c3d9fa30437592e680390f2b27d45c5d5cfcbfad9a1af233f70a6d8be71a1" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Miniforge3-24.3.0-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.3.0-0/Miniforge3-24.3.0-0-MacOSX-x86_64.sh#26a80621b146d60e5ae0d896b83ec138416653b951286361b1f93a804cb6a8d9" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniforge3-24.5.0-0000066400000000000000000000031221517431316200267600ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniforge3-24.5.0-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.5.0-0/Miniforge3-24.5.0-0-Linux-aarch64.sh#848f2d6917c473b1091e31a51241a7626d4dac4b90809a9b2ed937e0cea18d87" "miniconda" verify_py312 ;; "Linux-ppc64le" ) install_script "Miniforge3-24.5.0-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/24.5.0-0/Miniforge3-24.5.0-0-Linux-ppc64le.sh#1a947af7d68e8a06c2057c9a01ec03a5f7e26133fe42ad531f0a4b898b91dc86" "miniconda" verify_py312 ;; "Linux-x86_64" ) install_script "Miniforge3-24.5.0-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.5.0-0/Miniforge3-24.5.0-0-Linux-x86_64.sh#a754b435830e1c038dada434873ad69a99970a4ea17a68d3bbcade0a37c8c8fb" "miniconda" verify_py312 ;; "MacOSX-arm64" ) install_script "Miniforge3-24.5.0-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.5.0-0/Miniforge3-24.5.0-0-MacOSX-arm64.sh#9c423bb8c9b80709f9682eac9d2a8f5cdecb54601fd4ec1ec6bb98349cf54a92" "miniconda" verify_py312 ;; "MacOSX-x86_64" ) install_script "Miniforge3-24.5.0-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.5.0-0/Miniforge3-24.5.0-0-MacOSX-x86_64.sh#31ad3bbd4114021cdd1bf14a641bcf0f38b4dc71f0931be2720528c2555a587e" "miniconda" verify_py312 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniforge3-24.7.1-0000066400000000000000000000031221517431316200267630ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniforge3-24.7.1-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.7.1-0/Miniforge3-24.7.1-0-Linux-aarch64.sh#7a3372268b45679584043b4ba1e0318ee5027384a8d330f2d991b14d815d6a6d" "miniconda" verify_py312 ;; "Linux-ppc64le" ) install_script "Miniforge3-24.7.1-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/24.7.1-0/Miniforge3-24.7.1-0-Linux-ppc64le.sh#af1015e0531f4ff5e19001c476b720609609401d9cb80fc8a02c5e5d50e02ed5" "miniconda" verify_py312 ;; "Linux-x86_64" ) install_script "Miniforge3-24.7.1-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.7.1-0/Miniforge3-24.7.1-0-Linux-x86_64.sh#b64f77042cf8eafd31ced64f9253a74fb85db63545fe167ba5756aea0e8125be" "miniconda" verify_py312 ;; "MacOSX-arm64" ) install_script "Miniforge3-24.7.1-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.7.1-0/Miniforge3-24.7.1-0-MacOSX-arm64.sh#2de2a2a31964be19ae157b5f93429cb50f8bf3983c580c8b14acefaf3d7e7c5b" "miniconda" verify_py312 ;; "MacOSX-x86_64" ) install_script "Miniforge3-24.7.1-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.7.1-0/Miniforge3-24.7.1-0-MacOSX-x86_64.sh#03b73291d46199a40cb694a400010de9d737e6397d3eed676f28828fe2df5025" "miniconda" verify_py312 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniforge3-24.7.1-1000066400000000000000000000031221517431316200267640ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniforge3-24.7.1-1-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.7.1-1/Miniforge3-24.7.1-1-Linux-aarch64.sh#9ed15a4d030928c6e537cb673538803ca5f07adb89957b9cfc24ebdc00ba4bf9" "miniconda" verify_py312 ;; "Linux-ppc64le" ) install_script "Miniforge3-24.7.1-1-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/24.7.1-1/Miniforge3-24.7.1-1-Linux-ppc64le.sh#9b05977d9fdadcc9cd9aeb9199a302139b9a77f708e39e83bfc0b1a1f4a7d4b8" "miniconda" verify_py312 ;; "Linux-x86_64" ) install_script "Miniforge3-24.7.1-1-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.7.1-1/Miniforge3-24.7.1-1-Linux-x86_64.sh#6ae27b78c8cd5ce19987970dc734648ca0bf7ce7a7b3c0e41ab514cfe92add1d" "miniconda" verify_py312 ;; "MacOSX-arm64" ) install_script "Miniforge3-24.7.1-1-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.7.1-1/Miniforge3-24.7.1-1-MacOSX-arm64.sh#4effe540ea3abe9b2b5c1dad897f6186f343c4d6c8c234f8a5a4cb544ed14ec9" "miniconda" verify_py312 ;; "MacOSX-x86_64" ) install_script "Miniforge3-24.7.1-1-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.7.1-1/Miniforge3-24.7.1-1-MacOSX-x86_64.sh#8c880fdb3cb80e1a2ebbfd82cc84b2ab7409aa515843423e8aaa77cd08149053" "miniconda" verify_py312 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniforge3-24.7.1-2000066400000000000000000000031221517431316200267650ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniforge3-24.7.1-2-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.7.1-2/Miniforge3-24.7.1-2-Linux-aarch64.sh#7bf60bce50f57af7ea4500b45eeb401d9350011ab34c9c45f736647d8dba9021" "miniconda" verify_py312 ;; "Linux-ppc64le" ) install_script "Miniforge3-24.7.1-2-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/24.7.1-2/Miniforge3-24.7.1-2-Linux-ppc64le.sh#bb5d14dac73b85da8fbe386cdd3c94022a468563a0c55e6b20a58d82b55a9737" "miniconda" verify_py312 ;; "Linux-x86_64" ) install_script "Miniforge3-24.7.1-2-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.7.1-2/Miniforge3-24.7.1-2-Linux-x86_64.sh#636f7faca2d51ee42b4640ce160c751a46d57621ef4bf14378704c87c5db4fe3" "miniconda" verify_py312 ;; "MacOSX-arm64" ) install_script "Miniforge3-24.7.1-2-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.7.1-2/Miniforge3-24.7.1-2-MacOSX-arm64.sh#cafa7cc6d7baef6ea292880ae46c6c9d28bc1156394a418ceada30118d8b6b9a" "miniconda" verify_py312 ;; "MacOSX-x86_64" ) install_script "Miniforge3-24.7.1-2-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.7.1-2/Miniforge3-24.7.1-2-MacOSX-x86_64.sh#ec6150160703ee622e6520863f68c5130473b69558aed822c4e369e90ef42aad" "miniconda" verify_py312 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniforge3-24.9.0-0000066400000000000000000000031221517431316200267640ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniforge3-24.9.0-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.9.0-0/Miniforge3-24.9.0-0-Linux-aarch64.sh#7fae81c0df8545175a647e09b1372dcbf32a1b7fcc194d0d5ffc9a13be4e4269" "miniconda" verify_py312 ;; "Linux-ppc64le" ) install_script "Miniforge3-24.9.0-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/24.9.0-0/Miniforge3-24.9.0-0-Linux-ppc64le.sh#d442c75fd69359dd8ef444e3ba16a83d88ff437c92669661e2450b0d81575305" "miniconda" verify_py312 ;; "Linux-x86_64" ) install_script "Miniforge3-24.9.0-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.9.0-0/Miniforge3-24.9.0-0-Linux-x86_64.sh#a75b489adb52effd81d15f0e700c0803992fe6a2357e8eb80685a529df7daa48" "miniconda" verify_py312 ;; "MacOSX-arm64" ) install_script "Miniforge3-24.9.0-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.9.0-0/Miniforge3-24.9.0-0-MacOSX-arm64.sh#ac903e9babc2067add5a6619a1e37bbd4ddb9177ba633ecfa63c8e68df6e1fca" "miniconda" verify_py312 ;; "MacOSX-x86_64" ) install_script "Miniforge3-24.9.0-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.9.0-0/Miniforge3-24.9.0-0-MacOSX-x86_64.sh#0b32751fe373819f813490b640c7e83baecf208727fae34a7495d3127f983663" "miniconda" verify_py312 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniforge3-24.9.2-0000066400000000000000000000031221517431316200267660ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniforge3-24.9.2-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.9.2-0/Miniforge3-24.9.2-0-Linux-aarch64.sh#f33ec46c6c9dbcdc9d1101b04dcddff17f4ca54524a9575992e743bbc051d61c" "miniconda" verify_py312 ;; "Linux-ppc64le" ) install_script "Miniforge3-24.9.2-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/24.9.2-0/Miniforge3-24.9.2-0-Linux-ppc64le.sh#0b24b38611b486e3d1615aa778a6252430d54ae6e1210cd2874a3d8e8efd7abe" "miniconda" verify_py312 ;; "Linux-x86_64" ) install_script "Miniforge3-24.9.2-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.9.2-0/Miniforge3-24.9.2-0-Linux-x86_64.sh#ca8c544254c40ae5192eb7db4e133ff4eb9f942a1fec737dba8205ac3f626322" "miniconda" verify_py312 ;; "MacOSX-arm64" ) install_script "Miniforge3-24.9.2-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.9.2-0/Miniforge3-24.9.2-0-MacOSX-arm64.sh#b2ee4415bce51895b74b99de6e83ac0f737fd968052b5b49f79e05b292220084" "miniconda" verify_py312 ;; "MacOSX-x86_64" ) install_script "Miniforge3-24.9.2-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.9.2-0/Miniforge3-24.9.2-0-MacOSX-x86_64.sh#22b9eab7508d464c7d270883e733496beef25520d96c8383b4683f0122ae0222" "miniconda" verify_py312 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniforge3-25.1.1-0000066400000000000000000000024761517431316200267710ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniforge3-25.1.1-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/25.1.1-0/Miniforge3-25.1.1-0-Linux-aarch64.sh#4183d312c6a42edd5bc06be21e92b0d8b9afb720efc37df44f3e5002b35f9d2e" "miniconda" verify_py312 ;; "Linux-x86_64" ) install_script "Miniforge3-25.1.1-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/25.1.1-0/Miniforge3-25.1.1-0-Linux-x86_64.sh#a37495662f55746d92344b309b8b594d6b1a83d7acdd742adaca93ed2e10d32b" "miniconda" verify_py312 ;; "MacOSX-arm64" ) install_script "Miniforge3-25.1.1-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/25.1.1-0/Miniforge3-25.1.1-0-MacOSX-arm64.sh#0f82fec65b7900cbffbda22a1d7a64c278569be241f6f2b87eded9a0f4c54008" "miniconda" verify_py312 ;; "MacOSX-x86_64" ) install_script "Miniforge3-25.1.1-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/25.1.1-0/Miniforge3-25.1.1-0-MacOSX-x86_64.sh#6b0e0e1901d121292edc52acc948d92a473218c1c4d621df9403805fc19f0dff" "miniconda" verify_py312 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniforge3-25.1.1-1000066400000000000000000000031221517431316200267570ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniforge3-25.1.1-1-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/25.1.1-1/Miniforge3-25.1.1-1-Linux-aarch64.sh#2e9889a77e32b322ce4aef26e465ff44f6493de66243faae9528c1d57c2a91e9" "miniconda" verify_py312 ;; "Linux-ppc64le" ) install_script "Miniforge3-25.1.1-1-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/25.1.1-1/Miniforge3-25.1.1-1-Linux-ppc64le.sh#2e47c220ff4c6f074c30ec977bb925861597e588c63dbb8df7c4aebf89c70c38" "miniconda" verify_py312 ;; "Linux-x86_64" ) install_script "Miniforge3-25.1.1-1-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/25.1.1-1/Miniforge3-25.1.1-1-Linux-x86_64.sh#73ccbf68c018df3f30bbe15cd69235b5994d8b32b62d50d9389be89736d0a08d" "miniconda" verify_py312 ;; "MacOSX-arm64" ) install_script "Miniforge3-25.1.1-1-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/25.1.1-1/Miniforge3-25.1.1-1-MacOSX-arm64.sh#288dcf12f3c9a054ba004e4d7b38467653e0084949ded152145079047ae8f94e" "miniconda" verify_py312 ;; "MacOSX-x86_64" ) install_script "Miniforge3-25.1.1-1-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/25.1.1-1/Miniforge3-25.1.1-1-MacOSX-x86_64.sh#02500e29f3956211fcbfeda20756fd5d05c537ff5e6d0f530d9003729105fae2" "miniconda" verify_py312 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniforge3-25.1.1-2000066400000000000000000000031221517431316200267600ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniforge3-25.1.1-2-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/25.1.1-2/Miniforge3-25.1.1-2-Linux-aarch64.sh#99e5b987d6662ce956db33beab94b330a7024561b7f14e79f7ee413100f20927" "miniconda" verify_py312 ;; "Linux-ppc64le" ) install_script "Miniforge3-25.1.1-2-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/25.1.1-2/Miniforge3-25.1.1-2-Linux-ppc64le.sh#47f8bdffef0bb72e31db2bf26764bb64956528f792db33e03e4c414fee69c629" "miniconda" verify_py312 ;; "Linux-x86_64" ) install_script "Miniforge3-25.1.1-2-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/25.1.1-2/Miniforge3-25.1.1-2-Linux-x86_64.sh#d1090d98cbae7ed8a9ae19a92cfba6fc47cdc48c8c9b679df78408dba6820eff" "miniconda" verify_py312 ;; "MacOSX-arm64" ) install_script "Miniforge3-25.1.1-2-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/25.1.1-2/Miniforge3-25.1.1-2-MacOSX-arm64.sh#a85a688a7b5a536974b939e2b774c0e98b1f9417a81ab01d0ae4ff192d98e2ac" "miniconda" verify_py312 ;; "MacOSX-x86_64" ) install_script "Miniforge3-25.1.1-2-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/25.1.1-2/Miniforge3-25.1.1-2-MacOSX-x86_64.sh#172d0445149d85abd266e59d7d829106ab503cd6fba131819c9a1db9daa4e7ea" "miniconda" verify_py312 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniforge3-25.11.0-1000066400000000000000000000031411517431316200270400ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniforge3-25.11.0-1-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/25.11.0-1/Miniforge3-25.11.0-1-Linux-aarch64.sh#43a3783f9e121088f1c92b131b4305b9ebf159424ad2543dfcfc0f1952b5e127" "miniconda" verify_py312 ;; "Linux-ppc64le" ) install_script "Miniforge3-25.11.0-1-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/25.11.0-1/Miniforge3-25.11.0-1-Linux-ppc64le.sh#8fb7a41bd2682381c48c7820608918e7d56f5390bc3be5705a0c1c536f607963" "miniconda" verify_py312 ;; "Linux-x86_64" ) install_script "Miniforge3-25.11.0-1-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/25.11.0-1/Miniforge3-25.11.0-1-Linux-x86_64.sh#be1bad9d4e67a8753eb76fb4940e9a08036786675c7adf060627e55791bf110d" "miniconda" verify_py312 ;; "MacOSX-arm64" ) install_script "Miniforge3-25.11.0-1-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/25.11.0-1/Miniforge3-25.11.0-1-MacOSX-arm64.sh#b4992687abec8c4863fc079382509f0e07e4221fb9e185d7f6a3860449b4e46d" "miniconda" verify_py312 ;; "MacOSX-x86_64" ) install_script "Miniforge3-25.11.0-1-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/25.11.0-1/Miniforge3-25.11.0-1-MacOSX-x86_64.sh#7b78e8d20557fcc946585290a6177dc3d2e7d1b07f382175aad24b6355b21832" "miniconda" verify_py312 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniforge3-25.3.0-1000066400000000000000000000031221517431316200267600ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniforge3-25.3.0-1-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/25.3.0-1/Miniforge3-25.3.0-1-Linux-aarch64.sh#e4459077f78a9a1fbaa0cd6812897623360ea8ba2e73094ed5df5b662cbb2491" "miniconda" verify_py312 ;; "Linux-ppc64le" ) install_script "Miniforge3-25.3.0-1-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/25.3.0-1/Miniforge3-25.3.0-1-Linux-ppc64le.sh#a5f77d8d45b530b6e583b6a9bd5aa33ea70b5b77bd7c61728e12bf11a8137a5c" "miniconda" verify_py312 ;; "Linux-x86_64" ) install_script "Miniforge3-25.3.0-1-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/25.3.0-1/Miniforge3-25.3.0-1-Linux-x86_64.sh#defd7ea7e823257900d404dcf734762359e13bfff451f1bfc7cafa0f7c110247" "miniconda" verify_py312 ;; "MacOSX-arm64" ) install_script "Miniforge3-25.3.0-1-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/25.3.0-1/Miniforge3-25.3.0-1-MacOSX-arm64.sh#141da48a332295b34cd9207efeb7a0dbc7711c2de26bfaf2b9c3b7ac3ce36e73" "miniconda" verify_py312 ;; "MacOSX-x86_64" ) install_script "Miniforge3-25.3.0-1-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/25.3.0-1/Miniforge3-25.3.0-1-MacOSX-x86_64.sh#18eac9db50d23d6e84767bd170092759430c03ae66a928b3adf48d5c60e1614c" "miniconda" verify_py312 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniforge3-25.3.0-2000066400000000000000000000031221517431316200267610ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniforge3-25.3.0-2-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/25.3.0-2/Miniforge3-25.3.0-2-Linux-aarch64.sh#79a8d3a5f8d3681855545d7f623443e30079e4d26732956ff2f07632e8d2a9ef" "miniconda" verify_py312 ;; "Linux-ppc64le" ) install_script "Miniforge3-25.3.0-2-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/25.3.0-2/Miniforge3-25.3.0-2-Linux-ppc64le.sh#1ebc02ff29e346c4dc987cf2df52af6e9e57958c82df62c8839dfbdbf2366222" "miniconda" verify_py312 ;; "Linux-x86_64" ) install_script "Miniforge3-25.3.0-2-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/25.3.0-2/Miniforge3-25.3.0-2-Linux-x86_64.sh#40cbe16854f3a346cdc5ce6a4bcbbe25973172fa8117a5e6168038173890054b" "miniconda" verify_py312 ;; "MacOSX-arm64" ) install_script "Miniforge3-25.3.0-2-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/25.3.0-2/Miniforge3-25.3.0-2-MacOSX-arm64.sh#e658f618ef81473ae71f056b19a83224d147e6b54cd2c6477bc130345d9385b3" "miniconda" verify_py312 ;; "MacOSX-x86_64" ) install_script "Miniforge3-25.3.0-2-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/25.3.0-2/Miniforge3-25.3.0-2-MacOSX-x86_64.sh#86c557f5c2517c9ade892c671e41df5cf3f3b8bb13bc4738dc6bee928d08597d" "miniconda" verify_py312 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniforge3-25.3.0-3000066400000000000000000000031221517431316200267620ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniforge3-25.3.0-3-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/25.3.0-3/Miniforge3-25.3.0-3-Linux-aarch64.sh#ac89f17b0eec4e98d38a53d1ae688e0f22c77d8ea5b5f008c2455e90ef095339" "miniconda" verify_py312 ;; "Linux-ppc64le" ) install_script "Miniforge3-25.3.0-3-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/25.3.0-3/Miniforge3-25.3.0-3-Linux-ppc64le.sh#1ce4084983b899d2f895bd13085ba20ff787fbcc2f2c865c618bffc97dd877b8" "miniconda" verify_py312 ;; "Linux-x86_64" ) install_script "Miniforge3-25.3.0-3-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/25.3.0-3/Miniforge3-25.3.0-3-Linux-x86_64.sh#1b57f8cb991982063f79b56176881093abb1dc76d73fda32102afde60585b5a1" "miniconda" verify_py312 ;; "MacOSX-arm64" ) install_script "Miniforge3-25.3.0-3-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/25.3.0-3/Miniforge3-25.3.0-3-MacOSX-arm64.sh#16205127ac2b5701881636229b7fe42e1f961007513b8673f8064da331e496a0" "miniconda" verify_py312 ;; "MacOSX-x86_64" ) install_script "Miniforge3-25.3.0-3-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/25.3.0-3/Miniforge3-25.3.0-3-MacOSX-x86_64.sh#c562e11d8f9caca3dcfb9ba6d5043b9238975d271751e12c3fbfc2a472b4b8fb" "miniconda" verify_py312 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniforge3-25.3.1-0000066400000000000000000000031221517431316200267600ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniforge3-25.3.1-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/25.3.1-0/Miniforge3-25.3.1-0-Linux-aarch64.sh#a57c9e3d6c0c449c0283fd07e0bfa30d95eb8d547a14e8dc06c606405d01a7f0" "miniconda" verify_py312 ;; "Linux-ppc64le" ) install_script "Miniforge3-25.3.1-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/25.3.1-0/Miniforge3-25.3.1-0-Linux-ppc64le.sh#87eb7d349a0ed3ba964c5263d90663e3dff93f252305b7bf24c12e714117bdfe" "miniconda" verify_py312 ;; "Linux-x86_64" ) install_script "Miniforge3-25.3.1-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/25.3.1-0/Miniforge3-25.3.1-0-Linux-x86_64.sh#376b160ed8130820db0ab0f3826ac1fc85923647f75c1b8231166e3d559ab768" "miniconda" verify_py312 ;; "MacOSX-arm64" ) install_script "Miniforge3-25.3.1-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/25.3.1-0/Miniforge3-25.3.1-0-MacOSX-arm64.sh#d9eabd1868030589a1d74017b8723b01cf81b5fec1b9da8021b6fa44be7bbeae" "miniconda" verify_py312 ;; "MacOSX-x86_64" ) install_script "Miniforge3-25.3.1-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/25.3.1-0/Miniforge3-25.3.1-0-MacOSX-x86_64.sh#6c09a3550bb65bdb6d3db6f6c2b890b987b57189f3b71c67a5af49943d2522e8" "miniconda" verify_py312 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniforge3-25.9.1-0000066400000000000000000000031221517431316200267660ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniforge3-25.9.1-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/25.9.1-0/Miniforge3-25.9.1-0-Linux-aarch64.sh#b2b223680807e8f407b67603f6a5a224452b7f0ce177bc6719f870040c3bfa98" "miniconda" verify_py312 ;; "Linux-ppc64le" ) install_script "Miniforge3-25.9.1-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/25.9.1-0/Miniforge3-25.9.1-0-Linux-ppc64le.sh#89a6b1b761a94396921967939cfc0881efe08bda48fe9b40bbf4a134f8fcdd84" "miniconda" verify_py312 ;; "Linux-x86_64" ) install_script "Miniforge3-25.9.1-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/25.9.1-0/Miniforge3-25.9.1-0-Linux-x86_64.sh#07f64c1d908ae036e9f6a81f97704899311c0ae677d83980d664b9781d4cc5fc" "miniconda" verify_py312 ;; "MacOSX-arm64" ) install_script "Miniforge3-25.9.1-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/25.9.1-0/Miniforge3-25.9.1-0-MacOSX-arm64.sh#414e21f6094fbf6cd69ad50c47d4630b5523e6b53fd6ff7df5fd9d0ee502eeff" "miniconda" verify_py312 ;; "MacOSX-x86_64" ) install_script "Miniforge3-25.9.1-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/25.9.1-0/Miniforge3-25.9.1-0-MacOSX-x86_64.sh#f12e25c92c9942219b6dd42d3cf0a2513d337b37d2954a8a84bee3d859632f41" "miniconda" verify_py312 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniforge3-26.1.0-0000066400000000000000000000031221517431316200267560ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniforge3-26.1.0-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/26.1.0-0/Miniforge3-26.1.0-0-Linux-aarch64.sh#8baf8844ecf13e1458f81659ea286251d04b2d5ed90040efb77f158adedb2d95" "miniconda" verify_py312 ;; "Linux-ppc64le" ) install_script "Miniforge3-26.1.0-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/26.1.0-0/Miniforge3-26.1.0-0-Linux-ppc64le.sh#902190ad825b74b78a6a2816364453bb4d6989a599172aa3785d4afd0ebeb917" "miniconda" verify_py312 ;; "Linux-x86_64" ) install_script "Miniforge3-26.1.0-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/26.1.0-0/Miniforge3-26.1.0-0-Linux-x86_64.sh#127b5e14cfe6c83b787f624487cdc2168645ed82fdca1b0c1937caa086aed6d5" "miniconda" verify_py312 ;; "MacOSX-arm64" ) install_script "Miniforge3-26.1.0-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/26.1.0-0/Miniforge3-26.1.0-0-MacOSX-arm64.sh#219b9e0d733fa2086d7d094a5ed830db146ccf22ae32c330b2da5df5c9604b78" "miniconda" verify_py312 ;; "MacOSX-x86_64" ) install_script "Miniforge3-26.1.0-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/26.1.0-0/Miniforge3-26.1.0-0-MacOSX-x86_64.sh#90a41a28ad0221fbaf728ca1267f6243638a56c579fba8a1b970edfee4062d53" "miniconda" verify_py312 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniforge3-26.1.1-2000066400000000000000000000042031517431316200267620ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniforge3-26.1.1-2-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/26.1.1-2/Miniforge3-26.1.1-2-Linux-aarch64.sh#6525bfb24940c5e063ed14f2d840968b0fc4152a3f4edd253b7a1049a15656e7" "miniconda" verify_py312 ;; "Linux-ppc64le" ) install_script "Miniforge3-26.1.1-2-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/26.1.1-2/Miniforge3-26.1.1-2-Linux-ppc64le.sh#637cf03310343d199bcd7725aab54f59666fb1694bb99fc841973203da9c3f25" "miniconda" verify_py312 ;; "Linux-x86_64" ) install_script "Miniforge3-26.1.1-2-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/26.1.1-2/Miniforge3-26.1.1-2-Linux-x86_64.sh#831421c1f32d8b510e0ef7f261aaabdbf567bdbba37373432d492621b824ab1f" "miniconda" verify_py312 ;; "MacOSX-arm64.pkg" ) install_script "Miniforge3-26.1.1-2-MacOSX-arm64.pkg" "https://github.com/conda-forge/miniforge/releases/download/26.1.1-2/Miniforge3-26.1.1-2-MacOSX-arm64.pkg#2cf96ab02ab575028bfe2c0d0f8ee8e7c39953588042189507d8f99c53971baf" "miniconda" verify_py312 ;; "MacOSX-arm64" ) install_script "Miniforge3-26.1.1-2-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/26.1.1-2/Miniforge3-26.1.1-2-MacOSX-arm64.sh#ed60de20689ab24dd646b9ec4b06762d35f8c0043026778699ba7c9f0816492c" "miniconda" verify_py312 ;; "MacOSX-x86_64.pkg" ) install_script "Miniforge3-26.1.1-2-MacOSX-x86_64.pkg" "https://github.com/conda-forge/miniforge/releases/download/26.1.1-2/Miniforge3-26.1.1-2-MacOSX-x86_64.pkg#5b7e555b22515debaf049b7cfe0eec73e0c8dc71ea1ba773b7132c852277aa72" "miniconda" verify_py312 ;; "MacOSX-x86_64" ) install_script "Miniforge3-26.1.1-2-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/26.1.1-2/Miniforge3-26.1.1-2-MacOSX-x86_64.sh#74f3e5cdb70bf0ff9bab3e4ba8d35aee5b46bf7eebca94202cbd8d46e16ecf77" "miniconda" verify_py312 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniforge3-26.1.1-3000066400000000000000000000042031517431316200267630ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniforge3-26.1.1-3-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/26.1.1-3/Miniforge3-26.1.1-3-Linux-aarch64.sh#83280e4ee71a5bd547d6b318f96e9ababe1054911ff6cc2b8801ce5493fe67e5" "miniconda" verify_py312 ;; "Linux-ppc64le" ) install_script "Miniforge3-26.1.1-3-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/26.1.1-3/Miniforge3-26.1.1-3-Linux-ppc64le.sh#5711fd69219bc9746389ef751ee4c2549d40d9b1626a0ea93cc63db1a739eee6" "miniconda" verify_py312 ;; "Linux-x86_64" ) install_script "Miniforge3-26.1.1-3-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/26.1.1-3/Miniforge3-26.1.1-3-Linux-x86_64.sh#b25b828b702df4dd2a6d24d4eb56cfa912471dd8e3342cde2c3d86fe3dc2d870" "miniconda" verify_py312 ;; "MacOSX-arm64.pkg" ) install_script "Miniforge3-26.1.1-3-MacOSX-arm64.pkg" "https://github.com/conda-forge/miniforge/releases/download/26.1.1-3/Miniforge3-26.1.1-3-MacOSX-arm64.pkg#864d4ba41bae5ad85d41d00a163535ea4b8b1ab7a4fd3b03f875c36c0c323b80" "miniconda" verify_py312 ;; "MacOSX-arm64" ) install_script "Miniforge3-26.1.1-3-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/26.1.1-3/Miniforge3-26.1.1-3-MacOSX-arm64.sh#38e73713bc504e11cf2a70f8bc01de4a778c547e9191e682606ba76fa4397fd9" "miniconda" verify_py312 ;; "MacOSX-x86_64.pkg" ) install_script "Miniforge3-26.1.1-3-MacOSX-x86_64.pkg" "https://github.com/conda-forge/miniforge/releases/download/26.1.1-3/Miniforge3-26.1.1-3-MacOSX-x86_64.pkg#34cb544a2473f2b4755bdd361520114f20a61284bcdf3c2b124a392a1aa9923f" "miniconda" verify_py312 ;; "MacOSX-x86_64" ) install_script "Miniforge3-26.1.1-3-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/26.1.1-3/Miniforge3-26.1.1-3-MacOSX-x86_64.sh#d81e77d8f3c104c64e0ab27256f901e58ac9965288ccec774db87bf1a98a03e7" "miniconda" verify_py312 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniforge3-4.10000066400000000000000000000026361517431316200264700ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-ppc64le" ) install_script "Miniforge3-4.10.0-0-Linux-ppc64le" "https://github.com/conda-forge/miniforge/releases/download/4.10.0-0/Miniforge3-4.10.0-0-Linux-ppc64le.sh#cb72e16906f025bbc979b5e72b494722" "miniconda" verify_py38 ;; "Linux-x86_64" ) install_script "Miniforge3-4.10.0-0-Linux-x86_64" "https://github.com/conda-forge/miniforge/releases/download/4.10.0-0/Miniforge3-4.10.0-0-Linux-x86_64.sh#3db11e33e22a78e2d3371acc883625df" "miniconda" verify_py38 ;; "Linux-aarch64" ) install_script "Miniforge3-4.10.0-0-Linux-aarch64" "https://github.com/conda-forge/miniforge/releases/download/4.10.0-0/Miniforge3-4.10.0-0-Linux-aarch64.sh#64ec2e626c1c71332a73081fe482d08e" "miniconda" verify_py38 ;; "MacOSX-arm64" ) install_script "Miniforge3-4.10.0-0-MacOSX-arm64" "https://github.com/conda-forge/miniforge/releases/download/4.10.0-0/Miniforge3-4.10.0-0-MacOSX-arm64.sh#a44e4306922989e49a888c4dd2ad6263" "miniconda" verify_py39 ;; "MacOSX-x86_64" ) install_script "Miniforge3-4.10.0-0-MacOSX-x86_64" "https://github.com/conda-forge/miniforge/releases/download/4.10.0-0/Miniforge3-4.10.0-0-MacOSX-x86_64.sh#76a212a23d14e3f027d44fe6837e4a7d" "miniconda" verify_py38 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniforge3-4.10.1-1000066400000000000000000000026361517431316200267650ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-ppc64le" ) install_script "Miniforge3-4.10.1-1-Linux-ppc64le" "https://github.com/conda-forge/miniforge/releases/download/4.10.1-1/Miniforge3-4.10.1-1-Linux-ppc64le.sh#37743c08b9394c6345d538f3952a1640" "miniconda" verify_py38 ;; "Linux-x86_64" ) install_script "Miniforge3-4.10.1-1-Linux-x86_64" "https://github.com/conda-forge/miniforge/releases/download/4.10.1-1/Miniforge3-4.10.1-1-Linux-x86_64.sh#e1f2f1f0fe54d3aab5585238e5517ac5" "miniconda" verify_py38 ;; "Linux-aarch64" ) install_script "Miniforge3-4.10.1-1-Linux-aarch64" "https://github.com/conda-forge/miniforge/releases/download/4.10.1-1/Miniforge3-4.10.1-1-Linux-aarch64.sh#64ec2e626c1c71332a73081fe482d08e" "miniconda" verify_py38 ;; "MacOSX-arm64" ) install_script "Miniforge3-4.10.1-1-MacOSX-arm64" "https://github.com/conda-forge/miniforge/releases/download/4.10.1-1/Miniforge3-4.10.1-1-MacOSX-arm64.sh#888fac13d06ae4c4a79eaa9c6ab79473" "miniconda" verify_py39 ;; "MacOSX-x86_64" ) install_script "Miniforge3-4.10.1-1-MacOSX-x86_64" "https://github.com/conda-forge/miniforge/releases/download/4.10.1-1/Miniforge3-4.10.1-1-MacOSX-x86_64.sh#792fa7d76d0fa02304ec0b4fa2786352" "miniconda" verify_py38 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniforge3-4.10.1-3000066400000000000000000000030761517431316200267660ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-ppc64le" ) install_script "Miniforge3-4.10.1-3-Linux-ppc64le" "https://github.com/conda-forge/miniforge/releases/download/4.10.1-3/Miniforge3-4.10.1-3-Linux-ppc64le.sh#650083e39c5b3910600debfce07a3644b5906621be72d16847d1ca05f4f5b4f8" "miniconda" verify_py38 ;; "Linux-x86_64" ) install_script "Miniforge3-4.10.1-3-Linux-x86_64" "https://github.com/conda-forge/miniforge/releases/download/4.10.1-3/Miniforge3-4.10.1-3-Linux-x86_64.sh#0ab2d494557ce8dfb4344bd960eb98c92d02f25d174c77029a459b20884e0e26" "miniconda" verify_py38 ;; "Linux-aarch64" ) install_script "Miniforge3-4.10.1-3-Linux-aarch64" "https://github.com/conda-forge/miniforge/releases/download/4.10.1-3/Miniforge3-4.10.1-3-Linux-aarch64.sh#8bb5e5885c4b4e9bed0621740a40ceb428c4894b339050227b25690181da2794" "miniconda" verify_py38 ;; "MacOSX-arm64" ) install_script "Miniforge3-4.10.1-3-MacOSX-arm64" "https://github.com/conda-forge/miniforge/releases/download/4.10.1-3/Miniforge3-4.10.1-3-MacOSX-arm64.sh#ea7fd5565debe13f484f15236651da88f0137e99b27c36d9001373f13621e393" "miniconda" verify_py39 ;; "MacOSX-x86_64" ) install_script "Miniforge3-4.10.1-3-MacOSX-x86_64" "https://github.com/conda-forge/miniforge/releases/download/4.10.1-3/Miniforge3-4.10.1-3-MacOSX-x86_64.sh#1b85ece22e2d35565db90dfc9121e15fcd4eb179e948983662157e7a9fad2201" "miniconda" verify_py38 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniforge3-4.10.1-5000066400000000000000000000030761517431316200267700ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-ppc64le" ) install_script "Miniforge3-4.10.1-5-Linux-ppc64le" "https://github.com/conda-forge/miniforge/releases/download/4.10.1-5/Miniforge3-4.10.1-5-Linux-ppc64le.sh#0b23d9c25582dbd2cf8171366f5fb0ef5d5e7f8262eb670094f33400e88f3726" "miniconda" verify_py38 ;; "Linux-x86_64" ) install_script "Miniforge3-4.10.1-5-Linux-x86_64" "https://github.com/conda-forge/miniforge/releases/download/4.10.1-5/Miniforge3-4.10.1-5-Linux-x86_64.sh#f47637e899258d4fa568aa866c37ecf19a2dacc50fa64a5ebc65443ccdf73243" "miniconda" verify_py38 ;; "Linux-aarch64" ) install_script "Miniforge3-4.10.1-5-Linux-aarch64" "https://github.com/conda-forge/miniforge/releases/download/4.10.1-5/Miniforge3-4.10.1-5-Linux-aarch64.sh#d582c3bf289dc5c2f86dde9182b27e49b095d00da40842f3e379a113b12ce7cb" "miniconda" verify_py38 ;; "MacOSX-arm64" ) install_script "Miniforge3-4.10.1-5-MacOSX-arm64" "https://github.com/conda-forge/miniforge/releases/download/4.10.1-5/Miniforge3-4.10.1-5-MacOSX-arm64.sh#29fee39691dfe84cf3222c61fce0c8357d933eefcc0d49041b48153efe91f345" "miniconda" verify_py39 ;; "MacOSX-x86_64" ) install_script "Miniforge3-4.10.1-5-MacOSX-x86_64" "https://github.com/conda-forge/miniforge/releases/download/4.10.1-5/Miniforge3-4.10.1-5-MacOSX-x86_64.sh#f67dfc4d5e3dea173e31267eb0890733098f0fd2d42944282d17f27a1bc3f8cc" "miniconda" verify_py38 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniforge3-4.10.2-0000066400000000000000000000031221517431316200267540ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniforge3-4.10.2-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.2-0/Miniforge3-4.10.2-0-Linux-aarch64.sh#eb0a303e716d795b64a4ab056e3c03dae7760c3a3275312419051d272f5d0307" "miniconda" verify_py310 ;; "Linux-ppc64le" ) install_script "Miniforge3-4.10.2-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.2-0/Miniforge3-4.10.2-0-Linux-ppc64le.sh#1a55c5f9ee8c49ce0368b77acb4964a8b060ca57d951f68adb98b28c3ed5c145" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Miniforge3-4.10.2-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.2-0/Miniforge3-4.10.2-0-Linux-x86_64.sh#d2d66f09811c0d846ffb2f04c1827854aa4333624a0dc841389230291d944c30" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Miniforge3-4.10.2-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.2-0/Miniforge3-4.10.2-0-MacOSX-arm64.sh#36d4a12254c90bdacd3c2a757c8c257dffe3c67754c44372d446c2a54e03cebc" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Miniforge3-4.10.2-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.2-0/Miniforge3-4.10.2-0-MacOSX-x86_64.sh#60aaecd1681633e84bad0520479e938a0a0c671fa7d78d2aa607d4807c670975" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniforge3-4.10.3-0000066400000000000000000000031221517431316200267550ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniforge3-4.10.3-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-0/Miniforge3-4.10.3-0-Linux-aarch64.sh#4aff1bfe62b2974a418937bd4687316acef46e461908332159b2f68cb95f6d67" "miniconda" verify_py310 ;; "Linux-ppc64le" ) install_script "Miniforge3-4.10.3-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-0/Miniforge3-4.10.3-0-Linux-ppc64le.sh#b854e26db0635846ad4065c54de9d8cef7a97050d7e1303923c5ba18ea9b4dd1" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Miniforge3-4.10.3-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-0/Miniforge3-4.10.3-0-Linux-x86_64.sh#c22bd3f494ac12f3ef2f146d7625ab140272670f7b4d606af8ff50aac3a0dae2" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Miniforge3-4.10.3-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-0/Miniforge3-4.10.3-0-MacOSX-arm64.sh#14e0ce6a16c7de8372d0d59cdf279b53601f62b14a073d0824c5ee7384005a2f" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Miniforge3-4.10.3-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-0/Miniforge3-4.10.3-0-MacOSX-x86_64.sh#e405b2a2be60b6b408569e4b7f6e39c87c3b579235e92dd58615fe708f18d036" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniforge3-4.10.3-1000066400000000000000000000031221517431316200267560ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniforge3-4.10.3-1-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-1/Miniforge3-4.10.3-1-Linux-aarch64.sh#ebb7b2548f3908ccc1b3c39bc41e2a3dbe19b4d266e844bc929147c39c8a14d3" "miniconda" verify_py310 ;; "Linux-ppc64le" ) install_script "Miniforge3-4.10.3-1-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-1/Miniforge3-4.10.3-1-Linux-ppc64le.sh#cf20609570a5a716e7370a836ee895cbc4e7ca2683a598d32cc0573fddd65e66" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Miniforge3-4.10.3-1-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-1/Miniforge3-4.10.3-1-Linux-x86_64.sh#303d65289f600fa4c85fe2b0fef9bb0848ec544a75a9c3079607d847918f7023" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Miniforge3-4.10.3-1-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-1/Miniforge3-4.10.3-1-MacOSX-arm64.sh#823f61563947fd9ff92970f4e2323f2f0b61fe5f3cfb75cc7579a1c6169f8853" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Miniforge3-4.10.3-1-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-1/Miniforge3-4.10.3-1-MacOSX-x86_64.sh#8ed6871bbd0b24f66b2d87fd88cbcd0854142e5cf1447de5f5f246884ef9c846" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniforge3-4.10.3-10000066400000000000000000000031151517431316200270400ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-ppc64le" ) install_script "Miniforge3-4.10.3-10-Linux-ppc64le" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-10/Miniforge3-4.10.3-10-Linux-ppc64le.sh#8df85d4af3d2d24f86bb6784d4c196b770b7b9c0be8917d79aec9e08f517d0e9" "miniconda" verify_py38 ;; "Linux-x86_64" ) install_script "Miniforge3-4.10.3-10-Linux-x86_64" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-10/Miniforge3-4.10.3-10-Linux-x86_64.sh#8ed8cd582d16cd58e0ccd87e692fbe71de6365a51678b579b2f40d8d6f6e5771" "miniconda" verify_py38 ;; "Linux-aarch64" ) install_script "Miniforge3-4.10.3-10-Linux-aarch64" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-10/Miniforge3-4.10.3-10-Linux-aarch64.sh#b2d510c6cd0aac3964a7a7838a7f7376b804fbdd0ba04909ece53f883f624233" "miniconda" verify_py38 ;; "MacOSX-arm64" ) install_script "Miniforge3-4.10.3-10-MacOSX-arm64" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-10/Miniforge3-4.10.3-10-MacOSX-arm64.sh#bd4d59ead779a6e2d9af69fd8cdcaac8e1446191c59ab446ae8547a1aecd75b7" "miniconda" verify_py39 ;; "MacOSX-x86_64" ) install_script "Miniforge3-4.10.3-10-MacOSX-x86_64" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-10/Miniforge3-4.10.3-10-MacOSX-x86_64.sh#7d325a5370664ec2fe1c09c3066c22fd905431f338c7eed31ad7e14c7ce4bd83" "miniconda" verify_py38 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniforge3-4.10.3-2000066400000000000000000000031221517431316200267570ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniforge3-4.10.3-2-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-2/Miniforge3-4.10.3-2-Linux-aarch64.sh#11705546b6e6f7052a83992b7505f74e7cb51b5a519ddccbd9eabfad9451bfee" "miniconda" verify_py310 ;; "Linux-ppc64le" ) install_script "Miniforge3-4.10.3-2-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-2/Miniforge3-4.10.3-2-Linux-ppc64le.sh#da8c5a43f941155aa937bb00068e4ecc5651fe3a9ea0eddd9c40e339eb5fa6d7" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Miniforge3-4.10.3-2-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-2/Miniforge3-4.10.3-2-Linux-x86_64.sh#8af640a77047b493d37b4e21302387abb6a62e0b3f942416c525e60dde019c7e" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Miniforge3-4.10.3-2-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-2/Miniforge3-4.10.3-2-MacOSX-arm64.sh#74fdfc71022af33ef671c9fe08f917f0e5d4ff5e69b1ef1a02b72f12df146d45" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Miniforge3-4.10.3-2-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-2/Miniforge3-4.10.3-2-MacOSX-x86_64.sh#ac68224f726bc2dc38502d6aaf605af976d29cc3fbaaca3c948b1fd5271e8235" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniforge3-4.10.3-3000066400000000000000000000031221517431316200267600ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniforge3-4.10.3-3-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-3/Miniforge3-4.10.3-3-Linux-aarch64.sh#ca6aa614c217c923bbb6fb48246f356b013697629bcf7d4d3b71c8813910ff94" "miniconda" verify_py310 ;; "Linux-ppc64le" ) install_script "Miniforge3-4.10.3-3-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-3/Miniforge3-4.10.3-3-Linux-ppc64le.sh#84572443a08a640a0308f3f80a3a98431241eed646c26398144b2c8042524006" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Miniforge3-4.10.3-3-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-3/Miniforge3-4.10.3-3-Linux-x86_64.sh#12c83e744bf52564445cae0281bc7870b24c77257ac9c72986cbb1443e9b6d0a" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Miniforge3-4.10.3-3-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-3/Miniforge3-4.10.3-3-MacOSX-arm64.sh#5f5906dec9ba56fe4cbf1a50b9a573629f4af8f3f166785d114a8af65b9c78a3" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Miniforge3-4.10.3-3-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-3/Miniforge3-4.10.3-3-MacOSX-x86_64.sh#3242d65bae12edf2d7cd29ed466fc72cb66f3f031f621ac360ab8968e4d29974" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniforge3-4.10.3-4000066400000000000000000000031221517431316200267610ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniforge3-4.10.3-4-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-4/Miniforge3-4.10.3-4-Linux-aarch64.sh#1237209ed8145efc05dcc4e97e367811d569154609fffcc22ebcb08b0e0392d2" "miniconda" verify_py310 ;; "Linux-ppc64le" ) install_script "Miniforge3-4.10.3-4-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-4/Miniforge3-4.10.3-4-Linux-ppc64le.sh#591825a5b5f690bb74759c0f93c347f0ae1f9b30057609d8205a11b2b7c21902" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Miniforge3-4.10.3-4-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-4/Miniforge3-4.10.3-4-Linux-x86_64.sh#13626e6d43546d0b8c47be37b34d2c2ba5e0a518066b0659addb4afcc30a70be" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Miniforge3-4.10.3-4-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-4/Miniforge3-4.10.3-4-MacOSX-arm64.sh#0079a2172ff9cc92d6a0f30d4269d7e27ef77f5074525c31fb46db57f9ccaefe" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Miniforge3-4.10.3-4-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-4/Miniforge3-4.10.3-4-MacOSX-x86_64.sh#21be593ec3a3d917862bf452a78bf4c9dddb9b360346562b3c19c21efd892d77" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniforge3-4.10.3-5000066400000000000000000000031221517431316200267620ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniforge3-4.10.3-5-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-5/Miniforge3-4.10.3-5-Linux-aarch64.sh#acd5f31fd2bdd9ebd996a6d5b36fcc6a8ab5d0b3820cbc47d660afa2cf0bd3ba" "miniconda" verify_py310 ;; "Linux-ppc64le" ) install_script "Miniforge3-4.10.3-5-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-5/Miniforge3-4.10.3-5-Linux-ppc64le.sh#e018e8a7c41e1871b456bc27efbc0e3a4093d3e6ba84cb5ea94f6d0601b3e27a" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Miniforge3-4.10.3-5-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-5/Miniforge3-4.10.3-5-Linux-x86_64.sh#5f143112b6c9533c550b447cc01f7313a86b6b88b92632791bcb4320e57f9af6" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Miniforge3-4.10.3-5-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-5/Miniforge3-4.10.3-5-MacOSX-arm64.sh#77989d3186c21ec8de9ff22ef076e815c465c026cef087601b2bec5d02cfd889" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Miniforge3-4.10.3-5-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-5/Miniforge3-4.10.3-5-MacOSX-x86_64.sh#6f324566af60279518c2d03ffd69f605b335f87f72e6e7e4c2f383808e41e212" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniforge3-4.10.3-6000066400000000000000000000031221517431316200267630ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniforge3-4.10.3-6-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-6/Miniforge3-4.10.3-6-Linux-aarch64.sh#a79cd78324bb42cde5150d2194744205b9ebae1ebab06c50c3205e4846efb9e0" "miniconda" verify_py310 ;; "Linux-ppc64le" ) install_script "Miniforge3-4.10.3-6-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-6/Miniforge3-4.10.3-6-Linux-ppc64le.sh#d3624b1d7a715a6089c309b9a593a5c241a1d959d00b037c074d3080be587b27" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Miniforge3-4.10.3-6-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-6/Miniforge3-4.10.3-6-Linux-x86_64.sh#8e76a21311e4fcc9ee8497b72717b276bb960e0151c5b27816502f14bac6303f" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Miniforge3-4.10.3-6-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-6/Miniforge3-4.10.3-6-MacOSX-arm64.sh#4ba889103eb119e9d12e45b5fba3bcdef45877d9a886657f14f1ebe71a9b5a63" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Miniforge3-4.10.3-6-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-6/Miniforge3-4.10.3-6-MacOSX-x86_64.sh#eabb50e2594d55eeb2a74fa05a919be876ec364e8064e1623ab096f39d6b6dd1" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniforge3-4.10.3-7000066400000000000000000000031221517431316200267640ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniforge3-4.10.3-7-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-7/Miniforge3-4.10.3-7-Linux-aarch64.sh#d597961defe8c7889f3e924d0dc7624fab2c8845abccdd8ffa8da8018ff3dc6e" "miniconda" verify_py310 ;; "Linux-ppc64le" ) install_script "Miniforge3-4.10.3-7-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-7/Miniforge3-4.10.3-7-Linux-ppc64le.sh#8825827240c0d06413876055bf3a04d8704f0e5ac773692a352502862dce7aa5" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Miniforge3-4.10.3-7-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-7/Miniforge3-4.10.3-7-Linux-x86_64.sh#4de9b7dcc9b2761136f4a7a42a8b2ea06ae2ebc61d865c9fca0db3d6c90b569d" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Miniforge3-4.10.3-7-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-7/Miniforge3-4.10.3-7-MacOSX-arm64.sh#3cd1f11743f936ba522709eb7a173930c299ac681671a909b664222329a56290" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Miniforge3-4.10.3-7-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-7/Miniforge3-4.10.3-7-MacOSX-x86_64.sh#a25c1b381b20873ed856ce675a7a2ccf48f1d6782a5cdce9f06496e6ffa7883f" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniforge3-4.10.3-8000066400000000000000000000014311517431316200267660ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "MacOSX-arm64" ) install_script "Miniforge3-4.10.3-8-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-8/Miniforge3-4.10.3-8-MacOSX-arm64.sh#ed1f245d8effb463c9bd5d1cde034e7e291684e0668885a87deb34303dafced5" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Miniforge3-4.10.3-8-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-8/Miniforge3-4.10.3-8-MacOSX-x86_64.sh#9c123f45da81878b3b3f221dcb7595f6420cac0310235316a7deba93cf12bbe3" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniforge3-4.10.3-9000066400000000000000000000031221517431316200267660ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniforge3-4.10.3-9-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-9/Miniforge3-4.10.3-9-Linux-aarch64.sh#33850a3806c61c2f0c27a4619a49a2ab7c27691b65b64ea764b57b3cc572efa1" "miniconda" verify_py310 ;; "Linux-ppc64le" ) install_script "Miniforge3-4.10.3-9-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-9/Miniforge3-4.10.3-9-Linux-ppc64le.sh#7192460dcf7d309ebe0c2e53f0034c86b097de4f1ebf669f677d57886b9b48de" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Miniforge3-4.10.3-9-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-9/Miniforge3-4.10.3-9-Linux-x86_64.sh#387ed0e31a0e16def1f4b602c8a3633f707c53fff7cbf2ff56175953d0c6f7e7" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Miniforge3-4.10.3-9-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-9/Miniforge3-4.10.3-9-MacOSX-arm64.sh#68196959ddc966046935ab80fb0fda73675914e55e96764e0358f7eb4a4e7714" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Miniforge3-4.10.3-9-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-9/Miniforge3-4.10.3-9-MacOSX-x86_64.sh#86ba79bba787ea943d11810b8f7b393a3ce5d421cd31528436c3ffa17eb062ed" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniforge3-4.11.0-0000066400000000000000000000031221517431316200267530ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniforge3-4.11.0-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.11.0-0/Miniforge3-4.11.0-0-Linux-aarch64.sh#3c4728ece94f005a0edfcb45f930bf2fd4acdaafdee2692006b0322ca6c44ca7" "miniconda" verify_py310 ;; "Linux-ppc64le" ) install_script "Miniforge3-4.11.0-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/4.11.0-0/Miniforge3-4.11.0-0-Linux-ppc64le.sh#cfaedc8ff54703b91ef0a1f27232ac4f85dad2725d65a19624e63674aca19bd0" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Miniforge3-4.11.0-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.11.0-0/Miniforge3-4.11.0-0-Linux-x86_64.sh#4c24b38969ac413efa3a984290296f72578340d06004f2c7ba5efcbf828ec86b" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Miniforge3-4.11.0-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.11.0-0/Miniforge3-4.11.0-0-MacOSX-arm64.sh#d37c13f42f6d8e1b5786da5c73735eb4584a100c8b3572e5413dffe943a6a38b" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Miniforge3-4.11.0-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.11.0-0/Miniforge3-4.11.0-0-MacOSX-x86_64.sh#037da3c64fd8f8179ce99909784cfdaa2326b7ea832e747de8ea9e396c1583e7" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniforge3-4.11.0-1000066400000000000000000000031221517431316200267540ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniforge3-4.11.0-1-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.11.0-1/Miniforge3-4.11.0-1-Linux-aarch64.sh#5032a44b9a6c11a2ef46c02707c9c21adc276e2acd40305d615a6b923b7acd26" "miniconda" verify_py310 ;; "Linux-ppc64le" ) install_script "Miniforge3-4.11.0-1-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/4.11.0-1/Miniforge3-4.11.0-1-Linux-ppc64le.sh#38ea90c2aa8c380a50f8fadf329981b0ad8c05064a928212a234e9101d23a81f" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Miniforge3-4.11.0-1-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.11.0-1/Miniforge3-4.11.0-1-Linux-x86_64.sh#83ed76dcc907c9d9fc553a8a33278f06e80a27ac47c0db78e73f2b14f0bfbad1" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Miniforge3-4.11.0-1-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.11.0-1/Miniforge3-4.11.0-1-MacOSX-arm64.sh#67f6c7bec83f04d8fe3a8083c6a13084b9dd0bb33e5bb8975a9a6531f7360875" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Miniforge3-4.11.0-1-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.11.0-1/Miniforge3-4.11.0-1-MacOSX-x86_64.sh#9795921a6836f0d1e0abc10e4a724dcddaba8fbcf9740b2764c6d64f1378b835" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniforge3-4.11.0-2000066400000000000000000000031221517431316200267550ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniforge3-4.11.0-2-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.11.0-2/Miniforge3-4.11.0-2-Linux-aarch64.sh#6497f1e696c4f2931acecdc341242f3b2d1acfdb1360c6dd86dbd5a4000a970d" "miniconda" verify_py310 ;; "Linux-ppc64le" ) install_script "Miniforge3-4.11.0-2-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/4.11.0-2/Miniforge3-4.11.0-2-Linux-ppc64le.sh#7661deb911b2210d619a60c4f63275680c003ec83898fd80af4025d30e722a44" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Miniforge3-4.11.0-2-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.11.0-2/Miniforge3-4.11.0-2-Linux-x86_64.sh#f671f3a225ce5517021f0eb430ffa9110eebad8e0a0549d36c778e7769cb4970" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Miniforge3-4.11.0-2-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.11.0-2/Miniforge3-4.11.0-2-MacOSX-arm64.sh#eba035fb0f2f0d7a095713e93fd3848c847e18e8dbbef7173653f57a0518abe8" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Miniforge3-4.11.0-2-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.11.0-2/Miniforge3-4.11.0-2-MacOSX-x86_64.sh#379323b33054730c7d06004f9a0cc7eb8283e45ae6d44814bb0b283d5eda2f03" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniforge3-4.11.0-3000066400000000000000000000014311517431316200267570ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "MacOSX-arm64" ) install_script "Miniforge3-4.11.0-3-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.11.0-3/Miniforge3-4.11.0-3-MacOSX-arm64.sh#e74e4acfcc2bdf662746172b684855790d018f3b9c1d2630e65b2c4e316f3eb5" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Miniforge3-4.11.0-3-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.11.0-3/Miniforge3-4.11.0-3-MacOSX-x86_64.sh#f7a5e379135a7f2454a6cfe7d81fa7f6a082793c60d6c88648b4035ca1c83d24" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniforge3-4.11.0-4000066400000000000000000000031221517431316200267570ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniforge3-4.11.0-4-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.11.0-4/Miniforge3-4.11.0-4-Linux-aarch64.sh#7b88645381840589aeaa8a2a9a3a077a0909541ecfd6752b44eef53af83786b5" "miniconda" verify_py310 ;; "Linux-ppc64le" ) install_script "Miniforge3-4.11.0-4-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/4.11.0-4/Miniforge3-4.11.0-4-Linux-ppc64le.sh#adfe136cef5dd92bf54ec8e71656714ec485a140b18cfb3319837828d4a5ede0" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Miniforge3-4.11.0-4-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.11.0-4/Miniforge3-4.11.0-4-Linux-x86_64.sh#b8560aaab6edce86e690cdf096427dde0fa2c4f1bb083b20b642e6b2b4543ed1" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Miniforge3-4.11.0-4-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.11.0-4/Miniforge3-4.11.0-4-MacOSX-arm64.sh#7b3e3c29f8cc4a6a13e53f20e155f7bd30216e071c6028f699582b23bff06e60" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Miniforge3-4.11.0-4-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.11.0-4/Miniforge3-4.11.0-4-MacOSX-x86_64.sh#5f0019f6f671f3a41352b53ee7001dfbc6d7806a62d3691159c60d493ed82ea2" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniforge3-4.12.0-0000066400000000000000000000031221517431316200267540ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniforge3-4.12.0-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.12.0-0/Miniforge3-4.12.0-0-Linux-aarch64.sh#09b0ec8cefd3d94327ce12185af8164c8890bff00351b3f64bf280e22e947d21" "miniconda" verify_py310 ;; "Linux-ppc64le" ) install_script "Miniforge3-4.12.0-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/4.12.0-0/Miniforge3-4.12.0-0-Linux-ppc64le.sh#29e3969b82538c78a13e684f53c0a0cd2eba7b500e7e187e4d6bddacc3eb66e1" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Miniforge3-4.12.0-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.12.0-0/Miniforge3-4.12.0-0-Linux-x86_64.sh#ccb6c87f42355e2e0b652dd35a980b7c60ca5e53643237f6a070748ef0dd23ff" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Miniforge3-4.12.0-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.12.0-0/Miniforge3-4.12.0-0-MacOSX-arm64.sh#e52cb92d620c5a408afef9ac8b5d2e964e2c72211c69cc41a2bb4d6af0a26001" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Miniforge3-4.12.0-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.12.0-0/Miniforge3-4.12.0-0-MacOSX-x86_64.sh#3bfcd52dd1acafc712b6fb042d4b019c6f09ea3ba62710f722f4e9ebcde7f67c" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniforge3-4.12.0-1000066400000000000000000000031221517431316200267550ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniforge3-4.12.0-1-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.12.0-1/Miniforge3-4.12.0-1-Linux-aarch64.sh#b1fb77baffdc187f1ccf34db781aa849f8c057b31fdb7394788fe6c8ffb99916" "miniconda" verify_py310 ;; "Linux-ppc64le" ) install_script "Miniforge3-4.12.0-1-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/4.12.0-1/Miniforge3-4.12.0-1-Linux-ppc64le.sh#3b4bd33274e02ef7a19ffacd0e7eafe9275f08fc188a77f3a75ddf877772bf35" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Miniforge3-4.12.0-1-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.12.0-1/Miniforge3-4.12.0-1-Linux-x86_64.sh#fe0c49f6af64668006b87174a7dcddd3ea59fe2d0f05c7db3de057e2fbc8a6e9" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Miniforge3-4.12.0-1-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.12.0-1/Miniforge3-4.12.0-1-MacOSX-arm64.sh#622fc4220a90a80ff7f6ae40883d2d37eb09e9168aa74b9516de81c302490527" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Miniforge3-4.12.0-1-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.12.0-1/Miniforge3-4.12.0-1-MacOSX-x86_64.sh#4456a11cc99ac9a671b83f3ecf1d670e93dc88c1e5ecd3f038e041e658104b05" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniforge3-4.12.0-2000066400000000000000000000031221517431316200267560ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniforge3-4.12.0-2-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.12.0-2/Miniforge3-4.12.0-2-Linux-aarch64.sh#507c9763942821d7541b5a1b1130545e4c19416cc0473054faa10fee435aa9fa" "miniconda" verify_py310 ;; "Linux-ppc64le" ) install_script "Miniforge3-4.12.0-2-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/4.12.0-2/Miniforge3-4.12.0-2-Linux-ppc64le.sh#447d1729353189ba732e951b598d5b9ea4ab46296db4523ac34a775150a60199" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Miniforge3-4.12.0-2-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.12.0-2/Miniforge3-4.12.0-2-Linux-x86_64.sh#e8bd60572d1bdcd9fc16114f423653c95e02f0be1393383f77fba17cf8acb10e" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Miniforge3-4.12.0-2-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.12.0-2/Miniforge3-4.12.0-2-MacOSX-arm64.sh#24181b1a42c6bb9704e28ac4ecb234f3c86d882a7db408948692bc5792a2f713" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Miniforge3-4.12.0-2-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.12.0-2/Miniforge3-4.12.0-2-MacOSX-x86_64.sh#37007407ab504fb8bd3af68ff821c0819ad2f016087b9c45f1e95a910c92531e" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniforge3-4.12.0-3000066400000000000000000000031221517431316200267570ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniforge3-4.12.0-3-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.12.0-3/Miniforge3-4.12.0-3-Linux-aarch64.sh#8ddc79ffaa40dfc7e3d93c8c02e268c6d3958c4ef662bc2194c36aa7d50820a3" "miniconda" verify_py310 ;; "Linux-ppc64le" ) install_script "Miniforge3-4.12.0-3-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/4.12.0-3/Miniforge3-4.12.0-3-Linux-ppc64le.sh#2892b96723bb8aec33275ce033c209cd0ee53a9208afce7138c79438bd533fbb" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Miniforge3-4.12.0-3-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.12.0-3/Miniforge3-4.12.0-3-Linux-x86_64.sh#680f8549374474bad903ebb2985a2c264f592fecae1544700bcc4e0d41e1ba17" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Miniforge3-4.12.0-3-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.12.0-3/Miniforge3-4.12.0-3-MacOSX-arm64.sh#9088b27744512960b4834d318204f2bdbaeb44c13dd21b4740de357cea270d44" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Miniforge3-4.12.0-3-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.12.0-3/Miniforge3-4.12.0-3-MacOSX-x86_64.sh#76b6cf644e74c2c2df9ff7a315259a1cf82170bcb9fea0038069616fe25d1d14" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniforge3-4.13.0-0000066400000000000000000000031221517431316200267550ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniforge3-4.13.0-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.13.0-0/Miniforge3-4.13.0-0-Linux-aarch64.sh#930ea585fa30047ada7bc892aa96bb4b521f082469b0594e3fbbbb6ac17dcda5" "miniconda" verify_py310 ;; "Linux-ppc64le" ) install_script "Miniforge3-4.13.0-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/4.13.0-0/Miniforge3-4.13.0-0-Linux-ppc64le.sh#ce3c506f2dc939b368e91521355a68653aa40541371ffe12aa0cbe43e264f26c" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Miniforge3-4.13.0-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.13.0-0/Miniforge3-4.13.0-0-Linux-x86_64.sh#e810f2e2a36bec232ed8f00e68be1b75590b51b4e3f3de39aab3212e596bf7a8" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Miniforge3-4.13.0-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.13.0-0/Miniforge3-4.13.0-0-MacOSX-arm64.sh#b00587bfd44d259d28d376497d0fc68bd150eb74b4a96771220917699bd26340" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Miniforge3-4.13.0-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.13.0-0/Miniforge3-4.13.0-0-MacOSX-x86_64.sh#f29457257d01f06569f342723d58d4c6b526c9404dbb579ab72548d933b5b547" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniforge3-4.13.0-1000066400000000000000000000031221517431316200267560ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniforge3-4.13.0-1-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.13.0-1/Miniforge3-4.13.0-1-Linux-aarch64.sh#e0d671d18ef578700dce1796f1a8796a74c8e5e4e5d6ee9f33cf6a1159f570c8" "miniconda" verify_py310 ;; "Linux-ppc64le" ) install_script "Miniforge3-4.13.0-1-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/4.13.0-1/Miniforge3-4.13.0-1-Linux-ppc64le.sh#2981ba22334a73f3bd8c0bcb9ad2510c411ab454280f460ca461977e5c0c43a6" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Miniforge3-4.13.0-1-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.13.0-1/Miniforge3-4.13.0-1-Linux-x86_64.sh#6e0a33060c525909fa0e8ae74cb511480e8191cef88e3c297619f31574804184" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Miniforge3-4.13.0-1-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.13.0-1/Miniforge3-4.13.0-1-MacOSX-arm64.sh#57bef67a4c80bfef04223eb76ee1b49b1bdfd5eeb46ebcf49e65d6c308c84a98" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Miniforge3-4.13.0-1-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.13.0-1/Miniforge3-4.13.0-1-MacOSX-x86_64.sh#9996677f0ca0bfa6399e9a5688556bfaff544389ea123e2ac6e6252d3a1d0658" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniforge3-4.14.0-0000066400000000000000000000031221517431316200267560ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniforge3-4.14.0-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.14.0-0/Miniforge3-4.14.0-0-Linux-aarch64.sh#8e2de8657e0ff7315daf22df1874d5a57ff8295bc9489d43d61f2d9fac49e42b" "miniconda" verify_py310 ;; "Linux-ppc64le" ) install_script "Miniforge3-4.14.0-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/4.14.0-0/Miniforge3-4.14.0-0-Linux-ppc64le.sh#a1614873842aec1703ea4509554998663d5a774976c30bf89c76410a5f82aaa0" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Miniforge3-4.14.0-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.14.0-0/Miniforge3-4.14.0-0-Linux-x86_64.sh#643dd45d9a9dd362508e8edd8cd535a87b002bd7716b12fb956247c8c7494908" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Miniforge3-4.14.0-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.14.0-0/Miniforge3-4.14.0-0-MacOSX-arm64.sh#91b7cadb5986af1c38555cfb4214dcb353212492a89d5e7f4c32204829ed1829" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Miniforge3-4.14.0-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.14.0-0/Miniforge3-4.14.0-0-MacOSX-x86_64.sh#80ee5ce53a1f4edb21677dd6794a043ad7d1db6e3d5ffe7a994937923a50a2c9" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniforge3-4.14.0-1000066400000000000000000000031221517431316200267570ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniforge3-4.14.0-1-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.14.0-1/Miniforge3-4.14.0-1-Linux-aarch64.sh#79bb1694aee2cd4bc7ee412f267f6b06ccd011cd7be6686970599bff9ab5ae0b" "miniconda" verify_py310 ;; "Linux-ppc64le" ) install_script "Miniforge3-4.14.0-1-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/4.14.0-1/Miniforge3-4.14.0-1-Linux-ppc64le.sh#d82789f644759b21cbfcfb3de96b6a9879c38d6c3aa90394ee8b0916e0c5c45b" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Miniforge3-4.14.0-1-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.14.0-1/Miniforge3-4.14.0-1-Linux-x86_64.sh#8a83e4a7440157d57631b9cb4958591b41547263a30f02046767271695a242ad" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Miniforge3-4.14.0-1-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.14.0-1/Miniforge3-4.14.0-1-MacOSX-arm64.sh#d2dc25e5c73e420ae22a30abfebd24b51cb1d66d369594085ee42ba0e3e3d4d9" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Miniforge3-4.14.0-1-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.14.0-1/Miniforge3-4.14.0-1-MacOSX-x86_64.sh#4b956674c1c5f312bfc04f8f4d1a47bfe5cc7b9ca6a011cdd044c7152a8309d7" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniforge3-4.14.0-2000066400000000000000000000031221517431316200267600ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-aarch64" ) install_script "Miniforge3-4.14.0-2-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.14.0-2/Miniforge3-4.14.0-2-Linux-aarch64.sh#52e44682aecbfb1c41e9f07b0f2f08ab22369e236893768be3c85ad6c039090f" "miniconda" verify_py310 ;; "Linux-ppc64le" ) install_script "Miniforge3-4.14.0-2-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/4.14.0-2/Miniforge3-4.14.0-2-Linux-ppc64le.sh#60d37536a07fbf9278308a8601fa125b5d643fb36e6b8e12faad45455aae3119" "miniconda" verify_py310 ;; "Linux-x86_64" ) install_script "Miniforge3-4.14.0-2-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.14.0-2/Miniforge3-4.14.0-2-Linux-x86_64.sh#ff0b9f78a51a4d9851e8fd3cdb6ff0b233f4f49d82c0690a12560e57075690bd" "miniconda" verify_py310 ;; "MacOSX-arm64" ) install_script "Miniforge3-4.14.0-2-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.14.0-2/Miniforge3-4.14.0-2-MacOSX-arm64.sh#5089a254923acb6221cf7c3c5138cf68664684e18d4223e53482948c21975d7e" "miniconda" verify_py310 ;; "MacOSX-x86_64" ) install_script "Miniforge3-4.14.0-2-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.14.0-2/Miniforge3-4.14.0-2-MacOSX-x86_64.sh#ac3c2a283f6ebf24d6072d39f9bf9297c64a752315353f666260f72b02daf6d1" "miniconda" verify_py310 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniforge3-4.9.2000066400000000000000000000026171517431316200265570ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-ppc64le" ) install_script "Miniforge3-4.9.2-7-Linux-ppc64le" "https://github.com/conda-forge/miniforge/releases/download/4.9.2-7/Miniforge3-4.9.2-7-Linux-ppc64le.sh#fb18f348f35328aff5dd7edbd83ea2e2" "miniconda" verify_py38 ;; "Linux-x86_64" ) install_script "Miniforge3-4.9.2-7-Linux-x86_64" "https://github.com/conda-forge/miniforge/releases/download/4.9.2-7/Miniforge3-4.9.2-7-Linux-x86_64.sh#d96baf1a0559a1f642528c0e38aad984" "miniconda" verify_py38 ;; "Linux-aarch64" ) install_script "Miniforge3-4.9.2-7-Linux-aarch64" "https://github.com/conda-forge/miniforge/releases/download/4.9.2-7/Miniforge3-4.9.2-7-Linux-aarch64.sh#c5bceb970dcff512f35f444397b5ce11" "miniconda" verify_py38 ;; "MacOSX-arm64" ) install_script "Miniforge3-4.9.2-7-MacOSX-arm64" "https://github.com/conda-forge/miniforge/releases/download/4.9.2-7/Miniforge3-4.9.2-7-MacOSX-arm64.sh#cca7e2cbbf5734eda475a72e81fe8031" "miniconda" verify_py39 ;; "MacOSX-x86_64" ) install_script "Miniforge3-4.9.2-7-MacOSX-x86_64" "https://github.com/conda-forge/miniforge/releases/download/4.9.2-7/Miniforge3-4.9.2-7-MacOSX-x86_64.sh#f270b7bfd721899cb175c10f0b6cfa01" "miniconda" verify_py38 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/miniforge3-latest000066400000000000000000000022641517431316200273770ustar00rootroot00000000000000case "$(anaconda_architecture 2>/dev/null || true)" in "Linux-ppc64le" ) install_script "Miniforge3-Linux-ppc64le" "https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-Linux-ppc64le.sh" "miniconda" verify_py3_latest ;; "Linux-x86_64" ) install_script "Miniforge3-Linux-x86_64" "https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-Linux-x86_64.sh" "miniconda" verify_py3_latest ;; "Linux-aarch64" ) install_script "Miniforge3-Linux-aarch64" "https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-Linux-aarch64.sh" "miniconda" verify_py3_latest ;; "MacOSX-arm64" ) install_script "Miniforge3-MacOSX-arm64" "https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-MacOSX-arm64.sh" "miniconda" verify_py3_latest ;; "MacOSX-x86_64" ) install_script "Miniforge3-MacOSX-x86_64" "https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-MacOSX-x86_64.sh" "miniconda" verify_py3_latest ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of Miniforge3 is not available for $(anaconda_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/nogil-3.9.10000066400000000000000000000012351517431316200256760ustar00rootroot00000000000000prefer_openssl11 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-1.1.1l" "https://www.openssl.org/source/openssl-1.1.1l.tar.gz#0b7a3e5e59c34827fe0c3a74b7ec8baef302b98fa80088d7f9153aa16fa76bd1" mac_openssl --if has_broken_mac_openssl install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline install_package "nogil-3.9.10" "https://github.com/colesbury/nogil/archive/refs/tags/v3.9.10-nogil.tar.gz#5058c0ec07f0444673b86977c18e786183ca35617d9e6ada2329f7a87a4a0993" standard verify_py39 copy_python_gdb ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/nogil-3.9.10-1000066400000000000000000000012521517431316200260330ustar00rootroot00000000000000prefer_openssl11 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-1.1.1l" "https://www.openssl.org/source/openssl-1.1.1l.tar.gz#0b7a3e5e59c34827fe0c3a74b7ec8baef302b98fa80088d7f9153aa16fa76bd1" mac_openssl --if has_broken_mac_openssl install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline install_package "nogil-3.9.10-1" "https://github.com/colesbury/nogil/archive/refs/tags/v3.9.10-nogil-2023-01-22.tar.gz#cbda308c7586745573d665cd53d71b50707fd6f85c1c5d7a9f5b092e869cc757" standard verify_py39 copy_python_gdb ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/000077500000000000000000000000001517431316200255435ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.1.3/000077500000000000000000000000001517431316200262045ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.1.3/Python-2.1.3/000077500000000000000000000000001517431316200301245ustar00rootroot00000000000000000_patch-setup.py.diff000066400000000000000000000046131517431316200341460ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.1.3/Python-2.1.3--- setup.py.orig 2014-06-22 01:56:56.614802000 -0700 +++ setup.py 2014-06-22 01:55:54.555149273 -0700 @@ -12,10 +12,18 @@ from distutils.errors import * from distutils.core import Extension, setup from distutils.command.build_ext import build_ext +from distutils.spawn import find_executable # This global variable is used to hold the list of modules to be disabled. disabled_module_list = [] +def add_dir_to_list(dirlist, dir): + """Add the directory 'dir' to the list 'dirlist' (at the front) if + 1) 'dir' is not already in 'dirlist' + 2) 'dir' actually exists, and is a directory.""" + if dir is not None and os.path.isdir(dir) and dir not in dirlist: + dirlist.insert(0, dir) + def find_file(filename, std_dirs, paths): """Searches for the directory where a given file is located, and returns a possibly-empty list of additional directories, or None @@ -144,12 +152,36 @@ return platform + def add_multiarch_paths(self): + # Debian/Ubuntu multiarch support. + # https://wiki.ubuntu.com/MultiarchSpec + if not find_executable('dpkg-architecture'): + return + tmpfile = os.path.join(self.build_temp, 'multiarch') + if not os.path.exists(self.build_temp): + os.makedirs(self.build_temp) + ret = os.system( + 'dpkg-architecture -qDEB_HOST_MULTIARCH > %s 2> /dev/null' % + tmpfile) + try: + if ret >> 8 == 0: + fp = open(tmpfile) + multiarch_path_component = fp.readline().strip() + fp.close() + add_dir_to_list(self.compiler.library_dirs, + '/usr/lib/' + multiarch_path_component) + add_dir_to_list(self.compiler.include_dirs, + '/usr/include/' + multiarch_path_component) + finally: + os.unlink(tmpfile) + def detect_modules(self): # Ensure that /usr/local is always used if '/usr/local/lib' not in self.compiler.library_dirs: self.compiler.library_dirs.insert(0, '/usr/local/lib') if '/usr/local/include' not in self.compiler.include_dirs: self.compiler.include_dirs.insert(0, '/usr/local/include' ) + self.add_multiarch_paths() # lib_dirs and inc_dirs are used to search for files; # if a file is found in one of those directories, it can pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.2.3/000077500000000000000000000000001517431316200262055ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.2.3/Python-2.2.3/000077500000000000000000000000001517431316200301265ustar00rootroot00000000000000000_patch-setup.py.diff000066400000000000000000000045131517431316200341470ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.2.3/Python-2.2.3--- setup.py.orig 2014-06-22 01:49:02.521459238 -0700 +++ setup.py 2014-06-22 01:53:59.607792944 -0700 @@ -10,10 +10,18 @@ from distutils.core import Extension, setup from distutils.command.build_ext import build_ext from distutils.command.install import install +from distutils.spawn import find_executable # This global variable is used to hold the list of modules to be disabled. disabled_module_list = [] +def add_dir_to_list(dirlist, dir): + """Add the directory 'dir' to the list 'dirlist' (at the front) if + 1) 'dir' is not already in 'dirlist' + 2) 'dir' actually exists, and is a directory.""" + if dir is not None and os.path.isdir(dir) and dir not in dirlist: + dirlist.insert(0, dir) + def find_file(filename, std_dirs, paths): """Searches for the directory where a given file is located, and returns a possibly-empty list of additional directories, or None @@ -209,12 +217,36 @@ return platform + def add_multiarch_paths(self): + # Debian/Ubuntu multiarch support. + # https://wiki.ubuntu.com/MultiarchSpec + if not find_executable('dpkg-architecture'): + return + tmpfile = os.path.join(self.build_temp, 'multiarch') + if not os.path.exists(self.build_temp): + os.makedirs(self.build_temp) + ret = os.system( + 'dpkg-architecture -qDEB_HOST_MULTIARCH > %s 2> /dev/null' % + tmpfile) + try: + if ret >> 8 == 0: + fp = open(tmpfile) + multiarch_path_component = fp.readline().strip() + fp.close() + add_dir_to_list(self.compiler.library_dirs, + '/usr/lib/' + multiarch_path_component) + add_dir_to_list(self.compiler.include_dirs, + '/usr/include/' + multiarch_path_component) + finally: + os.unlink(tmpfile) + def detect_modules(self): # Ensure that /usr/local is always used if '/usr/local/lib' not in self.compiler.library_dirs: self.compiler.library_dirs.insert(0, '/usr/local/lib') if '/usr/local/include' not in self.compiler.include_dirs: self.compiler.include_dirs.insert(0, '/usr/local/include' ) + self.add_multiarch_paths() try: have_unicode = unicode pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.3.7/000077500000000000000000000000001517431316200262125ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.3.7/Python-2.3.7/000077500000000000000000000000001517431316200301405ustar00rootroot00000000000000000_patch-setup.py.diff000066400000000000000000000034611517431316200341620ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.3.7/Python-2.3.7--- setup.py.orig 2005-01-17 13:07:52.000000000 -0800 +++ setup.py 2014-06-22 02:03:46.888499800 -0700 @@ -13,6 +13,7 @@ from distutils.command.build_ext import build_ext from distutils.command.install import install from distutils.command.install_lib import install_lib +from distutils.spawn import find_executable # This global variable is used to hold the list of modules to be disabled. disabled_module_list = [] @@ -239,10 +240,34 @@ return platform return sys.platform + def add_multiarch_paths(self): + # Debian/Ubuntu multiarch support. + # https://wiki.ubuntu.com/MultiarchSpec + if not find_executable('dpkg-architecture'): + return + tmpfile = os.path.join(self.build_temp, 'multiarch') + if not os.path.exists(self.build_temp): + os.makedirs(self.build_temp) + ret = os.system( + 'dpkg-architecture -qDEB_HOST_MULTIARCH > %s 2> /dev/null' % + tmpfile) + try: + if ret >> 8 == 0: + fp = open(tmpfile) + multiarch_path_component = fp.readline().strip() + fp.close() + add_dir_to_list(self.compiler.library_dirs, + '/usr/lib/' + multiarch_path_component) + add_dir_to_list(self.compiler.include_dirs, + '/usr/include/' + multiarch_path_component) + finally: + os.unlink(tmpfile) + def detect_modules(self): # Ensure that /usr/local is always used add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib') add_dir_to_list(self.compiler.include_dirs, '/usr/local/include') + self.add_multiarch_paths() # fink installs lots of goodies in /sw/... - make sure we # check there 001_fortify_crash_workaround.diff000066400000000000000000000025651517431316200364200ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.3.7/Python-2.3.7Author: Dwayne Litzenberger Date: Sun Jun 22 01:15:05 2014 -0700 Patch configure to handle Ubuntu Bug#286334 Fixes this crash: *** buffer overflow detected ***: ./python terminated ======= Backtrace: ========= /lib/x86_64-linux-gnu/libc.so.6(__fortify_fail+0x37)[0x2b08765c9007] diff --git configure configure index 4838393..654de3f 100755 --- configure +++ configure @@ -20798,6 +20798,15 @@ done echo "$as_me:$LINENO: result: done" >&5 echo "${ECHO_T}done" >&6 +case $ac_sys_system in +Linux*) +# Workaround for bug in Ubuntu 10.10 amd64 gcc-4.4 +# See http://orip.org/2008/10/building-python-235-on-ubuntu-intrepid.html +# and Ubuntu Bug #286334 +BASECFLAGS="$BASECFLAGS -U_FORTIFY_SOURCE" +;; +esac + # generate output files ac_config_files="$ac_config_files Makefile.pre Modules/Setup.config" diff --git configure.in configure.in index ba7a011..060a73f 100644 --- configure.in +++ configure.in @@ -3072,6 +3072,15 @@ for dir in $SRCDIRS; do done AC_MSG_RESULT(done) +case $ac_sys_system in +Linux*) +# Workaround for bug in Ubuntu 10.10 amd64 gcc-4.4 +# See http://orip.org/2008/10/building-python-235-on-ubuntu-intrepid.html +# and Ubuntu Bug #286334 +BASECFLAGS="$BASECFLAGS -U_FORTIFY_SOURCE" +;; +esac + # generate output files AC_CONFIG_FILES(Makefile.pre Modules/Setup.config) AC_OUTPUT pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.4.0/000077500000000000000000000000001517431316200262045ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.4.0/Python-2.4/000077500000000000000000000000001517431316200277665ustar00rootroot00000000000000000_patch-setup.py.diff000066400000000000000000000035211517431316200340050ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.4.0/Python-2.4--- setup.py.orig 2011-07-07 19:19:43.800122463 +0900 +++ setup.py 2011-07-07 19:25:04.548416377 +0900 @@ -13,6 +13,7 @@ from distutils.command.build_ext import build_ext from distutils.command.install import install from distutils.command.install_lib import install_lib +from distutils.spawn import find_executable # This global variable is used to hold the list of modules to be disabled. disabled_module_list = [] @@ -242,10 +243,34 @@ return platform return sys.platform + def add_multiarch_paths(self): + # Debian/Ubuntu multiarch support. + # https://wiki.ubuntu.com/MultiarchSpec + if not find_executable('dpkg-architecture'): + return + tmpfile = os.path.join(self.build_temp, 'multiarch') + if not os.path.exists(self.build_temp): + os.makedirs(self.build_temp) + ret = os.system( + 'dpkg-architecture -qDEB_HOST_MULTIARCH > %s 2> /dev/null' % + tmpfile) + try: + if ret >> 8 == 0: + fp = open(tmpfile) + multiarch_path_component = fp.readline().strip() + fp.close() + add_dir_to_list(self.compiler.library_dirs, + '/usr/lib/' + multiarch_path_component) + add_dir_to_list(self.compiler.include_dirs, + '/usr/include/' + multiarch_path_component) + finally: + os.unlink(tmpfile) + def detect_modules(self): # Ensure that /usr/local is always used add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib') add_dir_to_list(self.compiler.include_dirs, '/usr/local/include') + self.add_multiarch_paths() # Add paths specified in the environment variables LDFLAGS and # CPPFLAGS for header and library files. 001_fortify_crash_workaround.diff000066400000000000000000000025651517431316200362460ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.4.0/Python-2.4Author: Dwayne Litzenberger Date: Sun Jun 22 01:15:05 2014 -0700 Patch configure to handle Ubuntu Bug#286334 Fixes this crash: *** buffer overflow detected ***: ./python terminated ======= Backtrace: ========= /lib/x86_64-linux-gnu/libc.so.6(__fortify_fail+0x37)[0x2b08765c9007] diff --git configure configure index 4838393..654de3f 100755 --- configure +++ configure @@ -20798,6 +20798,15 @@ done echo "$as_me:$LINENO: result: done" >&5 echo "${ECHO_T}done" >&6 +case $ac_sys_system in +Linux*) +# Workaround for bug in Ubuntu 10.10 amd64 gcc-4.4 +# See http://orip.org/2008/10/building-python-235-on-ubuntu-intrepid.html +# and Ubuntu Bug #286334 +BASECFLAGS="$BASECFLAGS -U_FORTIFY_SOURCE" +;; +esac + # generate output files ac_config_files="$ac_config_files Makefile.pre Modules/Setup.config" diff --git configure.in configure.in index ba7a011..060a73f 100644 --- configure.in +++ configure.in @@ -3072,6 +3072,15 @@ for dir in $SRCDIRS; do done AC_MSG_RESULT(done) +case $ac_sys_system in +Linux*) +# Workaround for bug in Ubuntu 10.10 amd64 gcc-4.4 +# See http://orip.org/2008/10/building-python-235-on-ubuntu-intrepid.html +# and Ubuntu Bug #286334 +BASECFLAGS="$BASECFLAGS -U_FORTIFY_SOURCE" +;; +esac + # generate output files AC_CONFIG_FILES(Makefile.pre Modules/Setup.config) AC_OUTPUT 002_patch-posixmodule.diff000066400000000000000000000015201517431316200345650ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.4.0/Python-2.4--- Modules/posixmodule.c.orig 2019-04-04 20:27:41.000000000 +0200 +++ Modules/posixmodule.c 2019-04-04 20:28:07.000000000 +0200 @@ -5300,7 +5300,7 @@ Close a file descriptor (for low level IO)."); static PyObject * -posix_close(PyObject *self, PyObject *args) +posix_closex(PyObject *self, PyObject *args) { int fd, res; if (!PyArg_ParseTuple(args, "i:close", &fd)) @@ -7554,7 +7554,7 @@ {"tcsetpgrp", posix_tcsetpgrp, METH_VARARGS, posix_tcsetpgrp__doc__}, #endif /* HAVE_TCSETPGRP */ {"open", posix_open, METH_VARARGS, posix_open__doc__}, - {"close", posix_close, METH_VARARGS, posix_close__doc__}, + {"close", posix_closex, METH_VARARGS, posix_close__doc__}, {"dup", posix_dup, METH_VARARGS, posix_dup__doc__}, {"dup2", posix_dup2, METH_VARARGS, posix_dup2__doc__}, {"lseek", posix_lseek, METH_VARARGS, posix_lseek__doc__},pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.4.1/000077500000000000000000000000001517431316200262055ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.4.1/Python-2.4.1/000077500000000000000000000000001517431316200301265ustar00rootroot00000000000000000_patch-setup.py.diff000066400000000000000000000035211517431316200341450ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.4.1/Python-2.4.1--- setup.py.orig 2011-07-07 19:19:43.800122463 +0900 +++ setup.py 2011-07-07 19:25:04.548416377 +0900 @@ -13,6 +13,7 @@ from distutils.command.build_ext import build_ext from distutils.command.install import install from distutils.command.install_lib import install_lib +from distutils.spawn import find_executable # This global variable is used to hold the list of modules to be disabled. disabled_module_list = [] @@ -242,10 +243,34 @@ return platform return sys.platform + def add_multiarch_paths(self): + # Debian/Ubuntu multiarch support. + # https://wiki.ubuntu.com/MultiarchSpec + if not find_executable('dpkg-architecture'): + return + tmpfile = os.path.join(self.build_temp, 'multiarch') + if not os.path.exists(self.build_temp): + os.makedirs(self.build_temp) + ret = os.system( + 'dpkg-architecture -qDEB_HOST_MULTIARCH > %s 2> /dev/null' % + tmpfile) + try: + if ret >> 8 == 0: + fp = open(tmpfile) + multiarch_path_component = fp.readline().strip() + fp.close() + add_dir_to_list(self.compiler.library_dirs, + '/usr/lib/' + multiarch_path_component) + add_dir_to_list(self.compiler.include_dirs, + '/usr/include/' + multiarch_path_component) + finally: + os.unlink(tmpfile) + def detect_modules(self): # Ensure that /usr/local is always used add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib') add_dir_to_list(self.compiler.include_dirs, '/usr/local/include') + self.add_multiarch_paths() # Add paths specified in the environment variables LDFLAGS and # CPPFLAGS for header and library files. 001_fortify_crash_workaround.diff000066400000000000000000000025651517431316200364060ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.4.1/Python-2.4.1Author: Dwayne Litzenberger Date: Sun Jun 22 01:15:05 2014 -0700 Patch configure to handle Ubuntu Bug#286334 Fixes this crash: *** buffer overflow detected ***: ./python terminated ======= Backtrace: ========= /lib/x86_64-linux-gnu/libc.so.6(__fortify_fail+0x37)[0x2b08765c9007] diff --git configure configure index 4838393..654de3f 100755 --- configure +++ configure @@ -20798,6 +20798,15 @@ done echo "$as_me:$LINENO: result: done" >&5 echo "${ECHO_T}done" >&6 +case $ac_sys_system in +Linux*) +# Workaround for bug in Ubuntu 10.10 amd64 gcc-4.4 +# See http://orip.org/2008/10/building-python-235-on-ubuntu-intrepid.html +# and Ubuntu Bug #286334 +BASECFLAGS="$BASECFLAGS -U_FORTIFY_SOURCE" +;; +esac + # generate output files ac_config_files="$ac_config_files Makefile.pre Modules/Setup.config" diff --git configure.in configure.in index ba7a011..060a73f 100644 --- configure.in +++ configure.in @@ -3072,6 +3072,15 @@ for dir in $SRCDIRS; do done AC_MSG_RESULT(done) +case $ac_sys_system in +Linux*) +# Workaround for bug in Ubuntu 10.10 amd64 gcc-4.4 +# See http://orip.org/2008/10/building-python-235-on-ubuntu-intrepid.html +# and Ubuntu Bug #286334 +BASECFLAGS="$BASECFLAGS -U_FORTIFY_SOURCE" +;; +esac + # generate output files AC_CONFIG_FILES(Makefile.pre Modules/Setup.config) AC_OUTPUT 002_patch-posixmodule.diff000066400000000000000000000015201517431316200347250ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.4.1/Python-2.4.1--- Modules/posixmodule.c.orig 2019-04-04 20:27:41.000000000 +0200 +++ Modules/posixmodule.c 2019-04-04 20:28:07.000000000 +0200 @@ -5300,7 +5300,7 @@ Close a file descriptor (for low level IO)."); static PyObject * -posix_close(PyObject *self, PyObject *args) +posix_closex(PyObject *self, PyObject *args) { int fd, res; if (!PyArg_ParseTuple(args, "i:close", &fd)) @@ -7554,7 +7554,7 @@ {"tcsetpgrp", posix_tcsetpgrp, METH_VARARGS, posix_tcsetpgrp__doc__}, #endif /* HAVE_TCSETPGRP */ {"open", posix_open, METH_VARARGS, posix_open__doc__}, - {"close", posix_close, METH_VARARGS, posix_close__doc__}, + {"close", posix_closex, METH_VARARGS, posix_close__doc__}, {"dup", posix_dup, METH_VARARGS, posix_dup__doc__}, {"dup2", posix_dup2, METH_VARARGS, posix_dup2__doc__}, {"lseek", posix_lseek, METH_VARARGS, posix_lseek__doc__},pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.4.2/000077500000000000000000000000001517431316200262065ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.4.2/Python-2.4.2/000077500000000000000000000000001517431316200301305ustar00rootroot00000000000000000_patch-setup.py.diff000066400000000000000000000035211517431316200341470ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.4.2/Python-2.4.2--- setup.py.orig 2011-07-07 19:19:43.800122463 +0900 +++ setup.py 2011-07-07 19:25:04.548416377 +0900 @@ -13,6 +13,7 @@ from distutils.command.build_ext import build_ext from distutils.command.install import install from distutils.command.install_lib import install_lib +from distutils.spawn import find_executable # This global variable is used to hold the list of modules to be disabled. disabled_module_list = [] @@ -242,10 +243,34 @@ return platform return sys.platform + def add_multiarch_paths(self): + # Debian/Ubuntu multiarch support. + # https://wiki.ubuntu.com/MultiarchSpec + if not find_executable('dpkg-architecture'): + return + tmpfile = os.path.join(self.build_temp, 'multiarch') + if not os.path.exists(self.build_temp): + os.makedirs(self.build_temp) + ret = os.system( + 'dpkg-architecture -qDEB_HOST_MULTIARCH > %s 2> /dev/null' % + tmpfile) + try: + if ret >> 8 == 0: + fp = open(tmpfile) + multiarch_path_component = fp.readline().strip() + fp.close() + add_dir_to_list(self.compiler.library_dirs, + '/usr/lib/' + multiarch_path_component) + add_dir_to_list(self.compiler.include_dirs, + '/usr/include/' + multiarch_path_component) + finally: + os.unlink(tmpfile) + def detect_modules(self): # Ensure that /usr/local is always used add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib') add_dir_to_list(self.compiler.include_dirs, '/usr/local/include') + self.add_multiarch_paths() # Add paths specified in the environment variables LDFLAGS and # CPPFLAGS for header and library files. 001_fortify_crash_workaround.diff000066400000000000000000000025651517431316200364100ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.4.2/Python-2.4.2Author: Dwayne Litzenberger Date: Sun Jun 22 01:15:05 2014 -0700 Patch configure to handle Ubuntu Bug#286334 Fixes this crash: *** buffer overflow detected ***: ./python terminated ======= Backtrace: ========= /lib/x86_64-linux-gnu/libc.so.6(__fortify_fail+0x37)[0x2b08765c9007] diff --git configure configure index 4838393..654de3f 100755 --- configure +++ configure @@ -20798,6 +20798,15 @@ done echo "$as_me:$LINENO: result: done" >&5 echo "${ECHO_T}done" >&6 +case $ac_sys_system in +Linux*) +# Workaround for bug in Ubuntu 10.10 amd64 gcc-4.4 +# See http://orip.org/2008/10/building-python-235-on-ubuntu-intrepid.html +# and Ubuntu Bug #286334 +BASECFLAGS="$BASECFLAGS -U_FORTIFY_SOURCE" +;; +esac + # generate output files ac_config_files="$ac_config_files Makefile.pre Modules/Setup.config" diff --git configure.in configure.in index ba7a011..060a73f 100644 --- configure.in +++ configure.in @@ -3072,6 +3072,15 @@ for dir in $SRCDIRS; do done AC_MSG_RESULT(done) +case $ac_sys_system in +Linux*) +# Workaround for bug in Ubuntu 10.10 amd64 gcc-4.4 +# See http://orip.org/2008/10/building-python-235-on-ubuntu-intrepid.html +# and Ubuntu Bug #286334 +BASECFLAGS="$BASECFLAGS -U_FORTIFY_SOURCE" +;; +esac + # generate output files AC_CONFIG_FILES(Makefile.pre Modules/Setup.config) AC_OUTPUT 002_patch-posixmodule.diff000066400000000000000000000015201517431316200347270ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.4.2/Python-2.4.2--- Modules/posixmodule.c.orig 2019-04-04 20:27:41.000000000 +0200 +++ Modules/posixmodule.c 2019-04-04 20:28:07.000000000 +0200 @@ -5300,7 +5300,7 @@ Close a file descriptor (for low level IO)."); static PyObject * -posix_close(PyObject *self, PyObject *args) +posix_closex(PyObject *self, PyObject *args) { int fd, res; if (!PyArg_ParseTuple(args, "i:close", &fd)) @@ -7554,7 +7554,7 @@ {"tcsetpgrp", posix_tcsetpgrp, METH_VARARGS, posix_tcsetpgrp__doc__}, #endif /* HAVE_TCSETPGRP */ {"open", posix_open, METH_VARARGS, posix_open__doc__}, - {"close", posix_close, METH_VARARGS, posix_close__doc__}, + {"close", posix_closex, METH_VARARGS, posix_close__doc__}, {"dup", posix_dup, METH_VARARGS, posix_dup__doc__}, {"dup2", posix_dup2, METH_VARARGS, posix_dup2__doc__}, {"lseek", posix_lseek, METH_VARARGS, posix_lseek__doc__},pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.4.3/000077500000000000000000000000001517431316200262075ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.4.3/Python-2.4.3/000077500000000000000000000000001517431316200301325ustar00rootroot00000000000000000_patch-setup.py.diff000066400000000000000000000035211517431316200341510ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.4.3/Python-2.4.3--- setup.py.orig 2011-07-07 19:19:43.800122463 +0900 +++ setup.py 2011-07-07 19:25:04.548416377 +0900 @@ -13,6 +13,7 @@ from distutils.command.build_ext import build_ext from distutils.command.install import install from distutils.command.install_lib import install_lib +from distutils.spawn import find_executable # This global variable is used to hold the list of modules to be disabled. disabled_module_list = [] @@ -242,10 +243,34 @@ return platform return sys.platform + def add_multiarch_paths(self): + # Debian/Ubuntu multiarch support. + # https://wiki.ubuntu.com/MultiarchSpec + if not find_executable('dpkg-architecture'): + return + tmpfile = os.path.join(self.build_temp, 'multiarch') + if not os.path.exists(self.build_temp): + os.makedirs(self.build_temp) + ret = os.system( + 'dpkg-architecture -qDEB_HOST_MULTIARCH > %s 2> /dev/null' % + tmpfile) + try: + if ret >> 8 == 0: + fp = open(tmpfile) + multiarch_path_component = fp.readline().strip() + fp.close() + add_dir_to_list(self.compiler.library_dirs, + '/usr/lib/' + multiarch_path_component) + add_dir_to_list(self.compiler.include_dirs, + '/usr/include/' + multiarch_path_component) + finally: + os.unlink(tmpfile) + def detect_modules(self): # Ensure that /usr/local is always used add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib') add_dir_to_list(self.compiler.include_dirs, '/usr/local/include') + self.add_multiarch_paths() # Add paths specified in the environment variables LDFLAGS and # CPPFLAGS for header and library files. 001_fortify_crash_workaround.diff000066400000000000000000000025651517431316200364120ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.4.3/Python-2.4.3Author: Dwayne Litzenberger Date: Sun Jun 22 01:15:05 2014 -0700 Patch configure to handle Ubuntu Bug#286334 Fixes this crash: *** buffer overflow detected ***: ./python terminated ======= Backtrace: ========= /lib/x86_64-linux-gnu/libc.so.6(__fortify_fail+0x37)[0x2b08765c9007] diff --git configure configure index 4838393..654de3f 100755 --- configure +++ configure @@ -20798,6 +20798,15 @@ done echo "$as_me:$LINENO: result: done" >&5 echo "${ECHO_T}done" >&6 +case $ac_sys_system in +Linux*) +# Workaround for bug in Ubuntu 10.10 amd64 gcc-4.4 +# See http://orip.org/2008/10/building-python-235-on-ubuntu-intrepid.html +# and Ubuntu Bug #286334 +BASECFLAGS="$BASECFLAGS -U_FORTIFY_SOURCE" +;; +esac + # generate output files ac_config_files="$ac_config_files Makefile.pre Modules/Setup.config" diff --git configure.in configure.in index ba7a011..060a73f 100644 --- configure.in +++ configure.in @@ -3072,6 +3072,15 @@ for dir in $SRCDIRS; do done AC_MSG_RESULT(done) +case $ac_sys_system in +Linux*) +# Workaround for bug in Ubuntu 10.10 amd64 gcc-4.4 +# See http://orip.org/2008/10/building-python-235-on-ubuntu-intrepid.html +# and Ubuntu Bug #286334 +BASECFLAGS="$BASECFLAGS -U_FORTIFY_SOURCE" +;; +esac + # generate output files AC_CONFIG_FILES(Makefile.pre Modules/Setup.config) AC_OUTPUT 002_patch-posixmodule.diff000066400000000000000000000015201517431316200347310ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.4.3/Python-2.4.3--- Modules/posixmodule.c.orig 2019-04-04 20:27:41.000000000 +0200 +++ Modules/posixmodule.c 2019-04-04 20:28:07.000000000 +0200 @@ -5300,7 +5300,7 @@ Close a file descriptor (for low level IO)."); static PyObject * -posix_close(PyObject *self, PyObject *args) +posix_closex(PyObject *self, PyObject *args) { int fd, res; if (!PyArg_ParseTuple(args, "i:close", &fd)) @@ -7554,7 +7554,7 @@ {"tcsetpgrp", posix_tcsetpgrp, METH_VARARGS, posix_tcsetpgrp__doc__}, #endif /* HAVE_TCSETPGRP */ {"open", posix_open, METH_VARARGS, posix_open__doc__}, - {"close", posix_close, METH_VARARGS, posix_close__doc__}, + {"close", posix_closex, METH_VARARGS, posix_close__doc__}, {"dup", posix_dup, METH_VARARGS, posix_dup__doc__}, {"dup2", posix_dup2, METH_VARARGS, posix_dup2__doc__}, {"lseek", posix_lseek, METH_VARARGS, posix_lseek__doc__},pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.4.4/000077500000000000000000000000001517431316200262105ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.4.4/Python-2.4.4/000077500000000000000000000000001517431316200301345ustar00rootroot00000000000000000_patch-setup.py.diff000066400000000000000000000035211517431316200341530ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.4.4/Python-2.4.4--- setup.py.orig 2011-07-07 19:19:43.800122463 +0900 +++ setup.py 2011-07-07 19:25:04.548416377 +0900 @@ -13,6 +13,7 @@ from distutils.command.build_ext import build_ext from distutils.command.install import install from distutils.command.install_lib import install_lib +from distutils.spawn import find_executable # This global variable is used to hold the list of modules to be disabled. disabled_module_list = [] @@ -242,10 +243,34 @@ return platform return sys.platform + def add_multiarch_paths(self): + # Debian/Ubuntu multiarch support. + # https://wiki.ubuntu.com/MultiarchSpec + if not find_executable('dpkg-architecture'): + return + tmpfile = os.path.join(self.build_temp, 'multiarch') + if not os.path.exists(self.build_temp): + os.makedirs(self.build_temp) + ret = os.system( + 'dpkg-architecture -qDEB_HOST_MULTIARCH > %s 2> /dev/null' % + tmpfile) + try: + if ret >> 8 == 0: + fp = open(tmpfile) + multiarch_path_component = fp.readline().strip() + fp.close() + add_dir_to_list(self.compiler.library_dirs, + '/usr/lib/' + multiarch_path_component) + add_dir_to_list(self.compiler.include_dirs, + '/usr/include/' + multiarch_path_component) + finally: + os.unlink(tmpfile) + def detect_modules(self): # Ensure that /usr/local is always used add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib') add_dir_to_list(self.compiler.include_dirs, '/usr/local/include') + self.add_multiarch_paths() # Add paths specified in the environment variables LDFLAGS and # CPPFLAGS for header and library files. 001_patch-posixmodule.diff000066400000000000000000000015201517431316200347320ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.4.4/Python-2.4.4--- Modules/posixmodule.c.orig 2019-04-04 20:27:41.000000000 +0200 +++ Modules/posixmodule.c 2019-04-04 20:28:07.000000000 +0200 @@ -5300,7 +5300,7 @@ Close a file descriptor (for low level IO)."); static PyObject * -posix_close(PyObject *self, PyObject *args) +posix_closex(PyObject *self, PyObject *args) { int fd, res; if (!PyArg_ParseTuple(args, "i:close", &fd)) @@ -7554,7 +7554,7 @@ {"tcsetpgrp", posix_tcsetpgrp, METH_VARARGS, posix_tcsetpgrp__doc__}, #endif /* HAVE_TCSETPGRP */ {"open", posix_open, METH_VARARGS, posix_open__doc__}, - {"close", posix_close, METH_VARARGS, posix_close__doc__}, + {"close", posix_closex, METH_VARARGS, posix_close__doc__}, {"dup", posix_dup, METH_VARARGS, posix_dup__doc__}, {"dup2", posix_dup2, METH_VARARGS, posix_dup2__doc__}, {"lseek", posix_lseek, METH_VARARGS, posix_lseek__doc__},pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.4.5/000077500000000000000000000000001517431316200262115ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.4.5/Python-2.4.5/000077500000000000000000000000001517431316200301365ustar00rootroot00000000000000000_patch-setup.py.diff000066400000000000000000000035211517431316200341550ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.4.5/Python-2.4.5--- setup.py.orig 2011-07-07 19:19:43.800122463 +0900 +++ setup.py 2011-07-07 19:25:04.548416377 +0900 @@ -13,6 +13,7 @@ from distutils.command.build_ext import build_ext from distutils.command.install import install from distutils.command.install_lib import install_lib +from distutils.spawn import find_executable # This global variable is used to hold the list of modules to be disabled. disabled_module_list = [] @@ -242,10 +243,34 @@ return platform return sys.platform + def add_multiarch_paths(self): + # Debian/Ubuntu multiarch support. + # https://wiki.ubuntu.com/MultiarchSpec + if not find_executable('dpkg-architecture'): + return + tmpfile = os.path.join(self.build_temp, 'multiarch') + if not os.path.exists(self.build_temp): + os.makedirs(self.build_temp) + ret = os.system( + 'dpkg-architecture -qDEB_HOST_MULTIARCH > %s 2> /dev/null' % + tmpfile) + try: + if ret >> 8 == 0: + fp = open(tmpfile) + multiarch_path_component = fp.readline().strip() + fp.close() + add_dir_to_list(self.compiler.library_dirs, + '/usr/lib/' + multiarch_path_component) + add_dir_to_list(self.compiler.include_dirs, + '/usr/include/' + multiarch_path_component) + finally: + os.unlink(tmpfile) + def detect_modules(self): # Ensure that /usr/local is always used add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib') add_dir_to_list(self.compiler.include_dirs, '/usr/local/include') + self.add_multiarch_paths() # Add paths specified in the environment variables LDFLAGS and # CPPFLAGS for header and library files. 001_patch-posixmodule.diff000066400000000000000000000015201517431316200347340ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.4.5/Python-2.4.5--- Modules/posixmodule.c.orig 2019-04-04 20:27:41.000000000 +0200 +++ Modules/posixmodule.c 2019-04-04 20:28:07.000000000 +0200 @@ -5300,7 +5300,7 @@ Close a file descriptor (for low level IO)."); static PyObject * -posix_close(PyObject *self, PyObject *args) +posix_closex(PyObject *self, PyObject *args) { int fd, res; if (!PyArg_ParseTuple(args, "i:close", &fd)) @@ -7554,7 +7554,7 @@ {"tcsetpgrp", posix_tcsetpgrp, METH_VARARGS, posix_tcsetpgrp__doc__}, #endif /* HAVE_TCSETPGRP */ {"open", posix_open, METH_VARARGS, posix_open__doc__}, - {"close", posix_close, METH_VARARGS, posix_close__doc__}, + {"close", posix_closex, METH_VARARGS, posix_close__doc__}, {"dup", posix_dup, METH_VARARGS, posix_dup__doc__}, {"dup2", posix_dup2, METH_VARARGS, posix_dup2__doc__}, {"lseek", posix_lseek, METH_VARARGS, posix_lseek__doc__},pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.4.6/000077500000000000000000000000001517431316200262125ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.4.6/Python-2.4.6/000077500000000000000000000000001517431316200301405ustar00rootroot00000000000000000_patch-setup.py.diff000066400000000000000000000035211517431316200341570ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.4.6/Python-2.4.6--- setup.py.orig 2011-07-07 19:19:43.800122463 +0900 +++ setup.py 2011-07-07 19:25:04.548416377 +0900 @@ -13,6 +13,7 @@ from distutils.command.build_ext import build_ext from distutils.command.install import install from distutils.command.install_lib import install_lib +from distutils.spawn import find_executable # This global variable is used to hold the list of modules to be disabled. disabled_module_list = [] @@ -242,10 +243,34 @@ return platform return sys.platform + def add_multiarch_paths(self): + # Debian/Ubuntu multiarch support. + # https://wiki.ubuntu.com/MultiarchSpec + if not find_executable('dpkg-architecture'): + return + tmpfile = os.path.join(self.build_temp, 'multiarch') + if not os.path.exists(self.build_temp): + os.makedirs(self.build_temp) + ret = os.system( + 'dpkg-architecture -qDEB_HOST_MULTIARCH > %s 2> /dev/null' % + tmpfile) + try: + if ret >> 8 == 0: + fp = open(tmpfile) + multiarch_path_component = fp.readline().strip() + fp.close() + add_dir_to_list(self.compiler.library_dirs, + '/usr/lib/' + multiarch_path_component) + add_dir_to_list(self.compiler.include_dirs, + '/usr/include/' + multiarch_path_component) + finally: + os.unlink(tmpfile) + def detect_modules(self): # Ensure that /usr/local is always used add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib') add_dir_to_list(self.compiler.include_dirs, '/usr/local/include') + self.add_multiarch_paths() # Add paths specified in the environment variables LDFLAGS and # CPPFLAGS for header and library files. 001_patch-posixmodule.diff000066400000000000000000000015201517431316200347360ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.4.6/Python-2.4.6--- Modules/posixmodule.c.orig 2019-04-04 20:27:41.000000000 +0200 +++ Modules/posixmodule.c 2019-04-04 20:28:07.000000000 +0200 @@ -5300,7 +5300,7 @@ Close a file descriptor (for low level IO)."); static PyObject * -posix_close(PyObject *self, PyObject *args) +posix_closex(PyObject *self, PyObject *args) { int fd, res; if (!PyArg_ParseTuple(args, "i:close", &fd)) @@ -7554,7 +7554,7 @@ {"tcsetpgrp", posix_tcsetpgrp, METH_VARARGS, posix_tcsetpgrp__doc__}, #endif /* HAVE_TCSETPGRP */ {"open", posix_open, METH_VARARGS, posix_open__doc__}, - {"close", posix_close, METH_VARARGS, posix_close__doc__}, + {"close", posix_closex, METH_VARARGS, posix_close__doc__}, {"dup", posix_dup, METH_VARARGS, posix_dup__doc__}, {"dup2", posix_dup2, METH_VARARGS, posix_dup2__doc__}, {"lseek", posix_lseek, METH_VARARGS, posix_lseek__doc__},pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.5.0/000077500000000000000000000000001517431316200262055ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.5.0/Python-2.5/000077500000000000000000000000001517431316200277705ustar00rootroot00000000000000000_patch-setup.py.diff000066400000000000000000000035211517431316200340070ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.5.0/Python-2.5--- setup.py.orig 2011-07-07 19:19:43.800122463 +0900 +++ setup.py 2011-07-07 19:25:04.548416377 +0900 @@ -13,6 +13,7 @@ from distutils.command.build_ext import build_ext from distutils.command.install import install from distutils.command.install_lib import install_lib +from distutils.spawn import find_executable # This global variable is used to hold the list of modules to be disabled. disabled_module_list = [] @@ -242,10 +243,34 @@ return platform return sys.platform + def add_multiarch_paths(self): + # Debian/Ubuntu multiarch support. + # https://wiki.ubuntu.com/MultiarchSpec + if not find_executable('dpkg-architecture'): + return + tmpfile = os.path.join(self.build_temp, 'multiarch') + if not os.path.exists(self.build_temp): + os.makedirs(self.build_temp) + ret = os.system( + 'dpkg-architecture -qDEB_HOST_MULTIARCH > %s 2> /dev/null' % + tmpfile) + try: + if ret >> 8 == 0: + fp = open(tmpfile) + multiarch_path_component = fp.readline().strip() + fp.close() + add_dir_to_list(self.compiler.library_dirs, + '/usr/lib/' + multiarch_path_component) + add_dir_to_list(self.compiler.include_dirs, + '/usr/include/' + multiarch_path_component) + finally: + os.unlink(tmpfile) + def detect_modules(self): # Ensure that /usr/local is always used add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib') add_dir_to_list(self.compiler.include_dirs, '/usr/local/include') + self.add_multiarch_paths() # Add paths specified in the environment variables LDFLAGS and # CPPFLAGS for header and library files. 001_patch-svnversion.patch000066400000000000000000000033061517431316200346250ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.5.0/Python-2.5diff -r -u ./Makefile.pre.in ../Python-2.5/Makefile.pre.in --- ./Makefile.pre.in 2006-07-31 01:20:10.000000000 +0900 +++ ../Python-2.5/Makefile.pre.in 2013-05-08 19:19:27.000000000 +0900 @@ -455,7 +455,7 @@ $(SIGNAL_OBJS) \ $(MODOBJS) \ $(srcdir)/Modules/getbuildinfo.c - $(CC) -c $(PY_CFLAGS) -DSVNVERSION=\"`LANG=C $(SVNVERSION)`\" -o $@ $(srcdir)/Modules/getbuildinfo.c + $(CC) -c $(PY_CFLAGS) -DSVNVERSION="\"`LANG=C $(SVNVERSION)`\"" -o $@ $(srcdir)/Modules/getbuildinfo.c Modules/getpath.o: $(srcdir)/Modules/getpath.c Makefile $(CC) -c $(PY_CFLAGS) -DPYTHONPATH='"$(PYTHONPATH)"' \ diff -r -u ./Modules/getbuildinfo.c ../Python-2.5/Modules/getbuildinfo.c --- ./Modules/getbuildinfo.c 2006-01-18 18:13:51.000000000 +0900 +++ ../Python-2.5/Modules/getbuildinfo.c 2013-05-08 19:19:40.000000000 +0900 @@ -43,6 +43,6 @@ #ifdef SVNVERSION return SVNVERSION; #else - return "exported"; + return "Unversioned directory"; #endif } diff -r -u ./Python/sysmodule.c ../Python-2.5/Python/sysmodule.c --- ./Python/sysmodule.c 2006-07-21 14:32:28.000000000 +0900 +++ ../Python-2.5/Python/sysmodule.c 2013-05-08 19:19:55.000000000 +0900 @@ -1009,7 +1009,7 @@ svnversion = _Py_svnversion(); - if (strcmp(svnversion, "exported") != 0) + if (strcmp(svnversion, "Unversioned directory") != 0) svn_revision = svnversion; else if (istag) { len = strlen(_patchlevel_revision); diff -r -u ./configure.in ../Python-2.5/configure.in --- ./configure.in 2006-09-05 11:54:42.000000000 +0900 +++ ../Python-2.5/configure.in 2013-05-08 19:20:05.000000000 +0900 @@ -686,7 +686,7 @@ then SVNVERSION="svnversion \$(srcdir)" else - SVNVERSION="echo exported" + SVNVERSION="echo Unversioned directory" fi case $MACHDEP in 002_darwin_c_source.patch000066400000000000000000000132671517431316200344720ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.5.0/Python-2.5diff -r -u ./configure ../Python-2.5/configure --- ./configure 2006-09-05 11:54:42.000000000 +0900 +++ ../Python-2.5/configure 2013-07-19 15:27:46.000000000 +0900 @@ -1396,6 +1396,16 @@ _ACEOF +# The later defininition of _XOPEN_SOURCE and _POSIX_C_SOURCE disables +# certain features on Mac OS X, so we need _DARWIN_C_SOURCE to re-enable +# them. + +cat >>confdefs.h <<\_ACEOF +#define _DARWIN_C_SOURCE 1 +_ACEOF + + + define_xopen_source=yes # Arguments passed to configure. @@ -3885,11 +3895,110 @@ ;; # is there any other compiler on Darwin besides gcc? Darwin*) - BASECFLAGS="$BASECFLAGS -Wno-long-double -no-cpp-precomp -mno-fused-madd" + # -Wno-long-double, -no-cpp-precomp, and -mno-fused-madd + # used to be here, but non-Apple gcc doesn't accept them. + if test "${CC}" = gcc + then + { echo "$as_me:${as_lineno-$LINENO}: checking which compiler should be used" >&5 +echo -n "checking which compiler should be used... " >&6; } + case "${UNIVERSALSDK}" in + */MacOSX10.4u.sdk) + # Build using 10.4 SDK, force usage of gcc when the + # compiler is gcc, otherwise the user will get very + # confusing error messages when building on OSX 10.6 + CC=gcc-4.0 + CPP=cpp-4.0 + ;; + esac + { echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +echo "$CC" >&6; } + fi + + if test "${enable_universalsdk}"; then - BASECFLAGS="-arch ppc -arch i386 -isysroot ${UNIVERSALSDK} ${BASECFLAGS}" + UNIVERSAL_ARCH_FLAGS="" + if test "$UNIVERSAL_ARCHS" = "32-bit" ; then + UNIVERSAL_ARCH_FLAGS="-arch ppc -arch i386" + ARCH_RUN_32BIT="" + LIPO_32BIT_FLAGS="" + elif test "$UNIVERSAL_ARCHS" = "64-bit" ; then + UNIVERSAL_ARCH_FLAGS="-arch ppc64 -arch x86_64" + LIPO_32BIT_FLAGS="" + ARCH_RUN_32BIT="true" + + elif test "$UNIVERSAL_ARCHS" = "all" ; then + UNIVERSAL_ARCH_FLAGS="-arch i386 -arch ppc -arch ppc64 -arch x86_64" + LIPO_32BIT_FLAGS="-extract ppc7400 -extract i386" + ARCH_RUN_32BIT="/usr/bin/arch -i386 -ppc" + + elif test "$UNIVERSAL_ARCHS" = "intel" ; then + UNIVERSAL_ARCH_FLAGS="-arch i386 -arch x86_64" + LIPO_32BIT_FLAGS="-extract i386" + ARCH_RUN_32BIT="/usr/bin/arch -i386" + + elif test "$UNIVERSAL_ARCHS" = "3-way" ; then + UNIVERSAL_ARCH_FLAGS="-arch i386 -arch ppc -arch x86_64" + LIPO_32BIT_FLAGS="-extract ppc7400 -extract i386" + ARCH_RUN_32BIT="/usr/bin/arch -i386 -ppc" + + else + as_fn_error $? "proper usage is --with-universal-arch=32-bit|64-bit|all|intel|3-way" "$LINENO" 5 + + fi + + + CFLAGS="${UNIVERSAL_ARCH_FLAGS} -isysroot ${UNIVERSALSDK} ${CFLAGS}" + if test "${UNIVERSALSDK}" != "/" + then + CFLAGS="-isysroot ${UNIVERSALSDK} ${CFLAGS}" + LDFLAGS="-isysroot ${UNIVERSALSDK} ${LDFLAGS}" + CPPFLAGS="-isysroot ${UNIVERSALSDK} ${CPPFLAGS}" + fi fi + # Calculate the right deployment target for this build. + # + cur_target=`sw_vers -productVersion | sed 's/\(10\.[0-9]*\).*/\1/'` + if test ${cur_target} '>' 10.2 && \ + test ${cur_target} '<' 10.6 + then + cur_target=10.3 + if test ${enable_universalsdk}; then + if test "${UNIVERSAL_ARCHS}" = "all"; then + # Ensure that the default platform for a + # 4-way universal build is OSX 10.5, + # that's the first OS release where + # 4-way builds make sense. + cur_target='10.5' + + elif test "${UNIVERSAL_ARCHS}" = "3-way"; then + cur_target='10.5' + + elif test "${UNIVERSAL_ARCHS}" = "intel"; then + cur_target='10.5' + + elif test "${UNIVERSAL_ARCHS}" = "64-bit"; then + cur_target='10.5' + fi + else + if test `/usr/bin/arch` = "i386"; then + # On Intel macs default to a deployment + # target of 10.4, that's the first OSX + # release with Intel support. + cur_target="10.4" + fi + fi + fi + CONFIGURE_MACOSX_DEPLOYMENT_TARGET=${MACOSX_DEPLOYMENT_TARGET-${cur_target}} + + # Make sure that MACOSX_DEPLOYMENT_TARGET is set in the + # environment with a value that is the same as what we'll use + # in the Makefile to ensure that we'll get the same compiler + # environment during configure and build time. + MACOSX_DEPLOYMENT_TARGET="$CONFIGURE_MACOSX_DEPLOYMENT_TARGET" + export MACOSX_DEPLOYMENT_TARGET + EXPORT_MACOSX_DEPLOYMENT_TARGET='' + ;; OSF*) BASECFLAGS="$BASECFLAGS -mieee" @@ -10851,7 +10960,7 @@ if test "${enable_universalsdk}"; then : else - LIBTOOL_CRUFT="${LIBTOOL_CRUFT} -arch_only `arch`" + LIBTOOL_CRUFT="${LIBTOOL_CRUFT}" fi LIBTOOL_CRUFT=$LIBTOOL_CRUFT' -install_name $(PYTHONFRAMEWORKINSTALLDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK)' LIBTOOL_CRUFT=$LIBTOOL_CRUFT' -compatibility_version $(VERSION) -current_version $(VERSION)';; @@ -10863,7 +10972,7 @@ else LIBTOOL_CRUFT="" fi - LIBTOOL_CRUFT=$LIBTOOL_CRUFT" -lSystem -lSystemStubs -arch_only `arch`" + LIBTOOL_CRUFT=$LIBTOOL_CRUFT" -lSystem -lSystemStubs" LIBTOOL_CRUFT=$LIBTOOL_CRUFT' -install_name $(PYTHONFRAMEWORKINSTALLDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK)' LIBTOOL_CRUFT=$LIBTOOL_CRUFT' -compatibility_version $(VERSION) -current_version $(VERSION)';; esac diff -r -u ./pyconfig.h.in ../Python-2.5/pyconfig.h.in --- ./pyconfig.h.in 2006-07-30 23:09:47.000000000 +0900 +++ ../Python-2.5/pyconfig.h.in 2013-07-17 23:12:31.000000000 +0900 @@ -912,6 +912,11 @@ /* Define on Irix to enable u_int */ #undef _BSD_TYPES +/* Define on Darwin to activate all library features */ +#ifndef _DARWIN_C_SOURCE +#define _DARWIN_C_SOURCE +#endif + /* This must be set to 64 on some systems to enable large file support. */ #undef _FILE_OFFSET_BITS 003_osx_lp64.patch000066400000000000000000000215441517431316200330000ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.5.0/Python-2.5diff -r -u ./Include/pymactoolbox.h ../Python-2.5/Include/pymactoolbox.h --- ./Include/pymactoolbox.h 2004-11-05 16:02:59.000000000 +0900 +++ ../Python-2.5/Include/pymactoolbox.h 2013-07-17 23:38:51.000000000 +0900 @@ -8,7 +8,10 @@ #endif #include + +#ifndef __LP64__ #include +#endif /* !__LP64__ */ /* ** Helper routines for error codes and such. @@ -18,8 +21,11 @@ PyObject *PyMac_GetOSErrException(void); /* Initialize & return it */ PyObject *PyErr_Mac(PyObject *, int); /* Exception with a mac error */ PyObject *PyMac_Error(OSErr); /* Uses PyMac_GetOSErrException */ +#ifndef __LP64__ extern OSErr PyMac_GetFullPathname(FSSpec *, char *, int); /* convert fsspec->path */ +#endif /* __LP64__ */ + /* ** These conversion routines are defined in mactoolboxglue.c itself. */ @@ -83,8 +89,10 @@ #endif /* USE_TOOLBOX_OBJECT_GLUE */ /* macfs exports */ +#ifndef __LP64__ int PyMac_GetFSSpec(PyObject *, FSSpec *); /* argument parser for FSSpec */ PyObject *PyMac_BuildFSSpec(FSSpec *); /* Convert FSSpec to PyObject */ +#endif /* !__LP64__ */ int PyMac_GetFSRef(PyObject *, FSRef *); /* argument parser for FSRef */ PyObject *PyMac_BuildFSRef(FSRef *); /* Convert FSRef to PyObject */ @@ -101,39 +109,54 @@ extern int CmpInstObj_Convert(PyObject *, ComponentInstance *); /* Ctl exports */ +#ifndef __LP64__ extern PyObject *CtlObj_New(ControlHandle); extern int CtlObj_Convert(PyObject *, ControlHandle *); +#endif /* !__LP64__ */ /* Dlg exports */ +#ifndef __LP64__ extern PyObject *DlgObj_New(DialogPtr); extern int DlgObj_Convert(PyObject *, DialogPtr *); extern PyObject *DlgObj_WhichDialog(DialogPtr); +#endif /* !__LP64__ */ /* Drag exports */ +#ifndef __LP64__ extern PyObject *DragObj_New(DragReference); extern int DragObj_Convert(PyObject *, DragReference *); +#endif /* !__LP64__ */ /* List exports */ +#ifndef __LP64__ extern PyObject *ListObj_New(ListHandle); extern int ListObj_Convert(PyObject *, ListHandle *); +#endif /* !__LP64__ */ /* Menu exports */ +#ifndef __LP64__ extern PyObject *MenuObj_New(MenuHandle); extern int MenuObj_Convert(PyObject *, MenuHandle *); +#endif /* !__LP64__ */ /* Qd exports */ +#ifndef __LP64__ extern PyObject *GrafObj_New(GrafPtr); extern int GrafObj_Convert(PyObject *, GrafPtr *); extern PyObject *BMObj_New(BitMapPtr); extern int BMObj_Convert(PyObject *, BitMapPtr *); extern PyObject *QdRGB_New(RGBColor *); extern int QdRGB_Convert(PyObject *, RGBColor *); +#endif /* !__LP64__ */ /* Qdoffs exports */ +#ifndef __LP64__ extern PyObject *GWorldObj_New(GWorldPtr); extern int GWorldObj_Convert(PyObject *, GWorldPtr *); +#endif /* !__LP64__ */ /* Qt exports */ +#ifndef __LP64__ extern PyObject *TrackObj_New(Track); extern int TrackObj_Convert(PyObject *, Track *); extern PyObject *MovieObj_New(Movie); @@ -146,6 +169,7 @@ extern int UserDataObj_Convert(PyObject *, UserData *); extern PyObject *MediaObj_New(Media); extern int MediaObj_Convert(PyObject *, Media *); +#endif /* !__LP64__ */ /* Res exports */ extern PyObject *ResObj_New(Handle); @@ -154,13 +178,17 @@ extern int OptResObj_Convert(PyObject *, Handle *); /* TE exports */ +#ifndef __LP64__ extern PyObject *TEObj_New(TEHandle); extern int TEObj_Convert(PyObject *, TEHandle *); +#endif /* !__LP64__ */ /* Win exports */ +#ifndef __LP64__ extern PyObject *WinObj_New(WindowPtr); extern int WinObj_Convert(PyObject *, WindowPtr *); extern PyObject *WinObj_WhichWindow(WindowPtr); +#endif /* !__LP64__ */ /* CF exports */ extern PyObject *CFObj_New(CFTypeRef); diff -r -u ./Mac/Modules/res/_Resmodule.c ../Python-2.5/Mac/Modules/res/_Resmodule.c --- ./Mac/Modules/res/_Resmodule.c 2005-07-04 05:59:44.000000000 +0900 +++ ../Python-2.5/Mac/Modules/res/_Resmodule.c 2013-07-17 23:38:51.000000000 +0900 @@ -414,6 +414,7 @@ return _res; } +#ifndef __LP64__ static PyObject *ResObj_as_Control(ResourceObject *_self, PyObject *_args) { PyObject *_res = NULL; @@ -431,6 +432,7 @@ return _res; } +#endif /* !__LP64__ */ static PyObject *ResObj_LoadResource(ResourceObject *_self, PyObject *_args) { @@ -1152,6 +1154,7 @@ return _res; } +#ifndef __LP64__ static PyObject *Res_OpenRFPerm(PyObject *_self, PyObject *_args) { PyObject *_res = NULL; @@ -1287,6 +1290,7 @@ _res = Py_None; return _res; } +#endif /* !__LP64__ */ static PyObject *Res_InsertResourceFile(PyObject *_self, PyObject *_args) { @@ -1327,6 +1331,7 @@ return _res; } +#ifndef __LP64__ static PyObject *Res_FSpResourceFileAlreadyOpen(PyObject *_self, PyObject *_args) { PyObject *_res = NULL; @@ -1413,6 +1418,7 @@ nextRefNum); return _res; } +#endif /* !__LP64__ */ static PyObject *Res_FSOpenResFile(PyObject *_self, PyObject *_args) { @@ -1438,6 +1444,7 @@ return _res; } +#ifndef __LP64__ static PyObject *Res_FSCreateResFile(PyObject *_self, PyObject *_args) { PyObject *_res = NULL; @@ -1534,6 +1541,7 @@ PyMac_BuildFSSpec, &newSpec); return _res; } +#endif /* __LP64__ */ static PyObject *Res_FSOpenResourceFile(PyObject *_self, PyObject *_args) { @@ -1637,6 +1645,7 @@ PyDoc_STR("(short refNum) -> (short _rv)")}, {"SetResFileAttrs", (PyCFunction)Res_SetResFileAttrs, 1, PyDoc_STR("(short refNum, short attrs) -> None")}, +#ifndef __LP64__ {"OpenRFPerm", (PyCFunction)Res_OpenRFPerm, 1, PyDoc_STR("(Str255 fileName, short vRefNum, SignedByte permission) -> (short _rv)")}, {"HOpenResFile", (PyCFunction)Res_HOpenResFile, 1, @@ -1647,10 +1656,12 @@ PyDoc_STR("(FSSpec spec, SignedByte permission) -> (short _rv)")}, {"FSpCreateResFile", (PyCFunction)Res_FSpCreateResFile, 1, PyDoc_STR("(FSSpec spec, OSType creator, OSType fileType, ScriptCode scriptTag) -> None")}, +#endif /* !__LP64__ */ {"InsertResourceFile", (PyCFunction)Res_InsertResourceFile, 1, PyDoc_STR("(SInt16 refNum, RsrcChainLocation where) -> None")}, {"DetachResourceFile", (PyCFunction)Res_DetachResourceFile, 1, PyDoc_STR("(SInt16 refNum) -> None")}, +#ifndef __LP64__ {"FSpResourceFileAlreadyOpen", (PyCFunction)Res_FSpResourceFileAlreadyOpen, 1, PyDoc_STR("(FSSpec resourceFile) -> (Boolean _rv, Boolean inChain, SInt16 refNum)")}, {"FSpOpenOrphanResFile", (PyCFunction)Res_FSpOpenOrphanResFile, 1, @@ -1659,14 +1670,17 @@ PyDoc_STR("() -> (SInt16 refNum)")}, {"GetNextResourceFile", (PyCFunction)Res_GetNextResourceFile, 1, PyDoc_STR("(SInt16 curRefNum) -> (SInt16 nextRefNum)")}, +#endif /* __LP64__ */ {"FSOpenResFile", (PyCFunction)Res_FSOpenResFile, 1, PyDoc_STR("(FSRef ref, SignedByte permission) -> (short _rv)")}, +#ifndef __LP64__ {"FSCreateResFile", (PyCFunction)Res_FSCreateResFile, 1, PyDoc_STR("(FSRef parentRef, Buffer nameLength) -> (FSRef newRef, FSSpec newSpec)")}, {"FSResourceFileAlreadyOpen", (PyCFunction)Res_FSResourceFileAlreadyOpen, 1, PyDoc_STR("(FSRef resourceFileRef) -> (Boolean _rv, Boolean inChain, SInt16 refNum)")}, {"FSCreateResourceFile", (PyCFunction)Res_FSCreateResourceFile, 1, PyDoc_STR("(FSRef parentRef, Buffer nameLength, Buffer forkNameLength) -> (FSRef newRef, FSSpec newSpec)")}, +#endif /* __LP64__ */ {"FSOpenResourceFile", (PyCFunction)Res_FSOpenResourceFile, 1, PyDoc_STR("(FSRef ref, Buffer forkNameLength, SignedByte permissions) -> (SInt16 refNum)")}, {"Handle", (PyCFunction)Res_Handle, 1, diff -r -u ./Modules/_ctypes/libffi/src/darwin/ffitarget.h ../Python-2.5/Modules/_ctypes/libffi/src/darwin/ffitarget.h --- ./Modules/_ctypes/libffi/src/darwin/ffitarget.h 2006-05-26 06:58:05.000000000 +0900 +++ ../Python-2.5/Modules/_ctypes/libffi/src/darwin/ffitarget.h 2013-07-17 23:38:51.000000000 +0900 @@ -4,7 +4,7 @@ * created by configure). This makes is possible to build a univeral binary * of ctypes in one go. */ -#if defined(__i386__) +#if defined(__i386__) || defined(__x86_64__) #ifndef X86_DARWIN #define X86_DARWIN diff -r -u ./Python/mactoolboxglue.c ../Python-2.5/Python/mactoolboxglue.c --- ./Python/mactoolboxglue.c 2006-07-12 01:44:25.000000000 +0900 +++ ../Python-2.5/Python/mactoolboxglue.c 2013-07-17 23:39:09.000000000 +0900 @@ -106,6 +106,7 @@ } +#ifndef __LP64__ OSErr PyMac_GetFullPathname(FSSpec *fss, char *path, int len) { @@ -153,6 +154,7 @@ Py_XDECREF(fs); return err; } +#endif /* !__LP64__ */ /* Convert a 4-char string object argument to an OSType value */ int @@ -417,6 +419,7 @@ GLUE_NEW(GWorldPtr, GWorldObj_New, "Carbon.Qdoffs") GLUE_CONVERT(GWorldPtr, GWorldObj_Convert, "Carbon.Qdoffs") +#ifndef __LP64__ GLUE_NEW(Track, TrackObj_New, "Carbon.Qt") GLUE_CONVERT(Track, TrackObj_Convert, "Carbon.Qt") GLUE_NEW(Movie, MovieObj_New, "Carbon.Qt") @@ -429,6 +432,7 @@ GLUE_CONVERT(UserData, UserDataObj_Convert, "Carbon.Qt") GLUE_NEW(Media, MediaObj_New, "Carbon.Qt") GLUE_CONVERT(Media, MediaObj_Convert, "Carbon.Qt") +#endif /* !__LP64__ */ GLUE_NEW(Handle, ResObj_New, "Carbon.Res") GLUE_CONVERT(Handle, ResObj_Convert, "Carbon.Res") 004_osx_libffi.patch000066400000000000000000005661361517431316200334620ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.5.0/Python-2.5diff -r -u ./Modules/_ctypes/libffi_osx/LICENSE ./Modules/_ctypes/libffi_osx/LICENSE new file mode 100644 index 0000000..f591795 --- /dev/null +++ ./Modules/_ctypes/libffi_osx/LICENSE @@ -0,0 +1,20 @@ +libffi - Copyright (c) 1996-2003 Red Hat, Inc. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +``Software''), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff -r -u ./Modules/_ctypes/libffi_osx/README ./Modules/_ctypes/libffi_osx/README new file mode 100644 index 0000000..1fc2747 --- /dev/null +++ ./Modules/_ctypes/libffi_osx/README @@ -0,0 +1,500 @@ +This directory contains the libffi package, which is not part of GCC but +shipped with GCC as convenience. + +Status +====== + +libffi-2.00 has not been released yet! This is a development snapshot! + +libffi-1.20 was released on October 5, 1998. Check the libffi web +page for updates: . + + +What is libffi? +=============== + +Compilers for high level languages generate code that follow certain +conventions. These conventions are necessary, in part, for separate +compilation to work. One such convention is the "calling +convention". The "calling convention" is essentially a set of +assumptions made by the compiler about where function arguments will +be found on entry to a function. A "calling convention" also specifies +where the return value for a function is found. + +Some programs may not know at the time of compilation what arguments +are to be passed to a function. For instance, an interpreter may be +told at run-time about the number and types of arguments used to call +a given function. Libffi can be used in such programs to provide a +bridge from the interpreter program to compiled code. + +The libffi library provides a portable, high level programming +interface to various calling conventions. This allows a programmer to +call any function specified by a call interface description at run +time. + +Ffi stands for Foreign Function Interface. A foreign function +interface is the popular name for the interface that allows code +written in one language to call code written in another language. The +libffi library really only provides the lowest, machine dependent +layer of a fully featured foreign function interface. A layer must +exist above libffi that handles type conversions for values passed +between the two languages. + + +Supported Platforms and Prerequisites +===================================== + +Libffi has been ported to: + + SunOS 4.1.3 & Solaris 2.x (SPARC-V8, SPARC-V9) + + Irix 5.3 & 6.2 (System V/o32 & n32) + + Intel x86 - Linux (System V ABI) + + Alpha - Linux and OSF/1 + + m68k - Linux (System V ABI) + + PowerPC - Linux (System V ABI, Darwin, AIX) + + ARM - Linux (System V ABI) + +Libffi has been tested with the egcs 1.0.2 gcc compiler. Chances are +that other versions will work. Libffi has also been built and tested +with the SGI compiler tools. + +On PowerPC, the tests failed (see the note below). + +You must use GNU make to build libffi. SGI's make will not work. +Sun's probably won't either. + +If you port libffi to another platform, please let me know! I assume +that some will be easy (x86 NetBSD), and others will be more difficult +(HP). + + +Installing libffi +================= + +[Note: before actually performing any of these installation steps, + you may wish to read the "Platform Specific Notes" below.] + +First you must configure the distribution for your particular +system. Go to the directory you wish to build libffi in and run the +"configure" program found in the root directory of the libffi source +distribution. + +You may want to tell configure where to install the libffi library and +header files. To do that, use the --prefix configure switch. Libffi +will install under /usr/local by default. + +If you want to enable extra run-time debugging checks use the the +--enable-debug configure switch. This is useful when your program dies +mysteriously while using libffi. + +Another useful configure switch is --enable-purify-safety. Using this +will add some extra code which will suppress certain warnings when you +are using Purify with libffi. Only use this switch when using +Purify, as it will slow down the library. + +Configure has many other options. Use "configure --help" to see them all. + +Once configure has finished, type "make". Note that you must be using +GNU make. SGI's make will not work. Sun's probably won't either. +You can ftp GNU make from prep.ai.mit.edu:/pub/gnu. + +To ensure that libffi is working as advertised, type "make test". + +To install the library and header files, type "make install". + + +Using libffi +============ + + The Basics + ---------- + +Libffi assumes that you have a pointer to the function you wish to +call and that you know the number and types of arguments to pass it, +as well as the return type of the function. + +The first thing you must do is create an ffi_cif object that matches +the signature of the function you wish to call. The cif in ffi_cif +stands for Call InterFace. To prepare a call interface object, use the +following function: + +ffi_status ffi_prep_cif(ffi_cif *cif, ffi_abi abi, + unsigned int nargs, + ffi_type *rtype, ffi_type **atypes); + + CIF is a pointer to the call interface object you wish + to initialize. + + ABI is an enum that specifies the calling convention + to use for the call. FFI_DEFAULT_ABI defaults + to the system's native calling convention. Other + ABI's may be used with care. They are system + specific. + + NARGS is the number of arguments this function accepts. + libffi does not yet support vararg functions. + + RTYPE is a pointer to an ffi_type structure that represents + the return type of the function. Ffi_type objects + describe the types of values. libffi provides + ffi_type objects for many of the native C types: + signed int, unsigned int, signed char, unsigned char, + etc. There is also a pointer ffi_type object and + a void ffi_type. Use &ffi_type_void for functions that + don't return values. + + ATYPES is a vector of ffi_type pointers. ARGS must be NARGS long. + If NARGS is 0, this is ignored. + + +ffi_prep_cif will return a status code that you are responsible +for checking. It will be one of the following: + + FFI_OK - All is good. + + FFI_BAD_TYPEDEF - One of the ffi_type objects that ffi_prep_cif + came across is bad. + + +Before making the call, the VALUES vector should be initialized +with pointers to the appropriate argument values. + +To call the function using the initialized ffi_cif, use the +ffi_call function: + +void ffi_call(ffi_cif *cif, void *fn, void *rvalue, void **avalues); + + CIF is a pointer to the ffi_cif initialized specifically + for this function. + + FN is a pointer to the function you want to call. + + RVALUE is a pointer to a chunk of memory that is to hold the + result of the function call. Currently, it must be + at least one word in size (except for the n32 version + under Irix 6.x, which must be a pointer to an 8 byte + aligned value (a long long). It must also be at least + word aligned (depending on the return type, and the + system's alignment requirements). If RTYPE is + &ffi_type_void, this is ignored. If RVALUE is NULL, + the return value is discarded. + + AVALUES is a vector of void* that point to the memory locations + holding the argument values for a call. + If NARGS is 0, this is ignored. + + +If you are expecting a return value from FN it will have been stored +at RVALUE. + + + + An Example + ---------- + +Here is a trivial example that calls puts() a few times. + + #include + #include + + int main() + { + ffi_cif cif; + ffi_type *args[1]; + void *values[1]; + char *s; + int rc; + + /* Initialize the argument info vectors */ + args[0] = &ffi_type_uint; + values[0] = &s; + + /* Initialize the cif */ + if (ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, + &ffi_type_uint, args) == FFI_OK) + { + s = "Hello World!"; + ffi_call(&cif, puts, &rc, values); + /* rc now holds the result of the call to puts */ + + /* values holds a pointer to the function's arg, so to + call puts() again all we need to do is change the + value of s */ + s = "This is cool!"; + ffi_call(&cif, puts, &rc, values); + } + + return 0; + } + + + + Aggregate Types + --------------- + +Although libffi has no special support for unions or bit-fields, it is +perfectly happy passing structures back and forth. You must first +describe the structure to libffi by creating a new ffi_type object +for it. Here is the definition of ffi_type: + + typedef struct _ffi_type + { + unsigned size; + short alignment; + short type; + struct _ffi_type **elements; + } ffi_type; + +All structures must have type set to FFI_TYPE_STRUCT. You may set +size and alignment to 0. These will be calculated and reset to the +appropriate values by ffi_prep_cif(). + +elements is a NULL terminated array of pointers to ffi_type objects +that describe the type of the structure elements. These may, in turn, +be structure elements. + +The following example initializes a ffi_type object representing the +tm struct from Linux's time.h: + + struct tm { + int tm_sec; + int tm_min; + int tm_hour; + int tm_mday; + int tm_mon; + int tm_year; + int tm_wday; + int tm_yday; + int tm_isdst; + /* Those are for future use. */ + long int __tm_gmtoff__; + __const char *__tm_zone__; + }; + + { + ffi_type tm_type; + ffi_type *tm_type_elements[12]; + int i; + + tm_type.size = tm_type.alignment = 0; + tm_type.elements = &tm_type_elements; + + for (i = 0; i < 9; i++) + tm_type_elements[i] = &ffi_type_sint; + + tm_type_elements[9] = &ffi_type_slong; + tm_type_elements[10] = &ffi_type_pointer; + tm_type_elements[11] = NULL; + + /* tm_type can now be used to represent tm argument types and + return types for ffi_prep_cif() */ + } + + + +Platform Specific Notes +======================= + + Intel x86 + --------- + +There are no known problems with the x86 port. + + Sun SPARC - SunOS 4.1.3 & Solaris 2.x + ------------------------------------- + +You must use GNU Make to build libffi on Sun platforms. + + MIPS - Irix 5.3 & 6.x + --------------------- + +Irix 6.2 and better supports three different calling conventions: o32, +n32 and n64. Currently, libffi only supports both o32 and n32 under +Irix 6.x, but only o32 under Irix 5.3. Libffi will automatically be +configured for whichever calling convention it was built for. + +By default, the configure script will try to build libffi with the GNU +development tools. To build libffi with the SGI development tools, set +the environment variable CC to either "cc -32" or "cc -n32" before +running configure under Irix 6.x (depending on whether you want an o32 +or n32 library), or just "cc" for Irix 5.3. + +With the n32 calling convention, when returning structures smaller +than 16 bytes, be sure to provide an RVALUE that is 8 byte aligned. +Here's one way of forcing this: + + double struct_storage[2]; + my_small_struct *s = (my_small_struct *) struct_storage; + /* Use s for RVALUE */ + +If you don't do this you are liable to get spurious bus errors. + +"long long" values are not supported yet. + +You must use GNU Make to build libffi on SGI platforms. + + ARM - System V ABI + ------------------ + +The ARM port was performed on a NetWinder running ARM Linux ELF +(2.0.31) and gcc 2.8.1. + + + + PowerPC System V ABI + -------------------- + +There are two `System V ABI's which libffi implements for PowerPC. +They differ only in how small structures are returned from functions. + +In the FFI_SYSV version, structures that are 8 bytes or smaller are +returned in registers. This is what GCC does when it is configured +for solaris, and is what the System V ABI I have (dated September +1995) says. + +In the FFI_GCC_SYSV version, all structures are returned the same way: +by passing a pointer as the first argument to the function. This is +what GCC does when it is configured for linux or a generic sysv +target. + +EGCS 1.0.1 (and probably other versions of EGCS/GCC) also has a +inconsistency with the SysV ABI: When a procedure is called with many +floating-point arguments, some of them get put on the stack. They are +all supposed to be stored in double-precision format, even if they are +only single-precision, but EGCS stores single-precision arguments as +single-precision anyway. This causes one test to fail (the `many +arguments' test). + + +What's With The Crazy Comments? +=============================== + +You might notice a number of cryptic comments in the code, delimited +by /*@ and @*/. These are annotations read by the program LCLint, a +tool for statically checking C programs. You can read all about it at +. + + +History +======= + +1.20 Oct-5-98 + Raffaele Sena produces ARM port. + +1.19 Oct-5-98 + Fixed x86 long double and long long return support. + m68k bug fixes from Andreas Schwab. + Patch for DU assembler compatibility for the Alpha from Richard + Henderson. + +1.18 Apr-17-98 + Bug fixes and MIPS configuration changes. + +1.17 Feb-24-98 + Bug fixes and m68k port from Andreas Schwab. PowerPC port from + Geoffrey Keating. Various bug x86, Sparc and MIPS bug fixes. + +1.16 Feb-11-98 + Richard Henderson produces Alpha port. + +1.15 Dec-4-97 + Fixed an n32 ABI bug. New libtool, auto* support. + +1.14 May-13-97 + libtool is now used to generate shared and static libraries. + Fixed a minor portability problem reported by Russ McManus + . + +1.13 Dec-2-96 + Added --enable-purify-safety to keep Purify from complaining + about certain low level code. + Sparc fix for calling functions with < 6 args. + Linux x86 a.out fix. + +1.12 Nov-22-96 + Added missing ffi_type_void, needed for supporting void return + types. Fixed test case for non MIPS machines. Cygnus Support + is now Cygnus Solutions. + +1.11 Oct-30-96 + Added notes about GNU make. + +1.10 Oct-29-96 + Added configuration fix for non GNU compilers. + +1.09 Oct-29-96 + Added --enable-debug configure switch. Clean-ups based on LCLint + feedback. ffi_mips.h is always installed. Many configuration + fixes. Fixed ffitest.c for sparc builds. + +1.08 Oct-15-96 + Fixed n32 problem. Many clean-ups. + +1.07 Oct-14-96 + Gordon Irlam rewrites v8.S again. Bug fixes. + +1.06 Oct-14-96 + Gordon Irlam improved the sparc port. + +1.05 Oct-14-96 + Interface changes based on feedback. + +1.04 Oct-11-96 + Sparc port complete (modulo struct passing bug). + +1.03 Oct-10-96 + Passing struct args, and returning struct values works for + all architectures/calling conventions. Expanded tests. + +1.02 Oct-9-96 + Added SGI n32 support. Fixed bugs in both o32 and Linux support. + Added "make test". + +1.01 Oct-8-96 + Fixed float passing bug in mips version. Restructured some + of the code. Builds cleanly with SGI tools. + +1.00 Oct-7-96 + First release. No public announcement. + + +Authors & Credits +================= + +libffi was written by Anthony Green . + +Portions of libffi were derived from Gianni Mariani's free gencall +library for Silicon Graphics machines. + +The closure mechanism was designed and implemented by Kresten Krab +Thorup. + +The Sparc port was derived from code contributed by the fine folks at +Visible Decisions Inc . Further enhancements were +made by Gordon Irlam at Cygnus Solutions . + +The Alpha port was written by Richard Henderson at Cygnus Solutions. + +Andreas Schwab ported libffi to m68k Linux and provided a number of +bug fixes. + +Geoffrey Keating ported libffi to the PowerPC. + +Raffaele Sena ported libffi to the ARM. + +Jesper Skov and Andrew Haley both did more than their fair share of +stepping through the code and tracking down bugs. + +Thanks also to Tom Tromey for bug fixes and configuration help. + +Thanks to Jim Blandy, who provided some useful feedback on the libffi +interface. + +If you have a problem, or have found a bug, please send a note to +green@cygnus.com. diff -r -u ./Modules/_ctypes/libffi_osx/README.pyobjc ./Modules/_ctypes/libffi_osx/README.pyobjc new file mode 100644 index 0000000..405d85f --- /dev/null +++ ./Modules/_ctypes/libffi_osx/README.pyobjc @@ -0,0 +1,5 @@ +This directory contains a slightly modified version of libffi, extracted from +the GCC source-tree. + +The only modifications are those that are necessary to compile libffi using +the Apple provided compiler and outside of the GCC source tree. diff -r -u ./Modules/_ctypes/libffi_osx/ffi.c ./Modules/_ctypes/libffi_osx/ffi.c new file mode 100644 index 0000000..bf42093 --- /dev/null +++ ./Modules/_ctypes/libffi_osx/ffi.c @@ -0,0 +1,226 @@ +/* ----------------------------------------------------------------------- + prep_cif.c - Copyright (c) 1996, 1998 Red Hat, Inc. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#include +#include + +#include +#include + +/* Round up to FFI_SIZEOF_ARG. */ +#define STACK_ARG_SIZE(x) ALIGN(x, FFI_SIZEOF_ARG) + +/* Perform machine independent initialization of aggregate type + specifications. */ + +static ffi_status +initialize_aggregate( +/*@out@*/ ffi_type* arg) +{ +/*@-usedef@*/ + + if (arg == NULL || arg->elements == NULL || + arg->size != 0 || arg->alignment != 0) + return FFI_BAD_TYPEDEF; + + ffi_type** ptr = &(arg->elements[0]); + + while ((*ptr) != NULL) + { + if (((*ptr)->size == 0) && (initialize_aggregate(*ptr) != FFI_OK)) + return FFI_BAD_TYPEDEF; + + /* Perform a sanity check on the argument type */ + FFI_ASSERT_VALID_TYPE(*ptr); + +#ifdef POWERPC_DARWIN + int curalign = (*ptr)->alignment; + + if (ptr != &(arg->elements[0])) + { + if (curalign > 4 && curalign != 16) + curalign = 4; + } + + arg->size = ALIGN(arg->size, curalign); + arg->size += (*ptr)->size; + arg->alignment = (arg->alignment > curalign) ? + arg->alignment : curalign; +#else + arg->size = ALIGN(arg->size, (*ptr)->alignment); + arg->size += (*ptr)->size; + arg->alignment = (arg->alignment > (*ptr)->alignment) ? + arg->alignment : (*ptr)->alignment; +#endif + + ptr++; + } + + /* Structure size includes tail padding. This is important for + structures that fit in one register on ABIs like the PowerPC64 + Linux ABI that right justify small structs in a register. + It's also needed for nested structure layout, for example + struct A { long a; char b; }; struct B { struct A x; char y; }; + should find y at an offset of 2*sizeof(long) and result in a + total size of 3*sizeof(long). */ + arg->size = ALIGN(arg->size, arg->alignment); + + if (arg->size == 0) + return FFI_BAD_TYPEDEF; + + return FFI_OK; + +/*@=usedef@*/ +} + +#ifndef __CRIS__ +/* The CRIS ABI specifies structure elements to have byte + alignment only, so it completely overrides this functions, + which assumes "natural" alignment and padding. */ + +/* Perform machine independent ffi_cif preparation, then call + machine dependent routine. */ + +#if defined(X86_DARWIN) + +static inline bool +struct_on_stack( + int size) +{ + if (size > 8) + return true; + + /* This is not what the ABI says, but is what is really implemented */ + switch (size) + { + case 1: + case 2: + case 4: + case 8: + return false; + + default: + return true; + } +} + +#endif // defined(X86_DARWIN) + +// Arguments' ffi_type->alignment must be nonzero. +ffi_status +ffi_prep_cif( +/*@out@*/ /*@partial@*/ ffi_cif* cif, + ffi_abi abi, + unsigned int nargs, +/*@dependent@*/ /*@out@*/ /*@partial@*/ ffi_type* rtype, +/*@dependent@*/ ffi_type** atypes) +{ + if (cif == NULL) + return FFI_BAD_TYPEDEF; + + if (abi <= FFI_FIRST_ABI || abi > FFI_DEFAULT_ABI) + return FFI_BAD_ABI; + + unsigned int bytes = 0; + unsigned int i; + ffi_type** ptr; + + cif->abi = abi; + cif->arg_types = atypes; + cif->nargs = nargs; + cif->rtype = rtype; + cif->flags = 0; + + /* Initialize the return type if necessary */ + /*@-usedef@*/ + if ((cif->rtype->size == 0) && (initialize_aggregate(cif->rtype) != FFI_OK)) + return FFI_BAD_TYPEDEF; + /*@=usedef@*/ + + /* Perform a sanity check on the return type */ + FFI_ASSERT_VALID_TYPE(cif->rtype); + + /* x86-64 and s390 stack space allocation is handled in prep_machdep. */ +#if !defined M68K && !defined __x86_64__ && !defined S390 && !defined PA + /* Make space for the return structure pointer */ + if (cif->rtype->type == FFI_TYPE_STRUCT +#ifdef SPARC + && (cif->abi != FFI_V9 || cif->rtype->size > 32) +#endif +#ifdef X86_DARWIN + && (struct_on_stack(cif->rtype->size)) +#endif + ) + bytes = STACK_ARG_SIZE(sizeof(void*)); +#endif + + for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++) + { + /* Initialize any uninitialized aggregate type definitions */ + if (((*ptr)->size == 0) && (initialize_aggregate((*ptr)) != FFI_OK)) + return FFI_BAD_TYPEDEF; + + if ((*ptr)->alignment == 0) + return FFI_BAD_TYPEDEF; + + /* Perform a sanity check on the argument type, do this + check after the initialization. */ + FFI_ASSERT_VALID_TYPE(*ptr); + +#if defined(X86_DARWIN) + { + int align = (*ptr)->alignment; + + if (align > 4) + align = 4; + + if ((align - 1) & bytes) + bytes = ALIGN(bytes, align); + + bytes += STACK_ARG_SIZE((*ptr)->size); + } +#elif !defined __x86_64__ && !defined S390 && !defined PA +#ifdef SPARC + if (((*ptr)->type == FFI_TYPE_STRUCT + && ((*ptr)->size > 16 || cif->abi != FFI_V9)) + || ((*ptr)->type == FFI_TYPE_LONGDOUBLE + && cif->abi != FFI_V9)) + bytes += sizeof(void*); + else +#endif + { + /* Add any padding if necessary */ + if (((*ptr)->alignment - 1) & bytes) + bytes = ALIGN(bytes, (*ptr)->alignment); + + bytes += STACK_ARG_SIZE((*ptr)->size); + } +#endif + } + + cif->bytes = bytes; + + /* Perform machine dependent cif processing */ + return ffi_prep_cif_machdep(cif); +} +#endif /* not __CRIS__ */ diff -r -u ./Modules/_ctypes/libffi_osx/include/ffi.h ./Modules/_ctypes/libffi_osx/include/ffi.h new file mode 100644 index 0000000..c104a5c --- /dev/null +++ ./Modules/_ctypes/libffi_osx/include/ffi.h @@ -0,0 +1,355 @@ +/* -----------------------------------------------------------------*-C-*- + libffi PyOBJC - Copyright (c) 1996-2003 Red Hat, Inc. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + ----------------------------------------------------------------------- */ + +/* ------------------------------------------------------------------- + The basic API is described in the README file. + + The raw API is designed to bypass some of the argument packing + and unpacking on architectures for which it can be avoided. + + The closure API allows interpreted functions to be packaged up + inside a C function pointer, so that they can be called as C functions, + with no understanding on the client side that they are interpreted. + It can also be used in other cases in which it is necessary to package + up a user specified parameter and a function pointer as a single + function pointer. + + The closure API must be implemented in order to get its functionality, + e.g. for use by gij. Routines are provided to emulate the raw API + if the underlying platform doesn't allow faster implementation. + + More details on the raw and closure API can be found in: + + http://gcc.gnu.org/ml/java/1999-q3/msg00138.html + + and + + http://gcc.gnu.org/ml/java/1999-q3/msg00174.html + -------------------------------------------------------------------- */ + +#ifndef LIBFFI_H +#define LIBFFI_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Specify which architecture libffi is configured for. */ +#ifdef MACOSX +# if defined(__i386__) || defined(__x86_64__) +# define X86_DARWIN +# elif defined(__ppc__) || defined(__ppc64__) +# define POWERPC_DARWIN +# else +# error "Unsupported MacOS X CPU type" +# endif +#else +#error "Unsupported OS type" +#endif + +/* ---- System configuration information --------------------------------- */ + +#include "ffitarget.h" +#include "fficonfig.h" + +#ifndef LIBFFI_ASM + +#include +#include + +/* LONG_LONG_MAX is not always defined (not if STRICT_ANSI, for example). + But we can find it either under the correct ANSI name, or under GNU + C's internal name. */ +#ifdef LONG_LONG_MAX +# define FFI_LONG_LONG_MAX LONG_LONG_MAX +#else +# ifdef LLONG_MAX +# define FFI_LONG_LONG_MAX LLONG_MAX +# else +# ifdef __GNUC__ +# define FFI_LONG_LONG_MAX __LONG_LONG_MAX__ +# endif +# endif +#endif + +#if SCHAR_MAX == 127 +# define ffi_type_uchar ffi_type_uint8 +# define ffi_type_schar ffi_type_sint8 +#else +#error "char size not supported" +#endif + +#if SHRT_MAX == 32767 +# define ffi_type_ushort ffi_type_uint16 +# define ffi_type_sshort ffi_type_sint16 +#elif SHRT_MAX == 2147483647 +# define ffi_type_ushort ffi_type_uint32 +# define ffi_type_sshort ffi_type_sint32 +#else +#error "short size not supported" +#endif + +#if INT_MAX == 32767 +# define ffi_type_uint ffi_type_uint16 +# define ffi_type_sint ffi_type_sint16 +#elif INT_MAX == 2147483647 +# define ffi_type_uint ffi_type_uint32 +# define ffi_type_sint ffi_type_sint32 +#elif INT_MAX == 9223372036854775807 +# define ffi_type_uint ffi_type_uint64 +# define ffi_type_sint ffi_type_sint64 +#else +#error "int size not supported" +#endif + +#define ffi_type_ulong ffi_type_uint64 +#define ffi_type_slong ffi_type_sint64 + +#if LONG_MAX == 2147483647 +# if FFI_LONG_LONG_MAX != 9223372036854775807 +# error "no 64-bit data type supported" +# endif +#elif LONG_MAX != 9223372036854775807 +#error "long size not supported" +#endif + +/* The closure code assumes that this works on pointers, i.e. a size_t + can hold a pointer. */ + +typedef struct _ffi_type { + size_t size; + unsigned short alignment; + unsigned short type; +/*@null@*/ struct _ffi_type** elements; +} ffi_type; + +/* These are defined in types.c */ +extern ffi_type ffi_type_void; +extern ffi_type ffi_type_uint8; +extern ffi_type ffi_type_sint8; +extern ffi_type ffi_type_uint16; +extern ffi_type ffi_type_sint16; +extern ffi_type ffi_type_uint32; +extern ffi_type ffi_type_sint32; +extern ffi_type ffi_type_uint64; +extern ffi_type ffi_type_sint64; +extern ffi_type ffi_type_float; +extern ffi_type ffi_type_double; +extern ffi_type ffi_type_longdouble; +extern ffi_type ffi_type_pointer; + +typedef enum ffi_status { + FFI_OK = 0, + FFI_BAD_TYPEDEF, + FFI_BAD_ABI +} ffi_status; + +typedef unsigned FFI_TYPE; + +typedef struct ffi_cif { + ffi_abi abi; + unsigned nargs; +/*@dependent@*/ ffi_type** arg_types; +/*@dependent@*/ ffi_type* rtype; + unsigned bytes; + unsigned flags; +#ifdef FFI_EXTRA_CIF_FIELDS + FFI_EXTRA_CIF_FIELDS; +#endif +} ffi_cif; + +/* ---- Definitions for the raw API -------------------------------------- */ + +#ifndef FFI_SIZEOF_ARG +# if LONG_MAX == 2147483647 +# define FFI_SIZEOF_ARG 4 +# elif LONG_MAX == 9223372036854775807 +# define FFI_SIZEOF_ARG 8 +# endif +#endif + +typedef union { + ffi_sarg sint; + ffi_arg uint; + float flt; + char data[FFI_SIZEOF_ARG]; + void* ptr; +} ffi_raw; + +void +ffi_raw_call( +/*@dependent@*/ ffi_cif* cif, + void (*fn)(void), +/*@out@*/ void* rvalue, +/*@dependent@*/ ffi_raw* avalue); + +void +ffi_ptrarray_to_raw( + ffi_cif* cif, + void** args, + ffi_raw* raw); + +void +ffi_raw_to_ptrarray( + ffi_cif* cif, + ffi_raw* raw, + void** args); + +size_t +ffi_raw_size( + ffi_cif* cif); + +/* This is analogous to the raw API, except it uses Java parameter + packing, even on 64-bit machines. I.e. on 64-bit machines + longs and doubles are followed by an empty 64-bit word. */ +void +ffi_java_raw_call( +/*@dependent@*/ ffi_cif* cif, + void (*fn)(void), +/*@out@*/ void* rvalue, +/*@dependent@*/ ffi_raw* avalue); + +void +ffi_java_ptrarray_to_raw( + ffi_cif* cif, + void** args, + ffi_raw* raw); + +void +ffi_java_raw_to_ptrarray( + ffi_cif* cif, + ffi_raw* raw, + void** args); + +size_t +ffi_java_raw_size( + ffi_cif* cif); + +/* ---- Definitions for closures ----------------------------------------- */ + +#if FFI_CLOSURES + +typedef struct ffi_closure { + char tramp[FFI_TRAMPOLINE_SIZE]; + ffi_cif* cif; + void (*fun)(ffi_cif*,void*,void**,void*); + void* user_data; +} ffi_closure; + +ffi_status +ffi_prep_closure( + ffi_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif*,void*,void**,void*), + void* user_data); + +void ffi_closure_free(void *); +void *ffi_closure_alloc (size_t size, void **code); + +typedef struct ffi_raw_closure { + char tramp[FFI_TRAMPOLINE_SIZE]; + ffi_cif* cif; + +#if !FFI_NATIVE_RAW_API + /* if this is enabled, then a raw closure has the same layout + as a regular closure. We use this to install an intermediate + handler to do the transaltion, void** -> ffi_raw*. */ + void (*translate_args)(ffi_cif*,void*,void**,void*); + void* this_closure; +#endif + + void (*fun)(ffi_cif*,void*,ffi_raw*,void*); + void* user_data; +} ffi_raw_closure; + +ffi_status +ffi_prep_raw_closure( + ffi_raw_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif*,void*,ffi_raw*,void*), + void* user_data); + +ffi_status +ffi_prep_java_raw_closure( + ffi_raw_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif*,void*,ffi_raw*,void*), + void* user_data); + +#endif // FFI_CLOSURES + +/* ---- Public interface definition -------------------------------------- */ + +ffi_status +ffi_prep_cif( +/*@out@*/ /*@partial@*/ ffi_cif* cif, + ffi_abi abi, + unsigned int nargs, +/*@dependent@*/ /*@out@*/ /*@partial@*/ ffi_type* rtype, +/*@dependent@*/ ffi_type** atypes); + +void +ffi_call( +/*@dependent@*/ ffi_cif* cif, + void (*fn)(void), +/*@out@*/ void* rvalue, +/*@dependent@*/ void** avalue); + +/* Useful for eliminating compiler warnings */ +#define FFI_FN(f) ((void (*)(void))f) + +#endif // #ifndef LIBFFI_ASM +/* ---- Definitions shared with assembly code ---------------------------- */ + +/* If these change, update src/mips/ffitarget.h. */ +#define FFI_TYPE_VOID 0 +#define FFI_TYPE_INT 1 +#define FFI_TYPE_FLOAT 2 +#define FFI_TYPE_DOUBLE 3 + +#ifdef HAVE_LONG_DOUBLE +# define FFI_TYPE_LONGDOUBLE 4 +#else +# define FFI_TYPE_LONGDOUBLE FFI_TYPE_DOUBLE +#endif + +#define FFI_TYPE_UINT8 5 +#define FFI_TYPE_SINT8 6 +#define FFI_TYPE_UINT16 7 +#define FFI_TYPE_SINT16 8 +#define FFI_TYPE_UINT32 9 +#define FFI_TYPE_SINT32 10 +#define FFI_TYPE_UINT64 11 +#define FFI_TYPE_SINT64 12 +#define FFI_TYPE_STRUCT 13 +#define FFI_TYPE_POINTER 14 + +/* This should always refer to the last type code (for sanity checks) */ +#define FFI_TYPE_LAST FFI_TYPE_POINTER + +#ifdef __cplusplus +} +#endif + +#endif // #ifndef LIBFFI_H diff -r -u ./Modules/_ctypes/libffi_osx/include/ffi_common.h ./Modules/_ctypes/libffi_osx/include/ffi_common.h new file mode 100644 index 0000000..685a358 --- /dev/null +++ ./Modules/_ctypes/libffi_osx/include/ffi_common.h @@ -0,0 +1,102 @@ +/* ----------------------------------------------------------------------- + ffi_common.h - Copyright (c) 1996 Red Hat, Inc. + + Common internal definitions and macros. Only necessary for building + libffi. + ----------------------------------------------------------------------- */ + +#ifndef FFI_COMMON_H +#define FFI_COMMON_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "fficonfig.h" + +/* Do not move this. Some versions of AIX are very picky about where + this is positioned. */ +#ifdef __GNUC__ +# define alloca __builtin_alloca +#else +# if HAVE_ALLOCA_H +# include +# else +# ifdef _AIX +# pragma alloca +# else +# ifndef alloca /* predefined by HP cc +Olibcalls */ +char* alloca(); +# endif +# endif +# endif +#endif + +/* Check for the existence of memcpy. */ +#if STDC_HEADERS +# include +#else +# ifndef HAVE_MEMCPY +# define memcpy(d, s, n) bcopy((s), (d), (n)) +# endif +#endif + +/*#if defined(FFI_DEBUG) +#include +#endif*/ + +#ifdef FFI_DEBUG +#include + +/*@exits@*/ void +ffi_assert( +/*@temp@*/ char* expr, +/*@temp@*/ char* file, + int line); +void +ffi_stop_here(void); +void +ffi_type_test( +/*@temp@*/ /*@out@*/ ffi_type* a, +/*@temp@*/ char* file, + int line); + +# define FFI_ASSERT(x) ((x) ? (void)0 : ffi_assert(#x, __FILE__,__LINE__)) +# define FFI_ASSERT_AT(x, f, l) ((x) ? 0 : ffi_assert(#x, (f), (l))) +# define FFI_ASSERT_VALID_TYPE(x) ffi_type_test(x, __FILE__, __LINE__) +#else +# define FFI_ASSERT(x) +# define FFI_ASSERT_AT(x, f, l) +# define FFI_ASSERT_VALID_TYPE(x) +#endif // #ifdef FFI_DEBUG + +#define ALIGN(v, a) (((size_t)(v) + (a) - 1) & ~((a) - 1)) + +/* Perform machine dependent cif processing */ +ffi_status +ffi_prep_cif_machdep( + ffi_cif* cif); + +/* Extended cif, used in callback from assembly routine */ +typedef struct extended_cif { +/*@dependent@*/ ffi_cif* cif; +/*@dependent@*/ void* rvalue; +/*@dependent@*/ void** avalue; +} extended_cif; + +/* Terse sized type definitions. */ +typedef unsigned int UINT8 __attribute__((__mode__(__QI__))); +typedef signed int SINT8 __attribute__((__mode__(__QI__))); +typedef unsigned int UINT16 __attribute__((__mode__(__HI__))); +typedef signed int SINT16 __attribute__((__mode__(__HI__))); +typedef unsigned int UINT32 __attribute__((__mode__(__SI__))); +typedef signed int SINT32 __attribute__((__mode__(__SI__))); +typedef unsigned int UINT64 __attribute__((__mode__(__DI__))); +typedef signed int SINT64 __attribute__((__mode__(__DI__))); +typedef float FLOAT32; + +#ifdef __cplusplus +} +#endif + +#endif // #ifndef FFI_COMMON_H \ No newline at end of file diff -r -u ./Modules/_ctypes/libffi_osx/include/fficonfig.h ./Modules/_ctypes/libffi_osx/include/fficonfig.h new file mode 100644 index 0000000..2172490 --- /dev/null +++ ./Modules/_ctypes/libffi_osx/include/fficonfig.h @@ -0,0 +1,150 @@ +/* Manually created fficonfig.h for Darwin on PowerPC or Intel + + This file is manually generated to do away with the need for autoconf and + therefore make it easier to cross-compile and build fat binaries. + + NOTE: This file was added by PyObjC. +*/ + +#ifndef MACOSX +#error "This file is only supported on Mac OS X" +#endif + +#if defined(__i386__) +# define BYTEORDER 1234 +# undef HOST_WORDS_BIG_ENDIAN +# undef WORDS_BIGENDIAN +# define SIZEOF_DOUBLE 8 +# define HAVE_LONG_DOUBLE 1 +# define SIZEOF_LONG_DOUBLE 16 + +#elif defined(__x86_64__) +# define BYTEORDER 1234 +# undef HOST_WORDS_BIG_ENDIAN +# undef WORDS_BIGENDIAN +# define SIZEOF_DOUBLE 8 +# define HAVE_LONG_DOUBLE 1 +# define SIZEOF_LONG_DOUBLE 16 + +#elif defined(__ppc__) +# define BYTEORDER 4321 +# define HOST_WORDS_BIG_ENDIAN 1 +# define WORDS_BIGENDIAN 1 +# define SIZEOF_DOUBLE 8 +# if __GNUC__ >= 4 +# define HAVE_LONG_DOUBLE 1 +# define SIZEOF_LONG_DOUBLE 16 +# else +# undef HAVE_LONG_DOUBLE +# define SIZEOF_LONG_DOUBLE 8 +# endif + +#elif defined(__ppc64__) +# define BYTEORDER 4321 +# define HOST_WORDS_BIG_ENDIAN 1 +# define WORDS_BIGENDIAN 1 +# define SIZEOF_DOUBLE 8 +# define HAVE_LONG_DOUBLE 1 +# define SIZEOF_LONG_DOUBLE 16 + +#else +#error "Unknown CPU type" +#endif + +/* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP + systems. This function is required for `alloca.c' support on those systems. */ +#undef CRAY_STACKSEG_END + +/* Define to 1 if using `alloca.c'. */ +/* #undef C_ALLOCA */ + +/* Define to the flags needed for the .section .eh_frame directive. */ +#define EH_FRAME_FLAGS "aw" + +/* Define this if you want extra debugging. */ +/* #undef FFI_DEBUG */ + +/* Define this is you do not want support for the raw API. */ +#define FFI_NO_RAW_API 1 + +/* Define this if you do not want support for aggregate types. */ +/* #undef FFI_NO_STRUCTS */ + +/* Define to 1 if you have `alloca', as a function or macro. */ +#define HAVE_ALLOCA 1 + +/* Define to 1 if you have and it should be used (not on Ultrix). */ +#define HAVE_ALLOCA_H 1 + +/* Define if your assembler supports .register. */ +/* #undef HAVE_AS_REGISTER_PSEUDO_OP */ + +/* Define if your assembler and linker support unaligned PC relative relocs. */ +/* #undef HAVE_AS_SPARC_UA_PCREL */ + +/* Define to 1 if you have the `memcpy' function. */ +#define HAVE_MEMCPY 1 + +/* Define if mmap with MAP_ANON(YMOUS) works. */ +#define HAVE_MMAP_ANON 1 + +/* Define if mmap of /dev/zero works. */ +/* #undef HAVE_MMAP_DEV_ZERO */ + +/* Define if read-only mmap of a plain file works. */ +#define HAVE_MMAP_FILE 1 + +/* Define if .eh_frame sections should be read-only. */ +/* #undef HAVE_RO_EH_FRAME */ + +/* Define to 1 if your C compiler doesn't accept -c and -o together. */ +/* #undef NO_MINUS_C_MINUS_O */ + +/* Name of package */ +#define PACKAGE "libffi" + +/* Define to the address where bug reports for this package should be sent. */ +#define PACKAGE_BUGREPORT "http://gcc.gnu.org/bugs.html" + +/* Define to the full name of this package. */ +#define PACKAGE_NAME "libffi" + +/* Define to the full name and version of this package. */ +#define PACKAGE_STRING "libffi 2.1" + +/* Define to the one symbol short name of this package. */ +#define PACKAGE_TARNAME "libffi" + +/* Define to the version of this package. */ +#define PACKAGE_VERSION "2.1" + +/* If using the C implementation of alloca, define if you know the + direction of stack growth for your system; otherwise it will be + automatically deduced at run-time. + STACK_DIRECTION > 0 => grows toward higher addresses + STACK_DIRECTION < 0 => grows toward lower addresses + STACK_DIRECTION = 0 => direction of growth unknown */ +/* #undef STACK_DIRECTION */ + +/* Define to 1 if you have the ANSI C header files. */ +#define STDC_HEADERS 1 + +/* Define this if you are using Purify and want to suppress spurious messages. */ +/* #undef USING_PURIFY */ + +/* Version number of package */ +#define VERSION "2.1-pyobjc" + +#ifdef HAVE_HIDDEN_VISIBILITY_ATTRIBUTE +# ifdef LIBFFI_ASM +# define FFI_HIDDEN(name) .hidden name +# else +# define FFI_HIDDEN __attribute__((visibility ("hidden"))) +# endif +#else +# ifdef LIBFFI_ASM +# define FFI_HIDDEN(name) +# else +# define FFI_HIDDEN +# endif +#endif \ No newline at end of file diff -r -u ./Modules/_ctypes/libffi_osx/include/ffitarget.h ./Modules/_ctypes/libffi_osx/include/ffitarget.h new file mode 100644 index 0000000..faaa30d --- /dev/null +++ ./Modules/_ctypes/libffi_osx/include/ffitarget.h @@ -0,0 +1,13 @@ +/* Dispatch to the right ffitarget file. This file is PyObjC specific; in a + normal build, the build environment copies the file to the right location or + sets up the right include flags. We want to do neither because that would + make building fat binaries harder. +*/ + +#if defined(__i386__) || defined(__x86_64__) +#include "x86-ffitarget.h" +#elif defined(__ppc__) || defined(__ppc64__) +#include "ppc-ffitarget.h" +#else +#error "Unsupported CPU type" +#endif \ No newline at end of file diff -r -u ./Modules/_ctypes/libffi_osx/include/ppc-ffitarget.h ./Modules/_ctypes/libffi_osx/include/ppc-ffitarget.h new file mode 100644 index 0000000..2318421 --- /dev/null +++ ./Modules/_ctypes/libffi_osx/include/ppc-ffitarget.h @@ -0,0 +1,104 @@ +/* -----------------------------------------------------------------*-C-*- + ppc-ffitarget.h - Copyright (c) 1996-2003 Red Hat, Inc. + Target configuration macros for PowerPC. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#ifndef LIBFFI_TARGET_H +#define LIBFFI_TARGET_H + +/* ---- System specific configurations ----------------------------------- */ + +#if (defined(POWERPC) && defined(__powerpc64__)) || \ + (defined(POWERPC_DARWIN) && defined(__ppc64__)) +#define POWERPC64 +#endif + +#ifndef LIBFFI_ASM + +typedef unsigned long ffi_arg; +typedef signed long ffi_sarg; + +typedef enum ffi_abi { + FFI_FIRST_ABI = 0, + +#ifdef POWERPC + FFI_SYSV, + FFI_GCC_SYSV, + FFI_LINUX64, +# ifdef POWERPC64 + FFI_DEFAULT_ABI = FFI_LINUX64, +# else + FFI_DEFAULT_ABI = FFI_GCC_SYSV, +# endif +#endif + +#ifdef POWERPC_AIX + FFI_AIX, + FFI_DARWIN, + FFI_DEFAULT_ABI = FFI_AIX, +#endif + +#ifdef POWERPC_DARWIN + FFI_AIX, + FFI_DARWIN, + FFI_DEFAULT_ABI = FFI_DARWIN, +#endif + +#ifdef POWERPC_FREEBSD + FFI_SYSV, + FFI_GCC_SYSV, + FFI_LINUX64, + FFI_DEFAULT_ABI = FFI_SYSV, +#endif + + FFI_LAST_ABI = FFI_DEFAULT_ABI + 1 +} ffi_abi; + +#endif // #ifndef LIBFFI_ASM + +/* ---- Definitions for closures ----------------------------------------- */ + +#define FFI_CLOSURES 1 +#define FFI_NATIVE_RAW_API 0 + +/* Needed for FFI_SYSV small structure returns. */ +#define FFI_SYSV_TYPE_SMALL_STRUCT (FFI_TYPE_LAST) + +#if defined(POWERPC64) /*|| defined(POWERPC_AIX)*/ +# define FFI_TRAMPOLINE_SIZE 48 +#elif defined(POWERPC_AIX) +# define FFI_TRAMPOLINE_SIZE 24 +#else +# define FFI_TRAMPOLINE_SIZE 40 +#endif + +#ifndef LIBFFI_ASM +# if defined(POWERPC_DARWIN) || defined(POWERPC_AIX) +typedef struct ffi_aix_trampoline_struct { + void* code_pointer; /* Pointer to ffi_closure_ASM */ + void* toc; /* TOC */ + void* static_chain; /* Pointer to closure */ +} ffi_aix_trampoline_struct; +# endif +#endif // #ifndef LIBFFI_ASM + +#endif // #ifndef LIBFFI_TARGET_H \ No newline at end of file diff -r -u ./Modules/_ctypes/libffi_osx/include/x86-ffitarget.h ./Modules/_ctypes/libffi_osx/include/x86-ffitarget.h new file mode 100644 index 0000000..55c2b6c --- /dev/null +++ ./Modules/_ctypes/libffi_osx/include/x86-ffitarget.h @@ -0,0 +1,88 @@ +/* -----------------------------------------------------------------*-C-*- + x86-ffitarget.h - Copyright (c) 1996-2003 Red Hat, Inc. + Target configuration macros for x86 and x86-64. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + ----------------------------------------------------------------------- */ + +#ifndef LIBFFI_TARGET_H +#define LIBFFI_TARGET_H + +/* ---- System specific configurations ----------------------------------- */ + +#if defined(X86_64) && defined(__i386__) +# undef X86_64 +# define X86 +#endif + +#if defined(__x86_64__) +# ifndef X86_64 +# define X86_64 +# endif +#endif + +/* ---- Generic type definitions ----------------------------------------- */ + +#ifndef LIBFFI_ASM + +typedef unsigned long ffi_arg; +typedef signed long ffi_sarg; + +typedef enum ffi_abi { + FFI_FIRST_ABI = 0, + + /* ---- Intel x86 Win32 ---------- */ +#ifdef X86_WIN32 + FFI_SYSV, + FFI_STDCALL, + /* TODO: Add fastcall support for the sake of completeness */ + FFI_DEFAULT_ABI = FFI_SYSV, +#endif + + /* ---- Intel x86 and AMD x86-64 - */ +#if !defined(X86_WIN32) && (defined(__i386__) || defined(__x86_64__)) + FFI_SYSV, + FFI_UNIX64, /* Unix variants all use the same ABI for x86-64 */ +# ifdef __i386__ + FFI_DEFAULT_ABI = FFI_SYSV, +# else + FFI_DEFAULT_ABI = FFI_UNIX64, +# endif +#endif + + FFI_LAST_ABI = FFI_DEFAULT_ABI + 1 +} ffi_abi; + +#endif // #ifndef LIBFFI_ASM + +/* ---- Definitions for closures ----------------------------------------- */ + +#define FFI_CLOSURES 1 + +#if defined(X86_64) || (defined(__x86_64__) && defined(X86_DARWIN)) +# define FFI_TRAMPOLINE_SIZE 24 +# define FFI_NATIVE_RAW_API 0 +#else +# define FFI_TRAMPOLINE_SIZE 10 +# define FFI_NATIVE_RAW_API 1 /* x86 has native raw api support */ +#endif + +#endif // #ifndef LIBFFI_TARGET_H \ No newline at end of file diff -r -u ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin.S ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin.S new file mode 100644 index 0000000..f143dbd --- /dev/null +++ ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin.S @@ -0,0 +1,365 @@ +#if defined(__ppc__) || defined(__ppc64__) + +/* ----------------------------------------------------------------------- + ppc-darwin.S - Copyright (c) 2000 John Hornkvist + Copyright (c) 2004 Free Software Foundation, Inc. + + PowerPC Assembly glue. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#define LIBFFI_ASM + +#include +#include +#include +#include + +.text + .align 2 +.globl _ffi_prep_args + +.text + .align 2 +.globl _ffi_call_DARWIN + +.text + .align 2 +_ffi_call_DARWIN: +LFB0: + mr r12,r8 /* We only need r12 until the call, + so it doesn't have to be saved. */ + +LFB1: + /* Save the old stack pointer as AP. */ + mr r8,r1 + +LCFI0: +#if defined(__ppc64__) + /* Allocate the stack space we need. + r4 (size of input data) + 48 bytes (linkage area) + 40 bytes (saved registers) + 8 bytes (extra FPR) + r4 + 96 bytes total + */ + + addi r4,r4,-96 // Add our overhead. + li r0,-32 // Align to 32 bytes. + and r4,r4,r0 +#endif + stgux r1,r1,r4 // Grow the stack. + mflr r9 + + /* Save registers we use. */ +#if defined(__ppc64__) + std r27,-40(r8) +#endif + stg r28,MODE_CHOICE(-16,-32)(r8) + stg r29,MODE_CHOICE(-12,-24)(r8) + stg r30,MODE_CHOICE(-8,-16)(r8) + stg r31,MODE_CHOICE(-4,-8)(r8) + stg r9,SF_RETURN(r8) /* return address */ +#if !defined(POWERPC_DARWIN) /* TOC unused in OS X */ + stg r2,MODE_CHOICE(20,40)(r1) +#endif + +LCFI1: +#if defined(__ppc64__) + mr r27,r3 // our extended_cif +#endif + /* Save arguments over call. */ + mr r31,r5 /* flags, */ + mr r30,r6 /* rvalue, */ + mr r29,r7 /* function address, */ + mr r28,r8 /* our AP. */ + +LCFI2: + /* Call ffi_prep_args. */ + mr r4,r1 + li r9,0 + mtctr r12 /* r12 holds address of _ffi_prep_args. */ + bctrl +#if !defined(POWERPC_DARWIN) /* TOC unused in OS X */ + lg r2,MODE_CHOICE(20,40)(r1) +#endif + + /* Now do the call. + Set up cr1 with bits 4-7 of the flags. */ + mtcrf 0x40,r31 + + /* Load all those argument registers. + We have set up a nice stack frame, just load it into registers. */ + lg r3,SF_ARG1(r1) + lg r4,SF_ARG2(r1) + lg r5,SF_ARG3(r1) + lg r6,SF_ARG4(r1) + nop + lg r7,SF_ARG5(r1) + lg r8,SF_ARG6(r1) + lg r9,SF_ARG7(r1) + lg r10,SF_ARG8(r1) + + /* Load all the FP registers. */ + bf 6,L2 /* No floats to load. */ +#if defined(__ppc64__) + lfd f1,MODE_CHOICE(-16,-40)-(14*8)(r28) + lfd f2,MODE_CHOICE(-16,-40)-(13*8)(r28) + lfd f3,MODE_CHOICE(-16,-40)-(12*8)(r28) + lfd f4,MODE_CHOICE(-16,-40)-(11*8)(r28) + nop + lfd f5,MODE_CHOICE(-16,-40)-(10*8)(r28) + lfd f6,MODE_CHOICE(-16,-40)-(9*8)(r28) + lfd f7,MODE_CHOICE(-16,-40)-(8*8)(r28) + lfd f8,MODE_CHOICE(-16,-40)-(7*8)(r28) + nop + lfd f9,MODE_CHOICE(-16,-40)-(6*8)(r28) + lfd f10,MODE_CHOICE(-16,-40)-(5*8)(r28) + lfd f11,MODE_CHOICE(-16,-40)-(4*8)(r28) + lfd f12,MODE_CHOICE(-16,-40)-(3*8)(r28) + nop + lfd f13,MODE_CHOICE(-16,-40)-(2*8)(r28) + lfd f14,MODE_CHOICE(-16,-40)-(1*8)(r28) +#elif defined(__ppc__) + lfd f1,MODE_CHOICE(-16,-40)-(13*8)(r28) + lfd f2,MODE_CHOICE(-16,-40)-(12*8)(r28) + lfd f3,MODE_CHOICE(-16,-40)-(11*8)(r28) + lfd f4,MODE_CHOICE(-16,-40)-(10*8)(r28) + nop + lfd f5,MODE_CHOICE(-16,-40)-(9*8)(r28) + lfd f6,MODE_CHOICE(-16,-40)-(8*8)(r28) + lfd f7,MODE_CHOICE(-16,-40)-(7*8)(r28) + lfd f8,MODE_CHOICE(-16,-40)-(6*8)(r28) + nop + lfd f9,MODE_CHOICE(-16,-40)-(5*8)(r28) + lfd f10,MODE_CHOICE(-16,-40)-(4*8)(r28) + lfd f11,MODE_CHOICE(-16,-40)-(3*8)(r28) + lfd f12,MODE_CHOICE(-16,-40)-(2*8)(r28) + nop + lfd f13,MODE_CHOICE(-16,-40)-(1*8)(r28) +#else +#error undefined architecture +#endif + +L2: + mr r12,r29 // Put the target address in r12 as specified. + mtctr r12 // Get the address to call into CTR. + nop + nop + bctrl // Make the call. + + // Deal with the return value. +#if defined(__ppc64__) + mtcrf 0x3,r31 // flags in cr6 and cr7 + bt 27,L(st_return_value) +#elif defined(__ppc__) + mtcrf 0x1,r31 // flags in cr7 +#else +#error undefined architecture +#endif + + bt 30,L(done_return_value) + bt 29,L(fp_return_value) + stg r3,0(r30) +#if defined(__ppc__) + bf 28,L(done_return_value) // Store the second long if necessary. + stg r4,4(r30) +#endif + // Fall through + +L(done_return_value): + lg r1,0(r1) // Restore stack pointer. + // Restore the registers we used. + lg r9,SF_RETURN(r1) // return address + lg r31,MODE_CHOICE(-4,-8)(r1) + mtlr r9 + lg r30,MODE_CHOICE(-8,-16)(r1) + lg r29,MODE_CHOICE(-12,-24)(r1) + lg r28,MODE_CHOICE(-16,-32)(r1) +#if defined(__ppc64__) + ld r27,-40(r1) +#endif + blr + +#if defined(__ppc64__) +L(st_return_value): + // Grow the stack enough to fit the registers. Leave room for 8 args + // to trample the 1st 8 slots in param area. + stgu r1,-SF_ROUND(280)(r1) // 64 + 104 + 48 + 64 + + // Store GPRs + std r3,SF_ARG9(r1) + std r4,SF_ARG10(r1) + std r5,SF_ARG11(r1) + std r6,SF_ARG12(r1) + nop + std r7,SF_ARG13(r1) + std r8,SF_ARG14(r1) + std r9,SF_ARG15(r1) + std r10,SF_ARG16(r1) + + // Store FPRs + nop + bf 26,L(call_struct_to_ram_form) + stfd f1,SF_ARG17(r1) + stfd f2,SF_ARG18(r1) + stfd f3,SF_ARG19(r1) + stfd f4,SF_ARG20(r1) + nop + stfd f5,SF_ARG21(r1) + stfd f6,SF_ARG22(r1) + stfd f7,SF_ARG23(r1) + stfd f8,SF_ARG24(r1) + nop + stfd f9,SF_ARG25(r1) + stfd f10,SF_ARG26(r1) + stfd f11,SF_ARG27(r1) + stfd f12,SF_ARG28(r1) + nop + stfd f13,SF_ARG29(r1) + +L(call_struct_to_ram_form): + ld r3,0(r27) // extended_cif->cif* + ld r3,16(r3) // ffi_cif->rtype* + addi r4,r1,SF_ARG9 // stored GPRs + addi r6,r1,SF_ARG17 // stored FPRs + li r5,0 // GPR size ptr (NULL) + li r7,0 // FPR size ptr (NULL) + li r8,0 // FPR count ptr (NULL) + li r10,0 // struct offset (NULL) + mr r9,r30 // return area + bl Lffi64_struct_to_ram_form$stub + lg r1,0(r1) // Restore stack pointer. + b L(done_return_value) +#endif + +L(fp_return_value): + /* Do we have long double to store? */ + bf 31,L(fd_return_value) + stfd f1,0(r30) + stfd f2,8(r30) + b L(done_return_value) + +L(fd_return_value): + /* Do we have double to store? */ + bf 28,L(float_return_value) + stfd f1,0(r30) + b L(done_return_value) + +L(float_return_value): + /* We only have a float to store. */ + stfs f1,0(r30) + b L(done_return_value) + +LFE1: +/* END(_ffi_call_DARWIN) */ + +/* Provide a null definition of _ffi_call_AIX. */ +.text + .align 2 +.globl _ffi_call_AIX +.text + .align 2 +_ffi_call_AIX: + blr +/* END(_ffi_call_AIX) */ + +.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms +EH_frame1: + .set L$set$0,LECIE1-LSCIE1 + .long L$set$0 ; Length of Common Information Entry +LSCIE1: + .long 0x0 ; CIE Identifier Tag + .byte 0x1 ; CIE Version + .ascii "zR\0" ; CIE Augmentation + .byte 0x1 ; uleb128 0x1; CIE Code Alignment Factor + .byte 0x7c ; sleb128 -4; CIE Data Alignment Factor + .byte 0x41 ; CIE RA Column + .byte 0x1 ; uleb128 0x1; Augmentation size + .byte 0x10 ; FDE Encoding (pcrel) + .byte 0xc ; DW_CFA_def_cfa + .byte 0x1 ; uleb128 0x1 + .byte 0x0 ; uleb128 0x0 + .align LOG2_GPR_BYTES +LECIE1: +.globl _ffi_call_DARWIN.eh +_ffi_call_DARWIN.eh: +LSFDE1: + .set L$set$1,LEFDE1-LASFDE1 + .long L$set$1 ; FDE Length + +LASFDE1: + .long LASFDE1-EH_frame1 ; FDE CIE offset + .g_long LFB0-. ; FDE initial location + .set L$set$3,LFE1-LFB0 + .g_long L$set$3 ; FDE address range + .byte 0x0 ; uleb128 0x0; Augmentation size + .byte 0x4 ; DW_CFA_advance_loc4 + .set L$set$4,LCFI0-LFB1 + .long L$set$4 + .byte 0xd ; DW_CFA_def_cfa_register + .byte 0x08 ; uleb128 0x08 + .byte 0x4 ; DW_CFA_advance_loc4 + .set L$set$5,LCFI1-LCFI0 + .long L$set$5 + .byte 0x11 ; DW_CFA_offset_extended_sf + .byte 0x41 ; uleb128 0x41 + .byte 0x7e ; sleb128 -2 + .byte 0x9f ; DW_CFA_offset, column 0x1f + .byte 0x1 ; uleb128 0x1 + .byte 0x9e ; DW_CFA_offset, column 0x1e + .byte 0x2 ; uleb128 0x2 + .byte 0x9d ; DW_CFA_offset, column 0x1d + .byte 0x3 ; uleb128 0x3 + .byte 0x9c ; DW_CFA_offset, column 0x1c + .byte 0x4 ; uleb128 0x4 + .byte 0x4 ; DW_CFA_advance_loc4 + .set L$set$6,LCFI2-LCFI1 + .long L$set$6 + .byte 0xd ; DW_CFA_def_cfa_register + .byte 0x1c ; uleb128 0x1c + .align LOG2_GPR_BYTES +LEFDE1: + +#if defined(__ppc64__) +.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 + .align LOG2_GPR_BYTES + +Lffi64_struct_to_ram_form$stub: + .indirect_symbol _ffi64_struct_to_ram_form + mflr r0 + bcl 20,31,LO$ffi64_struct_to_ram_form + +LO$ffi64_struct_to_ram_form: + mflr r11 + addis r11,r11,ha16(L_ffi64_struct_to_ram_form$lazy_ptr - LO$ffi64_struct_to_ram_form) + mtlr r0 + lgu r12,lo16(L_ffi64_struct_to_ram_form$lazy_ptr - LO$ffi64_struct_to_ram_form)(r11) + mtctr r12 + bctr + +.lazy_symbol_pointer +L_ffi64_struct_to_ram_form$lazy_ptr: + .indirect_symbol _ffi64_struct_to_ram_form + .g_long dyld_stub_binding_helper + +#endif // __ppc64__ +#endif // __ppc__ || __ppc64__ diff -r -u ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin.h ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin.h new file mode 100644 index 0000000..cf4bd50 --- /dev/null +++ ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin.h @@ -0,0 +1,85 @@ +/* ----------------------------------------------------------------------- + ppc-darwin.h - Copyright (c) 2002, 2003, 2004, Free Software Foundation, + Inc. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#define L(x) x + +#define SF_ARG9 MODE_CHOICE(56,112) +#define SF_ARG10 MODE_CHOICE(60,120) +#define SF_ARG11 MODE_CHOICE(64,128) +#define SF_ARG12 MODE_CHOICE(68,136) +#define SF_ARG13 MODE_CHOICE(72,144) +#define SF_ARG14 MODE_CHOICE(76,152) +#define SF_ARG15 MODE_CHOICE(80,160) +#define SF_ARG16 MODE_CHOICE(84,168) +#define SF_ARG17 MODE_CHOICE(88,176) +#define SF_ARG18 MODE_CHOICE(92,184) +#define SF_ARG19 MODE_CHOICE(96,192) +#define SF_ARG20 MODE_CHOICE(100,200) +#define SF_ARG21 MODE_CHOICE(104,208) +#define SF_ARG22 MODE_CHOICE(108,216) +#define SF_ARG23 MODE_CHOICE(112,224) +#define SF_ARG24 MODE_CHOICE(116,232) +#define SF_ARG25 MODE_CHOICE(120,240) +#define SF_ARG26 MODE_CHOICE(124,248) +#define SF_ARG27 MODE_CHOICE(128,256) +#define SF_ARG28 MODE_CHOICE(132,264) +#define SF_ARG29 MODE_CHOICE(136,272) + +#define ASM_NEEDS_REGISTERS 4 +#define NUM_GPR_ARG_REGISTERS 8 +#define NUM_FPR_ARG_REGISTERS 13 + +#define FFI_TYPE_1_BYTE(x) ((x) == FFI_TYPE_UINT8 || (x) == FFI_TYPE_SINT8) +#define FFI_TYPE_2_BYTE(x) ((x) == FFI_TYPE_UINT16 || (x) == FFI_TYPE_SINT16) +#define FFI_TYPE_4_BYTE(x) \ + ((x) == FFI_TYPE_UINT32 || (x) == FFI_TYPE_SINT32 ||\ + (x) == FFI_TYPE_INT || (x) == FFI_TYPE_FLOAT) + +#if !defined(LIBFFI_ASM) + +enum { + FLAG_RETURNS_NOTHING = 1 << (31 - 30), // cr7 + FLAG_RETURNS_FP = 1 << (31 - 29), + FLAG_RETURNS_64BITS = 1 << (31 - 28), + FLAG_RETURNS_128BITS = 1 << (31 - 31), + + FLAG_RETURNS_STRUCT = 1 << (31 - 27), // cr6 + FLAG_STRUCT_CONTAINS_FP = 1 << (31 - 26), + + FLAG_ARG_NEEDS_COPY = 1 << (31 - 7), + FLAG_FP_ARGUMENTS = 1 << (31 - 6), // cr1.eq; specified by ABI + FLAG_4_GPR_ARGUMENTS = 1 << (31 - 5), + FLAG_RETVAL_REFERENCE = 1 << (31 - 4) +}; + +#if defined(__ppc64__) +void ffi64_struct_to_ram_form(const ffi_type*, const char*, unsigned int*, + const char*, unsigned int*, unsigned int*, char*, unsigned int*); +void ffi64_struct_to_reg_form(const ffi_type*, const char*, unsigned int*, + unsigned int*, char*, unsigned int*, char*, unsigned int*); +bool ffi64_stret_needs_ptr(const ffi_type* inType, + unsigned short*, unsigned short*); +#endif + +#endif // !defined(LIBFFI_ASM) \ No newline at end of file diff -r -u ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin_closure.S ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin_closure.S new file mode 100644 index 0000000..c3d30c2 --- /dev/null +++ ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin_closure.S @@ -0,0 +1,308 @@ +#if defined(__ppc__) + +/* ----------------------------------------------------------------------- + ppc-darwin_closure.S - Copyright (c) 2002, 2003, 2004, Free Software Foundation, + Inc. based on ppc_closure.S + + PowerPC Assembly glue. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#define LIBFFI_ASM + +#include +#include // for FFI_TRAMPOLINE_SIZE +#include +#include + + .file "ppc-darwin_closure.S" +.text + .align LOG2_GPR_BYTES + .globl _ffi_closure_ASM + +.text + .align LOG2_GPR_BYTES + +_ffi_closure_ASM: +LFB1: + mflr r0 // Save return address + stg r0,SF_RETURN(r1) + +LCFI0: + /* 24/48 bytes (Linkage Area) + 32/64 bytes (outgoing parameter area, always reserved) + 104 bytes (13*8 from FPR) + 16/32 bytes (result) + 176/232 total bytes */ + + /* skip over caller save area and keep stack aligned to 16/32. */ + stgu r1,-SF_ROUND(176)(r1) + +LCFI1: + /* We want to build up an area for the parameters passed + in registers. (both floating point and integer) */ + + /* 176/256 bytes (callee stack frame aligned to 16/32) + 24/48 bytes (caller linkage area) + 200/304 (start of caller parameter area aligned to 4/8) + */ + + /* Save GPRs 3 - 10 (aligned to 4/8) + in the parents outgoing area. */ + stg r3,200(r1) + stg r4,204(r1) + stg r5,208(r1) + stg r6,212(r1) + stg r7,216(r1) + stg r8,220(r1) + stg r9,224(r1) + stg r10,228(r1) + + /* Save FPRs 1 - 13. (aligned to 8) */ + stfd f1,56(r1) + stfd f2,64(r1) + stfd f3,72(r1) + stfd f4,80(r1) + stfd f5,88(r1) + stfd f6,96(r1) + stfd f7,104(r1) + stfd f8,112(r1) + stfd f9,120(r1) + stfd f10,128(r1) + stfd f11,136(r1) + stfd f12,144(r1) + stfd f13,152(r1) + + // Set up registers for the routine that actually does the work. + mr r3,r11 // context pointer from the trampoline + addi r4,r1,160 // result storage + addi r5,r1,200 // saved GPRs + addi r6,r1,56 // saved FPRs + bl Lffi_closure_helper_DARWIN$stub + + /* Now r3 contains the return type. Use it to look up in a table + so we know how to deal with each type. */ + addi r5,r1,160 // Copy result storage pointer. + bl Lget_ret_type0_addr // Get pointer to Lret_type0 into LR. + mflr r4 // Move to r4. + slwi r3,r3,4 // Multiply return type by 16. + add r3,r3,r4 // Add contents of table to table address. + mtctr r3 + bctr + +LFE1: +/* Each of the ret_typeX code fragments has to be exactly 16 bytes long + (4 instructions). For cache effectiveness we align to a 16 byte boundary + first. */ + .align 4 + nop + nop + nop + +Lget_ret_type0_addr: + blrl + +/* case FFI_TYPE_VOID */ +Lret_type0: + b Lfinish + nop + nop + nop + +/* case FFI_TYPE_INT */ +Lret_type1: + lwz r3,0(r5) + b Lfinish + nop + nop + +/* case FFI_TYPE_FLOAT */ +Lret_type2: + lfs f1,0(r5) + b Lfinish + nop + nop + +/* case FFI_TYPE_DOUBLE */ +Lret_type3: + lfd f1,0(r5) + b Lfinish + nop + nop + +/* case FFI_TYPE_LONGDOUBLE */ +Lret_type4: + lfd f1,0(r5) + lfd f2,8(r5) + b Lfinish + nop + +/* case FFI_TYPE_UINT8 */ +Lret_type5: + lbz r3,3(r5) + b Lfinish + nop + nop + +/* case FFI_TYPE_SINT8 */ +Lret_type6: + lbz r3,3(r5) + extsb r3,r3 + b Lfinish + nop + +/* case FFI_TYPE_UINT16 */ +Lret_type7: + lhz r3,2(r5) + b Lfinish + nop + nop + +/* case FFI_TYPE_SINT16 */ +Lret_type8: + lha r3,2(r5) + b Lfinish + nop + nop + +/* case FFI_TYPE_UINT32 */ +Lret_type9: // same as Lret_type1 + lwz r3,0(r5) + b Lfinish + nop + nop + +/* case FFI_TYPE_SINT32 */ +Lret_type10: // same as Lret_type1 + lwz r3,0(r5) + b Lfinish + nop + nop + +/* case FFI_TYPE_UINT64 */ +Lret_type11: + lwz r3,0(r5) + lwz r4,4(r5) + b Lfinish + nop + +/* case FFI_TYPE_SINT64 */ +Lret_type12: // same as Lret_type11 + lwz r3,0(r5) + lwz r4,4(r5) + b Lfinish + nop + +/* case FFI_TYPE_STRUCT */ +Lret_type13: + b Lfinish + nop + nop + nop + +/* End 16-byte aligned cases */ +/* case FFI_TYPE_POINTER */ +// This case assumes that FFI_TYPE_POINTER == FFI_TYPE_LAST. If more types +// are added in future, the following code will need to be updated and +// padded to 16 bytes. +Lret_type14: + lg r3,0(r5) + // fall through + +/* case done */ +Lfinish: + addi r1,r1,SF_ROUND(176) // Restore stack pointer. + lg r0,SF_RETURN(r1) // Restore return address. + mtlr r0 // Restore link register. + blr + +/* END(ffi_closure_ASM) */ + +.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support +EH_frame1: + .set L$set$0,LECIE1-LSCIE1 + .long L$set$0 ; Length of Common Information Entry +LSCIE1: + .long 0x0 ; CIE Identifier Tag + .byte 0x1 ; CIE Version + .ascii "zR\0" ; CIE Augmentation + .byte 0x1 ; uleb128 0x1; CIE Code Alignment Factor + .byte 0x7c ; sleb128 -4; CIE Data Alignment Factor + .byte 0x41 ; CIE RA Column + .byte 0x1 ; uleb128 0x1; Augmentation size + .byte 0x10 ; FDE Encoding (pcrel) + .byte 0xc ; DW_CFA_def_cfa + .byte 0x1 ; uleb128 0x1 + .byte 0x0 ; uleb128 0x0 + .align LOG2_GPR_BYTES +LECIE1: +.globl _ffi_closure_ASM.eh +_ffi_closure_ASM.eh: +LSFDE1: + .set L$set$1,LEFDE1-LASFDE1 + .long L$set$1 ; FDE Length + +LASFDE1: + .long LASFDE1-EH_frame1 ; FDE CIE offset + .g_long LFB1-. ; FDE initial location + .set L$set$3,LFE1-LFB1 + .g_long L$set$3 ; FDE address range + .byte 0x0 ; uleb128 0x0; Augmentation size + .byte 0x4 ; DW_CFA_advance_loc4 + .set L$set$3,LCFI1-LCFI0 + .long L$set$3 + .byte 0xe ; DW_CFA_def_cfa_offset + .byte 176,1 ; uleb128 176 + .byte 0x4 ; DW_CFA_advance_loc4 + .set L$set$4,LCFI0-LFB1 + .long L$set$4 + .byte 0x11 ; DW_CFA_offset_extended_sf + .byte 0x41 ; uleb128 0x41 + .byte 0x7e ; sleb128 -2 + .align LOG2_GPR_BYTES + +LEFDE1: +.data + .align LOG2_GPR_BYTES +LDFCM0: +.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 + .align LOG2_GPR_BYTES + +Lffi_closure_helper_DARWIN$stub: + .indirect_symbol _ffi_closure_helper_DARWIN + mflr r0 + bcl 20,31,LO$ffi_closure_helper_DARWIN + +LO$ffi_closure_helper_DARWIN: + mflr r11 + addis r11,r11,ha16(L_ffi_closure_helper_DARWIN$lazy_ptr - LO$ffi_closure_helper_DARWIN) + mtlr r0 + lgu r12,lo16(L_ffi_closure_helper_DARWIN$lazy_ptr - LO$ffi_closure_helper_DARWIN)(r11) + mtctr r12 + bctr + +.lazy_symbol_pointer +L_ffi_closure_helper_DARWIN$lazy_ptr: + .indirect_symbol _ffi_closure_helper_DARWIN + .g_long dyld_stub_binding_helper + + +#endif // __ppc__ diff -r -u ./Modules/_ctypes/libffi_osx/powerpc/ppc-ffi_darwin.c ./Modules/_ctypes/libffi_osx/powerpc/ppc-ffi_darwin.c new file mode 100644 index 0000000..8953d5f --- /dev/null +++ ./Modules/_ctypes/libffi_osx/powerpc/ppc-ffi_darwin.c @@ -0,0 +1,1776 @@ +#if defined(__ppc__) || defined(__ppc64__) + +/* ----------------------------------------------------------------------- + ffi.c - Copyright (c) 1998 Geoffrey Keating + + PowerPC Foreign Function Interface + + Darwin ABI support (c) 2001 John Hornkvist + AIX ABI support (c) 2002 Free Software Foundation, Inc. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#include +#include + +#include +#include +#include +#include +#include + +#if 0 +#if defined(POWERPC_DARWIN) +#include // for sys_icache_invalidate() +#endif + +#else + +#pragma weak sys_icache_invalidate +extern void sys_icache_invalidate(void *start, size_t len); + +#endif + + +extern void ffi_closure_ASM(void); + +// The layout of a function descriptor. A C function pointer really +// points to one of these. +typedef struct aix_fd_struct { + void* code_pointer; + void* toc; +} aix_fd; + +/* ffi_prep_args is called by the assembly routine once stack space + has been allocated for the function's arguments. + + The stack layout we want looks like this: + + | Return address from ffi_call_DARWIN | higher addresses + |--------------------------------------------| + | Previous backchain pointer 4/8 | stack pointer here + |--------------------------------------------|-\ <<< on entry to + | Saved r28-r31 (4/8)*4 | | ffi_call_DARWIN + |--------------------------------------------| | + | Parameters (at least 8*(4/8)=32/64) | | (176) +112 - +288 + |--------------------------------------------| | + | Space for GPR2 4/8 | | + |--------------------------------------------| | stack | + | Reserved (4/8)*2 | | grows | + |--------------------------------------------| | down V + | Space for callee's LR 4/8 | | + |--------------------------------------------| | lower addresses + | Saved CR 4/8 | | + |--------------------------------------------| | stack pointer here + | Current backchain pointer 4/8 | | during + |--------------------------------------------|-/ <<< ffi_call_DARWIN + + Note: ppc64 CR is saved in the low word of a long on the stack. +*/ + +/*@-exportheader@*/ +void +ffi_prep_args( + extended_cif* inEcif, + unsigned *const stack) +/*@=exportheader@*/ +{ + /* Copy the ecif to a local var so we can trample the arg. + BC note: test this with GP later for possible problems... */ + volatile extended_cif* ecif = inEcif; + + const unsigned bytes = ecif->cif->bytes; + const unsigned flags = ecif->cif->flags; + + /* Cast the stack arg from int* to long*. sizeof(long) == 4 in 32-bit mode + and 8 in 64-bit mode. */ + unsigned long *const longStack = (unsigned long *const)stack; + + /* 'stacktop' points at the previous backchain pointer. */ +#if defined(__ppc64__) + // In ppc-darwin.s, an extra 96 bytes is reserved for the linkage area, + // saved registers, and an extra FPR. + unsigned long *const stacktop = + (unsigned long *)(unsigned long)((char*)longStack + bytes + 96); +#elif defined(__ppc__) + unsigned long *const stacktop = longStack + (bytes / sizeof(long)); +#else +#error undefined architecture +#endif + + /* 'fpr_base' points at the space for fpr1, and grows upwards as + we use FPR registers. */ + double* fpr_base = (double*)(stacktop - ASM_NEEDS_REGISTERS) - + NUM_FPR_ARG_REGISTERS; + +#if defined(__ppc64__) + // 64-bit saves an extra register, and uses an extra FPR. Knock fpr_base + // down a couple pegs. + fpr_base -= 2; +#endif + + unsigned int fparg_count = 0; + + /* 'next_arg' grows up as we put parameters in it. */ + unsigned long* next_arg = longStack + 6; /* 6 reserved positions. */ + + int i; + double double_tmp; + void** p_argv = ecif->avalue; + unsigned long gprvalue; + ffi_type** ptr = ecif->cif->arg_types; + + /* Check that everything starts aligned properly. */ + FFI_ASSERT(stack == SF_ROUND(stack)); + FFI_ASSERT(stacktop == SF_ROUND(stacktop)); + FFI_ASSERT(bytes == SF_ROUND(bytes)); + + /* Deal with return values that are actually pass-by-reference. + Rule: + Return values are referenced by r3, so r4 is the first parameter. */ + + if (flags & FLAG_RETVAL_REFERENCE) + *next_arg++ = (unsigned long)(char*)ecif->rvalue; + + /* Now for the arguments. */ + for (i = ecif->cif->nargs; i > 0; i--, ptr++, p_argv++) + { + switch ((*ptr)->type) + { + /* If a floating-point parameter appears before all of the general- + purpose registers are filled, the corresponding GPRs that match + the size of the floating-point parameter are shadowed for the + benefit of vararg and pre-ANSI functions. */ + case FFI_TYPE_FLOAT: + double_tmp = *(float*)*p_argv; + + if (fparg_count < NUM_FPR_ARG_REGISTERS) + *fpr_base++ = double_tmp; + + *(double*)next_arg = double_tmp; + + next_arg++; + fparg_count++; + FFI_ASSERT(flags & FLAG_FP_ARGUMENTS); + + break; + + case FFI_TYPE_DOUBLE: + double_tmp = *(double*)*p_argv; + + if (fparg_count < NUM_FPR_ARG_REGISTERS) + *fpr_base++ = double_tmp; + + *(double*)next_arg = double_tmp; + + next_arg += MODE_CHOICE(2,1); + fparg_count++; + FFI_ASSERT(flags & FLAG_FP_ARGUMENTS); + + break; + +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + case FFI_TYPE_LONGDOUBLE: +#if defined(__ppc64__) + if (fparg_count < NUM_FPR_ARG_REGISTERS) + *(long double*)fpr_base = *(long double*)*p_argv; +#elif defined(__ppc__) + if (fparg_count < NUM_FPR_ARG_REGISTERS - 1) + *(long double*)fpr_base = *(long double*)*p_argv; + else if (fparg_count == NUM_FPR_ARG_REGISTERS - 1) + *(double*)fpr_base = *(double*)*p_argv; +#else +#error undefined architecture +#endif + + *(long double*)next_arg = *(long double*)*p_argv; + fparg_count += 2; + fpr_base += 2; + next_arg += MODE_CHOICE(4,2); + FFI_ASSERT(flags & FLAG_FP_ARGUMENTS); + + break; +#endif // FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: +#if defined(__ppc64__) + gprvalue = *(long long*)*p_argv; + goto putgpr; +#elif defined(__ppc__) + *(long long*)next_arg = *(long long*)*p_argv; + next_arg += 2; + break; +#else +#error undefined architecture +#endif + + case FFI_TYPE_POINTER: + gprvalue = *(unsigned long*)*p_argv; + goto putgpr; + + case FFI_TYPE_UINT8: + gprvalue = *(unsigned char*)*p_argv; + goto putgpr; + + case FFI_TYPE_SINT8: + gprvalue = *(signed char*)*p_argv; + goto putgpr; + + case FFI_TYPE_UINT16: + gprvalue = *(unsigned short*)*p_argv; + goto putgpr; + + case FFI_TYPE_SINT16: + gprvalue = *(signed short*)*p_argv; + goto putgpr; + + case FFI_TYPE_STRUCT: + { +#if defined(__ppc64__) + unsigned int gprSize = 0; + unsigned int fprSize = 0; + + ffi64_struct_to_reg_form(*ptr, (char*)*p_argv, NULL, &fparg_count, + (char*)next_arg, &gprSize, (char*)fpr_base, &fprSize); + next_arg += gprSize / sizeof(long); + fpr_base += fprSize / sizeof(double); + +#elif defined(__ppc__) + char* dest_cpy = (char*)next_arg; + + /* Structures that match the basic modes (QI 1 byte, HI 2 bytes, + SI 4 bytes) are aligned as if they were those modes. + Structures with 3 byte in size are padded upwards. */ + unsigned size_al = (*ptr)->size; + + /* If the first member of the struct is a double, then align + the struct to double-word. */ + if ((*ptr)->elements[0]->type == FFI_TYPE_DOUBLE) + size_al = ALIGN((*ptr)->size, 8); + + if (ecif->cif->abi == FFI_DARWIN) + { + if (size_al < 3) + dest_cpy += 4 - size_al; + } + + memcpy((char*)dest_cpy, (char*)*p_argv, size_al); + next_arg += (size_al + 3) / 4; +#else +#error undefined architecture +#endif + break; + } + + case FFI_TYPE_INT: + case FFI_TYPE_UINT32: + case FFI_TYPE_SINT32: + gprvalue = *(unsigned*)*p_argv; + +putgpr: + *next_arg++ = gprvalue; + break; + + default: + break; + } + } + + /* Check that we didn't overrun the stack... */ + //FFI_ASSERT(gpr_base <= stacktop - ASM_NEEDS_REGISTERS); + //FFI_ASSERT((unsigned *)fpr_base + // <= stacktop - ASM_NEEDS_REGISTERS - NUM_GPR_ARG_REGISTERS); + //FFI_ASSERT(flags & FLAG_4_GPR_ARGUMENTS || intarg_count <= 4); +} + +#if defined(__ppc64__) + +bool +ffi64_struct_contains_fp( + const ffi_type* inType) +{ + bool containsFP = false; + unsigned int i; + + for (i = 0; inType->elements[i] != NULL && !containsFP; i++) + { + if (inType->elements[i]->type == FFI_TYPE_FLOAT || + inType->elements[i]->type == FFI_TYPE_DOUBLE || + inType->elements[i]->type == FFI_TYPE_LONGDOUBLE) + containsFP = true; + else if (inType->elements[i]->type == FFI_TYPE_STRUCT) + containsFP = ffi64_struct_contains_fp(inType->elements[i]); + } + + return containsFP; +} + +#endif // defined(__ppc64__) + +/* Perform machine dependent cif processing. */ +ffi_status +ffi_prep_cif_machdep( + ffi_cif* cif) +{ + /* All this is for the DARWIN ABI. */ + int i; + ffi_type** ptr; + int intarg_count = 0; + int fparg_count = 0; + unsigned int flags = 0; + unsigned int size_al = 0; + + /* All the machine-independent calculation of cif->bytes will be wrong. + Redo the calculation for DARWIN. */ + + /* Space for the frame pointer, callee's LR, CR, etc, and for + the asm's temp regs. */ + unsigned int bytes = (6 + ASM_NEEDS_REGISTERS) * sizeof(long); + + /* Return value handling. The rules are as follows: + - 32-bit (or less) integer values are returned in gpr3; + - Structures of size <= 4 bytes also returned in gpr3; + - 64-bit integer values and structures between 5 and 8 bytes are + returned in gpr3 and gpr4; + - Single/double FP values are returned in fpr1; + - Long double FP (if not equivalent to double) values are returned in + fpr1 and fpr2; + - Larger structures values are allocated space and a pointer is passed + as the first argument. */ + switch (cif->rtype->type) + { +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + case FFI_TYPE_LONGDOUBLE: + flags |= FLAG_RETURNS_128BITS; + flags |= FLAG_RETURNS_FP; + break; +#endif // FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + + case FFI_TYPE_DOUBLE: + flags |= FLAG_RETURNS_64BITS; + /* Fall through. */ + case FFI_TYPE_FLOAT: + flags |= FLAG_RETURNS_FP; + break; + +#if defined(__ppc64__) + case FFI_TYPE_POINTER: +#endif + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + flags |= FLAG_RETURNS_64BITS; + break; + + case FFI_TYPE_STRUCT: + { +#if defined(__ppc64__) + + if (ffi64_stret_needs_ptr(cif->rtype, NULL, NULL)) + { + flags |= FLAG_RETVAL_REFERENCE; + flags |= FLAG_RETURNS_NOTHING; + intarg_count++; + } + else + { + flags |= FLAG_RETURNS_STRUCT; + + if (ffi64_struct_contains_fp(cif->rtype)) + flags |= FLAG_STRUCT_CONTAINS_FP; + } + +#elif defined(__ppc__) + + flags |= FLAG_RETVAL_REFERENCE; + flags |= FLAG_RETURNS_NOTHING; + intarg_count++; + +#else +#error undefined architecture +#endif + break; + } + + case FFI_TYPE_VOID: + flags |= FLAG_RETURNS_NOTHING; + break; + + default: + /* Returns 32-bit integer, or similar. Nothing to do here. */ + break; + } + + /* The first NUM_GPR_ARG_REGISTERS words of integer arguments, and the + first NUM_FPR_ARG_REGISTERS fp arguments, go in registers; the rest + goes on the stack. Structures are passed as a pointer to a copy of + the structure. Stuff on the stack needs to keep proper alignment. */ + for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++) + { + switch ((*ptr)->type) + { + case FFI_TYPE_FLOAT: + case FFI_TYPE_DOUBLE: + fparg_count++; + /* If this FP arg is going on the stack, it must be + 8-byte-aligned. */ + if (fparg_count > NUM_FPR_ARG_REGISTERS + && intarg_count % 2 != 0) + intarg_count++; + break; + +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + case FFI_TYPE_LONGDOUBLE: + fparg_count += 2; + /* If this FP arg is going on the stack, it must be + 8-byte-aligned. */ + + if ( +#if defined(__ppc64__) + fparg_count > NUM_FPR_ARG_REGISTERS + 1 +#elif defined(__ppc__) + fparg_count > NUM_FPR_ARG_REGISTERS +#else +#error undefined architecture +#endif + && intarg_count % 2 != 0) + intarg_count++; + + intarg_count += 2; + break; +#endif // FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + /* 'long long' arguments are passed as two words, but + either both words must fit in registers or both go + on the stack. If they go on the stack, they must + be 8-byte-aligned. */ + if (intarg_count == NUM_GPR_ARG_REGISTERS - 1 + || (intarg_count >= NUM_GPR_ARG_REGISTERS + && intarg_count % 2 != 0)) + intarg_count++; + + intarg_count += MODE_CHOICE(2,1); + + break; + + case FFI_TYPE_STRUCT: + size_al = (*ptr)->size; + /* If the first member of the struct is a double, then align + the struct to double-word. */ + if ((*ptr)->elements[0]->type == FFI_TYPE_DOUBLE) + size_al = ALIGN((*ptr)->size, 8); + +#if defined(__ppc64__) + // Look for FP struct members. + unsigned int j; + + for (j = 0; (*ptr)->elements[j] != NULL; j++) + { + if ((*ptr)->elements[j]->type == FFI_TYPE_FLOAT || + (*ptr)->elements[j]->type == FFI_TYPE_DOUBLE) + { + fparg_count++; + + if (fparg_count > NUM_FPR_ARG_REGISTERS) + intarg_count++; + } + else if ((*ptr)->elements[j]->type == FFI_TYPE_LONGDOUBLE) + { + fparg_count += 2; + + if (fparg_count > NUM_FPR_ARG_REGISTERS + 1) + intarg_count += 2; + } + else + intarg_count++; + } +#elif defined(__ppc__) + intarg_count += (size_al + 3) / 4; +#else +#error undefined architecture +#endif + + break; + + default: + /* Everything else is passed as a 4/8-byte word in a GPR, either + the object itself or a pointer to it. */ + intarg_count++; + break; + } + } + + /* Space for the FPR registers, if needed. */ + if (fparg_count != 0) + { + flags |= FLAG_FP_ARGUMENTS; +#if defined(__ppc64__) + bytes += (NUM_FPR_ARG_REGISTERS + 1) * sizeof(double); +#elif defined(__ppc__) + bytes += NUM_FPR_ARG_REGISTERS * sizeof(double); +#else +#error undefined architecture +#endif + } + + /* Stack space. */ +#if defined(__ppc64__) + if ((intarg_count + fparg_count) > NUM_GPR_ARG_REGISTERS) + bytes += (intarg_count + fparg_count) * sizeof(long); +#elif defined(__ppc__) + if ((intarg_count + 2 * fparg_count) > NUM_GPR_ARG_REGISTERS) + bytes += (intarg_count + 2 * fparg_count) * sizeof(long); +#else +#error undefined architecture +#endif + else + bytes += NUM_GPR_ARG_REGISTERS * sizeof(long); + + /* The stack space allocated needs to be a multiple of 16/32 bytes. */ + bytes = SF_ROUND(bytes); + + cif->flags = flags; + cif->bytes = bytes; + + return FFI_OK; +} + +/*@-declundef@*/ +/*@-exportheader@*/ +extern void +ffi_call_AIX( +/*@out@*/ extended_cif*, + unsigned, + unsigned, +/*@out@*/ unsigned*, + void (*fn)(void), + void (*fn2)(extended_cif*, unsigned *const)); + +extern void +ffi_call_DARWIN( +/*@out@*/ extended_cif*, + unsigned long, + unsigned, +/*@out@*/ unsigned*, + void (*fn)(void), + void (*fn2)(extended_cif*, unsigned *const)); +/*@=declundef@*/ +/*@=exportheader@*/ + +void +ffi_call( +/*@dependent@*/ ffi_cif* cif, + void (*fn)(void), +/*@out@*/ void* rvalue, +/*@dependent@*/ void** avalue) +{ + extended_cif ecif; + + ecif.cif = cif; + ecif.avalue = avalue; + + /* If the return value is a struct and we don't have a return + value address then we need to make one. */ + if ((rvalue == NULL) && + (cif->rtype->type == FFI_TYPE_STRUCT)) + { + /*@-sysunrecog@*/ + ecif.rvalue = alloca(cif->rtype->size); + /*@=sysunrecog@*/ + } + else + ecif.rvalue = rvalue; + + switch (cif->abi) + { + case FFI_AIX: + /*@-usedef@*/ + ffi_call_AIX(&ecif, -cif->bytes, + cif->flags, ecif.rvalue, fn, ffi_prep_args); + /*@=usedef@*/ + break; + + case FFI_DARWIN: + /*@-usedef@*/ + ffi_call_DARWIN(&ecif, -(long)cif->bytes, + cif->flags, ecif.rvalue, fn, ffi_prep_args); + /*@=usedef@*/ + break; + + default: + FFI_ASSERT(0); + break; + } +} + +/* here I'd like to add the stack frame layout we use in darwin_closure.S + and aix_clsoure.S + + SP previous -> +---------------------------------------+ <--- child frame + | back chain to caller 4 | + +---------------------------------------+ 4 + | saved CR 4 | + +---------------------------------------+ 8 + | saved LR 4 | + +---------------------------------------+ 12 + | reserved for compilers 4 | + +---------------------------------------+ 16 + | reserved for binders 4 | + +---------------------------------------+ 20 + | saved TOC pointer 4 | + +---------------------------------------+ 24 + | always reserved 8*4=32 (previous GPRs)| + | according to the linkage convention | + | from AIX | + +---------------------------------------+ 56 + | our FPR area 13*8=104 | + | f1 | + | . | + | f13 | + +---------------------------------------+ 160 + | result area 8 | + +---------------------------------------+ 168 + | alignement to the next multiple of 16 | +SP current --> +---------------------------------------+ 176 <- parent frame + | back chain to caller 4 | + +---------------------------------------+ 180 + | saved CR 4 | + +---------------------------------------+ 184 + | saved LR 4 | + +---------------------------------------+ 188 + | reserved for compilers 4 | + +---------------------------------------+ 192 + | reserved for binders 4 | + +---------------------------------------+ 196 + | saved TOC pointer 4 | + +---------------------------------------+ 200 + | always reserved 8*4=32 we store our | + | GPRs here | + | r3 | + | . | + | r10 | + +---------------------------------------+ 232 + | overflow part | + +---------------------------------------+ xxx + | ???? | + +---------------------------------------+ xxx +*/ + +#if !defined(POWERPC_DARWIN) + +#define MIN_LINE_SIZE 32 + +static void +flush_icache( + char* addr) +{ +#ifndef _AIX + __asm__ volatile ( + "dcbf 0,%0\n" + "sync\n" + "icbi 0,%0\n" + "sync\n" + "isync" + : : "r" (addr) : "memory"); +#endif +} + +static void +flush_range( + char* addr, + int size) +{ + int i; + + for (i = 0; i < size; i += MIN_LINE_SIZE) + flush_icache(addr + i); + + flush_icache(addr + size - 1); +} + +#endif // !defined(POWERPC_DARWIN) + +ffi_status +ffi_prep_closure( + ffi_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif*, void*, void**, void*), + void* user_data) +{ + switch (cif->abi) + { + case FFI_DARWIN: + { + FFI_ASSERT (cif->abi == FFI_DARWIN); + + unsigned int* tramp = (unsigned int*)&closure->tramp[0]; + +#if defined(__ppc64__) + tramp[0] = 0x7c0802a6; // mflr r0 + tramp[1] = 0x429f0005; // bcl 20,31,+0x8 + tramp[2] = 0x7d6802a6; // mflr r11 + tramp[3] = 0x7c0803a6; // mtlr r0 + tramp[4] = 0xe98b0018; // ld r12,24(r11) + tramp[5] = 0x7d8903a6; // mtctr r12 + tramp[6] = 0xe96b0020; // ld r11,32(r11) + tramp[7] = 0x4e800420; // bctr + *(unsigned long*)&tramp[8] = (unsigned long)ffi_closure_ASM; + *(unsigned long*)&tramp[10] = (unsigned long)closure; +#elif defined(__ppc__) + tramp[0] = 0x7c0802a6; // mflr r0 + tramp[1] = 0x429f0005; // bcl 20,31,+0x8 + tramp[2] = 0x7d6802a6; // mflr r11 + tramp[3] = 0x7c0803a6; // mtlr r0 + tramp[4] = 0x818b0018; // lwz r12,24(r11) + tramp[5] = 0x7d8903a6; // mtctr r12 + tramp[6] = 0x816b001c; // lwz r11,28(r11) + tramp[7] = 0x4e800420; // bctr + tramp[8] = (unsigned long)ffi_closure_ASM; + tramp[9] = (unsigned long)closure; +#else +#error undefined architecture +#endif + + closure->cif = cif; + closure->fun = fun; + closure->user_data = user_data; + + // Flush the icache. Only necessary on Darwin. +#if defined(POWERPC_DARWIN) + sys_icache_invalidate(closure->tramp, FFI_TRAMPOLINE_SIZE); +#else + flush_range(closure->tramp, FFI_TRAMPOLINE_SIZE); +#endif + + break; + } + + case FFI_AIX: + { + FFI_ASSERT (cif->abi == FFI_AIX); + + ffi_aix_trampoline_struct* tramp_aix = + (ffi_aix_trampoline_struct*)(closure->tramp); + aix_fd* fd = (aix_fd*)(void*)ffi_closure_ASM; + + tramp_aix->code_pointer = fd->code_pointer; + tramp_aix->toc = fd->toc; + tramp_aix->static_chain = closure; + closure->cif = cif; + closure->fun = fun; + closure->user_data = user_data; + break; + } + + default: + return FFI_BAD_ABI; + } + + return FFI_OK; +} + +#if defined(__ppc__) + typedef double ldbits[2]; + + typedef union + { + ldbits lb; + long double ld; + } ldu; +#endif + +typedef union +{ + float f; + double d; +} ffi_dblfl; + +/* The trampoline invokes ffi_closure_ASM, and on entry, r11 holds the + address of the closure. After storing the registers that could possibly + contain parameters to be passed into the stack frame and setting up space + for a return value, ffi_closure_ASM invokes the following helper function + to do most of the work. */ +int +ffi_closure_helper_DARWIN( + ffi_closure* closure, + void* rvalue, + unsigned long* pgr, + ffi_dblfl* pfr) +{ + /* rvalue is the pointer to space for return value in closure assembly + pgr is the pointer to where r3-r10 are stored in ffi_closure_ASM + pfr is the pointer to where f1-f13 are stored in ffi_closure_ASM. */ + +#if defined(__ppc__) + ldu temp_ld; +#endif + + double temp; + unsigned int i; + unsigned int nf = 0; /* number of FPRs already used. */ + unsigned int ng = 0; /* number of GPRs already used. */ + ffi_cif* cif = closure->cif; + long avn = cif->nargs; + void** avalue = alloca(cif->nargs * sizeof(void*)); + ffi_type** arg_types = cif->arg_types; + + /* Copy the caller's structure return value address so that the closure + returns the data directly to the caller. */ +#if defined(__ppc64__) + if (cif->rtype->type == FFI_TYPE_STRUCT && + ffi64_stret_needs_ptr(cif->rtype, NULL, NULL)) +#elif defined(__ppc__) + if (cif->rtype->type == FFI_TYPE_STRUCT) +#else +#error undefined architecture +#endif + { + rvalue = (void*)*pgr; + pgr++; + ng++; + } + + /* Grab the addresses of the arguments from the stack frame. */ + for (i = 0; i < avn; i++) + { + switch (arg_types[i]->type) + { + case FFI_TYPE_SINT8: + case FFI_TYPE_UINT8: + avalue[i] = (char*)pgr + MODE_CHOICE(3,7); + ng++; + pgr++; + break; + + case FFI_TYPE_SINT16: + case FFI_TYPE_UINT16: + avalue[i] = (char*)pgr + MODE_CHOICE(2,6); + ng++; + pgr++; + break; + +#if defined(__ppc__) + case FFI_TYPE_POINTER: +#endif + case FFI_TYPE_SINT32: + case FFI_TYPE_UINT32: + avalue[i] = (char*)pgr + MODE_CHOICE(0,4); + ng++; + pgr++; + + break; + + case FFI_TYPE_STRUCT: + if (cif->abi == FFI_DARWIN) + { +#if defined(__ppc64__) + unsigned int gprSize = 0; + unsigned int fprSize = 0; + unsigned int savedFPRSize = fprSize; + + avalue[i] = alloca(arg_types[i]->size); + ffi64_struct_to_ram_form(arg_types[i], (const char*)pgr, + &gprSize, (const char*)pfr, &fprSize, &nf, avalue[i], NULL); + + ng += gprSize / sizeof(long); + pgr += gprSize / sizeof(long); + pfr += (fprSize - savedFPRSize) / sizeof(double); + +#elif defined(__ppc__) + /* Structures that match the basic modes (QI 1 byte, HI 2 bytes, + SI 4 bytes) are aligned as if they were those modes. */ + unsigned int size_al = size_al = arg_types[i]->size; + + /* If the first member of the struct is a double, then align + the struct to double-word. */ + if (arg_types[i]->elements[0]->type == FFI_TYPE_DOUBLE) + size_al = ALIGN(arg_types[i]->size, 8); + + if (size_al < 3) + avalue[i] = (void*)pgr + MODE_CHOICE(4,8) - size_al; + else + avalue[i] = (void*)pgr; + + ng += (size_al + 3) / sizeof(long); + pgr += (size_al + 3) / sizeof(long); +#else +#error undefined architecture +#endif + } + + break; + +#if defined(__ppc64__) + case FFI_TYPE_POINTER: +#endif + case FFI_TYPE_SINT64: + case FFI_TYPE_UINT64: + /* Long long ints are passed in 1 or 2 GPRs. */ + avalue[i] = pgr; + ng += MODE_CHOICE(2,1); + pgr += MODE_CHOICE(2,1); + + break; + + case FFI_TYPE_FLOAT: + /* A float value consumes a GPR. + There are 13 64-bit floating point registers. */ + if (nf < NUM_FPR_ARG_REGISTERS) + { + temp = pfr->d; + pfr->f = (float)temp; + avalue[i] = pfr; + pfr++; + } + else + avalue[i] = pgr; + + nf++; + ng++; + pgr++; + break; + + case FFI_TYPE_DOUBLE: + /* A double value consumes one or two GPRs. + There are 13 64bit floating point registers. */ + if (nf < NUM_FPR_ARG_REGISTERS) + { + avalue[i] = pfr; + pfr++; + } + else + avalue[i] = pgr; + + nf++; + ng += MODE_CHOICE(2,1); + pgr += MODE_CHOICE(2,1); + + break; + +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + + case FFI_TYPE_LONGDOUBLE: +#if defined(__ppc64__) + if (nf < NUM_FPR_ARG_REGISTERS) + { + avalue[i] = pfr; + pfr += 2; + } +#elif defined(__ppc__) + /* A long double value consumes 2/4 GPRs and 2 FPRs. + There are 13 64bit floating point registers. */ + if (nf < NUM_FPR_ARG_REGISTERS - 1) + { + avalue[i] = pfr; + pfr += 2; + } + /* Here we have the situation where one part of the long double + is stored in fpr13 and the other part is already on the stack. + We use a union to pass the long double to avalue[i]. */ + else if (nf == NUM_FPR_ARG_REGISTERS - 1) + { + memcpy (&temp_ld.lb[0], pfr, sizeof(temp_ld.lb[0])); + memcpy (&temp_ld.lb[1], pgr + 2, sizeof(temp_ld.lb[1])); + avalue[i] = &temp_ld.ld; + } +#else +#error undefined architecture +#endif + else + avalue[i] = pgr; + + nf += 2; + ng += MODE_CHOICE(4,2); + pgr += MODE_CHOICE(4,2); + + break; + +#endif /* FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE */ + + default: + FFI_ASSERT(0); + break; + } + } + + (closure->fun)(cif, rvalue, avalue, closure->user_data); + + /* Tell ffi_closure_ASM to perform return type promotions. */ + return cif->rtype->type; +} + +#if defined(__ppc64__) + +/* ffi64_struct_to_ram_form + + Rebuild a struct's natural layout from buffers of concatenated registers. + Return the number of registers used. + inGPRs[0-7] == r3, inFPRs[0-7] == f1 ... +*/ +void +ffi64_struct_to_ram_form( + const ffi_type* inType, + const char* inGPRs, + unsigned int* ioGPRMarker, + const char* inFPRs, + unsigned int* ioFPRMarker, + unsigned int* ioFPRsUsed, + char* outStruct, // caller-allocated + unsigned int* ioStructMarker) +{ + unsigned int srcGMarker = 0; + unsigned int srcFMarker = 0; + unsigned int savedFMarker = 0; + unsigned int fprsUsed = 0; + unsigned int savedFPRsUsed = 0; + unsigned int destMarker = 0; + + static unsigned int recurseCount = 0; + + if (ioGPRMarker) + srcGMarker = *ioGPRMarker; + + if (ioFPRMarker) + { + srcFMarker = *ioFPRMarker; + savedFMarker = srcFMarker; + } + + if (ioFPRsUsed) + { + fprsUsed = *ioFPRsUsed; + savedFPRsUsed = fprsUsed; + } + + if (ioStructMarker) + destMarker = *ioStructMarker; + + size_t i; + + switch (inType->size) + { + case 1: case 2: case 4: + srcGMarker += 8 - inType->size; + break; + + default: + break; + } + + for (i = 0; inType->elements[i] != NULL; i++) + { + switch (inType->elements[i]->type) + { + case FFI_TYPE_FLOAT: + srcFMarker = ALIGN(srcFMarker, 4); + srcGMarker = ALIGN(srcGMarker, 4); + destMarker = ALIGN(destMarker, 4); + + if (fprsUsed < NUM_FPR_ARG_REGISTERS) + { + *(float*)&outStruct[destMarker] = + (float)*(double*)&inFPRs[srcFMarker]; + srcFMarker += 8; + fprsUsed++; + } + else + *(float*)&outStruct[destMarker] = + (float)*(double*)&inGPRs[srcGMarker]; + + srcGMarker += 4; + destMarker += 4; + + // Skip to next GPR if next element won't fit and we're + // not already at a register boundary. + if (inType->elements[i + 1] != NULL && (destMarker % 8)) + { + if (!FFI_TYPE_1_BYTE(inType->elements[i + 1]->type) && + (!FFI_TYPE_2_BYTE(inType->elements[i + 1]->type) || + (ALIGN(srcGMarker, 8) - srcGMarker) < 2) && + (!FFI_TYPE_4_BYTE(inType->elements[i + 1]->type) || + (ALIGN(srcGMarker, 8) - srcGMarker) < 4)) + srcGMarker = ALIGN(srcGMarker, 8); + } + + break; + + case FFI_TYPE_DOUBLE: + srcFMarker = ALIGN(srcFMarker, 8); + destMarker = ALIGN(destMarker, 8); + + if (fprsUsed < NUM_FPR_ARG_REGISTERS) + { + *(double*)&outStruct[destMarker] = + *(double*)&inFPRs[srcFMarker]; + srcFMarker += 8; + fprsUsed++; + } + else + *(double*)&outStruct[destMarker] = + *(double*)&inGPRs[srcGMarker]; + + destMarker += 8; + + // Skip next GPR + srcGMarker += 8; + srcGMarker = ALIGN(srcGMarker, 8); + + break; + + case FFI_TYPE_LONGDOUBLE: + destMarker = ALIGN(destMarker, 16); + + if (fprsUsed < NUM_FPR_ARG_REGISTERS) + { + srcFMarker = ALIGN(srcFMarker, 8); + srcGMarker = ALIGN(srcGMarker, 8); + *(long double*)&outStruct[destMarker] = + *(long double*)&inFPRs[srcFMarker]; + srcFMarker += 16; + fprsUsed += 2; + } + else + { + srcFMarker = ALIGN(srcFMarker, 16); + srcGMarker = ALIGN(srcGMarker, 16); + *(long double*)&outStruct[destMarker] = + *(long double*)&inGPRs[srcGMarker]; + } + + destMarker += 16; + + // Skip next 2 GPRs + srcGMarker += 16; + srcGMarker = ALIGN(srcGMarker, 8); + + break; + + case FFI_TYPE_UINT8: + case FFI_TYPE_SINT8: + { + if (inType->alignment == 1) // chars only + { + if (inType->size == 1) + outStruct[destMarker++] = inGPRs[srcGMarker++]; + else if (inType->size == 2) + { + outStruct[destMarker++] = inGPRs[srcGMarker++]; + outStruct[destMarker++] = inGPRs[srcGMarker++]; + i++; + } + else + { + memcpy(&outStruct[destMarker], + &inGPRs[srcGMarker], inType->size); + srcGMarker += inType->size; + destMarker += inType->size; + i += inType->size - 1; + } + } + else // chars and other stuff + { + outStruct[destMarker++] = inGPRs[srcGMarker++]; + + // Skip to next GPR if next element won't fit and we're + // not already at a register boundary. + if (inType->elements[i + 1] != NULL && (srcGMarker % 8)) + { + if (!FFI_TYPE_1_BYTE(inType->elements[i + 1]->type) && + (!FFI_TYPE_2_BYTE(inType->elements[i + 1]->type) || + (ALIGN(srcGMarker, 8) - srcGMarker) < 2) && + (!FFI_TYPE_4_BYTE(inType->elements[i + 1]->type) || + (ALIGN(srcGMarker, 8) - srcGMarker) < 4)) + srcGMarker = ALIGN(srcGMarker, inType->alignment); // was 8 + } + } + + break; + } + + case FFI_TYPE_UINT16: + case FFI_TYPE_SINT16: + srcGMarker = ALIGN(srcGMarker, 2); + destMarker = ALIGN(destMarker, 2); + + *(short*)&outStruct[destMarker] = + *(short*)&inGPRs[srcGMarker]; + srcGMarker += 2; + destMarker += 2; + + break; + + case FFI_TYPE_INT: + case FFI_TYPE_UINT32: + case FFI_TYPE_SINT32: + srcGMarker = ALIGN(srcGMarker, 4); + destMarker = ALIGN(destMarker, 4); + + *(int*)&outStruct[destMarker] = + *(int*)&inGPRs[srcGMarker]; + srcGMarker += 4; + destMarker += 4; + + break; + + case FFI_TYPE_POINTER: + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + srcGMarker = ALIGN(srcGMarker, 8); + destMarker = ALIGN(destMarker, 8); + + *(long long*)&outStruct[destMarker] = + *(long long*)&inGPRs[srcGMarker]; + srcGMarker += 8; + destMarker += 8; + + break; + + case FFI_TYPE_STRUCT: + recurseCount++; + ffi64_struct_to_ram_form(inType->elements[i], inGPRs, + &srcGMarker, inFPRs, &srcFMarker, &fprsUsed, + outStruct, &destMarker); + recurseCount--; + break; + + default: + FFI_ASSERT(0); // unknown element type + break; + } + } + + srcGMarker = ALIGN(srcGMarker, inType->alignment); + + // Take care of the special case for 16-byte structs, but not for + // nested structs. + if (recurseCount == 0 && srcGMarker == 16) + { + *(long double*)&outStruct[0] = *(long double*)&inGPRs[0]; + srcFMarker = savedFMarker; + fprsUsed = savedFPRsUsed; + } + + if (ioGPRMarker) + *ioGPRMarker = ALIGN(srcGMarker, 8); + + if (ioFPRMarker) + *ioFPRMarker = srcFMarker; + + if (ioFPRsUsed) + *ioFPRsUsed = fprsUsed; + + if (ioStructMarker) + *ioStructMarker = ALIGN(destMarker, 8); +} + +/* ffi64_struct_to_reg_form + + Copy a struct's elements into buffers that can be sliced into registers. + Return the sizes of the output buffers in bytes. Pass NULL buffer pointers + to calculate size only. + outGPRs[0-7] == r3, outFPRs[0-7] == f1 ... +*/ +void +ffi64_struct_to_reg_form( + const ffi_type* inType, + const char* inStruct, + unsigned int* ioStructMarker, + unsigned int* ioFPRsUsed, + char* outGPRs, // caller-allocated + unsigned int* ioGPRSize, + char* outFPRs, // caller-allocated + unsigned int* ioFPRSize) +{ + size_t i; + unsigned int srcMarker = 0; + unsigned int destGMarker = 0; + unsigned int destFMarker = 0; + unsigned int savedFMarker = 0; + unsigned int fprsUsed = 0; + unsigned int savedFPRsUsed = 0; + + static unsigned int recurseCount = 0; + + if (ioStructMarker) + srcMarker = *ioStructMarker; + + if (ioFPRsUsed) + { + fprsUsed = *ioFPRsUsed; + savedFPRsUsed = fprsUsed; + } + + if (ioGPRSize) + destGMarker = *ioGPRSize; + + if (ioFPRSize) + { + destFMarker = *ioFPRSize; + savedFMarker = destFMarker; + } + + switch (inType->size) + { + case 1: case 2: case 4: + destGMarker += 8 - inType->size; + break; + + default: + break; + } + + for (i = 0; inType->elements[i] != NULL; i++) + { + switch (inType->elements[i]->type) + { + // Shadow floating-point types in GPRs for vararg and pre-ANSI + // functions. + case FFI_TYPE_FLOAT: + // Nudge markers to next 4/8-byte boundary + srcMarker = ALIGN(srcMarker, 4); + destGMarker = ALIGN(destGMarker, 4); + destFMarker = ALIGN(destFMarker, 8); + + if (fprsUsed < NUM_FPR_ARG_REGISTERS) + { + if (outFPRs != NULL && inStruct != NULL) + *(double*)&outFPRs[destFMarker] = + (double)*(float*)&inStruct[srcMarker]; + + destFMarker += 8; + fprsUsed++; + } + + if (outGPRs != NULL && inStruct != NULL) + *(double*)&outGPRs[destGMarker] = + (double)*(float*)&inStruct[srcMarker]; + + srcMarker += 4; + destGMarker += 4; + + // Skip to next GPR if next element won't fit and we're + // not already at a register boundary. + if (inType->elements[i + 1] != NULL && (srcMarker % 8)) + { + if (!FFI_TYPE_1_BYTE(inType->elements[i + 1]->type) && + (!FFI_TYPE_2_BYTE(inType->elements[i + 1]->type) || + (ALIGN(destGMarker, 8) - destGMarker) < 2) && + (!FFI_TYPE_4_BYTE(inType->elements[i + 1]->type) || + (ALIGN(destGMarker, 8) - destGMarker) < 4)) + destGMarker = ALIGN(destGMarker, 8); + } + + break; + + case FFI_TYPE_DOUBLE: + srcMarker = ALIGN(srcMarker, 8); + destFMarker = ALIGN(destFMarker, 8); + + if (fprsUsed < NUM_FPR_ARG_REGISTERS) + { + if (outFPRs != NULL && inStruct != NULL) + *(double*)&outFPRs[destFMarker] = + *(double*)&inStruct[srcMarker]; + + destFMarker += 8; + fprsUsed++; + } + + if (outGPRs != NULL && inStruct != NULL) + *(double*)&outGPRs[destGMarker] = + *(double*)&inStruct[srcMarker]; + + srcMarker += 8; + + // Skip next GPR + destGMarker += 8; + destGMarker = ALIGN(destGMarker, 8); + + break; + + case FFI_TYPE_LONGDOUBLE: + srcMarker = ALIGN(srcMarker, 16); + + if (fprsUsed < NUM_FPR_ARG_REGISTERS) + { + destFMarker = ALIGN(destFMarker, 8); + destGMarker = ALIGN(destGMarker, 8); + + if (outFPRs != NULL && inStruct != NULL) + *(long double*)&outFPRs[destFMarker] = + *(long double*)&inStruct[srcMarker]; + + if (outGPRs != NULL && inStruct != NULL) + *(long double*)&outGPRs[destGMarker] = + *(long double*)&inStruct[srcMarker]; + + destFMarker += 16; + fprsUsed += 2; + } + else + { + destGMarker = ALIGN(destGMarker, 16); + + if (outGPRs != NULL && inStruct != NULL) + *(long double*)&outGPRs[destGMarker] = + *(long double*)&inStruct[srcMarker]; + } + + srcMarker += 16; + destGMarker += 16; // Skip next 2 GPRs + destGMarker = ALIGN(destGMarker, 8); // was 16 + + break; + + case FFI_TYPE_UINT8: + case FFI_TYPE_SINT8: + if (inType->alignment == 1) // bytes only + { + if (inType->size == 1) + { + if (outGPRs != NULL && inStruct != NULL) + outGPRs[destGMarker] = inStruct[srcMarker]; + + srcMarker++; + destGMarker++; + } + else if (inType->size == 2) + { + if (outGPRs != NULL && inStruct != NULL) + { + outGPRs[destGMarker] = inStruct[srcMarker]; + outGPRs[destGMarker + 1] = inStruct[srcMarker + 1]; + } + + srcMarker += 2; + destGMarker += 2; + + i++; + } + else + { + if (outGPRs != NULL && inStruct != NULL) + { + // Avoid memcpy for small chunks. + if (inType->size <= sizeof(long)) + *(long*)&outGPRs[destGMarker] = + *(long*)&inStruct[srcMarker]; + else + memcpy(&outGPRs[destGMarker], + &inStruct[srcMarker], inType->size); + } + + srcMarker += inType->size; + destGMarker += inType->size; + i += inType->size - 1; + } + } + else // bytes and other stuff + { + if (outGPRs != NULL && inStruct != NULL) + outGPRs[destGMarker] = inStruct[srcMarker]; + + srcMarker++; + destGMarker++; + + // Skip to next GPR if next element won't fit and we're + // not already at a register boundary. + if (inType->elements[i + 1] != NULL && (destGMarker % 8)) + { + if (!FFI_TYPE_1_BYTE(inType->elements[i + 1]->type) && + (!FFI_TYPE_2_BYTE(inType->elements[i + 1]->type) || + (ALIGN(destGMarker, 8) - destGMarker) < 2) && + (!FFI_TYPE_4_BYTE(inType->elements[i + 1]->type) || + (ALIGN(destGMarker, 8) - destGMarker) < 4)) + destGMarker = ALIGN(destGMarker, inType->alignment); // was 8 + } + } + + break; + + case FFI_TYPE_UINT16: + case FFI_TYPE_SINT16: + srcMarker = ALIGN(srcMarker, 2); + destGMarker = ALIGN(destGMarker, 2); + + if (outGPRs != NULL && inStruct != NULL) + *(short*)&outGPRs[destGMarker] = + *(short*)&inStruct[srcMarker]; + + srcMarker += 2; + destGMarker += 2; + + if (inType->elements[i + 1] == NULL) + destGMarker = ALIGN(destGMarker, inType->alignment); + + break; + + case FFI_TYPE_INT: + case FFI_TYPE_UINT32: + case FFI_TYPE_SINT32: + srcMarker = ALIGN(srcMarker, 4); + destGMarker = ALIGN(destGMarker, 4); + + if (outGPRs != NULL && inStruct != NULL) + *(int*)&outGPRs[destGMarker] = + *(int*)&inStruct[srcMarker]; + + srcMarker += 4; + destGMarker += 4; + + break; + + case FFI_TYPE_POINTER: + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + srcMarker = ALIGN(srcMarker, 8); + destGMarker = ALIGN(destGMarker, 8); + + if (outGPRs != NULL && inStruct != NULL) + *(long long*)&outGPRs[destGMarker] = + *(long long*)&inStruct[srcMarker]; + + srcMarker += 8; + destGMarker += 8; + + if (inType->elements[i + 1] == NULL) + destGMarker = ALIGN(destGMarker, inType->alignment); + + break; + + case FFI_TYPE_STRUCT: + recurseCount++; + ffi64_struct_to_reg_form(inType->elements[i], + inStruct, &srcMarker, &fprsUsed, outGPRs, + &destGMarker, outFPRs, &destFMarker); + recurseCount--; + break; + + default: + FFI_ASSERT(0); + break; + } + } + + destGMarker = ALIGN(destGMarker, inType->alignment); + + // Take care of the special case for 16-byte structs, but not for + // nested structs. + if (recurseCount == 0 && destGMarker == 16) + { + if (outGPRs != NULL && inStruct != NULL) + *(long double*)&outGPRs[0] = *(long double*)&inStruct[0]; + + destFMarker = savedFMarker; + fprsUsed = savedFPRsUsed; + } + + if (ioStructMarker) + *ioStructMarker = ALIGN(srcMarker, 8); + + if (ioFPRsUsed) + *ioFPRsUsed = fprsUsed; + + if (ioGPRSize) + *ioGPRSize = ALIGN(destGMarker, 8); + + if (ioFPRSize) + *ioFPRSize = ALIGN(destFMarker, 8); +} + +/* ffi64_stret_needs_ptr + + Determine whether a returned struct needs a pointer in r3 or can fit + in registers. +*/ + +bool +ffi64_stret_needs_ptr( + const ffi_type* inType, + unsigned short* ioGPRCount, + unsigned short* ioFPRCount) +{ + // Obvious case first- struct is larger than combined FPR size. + if (inType->size > 14 * 8) + return true; + + // Now the struct can physically fit in registers, determine if it + // also fits logically. + bool needsPtr = false; + unsigned short gprsUsed = 0; + unsigned short fprsUsed = 0; + size_t i; + + if (ioGPRCount) + gprsUsed = *ioGPRCount; + + if (ioFPRCount) + fprsUsed = *ioFPRCount; + + for (i = 0; inType->elements[i] != NULL && !needsPtr; i++) + { + switch (inType->elements[i]->type) + { + case FFI_TYPE_FLOAT: + case FFI_TYPE_DOUBLE: + gprsUsed++; + fprsUsed++; + + if (fprsUsed > 13) + needsPtr = true; + + break; + + case FFI_TYPE_LONGDOUBLE: + gprsUsed += 2; + fprsUsed += 2; + + if (fprsUsed > 14) + needsPtr = true; + + break; + + case FFI_TYPE_UINT8: + case FFI_TYPE_SINT8: + { + gprsUsed++; + + if (gprsUsed > 8) + { + needsPtr = true; + break; + } + + if (inType->elements[i + 1] == NULL) // last byte in the struct + break; + + // Count possible contiguous bytes ahead, up to 8. + unsigned short j; + + for (j = 1; j < 8; j++) + { + if (inType->elements[i + j] == NULL || + !FFI_TYPE_1_BYTE(inType->elements[i + j]->type)) + break; + } + + i += j - 1; // allow for i++ before the test condition + + break; + } + + case FFI_TYPE_UINT16: + case FFI_TYPE_SINT16: + case FFI_TYPE_INT: + case FFI_TYPE_UINT32: + case FFI_TYPE_SINT32: + case FFI_TYPE_POINTER: + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + gprsUsed++; + + if (gprsUsed > 8) + needsPtr = true; + + break; + + case FFI_TYPE_STRUCT: + needsPtr = ffi64_stret_needs_ptr( + inType->elements[i], &gprsUsed, &fprsUsed); + + break; + + default: + FFI_ASSERT(0); + break; + } + } + + if (ioGPRCount) + *ioGPRCount = gprsUsed; + + if (ioFPRCount) + *ioFPRCount = fprsUsed; + + return needsPtr; +} + +/* ffi64_data_size + + Calculate the size in bytes of an ffi type. +*/ + +unsigned int +ffi64_data_size( + const ffi_type* inType) +{ + unsigned int size = 0; + + switch (inType->type) + { + case FFI_TYPE_UINT8: + case FFI_TYPE_SINT8: + size = 1; + break; + + case FFI_TYPE_UINT16: + case FFI_TYPE_SINT16: + size = 2; + break; + + case FFI_TYPE_INT: + case FFI_TYPE_UINT32: + case FFI_TYPE_SINT32: + case FFI_TYPE_FLOAT: + size = 4; + break; + + case FFI_TYPE_POINTER: + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + case FFI_TYPE_DOUBLE: + size = 8; + break; + + case FFI_TYPE_LONGDOUBLE: + size = 16; + break; + + case FFI_TYPE_STRUCT: + ffi64_struct_to_reg_form( + inType, NULL, NULL, NULL, NULL, &size, NULL, NULL); + break; + + case FFI_TYPE_VOID: + break; + + default: + FFI_ASSERT(0); + break; + } + + return size; +} + +#endif /* defined(__ppc64__) */ +#endif /* __ppc__ || __ppc64__ */ diff -r -u ./Modules/_ctypes/libffi_osx/powerpc/ppc64-darwin_closure.S ./Modules/_ctypes/libffi_osx/powerpc/ppc64-darwin_closure.S new file mode 100644 index 0000000..7162fa1 --- /dev/null +++ ./Modules/_ctypes/libffi_osx/powerpc/ppc64-darwin_closure.S @@ -0,0 +1,418 @@ +#if defined(__ppc64__) + +/* ----------------------------------------------------------------------- + ppc64-darwin_closure.S - Copyright (c) 2002, 2003, 2004, Free Software Foundation, + Inc. based on ppc_closure.S + + PowerPC Assembly glue. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#define LIBFFI_ASM + +#include +#include // for FFI_TRAMPOLINE_SIZE +#include +#include + + .file "ppc64-darwin_closure.S" +.text + .align LOG2_GPR_BYTES + .globl _ffi_closure_ASM + +.text + .align LOG2_GPR_BYTES + +_ffi_closure_ASM: +LFB1: + mflr r0 + stg r0,SF_RETURN(r1) // save return address + + // Save GPRs 3 - 10 (aligned to 8) in the parents outgoing area. + stg r3,SF_ARG1(r1) + stg r4,SF_ARG2(r1) + stg r5,SF_ARG3(r1) + stg r6,SF_ARG4(r1) + stg r7,SF_ARG5(r1) + stg r8,SF_ARG6(r1) + stg r9,SF_ARG7(r1) + stg r10,SF_ARG8(r1) + +LCFI0: +/* 48 bytes (Linkage Area) + 64 bytes (outgoing parameter area, always reserved) + 112 bytes (14*8 for incoming FPR) + ? bytes (result) + 112 bytes (14*8 for outgoing FPR) + 16 bytes (2 saved registers) + 352 + ? total bytes +*/ + + std r31,-8(r1) // Save registers we use. + std r30,-16(r1) + mr r30,r1 // Save the old SP. + mr r31,r11 // Save the ffi_closure around ffi64_data_size. + + // Calculate the space we need. + stdu r1,-SF_MINSIZE(r1) + ld r3,FFI_TRAMPOLINE_SIZE(r31) // ffi_closure->cif* + ld r3,16(r3) // ffi_cif->rtype* + bl Lffi64_data_size$stub + ld r1,0(r1) + + addi r3,r3,352 // Add our overhead. + neg r3,r3 + li r0,-32 // Align to 32 bytes. + and r3,r3,r0 + stdux r1,r1,r3 // Grow the stack. + + mr r11,r31 // Copy the ffi_closure back. + +LCFI1: + // We want to build up an area for the parameters passed + // in registers. (both floating point and integer) + +/* 320 bytes (callee stack frame aligned to 32) + 48 bytes (caller linkage area) + 368 (start of caller parameter area aligned to 8) +*/ + + // Save FPRs 1 - 14. (aligned to 8) + stfd f1,112(r1) + stfd f2,120(r1) + stfd f3,128(r1) + stfd f4,136(r1) + stfd f5,144(r1) + stfd f6,152(r1) + stfd f7,160(r1) + stfd f8,168(r1) + stfd f9,176(r1) + stfd f10,184(r1) + stfd f11,192(r1) + stfd f12,200(r1) + stfd f13,208(r1) + stfd f14,216(r1) + + // Set up registers for the routine that actually does the work. + mr r3,r11 // context pointer from the trampoline + addi r4,r1,224 // result storage + addi r5,r30,SF_ARG1 // saved GPRs + addi r6,r1,112 // saved FPRs + bl Lffi_closure_helper_DARWIN$stub + + // Look the proper starting point in table + // by using return type as an offset. + addi r5,r1,224 // Get pointer to results area. + bl Lget_ret_type0_addr // Get pointer to Lret_type0 into LR. + mflr r4 // Move to r4. + slwi r3,r3,4 // Now multiply return type by 16. + add r3,r3,r4 // Add contents of table to table address. + mtctr r3 + bctr + +LFE1: + // Each of the ret_typeX code fragments has to be exactly 16 bytes long + // (4 instructions). For cache effectiveness we align to a 16 byte + // boundary first. + .align 4 + nop + nop + nop + +Lget_ret_type0_addr: + blrl + +// case FFI_TYPE_VOID +Lret_type0: + b Lfinish + nop + nop + nop + +// case FFI_TYPE_INT +Lret_type1: + lwz r3,4(r5) + b Lfinish + nop + nop + +// case FFI_TYPE_FLOAT +Lret_type2: + lfs f1,0(r5) + b Lfinish + nop + nop + +// case FFI_TYPE_DOUBLE +Lret_type3: + lfd f1,0(r5) + b Lfinish + nop + nop + +// case FFI_TYPE_LONGDOUBLE +Lret_type4: + lfd f1,0(r5) + lfd f2,8(r5) + b Lfinish + nop + +// case FFI_TYPE_UINT8 +Lret_type5: + lbz r3,7(r5) + b Lfinish + nop + nop + +// case FFI_TYPE_SINT8 +Lret_type6: + lbz r3,7(r5) + extsb r3,r3 + b Lfinish + nop + +// case FFI_TYPE_UINT16 +Lret_type7: + lhz r3,6(r5) + b Lfinish + nop + nop + +// case FFI_TYPE_SINT16 +Lret_type8: + lha r3,6(r5) + b Lfinish + nop + nop + +// case FFI_TYPE_UINT32 +Lret_type9: // same as Lret_type1 + lwz r3,4(r5) + b Lfinish + nop + nop + +// case FFI_TYPE_SINT32 +Lret_type10: // same as Lret_type1 + lwz r3,4(r5) + b Lfinish + nop + nop + +// case FFI_TYPE_UINT64 +Lret_type11: + ld r3,0(r5) + b Lfinish + nop + nop + +// case FFI_TYPE_SINT64 +Lret_type12: // same as Lret_type11 + ld r3,0(r5) + b Lfinish + nop + nop + +// case FFI_TYPE_STRUCT +Lret_type13: + b Lret_struct + nop + nop + nop + +// ** End 16-byte aligned cases ** +// case FFI_TYPE_POINTER +// This case assumes that FFI_TYPE_POINTER == FFI_TYPE_LAST. If more types +// are added in future, the following code will need to be updated and +// padded to 16 bytes. +Lret_type14: + lg r3,0(r5) + b Lfinish + +// copy struct into registers +Lret_struct: + ld r31,FFI_TRAMPOLINE_SIZE(r31) // ffi_closure->cif* + ld r3,16(r31) // ffi_cif->rtype* + ld r31,24(r31) // ffi_cif->flags + mr r4,r5 // copy struct* to 2nd arg + addi r7,r1,SF_ARG9 // GPR return area + addi r9,r30,-16-(14*8) // FPR return area + li r5,0 // struct offset ptr (NULL) + li r6,0 // FPR used count ptr (NULL) + li r8,0 // GPR return area size ptr (NULL) + li r10,0 // FPR return area size ptr (NULL) + bl Lffi64_struct_to_reg_form$stub + + // Load GPRs + ld r3,SF_ARG9(r1) + ld r4,SF_ARG10(r1) + ld r5,SF_ARG11(r1) + ld r6,SF_ARG12(r1) + nop + ld r7,SF_ARG13(r1) + ld r8,SF_ARG14(r1) + ld r9,SF_ARG15(r1) + ld r10,SF_ARG16(r1) + nop + + // Load FPRs + mtcrf 0x2,r31 + bf 26,Lfinish + lfd f1,-16-(14*8)(r30) + lfd f2,-16-(13*8)(r30) + lfd f3,-16-(12*8)(r30) + lfd f4,-16-(11*8)(r30) + nop + lfd f5,-16-(10*8)(r30) + lfd f6,-16-(9*8)(r30) + lfd f7,-16-(8*8)(r30) + lfd f8,-16-(7*8)(r30) + nop + lfd f9,-16-(6*8)(r30) + lfd f10,-16-(5*8)(r30) + lfd f11,-16-(4*8)(r30) + lfd f12,-16-(3*8)(r30) + nop + lfd f13,-16-(2*8)(r30) + lfd f14,-16-(1*8)(r30) + // Fall through + +// case done +Lfinish: + lg r1,0(r1) // Restore stack pointer. + ld r31,-8(r1) // Restore registers we used. + ld r30,-16(r1) + lg r0,SF_RETURN(r1) // Get return address. + mtlr r0 // Reset link register. + blr + +// END(ffi_closure_ASM) + +.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support +EH_frame1: + .set L$set$0,LECIE1-LSCIE1 + .long L$set$0 ; Length of Common Information Entry +LSCIE1: + .long 0x0 ; CIE Identifier Tag + .byte 0x1 ; CIE Version + .ascii "zR\0" ; CIE Augmentation + .byte 0x1 ; uleb128 0x1; CIE Code Alignment Factor + .byte 0x7c ; sleb128 -4; CIE Data Alignment Factor + .byte 0x41 ; CIE RA Column + .byte 0x1 ; uleb128 0x1; Augmentation size + .byte 0x10 ; FDE Encoding (pcrel) + .byte 0xc ; DW_CFA_def_cfa + .byte 0x1 ; uleb128 0x1 + .byte 0x0 ; uleb128 0x0 + .align LOG2_GPR_BYTES +LECIE1: +.globl _ffi_closure_ASM.eh +_ffi_closure_ASM.eh: +LSFDE1: + .set L$set$1,LEFDE1-LASFDE1 + .long L$set$1 ; FDE Length + +LASFDE1: + .long LASFDE1-EH_frame1 ; FDE CIE offset + .g_long LFB1-. ; FDE initial location + .set L$set$3,LFE1-LFB1 + .g_long L$set$3 ; FDE address range + .byte 0x0 ; uleb128 0x0; Augmentation size + .byte 0x4 ; DW_CFA_advance_loc4 + .set L$set$3,LCFI1-LCFI0 + .long L$set$3 + .byte 0xe ; DW_CFA_def_cfa_offset + .byte 176,1 ; uleb128 176 + .byte 0x4 ; DW_CFA_advance_loc4 + .set L$set$4,LCFI0-LFB1 + .long L$set$4 + .byte 0x11 ; DW_CFA_offset_extended_sf + .byte 0x41 ; uleb128 0x41 + .byte 0x7e ; sleb128 -2 + .align LOG2_GPR_BYTES + +LEFDE1: +.data + .align LOG2_GPR_BYTES +LDFCM0: +.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 + .align LOG2_GPR_BYTES + +Lffi_closure_helper_DARWIN$stub: + .indirect_symbol _ffi_closure_helper_DARWIN + mflr r0 + bcl 20,31,LO$ffi_closure_helper_DARWIN + +LO$ffi_closure_helper_DARWIN: + mflr r11 + addis r11,r11,ha16(L_ffi_closure_helper_DARWIN$lazy_ptr - LO$ffi_closure_helper_DARWIN) + mtlr r0 + lgu r12,lo16(L_ffi_closure_helper_DARWIN$lazy_ptr - LO$ffi_closure_helper_DARWIN)(r11) + mtctr r12 + bctr + +.lazy_symbol_pointer +L_ffi_closure_helper_DARWIN$lazy_ptr: + .indirect_symbol _ffi_closure_helper_DARWIN + .g_long dyld_stub_binding_helper + +.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 + .align LOG2_GPR_BYTES + +Lffi64_struct_to_reg_form$stub: + .indirect_symbol _ffi64_struct_to_reg_form + mflr r0 + bcl 20,31,LO$ffi64_struct_to_reg_form + +LO$ffi64_struct_to_reg_form: + mflr r11 + addis r11,r11,ha16(L_ffi64_struct_to_reg_form$lazy_ptr - LO$ffi64_struct_to_reg_form) + mtlr r0 + lgu r12,lo16(L_ffi64_struct_to_reg_form$lazy_ptr - LO$ffi64_struct_to_reg_form)(r11) + mtctr r12 + bctr + +.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 + .align LOG2_GPR_BYTES + +Lffi64_data_size$stub: + .indirect_symbol _ffi64_data_size + mflr r0 + bcl 20,31,LO$ffi64_data_size + +LO$ffi64_data_size: + mflr r11 + addis r11,r11,ha16(L_ffi64_data_size$lazy_ptr - LO$ffi64_data_size) + mtlr r0 + lgu r12,lo16(L_ffi64_data_size$lazy_ptr - LO$ffi64_data_size)(r11) + mtctr r12 + bctr + +.lazy_symbol_pointer +L_ffi64_struct_to_reg_form$lazy_ptr: + .indirect_symbol _ffi64_struct_to_reg_form + .g_long dyld_stub_binding_helper + +L_ffi64_data_size$lazy_ptr: + .indirect_symbol _ffi64_data_size + .g_long dyld_stub_binding_helper + +#endif // __ppc64__ diff -r -u ./Modules/_ctypes/libffi_osx/types.c ./Modules/_ctypes/libffi_osx/types.c new file mode 100644 index 0000000..44806ae --- /dev/null +++ ./Modules/_ctypes/libffi_osx/types.c @@ -0,0 +1,115 @@ +/* ----------------------------------------------------------------------- + types.c - Copyright (c) 1996, 1998 Red Hat, Inc. + + Predefined ffi_types needed by libffi. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#include +#include + +/* Type definitions */ +#define FFI_INTEGRAL_TYPEDEF(n, s, a, t) \ + ffi_type ffi_type_##n = { s, a, t, NULL } +#define FFI_AGGREGATE_TYPEDEF(n, e) \ + ffi_type ffi_type_##n = { 0, 0, FFI_TYPE_STRUCT, e } + +FFI_INTEGRAL_TYPEDEF(uint8, 1, 1, FFI_TYPE_UINT8); +FFI_INTEGRAL_TYPEDEF(sint8, 1, 1, FFI_TYPE_SINT8); +FFI_INTEGRAL_TYPEDEF(uint16, 2, 2, FFI_TYPE_UINT16); +FFI_INTEGRAL_TYPEDEF(sint16, 2, 2, FFI_TYPE_SINT16); +FFI_INTEGRAL_TYPEDEF(uint32, 4, 4, FFI_TYPE_UINT32); +FFI_INTEGRAL_TYPEDEF(sint32, 4, 4, FFI_TYPE_SINT32); +FFI_INTEGRAL_TYPEDEF(float, 4, 4, FFI_TYPE_FLOAT); + +/* Size and alignment are fake here. They must not be 0. */ +FFI_INTEGRAL_TYPEDEF(void, 1, 1, FFI_TYPE_VOID); + +#if defined ALPHA || defined SPARC64 || defined X86_64 || \ + defined S390X || defined IA64 || defined POWERPC64 +FFI_INTEGRAL_TYPEDEF(pointer, 8, 8, FFI_TYPE_POINTER); +#else +FFI_INTEGRAL_TYPEDEF(pointer, 4, 4, FFI_TYPE_POINTER); +#endif + +#if defined X86 || defined ARM || defined M68K || defined(X86_DARWIN) + +# ifdef X86_64 + FFI_INTEGRAL_TYPEDEF(uint64, 8, 8, FFI_TYPE_UINT64); + FFI_INTEGRAL_TYPEDEF(sint64, 8, 8, FFI_TYPE_SINT64); +# else + FFI_INTEGRAL_TYPEDEF(uint64, 8, 4, FFI_TYPE_UINT64); + FFI_INTEGRAL_TYPEDEF(sint64, 8, 4, FFI_TYPE_SINT64); +# endif + +#elif defined(POWERPC_DARWIN) +FFI_INTEGRAL_TYPEDEF(uint64, 8, 8, FFI_TYPE_UINT64); +FFI_INTEGRAL_TYPEDEF(sint64, 8, 8, FFI_TYPE_SINT64); +#elif defined SH +FFI_INTEGRAL_TYPEDEF(uint64, 8, 4, FFI_TYPE_UINT64); +FFI_INTEGRAL_TYPEDEF(sint64, 8, 4, FFI_TYPE_SINT64); +#else +FFI_INTEGRAL_TYPEDEF(uint64, 8, 8, FFI_TYPE_UINT64); +FFI_INTEGRAL_TYPEDEF(sint64, 8, 8, FFI_TYPE_SINT64); +#endif + +#if defined X86 || defined X86_WIN32 || defined M68K || defined(X86_DARWIN) + +# if defined X86_WIN32 || defined X86_64 + FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE); +# else + FFI_INTEGRAL_TYPEDEF(double, 8, 4, FFI_TYPE_DOUBLE); +# endif + +# ifdef X86_DARWIN + FFI_INTEGRAL_TYPEDEF(longdouble, 16, 16, FFI_TYPE_LONGDOUBLE); +# else + FFI_INTEGRAL_TYPEDEF(longdouble, 12, 4, FFI_TYPE_LONGDOUBLE); +# endif + +#elif defined ARM || defined SH || defined POWERPC_AIX +FFI_INTEGRAL_TYPEDEF(double, 8, 4, FFI_TYPE_DOUBLE); +FFI_INTEGRAL_TYPEDEF(longdouble, 8, 4, FFI_TYPE_LONGDOUBLE); +#elif defined POWERPC_DARWIN +FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE); + +# if __GNUC__ >= 4 + FFI_INTEGRAL_TYPEDEF(longdouble, 16, 16, FFI_TYPE_LONGDOUBLE); +# else + FFI_INTEGRAL_TYPEDEF(longdouble, 8, 8, FFI_TYPE_LONGDOUBLE); +# endif + +#elif defined SPARC +FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE); + +# ifdef SPARC64 + FFI_INTEGRAL_TYPEDEF(longdouble, 16, 16, FFI_TYPE_LONGDOUBLE); +# else + FFI_INTEGRAL_TYPEDEF(longdouble, 16, 8, FFI_TYPE_LONGDOUBLE); +# endif + +#elif defined X86_64 || defined POWERPC64 +FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE); +FFI_INTEGRAL_TYPEDEF(longdouble, 16, 16, FFI_TYPE_LONGDOUBLE); +#else +FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE); +FFI_INTEGRAL_TYPEDEF(longdouble, 8, 8, FFI_TYPE_LONGDOUBLE); +#endif \ No newline at end of file diff -r -u ./Modules/_ctypes/libffi_osx/x86/darwin64.S ./Modules/_ctypes/libffi_osx/x86/darwin64.S new file mode 100644 index 0000000..165d469 --- /dev/null +++ ./Modules/_ctypes/libffi_osx/x86/darwin64.S @@ -0,0 +1,417 @@ +/* ----------------------------------------------------------------------- + darwin64.S - Copyright (c) 2006 Free Software Foundation, Inc. + derived from unix64.S + + x86-64 Foreign Function Interface for Darwin. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#ifdef __x86_64__ +#define LIBFFI_ASM +#include +#include + + .file "darwin64.S" +.text + +/* ffi_call_unix64 (void *args, unsigned long bytes, unsigned flags, + void *raddr, void (*fnaddr)()); + + Bit o trickiness here -- ARGS+BYTES is the base of the stack frame + for this function. This has been allocated by ffi_call. We also + deallocate some of the stack that has been alloca'd. */ + + .align 3 + .globl _ffi_call_unix64 + +_ffi_call_unix64: +LUW0: + movq (%rsp), %r10 /* Load return address. */ + movq %rdi, %r12 /* Save a copy of the register area. */ + leaq (%rdi, %rsi), %rax /* Find local stack base. */ + movq %rdx, (%rax) /* Save flags. */ + movq %rcx, 8(%rax) /* Save raddr. */ + movq %rbp, 16(%rax) /* Save old frame pointer. */ + movq %r10, 24(%rax) /* Relocate return address. */ + movq %rax, %rbp /* Finalize local stack frame. */ +LUW1: + /* movq %rdi, %r10 // Save a copy of the register area. */ + movq %r12, %r10 + movq %r8, %r11 /* Save a copy of the target fn. */ + movl %r9d, %eax /* Set number of SSE registers. */ + + /* Load up all argument registers. */ + movq (%r10), %rdi + movq 8(%r10), %rsi + movq 16(%r10), %rdx + movq 24(%r10), %rcx + movq 32(%r10), %r8 + movq 40(%r10), %r9 + testl %eax, %eax + jnz Lload_sse +Lret_from_load_sse: + + /* Deallocate the reg arg area. */ + leaq 176(%r10), %rsp + + /* Call the user function. */ + call *%r11 + + /* Deallocate stack arg area; local stack frame in redzone. */ + leaq 24(%rbp), %rsp + + movq 0(%rbp), %rcx /* Reload flags. */ + movq 8(%rbp), %rdi /* Reload raddr. */ + movq 16(%rbp), %rbp /* Reload old frame pointer. */ +LUW2: + + /* The first byte of the flags contains the FFI_TYPE. */ + movzbl %cl, %r10d + leaq Lstore_table(%rip), %r11 + movslq (%r11, %r10, 4), %r10 + addq %r11, %r10 + jmp *%r10 + +Lstore_table: + .long Lst_void-Lstore_table /* FFI_TYPE_VOID */ + .long Lst_sint32-Lstore_table /* FFI_TYPE_INT */ + .long Lst_float-Lstore_table /* FFI_TYPE_FLOAT */ + .long Lst_double-Lstore_table /* FFI_TYPE_DOUBLE */ + .long Lst_ldouble-Lstore_table /* FFI_TYPE_LONGDOUBLE */ + .long Lst_uint8-Lstore_table /* FFI_TYPE_UINT8 */ + .long Lst_sint8-Lstore_table /* FFI_TYPE_SINT8 */ + .long Lst_uint16-Lstore_table /* FFI_TYPE_UINT16 */ + .long Lst_sint16-Lstore_table /* FFI_TYPE_SINT16 */ + .long Lst_uint32-Lstore_table /* FFI_TYPE_UINT32 */ + .long Lst_sint32-Lstore_table /* FFI_TYPE_SINT32 */ + .long Lst_int64-Lstore_table /* FFI_TYPE_UINT64 */ + .long Lst_int64-Lstore_table /* FFI_TYPE_SINT64 */ + .long Lst_struct-Lstore_table /* FFI_TYPE_STRUCT */ + .long Lst_int64-Lstore_table /* FFI_TYPE_POINTER */ + + .text + .align 3 +Lst_void: + ret + .align 3 +Lst_uint8: + movzbq %al, %rax + movq %rax, (%rdi) + ret + .align 3 +Lst_sint8: + movsbq %al, %rax + movq %rax, (%rdi) + ret + .align 3 +Lst_uint16: + movzwq %ax, %rax + movq %rax, (%rdi) + .align 3 +Lst_sint16: + movswq %ax, %rax + movq %rax, (%rdi) + ret + .align 3 +Lst_uint32: + movl %eax, %eax + movq %rax, (%rdi) + .align 3 +Lst_sint32: + cltq + movq %rax, (%rdi) + ret + .align 3 +Lst_int64: + movq %rax, (%rdi) + ret + .align 3 +Lst_float: + movss %xmm0, (%rdi) + ret + .align 3 +Lst_double: + movsd %xmm0, (%rdi) + ret +Lst_ldouble: + fstpt (%rdi) + ret + .align 3 +Lst_struct: + leaq -20(%rsp), %rsi /* Scratch area in redzone. */ + + /* We have to locate the values now, and since we don't want to + write too much data into the user's return value, we spill the + value to a 16 byte scratch area first. Bits 8, 9, and 10 + control where the values are located. Only one of the three + bits will be set; see ffi_prep_cif_machdep for the pattern. */ + movd %xmm0, %r10 + movd %xmm1, %r11 + testl $0x100, %ecx + cmovnz %rax, %rdx + cmovnz %r10, %rax + testl $0x200, %ecx + cmovnz %r10, %rdx + testl $0x400, %ecx + cmovnz %r10, %rax + cmovnz %r11, %rdx + movq %rax, (%rsi) + movq %rdx, 8(%rsi) + + /* Bits 12-31 contain the true size of the structure. Copy from + the scratch area to the true destination. */ + shrl $12, %ecx + rep movsb + ret + + /* Many times we can avoid loading any SSE registers at all. + It's not worth an indirect jump to load the exact set of + SSE registers needed; zero or all is a good compromise. */ + .align 3 +LUW3: +Lload_sse: + movdqa 48(%r10), %xmm0 + movdqa 64(%r10), %xmm1 + movdqa 80(%r10), %xmm2 + movdqa 96(%r10), %xmm3 + movdqa 112(%r10), %xmm4 + movdqa 128(%r10), %xmm5 + movdqa 144(%r10), %xmm6 + movdqa 160(%r10), %xmm7 + jmp Lret_from_load_sse + +LUW4: + .align 3 + .globl _ffi_closure_unix64 + +_ffi_closure_unix64: +LUW5: + /* The carry flag is set by the trampoline iff SSE registers + are used. Don't clobber it before the branch instruction. */ + leaq -200(%rsp), %rsp +LUW6: + movq %rdi, (%rsp) + movq %rsi, 8(%rsp) + movq %rdx, 16(%rsp) + movq %rcx, 24(%rsp) + movq %r8, 32(%rsp) + movq %r9, 40(%rsp) + jc Lsave_sse +Lret_from_save_sse: + + movq %r10, %rdi + leaq 176(%rsp), %rsi + movq %rsp, %rdx + leaq 208(%rsp), %rcx + call _ffi_closure_unix64_inner + + /* Deallocate stack frame early; return value is now in redzone. */ + addq $200, %rsp +LUW7: + + /* The first byte of the return value contains the FFI_TYPE. */ + movzbl %al, %r10d + leaq Lload_table(%rip), %r11 + movslq (%r11, %r10, 4), %r10 + addq %r11, %r10 + jmp *%r10 + +Lload_table: + .long Lld_void-Lload_table /* FFI_TYPE_VOID */ + .long Lld_int32-Lload_table /* FFI_TYPE_INT */ + .long Lld_float-Lload_table /* FFI_TYPE_FLOAT */ + .long Lld_double-Lload_table /* FFI_TYPE_DOUBLE */ + .long Lld_ldouble-Lload_table /* FFI_TYPE_LONGDOUBLE */ + .long Lld_int8-Lload_table /* FFI_TYPE_UINT8 */ + .long Lld_int8-Lload_table /* FFI_TYPE_SINT8 */ + .long Lld_int16-Lload_table /* FFI_TYPE_UINT16 */ + .long Lld_int16-Lload_table /* FFI_TYPE_SINT16 */ + .long Lld_int32-Lload_table /* FFI_TYPE_UINT32 */ + .long Lld_int32-Lload_table /* FFI_TYPE_SINT32 */ + .long Lld_int64-Lload_table /* FFI_TYPE_UINT64 */ + .long Lld_int64-Lload_table /* FFI_TYPE_SINT64 */ + .long Lld_struct-Lload_table /* FFI_TYPE_STRUCT */ + .long Lld_int64-Lload_table /* FFI_TYPE_POINTER */ + + .text + .align 3 +Lld_void: + ret + .align 3 +Lld_int8: + movzbl -24(%rsp), %eax + ret + .align 3 +Lld_int16: + movzwl -24(%rsp), %eax + ret + .align 3 +Lld_int32: + movl -24(%rsp), %eax + ret + .align 3 +Lld_int64: + movq -24(%rsp), %rax + ret + .align 3 +Lld_float: + movss -24(%rsp), %xmm0 + ret + .align 3 +Lld_double: + movsd -24(%rsp), %xmm0 + ret + .align 3 +Lld_ldouble: + fldt -24(%rsp) + ret + .align 3 +Lld_struct: + /* There are four possibilities here, %rax/%rdx, %xmm0/%rax, + %rax/%xmm0, %xmm0/%xmm1. We collapse two by always loading + both rdx and xmm1 with the second word. For the remaining, + bit 8 set means xmm0 gets the second word, and bit 9 means + that rax gets the second word. */ + movq -24(%rsp), %rcx + movq -16(%rsp), %rdx + movq -16(%rsp), %xmm1 + testl $0x100, %eax + cmovnz %rdx, %rcx + movd %rcx, %xmm0 + testl $0x200, %eax + movq -24(%rsp), %rax + cmovnz %rdx, %rax + ret + + /* See the comment above Lload_sse; the same logic applies here. */ + .align 3 +LUW8: +Lsave_sse: + movdqa %xmm0, 48(%rsp) + movdqa %xmm1, 64(%rsp) + movdqa %xmm2, 80(%rsp) + movdqa %xmm3, 96(%rsp) + movdqa %xmm4, 112(%rsp) + movdqa %xmm5, 128(%rsp) + movdqa %xmm6, 144(%rsp) + movdqa %xmm7, 160(%rsp) + jmp Lret_from_save_sse + +LUW9: +.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support +EH_frame1: + .set L$set$0,LECIE1-LSCIE1 /* CIE Length */ + .long L$set$0 +LSCIE1: + .long 0x0 /* CIE Identifier Tag */ + .byte 0x1 /* CIE Version */ + .ascii "zR\0" /* CIE Augmentation */ + .byte 0x1 /* uleb128 0x1; CIE Code Alignment Factor */ + .byte 0x78 /* sleb128 -8; CIE Data Alignment Factor */ + .byte 0x10 /* CIE RA Column */ + .byte 0x1 /* uleb128 0x1; Augmentation size */ + .byte 0x10 /* FDE Encoding (pcrel sdata4) */ + .byte 0xc /* DW_CFA_def_cfa, %rsp offset 8 */ + .byte 0x7 /* uleb128 0x7 */ + .byte 0x8 /* uleb128 0x8 */ + .byte 0x90 /* DW_CFA_offset, column 0x10 */ + .byte 0x1 + .align 3 +LECIE1: + .globl _ffi_call_unix64.eh +_ffi_call_unix64.eh: +LSFDE1: + .set L$set$1,LEFDE1-LASFDE1 /* FDE Length */ + .long L$set$1 +LASFDE1: + .long LASFDE1-EH_frame1 /* FDE CIE offset */ + .quad LUW0-. /* FDE initial location */ + .set L$set$2,LUW4-LUW0 /* FDE address range */ + .quad L$set$2 + .byte 0x0 /* Augmentation size */ + .byte 0x4 /* DW_CFA_advance_loc4 */ + .set L$set$3,LUW1-LUW0 + .long L$set$3 + + /* New stack frame based off rbp. This is a itty bit of unwind + trickery in that the CFA *has* changed. There is no easy way + to describe it correctly on entry to the function. Fortunately, + it doesn't matter too much since at all points we can correctly + unwind back to ffi_call. Note that the location to which we + moved the return address is (the new) CFA-8, so from the + perspective of the unwind info, it hasn't moved. */ + .byte 0xc /* DW_CFA_def_cfa, %rbp offset 32 */ + .byte 0x6 + .byte 0x20 + .byte 0x80+6 /* DW_CFA_offset, %rbp offset 2*-8 */ + .byte 0x2 + .byte 0xa /* DW_CFA_remember_state */ + + .byte 0x4 /* DW_CFA_advance_loc4 */ + .set L$set$4,LUW2-LUW1 + .long L$set$4 + .byte 0xc /* DW_CFA_def_cfa, %rsp offset 8 */ + .byte 0x7 + .byte 0x8 + .byte 0xc0+6 /* DW_CFA_restore, %rbp */ + + .byte 0x4 /* DW_CFA_advance_loc4 */ + .set L$set$5,LUW3-LUW2 + .long L$set$5 + .byte 0xb /* DW_CFA_restore_state */ + + .align 3 +LEFDE1: + .globl _ffi_closure_unix64.eh +_ffi_closure_unix64.eh: +LSFDE3: + .set L$set$6,LEFDE3-LASFDE3 /* FDE Length */ + .long L$set$6 +LASFDE3: + .long LASFDE3-EH_frame1 /* FDE CIE offset */ + .quad LUW5-. /* FDE initial location */ + .set L$set$7,LUW9-LUW5 /* FDE address range */ + .quad L$set$7 + .byte 0x0 /* Augmentation size */ + + .byte 0x4 /* DW_CFA_advance_loc4 */ + .set L$set$8,LUW6-LUW5 + .long L$set$8 + .byte 0xe /* DW_CFA_def_cfa_offset */ + .byte 208,1 /* uleb128 208 */ + .byte 0xa /* DW_CFA_remember_state */ + + .byte 0x4 /* DW_CFA_advance_loc4 */ + .set L$set$9,LUW7-LUW6 + .long L$set$9 + .byte 0xe /* DW_CFA_def_cfa_offset */ + .byte 0x8 + + .byte 0x4 /* DW_CFA_advance_loc4 */ + .set L$set$10,LUW8-LUW7 + .long L$set$10 + .byte 0xb /* DW_CFA_restore_state */ + + .align 3 +LEFDE3: + .subsections_via_symbols + +#endif /* __x86_64__ */ diff -r -u ./Modules/_ctypes/libffi_osx/x86/x86-darwin.S ./Modules/_ctypes/libffi_osx/x86/x86-darwin.S new file mode 100644 index 0000000..925a841 --- /dev/null +++ ./Modules/_ctypes/libffi_osx/x86/x86-darwin.S @@ -0,0 +1,422 @@ +#ifdef __i386__ +/* ----------------------------------------------------------------------- + darwin.S - Copyright (c) 1996, 1998, 2001, 2002, 2003 Red Hat, Inc. + + X86 Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +/* + * This file is based on sysv.S and then hacked up by Ronald who hasn't done + * assembly programming in 8 years. + */ + +#ifndef __x86_64__ + +#define LIBFFI_ASM +#include +#include + +#ifdef PyObjC_STRICT_DEBUGGING + /* XXX: Debugging of stack alignment, to be removed */ +#define ASSERT_STACK_ALIGNED movdqa -16(%esp), %xmm0 +#else +#define ASSERT_STACK_ALIGNED +#endif + +.text + +.globl _ffi_prep_args + + .align 4 +.globl _ffi_call_SYSV + +_ffi_call_SYSV: +LFB1: + pushl %ebp +LCFI0: + movl %esp,%ebp +LCFI1: + subl $8,%esp + /* Make room for all of the new args. */ + movl 16(%ebp),%ecx + subl %ecx,%esp + + movl %esp,%eax + + /* Place all of the ffi_prep_args in position */ + subl $8,%esp + pushl 12(%ebp) + pushl %eax + call *8(%ebp) + + /* Return stack to previous state and call the function */ + addl $16,%esp + + call *28(%ebp) + + /* Remove the space we pushed for the args */ + movl 16(%ebp),%ecx + addl %ecx,%esp + + /* Load %ecx with the return type code */ + movl 20(%ebp),%ecx + + /* If the return value pointer is NULL, assume no return value. */ + cmpl $0,24(%ebp) + jne Lretint + + /* Even if there is no space for the return value, we are + obliged to handle floating-point values. */ + cmpl $FFI_TYPE_FLOAT,%ecx + jne Lnoretval + fstp %st(0) + + jmp Lepilogue + +Lretint: + cmpl $FFI_TYPE_INT,%ecx + jne Lretfloat + /* Load %ecx with the pointer to storage for the return value */ + movl 24(%ebp),%ecx + movl %eax,0(%ecx) + jmp Lepilogue + +Lretfloat: + cmpl $FFI_TYPE_FLOAT,%ecx + jne Lretdouble + /* Load %ecx with the pointer to storage for the return value */ + movl 24(%ebp),%ecx + fstps (%ecx) + jmp Lepilogue + +Lretdouble: + cmpl $FFI_TYPE_DOUBLE,%ecx + jne Lretlongdouble + /* Load %ecx with the pointer to storage for the return value */ + movl 24(%ebp),%ecx + fstpl (%ecx) + jmp Lepilogue + +Lretlongdouble: + cmpl $FFI_TYPE_LONGDOUBLE,%ecx + jne Lretint64 + /* Load %ecx with the pointer to storage for the return value */ + movl 24(%ebp),%ecx + fstpt (%ecx) + jmp Lepilogue + +Lretint64: + cmpl $FFI_TYPE_SINT64,%ecx + jne Lretstruct1b + /* Load %ecx with the pointer to storage for the return value */ + movl 24(%ebp),%ecx + movl %eax,0(%ecx) + movl %edx,4(%ecx) + jmp Lepilogue + +Lretstruct1b: + cmpl $FFI_TYPE_SINT8,%ecx + jne Lretstruct2b + /* Load %ecx with the pointer to storage for the return value */ + movl 24(%ebp),%ecx + movb %al,0(%ecx) + jmp Lepilogue + +Lretstruct2b: + cmpl $FFI_TYPE_SINT16,%ecx + jne Lretstruct + /* Load %ecx with the pointer to storage for the return value */ + movl 24(%ebp),%ecx + movw %ax,0(%ecx) + jmp Lepilogue + +Lretstruct: + cmpl $FFI_TYPE_STRUCT,%ecx + jne Lnoretval + /* Nothing to do! */ + addl $4,%esp + popl %ebp + ret + +Lnoretval: +Lepilogue: + addl $8,%esp + movl %ebp,%esp + popl %ebp + ret +LFE1: +.ffi_call_SYSV_end: + + .align 4 +FFI_HIDDEN (ffi_closure_SYSV) +.globl _ffi_closure_SYSV + +_ffi_closure_SYSV: +LFB2: + pushl %ebp +LCFI2: + movl %esp, %ebp +LCFI3: + subl $56, %esp + leal -40(%ebp), %edx + movl %edx, -12(%ebp) /* resp */ + leal 8(%ebp), %edx + movl %edx, 4(%esp) /* args = __builtin_dwarf_cfa () */ + leal -12(%ebp), %edx + movl %edx, (%esp) /* &resp */ + movl %ebx, 8(%esp) +LCFI7: + call L_ffi_closure_SYSV_inner$stub + movl 8(%esp), %ebx + movl -12(%ebp), %ecx + cmpl $FFI_TYPE_INT, %eax + je Lcls_retint + cmpl $FFI_TYPE_FLOAT, %eax + je Lcls_retfloat + cmpl $FFI_TYPE_DOUBLE, %eax + je Lcls_retdouble + cmpl $FFI_TYPE_LONGDOUBLE, %eax + je Lcls_retldouble + cmpl $FFI_TYPE_SINT64, %eax + je Lcls_retllong + cmpl $FFI_TYPE_UINT8, %eax + je Lcls_retstruct1 + cmpl $FFI_TYPE_SINT8, %eax + je Lcls_retstruct1 + cmpl $FFI_TYPE_UINT16, %eax + je Lcls_retstruct2 + cmpl $FFI_TYPE_SINT16, %eax + je Lcls_retstruct2 + cmpl $FFI_TYPE_STRUCT, %eax + je Lcls_retstruct +Lcls_epilogue: + movl %ebp, %esp + popl %ebp + ret +Lcls_retint: + movl (%ecx), %eax + jmp Lcls_epilogue +Lcls_retfloat: + flds (%ecx) + jmp Lcls_epilogue +Lcls_retdouble: + fldl (%ecx) + jmp Lcls_epilogue +Lcls_retldouble: + fldt (%ecx) + jmp Lcls_epilogue +Lcls_retllong: + movl (%ecx), %eax + movl 4(%ecx), %edx + jmp Lcls_epilogue +Lcls_retstruct1: + movsbl (%ecx), %eax + jmp Lcls_epilogue +Lcls_retstruct2: + movswl (%ecx), %eax + jmp Lcls_epilogue +Lcls_retstruct: + lea -8(%ebp),%esp + movl %ebp, %esp + popl %ebp + ret $4 +LFE2: + +#if !FFI_NO_RAW_API + +#define RAW_CLOSURE_CIF_OFFSET ((FFI_TRAMPOLINE_SIZE + 3) & ~3) +#define RAW_CLOSURE_FUN_OFFSET (RAW_CLOSURE_CIF_OFFSET + 4) +#define RAW_CLOSURE_USER_DATA_OFFSET (RAW_CLOSURE_FUN_OFFSET + 4) +#define CIF_FLAGS_OFFSET 20 + + .align 4 +FFI_HIDDEN (ffi_closure_raw_SYSV) +.globl _ffi_closure_raw_SYSV + +_ffi_closure_raw_SYSV: +LFB3: + pushl %ebp +LCFI4: + movl %esp, %ebp +LCFI5: + pushl %esi +LCFI6: + subl $36, %esp + movl RAW_CLOSURE_CIF_OFFSET(%eax), %esi /* closure->cif */ + movl RAW_CLOSURE_USER_DATA_OFFSET(%eax), %edx /* closure->user_data */ + movl %edx, 12(%esp) /* user_data */ + leal 8(%ebp), %edx /* __builtin_dwarf_cfa () */ + movl %edx, 8(%esp) /* raw_args */ + leal -24(%ebp), %edx + movl %edx, 4(%esp) /* &res */ + movl %esi, (%esp) /* cif */ + call *RAW_CLOSURE_FUN_OFFSET(%eax) /* closure->fun */ + movl CIF_FLAGS_OFFSET(%esi), %eax /* rtype */ + cmpl $FFI_TYPE_INT, %eax + je Lrcls_retint + cmpl $FFI_TYPE_FLOAT, %eax + je Lrcls_retfloat + cmpl $FFI_TYPE_DOUBLE, %eax + je Lrcls_retdouble + cmpl $FFI_TYPE_LONGDOUBLE, %eax + je Lrcls_retldouble + cmpl $FFI_TYPE_SINT64, %eax + je Lrcls_retllong +Lrcls_epilogue: + addl $36, %esp + popl %esi + popl %ebp + ret +Lrcls_retint: + movl -24(%ebp), %eax + jmp Lrcls_epilogue +Lrcls_retfloat: + flds -24(%ebp) + jmp Lrcls_epilogue +Lrcls_retdouble: + fldl -24(%ebp) + jmp Lrcls_epilogue +Lrcls_retldouble: + fldt -24(%ebp) + jmp Lrcls_epilogue +Lrcls_retllong: + movl -24(%ebp), %eax + movl -20(%ebp), %edx + jmp Lrcls_epilogue +LFE3: +#endif + +.section __IMPORT,__jump_table,symbol_stubs,self_modifying_code+pure_instructions,5 +L_ffi_closure_SYSV_inner$stub: + .indirect_symbol _ffi_closure_SYSV_inner + hlt ; hlt ; hlt ; hlt ; hlt + + +.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support +EH_frame1: + .set L$set$0,LECIE1-LSCIE1 + .long L$set$0 +LSCIE1: + .long 0x0 + .byte 0x1 + .ascii "zR\0" + .byte 0x1 + .byte 0x7c + .byte 0x8 + .byte 0x1 + .byte 0x10 + .byte 0xc + .byte 0x5 + .byte 0x4 + .byte 0x88 + .byte 0x1 + .align 2 +LECIE1: +.globl _ffi_call_SYSV.eh +_ffi_call_SYSV.eh: +LSFDE1: + .set L$set$1,LEFDE1-LASFDE1 + .long L$set$1 +LASFDE1: + .long LASFDE1-EH_frame1 + .long LFB1-. + .set L$set$2,LFE1-LFB1 + .long L$set$2 + .byte 0x0 + .byte 0x4 + .set L$set$3,LCFI0-LFB1 + .long L$set$3 + .byte 0xe + .byte 0x8 + .byte 0x84 + .byte 0x2 + .byte 0x4 + .set L$set$4,LCFI1-LCFI0 + .long L$set$4 + .byte 0xd + .byte 0x4 + .align 2 +LEFDE1: +.globl _ffi_closure_SYSV.eh +_ffi_closure_SYSV.eh: +LSFDE2: + .set L$set$5,LEFDE2-LASFDE2 + .long L$set$5 +LASFDE2: + .long LASFDE2-EH_frame1 + .long LFB2-. + .set L$set$6,LFE2-LFB2 + .long L$set$6 + .byte 0x0 + .byte 0x4 + .set L$set$7,LCFI2-LFB2 + .long L$set$7 + .byte 0xe + .byte 0x8 + .byte 0x84 + .byte 0x2 + .byte 0x4 + .set L$set$8,LCFI3-LCFI2 + .long L$set$8 + .byte 0xd + .byte 0x4 + .align 2 +LEFDE2: + +#if !FFI_NO_RAW_API + +.globl _ffi_closure_raw_SYSV.eh +_ffi_closure_raw_SYSV.eh: +LSFDE3: + .set L$set$10,LEFDE3-LASFDE3 + .long L$set$10 +LASFDE3: + .long LASFDE3-EH_frame1 + .long LFB3-. + .set L$set$11,LFE3-LFB3 + .long L$set$11 + .byte 0x0 + .byte 0x4 + .set L$set$12,LCFI4-LFB3 + .long L$set$12 + .byte 0xe + .byte 0x8 + .byte 0x84 + .byte 0x2 + .byte 0x4 + .set L$set$13,LCFI5-LCFI4 + .long L$set$13 + .byte 0xd + .byte 0x4 + .byte 0x4 + .set L$set$14,LCFI6-LCFI5 + .long L$set$14 + .byte 0x85 + .byte 0x3 + .align 2 +LEFDE3: + +#endif + +#endif /* ifndef __x86_64__ */ + +#endif /* defined __i386__ */ diff -r -u ./Modules/_ctypes/libffi_osx/x86/x86-ffi64.c ./Modules/_ctypes/libffi_osx/x86/x86-ffi64.c new file mode 100644 index 0000000..06feaf2 --- /dev/null +++ ./Modules/_ctypes/libffi_osx/x86/x86-ffi64.c @@ -0,0 +1,734 @@ +#ifdef __x86_64__ + +/* ----------------------------------------------------------------------- + x86-ffi64.c - Copyright (c) 2002 Bo Thorsen + + x86-64 Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#include +#include + +#include +#include + +#define MAX_GPR_REGS 6 +#define MAX_SSE_REGS 8 + +typedef struct RegisterArgs { + /* Registers for argument passing. */ + UINT64 gpr[MAX_GPR_REGS]; + __int128_t sse[MAX_SSE_REGS]; +} RegisterArgs; + +extern void +ffi_call_unix64( + void* args, + unsigned long bytes, + unsigned flags, + void* raddr, + void (*fnaddr)(), + unsigned ssecount); + +/* All reference to register classes here is identical to the code in + gcc/config/i386/i386.c. Do *not* change one without the other. */ + +/* Register class used for passing given 64bit part of the argument. + These represent classes as documented by the PS ABI, with the exception + of SSESF, SSEDF classes, that are basically SSE class, just gcc will + use SF or DFmode move instead of DImode to avoid reformating penalties. + + Similary we play games with INTEGERSI_CLASS to use cheaper SImode moves + whenever possible (upper half does contain padding). */ +enum x86_64_reg_class +{ + X86_64_NO_CLASS, + X86_64_INTEGER_CLASS, + X86_64_INTEGERSI_CLASS, + X86_64_SSE_CLASS, + X86_64_SSESF_CLASS, + X86_64_SSEDF_CLASS, + X86_64_SSEUP_CLASS, + X86_64_X87_CLASS, + X86_64_X87UP_CLASS, + X86_64_COMPLEX_X87_CLASS, + X86_64_MEMORY_CLASS +}; + +#define MAX_CLASSES 4 +#define SSE_CLASS_P(X) ((X) >= X86_64_SSE_CLASS && X <= X86_64_SSEUP_CLASS) + +/* x86-64 register passing implementation. See x86-64 ABI for details. Goal + of this code is to classify each 8bytes of incoming argument by the register + class and assign registers accordingly. */ + +/* Return the union class of CLASS1 and CLASS2. + See the x86-64 PS ABI for details. */ +static enum x86_64_reg_class +merge_classes( + enum x86_64_reg_class class1, + enum x86_64_reg_class class2) +{ + /* Rule #1: If both classes are equal, this is the resulting class. */ + if (class1 == class2) + return class1; + + /* Rule #2: If one of the classes is NO_CLASS, the resulting class is + the other class. */ + if (class1 == X86_64_NO_CLASS) + return class2; + + if (class2 == X86_64_NO_CLASS) + return class1; + + /* Rule #3: If one of the classes is MEMORY, the result is MEMORY. */ + if (class1 == X86_64_MEMORY_CLASS || class2 == X86_64_MEMORY_CLASS) + return X86_64_MEMORY_CLASS; + + /* Rule #4: If one of the classes is INTEGER, the result is INTEGER. */ + if ((class1 == X86_64_INTEGERSI_CLASS && class2 == X86_64_SSESF_CLASS) + || (class2 == X86_64_INTEGERSI_CLASS && class1 == X86_64_SSESF_CLASS)) + return X86_64_INTEGERSI_CLASS; + + if (class1 == X86_64_INTEGER_CLASS || class1 == X86_64_INTEGERSI_CLASS + || class2 == X86_64_INTEGER_CLASS || class2 == X86_64_INTEGERSI_CLASS) + return X86_64_INTEGER_CLASS; + + /* Rule #5: If one of the classes is X87, X87UP, or COMPLEX_X87 class, + MEMORY is used. */ + if (class1 == X86_64_X87_CLASS + || class1 == X86_64_X87UP_CLASS + || class1 == X86_64_COMPLEX_X87_CLASS + || class2 == X86_64_X87_CLASS + || class2 == X86_64_X87UP_CLASS + || class2 == X86_64_COMPLEX_X87_CLASS) + return X86_64_MEMORY_CLASS; + + /* Rule #6: Otherwise class SSE is used. */ + return X86_64_SSE_CLASS; +} + +/* Classify the argument of type TYPE and mode MODE. + CLASSES will be filled by the register class used to pass each word + of the operand. The number of words is returned. In case the parameter + should be passed in memory, 0 is returned. As a special case for zero + sized containers, classes[0] will be NO_CLASS and 1 is returned. + + See the x86-64 PS ABI for details. */ + +static int +classify_argument( + ffi_type* type, + enum x86_64_reg_class classes[], + size_t byte_offset) +{ + switch (type->type) + { + case FFI_TYPE_UINT8: + case FFI_TYPE_SINT8: + case FFI_TYPE_UINT16: + case FFI_TYPE_SINT16: + case FFI_TYPE_UINT32: + case FFI_TYPE_SINT32: + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + case FFI_TYPE_POINTER: +#if 0 + if (byte_offset + type->size <= 4) + classes[0] = X86_64_INTEGERSI_CLASS; + else + classes[0] = X86_64_INTEGER_CLASS; + + return 1; +#else + { + int size = byte_offset + type->size; + + if (size <= 4) + { + classes[0] = X86_64_INTEGERSI_CLASS; + return 1; + } + else if (size <= 8) + { + classes[0] = X86_64_INTEGER_CLASS; + return 1; + } + else if (size <= 12) + { + classes[0] = X86_64_INTEGER_CLASS; + classes[1] = X86_64_INTEGERSI_CLASS; + return 2; + } + else if (size <= 16) + { + classes[0] = classes[1] = X86_64_INTEGERSI_CLASS; + return 2; + } + else + FFI_ASSERT (0); + } +#endif + + case FFI_TYPE_FLOAT: + if (byte_offset == 0) + classes[0] = X86_64_SSESF_CLASS; + else + classes[0] = X86_64_SSE_CLASS; + + return 1; + + case FFI_TYPE_DOUBLE: + classes[0] = X86_64_SSEDF_CLASS; + return 1; + + case FFI_TYPE_LONGDOUBLE: + classes[0] = X86_64_X87_CLASS; + classes[1] = X86_64_X87UP_CLASS; + return 2; + + case FFI_TYPE_STRUCT: + { + ffi_type** ptr; + int i; + enum x86_64_reg_class subclasses[MAX_CLASSES]; + const int UNITS_PER_WORD = 8; + int words = + (type->size + UNITS_PER_WORD - 1) / UNITS_PER_WORD; + + /* If the struct is larger than 16 bytes, pass it on the stack. */ + if (type->size > 16) + return 0; + + for (i = 0; i < words; i++) + classes[i] = X86_64_NO_CLASS; + + /* Merge the fields of structure. */ + for (ptr = type->elements; *ptr != NULL; ptr++) + { + byte_offset = ALIGN(byte_offset, (*ptr)->alignment); + + int num = classify_argument(*ptr, subclasses, byte_offset % 8); + + if (num == 0) + return 0; + + int pos = byte_offset / 8; + + for (i = 0; i < num; i++) + { + classes[i + pos] = + merge_classes(subclasses[i], classes[i + pos]); + } + + byte_offset += (*ptr)->size; + } + + if (words > 2) + { + /* When size > 16 bytes, if the first one isn't + X86_64_SSE_CLASS or any other ones aren't + X86_64_SSEUP_CLASS, everything should be passed in + memory. */ + if (classes[0] != X86_64_SSE_CLASS) + return 0; + + for (i = 1; i < words; i++) + if (classes[i] != X86_64_SSEUP_CLASS) + return 0; + } + + + /* Final merger cleanup. */ + for (i = 0; i < words; i++) + { + /* If one class is MEMORY, everything should be passed in + memory. */ + if (classes[i] == X86_64_MEMORY_CLASS) + return 0; + + /* The X86_64_SSEUP_CLASS should be always preceded by + X86_64_SSE_CLASS. */ + if (classes[i] == X86_64_SSEUP_CLASS + && classes[i - 1] != X86_64_SSE_CLASS + && classes[i - 1] != X86_64_SSEUP_CLASS) + { + FFI_ASSERT(i != 0); + classes[i] = X86_64_SSE_CLASS; + } + + /* X86_64_X87UP_CLASS should be preceded by X86_64_X87_CLASS. */ + if (classes[i] == X86_64_X87UP_CLASS + && classes[i - 1] != X86_64_X87_CLASS) + { + FFI_ASSERT(i != 0); + classes[i] = X86_64_SSE_CLASS; + } + } + + return words; + } + + default: + FFI_ASSERT(0); + } + + return 0; /* Never reached. */ +} + +/* Examine the argument and return set number of register required in each + class. Return zero if parameter should be passed in memory, otherwise + the number of registers. */ +static int +examine_argument( + ffi_type* type, + enum x86_64_reg_class classes[MAX_CLASSES], + _Bool in_return, + int* pngpr, + int* pnsse) +{ + int n = classify_argument(type, classes, 0); + int ngpr = 0; + int nsse = 0; + int i; + + if (n == 0) + return 0; + + for (i = 0; i < n; ++i) + { + switch (classes[i]) + { + case X86_64_INTEGER_CLASS: + case X86_64_INTEGERSI_CLASS: + ngpr++; + break; + + case X86_64_SSE_CLASS: + case X86_64_SSESF_CLASS: + case X86_64_SSEDF_CLASS: + nsse++; + break; + + case X86_64_NO_CLASS: + case X86_64_SSEUP_CLASS: + break; + + case X86_64_X87_CLASS: + case X86_64_X87UP_CLASS: + case X86_64_COMPLEX_X87_CLASS: + return in_return != 0; + + default: + abort(); + } + } + + *pngpr = ngpr; + *pnsse = nsse; + + return n; +} + +/* Perform machine dependent cif processing. */ +ffi_status +ffi_prep_cif_machdep( + ffi_cif* cif) +{ + int gprcount = 0; + int ssecount = 0; + int flags = cif->rtype->type; + int i, avn, n, ngpr, nsse; + enum x86_64_reg_class classes[MAX_CLASSES]; + size_t bytes; + + if (flags != FFI_TYPE_VOID) + { + n = examine_argument (cif->rtype, classes, 1, &ngpr, &nsse); + + if (n == 0) + { + /* The return value is passed in memory. A pointer to that + memory is the first argument. Allocate a register for it. */ + gprcount++; + + /* We don't have to do anything in asm for the return. */ + flags = FFI_TYPE_VOID; + } + else if (flags == FFI_TYPE_STRUCT) + { + /* Mark which registers the result appears in. */ + _Bool sse0 = SSE_CLASS_P(classes[0]); + _Bool sse1 = n == 2 && SSE_CLASS_P(classes[1]); + + if (sse0 && !sse1) + flags |= 1 << 8; + else if (!sse0 && sse1) + flags |= 1 << 9; + else if (sse0 && sse1) + flags |= 1 << 10; + + /* Mark the true size of the structure. */ + flags |= cif->rtype->size << 12; + } + } + + /* Go over all arguments and determine the way they should be passed. + If it's in a register and there is space for it, let that be so. If + not, add it's size to the stack byte count. */ + for (bytes = 0, i = 0, avn = cif->nargs; i < avn; i++) + { + if (examine_argument(cif->arg_types[i], classes, 0, &ngpr, &nsse) == 0 + || gprcount + ngpr > MAX_GPR_REGS + || ssecount + nsse > MAX_SSE_REGS) + { + long align = cif->arg_types[i]->alignment; + + if (align < 8) + align = 8; + + bytes = ALIGN(bytes, align); + bytes += cif->arg_types[i]->size; + } + else + { + gprcount += ngpr; + ssecount += nsse; + } + } + + if (ssecount) + flags |= 1 << 11; + + cif->flags = flags; + cif->bytes = bytes; + cif->bytes = ALIGN(bytes,8); + + return FFI_OK; +} + +void +ffi_call( + ffi_cif* cif, + void (*fn)(), + void* rvalue, + void** avalue) +{ + enum x86_64_reg_class classes[MAX_CLASSES]; + char* stack; + char* argp; + ffi_type** arg_types; + int gprcount, ssecount, ngpr, nsse, i, avn; + _Bool ret_in_memory; + RegisterArgs* reg_args; + + /* Can't call 32-bit mode from 64-bit mode. */ + FFI_ASSERT(cif->abi == FFI_UNIX64); + + /* If the return value is a struct and we don't have a return value + address then we need to make one. Note the setting of flags to + VOID above in ffi_prep_cif_machdep. */ + ret_in_memory = (cif->rtype->type == FFI_TYPE_STRUCT + && (cif->flags & 0xff) == FFI_TYPE_VOID); + + if (rvalue == NULL && ret_in_memory) + rvalue = alloca (cif->rtype->size); + + /* Allocate the space for the arguments, plus 4 words of temp space. */ + stack = alloca(sizeof(RegisterArgs) + cif->bytes + 4 * 8); + reg_args = (RegisterArgs*)stack; + argp = stack + sizeof(RegisterArgs); + + gprcount = ssecount = 0; + + /* If the return value is passed in memory, add the pointer as the + first integer argument. */ + if (ret_in_memory) + reg_args->gpr[gprcount++] = (long) rvalue; + + avn = cif->nargs; + arg_types = cif->arg_types; + + for (i = 0; i < avn; ++i) + { + size_t size = arg_types[i]->size; + int n; + + n = examine_argument (arg_types[i], classes, 0, &ngpr, &nsse); + + if (n == 0 + || gprcount + ngpr > MAX_GPR_REGS + || ssecount + nsse > MAX_SSE_REGS) + { + long align = arg_types[i]->alignment; + + /* Stack arguments are *always* at least 8 byte aligned. */ + if (align < 8) + align = 8; + + /* Pass this argument in memory. */ + argp = (void *) ALIGN (argp, align); + memcpy (argp, avalue[i], size); + argp += size; + } + else + { /* The argument is passed entirely in registers. */ + char *a = (char *) avalue[i]; + int j; + + for (j = 0; j < n; j++, a += 8, size -= 8) + { + switch (classes[j]) + { + case X86_64_INTEGER_CLASS: + case X86_64_INTEGERSI_CLASS: + reg_args->gpr[gprcount] = 0; + switch (arg_types[i]->type) { + case FFI_TYPE_SINT8: + { + int8_t shortval = *(int8_t*)a; + int64_t actval = (int64_t)shortval; + reg_args->gpr[gprcount] = actval; + /*memcpy (®_args->gpr[gprcount], &actval, 8);*/ + break; + } + + case FFI_TYPE_SINT16: + { + int16_t shortval = *(int16_t*)a; + int64_t actval = (int64_t)shortval; + memcpy (®_args->gpr[gprcount], &actval, 8); + break; + } + + case FFI_TYPE_SINT32: + { + int32_t shortval = *(int32_t*)a; + int64_t actval = (int64_t)shortval; + memcpy (®_args->gpr[gprcount], &actval, 8); + break; + } + + case FFI_TYPE_UINT8: + { + u_int8_t shortval = *(u_int8_t*)a; + u_int64_t actval = (u_int64_t)shortval; + /*memcpy (®_args->gpr[gprcount], &actval, 8);*/ + reg_args->gpr[gprcount] = actval; + break; + } + + case FFI_TYPE_UINT16: + { + u_int16_t shortval = *(u_int16_t*)a; + u_int64_t actval = (u_int64_t)shortval; + memcpy (®_args->gpr[gprcount], &actval, 8); + break; + } + + case FFI_TYPE_UINT32: + { + u_int32_t shortval = *(u_int32_t*)a; + u_int64_t actval = (u_int64_t)shortval; + memcpy (®_args->gpr[gprcount], &actval, 8); + break; + } + + default: + //memcpy (®_args->gpr[gprcount], a, size < 8 ? size : 8); + reg_args->gpr[gprcount] = *(int64_t*)a; + } + gprcount++; + break; + + case X86_64_SSE_CLASS: + case X86_64_SSEDF_CLASS: + reg_args->sse[ssecount++] = *(UINT64 *) a; + break; + + case X86_64_SSESF_CLASS: + reg_args->sse[ssecount++] = *(UINT32 *) a; + break; + + default: + abort(); + } + } + } + } + + ffi_call_unix64 (stack, cif->bytes + sizeof(RegisterArgs), + cif->flags, rvalue, fn, ssecount); +} + +extern void ffi_closure_unix64(void); + +ffi_status +ffi_prep_closure( + ffi_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif*, void*, void**, void*), + void* user_data) +{ + if (cif->abi != FFI_UNIX64) + return FFI_BAD_ABI; + + volatile unsigned short* tramp = + (volatile unsigned short*)&closure->tramp[0]; + + tramp[0] = 0xbb49; /* mov , %r11 */ + *(void* volatile*)&tramp[1] = ffi_closure_unix64; + tramp[5] = 0xba49; /* mov , %r10 */ + *(void* volatile*)&tramp[6] = closure; + + /* Set the carry bit if the function uses any sse registers. + This is clc or stc, together with the first byte of the jmp. */ + tramp[10] = cif->flags & (1 << 11) ? 0x49f9 : 0x49f8; + tramp[11] = 0xe3ff; /* jmp *%r11 */ + + closure->cif = cif; + closure->fun = fun; + closure->user_data = user_data; + + return FFI_OK; +} + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wmissing-prototypes" +int +ffi_closure_unix64_inner( + ffi_closure* closure, + void* rvalue, + RegisterArgs* reg_args, + char* argp) +#pragma clang diagnostic pop +{ + ffi_cif* cif = closure->cif; + void** avalue = alloca(cif->nargs * sizeof(void *)); + ffi_type** arg_types; + long i, avn; + int gprcount = 0; + int ssecount = 0; + int ngpr, nsse; + int ret; + + ret = cif->rtype->type; + + if (ret != FFI_TYPE_VOID) + { + enum x86_64_reg_class classes[MAX_CLASSES]; + int n = examine_argument (cif->rtype, classes, 1, &ngpr, &nsse); + + if (n == 0) + { + /* The return value goes in memory. Arrange for the closure + return value to go directly back to the original caller. */ + rvalue = (void *) reg_args->gpr[gprcount++]; + + /* We don't have to do anything in asm for the return. */ + ret = FFI_TYPE_VOID; + } + else if (ret == FFI_TYPE_STRUCT && n == 2) + { + /* Mark which register the second word of the structure goes in. */ + _Bool sse0 = SSE_CLASS_P (classes[0]); + _Bool sse1 = SSE_CLASS_P (classes[1]); + + if (!sse0 && sse1) + ret |= 1 << 8; + else if (sse0 && !sse1) + ret |= 1 << 9; + } + } + + avn = cif->nargs; + arg_types = cif->arg_types; + + for (i = 0; i < avn; ++i) + { + enum x86_64_reg_class classes[MAX_CLASSES]; + int n; + + n = examine_argument (arg_types[i], classes, 0, &ngpr, &nsse); + + if (n == 0 + || gprcount + ngpr > MAX_GPR_REGS + || ssecount + nsse > MAX_SSE_REGS) + { + long align = arg_types[i]->alignment; + + /* Stack arguments are *always* at least 8 byte aligned. */ + if (align < 8) + align = 8; + + /* Pass this argument in memory. */ + argp = (void *) ALIGN (argp, align); + avalue[i] = argp; + argp += arg_types[i]->size; + } + +#if !defined(X86_DARWIN) + /* If the argument is in a single register, or two consecutive + registers, then we can use that address directly. */ + else if (n == 1 || (n == 2 && + SSE_CLASS_P (classes[0]) == SSE_CLASS_P (classes[1]))) + { + // The argument is in a single register. + if (SSE_CLASS_P (classes[0])) + { + avalue[i] = ®_args->sse[ssecount]; + ssecount += n; + } + else + { + avalue[i] = ®_args->gpr[gprcount]; + gprcount += n; + } + } +#endif + + /* Otherwise, allocate space to make them consecutive. */ + else + { + char *a = alloca (16); + int j; + + avalue[i] = a; + + for (j = 0; j < n; j++, a += 8) + { + if (SSE_CLASS_P (classes[j])) + memcpy (a, ®_args->sse[ssecount++], 8); + else + memcpy (a, ®_args->gpr[gprcount++], 8); + } + } + } + + /* Invoke the closure. */ + closure->fun (cif, rvalue, avalue, closure->user_data); + + /* Tell assembly how to perform return type promotions. */ + return ret; +} + +#endif /* __x86_64__ */ diff -r -u ./Modules/_ctypes/libffi_osx/x86/x86-ffi_darwin.c ./Modules/_ctypes/libffi_osx/x86/x86-ffi_darwin.c new file mode 100644 index 0000000..706ea0f --- /dev/null +++ ./Modules/_ctypes/libffi_osx/x86/x86-ffi_darwin.c @@ -0,0 +1,438 @@ +#ifdef __i386__ +/* ----------------------------------------------------------------------- + ffi.c - Copyright (c) 1996, 1998, 1999, 2001 Red Hat, Inc. + Copyright (c) 2002 Ranjit Mathew + Copyright (c) 2002 Bo Thorsen + Copyright (c) 2002 Roger Sayle + + x86 Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#include +#include + +#include + +/* ffi_prep_args is called by the assembly routine once stack space + has been allocated for the function's arguments */ + +void ffi_prep_args(char *stack, extended_cif *ecif); + +void ffi_prep_args(char *stack, extended_cif *ecif) +{ + register unsigned int i; + register void **p_argv; + register char *argp; + register ffi_type **p_arg; + + argp = stack; + + if (ecif->cif->flags == FFI_TYPE_STRUCT) + { + *(void **) argp = ecif->rvalue; + argp += 4; + } + + p_argv = ecif->avalue; + + for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; + i != 0; + i--, p_arg++) + { + size_t z; + + /* Align if necessary */ + if ((sizeof(int) - 1) & (unsigned) argp) + argp = (char *) ALIGN(argp, sizeof(int)); + + z = (*p_arg)->size; + if (z < sizeof(int)) + { + z = sizeof(int); + switch ((*p_arg)->type) + { + case FFI_TYPE_SINT8: + *(signed int *) argp = (signed int)*(SINT8 *)(* p_argv); + break; + + case FFI_TYPE_UINT8: + *(unsigned int *) argp = (unsigned int)*(UINT8 *)(* p_argv); + break; + + case FFI_TYPE_SINT16: + *(signed int *) argp = (signed int)*(SINT16 *)(* p_argv); + break; + + case FFI_TYPE_UINT16: + *(unsigned int *) argp = (unsigned int)*(UINT16 *)(* p_argv); + break; + + case FFI_TYPE_SINT32: + *(signed int *) argp = (signed int)*(SINT32 *)(* p_argv); + break; + + case FFI_TYPE_UINT32: + *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv); + break; + + case FFI_TYPE_STRUCT: + *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv); + break; + + default: + FFI_ASSERT(0); + } + } + else + { + memcpy(argp, *p_argv, z); + } + p_argv++; + argp += z; + } + + return; +} + +/* Perform machine dependent cif processing */ +ffi_status ffi_prep_cif_machdep(ffi_cif *cif) +{ + /* Set the return type flag */ + switch (cif->rtype->type) + { + case FFI_TYPE_VOID: +#ifdef X86 + case FFI_TYPE_STRUCT: + case FFI_TYPE_UINT8: + case FFI_TYPE_UINT16: + case FFI_TYPE_SINT8: + case FFI_TYPE_SINT16: +#endif + + case FFI_TYPE_SINT64: + case FFI_TYPE_FLOAT: + case FFI_TYPE_DOUBLE: + case FFI_TYPE_LONGDOUBLE: + cif->flags = (unsigned) cif->rtype->type; + break; + + case FFI_TYPE_UINT64: + cif->flags = FFI_TYPE_SINT64; + break; + +#ifndef X86 + case FFI_TYPE_STRUCT: + if (cif->rtype->size == 1) + { + cif->flags = FFI_TYPE_SINT8; /* same as char size */ + } + else if (cif->rtype->size == 2) + { + cif->flags = FFI_TYPE_SINT16; /* same as short size */ + } + else if (cif->rtype->size == 4) + { + cif->flags = FFI_TYPE_INT; /* same as int type */ + } + else if (cif->rtype->size == 8) + { + cif->flags = FFI_TYPE_SINT64; /* same as int64 type */ + } + else + { + cif->flags = FFI_TYPE_STRUCT; + } + break; +#endif + + default: + cif->flags = FFI_TYPE_INT; + break; + } + +#ifdef X86_DARWIN + cif->bytes = (cif->bytes + 15) & ~0xF; +#endif + + return FFI_OK; +} + +extern void ffi_call_SYSV(void (*)(char *, extended_cif *), extended_cif *, + unsigned, unsigned, unsigned *, void (*fn)()); + +#ifdef X86_WIN32 +extern void ffi_call_STDCALL(void (*)(char *, extended_cif *), extended_cif *, + unsigned, unsigned, unsigned *, void (*fn)()); + +#endif /* X86_WIN32 */ + +void ffi_call(ffi_cif *cif, void (*fn)(), void *rvalue, void **avalue) +{ + extended_cif ecif; + + ecif.cif = cif; + ecif.avalue = avalue; + + /* If the return value is a struct and we don't have a return */ + /* value address then we need to make one */ + + if ((rvalue == NULL) && + (cif->flags == FFI_TYPE_STRUCT)) + { + ecif.rvalue = alloca(cif->rtype->size); + } + else + ecif.rvalue = rvalue; + + + switch (cif->abi) + { + case FFI_SYSV: + ffi_call_SYSV(ffi_prep_args, &ecif, cif->bytes, cif->flags, ecif.rvalue, + fn); + break; +#ifdef X86_WIN32 + case FFI_STDCALL: + ffi_call_STDCALL(ffi_prep_args, &ecif, cif->bytes, cif->flags, + ecif.rvalue, fn); + break; +#endif /* X86_WIN32 */ + default: + FFI_ASSERT(0); + break; + } +} + + +/** private members **/ + +static void ffi_prep_incoming_args_SYSV (char *stack, void **ret, + void** args, ffi_cif* cif); +void FFI_HIDDEN ffi_closure_SYSV (ffi_closure *) +__attribute__ ((regparm(1))); +unsigned int FFI_HIDDEN ffi_closure_SYSV_inner (ffi_closure *, void **, void *) +__attribute__ ((regparm(1))); +void FFI_HIDDEN ffi_closure_raw_SYSV (ffi_raw_closure *) +__attribute__ ((regparm(1))); + +/* This function is jumped to by the trampoline */ + +unsigned int FFI_HIDDEN +ffi_closure_SYSV_inner (closure, respp, args) +ffi_closure *closure; +void **respp; +void *args; +{ + // our various things... + ffi_cif *cif; + void **arg_area; + + cif = closure->cif; + arg_area = (void**) alloca (cif->nargs * sizeof (void*)); + + /* this call will initialize ARG_AREA, such that each + * element in that array points to the corresponding + * value on the stack; and if the function returns + * a structure, it will re-set RESP to point to the + * structure return address. */ + + ffi_prep_incoming_args_SYSV(args, respp, arg_area, cif); + + (closure->fun) (cif, *respp, arg_area, closure->user_data); + + return cif->flags; +} + +static void +ffi_prep_incoming_args_SYSV(char *stack, void **rvalue, void **avalue, + ffi_cif *cif) +{ + register unsigned int i; + register void **p_argv; + register char *argp; + register ffi_type **p_arg; + + argp = stack; + + if ( cif->flags == FFI_TYPE_STRUCT ) { + *rvalue = *(void **) argp; + argp += 4; + } + + p_argv = avalue; + + for (i = cif->nargs, p_arg = cif->arg_types; (i != 0); i--, p_arg++) + { + size_t z; + + /* Align if necessary */ + if ((sizeof(int) - 1) & (unsigned) argp) { + argp = (char *) ALIGN(argp, sizeof(int)); + } + + z = (*p_arg)->size; + + /* because we're little endian, this is what it turns into. */ + + *p_argv = (void*) argp; + + p_argv++; + argp += z; + } + + return; +} + +/* How to make a trampoline. Derived from gcc/config/i386/i386.c. */ + +#define FFI_INIT_TRAMPOLINE(TRAMP,FUN,CTX) \ +({ unsigned char *__tramp = (unsigned char*)(TRAMP); \ +unsigned int __fun = (unsigned int)(FUN); \ +unsigned int __ctx = (unsigned int)(CTX); \ +unsigned int __dis = __fun - (__ctx + FFI_TRAMPOLINE_SIZE); \ +*(unsigned char*) &__tramp[0] = 0xb8; \ +*(unsigned int*) &__tramp[1] = __ctx; /* movl __ctx, %eax */ \ +*(unsigned char *) &__tramp[5] = 0xe9; \ +*(unsigned int*) &__tramp[6] = __dis; /* jmp __fun */ \ +}) + + +/* the cif must already be prep'ed */ +ffi_status +ffi_prep_closure (ffi_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif*,void*,void**,void*), + void *user_data) +{ + if (cif->abi != FFI_SYSV) + return FFI_BAD_ABI; + + FFI_INIT_TRAMPOLINE (&closure->tramp[0], \ + &ffi_closure_SYSV, \ + (void*)closure); + + closure->cif = cif; + closure->user_data = user_data; + closure->fun = fun; + + return FFI_OK; +} + +/* ------- Native raw API support -------------------------------- */ + +#if !FFI_NO_RAW_API + +ffi_status +ffi_prep_raw_closure_loc (ffi_raw_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif*,void*,ffi_raw*,void*), + void *user_data, + void *codeloc) +{ + int i; + + FFI_ASSERT (cif->abi == FFI_SYSV); + + // we currently don't support certain kinds of arguments for raw + // closures. This should be implemented by a separate assembly language + // routine, since it would require argument processing, something we + // don't do now for performance. + + for (i = cif->nargs-1; i >= 0; i--) + { + FFI_ASSERT (cif->arg_types[i]->type != FFI_TYPE_STRUCT); + FFI_ASSERT (cif->arg_types[i]->type != FFI_TYPE_LONGDOUBLE); + } + + + FFI_INIT_TRAMPOLINE (&closure->tramp[0], &ffi_closure_raw_SYSV, + codeloc); + + closure->cif = cif; + closure->user_data = user_data; + closure->fun = fun; + + return FFI_OK; +} + +static void +ffi_prep_args_raw(char *stack, extended_cif *ecif) +{ + memcpy (stack, ecif->avalue, ecif->cif->bytes); +} + +/* we borrow this routine from libffi (it must be changed, though, to + * actually call the function passed in the first argument. as of + * libffi-1.20, this is not the case.) + */ + +extern void +ffi_call_SYSV(void (*)(char *, extended_cif *), extended_cif *, unsigned, + unsigned, unsigned *, void (*fn)()); + +#ifdef X86_WIN32 +extern void +ffi_call_STDCALL(void (*)(char *, extended_cif *), extended_cif *, unsigned, + unsigned, unsigned *, void (*fn)()); +#endif /* X86_WIN32 */ + +void +ffi_raw_call(ffi_cif *cif, void (*fn)(), void *rvalue, ffi_raw *fake_avalue) +{ + extended_cif ecif; + void **avalue = (void **)fake_avalue; + + ecif.cif = cif; + ecif.avalue = avalue; + + /* If the return value is a struct and we don't have a return */ + /* value address then we need to make one */ + + if ((rvalue == NULL) && + (cif->rtype->type == FFI_TYPE_STRUCT)) + { + ecif.rvalue = alloca(cif->rtype->size); + } + else + ecif.rvalue = rvalue; + + + switch (cif->abi) + { + case FFI_SYSV: + ffi_call_SYSV(ffi_prep_args_raw, &ecif, cif->bytes, cif->flags, + ecif.rvalue, fn); + break; +#ifdef X86_WIN32 + case FFI_STDCALL: + ffi_call_STDCALL(ffi_prep_args_raw, &ecif, cif->bytes, cif->flags, + ecif.rvalue, fn); + break; +#endif /* X86_WIN32 */ + default: + FFI_ASSERT(0); + break; + } +} + +#endif +#endif // __i386__ diff -r -u ./setup.py ./setup.py index 46b92fe..2bf6b4b 100644 --- ./setup.py +++ ./setup.py @@ -98,8 +98,14 @@ class PyBuildExt(build_ext): self.detect_modules() # Remove modules that are present on the disabled list - self.extensions = [ext for ext in self.extensions - if ext.name not in disabled_module_list] + extensions = [ext for ext in self.extensions + if ext.name not in disabled_module_list] + # move ctypes to the end, it depends on other modules + ext_map = dict((ext.name, i) for i, ext in enumerate(extensions)) + if "_ctypes" in ext_map: + ctypes = extensions.pop(ext_map["_ctypes"]) + extensions.append(ctypes) + self.extensions = extensions # Fix up the autodetected modules, prefixing all the source files # with Modules/ and adding Python's include directory to the path. @@ -1330,9 +1336,39 @@ class PyBuildExt(build_ext): # *** Uncomment these for TOGL extension only: # -lGL -lGLU -lXext -lXmu \ + def configure_ctypes_darwin(self, ext): + # Darwin (OS X) uses preconfigured files, in + # the Modules/_ctypes/libffi_osx directory. + srcdir = sysconfig.get_config_var('srcdir') + ffi_srcdir = os.path.abspath(os.path.join(srcdir, 'Modules', + '_ctypes', 'libffi_osx')) + sources = [os.path.join(ffi_srcdir, p) + for p in ['ffi.c', + 'x86/darwin64.S', + 'x86/x86-darwin.S', + 'x86/x86-ffi_darwin.c', + 'x86/x86-ffi64.c', + 'powerpc/ppc-darwin.S', + 'powerpc/ppc-darwin_closure.S', + 'powerpc/ppc-ffi_darwin.c', + 'powerpc/ppc64-darwin_closure.S', + ]] + + # Add .S (preprocessed assembly) to C compiler source extensions. + self.compiler.src_extensions.append('.S') + + include_dirs = [os.path.join(ffi_srcdir, 'include'), + os.path.join(ffi_srcdir, 'powerpc')] + ext.include_dirs.extend(include_dirs) + ext.sources.extend(sources) + return True + def configure_ctypes(self, ext): if not self.use_system_libffi: - (srcdir,) = sysconfig.get_config_vars('srcdir') + if sys.platform == 'darwin': + return self.configure_ctypes_darwin(ext) + + srcdir = sysconfig.get_config_var('srcdir') ffi_builddir = os.path.join(self.build_temp, 'libffi') ffi_srcdir = os.path.abspath(os.path.join(srcdir, 'Modules', '_ctypes', 'libffi')) @@ -1347,7 +1383,10 @@ class PyBuildExt(build_ext): ffi_configfile): from distutils.dir_util import mkpath mkpath(ffi_builddir) - config_args = [] + config_args = [arg for arg in sysconfig.get_config_var("CONFIG_ARGS").split() + if (('--host=' in arg) or ('--build=' in arg))] + if not self.verbose: + config_args.append("-q") # Pass empty CFLAGS because we'll just append the resulting # CFLAGS to Python's; -g or -O2 is to be avoided. @@ -1367,10 +1406,12 @@ class PyBuildExt(build_ext): self.compiler.src_extensions.append('.S') include_dirs = [os.path.join(ffi_builddir, 'include'), - ffi_builddir, ffi_srcdir] + ffi_builddir, + os.path.join(ffi_srcdir, 'src')] extra_compile_args = fficonfig['ffi_cflags'].split() - ext.sources.extend(fficonfig['ffi_sources']) + ext.sources.extend(os.path.join(ffi_srcdir, f) for f in + fficonfig['ffi_sources']) ext.include_dirs.extend(include_dirs) ext.extra_compile_args.extend(extra_compile_args) return True @@ -1390,6 +1431,7 @@ class PyBuildExt(build_ext): if sys.platform == 'darwin': sources.append('_ctypes/darwin/dlfcn_simple.c') + extra_compile_args.append('-DMACOSX') include_dirs.append('_ctypes/darwin') # XXX Is this still needed? ## extra_link_args.extend(['-read_only_relocs', 'warning']) @@ -1419,7 +1461,14 @@ class PyBuildExt(build_ext): if not '--with-system-ffi' in sysconfig.get_config_var("CONFIG_ARGS"): return - ffi_inc = find_file('ffi.h', [], inc_dirs) + if sys.platform == 'darwin': + # OS X 10.5 comes with libffi.dylib; the include files are + # in /usr/include/ffi + inc_dirs.append('/usr/include/ffi') + + ffi_inc = [sysconfig.get_config_var("LIBFFI_INCLUDEDIR")] + if not ffi_inc or ffi_inc[0] == '': + ffi_inc = find_file('ffi.h', [], inc_dirs) if ffi_inc is not None: ffi_h = ffi_inc[0] + '/ffi.h' fp = open(ffi_h) 005_osx_failed_modules.patch000066400000000000000000000076331517431316200351740ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.5.0/Python-2.5diff -r -u ./Mac/Modules/cg/_CGmodule.c ./Mac/Modules/cg/_CGmodule.c index 8115614..e36fce9 100755 --- ./Mac/Modules/cg/_CGmodule.c +++ ./Mac/Modules/cg/_CGmodule.c @@ -1025,6 +1025,7 @@ static PyObject *CGContextRefObj_CGContextSetShouldAntialias(CGContextRefObject return _res; } +#ifndef __LP64__ static PyObject *CGContextRefObj_SyncCGContextOriginWithPort(CGContextRefObject *_self, PyObject *_args) { PyObject *_res = NULL; @@ -1055,6 +1056,7 @@ static PyObject *CGContextRefObj_ClipCGContextToRegion(CGContextRefObject *_self _res = Py_None; return _res; } +#endif static PyMethodDef CGContextRefObj_methods[] = { {"CGContextSaveGState", (PyCFunction)CGContextRefObj_CGContextSaveGState, 1, @@ -1173,10 +1175,12 @@ static PyMethodDef CGContextRefObj_methods[] = { PyDoc_STR("() -> None")}, {"CGContextSetShouldAntialias", (PyCFunction)CGContextRefObj_CGContextSetShouldAntialias, 1, PyDoc_STR("(int shouldAntialias) -> None")}, +#ifndef __LP64__ {"SyncCGContextOriginWithPort", (PyCFunction)CGContextRefObj_SyncCGContextOriginWithPort, 1, PyDoc_STR("(CGrafPtr port) -> None")}, {"ClipCGContextToRegion", (PyCFunction)CGContextRefObj_ClipCGContextToRegion, 1, PyDoc_STR("(Rect portRect, RgnHandle region) -> None")}, +#endif {NULL, NULL, 0} }; @@ -1254,6 +1258,7 @@ PyTypeObject CGContextRef_Type = { /* ------------------ End object type CGContextRef ------------------ */ +#ifndef __LP64__ static PyObject *CG_CreateCGContextForPort(PyObject *_self, PyObject *_args) { PyObject *_res = NULL; @@ -1271,10 +1276,13 @@ static PyObject *CG_CreateCGContextForPort(PyObject *_self, PyObject *_args) return _res; } +#endif static PyMethodDef CG_methods[] = { +#ifndef __LP64__ {"CreateCGContextForPort", (PyCFunction)CG_CreateCGContextForPort, 1, PyDoc_STR("(CGrafPtr) -> CGContextRef")}, +#endif {NULL, NULL, 0} }; diff -r -u ./Modules/_curses_panel.c ./Modules/_curses_panel.c index 0acf3fd..1728b59 100644 --- ./Modules/_curses_panel.c +++ ./Modules/_curses_panel.c @@ -56,7 +56,7 @@ typedef struct { PyTypeObject PyCursesPanel_Type; -#define PyCursesPanel_Check(v) ((v)->ob_type == &PyCursesPanel_Type) +#define PyCursesPanel_Check(v) (Py_TYPE(v) == &PyCursesPanel_Type) /* Some helper functions. The problem is that there's always a window associated with a panel. To ensure that Python's GC doesn't pull @@ -178,12 +178,13 @@ PyCursesPanel_New(PANEL *pan, PyCursesWindowObject *wo) po = PyObject_NEW(PyCursesPanelObject, &PyCursesPanel_Type); if (po == NULL) return NULL; po->pan = pan; - po->wo = wo; - Py_INCREF(wo); if (insert_lop(po) < 0) { - PyObject_DEL(po); - return NULL; + po->wo = NULL; + Py_DECREF(po); + return NULL; } + po->wo = wo; + Py_INCREF(wo); return (PyObject *)po; } @@ -191,8 +192,10 @@ static void PyCursesPanel_Dealloc(PyCursesPanelObject *po) { (void)del_panel(po->pan); - Py_DECREF(po->wo); - remove_lop(po); + if (po->wo != NULL) { + Py_DECREF(po->wo); + remove_lop(po); + } PyObject_DEL(po); } @@ -338,11 +341,10 @@ PyCursesPanel_GetAttr(PyCursesPanelObject *self, char *name) /* -------------------------------------------------------*/ PyTypeObject PyCursesPanel_Type = { - PyObject_HEAD_INIT(NULL) - 0, /*ob_size*/ - "_curses_panel.curses panel", /*tp_name*/ - sizeof(PyCursesPanelObject), /*tp_basicsize*/ - 0, /*tp_itemsize*/ + PyVarObject_HEAD_INIT(NULL, 0) + "_curses_panel.curses panel", /*tp_name*/ + sizeof(PyCursesPanelObject), /*tp_basicsize*/ + 0, /*tp_itemsize*/ /* methods */ (destructor)PyCursesPanel_Dealloc, /*tp_dealloc*/ 0, /*tp_print*/ @@ -458,7 +460,7 @@ init_curses_panel(void) PyObject *m, *d, *v; /* Initialize object type */ - PyCursesPanel_Type.ob_type = &PyType_Type; + Py_TYPE(&PyCursesPanel_Type) = &PyType_Type; import_curses(); pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.5.1/000077500000000000000000000000001517431316200262065ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.5.1/Python-2.5.1/000077500000000000000000000000001517431316200301305ustar00rootroot00000000000000000_patch-setup.py.diff000066400000000000000000000035211517431316200341470ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.5.1/Python-2.5.1--- setup.py.orig 2011-07-07 19:19:43.800122463 +0900 +++ setup.py 2011-07-07 19:25:04.548416377 +0900 @@ -13,6 +13,7 @@ from distutils.command.build_ext import build_ext from distutils.command.install import install from distutils.command.install_lib import install_lib +from distutils.spawn import find_executable # This global variable is used to hold the list of modules to be disabled. disabled_module_list = [] @@ -242,10 +243,34 @@ return platform return sys.platform + def add_multiarch_paths(self): + # Debian/Ubuntu multiarch support. + # https://wiki.ubuntu.com/MultiarchSpec + if not find_executable('dpkg-architecture'): + return + tmpfile = os.path.join(self.build_temp, 'multiarch') + if not os.path.exists(self.build_temp): + os.makedirs(self.build_temp) + ret = os.system( + 'dpkg-architecture -qDEB_HOST_MULTIARCH > %s 2> /dev/null' % + tmpfile) + try: + if ret >> 8 == 0: + fp = open(tmpfile) + multiarch_path_component = fp.readline().strip() + fp.close() + add_dir_to_list(self.compiler.library_dirs, + '/usr/lib/' + multiarch_path_component) + add_dir_to_list(self.compiler.include_dirs, + '/usr/include/' + multiarch_path_component) + finally: + os.unlink(tmpfile) + def detect_modules(self): # Ensure that /usr/local is always used add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib') add_dir_to_list(self.compiler.include_dirs, '/usr/local/include') + self.add_multiarch_paths() # Add paths specified in the environment variables LDFLAGS and # CPPFLAGS for header and library files. 001_patch-svnversion.patch000066400000000000000000000033321517431316200347640ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.5.1/Python-2.5.1diff -r -u ./Makefile.pre.in ../Python-2.5.1/Makefile.pre.in --- ./Makefile.pre.in 2006-12-09 05:46:13.000000000 +0900 +++ ../Python-2.5.1/Makefile.pre.in 2013-05-08 19:05:06.000000000 +0900 @@ -455,7 +455,7 @@ $(SIGNAL_OBJS) \ $(MODOBJS) \ $(srcdir)/Modules/getbuildinfo.c - $(CC) -c $(PY_CFLAGS) -DSVNVERSION=\"`LC_ALL=C $(SVNVERSION)`\" -o $@ $(srcdir)/Modules/getbuildinfo.c + $(CC) -c $(PY_CFLAGS) -DSVNVERSION="\"`LC_ALL=C $(SVNVERSION)`\"" -o $@ $(srcdir)/Modules/getbuildinfo.c Modules/getpath.o: $(srcdir)/Modules/getpath.c Makefile $(CC) -c $(PY_CFLAGS) -DPYTHONPATH='"$(PYTHONPATH)"' \ diff -r -u ./Modules/getbuildinfo.c ../Python-2.5.1/Modules/getbuildinfo.c --- ./Modules/getbuildinfo.c 2006-01-18 18:13:51.000000000 +0900 +++ ../Python-2.5.1/Modules/getbuildinfo.c 2013-05-08 19:05:31.000000000 +0900 @@ -43,6 +43,6 @@ #ifdef SVNVERSION return SVNVERSION; #else - return "exported"; + return "Unversioned directory"; #endif } diff -r -u ./Python/sysmodule.c ../Python-2.5.1/Python/sysmodule.c --- ./Python/sysmodule.c 2007-04-16 15:12:02.000000000 +0900 +++ ../Python-2.5.1/Python/sysmodule.c 2013-05-08 19:05:49.000000000 +0900 @@ -1011,7 +1011,7 @@ svnversion = _Py_svnversion(); - if (strcmp(svnversion, "exported") != 0) + if (strcmp(svnversion, "Unversioned directory") != 0) svn_revision = svnversion; else if (istag) { len = strlen(_patchlevel_revision); diff -r -u ./configure.in ../Python-2.5.1/configure.in --- ./configure.in 2007-03-12 19:50:51.000000000 +0900 +++ ../Python-2.5.1/configure.in 2013-05-08 19:04:36.000000000 +0900 @@ -691,7 +691,7 @@ then SVNVERSION="svnversion \$(srcdir)" else - SVNVERSION="echo exported" + SVNVERSION="echo Unversioned directory" fi case $MACHDEP in 002_darwin_c_source.patch000066400000000000000000000132671517431316200346320ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.5.1/Python-2.5.1diff -r -u ./configure ../Python-2.5/configure --- ./configure 2006-09-05 11:54:42.000000000 +0900 +++ ../Python-2.5/configure 2013-07-19 15:27:46.000000000 +0900 @@ -1396,6 +1396,16 @@ _ACEOF +# The later defininition of _XOPEN_SOURCE and _POSIX_C_SOURCE disables +# certain features on Mac OS X, so we need _DARWIN_C_SOURCE to re-enable +# them. + +cat >>confdefs.h <<\_ACEOF +#define _DARWIN_C_SOURCE 1 +_ACEOF + + + define_xopen_source=yes # Arguments passed to configure. @@ -3885,11 +3895,110 @@ ;; # is there any other compiler on Darwin besides gcc? Darwin*) - BASECFLAGS="$BASECFLAGS -Wno-long-double -no-cpp-precomp -mno-fused-madd" + # -Wno-long-double, -no-cpp-precomp, and -mno-fused-madd + # used to be here, but non-Apple gcc doesn't accept them. + if test "${CC}" = gcc + then + { echo "$as_me:${as_lineno-$LINENO}: checking which compiler should be used" >&5 +echo -n "checking which compiler should be used... " >&6; } + case "${UNIVERSALSDK}" in + */MacOSX10.4u.sdk) + # Build using 10.4 SDK, force usage of gcc when the + # compiler is gcc, otherwise the user will get very + # confusing error messages when building on OSX 10.6 + CC=gcc-4.0 + CPP=cpp-4.0 + ;; + esac + { echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +echo "$CC" >&6; } + fi + + if test "${enable_universalsdk}"; then - BASECFLAGS="-arch ppc -arch i386 -isysroot ${UNIVERSALSDK} ${BASECFLAGS}" + UNIVERSAL_ARCH_FLAGS="" + if test "$UNIVERSAL_ARCHS" = "32-bit" ; then + UNIVERSAL_ARCH_FLAGS="-arch ppc -arch i386" + ARCH_RUN_32BIT="" + LIPO_32BIT_FLAGS="" + elif test "$UNIVERSAL_ARCHS" = "64-bit" ; then + UNIVERSAL_ARCH_FLAGS="-arch ppc64 -arch x86_64" + LIPO_32BIT_FLAGS="" + ARCH_RUN_32BIT="true" + + elif test "$UNIVERSAL_ARCHS" = "all" ; then + UNIVERSAL_ARCH_FLAGS="-arch i386 -arch ppc -arch ppc64 -arch x86_64" + LIPO_32BIT_FLAGS="-extract ppc7400 -extract i386" + ARCH_RUN_32BIT="/usr/bin/arch -i386 -ppc" + + elif test "$UNIVERSAL_ARCHS" = "intel" ; then + UNIVERSAL_ARCH_FLAGS="-arch i386 -arch x86_64" + LIPO_32BIT_FLAGS="-extract i386" + ARCH_RUN_32BIT="/usr/bin/arch -i386" + + elif test "$UNIVERSAL_ARCHS" = "3-way" ; then + UNIVERSAL_ARCH_FLAGS="-arch i386 -arch ppc -arch x86_64" + LIPO_32BIT_FLAGS="-extract ppc7400 -extract i386" + ARCH_RUN_32BIT="/usr/bin/arch -i386 -ppc" + + else + as_fn_error $? "proper usage is --with-universal-arch=32-bit|64-bit|all|intel|3-way" "$LINENO" 5 + + fi + + + CFLAGS="${UNIVERSAL_ARCH_FLAGS} -isysroot ${UNIVERSALSDK} ${CFLAGS}" + if test "${UNIVERSALSDK}" != "/" + then + CFLAGS="-isysroot ${UNIVERSALSDK} ${CFLAGS}" + LDFLAGS="-isysroot ${UNIVERSALSDK} ${LDFLAGS}" + CPPFLAGS="-isysroot ${UNIVERSALSDK} ${CPPFLAGS}" + fi fi + # Calculate the right deployment target for this build. + # + cur_target=`sw_vers -productVersion | sed 's/\(10\.[0-9]*\).*/\1/'` + if test ${cur_target} '>' 10.2 && \ + test ${cur_target} '<' 10.6 + then + cur_target=10.3 + if test ${enable_universalsdk}; then + if test "${UNIVERSAL_ARCHS}" = "all"; then + # Ensure that the default platform for a + # 4-way universal build is OSX 10.5, + # that's the first OS release where + # 4-way builds make sense. + cur_target='10.5' + + elif test "${UNIVERSAL_ARCHS}" = "3-way"; then + cur_target='10.5' + + elif test "${UNIVERSAL_ARCHS}" = "intel"; then + cur_target='10.5' + + elif test "${UNIVERSAL_ARCHS}" = "64-bit"; then + cur_target='10.5' + fi + else + if test `/usr/bin/arch` = "i386"; then + # On Intel macs default to a deployment + # target of 10.4, that's the first OSX + # release with Intel support. + cur_target="10.4" + fi + fi + fi + CONFIGURE_MACOSX_DEPLOYMENT_TARGET=${MACOSX_DEPLOYMENT_TARGET-${cur_target}} + + # Make sure that MACOSX_DEPLOYMENT_TARGET is set in the + # environment with a value that is the same as what we'll use + # in the Makefile to ensure that we'll get the same compiler + # environment during configure and build time. + MACOSX_DEPLOYMENT_TARGET="$CONFIGURE_MACOSX_DEPLOYMENT_TARGET" + export MACOSX_DEPLOYMENT_TARGET + EXPORT_MACOSX_DEPLOYMENT_TARGET='' + ;; OSF*) BASECFLAGS="$BASECFLAGS -mieee" @@ -10851,7 +10960,7 @@ if test "${enable_universalsdk}"; then : else - LIBTOOL_CRUFT="${LIBTOOL_CRUFT} -arch_only `arch`" + LIBTOOL_CRUFT="${LIBTOOL_CRUFT}" fi LIBTOOL_CRUFT=$LIBTOOL_CRUFT' -install_name $(PYTHONFRAMEWORKINSTALLDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK)' LIBTOOL_CRUFT=$LIBTOOL_CRUFT' -compatibility_version $(VERSION) -current_version $(VERSION)';; @@ -10863,7 +10972,7 @@ else LIBTOOL_CRUFT="" fi - LIBTOOL_CRUFT=$LIBTOOL_CRUFT" -lSystem -lSystemStubs -arch_only `arch`" + LIBTOOL_CRUFT=$LIBTOOL_CRUFT" -lSystem -lSystemStubs" LIBTOOL_CRUFT=$LIBTOOL_CRUFT' -install_name $(PYTHONFRAMEWORKINSTALLDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK)' LIBTOOL_CRUFT=$LIBTOOL_CRUFT' -compatibility_version $(VERSION) -current_version $(VERSION)';; esac diff -r -u ./pyconfig.h.in ../Python-2.5/pyconfig.h.in --- ./pyconfig.h.in 2006-07-30 23:09:47.000000000 +0900 +++ ../Python-2.5/pyconfig.h.in 2013-07-17 23:12:31.000000000 +0900 @@ -912,6 +912,11 @@ /* Define on Irix to enable u_int */ #undef _BSD_TYPES +/* Define on Darwin to activate all library features */ +#ifndef _DARWIN_C_SOURCE +#define _DARWIN_C_SOURCE +#endif + /* This must be set to 64 on some systems to enable large file support. */ #undef _FILE_OFFSET_BITS 003_osx_lp64.patch000066400000000000000000000215441517431316200331400ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.5.1/Python-2.5.1diff -r -u ./Include/pymactoolbox.h ../Python-2.5/Include/pymactoolbox.h --- ./Include/pymactoolbox.h 2004-11-05 16:02:59.000000000 +0900 +++ ../Python-2.5/Include/pymactoolbox.h 2013-07-17 23:38:51.000000000 +0900 @@ -8,7 +8,10 @@ #endif #include + +#ifndef __LP64__ #include +#endif /* !__LP64__ */ /* ** Helper routines for error codes and such. @@ -18,8 +21,11 @@ PyObject *PyMac_GetOSErrException(void); /* Initialize & return it */ PyObject *PyErr_Mac(PyObject *, int); /* Exception with a mac error */ PyObject *PyMac_Error(OSErr); /* Uses PyMac_GetOSErrException */ +#ifndef __LP64__ extern OSErr PyMac_GetFullPathname(FSSpec *, char *, int); /* convert fsspec->path */ +#endif /* __LP64__ */ + /* ** These conversion routines are defined in mactoolboxglue.c itself. */ @@ -83,8 +89,10 @@ #endif /* USE_TOOLBOX_OBJECT_GLUE */ /* macfs exports */ +#ifndef __LP64__ int PyMac_GetFSSpec(PyObject *, FSSpec *); /* argument parser for FSSpec */ PyObject *PyMac_BuildFSSpec(FSSpec *); /* Convert FSSpec to PyObject */ +#endif /* !__LP64__ */ int PyMac_GetFSRef(PyObject *, FSRef *); /* argument parser for FSRef */ PyObject *PyMac_BuildFSRef(FSRef *); /* Convert FSRef to PyObject */ @@ -101,39 +109,54 @@ extern int CmpInstObj_Convert(PyObject *, ComponentInstance *); /* Ctl exports */ +#ifndef __LP64__ extern PyObject *CtlObj_New(ControlHandle); extern int CtlObj_Convert(PyObject *, ControlHandle *); +#endif /* !__LP64__ */ /* Dlg exports */ +#ifndef __LP64__ extern PyObject *DlgObj_New(DialogPtr); extern int DlgObj_Convert(PyObject *, DialogPtr *); extern PyObject *DlgObj_WhichDialog(DialogPtr); +#endif /* !__LP64__ */ /* Drag exports */ +#ifndef __LP64__ extern PyObject *DragObj_New(DragReference); extern int DragObj_Convert(PyObject *, DragReference *); +#endif /* !__LP64__ */ /* List exports */ +#ifndef __LP64__ extern PyObject *ListObj_New(ListHandle); extern int ListObj_Convert(PyObject *, ListHandle *); +#endif /* !__LP64__ */ /* Menu exports */ +#ifndef __LP64__ extern PyObject *MenuObj_New(MenuHandle); extern int MenuObj_Convert(PyObject *, MenuHandle *); +#endif /* !__LP64__ */ /* Qd exports */ +#ifndef __LP64__ extern PyObject *GrafObj_New(GrafPtr); extern int GrafObj_Convert(PyObject *, GrafPtr *); extern PyObject *BMObj_New(BitMapPtr); extern int BMObj_Convert(PyObject *, BitMapPtr *); extern PyObject *QdRGB_New(RGBColor *); extern int QdRGB_Convert(PyObject *, RGBColor *); +#endif /* !__LP64__ */ /* Qdoffs exports */ +#ifndef __LP64__ extern PyObject *GWorldObj_New(GWorldPtr); extern int GWorldObj_Convert(PyObject *, GWorldPtr *); +#endif /* !__LP64__ */ /* Qt exports */ +#ifndef __LP64__ extern PyObject *TrackObj_New(Track); extern int TrackObj_Convert(PyObject *, Track *); extern PyObject *MovieObj_New(Movie); @@ -146,6 +169,7 @@ extern int UserDataObj_Convert(PyObject *, UserData *); extern PyObject *MediaObj_New(Media); extern int MediaObj_Convert(PyObject *, Media *); +#endif /* !__LP64__ */ /* Res exports */ extern PyObject *ResObj_New(Handle); @@ -154,13 +178,17 @@ extern int OptResObj_Convert(PyObject *, Handle *); /* TE exports */ +#ifndef __LP64__ extern PyObject *TEObj_New(TEHandle); extern int TEObj_Convert(PyObject *, TEHandle *); +#endif /* !__LP64__ */ /* Win exports */ +#ifndef __LP64__ extern PyObject *WinObj_New(WindowPtr); extern int WinObj_Convert(PyObject *, WindowPtr *); extern PyObject *WinObj_WhichWindow(WindowPtr); +#endif /* !__LP64__ */ /* CF exports */ extern PyObject *CFObj_New(CFTypeRef); diff -r -u ./Mac/Modules/res/_Resmodule.c ../Python-2.5/Mac/Modules/res/_Resmodule.c --- ./Mac/Modules/res/_Resmodule.c 2005-07-04 05:59:44.000000000 +0900 +++ ../Python-2.5/Mac/Modules/res/_Resmodule.c 2013-07-17 23:38:51.000000000 +0900 @@ -414,6 +414,7 @@ return _res; } +#ifndef __LP64__ static PyObject *ResObj_as_Control(ResourceObject *_self, PyObject *_args) { PyObject *_res = NULL; @@ -431,6 +432,7 @@ return _res; } +#endif /* !__LP64__ */ static PyObject *ResObj_LoadResource(ResourceObject *_self, PyObject *_args) { @@ -1152,6 +1154,7 @@ return _res; } +#ifndef __LP64__ static PyObject *Res_OpenRFPerm(PyObject *_self, PyObject *_args) { PyObject *_res = NULL; @@ -1287,6 +1290,7 @@ _res = Py_None; return _res; } +#endif /* !__LP64__ */ static PyObject *Res_InsertResourceFile(PyObject *_self, PyObject *_args) { @@ -1327,6 +1331,7 @@ return _res; } +#ifndef __LP64__ static PyObject *Res_FSpResourceFileAlreadyOpen(PyObject *_self, PyObject *_args) { PyObject *_res = NULL; @@ -1413,6 +1418,7 @@ nextRefNum); return _res; } +#endif /* !__LP64__ */ static PyObject *Res_FSOpenResFile(PyObject *_self, PyObject *_args) { @@ -1438,6 +1444,7 @@ return _res; } +#ifndef __LP64__ static PyObject *Res_FSCreateResFile(PyObject *_self, PyObject *_args) { PyObject *_res = NULL; @@ -1534,6 +1541,7 @@ PyMac_BuildFSSpec, &newSpec); return _res; } +#endif /* __LP64__ */ static PyObject *Res_FSOpenResourceFile(PyObject *_self, PyObject *_args) { @@ -1637,6 +1645,7 @@ PyDoc_STR("(short refNum) -> (short _rv)")}, {"SetResFileAttrs", (PyCFunction)Res_SetResFileAttrs, 1, PyDoc_STR("(short refNum, short attrs) -> None")}, +#ifndef __LP64__ {"OpenRFPerm", (PyCFunction)Res_OpenRFPerm, 1, PyDoc_STR("(Str255 fileName, short vRefNum, SignedByte permission) -> (short _rv)")}, {"HOpenResFile", (PyCFunction)Res_HOpenResFile, 1, @@ -1647,10 +1656,12 @@ PyDoc_STR("(FSSpec spec, SignedByte permission) -> (short _rv)")}, {"FSpCreateResFile", (PyCFunction)Res_FSpCreateResFile, 1, PyDoc_STR("(FSSpec spec, OSType creator, OSType fileType, ScriptCode scriptTag) -> None")}, +#endif /* !__LP64__ */ {"InsertResourceFile", (PyCFunction)Res_InsertResourceFile, 1, PyDoc_STR("(SInt16 refNum, RsrcChainLocation where) -> None")}, {"DetachResourceFile", (PyCFunction)Res_DetachResourceFile, 1, PyDoc_STR("(SInt16 refNum) -> None")}, +#ifndef __LP64__ {"FSpResourceFileAlreadyOpen", (PyCFunction)Res_FSpResourceFileAlreadyOpen, 1, PyDoc_STR("(FSSpec resourceFile) -> (Boolean _rv, Boolean inChain, SInt16 refNum)")}, {"FSpOpenOrphanResFile", (PyCFunction)Res_FSpOpenOrphanResFile, 1, @@ -1659,14 +1670,17 @@ PyDoc_STR("() -> (SInt16 refNum)")}, {"GetNextResourceFile", (PyCFunction)Res_GetNextResourceFile, 1, PyDoc_STR("(SInt16 curRefNum) -> (SInt16 nextRefNum)")}, +#endif /* __LP64__ */ {"FSOpenResFile", (PyCFunction)Res_FSOpenResFile, 1, PyDoc_STR("(FSRef ref, SignedByte permission) -> (short _rv)")}, +#ifndef __LP64__ {"FSCreateResFile", (PyCFunction)Res_FSCreateResFile, 1, PyDoc_STR("(FSRef parentRef, Buffer nameLength) -> (FSRef newRef, FSSpec newSpec)")}, {"FSResourceFileAlreadyOpen", (PyCFunction)Res_FSResourceFileAlreadyOpen, 1, PyDoc_STR("(FSRef resourceFileRef) -> (Boolean _rv, Boolean inChain, SInt16 refNum)")}, {"FSCreateResourceFile", (PyCFunction)Res_FSCreateResourceFile, 1, PyDoc_STR("(FSRef parentRef, Buffer nameLength, Buffer forkNameLength) -> (FSRef newRef, FSSpec newSpec)")}, +#endif /* __LP64__ */ {"FSOpenResourceFile", (PyCFunction)Res_FSOpenResourceFile, 1, PyDoc_STR("(FSRef ref, Buffer forkNameLength, SignedByte permissions) -> (SInt16 refNum)")}, {"Handle", (PyCFunction)Res_Handle, 1, diff -r -u ./Modules/_ctypes/libffi/src/darwin/ffitarget.h ../Python-2.5/Modules/_ctypes/libffi/src/darwin/ffitarget.h --- ./Modules/_ctypes/libffi/src/darwin/ffitarget.h 2006-05-26 06:58:05.000000000 +0900 +++ ../Python-2.5/Modules/_ctypes/libffi/src/darwin/ffitarget.h 2013-07-17 23:38:51.000000000 +0900 @@ -4,7 +4,7 @@ * created by configure). This makes is possible to build a univeral binary * of ctypes in one go. */ -#if defined(__i386__) +#if defined(__i386__) || defined(__x86_64__) #ifndef X86_DARWIN #define X86_DARWIN diff -r -u ./Python/mactoolboxglue.c ../Python-2.5/Python/mactoolboxglue.c --- ./Python/mactoolboxglue.c 2006-07-12 01:44:25.000000000 +0900 +++ ../Python-2.5/Python/mactoolboxglue.c 2013-07-17 23:39:09.000000000 +0900 @@ -106,6 +106,7 @@ } +#ifndef __LP64__ OSErr PyMac_GetFullPathname(FSSpec *fss, char *path, int len) { @@ -153,6 +154,7 @@ Py_XDECREF(fs); return err; } +#endif /* !__LP64__ */ /* Convert a 4-char string object argument to an OSType value */ int @@ -417,6 +419,7 @@ GLUE_NEW(GWorldPtr, GWorldObj_New, "Carbon.Qdoffs") GLUE_CONVERT(GWorldPtr, GWorldObj_Convert, "Carbon.Qdoffs") +#ifndef __LP64__ GLUE_NEW(Track, TrackObj_New, "Carbon.Qt") GLUE_CONVERT(Track, TrackObj_Convert, "Carbon.Qt") GLUE_NEW(Movie, MovieObj_New, "Carbon.Qt") @@ -429,6 +432,7 @@ GLUE_CONVERT(UserData, UserDataObj_Convert, "Carbon.Qt") GLUE_NEW(Media, MediaObj_New, "Carbon.Qt") GLUE_CONVERT(Media, MediaObj_Convert, "Carbon.Qt") +#endif /* !__LP64__ */ GLUE_NEW(Handle, ResObj_New, "Carbon.Res") GLUE_CONVERT(Handle, ResObj_Convert, "Carbon.Res") 004_osx_libffi.patch000066400000000000000000005661361517431316200336220ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.5.1/Python-2.5.1diff -r -u ./Modules/_ctypes/libffi_osx/LICENSE ./Modules/_ctypes/libffi_osx/LICENSE new file mode 100644 index 0000000..f591795 --- /dev/null +++ ./Modules/_ctypes/libffi_osx/LICENSE @@ -0,0 +1,20 @@ +libffi - Copyright (c) 1996-2003 Red Hat, Inc. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +``Software''), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff -r -u ./Modules/_ctypes/libffi_osx/README ./Modules/_ctypes/libffi_osx/README new file mode 100644 index 0000000..1fc2747 --- /dev/null +++ ./Modules/_ctypes/libffi_osx/README @@ -0,0 +1,500 @@ +This directory contains the libffi package, which is not part of GCC but +shipped with GCC as convenience. + +Status +====== + +libffi-2.00 has not been released yet! This is a development snapshot! + +libffi-1.20 was released on October 5, 1998. Check the libffi web +page for updates: . + + +What is libffi? +=============== + +Compilers for high level languages generate code that follow certain +conventions. These conventions are necessary, in part, for separate +compilation to work. One such convention is the "calling +convention". The "calling convention" is essentially a set of +assumptions made by the compiler about where function arguments will +be found on entry to a function. A "calling convention" also specifies +where the return value for a function is found. + +Some programs may not know at the time of compilation what arguments +are to be passed to a function. For instance, an interpreter may be +told at run-time about the number and types of arguments used to call +a given function. Libffi can be used in such programs to provide a +bridge from the interpreter program to compiled code. + +The libffi library provides a portable, high level programming +interface to various calling conventions. This allows a programmer to +call any function specified by a call interface description at run +time. + +Ffi stands for Foreign Function Interface. A foreign function +interface is the popular name for the interface that allows code +written in one language to call code written in another language. The +libffi library really only provides the lowest, machine dependent +layer of a fully featured foreign function interface. A layer must +exist above libffi that handles type conversions for values passed +between the two languages. + + +Supported Platforms and Prerequisites +===================================== + +Libffi has been ported to: + + SunOS 4.1.3 & Solaris 2.x (SPARC-V8, SPARC-V9) + + Irix 5.3 & 6.2 (System V/o32 & n32) + + Intel x86 - Linux (System V ABI) + + Alpha - Linux and OSF/1 + + m68k - Linux (System V ABI) + + PowerPC - Linux (System V ABI, Darwin, AIX) + + ARM - Linux (System V ABI) + +Libffi has been tested with the egcs 1.0.2 gcc compiler. Chances are +that other versions will work. Libffi has also been built and tested +with the SGI compiler tools. + +On PowerPC, the tests failed (see the note below). + +You must use GNU make to build libffi. SGI's make will not work. +Sun's probably won't either. + +If you port libffi to another platform, please let me know! I assume +that some will be easy (x86 NetBSD), and others will be more difficult +(HP). + + +Installing libffi +================= + +[Note: before actually performing any of these installation steps, + you may wish to read the "Platform Specific Notes" below.] + +First you must configure the distribution for your particular +system. Go to the directory you wish to build libffi in and run the +"configure" program found in the root directory of the libffi source +distribution. + +You may want to tell configure where to install the libffi library and +header files. To do that, use the --prefix configure switch. Libffi +will install under /usr/local by default. + +If you want to enable extra run-time debugging checks use the the +--enable-debug configure switch. This is useful when your program dies +mysteriously while using libffi. + +Another useful configure switch is --enable-purify-safety. Using this +will add some extra code which will suppress certain warnings when you +are using Purify with libffi. Only use this switch when using +Purify, as it will slow down the library. + +Configure has many other options. Use "configure --help" to see them all. + +Once configure has finished, type "make". Note that you must be using +GNU make. SGI's make will not work. Sun's probably won't either. +You can ftp GNU make from prep.ai.mit.edu:/pub/gnu. + +To ensure that libffi is working as advertised, type "make test". + +To install the library and header files, type "make install". + + +Using libffi +============ + + The Basics + ---------- + +Libffi assumes that you have a pointer to the function you wish to +call and that you know the number and types of arguments to pass it, +as well as the return type of the function. + +The first thing you must do is create an ffi_cif object that matches +the signature of the function you wish to call. The cif in ffi_cif +stands for Call InterFace. To prepare a call interface object, use the +following function: + +ffi_status ffi_prep_cif(ffi_cif *cif, ffi_abi abi, + unsigned int nargs, + ffi_type *rtype, ffi_type **atypes); + + CIF is a pointer to the call interface object you wish + to initialize. + + ABI is an enum that specifies the calling convention + to use for the call. FFI_DEFAULT_ABI defaults + to the system's native calling convention. Other + ABI's may be used with care. They are system + specific. + + NARGS is the number of arguments this function accepts. + libffi does not yet support vararg functions. + + RTYPE is a pointer to an ffi_type structure that represents + the return type of the function. Ffi_type objects + describe the types of values. libffi provides + ffi_type objects for many of the native C types: + signed int, unsigned int, signed char, unsigned char, + etc. There is also a pointer ffi_type object and + a void ffi_type. Use &ffi_type_void for functions that + don't return values. + + ATYPES is a vector of ffi_type pointers. ARGS must be NARGS long. + If NARGS is 0, this is ignored. + + +ffi_prep_cif will return a status code that you are responsible +for checking. It will be one of the following: + + FFI_OK - All is good. + + FFI_BAD_TYPEDEF - One of the ffi_type objects that ffi_prep_cif + came across is bad. + + +Before making the call, the VALUES vector should be initialized +with pointers to the appropriate argument values. + +To call the function using the initialized ffi_cif, use the +ffi_call function: + +void ffi_call(ffi_cif *cif, void *fn, void *rvalue, void **avalues); + + CIF is a pointer to the ffi_cif initialized specifically + for this function. + + FN is a pointer to the function you want to call. + + RVALUE is a pointer to a chunk of memory that is to hold the + result of the function call. Currently, it must be + at least one word in size (except for the n32 version + under Irix 6.x, which must be a pointer to an 8 byte + aligned value (a long long). It must also be at least + word aligned (depending on the return type, and the + system's alignment requirements). If RTYPE is + &ffi_type_void, this is ignored. If RVALUE is NULL, + the return value is discarded. + + AVALUES is a vector of void* that point to the memory locations + holding the argument values for a call. + If NARGS is 0, this is ignored. + + +If you are expecting a return value from FN it will have been stored +at RVALUE. + + + + An Example + ---------- + +Here is a trivial example that calls puts() a few times. + + #include + #include + + int main() + { + ffi_cif cif; + ffi_type *args[1]; + void *values[1]; + char *s; + int rc; + + /* Initialize the argument info vectors */ + args[0] = &ffi_type_uint; + values[0] = &s; + + /* Initialize the cif */ + if (ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, + &ffi_type_uint, args) == FFI_OK) + { + s = "Hello World!"; + ffi_call(&cif, puts, &rc, values); + /* rc now holds the result of the call to puts */ + + /* values holds a pointer to the function's arg, so to + call puts() again all we need to do is change the + value of s */ + s = "This is cool!"; + ffi_call(&cif, puts, &rc, values); + } + + return 0; + } + + + + Aggregate Types + --------------- + +Although libffi has no special support for unions or bit-fields, it is +perfectly happy passing structures back and forth. You must first +describe the structure to libffi by creating a new ffi_type object +for it. Here is the definition of ffi_type: + + typedef struct _ffi_type + { + unsigned size; + short alignment; + short type; + struct _ffi_type **elements; + } ffi_type; + +All structures must have type set to FFI_TYPE_STRUCT. You may set +size and alignment to 0. These will be calculated and reset to the +appropriate values by ffi_prep_cif(). + +elements is a NULL terminated array of pointers to ffi_type objects +that describe the type of the structure elements. These may, in turn, +be structure elements. + +The following example initializes a ffi_type object representing the +tm struct from Linux's time.h: + + struct tm { + int tm_sec; + int tm_min; + int tm_hour; + int tm_mday; + int tm_mon; + int tm_year; + int tm_wday; + int tm_yday; + int tm_isdst; + /* Those are for future use. */ + long int __tm_gmtoff__; + __const char *__tm_zone__; + }; + + { + ffi_type tm_type; + ffi_type *tm_type_elements[12]; + int i; + + tm_type.size = tm_type.alignment = 0; + tm_type.elements = &tm_type_elements; + + for (i = 0; i < 9; i++) + tm_type_elements[i] = &ffi_type_sint; + + tm_type_elements[9] = &ffi_type_slong; + tm_type_elements[10] = &ffi_type_pointer; + tm_type_elements[11] = NULL; + + /* tm_type can now be used to represent tm argument types and + return types for ffi_prep_cif() */ + } + + + +Platform Specific Notes +======================= + + Intel x86 + --------- + +There are no known problems with the x86 port. + + Sun SPARC - SunOS 4.1.3 & Solaris 2.x + ------------------------------------- + +You must use GNU Make to build libffi on Sun platforms. + + MIPS - Irix 5.3 & 6.x + --------------------- + +Irix 6.2 and better supports three different calling conventions: o32, +n32 and n64. Currently, libffi only supports both o32 and n32 under +Irix 6.x, but only o32 under Irix 5.3. Libffi will automatically be +configured for whichever calling convention it was built for. + +By default, the configure script will try to build libffi with the GNU +development tools. To build libffi with the SGI development tools, set +the environment variable CC to either "cc -32" or "cc -n32" before +running configure under Irix 6.x (depending on whether you want an o32 +or n32 library), or just "cc" for Irix 5.3. + +With the n32 calling convention, when returning structures smaller +than 16 bytes, be sure to provide an RVALUE that is 8 byte aligned. +Here's one way of forcing this: + + double struct_storage[2]; + my_small_struct *s = (my_small_struct *) struct_storage; + /* Use s for RVALUE */ + +If you don't do this you are liable to get spurious bus errors. + +"long long" values are not supported yet. + +You must use GNU Make to build libffi on SGI platforms. + + ARM - System V ABI + ------------------ + +The ARM port was performed on a NetWinder running ARM Linux ELF +(2.0.31) and gcc 2.8.1. + + + + PowerPC System V ABI + -------------------- + +There are two `System V ABI's which libffi implements for PowerPC. +They differ only in how small structures are returned from functions. + +In the FFI_SYSV version, structures that are 8 bytes or smaller are +returned in registers. This is what GCC does when it is configured +for solaris, and is what the System V ABI I have (dated September +1995) says. + +In the FFI_GCC_SYSV version, all structures are returned the same way: +by passing a pointer as the first argument to the function. This is +what GCC does when it is configured for linux or a generic sysv +target. + +EGCS 1.0.1 (and probably other versions of EGCS/GCC) also has a +inconsistency with the SysV ABI: When a procedure is called with many +floating-point arguments, some of them get put on the stack. They are +all supposed to be stored in double-precision format, even if they are +only single-precision, but EGCS stores single-precision arguments as +single-precision anyway. This causes one test to fail (the `many +arguments' test). + + +What's With The Crazy Comments? +=============================== + +You might notice a number of cryptic comments in the code, delimited +by /*@ and @*/. These are annotations read by the program LCLint, a +tool for statically checking C programs. You can read all about it at +. + + +History +======= + +1.20 Oct-5-98 + Raffaele Sena produces ARM port. + +1.19 Oct-5-98 + Fixed x86 long double and long long return support. + m68k bug fixes from Andreas Schwab. + Patch for DU assembler compatibility for the Alpha from Richard + Henderson. + +1.18 Apr-17-98 + Bug fixes and MIPS configuration changes. + +1.17 Feb-24-98 + Bug fixes and m68k port from Andreas Schwab. PowerPC port from + Geoffrey Keating. Various bug x86, Sparc and MIPS bug fixes. + +1.16 Feb-11-98 + Richard Henderson produces Alpha port. + +1.15 Dec-4-97 + Fixed an n32 ABI bug. New libtool, auto* support. + +1.14 May-13-97 + libtool is now used to generate shared and static libraries. + Fixed a minor portability problem reported by Russ McManus + . + +1.13 Dec-2-96 + Added --enable-purify-safety to keep Purify from complaining + about certain low level code. + Sparc fix for calling functions with < 6 args. + Linux x86 a.out fix. + +1.12 Nov-22-96 + Added missing ffi_type_void, needed for supporting void return + types. Fixed test case for non MIPS machines. Cygnus Support + is now Cygnus Solutions. + +1.11 Oct-30-96 + Added notes about GNU make. + +1.10 Oct-29-96 + Added configuration fix for non GNU compilers. + +1.09 Oct-29-96 + Added --enable-debug configure switch. Clean-ups based on LCLint + feedback. ffi_mips.h is always installed. Many configuration + fixes. Fixed ffitest.c for sparc builds. + +1.08 Oct-15-96 + Fixed n32 problem. Many clean-ups. + +1.07 Oct-14-96 + Gordon Irlam rewrites v8.S again. Bug fixes. + +1.06 Oct-14-96 + Gordon Irlam improved the sparc port. + +1.05 Oct-14-96 + Interface changes based on feedback. + +1.04 Oct-11-96 + Sparc port complete (modulo struct passing bug). + +1.03 Oct-10-96 + Passing struct args, and returning struct values works for + all architectures/calling conventions. Expanded tests. + +1.02 Oct-9-96 + Added SGI n32 support. Fixed bugs in both o32 and Linux support. + Added "make test". + +1.01 Oct-8-96 + Fixed float passing bug in mips version. Restructured some + of the code. Builds cleanly with SGI tools. + +1.00 Oct-7-96 + First release. No public announcement. + + +Authors & Credits +================= + +libffi was written by Anthony Green . + +Portions of libffi were derived from Gianni Mariani's free gencall +library for Silicon Graphics machines. + +The closure mechanism was designed and implemented by Kresten Krab +Thorup. + +The Sparc port was derived from code contributed by the fine folks at +Visible Decisions Inc . Further enhancements were +made by Gordon Irlam at Cygnus Solutions . + +The Alpha port was written by Richard Henderson at Cygnus Solutions. + +Andreas Schwab ported libffi to m68k Linux and provided a number of +bug fixes. + +Geoffrey Keating ported libffi to the PowerPC. + +Raffaele Sena ported libffi to the ARM. + +Jesper Skov and Andrew Haley both did more than their fair share of +stepping through the code and tracking down bugs. + +Thanks also to Tom Tromey for bug fixes and configuration help. + +Thanks to Jim Blandy, who provided some useful feedback on the libffi +interface. + +If you have a problem, or have found a bug, please send a note to +green@cygnus.com. diff -r -u ./Modules/_ctypes/libffi_osx/README.pyobjc ./Modules/_ctypes/libffi_osx/README.pyobjc new file mode 100644 index 0000000..405d85f --- /dev/null +++ ./Modules/_ctypes/libffi_osx/README.pyobjc @@ -0,0 +1,5 @@ +This directory contains a slightly modified version of libffi, extracted from +the GCC source-tree. + +The only modifications are those that are necessary to compile libffi using +the Apple provided compiler and outside of the GCC source tree. diff -r -u ./Modules/_ctypes/libffi_osx/ffi.c ./Modules/_ctypes/libffi_osx/ffi.c new file mode 100644 index 0000000..bf42093 --- /dev/null +++ ./Modules/_ctypes/libffi_osx/ffi.c @@ -0,0 +1,226 @@ +/* ----------------------------------------------------------------------- + prep_cif.c - Copyright (c) 1996, 1998 Red Hat, Inc. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#include +#include + +#include +#include + +/* Round up to FFI_SIZEOF_ARG. */ +#define STACK_ARG_SIZE(x) ALIGN(x, FFI_SIZEOF_ARG) + +/* Perform machine independent initialization of aggregate type + specifications. */ + +static ffi_status +initialize_aggregate( +/*@out@*/ ffi_type* arg) +{ +/*@-usedef@*/ + + if (arg == NULL || arg->elements == NULL || + arg->size != 0 || arg->alignment != 0) + return FFI_BAD_TYPEDEF; + + ffi_type** ptr = &(arg->elements[0]); + + while ((*ptr) != NULL) + { + if (((*ptr)->size == 0) && (initialize_aggregate(*ptr) != FFI_OK)) + return FFI_BAD_TYPEDEF; + + /* Perform a sanity check on the argument type */ + FFI_ASSERT_VALID_TYPE(*ptr); + +#ifdef POWERPC_DARWIN + int curalign = (*ptr)->alignment; + + if (ptr != &(arg->elements[0])) + { + if (curalign > 4 && curalign != 16) + curalign = 4; + } + + arg->size = ALIGN(arg->size, curalign); + arg->size += (*ptr)->size; + arg->alignment = (arg->alignment > curalign) ? + arg->alignment : curalign; +#else + arg->size = ALIGN(arg->size, (*ptr)->alignment); + arg->size += (*ptr)->size; + arg->alignment = (arg->alignment > (*ptr)->alignment) ? + arg->alignment : (*ptr)->alignment; +#endif + + ptr++; + } + + /* Structure size includes tail padding. This is important for + structures that fit in one register on ABIs like the PowerPC64 + Linux ABI that right justify small structs in a register. + It's also needed for nested structure layout, for example + struct A { long a; char b; }; struct B { struct A x; char y; }; + should find y at an offset of 2*sizeof(long) and result in a + total size of 3*sizeof(long). */ + arg->size = ALIGN(arg->size, arg->alignment); + + if (arg->size == 0) + return FFI_BAD_TYPEDEF; + + return FFI_OK; + +/*@=usedef@*/ +} + +#ifndef __CRIS__ +/* The CRIS ABI specifies structure elements to have byte + alignment only, so it completely overrides this functions, + which assumes "natural" alignment and padding. */ + +/* Perform machine independent ffi_cif preparation, then call + machine dependent routine. */ + +#if defined(X86_DARWIN) + +static inline bool +struct_on_stack( + int size) +{ + if (size > 8) + return true; + + /* This is not what the ABI says, but is what is really implemented */ + switch (size) + { + case 1: + case 2: + case 4: + case 8: + return false; + + default: + return true; + } +} + +#endif // defined(X86_DARWIN) + +// Arguments' ffi_type->alignment must be nonzero. +ffi_status +ffi_prep_cif( +/*@out@*/ /*@partial@*/ ffi_cif* cif, + ffi_abi abi, + unsigned int nargs, +/*@dependent@*/ /*@out@*/ /*@partial@*/ ffi_type* rtype, +/*@dependent@*/ ffi_type** atypes) +{ + if (cif == NULL) + return FFI_BAD_TYPEDEF; + + if (abi <= FFI_FIRST_ABI || abi > FFI_DEFAULT_ABI) + return FFI_BAD_ABI; + + unsigned int bytes = 0; + unsigned int i; + ffi_type** ptr; + + cif->abi = abi; + cif->arg_types = atypes; + cif->nargs = nargs; + cif->rtype = rtype; + cif->flags = 0; + + /* Initialize the return type if necessary */ + /*@-usedef@*/ + if ((cif->rtype->size == 0) && (initialize_aggregate(cif->rtype) != FFI_OK)) + return FFI_BAD_TYPEDEF; + /*@=usedef@*/ + + /* Perform a sanity check on the return type */ + FFI_ASSERT_VALID_TYPE(cif->rtype); + + /* x86-64 and s390 stack space allocation is handled in prep_machdep. */ +#if !defined M68K && !defined __x86_64__ && !defined S390 && !defined PA + /* Make space for the return structure pointer */ + if (cif->rtype->type == FFI_TYPE_STRUCT +#ifdef SPARC + && (cif->abi != FFI_V9 || cif->rtype->size > 32) +#endif +#ifdef X86_DARWIN + && (struct_on_stack(cif->rtype->size)) +#endif + ) + bytes = STACK_ARG_SIZE(sizeof(void*)); +#endif + + for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++) + { + /* Initialize any uninitialized aggregate type definitions */ + if (((*ptr)->size == 0) && (initialize_aggregate((*ptr)) != FFI_OK)) + return FFI_BAD_TYPEDEF; + + if ((*ptr)->alignment == 0) + return FFI_BAD_TYPEDEF; + + /* Perform a sanity check on the argument type, do this + check after the initialization. */ + FFI_ASSERT_VALID_TYPE(*ptr); + +#if defined(X86_DARWIN) + { + int align = (*ptr)->alignment; + + if (align > 4) + align = 4; + + if ((align - 1) & bytes) + bytes = ALIGN(bytes, align); + + bytes += STACK_ARG_SIZE((*ptr)->size); + } +#elif !defined __x86_64__ && !defined S390 && !defined PA +#ifdef SPARC + if (((*ptr)->type == FFI_TYPE_STRUCT + && ((*ptr)->size > 16 || cif->abi != FFI_V9)) + || ((*ptr)->type == FFI_TYPE_LONGDOUBLE + && cif->abi != FFI_V9)) + bytes += sizeof(void*); + else +#endif + { + /* Add any padding if necessary */ + if (((*ptr)->alignment - 1) & bytes) + bytes = ALIGN(bytes, (*ptr)->alignment); + + bytes += STACK_ARG_SIZE((*ptr)->size); + } +#endif + } + + cif->bytes = bytes; + + /* Perform machine dependent cif processing */ + return ffi_prep_cif_machdep(cif); +} +#endif /* not __CRIS__ */ diff -r -u ./Modules/_ctypes/libffi_osx/include/ffi.h ./Modules/_ctypes/libffi_osx/include/ffi.h new file mode 100644 index 0000000..c104a5c --- /dev/null +++ ./Modules/_ctypes/libffi_osx/include/ffi.h @@ -0,0 +1,355 @@ +/* -----------------------------------------------------------------*-C-*- + libffi PyOBJC - Copyright (c) 1996-2003 Red Hat, Inc. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + ----------------------------------------------------------------------- */ + +/* ------------------------------------------------------------------- + The basic API is described in the README file. + + The raw API is designed to bypass some of the argument packing + and unpacking on architectures for which it can be avoided. + + The closure API allows interpreted functions to be packaged up + inside a C function pointer, so that they can be called as C functions, + with no understanding on the client side that they are interpreted. + It can also be used in other cases in which it is necessary to package + up a user specified parameter and a function pointer as a single + function pointer. + + The closure API must be implemented in order to get its functionality, + e.g. for use by gij. Routines are provided to emulate the raw API + if the underlying platform doesn't allow faster implementation. + + More details on the raw and closure API can be found in: + + http://gcc.gnu.org/ml/java/1999-q3/msg00138.html + + and + + http://gcc.gnu.org/ml/java/1999-q3/msg00174.html + -------------------------------------------------------------------- */ + +#ifndef LIBFFI_H +#define LIBFFI_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Specify which architecture libffi is configured for. */ +#ifdef MACOSX +# if defined(__i386__) || defined(__x86_64__) +# define X86_DARWIN +# elif defined(__ppc__) || defined(__ppc64__) +# define POWERPC_DARWIN +# else +# error "Unsupported MacOS X CPU type" +# endif +#else +#error "Unsupported OS type" +#endif + +/* ---- System configuration information --------------------------------- */ + +#include "ffitarget.h" +#include "fficonfig.h" + +#ifndef LIBFFI_ASM + +#include +#include + +/* LONG_LONG_MAX is not always defined (not if STRICT_ANSI, for example). + But we can find it either under the correct ANSI name, or under GNU + C's internal name. */ +#ifdef LONG_LONG_MAX +# define FFI_LONG_LONG_MAX LONG_LONG_MAX +#else +# ifdef LLONG_MAX +# define FFI_LONG_LONG_MAX LLONG_MAX +# else +# ifdef __GNUC__ +# define FFI_LONG_LONG_MAX __LONG_LONG_MAX__ +# endif +# endif +#endif + +#if SCHAR_MAX == 127 +# define ffi_type_uchar ffi_type_uint8 +# define ffi_type_schar ffi_type_sint8 +#else +#error "char size not supported" +#endif + +#if SHRT_MAX == 32767 +# define ffi_type_ushort ffi_type_uint16 +# define ffi_type_sshort ffi_type_sint16 +#elif SHRT_MAX == 2147483647 +# define ffi_type_ushort ffi_type_uint32 +# define ffi_type_sshort ffi_type_sint32 +#else +#error "short size not supported" +#endif + +#if INT_MAX == 32767 +# define ffi_type_uint ffi_type_uint16 +# define ffi_type_sint ffi_type_sint16 +#elif INT_MAX == 2147483647 +# define ffi_type_uint ffi_type_uint32 +# define ffi_type_sint ffi_type_sint32 +#elif INT_MAX == 9223372036854775807 +# define ffi_type_uint ffi_type_uint64 +# define ffi_type_sint ffi_type_sint64 +#else +#error "int size not supported" +#endif + +#define ffi_type_ulong ffi_type_uint64 +#define ffi_type_slong ffi_type_sint64 + +#if LONG_MAX == 2147483647 +# if FFI_LONG_LONG_MAX != 9223372036854775807 +# error "no 64-bit data type supported" +# endif +#elif LONG_MAX != 9223372036854775807 +#error "long size not supported" +#endif + +/* The closure code assumes that this works on pointers, i.e. a size_t + can hold a pointer. */ + +typedef struct _ffi_type { + size_t size; + unsigned short alignment; + unsigned short type; +/*@null@*/ struct _ffi_type** elements; +} ffi_type; + +/* These are defined in types.c */ +extern ffi_type ffi_type_void; +extern ffi_type ffi_type_uint8; +extern ffi_type ffi_type_sint8; +extern ffi_type ffi_type_uint16; +extern ffi_type ffi_type_sint16; +extern ffi_type ffi_type_uint32; +extern ffi_type ffi_type_sint32; +extern ffi_type ffi_type_uint64; +extern ffi_type ffi_type_sint64; +extern ffi_type ffi_type_float; +extern ffi_type ffi_type_double; +extern ffi_type ffi_type_longdouble; +extern ffi_type ffi_type_pointer; + +typedef enum ffi_status { + FFI_OK = 0, + FFI_BAD_TYPEDEF, + FFI_BAD_ABI +} ffi_status; + +typedef unsigned FFI_TYPE; + +typedef struct ffi_cif { + ffi_abi abi; + unsigned nargs; +/*@dependent@*/ ffi_type** arg_types; +/*@dependent@*/ ffi_type* rtype; + unsigned bytes; + unsigned flags; +#ifdef FFI_EXTRA_CIF_FIELDS + FFI_EXTRA_CIF_FIELDS; +#endif +} ffi_cif; + +/* ---- Definitions for the raw API -------------------------------------- */ + +#ifndef FFI_SIZEOF_ARG +# if LONG_MAX == 2147483647 +# define FFI_SIZEOF_ARG 4 +# elif LONG_MAX == 9223372036854775807 +# define FFI_SIZEOF_ARG 8 +# endif +#endif + +typedef union { + ffi_sarg sint; + ffi_arg uint; + float flt; + char data[FFI_SIZEOF_ARG]; + void* ptr; +} ffi_raw; + +void +ffi_raw_call( +/*@dependent@*/ ffi_cif* cif, + void (*fn)(void), +/*@out@*/ void* rvalue, +/*@dependent@*/ ffi_raw* avalue); + +void +ffi_ptrarray_to_raw( + ffi_cif* cif, + void** args, + ffi_raw* raw); + +void +ffi_raw_to_ptrarray( + ffi_cif* cif, + ffi_raw* raw, + void** args); + +size_t +ffi_raw_size( + ffi_cif* cif); + +/* This is analogous to the raw API, except it uses Java parameter + packing, even on 64-bit machines. I.e. on 64-bit machines + longs and doubles are followed by an empty 64-bit word. */ +void +ffi_java_raw_call( +/*@dependent@*/ ffi_cif* cif, + void (*fn)(void), +/*@out@*/ void* rvalue, +/*@dependent@*/ ffi_raw* avalue); + +void +ffi_java_ptrarray_to_raw( + ffi_cif* cif, + void** args, + ffi_raw* raw); + +void +ffi_java_raw_to_ptrarray( + ffi_cif* cif, + ffi_raw* raw, + void** args); + +size_t +ffi_java_raw_size( + ffi_cif* cif); + +/* ---- Definitions for closures ----------------------------------------- */ + +#if FFI_CLOSURES + +typedef struct ffi_closure { + char tramp[FFI_TRAMPOLINE_SIZE]; + ffi_cif* cif; + void (*fun)(ffi_cif*,void*,void**,void*); + void* user_data; +} ffi_closure; + +ffi_status +ffi_prep_closure( + ffi_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif*,void*,void**,void*), + void* user_data); + +void ffi_closure_free(void *); +void *ffi_closure_alloc (size_t size, void **code); + +typedef struct ffi_raw_closure { + char tramp[FFI_TRAMPOLINE_SIZE]; + ffi_cif* cif; + +#if !FFI_NATIVE_RAW_API + /* if this is enabled, then a raw closure has the same layout + as a regular closure. We use this to install an intermediate + handler to do the transaltion, void** -> ffi_raw*. */ + void (*translate_args)(ffi_cif*,void*,void**,void*); + void* this_closure; +#endif + + void (*fun)(ffi_cif*,void*,ffi_raw*,void*); + void* user_data; +} ffi_raw_closure; + +ffi_status +ffi_prep_raw_closure( + ffi_raw_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif*,void*,ffi_raw*,void*), + void* user_data); + +ffi_status +ffi_prep_java_raw_closure( + ffi_raw_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif*,void*,ffi_raw*,void*), + void* user_data); + +#endif // FFI_CLOSURES + +/* ---- Public interface definition -------------------------------------- */ + +ffi_status +ffi_prep_cif( +/*@out@*/ /*@partial@*/ ffi_cif* cif, + ffi_abi abi, + unsigned int nargs, +/*@dependent@*/ /*@out@*/ /*@partial@*/ ffi_type* rtype, +/*@dependent@*/ ffi_type** atypes); + +void +ffi_call( +/*@dependent@*/ ffi_cif* cif, + void (*fn)(void), +/*@out@*/ void* rvalue, +/*@dependent@*/ void** avalue); + +/* Useful for eliminating compiler warnings */ +#define FFI_FN(f) ((void (*)(void))f) + +#endif // #ifndef LIBFFI_ASM +/* ---- Definitions shared with assembly code ---------------------------- */ + +/* If these change, update src/mips/ffitarget.h. */ +#define FFI_TYPE_VOID 0 +#define FFI_TYPE_INT 1 +#define FFI_TYPE_FLOAT 2 +#define FFI_TYPE_DOUBLE 3 + +#ifdef HAVE_LONG_DOUBLE +# define FFI_TYPE_LONGDOUBLE 4 +#else +# define FFI_TYPE_LONGDOUBLE FFI_TYPE_DOUBLE +#endif + +#define FFI_TYPE_UINT8 5 +#define FFI_TYPE_SINT8 6 +#define FFI_TYPE_UINT16 7 +#define FFI_TYPE_SINT16 8 +#define FFI_TYPE_UINT32 9 +#define FFI_TYPE_SINT32 10 +#define FFI_TYPE_UINT64 11 +#define FFI_TYPE_SINT64 12 +#define FFI_TYPE_STRUCT 13 +#define FFI_TYPE_POINTER 14 + +/* This should always refer to the last type code (for sanity checks) */ +#define FFI_TYPE_LAST FFI_TYPE_POINTER + +#ifdef __cplusplus +} +#endif + +#endif // #ifndef LIBFFI_H diff -r -u ./Modules/_ctypes/libffi_osx/include/ffi_common.h ./Modules/_ctypes/libffi_osx/include/ffi_common.h new file mode 100644 index 0000000..685a358 --- /dev/null +++ ./Modules/_ctypes/libffi_osx/include/ffi_common.h @@ -0,0 +1,102 @@ +/* ----------------------------------------------------------------------- + ffi_common.h - Copyright (c) 1996 Red Hat, Inc. + + Common internal definitions and macros. Only necessary for building + libffi. + ----------------------------------------------------------------------- */ + +#ifndef FFI_COMMON_H +#define FFI_COMMON_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "fficonfig.h" + +/* Do not move this. Some versions of AIX are very picky about where + this is positioned. */ +#ifdef __GNUC__ +# define alloca __builtin_alloca +#else +# if HAVE_ALLOCA_H +# include +# else +# ifdef _AIX +# pragma alloca +# else +# ifndef alloca /* predefined by HP cc +Olibcalls */ +char* alloca(); +# endif +# endif +# endif +#endif + +/* Check for the existence of memcpy. */ +#if STDC_HEADERS +# include +#else +# ifndef HAVE_MEMCPY +# define memcpy(d, s, n) bcopy((s), (d), (n)) +# endif +#endif + +/*#if defined(FFI_DEBUG) +#include +#endif*/ + +#ifdef FFI_DEBUG +#include + +/*@exits@*/ void +ffi_assert( +/*@temp@*/ char* expr, +/*@temp@*/ char* file, + int line); +void +ffi_stop_here(void); +void +ffi_type_test( +/*@temp@*/ /*@out@*/ ffi_type* a, +/*@temp@*/ char* file, + int line); + +# define FFI_ASSERT(x) ((x) ? (void)0 : ffi_assert(#x, __FILE__,__LINE__)) +# define FFI_ASSERT_AT(x, f, l) ((x) ? 0 : ffi_assert(#x, (f), (l))) +# define FFI_ASSERT_VALID_TYPE(x) ffi_type_test(x, __FILE__, __LINE__) +#else +# define FFI_ASSERT(x) +# define FFI_ASSERT_AT(x, f, l) +# define FFI_ASSERT_VALID_TYPE(x) +#endif // #ifdef FFI_DEBUG + +#define ALIGN(v, a) (((size_t)(v) + (a) - 1) & ~((a) - 1)) + +/* Perform machine dependent cif processing */ +ffi_status +ffi_prep_cif_machdep( + ffi_cif* cif); + +/* Extended cif, used in callback from assembly routine */ +typedef struct extended_cif { +/*@dependent@*/ ffi_cif* cif; +/*@dependent@*/ void* rvalue; +/*@dependent@*/ void** avalue; +} extended_cif; + +/* Terse sized type definitions. */ +typedef unsigned int UINT8 __attribute__((__mode__(__QI__))); +typedef signed int SINT8 __attribute__((__mode__(__QI__))); +typedef unsigned int UINT16 __attribute__((__mode__(__HI__))); +typedef signed int SINT16 __attribute__((__mode__(__HI__))); +typedef unsigned int UINT32 __attribute__((__mode__(__SI__))); +typedef signed int SINT32 __attribute__((__mode__(__SI__))); +typedef unsigned int UINT64 __attribute__((__mode__(__DI__))); +typedef signed int SINT64 __attribute__((__mode__(__DI__))); +typedef float FLOAT32; + +#ifdef __cplusplus +} +#endif + +#endif // #ifndef FFI_COMMON_H \ No newline at end of file diff -r -u ./Modules/_ctypes/libffi_osx/include/fficonfig.h ./Modules/_ctypes/libffi_osx/include/fficonfig.h new file mode 100644 index 0000000..2172490 --- /dev/null +++ ./Modules/_ctypes/libffi_osx/include/fficonfig.h @@ -0,0 +1,150 @@ +/* Manually created fficonfig.h for Darwin on PowerPC or Intel + + This file is manually generated to do away with the need for autoconf and + therefore make it easier to cross-compile and build fat binaries. + + NOTE: This file was added by PyObjC. +*/ + +#ifndef MACOSX +#error "This file is only supported on Mac OS X" +#endif + +#if defined(__i386__) +# define BYTEORDER 1234 +# undef HOST_WORDS_BIG_ENDIAN +# undef WORDS_BIGENDIAN +# define SIZEOF_DOUBLE 8 +# define HAVE_LONG_DOUBLE 1 +# define SIZEOF_LONG_DOUBLE 16 + +#elif defined(__x86_64__) +# define BYTEORDER 1234 +# undef HOST_WORDS_BIG_ENDIAN +# undef WORDS_BIGENDIAN +# define SIZEOF_DOUBLE 8 +# define HAVE_LONG_DOUBLE 1 +# define SIZEOF_LONG_DOUBLE 16 + +#elif defined(__ppc__) +# define BYTEORDER 4321 +# define HOST_WORDS_BIG_ENDIAN 1 +# define WORDS_BIGENDIAN 1 +# define SIZEOF_DOUBLE 8 +# if __GNUC__ >= 4 +# define HAVE_LONG_DOUBLE 1 +# define SIZEOF_LONG_DOUBLE 16 +# else +# undef HAVE_LONG_DOUBLE +# define SIZEOF_LONG_DOUBLE 8 +# endif + +#elif defined(__ppc64__) +# define BYTEORDER 4321 +# define HOST_WORDS_BIG_ENDIAN 1 +# define WORDS_BIGENDIAN 1 +# define SIZEOF_DOUBLE 8 +# define HAVE_LONG_DOUBLE 1 +# define SIZEOF_LONG_DOUBLE 16 + +#else +#error "Unknown CPU type" +#endif + +/* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP + systems. This function is required for `alloca.c' support on those systems. */ +#undef CRAY_STACKSEG_END + +/* Define to 1 if using `alloca.c'. */ +/* #undef C_ALLOCA */ + +/* Define to the flags needed for the .section .eh_frame directive. */ +#define EH_FRAME_FLAGS "aw" + +/* Define this if you want extra debugging. */ +/* #undef FFI_DEBUG */ + +/* Define this is you do not want support for the raw API. */ +#define FFI_NO_RAW_API 1 + +/* Define this if you do not want support for aggregate types. */ +/* #undef FFI_NO_STRUCTS */ + +/* Define to 1 if you have `alloca', as a function or macro. */ +#define HAVE_ALLOCA 1 + +/* Define to 1 if you have and it should be used (not on Ultrix). */ +#define HAVE_ALLOCA_H 1 + +/* Define if your assembler supports .register. */ +/* #undef HAVE_AS_REGISTER_PSEUDO_OP */ + +/* Define if your assembler and linker support unaligned PC relative relocs. */ +/* #undef HAVE_AS_SPARC_UA_PCREL */ + +/* Define to 1 if you have the `memcpy' function. */ +#define HAVE_MEMCPY 1 + +/* Define if mmap with MAP_ANON(YMOUS) works. */ +#define HAVE_MMAP_ANON 1 + +/* Define if mmap of /dev/zero works. */ +/* #undef HAVE_MMAP_DEV_ZERO */ + +/* Define if read-only mmap of a plain file works. */ +#define HAVE_MMAP_FILE 1 + +/* Define if .eh_frame sections should be read-only. */ +/* #undef HAVE_RO_EH_FRAME */ + +/* Define to 1 if your C compiler doesn't accept -c and -o together. */ +/* #undef NO_MINUS_C_MINUS_O */ + +/* Name of package */ +#define PACKAGE "libffi" + +/* Define to the address where bug reports for this package should be sent. */ +#define PACKAGE_BUGREPORT "http://gcc.gnu.org/bugs.html" + +/* Define to the full name of this package. */ +#define PACKAGE_NAME "libffi" + +/* Define to the full name and version of this package. */ +#define PACKAGE_STRING "libffi 2.1" + +/* Define to the one symbol short name of this package. */ +#define PACKAGE_TARNAME "libffi" + +/* Define to the version of this package. */ +#define PACKAGE_VERSION "2.1" + +/* If using the C implementation of alloca, define if you know the + direction of stack growth for your system; otherwise it will be + automatically deduced at run-time. + STACK_DIRECTION > 0 => grows toward higher addresses + STACK_DIRECTION < 0 => grows toward lower addresses + STACK_DIRECTION = 0 => direction of growth unknown */ +/* #undef STACK_DIRECTION */ + +/* Define to 1 if you have the ANSI C header files. */ +#define STDC_HEADERS 1 + +/* Define this if you are using Purify and want to suppress spurious messages. */ +/* #undef USING_PURIFY */ + +/* Version number of package */ +#define VERSION "2.1-pyobjc" + +#ifdef HAVE_HIDDEN_VISIBILITY_ATTRIBUTE +# ifdef LIBFFI_ASM +# define FFI_HIDDEN(name) .hidden name +# else +# define FFI_HIDDEN __attribute__((visibility ("hidden"))) +# endif +#else +# ifdef LIBFFI_ASM +# define FFI_HIDDEN(name) +# else +# define FFI_HIDDEN +# endif +#endif \ No newline at end of file diff -r -u ./Modules/_ctypes/libffi_osx/include/ffitarget.h ./Modules/_ctypes/libffi_osx/include/ffitarget.h new file mode 100644 index 0000000..faaa30d --- /dev/null +++ ./Modules/_ctypes/libffi_osx/include/ffitarget.h @@ -0,0 +1,13 @@ +/* Dispatch to the right ffitarget file. This file is PyObjC specific; in a + normal build, the build environment copies the file to the right location or + sets up the right include flags. We want to do neither because that would + make building fat binaries harder. +*/ + +#if defined(__i386__) || defined(__x86_64__) +#include "x86-ffitarget.h" +#elif defined(__ppc__) || defined(__ppc64__) +#include "ppc-ffitarget.h" +#else +#error "Unsupported CPU type" +#endif \ No newline at end of file diff -r -u ./Modules/_ctypes/libffi_osx/include/ppc-ffitarget.h ./Modules/_ctypes/libffi_osx/include/ppc-ffitarget.h new file mode 100644 index 0000000..2318421 --- /dev/null +++ ./Modules/_ctypes/libffi_osx/include/ppc-ffitarget.h @@ -0,0 +1,104 @@ +/* -----------------------------------------------------------------*-C-*- + ppc-ffitarget.h - Copyright (c) 1996-2003 Red Hat, Inc. + Target configuration macros for PowerPC. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#ifndef LIBFFI_TARGET_H +#define LIBFFI_TARGET_H + +/* ---- System specific configurations ----------------------------------- */ + +#if (defined(POWERPC) && defined(__powerpc64__)) || \ + (defined(POWERPC_DARWIN) && defined(__ppc64__)) +#define POWERPC64 +#endif + +#ifndef LIBFFI_ASM + +typedef unsigned long ffi_arg; +typedef signed long ffi_sarg; + +typedef enum ffi_abi { + FFI_FIRST_ABI = 0, + +#ifdef POWERPC + FFI_SYSV, + FFI_GCC_SYSV, + FFI_LINUX64, +# ifdef POWERPC64 + FFI_DEFAULT_ABI = FFI_LINUX64, +# else + FFI_DEFAULT_ABI = FFI_GCC_SYSV, +# endif +#endif + +#ifdef POWERPC_AIX + FFI_AIX, + FFI_DARWIN, + FFI_DEFAULT_ABI = FFI_AIX, +#endif + +#ifdef POWERPC_DARWIN + FFI_AIX, + FFI_DARWIN, + FFI_DEFAULT_ABI = FFI_DARWIN, +#endif + +#ifdef POWERPC_FREEBSD + FFI_SYSV, + FFI_GCC_SYSV, + FFI_LINUX64, + FFI_DEFAULT_ABI = FFI_SYSV, +#endif + + FFI_LAST_ABI = FFI_DEFAULT_ABI + 1 +} ffi_abi; + +#endif // #ifndef LIBFFI_ASM + +/* ---- Definitions for closures ----------------------------------------- */ + +#define FFI_CLOSURES 1 +#define FFI_NATIVE_RAW_API 0 + +/* Needed for FFI_SYSV small structure returns. */ +#define FFI_SYSV_TYPE_SMALL_STRUCT (FFI_TYPE_LAST) + +#if defined(POWERPC64) /*|| defined(POWERPC_AIX)*/ +# define FFI_TRAMPOLINE_SIZE 48 +#elif defined(POWERPC_AIX) +# define FFI_TRAMPOLINE_SIZE 24 +#else +# define FFI_TRAMPOLINE_SIZE 40 +#endif + +#ifndef LIBFFI_ASM +# if defined(POWERPC_DARWIN) || defined(POWERPC_AIX) +typedef struct ffi_aix_trampoline_struct { + void* code_pointer; /* Pointer to ffi_closure_ASM */ + void* toc; /* TOC */ + void* static_chain; /* Pointer to closure */ +} ffi_aix_trampoline_struct; +# endif +#endif // #ifndef LIBFFI_ASM + +#endif // #ifndef LIBFFI_TARGET_H \ No newline at end of file diff -r -u ./Modules/_ctypes/libffi_osx/include/x86-ffitarget.h ./Modules/_ctypes/libffi_osx/include/x86-ffitarget.h new file mode 100644 index 0000000..55c2b6c --- /dev/null +++ ./Modules/_ctypes/libffi_osx/include/x86-ffitarget.h @@ -0,0 +1,88 @@ +/* -----------------------------------------------------------------*-C-*- + x86-ffitarget.h - Copyright (c) 1996-2003 Red Hat, Inc. + Target configuration macros for x86 and x86-64. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + ----------------------------------------------------------------------- */ + +#ifndef LIBFFI_TARGET_H +#define LIBFFI_TARGET_H + +/* ---- System specific configurations ----------------------------------- */ + +#if defined(X86_64) && defined(__i386__) +# undef X86_64 +# define X86 +#endif + +#if defined(__x86_64__) +# ifndef X86_64 +# define X86_64 +# endif +#endif + +/* ---- Generic type definitions ----------------------------------------- */ + +#ifndef LIBFFI_ASM + +typedef unsigned long ffi_arg; +typedef signed long ffi_sarg; + +typedef enum ffi_abi { + FFI_FIRST_ABI = 0, + + /* ---- Intel x86 Win32 ---------- */ +#ifdef X86_WIN32 + FFI_SYSV, + FFI_STDCALL, + /* TODO: Add fastcall support for the sake of completeness */ + FFI_DEFAULT_ABI = FFI_SYSV, +#endif + + /* ---- Intel x86 and AMD x86-64 - */ +#if !defined(X86_WIN32) && (defined(__i386__) || defined(__x86_64__)) + FFI_SYSV, + FFI_UNIX64, /* Unix variants all use the same ABI for x86-64 */ +# ifdef __i386__ + FFI_DEFAULT_ABI = FFI_SYSV, +# else + FFI_DEFAULT_ABI = FFI_UNIX64, +# endif +#endif + + FFI_LAST_ABI = FFI_DEFAULT_ABI + 1 +} ffi_abi; + +#endif // #ifndef LIBFFI_ASM + +/* ---- Definitions for closures ----------------------------------------- */ + +#define FFI_CLOSURES 1 + +#if defined(X86_64) || (defined(__x86_64__) && defined(X86_DARWIN)) +# define FFI_TRAMPOLINE_SIZE 24 +# define FFI_NATIVE_RAW_API 0 +#else +# define FFI_TRAMPOLINE_SIZE 10 +# define FFI_NATIVE_RAW_API 1 /* x86 has native raw api support */ +#endif + +#endif // #ifndef LIBFFI_TARGET_H \ No newline at end of file diff -r -u ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin.S ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin.S new file mode 100644 index 0000000..f143dbd --- /dev/null +++ ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin.S @@ -0,0 +1,365 @@ +#if defined(__ppc__) || defined(__ppc64__) + +/* ----------------------------------------------------------------------- + ppc-darwin.S - Copyright (c) 2000 John Hornkvist + Copyright (c) 2004 Free Software Foundation, Inc. + + PowerPC Assembly glue. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#define LIBFFI_ASM + +#include +#include +#include +#include + +.text + .align 2 +.globl _ffi_prep_args + +.text + .align 2 +.globl _ffi_call_DARWIN + +.text + .align 2 +_ffi_call_DARWIN: +LFB0: + mr r12,r8 /* We only need r12 until the call, + so it doesn't have to be saved. */ + +LFB1: + /* Save the old stack pointer as AP. */ + mr r8,r1 + +LCFI0: +#if defined(__ppc64__) + /* Allocate the stack space we need. + r4 (size of input data) + 48 bytes (linkage area) + 40 bytes (saved registers) + 8 bytes (extra FPR) + r4 + 96 bytes total + */ + + addi r4,r4,-96 // Add our overhead. + li r0,-32 // Align to 32 bytes. + and r4,r4,r0 +#endif + stgux r1,r1,r4 // Grow the stack. + mflr r9 + + /* Save registers we use. */ +#if defined(__ppc64__) + std r27,-40(r8) +#endif + stg r28,MODE_CHOICE(-16,-32)(r8) + stg r29,MODE_CHOICE(-12,-24)(r8) + stg r30,MODE_CHOICE(-8,-16)(r8) + stg r31,MODE_CHOICE(-4,-8)(r8) + stg r9,SF_RETURN(r8) /* return address */ +#if !defined(POWERPC_DARWIN) /* TOC unused in OS X */ + stg r2,MODE_CHOICE(20,40)(r1) +#endif + +LCFI1: +#if defined(__ppc64__) + mr r27,r3 // our extended_cif +#endif + /* Save arguments over call. */ + mr r31,r5 /* flags, */ + mr r30,r6 /* rvalue, */ + mr r29,r7 /* function address, */ + mr r28,r8 /* our AP. */ + +LCFI2: + /* Call ffi_prep_args. */ + mr r4,r1 + li r9,0 + mtctr r12 /* r12 holds address of _ffi_prep_args. */ + bctrl +#if !defined(POWERPC_DARWIN) /* TOC unused in OS X */ + lg r2,MODE_CHOICE(20,40)(r1) +#endif + + /* Now do the call. + Set up cr1 with bits 4-7 of the flags. */ + mtcrf 0x40,r31 + + /* Load all those argument registers. + We have set up a nice stack frame, just load it into registers. */ + lg r3,SF_ARG1(r1) + lg r4,SF_ARG2(r1) + lg r5,SF_ARG3(r1) + lg r6,SF_ARG4(r1) + nop + lg r7,SF_ARG5(r1) + lg r8,SF_ARG6(r1) + lg r9,SF_ARG7(r1) + lg r10,SF_ARG8(r1) + + /* Load all the FP registers. */ + bf 6,L2 /* No floats to load. */ +#if defined(__ppc64__) + lfd f1,MODE_CHOICE(-16,-40)-(14*8)(r28) + lfd f2,MODE_CHOICE(-16,-40)-(13*8)(r28) + lfd f3,MODE_CHOICE(-16,-40)-(12*8)(r28) + lfd f4,MODE_CHOICE(-16,-40)-(11*8)(r28) + nop + lfd f5,MODE_CHOICE(-16,-40)-(10*8)(r28) + lfd f6,MODE_CHOICE(-16,-40)-(9*8)(r28) + lfd f7,MODE_CHOICE(-16,-40)-(8*8)(r28) + lfd f8,MODE_CHOICE(-16,-40)-(7*8)(r28) + nop + lfd f9,MODE_CHOICE(-16,-40)-(6*8)(r28) + lfd f10,MODE_CHOICE(-16,-40)-(5*8)(r28) + lfd f11,MODE_CHOICE(-16,-40)-(4*8)(r28) + lfd f12,MODE_CHOICE(-16,-40)-(3*8)(r28) + nop + lfd f13,MODE_CHOICE(-16,-40)-(2*8)(r28) + lfd f14,MODE_CHOICE(-16,-40)-(1*8)(r28) +#elif defined(__ppc__) + lfd f1,MODE_CHOICE(-16,-40)-(13*8)(r28) + lfd f2,MODE_CHOICE(-16,-40)-(12*8)(r28) + lfd f3,MODE_CHOICE(-16,-40)-(11*8)(r28) + lfd f4,MODE_CHOICE(-16,-40)-(10*8)(r28) + nop + lfd f5,MODE_CHOICE(-16,-40)-(9*8)(r28) + lfd f6,MODE_CHOICE(-16,-40)-(8*8)(r28) + lfd f7,MODE_CHOICE(-16,-40)-(7*8)(r28) + lfd f8,MODE_CHOICE(-16,-40)-(6*8)(r28) + nop + lfd f9,MODE_CHOICE(-16,-40)-(5*8)(r28) + lfd f10,MODE_CHOICE(-16,-40)-(4*8)(r28) + lfd f11,MODE_CHOICE(-16,-40)-(3*8)(r28) + lfd f12,MODE_CHOICE(-16,-40)-(2*8)(r28) + nop + lfd f13,MODE_CHOICE(-16,-40)-(1*8)(r28) +#else +#error undefined architecture +#endif + +L2: + mr r12,r29 // Put the target address in r12 as specified. + mtctr r12 // Get the address to call into CTR. + nop + nop + bctrl // Make the call. + + // Deal with the return value. +#if defined(__ppc64__) + mtcrf 0x3,r31 // flags in cr6 and cr7 + bt 27,L(st_return_value) +#elif defined(__ppc__) + mtcrf 0x1,r31 // flags in cr7 +#else +#error undefined architecture +#endif + + bt 30,L(done_return_value) + bt 29,L(fp_return_value) + stg r3,0(r30) +#if defined(__ppc__) + bf 28,L(done_return_value) // Store the second long if necessary. + stg r4,4(r30) +#endif + // Fall through + +L(done_return_value): + lg r1,0(r1) // Restore stack pointer. + // Restore the registers we used. + lg r9,SF_RETURN(r1) // return address + lg r31,MODE_CHOICE(-4,-8)(r1) + mtlr r9 + lg r30,MODE_CHOICE(-8,-16)(r1) + lg r29,MODE_CHOICE(-12,-24)(r1) + lg r28,MODE_CHOICE(-16,-32)(r1) +#if defined(__ppc64__) + ld r27,-40(r1) +#endif + blr + +#if defined(__ppc64__) +L(st_return_value): + // Grow the stack enough to fit the registers. Leave room for 8 args + // to trample the 1st 8 slots in param area. + stgu r1,-SF_ROUND(280)(r1) // 64 + 104 + 48 + 64 + + // Store GPRs + std r3,SF_ARG9(r1) + std r4,SF_ARG10(r1) + std r5,SF_ARG11(r1) + std r6,SF_ARG12(r1) + nop + std r7,SF_ARG13(r1) + std r8,SF_ARG14(r1) + std r9,SF_ARG15(r1) + std r10,SF_ARG16(r1) + + // Store FPRs + nop + bf 26,L(call_struct_to_ram_form) + stfd f1,SF_ARG17(r1) + stfd f2,SF_ARG18(r1) + stfd f3,SF_ARG19(r1) + stfd f4,SF_ARG20(r1) + nop + stfd f5,SF_ARG21(r1) + stfd f6,SF_ARG22(r1) + stfd f7,SF_ARG23(r1) + stfd f8,SF_ARG24(r1) + nop + stfd f9,SF_ARG25(r1) + stfd f10,SF_ARG26(r1) + stfd f11,SF_ARG27(r1) + stfd f12,SF_ARG28(r1) + nop + stfd f13,SF_ARG29(r1) + +L(call_struct_to_ram_form): + ld r3,0(r27) // extended_cif->cif* + ld r3,16(r3) // ffi_cif->rtype* + addi r4,r1,SF_ARG9 // stored GPRs + addi r6,r1,SF_ARG17 // stored FPRs + li r5,0 // GPR size ptr (NULL) + li r7,0 // FPR size ptr (NULL) + li r8,0 // FPR count ptr (NULL) + li r10,0 // struct offset (NULL) + mr r9,r30 // return area + bl Lffi64_struct_to_ram_form$stub + lg r1,0(r1) // Restore stack pointer. + b L(done_return_value) +#endif + +L(fp_return_value): + /* Do we have long double to store? */ + bf 31,L(fd_return_value) + stfd f1,0(r30) + stfd f2,8(r30) + b L(done_return_value) + +L(fd_return_value): + /* Do we have double to store? */ + bf 28,L(float_return_value) + stfd f1,0(r30) + b L(done_return_value) + +L(float_return_value): + /* We only have a float to store. */ + stfs f1,0(r30) + b L(done_return_value) + +LFE1: +/* END(_ffi_call_DARWIN) */ + +/* Provide a null definition of _ffi_call_AIX. */ +.text + .align 2 +.globl _ffi_call_AIX +.text + .align 2 +_ffi_call_AIX: + blr +/* END(_ffi_call_AIX) */ + +.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms +EH_frame1: + .set L$set$0,LECIE1-LSCIE1 + .long L$set$0 ; Length of Common Information Entry +LSCIE1: + .long 0x0 ; CIE Identifier Tag + .byte 0x1 ; CIE Version + .ascii "zR\0" ; CIE Augmentation + .byte 0x1 ; uleb128 0x1; CIE Code Alignment Factor + .byte 0x7c ; sleb128 -4; CIE Data Alignment Factor + .byte 0x41 ; CIE RA Column + .byte 0x1 ; uleb128 0x1; Augmentation size + .byte 0x10 ; FDE Encoding (pcrel) + .byte 0xc ; DW_CFA_def_cfa + .byte 0x1 ; uleb128 0x1 + .byte 0x0 ; uleb128 0x0 + .align LOG2_GPR_BYTES +LECIE1: +.globl _ffi_call_DARWIN.eh +_ffi_call_DARWIN.eh: +LSFDE1: + .set L$set$1,LEFDE1-LASFDE1 + .long L$set$1 ; FDE Length + +LASFDE1: + .long LASFDE1-EH_frame1 ; FDE CIE offset + .g_long LFB0-. ; FDE initial location + .set L$set$3,LFE1-LFB0 + .g_long L$set$3 ; FDE address range + .byte 0x0 ; uleb128 0x0; Augmentation size + .byte 0x4 ; DW_CFA_advance_loc4 + .set L$set$4,LCFI0-LFB1 + .long L$set$4 + .byte 0xd ; DW_CFA_def_cfa_register + .byte 0x08 ; uleb128 0x08 + .byte 0x4 ; DW_CFA_advance_loc4 + .set L$set$5,LCFI1-LCFI0 + .long L$set$5 + .byte 0x11 ; DW_CFA_offset_extended_sf + .byte 0x41 ; uleb128 0x41 + .byte 0x7e ; sleb128 -2 + .byte 0x9f ; DW_CFA_offset, column 0x1f + .byte 0x1 ; uleb128 0x1 + .byte 0x9e ; DW_CFA_offset, column 0x1e + .byte 0x2 ; uleb128 0x2 + .byte 0x9d ; DW_CFA_offset, column 0x1d + .byte 0x3 ; uleb128 0x3 + .byte 0x9c ; DW_CFA_offset, column 0x1c + .byte 0x4 ; uleb128 0x4 + .byte 0x4 ; DW_CFA_advance_loc4 + .set L$set$6,LCFI2-LCFI1 + .long L$set$6 + .byte 0xd ; DW_CFA_def_cfa_register + .byte 0x1c ; uleb128 0x1c + .align LOG2_GPR_BYTES +LEFDE1: + +#if defined(__ppc64__) +.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 + .align LOG2_GPR_BYTES + +Lffi64_struct_to_ram_form$stub: + .indirect_symbol _ffi64_struct_to_ram_form + mflr r0 + bcl 20,31,LO$ffi64_struct_to_ram_form + +LO$ffi64_struct_to_ram_form: + mflr r11 + addis r11,r11,ha16(L_ffi64_struct_to_ram_form$lazy_ptr - LO$ffi64_struct_to_ram_form) + mtlr r0 + lgu r12,lo16(L_ffi64_struct_to_ram_form$lazy_ptr - LO$ffi64_struct_to_ram_form)(r11) + mtctr r12 + bctr + +.lazy_symbol_pointer +L_ffi64_struct_to_ram_form$lazy_ptr: + .indirect_symbol _ffi64_struct_to_ram_form + .g_long dyld_stub_binding_helper + +#endif // __ppc64__ +#endif // __ppc__ || __ppc64__ diff -r -u ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin.h ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin.h new file mode 100644 index 0000000..cf4bd50 --- /dev/null +++ ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin.h @@ -0,0 +1,85 @@ +/* ----------------------------------------------------------------------- + ppc-darwin.h - Copyright (c) 2002, 2003, 2004, Free Software Foundation, + Inc. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#define L(x) x + +#define SF_ARG9 MODE_CHOICE(56,112) +#define SF_ARG10 MODE_CHOICE(60,120) +#define SF_ARG11 MODE_CHOICE(64,128) +#define SF_ARG12 MODE_CHOICE(68,136) +#define SF_ARG13 MODE_CHOICE(72,144) +#define SF_ARG14 MODE_CHOICE(76,152) +#define SF_ARG15 MODE_CHOICE(80,160) +#define SF_ARG16 MODE_CHOICE(84,168) +#define SF_ARG17 MODE_CHOICE(88,176) +#define SF_ARG18 MODE_CHOICE(92,184) +#define SF_ARG19 MODE_CHOICE(96,192) +#define SF_ARG20 MODE_CHOICE(100,200) +#define SF_ARG21 MODE_CHOICE(104,208) +#define SF_ARG22 MODE_CHOICE(108,216) +#define SF_ARG23 MODE_CHOICE(112,224) +#define SF_ARG24 MODE_CHOICE(116,232) +#define SF_ARG25 MODE_CHOICE(120,240) +#define SF_ARG26 MODE_CHOICE(124,248) +#define SF_ARG27 MODE_CHOICE(128,256) +#define SF_ARG28 MODE_CHOICE(132,264) +#define SF_ARG29 MODE_CHOICE(136,272) + +#define ASM_NEEDS_REGISTERS 4 +#define NUM_GPR_ARG_REGISTERS 8 +#define NUM_FPR_ARG_REGISTERS 13 + +#define FFI_TYPE_1_BYTE(x) ((x) == FFI_TYPE_UINT8 || (x) == FFI_TYPE_SINT8) +#define FFI_TYPE_2_BYTE(x) ((x) == FFI_TYPE_UINT16 || (x) == FFI_TYPE_SINT16) +#define FFI_TYPE_4_BYTE(x) \ + ((x) == FFI_TYPE_UINT32 || (x) == FFI_TYPE_SINT32 ||\ + (x) == FFI_TYPE_INT || (x) == FFI_TYPE_FLOAT) + +#if !defined(LIBFFI_ASM) + +enum { + FLAG_RETURNS_NOTHING = 1 << (31 - 30), // cr7 + FLAG_RETURNS_FP = 1 << (31 - 29), + FLAG_RETURNS_64BITS = 1 << (31 - 28), + FLAG_RETURNS_128BITS = 1 << (31 - 31), + + FLAG_RETURNS_STRUCT = 1 << (31 - 27), // cr6 + FLAG_STRUCT_CONTAINS_FP = 1 << (31 - 26), + + FLAG_ARG_NEEDS_COPY = 1 << (31 - 7), + FLAG_FP_ARGUMENTS = 1 << (31 - 6), // cr1.eq; specified by ABI + FLAG_4_GPR_ARGUMENTS = 1 << (31 - 5), + FLAG_RETVAL_REFERENCE = 1 << (31 - 4) +}; + +#if defined(__ppc64__) +void ffi64_struct_to_ram_form(const ffi_type*, const char*, unsigned int*, + const char*, unsigned int*, unsigned int*, char*, unsigned int*); +void ffi64_struct_to_reg_form(const ffi_type*, const char*, unsigned int*, + unsigned int*, char*, unsigned int*, char*, unsigned int*); +bool ffi64_stret_needs_ptr(const ffi_type* inType, + unsigned short*, unsigned short*); +#endif + +#endif // !defined(LIBFFI_ASM) \ No newline at end of file diff -r -u ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin_closure.S ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin_closure.S new file mode 100644 index 0000000..c3d30c2 --- /dev/null +++ ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin_closure.S @@ -0,0 +1,308 @@ +#if defined(__ppc__) + +/* ----------------------------------------------------------------------- + ppc-darwin_closure.S - Copyright (c) 2002, 2003, 2004, Free Software Foundation, + Inc. based on ppc_closure.S + + PowerPC Assembly glue. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#define LIBFFI_ASM + +#include +#include // for FFI_TRAMPOLINE_SIZE +#include +#include + + .file "ppc-darwin_closure.S" +.text + .align LOG2_GPR_BYTES + .globl _ffi_closure_ASM + +.text + .align LOG2_GPR_BYTES + +_ffi_closure_ASM: +LFB1: + mflr r0 // Save return address + stg r0,SF_RETURN(r1) + +LCFI0: + /* 24/48 bytes (Linkage Area) + 32/64 bytes (outgoing parameter area, always reserved) + 104 bytes (13*8 from FPR) + 16/32 bytes (result) + 176/232 total bytes */ + + /* skip over caller save area and keep stack aligned to 16/32. */ + stgu r1,-SF_ROUND(176)(r1) + +LCFI1: + /* We want to build up an area for the parameters passed + in registers. (both floating point and integer) */ + + /* 176/256 bytes (callee stack frame aligned to 16/32) + 24/48 bytes (caller linkage area) + 200/304 (start of caller parameter area aligned to 4/8) + */ + + /* Save GPRs 3 - 10 (aligned to 4/8) + in the parents outgoing area. */ + stg r3,200(r1) + stg r4,204(r1) + stg r5,208(r1) + stg r6,212(r1) + stg r7,216(r1) + stg r8,220(r1) + stg r9,224(r1) + stg r10,228(r1) + + /* Save FPRs 1 - 13. (aligned to 8) */ + stfd f1,56(r1) + stfd f2,64(r1) + stfd f3,72(r1) + stfd f4,80(r1) + stfd f5,88(r1) + stfd f6,96(r1) + stfd f7,104(r1) + stfd f8,112(r1) + stfd f9,120(r1) + stfd f10,128(r1) + stfd f11,136(r1) + stfd f12,144(r1) + stfd f13,152(r1) + + // Set up registers for the routine that actually does the work. + mr r3,r11 // context pointer from the trampoline + addi r4,r1,160 // result storage + addi r5,r1,200 // saved GPRs + addi r6,r1,56 // saved FPRs + bl Lffi_closure_helper_DARWIN$stub + + /* Now r3 contains the return type. Use it to look up in a table + so we know how to deal with each type. */ + addi r5,r1,160 // Copy result storage pointer. + bl Lget_ret_type0_addr // Get pointer to Lret_type0 into LR. + mflr r4 // Move to r4. + slwi r3,r3,4 // Multiply return type by 16. + add r3,r3,r4 // Add contents of table to table address. + mtctr r3 + bctr + +LFE1: +/* Each of the ret_typeX code fragments has to be exactly 16 bytes long + (4 instructions). For cache effectiveness we align to a 16 byte boundary + first. */ + .align 4 + nop + nop + nop + +Lget_ret_type0_addr: + blrl + +/* case FFI_TYPE_VOID */ +Lret_type0: + b Lfinish + nop + nop + nop + +/* case FFI_TYPE_INT */ +Lret_type1: + lwz r3,0(r5) + b Lfinish + nop + nop + +/* case FFI_TYPE_FLOAT */ +Lret_type2: + lfs f1,0(r5) + b Lfinish + nop + nop + +/* case FFI_TYPE_DOUBLE */ +Lret_type3: + lfd f1,0(r5) + b Lfinish + nop + nop + +/* case FFI_TYPE_LONGDOUBLE */ +Lret_type4: + lfd f1,0(r5) + lfd f2,8(r5) + b Lfinish + nop + +/* case FFI_TYPE_UINT8 */ +Lret_type5: + lbz r3,3(r5) + b Lfinish + nop + nop + +/* case FFI_TYPE_SINT8 */ +Lret_type6: + lbz r3,3(r5) + extsb r3,r3 + b Lfinish + nop + +/* case FFI_TYPE_UINT16 */ +Lret_type7: + lhz r3,2(r5) + b Lfinish + nop + nop + +/* case FFI_TYPE_SINT16 */ +Lret_type8: + lha r3,2(r5) + b Lfinish + nop + nop + +/* case FFI_TYPE_UINT32 */ +Lret_type9: // same as Lret_type1 + lwz r3,0(r5) + b Lfinish + nop + nop + +/* case FFI_TYPE_SINT32 */ +Lret_type10: // same as Lret_type1 + lwz r3,0(r5) + b Lfinish + nop + nop + +/* case FFI_TYPE_UINT64 */ +Lret_type11: + lwz r3,0(r5) + lwz r4,4(r5) + b Lfinish + nop + +/* case FFI_TYPE_SINT64 */ +Lret_type12: // same as Lret_type11 + lwz r3,0(r5) + lwz r4,4(r5) + b Lfinish + nop + +/* case FFI_TYPE_STRUCT */ +Lret_type13: + b Lfinish + nop + nop + nop + +/* End 16-byte aligned cases */ +/* case FFI_TYPE_POINTER */ +// This case assumes that FFI_TYPE_POINTER == FFI_TYPE_LAST. If more types +// are added in future, the following code will need to be updated and +// padded to 16 bytes. +Lret_type14: + lg r3,0(r5) + // fall through + +/* case done */ +Lfinish: + addi r1,r1,SF_ROUND(176) // Restore stack pointer. + lg r0,SF_RETURN(r1) // Restore return address. + mtlr r0 // Restore link register. + blr + +/* END(ffi_closure_ASM) */ + +.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support +EH_frame1: + .set L$set$0,LECIE1-LSCIE1 + .long L$set$0 ; Length of Common Information Entry +LSCIE1: + .long 0x0 ; CIE Identifier Tag + .byte 0x1 ; CIE Version + .ascii "zR\0" ; CIE Augmentation + .byte 0x1 ; uleb128 0x1; CIE Code Alignment Factor + .byte 0x7c ; sleb128 -4; CIE Data Alignment Factor + .byte 0x41 ; CIE RA Column + .byte 0x1 ; uleb128 0x1; Augmentation size + .byte 0x10 ; FDE Encoding (pcrel) + .byte 0xc ; DW_CFA_def_cfa + .byte 0x1 ; uleb128 0x1 + .byte 0x0 ; uleb128 0x0 + .align LOG2_GPR_BYTES +LECIE1: +.globl _ffi_closure_ASM.eh +_ffi_closure_ASM.eh: +LSFDE1: + .set L$set$1,LEFDE1-LASFDE1 + .long L$set$1 ; FDE Length + +LASFDE1: + .long LASFDE1-EH_frame1 ; FDE CIE offset + .g_long LFB1-. ; FDE initial location + .set L$set$3,LFE1-LFB1 + .g_long L$set$3 ; FDE address range + .byte 0x0 ; uleb128 0x0; Augmentation size + .byte 0x4 ; DW_CFA_advance_loc4 + .set L$set$3,LCFI1-LCFI0 + .long L$set$3 + .byte 0xe ; DW_CFA_def_cfa_offset + .byte 176,1 ; uleb128 176 + .byte 0x4 ; DW_CFA_advance_loc4 + .set L$set$4,LCFI0-LFB1 + .long L$set$4 + .byte 0x11 ; DW_CFA_offset_extended_sf + .byte 0x41 ; uleb128 0x41 + .byte 0x7e ; sleb128 -2 + .align LOG2_GPR_BYTES + +LEFDE1: +.data + .align LOG2_GPR_BYTES +LDFCM0: +.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 + .align LOG2_GPR_BYTES + +Lffi_closure_helper_DARWIN$stub: + .indirect_symbol _ffi_closure_helper_DARWIN + mflr r0 + bcl 20,31,LO$ffi_closure_helper_DARWIN + +LO$ffi_closure_helper_DARWIN: + mflr r11 + addis r11,r11,ha16(L_ffi_closure_helper_DARWIN$lazy_ptr - LO$ffi_closure_helper_DARWIN) + mtlr r0 + lgu r12,lo16(L_ffi_closure_helper_DARWIN$lazy_ptr - LO$ffi_closure_helper_DARWIN)(r11) + mtctr r12 + bctr + +.lazy_symbol_pointer +L_ffi_closure_helper_DARWIN$lazy_ptr: + .indirect_symbol _ffi_closure_helper_DARWIN + .g_long dyld_stub_binding_helper + + +#endif // __ppc__ diff -r -u ./Modules/_ctypes/libffi_osx/powerpc/ppc-ffi_darwin.c ./Modules/_ctypes/libffi_osx/powerpc/ppc-ffi_darwin.c new file mode 100644 index 0000000..8953d5f --- /dev/null +++ ./Modules/_ctypes/libffi_osx/powerpc/ppc-ffi_darwin.c @@ -0,0 +1,1776 @@ +#if defined(__ppc__) || defined(__ppc64__) + +/* ----------------------------------------------------------------------- + ffi.c - Copyright (c) 1998 Geoffrey Keating + + PowerPC Foreign Function Interface + + Darwin ABI support (c) 2001 John Hornkvist + AIX ABI support (c) 2002 Free Software Foundation, Inc. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#include +#include + +#include +#include +#include +#include +#include + +#if 0 +#if defined(POWERPC_DARWIN) +#include // for sys_icache_invalidate() +#endif + +#else + +#pragma weak sys_icache_invalidate +extern void sys_icache_invalidate(void *start, size_t len); + +#endif + + +extern void ffi_closure_ASM(void); + +// The layout of a function descriptor. A C function pointer really +// points to one of these. +typedef struct aix_fd_struct { + void* code_pointer; + void* toc; +} aix_fd; + +/* ffi_prep_args is called by the assembly routine once stack space + has been allocated for the function's arguments. + + The stack layout we want looks like this: + + | Return address from ffi_call_DARWIN | higher addresses + |--------------------------------------------| + | Previous backchain pointer 4/8 | stack pointer here + |--------------------------------------------|-\ <<< on entry to + | Saved r28-r31 (4/8)*4 | | ffi_call_DARWIN + |--------------------------------------------| | + | Parameters (at least 8*(4/8)=32/64) | | (176) +112 - +288 + |--------------------------------------------| | + | Space for GPR2 4/8 | | + |--------------------------------------------| | stack | + | Reserved (4/8)*2 | | grows | + |--------------------------------------------| | down V + | Space for callee's LR 4/8 | | + |--------------------------------------------| | lower addresses + | Saved CR 4/8 | | + |--------------------------------------------| | stack pointer here + | Current backchain pointer 4/8 | | during + |--------------------------------------------|-/ <<< ffi_call_DARWIN + + Note: ppc64 CR is saved in the low word of a long on the stack. +*/ + +/*@-exportheader@*/ +void +ffi_prep_args( + extended_cif* inEcif, + unsigned *const stack) +/*@=exportheader@*/ +{ + /* Copy the ecif to a local var so we can trample the arg. + BC note: test this with GP later for possible problems... */ + volatile extended_cif* ecif = inEcif; + + const unsigned bytes = ecif->cif->bytes; + const unsigned flags = ecif->cif->flags; + + /* Cast the stack arg from int* to long*. sizeof(long) == 4 in 32-bit mode + and 8 in 64-bit mode. */ + unsigned long *const longStack = (unsigned long *const)stack; + + /* 'stacktop' points at the previous backchain pointer. */ +#if defined(__ppc64__) + // In ppc-darwin.s, an extra 96 bytes is reserved for the linkage area, + // saved registers, and an extra FPR. + unsigned long *const stacktop = + (unsigned long *)(unsigned long)((char*)longStack + bytes + 96); +#elif defined(__ppc__) + unsigned long *const stacktop = longStack + (bytes / sizeof(long)); +#else +#error undefined architecture +#endif + + /* 'fpr_base' points at the space for fpr1, and grows upwards as + we use FPR registers. */ + double* fpr_base = (double*)(stacktop - ASM_NEEDS_REGISTERS) - + NUM_FPR_ARG_REGISTERS; + +#if defined(__ppc64__) + // 64-bit saves an extra register, and uses an extra FPR. Knock fpr_base + // down a couple pegs. + fpr_base -= 2; +#endif + + unsigned int fparg_count = 0; + + /* 'next_arg' grows up as we put parameters in it. */ + unsigned long* next_arg = longStack + 6; /* 6 reserved positions. */ + + int i; + double double_tmp; + void** p_argv = ecif->avalue; + unsigned long gprvalue; + ffi_type** ptr = ecif->cif->arg_types; + + /* Check that everything starts aligned properly. */ + FFI_ASSERT(stack == SF_ROUND(stack)); + FFI_ASSERT(stacktop == SF_ROUND(stacktop)); + FFI_ASSERT(bytes == SF_ROUND(bytes)); + + /* Deal with return values that are actually pass-by-reference. + Rule: + Return values are referenced by r3, so r4 is the first parameter. */ + + if (flags & FLAG_RETVAL_REFERENCE) + *next_arg++ = (unsigned long)(char*)ecif->rvalue; + + /* Now for the arguments. */ + for (i = ecif->cif->nargs; i > 0; i--, ptr++, p_argv++) + { + switch ((*ptr)->type) + { + /* If a floating-point parameter appears before all of the general- + purpose registers are filled, the corresponding GPRs that match + the size of the floating-point parameter are shadowed for the + benefit of vararg and pre-ANSI functions. */ + case FFI_TYPE_FLOAT: + double_tmp = *(float*)*p_argv; + + if (fparg_count < NUM_FPR_ARG_REGISTERS) + *fpr_base++ = double_tmp; + + *(double*)next_arg = double_tmp; + + next_arg++; + fparg_count++; + FFI_ASSERT(flags & FLAG_FP_ARGUMENTS); + + break; + + case FFI_TYPE_DOUBLE: + double_tmp = *(double*)*p_argv; + + if (fparg_count < NUM_FPR_ARG_REGISTERS) + *fpr_base++ = double_tmp; + + *(double*)next_arg = double_tmp; + + next_arg += MODE_CHOICE(2,1); + fparg_count++; + FFI_ASSERT(flags & FLAG_FP_ARGUMENTS); + + break; + +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + case FFI_TYPE_LONGDOUBLE: +#if defined(__ppc64__) + if (fparg_count < NUM_FPR_ARG_REGISTERS) + *(long double*)fpr_base = *(long double*)*p_argv; +#elif defined(__ppc__) + if (fparg_count < NUM_FPR_ARG_REGISTERS - 1) + *(long double*)fpr_base = *(long double*)*p_argv; + else if (fparg_count == NUM_FPR_ARG_REGISTERS - 1) + *(double*)fpr_base = *(double*)*p_argv; +#else +#error undefined architecture +#endif + + *(long double*)next_arg = *(long double*)*p_argv; + fparg_count += 2; + fpr_base += 2; + next_arg += MODE_CHOICE(4,2); + FFI_ASSERT(flags & FLAG_FP_ARGUMENTS); + + break; +#endif // FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: +#if defined(__ppc64__) + gprvalue = *(long long*)*p_argv; + goto putgpr; +#elif defined(__ppc__) + *(long long*)next_arg = *(long long*)*p_argv; + next_arg += 2; + break; +#else +#error undefined architecture +#endif + + case FFI_TYPE_POINTER: + gprvalue = *(unsigned long*)*p_argv; + goto putgpr; + + case FFI_TYPE_UINT8: + gprvalue = *(unsigned char*)*p_argv; + goto putgpr; + + case FFI_TYPE_SINT8: + gprvalue = *(signed char*)*p_argv; + goto putgpr; + + case FFI_TYPE_UINT16: + gprvalue = *(unsigned short*)*p_argv; + goto putgpr; + + case FFI_TYPE_SINT16: + gprvalue = *(signed short*)*p_argv; + goto putgpr; + + case FFI_TYPE_STRUCT: + { +#if defined(__ppc64__) + unsigned int gprSize = 0; + unsigned int fprSize = 0; + + ffi64_struct_to_reg_form(*ptr, (char*)*p_argv, NULL, &fparg_count, + (char*)next_arg, &gprSize, (char*)fpr_base, &fprSize); + next_arg += gprSize / sizeof(long); + fpr_base += fprSize / sizeof(double); + +#elif defined(__ppc__) + char* dest_cpy = (char*)next_arg; + + /* Structures that match the basic modes (QI 1 byte, HI 2 bytes, + SI 4 bytes) are aligned as if they were those modes. + Structures with 3 byte in size are padded upwards. */ + unsigned size_al = (*ptr)->size; + + /* If the first member of the struct is a double, then align + the struct to double-word. */ + if ((*ptr)->elements[0]->type == FFI_TYPE_DOUBLE) + size_al = ALIGN((*ptr)->size, 8); + + if (ecif->cif->abi == FFI_DARWIN) + { + if (size_al < 3) + dest_cpy += 4 - size_al; + } + + memcpy((char*)dest_cpy, (char*)*p_argv, size_al); + next_arg += (size_al + 3) / 4; +#else +#error undefined architecture +#endif + break; + } + + case FFI_TYPE_INT: + case FFI_TYPE_UINT32: + case FFI_TYPE_SINT32: + gprvalue = *(unsigned*)*p_argv; + +putgpr: + *next_arg++ = gprvalue; + break; + + default: + break; + } + } + + /* Check that we didn't overrun the stack... */ + //FFI_ASSERT(gpr_base <= stacktop - ASM_NEEDS_REGISTERS); + //FFI_ASSERT((unsigned *)fpr_base + // <= stacktop - ASM_NEEDS_REGISTERS - NUM_GPR_ARG_REGISTERS); + //FFI_ASSERT(flags & FLAG_4_GPR_ARGUMENTS || intarg_count <= 4); +} + +#if defined(__ppc64__) + +bool +ffi64_struct_contains_fp( + const ffi_type* inType) +{ + bool containsFP = false; + unsigned int i; + + for (i = 0; inType->elements[i] != NULL && !containsFP; i++) + { + if (inType->elements[i]->type == FFI_TYPE_FLOAT || + inType->elements[i]->type == FFI_TYPE_DOUBLE || + inType->elements[i]->type == FFI_TYPE_LONGDOUBLE) + containsFP = true; + else if (inType->elements[i]->type == FFI_TYPE_STRUCT) + containsFP = ffi64_struct_contains_fp(inType->elements[i]); + } + + return containsFP; +} + +#endif // defined(__ppc64__) + +/* Perform machine dependent cif processing. */ +ffi_status +ffi_prep_cif_machdep( + ffi_cif* cif) +{ + /* All this is for the DARWIN ABI. */ + int i; + ffi_type** ptr; + int intarg_count = 0; + int fparg_count = 0; + unsigned int flags = 0; + unsigned int size_al = 0; + + /* All the machine-independent calculation of cif->bytes will be wrong. + Redo the calculation for DARWIN. */ + + /* Space for the frame pointer, callee's LR, CR, etc, and for + the asm's temp regs. */ + unsigned int bytes = (6 + ASM_NEEDS_REGISTERS) * sizeof(long); + + /* Return value handling. The rules are as follows: + - 32-bit (or less) integer values are returned in gpr3; + - Structures of size <= 4 bytes also returned in gpr3; + - 64-bit integer values and structures between 5 and 8 bytes are + returned in gpr3 and gpr4; + - Single/double FP values are returned in fpr1; + - Long double FP (if not equivalent to double) values are returned in + fpr1 and fpr2; + - Larger structures values are allocated space and a pointer is passed + as the first argument. */ + switch (cif->rtype->type) + { +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + case FFI_TYPE_LONGDOUBLE: + flags |= FLAG_RETURNS_128BITS; + flags |= FLAG_RETURNS_FP; + break; +#endif // FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + + case FFI_TYPE_DOUBLE: + flags |= FLAG_RETURNS_64BITS; + /* Fall through. */ + case FFI_TYPE_FLOAT: + flags |= FLAG_RETURNS_FP; + break; + +#if defined(__ppc64__) + case FFI_TYPE_POINTER: +#endif + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + flags |= FLAG_RETURNS_64BITS; + break; + + case FFI_TYPE_STRUCT: + { +#if defined(__ppc64__) + + if (ffi64_stret_needs_ptr(cif->rtype, NULL, NULL)) + { + flags |= FLAG_RETVAL_REFERENCE; + flags |= FLAG_RETURNS_NOTHING; + intarg_count++; + } + else + { + flags |= FLAG_RETURNS_STRUCT; + + if (ffi64_struct_contains_fp(cif->rtype)) + flags |= FLAG_STRUCT_CONTAINS_FP; + } + +#elif defined(__ppc__) + + flags |= FLAG_RETVAL_REFERENCE; + flags |= FLAG_RETURNS_NOTHING; + intarg_count++; + +#else +#error undefined architecture +#endif + break; + } + + case FFI_TYPE_VOID: + flags |= FLAG_RETURNS_NOTHING; + break; + + default: + /* Returns 32-bit integer, or similar. Nothing to do here. */ + break; + } + + /* The first NUM_GPR_ARG_REGISTERS words of integer arguments, and the + first NUM_FPR_ARG_REGISTERS fp arguments, go in registers; the rest + goes on the stack. Structures are passed as a pointer to a copy of + the structure. Stuff on the stack needs to keep proper alignment. */ + for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++) + { + switch ((*ptr)->type) + { + case FFI_TYPE_FLOAT: + case FFI_TYPE_DOUBLE: + fparg_count++; + /* If this FP arg is going on the stack, it must be + 8-byte-aligned. */ + if (fparg_count > NUM_FPR_ARG_REGISTERS + && intarg_count % 2 != 0) + intarg_count++; + break; + +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + case FFI_TYPE_LONGDOUBLE: + fparg_count += 2; + /* If this FP arg is going on the stack, it must be + 8-byte-aligned. */ + + if ( +#if defined(__ppc64__) + fparg_count > NUM_FPR_ARG_REGISTERS + 1 +#elif defined(__ppc__) + fparg_count > NUM_FPR_ARG_REGISTERS +#else +#error undefined architecture +#endif + && intarg_count % 2 != 0) + intarg_count++; + + intarg_count += 2; + break; +#endif // FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + /* 'long long' arguments are passed as two words, but + either both words must fit in registers or both go + on the stack. If they go on the stack, they must + be 8-byte-aligned. */ + if (intarg_count == NUM_GPR_ARG_REGISTERS - 1 + || (intarg_count >= NUM_GPR_ARG_REGISTERS + && intarg_count % 2 != 0)) + intarg_count++; + + intarg_count += MODE_CHOICE(2,1); + + break; + + case FFI_TYPE_STRUCT: + size_al = (*ptr)->size; + /* If the first member of the struct is a double, then align + the struct to double-word. */ + if ((*ptr)->elements[0]->type == FFI_TYPE_DOUBLE) + size_al = ALIGN((*ptr)->size, 8); + +#if defined(__ppc64__) + // Look for FP struct members. + unsigned int j; + + for (j = 0; (*ptr)->elements[j] != NULL; j++) + { + if ((*ptr)->elements[j]->type == FFI_TYPE_FLOAT || + (*ptr)->elements[j]->type == FFI_TYPE_DOUBLE) + { + fparg_count++; + + if (fparg_count > NUM_FPR_ARG_REGISTERS) + intarg_count++; + } + else if ((*ptr)->elements[j]->type == FFI_TYPE_LONGDOUBLE) + { + fparg_count += 2; + + if (fparg_count > NUM_FPR_ARG_REGISTERS + 1) + intarg_count += 2; + } + else + intarg_count++; + } +#elif defined(__ppc__) + intarg_count += (size_al + 3) / 4; +#else +#error undefined architecture +#endif + + break; + + default: + /* Everything else is passed as a 4/8-byte word in a GPR, either + the object itself or a pointer to it. */ + intarg_count++; + break; + } + } + + /* Space for the FPR registers, if needed. */ + if (fparg_count != 0) + { + flags |= FLAG_FP_ARGUMENTS; +#if defined(__ppc64__) + bytes += (NUM_FPR_ARG_REGISTERS + 1) * sizeof(double); +#elif defined(__ppc__) + bytes += NUM_FPR_ARG_REGISTERS * sizeof(double); +#else +#error undefined architecture +#endif + } + + /* Stack space. */ +#if defined(__ppc64__) + if ((intarg_count + fparg_count) > NUM_GPR_ARG_REGISTERS) + bytes += (intarg_count + fparg_count) * sizeof(long); +#elif defined(__ppc__) + if ((intarg_count + 2 * fparg_count) > NUM_GPR_ARG_REGISTERS) + bytes += (intarg_count + 2 * fparg_count) * sizeof(long); +#else +#error undefined architecture +#endif + else + bytes += NUM_GPR_ARG_REGISTERS * sizeof(long); + + /* The stack space allocated needs to be a multiple of 16/32 bytes. */ + bytes = SF_ROUND(bytes); + + cif->flags = flags; + cif->bytes = bytes; + + return FFI_OK; +} + +/*@-declundef@*/ +/*@-exportheader@*/ +extern void +ffi_call_AIX( +/*@out@*/ extended_cif*, + unsigned, + unsigned, +/*@out@*/ unsigned*, + void (*fn)(void), + void (*fn2)(extended_cif*, unsigned *const)); + +extern void +ffi_call_DARWIN( +/*@out@*/ extended_cif*, + unsigned long, + unsigned, +/*@out@*/ unsigned*, + void (*fn)(void), + void (*fn2)(extended_cif*, unsigned *const)); +/*@=declundef@*/ +/*@=exportheader@*/ + +void +ffi_call( +/*@dependent@*/ ffi_cif* cif, + void (*fn)(void), +/*@out@*/ void* rvalue, +/*@dependent@*/ void** avalue) +{ + extended_cif ecif; + + ecif.cif = cif; + ecif.avalue = avalue; + + /* If the return value is a struct and we don't have a return + value address then we need to make one. */ + if ((rvalue == NULL) && + (cif->rtype->type == FFI_TYPE_STRUCT)) + { + /*@-sysunrecog@*/ + ecif.rvalue = alloca(cif->rtype->size); + /*@=sysunrecog@*/ + } + else + ecif.rvalue = rvalue; + + switch (cif->abi) + { + case FFI_AIX: + /*@-usedef@*/ + ffi_call_AIX(&ecif, -cif->bytes, + cif->flags, ecif.rvalue, fn, ffi_prep_args); + /*@=usedef@*/ + break; + + case FFI_DARWIN: + /*@-usedef@*/ + ffi_call_DARWIN(&ecif, -(long)cif->bytes, + cif->flags, ecif.rvalue, fn, ffi_prep_args); + /*@=usedef@*/ + break; + + default: + FFI_ASSERT(0); + break; + } +} + +/* here I'd like to add the stack frame layout we use in darwin_closure.S + and aix_clsoure.S + + SP previous -> +---------------------------------------+ <--- child frame + | back chain to caller 4 | + +---------------------------------------+ 4 + | saved CR 4 | + +---------------------------------------+ 8 + | saved LR 4 | + +---------------------------------------+ 12 + | reserved for compilers 4 | + +---------------------------------------+ 16 + | reserved for binders 4 | + +---------------------------------------+ 20 + | saved TOC pointer 4 | + +---------------------------------------+ 24 + | always reserved 8*4=32 (previous GPRs)| + | according to the linkage convention | + | from AIX | + +---------------------------------------+ 56 + | our FPR area 13*8=104 | + | f1 | + | . | + | f13 | + +---------------------------------------+ 160 + | result area 8 | + +---------------------------------------+ 168 + | alignement to the next multiple of 16 | +SP current --> +---------------------------------------+ 176 <- parent frame + | back chain to caller 4 | + +---------------------------------------+ 180 + | saved CR 4 | + +---------------------------------------+ 184 + | saved LR 4 | + +---------------------------------------+ 188 + | reserved for compilers 4 | + +---------------------------------------+ 192 + | reserved for binders 4 | + +---------------------------------------+ 196 + | saved TOC pointer 4 | + +---------------------------------------+ 200 + | always reserved 8*4=32 we store our | + | GPRs here | + | r3 | + | . | + | r10 | + +---------------------------------------+ 232 + | overflow part | + +---------------------------------------+ xxx + | ???? | + +---------------------------------------+ xxx +*/ + +#if !defined(POWERPC_DARWIN) + +#define MIN_LINE_SIZE 32 + +static void +flush_icache( + char* addr) +{ +#ifndef _AIX + __asm__ volatile ( + "dcbf 0,%0\n" + "sync\n" + "icbi 0,%0\n" + "sync\n" + "isync" + : : "r" (addr) : "memory"); +#endif +} + +static void +flush_range( + char* addr, + int size) +{ + int i; + + for (i = 0; i < size; i += MIN_LINE_SIZE) + flush_icache(addr + i); + + flush_icache(addr + size - 1); +} + +#endif // !defined(POWERPC_DARWIN) + +ffi_status +ffi_prep_closure( + ffi_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif*, void*, void**, void*), + void* user_data) +{ + switch (cif->abi) + { + case FFI_DARWIN: + { + FFI_ASSERT (cif->abi == FFI_DARWIN); + + unsigned int* tramp = (unsigned int*)&closure->tramp[0]; + +#if defined(__ppc64__) + tramp[0] = 0x7c0802a6; // mflr r0 + tramp[1] = 0x429f0005; // bcl 20,31,+0x8 + tramp[2] = 0x7d6802a6; // mflr r11 + tramp[3] = 0x7c0803a6; // mtlr r0 + tramp[4] = 0xe98b0018; // ld r12,24(r11) + tramp[5] = 0x7d8903a6; // mtctr r12 + tramp[6] = 0xe96b0020; // ld r11,32(r11) + tramp[7] = 0x4e800420; // bctr + *(unsigned long*)&tramp[8] = (unsigned long)ffi_closure_ASM; + *(unsigned long*)&tramp[10] = (unsigned long)closure; +#elif defined(__ppc__) + tramp[0] = 0x7c0802a6; // mflr r0 + tramp[1] = 0x429f0005; // bcl 20,31,+0x8 + tramp[2] = 0x7d6802a6; // mflr r11 + tramp[3] = 0x7c0803a6; // mtlr r0 + tramp[4] = 0x818b0018; // lwz r12,24(r11) + tramp[5] = 0x7d8903a6; // mtctr r12 + tramp[6] = 0x816b001c; // lwz r11,28(r11) + tramp[7] = 0x4e800420; // bctr + tramp[8] = (unsigned long)ffi_closure_ASM; + tramp[9] = (unsigned long)closure; +#else +#error undefined architecture +#endif + + closure->cif = cif; + closure->fun = fun; + closure->user_data = user_data; + + // Flush the icache. Only necessary on Darwin. +#if defined(POWERPC_DARWIN) + sys_icache_invalidate(closure->tramp, FFI_TRAMPOLINE_SIZE); +#else + flush_range(closure->tramp, FFI_TRAMPOLINE_SIZE); +#endif + + break; + } + + case FFI_AIX: + { + FFI_ASSERT (cif->abi == FFI_AIX); + + ffi_aix_trampoline_struct* tramp_aix = + (ffi_aix_trampoline_struct*)(closure->tramp); + aix_fd* fd = (aix_fd*)(void*)ffi_closure_ASM; + + tramp_aix->code_pointer = fd->code_pointer; + tramp_aix->toc = fd->toc; + tramp_aix->static_chain = closure; + closure->cif = cif; + closure->fun = fun; + closure->user_data = user_data; + break; + } + + default: + return FFI_BAD_ABI; + } + + return FFI_OK; +} + +#if defined(__ppc__) + typedef double ldbits[2]; + + typedef union + { + ldbits lb; + long double ld; + } ldu; +#endif + +typedef union +{ + float f; + double d; +} ffi_dblfl; + +/* The trampoline invokes ffi_closure_ASM, and on entry, r11 holds the + address of the closure. After storing the registers that could possibly + contain parameters to be passed into the stack frame and setting up space + for a return value, ffi_closure_ASM invokes the following helper function + to do most of the work. */ +int +ffi_closure_helper_DARWIN( + ffi_closure* closure, + void* rvalue, + unsigned long* pgr, + ffi_dblfl* pfr) +{ + /* rvalue is the pointer to space for return value in closure assembly + pgr is the pointer to where r3-r10 are stored in ffi_closure_ASM + pfr is the pointer to where f1-f13 are stored in ffi_closure_ASM. */ + +#if defined(__ppc__) + ldu temp_ld; +#endif + + double temp; + unsigned int i; + unsigned int nf = 0; /* number of FPRs already used. */ + unsigned int ng = 0; /* number of GPRs already used. */ + ffi_cif* cif = closure->cif; + long avn = cif->nargs; + void** avalue = alloca(cif->nargs * sizeof(void*)); + ffi_type** arg_types = cif->arg_types; + + /* Copy the caller's structure return value address so that the closure + returns the data directly to the caller. */ +#if defined(__ppc64__) + if (cif->rtype->type == FFI_TYPE_STRUCT && + ffi64_stret_needs_ptr(cif->rtype, NULL, NULL)) +#elif defined(__ppc__) + if (cif->rtype->type == FFI_TYPE_STRUCT) +#else +#error undefined architecture +#endif + { + rvalue = (void*)*pgr; + pgr++; + ng++; + } + + /* Grab the addresses of the arguments from the stack frame. */ + for (i = 0; i < avn; i++) + { + switch (arg_types[i]->type) + { + case FFI_TYPE_SINT8: + case FFI_TYPE_UINT8: + avalue[i] = (char*)pgr + MODE_CHOICE(3,7); + ng++; + pgr++; + break; + + case FFI_TYPE_SINT16: + case FFI_TYPE_UINT16: + avalue[i] = (char*)pgr + MODE_CHOICE(2,6); + ng++; + pgr++; + break; + +#if defined(__ppc__) + case FFI_TYPE_POINTER: +#endif + case FFI_TYPE_SINT32: + case FFI_TYPE_UINT32: + avalue[i] = (char*)pgr + MODE_CHOICE(0,4); + ng++; + pgr++; + + break; + + case FFI_TYPE_STRUCT: + if (cif->abi == FFI_DARWIN) + { +#if defined(__ppc64__) + unsigned int gprSize = 0; + unsigned int fprSize = 0; + unsigned int savedFPRSize = fprSize; + + avalue[i] = alloca(arg_types[i]->size); + ffi64_struct_to_ram_form(arg_types[i], (const char*)pgr, + &gprSize, (const char*)pfr, &fprSize, &nf, avalue[i], NULL); + + ng += gprSize / sizeof(long); + pgr += gprSize / sizeof(long); + pfr += (fprSize - savedFPRSize) / sizeof(double); + +#elif defined(__ppc__) + /* Structures that match the basic modes (QI 1 byte, HI 2 bytes, + SI 4 bytes) are aligned as if they were those modes. */ + unsigned int size_al = size_al = arg_types[i]->size; + + /* If the first member of the struct is a double, then align + the struct to double-word. */ + if (arg_types[i]->elements[0]->type == FFI_TYPE_DOUBLE) + size_al = ALIGN(arg_types[i]->size, 8); + + if (size_al < 3) + avalue[i] = (void*)pgr + MODE_CHOICE(4,8) - size_al; + else + avalue[i] = (void*)pgr; + + ng += (size_al + 3) / sizeof(long); + pgr += (size_al + 3) / sizeof(long); +#else +#error undefined architecture +#endif + } + + break; + +#if defined(__ppc64__) + case FFI_TYPE_POINTER: +#endif + case FFI_TYPE_SINT64: + case FFI_TYPE_UINT64: + /* Long long ints are passed in 1 or 2 GPRs. */ + avalue[i] = pgr; + ng += MODE_CHOICE(2,1); + pgr += MODE_CHOICE(2,1); + + break; + + case FFI_TYPE_FLOAT: + /* A float value consumes a GPR. + There are 13 64-bit floating point registers. */ + if (nf < NUM_FPR_ARG_REGISTERS) + { + temp = pfr->d; + pfr->f = (float)temp; + avalue[i] = pfr; + pfr++; + } + else + avalue[i] = pgr; + + nf++; + ng++; + pgr++; + break; + + case FFI_TYPE_DOUBLE: + /* A double value consumes one or two GPRs. + There are 13 64bit floating point registers. */ + if (nf < NUM_FPR_ARG_REGISTERS) + { + avalue[i] = pfr; + pfr++; + } + else + avalue[i] = pgr; + + nf++; + ng += MODE_CHOICE(2,1); + pgr += MODE_CHOICE(2,1); + + break; + +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + + case FFI_TYPE_LONGDOUBLE: +#if defined(__ppc64__) + if (nf < NUM_FPR_ARG_REGISTERS) + { + avalue[i] = pfr; + pfr += 2; + } +#elif defined(__ppc__) + /* A long double value consumes 2/4 GPRs and 2 FPRs. + There are 13 64bit floating point registers. */ + if (nf < NUM_FPR_ARG_REGISTERS - 1) + { + avalue[i] = pfr; + pfr += 2; + } + /* Here we have the situation where one part of the long double + is stored in fpr13 and the other part is already on the stack. + We use a union to pass the long double to avalue[i]. */ + else if (nf == NUM_FPR_ARG_REGISTERS - 1) + { + memcpy (&temp_ld.lb[0], pfr, sizeof(temp_ld.lb[0])); + memcpy (&temp_ld.lb[1], pgr + 2, sizeof(temp_ld.lb[1])); + avalue[i] = &temp_ld.ld; + } +#else +#error undefined architecture +#endif + else + avalue[i] = pgr; + + nf += 2; + ng += MODE_CHOICE(4,2); + pgr += MODE_CHOICE(4,2); + + break; + +#endif /* FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE */ + + default: + FFI_ASSERT(0); + break; + } + } + + (closure->fun)(cif, rvalue, avalue, closure->user_data); + + /* Tell ffi_closure_ASM to perform return type promotions. */ + return cif->rtype->type; +} + +#if defined(__ppc64__) + +/* ffi64_struct_to_ram_form + + Rebuild a struct's natural layout from buffers of concatenated registers. + Return the number of registers used. + inGPRs[0-7] == r3, inFPRs[0-7] == f1 ... +*/ +void +ffi64_struct_to_ram_form( + const ffi_type* inType, + const char* inGPRs, + unsigned int* ioGPRMarker, + const char* inFPRs, + unsigned int* ioFPRMarker, + unsigned int* ioFPRsUsed, + char* outStruct, // caller-allocated + unsigned int* ioStructMarker) +{ + unsigned int srcGMarker = 0; + unsigned int srcFMarker = 0; + unsigned int savedFMarker = 0; + unsigned int fprsUsed = 0; + unsigned int savedFPRsUsed = 0; + unsigned int destMarker = 0; + + static unsigned int recurseCount = 0; + + if (ioGPRMarker) + srcGMarker = *ioGPRMarker; + + if (ioFPRMarker) + { + srcFMarker = *ioFPRMarker; + savedFMarker = srcFMarker; + } + + if (ioFPRsUsed) + { + fprsUsed = *ioFPRsUsed; + savedFPRsUsed = fprsUsed; + } + + if (ioStructMarker) + destMarker = *ioStructMarker; + + size_t i; + + switch (inType->size) + { + case 1: case 2: case 4: + srcGMarker += 8 - inType->size; + break; + + default: + break; + } + + for (i = 0; inType->elements[i] != NULL; i++) + { + switch (inType->elements[i]->type) + { + case FFI_TYPE_FLOAT: + srcFMarker = ALIGN(srcFMarker, 4); + srcGMarker = ALIGN(srcGMarker, 4); + destMarker = ALIGN(destMarker, 4); + + if (fprsUsed < NUM_FPR_ARG_REGISTERS) + { + *(float*)&outStruct[destMarker] = + (float)*(double*)&inFPRs[srcFMarker]; + srcFMarker += 8; + fprsUsed++; + } + else + *(float*)&outStruct[destMarker] = + (float)*(double*)&inGPRs[srcGMarker]; + + srcGMarker += 4; + destMarker += 4; + + // Skip to next GPR if next element won't fit and we're + // not already at a register boundary. + if (inType->elements[i + 1] != NULL && (destMarker % 8)) + { + if (!FFI_TYPE_1_BYTE(inType->elements[i + 1]->type) && + (!FFI_TYPE_2_BYTE(inType->elements[i + 1]->type) || + (ALIGN(srcGMarker, 8) - srcGMarker) < 2) && + (!FFI_TYPE_4_BYTE(inType->elements[i + 1]->type) || + (ALIGN(srcGMarker, 8) - srcGMarker) < 4)) + srcGMarker = ALIGN(srcGMarker, 8); + } + + break; + + case FFI_TYPE_DOUBLE: + srcFMarker = ALIGN(srcFMarker, 8); + destMarker = ALIGN(destMarker, 8); + + if (fprsUsed < NUM_FPR_ARG_REGISTERS) + { + *(double*)&outStruct[destMarker] = + *(double*)&inFPRs[srcFMarker]; + srcFMarker += 8; + fprsUsed++; + } + else + *(double*)&outStruct[destMarker] = + *(double*)&inGPRs[srcGMarker]; + + destMarker += 8; + + // Skip next GPR + srcGMarker += 8; + srcGMarker = ALIGN(srcGMarker, 8); + + break; + + case FFI_TYPE_LONGDOUBLE: + destMarker = ALIGN(destMarker, 16); + + if (fprsUsed < NUM_FPR_ARG_REGISTERS) + { + srcFMarker = ALIGN(srcFMarker, 8); + srcGMarker = ALIGN(srcGMarker, 8); + *(long double*)&outStruct[destMarker] = + *(long double*)&inFPRs[srcFMarker]; + srcFMarker += 16; + fprsUsed += 2; + } + else + { + srcFMarker = ALIGN(srcFMarker, 16); + srcGMarker = ALIGN(srcGMarker, 16); + *(long double*)&outStruct[destMarker] = + *(long double*)&inGPRs[srcGMarker]; + } + + destMarker += 16; + + // Skip next 2 GPRs + srcGMarker += 16; + srcGMarker = ALIGN(srcGMarker, 8); + + break; + + case FFI_TYPE_UINT8: + case FFI_TYPE_SINT8: + { + if (inType->alignment == 1) // chars only + { + if (inType->size == 1) + outStruct[destMarker++] = inGPRs[srcGMarker++]; + else if (inType->size == 2) + { + outStruct[destMarker++] = inGPRs[srcGMarker++]; + outStruct[destMarker++] = inGPRs[srcGMarker++]; + i++; + } + else + { + memcpy(&outStruct[destMarker], + &inGPRs[srcGMarker], inType->size); + srcGMarker += inType->size; + destMarker += inType->size; + i += inType->size - 1; + } + } + else // chars and other stuff + { + outStruct[destMarker++] = inGPRs[srcGMarker++]; + + // Skip to next GPR if next element won't fit and we're + // not already at a register boundary. + if (inType->elements[i + 1] != NULL && (srcGMarker % 8)) + { + if (!FFI_TYPE_1_BYTE(inType->elements[i + 1]->type) && + (!FFI_TYPE_2_BYTE(inType->elements[i + 1]->type) || + (ALIGN(srcGMarker, 8) - srcGMarker) < 2) && + (!FFI_TYPE_4_BYTE(inType->elements[i + 1]->type) || + (ALIGN(srcGMarker, 8) - srcGMarker) < 4)) + srcGMarker = ALIGN(srcGMarker, inType->alignment); // was 8 + } + } + + break; + } + + case FFI_TYPE_UINT16: + case FFI_TYPE_SINT16: + srcGMarker = ALIGN(srcGMarker, 2); + destMarker = ALIGN(destMarker, 2); + + *(short*)&outStruct[destMarker] = + *(short*)&inGPRs[srcGMarker]; + srcGMarker += 2; + destMarker += 2; + + break; + + case FFI_TYPE_INT: + case FFI_TYPE_UINT32: + case FFI_TYPE_SINT32: + srcGMarker = ALIGN(srcGMarker, 4); + destMarker = ALIGN(destMarker, 4); + + *(int*)&outStruct[destMarker] = + *(int*)&inGPRs[srcGMarker]; + srcGMarker += 4; + destMarker += 4; + + break; + + case FFI_TYPE_POINTER: + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + srcGMarker = ALIGN(srcGMarker, 8); + destMarker = ALIGN(destMarker, 8); + + *(long long*)&outStruct[destMarker] = + *(long long*)&inGPRs[srcGMarker]; + srcGMarker += 8; + destMarker += 8; + + break; + + case FFI_TYPE_STRUCT: + recurseCount++; + ffi64_struct_to_ram_form(inType->elements[i], inGPRs, + &srcGMarker, inFPRs, &srcFMarker, &fprsUsed, + outStruct, &destMarker); + recurseCount--; + break; + + default: + FFI_ASSERT(0); // unknown element type + break; + } + } + + srcGMarker = ALIGN(srcGMarker, inType->alignment); + + // Take care of the special case for 16-byte structs, but not for + // nested structs. + if (recurseCount == 0 && srcGMarker == 16) + { + *(long double*)&outStruct[0] = *(long double*)&inGPRs[0]; + srcFMarker = savedFMarker; + fprsUsed = savedFPRsUsed; + } + + if (ioGPRMarker) + *ioGPRMarker = ALIGN(srcGMarker, 8); + + if (ioFPRMarker) + *ioFPRMarker = srcFMarker; + + if (ioFPRsUsed) + *ioFPRsUsed = fprsUsed; + + if (ioStructMarker) + *ioStructMarker = ALIGN(destMarker, 8); +} + +/* ffi64_struct_to_reg_form + + Copy a struct's elements into buffers that can be sliced into registers. + Return the sizes of the output buffers in bytes. Pass NULL buffer pointers + to calculate size only. + outGPRs[0-7] == r3, outFPRs[0-7] == f1 ... +*/ +void +ffi64_struct_to_reg_form( + const ffi_type* inType, + const char* inStruct, + unsigned int* ioStructMarker, + unsigned int* ioFPRsUsed, + char* outGPRs, // caller-allocated + unsigned int* ioGPRSize, + char* outFPRs, // caller-allocated + unsigned int* ioFPRSize) +{ + size_t i; + unsigned int srcMarker = 0; + unsigned int destGMarker = 0; + unsigned int destFMarker = 0; + unsigned int savedFMarker = 0; + unsigned int fprsUsed = 0; + unsigned int savedFPRsUsed = 0; + + static unsigned int recurseCount = 0; + + if (ioStructMarker) + srcMarker = *ioStructMarker; + + if (ioFPRsUsed) + { + fprsUsed = *ioFPRsUsed; + savedFPRsUsed = fprsUsed; + } + + if (ioGPRSize) + destGMarker = *ioGPRSize; + + if (ioFPRSize) + { + destFMarker = *ioFPRSize; + savedFMarker = destFMarker; + } + + switch (inType->size) + { + case 1: case 2: case 4: + destGMarker += 8 - inType->size; + break; + + default: + break; + } + + for (i = 0; inType->elements[i] != NULL; i++) + { + switch (inType->elements[i]->type) + { + // Shadow floating-point types in GPRs for vararg and pre-ANSI + // functions. + case FFI_TYPE_FLOAT: + // Nudge markers to next 4/8-byte boundary + srcMarker = ALIGN(srcMarker, 4); + destGMarker = ALIGN(destGMarker, 4); + destFMarker = ALIGN(destFMarker, 8); + + if (fprsUsed < NUM_FPR_ARG_REGISTERS) + { + if (outFPRs != NULL && inStruct != NULL) + *(double*)&outFPRs[destFMarker] = + (double)*(float*)&inStruct[srcMarker]; + + destFMarker += 8; + fprsUsed++; + } + + if (outGPRs != NULL && inStruct != NULL) + *(double*)&outGPRs[destGMarker] = + (double)*(float*)&inStruct[srcMarker]; + + srcMarker += 4; + destGMarker += 4; + + // Skip to next GPR if next element won't fit and we're + // not already at a register boundary. + if (inType->elements[i + 1] != NULL && (srcMarker % 8)) + { + if (!FFI_TYPE_1_BYTE(inType->elements[i + 1]->type) && + (!FFI_TYPE_2_BYTE(inType->elements[i + 1]->type) || + (ALIGN(destGMarker, 8) - destGMarker) < 2) && + (!FFI_TYPE_4_BYTE(inType->elements[i + 1]->type) || + (ALIGN(destGMarker, 8) - destGMarker) < 4)) + destGMarker = ALIGN(destGMarker, 8); + } + + break; + + case FFI_TYPE_DOUBLE: + srcMarker = ALIGN(srcMarker, 8); + destFMarker = ALIGN(destFMarker, 8); + + if (fprsUsed < NUM_FPR_ARG_REGISTERS) + { + if (outFPRs != NULL && inStruct != NULL) + *(double*)&outFPRs[destFMarker] = + *(double*)&inStruct[srcMarker]; + + destFMarker += 8; + fprsUsed++; + } + + if (outGPRs != NULL && inStruct != NULL) + *(double*)&outGPRs[destGMarker] = + *(double*)&inStruct[srcMarker]; + + srcMarker += 8; + + // Skip next GPR + destGMarker += 8; + destGMarker = ALIGN(destGMarker, 8); + + break; + + case FFI_TYPE_LONGDOUBLE: + srcMarker = ALIGN(srcMarker, 16); + + if (fprsUsed < NUM_FPR_ARG_REGISTERS) + { + destFMarker = ALIGN(destFMarker, 8); + destGMarker = ALIGN(destGMarker, 8); + + if (outFPRs != NULL && inStruct != NULL) + *(long double*)&outFPRs[destFMarker] = + *(long double*)&inStruct[srcMarker]; + + if (outGPRs != NULL && inStruct != NULL) + *(long double*)&outGPRs[destGMarker] = + *(long double*)&inStruct[srcMarker]; + + destFMarker += 16; + fprsUsed += 2; + } + else + { + destGMarker = ALIGN(destGMarker, 16); + + if (outGPRs != NULL && inStruct != NULL) + *(long double*)&outGPRs[destGMarker] = + *(long double*)&inStruct[srcMarker]; + } + + srcMarker += 16; + destGMarker += 16; // Skip next 2 GPRs + destGMarker = ALIGN(destGMarker, 8); // was 16 + + break; + + case FFI_TYPE_UINT8: + case FFI_TYPE_SINT8: + if (inType->alignment == 1) // bytes only + { + if (inType->size == 1) + { + if (outGPRs != NULL && inStruct != NULL) + outGPRs[destGMarker] = inStruct[srcMarker]; + + srcMarker++; + destGMarker++; + } + else if (inType->size == 2) + { + if (outGPRs != NULL && inStruct != NULL) + { + outGPRs[destGMarker] = inStruct[srcMarker]; + outGPRs[destGMarker + 1] = inStruct[srcMarker + 1]; + } + + srcMarker += 2; + destGMarker += 2; + + i++; + } + else + { + if (outGPRs != NULL && inStruct != NULL) + { + // Avoid memcpy for small chunks. + if (inType->size <= sizeof(long)) + *(long*)&outGPRs[destGMarker] = + *(long*)&inStruct[srcMarker]; + else + memcpy(&outGPRs[destGMarker], + &inStruct[srcMarker], inType->size); + } + + srcMarker += inType->size; + destGMarker += inType->size; + i += inType->size - 1; + } + } + else // bytes and other stuff + { + if (outGPRs != NULL && inStruct != NULL) + outGPRs[destGMarker] = inStruct[srcMarker]; + + srcMarker++; + destGMarker++; + + // Skip to next GPR if next element won't fit and we're + // not already at a register boundary. + if (inType->elements[i + 1] != NULL && (destGMarker % 8)) + { + if (!FFI_TYPE_1_BYTE(inType->elements[i + 1]->type) && + (!FFI_TYPE_2_BYTE(inType->elements[i + 1]->type) || + (ALIGN(destGMarker, 8) - destGMarker) < 2) && + (!FFI_TYPE_4_BYTE(inType->elements[i + 1]->type) || + (ALIGN(destGMarker, 8) - destGMarker) < 4)) + destGMarker = ALIGN(destGMarker, inType->alignment); // was 8 + } + } + + break; + + case FFI_TYPE_UINT16: + case FFI_TYPE_SINT16: + srcMarker = ALIGN(srcMarker, 2); + destGMarker = ALIGN(destGMarker, 2); + + if (outGPRs != NULL && inStruct != NULL) + *(short*)&outGPRs[destGMarker] = + *(short*)&inStruct[srcMarker]; + + srcMarker += 2; + destGMarker += 2; + + if (inType->elements[i + 1] == NULL) + destGMarker = ALIGN(destGMarker, inType->alignment); + + break; + + case FFI_TYPE_INT: + case FFI_TYPE_UINT32: + case FFI_TYPE_SINT32: + srcMarker = ALIGN(srcMarker, 4); + destGMarker = ALIGN(destGMarker, 4); + + if (outGPRs != NULL && inStruct != NULL) + *(int*)&outGPRs[destGMarker] = + *(int*)&inStruct[srcMarker]; + + srcMarker += 4; + destGMarker += 4; + + break; + + case FFI_TYPE_POINTER: + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + srcMarker = ALIGN(srcMarker, 8); + destGMarker = ALIGN(destGMarker, 8); + + if (outGPRs != NULL && inStruct != NULL) + *(long long*)&outGPRs[destGMarker] = + *(long long*)&inStruct[srcMarker]; + + srcMarker += 8; + destGMarker += 8; + + if (inType->elements[i + 1] == NULL) + destGMarker = ALIGN(destGMarker, inType->alignment); + + break; + + case FFI_TYPE_STRUCT: + recurseCount++; + ffi64_struct_to_reg_form(inType->elements[i], + inStruct, &srcMarker, &fprsUsed, outGPRs, + &destGMarker, outFPRs, &destFMarker); + recurseCount--; + break; + + default: + FFI_ASSERT(0); + break; + } + } + + destGMarker = ALIGN(destGMarker, inType->alignment); + + // Take care of the special case for 16-byte structs, but not for + // nested structs. + if (recurseCount == 0 && destGMarker == 16) + { + if (outGPRs != NULL && inStruct != NULL) + *(long double*)&outGPRs[0] = *(long double*)&inStruct[0]; + + destFMarker = savedFMarker; + fprsUsed = savedFPRsUsed; + } + + if (ioStructMarker) + *ioStructMarker = ALIGN(srcMarker, 8); + + if (ioFPRsUsed) + *ioFPRsUsed = fprsUsed; + + if (ioGPRSize) + *ioGPRSize = ALIGN(destGMarker, 8); + + if (ioFPRSize) + *ioFPRSize = ALIGN(destFMarker, 8); +} + +/* ffi64_stret_needs_ptr + + Determine whether a returned struct needs a pointer in r3 or can fit + in registers. +*/ + +bool +ffi64_stret_needs_ptr( + const ffi_type* inType, + unsigned short* ioGPRCount, + unsigned short* ioFPRCount) +{ + // Obvious case first- struct is larger than combined FPR size. + if (inType->size > 14 * 8) + return true; + + // Now the struct can physically fit in registers, determine if it + // also fits logically. + bool needsPtr = false; + unsigned short gprsUsed = 0; + unsigned short fprsUsed = 0; + size_t i; + + if (ioGPRCount) + gprsUsed = *ioGPRCount; + + if (ioFPRCount) + fprsUsed = *ioFPRCount; + + for (i = 0; inType->elements[i] != NULL && !needsPtr; i++) + { + switch (inType->elements[i]->type) + { + case FFI_TYPE_FLOAT: + case FFI_TYPE_DOUBLE: + gprsUsed++; + fprsUsed++; + + if (fprsUsed > 13) + needsPtr = true; + + break; + + case FFI_TYPE_LONGDOUBLE: + gprsUsed += 2; + fprsUsed += 2; + + if (fprsUsed > 14) + needsPtr = true; + + break; + + case FFI_TYPE_UINT8: + case FFI_TYPE_SINT8: + { + gprsUsed++; + + if (gprsUsed > 8) + { + needsPtr = true; + break; + } + + if (inType->elements[i + 1] == NULL) // last byte in the struct + break; + + // Count possible contiguous bytes ahead, up to 8. + unsigned short j; + + for (j = 1; j < 8; j++) + { + if (inType->elements[i + j] == NULL || + !FFI_TYPE_1_BYTE(inType->elements[i + j]->type)) + break; + } + + i += j - 1; // allow for i++ before the test condition + + break; + } + + case FFI_TYPE_UINT16: + case FFI_TYPE_SINT16: + case FFI_TYPE_INT: + case FFI_TYPE_UINT32: + case FFI_TYPE_SINT32: + case FFI_TYPE_POINTER: + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + gprsUsed++; + + if (gprsUsed > 8) + needsPtr = true; + + break; + + case FFI_TYPE_STRUCT: + needsPtr = ffi64_stret_needs_ptr( + inType->elements[i], &gprsUsed, &fprsUsed); + + break; + + default: + FFI_ASSERT(0); + break; + } + } + + if (ioGPRCount) + *ioGPRCount = gprsUsed; + + if (ioFPRCount) + *ioFPRCount = fprsUsed; + + return needsPtr; +} + +/* ffi64_data_size + + Calculate the size in bytes of an ffi type. +*/ + +unsigned int +ffi64_data_size( + const ffi_type* inType) +{ + unsigned int size = 0; + + switch (inType->type) + { + case FFI_TYPE_UINT8: + case FFI_TYPE_SINT8: + size = 1; + break; + + case FFI_TYPE_UINT16: + case FFI_TYPE_SINT16: + size = 2; + break; + + case FFI_TYPE_INT: + case FFI_TYPE_UINT32: + case FFI_TYPE_SINT32: + case FFI_TYPE_FLOAT: + size = 4; + break; + + case FFI_TYPE_POINTER: + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + case FFI_TYPE_DOUBLE: + size = 8; + break; + + case FFI_TYPE_LONGDOUBLE: + size = 16; + break; + + case FFI_TYPE_STRUCT: + ffi64_struct_to_reg_form( + inType, NULL, NULL, NULL, NULL, &size, NULL, NULL); + break; + + case FFI_TYPE_VOID: + break; + + default: + FFI_ASSERT(0); + break; + } + + return size; +} + +#endif /* defined(__ppc64__) */ +#endif /* __ppc__ || __ppc64__ */ diff -r -u ./Modules/_ctypes/libffi_osx/powerpc/ppc64-darwin_closure.S ./Modules/_ctypes/libffi_osx/powerpc/ppc64-darwin_closure.S new file mode 100644 index 0000000..7162fa1 --- /dev/null +++ ./Modules/_ctypes/libffi_osx/powerpc/ppc64-darwin_closure.S @@ -0,0 +1,418 @@ +#if defined(__ppc64__) + +/* ----------------------------------------------------------------------- + ppc64-darwin_closure.S - Copyright (c) 2002, 2003, 2004, Free Software Foundation, + Inc. based on ppc_closure.S + + PowerPC Assembly glue. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#define LIBFFI_ASM + +#include +#include // for FFI_TRAMPOLINE_SIZE +#include +#include + + .file "ppc64-darwin_closure.S" +.text + .align LOG2_GPR_BYTES + .globl _ffi_closure_ASM + +.text + .align LOG2_GPR_BYTES + +_ffi_closure_ASM: +LFB1: + mflr r0 + stg r0,SF_RETURN(r1) // save return address + + // Save GPRs 3 - 10 (aligned to 8) in the parents outgoing area. + stg r3,SF_ARG1(r1) + stg r4,SF_ARG2(r1) + stg r5,SF_ARG3(r1) + stg r6,SF_ARG4(r1) + stg r7,SF_ARG5(r1) + stg r8,SF_ARG6(r1) + stg r9,SF_ARG7(r1) + stg r10,SF_ARG8(r1) + +LCFI0: +/* 48 bytes (Linkage Area) + 64 bytes (outgoing parameter area, always reserved) + 112 bytes (14*8 for incoming FPR) + ? bytes (result) + 112 bytes (14*8 for outgoing FPR) + 16 bytes (2 saved registers) + 352 + ? total bytes +*/ + + std r31,-8(r1) // Save registers we use. + std r30,-16(r1) + mr r30,r1 // Save the old SP. + mr r31,r11 // Save the ffi_closure around ffi64_data_size. + + // Calculate the space we need. + stdu r1,-SF_MINSIZE(r1) + ld r3,FFI_TRAMPOLINE_SIZE(r31) // ffi_closure->cif* + ld r3,16(r3) // ffi_cif->rtype* + bl Lffi64_data_size$stub + ld r1,0(r1) + + addi r3,r3,352 // Add our overhead. + neg r3,r3 + li r0,-32 // Align to 32 bytes. + and r3,r3,r0 + stdux r1,r1,r3 // Grow the stack. + + mr r11,r31 // Copy the ffi_closure back. + +LCFI1: + // We want to build up an area for the parameters passed + // in registers. (both floating point and integer) + +/* 320 bytes (callee stack frame aligned to 32) + 48 bytes (caller linkage area) + 368 (start of caller parameter area aligned to 8) +*/ + + // Save FPRs 1 - 14. (aligned to 8) + stfd f1,112(r1) + stfd f2,120(r1) + stfd f3,128(r1) + stfd f4,136(r1) + stfd f5,144(r1) + stfd f6,152(r1) + stfd f7,160(r1) + stfd f8,168(r1) + stfd f9,176(r1) + stfd f10,184(r1) + stfd f11,192(r1) + stfd f12,200(r1) + stfd f13,208(r1) + stfd f14,216(r1) + + // Set up registers for the routine that actually does the work. + mr r3,r11 // context pointer from the trampoline + addi r4,r1,224 // result storage + addi r5,r30,SF_ARG1 // saved GPRs + addi r6,r1,112 // saved FPRs + bl Lffi_closure_helper_DARWIN$stub + + // Look the proper starting point in table + // by using return type as an offset. + addi r5,r1,224 // Get pointer to results area. + bl Lget_ret_type0_addr // Get pointer to Lret_type0 into LR. + mflr r4 // Move to r4. + slwi r3,r3,4 // Now multiply return type by 16. + add r3,r3,r4 // Add contents of table to table address. + mtctr r3 + bctr + +LFE1: + // Each of the ret_typeX code fragments has to be exactly 16 bytes long + // (4 instructions). For cache effectiveness we align to a 16 byte + // boundary first. + .align 4 + nop + nop + nop + +Lget_ret_type0_addr: + blrl + +// case FFI_TYPE_VOID +Lret_type0: + b Lfinish + nop + nop + nop + +// case FFI_TYPE_INT +Lret_type1: + lwz r3,4(r5) + b Lfinish + nop + nop + +// case FFI_TYPE_FLOAT +Lret_type2: + lfs f1,0(r5) + b Lfinish + nop + nop + +// case FFI_TYPE_DOUBLE +Lret_type3: + lfd f1,0(r5) + b Lfinish + nop + nop + +// case FFI_TYPE_LONGDOUBLE +Lret_type4: + lfd f1,0(r5) + lfd f2,8(r5) + b Lfinish + nop + +// case FFI_TYPE_UINT8 +Lret_type5: + lbz r3,7(r5) + b Lfinish + nop + nop + +// case FFI_TYPE_SINT8 +Lret_type6: + lbz r3,7(r5) + extsb r3,r3 + b Lfinish + nop + +// case FFI_TYPE_UINT16 +Lret_type7: + lhz r3,6(r5) + b Lfinish + nop + nop + +// case FFI_TYPE_SINT16 +Lret_type8: + lha r3,6(r5) + b Lfinish + nop + nop + +// case FFI_TYPE_UINT32 +Lret_type9: // same as Lret_type1 + lwz r3,4(r5) + b Lfinish + nop + nop + +// case FFI_TYPE_SINT32 +Lret_type10: // same as Lret_type1 + lwz r3,4(r5) + b Lfinish + nop + nop + +// case FFI_TYPE_UINT64 +Lret_type11: + ld r3,0(r5) + b Lfinish + nop + nop + +// case FFI_TYPE_SINT64 +Lret_type12: // same as Lret_type11 + ld r3,0(r5) + b Lfinish + nop + nop + +// case FFI_TYPE_STRUCT +Lret_type13: + b Lret_struct + nop + nop + nop + +// ** End 16-byte aligned cases ** +// case FFI_TYPE_POINTER +// This case assumes that FFI_TYPE_POINTER == FFI_TYPE_LAST. If more types +// are added in future, the following code will need to be updated and +// padded to 16 bytes. +Lret_type14: + lg r3,0(r5) + b Lfinish + +// copy struct into registers +Lret_struct: + ld r31,FFI_TRAMPOLINE_SIZE(r31) // ffi_closure->cif* + ld r3,16(r31) // ffi_cif->rtype* + ld r31,24(r31) // ffi_cif->flags + mr r4,r5 // copy struct* to 2nd arg + addi r7,r1,SF_ARG9 // GPR return area + addi r9,r30,-16-(14*8) // FPR return area + li r5,0 // struct offset ptr (NULL) + li r6,0 // FPR used count ptr (NULL) + li r8,0 // GPR return area size ptr (NULL) + li r10,0 // FPR return area size ptr (NULL) + bl Lffi64_struct_to_reg_form$stub + + // Load GPRs + ld r3,SF_ARG9(r1) + ld r4,SF_ARG10(r1) + ld r5,SF_ARG11(r1) + ld r6,SF_ARG12(r1) + nop + ld r7,SF_ARG13(r1) + ld r8,SF_ARG14(r1) + ld r9,SF_ARG15(r1) + ld r10,SF_ARG16(r1) + nop + + // Load FPRs + mtcrf 0x2,r31 + bf 26,Lfinish + lfd f1,-16-(14*8)(r30) + lfd f2,-16-(13*8)(r30) + lfd f3,-16-(12*8)(r30) + lfd f4,-16-(11*8)(r30) + nop + lfd f5,-16-(10*8)(r30) + lfd f6,-16-(9*8)(r30) + lfd f7,-16-(8*8)(r30) + lfd f8,-16-(7*8)(r30) + nop + lfd f9,-16-(6*8)(r30) + lfd f10,-16-(5*8)(r30) + lfd f11,-16-(4*8)(r30) + lfd f12,-16-(3*8)(r30) + nop + lfd f13,-16-(2*8)(r30) + lfd f14,-16-(1*8)(r30) + // Fall through + +// case done +Lfinish: + lg r1,0(r1) // Restore stack pointer. + ld r31,-8(r1) // Restore registers we used. + ld r30,-16(r1) + lg r0,SF_RETURN(r1) // Get return address. + mtlr r0 // Reset link register. + blr + +// END(ffi_closure_ASM) + +.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support +EH_frame1: + .set L$set$0,LECIE1-LSCIE1 + .long L$set$0 ; Length of Common Information Entry +LSCIE1: + .long 0x0 ; CIE Identifier Tag + .byte 0x1 ; CIE Version + .ascii "zR\0" ; CIE Augmentation + .byte 0x1 ; uleb128 0x1; CIE Code Alignment Factor + .byte 0x7c ; sleb128 -4; CIE Data Alignment Factor + .byte 0x41 ; CIE RA Column + .byte 0x1 ; uleb128 0x1; Augmentation size + .byte 0x10 ; FDE Encoding (pcrel) + .byte 0xc ; DW_CFA_def_cfa + .byte 0x1 ; uleb128 0x1 + .byte 0x0 ; uleb128 0x0 + .align LOG2_GPR_BYTES +LECIE1: +.globl _ffi_closure_ASM.eh +_ffi_closure_ASM.eh: +LSFDE1: + .set L$set$1,LEFDE1-LASFDE1 + .long L$set$1 ; FDE Length + +LASFDE1: + .long LASFDE1-EH_frame1 ; FDE CIE offset + .g_long LFB1-. ; FDE initial location + .set L$set$3,LFE1-LFB1 + .g_long L$set$3 ; FDE address range + .byte 0x0 ; uleb128 0x0; Augmentation size + .byte 0x4 ; DW_CFA_advance_loc4 + .set L$set$3,LCFI1-LCFI0 + .long L$set$3 + .byte 0xe ; DW_CFA_def_cfa_offset + .byte 176,1 ; uleb128 176 + .byte 0x4 ; DW_CFA_advance_loc4 + .set L$set$4,LCFI0-LFB1 + .long L$set$4 + .byte 0x11 ; DW_CFA_offset_extended_sf + .byte 0x41 ; uleb128 0x41 + .byte 0x7e ; sleb128 -2 + .align LOG2_GPR_BYTES + +LEFDE1: +.data + .align LOG2_GPR_BYTES +LDFCM0: +.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 + .align LOG2_GPR_BYTES + +Lffi_closure_helper_DARWIN$stub: + .indirect_symbol _ffi_closure_helper_DARWIN + mflr r0 + bcl 20,31,LO$ffi_closure_helper_DARWIN + +LO$ffi_closure_helper_DARWIN: + mflr r11 + addis r11,r11,ha16(L_ffi_closure_helper_DARWIN$lazy_ptr - LO$ffi_closure_helper_DARWIN) + mtlr r0 + lgu r12,lo16(L_ffi_closure_helper_DARWIN$lazy_ptr - LO$ffi_closure_helper_DARWIN)(r11) + mtctr r12 + bctr + +.lazy_symbol_pointer +L_ffi_closure_helper_DARWIN$lazy_ptr: + .indirect_symbol _ffi_closure_helper_DARWIN + .g_long dyld_stub_binding_helper + +.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 + .align LOG2_GPR_BYTES + +Lffi64_struct_to_reg_form$stub: + .indirect_symbol _ffi64_struct_to_reg_form + mflr r0 + bcl 20,31,LO$ffi64_struct_to_reg_form + +LO$ffi64_struct_to_reg_form: + mflr r11 + addis r11,r11,ha16(L_ffi64_struct_to_reg_form$lazy_ptr - LO$ffi64_struct_to_reg_form) + mtlr r0 + lgu r12,lo16(L_ffi64_struct_to_reg_form$lazy_ptr - LO$ffi64_struct_to_reg_form)(r11) + mtctr r12 + bctr + +.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 + .align LOG2_GPR_BYTES + +Lffi64_data_size$stub: + .indirect_symbol _ffi64_data_size + mflr r0 + bcl 20,31,LO$ffi64_data_size + +LO$ffi64_data_size: + mflr r11 + addis r11,r11,ha16(L_ffi64_data_size$lazy_ptr - LO$ffi64_data_size) + mtlr r0 + lgu r12,lo16(L_ffi64_data_size$lazy_ptr - LO$ffi64_data_size)(r11) + mtctr r12 + bctr + +.lazy_symbol_pointer +L_ffi64_struct_to_reg_form$lazy_ptr: + .indirect_symbol _ffi64_struct_to_reg_form + .g_long dyld_stub_binding_helper + +L_ffi64_data_size$lazy_ptr: + .indirect_symbol _ffi64_data_size + .g_long dyld_stub_binding_helper + +#endif // __ppc64__ diff -r -u ./Modules/_ctypes/libffi_osx/types.c ./Modules/_ctypes/libffi_osx/types.c new file mode 100644 index 0000000..44806ae --- /dev/null +++ ./Modules/_ctypes/libffi_osx/types.c @@ -0,0 +1,115 @@ +/* ----------------------------------------------------------------------- + types.c - Copyright (c) 1996, 1998 Red Hat, Inc. + + Predefined ffi_types needed by libffi. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#include +#include + +/* Type definitions */ +#define FFI_INTEGRAL_TYPEDEF(n, s, a, t) \ + ffi_type ffi_type_##n = { s, a, t, NULL } +#define FFI_AGGREGATE_TYPEDEF(n, e) \ + ffi_type ffi_type_##n = { 0, 0, FFI_TYPE_STRUCT, e } + +FFI_INTEGRAL_TYPEDEF(uint8, 1, 1, FFI_TYPE_UINT8); +FFI_INTEGRAL_TYPEDEF(sint8, 1, 1, FFI_TYPE_SINT8); +FFI_INTEGRAL_TYPEDEF(uint16, 2, 2, FFI_TYPE_UINT16); +FFI_INTEGRAL_TYPEDEF(sint16, 2, 2, FFI_TYPE_SINT16); +FFI_INTEGRAL_TYPEDEF(uint32, 4, 4, FFI_TYPE_UINT32); +FFI_INTEGRAL_TYPEDEF(sint32, 4, 4, FFI_TYPE_SINT32); +FFI_INTEGRAL_TYPEDEF(float, 4, 4, FFI_TYPE_FLOAT); + +/* Size and alignment are fake here. They must not be 0. */ +FFI_INTEGRAL_TYPEDEF(void, 1, 1, FFI_TYPE_VOID); + +#if defined ALPHA || defined SPARC64 || defined X86_64 || \ + defined S390X || defined IA64 || defined POWERPC64 +FFI_INTEGRAL_TYPEDEF(pointer, 8, 8, FFI_TYPE_POINTER); +#else +FFI_INTEGRAL_TYPEDEF(pointer, 4, 4, FFI_TYPE_POINTER); +#endif + +#if defined X86 || defined ARM || defined M68K || defined(X86_DARWIN) + +# ifdef X86_64 + FFI_INTEGRAL_TYPEDEF(uint64, 8, 8, FFI_TYPE_UINT64); + FFI_INTEGRAL_TYPEDEF(sint64, 8, 8, FFI_TYPE_SINT64); +# else + FFI_INTEGRAL_TYPEDEF(uint64, 8, 4, FFI_TYPE_UINT64); + FFI_INTEGRAL_TYPEDEF(sint64, 8, 4, FFI_TYPE_SINT64); +# endif + +#elif defined(POWERPC_DARWIN) +FFI_INTEGRAL_TYPEDEF(uint64, 8, 8, FFI_TYPE_UINT64); +FFI_INTEGRAL_TYPEDEF(sint64, 8, 8, FFI_TYPE_SINT64); +#elif defined SH +FFI_INTEGRAL_TYPEDEF(uint64, 8, 4, FFI_TYPE_UINT64); +FFI_INTEGRAL_TYPEDEF(sint64, 8, 4, FFI_TYPE_SINT64); +#else +FFI_INTEGRAL_TYPEDEF(uint64, 8, 8, FFI_TYPE_UINT64); +FFI_INTEGRAL_TYPEDEF(sint64, 8, 8, FFI_TYPE_SINT64); +#endif + +#if defined X86 || defined X86_WIN32 || defined M68K || defined(X86_DARWIN) + +# if defined X86_WIN32 || defined X86_64 + FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE); +# else + FFI_INTEGRAL_TYPEDEF(double, 8, 4, FFI_TYPE_DOUBLE); +# endif + +# ifdef X86_DARWIN + FFI_INTEGRAL_TYPEDEF(longdouble, 16, 16, FFI_TYPE_LONGDOUBLE); +# else + FFI_INTEGRAL_TYPEDEF(longdouble, 12, 4, FFI_TYPE_LONGDOUBLE); +# endif + +#elif defined ARM || defined SH || defined POWERPC_AIX +FFI_INTEGRAL_TYPEDEF(double, 8, 4, FFI_TYPE_DOUBLE); +FFI_INTEGRAL_TYPEDEF(longdouble, 8, 4, FFI_TYPE_LONGDOUBLE); +#elif defined POWERPC_DARWIN +FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE); + +# if __GNUC__ >= 4 + FFI_INTEGRAL_TYPEDEF(longdouble, 16, 16, FFI_TYPE_LONGDOUBLE); +# else + FFI_INTEGRAL_TYPEDEF(longdouble, 8, 8, FFI_TYPE_LONGDOUBLE); +# endif + +#elif defined SPARC +FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE); + +# ifdef SPARC64 + FFI_INTEGRAL_TYPEDEF(longdouble, 16, 16, FFI_TYPE_LONGDOUBLE); +# else + FFI_INTEGRAL_TYPEDEF(longdouble, 16, 8, FFI_TYPE_LONGDOUBLE); +# endif + +#elif defined X86_64 || defined POWERPC64 +FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE); +FFI_INTEGRAL_TYPEDEF(longdouble, 16, 16, FFI_TYPE_LONGDOUBLE); +#else +FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE); +FFI_INTEGRAL_TYPEDEF(longdouble, 8, 8, FFI_TYPE_LONGDOUBLE); +#endif \ No newline at end of file diff -r -u ./Modules/_ctypes/libffi_osx/x86/darwin64.S ./Modules/_ctypes/libffi_osx/x86/darwin64.S new file mode 100644 index 0000000..165d469 --- /dev/null +++ ./Modules/_ctypes/libffi_osx/x86/darwin64.S @@ -0,0 +1,417 @@ +/* ----------------------------------------------------------------------- + darwin64.S - Copyright (c) 2006 Free Software Foundation, Inc. + derived from unix64.S + + x86-64 Foreign Function Interface for Darwin. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#ifdef __x86_64__ +#define LIBFFI_ASM +#include +#include + + .file "darwin64.S" +.text + +/* ffi_call_unix64 (void *args, unsigned long bytes, unsigned flags, + void *raddr, void (*fnaddr)()); + + Bit o trickiness here -- ARGS+BYTES is the base of the stack frame + for this function. This has been allocated by ffi_call. We also + deallocate some of the stack that has been alloca'd. */ + + .align 3 + .globl _ffi_call_unix64 + +_ffi_call_unix64: +LUW0: + movq (%rsp), %r10 /* Load return address. */ + movq %rdi, %r12 /* Save a copy of the register area. */ + leaq (%rdi, %rsi), %rax /* Find local stack base. */ + movq %rdx, (%rax) /* Save flags. */ + movq %rcx, 8(%rax) /* Save raddr. */ + movq %rbp, 16(%rax) /* Save old frame pointer. */ + movq %r10, 24(%rax) /* Relocate return address. */ + movq %rax, %rbp /* Finalize local stack frame. */ +LUW1: + /* movq %rdi, %r10 // Save a copy of the register area. */ + movq %r12, %r10 + movq %r8, %r11 /* Save a copy of the target fn. */ + movl %r9d, %eax /* Set number of SSE registers. */ + + /* Load up all argument registers. */ + movq (%r10), %rdi + movq 8(%r10), %rsi + movq 16(%r10), %rdx + movq 24(%r10), %rcx + movq 32(%r10), %r8 + movq 40(%r10), %r9 + testl %eax, %eax + jnz Lload_sse +Lret_from_load_sse: + + /* Deallocate the reg arg area. */ + leaq 176(%r10), %rsp + + /* Call the user function. */ + call *%r11 + + /* Deallocate stack arg area; local stack frame in redzone. */ + leaq 24(%rbp), %rsp + + movq 0(%rbp), %rcx /* Reload flags. */ + movq 8(%rbp), %rdi /* Reload raddr. */ + movq 16(%rbp), %rbp /* Reload old frame pointer. */ +LUW2: + + /* The first byte of the flags contains the FFI_TYPE. */ + movzbl %cl, %r10d + leaq Lstore_table(%rip), %r11 + movslq (%r11, %r10, 4), %r10 + addq %r11, %r10 + jmp *%r10 + +Lstore_table: + .long Lst_void-Lstore_table /* FFI_TYPE_VOID */ + .long Lst_sint32-Lstore_table /* FFI_TYPE_INT */ + .long Lst_float-Lstore_table /* FFI_TYPE_FLOAT */ + .long Lst_double-Lstore_table /* FFI_TYPE_DOUBLE */ + .long Lst_ldouble-Lstore_table /* FFI_TYPE_LONGDOUBLE */ + .long Lst_uint8-Lstore_table /* FFI_TYPE_UINT8 */ + .long Lst_sint8-Lstore_table /* FFI_TYPE_SINT8 */ + .long Lst_uint16-Lstore_table /* FFI_TYPE_UINT16 */ + .long Lst_sint16-Lstore_table /* FFI_TYPE_SINT16 */ + .long Lst_uint32-Lstore_table /* FFI_TYPE_UINT32 */ + .long Lst_sint32-Lstore_table /* FFI_TYPE_SINT32 */ + .long Lst_int64-Lstore_table /* FFI_TYPE_UINT64 */ + .long Lst_int64-Lstore_table /* FFI_TYPE_SINT64 */ + .long Lst_struct-Lstore_table /* FFI_TYPE_STRUCT */ + .long Lst_int64-Lstore_table /* FFI_TYPE_POINTER */ + + .text + .align 3 +Lst_void: + ret + .align 3 +Lst_uint8: + movzbq %al, %rax + movq %rax, (%rdi) + ret + .align 3 +Lst_sint8: + movsbq %al, %rax + movq %rax, (%rdi) + ret + .align 3 +Lst_uint16: + movzwq %ax, %rax + movq %rax, (%rdi) + .align 3 +Lst_sint16: + movswq %ax, %rax + movq %rax, (%rdi) + ret + .align 3 +Lst_uint32: + movl %eax, %eax + movq %rax, (%rdi) + .align 3 +Lst_sint32: + cltq + movq %rax, (%rdi) + ret + .align 3 +Lst_int64: + movq %rax, (%rdi) + ret + .align 3 +Lst_float: + movss %xmm0, (%rdi) + ret + .align 3 +Lst_double: + movsd %xmm0, (%rdi) + ret +Lst_ldouble: + fstpt (%rdi) + ret + .align 3 +Lst_struct: + leaq -20(%rsp), %rsi /* Scratch area in redzone. */ + + /* We have to locate the values now, and since we don't want to + write too much data into the user's return value, we spill the + value to a 16 byte scratch area first. Bits 8, 9, and 10 + control where the values are located. Only one of the three + bits will be set; see ffi_prep_cif_machdep for the pattern. */ + movd %xmm0, %r10 + movd %xmm1, %r11 + testl $0x100, %ecx + cmovnz %rax, %rdx + cmovnz %r10, %rax + testl $0x200, %ecx + cmovnz %r10, %rdx + testl $0x400, %ecx + cmovnz %r10, %rax + cmovnz %r11, %rdx + movq %rax, (%rsi) + movq %rdx, 8(%rsi) + + /* Bits 12-31 contain the true size of the structure. Copy from + the scratch area to the true destination. */ + shrl $12, %ecx + rep movsb + ret + + /* Many times we can avoid loading any SSE registers at all. + It's not worth an indirect jump to load the exact set of + SSE registers needed; zero or all is a good compromise. */ + .align 3 +LUW3: +Lload_sse: + movdqa 48(%r10), %xmm0 + movdqa 64(%r10), %xmm1 + movdqa 80(%r10), %xmm2 + movdqa 96(%r10), %xmm3 + movdqa 112(%r10), %xmm4 + movdqa 128(%r10), %xmm5 + movdqa 144(%r10), %xmm6 + movdqa 160(%r10), %xmm7 + jmp Lret_from_load_sse + +LUW4: + .align 3 + .globl _ffi_closure_unix64 + +_ffi_closure_unix64: +LUW5: + /* The carry flag is set by the trampoline iff SSE registers + are used. Don't clobber it before the branch instruction. */ + leaq -200(%rsp), %rsp +LUW6: + movq %rdi, (%rsp) + movq %rsi, 8(%rsp) + movq %rdx, 16(%rsp) + movq %rcx, 24(%rsp) + movq %r8, 32(%rsp) + movq %r9, 40(%rsp) + jc Lsave_sse +Lret_from_save_sse: + + movq %r10, %rdi + leaq 176(%rsp), %rsi + movq %rsp, %rdx + leaq 208(%rsp), %rcx + call _ffi_closure_unix64_inner + + /* Deallocate stack frame early; return value is now in redzone. */ + addq $200, %rsp +LUW7: + + /* The first byte of the return value contains the FFI_TYPE. */ + movzbl %al, %r10d + leaq Lload_table(%rip), %r11 + movslq (%r11, %r10, 4), %r10 + addq %r11, %r10 + jmp *%r10 + +Lload_table: + .long Lld_void-Lload_table /* FFI_TYPE_VOID */ + .long Lld_int32-Lload_table /* FFI_TYPE_INT */ + .long Lld_float-Lload_table /* FFI_TYPE_FLOAT */ + .long Lld_double-Lload_table /* FFI_TYPE_DOUBLE */ + .long Lld_ldouble-Lload_table /* FFI_TYPE_LONGDOUBLE */ + .long Lld_int8-Lload_table /* FFI_TYPE_UINT8 */ + .long Lld_int8-Lload_table /* FFI_TYPE_SINT8 */ + .long Lld_int16-Lload_table /* FFI_TYPE_UINT16 */ + .long Lld_int16-Lload_table /* FFI_TYPE_SINT16 */ + .long Lld_int32-Lload_table /* FFI_TYPE_UINT32 */ + .long Lld_int32-Lload_table /* FFI_TYPE_SINT32 */ + .long Lld_int64-Lload_table /* FFI_TYPE_UINT64 */ + .long Lld_int64-Lload_table /* FFI_TYPE_SINT64 */ + .long Lld_struct-Lload_table /* FFI_TYPE_STRUCT */ + .long Lld_int64-Lload_table /* FFI_TYPE_POINTER */ + + .text + .align 3 +Lld_void: + ret + .align 3 +Lld_int8: + movzbl -24(%rsp), %eax + ret + .align 3 +Lld_int16: + movzwl -24(%rsp), %eax + ret + .align 3 +Lld_int32: + movl -24(%rsp), %eax + ret + .align 3 +Lld_int64: + movq -24(%rsp), %rax + ret + .align 3 +Lld_float: + movss -24(%rsp), %xmm0 + ret + .align 3 +Lld_double: + movsd -24(%rsp), %xmm0 + ret + .align 3 +Lld_ldouble: + fldt -24(%rsp) + ret + .align 3 +Lld_struct: + /* There are four possibilities here, %rax/%rdx, %xmm0/%rax, + %rax/%xmm0, %xmm0/%xmm1. We collapse two by always loading + both rdx and xmm1 with the second word. For the remaining, + bit 8 set means xmm0 gets the second word, and bit 9 means + that rax gets the second word. */ + movq -24(%rsp), %rcx + movq -16(%rsp), %rdx + movq -16(%rsp), %xmm1 + testl $0x100, %eax + cmovnz %rdx, %rcx + movd %rcx, %xmm0 + testl $0x200, %eax + movq -24(%rsp), %rax + cmovnz %rdx, %rax + ret + + /* See the comment above Lload_sse; the same logic applies here. */ + .align 3 +LUW8: +Lsave_sse: + movdqa %xmm0, 48(%rsp) + movdqa %xmm1, 64(%rsp) + movdqa %xmm2, 80(%rsp) + movdqa %xmm3, 96(%rsp) + movdqa %xmm4, 112(%rsp) + movdqa %xmm5, 128(%rsp) + movdqa %xmm6, 144(%rsp) + movdqa %xmm7, 160(%rsp) + jmp Lret_from_save_sse + +LUW9: +.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support +EH_frame1: + .set L$set$0,LECIE1-LSCIE1 /* CIE Length */ + .long L$set$0 +LSCIE1: + .long 0x0 /* CIE Identifier Tag */ + .byte 0x1 /* CIE Version */ + .ascii "zR\0" /* CIE Augmentation */ + .byte 0x1 /* uleb128 0x1; CIE Code Alignment Factor */ + .byte 0x78 /* sleb128 -8; CIE Data Alignment Factor */ + .byte 0x10 /* CIE RA Column */ + .byte 0x1 /* uleb128 0x1; Augmentation size */ + .byte 0x10 /* FDE Encoding (pcrel sdata4) */ + .byte 0xc /* DW_CFA_def_cfa, %rsp offset 8 */ + .byte 0x7 /* uleb128 0x7 */ + .byte 0x8 /* uleb128 0x8 */ + .byte 0x90 /* DW_CFA_offset, column 0x10 */ + .byte 0x1 + .align 3 +LECIE1: + .globl _ffi_call_unix64.eh +_ffi_call_unix64.eh: +LSFDE1: + .set L$set$1,LEFDE1-LASFDE1 /* FDE Length */ + .long L$set$1 +LASFDE1: + .long LASFDE1-EH_frame1 /* FDE CIE offset */ + .quad LUW0-. /* FDE initial location */ + .set L$set$2,LUW4-LUW0 /* FDE address range */ + .quad L$set$2 + .byte 0x0 /* Augmentation size */ + .byte 0x4 /* DW_CFA_advance_loc4 */ + .set L$set$3,LUW1-LUW0 + .long L$set$3 + + /* New stack frame based off rbp. This is a itty bit of unwind + trickery in that the CFA *has* changed. There is no easy way + to describe it correctly on entry to the function. Fortunately, + it doesn't matter too much since at all points we can correctly + unwind back to ffi_call. Note that the location to which we + moved the return address is (the new) CFA-8, so from the + perspective of the unwind info, it hasn't moved. */ + .byte 0xc /* DW_CFA_def_cfa, %rbp offset 32 */ + .byte 0x6 + .byte 0x20 + .byte 0x80+6 /* DW_CFA_offset, %rbp offset 2*-8 */ + .byte 0x2 + .byte 0xa /* DW_CFA_remember_state */ + + .byte 0x4 /* DW_CFA_advance_loc4 */ + .set L$set$4,LUW2-LUW1 + .long L$set$4 + .byte 0xc /* DW_CFA_def_cfa, %rsp offset 8 */ + .byte 0x7 + .byte 0x8 + .byte 0xc0+6 /* DW_CFA_restore, %rbp */ + + .byte 0x4 /* DW_CFA_advance_loc4 */ + .set L$set$5,LUW3-LUW2 + .long L$set$5 + .byte 0xb /* DW_CFA_restore_state */ + + .align 3 +LEFDE1: + .globl _ffi_closure_unix64.eh +_ffi_closure_unix64.eh: +LSFDE3: + .set L$set$6,LEFDE3-LASFDE3 /* FDE Length */ + .long L$set$6 +LASFDE3: + .long LASFDE3-EH_frame1 /* FDE CIE offset */ + .quad LUW5-. /* FDE initial location */ + .set L$set$7,LUW9-LUW5 /* FDE address range */ + .quad L$set$7 + .byte 0x0 /* Augmentation size */ + + .byte 0x4 /* DW_CFA_advance_loc4 */ + .set L$set$8,LUW6-LUW5 + .long L$set$8 + .byte 0xe /* DW_CFA_def_cfa_offset */ + .byte 208,1 /* uleb128 208 */ + .byte 0xa /* DW_CFA_remember_state */ + + .byte 0x4 /* DW_CFA_advance_loc4 */ + .set L$set$9,LUW7-LUW6 + .long L$set$9 + .byte 0xe /* DW_CFA_def_cfa_offset */ + .byte 0x8 + + .byte 0x4 /* DW_CFA_advance_loc4 */ + .set L$set$10,LUW8-LUW7 + .long L$set$10 + .byte 0xb /* DW_CFA_restore_state */ + + .align 3 +LEFDE3: + .subsections_via_symbols + +#endif /* __x86_64__ */ diff -r -u ./Modules/_ctypes/libffi_osx/x86/x86-darwin.S ./Modules/_ctypes/libffi_osx/x86/x86-darwin.S new file mode 100644 index 0000000..925a841 --- /dev/null +++ ./Modules/_ctypes/libffi_osx/x86/x86-darwin.S @@ -0,0 +1,422 @@ +#ifdef __i386__ +/* ----------------------------------------------------------------------- + darwin.S - Copyright (c) 1996, 1998, 2001, 2002, 2003 Red Hat, Inc. + + X86 Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +/* + * This file is based on sysv.S and then hacked up by Ronald who hasn't done + * assembly programming in 8 years. + */ + +#ifndef __x86_64__ + +#define LIBFFI_ASM +#include +#include + +#ifdef PyObjC_STRICT_DEBUGGING + /* XXX: Debugging of stack alignment, to be removed */ +#define ASSERT_STACK_ALIGNED movdqa -16(%esp), %xmm0 +#else +#define ASSERT_STACK_ALIGNED +#endif + +.text + +.globl _ffi_prep_args + + .align 4 +.globl _ffi_call_SYSV + +_ffi_call_SYSV: +LFB1: + pushl %ebp +LCFI0: + movl %esp,%ebp +LCFI1: + subl $8,%esp + /* Make room for all of the new args. */ + movl 16(%ebp),%ecx + subl %ecx,%esp + + movl %esp,%eax + + /* Place all of the ffi_prep_args in position */ + subl $8,%esp + pushl 12(%ebp) + pushl %eax + call *8(%ebp) + + /* Return stack to previous state and call the function */ + addl $16,%esp + + call *28(%ebp) + + /* Remove the space we pushed for the args */ + movl 16(%ebp),%ecx + addl %ecx,%esp + + /* Load %ecx with the return type code */ + movl 20(%ebp),%ecx + + /* If the return value pointer is NULL, assume no return value. */ + cmpl $0,24(%ebp) + jne Lretint + + /* Even if there is no space for the return value, we are + obliged to handle floating-point values. */ + cmpl $FFI_TYPE_FLOAT,%ecx + jne Lnoretval + fstp %st(0) + + jmp Lepilogue + +Lretint: + cmpl $FFI_TYPE_INT,%ecx + jne Lretfloat + /* Load %ecx with the pointer to storage for the return value */ + movl 24(%ebp),%ecx + movl %eax,0(%ecx) + jmp Lepilogue + +Lretfloat: + cmpl $FFI_TYPE_FLOAT,%ecx + jne Lretdouble + /* Load %ecx with the pointer to storage for the return value */ + movl 24(%ebp),%ecx + fstps (%ecx) + jmp Lepilogue + +Lretdouble: + cmpl $FFI_TYPE_DOUBLE,%ecx + jne Lretlongdouble + /* Load %ecx with the pointer to storage for the return value */ + movl 24(%ebp),%ecx + fstpl (%ecx) + jmp Lepilogue + +Lretlongdouble: + cmpl $FFI_TYPE_LONGDOUBLE,%ecx + jne Lretint64 + /* Load %ecx with the pointer to storage for the return value */ + movl 24(%ebp),%ecx + fstpt (%ecx) + jmp Lepilogue + +Lretint64: + cmpl $FFI_TYPE_SINT64,%ecx + jne Lretstruct1b + /* Load %ecx with the pointer to storage for the return value */ + movl 24(%ebp),%ecx + movl %eax,0(%ecx) + movl %edx,4(%ecx) + jmp Lepilogue + +Lretstruct1b: + cmpl $FFI_TYPE_SINT8,%ecx + jne Lretstruct2b + /* Load %ecx with the pointer to storage for the return value */ + movl 24(%ebp),%ecx + movb %al,0(%ecx) + jmp Lepilogue + +Lretstruct2b: + cmpl $FFI_TYPE_SINT16,%ecx + jne Lretstruct + /* Load %ecx with the pointer to storage for the return value */ + movl 24(%ebp),%ecx + movw %ax,0(%ecx) + jmp Lepilogue + +Lretstruct: + cmpl $FFI_TYPE_STRUCT,%ecx + jne Lnoretval + /* Nothing to do! */ + addl $4,%esp + popl %ebp + ret + +Lnoretval: +Lepilogue: + addl $8,%esp + movl %ebp,%esp + popl %ebp + ret +LFE1: +.ffi_call_SYSV_end: + + .align 4 +FFI_HIDDEN (ffi_closure_SYSV) +.globl _ffi_closure_SYSV + +_ffi_closure_SYSV: +LFB2: + pushl %ebp +LCFI2: + movl %esp, %ebp +LCFI3: + subl $56, %esp + leal -40(%ebp), %edx + movl %edx, -12(%ebp) /* resp */ + leal 8(%ebp), %edx + movl %edx, 4(%esp) /* args = __builtin_dwarf_cfa () */ + leal -12(%ebp), %edx + movl %edx, (%esp) /* &resp */ + movl %ebx, 8(%esp) +LCFI7: + call L_ffi_closure_SYSV_inner$stub + movl 8(%esp), %ebx + movl -12(%ebp), %ecx + cmpl $FFI_TYPE_INT, %eax + je Lcls_retint + cmpl $FFI_TYPE_FLOAT, %eax + je Lcls_retfloat + cmpl $FFI_TYPE_DOUBLE, %eax + je Lcls_retdouble + cmpl $FFI_TYPE_LONGDOUBLE, %eax + je Lcls_retldouble + cmpl $FFI_TYPE_SINT64, %eax + je Lcls_retllong + cmpl $FFI_TYPE_UINT8, %eax + je Lcls_retstruct1 + cmpl $FFI_TYPE_SINT8, %eax + je Lcls_retstruct1 + cmpl $FFI_TYPE_UINT16, %eax + je Lcls_retstruct2 + cmpl $FFI_TYPE_SINT16, %eax + je Lcls_retstruct2 + cmpl $FFI_TYPE_STRUCT, %eax + je Lcls_retstruct +Lcls_epilogue: + movl %ebp, %esp + popl %ebp + ret +Lcls_retint: + movl (%ecx), %eax + jmp Lcls_epilogue +Lcls_retfloat: + flds (%ecx) + jmp Lcls_epilogue +Lcls_retdouble: + fldl (%ecx) + jmp Lcls_epilogue +Lcls_retldouble: + fldt (%ecx) + jmp Lcls_epilogue +Lcls_retllong: + movl (%ecx), %eax + movl 4(%ecx), %edx + jmp Lcls_epilogue +Lcls_retstruct1: + movsbl (%ecx), %eax + jmp Lcls_epilogue +Lcls_retstruct2: + movswl (%ecx), %eax + jmp Lcls_epilogue +Lcls_retstruct: + lea -8(%ebp),%esp + movl %ebp, %esp + popl %ebp + ret $4 +LFE2: + +#if !FFI_NO_RAW_API + +#define RAW_CLOSURE_CIF_OFFSET ((FFI_TRAMPOLINE_SIZE + 3) & ~3) +#define RAW_CLOSURE_FUN_OFFSET (RAW_CLOSURE_CIF_OFFSET + 4) +#define RAW_CLOSURE_USER_DATA_OFFSET (RAW_CLOSURE_FUN_OFFSET + 4) +#define CIF_FLAGS_OFFSET 20 + + .align 4 +FFI_HIDDEN (ffi_closure_raw_SYSV) +.globl _ffi_closure_raw_SYSV + +_ffi_closure_raw_SYSV: +LFB3: + pushl %ebp +LCFI4: + movl %esp, %ebp +LCFI5: + pushl %esi +LCFI6: + subl $36, %esp + movl RAW_CLOSURE_CIF_OFFSET(%eax), %esi /* closure->cif */ + movl RAW_CLOSURE_USER_DATA_OFFSET(%eax), %edx /* closure->user_data */ + movl %edx, 12(%esp) /* user_data */ + leal 8(%ebp), %edx /* __builtin_dwarf_cfa () */ + movl %edx, 8(%esp) /* raw_args */ + leal -24(%ebp), %edx + movl %edx, 4(%esp) /* &res */ + movl %esi, (%esp) /* cif */ + call *RAW_CLOSURE_FUN_OFFSET(%eax) /* closure->fun */ + movl CIF_FLAGS_OFFSET(%esi), %eax /* rtype */ + cmpl $FFI_TYPE_INT, %eax + je Lrcls_retint + cmpl $FFI_TYPE_FLOAT, %eax + je Lrcls_retfloat + cmpl $FFI_TYPE_DOUBLE, %eax + je Lrcls_retdouble + cmpl $FFI_TYPE_LONGDOUBLE, %eax + je Lrcls_retldouble + cmpl $FFI_TYPE_SINT64, %eax + je Lrcls_retllong +Lrcls_epilogue: + addl $36, %esp + popl %esi + popl %ebp + ret +Lrcls_retint: + movl -24(%ebp), %eax + jmp Lrcls_epilogue +Lrcls_retfloat: + flds -24(%ebp) + jmp Lrcls_epilogue +Lrcls_retdouble: + fldl -24(%ebp) + jmp Lrcls_epilogue +Lrcls_retldouble: + fldt -24(%ebp) + jmp Lrcls_epilogue +Lrcls_retllong: + movl -24(%ebp), %eax + movl -20(%ebp), %edx + jmp Lrcls_epilogue +LFE3: +#endif + +.section __IMPORT,__jump_table,symbol_stubs,self_modifying_code+pure_instructions,5 +L_ffi_closure_SYSV_inner$stub: + .indirect_symbol _ffi_closure_SYSV_inner + hlt ; hlt ; hlt ; hlt ; hlt + + +.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support +EH_frame1: + .set L$set$0,LECIE1-LSCIE1 + .long L$set$0 +LSCIE1: + .long 0x0 + .byte 0x1 + .ascii "zR\0" + .byte 0x1 + .byte 0x7c + .byte 0x8 + .byte 0x1 + .byte 0x10 + .byte 0xc + .byte 0x5 + .byte 0x4 + .byte 0x88 + .byte 0x1 + .align 2 +LECIE1: +.globl _ffi_call_SYSV.eh +_ffi_call_SYSV.eh: +LSFDE1: + .set L$set$1,LEFDE1-LASFDE1 + .long L$set$1 +LASFDE1: + .long LASFDE1-EH_frame1 + .long LFB1-. + .set L$set$2,LFE1-LFB1 + .long L$set$2 + .byte 0x0 + .byte 0x4 + .set L$set$3,LCFI0-LFB1 + .long L$set$3 + .byte 0xe + .byte 0x8 + .byte 0x84 + .byte 0x2 + .byte 0x4 + .set L$set$4,LCFI1-LCFI0 + .long L$set$4 + .byte 0xd + .byte 0x4 + .align 2 +LEFDE1: +.globl _ffi_closure_SYSV.eh +_ffi_closure_SYSV.eh: +LSFDE2: + .set L$set$5,LEFDE2-LASFDE2 + .long L$set$5 +LASFDE2: + .long LASFDE2-EH_frame1 + .long LFB2-. + .set L$set$6,LFE2-LFB2 + .long L$set$6 + .byte 0x0 + .byte 0x4 + .set L$set$7,LCFI2-LFB2 + .long L$set$7 + .byte 0xe + .byte 0x8 + .byte 0x84 + .byte 0x2 + .byte 0x4 + .set L$set$8,LCFI3-LCFI2 + .long L$set$8 + .byte 0xd + .byte 0x4 + .align 2 +LEFDE2: + +#if !FFI_NO_RAW_API + +.globl _ffi_closure_raw_SYSV.eh +_ffi_closure_raw_SYSV.eh: +LSFDE3: + .set L$set$10,LEFDE3-LASFDE3 + .long L$set$10 +LASFDE3: + .long LASFDE3-EH_frame1 + .long LFB3-. + .set L$set$11,LFE3-LFB3 + .long L$set$11 + .byte 0x0 + .byte 0x4 + .set L$set$12,LCFI4-LFB3 + .long L$set$12 + .byte 0xe + .byte 0x8 + .byte 0x84 + .byte 0x2 + .byte 0x4 + .set L$set$13,LCFI5-LCFI4 + .long L$set$13 + .byte 0xd + .byte 0x4 + .byte 0x4 + .set L$set$14,LCFI6-LCFI5 + .long L$set$14 + .byte 0x85 + .byte 0x3 + .align 2 +LEFDE3: + +#endif + +#endif /* ifndef __x86_64__ */ + +#endif /* defined __i386__ */ diff -r -u ./Modules/_ctypes/libffi_osx/x86/x86-ffi64.c ./Modules/_ctypes/libffi_osx/x86/x86-ffi64.c new file mode 100644 index 0000000..06feaf2 --- /dev/null +++ ./Modules/_ctypes/libffi_osx/x86/x86-ffi64.c @@ -0,0 +1,734 @@ +#ifdef __x86_64__ + +/* ----------------------------------------------------------------------- + x86-ffi64.c - Copyright (c) 2002 Bo Thorsen + + x86-64 Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#include +#include + +#include +#include + +#define MAX_GPR_REGS 6 +#define MAX_SSE_REGS 8 + +typedef struct RegisterArgs { + /* Registers for argument passing. */ + UINT64 gpr[MAX_GPR_REGS]; + __int128_t sse[MAX_SSE_REGS]; +} RegisterArgs; + +extern void +ffi_call_unix64( + void* args, + unsigned long bytes, + unsigned flags, + void* raddr, + void (*fnaddr)(), + unsigned ssecount); + +/* All reference to register classes here is identical to the code in + gcc/config/i386/i386.c. Do *not* change one without the other. */ + +/* Register class used for passing given 64bit part of the argument. + These represent classes as documented by the PS ABI, with the exception + of SSESF, SSEDF classes, that are basically SSE class, just gcc will + use SF or DFmode move instead of DImode to avoid reformating penalties. + + Similary we play games with INTEGERSI_CLASS to use cheaper SImode moves + whenever possible (upper half does contain padding). */ +enum x86_64_reg_class +{ + X86_64_NO_CLASS, + X86_64_INTEGER_CLASS, + X86_64_INTEGERSI_CLASS, + X86_64_SSE_CLASS, + X86_64_SSESF_CLASS, + X86_64_SSEDF_CLASS, + X86_64_SSEUP_CLASS, + X86_64_X87_CLASS, + X86_64_X87UP_CLASS, + X86_64_COMPLEX_X87_CLASS, + X86_64_MEMORY_CLASS +}; + +#define MAX_CLASSES 4 +#define SSE_CLASS_P(X) ((X) >= X86_64_SSE_CLASS && X <= X86_64_SSEUP_CLASS) + +/* x86-64 register passing implementation. See x86-64 ABI for details. Goal + of this code is to classify each 8bytes of incoming argument by the register + class and assign registers accordingly. */ + +/* Return the union class of CLASS1 and CLASS2. + See the x86-64 PS ABI for details. */ +static enum x86_64_reg_class +merge_classes( + enum x86_64_reg_class class1, + enum x86_64_reg_class class2) +{ + /* Rule #1: If both classes are equal, this is the resulting class. */ + if (class1 == class2) + return class1; + + /* Rule #2: If one of the classes is NO_CLASS, the resulting class is + the other class. */ + if (class1 == X86_64_NO_CLASS) + return class2; + + if (class2 == X86_64_NO_CLASS) + return class1; + + /* Rule #3: If one of the classes is MEMORY, the result is MEMORY. */ + if (class1 == X86_64_MEMORY_CLASS || class2 == X86_64_MEMORY_CLASS) + return X86_64_MEMORY_CLASS; + + /* Rule #4: If one of the classes is INTEGER, the result is INTEGER. */ + if ((class1 == X86_64_INTEGERSI_CLASS && class2 == X86_64_SSESF_CLASS) + || (class2 == X86_64_INTEGERSI_CLASS && class1 == X86_64_SSESF_CLASS)) + return X86_64_INTEGERSI_CLASS; + + if (class1 == X86_64_INTEGER_CLASS || class1 == X86_64_INTEGERSI_CLASS + || class2 == X86_64_INTEGER_CLASS || class2 == X86_64_INTEGERSI_CLASS) + return X86_64_INTEGER_CLASS; + + /* Rule #5: If one of the classes is X87, X87UP, or COMPLEX_X87 class, + MEMORY is used. */ + if (class1 == X86_64_X87_CLASS + || class1 == X86_64_X87UP_CLASS + || class1 == X86_64_COMPLEX_X87_CLASS + || class2 == X86_64_X87_CLASS + || class2 == X86_64_X87UP_CLASS + || class2 == X86_64_COMPLEX_X87_CLASS) + return X86_64_MEMORY_CLASS; + + /* Rule #6: Otherwise class SSE is used. */ + return X86_64_SSE_CLASS; +} + +/* Classify the argument of type TYPE and mode MODE. + CLASSES will be filled by the register class used to pass each word + of the operand. The number of words is returned. In case the parameter + should be passed in memory, 0 is returned. As a special case for zero + sized containers, classes[0] will be NO_CLASS and 1 is returned. + + See the x86-64 PS ABI for details. */ + +static int +classify_argument( + ffi_type* type, + enum x86_64_reg_class classes[], + size_t byte_offset) +{ + switch (type->type) + { + case FFI_TYPE_UINT8: + case FFI_TYPE_SINT8: + case FFI_TYPE_UINT16: + case FFI_TYPE_SINT16: + case FFI_TYPE_UINT32: + case FFI_TYPE_SINT32: + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + case FFI_TYPE_POINTER: +#if 0 + if (byte_offset + type->size <= 4) + classes[0] = X86_64_INTEGERSI_CLASS; + else + classes[0] = X86_64_INTEGER_CLASS; + + return 1; +#else + { + int size = byte_offset + type->size; + + if (size <= 4) + { + classes[0] = X86_64_INTEGERSI_CLASS; + return 1; + } + else if (size <= 8) + { + classes[0] = X86_64_INTEGER_CLASS; + return 1; + } + else if (size <= 12) + { + classes[0] = X86_64_INTEGER_CLASS; + classes[1] = X86_64_INTEGERSI_CLASS; + return 2; + } + else if (size <= 16) + { + classes[0] = classes[1] = X86_64_INTEGERSI_CLASS; + return 2; + } + else + FFI_ASSERT (0); + } +#endif + + case FFI_TYPE_FLOAT: + if (byte_offset == 0) + classes[0] = X86_64_SSESF_CLASS; + else + classes[0] = X86_64_SSE_CLASS; + + return 1; + + case FFI_TYPE_DOUBLE: + classes[0] = X86_64_SSEDF_CLASS; + return 1; + + case FFI_TYPE_LONGDOUBLE: + classes[0] = X86_64_X87_CLASS; + classes[1] = X86_64_X87UP_CLASS; + return 2; + + case FFI_TYPE_STRUCT: + { + ffi_type** ptr; + int i; + enum x86_64_reg_class subclasses[MAX_CLASSES]; + const int UNITS_PER_WORD = 8; + int words = + (type->size + UNITS_PER_WORD - 1) / UNITS_PER_WORD; + + /* If the struct is larger than 16 bytes, pass it on the stack. */ + if (type->size > 16) + return 0; + + for (i = 0; i < words; i++) + classes[i] = X86_64_NO_CLASS; + + /* Merge the fields of structure. */ + for (ptr = type->elements; *ptr != NULL; ptr++) + { + byte_offset = ALIGN(byte_offset, (*ptr)->alignment); + + int num = classify_argument(*ptr, subclasses, byte_offset % 8); + + if (num == 0) + return 0; + + int pos = byte_offset / 8; + + for (i = 0; i < num; i++) + { + classes[i + pos] = + merge_classes(subclasses[i], classes[i + pos]); + } + + byte_offset += (*ptr)->size; + } + + if (words > 2) + { + /* When size > 16 bytes, if the first one isn't + X86_64_SSE_CLASS or any other ones aren't + X86_64_SSEUP_CLASS, everything should be passed in + memory. */ + if (classes[0] != X86_64_SSE_CLASS) + return 0; + + for (i = 1; i < words; i++) + if (classes[i] != X86_64_SSEUP_CLASS) + return 0; + } + + + /* Final merger cleanup. */ + for (i = 0; i < words; i++) + { + /* If one class is MEMORY, everything should be passed in + memory. */ + if (classes[i] == X86_64_MEMORY_CLASS) + return 0; + + /* The X86_64_SSEUP_CLASS should be always preceded by + X86_64_SSE_CLASS. */ + if (classes[i] == X86_64_SSEUP_CLASS + && classes[i - 1] != X86_64_SSE_CLASS + && classes[i - 1] != X86_64_SSEUP_CLASS) + { + FFI_ASSERT(i != 0); + classes[i] = X86_64_SSE_CLASS; + } + + /* X86_64_X87UP_CLASS should be preceded by X86_64_X87_CLASS. */ + if (classes[i] == X86_64_X87UP_CLASS + && classes[i - 1] != X86_64_X87_CLASS) + { + FFI_ASSERT(i != 0); + classes[i] = X86_64_SSE_CLASS; + } + } + + return words; + } + + default: + FFI_ASSERT(0); + } + + return 0; /* Never reached. */ +} + +/* Examine the argument and return set number of register required in each + class. Return zero if parameter should be passed in memory, otherwise + the number of registers. */ +static int +examine_argument( + ffi_type* type, + enum x86_64_reg_class classes[MAX_CLASSES], + _Bool in_return, + int* pngpr, + int* pnsse) +{ + int n = classify_argument(type, classes, 0); + int ngpr = 0; + int nsse = 0; + int i; + + if (n == 0) + return 0; + + for (i = 0; i < n; ++i) + { + switch (classes[i]) + { + case X86_64_INTEGER_CLASS: + case X86_64_INTEGERSI_CLASS: + ngpr++; + break; + + case X86_64_SSE_CLASS: + case X86_64_SSESF_CLASS: + case X86_64_SSEDF_CLASS: + nsse++; + break; + + case X86_64_NO_CLASS: + case X86_64_SSEUP_CLASS: + break; + + case X86_64_X87_CLASS: + case X86_64_X87UP_CLASS: + case X86_64_COMPLEX_X87_CLASS: + return in_return != 0; + + default: + abort(); + } + } + + *pngpr = ngpr; + *pnsse = nsse; + + return n; +} + +/* Perform machine dependent cif processing. */ +ffi_status +ffi_prep_cif_machdep( + ffi_cif* cif) +{ + int gprcount = 0; + int ssecount = 0; + int flags = cif->rtype->type; + int i, avn, n, ngpr, nsse; + enum x86_64_reg_class classes[MAX_CLASSES]; + size_t bytes; + + if (flags != FFI_TYPE_VOID) + { + n = examine_argument (cif->rtype, classes, 1, &ngpr, &nsse); + + if (n == 0) + { + /* The return value is passed in memory. A pointer to that + memory is the first argument. Allocate a register for it. */ + gprcount++; + + /* We don't have to do anything in asm for the return. */ + flags = FFI_TYPE_VOID; + } + else if (flags == FFI_TYPE_STRUCT) + { + /* Mark which registers the result appears in. */ + _Bool sse0 = SSE_CLASS_P(classes[0]); + _Bool sse1 = n == 2 && SSE_CLASS_P(classes[1]); + + if (sse0 && !sse1) + flags |= 1 << 8; + else if (!sse0 && sse1) + flags |= 1 << 9; + else if (sse0 && sse1) + flags |= 1 << 10; + + /* Mark the true size of the structure. */ + flags |= cif->rtype->size << 12; + } + } + + /* Go over all arguments and determine the way they should be passed. + If it's in a register and there is space for it, let that be so. If + not, add it's size to the stack byte count. */ + for (bytes = 0, i = 0, avn = cif->nargs; i < avn; i++) + { + if (examine_argument(cif->arg_types[i], classes, 0, &ngpr, &nsse) == 0 + || gprcount + ngpr > MAX_GPR_REGS + || ssecount + nsse > MAX_SSE_REGS) + { + long align = cif->arg_types[i]->alignment; + + if (align < 8) + align = 8; + + bytes = ALIGN(bytes, align); + bytes += cif->arg_types[i]->size; + } + else + { + gprcount += ngpr; + ssecount += nsse; + } + } + + if (ssecount) + flags |= 1 << 11; + + cif->flags = flags; + cif->bytes = bytes; + cif->bytes = ALIGN(bytes,8); + + return FFI_OK; +} + +void +ffi_call( + ffi_cif* cif, + void (*fn)(), + void* rvalue, + void** avalue) +{ + enum x86_64_reg_class classes[MAX_CLASSES]; + char* stack; + char* argp; + ffi_type** arg_types; + int gprcount, ssecount, ngpr, nsse, i, avn; + _Bool ret_in_memory; + RegisterArgs* reg_args; + + /* Can't call 32-bit mode from 64-bit mode. */ + FFI_ASSERT(cif->abi == FFI_UNIX64); + + /* If the return value is a struct and we don't have a return value + address then we need to make one. Note the setting of flags to + VOID above in ffi_prep_cif_machdep. */ + ret_in_memory = (cif->rtype->type == FFI_TYPE_STRUCT + && (cif->flags & 0xff) == FFI_TYPE_VOID); + + if (rvalue == NULL && ret_in_memory) + rvalue = alloca (cif->rtype->size); + + /* Allocate the space for the arguments, plus 4 words of temp space. */ + stack = alloca(sizeof(RegisterArgs) + cif->bytes + 4 * 8); + reg_args = (RegisterArgs*)stack; + argp = stack + sizeof(RegisterArgs); + + gprcount = ssecount = 0; + + /* If the return value is passed in memory, add the pointer as the + first integer argument. */ + if (ret_in_memory) + reg_args->gpr[gprcount++] = (long) rvalue; + + avn = cif->nargs; + arg_types = cif->arg_types; + + for (i = 0; i < avn; ++i) + { + size_t size = arg_types[i]->size; + int n; + + n = examine_argument (arg_types[i], classes, 0, &ngpr, &nsse); + + if (n == 0 + || gprcount + ngpr > MAX_GPR_REGS + || ssecount + nsse > MAX_SSE_REGS) + { + long align = arg_types[i]->alignment; + + /* Stack arguments are *always* at least 8 byte aligned. */ + if (align < 8) + align = 8; + + /* Pass this argument in memory. */ + argp = (void *) ALIGN (argp, align); + memcpy (argp, avalue[i], size); + argp += size; + } + else + { /* The argument is passed entirely in registers. */ + char *a = (char *) avalue[i]; + int j; + + for (j = 0; j < n; j++, a += 8, size -= 8) + { + switch (classes[j]) + { + case X86_64_INTEGER_CLASS: + case X86_64_INTEGERSI_CLASS: + reg_args->gpr[gprcount] = 0; + switch (arg_types[i]->type) { + case FFI_TYPE_SINT8: + { + int8_t shortval = *(int8_t*)a; + int64_t actval = (int64_t)shortval; + reg_args->gpr[gprcount] = actval; + /*memcpy (®_args->gpr[gprcount], &actval, 8);*/ + break; + } + + case FFI_TYPE_SINT16: + { + int16_t shortval = *(int16_t*)a; + int64_t actval = (int64_t)shortval; + memcpy (®_args->gpr[gprcount], &actval, 8); + break; + } + + case FFI_TYPE_SINT32: + { + int32_t shortval = *(int32_t*)a; + int64_t actval = (int64_t)shortval; + memcpy (®_args->gpr[gprcount], &actval, 8); + break; + } + + case FFI_TYPE_UINT8: + { + u_int8_t shortval = *(u_int8_t*)a; + u_int64_t actval = (u_int64_t)shortval; + /*memcpy (®_args->gpr[gprcount], &actval, 8);*/ + reg_args->gpr[gprcount] = actval; + break; + } + + case FFI_TYPE_UINT16: + { + u_int16_t shortval = *(u_int16_t*)a; + u_int64_t actval = (u_int64_t)shortval; + memcpy (®_args->gpr[gprcount], &actval, 8); + break; + } + + case FFI_TYPE_UINT32: + { + u_int32_t shortval = *(u_int32_t*)a; + u_int64_t actval = (u_int64_t)shortval; + memcpy (®_args->gpr[gprcount], &actval, 8); + break; + } + + default: + //memcpy (®_args->gpr[gprcount], a, size < 8 ? size : 8); + reg_args->gpr[gprcount] = *(int64_t*)a; + } + gprcount++; + break; + + case X86_64_SSE_CLASS: + case X86_64_SSEDF_CLASS: + reg_args->sse[ssecount++] = *(UINT64 *) a; + break; + + case X86_64_SSESF_CLASS: + reg_args->sse[ssecount++] = *(UINT32 *) a; + break; + + default: + abort(); + } + } + } + } + + ffi_call_unix64 (stack, cif->bytes + sizeof(RegisterArgs), + cif->flags, rvalue, fn, ssecount); +} + +extern void ffi_closure_unix64(void); + +ffi_status +ffi_prep_closure( + ffi_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif*, void*, void**, void*), + void* user_data) +{ + if (cif->abi != FFI_UNIX64) + return FFI_BAD_ABI; + + volatile unsigned short* tramp = + (volatile unsigned short*)&closure->tramp[0]; + + tramp[0] = 0xbb49; /* mov , %r11 */ + *(void* volatile*)&tramp[1] = ffi_closure_unix64; + tramp[5] = 0xba49; /* mov , %r10 */ + *(void* volatile*)&tramp[6] = closure; + + /* Set the carry bit if the function uses any sse registers. + This is clc or stc, together with the first byte of the jmp. */ + tramp[10] = cif->flags & (1 << 11) ? 0x49f9 : 0x49f8; + tramp[11] = 0xe3ff; /* jmp *%r11 */ + + closure->cif = cif; + closure->fun = fun; + closure->user_data = user_data; + + return FFI_OK; +} + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wmissing-prototypes" +int +ffi_closure_unix64_inner( + ffi_closure* closure, + void* rvalue, + RegisterArgs* reg_args, + char* argp) +#pragma clang diagnostic pop +{ + ffi_cif* cif = closure->cif; + void** avalue = alloca(cif->nargs * sizeof(void *)); + ffi_type** arg_types; + long i, avn; + int gprcount = 0; + int ssecount = 0; + int ngpr, nsse; + int ret; + + ret = cif->rtype->type; + + if (ret != FFI_TYPE_VOID) + { + enum x86_64_reg_class classes[MAX_CLASSES]; + int n = examine_argument (cif->rtype, classes, 1, &ngpr, &nsse); + + if (n == 0) + { + /* The return value goes in memory. Arrange for the closure + return value to go directly back to the original caller. */ + rvalue = (void *) reg_args->gpr[gprcount++]; + + /* We don't have to do anything in asm for the return. */ + ret = FFI_TYPE_VOID; + } + else if (ret == FFI_TYPE_STRUCT && n == 2) + { + /* Mark which register the second word of the structure goes in. */ + _Bool sse0 = SSE_CLASS_P (classes[0]); + _Bool sse1 = SSE_CLASS_P (classes[1]); + + if (!sse0 && sse1) + ret |= 1 << 8; + else if (sse0 && !sse1) + ret |= 1 << 9; + } + } + + avn = cif->nargs; + arg_types = cif->arg_types; + + for (i = 0; i < avn; ++i) + { + enum x86_64_reg_class classes[MAX_CLASSES]; + int n; + + n = examine_argument (arg_types[i], classes, 0, &ngpr, &nsse); + + if (n == 0 + || gprcount + ngpr > MAX_GPR_REGS + || ssecount + nsse > MAX_SSE_REGS) + { + long align = arg_types[i]->alignment; + + /* Stack arguments are *always* at least 8 byte aligned. */ + if (align < 8) + align = 8; + + /* Pass this argument in memory. */ + argp = (void *) ALIGN (argp, align); + avalue[i] = argp; + argp += arg_types[i]->size; + } + +#if !defined(X86_DARWIN) + /* If the argument is in a single register, or two consecutive + registers, then we can use that address directly. */ + else if (n == 1 || (n == 2 && + SSE_CLASS_P (classes[0]) == SSE_CLASS_P (classes[1]))) + { + // The argument is in a single register. + if (SSE_CLASS_P (classes[0])) + { + avalue[i] = ®_args->sse[ssecount]; + ssecount += n; + } + else + { + avalue[i] = ®_args->gpr[gprcount]; + gprcount += n; + } + } +#endif + + /* Otherwise, allocate space to make them consecutive. */ + else + { + char *a = alloca (16); + int j; + + avalue[i] = a; + + for (j = 0; j < n; j++, a += 8) + { + if (SSE_CLASS_P (classes[j])) + memcpy (a, ®_args->sse[ssecount++], 8); + else + memcpy (a, ®_args->gpr[gprcount++], 8); + } + } + } + + /* Invoke the closure. */ + closure->fun (cif, rvalue, avalue, closure->user_data); + + /* Tell assembly how to perform return type promotions. */ + return ret; +} + +#endif /* __x86_64__ */ diff -r -u ./Modules/_ctypes/libffi_osx/x86/x86-ffi_darwin.c ./Modules/_ctypes/libffi_osx/x86/x86-ffi_darwin.c new file mode 100644 index 0000000..706ea0f --- /dev/null +++ ./Modules/_ctypes/libffi_osx/x86/x86-ffi_darwin.c @@ -0,0 +1,438 @@ +#ifdef __i386__ +/* ----------------------------------------------------------------------- + ffi.c - Copyright (c) 1996, 1998, 1999, 2001 Red Hat, Inc. + Copyright (c) 2002 Ranjit Mathew + Copyright (c) 2002 Bo Thorsen + Copyright (c) 2002 Roger Sayle + + x86 Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#include +#include + +#include + +/* ffi_prep_args is called by the assembly routine once stack space + has been allocated for the function's arguments */ + +void ffi_prep_args(char *stack, extended_cif *ecif); + +void ffi_prep_args(char *stack, extended_cif *ecif) +{ + register unsigned int i; + register void **p_argv; + register char *argp; + register ffi_type **p_arg; + + argp = stack; + + if (ecif->cif->flags == FFI_TYPE_STRUCT) + { + *(void **) argp = ecif->rvalue; + argp += 4; + } + + p_argv = ecif->avalue; + + for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; + i != 0; + i--, p_arg++) + { + size_t z; + + /* Align if necessary */ + if ((sizeof(int) - 1) & (unsigned) argp) + argp = (char *) ALIGN(argp, sizeof(int)); + + z = (*p_arg)->size; + if (z < sizeof(int)) + { + z = sizeof(int); + switch ((*p_arg)->type) + { + case FFI_TYPE_SINT8: + *(signed int *) argp = (signed int)*(SINT8 *)(* p_argv); + break; + + case FFI_TYPE_UINT8: + *(unsigned int *) argp = (unsigned int)*(UINT8 *)(* p_argv); + break; + + case FFI_TYPE_SINT16: + *(signed int *) argp = (signed int)*(SINT16 *)(* p_argv); + break; + + case FFI_TYPE_UINT16: + *(unsigned int *) argp = (unsigned int)*(UINT16 *)(* p_argv); + break; + + case FFI_TYPE_SINT32: + *(signed int *) argp = (signed int)*(SINT32 *)(* p_argv); + break; + + case FFI_TYPE_UINT32: + *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv); + break; + + case FFI_TYPE_STRUCT: + *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv); + break; + + default: + FFI_ASSERT(0); + } + } + else + { + memcpy(argp, *p_argv, z); + } + p_argv++; + argp += z; + } + + return; +} + +/* Perform machine dependent cif processing */ +ffi_status ffi_prep_cif_machdep(ffi_cif *cif) +{ + /* Set the return type flag */ + switch (cif->rtype->type) + { + case FFI_TYPE_VOID: +#ifdef X86 + case FFI_TYPE_STRUCT: + case FFI_TYPE_UINT8: + case FFI_TYPE_UINT16: + case FFI_TYPE_SINT8: + case FFI_TYPE_SINT16: +#endif + + case FFI_TYPE_SINT64: + case FFI_TYPE_FLOAT: + case FFI_TYPE_DOUBLE: + case FFI_TYPE_LONGDOUBLE: + cif->flags = (unsigned) cif->rtype->type; + break; + + case FFI_TYPE_UINT64: + cif->flags = FFI_TYPE_SINT64; + break; + +#ifndef X86 + case FFI_TYPE_STRUCT: + if (cif->rtype->size == 1) + { + cif->flags = FFI_TYPE_SINT8; /* same as char size */ + } + else if (cif->rtype->size == 2) + { + cif->flags = FFI_TYPE_SINT16; /* same as short size */ + } + else if (cif->rtype->size == 4) + { + cif->flags = FFI_TYPE_INT; /* same as int type */ + } + else if (cif->rtype->size == 8) + { + cif->flags = FFI_TYPE_SINT64; /* same as int64 type */ + } + else + { + cif->flags = FFI_TYPE_STRUCT; + } + break; +#endif + + default: + cif->flags = FFI_TYPE_INT; + break; + } + +#ifdef X86_DARWIN + cif->bytes = (cif->bytes + 15) & ~0xF; +#endif + + return FFI_OK; +} + +extern void ffi_call_SYSV(void (*)(char *, extended_cif *), extended_cif *, + unsigned, unsigned, unsigned *, void (*fn)()); + +#ifdef X86_WIN32 +extern void ffi_call_STDCALL(void (*)(char *, extended_cif *), extended_cif *, + unsigned, unsigned, unsigned *, void (*fn)()); + +#endif /* X86_WIN32 */ + +void ffi_call(ffi_cif *cif, void (*fn)(), void *rvalue, void **avalue) +{ + extended_cif ecif; + + ecif.cif = cif; + ecif.avalue = avalue; + + /* If the return value is a struct and we don't have a return */ + /* value address then we need to make one */ + + if ((rvalue == NULL) && + (cif->flags == FFI_TYPE_STRUCT)) + { + ecif.rvalue = alloca(cif->rtype->size); + } + else + ecif.rvalue = rvalue; + + + switch (cif->abi) + { + case FFI_SYSV: + ffi_call_SYSV(ffi_prep_args, &ecif, cif->bytes, cif->flags, ecif.rvalue, + fn); + break; +#ifdef X86_WIN32 + case FFI_STDCALL: + ffi_call_STDCALL(ffi_prep_args, &ecif, cif->bytes, cif->flags, + ecif.rvalue, fn); + break; +#endif /* X86_WIN32 */ + default: + FFI_ASSERT(0); + break; + } +} + + +/** private members **/ + +static void ffi_prep_incoming_args_SYSV (char *stack, void **ret, + void** args, ffi_cif* cif); +void FFI_HIDDEN ffi_closure_SYSV (ffi_closure *) +__attribute__ ((regparm(1))); +unsigned int FFI_HIDDEN ffi_closure_SYSV_inner (ffi_closure *, void **, void *) +__attribute__ ((regparm(1))); +void FFI_HIDDEN ffi_closure_raw_SYSV (ffi_raw_closure *) +__attribute__ ((regparm(1))); + +/* This function is jumped to by the trampoline */ + +unsigned int FFI_HIDDEN +ffi_closure_SYSV_inner (closure, respp, args) +ffi_closure *closure; +void **respp; +void *args; +{ + // our various things... + ffi_cif *cif; + void **arg_area; + + cif = closure->cif; + arg_area = (void**) alloca (cif->nargs * sizeof (void*)); + + /* this call will initialize ARG_AREA, such that each + * element in that array points to the corresponding + * value on the stack; and if the function returns + * a structure, it will re-set RESP to point to the + * structure return address. */ + + ffi_prep_incoming_args_SYSV(args, respp, arg_area, cif); + + (closure->fun) (cif, *respp, arg_area, closure->user_data); + + return cif->flags; +} + +static void +ffi_prep_incoming_args_SYSV(char *stack, void **rvalue, void **avalue, + ffi_cif *cif) +{ + register unsigned int i; + register void **p_argv; + register char *argp; + register ffi_type **p_arg; + + argp = stack; + + if ( cif->flags == FFI_TYPE_STRUCT ) { + *rvalue = *(void **) argp; + argp += 4; + } + + p_argv = avalue; + + for (i = cif->nargs, p_arg = cif->arg_types; (i != 0); i--, p_arg++) + { + size_t z; + + /* Align if necessary */ + if ((sizeof(int) - 1) & (unsigned) argp) { + argp = (char *) ALIGN(argp, sizeof(int)); + } + + z = (*p_arg)->size; + + /* because we're little endian, this is what it turns into. */ + + *p_argv = (void*) argp; + + p_argv++; + argp += z; + } + + return; +} + +/* How to make a trampoline. Derived from gcc/config/i386/i386.c. */ + +#define FFI_INIT_TRAMPOLINE(TRAMP,FUN,CTX) \ +({ unsigned char *__tramp = (unsigned char*)(TRAMP); \ +unsigned int __fun = (unsigned int)(FUN); \ +unsigned int __ctx = (unsigned int)(CTX); \ +unsigned int __dis = __fun - (__ctx + FFI_TRAMPOLINE_SIZE); \ +*(unsigned char*) &__tramp[0] = 0xb8; \ +*(unsigned int*) &__tramp[1] = __ctx; /* movl __ctx, %eax */ \ +*(unsigned char *) &__tramp[5] = 0xe9; \ +*(unsigned int*) &__tramp[6] = __dis; /* jmp __fun */ \ +}) + + +/* the cif must already be prep'ed */ +ffi_status +ffi_prep_closure (ffi_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif*,void*,void**,void*), + void *user_data) +{ + if (cif->abi != FFI_SYSV) + return FFI_BAD_ABI; + + FFI_INIT_TRAMPOLINE (&closure->tramp[0], \ + &ffi_closure_SYSV, \ + (void*)closure); + + closure->cif = cif; + closure->user_data = user_data; + closure->fun = fun; + + return FFI_OK; +} + +/* ------- Native raw API support -------------------------------- */ + +#if !FFI_NO_RAW_API + +ffi_status +ffi_prep_raw_closure_loc (ffi_raw_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif*,void*,ffi_raw*,void*), + void *user_data, + void *codeloc) +{ + int i; + + FFI_ASSERT (cif->abi == FFI_SYSV); + + // we currently don't support certain kinds of arguments for raw + // closures. This should be implemented by a separate assembly language + // routine, since it would require argument processing, something we + // don't do now for performance. + + for (i = cif->nargs-1; i >= 0; i--) + { + FFI_ASSERT (cif->arg_types[i]->type != FFI_TYPE_STRUCT); + FFI_ASSERT (cif->arg_types[i]->type != FFI_TYPE_LONGDOUBLE); + } + + + FFI_INIT_TRAMPOLINE (&closure->tramp[0], &ffi_closure_raw_SYSV, + codeloc); + + closure->cif = cif; + closure->user_data = user_data; + closure->fun = fun; + + return FFI_OK; +} + +static void +ffi_prep_args_raw(char *stack, extended_cif *ecif) +{ + memcpy (stack, ecif->avalue, ecif->cif->bytes); +} + +/* we borrow this routine from libffi (it must be changed, though, to + * actually call the function passed in the first argument. as of + * libffi-1.20, this is not the case.) + */ + +extern void +ffi_call_SYSV(void (*)(char *, extended_cif *), extended_cif *, unsigned, + unsigned, unsigned *, void (*fn)()); + +#ifdef X86_WIN32 +extern void +ffi_call_STDCALL(void (*)(char *, extended_cif *), extended_cif *, unsigned, + unsigned, unsigned *, void (*fn)()); +#endif /* X86_WIN32 */ + +void +ffi_raw_call(ffi_cif *cif, void (*fn)(), void *rvalue, ffi_raw *fake_avalue) +{ + extended_cif ecif; + void **avalue = (void **)fake_avalue; + + ecif.cif = cif; + ecif.avalue = avalue; + + /* If the return value is a struct and we don't have a return */ + /* value address then we need to make one */ + + if ((rvalue == NULL) && + (cif->rtype->type == FFI_TYPE_STRUCT)) + { + ecif.rvalue = alloca(cif->rtype->size); + } + else + ecif.rvalue = rvalue; + + + switch (cif->abi) + { + case FFI_SYSV: + ffi_call_SYSV(ffi_prep_args_raw, &ecif, cif->bytes, cif->flags, + ecif.rvalue, fn); + break; +#ifdef X86_WIN32 + case FFI_STDCALL: + ffi_call_STDCALL(ffi_prep_args_raw, &ecif, cif->bytes, cif->flags, + ecif.rvalue, fn); + break; +#endif /* X86_WIN32 */ + default: + FFI_ASSERT(0); + break; + } +} + +#endif +#endif // __i386__ diff -r -u ./setup.py ./setup.py index 46b92fe..2bf6b4b 100644 --- ./setup.py +++ ./setup.py @@ -98,8 +98,14 @@ class PyBuildExt(build_ext): self.detect_modules() # Remove modules that are present on the disabled list - self.extensions = [ext for ext in self.extensions - if ext.name not in disabled_module_list] + extensions = [ext for ext in self.extensions + if ext.name not in disabled_module_list] + # move ctypes to the end, it depends on other modules + ext_map = dict((ext.name, i) for i, ext in enumerate(extensions)) + if "_ctypes" in ext_map: + ctypes = extensions.pop(ext_map["_ctypes"]) + extensions.append(ctypes) + self.extensions = extensions # Fix up the autodetected modules, prefixing all the source files # with Modules/ and adding Python's include directory to the path. @@ -1330,9 +1336,39 @@ class PyBuildExt(build_ext): # *** Uncomment these for TOGL extension only: # -lGL -lGLU -lXext -lXmu \ + def configure_ctypes_darwin(self, ext): + # Darwin (OS X) uses preconfigured files, in + # the Modules/_ctypes/libffi_osx directory. + srcdir = sysconfig.get_config_var('srcdir') + ffi_srcdir = os.path.abspath(os.path.join(srcdir, 'Modules', + '_ctypes', 'libffi_osx')) + sources = [os.path.join(ffi_srcdir, p) + for p in ['ffi.c', + 'x86/darwin64.S', + 'x86/x86-darwin.S', + 'x86/x86-ffi_darwin.c', + 'x86/x86-ffi64.c', + 'powerpc/ppc-darwin.S', + 'powerpc/ppc-darwin_closure.S', + 'powerpc/ppc-ffi_darwin.c', + 'powerpc/ppc64-darwin_closure.S', + ]] + + # Add .S (preprocessed assembly) to C compiler source extensions. + self.compiler.src_extensions.append('.S') + + include_dirs = [os.path.join(ffi_srcdir, 'include'), + os.path.join(ffi_srcdir, 'powerpc')] + ext.include_dirs.extend(include_dirs) + ext.sources.extend(sources) + return True + def configure_ctypes(self, ext): if not self.use_system_libffi: - (srcdir,) = sysconfig.get_config_vars('srcdir') + if sys.platform == 'darwin': + return self.configure_ctypes_darwin(ext) + + srcdir = sysconfig.get_config_var('srcdir') ffi_builddir = os.path.join(self.build_temp, 'libffi') ffi_srcdir = os.path.abspath(os.path.join(srcdir, 'Modules', '_ctypes', 'libffi')) @@ -1347,7 +1383,10 @@ class PyBuildExt(build_ext): ffi_configfile): from distutils.dir_util import mkpath mkpath(ffi_builddir) - config_args = [] + config_args = [arg for arg in sysconfig.get_config_var("CONFIG_ARGS").split() + if (('--host=' in arg) or ('--build=' in arg))] + if not self.verbose: + config_args.append("-q") # Pass empty CFLAGS because we'll just append the resulting # CFLAGS to Python's; -g or -O2 is to be avoided. @@ -1367,10 +1406,12 @@ class PyBuildExt(build_ext): self.compiler.src_extensions.append('.S') include_dirs = [os.path.join(ffi_builddir, 'include'), - ffi_builddir, ffi_srcdir] + ffi_builddir, + os.path.join(ffi_srcdir, 'src')] extra_compile_args = fficonfig['ffi_cflags'].split() - ext.sources.extend(fficonfig['ffi_sources']) + ext.sources.extend(os.path.join(ffi_srcdir, f) for f in + fficonfig['ffi_sources']) ext.include_dirs.extend(include_dirs) ext.extra_compile_args.extend(extra_compile_args) return True @@ -1390,6 +1431,7 @@ class PyBuildExt(build_ext): if sys.platform == 'darwin': sources.append('_ctypes/darwin/dlfcn_simple.c') + extra_compile_args.append('-DMACOSX') include_dirs.append('_ctypes/darwin') # XXX Is this still needed? ## extra_link_args.extend(['-read_only_relocs', 'warning']) @@ -1419,7 +1461,14 @@ class PyBuildExt(build_ext): if not '--with-system-ffi' in sysconfig.get_config_var("CONFIG_ARGS"): return - ffi_inc = find_file('ffi.h', [], inc_dirs) + if sys.platform == 'darwin': + # OS X 10.5 comes with libffi.dylib; the include files are + # in /usr/include/ffi + inc_dirs.append('/usr/include/ffi') + + ffi_inc = [sysconfig.get_config_var("LIBFFI_INCLUDEDIR")] + if not ffi_inc or ffi_inc[0] == '': + ffi_inc = find_file('ffi.h', [], inc_dirs) if ffi_inc is not None: ffi_h = ffi_inc[0] + '/ffi.h' fp = open(ffi_h) 005_osx_failed_modules.patch000066400000000000000000000076331517431316200353340ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.5.1/Python-2.5.1diff -r -u ./Mac/Modules/cg/_CGmodule.c ./Mac/Modules/cg/_CGmodule.c index 8115614..e36fce9 100755 --- ./Mac/Modules/cg/_CGmodule.c +++ ./Mac/Modules/cg/_CGmodule.c @@ -1025,6 +1025,7 @@ static PyObject *CGContextRefObj_CGContextSetShouldAntialias(CGContextRefObject return _res; } +#ifndef __LP64__ static PyObject *CGContextRefObj_SyncCGContextOriginWithPort(CGContextRefObject *_self, PyObject *_args) { PyObject *_res = NULL; @@ -1055,6 +1056,7 @@ static PyObject *CGContextRefObj_ClipCGContextToRegion(CGContextRefObject *_self _res = Py_None; return _res; } +#endif static PyMethodDef CGContextRefObj_methods[] = { {"CGContextSaveGState", (PyCFunction)CGContextRefObj_CGContextSaveGState, 1, @@ -1173,10 +1175,12 @@ static PyMethodDef CGContextRefObj_methods[] = { PyDoc_STR("() -> None")}, {"CGContextSetShouldAntialias", (PyCFunction)CGContextRefObj_CGContextSetShouldAntialias, 1, PyDoc_STR("(int shouldAntialias) -> None")}, +#ifndef __LP64__ {"SyncCGContextOriginWithPort", (PyCFunction)CGContextRefObj_SyncCGContextOriginWithPort, 1, PyDoc_STR("(CGrafPtr port) -> None")}, {"ClipCGContextToRegion", (PyCFunction)CGContextRefObj_ClipCGContextToRegion, 1, PyDoc_STR("(Rect portRect, RgnHandle region) -> None")}, +#endif {NULL, NULL, 0} }; @@ -1254,6 +1258,7 @@ PyTypeObject CGContextRef_Type = { /* ------------------ End object type CGContextRef ------------------ */ +#ifndef __LP64__ static PyObject *CG_CreateCGContextForPort(PyObject *_self, PyObject *_args) { PyObject *_res = NULL; @@ -1271,10 +1276,13 @@ static PyObject *CG_CreateCGContextForPort(PyObject *_self, PyObject *_args) return _res; } +#endif static PyMethodDef CG_methods[] = { +#ifndef __LP64__ {"CreateCGContextForPort", (PyCFunction)CG_CreateCGContextForPort, 1, PyDoc_STR("(CGrafPtr) -> CGContextRef")}, +#endif {NULL, NULL, 0} }; diff -r -u ./Modules/_curses_panel.c ./Modules/_curses_panel.c index 0acf3fd..1728b59 100644 --- ./Modules/_curses_panel.c +++ ./Modules/_curses_panel.c @@ -56,7 +56,7 @@ typedef struct { PyTypeObject PyCursesPanel_Type; -#define PyCursesPanel_Check(v) ((v)->ob_type == &PyCursesPanel_Type) +#define PyCursesPanel_Check(v) (Py_TYPE(v) == &PyCursesPanel_Type) /* Some helper functions. The problem is that there's always a window associated with a panel. To ensure that Python's GC doesn't pull @@ -178,12 +178,13 @@ PyCursesPanel_New(PANEL *pan, PyCursesWindowObject *wo) po = PyObject_NEW(PyCursesPanelObject, &PyCursesPanel_Type); if (po == NULL) return NULL; po->pan = pan; - po->wo = wo; - Py_INCREF(wo); if (insert_lop(po) < 0) { - PyObject_DEL(po); - return NULL; + po->wo = NULL; + Py_DECREF(po); + return NULL; } + po->wo = wo; + Py_INCREF(wo); return (PyObject *)po; } @@ -191,8 +192,10 @@ static void PyCursesPanel_Dealloc(PyCursesPanelObject *po) { (void)del_panel(po->pan); - Py_DECREF(po->wo); - remove_lop(po); + if (po->wo != NULL) { + Py_DECREF(po->wo); + remove_lop(po); + } PyObject_DEL(po); } @@ -338,11 +341,10 @@ PyCursesPanel_GetAttr(PyCursesPanelObject *self, char *name) /* -------------------------------------------------------*/ PyTypeObject PyCursesPanel_Type = { - PyObject_HEAD_INIT(NULL) - 0, /*ob_size*/ - "_curses_panel.curses panel", /*tp_name*/ - sizeof(PyCursesPanelObject), /*tp_basicsize*/ - 0, /*tp_itemsize*/ + PyVarObject_HEAD_INIT(NULL, 0) + "_curses_panel.curses panel", /*tp_name*/ + sizeof(PyCursesPanelObject), /*tp_basicsize*/ + 0, /*tp_itemsize*/ /* methods */ (destructor)PyCursesPanel_Dealloc, /*tp_dealloc*/ 0, /*tp_print*/ @@ -458,7 +460,7 @@ init_curses_panel(void) PyObject *m, *d, *v; /* Initialize object type */ - PyCursesPanel_Type.ob_type = &PyType_Type; + Py_TYPE(&PyCursesPanel_Type) = &PyType_Type; import_curses(); pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.5.2/000077500000000000000000000000001517431316200262075ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.5.2/Python-2.5.2/000077500000000000000000000000001517431316200301325ustar00rootroot00000000000000000_patch-setup.py.diff000066400000000000000000000035211517431316200341510ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.5.2/Python-2.5.2--- setup.py.orig 2011-07-07 19:19:43.800122463 +0900 +++ setup.py 2011-07-07 19:25:04.548416377 +0900 @@ -13,6 +13,7 @@ from distutils.command.build_ext import build_ext from distutils.command.install import install from distutils.command.install_lib import install_lib +from distutils.spawn import find_executable # This global variable is used to hold the list of modules to be disabled. disabled_module_list = [] @@ -242,10 +243,34 @@ return platform return sys.platform + def add_multiarch_paths(self): + # Debian/Ubuntu multiarch support. + # https://wiki.ubuntu.com/MultiarchSpec + if not find_executable('dpkg-architecture'): + return + tmpfile = os.path.join(self.build_temp, 'multiarch') + if not os.path.exists(self.build_temp): + os.makedirs(self.build_temp) + ret = os.system( + 'dpkg-architecture -qDEB_HOST_MULTIARCH > %s 2> /dev/null' % + tmpfile) + try: + if ret >> 8 == 0: + fp = open(tmpfile) + multiarch_path_component = fp.readline().strip() + fp.close() + add_dir_to_list(self.compiler.library_dirs, + '/usr/lib/' + multiarch_path_component) + add_dir_to_list(self.compiler.include_dirs, + '/usr/include/' + multiarch_path_component) + finally: + os.unlink(tmpfile) + def detect_modules(self): # Ensure that /usr/local is always used add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib') add_dir_to_list(self.compiler.include_dirs, '/usr/local/include') + self.add_multiarch_paths() # Add paths specified in the environment variables LDFLAGS and # CPPFLAGS for header and library files. 001_patch-svnversion.patch000066400000000000000000000023661517431316200347740ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.5.2/Python-2.5.2--- configure.in +++ configure.in @@ -767,7 +767,7 @@ then SVNVERSION="svnversion \$(srcdir)" else - SVNVERSION="echo exported" + SVNVERSION="echo Unversioned directory" fi case $MACHDEP in --- Makefile.pre.in +++ Makefile.pre.in @@ -501,7 +501,7 @@ $(SIGNAL_OBJS) \ $(MODOBJS) \ $(srcdir)/Modules/getbuildinfo.c - $(CC) -c $(PY_CFLAGS) -DSVNVERSION=\"`LC_ALL=C $(SVNVERSION)`\" -o $@ $(srcdir)/Modules/getbuildinfo.c + $(CC) -c $(PY_CFLAGS) -DSVNVERSION="\"`LC_ALL=C $(SVNVERSION)`\"" -o $@ $(srcdir)/Modules/getbuildinfo.c Modules/getpath.o: $(srcdir)/Modules/getpath.c Makefile $(CC) -c $(PY_CFLAGS) -DPYTHONPATH='"$(PYTHONPATH)"' \ --- Modules/getbuildinfo.c +++ Modules/getbuildinfo.c @@ -48,5 +48,5 @@ static const char svnversion[] = SVNVERSION; if (svnversion[0] != '$') return svnversion; /* it was interpolated, or passed on command line */ - return "exported"; + return "Unversioned directory"; } --- Python/sysmodule.c +++ Python/sysmodule.c @@ -1161,7 +1161,7 @@ svnversion = _Py_svnversion(); - if (strcmp(svnversion, "exported") != 0) + if (strcmp(svnversion, "Unversioned directory") != 0 && strcmp(svnversion, "exported") != 0) svn_revision = svnversion; else if (istag) { len = strlen(_patchlevel_revision); 002_darwin_c_source.patch000066400000000000000000000132671517431316200346340ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.5.2/Python-2.5.2diff -r -u ./configure ../Python-2.5/configure --- ./configure 2006-09-05 11:54:42.000000000 +0900 +++ ../Python-2.5/configure 2013-07-19 15:27:46.000000000 +0900 @@ -1396,6 +1396,16 @@ _ACEOF +# The later defininition of _XOPEN_SOURCE and _POSIX_C_SOURCE disables +# certain features on Mac OS X, so we need _DARWIN_C_SOURCE to re-enable +# them. + +cat >>confdefs.h <<\_ACEOF +#define _DARWIN_C_SOURCE 1 +_ACEOF + + + define_xopen_source=yes # Arguments passed to configure. @@ -3885,11 +3895,110 @@ ;; # is there any other compiler on Darwin besides gcc? Darwin*) - BASECFLAGS="$BASECFLAGS -Wno-long-double -no-cpp-precomp -mno-fused-madd" + # -Wno-long-double, -no-cpp-precomp, and -mno-fused-madd + # used to be here, but non-Apple gcc doesn't accept them. + if test "${CC}" = gcc + then + { echo "$as_me:${as_lineno-$LINENO}: checking which compiler should be used" >&5 +echo -n "checking which compiler should be used... " >&6; } + case "${UNIVERSALSDK}" in + */MacOSX10.4u.sdk) + # Build using 10.4 SDK, force usage of gcc when the + # compiler is gcc, otherwise the user will get very + # confusing error messages when building on OSX 10.6 + CC=gcc-4.0 + CPP=cpp-4.0 + ;; + esac + { echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +echo "$CC" >&6; } + fi + + if test "${enable_universalsdk}"; then - BASECFLAGS="-arch ppc -arch i386 -isysroot ${UNIVERSALSDK} ${BASECFLAGS}" + UNIVERSAL_ARCH_FLAGS="" + if test "$UNIVERSAL_ARCHS" = "32-bit" ; then + UNIVERSAL_ARCH_FLAGS="-arch ppc -arch i386" + ARCH_RUN_32BIT="" + LIPO_32BIT_FLAGS="" + elif test "$UNIVERSAL_ARCHS" = "64-bit" ; then + UNIVERSAL_ARCH_FLAGS="-arch ppc64 -arch x86_64" + LIPO_32BIT_FLAGS="" + ARCH_RUN_32BIT="true" + + elif test "$UNIVERSAL_ARCHS" = "all" ; then + UNIVERSAL_ARCH_FLAGS="-arch i386 -arch ppc -arch ppc64 -arch x86_64" + LIPO_32BIT_FLAGS="-extract ppc7400 -extract i386" + ARCH_RUN_32BIT="/usr/bin/arch -i386 -ppc" + + elif test "$UNIVERSAL_ARCHS" = "intel" ; then + UNIVERSAL_ARCH_FLAGS="-arch i386 -arch x86_64" + LIPO_32BIT_FLAGS="-extract i386" + ARCH_RUN_32BIT="/usr/bin/arch -i386" + + elif test "$UNIVERSAL_ARCHS" = "3-way" ; then + UNIVERSAL_ARCH_FLAGS="-arch i386 -arch ppc -arch x86_64" + LIPO_32BIT_FLAGS="-extract ppc7400 -extract i386" + ARCH_RUN_32BIT="/usr/bin/arch -i386 -ppc" + + else + as_fn_error $? "proper usage is --with-universal-arch=32-bit|64-bit|all|intel|3-way" "$LINENO" 5 + + fi + + + CFLAGS="${UNIVERSAL_ARCH_FLAGS} -isysroot ${UNIVERSALSDK} ${CFLAGS}" + if test "${UNIVERSALSDK}" != "/" + then + CFLAGS="-isysroot ${UNIVERSALSDK} ${CFLAGS}" + LDFLAGS="-isysroot ${UNIVERSALSDK} ${LDFLAGS}" + CPPFLAGS="-isysroot ${UNIVERSALSDK} ${CPPFLAGS}" + fi fi + # Calculate the right deployment target for this build. + # + cur_target=`sw_vers -productVersion | sed 's/\(10\.[0-9]*\).*/\1/'` + if test ${cur_target} '>' 10.2 && \ + test ${cur_target} '<' 10.6 + then + cur_target=10.3 + if test ${enable_universalsdk}; then + if test "${UNIVERSAL_ARCHS}" = "all"; then + # Ensure that the default platform for a + # 4-way universal build is OSX 10.5, + # that's the first OS release where + # 4-way builds make sense. + cur_target='10.5' + + elif test "${UNIVERSAL_ARCHS}" = "3-way"; then + cur_target='10.5' + + elif test "${UNIVERSAL_ARCHS}" = "intel"; then + cur_target='10.5' + + elif test "${UNIVERSAL_ARCHS}" = "64-bit"; then + cur_target='10.5' + fi + else + if test `/usr/bin/arch` = "i386"; then + # On Intel macs default to a deployment + # target of 10.4, that's the first OSX + # release with Intel support. + cur_target="10.4" + fi + fi + fi + CONFIGURE_MACOSX_DEPLOYMENT_TARGET=${MACOSX_DEPLOYMENT_TARGET-${cur_target}} + + # Make sure that MACOSX_DEPLOYMENT_TARGET is set in the + # environment with a value that is the same as what we'll use + # in the Makefile to ensure that we'll get the same compiler + # environment during configure and build time. + MACOSX_DEPLOYMENT_TARGET="$CONFIGURE_MACOSX_DEPLOYMENT_TARGET" + export MACOSX_DEPLOYMENT_TARGET + EXPORT_MACOSX_DEPLOYMENT_TARGET='' + ;; OSF*) BASECFLAGS="$BASECFLAGS -mieee" @@ -10851,7 +10960,7 @@ if test "${enable_universalsdk}"; then : else - LIBTOOL_CRUFT="${LIBTOOL_CRUFT} -arch_only `arch`" + LIBTOOL_CRUFT="${LIBTOOL_CRUFT}" fi LIBTOOL_CRUFT=$LIBTOOL_CRUFT' -install_name $(PYTHONFRAMEWORKINSTALLDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK)' LIBTOOL_CRUFT=$LIBTOOL_CRUFT' -compatibility_version $(VERSION) -current_version $(VERSION)';; @@ -10863,7 +10972,7 @@ else LIBTOOL_CRUFT="" fi - LIBTOOL_CRUFT=$LIBTOOL_CRUFT" -lSystem -lSystemStubs -arch_only `arch`" + LIBTOOL_CRUFT=$LIBTOOL_CRUFT" -lSystem -lSystemStubs" LIBTOOL_CRUFT=$LIBTOOL_CRUFT' -install_name $(PYTHONFRAMEWORKINSTALLDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK)' LIBTOOL_CRUFT=$LIBTOOL_CRUFT' -compatibility_version $(VERSION) -current_version $(VERSION)';; esac diff -r -u ./pyconfig.h.in ../Python-2.5/pyconfig.h.in --- ./pyconfig.h.in 2006-07-30 23:09:47.000000000 +0900 +++ ../Python-2.5/pyconfig.h.in 2013-07-17 23:12:31.000000000 +0900 @@ -912,6 +912,11 @@ /* Define on Irix to enable u_int */ #undef _BSD_TYPES +/* Define on Darwin to activate all library features */ +#ifndef _DARWIN_C_SOURCE +#define _DARWIN_C_SOURCE +#endif + /* This must be set to 64 on some systems to enable large file support. */ #undef _FILE_OFFSET_BITS 003_osx_lp64.patch000066400000000000000000000215441517431316200331420ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.5.2/Python-2.5.2diff -r -u ./Include/pymactoolbox.h ../Python-2.5/Include/pymactoolbox.h --- ./Include/pymactoolbox.h 2004-11-05 16:02:59.000000000 +0900 +++ ../Python-2.5/Include/pymactoolbox.h 2013-07-17 23:38:51.000000000 +0900 @@ -8,7 +8,10 @@ #endif #include + +#ifndef __LP64__ #include +#endif /* !__LP64__ */ /* ** Helper routines for error codes and such. @@ -18,8 +21,11 @@ PyObject *PyMac_GetOSErrException(void); /* Initialize & return it */ PyObject *PyErr_Mac(PyObject *, int); /* Exception with a mac error */ PyObject *PyMac_Error(OSErr); /* Uses PyMac_GetOSErrException */ +#ifndef __LP64__ extern OSErr PyMac_GetFullPathname(FSSpec *, char *, int); /* convert fsspec->path */ +#endif /* __LP64__ */ + /* ** These conversion routines are defined in mactoolboxglue.c itself. */ @@ -83,8 +89,10 @@ #endif /* USE_TOOLBOX_OBJECT_GLUE */ /* macfs exports */ +#ifndef __LP64__ int PyMac_GetFSSpec(PyObject *, FSSpec *); /* argument parser for FSSpec */ PyObject *PyMac_BuildFSSpec(FSSpec *); /* Convert FSSpec to PyObject */ +#endif /* !__LP64__ */ int PyMac_GetFSRef(PyObject *, FSRef *); /* argument parser for FSRef */ PyObject *PyMac_BuildFSRef(FSRef *); /* Convert FSRef to PyObject */ @@ -101,39 +109,54 @@ extern int CmpInstObj_Convert(PyObject *, ComponentInstance *); /* Ctl exports */ +#ifndef __LP64__ extern PyObject *CtlObj_New(ControlHandle); extern int CtlObj_Convert(PyObject *, ControlHandle *); +#endif /* !__LP64__ */ /* Dlg exports */ +#ifndef __LP64__ extern PyObject *DlgObj_New(DialogPtr); extern int DlgObj_Convert(PyObject *, DialogPtr *); extern PyObject *DlgObj_WhichDialog(DialogPtr); +#endif /* !__LP64__ */ /* Drag exports */ +#ifndef __LP64__ extern PyObject *DragObj_New(DragReference); extern int DragObj_Convert(PyObject *, DragReference *); +#endif /* !__LP64__ */ /* List exports */ +#ifndef __LP64__ extern PyObject *ListObj_New(ListHandle); extern int ListObj_Convert(PyObject *, ListHandle *); +#endif /* !__LP64__ */ /* Menu exports */ +#ifndef __LP64__ extern PyObject *MenuObj_New(MenuHandle); extern int MenuObj_Convert(PyObject *, MenuHandle *); +#endif /* !__LP64__ */ /* Qd exports */ +#ifndef __LP64__ extern PyObject *GrafObj_New(GrafPtr); extern int GrafObj_Convert(PyObject *, GrafPtr *); extern PyObject *BMObj_New(BitMapPtr); extern int BMObj_Convert(PyObject *, BitMapPtr *); extern PyObject *QdRGB_New(RGBColor *); extern int QdRGB_Convert(PyObject *, RGBColor *); +#endif /* !__LP64__ */ /* Qdoffs exports */ +#ifndef __LP64__ extern PyObject *GWorldObj_New(GWorldPtr); extern int GWorldObj_Convert(PyObject *, GWorldPtr *); +#endif /* !__LP64__ */ /* Qt exports */ +#ifndef __LP64__ extern PyObject *TrackObj_New(Track); extern int TrackObj_Convert(PyObject *, Track *); extern PyObject *MovieObj_New(Movie); @@ -146,6 +169,7 @@ extern int UserDataObj_Convert(PyObject *, UserData *); extern PyObject *MediaObj_New(Media); extern int MediaObj_Convert(PyObject *, Media *); +#endif /* !__LP64__ */ /* Res exports */ extern PyObject *ResObj_New(Handle); @@ -154,13 +178,17 @@ extern int OptResObj_Convert(PyObject *, Handle *); /* TE exports */ +#ifndef __LP64__ extern PyObject *TEObj_New(TEHandle); extern int TEObj_Convert(PyObject *, TEHandle *); +#endif /* !__LP64__ */ /* Win exports */ +#ifndef __LP64__ extern PyObject *WinObj_New(WindowPtr); extern int WinObj_Convert(PyObject *, WindowPtr *); extern PyObject *WinObj_WhichWindow(WindowPtr); +#endif /* !__LP64__ */ /* CF exports */ extern PyObject *CFObj_New(CFTypeRef); diff -r -u ./Mac/Modules/res/_Resmodule.c ../Python-2.5/Mac/Modules/res/_Resmodule.c --- ./Mac/Modules/res/_Resmodule.c 2005-07-04 05:59:44.000000000 +0900 +++ ../Python-2.5/Mac/Modules/res/_Resmodule.c 2013-07-17 23:38:51.000000000 +0900 @@ -414,6 +414,7 @@ return _res; } +#ifndef __LP64__ static PyObject *ResObj_as_Control(ResourceObject *_self, PyObject *_args) { PyObject *_res = NULL; @@ -431,6 +432,7 @@ return _res; } +#endif /* !__LP64__ */ static PyObject *ResObj_LoadResource(ResourceObject *_self, PyObject *_args) { @@ -1152,6 +1154,7 @@ return _res; } +#ifndef __LP64__ static PyObject *Res_OpenRFPerm(PyObject *_self, PyObject *_args) { PyObject *_res = NULL; @@ -1287,6 +1290,7 @@ _res = Py_None; return _res; } +#endif /* !__LP64__ */ static PyObject *Res_InsertResourceFile(PyObject *_self, PyObject *_args) { @@ -1327,6 +1331,7 @@ return _res; } +#ifndef __LP64__ static PyObject *Res_FSpResourceFileAlreadyOpen(PyObject *_self, PyObject *_args) { PyObject *_res = NULL; @@ -1413,6 +1418,7 @@ nextRefNum); return _res; } +#endif /* !__LP64__ */ static PyObject *Res_FSOpenResFile(PyObject *_self, PyObject *_args) { @@ -1438,6 +1444,7 @@ return _res; } +#ifndef __LP64__ static PyObject *Res_FSCreateResFile(PyObject *_self, PyObject *_args) { PyObject *_res = NULL; @@ -1534,6 +1541,7 @@ PyMac_BuildFSSpec, &newSpec); return _res; } +#endif /* __LP64__ */ static PyObject *Res_FSOpenResourceFile(PyObject *_self, PyObject *_args) { @@ -1637,6 +1645,7 @@ PyDoc_STR("(short refNum) -> (short _rv)")}, {"SetResFileAttrs", (PyCFunction)Res_SetResFileAttrs, 1, PyDoc_STR("(short refNum, short attrs) -> None")}, +#ifndef __LP64__ {"OpenRFPerm", (PyCFunction)Res_OpenRFPerm, 1, PyDoc_STR("(Str255 fileName, short vRefNum, SignedByte permission) -> (short _rv)")}, {"HOpenResFile", (PyCFunction)Res_HOpenResFile, 1, @@ -1647,10 +1656,12 @@ PyDoc_STR("(FSSpec spec, SignedByte permission) -> (short _rv)")}, {"FSpCreateResFile", (PyCFunction)Res_FSpCreateResFile, 1, PyDoc_STR("(FSSpec spec, OSType creator, OSType fileType, ScriptCode scriptTag) -> None")}, +#endif /* !__LP64__ */ {"InsertResourceFile", (PyCFunction)Res_InsertResourceFile, 1, PyDoc_STR("(SInt16 refNum, RsrcChainLocation where) -> None")}, {"DetachResourceFile", (PyCFunction)Res_DetachResourceFile, 1, PyDoc_STR("(SInt16 refNum) -> None")}, +#ifndef __LP64__ {"FSpResourceFileAlreadyOpen", (PyCFunction)Res_FSpResourceFileAlreadyOpen, 1, PyDoc_STR("(FSSpec resourceFile) -> (Boolean _rv, Boolean inChain, SInt16 refNum)")}, {"FSpOpenOrphanResFile", (PyCFunction)Res_FSpOpenOrphanResFile, 1, @@ -1659,14 +1670,17 @@ PyDoc_STR("() -> (SInt16 refNum)")}, {"GetNextResourceFile", (PyCFunction)Res_GetNextResourceFile, 1, PyDoc_STR("(SInt16 curRefNum) -> (SInt16 nextRefNum)")}, +#endif /* __LP64__ */ {"FSOpenResFile", (PyCFunction)Res_FSOpenResFile, 1, PyDoc_STR("(FSRef ref, SignedByte permission) -> (short _rv)")}, +#ifndef __LP64__ {"FSCreateResFile", (PyCFunction)Res_FSCreateResFile, 1, PyDoc_STR("(FSRef parentRef, Buffer nameLength) -> (FSRef newRef, FSSpec newSpec)")}, {"FSResourceFileAlreadyOpen", (PyCFunction)Res_FSResourceFileAlreadyOpen, 1, PyDoc_STR("(FSRef resourceFileRef) -> (Boolean _rv, Boolean inChain, SInt16 refNum)")}, {"FSCreateResourceFile", (PyCFunction)Res_FSCreateResourceFile, 1, PyDoc_STR("(FSRef parentRef, Buffer nameLength, Buffer forkNameLength) -> (FSRef newRef, FSSpec newSpec)")}, +#endif /* __LP64__ */ {"FSOpenResourceFile", (PyCFunction)Res_FSOpenResourceFile, 1, PyDoc_STR("(FSRef ref, Buffer forkNameLength, SignedByte permissions) -> (SInt16 refNum)")}, {"Handle", (PyCFunction)Res_Handle, 1, diff -r -u ./Modules/_ctypes/libffi/src/darwin/ffitarget.h ../Python-2.5/Modules/_ctypes/libffi/src/darwin/ffitarget.h --- ./Modules/_ctypes/libffi/src/darwin/ffitarget.h 2006-05-26 06:58:05.000000000 +0900 +++ ../Python-2.5/Modules/_ctypes/libffi/src/darwin/ffitarget.h 2013-07-17 23:38:51.000000000 +0900 @@ -4,7 +4,7 @@ * created by configure). This makes is possible to build a univeral binary * of ctypes in one go. */ -#if defined(__i386__) +#if defined(__i386__) || defined(__x86_64__) #ifndef X86_DARWIN #define X86_DARWIN diff -r -u ./Python/mactoolboxglue.c ../Python-2.5/Python/mactoolboxglue.c --- ./Python/mactoolboxglue.c 2006-07-12 01:44:25.000000000 +0900 +++ ../Python-2.5/Python/mactoolboxglue.c 2013-07-17 23:39:09.000000000 +0900 @@ -106,6 +106,7 @@ } +#ifndef __LP64__ OSErr PyMac_GetFullPathname(FSSpec *fss, char *path, int len) { @@ -153,6 +154,7 @@ Py_XDECREF(fs); return err; } +#endif /* !__LP64__ */ /* Convert a 4-char string object argument to an OSType value */ int @@ -417,6 +419,7 @@ GLUE_NEW(GWorldPtr, GWorldObj_New, "Carbon.Qdoffs") GLUE_CONVERT(GWorldPtr, GWorldObj_Convert, "Carbon.Qdoffs") +#ifndef __LP64__ GLUE_NEW(Track, TrackObj_New, "Carbon.Qt") GLUE_CONVERT(Track, TrackObj_Convert, "Carbon.Qt") GLUE_NEW(Movie, MovieObj_New, "Carbon.Qt") @@ -429,6 +432,7 @@ GLUE_CONVERT(UserData, UserDataObj_Convert, "Carbon.Qt") GLUE_NEW(Media, MediaObj_New, "Carbon.Qt") GLUE_CONVERT(Media, MediaObj_Convert, "Carbon.Qt") +#endif /* !__LP64__ */ GLUE_NEW(Handle, ResObj_New, "Carbon.Res") GLUE_CONVERT(Handle, ResObj_Convert, "Carbon.Res") 004_osx_libffi.patch000066400000000000000000005661361517431316200336240ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.5.2/Python-2.5.2diff -r -u ./Modules/_ctypes/libffi_osx/LICENSE ./Modules/_ctypes/libffi_osx/LICENSE new file mode 100644 index 0000000..f591795 --- /dev/null +++ ./Modules/_ctypes/libffi_osx/LICENSE @@ -0,0 +1,20 @@ +libffi - Copyright (c) 1996-2003 Red Hat, Inc. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +``Software''), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff -r -u ./Modules/_ctypes/libffi_osx/README ./Modules/_ctypes/libffi_osx/README new file mode 100644 index 0000000..1fc2747 --- /dev/null +++ ./Modules/_ctypes/libffi_osx/README @@ -0,0 +1,500 @@ +This directory contains the libffi package, which is not part of GCC but +shipped with GCC as convenience. + +Status +====== + +libffi-2.00 has not been released yet! This is a development snapshot! + +libffi-1.20 was released on October 5, 1998. Check the libffi web +page for updates: . + + +What is libffi? +=============== + +Compilers for high level languages generate code that follow certain +conventions. These conventions are necessary, in part, for separate +compilation to work. One such convention is the "calling +convention". The "calling convention" is essentially a set of +assumptions made by the compiler about where function arguments will +be found on entry to a function. A "calling convention" also specifies +where the return value for a function is found. + +Some programs may not know at the time of compilation what arguments +are to be passed to a function. For instance, an interpreter may be +told at run-time about the number and types of arguments used to call +a given function. Libffi can be used in such programs to provide a +bridge from the interpreter program to compiled code. + +The libffi library provides a portable, high level programming +interface to various calling conventions. This allows a programmer to +call any function specified by a call interface description at run +time. + +Ffi stands for Foreign Function Interface. A foreign function +interface is the popular name for the interface that allows code +written in one language to call code written in another language. The +libffi library really only provides the lowest, machine dependent +layer of a fully featured foreign function interface. A layer must +exist above libffi that handles type conversions for values passed +between the two languages. + + +Supported Platforms and Prerequisites +===================================== + +Libffi has been ported to: + + SunOS 4.1.3 & Solaris 2.x (SPARC-V8, SPARC-V9) + + Irix 5.3 & 6.2 (System V/o32 & n32) + + Intel x86 - Linux (System V ABI) + + Alpha - Linux and OSF/1 + + m68k - Linux (System V ABI) + + PowerPC - Linux (System V ABI, Darwin, AIX) + + ARM - Linux (System V ABI) + +Libffi has been tested with the egcs 1.0.2 gcc compiler. Chances are +that other versions will work. Libffi has also been built and tested +with the SGI compiler tools. + +On PowerPC, the tests failed (see the note below). + +You must use GNU make to build libffi. SGI's make will not work. +Sun's probably won't either. + +If you port libffi to another platform, please let me know! I assume +that some will be easy (x86 NetBSD), and others will be more difficult +(HP). + + +Installing libffi +================= + +[Note: before actually performing any of these installation steps, + you may wish to read the "Platform Specific Notes" below.] + +First you must configure the distribution for your particular +system. Go to the directory you wish to build libffi in and run the +"configure" program found in the root directory of the libffi source +distribution. + +You may want to tell configure where to install the libffi library and +header files. To do that, use the --prefix configure switch. Libffi +will install under /usr/local by default. + +If you want to enable extra run-time debugging checks use the the +--enable-debug configure switch. This is useful when your program dies +mysteriously while using libffi. + +Another useful configure switch is --enable-purify-safety. Using this +will add some extra code which will suppress certain warnings when you +are using Purify with libffi. Only use this switch when using +Purify, as it will slow down the library. + +Configure has many other options. Use "configure --help" to see them all. + +Once configure has finished, type "make". Note that you must be using +GNU make. SGI's make will not work. Sun's probably won't either. +You can ftp GNU make from prep.ai.mit.edu:/pub/gnu. + +To ensure that libffi is working as advertised, type "make test". + +To install the library and header files, type "make install". + + +Using libffi +============ + + The Basics + ---------- + +Libffi assumes that you have a pointer to the function you wish to +call and that you know the number and types of arguments to pass it, +as well as the return type of the function. + +The first thing you must do is create an ffi_cif object that matches +the signature of the function you wish to call. The cif in ffi_cif +stands for Call InterFace. To prepare a call interface object, use the +following function: + +ffi_status ffi_prep_cif(ffi_cif *cif, ffi_abi abi, + unsigned int nargs, + ffi_type *rtype, ffi_type **atypes); + + CIF is a pointer to the call interface object you wish + to initialize. + + ABI is an enum that specifies the calling convention + to use for the call. FFI_DEFAULT_ABI defaults + to the system's native calling convention. Other + ABI's may be used with care. They are system + specific. + + NARGS is the number of arguments this function accepts. + libffi does not yet support vararg functions. + + RTYPE is a pointer to an ffi_type structure that represents + the return type of the function. Ffi_type objects + describe the types of values. libffi provides + ffi_type objects for many of the native C types: + signed int, unsigned int, signed char, unsigned char, + etc. There is also a pointer ffi_type object and + a void ffi_type. Use &ffi_type_void for functions that + don't return values. + + ATYPES is a vector of ffi_type pointers. ARGS must be NARGS long. + If NARGS is 0, this is ignored. + + +ffi_prep_cif will return a status code that you are responsible +for checking. It will be one of the following: + + FFI_OK - All is good. + + FFI_BAD_TYPEDEF - One of the ffi_type objects that ffi_prep_cif + came across is bad. + + +Before making the call, the VALUES vector should be initialized +with pointers to the appropriate argument values. + +To call the function using the initialized ffi_cif, use the +ffi_call function: + +void ffi_call(ffi_cif *cif, void *fn, void *rvalue, void **avalues); + + CIF is a pointer to the ffi_cif initialized specifically + for this function. + + FN is a pointer to the function you want to call. + + RVALUE is a pointer to a chunk of memory that is to hold the + result of the function call. Currently, it must be + at least one word in size (except for the n32 version + under Irix 6.x, which must be a pointer to an 8 byte + aligned value (a long long). It must also be at least + word aligned (depending on the return type, and the + system's alignment requirements). If RTYPE is + &ffi_type_void, this is ignored. If RVALUE is NULL, + the return value is discarded. + + AVALUES is a vector of void* that point to the memory locations + holding the argument values for a call. + If NARGS is 0, this is ignored. + + +If you are expecting a return value from FN it will have been stored +at RVALUE. + + + + An Example + ---------- + +Here is a trivial example that calls puts() a few times. + + #include + #include + + int main() + { + ffi_cif cif; + ffi_type *args[1]; + void *values[1]; + char *s; + int rc; + + /* Initialize the argument info vectors */ + args[0] = &ffi_type_uint; + values[0] = &s; + + /* Initialize the cif */ + if (ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, + &ffi_type_uint, args) == FFI_OK) + { + s = "Hello World!"; + ffi_call(&cif, puts, &rc, values); + /* rc now holds the result of the call to puts */ + + /* values holds a pointer to the function's arg, so to + call puts() again all we need to do is change the + value of s */ + s = "This is cool!"; + ffi_call(&cif, puts, &rc, values); + } + + return 0; + } + + + + Aggregate Types + --------------- + +Although libffi has no special support for unions or bit-fields, it is +perfectly happy passing structures back and forth. You must first +describe the structure to libffi by creating a new ffi_type object +for it. Here is the definition of ffi_type: + + typedef struct _ffi_type + { + unsigned size; + short alignment; + short type; + struct _ffi_type **elements; + } ffi_type; + +All structures must have type set to FFI_TYPE_STRUCT. You may set +size and alignment to 0. These will be calculated and reset to the +appropriate values by ffi_prep_cif(). + +elements is a NULL terminated array of pointers to ffi_type objects +that describe the type of the structure elements. These may, in turn, +be structure elements. + +The following example initializes a ffi_type object representing the +tm struct from Linux's time.h: + + struct tm { + int tm_sec; + int tm_min; + int tm_hour; + int tm_mday; + int tm_mon; + int tm_year; + int tm_wday; + int tm_yday; + int tm_isdst; + /* Those are for future use. */ + long int __tm_gmtoff__; + __const char *__tm_zone__; + }; + + { + ffi_type tm_type; + ffi_type *tm_type_elements[12]; + int i; + + tm_type.size = tm_type.alignment = 0; + tm_type.elements = &tm_type_elements; + + for (i = 0; i < 9; i++) + tm_type_elements[i] = &ffi_type_sint; + + tm_type_elements[9] = &ffi_type_slong; + tm_type_elements[10] = &ffi_type_pointer; + tm_type_elements[11] = NULL; + + /* tm_type can now be used to represent tm argument types and + return types for ffi_prep_cif() */ + } + + + +Platform Specific Notes +======================= + + Intel x86 + --------- + +There are no known problems with the x86 port. + + Sun SPARC - SunOS 4.1.3 & Solaris 2.x + ------------------------------------- + +You must use GNU Make to build libffi on Sun platforms. + + MIPS - Irix 5.3 & 6.x + --------------------- + +Irix 6.2 and better supports three different calling conventions: o32, +n32 and n64. Currently, libffi only supports both o32 and n32 under +Irix 6.x, but only o32 under Irix 5.3. Libffi will automatically be +configured for whichever calling convention it was built for. + +By default, the configure script will try to build libffi with the GNU +development tools. To build libffi with the SGI development tools, set +the environment variable CC to either "cc -32" or "cc -n32" before +running configure under Irix 6.x (depending on whether you want an o32 +or n32 library), or just "cc" for Irix 5.3. + +With the n32 calling convention, when returning structures smaller +than 16 bytes, be sure to provide an RVALUE that is 8 byte aligned. +Here's one way of forcing this: + + double struct_storage[2]; + my_small_struct *s = (my_small_struct *) struct_storage; + /* Use s for RVALUE */ + +If you don't do this you are liable to get spurious bus errors. + +"long long" values are not supported yet. + +You must use GNU Make to build libffi on SGI platforms. + + ARM - System V ABI + ------------------ + +The ARM port was performed on a NetWinder running ARM Linux ELF +(2.0.31) and gcc 2.8.1. + + + + PowerPC System V ABI + -------------------- + +There are two `System V ABI's which libffi implements for PowerPC. +They differ only in how small structures are returned from functions. + +In the FFI_SYSV version, structures that are 8 bytes or smaller are +returned in registers. This is what GCC does when it is configured +for solaris, and is what the System V ABI I have (dated September +1995) says. + +In the FFI_GCC_SYSV version, all structures are returned the same way: +by passing a pointer as the first argument to the function. This is +what GCC does when it is configured for linux or a generic sysv +target. + +EGCS 1.0.1 (and probably other versions of EGCS/GCC) also has a +inconsistency with the SysV ABI: When a procedure is called with many +floating-point arguments, some of them get put on the stack. They are +all supposed to be stored in double-precision format, even if they are +only single-precision, but EGCS stores single-precision arguments as +single-precision anyway. This causes one test to fail (the `many +arguments' test). + + +What's With The Crazy Comments? +=============================== + +You might notice a number of cryptic comments in the code, delimited +by /*@ and @*/. These are annotations read by the program LCLint, a +tool for statically checking C programs. You can read all about it at +. + + +History +======= + +1.20 Oct-5-98 + Raffaele Sena produces ARM port. + +1.19 Oct-5-98 + Fixed x86 long double and long long return support. + m68k bug fixes from Andreas Schwab. + Patch for DU assembler compatibility for the Alpha from Richard + Henderson. + +1.18 Apr-17-98 + Bug fixes and MIPS configuration changes. + +1.17 Feb-24-98 + Bug fixes and m68k port from Andreas Schwab. PowerPC port from + Geoffrey Keating. Various bug x86, Sparc and MIPS bug fixes. + +1.16 Feb-11-98 + Richard Henderson produces Alpha port. + +1.15 Dec-4-97 + Fixed an n32 ABI bug. New libtool, auto* support. + +1.14 May-13-97 + libtool is now used to generate shared and static libraries. + Fixed a minor portability problem reported by Russ McManus + . + +1.13 Dec-2-96 + Added --enable-purify-safety to keep Purify from complaining + about certain low level code. + Sparc fix for calling functions with < 6 args. + Linux x86 a.out fix. + +1.12 Nov-22-96 + Added missing ffi_type_void, needed for supporting void return + types. Fixed test case for non MIPS machines. Cygnus Support + is now Cygnus Solutions. + +1.11 Oct-30-96 + Added notes about GNU make. + +1.10 Oct-29-96 + Added configuration fix for non GNU compilers. + +1.09 Oct-29-96 + Added --enable-debug configure switch. Clean-ups based on LCLint + feedback. ffi_mips.h is always installed. Many configuration + fixes. Fixed ffitest.c for sparc builds. + +1.08 Oct-15-96 + Fixed n32 problem. Many clean-ups. + +1.07 Oct-14-96 + Gordon Irlam rewrites v8.S again. Bug fixes. + +1.06 Oct-14-96 + Gordon Irlam improved the sparc port. + +1.05 Oct-14-96 + Interface changes based on feedback. + +1.04 Oct-11-96 + Sparc port complete (modulo struct passing bug). + +1.03 Oct-10-96 + Passing struct args, and returning struct values works for + all architectures/calling conventions. Expanded tests. + +1.02 Oct-9-96 + Added SGI n32 support. Fixed bugs in both o32 and Linux support. + Added "make test". + +1.01 Oct-8-96 + Fixed float passing bug in mips version. Restructured some + of the code. Builds cleanly with SGI tools. + +1.00 Oct-7-96 + First release. No public announcement. + + +Authors & Credits +================= + +libffi was written by Anthony Green . + +Portions of libffi were derived from Gianni Mariani's free gencall +library for Silicon Graphics machines. + +The closure mechanism was designed and implemented by Kresten Krab +Thorup. + +The Sparc port was derived from code contributed by the fine folks at +Visible Decisions Inc . Further enhancements were +made by Gordon Irlam at Cygnus Solutions . + +The Alpha port was written by Richard Henderson at Cygnus Solutions. + +Andreas Schwab ported libffi to m68k Linux and provided a number of +bug fixes. + +Geoffrey Keating ported libffi to the PowerPC. + +Raffaele Sena ported libffi to the ARM. + +Jesper Skov and Andrew Haley both did more than their fair share of +stepping through the code and tracking down bugs. + +Thanks also to Tom Tromey for bug fixes and configuration help. + +Thanks to Jim Blandy, who provided some useful feedback on the libffi +interface. + +If you have a problem, or have found a bug, please send a note to +green@cygnus.com. diff -r -u ./Modules/_ctypes/libffi_osx/README.pyobjc ./Modules/_ctypes/libffi_osx/README.pyobjc new file mode 100644 index 0000000..405d85f --- /dev/null +++ ./Modules/_ctypes/libffi_osx/README.pyobjc @@ -0,0 +1,5 @@ +This directory contains a slightly modified version of libffi, extracted from +the GCC source-tree. + +The only modifications are those that are necessary to compile libffi using +the Apple provided compiler and outside of the GCC source tree. diff -r -u ./Modules/_ctypes/libffi_osx/ffi.c ./Modules/_ctypes/libffi_osx/ffi.c new file mode 100644 index 0000000..bf42093 --- /dev/null +++ ./Modules/_ctypes/libffi_osx/ffi.c @@ -0,0 +1,226 @@ +/* ----------------------------------------------------------------------- + prep_cif.c - Copyright (c) 1996, 1998 Red Hat, Inc. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#include +#include + +#include +#include + +/* Round up to FFI_SIZEOF_ARG. */ +#define STACK_ARG_SIZE(x) ALIGN(x, FFI_SIZEOF_ARG) + +/* Perform machine independent initialization of aggregate type + specifications. */ + +static ffi_status +initialize_aggregate( +/*@out@*/ ffi_type* arg) +{ +/*@-usedef@*/ + + if (arg == NULL || arg->elements == NULL || + arg->size != 0 || arg->alignment != 0) + return FFI_BAD_TYPEDEF; + + ffi_type** ptr = &(arg->elements[0]); + + while ((*ptr) != NULL) + { + if (((*ptr)->size == 0) && (initialize_aggregate(*ptr) != FFI_OK)) + return FFI_BAD_TYPEDEF; + + /* Perform a sanity check on the argument type */ + FFI_ASSERT_VALID_TYPE(*ptr); + +#ifdef POWERPC_DARWIN + int curalign = (*ptr)->alignment; + + if (ptr != &(arg->elements[0])) + { + if (curalign > 4 && curalign != 16) + curalign = 4; + } + + arg->size = ALIGN(arg->size, curalign); + arg->size += (*ptr)->size; + arg->alignment = (arg->alignment > curalign) ? + arg->alignment : curalign; +#else + arg->size = ALIGN(arg->size, (*ptr)->alignment); + arg->size += (*ptr)->size; + arg->alignment = (arg->alignment > (*ptr)->alignment) ? + arg->alignment : (*ptr)->alignment; +#endif + + ptr++; + } + + /* Structure size includes tail padding. This is important for + structures that fit in one register on ABIs like the PowerPC64 + Linux ABI that right justify small structs in a register. + It's also needed for nested structure layout, for example + struct A { long a; char b; }; struct B { struct A x; char y; }; + should find y at an offset of 2*sizeof(long) and result in a + total size of 3*sizeof(long). */ + arg->size = ALIGN(arg->size, arg->alignment); + + if (arg->size == 0) + return FFI_BAD_TYPEDEF; + + return FFI_OK; + +/*@=usedef@*/ +} + +#ifndef __CRIS__ +/* The CRIS ABI specifies structure elements to have byte + alignment only, so it completely overrides this functions, + which assumes "natural" alignment and padding. */ + +/* Perform machine independent ffi_cif preparation, then call + machine dependent routine. */ + +#if defined(X86_DARWIN) + +static inline bool +struct_on_stack( + int size) +{ + if (size > 8) + return true; + + /* This is not what the ABI says, but is what is really implemented */ + switch (size) + { + case 1: + case 2: + case 4: + case 8: + return false; + + default: + return true; + } +} + +#endif // defined(X86_DARWIN) + +// Arguments' ffi_type->alignment must be nonzero. +ffi_status +ffi_prep_cif( +/*@out@*/ /*@partial@*/ ffi_cif* cif, + ffi_abi abi, + unsigned int nargs, +/*@dependent@*/ /*@out@*/ /*@partial@*/ ffi_type* rtype, +/*@dependent@*/ ffi_type** atypes) +{ + if (cif == NULL) + return FFI_BAD_TYPEDEF; + + if (abi <= FFI_FIRST_ABI || abi > FFI_DEFAULT_ABI) + return FFI_BAD_ABI; + + unsigned int bytes = 0; + unsigned int i; + ffi_type** ptr; + + cif->abi = abi; + cif->arg_types = atypes; + cif->nargs = nargs; + cif->rtype = rtype; + cif->flags = 0; + + /* Initialize the return type if necessary */ + /*@-usedef@*/ + if ((cif->rtype->size == 0) && (initialize_aggregate(cif->rtype) != FFI_OK)) + return FFI_BAD_TYPEDEF; + /*@=usedef@*/ + + /* Perform a sanity check on the return type */ + FFI_ASSERT_VALID_TYPE(cif->rtype); + + /* x86-64 and s390 stack space allocation is handled in prep_machdep. */ +#if !defined M68K && !defined __x86_64__ && !defined S390 && !defined PA + /* Make space for the return structure pointer */ + if (cif->rtype->type == FFI_TYPE_STRUCT +#ifdef SPARC + && (cif->abi != FFI_V9 || cif->rtype->size > 32) +#endif +#ifdef X86_DARWIN + && (struct_on_stack(cif->rtype->size)) +#endif + ) + bytes = STACK_ARG_SIZE(sizeof(void*)); +#endif + + for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++) + { + /* Initialize any uninitialized aggregate type definitions */ + if (((*ptr)->size == 0) && (initialize_aggregate((*ptr)) != FFI_OK)) + return FFI_BAD_TYPEDEF; + + if ((*ptr)->alignment == 0) + return FFI_BAD_TYPEDEF; + + /* Perform a sanity check on the argument type, do this + check after the initialization. */ + FFI_ASSERT_VALID_TYPE(*ptr); + +#if defined(X86_DARWIN) + { + int align = (*ptr)->alignment; + + if (align > 4) + align = 4; + + if ((align - 1) & bytes) + bytes = ALIGN(bytes, align); + + bytes += STACK_ARG_SIZE((*ptr)->size); + } +#elif !defined __x86_64__ && !defined S390 && !defined PA +#ifdef SPARC + if (((*ptr)->type == FFI_TYPE_STRUCT + && ((*ptr)->size > 16 || cif->abi != FFI_V9)) + || ((*ptr)->type == FFI_TYPE_LONGDOUBLE + && cif->abi != FFI_V9)) + bytes += sizeof(void*); + else +#endif + { + /* Add any padding if necessary */ + if (((*ptr)->alignment - 1) & bytes) + bytes = ALIGN(bytes, (*ptr)->alignment); + + bytes += STACK_ARG_SIZE((*ptr)->size); + } +#endif + } + + cif->bytes = bytes; + + /* Perform machine dependent cif processing */ + return ffi_prep_cif_machdep(cif); +} +#endif /* not __CRIS__ */ diff -r -u ./Modules/_ctypes/libffi_osx/include/ffi.h ./Modules/_ctypes/libffi_osx/include/ffi.h new file mode 100644 index 0000000..c104a5c --- /dev/null +++ ./Modules/_ctypes/libffi_osx/include/ffi.h @@ -0,0 +1,355 @@ +/* -----------------------------------------------------------------*-C-*- + libffi PyOBJC - Copyright (c) 1996-2003 Red Hat, Inc. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + ----------------------------------------------------------------------- */ + +/* ------------------------------------------------------------------- + The basic API is described in the README file. + + The raw API is designed to bypass some of the argument packing + and unpacking on architectures for which it can be avoided. + + The closure API allows interpreted functions to be packaged up + inside a C function pointer, so that they can be called as C functions, + with no understanding on the client side that they are interpreted. + It can also be used in other cases in which it is necessary to package + up a user specified parameter and a function pointer as a single + function pointer. + + The closure API must be implemented in order to get its functionality, + e.g. for use by gij. Routines are provided to emulate the raw API + if the underlying platform doesn't allow faster implementation. + + More details on the raw and closure API can be found in: + + http://gcc.gnu.org/ml/java/1999-q3/msg00138.html + + and + + http://gcc.gnu.org/ml/java/1999-q3/msg00174.html + -------------------------------------------------------------------- */ + +#ifndef LIBFFI_H +#define LIBFFI_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Specify which architecture libffi is configured for. */ +#ifdef MACOSX +# if defined(__i386__) || defined(__x86_64__) +# define X86_DARWIN +# elif defined(__ppc__) || defined(__ppc64__) +# define POWERPC_DARWIN +# else +# error "Unsupported MacOS X CPU type" +# endif +#else +#error "Unsupported OS type" +#endif + +/* ---- System configuration information --------------------------------- */ + +#include "ffitarget.h" +#include "fficonfig.h" + +#ifndef LIBFFI_ASM + +#include +#include + +/* LONG_LONG_MAX is not always defined (not if STRICT_ANSI, for example). + But we can find it either under the correct ANSI name, or under GNU + C's internal name. */ +#ifdef LONG_LONG_MAX +# define FFI_LONG_LONG_MAX LONG_LONG_MAX +#else +# ifdef LLONG_MAX +# define FFI_LONG_LONG_MAX LLONG_MAX +# else +# ifdef __GNUC__ +# define FFI_LONG_LONG_MAX __LONG_LONG_MAX__ +# endif +# endif +#endif + +#if SCHAR_MAX == 127 +# define ffi_type_uchar ffi_type_uint8 +# define ffi_type_schar ffi_type_sint8 +#else +#error "char size not supported" +#endif + +#if SHRT_MAX == 32767 +# define ffi_type_ushort ffi_type_uint16 +# define ffi_type_sshort ffi_type_sint16 +#elif SHRT_MAX == 2147483647 +# define ffi_type_ushort ffi_type_uint32 +# define ffi_type_sshort ffi_type_sint32 +#else +#error "short size not supported" +#endif + +#if INT_MAX == 32767 +# define ffi_type_uint ffi_type_uint16 +# define ffi_type_sint ffi_type_sint16 +#elif INT_MAX == 2147483647 +# define ffi_type_uint ffi_type_uint32 +# define ffi_type_sint ffi_type_sint32 +#elif INT_MAX == 9223372036854775807 +# define ffi_type_uint ffi_type_uint64 +# define ffi_type_sint ffi_type_sint64 +#else +#error "int size not supported" +#endif + +#define ffi_type_ulong ffi_type_uint64 +#define ffi_type_slong ffi_type_sint64 + +#if LONG_MAX == 2147483647 +# if FFI_LONG_LONG_MAX != 9223372036854775807 +# error "no 64-bit data type supported" +# endif +#elif LONG_MAX != 9223372036854775807 +#error "long size not supported" +#endif + +/* The closure code assumes that this works on pointers, i.e. a size_t + can hold a pointer. */ + +typedef struct _ffi_type { + size_t size; + unsigned short alignment; + unsigned short type; +/*@null@*/ struct _ffi_type** elements; +} ffi_type; + +/* These are defined in types.c */ +extern ffi_type ffi_type_void; +extern ffi_type ffi_type_uint8; +extern ffi_type ffi_type_sint8; +extern ffi_type ffi_type_uint16; +extern ffi_type ffi_type_sint16; +extern ffi_type ffi_type_uint32; +extern ffi_type ffi_type_sint32; +extern ffi_type ffi_type_uint64; +extern ffi_type ffi_type_sint64; +extern ffi_type ffi_type_float; +extern ffi_type ffi_type_double; +extern ffi_type ffi_type_longdouble; +extern ffi_type ffi_type_pointer; + +typedef enum ffi_status { + FFI_OK = 0, + FFI_BAD_TYPEDEF, + FFI_BAD_ABI +} ffi_status; + +typedef unsigned FFI_TYPE; + +typedef struct ffi_cif { + ffi_abi abi; + unsigned nargs; +/*@dependent@*/ ffi_type** arg_types; +/*@dependent@*/ ffi_type* rtype; + unsigned bytes; + unsigned flags; +#ifdef FFI_EXTRA_CIF_FIELDS + FFI_EXTRA_CIF_FIELDS; +#endif +} ffi_cif; + +/* ---- Definitions for the raw API -------------------------------------- */ + +#ifndef FFI_SIZEOF_ARG +# if LONG_MAX == 2147483647 +# define FFI_SIZEOF_ARG 4 +# elif LONG_MAX == 9223372036854775807 +# define FFI_SIZEOF_ARG 8 +# endif +#endif + +typedef union { + ffi_sarg sint; + ffi_arg uint; + float flt; + char data[FFI_SIZEOF_ARG]; + void* ptr; +} ffi_raw; + +void +ffi_raw_call( +/*@dependent@*/ ffi_cif* cif, + void (*fn)(void), +/*@out@*/ void* rvalue, +/*@dependent@*/ ffi_raw* avalue); + +void +ffi_ptrarray_to_raw( + ffi_cif* cif, + void** args, + ffi_raw* raw); + +void +ffi_raw_to_ptrarray( + ffi_cif* cif, + ffi_raw* raw, + void** args); + +size_t +ffi_raw_size( + ffi_cif* cif); + +/* This is analogous to the raw API, except it uses Java parameter + packing, even on 64-bit machines. I.e. on 64-bit machines + longs and doubles are followed by an empty 64-bit word. */ +void +ffi_java_raw_call( +/*@dependent@*/ ffi_cif* cif, + void (*fn)(void), +/*@out@*/ void* rvalue, +/*@dependent@*/ ffi_raw* avalue); + +void +ffi_java_ptrarray_to_raw( + ffi_cif* cif, + void** args, + ffi_raw* raw); + +void +ffi_java_raw_to_ptrarray( + ffi_cif* cif, + ffi_raw* raw, + void** args); + +size_t +ffi_java_raw_size( + ffi_cif* cif); + +/* ---- Definitions for closures ----------------------------------------- */ + +#if FFI_CLOSURES + +typedef struct ffi_closure { + char tramp[FFI_TRAMPOLINE_SIZE]; + ffi_cif* cif; + void (*fun)(ffi_cif*,void*,void**,void*); + void* user_data; +} ffi_closure; + +ffi_status +ffi_prep_closure( + ffi_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif*,void*,void**,void*), + void* user_data); + +void ffi_closure_free(void *); +void *ffi_closure_alloc (size_t size, void **code); + +typedef struct ffi_raw_closure { + char tramp[FFI_TRAMPOLINE_SIZE]; + ffi_cif* cif; + +#if !FFI_NATIVE_RAW_API + /* if this is enabled, then a raw closure has the same layout + as a regular closure. We use this to install an intermediate + handler to do the transaltion, void** -> ffi_raw*. */ + void (*translate_args)(ffi_cif*,void*,void**,void*); + void* this_closure; +#endif + + void (*fun)(ffi_cif*,void*,ffi_raw*,void*); + void* user_data; +} ffi_raw_closure; + +ffi_status +ffi_prep_raw_closure( + ffi_raw_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif*,void*,ffi_raw*,void*), + void* user_data); + +ffi_status +ffi_prep_java_raw_closure( + ffi_raw_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif*,void*,ffi_raw*,void*), + void* user_data); + +#endif // FFI_CLOSURES + +/* ---- Public interface definition -------------------------------------- */ + +ffi_status +ffi_prep_cif( +/*@out@*/ /*@partial@*/ ffi_cif* cif, + ffi_abi abi, + unsigned int nargs, +/*@dependent@*/ /*@out@*/ /*@partial@*/ ffi_type* rtype, +/*@dependent@*/ ffi_type** atypes); + +void +ffi_call( +/*@dependent@*/ ffi_cif* cif, + void (*fn)(void), +/*@out@*/ void* rvalue, +/*@dependent@*/ void** avalue); + +/* Useful for eliminating compiler warnings */ +#define FFI_FN(f) ((void (*)(void))f) + +#endif // #ifndef LIBFFI_ASM +/* ---- Definitions shared with assembly code ---------------------------- */ + +/* If these change, update src/mips/ffitarget.h. */ +#define FFI_TYPE_VOID 0 +#define FFI_TYPE_INT 1 +#define FFI_TYPE_FLOAT 2 +#define FFI_TYPE_DOUBLE 3 + +#ifdef HAVE_LONG_DOUBLE +# define FFI_TYPE_LONGDOUBLE 4 +#else +# define FFI_TYPE_LONGDOUBLE FFI_TYPE_DOUBLE +#endif + +#define FFI_TYPE_UINT8 5 +#define FFI_TYPE_SINT8 6 +#define FFI_TYPE_UINT16 7 +#define FFI_TYPE_SINT16 8 +#define FFI_TYPE_UINT32 9 +#define FFI_TYPE_SINT32 10 +#define FFI_TYPE_UINT64 11 +#define FFI_TYPE_SINT64 12 +#define FFI_TYPE_STRUCT 13 +#define FFI_TYPE_POINTER 14 + +/* This should always refer to the last type code (for sanity checks) */ +#define FFI_TYPE_LAST FFI_TYPE_POINTER + +#ifdef __cplusplus +} +#endif + +#endif // #ifndef LIBFFI_H diff -r -u ./Modules/_ctypes/libffi_osx/include/ffi_common.h ./Modules/_ctypes/libffi_osx/include/ffi_common.h new file mode 100644 index 0000000..685a358 --- /dev/null +++ ./Modules/_ctypes/libffi_osx/include/ffi_common.h @@ -0,0 +1,102 @@ +/* ----------------------------------------------------------------------- + ffi_common.h - Copyright (c) 1996 Red Hat, Inc. + + Common internal definitions and macros. Only necessary for building + libffi. + ----------------------------------------------------------------------- */ + +#ifndef FFI_COMMON_H +#define FFI_COMMON_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "fficonfig.h" + +/* Do not move this. Some versions of AIX are very picky about where + this is positioned. */ +#ifdef __GNUC__ +# define alloca __builtin_alloca +#else +# if HAVE_ALLOCA_H +# include +# else +# ifdef _AIX +# pragma alloca +# else +# ifndef alloca /* predefined by HP cc +Olibcalls */ +char* alloca(); +# endif +# endif +# endif +#endif + +/* Check for the existence of memcpy. */ +#if STDC_HEADERS +# include +#else +# ifndef HAVE_MEMCPY +# define memcpy(d, s, n) bcopy((s), (d), (n)) +# endif +#endif + +/*#if defined(FFI_DEBUG) +#include +#endif*/ + +#ifdef FFI_DEBUG +#include + +/*@exits@*/ void +ffi_assert( +/*@temp@*/ char* expr, +/*@temp@*/ char* file, + int line); +void +ffi_stop_here(void); +void +ffi_type_test( +/*@temp@*/ /*@out@*/ ffi_type* a, +/*@temp@*/ char* file, + int line); + +# define FFI_ASSERT(x) ((x) ? (void)0 : ffi_assert(#x, __FILE__,__LINE__)) +# define FFI_ASSERT_AT(x, f, l) ((x) ? 0 : ffi_assert(#x, (f), (l))) +# define FFI_ASSERT_VALID_TYPE(x) ffi_type_test(x, __FILE__, __LINE__) +#else +# define FFI_ASSERT(x) +# define FFI_ASSERT_AT(x, f, l) +# define FFI_ASSERT_VALID_TYPE(x) +#endif // #ifdef FFI_DEBUG + +#define ALIGN(v, a) (((size_t)(v) + (a) - 1) & ~((a) - 1)) + +/* Perform machine dependent cif processing */ +ffi_status +ffi_prep_cif_machdep( + ffi_cif* cif); + +/* Extended cif, used in callback from assembly routine */ +typedef struct extended_cif { +/*@dependent@*/ ffi_cif* cif; +/*@dependent@*/ void* rvalue; +/*@dependent@*/ void** avalue; +} extended_cif; + +/* Terse sized type definitions. */ +typedef unsigned int UINT8 __attribute__((__mode__(__QI__))); +typedef signed int SINT8 __attribute__((__mode__(__QI__))); +typedef unsigned int UINT16 __attribute__((__mode__(__HI__))); +typedef signed int SINT16 __attribute__((__mode__(__HI__))); +typedef unsigned int UINT32 __attribute__((__mode__(__SI__))); +typedef signed int SINT32 __attribute__((__mode__(__SI__))); +typedef unsigned int UINT64 __attribute__((__mode__(__DI__))); +typedef signed int SINT64 __attribute__((__mode__(__DI__))); +typedef float FLOAT32; + +#ifdef __cplusplus +} +#endif + +#endif // #ifndef FFI_COMMON_H \ No newline at end of file diff -r -u ./Modules/_ctypes/libffi_osx/include/fficonfig.h ./Modules/_ctypes/libffi_osx/include/fficonfig.h new file mode 100644 index 0000000..2172490 --- /dev/null +++ ./Modules/_ctypes/libffi_osx/include/fficonfig.h @@ -0,0 +1,150 @@ +/* Manually created fficonfig.h for Darwin on PowerPC or Intel + + This file is manually generated to do away with the need for autoconf and + therefore make it easier to cross-compile and build fat binaries. + + NOTE: This file was added by PyObjC. +*/ + +#ifndef MACOSX +#error "This file is only supported on Mac OS X" +#endif + +#if defined(__i386__) +# define BYTEORDER 1234 +# undef HOST_WORDS_BIG_ENDIAN +# undef WORDS_BIGENDIAN +# define SIZEOF_DOUBLE 8 +# define HAVE_LONG_DOUBLE 1 +# define SIZEOF_LONG_DOUBLE 16 + +#elif defined(__x86_64__) +# define BYTEORDER 1234 +# undef HOST_WORDS_BIG_ENDIAN +# undef WORDS_BIGENDIAN +# define SIZEOF_DOUBLE 8 +# define HAVE_LONG_DOUBLE 1 +# define SIZEOF_LONG_DOUBLE 16 + +#elif defined(__ppc__) +# define BYTEORDER 4321 +# define HOST_WORDS_BIG_ENDIAN 1 +# define WORDS_BIGENDIAN 1 +# define SIZEOF_DOUBLE 8 +# if __GNUC__ >= 4 +# define HAVE_LONG_DOUBLE 1 +# define SIZEOF_LONG_DOUBLE 16 +# else +# undef HAVE_LONG_DOUBLE +# define SIZEOF_LONG_DOUBLE 8 +# endif + +#elif defined(__ppc64__) +# define BYTEORDER 4321 +# define HOST_WORDS_BIG_ENDIAN 1 +# define WORDS_BIGENDIAN 1 +# define SIZEOF_DOUBLE 8 +# define HAVE_LONG_DOUBLE 1 +# define SIZEOF_LONG_DOUBLE 16 + +#else +#error "Unknown CPU type" +#endif + +/* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP + systems. This function is required for `alloca.c' support on those systems. */ +#undef CRAY_STACKSEG_END + +/* Define to 1 if using `alloca.c'. */ +/* #undef C_ALLOCA */ + +/* Define to the flags needed for the .section .eh_frame directive. */ +#define EH_FRAME_FLAGS "aw" + +/* Define this if you want extra debugging. */ +/* #undef FFI_DEBUG */ + +/* Define this is you do not want support for the raw API. */ +#define FFI_NO_RAW_API 1 + +/* Define this if you do not want support for aggregate types. */ +/* #undef FFI_NO_STRUCTS */ + +/* Define to 1 if you have `alloca', as a function or macro. */ +#define HAVE_ALLOCA 1 + +/* Define to 1 if you have and it should be used (not on Ultrix). */ +#define HAVE_ALLOCA_H 1 + +/* Define if your assembler supports .register. */ +/* #undef HAVE_AS_REGISTER_PSEUDO_OP */ + +/* Define if your assembler and linker support unaligned PC relative relocs. */ +/* #undef HAVE_AS_SPARC_UA_PCREL */ + +/* Define to 1 if you have the `memcpy' function. */ +#define HAVE_MEMCPY 1 + +/* Define if mmap with MAP_ANON(YMOUS) works. */ +#define HAVE_MMAP_ANON 1 + +/* Define if mmap of /dev/zero works. */ +/* #undef HAVE_MMAP_DEV_ZERO */ + +/* Define if read-only mmap of a plain file works. */ +#define HAVE_MMAP_FILE 1 + +/* Define if .eh_frame sections should be read-only. */ +/* #undef HAVE_RO_EH_FRAME */ + +/* Define to 1 if your C compiler doesn't accept -c and -o together. */ +/* #undef NO_MINUS_C_MINUS_O */ + +/* Name of package */ +#define PACKAGE "libffi" + +/* Define to the address where bug reports for this package should be sent. */ +#define PACKAGE_BUGREPORT "http://gcc.gnu.org/bugs.html" + +/* Define to the full name of this package. */ +#define PACKAGE_NAME "libffi" + +/* Define to the full name and version of this package. */ +#define PACKAGE_STRING "libffi 2.1" + +/* Define to the one symbol short name of this package. */ +#define PACKAGE_TARNAME "libffi" + +/* Define to the version of this package. */ +#define PACKAGE_VERSION "2.1" + +/* If using the C implementation of alloca, define if you know the + direction of stack growth for your system; otherwise it will be + automatically deduced at run-time. + STACK_DIRECTION > 0 => grows toward higher addresses + STACK_DIRECTION < 0 => grows toward lower addresses + STACK_DIRECTION = 0 => direction of growth unknown */ +/* #undef STACK_DIRECTION */ + +/* Define to 1 if you have the ANSI C header files. */ +#define STDC_HEADERS 1 + +/* Define this if you are using Purify and want to suppress spurious messages. */ +/* #undef USING_PURIFY */ + +/* Version number of package */ +#define VERSION "2.1-pyobjc" + +#ifdef HAVE_HIDDEN_VISIBILITY_ATTRIBUTE +# ifdef LIBFFI_ASM +# define FFI_HIDDEN(name) .hidden name +# else +# define FFI_HIDDEN __attribute__((visibility ("hidden"))) +# endif +#else +# ifdef LIBFFI_ASM +# define FFI_HIDDEN(name) +# else +# define FFI_HIDDEN +# endif +#endif \ No newline at end of file diff -r -u ./Modules/_ctypes/libffi_osx/include/ffitarget.h ./Modules/_ctypes/libffi_osx/include/ffitarget.h new file mode 100644 index 0000000..faaa30d --- /dev/null +++ ./Modules/_ctypes/libffi_osx/include/ffitarget.h @@ -0,0 +1,13 @@ +/* Dispatch to the right ffitarget file. This file is PyObjC specific; in a + normal build, the build environment copies the file to the right location or + sets up the right include flags. We want to do neither because that would + make building fat binaries harder. +*/ + +#if defined(__i386__) || defined(__x86_64__) +#include "x86-ffitarget.h" +#elif defined(__ppc__) || defined(__ppc64__) +#include "ppc-ffitarget.h" +#else +#error "Unsupported CPU type" +#endif \ No newline at end of file diff -r -u ./Modules/_ctypes/libffi_osx/include/ppc-ffitarget.h ./Modules/_ctypes/libffi_osx/include/ppc-ffitarget.h new file mode 100644 index 0000000..2318421 --- /dev/null +++ ./Modules/_ctypes/libffi_osx/include/ppc-ffitarget.h @@ -0,0 +1,104 @@ +/* -----------------------------------------------------------------*-C-*- + ppc-ffitarget.h - Copyright (c) 1996-2003 Red Hat, Inc. + Target configuration macros for PowerPC. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#ifndef LIBFFI_TARGET_H +#define LIBFFI_TARGET_H + +/* ---- System specific configurations ----------------------------------- */ + +#if (defined(POWERPC) && defined(__powerpc64__)) || \ + (defined(POWERPC_DARWIN) && defined(__ppc64__)) +#define POWERPC64 +#endif + +#ifndef LIBFFI_ASM + +typedef unsigned long ffi_arg; +typedef signed long ffi_sarg; + +typedef enum ffi_abi { + FFI_FIRST_ABI = 0, + +#ifdef POWERPC + FFI_SYSV, + FFI_GCC_SYSV, + FFI_LINUX64, +# ifdef POWERPC64 + FFI_DEFAULT_ABI = FFI_LINUX64, +# else + FFI_DEFAULT_ABI = FFI_GCC_SYSV, +# endif +#endif + +#ifdef POWERPC_AIX + FFI_AIX, + FFI_DARWIN, + FFI_DEFAULT_ABI = FFI_AIX, +#endif + +#ifdef POWERPC_DARWIN + FFI_AIX, + FFI_DARWIN, + FFI_DEFAULT_ABI = FFI_DARWIN, +#endif + +#ifdef POWERPC_FREEBSD + FFI_SYSV, + FFI_GCC_SYSV, + FFI_LINUX64, + FFI_DEFAULT_ABI = FFI_SYSV, +#endif + + FFI_LAST_ABI = FFI_DEFAULT_ABI + 1 +} ffi_abi; + +#endif // #ifndef LIBFFI_ASM + +/* ---- Definitions for closures ----------------------------------------- */ + +#define FFI_CLOSURES 1 +#define FFI_NATIVE_RAW_API 0 + +/* Needed for FFI_SYSV small structure returns. */ +#define FFI_SYSV_TYPE_SMALL_STRUCT (FFI_TYPE_LAST) + +#if defined(POWERPC64) /*|| defined(POWERPC_AIX)*/ +# define FFI_TRAMPOLINE_SIZE 48 +#elif defined(POWERPC_AIX) +# define FFI_TRAMPOLINE_SIZE 24 +#else +# define FFI_TRAMPOLINE_SIZE 40 +#endif + +#ifndef LIBFFI_ASM +# if defined(POWERPC_DARWIN) || defined(POWERPC_AIX) +typedef struct ffi_aix_trampoline_struct { + void* code_pointer; /* Pointer to ffi_closure_ASM */ + void* toc; /* TOC */ + void* static_chain; /* Pointer to closure */ +} ffi_aix_trampoline_struct; +# endif +#endif // #ifndef LIBFFI_ASM + +#endif // #ifndef LIBFFI_TARGET_H \ No newline at end of file diff -r -u ./Modules/_ctypes/libffi_osx/include/x86-ffitarget.h ./Modules/_ctypes/libffi_osx/include/x86-ffitarget.h new file mode 100644 index 0000000..55c2b6c --- /dev/null +++ ./Modules/_ctypes/libffi_osx/include/x86-ffitarget.h @@ -0,0 +1,88 @@ +/* -----------------------------------------------------------------*-C-*- + x86-ffitarget.h - Copyright (c) 1996-2003 Red Hat, Inc. + Target configuration macros for x86 and x86-64. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + ----------------------------------------------------------------------- */ + +#ifndef LIBFFI_TARGET_H +#define LIBFFI_TARGET_H + +/* ---- System specific configurations ----------------------------------- */ + +#if defined(X86_64) && defined(__i386__) +# undef X86_64 +# define X86 +#endif + +#if defined(__x86_64__) +# ifndef X86_64 +# define X86_64 +# endif +#endif + +/* ---- Generic type definitions ----------------------------------------- */ + +#ifndef LIBFFI_ASM + +typedef unsigned long ffi_arg; +typedef signed long ffi_sarg; + +typedef enum ffi_abi { + FFI_FIRST_ABI = 0, + + /* ---- Intel x86 Win32 ---------- */ +#ifdef X86_WIN32 + FFI_SYSV, + FFI_STDCALL, + /* TODO: Add fastcall support for the sake of completeness */ + FFI_DEFAULT_ABI = FFI_SYSV, +#endif + + /* ---- Intel x86 and AMD x86-64 - */ +#if !defined(X86_WIN32) && (defined(__i386__) || defined(__x86_64__)) + FFI_SYSV, + FFI_UNIX64, /* Unix variants all use the same ABI for x86-64 */ +# ifdef __i386__ + FFI_DEFAULT_ABI = FFI_SYSV, +# else + FFI_DEFAULT_ABI = FFI_UNIX64, +# endif +#endif + + FFI_LAST_ABI = FFI_DEFAULT_ABI + 1 +} ffi_abi; + +#endif // #ifndef LIBFFI_ASM + +/* ---- Definitions for closures ----------------------------------------- */ + +#define FFI_CLOSURES 1 + +#if defined(X86_64) || (defined(__x86_64__) && defined(X86_DARWIN)) +# define FFI_TRAMPOLINE_SIZE 24 +# define FFI_NATIVE_RAW_API 0 +#else +# define FFI_TRAMPOLINE_SIZE 10 +# define FFI_NATIVE_RAW_API 1 /* x86 has native raw api support */ +#endif + +#endif // #ifndef LIBFFI_TARGET_H \ No newline at end of file diff -r -u ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin.S ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin.S new file mode 100644 index 0000000..f143dbd --- /dev/null +++ ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin.S @@ -0,0 +1,365 @@ +#if defined(__ppc__) || defined(__ppc64__) + +/* ----------------------------------------------------------------------- + ppc-darwin.S - Copyright (c) 2000 John Hornkvist + Copyright (c) 2004 Free Software Foundation, Inc. + + PowerPC Assembly glue. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#define LIBFFI_ASM + +#include +#include +#include +#include + +.text + .align 2 +.globl _ffi_prep_args + +.text + .align 2 +.globl _ffi_call_DARWIN + +.text + .align 2 +_ffi_call_DARWIN: +LFB0: + mr r12,r8 /* We only need r12 until the call, + so it doesn't have to be saved. */ + +LFB1: + /* Save the old stack pointer as AP. */ + mr r8,r1 + +LCFI0: +#if defined(__ppc64__) + /* Allocate the stack space we need. + r4 (size of input data) + 48 bytes (linkage area) + 40 bytes (saved registers) + 8 bytes (extra FPR) + r4 + 96 bytes total + */ + + addi r4,r4,-96 // Add our overhead. + li r0,-32 // Align to 32 bytes. + and r4,r4,r0 +#endif + stgux r1,r1,r4 // Grow the stack. + mflr r9 + + /* Save registers we use. */ +#if defined(__ppc64__) + std r27,-40(r8) +#endif + stg r28,MODE_CHOICE(-16,-32)(r8) + stg r29,MODE_CHOICE(-12,-24)(r8) + stg r30,MODE_CHOICE(-8,-16)(r8) + stg r31,MODE_CHOICE(-4,-8)(r8) + stg r9,SF_RETURN(r8) /* return address */ +#if !defined(POWERPC_DARWIN) /* TOC unused in OS X */ + stg r2,MODE_CHOICE(20,40)(r1) +#endif + +LCFI1: +#if defined(__ppc64__) + mr r27,r3 // our extended_cif +#endif + /* Save arguments over call. */ + mr r31,r5 /* flags, */ + mr r30,r6 /* rvalue, */ + mr r29,r7 /* function address, */ + mr r28,r8 /* our AP. */ + +LCFI2: + /* Call ffi_prep_args. */ + mr r4,r1 + li r9,0 + mtctr r12 /* r12 holds address of _ffi_prep_args. */ + bctrl +#if !defined(POWERPC_DARWIN) /* TOC unused in OS X */ + lg r2,MODE_CHOICE(20,40)(r1) +#endif + + /* Now do the call. + Set up cr1 with bits 4-7 of the flags. */ + mtcrf 0x40,r31 + + /* Load all those argument registers. + We have set up a nice stack frame, just load it into registers. */ + lg r3,SF_ARG1(r1) + lg r4,SF_ARG2(r1) + lg r5,SF_ARG3(r1) + lg r6,SF_ARG4(r1) + nop + lg r7,SF_ARG5(r1) + lg r8,SF_ARG6(r1) + lg r9,SF_ARG7(r1) + lg r10,SF_ARG8(r1) + + /* Load all the FP registers. */ + bf 6,L2 /* No floats to load. */ +#if defined(__ppc64__) + lfd f1,MODE_CHOICE(-16,-40)-(14*8)(r28) + lfd f2,MODE_CHOICE(-16,-40)-(13*8)(r28) + lfd f3,MODE_CHOICE(-16,-40)-(12*8)(r28) + lfd f4,MODE_CHOICE(-16,-40)-(11*8)(r28) + nop + lfd f5,MODE_CHOICE(-16,-40)-(10*8)(r28) + lfd f6,MODE_CHOICE(-16,-40)-(9*8)(r28) + lfd f7,MODE_CHOICE(-16,-40)-(8*8)(r28) + lfd f8,MODE_CHOICE(-16,-40)-(7*8)(r28) + nop + lfd f9,MODE_CHOICE(-16,-40)-(6*8)(r28) + lfd f10,MODE_CHOICE(-16,-40)-(5*8)(r28) + lfd f11,MODE_CHOICE(-16,-40)-(4*8)(r28) + lfd f12,MODE_CHOICE(-16,-40)-(3*8)(r28) + nop + lfd f13,MODE_CHOICE(-16,-40)-(2*8)(r28) + lfd f14,MODE_CHOICE(-16,-40)-(1*8)(r28) +#elif defined(__ppc__) + lfd f1,MODE_CHOICE(-16,-40)-(13*8)(r28) + lfd f2,MODE_CHOICE(-16,-40)-(12*8)(r28) + lfd f3,MODE_CHOICE(-16,-40)-(11*8)(r28) + lfd f4,MODE_CHOICE(-16,-40)-(10*8)(r28) + nop + lfd f5,MODE_CHOICE(-16,-40)-(9*8)(r28) + lfd f6,MODE_CHOICE(-16,-40)-(8*8)(r28) + lfd f7,MODE_CHOICE(-16,-40)-(7*8)(r28) + lfd f8,MODE_CHOICE(-16,-40)-(6*8)(r28) + nop + lfd f9,MODE_CHOICE(-16,-40)-(5*8)(r28) + lfd f10,MODE_CHOICE(-16,-40)-(4*8)(r28) + lfd f11,MODE_CHOICE(-16,-40)-(3*8)(r28) + lfd f12,MODE_CHOICE(-16,-40)-(2*8)(r28) + nop + lfd f13,MODE_CHOICE(-16,-40)-(1*8)(r28) +#else +#error undefined architecture +#endif + +L2: + mr r12,r29 // Put the target address in r12 as specified. + mtctr r12 // Get the address to call into CTR. + nop + nop + bctrl // Make the call. + + // Deal with the return value. +#if defined(__ppc64__) + mtcrf 0x3,r31 // flags in cr6 and cr7 + bt 27,L(st_return_value) +#elif defined(__ppc__) + mtcrf 0x1,r31 // flags in cr7 +#else +#error undefined architecture +#endif + + bt 30,L(done_return_value) + bt 29,L(fp_return_value) + stg r3,0(r30) +#if defined(__ppc__) + bf 28,L(done_return_value) // Store the second long if necessary. + stg r4,4(r30) +#endif + // Fall through + +L(done_return_value): + lg r1,0(r1) // Restore stack pointer. + // Restore the registers we used. + lg r9,SF_RETURN(r1) // return address + lg r31,MODE_CHOICE(-4,-8)(r1) + mtlr r9 + lg r30,MODE_CHOICE(-8,-16)(r1) + lg r29,MODE_CHOICE(-12,-24)(r1) + lg r28,MODE_CHOICE(-16,-32)(r1) +#if defined(__ppc64__) + ld r27,-40(r1) +#endif + blr + +#if defined(__ppc64__) +L(st_return_value): + // Grow the stack enough to fit the registers. Leave room for 8 args + // to trample the 1st 8 slots in param area. + stgu r1,-SF_ROUND(280)(r1) // 64 + 104 + 48 + 64 + + // Store GPRs + std r3,SF_ARG9(r1) + std r4,SF_ARG10(r1) + std r5,SF_ARG11(r1) + std r6,SF_ARG12(r1) + nop + std r7,SF_ARG13(r1) + std r8,SF_ARG14(r1) + std r9,SF_ARG15(r1) + std r10,SF_ARG16(r1) + + // Store FPRs + nop + bf 26,L(call_struct_to_ram_form) + stfd f1,SF_ARG17(r1) + stfd f2,SF_ARG18(r1) + stfd f3,SF_ARG19(r1) + stfd f4,SF_ARG20(r1) + nop + stfd f5,SF_ARG21(r1) + stfd f6,SF_ARG22(r1) + stfd f7,SF_ARG23(r1) + stfd f8,SF_ARG24(r1) + nop + stfd f9,SF_ARG25(r1) + stfd f10,SF_ARG26(r1) + stfd f11,SF_ARG27(r1) + stfd f12,SF_ARG28(r1) + nop + stfd f13,SF_ARG29(r1) + +L(call_struct_to_ram_form): + ld r3,0(r27) // extended_cif->cif* + ld r3,16(r3) // ffi_cif->rtype* + addi r4,r1,SF_ARG9 // stored GPRs + addi r6,r1,SF_ARG17 // stored FPRs + li r5,0 // GPR size ptr (NULL) + li r7,0 // FPR size ptr (NULL) + li r8,0 // FPR count ptr (NULL) + li r10,0 // struct offset (NULL) + mr r9,r30 // return area + bl Lffi64_struct_to_ram_form$stub + lg r1,0(r1) // Restore stack pointer. + b L(done_return_value) +#endif + +L(fp_return_value): + /* Do we have long double to store? */ + bf 31,L(fd_return_value) + stfd f1,0(r30) + stfd f2,8(r30) + b L(done_return_value) + +L(fd_return_value): + /* Do we have double to store? */ + bf 28,L(float_return_value) + stfd f1,0(r30) + b L(done_return_value) + +L(float_return_value): + /* We only have a float to store. */ + stfs f1,0(r30) + b L(done_return_value) + +LFE1: +/* END(_ffi_call_DARWIN) */ + +/* Provide a null definition of _ffi_call_AIX. */ +.text + .align 2 +.globl _ffi_call_AIX +.text + .align 2 +_ffi_call_AIX: + blr +/* END(_ffi_call_AIX) */ + +.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms +EH_frame1: + .set L$set$0,LECIE1-LSCIE1 + .long L$set$0 ; Length of Common Information Entry +LSCIE1: + .long 0x0 ; CIE Identifier Tag + .byte 0x1 ; CIE Version + .ascii "zR\0" ; CIE Augmentation + .byte 0x1 ; uleb128 0x1; CIE Code Alignment Factor + .byte 0x7c ; sleb128 -4; CIE Data Alignment Factor + .byte 0x41 ; CIE RA Column + .byte 0x1 ; uleb128 0x1; Augmentation size + .byte 0x10 ; FDE Encoding (pcrel) + .byte 0xc ; DW_CFA_def_cfa + .byte 0x1 ; uleb128 0x1 + .byte 0x0 ; uleb128 0x0 + .align LOG2_GPR_BYTES +LECIE1: +.globl _ffi_call_DARWIN.eh +_ffi_call_DARWIN.eh: +LSFDE1: + .set L$set$1,LEFDE1-LASFDE1 + .long L$set$1 ; FDE Length + +LASFDE1: + .long LASFDE1-EH_frame1 ; FDE CIE offset + .g_long LFB0-. ; FDE initial location + .set L$set$3,LFE1-LFB0 + .g_long L$set$3 ; FDE address range + .byte 0x0 ; uleb128 0x0; Augmentation size + .byte 0x4 ; DW_CFA_advance_loc4 + .set L$set$4,LCFI0-LFB1 + .long L$set$4 + .byte 0xd ; DW_CFA_def_cfa_register + .byte 0x08 ; uleb128 0x08 + .byte 0x4 ; DW_CFA_advance_loc4 + .set L$set$5,LCFI1-LCFI0 + .long L$set$5 + .byte 0x11 ; DW_CFA_offset_extended_sf + .byte 0x41 ; uleb128 0x41 + .byte 0x7e ; sleb128 -2 + .byte 0x9f ; DW_CFA_offset, column 0x1f + .byte 0x1 ; uleb128 0x1 + .byte 0x9e ; DW_CFA_offset, column 0x1e + .byte 0x2 ; uleb128 0x2 + .byte 0x9d ; DW_CFA_offset, column 0x1d + .byte 0x3 ; uleb128 0x3 + .byte 0x9c ; DW_CFA_offset, column 0x1c + .byte 0x4 ; uleb128 0x4 + .byte 0x4 ; DW_CFA_advance_loc4 + .set L$set$6,LCFI2-LCFI1 + .long L$set$6 + .byte 0xd ; DW_CFA_def_cfa_register + .byte 0x1c ; uleb128 0x1c + .align LOG2_GPR_BYTES +LEFDE1: + +#if defined(__ppc64__) +.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 + .align LOG2_GPR_BYTES + +Lffi64_struct_to_ram_form$stub: + .indirect_symbol _ffi64_struct_to_ram_form + mflr r0 + bcl 20,31,LO$ffi64_struct_to_ram_form + +LO$ffi64_struct_to_ram_form: + mflr r11 + addis r11,r11,ha16(L_ffi64_struct_to_ram_form$lazy_ptr - LO$ffi64_struct_to_ram_form) + mtlr r0 + lgu r12,lo16(L_ffi64_struct_to_ram_form$lazy_ptr - LO$ffi64_struct_to_ram_form)(r11) + mtctr r12 + bctr + +.lazy_symbol_pointer +L_ffi64_struct_to_ram_form$lazy_ptr: + .indirect_symbol _ffi64_struct_to_ram_form + .g_long dyld_stub_binding_helper + +#endif // __ppc64__ +#endif // __ppc__ || __ppc64__ diff -r -u ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin.h ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin.h new file mode 100644 index 0000000..cf4bd50 --- /dev/null +++ ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin.h @@ -0,0 +1,85 @@ +/* ----------------------------------------------------------------------- + ppc-darwin.h - Copyright (c) 2002, 2003, 2004, Free Software Foundation, + Inc. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#define L(x) x + +#define SF_ARG9 MODE_CHOICE(56,112) +#define SF_ARG10 MODE_CHOICE(60,120) +#define SF_ARG11 MODE_CHOICE(64,128) +#define SF_ARG12 MODE_CHOICE(68,136) +#define SF_ARG13 MODE_CHOICE(72,144) +#define SF_ARG14 MODE_CHOICE(76,152) +#define SF_ARG15 MODE_CHOICE(80,160) +#define SF_ARG16 MODE_CHOICE(84,168) +#define SF_ARG17 MODE_CHOICE(88,176) +#define SF_ARG18 MODE_CHOICE(92,184) +#define SF_ARG19 MODE_CHOICE(96,192) +#define SF_ARG20 MODE_CHOICE(100,200) +#define SF_ARG21 MODE_CHOICE(104,208) +#define SF_ARG22 MODE_CHOICE(108,216) +#define SF_ARG23 MODE_CHOICE(112,224) +#define SF_ARG24 MODE_CHOICE(116,232) +#define SF_ARG25 MODE_CHOICE(120,240) +#define SF_ARG26 MODE_CHOICE(124,248) +#define SF_ARG27 MODE_CHOICE(128,256) +#define SF_ARG28 MODE_CHOICE(132,264) +#define SF_ARG29 MODE_CHOICE(136,272) + +#define ASM_NEEDS_REGISTERS 4 +#define NUM_GPR_ARG_REGISTERS 8 +#define NUM_FPR_ARG_REGISTERS 13 + +#define FFI_TYPE_1_BYTE(x) ((x) == FFI_TYPE_UINT8 || (x) == FFI_TYPE_SINT8) +#define FFI_TYPE_2_BYTE(x) ((x) == FFI_TYPE_UINT16 || (x) == FFI_TYPE_SINT16) +#define FFI_TYPE_4_BYTE(x) \ + ((x) == FFI_TYPE_UINT32 || (x) == FFI_TYPE_SINT32 ||\ + (x) == FFI_TYPE_INT || (x) == FFI_TYPE_FLOAT) + +#if !defined(LIBFFI_ASM) + +enum { + FLAG_RETURNS_NOTHING = 1 << (31 - 30), // cr7 + FLAG_RETURNS_FP = 1 << (31 - 29), + FLAG_RETURNS_64BITS = 1 << (31 - 28), + FLAG_RETURNS_128BITS = 1 << (31 - 31), + + FLAG_RETURNS_STRUCT = 1 << (31 - 27), // cr6 + FLAG_STRUCT_CONTAINS_FP = 1 << (31 - 26), + + FLAG_ARG_NEEDS_COPY = 1 << (31 - 7), + FLAG_FP_ARGUMENTS = 1 << (31 - 6), // cr1.eq; specified by ABI + FLAG_4_GPR_ARGUMENTS = 1 << (31 - 5), + FLAG_RETVAL_REFERENCE = 1 << (31 - 4) +}; + +#if defined(__ppc64__) +void ffi64_struct_to_ram_form(const ffi_type*, const char*, unsigned int*, + const char*, unsigned int*, unsigned int*, char*, unsigned int*); +void ffi64_struct_to_reg_form(const ffi_type*, const char*, unsigned int*, + unsigned int*, char*, unsigned int*, char*, unsigned int*); +bool ffi64_stret_needs_ptr(const ffi_type* inType, + unsigned short*, unsigned short*); +#endif + +#endif // !defined(LIBFFI_ASM) \ No newline at end of file diff -r -u ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin_closure.S ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin_closure.S new file mode 100644 index 0000000..c3d30c2 --- /dev/null +++ ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin_closure.S @@ -0,0 +1,308 @@ +#if defined(__ppc__) + +/* ----------------------------------------------------------------------- + ppc-darwin_closure.S - Copyright (c) 2002, 2003, 2004, Free Software Foundation, + Inc. based on ppc_closure.S + + PowerPC Assembly glue. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#define LIBFFI_ASM + +#include +#include // for FFI_TRAMPOLINE_SIZE +#include +#include + + .file "ppc-darwin_closure.S" +.text + .align LOG2_GPR_BYTES + .globl _ffi_closure_ASM + +.text + .align LOG2_GPR_BYTES + +_ffi_closure_ASM: +LFB1: + mflr r0 // Save return address + stg r0,SF_RETURN(r1) + +LCFI0: + /* 24/48 bytes (Linkage Area) + 32/64 bytes (outgoing parameter area, always reserved) + 104 bytes (13*8 from FPR) + 16/32 bytes (result) + 176/232 total bytes */ + + /* skip over caller save area and keep stack aligned to 16/32. */ + stgu r1,-SF_ROUND(176)(r1) + +LCFI1: + /* We want to build up an area for the parameters passed + in registers. (both floating point and integer) */ + + /* 176/256 bytes (callee stack frame aligned to 16/32) + 24/48 bytes (caller linkage area) + 200/304 (start of caller parameter area aligned to 4/8) + */ + + /* Save GPRs 3 - 10 (aligned to 4/8) + in the parents outgoing area. */ + stg r3,200(r1) + stg r4,204(r1) + stg r5,208(r1) + stg r6,212(r1) + stg r7,216(r1) + stg r8,220(r1) + stg r9,224(r1) + stg r10,228(r1) + + /* Save FPRs 1 - 13. (aligned to 8) */ + stfd f1,56(r1) + stfd f2,64(r1) + stfd f3,72(r1) + stfd f4,80(r1) + stfd f5,88(r1) + stfd f6,96(r1) + stfd f7,104(r1) + stfd f8,112(r1) + stfd f9,120(r1) + stfd f10,128(r1) + stfd f11,136(r1) + stfd f12,144(r1) + stfd f13,152(r1) + + // Set up registers for the routine that actually does the work. + mr r3,r11 // context pointer from the trampoline + addi r4,r1,160 // result storage + addi r5,r1,200 // saved GPRs + addi r6,r1,56 // saved FPRs + bl Lffi_closure_helper_DARWIN$stub + + /* Now r3 contains the return type. Use it to look up in a table + so we know how to deal with each type. */ + addi r5,r1,160 // Copy result storage pointer. + bl Lget_ret_type0_addr // Get pointer to Lret_type0 into LR. + mflr r4 // Move to r4. + slwi r3,r3,4 // Multiply return type by 16. + add r3,r3,r4 // Add contents of table to table address. + mtctr r3 + bctr + +LFE1: +/* Each of the ret_typeX code fragments has to be exactly 16 bytes long + (4 instructions). For cache effectiveness we align to a 16 byte boundary + first. */ + .align 4 + nop + nop + nop + +Lget_ret_type0_addr: + blrl + +/* case FFI_TYPE_VOID */ +Lret_type0: + b Lfinish + nop + nop + nop + +/* case FFI_TYPE_INT */ +Lret_type1: + lwz r3,0(r5) + b Lfinish + nop + nop + +/* case FFI_TYPE_FLOAT */ +Lret_type2: + lfs f1,0(r5) + b Lfinish + nop + nop + +/* case FFI_TYPE_DOUBLE */ +Lret_type3: + lfd f1,0(r5) + b Lfinish + nop + nop + +/* case FFI_TYPE_LONGDOUBLE */ +Lret_type4: + lfd f1,0(r5) + lfd f2,8(r5) + b Lfinish + nop + +/* case FFI_TYPE_UINT8 */ +Lret_type5: + lbz r3,3(r5) + b Lfinish + nop + nop + +/* case FFI_TYPE_SINT8 */ +Lret_type6: + lbz r3,3(r5) + extsb r3,r3 + b Lfinish + nop + +/* case FFI_TYPE_UINT16 */ +Lret_type7: + lhz r3,2(r5) + b Lfinish + nop + nop + +/* case FFI_TYPE_SINT16 */ +Lret_type8: + lha r3,2(r5) + b Lfinish + nop + nop + +/* case FFI_TYPE_UINT32 */ +Lret_type9: // same as Lret_type1 + lwz r3,0(r5) + b Lfinish + nop + nop + +/* case FFI_TYPE_SINT32 */ +Lret_type10: // same as Lret_type1 + lwz r3,0(r5) + b Lfinish + nop + nop + +/* case FFI_TYPE_UINT64 */ +Lret_type11: + lwz r3,0(r5) + lwz r4,4(r5) + b Lfinish + nop + +/* case FFI_TYPE_SINT64 */ +Lret_type12: // same as Lret_type11 + lwz r3,0(r5) + lwz r4,4(r5) + b Lfinish + nop + +/* case FFI_TYPE_STRUCT */ +Lret_type13: + b Lfinish + nop + nop + nop + +/* End 16-byte aligned cases */ +/* case FFI_TYPE_POINTER */ +// This case assumes that FFI_TYPE_POINTER == FFI_TYPE_LAST. If more types +// are added in future, the following code will need to be updated and +// padded to 16 bytes. +Lret_type14: + lg r3,0(r5) + // fall through + +/* case done */ +Lfinish: + addi r1,r1,SF_ROUND(176) // Restore stack pointer. + lg r0,SF_RETURN(r1) // Restore return address. + mtlr r0 // Restore link register. + blr + +/* END(ffi_closure_ASM) */ + +.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support +EH_frame1: + .set L$set$0,LECIE1-LSCIE1 + .long L$set$0 ; Length of Common Information Entry +LSCIE1: + .long 0x0 ; CIE Identifier Tag + .byte 0x1 ; CIE Version + .ascii "zR\0" ; CIE Augmentation + .byte 0x1 ; uleb128 0x1; CIE Code Alignment Factor + .byte 0x7c ; sleb128 -4; CIE Data Alignment Factor + .byte 0x41 ; CIE RA Column + .byte 0x1 ; uleb128 0x1; Augmentation size + .byte 0x10 ; FDE Encoding (pcrel) + .byte 0xc ; DW_CFA_def_cfa + .byte 0x1 ; uleb128 0x1 + .byte 0x0 ; uleb128 0x0 + .align LOG2_GPR_BYTES +LECIE1: +.globl _ffi_closure_ASM.eh +_ffi_closure_ASM.eh: +LSFDE1: + .set L$set$1,LEFDE1-LASFDE1 + .long L$set$1 ; FDE Length + +LASFDE1: + .long LASFDE1-EH_frame1 ; FDE CIE offset + .g_long LFB1-. ; FDE initial location + .set L$set$3,LFE1-LFB1 + .g_long L$set$3 ; FDE address range + .byte 0x0 ; uleb128 0x0; Augmentation size + .byte 0x4 ; DW_CFA_advance_loc4 + .set L$set$3,LCFI1-LCFI0 + .long L$set$3 + .byte 0xe ; DW_CFA_def_cfa_offset + .byte 176,1 ; uleb128 176 + .byte 0x4 ; DW_CFA_advance_loc4 + .set L$set$4,LCFI0-LFB1 + .long L$set$4 + .byte 0x11 ; DW_CFA_offset_extended_sf + .byte 0x41 ; uleb128 0x41 + .byte 0x7e ; sleb128 -2 + .align LOG2_GPR_BYTES + +LEFDE1: +.data + .align LOG2_GPR_BYTES +LDFCM0: +.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 + .align LOG2_GPR_BYTES + +Lffi_closure_helper_DARWIN$stub: + .indirect_symbol _ffi_closure_helper_DARWIN + mflr r0 + bcl 20,31,LO$ffi_closure_helper_DARWIN + +LO$ffi_closure_helper_DARWIN: + mflr r11 + addis r11,r11,ha16(L_ffi_closure_helper_DARWIN$lazy_ptr - LO$ffi_closure_helper_DARWIN) + mtlr r0 + lgu r12,lo16(L_ffi_closure_helper_DARWIN$lazy_ptr - LO$ffi_closure_helper_DARWIN)(r11) + mtctr r12 + bctr + +.lazy_symbol_pointer +L_ffi_closure_helper_DARWIN$lazy_ptr: + .indirect_symbol _ffi_closure_helper_DARWIN + .g_long dyld_stub_binding_helper + + +#endif // __ppc__ diff -r -u ./Modules/_ctypes/libffi_osx/powerpc/ppc-ffi_darwin.c ./Modules/_ctypes/libffi_osx/powerpc/ppc-ffi_darwin.c new file mode 100644 index 0000000..8953d5f --- /dev/null +++ ./Modules/_ctypes/libffi_osx/powerpc/ppc-ffi_darwin.c @@ -0,0 +1,1776 @@ +#if defined(__ppc__) || defined(__ppc64__) + +/* ----------------------------------------------------------------------- + ffi.c - Copyright (c) 1998 Geoffrey Keating + + PowerPC Foreign Function Interface + + Darwin ABI support (c) 2001 John Hornkvist + AIX ABI support (c) 2002 Free Software Foundation, Inc. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#include +#include + +#include +#include +#include +#include +#include + +#if 0 +#if defined(POWERPC_DARWIN) +#include // for sys_icache_invalidate() +#endif + +#else + +#pragma weak sys_icache_invalidate +extern void sys_icache_invalidate(void *start, size_t len); + +#endif + + +extern void ffi_closure_ASM(void); + +// The layout of a function descriptor. A C function pointer really +// points to one of these. +typedef struct aix_fd_struct { + void* code_pointer; + void* toc; +} aix_fd; + +/* ffi_prep_args is called by the assembly routine once stack space + has been allocated for the function's arguments. + + The stack layout we want looks like this: + + | Return address from ffi_call_DARWIN | higher addresses + |--------------------------------------------| + | Previous backchain pointer 4/8 | stack pointer here + |--------------------------------------------|-\ <<< on entry to + | Saved r28-r31 (4/8)*4 | | ffi_call_DARWIN + |--------------------------------------------| | + | Parameters (at least 8*(4/8)=32/64) | | (176) +112 - +288 + |--------------------------------------------| | + | Space for GPR2 4/8 | | + |--------------------------------------------| | stack | + | Reserved (4/8)*2 | | grows | + |--------------------------------------------| | down V + | Space for callee's LR 4/8 | | + |--------------------------------------------| | lower addresses + | Saved CR 4/8 | | + |--------------------------------------------| | stack pointer here + | Current backchain pointer 4/8 | | during + |--------------------------------------------|-/ <<< ffi_call_DARWIN + + Note: ppc64 CR is saved in the low word of a long on the stack. +*/ + +/*@-exportheader@*/ +void +ffi_prep_args( + extended_cif* inEcif, + unsigned *const stack) +/*@=exportheader@*/ +{ + /* Copy the ecif to a local var so we can trample the arg. + BC note: test this with GP later for possible problems... */ + volatile extended_cif* ecif = inEcif; + + const unsigned bytes = ecif->cif->bytes; + const unsigned flags = ecif->cif->flags; + + /* Cast the stack arg from int* to long*. sizeof(long) == 4 in 32-bit mode + and 8 in 64-bit mode. */ + unsigned long *const longStack = (unsigned long *const)stack; + + /* 'stacktop' points at the previous backchain pointer. */ +#if defined(__ppc64__) + // In ppc-darwin.s, an extra 96 bytes is reserved for the linkage area, + // saved registers, and an extra FPR. + unsigned long *const stacktop = + (unsigned long *)(unsigned long)((char*)longStack + bytes + 96); +#elif defined(__ppc__) + unsigned long *const stacktop = longStack + (bytes / sizeof(long)); +#else +#error undefined architecture +#endif + + /* 'fpr_base' points at the space for fpr1, and grows upwards as + we use FPR registers. */ + double* fpr_base = (double*)(stacktop - ASM_NEEDS_REGISTERS) - + NUM_FPR_ARG_REGISTERS; + +#if defined(__ppc64__) + // 64-bit saves an extra register, and uses an extra FPR. Knock fpr_base + // down a couple pegs. + fpr_base -= 2; +#endif + + unsigned int fparg_count = 0; + + /* 'next_arg' grows up as we put parameters in it. */ + unsigned long* next_arg = longStack + 6; /* 6 reserved positions. */ + + int i; + double double_tmp; + void** p_argv = ecif->avalue; + unsigned long gprvalue; + ffi_type** ptr = ecif->cif->arg_types; + + /* Check that everything starts aligned properly. */ + FFI_ASSERT(stack == SF_ROUND(stack)); + FFI_ASSERT(stacktop == SF_ROUND(stacktop)); + FFI_ASSERT(bytes == SF_ROUND(bytes)); + + /* Deal with return values that are actually pass-by-reference. + Rule: + Return values are referenced by r3, so r4 is the first parameter. */ + + if (flags & FLAG_RETVAL_REFERENCE) + *next_arg++ = (unsigned long)(char*)ecif->rvalue; + + /* Now for the arguments. */ + for (i = ecif->cif->nargs; i > 0; i--, ptr++, p_argv++) + { + switch ((*ptr)->type) + { + /* If a floating-point parameter appears before all of the general- + purpose registers are filled, the corresponding GPRs that match + the size of the floating-point parameter are shadowed for the + benefit of vararg and pre-ANSI functions. */ + case FFI_TYPE_FLOAT: + double_tmp = *(float*)*p_argv; + + if (fparg_count < NUM_FPR_ARG_REGISTERS) + *fpr_base++ = double_tmp; + + *(double*)next_arg = double_tmp; + + next_arg++; + fparg_count++; + FFI_ASSERT(flags & FLAG_FP_ARGUMENTS); + + break; + + case FFI_TYPE_DOUBLE: + double_tmp = *(double*)*p_argv; + + if (fparg_count < NUM_FPR_ARG_REGISTERS) + *fpr_base++ = double_tmp; + + *(double*)next_arg = double_tmp; + + next_arg += MODE_CHOICE(2,1); + fparg_count++; + FFI_ASSERT(flags & FLAG_FP_ARGUMENTS); + + break; + +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + case FFI_TYPE_LONGDOUBLE: +#if defined(__ppc64__) + if (fparg_count < NUM_FPR_ARG_REGISTERS) + *(long double*)fpr_base = *(long double*)*p_argv; +#elif defined(__ppc__) + if (fparg_count < NUM_FPR_ARG_REGISTERS - 1) + *(long double*)fpr_base = *(long double*)*p_argv; + else if (fparg_count == NUM_FPR_ARG_REGISTERS - 1) + *(double*)fpr_base = *(double*)*p_argv; +#else +#error undefined architecture +#endif + + *(long double*)next_arg = *(long double*)*p_argv; + fparg_count += 2; + fpr_base += 2; + next_arg += MODE_CHOICE(4,2); + FFI_ASSERT(flags & FLAG_FP_ARGUMENTS); + + break; +#endif // FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: +#if defined(__ppc64__) + gprvalue = *(long long*)*p_argv; + goto putgpr; +#elif defined(__ppc__) + *(long long*)next_arg = *(long long*)*p_argv; + next_arg += 2; + break; +#else +#error undefined architecture +#endif + + case FFI_TYPE_POINTER: + gprvalue = *(unsigned long*)*p_argv; + goto putgpr; + + case FFI_TYPE_UINT8: + gprvalue = *(unsigned char*)*p_argv; + goto putgpr; + + case FFI_TYPE_SINT8: + gprvalue = *(signed char*)*p_argv; + goto putgpr; + + case FFI_TYPE_UINT16: + gprvalue = *(unsigned short*)*p_argv; + goto putgpr; + + case FFI_TYPE_SINT16: + gprvalue = *(signed short*)*p_argv; + goto putgpr; + + case FFI_TYPE_STRUCT: + { +#if defined(__ppc64__) + unsigned int gprSize = 0; + unsigned int fprSize = 0; + + ffi64_struct_to_reg_form(*ptr, (char*)*p_argv, NULL, &fparg_count, + (char*)next_arg, &gprSize, (char*)fpr_base, &fprSize); + next_arg += gprSize / sizeof(long); + fpr_base += fprSize / sizeof(double); + +#elif defined(__ppc__) + char* dest_cpy = (char*)next_arg; + + /* Structures that match the basic modes (QI 1 byte, HI 2 bytes, + SI 4 bytes) are aligned as if they were those modes. + Structures with 3 byte in size are padded upwards. */ + unsigned size_al = (*ptr)->size; + + /* If the first member of the struct is a double, then align + the struct to double-word. */ + if ((*ptr)->elements[0]->type == FFI_TYPE_DOUBLE) + size_al = ALIGN((*ptr)->size, 8); + + if (ecif->cif->abi == FFI_DARWIN) + { + if (size_al < 3) + dest_cpy += 4 - size_al; + } + + memcpy((char*)dest_cpy, (char*)*p_argv, size_al); + next_arg += (size_al + 3) / 4; +#else +#error undefined architecture +#endif + break; + } + + case FFI_TYPE_INT: + case FFI_TYPE_UINT32: + case FFI_TYPE_SINT32: + gprvalue = *(unsigned*)*p_argv; + +putgpr: + *next_arg++ = gprvalue; + break; + + default: + break; + } + } + + /* Check that we didn't overrun the stack... */ + //FFI_ASSERT(gpr_base <= stacktop - ASM_NEEDS_REGISTERS); + //FFI_ASSERT((unsigned *)fpr_base + // <= stacktop - ASM_NEEDS_REGISTERS - NUM_GPR_ARG_REGISTERS); + //FFI_ASSERT(flags & FLAG_4_GPR_ARGUMENTS || intarg_count <= 4); +} + +#if defined(__ppc64__) + +bool +ffi64_struct_contains_fp( + const ffi_type* inType) +{ + bool containsFP = false; + unsigned int i; + + for (i = 0; inType->elements[i] != NULL && !containsFP; i++) + { + if (inType->elements[i]->type == FFI_TYPE_FLOAT || + inType->elements[i]->type == FFI_TYPE_DOUBLE || + inType->elements[i]->type == FFI_TYPE_LONGDOUBLE) + containsFP = true; + else if (inType->elements[i]->type == FFI_TYPE_STRUCT) + containsFP = ffi64_struct_contains_fp(inType->elements[i]); + } + + return containsFP; +} + +#endif // defined(__ppc64__) + +/* Perform machine dependent cif processing. */ +ffi_status +ffi_prep_cif_machdep( + ffi_cif* cif) +{ + /* All this is for the DARWIN ABI. */ + int i; + ffi_type** ptr; + int intarg_count = 0; + int fparg_count = 0; + unsigned int flags = 0; + unsigned int size_al = 0; + + /* All the machine-independent calculation of cif->bytes will be wrong. + Redo the calculation for DARWIN. */ + + /* Space for the frame pointer, callee's LR, CR, etc, and for + the asm's temp regs. */ + unsigned int bytes = (6 + ASM_NEEDS_REGISTERS) * sizeof(long); + + /* Return value handling. The rules are as follows: + - 32-bit (or less) integer values are returned in gpr3; + - Structures of size <= 4 bytes also returned in gpr3; + - 64-bit integer values and structures between 5 and 8 bytes are + returned in gpr3 and gpr4; + - Single/double FP values are returned in fpr1; + - Long double FP (if not equivalent to double) values are returned in + fpr1 and fpr2; + - Larger structures values are allocated space and a pointer is passed + as the first argument. */ + switch (cif->rtype->type) + { +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + case FFI_TYPE_LONGDOUBLE: + flags |= FLAG_RETURNS_128BITS; + flags |= FLAG_RETURNS_FP; + break; +#endif // FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + + case FFI_TYPE_DOUBLE: + flags |= FLAG_RETURNS_64BITS; + /* Fall through. */ + case FFI_TYPE_FLOAT: + flags |= FLAG_RETURNS_FP; + break; + +#if defined(__ppc64__) + case FFI_TYPE_POINTER: +#endif + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + flags |= FLAG_RETURNS_64BITS; + break; + + case FFI_TYPE_STRUCT: + { +#if defined(__ppc64__) + + if (ffi64_stret_needs_ptr(cif->rtype, NULL, NULL)) + { + flags |= FLAG_RETVAL_REFERENCE; + flags |= FLAG_RETURNS_NOTHING; + intarg_count++; + } + else + { + flags |= FLAG_RETURNS_STRUCT; + + if (ffi64_struct_contains_fp(cif->rtype)) + flags |= FLAG_STRUCT_CONTAINS_FP; + } + +#elif defined(__ppc__) + + flags |= FLAG_RETVAL_REFERENCE; + flags |= FLAG_RETURNS_NOTHING; + intarg_count++; + +#else +#error undefined architecture +#endif + break; + } + + case FFI_TYPE_VOID: + flags |= FLAG_RETURNS_NOTHING; + break; + + default: + /* Returns 32-bit integer, or similar. Nothing to do here. */ + break; + } + + /* The first NUM_GPR_ARG_REGISTERS words of integer arguments, and the + first NUM_FPR_ARG_REGISTERS fp arguments, go in registers; the rest + goes on the stack. Structures are passed as a pointer to a copy of + the structure. Stuff on the stack needs to keep proper alignment. */ + for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++) + { + switch ((*ptr)->type) + { + case FFI_TYPE_FLOAT: + case FFI_TYPE_DOUBLE: + fparg_count++; + /* If this FP arg is going on the stack, it must be + 8-byte-aligned. */ + if (fparg_count > NUM_FPR_ARG_REGISTERS + && intarg_count % 2 != 0) + intarg_count++; + break; + +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + case FFI_TYPE_LONGDOUBLE: + fparg_count += 2; + /* If this FP arg is going on the stack, it must be + 8-byte-aligned. */ + + if ( +#if defined(__ppc64__) + fparg_count > NUM_FPR_ARG_REGISTERS + 1 +#elif defined(__ppc__) + fparg_count > NUM_FPR_ARG_REGISTERS +#else +#error undefined architecture +#endif + && intarg_count % 2 != 0) + intarg_count++; + + intarg_count += 2; + break; +#endif // FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + /* 'long long' arguments are passed as two words, but + either both words must fit in registers or both go + on the stack. If they go on the stack, they must + be 8-byte-aligned. */ + if (intarg_count == NUM_GPR_ARG_REGISTERS - 1 + || (intarg_count >= NUM_GPR_ARG_REGISTERS + && intarg_count % 2 != 0)) + intarg_count++; + + intarg_count += MODE_CHOICE(2,1); + + break; + + case FFI_TYPE_STRUCT: + size_al = (*ptr)->size; + /* If the first member of the struct is a double, then align + the struct to double-word. */ + if ((*ptr)->elements[0]->type == FFI_TYPE_DOUBLE) + size_al = ALIGN((*ptr)->size, 8); + +#if defined(__ppc64__) + // Look for FP struct members. + unsigned int j; + + for (j = 0; (*ptr)->elements[j] != NULL; j++) + { + if ((*ptr)->elements[j]->type == FFI_TYPE_FLOAT || + (*ptr)->elements[j]->type == FFI_TYPE_DOUBLE) + { + fparg_count++; + + if (fparg_count > NUM_FPR_ARG_REGISTERS) + intarg_count++; + } + else if ((*ptr)->elements[j]->type == FFI_TYPE_LONGDOUBLE) + { + fparg_count += 2; + + if (fparg_count > NUM_FPR_ARG_REGISTERS + 1) + intarg_count += 2; + } + else + intarg_count++; + } +#elif defined(__ppc__) + intarg_count += (size_al + 3) / 4; +#else +#error undefined architecture +#endif + + break; + + default: + /* Everything else is passed as a 4/8-byte word in a GPR, either + the object itself or a pointer to it. */ + intarg_count++; + break; + } + } + + /* Space for the FPR registers, if needed. */ + if (fparg_count != 0) + { + flags |= FLAG_FP_ARGUMENTS; +#if defined(__ppc64__) + bytes += (NUM_FPR_ARG_REGISTERS + 1) * sizeof(double); +#elif defined(__ppc__) + bytes += NUM_FPR_ARG_REGISTERS * sizeof(double); +#else +#error undefined architecture +#endif + } + + /* Stack space. */ +#if defined(__ppc64__) + if ((intarg_count + fparg_count) > NUM_GPR_ARG_REGISTERS) + bytes += (intarg_count + fparg_count) * sizeof(long); +#elif defined(__ppc__) + if ((intarg_count + 2 * fparg_count) > NUM_GPR_ARG_REGISTERS) + bytes += (intarg_count + 2 * fparg_count) * sizeof(long); +#else +#error undefined architecture +#endif + else + bytes += NUM_GPR_ARG_REGISTERS * sizeof(long); + + /* The stack space allocated needs to be a multiple of 16/32 bytes. */ + bytes = SF_ROUND(bytes); + + cif->flags = flags; + cif->bytes = bytes; + + return FFI_OK; +} + +/*@-declundef@*/ +/*@-exportheader@*/ +extern void +ffi_call_AIX( +/*@out@*/ extended_cif*, + unsigned, + unsigned, +/*@out@*/ unsigned*, + void (*fn)(void), + void (*fn2)(extended_cif*, unsigned *const)); + +extern void +ffi_call_DARWIN( +/*@out@*/ extended_cif*, + unsigned long, + unsigned, +/*@out@*/ unsigned*, + void (*fn)(void), + void (*fn2)(extended_cif*, unsigned *const)); +/*@=declundef@*/ +/*@=exportheader@*/ + +void +ffi_call( +/*@dependent@*/ ffi_cif* cif, + void (*fn)(void), +/*@out@*/ void* rvalue, +/*@dependent@*/ void** avalue) +{ + extended_cif ecif; + + ecif.cif = cif; + ecif.avalue = avalue; + + /* If the return value is a struct and we don't have a return + value address then we need to make one. */ + if ((rvalue == NULL) && + (cif->rtype->type == FFI_TYPE_STRUCT)) + { + /*@-sysunrecog@*/ + ecif.rvalue = alloca(cif->rtype->size); + /*@=sysunrecog@*/ + } + else + ecif.rvalue = rvalue; + + switch (cif->abi) + { + case FFI_AIX: + /*@-usedef@*/ + ffi_call_AIX(&ecif, -cif->bytes, + cif->flags, ecif.rvalue, fn, ffi_prep_args); + /*@=usedef@*/ + break; + + case FFI_DARWIN: + /*@-usedef@*/ + ffi_call_DARWIN(&ecif, -(long)cif->bytes, + cif->flags, ecif.rvalue, fn, ffi_prep_args); + /*@=usedef@*/ + break; + + default: + FFI_ASSERT(0); + break; + } +} + +/* here I'd like to add the stack frame layout we use in darwin_closure.S + and aix_clsoure.S + + SP previous -> +---------------------------------------+ <--- child frame + | back chain to caller 4 | + +---------------------------------------+ 4 + | saved CR 4 | + +---------------------------------------+ 8 + | saved LR 4 | + +---------------------------------------+ 12 + | reserved for compilers 4 | + +---------------------------------------+ 16 + | reserved for binders 4 | + +---------------------------------------+ 20 + | saved TOC pointer 4 | + +---------------------------------------+ 24 + | always reserved 8*4=32 (previous GPRs)| + | according to the linkage convention | + | from AIX | + +---------------------------------------+ 56 + | our FPR area 13*8=104 | + | f1 | + | . | + | f13 | + +---------------------------------------+ 160 + | result area 8 | + +---------------------------------------+ 168 + | alignement to the next multiple of 16 | +SP current --> +---------------------------------------+ 176 <- parent frame + | back chain to caller 4 | + +---------------------------------------+ 180 + | saved CR 4 | + +---------------------------------------+ 184 + | saved LR 4 | + +---------------------------------------+ 188 + | reserved for compilers 4 | + +---------------------------------------+ 192 + | reserved for binders 4 | + +---------------------------------------+ 196 + | saved TOC pointer 4 | + +---------------------------------------+ 200 + | always reserved 8*4=32 we store our | + | GPRs here | + | r3 | + | . | + | r10 | + +---------------------------------------+ 232 + | overflow part | + +---------------------------------------+ xxx + | ???? | + +---------------------------------------+ xxx +*/ + +#if !defined(POWERPC_DARWIN) + +#define MIN_LINE_SIZE 32 + +static void +flush_icache( + char* addr) +{ +#ifndef _AIX + __asm__ volatile ( + "dcbf 0,%0\n" + "sync\n" + "icbi 0,%0\n" + "sync\n" + "isync" + : : "r" (addr) : "memory"); +#endif +} + +static void +flush_range( + char* addr, + int size) +{ + int i; + + for (i = 0; i < size; i += MIN_LINE_SIZE) + flush_icache(addr + i); + + flush_icache(addr + size - 1); +} + +#endif // !defined(POWERPC_DARWIN) + +ffi_status +ffi_prep_closure( + ffi_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif*, void*, void**, void*), + void* user_data) +{ + switch (cif->abi) + { + case FFI_DARWIN: + { + FFI_ASSERT (cif->abi == FFI_DARWIN); + + unsigned int* tramp = (unsigned int*)&closure->tramp[0]; + +#if defined(__ppc64__) + tramp[0] = 0x7c0802a6; // mflr r0 + tramp[1] = 0x429f0005; // bcl 20,31,+0x8 + tramp[2] = 0x7d6802a6; // mflr r11 + tramp[3] = 0x7c0803a6; // mtlr r0 + tramp[4] = 0xe98b0018; // ld r12,24(r11) + tramp[5] = 0x7d8903a6; // mtctr r12 + tramp[6] = 0xe96b0020; // ld r11,32(r11) + tramp[7] = 0x4e800420; // bctr + *(unsigned long*)&tramp[8] = (unsigned long)ffi_closure_ASM; + *(unsigned long*)&tramp[10] = (unsigned long)closure; +#elif defined(__ppc__) + tramp[0] = 0x7c0802a6; // mflr r0 + tramp[1] = 0x429f0005; // bcl 20,31,+0x8 + tramp[2] = 0x7d6802a6; // mflr r11 + tramp[3] = 0x7c0803a6; // mtlr r0 + tramp[4] = 0x818b0018; // lwz r12,24(r11) + tramp[5] = 0x7d8903a6; // mtctr r12 + tramp[6] = 0x816b001c; // lwz r11,28(r11) + tramp[7] = 0x4e800420; // bctr + tramp[8] = (unsigned long)ffi_closure_ASM; + tramp[9] = (unsigned long)closure; +#else +#error undefined architecture +#endif + + closure->cif = cif; + closure->fun = fun; + closure->user_data = user_data; + + // Flush the icache. Only necessary on Darwin. +#if defined(POWERPC_DARWIN) + sys_icache_invalidate(closure->tramp, FFI_TRAMPOLINE_SIZE); +#else + flush_range(closure->tramp, FFI_TRAMPOLINE_SIZE); +#endif + + break; + } + + case FFI_AIX: + { + FFI_ASSERT (cif->abi == FFI_AIX); + + ffi_aix_trampoline_struct* tramp_aix = + (ffi_aix_trampoline_struct*)(closure->tramp); + aix_fd* fd = (aix_fd*)(void*)ffi_closure_ASM; + + tramp_aix->code_pointer = fd->code_pointer; + tramp_aix->toc = fd->toc; + tramp_aix->static_chain = closure; + closure->cif = cif; + closure->fun = fun; + closure->user_data = user_data; + break; + } + + default: + return FFI_BAD_ABI; + } + + return FFI_OK; +} + +#if defined(__ppc__) + typedef double ldbits[2]; + + typedef union + { + ldbits lb; + long double ld; + } ldu; +#endif + +typedef union +{ + float f; + double d; +} ffi_dblfl; + +/* The trampoline invokes ffi_closure_ASM, and on entry, r11 holds the + address of the closure. After storing the registers that could possibly + contain parameters to be passed into the stack frame and setting up space + for a return value, ffi_closure_ASM invokes the following helper function + to do most of the work. */ +int +ffi_closure_helper_DARWIN( + ffi_closure* closure, + void* rvalue, + unsigned long* pgr, + ffi_dblfl* pfr) +{ + /* rvalue is the pointer to space for return value in closure assembly + pgr is the pointer to where r3-r10 are stored in ffi_closure_ASM + pfr is the pointer to where f1-f13 are stored in ffi_closure_ASM. */ + +#if defined(__ppc__) + ldu temp_ld; +#endif + + double temp; + unsigned int i; + unsigned int nf = 0; /* number of FPRs already used. */ + unsigned int ng = 0; /* number of GPRs already used. */ + ffi_cif* cif = closure->cif; + long avn = cif->nargs; + void** avalue = alloca(cif->nargs * sizeof(void*)); + ffi_type** arg_types = cif->arg_types; + + /* Copy the caller's structure return value address so that the closure + returns the data directly to the caller. */ +#if defined(__ppc64__) + if (cif->rtype->type == FFI_TYPE_STRUCT && + ffi64_stret_needs_ptr(cif->rtype, NULL, NULL)) +#elif defined(__ppc__) + if (cif->rtype->type == FFI_TYPE_STRUCT) +#else +#error undefined architecture +#endif + { + rvalue = (void*)*pgr; + pgr++; + ng++; + } + + /* Grab the addresses of the arguments from the stack frame. */ + for (i = 0; i < avn; i++) + { + switch (arg_types[i]->type) + { + case FFI_TYPE_SINT8: + case FFI_TYPE_UINT8: + avalue[i] = (char*)pgr + MODE_CHOICE(3,7); + ng++; + pgr++; + break; + + case FFI_TYPE_SINT16: + case FFI_TYPE_UINT16: + avalue[i] = (char*)pgr + MODE_CHOICE(2,6); + ng++; + pgr++; + break; + +#if defined(__ppc__) + case FFI_TYPE_POINTER: +#endif + case FFI_TYPE_SINT32: + case FFI_TYPE_UINT32: + avalue[i] = (char*)pgr + MODE_CHOICE(0,4); + ng++; + pgr++; + + break; + + case FFI_TYPE_STRUCT: + if (cif->abi == FFI_DARWIN) + { +#if defined(__ppc64__) + unsigned int gprSize = 0; + unsigned int fprSize = 0; + unsigned int savedFPRSize = fprSize; + + avalue[i] = alloca(arg_types[i]->size); + ffi64_struct_to_ram_form(arg_types[i], (const char*)pgr, + &gprSize, (const char*)pfr, &fprSize, &nf, avalue[i], NULL); + + ng += gprSize / sizeof(long); + pgr += gprSize / sizeof(long); + pfr += (fprSize - savedFPRSize) / sizeof(double); + +#elif defined(__ppc__) + /* Structures that match the basic modes (QI 1 byte, HI 2 bytes, + SI 4 bytes) are aligned as if they were those modes. */ + unsigned int size_al = size_al = arg_types[i]->size; + + /* If the first member of the struct is a double, then align + the struct to double-word. */ + if (arg_types[i]->elements[0]->type == FFI_TYPE_DOUBLE) + size_al = ALIGN(arg_types[i]->size, 8); + + if (size_al < 3) + avalue[i] = (void*)pgr + MODE_CHOICE(4,8) - size_al; + else + avalue[i] = (void*)pgr; + + ng += (size_al + 3) / sizeof(long); + pgr += (size_al + 3) / sizeof(long); +#else +#error undefined architecture +#endif + } + + break; + +#if defined(__ppc64__) + case FFI_TYPE_POINTER: +#endif + case FFI_TYPE_SINT64: + case FFI_TYPE_UINT64: + /* Long long ints are passed in 1 or 2 GPRs. */ + avalue[i] = pgr; + ng += MODE_CHOICE(2,1); + pgr += MODE_CHOICE(2,1); + + break; + + case FFI_TYPE_FLOAT: + /* A float value consumes a GPR. + There are 13 64-bit floating point registers. */ + if (nf < NUM_FPR_ARG_REGISTERS) + { + temp = pfr->d; + pfr->f = (float)temp; + avalue[i] = pfr; + pfr++; + } + else + avalue[i] = pgr; + + nf++; + ng++; + pgr++; + break; + + case FFI_TYPE_DOUBLE: + /* A double value consumes one or two GPRs. + There are 13 64bit floating point registers. */ + if (nf < NUM_FPR_ARG_REGISTERS) + { + avalue[i] = pfr; + pfr++; + } + else + avalue[i] = pgr; + + nf++; + ng += MODE_CHOICE(2,1); + pgr += MODE_CHOICE(2,1); + + break; + +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + + case FFI_TYPE_LONGDOUBLE: +#if defined(__ppc64__) + if (nf < NUM_FPR_ARG_REGISTERS) + { + avalue[i] = pfr; + pfr += 2; + } +#elif defined(__ppc__) + /* A long double value consumes 2/4 GPRs and 2 FPRs. + There are 13 64bit floating point registers. */ + if (nf < NUM_FPR_ARG_REGISTERS - 1) + { + avalue[i] = pfr; + pfr += 2; + } + /* Here we have the situation where one part of the long double + is stored in fpr13 and the other part is already on the stack. + We use a union to pass the long double to avalue[i]. */ + else if (nf == NUM_FPR_ARG_REGISTERS - 1) + { + memcpy (&temp_ld.lb[0], pfr, sizeof(temp_ld.lb[0])); + memcpy (&temp_ld.lb[1], pgr + 2, sizeof(temp_ld.lb[1])); + avalue[i] = &temp_ld.ld; + } +#else +#error undefined architecture +#endif + else + avalue[i] = pgr; + + nf += 2; + ng += MODE_CHOICE(4,2); + pgr += MODE_CHOICE(4,2); + + break; + +#endif /* FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE */ + + default: + FFI_ASSERT(0); + break; + } + } + + (closure->fun)(cif, rvalue, avalue, closure->user_data); + + /* Tell ffi_closure_ASM to perform return type promotions. */ + return cif->rtype->type; +} + +#if defined(__ppc64__) + +/* ffi64_struct_to_ram_form + + Rebuild a struct's natural layout from buffers of concatenated registers. + Return the number of registers used. + inGPRs[0-7] == r3, inFPRs[0-7] == f1 ... +*/ +void +ffi64_struct_to_ram_form( + const ffi_type* inType, + const char* inGPRs, + unsigned int* ioGPRMarker, + const char* inFPRs, + unsigned int* ioFPRMarker, + unsigned int* ioFPRsUsed, + char* outStruct, // caller-allocated + unsigned int* ioStructMarker) +{ + unsigned int srcGMarker = 0; + unsigned int srcFMarker = 0; + unsigned int savedFMarker = 0; + unsigned int fprsUsed = 0; + unsigned int savedFPRsUsed = 0; + unsigned int destMarker = 0; + + static unsigned int recurseCount = 0; + + if (ioGPRMarker) + srcGMarker = *ioGPRMarker; + + if (ioFPRMarker) + { + srcFMarker = *ioFPRMarker; + savedFMarker = srcFMarker; + } + + if (ioFPRsUsed) + { + fprsUsed = *ioFPRsUsed; + savedFPRsUsed = fprsUsed; + } + + if (ioStructMarker) + destMarker = *ioStructMarker; + + size_t i; + + switch (inType->size) + { + case 1: case 2: case 4: + srcGMarker += 8 - inType->size; + break; + + default: + break; + } + + for (i = 0; inType->elements[i] != NULL; i++) + { + switch (inType->elements[i]->type) + { + case FFI_TYPE_FLOAT: + srcFMarker = ALIGN(srcFMarker, 4); + srcGMarker = ALIGN(srcGMarker, 4); + destMarker = ALIGN(destMarker, 4); + + if (fprsUsed < NUM_FPR_ARG_REGISTERS) + { + *(float*)&outStruct[destMarker] = + (float)*(double*)&inFPRs[srcFMarker]; + srcFMarker += 8; + fprsUsed++; + } + else + *(float*)&outStruct[destMarker] = + (float)*(double*)&inGPRs[srcGMarker]; + + srcGMarker += 4; + destMarker += 4; + + // Skip to next GPR if next element won't fit and we're + // not already at a register boundary. + if (inType->elements[i + 1] != NULL && (destMarker % 8)) + { + if (!FFI_TYPE_1_BYTE(inType->elements[i + 1]->type) && + (!FFI_TYPE_2_BYTE(inType->elements[i + 1]->type) || + (ALIGN(srcGMarker, 8) - srcGMarker) < 2) && + (!FFI_TYPE_4_BYTE(inType->elements[i + 1]->type) || + (ALIGN(srcGMarker, 8) - srcGMarker) < 4)) + srcGMarker = ALIGN(srcGMarker, 8); + } + + break; + + case FFI_TYPE_DOUBLE: + srcFMarker = ALIGN(srcFMarker, 8); + destMarker = ALIGN(destMarker, 8); + + if (fprsUsed < NUM_FPR_ARG_REGISTERS) + { + *(double*)&outStruct[destMarker] = + *(double*)&inFPRs[srcFMarker]; + srcFMarker += 8; + fprsUsed++; + } + else + *(double*)&outStruct[destMarker] = + *(double*)&inGPRs[srcGMarker]; + + destMarker += 8; + + // Skip next GPR + srcGMarker += 8; + srcGMarker = ALIGN(srcGMarker, 8); + + break; + + case FFI_TYPE_LONGDOUBLE: + destMarker = ALIGN(destMarker, 16); + + if (fprsUsed < NUM_FPR_ARG_REGISTERS) + { + srcFMarker = ALIGN(srcFMarker, 8); + srcGMarker = ALIGN(srcGMarker, 8); + *(long double*)&outStruct[destMarker] = + *(long double*)&inFPRs[srcFMarker]; + srcFMarker += 16; + fprsUsed += 2; + } + else + { + srcFMarker = ALIGN(srcFMarker, 16); + srcGMarker = ALIGN(srcGMarker, 16); + *(long double*)&outStruct[destMarker] = + *(long double*)&inGPRs[srcGMarker]; + } + + destMarker += 16; + + // Skip next 2 GPRs + srcGMarker += 16; + srcGMarker = ALIGN(srcGMarker, 8); + + break; + + case FFI_TYPE_UINT8: + case FFI_TYPE_SINT8: + { + if (inType->alignment == 1) // chars only + { + if (inType->size == 1) + outStruct[destMarker++] = inGPRs[srcGMarker++]; + else if (inType->size == 2) + { + outStruct[destMarker++] = inGPRs[srcGMarker++]; + outStruct[destMarker++] = inGPRs[srcGMarker++]; + i++; + } + else + { + memcpy(&outStruct[destMarker], + &inGPRs[srcGMarker], inType->size); + srcGMarker += inType->size; + destMarker += inType->size; + i += inType->size - 1; + } + } + else // chars and other stuff + { + outStruct[destMarker++] = inGPRs[srcGMarker++]; + + // Skip to next GPR if next element won't fit and we're + // not already at a register boundary. + if (inType->elements[i + 1] != NULL && (srcGMarker % 8)) + { + if (!FFI_TYPE_1_BYTE(inType->elements[i + 1]->type) && + (!FFI_TYPE_2_BYTE(inType->elements[i + 1]->type) || + (ALIGN(srcGMarker, 8) - srcGMarker) < 2) && + (!FFI_TYPE_4_BYTE(inType->elements[i + 1]->type) || + (ALIGN(srcGMarker, 8) - srcGMarker) < 4)) + srcGMarker = ALIGN(srcGMarker, inType->alignment); // was 8 + } + } + + break; + } + + case FFI_TYPE_UINT16: + case FFI_TYPE_SINT16: + srcGMarker = ALIGN(srcGMarker, 2); + destMarker = ALIGN(destMarker, 2); + + *(short*)&outStruct[destMarker] = + *(short*)&inGPRs[srcGMarker]; + srcGMarker += 2; + destMarker += 2; + + break; + + case FFI_TYPE_INT: + case FFI_TYPE_UINT32: + case FFI_TYPE_SINT32: + srcGMarker = ALIGN(srcGMarker, 4); + destMarker = ALIGN(destMarker, 4); + + *(int*)&outStruct[destMarker] = + *(int*)&inGPRs[srcGMarker]; + srcGMarker += 4; + destMarker += 4; + + break; + + case FFI_TYPE_POINTER: + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + srcGMarker = ALIGN(srcGMarker, 8); + destMarker = ALIGN(destMarker, 8); + + *(long long*)&outStruct[destMarker] = + *(long long*)&inGPRs[srcGMarker]; + srcGMarker += 8; + destMarker += 8; + + break; + + case FFI_TYPE_STRUCT: + recurseCount++; + ffi64_struct_to_ram_form(inType->elements[i], inGPRs, + &srcGMarker, inFPRs, &srcFMarker, &fprsUsed, + outStruct, &destMarker); + recurseCount--; + break; + + default: + FFI_ASSERT(0); // unknown element type + break; + } + } + + srcGMarker = ALIGN(srcGMarker, inType->alignment); + + // Take care of the special case for 16-byte structs, but not for + // nested structs. + if (recurseCount == 0 && srcGMarker == 16) + { + *(long double*)&outStruct[0] = *(long double*)&inGPRs[0]; + srcFMarker = savedFMarker; + fprsUsed = savedFPRsUsed; + } + + if (ioGPRMarker) + *ioGPRMarker = ALIGN(srcGMarker, 8); + + if (ioFPRMarker) + *ioFPRMarker = srcFMarker; + + if (ioFPRsUsed) + *ioFPRsUsed = fprsUsed; + + if (ioStructMarker) + *ioStructMarker = ALIGN(destMarker, 8); +} + +/* ffi64_struct_to_reg_form + + Copy a struct's elements into buffers that can be sliced into registers. + Return the sizes of the output buffers in bytes. Pass NULL buffer pointers + to calculate size only. + outGPRs[0-7] == r3, outFPRs[0-7] == f1 ... +*/ +void +ffi64_struct_to_reg_form( + const ffi_type* inType, + const char* inStruct, + unsigned int* ioStructMarker, + unsigned int* ioFPRsUsed, + char* outGPRs, // caller-allocated + unsigned int* ioGPRSize, + char* outFPRs, // caller-allocated + unsigned int* ioFPRSize) +{ + size_t i; + unsigned int srcMarker = 0; + unsigned int destGMarker = 0; + unsigned int destFMarker = 0; + unsigned int savedFMarker = 0; + unsigned int fprsUsed = 0; + unsigned int savedFPRsUsed = 0; + + static unsigned int recurseCount = 0; + + if (ioStructMarker) + srcMarker = *ioStructMarker; + + if (ioFPRsUsed) + { + fprsUsed = *ioFPRsUsed; + savedFPRsUsed = fprsUsed; + } + + if (ioGPRSize) + destGMarker = *ioGPRSize; + + if (ioFPRSize) + { + destFMarker = *ioFPRSize; + savedFMarker = destFMarker; + } + + switch (inType->size) + { + case 1: case 2: case 4: + destGMarker += 8 - inType->size; + break; + + default: + break; + } + + for (i = 0; inType->elements[i] != NULL; i++) + { + switch (inType->elements[i]->type) + { + // Shadow floating-point types in GPRs for vararg and pre-ANSI + // functions. + case FFI_TYPE_FLOAT: + // Nudge markers to next 4/8-byte boundary + srcMarker = ALIGN(srcMarker, 4); + destGMarker = ALIGN(destGMarker, 4); + destFMarker = ALIGN(destFMarker, 8); + + if (fprsUsed < NUM_FPR_ARG_REGISTERS) + { + if (outFPRs != NULL && inStruct != NULL) + *(double*)&outFPRs[destFMarker] = + (double)*(float*)&inStruct[srcMarker]; + + destFMarker += 8; + fprsUsed++; + } + + if (outGPRs != NULL && inStruct != NULL) + *(double*)&outGPRs[destGMarker] = + (double)*(float*)&inStruct[srcMarker]; + + srcMarker += 4; + destGMarker += 4; + + // Skip to next GPR if next element won't fit and we're + // not already at a register boundary. + if (inType->elements[i + 1] != NULL && (srcMarker % 8)) + { + if (!FFI_TYPE_1_BYTE(inType->elements[i + 1]->type) && + (!FFI_TYPE_2_BYTE(inType->elements[i + 1]->type) || + (ALIGN(destGMarker, 8) - destGMarker) < 2) && + (!FFI_TYPE_4_BYTE(inType->elements[i + 1]->type) || + (ALIGN(destGMarker, 8) - destGMarker) < 4)) + destGMarker = ALIGN(destGMarker, 8); + } + + break; + + case FFI_TYPE_DOUBLE: + srcMarker = ALIGN(srcMarker, 8); + destFMarker = ALIGN(destFMarker, 8); + + if (fprsUsed < NUM_FPR_ARG_REGISTERS) + { + if (outFPRs != NULL && inStruct != NULL) + *(double*)&outFPRs[destFMarker] = + *(double*)&inStruct[srcMarker]; + + destFMarker += 8; + fprsUsed++; + } + + if (outGPRs != NULL && inStruct != NULL) + *(double*)&outGPRs[destGMarker] = + *(double*)&inStruct[srcMarker]; + + srcMarker += 8; + + // Skip next GPR + destGMarker += 8; + destGMarker = ALIGN(destGMarker, 8); + + break; + + case FFI_TYPE_LONGDOUBLE: + srcMarker = ALIGN(srcMarker, 16); + + if (fprsUsed < NUM_FPR_ARG_REGISTERS) + { + destFMarker = ALIGN(destFMarker, 8); + destGMarker = ALIGN(destGMarker, 8); + + if (outFPRs != NULL && inStruct != NULL) + *(long double*)&outFPRs[destFMarker] = + *(long double*)&inStruct[srcMarker]; + + if (outGPRs != NULL && inStruct != NULL) + *(long double*)&outGPRs[destGMarker] = + *(long double*)&inStruct[srcMarker]; + + destFMarker += 16; + fprsUsed += 2; + } + else + { + destGMarker = ALIGN(destGMarker, 16); + + if (outGPRs != NULL && inStruct != NULL) + *(long double*)&outGPRs[destGMarker] = + *(long double*)&inStruct[srcMarker]; + } + + srcMarker += 16; + destGMarker += 16; // Skip next 2 GPRs + destGMarker = ALIGN(destGMarker, 8); // was 16 + + break; + + case FFI_TYPE_UINT8: + case FFI_TYPE_SINT8: + if (inType->alignment == 1) // bytes only + { + if (inType->size == 1) + { + if (outGPRs != NULL && inStruct != NULL) + outGPRs[destGMarker] = inStruct[srcMarker]; + + srcMarker++; + destGMarker++; + } + else if (inType->size == 2) + { + if (outGPRs != NULL && inStruct != NULL) + { + outGPRs[destGMarker] = inStruct[srcMarker]; + outGPRs[destGMarker + 1] = inStruct[srcMarker + 1]; + } + + srcMarker += 2; + destGMarker += 2; + + i++; + } + else + { + if (outGPRs != NULL && inStruct != NULL) + { + // Avoid memcpy for small chunks. + if (inType->size <= sizeof(long)) + *(long*)&outGPRs[destGMarker] = + *(long*)&inStruct[srcMarker]; + else + memcpy(&outGPRs[destGMarker], + &inStruct[srcMarker], inType->size); + } + + srcMarker += inType->size; + destGMarker += inType->size; + i += inType->size - 1; + } + } + else // bytes and other stuff + { + if (outGPRs != NULL && inStruct != NULL) + outGPRs[destGMarker] = inStruct[srcMarker]; + + srcMarker++; + destGMarker++; + + // Skip to next GPR if next element won't fit and we're + // not already at a register boundary. + if (inType->elements[i + 1] != NULL && (destGMarker % 8)) + { + if (!FFI_TYPE_1_BYTE(inType->elements[i + 1]->type) && + (!FFI_TYPE_2_BYTE(inType->elements[i + 1]->type) || + (ALIGN(destGMarker, 8) - destGMarker) < 2) && + (!FFI_TYPE_4_BYTE(inType->elements[i + 1]->type) || + (ALIGN(destGMarker, 8) - destGMarker) < 4)) + destGMarker = ALIGN(destGMarker, inType->alignment); // was 8 + } + } + + break; + + case FFI_TYPE_UINT16: + case FFI_TYPE_SINT16: + srcMarker = ALIGN(srcMarker, 2); + destGMarker = ALIGN(destGMarker, 2); + + if (outGPRs != NULL && inStruct != NULL) + *(short*)&outGPRs[destGMarker] = + *(short*)&inStruct[srcMarker]; + + srcMarker += 2; + destGMarker += 2; + + if (inType->elements[i + 1] == NULL) + destGMarker = ALIGN(destGMarker, inType->alignment); + + break; + + case FFI_TYPE_INT: + case FFI_TYPE_UINT32: + case FFI_TYPE_SINT32: + srcMarker = ALIGN(srcMarker, 4); + destGMarker = ALIGN(destGMarker, 4); + + if (outGPRs != NULL && inStruct != NULL) + *(int*)&outGPRs[destGMarker] = + *(int*)&inStruct[srcMarker]; + + srcMarker += 4; + destGMarker += 4; + + break; + + case FFI_TYPE_POINTER: + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + srcMarker = ALIGN(srcMarker, 8); + destGMarker = ALIGN(destGMarker, 8); + + if (outGPRs != NULL && inStruct != NULL) + *(long long*)&outGPRs[destGMarker] = + *(long long*)&inStruct[srcMarker]; + + srcMarker += 8; + destGMarker += 8; + + if (inType->elements[i + 1] == NULL) + destGMarker = ALIGN(destGMarker, inType->alignment); + + break; + + case FFI_TYPE_STRUCT: + recurseCount++; + ffi64_struct_to_reg_form(inType->elements[i], + inStruct, &srcMarker, &fprsUsed, outGPRs, + &destGMarker, outFPRs, &destFMarker); + recurseCount--; + break; + + default: + FFI_ASSERT(0); + break; + } + } + + destGMarker = ALIGN(destGMarker, inType->alignment); + + // Take care of the special case for 16-byte structs, but not for + // nested structs. + if (recurseCount == 0 && destGMarker == 16) + { + if (outGPRs != NULL && inStruct != NULL) + *(long double*)&outGPRs[0] = *(long double*)&inStruct[0]; + + destFMarker = savedFMarker; + fprsUsed = savedFPRsUsed; + } + + if (ioStructMarker) + *ioStructMarker = ALIGN(srcMarker, 8); + + if (ioFPRsUsed) + *ioFPRsUsed = fprsUsed; + + if (ioGPRSize) + *ioGPRSize = ALIGN(destGMarker, 8); + + if (ioFPRSize) + *ioFPRSize = ALIGN(destFMarker, 8); +} + +/* ffi64_stret_needs_ptr + + Determine whether a returned struct needs a pointer in r3 or can fit + in registers. +*/ + +bool +ffi64_stret_needs_ptr( + const ffi_type* inType, + unsigned short* ioGPRCount, + unsigned short* ioFPRCount) +{ + // Obvious case first- struct is larger than combined FPR size. + if (inType->size > 14 * 8) + return true; + + // Now the struct can physically fit in registers, determine if it + // also fits logically. + bool needsPtr = false; + unsigned short gprsUsed = 0; + unsigned short fprsUsed = 0; + size_t i; + + if (ioGPRCount) + gprsUsed = *ioGPRCount; + + if (ioFPRCount) + fprsUsed = *ioFPRCount; + + for (i = 0; inType->elements[i] != NULL && !needsPtr; i++) + { + switch (inType->elements[i]->type) + { + case FFI_TYPE_FLOAT: + case FFI_TYPE_DOUBLE: + gprsUsed++; + fprsUsed++; + + if (fprsUsed > 13) + needsPtr = true; + + break; + + case FFI_TYPE_LONGDOUBLE: + gprsUsed += 2; + fprsUsed += 2; + + if (fprsUsed > 14) + needsPtr = true; + + break; + + case FFI_TYPE_UINT8: + case FFI_TYPE_SINT8: + { + gprsUsed++; + + if (gprsUsed > 8) + { + needsPtr = true; + break; + } + + if (inType->elements[i + 1] == NULL) // last byte in the struct + break; + + // Count possible contiguous bytes ahead, up to 8. + unsigned short j; + + for (j = 1; j < 8; j++) + { + if (inType->elements[i + j] == NULL || + !FFI_TYPE_1_BYTE(inType->elements[i + j]->type)) + break; + } + + i += j - 1; // allow for i++ before the test condition + + break; + } + + case FFI_TYPE_UINT16: + case FFI_TYPE_SINT16: + case FFI_TYPE_INT: + case FFI_TYPE_UINT32: + case FFI_TYPE_SINT32: + case FFI_TYPE_POINTER: + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + gprsUsed++; + + if (gprsUsed > 8) + needsPtr = true; + + break; + + case FFI_TYPE_STRUCT: + needsPtr = ffi64_stret_needs_ptr( + inType->elements[i], &gprsUsed, &fprsUsed); + + break; + + default: + FFI_ASSERT(0); + break; + } + } + + if (ioGPRCount) + *ioGPRCount = gprsUsed; + + if (ioFPRCount) + *ioFPRCount = fprsUsed; + + return needsPtr; +} + +/* ffi64_data_size + + Calculate the size in bytes of an ffi type. +*/ + +unsigned int +ffi64_data_size( + const ffi_type* inType) +{ + unsigned int size = 0; + + switch (inType->type) + { + case FFI_TYPE_UINT8: + case FFI_TYPE_SINT8: + size = 1; + break; + + case FFI_TYPE_UINT16: + case FFI_TYPE_SINT16: + size = 2; + break; + + case FFI_TYPE_INT: + case FFI_TYPE_UINT32: + case FFI_TYPE_SINT32: + case FFI_TYPE_FLOAT: + size = 4; + break; + + case FFI_TYPE_POINTER: + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + case FFI_TYPE_DOUBLE: + size = 8; + break; + + case FFI_TYPE_LONGDOUBLE: + size = 16; + break; + + case FFI_TYPE_STRUCT: + ffi64_struct_to_reg_form( + inType, NULL, NULL, NULL, NULL, &size, NULL, NULL); + break; + + case FFI_TYPE_VOID: + break; + + default: + FFI_ASSERT(0); + break; + } + + return size; +} + +#endif /* defined(__ppc64__) */ +#endif /* __ppc__ || __ppc64__ */ diff -r -u ./Modules/_ctypes/libffi_osx/powerpc/ppc64-darwin_closure.S ./Modules/_ctypes/libffi_osx/powerpc/ppc64-darwin_closure.S new file mode 100644 index 0000000..7162fa1 --- /dev/null +++ ./Modules/_ctypes/libffi_osx/powerpc/ppc64-darwin_closure.S @@ -0,0 +1,418 @@ +#if defined(__ppc64__) + +/* ----------------------------------------------------------------------- + ppc64-darwin_closure.S - Copyright (c) 2002, 2003, 2004, Free Software Foundation, + Inc. based on ppc_closure.S + + PowerPC Assembly glue. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#define LIBFFI_ASM + +#include +#include // for FFI_TRAMPOLINE_SIZE +#include +#include + + .file "ppc64-darwin_closure.S" +.text + .align LOG2_GPR_BYTES + .globl _ffi_closure_ASM + +.text + .align LOG2_GPR_BYTES + +_ffi_closure_ASM: +LFB1: + mflr r0 + stg r0,SF_RETURN(r1) // save return address + + // Save GPRs 3 - 10 (aligned to 8) in the parents outgoing area. + stg r3,SF_ARG1(r1) + stg r4,SF_ARG2(r1) + stg r5,SF_ARG3(r1) + stg r6,SF_ARG4(r1) + stg r7,SF_ARG5(r1) + stg r8,SF_ARG6(r1) + stg r9,SF_ARG7(r1) + stg r10,SF_ARG8(r1) + +LCFI0: +/* 48 bytes (Linkage Area) + 64 bytes (outgoing parameter area, always reserved) + 112 bytes (14*8 for incoming FPR) + ? bytes (result) + 112 bytes (14*8 for outgoing FPR) + 16 bytes (2 saved registers) + 352 + ? total bytes +*/ + + std r31,-8(r1) // Save registers we use. + std r30,-16(r1) + mr r30,r1 // Save the old SP. + mr r31,r11 // Save the ffi_closure around ffi64_data_size. + + // Calculate the space we need. + stdu r1,-SF_MINSIZE(r1) + ld r3,FFI_TRAMPOLINE_SIZE(r31) // ffi_closure->cif* + ld r3,16(r3) // ffi_cif->rtype* + bl Lffi64_data_size$stub + ld r1,0(r1) + + addi r3,r3,352 // Add our overhead. + neg r3,r3 + li r0,-32 // Align to 32 bytes. + and r3,r3,r0 + stdux r1,r1,r3 // Grow the stack. + + mr r11,r31 // Copy the ffi_closure back. + +LCFI1: + // We want to build up an area for the parameters passed + // in registers. (both floating point and integer) + +/* 320 bytes (callee stack frame aligned to 32) + 48 bytes (caller linkage area) + 368 (start of caller parameter area aligned to 8) +*/ + + // Save FPRs 1 - 14. (aligned to 8) + stfd f1,112(r1) + stfd f2,120(r1) + stfd f3,128(r1) + stfd f4,136(r1) + stfd f5,144(r1) + stfd f6,152(r1) + stfd f7,160(r1) + stfd f8,168(r1) + stfd f9,176(r1) + stfd f10,184(r1) + stfd f11,192(r1) + stfd f12,200(r1) + stfd f13,208(r1) + stfd f14,216(r1) + + // Set up registers for the routine that actually does the work. + mr r3,r11 // context pointer from the trampoline + addi r4,r1,224 // result storage + addi r5,r30,SF_ARG1 // saved GPRs + addi r6,r1,112 // saved FPRs + bl Lffi_closure_helper_DARWIN$stub + + // Look the proper starting point in table + // by using return type as an offset. + addi r5,r1,224 // Get pointer to results area. + bl Lget_ret_type0_addr // Get pointer to Lret_type0 into LR. + mflr r4 // Move to r4. + slwi r3,r3,4 // Now multiply return type by 16. + add r3,r3,r4 // Add contents of table to table address. + mtctr r3 + bctr + +LFE1: + // Each of the ret_typeX code fragments has to be exactly 16 bytes long + // (4 instructions). For cache effectiveness we align to a 16 byte + // boundary first. + .align 4 + nop + nop + nop + +Lget_ret_type0_addr: + blrl + +// case FFI_TYPE_VOID +Lret_type0: + b Lfinish + nop + nop + nop + +// case FFI_TYPE_INT +Lret_type1: + lwz r3,4(r5) + b Lfinish + nop + nop + +// case FFI_TYPE_FLOAT +Lret_type2: + lfs f1,0(r5) + b Lfinish + nop + nop + +// case FFI_TYPE_DOUBLE +Lret_type3: + lfd f1,0(r5) + b Lfinish + nop + nop + +// case FFI_TYPE_LONGDOUBLE +Lret_type4: + lfd f1,0(r5) + lfd f2,8(r5) + b Lfinish + nop + +// case FFI_TYPE_UINT8 +Lret_type5: + lbz r3,7(r5) + b Lfinish + nop + nop + +// case FFI_TYPE_SINT8 +Lret_type6: + lbz r3,7(r5) + extsb r3,r3 + b Lfinish + nop + +// case FFI_TYPE_UINT16 +Lret_type7: + lhz r3,6(r5) + b Lfinish + nop + nop + +// case FFI_TYPE_SINT16 +Lret_type8: + lha r3,6(r5) + b Lfinish + nop + nop + +// case FFI_TYPE_UINT32 +Lret_type9: // same as Lret_type1 + lwz r3,4(r5) + b Lfinish + nop + nop + +// case FFI_TYPE_SINT32 +Lret_type10: // same as Lret_type1 + lwz r3,4(r5) + b Lfinish + nop + nop + +// case FFI_TYPE_UINT64 +Lret_type11: + ld r3,0(r5) + b Lfinish + nop + nop + +// case FFI_TYPE_SINT64 +Lret_type12: // same as Lret_type11 + ld r3,0(r5) + b Lfinish + nop + nop + +// case FFI_TYPE_STRUCT +Lret_type13: + b Lret_struct + nop + nop + nop + +// ** End 16-byte aligned cases ** +// case FFI_TYPE_POINTER +// This case assumes that FFI_TYPE_POINTER == FFI_TYPE_LAST. If more types +// are added in future, the following code will need to be updated and +// padded to 16 bytes. +Lret_type14: + lg r3,0(r5) + b Lfinish + +// copy struct into registers +Lret_struct: + ld r31,FFI_TRAMPOLINE_SIZE(r31) // ffi_closure->cif* + ld r3,16(r31) // ffi_cif->rtype* + ld r31,24(r31) // ffi_cif->flags + mr r4,r5 // copy struct* to 2nd arg + addi r7,r1,SF_ARG9 // GPR return area + addi r9,r30,-16-(14*8) // FPR return area + li r5,0 // struct offset ptr (NULL) + li r6,0 // FPR used count ptr (NULL) + li r8,0 // GPR return area size ptr (NULL) + li r10,0 // FPR return area size ptr (NULL) + bl Lffi64_struct_to_reg_form$stub + + // Load GPRs + ld r3,SF_ARG9(r1) + ld r4,SF_ARG10(r1) + ld r5,SF_ARG11(r1) + ld r6,SF_ARG12(r1) + nop + ld r7,SF_ARG13(r1) + ld r8,SF_ARG14(r1) + ld r9,SF_ARG15(r1) + ld r10,SF_ARG16(r1) + nop + + // Load FPRs + mtcrf 0x2,r31 + bf 26,Lfinish + lfd f1,-16-(14*8)(r30) + lfd f2,-16-(13*8)(r30) + lfd f3,-16-(12*8)(r30) + lfd f4,-16-(11*8)(r30) + nop + lfd f5,-16-(10*8)(r30) + lfd f6,-16-(9*8)(r30) + lfd f7,-16-(8*8)(r30) + lfd f8,-16-(7*8)(r30) + nop + lfd f9,-16-(6*8)(r30) + lfd f10,-16-(5*8)(r30) + lfd f11,-16-(4*8)(r30) + lfd f12,-16-(3*8)(r30) + nop + lfd f13,-16-(2*8)(r30) + lfd f14,-16-(1*8)(r30) + // Fall through + +// case done +Lfinish: + lg r1,0(r1) // Restore stack pointer. + ld r31,-8(r1) // Restore registers we used. + ld r30,-16(r1) + lg r0,SF_RETURN(r1) // Get return address. + mtlr r0 // Reset link register. + blr + +// END(ffi_closure_ASM) + +.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support +EH_frame1: + .set L$set$0,LECIE1-LSCIE1 + .long L$set$0 ; Length of Common Information Entry +LSCIE1: + .long 0x0 ; CIE Identifier Tag + .byte 0x1 ; CIE Version + .ascii "zR\0" ; CIE Augmentation + .byte 0x1 ; uleb128 0x1; CIE Code Alignment Factor + .byte 0x7c ; sleb128 -4; CIE Data Alignment Factor + .byte 0x41 ; CIE RA Column + .byte 0x1 ; uleb128 0x1; Augmentation size + .byte 0x10 ; FDE Encoding (pcrel) + .byte 0xc ; DW_CFA_def_cfa + .byte 0x1 ; uleb128 0x1 + .byte 0x0 ; uleb128 0x0 + .align LOG2_GPR_BYTES +LECIE1: +.globl _ffi_closure_ASM.eh +_ffi_closure_ASM.eh: +LSFDE1: + .set L$set$1,LEFDE1-LASFDE1 + .long L$set$1 ; FDE Length + +LASFDE1: + .long LASFDE1-EH_frame1 ; FDE CIE offset + .g_long LFB1-. ; FDE initial location + .set L$set$3,LFE1-LFB1 + .g_long L$set$3 ; FDE address range + .byte 0x0 ; uleb128 0x0; Augmentation size + .byte 0x4 ; DW_CFA_advance_loc4 + .set L$set$3,LCFI1-LCFI0 + .long L$set$3 + .byte 0xe ; DW_CFA_def_cfa_offset + .byte 176,1 ; uleb128 176 + .byte 0x4 ; DW_CFA_advance_loc4 + .set L$set$4,LCFI0-LFB1 + .long L$set$4 + .byte 0x11 ; DW_CFA_offset_extended_sf + .byte 0x41 ; uleb128 0x41 + .byte 0x7e ; sleb128 -2 + .align LOG2_GPR_BYTES + +LEFDE1: +.data + .align LOG2_GPR_BYTES +LDFCM0: +.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 + .align LOG2_GPR_BYTES + +Lffi_closure_helper_DARWIN$stub: + .indirect_symbol _ffi_closure_helper_DARWIN + mflr r0 + bcl 20,31,LO$ffi_closure_helper_DARWIN + +LO$ffi_closure_helper_DARWIN: + mflr r11 + addis r11,r11,ha16(L_ffi_closure_helper_DARWIN$lazy_ptr - LO$ffi_closure_helper_DARWIN) + mtlr r0 + lgu r12,lo16(L_ffi_closure_helper_DARWIN$lazy_ptr - LO$ffi_closure_helper_DARWIN)(r11) + mtctr r12 + bctr + +.lazy_symbol_pointer +L_ffi_closure_helper_DARWIN$lazy_ptr: + .indirect_symbol _ffi_closure_helper_DARWIN + .g_long dyld_stub_binding_helper + +.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 + .align LOG2_GPR_BYTES + +Lffi64_struct_to_reg_form$stub: + .indirect_symbol _ffi64_struct_to_reg_form + mflr r0 + bcl 20,31,LO$ffi64_struct_to_reg_form + +LO$ffi64_struct_to_reg_form: + mflr r11 + addis r11,r11,ha16(L_ffi64_struct_to_reg_form$lazy_ptr - LO$ffi64_struct_to_reg_form) + mtlr r0 + lgu r12,lo16(L_ffi64_struct_to_reg_form$lazy_ptr - LO$ffi64_struct_to_reg_form)(r11) + mtctr r12 + bctr + +.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 + .align LOG2_GPR_BYTES + +Lffi64_data_size$stub: + .indirect_symbol _ffi64_data_size + mflr r0 + bcl 20,31,LO$ffi64_data_size + +LO$ffi64_data_size: + mflr r11 + addis r11,r11,ha16(L_ffi64_data_size$lazy_ptr - LO$ffi64_data_size) + mtlr r0 + lgu r12,lo16(L_ffi64_data_size$lazy_ptr - LO$ffi64_data_size)(r11) + mtctr r12 + bctr + +.lazy_symbol_pointer +L_ffi64_struct_to_reg_form$lazy_ptr: + .indirect_symbol _ffi64_struct_to_reg_form + .g_long dyld_stub_binding_helper + +L_ffi64_data_size$lazy_ptr: + .indirect_symbol _ffi64_data_size + .g_long dyld_stub_binding_helper + +#endif // __ppc64__ diff -r -u ./Modules/_ctypes/libffi_osx/types.c ./Modules/_ctypes/libffi_osx/types.c new file mode 100644 index 0000000..44806ae --- /dev/null +++ ./Modules/_ctypes/libffi_osx/types.c @@ -0,0 +1,115 @@ +/* ----------------------------------------------------------------------- + types.c - Copyright (c) 1996, 1998 Red Hat, Inc. + + Predefined ffi_types needed by libffi. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#include +#include + +/* Type definitions */ +#define FFI_INTEGRAL_TYPEDEF(n, s, a, t) \ + ffi_type ffi_type_##n = { s, a, t, NULL } +#define FFI_AGGREGATE_TYPEDEF(n, e) \ + ffi_type ffi_type_##n = { 0, 0, FFI_TYPE_STRUCT, e } + +FFI_INTEGRAL_TYPEDEF(uint8, 1, 1, FFI_TYPE_UINT8); +FFI_INTEGRAL_TYPEDEF(sint8, 1, 1, FFI_TYPE_SINT8); +FFI_INTEGRAL_TYPEDEF(uint16, 2, 2, FFI_TYPE_UINT16); +FFI_INTEGRAL_TYPEDEF(sint16, 2, 2, FFI_TYPE_SINT16); +FFI_INTEGRAL_TYPEDEF(uint32, 4, 4, FFI_TYPE_UINT32); +FFI_INTEGRAL_TYPEDEF(sint32, 4, 4, FFI_TYPE_SINT32); +FFI_INTEGRAL_TYPEDEF(float, 4, 4, FFI_TYPE_FLOAT); + +/* Size and alignment are fake here. They must not be 0. */ +FFI_INTEGRAL_TYPEDEF(void, 1, 1, FFI_TYPE_VOID); + +#if defined ALPHA || defined SPARC64 || defined X86_64 || \ + defined S390X || defined IA64 || defined POWERPC64 +FFI_INTEGRAL_TYPEDEF(pointer, 8, 8, FFI_TYPE_POINTER); +#else +FFI_INTEGRAL_TYPEDEF(pointer, 4, 4, FFI_TYPE_POINTER); +#endif + +#if defined X86 || defined ARM || defined M68K || defined(X86_DARWIN) + +# ifdef X86_64 + FFI_INTEGRAL_TYPEDEF(uint64, 8, 8, FFI_TYPE_UINT64); + FFI_INTEGRAL_TYPEDEF(sint64, 8, 8, FFI_TYPE_SINT64); +# else + FFI_INTEGRAL_TYPEDEF(uint64, 8, 4, FFI_TYPE_UINT64); + FFI_INTEGRAL_TYPEDEF(sint64, 8, 4, FFI_TYPE_SINT64); +# endif + +#elif defined(POWERPC_DARWIN) +FFI_INTEGRAL_TYPEDEF(uint64, 8, 8, FFI_TYPE_UINT64); +FFI_INTEGRAL_TYPEDEF(sint64, 8, 8, FFI_TYPE_SINT64); +#elif defined SH +FFI_INTEGRAL_TYPEDEF(uint64, 8, 4, FFI_TYPE_UINT64); +FFI_INTEGRAL_TYPEDEF(sint64, 8, 4, FFI_TYPE_SINT64); +#else +FFI_INTEGRAL_TYPEDEF(uint64, 8, 8, FFI_TYPE_UINT64); +FFI_INTEGRAL_TYPEDEF(sint64, 8, 8, FFI_TYPE_SINT64); +#endif + +#if defined X86 || defined X86_WIN32 || defined M68K || defined(X86_DARWIN) + +# if defined X86_WIN32 || defined X86_64 + FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE); +# else + FFI_INTEGRAL_TYPEDEF(double, 8, 4, FFI_TYPE_DOUBLE); +# endif + +# ifdef X86_DARWIN + FFI_INTEGRAL_TYPEDEF(longdouble, 16, 16, FFI_TYPE_LONGDOUBLE); +# else + FFI_INTEGRAL_TYPEDEF(longdouble, 12, 4, FFI_TYPE_LONGDOUBLE); +# endif + +#elif defined ARM || defined SH || defined POWERPC_AIX +FFI_INTEGRAL_TYPEDEF(double, 8, 4, FFI_TYPE_DOUBLE); +FFI_INTEGRAL_TYPEDEF(longdouble, 8, 4, FFI_TYPE_LONGDOUBLE); +#elif defined POWERPC_DARWIN +FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE); + +# if __GNUC__ >= 4 + FFI_INTEGRAL_TYPEDEF(longdouble, 16, 16, FFI_TYPE_LONGDOUBLE); +# else + FFI_INTEGRAL_TYPEDEF(longdouble, 8, 8, FFI_TYPE_LONGDOUBLE); +# endif + +#elif defined SPARC +FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE); + +# ifdef SPARC64 + FFI_INTEGRAL_TYPEDEF(longdouble, 16, 16, FFI_TYPE_LONGDOUBLE); +# else + FFI_INTEGRAL_TYPEDEF(longdouble, 16, 8, FFI_TYPE_LONGDOUBLE); +# endif + +#elif defined X86_64 || defined POWERPC64 +FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE); +FFI_INTEGRAL_TYPEDEF(longdouble, 16, 16, FFI_TYPE_LONGDOUBLE); +#else +FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE); +FFI_INTEGRAL_TYPEDEF(longdouble, 8, 8, FFI_TYPE_LONGDOUBLE); +#endif \ No newline at end of file diff -r -u ./Modules/_ctypes/libffi_osx/x86/darwin64.S ./Modules/_ctypes/libffi_osx/x86/darwin64.S new file mode 100644 index 0000000..165d469 --- /dev/null +++ ./Modules/_ctypes/libffi_osx/x86/darwin64.S @@ -0,0 +1,417 @@ +/* ----------------------------------------------------------------------- + darwin64.S - Copyright (c) 2006 Free Software Foundation, Inc. + derived from unix64.S + + x86-64 Foreign Function Interface for Darwin. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#ifdef __x86_64__ +#define LIBFFI_ASM +#include +#include + + .file "darwin64.S" +.text + +/* ffi_call_unix64 (void *args, unsigned long bytes, unsigned flags, + void *raddr, void (*fnaddr)()); + + Bit o trickiness here -- ARGS+BYTES is the base of the stack frame + for this function. This has been allocated by ffi_call. We also + deallocate some of the stack that has been alloca'd. */ + + .align 3 + .globl _ffi_call_unix64 + +_ffi_call_unix64: +LUW0: + movq (%rsp), %r10 /* Load return address. */ + movq %rdi, %r12 /* Save a copy of the register area. */ + leaq (%rdi, %rsi), %rax /* Find local stack base. */ + movq %rdx, (%rax) /* Save flags. */ + movq %rcx, 8(%rax) /* Save raddr. */ + movq %rbp, 16(%rax) /* Save old frame pointer. */ + movq %r10, 24(%rax) /* Relocate return address. */ + movq %rax, %rbp /* Finalize local stack frame. */ +LUW1: + /* movq %rdi, %r10 // Save a copy of the register area. */ + movq %r12, %r10 + movq %r8, %r11 /* Save a copy of the target fn. */ + movl %r9d, %eax /* Set number of SSE registers. */ + + /* Load up all argument registers. */ + movq (%r10), %rdi + movq 8(%r10), %rsi + movq 16(%r10), %rdx + movq 24(%r10), %rcx + movq 32(%r10), %r8 + movq 40(%r10), %r9 + testl %eax, %eax + jnz Lload_sse +Lret_from_load_sse: + + /* Deallocate the reg arg area. */ + leaq 176(%r10), %rsp + + /* Call the user function. */ + call *%r11 + + /* Deallocate stack arg area; local stack frame in redzone. */ + leaq 24(%rbp), %rsp + + movq 0(%rbp), %rcx /* Reload flags. */ + movq 8(%rbp), %rdi /* Reload raddr. */ + movq 16(%rbp), %rbp /* Reload old frame pointer. */ +LUW2: + + /* The first byte of the flags contains the FFI_TYPE. */ + movzbl %cl, %r10d + leaq Lstore_table(%rip), %r11 + movslq (%r11, %r10, 4), %r10 + addq %r11, %r10 + jmp *%r10 + +Lstore_table: + .long Lst_void-Lstore_table /* FFI_TYPE_VOID */ + .long Lst_sint32-Lstore_table /* FFI_TYPE_INT */ + .long Lst_float-Lstore_table /* FFI_TYPE_FLOAT */ + .long Lst_double-Lstore_table /* FFI_TYPE_DOUBLE */ + .long Lst_ldouble-Lstore_table /* FFI_TYPE_LONGDOUBLE */ + .long Lst_uint8-Lstore_table /* FFI_TYPE_UINT8 */ + .long Lst_sint8-Lstore_table /* FFI_TYPE_SINT8 */ + .long Lst_uint16-Lstore_table /* FFI_TYPE_UINT16 */ + .long Lst_sint16-Lstore_table /* FFI_TYPE_SINT16 */ + .long Lst_uint32-Lstore_table /* FFI_TYPE_UINT32 */ + .long Lst_sint32-Lstore_table /* FFI_TYPE_SINT32 */ + .long Lst_int64-Lstore_table /* FFI_TYPE_UINT64 */ + .long Lst_int64-Lstore_table /* FFI_TYPE_SINT64 */ + .long Lst_struct-Lstore_table /* FFI_TYPE_STRUCT */ + .long Lst_int64-Lstore_table /* FFI_TYPE_POINTER */ + + .text + .align 3 +Lst_void: + ret + .align 3 +Lst_uint8: + movzbq %al, %rax + movq %rax, (%rdi) + ret + .align 3 +Lst_sint8: + movsbq %al, %rax + movq %rax, (%rdi) + ret + .align 3 +Lst_uint16: + movzwq %ax, %rax + movq %rax, (%rdi) + .align 3 +Lst_sint16: + movswq %ax, %rax + movq %rax, (%rdi) + ret + .align 3 +Lst_uint32: + movl %eax, %eax + movq %rax, (%rdi) + .align 3 +Lst_sint32: + cltq + movq %rax, (%rdi) + ret + .align 3 +Lst_int64: + movq %rax, (%rdi) + ret + .align 3 +Lst_float: + movss %xmm0, (%rdi) + ret + .align 3 +Lst_double: + movsd %xmm0, (%rdi) + ret +Lst_ldouble: + fstpt (%rdi) + ret + .align 3 +Lst_struct: + leaq -20(%rsp), %rsi /* Scratch area in redzone. */ + + /* We have to locate the values now, and since we don't want to + write too much data into the user's return value, we spill the + value to a 16 byte scratch area first. Bits 8, 9, and 10 + control where the values are located. Only one of the three + bits will be set; see ffi_prep_cif_machdep for the pattern. */ + movd %xmm0, %r10 + movd %xmm1, %r11 + testl $0x100, %ecx + cmovnz %rax, %rdx + cmovnz %r10, %rax + testl $0x200, %ecx + cmovnz %r10, %rdx + testl $0x400, %ecx + cmovnz %r10, %rax + cmovnz %r11, %rdx + movq %rax, (%rsi) + movq %rdx, 8(%rsi) + + /* Bits 12-31 contain the true size of the structure. Copy from + the scratch area to the true destination. */ + shrl $12, %ecx + rep movsb + ret + + /* Many times we can avoid loading any SSE registers at all. + It's not worth an indirect jump to load the exact set of + SSE registers needed; zero or all is a good compromise. */ + .align 3 +LUW3: +Lload_sse: + movdqa 48(%r10), %xmm0 + movdqa 64(%r10), %xmm1 + movdqa 80(%r10), %xmm2 + movdqa 96(%r10), %xmm3 + movdqa 112(%r10), %xmm4 + movdqa 128(%r10), %xmm5 + movdqa 144(%r10), %xmm6 + movdqa 160(%r10), %xmm7 + jmp Lret_from_load_sse + +LUW4: + .align 3 + .globl _ffi_closure_unix64 + +_ffi_closure_unix64: +LUW5: + /* The carry flag is set by the trampoline iff SSE registers + are used. Don't clobber it before the branch instruction. */ + leaq -200(%rsp), %rsp +LUW6: + movq %rdi, (%rsp) + movq %rsi, 8(%rsp) + movq %rdx, 16(%rsp) + movq %rcx, 24(%rsp) + movq %r8, 32(%rsp) + movq %r9, 40(%rsp) + jc Lsave_sse +Lret_from_save_sse: + + movq %r10, %rdi + leaq 176(%rsp), %rsi + movq %rsp, %rdx + leaq 208(%rsp), %rcx + call _ffi_closure_unix64_inner + + /* Deallocate stack frame early; return value is now in redzone. */ + addq $200, %rsp +LUW7: + + /* The first byte of the return value contains the FFI_TYPE. */ + movzbl %al, %r10d + leaq Lload_table(%rip), %r11 + movslq (%r11, %r10, 4), %r10 + addq %r11, %r10 + jmp *%r10 + +Lload_table: + .long Lld_void-Lload_table /* FFI_TYPE_VOID */ + .long Lld_int32-Lload_table /* FFI_TYPE_INT */ + .long Lld_float-Lload_table /* FFI_TYPE_FLOAT */ + .long Lld_double-Lload_table /* FFI_TYPE_DOUBLE */ + .long Lld_ldouble-Lload_table /* FFI_TYPE_LONGDOUBLE */ + .long Lld_int8-Lload_table /* FFI_TYPE_UINT8 */ + .long Lld_int8-Lload_table /* FFI_TYPE_SINT8 */ + .long Lld_int16-Lload_table /* FFI_TYPE_UINT16 */ + .long Lld_int16-Lload_table /* FFI_TYPE_SINT16 */ + .long Lld_int32-Lload_table /* FFI_TYPE_UINT32 */ + .long Lld_int32-Lload_table /* FFI_TYPE_SINT32 */ + .long Lld_int64-Lload_table /* FFI_TYPE_UINT64 */ + .long Lld_int64-Lload_table /* FFI_TYPE_SINT64 */ + .long Lld_struct-Lload_table /* FFI_TYPE_STRUCT */ + .long Lld_int64-Lload_table /* FFI_TYPE_POINTER */ + + .text + .align 3 +Lld_void: + ret + .align 3 +Lld_int8: + movzbl -24(%rsp), %eax + ret + .align 3 +Lld_int16: + movzwl -24(%rsp), %eax + ret + .align 3 +Lld_int32: + movl -24(%rsp), %eax + ret + .align 3 +Lld_int64: + movq -24(%rsp), %rax + ret + .align 3 +Lld_float: + movss -24(%rsp), %xmm0 + ret + .align 3 +Lld_double: + movsd -24(%rsp), %xmm0 + ret + .align 3 +Lld_ldouble: + fldt -24(%rsp) + ret + .align 3 +Lld_struct: + /* There are four possibilities here, %rax/%rdx, %xmm0/%rax, + %rax/%xmm0, %xmm0/%xmm1. We collapse two by always loading + both rdx and xmm1 with the second word. For the remaining, + bit 8 set means xmm0 gets the second word, and bit 9 means + that rax gets the second word. */ + movq -24(%rsp), %rcx + movq -16(%rsp), %rdx + movq -16(%rsp), %xmm1 + testl $0x100, %eax + cmovnz %rdx, %rcx + movd %rcx, %xmm0 + testl $0x200, %eax + movq -24(%rsp), %rax + cmovnz %rdx, %rax + ret + + /* See the comment above Lload_sse; the same logic applies here. */ + .align 3 +LUW8: +Lsave_sse: + movdqa %xmm0, 48(%rsp) + movdqa %xmm1, 64(%rsp) + movdqa %xmm2, 80(%rsp) + movdqa %xmm3, 96(%rsp) + movdqa %xmm4, 112(%rsp) + movdqa %xmm5, 128(%rsp) + movdqa %xmm6, 144(%rsp) + movdqa %xmm7, 160(%rsp) + jmp Lret_from_save_sse + +LUW9: +.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support +EH_frame1: + .set L$set$0,LECIE1-LSCIE1 /* CIE Length */ + .long L$set$0 +LSCIE1: + .long 0x0 /* CIE Identifier Tag */ + .byte 0x1 /* CIE Version */ + .ascii "zR\0" /* CIE Augmentation */ + .byte 0x1 /* uleb128 0x1; CIE Code Alignment Factor */ + .byte 0x78 /* sleb128 -8; CIE Data Alignment Factor */ + .byte 0x10 /* CIE RA Column */ + .byte 0x1 /* uleb128 0x1; Augmentation size */ + .byte 0x10 /* FDE Encoding (pcrel sdata4) */ + .byte 0xc /* DW_CFA_def_cfa, %rsp offset 8 */ + .byte 0x7 /* uleb128 0x7 */ + .byte 0x8 /* uleb128 0x8 */ + .byte 0x90 /* DW_CFA_offset, column 0x10 */ + .byte 0x1 + .align 3 +LECIE1: + .globl _ffi_call_unix64.eh +_ffi_call_unix64.eh: +LSFDE1: + .set L$set$1,LEFDE1-LASFDE1 /* FDE Length */ + .long L$set$1 +LASFDE1: + .long LASFDE1-EH_frame1 /* FDE CIE offset */ + .quad LUW0-. /* FDE initial location */ + .set L$set$2,LUW4-LUW0 /* FDE address range */ + .quad L$set$2 + .byte 0x0 /* Augmentation size */ + .byte 0x4 /* DW_CFA_advance_loc4 */ + .set L$set$3,LUW1-LUW0 + .long L$set$3 + + /* New stack frame based off rbp. This is a itty bit of unwind + trickery in that the CFA *has* changed. There is no easy way + to describe it correctly on entry to the function. Fortunately, + it doesn't matter too much since at all points we can correctly + unwind back to ffi_call. Note that the location to which we + moved the return address is (the new) CFA-8, so from the + perspective of the unwind info, it hasn't moved. */ + .byte 0xc /* DW_CFA_def_cfa, %rbp offset 32 */ + .byte 0x6 + .byte 0x20 + .byte 0x80+6 /* DW_CFA_offset, %rbp offset 2*-8 */ + .byte 0x2 + .byte 0xa /* DW_CFA_remember_state */ + + .byte 0x4 /* DW_CFA_advance_loc4 */ + .set L$set$4,LUW2-LUW1 + .long L$set$4 + .byte 0xc /* DW_CFA_def_cfa, %rsp offset 8 */ + .byte 0x7 + .byte 0x8 + .byte 0xc0+6 /* DW_CFA_restore, %rbp */ + + .byte 0x4 /* DW_CFA_advance_loc4 */ + .set L$set$5,LUW3-LUW2 + .long L$set$5 + .byte 0xb /* DW_CFA_restore_state */ + + .align 3 +LEFDE1: + .globl _ffi_closure_unix64.eh +_ffi_closure_unix64.eh: +LSFDE3: + .set L$set$6,LEFDE3-LASFDE3 /* FDE Length */ + .long L$set$6 +LASFDE3: + .long LASFDE3-EH_frame1 /* FDE CIE offset */ + .quad LUW5-. /* FDE initial location */ + .set L$set$7,LUW9-LUW5 /* FDE address range */ + .quad L$set$7 + .byte 0x0 /* Augmentation size */ + + .byte 0x4 /* DW_CFA_advance_loc4 */ + .set L$set$8,LUW6-LUW5 + .long L$set$8 + .byte 0xe /* DW_CFA_def_cfa_offset */ + .byte 208,1 /* uleb128 208 */ + .byte 0xa /* DW_CFA_remember_state */ + + .byte 0x4 /* DW_CFA_advance_loc4 */ + .set L$set$9,LUW7-LUW6 + .long L$set$9 + .byte 0xe /* DW_CFA_def_cfa_offset */ + .byte 0x8 + + .byte 0x4 /* DW_CFA_advance_loc4 */ + .set L$set$10,LUW8-LUW7 + .long L$set$10 + .byte 0xb /* DW_CFA_restore_state */ + + .align 3 +LEFDE3: + .subsections_via_symbols + +#endif /* __x86_64__ */ diff -r -u ./Modules/_ctypes/libffi_osx/x86/x86-darwin.S ./Modules/_ctypes/libffi_osx/x86/x86-darwin.S new file mode 100644 index 0000000..925a841 --- /dev/null +++ ./Modules/_ctypes/libffi_osx/x86/x86-darwin.S @@ -0,0 +1,422 @@ +#ifdef __i386__ +/* ----------------------------------------------------------------------- + darwin.S - Copyright (c) 1996, 1998, 2001, 2002, 2003 Red Hat, Inc. + + X86 Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +/* + * This file is based on sysv.S and then hacked up by Ronald who hasn't done + * assembly programming in 8 years. + */ + +#ifndef __x86_64__ + +#define LIBFFI_ASM +#include +#include + +#ifdef PyObjC_STRICT_DEBUGGING + /* XXX: Debugging of stack alignment, to be removed */ +#define ASSERT_STACK_ALIGNED movdqa -16(%esp), %xmm0 +#else +#define ASSERT_STACK_ALIGNED +#endif + +.text + +.globl _ffi_prep_args + + .align 4 +.globl _ffi_call_SYSV + +_ffi_call_SYSV: +LFB1: + pushl %ebp +LCFI0: + movl %esp,%ebp +LCFI1: + subl $8,%esp + /* Make room for all of the new args. */ + movl 16(%ebp),%ecx + subl %ecx,%esp + + movl %esp,%eax + + /* Place all of the ffi_prep_args in position */ + subl $8,%esp + pushl 12(%ebp) + pushl %eax + call *8(%ebp) + + /* Return stack to previous state and call the function */ + addl $16,%esp + + call *28(%ebp) + + /* Remove the space we pushed for the args */ + movl 16(%ebp),%ecx + addl %ecx,%esp + + /* Load %ecx with the return type code */ + movl 20(%ebp),%ecx + + /* If the return value pointer is NULL, assume no return value. */ + cmpl $0,24(%ebp) + jne Lretint + + /* Even if there is no space for the return value, we are + obliged to handle floating-point values. */ + cmpl $FFI_TYPE_FLOAT,%ecx + jne Lnoretval + fstp %st(0) + + jmp Lepilogue + +Lretint: + cmpl $FFI_TYPE_INT,%ecx + jne Lretfloat + /* Load %ecx with the pointer to storage for the return value */ + movl 24(%ebp),%ecx + movl %eax,0(%ecx) + jmp Lepilogue + +Lretfloat: + cmpl $FFI_TYPE_FLOAT,%ecx + jne Lretdouble + /* Load %ecx with the pointer to storage for the return value */ + movl 24(%ebp),%ecx + fstps (%ecx) + jmp Lepilogue + +Lretdouble: + cmpl $FFI_TYPE_DOUBLE,%ecx + jne Lretlongdouble + /* Load %ecx with the pointer to storage for the return value */ + movl 24(%ebp),%ecx + fstpl (%ecx) + jmp Lepilogue + +Lretlongdouble: + cmpl $FFI_TYPE_LONGDOUBLE,%ecx + jne Lretint64 + /* Load %ecx with the pointer to storage for the return value */ + movl 24(%ebp),%ecx + fstpt (%ecx) + jmp Lepilogue + +Lretint64: + cmpl $FFI_TYPE_SINT64,%ecx + jne Lretstruct1b + /* Load %ecx with the pointer to storage for the return value */ + movl 24(%ebp),%ecx + movl %eax,0(%ecx) + movl %edx,4(%ecx) + jmp Lepilogue + +Lretstruct1b: + cmpl $FFI_TYPE_SINT8,%ecx + jne Lretstruct2b + /* Load %ecx with the pointer to storage for the return value */ + movl 24(%ebp),%ecx + movb %al,0(%ecx) + jmp Lepilogue + +Lretstruct2b: + cmpl $FFI_TYPE_SINT16,%ecx + jne Lretstruct + /* Load %ecx with the pointer to storage for the return value */ + movl 24(%ebp),%ecx + movw %ax,0(%ecx) + jmp Lepilogue + +Lretstruct: + cmpl $FFI_TYPE_STRUCT,%ecx + jne Lnoretval + /* Nothing to do! */ + addl $4,%esp + popl %ebp + ret + +Lnoretval: +Lepilogue: + addl $8,%esp + movl %ebp,%esp + popl %ebp + ret +LFE1: +.ffi_call_SYSV_end: + + .align 4 +FFI_HIDDEN (ffi_closure_SYSV) +.globl _ffi_closure_SYSV + +_ffi_closure_SYSV: +LFB2: + pushl %ebp +LCFI2: + movl %esp, %ebp +LCFI3: + subl $56, %esp + leal -40(%ebp), %edx + movl %edx, -12(%ebp) /* resp */ + leal 8(%ebp), %edx + movl %edx, 4(%esp) /* args = __builtin_dwarf_cfa () */ + leal -12(%ebp), %edx + movl %edx, (%esp) /* &resp */ + movl %ebx, 8(%esp) +LCFI7: + call L_ffi_closure_SYSV_inner$stub + movl 8(%esp), %ebx + movl -12(%ebp), %ecx + cmpl $FFI_TYPE_INT, %eax + je Lcls_retint + cmpl $FFI_TYPE_FLOAT, %eax + je Lcls_retfloat + cmpl $FFI_TYPE_DOUBLE, %eax + je Lcls_retdouble + cmpl $FFI_TYPE_LONGDOUBLE, %eax + je Lcls_retldouble + cmpl $FFI_TYPE_SINT64, %eax + je Lcls_retllong + cmpl $FFI_TYPE_UINT8, %eax + je Lcls_retstruct1 + cmpl $FFI_TYPE_SINT8, %eax + je Lcls_retstruct1 + cmpl $FFI_TYPE_UINT16, %eax + je Lcls_retstruct2 + cmpl $FFI_TYPE_SINT16, %eax + je Lcls_retstruct2 + cmpl $FFI_TYPE_STRUCT, %eax + je Lcls_retstruct +Lcls_epilogue: + movl %ebp, %esp + popl %ebp + ret +Lcls_retint: + movl (%ecx), %eax + jmp Lcls_epilogue +Lcls_retfloat: + flds (%ecx) + jmp Lcls_epilogue +Lcls_retdouble: + fldl (%ecx) + jmp Lcls_epilogue +Lcls_retldouble: + fldt (%ecx) + jmp Lcls_epilogue +Lcls_retllong: + movl (%ecx), %eax + movl 4(%ecx), %edx + jmp Lcls_epilogue +Lcls_retstruct1: + movsbl (%ecx), %eax + jmp Lcls_epilogue +Lcls_retstruct2: + movswl (%ecx), %eax + jmp Lcls_epilogue +Lcls_retstruct: + lea -8(%ebp),%esp + movl %ebp, %esp + popl %ebp + ret $4 +LFE2: + +#if !FFI_NO_RAW_API + +#define RAW_CLOSURE_CIF_OFFSET ((FFI_TRAMPOLINE_SIZE + 3) & ~3) +#define RAW_CLOSURE_FUN_OFFSET (RAW_CLOSURE_CIF_OFFSET + 4) +#define RAW_CLOSURE_USER_DATA_OFFSET (RAW_CLOSURE_FUN_OFFSET + 4) +#define CIF_FLAGS_OFFSET 20 + + .align 4 +FFI_HIDDEN (ffi_closure_raw_SYSV) +.globl _ffi_closure_raw_SYSV + +_ffi_closure_raw_SYSV: +LFB3: + pushl %ebp +LCFI4: + movl %esp, %ebp +LCFI5: + pushl %esi +LCFI6: + subl $36, %esp + movl RAW_CLOSURE_CIF_OFFSET(%eax), %esi /* closure->cif */ + movl RAW_CLOSURE_USER_DATA_OFFSET(%eax), %edx /* closure->user_data */ + movl %edx, 12(%esp) /* user_data */ + leal 8(%ebp), %edx /* __builtin_dwarf_cfa () */ + movl %edx, 8(%esp) /* raw_args */ + leal -24(%ebp), %edx + movl %edx, 4(%esp) /* &res */ + movl %esi, (%esp) /* cif */ + call *RAW_CLOSURE_FUN_OFFSET(%eax) /* closure->fun */ + movl CIF_FLAGS_OFFSET(%esi), %eax /* rtype */ + cmpl $FFI_TYPE_INT, %eax + je Lrcls_retint + cmpl $FFI_TYPE_FLOAT, %eax + je Lrcls_retfloat + cmpl $FFI_TYPE_DOUBLE, %eax + je Lrcls_retdouble + cmpl $FFI_TYPE_LONGDOUBLE, %eax + je Lrcls_retldouble + cmpl $FFI_TYPE_SINT64, %eax + je Lrcls_retllong +Lrcls_epilogue: + addl $36, %esp + popl %esi + popl %ebp + ret +Lrcls_retint: + movl -24(%ebp), %eax + jmp Lrcls_epilogue +Lrcls_retfloat: + flds -24(%ebp) + jmp Lrcls_epilogue +Lrcls_retdouble: + fldl -24(%ebp) + jmp Lrcls_epilogue +Lrcls_retldouble: + fldt -24(%ebp) + jmp Lrcls_epilogue +Lrcls_retllong: + movl -24(%ebp), %eax + movl -20(%ebp), %edx + jmp Lrcls_epilogue +LFE3: +#endif + +.section __IMPORT,__jump_table,symbol_stubs,self_modifying_code+pure_instructions,5 +L_ffi_closure_SYSV_inner$stub: + .indirect_symbol _ffi_closure_SYSV_inner + hlt ; hlt ; hlt ; hlt ; hlt + + +.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support +EH_frame1: + .set L$set$0,LECIE1-LSCIE1 + .long L$set$0 +LSCIE1: + .long 0x0 + .byte 0x1 + .ascii "zR\0" + .byte 0x1 + .byte 0x7c + .byte 0x8 + .byte 0x1 + .byte 0x10 + .byte 0xc + .byte 0x5 + .byte 0x4 + .byte 0x88 + .byte 0x1 + .align 2 +LECIE1: +.globl _ffi_call_SYSV.eh +_ffi_call_SYSV.eh: +LSFDE1: + .set L$set$1,LEFDE1-LASFDE1 + .long L$set$1 +LASFDE1: + .long LASFDE1-EH_frame1 + .long LFB1-. + .set L$set$2,LFE1-LFB1 + .long L$set$2 + .byte 0x0 + .byte 0x4 + .set L$set$3,LCFI0-LFB1 + .long L$set$3 + .byte 0xe + .byte 0x8 + .byte 0x84 + .byte 0x2 + .byte 0x4 + .set L$set$4,LCFI1-LCFI0 + .long L$set$4 + .byte 0xd + .byte 0x4 + .align 2 +LEFDE1: +.globl _ffi_closure_SYSV.eh +_ffi_closure_SYSV.eh: +LSFDE2: + .set L$set$5,LEFDE2-LASFDE2 + .long L$set$5 +LASFDE2: + .long LASFDE2-EH_frame1 + .long LFB2-. + .set L$set$6,LFE2-LFB2 + .long L$set$6 + .byte 0x0 + .byte 0x4 + .set L$set$7,LCFI2-LFB2 + .long L$set$7 + .byte 0xe + .byte 0x8 + .byte 0x84 + .byte 0x2 + .byte 0x4 + .set L$set$8,LCFI3-LCFI2 + .long L$set$8 + .byte 0xd + .byte 0x4 + .align 2 +LEFDE2: + +#if !FFI_NO_RAW_API + +.globl _ffi_closure_raw_SYSV.eh +_ffi_closure_raw_SYSV.eh: +LSFDE3: + .set L$set$10,LEFDE3-LASFDE3 + .long L$set$10 +LASFDE3: + .long LASFDE3-EH_frame1 + .long LFB3-. + .set L$set$11,LFE3-LFB3 + .long L$set$11 + .byte 0x0 + .byte 0x4 + .set L$set$12,LCFI4-LFB3 + .long L$set$12 + .byte 0xe + .byte 0x8 + .byte 0x84 + .byte 0x2 + .byte 0x4 + .set L$set$13,LCFI5-LCFI4 + .long L$set$13 + .byte 0xd + .byte 0x4 + .byte 0x4 + .set L$set$14,LCFI6-LCFI5 + .long L$set$14 + .byte 0x85 + .byte 0x3 + .align 2 +LEFDE3: + +#endif + +#endif /* ifndef __x86_64__ */ + +#endif /* defined __i386__ */ diff -r -u ./Modules/_ctypes/libffi_osx/x86/x86-ffi64.c ./Modules/_ctypes/libffi_osx/x86/x86-ffi64.c new file mode 100644 index 0000000..06feaf2 --- /dev/null +++ ./Modules/_ctypes/libffi_osx/x86/x86-ffi64.c @@ -0,0 +1,734 @@ +#ifdef __x86_64__ + +/* ----------------------------------------------------------------------- + x86-ffi64.c - Copyright (c) 2002 Bo Thorsen + + x86-64 Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#include +#include + +#include +#include + +#define MAX_GPR_REGS 6 +#define MAX_SSE_REGS 8 + +typedef struct RegisterArgs { + /* Registers for argument passing. */ + UINT64 gpr[MAX_GPR_REGS]; + __int128_t sse[MAX_SSE_REGS]; +} RegisterArgs; + +extern void +ffi_call_unix64( + void* args, + unsigned long bytes, + unsigned flags, + void* raddr, + void (*fnaddr)(), + unsigned ssecount); + +/* All reference to register classes here is identical to the code in + gcc/config/i386/i386.c. Do *not* change one without the other. */ + +/* Register class used for passing given 64bit part of the argument. + These represent classes as documented by the PS ABI, with the exception + of SSESF, SSEDF classes, that are basically SSE class, just gcc will + use SF or DFmode move instead of DImode to avoid reformating penalties. + + Similary we play games with INTEGERSI_CLASS to use cheaper SImode moves + whenever possible (upper half does contain padding). */ +enum x86_64_reg_class +{ + X86_64_NO_CLASS, + X86_64_INTEGER_CLASS, + X86_64_INTEGERSI_CLASS, + X86_64_SSE_CLASS, + X86_64_SSESF_CLASS, + X86_64_SSEDF_CLASS, + X86_64_SSEUP_CLASS, + X86_64_X87_CLASS, + X86_64_X87UP_CLASS, + X86_64_COMPLEX_X87_CLASS, + X86_64_MEMORY_CLASS +}; + +#define MAX_CLASSES 4 +#define SSE_CLASS_P(X) ((X) >= X86_64_SSE_CLASS && X <= X86_64_SSEUP_CLASS) + +/* x86-64 register passing implementation. See x86-64 ABI for details. Goal + of this code is to classify each 8bytes of incoming argument by the register + class and assign registers accordingly. */ + +/* Return the union class of CLASS1 and CLASS2. + See the x86-64 PS ABI for details. */ +static enum x86_64_reg_class +merge_classes( + enum x86_64_reg_class class1, + enum x86_64_reg_class class2) +{ + /* Rule #1: If both classes are equal, this is the resulting class. */ + if (class1 == class2) + return class1; + + /* Rule #2: If one of the classes is NO_CLASS, the resulting class is + the other class. */ + if (class1 == X86_64_NO_CLASS) + return class2; + + if (class2 == X86_64_NO_CLASS) + return class1; + + /* Rule #3: If one of the classes is MEMORY, the result is MEMORY. */ + if (class1 == X86_64_MEMORY_CLASS || class2 == X86_64_MEMORY_CLASS) + return X86_64_MEMORY_CLASS; + + /* Rule #4: If one of the classes is INTEGER, the result is INTEGER. */ + if ((class1 == X86_64_INTEGERSI_CLASS && class2 == X86_64_SSESF_CLASS) + || (class2 == X86_64_INTEGERSI_CLASS && class1 == X86_64_SSESF_CLASS)) + return X86_64_INTEGERSI_CLASS; + + if (class1 == X86_64_INTEGER_CLASS || class1 == X86_64_INTEGERSI_CLASS + || class2 == X86_64_INTEGER_CLASS || class2 == X86_64_INTEGERSI_CLASS) + return X86_64_INTEGER_CLASS; + + /* Rule #5: If one of the classes is X87, X87UP, or COMPLEX_X87 class, + MEMORY is used. */ + if (class1 == X86_64_X87_CLASS + || class1 == X86_64_X87UP_CLASS + || class1 == X86_64_COMPLEX_X87_CLASS + || class2 == X86_64_X87_CLASS + || class2 == X86_64_X87UP_CLASS + || class2 == X86_64_COMPLEX_X87_CLASS) + return X86_64_MEMORY_CLASS; + + /* Rule #6: Otherwise class SSE is used. */ + return X86_64_SSE_CLASS; +} + +/* Classify the argument of type TYPE and mode MODE. + CLASSES will be filled by the register class used to pass each word + of the operand. The number of words is returned. In case the parameter + should be passed in memory, 0 is returned. As a special case for zero + sized containers, classes[0] will be NO_CLASS and 1 is returned. + + See the x86-64 PS ABI for details. */ + +static int +classify_argument( + ffi_type* type, + enum x86_64_reg_class classes[], + size_t byte_offset) +{ + switch (type->type) + { + case FFI_TYPE_UINT8: + case FFI_TYPE_SINT8: + case FFI_TYPE_UINT16: + case FFI_TYPE_SINT16: + case FFI_TYPE_UINT32: + case FFI_TYPE_SINT32: + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + case FFI_TYPE_POINTER: +#if 0 + if (byte_offset + type->size <= 4) + classes[0] = X86_64_INTEGERSI_CLASS; + else + classes[0] = X86_64_INTEGER_CLASS; + + return 1; +#else + { + int size = byte_offset + type->size; + + if (size <= 4) + { + classes[0] = X86_64_INTEGERSI_CLASS; + return 1; + } + else if (size <= 8) + { + classes[0] = X86_64_INTEGER_CLASS; + return 1; + } + else if (size <= 12) + { + classes[0] = X86_64_INTEGER_CLASS; + classes[1] = X86_64_INTEGERSI_CLASS; + return 2; + } + else if (size <= 16) + { + classes[0] = classes[1] = X86_64_INTEGERSI_CLASS; + return 2; + } + else + FFI_ASSERT (0); + } +#endif + + case FFI_TYPE_FLOAT: + if (byte_offset == 0) + classes[0] = X86_64_SSESF_CLASS; + else + classes[0] = X86_64_SSE_CLASS; + + return 1; + + case FFI_TYPE_DOUBLE: + classes[0] = X86_64_SSEDF_CLASS; + return 1; + + case FFI_TYPE_LONGDOUBLE: + classes[0] = X86_64_X87_CLASS; + classes[1] = X86_64_X87UP_CLASS; + return 2; + + case FFI_TYPE_STRUCT: + { + ffi_type** ptr; + int i; + enum x86_64_reg_class subclasses[MAX_CLASSES]; + const int UNITS_PER_WORD = 8; + int words = + (type->size + UNITS_PER_WORD - 1) / UNITS_PER_WORD; + + /* If the struct is larger than 16 bytes, pass it on the stack. */ + if (type->size > 16) + return 0; + + for (i = 0; i < words; i++) + classes[i] = X86_64_NO_CLASS; + + /* Merge the fields of structure. */ + for (ptr = type->elements; *ptr != NULL; ptr++) + { + byte_offset = ALIGN(byte_offset, (*ptr)->alignment); + + int num = classify_argument(*ptr, subclasses, byte_offset % 8); + + if (num == 0) + return 0; + + int pos = byte_offset / 8; + + for (i = 0; i < num; i++) + { + classes[i + pos] = + merge_classes(subclasses[i], classes[i + pos]); + } + + byte_offset += (*ptr)->size; + } + + if (words > 2) + { + /* When size > 16 bytes, if the first one isn't + X86_64_SSE_CLASS or any other ones aren't + X86_64_SSEUP_CLASS, everything should be passed in + memory. */ + if (classes[0] != X86_64_SSE_CLASS) + return 0; + + for (i = 1; i < words; i++) + if (classes[i] != X86_64_SSEUP_CLASS) + return 0; + } + + + /* Final merger cleanup. */ + for (i = 0; i < words; i++) + { + /* If one class is MEMORY, everything should be passed in + memory. */ + if (classes[i] == X86_64_MEMORY_CLASS) + return 0; + + /* The X86_64_SSEUP_CLASS should be always preceded by + X86_64_SSE_CLASS. */ + if (classes[i] == X86_64_SSEUP_CLASS + && classes[i - 1] != X86_64_SSE_CLASS + && classes[i - 1] != X86_64_SSEUP_CLASS) + { + FFI_ASSERT(i != 0); + classes[i] = X86_64_SSE_CLASS; + } + + /* X86_64_X87UP_CLASS should be preceded by X86_64_X87_CLASS. */ + if (classes[i] == X86_64_X87UP_CLASS + && classes[i - 1] != X86_64_X87_CLASS) + { + FFI_ASSERT(i != 0); + classes[i] = X86_64_SSE_CLASS; + } + } + + return words; + } + + default: + FFI_ASSERT(0); + } + + return 0; /* Never reached. */ +} + +/* Examine the argument and return set number of register required in each + class. Return zero if parameter should be passed in memory, otherwise + the number of registers. */ +static int +examine_argument( + ffi_type* type, + enum x86_64_reg_class classes[MAX_CLASSES], + _Bool in_return, + int* pngpr, + int* pnsse) +{ + int n = classify_argument(type, classes, 0); + int ngpr = 0; + int nsse = 0; + int i; + + if (n == 0) + return 0; + + for (i = 0; i < n; ++i) + { + switch (classes[i]) + { + case X86_64_INTEGER_CLASS: + case X86_64_INTEGERSI_CLASS: + ngpr++; + break; + + case X86_64_SSE_CLASS: + case X86_64_SSESF_CLASS: + case X86_64_SSEDF_CLASS: + nsse++; + break; + + case X86_64_NO_CLASS: + case X86_64_SSEUP_CLASS: + break; + + case X86_64_X87_CLASS: + case X86_64_X87UP_CLASS: + case X86_64_COMPLEX_X87_CLASS: + return in_return != 0; + + default: + abort(); + } + } + + *pngpr = ngpr; + *pnsse = nsse; + + return n; +} + +/* Perform machine dependent cif processing. */ +ffi_status +ffi_prep_cif_machdep( + ffi_cif* cif) +{ + int gprcount = 0; + int ssecount = 0; + int flags = cif->rtype->type; + int i, avn, n, ngpr, nsse; + enum x86_64_reg_class classes[MAX_CLASSES]; + size_t bytes; + + if (flags != FFI_TYPE_VOID) + { + n = examine_argument (cif->rtype, classes, 1, &ngpr, &nsse); + + if (n == 0) + { + /* The return value is passed in memory. A pointer to that + memory is the first argument. Allocate a register for it. */ + gprcount++; + + /* We don't have to do anything in asm for the return. */ + flags = FFI_TYPE_VOID; + } + else if (flags == FFI_TYPE_STRUCT) + { + /* Mark which registers the result appears in. */ + _Bool sse0 = SSE_CLASS_P(classes[0]); + _Bool sse1 = n == 2 && SSE_CLASS_P(classes[1]); + + if (sse0 && !sse1) + flags |= 1 << 8; + else if (!sse0 && sse1) + flags |= 1 << 9; + else if (sse0 && sse1) + flags |= 1 << 10; + + /* Mark the true size of the structure. */ + flags |= cif->rtype->size << 12; + } + } + + /* Go over all arguments and determine the way they should be passed. + If it's in a register and there is space for it, let that be so. If + not, add it's size to the stack byte count. */ + for (bytes = 0, i = 0, avn = cif->nargs; i < avn; i++) + { + if (examine_argument(cif->arg_types[i], classes, 0, &ngpr, &nsse) == 0 + || gprcount + ngpr > MAX_GPR_REGS + || ssecount + nsse > MAX_SSE_REGS) + { + long align = cif->arg_types[i]->alignment; + + if (align < 8) + align = 8; + + bytes = ALIGN(bytes, align); + bytes += cif->arg_types[i]->size; + } + else + { + gprcount += ngpr; + ssecount += nsse; + } + } + + if (ssecount) + flags |= 1 << 11; + + cif->flags = flags; + cif->bytes = bytes; + cif->bytes = ALIGN(bytes,8); + + return FFI_OK; +} + +void +ffi_call( + ffi_cif* cif, + void (*fn)(), + void* rvalue, + void** avalue) +{ + enum x86_64_reg_class classes[MAX_CLASSES]; + char* stack; + char* argp; + ffi_type** arg_types; + int gprcount, ssecount, ngpr, nsse, i, avn; + _Bool ret_in_memory; + RegisterArgs* reg_args; + + /* Can't call 32-bit mode from 64-bit mode. */ + FFI_ASSERT(cif->abi == FFI_UNIX64); + + /* If the return value is a struct and we don't have a return value + address then we need to make one. Note the setting of flags to + VOID above in ffi_prep_cif_machdep. */ + ret_in_memory = (cif->rtype->type == FFI_TYPE_STRUCT + && (cif->flags & 0xff) == FFI_TYPE_VOID); + + if (rvalue == NULL && ret_in_memory) + rvalue = alloca (cif->rtype->size); + + /* Allocate the space for the arguments, plus 4 words of temp space. */ + stack = alloca(sizeof(RegisterArgs) + cif->bytes + 4 * 8); + reg_args = (RegisterArgs*)stack; + argp = stack + sizeof(RegisterArgs); + + gprcount = ssecount = 0; + + /* If the return value is passed in memory, add the pointer as the + first integer argument. */ + if (ret_in_memory) + reg_args->gpr[gprcount++] = (long) rvalue; + + avn = cif->nargs; + arg_types = cif->arg_types; + + for (i = 0; i < avn; ++i) + { + size_t size = arg_types[i]->size; + int n; + + n = examine_argument (arg_types[i], classes, 0, &ngpr, &nsse); + + if (n == 0 + || gprcount + ngpr > MAX_GPR_REGS + || ssecount + nsse > MAX_SSE_REGS) + { + long align = arg_types[i]->alignment; + + /* Stack arguments are *always* at least 8 byte aligned. */ + if (align < 8) + align = 8; + + /* Pass this argument in memory. */ + argp = (void *) ALIGN (argp, align); + memcpy (argp, avalue[i], size); + argp += size; + } + else + { /* The argument is passed entirely in registers. */ + char *a = (char *) avalue[i]; + int j; + + for (j = 0; j < n; j++, a += 8, size -= 8) + { + switch (classes[j]) + { + case X86_64_INTEGER_CLASS: + case X86_64_INTEGERSI_CLASS: + reg_args->gpr[gprcount] = 0; + switch (arg_types[i]->type) { + case FFI_TYPE_SINT8: + { + int8_t shortval = *(int8_t*)a; + int64_t actval = (int64_t)shortval; + reg_args->gpr[gprcount] = actval; + /*memcpy (®_args->gpr[gprcount], &actval, 8);*/ + break; + } + + case FFI_TYPE_SINT16: + { + int16_t shortval = *(int16_t*)a; + int64_t actval = (int64_t)shortval; + memcpy (®_args->gpr[gprcount], &actval, 8); + break; + } + + case FFI_TYPE_SINT32: + { + int32_t shortval = *(int32_t*)a; + int64_t actval = (int64_t)shortval; + memcpy (®_args->gpr[gprcount], &actval, 8); + break; + } + + case FFI_TYPE_UINT8: + { + u_int8_t shortval = *(u_int8_t*)a; + u_int64_t actval = (u_int64_t)shortval; + /*memcpy (®_args->gpr[gprcount], &actval, 8);*/ + reg_args->gpr[gprcount] = actval; + break; + } + + case FFI_TYPE_UINT16: + { + u_int16_t shortval = *(u_int16_t*)a; + u_int64_t actval = (u_int64_t)shortval; + memcpy (®_args->gpr[gprcount], &actval, 8); + break; + } + + case FFI_TYPE_UINT32: + { + u_int32_t shortval = *(u_int32_t*)a; + u_int64_t actval = (u_int64_t)shortval; + memcpy (®_args->gpr[gprcount], &actval, 8); + break; + } + + default: + //memcpy (®_args->gpr[gprcount], a, size < 8 ? size : 8); + reg_args->gpr[gprcount] = *(int64_t*)a; + } + gprcount++; + break; + + case X86_64_SSE_CLASS: + case X86_64_SSEDF_CLASS: + reg_args->sse[ssecount++] = *(UINT64 *) a; + break; + + case X86_64_SSESF_CLASS: + reg_args->sse[ssecount++] = *(UINT32 *) a; + break; + + default: + abort(); + } + } + } + } + + ffi_call_unix64 (stack, cif->bytes + sizeof(RegisterArgs), + cif->flags, rvalue, fn, ssecount); +} + +extern void ffi_closure_unix64(void); + +ffi_status +ffi_prep_closure( + ffi_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif*, void*, void**, void*), + void* user_data) +{ + if (cif->abi != FFI_UNIX64) + return FFI_BAD_ABI; + + volatile unsigned short* tramp = + (volatile unsigned short*)&closure->tramp[0]; + + tramp[0] = 0xbb49; /* mov , %r11 */ + *(void* volatile*)&tramp[1] = ffi_closure_unix64; + tramp[5] = 0xba49; /* mov , %r10 */ + *(void* volatile*)&tramp[6] = closure; + + /* Set the carry bit if the function uses any sse registers. + This is clc or stc, together with the first byte of the jmp. */ + tramp[10] = cif->flags & (1 << 11) ? 0x49f9 : 0x49f8; + tramp[11] = 0xe3ff; /* jmp *%r11 */ + + closure->cif = cif; + closure->fun = fun; + closure->user_data = user_data; + + return FFI_OK; +} + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wmissing-prototypes" +int +ffi_closure_unix64_inner( + ffi_closure* closure, + void* rvalue, + RegisterArgs* reg_args, + char* argp) +#pragma clang diagnostic pop +{ + ffi_cif* cif = closure->cif; + void** avalue = alloca(cif->nargs * sizeof(void *)); + ffi_type** arg_types; + long i, avn; + int gprcount = 0; + int ssecount = 0; + int ngpr, nsse; + int ret; + + ret = cif->rtype->type; + + if (ret != FFI_TYPE_VOID) + { + enum x86_64_reg_class classes[MAX_CLASSES]; + int n = examine_argument (cif->rtype, classes, 1, &ngpr, &nsse); + + if (n == 0) + { + /* The return value goes in memory. Arrange for the closure + return value to go directly back to the original caller. */ + rvalue = (void *) reg_args->gpr[gprcount++]; + + /* We don't have to do anything in asm for the return. */ + ret = FFI_TYPE_VOID; + } + else if (ret == FFI_TYPE_STRUCT && n == 2) + { + /* Mark which register the second word of the structure goes in. */ + _Bool sse0 = SSE_CLASS_P (classes[0]); + _Bool sse1 = SSE_CLASS_P (classes[1]); + + if (!sse0 && sse1) + ret |= 1 << 8; + else if (sse0 && !sse1) + ret |= 1 << 9; + } + } + + avn = cif->nargs; + arg_types = cif->arg_types; + + for (i = 0; i < avn; ++i) + { + enum x86_64_reg_class classes[MAX_CLASSES]; + int n; + + n = examine_argument (arg_types[i], classes, 0, &ngpr, &nsse); + + if (n == 0 + || gprcount + ngpr > MAX_GPR_REGS + || ssecount + nsse > MAX_SSE_REGS) + { + long align = arg_types[i]->alignment; + + /* Stack arguments are *always* at least 8 byte aligned. */ + if (align < 8) + align = 8; + + /* Pass this argument in memory. */ + argp = (void *) ALIGN (argp, align); + avalue[i] = argp; + argp += arg_types[i]->size; + } + +#if !defined(X86_DARWIN) + /* If the argument is in a single register, or two consecutive + registers, then we can use that address directly. */ + else if (n == 1 || (n == 2 && + SSE_CLASS_P (classes[0]) == SSE_CLASS_P (classes[1]))) + { + // The argument is in a single register. + if (SSE_CLASS_P (classes[0])) + { + avalue[i] = ®_args->sse[ssecount]; + ssecount += n; + } + else + { + avalue[i] = ®_args->gpr[gprcount]; + gprcount += n; + } + } +#endif + + /* Otherwise, allocate space to make them consecutive. */ + else + { + char *a = alloca (16); + int j; + + avalue[i] = a; + + for (j = 0; j < n; j++, a += 8) + { + if (SSE_CLASS_P (classes[j])) + memcpy (a, ®_args->sse[ssecount++], 8); + else + memcpy (a, ®_args->gpr[gprcount++], 8); + } + } + } + + /* Invoke the closure. */ + closure->fun (cif, rvalue, avalue, closure->user_data); + + /* Tell assembly how to perform return type promotions. */ + return ret; +} + +#endif /* __x86_64__ */ diff -r -u ./Modules/_ctypes/libffi_osx/x86/x86-ffi_darwin.c ./Modules/_ctypes/libffi_osx/x86/x86-ffi_darwin.c new file mode 100644 index 0000000..706ea0f --- /dev/null +++ ./Modules/_ctypes/libffi_osx/x86/x86-ffi_darwin.c @@ -0,0 +1,438 @@ +#ifdef __i386__ +/* ----------------------------------------------------------------------- + ffi.c - Copyright (c) 1996, 1998, 1999, 2001 Red Hat, Inc. + Copyright (c) 2002 Ranjit Mathew + Copyright (c) 2002 Bo Thorsen + Copyright (c) 2002 Roger Sayle + + x86 Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#include +#include + +#include + +/* ffi_prep_args is called by the assembly routine once stack space + has been allocated for the function's arguments */ + +void ffi_prep_args(char *stack, extended_cif *ecif); + +void ffi_prep_args(char *stack, extended_cif *ecif) +{ + register unsigned int i; + register void **p_argv; + register char *argp; + register ffi_type **p_arg; + + argp = stack; + + if (ecif->cif->flags == FFI_TYPE_STRUCT) + { + *(void **) argp = ecif->rvalue; + argp += 4; + } + + p_argv = ecif->avalue; + + for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; + i != 0; + i--, p_arg++) + { + size_t z; + + /* Align if necessary */ + if ((sizeof(int) - 1) & (unsigned) argp) + argp = (char *) ALIGN(argp, sizeof(int)); + + z = (*p_arg)->size; + if (z < sizeof(int)) + { + z = sizeof(int); + switch ((*p_arg)->type) + { + case FFI_TYPE_SINT8: + *(signed int *) argp = (signed int)*(SINT8 *)(* p_argv); + break; + + case FFI_TYPE_UINT8: + *(unsigned int *) argp = (unsigned int)*(UINT8 *)(* p_argv); + break; + + case FFI_TYPE_SINT16: + *(signed int *) argp = (signed int)*(SINT16 *)(* p_argv); + break; + + case FFI_TYPE_UINT16: + *(unsigned int *) argp = (unsigned int)*(UINT16 *)(* p_argv); + break; + + case FFI_TYPE_SINT32: + *(signed int *) argp = (signed int)*(SINT32 *)(* p_argv); + break; + + case FFI_TYPE_UINT32: + *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv); + break; + + case FFI_TYPE_STRUCT: + *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv); + break; + + default: + FFI_ASSERT(0); + } + } + else + { + memcpy(argp, *p_argv, z); + } + p_argv++; + argp += z; + } + + return; +} + +/* Perform machine dependent cif processing */ +ffi_status ffi_prep_cif_machdep(ffi_cif *cif) +{ + /* Set the return type flag */ + switch (cif->rtype->type) + { + case FFI_TYPE_VOID: +#ifdef X86 + case FFI_TYPE_STRUCT: + case FFI_TYPE_UINT8: + case FFI_TYPE_UINT16: + case FFI_TYPE_SINT8: + case FFI_TYPE_SINT16: +#endif + + case FFI_TYPE_SINT64: + case FFI_TYPE_FLOAT: + case FFI_TYPE_DOUBLE: + case FFI_TYPE_LONGDOUBLE: + cif->flags = (unsigned) cif->rtype->type; + break; + + case FFI_TYPE_UINT64: + cif->flags = FFI_TYPE_SINT64; + break; + +#ifndef X86 + case FFI_TYPE_STRUCT: + if (cif->rtype->size == 1) + { + cif->flags = FFI_TYPE_SINT8; /* same as char size */ + } + else if (cif->rtype->size == 2) + { + cif->flags = FFI_TYPE_SINT16; /* same as short size */ + } + else if (cif->rtype->size == 4) + { + cif->flags = FFI_TYPE_INT; /* same as int type */ + } + else if (cif->rtype->size == 8) + { + cif->flags = FFI_TYPE_SINT64; /* same as int64 type */ + } + else + { + cif->flags = FFI_TYPE_STRUCT; + } + break; +#endif + + default: + cif->flags = FFI_TYPE_INT; + break; + } + +#ifdef X86_DARWIN + cif->bytes = (cif->bytes + 15) & ~0xF; +#endif + + return FFI_OK; +} + +extern void ffi_call_SYSV(void (*)(char *, extended_cif *), extended_cif *, + unsigned, unsigned, unsigned *, void (*fn)()); + +#ifdef X86_WIN32 +extern void ffi_call_STDCALL(void (*)(char *, extended_cif *), extended_cif *, + unsigned, unsigned, unsigned *, void (*fn)()); + +#endif /* X86_WIN32 */ + +void ffi_call(ffi_cif *cif, void (*fn)(), void *rvalue, void **avalue) +{ + extended_cif ecif; + + ecif.cif = cif; + ecif.avalue = avalue; + + /* If the return value is a struct and we don't have a return */ + /* value address then we need to make one */ + + if ((rvalue == NULL) && + (cif->flags == FFI_TYPE_STRUCT)) + { + ecif.rvalue = alloca(cif->rtype->size); + } + else + ecif.rvalue = rvalue; + + + switch (cif->abi) + { + case FFI_SYSV: + ffi_call_SYSV(ffi_prep_args, &ecif, cif->bytes, cif->flags, ecif.rvalue, + fn); + break; +#ifdef X86_WIN32 + case FFI_STDCALL: + ffi_call_STDCALL(ffi_prep_args, &ecif, cif->bytes, cif->flags, + ecif.rvalue, fn); + break; +#endif /* X86_WIN32 */ + default: + FFI_ASSERT(0); + break; + } +} + + +/** private members **/ + +static void ffi_prep_incoming_args_SYSV (char *stack, void **ret, + void** args, ffi_cif* cif); +void FFI_HIDDEN ffi_closure_SYSV (ffi_closure *) +__attribute__ ((regparm(1))); +unsigned int FFI_HIDDEN ffi_closure_SYSV_inner (ffi_closure *, void **, void *) +__attribute__ ((regparm(1))); +void FFI_HIDDEN ffi_closure_raw_SYSV (ffi_raw_closure *) +__attribute__ ((regparm(1))); + +/* This function is jumped to by the trampoline */ + +unsigned int FFI_HIDDEN +ffi_closure_SYSV_inner (closure, respp, args) +ffi_closure *closure; +void **respp; +void *args; +{ + // our various things... + ffi_cif *cif; + void **arg_area; + + cif = closure->cif; + arg_area = (void**) alloca (cif->nargs * sizeof (void*)); + + /* this call will initialize ARG_AREA, such that each + * element in that array points to the corresponding + * value on the stack; and if the function returns + * a structure, it will re-set RESP to point to the + * structure return address. */ + + ffi_prep_incoming_args_SYSV(args, respp, arg_area, cif); + + (closure->fun) (cif, *respp, arg_area, closure->user_data); + + return cif->flags; +} + +static void +ffi_prep_incoming_args_SYSV(char *stack, void **rvalue, void **avalue, + ffi_cif *cif) +{ + register unsigned int i; + register void **p_argv; + register char *argp; + register ffi_type **p_arg; + + argp = stack; + + if ( cif->flags == FFI_TYPE_STRUCT ) { + *rvalue = *(void **) argp; + argp += 4; + } + + p_argv = avalue; + + for (i = cif->nargs, p_arg = cif->arg_types; (i != 0); i--, p_arg++) + { + size_t z; + + /* Align if necessary */ + if ((sizeof(int) - 1) & (unsigned) argp) { + argp = (char *) ALIGN(argp, sizeof(int)); + } + + z = (*p_arg)->size; + + /* because we're little endian, this is what it turns into. */ + + *p_argv = (void*) argp; + + p_argv++; + argp += z; + } + + return; +} + +/* How to make a trampoline. Derived from gcc/config/i386/i386.c. */ + +#define FFI_INIT_TRAMPOLINE(TRAMP,FUN,CTX) \ +({ unsigned char *__tramp = (unsigned char*)(TRAMP); \ +unsigned int __fun = (unsigned int)(FUN); \ +unsigned int __ctx = (unsigned int)(CTX); \ +unsigned int __dis = __fun - (__ctx + FFI_TRAMPOLINE_SIZE); \ +*(unsigned char*) &__tramp[0] = 0xb8; \ +*(unsigned int*) &__tramp[1] = __ctx; /* movl __ctx, %eax */ \ +*(unsigned char *) &__tramp[5] = 0xe9; \ +*(unsigned int*) &__tramp[6] = __dis; /* jmp __fun */ \ +}) + + +/* the cif must already be prep'ed */ +ffi_status +ffi_prep_closure (ffi_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif*,void*,void**,void*), + void *user_data) +{ + if (cif->abi != FFI_SYSV) + return FFI_BAD_ABI; + + FFI_INIT_TRAMPOLINE (&closure->tramp[0], \ + &ffi_closure_SYSV, \ + (void*)closure); + + closure->cif = cif; + closure->user_data = user_data; + closure->fun = fun; + + return FFI_OK; +} + +/* ------- Native raw API support -------------------------------- */ + +#if !FFI_NO_RAW_API + +ffi_status +ffi_prep_raw_closure_loc (ffi_raw_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif*,void*,ffi_raw*,void*), + void *user_data, + void *codeloc) +{ + int i; + + FFI_ASSERT (cif->abi == FFI_SYSV); + + // we currently don't support certain kinds of arguments for raw + // closures. This should be implemented by a separate assembly language + // routine, since it would require argument processing, something we + // don't do now for performance. + + for (i = cif->nargs-1; i >= 0; i--) + { + FFI_ASSERT (cif->arg_types[i]->type != FFI_TYPE_STRUCT); + FFI_ASSERT (cif->arg_types[i]->type != FFI_TYPE_LONGDOUBLE); + } + + + FFI_INIT_TRAMPOLINE (&closure->tramp[0], &ffi_closure_raw_SYSV, + codeloc); + + closure->cif = cif; + closure->user_data = user_data; + closure->fun = fun; + + return FFI_OK; +} + +static void +ffi_prep_args_raw(char *stack, extended_cif *ecif) +{ + memcpy (stack, ecif->avalue, ecif->cif->bytes); +} + +/* we borrow this routine from libffi (it must be changed, though, to + * actually call the function passed in the first argument. as of + * libffi-1.20, this is not the case.) + */ + +extern void +ffi_call_SYSV(void (*)(char *, extended_cif *), extended_cif *, unsigned, + unsigned, unsigned *, void (*fn)()); + +#ifdef X86_WIN32 +extern void +ffi_call_STDCALL(void (*)(char *, extended_cif *), extended_cif *, unsigned, + unsigned, unsigned *, void (*fn)()); +#endif /* X86_WIN32 */ + +void +ffi_raw_call(ffi_cif *cif, void (*fn)(), void *rvalue, ffi_raw *fake_avalue) +{ + extended_cif ecif; + void **avalue = (void **)fake_avalue; + + ecif.cif = cif; + ecif.avalue = avalue; + + /* If the return value is a struct and we don't have a return */ + /* value address then we need to make one */ + + if ((rvalue == NULL) && + (cif->rtype->type == FFI_TYPE_STRUCT)) + { + ecif.rvalue = alloca(cif->rtype->size); + } + else + ecif.rvalue = rvalue; + + + switch (cif->abi) + { + case FFI_SYSV: + ffi_call_SYSV(ffi_prep_args_raw, &ecif, cif->bytes, cif->flags, + ecif.rvalue, fn); + break; +#ifdef X86_WIN32 + case FFI_STDCALL: + ffi_call_STDCALL(ffi_prep_args_raw, &ecif, cif->bytes, cif->flags, + ecif.rvalue, fn); + break; +#endif /* X86_WIN32 */ + default: + FFI_ASSERT(0); + break; + } +} + +#endif +#endif // __i386__ diff -r -u ./setup.py ./setup.py index 46b92fe..2bf6b4b 100644 --- ./setup.py +++ ./setup.py @@ -98,8 +98,14 @@ class PyBuildExt(build_ext): self.detect_modules() # Remove modules that are present on the disabled list - self.extensions = [ext for ext in self.extensions - if ext.name not in disabled_module_list] + extensions = [ext for ext in self.extensions + if ext.name not in disabled_module_list] + # move ctypes to the end, it depends on other modules + ext_map = dict((ext.name, i) for i, ext in enumerate(extensions)) + if "_ctypes" in ext_map: + ctypes = extensions.pop(ext_map["_ctypes"]) + extensions.append(ctypes) + self.extensions = extensions # Fix up the autodetected modules, prefixing all the source files # with Modules/ and adding Python's include directory to the path. @@ -1330,9 +1336,39 @@ class PyBuildExt(build_ext): # *** Uncomment these for TOGL extension only: # -lGL -lGLU -lXext -lXmu \ + def configure_ctypes_darwin(self, ext): + # Darwin (OS X) uses preconfigured files, in + # the Modules/_ctypes/libffi_osx directory. + srcdir = sysconfig.get_config_var('srcdir') + ffi_srcdir = os.path.abspath(os.path.join(srcdir, 'Modules', + '_ctypes', 'libffi_osx')) + sources = [os.path.join(ffi_srcdir, p) + for p in ['ffi.c', + 'x86/darwin64.S', + 'x86/x86-darwin.S', + 'x86/x86-ffi_darwin.c', + 'x86/x86-ffi64.c', + 'powerpc/ppc-darwin.S', + 'powerpc/ppc-darwin_closure.S', + 'powerpc/ppc-ffi_darwin.c', + 'powerpc/ppc64-darwin_closure.S', + ]] + + # Add .S (preprocessed assembly) to C compiler source extensions. + self.compiler.src_extensions.append('.S') + + include_dirs = [os.path.join(ffi_srcdir, 'include'), + os.path.join(ffi_srcdir, 'powerpc')] + ext.include_dirs.extend(include_dirs) + ext.sources.extend(sources) + return True + def configure_ctypes(self, ext): if not self.use_system_libffi: - (srcdir,) = sysconfig.get_config_vars('srcdir') + if sys.platform == 'darwin': + return self.configure_ctypes_darwin(ext) + + srcdir = sysconfig.get_config_var('srcdir') ffi_builddir = os.path.join(self.build_temp, 'libffi') ffi_srcdir = os.path.abspath(os.path.join(srcdir, 'Modules', '_ctypes', 'libffi')) @@ -1347,7 +1383,10 @@ class PyBuildExt(build_ext): ffi_configfile): from distutils.dir_util import mkpath mkpath(ffi_builddir) - config_args = [] + config_args = [arg for arg in sysconfig.get_config_var("CONFIG_ARGS").split() + if (('--host=' in arg) or ('--build=' in arg))] + if not self.verbose: + config_args.append("-q") # Pass empty CFLAGS because we'll just append the resulting # CFLAGS to Python's; -g or -O2 is to be avoided. @@ -1367,10 +1406,12 @@ class PyBuildExt(build_ext): self.compiler.src_extensions.append('.S') include_dirs = [os.path.join(ffi_builddir, 'include'), - ffi_builddir, ffi_srcdir] + ffi_builddir, + os.path.join(ffi_srcdir, 'src')] extra_compile_args = fficonfig['ffi_cflags'].split() - ext.sources.extend(fficonfig['ffi_sources']) + ext.sources.extend(os.path.join(ffi_srcdir, f) for f in + fficonfig['ffi_sources']) ext.include_dirs.extend(include_dirs) ext.extra_compile_args.extend(extra_compile_args) return True @@ -1390,6 +1431,7 @@ class PyBuildExt(build_ext): if sys.platform == 'darwin': sources.append('_ctypes/darwin/dlfcn_simple.c') + extra_compile_args.append('-DMACOSX') include_dirs.append('_ctypes/darwin') # XXX Is this still needed? ## extra_link_args.extend(['-read_only_relocs', 'warning']) @@ -1419,7 +1461,14 @@ class PyBuildExt(build_ext): if not '--with-system-ffi' in sysconfig.get_config_var("CONFIG_ARGS"): return - ffi_inc = find_file('ffi.h', [], inc_dirs) + if sys.platform == 'darwin': + # OS X 10.5 comes with libffi.dylib; the include files are + # in /usr/include/ffi + inc_dirs.append('/usr/include/ffi') + + ffi_inc = [sysconfig.get_config_var("LIBFFI_INCLUDEDIR")] + if not ffi_inc or ffi_inc[0] == '': + ffi_inc = find_file('ffi.h', [], inc_dirs) if ffi_inc is not None: ffi_h = ffi_inc[0] + '/ffi.h' fp = open(ffi_h) 005_osx_failed_modules.patch000066400000000000000000000076331517431316200353360ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.5.2/Python-2.5.2diff -r -u ./Mac/Modules/cg/_CGmodule.c ./Mac/Modules/cg/_CGmodule.c index 8115614..e36fce9 100755 --- ./Mac/Modules/cg/_CGmodule.c +++ ./Mac/Modules/cg/_CGmodule.c @@ -1025,6 +1025,7 @@ static PyObject *CGContextRefObj_CGContextSetShouldAntialias(CGContextRefObject return _res; } +#ifndef __LP64__ static PyObject *CGContextRefObj_SyncCGContextOriginWithPort(CGContextRefObject *_self, PyObject *_args) { PyObject *_res = NULL; @@ -1055,6 +1056,7 @@ static PyObject *CGContextRefObj_ClipCGContextToRegion(CGContextRefObject *_self _res = Py_None; return _res; } +#endif static PyMethodDef CGContextRefObj_methods[] = { {"CGContextSaveGState", (PyCFunction)CGContextRefObj_CGContextSaveGState, 1, @@ -1173,10 +1175,12 @@ static PyMethodDef CGContextRefObj_methods[] = { PyDoc_STR("() -> None")}, {"CGContextSetShouldAntialias", (PyCFunction)CGContextRefObj_CGContextSetShouldAntialias, 1, PyDoc_STR("(int shouldAntialias) -> None")}, +#ifndef __LP64__ {"SyncCGContextOriginWithPort", (PyCFunction)CGContextRefObj_SyncCGContextOriginWithPort, 1, PyDoc_STR("(CGrafPtr port) -> None")}, {"ClipCGContextToRegion", (PyCFunction)CGContextRefObj_ClipCGContextToRegion, 1, PyDoc_STR("(Rect portRect, RgnHandle region) -> None")}, +#endif {NULL, NULL, 0} }; @@ -1254,6 +1258,7 @@ PyTypeObject CGContextRef_Type = { /* ------------------ End object type CGContextRef ------------------ */ +#ifndef __LP64__ static PyObject *CG_CreateCGContextForPort(PyObject *_self, PyObject *_args) { PyObject *_res = NULL; @@ -1271,10 +1276,13 @@ static PyObject *CG_CreateCGContextForPort(PyObject *_self, PyObject *_args) return _res; } +#endif static PyMethodDef CG_methods[] = { +#ifndef __LP64__ {"CreateCGContextForPort", (PyCFunction)CG_CreateCGContextForPort, 1, PyDoc_STR("(CGrafPtr) -> CGContextRef")}, +#endif {NULL, NULL, 0} }; diff -r -u ./Modules/_curses_panel.c ./Modules/_curses_panel.c index 0acf3fd..1728b59 100644 --- ./Modules/_curses_panel.c +++ ./Modules/_curses_panel.c @@ -56,7 +56,7 @@ typedef struct { PyTypeObject PyCursesPanel_Type; -#define PyCursesPanel_Check(v) ((v)->ob_type == &PyCursesPanel_Type) +#define PyCursesPanel_Check(v) (Py_TYPE(v) == &PyCursesPanel_Type) /* Some helper functions. The problem is that there's always a window associated with a panel. To ensure that Python's GC doesn't pull @@ -178,12 +178,13 @@ PyCursesPanel_New(PANEL *pan, PyCursesWindowObject *wo) po = PyObject_NEW(PyCursesPanelObject, &PyCursesPanel_Type); if (po == NULL) return NULL; po->pan = pan; - po->wo = wo; - Py_INCREF(wo); if (insert_lop(po) < 0) { - PyObject_DEL(po); - return NULL; + po->wo = NULL; + Py_DECREF(po); + return NULL; } + po->wo = wo; + Py_INCREF(wo); return (PyObject *)po; } @@ -191,8 +192,10 @@ static void PyCursesPanel_Dealloc(PyCursesPanelObject *po) { (void)del_panel(po->pan); - Py_DECREF(po->wo); - remove_lop(po); + if (po->wo != NULL) { + Py_DECREF(po->wo); + remove_lop(po); + } PyObject_DEL(po); } @@ -338,11 +341,10 @@ PyCursesPanel_GetAttr(PyCursesPanelObject *self, char *name) /* -------------------------------------------------------*/ PyTypeObject PyCursesPanel_Type = { - PyObject_HEAD_INIT(NULL) - 0, /*ob_size*/ - "_curses_panel.curses panel", /*tp_name*/ - sizeof(PyCursesPanelObject), /*tp_basicsize*/ - 0, /*tp_itemsize*/ + PyVarObject_HEAD_INIT(NULL, 0) + "_curses_panel.curses panel", /*tp_name*/ + sizeof(PyCursesPanelObject), /*tp_basicsize*/ + 0, /*tp_itemsize*/ /* methods */ (destructor)PyCursesPanel_Dealloc, /*tp_dealloc*/ 0, /*tp_print*/ @@ -458,7 +460,7 @@ init_curses_panel(void) PyObject *m, *d, *v; /* Initialize object type */ - PyCursesPanel_Type.ob_type = &PyType_Type; + Py_TYPE(&PyCursesPanel_Type) = &PyType_Type; import_curses(); pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.5.3/000077500000000000000000000000001517431316200262105ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.5.3/Python-2.5.3/000077500000000000000000000000001517431316200301345ustar00rootroot00000000000000000_patch-setup.py.diff000066400000000000000000000035211517431316200341530ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.5.3/Python-2.5.3--- setup.py.orig 2011-07-07 19:19:43.800122463 +0900 +++ setup.py 2011-07-07 19:25:04.548416377 +0900 @@ -13,6 +13,7 @@ from distutils.command.build_ext import build_ext from distutils.command.install import install from distutils.command.install_lib import install_lib +from distutils.spawn import find_executable # This global variable is used to hold the list of modules to be disabled. disabled_module_list = [] @@ -242,10 +243,34 @@ return platform return sys.platform + def add_multiarch_paths(self): + # Debian/Ubuntu multiarch support. + # https://wiki.ubuntu.com/MultiarchSpec + if not find_executable('dpkg-architecture'): + return + tmpfile = os.path.join(self.build_temp, 'multiarch') + if not os.path.exists(self.build_temp): + os.makedirs(self.build_temp) + ret = os.system( + 'dpkg-architecture -qDEB_HOST_MULTIARCH > %s 2> /dev/null' % + tmpfile) + try: + if ret >> 8 == 0: + fp = open(tmpfile) + multiarch_path_component = fp.readline().strip() + fp.close() + add_dir_to_list(self.compiler.library_dirs, + '/usr/lib/' + multiarch_path_component) + add_dir_to_list(self.compiler.include_dirs, + '/usr/include/' + multiarch_path_component) + finally: + os.unlink(tmpfile) + def detect_modules(self): # Ensure that /usr/local is always used add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib') add_dir_to_list(self.compiler.include_dirs, '/usr/local/include') + self.add_multiarch_paths() # Add paths specified in the environment variables LDFLAGS and # CPPFLAGS for header and library files. 001_patch-svnversion.patch000066400000000000000000000023661517431316200347760ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.5.3/Python-2.5.3--- configure.in +++ configure.in @@ -767,7 +767,7 @@ then SVNVERSION="svnversion \$(srcdir)" else - SVNVERSION="echo exported" + SVNVERSION="echo Unversioned directory" fi case $MACHDEP in --- Makefile.pre.in +++ Makefile.pre.in @@ -501,7 +501,7 @@ $(SIGNAL_OBJS) \ $(MODOBJS) \ $(srcdir)/Modules/getbuildinfo.c - $(CC) -c $(PY_CFLAGS) -DSVNVERSION=\"`LC_ALL=C $(SVNVERSION)`\" -o $@ $(srcdir)/Modules/getbuildinfo.c + $(CC) -c $(PY_CFLAGS) -DSVNVERSION="\"`LC_ALL=C $(SVNVERSION)`\"" -o $@ $(srcdir)/Modules/getbuildinfo.c Modules/getpath.o: $(srcdir)/Modules/getpath.c Makefile $(CC) -c $(PY_CFLAGS) -DPYTHONPATH='"$(PYTHONPATH)"' \ --- Modules/getbuildinfo.c +++ Modules/getbuildinfo.c @@ -48,5 +48,5 @@ static const char svnversion[] = SVNVERSION; if (svnversion[0] != '$') return svnversion; /* it was interpolated, or passed on command line */ - return "exported"; + return "Unversioned directory"; } --- Python/sysmodule.c +++ Python/sysmodule.c @@ -1161,7 +1161,7 @@ svnversion = _Py_svnversion(); - if (strcmp(svnversion, "exported") != 0) + if (strcmp(svnversion, "Unversioned directory") != 0 && strcmp(svnversion, "exported") != 0) svn_revision = svnversion; else if (istag) { len = strlen(_patchlevel_revision); 002_darwin_c_source.patch000066400000000000000000000132671517431316200346360ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.5.3/Python-2.5.3diff -r -u ./configure ../Python-2.5/configure --- ./configure 2006-09-05 11:54:42.000000000 +0900 +++ ../Python-2.5/configure 2013-07-19 15:27:46.000000000 +0900 @@ -1396,6 +1396,16 @@ _ACEOF +# The later defininition of _XOPEN_SOURCE and _POSIX_C_SOURCE disables +# certain features on Mac OS X, so we need _DARWIN_C_SOURCE to re-enable +# them. + +cat >>confdefs.h <<\_ACEOF +#define _DARWIN_C_SOURCE 1 +_ACEOF + + + define_xopen_source=yes # Arguments passed to configure. @@ -3885,11 +3895,110 @@ ;; # is there any other compiler on Darwin besides gcc? Darwin*) - BASECFLAGS="$BASECFLAGS -Wno-long-double -no-cpp-precomp -mno-fused-madd" + # -Wno-long-double, -no-cpp-precomp, and -mno-fused-madd + # used to be here, but non-Apple gcc doesn't accept them. + if test "${CC}" = gcc + then + { echo "$as_me:${as_lineno-$LINENO}: checking which compiler should be used" >&5 +echo -n "checking which compiler should be used... " >&6; } + case "${UNIVERSALSDK}" in + */MacOSX10.4u.sdk) + # Build using 10.4 SDK, force usage of gcc when the + # compiler is gcc, otherwise the user will get very + # confusing error messages when building on OSX 10.6 + CC=gcc-4.0 + CPP=cpp-4.0 + ;; + esac + { echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +echo "$CC" >&6; } + fi + + if test "${enable_universalsdk}"; then - BASECFLAGS="-arch ppc -arch i386 -isysroot ${UNIVERSALSDK} ${BASECFLAGS}" + UNIVERSAL_ARCH_FLAGS="" + if test "$UNIVERSAL_ARCHS" = "32-bit" ; then + UNIVERSAL_ARCH_FLAGS="-arch ppc -arch i386" + ARCH_RUN_32BIT="" + LIPO_32BIT_FLAGS="" + elif test "$UNIVERSAL_ARCHS" = "64-bit" ; then + UNIVERSAL_ARCH_FLAGS="-arch ppc64 -arch x86_64" + LIPO_32BIT_FLAGS="" + ARCH_RUN_32BIT="true" + + elif test "$UNIVERSAL_ARCHS" = "all" ; then + UNIVERSAL_ARCH_FLAGS="-arch i386 -arch ppc -arch ppc64 -arch x86_64" + LIPO_32BIT_FLAGS="-extract ppc7400 -extract i386" + ARCH_RUN_32BIT="/usr/bin/arch -i386 -ppc" + + elif test "$UNIVERSAL_ARCHS" = "intel" ; then + UNIVERSAL_ARCH_FLAGS="-arch i386 -arch x86_64" + LIPO_32BIT_FLAGS="-extract i386" + ARCH_RUN_32BIT="/usr/bin/arch -i386" + + elif test "$UNIVERSAL_ARCHS" = "3-way" ; then + UNIVERSAL_ARCH_FLAGS="-arch i386 -arch ppc -arch x86_64" + LIPO_32BIT_FLAGS="-extract ppc7400 -extract i386" + ARCH_RUN_32BIT="/usr/bin/arch -i386 -ppc" + + else + as_fn_error $? "proper usage is --with-universal-arch=32-bit|64-bit|all|intel|3-way" "$LINENO" 5 + + fi + + + CFLAGS="${UNIVERSAL_ARCH_FLAGS} -isysroot ${UNIVERSALSDK} ${CFLAGS}" + if test "${UNIVERSALSDK}" != "/" + then + CFLAGS="-isysroot ${UNIVERSALSDK} ${CFLAGS}" + LDFLAGS="-isysroot ${UNIVERSALSDK} ${LDFLAGS}" + CPPFLAGS="-isysroot ${UNIVERSALSDK} ${CPPFLAGS}" + fi fi + # Calculate the right deployment target for this build. + # + cur_target=`sw_vers -productVersion | sed 's/\(10\.[0-9]*\).*/\1/'` + if test ${cur_target} '>' 10.2 && \ + test ${cur_target} '<' 10.6 + then + cur_target=10.3 + if test ${enable_universalsdk}; then + if test "${UNIVERSAL_ARCHS}" = "all"; then + # Ensure that the default platform for a + # 4-way universal build is OSX 10.5, + # that's the first OS release where + # 4-way builds make sense. + cur_target='10.5' + + elif test "${UNIVERSAL_ARCHS}" = "3-way"; then + cur_target='10.5' + + elif test "${UNIVERSAL_ARCHS}" = "intel"; then + cur_target='10.5' + + elif test "${UNIVERSAL_ARCHS}" = "64-bit"; then + cur_target='10.5' + fi + else + if test `/usr/bin/arch` = "i386"; then + # On Intel macs default to a deployment + # target of 10.4, that's the first OSX + # release with Intel support. + cur_target="10.4" + fi + fi + fi + CONFIGURE_MACOSX_DEPLOYMENT_TARGET=${MACOSX_DEPLOYMENT_TARGET-${cur_target}} + + # Make sure that MACOSX_DEPLOYMENT_TARGET is set in the + # environment with a value that is the same as what we'll use + # in the Makefile to ensure that we'll get the same compiler + # environment during configure and build time. + MACOSX_DEPLOYMENT_TARGET="$CONFIGURE_MACOSX_DEPLOYMENT_TARGET" + export MACOSX_DEPLOYMENT_TARGET + EXPORT_MACOSX_DEPLOYMENT_TARGET='' + ;; OSF*) BASECFLAGS="$BASECFLAGS -mieee" @@ -10851,7 +10960,7 @@ if test "${enable_universalsdk}"; then : else - LIBTOOL_CRUFT="${LIBTOOL_CRUFT} -arch_only `arch`" + LIBTOOL_CRUFT="${LIBTOOL_CRUFT}" fi LIBTOOL_CRUFT=$LIBTOOL_CRUFT' -install_name $(PYTHONFRAMEWORKINSTALLDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK)' LIBTOOL_CRUFT=$LIBTOOL_CRUFT' -compatibility_version $(VERSION) -current_version $(VERSION)';; @@ -10863,7 +10972,7 @@ else LIBTOOL_CRUFT="" fi - LIBTOOL_CRUFT=$LIBTOOL_CRUFT" -lSystem -lSystemStubs -arch_only `arch`" + LIBTOOL_CRUFT=$LIBTOOL_CRUFT" -lSystem -lSystemStubs" LIBTOOL_CRUFT=$LIBTOOL_CRUFT' -install_name $(PYTHONFRAMEWORKINSTALLDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK)' LIBTOOL_CRUFT=$LIBTOOL_CRUFT' -compatibility_version $(VERSION) -current_version $(VERSION)';; esac diff -r -u ./pyconfig.h.in ../Python-2.5/pyconfig.h.in --- ./pyconfig.h.in 2006-07-30 23:09:47.000000000 +0900 +++ ../Python-2.5/pyconfig.h.in 2013-07-17 23:12:31.000000000 +0900 @@ -912,6 +912,11 @@ /* Define on Irix to enable u_int */ #undef _BSD_TYPES +/* Define on Darwin to activate all library features */ +#ifndef _DARWIN_C_SOURCE +#define _DARWIN_C_SOURCE +#endif + /* This must be set to 64 on some systems to enable large file support. */ #undef _FILE_OFFSET_BITS 003_osx_lp64.patch000066400000000000000000000215441517431316200331440ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.5.3/Python-2.5.3diff -r -u ./Include/pymactoolbox.h ../Python-2.5/Include/pymactoolbox.h --- ./Include/pymactoolbox.h 2004-11-05 16:02:59.000000000 +0900 +++ ../Python-2.5/Include/pymactoolbox.h 2013-07-17 23:38:51.000000000 +0900 @@ -8,7 +8,10 @@ #endif #include + +#ifndef __LP64__ #include +#endif /* !__LP64__ */ /* ** Helper routines for error codes and such. @@ -18,8 +21,11 @@ PyObject *PyMac_GetOSErrException(void); /* Initialize & return it */ PyObject *PyErr_Mac(PyObject *, int); /* Exception with a mac error */ PyObject *PyMac_Error(OSErr); /* Uses PyMac_GetOSErrException */ +#ifndef __LP64__ extern OSErr PyMac_GetFullPathname(FSSpec *, char *, int); /* convert fsspec->path */ +#endif /* __LP64__ */ + /* ** These conversion routines are defined in mactoolboxglue.c itself. */ @@ -83,8 +89,10 @@ #endif /* USE_TOOLBOX_OBJECT_GLUE */ /* macfs exports */ +#ifndef __LP64__ int PyMac_GetFSSpec(PyObject *, FSSpec *); /* argument parser for FSSpec */ PyObject *PyMac_BuildFSSpec(FSSpec *); /* Convert FSSpec to PyObject */ +#endif /* !__LP64__ */ int PyMac_GetFSRef(PyObject *, FSRef *); /* argument parser for FSRef */ PyObject *PyMac_BuildFSRef(FSRef *); /* Convert FSRef to PyObject */ @@ -101,39 +109,54 @@ extern int CmpInstObj_Convert(PyObject *, ComponentInstance *); /* Ctl exports */ +#ifndef __LP64__ extern PyObject *CtlObj_New(ControlHandle); extern int CtlObj_Convert(PyObject *, ControlHandle *); +#endif /* !__LP64__ */ /* Dlg exports */ +#ifndef __LP64__ extern PyObject *DlgObj_New(DialogPtr); extern int DlgObj_Convert(PyObject *, DialogPtr *); extern PyObject *DlgObj_WhichDialog(DialogPtr); +#endif /* !__LP64__ */ /* Drag exports */ +#ifndef __LP64__ extern PyObject *DragObj_New(DragReference); extern int DragObj_Convert(PyObject *, DragReference *); +#endif /* !__LP64__ */ /* List exports */ +#ifndef __LP64__ extern PyObject *ListObj_New(ListHandle); extern int ListObj_Convert(PyObject *, ListHandle *); +#endif /* !__LP64__ */ /* Menu exports */ +#ifndef __LP64__ extern PyObject *MenuObj_New(MenuHandle); extern int MenuObj_Convert(PyObject *, MenuHandle *); +#endif /* !__LP64__ */ /* Qd exports */ +#ifndef __LP64__ extern PyObject *GrafObj_New(GrafPtr); extern int GrafObj_Convert(PyObject *, GrafPtr *); extern PyObject *BMObj_New(BitMapPtr); extern int BMObj_Convert(PyObject *, BitMapPtr *); extern PyObject *QdRGB_New(RGBColor *); extern int QdRGB_Convert(PyObject *, RGBColor *); +#endif /* !__LP64__ */ /* Qdoffs exports */ +#ifndef __LP64__ extern PyObject *GWorldObj_New(GWorldPtr); extern int GWorldObj_Convert(PyObject *, GWorldPtr *); +#endif /* !__LP64__ */ /* Qt exports */ +#ifndef __LP64__ extern PyObject *TrackObj_New(Track); extern int TrackObj_Convert(PyObject *, Track *); extern PyObject *MovieObj_New(Movie); @@ -146,6 +169,7 @@ extern int UserDataObj_Convert(PyObject *, UserData *); extern PyObject *MediaObj_New(Media); extern int MediaObj_Convert(PyObject *, Media *); +#endif /* !__LP64__ */ /* Res exports */ extern PyObject *ResObj_New(Handle); @@ -154,13 +178,17 @@ extern int OptResObj_Convert(PyObject *, Handle *); /* TE exports */ +#ifndef __LP64__ extern PyObject *TEObj_New(TEHandle); extern int TEObj_Convert(PyObject *, TEHandle *); +#endif /* !__LP64__ */ /* Win exports */ +#ifndef __LP64__ extern PyObject *WinObj_New(WindowPtr); extern int WinObj_Convert(PyObject *, WindowPtr *); extern PyObject *WinObj_WhichWindow(WindowPtr); +#endif /* !__LP64__ */ /* CF exports */ extern PyObject *CFObj_New(CFTypeRef); diff -r -u ./Mac/Modules/res/_Resmodule.c ../Python-2.5/Mac/Modules/res/_Resmodule.c --- ./Mac/Modules/res/_Resmodule.c 2005-07-04 05:59:44.000000000 +0900 +++ ../Python-2.5/Mac/Modules/res/_Resmodule.c 2013-07-17 23:38:51.000000000 +0900 @@ -414,6 +414,7 @@ return _res; } +#ifndef __LP64__ static PyObject *ResObj_as_Control(ResourceObject *_self, PyObject *_args) { PyObject *_res = NULL; @@ -431,6 +432,7 @@ return _res; } +#endif /* !__LP64__ */ static PyObject *ResObj_LoadResource(ResourceObject *_self, PyObject *_args) { @@ -1152,6 +1154,7 @@ return _res; } +#ifndef __LP64__ static PyObject *Res_OpenRFPerm(PyObject *_self, PyObject *_args) { PyObject *_res = NULL; @@ -1287,6 +1290,7 @@ _res = Py_None; return _res; } +#endif /* !__LP64__ */ static PyObject *Res_InsertResourceFile(PyObject *_self, PyObject *_args) { @@ -1327,6 +1331,7 @@ return _res; } +#ifndef __LP64__ static PyObject *Res_FSpResourceFileAlreadyOpen(PyObject *_self, PyObject *_args) { PyObject *_res = NULL; @@ -1413,6 +1418,7 @@ nextRefNum); return _res; } +#endif /* !__LP64__ */ static PyObject *Res_FSOpenResFile(PyObject *_self, PyObject *_args) { @@ -1438,6 +1444,7 @@ return _res; } +#ifndef __LP64__ static PyObject *Res_FSCreateResFile(PyObject *_self, PyObject *_args) { PyObject *_res = NULL; @@ -1534,6 +1541,7 @@ PyMac_BuildFSSpec, &newSpec); return _res; } +#endif /* __LP64__ */ static PyObject *Res_FSOpenResourceFile(PyObject *_self, PyObject *_args) { @@ -1637,6 +1645,7 @@ PyDoc_STR("(short refNum) -> (short _rv)")}, {"SetResFileAttrs", (PyCFunction)Res_SetResFileAttrs, 1, PyDoc_STR("(short refNum, short attrs) -> None")}, +#ifndef __LP64__ {"OpenRFPerm", (PyCFunction)Res_OpenRFPerm, 1, PyDoc_STR("(Str255 fileName, short vRefNum, SignedByte permission) -> (short _rv)")}, {"HOpenResFile", (PyCFunction)Res_HOpenResFile, 1, @@ -1647,10 +1656,12 @@ PyDoc_STR("(FSSpec spec, SignedByte permission) -> (short _rv)")}, {"FSpCreateResFile", (PyCFunction)Res_FSpCreateResFile, 1, PyDoc_STR("(FSSpec spec, OSType creator, OSType fileType, ScriptCode scriptTag) -> None")}, +#endif /* !__LP64__ */ {"InsertResourceFile", (PyCFunction)Res_InsertResourceFile, 1, PyDoc_STR("(SInt16 refNum, RsrcChainLocation where) -> None")}, {"DetachResourceFile", (PyCFunction)Res_DetachResourceFile, 1, PyDoc_STR("(SInt16 refNum) -> None")}, +#ifndef __LP64__ {"FSpResourceFileAlreadyOpen", (PyCFunction)Res_FSpResourceFileAlreadyOpen, 1, PyDoc_STR("(FSSpec resourceFile) -> (Boolean _rv, Boolean inChain, SInt16 refNum)")}, {"FSpOpenOrphanResFile", (PyCFunction)Res_FSpOpenOrphanResFile, 1, @@ -1659,14 +1670,17 @@ PyDoc_STR("() -> (SInt16 refNum)")}, {"GetNextResourceFile", (PyCFunction)Res_GetNextResourceFile, 1, PyDoc_STR("(SInt16 curRefNum) -> (SInt16 nextRefNum)")}, +#endif /* __LP64__ */ {"FSOpenResFile", (PyCFunction)Res_FSOpenResFile, 1, PyDoc_STR("(FSRef ref, SignedByte permission) -> (short _rv)")}, +#ifndef __LP64__ {"FSCreateResFile", (PyCFunction)Res_FSCreateResFile, 1, PyDoc_STR("(FSRef parentRef, Buffer nameLength) -> (FSRef newRef, FSSpec newSpec)")}, {"FSResourceFileAlreadyOpen", (PyCFunction)Res_FSResourceFileAlreadyOpen, 1, PyDoc_STR("(FSRef resourceFileRef) -> (Boolean _rv, Boolean inChain, SInt16 refNum)")}, {"FSCreateResourceFile", (PyCFunction)Res_FSCreateResourceFile, 1, PyDoc_STR("(FSRef parentRef, Buffer nameLength, Buffer forkNameLength) -> (FSRef newRef, FSSpec newSpec)")}, +#endif /* __LP64__ */ {"FSOpenResourceFile", (PyCFunction)Res_FSOpenResourceFile, 1, PyDoc_STR("(FSRef ref, Buffer forkNameLength, SignedByte permissions) -> (SInt16 refNum)")}, {"Handle", (PyCFunction)Res_Handle, 1, diff -r -u ./Modules/_ctypes/libffi/src/darwin/ffitarget.h ../Python-2.5/Modules/_ctypes/libffi/src/darwin/ffitarget.h --- ./Modules/_ctypes/libffi/src/darwin/ffitarget.h 2006-05-26 06:58:05.000000000 +0900 +++ ../Python-2.5/Modules/_ctypes/libffi/src/darwin/ffitarget.h 2013-07-17 23:38:51.000000000 +0900 @@ -4,7 +4,7 @@ * created by configure). This makes is possible to build a univeral binary * of ctypes in one go. */ -#if defined(__i386__) +#if defined(__i386__) || defined(__x86_64__) #ifndef X86_DARWIN #define X86_DARWIN diff -r -u ./Python/mactoolboxglue.c ../Python-2.5/Python/mactoolboxglue.c --- ./Python/mactoolboxglue.c 2006-07-12 01:44:25.000000000 +0900 +++ ../Python-2.5/Python/mactoolboxglue.c 2013-07-17 23:39:09.000000000 +0900 @@ -106,6 +106,7 @@ } +#ifndef __LP64__ OSErr PyMac_GetFullPathname(FSSpec *fss, char *path, int len) { @@ -153,6 +154,7 @@ Py_XDECREF(fs); return err; } +#endif /* !__LP64__ */ /* Convert a 4-char string object argument to an OSType value */ int @@ -417,6 +419,7 @@ GLUE_NEW(GWorldPtr, GWorldObj_New, "Carbon.Qdoffs") GLUE_CONVERT(GWorldPtr, GWorldObj_Convert, "Carbon.Qdoffs") +#ifndef __LP64__ GLUE_NEW(Track, TrackObj_New, "Carbon.Qt") GLUE_CONVERT(Track, TrackObj_Convert, "Carbon.Qt") GLUE_NEW(Movie, MovieObj_New, "Carbon.Qt") @@ -429,6 +432,7 @@ GLUE_CONVERT(UserData, UserDataObj_Convert, "Carbon.Qt") GLUE_NEW(Media, MediaObj_New, "Carbon.Qt") GLUE_CONVERT(Media, MediaObj_Convert, "Carbon.Qt") +#endif /* !__LP64__ */ GLUE_NEW(Handle, ResObj_New, "Carbon.Res") GLUE_CONVERT(Handle, ResObj_Convert, "Carbon.Res") 004_osx_libffi.patch000066400000000000000000005661361517431316200336260ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.5.3/Python-2.5.3diff -r -u ./Modules/_ctypes/libffi_osx/LICENSE ./Modules/_ctypes/libffi_osx/LICENSE new file mode 100644 index 0000000..f591795 --- /dev/null +++ ./Modules/_ctypes/libffi_osx/LICENSE @@ -0,0 +1,20 @@ +libffi - Copyright (c) 1996-2003 Red Hat, Inc. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +``Software''), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff -r -u ./Modules/_ctypes/libffi_osx/README ./Modules/_ctypes/libffi_osx/README new file mode 100644 index 0000000..1fc2747 --- /dev/null +++ ./Modules/_ctypes/libffi_osx/README @@ -0,0 +1,500 @@ +This directory contains the libffi package, which is not part of GCC but +shipped with GCC as convenience. + +Status +====== + +libffi-2.00 has not been released yet! This is a development snapshot! + +libffi-1.20 was released on October 5, 1998. Check the libffi web +page for updates: . + + +What is libffi? +=============== + +Compilers for high level languages generate code that follow certain +conventions. These conventions are necessary, in part, for separate +compilation to work. One such convention is the "calling +convention". The "calling convention" is essentially a set of +assumptions made by the compiler about where function arguments will +be found on entry to a function. A "calling convention" also specifies +where the return value for a function is found. + +Some programs may not know at the time of compilation what arguments +are to be passed to a function. For instance, an interpreter may be +told at run-time about the number and types of arguments used to call +a given function. Libffi can be used in such programs to provide a +bridge from the interpreter program to compiled code. + +The libffi library provides a portable, high level programming +interface to various calling conventions. This allows a programmer to +call any function specified by a call interface description at run +time. + +Ffi stands for Foreign Function Interface. A foreign function +interface is the popular name for the interface that allows code +written in one language to call code written in another language. The +libffi library really only provides the lowest, machine dependent +layer of a fully featured foreign function interface. A layer must +exist above libffi that handles type conversions for values passed +between the two languages. + + +Supported Platforms and Prerequisites +===================================== + +Libffi has been ported to: + + SunOS 4.1.3 & Solaris 2.x (SPARC-V8, SPARC-V9) + + Irix 5.3 & 6.2 (System V/o32 & n32) + + Intel x86 - Linux (System V ABI) + + Alpha - Linux and OSF/1 + + m68k - Linux (System V ABI) + + PowerPC - Linux (System V ABI, Darwin, AIX) + + ARM - Linux (System V ABI) + +Libffi has been tested with the egcs 1.0.2 gcc compiler. Chances are +that other versions will work. Libffi has also been built and tested +with the SGI compiler tools. + +On PowerPC, the tests failed (see the note below). + +You must use GNU make to build libffi. SGI's make will not work. +Sun's probably won't either. + +If you port libffi to another platform, please let me know! I assume +that some will be easy (x86 NetBSD), and others will be more difficult +(HP). + + +Installing libffi +================= + +[Note: before actually performing any of these installation steps, + you may wish to read the "Platform Specific Notes" below.] + +First you must configure the distribution for your particular +system. Go to the directory you wish to build libffi in and run the +"configure" program found in the root directory of the libffi source +distribution. + +You may want to tell configure where to install the libffi library and +header files. To do that, use the --prefix configure switch. Libffi +will install under /usr/local by default. + +If you want to enable extra run-time debugging checks use the the +--enable-debug configure switch. This is useful when your program dies +mysteriously while using libffi. + +Another useful configure switch is --enable-purify-safety. Using this +will add some extra code which will suppress certain warnings when you +are using Purify with libffi. Only use this switch when using +Purify, as it will slow down the library. + +Configure has many other options. Use "configure --help" to see them all. + +Once configure has finished, type "make". Note that you must be using +GNU make. SGI's make will not work. Sun's probably won't either. +You can ftp GNU make from prep.ai.mit.edu:/pub/gnu. + +To ensure that libffi is working as advertised, type "make test". + +To install the library and header files, type "make install". + + +Using libffi +============ + + The Basics + ---------- + +Libffi assumes that you have a pointer to the function you wish to +call and that you know the number and types of arguments to pass it, +as well as the return type of the function. + +The first thing you must do is create an ffi_cif object that matches +the signature of the function you wish to call. The cif in ffi_cif +stands for Call InterFace. To prepare a call interface object, use the +following function: + +ffi_status ffi_prep_cif(ffi_cif *cif, ffi_abi abi, + unsigned int nargs, + ffi_type *rtype, ffi_type **atypes); + + CIF is a pointer to the call interface object you wish + to initialize. + + ABI is an enum that specifies the calling convention + to use for the call. FFI_DEFAULT_ABI defaults + to the system's native calling convention. Other + ABI's may be used with care. They are system + specific. + + NARGS is the number of arguments this function accepts. + libffi does not yet support vararg functions. + + RTYPE is a pointer to an ffi_type structure that represents + the return type of the function. Ffi_type objects + describe the types of values. libffi provides + ffi_type objects for many of the native C types: + signed int, unsigned int, signed char, unsigned char, + etc. There is also a pointer ffi_type object and + a void ffi_type. Use &ffi_type_void for functions that + don't return values. + + ATYPES is a vector of ffi_type pointers. ARGS must be NARGS long. + If NARGS is 0, this is ignored. + + +ffi_prep_cif will return a status code that you are responsible +for checking. It will be one of the following: + + FFI_OK - All is good. + + FFI_BAD_TYPEDEF - One of the ffi_type objects that ffi_prep_cif + came across is bad. + + +Before making the call, the VALUES vector should be initialized +with pointers to the appropriate argument values. + +To call the function using the initialized ffi_cif, use the +ffi_call function: + +void ffi_call(ffi_cif *cif, void *fn, void *rvalue, void **avalues); + + CIF is a pointer to the ffi_cif initialized specifically + for this function. + + FN is a pointer to the function you want to call. + + RVALUE is a pointer to a chunk of memory that is to hold the + result of the function call. Currently, it must be + at least one word in size (except for the n32 version + under Irix 6.x, which must be a pointer to an 8 byte + aligned value (a long long). It must also be at least + word aligned (depending on the return type, and the + system's alignment requirements). If RTYPE is + &ffi_type_void, this is ignored. If RVALUE is NULL, + the return value is discarded. + + AVALUES is a vector of void* that point to the memory locations + holding the argument values for a call. + If NARGS is 0, this is ignored. + + +If you are expecting a return value from FN it will have been stored +at RVALUE. + + + + An Example + ---------- + +Here is a trivial example that calls puts() a few times. + + #include + #include + + int main() + { + ffi_cif cif; + ffi_type *args[1]; + void *values[1]; + char *s; + int rc; + + /* Initialize the argument info vectors */ + args[0] = &ffi_type_uint; + values[0] = &s; + + /* Initialize the cif */ + if (ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, + &ffi_type_uint, args) == FFI_OK) + { + s = "Hello World!"; + ffi_call(&cif, puts, &rc, values); + /* rc now holds the result of the call to puts */ + + /* values holds a pointer to the function's arg, so to + call puts() again all we need to do is change the + value of s */ + s = "This is cool!"; + ffi_call(&cif, puts, &rc, values); + } + + return 0; + } + + + + Aggregate Types + --------------- + +Although libffi has no special support for unions or bit-fields, it is +perfectly happy passing structures back and forth. You must first +describe the structure to libffi by creating a new ffi_type object +for it. Here is the definition of ffi_type: + + typedef struct _ffi_type + { + unsigned size; + short alignment; + short type; + struct _ffi_type **elements; + } ffi_type; + +All structures must have type set to FFI_TYPE_STRUCT. You may set +size and alignment to 0. These will be calculated and reset to the +appropriate values by ffi_prep_cif(). + +elements is a NULL terminated array of pointers to ffi_type objects +that describe the type of the structure elements. These may, in turn, +be structure elements. + +The following example initializes a ffi_type object representing the +tm struct from Linux's time.h: + + struct tm { + int tm_sec; + int tm_min; + int tm_hour; + int tm_mday; + int tm_mon; + int tm_year; + int tm_wday; + int tm_yday; + int tm_isdst; + /* Those are for future use. */ + long int __tm_gmtoff__; + __const char *__tm_zone__; + }; + + { + ffi_type tm_type; + ffi_type *tm_type_elements[12]; + int i; + + tm_type.size = tm_type.alignment = 0; + tm_type.elements = &tm_type_elements; + + for (i = 0; i < 9; i++) + tm_type_elements[i] = &ffi_type_sint; + + tm_type_elements[9] = &ffi_type_slong; + tm_type_elements[10] = &ffi_type_pointer; + tm_type_elements[11] = NULL; + + /* tm_type can now be used to represent tm argument types and + return types for ffi_prep_cif() */ + } + + + +Platform Specific Notes +======================= + + Intel x86 + --------- + +There are no known problems with the x86 port. + + Sun SPARC - SunOS 4.1.3 & Solaris 2.x + ------------------------------------- + +You must use GNU Make to build libffi on Sun platforms. + + MIPS - Irix 5.3 & 6.x + --------------------- + +Irix 6.2 and better supports three different calling conventions: o32, +n32 and n64. Currently, libffi only supports both o32 and n32 under +Irix 6.x, but only o32 under Irix 5.3. Libffi will automatically be +configured for whichever calling convention it was built for. + +By default, the configure script will try to build libffi with the GNU +development tools. To build libffi with the SGI development tools, set +the environment variable CC to either "cc -32" or "cc -n32" before +running configure under Irix 6.x (depending on whether you want an o32 +or n32 library), or just "cc" for Irix 5.3. + +With the n32 calling convention, when returning structures smaller +than 16 bytes, be sure to provide an RVALUE that is 8 byte aligned. +Here's one way of forcing this: + + double struct_storage[2]; + my_small_struct *s = (my_small_struct *) struct_storage; + /* Use s for RVALUE */ + +If you don't do this you are liable to get spurious bus errors. + +"long long" values are not supported yet. + +You must use GNU Make to build libffi on SGI platforms. + + ARM - System V ABI + ------------------ + +The ARM port was performed on a NetWinder running ARM Linux ELF +(2.0.31) and gcc 2.8.1. + + + + PowerPC System V ABI + -------------------- + +There are two `System V ABI's which libffi implements for PowerPC. +They differ only in how small structures are returned from functions. + +In the FFI_SYSV version, structures that are 8 bytes or smaller are +returned in registers. This is what GCC does when it is configured +for solaris, and is what the System V ABI I have (dated September +1995) says. + +In the FFI_GCC_SYSV version, all structures are returned the same way: +by passing a pointer as the first argument to the function. This is +what GCC does when it is configured for linux or a generic sysv +target. + +EGCS 1.0.1 (and probably other versions of EGCS/GCC) also has a +inconsistency with the SysV ABI: When a procedure is called with many +floating-point arguments, some of them get put on the stack. They are +all supposed to be stored in double-precision format, even if they are +only single-precision, but EGCS stores single-precision arguments as +single-precision anyway. This causes one test to fail (the `many +arguments' test). + + +What's With The Crazy Comments? +=============================== + +You might notice a number of cryptic comments in the code, delimited +by /*@ and @*/. These are annotations read by the program LCLint, a +tool for statically checking C programs. You can read all about it at +. + + +History +======= + +1.20 Oct-5-98 + Raffaele Sena produces ARM port. + +1.19 Oct-5-98 + Fixed x86 long double and long long return support. + m68k bug fixes from Andreas Schwab. + Patch for DU assembler compatibility for the Alpha from Richard + Henderson. + +1.18 Apr-17-98 + Bug fixes and MIPS configuration changes. + +1.17 Feb-24-98 + Bug fixes and m68k port from Andreas Schwab. PowerPC port from + Geoffrey Keating. Various bug x86, Sparc and MIPS bug fixes. + +1.16 Feb-11-98 + Richard Henderson produces Alpha port. + +1.15 Dec-4-97 + Fixed an n32 ABI bug. New libtool, auto* support. + +1.14 May-13-97 + libtool is now used to generate shared and static libraries. + Fixed a minor portability problem reported by Russ McManus + . + +1.13 Dec-2-96 + Added --enable-purify-safety to keep Purify from complaining + about certain low level code. + Sparc fix for calling functions with < 6 args. + Linux x86 a.out fix. + +1.12 Nov-22-96 + Added missing ffi_type_void, needed for supporting void return + types. Fixed test case for non MIPS machines. Cygnus Support + is now Cygnus Solutions. + +1.11 Oct-30-96 + Added notes about GNU make. + +1.10 Oct-29-96 + Added configuration fix for non GNU compilers. + +1.09 Oct-29-96 + Added --enable-debug configure switch. Clean-ups based on LCLint + feedback. ffi_mips.h is always installed. Many configuration + fixes. Fixed ffitest.c for sparc builds. + +1.08 Oct-15-96 + Fixed n32 problem. Many clean-ups. + +1.07 Oct-14-96 + Gordon Irlam rewrites v8.S again. Bug fixes. + +1.06 Oct-14-96 + Gordon Irlam improved the sparc port. + +1.05 Oct-14-96 + Interface changes based on feedback. + +1.04 Oct-11-96 + Sparc port complete (modulo struct passing bug). + +1.03 Oct-10-96 + Passing struct args, and returning struct values works for + all architectures/calling conventions. Expanded tests. + +1.02 Oct-9-96 + Added SGI n32 support. Fixed bugs in both o32 and Linux support. + Added "make test". + +1.01 Oct-8-96 + Fixed float passing bug in mips version. Restructured some + of the code. Builds cleanly with SGI tools. + +1.00 Oct-7-96 + First release. No public announcement. + + +Authors & Credits +================= + +libffi was written by Anthony Green . + +Portions of libffi were derived from Gianni Mariani's free gencall +library for Silicon Graphics machines. + +The closure mechanism was designed and implemented by Kresten Krab +Thorup. + +The Sparc port was derived from code contributed by the fine folks at +Visible Decisions Inc . Further enhancements were +made by Gordon Irlam at Cygnus Solutions . + +The Alpha port was written by Richard Henderson at Cygnus Solutions. + +Andreas Schwab ported libffi to m68k Linux and provided a number of +bug fixes. + +Geoffrey Keating ported libffi to the PowerPC. + +Raffaele Sena ported libffi to the ARM. + +Jesper Skov and Andrew Haley both did more than their fair share of +stepping through the code and tracking down bugs. + +Thanks also to Tom Tromey for bug fixes and configuration help. + +Thanks to Jim Blandy, who provided some useful feedback on the libffi +interface. + +If you have a problem, or have found a bug, please send a note to +green@cygnus.com. diff -r -u ./Modules/_ctypes/libffi_osx/README.pyobjc ./Modules/_ctypes/libffi_osx/README.pyobjc new file mode 100644 index 0000000..405d85f --- /dev/null +++ ./Modules/_ctypes/libffi_osx/README.pyobjc @@ -0,0 +1,5 @@ +This directory contains a slightly modified version of libffi, extracted from +the GCC source-tree. + +The only modifications are those that are necessary to compile libffi using +the Apple provided compiler and outside of the GCC source tree. diff -r -u ./Modules/_ctypes/libffi_osx/ffi.c ./Modules/_ctypes/libffi_osx/ffi.c new file mode 100644 index 0000000..bf42093 --- /dev/null +++ ./Modules/_ctypes/libffi_osx/ffi.c @@ -0,0 +1,226 @@ +/* ----------------------------------------------------------------------- + prep_cif.c - Copyright (c) 1996, 1998 Red Hat, Inc. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#include +#include + +#include +#include + +/* Round up to FFI_SIZEOF_ARG. */ +#define STACK_ARG_SIZE(x) ALIGN(x, FFI_SIZEOF_ARG) + +/* Perform machine independent initialization of aggregate type + specifications. */ + +static ffi_status +initialize_aggregate( +/*@out@*/ ffi_type* arg) +{ +/*@-usedef@*/ + + if (arg == NULL || arg->elements == NULL || + arg->size != 0 || arg->alignment != 0) + return FFI_BAD_TYPEDEF; + + ffi_type** ptr = &(arg->elements[0]); + + while ((*ptr) != NULL) + { + if (((*ptr)->size == 0) && (initialize_aggregate(*ptr) != FFI_OK)) + return FFI_BAD_TYPEDEF; + + /* Perform a sanity check on the argument type */ + FFI_ASSERT_VALID_TYPE(*ptr); + +#ifdef POWERPC_DARWIN + int curalign = (*ptr)->alignment; + + if (ptr != &(arg->elements[0])) + { + if (curalign > 4 && curalign != 16) + curalign = 4; + } + + arg->size = ALIGN(arg->size, curalign); + arg->size += (*ptr)->size; + arg->alignment = (arg->alignment > curalign) ? + arg->alignment : curalign; +#else + arg->size = ALIGN(arg->size, (*ptr)->alignment); + arg->size += (*ptr)->size; + arg->alignment = (arg->alignment > (*ptr)->alignment) ? + arg->alignment : (*ptr)->alignment; +#endif + + ptr++; + } + + /* Structure size includes tail padding. This is important for + structures that fit in one register on ABIs like the PowerPC64 + Linux ABI that right justify small structs in a register. + It's also needed for nested structure layout, for example + struct A { long a; char b; }; struct B { struct A x; char y; }; + should find y at an offset of 2*sizeof(long) and result in a + total size of 3*sizeof(long). */ + arg->size = ALIGN(arg->size, arg->alignment); + + if (arg->size == 0) + return FFI_BAD_TYPEDEF; + + return FFI_OK; + +/*@=usedef@*/ +} + +#ifndef __CRIS__ +/* The CRIS ABI specifies structure elements to have byte + alignment only, so it completely overrides this functions, + which assumes "natural" alignment and padding. */ + +/* Perform machine independent ffi_cif preparation, then call + machine dependent routine. */ + +#if defined(X86_DARWIN) + +static inline bool +struct_on_stack( + int size) +{ + if (size > 8) + return true; + + /* This is not what the ABI says, but is what is really implemented */ + switch (size) + { + case 1: + case 2: + case 4: + case 8: + return false; + + default: + return true; + } +} + +#endif // defined(X86_DARWIN) + +// Arguments' ffi_type->alignment must be nonzero. +ffi_status +ffi_prep_cif( +/*@out@*/ /*@partial@*/ ffi_cif* cif, + ffi_abi abi, + unsigned int nargs, +/*@dependent@*/ /*@out@*/ /*@partial@*/ ffi_type* rtype, +/*@dependent@*/ ffi_type** atypes) +{ + if (cif == NULL) + return FFI_BAD_TYPEDEF; + + if (abi <= FFI_FIRST_ABI || abi > FFI_DEFAULT_ABI) + return FFI_BAD_ABI; + + unsigned int bytes = 0; + unsigned int i; + ffi_type** ptr; + + cif->abi = abi; + cif->arg_types = atypes; + cif->nargs = nargs; + cif->rtype = rtype; + cif->flags = 0; + + /* Initialize the return type if necessary */ + /*@-usedef@*/ + if ((cif->rtype->size == 0) && (initialize_aggregate(cif->rtype) != FFI_OK)) + return FFI_BAD_TYPEDEF; + /*@=usedef@*/ + + /* Perform a sanity check on the return type */ + FFI_ASSERT_VALID_TYPE(cif->rtype); + + /* x86-64 and s390 stack space allocation is handled in prep_machdep. */ +#if !defined M68K && !defined __x86_64__ && !defined S390 && !defined PA + /* Make space for the return structure pointer */ + if (cif->rtype->type == FFI_TYPE_STRUCT +#ifdef SPARC + && (cif->abi != FFI_V9 || cif->rtype->size > 32) +#endif +#ifdef X86_DARWIN + && (struct_on_stack(cif->rtype->size)) +#endif + ) + bytes = STACK_ARG_SIZE(sizeof(void*)); +#endif + + for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++) + { + /* Initialize any uninitialized aggregate type definitions */ + if (((*ptr)->size == 0) && (initialize_aggregate((*ptr)) != FFI_OK)) + return FFI_BAD_TYPEDEF; + + if ((*ptr)->alignment == 0) + return FFI_BAD_TYPEDEF; + + /* Perform a sanity check on the argument type, do this + check after the initialization. */ + FFI_ASSERT_VALID_TYPE(*ptr); + +#if defined(X86_DARWIN) + { + int align = (*ptr)->alignment; + + if (align > 4) + align = 4; + + if ((align - 1) & bytes) + bytes = ALIGN(bytes, align); + + bytes += STACK_ARG_SIZE((*ptr)->size); + } +#elif !defined __x86_64__ && !defined S390 && !defined PA +#ifdef SPARC + if (((*ptr)->type == FFI_TYPE_STRUCT + && ((*ptr)->size > 16 || cif->abi != FFI_V9)) + || ((*ptr)->type == FFI_TYPE_LONGDOUBLE + && cif->abi != FFI_V9)) + bytes += sizeof(void*); + else +#endif + { + /* Add any padding if necessary */ + if (((*ptr)->alignment - 1) & bytes) + bytes = ALIGN(bytes, (*ptr)->alignment); + + bytes += STACK_ARG_SIZE((*ptr)->size); + } +#endif + } + + cif->bytes = bytes; + + /* Perform machine dependent cif processing */ + return ffi_prep_cif_machdep(cif); +} +#endif /* not __CRIS__ */ diff -r -u ./Modules/_ctypes/libffi_osx/include/ffi.h ./Modules/_ctypes/libffi_osx/include/ffi.h new file mode 100644 index 0000000..c104a5c --- /dev/null +++ ./Modules/_ctypes/libffi_osx/include/ffi.h @@ -0,0 +1,355 @@ +/* -----------------------------------------------------------------*-C-*- + libffi PyOBJC - Copyright (c) 1996-2003 Red Hat, Inc. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + ----------------------------------------------------------------------- */ + +/* ------------------------------------------------------------------- + The basic API is described in the README file. + + The raw API is designed to bypass some of the argument packing + and unpacking on architectures for which it can be avoided. + + The closure API allows interpreted functions to be packaged up + inside a C function pointer, so that they can be called as C functions, + with no understanding on the client side that they are interpreted. + It can also be used in other cases in which it is necessary to package + up a user specified parameter and a function pointer as a single + function pointer. + + The closure API must be implemented in order to get its functionality, + e.g. for use by gij. Routines are provided to emulate the raw API + if the underlying platform doesn't allow faster implementation. + + More details on the raw and closure API can be found in: + + http://gcc.gnu.org/ml/java/1999-q3/msg00138.html + + and + + http://gcc.gnu.org/ml/java/1999-q3/msg00174.html + -------------------------------------------------------------------- */ + +#ifndef LIBFFI_H +#define LIBFFI_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Specify which architecture libffi is configured for. */ +#ifdef MACOSX +# if defined(__i386__) || defined(__x86_64__) +# define X86_DARWIN +# elif defined(__ppc__) || defined(__ppc64__) +# define POWERPC_DARWIN +# else +# error "Unsupported MacOS X CPU type" +# endif +#else +#error "Unsupported OS type" +#endif + +/* ---- System configuration information --------------------------------- */ + +#include "ffitarget.h" +#include "fficonfig.h" + +#ifndef LIBFFI_ASM + +#include +#include + +/* LONG_LONG_MAX is not always defined (not if STRICT_ANSI, for example). + But we can find it either under the correct ANSI name, or under GNU + C's internal name. */ +#ifdef LONG_LONG_MAX +# define FFI_LONG_LONG_MAX LONG_LONG_MAX +#else +# ifdef LLONG_MAX +# define FFI_LONG_LONG_MAX LLONG_MAX +# else +# ifdef __GNUC__ +# define FFI_LONG_LONG_MAX __LONG_LONG_MAX__ +# endif +# endif +#endif + +#if SCHAR_MAX == 127 +# define ffi_type_uchar ffi_type_uint8 +# define ffi_type_schar ffi_type_sint8 +#else +#error "char size not supported" +#endif + +#if SHRT_MAX == 32767 +# define ffi_type_ushort ffi_type_uint16 +# define ffi_type_sshort ffi_type_sint16 +#elif SHRT_MAX == 2147483647 +# define ffi_type_ushort ffi_type_uint32 +# define ffi_type_sshort ffi_type_sint32 +#else +#error "short size not supported" +#endif + +#if INT_MAX == 32767 +# define ffi_type_uint ffi_type_uint16 +# define ffi_type_sint ffi_type_sint16 +#elif INT_MAX == 2147483647 +# define ffi_type_uint ffi_type_uint32 +# define ffi_type_sint ffi_type_sint32 +#elif INT_MAX == 9223372036854775807 +# define ffi_type_uint ffi_type_uint64 +# define ffi_type_sint ffi_type_sint64 +#else +#error "int size not supported" +#endif + +#define ffi_type_ulong ffi_type_uint64 +#define ffi_type_slong ffi_type_sint64 + +#if LONG_MAX == 2147483647 +# if FFI_LONG_LONG_MAX != 9223372036854775807 +# error "no 64-bit data type supported" +# endif +#elif LONG_MAX != 9223372036854775807 +#error "long size not supported" +#endif + +/* The closure code assumes that this works on pointers, i.e. a size_t + can hold a pointer. */ + +typedef struct _ffi_type { + size_t size; + unsigned short alignment; + unsigned short type; +/*@null@*/ struct _ffi_type** elements; +} ffi_type; + +/* These are defined in types.c */ +extern ffi_type ffi_type_void; +extern ffi_type ffi_type_uint8; +extern ffi_type ffi_type_sint8; +extern ffi_type ffi_type_uint16; +extern ffi_type ffi_type_sint16; +extern ffi_type ffi_type_uint32; +extern ffi_type ffi_type_sint32; +extern ffi_type ffi_type_uint64; +extern ffi_type ffi_type_sint64; +extern ffi_type ffi_type_float; +extern ffi_type ffi_type_double; +extern ffi_type ffi_type_longdouble; +extern ffi_type ffi_type_pointer; + +typedef enum ffi_status { + FFI_OK = 0, + FFI_BAD_TYPEDEF, + FFI_BAD_ABI +} ffi_status; + +typedef unsigned FFI_TYPE; + +typedef struct ffi_cif { + ffi_abi abi; + unsigned nargs; +/*@dependent@*/ ffi_type** arg_types; +/*@dependent@*/ ffi_type* rtype; + unsigned bytes; + unsigned flags; +#ifdef FFI_EXTRA_CIF_FIELDS + FFI_EXTRA_CIF_FIELDS; +#endif +} ffi_cif; + +/* ---- Definitions for the raw API -------------------------------------- */ + +#ifndef FFI_SIZEOF_ARG +# if LONG_MAX == 2147483647 +# define FFI_SIZEOF_ARG 4 +# elif LONG_MAX == 9223372036854775807 +# define FFI_SIZEOF_ARG 8 +# endif +#endif + +typedef union { + ffi_sarg sint; + ffi_arg uint; + float flt; + char data[FFI_SIZEOF_ARG]; + void* ptr; +} ffi_raw; + +void +ffi_raw_call( +/*@dependent@*/ ffi_cif* cif, + void (*fn)(void), +/*@out@*/ void* rvalue, +/*@dependent@*/ ffi_raw* avalue); + +void +ffi_ptrarray_to_raw( + ffi_cif* cif, + void** args, + ffi_raw* raw); + +void +ffi_raw_to_ptrarray( + ffi_cif* cif, + ffi_raw* raw, + void** args); + +size_t +ffi_raw_size( + ffi_cif* cif); + +/* This is analogous to the raw API, except it uses Java parameter + packing, even on 64-bit machines. I.e. on 64-bit machines + longs and doubles are followed by an empty 64-bit word. */ +void +ffi_java_raw_call( +/*@dependent@*/ ffi_cif* cif, + void (*fn)(void), +/*@out@*/ void* rvalue, +/*@dependent@*/ ffi_raw* avalue); + +void +ffi_java_ptrarray_to_raw( + ffi_cif* cif, + void** args, + ffi_raw* raw); + +void +ffi_java_raw_to_ptrarray( + ffi_cif* cif, + ffi_raw* raw, + void** args); + +size_t +ffi_java_raw_size( + ffi_cif* cif); + +/* ---- Definitions for closures ----------------------------------------- */ + +#if FFI_CLOSURES + +typedef struct ffi_closure { + char tramp[FFI_TRAMPOLINE_SIZE]; + ffi_cif* cif; + void (*fun)(ffi_cif*,void*,void**,void*); + void* user_data; +} ffi_closure; + +ffi_status +ffi_prep_closure( + ffi_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif*,void*,void**,void*), + void* user_data); + +void ffi_closure_free(void *); +void *ffi_closure_alloc (size_t size, void **code); + +typedef struct ffi_raw_closure { + char tramp[FFI_TRAMPOLINE_SIZE]; + ffi_cif* cif; + +#if !FFI_NATIVE_RAW_API + /* if this is enabled, then a raw closure has the same layout + as a regular closure. We use this to install an intermediate + handler to do the transaltion, void** -> ffi_raw*. */ + void (*translate_args)(ffi_cif*,void*,void**,void*); + void* this_closure; +#endif + + void (*fun)(ffi_cif*,void*,ffi_raw*,void*); + void* user_data; +} ffi_raw_closure; + +ffi_status +ffi_prep_raw_closure( + ffi_raw_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif*,void*,ffi_raw*,void*), + void* user_data); + +ffi_status +ffi_prep_java_raw_closure( + ffi_raw_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif*,void*,ffi_raw*,void*), + void* user_data); + +#endif // FFI_CLOSURES + +/* ---- Public interface definition -------------------------------------- */ + +ffi_status +ffi_prep_cif( +/*@out@*/ /*@partial@*/ ffi_cif* cif, + ffi_abi abi, + unsigned int nargs, +/*@dependent@*/ /*@out@*/ /*@partial@*/ ffi_type* rtype, +/*@dependent@*/ ffi_type** atypes); + +void +ffi_call( +/*@dependent@*/ ffi_cif* cif, + void (*fn)(void), +/*@out@*/ void* rvalue, +/*@dependent@*/ void** avalue); + +/* Useful for eliminating compiler warnings */ +#define FFI_FN(f) ((void (*)(void))f) + +#endif // #ifndef LIBFFI_ASM +/* ---- Definitions shared with assembly code ---------------------------- */ + +/* If these change, update src/mips/ffitarget.h. */ +#define FFI_TYPE_VOID 0 +#define FFI_TYPE_INT 1 +#define FFI_TYPE_FLOAT 2 +#define FFI_TYPE_DOUBLE 3 + +#ifdef HAVE_LONG_DOUBLE +# define FFI_TYPE_LONGDOUBLE 4 +#else +# define FFI_TYPE_LONGDOUBLE FFI_TYPE_DOUBLE +#endif + +#define FFI_TYPE_UINT8 5 +#define FFI_TYPE_SINT8 6 +#define FFI_TYPE_UINT16 7 +#define FFI_TYPE_SINT16 8 +#define FFI_TYPE_UINT32 9 +#define FFI_TYPE_SINT32 10 +#define FFI_TYPE_UINT64 11 +#define FFI_TYPE_SINT64 12 +#define FFI_TYPE_STRUCT 13 +#define FFI_TYPE_POINTER 14 + +/* This should always refer to the last type code (for sanity checks) */ +#define FFI_TYPE_LAST FFI_TYPE_POINTER + +#ifdef __cplusplus +} +#endif + +#endif // #ifndef LIBFFI_H diff -r -u ./Modules/_ctypes/libffi_osx/include/ffi_common.h ./Modules/_ctypes/libffi_osx/include/ffi_common.h new file mode 100644 index 0000000..685a358 --- /dev/null +++ ./Modules/_ctypes/libffi_osx/include/ffi_common.h @@ -0,0 +1,102 @@ +/* ----------------------------------------------------------------------- + ffi_common.h - Copyright (c) 1996 Red Hat, Inc. + + Common internal definitions and macros. Only necessary for building + libffi. + ----------------------------------------------------------------------- */ + +#ifndef FFI_COMMON_H +#define FFI_COMMON_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "fficonfig.h" + +/* Do not move this. Some versions of AIX are very picky about where + this is positioned. */ +#ifdef __GNUC__ +# define alloca __builtin_alloca +#else +# if HAVE_ALLOCA_H +# include +# else +# ifdef _AIX +# pragma alloca +# else +# ifndef alloca /* predefined by HP cc +Olibcalls */ +char* alloca(); +# endif +# endif +# endif +#endif + +/* Check for the existence of memcpy. */ +#if STDC_HEADERS +# include +#else +# ifndef HAVE_MEMCPY +# define memcpy(d, s, n) bcopy((s), (d), (n)) +# endif +#endif + +/*#if defined(FFI_DEBUG) +#include +#endif*/ + +#ifdef FFI_DEBUG +#include + +/*@exits@*/ void +ffi_assert( +/*@temp@*/ char* expr, +/*@temp@*/ char* file, + int line); +void +ffi_stop_here(void); +void +ffi_type_test( +/*@temp@*/ /*@out@*/ ffi_type* a, +/*@temp@*/ char* file, + int line); + +# define FFI_ASSERT(x) ((x) ? (void)0 : ffi_assert(#x, __FILE__,__LINE__)) +# define FFI_ASSERT_AT(x, f, l) ((x) ? 0 : ffi_assert(#x, (f), (l))) +# define FFI_ASSERT_VALID_TYPE(x) ffi_type_test(x, __FILE__, __LINE__) +#else +# define FFI_ASSERT(x) +# define FFI_ASSERT_AT(x, f, l) +# define FFI_ASSERT_VALID_TYPE(x) +#endif // #ifdef FFI_DEBUG + +#define ALIGN(v, a) (((size_t)(v) + (a) - 1) & ~((a) - 1)) + +/* Perform machine dependent cif processing */ +ffi_status +ffi_prep_cif_machdep( + ffi_cif* cif); + +/* Extended cif, used in callback from assembly routine */ +typedef struct extended_cif { +/*@dependent@*/ ffi_cif* cif; +/*@dependent@*/ void* rvalue; +/*@dependent@*/ void** avalue; +} extended_cif; + +/* Terse sized type definitions. */ +typedef unsigned int UINT8 __attribute__((__mode__(__QI__))); +typedef signed int SINT8 __attribute__((__mode__(__QI__))); +typedef unsigned int UINT16 __attribute__((__mode__(__HI__))); +typedef signed int SINT16 __attribute__((__mode__(__HI__))); +typedef unsigned int UINT32 __attribute__((__mode__(__SI__))); +typedef signed int SINT32 __attribute__((__mode__(__SI__))); +typedef unsigned int UINT64 __attribute__((__mode__(__DI__))); +typedef signed int SINT64 __attribute__((__mode__(__DI__))); +typedef float FLOAT32; + +#ifdef __cplusplus +} +#endif + +#endif // #ifndef FFI_COMMON_H \ No newline at end of file diff -r -u ./Modules/_ctypes/libffi_osx/include/fficonfig.h ./Modules/_ctypes/libffi_osx/include/fficonfig.h new file mode 100644 index 0000000..2172490 --- /dev/null +++ ./Modules/_ctypes/libffi_osx/include/fficonfig.h @@ -0,0 +1,150 @@ +/* Manually created fficonfig.h for Darwin on PowerPC or Intel + + This file is manually generated to do away with the need for autoconf and + therefore make it easier to cross-compile and build fat binaries. + + NOTE: This file was added by PyObjC. +*/ + +#ifndef MACOSX +#error "This file is only supported on Mac OS X" +#endif + +#if defined(__i386__) +# define BYTEORDER 1234 +# undef HOST_WORDS_BIG_ENDIAN +# undef WORDS_BIGENDIAN +# define SIZEOF_DOUBLE 8 +# define HAVE_LONG_DOUBLE 1 +# define SIZEOF_LONG_DOUBLE 16 + +#elif defined(__x86_64__) +# define BYTEORDER 1234 +# undef HOST_WORDS_BIG_ENDIAN +# undef WORDS_BIGENDIAN +# define SIZEOF_DOUBLE 8 +# define HAVE_LONG_DOUBLE 1 +# define SIZEOF_LONG_DOUBLE 16 + +#elif defined(__ppc__) +# define BYTEORDER 4321 +# define HOST_WORDS_BIG_ENDIAN 1 +# define WORDS_BIGENDIAN 1 +# define SIZEOF_DOUBLE 8 +# if __GNUC__ >= 4 +# define HAVE_LONG_DOUBLE 1 +# define SIZEOF_LONG_DOUBLE 16 +# else +# undef HAVE_LONG_DOUBLE +# define SIZEOF_LONG_DOUBLE 8 +# endif + +#elif defined(__ppc64__) +# define BYTEORDER 4321 +# define HOST_WORDS_BIG_ENDIAN 1 +# define WORDS_BIGENDIAN 1 +# define SIZEOF_DOUBLE 8 +# define HAVE_LONG_DOUBLE 1 +# define SIZEOF_LONG_DOUBLE 16 + +#else +#error "Unknown CPU type" +#endif + +/* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP + systems. This function is required for `alloca.c' support on those systems. */ +#undef CRAY_STACKSEG_END + +/* Define to 1 if using `alloca.c'. */ +/* #undef C_ALLOCA */ + +/* Define to the flags needed for the .section .eh_frame directive. */ +#define EH_FRAME_FLAGS "aw" + +/* Define this if you want extra debugging. */ +/* #undef FFI_DEBUG */ + +/* Define this is you do not want support for the raw API. */ +#define FFI_NO_RAW_API 1 + +/* Define this if you do not want support for aggregate types. */ +/* #undef FFI_NO_STRUCTS */ + +/* Define to 1 if you have `alloca', as a function or macro. */ +#define HAVE_ALLOCA 1 + +/* Define to 1 if you have and it should be used (not on Ultrix). */ +#define HAVE_ALLOCA_H 1 + +/* Define if your assembler supports .register. */ +/* #undef HAVE_AS_REGISTER_PSEUDO_OP */ + +/* Define if your assembler and linker support unaligned PC relative relocs. */ +/* #undef HAVE_AS_SPARC_UA_PCREL */ + +/* Define to 1 if you have the `memcpy' function. */ +#define HAVE_MEMCPY 1 + +/* Define if mmap with MAP_ANON(YMOUS) works. */ +#define HAVE_MMAP_ANON 1 + +/* Define if mmap of /dev/zero works. */ +/* #undef HAVE_MMAP_DEV_ZERO */ + +/* Define if read-only mmap of a plain file works. */ +#define HAVE_MMAP_FILE 1 + +/* Define if .eh_frame sections should be read-only. */ +/* #undef HAVE_RO_EH_FRAME */ + +/* Define to 1 if your C compiler doesn't accept -c and -o together. */ +/* #undef NO_MINUS_C_MINUS_O */ + +/* Name of package */ +#define PACKAGE "libffi" + +/* Define to the address where bug reports for this package should be sent. */ +#define PACKAGE_BUGREPORT "http://gcc.gnu.org/bugs.html" + +/* Define to the full name of this package. */ +#define PACKAGE_NAME "libffi" + +/* Define to the full name and version of this package. */ +#define PACKAGE_STRING "libffi 2.1" + +/* Define to the one symbol short name of this package. */ +#define PACKAGE_TARNAME "libffi" + +/* Define to the version of this package. */ +#define PACKAGE_VERSION "2.1" + +/* If using the C implementation of alloca, define if you know the + direction of stack growth for your system; otherwise it will be + automatically deduced at run-time. + STACK_DIRECTION > 0 => grows toward higher addresses + STACK_DIRECTION < 0 => grows toward lower addresses + STACK_DIRECTION = 0 => direction of growth unknown */ +/* #undef STACK_DIRECTION */ + +/* Define to 1 if you have the ANSI C header files. */ +#define STDC_HEADERS 1 + +/* Define this if you are using Purify and want to suppress spurious messages. */ +/* #undef USING_PURIFY */ + +/* Version number of package */ +#define VERSION "2.1-pyobjc" + +#ifdef HAVE_HIDDEN_VISIBILITY_ATTRIBUTE +# ifdef LIBFFI_ASM +# define FFI_HIDDEN(name) .hidden name +# else +# define FFI_HIDDEN __attribute__((visibility ("hidden"))) +# endif +#else +# ifdef LIBFFI_ASM +# define FFI_HIDDEN(name) +# else +# define FFI_HIDDEN +# endif +#endif \ No newline at end of file diff -r -u ./Modules/_ctypes/libffi_osx/include/ffitarget.h ./Modules/_ctypes/libffi_osx/include/ffitarget.h new file mode 100644 index 0000000..faaa30d --- /dev/null +++ ./Modules/_ctypes/libffi_osx/include/ffitarget.h @@ -0,0 +1,13 @@ +/* Dispatch to the right ffitarget file. This file is PyObjC specific; in a + normal build, the build environment copies the file to the right location or + sets up the right include flags. We want to do neither because that would + make building fat binaries harder. +*/ + +#if defined(__i386__) || defined(__x86_64__) +#include "x86-ffitarget.h" +#elif defined(__ppc__) || defined(__ppc64__) +#include "ppc-ffitarget.h" +#else +#error "Unsupported CPU type" +#endif \ No newline at end of file diff -r -u ./Modules/_ctypes/libffi_osx/include/ppc-ffitarget.h ./Modules/_ctypes/libffi_osx/include/ppc-ffitarget.h new file mode 100644 index 0000000..2318421 --- /dev/null +++ ./Modules/_ctypes/libffi_osx/include/ppc-ffitarget.h @@ -0,0 +1,104 @@ +/* -----------------------------------------------------------------*-C-*- + ppc-ffitarget.h - Copyright (c) 1996-2003 Red Hat, Inc. + Target configuration macros for PowerPC. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#ifndef LIBFFI_TARGET_H +#define LIBFFI_TARGET_H + +/* ---- System specific configurations ----------------------------------- */ + +#if (defined(POWERPC) && defined(__powerpc64__)) || \ + (defined(POWERPC_DARWIN) && defined(__ppc64__)) +#define POWERPC64 +#endif + +#ifndef LIBFFI_ASM + +typedef unsigned long ffi_arg; +typedef signed long ffi_sarg; + +typedef enum ffi_abi { + FFI_FIRST_ABI = 0, + +#ifdef POWERPC + FFI_SYSV, + FFI_GCC_SYSV, + FFI_LINUX64, +# ifdef POWERPC64 + FFI_DEFAULT_ABI = FFI_LINUX64, +# else + FFI_DEFAULT_ABI = FFI_GCC_SYSV, +# endif +#endif + +#ifdef POWERPC_AIX + FFI_AIX, + FFI_DARWIN, + FFI_DEFAULT_ABI = FFI_AIX, +#endif + +#ifdef POWERPC_DARWIN + FFI_AIX, + FFI_DARWIN, + FFI_DEFAULT_ABI = FFI_DARWIN, +#endif + +#ifdef POWERPC_FREEBSD + FFI_SYSV, + FFI_GCC_SYSV, + FFI_LINUX64, + FFI_DEFAULT_ABI = FFI_SYSV, +#endif + + FFI_LAST_ABI = FFI_DEFAULT_ABI + 1 +} ffi_abi; + +#endif // #ifndef LIBFFI_ASM + +/* ---- Definitions for closures ----------------------------------------- */ + +#define FFI_CLOSURES 1 +#define FFI_NATIVE_RAW_API 0 + +/* Needed for FFI_SYSV small structure returns. */ +#define FFI_SYSV_TYPE_SMALL_STRUCT (FFI_TYPE_LAST) + +#if defined(POWERPC64) /*|| defined(POWERPC_AIX)*/ +# define FFI_TRAMPOLINE_SIZE 48 +#elif defined(POWERPC_AIX) +# define FFI_TRAMPOLINE_SIZE 24 +#else +# define FFI_TRAMPOLINE_SIZE 40 +#endif + +#ifndef LIBFFI_ASM +# if defined(POWERPC_DARWIN) || defined(POWERPC_AIX) +typedef struct ffi_aix_trampoline_struct { + void* code_pointer; /* Pointer to ffi_closure_ASM */ + void* toc; /* TOC */ + void* static_chain; /* Pointer to closure */ +} ffi_aix_trampoline_struct; +# endif +#endif // #ifndef LIBFFI_ASM + +#endif // #ifndef LIBFFI_TARGET_H \ No newline at end of file diff -r -u ./Modules/_ctypes/libffi_osx/include/x86-ffitarget.h ./Modules/_ctypes/libffi_osx/include/x86-ffitarget.h new file mode 100644 index 0000000..55c2b6c --- /dev/null +++ ./Modules/_ctypes/libffi_osx/include/x86-ffitarget.h @@ -0,0 +1,88 @@ +/* -----------------------------------------------------------------*-C-*- + x86-ffitarget.h - Copyright (c) 1996-2003 Red Hat, Inc. + Target configuration macros for x86 and x86-64. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + ----------------------------------------------------------------------- */ + +#ifndef LIBFFI_TARGET_H +#define LIBFFI_TARGET_H + +/* ---- System specific configurations ----------------------------------- */ + +#if defined(X86_64) && defined(__i386__) +# undef X86_64 +# define X86 +#endif + +#if defined(__x86_64__) +# ifndef X86_64 +# define X86_64 +# endif +#endif + +/* ---- Generic type definitions ----------------------------------------- */ + +#ifndef LIBFFI_ASM + +typedef unsigned long ffi_arg; +typedef signed long ffi_sarg; + +typedef enum ffi_abi { + FFI_FIRST_ABI = 0, + + /* ---- Intel x86 Win32 ---------- */ +#ifdef X86_WIN32 + FFI_SYSV, + FFI_STDCALL, + /* TODO: Add fastcall support for the sake of completeness */ + FFI_DEFAULT_ABI = FFI_SYSV, +#endif + + /* ---- Intel x86 and AMD x86-64 - */ +#if !defined(X86_WIN32) && (defined(__i386__) || defined(__x86_64__)) + FFI_SYSV, + FFI_UNIX64, /* Unix variants all use the same ABI for x86-64 */ +# ifdef __i386__ + FFI_DEFAULT_ABI = FFI_SYSV, +# else + FFI_DEFAULT_ABI = FFI_UNIX64, +# endif +#endif + + FFI_LAST_ABI = FFI_DEFAULT_ABI + 1 +} ffi_abi; + +#endif // #ifndef LIBFFI_ASM + +/* ---- Definitions for closures ----------------------------------------- */ + +#define FFI_CLOSURES 1 + +#if defined(X86_64) || (defined(__x86_64__) && defined(X86_DARWIN)) +# define FFI_TRAMPOLINE_SIZE 24 +# define FFI_NATIVE_RAW_API 0 +#else +# define FFI_TRAMPOLINE_SIZE 10 +# define FFI_NATIVE_RAW_API 1 /* x86 has native raw api support */ +#endif + +#endif // #ifndef LIBFFI_TARGET_H \ No newline at end of file diff -r -u ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin.S ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin.S new file mode 100644 index 0000000..f143dbd --- /dev/null +++ ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin.S @@ -0,0 +1,365 @@ +#if defined(__ppc__) || defined(__ppc64__) + +/* ----------------------------------------------------------------------- + ppc-darwin.S - Copyright (c) 2000 John Hornkvist + Copyright (c) 2004 Free Software Foundation, Inc. + + PowerPC Assembly glue. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#define LIBFFI_ASM + +#include +#include +#include +#include + +.text + .align 2 +.globl _ffi_prep_args + +.text + .align 2 +.globl _ffi_call_DARWIN + +.text + .align 2 +_ffi_call_DARWIN: +LFB0: + mr r12,r8 /* We only need r12 until the call, + so it doesn't have to be saved. */ + +LFB1: + /* Save the old stack pointer as AP. */ + mr r8,r1 + +LCFI0: +#if defined(__ppc64__) + /* Allocate the stack space we need. + r4 (size of input data) + 48 bytes (linkage area) + 40 bytes (saved registers) + 8 bytes (extra FPR) + r4 + 96 bytes total + */ + + addi r4,r4,-96 // Add our overhead. + li r0,-32 // Align to 32 bytes. + and r4,r4,r0 +#endif + stgux r1,r1,r4 // Grow the stack. + mflr r9 + + /* Save registers we use. */ +#if defined(__ppc64__) + std r27,-40(r8) +#endif + stg r28,MODE_CHOICE(-16,-32)(r8) + stg r29,MODE_CHOICE(-12,-24)(r8) + stg r30,MODE_CHOICE(-8,-16)(r8) + stg r31,MODE_CHOICE(-4,-8)(r8) + stg r9,SF_RETURN(r8) /* return address */ +#if !defined(POWERPC_DARWIN) /* TOC unused in OS X */ + stg r2,MODE_CHOICE(20,40)(r1) +#endif + +LCFI1: +#if defined(__ppc64__) + mr r27,r3 // our extended_cif +#endif + /* Save arguments over call. */ + mr r31,r5 /* flags, */ + mr r30,r6 /* rvalue, */ + mr r29,r7 /* function address, */ + mr r28,r8 /* our AP. */ + +LCFI2: + /* Call ffi_prep_args. */ + mr r4,r1 + li r9,0 + mtctr r12 /* r12 holds address of _ffi_prep_args. */ + bctrl +#if !defined(POWERPC_DARWIN) /* TOC unused in OS X */ + lg r2,MODE_CHOICE(20,40)(r1) +#endif + + /* Now do the call. + Set up cr1 with bits 4-7 of the flags. */ + mtcrf 0x40,r31 + + /* Load all those argument registers. + We have set up a nice stack frame, just load it into registers. */ + lg r3,SF_ARG1(r1) + lg r4,SF_ARG2(r1) + lg r5,SF_ARG3(r1) + lg r6,SF_ARG4(r1) + nop + lg r7,SF_ARG5(r1) + lg r8,SF_ARG6(r1) + lg r9,SF_ARG7(r1) + lg r10,SF_ARG8(r1) + + /* Load all the FP registers. */ + bf 6,L2 /* No floats to load. */ +#if defined(__ppc64__) + lfd f1,MODE_CHOICE(-16,-40)-(14*8)(r28) + lfd f2,MODE_CHOICE(-16,-40)-(13*8)(r28) + lfd f3,MODE_CHOICE(-16,-40)-(12*8)(r28) + lfd f4,MODE_CHOICE(-16,-40)-(11*8)(r28) + nop + lfd f5,MODE_CHOICE(-16,-40)-(10*8)(r28) + lfd f6,MODE_CHOICE(-16,-40)-(9*8)(r28) + lfd f7,MODE_CHOICE(-16,-40)-(8*8)(r28) + lfd f8,MODE_CHOICE(-16,-40)-(7*8)(r28) + nop + lfd f9,MODE_CHOICE(-16,-40)-(6*8)(r28) + lfd f10,MODE_CHOICE(-16,-40)-(5*8)(r28) + lfd f11,MODE_CHOICE(-16,-40)-(4*8)(r28) + lfd f12,MODE_CHOICE(-16,-40)-(3*8)(r28) + nop + lfd f13,MODE_CHOICE(-16,-40)-(2*8)(r28) + lfd f14,MODE_CHOICE(-16,-40)-(1*8)(r28) +#elif defined(__ppc__) + lfd f1,MODE_CHOICE(-16,-40)-(13*8)(r28) + lfd f2,MODE_CHOICE(-16,-40)-(12*8)(r28) + lfd f3,MODE_CHOICE(-16,-40)-(11*8)(r28) + lfd f4,MODE_CHOICE(-16,-40)-(10*8)(r28) + nop + lfd f5,MODE_CHOICE(-16,-40)-(9*8)(r28) + lfd f6,MODE_CHOICE(-16,-40)-(8*8)(r28) + lfd f7,MODE_CHOICE(-16,-40)-(7*8)(r28) + lfd f8,MODE_CHOICE(-16,-40)-(6*8)(r28) + nop + lfd f9,MODE_CHOICE(-16,-40)-(5*8)(r28) + lfd f10,MODE_CHOICE(-16,-40)-(4*8)(r28) + lfd f11,MODE_CHOICE(-16,-40)-(3*8)(r28) + lfd f12,MODE_CHOICE(-16,-40)-(2*8)(r28) + nop + lfd f13,MODE_CHOICE(-16,-40)-(1*8)(r28) +#else +#error undefined architecture +#endif + +L2: + mr r12,r29 // Put the target address in r12 as specified. + mtctr r12 // Get the address to call into CTR. + nop + nop + bctrl // Make the call. + + // Deal with the return value. +#if defined(__ppc64__) + mtcrf 0x3,r31 // flags in cr6 and cr7 + bt 27,L(st_return_value) +#elif defined(__ppc__) + mtcrf 0x1,r31 // flags in cr7 +#else +#error undefined architecture +#endif + + bt 30,L(done_return_value) + bt 29,L(fp_return_value) + stg r3,0(r30) +#if defined(__ppc__) + bf 28,L(done_return_value) // Store the second long if necessary. + stg r4,4(r30) +#endif + // Fall through + +L(done_return_value): + lg r1,0(r1) // Restore stack pointer. + // Restore the registers we used. + lg r9,SF_RETURN(r1) // return address + lg r31,MODE_CHOICE(-4,-8)(r1) + mtlr r9 + lg r30,MODE_CHOICE(-8,-16)(r1) + lg r29,MODE_CHOICE(-12,-24)(r1) + lg r28,MODE_CHOICE(-16,-32)(r1) +#if defined(__ppc64__) + ld r27,-40(r1) +#endif + blr + +#if defined(__ppc64__) +L(st_return_value): + // Grow the stack enough to fit the registers. Leave room for 8 args + // to trample the 1st 8 slots in param area. + stgu r1,-SF_ROUND(280)(r1) // 64 + 104 + 48 + 64 + + // Store GPRs + std r3,SF_ARG9(r1) + std r4,SF_ARG10(r1) + std r5,SF_ARG11(r1) + std r6,SF_ARG12(r1) + nop + std r7,SF_ARG13(r1) + std r8,SF_ARG14(r1) + std r9,SF_ARG15(r1) + std r10,SF_ARG16(r1) + + // Store FPRs + nop + bf 26,L(call_struct_to_ram_form) + stfd f1,SF_ARG17(r1) + stfd f2,SF_ARG18(r1) + stfd f3,SF_ARG19(r1) + stfd f4,SF_ARG20(r1) + nop + stfd f5,SF_ARG21(r1) + stfd f6,SF_ARG22(r1) + stfd f7,SF_ARG23(r1) + stfd f8,SF_ARG24(r1) + nop + stfd f9,SF_ARG25(r1) + stfd f10,SF_ARG26(r1) + stfd f11,SF_ARG27(r1) + stfd f12,SF_ARG28(r1) + nop + stfd f13,SF_ARG29(r1) + +L(call_struct_to_ram_form): + ld r3,0(r27) // extended_cif->cif* + ld r3,16(r3) // ffi_cif->rtype* + addi r4,r1,SF_ARG9 // stored GPRs + addi r6,r1,SF_ARG17 // stored FPRs + li r5,0 // GPR size ptr (NULL) + li r7,0 // FPR size ptr (NULL) + li r8,0 // FPR count ptr (NULL) + li r10,0 // struct offset (NULL) + mr r9,r30 // return area + bl Lffi64_struct_to_ram_form$stub + lg r1,0(r1) // Restore stack pointer. + b L(done_return_value) +#endif + +L(fp_return_value): + /* Do we have long double to store? */ + bf 31,L(fd_return_value) + stfd f1,0(r30) + stfd f2,8(r30) + b L(done_return_value) + +L(fd_return_value): + /* Do we have double to store? */ + bf 28,L(float_return_value) + stfd f1,0(r30) + b L(done_return_value) + +L(float_return_value): + /* We only have a float to store. */ + stfs f1,0(r30) + b L(done_return_value) + +LFE1: +/* END(_ffi_call_DARWIN) */ + +/* Provide a null definition of _ffi_call_AIX. */ +.text + .align 2 +.globl _ffi_call_AIX +.text + .align 2 +_ffi_call_AIX: + blr +/* END(_ffi_call_AIX) */ + +.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms +EH_frame1: + .set L$set$0,LECIE1-LSCIE1 + .long L$set$0 ; Length of Common Information Entry +LSCIE1: + .long 0x0 ; CIE Identifier Tag + .byte 0x1 ; CIE Version + .ascii "zR\0" ; CIE Augmentation + .byte 0x1 ; uleb128 0x1; CIE Code Alignment Factor + .byte 0x7c ; sleb128 -4; CIE Data Alignment Factor + .byte 0x41 ; CIE RA Column + .byte 0x1 ; uleb128 0x1; Augmentation size + .byte 0x10 ; FDE Encoding (pcrel) + .byte 0xc ; DW_CFA_def_cfa + .byte 0x1 ; uleb128 0x1 + .byte 0x0 ; uleb128 0x0 + .align LOG2_GPR_BYTES +LECIE1: +.globl _ffi_call_DARWIN.eh +_ffi_call_DARWIN.eh: +LSFDE1: + .set L$set$1,LEFDE1-LASFDE1 + .long L$set$1 ; FDE Length + +LASFDE1: + .long LASFDE1-EH_frame1 ; FDE CIE offset + .g_long LFB0-. ; FDE initial location + .set L$set$3,LFE1-LFB0 + .g_long L$set$3 ; FDE address range + .byte 0x0 ; uleb128 0x0; Augmentation size + .byte 0x4 ; DW_CFA_advance_loc4 + .set L$set$4,LCFI0-LFB1 + .long L$set$4 + .byte 0xd ; DW_CFA_def_cfa_register + .byte 0x08 ; uleb128 0x08 + .byte 0x4 ; DW_CFA_advance_loc4 + .set L$set$5,LCFI1-LCFI0 + .long L$set$5 + .byte 0x11 ; DW_CFA_offset_extended_sf + .byte 0x41 ; uleb128 0x41 + .byte 0x7e ; sleb128 -2 + .byte 0x9f ; DW_CFA_offset, column 0x1f + .byte 0x1 ; uleb128 0x1 + .byte 0x9e ; DW_CFA_offset, column 0x1e + .byte 0x2 ; uleb128 0x2 + .byte 0x9d ; DW_CFA_offset, column 0x1d + .byte 0x3 ; uleb128 0x3 + .byte 0x9c ; DW_CFA_offset, column 0x1c + .byte 0x4 ; uleb128 0x4 + .byte 0x4 ; DW_CFA_advance_loc4 + .set L$set$6,LCFI2-LCFI1 + .long L$set$6 + .byte 0xd ; DW_CFA_def_cfa_register + .byte 0x1c ; uleb128 0x1c + .align LOG2_GPR_BYTES +LEFDE1: + +#if defined(__ppc64__) +.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 + .align LOG2_GPR_BYTES + +Lffi64_struct_to_ram_form$stub: + .indirect_symbol _ffi64_struct_to_ram_form + mflr r0 + bcl 20,31,LO$ffi64_struct_to_ram_form + +LO$ffi64_struct_to_ram_form: + mflr r11 + addis r11,r11,ha16(L_ffi64_struct_to_ram_form$lazy_ptr - LO$ffi64_struct_to_ram_form) + mtlr r0 + lgu r12,lo16(L_ffi64_struct_to_ram_form$lazy_ptr - LO$ffi64_struct_to_ram_form)(r11) + mtctr r12 + bctr + +.lazy_symbol_pointer +L_ffi64_struct_to_ram_form$lazy_ptr: + .indirect_symbol _ffi64_struct_to_ram_form + .g_long dyld_stub_binding_helper + +#endif // __ppc64__ +#endif // __ppc__ || __ppc64__ diff -r -u ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin.h ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin.h new file mode 100644 index 0000000..cf4bd50 --- /dev/null +++ ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin.h @@ -0,0 +1,85 @@ +/* ----------------------------------------------------------------------- + ppc-darwin.h - Copyright (c) 2002, 2003, 2004, Free Software Foundation, + Inc. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#define L(x) x + +#define SF_ARG9 MODE_CHOICE(56,112) +#define SF_ARG10 MODE_CHOICE(60,120) +#define SF_ARG11 MODE_CHOICE(64,128) +#define SF_ARG12 MODE_CHOICE(68,136) +#define SF_ARG13 MODE_CHOICE(72,144) +#define SF_ARG14 MODE_CHOICE(76,152) +#define SF_ARG15 MODE_CHOICE(80,160) +#define SF_ARG16 MODE_CHOICE(84,168) +#define SF_ARG17 MODE_CHOICE(88,176) +#define SF_ARG18 MODE_CHOICE(92,184) +#define SF_ARG19 MODE_CHOICE(96,192) +#define SF_ARG20 MODE_CHOICE(100,200) +#define SF_ARG21 MODE_CHOICE(104,208) +#define SF_ARG22 MODE_CHOICE(108,216) +#define SF_ARG23 MODE_CHOICE(112,224) +#define SF_ARG24 MODE_CHOICE(116,232) +#define SF_ARG25 MODE_CHOICE(120,240) +#define SF_ARG26 MODE_CHOICE(124,248) +#define SF_ARG27 MODE_CHOICE(128,256) +#define SF_ARG28 MODE_CHOICE(132,264) +#define SF_ARG29 MODE_CHOICE(136,272) + +#define ASM_NEEDS_REGISTERS 4 +#define NUM_GPR_ARG_REGISTERS 8 +#define NUM_FPR_ARG_REGISTERS 13 + +#define FFI_TYPE_1_BYTE(x) ((x) == FFI_TYPE_UINT8 || (x) == FFI_TYPE_SINT8) +#define FFI_TYPE_2_BYTE(x) ((x) == FFI_TYPE_UINT16 || (x) == FFI_TYPE_SINT16) +#define FFI_TYPE_4_BYTE(x) \ + ((x) == FFI_TYPE_UINT32 || (x) == FFI_TYPE_SINT32 ||\ + (x) == FFI_TYPE_INT || (x) == FFI_TYPE_FLOAT) + +#if !defined(LIBFFI_ASM) + +enum { + FLAG_RETURNS_NOTHING = 1 << (31 - 30), // cr7 + FLAG_RETURNS_FP = 1 << (31 - 29), + FLAG_RETURNS_64BITS = 1 << (31 - 28), + FLAG_RETURNS_128BITS = 1 << (31 - 31), + + FLAG_RETURNS_STRUCT = 1 << (31 - 27), // cr6 + FLAG_STRUCT_CONTAINS_FP = 1 << (31 - 26), + + FLAG_ARG_NEEDS_COPY = 1 << (31 - 7), + FLAG_FP_ARGUMENTS = 1 << (31 - 6), // cr1.eq; specified by ABI + FLAG_4_GPR_ARGUMENTS = 1 << (31 - 5), + FLAG_RETVAL_REFERENCE = 1 << (31 - 4) +}; + +#if defined(__ppc64__) +void ffi64_struct_to_ram_form(const ffi_type*, const char*, unsigned int*, + const char*, unsigned int*, unsigned int*, char*, unsigned int*); +void ffi64_struct_to_reg_form(const ffi_type*, const char*, unsigned int*, + unsigned int*, char*, unsigned int*, char*, unsigned int*); +bool ffi64_stret_needs_ptr(const ffi_type* inType, + unsigned short*, unsigned short*); +#endif + +#endif // !defined(LIBFFI_ASM) \ No newline at end of file diff -r -u ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin_closure.S ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin_closure.S new file mode 100644 index 0000000..c3d30c2 --- /dev/null +++ ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin_closure.S @@ -0,0 +1,308 @@ +#if defined(__ppc__) + +/* ----------------------------------------------------------------------- + ppc-darwin_closure.S - Copyright (c) 2002, 2003, 2004, Free Software Foundation, + Inc. based on ppc_closure.S + + PowerPC Assembly glue. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#define LIBFFI_ASM + +#include +#include // for FFI_TRAMPOLINE_SIZE +#include +#include + + .file "ppc-darwin_closure.S" +.text + .align LOG2_GPR_BYTES + .globl _ffi_closure_ASM + +.text + .align LOG2_GPR_BYTES + +_ffi_closure_ASM: +LFB1: + mflr r0 // Save return address + stg r0,SF_RETURN(r1) + +LCFI0: + /* 24/48 bytes (Linkage Area) + 32/64 bytes (outgoing parameter area, always reserved) + 104 bytes (13*8 from FPR) + 16/32 bytes (result) + 176/232 total bytes */ + + /* skip over caller save area and keep stack aligned to 16/32. */ + stgu r1,-SF_ROUND(176)(r1) + +LCFI1: + /* We want to build up an area for the parameters passed + in registers. (both floating point and integer) */ + + /* 176/256 bytes (callee stack frame aligned to 16/32) + 24/48 bytes (caller linkage area) + 200/304 (start of caller parameter area aligned to 4/8) + */ + + /* Save GPRs 3 - 10 (aligned to 4/8) + in the parents outgoing area. */ + stg r3,200(r1) + stg r4,204(r1) + stg r5,208(r1) + stg r6,212(r1) + stg r7,216(r1) + stg r8,220(r1) + stg r9,224(r1) + stg r10,228(r1) + + /* Save FPRs 1 - 13. (aligned to 8) */ + stfd f1,56(r1) + stfd f2,64(r1) + stfd f3,72(r1) + stfd f4,80(r1) + stfd f5,88(r1) + stfd f6,96(r1) + stfd f7,104(r1) + stfd f8,112(r1) + stfd f9,120(r1) + stfd f10,128(r1) + stfd f11,136(r1) + stfd f12,144(r1) + stfd f13,152(r1) + + // Set up registers for the routine that actually does the work. + mr r3,r11 // context pointer from the trampoline + addi r4,r1,160 // result storage + addi r5,r1,200 // saved GPRs + addi r6,r1,56 // saved FPRs + bl Lffi_closure_helper_DARWIN$stub + + /* Now r3 contains the return type. Use it to look up in a table + so we know how to deal with each type. */ + addi r5,r1,160 // Copy result storage pointer. + bl Lget_ret_type0_addr // Get pointer to Lret_type0 into LR. + mflr r4 // Move to r4. + slwi r3,r3,4 // Multiply return type by 16. + add r3,r3,r4 // Add contents of table to table address. + mtctr r3 + bctr + +LFE1: +/* Each of the ret_typeX code fragments has to be exactly 16 bytes long + (4 instructions). For cache effectiveness we align to a 16 byte boundary + first. */ + .align 4 + nop + nop + nop + +Lget_ret_type0_addr: + blrl + +/* case FFI_TYPE_VOID */ +Lret_type0: + b Lfinish + nop + nop + nop + +/* case FFI_TYPE_INT */ +Lret_type1: + lwz r3,0(r5) + b Lfinish + nop + nop + +/* case FFI_TYPE_FLOAT */ +Lret_type2: + lfs f1,0(r5) + b Lfinish + nop + nop + +/* case FFI_TYPE_DOUBLE */ +Lret_type3: + lfd f1,0(r5) + b Lfinish + nop + nop + +/* case FFI_TYPE_LONGDOUBLE */ +Lret_type4: + lfd f1,0(r5) + lfd f2,8(r5) + b Lfinish + nop + +/* case FFI_TYPE_UINT8 */ +Lret_type5: + lbz r3,3(r5) + b Lfinish + nop + nop + +/* case FFI_TYPE_SINT8 */ +Lret_type6: + lbz r3,3(r5) + extsb r3,r3 + b Lfinish + nop + +/* case FFI_TYPE_UINT16 */ +Lret_type7: + lhz r3,2(r5) + b Lfinish + nop + nop + +/* case FFI_TYPE_SINT16 */ +Lret_type8: + lha r3,2(r5) + b Lfinish + nop + nop + +/* case FFI_TYPE_UINT32 */ +Lret_type9: // same as Lret_type1 + lwz r3,0(r5) + b Lfinish + nop + nop + +/* case FFI_TYPE_SINT32 */ +Lret_type10: // same as Lret_type1 + lwz r3,0(r5) + b Lfinish + nop + nop + +/* case FFI_TYPE_UINT64 */ +Lret_type11: + lwz r3,0(r5) + lwz r4,4(r5) + b Lfinish + nop + +/* case FFI_TYPE_SINT64 */ +Lret_type12: // same as Lret_type11 + lwz r3,0(r5) + lwz r4,4(r5) + b Lfinish + nop + +/* case FFI_TYPE_STRUCT */ +Lret_type13: + b Lfinish + nop + nop + nop + +/* End 16-byte aligned cases */ +/* case FFI_TYPE_POINTER */ +// This case assumes that FFI_TYPE_POINTER == FFI_TYPE_LAST. If more types +// are added in future, the following code will need to be updated and +// padded to 16 bytes. +Lret_type14: + lg r3,0(r5) + // fall through + +/* case done */ +Lfinish: + addi r1,r1,SF_ROUND(176) // Restore stack pointer. + lg r0,SF_RETURN(r1) // Restore return address. + mtlr r0 // Restore link register. + blr + +/* END(ffi_closure_ASM) */ + +.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support +EH_frame1: + .set L$set$0,LECIE1-LSCIE1 + .long L$set$0 ; Length of Common Information Entry +LSCIE1: + .long 0x0 ; CIE Identifier Tag + .byte 0x1 ; CIE Version + .ascii "zR\0" ; CIE Augmentation + .byte 0x1 ; uleb128 0x1; CIE Code Alignment Factor + .byte 0x7c ; sleb128 -4; CIE Data Alignment Factor + .byte 0x41 ; CIE RA Column + .byte 0x1 ; uleb128 0x1; Augmentation size + .byte 0x10 ; FDE Encoding (pcrel) + .byte 0xc ; DW_CFA_def_cfa + .byte 0x1 ; uleb128 0x1 + .byte 0x0 ; uleb128 0x0 + .align LOG2_GPR_BYTES +LECIE1: +.globl _ffi_closure_ASM.eh +_ffi_closure_ASM.eh: +LSFDE1: + .set L$set$1,LEFDE1-LASFDE1 + .long L$set$1 ; FDE Length + +LASFDE1: + .long LASFDE1-EH_frame1 ; FDE CIE offset + .g_long LFB1-. ; FDE initial location + .set L$set$3,LFE1-LFB1 + .g_long L$set$3 ; FDE address range + .byte 0x0 ; uleb128 0x0; Augmentation size + .byte 0x4 ; DW_CFA_advance_loc4 + .set L$set$3,LCFI1-LCFI0 + .long L$set$3 + .byte 0xe ; DW_CFA_def_cfa_offset + .byte 176,1 ; uleb128 176 + .byte 0x4 ; DW_CFA_advance_loc4 + .set L$set$4,LCFI0-LFB1 + .long L$set$4 + .byte 0x11 ; DW_CFA_offset_extended_sf + .byte 0x41 ; uleb128 0x41 + .byte 0x7e ; sleb128 -2 + .align LOG2_GPR_BYTES + +LEFDE1: +.data + .align LOG2_GPR_BYTES +LDFCM0: +.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 + .align LOG2_GPR_BYTES + +Lffi_closure_helper_DARWIN$stub: + .indirect_symbol _ffi_closure_helper_DARWIN + mflr r0 + bcl 20,31,LO$ffi_closure_helper_DARWIN + +LO$ffi_closure_helper_DARWIN: + mflr r11 + addis r11,r11,ha16(L_ffi_closure_helper_DARWIN$lazy_ptr - LO$ffi_closure_helper_DARWIN) + mtlr r0 + lgu r12,lo16(L_ffi_closure_helper_DARWIN$lazy_ptr - LO$ffi_closure_helper_DARWIN)(r11) + mtctr r12 + bctr + +.lazy_symbol_pointer +L_ffi_closure_helper_DARWIN$lazy_ptr: + .indirect_symbol _ffi_closure_helper_DARWIN + .g_long dyld_stub_binding_helper + + +#endif // __ppc__ diff -r -u ./Modules/_ctypes/libffi_osx/powerpc/ppc-ffi_darwin.c ./Modules/_ctypes/libffi_osx/powerpc/ppc-ffi_darwin.c new file mode 100644 index 0000000..8953d5f --- /dev/null +++ ./Modules/_ctypes/libffi_osx/powerpc/ppc-ffi_darwin.c @@ -0,0 +1,1776 @@ +#if defined(__ppc__) || defined(__ppc64__) + +/* ----------------------------------------------------------------------- + ffi.c - Copyright (c) 1998 Geoffrey Keating + + PowerPC Foreign Function Interface + + Darwin ABI support (c) 2001 John Hornkvist + AIX ABI support (c) 2002 Free Software Foundation, Inc. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#include +#include + +#include +#include +#include +#include +#include + +#if 0 +#if defined(POWERPC_DARWIN) +#include // for sys_icache_invalidate() +#endif + +#else + +#pragma weak sys_icache_invalidate +extern void sys_icache_invalidate(void *start, size_t len); + +#endif + + +extern void ffi_closure_ASM(void); + +// The layout of a function descriptor. A C function pointer really +// points to one of these. +typedef struct aix_fd_struct { + void* code_pointer; + void* toc; +} aix_fd; + +/* ffi_prep_args is called by the assembly routine once stack space + has been allocated for the function's arguments. + + The stack layout we want looks like this: + + | Return address from ffi_call_DARWIN | higher addresses + |--------------------------------------------| + | Previous backchain pointer 4/8 | stack pointer here + |--------------------------------------------|-\ <<< on entry to + | Saved r28-r31 (4/8)*4 | | ffi_call_DARWIN + |--------------------------------------------| | + | Parameters (at least 8*(4/8)=32/64) | | (176) +112 - +288 + |--------------------------------------------| | + | Space for GPR2 4/8 | | + |--------------------------------------------| | stack | + | Reserved (4/8)*2 | | grows | + |--------------------------------------------| | down V + | Space for callee's LR 4/8 | | + |--------------------------------------------| | lower addresses + | Saved CR 4/8 | | + |--------------------------------------------| | stack pointer here + | Current backchain pointer 4/8 | | during + |--------------------------------------------|-/ <<< ffi_call_DARWIN + + Note: ppc64 CR is saved in the low word of a long on the stack. +*/ + +/*@-exportheader@*/ +void +ffi_prep_args( + extended_cif* inEcif, + unsigned *const stack) +/*@=exportheader@*/ +{ + /* Copy the ecif to a local var so we can trample the arg. + BC note: test this with GP later for possible problems... */ + volatile extended_cif* ecif = inEcif; + + const unsigned bytes = ecif->cif->bytes; + const unsigned flags = ecif->cif->flags; + + /* Cast the stack arg from int* to long*. sizeof(long) == 4 in 32-bit mode + and 8 in 64-bit mode. */ + unsigned long *const longStack = (unsigned long *const)stack; + + /* 'stacktop' points at the previous backchain pointer. */ +#if defined(__ppc64__) + // In ppc-darwin.s, an extra 96 bytes is reserved for the linkage area, + // saved registers, and an extra FPR. + unsigned long *const stacktop = + (unsigned long *)(unsigned long)((char*)longStack + bytes + 96); +#elif defined(__ppc__) + unsigned long *const stacktop = longStack + (bytes / sizeof(long)); +#else +#error undefined architecture +#endif + + /* 'fpr_base' points at the space for fpr1, and grows upwards as + we use FPR registers. */ + double* fpr_base = (double*)(stacktop - ASM_NEEDS_REGISTERS) - + NUM_FPR_ARG_REGISTERS; + +#if defined(__ppc64__) + // 64-bit saves an extra register, and uses an extra FPR. Knock fpr_base + // down a couple pegs. + fpr_base -= 2; +#endif + + unsigned int fparg_count = 0; + + /* 'next_arg' grows up as we put parameters in it. */ + unsigned long* next_arg = longStack + 6; /* 6 reserved positions. */ + + int i; + double double_tmp; + void** p_argv = ecif->avalue; + unsigned long gprvalue; + ffi_type** ptr = ecif->cif->arg_types; + + /* Check that everything starts aligned properly. */ + FFI_ASSERT(stack == SF_ROUND(stack)); + FFI_ASSERT(stacktop == SF_ROUND(stacktop)); + FFI_ASSERT(bytes == SF_ROUND(bytes)); + + /* Deal with return values that are actually pass-by-reference. + Rule: + Return values are referenced by r3, so r4 is the first parameter. */ + + if (flags & FLAG_RETVAL_REFERENCE) + *next_arg++ = (unsigned long)(char*)ecif->rvalue; + + /* Now for the arguments. */ + for (i = ecif->cif->nargs; i > 0; i--, ptr++, p_argv++) + { + switch ((*ptr)->type) + { + /* If a floating-point parameter appears before all of the general- + purpose registers are filled, the corresponding GPRs that match + the size of the floating-point parameter are shadowed for the + benefit of vararg and pre-ANSI functions. */ + case FFI_TYPE_FLOAT: + double_tmp = *(float*)*p_argv; + + if (fparg_count < NUM_FPR_ARG_REGISTERS) + *fpr_base++ = double_tmp; + + *(double*)next_arg = double_tmp; + + next_arg++; + fparg_count++; + FFI_ASSERT(flags & FLAG_FP_ARGUMENTS); + + break; + + case FFI_TYPE_DOUBLE: + double_tmp = *(double*)*p_argv; + + if (fparg_count < NUM_FPR_ARG_REGISTERS) + *fpr_base++ = double_tmp; + + *(double*)next_arg = double_tmp; + + next_arg += MODE_CHOICE(2,1); + fparg_count++; + FFI_ASSERT(flags & FLAG_FP_ARGUMENTS); + + break; + +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + case FFI_TYPE_LONGDOUBLE: +#if defined(__ppc64__) + if (fparg_count < NUM_FPR_ARG_REGISTERS) + *(long double*)fpr_base = *(long double*)*p_argv; +#elif defined(__ppc__) + if (fparg_count < NUM_FPR_ARG_REGISTERS - 1) + *(long double*)fpr_base = *(long double*)*p_argv; + else if (fparg_count == NUM_FPR_ARG_REGISTERS - 1) + *(double*)fpr_base = *(double*)*p_argv; +#else +#error undefined architecture +#endif + + *(long double*)next_arg = *(long double*)*p_argv; + fparg_count += 2; + fpr_base += 2; + next_arg += MODE_CHOICE(4,2); + FFI_ASSERT(flags & FLAG_FP_ARGUMENTS); + + break; +#endif // FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: +#if defined(__ppc64__) + gprvalue = *(long long*)*p_argv; + goto putgpr; +#elif defined(__ppc__) + *(long long*)next_arg = *(long long*)*p_argv; + next_arg += 2; + break; +#else +#error undefined architecture +#endif + + case FFI_TYPE_POINTER: + gprvalue = *(unsigned long*)*p_argv; + goto putgpr; + + case FFI_TYPE_UINT8: + gprvalue = *(unsigned char*)*p_argv; + goto putgpr; + + case FFI_TYPE_SINT8: + gprvalue = *(signed char*)*p_argv; + goto putgpr; + + case FFI_TYPE_UINT16: + gprvalue = *(unsigned short*)*p_argv; + goto putgpr; + + case FFI_TYPE_SINT16: + gprvalue = *(signed short*)*p_argv; + goto putgpr; + + case FFI_TYPE_STRUCT: + { +#if defined(__ppc64__) + unsigned int gprSize = 0; + unsigned int fprSize = 0; + + ffi64_struct_to_reg_form(*ptr, (char*)*p_argv, NULL, &fparg_count, + (char*)next_arg, &gprSize, (char*)fpr_base, &fprSize); + next_arg += gprSize / sizeof(long); + fpr_base += fprSize / sizeof(double); + +#elif defined(__ppc__) + char* dest_cpy = (char*)next_arg; + + /* Structures that match the basic modes (QI 1 byte, HI 2 bytes, + SI 4 bytes) are aligned as if they were those modes. + Structures with 3 byte in size are padded upwards. */ + unsigned size_al = (*ptr)->size; + + /* If the first member of the struct is a double, then align + the struct to double-word. */ + if ((*ptr)->elements[0]->type == FFI_TYPE_DOUBLE) + size_al = ALIGN((*ptr)->size, 8); + + if (ecif->cif->abi == FFI_DARWIN) + { + if (size_al < 3) + dest_cpy += 4 - size_al; + } + + memcpy((char*)dest_cpy, (char*)*p_argv, size_al); + next_arg += (size_al + 3) / 4; +#else +#error undefined architecture +#endif + break; + } + + case FFI_TYPE_INT: + case FFI_TYPE_UINT32: + case FFI_TYPE_SINT32: + gprvalue = *(unsigned*)*p_argv; + +putgpr: + *next_arg++ = gprvalue; + break; + + default: + break; + } + } + + /* Check that we didn't overrun the stack... */ + //FFI_ASSERT(gpr_base <= stacktop - ASM_NEEDS_REGISTERS); + //FFI_ASSERT((unsigned *)fpr_base + // <= stacktop - ASM_NEEDS_REGISTERS - NUM_GPR_ARG_REGISTERS); + //FFI_ASSERT(flags & FLAG_4_GPR_ARGUMENTS || intarg_count <= 4); +} + +#if defined(__ppc64__) + +bool +ffi64_struct_contains_fp( + const ffi_type* inType) +{ + bool containsFP = false; + unsigned int i; + + for (i = 0; inType->elements[i] != NULL && !containsFP; i++) + { + if (inType->elements[i]->type == FFI_TYPE_FLOAT || + inType->elements[i]->type == FFI_TYPE_DOUBLE || + inType->elements[i]->type == FFI_TYPE_LONGDOUBLE) + containsFP = true; + else if (inType->elements[i]->type == FFI_TYPE_STRUCT) + containsFP = ffi64_struct_contains_fp(inType->elements[i]); + } + + return containsFP; +} + +#endif // defined(__ppc64__) + +/* Perform machine dependent cif processing. */ +ffi_status +ffi_prep_cif_machdep( + ffi_cif* cif) +{ + /* All this is for the DARWIN ABI. */ + int i; + ffi_type** ptr; + int intarg_count = 0; + int fparg_count = 0; + unsigned int flags = 0; + unsigned int size_al = 0; + + /* All the machine-independent calculation of cif->bytes will be wrong. + Redo the calculation for DARWIN. */ + + /* Space for the frame pointer, callee's LR, CR, etc, and for + the asm's temp regs. */ + unsigned int bytes = (6 + ASM_NEEDS_REGISTERS) * sizeof(long); + + /* Return value handling. The rules are as follows: + - 32-bit (or less) integer values are returned in gpr3; + - Structures of size <= 4 bytes also returned in gpr3; + - 64-bit integer values and structures between 5 and 8 bytes are + returned in gpr3 and gpr4; + - Single/double FP values are returned in fpr1; + - Long double FP (if not equivalent to double) values are returned in + fpr1 and fpr2; + - Larger structures values are allocated space and a pointer is passed + as the first argument. */ + switch (cif->rtype->type) + { +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + case FFI_TYPE_LONGDOUBLE: + flags |= FLAG_RETURNS_128BITS; + flags |= FLAG_RETURNS_FP; + break; +#endif // FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + + case FFI_TYPE_DOUBLE: + flags |= FLAG_RETURNS_64BITS; + /* Fall through. */ + case FFI_TYPE_FLOAT: + flags |= FLAG_RETURNS_FP; + break; + +#if defined(__ppc64__) + case FFI_TYPE_POINTER: +#endif + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + flags |= FLAG_RETURNS_64BITS; + break; + + case FFI_TYPE_STRUCT: + { +#if defined(__ppc64__) + + if (ffi64_stret_needs_ptr(cif->rtype, NULL, NULL)) + { + flags |= FLAG_RETVAL_REFERENCE; + flags |= FLAG_RETURNS_NOTHING; + intarg_count++; + } + else + { + flags |= FLAG_RETURNS_STRUCT; + + if (ffi64_struct_contains_fp(cif->rtype)) + flags |= FLAG_STRUCT_CONTAINS_FP; + } + +#elif defined(__ppc__) + + flags |= FLAG_RETVAL_REFERENCE; + flags |= FLAG_RETURNS_NOTHING; + intarg_count++; + +#else +#error undefined architecture +#endif + break; + } + + case FFI_TYPE_VOID: + flags |= FLAG_RETURNS_NOTHING; + break; + + default: + /* Returns 32-bit integer, or similar. Nothing to do here. */ + break; + } + + /* The first NUM_GPR_ARG_REGISTERS words of integer arguments, and the + first NUM_FPR_ARG_REGISTERS fp arguments, go in registers; the rest + goes on the stack. Structures are passed as a pointer to a copy of + the structure. Stuff on the stack needs to keep proper alignment. */ + for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++) + { + switch ((*ptr)->type) + { + case FFI_TYPE_FLOAT: + case FFI_TYPE_DOUBLE: + fparg_count++; + /* If this FP arg is going on the stack, it must be + 8-byte-aligned. */ + if (fparg_count > NUM_FPR_ARG_REGISTERS + && intarg_count % 2 != 0) + intarg_count++; + break; + +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + case FFI_TYPE_LONGDOUBLE: + fparg_count += 2; + /* If this FP arg is going on the stack, it must be + 8-byte-aligned. */ + + if ( +#if defined(__ppc64__) + fparg_count > NUM_FPR_ARG_REGISTERS + 1 +#elif defined(__ppc__) + fparg_count > NUM_FPR_ARG_REGISTERS +#else +#error undefined architecture +#endif + && intarg_count % 2 != 0) + intarg_count++; + + intarg_count += 2; + break; +#endif // FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + /* 'long long' arguments are passed as two words, but + either both words must fit in registers or both go + on the stack. If they go on the stack, they must + be 8-byte-aligned. */ + if (intarg_count == NUM_GPR_ARG_REGISTERS - 1 + || (intarg_count >= NUM_GPR_ARG_REGISTERS + && intarg_count % 2 != 0)) + intarg_count++; + + intarg_count += MODE_CHOICE(2,1); + + break; + + case FFI_TYPE_STRUCT: + size_al = (*ptr)->size; + /* If the first member of the struct is a double, then align + the struct to double-word. */ + if ((*ptr)->elements[0]->type == FFI_TYPE_DOUBLE) + size_al = ALIGN((*ptr)->size, 8); + +#if defined(__ppc64__) + // Look for FP struct members. + unsigned int j; + + for (j = 0; (*ptr)->elements[j] != NULL; j++) + { + if ((*ptr)->elements[j]->type == FFI_TYPE_FLOAT || + (*ptr)->elements[j]->type == FFI_TYPE_DOUBLE) + { + fparg_count++; + + if (fparg_count > NUM_FPR_ARG_REGISTERS) + intarg_count++; + } + else if ((*ptr)->elements[j]->type == FFI_TYPE_LONGDOUBLE) + { + fparg_count += 2; + + if (fparg_count > NUM_FPR_ARG_REGISTERS + 1) + intarg_count += 2; + } + else + intarg_count++; + } +#elif defined(__ppc__) + intarg_count += (size_al + 3) / 4; +#else +#error undefined architecture +#endif + + break; + + default: + /* Everything else is passed as a 4/8-byte word in a GPR, either + the object itself or a pointer to it. */ + intarg_count++; + break; + } + } + + /* Space for the FPR registers, if needed. */ + if (fparg_count != 0) + { + flags |= FLAG_FP_ARGUMENTS; +#if defined(__ppc64__) + bytes += (NUM_FPR_ARG_REGISTERS + 1) * sizeof(double); +#elif defined(__ppc__) + bytes += NUM_FPR_ARG_REGISTERS * sizeof(double); +#else +#error undefined architecture +#endif + } + + /* Stack space. */ +#if defined(__ppc64__) + if ((intarg_count + fparg_count) > NUM_GPR_ARG_REGISTERS) + bytes += (intarg_count + fparg_count) * sizeof(long); +#elif defined(__ppc__) + if ((intarg_count + 2 * fparg_count) > NUM_GPR_ARG_REGISTERS) + bytes += (intarg_count + 2 * fparg_count) * sizeof(long); +#else +#error undefined architecture +#endif + else + bytes += NUM_GPR_ARG_REGISTERS * sizeof(long); + + /* The stack space allocated needs to be a multiple of 16/32 bytes. */ + bytes = SF_ROUND(bytes); + + cif->flags = flags; + cif->bytes = bytes; + + return FFI_OK; +} + +/*@-declundef@*/ +/*@-exportheader@*/ +extern void +ffi_call_AIX( +/*@out@*/ extended_cif*, + unsigned, + unsigned, +/*@out@*/ unsigned*, + void (*fn)(void), + void (*fn2)(extended_cif*, unsigned *const)); + +extern void +ffi_call_DARWIN( +/*@out@*/ extended_cif*, + unsigned long, + unsigned, +/*@out@*/ unsigned*, + void (*fn)(void), + void (*fn2)(extended_cif*, unsigned *const)); +/*@=declundef@*/ +/*@=exportheader@*/ + +void +ffi_call( +/*@dependent@*/ ffi_cif* cif, + void (*fn)(void), +/*@out@*/ void* rvalue, +/*@dependent@*/ void** avalue) +{ + extended_cif ecif; + + ecif.cif = cif; + ecif.avalue = avalue; + + /* If the return value is a struct and we don't have a return + value address then we need to make one. */ + if ((rvalue == NULL) && + (cif->rtype->type == FFI_TYPE_STRUCT)) + { + /*@-sysunrecog@*/ + ecif.rvalue = alloca(cif->rtype->size); + /*@=sysunrecog@*/ + } + else + ecif.rvalue = rvalue; + + switch (cif->abi) + { + case FFI_AIX: + /*@-usedef@*/ + ffi_call_AIX(&ecif, -cif->bytes, + cif->flags, ecif.rvalue, fn, ffi_prep_args); + /*@=usedef@*/ + break; + + case FFI_DARWIN: + /*@-usedef@*/ + ffi_call_DARWIN(&ecif, -(long)cif->bytes, + cif->flags, ecif.rvalue, fn, ffi_prep_args); + /*@=usedef@*/ + break; + + default: + FFI_ASSERT(0); + break; + } +} + +/* here I'd like to add the stack frame layout we use in darwin_closure.S + and aix_clsoure.S + + SP previous -> +---------------------------------------+ <--- child frame + | back chain to caller 4 | + +---------------------------------------+ 4 + | saved CR 4 | + +---------------------------------------+ 8 + | saved LR 4 | + +---------------------------------------+ 12 + | reserved for compilers 4 | + +---------------------------------------+ 16 + | reserved for binders 4 | + +---------------------------------------+ 20 + | saved TOC pointer 4 | + +---------------------------------------+ 24 + | always reserved 8*4=32 (previous GPRs)| + | according to the linkage convention | + | from AIX | + +---------------------------------------+ 56 + | our FPR area 13*8=104 | + | f1 | + | . | + | f13 | + +---------------------------------------+ 160 + | result area 8 | + +---------------------------------------+ 168 + | alignement to the next multiple of 16 | +SP current --> +---------------------------------------+ 176 <- parent frame + | back chain to caller 4 | + +---------------------------------------+ 180 + | saved CR 4 | + +---------------------------------------+ 184 + | saved LR 4 | + +---------------------------------------+ 188 + | reserved for compilers 4 | + +---------------------------------------+ 192 + | reserved for binders 4 | + +---------------------------------------+ 196 + | saved TOC pointer 4 | + +---------------------------------------+ 200 + | always reserved 8*4=32 we store our | + | GPRs here | + | r3 | + | . | + | r10 | + +---------------------------------------+ 232 + | overflow part | + +---------------------------------------+ xxx + | ???? | + +---------------------------------------+ xxx +*/ + +#if !defined(POWERPC_DARWIN) + +#define MIN_LINE_SIZE 32 + +static void +flush_icache( + char* addr) +{ +#ifndef _AIX + __asm__ volatile ( + "dcbf 0,%0\n" + "sync\n" + "icbi 0,%0\n" + "sync\n" + "isync" + : : "r" (addr) : "memory"); +#endif +} + +static void +flush_range( + char* addr, + int size) +{ + int i; + + for (i = 0; i < size; i += MIN_LINE_SIZE) + flush_icache(addr + i); + + flush_icache(addr + size - 1); +} + +#endif // !defined(POWERPC_DARWIN) + +ffi_status +ffi_prep_closure( + ffi_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif*, void*, void**, void*), + void* user_data) +{ + switch (cif->abi) + { + case FFI_DARWIN: + { + FFI_ASSERT (cif->abi == FFI_DARWIN); + + unsigned int* tramp = (unsigned int*)&closure->tramp[0]; + +#if defined(__ppc64__) + tramp[0] = 0x7c0802a6; // mflr r0 + tramp[1] = 0x429f0005; // bcl 20,31,+0x8 + tramp[2] = 0x7d6802a6; // mflr r11 + tramp[3] = 0x7c0803a6; // mtlr r0 + tramp[4] = 0xe98b0018; // ld r12,24(r11) + tramp[5] = 0x7d8903a6; // mtctr r12 + tramp[6] = 0xe96b0020; // ld r11,32(r11) + tramp[7] = 0x4e800420; // bctr + *(unsigned long*)&tramp[8] = (unsigned long)ffi_closure_ASM; + *(unsigned long*)&tramp[10] = (unsigned long)closure; +#elif defined(__ppc__) + tramp[0] = 0x7c0802a6; // mflr r0 + tramp[1] = 0x429f0005; // bcl 20,31,+0x8 + tramp[2] = 0x7d6802a6; // mflr r11 + tramp[3] = 0x7c0803a6; // mtlr r0 + tramp[4] = 0x818b0018; // lwz r12,24(r11) + tramp[5] = 0x7d8903a6; // mtctr r12 + tramp[6] = 0x816b001c; // lwz r11,28(r11) + tramp[7] = 0x4e800420; // bctr + tramp[8] = (unsigned long)ffi_closure_ASM; + tramp[9] = (unsigned long)closure; +#else +#error undefined architecture +#endif + + closure->cif = cif; + closure->fun = fun; + closure->user_data = user_data; + + // Flush the icache. Only necessary on Darwin. +#if defined(POWERPC_DARWIN) + sys_icache_invalidate(closure->tramp, FFI_TRAMPOLINE_SIZE); +#else + flush_range(closure->tramp, FFI_TRAMPOLINE_SIZE); +#endif + + break; + } + + case FFI_AIX: + { + FFI_ASSERT (cif->abi == FFI_AIX); + + ffi_aix_trampoline_struct* tramp_aix = + (ffi_aix_trampoline_struct*)(closure->tramp); + aix_fd* fd = (aix_fd*)(void*)ffi_closure_ASM; + + tramp_aix->code_pointer = fd->code_pointer; + tramp_aix->toc = fd->toc; + tramp_aix->static_chain = closure; + closure->cif = cif; + closure->fun = fun; + closure->user_data = user_data; + break; + } + + default: + return FFI_BAD_ABI; + } + + return FFI_OK; +} + +#if defined(__ppc__) + typedef double ldbits[2]; + + typedef union + { + ldbits lb; + long double ld; + } ldu; +#endif + +typedef union +{ + float f; + double d; +} ffi_dblfl; + +/* The trampoline invokes ffi_closure_ASM, and on entry, r11 holds the + address of the closure. After storing the registers that could possibly + contain parameters to be passed into the stack frame and setting up space + for a return value, ffi_closure_ASM invokes the following helper function + to do most of the work. */ +int +ffi_closure_helper_DARWIN( + ffi_closure* closure, + void* rvalue, + unsigned long* pgr, + ffi_dblfl* pfr) +{ + /* rvalue is the pointer to space for return value in closure assembly + pgr is the pointer to where r3-r10 are stored in ffi_closure_ASM + pfr is the pointer to where f1-f13 are stored in ffi_closure_ASM. */ + +#if defined(__ppc__) + ldu temp_ld; +#endif + + double temp; + unsigned int i; + unsigned int nf = 0; /* number of FPRs already used. */ + unsigned int ng = 0; /* number of GPRs already used. */ + ffi_cif* cif = closure->cif; + long avn = cif->nargs; + void** avalue = alloca(cif->nargs * sizeof(void*)); + ffi_type** arg_types = cif->arg_types; + + /* Copy the caller's structure return value address so that the closure + returns the data directly to the caller. */ +#if defined(__ppc64__) + if (cif->rtype->type == FFI_TYPE_STRUCT && + ffi64_stret_needs_ptr(cif->rtype, NULL, NULL)) +#elif defined(__ppc__) + if (cif->rtype->type == FFI_TYPE_STRUCT) +#else +#error undefined architecture +#endif + { + rvalue = (void*)*pgr; + pgr++; + ng++; + } + + /* Grab the addresses of the arguments from the stack frame. */ + for (i = 0; i < avn; i++) + { + switch (arg_types[i]->type) + { + case FFI_TYPE_SINT8: + case FFI_TYPE_UINT8: + avalue[i] = (char*)pgr + MODE_CHOICE(3,7); + ng++; + pgr++; + break; + + case FFI_TYPE_SINT16: + case FFI_TYPE_UINT16: + avalue[i] = (char*)pgr + MODE_CHOICE(2,6); + ng++; + pgr++; + break; + +#if defined(__ppc__) + case FFI_TYPE_POINTER: +#endif + case FFI_TYPE_SINT32: + case FFI_TYPE_UINT32: + avalue[i] = (char*)pgr + MODE_CHOICE(0,4); + ng++; + pgr++; + + break; + + case FFI_TYPE_STRUCT: + if (cif->abi == FFI_DARWIN) + { +#if defined(__ppc64__) + unsigned int gprSize = 0; + unsigned int fprSize = 0; + unsigned int savedFPRSize = fprSize; + + avalue[i] = alloca(arg_types[i]->size); + ffi64_struct_to_ram_form(arg_types[i], (const char*)pgr, + &gprSize, (const char*)pfr, &fprSize, &nf, avalue[i], NULL); + + ng += gprSize / sizeof(long); + pgr += gprSize / sizeof(long); + pfr += (fprSize - savedFPRSize) / sizeof(double); + +#elif defined(__ppc__) + /* Structures that match the basic modes (QI 1 byte, HI 2 bytes, + SI 4 bytes) are aligned as if they were those modes. */ + unsigned int size_al = size_al = arg_types[i]->size; + + /* If the first member of the struct is a double, then align + the struct to double-word. */ + if (arg_types[i]->elements[0]->type == FFI_TYPE_DOUBLE) + size_al = ALIGN(arg_types[i]->size, 8); + + if (size_al < 3) + avalue[i] = (void*)pgr + MODE_CHOICE(4,8) - size_al; + else + avalue[i] = (void*)pgr; + + ng += (size_al + 3) / sizeof(long); + pgr += (size_al + 3) / sizeof(long); +#else +#error undefined architecture +#endif + } + + break; + +#if defined(__ppc64__) + case FFI_TYPE_POINTER: +#endif + case FFI_TYPE_SINT64: + case FFI_TYPE_UINT64: + /* Long long ints are passed in 1 or 2 GPRs. */ + avalue[i] = pgr; + ng += MODE_CHOICE(2,1); + pgr += MODE_CHOICE(2,1); + + break; + + case FFI_TYPE_FLOAT: + /* A float value consumes a GPR. + There are 13 64-bit floating point registers. */ + if (nf < NUM_FPR_ARG_REGISTERS) + { + temp = pfr->d; + pfr->f = (float)temp; + avalue[i] = pfr; + pfr++; + } + else + avalue[i] = pgr; + + nf++; + ng++; + pgr++; + break; + + case FFI_TYPE_DOUBLE: + /* A double value consumes one or two GPRs. + There are 13 64bit floating point registers. */ + if (nf < NUM_FPR_ARG_REGISTERS) + { + avalue[i] = pfr; + pfr++; + } + else + avalue[i] = pgr; + + nf++; + ng += MODE_CHOICE(2,1); + pgr += MODE_CHOICE(2,1); + + break; + +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + + case FFI_TYPE_LONGDOUBLE: +#if defined(__ppc64__) + if (nf < NUM_FPR_ARG_REGISTERS) + { + avalue[i] = pfr; + pfr += 2; + } +#elif defined(__ppc__) + /* A long double value consumes 2/4 GPRs and 2 FPRs. + There are 13 64bit floating point registers. */ + if (nf < NUM_FPR_ARG_REGISTERS - 1) + { + avalue[i] = pfr; + pfr += 2; + } + /* Here we have the situation where one part of the long double + is stored in fpr13 and the other part is already on the stack. + We use a union to pass the long double to avalue[i]. */ + else if (nf == NUM_FPR_ARG_REGISTERS - 1) + { + memcpy (&temp_ld.lb[0], pfr, sizeof(temp_ld.lb[0])); + memcpy (&temp_ld.lb[1], pgr + 2, sizeof(temp_ld.lb[1])); + avalue[i] = &temp_ld.ld; + } +#else +#error undefined architecture +#endif + else + avalue[i] = pgr; + + nf += 2; + ng += MODE_CHOICE(4,2); + pgr += MODE_CHOICE(4,2); + + break; + +#endif /* FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE */ + + default: + FFI_ASSERT(0); + break; + } + } + + (closure->fun)(cif, rvalue, avalue, closure->user_data); + + /* Tell ffi_closure_ASM to perform return type promotions. */ + return cif->rtype->type; +} + +#if defined(__ppc64__) + +/* ffi64_struct_to_ram_form + + Rebuild a struct's natural layout from buffers of concatenated registers. + Return the number of registers used. + inGPRs[0-7] == r3, inFPRs[0-7] == f1 ... +*/ +void +ffi64_struct_to_ram_form( + const ffi_type* inType, + const char* inGPRs, + unsigned int* ioGPRMarker, + const char* inFPRs, + unsigned int* ioFPRMarker, + unsigned int* ioFPRsUsed, + char* outStruct, // caller-allocated + unsigned int* ioStructMarker) +{ + unsigned int srcGMarker = 0; + unsigned int srcFMarker = 0; + unsigned int savedFMarker = 0; + unsigned int fprsUsed = 0; + unsigned int savedFPRsUsed = 0; + unsigned int destMarker = 0; + + static unsigned int recurseCount = 0; + + if (ioGPRMarker) + srcGMarker = *ioGPRMarker; + + if (ioFPRMarker) + { + srcFMarker = *ioFPRMarker; + savedFMarker = srcFMarker; + } + + if (ioFPRsUsed) + { + fprsUsed = *ioFPRsUsed; + savedFPRsUsed = fprsUsed; + } + + if (ioStructMarker) + destMarker = *ioStructMarker; + + size_t i; + + switch (inType->size) + { + case 1: case 2: case 4: + srcGMarker += 8 - inType->size; + break; + + default: + break; + } + + for (i = 0; inType->elements[i] != NULL; i++) + { + switch (inType->elements[i]->type) + { + case FFI_TYPE_FLOAT: + srcFMarker = ALIGN(srcFMarker, 4); + srcGMarker = ALIGN(srcGMarker, 4); + destMarker = ALIGN(destMarker, 4); + + if (fprsUsed < NUM_FPR_ARG_REGISTERS) + { + *(float*)&outStruct[destMarker] = + (float)*(double*)&inFPRs[srcFMarker]; + srcFMarker += 8; + fprsUsed++; + } + else + *(float*)&outStruct[destMarker] = + (float)*(double*)&inGPRs[srcGMarker]; + + srcGMarker += 4; + destMarker += 4; + + // Skip to next GPR if next element won't fit and we're + // not already at a register boundary. + if (inType->elements[i + 1] != NULL && (destMarker % 8)) + { + if (!FFI_TYPE_1_BYTE(inType->elements[i + 1]->type) && + (!FFI_TYPE_2_BYTE(inType->elements[i + 1]->type) || + (ALIGN(srcGMarker, 8) - srcGMarker) < 2) && + (!FFI_TYPE_4_BYTE(inType->elements[i + 1]->type) || + (ALIGN(srcGMarker, 8) - srcGMarker) < 4)) + srcGMarker = ALIGN(srcGMarker, 8); + } + + break; + + case FFI_TYPE_DOUBLE: + srcFMarker = ALIGN(srcFMarker, 8); + destMarker = ALIGN(destMarker, 8); + + if (fprsUsed < NUM_FPR_ARG_REGISTERS) + { + *(double*)&outStruct[destMarker] = + *(double*)&inFPRs[srcFMarker]; + srcFMarker += 8; + fprsUsed++; + } + else + *(double*)&outStruct[destMarker] = + *(double*)&inGPRs[srcGMarker]; + + destMarker += 8; + + // Skip next GPR + srcGMarker += 8; + srcGMarker = ALIGN(srcGMarker, 8); + + break; + + case FFI_TYPE_LONGDOUBLE: + destMarker = ALIGN(destMarker, 16); + + if (fprsUsed < NUM_FPR_ARG_REGISTERS) + { + srcFMarker = ALIGN(srcFMarker, 8); + srcGMarker = ALIGN(srcGMarker, 8); + *(long double*)&outStruct[destMarker] = + *(long double*)&inFPRs[srcFMarker]; + srcFMarker += 16; + fprsUsed += 2; + } + else + { + srcFMarker = ALIGN(srcFMarker, 16); + srcGMarker = ALIGN(srcGMarker, 16); + *(long double*)&outStruct[destMarker] = + *(long double*)&inGPRs[srcGMarker]; + } + + destMarker += 16; + + // Skip next 2 GPRs + srcGMarker += 16; + srcGMarker = ALIGN(srcGMarker, 8); + + break; + + case FFI_TYPE_UINT8: + case FFI_TYPE_SINT8: + { + if (inType->alignment == 1) // chars only + { + if (inType->size == 1) + outStruct[destMarker++] = inGPRs[srcGMarker++]; + else if (inType->size == 2) + { + outStruct[destMarker++] = inGPRs[srcGMarker++]; + outStruct[destMarker++] = inGPRs[srcGMarker++]; + i++; + } + else + { + memcpy(&outStruct[destMarker], + &inGPRs[srcGMarker], inType->size); + srcGMarker += inType->size; + destMarker += inType->size; + i += inType->size - 1; + } + } + else // chars and other stuff + { + outStruct[destMarker++] = inGPRs[srcGMarker++]; + + // Skip to next GPR if next element won't fit and we're + // not already at a register boundary. + if (inType->elements[i + 1] != NULL && (srcGMarker % 8)) + { + if (!FFI_TYPE_1_BYTE(inType->elements[i + 1]->type) && + (!FFI_TYPE_2_BYTE(inType->elements[i + 1]->type) || + (ALIGN(srcGMarker, 8) - srcGMarker) < 2) && + (!FFI_TYPE_4_BYTE(inType->elements[i + 1]->type) || + (ALIGN(srcGMarker, 8) - srcGMarker) < 4)) + srcGMarker = ALIGN(srcGMarker, inType->alignment); // was 8 + } + } + + break; + } + + case FFI_TYPE_UINT16: + case FFI_TYPE_SINT16: + srcGMarker = ALIGN(srcGMarker, 2); + destMarker = ALIGN(destMarker, 2); + + *(short*)&outStruct[destMarker] = + *(short*)&inGPRs[srcGMarker]; + srcGMarker += 2; + destMarker += 2; + + break; + + case FFI_TYPE_INT: + case FFI_TYPE_UINT32: + case FFI_TYPE_SINT32: + srcGMarker = ALIGN(srcGMarker, 4); + destMarker = ALIGN(destMarker, 4); + + *(int*)&outStruct[destMarker] = + *(int*)&inGPRs[srcGMarker]; + srcGMarker += 4; + destMarker += 4; + + break; + + case FFI_TYPE_POINTER: + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + srcGMarker = ALIGN(srcGMarker, 8); + destMarker = ALIGN(destMarker, 8); + + *(long long*)&outStruct[destMarker] = + *(long long*)&inGPRs[srcGMarker]; + srcGMarker += 8; + destMarker += 8; + + break; + + case FFI_TYPE_STRUCT: + recurseCount++; + ffi64_struct_to_ram_form(inType->elements[i], inGPRs, + &srcGMarker, inFPRs, &srcFMarker, &fprsUsed, + outStruct, &destMarker); + recurseCount--; + break; + + default: + FFI_ASSERT(0); // unknown element type + break; + } + } + + srcGMarker = ALIGN(srcGMarker, inType->alignment); + + // Take care of the special case for 16-byte structs, but not for + // nested structs. + if (recurseCount == 0 && srcGMarker == 16) + { + *(long double*)&outStruct[0] = *(long double*)&inGPRs[0]; + srcFMarker = savedFMarker; + fprsUsed = savedFPRsUsed; + } + + if (ioGPRMarker) + *ioGPRMarker = ALIGN(srcGMarker, 8); + + if (ioFPRMarker) + *ioFPRMarker = srcFMarker; + + if (ioFPRsUsed) + *ioFPRsUsed = fprsUsed; + + if (ioStructMarker) + *ioStructMarker = ALIGN(destMarker, 8); +} + +/* ffi64_struct_to_reg_form + + Copy a struct's elements into buffers that can be sliced into registers. + Return the sizes of the output buffers in bytes. Pass NULL buffer pointers + to calculate size only. + outGPRs[0-7] == r3, outFPRs[0-7] == f1 ... +*/ +void +ffi64_struct_to_reg_form( + const ffi_type* inType, + const char* inStruct, + unsigned int* ioStructMarker, + unsigned int* ioFPRsUsed, + char* outGPRs, // caller-allocated + unsigned int* ioGPRSize, + char* outFPRs, // caller-allocated + unsigned int* ioFPRSize) +{ + size_t i; + unsigned int srcMarker = 0; + unsigned int destGMarker = 0; + unsigned int destFMarker = 0; + unsigned int savedFMarker = 0; + unsigned int fprsUsed = 0; + unsigned int savedFPRsUsed = 0; + + static unsigned int recurseCount = 0; + + if (ioStructMarker) + srcMarker = *ioStructMarker; + + if (ioFPRsUsed) + { + fprsUsed = *ioFPRsUsed; + savedFPRsUsed = fprsUsed; + } + + if (ioGPRSize) + destGMarker = *ioGPRSize; + + if (ioFPRSize) + { + destFMarker = *ioFPRSize; + savedFMarker = destFMarker; + } + + switch (inType->size) + { + case 1: case 2: case 4: + destGMarker += 8 - inType->size; + break; + + default: + break; + } + + for (i = 0; inType->elements[i] != NULL; i++) + { + switch (inType->elements[i]->type) + { + // Shadow floating-point types in GPRs for vararg and pre-ANSI + // functions. + case FFI_TYPE_FLOAT: + // Nudge markers to next 4/8-byte boundary + srcMarker = ALIGN(srcMarker, 4); + destGMarker = ALIGN(destGMarker, 4); + destFMarker = ALIGN(destFMarker, 8); + + if (fprsUsed < NUM_FPR_ARG_REGISTERS) + { + if (outFPRs != NULL && inStruct != NULL) + *(double*)&outFPRs[destFMarker] = + (double)*(float*)&inStruct[srcMarker]; + + destFMarker += 8; + fprsUsed++; + } + + if (outGPRs != NULL && inStruct != NULL) + *(double*)&outGPRs[destGMarker] = + (double)*(float*)&inStruct[srcMarker]; + + srcMarker += 4; + destGMarker += 4; + + // Skip to next GPR if next element won't fit and we're + // not already at a register boundary. + if (inType->elements[i + 1] != NULL && (srcMarker % 8)) + { + if (!FFI_TYPE_1_BYTE(inType->elements[i + 1]->type) && + (!FFI_TYPE_2_BYTE(inType->elements[i + 1]->type) || + (ALIGN(destGMarker, 8) - destGMarker) < 2) && + (!FFI_TYPE_4_BYTE(inType->elements[i + 1]->type) || + (ALIGN(destGMarker, 8) - destGMarker) < 4)) + destGMarker = ALIGN(destGMarker, 8); + } + + break; + + case FFI_TYPE_DOUBLE: + srcMarker = ALIGN(srcMarker, 8); + destFMarker = ALIGN(destFMarker, 8); + + if (fprsUsed < NUM_FPR_ARG_REGISTERS) + { + if (outFPRs != NULL && inStruct != NULL) + *(double*)&outFPRs[destFMarker] = + *(double*)&inStruct[srcMarker]; + + destFMarker += 8; + fprsUsed++; + } + + if (outGPRs != NULL && inStruct != NULL) + *(double*)&outGPRs[destGMarker] = + *(double*)&inStruct[srcMarker]; + + srcMarker += 8; + + // Skip next GPR + destGMarker += 8; + destGMarker = ALIGN(destGMarker, 8); + + break; + + case FFI_TYPE_LONGDOUBLE: + srcMarker = ALIGN(srcMarker, 16); + + if (fprsUsed < NUM_FPR_ARG_REGISTERS) + { + destFMarker = ALIGN(destFMarker, 8); + destGMarker = ALIGN(destGMarker, 8); + + if (outFPRs != NULL && inStruct != NULL) + *(long double*)&outFPRs[destFMarker] = + *(long double*)&inStruct[srcMarker]; + + if (outGPRs != NULL && inStruct != NULL) + *(long double*)&outGPRs[destGMarker] = + *(long double*)&inStruct[srcMarker]; + + destFMarker += 16; + fprsUsed += 2; + } + else + { + destGMarker = ALIGN(destGMarker, 16); + + if (outGPRs != NULL && inStruct != NULL) + *(long double*)&outGPRs[destGMarker] = + *(long double*)&inStruct[srcMarker]; + } + + srcMarker += 16; + destGMarker += 16; // Skip next 2 GPRs + destGMarker = ALIGN(destGMarker, 8); // was 16 + + break; + + case FFI_TYPE_UINT8: + case FFI_TYPE_SINT8: + if (inType->alignment == 1) // bytes only + { + if (inType->size == 1) + { + if (outGPRs != NULL && inStruct != NULL) + outGPRs[destGMarker] = inStruct[srcMarker]; + + srcMarker++; + destGMarker++; + } + else if (inType->size == 2) + { + if (outGPRs != NULL && inStruct != NULL) + { + outGPRs[destGMarker] = inStruct[srcMarker]; + outGPRs[destGMarker + 1] = inStruct[srcMarker + 1]; + } + + srcMarker += 2; + destGMarker += 2; + + i++; + } + else + { + if (outGPRs != NULL && inStruct != NULL) + { + // Avoid memcpy for small chunks. + if (inType->size <= sizeof(long)) + *(long*)&outGPRs[destGMarker] = + *(long*)&inStruct[srcMarker]; + else + memcpy(&outGPRs[destGMarker], + &inStruct[srcMarker], inType->size); + } + + srcMarker += inType->size; + destGMarker += inType->size; + i += inType->size - 1; + } + } + else // bytes and other stuff + { + if (outGPRs != NULL && inStruct != NULL) + outGPRs[destGMarker] = inStruct[srcMarker]; + + srcMarker++; + destGMarker++; + + // Skip to next GPR if next element won't fit and we're + // not already at a register boundary. + if (inType->elements[i + 1] != NULL && (destGMarker % 8)) + { + if (!FFI_TYPE_1_BYTE(inType->elements[i + 1]->type) && + (!FFI_TYPE_2_BYTE(inType->elements[i + 1]->type) || + (ALIGN(destGMarker, 8) - destGMarker) < 2) && + (!FFI_TYPE_4_BYTE(inType->elements[i + 1]->type) || + (ALIGN(destGMarker, 8) - destGMarker) < 4)) + destGMarker = ALIGN(destGMarker, inType->alignment); // was 8 + } + } + + break; + + case FFI_TYPE_UINT16: + case FFI_TYPE_SINT16: + srcMarker = ALIGN(srcMarker, 2); + destGMarker = ALIGN(destGMarker, 2); + + if (outGPRs != NULL && inStruct != NULL) + *(short*)&outGPRs[destGMarker] = + *(short*)&inStruct[srcMarker]; + + srcMarker += 2; + destGMarker += 2; + + if (inType->elements[i + 1] == NULL) + destGMarker = ALIGN(destGMarker, inType->alignment); + + break; + + case FFI_TYPE_INT: + case FFI_TYPE_UINT32: + case FFI_TYPE_SINT32: + srcMarker = ALIGN(srcMarker, 4); + destGMarker = ALIGN(destGMarker, 4); + + if (outGPRs != NULL && inStruct != NULL) + *(int*)&outGPRs[destGMarker] = + *(int*)&inStruct[srcMarker]; + + srcMarker += 4; + destGMarker += 4; + + break; + + case FFI_TYPE_POINTER: + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + srcMarker = ALIGN(srcMarker, 8); + destGMarker = ALIGN(destGMarker, 8); + + if (outGPRs != NULL && inStruct != NULL) + *(long long*)&outGPRs[destGMarker] = + *(long long*)&inStruct[srcMarker]; + + srcMarker += 8; + destGMarker += 8; + + if (inType->elements[i + 1] == NULL) + destGMarker = ALIGN(destGMarker, inType->alignment); + + break; + + case FFI_TYPE_STRUCT: + recurseCount++; + ffi64_struct_to_reg_form(inType->elements[i], + inStruct, &srcMarker, &fprsUsed, outGPRs, + &destGMarker, outFPRs, &destFMarker); + recurseCount--; + break; + + default: + FFI_ASSERT(0); + break; + } + } + + destGMarker = ALIGN(destGMarker, inType->alignment); + + // Take care of the special case for 16-byte structs, but not for + // nested structs. + if (recurseCount == 0 && destGMarker == 16) + { + if (outGPRs != NULL && inStruct != NULL) + *(long double*)&outGPRs[0] = *(long double*)&inStruct[0]; + + destFMarker = savedFMarker; + fprsUsed = savedFPRsUsed; + } + + if (ioStructMarker) + *ioStructMarker = ALIGN(srcMarker, 8); + + if (ioFPRsUsed) + *ioFPRsUsed = fprsUsed; + + if (ioGPRSize) + *ioGPRSize = ALIGN(destGMarker, 8); + + if (ioFPRSize) + *ioFPRSize = ALIGN(destFMarker, 8); +} + +/* ffi64_stret_needs_ptr + + Determine whether a returned struct needs a pointer in r3 or can fit + in registers. +*/ + +bool +ffi64_stret_needs_ptr( + const ffi_type* inType, + unsigned short* ioGPRCount, + unsigned short* ioFPRCount) +{ + // Obvious case first- struct is larger than combined FPR size. + if (inType->size > 14 * 8) + return true; + + // Now the struct can physically fit in registers, determine if it + // also fits logically. + bool needsPtr = false; + unsigned short gprsUsed = 0; + unsigned short fprsUsed = 0; + size_t i; + + if (ioGPRCount) + gprsUsed = *ioGPRCount; + + if (ioFPRCount) + fprsUsed = *ioFPRCount; + + for (i = 0; inType->elements[i] != NULL && !needsPtr; i++) + { + switch (inType->elements[i]->type) + { + case FFI_TYPE_FLOAT: + case FFI_TYPE_DOUBLE: + gprsUsed++; + fprsUsed++; + + if (fprsUsed > 13) + needsPtr = true; + + break; + + case FFI_TYPE_LONGDOUBLE: + gprsUsed += 2; + fprsUsed += 2; + + if (fprsUsed > 14) + needsPtr = true; + + break; + + case FFI_TYPE_UINT8: + case FFI_TYPE_SINT8: + { + gprsUsed++; + + if (gprsUsed > 8) + { + needsPtr = true; + break; + } + + if (inType->elements[i + 1] == NULL) // last byte in the struct + break; + + // Count possible contiguous bytes ahead, up to 8. + unsigned short j; + + for (j = 1; j < 8; j++) + { + if (inType->elements[i + j] == NULL || + !FFI_TYPE_1_BYTE(inType->elements[i + j]->type)) + break; + } + + i += j - 1; // allow for i++ before the test condition + + break; + } + + case FFI_TYPE_UINT16: + case FFI_TYPE_SINT16: + case FFI_TYPE_INT: + case FFI_TYPE_UINT32: + case FFI_TYPE_SINT32: + case FFI_TYPE_POINTER: + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + gprsUsed++; + + if (gprsUsed > 8) + needsPtr = true; + + break; + + case FFI_TYPE_STRUCT: + needsPtr = ffi64_stret_needs_ptr( + inType->elements[i], &gprsUsed, &fprsUsed); + + break; + + default: + FFI_ASSERT(0); + break; + } + } + + if (ioGPRCount) + *ioGPRCount = gprsUsed; + + if (ioFPRCount) + *ioFPRCount = fprsUsed; + + return needsPtr; +} + +/* ffi64_data_size + + Calculate the size in bytes of an ffi type. +*/ + +unsigned int +ffi64_data_size( + const ffi_type* inType) +{ + unsigned int size = 0; + + switch (inType->type) + { + case FFI_TYPE_UINT8: + case FFI_TYPE_SINT8: + size = 1; + break; + + case FFI_TYPE_UINT16: + case FFI_TYPE_SINT16: + size = 2; + break; + + case FFI_TYPE_INT: + case FFI_TYPE_UINT32: + case FFI_TYPE_SINT32: + case FFI_TYPE_FLOAT: + size = 4; + break; + + case FFI_TYPE_POINTER: + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + case FFI_TYPE_DOUBLE: + size = 8; + break; + + case FFI_TYPE_LONGDOUBLE: + size = 16; + break; + + case FFI_TYPE_STRUCT: + ffi64_struct_to_reg_form( + inType, NULL, NULL, NULL, NULL, &size, NULL, NULL); + break; + + case FFI_TYPE_VOID: + break; + + default: + FFI_ASSERT(0); + break; + } + + return size; +} + +#endif /* defined(__ppc64__) */ +#endif /* __ppc__ || __ppc64__ */ diff -r -u ./Modules/_ctypes/libffi_osx/powerpc/ppc64-darwin_closure.S ./Modules/_ctypes/libffi_osx/powerpc/ppc64-darwin_closure.S new file mode 100644 index 0000000..7162fa1 --- /dev/null +++ ./Modules/_ctypes/libffi_osx/powerpc/ppc64-darwin_closure.S @@ -0,0 +1,418 @@ +#if defined(__ppc64__) + +/* ----------------------------------------------------------------------- + ppc64-darwin_closure.S - Copyright (c) 2002, 2003, 2004, Free Software Foundation, + Inc. based on ppc_closure.S + + PowerPC Assembly glue. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#define LIBFFI_ASM + +#include +#include // for FFI_TRAMPOLINE_SIZE +#include +#include + + .file "ppc64-darwin_closure.S" +.text + .align LOG2_GPR_BYTES + .globl _ffi_closure_ASM + +.text + .align LOG2_GPR_BYTES + +_ffi_closure_ASM: +LFB1: + mflr r0 + stg r0,SF_RETURN(r1) // save return address + + // Save GPRs 3 - 10 (aligned to 8) in the parents outgoing area. + stg r3,SF_ARG1(r1) + stg r4,SF_ARG2(r1) + stg r5,SF_ARG3(r1) + stg r6,SF_ARG4(r1) + stg r7,SF_ARG5(r1) + stg r8,SF_ARG6(r1) + stg r9,SF_ARG7(r1) + stg r10,SF_ARG8(r1) + +LCFI0: +/* 48 bytes (Linkage Area) + 64 bytes (outgoing parameter area, always reserved) + 112 bytes (14*8 for incoming FPR) + ? bytes (result) + 112 bytes (14*8 for outgoing FPR) + 16 bytes (2 saved registers) + 352 + ? total bytes +*/ + + std r31,-8(r1) // Save registers we use. + std r30,-16(r1) + mr r30,r1 // Save the old SP. + mr r31,r11 // Save the ffi_closure around ffi64_data_size. + + // Calculate the space we need. + stdu r1,-SF_MINSIZE(r1) + ld r3,FFI_TRAMPOLINE_SIZE(r31) // ffi_closure->cif* + ld r3,16(r3) // ffi_cif->rtype* + bl Lffi64_data_size$stub + ld r1,0(r1) + + addi r3,r3,352 // Add our overhead. + neg r3,r3 + li r0,-32 // Align to 32 bytes. + and r3,r3,r0 + stdux r1,r1,r3 // Grow the stack. + + mr r11,r31 // Copy the ffi_closure back. + +LCFI1: + // We want to build up an area for the parameters passed + // in registers. (both floating point and integer) + +/* 320 bytes (callee stack frame aligned to 32) + 48 bytes (caller linkage area) + 368 (start of caller parameter area aligned to 8) +*/ + + // Save FPRs 1 - 14. (aligned to 8) + stfd f1,112(r1) + stfd f2,120(r1) + stfd f3,128(r1) + stfd f4,136(r1) + stfd f5,144(r1) + stfd f6,152(r1) + stfd f7,160(r1) + stfd f8,168(r1) + stfd f9,176(r1) + stfd f10,184(r1) + stfd f11,192(r1) + stfd f12,200(r1) + stfd f13,208(r1) + stfd f14,216(r1) + + // Set up registers for the routine that actually does the work. + mr r3,r11 // context pointer from the trampoline + addi r4,r1,224 // result storage + addi r5,r30,SF_ARG1 // saved GPRs + addi r6,r1,112 // saved FPRs + bl Lffi_closure_helper_DARWIN$stub + + // Look the proper starting point in table + // by using return type as an offset. + addi r5,r1,224 // Get pointer to results area. + bl Lget_ret_type0_addr // Get pointer to Lret_type0 into LR. + mflr r4 // Move to r4. + slwi r3,r3,4 // Now multiply return type by 16. + add r3,r3,r4 // Add contents of table to table address. + mtctr r3 + bctr + +LFE1: + // Each of the ret_typeX code fragments has to be exactly 16 bytes long + // (4 instructions). For cache effectiveness we align to a 16 byte + // boundary first. + .align 4 + nop + nop + nop + +Lget_ret_type0_addr: + blrl + +// case FFI_TYPE_VOID +Lret_type0: + b Lfinish + nop + nop + nop + +// case FFI_TYPE_INT +Lret_type1: + lwz r3,4(r5) + b Lfinish + nop + nop + +// case FFI_TYPE_FLOAT +Lret_type2: + lfs f1,0(r5) + b Lfinish + nop + nop + +// case FFI_TYPE_DOUBLE +Lret_type3: + lfd f1,0(r5) + b Lfinish + nop + nop + +// case FFI_TYPE_LONGDOUBLE +Lret_type4: + lfd f1,0(r5) + lfd f2,8(r5) + b Lfinish + nop + +// case FFI_TYPE_UINT8 +Lret_type5: + lbz r3,7(r5) + b Lfinish + nop + nop + +// case FFI_TYPE_SINT8 +Lret_type6: + lbz r3,7(r5) + extsb r3,r3 + b Lfinish + nop + +// case FFI_TYPE_UINT16 +Lret_type7: + lhz r3,6(r5) + b Lfinish + nop + nop + +// case FFI_TYPE_SINT16 +Lret_type8: + lha r3,6(r5) + b Lfinish + nop + nop + +// case FFI_TYPE_UINT32 +Lret_type9: // same as Lret_type1 + lwz r3,4(r5) + b Lfinish + nop + nop + +// case FFI_TYPE_SINT32 +Lret_type10: // same as Lret_type1 + lwz r3,4(r5) + b Lfinish + nop + nop + +// case FFI_TYPE_UINT64 +Lret_type11: + ld r3,0(r5) + b Lfinish + nop + nop + +// case FFI_TYPE_SINT64 +Lret_type12: // same as Lret_type11 + ld r3,0(r5) + b Lfinish + nop + nop + +// case FFI_TYPE_STRUCT +Lret_type13: + b Lret_struct + nop + nop + nop + +// ** End 16-byte aligned cases ** +// case FFI_TYPE_POINTER +// This case assumes that FFI_TYPE_POINTER == FFI_TYPE_LAST. If more types +// are added in future, the following code will need to be updated and +// padded to 16 bytes. +Lret_type14: + lg r3,0(r5) + b Lfinish + +// copy struct into registers +Lret_struct: + ld r31,FFI_TRAMPOLINE_SIZE(r31) // ffi_closure->cif* + ld r3,16(r31) // ffi_cif->rtype* + ld r31,24(r31) // ffi_cif->flags + mr r4,r5 // copy struct* to 2nd arg + addi r7,r1,SF_ARG9 // GPR return area + addi r9,r30,-16-(14*8) // FPR return area + li r5,0 // struct offset ptr (NULL) + li r6,0 // FPR used count ptr (NULL) + li r8,0 // GPR return area size ptr (NULL) + li r10,0 // FPR return area size ptr (NULL) + bl Lffi64_struct_to_reg_form$stub + + // Load GPRs + ld r3,SF_ARG9(r1) + ld r4,SF_ARG10(r1) + ld r5,SF_ARG11(r1) + ld r6,SF_ARG12(r1) + nop + ld r7,SF_ARG13(r1) + ld r8,SF_ARG14(r1) + ld r9,SF_ARG15(r1) + ld r10,SF_ARG16(r1) + nop + + // Load FPRs + mtcrf 0x2,r31 + bf 26,Lfinish + lfd f1,-16-(14*8)(r30) + lfd f2,-16-(13*8)(r30) + lfd f3,-16-(12*8)(r30) + lfd f4,-16-(11*8)(r30) + nop + lfd f5,-16-(10*8)(r30) + lfd f6,-16-(9*8)(r30) + lfd f7,-16-(8*8)(r30) + lfd f8,-16-(7*8)(r30) + nop + lfd f9,-16-(6*8)(r30) + lfd f10,-16-(5*8)(r30) + lfd f11,-16-(4*8)(r30) + lfd f12,-16-(3*8)(r30) + nop + lfd f13,-16-(2*8)(r30) + lfd f14,-16-(1*8)(r30) + // Fall through + +// case done +Lfinish: + lg r1,0(r1) // Restore stack pointer. + ld r31,-8(r1) // Restore registers we used. + ld r30,-16(r1) + lg r0,SF_RETURN(r1) // Get return address. + mtlr r0 // Reset link register. + blr + +// END(ffi_closure_ASM) + +.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support +EH_frame1: + .set L$set$0,LECIE1-LSCIE1 + .long L$set$0 ; Length of Common Information Entry +LSCIE1: + .long 0x0 ; CIE Identifier Tag + .byte 0x1 ; CIE Version + .ascii "zR\0" ; CIE Augmentation + .byte 0x1 ; uleb128 0x1; CIE Code Alignment Factor + .byte 0x7c ; sleb128 -4; CIE Data Alignment Factor + .byte 0x41 ; CIE RA Column + .byte 0x1 ; uleb128 0x1; Augmentation size + .byte 0x10 ; FDE Encoding (pcrel) + .byte 0xc ; DW_CFA_def_cfa + .byte 0x1 ; uleb128 0x1 + .byte 0x0 ; uleb128 0x0 + .align LOG2_GPR_BYTES +LECIE1: +.globl _ffi_closure_ASM.eh +_ffi_closure_ASM.eh: +LSFDE1: + .set L$set$1,LEFDE1-LASFDE1 + .long L$set$1 ; FDE Length + +LASFDE1: + .long LASFDE1-EH_frame1 ; FDE CIE offset + .g_long LFB1-. ; FDE initial location + .set L$set$3,LFE1-LFB1 + .g_long L$set$3 ; FDE address range + .byte 0x0 ; uleb128 0x0; Augmentation size + .byte 0x4 ; DW_CFA_advance_loc4 + .set L$set$3,LCFI1-LCFI0 + .long L$set$3 + .byte 0xe ; DW_CFA_def_cfa_offset + .byte 176,1 ; uleb128 176 + .byte 0x4 ; DW_CFA_advance_loc4 + .set L$set$4,LCFI0-LFB1 + .long L$set$4 + .byte 0x11 ; DW_CFA_offset_extended_sf + .byte 0x41 ; uleb128 0x41 + .byte 0x7e ; sleb128 -2 + .align LOG2_GPR_BYTES + +LEFDE1: +.data + .align LOG2_GPR_BYTES +LDFCM0: +.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 + .align LOG2_GPR_BYTES + +Lffi_closure_helper_DARWIN$stub: + .indirect_symbol _ffi_closure_helper_DARWIN + mflr r0 + bcl 20,31,LO$ffi_closure_helper_DARWIN + +LO$ffi_closure_helper_DARWIN: + mflr r11 + addis r11,r11,ha16(L_ffi_closure_helper_DARWIN$lazy_ptr - LO$ffi_closure_helper_DARWIN) + mtlr r0 + lgu r12,lo16(L_ffi_closure_helper_DARWIN$lazy_ptr - LO$ffi_closure_helper_DARWIN)(r11) + mtctr r12 + bctr + +.lazy_symbol_pointer +L_ffi_closure_helper_DARWIN$lazy_ptr: + .indirect_symbol _ffi_closure_helper_DARWIN + .g_long dyld_stub_binding_helper + +.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 + .align LOG2_GPR_BYTES + +Lffi64_struct_to_reg_form$stub: + .indirect_symbol _ffi64_struct_to_reg_form + mflr r0 + bcl 20,31,LO$ffi64_struct_to_reg_form + +LO$ffi64_struct_to_reg_form: + mflr r11 + addis r11,r11,ha16(L_ffi64_struct_to_reg_form$lazy_ptr - LO$ffi64_struct_to_reg_form) + mtlr r0 + lgu r12,lo16(L_ffi64_struct_to_reg_form$lazy_ptr - LO$ffi64_struct_to_reg_form)(r11) + mtctr r12 + bctr + +.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 + .align LOG2_GPR_BYTES + +Lffi64_data_size$stub: + .indirect_symbol _ffi64_data_size + mflr r0 + bcl 20,31,LO$ffi64_data_size + +LO$ffi64_data_size: + mflr r11 + addis r11,r11,ha16(L_ffi64_data_size$lazy_ptr - LO$ffi64_data_size) + mtlr r0 + lgu r12,lo16(L_ffi64_data_size$lazy_ptr - LO$ffi64_data_size)(r11) + mtctr r12 + bctr + +.lazy_symbol_pointer +L_ffi64_struct_to_reg_form$lazy_ptr: + .indirect_symbol _ffi64_struct_to_reg_form + .g_long dyld_stub_binding_helper + +L_ffi64_data_size$lazy_ptr: + .indirect_symbol _ffi64_data_size + .g_long dyld_stub_binding_helper + +#endif // __ppc64__ diff -r -u ./Modules/_ctypes/libffi_osx/types.c ./Modules/_ctypes/libffi_osx/types.c new file mode 100644 index 0000000..44806ae --- /dev/null +++ ./Modules/_ctypes/libffi_osx/types.c @@ -0,0 +1,115 @@ +/* ----------------------------------------------------------------------- + types.c - Copyright (c) 1996, 1998 Red Hat, Inc. + + Predefined ffi_types needed by libffi. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#include +#include + +/* Type definitions */ +#define FFI_INTEGRAL_TYPEDEF(n, s, a, t) \ + ffi_type ffi_type_##n = { s, a, t, NULL } +#define FFI_AGGREGATE_TYPEDEF(n, e) \ + ffi_type ffi_type_##n = { 0, 0, FFI_TYPE_STRUCT, e } + +FFI_INTEGRAL_TYPEDEF(uint8, 1, 1, FFI_TYPE_UINT8); +FFI_INTEGRAL_TYPEDEF(sint8, 1, 1, FFI_TYPE_SINT8); +FFI_INTEGRAL_TYPEDEF(uint16, 2, 2, FFI_TYPE_UINT16); +FFI_INTEGRAL_TYPEDEF(sint16, 2, 2, FFI_TYPE_SINT16); +FFI_INTEGRAL_TYPEDEF(uint32, 4, 4, FFI_TYPE_UINT32); +FFI_INTEGRAL_TYPEDEF(sint32, 4, 4, FFI_TYPE_SINT32); +FFI_INTEGRAL_TYPEDEF(float, 4, 4, FFI_TYPE_FLOAT); + +/* Size and alignment are fake here. They must not be 0. */ +FFI_INTEGRAL_TYPEDEF(void, 1, 1, FFI_TYPE_VOID); + +#if defined ALPHA || defined SPARC64 || defined X86_64 || \ + defined S390X || defined IA64 || defined POWERPC64 +FFI_INTEGRAL_TYPEDEF(pointer, 8, 8, FFI_TYPE_POINTER); +#else +FFI_INTEGRAL_TYPEDEF(pointer, 4, 4, FFI_TYPE_POINTER); +#endif + +#if defined X86 || defined ARM || defined M68K || defined(X86_DARWIN) + +# ifdef X86_64 + FFI_INTEGRAL_TYPEDEF(uint64, 8, 8, FFI_TYPE_UINT64); + FFI_INTEGRAL_TYPEDEF(sint64, 8, 8, FFI_TYPE_SINT64); +# else + FFI_INTEGRAL_TYPEDEF(uint64, 8, 4, FFI_TYPE_UINT64); + FFI_INTEGRAL_TYPEDEF(sint64, 8, 4, FFI_TYPE_SINT64); +# endif + +#elif defined(POWERPC_DARWIN) +FFI_INTEGRAL_TYPEDEF(uint64, 8, 8, FFI_TYPE_UINT64); +FFI_INTEGRAL_TYPEDEF(sint64, 8, 8, FFI_TYPE_SINT64); +#elif defined SH +FFI_INTEGRAL_TYPEDEF(uint64, 8, 4, FFI_TYPE_UINT64); +FFI_INTEGRAL_TYPEDEF(sint64, 8, 4, FFI_TYPE_SINT64); +#else +FFI_INTEGRAL_TYPEDEF(uint64, 8, 8, FFI_TYPE_UINT64); +FFI_INTEGRAL_TYPEDEF(sint64, 8, 8, FFI_TYPE_SINT64); +#endif + +#if defined X86 || defined X86_WIN32 || defined M68K || defined(X86_DARWIN) + +# if defined X86_WIN32 || defined X86_64 + FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE); +# else + FFI_INTEGRAL_TYPEDEF(double, 8, 4, FFI_TYPE_DOUBLE); +# endif + +# ifdef X86_DARWIN + FFI_INTEGRAL_TYPEDEF(longdouble, 16, 16, FFI_TYPE_LONGDOUBLE); +# else + FFI_INTEGRAL_TYPEDEF(longdouble, 12, 4, FFI_TYPE_LONGDOUBLE); +# endif + +#elif defined ARM || defined SH || defined POWERPC_AIX +FFI_INTEGRAL_TYPEDEF(double, 8, 4, FFI_TYPE_DOUBLE); +FFI_INTEGRAL_TYPEDEF(longdouble, 8, 4, FFI_TYPE_LONGDOUBLE); +#elif defined POWERPC_DARWIN +FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE); + +# if __GNUC__ >= 4 + FFI_INTEGRAL_TYPEDEF(longdouble, 16, 16, FFI_TYPE_LONGDOUBLE); +# else + FFI_INTEGRAL_TYPEDEF(longdouble, 8, 8, FFI_TYPE_LONGDOUBLE); +# endif + +#elif defined SPARC +FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE); + +# ifdef SPARC64 + FFI_INTEGRAL_TYPEDEF(longdouble, 16, 16, FFI_TYPE_LONGDOUBLE); +# else + FFI_INTEGRAL_TYPEDEF(longdouble, 16, 8, FFI_TYPE_LONGDOUBLE); +# endif + +#elif defined X86_64 || defined POWERPC64 +FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE); +FFI_INTEGRAL_TYPEDEF(longdouble, 16, 16, FFI_TYPE_LONGDOUBLE); +#else +FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE); +FFI_INTEGRAL_TYPEDEF(longdouble, 8, 8, FFI_TYPE_LONGDOUBLE); +#endif \ No newline at end of file diff -r -u ./Modules/_ctypes/libffi_osx/x86/darwin64.S ./Modules/_ctypes/libffi_osx/x86/darwin64.S new file mode 100644 index 0000000..165d469 --- /dev/null +++ ./Modules/_ctypes/libffi_osx/x86/darwin64.S @@ -0,0 +1,417 @@ +/* ----------------------------------------------------------------------- + darwin64.S - Copyright (c) 2006 Free Software Foundation, Inc. + derived from unix64.S + + x86-64 Foreign Function Interface for Darwin. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#ifdef __x86_64__ +#define LIBFFI_ASM +#include +#include + + .file "darwin64.S" +.text + +/* ffi_call_unix64 (void *args, unsigned long bytes, unsigned flags, + void *raddr, void (*fnaddr)()); + + Bit o trickiness here -- ARGS+BYTES is the base of the stack frame + for this function. This has been allocated by ffi_call. We also + deallocate some of the stack that has been alloca'd. */ + + .align 3 + .globl _ffi_call_unix64 + +_ffi_call_unix64: +LUW0: + movq (%rsp), %r10 /* Load return address. */ + movq %rdi, %r12 /* Save a copy of the register area. */ + leaq (%rdi, %rsi), %rax /* Find local stack base. */ + movq %rdx, (%rax) /* Save flags. */ + movq %rcx, 8(%rax) /* Save raddr. */ + movq %rbp, 16(%rax) /* Save old frame pointer. */ + movq %r10, 24(%rax) /* Relocate return address. */ + movq %rax, %rbp /* Finalize local stack frame. */ +LUW1: + /* movq %rdi, %r10 // Save a copy of the register area. */ + movq %r12, %r10 + movq %r8, %r11 /* Save a copy of the target fn. */ + movl %r9d, %eax /* Set number of SSE registers. */ + + /* Load up all argument registers. */ + movq (%r10), %rdi + movq 8(%r10), %rsi + movq 16(%r10), %rdx + movq 24(%r10), %rcx + movq 32(%r10), %r8 + movq 40(%r10), %r9 + testl %eax, %eax + jnz Lload_sse +Lret_from_load_sse: + + /* Deallocate the reg arg area. */ + leaq 176(%r10), %rsp + + /* Call the user function. */ + call *%r11 + + /* Deallocate stack arg area; local stack frame in redzone. */ + leaq 24(%rbp), %rsp + + movq 0(%rbp), %rcx /* Reload flags. */ + movq 8(%rbp), %rdi /* Reload raddr. */ + movq 16(%rbp), %rbp /* Reload old frame pointer. */ +LUW2: + + /* The first byte of the flags contains the FFI_TYPE. */ + movzbl %cl, %r10d + leaq Lstore_table(%rip), %r11 + movslq (%r11, %r10, 4), %r10 + addq %r11, %r10 + jmp *%r10 + +Lstore_table: + .long Lst_void-Lstore_table /* FFI_TYPE_VOID */ + .long Lst_sint32-Lstore_table /* FFI_TYPE_INT */ + .long Lst_float-Lstore_table /* FFI_TYPE_FLOAT */ + .long Lst_double-Lstore_table /* FFI_TYPE_DOUBLE */ + .long Lst_ldouble-Lstore_table /* FFI_TYPE_LONGDOUBLE */ + .long Lst_uint8-Lstore_table /* FFI_TYPE_UINT8 */ + .long Lst_sint8-Lstore_table /* FFI_TYPE_SINT8 */ + .long Lst_uint16-Lstore_table /* FFI_TYPE_UINT16 */ + .long Lst_sint16-Lstore_table /* FFI_TYPE_SINT16 */ + .long Lst_uint32-Lstore_table /* FFI_TYPE_UINT32 */ + .long Lst_sint32-Lstore_table /* FFI_TYPE_SINT32 */ + .long Lst_int64-Lstore_table /* FFI_TYPE_UINT64 */ + .long Lst_int64-Lstore_table /* FFI_TYPE_SINT64 */ + .long Lst_struct-Lstore_table /* FFI_TYPE_STRUCT */ + .long Lst_int64-Lstore_table /* FFI_TYPE_POINTER */ + + .text + .align 3 +Lst_void: + ret + .align 3 +Lst_uint8: + movzbq %al, %rax + movq %rax, (%rdi) + ret + .align 3 +Lst_sint8: + movsbq %al, %rax + movq %rax, (%rdi) + ret + .align 3 +Lst_uint16: + movzwq %ax, %rax + movq %rax, (%rdi) + .align 3 +Lst_sint16: + movswq %ax, %rax + movq %rax, (%rdi) + ret + .align 3 +Lst_uint32: + movl %eax, %eax + movq %rax, (%rdi) + .align 3 +Lst_sint32: + cltq + movq %rax, (%rdi) + ret + .align 3 +Lst_int64: + movq %rax, (%rdi) + ret + .align 3 +Lst_float: + movss %xmm0, (%rdi) + ret + .align 3 +Lst_double: + movsd %xmm0, (%rdi) + ret +Lst_ldouble: + fstpt (%rdi) + ret + .align 3 +Lst_struct: + leaq -20(%rsp), %rsi /* Scratch area in redzone. */ + + /* We have to locate the values now, and since we don't want to + write too much data into the user's return value, we spill the + value to a 16 byte scratch area first. Bits 8, 9, and 10 + control where the values are located. Only one of the three + bits will be set; see ffi_prep_cif_machdep for the pattern. */ + movd %xmm0, %r10 + movd %xmm1, %r11 + testl $0x100, %ecx + cmovnz %rax, %rdx + cmovnz %r10, %rax + testl $0x200, %ecx + cmovnz %r10, %rdx + testl $0x400, %ecx + cmovnz %r10, %rax + cmovnz %r11, %rdx + movq %rax, (%rsi) + movq %rdx, 8(%rsi) + + /* Bits 12-31 contain the true size of the structure. Copy from + the scratch area to the true destination. */ + shrl $12, %ecx + rep movsb + ret + + /* Many times we can avoid loading any SSE registers at all. + It's not worth an indirect jump to load the exact set of + SSE registers needed; zero or all is a good compromise. */ + .align 3 +LUW3: +Lload_sse: + movdqa 48(%r10), %xmm0 + movdqa 64(%r10), %xmm1 + movdqa 80(%r10), %xmm2 + movdqa 96(%r10), %xmm3 + movdqa 112(%r10), %xmm4 + movdqa 128(%r10), %xmm5 + movdqa 144(%r10), %xmm6 + movdqa 160(%r10), %xmm7 + jmp Lret_from_load_sse + +LUW4: + .align 3 + .globl _ffi_closure_unix64 + +_ffi_closure_unix64: +LUW5: + /* The carry flag is set by the trampoline iff SSE registers + are used. Don't clobber it before the branch instruction. */ + leaq -200(%rsp), %rsp +LUW6: + movq %rdi, (%rsp) + movq %rsi, 8(%rsp) + movq %rdx, 16(%rsp) + movq %rcx, 24(%rsp) + movq %r8, 32(%rsp) + movq %r9, 40(%rsp) + jc Lsave_sse +Lret_from_save_sse: + + movq %r10, %rdi + leaq 176(%rsp), %rsi + movq %rsp, %rdx + leaq 208(%rsp), %rcx + call _ffi_closure_unix64_inner + + /* Deallocate stack frame early; return value is now in redzone. */ + addq $200, %rsp +LUW7: + + /* The first byte of the return value contains the FFI_TYPE. */ + movzbl %al, %r10d + leaq Lload_table(%rip), %r11 + movslq (%r11, %r10, 4), %r10 + addq %r11, %r10 + jmp *%r10 + +Lload_table: + .long Lld_void-Lload_table /* FFI_TYPE_VOID */ + .long Lld_int32-Lload_table /* FFI_TYPE_INT */ + .long Lld_float-Lload_table /* FFI_TYPE_FLOAT */ + .long Lld_double-Lload_table /* FFI_TYPE_DOUBLE */ + .long Lld_ldouble-Lload_table /* FFI_TYPE_LONGDOUBLE */ + .long Lld_int8-Lload_table /* FFI_TYPE_UINT8 */ + .long Lld_int8-Lload_table /* FFI_TYPE_SINT8 */ + .long Lld_int16-Lload_table /* FFI_TYPE_UINT16 */ + .long Lld_int16-Lload_table /* FFI_TYPE_SINT16 */ + .long Lld_int32-Lload_table /* FFI_TYPE_UINT32 */ + .long Lld_int32-Lload_table /* FFI_TYPE_SINT32 */ + .long Lld_int64-Lload_table /* FFI_TYPE_UINT64 */ + .long Lld_int64-Lload_table /* FFI_TYPE_SINT64 */ + .long Lld_struct-Lload_table /* FFI_TYPE_STRUCT */ + .long Lld_int64-Lload_table /* FFI_TYPE_POINTER */ + + .text + .align 3 +Lld_void: + ret + .align 3 +Lld_int8: + movzbl -24(%rsp), %eax + ret + .align 3 +Lld_int16: + movzwl -24(%rsp), %eax + ret + .align 3 +Lld_int32: + movl -24(%rsp), %eax + ret + .align 3 +Lld_int64: + movq -24(%rsp), %rax + ret + .align 3 +Lld_float: + movss -24(%rsp), %xmm0 + ret + .align 3 +Lld_double: + movsd -24(%rsp), %xmm0 + ret + .align 3 +Lld_ldouble: + fldt -24(%rsp) + ret + .align 3 +Lld_struct: + /* There are four possibilities here, %rax/%rdx, %xmm0/%rax, + %rax/%xmm0, %xmm0/%xmm1. We collapse two by always loading + both rdx and xmm1 with the second word. For the remaining, + bit 8 set means xmm0 gets the second word, and bit 9 means + that rax gets the second word. */ + movq -24(%rsp), %rcx + movq -16(%rsp), %rdx + movq -16(%rsp), %xmm1 + testl $0x100, %eax + cmovnz %rdx, %rcx + movd %rcx, %xmm0 + testl $0x200, %eax + movq -24(%rsp), %rax + cmovnz %rdx, %rax + ret + + /* See the comment above Lload_sse; the same logic applies here. */ + .align 3 +LUW8: +Lsave_sse: + movdqa %xmm0, 48(%rsp) + movdqa %xmm1, 64(%rsp) + movdqa %xmm2, 80(%rsp) + movdqa %xmm3, 96(%rsp) + movdqa %xmm4, 112(%rsp) + movdqa %xmm5, 128(%rsp) + movdqa %xmm6, 144(%rsp) + movdqa %xmm7, 160(%rsp) + jmp Lret_from_save_sse + +LUW9: +.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support +EH_frame1: + .set L$set$0,LECIE1-LSCIE1 /* CIE Length */ + .long L$set$0 +LSCIE1: + .long 0x0 /* CIE Identifier Tag */ + .byte 0x1 /* CIE Version */ + .ascii "zR\0" /* CIE Augmentation */ + .byte 0x1 /* uleb128 0x1; CIE Code Alignment Factor */ + .byte 0x78 /* sleb128 -8; CIE Data Alignment Factor */ + .byte 0x10 /* CIE RA Column */ + .byte 0x1 /* uleb128 0x1; Augmentation size */ + .byte 0x10 /* FDE Encoding (pcrel sdata4) */ + .byte 0xc /* DW_CFA_def_cfa, %rsp offset 8 */ + .byte 0x7 /* uleb128 0x7 */ + .byte 0x8 /* uleb128 0x8 */ + .byte 0x90 /* DW_CFA_offset, column 0x10 */ + .byte 0x1 + .align 3 +LECIE1: + .globl _ffi_call_unix64.eh +_ffi_call_unix64.eh: +LSFDE1: + .set L$set$1,LEFDE1-LASFDE1 /* FDE Length */ + .long L$set$1 +LASFDE1: + .long LASFDE1-EH_frame1 /* FDE CIE offset */ + .quad LUW0-. /* FDE initial location */ + .set L$set$2,LUW4-LUW0 /* FDE address range */ + .quad L$set$2 + .byte 0x0 /* Augmentation size */ + .byte 0x4 /* DW_CFA_advance_loc4 */ + .set L$set$3,LUW1-LUW0 + .long L$set$3 + + /* New stack frame based off rbp. This is a itty bit of unwind + trickery in that the CFA *has* changed. There is no easy way + to describe it correctly on entry to the function. Fortunately, + it doesn't matter too much since at all points we can correctly + unwind back to ffi_call. Note that the location to which we + moved the return address is (the new) CFA-8, so from the + perspective of the unwind info, it hasn't moved. */ + .byte 0xc /* DW_CFA_def_cfa, %rbp offset 32 */ + .byte 0x6 + .byte 0x20 + .byte 0x80+6 /* DW_CFA_offset, %rbp offset 2*-8 */ + .byte 0x2 + .byte 0xa /* DW_CFA_remember_state */ + + .byte 0x4 /* DW_CFA_advance_loc4 */ + .set L$set$4,LUW2-LUW1 + .long L$set$4 + .byte 0xc /* DW_CFA_def_cfa, %rsp offset 8 */ + .byte 0x7 + .byte 0x8 + .byte 0xc0+6 /* DW_CFA_restore, %rbp */ + + .byte 0x4 /* DW_CFA_advance_loc4 */ + .set L$set$5,LUW3-LUW2 + .long L$set$5 + .byte 0xb /* DW_CFA_restore_state */ + + .align 3 +LEFDE1: + .globl _ffi_closure_unix64.eh +_ffi_closure_unix64.eh: +LSFDE3: + .set L$set$6,LEFDE3-LASFDE3 /* FDE Length */ + .long L$set$6 +LASFDE3: + .long LASFDE3-EH_frame1 /* FDE CIE offset */ + .quad LUW5-. /* FDE initial location */ + .set L$set$7,LUW9-LUW5 /* FDE address range */ + .quad L$set$7 + .byte 0x0 /* Augmentation size */ + + .byte 0x4 /* DW_CFA_advance_loc4 */ + .set L$set$8,LUW6-LUW5 + .long L$set$8 + .byte 0xe /* DW_CFA_def_cfa_offset */ + .byte 208,1 /* uleb128 208 */ + .byte 0xa /* DW_CFA_remember_state */ + + .byte 0x4 /* DW_CFA_advance_loc4 */ + .set L$set$9,LUW7-LUW6 + .long L$set$9 + .byte 0xe /* DW_CFA_def_cfa_offset */ + .byte 0x8 + + .byte 0x4 /* DW_CFA_advance_loc4 */ + .set L$set$10,LUW8-LUW7 + .long L$set$10 + .byte 0xb /* DW_CFA_restore_state */ + + .align 3 +LEFDE3: + .subsections_via_symbols + +#endif /* __x86_64__ */ diff -r -u ./Modules/_ctypes/libffi_osx/x86/x86-darwin.S ./Modules/_ctypes/libffi_osx/x86/x86-darwin.S new file mode 100644 index 0000000..925a841 --- /dev/null +++ ./Modules/_ctypes/libffi_osx/x86/x86-darwin.S @@ -0,0 +1,422 @@ +#ifdef __i386__ +/* ----------------------------------------------------------------------- + darwin.S - Copyright (c) 1996, 1998, 2001, 2002, 2003 Red Hat, Inc. + + X86 Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +/* + * This file is based on sysv.S and then hacked up by Ronald who hasn't done + * assembly programming in 8 years. + */ + +#ifndef __x86_64__ + +#define LIBFFI_ASM +#include +#include + +#ifdef PyObjC_STRICT_DEBUGGING + /* XXX: Debugging of stack alignment, to be removed */ +#define ASSERT_STACK_ALIGNED movdqa -16(%esp), %xmm0 +#else +#define ASSERT_STACK_ALIGNED +#endif + +.text + +.globl _ffi_prep_args + + .align 4 +.globl _ffi_call_SYSV + +_ffi_call_SYSV: +LFB1: + pushl %ebp +LCFI0: + movl %esp,%ebp +LCFI1: + subl $8,%esp + /* Make room for all of the new args. */ + movl 16(%ebp),%ecx + subl %ecx,%esp + + movl %esp,%eax + + /* Place all of the ffi_prep_args in position */ + subl $8,%esp + pushl 12(%ebp) + pushl %eax + call *8(%ebp) + + /* Return stack to previous state and call the function */ + addl $16,%esp + + call *28(%ebp) + + /* Remove the space we pushed for the args */ + movl 16(%ebp),%ecx + addl %ecx,%esp + + /* Load %ecx with the return type code */ + movl 20(%ebp),%ecx + + /* If the return value pointer is NULL, assume no return value. */ + cmpl $0,24(%ebp) + jne Lretint + + /* Even if there is no space for the return value, we are + obliged to handle floating-point values. */ + cmpl $FFI_TYPE_FLOAT,%ecx + jne Lnoretval + fstp %st(0) + + jmp Lepilogue + +Lretint: + cmpl $FFI_TYPE_INT,%ecx + jne Lretfloat + /* Load %ecx with the pointer to storage for the return value */ + movl 24(%ebp),%ecx + movl %eax,0(%ecx) + jmp Lepilogue + +Lretfloat: + cmpl $FFI_TYPE_FLOAT,%ecx + jne Lretdouble + /* Load %ecx with the pointer to storage for the return value */ + movl 24(%ebp),%ecx + fstps (%ecx) + jmp Lepilogue + +Lretdouble: + cmpl $FFI_TYPE_DOUBLE,%ecx + jne Lretlongdouble + /* Load %ecx with the pointer to storage for the return value */ + movl 24(%ebp),%ecx + fstpl (%ecx) + jmp Lepilogue + +Lretlongdouble: + cmpl $FFI_TYPE_LONGDOUBLE,%ecx + jne Lretint64 + /* Load %ecx with the pointer to storage for the return value */ + movl 24(%ebp),%ecx + fstpt (%ecx) + jmp Lepilogue + +Lretint64: + cmpl $FFI_TYPE_SINT64,%ecx + jne Lretstruct1b + /* Load %ecx with the pointer to storage for the return value */ + movl 24(%ebp),%ecx + movl %eax,0(%ecx) + movl %edx,4(%ecx) + jmp Lepilogue + +Lretstruct1b: + cmpl $FFI_TYPE_SINT8,%ecx + jne Lretstruct2b + /* Load %ecx with the pointer to storage for the return value */ + movl 24(%ebp),%ecx + movb %al,0(%ecx) + jmp Lepilogue + +Lretstruct2b: + cmpl $FFI_TYPE_SINT16,%ecx + jne Lretstruct + /* Load %ecx with the pointer to storage for the return value */ + movl 24(%ebp),%ecx + movw %ax,0(%ecx) + jmp Lepilogue + +Lretstruct: + cmpl $FFI_TYPE_STRUCT,%ecx + jne Lnoretval + /* Nothing to do! */ + addl $4,%esp + popl %ebp + ret + +Lnoretval: +Lepilogue: + addl $8,%esp + movl %ebp,%esp + popl %ebp + ret +LFE1: +.ffi_call_SYSV_end: + + .align 4 +FFI_HIDDEN (ffi_closure_SYSV) +.globl _ffi_closure_SYSV + +_ffi_closure_SYSV: +LFB2: + pushl %ebp +LCFI2: + movl %esp, %ebp +LCFI3: + subl $56, %esp + leal -40(%ebp), %edx + movl %edx, -12(%ebp) /* resp */ + leal 8(%ebp), %edx + movl %edx, 4(%esp) /* args = __builtin_dwarf_cfa () */ + leal -12(%ebp), %edx + movl %edx, (%esp) /* &resp */ + movl %ebx, 8(%esp) +LCFI7: + call L_ffi_closure_SYSV_inner$stub + movl 8(%esp), %ebx + movl -12(%ebp), %ecx + cmpl $FFI_TYPE_INT, %eax + je Lcls_retint + cmpl $FFI_TYPE_FLOAT, %eax + je Lcls_retfloat + cmpl $FFI_TYPE_DOUBLE, %eax + je Lcls_retdouble + cmpl $FFI_TYPE_LONGDOUBLE, %eax + je Lcls_retldouble + cmpl $FFI_TYPE_SINT64, %eax + je Lcls_retllong + cmpl $FFI_TYPE_UINT8, %eax + je Lcls_retstruct1 + cmpl $FFI_TYPE_SINT8, %eax + je Lcls_retstruct1 + cmpl $FFI_TYPE_UINT16, %eax + je Lcls_retstruct2 + cmpl $FFI_TYPE_SINT16, %eax + je Lcls_retstruct2 + cmpl $FFI_TYPE_STRUCT, %eax + je Lcls_retstruct +Lcls_epilogue: + movl %ebp, %esp + popl %ebp + ret +Lcls_retint: + movl (%ecx), %eax + jmp Lcls_epilogue +Lcls_retfloat: + flds (%ecx) + jmp Lcls_epilogue +Lcls_retdouble: + fldl (%ecx) + jmp Lcls_epilogue +Lcls_retldouble: + fldt (%ecx) + jmp Lcls_epilogue +Lcls_retllong: + movl (%ecx), %eax + movl 4(%ecx), %edx + jmp Lcls_epilogue +Lcls_retstruct1: + movsbl (%ecx), %eax + jmp Lcls_epilogue +Lcls_retstruct2: + movswl (%ecx), %eax + jmp Lcls_epilogue +Lcls_retstruct: + lea -8(%ebp),%esp + movl %ebp, %esp + popl %ebp + ret $4 +LFE2: + +#if !FFI_NO_RAW_API + +#define RAW_CLOSURE_CIF_OFFSET ((FFI_TRAMPOLINE_SIZE + 3) & ~3) +#define RAW_CLOSURE_FUN_OFFSET (RAW_CLOSURE_CIF_OFFSET + 4) +#define RAW_CLOSURE_USER_DATA_OFFSET (RAW_CLOSURE_FUN_OFFSET + 4) +#define CIF_FLAGS_OFFSET 20 + + .align 4 +FFI_HIDDEN (ffi_closure_raw_SYSV) +.globl _ffi_closure_raw_SYSV + +_ffi_closure_raw_SYSV: +LFB3: + pushl %ebp +LCFI4: + movl %esp, %ebp +LCFI5: + pushl %esi +LCFI6: + subl $36, %esp + movl RAW_CLOSURE_CIF_OFFSET(%eax), %esi /* closure->cif */ + movl RAW_CLOSURE_USER_DATA_OFFSET(%eax), %edx /* closure->user_data */ + movl %edx, 12(%esp) /* user_data */ + leal 8(%ebp), %edx /* __builtin_dwarf_cfa () */ + movl %edx, 8(%esp) /* raw_args */ + leal -24(%ebp), %edx + movl %edx, 4(%esp) /* &res */ + movl %esi, (%esp) /* cif */ + call *RAW_CLOSURE_FUN_OFFSET(%eax) /* closure->fun */ + movl CIF_FLAGS_OFFSET(%esi), %eax /* rtype */ + cmpl $FFI_TYPE_INT, %eax + je Lrcls_retint + cmpl $FFI_TYPE_FLOAT, %eax + je Lrcls_retfloat + cmpl $FFI_TYPE_DOUBLE, %eax + je Lrcls_retdouble + cmpl $FFI_TYPE_LONGDOUBLE, %eax + je Lrcls_retldouble + cmpl $FFI_TYPE_SINT64, %eax + je Lrcls_retllong +Lrcls_epilogue: + addl $36, %esp + popl %esi + popl %ebp + ret +Lrcls_retint: + movl -24(%ebp), %eax + jmp Lrcls_epilogue +Lrcls_retfloat: + flds -24(%ebp) + jmp Lrcls_epilogue +Lrcls_retdouble: + fldl -24(%ebp) + jmp Lrcls_epilogue +Lrcls_retldouble: + fldt -24(%ebp) + jmp Lrcls_epilogue +Lrcls_retllong: + movl -24(%ebp), %eax + movl -20(%ebp), %edx + jmp Lrcls_epilogue +LFE3: +#endif + +.section __IMPORT,__jump_table,symbol_stubs,self_modifying_code+pure_instructions,5 +L_ffi_closure_SYSV_inner$stub: + .indirect_symbol _ffi_closure_SYSV_inner + hlt ; hlt ; hlt ; hlt ; hlt + + +.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support +EH_frame1: + .set L$set$0,LECIE1-LSCIE1 + .long L$set$0 +LSCIE1: + .long 0x0 + .byte 0x1 + .ascii "zR\0" + .byte 0x1 + .byte 0x7c + .byte 0x8 + .byte 0x1 + .byte 0x10 + .byte 0xc + .byte 0x5 + .byte 0x4 + .byte 0x88 + .byte 0x1 + .align 2 +LECIE1: +.globl _ffi_call_SYSV.eh +_ffi_call_SYSV.eh: +LSFDE1: + .set L$set$1,LEFDE1-LASFDE1 + .long L$set$1 +LASFDE1: + .long LASFDE1-EH_frame1 + .long LFB1-. + .set L$set$2,LFE1-LFB1 + .long L$set$2 + .byte 0x0 + .byte 0x4 + .set L$set$3,LCFI0-LFB1 + .long L$set$3 + .byte 0xe + .byte 0x8 + .byte 0x84 + .byte 0x2 + .byte 0x4 + .set L$set$4,LCFI1-LCFI0 + .long L$set$4 + .byte 0xd + .byte 0x4 + .align 2 +LEFDE1: +.globl _ffi_closure_SYSV.eh +_ffi_closure_SYSV.eh: +LSFDE2: + .set L$set$5,LEFDE2-LASFDE2 + .long L$set$5 +LASFDE2: + .long LASFDE2-EH_frame1 + .long LFB2-. + .set L$set$6,LFE2-LFB2 + .long L$set$6 + .byte 0x0 + .byte 0x4 + .set L$set$7,LCFI2-LFB2 + .long L$set$7 + .byte 0xe + .byte 0x8 + .byte 0x84 + .byte 0x2 + .byte 0x4 + .set L$set$8,LCFI3-LCFI2 + .long L$set$8 + .byte 0xd + .byte 0x4 + .align 2 +LEFDE2: + +#if !FFI_NO_RAW_API + +.globl _ffi_closure_raw_SYSV.eh +_ffi_closure_raw_SYSV.eh: +LSFDE3: + .set L$set$10,LEFDE3-LASFDE3 + .long L$set$10 +LASFDE3: + .long LASFDE3-EH_frame1 + .long LFB3-. + .set L$set$11,LFE3-LFB3 + .long L$set$11 + .byte 0x0 + .byte 0x4 + .set L$set$12,LCFI4-LFB3 + .long L$set$12 + .byte 0xe + .byte 0x8 + .byte 0x84 + .byte 0x2 + .byte 0x4 + .set L$set$13,LCFI5-LCFI4 + .long L$set$13 + .byte 0xd + .byte 0x4 + .byte 0x4 + .set L$set$14,LCFI6-LCFI5 + .long L$set$14 + .byte 0x85 + .byte 0x3 + .align 2 +LEFDE3: + +#endif + +#endif /* ifndef __x86_64__ */ + +#endif /* defined __i386__ */ diff -r -u ./Modules/_ctypes/libffi_osx/x86/x86-ffi64.c ./Modules/_ctypes/libffi_osx/x86/x86-ffi64.c new file mode 100644 index 0000000..06feaf2 --- /dev/null +++ ./Modules/_ctypes/libffi_osx/x86/x86-ffi64.c @@ -0,0 +1,734 @@ +#ifdef __x86_64__ + +/* ----------------------------------------------------------------------- + x86-ffi64.c - Copyright (c) 2002 Bo Thorsen + + x86-64 Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#include +#include + +#include +#include + +#define MAX_GPR_REGS 6 +#define MAX_SSE_REGS 8 + +typedef struct RegisterArgs { + /* Registers for argument passing. */ + UINT64 gpr[MAX_GPR_REGS]; + __int128_t sse[MAX_SSE_REGS]; +} RegisterArgs; + +extern void +ffi_call_unix64( + void* args, + unsigned long bytes, + unsigned flags, + void* raddr, + void (*fnaddr)(), + unsigned ssecount); + +/* All reference to register classes here is identical to the code in + gcc/config/i386/i386.c. Do *not* change one without the other. */ + +/* Register class used for passing given 64bit part of the argument. + These represent classes as documented by the PS ABI, with the exception + of SSESF, SSEDF classes, that are basically SSE class, just gcc will + use SF or DFmode move instead of DImode to avoid reformating penalties. + + Similary we play games with INTEGERSI_CLASS to use cheaper SImode moves + whenever possible (upper half does contain padding). */ +enum x86_64_reg_class +{ + X86_64_NO_CLASS, + X86_64_INTEGER_CLASS, + X86_64_INTEGERSI_CLASS, + X86_64_SSE_CLASS, + X86_64_SSESF_CLASS, + X86_64_SSEDF_CLASS, + X86_64_SSEUP_CLASS, + X86_64_X87_CLASS, + X86_64_X87UP_CLASS, + X86_64_COMPLEX_X87_CLASS, + X86_64_MEMORY_CLASS +}; + +#define MAX_CLASSES 4 +#define SSE_CLASS_P(X) ((X) >= X86_64_SSE_CLASS && X <= X86_64_SSEUP_CLASS) + +/* x86-64 register passing implementation. See x86-64 ABI for details. Goal + of this code is to classify each 8bytes of incoming argument by the register + class and assign registers accordingly. */ + +/* Return the union class of CLASS1 and CLASS2. + See the x86-64 PS ABI for details. */ +static enum x86_64_reg_class +merge_classes( + enum x86_64_reg_class class1, + enum x86_64_reg_class class2) +{ + /* Rule #1: If both classes are equal, this is the resulting class. */ + if (class1 == class2) + return class1; + + /* Rule #2: If one of the classes is NO_CLASS, the resulting class is + the other class. */ + if (class1 == X86_64_NO_CLASS) + return class2; + + if (class2 == X86_64_NO_CLASS) + return class1; + + /* Rule #3: If one of the classes is MEMORY, the result is MEMORY. */ + if (class1 == X86_64_MEMORY_CLASS || class2 == X86_64_MEMORY_CLASS) + return X86_64_MEMORY_CLASS; + + /* Rule #4: If one of the classes is INTEGER, the result is INTEGER. */ + if ((class1 == X86_64_INTEGERSI_CLASS && class2 == X86_64_SSESF_CLASS) + || (class2 == X86_64_INTEGERSI_CLASS && class1 == X86_64_SSESF_CLASS)) + return X86_64_INTEGERSI_CLASS; + + if (class1 == X86_64_INTEGER_CLASS || class1 == X86_64_INTEGERSI_CLASS + || class2 == X86_64_INTEGER_CLASS || class2 == X86_64_INTEGERSI_CLASS) + return X86_64_INTEGER_CLASS; + + /* Rule #5: If one of the classes is X87, X87UP, or COMPLEX_X87 class, + MEMORY is used. */ + if (class1 == X86_64_X87_CLASS + || class1 == X86_64_X87UP_CLASS + || class1 == X86_64_COMPLEX_X87_CLASS + || class2 == X86_64_X87_CLASS + || class2 == X86_64_X87UP_CLASS + || class2 == X86_64_COMPLEX_X87_CLASS) + return X86_64_MEMORY_CLASS; + + /* Rule #6: Otherwise class SSE is used. */ + return X86_64_SSE_CLASS; +} + +/* Classify the argument of type TYPE and mode MODE. + CLASSES will be filled by the register class used to pass each word + of the operand. The number of words is returned. In case the parameter + should be passed in memory, 0 is returned. As a special case for zero + sized containers, classes[0] will be NO_CLASS and 1 is returned. + + See the x86-64 PS ABI for details. */ + +static int +classify_argument( + ffi_type* type, + enum x86_64_reg_class classes[], + size_t byte_offset) +{ + switch (type->type) + { + case FFI_TYPE_UINT8: + case FFI_TYPE_SINT8: + case FFI_TYPE_UINT16: + case FFI_TYPE_SINT16: + case FFI_TYPE_UINT32: + case FFI_TYPE_SINT32: + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + case FFI_TYPE_POINTER: +#if 0 + if (byte_offset + type->size <= 4) + classes[0] = X86_64_INTEGERSI_CLASS; + else + classes[0] = X86_64_INTEGER_CLASS; + + return 1; +#else + { + int size = byte_offset + type->size; + + if (size <= 4) + { + classes[0] = X86_64_INTEGERSI_CLASS; + return 1; + } + else if (size <= 8) + { + classes[0] = X86_64_INTEGER_CLASS; + return 1; + } + else if (size <= 12) + { + classes[0] = X86_64_INTEGER_CLASS; + classes[1] = X86_64_INTEGERSI_CLASS; + return 2; + } + else if (size <= 16) + { + classes[0] = classes[1] = X86_64_INTEGERSI_CLASS; + return 2; + } + else + FFI_ASSERT (0); + } +#endif + + case FFI_TYPE_FLOAT: + if (byte_offset == 0) + classes[0] = X86_64_SSESF_CLASS; + else + classes[0] = X86_64_SSE_CLASS; + + return 1; + + case FFI_TYPE_DOUBLE: + classes[0] = X86_64_SSEDF_CLASS; + return 1; + + case FFI_TYPE_LONGDOUBLE: + classes[0] = X86_64_X87_CLASS; + classes[1] = X86_64_X87UP_CLASS; + return 2; + + case FFI_TYPE_STRUCT: + { + ffi_type** ptr; + int i; + enum x86_64_reg_class subclasses[MAX_CLASSES]; + const int UNITS_PER_WORD = 8; + int words = + (type->size + UNITS_PER_WORD - 1) / UNITS_PER_WORD; + + /* If the struct is larger than 16 bytes, pass it on the stack. */ + if (type->size > 16) + return 0; + + for (i = 0; i < words; i++) + classes[i] = X86_64_NO_CLASS; + + /* Merge the fields of structure. */ + for (ptr = type->elements; *ptr != NULL; ptr++) + { + byte_offset = ALIGN(byte_offset, (*ptr)->alignment); + + int num = classify_argument(*ptr, subclasses, byte_offset % 8); + + if (num == 0) + return 0; + + int pos = byte_offset / 8; + + for (i = 0; i < num; i++) + { + classes[i + pos] = + merge_classes(subclasses[i], classes[i + pos]); + } + + byte_offset += (*ptr)->size; + } + + if (words > 2) + { + /* When size > 16 bytes, if the first one isn't + X86_64_SSE_CLASS or any other ones aren't + X86_64_SSEUP_CLASS, everything should be passed in + memory. */ + if (classes[0] != X86_64_SSE_CLASS) + return 0; + + for (i = 1; i < words; i++) + if (classes[i] != X86_64_SSEUP_CLASS) + return 0; + } + + + /* Final merger cleanup. */ + for (i = 0; i < words; i++) + { + /* If one class is MEMORY, everything should be passed in + memory. */ + if (classes[i] == X86_64_MEMORY_CLASS) + return 0; + + /* The X86_64_SSEUP_CLASS should be always preceded by + X86_64_SSE_CLASS. */ + if (classes[i] == X86_64_SSEUP_CLASS + && classes[i - 1] != X86_64_SSE_CLASS + && classes[i - 1] != X86_64_SSEUP_CLASS) + { + FFI_ASSERT(i != 0); + classes[i] = X86_64_SSE_CLASS; + } + + /* X86_64_X87UP_CLASS should be preceded by X86_64_X87_CLASS. */ + if (classes[i] == X86_64_X87UP_CLASS + && classes[i - 1] != X86_64_X87_CLASS) + { + FFI_ASSERT(i != 0); + classes[i] = X86_64_SSE_CLASS; + } + } + + return words; + } + + default: + FFI_ASSERT(0); + } + + return 0; /* Never reached. */ +} + +/* Examine the argument and return set number of register required in each + class. Return zero if parameter should be passed in memory, otherwise + the number of registers. */ +static int +examine_argument( + ffi_type* type, + enum x86_64_reg_class classes[MAX_CLASSES], + _Bool in_return, + int* pngpr, + int* pnsse) +{ + int n = classify_argument(type, classes, 0); + int ngpr = 0; + int nsse = 0; + int i; + + if (n == 0) + return 0; + + for (i = 0; i < n; ++i) + { + switch (classes[i]) + { + case X86_64_INTEGER_CLASS: + case X86_64_INTEGERSI_CLASS: + ngpr++; + break; + + case X86_64_SSE_CLASS: + case X86_64_SSESF_CLASS: + case X86_64_SSEDF_CLASS: + nsse++; + break; + + case X86_64_NO_CLASS: + case X86_64_SSEUP_CLASS: + break; + + case X86_64_X87_CLASS: + case X86_64_X87UP_CLASS: + case X86_64_COMPLEX_X87_CLASS: + return in_return != 0; + + default: + abort(); + } + } + + *pngpr = ngpr; + *pnsse = nsse; + + return n; +} + +/* Perform machine dependent cif processing. */ +ffi_status +ffi_prep_cif_machdep( + ffi_cif* cif) +{ + int gprcount = 0; + int ssecount = 0; + int flags = cif->rtype->type; + int i, avn, n, ngpr, nsse; + enum x86_64_reg_class classes[MAX_CLASSES]; + size_t bytes; + + if (flags != FFI_TYPE_VOID) + { + n = examine_argument (cif->rtype, classes, 1, &ngpr, &nsse); + + if (n == 0) + { + /* The return value is passed in memory. A pointer to that + memory is the first argument. Allocate a register for it. */ + gprcount++; + + /* We don't have to do anything in asm for the return. */ + flags = FFI_TYPE_VOID; + } + else if (flags == FFI_TYPE_STRUCT) + { + /* Mark which registers the result appears in. */ + _Bool sse0 = SSE_CLASS_P(classes[0]); + _Bool sse1 = n == 2 && SSE_CLASS_P(classes[1]); + + if (sse0 && !sse1) + flags |= 1 << 8; + else if (!sse0 && sse1) + flags |= 1 << 9; + else if (sse0 && sse1) + flags |= 1 << 10; + + /* Mark the true size of the structure. */ + flags |= cif->rtype->size << 12; + } + } + + /* Go over all arguments and determine the way they should be passed. + If it's in a register and there is space for it, let that be so. If + not, add it's size to the stack byte count. */ + for (bytes = 0, i = 0, avn = cif->nargs; i < avn; i++) + { + if (examine_argument(cif->arg_types[i], classes, 0, &ngpr, &nsse) == 0 + || gprcount + ngpr > MAX_GPR_REGS + || ssecount + nsse > MAX_SSE_REGS) + { + long align = cif->arg_types[i]->alignment; + + if (align < 8) + align = 8; + + bytes = ALIGN(bytes, align); + bytes += cif->arg_types[i]->size; + } + else + { + gprcount += ngpr; + ssecount += nsse; + } + } + + if (ssecount) + flags |= 1 << 11; + + cif->flags = flags; + cif->bytes = bytes; + cif->bytes = ALIGN(bytes,8); + + return FFI_OK; +} + +void +ffi_call( + ffi_cif* cif, + void (*fn)(), + void* rvalue, + void** avalue) +{ + enum x86_64_reg_class classes[MAX_CLASSES]; + char* stack; + char* argp; + ffi_type** arg_types; + int gprcount, ssecount, ngpr, nsse, i, avn; + _Bool ret_in_memory; + RegisterArgs* reg_args; + + /* Can't call 32-bit mode from 64-bit mode. */ + FFI_ASSERT(cif->abi == FFI_UNIX64); + + /* If the return value is a struct and we don't have a return value + address then we need to make one. Note the setting of flags to + VOID above in ffi_prep_cif_machdep. */ + ret_in_memory = (cif->rtype->type == FFI_TYPE_STRUCT + && (cif->flags & 0xff) == FFI_TYPE_VOID); + + if (rvalue == NULL && ret_in_memory) + rvalue = alloca (cif->rtype->size); + + /* Allocate the space for the arguments, plus 4 words of temp space. */ + stack = alloca(sizeof(RegisterArgs) + cif->bytes + 4 * 8); + reg_args = (RegisterArgs*)stack; + argp = stack + sizeof(RegisterArgs); + + gprcount = ssecount = 0; + + /* If the return value is passed in memory, add the pointer as the + first integer argument. */ + if (ret_in_memory) + reg_args->gpr[gprcount++] = (long) rvalue; + + avn = cif->nargs; + arg_types = cif->arg_types; + + for (i = 0; i < avn; ++i) + { + size_t size = arg_types[i]->size; + int n; + + n = examine_argument (arg_types[i], classes, 0, &ngpr, &nsse); + + if (n == 0 + || gprcount + ngpr > MAX_GPR_REGS + || ssecount + nsse > MAX_SSE_REGS) + { + long align = arg_types[i]->alignment; + + /* Stack arguments are *always* at least 8 byte aligned. */ + if (align < 8) + align = 8; + + /* Pass this argument in memory. */ + argp = (void *) ALIGN (argp, align); + memcpy (argp, avalue[i], size); + argp += size; + } + else + { /* The argument is passed entirely in registers. */ + char *a = (char *) avalue[i]; + int j; + + for (j = 0; j < n; j++, a += 8, size -= 8) + { + switch (classes[j]) + { + case X86_64_INTEGER_CLASS: + case X86_64_INTEGERSI_CLASS: + reg_args->gpr[gprcount] = 0; + switch (arg_types[i]->type) { + case FFI_TYPE_SINT8: + { + int8_t shortval = *(int8_t*)a; + int64_t actval = (int64_t)shortval; + reg_args->gpr[gprcount] = actval; + /*memcpy (®_args->gpr[gprcount], &actval, 8);*/ + break; + } + + case FFI_TYPE_SINT16: + { + int16_t shortval = *(int16_t*)a; + int64_t actval = (int64_t)shortval; + memcpy (®_args->gpr[gprcount], &actval, 8); + break; + } + + case FFI_TYPE_SINT32: + { + int32_t shortval = *(int32_t*)a; + int64_t actval = (int64_t)shortval; + memcpy (®_args->gpr[gprcount], &actval, 8); + break; + } + + case FFI_TYPE_UINT8: + { + u_int8_t shortval = *(u_int8_t*)a; + u_int64_t actval = (u_int64_t)shortval; + /*memcpy (®_args->gpr[gprcount], &actval, 8);*/ + reg_args->gpr[gprcount] = actval; + break; + } + + case FFI_TYPE_UINT16: + { + u_int16_t shortval = *(u_int16_t*)a; + u_int64_t actval = (u_int64_t)shortval; + memcpy (®_args->gpr[gprcount], &actval, 8); + break; + } + + case FFI_TYPE_UINT32: + { + u_int32_t shortval = *(u_int32_t*)a; + u_int64_t actval = (u_int64_t)shortval; + memcpy (®_args->gpr[gprcount], &actval, 8); + break; + } + + default: + //memcpy (®_args->gpr[gprcount], a, size < 8 ? size : 8); + reg_args->gpr[gprcount] = *(int64_t*)a; + } + gprcount++; + break; + + case X86_64_SSE_CLASS: + case X86_64_SSEDF_CLASS: + reg_args->sse[ssecount++] = *(UINT64 *) a; + break; + + case X86_64_SSESF_CLASS: + reg_args->sse[ssecount++] = *(UINT32 *) a; + break; + + default: + abort(); + } + } + } + } + + ffi_call_unix64 (stack, cif->bytes + sizeof(RegisterArgs), + cif->flags, rvalue, fn, ssecount); +} + +extern void ffi_closure_unix64(void); + +ffi_status +ffi_prep_closure( + ffi_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif*, void*, void**, void*), + void* user_data) +{ + if (cif->abi != FFI_UNIX64) + return FFI_BAD_ABI; + + volatile unsigned short* tramp = + (volatile unsigned short*)&closure->tramp[0]; + + tramp[0] = 0xbb49; /* mov , %r11 */ + *(void* volatile*)&tramp[1] = ffi_closure_unix64; + tramp[5] = 0xba49; /* mov , %r10 */ + *(void* volatile*)&tramp[6] = closure; + + /* Set the carry bit if the function uses any sse registers. + This is clc or stc, together with the first byte of the jmp. */ + tramp[10] = cif->flags & (1 << 11) ? 0x49f9 : 0x49f8; + tramp[11] = 0xe3ff; /* jmp *%r11 */ + + closure->cif = cif; + closure->fun = fun; + closure->user_data = user_data; + + return FFI_OK; +} + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wmissing-prototypes" +int +ffi_closure_unix64_inner( + ffi_closure* closure, + void* rvalue, + RegisterArgs* reg_args, + char* argp) +#pragma clang diagnostic pop +{ + ffi_cif* cif = closure->cif; + void** avalue = alloca(cif->nargs * sizeof(void *)); + ffi_type** arg_types; + long i, avn; + int gprcount = 0; + int ssecount = 0; + int ngpr, nsse; + int ret; + + ret = cif->rtype->type; + + if (ret != FFI_TYPE_VOID) + { + enum x86_64_reg_class classes[MAX_CLASSES]; + int n = examine_argument (cif->rtype, classes, 1, &ngpr, &nsse); + + if (n == 0) + { + /* The return value goes in memory. Arrange for the closure + return value to go directly back to the original caller. */ + rvalue = (void *) reg_args->gpr[gprcount++]; + + /* We don't have to do anything in asm for the return. */ + ret = FFI_TYPE_VOID; + } + else if (ret == FFI_TYPE_STRUCT && n == 2) + { + /* Mark which register the second word of the structure goes in. */ + _Bool sse0 = SSE_CLASS_P (classes[0]); + _Bool sse1 = SSE_CLASS_P (classes[1]); + + if (!sse0 && sse1) + ret |= 1 << 8; + else if (sse0 && !sse1) + ret |= 1 << 9; + } + } + + avn = cif->nargs; + arg_types = cif->arg_types; + + for (i = 0; i < avn; ++i) + { + enum x86_64_reg_class classes[MAX_CLASSES]; + int n; + + n = examine_argument (arg_types[i], classes, 0, &ngpr, &nsse); + + if (n == 0 + || gprcount + ngpr > MAX_GPR_REGS + || ssecount + nsse > MAX_SSE_REGS) + { + long align = arg_types[i]->alignment; + + /* Stack arguments are *always* at least 8 byte aligned. */ + if (align < 8) + align = 8; + + /* Pass this argument in memory. */ + argp = (void *) ALIGN (argp, align); + avalue[i] = argp; + argp += arg_types[i]->size; + } + +#if !defined(X86_DARWIN) + /* If the argument is in a single register, or two consecutive + registers, then we can use that address directly. */ + else if (n == 1 || (n == 2 && + SSE_CLASS_P (classes[0]) == SSE_CLASS_P (classes[1]))) + { + // The argument is in a single register. + if (SSE_CLASS_P (classes[0])) + { + avalue[i] = ®_args->sse[ssecount]; + ssecount += n; + } + else + { + avalue[i] = ®_args->gpr[gprcount]; + gprcount += n; + } + } +#endif + + /* Otherwise, allocate space to make them consecutive. */ + else + { + char *a = alloca (16); + int j; + + avalue[i] = a; + + for (j = 0; j < n; j++, a += 8) + { + if (SSE_CLASS_P (classes[j])) + memcpy (a, ®_args->sse[ssecount++], 8); + else + memcpy (a, ®_args->gpr[gprcount++], 8); + } + } + } + + /* Invoke the closure. */ + closure->fun (cif, rvalue, avalue, closure->user_data); + + /* Tell assembly how to perform return type promotions. */ + return ret; +} + +#endif /* __x86_64__ */ diff -r -u ./Modules/_ctypes/libffi_osx/x86/x86-ffi_darwin.c ./Modules/_ctypes/libffi_osx/x86/x86-ffi_darwin.c new file mode 100644 index 0000000..706ea0f --- /dev/null +++ ./Modules/_ctypes/libffi_osx/x86/x86-ffi_darwin.c @@ -0,0 +1,438 @@ +#ifdef __i386__ +/* ----------------------------------------------------------------------- + ffi.c - Copyright (c) 1996, 1998, 1999, 2001 Red Hat, Inc. + Copyright (c) 2002 Ranjit Mathew + Copyright (c) 2002 Bo Thorsen + Copyright (c) 2002 Roger Sayle + + x86 Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#include +#include + +#include + +/* ffi_prep_args is called by the assembly routine once stack space + has been allocated for the function's arguments */ + +void ffi_prep_args(char *stack, extended_cif *ecif); + +void ffi_prep_args(char *stack, extended_cif *ecif) +{ + register unsigned int i; + register void **p_argv; + register char *argp; + register ffi_type **p_arg; + + argp = stack; + + if (ecif->cif->flags == FFI_TYPE_STRUCT) + { + *(void **) argp = ecif->rvalue; + argp += 4; + } + + p_argv = ecif->avalue; + + for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; + i != 0; + i--, p_arg++) + { + size_t z; + + /* Align if necessary */ + if ((sizeof(int) - 1) & (unsigned) argp) + argp = (char *) ALIGN(argp, sizeof(int)); + + z = (*p_arg)->size; + if (z < sizeof(int)) + { + z = sizeof(int); + switch ((*p_arg)->type) + { + case FFI_TYPE_SINT8: + *(signed int *) argp = (signed int)*(SINT8 *)(* p_argv); + break; + + case FFI_TYPE_UINT8: + *(unsigned int *) argp = (unsigned int)*(UINT8 *)(* p_argv); + break; + + case FFI_TYPE_SINT16: + *(signed int *) argp = (signed int)*(SINT16 *)(* p_argv); + break; + + case FFI_TYPE_UINT16: + *(unsigned int *) argp = (unsigned int)*(UINT16 *)(* p_argv); + break; + + case FFI_TYPE_SINT32: + *(signed int *) argp = (signed int)*(SINT32 *)(* p_argv); + break; + + case FFI_TYPE_UINT32: + *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv); + break; + + case FFI_TYPE_STRUCT: + *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv); + break; + + default: + FFI_ASSERT(0); + } + } + else + { + memcpy(argp, *p_argv, z); + } + p_argv++; + argp += z; + } + + return; +} + +/* Perform machine dependent cif processing */ +ffi_status ffi_prep_cif_machdep(ffi_cif *cif) +{ + /* Set the return type flag */ + switch (cif->rtype->type) + { + case FFI_TYPE_VOID: +#ifdef X86 + case FFI_TYPE_STRUCT: + case FFI_TYPE_UINT8: + case FFI_TYPE_UINT16: + case FFI_TYPE_SINT8: + case FFI_TYPE_SINT16: +#endif + + case FFI_TYPE_SINT64: + case FFI_TYPE_FLOAT: + case FFI_TYPE_DOUBLE: + case FFI_TYPE_LONGDOUBLE: + cif->flags = (unsigned) cif->rtype->type; + break; + + case FFI_TYPE_UINT64: + cif->flags = FFI_TYPE_SINT64; + break; + +#ifndef X86 + case FFI_TYPE_STRUCT: + if (cif->rtype->size == 1) + { + cif->flags = FFI_TYPE_SINT8; /* same as char size */ + } + else if (cif->rtype->size == 2) + { + cif->flags = FFI_TYPE_SINT16; /* same as short size */ + } + else if (cif->rtype->size == 4) + { + cif->flags = FFI_TYPE_INT; /* same as int type */ + } + else if (cif->rtype->size == 8) + { + cif->flags = FFI_TYPE_SINT64; /* same as int64 type */ + } + else + { + cif->flags = FFI_TYPE_STRUCT; + } + break; +#endif + + default: + cif->flags = FFI_TYPE_INT; + break; + } + +#ifdef X86_DARWIN + cif->bytes = (cif->bytes + 15) & ~0xF; +#endif + + return FFI_OK; +} + +extern void ffi_call_SYSV(void (*)(char *, extended_cif *), extended_cif *, + unsigned, unsigned, unsigned *, void (*fn)()); + +#ifdef X86_WIN32 +extern void ffi_call_STDCALL(void (*)(char *, extended_cif *), extended_cif *, + unsigned, unsigned, unsigned *, void (*fn)()); + +#endif /* X86_WIN32 */ + +void ffi_call(ffi_cif *cif, void (*fn)(), void *rvalue, void **avalue) +{ + extended_cif ecif; + + ecif.cif = cif; + ecif.avalue = avalue; + + /* If the return value is a struct and we don't have a return */ + /* value address then we need to make one */ + + if ((rvalue == NULL) && + (cif->flags == FFI_TYPE_STRUCT)) + { + ecif.rvalue = alloca(cif->rtype->size); + } + else + ecif.rvalue = rvalue; + + + switch (cif->abi) + { + case FFI_SYSV: + ffi_call_SYSV(ffi_prep_args, &ecif, cif->bytes, cif->flags, ecif.rvalue, + fn); + break; +#ifdef X86_WIN32 + case FFI_STDCALL: + ffi_call_STDCALL(ffi_prep_args, &ecif, cif->bytes, cif->flags, + ecif.rvalue, fn); + break; +#endif /* X86_WIN32 */ + default: + FFI_ASSERT(0); + break; + } +} + + +/** private members **/ + +static void ffi_prep_incoming_args_SYSV (char *stack, void **ret, + void** args, ffi_cif* cif); +void FFI_HIDDEN ffi_closure_SYSV (ffi_closure *) +__attribute__ ((regparm(1))); +unsigned int FFI_HIDDEN ffi_closure_SYSV_inner (ffi_closure *, void **, void *) +__attribute__ ((regparm(1))); +void FFI_HIDDEN ffi_closure_raw_SYSV (ffi_raw_closure *) +__attribute__ ((regparm(1))); + +/* This function is jumped to by the trampoline */ + +unsigned int FFI_HIDDEN +ffi_closure_SYSV_inner (closure, respp, args) +ffi_closure *closure; +void **respp; +void *args; +{ + // our various things... + ffi_cif *cif; + void **arg_area; + + cif = closure->cif; + arg_area = (void**) alloca (cif->nargs * sizeof (void*)); + + /* this call will initialize ARG_AREA, such that each + * element in that array points to the corresponding + * value on the stack; and if the function returns + * a structure, it will re-set RESP to point to the + * structure return address. */ + + ffi_prep_incoming_args_SYSV(args, respp, arg_area, cif); + + (closure->fun) (cif, *respp, arg_area, closure->user_data); + + return cif->flags; +} + +static void +ffi_prep_incoming_args_SYSV(char *stack, void **rvalue, void **avalue, + ffi_cif *cif) +{ + register unsigned int i; + register void **p_argv; + register char *argp; + register ffi_type **p_arg; + + argp = stack; + + if ( cif->flags == FFI_TYPE_STRUCT ) { + *rvalue = *(void **) argp; + argp += 4; + } + + p_argv = avalue; + + for (i = cif->nargs, p_arg = cif->arg_types; (i != 0); i--, p_arg++) + { + size_t z; + + /* Align if necessary */ + if ((sizeof(int) - 1) & (unsigned) argp) { + argp = (char *) ALIGN(argp, sizeof(int)); + } + + z = (*p_arg)->size; + + /* because we're little endian, this is what it turns into. */ + + *p_argv = (void*) argp; + + p_argv++; + argp += z; + } + + return; +} + +/* How to make a trampoline. Derived from gcc/config/i386/i386.c. */ + +#define FFI_INIT_TRAMPOLINE(TRAMP,FUN,CTX) \ +({ unsigned char *__tramp = (unsigned char*)(TRAMP); \ +unsigned int __fun = (unsigned int)(FUN); \ +unsigned int __ctx = (unsigned int)(CTX); \ +unsigned int __dis = __fun - (__ctx + FFI_TRAMPOLINE_SIZE); \ +*(unsigned char*) &__tramp[0] = 0xb8; \ +*(unsigned int*) &__tramp[1] = __ctx; /* movl __ctx, %eax */ \ +*(unsigned char *) &__tramp[5] = 0xe9; \ +*(unsigned int*) &__tramp[6] = __dis; /* jmp __fun */ \ +}) + + +/* the cif must already be prep'ed */ +ffi_status +ffi_prep_closure (ffi_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif*,void*,void**,void*), + void *user_data) +{ + if (cif->abi != FFI_SYSV) + return FFI_BAD_ABI; + + FFI_INIT_TRAMPOLINE (&closure->tramp[0], \ + &ffi_closure_SYSV, \ + (void*)closure); + + closure->cif = cif; + closure->user_data = user_data; + closure->fun = fun; + + return FFI_OK; +} + +/* ------- Native raw API support -------------------------------- */ + +#if !FFI_NO_RAW_API + +ffi_status +ffi_prep_raw_closure_loc (ffi_raw_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif*,void*,ffi_raw*,void*), + void *user_data, + void *codeloc) +{ + int i; + + FFI_ASSERT (cif->abi == FFI_SYSV); + + // we currently don't support certain kinds of arguments for raw + // closures. This should be implemented by a separate assembly language + // routine, since it would require argument processing, something we + // don't do now for performance. + + for (i = cif->nargs-1; i >= 0; i--) + { + FFI_ASSERT (cif->arg_types[i]->type != FFI_TYPE_STRUCT); + FFI_ASSERT (cif->arg_types[i]->type != FFI_TYPE_LONGDOUBLE); + } + + + FFI_INIT_TRAMPOLINE (&closure->tramp[0], &ffi_closure_raw_SYSV, + codeloc); + + closure->cif = cif; + closure->user_data = user_data; + closure->fun = fun; + + return FFI_OK; +} + +static void +ffi_prep_args_raw(char *stack, extended_cif *ecif) +{ + memcpy (stack, ecif->avalue, ecif->cif->bytes); +} + +/* we borrow this routine from libffi (it must be changed, though, to + * actually call the function passed in the first argument. as of + * libffi-1.20, this is not the case.) + */ + +extern void +ffi_call_SYSV(void (*)(char *, extended_cif *), extended_cif *, unsigned, + unsigned, unsigned *, void (*fn)()); + +#ifdef X86_WIN32 +extern void +ffi_call_STDCALL(void (*)(char *, extended_cif *), extended_cif *, unsigned, + unsigned, unsigned *, void (*fn)()); +#endif /* X86_WIN32 */ + +void +ffi_raw_call(ffi_cif *cif, void (*fn)(), void *rvalue, ffi_raw *fake_avalue) +{ + extended_cif ecif; + void **avalue = (void **)fake_avalue; + + ecif.cif = cif; + ecif.avalue = avalue; + + /* If the return value is a struct and we don't have a return */ + /* value address then we need to make one */ + + if ((rvalue == NULL) && + (cif->rtype->type == FFI_TYPE_STRUCT)) + { + ecif.rvalue = alloca(cif->rtype->size); + } + else + ecif.rvalue = rvalue; + + + switch (cif->abi) + { + case FFI_SYSV: + ffi_call_SYSV(ffi_prep_args_raw, &ecif, cif->bytes, cif->flags, + ecif.rvalue, fn); + break; +#ifdef X86_WIN32 + case FFI_STDCALL: + ffi_call_STDCALL(ffi_prep_args_raw, &ecif, cif->bytes, cif->flags, + ecif.rvalue, fn); + break; +#endif /* X86_WIN32 */ + default: + FFI_ASSERT(0); + break; + } +} + +#endif +#endif // __i386__ diff -r -u ./setup.py ./setup.py index 46b92fe..2bf6b4b 100644 --- ./setup.py +++ ./setup.py @@ -98,8 +98,14 @@ class PyBuildExt(build_ext): self.detect_modules() # Remove modules that are present on the disabled list - self.extensions = [ext for ext in self.extensions - if ext.name not in disabled_module_list] + extensions = [ext for ext in self.extensions + if ext.name not in disabled_module_list] + # move ctypes to the end, it depends on other modules + ext_map = dict((ext.name, i) for i, ext in enumerate(extensions)) + if "_ctypes" in ext_map: + ctypes = extensions.pop(ext_map["_ctypes"]) + extensions.append(ctypes) + self.extensions = extensions # Fix up the autodetected modules, prefixing all the source files # with Modules/ and adding Python's include directory to the path. @@ -1330,9 +1336,39 @@ class PyBuildExt(build_ext): # *** Uncomment these for TOGL extension only: # -lGL -lGLU -lXext -lXmu \ + def configure_ctypes_darwin(self, ext): + # Darwin (OS X) uses preconfigured files, in + # the Modules/_ctypes/libffi_osx directory. + srcdir = sysconfig.get_config_var('srcdir') + ffi_srcdir = os.path.abspath(os.path.join(srcdir, 'Modules', + '_ctypes', 'libffi_osx')) + sources = [os.path.join(ffi_srcdir, p) + for p in ['ffi.c', + 'x86/darwin64.S', + 'x86/x86-darwin.S', + 'x86/x86-ffi_darwin.c', + 'x86/x86-ffi64.c', + 'powerpc/ppc-darwin.S', + 'powerpc/ppc-darwin_closure.S', + 'powerpc/ppc-ffi_darwin.c', + 'powerpc/ppc64-darwin_closure.S', + ]] + + # Add .S (preprocessed assembly) to C compiler source extensions. + self.compiler.src_extensions.append('.S') + + include_dirs = [os.path.join(ffi_srcdir, 'include'), + os.path.join(ffi_srcdir, 'powerpc')] + ext.include_dirs.extend(include_dirs) + ext.sources.extend(sources) + return True + def configure_ctypes(self, ext): if not self.use_system_libffi: - (srcdir,) = sysconfig.get_config_vars('srcdir') + if sys.platform == 'darwin': + return self.configure_ctypes_darwin(ext) + + srcdir = sysconfig.get_config_var('srcdir') ffi_builddir = os.path.join(self.build_temp, 'libffi') ffi_srcdir = os.path.abspath(os.path.join(srcdir, 'Modules', '_ctypes', 'libffi')) @@ -1347,7 +1383,10 @@ class PyBuildExt(build_ext): ffi_configfile): from distutils.dir_util import mkpath mkpath(ffi_builddir) - config_args = [] + config_args = [arg for arg in sysconfig.get_config_var("CONFIG_ARGS").split() + if (('--host=' in arg) or ('--build=' in arg))] + if not self.verbose: + config_args.append("-q") # Pass empty CFLAGS because we'll just append the resulting # CFLAGS to Python's; -g or -O2 is to be avoided. @@ -1367,10 +1406,12 @@ class PyBuildExt(build_ext): self.compiler.src_extensions.append('.S') include_dirs = [os.path.join(ffi_builddir, 'include'), - ffi_builddir, ffi_srcdir] + ffi_builddir, + os.path.join(ffi_srcdir, 'src')] extra_compile_args = fficonfig['ffi_cflags'].split() - ext.sources.extend(fficonfig['ffi_sources']) + ext.sources.extend(os.path.join(ffi_srcdir, f) for f in + fficonfig['ffi_sources']) ext.include_dirs.extend(include_dirs) ext.extra_compile_args.extend(extra_compile_args) return True @@ -1390,6 +1431,7 @@ class PyBuildExt(build_ext): if sys.platform == 'darwin': sources.append('_ctypes/darwin/dlfcn_simple.c') + extra_compile_args.append('-DMACOSX') include_dirs.append('_ctypes/darwin') # XXX Is this still needed? ## extra_link_args.extend(['-read_only_relocs', 'warning']) @@ -1419,7 +1461,14 @@ class PyBuildExt(build_ext): if not '--with-system-ffi' in sysconfig.get_config_var("CONFIG_ARGS"): return - ffi_inc = find_file('ffi.h', [], inc_dirs) + if sys.platform == 'darwin': + # OS X 10.5 comes with libffi.dylib; the include files are + # in /usr/include/ffi + inc_dirs.append('/usr/include/ffi') + + ffi_inc = [sysconfig.get_config_var("LIBFFI_INCLUDEDIR")] + if not ffi_inc or ffi_inc[0] == '': + ffi_inc = find_file('ffi.h', [], inc_dirs) if ffi_inc is not None: ffi_h = ffi_inc[0] + '/ffi.h' fp = open(ffi_h) 005_osx_failed_modules.patch000066400000000000000000000076331517431316200353400ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.5.3/Python-2.5.3diff -r -u ./Mac/Modules/cg/_CGmodule.c ./Mac/Modules/cg/_CGmodule.c index 8115614..e36fce9 100755 --- ./Mac/Modules/cg/_CGmodule.c +++ ./Mac/Modules/cg/_CGmodule.c @@ -1025,6 +1025,7 @@ static PyObject *CGContextRefObj_CGContextSetShouldAntialias(CGContextRefObject return _res; } +#ifndef __LP64__ static PyObject *CGContextRefObj_SyncCGContextOriginWithPort(CGContextRefObject *_self, PyObject *_args) { PyObject *_res = NULL; @@ -1055,6 +1056,7 @@ static PyObject *CGContextRefObj_ClipCGContextToRegion(CGContextRefObject *_self _res = Py_None; return _res; } +#endif static PyMethodDef CGContextRefObj_methods[] = { {"CGContextSaveGState", (PyCFunction)CGContextRefObj_CGContextSaveGState, 1, @@ -1173,10 +1175,12 @@ static PyMethodDef CGContextRefObj_methods[] = { PyDoc_STR("() -> None")}, {"CGContextSetShouldAntialias", (PyCFunction)CGContextRefObj_CGContextSetShouldAntialias, 1, PyDoc_STR("(int shouldAntialias) -> None")}, +#ifndef __LP64__ {"SyncCGContextOriginWithPort", (PyCFunction)CGContextRefObj_SyncCGContextOriginWithPort, 1, PyDoc_STR("(CGrafPtr port) -> None")}, {"ClipCGContextToRegion", (PyCFunction)CGContextRefObj_ClipCGContextToRegion, 1, PyDoc_STR("(Rect portRect, RgnHandle region) -> None")}, +#endif {NULL, NULL, 0} }; @@ -1254,6 +1258,7 @@ PyTypeObject CGContextRef_Type = { /* ------------------ End object type CGContextRef ------------------ */ +#ifndef __LP64__ static PyObject *CG_CreateCGContextForPort(PyObject *_self, PyObject *_args) { PyObject *_res = NULL; @@ -1271,10 +1276,13 @@ static PyObject *CG_CreateCGContextForPort(PyObject *_self, PyObject *_args) return _res; } +#endif static PyMethodDef CG_methods[] = { +#ifndef __LP64__ {"CreateCGContextForPort", (PyCFunction)CG_CreateCGContextForPort, 1, PyDoc_STR("(CGrafPtr) -> CGContextRef")}, +#endif {NULL, NULL, 0} }; diff -r -u ./Modules/_curses_panel.c ./Modules/_curses_panel.c index 0acf3fd..1728b59 100644 --- ./Modules/_curses_panel.c +++ ./Modules/_curses_panel.c @@ -56,7 +56,7 @@ typedef struct { PyTypeObject PyCursesPanel_Type; -#define PyCursesPanel_Check(v) ((v)->ob_type == &PyCursesPanel_Type) +#define PyCursesPanel_Check(v) (Py_TYPE(v) == &PyCursesPanel_Type) /* Some helper functions. The problem is that there's always a window associated with a panel. To ensure that Python's GC doesn't pull @@ -178,12 +178,13 @@ PyCursesPanel_New(PANEL *pan, PyCursesWindowObject *wo) po = PyObject_NEW(PyCursesPanelObject, &PyCursesPanel_Type); if (po == NULL) return NULL; po->pan = pan; - po->wo = wo; - Py_INCREF(wo); if (insert_lop(po) < 0) { - PyObject_DEL(po); - return NULL; + po->wo = NULL; + Py_DECREF(po); + return NULL; } + po->wo = wo; + Py_INCREF(wo); return (PyObject *)po; } @@ -191,8 +192,10 @@ static void PyCursesPanel_Dealloc(PyCursesPanelObject *po) { (void)del_panel(po->pan); - Py_DECREF(po->wo); - remove_lop(po); + if (po->wo != NULL) { + Py_DECREF(po->wo); + remove_lop(po); + } PyObject_DEL(po); } @@ -338,11 +341,10 @@ PyCursesPanel_GetAttr(PyCursesPanelObject *self, char *name) /* -------------------------------------------------------*/ PyTypeObject PyCursesPanel_Type = { - PyObject_HEAD_INIT(NULL) - 0, /*ob_size*/ - "_curses_panel.curses panel", /*tp_name*/ - sizeof(PyCursesPanelObject), /*tp_basicsize*/ - 0, /*tp_itemsize*/ + PyVarObject_HEAD_INIT(NULL, 0) + "_curses_panel.curses panel", /*tp_name*/ + sizeof(PyCursesPanelObject), /*tp_basicsize*/ + 0, /*tp_itemsize*/ /* methods */ (destructor)PyCursesPanel_Dealloc, /*tp_dealloc*/ 0, /*tp_print*/ @@ -458,7 +460,7 @@ init_curses_panel(void) PyObject *m, *d, *v; /* Initialize object type */ - PyCursesPanel_Type.ob_type = &PyType_Type; + Py_TYPE(&PyCursesPanel_Type) = &PyType_Type; import_curses(); pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.5.4/000077500000000000000000000000001517431316200262115ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.5.4/Python-2.5.4/000077500000000000000000000000001517431316200301365ustar00rootroot00000000000000000_patch-setup.py.diff000066400000000000000000000035211517431316200341550ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.5.4/Python-2.5.4--- setup.py.orig 2011-07-07 19:19:43.800122463 +0900 +++ setup.py 2011-07-07 19:25:04.548416377 +0900 @@ -13,6 +13,7 @@ from distutils.command.build_ext import build_ext from distutils.command.install import install from distutils.command.install_lib import install_lib +from distutils.spawn import find_executable # This global variable is used to hold the list of modules to be disabled. disabled_module_list = [] @@ -242,10 +243,34 @@ return platform return sys.platform + def add_multiarch_paths(self): + # Debian/Ubuntu multiarch support. + # https://wiki.ubuntu.com/MultiarchSpec + if not find_executable('dpkg-architecture'): + return + tmpfile = os.path.join(self.build_temp, 'multiarch') + if not os.path.exists(self.build_temp): + os.makedirs(self.build_temp) + ret = os.system( + 'dpkg-architecture -qDEB_HOST_MULTIARCH > %s 2> /dev/null' % + tmpfile) + try: + if ret >> 8 == 0: + fp = open(tmpfile) + multiarch_path_component = fp.readline().strip() + fp.close() + add_dir_to_list(self.compiler.library_dirs, + '/usr/lib/' + multiarch_path_component) + add_dir_to_list(self.compiler.include_dirs, + '/usr/include/' + multiarch_path_component) + finally: + os.unlink(tmpfile) + def detect_modules(self): # Ensure that /usr/local is always used add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib') add_dir_to_list(self.compiler.include_dirs, '/usr/local/include') + self.add_multiarch_paths() # Add paths specified in the environment variables LDFLAGS and # CPPFLAGS for header and library files. 001_patch-svnversion.patch000066400000000000000000000023661517431316200350000ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.5.4/Python-2.5.4--- configure.in +++ configure.in @@ -767,7 +767,7 @@ then SVNVERSION="svnversion \$(srcdir)" else - SVNVERSION="echo exported" + SVNVERSION="echo Unversioned directory" fi case $MACHDEP in --- Makefile.pre.in +++ Makefile.pre.in @@ -501,7 +501,7 @@ $(SIGNAL_OBJS) \ $(MODOBJS) \ $(srcdir)/Modules/getbuildinfo.c - $(CC) -c $(PY_CFLAGS) -DSVNVERSION=\"`LC_ALL=C $(SVNVERSION)`\" -o $@ $(srcdir)/Modules/getbuildinfo.c + $(CC) -c $(PY_CFLAGS) -DSVNVERSION="\"`LC_ALL=C $(SVNVERSION)`\"" -o $@ $(srcdir)/Modules/getbuildinfo.c Modules/getpath.o: $(srcdir)/Modules/getpath.c Makefile $(CC) -c $(PY_CFLAGS) -DPYTHONPATH='"$(PYTHONPATH)"' \ --- Modules/getbuildinfo.c +++ Modules/getbuildinfo.c @@ -48,5 +48,5 @@ static const char svnversion[] = SVNVERSION; if (svnversion[0] != '$') return svnversion; /* it was interpolated, or passed on command line */ - return "exported"; + return "Unversioned directory"; } --- Python/sysmodule.c +++ Python/sysmodule.c @@ -1161,7 +1161,7 @@ svnversion = _Py_svnversion(); - if (strcmp(svnversion, "exported") != 0) + if (strcmp(svnversion, "Unversioned directory") != 0 && strcmp(svnversion, "exported") != 0) svn_revision = svnversion; else if (istag) { len = strlen(_patchlevel_revision); 002_darwin_c_source.patch000066400000000000000000000132671517431316200346400ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.5.4/Python-2.5.4diff -r -u ./configure ../Python-2.5/configure --- ./configure 2006-09-05 11:54:42.000000000 +0900 +++ ../Python-2.5/configure 2013-07-19 15:27:46.000000000 +0900 @@ -1396,6 +1396,16 @@ _ACEOF +# The later defininition of _XOPEN_SOURCE and _POSIX_C_SOURCE disables +# certain features on Mac OS X, so we need _DARWIN_C_SOURCE to re-enable +# them. + +cat >>confdefs.h <<\_ACEOF +#define _DARWIN_C_SOURCE 1 +_ACEOF + + + define_xopen_source=yes # Arguments passed to configure. @@ -3885,11 +3895,110 @@ ;; # is there any other compiler on Darwin besides gcc? Darwin*) - BASECFLAGS="$BASECFLAGS -Wno-long-double -no-cpp-precomp -mno-fused-madd" + # -Wno-long-double, -no-cpp-precomp, and -mno-fused-madd + # used to be here, but non-Apple gcc doesn't accept them. + if test "${CC}" = gcc + then + { echo "$as_me:${as_lineno-$LINENO}: checking which compiler should be used" >&5 +echo -n "checking which compiler should be used... " >&6; } + case "${UNIVERSALSDK}" in + */MacOSX10.4u.sdk) + # Build using 10.4 SDK, force usage of gcc when the + # compiler is gcc, otherwise the user will get very + # confusing error messages when building on OSX 10.6 + CC=gcc-4.0 + CPP=cpp-4.0 + ;; + esac + { echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +echo "$CC" >&6; } + fi + + if test "${enable_universalsdk}"; then - BASECFLAGS="-arch ppc -arch i386 -isysroot ${UNIVERSALSDK} ${BASECFLAGS}" + UNIVERSAL_ARCH_FLAGS="" + if test "$UNIVERSAL_ARCHS" = "32-bit" ; then + UNIVERSAL_ARCH_FLAGS="-arch ppc -arch i386" + ARCH_RUN_32BIT="" + LIPO_32BIT_FLAGS="" + elif test "$UNIVERSAL_ARCHS" = "64-bit" ; then + UNIVERSAL_ARCH_FLAGS="-arch ppc64 -arch x86_64" + LIPO_32BIT_FLAGS="" + ARCH_RUN_32BIT="true" + + elif test "$UNIVERSAL_ARCHS" = "all" ; then + UNIVERSAL_ARCH_FLAGS="-arch i386 -arch ppc -arch ppc64 -arch x86_64" + LIPO_32BIT_FLAGS="-extract ppc7400 -extract i386" + ARCH_RUN_32BIT="/usr/bin/arch -i386 -ppc" + + elif test "$UNIVERSAL_ARCHS" = "intel" ; then + UNIVERSAL_ARCH_FLAGS="-arch i386 -arch x86_64" + LIPO_32BIT_FLAGS="-extract i386" + ARCH_RUN_32BIT="/usr/bin/arch -i386" + + elif test "$UNIVERSAL_ARCHS" = "3-way" ; then + UNIVERSAL_ARCH_FLAGS="-arch i386 -arch ppc -arch x86_64" + LIPO_32BIT_FLAGS="-extract ppc7400 -extract i386" + ARCH_RUN_32BIT="/usr/bin/arch -i386 -ppc" + + else + as_fn_error $? "proper usage is --with-universal-arch=32-bit|64-bit|all|intel|3-way" "$LINENO" 5 + + fi + + + CFLAGS="${UNIVERSAL_ARCH_FLAGS} -isysroot ${UNIVERSALSDK} ${CFLAGS}" + if test "${UNIVERSALSDK}" != "/" + then + CFLAGS="-isysroot ${UNIVERSALSDK} ${CFLAGS}" + LDFLAGS="-isysroot ${UNIVERSALSDK} ${LDFLAGS}" + CPPFLAGS="-isysroot ${UNIVERSALSDK} ${CPPFLAGS}" + fi fi + # Calculate the right deployment target for this build. + # + cur_target=`sw_vers -productVersion | sed 's/\(10\.[0-9]*\).*/\1/'` + if test ${cur_target} '>' 10.2 && \ + test ${cur_target} '<' 10.6 + then + cur_target=10.3 + if test ${enable_universalsdk}; then + if test "${UNIVERSAL_ARCHS}" = "all"; then + # Ensure that the default platform for a + # 4-way universal build is OSX 10.5, + # that's the first OS release where + # 4-way builds make sense. + cur_target='10.5' + + elif test "${UNIVERSAL_ARCHS}" = "3-way"; then + cur_target='10.5' + + elif test "${UNIVERSAL_ARCHS}" = "intel"; then + cur_target='10.5' + + elif test "${UNIVERSAL_ARCHS}" = "64-bit"; then + cur_target='10.5' + fi + else + if test `/usr/bin/arch` = "i386"; then + # On Intel macs default to a deployment + # target of 10.4, that's the first OSX + # release with Intel support. + cur_target="10.4" + fi + fi + fi + CONFIGURE_MACOSX_DEPLOYMENT_TARGET=${MACOSX_DEPLOYMENT_TARGET-${cur_target}} + + # Make sure that MACOSX_DEPLOYMENT_TARGET is set in the + # environment with a value that is the same as what we'll use + # in the Makefile to ensure that we'll get the same compiler + # environment during configure and build time. + MACOSX_DEPLOYMENT_TARGET="$CONFIGURE_MACOSX_DEPLOYMENT_TARGET" + export MACOSX_DEPLOYMENT_TARGET + EXPORT_MACOSX_DEPLOYMENT_TARGET='' + ;; OSF*) BASECFLAGS="$BASECFLAGS -mieee" @@ -10851,7 +10960,7 @@ if test "${enable_universalsdk}"; then : else - LIBTOOL_CRUFT="${LIBTOOL_CRUFT} -arch_only `arch`" + LIBTOOL_CRUFT="${LIBTOOL_CRUFT}" fi LIBTOOL_CRUFT=$LIBTOOL_CRUFT' -install_name $(PYTHONFRAMEWORKINSTALLDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK)' LIBTOOL_CRUFT=$LIBTOOL_CRUFT' -compatibility_version $(VERSION) -current_version $(VERSION)';; @@ -10863,7 +10972,7 @@ else LIBTOOL_CRUFT="" fi - LIBTOOL_CRUFT=$LIBTOOL_CRUFT" -lSystem -lSystemStubs -arch_only `arch`" + LIBTOOL_CRUFT=$LIBTOOL_CRUFT" -lSystem -lSystemStubs" LIBTOOL_CRUFT=$LIBTOOL_CRUFT' -install_name $(PYTHONFRAMEWORKINSTALLDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK)' LIBTOOL_CRUFT=$LIBTOOL_CRUFT' -compatibility_version $(VERSION) -current_version $(VERSION)';; esac diff -r -u ./pyconfig.h.in ../Python-2.5/pyconfig.h.in --- ./pyconfig.h.in 2006-07-30 23:09:47.000000000 +0900 +++ ../Python-2.5/pyconfig.h.in 2013-07-17 23:12:31.000000000 +0900 @@ -912,6 +912,11 @@ /* Define on Irix to enable u_int */ #undef _BSD_TYPES +/* Define on Darwin to activate all library features */ +#ifndef _DARWIN_C_SOURCE +#define _DARWIN_C_SOURCE +#endif + /* This must be set to 64 on some systems to enable large file support. */ #undef _FILE_OFFSET_BITS 003_osx_lp64.patch000066400000000000000000000215441517431316200331460ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.5.4/Python-2.5.4diff -r -u ./Include/pymactoolbox.h ../Python-2.5/Include/pymactoolbox.h --- ./Include/pymactoolbox.h 2004-11-05 16:02:59.000000000 +0900 +++ ../Python-2.5/Include/pymactoolbox.h 2013-07-17 23:38:51.000000000 +0900 @@ -8,7 +8,10 @@ #endif #include + +#ifndef __LP64__ #include +#endif /* !__LP64__ */ /* ** Helper routines for error codes and such. @@ -18,8 +21,11 @@ PyObject *PyMac_GetOSErrException(void); /* Initialize & return it */ PyObject *PyErr_Mac(PyObject *, int); /* Exception with a mac error */ PyObject *PyMac_Error(OSErr); /* Uses PyMac_GetOSErrException */ +#ifndef __LP64__ extern OSErr PyMac_GetFullPathname(FSSpec *, char *, int); /* convert fsspec->path */ +#endif /* __LP64__ */ + /* ** These conversion routines are defined in mactoolboxglue.c itself. */ @@ -83,8 +89,10 @@ #endif /* USE_TOOLBOX_OBJECT_GLUE */ /* macfs exports */ +#ifndef __LP64__ int PyMac_GetFSSpec(PyObject *, FSSpec *); /* argument parser for FSSpec */ PyObject *PyMac_BuildFSSpec(FSSpec *); /* Convert FSSpec to PyObject */ +#endif /* !__LP64__ */ int PyMac_GetFSRef(PyObject *, FSRef *); /* argument parser for FSRef */ PyObject *PyMac_BuildFSRef(FSRef *); /* Convert FSRef to PyObject */ @@ -101,39 +109,54 @@ extern int CmpInstObj_Convert(PyObject *, ComponentInstance *); /* Ctl exports */ +#ifndef __LP64__ extern PyObject *CtlObj_New(ControlHandle); extern int CtlObj_Convert(PyObject *, ControlHandle *); +#endif /* !__LP64__ */ /* Dlg exports */ +#ifndef __LP64__ extern PyObject *DlgObj_New(DialogPtr); extern int DlgObj_Convert(PyObject *, DialogPtr *); extern PyObject *DlgObj_WhichDialog(DialogPtr); +#endif /* !__LP64__ */ /* Drag exports */ +#ifndef __LP64__ extern PyObject *DragObj_New(DragReference); extern int DragObj_Convert(PyObject *, DragReference *); +#endif /* !__LP64__ */ /* List exports */ +#ifndef __LP64__ extern PyObject *ListObj_New(ListHandle); extern int ListObj_Convert(PyObject *, ListHandle *); +#endif /* !__LP64__ */ /* Menu exports */ +#ifndef __LP64__ extern PyObject *MenuObj_New(MenuHandle); extern int MenuObj_Convert(PyObject *, MenuHandle *); +#endif /* !__LP64__ */ /* Qd exports */ +#ifndef __LP64__ extern PyObject *GrafObj_New(GrafPtr); extern int GrafObj_Convert(PyObject *, GrafPtr *); extern PyObject *BMObj_New(BitMapPtr); extern int BMObj_Convert(PyObject *, BitMapPtr *); extern PyObject *QdRGB_New(RGBColor *); extern int QdRGB_Convert(PyObject *, RGBColor *); +#endif /* !__LP64__ */ /* Qdoffs exports */ +#ifndef __LP64__ extern PyObject *GWorldObj_New(GWorldPtr); extern int GWorldObj_Convert(PyObject *, GWorldPtr *); +#endif /* !__LP64__ */ /* Qt exports */ +#ifndef __LP64__ extern PyObject *TrackObj_New(Track); extern int TrackObj_Convert(PyObject *, Track *); extern PyObject *MovieObj_New(Movie); @@ -146,6 +169,7 @@ extern int UserDataObj_Convert(PyObject *, UserData *); extern PyObject *MediaObj_New(Media); extern int MediaObj_Convert(PyObject *, Media *); +#endif /* !__LP64__ */ /* Res exports */ extern PyObject *ResObj_New(Handle); @@ -154,13 +178,17 @@ extern int OptResObj_Convert(PyObject *, Handle *); /* TE exports */ +#ifndef __LP64__ extern PyObject *TEObj_New(TEHandle); extern int TEObj_Convert(PyObject *, TEHandle *); +#endif /* !__LP64__ */ /* Win exports */ +#ifndef __LP64__ extern PyObject *WinObj_New(WindowPtr); extern int WinObj_Convert(PyObject *, WindowPtr *); extern PyObject *WinObj_WhichWindow(WindowPtr); +#endif /* !__LP64__ */ /* CF exports */ extern PyObject *CFObj_New(CFTypeRef); diff -r -u ./Mac/Modules/res/_Resmodule.c ../Python-2.5/Mac/Modules/res/_Resmodule.c --- ./Mac/Modules/res/_Resmodule.c 2005-07-04 05:59:44.000000000 +0900 +++ ../Python-2.5/Mac/Modules/res/_Resmodule.c 2013-07-17 23:38:51.000000000 +0900 @@ -414,6 +414,7 @@ return _res; } +#ifndef __LP64__ static PyObject *ResObj_as_Control(ResourceObject *_self, PyObject *_args) { PyObject *_res = NULL; @@ -431,6 +432,7 @@ return _res; } +#endif /* !__LP64__ */ static PyObject *ResObj_LoadResource(ResourceObject *_self, PyObject *_args) { @@ -1152,6 +1154,7 @@ return _res; } +#ifndef __LP64__ static PyObject *Res_OpenRFPerm(PyObject *_self, PyObject *_args) { PyObject *_res = NULL; @@ -1287,6 +1290,7 @@ _res = Py_None; return _res; } +#endif /* !__LP64__ */ static PyObject *Res_InsertResourceFile(PyObject *_self, PyObject *_args) { @@ -1327,6 +1331,7 @@ return _res; } +#ifndef __LP64__ static PyObject *Res_FSpResourceFileAlreadyOpen(PyObject *_self, PyObject *_args) { PyObject *_res = NULL; @@ -1413,6 +1418,7 @@ nextRefNum); return _res; } +#endif /* !__LP64__ */ static PyObject *Res_FSOpenResFile(PyObject *_self, PyObject *_args) { @@ -1438,6 +1444,7 @@ return _res; } +#ifndef __LP64__ static PyObject *Res_FSCreateResFile(PyObject *_self, PyObject *_args) { PyObject *_res = NULL; @@ -1534,6 +1541,7 @@ PyMac_BuildFSSpec, &newSpec); return _res; } +#endif /* __LP64__ */ static PyObject *Res_FSOpenResourceFile(PyObject *_self, PyObject *_args) { @@ -1637,6 +1645,7 @@ PyDoc_STR("(short refNum) -> (short _rv)")}, {"SetResFileAttrs", (PyCFunction)Res_SetResFileAttrs, 1, PyDoc_STR("(short refNum, short attrs) -> None")}, +#ifndef __LP64__ {"OpenRFPerm", (PyCFunction)Res_OpenRFPerm, 1, PyDoc_STR("(Str255 fileName, short vRefNum, SignedByte permission) -> (short _rv)")}, {"HOpenResFile", (PyCFunction)Res_HOpenResFile, 1, @@ -1647,10 +1656,12 @@ PyDoc_STR("(FSSpec spec, SignedByte permission) -> (short _rv)")}, {"FSpCreateResFile", (PyCFunction)Res_FSpCreateResFile, 1, PyDoc_STR("(FSSpec spec, OSType creator, OSType fileType, ScriptCode scriptTag) -> None")}, +#endif /* !__LP64__ */ {"InsertResourceFile", (PyCFunction)Res_InsertResourceFile, 1, PyDoc_STR("(SInt16 refNum, RsrcChainLocation where) -> None")}, {"DetachResourceFile", (PyCFunction)Res_DetachResourceFile, 1, PyDoc_STR("(SInt16 refNum) -> None")}, +#ifndef __LP64__ {"FSpResourceFileAlreadyOpen", (PyCFunction)Res_FSpResourceFileAlreadyOpen, 1, PyDoc_STR("(FSSpec resourceFile) -> (Boolean _rv, Boolean inChain, SInt16 refNum)")}, {"FSpOpenOrphanResFile", (PyCFunction)Res_FSpOpenOrphanResFile, 1, @@ -1659,14 +1670,17 @@ PyDoc_STR("() -> (SInt16 refNum)")}, {"GetNextResourceFile", (PyCFunction)Res_GetNextResourceFile, 1, PyDoc_STR("(SInt16 curRefNum) -> (SInt16 nextRefNum)")}, +#endif /* __LP64__ */ {"FSOpenResFile", (PyCFunction)Res_FSOpenResFile, 1, PyDoc_STR("(FSRef ref, SignedByte permission) -> (short _rv)")}, +#ifndef __LP64__ {"FSCreateResFile", (PyCFunction)Res_FSCreateResFile, 1, PyDoc_STR("(FSRef parentRef, Buffer nameLength) -> (FSRef newRef, FSSpec newSpec)")}, {"FSResourceFileAlreadyOpen", (PyCFunction)Res_FSResourceFileAlreadyOpen, 1, PyDoc_STR("(FSRef resourceFileRef) -> (Boolean _rv, Boolean inChain, SInt16 refNum)")}, {"FSCreateResourceFile", (PyCFunction)Res_FSCreateResourceFile, 1, PyDoc_STR("(FSRef parentRef, Buffer nameLength, Buffer forkNameLength) -> (FSRef newRef, FSSpec newSpec)")}, +#endif /* __LP64__ */ {"FSOpenResourceFile", (PyCFunction)Res_FSOpenResourceFile, 1, PyDoc_STR("(FSRef ref, Buffer forkNameLength, SignedByte permissions) -> (SInt16 refNum)")}, {"Handle", (PyCFunction)Res_Handle, 1, diff -r -u ./Modules/_ctypes/libffi/src/darwin/ffitarget.h ../Python-2.5/Modules/_ctypes/libffi/src/darwin/ffitarget.h --- ./Modules/_ctypes/libffi/src/darwin/ffitarget.h 2006-05-26 06:58:05.000000000 +0900 +++ ../Python-2.5/Modules/_ctypes/libffi/src/darwin/ffitarget.h 2013-07-17 23:38:51.000000000 +0900 @@ -4,7 +4,7 @@ * created by configure). This makes is possible to build a univeral binary * of ctypes in one go. */ -#if defined(__i386__) +#if defined(__i386__) || defined(__x86_64__) #ifndef X86_DARWIN #define X86_DARWIN diff -r -u ./Python/mactoolboxglue.c ../Python-2.5/Python/mactoolboxglue.c --- ./Python/mactoolboxglue.c 2006-07-12 01:44:25.000000000 +0900 +++ ../Python-2.5/Python/mactoolboxglue.c 2013-07-17 23:39:09.000000000 +0900 @@ -106,6 +106,7 @@ } +#ifndef __LP64__ OSErr PyMac_GetFullPathname(FSSpec *fss, char *path, int len) { @@ -153,6 +154,7 @@ Py_XDECREF(fs); return err; } +#endif /* !__LP64__ */ /* Convert a 4-char string object argument to an OSType value */ int @@ -417,6 +419,7 @@ GLUE_NEW(GWorldPtr, GWorldObj_New, "Carbon.Qdoffs") GLUE_CONVERT(GWorldPtr, GWorldObj_Convert, "Carbon.Qdoffs") +#ifndef __LP64__ GLUE_NEW(Track, TrackObj_New, "Carbon.Qt") GLUE_CONVERT(Track, TrackObj_Convert, "Carbon.Qt") GLUE_NEW(Movie, MovieObj_New, "Carbon.Qt") @@ -429,6 +432,7 @@ GLUE_CONVERT(UserData, UserDataObj_Convert, "Carbon.Qt") GLUE_NEW(Media, MediaObj_New, "Carbon.Qt") GLUE_CONVERT(Media, MediaObj_Convert, "Carbon.Qt") +#endif /* !__LP64__ */ GLUE_NEW(Handle, ResObj_New, "Carbon.Res") GLUE_CONVERT(Handle, ResObj_Convert, "Carbon.Res") 004_osx_libffi.patch000066400000000000000000005661361517431316200336300ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.5.4/Python-2.5.4diff -r -u ./Modules/_ctypes/libffi_osx/LICENSE ./Modules/_ctypes/libffi_osx/LICENSE new file mode 100644 index 0000000..f591795 --- /dev/null +++ ./Modules/_ctypes/libffi_osx/LICENSE @@ -0,0 +1,20 @@ +libffi - Copyright (c) 1996-2003 Red Hat, Inc. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +``Software''), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff -r -u ./Modules/_ctypes/libffi_osx/README ./Modules/_ctypes/libffi_osx/README new file mode 100644 index 0000000..1fc2747 --- /dev/null +++ ./Modules/_ctypes/libffi_osx/README @@ -0,0 +1,500 @@ +This directory contains the libffi package, which is not part of GCC but +shipped with GCC as convenience. + +Status +====== + +libffi-2.00 has not been released yet! This is a development snapshot! + +libffi-1.20 was released on October 5, 1998. Check the libffi web +page for updates: . + + +What is libffi? +=============== + +Compilers for high level languages generate code that follow certain +conventions. These conventions are necessary, in part, for separate +compilation to work. One such convention is the "calling +convention". The "calling convention" is essentially a set of +assumptions made by the compiler about where function arguments will +be found on entry to a function. A "calling convention" also specifies +where the return value for a function is found. + +Some programs may not know at the time of compilation what arguments +are to be passed to a function. For instance, an interpreter may be +told at run-time about the number and types of arguments used to call +a given function. Libffi can be used in such programs to provide a +bridge from the interpreter program to compiled code. + +The libffi library provides a portable, high level programming +interface to various calling conventions. This allows a programmer to +call any function specified by a call interface description at run +time. + +Ffi stands for Foreign Function Interface. A foreign function +interface is the popular name for the interface that allows code +written in one language to call code written in another language. The +libffi library really only provides the lowest, machine dependent +layer of a fully featured foreign function interface. A layer must +exist above libffi that handles type conversions for values passed +between the two languages. + + +Supported Platforms and Prerequisites +===================================== + +Libffi has been ported to: + + SunOS 4.1.3 & Solaris 2.x (SPARC-V8, SPARC-V9) + + Irix 5.3 & 6.2 (System V/o32 & n32) + + Intel x86 - Linux (System V ABI) + + Alpha - Linux and OSF/1 + + m68k - Linux (System V ABI) + + PowerPC - Linux (System V ABI, Darwin, AIX) + + ARM - Linux (System V ABI) + +Libffi has been tested with the egcs 1.0.2 gcc compiler. Chances are +that other versions will work. Libffi has also been built and tested +with the SGI compiler tools. + +On PowerPC, the tests failed (see the note below). + +You must use GNU make to build libffi. SGI's make will not work. +Sun's probably won't either. + +If you port libffi to another platform, please let me know! I assume +that some will be easy (x86 NetBSD), and others will be more difficult +(HP). + + +Installing libffi +================= + +[Note: before actually performing any of these installation steps, + you may wish to read the "Platform Specific Notes" below.] + +First you must configure the distribution for your particular +system. Go to the directory you wish to build libffi in and run the +"configure" program found in the root directory of the libffi source +distribution. + +You may want to tell configure where to install the libffi library and +header files. To do that, use the --prefix configure switch. Libffi +will install under /usr/local by default. + +If you want to enable extra run-time debugging checks use the the +--enable-debug configure switch. This is useful when your program dies +mysteriously while using libffi. + +Another useful configure switch is --enable-purify-safety. Using this +will add some extra code which will suppress certain warnings when you +are using Purify with libffi. Only use this switch when using +Purify, as it will slow down the library. + +Configure has many other options. Use "configure --help" to see them all. + +Once configure has finished, type "make". Note that you must be using +GNU make. SGI's make will not work. Sun's probably won't either. +You can ftp GNU make from prep.ai.mit.edu:/pub/gnu. + +To ensure that libffi is working as advertised, type "make test". + +To install the library and header files, type "make install". + + +Using libffi +============ + + The Basics + ---------- + +Libffi assumes that you have a pointer to the function you wish to +call and that you know the number and types of arguments to pass it, +as well as the return type of the function. + +The first thing you must do is create an ffi_cif object that matches +the signature of the function you wish to call. The cif in ffi_cif +stands for Call InterFace. To prepare a call interface object, use the +following function: + +ffi_status ffi_prep_cif(ffi_cif *cif, ffi_abi abi, + unsigned int nargs, + ffi_type *rtype, ffi_type **atypes); + + CIF is a pointer to the call interface object you wish + to initialize. + + ABI is an enum that specifies the calling convention + to use for the call. FFI_DEFAULT_ABI defaults + to the system's native calling convention. Other + ABI's may be used with care. They are system + specific. + + NARGS is the number of arguments this function accepts. + libffi does not yet support vararg functions. + + RTYPE is a pointer to an ffi_type structure that represents + the return type of the function. Ffi_type objects + describe the types of values. libffi provides + ffi_type objects for many of the native C types: + signed int, unsigned int, signed char, unsigned char, + etc. There is also a pointer ffi_type object and + a void ffi_type. Use &ffi_type_void for functions that + don't return values. + + ATYPES is a vector of ffi_type pointers. ARGS must be NARGS long. + If NARGS is 0, this is ignored. + + +ffi_prep_cif will return a status code that you are responsible +for checking. It will be one of the following: + + FFI_OK - All is good. + + FFI_BAD_TYPEDEF - One of the ffi_type objects that ffi_prep_cif + came across is bad. + + +Before making the call, the VALUES vector should be initialized +with pointers to the appropriate argument values. + +To call the function using the initialized ffi_cif, use the +ffi_call function: + +void ffi_call(ffi_cif *cif, void *fn, void *rvalue, void **avalues); + + CIF is a pointer to the ffi_cif initialized specifically + for this function. + + FN is a pointer to the function you want to call. + + RVALUE is a pointer to a chunk of memory that is to hold the + result of the function call. Currently, it must be + at least one word in size (except for the n32 version + under Irix 6.x, which must be a pointer to an 8 byte + aligned value (a long long). It must also be at least + word aligned (depending on the return type, and the + system's alignment requirements). If RTYPE is + &ffi_type_void, this is ignored. If RVALUE is NULL, + the return value is discarded. + + AVALUES is a vector of void* that point to the memory locations + holding the argument values for a call. + If NARGS is 0, this is ignored. + + +If you are expecting a return value from FN it will have been stored +at RVALUE. + + + + An Example + ---------- + +Here is a trivial example that calls puts() a few times. + + #include + #include + + int main() + { + ffi_cif cif; + ffi_type *args[1]; + void *values[1]; + char *s; + int rc; + + /* Initialize the argument info vectors */ + args[0] = &ffi_type_uint; + values[0] = &s; + + /* Initialize the cif */ + if (ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, + &ffi_type_uint, args) == FFI_OK) + { + s = "Hello World!"; + ffi_call(&cif, puts, &rc, values); + /* rc now holds the result of the call to puts */ + + /* values holds a pointer to the function's arg, so to + call puts() again all we need to do is change the + value of s */ + s = "This is cool!"; + ffi_call(&cif, puts, &rc, values); + } + + return 0; + } + + + + Aggregate Types + --------------- + +Although libffi has no special support for unions or bit-fields, it is +perfectly happy passing structures back and forth. You must first +describe the structure to libffi by creating a new ffi_type object +for it. Here is the definition of ffi_type: + + typedef struct _ffi_type + { + unsigned size; + short alignment; + short type; + struct _ffi_type **elements; + } ffi_type; + +All structures must have type set to FFI_TYPE_STRUCT. You may set +size and alignment to 0. These will be calculated and reset to the +appropriate values by ffi_prep_cif(). + +elements is a NULL terminated array of pointers to ffi_type objects +that describe the type of the structure elements. These may, in turn, +be structure elements. + +The following example initializes a ffi_type object representing the +tm struct from Linux's time.h: + + struct tm { + int tm_sec; + int tm_min; + int tm_hour; + int tm_mday; + int tm_mon; + int tm_year; + int tm_wday; + int tm_yday; + int tm_isdst; + /* Those are for future use. */ + long int __tm_gmtoff__; + __const char *__tm_zone__; + }; + + { + ffi_type tm_type; + ffi_type *tm_type_elements[12]; + int i; + + tm_type.size = tm_type.alignment = 0; + tm_type.elements = &tm_type_elements; + + for (i = 0; i < 9; i++) + tm_type_elements[i] = &ffi_type_sint; + + tm_type_elements[9] = &ffi_type_slong; + tm_type_elements[10] = &ffi_type_pointer; + tm_type_elements[11] = NULL; + + /* tm_type can now be used to represent tm argument types and + return types for ffi_prep_cif() */ + } + + + +Platform Specific Notes +======================= + + Intel x86 + --------- + +There are no known problems with the x86 port. + + Sun SPARC - SunOS 4.1.3 & Solaris 2.x + ------------------------------------- + +You must use GNU Make to build libffi on Sun platforms. + + MIPS - Irix 5.3 & 6.x + --------------------- + +Irix 6.2 and better supports three different calling conventions: o32, +n32 and n64. Currently, libffi only supports both o32 and n32 under +Irix 6.x, but only o32 under Irix 5.3. Libffi will automatically be +configured for whichever calling convention it was built for. + +By default, the configure script will try to build libffi with the GNU +development tools. To build libffi with the SGI development tools, set +the environment variable CC to either "cc -32" or "cc -n32" before +running configure under Irix 6.x (depending on whether you want an o32 +or n32 library), or just "cc" for Irix 5.3. + +With the n32 calling convention, when returning structures smaller +than 16 bytes, be sure to provide an RVALUE that is 8 byte aligned. +Here's one way of forcing this: + + double struct_storage[2]; + my_small_struct *s = (my_small_struct *) struct_storage; + /* Use s for RVALUE */ + +If you don't do this you are liable to get spurious bus errors. + +"long long" values are not supported yet. + +You must use GNU Make to build libffi on SGI platforms. + + ARM - System V ABI + ------------------ + +The ARM port was performed on a NetWinder running ARM Linux ELF +(2.0.31) and gcc 2.8.1. + + + + PowerPC System V ABI + -------------------- + +There are two `System V ABI's which libffi implements for PowerPC. +They differ only in how small structures are returned from functions. + +In the FFI_SYSV version, structures that are 8 bytes or smaller are +returned in registers. This is what GCC does when it is configured +for solaris, and is what the System V ABI I have (dated September +1995) says. + +In the FFI_GCC_SYSV version, all structures are returned the same way: +by passing a pointer as the first argument to the function. This is +what GCC does when it is configured for linux or a generic sysv +target. + +EGCS 1.0.1 (and probably other versions of EGCS/GCC) also has a +inconsistency with the SysV ABI: When a procedure is called with many +floating-point arguments, some of them get put on the stack. They are +all supposed to be stored in double-precision format, even if they are +only single-precision, but EGCS stores single-precision arguments as +single-precision anyway. This causes one test to fail (the `many +arguments' test). + + +What's With The Crazy Comments? +=============================== + +You might notice a number of cryptic comments in the code, delimited +by /*@ and @*/. These are annotations read by the program LCLint, a +tool for statically checking C programs. You can read all about it at +. + + +History +======= + +1.20 Oct-5-98 + Raffaele Sena produces ARM port. + +1.19 Oct-5-98 + Fixed x86 long double and long long return support. + m68k bug fixes from Andreas Schwab. + Patch for DU assembler compatibility for the Alpha from Richard + Henderson. + +1.18 Apr-17-98 + Bug fixes and MIPS configuration changes. + +1.17 Feb-24-98 + Bug fixes and m68k port from Andreas Schwab. PowerPC port from + Geoffrey Keating. Various bug x86, Sparc and MIPS bug fixes. + +1.16 Feb-11-98 + Richard Henderson produces Alpha port. + +1.15 Dec-4-97 + Fixed an n32 ABI bug. New libtool, auto* support. + +1.14 May-13-97 + libtool is now used to generate shared and static libraries. + Fixed a minor portability problem reported by Russ McManus + . + +1.13 Dec-2-96 + Added --enable-purify-safety to keep Purify from complaining + about certain low level code. + Sparc fix for calling functions with < 6 args. + Linux x86 a.out fix. + +1.12 Nov-22-96 + Added missing ffi_type_void, needed for supporting void return + types. Fixed test case for non MIPS machines. Cygnus Support + is now Cygnus Solutions. + +1.11 Oct-30-96 + Added notes about GNU make. + +1.10 Oct-29-96 + Added configuration fix for non GNU compilers. + +1.09 Oct-29-96 + Added --enable-debug configure switch. Clean-ups based on LCLint + feedback. ffi_mips.h is always installed. Many configuration + fixes. Fixed ffitest.c for sparc builds. + +1.08 Oct-15-96 + Fixed n32 problem. Many clean-ups. + +1.07 Oct-14-96 + Gordon Irlam rewrites v8.S again. Bug fixes. + +1.06 Oct-14-96 + Gordon Irlam improved the sparc port. + +1.05 Oct-14-96 + Interface changes based on feedback. + +1.04 Oct-11-96 + Sparc port complete (modulo struct passing bug). + +1.03 Oct-10-96 + Passing struct args, and returning struct values works for + all architectures/calling conventions. Expanded tests. + +1.02 Oct-9-96 + Added SGI n32 support. Fixed bugs in both o32 and Linux support. + Added "make test". + +1.01 Oct-8-96 + Fixed float passing bug in mips version. Restructured some + of the code. Builds cleanly with SGI tools. + +1.00 Oct-7-96 + First release. No public announcement. + + +Authors & Credits +================= + +libffi was written by Anthony Green . + +Portions of libffi were derived from Gianni Mariani's free gencall +library for Silicon Graphics machines. + +The closure mechanism was designed and implemented by Kresten Krab +Thorup. + +The Sparc port was derived from code contributed by the fine folks at +Visible Decisions Inc . Further enhancements were +made by Gordon Irlam at Cygnus Solutions . + +The Alpha port was written by Richard Henderson at Cygnus Solutions. + +Andreas Schwab ported libffi to m68k Linux and provided a number of +bug fixes. + +Geoffrey Keating ported libffi to the PowerPC. + +Raffaele Sena ported libffi to the ARM. + +Jesper Skov and Andrew Haley both did more than their fair share of +stepping through the code and tracking down bugs. + +Thanks also to Tom Tromey for bug fixes and configuration help. + +Thanks to Jim Blandy, who provided some useful feedback on the libffi +interface. + +If you have a problem, or have found a bug, please send a note to +green@cygnus.com. diff -r -u ./Modules/_ctypes/libffi_osx/README.pyobjc ./Modules/_ctypes/libffi_osx/README.pyobjc new file mode 100644 index 0000000..405d85f --- /dev/null +++ ./Modules/_ctypes/libffi_osx/README.pyobjc @@ -0,0 +1,5 @@ +This directory contains a slightly modified version of libffi, extracted from +the GCC source-tree. + +The only modifications are those that are necessary to compile libffi using +the Apple provided compiler and outside of the GCC source tree. diff -r -u ./Modules/_ctypes/libffi_osx/ffi.c ./Modules/_ctypes/libffi_osx/ffi.c new file mode 100644 index 0000000..bf42093 --- /dev/null +++ ./Modules/_ctypes/libffi_osx/ffi.c @@ -0,0 +1,226 @@ +/* ----------------------------------------------------------------------- + prep_cif.c - Copyright (c) 1996, 1998 Red Hat, Inc. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#include +#include + +#include +#include + +/* Round up to FFI_SIZEOF_ARG. */ +#define STACK_ARG_SIZE(x) ALIGN(x, FFI_SIZEOF_ARG) + +/* Perform machine independent initialization of aggregate type + specifications. */ + +static ffi_status +initialize_aggregate( +/*@out@*/ ffi_type* arg) +{ +/*@-usedef@*/ + + if (arg == NULL || arg->elements == NULL || + arg->size != 0 || arg->alignment != 0) + return FFI_BAD_TYPEDEF; + + ffi_type** ptr = &(arg->elements[0]); + + while ((*ptr) != NULL) + { + if (((*ptr)->size == 0) && (initialize_aggregate(*ptr) != FFI_OK)) + return FFI_BAD_TYPEDEF; + + /* Perform a sanity check on the argument type */ + FFI_ASSERT_VALID_TYPE(*ptr); + +#ifdef POWERPC_DARWIN + int curalign = (*ptr)->alignment; + + if (ptr != &(arg->elements[0])) + { + if (curalign > 4 && curalign != 16) + curalign = 4; + } + + arg->size = ALIGN(arg->size, curalign); + arg->size += (*ptr)->size; + arg->alignment = (arg->alignment > curalign) ? + arg->alignment : curalign; +#else + arg->size = ALIGN(arg->size, (*ptr)->alignment); + arg->size += (*ptr)->size; + arg->alignment = (arg->alignment > (*ptr)->alignment) ? + arg->alignment : (*ptr)->alignment; +#endif + + ptr++; + } + + /* Structure size includes tail padding. This is important for + structures that fit in one register on ABIs like the PowerPC64 + Linux ABI that right justify small structs in a register. + It's also needed for nested structure layout, for example + struct A { long a; char b; }; struct B { struct A x; char y; }; + should find y at an offset of 2*sizeof(long) and result in a + total size of 3*sizeof(long). */ + arg->size = ALIGN(arg->size, arg->alignment); + + if (arg->size == 0) + return FFI_BAD_TYPEDEF; + + return FFI_OK; + +/*@=usedef@*/ +} + +#ifndef __CRIS__ +/* The CRIS ABI specifies structure elements to have byte + alignment only, so it completely overrides this functions, + which assumes "natural" alignment and padding. */ + +/* Perform machine independent ffi_cif preparation, then call + machine dependent routine. */ + +#if defined(X86_DARWIN) + +static inline bool +struct_on_stack( + int size) +{ + if (size > 8) + return true; + + /* This is not what the ABI says, but is what is really implemented */ + switch (size) + { + case 1: + case 2: + case 4: + case 8: + return false; + + default: + return true; + } +} + +#endif // defined(X86_DARWIN) + +// Arguments' ffi_type->alignment must be nonzero. +ffi_status +ffi_prep_cif( +/*@out@*/ /*@partial@*/ ffi_cif* cif, + ffi_abi abi, + unsigned int nargs, +/*@dependent@*/ /*@out@*/ /*@partial@*/ ffi_type* rtype, +/*@dependent@*/ ffi_type** atypes) +{ + if (cif == NULL) + return FFI_BAD_TYPEDEF; + + if (abi <= FFI_FIRST_ABI || abi > FFI_DEFAULT_ABI) + return FFI_BAD_ABI; + + unsigned int bytes = 0; + unsigned int i; + ffi_type** ptr; + + cif->abi = abi; + cif->arg_types = atypes; + cif->nargs = nargs; + cif->rtype = rtype; + cif->flags = 0; + + /* Initialize the return type if necessary */ + /*@-usedef@*/ + if ((cif->rtype->size == 0) && (initialize_aggregate(cif->rtype) != FFI_OK)) + return FFI_BAD_TYPEDEF; + /*@=usedef@*/ + + /* Perform a sanity check on the return type */ + FFI_ASSERT_VALID_TYPE(cif->rtype); + + /* x86-64 and s390 stack space allocation is handled in prep_machdep. */ +#if !defined M68K && !defined __x86_64__ && !defined S390 && !defined PA + /* Make space for the return structure pointer */ + if (cif->rtype->type == FFI_TYPE_STRUCT +#ifdef SPARC + && (cif->abi != FFI_V9 || cif->rtype->size > 32) +#endif +#ifdef X86_DARWIN + && (struct_on_stack(cif->rtype->size)) +#endif + ) + bytes = STACK_ARG_SIZE(sizeof(void*)); +#endif + + for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++) + { + /* Initialize any uninitialized aggregate type definitions */ + if (((*ptr)->size == 0) && (initialize_aggregate((*ptr)) != FFI_OK)) + return FFI_BAD_TYPEDEF; + + if ((*ptr)->alignment == 0) + return FFI_BAD_TYPEDEF; + + /* Perform a sanity check on the argument type, do this + check after the initialization. */ + FFI_ASSERT_VALID_TYPE(*ptr); + +#if defined(X86_DARWIN) + { + int align = (*ptr)->alignment; + + if (align > 4) + align = 4; + + if ((align - 1) & bytes) + bytes = ALIGN(bytes, align); + + bytes += STACK_ARG_SIZE((*ptr)->size); + } +#elif !defined __x86_64__ && !defined S390 && !defined PA +#ifdef SPARC + if (((*ptr)->type == FFI_TYPE_STRUCT + && ((*ptr)->size > 16 || cif->abi != FFI_V9)) + || ((*ptr)->type == FFI_TYPE_LONGDOUBLE + && cif->abi != FFI_V9)) + bytes += sizeof(void*); + else +#endif + { + /* Add any padding if necessary */ + if (((*ptr)->alignment - 1) & bytes) + bytes = ALIGN(bytes, (*ptr)->alignment); + + bytes += STACK_ARG_SIZE((*ptr)->size); + } +#endif + } + + cif->bytes = bytes; + + /* Perform machine dependent cif processing */ + return ffi_prep_cif_machdep(cif); +} +#endif /* not __CRIS__ */ diff -r -u ./Modules/_ctypes/libffi_osx/include/ffi.h ./Modules/_ctypes/libffi_osx/include/ffi.h new file mode 100644 index 0000000..c104a5c --- /dev/null +++ ./Modules/_ctypes/libffi_osx/include/ffi.h @@ -0,0 +1,355 @@ +/* -----------------------------------------------------------------*-C-*- + libffi PyOBJC - Copyright (c) 1996-2003 Red Hat, Inc. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + ----------------------------------------------------------------------- */ + +/* ------------------------------------------------------------------- + The basic API is described in the README file. + + The raw API is designed to bypass some of the argument packing + and unpacking on architectures for which it can be avoided. + + The closure API allows interpreted functions to be packaged up + inside a C function pointer, so that they can be called as C functions, + with no understanding on the client side that they are interpreted. + It can also be used in other cases in which it is necessary to package + up a user specified parameter and a function pointer as a single + function pointer. + + The closure API must be implemented in order to get its functionality, + e.g. for use by gij. Routines are provided to emulate the raw API + if the underlying platform doesn't allow faster implementation. + + More details on the raw and closure API can be found in: + + http://gcc.gnu.org/ml/java/1999-q3/msg00138.html + + and + + http://gcc.gnu.org/ml/java/1999-q3/msg00174.html + -------------------------------------------------------------------- */ + +#ifndef LIBFFI_H +#define LIBFFI_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Specify which architecture libffi is configured for. */ +#ifdef MACOSX +# if defined(__i386__) || defined(__x86_64__) +# define X86_DARWIN +# elif defined(__ppc__) || defined(__ppc64__) +# define POWERPC_DARWIN +# else +# error "Unsupported MacOS X CPU type" +# endif +#else +#error "Unsupported OS type" +#endif + +/* ---- System configuration information --------------------------------- */ + +#include "ffitarget.h" +#include "fficonfig.h" + +#ifndef LIBFFI_ASM + +#include +#include + +/* LONG_LONG_MAX is not always defined (not if STRICT_ANSI, for example). + But we can find it either under the correct ANSI name, or under GNU + C's internal name. */ +#ifdef LONG_LONG_MAX +# define FFI_LONG_LONG_MAX LONG_LONG_MAX +#else +# ifdef LLONG_MAX +# define FFI_LONG_LONG_MAX LLONG_MAX +# else +# ifdef __GNUC__ +# define FFI_LONG_LONG_MAX __LONG_LONG_MAX__ +# endif +# endif +#endif + +#if SCHAR_MAX == 127 +# define ffi_type_uchar ffi_type_uint8 +# define ffi_type_schar ffi_type_sint8 +#else +#error "char size not supported" +#endif + +#if SHRT_MAX == 32767 +# define ffi_type_ushort ffi_type_uint16 +# define ffi_type_sshort ffi_type_sint16 +#elif SHRT_MAX == 2147483647 +# define ffi_type_ushort ffi_type_uint32 +# define ffi_type_sshort ffi_type_sint32 +#else +#error "short size not supported" +#endif + +#if INT_MAX == 32767 +# define ffi_type_uint ffi_type_uint16 +# define ffi_type_sint ffi_type_sint16 +#elif INT_MAX == 2147483647 +# define ffi_type_uint ffi_type_uint32 +# define ffi_type_sint ffi_type_sint32 +#elif INT_MAX == 9223372036854775807 +# define ffi_type_uint ffi_type_uint64 +# define ffi_type_sint ffi_type_sint64 +#else +#error "int size not supported" +#endif + +#define ffi_type_ulong ffi_type_uint64 +#define ffi_type_slong ffi_type_sint64 + +#if LONG_MAX == 2147483647 +# if FFI_LONG_LONG_MAX != 9223372036854775807 +# error "no 64-bit data type supported" +# endif +#elif LONG_MAX != 9223372036854775807 +#error "long size not supported" +#endif + +/* The closure code assumes that this works on pointers, i.e. a size_t + can hold a pointer. */ + +typedef struct _ffi_type { + size_t size; + unsigned short alignment; + unsigned short type; +/*@null@*/ struct _ffi_type** elements; +} ffi_type; + +/* These are defined in types.c */ +extern ffi_type ffi_type_void; +extern ffi_type ffi_type_uint8; +extern ffi_type ffi_type_sint8; +extern ffi_type ffi_type_uint16; +extern ffi_type ffi_type_sint16; +extern ffi_type ffi_type_uint32; +extern ffi_type ffi_type_sint32; +extern ffi_type ffi_type_uint64; +extern ffi_type ffi_type_sint64; +extern ffi_type ffi_type_float; +extern ffi_type ffi_type_double; +extern ffi_type ffi_type_longdouble; +extern ffi_type ffi_type_pointer; + +typedef enum ffi_status { + FFI_OK = 0, + FFI_BAD_TYPEDEF, + FFI_BAD_ABI +} ffi_status; + +typedef unsigned FFI_TYPE; + +typedef struct ffi_cif { + ffi_abi abi; + unsigned nargs; +/*@dependent@*/ ffi_type** arg_types; +/*@dependent@*/ ffi_type* rtype; + unsigned bytes; + unsigned flags; +#ifdef FFI_EXTRA_CIF_FIELDS + FFI_EXTRA_CIF_FIELDS; +#endif +} ffi_cif; + +/* ---- Definitions for the raw API -------------------------------------- */ + +#ifndef FFI_SIZEOF_ARG +# if LONG_MAX == 2147483647 +# define FFI_SIZEOF_ARG 4 +# elif LONG_MAX == 9223372036854775807 +# define FFI_SIZEOF_ARG 8 +# endif +#endif + +typedef union { + ffi_sarg sint; + ffi_arg uint; + float flt; + char data[FFI_SIZEOF_ARG]; + void* ptr; +} ffi_raw; + +void +ffi_raw_call( +/*@dependent@*/ ffi_cif* cif, + void (*fn)(void), +/*@out@*/ void* rvalue, +/*@dependent@*/ ffi_raw* avalue); + +void +ffi_ptrarray_to_raw( + ffi_cif* cif, + void** args, + ffi_raw* raw); + +void +ffi_raw_to_ptrarray( + ffi_cif* cif, + ffi_raw* raw, + void** args); + +size_t +ffi_raw_size( + ffi_cif* cif); + +/* This is analogous to the raw API, except it uses Java parameter + packing, even on 64-bit machines. I.e. on 64-bit machines + longs and doubles are followed by an empty 64-bit word. */ +void +ffi_java_raw_call( +/*@dependent@*/ ffi_cif* cif, + void (*fn)(void), +/*@out@*/ void* rvalue, +/*@dependent@*/ ffi_raw* avalue); + +void +ffi_java_ptrarray_to_raw( + ffi_cif* cif, + void** args, + ffi_raw* raw); + +void +ffi_java_raw_to_ptrarray( + ffi_cif* cif, + ffi_raw* raw, + void** args); + +size_t +ffi_java_raw_size( + ffi_cif* cif); + +/* ---- Definitions for closures ----------------------------------------- */ + +#if FFI_CLOSURES + +typedef struct ffi_closure { + char tramp[FFI_TRAMPOLINE_SIZE]; + ffi_cif* cif; + void (*fun)(ffi_cif*,void*,void**,void*); + void* user_data; +} ffi_closure; + +ffi_status +ffi_prep_closure( + ffi_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif*,void*,void**,void*), + void* user_data); + +void ffi_closure_free(void *); +void *ffi_closure_alloc (size_t size, void **code); + +typedef struct ffi_raw_closure { + char tramp[FFI_TRAMPOLINE_SIZE]; + ffi_cif* cif; + +#if !FFI_NATIVE_RAW_API + /* if this is enabled, then a raw closure has the same layout + as a regular closure. We use this to install an intermediate + handler to do the transaltion, void** -> ffi_raw*. */ + void (*translate_args)(ffi_cif*,void*,void**,void*); + void* this_closure; +#endif + + void (*fun)(ffi_cif*,void*,ffi_raw*,void*); + void* user_data; +} ffi_raw_closure; + +ffi_status +ffi_prep_raw_closure( + ffi_raw_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif*,void*,ffi_raw*,void*), + void* user_data); + +ffi_status +ffi_prep_java_raw_closure( + ffi_raw_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif*,void*,ffi_raw*,void*), + void* user_data); + +#endif // FFI_CLOSURES + +/* ---- Public interface definition -------------------------------------- */ + +ffi_status +ffi_prep_cif( +/*@out@*/ /*@partial@*/ ffi_cif* cif, + ffi_abi abi, + unsigned int nargs, +/*@dependent@*/ /*@out@*/ /*@partial@*/ ffi_type* rtype, +/*@dependent@*/ ffi_type** atypes); + +void +ffi_call( +/*@dependent@*/ ffi_cif* cif, + void (*fn)(void), +/*@out@*/ void* rvalue, +/*@dependent@*/ void** avalue); + +/* Useful for eliminating compiler warnings */ +#define FFI_FN(f) ((void (*)(void))f) + +#endif // #ifndef LIBFFI_ASM +/* ---- Definitions shared with assembly code ---------------------------- */ + +/* If these change, update src/mips/ffitarget.h. */ +#define FFI_TYPE_VOID 0 +#define FFI_TYPE_INT 1 +#define FFI_TYPE_FLOAT 2 +#define FFI_TYPE_DOUBLE 3 + +#ifdef HAVE_LONG_DOUBLE +# define FFI_TYPE_LONGDOUBLE 4 +#else +# define FFI_TYPE_LONGDOUBLE FFI_TYPE_DOUBLE +#endif + +#define FFI_TYPE_UINT8 5 +#define FFI_TYPE_SINT8 6 +#define FFI_TYPE_UINT16 7 +#define FFI_TYPE_SINT16 8 +#define FFI_TYPE_UINT32 9 +#define FFI_TYPE_SINT32 10 +#define FFI_TYPE_UINT64 11 +#define FFI_TYPE_SINT64 12 +#define FFI_TYPE_STRUCT 13 +#define FFI_TYPE_POINTER 14 + +/* This should always refer to the last type code (for sanity checks) */ +#define FFI_TYPE_LAST FFI_TYPE_POINTER + +#ifdef __cplusplus +} +#endif + +#endif // #ifndef LIBFFI_H diff -r -u ./Modules/_ctypes/libffi_osx/include/ffi_common.h ./Modules/_ctypes/libffi_osx/include/ffi_common.h new file mode 100644 index 0000000..685a358 --- /dev/null +++ ./Modules/_ctypes/libffi_osx/include/ffi_common.h @@ -0,0 +1,102 @@ +/* ----------------------------------------------------------------------- + ffi_common.h - Copyright (c) 1996 Red Hat, Inc. + + Common internal definitions and macros. Only necessary for building + libffi. + ----------------------------------------------------------------------- */ + +#ifndef FFI_COMMON_H +#define FFI_COMMON_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "fficonfig.h" + +/* Do not move this. Some versions of AIX are very picky about where + this is positioned. */ +#ifdef __GNUC__ +# define alloca __builtin_alloca +#else +# if HAVE_ALLOCA_H +# include +# else +# ifdef _AIX +# pragma alloca +# else +# ifndef alloca /* predefined by HP cc +Olibcalls */ +char* alloca(); +# endif +# endif +# endif +#endif + +/* Check for the existence of memcpy. */ +#if STDC_HEADERS +# include +#else +# ifndef HAVE_MEMCPY +# define memcpy(d, s, n) bcopy((s), (d), (n)) +# endif +#endif + +/*#if defined(FFI_DEBUG) +#include +#endif*/ + +#ifdef FFI_DEBUG +#include + +/*@exits@*/ void +ffi_assert( +/*@temp@*/ char* expr, +/*@temp@*/ char* file, + int line); +void +ffi_stop_here(void); +void +ffi_type_test( +/*@temp@*/ /*@out@*/ ffi_type* a, +/*@temp@*/ char* file, + int line); + +# define FFI_ASSERT(x) ((x) ? (void)0 : ffi_assert(#x, __FILE__,__LINE__)) +# define FFI_ASSERT_AT(x, f, l) ((x) ? 0 : ffi_assert(#x, (f), (l))) +# define FFI_ASSERT_VALID_TYPE(x) ffi_type_test(x, __FILE__, __LINE__) +#else +# define FFI_ASSERT(x) +# define FFI_ASSERT_AT(x, f, l) +# define FFI_ASSERT_VALID_TYPE(x) +#endif // #ifdef FFI_DEBUG + +#define ALIGN(v, a) (((size_t)(v) + (a) - 1) & ~((a) - 1)) + +/* Perform machine dependent cif processing */ +ffi_status +ffi_prep_cif_machdep( + ffi_cif* cif); + +/* Extended cif, used in callback from assembly routine */ +typedef struct extended_cif { +/*@dependent@*/ ffi_cif* cif; +/*@dependent@*/ void* rvalue; +/*@dependent@*/ void** avalue; +} extended_cif; + +/* Terse sized type definitions. */ +typedef unsigned int UINT8 __attribute__((__mode__(__QI__))); +typedef signed int SINT8 __attribute__((__mode__(__QI__))); +typedef unsigned int UINT16 __attribute__((__mode__(__HI__))); +typedef signed int SINT16 __attribute__((__mode__(__HI__))); +typedef unsigned int UINT32 __attribute__((__mode__(__SI__))); +typedef signed int SINT32 __attribute__((__mode__(__SI__))); +typedef unsigned int UINT64 __attribute__((__mode__(__DI__))); +typedef signed int SINT64 __attribute__((__mode__(__DI__))); +typedef float FLOAT32; + +#ifdef __cplusplus +} +#endif + +#endif // #ifndef FFI_COMMON_H \ No newline at end of file diff -r -u ./Modules/_ctypes/libffi_osx/include/fficonfig.h ./Modules/_ctypes/libffi_osx/include/fficonfig.h new file mode 100644 index 0000000..2172490 --- /dev/null +++ ./Modules/_ctypes/libffi_osx/include/fficonfig.h @@ -0,0 +1,150 @@ +/* Manually created fficonfig.h for Darwin on PowerPC or Intel + + This file is manually generated to do away with the need for autoconf and + therefore make it easier to cross-compile and build fat binaries. + + NOTE: This file was added by PyObjC. +*/ + +#ifndef MACOSX +#error "This file is only supported on Mac OS X" +#endif + +#if defined(__i386__) +# define BYTEORDER 1234 +# undef HOST_WORDS_BIG_ENDIAN +# undef WORDS_BIGENDIAN +# define SIZEOF_DOUBLE 8 +# define HAVE_LONG_DOUBLE 1 +# define SIZEOF_LONG_DOUBLE 16 + +#elif defined(__x86_64__) +# define BYTEORDER 1234 +# undef HOST_WORDS_BIG_ENDIAN +# undef WORDS_BIGENDIAN +# define SIZEOF_DOUBLE 8 +# define HAVE_LONG_DOUBLE 1 +# define SIZEOF_LONG_DOUBLE 16 + +#elif defined(__ppc__) +# define BYTEORDER 4321 +# define HOST_WORDS_BIG_ENDIAN 1 +# define WORDS_BIGENDIAN 1 +# define SIZEOF_DOUBLE 8 +# if __GNUC__ >= 4 +# define HAVE_LONG_DOUBLE 1 +# define SIZEOF_LONG_DOUBLE 16 +# else +# undef HAVE_LONG_DOUBLE +# define SIZEOF_LONG_DOUBLE 8 +# endif + +#elif defined(__ppc64__) +# define BYTEORDER 4321 +# define HOST_WORDS_BIG_ENDIAN 1 +# define WORDS_BIGENDIAN 1 +# define SIZEOF_DOUBLE 8 +# define HAVE_LONG_DOUBLE 1 +# define SIZEOF_LONG_DOUBLE 16 + +#else +#error "Unknown CPU type" +#endif + +/* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP + systems. This function is required for `alloca.c' support on those systems. */ +#undef CRAY_STACKSEG_END + +/* Define to 1 if using `alloca.c'. */ +/* #undef C_ALLOCA */ + +/* Define to the flags needed for the .section .eh_frame directive. */ +#define EH_FRAME_FLAGS "aw" + +/* Define this if you want extra debugging. */ +/* #undef FFI_DEBUG */ + +/* Define this is you do not want support for the raw API. */ +#define FFI_NO_RAW_API 1 + +/* Define this if you do not want support for aggregate types. */ +/* #undef FFI_NO_STRUCTS */ + +/* Define to 1 if you have `alloca', as a function or macro. */ +#define HAVE_ALLOCA 1 + +/* Define to 1 if you have and it should be used (not on Ultrix). */ +#define HAVE_ALLOCA_H 1 + +/* Define if your assembler supports .register. */ +/* #undef HAVE_AS_REGISTER_PSEUDO_OP */ + +/* Define if your assembler and linker support unaligned PC relative relocs. */ +/* #undef HAVE_AS_SPARC_UA_PCREL */ + +/* Define to 1 if you have the `memcpy' function. */ +#define HAVE_MEMCPY 1 + +/* Define if mmap with MAP_ANON(YMOUS) works. */ +#define HAVE_MMAP_ANON 1 + +/* Define if mmap of /dev/zero works. */ +/* #undef HAVE_MMAP_DEV_ZERO */ + +/* Define if read-only mmap of a plain file works. */ +#define HAVE_MMAP_FILE 1 + +/* Define if .eh_frame sections should be read-only. */ +/* #undef HAVE_RO_EH_FRAME */ + +/* Define to 1 if your C compiler doesn't accept -c and -o together. */ +/* #undef NO_MINUS_C_MINUS_O */ + +/* Name of package */ +#define PACKAGE "libffi" + +/* Define to the address where bug reports for this package should be sent. */ +#define PACKAGE_BUGREPORT "http://gcc.gnu.org/bugs.html" + +/* Define to the full name of this package. */ +#define PACKAGE_NAME "libffi" + +/* Define to the full name and version of this package. */ +#define PACKAGE_STRING "libffi 2.1" + +/* Define to the one symbol short name of this package. */ +#define PACKAGE_TARNAME "libffi" + +/* Define to the version of this package. */ +#define PACKAGE_VERSION "2.1" + +/* If using the C implementation of alloca, define if you know the + direction of stack growth for your system; otherwise it will be + automatically deduced at run-time. + STACK_DIRECTION > 0 => grows toward higher addresses + STACK_DIRECTION < 0 => grows toward lower addresses + STACK_DIRECTION = 0 => direction of growth unknown */ +/* #undef STACK_DIRECTION */ + +/* Define to 1 if you have the ANSI C header files. */ +#define STDC_HEADERS 1 + +/* Define this if you are using Purify and want to suppress spurious messages. */ +/* #undef USING_PURIFY */ + +/* Version number of package */ +#define VERSION "2.1-pyobjc" + +#ifdef HAVE_HIDDEN_VISIBILITY_ATTRIBUTE +# ifdef LIBFFI_ASM +# define FFI_HIDDEN(name) .hidden name +# else +# define FFI_HIDDEN __attribute__((visibility ("hidden"))) +# endif +#else +# ifdef LIBFFI_ASM +# define FFI_HIDDEN(name) +# else +# define FFI_HIDDEN +# endif +#endif \ No newline at end of file diff -r -u ./Modules/_ctypes/libffi_osx/include/ffitarget.h ./Modules/_ctypes/libffi_osx/include/ffitarget.h new file mode 100644 index 0000000..faaa30d --- /dev/null +++ ./Modules/_ctypes/libffi_osx/include/ffitarget.h @@ -0,0 +1,13 @@ +/* Dispatch to the right ffitarget file. This file is PyObjC specific; in a + normal build, the build environment copies the file to the right location or + sets up the right include flags. We want to do neither because that would + make building fat binaries harder. +*/ + +#if defined(__i386__) || defined(__x86_64__) +#include "x86-ffitarget.h" +#elif defined(__ppc__) || defined(__ppc64__) +#include "ppc-ffitarget.h" +#else +#error "Unsupported CPU type" +#endif \ No newline at end of file diff -r -u ./Modules/_ctypes/libffi_osx/include/ppc-ffitarget.h ./Modules/_ctypes/libffi_osx/include/ppc-ffitarget.h new file mode 100644 index 0000000..2318421 --- /dev/null +++ ./Modules/_ctypes/libffi_osx/include/ppc-ffitarget.h @@ -0,0 +1,104 @@ +/* -----------------------------------------------------------------*-C-*- + ppc-ffitarget.h - Copyright (c) 1996-2003 Red Hat, Inc. + Target configuration macros for PowerPC. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#ifndef LIBFFI_TARGET_H +#define LIBFFI_TARGET_H + +/* ---- System specific configurations ----------------------------------- */ + +#if (defined(POWERPC) && defined(__powerpc64__)) || \ + (defined(POWERPC_DARWIN) && defined(__ppc64__)) +#define POWERPC64 +#endif + +#ifndef LIBFFI_ASM + +typedef unsigned long ffi_arg; +typedef signed long ffi_sarg; + +typedef enum ffi_abi { + FFI_FIRST_ABI = 0, + +#ifdef POWERPC + FFI_SYSV, + FFI_GCC_SYSV, + FFI_LINUX64, +# ifdef POWERPC64 + FFI_DEFAULT_ABI = FFI_LINUX64, +# else + FFI_DEFAULT_ABI = FFI_GCC_SYSV, +# endif +#endif + +#ifdef POWERPC_AIX + FFI_AIX, + FFI_DARWIN, + FFI_DEFAULT_ABI = FFI_AIX, +#endif + +#ifdef POWERPC_DARWIN + FFI_AIX, + FFI_DARWIN, + FFI_DEFAULT_ABI = FFI_DARWIN, +#endif + +#ifdef POWERPC_FREEBSD + FFI_SYSV, + FFI_GCC_SYSV, + FFI_LINUX64, + FFI_DEFAULT_ABI = FFI_SYSV, +#endif + + FFI_LAST_ABI = FFI_DEFAULT_ABI + 1 +} ffi_abi; + +#endif // #ifndef LIBFFI_ASM + +/* ---- Definitions for closures ----------------------------------------- */ + +#define FFI_CLOSURES 1 +#define FFI_NATIVE_RAW_API 0 + +/* Needed for FFI_SYSV small structure returns. */ +#define FFI_SYSV_TYPE_SMALL_STRUCT (FFI_TYPE_LAST) + +#if defined(POWERPC64) /*|| defined(POWERPC_AIX)*/ +# define FFI_TRAMPOLINE_SIZE 48 +#elif defined(POWERPC_AIX) +# define FFI_TRAMPOLINE_SIZE 24 +#else +# define FFI_TRAMPOLINE_SIZE 40 +#endif + +#ifndef LIBFFI_ASM +# if defined(POWERPC_DARWIN) || defined(POWERPC_AIX) +typedef struct ffi_aix_trampoline_struct { + void* code_pointer; /* Pointer to ffi_closure_ASM */ + void* toc; /* TOC */ + void* static_chain; /* Pointer to closure */ +} ffi_aix_trampoline_struct; +# endif +#endif // #ifndef LIBFFI_ASM + +#endif // #ifndef LIBFFI_TARGET_H \ No newline at end of file diff -r -u ./Modules/_ctypes/libffi_osx/include/x86-ffitarget.h ./Modules/_ctypes/libffi_osx/include/x86-ffitarget.h new file mode 100644 index 0000000..55c2b6c --- /dev/null +++ ./Modules/_ctypes/libffi_osx/include/x86-ffitarget.h @@ -0,0 +1,88 @@ +/* -----------------------------------------------------------------*-C-*- + x86-ffitarget.h - Copyright (c) 1996-2003 Red Hat, Inc. + Target configuration macros for x86 and x86-64. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + ----------------------------------------------------------------------- */ + +#ifndef LIBFFI_TARGET_H +#define LIBFFI_TARGET_H + +/* ---- System specific configurations ----------------------------------- */ + +#if defined(X86_64) && defined(__i386__) +# undef X86_64 +# define X86 +#endif + +#if defined(__x86_64__) +# ifndef X86_64 +# define X86_64 +# endif +#endif + +/* ---- Generic type definitions ----------------------------------------- */ + +#ifndef LIBFFI_ASM + +typedef unsigned long ffi_arg; +typedef signed long ffi_sarg; + +typedef enum ffi_abi { + FFI_FIRST_ABI = 0, + + /* ---- Intel x86 Win32 ---------- */ +#ifdef X86_WIN32 + FFI_SYSV, + FFI_STDCALL, + /* TODO: Add fastcall support for the sake of completeness */ + FFI_DEFAULT_ABI = FFI_SYSV, +#endif + + /* ---- Intel x86 and AMD x86-64 - */ +#if !defined(X86_WIN32) && (defined(__i386__) || defined(__x86_64__)) + FFI_SYSV, + FFI_UNIX64, /* Unix variants all use the same ABI for x86-64 */ +# ifdef __i386__ + FFI_DEFAULT_ABI = FFI_SYSV, +# else + FFI_DEFAULT_ABI = FFI_UNIX64, +# endif +#endif + + FFI_LAST_ABI = FFI_DEFAULT_ABI + 1 +} ffi_abi; + +#endif // #ifndef LIBFFI_ASM + +/* ---- Definitions for closures ----------------------------------------- */ + +#define FFI_CLOSURES 1 + +#if defined(X86_64) || (defined(__x86_64__) && defined(X86_DARWIN)) +# define FFI_TRAMPOLINE_SIZE 24 +# define FFI_NATIVE_RAW_API 0 +#else +# define FFI_TRAMPOLINE_SIZE 10 +# define FFI_NATIVE_RAW_API 1 /* x86 has native raw api support */ +#endif + +#endif // #ifndef LIBFFI_TARGET_H \ No newline at end of file diff -r -u ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin.S ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin.S new file mode 100644 index 0000000..f143dbd --- /dev/null +++ ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin.S @@ -0,0 +1,365 @@ +#if defined(__ppc__) || defined(__ppc64__) + +/* ----------------------------------------------------------------------- + ppc-darwin.S - Copyright (c) 2000 John Hornkvist + Copyright (c) 2004 Free Software Foundation, Inc. + + PowerPC Assembly glue. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#define LIBFFI_ASM + +#include +#include +#include +#include + +.text + .align 2 +.globl _ffi_prep_args + +.text + .align 2 +.globl _ffi_call_DARWIN + +.text + .align 2 +_ffi_call_DARWIN: +LFB0: + mr r12,r8 /* We only need r12 until the call, + so it doesn't have to be saved. */ + +LFB1: + /* Save the old stack pointer as AP. */ + mr r8,r1 + +LCFI0: +#if defined(__ppc64__) + /* Allocate the stack space we need. + r4 (size of input data) + 48 bytes (linkage area) + 40 bytes (saved registers) + 8 bytes (extra FPR) + r4 + 96 bytes total + */ + + addi r4,r4,-96 // Add our overhead. + li r0,-32 // Align to 32 bytes. + and r4,r4,r0 +#endif + stgux r1,r1,r4 // Grow the stack. + mflr r9 + + /* Save registers we use. */ +#if defined(__ppc64__) + std r27,-40(r8) +#endif + stg r28,MODE_CHOICE(-16,-32)(r8) + stg r29,MODE_CHOICE(-12,-24)(r8) + stg r30,MODE_CHOICE(-8,-16)(r8) + stg r31,MODE_CHOICE(-4,-8)(r8) + stg r9,SF_RETURN(r8) /* return address */ +#if !defined(POWERPC_DARWIN) /* TOC unused in OS X */ + stg r2,MODE_CHOICE(20,40)(r1) +#endif + +LCFI1: +#if defined(__ppc64__) + mr r27,r3 // our extended_cif +#endif + /* Save arguments over call. */ + mr r31,r5 /* flags, */ + mr r30,r6 /* rvalue, */ + mr r29,r7 /* function address, */ + mr r28,r8 /* our AP. */ + +LCFI2: + /* Call ffi_prep_args. */ + mr r4,r1 + li r9,0 + mtctr r12 /* r12 holds address of _ffi_prep_args. */ + bctrl +#if !defined(POWERPC_DARWIN) /* TOC unused in OS X */ + lg r2,MODE_CHOICE(20,40)(r1) +#endif + + /* Now do the call. + Set up cr1 with bits 4-7 of the flags. */ + mtcrf 0x40,r31 + + /* Load all those argument registers. + We have set up a nice stack frame, just load it into registers. */ + lg r3,SF_ARG1(r1) + lg r4,SF_ARG2(r1) + lg r5,SF_ARG3(r1) + lg r6,SF_ARG4(r1) + nop + lg r7,SF_ARG5(r1) + lg r8,SF_ARG6(r1) + lg r9,SF_ARG7(r1) + lg r10,SF_ARG8(r1) + + /* Load all the FP registers. */ + bf 6,L2 /* No floats to load. */ +#if defined(__ppc64__) + lfd f1,MODE_CHOICE(-16,-40)-(14*8)(r28) + lfd f2,MODE_CHOICE(-16,-40)-(13*8)(r28) + lfd f3,MODE_CHOICE(-16,-40)-(12*8)(r28) + lfd f4,MODE_CHOICE(-16,-40)-(11*8)(r28) + nop + lfd f5,MODE_CHOICE(-16,-40)-(10*8)(r28) + lfd f6,MODE_CHOICE(-16,-40)-(9*8)(r28) + lfd f7,MODE_CHOICE(-16,-40)-(8*8)(r28) + lfd f8,MODE_CHOICE(-16,-40)-(7*8)(r28) + nop + lfd f9,MODE_CHOICE(-16,-40)-(6*8)(r28) + lfd f10,MODE_CHOICE(-16,-40)-(5*8)(r28) + lfd f11,MODE_CHOICE(-16,-40)-(4*8)(r28) + lfd f12,MODE_CHOICE(-16,-40)-(3*8)(r28) + nop + lfd f13,MODE_CHOICE(-16,-40)-(2*8)(r28) + lfd f14,MODE_CHOICE(-16,-40)-(1*8)(r28) +#elif defined(__ppc__) + lfd f1,MODE_CHOICE(-16,-40)-(13*8)(r28) + lfd f2,MODE_CHOICE(-16,-40)-(12*8)(r28) + lfd f3,MODE_CHOICE(-16,-40)-(11*8)(r28) + lfd f4,MODE_CHOICE(-16,-40)-(10*8)(r28) + nop + lfd f5,MODE_CHOICE(-16,-40)-(9*8)(r28) + lfd f6,MODE_CHOICE(-16,-40)-(8*8)(r28) + lfd f7,MODE_CHOICE(-16,-40)-(7*8)(r28) + lfd f8,MODE_CHOICE(-16,-40)-(6*8)(r28) + nop + lfd f9,MODE_CHOICE(-16,-40)-(5*8)(r28) + lfd f10,MODE_CHOICE(-16,-40)-(4*8)(r28) + lfd f11,MODE_CHOICE(-16,-40)-(3*8)(r28) + lfd f12,MODE_CHOICE(-16,-40)-(2*8)(r28) + nop + lfd f13,MODE_CHOICE(-16,-40)-(1*8)(r28) +#else +#error undefined architecture +#endif + +L2: + mr r12,r29 // Put the target address in r12 as specified. + mtctr r12 // Get the address to call into CTR. + nop + nop + bctrl // Make the call. + + // Deal with the return value. +#if defined(__ppc64__) + mtcrf 0x3,r31 // flags in cr6 and cr7 + bt 27,L(st_return_value) +#elif defined(__ppc__) + mtcrf 0x1,r31 // flags in cr7 +#else +#error undefined architecture +#endif + + bt 30,L(done_return_value) + bt 29,L(fp_return_value) + stg r3,0(r30) +#if defined(__ppc__) + bf 28,L(done_return_value) // Store the second long if necessary. + stg r4,4(r30) +#endif + // Fall through + +L(done_return_value): + lg r1,0(r1) // Restore stack pointer. + // Restore the registers we used. + lg r9,SF_RETURN(r1) // return address + lg r31,MODE_CHOICE(-4,-8)(r1) + mtlr r9 + lg r30,MODE_CHOICE(-8,-16)(r1) + lg r29,MODE_CHOICE(-12,-24)(r1) + lg r28,MODE_CHOICE(-16,-32)(r1) +#if defined(__ppc64__) + ld r27,-40(r1) +#endif + blr + +#if defined(__ppc64__) +L(st_return_value): + // Grow the stack enough to fit the registers. Leave room for 8 args + // to trample the 1st 8 slots in param area. + stgu r1,-SF_ROUND(280)(r1) // 64 + 104 + 48 + 64 + + // Store GPRs + std r3,SF_ARG9(r1) + std r4,SF_ARG10(r1) + std r5,SF_ARG11(r1) + std r6,SF_ARG12(r1) + nop + std r7,SF_ARG13(r1) + std r8,SF_ARG14(r1) + std r9,SF_ARG15(r1) + std r10,SF_ARG16(r1) + + // Store FPRs + nop + bf 26,L(call_struct_to_ram_form) + stfd f1,SF_ARG17(r1) + stfd f2,SF_ARG18(r1) + stfd f3,SF_ARG19(r1) + stfd f4,SF_ARG20(r1) + nop + stfd f5,SF_ARG21(r1) + stfd f6,SF_ARG22(r1) + stfd f7,SF_ARG23(r1) + stfd f8,SF_ARG24(r1) + nop + stfd f9,SF_ARG25(r1) + stfd f10,SF_ARG26(r1) + stfd f11,SF_ARG27(r1) + stfd f12,SF_ARG28(r1) + nop + stfd f13,SF_ARG29(r1) + +L(call_struct_to_ram_form): + ld r3,0(r27) // extended_cif->cif* + ld r3,16(r3) // ffi_cif->rtype* + addi r4,r1,SF_ARG9 // stored GPRs + addi r6,r1,SF_ARG17 // stored FPRs + li r5,0 // GPR size ptr (NULL) + li r7,0 // FPR size ptr (NULL) + li r8,0 // FPR count ptr (NULL) + li r10,0 // struct offset (NULL) + mr r9,r30 // return area + bl Lffi64_struct_to_ram_form$stub + lg r1,0(r1) // Restore stack pointer. + b L(done_return_value) +#endif + +L(fp_return_value): + /* Do we have long double to store? */ + bf 31,L(fd_return_value) + stfd f1,0(r30) + stfd f2,8(r30) + b L(done_return_value) + +L(fd_return_value): + /* Do we have double to store? */ + bf 28,L(float_return_value) + stfd f1,0(r30) + b L(done_return_value) + +L(float_return_value): + /* We only have a float to store. */ + stfs f1,0(r30) + b L(done_return_value) + +LFE1: +/* END(_ffi_call_DARWIN) */ + +/* Provide a null definition of _ffi_call_AIX. */ +.text + .align 2 +.globl _ffi_call_AIX +.text + .align 2 +_ffi_call_AIX: + blr +/* END(_ffi_call_AIX) */ + +.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms +EH_frame1: + .set L$set$0,LECIE1-LSCIE1 + .long L$set$0 ; Length of Common Information Entry +LSCIE1: + .long 0x0 ; CIE Identifier Tag + .byte 0x1 ; CIE Version + .ascii "zR\0" ; CIE Augmentation + .byte 0x1 ; uleb128 0x1; CIE Code Alignment Factor + .byte 0x7c ; sleb128 -4; CIE Data Alignment Factor + .byte 0x41 ; CIE RA Column + .byte 0x1 ; uleb128 0x1; Augmentation size + .byte 0x10 ; FDE Encoding (pcrel) + .byte 0xc ; DW_CFA_def_cfa + .byte 0x1 ; uleb128 0x1 + .byte 0x0 ; uleb128 0x0 + .align LOG2_GPR_BYTES +LECIE1: +.globl _ffi_call_DARWIN.eh +_ffi_call_DARWIN.eh: +LSFDE1: + .set L$set$1,LEFDE1-LASFDE1 + .long L$set$1 ; FDE Length + +LASFDE1: + .long LASFDE1-EH_frame1 ; FDE CIE offset + .g_long LFB0-. ; FDE initial location + .set L$set$3,LFE1-LFB0 + .g_long L$set$3 ; FDE address range + .byte 0x0 ; uleb128 0x0; Augmentation size + .byte 0x4 ; DW_CFA_advance_loc4 + .set L$set$4,LCFI0-LFB1 + .long L$set$4 + .byte 0xd ; DW_CFA_def_cfa_register + .byte 0x08 ; uleb128 0x08 + .byte 0x4 ; DW_CFA_advance_loc4 + .set L$set$5,LCFI1-LCFI0 + .long L$set$5 + .byte 0x11 ; DW_CFA_offset_extended_sf + .byte 0x41 ; uleb128 0x41 + .byte 0x7e ; sleb128 -2 + .byte 0x9f ; DW_CFA_offset, column 0x1f + .byte 0x1 ; uleb128 0x1 + .byte 0x9e ; DW_CFA_offset, column 0x1e + .byte 0x2 ; uleb128 0x2 + .byte 0x9d ; DW_CFA_offset, column 0x1d + .byte 0x3 ; uleb128 0x3 + .byte 0x9c ; DW_CFA_offset, column 0x1c + .byte 0x4 ; uleb128 0x4 + .byte 0x4 ; DW_CFA_advance_loc4 + .set L$set$6,LCFI2-LCFI1 + .long L$set$6 + .byte 0xd ; DW_CFA_def_cfa_register + .byte 0x1c ; uleb128 0x1c + .align LOG2_GPR_BYTES +LEFDE1: + +#if defined(__ppc64__) +.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 + .align LOG2_GPR_BYTES + +Lffi64_struct_to_ram_form$stub: + .indirect_symbol _ffi64_struct_to_ram_form + mflr r0 + bcl 20,31,LO$ffi64_struct_to_ram_form + +LO$ffi64_struct_to_ram_form: + mflr r11 + addis r11,r11,ha16(L_ffi64_struct_to_ram_form$lazy_ptr - LO$ffi64_struct_to_ram_form) + mtlr r0 + lgu r12,lo16(L_ffi64_struct_to_ram_form$lazy_ptr - LO$ffi64_struct_to_ram_form)(r11) + mtctr r12 + bctr + +.lazy_symbol_pointer +L_ffi64_struct_to_ram_form$lazy_ptr: + .indirect_symbol _ffi64_struct_to_ram_form + .g_long dyld_stub_binding_helper + +#endif // __ppc64__ +#endif // __ppc__ || __ppc64__ diff -r -u ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin.h ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin.h new file mode 100644 index 0000000..cf4bd50 --- /dev/null +++ ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin.h @@ -0,0 +1,85 @@ +/* ----------------------------------------------------------------------- + ppc-darwin.h - Copyright (c) 2002, 2003, 2004, Free Software Foundation, + Inc. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#define L(x) x + +#define SF_ARG9 MODE_CHOICE(56,112) +#define SF_ARG10 MODE_CHOICE(60,120) +#define SF_ARG11 MODE_CHOICE(64,128) +#define SF_ARG12 MODE_CHOICE(68,136) +#define SF_ARG13 MODE_CHOICE(72,144) +#define SF_ARG14 MODE_CHOICE(76,152) +#define SF_ARG15 MODE_CHOICE(80,160) +#define SF_ARG16 MODE_CHOICE(84,168) +#define SF_ARG17 MODE_CHOICE(88,176) +#define SF_ARG18 MODE_CHOICE(92,184) +#define SF_ARG19 MODE_CHOICE(96,192) +#define SF_ARG20 MODE_CHOICE(100,200) +#define SF_ARG21 MODE_CHOICE(104,208) +#define SF_ARG22 MODE_CHOICE(108,216) +#define SF_ARG23 MODE_CHOICE(112,224) +#define SF_ARG24 MODE_CHOICE(116,232) +#define SF_ARG25 MODE_CHOICE(120,240) +#define SF_ARG26 MODE_CHOICE(124,248) +#define SF_ARG27 MODE_CHOICE(128,256) +#define SF_ARG28 MODE_CHOICE(132,264) +#define SF_ARG29 MODE_CHOICE(136,272) + +#define ASM_NEEDS_REGISTERS 4 +#define NUM_GPR_ARG_REGISTERS 8 +#define NUM_FPR_ARG_REGISTERS 13 + +#define FFI_TYPE_1_BYTE(x) ((x) == FFI_TYPE_UINT8 || (x) == FFI_TYPE_SINT8) +#define FFI_TYPE_2_BYTE(x) ((x) == FFI_TYPE_UINT16 || (x) == FFI_TYPE_SINT16) +#define FFI_TYPE_4_BYTE(x) \ + ((x) == FFI_TYPE_UINT32 || (x) == FFI_TYPE_SINT32 ||\ + (x) == FFI_TYPE_INT || (x) == FFI_TYPE_FLOAT) + +#if !defined(LIBFFI_ASM) + +enum { + FLAG_RETURNS_NOTHING = 1 << (31 - 30), // cr7 + FLAG_RETURNS_FP = 1 << (31 - 29), + FLAG_RETURNS_64BITS = 1 << (31 - 28), + FLAG_RETURNS_128BITS = 1 << (31 - 31), + + FLAG_RETURNS_STRUCT = 1 << (31 - 27), // cr6 + FLAG_STRUCT_CONTAINS_FP = 1 << (31 - 26), + + FLAG_ARG_NEEDS_COPY = 1 << (31 - 7), + FLAG_FP_ARGUMENTS = 1 << (31 - 6), // cr1.eq; specified by ABI + FLAG_4_GPR_ARGUMENTS = 1 << (31 - 5), + FLAG_RETVAL_REFERENCE = 1 << (31 - 4) +}; + +#if defined(__ppc64__) +void ffi64_struct_to_ram_form(const ffi_type*, const char*, unsigned int*, + const char*, unsigned int*, unsigned int*, char*, unsigned int*); +void ffi64_struct_to_reg_form(const ffi_type*, const char*, unsigned int*, + unsigned int*, char*, unsigned int*, char*, unsigned int*); +bool ffi64_stret_needs_ptr(const ffi_type* inType, + unsigned short*, unsigned short*); +#endif + +#endif // !defined(LIBFFI_ASM) \ No newline at end of file diff -r -u ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin_closure.S ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin_closure.S new file mode 100644 index 0000000..c3d30c2 --- /dev/null +++ ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin_closure.S @@ -0,0 +1,308 @@ +#if defined(__ppc__) + +/* ----------------------------------------------------------------------- + ppc-darwin_closure.S - Copyright (c) 2002, 2003, 2004, Free Software Foundation, + Inc. based on ppc_closure.S + + PowerPC Assembly glue. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#define LIBFFI_ASM + +#include +#include // for FFI_TRAMPOLINE_SIZE +#include +#include + + .file "ppc-darwin_closure.S" +.text + .align LOG2_GPR_BYTES + .globl _ffi_closure_ASM + +.text + .align LOG2_GPR_BYTES + +_ffi_closure_ASM: +LFB1: + mflr r0 // Save return address + stg r0,SF_RETURN(r1) + +LCFI0: + /* 24/48 bytes (Linkage Area) + 32/64 bytes (outgoing parameter area, always reserved) + 104 bytes (13*8 from FPR) + 16/32 bytes (result) + 176/232 total bytes */ + + /* skip over caller save area and keep stack aligned to 16/32. */ + stgu r1,-SF_ROUND(176)(r1) + +LCFI1: + /* We want to build up an area for the parameters passed + in registers. (both floating point and integer) */ + + /* 176/256 bytes (callee stack frame aligned to 16/32) + 24/48 bytes (caller linkage area) + 200/304 (start of caller parameter area aligned to 4/8) + */ + + /* Save GPRs 3 - 10 (aligned to 4/8) + in the parents outgoing area. */ + stg r3,200(r1) + stg r4,204(r1) + stg r5,208(r1) + stg r6,212(r1) + stg r7,216(r1) + stg r8,220(r1) + stg r9,224(r1) + stg r10,228(r1) + + /* Save FPRs 1 - 13. (aligned to 8) */ + stfd f1,56(r1) + stfd f2,64(r1) + stfd f3,72(r1) + stfd f4,80(r1) + stfd f5,88(r1) + stfd f6,96(r1) + stfd f7,104(r1) + stfd f8,112(r1) + stfd f9,120(r1) + stfd f10,128(r1) + stfd f11,136(r1) + stfd f12,144(r1) + stfd f13,152(r1) + + // Set up registers for the routine that actually does the work. + mr r3,r11 // context pointer from the trampoline + addi r4,r1,160 // result storage + addi r5,r1,200 // saved GPRs + addi r6,r1,56 // saved FPRs + bl Lffi_closure_helper_DARWIN$stub + + /* Now r3 contains the return type. Use it to look up in a table + so we know how to deal with each type. */ + addi r5,r1,160 // Copy result storage pointer. + bl Lget_ret_type0_addr // Get pointer to Lret_type0 into LR. + mflr r4 // Move to r4. + slwi r3,r3,4 // Multiply return type by 16. + add r3,r3,r4 // Add contents of table to table address. + mtctr r3 + bctr + +LFE1: +/* Each of the ret_typeX code fragments has to be exactly 16 bytes long + (4 instructions). For cache effectiveness we align to a 16 byte boundary + first. */ + .align 4 + nop + nop + nop + +Lget_ret_type0_addr: + blrl + +/* case FFI_TYPE_VOID */ +Lret_type0: + b Lfinish + nop + nop + nop + +/* case FFI_TYPE_INT */ +Lret_type1: + lwz r3,0(r5) + b Lfinish + nop + nop + +/* case FFI_TYPE_FLOAT */ +Lret_type2: + lfs f1,0(r5) + b Lfinish + nop + nop + +/* case FFI_TYPE_DOUBLE */ +Lret_type3: + lfd f1,0(r5) + b Lfinish + nop + nop + +/* case FFI_TYPE_LONGDOUBLE */ +Lret_type4: + lfd f1,0(r5) + lfd f2,8(r5) + b Lfinish + nop + +/* case FFI_TYPE_UINT8 */ +Lret_type5: + lbz r3,3(r5) + b Lfinish + nop + nop + +/* case FFI_TYPE_SINT8 */ +Lret_type6: + lbz r3,3(r5) + extsb r3,r3 + b Lfinish + nop + +/* case FFI_TYPE_UINT16 */ +Lret_type7: + lhz r3,2(r5) + b Lfinish + nop + nop + +/* case FFI_TYPE_SINT16 */ +Lret_type8: + lha r3,2(r5) + b Lfinish + nop + nop + +/* case FFI_TYPE_UINT32 */ +Lret_type9: // same as Lret_type1 + lwz r3,0(r5) + b Lfinish + nop + nop + +/* case FFI_TYPE_SINT32 */ +Lret_type10: // same as Lret_type1 + lwz r3,0(r5) + b Lfinish + nop + nop + +/* case FFI_TYPE_UINT64 */ +Lret_type11: + lwz r3,0(r5) + lwz r4,4(r5) + b Lfinish + nop + +/* case FFI_TYPE_SINT64 */ +Lret_type12: // same as Lret_type11 + lwz r3,0(r5) + lwz r4,4(r5) + b Lfinish + nop + +/* case FFI_TYPE_STRUCT */ +Lret_type13: + b Lfinish + nop + nop + nop + +/* End 16-byte aligned cases */ +/* case FFI_TYPE_POINTER */ +// This case assumes that FFI_TYPE_POINTER == FFI_TYPE_LAST. If more types +// are added in future, the following code will need to be updated and +// padded to 16 bytes. +Lret_type14: + lg r3,0(r5) + // fall through + +/* case done */ +Lfinish: + addi r1,r1,SF_ROUND(176) // Restore stack pointer. + lg r0,SF_RETURN(r1) // Restore return address. + mtlr r0 // Restore link register. + blr + +/* END(ffi_closure_ASM) */ + +.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support +EH_frame1: + .set L$set$0,LECIE1-LSCIE1 + .long L$set$0 ; Length of Common Information Entry +LSCIE1: + .long 0x0 ; CIE Identifier Tag + .byte 0x1 ; CIE Version + .ascii "zR\0" ; CIE Augmentation + .byte 0x1 ; uleb128 0x1; CIE Code Alignment Factor + .byte 0x7c ; sleb128 -4; CIE Data Alignment Factor + .byte 0x41 ; CIE RA Column + .byte 0x1 ; uleb128 0x1; Augmentation size + .byte 0x10 ; FDE Encoding (pcrel) + .byte 0xc ; DW_CFA_def_cfa + .byte 0x1 ; uleb128 0x1 + .byte 0x0 ; uleb128 0x0 + .align LOG2_GPR_BYTES +LECIE1: +.globl _ffi_closure_ASM.eh +_ffi_closure_ASM.eh: +LSFDE1: + .set L$set$1,LEFDE1-LASFDE1 + .long L$set$1 ; FDE Length + +LASFDE1: + .long LASFDE1-EH_frame1 ; FDE CIE offset + .g_long LFB1-. ; FDE initial location + .set L$set$3,LFE1-LFB1 + .g_long L$set$3 ; FDE address range + .byte 0x0 ; uleb128 0x0; Augmentation size + .byte 0x4 ; DW_CFA_advance_loc4 + .set L$set$3,LCFI1-LCFI0 + .long L$set$3 + .byte 0xe ; DW_CFA_def_cfa_offset + .byte 176,1 ; uleb128 176 + .byte 0x4 ; DW_CFA_advance_loc4 + .set L$set$4,LCFI0-LFB1 + .long L$set$4 + .byte 0x11 ; DW_CFA_offset_extended_sf + .byte 0x41 ; uleb128 0x41 + .byte 0x7e ; sleb128 -2 + .align LOG2_GPR_BYTES + +LEFDE1: +.data + .align LOG2_GPR_BYTES +LDFCM0: +.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 + .align LOG2_GPR_BYTES + +Lffi_closure_helper_DARWIN$stub: + .indirect_symbol _ffi_closure_helper_DARWIN + mflr r0 + bcl 20,31,LO$ffi_closure_helper_DARWIN + +LO$ffi_closure_helper_DARWIN: + mflr r11 + addis r11,r11,ha16(L_ffi_closure_helper_DARWIN$lazy_ptr - LO$ffi_closure_helper_DARWIN) + mtlr r0 + lgu r12,lo16(L_ffi_closure_helper_DARWIN$lazy_ptr - LO$ffi_closure_helper_DARWIN)(r11) + mtctr r12 + bctr + +.lazy_symbol_pointer +L_ffi_closure_helper_DARWIN$lazy_ptr: + .indirect_symbol _ffi_closure_helper_DARWIN + .g_long dyld_stub_binding_helper + + +#endif // __ppc__ diff -r -u ./Modules/_ctypes/libffi_osx/powerpc/ppc-ffi_darwin.c ./Modules/_ctypes/libffi_osx/powerpc/ppc-ffi_darwin.c new file mode 100644 index 0000000..8953d5f --- /dev/null +++ ./Modules/_ctypes/libffi_osx/powerpc/ppc-ffi_darwin.c @@ -0,0 +1,1776 @@ +#if defined(__ppc__) || defined(__ppc64__) + +/* ----------------------------------------------------------------------- + ffi.c - Copyright (c) 1998 Geoffrey Keating + + PowerPC Foreign Function Interface + + Darwin ABI support (c) 2001 John Hornkvist + AIX ABI support (c) 2002 Free Software Foundation, Inc. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#include +#include + +#include +#include +#include +#include +#include + +#if 0 +#if defined(POWERPC_DARWIN) +#include // for sys_icache_invalidate() +#endif + +#else + +#pragma weak sys_icache_invalidate +extern void sys_icache_invalidate(void *start, size_t len); + +#endif + + +extern void ffi_closure_ASM(void); + +// The layout of a function descriptor. A C function pointer really +// points to one of these. +typedef struct aix_fd_struct { + void* code_pointer; + void* toc; +} aix_fd; + +/* ffi_prep_args is called by the assembly routine once stack space + has been allocated for the function's arguments. + + The stack layout we want looks like this: + + | Return address from ffi_call_DARWIN | higher addresses + |--------------------------------------------| + | Previous backchain pointer 4/8 | stack pointer here + |--------------------------------------------|-\ <<< on entry to + | Saved r28-r31 (4/8)*4 | | ffi_call_DARWIN + |--------------------------------------------| | + | Parameters (at least 8*(4/8)=32/64) | | (176) +112 - +288 + |--------------------------------------------| | + | Space for GPR2 4/8 | | + |--------------------------------------------| | stack | + | Reserved (4/8)*2 | | grows | + |--------------------------------------------| | down V + | Space for callee's LR 4/8 | | + |--------------------------------------------| | lower addresses + | Saved CR 4/8 | | + |--------------------------------------------| | stack pointer here + | Current backchain pointer 4/8 | | during + |--------------------------------------------|-/ <<< ffi_call_DARWIN + + Note: ppc64 CR is saved in the low word of a long on the stack. +*/ + +/*@-exportheader@*/ +void +ffi_prep_args( + extended_cif* inEcif, + unsigned *const stack) +/*@=exportheader@*/ +{ + /* Copy the ecif to a local var so we can trample the arg. + BC note: test this with GP later for possible problems... */ + volatile extended_cif* ecif = inEcif; + + const unsigned bytes = ecif->cif->bytes; + const unsigned flags = ecif->cif->flags; + + /* Cast the stack arg from int* to long*. sizeof(long) == 4 in 32-bit mode + and 8 in 64-bit mode. */ + unsigned long *const longStack = (unsigned long *const)stack; + + /* 'stacktop' points at the previous backchain pointer. */ +#if defined(__ppc64__) + // In ppc-darwin.s, an extra 96 bytes is reserved for the linkage area, + // saved registers, and an extra FPR. + unsigned long *const stacktop = + (unsigned long *)(unsigned long)((char*)longStack + bytes + 96); +#elif defined(__ppc__) + unsigned long *const stacktop = longStack + (bytes / sizeof(long)); +#else +#error undefined architecture +#endif + + /* 'fpr_base' points at the space for fpr1, and grows upwards as + we use FPR registers. */ + double* fpr_base = (double*)(stacktop - ASM_NEEDS_REGISTERS) - + NUM_FPR_ARG_REGISTERS; + +#if defined(__ppc64__) + // 64-bit saves an extra register, and uses an extra FPR. Knock fpr_base + // down a couple pegs. + fpr_base -= 2; +#endif + + unsigned int fparg_count = 0; + + /* 'next_arg' grows up as we put parameters in it. */ + unsigned long* next_arg = longStack + 6; /* 6 reserved positions. */ + + int i; + double double_tmp; + void** p_argv = ecif->avalue; + unsigned long gprvalue; + ffi_type** ptr = ecif->cif->arg_types; + + /* Check that everything starts aligned properly. */ + FFI_ASSERT(stack == SF_ROUND(stack)); + FFI_ASSERT(stacktop == SF_ROUND(stacktop)); + FFI_ASSERT(bytes == SF_ROUND(bytes)); + + /* Deal with return values that are actually pass-by-reference. + Rule: + Return values are referenced by r3, so r4 is the first parameter. */ + + if (flags & FLAG_RETVAL_REFERENCE) + *next_arg++ = (unsigned long)(char*)ecif->rvalue; + + /* Now for the arguments. */ + for (i = ecif->cif->nargs; i > 0; i--, ptr++, p_argv++) + { + switch ((*ptr)->type) + { + /* If a floating-point parameter appears before all of the general- + purpose registers are filled, the corresponding GPRs that match + the size of the floating-point parameter are shadowed for the + benefit of vararg and pre-ANSI functions. */ + case FFI_TYPE_FLOAT: + double_tmp = *(float*)*p_argv; + + if (fparg_count < NUM_FPR_ARG_REGISTERS) + *fpr_base++ = double_tmp; + + *(double*)next_arg = double_tmp; + + next_arg++; + fparg_count++; + FFI_ASSERT(flags & FLAG_FP_ARGUMENTS); + + break; + + case FFI_TYPE_DOUBLE: + double_tmp = *(double*)*p_argv; + + if (fparg_count < NUM_FPR_ARG_REGISTERS) + *fpr_base++ = double_tmp; + + *(double*)next_arg = double_tmp; + + next_arg += MODE_CHOICE(2,1); + fparg_count++; + FFI_ASSERT(flags & FLAG_FP_ARGUMENTS); + + break; + +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + case FFI_TYPE_LONGDOUBLE: +#if defined(__ppc64__) + if (fparg_count < NUM_FPR_ARG_REGISTERS) + *(long double*)fpr_base = *(long double*)*p_argv; +#elif defined(__ppc__) + if (fparg_count < NUM_FPR_ARG_REGISTERS - 1) + *(long double*)fpr_base = *(long double*)*p_argv; + else if (fparg_count == NUM_FPR_ARG_REGISTERS - 1) + *(double*)fpr_base = *(double*)*p_argv; +#else +#error undefined architecture +#endif + + *(long double*)next_arg = *(long double*)*p_argv; + fparg_count += 2; + fpr_base += 2; + next_arg += MODE_CHOICE(4,2); + FFI_ASSERT(flags & FLAG_FP_ARGUMENTS); + + break; +#endif // FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: +#if defined(__ppc64__) + gprvalue = *(long long*)*p_argv; + goto putgpr; +#elif defined(__ppc__) + *(long long*)next_arg = *(long long*)*p_argv; + next_arg += 2; + break; +#else +#error undefined architecture +#endif + + case FFI_TYPE_POINTER: + gprvalue = *(unsigned long*)*p_argv; + goto putgpr; + + case FFI_TYPE_UINT8: + gprvalue = *(unsigned char*)*p_argv; + goto putgpr; + + case FFI_TYPE_SINT8: + gprvalue = *(signed char*)*p_argv; + goto putgpr; + + case FFI_TYPE_UINT16: + gprvalue = *(unsigned short*)*p_argv; + goto putgpr; + + case FFI_TYPE_SINT16: + gprvalue = *(signed short*)*p_argv; + goto putgpr; + + case FFI_TYPE_STRUCT: + { +#if defined(__ppc64__) + unsigned int gprSize = 0; + unsigned int fprSize = 0; + + ffi64_struct_to_reg_form(*ptr, (char*)*p_argv, NULL, &fparg_count, + (char*)next_arg, &gprSize, (char*)fpr_base, &fprSize); + next_arg += gprSize / sizeof(long); + fpr_base += fprSize / sizeof(double); + +#elif defined(__ppc__) + char* dest_cpy = (char*)next_arg; + + /* Structures that match the basic modes (QI 1 byte, HI 2 bytes, + SI 4 bytes) are aligned as if they were those modes. + Structures with 3 byte in size are padded upwards. */ + unsigned size_al = (*ptr)->size; + + /* If the first member of the struct is a double, then align + the struct to double-word. */ + if ((*ptr)->elements[0]->type == FFI_TYPE_DOUBLE) + size_al = ALIGN((*ptr)->size, 8); + + if (ecif->cif->abi == FFI_DARWIN) + { + if (size_al < 3) + dest_cpy += 4 - size_al; + } + + memcpy((char*)dest_cpy, (char*)*p_argv, size_al); + next_arg += (size_al + 3) / 4; +#else +#error undefined architecture +#endif + break; + } + + case FFI_TYPE_INT: + case FFI_TYPE_UINT32: + case FFI_TYPE_SINT32: + gprvalue = *(unsigned*)*p_argv; + +putgpr: + *next_arg++ = gprvalue; + break; + + default: + break; + } + } + + /* Check that we didn't overrun the stack... */ + //FFI_ASSERT(gpr_base <= stacktop - ASM_NEEDS_REGISTERS); + //FFI_ASSERT((unsigned *)fpr_base + // <= stacktop - ASM_NEEDS_REGISTERS - NUM_GPR_ARG_REGISTERS); + //FFI_ASSERT(flags & FLAG_4_GPR_ARGUMENTS || intarg_count <= 4); +} + +#if defined(__ppc64__) + +bool +ffi64_struct_contains_fp( + const ffi_type* inType) +{ + bool containsFP = false; + unsigned int i; + + for (i = 0; inType->elements[i] != NULL && !containsFP; i++) + { + if (inType->elements[i]->type == FFI_TYPE_FLOAT || + inType->elements[i]->type == FFI_TYPE_DOUBLE || + inType->elements[i]->type == FFI_TYPE_LONGDOUBLE) + containsFP = true; + else if (inType->elements[i]->type == FFI_TYPE_STRUCT) + containsFP = ffi64_struct_contains_fp(inType->elements[i]); + } + + return containsFP; +} + +#endif // defined(__ppc64__) + +/* Perform machine dependent cif processing. */ +ffi_status +ffi_prep_cif_machdep( + ffi_cif* cif) +{ + /* All this is for the DARWIN ABI. */ + int i; + ffi_type** ptr; + int intarg_count = 0; + int fparg_count = 0; + unsigned int flags = 0; + unsigned int size_al = 0; + + /* All the machine-independent calculation of cif->bytes will be wrong. + Redo the calculation for DARWIN. */ + + /* Space for the frame pointer, callee's LR, CR, etc, and for + the asm's temp regs. */ + unsigned int bytes = (6 + ASM_NEEDS_REGISTERS) * sizeof(long); + + /* Return value handling. The rules are as follows: + - 32-bit (or less) integer values are returned in gpr3; + - Structures of size <= 4 bytes also returned in gpr3; + - 64-bit integer values and structures between 5 and 8 bytes are + returned in gpr3 and gpr4; + - Single/double FP values are returned in fpr1; + - Long double FP (if not equivalent to double) values are returned in + fpr1 and fpr2; + - Larger structures values are allocated space and a pointer is passed + as the first argument. */ + switch (cif->rtype->type) + { +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + case FFI_TYPE_LONGDOUBLE: + flags |= FLAG_RETURNS_128BITS; + flags |= FLAG_RETURNS_FP; + break; +#endif // FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + + case FFI_TYPE_DOUBLE: + flags |= FLAG_RETURNS_64BITS; + /* Fall through. */ + case FFI_TYPE_FLOAT: + flags |= FLAG_RETURNS_FP; + break; + +#if defined(__ppc64__) + case FFI_TYPE_POINTER: +#endif + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + flags |= FLAG_RETURNS_64BITS; + break; + + case FFI_TYPE_STRUCT: + { +#if defined(__ppc64__) + + if (ffi64_stret_needs_ptr(cif->rtype, NULL, NULL)) + { + flags |= FLAG_RETVAL_REFERENCE; + flags |= FLAG_RETURNS_NOTHING; + intarg_count++; + } + else + { + flags |= FLAG_RETURNS_STRUCT; + + if (ffi64_struct_contains_fp(cif->rtype)) + flags |= FLAG_STRUCT_CONTAINS_FP; + } + +#elif defined(__ppc__) + + flags |= FLAG_RETVAL_REFERENCE; + flags |= FLAG_RETURNS_NOTHING; + intarg_count++; + +#else +#error undefined architecture +#endif + break; + } + + case FFI_TYPE_VOID: + flags |= FLAG_RETURNS_NOTHING; + break; + + default: + /* Returns 32-bit integer, or similar. Nothing to do here. */ + break; + } + + /* The first NUM_GPR_ARG_REGISTERS words of integer arguments, and the + first NUM_FPR_ARG_REGISTERS fp arguments, go in registers; the rest + goes on the stack. Structures are passed as a pointer to a copy of + the structure. Stuff on the stack needs to keep proper alignment. */ + for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++) + { + switch ((*ptr)->type) + { + case FFI_TYPE_FLOAT: + case FFI_TYPE_DOUBLE: + fparg_count++; + /* If this FP arg is going on the stack, it must be + 8-byte-aligned. */ + if (fparg_count > NUM_FPR_ARG_REGISTERS + && intarg_count % 2 != 0) + intarg_count++; + break; + +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + case FFI_TYPE_LONGDOUBLE: + fparg_count += 2; + /* If this FP arg is going on the stack, it must be + 8-byte-aligned. */ + + if ( +#if defined(__ppc64__) + fparg_count > NUM_FPR_ARG_REGISTERS + 1 +#elif defined(__ppc__) + fparg_count > NUM_FPR_ARG_REGISTERS +#else +#error undefined architecture +#endif + && intarg_count % 2 != 0) + intarg_count++; + + intarg_count += 2; + break; +#endif // FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + /* 'long long' arguments are passed as two words, but + either both words must fit in registers or both go + on the stack. If they go on the stack, they must + be 8-byte-aligned. */ + if (intarg_count == NUM_GPR_ARG_REGISTERS - 1 + || (intarg_count >= NUM_GPR_ARG_REGISTERS + && intarg_count % 2 != 0)) + intarg_count++; + + intarg_count += MODE_CHOICE(2,1); + + break; + + case FFI_TYPE_STRUCT: + size_al = (*ptr)->size; + /* If the first member of the struct is a double, then align + the struct to double-word. */ + if ((*ptr)->elements[0]->type == FFI_TYPE_DOUBLE) + size_al = ALIGN((*ptr)->size, 8); + +#if defined(__ppc64__) + // Look for FP struct members. + unsigned int j; + + for (j = 0; (*ptr)->elements[j] != NULL; j++) + { + if ((*ptr)->elements[j]->type == FFI_TYPE_FLOAT || + (*ptr)->elements[j]->type == FFI_TYPE_DOUBLE) + { + fparg_count++; + + if (fparg_count > NUM_FPR_ARG_REGISTERS) + intarg_count++; + } + else if ((*ptr)->elements[j]->type == FFI_TYPE_LONGDOUBLE) + { + fparg_count += 2; + + if (fparg_count > NUM_FPR_ARG_REGISTERS + 1) + intarg_count += 2; + } + else + intarg_count++; + } +#elif defined(__ppc__) + intarg_count += (size_al + 3) / 4; +#else +#error undefined architecture +#endif + + break; + + default: + /* Everything else is passed as a 4/8-byte word in a GPR, either + the object itself or a pointer to it. */ + intarg_count++; + break; + } + } + + /* Space for the FPR registers, if needed. */ + if (fparg_count != 0) + { + flags |= FLAG_FP_ARGUMENTS; +#if defined(__ppc64__) + bytes += (NUM_FPR_ARG_REGISTERS + 1) * sizeof(double); +#elif defined(__ppc__) + bytes += NUM_FPR_ARG_REGISTERS * sizeof(double); +#else +#error undefined architecture +#endif + } + + /* Stack space. */ +#if defined(__ppc64__) + if ((intarg_count + fparg_count) > NUM_GPR_ARG_REGISTERS) + bytes += (intarg_count + fparg_count) * sizeof(long); +#elif defined(__ppc__) + if ((intarg_count + 2 * fparg_count) > NUM_GPR_ARG_REGISTERS) + bytes += (intarg_count + 2 * fparg_count) * sizeof(long); +#else +#error undefined architecture +#endif + else + bytes += NUM_GPR_ARG_REGISTERS * sizeof(long); + + /* The stack space allocated needs to be a multiple of 16/32 bytes. */ + bytes = SF_ROUND(bytes); + + cif->flags = flags; + cif->bytes = bytes; + + return FFI_OK; +} + +/*@-declundef@*/ +/*@-exportheader@*/ +extern void +ffi_call_AIX( +/*@out@*/ extended_cif*, + unsigned, + unsigned, +/*@out@*/ unsigned*, + void (*fn)(void), + void (*fn2)(extended_cif*, unsigned *const)); + +extern void +ffi_call_DARWIN( +/*@out@*/ extended_cif*, + unsigned long, + unsigned, +/*@out@*/ unsigned*, + void (*fn)(void), + void (*fn2)(extended_cif*, unsigned *const)); +/*@=declundef@*/ +/*@=exportheader@*/ + +void +ffi_call( +/*@dependent@*/ ffi_cif* cif, + void (*fn)(void), +/*@out@*/ void* rvalue, +/*@dependent@*/ void** avalue) +{ + extended_cif ecif; + + ecif.cif = cif; + ecif.avalue = avalue; + + /* If the return value is a struct and we don't have a return + value address then we need to make one. */ + if ((rvalue == NULL) && + (cif->rtype->type == FFI_TYPE_STRUCT)) + { + /*@-sysunrecog@*/ + ecif.rvalue = alloca(cif->rtype->size); + /*@=sysunrecog@*/ + } + else + ecif.rvalue = rvalue; + + switch (cif->abi) + { + case FFI_AIX: + /*@-usedef@*/ + ffi_call_AIX(&ecif, -cif->bytes, + cif->flags, ecif.rvalue, fn, ffi_prep_args); + /*@=usedef@*/ + break; + + case FFI_DARWIN: + /*@-usedef@*/ + ffi_call_DARWIN(&ecif, -(long)cif->bytes, + cif->flags, ecif.rvalue, fn, ffi_prep_args); + /*@=usedef@*/ + break; + + default: + FFI_ASSERT(0); + break; + } +} + +/* here I'd like to add the stack frame layout we use in darwin_closure.S + and aix_clsoure.S + + SP previous -> +---------------------------------------+ <--- child frame + | back chain to caller 4 | + +---------------------------------------+ 4 + | saved CR 4 | + +---------------------------------------+ 8 + | saved LR 4 | + +---------------------------------------+ 12 + | reserved for compilers 4 | + +---------------------------------------+ 16 + | reserved for binders 4 | + +---------------------------------------+ 20 + | saved TOC pointer 4 | + +---------------------------------------+ 24 + | always reserved 8*4=32 (previous GPRs)| + | according to the linkage convention | + | from AIX | + +---------------------------------------+ 56 + | our FPR area 13*8=104 | + | f1 | + | . | + | f13 | + +---------------------------------------+ 160 + | result area 8 | + +---------------------------------------+ 168 + | alignement to the next multiple of 16 | +SP current --> +---------------------------------------+ 176 <- parent frame + | back chain to caller 4 | + +---------------------------------------+ 180 + | saved CR 4 | + +---------------------------------------+ 184 + | saved LR 4 | + +---------------------------------------+ 188 + | reserved for compilers 4 | + +---------------------------------------+ 192 + | reserved for binders 4 | + +---------------------------------------+ 196 + | saved TOC pointer 4 | + +---------------------------------------+ 200 + | always reserved 8*4=32 we store our | + | GPRs here | + | r3 | + | . | + | r10 | + +---------------------------------------+ 232 + | overflow part | + +---------------------------------------+ xxx + | ???? | + +---------------------------------------+ xxx +*/ + +#if !defined(POWERPC_DARWIN) + +#define MIN_LINE_SIZE 32 + +static void +flush_icache( + char* addr) +{ +#ifndef _AIX + __asm__ volatile ( + "dcbf 0,%0\n" + "sync\n" + "icbi 0,%0\n" + "sync\n" + "isync" + : : "r" (addr) : "memory"); +#endif +} + +static void +flush_range( + char* addr, + int size) +{ + int i; + + for (i = 0; i < size; i += MIN_LINE_SIZE) + flush_icache(addr + i); + + flush_icache(addr + size - 1); +} + +#endif // !defined(POWERPC_DARWIN) + +ffi_status +ffi_prep_closure( + ffi_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif*, void*, void**, void*), + void* user_data) +{ + switch (cif->abi) + { + case FFI_DARWIN: + { + FFI_ASSERT (cif->abi == FFI_DARWIN); + + unsigned int* tramp = (unsigned int*)&closure->tramp[0]; + +#if defined(__ppc64__) + tramp[0] = 0x7c0802a6; // mflr r0 + tramp[1] = 0x429f0005; // bcl 20,31,+0x8 + tramp[2] = 0x7d6802a6; // mflr r11 + tramp[3] = 0x7c0803a6; // mtlr r0 + tramp[4] = 0xe98b0018; // ld r12,24(r11) + tramp[5] = 0x7d8903a6; // mtctr r12 + tramp[6] = 0xe96b0020; // ld r11,32(r11) + tramp[7] = 0x4e800420; // bctr + *(unsigned long*)&tramp[8] = (unsigned long)ffi_closure_ASM; + *(unsigned long*)&tramp[10] = (unsigned long)closure; +#elif defined(__ppc__) + tramp[0] = 0x7c0802a6; // mflr r0 + tramp[1] = 0x429f0005; // bcl 20,31,+0x8 + tramp[2] = 0x7d6802a6; // mflr r11 + tramp[3] = 0x7c0803a6; // mtlr r0 + tramp[4] = 0x818b0018; // lwz r12,24(r11) + tramp[5] = 0x7d8903a6; // mtctr r12 + tramp[6] = 0x816b001c; // lwz r11,28(r11) + tramp[7] = 0x4e800420; // bctr + tramp[8] = (unsigned long)ffi_closure_ASM; + tramp[9] = (unsigned long)closure; +#else +#error undefined architecture +#endif + + closure->cif = cif; + closure->fun = fun; + closure->user_data = user_data; + + // Flush the icache. Only necessary on Darwin. +#if defined(POWERPC_DARWIN) + sys_icache_invalidate(closure->tramp, FFI_TRAMPOLINE_SIZE); +#else + flush_range(closure->tramp, FFI_TRAMPOLINE_SIZE); +#endif + + break; + } + + case FFI_AIX: + { + FFI_ASSERT (cif->abi == FFI_AIX); + + ffi_aix_trampoline_struct* tramp_aix = + (ffi_aix_trampoline_struct*)(closure->tramp); + aix_fd* fd = (aix_fd*)(void*)ffi_closure_ASM; + + tramp_aix->code_pointer = fd->code_pointer; + tramp_aix->toc = fd->toc; + tramp_aix->static_chain = closure; + closure->cif = cif; + closure->fun = fun; + closure->user_data = user_data; + break; + } + + default: + return FFI_BAD_ABI; + } + + return FFI_OK; +} + +#if defined(__ppc__) + typedef double ldbits[2]; + + typedef union + { + ldbits lb; + long double ld; + } ldu; +#endif + +typedef union +{ + float f; + double d; +} ffi_dblfl; + +/* The trampoline invokes ffi_closure_ASM, and on entry, r11 holds the + address of the closure. After storing the registers that could possibly + contain parameters to be passed into the stack frame and setting up space + for a return value, ffi_closure_ASM invokes the following helper function + to do most of the work. */ +int +ffi_closure_helper_DARWIN( + ffi_closure* closure, + void* rvalue, + unsigned long* pgr, + ffi_dblfl* pfr) +{ + /* rvalue is the pointer to space for return value in closure assembly + pgr is the pointer to where r3-r10 are stored in ffi_closure_ASM + pfr is the pointer to where f1-f13 are stored in ffi_closure_ASM. */ + +#if defined(__ppc__) + ldu temp_ld; +#endif + + double temp; + unsigned int i; + unsigned int nf = 0; /* number of FPRs already used. */ + unsigned int ng = 0; /* number of GPRs already used. */ + ffi_cif* cif = closure->cif; + long avn = cif->nargs; + void** avalue = alloca(cif->nargs * sizeof(void*)); + ffi_type** arg_types = cif->arg_types; + + /* Copy the caller's structure return value address so that the closure + returns the data directly to the caller. */ +#if defined(__ppc64__) + if (cif->rtype->type == FFI_TYPE_STRUCT && + ffi64_stret_needs_ptr(cif->rtype, NULL, NULL)) +#elif defined(__ppc__) + if (cif->rtype->type == FFI_TYPE_STRUCT) +#else +#error undefined architecture +#endif + { + rvalue = (void*)*pgr; + pgr++; + ng++; + } + + /* Grab the addresses of the arguments from the stack frame. */ + for (i = 0; i < avn; i++) + { + switch (arg_types[i]->type) + { + case FFI_TYPE_SINT8: + case FFI_TYPE_UINT8: + avalue[i] = (char*)pgr + MODE_CHOICE(3,7); + ng++; + pgr++; + break; + + case FFI_TYPE_SINT16: + case FFI_TYPE_UINT16: + avalue[i] = (char*)pgr + MODE_CHOICE(2,6); + ng++; + pgr++; + break; + +#if defined(__ppc__) + case FFI_TYPE_POINTER: +#endif + case FFI_TYPE_SINT32: + case FFI_TYPE_UINT32: + avalue[i] = (char*)pgr + MODE_CHOICE(0,4); + ng++; + pgr++; + + break; + + case FFI_TYPE_STRUCT: + if (cif->abi == FFI_DARWIN) + { +#if defined(__ppc64__) + unsigned int gprSize = 0; + unsigned int fprSize = 0; + unsigned int savedFPRSize = fprSize; + + avalue[i] = alloca(arg_types[i]->size); + ffi64_struct_to_ram_form(arg_types[i], (const char*)pgr, + &gprSize, (const char*)pfr, &fprSize, &nf, avalue[i], NULL); + + ng += gprSize / sizeof(long); + pgr += gprSize / sizeof(long); + pfr += (fprSize - savedFPRSize) / sizeof(double); + +#elif defined(__ppc__) + /* Structures that match the basic modes (QI 1 byte, HI 2 bytes, + SI 4 bytes) are aligned as if they were those modes. */ + unsigned int size_al = size_al = arg_types[i]->size; + + /* If the first member of the struct is a double, then align + the struct to double-word. */ + if (arg_types[i]->elements[0]->type == FFI_TYPE_DOUBLE) + size_al = ALIGN(arg_types[i]->size, 8); + + if (size_al < 3) + avalue[i] = (void*)pgr + MODE_CHOICE(4,8) - size_al; + else + avalue[i] = (void*)pgr; + + ng += (size_al + 3) / sizeof(long); + pgr += (size_al + 3) / sizeof(long); +#else +#error undefined architecture +#endif + } + + break; + +#if defined(__ppc64__) + case FFI_TYPE_POINTER: +#endif + case FFI_TYPE_SINT64: + case FFI_TYPE_UINT64: + /* Long long ints are passed in 1 or 2 GPRs. */ + avalue[i] = pgr; + ng += MODE_CHOICE(2,1); + pgr += MODE_CHOICE(2,1); + + break; + + case FFI_TYPE_FLOAT: + /* A float value consumes a GPR. + There are 13 64-bit floating point registers. */ + if (nf < NUM_FPR_ARG_REGISTERS) + { + temp = pfr->d; + pfr->f = (float)temp; + avalue[i] = pfr; + pfr++; + } + else + avalue[i] = pgr; + + nf++; + ng++; + pgr++; + break; + + case FFI_TYPE_DOUBLE: + /* A double value consumes one or two GPRs. + There are 13 64bit floating point registers. */ + if (nf < NUM_FPR_ARG_REGISTERS) + { + avalue[i] = pfr; + pfr++; + } + else + avalue[i] = pgr; + + nf++; + ng += MODE_CHOICE(2,1); + pgr += MODE_CHOICE(2,1); + + break; + +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + + case FFI_TYPE_LONGDOUBLE: +#if defined(__ppc64__) + if (nf < NUM_FPR_ARG_REGISTERS) + { + avalue[i] = pfr; + pfr += 2; + } +#elif defined(__ppc__) + /* A long double value consumes 2/4 GPRs and 2 FPRs. + There are 13 64bit floating point registers. */ + if (nf < NUM_FPR_ARG_REGISTERS - 1) + { + avalue[i] = pfr; + pfr += 2; + } + /* Here we have the situation where one part of the long double + is stored in fpr13 and the other part is already on the stack. + We use a union to pass the long double to avalue[i]. */ + else if (nf == NUM_FPR_ARG_REGISTERS - 1) + { + memcpy (&temp_ld.lb[0], pfr, sizeof(temp_ld.lb[0])); + memcpy (&temp_ld.lb[1], pgr + 2, sizeof(temp_ld.lb[1])); + avalue[i] = &temp_ld.ld; + } +#else +#error undefined architecture +#endif + else + avalue[i] = pgr; + + nf += 2; + ng += MODE_CHOICE(4,2); + pgr += MODE_CHOICE(4,2); + + break; + +#endif /* FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE */ + + default: + FFI_ASSERT(0); + break; + } + } + + (closure->fun)(cif, rvalue, avalue, closure->user_data); + + /* Tell ffi_closure_ASM to perform return type promotions. */ + return cif->rtype->type; +} + +#if defined(__ppc64__) + +/* ffi64_struct_to_ram_form + + Rebuild a struct's natural layout from buffers of concatenated registers. + Return the number of registers used. + inGPRs[0-7] == r3, inFPRs[0-7] == f1 ... +*/ +void +ffi64_struct_to_ram_form( + const ffi_type* inType, + const char* inGPRs, + unsigned int* ioGPRMarker, + const char* inFPRs, + unsigned int* ioFPRMarker, + unsigned int* ioFPRsUsed, + char* outStruct, // caller-allocated + unsigned int* ioStructMarker) +{ + unsigned int srcGMarker = 0; + unsigned int srcFMarker = 0; + unsigned int savedFMarker = 0; + unsigned int fprsUsed = 0; + unsigned int savedFPRsUsed = 0; + unsigned int destMarker = 0; + + static unsigned int recurseCount = 0; + + if (ioGPRMarker) + srcGMarker = *ioGPRMarker; + + if (ioFPRMarker) + { + srcFMarker = *ioFPRMarker; + savedFMarker = srcFMarker; + } + + if (ioFPRsUsed) + { + fprsUsed = *ioFPRsUsed; + savedFPRsUsed = fprsUsed; + } + + if (ioStructMarker) + destMarker = *ioStructMarker; + + size_t i; + + switch (inType->size) + { + case 1: case 2: case 4: + srcGMarker += 8 - inType->size; + break; + + default: + break; + } + + for (i = 0; inType->elements[i] != NULL; i++) + { + switch (inType->elements[i]->type) + { + case FFI_TYPE_FLOAT: + srcFMarker = ALIGN(srcFMarker, 4); + srcGMarker = ALIGN(srcGMarker, 4); + destMarker = ALIGN(destMarker, 4); + + if (fprsUsed < NUM_FPR_ARG_REGISTERS) + { + *(float*)&outStruct[destMarker] = + (float)*(double*)&inFPRs[srcFMarker]; + srcFMarker += 8; + fprsUsed++; + } + else + *(float*)&outStruct[destMarker] = + (float)*(double*)&inGPRs[srcGMarker]; + + srcGMarker += 4; + destMarker += 4; + + // Skip to next GPR if next element won't fit and we're + // not already at a register boundary. + if (inType->elements[i + 1] != NULL && (destMarker % 8)) + { + if (!FFI_TYPE_1_BYTE(inType->elements[i + 1]->type) && + (!FFI_TYPE_2_BYTE(inType->elements[i + 1]->type) || + (ALIGN(srcGMarker, 8) - srcGMarker) < 2) && + (!FFI_TYPE_4_BYTE(inType->elements[i + 1]->type) || + (ALIGN(srcGMarker, 8) - srcGMarker) < 4)) + srcGMarker = ALIGN(srcGMarker, 8); + } + + break; + + case FFI_TYPE_DOUBLE: + srcFMarker = ALIGN(srcFMarker, 8); + destMarker = ALIGN(destMarker, 8); + + if (fprsUsed < NUM_FPR_ARG_REGISTERS) + { + *(double*)&outStruct[destMarker] = + *(double*)&inFPRs[srcFMarker]; + srcFMarker += 8; + fprsUsed++; + } + else + *(double*)&outStruct[destMarker] = + *(double*)&inGPRs[srcGMarker]; + + destMarker += 8; + + // Skip next GPR + srcGMarker += 8; + srcGMarker = ALIGN(srcGMarker, 8); + + break; + + case FFI_TYPE_LONGDOUBLE: + destMarker = ALIGN(destMarker, 16); + + if (fprsUsed < NUM_FPR_ARG_REGISTERS) + { + srcFMarker = ALIGN(srcFMarker, 8); + srcGMarker = ALIGN(srcGMarker, 8); + *(long double*)&outStruct[destMarker] = + *(long double*)&inFPRs[srcFMarker]; + srcFMarker += 16; + fprsUsed += 2; + } + else + { + srcFMarker = ALIGN(srcFMarker, 16); + srcGMarker = ALIGN(srcGMarker, 16); + *(long double*)&outStruct[destMarker] = + *(long double*)&inGPRs[srcGMarker]; + } + + destMarker += 16; + + // Skip next 2 GPRs + srcGMarker += 16; + srcGMarker = ALIGN(srcGMarker, 8); + + break; + + case FFI_TYPE_UINT8: + case FFI_TYPE_SINT8: + { + if (inType->alignment == 1) // chars only + { + if (inType->size == 1) + outStruct[destMarker++] = inGPRs[srcGMarker++]; + else if (inType->size == 2) + { + outStruct[destMarker++] = inGPRs[srcGMarker++]; + outStruct[destMarker++] = inGPRs[srcGMarker++]; + i++; + } + else + { + memcpy(&outStruct[destMarker], + &inGPRs[srcGMarker], inType->size); + srcGMarker += inType->size; + destMarker += inType->size; + i += inType->size - 1; + } + } + else // chars and other stuff + { + outStruct[destMarker++] = inGPRs[srcGMarker++]; + + // Skip to next GPR if next element won't fit and we're + // not already at a register boundary. + if (inType->elements[i + 1] != NULL && (srcGMarker % 8)) + { + if (!FFI_TYPE_1_BYTE(inType->elements[i + 1]->type) && + (!FFI_TYPE_2_BYTE(inType->elements[i + 1]->type) || + (ALIGN(srcGMarker, 8) - srcGMarker) < 2) && + (!FFI_TYPE_4_BYTE(inType->elements[i + 1]->type) || + (ALIGN(srcGMarker, 8) - srcGMarker) < 4)) + srcGMarker = ALIGN(srcGMarker, inType->alignment); // was 8 + } + } + + break; + } + + case FFI_TYPE_UINT16: + case FFI_TYPE_SINT16: + srcGMarker = ALIGN(srcGMarker, 2); + destMarker = ALIGN(destMarker, 2); + + *(short*)&outStruct[destMarker] = + *(short*)&inGPRs[srcGMarker]; + srcGMarker += 2; + destMarker += 2; + + break; + + case FFI_TYPE_INT: + case FFI_TYPE_UINT32: + case FFI_TYPE_SINT32: + srcGMarker = ALIGN(srcGMarker, 4); + destMarker = ALIGN(destMarker, 4); + + *(int*)&outStruct[destMarker] = + *(int*)&inGPRs[srcGMarker]; + srcGMarker += 4; + destMarker += 4; + + break; + + case FFI_TYPE_POINTER: + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + srcGMarker = ALIGN(srcGMarker, 8); + destMarker = ALIGN(destMarker, 8); + + *(long long*)&outStruct[destMarker] = + *(long long*)&inGPRs[srcGMarker]; + srcGMarker += 8; + destMarker += 8; + + break; + + case FFI_TYPE_STRUCT: + recurseCount++; + ffi64_struct_to_ram_form(inType->elements[i], inGPRs, + &srcGMarker, inFPRs, &srcFMarker, &fprsUsed, + outStruct, &destMarker); + recurseCount--; + break; + + default: + FFI_ASSERT(0); // unknown element type + break; + } + } + + srcGMarker = ALIGN(srcGMarker, inType->alignment); + + // Take care of the special case for 16-byte structs, but not for + // nested structs. + if (recurseCount == 0 && srcGMarker == 16) + { + *(long double*)&outStruct[0] = *(long double*)&inGPRs[0]; + srcFMarker = savedFMarker; + fprsUsed = savedFPRsUsed; + } + + if (ioGPRMarker) + *ioGPRMarker = ALIGN(srcGMarker, 8); + + if (ioFPRMarker) + *ioFPRMarker = srcFMarker; + + if (ioFPRsUsed) + *ioFPRsUsed = fprsUsed; + + if (ioStructMarker) + *ioStructMarker = ALIGN(destMarker, 8); +} + +/* ffi64_struct_to_reg_form + + Copy a struct's elements into buffers that can be sliced into registers. + Return the sizes of the output buffers in bytes. Pass NULL buffer pointers + to calculate size only. + outGPRs[0-7] == r3, outFPRs[0-7] == f1 ... +*/ +void +ffi64_struct_to_reg_form( + const ffi_type* inType, + const char* inStruct, + unsigned int* ioStructMarker, + unsigned int* ioFPRsUsed, + char* outGPRs, // caller-allocated + unsigned int* ioGPRSize, + char* outFPRs, // caller-allocated + unsigned int* ioFPRSize) +{ + size_t i; + unsigned int srcMarker = 0; + unsigned int destGMarker = 0; + unsigned int destFMarker = 0; + unsigned int savedFMarker = 0; + unsigned int fprsUsed = 0; + unsigned int savedFPRsUsed = 0; + + static unsigned int recurseCount = 0; + + if (ioStructMarker) + srcMarker = *ioStructMarker; + + if (ioFPRsUsed) + { + fprsUsed = *ioFPRsUsed; + savedFPRsUsed = fprsUsed; + } + + if (ioGPRSize) + destGMarker = *ioGPRSize; + + if (ioFPRSize) + { + destFMarker = *ioFPRSize; + savedFMarker = destFMarker; + } + + switch (inType->size) + { + case 1: case 2: case 4: + destGMarker += 8 - inType->size; + break; + + default: + break; + } + + for (i = 0; inType->elements[i] != NULL; i++) + { + switch (inType->elements[i]->type) + { + // Shadow floating-point types in GPRs for vararg and pre-ANSI + // functions. + case FFI_TYPE_FLOAT: + // Nudge markers to next 4/8-byte boundary + srcMarker = ALIGN(srcMarker, 4); + destGMarker = ALIGN(destGMarker, 4); + destFMarker = ALIGN(destFMarker, 8); + + if (fprsUsed < NUM_FPR_ARG_REGISTERS) + { + if (outFPRs != NULL && inStruct != NULL) + *(double*)&outFPRs[destFMarker] = + (double)*(float*)&inStruct[srcMarker]; + + destFMarker += 8; + fprsUsed++; + } + + if (outGPRs != NULL && inStruct != NULL) + *(double*)&outGPRs[destGMarker] = + (double)*(float*)&inStruct[srcMarker]; + + srcMarker += 4; + destGMarker += 4; + + // Skip to next GPR if next element won't fit and we're + // not already at a register boundary. + if (inType->elements[i + 1] != NULL && (srcMarker % 8)) + { + if (!FFI_TYPE_1_BYTE(inType->elements[i + 1]->type) && + (!FFI_TYPE_2_BYTE(inType->elements[i + 1]->type) || + (ALIGN(destGMarker, 8) - destGMarker) < 2) && + (!FFI_TYPE_4_BYTE(inType->elements[i + 1]->type) || + (ALIGN(destGMarker, 8) - destGMarker) < 4)) + destGMarker = ALIGN(destGMarker, 8); + } + + break; + + case FFI_TYPE_DOUBLE: + srcMarker = ALIGN(srcMarker, 8); + destFMarker = ALIGN(destFMarker, 8); + + if (fprsUsed < NUM_FPR_ARG_REGISTERS) + { + if (outFPRs != NULL && inStruct != NULL) + *(double*)&outFPRs[destFMarker] = + *(double*)&inStruct[srcMarker]; + + destFMarker += 8; + fprsUsed++; + } + + if (outGPRs != NULL && inStruct != NULL) + *(double*)&outGPRs[destGMarker] = + *(double*)&inStruct[srcMarker]; + + srcMarker += 8; + + // Skip next GPR + destGMarker += 8; + destGMarker = ALIGN(destGMarker, 8); + + break; + + case FFI_TYPE_LONGDOUBLE: + srcMarker = ALIGN(srcMarker, 16); + + if (fprsUsed < NUM_FPR_ARG_REGISTERS) + { + destFMarker = ALIGN(destFMarker, 8); + destGMarker = ALIGN(destGMarker, 8); + + if (outFPRs != NULL && inStruct != NULL) + *(long double*)&outFPRs[destFMarker] = + *(long double*)&inStruct[srcMarker]; + + if (outGPRs != NULL && inStruct != NULL) + *(long double*)&outGPRs[destGMarker] = + *(long double*)&inStruct[srcMarker]; + + destFMarker += 16; + fprsUsed += 2; + } + else + { + destGMarker = ALIGN(destGMarker, 16); + + if (outGPRs != NULL && inStruct != NULL) + *(long double*)&outGPRs[destGMarker] = + *(long double*)&inStruct[srcMarker]; + } + + srcMarker += 16; + destGMarker += 16; // Skip next 2 GPRs + destGMarker = ALIGN(destGMarker, 8); // was 16 + + break; + + case FFI_TYPE_UINT8: + case FFI_TYPE_SINT8: + if (inType->alignment == 1) // bytes only + { + if (inType->size == 1) + { + if (outGPRs != NULL && inStruct != NULL) + outGPRs[destGMarker] = inStruct[srcMarker]; + + srcMarker++; + destGMarker++; + } + else if (inType->size == 2) + { + if (outGPRs != NULL && inStruct != NULL) + { + outGPRs[destGMarker] = inStruct[srcMarker]; + outGPRs[destGMarker + 1] = inStruct[srcMarker + 1]; + } + + srcMarker += 2; + destGMarker += 2; + + i++; + } + else + { + if (outGPRs != NULL && inStruct != NULL) + { + // Avoid memcpy for small chunks. + if (inType->size <= sizeof(long)) + *(long*)&outGPRs[destGMarker] = + *(long*)&inStruct[srcMarker]; + else + memcpy(&outGPRs[destGMarker], + &inStruct[srcMarker], inType->size); + } + + srcMarker += inType->size; + destGMarker += inType->size; + i += inType->size - 1; + } + } + else // bytes and other stuff + { + if (outGPRs != NULL && inStruct != NULL) + outGPRs[destGMarker] = inStruct[srcMarker]; + + srcMarker++; + destGMarker++; + + // Skip to next GPR if next element won't fit and we're + // not already at a register boundary. + if (inType->elements[i + 1] != NULL && (destGMarker % 8)) + { + if (!FFI_TYPE_1_BYTE(inType->elements[i + 1]->type) && + (!FFI_TYPE_2_BYTE(inType->elements[i + 1]->type) || + (ALIGN(destGMarker, 8) - destGMarker) < 2) && + (!FFI_TYPE_4_BYTE(inType->elements[i + 1]->type) || + (ALIGN(destGMarker, 8) - destGMarker) < 4)) + destGMarker = ALIGN(destGMarker, inType->alignment); // was 8 + } + } + + break; + + case FFI_TYPE_UINT16: + case FFI_TYPE_SINT16: + srcMarker = ALIGN(srcMarker, 2); + destGMarker = ALIGN(destGMarker, 2); + + if (outGPRs != NULL && inStruct != NULL) + *(short*)&outGPRs[destGMarker] = + *(short*)&inStruct[srcMarker]; + + srcMarker += 2; + destGMarker += 2; + + if (inType->elements[i + 1] == NULL) + destGMarker = ALIGN(destGMarker, inType->alignment); + + break; + + case FFI_TYPE_INT: + case FFI_TYPE_UINT32: + case FFI_TYPE_SINT32: + srcMarker = ALIGN(srcMarker, 4); + destGMarker = ALIGN(destGMarker, 4); + + if (outGPRs != NULL && inStruct != NULL) + *(int*)&outGPRs[destGMarker] = + *(int*)&inStruct[srcMarker]; + + srcMarker += 4; + destGMarker += 4; + + break; + + case FFI_TYPE_POINTER: + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + srcMarker = ALIGN(srcMarker, 8); + destGMarker = ALIGN(destGMarker, 8); + + if (outGPRs != NULL && inStruct != NULL) + *(long long*)&outGPRs[destGMarker] = + *(long long*)&inStruct[srcMarker]; + + srcMarker += 8; + destGMarker += 8; + + if (inType->elements[i + 1] == NULL) + destGMarker = ALIGN(destGMarker, inType->alignment); + + break; + + case FFI_TYPE_STRUCT: + recurseCount++; + ffi64_struct_to_reg_form(inType->elements[i], + inStruct, &srcMarker, &fprsUsed, outGPRs, + &destGMarker, outFPRs, &destFMarker); + recurseCount--; + break; + + default: + FFI_ASSERT(0); + break; + } + } + + destGMarker = ALIGN(destGMarker, inType->alignment); + + // Take care of the special case for 16-byte structs, but not for + // nested structs. + if (recurseCount == 0 && destGMarker == 16) + { + if (outGPRs != NULL && inStruct != NULL) + *(long double*)&outGPRs[0] = *(long double*)&inStruct[0]; + + destFMarker = savedFMarker; + fprsUsed = savedFPRsUsed; + } + + if (ioStructMarker) + *ioStructMarker = ALIGN(srcMarker, 8); + + if (ioFPRsUsed) + *ioFPRsUsed = fprsUsed; + + if (ioGPRSize) + *ioGPRSize = ALIGN(destGMarker, 8); + + if (ioFPRSize) + *ioFPRSize = ALIGN(destFMarker, 8); +} + +/* ffi64_stret_needs_ptr + + Determine whether a returned struct needs a pointer in r3 or can fit + in registers. +*/ + +bool +ffi64_stret_needs_ptr( + const ffi_type* inType, + unsigned short* ioGPRCount, + unsigned short* ioFPRCount) +{ + // Obvious case first- struct is larger than combined FPR size. + if (inType->size > 14 * 8) + return true; + + // Now the struct can physically fit in registers, determine if it + // also fits logically. + bool needsPtr = false; + unsigned short gprsUsed = 0; + unsigned short fprsUsed = 0; + size_t i; + + if (ioGPRCount) + gprsUsed = *ioGPRCount; + + if (ioFPRCount) + fprsUsed = *ioFPRCount; + + for (i = 0; inType->elements[i] != NULL && !needsPtr; i++) + { + switch (inType->elements[i]->type) + { + case FFI_TYPE_FLOAT: + case FFI_TYPE_DOUBLE: + gprsUsed++; + fprsUsed++; + + if (fprsUsed > 13) + needsPtr = true; + + break; + + case FFI_TYPE_LONGDOUBLE: + gprsUsed += 2; + fprsUsed += 2; + + if (fprsUsed > 14) + needsPtr = true; + + break; + + case FFI_TYPE_UINT8: + case FFI_TYPE_SINT8: + { + gprsUsed++; + + if (gprsUsed > 8) + { + needsPtr = true; + break; + } + + if (inType->elements[i + 1] == NULL) // last byte in the struct + break; + + // Count possible contiguous bytes ahead, up to 8. + unsigned short j; + + for (j = 1; j < 8; j++) + { + if (inType->elements[i + j] == NULL || + !FFI_TYPE_1_BYTE(inType->elements[i + j]->type)) + break; + } + + i += j - 1; // allow for i++ before the test condition + + break; + } + + case FFI_TYPE_UINT16: + case FFI_TYPE_SINT16: + case FFI_TYPE_INT: + case FFI_TYPE_UINT32: + case FFI_TYPE_SINT32: + case FFI_TYPE_POINTER: + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + gprsUsed++; + + if (gprsUsed > 8) + needsPtr = true; + + break; + + case FFI_TYPE_STRUCT: + needsPtr = ffi64_stret_needs_ptr( + inType->elements[i], &gprsUsed, &fprsUsed); + + break; + + default: + FFI_ASSERT(0); + break; + } + } + + if (ioGPRCount) + *ioGPRCount = gprsUsed; + + if (ioFPRCount) + *ioFPRCount = fprsUsed; + + return needsPtr; +} + +/* ffi64_data_size + + Calculate the size in bytes of an ffi type. +*/ + +unsigned int +ffi64_data_size( + const ffi_type* inType) +{ + unsigned int size = 0; + + switch (inType->type) + { + case FFI_TYPE_UINT8: + case FFI_TYPE_SINT8: + size = 1; + break; + + case FFI_TYPE_UINT16: + case FFI_TYPE_SINT16: + size = 2; + break; + + case FFI_TYPE_INT: + case FFI_TYPE_UINT32: + case FFI_TYPE_SINT32: + case FFI_TYPE_FLOAT: + size = 4; + break; + + case FFI_TYPE_POINTER: + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + case FFI_TYPE_DOUBLE: + size = 8; + break; + + case FFI_TYPE_LONGDOUBLE: + size = 16; + break; + + case FFI_TYPE_STRUCT: + ffi64_struct_to_reg_form( + inType, NULL, NULL, NULL, NULL, &size, NULL, NULL); + break; + + case FFI_TYPE_VOID: + break; + + default: + FFI_ASSERT(0); + break; + } + + return size; +} + +#endif /* defined(__ppc64__) */ +#endif /* __ppc__ || __ppc64__ */ diff -r -u ./Modules/_ctypes/libffi_osx/powerpc/ppc64-darwin_closure.S ./Modules/_ctypes/libffi_osx/powerpc/ppc64-darwin_closure.S new file mode 100644 index 0000000..7162fa1 --- /dev/null +++ ./Modules/_ctypes/libffi_osx/powerpc/ppc64-darwin_closure.S @@ -0,0 +1,418 @@ +#if defined(__ppc64__) + +/* ----------------------------------------------------------------------- + ppc64-darwin_closure.S - Copyright (c) 2002, 2003, 2004, Free Software Foundation, + Inc. based on ppc_closure.S + + PowerPC Assembly glue. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#define LIBFFI_ASM + +#include +#include // for FFI_TRAMPOLINE_SIZE +#include +#include + + .file "ppc64-darwin_closure.S" +.text + .align LOG2_GPR_BYTES + .globl _ffi_closure_ASM + +.text + .align LOG2_GPR_BYTES + +_ffi_closure_ASM: +LFB1: + mflr r0 + stg r0,SF_RETURN(r1) // save return address + + // Save GPRs 3 - 10 (aligned to 8) in the parents outgoing area. + stg r3,SF_ARG1(r1) + stg r4,SF_ARG2(r1) + stg r5,SF_ARG3(r1) + stg r6,SF_ARG4(r1) + stg r7,SF_ARG5(r1) + stg r8,SF_ARG6(r1) + stg r9,SF_ARG7(r1) + stg r10,SF_ARG8(r1) + +LCFI0: +/* 48 bytes (Linkage Area) + 64 bytes (outgoing parameter area, always reserved) + 112 bytes (14*8 for incoming FPR) + ? bytes (result) + 112 bytes (14*8 for outgoing FPR) + 16 bytes (2 saved registers) + 352 + ? total bytes +*/ + + std r31,-8(r1) // Save registers we use. + std r30,-16(r1) + mr r30,r1 // Save the old SP. + mr r31,r11 // Save the ffi_closure around ffi64_data_size. + + // Calculate the space we need. + stdu r1,-SF_MINSIZE(r1) + ld r3,FFI_TRAMPOLINE_SIZE(r31) // ffi_closure->cif* + ld r3,16(r3) // ffi_cif->rtype* + bl Lffi64_data_size$stub + ld r1,0(r1) + + addi r3,r3,352 // Add our overhead. + neg r3,r3 + li r0,-32 // Align to 32 bytes. + and r3,r3,r0 + stdux r1,r1,r3 // Grow the stack. + + mr r11,r31 // Copy the ffi_closure back. + +LCFI1: + // We want to build up an area for the parameters passed + // in registers. (both floating point and integer) + +/* 320 bytes (callee stack frame aligned to 32) + 48 bytes (caller linkage area) + 368 (start of caller parameter area aligned to 8) +*/ + + // Save FPRs 1 - 14. (aligned to 8) + stfd f1,112(r1) + stfd f2,120(r1) + stfd f3,128(r1) + stfd f4,136(r1) + stfd f5,144(r1) + stfd f6,152(r1) + stfd f7,160(r1) + stfd f8,168(r1) + stfd f9,176(r1) + stfd f10,184(r1) + stfd f11,192(r1) + stfd f12,200(r1) + stfd f13,208(r1) + stfd f14,216(r1) + + // Set up registers for the routine that actually does the work. + mr r3,r11 // context pointer from the trampoline + addi r4,r1,224 // result storage + addi r5,r30,SF_ARG1 // saved GPRs + addi r6,r1,112 // saved FPRs + bl Lffi_closure_helper_DARWIN$stub + + // Look the proper starting point in table + // by using return type as an offset. + addi r5,r1,224 // Get pointer to results area. + bl Lget_ret_type0_addr // Get pointer to Lret_type0 into LR. + mflr r4 // Move to r4. + slwi r3,r3,4 // Now multiply return type by 16. + add r3,r3,r4 // Add contents of table to table address. + mtctr r3 + bctr + +LFE1: + // Each of the ret_typeX code fragments has to be exactly 16 bytes long + // (4 instructions). For cache effectiveness we align to a 16 byte + // boundary first. + .align 4 + nop + nop + nop + +Lget_ret_type0_addr: + blrl + +// case FFI_TYPE_VOID +Lret_type0: + b Lfinish + nop + nop + nop + +// case FFI_TYPE_INT +Lret_type1: + lwz r3,4(r5) + b Lfinish + nop + nop + +// case FFI_TYPE_FLOAT +Lret_type2: + lfs f1,0(r5) + b Lfinish + nop + nop + +// case FFI_TYPE_DOUBLE +Lret_type3: + lfd f1,0(r5) + b Lfinish + nop + nop + +// case FFI_TYPE_LONGDOUBLE +Lret_type4: + lfd f1,0(r5) + lfd f2,8(r5) + b Lfinish + nop + +// case FFI_TYPE_UINT8 +Lret_type5: + lbz r3,7(r5) + b Lfinish + nop + nop + +// case FFI_TYPE_SINT8 +Lret_type6: + lbz r3,7(r5) + extsb r3,r3 + b Lfinish + nop + +// case FFI_TYPE_UINT16 +Lret_type7: + lhz r3,6(r5) + b Lfinish + nop + nop + +// case FFI_TYPE_SINT16 +Lret_type8: + lha r3,6(r5) + b Lfinish + nop + nop + +// case FFI_TYPE_UINT32 +Lret_type9: // same as Lret_type1 + lwz r3,4(r5) + b Lfinish + nop + nop + +// case FFI_TYPE_SINT32 +Lret_type10: // same as Lret_type1 + lwz r3,4(r5) + b Lfinish + nop + nop + +// case FFI_TYPE_UINT64 +Lret_type11: + ld r3,0(r5) + b Lfinish + nop + nop + +// case FFI_TYPE_SINT64 +Lret_type12: // same as Lret_type11 + ld r3,0(r5) + b Lfinish + nop + nop + +// case FFI_TYPE_STRUCT +Lret_type13: + b Lret_struct + nop + nop + nop + +// ** End 16-byte aligned cases ** +// case FFI_TYPE_POINTER +// This case assumes that FFI_TYPE_POINTER == FFI_TYPE_LAST. If more types +// are added in future, the following code will need to be updated and +// padded to 16 bytes. +Lret_type14: + lg r3,0(r5) + b Lfinish + +// copy struct into registers +Lret_struct: + ld r31,FFI_TRAMPOLINE_SIZE(r31) // ffi_closure->cif* + ld r3,16(r31) // ffi_cif->rtype* + ld r31,24(r31) // ffi_cif->flags + mr r4,r5 // copy struct* to 2nd arg + addi r7,r1,SF_ARG9 // GPR return area + addi r9,r30,-16-(14*8) // FPR return area + li r5,0 // struct offset ptr (NULL) + li r6,0 // FPR used count ptr (NULL) + li r8,0 // GPR return area size ptr (NULL) + li r10,0 // FPR return area size ptr (NULL) + bl Lffi64_struct_to_reg_form$stub + + // Load GPRs + ld r3,SF_ARG9(r1) + ld r4,SF_ARG10(r1) + ld r5,SF_ARG11(r1) + ld r6,SF_ARG12(r1) + nop + ld r7,SF_ARG13(r1) + ld r8,SF_ARG14(r1) + ld r9,SF_ARG15(r1) + ld r10,SF_ARG16(r1) + nop + + // Load FPRs + mtcrf 0x2,r31 + bf 26,Lfinish + lfd f1,-16-(14*8)(r30) + lfd f2,-16-(13*8)(r30) + lfd f3,-16-(12*8)(r30) + lfd f4,-16-(11*8)(r30) + nop + lfd f5,-16-(10*8)(r30) + lfd f6,-16-(9*8)(r30) + lfd f7,-16-(8*8)(r30) + lfd f8,-16-(7*8)(r30) + nop + lfd f9,-16-(6*8)(r30) + lfd f10,-16-(5*8)(r30) + lfd f11,-16-(4*8)(r30) + lfd f12,-16-(3*8)(r30) + nop + lfd f13,-16-(2*8)(r30) + lfd f14,-16-(1*8)(r30) + // Fall through + +// case done +Lfinish: + lg r1,0(r1) // Restore stack pointer. + ld r31,-8(r1) // Restore registers we used. + ld r30,-16(r1) + lg r0,SF_RETURN(r1) // Get return address. + mtlr r0 // Reset link register. + blr + +// END(ffi_closure_ASM) + +.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support +EH_frame1: + .set L$set$0,LECIE1-LSCIE1 + .long L$set$0 ; Length of Common Information Entry +LSCIE1: + .long 0x0 ; CIE Identifier Tag + .byte 0x1 ; CIE Version + .ascii "zR\0" ; CIE Augmentation + .byte 0x1 ; uleb128 0x1; CIE Code Alignment Factor + .byte 0x7c ; sleb128 -4; CIE Data Alignment Factor + .byte 0x41 ; CIE RA Column + .byte 0x1 ; uleb128 0x1; Augmentation size + .byte 0x10 ; FDE Encoding (pcrel) + .byte 0xc ; DW_CFA_def_cfa + .byte 0x1 ; uleb128 0x1 + .byte 0x0 ; uleb128 0x0 + .align LOG2_GPR_BYTES +LECIE1: +.globl _ffi_closure_ASM.eh +_ffi_closure_ASM.eh: +LSFDE1: + .set L$set$1,LEFDE1-LASFDE1 + .long L$set$1 ; FDE Length + +LASFDE1: + .long LASFDE1-EH_frame1 ; FDE CIE offset + .g_long LFB1-. ; FDE initial location + .set L$set$3,LFE1-LFB1 + .g_long L$set$3 ; FDE address range + .byte 0x0 ; uleb128 0x0; Augmentation size + .byte 0x4 ; DW_CFA_advance_loc4 + .set L$set$3,LCFI1-LCFI0 + .long L$set$3 + .byte 0xe ; DW_CFA_def_cfa_offset + .byte 176,1 ; uleb128 176 + .byte 0x4 ; DW_CFA_advance_loc4 + .set L$set$4,LCFI0-LFB1 + .long L$set$4 + .byte 0x11 ; DW_CFA_offset_extended_sf + .byte 0x41 ; uleb128 0x41 + .byte 0x7e ; sleb128 -2 + .align LOG2_GPR_BYTES + +LEFDE1: +.data + .align LOG2_GPR_BYTES +LDFCM0: +.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 + .align LOG2_GPR_BYTES + +Lffi_closure_helper_DARWIN$stub: + .indirect_symbol _ffi_closure_helper_DARWIN + mflr r0 + bcl 20,31,LO$ffi_closure_helper_DARWIN + +LO$ffi_closure_helper_DARWIN: + mflr r11 + addis r11,r11,ha16(L_ffi_closure_helper_DARWIN$lazy_ptr - LO$ffi_closure_helper_DARWIN) + mtlr r0 + lgu r12,lo16(L_ffi_closure_helper_DARWIN$lazy_ptr - LO$ffi_closure_helper_DARWIN)(r11) + mtctr r12 + bctr + +.lazy_symbol_pointer +L_ffi_closure_helper_DARWIN$lazy_ptr: + .indirect_symbol _ffi_closure_helper_DARWIN + .g_long dyld_stub_binding_helper + +.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 + .align LOG2_GPR_BYTES + +Lffi64_struct_to_reg_form$stub: + .indirect_symbol _ffi64_struct_to_reg_form + mflr r0 + bcl 20,31,LO$ffi64_struct_to_reg_form + +LO$ffi64_struct_to_reg_form: + mflr r11 + addis r11,r11,ha16(L_ffi64_struct_to_reg_form$lazy_ptr - LO$ffi64_struct_to_reg_form) + mtlr r0 + lgu r12,lo16(L_ffi64_struct_to_reg_form$lazy_ptr - LO$ffi64_struct_to_reg_form)(r11) + mtctr r12 + bctr + +.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 + .align LOG2_GPR_BYTES + +Lffi64_data_size$stub: + .indirect_symbol _ffi64_data_size + mflr r0 + bcl 20,31,LO$ffi64_data_size + +LO$ffi64_data_size: + mflr r11 + addis r11,r11,ha16(L_ffi64_data_size$lazy_ptr - LO$ffi64_data_size) + mtlr r0 + lgu r12,lo16(L_ffi64_data_size$lazy_ptr - LO$ffi64_data_size)(r11) + mtctr r12 + bctr + +.lazy_symbol_pointer +L_ffi64_struct_to_reg_form$lazy_ptr: + .indirect_symbol _ffi64_struct_to_reg_form + .g_long dyld_stub_binding_helper + +L_ffi64_data_size$lazy_ptr: + .indirect_symbol _ffi64_data_size + .g_long dyld_stub_binding_helper + +#endif // __ppc64__ diff -r -u ./Modules/_ctypes/libffi_osx/types.c ./Modules/_ctypes/libffi_osx/types.c new file mode 100644 index 0000000..44806ae --- /dev/null +++ ./Modules/_ctypes/libffi_osx/types.c @@ -0,0 +1,115 @@ +/* ----------------------------------------------------------------------- + types.c - Copyright (c) 1996, 1998 Red Hat, Inc. + + Predefined ffi_types needed by libffi. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#include +#include + +/* Type definitions */ +#define FFI_INTEGRAL_TYPEDEF(n, s, a, t) \ + ffi_type ffi_type_##n = { s, a, t, NULL } +#define FFI_AGGREGATE_TYPEDEF(n, e) \ + ffi_type ffi_type_##n = { 0, 0, FFI_TYPE_STRUCT, e } + +FFI_INTEGRAL_TYPEDEF(uint8, 1, 1, FFI_TYPE_UINT8); +FFI_INTEGRAL_TYPEDEF(sint8, 1, 1, FFI_TYPE_SINT8); +FFI_INTEGRAL_TYPEDEF(uint16, 2, 2, FFI_TYPE_UINT16); +FFI_INTEGRAL_TYPEDEF(sint16, 2, 2, FFI_TYPE_SINT16); +FFI_INTEGRAL_TYPEDEF(uint32, 4, 4, FFI_TYPE_UINT32); +FFI_INTEGRAL_TYPEDEF(sint32, 4, 4, FFI_TYPE_SINT32); +FFI_INTEGRAL_TYPEDEF(float, 4, 4, FFI_TYPE_FLOAT); + +/* Size and alignment are fake here. They must not be 0. */ +FFI_INTEGRAL_TYPEDEF(void, 1, 1, FFI_TYPE_VOID); + +#if defined ALPHA || defined SPARC64 || defined X86_64 || \ + defined S390X || defined IA64 || defined POWERPC64 +FFI_INTEGRAL_TYPEDEF(pointer, 8, 8, FFI_TYPE_POINTER); +#else +FFI_INTEGRAL_TYPEDEF(pointer, 4, 4, FFI_TYPE_POINTER); +#endif + +#if defined X86 || defined ARM || defined M68K || defined(X86_DARWIN) + +# ifdef X86_64 + FFI_INTEGRAL_TYPEDEF(uint64, 8, 8, FFI_TYPE_UINT64); + FFI_INTEGRAL_TYPEDEF(sint64, 8, 8, FFI_TYPE_SINT64); +# else + FFI_INTEGRAL_TYPEDEF(uint64, 8, 4, FFI_TYPE_UINT64); + FFI_INTEGRAL_TYPEDEF(sint64, 8, 4, FFI_TYPE_SINT64); +# endif + +#elif defined(POWERPC_DARWIN) +FFI_INTEGRAL_TYPEDEF(uint64, 8, 8, FFI_TYPE_UINT64); +FFI_INTEGRAL_TYPEDEF(sint64, 8, 8, FFI_TYPE_SINT64); +#elif defined SH +FFI_INTEGRAL_TYPEDEF(uint64, 8, 4, FFI_TYPE_UINT64); +FFI_INTEGRAL_TYPEDEF(sint64, 8, 4, FFI_TYPE_SINT64); +#else +FFI_INTEGRAL_TYPEDEF(uint64, 8, 8, FFI_TYPE_UINT64); +FFI_INTEGRAL_TYPEDEF(sint64, 8, 8, FFI_TYPE_SINT64); +#endif + +#if defined X86 || defined X86_WIN32 || defined M68K || defined(X86_DARWIN) + +# if defined X86_WIN32 || defined X86_64 + FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE); +# else + FFI_INTEGRAL_TYPEDEF(double, 8, 4, FFI_TYPE_DOUBLE); +# endif + +# ifdef X86_DARWIN + FFI_INTEGRAL_TYPEDEF(longdouble, 16, 16, FFI_TYPE_LONGDOUBLE); +# else + FFI_INTEGRAL_TYPEDEF(longdouble, 12, 4, FFI_TYPE_LONGDOUBLE); +# endif + +#elif defined ARM || defined SH || defined POWERPC_AIX +FFI_INTEGRAL_TYPEDEF(double, 8, 4, FFI_TYPE_DOUBLE); +FFI_INTEGRAL_TYPEDEF(longdouble, 8, 4, FFI_TYPE_LONGDOUBLE); +#elif defined POWERPC_DARWIN +FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE); + +# if __GNUC__ >= 4 + FFI_INTEGRAL_TYPEDEF(longdouble, 16, 16, FFI_TYPE_LONGDOUBLE); +# else + FFI_INTEGRAL_TYPEDEF(longdouble, 8, 8, FFI_TYPE_LONGDOUBLE); +# endif + +#elif defined SPARC +FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE); + +# ifdef SPARC64 + FFI_INTEGRAL_TYPEDEF(longdouble, 16, 16, FFI_TYPE_LONGDOUBLE); +# else + FFI_INTEGRAL_TYPEDEF(longdouble, 16, 8, FFI_TYPE_LONGDOUBLE); +# endif + +#elif defined X86_64 || defined POWERPC64 +FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE); +FFI_INTEGRAL_TYPEDEF(longdouble, 16, 16, FFI_TYPE_LONGDOUBLE); +#else +FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE); +FFI_INTEGRAL_TYPEDEF(longdouble, 8, 8, FFI_TYPE_LONGDOUBLE); +#endif \ No newline at end of file diff -r -u ./Modules/_ctypes/libffi_osx/x86/darwin64.S ./Modules/_ctypes/libffi_osx/x86/darwin64.S new file mode 100644 index 0000000..165d469 --- /dev/null +++ ./Modules/_ctypes/libffi_osx/x86/darwin64.S @@ -0,0 +1,417 @@ +/* ----------------------------------------------------------------------- + darwin64.S - Copyright (c) 2006 Free Software Foundation, Inc. + derived from unix64.S + + x86-64 Foreign Function Interface for Darwin. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#ifdef __x86_64__ +#define LIBFFI_ASM +#include +#include + + .file "darwin64.S" +.text + +/* ffi_call_unix64 (void *args, unsigned long bytes, unsigned flags, + void *raddr, void (*fnaddr)()); + + Bit o trickiness here -- ARGS+BYTES is the base of the stack frame + for this function. This has been allocated by ffi_call. We also + deallocate some of the stack that has been alloca'd. */ + + .align 3 + .globl _ffi_call_unix64 + +_ffi_call_unix64: +LUW0: + movq (%rsp), %r10 /* Load return address. */ + movq %rdi, %r12 /* Save a copy of the register area. */ + leaq (%rdi, %rsi), %rax /* Find local stack base. */ + movq %rdx, (%rax) /* Save flags. */ + movq %rcx, 8(%rax) /* Save raddr. */ + movq %rbp, 16(%rax) /* Save old frame pointer. */ + movq %r10, 24(%rax) /* Relocate return address. */ + movq %rax, %rbp /* Finalize local stack frame. */ +LUW1: + /* movq %rdi, %r10 // Save a copy of the register area. */ + movq %r12, %r10 + movq %r8, %r11 /* Save a copy of the target fn. */ + movl %r9d, %eax /* Set number of SSE registers. */ + + /* Load up all argument registers. */ + movq (%r10), %rdi + movq 8(%r10), %rsi + movq 16(%r10), %rdx + movq 24(%r10), %rcx + movq 32(%r10), %r8 + movq 40(%r10), %r9 + testl %eax, %eax + jnz Lload_sse +Lret_from_load_sse: + + /* Deallocate the reg arg area. */ + leaq 176(%r10), %rsp + + /* Call the user function. */ + call *%r11 + + /* Deallocate stack arg area; local stack frame in redzone. */ + leaq 24(%rbp), %rsp + + movq 0(%rbp), %rcx /* Reload flags. */ + movq 8(%rbp), %rdi /* Reload raddr. */ + movq 16(%rbp), %rbp /* Reload old frame pointer. */ +LUW2: + + /* The first byte of the flags contains the FFI_TYPE. */ + movzbl %cl, %r10d + leaq Lstore_table(%rip), %r11 + movslq (%r11, %r10, 4), %r10 + addq %r11, %r10 + jmp *%r10 + +Lstore_table: + .long Lst_void-Lstore_table /* FFI_TYPE_VOID */ + .long Lst_sint32-Lstore_table /* FFI_TYPE_INT */ + .long Lst_float-Lstore_table /* FFI_TYPE_FLOAT */ + .long Lst_double-Lstore_table /* FFI_TYPE_DOUBLE */ + .long Lst_ldouble-Lstore_table /* FFI_TYPE_LONGDOUBLE */ + .long Lst_uint8-Lstore_table /* FFI_TYPE_UINT8 */ + .long Lst_sint8-Lstore_table /* FFI_TYPE_SINT8 */ + .long Lst_uint16-Lstore_table /* FFI_TYPE_UINT16 */ + .long Lst_sint16-Lstore_table /* FFI_TYPE_SINT16 */ + .long Lst_uint32-Lstore_table /* FFI_TYPE_UINT32 */ + .long Lst_sint32-Lstore_table /* FFI_TYPE_SINT32 */ + .long Lst_int64-Lstore_table /* FFI_TYPE_UINT64 */ + .long Lst_int64-Lstore_table /* FFI_TYPE_SINT64 */ + .long Lst_struct-Lstore_table /* FFI_TYPE_STRUCT */ + .long Lst_int64-Lstore_table /* FFI_TYPE_POINTER */ + + .text + .align 3 +Lst_void: + ret + .align 3 +Lst_uint8: + movzbq %al, %rax + movq %rax, (%rdi) + ret + .align 3 +Lst_sint8: + movsbq %al, %rax + movq %rax, (%rdi) + ret + .align 3 +Lst_uint16: + movzwq %ax, %rax + movq %rax, (%rdi) + .align 3 +Lst_sint16: + movswq %ax, %rax + movq %rax, (%rdi) + ret + .align 3 +Lst_uint32: + movl %eax, %eax + movq %rax, (%rdi) + .align 3 +Lst_sint32: + cltq + movq %rax, (%rdi) + ret + .align 3 +Lst_int64: + movq %rax, (%rdi) + ret + .align 3 +Lst_float: + movss %xmm0, (%rdi) + ret + .align 3 +Lst_double: + movsd %xmm0, (%rdi) + ret +Lst_ldouble: + fstpt (%rdi) + ret + .align 3 +Lst_struct: + leaq -20(%rsp), %rsi /* Scratch area in redzone. */ + + /* We have to locate the values now, and since we don't want to + write too much data into the user's return value, we spill the + value to a 16 byte scratch area first. Bits 8, 9, and 10 + control where the values are located. Only one of the three + bits will be set; see ffi_prep_cif_machdep for the pattern. */ + movd %xmm0, %r10 + movd %xmm1, %r11 + testl $0x100, %ecx + cmovnz %rax, %rdx + cmovnz %r10, %rax + testl $0x200, %ecx + cmovnz %r10, %rdx + testl $0x400, %ecx + cmovnz %r10, %rax + cmovnz %r11, %rdx + movq %rax, (%rsi) + movq %rdx, 8(%rsi) + + /* Bits 12-31 contain the true size of the structure. Copy from + the scratch area to the true destination. */ + shrl $12, %ecx + rep movsb + ret + + /* Many times we can avoid loading any SSE registers at all. + It's not worth an indirect jump to load the exact set of + SSE registers needed; zero or all is a good compromise. */ + .align 3 +LUW3: +Lload_sse: + movdqa 48(%r10), %xmm0 + movdqa 64(%r10), %xmm1 + movdqa 80(%r10), %xmm2 + movdqa 96(%r10), %xmm3 + movdqa 112(%r10), %xmm4 + movdqa 128(%r10), %xmm5 + movdqa 144(%r10), %xmm6 + movdqa 160(%r10), %xmm7 + jmp Lret_from_load_sse + +LUW4: + .align 3 + .globl _ffi_closure_unix64 + +_ffi_closure_unix64: +LUW5: + /* The carry flag is set by the trampoline iff SSE registers + are used. Don't clobber it before the branch instruction. */ + leaq -200(%rsp), %rsp +LUW6: + movq %rdi, (%rsp) + movq %rsi, 8(%rsp) + movq %rdx, 16(%rsp) + movq %rcx, 24(%rsp) + movq %r8, 32(%rsp) + movq %r9, 40(%rsp) + jc Lsave_sse +Lret_from_save_sse: + + movq %r10, %rdi + leaq 176(%rsp), %rsi + movq %rsp, %rdx + leaq 208(%rsp), %rcx + call _ffi_closure_unix64_inner + + /* Deallocate stack frame early; return value is now in redzone. */ + addq $200, %rsp +LUW7: + + /* The first byte of the return value contains the FFI_TYPE. */ + movzbl %al, %r10d + leaq Lload_table(%rip), %r11 + movslq (%r11, %r10, 4), %r10 + addq %r11, %r10 + jmp *%r10 + +Lload_table: + .long Lld_void-Lload_table /* FFI_TYPE_VOID */ + .long Lld_int32-Lload_table /* FFI_TYPE_INT */ + .long Lld_float-Lload_table /* FFI_TYPE_FLOAT */ + .long Lld_double-Lload_table /* FFI_TYPE_DOUBLE */ + .long Lld_ldouble-Lload_table /* FFI_TYPE_LONGDOUBLE */ + .long Lld_int8-Lload_table /* FFI_TYPE_UINT8 */ + .long Lld_int8-Lload_table /* FFI_TYPE_SINT8 */ + .long Lld_int16-Lload_table /* FFI_TYPE_UINT16 */ + .long Lld_int16-Lload_table /* FFI_TYPE_SINT16 */ + .long Lld_int32-Lload_table /* FFI_TYPE_UINT32 */ + .long Lld_int32-Lload_table /* FFI_TYPE_SINT32 */ + .long Lld_int64-Lload_table /* FFI_TYPE_UINT64 */ + .long Lld_int64-Lload_table /* FFI_TYPE_SINT64 */ + .long Lld_struct-Lload_table /* FFI_TYPE_STRUCT */ + .long Lld_int64-Lload_table /* FFI_TYPE_POINTER */ + + .text + .align 3 +Lld_void: + ret + .align 3 +Lld_int8: + movzbl -24(%rsp), %eax + ret + .align 3 +Lld_int16: + movzwl -24(%rsp), %eax + ret + .align 3 +Lld_int32: + movl -24(%rsp), %eax + ret + .align 3 +Lld_int64: + movq -24(%rsp), %rax + ret + .align 3 +Lld_float: + movss -24(%rsp), %xmm0 + ret + .align 3 +Lld_double: + movsd -24(%rsp), %xmm0 + ret + .align 3 +Lld_ldouble: + fldt -24(%rsp) + ret + .align 3 +Lld_struct: + /* There are four possibilities here, %rax/%rdx, %xmm0/%rax, + %rax/%xmm0, %xmm0/%xmm1. We collapse two by always loading + both rdx and xmm1 with the second word. For the remaining, + bit 8 set means xmm0 gets the second word, and bit 9 means + that rax gets the second word. */ + movq -24(%rsp), %rcx + movq -16(%rsp), %rdx + movq -16(%rsp), %xmm1 + testl $0x100, %eax + cmovnz %rdx, %rcx + movd %rcx, %xmm0 + testl $0x200, %eax + movq -24(%rsp), %rax + cmovnz %rdx, %rax + ret + + /* See the comment above Lload_sse; the same logic applies here. */ + .align 3 +LUW8: +Lsave_sse: + movdqa %xmm0, 48(%rsp) + movdqa %xmm1, 64(%rsp) + movdqa %xmm2, 80(%rsp) + movdqa %xmm3, 96(%rsp) + movdqa %xmm4, 112(%rsp) + movdqa %xmm5, 128(%rsp) + movdqa %xmm6, 144(%rsp) + movdqa %xmm7, 160(%rsp) + jmp Lret_from_save_sse + +LUW9: +.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support +EH_frame1: + .set L$set$0,LECIE1-LSCIE1 /* CIE Length */ + .long L$set$0 +LSCIE1: + .long 0x0 /* CIE Identifier Tag */ + .byte 0x1 /* CIE Version */ + .ascii "zR\0" /* CIE Augmentation */ + .byte 0x1 /* uleb128 0x1; CIE Code Alignment Factor */ + .byte 0x78 /* sleb128 -8; CIE Data Alignment Factor */ + .byte 0x10 /* CIE RA Column */ + .byte 0x1 /* uleb128 0x1; Augmentation size */ + .byte 0x10 /* FDE Encoding (pcrel sdata4) */ + .byte 0xc /* DW_CFA_def_cfa, %rsp offset 8 */ + .byte 0x7 /* uleb128 0x7 */ + .byte 0x8 /* uleb128 0x8 */ + .byte 0x90 /* DW_CFA_offset, column 0x10 */ + .byte 0x1 + .align 3 +LECIE1: + .globl _ffi_call_unix64.eh +_ffi_call_unix64.eh: +LSFDE1: + .set L$set$1,LEFDE1-LASFDE1 /* FDE Length */ + .long L$set$1 +LASFDE1: + .long LASFDE1-EH_frame1 /* FDE CIE offset */ + .quad LUW0-. /* FDE initial location */ + .set L$set$2,LUW4-LUW0 /* FDE address range */ + .quad L$set$2 + .byte 0x0 /* Augmentation size */ + .byte 0x4 /* DW_CFA_advance_loc4 */ + .set L$set$3,LUW1-LUW0 + .long L$set$3 + + /* New stack frame based off rbp. This is a itty bit of unwind + trickery in that the CFA *has* changed. There is no easy way + to describe it correctly on entry to the function. Fortunately, + it doesn't matter too much since at all points we can correctly + unwind back to ffi_call. Note that the location to which we + moved the return address is (the new) CFA-8, so from the + perspective of the unwind info, it hasn't moved. */ + .byte 0xc /* DW_CFA_def_cfa, %rbp offset 32 */ + .byte 0x6 + .byte 0x20 + .byte 0x80+6 /* DW_CFA_offset, %rbp offset 2*-8 */ + .byte 0x2 + .byte 0xa /* DW_CFA_remember_state */ + + .byte 0x4 /* DW_CFA_advance_loc4 */ + .set L$set$4,LUW2-LUW1 + .long L$set$4 + .byte 0xc /* DW_CFA_def_cfa, %rsp offset 8 */ + .byte 0x7 + .byte 0x8 + .byte 0xc0+6 /* DW_CFA_restore, %rbp */ + + .byte 0x4 /* DW_CFA_advance_loc4 */ + .set L$set$5,LUW3-LUW2 + .long L$set$5 + .byte 0xb /* DW_CFA_restore_state */ + + .align 3 +LEFDE1: + .globl _ffi_closure_unix64.eh +_ffi_closure_unix64.eh: +LSFDE3: + .set L$set$6,LEFDE3-LASFDE3 /* FDE Length */ + .long L$set$6 +LASFDE3: + .long LASFDE3-EH_frame1 /* FDE CIE offset */ + .quad LUW5-. /* FDE initial location */ + .set L$set$7,LUW9-LUW5 /* FDE address range */ + .quad L$set$7 + .byte 0x0 /* Augmentation size */ + + .byte 0x4 /* DW_CFA_advance_loc4 */ + .set L$set$8,LUW6-LUW5 + .long L$set$8 + .byte 0xe /* DW_CFA_def_cfa_offset */ + .byte 208,1 /* uleb128 208 */ + .byte 0xa /* DW_CFA_remember_state */ + + .byte 0x4 /* DW_CFA_advance_loc4 */ + .set L$set$9,LUW7-LUW6 + .long L$set$9 + .byte 0xe /* DW_CFA_def_cfa_offset */ + .byte 0x8 + + .byte 0x4 /* DW_CFA_advance_loc4 */ + .set L$set$10,LUW8-LUW7 + .long L$set$10 + .byte 0xb /* DW_CFA_restore_state */ + + .align 3 +LEFDE3: + .subsections_via_symbols + +#endif /* __x86_64__ */ diff -r -u ./Modules/_ctypes/libffi_osx/x86/x86-darwin.S ./Modules/_ctypes/libffi_osx/x86/x86-darwin.S new file mode 100644 index 0000000..925a841 --- /dev/null +++ ./Modules/_ctypes/libffi_osx/x86/x86-darwin.S @@ -0,0 +1,422 @@ +#ifdef __i386__ +/* ----------------------------------------------------------------------- + darwin.S - Copyright (c) 1996, 1998, 2001, 2002, 2003 Red Hat, Inc. + + X86 Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +/* + * This file is based on sysv.S and then hacked up by Ronald who hasn't done + * assembly programming in 8 years. + */ + +#ifndef __x86_64__ + +#define LIBFFI_ASM +#include +#include + +#ifdef PyObjC_STRICT_DEBUGGING + /* XXX: Debugging of stack alignment, to be removed */ +#define ASSERT_STACK_ALIGNED movdqa -16(%esp), %xmm0 +#else +#define ASSERT_STACK_ALIGNED +#endif + +.text + +.globl _ffi_prep_args + + .align 4 +.globl _ffi_call_SYSV + +_ffi_call_SYSV: +LFB1: + pushl %ebp +LCFI0: + movl %esp,%ebp +LCFI1: + subl $8,%esp + /* Make room for all of the new args. */ + movl 16(%ebp),%ecx + subl %ecx,%esp + + movl %esp,%eax + + /* Place all of the ffi_prep_args in position */ + subl $8,%esp + pushl 12(%ebp) + pushl %eax + call *8(%ebp) + + /* Return stack to previous state and call the function */ + addl $16,%esp + + call *28(%ebp) + + /* Remove the space we pushed for the args */ + movl 16(%ebp),%ecx + addl %ecx,%esp + + /* Load %ecx with the return type code */ + movl 20(%ebp),%ecx + + /* If the return value pointer is NULL, assume no return value. */ + cmpl $0,24(%ebp) + jne Lretint + + /* Even if there is no space for the return value, we are + obliged to handle floating-point values. */ + cmpl $FFI_TYPE_FLOAT,%ecx + jne Lnoretval + fstp %st(0) + + jmp Lepilogue + +Lretint: + cmpl $FFI_TYPE_INT,%ecx + jne Lretfloat + /* Load %ecx with the pointer to storage for the return value */ + movl 24(%ebp),%ecx + movl %eax,0(%ecx) + jmp Lepilogue + +Lretfloat: + cmpl $FFI_TYPE_FLOAT,%ecx + jne Lretdouble + /* Load %ecx with the pointer to storage for the return value */ + movl 24(%ebp),%ecx + fstps (%ecx) + jmp Lepilogue + +Lretdouble: + cmpl $FFI_TYPE_DOUBLE,%ecx + jne Lretlongdouble + /* Load %ecx with the pointer to storage for the return value */ + movl 24(%ebp),%ecx + fstpl (%ecx) + jmp Lepilogue + +Lretlongdouble: + cmpl $FFI_TYPE_LONGDOUBLE,%ecx + jne Lretint64 + /* Load %ecx with the pointer to storage for the return value */ + movl 24(%ebp),%ecx + fstpt (%ecx) + jmp Lepilogue + +Lretint64: + cmpl $FFI_TYPE_SINT64,%ecx + jne Lretstruct1b + /* Load %ecx with the pointer to storage for the return value */ + movl 24(%ebp),%ecx + movl %eax,0(%ecx) + movl %edx,4(%ecx) + jmp Lepilogue + +Lretstruct1b: + cmpl $FFI_TYPE_SINT8,%ecx + jne Lretstruct2b + /* Load %ecx with the pointer to storage for the return value */ + movl 24(%ebp),%ecx + movb %al,0(%ecx) + jmp Lepilogue + +Lretstruct2b: + cmpl $FFI_TYPE_SINT16,%ecx + jne Lretstruct + /* Load %ecx with the pointer to storage for the return value */ + movl 24(%ebp),%ecx + movw %ax,0(%ecx) + jmp Lepilogue + +Lretstruct: + cmpl $FFI_TYPE_STRUCT,%ecx + jne Lnoretval + /* Nothing to do! */ + addl $4,%esp + popl %ebp + ret + +Lnoretval: +Lepilogue: + addl $8,%esp + movl %ebp,%esp + popl %ebp + ret +LFE1: +.ffi_call_SYSV_end: + + .align 4 +FFI_HIDDEN (ffi_closure_SYSV) +.globl _ffi_closure_SYSV + +_ffi_closure_SYSV: +LFB2: + pushl %ebp +LCFI2: + movl %esp, %ebp +LCFI3: + subl $56, %esp + leal -40(%ebp), %edx + movl %edx, -12(%ebp) /* resp */ + leal 8(%ebp), %edx + movl %edx, 4(%esp) /* args = __builtin_dwarf_cfa () */ + leal -12(%ebp), %edx + movl %edx, (%esp) /* &resp */ + movl %ebx, 8(%esp) +LCFI7: + call L_ffi_closure_SYSV_inner$stub + movl 8(%esp), %ebx + movl -12(%ebp), %ecx + cmpl $FFI_TYPE_INT, %eax + je Lcls_retint + cmpl $FFI_TYPE_FLOAT, %eax + je Lcls_retfloat + cmpl $FFI_TYPE_DOUBLE, %eax + je Lcls_retdouble + cmpl $FFI_TYPE_LONGDOUBLE, %eax + je Lcls_retldouble + cmpl $FFI_TYPE_SINT64, %eax + je Lcls_retllong + cmpl $FFI_TYPE_UINT8, %eax + je Lcls_retstruct1 + cmpl $FFI_TYPE_SINT8, %eax + je Lcls_retstruct1 + cmpl $FFI_TYPE_UINT16, %eax + je Lcls_retstruct2 + cmpl $FFI_TYPE_SINT16, %eax + je Lcls_retstruct2 + cmpl $FFI_TYPE_STRUCT, %eax + je Lcls_retstruct +Lcls_epilogue: + movl %ebp, %esp + popl %ebp + ret +Lcls_retint: + movl (%ecx), %eax + jmp Lcls_epilogue +Lcls_retfloat: + flds (%ecx) + jmp Lcls_epilogue +Lcls_retdouble: + fldl (%ecx) + jmp Lcls_epilogue +Lcls_retldouble: + fldt (%ecx) + jmp Lcls_epilogue +Lcls_retllong: + movl (%ecx), %eax + movl 4(%ecx), %edx + jmp Lcls_epilogue +Lcls_retstruct1: + movsbl (%ecx), %eax + jmp Lcls_epilogue +Lcls_retstruct2: + movswl (%ecx), %eax + jmp Lcls_epilogue +Lcls_retstruct: + lea -8(%ebp),%esp + movl %ebp, %esp + popl %ebp + ret $4 +LFE2: + +#if !FFI_NO_RAW_API + +#define RAW_CLOSURE_CIF_OFFSET ((FFI_TRAMPOLINE_SIZE + 3) & ~3) +#define RAW_CLOSURE_FUN_OFFSET (RAW_CLOSURE_CIF_OFFSET + 4) +#define RAW_CLOSURE_USER_DATA_OFFSET (RAW_CLOSURE_FUN_OFFSET + 4) +#define CIF_FLAGS_OFFSET 20 + + .align 4 +FFI_HIDDEN (ffi_closure_raw_SYSV) +.globl _ffi_closure_raw_SYSV + +_ffi_closure_raw_SYSV: +LFB3: + pushl %ebp +LCFI4: + movl %esp, %ebp +LCFI5: + pushl %esi +LCFI6: + subl $36, %esp + movl RAW_CLOSURE_CIF_OFFSET(%eax), %esi /* closure->cif */ + movl RAW_CLOSURE_USER_DATA_OFFSET(%eax), %edx /* closure->user_data */ + movl %edx, 12(%esp) /* user_data */ + leal 8(%ebp), %edx /* __builtin_dwarf_cfa () */ + movl %edx, 8(%esp) /* raw_args */ + leal -24(%ebp), %edx + movl %edx, 4(%esp) /* &res */ + movl %esi, (%esp) /* cif */ + call *RAW_CLOSURE_FUN_OFFSET(%eax) /* closure->fun */ + movl CIF_FLAGS_OFFSET(%esi), %eax /* rtype */ + cmpl $FFI_TYPE_INT, %eax + je Lrcls_retint + cmpl $FFI_TYPE_FLOAT, %eax + je Lrcls_retfloat + cmpl $FFI_TYPE_DOUBLE, %eax + je Lrcls_retdouble + cmpl $FFI_TYPE_LONGDOUBLE, %eax + je Lrcls_retldouble + cmpl $FFI_TYPE_SINT64, %eax + je Lrcls_retllong +Lrcls_epilogue: + addl $36, %esp + popl %esi + popl %ebp + ret +Lrcls_retint: + movl -24(%ebp), %eax + jmp Lrcls_epilogue +Lrcls_retfloat: + flds -24(%ebp) + jmp Lrcls_epilogue +Lrcls_retdouble: + fldl -24(%ebp) + jmp Lrcls_epilogue +Lrcls_retldouble: + fldt -24(%ebp) + jmp Lrcls_epilogue +Lrcls_retllong: + movl -24(%ebp), %eax + movl -20(%ebp), %edx + jmp Lrcls_epilogue +LFE3: +#endif + +.section __IMPORT,__jump_table,symbol_stubs,self_modifying_code+pure_instructions,5 +L_ffi_closure_SYSV_inner$stub: + .indirect_symbol _ffi_closure_SYSV_inner + hlt ; hlt ; hlt ; hlt ; hlt + + +.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support +EH_frame1: + .set L$set$0,LECIE1-LSCIE1 + .long L$set$0 +LSCIE1: + .long 0x0 + .byte 0x1 + .ascii "zR\0" + .byte 0x1 + .byte 0x7c + .byte 0x8 + .byte 0x1 + .byte 0x10 + .byte 0xc + .byte 0x5 + .byte 0x4 + .byte 0x88 + .byte 0x1 + .align 2 +LECIE1: +.globl _ffi_call_SYSV.eh +_ffi_call_SYSV.eh: +LSFDE1: + .set L$set$1,LEFDE1-LASFDE1 + .long L$set$1 +LASFDE1: + .long LASFDE1-EH_frame1 + .long LFB1-. + .set L$set$2,LFE1-LFB1 + .long L$set$2 + .byte 0x0 + .byte 0x4 + .set L$set$3,LCFI0-LFB1 + .long L$set$3 + .byte 0xe + .byte 0x8 + .byte 0x84 + .byte 0x2 + .byte 0x4 + .set L$set$4,LCFI1-LCFI0 + .long L$set$4 + .byte 0xd + .byte 0x4 + .align 2 +LEFDE1: +.globl _ffi_closure_SYSV.eh +_ffi_closure_SYSV.eh: +LSFDE2: + .set L$set$5,LEFDE2-LASFDE2 + .long L$set$5 +LASFDE2: + .long LASFDE2-EH_frame1 + .long LFB2-. + .set L$set$6,LFE2-LFB2 + .long L$set$6 + .byte 0x0 + .byte 0x4 + .set L$set$7,LCFI2-LFB2 + .long L$set$7 + .byte 0xe + .byte 0x8 + .byte 0x84 + .byte 0x2 + .byte 0x4 + .set L$set$8,LCFI3-LCFI2 + .long L$set$8 + .byte 0xd + .byte 0x4 + .align 2 +LEFDE2: + +#if !FFI_NO_RAW_API + +.globl _ffi_closure_raw_SYSV.eh +_ffi_closure_raw_SYSV.eh: +LSFDE3: + .set L$set$10,LEFDE3-LASFDE3 + .long L$set$10 +LASFDE3: + .long LASFDE3-EH_frame1 + .long LFB3-. + .set L$set$11,LFE3-LFB3 + .long L$set$11 + .byte 0x0 + .byte 0x4 + .set L$set$12,LCFI4-LFB3 + .long L$set$12 + .byte 0xe + .byte 0x8 + .byte 0x84 + .byte 0x2 + .byte 0x4 + .set L$set$13,LCFI5-LCFI4 + .long L$set$13 + .byte 0xd + .byte 0x4 + .byte 0x4 + .set L$set$14,LCFI6-LCFI5 + .long L$set$14 + .byte 0x85 + .byte 0x3 + .align 2 +LEFDE3: + +#endif + +#endif /* ifndef __x86_64__ */ + +#endif /* defined __i386__ */ diff -r -u ./Modules/_ctypes/libffi_osx/x86/x86-ffi64.c ./Modules/_ctypes/libffi_osx/x86/x86-ffi64.c new file mode 100644 index 0000000..06feaf2 --- /dev/null +++ ./Modules/_ctypes/libffi_osx/x86/x86-ffi64.c @@ -0,0 +1,734 @@ +#ifdef __x86_64__ + +/* ----------------------------------------------------------------------- + x86-ffi64.c - Copyright (c) 2002 Bo Thorsen + + x86-64 Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#include +#include + +#include +#include + +#define MAX_GPR_REGS 6 +#define MAX_SSE_REGS 8 + +typedef struct RegisterArgs { + /* Registers for argument passing. */ + UINT64 gpr[MAX_GPR_REGS]; + __int128_t sse[MAX_SSE_REGS]; +} RegisterArgs; + +extern void +ffi_call_unix64( + void* args, + unsigned long bytes, + unsigned flags, + void* raddr, + void (*fnaddr)(), + unsigned ssecount); + +/* All reference to register classes here is identical to the code in + gcc/config/i386/i386.c. Do *not* change one without the other. */ + +/* Register class used for passing given 64bit part of the argument. + These represent classes as documented by the PS ABI, with the exception + of SSESF, SSEDF classes, that are basically SSE class, just gcc will + use SF or DFmode move instead of DImode to avoid reformating penalties. + + Similary we play games with INTEGERSI_CLASS to use cheaper SImode moves + whenever possible (upper half does contain padding). */ +enum x86_64_reg_class +{ + X86_64_NO_CLASS, + X86_64_INTEGER_CLASS, + X86_64_INTEGERSI_CLASS, + X86_64_SSE_CLASS, + X86_64_SSESF_CLASS, + X86_64_SSEDF_CLASS, + X86_64_SSEUP_CLASS, + X86_64_X87_CLASS, + X86_64_X87UP_CLASS, + X86_64_COMPLEX_X87_CLASS, + X86_64_MEMORY_CLASS +}; + +#define MAX_CLASSES 4 +#define SSE_CLASS_P(X) ((X) >= X86_64_SSE_CLASS && X <= X86_64_SSEUP_CLASS) + +/* x86-64 register passing implementation. See x86-64 ABI for details. Goal + of this code is to classify each 8bytes of incoming argument by the register + class and assign registers accordingly. */ + +/* Return the union class of CLASS1 and CLASS2. + See the x86-64 PS ABI for details. */ +static enum x86_64_reg_class +merge_classes( + enum x86_64_reg_class class1, + enum x86_64_reg_class class2) +{ + /* Rule #1: If both classes are equal, this is the resulting class. */ + if (class1 == class2) + return class1; + + /* Rule #2: If one of the classes is NO_CLASS, the resulting class is + the other class. */ + if (class1 == X86_64_NO_CLASS) + return class2; + + if (class2 == X86_64_NO_CLASS) + return class1; + + /* Rule #3: If one of the classes is MEMORY, the result is MEMORY. */ + if (class1 == X86_64_MEMORY_CLASS || class2 == X86_64_MEMORY_CLASS) + return X86_64_MEMORY_CLASS; + + /* Rule #4: If one of the classes is INTEGER, the result is INTEGER. */ + if ((class1 == X86_64_INTEGERSI_CLASS && class2 == X86_64_SSESF_CLASS) + || (class2 == X86_64_INTEGERSI_CLASS && class1 == X86_64_SSESF_CLASS)) + return X86_64_INTEGERSI_CLASS; + + if (class1 == X86_64_INTEGER_CLASS || class1 == X86_64_INTEGERSI_CLASS + || class2 == X86_64_INTEGER_CLASS || class2 == X86_64_INTEGERSI_CLASS) + return X86_64_INTEGER_CLASS; + + /* Rule #5: If one of the classes is X87, X87UP, or COMPLEX_X87 class, + MEMORY is used. */ + if (class1 == X86_64_X87_CLASS + || class1 == X86_64_X87UP_CLASS + || class1 == X86_64_COMPLEX_X87_CLASS + || class2 == X86_64_X87_CLASS + || class2 == X86_64_X87UP_CLASS + || class2 == X86_64_COMPLEX_X87_CLASS) + return X86_64_MEMORY_CLASS; + + /* Rule #6: Otherwise class SSE is used. */ + return X86_64_SSE_CLASS; +} + +/* Classify the argument of type TYPE and mode MODE. + CLASSES will be filled by the register class used to pass each word + of the operand. The number of words is returned. In case the parameter + should be passed in memory, 0 is returned. As a special case for zero + sized containers, classes[0] will be NO_CLASS and 1 is returned. + + See the x86-64 PS ABI for details. */ + +static int +classify_argument( + ffi_type* type, + enum x86_64_reg_class classes[], + size_t byte_offset) +{ + switch (type->type) + { + case FFI_TYPE_UINT8: + case FFI_TYPE_SINT8: + case FFI_TYPE_UINT16: + case FFI_TYPE_SINT16: + case FFI_TYPE_UINT32: + case FFI_TYPE_SINT32: + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + case FFI_TYPE_POINTER: +#if 0 + if (byte_offset + type->size <= 4) + classes[0] = X86_64_INTEGERSI_CLASS; + else + classes[0] = X86_64_INTEGER_CLASS; + + return 1; +#else + { + int size = byte_offset + type->size; + + if (size <= 4) + { + classes[0] = X86_64_INTEGERSI_CLASS; + return 1; + } + else if (size <= 8) + { + classes[0] = X86_64_INTEGER_CLASS; + return 1; + } + else if (size <= 12) + { + classes[0] = X86_64_INTEGER_CLASS; + classes[1] = X86_64_INTEGERSI_CLASS; + return 2; + } + else if (size <= 16) + { + classes[0] = classes[1] = X86_64_INTEGERSI_CLASS; + return 2; + } + else + FFI_ASSERT (0); + } +#endif + + case FFI_TYPE_FLOAT: + if (byte_offset == 0) + classes[0] = X86_64_SSESF_CLASS; + else + classes[0] = X86_64_SSE_CLASS; + + return 1; + + case FFI_TYPE_DOUBLE: + classes[0] = X86_64_SSEDF_CLASS; + return 1; + + case FFI_TYPE_LONGDOUBLE: + classes[0] = X86_64_X87_CLASS; + classes[1] = X86_64_X87UP_CLASS; + return 2; + + case FFI_TYPE_STRUCT: + { + ffi_type** ptr; + int i; + enum x86_64_reg_class subclasses[MAX_CLASSES]; + const int UNITS_PER_WORD = 8; + int words = + (type->size + UNITS_PER_WORD - 1) / UNITS_PER_WORD; + + /* If the struct is larger than 16 bytes, pass it on the stack. */ + if (type->size > 16) + return 0; + + for (i = 0; i < words; i++) + classes[i] = X86_64_NO_CLASS; + + /* Merge the fields of structure. */ + for (ptr = type->elements; *ptr != NULL; ptr++) + { + byte_offset = ALIGN(byte_offset, (*ptr)->alignment); + + int num = classify_argument(*ptr, subclasses, byte_offset % 8); + + if (num == 0) + return 0; + + int pos = byte_offset / 8; + + for (i = 0; i < num; i++) + { + classes[i + pos] = + merge_classes(subclasses[i], classes[i + pos]); + } + + byte_offset += (*ptr)->size; + } + + if (words > 2) + { + /* When size > 16 bytes, if the first one isn't + X86_64_SSE_CLASS or any other ones aren't + X86_64_SSEUP_CLASS, everything should be passed in + memory. */ + if (classes[0] != X86_64_SSE_CLASS) + return 0; + + for (i = 1; i < words; i++) + if (classes[i] != X86_64_SSEUP_CLASS) + return 0; + } + + + /* Final merger cleanup. */ + for (i = 0; i < words; i++) + { + /* If one class is MEMORY, everything should be passed in + memory. */ + if (classes[i] == X86_64_MEMORY_CLASS) + return 0; + + /* The X86_64_SSEUP_CLASS should be always preceded by + X86_64_SSE_CLASS. */ + if (classes[i] == X86_64_SSEUP_CLASS + && classes[i - 1] != X86_64_SSE_CLASS + && classes[i - 1] != X86_64_SSEUP_CLASS) + { + FFI_ASSERT(i != 0); + classes[i] = X86_64_SSE_CLASS; + } + + /* X86_64_X87UP_CLASS should be preceded by X86_64_X87_CLASS. */ + if (classes[i] == X86_64_X87UP_CLASS + && classes[i - 1] != X86_64_X87_CLASS) + { + FFI_ASSERT(i != 0); + classes[i] = X86_64_SSE_CLASS; + } + } + + return words; + } + + default: + FFI_ASSERT(0); + } + + return 0; /* Never reached. */ +} + +/* Examine the argument and return set number of register required in each + class. Return zero if parameter should be passed in memory, otherwise + the number of registers. */ +static int +examine_argument( + ffi_type* type, + enum x86_64_reg_class classes[MAX_CLASSES], + _Bool in_return, + int* pngpr, + int* pnsse) +{ + int n = classify_argument(type, classes, 0); + int ngpr = 0; + int nsse = 0; + int i; + + if (n == 0) + return 0; + + for (i = 0; i < n; ++i) + { + switch (classes[i]) + { + case X86_64_INTEGER_CLASS: + case X86_64_INTEGERSI_CLASS: + ngpr++; + break; + + case X86_64_SSE_CLASS: + case X86_64_SSESF_CLASS: + case X86_64_SSEDF_CLASS: + nsse++; + break; + + case X86_64_NO_CLASS: + case X86_64_SSEUP_CLASS: + break; + + case X86_64_X87_CLASS: + case X86_64_X87UP_CLASS: + case X86_64_COMPLEX_X87_CLASS: + return in_return != 0; + + default: + abort(); + } + } + + *pngpr = ngpr; + *pnsse = nsse; + + return n; +} + +/* Perform machine dependent cif processing. */ +ffi_status +ffi_prep_cif_machdep( + ffi_cif* cif) +{ + int gprcount = 0; + int ssecount = 0; + int flags = cif->rtype->type; + int i, avn, n, ngpr, nsse; + enum x86_64_reg_class classes[MAX_CLASSES]; + size_t bytes; + + if (flags != FFI_TYPE_VOID) + { + n = examine_argument (cif->rtype, classes, 1, &ngpr, &nsse); + + if (n == 0) + { + /* The return value is passed in memory. A pointer to that + memory is the first argument. Allocate a register for it. */ + gprcount++; + + /* We don't have to do anything in asm for the return. */ + flags = FFI_TYPE_VOID; + } + else if (flags == FFI_TYPE_STRUCT) + { + /* Mark which registers the result appears in. */ + _Bool sse0 = SSE_CLASS_P(classes[0]); + _Bool sse1 = n == 2 && SSE_CLASS_P(classes[1]); + + if (sse0 && !sse1) + flags |= 1 << 8; + else if (!sse0 && sse1) + flags |= 1 << 9; + else if (sse0 && sse1) + flags |= 1 << 10; + + /* Mark the true size of the structure. */ + flags |= cif->rtype->size << 12; + } + } + + /* Go over all arguments and determine the way they should be passed. + If it's in a register and there is space for it, let that be so. If + not, add it's size to the stack byte count. */ + for (bytes = 0, i = 0, avn = cif->nargs; i < avn; i++) + { + if (examine_argument(cif->arg_types[i], classes, 0, &ngpr, &nsse) == 0 + || gprcount + ngpr > MAX_GPR_REGS + || ssecount + nsse > MAX_SSE_REGS) + { + long align = cif->arg_types[i]->alignment; + + if (align < 8) + align = 8; + + bytes = ALIGN(bytes, align); + bytes += cif->arg_types[i]->size; + } + else + { + gprcount += ngpr; + ssecount += nsse; + } + } + + if (ssecount) + flags |= 1 << 11; + + cif->flags = flags; + cif->bytes = bytes; + cif->bytes = ALIGN(bytes,8); + + return FFI_OK; +} + +void +ffi_call( + ffi_cif* cif, + void (*fn)(), + void* rvalue, + void** avalue) +{ + enum x86_64_reg_class classes[MAX_CLASSES]; + char* stack; + char* argp; + ffi_type** arg_types; + int gprcount, ssecount, ngpr, nsse, i, avn; + _Bool ret_in_memory; + RegisterArgs* reg_args; + + /* Can't call 32-bit mode from 64-bit mode. */ + FFI_ASSERT(cif->abi == FFI_UNIX64); + + /* If the return value is a struct and we don't have a return value + address then we need to make one. Note the setting of flags to + VOID above in ffi_prep_cif_machdep. */ + ret_in_memory = (cif->rtype->type == FFI_TYPE_STRUCT + && (cif->flags & 0xff) == FFI_TYPE_VOID); + + if (rvalue == NULL && ret_in_memory) + rvalue = alloca (cif->rtype->size); + + /* Allocate the space for the arguments, plus 4 words of temp space. */ + stack = alloca(sizeof(RegisterArgs) + cif->bytes + 4 * 8); + reg_args = (RegisterArgs*)stack; + argp = stack + sizeof(RegisterArgs); + + gprcount = ssecount = 0; + + /* If the return value is passed in memory, add the pointer as the + first integer argument. */ + if (ret_in_memory) + reg_args->gpr[gprcount++] = (long) rvalue; + + avn = cif->nargs; + arg_types = cif->arg_types; + + for (i = 0; i < avn; ++i) + { + size_t size = arg_types[i]->size; + int n; + + n = examine_argument (arg_types[i], classes, 0, &ngpr, &nsse); + + if (n == 0 + || gprcount + ngpr > MAX_GPR_REGS + || ssecount + nsse > MAX_SSE_REGS) + { + long align = arg_types[i]->alignment; + + /* Stack arguments are *always* at least 8 byte aligned. */ + if (align < 8) + align = 8; + + /* Pass this argument in memory. */ + argp = (void *) ALIGN (argp, align); + memcpy (argp, avalue[i], size); + argp += size; + } + else + { /* The argument is passed entirely in registers. */ + char *a = (char *) avalue[i]; + int j; + + for (j = 0; j < n; j++, a += 8, size -= 8) + { + switch (classes[j]) + { + case X86_64_INTEGER_CLASS: + case X86_64_INTEGERSI_CLASS: + reg_args->gpr[gprcount] = 0; + switch (arg_types[i]->type) { + case FFI_TYPE_SINT8: + { + int8_t shortval = *(int8_t*)a; + int64_t actval = (int64_t)shortval; + reg_args->gpr[gprcount] = actval; + /*memcpy (®_args->gpr[gprcount], &actval, 8);*/ + break; + } + + case FFI_TYPE_SINT16: + { + int16_t shortval = *(int16_t*)a; + int64_t actval = (int64_t)shortval; + memcpy (®_args->gpr[gprcount], &actval, 8); + break; + } + + case FFI_TYPE_SINT32: + { + int32_t shortval = *(int32_t*)a; + int64_t actval = (int64_t)shortval; + memcpy (®_args->gpr[gprcount], &actval, 8); + break; + } + + case FFI_TYPE_UINT8: + { + u_int8_t shortval = *(u_int8_t*)a; + u_int64_t actval = (u_int64_t)shortval; + /*memcpy (®_args->gpr[gprcount], &actval, 8);*/ + reg_args->gpr[gprcount] = actval; + break; + } + + case FFI_TYPE_UINT16: + { + u_int16_t shortval = *(u_int16_t*)a; + u_int64_t actval = (u_int64_t)shortval; + memcpy (®_args->gpr[gprcount], &actval, 8); + break; + } + + case FFI_TYPE_UINT32: + { + u_int32_t shortval = *(u_int32_t*)a; + u_int64_t actval = (u_int64_t)shortval; + memcpy (®_args->gpr[gprcount], &actval, 8); + break; + } + + default: + //memcpy (®_args->gpr[gprcount], a, size < 8 ? size : 8); + reg_args->gpr[gprcount] = *(int64_t*)a; + } + gprcount++; + break; + + case X86_64_SSE_CLASS: + case X86_64_SSEDF_CLASS: + reg_args->sse[ssecount++] = *(UINT64 *) a; + break; + + case X86_64_SSESF_CLASS: + reg_args->sse[ssecount++] = *(UINT32 *) a; + break; + + default: + abort(); + } + } + } + } + + ffi_call_unix64 (stack, cif->bytes + sizeof(RegisterArgs), + cif->flags, rvalue, fn, ssecount); +} + +extern void ffi_closure_unix64(void); + +ffi_status +ffi_prep_closure( + ffi_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif*, void*, void**, void*), + void* user_data) +{ + if (cif->abi != FFI_UNIX64) + return FFI_BAD_ABI; + + volatile unsigned short* tramp = + (volatile unsigned short*)&closure->tramp[0]; + + tramp[0] = 0xbb49; /* mov , %r11 */ + *(void* volatile*)&tramp[1] = ffi_closure_unix64; + tramp[5] = 0xba49; /* mov , %r10 */ + *(void* volatile*)&tramp[6] = closure; + + /* Set the carry bit if the function uses any sse registers. + This is clc or stc, together with the first byte of the jmp. */ + tramp[10] = cif->flags & (1 << 11) ? 0x49f9 : 0x49f8; + tramp[11] = 0xe3ff; /* jmp *%r11 */ + + closure->cif = cif; + closure->fun = fun; + closure->user_data = user_data; + + return FFI_OK; +} + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wmissing-prototypes" +int +ffi_closure_unix64_inner( + ffi_closure* closure, + void* rvalue, + RegisterArgs* reg_args, + char* argp) +#pragma clang diagnostic pop +{ + ffi_cif* cif = closure->cif; + void** avalue = alloca(cif->nargs * sizeof(void *)); + ffi_type** arg_types; + long i, avn; + int gprcount = 0; + int ssecount = 0; + int ngpr, nsse; + int ret; + + ret = cif->rtype->type; + + if (ret != FFI_TYPE_VOID) + { + enum x86_64_reg_class classes[MAX_CLASSES]; + int n = examine_argument (cif->rtype, classes, 1, &ngpr, &nsse); + + if (n == 0) + { + /* The return value goes in memory. Arrange for the closure + return value to go directly back to the original caller. */ + rvalue = (void *) reg_args->gpr[gprcount++]; + + /* We don't have to do anything in asm for the return. */ + ret = FFI_TYPE_VOID; + } + else if (ret == FFI_TYPE_STRUCT && n == 2) + { + /* Mark which register the second word of the structure goes in. */ + _Bool sse0 = SSE_CLASS_P (classes[0]); + _Bool sse1 = SSE_CLASS_P (classes[1]); + + if (!sse0 && sse1) + ret |= 1 << 8; + else if (sse0 && !sse1) + ret |= 1 << 9; + } + } + + avn = cif->nargs; + arg_types = cif->arg_types; + + for (i = 0; i < avn; ++i) + { + enum x86_64_reg_class classes[MAX_CLASSES]; + int n; + + n = examine_argument (arg_types[i], classes, 0, &ngpr, &nsse); + + if (n == 0 + || gprcount + ngpr > MAX_GPR_REGS + || ssecount + nsse > MAX_SSE_REGS) + { + long align = arg_types[i]->alignment; + + /* Stack arguments are *always* at least 8 byte aligned. */ + if (align < 8) + align = 8; + + /* Pass this argument in memory. */ + argp = (void *) ALIGN (argp, align); + avalue[i] = argp; + argp += arg_types[i]->size; + } + +#if !defined(X86_DARWIN) + /* If the argument is in a single register, or two consecutive + registers, then we can use that address directly. */ + else if (n == 1 || (n == 2 && + SSE_CLASS_P (classes[0]) == SSE_CLASS_P (classes[1]))) + { + // The argument is in a single register. + if (SSE_CLASS_P (classes[0])) + { + avalue[i] = ®_args->sse[ssecount]; + ssecount += n; + } + else + { + avalue[i] = ®_args->gpr[gprcount]; + gprcount += n; + } + } +#endif + + /* Otherwise, allocate space to make them consecutive. */ + else + { + char *a = alloca (16); + int j; + + avalue[i] = a; + + for (j = 0; j < n; j++, a += 8) + { + if (SSE_CLASS_P (classes[j])) + memcpy (a, ®_args->sse[ssecount++], 8); + else + memcpy (a, ®_args->gpr[gprcount++], 8); + } + } + } + + /* Invoke the closure. */ + closure->fun (cif, rvalue, avalue, closure->user_data); + + /* Tell assembly how to perform return type promotions. */ + return ret; +} + +#endif /* __x86_64__ */ diff -r -u ./Modules/_ctypes/libffi_osx/x86/x86-ffi_darwin.c ./Modules/_ctypes/libffi_osx/x86/x86-ffi_darwin.c new file mode 100644 index 0000000..706ea0f --- /dev/null +++ ./Modules/_ctypes/libffi_osx/x86/x86-ffi_darwin.c @@ -0,0 +1,438 @@ +#ifdef __i386__ +/* ----------------------------------------------------------------------- + ffi.c - Copyright (c) 1996, 1998, 1999, 2001 Red Hat, Inc. + Copyright (c) 2002 Ranjit Mathew + Copyright (c) 2002 Bo Thorsen + Copyright (c) 2002 Roger Sayle + + x86 Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#include +#include + +#include + +/* ffi_prep_args is called by the assembly routine once stack space + has been allocated for the function's arguments */ + +void ffi_prep_args(char *stack, extended_cif *ecif); + +void ffi_prep_args(char *stack, extended_cif *ecif) +{ + register unsigned int i; + register void **p_argv; + register char *argp; + register ffi_type **p_arg; + + argp = stack; + + if (ecif->cif->flags == FFI_TYPE_STRUCT) + { + *(void **) argp = ecif->rvalue; + argp += 4; + } + + p_argv = ecif->avalue; + + for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; + i != 0; + i--, p_arg++) + { + size_t z; + + /* Align if necessary */ + if ((sizeof(int) - 1) & (unsigned) argp) + argp = (char *) ALIGN(argp, sizeof(int)); + + z = (*p_arg)->size; + if (z < sizeof(int)) + { + z = sizeof(int); + switch ((*p_arg)->type) + { + case FFI_TYPE_SINT8: + *(signed int *) argp = (signed int)*(SINT8 *)(* p_argv); + break; + + case FFI_TYPE_UINT8: + *(unsigned int *) argp = (unsigned int)*(UINT8 *)(* p_argv); + break; + + case FFI_TYPE_SINT16: + *(signed int *) argp = (signed int)*(SINT16 *)(* p_argv); + break; + + case FFI_TYPE_UINT16: + *(unsigned int *) argp = (unsigned int)*(UINT16 *)(* p_argv); + break; + + case FFI_TYPE_SINT32: + *(signed int *) argp = (signed int)*(SINT32 *)(* p_argv); + break; + + case FFI_TYPE_UINT32: + *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv); + break; + + case FFI_TYPE_STRUCT: + *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv); + break; + + default: + FFI_ASSERT(0); + } + } + else + { + memcpy(argp, *p_argv, z); + } + p_argv++; + argp += z; + } + + return; +} + +/* Perform machine dependent cif processing */ +ffi_status ffi_prep_cif_machdep(ffi_cif *cif) +{ + /* Set the return type flag */ + switch (cif->rtype->type) + { + case FFI_TYPE_VOID: +#ifdef X86 + case FFI_TYPE_STRUCT: + case FFI_TYPE_UINT8: + case FFI_TYPE_UINT16: + case FFI_TYPE_SINT8: + case FFI_TYPE_SINT16: +#endif + + case FFI_TYPE_SINT64: + case FFI_TYPE_FLOAT: + case FFI_TYPE_DOUBLE: + case FFI_TYPE_LONGDOUBLE: + cif->flags = (unsigned) cif->rtype->type; + break; + + case FFI_TYPE_UINT64: + cif->flags = FFI_TYPE_SINT64; + break; + +#ifndef X86 + case FFI_TYPE_STRUCT: + if (cif->rtype->size == 1) + { + cif->flags = FFI_TYPE_SINT8; /* same as char size */ + } + else if (cif->rtype->size == 2) + { + cif->flags = FFI_TYPE_SINT16; /* same as short size */ + } + else if (cif->rtype->size == 4) + { + cif->flags = FFI_TYPE_INT; /* same as int type */ + } + else if (cif->rtype->size == 8) + { + cif->flags = FFI_TYPE_SINT64; /* same as int64 type */ + } + else + { + cif->flags = FFI_TYPE_STRUCT; + } + break; +#endif + + default: + cif->flags = FFI_TYPE_INT; + break; + } + +#ifdef X86_DARWIN + cif->bytes = (cif->bytes + 15) & ~0xF; +#endif + + return FFI_OK; +} + +extern void ffi_call_SYSV(void (*)(char *, extended_cif *), extended_cif *, + unsigned, unsigned, unsigned *, void (*fn)()); + +#ifdef X86_WIN32 +extern void ffi_call_STDCALL(void (*)(char *, extended_cif *), extended_cif *, + unsigned, unsigned, unsigned *, void (*fn)()); + +#endif /* X86_WIN32 */ + +void ffi_call(ffi_cif *cif, void (*fn)(), void *rvalue, void **avalue) +{ + extended_cif ecif; + + ecif.cif = cif; + ecif.avalue = avalue; + + /* If the return value is a struct and we don't have a return */ + /* value address then we need to make one */ + + if ((rvalue == NULL) && + (cif->flags == FFI_TYPE_STRUCT)) + { + ecif.rvalue = alloca(cif->rtype->size); + } + else + ecif.rvalue = rvalue; + + + switch (cif->abi) + { + case FFI_SYSV: + ffi_call_SYSV(ffi_prep_args, &ecif, cif->bytes, cif->flags, ecif.rvalue, + fn); + break; +#ifdef X86_WIN32 + case FFI_STDCALL: + ffi_call_STDCALL(ffi_prep_args, &ecif, cif->bytes, cif->flags, + ecif.rvalue, fn); + break; +#endif /* X86_WIN32 */ + default: + FFI_ASSERT(0); + break; + } +} + + +/** private members **/ + +static void ffi_prep_incoming_args_SYSV (char *stack, void **ret, + void** args, ffi_cif* cif); +void FFI_HIDDEN ffi_closure_SYSV (ffi_closure *) +__attribute__ ((regparm(1))); +unsigned int FFI_HIDDEN ffi_closure_SYSV_inner (ffi_closure *, void **, void *) +__attribute__ ((regparm(1))); +void FFI_HIDDEN ffi_closure_raw_SYSV (ffi_raw_closure *) +__attribute__ ((regparm(1))); + +/* This function is jumped to by the trampoline */ + +unsigned int FFI_HIDDEN +ffi_closure_SYSV_inner (closure, respp, args) +ffi_closure *closure; +void **respp; +void *args; +{ + // our various things... + ffi_cif *cif; + void **arg_area; + + cif = closure->cif; + arg_area = (void**) alloca (cif->nargs * sizeof (void*)); + + /* this call will initialize ARG_AREA, such that each + * element in that array points to the corresponding + * value on the stack; and if the function returns + * a structure, it will re-set RESP to point to the + * structure return address. */ + + ffi_prep_incoming_args_SYSV(args, respp, arg_area, cif); + + (closure->fun) (cif, *respp, arg_area, closure->user_data); + + return cif->flags; +} + +static void +ffi_prep_incoming_args_SYSV(char *stack, void **rvalue, void **avalue, + ffi_cif *cif) +{ + register unsigned int i; + register void **p_argv; + register char *argp; + register ffi_type **p_arg; + + argp = stack; + + if ( cif->flags == FFI_TYPE_STRUCT ) { + *rvalue = *(void **) argp; + argp += 4; + } + + p_argv = avalue; + + for (i = cif->nargs, p_arg = cif->arg_types; (i != 0); i--, p_arg++) + { + size_t z; + + /* Align if necessary */ + if ((sizeof(int) - 1) & (unsigned) argp) { + argp = (char *) ALIGN(argp, sizeof(int)); + } + + z = (*p_arg)->size; + + /* because we're little endian, this is what it turns into. */ + + *p_argv = (void*) argp; + + p_argv++; + argp += z; + } + + return; +} + +/* How to make a trampoline. Derived from gcc/config/i386/i386.c. */ + +#define FFI_INIT_TRAMPOLINE(TRAMP,FUN,CTX) \ +({ unsigned char *__tramp = (unsigned char*)(TRAMP); \ +unsigned int __fun = (unsigned int)(FUN); \ +unsigned int __ctx = (unsigned int)(CTX); \ +unsigned int __dis = __fun - (__ctx + FFI_TRAMPOLINE_SIZE); \ +*(unsigned char*) &__tramp[0] = 0xb8; \ +*(unsigned int*) &__tramp[1] = __ctx; /* movl __ctx, %eax */ \ +*(unsigned char *) &__tramp[5] = 0xe9; \ +*(unsigned int*) &__tramp[6] = __dis; /* jmp __fun */ \ +}) + + +/* the cif must already be prep'ed */ +ffi_status +ffi_prep_closure (ffi_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif*,void*,void**,void*), + void *user_data) +{ + if (cif->abi != FFI_SYSV) + return FFI_BAD_ABI; + + FFI_INIT_TRAMPOLINE (&closure->tramp[0], \ + &ffi_closure_SYSV, \ + (void*)closure); + + closure->cif = cif; + closure->user_data = user_data; + closure->fun = fun; + + return FFI_OK; +} + +/* ------- Native raw API support -------------------------------- */ + +#if !FFI_NO_RAW_API + +ffi_status +ffi_prep_raw_closure_loc (ffi_raw_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif*,void*,ffi_raw*,void*), + void *user_data, + void *codeloc) +{ + int i; + + FFI_ASSERT (cif->abi == FFI_SYSV); + + // we currently don't support certain kinds of arguments for raw + // closures. This should be implemented by a separate assembly language + // routine, since it would require argument processing, something we + // don't do now for performance. + + for (i = cif->nargs-1; i >= 0; i--) + { + FFI_ASSERT (cif->arg_types[i]->type != FFI_TYPE_STRUCT); + FFI_ASSERT (cif->arg_types[i]->type != FFI_TYPE_LONGDOUBLE); + } + + + FFI_INIT_TRAMPOLINE (&closure->tramp[0], &ffi_closure_raw_SYSV, + codeloc); + + closure->cif = cif; + closure->user_data = user_data; + closure->fun = fun; + + return FFI_OK; +} + +static void +ffi_prep_args_raw(char *stack, extended_cif *ecif) +{ + memcpy (stack, ecif->avalue, ecif->cif->bytes); +} + +/* we borrow this routine from libffi (it must be changed, though, to + * actually call the function passed in the first argument. as of + * libffi-1.20, this is not the case.) + */ + +extern void +ffi_call_SYSV(void (*)(char *, extended_cif *), extended_cif *, unsigned, + unsigned, unsigned *, void (*fn)()); + +#ifdef X86_WIN32 +extern void +ffi_call_STDCALL(void (*)(char *, extended_cif *), extended_cif *, unsigned, + unsigned, unsigned *, void (*fn)()); +#endif /* X86_WIN32 */ + +void +ffi_raw_call(ffi_cif *cif, void (*fn)(), void *rvalue, ffi_raw *fake_avalue) +{ + extended_cif ecif; + void **avalue = (void **)fake_avalue; + + ecif.cif = cif; + ecif.avalue = avalue; + + /* If the return value is a struct and we don't have a return */ + /* value address then we need to make one */ + + if ((rvalue == NULL) && + (cif->rtype->type == FFI_TYPE_STRUCT)) + { + ecif.rvalue = alloca(cif->rtype->size); + } + else + ecif.rvalue = rvalue; + + + switch (cif->abi) + { + case FFI_SYSV: + ffi_call_SYSV(ffi_prep_args_raw, &ecif, cif->bytes, cif->flags, + ecif.rvalue, fn); + break; +#ifdef X86_WIN32 + case FFI_STDCALL: + ffi_call_STDCALL(ffi_prep_args_raw, &ecif, cif->bytes, cif->flags, + ecif.rvalue, fn); + break; +#endif /* X86_WIN32 */ + default: + FFI_ASSERT(0); + break; + } +} + +#endif +#endif // __i386__ diff -r -u ./setup.py ./setup.py index 46b92fe..2bf6b4b 100644 --- ./setup.py +++ ./setup.py @@ -98,8 +98,14 @@ class PyBuildExt(build_ext): self.detect_modules() # Remove modules that are present on the disabled list - self.extensions = [ext for ext in self.extensions - if ext.name not in disabled_module_list] + extensions = [ext for ext in self.extensions + if ext.name not in disabled_module_list] + # move ctypes to the end, it depends on other modules + ext_map = dict((ext.name, i) for i, ext in enumerate(extensions)) + if "_ctypes" in ext_map: + ctypes = extensions.pop(ext_map["_ctypes"]) + extensions.append(ctypes) + self.extensions = extensions # Fix up the autodetected modules, prefixing all the source files # with Modules/ and adding Python's include directory to the path. @@ -1330,9 +1336,39 @@ class PyBuildExt(build_ext): # *** Uncomment these for TOGL extension only: # -lGL -lGLU -lXext -lXmu \ + def configure_ctypes_darwin(self, ext): + # Darwin (OS X) uses preconfigured files, in + # the Modules/_ctypes/libffi_osx directory. + srcdir = sysconfig.get_config_var('srcdir') + ffi_srcdir = os.path.abspath(os.path.join(srcdir, 'Modules', + '_ctypes', 'libffi_osx')) + sources = [os.path.join(ffi_srcdir, p) + for p in ['ffi.c', + 'x86/darwin64.S', + 'x86/x86-darwin.S', + 'x86/x86-ffi_darwin.c', + 'x86/x86-ffi64.c', + 'powerpc/ppc-darwin.S', + 'powerpc/ppc-darwin_closure.S', + 'powerpc/ppc-ffi_darwin.c', + 'powerpc/ppc64-darwin_closure.S', + ]] + + # Add .S (preprocessed assembly) to C compiler source extensions. + self.compiler.src_extensions.append('.S') + + include_dirs = [os.path.join(ffi_srcdir, 'include'), + os.path.join(ffi_srcdir, 'powerpc')] + ext.include_dirs.extend(include_dirs) + ext.sources.extend(sources) + return True + def configure_ctypes(self, ext): if not self.use_system_libffi: - (srcdir,) = sysconfig.get_config_vars('srcdir') + if sys.platform == 'darwin': + return self.configure_ctypes_darwin(ext) + + srcdir = sysconfig.get_config_var('srcdir') ffi_builddir = os.path.join(self.build_temp, 'libffi') ffi_srcdir = os.path.abspath(os.path.join(srcdir, 'Modules', '_ctypes', 'libffi')) @@ -1347,7 +1383,10 @@ class PyBuildExt(build_ext): ffi_configfile): from distutils.dir_util import mkpath mkpath(ffi_builddir) - config_args = [] + config_args = [arg for arg in sysconfig.get_config_var("CONFIG_ARGS").split() + if (('--host=' in arg) or ('--build=' in arg))] + if not self.verbose: + config_args.append("-q") # Pass empty CFLAGS because we'll just append the resulting # CFLAGS to Python's; -g or -O2 is to be avoided. @@ -1367,10 +1406,12 @@ class PyBuildExt(build_ext): self.compiler.src_extensions.append('.S') include_dirs = [os.path.join(ffi_builddir, 'include'), - ffi_builddir, ffi_srcdir] + ffi_builddir, + os.path.join(ffi_srcdir, 'src')] extra_compile_args = fficonfig['ffi_cflags'].split() - ext.sources.extend(fficonfig['ffi_sources']) + ext.sources.extend(os.path.join(ffi_srcdir, f) for f in + fficonfig['ffi_sources']) ext.include_dirs.extend(include_dirs) ext.extra_compile_args.extend(extra_compile_args) return True @@ -1390,6 +1431,7 @@ class PyBuildExt(build_ext): if sys.platform == 'darwin': sources.append('_ctypes/darwin/dlfcn_simple.c') + extra_compile_args.append('-DMACOSX') include_dirs.append('_ctypes/darwin') # XXX Is this still needed? ## extra_link_args.extend(['-read_only_relocs', 'warning']) @@ -1419,7 +1461,14 @@ class PyBuildExt(build_ext): if not '--with-system-ffi' in sysconfig.get_config_var("CONFIG_ARGS"): return - ffi_inc = find_file('ffi.h', [], inc_dirs) + if sys.platform == 'darwin': + # OS X 10.5 comes with libffi.dylib; the include files are + # in /usr/include/ffi + inc_dirs.append('/usr/include/ffi') + + ffi_inc = [sysconfig.get_config_var("LIBFFI_INCLUDEDIR")] + if not ffi_inc or ffi_inc[0] == '': + ffi_inc = find_file('ffi.h', [], inc_dirs) if ffi_inc is not None: ffi_h = ffi_inc[0] + '/ffi.h' fp = open(ffi_h) 005_osx_failed_modules.patch000066400000000000000000000076331517431316200353420ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.5.4/Python-2.5.4diff -r -u ./Mac/Modules/cg/_CGmodule.c ./Mac/Modules/cg/_CGmodule.c index 8115614..e36fce9 100755 --- ./Mac/Modules/cg/_CGmodule.c +++ ./Mac/Modules/cg/_CGmodule.c @@ -1025,6 +1025,7 @@ static PyObject *CGContextRefObj_CGContextSetShouldAntialias(CGContextRefObject return _res; } +#ifndef __LP64__ static PyObject *CGContextRefObj_SyncCGContextOriginWithPort(CGContextRefObject *_self, PyObject *_args) { PyObject *_res = NULL; @@ -1055,6 +1056,7 @@ static PyObject *CGContextRefObj_ClipCGContextToRegion(CGContextRefObject *_self _res = Py_None; return _res; } +#endif static PyMethodDef CGContextRefObj_methods[] = { {"CGContextSaveGState", (PyCFunction)CGContextRefObj_CGContextSaveGState, 1, @@ -1173,10 +1175,12 @@ static PyMethodDef CGContextRefObj_methods[] = { PyDoc_STR("() -> None")}, {"CGContextSetShouldAntialias", (PyCFunction)CGContextRefObj_CGContextSetShouldAntialias, 1, PyDoc_STR("(int shouldAntialias) -> None")}, +#ifndef __LP64__ {"SyncCGContextOriginWithPort", (PyCFunction)CGContextRefObj_SyncCGContextOriginWithPort, 1, PyDoc_STR("(CGrafPtr port) -> None")}, {"ClipCGContextToRegion", (PyCFunction)CGContextRefObj_ClipCGContextToRegion, 1, PyDoc_STR("(Rect portRect, RgnHandle region) -> None")}, +#endif {NULL, NULL, 0} }; @@ -1254,6 +1258,7 @@ PyTypeObject CGContextRef_Type = { /* ------------------ End object type CGContextRef ------------------ */ +#ifndef __LP64__ static PyObject *CG_CreateCGContextForPort(PyObject *_self, PyObject *_args) { PyObject *_res = NULL; @@ -1271,10 +1276,13 @@ static PyObject *CG_CreateCGContextForPort(PyObject *_self, PyObject *_args) return _res; } +#endif static PyMethodDef CG_methods[] = { +#ifndef __LP64__ {"CreateCGContextForPort", (PyCFunction)CG_CreateCGContextForPort, 1, PyDoc_STR("(CGrafPtr) -> CGContextRef")}, +#endif {NULL, NULL, 0} }; diff -r -u ./Modules/_curses_panel.c ./Modules/_curses_panel.c index 0acf3fd..1728b59 100644 --- ./Modules/_curses_panel.c +++ ./Modules/_curses_panel.c @@ -56,7 +56,7 @@ typedef struct { PyTypeObject PyCursesPanel_Type; -#define PyCursesPanel_Check(v) ((v)->ob_type == &PyCursesPanel_Type) +#define PyCursesPanel_Check(v) (Py_TYPE(v) == &PyCursesPanel_Type) /* Some helper functions. The problem is that there's always a window associated with a panel. To ensure that Python's GC doesn't pull @@ -178,12 +178,13 @@ PyCursesPanel_New(PANEL *pan, PyCursesWindowObject *wo) po = PyObject_NEW(PyCursesPanelObject, &PyCursesPanel_Type); if (po == NULL) return NULL; po->pan = pan; - po->wo = wo; - Py_INCREF(wo); if (insert_lop(po) < 0) { - PyObject_DEL(po); - return NULL; + po->wo = NULL; + Py_DECREF(po); + return NULL; } + po->wo = wo; + Py_INCREF(wo); return (PyObject *)po; } @@ -191,8 +192,10 @@ static void PyCursesPanel_Dealloc(PyCursesPanelObject *po) { (void)del_panel(po->pan); - Py_DECREF(po->wo); - remove_lop(po); + if (po->wo != NULL) { + Py_DECREF(po->wo); + remove_lop(po); + } PyObject_DEL(po); } @@ -338,11 +341,10 @@ PyCursesPanel_GetAttr(PyCursesPanelObject *self, char *name) /* -------------------------------------------------------*/ PyTypeObject PyCursesPanel_Type = { - PyObject_HEAD_INIT(NULL) - 0, /*ob_size*/ - "_curses_panel.curses panel", /*tp_name*/ - sizeof(PyCursesPanelObject), /*tp_basicsize*/ - 0, /*tp_itemsize*/ + PyVarObject_HEAD_INIT(NULL, 0) + "_curses_panel.curses panel", /*tp_name*/ + sizeof(PyCursesPanelObject), /*tp_basicsize*/ + 0, /*tp_itemsize*/ /* methods */ (destructor)PyCursesPanel_Dealloc, /*tp_dealloc*/ 0, /*tp_print*/ @@ -458,7 +460,7 @@ init_curses_panel(void) PyObject *m, *d, *v; /* Initialize object type */ - PyCursesPanel_Type.ob_type = &PyType_Type; + Py_TYPE(&PyCursesPanel_Type) = &PyType_Type; import_curses(); pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.5.5/000077500000000000000000000000001517431316200262125ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.5.5/Python-2.5.5/000077500000000000000000000000001517431316200301405ustar00rootroot00000000000000000_patch-setup.py.diff000066400000000000000000000035211517431316200341570ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.5.5/Python-2.5.5--- setup.py.orig 2011-07-07 19:19:43.800122463 +0900 +++ setup.py 2011-07-07 19:25:04.548416377 +0900 @@ -13,6 +13,7 @@ from distutils.command.build_ext import build_ext from distutils.command.install import install from distutils.command.install_lib import install_lib +from distutils.spawn import find_executable # This global variable is used to hold the list of modules to be disabled. disabled_module_list = [] @@ -242,10 +243,34 @@ return platform return sys.platform + def add_multiarch_paths(self): + # Debian/Ubuntu multiarch support. + # https://wiki.ubuntu.com/MultiarchSpec + if not find_executable('dpkg-architecture'): + return + tmpfile = os.path.join(self.build_temp, 'multiarch') + if not os.path.exists(self.build_temp): + os.makedirs(self.build_temp) + ret = os.system( + 'dpkg-architecture -qDEB_HOST_MULTIARCH > %s 2> /dev/null' % + tmpfile) + try: + if ret >> 8 == 0: + fp = open(tmpfile) + multiarch_path_component = fp.readline().strip() + fp.close() + add_dir_to_list(self.compiler.library_dirs, + '/usr/lib/' + multiarch_path_component) + add_dir_to_list(self.compiler.include_dirs, + '/usr/include/' + multiarch_path_component) + finally: + os.unlink(tmpfile) + def detect_modules(self): # Ensure that /usr/local is always used add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib') add_dir_to_list(self.compiler.include_dirs, '/usr/local/include') + self.add_multiarch_paths() # Add paths specified in the environment variables LDFLAGS and # CPPFLAGS for header and library files. 001_patch-svnversion.patch000066400000000000000000000023661517431316200350020ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.5.5/Python-2.5.5--- configure.in +++ configure.in @@ -767,7 +767,7 @@ then SVNVERSION="svnversion \$(srcdir)" else - SVNVERSION="echo exported" + SVNVERSION="echo Unversioned directory" fi case $MACHDEP in --- Makefile.pre.in +++ Makefile.pre.in @@ -501,7 +501,7 @@ $(SIGNAL_OBJS) \ $(MODOBJS) \ $(srcdir)/Modules/getbuildinfo.c - $(CC) -c $(PY_CFLAGS) -DSVNVERSION=\"`LC_ALL=C $(SVNVERSION)`\" -o $@ $(srcdir)/Modules/getbuildinfo.c + $(CC) -c $(PY_CFLAGS) -DSVNVERSION="\"`LC_ALL=C $(SVNVERSION)`\"" -o $@ $(srcdir)/Modules/getbuildinfo.c Modules/getpath.o: $(srcdir)/Modules/getpath.c Makefile $(CC) -c $(PY_CFLAGS) -DPYTHONPATH='"$(PYTHONPATH)"' \ --- Modules/getbuildinfo.c +++ Modules/getbuildinfo.c @@ -48,5 +48,5 @@ static const char svnversion[] = SVNVERSION; if (svnversion[0] != '$') return svnversion; /* it was interpolated, or passed on command line */ - return "exported"; + return "Unversioned directory"; } --- Python/sysmodule.c +++ Python/sysmodule.c @@ -1161,7 +1161,7 @@ svnversion = _Py_svnversion(); - if (strcmp(svnversion, "exported") != 0) + if (strcmp(svnversion, "Unversioned directory") != 0 && strcmp(svnversion, "exported") != 0) svn_revision = svnversion; else if (istag) { len = strlen(_patchlevel_revision); 002_darwin_c_source.patch000066400000000000000000000132671517431316200346420ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.5.5/Python-2.5.5diff -r -u ./configure ../Python-2.5/configure --- ./configure 2006-09-05 11:54:42.000000000 +0900 +++ ../Python-2.5/configure 2013-07-19 15:27:46.000000000 +0900 @@ -1396,6 +1396,16 @@ _ACEOF +# The later defininition of _XOPEN_SOURCE and _POSIX_C_SOURCE disables +# certain features on Mac OS X, so we need _DARWIN_C_SOURCE to re-enable +# them. + +cat >>confdefs.h <<\_ACEOF +#define _DARWIN_C_SOURCE 1 +_ACEOF + + + define_xopen_source=yes # Arguments passed to configure. @@ -3885,11 +3895,110 @@ ;; # is there any other compiler on Darwin besides gcc? Darwin*) - BASECFLAGS="$BASECFLAGS -Wno-long-double -no-cpp-precomp -mno-fused-madd" + # -Wno-long-double, -no-cpp-precomp, and -mno-fused-madd + # used to be here, but non-Apple gcc doesn't accept them. + if test "${CC}" = gcc + then + { echo "$as_me:${as_lineno-$LINENO}: checking which compiler should be used" >&5 +echo -n "checking which compiler should be used... " >&6; } + case "${UNIVERSALSDK}" in + */MacOSX10.4u.sdk) + # Build using 10.4 SDK, force usage of gcc when the + # compiler is gcc, otherwise the user will get very + # confusing error messages when building on OSX 10.6 + CC=gcc-4.0 + CPP=cpp-4.0 + ;; + esac + { echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +echo "$CC" >&6; } + fi + + if test "${enable_universalsdk}"; then - BASECFLAGS="-arch ppc -arch i386 -isysroot ${UNIVERSALSDK} ${BASECFLAGS}" + UNIVERSAL_ARCH_FLAGS="" + if test "$UNIVERSAL_ARCHS" = "32-bit" ; then + UNIVERSAL_ARCH_FLAGS="-arch ppc -arch i386" + ARCH_RUN_32BIT="" + LIPO_32BIT_FLAGS="" + elif test "$UNIVERSAL_ARCHS" = "64-bit" ; then + UNIVERSAL_ARCH_FLAGS="-arch ppc64 -arch x86_64" + LIPO_32BIT_FLAGS="" + ARCH_RUN_32BIT="true" + + elif test "$UNIVERSAL_ARCHS" = "all" ; then + UNIVERSAL_ARCH_FLAGS="-arch i386 -arch ppc -arch ppc64 -arch x86_64" + LIPO_32BIT_FLAGS="-extract ppc7400 -extract i386" + ARCH_RUN_32BIT="/usr/bin/arch -i386 -ppc" + + elif test "$UNIVERSAL_ARCHS" = "intel" ; then + UNIVERSAL_ARCH_FLAGS="-arch i386 -arch x86_64" + LIPO_32BIT_FLAGS="-extract i386" + ARCH_RUN_32BIT="/usr/bin/arch -i386" + + elif test "$UNIVERSAL_ARCHS" = "3-way" ; then + UNIVERSAL_ARCH_FLAGS="-arch i386 -arch ppc -arch x86_64" + LIPO_32BIT_FLAGS="-extract ppc7400 -extract i386" + ARCH_RUN_32BIT="/usr/bin/arch -i386 -ppc" + + else + as_fn_error $? "proper usage is --with-universal-arch=32-bit|64-bit|all|intel|3-way" "$LINENO" 5 + + fi + + + CFLAGS="${UNIVERSAL_ARCH_FLAGS} -isysroot ${UNIVERSALSDK} ${CFLAGS}" + if test "${UNIVERSALSDK}" != "/" + then + CFLAGS="-isysroot ${UNIVERSALSDK} ${CFLAGS}" + LDFLAGS="-isysroot ${UNIVERSALSDK} ${LDFLAGS}" + CPPFLAGS="-isysroot ${UNIVERSALSDK} ${CPPFLAGS}" + fi fi + # Calculate the right deployment target for this build. + # + cur_target=`sw_vers -productVersion | sed 's/\(10\.[0-9]*\).*/\1/'` + if test ${cur_target} '>' 10.2 && \ + test ${cur_target} '<' 10.6 + then + cur_target=10.3 + if test ${enable_universalsdk}; then + if test "${UNIVERSAL_ARCHS}" = "all"; then + # Ensure that the default platform for a + # 4-way universal build is OSX 10.5, + # that's the first OS release where + # 4-way builds make sense. + cur_target='10.5' + + elif test "${UNIVERSAL_ARCHS}" = "3-way"; then + cur_target='10.5' + + elif test "${UNIVERSAL_ARCHS}" = "intel"; then + cur_target='10.5' + + elif test "${UNIVERSAL_ARCHS}" = "64-bit"; then + cur_target='10.5' + fi + else + if test `/usr/bin/arch` = "i386"; then + # On Intel macs default to a deployment + # target of 10.4, that's the first OSX + # release with Intel support. + cur_target="10.4" + fi + fi + fi + CONFIGURE_MACOSX_DEPLOYMENT_TARGET=${MACOSX_DEPLOYMENT_TARGET-${cur_target}} + + # Make sure that MACOSX_DEPLOYMENT_TARGET is set in the + # environment with a value that is the same as what we'll use + # in the Makefile to ensure that we'll get the same compiler + # environment during configure and build time. + MACOSX_DEPLOYMENT_TARGET="$CONFIGURE_MACOSX_DEPLOYMENT_TARGET" + export MACOSX_DEPLOYMENT_TARGET + EXPORT_MACOSX_DEPLOYMENT_TARGET='' + ;; OSF*) BASECFLAGS="$BASECFLAGS -mieee" @@ -10851,7 +10960,7 @@ if test "${enable_universalsdk}"; then : else - LIBTOOL_CRUFT="${LIBTOOL_CRUFT} -arch_only `arch`" + LIBTOOL_CRUFT="${LIBTOOL_CRUFT}" fi LIBTOOL_CRUFT=$LIBTOOL_CRUFT' -install_name $(PYTHONFRAMEWORKINSTALLDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK)' LIBTOOL_CRUFT=$LIBTOOL_CRUFT' -compatibility_version $(VERSION) -current_version $(VERSION)';; @@ -10863,7 +10972,7 @@ else LIBTOOL_CRUFT="" fi - LIBTOOL_CRUFT=$LIBTOOL_CRUFT" -lSystem -lSystemStubs -arch_only `arch`" + LIBTOOL_CRUFT=$LIBTOOL_CRUFT" -lSystem -lSystemStubs" LIBTOOL_CRUFT=$LIBTOOL_CRUFT' -install_name $(PYTHONFRAMEWORKINSTALLDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK)' LIBTOOL_CRUFT=$LIBTOOL_CRUFT' -compatibility_version $(VERSION) -current_version $(VERSION)';; esac diff -r -u ./pyconfig.h.in ../Python-2.5/pyconfig.h.in --- ./pyconfig.h.in 2006-07-30 23:09:47.000000000 +0900 +++ ../Python-2.5/pyconfig.h.in 2013-07-17 23:12:31.000000000 +0900 @@ -912,6 +912,11 @@ /* Define on Irix to enable u_int */ #undef _BSD_TYPES +/* Define on Darwin to activate all library features */ +#ifndef _DARWIN_C_SOURCE +#define _DARWIN_C_SOURCE +#endif + /* This must be set to 64 on some systems to enable large file support. */ #undef _FILE_OFFSET_BITS 003_osx_lp64.patch000066400000000000000000000215441517431316200331500ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.5.5/Python-2.5.5diff -r -u ./Include/pymactoolbox.h ../Python-2.5/Include/pymactoolbox.h --- ./Include/pymactoolbox.h 2004-11-05 16:02:59.000000000 +0900 +++ ../Python-2.5/Include/pymactoolbox.h 2013-07-17 23:38:51.000000000 +0900 @@ -8,7 +8,10 @@ #endif #include + +#ifndef __LP64__ #include +#endif /* !__LP64__ */ /* ** Helper routines for error codes and such. @@ -18,8 +21,11 @@ PyObject *PyMac_GetOSErrException(void); /* Initialize & return it */ PyObject *PyErr_Mac(PyObject *, int); /* Exception with a mac error */ PyObject *PyMac_Error(OSErr); /* Uses PyMac_GetOSErrException */ +#ifndef __LP64__ extern OSErr PyMac_GetFullPathname(FSSpec *, char *, int); /* convert fsspec->path */ +#endif /* __LP64__ */ + /* ** These conversion routines are defined in mactoolboxglue.c itself. */ @@ -83,8 +89,10 @@ #endif /* USE_TOOLBOX_OBJECT_GLUE */ /* macfs exports */ +#ifndef __LP64__ int PyMac_GetFSSpec(PyObject *, FSSpec *); /* argument parser for FSSpec */ PyObject *PyMac_BuildFSSpec(FSSpec *); /* Convert FSSpec to PyObject */ +#endif /* !__LP64__ */ int PyMac_GetFSRef(PyObject *, FSRef *); /* argument parser for FSRef */ PyObject *PyMac_BuildFSRef(FSRef *); /* Convert FSRef to PyObject */ @@ -101,39 +109,54 @@ extern int CmpInstObj_Convert(PyObject *, ComponentInstance *); /* Ctl exports */ +#ifndef __LP64__ extern PyObject *CtlObj_New(ControlHandle); extern int CtlObj_Convert(PyObject *, ControlHandle *); +#endif /* !__LP64__ */ /* Dlg exports */ +#ifndef __LP64__ extern PyObject *DlgObj_New(DialogPtr); extern int DlgObj_Convert(PyObject *, DialogPtr *); extern PyObject *DlgObj_WhichDialog(DialogPtr); +#endif /* !__LP64__ */ /* Drag exports */ +#ifndef __LP64__ extern PyObject *DragObj_New(DragReference); extern int DragObj_Convert(PyObject *, DragReference *); +#endif /* !__LP64__ */ /* List exports */ +#ifndef __LP64__ extern PyObject *ListObj_New(ListHandle); extern int ListObj_Convert(PyObject *, ListHandle *); +#endif /* !__LP64__ */ /* Menu exports */ +#ifndef __LP64__ extern PyObject *MenuObj_New(MenuHandle); extern int MenuObj_Convert(PyObject *, MenuHandle *); +#endif /* !__LP64__ */ /* Qd exports */ +#ifndef __LP64__ extern PyObject *GrafObj_New(GrafPtr); extern int GrafObj_Convert(PyObject *, GrafPtr *); extern PyObject *BMObj_New(BitMapPtr); extern int BMObj_Convert(PyObject *, BitMapPtr *); extern PyObject *QdRGB_New(RGBColor *); extern int QdRGB_Convert(PyObject *, RGBColor *); +#endif /* !__LP64__ */ /* Qdoffs exports */ +#ifndef __LP64__ extern PyObject *GWorldObj_New(GWorldPtr); extern int GWorldObj_Convert(PyObject *, GWorldPtr *); +#endif /* !__LP64__ */ /* Qt exports */ +#ifndef __LP64__ extern PyObject *TrackObj_New(Track); extern int TrackObj_Convert(PyObject *, Track *); extern PyObject *MovieObj_New(Movie); @@ -146,6 +169,7 @@ extern int UserDataObj_Convert(PyObject *, UserData *); extern PyObject *MediaObj_New(Media); extern int MediaObj_Convert(PyObject *, Media *); +#endif /* !__LP64__ */ /* Res exports */ extern PyObject *ResObj_New(Handle); @@ -154,13 +178,17 @@ extern int OptResObj_Convert(PyObject *, Handle *); /* TE exports */ +#ifndef __LP64__ extern PyObject *TEObj_New(TEHandle); extern int TEObj_Convert(PyObject *, TEHandle *); +#endif /* !__LP64__ */ /* Win exports */ +#ifndef __LP64__ extern PyObject *WinObj_New(WindowPtr); extern int WinObj_Convert(PyObject *, WindowPtr *); extern PyObject *WinObj_WhichWindow(WindowPtr); +#endif /* !__LP64__ */ /* CF exports */ extern PyObject *CFObj_New(CFTypeRef); diff -r -u ./Mac/Modules/res/_Resmodule.c ../Python-2.5/Mac/Modules/res/_Resmodule.c --- ./Mac/Modules/res/_Resmodule.c 2005-07-04 05:59:44.000000000 +0900 +++ ../Python-2.5/Mac/Modules/res/_Resmodule.c 2013-07-17 23:38:51.000000000 +0900 @@ -414,6 +414,7 @@ return _res; } +#ifndef __LP64__ static PyObject *ResObj_as_Control(ResourceObject *_self, PyObject *_args) { PyObject *_res = NULL; @@ -431,6 +432,7 @@ return _res; } +#endif /* !__LP64__ */ static PyObject *ResObj_LoadResource(ResourceObject *_self, PyObject *_args) { @@ -1152,6 +1154,7 @@ return _res; } +#ifndef __LP64__ static PyObject *Res_OpenRFPerm(PyObject *_self, PyObject *_args) { PyObject *_res = NULL; @@ -1287,6 +1290,7 @@ _res = Py_None; return _res; } +#endif /* !__LP64__ */ static PyObject *Res_InsertResourceFile(PyObject *_self, PyObject *_args) { @@ -1327,6 +1331,7 @@ return _res; } +#ifndef __LP64__ static PyObject *Res_FSpResourceFileAlreadyOpen(PyObject *_self, PyObject *_args) { PyObject *_res = NULL; @@ -1413,6 +1418,7 @@ nextRefNum); return _res; } +#endif /* !__LP64__ */ static PyObject *Res_FSOpenResFile(PyObject *_self, PyObject *_args) { @@ -1438,6 +1444,7 @@ return _res; } +#ifndef __LP64__ static PyObject *Res_FSCreateResFile(PyObject *_self, PyObject *_args) { PyObject *_res = NULL; @@ -1534,6 +1541,7 @@ PyMac_BuildFSSpec, &newSpec); return _res; } +#endif /* __LP64__ */ static PyObject *Res_FSOpenResourceFile(PyObject *_self, PyObject *_args) { @@ -1637,6 +1645,7 @@ PyDoc_STR("(short refNum) -> (short _rv)")}, {"SetResFileAttrs", (PyCFunction)Res_SetResFileAttrs, 1, PyDoc_STR("(short refNum, short attrs) -> None")}, +#ifndef __LP64__ {"OpenRFPerm", (PyCFunction)Res_OpenRFPerm, 1, PyDoc_STR("(Str255 fileName, short vRefNum, SignedByte permission) -> (short _rv)")}, {"HOpenResFile", (PyCFunction)Res_HOpenResFile, 1, @@ -1647,10 +1656,12 @@ PyDoc_STR("(FSSpec spec, SignedByte permission) -> (short _rv)")}, {"FSpCreateResFile", (PyCFunction)Res_FSpCreateResFile, 1, PyDoc_STR("(FSSpec spec, OSType creator, OSType fileType, ScriptCode scriptTag) -> None")}, +#endif /* !__LP64__ */ {"InsertResourceFile", (PyCFunction)Res_InsertResourceFile, 1, PyDoc_STR("(SInt16 refNum, RsrcChainLocation where) -> None")}, {"DetachResourceFile", (PyCFunction)Res_DetachResourceFile, 1, PyDoc_STR("(SInt16 refNum) -> None")}, +#ifndef __LP64__ {"FSpResourceFileAlreadyOpen", (PyCFunction)Res_FSpResourceFileAlreadyOpen, 1, PyDoc_STR("(FSSpec resourceFile) -> (Boolean _rv, Boolean inChain, SInt16 refNum)")}, {"FSpOpenOrphanResFile", (PyCFunction)Res_FSpOpenOrphanResFile, 1, @@ -1659,14 +1670,17 @@ PyDoc_STR("() -> (SInt16 refNum)")}, {"GetNextResourceFile", (PyCFunction)Res_GetNextResourceFile, 1, PyDoc_STR("(SInt16 curRefNum) -> (SInt16 nextRefNum)")}, +#endif /* __LP64__ */ {"FSOpenResFile", (PyCFunction)Res_FSOpenResFile, 1, PyDoc_STR("(FSRef ref, SignedByte permission) -> (short _rv)")}, +#ifndef __LP64__ {"FSCreateResFile", (PyCFunction)Res_FSCreateResFile, 1, PyDoc_STR("(FSRef parentRef, Buffer nameLength) -> (FSRef newRef, FSSpec newSpec)")}, {"FSResourceFileAlreadyOpen", (PyCFunction)Res_FSResourceFileAlreadyOpen, 1, PyDoc_STR("(FSRef resourceFileRef) -> (Boolean _rv, Boolean inChain, SInt16 refNum)")}, {"FSCreateResourceFile", (PyCFunction)Res_FSCreateResourceFile, 1, PyDoc_STR("(FSRef parentRef, Buffer nameLength, Buffer forkNameLength) -> (FSRef newRef, FSSpec newSpec)")}, +#endif /* __LP64__ */ {"FSOpenResourceFile", (PyCFunction)Res_FSOpenResourceFile, 1, PyDoc_STR("(FSRef ref, Buffer forkNameLength, SignedByte permissions) -> (SInt16 refNum)")}, {"Handle", (PyCFunction)Res_Handle, 1, diff -r -u ./Modules/_ctypes/libffi/src/darwin/ffitarget.h ../Python-2.5/Modules/_ctypes/libffi/src/darwin/ffitarget.h --- ./Modules/_ctypes/libffi/src/darwin/ffitarget.h 2006-05-26 06:58:05.000000000 +0900 +++ ../Python-2.5/Modules/_ctypes/libffi/src/darwin/ffitarget.h 2013-07-17 23:38:51.000000000 +0900 @@ -4,7 +4,7 @@ * created by configure). This makes is possible to build a univeral binary * of ctypes in one go. */ -#if defined(__i386__) +#if defined(__i386__) || defined(__x86_64__) #ifndef X86_DARWIN #define X86_DARWIN diff -r -u ./Python/mactoolboxglue.c ../Python-2.5/Python/mactoolboxglue.c --- ./Python/mactoolboxglue.c 2006-07-12 01:44:25.000000000 +0900 +++ ../Python-2.5/Python/mactoolboxglue.c 2013-07-17 23:39:09.000000000 +0900 @@ -106,6 +106,7 @@ } +#ifndef __LP64__ OSErr PyMac_GetFullPathname(FSSpec *fss, char *path, int len) { @@ -153,6 +154,7 @@ Py_XDECREF(fs); return err; } +#endif /* !__LP64__ */ /* Convert a 4-char string object argument to an OSType value */ int @@ -417,6 +419,7 @@ GLUE_NEW(GWorldPtr, GWorldObj_New, "Carbon.Qdoffs") GLUE_CONVERT(GWorldPtr, GWorldObj_Convert, "Carbon.Qdoffs") +#ifndef __LP64__ GLUE_NEW(Track, TrackObj_New, "Carbon.Qt") GLUE_CONVERT(Track, TrackObj_Convert, "Carbon.Qt") GLUE_NEW(Movie, MovieObj_New, "Carbon.Qt") @@ -429,6 +432,7 @@ GLUE_CONVERT(UserData, UserDataObj_Convert, "Carbon.Qt") GLUE_NEW(Media, MediaObj_New, "Carbon.Qt") GLUE_CONVERT(Media, MediaObj_Convert, "Carbon.Qt") +#endif /* !__LP64__ */ GLUE_NEW(Handle, ResObj_New, "Carbon.Res") GLUE_CONVERT(Handle, ResObj_Convert, "Carbon.Res") 004_osx_libffi.patch000066400000000000000000005661361517431316200336320ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.5.5/Python-2.5.5diff -r -u ./Modules/_ctypes/libffi_osx/LICENSE ./Modules/_ctypes/libffi_osx/LICENSE new file mode 100644 index 0000000..f591795 --- /dev/null +++ ./Modules/_ctypes/libffi_osx/LICENSE @@ -0,0 +1,20 @@ +libffi - Copyright (c) 1996-2003 Red Hat, Inc. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +``Software''), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff -r -u ./Modules/_ctypes/libffi_osx/README ./Modules/_ctypes/libffi_osx/README new file mode 100644 index 0000000..1fc2747 --- /dev/null +++ ./Modules/_ctypes/libffi_osx/README @@ -0,0 +1,500 @@ +This directory contains the libffi package, which is not part of GCC but +shipped with GCC as convenience. + +Status +====== + +libffi-2.00 has not been released yet! This is a development snapshot! + +libffi-1.20 was released on October 5, 1998. Check the libffi web +page for updates: . + + +What is libffi? +=============== + +Compilers for high level languages generate code that follow certain +conventions. These conventions are necessary, in part, for separate +compilation to work. One such convention is the "calling +convention". The "calling convention" is essentially a set of +assumptions made by the compiler about where function arguments will +be found on entry to a function. A "calling convention" also specifies +where the return value for a function is found. + +Some programs may not know at the time of compilation what arguments +are to be passed to a function. For instance, an interpreter may be +told at run-time about the number and types of arguments used to call +a given function. Libffi can be used in such programs to provide a +bridge from the interpreter program to compiled code. + +The libffi library provides a portable, high level programming +interface to various calling conventions. This allows a programmer to +call any function specified by a call interface description at run +time. + +Ffi stands for Foreign Function Interface. A foreign function +interface is the popular name for the interface that allows code +written in one language to call code written in another language. The +libffi library really only provides the lowest, machine dependent +layer of a fully featured foreign function interface. A layer must +exist above libffi that handles type conversions for values passed +between the two languages. + + +Supported Platforms and Prerequisites +===================================== + +Libffi has been ported to: + + SunOS 4.1.3 & Solaris 2.x (SPARC-V8, SPARC-V9) + + Irix 5.3 & 6.2 (System V/o32 & n32) + + Intel x86 - Linux (System V ABI) + + Alpha - Linux and OSF/1 + + m68k - Linux (System V ABI) + + PowerPC - Linux (System V ABI, Darwin, AIX) + + ARM - Linux (System V ABI) + +Libffi has been tested with the egcs 1.0.2 gcc compiler. Chances are +that other versions will work. Libffi has also been built and tested +with the SGI compiler tools. + +On PowerPC, the tests failed (see the note below). + +You must use GNU make to build libffi. SGI's make will not work. +Sun's probably won't either. + +If you port libffi to another platform, please let me know! I assume +that some will be easy (x86 NetBSD), and others will be more difficult +(HP). + + +Installing libffi +================= + +[Note: before actually performing any of these installation steps, + you may wish to read the "Platform Specific Notes" below.] + +First you must configure the distribution for your particular +system. Go to the directory you wish to build libffi in and run the +"configure" program found in the root directory of the libffi source +distribution. + +You may want to tell configure where to install the libffi library and +header files. To do that, use the --prefix configure switch. Libffi +will install under /usr/local by default. + +If you want to enable extra run-time debugging checks use the the +--enable-debug configure switch. This is useful when your program dies +mysteriously while using libffi. + +Another useful configure switch is --enable-purify-safety. Using this +will add some extra code which will suppress certain warnings when you +are using Purify with libffi. Only use this switch when using +Purify, as it will slow down the library. + +Configure has many other options. Use "configure --help" to see them all. + +Once configure has finished, type "make". Note that you must be using +GNU make. SGI's make will not work. Sun's probably won't either. +You can ftp GNU make from prep.ai.mit.edu:/pub/gnu. + +To ensure that libffi is working as advertised, type "make test". + +To install the library and header files, type "make install". + + +Using libffi +============ + + The Basics + ---------- + +Libffi assumes that you have a pointer to the function you wish to +call and that you know the number and types of arguments to pass it, +as well as the return type of the function. + +The first thing you must do is create an ffi_cif object that matches +the signature of the function you wish to call. The cif in ffi_cif +stands for Call InterFace. To prepare a call interface object, use the +following function: + +ffi_status ffi_prep_cif(ffi_cif *cif, ffi_abi abi, + unsigned int nargs, + ffi_type *rtype, ffi_type **atypes); + + CIF is a pointer to the call interface object you wish + to initialize. + + ABI is an enum that specifies the calling convention + to use for the call. FFI_DEFAULT_ABI defaults + to the system's native calling convention. Other + ABI's may be used with care. They are system + specific. + + NARGS is the number of arguments this function accepts. + libffi does not yet support vararg functions. + + RTYPE is a pointer to an ffi_type structure that represents + the return type of the function. Ffi_type objects + describe the types of values. libffi provides + ffi_type objects for many of the native C types: + signed int, unsigned int, signed char, unsigned char, + etc. There is also a pointer ffi_type object and + a void ffi_type. Use &ffi_type_void for functions that + don't return values. + + ATYPES is a vector of ffi_type pointers. ARGS must be NARGS long. + If NARGS is 0, this is ignored. + + +ffi_prep_cif will return a status code that you are responsible +for checking. It will be one of the following: + + FFI_OK - All is good. + + FFI_BAD_TYPEDEF - One of the ffi_type objects that ffi_prep_cif + came across is bad. + + +Before making the call, the VALUES vector should be initialized +with pointers to the appropriate argument values. + +To call the function using the initialized ffi_cif, use the +ffi_call function: + +void ffi_call(ffi_cif *cif, void *fn, void *rvalue, void **avalues); + + CIF is a pointer to the ffi_cif initialized specifically + for this function. + + FN is a pointer to the function you want to call. + + RVALUE is a pointer to a chunk of memory that is to hold the + result of the function call. Currently, it must be + at least one word in size (except for the n32 version + under Irix 6.x, which must be a pointer to an 8 byte + aligned value (a long long). It must also be at least + word aligned (depending on the return type, and the + system's alignment requirements). If RTYPE is + &ffi_type_void, this is ignored. If RVALUE is NULL, + the return value is discarded. + + AVALUES is a vector of void* that point to the memory locations + holding the argument values for a call. + If NARGS is 0, this is ignored. + + +If you are expecting a return value from FN it will have been stored +at RVALUE. + + + + An Example + ---------- + +Here is a trivial example that calls puts() a few times. + + #include + #include + + int main() + { + ffi_cif cif; + ffi_type *args[1]; + void *values[1]; + char *s; + int rc; + + /* Initialize the argument info vectors */ + args[0] = &ffi_type_uint; + values[0] = &s; + + /* Initialize the cif */ + if (ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, + &ffi_type_uint, args) == FFI_OK) + { + s = "Hello World!"; + ffi_call(&cif, puts, &rc, values); + /* rc now holds the result of the call to puts */ + + /* values holds a pointer to the function's arg, so to + call puts() again all we need to do is change the + value of s */ + s = "This is cool!"; + ffi_call(&cif, puts, &rc, values); + } + + return 0; + } + + + + Aggregate Types + --------------- + +Although libffi has no special support for unions or bit-fields, it is +perfectly happy passing structures back and forth. You must first +describe the structure to libffi by creating a new ffi_type object +for it. Here is the definition of ffi_type: + + typedef struct _ffi_type + { + unsigned size; + short alignment; + short type; + struct _ffi_type **elements; + } ffi_type; + +All structures must have type set to FFI_TYPE_STRUCT. You may set +size and alignment to 0. These will be calculated and reset to the +appropriate values by ffi_prep_cif(). + +elements is a NULL terminated array of pointers to ffi_type objects +that describe the type of the structure elements. These may, in turn, +be structure elements. + +The following example initializes a ffi_type object representing the +tm struct from Linux's time.h: + + struct tm { + int tm_sec; + int tm_min; + int tm_hour; + int tm_mday; + int tm_mon; + int tm_year; + int tm_wday; + int tm_yday; + int tm_isdst; + /* Those are for future use. */ + long int __tm_gmtoff__; + __const char *__tm_zone__; + }; + + { + ffi_type tm_type; + ffi_type *tm_type_elements[12]; + int i; + + tm_type.size = tm_type.alignment = 0; + tm_type.elements = &tm_type_elements; + + for (i = 0; i < 9; i++) + tm_type_elements[i] = &ffi_type_sint; + + tm_type_elements[9] = &ffi_type_slong; + tm_type_elements[10] = &ffi_type_pointer; + tm_type_elements[11] = NULL; + + /* tm_type can now be used to represent tm argument types and + return types for ffi_prep_cif() */ + } + + + +Platform Specific Notes +======================= + + Intel x86 + --------- + +There are no known problems with the x86 port. + + Sun SPARC - SunOS 4.1.3 & Solaris 2.x + ------------------------------------- + +You must use GNU Make to build libffi on Sun platforms. + + MIPS - Irix 5.3 & 6.x + --------------------- + +Irix 6.2 and better supports three different calling conventions: o32, +n32 and n64. Currently, libffi only supports both o32 and n32 under +Irix 6.x, but only o32 under Irix 5.3. Libffi will automatically be +configured for whichever calling convention it was built for. + +By default, the configure script will try to build libffi with the GNU +development tools. To build libffi with the SGI development tools, set +the environment variable CC to either "cc -32" or "cc -n32" before +running configure under Irix 6.x (depending on whether you want an o32 +or n32 library), or just "cc" for Irix 5.3. + +With the n32 calling convention, when returning structures smaller +than 16 bytes, be sure to provide an RVALUE that is 8 byte aligned. +Here's one way of forcing this: + + double struct_storage[2]; + my_small_struct *s = (my_small_struct *) struct_storage; + /* Use s for RVALUE */ + +If you don't do this you are liable to get spurious bus errors. + +"long long" values are not supported yet. + +You must use GNU Make to build libffi on SGI platforms. + + ARM - System V ABI + ------------------ + +The ARM port was performed on a NetWinder running ARM Linux ELF +(2.0.31) and gcc 2.8.1. + + + + PowerPC System V ABI + -------------------- + +There are two `System V ABI's which libffi implements for PowerPC. +They differ only in how small structures are returned from functions. + +In the FFI_SYSV version, structures that are 8 bytes or smaller are +returned in registers. This is what GCC does when it is configured +for solaris, and is what the System V ABI I have (dated September +1995) says. + +In the FFI_GCC_SYSV version, all structures are returned the same way: +by passing a pointer as the first argument to the function. This is +what GCC does when it is configured for linux or a generic sysv +target. + +EGCS 1.0.1 (and probably other versions of EGCS/GCC) also has a +inconsistency with the SysV ABI: When a procedure is called with many +floating-point arguments, some of them get put on the stack. They are +all supposed to be stored in double-precision format, even if they are +only single-precision, but EGCS stores single-precision arguments as +single-precision anyway. This causes one test to fail (the `many +arguments' test). + + +What's With The Crazy Comments? +=============================== + +You might notice a number of cryptic comments in the code, delimited +by /*@ and @*/. These are annotations read by the program LCLint, a +tool for statically checking C programs. You can read all about it at +. + + +History +======= + +1.20 Oct-5-98 + Raffaele Sena produces ARM port. + +1.19 Oct-5-98 + Fixed x86 long double and long long return support. + m68k bug fixes from Andreas Schwab. + Patch for DU assembler compatibility for the Alpha from Richard + Henderson. + +1.18 Apr-17-98 + Bug fixes and MIPS configuration changes. + +1.17 Feb-24-98 + Bug fixes and m68k port from Andreas Schwab. PowerPC port from + Geoffrey Keating. Various bug x86, Sparc and MIPS bug fixes. + +1.16 Feb-11-98 + Richard Henderson produces Alpha port. + +1.15 Dec-4-97 + Fixed an n32 ABI bug. New libtool, auto* support. + +1.14 May-13-97 + libtool is now used to generate shared and static libraries. + Fixed a minor portability problem reported by Russ McManus + . + +1.13 Dec-2-96 + Added --enable-purify-safety to keep Purify from complaining + about certain low level code. + Sparc fix for calling functions with < 6 args. + Linux x86 a.out fix. + +1.12 Nov-22-96 + Added missing ffi_type_void, needed for supporting void return + types. Fixed test case for non MIPS machines. Cygnus Support + is now Cygnus Solutions. + +1.11 Oct-30-96 + Added notes about GNU make. + +1.10 Oct-29-96 + Added configuration fix for non GNU compilers. + +1.09 Oct-29-96 + Added --enable-debug configure switch. Clean-ups based on LCLint + feedback. ffi_mips.h is always installed. Many configuration + fixes. Fixed ffitest.c for sparc builds. + +1.08 Oct-15-96 + Fixed n32 problem. Many clean-ups. + +1.07 Oct-14-96 + Gordon Irlam rewrites v8.S again. Bug fixes. + +1.06 Oct-14-96 + Gordon Irlam improved the sparc port. + +1.05 Oct-14-96 + Interface changes based on feedback. + +1.04 Oct-11-96 + Sparc port complete (modulo struct passing bug). + +1.03 Oct-10-96 + Passing struct args, and returning struct values works for + all architectures/calling conventions. Expanded tests. + +1.02 Oct-9-96 + Added SGI n32 support. Fixed bugs in both o32 and Linux support. + Added "make test". + +1.01 Oct-8-96 + Fixed float passing bug in mips version. Restructured some + of the code. Builds cleanly with SGI tools. + +1.00 Oct-7-96 + First release. No public announcement. + + +Authors & Credits +================= + +libffi was written by Anthony Green . + +Portions of libffi were derived from Gianni Mariani's free gencall +library for Silicon Graphics machines. + +The closure mechanism was designed and implemented by Kresten Krab +Thorup. + +The Sparc port was derived from code contributed by the fine folks at +Visible Decisions Inc . Further enhancements were +made by Gordon Irlam at Cygnus Solutions . + +The Alpha port was written by Richard Henderson at Cygnus Solutions. + +Andreas Schwab ported libffi to m68k Linux and provided a number of +bug fixes. + +Geoffrey Keating ported libffi to the PowerPC. + +Raffaele Sena ported libffi to the ARM. + +Jesper Skov and Andrew Haley both did more than their fair share of +stepping through the code and tracking down bugs. + +Thanks also to Tom Tromey for bug fixes and configuration help. + +Thanks to Jim Blandy, who provided some useful feedback on the libffi +interface. + +If you have a problem, or have found a bug, please send a note to +green@cygnus.com. diff -r -u ./Modules/_ctypes/libffi_osx/README.pyobjc ./Modules/_ctypes/libffi_osx/README.pyobjc new file mode 100644 index 0000000..405d85f --- /dev/null +++ ./Modules/_ctypes/libffi_osx/README.pyobjc @@ -0,0 +1,5 @@ +This directory contains a slightly modified version of libffi, extracted from +the GCC source-tree. + +The only modifications are those that are necessary to compile libffi using +the Apple provided compiler and outside of the GCC source tree. diff -r -u ./Modules/_ctypes/libffi_osx/ffi.c ./Modules/_ctypes/libffi_osx/ffi.c new file mode 100644 index 0000000..bf42093 --- /dev/null +++ ./Modules/_ctypes/libffi_osx/ffi.c @@ -0,0 +1,226 @@ +/* ----------------------------------------------------------------------- + prep_cif.c - Copyright (c) 1996, 1998 Red Hat, Inc. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#include +#include + +#include +#include + +/* Round up to FFI_SIZEOF_ARG. */ +#define STACK_ARG_SIZE(x) ALIGN(x, FFI_SIZEOF_ARG) + +/* Perform machine independent initialization of aggregate type + specifications. */ + +static ffi_status +initialize_aggregate( +/*@out@*/ ffi_type* arg) +{ +/*@-usedef@*/ + + if (arg == NULL || arg->elements == NULL || + arg->size != 0 || arg->alignment != 0) + return FFI_BAD_TYPEDEF; + + ffi_type** ptr = &(arg->elements[0]); + + while ((*ptr) != NULL) + { + if (((*ptr)->size == 0) && (initialize_aggregate(*ptr) != FFI_OK)) + return FFI_BAD_TYPEDEF; + + /* Perform a sanity check on the argument type */ + FFI_ASSERT_VALID_TYPE(*ptr); + +#ifdef POWERPC_DARWIN + int curalign = (*ptr)->alignment; + + if (ptr != &(arg->elements[0])) + { + if (curalign > 4 && curalign != 16) + curalign = 4; + } + + arg->size = ALIGN(arg->size, curalign); + arg->size += (*ptr)->size; + arg->alignment = (arg->alignment > curalign) ? + arg->alignment : curalign; +#else + arg->size = ALIGN(arg->size, (*ptr)->alignment); + arg->size += (*ptr)->size; + arg->alignment = (arg->alignment > (*ptr)->alignment) ? + arg->alignment : (*ptr)->alignment; +#endif + + ptr++; + } + + /* Structure size includes tail padding. This is important for + structures that fit in one register on ABIs like the PowerPC64 + Linux ABI that right justify small structs in a register. + It's also needed for nested structure layout, for example + struct A { long a; char b; }; struct B { struct A x; char y; }; + should find y at an offset of 2*sizeof(long) and result in a + total size of 3*sizeof(long). */ + arg->size = ALIGN(arg->size, arg->alignment); + + if (arg->size == 0) + return FFI_BAD_TYPEDEF; + + return FFI_OK; + +/*@=usedef@*/ +} + +#ifndef __CRIS__ +/* The CRIS ABI specifies structure elements to have byte + alignment only, so it completely overrides this functions, + which assumes "natural" alignment and padding. */ + +/* Perform machine independent ffi_cif preparation, then call + machine dependent routine. */ + +#if defined(X86_DARWIN) + +static inline bool +struct_on_stack( + int size) +{ + if (size > 8) + return true; + + /* This is not what the ABI says, but is what is really implemented */ + switch (size) + { + case 1: + case 2: + case 4: + case 8: + return false; + + default: + return true; + } +} + +#endif // defined(X86_DARWIN) + +// Arguments' ffi_type->alignment must be nonzero. +ffi_status +ffi_prep_cif( +/*@out@*/ /*@partial@*/ ffi_cif* cif, + ffi_abi abi, + unsigned int nargs, +/*@dependent@*/ /*@out@*/ /*@partial@*/ ffi_type* rtype, +/*@dependent@*/ ffi_type** atypes) +{ + if (cif == NULL) + return FFI_BAD_TYPEDEF; + + if (abi <= FFI_FIRST_ABI || abi > FFI_DEFAULT_ABI) + return FFI_BAD_ABI; + + unsigned int bytes = 0; + unsigned int i; + ffi_type** ptr; + + cif->abi = abi; + cif->arg_types = atypes; + cif->nargs = nargs; + cif->rtype = rtype; + cif->flags = 0; + + /* Initialize the return type if necessary */ + /*@-usedef@*/ + if ((cif->rtype->size == 0) && (initialize_aggregate(cif->rtype) != FFI_OK)) + return FFI_BAD_TYPEDEF; + /*@=usedef@*/ + + /* Perform a sanity check on the return type */ + FFI_ASSERT_VALID_TYPE(cif->rtype); + + /* x86-64 and s390 stack space allocation is handled in prep_machdep. */ +#if !defined M68K && !defined __x86_64__ && !defined S390 && !defined PA + /* Make space for the return structure pointer */ + if (cif->rtype->type == FFI_TYPE_STRUCT +#ifdef SPARC + && (cif->abi != FFI_V9 || cif->rtype->size > 32) +#endif +#ifdef X86_DARWIN + && (struct_on_stack(cif->rtype->size)) +#endif + ) + bytes = STACK_ARG_SIZE(sizeof(void*)); +#endif + + for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++) + { + /* Initialize any uninitialized aggregate type definitions */ + if (((*ptr)->size == 0) && (initialize_aggregate((*ptr)) != FFI_OK)) + return FFI_BAD_TYPEDEF; + + if ((*ptr)->alignment == 0) + return FFI_BAD_TYPEDEF; + + /* Perform a sanity check on the argument type, do this + check after the initialization. */ + FFI_ASSERT_VALID_TYPE(*ptr); + +#if defined(X86_DARWIN) + { + int align = (*ptr)->alignment; + + if (align > 4) + align = 4; + + if ((align - 1) & bytes) + bytes = ALIGN(bytes, align); + + bytes += STACK_ARG_SIZE((*ptr)->size); + } +#elif !defined __x86_64__ && !defined S390 && !defined PA +#ifdef SPARC + if (((*ptr)->type == FFI_TYPE_STRUCT + && ((*ptr)->size > 16 || cif->abi != FFI_V9)) + || ((*ptr)->type == FFI_TYPE_LONGDOUBLE + && cif->abi != FFI_V9)) + bytes += sizeof(void*); + else +#endif + { + /* Add any padding if necessary */ + if (((*ptr)->alignment - 1) & bytes) + bytes = ALIGN(bytes, (*ptr)->alignment); + + bytes += STACK_ARG_SIZE((*ptr)->size); + } +#endif + } + + cif->bytes = bytes; + + /* Perform machine dependent cif processing */ + return ffi_prep_cif_machdep(cif); +} +#endif /* not __CRIS__ */ diff -r -u ./Modules/_ctypes/libffi_osx/include/ffi.h ./Modules/_ctypes/libffi_osx/include/ffi.h new file mode 100644 index 0000000..c104a5c --- /dev/null +++ ./Modules/_ctypes/libffi_osx/include/ffi.h @@ -0,0 +1,355 @@ +/* -----------------------------------------------------------------*-C-*- + libffi PyOBJC - Copyright (c) 1996-2003 Red Hat, Inc. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + ----------------------------------------------------------------------- */ + +/* ------------------------------------------------------------------- + The basic API is described in the README file. + + The raw API is designed to bypass some of the argument packing + and unpacking on architectures for which it can be avoided. + + The closure API allows interpreted functions to be packaged up + inside a C function pointer, so that they can be called as C functions, + with no understanding on the client side that they are interpreted. + It can also be used in other cases in which it is necessary to package + up a user specified parameter and a function pointer as a single + function pointer. + + The closure API must be implemented in order to get its functionality, + e.g. for use by gij. Routines are provided to emulate the raw API + if the underlying platform doesn't allow faster implementation. + + More details on the raw and closure API can be found in: + + http://gcc.gnu.org/ml/java/1999-q3/msg00138.html + + and + + http://gcc.gnu.org/ml/java/1999-q3/msg00174.html + -------------------------------------------------------------------- */ + +#ifndef LIBFFI_H +#define LIBFFI_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Specify which architecture libffi is configured for. */ +#ifdef MACOSX +# if defined(__i386__) || defined(__x86_64__) +# define X86_DARWIN +# elif defined(__ppc__) || defined(__ppc64__) +# define POWERPC_DARWIN +# else +# error "Unsupported MacOS X CPU type" +# endif +#else +#error "Unsupported OS type" +#endif + +/* ---- System configuration information --------------------------------- */ + +#include "ffitarget.h" +#include "fficonfig.h" + +#ifndef LIBFFI_ASM + +#include +#include + +/* LONG_LONG_MAX is not always defined (not if STRICT_ANSI, for example). + But we can find it either under the correct ANSI name, or under GNU + C's internal name. */ +#ifdef LONG_LONG_MAX +# define FFI_LONG_LONG_MAX LONG_LONG_MAX +#else +# ifdef LLONG_MAX +# define FFI_LONG_LONG_MAX LLONG_MAX +# else +# ifdef __GNUC__ +# define FFI_LONG_LONG_MAX __LONG_LONG_MAX__ +# endif +# endif +#endif + +#if SCHAR_MAX == 127 +# define ffi_type_uchar ffi_type_uint8 +# define ffi_type_schar ffi_type_sint8 +#else +#error "char size not supported" +#endif + +#if SHRT_MAX == 32767 +# define ffi_type_ushort ffi_type_uint16 +# define ffi_type_sshort ffi_type_sint16 +#elif SHRT_MAX == 2147483647 +# define ffi_type_ushort ffi_type_uint32 +# define ffi_type_sshort ffi_type_sint32 +#else +#error "short size not supported" +#endif + +#if INT_MAX == 32767 +# define ffi_type_uint ffi_type_uint16 +# define ffi_type_sint ffi_type_sint16 +#elif INT_MAX == 2147483647 +# define ffi_type_uint ffi_type_uint32 +# define ffi_type_sint ffi_type_sint32 +#elif INT_MAX == 9223372036854775807 +# define ffi_type_uint ffi_type_uint64 +# define ffi_type_sint ffi_type_sint64 +#else +#error "int size not supported" +#endif + +#define ffi_type_ulong ffi_type_uint64 +#define ffi_type_slong ffi_type_sint64 + +#if LONG_MAX == 2147483647 +# if FFI_LONG_LONG_MAX != 9223372036854775807 +# error "no 64-bit data type supported" +# endif +#elif LONG_MAX != 9223372036854775807 +#error "long size not supported" +#endif + +/* The closure code assumes that this works on pointers, i.e. a size_t + can hold a pointer. */ + +typedef struct _ffi_type { + size_t size; + unsigned short alignment; + unsigned short type; +/*@null@*/ struct _ffi_type** elements; +} ffi_type; + +/* These are defined in types.c */ +extern ffi_type ffi_type_void; +extern ffi_type ffi_type_uint8; +extern ffi_type ffi_type_sint8; +extern ffi_type ffi_type_uint16; +extern ffi_type ffi_type_sint16; +extern ffi_type ffi_type_uint32; +extern ffi_type ffi_type_sint32; +extern ffi_type ffi_type_uint64; +extern ffi_type ffi_type_sint64; +extern ffi_type ffi_type_float; +extern ffi_type ffi_type_double; +extern ffi_type ffi_type_longdouble; +extern ffi_type ffi_type_pointer; + +typedef enum ffi_status { + FFI_OK = 0, + FFI_BAD_TYPEDEF, + FFI_BAD_ABI +} ffi_status; + +typedef unsigned FFI_TYPE; + +typedef struct ffi_cif { + ffi_abi abi; + unsigned nargs; +/*@dependent@*/ ffi_type** arg_types; +/*@dependent@*/ ffi_type* rtype; + unsigned bytes; + unsigned flags; +#ifdef FFI_EXTRA_CIF_FIELDS + FFI_EXTRA_CIF_FIELDS; +#endif +} ffi_cif; + +/* ---- Definitions for the raw API -------------------------------------- */ + +#ifndef FFI_SIZEOF_ARG +# if LONG_MAX == 2147483647 +# define FFI_SIZEOF_ARG 4 +# elif LONG_MAX == 9223372036854775807 +# define FFI_SIZEOF_ARG 8 +# endif +#endif + +typedef union { + ffi_sarg sint; + ffi_arg uint; + float flt; + char data[FFI_SIZEOF_ARG]; + void* ptr; +} ffi_raw; + +void +ffi_raw_call( +/*@dependent@*/ ffi_cif* cif, + void (*fn)(void), +/*@out@*/ void* rvalue, +/*@dependent@*/ ffi_raw* avalue); + +void +ffi_ptrarray_to_raw( + ffi_cif* cif, + void** args, + ffi_raw* raw); + +void +ffi_raw_to_ptrarray( + ffi_cif* cif, + ffi_raw* raw, + void** args); + +size_t +ffi_raw_size( + ffi_cif* cif); + +/* This is analogous to the raw API, except it uses Java parameter + packing, even on 64-bit machines. I.e. on 64-bit machines + longs and doubles are followed by an empty 64-bit word. */ +void +ffi_java_raw_call( +/*@dependent@*/ ffi_cif* cif, + void (*fn)(void), +/*@out@*/ void* rvalue, +/*@dependent@*/ ffi_raw* avalue); + +void +ffi_java_ptrarray_to_raw( + ffi_cif* cif, + void** args, + ffi_raw* raw); + +void +ffi_java_raw_to_ptrarray( + ffi_cif* cif, + ffi_raw* raw, + void** args); + +size_t +ffi_java_raw_size( + ffi_cif* cif); + +/* ---- Definitions for closures ----------------------------------------- */ + +#if FFI_CLOSURES + +typedef struct ffi_closure { + char tramp[FFI_TRAMPOLINE_SIZE]; + ffi_cif* cif; + void (*fun)(ffi_cif*,void*,void**,void*); + void* user_data; +} ffi_closure; + +ffi_status +ffi_prep_closure( + ffi_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif*,void*,void**,void*), + void* user_data); + +void ffi_closure_free(void *); +void *ffi_closure_alloc (size_t size, void **code); + +typedef struct ffi_raw_closure { + char tramp[FFI_TRAMPOLINE_SIZE]; + ffi_cif* cif; + +#if !FFI_NATIVE_RAW_API + /* if this is enabled, then a raw closure has the same layout + as a regular closure. We use this to install an intermediate + handler to do the transaltion, void** -> ffi_raw*. */ + void (*translate_args)(ffi_cif*,void*,void**,void*); + void* this_closure; +#endif + + void (*fun)(ffi_cif*,void*,ffi_raw*,void*); + void* user_data; +} ffi_raw_closure; + +ffi_status +ffi_prep_raw_closure( + ffi_raw_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif*,void*,ffi_raw*,void*), + void* user_data); + +ffi_status +ffi_prep_java_raw_closure( + ffi_raw_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif*,void*,ffi_raw*,void*), + void* user_data); + +#endif // FFI_CLOSURES + +/* ---- Public interface definition -------------------------------------- */ + +ffi_status +ffi_prep_cif( +/*@out@*/ /*@partial@*/ ffi_cif* cif, + ffi_abi abi, + unsigned int nargs, +/*@dependent@*/ /*@out@*/ /*@partial@*/ ffi_type* rtype, +/*@dependent@*/ ffi_type** atypes); + +void +ffi_call( +/*@dependent@*/ ffi_cif* cif, + void (*fn)(void), +/*@out@*/ void* rvalue, +/*@dependent@*/ void** avalue); + +/* Useful for eliminating compiler warnings */ +#define FFI_FN(f) ((void (*)(void))f) + +#endif // #ifndef LIBFFI_ASM +/* ---- Definitions shared with assembly code ---------------------------- */ + +/* If these change, update src/mips/ffitarget.h. */ +#define FFI_TYPE_VOID 0 +#define FFI_TYPE_INT 1 +#define FFI_TYPE_FLOAT 2 +#define FFI_TYPE_DOUBLE 3 + +#ifdef HAVE_LONG_DOUBLE +# define FFI_TYPE_LONGDOUBLE 4 +#else +# define FFI_TYPE_LONGDOUBLE FFI_TYPE_DOUBLE +#endif + +#define FFI_TYPE_UINT8 5 +#define FFI_TYPE_SINT8 6 +#define FFI_TYPE_UINT16 7 +#define FFI_TYPE_SINT16 8 +#define FFI_TYPE_UINT32 9 +#define FFI_TYPE_SINT32 10 +#define FFI_TYPE_UINT64 11 +#define FFI_TYPE_SINT64 12 +#define FFI_TYPE_STRUCT 13 +#define FFI_TYPE_POINTER 14 + +/* This should always refer to the last type code (for sanity checks) */ +#define FFI_TYPE_LAST FFI_TYPE_POINTER + +#ifdef __cplusplus +} +#endif + +#endif // #ifndef LIBFFI_H diff -r -u ./Modules/_ctypes/libffi_osx/include/ffi_common.h ./Modules/_ctypes/libffi_osx/include/ffi_common.h new file mode 100644 index 0000000..685a358 --- /dev/null +++ ./Modules/_ctypes/libffi_osx/include/ffi_common.h @@ -0,0 +1,102 @@ +/* ----------------------------------------------------------------------- + ffi_common.h - Copyright (c) 1996 Red Hat, Inc. + + Common internal definitions and macros. Only necessary for building + libffi. + ----------------------------------------------------------------------- */ + +#ifndef FFI_COMMON_H +#define FFI_COMMON_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "fficonfig.h" + +/* Do not move this. Some versions of AIX are very picky about where + this is positioned. */ +#ifdef __GNUC__ +# define alloca __builtin_alloca +#else +# if HAVE_ALLOCA_H +# include +# else +# ifdef _AIX +# pragma alloca +# else +# ifndef alloca /* predefined by HP cc +Olibcalls */ +char* alloca(); +# endif +# endif +# endif +#endif + +/* Check for the existence of memcpy. */ +#if STDC_HEADERS +# include +#else +# ifndef HAVE_MEMCPY +# define memcpy(d, s, n) bcopy((s), (d), (n)) +# endif +#endif + +/*#if defined(FFI_DEBUG) +#include +#endif*/ + +#ifdef FFI_DEBUG +#include + +/*@exits@*/ void +ffi_assert( +/*@temp@*/ char* expr, +/*@temp@*/ char* file, + int line); +void +ffi_stop_here(void); +void +ffi_type_test( +/*@temp@*/ /*@out@*/ ffi_type* a, +/*@temp@*/ char* file, + int line); + +# define FFI_ASSERT(x) ((x) ? (void)0 : ffi_assert(#x, __FILE__,__LINE__)) +# define FFI_ASSERT_AT(x, f, l) ((x) ? 0 : ffi_assert(#x, (f), (l))) +# define FFI_ASSERT_VALID_TYPE(x) ffi_type_test(x, __FILE__, __LINE__) +#else +# define FFI_ASSERT(x) +# define FFI_ASSERT_AT(x, f, l) +# define FFI_ASSERT_VALID_TYPE(x) +#endif // #ifdef FFI_DEBUG + +#define ALIGN(v, a) (((size_t)(v) + (a) - 1) & ~((a) - 1)) + +/* Perform machine dependent cif processing */ +ffi_status +ffi_prep_cif_machdep( + ffi_cif* cif); + +/* Extended cif, used in callback from assembly routine */ +typedef struct extended_cif { +/*@dependent@*/ ffi_cif* cif; +/*@dependent@*/ void* rvalue; +/*@dependent@*/ void** avalue; +} extended_cif; + +/* Terse sized type definitions. */ +typedef unsigned int UINT8 __attribute__((__mode__(__QI__))); +typedef signed int SINT8 __attribute__((__mode__(__QI__))); +typedef unsigned int UINT16 __attribute__((__mode__(__HI__))); +typedef signed int SINT16 __attribute__((__mode__(__HI__))); +typedef unsigned int UINT32 __attribute__((__mode__(__SI__))); +typedef signed int SINT32 __attribute__((__mode__(__SI__))); +typedef unsigned int UINT64 __attribute__((__mode__(__DI__))); +typedef signed int SINT64 __attribute__((__mode__(__DI__))); +typedef float FLOAT32; + +#ifdef __cplusplus +} +#endif + +#endif // #ifndef FFI_COMMON_H \ No newline at end of file diff -r -u ./Modules/_ctypes/libffi_osx/include/fficonfig.h ./Modules/_ctypes/libffi_osx/include/fficonfig.h new file mode 100644 index 0000000..2172490 --- /dev/null +++ ./Modules/_ctypes/libffi_osx/include/fficonfig.h @@ -0,0 +1,150 @@ +/* Manually created fficonfig.h for Darwin on PowerPC or Intel + + This file is manually generated to do away with the need for autoconf and + therefore make it easier to cross-compile and build fat binaries. + + NOTE: This file was added by PyObjC. +*/ + +#ifndef MACOSX +#error "This file is only supported on Mac OS X" +#endif + +#if defined(__i386__) +# define BYTEORDER 1234 +# undef HOST_WORDS_BIG_ENDIAN +# undef WORDS_BIGENDIAN +# define SIZEOF_DOUBLE 8 +# define HAVE_LONG_DOUBLE 1 +# define SIZEOF_LONG_DOUBLE 16 + +#elif defined(__x86_64__) +# define BYTEORDER 1234 +# undef HOST_WORDS_BIG_ENDIAN +# undef WORDS_BIGENDIAN +# define SIZEOF_DOUBLE 8 +# define HAVE_LONG_DOUBLE 1 +# define SIZEOF_LONG_DOUBLE 16 + +#elif defined(__ppc__) +# define BYTEORDER 4321 +# define HOST_WORDS_BIG_ENDIAN 1 +# define WORDS_BIGENDIAN 1 +# define SIZEOF_DOUBLE 8 +# if __GNUC__ >= 4 +# define HAVE_LONG_DOUBLE 1 +# define SIZEOF_LONG_DOUBLE 16 +# else +# undef HAVE_LONG_DOUBLE +# define SIZEOF_LONG_DOUBLE 8 +# endif + +#elif defined(__ppc64__) +# define BYTEORDER 4321 +# define HOST_WORDS_BIG_ENDIAN 1 +# define WORDS_BIGENDIAN 1 +# define SIZEOF_DOUBLE 8 +# define HAVE_LONG_DOUBLE 1 +# define SIZEOF_LONG_DOUBLE 16 + +#else +#error "Unknown CPU type" +#endif + +/* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP + systems. This function is required for `alloca.c' support on those systems. */ +#undef CRAY_STACKSEG_END + +/* Define to 1 if using `alloca.c'. */ +/* #undef C_ALLOCA */ + +/* Define to the flags needed for the .section .eh_frame directive. */ +#define EH_FRAME_FLAGS "aw" + +/* Define this if you want extra debugging. */ +/* #undef FFI_DEBUG */ + +/* Define this is you do not want support for the raw API. */ +#define FFI_NO_RAW_API 1 + +/* Define this if you do not want support for aggregate types. */ +/* #undef FFI_NO_STRUCTS */ + +/* Define to 1 if you have `alloca', as a function or macro. */ +#define HAVE_ALLOCA 1 + +/* Define to 1 if you have and it should be used (not on Ultrix). */ +#define HAVE_ALLOCA_H 1 + +/* Define if your assembler supports .register. */ +/* #undef HAVE_AS_REGISTER_PSEUDO_OP */ + +/* Define if your assembler and linker support unaligned PC relative relocs. */ +/* #undef HAVE_AS_SPARC_UA_PCREL */ + +/* Define to 1 if you have the `memcpy' function. */ +#define HAVE_MEMCPY 1 + +/* Define if mmap with MAP_ANON(YMOUS) works. */ +#define HAVE_MMAP_ANON 1 + +/* Define if mmap of /dev/zero works. */ +/* #undef HAVE_MMAP_DEV_ZERO */ + +/* Define if read-only mmap of a plain file works. */ +#define HAVE_MMAP_FILE 1 + +/* Define if .eh_frame sections should be read-only. */ +/* #undef HAVE_RO_EH_FRAME */ + +/* Define to 1 if your C compiler doesn't accept -c and -o together. */ +/* #undef NO_MINUS_C_MINUS_O */ + +/* Name of package */ +#define PACKAGE "libffi" + +/* Define to the address where bug reports for this package should be sent. */ +#define PACKAGE_BUGREPORT "http://gcc.gnu.org/bugs.html" + +/* Define to the full name of this package. */ +#define PACKAGE_NAME "libffi" + +/* Define to the full name and version of this package. */ +#define PACKAGE_STRING "libffi 2.1" + +/* Define to the one symbol short name of this package. */ +#define PACKAGE_TARNAME "libffi" + +/* Define to the version of this package. */ +#define PACKAGE_VERSION "2.1" + +/* If using the C implementation of alloca, define if you know the + direction of stack growth for your system; otherwise it will be + automatically deduced at run-time. + STACK_DIRECTION > 0 => grows toward higher addresses + STACK_DIRECTION < 0 => grows toward lower addresses + STACK_DIRECTION = 0 => direction of growth unknown */ +/* #undef STACK_DIRECTION */ + +/* Define to 1 if you have the ANSI C header files. */ +#define STDC_HEADERS 1 + +/* Define this if you are using Purify and want to suppress spurious messages. */ +/* #undef USING_PURIFY */ + +/* Version number of package */ +#define VERSION "2.1-pyobjc" + +#ifdef HAVE_HIDDEN_VISIBILITY_ATTRIBUTE +# ifdef LIBFFI_ASM +# define FFI_HIDDEN(name) .hidden name +# else +# define FFI_HIDDEN __attribute__((visibility ("hidden"))) +# endif +#else +# ifdef LIBFFI_ASM +# define FFI_HIDDEN(name) +# else +# define FFI_HIDDEN +# endif +#endif \ No newline at end of file diff -r -u ./Modules/_ctypes/libffi_osx/include/ffitarget.h ./Modules/_ctypes/libffi_osx/include/ffitarget.h new file mode 100644 index 0000000..faaa30d --- /dev/null +++ ./Modules/_ctypes/libffi_osx/include/ffitarget.h @@ -0,0 +1,13 @@ +/* Dispatch to the right ffitarget file. This file is PyObjC specific; in a + normal build, the build environment copies the file to the right location or + sets up the right include flags. We want to do neither because that would + make building fat binaries harder. +*/ + +#if defined(__i386__) || defined(__x86_64__) +#include "x86-ffitarget.h" +#elif defined(__ppc__) || defined(__ppc64__) +#include "ppc-ffitarget.h" +#else +#error "Unsupported CPU type" +#endif \ No newline at end of file diff -r -u ./Modules/_ctypes/libffi_osx/include/ppc-ffitarget.h ./Modules/_ctypes/libffi_osx/include/ppc-ffitarget.h new file mode 100644 index 0000000..2318421 --- /dev/null +++ ./Modules/_ctypes/libffi_osx/include/ppc-ffitarget.h @@ -0,0 +1,104 @@ +/* -----------------------------------------------------------------*-C-*- + ppc-ffitarget.h - Copyright (c) 1996-2003 Red Hat, Inc. + Target configuration macros for PowerPC. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#ifndef LIBFFI_TARGET_H +#define LIBFFI_TARGET_H + +/* ---- System specific configurations ----------------------------------- */ + +#if (defined(POWERPC) && defined(__powerpc64__)) || \ + (defined(POWERPC_DARWIN) && defined(__ppc64__)) +#define POWERPC64 +#endif + +#ifndef LIBFFI_ASM + +typedef unsigned long ffi_arg; +typedef signed long ffi_sarg; + +typedef enum ffi_abi { + FFI_FIRST_ABI = 0, + +#ifdef POWERPC + FFI_SYSV, + FFI_GCC_SYSV, + FFI_LINUX64, +# ifdef POWERPC64 + FFI_DEFAULT_ABI = FFI_LINUX64, +# else + FFI_DEFAULT_ABI = FFI_GCC_SYSV, +# endif +#endif + +#ifdef POWERPC_AIX + FFI_AIX, + FFI_DARWIN, + FFI_DEFAULT_ABI = FFI_AIX, +#endif + +#ifdef POWERPC_DARWIN + FFI_AIX, + FFI_DARWIN, + FFI_DEFAULT_ABI = FFI_DARWIN, +#endif + +#ifdef POWERPC_FREEBSD + FFI_SYSV, + FFI_GCC_SYSV, + FFI_LINUX64, + FFI_DEFAULT_ABI = FFI_SYSV, +#endif + + FFI_LAST_ABI = FFI_DEFAULT_ABI + 1 +} ffi_abi; + +#endif // #ifndef LIBFFI_ASM + +/* ---- Definitions for closures ----------------------------------------- */ + +#define FFI_CLOSURES 1 +#define FFI_NATIVE_RAW_API 0 + +/* Needed for FFI_SYSV small structure returns. */ +#define FFI_SYSV_TYPE_SMALL_STRUCT (FFI_TYPE_LAST) + +#if defined(POWERPC64) /*|| defined(POWERPC_AIX)*/ +# define FFI_TRAMPOLINE_SIZE 48 +#elif defined(POWERPC_AIX) +# define FFI_TRAMPOLINE_SIZE 24 +#else +# define FFI_TRAMPOLINE_SIZE 40 +#endif + +#ifndef LIBFFI_ASM +# if defined(POWERPC_DARWIN) || defined(POWERPC_AIX) +typedef struct ffi_aix_trampoline_struct { + void* code_pointer; /* Pointer to ffi_closure_ASM */ + void* toc; /* TOC */ + void* static_chain; /* Pointer to closure */ +} ffi_aix_trampoline_struct; +# endif +#endif // #ifndef LIBFFI_ASM + +#endif // #ifndef LIBFFI_TARGET_H \ No newline at end of file diff -r -u ./Modules/_ctypes/libffi_osx/include/x86-ffitarget.h ./Modules/_ctypes/libffi_osx/include/x86-ffitarget.h new file mode 100644 index 0000000..55c2b6c --- /dev/null +++ ./Modules/_ctypes/libffi_osx/include/x86-ffitarget.h @@ -0,0 +1,88 @@ +/* -----------------------------------------------------------------*-C-*- + x86-ffitarget.h - Copyright (c) 1996-2003 Red Hat, Inc. + Target configuration macros for x86 and x86-64. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + ----------------------------------------------------------------------- */ + +#ifndef LIBFFI_TARGET_H +#define LIBFFI_TARGET_H + +/* ---- System specific configurations ----------------------------------- */ + +#if defined(X86_64) && defined(__i386__) +# undef X86_64 +# define X86 +#endif + +#if defined(__x86_64__) +# ifndef X86_64 +# define X86_64 +# endif +#endif + +/* ---- Generic type definitions ----------------------------------------- */ + +#ifndef LIBFFI_ASM + +typedef unsigned long ffi_arg; +typedef signed long ffi_sarg; + +typedef enum ffi_abi { + FFI_FIRST_ABI = 0, + + /* ---- Intel x86 Win32 ---------- */ +#ifdef X86_WIN32 + FFI_SYSV, + FFI_STDCALL, + /* TODO: Add fastcall support for the sake of completeness */ + FFI_DEFAULT_ABI = FFI_SYSV, +#endif + + /* ---- Intel x86 and AMD x86-64 - */ +#if !defined(X86_WIN32) && (defined(__i386__) || defined(__x86_64__)) + FFI_SYSV, + FFI_UNIX64, /* Unix variants all use the same ABI for x86-64 */ +# ifdef __i386__ + FFI_DEFAULT_ABI = FFI_SYSV, +# else + FFI_DEFAULT_ABI = FFI_UNIX64, +# endif +#endif + + FFI_LAST_ABI = FFI_DEFAULT_ABI + 1 +} ffi_abi; + +#endif // #ifndef LIBFFI_ASM + +/* ---- Definitions for closures ----------------------------------------- */ + +#define FFI_CLOSURES 1 + +#if defined(X86_64) || (defined(__x86_64__) && defined(X86_DARWIN)) +# define FFI_TRAMPOLINE_SIZE 24 +# define FFI_NATIVE_RAW_API 0 +#else +# define FFI_TRAMPOLINE_SIZE 10 +# define FFI_NATIVE_RAW_API 1 /* x86 has native raw api support */ +#endif + +#endif // #ifndef LIBFFI_TARGET_H \ No newline at end of file diff -r -u ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin.S ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin.S new file mode 100644 index 0000000..f143dbd --- /dev/null +++ ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin.S @@ -0,0 +1,365 @@ +#if defined(__ppc__) || defined(__ppc64__) + +/* ----------------------------------------------------------------------- + ppc-darwin.S - Copyright (c) 2000 John Hornkvist + Copyright (c) 2004 Free Software Foundation, Inc. + + PowerPC Assembly glue. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#define LIBFFI_ASM + +#include +#include +#include +#include + +.text + .align 2 +.globl _ffi_prep_args + +.text + .align 2 +.globl _ffi_call_DARWIN + +.text + .align 2 +_ffi_call_DARWIN: +LFB0: + mr r12,r8 /* We only need r12 until the call, + so it doesn't have to be saved. */ + +LFB1: + /* Save the old stack pointer as AP. */ + mr r8,r1 + +LCFI0: +#if defined(__ppc64__) + /* Allocate the stack space we need. + r4 (size of input data) + 48 bytes (linkage area) + 40 bytes (saved registers) + 8 bytes (extra FPR) + r4 + 96 bytes total + */ + + addi r4,r4,-96 // Add our overhead. + li r0,-32 // Align to 32 bytes. + and r4,r4,r0 +#endif + stgux r1,r1,r4 // Grow the stack. + mflr r9 + + /* Save registers we use. */ +#if defined(__ppc64__) + std r27,-40(r8) +#endif + stg r28,MODE_CHOICE(-16,-32)(r8) + stg r29,MODE_CHOICE(-12,-24)(r8) + stg r30,MODE_CHOICE(-8,-16)(r8) + stg r31,MODE_CHOICE(-4,-8)(r8) + stg r9,SF_RETURN(r8) /* return address */ +#if !defined(POWERPC_DARWIN) /* TOC unused in OS X */ + stg r2,MODE_CHOICE(20,40)(r1) +#endif + +LCFI1: +#if defined(__ppc64__) + mr r27,r3 // our extended_cif +#endif + /* Save arguments over call. */ + mr r31,r5 /* flags, */ + mr r30,r6 /* rvalue, */ + mr r29,r7 /* function address, */ + mr r28,r8 /* our AP. */ + +LCFI2: + /* Call ffi_prep_args. */ + mr r4,r1 + li r9,0 + mtctr r12 /* r12 holds address of _ffi_prep_args. */ + bctrl +#if !defined(POWERPC_DARWIN) /* TOC unused in OS X */ + lg r2,MODE_CHOICE(20,40)(r1) +#endif + + /* Now do the call. + Set up cr1 with bits 4-7 of the flags. */ + mtcrf 0x40,r31 + + /* Load all those argument registers. + We have set up a nice stack frame, just load it into registers. */ + lg r3,SF_ARG1(r1) + lg r4,SF_ARG2(r1) + lg r5,SF_ARG3(r1) + lg r6,SF_ARG4(r1) + nop + lg r7,SF_ARG5(r1) + lg r8,SF_ARG6(r1) + lg r9,SF_ARG7(r1) + lg r10,SF_ARG8(r1) + + /* Load all the FP registers. */ + bf 6,L2 /* No floats to load. */ +#if defined(__ppc64__) + lfd f1,MODE_CHOICE(-16,-40)-(14*8)(r28) + lfd f2,MODE_CHOICE(-16,-40)-(13*8)(r28) + lfd f3,MODE_CHOICE(-16,-40)-(12*8)(r28) + lfd f4,MODE_CHOICE(-16,-40)-(11*8)(r28) + nop + lfd f5,MODE_CHOICE(-16,-40)-(10*8)(r28) + lfd f6,MODE_CHOICE(-16,-40)-(9*8)(r28) + lfd f7,MODE_CHOICE(-16,-40)-(8*8)(r28) + lfd f8,MODE_CHOICE(-16,-40)-(7*8)(r28) + nop + lfd f9,MODE_CHOICE(-16,-40)-(6*8)(r28) + lfd f10,MODE_CHOICE(-16,-40)-(5*8)(r28) + lfd f11,MODE_CHOICE(-16,-40)-(4*8)(r28) + lfd f12,MODE_CHOICE(-16,-40)-(3*8)(r28) + nop + lfd f13,MODE_CHOICE(-16,-40)-(2*8)(r28) + lfd f14,MODE_CHOICE(-16,-40)-(1*8)(r28) +#elif defined(__ppc__) + lfd f1,MODE_CHOICE(-16,-40)-(13*8)(r28) + lfd f2,MODE_CHOICE(-16,-40)-(12*8)(r28) + lfd f3,MODE_CHOICE(-16,-40)-(11*8)(r28) + lfd f4,MODE_CHOICE(-16,-40)-(10*8)(r28) + nop + lfd f5,MODE_CHOICE(-16,-40)-(9*8)(r28) + lfd f6,MODE_CHOICE(-16,-40)-(8*8)(r28) + lfd f7,MODE_CHOICE(-16,-40)-(7*8)(r28) + lfd f8,MODE_CHOICE(-16,-40)-(6*8)(r28) + nop + lfd f9,MODE_CHOICE(-16,-40)-(5*8)(r28) + lfd f10,MODE_CHOICE(-16,-40)-(4*8)(r28) + lfd f11,MODE_CHOICE(-16,-40)-(3*8)(r28) + lfd f12,MODE_CHOICE(-16,-40)-(2*8)(r28) + nop + lfd f13,MODE_CHOICE(-16,-40)-(1*8)(r28) +#else +#error undefined architecture +#endif + +L2: + mr r12,r29 // Put the target address in r12 as specified. + mtctr r12 // Get the address to call into CTR. + nop + nop + bctrl // Make the call. + + // Deal with the return value. +#if defined(__ppc64__) + mtcrf 0x3,r31 // flags in cr6 and cr7 + bt 27,L(st_return_value) +#elif defined(__ppc__) + mtcrf 0x1,r31 // flags in cr7 +#else +#error undefined architecture +#endif + + bt 30,L(done_return_value) + bt 29,L(fp_return_value) + stg r3,0(r30) +#if defined(__ppc__) + bf 28,L(done_return_value) // Store the second long if necessary. + stg r4,4(r30) +#endif + // Fall through + +L(done_return_value): + lg r1,0(r1) // Restore stack pointer. + // Restore the registers we used. + lg r9,SF_RETURN(r1) // return address + lg r31,MODE_CHOICE(-4,-8)(r1) + mtlr r9 + lg r30,MODE_CHOICE(-8,-16)(r1) + lg r29,MODE_CHOICE(-12,-24)(r1) + lg r28,MODE_CHOICE(-16,-32)(r1) +#if defined(__ppc64__) + ld r27,-40(r1) +#endif + blr + +#if defined(__ppc64__) +L(st_return_value): + // Grow the stack enough to fit the registers. Leave room for 8 args + // to trample the 1st 8 slots in param area. + stgu r1,-SF_ROUND(280)(r1) // 64 + 104 + 48 + 64 + + // Store GPRs + std r3,SF_ARG9(r1) + std r4,SF_ARG10(r1) + std r5,SF_ARG11(r1) + std r6,SF_ARG12(r1) + nop + std r7,SF_ARG13(r1) + std r8,SF_ARG14(r1) + std r9,SF_ARG15(r1) + std r10,SF_ARG16(r1) + + // Store FPRs + nop + bf 26,L(call_struct_to_ram_form) + stfd f1,SF_ARG17(r1) + stfd f2,SF_ARG18(r1) + stfd f3,SF_ARG19(r1) + stfd f4,SF_ARG20(r1) + nop + stfd f5,SF_ARG21(r1) + stfd f6,SF_ARG22(r1) + stfd f7,SF_ARG23(r1) + stfd f8,SF_ARG24(r1) + nop + stfd f9,SF_ARG25(r1) + stfd f10,SF_ARG26(r1) + stfd f11,SF_ARG27(r1) + stfd f12,SF_ARG28(r1) + nop + stfd f13,SF_ARG29(r1) + +L(call_struct_to_ram_form): + ld r3,0(r27) // extended_cif->cif* + ld r3,16(r3) // ffi_cif->rtype* + addi r4,r1,SF_ARG9 // stored GPRs + addi r6,r1,SF_ARG17 // stored FPRs + li r5,0 // GPR size ptr (NULL) + li r7,0 // FPR size ptr (NULL) + li r8,0 // FPR count ptr (NULL) + li r10,0 // struct offset (NULL) + mr r9,r30 // return area + bl Lffi64_struct_to_ram_form$stub + lg r1,0(r1) // Restore stack pointer. + b L(done_return_value) +#endif + +L(fp_return_value): + /* Do we have long double to store? */ + bf 31,L(fd_return_value) + stfd f1,0(r30) + stfd f2,8(r30) + b L(done_return_value) + +L(fd_return_value): + /* Do we have double to store? */ + bf 28,L(float_return_value) + stfd f1,0(r30) + b L(done_return_value) + +L(float_return_value): + /* We only have a float to store. */ + stfs f1,0(r30) + b L(done_return_value) + +LFE1: +/* END(_ffi_call_DARWIN) */ + +/* Provide a null definition of _ffi_call_AIX. */ +.text + .align 2 +.globl _ffi_call_AIX +.text + .align 2 +_ffi_call_AIX: + blr +/* END(_ffi_call_AIX) */ + +.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms +EH_frame1: + .set L$set$0,LECIE1-LSCIE1 + .long L$set$0 ; Length of Common Information Entry +LSCIE1: + .long 0x0 ; CIE Identifier Tag + .byte 0x1 ; CIE Version + .ascii "zR\0" ; CIE Augmentation + .byte 0x1 ; uleb128 0x1; CIE Code Alignment Factor + .byte 0x7c ; sleb128 -4; CIE Data Alignment Factor + .byte 0x41 ; CIE RA Column + .byte 0x1 ; uleb128 0x1; Augmentation size + .byte 0x10 ; FDE Encoding (pcrel) + .byte 0xc ; DW_CFA_def_cfa + .byte 0x1 ; uleb128 0x1 + .byte 0x0 ; uleb128 0x0 + .align LOG2_GPR_BYTES +LECIE1: +.globl _ffi_call_DARWIN.eh +_ffi_call_DARWIN.eh: +LSFDE1: + .set L$set$1,LEFDE1-LASFDE1 + .long L$set$1 ; FDE Length + +LASFDE1: + .long LASFDE1-EH_frame1 ; FDE CIE offset + .g_long LFB0-. ; FDE initial location + .set L$set$3,LFE1-LFB0 + .g_long L$set$3 ; FDE address range + .byte 0x0 ; uleb128 0x0; Augmentation size + .byte 0x4 ; DW_CFA_advance_loc4 + .set L$set$4,LCFI0-LFB1 + .long L$set$4 + .byte 0xd ; DW_CFA_def_cfa_register + .byte 0x08 ; uleb128 0x08 + .byte 0x4 ; DW_CFA_advance_loc4 + .set L$set$5,LCFI1-LCFI0 + .long L$set$5 + .byte 0x11 ; DW_CFA_offset_extended_sf + .byte 0x41 ; uleb128 0x41 + .byte 0x7e ; sleb128 -2 + .byte 0x9f ; DW_CFA_offset, column 0x1f + .byte 0x1 ; uleb128 0x1 + .byte 0x9e ; DW_CFA_offset, column 0x1e + .byte 0x2 ; uleb128 0x2 + .byte 0x9d ; DW_CFA_offset, column 0x1d + .byte 0x3 ; uleb128 0x3 + .byte 0x9c ; DW_CFA_offset, column 0x1c + .byte 0x4 ; uleb128 0x4 + .byte 0x4 ; DW_CFA_advance_loc4 + .set L$set$6,LCFI2-LCFI1 + .long L$set$6 + .byte 0xd ; DW_CFA_def_cfa_register + .byte 0x1c ; uleb128 0x1c + .align LOG2_GPR_BYTES +LEFDE1: + +#if defined(__ppc64__) +.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 + .align LOG2_GPR_BYTES + +Lffi64_struct_to_ram_form$stub: + .indirect_symbol _ffi64_struct_to_ram_form + mflr r0 + bcl 20,31,LO$ffi64_struct_to_ram_form + +LO$ffi64_struct_to_ram_form: + mflr r11 + addis r11,r11,ha16(L_ffi64_struct_to_ram_form$lazy_ptr - LO$ffi64_struct_to_ram_form) + mtlr r0 + lgu r12,lo16(L_ffi64_struct_to_ram_form$lazy_ptr - LO$ffi64_struct_to_ram_form)(r11) + mtctr r12 + bctr + +.lazy_symbol_pointer +L_ffi64_struct_to_ram_form$lazy_ptr: + .indirect_symbol _ffi64_struct_to_ram_form + .g_long dyld_stub_binding_helper + +#endif // __ppc64__ +#endif // __ppc__ || __ppc64__ diff -r -u ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin.h ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin.h new file mode 100644 index 0000000..cf4bd50 --- /dev/null +++ ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin.h @@ -0,0 +1,85 @@ +/* ----------------------------------------------------------------------- + ppc-darwin.h - Copyright (c) 2002, 2003, 2004, Free Software Foundation, + Inc. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#define L(x) x + +#define SF_ARG9 MODE_CHOICE(56,112) +#define SF_ARG10 MODE_CHOICE(60,120) +#define SF_ARG11 MODE_CHOICE(64,128) +#define SF_ARG12 MODE_CHOICE(68,136) +#define SF_ARG13 MODE_CHOICE(72,144) +#define SF_ARG14 MODE_CHOICE(76,152) +#define SF_ARG15 MODE_CHOICE(80,160) +#define SF_ARG16 MODE_CHOICE(84,168) +#define SF_ARG17 MODE_CHOICE(88,176) +#define SF_ARG18 MODE_CHOICE(92,184) +#define SF_ARG19 MODE_CHOICE(96,192) +#define SF_ARG20 MODE_CHOICE(100,200) +#define SF_ARG21 MODE_CHOICE(104,208) +#define SF_ARG22 MODE_CHOICE(108,216) +#define SF_ARG23 MODE_CHOICE(112,224) +#define SF_ARG24 MODE_CHOICE(116,232) +#define SF_ARG25 MODE_CHOICE(120,240) +#define SF_ARG26 MODE_CHOICE(124,248) +#define SF_ARG27 MODE_CHOICE(128,256) +#define SF_ARG28 MODE_CHOICE(132,264) +#define SF_ARG29 MODE_CHOICE(136,272) + +#define ASM_NEEDS_REGISTERS 4 +#define NUM_GPR_ARG_REGISTERS 8 +#define NUM_FPR_ARG_REGISTERS 13 + +#define FFI_TYPE_1_BYTE(x) ((x) == FFI_TYPE_UINT8 || (x) == FFI_TYPE_SINT8) +#define FFI_TYPE_2_BYTE(x) ((x) == FFI_TYPE_UINT16 || (x) == FFI_TYPE_SINT16) +#define FFI_TYPE_4_BYTE(x) \ + ((x) == FFI_TYPE_UINT32 || (x) == FFI_TYPE_SINT32 ||\ + (x) == FFI_TYPE_INT || (x) == FFI_TYPE_FLOAT) + +#if !defined(LIBFFI_ASM) + +enum { + FLAG_RETURNS_NOTHING = 1 << (31 - 30), // cr7 + FLAG_RETURNS_FP = 1 << (31 - 29), + FLAG_RETURNS_64BITS = 1 << (31 - 28), + FLAG_RETURNS_128BITS = 1 << (31 - 31), + + FLAG_RETURNS_STRUCT = 1 << (31 - 27), // cr6 + FLAG_STRUCT_CONTAINS_FP = 1 << (31 - 26), + + FLAG_ARG_NEEDS_COPY = 1 << (31 - 7), + FLAG_FP_ARGUMENTS = 1 << (31 - 6), // cr1.eq; specified by ABI + FLAG_4_GPR_ARGUMENTS = 1 << (31 - 5), + FLAG_RETVAL_REFERENCE = 1 << (31 - 4) +}; + +#if defined(__ppc64__) +void ffi64_struct_to_ram_form(const ffi_type*, const char*, unsigned int*, + const char*, unsigned int*, unsigned int*, char*, unsigned int*); +void ffi64_struct_to_reg_form(const ffi_type*, const char*, unsigned int*, + unsigned int*, char*, unsigned int*, char*, unsigned int*); +bool ffi64_stret_needs_ptr(const ffi_type* inType, + unsigned short*, unsigned short*); +#endif + +#endif // !defined(LIBFFI_ASM) \ No newline at end of file diff -r -u ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin_closure.S ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin_closure.S new file mode 100644 index 0000000..c3d30c2 --- /dev/null +++ ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin_closure.S @@ -0,0 +1,308 @@ +#if defined(__ppc__) + +/* ----------------------------------------------------------------------- + ppc-darwin_closure.S - Copyright (c) 2002, 2003, 2004, Free Software Foundation, + Inc. based on ppc_closure.S + + PowerPC Assembly glue. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#define LIBFFI_ASM + +#include +#include // for FFI_TRAMPOLINE_SIZE +#include +#include + + .file "ppc-darwin_closure.S" +.text + .align LOG2_GPR_BYTES + .globl _ffi_closure_ASM + +.text + .align LOG2_GPR_BYTES + +_ffi_closure_ASM: +LFB1: + mflr r0 // Save return address + stg r0,SF_RETURN(r1) + +LCFI0: + /* 24/48 bytes (Linkage Area) + 32/64 bytes (outgoing parameter area, always reserved) + 104 bytes (13*8 from FPR) + 16/32 bytes (result) + 176/232 total bytes */ + + /* skip over caller save area and keep stack aligned to 16/32. */ + stgu r1,-SF_ROUND(176)(r1) + +LCFI1: + /* We want to build up an area for the parameters passed + in registers. (both floating point and integer) */ + + /* 176/256 bytes (callee stack frame aligned to 16/32) + 24/48 bytes (caller linkage area) + 200/304 (start of caller parameter area aligned to 4/8) + */ + + /* Save GPRs 3 - 10 (aligned to 4/8) + in the parents outgoing area. */ + stg r3,200(r1) + stg r4,204(r1) + stg r5,208(r1) + stg r6,212(r1) + stg r7,216(r1) + stg r8,220(r1) + stg r9,224(r1) + stg r10,228(r1) + + /* Save FPRs 1 - 13. (aligned to 8) */ + stfd f1,56(r1) + stfd f2,64(r1) + stfd f3,72(r1) + stfd f4,80(r1) + stfd f5,88(r1) + stfd f6,96(r1) + stfd f7,104(r1) + stfd f8,112(r1) + stfd f9,120(r1) + stfd f10,128(r1) + stfd f11,136(r1) + stfd f12,144(r1) + stfd f13,152(r1) + + // Set up registers for the routine that actually does the work. + mr r3,r11 // context pointer from the trampoline + addi r4,r1,160 // result storage + addi r5,r1,200 // saved GPRs + addi r6,r1,56 // saved FPRs + bl Lffi_closure_helper_DARWIN$stub + + /* Now r3 contains the return type. Use it to look up in a table + so we know how to deal with each type. */ + addi r5,r1,160 // Copy result storage pointer. + bl Lget_ret_type0_addr // Get pointer to Lret_type0 into LR. + mflr r4 // Move to r4. + slwi r3,r3,4 // Multiply return type by 16. + add r3,r3,r4 // Add contents of table to table address. + mtctr r3 + bctr + +LFE1: +/* Each of the ret_typeX code fragments has to be exactly 16 bytes long + (4 instructions). For cache effectiveness we align to a 16 byte boundary + first. */ + .align 4 + nop + nop + nop + +Lget_ret_type0_addr: + blrl + +/* case FFI_TYPE_VOID */ +Lret_type0: + b Lfinish + nop + nop + nop + +/* case FFI_TYPE_INT */ +Lret_type1: + lwz r3,0(r5) + b Lfinish + nop + nop + +/* case FFI_TYPE_FLOAT */ +Lret_type2: + lfs f1,0(r5) + b Lfinish + nop + nop + +/* case FFI_TYPE_DOUBLE */ +Lret_type3: + lfd f1,0(r5) + b Lfinish + nop + nop + +/* case FFI_TYPE_LONGDOUBLE */ +Lret_type4: + lfd f1,0(r5) + lfd f2,8(r5) + b Lfinish + nop + +/* case FFI_TYPE_UINT8 */ +Lret_type5: + lbz r3,3(r5) + b Lfinish + nop + nop + +/* case FFI_TYPE_SINT8 */ +Lret_type6: + lbz r3,3(r5) + extsb r3,r3 + b Lfinish + nop + +/* case FFI_TYPE_UINT16 */ +Lret_type7: + lhz r3,2(r5) + b Lfinish + nop + nop + +/* case FFI_TYPE_SINT16 */ +Lret_type8: + lha r3,2(r5) + b Lfinish + nop + nop + +/* case FFI_TYPE_UINT32 */ +Lret_type9: // same as Lret_type1 + lwz r3,0(r5) + b Lfinish + nop + nop + +/* case FFI_TYPE_SINT32 */ +Lret_type10: // same as Lret_type1 + lwz r3,0(r5) + b Lfinish + nop + nop + +/* case FFI_TYPE_UINT64 */ +Lret_type11: + lwz r3,0(r5) + lwz r4,4(r5) + b Lfinish + nop + +/* case FFI_TYPE_SINT64 */ +Lret_type12: // same as Lret_type11 + lwz r3,0(r5) + lwz r4,4(r5) + b Lfinish + nop + +/* case FFI_TYPE_STRUCT */ +Lret_type13: + b Lfinish + nop + nop + nop + +/* End 16-byte aligned cases */ +/* case FFI_TYPE_POINTER */ +// This case assumes that FFI_TYPE_POINTER == FFI_TYPE_LAST. If more types +// are added in future, the following code will need to be updated and +// padded to 16 bytes. +Lret_type14: + lg r3,0(r5) + // fall through + +/* case done */ +Lfinish: + addi r1,r1,SF_ROUND(176) // Restore stack pointer. + lg r0,SF_RETURN(r1) // Restore return address. + mtlr r0 // Restore link register. + blr + +/* END(ffi_closure_ASM) */ + +.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support +EH_frame1: + .set L$set$0,LECIE1-LSCIE1 + .long L$set$0 ; Length of Common Information Entry +LSCIE1: + .long 0x0 ; CIE Identifier Tag + .byte 0x1 ; CIE Version + .ascii "zR\0" ; CIE Augmentation + .byte 0x1 ; uleb128 0x1; CIE Code Alignment Factor + .byte 0x7c ; sleb128 -4; CIE Data Alignment Factor + .byte 0x41 ; CIE RA Column + .byte 0x1 ; uleb128 0x1; Augmentation size + .byte 0x10 ; FDE Encoding (pcrel) + .byte 0xc ; DW_CFA_def_cfa + .byte 0x1 ; uleb128 0x1 + .byte 0x0 ; uleb128 0x0 + .align LOG2_GPR_BYTES +LECIE1: +.globl _ffi_closure_ASM.eh +_ffi_closure_ASM.eh: +LSFDE1: + .set L$set$1,LEFDE1-LASFDE1 + .long L$set$1 ; FDE Length + +LASFDE1: + .long LASFDE1-EH_frame1 ; FDE CIE offset + .g_long LFB1-. ; FDE initial location + .set L$set$3,LFE1-LFB1 + .g_long L$set$3 ; FDE address range + .byte 0x0 ; uleb128 0x0; Augmentation size + .byte 0x4 ; DW_CFA_advance_loc4 + .set L$set$3,LCFI1-LCFI0 + .long L$set$3 + .byte 0xe ; DW_CFA_def_cfa_offset + .byte 176,1 ; uleb128 176 + .byte 0x4 ; DW_CFA_advance_loc4 + .set L$set$4,LCFI0-LFB1 + .long L$set$4 + .byte 0x11 ; DW_CFA_offset_extended_sf + .byte 0x41 ; uleb128 0x41 + .byte 0x7e ; sleb128 -2 + .align LOG2_GPR_BYTES + +LEFDE1: +.data + .align LOG2_GPR_BYTES +LDFCM0: +.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 + .align LOG2_GPR_BYTES + +Lffi_closure_helper_DARWIN$stub: + .indirect_symbol _ffi_closure_helper_DARWIN + mflr r0 + bcl 20,31,LO$ffi_closure_helper_DARWIN + +LO$ffi_closure_helper_DARWIN: + mflr r11 + addis r11,r11,ha16(L_ffi_closure_helper_DARWIN$lazy_ptr - LO$ffi_closure_helper_DARWIN) + mtlr r0 + lgu r12,lo16(L_ffi_closure_helper_DARWIN$lazy_ptr - LO$ffi_closure_helper_DARWIN)(r11) + mtctr r12 + bctr + +.lazy_symbol_pointer +L_ffi_closure_helper_DARWIN$lazy_ptr: + .indirect_symbol _ffi_closure_helper_DARWIN + .g_long dyld_stub_binding_helper + + +#endif // __ppc__ diff -r -u ./Modules/_ctypes/libffi_osx/powerpc/ppc-ffi_darwin.c ./Modules/_ctypes/libffi_osx/powerpc/ppc-ffi_darwin.c new file mode 100644 index 0000000..8953d5f --- /dev/null +++ ./Modules/_ctypes/libffi_osx/powerpc/ppc-ffi_darwin.c @@ -0,0 +1,1776 @@ +#if defined(__ppc__) || defined(__ppc64__) + +/* ----------------------------------------------------------------------- + ffi.c - Copyright (c) 1998 Geoffrey Keating + + PowerPC Foreign Function Interface + + Darwin ABI support (c) 2001 John Hornkvist + AIX ABI support (c) 2002 Free Software Foundation, Inc. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#include +#include + +#include +#include +#include +#include +#include + +#if 0 +#if defined(POWERPC_DARWIN) +#include // for sys_icache_invalidate() +#endif + +#else + +#pragma weak sys_icache_invalidate +extern void sys_icache_invalidate(void *start, size_t len); + +#endif + + +extern void ffi_closure_ASM(void); + +// The layout of a function descriptor. A C function pointer really +// points to one of these. +typedef struct aix_fd_struct { + void* code_pointer; + void* toc; +} aix_fd; + +/* ffi_prep_args is called by the assembly routine once stack space + has been allocated for the function's arguments. + + The stack layout we want looks like this: + + | Return address from ffi_call_DARWIN | higher addresses + |--------------------------------------------| + | Previous backchain pointer 4/8 | stack pointer here + |--------------------------------------------|-\ <<< on entry to + | Saved r28-r31 (4/8)*4 | | ffi_call_DARWIN + |--------------------------------------------| | + | Parameters (at least 8*(4/8)=32/64) | | (176) +112 - +288 + |--------------------------------------------| | + | Space for GPR2 4/8 | | + |--------------------------------------------| | stack | + | Reserved (4/8)*2 | | grows | + |--------------------------------------------| | down V + | Space for callee's LR 4/8 | | + |--------------------------------------------| | lower addresses + | Saved CR 4/8 | | + |--------------------------------------------| | stack pointer here + | Current backchain pointer 4/8 | | during + |--------------------------------------------|-/ <<< ffi_call_DARWIN + + Note: ppc64 CR is saved in the low word of a long on the stack. +*/ + +/*@-exportheader@*/ +void +ffi_prep_args( + extended_cif* inEcif, + unsigned *const stack) +/*@=exportheader@*/ +{ + /* Copy the ecif to a local var so we can trample the arg. + BC note: test this with GP later for possible problems... */ + volatile extended_cif* ecif = inEcif; + + const unsigned bytes = ecif->cif->bytes; + const unsigned flags = ecif->cif->flags; + + /* Cast the stack arg from int* to long*. sizeof(long) == 4 in 32-bit mode + and 8 in 64-bit mode. */ + unsigned long *const longStack = (unsigned long *const)stack; + + /* 'stacktop' points at the previous backchain pointer. */ +#if defined(__ppc64__) + // In ppc-darwin.s, an extra 96 bytes is reserved for the linkage area, + // saved registers, and an extra FPR. + unsigned long *const stacktop = + (unsigned long *)(unsigned long)((char*)longStack + bytes + 96); +#elif defined(__ppc__) + unsigned long *const stacktop = longStack + (bytes / sizeof(long)); +#else +#error undefined architecture +#endif + + /* 'fpr_base' points at the space for fpr1, and grows upwards as + we use FPR registers. */ + double* fpr_base = (double*)(stacktop - ASM_NEEDS_REGISTERS) - + NUM_FPR_ARG_REGISTERS; + +#if defined(__ppc64__) + // 64-bit saves an extra register, and uses an extra FPR. Knock fpr_base + // down a couple pegs. + fpr_base -= 2; +#endif + + unsigned int fparg_count = 0; + + /* 'next_arg' grows up as we put parameters in it. */ + unsigned long* next_arg = longStack + 6; /* 6 reserved positions. */ + + int i; + double double_tmp; + void** p_argv = ecif->avalue; + unsigned long gprvalue; + ffi_type** ptr = ecif->cif->arg_types; + + /* Check that everything starts aligned properly. */ + FFI_ASSERT(stack == SF_ROUND(stack)); + FFI_ASSERT(stacktop == SF_ROUND(stacktop)); + FFI_ASSERT(bytes == SF_ROUND(bytes)); + + /* Deal with return values that are actually pass-by-reference. + Rule: + Return values are referenced by r3, so r4 is the first parameter. */ + + if (flags & FLAG_RETVAL_REFERENCE) + *next_arg++ = (unsigned long)(char*)ecif->rvalue; + + /* Now for the arguments. */ + for (i = ecif->cif->nargs; i > 0; i--, ptr++, p_argv++) + { + switch ((*ptr)->type) + { + /* If a floating-point parameter appears before all of the general- + purpose registers are filled, the corresponding GPRs that match + the size of the floating-point parameter are shadowed for the + benefit of vararg and pre-ANSI functions. */ + case FFI_TYPE_FLOAT: + double_tmp = *(float*)*p_argv; + + if (fparg_count < NUM_FPR_ARG_REGISTERS) + *fpr_base++ = double_tmp; + + *(double*)next_arg = double_tmp; + + next_arg++; + fparg_count++; + FFI_ASSERT(flags & FLAG_FP_ARGUMENTS); + + break; + + case FFI_TYPE_DOUBLE: + double_tmp = *(double*)*p_argv; + + if (fparg_count < NUM_FPR_ARG_REGISTERS) + *fpr_base++ = double_tmp; + + *(double*)next_arg = double_tmp; + + next_arg += MODE_CHOICE(2,1); + fparg_count++; + FFI_ASSERT(flags & FLAG_FP_ARGUMENTS); + + break; + +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + case FFI_TYPE_LONGDOUBLE: +#if defined(__ppc64__) + if (fparg_count < NUM_FPR_ARG_REGISTERS) + *(long double*)fpr_base = *(long double*)*p_argv; +#elif defined(__ppc__) + if (fparg_count < NUM_FPR_ARG_REGISTERS - 1) + *(long double*)fpr_base = *(long double*)*p_argv; + else if (fparg_count == NUM_FPR_ARG_REGISTERS - 1) + *(double*)fpr_base = *(double*)*p_argv; +#else +#error undefined architecture +#endif + + *(long double*)next_arg = *(long double*)*p_argv; + fparg_count += 2; + fpr_base += 2; + next_arg += MODE_CHOICE(4,2); + FFI_ASSERT(flags & FLAG_FP_ARGUMENTS); + + break; +#endif // FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: +#if defined(__ppc64__) + gprvalue = *(long long*)*p_argv; + goto putgpr; +#elif defined(__ppc__) + *(long long*)next_arg = *(long long*)*p_argv; + next_arg += 2; + break; +#else +#error undefined architecture +#endif + + case FFI_TYPE_POINTER: + gprvalue = *(unsigned long*)*p_argv; + goto putgpr; + + case FFI_TYPE_UINT8: + gprvalue = *(unsigned char*)*p_argv; + goto putgpr; + + case FFI_TYPE_SINT8: + gprvalue = *(signed char*)*p_argv; + goto putgpr; + + case FFI_TYPE_UINT16: + gprvalue = *(unsigned short*)*p_argv; + goto putgpr; + + case FFI_TYPE_SINT16: + gprvalue = *(signed short*)*p_argv; + goto putgpr; + + case FFI_TYPE_STRUCT: + { +#if defined(__ppc64__) + unsigned int gprSize = 0; + unsigned int fprSize = 0; + + ffi64_struct_to_reg_form(*ptr, (char*)*p_argv, NULL, &fparg_count, + (char*)next_arg, &gprSize, (char*)fpr_base, &fprSize); + next_arg += gprSize / sizeof(long); + fpr_base += fprSize / sizeof(double); + +#elif defined(__ppc__) + char* dest_cpy = (char*)next_arg; + + /* Structures that match the basic modes (QI 1 byte, HI 2 bytes, + SI 4 bytes) are aligned as if they were those modes. + Structures with 3 byte in size are padded upwards. */ + unsigned size_al = (*ptr)->size; + + /* If the first member of the struct is a double, then align + the struct to double-word. */ + if ((*ptr)->elements[0]->type == FFI_TYPE_DOUBLE) + size_al = ALIGN((*ptr)->size, 8); + + if (ecif->cif->abi == FFI_DARWIN) + { + if (size_al < 3) + dest_cpy += 4 - size_al; + } + + memcpy((char*)dest_cpy, (char*)*p_argv, size_al); + next_arg += (size_al + 3) / 4; +#else +#error undefined architecture +#endif + break; + } + + case FFI_TYPE_INT: + case FFI_TYPE_UINT32: + case FFI_TYPE_SINT32: + gprvalue = *(unsigned*)*p_argv; + +putgpr: + *next_arg++ = gprvalue; + break; + + default: + break; + } + } + + /* Check that we didn't overrun the stack... */ + //FFI_ASSERT(gpr_base <= stacktop - ASM_NEEDS_REGISTERS); + //FFI_ASSERT((unsigned *)fpr_base + // <= stacktop - ASM_NEEDS_REGISTERS - NUM_GPR_ARG_REGISTERS); + //FFI_ASSERT(flags & FLAG_4_GPR_ARGUMENTS || intarg_count <= 4); +} + +#if defined(__ppc64__) + +bool +ffi64_struct_contains_fp( + const ffi_type* inType) +{ + bool containsFP = false; + unsigned int i; + + for (i = 0; inType->elements[i] != NULL && !containsFP; i++) + { + if (inType->elements[i]->type == FFI_TYPE_FLOAT || + inType->elements[i]->type == FFI_TYPE_DOUBLE || + inType->elements[i]->type == FFI_TYPE_LONGDOUBLE) + containsFP = true; + else if (inType->elements[i]->type == FFI_TYPE_STRUCT) + containsFP = ffi64_struct_contains_fp(inType->elements[i]); + } + + return containsFP; +} + +#endif // defined(__ppc64__) + +/* Perform machine dependent cif processing. */ +ffi_status +ffi_prep_cif_machdep( + ffi_cif* cif) +{ + /* All this is for the DARWIN ABI. */ + int i; + ffi_type** ptr; + int intarg_count = 0; + int fparg_count = 0; + unsigned int flags = 0; + unsigned int size_al = 0; + + /* All the machine-independent calculation of cif->bytes will be wrong. + Redo the calculation for DARWIN. */ + + /* Space for the frame pointer, callee's LR, CR, etc, and for + the asm's temp regs. */ + unsigned int bytes = (6 + ASM_NEEDS_REGISTERS) * sizeof(long); + + /* Return value handling. The rules are as follows: + - 32-bit (or less) integer values are returned in gpr3; + - Structures of size <= 4 bytes also returned in gpr3; + - 64-bit integer values and structures between 5 and 8 bytes are + returned in gpr3 and gpr4; + - Single/double FP values are returned in fpr1; + - Long double FP (if not equivalent to double) values are returned in + fpr1 and fpr2; + - Larger structures values are allocated space and a pointer is passed + as the first argument. */ + switch (cif->rtype->type) + { +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + case FFI_TYPE_LONGDOUBLE: + flags |= FLAG_RETURNS_128BITS; + flags |= FLAG_RETURNS_FP; + break; +#endif // FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + + case FFI_TYPE_DOUBLE: + flags |= FLAG_RETURNS_64BITS; + /* Fall through. */ + case FFI_TYPE_FLOAT: + flags |= FLAG_RETURNS_FP; + break; + +#if defined(__ppc64__) + case FFI_TYPE_POINTER: +#endif + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + flags |= FLAG_RETURNS_64BITS; + break; + + case FFI_TYPE_STRUCT: + { +#if defined(__ppc64__) + + if (ffi64_stret_needs_ptr(cif->rtype, NULL, NULL)) + { + flags |= FLAG_RETVAL_REFERENCE; + flags |= FLAG_RETURNS_NOTHING; + intarg_count++; + } + else + { + flags |= FLAG_RETURNS_STRUCT; + + if (ffi64_struct_contains_fp(cif->rtype)) + flags |= FLAG_STRUCT_CONTAINS_FP; + } + +#elif defined(__ppc__) + + flags |= FLAG_RETVAL_REFERENCE; + flags |= FLAG_RETURNS_NOTHING; + intarg_count++; + +#else +#error undefined architecture +#endif + break; + } + + case FFI_TYPE_VOID: + flags |= FLAG_RETURNS_NOTHING; + break; + + default: + /* Returns 32-bit integer, or similar. Nothing to do here. */ + break; + } + + /* The first NUM_GPR_ARG_REGISTERS words of integer arguments, and the + first NUM_FPR_ARG_REGISTERS fp arguments, go in registers; the rest + goes on the stack. Structures are passed as a pointer to a copy of + the structure. Stuff on the stack needs to keep proper alignment. */ + for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++) + { + switch ((*ptr)->type) + { + case FFI_TYPE_FLOAT: + case FFI_TYPE_DOUBLE: + fparg_count++; + /* If this FP arg is going on the stack, it must be + 8-byte-aligned. */ + if (fparg_count > NUM_FPR_ARG_REGISTERS + && intarg_count % 2 != 0) + intarg_count++; + break; + +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + case FFI_TYPE_LONGDOUBLE: + fparg_count += 2; + /* If this FP arg is going on the stack, it must be + 8-byte-aligned. */ + + if ( +#if defined(__ppc64__) + fparg_count > NUM_FPR_ARG_REGISTERS + 1 +#elif defined(__ppc__) + fparg_count > NUM_FPR_ARG_REGISTERS +#else +#error undefined architecture +#endif + && intarg_count % 2 != 0) + intarg_count++; + + intarg_count += 2; + break; +#endif // FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + /* 'long long' arguments are passed as two words, but + either both words must fit in registers or both go + on the stack. If they go on the stack, they must + be 8-byte-aligned. */ + if (intarg_count == NUM_GPR_ARG_REGISTERS - 1 + || (intarg_count >= NUM_GPR_ARG_REGISTERS + && intarg_count % 2 != 0)) + intarg_count++; + + intarg_count += MODE_CHOICE(2,1); + + break; + + case FFI_TYPE_STRUCT: + size_al = (*ptr)->size; + /* If the first member of the struct is a double, then align + the struct to double-word. */ + if ((*ptr)->elements[0]->type == FFI_TYPE_DOUBLE) + size_al = ALIGN((*ptr)->size, 8); + +#if defined(__ppc64__) + // Look for FP struct members. + unsigned int j; + + for (j = 0; (*ptr)->elements[j] != NULL; j++) + { + if ((*ptr)->elements[j]->type == FFI_TYPE_FLOAT || + (*ptr)->elements[j]->type == FFI_TYPE_DOUBLE) + { + fparg_count++; + + if (fparg_count > NUM_FPR_ARG_REGISTERS) + intarg_count++; + } + else if ((*ptr)->elements[j]->type == FFI_TYPE_LONGDOUBLE) + { + fparg_count += 2; + + if (fparg_count > NUM_FPR_ARG_REGISTERS + 1) + intarg_count += 2; + } + else + intarg_count++; + } +#elif defined(__ppc__) + intarg_count += (size_al + 3) / 4; +#else +#error undefined architecture +#endif + + break; + + default: + /* Everything else is passed as a 4/8-byte word in a GPR, either + the object itself or a pointer to it. */ + intarg_count++; + break; + } + } + + /* Space for the FPR registers, if needed. */ + if (fparg_count != 0) + { + flags |= FLAG_FP_ARGUMENTS; +#if defined(__ppc64__) + bytes += (NUM_FPR_ARG_REGISTERS + 1) * sizeof(double); +#elif defined(__ppc__) + bytes += NUM_FPR_ARG_REGISTERS * sizeof(double); +#else +#error undefined architecture +#endif + } + + /* Stack space. */ +#if defined(__ppc64__) + if ((intarg_count + fparg_count) > NUM_GPR_ARG_REGISTERS) + bytes += (intarg_count + fparg_count) * sizeof(long); +#elif defined(__ppc__) + if ((intarg_count + 2 * fparg_count) > NUM_GPR_ARG_REGISTERS) + bytes += (intarg_count + 2 * fparg_count) * sizeof(long); +#else +#error undefined architecture +#endif + else + bytes += NUM_GPR_ARG_REGISTERS * sizeof(long); + + /* The stack space allocated needs to be a multiple of 16/32 bytes. */ + bytes = SF_ROUND(bytes); + + cif->flags = flags; + cif->bytes = bytes; + + return FFI_OK; +} + +/*@-declundef@*/ +/*@-exportheader@*/ +extern void +ffi_call_AIX( +/*@out@*/ extended_cif*, + unsigned, + unsigned, +/*@out@*/ unsigned*, + void (*fn)(void), + void (*fn2)(extended_cif*, unsigned *const)); + +extern void +ffi_call_DARWIN( +/*@out@*/ extended_cif*, + unsigned long, + unsigned, +/*@out@*/ unsigned*, + void (*fn)(void), + void (*fn2)(extended_cif*, unsigned *const)); +/*@=declundef@*/ +/*@=exportheader@*/ + +void +ffi_call( +/*@dependent@*/ ffi_cif* cif, + void (*fn)(void), +/*@out@*/ void* rvalue, +/*@dependent@*/ void** avalue) +{ + extended_cif ecif; + + ecif.cif = cif; + ecif.avalue = avalue; + + /* If the return value is a struct and we don't have a return + value address then we need to make one. */ + if ((rvalue == NULL) && + (cif->rtype->type == FFI_TYPE_STRUCT)) + { + /*@-sysunrecog@*/ + ecif.rvalue = alloca(cif->rtype->size); + /*@=sysunrecog@*/ + } + else + ecif.rvalue = rvalue; + + switch (cif->abi) + { + case FFI_AIX: + /*@-usedef@*/ + ffi_call_AIX(&ecif, -cif->bytes, + cif->flags, ecif.rvalue, fn, ffi_prep_args); + /*@=usedef@*/ + break; + + case FFI_DARWIN: + /*@-usedef@*/ + ffi_call_DARWIN(&ecif, -(long)cif->bytes, + cif->flags, ecif.rvalue, fn, ffi_prep_args); + /*@=usedef@*/ + break; + + default: + FFI_ASSERT(0); + break; + } +} + +/* here I'd like to add the stack frame layout we use in darwin_closure.S + and aix_clsoure.S + + SP previous -> +---------------------------------------+ <--- child frame + | back chain to caller 4 | + +---------------------------------------+ 4 + | saved CR 4 | + +---------------------------------------+ 8 + | saved LR 4 | + +---------------------------------------+ 12 + | reserved for compilers 4 | + +---------------------------------------+ 16 + | reserved for binders 4 | + +---------------------------------------+ 20 + | saved TOC pointer 4 | + +---------------------------------------+ 24 + | always reserved 8*4=32 (previous GPRs)| + | according to the linkage convention | + | from AIX | + +---------------------------------------+ 56 + | our FPR area 13*8=104 | + | f1 | + | . | + | f13 | + +---------------------------------------+ 160 + | result area 8 | + +---------------------------------------+ 168 + | alignement to the next multiple of 16 | +SP current --> +---------------------------------------+ 176 <- parent frame + | back chain to caller 4 | + +---------------------------------------+ 180 + | saved CR 4 | + +---------------------------------------+ 184 + | saved LR 4 | + +---------------------------------------+ 188 + | reserved for compilers 4 | + +---------------------------------------+ 192 + | reserved for binders 4 | + +---------------------------------------+ 196 + | saved TOC pointer 4 | + +---------------------------------------+ 200 + | always reserved 8*4=32 we store our | + | GPRs here | + | r3 | + | . | + | r10 | + +---------------------------------------+ 232 + | overflow part | + +---------------------------------------+ xxx + | ???? | + +---------------------------------------+ xxx +*/ + +#if !defined(POWERPC_DARWIN) + +#define MIN_LINE_SIZE 32 + +static void +flush_icache( + char* addr) +{ +#ifndef _AIX + __asm__ volatile ( + "dcbf 0,%0\n" + "sync\n" + "icbi 0,%0\n" + "sync\n" + "isync" + : : "r" (addr) : "memory"); +#endif +} + +static void +flush_range( + char* addr, + int size) +{ + int i; + + for (i = 0; i < size; i += MIN_LINE_SIZE) + flush_icache(addr + i); + + flush_icache(addr + size - 1); +} + +#endif // !defined(POWERPC_DARWIN) + +ffi_status +ffi_prep_closure( + ffi_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif*, void*, void**, void*), + void* user_data) +{ + switch (cif->abi) + { + case FFI_DARWIN: + { + FFI_ASSERT (cif->abi == FFI_DARWIN); + + unsigned int* tramp = (unsigned int*)&closure->tramp[0]; + +#if defined(__ppc64__) + tramp[0] = 0x7c0802a6; // mflr r0 + tramp[1] = 0x429f0005; // bcl 20,31,+0x8 + tramp[2] = 0x7d6802a6; // mflr r11 + tramp[3] = 0x7c0803a6; // mtlr r0 + tramp[4] = 0xe98b0018; // ld r12,24(r11) + tramp[5] = 0x7d8903a6; // mtctr r12 + tramp[6] = 0xe96b0020; // ld r11,32(r11) + tramp[7] = 0x4e800420; // bctr + *(unsigned long*)&tramp[8] = (unsigned long)ffi_closure_ASM; + *(unsigned long*)&tramp[10] = (unsigned long)closure; +#elif defined(__ppc__) + tramp[0] = 0x7c0802a6; // mflr r0 + tramp[1] = 0x429f0005; // bcl 20,31,+0x8 + tramp[2] = 0x7d6802a6; // mflr r11 + tramp[3] = 0x7c0803a6; // mtlr r0 + tramp[4] = 0x818b0018; // lwz r12,24(r11) + tramp[5] = 0x7d8903a6; // mtctr r12 + tramp[6] = 0x816b001c; // lwz r11,28(r11) + tramp[7] = 0x4e800420; // bctr + tramp[8] = (unsigned long)ffi_closure_ASM; + tramp[9] = (unsigned long)closure; +#else +#error undefined architecture +#endif + + closure->cif = cif; + closure->fun = fun; + closure->user_data = user_data; + + // Flush the icache. Only necessary on Darwin. +#if defined(POWERPC_DARWIN) + sys_icache_invalidate(closure->tramp, FFI_TRAMPOLINE_SIZE); +#else + flush_range(closure->tramp, FFI_TRAMPOLINE_SIZE); +#endif + + break; + } + + case FFI_AIX: + { + FFI_ASSERT (cif->abi == FFI_AIX); + + ffi_aix_trampoline_struct* tramp_aix = + (ffi_aix_trampoline_struct*)(closure->tramp); + aix_fd* fd = (aix_fd*)(void*)ffi_closure_ASM; + + tramp_aix->code_pointer = fd->code_pointer; + tramp_aix->toc = fd->toc; + tramp_aix->static_chain = closure; + closure->cif = cif; + closure->fun = fun; + closure->user_data = user_data; + break; + } + + default: + return FFI_BAD_ABI; + } + + return FFI_OK; +} + +#if defined(__ppc__) + typedef double ldbits[2]; + + typedef union + { + ldbits lb; + long double ld; + } ldu; +#endif + +typedef union +{ + float f; + double d; +} ffi_dblfl; + +/* The trampoline invokes ffi_closure_ASM, and on entry, r11 holds the + address of the closure. After storing the registers that could possibly + contain parameters to be passed into the stack frame and setting up space + for a return value, ffi_closure_ASM invokes the following helper function + to do most of the work. */ +int +ffi_closure_helper_DARWIN( + ffi_closure* closure, + void* rvalue, + unsigned long* pgr, + ffi_dblfl* pfr) +{ + /* rvalue is the pointer to space for return value in closure assembly + pgr is the pointer to where r3-r10 are stored in ffi_closure_ASM + pfr is the pointer to where f1-f13 are stored in ffi_closure_ASM. */ + +#if defined(__ppc__) + ldu temp_ld; +#endif + + double temp; + unsigned int i; + unsigned int nf = 0; /* number of FPRs already used. */ + unsigned int ng = 0; /* number of GPRs already used. */ + ffi_cif* cif = closure->cif; + long avn = cif->nargs; + void** avalue = alloca(cif->nargs * sizeof(void*)); + ffi_type** arg_types = cif->arg_types; + + /* Copy the caller's structure return value address so that the closure + returns the data directly to the caller. */ +#if defined(__ppc64__) + if (cif->rtype->type == FFI_TYPE_STRUCT && + ffi64_stret_needs_ptr(cif->rtype, NULL, NULL)) +#elif defined(__ppc__) + if (cif->rtype->type == FFI_TYPE_STRUCT) +#else +#error undefined architecture +#endif + { + rvalue = (void*)*pgr; + pgr++; + ng++; + } + + /* Grab the addresses of the arguments from the stack frame. */ + for (i = 0; i < avn; i++) + { + switch (arg_types[i]->type) + { + case FFI_TYPE_SINT8: + case FFI_TYPE_UINT8: + avalue[i] = (char*)pgr + MODE_CHOICE(3,7); + ng++; + pgr++; + break; + + case FFI_TYPE_SINT16: + case FFI_TYPE_UINT16: + avalue[i] = (char*)pgr + MODE_CHOICE(2,6); + ng++; + pgr++; + break; + +#if defined(__ppc__) + case FFI_TYPE_POINTER: +#endif + case FFI_TYPE_SINT32: + case FFI_TYPE_UINT32: + avalue[i] = (char*)pgr + MODE_CHOICE(0,4); + ng++; + pgr++; + + break; + + case FFI_TYPE_STRUCT: + if (cif->abi == FFI_DARWIN) + { +#if defined(__ppc64__) + unsigned int gprSize = 0; + unsigned int fprSize = 0; + unsigned int savedFPRSize = fprSize; + + avalue[i] = alloca(arg_types[i]->size); + ffi64_struct_to_ram_form(arg_types[i], (const char*)pgr, + &gprSize, (const char*)pfr, &fprSize, &nf, avalue[i], NULL); + + ng += gprSize / sizeof(long); + pgr += gprSize / sizeof(long); + pfr += (fprSize - savedFPRSize) / sizeof(double); + +#elif defined(__ppc__) + /* Structures that match the basic modes (QI 1 byte, HI 2 bytes, + SI 4 bytes) are aligned as if they were those modes. */ + unsigned int size_al = size_al = arg_types[i]->size; + + /* If the first member of the struct is a double, then align + the struct to double-word. */ + if (arg_types[i]->elements[0]->type == FFI_TYPE_DOUBLE) + size_al = ALIGN(arg_types[i]->size, 8); + + if (size_al < 3) + avalue[i] = (void*)pgr + MODE_CHOICE(4,8) - size_al; + else + avalue[i] = (void*)pgr; + + ng += (size_al + 3) / sizeof(long); + pgr += (size_al + 3) / sizeof(long); +#else +#error undefined architecture +#endif + } + + break; + +#if defined(__ppc64__) + case FFI_TYPE_POINTER: +#endif + case FFI_TYPE_SINT64: + case FFI_TYPE_UINT64: + /* Long long ints are passed in 1 or 2 GPRs. */ + avalue[i] = pgr; + ng += MODE_CHOICE(2,1); + pgr += MODE_CHOICE(2,1); + + break; + + case FFI_TYPE_FLOAT: + /* A float value consumes a GPR. + There are 13 64-bit floating point registers. */ + if (nf < NUM_FPR_ARG_REGISTERS) + { + temp = pfr->d; + pfr->f = (float)temp; + avalue[i] = pfr; + pfr++; + } + else + avalue[i] = pgr; + + nf++; + ng++; + pgr++; + break; + + case FFI_TYPE_DOUBLE: + /* A double value consumes one or two GPRs. + There are 13 64bit floating point registers. */ + if (nf < NUM_FPR_ARG_REGISTERS) + { + avalue[i] = pfr; + pfr++; + } + else + avalue[i] = pgr; + + nf++; + ng += MODE_CHOICE(2,1); + pgr += MODE_CHOICE(2,1); + + break; + +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + + case FFI_TYPE_LONGDOUBLE: +#if defined(__ppc64__) + if (nf < NUM_FPR_ARG_REGISTERS) + { + avalue[i] = pfr; + pfr += 2; + } +#elif defined(__ppc__) + /* A long double value consumes 2/4 GPRs and 2 FPRs. + There are 13 64bit floating point registers. */ + if (nf < NUM_FPR_ARG_REGISTERS - 1) + { + avalue[i] = pfr; + pfr += 2; + } + /* Here we have the situation where one part of the long double + is stored in fpr13 and the other part is already on the stack. + We use a union to pass the long double to avalue[i]. */ + else if (nf == NUM_FPR_ARG_REGISTERS - 1) + { + memcpy (&temp_ld.lb[0], pfr, sizeof(temp_ld.lb[0])); + memcpy (&temp_ld.lb[1], pgr + 2, sizeof(temp_ld.lb[1])); + avalue[i] = &temp_ld.ld; + } +#else +#error undefined architecture +#endif + else + avalue[i] = pgr; + + nf += 2; + ng += MODE_CHOICE(4,2); + pgr += MODE_CHOICE(4,2); + + break; + +#endif /* FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE */ + + default: + FFI_ASSERT(0); + break; + } + } + + (closure->fun)(cif, rvalue, avalue, closure->user_data); + + /* Tell ffi_closure_ASM to perform return type promotions. */ + return cif->rtype->type; +} + +#if defined(__ppc64__) + +/* ffi64_struct_to_ram_form + + Rebuild a struct's natural layout from buffers of concatenated registers. + Return the number of registers used. + inGPRs[0-7] == r3, inFPRs[0-7] == f1 ... +*/ +void +ffi64_struct_to_ram_form( + const ffi_type* inType, + const char* inGPRs, + unsigned int* ioGPRMarker, + const char* inFPRs, + unsigned int* ioFPRMarker, + unsigned int* ioFPRsUsed, + char* outStruct, // caller-allocated + unsigned int* ioStructMarker) +{ + unsigned int srcGMarker = 0; + unsigned int srcFMarker = 0; + unsigned int savedFMarker = 0; + unsigned int fprsUsed = 0; + unsigned int savedFPRsUsed = 0; + unsigned int destMarker = 0; + + static unsigned int recurseCount = 0; + + if (ioGPRMarker) + srcGMarker = *ioGPRMarker; + + if (ioFPRMarker) + { + srcFMarker = *ioFPRMarker; + savedFMarker = srcFMarker; + } + + if (ioFPRsUsed) + { + fprsUsed = *ioFPRsUsed; + savedFPRsUsed = fprsUsed; + } + + if (ioStructMarker) + destMarker = *ioStructMarker; + + size_t i; + + switch (inType->size) + { + case 1: case 2: case 4: + srcGMarker += 8 - inType->size; + break; + + default: + break; + } + + for (i = 0; inType->elements[i] != NULL; i++) + { + switch (inType->elements[i]->type) + { + case FFI_TYPE_FLOAT: + srcFMarker = ALIGN(srcFMarker, 4); + srcGMarker = ALIGN(srcGMarker, 4); + destMarker = ALIGN(destMarker, 4); + + if (fprsUsed < NUM_FPR_ARG_REGISTERS) + { + *(float*)&outStruct[destMarker] = + (float)*(double*)&inFPRs[srcFMarker]; + srcFMarker += 8; + fprsUsed++; + } + else + *(float*)&outStruct[destMarker] = + (float)*(double*)&inGPRs[srcGMarker]; + + srcGMarker += 4; + destMarker += 4; + + // Skip to next GPR if next element won't fit and we're + // not already at a register boundary. + if (inType->elements[i + 1] != NULL && (destMarker % 8)) + { + if (!FFI_TYPE_1_BYTE(inType->elements[i + 1]->type) && + (!FFI_TYPE_2_BYTE(inType->elements[i + 1]->type) || + (ALIGN(srcGMarker, 8) - srcGMarker) < 2) && + (!FFI_TYPE_4_BYTE(inType->elements[i + 1]->type) || + (ALIGN(srcGMarker, 8) - srcGMarker) < 4)) + srcGMarker = ALIGN(srcGMarker, 8); + } + + break; + + case FFI_TYPE_DOUBLE: + srcFMarker = ALIGN(srcFMarker, 8); + destMarker = ALIGN(destMarker, 8); + + if (fprsUsed < NUM_FPR_ARG_REGISTERS) + { + *(double*)&outStruct[destMarker] = + *(double*)&inFPRs[srcFMarker]; + srcFMarker += 8; + fprsUsed++; + } + else + *(double*)&outStruct[destMarker] = + *(double*)&inGPRs[srcGMarker]; + + destMarker += 8; + + // Skip next GPR + srcGMarker += 8; + srcGMarker = ALIGN(srcGMarker, 8); + + break; + + case FFI_TYPE_LONGDOUBLE: + destMarker = ALIGN(destMarker, 16); + + if (fprsUsed < NUM_FPR_ARG_REGISTERS) + { + srcFMarker = ALIGN(srcFMarker, 8); + srcGMarker = ALIGN(srcGMarker, 8); + *(long double*)&outStruct[destMarker] = + *(long double*)&inFPRs[srcFMarker]; + srcFMarker += 16; + fprsUsed += 2; + } + else + { + srcFMarker = ALIGN(srcFMarker, 16); + srcGMarker = ALIGN(srcGMarker, 16); + *(long double*)&outStruct[destMarker] = + *(long double*)&inGPRs[srcGMarker]; + } + + destMarker += 16; + + // Skip next 2 GPRs + srcGMarker += 16; + srcGMarker = ALIGN(srcGMarker, 8); + + break; + + case FFI_TYPE_UINT8: + case FFI_TYPE_SINT8: + { + if (inType->alignment == 1) // chars only + { + if (inType->size == 1) + outStruct[destMarker++] = inGPRs[srcGMarker++]; + else if (inType->size == 2) + { + outStruct[destMarker++] = inGPRs[srcGMarker++]; + outStruct[destMarker++] = inGPRs[srcGMarker++]; + i++; + } + else + { + memcpy(&outStruct[destMarker], + &inGPRs[srcGMarker], inType->size); + srcGMarker += inType->size; + destMarker += inType->size; + i += inType->size - 1; + } + } + else // chars and other stuff + { + outStruct[destMarker++] = inGPRs[srcGMarker++]; + + // Skip to next GPR if next element won't fit and we're + // not already at a register boundary. + if (inType->elements[i + 1] != NULL && (srcGMarker % 8)) + { + if (!FFI_TYPE_1_BYTE(inType->elements[i + 1]->type) && + (!FFI_TYPE_2_BYTE(inType->elements[i + 1]->type) || + (ALIGN(srcGMarker, 8) - srcGMarker) < 2) && + (!FFI_TYPE_4_BYTE(inType->elements[i + 1]->type) || + (ALIGN(srcGMarker, 8) - srcGMarker) < 4)) + srcGMarker = ALIGN(srcGMarker, inType->alignment); // was 8 + } + } + + break; + } + + case FFI_TYPE_UINT16: + case FFI_TYPE_SINT16: + srcGMarker = ALIGN(srcGMarker, 2); + destMarker = ALIGN(destMarker, 2); + + *(short*)&outStruct[destMarker] = + *(short*)&inGPRs[srcGMarker]; + srcGMarker += 2; + destMarker += 2; + + break; + + case FFI_TYPE_INT: + case FFI_TYPE_UINT32: + case FFI_TYPE_SINT32: + srcGMarker = ALIGN(srcGMarker, 4); + destMarker = ALIGN(destMarker, 4); + + *(int*)&outStruct[destMarker] = + *(int*)&inGPRs[srcGMarker]; + srcGMarker += 4; + destMarker += 4; + + break; + + case FFI_TYPE_POINTER: + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + srcGMarker = ALIGN(srcGMarker, 8); + destMarker = ALIGN(destMarker, 8); + + *(long long*)&outStruct[destMarker] = + *(long long*)&inGPRs[srcGMarker]; + srcGMarker += 8; + destMarker += 8; + + break; + + case FFI_TYPE_STRUCT: + recurseCount++; + ffi64_struct_to_ram_form(inType->elements[i], inGPRs, + &srcGMarker, inFPRs, &srcFMarker, &fprsUsed, + outStruct, &destMarker); + recurseCount--; + break; + + default: + FFI_ASSERT(0); // unknown element type + break; + } + } + + srcGMarker = ALIGN(srcGMarker, inType->alignment); + + // Take care of the special case for 16-byte structs, but not for + // nested structs. + if (recurseCount == 0 && srcGMarker == 16) + { + *(long double*)&outStruct[0] = *(long double*)&inGPRs[0]; + srcFMarker = savedFMarker; + fprsUsed = savedFPRsUsed; + } + + if (ioGPRMarker) + *ioGPRMarker = ALIGN(srcGMarker, 8); + + if (ioFPRMarker) + *ioFPRMarker = srcFMarker; + + if (ioFPRsUsed) + *ioFPRsUsed = fprsUsed; + + if (ioStructMarker) + *ioStructMarker = ALIGN(destMarker, 8); +} + +/* ffi64_struct_to_reg_form + + Copy a struct's elements into buffers that can be sliced into registers. + Return the sizes of the output buffers in bytes. Pass NULL buffer pointers + to calculate size only. + outGPRs[0-7] == r3, outFPRs[0-7] == f1 ... +*/ +void +ffi64_struct_to_reg_form( + const ffi_type* inType, + const char* inStruct, + unsigned int* ioStructMarker, + unsigned int* ioFPRsUsed, + char* outGPRs, // caller-allocated + unsigned int* ioGPRSize, + char* outFPRs, // caller-allocated + unsigned int* ioFPRSize) +{ + size_t i; + unsigned int srcMarker = 0; + unsigned int destGMarker = 0; + unsigned int destFMarker = 0; + unsigned int savedFMarker = 0; + unsigned int fprsUsed = 0; + unsigned int savedFPRsUsed = 0; + + static unsigned int recurseCount = 0; + + if (ioStructMarker) + srcMarker = *ioStructMarker; + + if (ioFPRsUsed) + { + fprsUsed = *ioFPRsUsed; + savedFPRsUsed = fprsUsed; + } + + if (ioGPRSize) + destGMarker = *ioGPRSize; + + if (ioFPRSize) + { + destFMarker = *ioFPRSize; + savedFMarker = destFMarker; + } + + switch (inType->size) + { + case 1: case 2: case 4: + destGMarker += 8 - inType->size; + break; + + default: + break; + } + + for (i = 0; inType->elements[i] != NULL; i++) + { + switch (inType->elements[i]->type) + { + // Shadow floating-point types in GPRs for vararg and pre-ANSI + // functions. + case FFI_TYPE_FLOAT: + // Nudge markers to next 4/8-byte boundary + srcMarker = ALIGN(srcMarker, 4); + destGMarker = ALIGN(destGMarker, 4); + destFMarker = ALIGN(destFMarker, 8); + + if (fprsUsed < NUM_FPR_ARG_REGISTERS) + { + if (outFPRs != NULL && inStruct != NULL) + *(double*)&outFPRs[destFMarker] = + (double)*(float*)&inStruct[srcMarker]; + + destFMarker += 8; + fprsUsed++; + } + + if (outGPRs != NULL && inStruct != NULL) + *(double*)&outGPRs[destGMarker] = + (double)*(float*)&inStruct[srcMarker]; + + srcMarker += 4; + destGMarker += 4; + + // Skip to next GPR if next element won't fit and we're + // not already at a register boundary. + if (inType->elements[i + 1] != NULL && (srcMarker % 8)) + { + if (!FFI_TYPE_1_BYTE(inType->elements[i + 1]->type) && + (!FFI_TYPE_2_BYTE(inType->elements[i + 1]->type) || + (ALIGN(destGMarker, 8) - destGMarker) < 2) && + (!FFI_TYPE_4_BYTE(inType->elements[i + 1]->type) || + (ALIGN(destGMarker, 8) - destGMarker) < 4)) + destGMarker = ALIGN(destGMarker, 8); + } + + break; + + case FFI_TYPE_DOUBLE: + srcMarker = ALIGN(srcMarker, 8); + destFMarker = ALIGN(destFMarker, 8); + + if (fprsUsed < NUM_FPR_ARG_REGISTERS) + { + if (outFPRs != NULL && inStruct != NULL) + *(double*)&outFPRs[destFMarker] = + *(double*)&inStruct[srcMarker]; + + destFMarker += 8; + fprsUsed++; + } + + if (outGPRs != NULL && inStruct != NULL) + *(double*)&outGPRs[destGMarker] = + *(double*)&inStruct[srcMarker]; + + srcMarker += 8; + + // Skip next GPR + destGMarker += 8; + destGMarker = ALIGN(destGMarker, 8); + + break; + + case FFI_TYPE_LONGDOUBLE: + srcMarker = ALIGN(srcMarker, 16); + + if (fprsUsed < NUM_FPR_ARG_REGISTERS) + { + destFMarker = ALIGN(destFMarker, 8); + destGMarker = ALIGN(destGMarker, 8); + + if (outFPRs != NULL && inStruct != NULL) + *(long double*)&outFPRs[destFMarker] = + *(long double*)&inStruct[srcMarker]; + + if (outGPRs != NULL && inStruct != NULL) + *(long double*)&outGPRs[destGMarker] = + *(long double*)&inStruct[srcMarker]; + + destFMarker += 16; + fprsUsed += 2; + } + else + { + destGMarker = ALIGN(destGMarker, 16); + + if (outGPRs != NULL && inStruct != NULL) + *(long double*)&outGPRs[destGMarker] = + *(long double*)&inStruct[srcMarker]; + } + + srcMarker += 16; + destGMarker += 16; // Skip next 2 GPRs + destGMarker = ALIGN(destGMarker, 8); // was 16 + + break; + + case FFI_TYPE_UINT8: + case FFI_TYPE_SINT8: + if (inType->alignment == 1) // bytes only + { + if (inType->size == 1) + { + if (outGPRs != NULL && inStruct != NULL) + outGPRs[destGMarker] = inStruct[srcMarker]; + + srcMarker++; + destGMarker++; + } + else if (inType->size == 2) + { + if (outGPRs != NULL && inStruct != NULL) + { + outGPRs[destGMarker] = inStruct[srcMarker]; + outGPRs[destGMarker + 1] = inStruct[srcMarker + 1]; + } + + srcMarker += 2; + destGMarker += 2; + + i++; + } + else + { + if (outGPRs != NULL && inStruct != NULL) + { + // Avoid memcpy for small chunks. + if (inType->size <= sizeof(long)) + *(long*)&outGPRs[destGMarker] = + *(long*)&inStruct[srcMarker]; + else + memcpy(&outGPRs[destGMarker], + &inStruct[srcMarker], inType->size); + } + + srcMarker += inType->size; + destGMarker += inType->size; + i += inType->size - 1; + } + } + else // bytes and other stuff + { + if (outGPRs != NULL && inStruct != NULL) + outGPRs[destGMarker] = inStruct[srcMarker]; + + srcMarker++; + destGMarker++; + + // Skip to next GPR if next element won't fit and we're + // not already at a register boundary. + if (inType->elements[i + 1] != NULL && (destGMarker % 8)) + { + if (!FFI_TYPE_1_BYTE(inType->elements[i + 1]->type) && + (!FFI_TYPE_2_BYTE(inType->elements[i + 1]->type) || + (ALIGN(destGMarker, 8) - destGMarker) < 2) && + (!FFI_TYPE_4_BYTE(inType->elements[i + 1]->type) || + (ALIGN(destGMarker, 8) - destGMarker) < 4)) + destGMarker = ALIGN(destGMarker, inType->alignment); // was 8 + } + } + + break; + + case FFI_TYPE_UINT16: + case FFI_TYPE_SINT16: + srcMarker = ALIGN(srcMarker, 2); + destGMarker = ALIGN(destGMarker, 2); + + if (outGPRs != NULL && inStruct != NULL) + *(short*)&outGPRs[destGMarker] = + *(short*)&inStruct[srcMarker]; + + srcMarker += 2; + destGMarker += 2; + + if (inType->elements[i + 1] == NULL) + destGMarker = ALIGN(destGMarker, inType->alignment); + + break; + + case FFI_TYPE_INT: + case FFI_TYPE_UINT32: + case FFI_TYPE_SINT32: + srcMarker = ALIGN(srcMarker, 4); + destGMarker = ALIGN(destGMarker, 4); + + if (outGPRs != NULL && inStruct != NULL) + *(int*)&outGPRs[destGMarker] = + *(int*)&inStruct[srcMarker]; + + srcMarker += 4; + destGMarker += 4; + + break; + + case FFI_TYPE_POINTER: + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + srcMarker = ALIGN(srcMarker, 8); + destGMarker = ALIGN(destGMarker, 8); + + if (outGPRs != NULL && inStruct != NULL) + *(long long*)&outGPRs[destGMarker] = + *(long long*)&inStruct[srcMarker]; + + srcMarker += 8; + destGMarker += 8; + + if (inType->elements[i + 1] == NULL) + destGMarker = ALIGN(destGMarker, inType->alignment); + + break; + + case FFI_TYPE_STRUCT: + recurseCount++; + ffi64_struct_to_reg_form(inType->elements[i], + inStruct, &srcMarker, &fprsUsed, outGPRs, + &destGMarker, outFPRs, &destFMarker); + recurseCount--; + break; + + default: + FFI_ASSERT(0); + break; + } + } + + destGMarker = ALIGN(destGMarker, inType->alignment); + + // Take care of the special case for 16-byte structs, but not for + // nested structs. + if (recurseCount == 0 && destGMarker == 16) + { + if (outGPRs != NULL && inStruct != NULL) + *(long double*)&outGPRs[0] = *(long double*)&inStruct[0]; + + destFMarker = savedFMarker; + fprsUsed = savedFPRsUsed; + } + + if (ioStructMarker) + *ioStructMarker = ALIGN(srcMarker, 8); + + if (ioFPRsUsed) + *ioFPRsUsed = fprsUsed; + + if (ioGPRSize) + *ioGPRSize = ALIGN(destGMarker, 8); + + if (ioFPRSize) + *ioFPRSize = ALIGN(destFMarker, 8); +} + +/* ffi64_stret_needs_ptr + + Determine whether a returned struct needs a pointer in r3 or can fit + in registers. +*/ + +bool +ffi64_stret_needs_ptr( + const ffi_type* inType, + unsigned short* ioGPRCount, + unsigned short* ioFPRCount) +{ + // Obvious case first- struct is larger than combined FPR size. + if (inType->size > 14 * 8) + return true; + + // Now the struct can physically fit in registers, determine if it + // also fits logically. + bool needsPtr = false; + unsigned short gprsUsed = 0; + unsigned short fprsUsed = 0; + size_t i; + + if (ioGPRCount) + gprsUsed = *ioGPRCount; + + if (ioFPRCount) + fprsUsed = *ioFPRCount; + + for (i = 0; inType->elements[i] != NULL && !needsPtr; i++) + { + switch (inType->elements[i]->type) + { + case FFI_TYPE_FLOAT: + case FFI_TYPE_DOUBLE: + gprsUsed++; + fprsUsed++; + + if (fprsUsed > 13) + needsPtr = true; + + break; + + case FFI_TYPE_LONGDOUBLE: + gprsUsed += 2; + fprsUsed += 2; + + if (fprsUsed > 14) + needsPtr = true; + + break; + + case FFI_TYPE_UINT8: + case FFI_TYPE_SINT8: + { + gprsUsed++; + + if (gprsUsed > 8) + { + needsPtr = true; + break; + } + + if (inType->elements[i + 1] == NULL) // last byte in the struct + break; + + // Count possible contiguous bytes ahead, up to 8. + unsigned short j; + + for (j = 1; j < 8; j++) + { + if (inType->elements[i + j] == NULL || + !FFI_TYPE_1_BYTE(inType->elements[i + j]->type)) + break; + } + + i += j - 1; // allow for i++ before the test condition + + break; + } + + case FFI_TYPE_UINT16: + case FFI_TYPE_SINT16: + case FFI_TYPE_INT: + case FFI_TYPE_UINT32: + case FFI_TYPE_SINT32: + case FFI_TYPE_POINTER: + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + gprsUsed++; + + if (gprsUsed > 8) + needsPtr = true; + + break; + + case FFI_TYPE_STRUCT: + needsPtr = ffi64_stret_needs_ptr( + inType->elements[i], &gprsUsed, &fprsUsed); + + break; + + default: + FFI_ASSERT(0); + break; + } + } + + if (ioGPRCount) + *ioGPRCount = gprsUsed; + + if (ioFPRCount) + *ioFPRCount = fprsUsed; + + return needsPtr; +} + +/* ffi64_data_size + + Calculate the size in bytes of an ffi type. +*/ + +unsigned int +ffi64_data_size( + const ffi_type* inType) +{ + unsigned int size = 0; + + switch (inType->type) + { + case FFI_TYPE_UINT8: + case FFI_TYPE_SINT8: + size = 1; + break; + + case FFI_TYPE_UINT16: + case FFI_TYPE_SINT16: + size = 2; + break; + + case FFI_TYPE_INT: + case FFI_TYPE_UINT32: + case FFI_TYPE_SINT32: + case FFI_TYPE_FLOAT: + size = 4; + break; + + case FFI_TYPE_POINTER: + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + case FFI_TYPE_DOUBLE: + size = 8; + break; + + case FFI_TYPE_LONGDOUBLE: + size = 16; + break; + + case FFI_TYPE_STRUCT: + ffi64_struct_to_reg_form( + inType, NULL, NULL, NULL, NULL, &size, NULL, NULL); + break; + + case FFI_TYPE_VOID: + break; + + default: + FFI_ASSERT(0); + break; + } + + return size; +} + +#endif /* defined(__ppc64__) */ +#endif /* __ppc__ || __ppc64__ */ diff -r -u ./Modules/_ctypes/libffi_osx/powerpc/ppc64-darwin_closure.S ./Modules/_ctypes/libffi_osx/powerpc/ppc64-darwin_closure.S new file mode 100644 index 0000000..7162fa1 --- /dev/null +++ ./Modules/_ctypes/libffi_osx/powerpc/ppc64-darwin_closure.S @@ -0,0 +1,418 @@ +#if defined(__ppc64__) + +/* ----------------------------------------------------------------------- + ppc64-darwin_closure.S - Copyright (c) 2002, 2003, 2004, Free Software Foundation, + Inc. based on ppc_closure.S + + PowerPC Assembly glue. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#define LIBFFI_ASM + +#include +#include // for FFI_TRAMPOLINE_SIZE +#include +#include + + .file "ppc64-darwin_closure.S" +.text + .align LOG2_GPR_BYTES + .globl _ffi_closure_ASM + +.text + .align LOG2_GPR_BYTES + +_ffi_closure_ASM: +LFB1: + mflr r0 + stg r0,SF_RETURN(r1) // save return address + + // Save GPRs 3 - 10 (aligned to 8) in the parents outgoing area. + stg r3,SF_ARG1(r1) + stg r4,SF_ARG2(r1) + stg r5,SF_ARG3(r1) + stg r6,SF_ARG4(r1) + stg r7,SF_ARG5(r1) + stg r8,SF_ARG6(r1) + stg r9,SF_ARG7(r1) + stg r10,SF_ARG8(r1) + +LCFI0: +/* 48 bytes (Linkage Area) + 64 bytes (outgoing parameter area, always reserved) + 112 bytes (14*8 for incoming FPR) + ? bytes (result) + 112 bytes (14*8 for outgoing FPR) + 16 bytes (2 saved registers) + 352 + ? total bytes +*/ + + std r31,-8(r1) // Save registers we use. + std r30,-16(r1) + mr r30,r1 // Save the old SP. + mr r31,r11 // Save the ffi_closure around ffi64_data_size. + + // Calculate the space we need. + stdu r1,-SF_MINSIZE(r1) + ld r3,FFI_TRAMPOLINE_SIZE(r31) // ffi_closure->cif* + ld r3,16(r3) // ffi_cif->rtype* + bl Lffi64_data_size$stub + ld r1,0(r1) + + addi r3,r3,352 // Add our overhead. + neg r3,r3 + li r0,-32 // Align to 32 bytes. + and r3,r3,r0 + stdux r1,r1,r3 // Grow the stack. + + mr r11,r31 // Copy the ffi_closure back. + +LCFI1: + // We want to build up an area for the parameters passed + // in registers. (both floating point and integer) + +/* 320 bytes (callee stack frame aligned to 32) + 48 bytes (caller linkage area) + 368 (start of caller parameter area aligned to 8) +*/ + + // Save FPRs 1 - 14. (aligned to 8) + stfd f1,112(r1) + stfd f2,120(r1) + stfd f3,128(r1) + stfd f4,136(r1) + stfd f5,144(r1) + stfd f6,152(r1) + stfd f7,160(r1) + stfd f8,168(r1) + stfd f9,176(r1) + stfd f10,184(r1) + stfd f11,192(r1) + stfd f12,200(r1) + stfd f13,208(r1) + stfd f14,216(r1) + + // Set up registers for the routine that actually does the work. + mr r3,r11 // context pointer from the trampoline + addi r4,r1,224 // result storage + addi r5,r30,SF_ARG1 // saved GPRs + addi r6,r1,112 // saved FPRs + bl Lffi_closure_helper_DARWIN$stub + + // Look the proper starting point in table + // by using return type as an offset. + addi r5,r1,224 // Get pointer to results area. + bl Lget_ret_type0_addr // Get pointer to Lret_type0 into LR. + mflr r4 // Move to r4. + slwi r3,r3,4 // Now multiply return type by 16. + add r3,r3,r4 // Add contents of table to table address. + mtctr r3 + bctr + +LFE1: + // Each of the ret_typeX code fragments has to be exactly 16 bytes long + // (4 instructions). For cache effectiveness we align to a 16 byte + // boundary first. + .align 4 + nop + nop + nop + +Lget_ret_type0_addr: + blrl + +// case FFI_TYPE_VOID +Lret_type0: + b Lfinish + nop + nop + nop + +// case FFI_TYPE_INT +Lret_type1: + lwz r3,4(r5) + b Lfinish + nop + nop + +// case FFI_TYPE_FLOAT +Lret_type2: + lfs f1,0(r5) + b Lfinish + nop + nop + +// case FFI_TYPE_DOUBLE +Lret_type3: + lfd f1,0(r5) + b Lfinish + nop + nop + +// case FFI_TYPE_LONGDOUBLE +Lret_type4: + lfd f1,0(r5) + lfd f2,8(r5) + b Lfinish + nop + +// case FFI_TYPE_UINT8 +Lret_type5: + lbz r3,7(r5) + b Lfinish + nop + nop + +// case FFI_TYPE_SINT8 +Lret_type6: + lbz r3,7(r5) + extsb r3,r3 + b Lfinish + nop + +// case FFI_TYPE_UINT16 +Lret_type7: + lhz r3,6(r5) + b Lfinish + nop + nop + +// case FFI_TYPE_SINT16 +Lret_type8: + lha r3,6(r5) + b Lfinish + nop + nop + +// case FFI_TYPE_UINT32 +Lret_type9: // same as Lret_type1 + lwz r3,4(r5) + b Lfinish + nop + nop + +// case FFI_TYPE_SINT32 +Lret_type10: // same as Lret_type1 + lwz r3,4(r5) + b Lfinish + nop + nop + +// case FFI_TYPE_UINT64 +Lret_type11: + ld r3,0(r5) + b Lfinish + nop + nop + +// case FFI_TYPE_SINT64 +Lret_type12: // same as Lret_type11 + ld r3,0(r5) + b Lfinish + nop + nop + +// case FFI_TYPE_STRUCT +Lret_type13: + b Lret_struct + nop + nop + nop + +// ** End 16-byte aligned cases ** +// case FFI_TYPE_POINTER +// This case assumes that FFI_TYPE_POINTER == FFI_TYPE_LAST. If more types +// are added in future, the following code will need to be updated and +// padded to 16 bytes. +Lret_type14: + lg r3,0(r5) + b Lfinish + +// copy struct into registers +Lret_struct: + ld r31,FFI_TRAMPOLINE_SIZE(r31) // ffi_closure->cif* + ld r3,16(r31) // ffi_cif->rtype* + ld r31,24(r31) // ffi_cif->flags + mr r4,r5 // copy struct* to 2nd arg + addi r7,r1,SF_ARG9 // GPR return area + addi r9,r30,-16-(14*8) // FPR return area + li r5,0 // struct offset ptr (NULL) + li r6,0 // FPR used count ptr (NULL) + li r8,0 // GPR return area size ptr (NULL) + li r10,0 // FPR return area size ptr (NULL) + bl Lffi64_struct_to_reg_form$stub + + // Load GPRs + ld r3,SF_ARG9(r1) + ld r4,SF_ARG10(r1) + ld r5,SF_ARG11(r1) + ld r6,SF_ARG12(r1) + nop + ld r7,SF_ARG13(r1) + ld r8,SF_ARG14(r1) + ld r9,SF_ARG15(r1) + ld r10,SF_ARG16(r1) + nop + + // Load FPRs + mtcrf 0x2,r31 + bf 26,Lfinish + lfd f1,-16-(14*8)(r30) + lfd f2,-16-(13*8)(r30) + lfd f3,-16-(12*8)(r30) + lfd f4,-16-(11*8)(r30) + nop + lfd f5,-16-(10*8)(r30) + lfd f6,-16-(9*8)(r30) + lfd f7,-16-(8*8)(r30) + lfd f8,-16-(7*8)(r30) + nop + lfd f9,-16-(6*8)(r30) + lfd f10,-16-(5*8)(r30) + lfd f11,-16-(4*8)(r30) + lfd f12,-16-(3*8)(r30) + nop + lfd f13,-16-(2*8)(r30) + lfd f14,-16-(1*8)(r30) + // Fall through + +// case done +Lfinish: + lg r1,0(r1) // Restore stack pointer. + ld r31,-8(r1) // Restore registers we used. + ld r30,-16(r1) + lg r0,SF_RETURN(r1) // Get return address. + mtlr r0 // Reset link register. + blr + +// END(ffi_closure_ASM) + +.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support +EH_frame1: + .set L$set$0,LECIE1-LSCIE1 + .long L$set$0 ; Length of Common Information Entry +LSCIE1: + .long 0x0 ; CIE Identifier Tag + .byte 0x1 ; CIE Version + .ascii "zR\0" ; CIE Augmentation + .byte 0x1 ; uleb128 0x1; CIE Code Alignment Factor + .byte 0x7c ; sleb128 -4; CIE Data Alignment Factor + .byte 0x41 ; CIE RA Column + .byte 0x1 ; uleb128 0x1; Augmentation size + .byte 0x10 ; FDE Encoding (pcrel) + .byte 0xc ; DW_CFA_def_cfa + .byte 0x1 ; uleb128 0x1 + .byte 0x0 ; uleb128 0x0 + .align LOG2_GPR_BYTES +LECIE1: +.globl _ffi_closure_ASM.eh +_ffi_closure_ASM.eh: +LSFDE1: + .set L$set$1,LEFDE1-LASFDE1 + .long L$set$1 ; FDE Length + +LASFDE1: + .long LASFDE1-EH_frame1 ; FDE CIE offset + .g_long LFB1-. ; FDE initial location + .set L$set$3,LFE1-LFB1 + .g_long L$set$3 ; FDE address range + .byte 0x0 ; uleb128 0x0; Augmentation size + .byte 0x4 ; DW_CFA_advance_loc4 + .set L$set$3,LCFI1-LCFI0 + .long L$set$3 + .byte 0xe ; DW_CFA_def_cfa_offset + .byte 176,1 ; uleb128 176 + .byte 0x4 ; DW_CFA_advance_loc4 + .set L$set$4,LCFI0-LFB1 + .long L$set$4 + .byte 0x11 ; DW_CFA_offset_extended_sf + .byte 0x41 ; uleb128 0x41 + .byte 0x7e ; sleb128 -2 + .align LOG2_GPR_BYTES + +LEFDE1: +.data + .align LOG2_GPR_BYTES +LDFCM0: +.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 + .align LOG2_GPR_BYTES + +Lffi_closure_helper_DARWIN$stub: + .indirect_symbol _ffi_closure_helper_DARWIN + mflr r0 + bcl 20,31,LO$ffi_closure_helper_DARWIN + +LO$ffi_closure_helper_DARWIN: + mflr r11 + addis r11,r11,ha16(L_ffi_closure_helper_DARWIN$lazy_ptr - LO$ffi_closure_helper_DARWIN) + mtlr r0 + lgu r12,lo16(L_ffi_closure_helper_DARWIN$lazy_ptr - LO$ffi_closure_helper_DARWIN)(r11) + mtctr r12 + bctr + +.lazy_symbol_pointer +L_ffi_closure_helper_DARWIN$lazy_ptr: + .indirect_symbol _ffi_closure_helper_DARWIN + .g_long dyld_stub_binding_helper + +.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 + .align LOG2_GPR_BYTES + +Lffi64_struct_to_reg_form$stub: + .indirect_symbol _ffi64_struct_to_reg_form + mflr r0 + bcl 20,31,LO$ffi64_struct_to_reg_form + +LO$ffi64_struct_to_reg_form: + mflr r11 + addis r11,r11,ha16(L_ffi64_struct_to_reg_form$lazy_ptr - LO$ffi64_struct_to_reg_form) + mtlr r0 + lgu r12,lo16(L_ffi64_struct_to_reg_form$lazy_ptr - LO$ffi64_struct_to_reg_form)(r11) + mtctr r12 + bctr + +.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 + .align LOG2_GPR_BYTES + +Lffi64_data_size$stub: + .indirect_symbol _ffi64_data_size + mflr r0 + bcl 20,31,LO$ffi64_data_size + +LO$ffi64_data_size: + mflr r11 + addis r11,r11,ha16(L_ffi64_data_size$lazy_ptr - LO$ffi64_data_size) + mtlr r0 + lgu r12,lo16(L_ffi64_data_size$lazy_ptr - LO$ffi64_data_size)(r11) + mtctr r12 + bctr + +.lazy_symbol_pointer +L_ffi64_struct_to_reg_form$lazy_ptr: + .indirect_symbol _ffi64_struct_to_reg_form + .g_long dyld_stub_binding_helper + +L_ffi64_data_size$lazy_ptr: + .indirect_symbol _ffi64_data_size + .g_long dyld_stub_binding_helper + +#endif // __ppc64__ diff -r -u ./Modules/_ctypes/libffi_osx/types.c ./Modules/_ctypes/libffi_osx/types.c new file mode 100644 index 0000000..44806ae --- /dev/null +++ ./Modules/_ctypes/libffi_osx/types.c @@ -0,0 +1,115 @@ +/* ----------------------------------------------------------------------- + types.c - Copyright (c) 1996, 1998 Red Hat, Inc. + + Predefined ffi_types needed by libffi. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#include +#include + +/* Type definitions */ +#define FFI_INTEGRAL_TYPEDEF(n, s, a, t) \ + ffi_type ffi_type_##n = { s, a, t, NULL } +#define FFI_AGGREGATE_TYPEDEF(n, e) \ + ffi_type ffi_type_##n = { 0, 0, FFI_TYPE_STRUCT, e } + +FFI_INTEGRAL_TYPEDEF(uint8, 1, 1, FFI_TYPE_UINT8); +FFI_INTEGRAL_TYPEDEF(sint8, 1, 1, FFI_TYPE_SINT8); +FFI_INTEGRAL_TYPEDEF(uint16, 2, 2, FFI_TYPE_UINT16); +FFI_INTEGRAL_TYPEDEF(sint16, 2, 2, FFI_TYPE_SINT16); +FFI_INTEGRAL_TYPEDEF(uint32, 4, 4, FFI_TYPE_UINT32); +FFI_INTEGRAL_TYPEDEF(sint32, 4, 4, FFI_TYPE_SINT32); +FFI_INTEGRAL_TYPEDEF(float, 4, 4, FFI_TYPE_FLOAT); + +/* Size and alignment are fake here. They must not be 0. */ +FFI_INTEGRAL_TYPEDEF(void, 1, 1, FFI_TYPE_VOID); + +#if defined ALPHA || defined SPARC64 || defined X86_64 || \ + defined S390X || defined IA64 || defined POWERPC64 +FFI_INTEGRAL_TYPEDEF(pointer, 8, 8, FFI_TYPE_POINTER); +#else +FFI_INTEGRAL_TYPEDEF(pointer, 4, 4, FFI_TYPE_POINTER); +#endif + +#if defined X86 || defined ARM || defined M68K || defined(X86_DARWIN) + +# ifdef X86_64 + FFI_INTEGRAL_TYPEDEF(uint64, 8, 8, FFI_TYPE_UINT64); + FFI_INTEGRAL_TYPEDEF(sint64, 8, 8, FFI_TYPE_SINT64); +# else + FFI_INTEGRAL_TYPEDEF(uint64, 8, 4, FFI_TYPE_UINT64); + FFI_INTEGRAL_TYPEDEF(sint64, 8, 4, FFI_TYPE_SINT64); +# endif + +#elif defined(POWERPC_DARWIN) +FFI_INTEGRAL_TYPEDEF(uint64, 8, 8, FFI_TYPE_UINT64); +FFI_INTEGRAL_TYPEDEF(sint64, 8, 8, FFI_TYPE_SINT64); +#elif defined SH +FFI_INTEGRAL_TYPEDEF(uint64, 8, 4, FFI_TYPE_UINT64); +FFI_INTEGRAL_TYPEDEF(sint64, 8, 4, FFI_TYPE_SINT64); +#else +FFI_INTEGRAL_TYPEDEF(uint64, 8, 8, FFI_TYPE_UINT64); +FFI_INTEGRAL_TYPEDEF(sint64, 8, 8, FFI_TYPE_SINT64); +#endif + +#if defined X86 || defined X86_WIN32 || defined M68K || defined(X86_DARWIN) + +# if defined X86_WIN32 || defined X86_64 + FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE); +# else + FFI_INTEGRAL_TYPEDEF(double, 8, 4, FFI_TYPE_DOUBLE); +# endif + +# ifdef X86_DARWIN + FFI_INTEGRAL_TYPEDEF(longdouble, 16, 16, FFI_TYPE_LONGDOUBLE); +# else + FFI_INTEGRAL_TYPEDEF(longdouble, 12, 4, FFI_TYPE_LONGDOUBLE); +# endif + +#elif defined ARM || defined SH || defined POWERPC_AIX +FFI_INTEGRAL_TYPEDEF(double, 8, 4, FFI_TYPE_DOUBLE); +FFI_INTEGRAL_TYPEDEF(longdouble, 8, 4, FFI_TYPE_LONGDOUBLE); +#elif defined POWERPC_DARWIN +FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE); + +# if __GNUC__ >= 4 + FFI_INTEGRAL_TYPEDEF(longdouble, 16, 16, FFI_TYPE_LONGDOUBLE); +# else + FFI_INTEGRAL_TYPEDEF(longdouble, 8, 8, FFI_TYPE_LONGDOUBLE); +# endif + +#elif defined SPARC +FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE); + +# ifdef SPARC64 + FFI_INTEGRAL_TYPEDEF(longdouble, 16, 16, FFI_TYPE_LONGDOUBLE); +# else + FFI_INTEGRAL_TYPEDEF(longdouble, 16, 8, FFI_TYPE_LONGDOUBLE); +# endif + +#elif defined X86_64 || defined POWERPC64 +FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE); +FFI_INTEGRAL_TYPEDEF(longdouble, 16, 16, FFI_TYPE_LONGDOUBLE); +#else +FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE); +FFI_INTEGRAL_TYPEDEF(longdouble, 8, 8, FFI_TYPE_LONGDOUBLE); +#endif \ No newline at end of file diff -r -u ./Modules/_ctypes/libffi_osx/x86/darwin64.S ./Modules/_ctypes/libffi_osx/x86/darwin64.S new file mode 100644 index 0000000..165d469 --- /dev/null +++ ./Modules/_ctypes/libffi_osx/x86/darwin64.S @@ -0,0 +1,417 @@ +/* ----------------------------------------------------------------------- + darwin64.S - Copyright (c) 2006 Free Software Foundation, Inc. + derived from unix64.S + + x86-64 Foreign Function Interface for Darwin. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#ifdef __x86_64__ +#define LIBFFI_ASM +#include +#include + + .file "darwin64.S" +.text + +/* ffi_call_unix64 (void *args, unsigned long bytes, unsigned flags, + void *raddr, void (*fnaddr)()); + + Bit o trickiness here -- ARGS+BYTES is the base of the stack frame + for this function. This has been allocated by ffi_call. We also + deallocate some of the stack that has been alloca'd. */ + + .align 3 + .globl _ffi_call_unix64 + +_ffi_call_unix64: +LUW0: + movq (%rsp), %r10 /* Load return address. */ + movq %rdi, %r12 /* Save a copy of the register area. */ + leaq (%rdi, %rsi), %rax /* Find local stack base. */ + movq %rdx, (%rax) /* Save flags. */ + movq %rcx, 8(%rax) /* Save raddr. */ + movq %rbp, 16(%rax) /* Save old frame pointer. */ + movq %r10, 24(%rax) /* Relocate return address. */ + movq %rax, %rbp /* Finalize local stack frame. */ +LUW1: + /* movq %rdi, %r10 // Save a copy of the register area. */ + movq %r12, %r10 + movq %r8, %r11 /* Save a copy of the target fn. */ + movl %r9d, %eax /* Set number of SSE registers. */ + + /* Load up all argument registers. */ + movq (%r10), %rdi + movq 8(%r10), %rsi + movq 16(%r10), %rdx + movq 24(%r10), %rcx + movq 32(%r10), %r8 + movq 40(%r10), %r9 + testl %eax, %eax + jnz Lload_sse +Lret_from_load_sse: + + /* Deallocate the reg arg area. */ + leaq 176(%r10), %rsp + + /* Call the user function. */ + call *%r11 + + /* Deallocate stack arg area; local stack frame in redzone. */ + leaq 24(%rbp), %rsp + + movq 0(%rbp), %rcx /* Reload flags. */ + movq 8(%rbp), %rdi /* Reload raddr. */ + movq 16(%rbp), %rbp /* Reload old frame pointer. */ +LUW2: + + /* The first byte of the flags contains the FFI_TYPE. */ + movzbl %cl, %r10d + leaq Lstore_table(%rip), %r11 + movslq (%r11, %r10, 4), %r10 + addq %r11, %r10 + jmp *%r10 + +Lstore_table: + .long Lst_void-Lstore_table /* FFI_TYPE_VOID */ + .long Lst_sint32-Lstore_table /* FFI_TYPE_INT */ + .long Lst_float-Lstore_table /* FFI_TYPE_FLOAT */ + .long Lst_double-Lstore_table /* FFI_TYPE_DOUBLE */ + .long Lst_ldouble-Lstore_table /* FFI_TYPE_LONGDOUBLE */ + .long Lst_uint8-Lstore_table /* FFI_TYPE_UINT8 */ + .long Lst_sint8-Lstore_table /* FFI_TYPE_SINT8 */ + .long Lst_uint16-Lstore_table /* FFI_TYPE_UINT16 */ + .long Lst_sint16-Lstore_table /* FFI_TYPE_SINT16 */ + .long Lst_uint32-Lstore_table /* FFI_TYPE_UINT32 */ + .long Lst_sint32-Lstore_table /* FFI_TYPE_SINT32 */ + .long Lst_int64-Lstore_table /* FFI_TYPE_UINT64 */ + .long Lst_int64-Lstore_table /* FFI_TYPE_SINT64 */ + .long Lst_struct-Lstore_table /* FFI_TYPE_STRUCT */ + .long Lst_int64-Lstore_table /* FFI_TYPE_POINTER */ + + .text + .align 3 +Lst_void: + ret + .align 3 +Lst_uint8: + movzbq %al, %rax + movq %rax, (%rdi) + ret + .align 3 +Lst_sint8: + movsbq %al, %rax + movq %rax, (%rdi) + ret + .align 3 +Lst_uint16: + movzwq %ax, %rax + movq %rax, (%rdi) + .align 3 +Lst_sint16: + movswq %ax, %rax + movq %rax, (%rdi) + ret + .align 3 +Lst_uint32: + movl %eax, %eax + movq %rax, (%rdi) + .align 3 +Lst_sint32: + cltq + movq %rax, (%rdi) + ret + .align 3 +Lst_int64: + movq %rax, (%rdi) + ret + .align 3 +Lst_float: + movss %xmm0, (%rdi) + ret + .align 3 +Lst_double: + movsd %xmm0, (%rdi) + ret +Lst_ldouble: + fstpt (%rdi) + ret + .align 3 +Lst_struct: + leaq -20(%rsp), %rsi /* Scratch area in redzone. */ + + /* We have to locate the values now, and since we don't want to + write too much data into the user's return value, we spill the + value to a 16 byte scratch area first. Bits 8, 9, and 10 + control where the values are located. Only one of the three + bits will be set; see ffi_prep_cif_machdep for the pattern. */ + movd %xmm0, %r10 + movd %xmm1, %r11 + testl $0x100, %ecx + cmovnz %rax, %rdx + cmovnz %r10, %rax + testl $0x200, %ecx + cmovnz %r10, %rdx + testl $0x400, %ecx + cmovnz %r10, %rax + cmovnz %r11, %rdx + movq %rax, (%rsi) + movq %rdx, 8(%rsi) + + /* Bits 12-31 contain the true size of the structure. Copy from + the scratch area to the true destination. */ + shrl $12, %ecx + rep movsb + ret + + /* Many times we can avoid loading any SSE registers at all. + It's not worth an indirect jump to load the exact set of + SSE registers needed; zero or all is a good compromise. */ + .align 3 +LUW3: +Lload_sse: + movdqa 48(%r10), %xmm0 + movdqa 64(%r10), %xmm1 + movdqa 80(%r10), %xmm2 + movdqa 96(%r10), %xmm3 + movdqa 112(%r10), %xmm4 + movdqa 128(%r10), %xmm5 + movdqa 144(%r10), %xmm6 + movdqa 160(%r10), %xmm7 + jmp Lret_from_load_sse + +LUW4: + .align 3 + .globl _ffi_closure_unix64 + +_ffi_closure_unix64: +LUW5: + /* The carry flag is set by the trampoline iff SSE registers + are used. Don't clobber it before the branch instruction. */ + leaq -200(%rsp), %rsp +LUW6: + movq %rdi, (%rsp) + movq %rsi, 8(%rsp) + movq %rdx, 16(%rsp) + movq %rcx, 24(%rsp) + movq %r8, 32(%rsp) + movq %r9, 40(%rsp) + jc Lsave_sse +Lret_from_save_sse: + + movq %r10, %rdi + leaq 176(%rsp), %rsi + movq %rsp, %rdx + leaq 208(%rsp), %rcx + call _ffi_closure_unix64_inner + + /* Deallocate stack frame early; return value is now in redzone. */ + addq $200, %rsp +LUW7: + + /* The first byte of the return value contains the FFI_TYPE. */ + movzbl %al, %r10d + leaq Lload_table(%rip), %r11 + movslq (%r11, %r10, 4), %r10 + addq %r11, %r10 + jmp *%r10 + +Lload_table: + .long Lld_void-Lload_table /* FFI_TYPE_VOID */ + .long Lld_int32-Lload_table /* FFI_TYPE_INT */ + .long Lld_float-Lload_table /* FFI_TYPE_FLOAT */ + .long Lld_double-Lload_table /* FFI_TYPE_DOUBLE */ + .long Lld_ldouble-Lload_table /* FFI_TYPE_LONGDOUBLE */ + .long Lld_int8-Lload_table /* FFI_TYPE_UINT8 */ + .long Lld_int8-Lload_table /* FFI_TYPE_SINT8 */ + .long Lld_int16-Lload_table /* FFI_TYPE_UINT16 */ + .long Lld_int16-Lload_table /* FFI_TYPE_SINT16 */ + .long Lld_int32-Lload_table /* FFI_TYPE_UINT32 */ + .long Lld_int32-Lload_table /* FFI_TYPE_SINT32 */ + .long Lld_int64-Lload_table /* FFI_TYPE_UINT64 */ + .long Lld_int64-Lload_table /* FFI_TYPE_SINT64 */ + .long Lld_struct-Lload_table /* FFI_TYPE_STRUCT */ + .long Lld_int64-Lload_table /* FFI_TYPE_POINTER */ + + .text + .align 3 +Lld_void: + ret + .align 3 +Lld_int8: + movzbl -24(%rsp), %eax + ret + .align 3 +Lld_int16: + movzwl -24(%rsp), %eax + ret + .align 3 +Lld_int32: + movl -24(%rsp), %eax + ret + .align 3 +Lld_int64: + movq -24(%rsp), %rax + ret + .align 3 +Lld_float: + movss -24(%rsp), %xmm0 + ret + .align 3 +Lld_double: + movsd -24(%rsp), %xmm0 + ret + .align 3 +Lld_ldouble: + fldt -24(%rsp) + ret + .align 3 +Lld_struct: + /* There are four possibilities here, %rax/%rdx, %xmm0/%rax, + %rax/%xmm0, %xmm0/%xmm1. We collapse two by always loading + both rdx and xmm1 with the second word. For the remaining, + bit 8 set means xmm0 gets the second word, and bit 9 means + that rax gets the second word. */ + movq -24(%rsp), %rcx + movq -16(%rsp), %rdx + movq -16(%rsp), %xmm1 + testl $0x100, %eax + cmovnz %rdx, %rcx + movd %rcx, %xmm0 + testl $0x200, %eax + movq -24(%rsp), %rax + cmovnz %rdx, %rax + ret + + /* See the comment above Lload_sse; the same logic applies here. */ + .align 3 +LUW8: +Lsave_sse: + movdqa %xmm0, 48(%rsp) + movdqa %xmm1, 64(%rsp) + movdqa %xmm2, 80(%rsp) + movdqa %xmm3, 96(%rsp) + movdqa %xmm4, 112(%rsp) + movdqa %xmm5, 128(%rsp) + movdqa %xmm6, 144(%rsp) + movdqa %xmm7, 160(%rsp) + jmp Lret_from_save_sse + +LUW9: +.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support +EH_frame1: + .set L$set$0,LECIE1-LSCIE1 /* CIE Length */ + .long L$set$0 +LSCIE1: + .long 0x0 /* CIE Identifier Tag */ + .byte 0x1 /* CIE Version */ + .ascii "zR\0" /* CIE Augmentation */ + .byte 0x1 /* uleb128 0x1; CIE Code Alignment Factor */ + .byte 0x78 /* sleb128 -8; CIE Data Alignment Factor */ + .byte 0x10 /* CIE RA Column */ + .byte 0x1 /* uleb128 0x1; Augmentation size */ + .byte 0x10 /* FDE Encoding (pcrel sdata4) */ + .byte 0xc /* DW_CFA_def_cfa, %rsp offset 8 */ + .byte 0x7 /* uleb128 0x7 */ + .byte 0x8 /* uleb128 0x8 */ + .byte 0x90 /* DW_CFA_offset, column 0x10 */ + .byte 0x1 + .align 3 +LECIE1: + .globl _ffi_call_unix64.eh +_ffi_call_unix64.eh: +LSFDE1: + .set L$set$1,LEFDE1-LASFDE1 /* FDE Length */ + .long L$set$1 +LASFDE1: + .long LASFDE1-EH_frame1 /* FDE CIE offset */ + .quad LUW0-. /* FDE initial location */ + .set L$set$2,LUW4-LUW0 /* FDE address range */ + .quad L$set$2 + .byte 0x0 /* Augmentation size */ + .byte 0x4 /* DW_CFA_advance_loc4 */ + .set L$set$3,LUW1-LUW0 + .long L$set$3 + + /* New stack frame based off rbp. This is a itty bit of unwind + trickery in that the CFA *has* changed. There is no easy way + to describe it correctly on entry to the function. Fortunately, + it doesn't matter too much since at all points we can correctly + unwind back to ffi_call. Note that the location to which we + moved the return address is (the new) CFA-8, so from the + perspective of the unwind info, it hasn't moved. */ + .byte 0xc /* DW_CFA_def_cfa, %rbp offset 32 */ + .byte 0x6 + .byte 0x20 + .byte 0x80+6 /* DW_CFA_offset, %rbp offset 2*-8 */ + .byte 0x2 + .byte 0xa /* DW_CFA_remember_state */ + + .byte 0x4 /* DW_CFA_advance_loc4 */ + .set L$set$4,LUW2-LUW1 + .long L$set$4 + .byte 0xc /* DW_CFA_def_cfa, %rsp offset 8 */ + .byte 0x7 + .byte 0x8 + .byte 0xc0+6 /* DW_CFA_restore, %rbp */ + + .byte 0x4 /* DW_CFA_advance_loc4 */ + .set L$set$5,LUW3-LUW2 + .long L$set$5 + .byte 0xb /* DW_CFA_restore_state */ + + .align 3 +LEFDE1: + .globl _ffi_closure_unix64.eh +_ffi_closure_unix64.eh: +LSFDE3: + .set L$set$6,LEFDE3-LASFDE3 /* FDE Length */ + .long L$set$6 +LASFDE3: + .long LASFDE3-EH_frame1 /* FDE CIE offset */ + .quad LUW5-. /* FDE initial location */ + .set L$set$7,LUW9-LUW5 /* FDE address range */ + .quad L$set$7 + .byte 0x0 /* Augmentation size */ + + .byte 0x4 /* DW_CFA_advance_loc4 */ + .set L$set$8,LUW6-LUW5 + .long L$set$8 + .byte 0xe /* DW_CFA_def_cfa_offset */ + .byte 208,1 /* uleb128 208 */ + .byte 0xa /* DW_CFA_remember_state */ + + .byte 0x4 /* DW_CFA_advance_loc4 */ + .set L$set$9,LUW7-LUW6 + .long L$set$9 + .byte 0xe /* DW_CFA_def_cfa_offset */ + .byte 0x8 + + .byte 0x4 /* DW_CFA_advance_loc4 */ + .set L$set$10,LUW8-LUW7 + .long L$set$10 + .byte 0xb /* DW_CFA_restore_state */ + + .align 3 +LEFDE3: + .subsections_via_symbols + +#endif /* __x86_64__ */ diff -r -u ./Modules/_ctypes/libffi_osx/x86/x86-darwin.S ./Modules/_ctypes/libffi_osx/x86/x86-darwin.S new file mode 100644 index 0000000..925a841 --- /dev/null +++ ./Modules/_ctypes/libffi_osx/x86/x86-darwin.S @@ -0,0 +1,422 @@ +#ifdef __i386__ +/* ----------------------------------------------------------------------- + darwin.S - Copyright (c) 1996, 1998, 2001, 2002, 2003 Red Hat, Inc. + + X86 Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +/* + * This file is based on sysv.S and then hacked up by Ronald who hasn't done + * assembly programming in 8 years. + */ + +#ifndef __x86_64__ + +#define LIBFFI_ASM +#include +#include + +#ifdef PyObjC_STRICT_DEBUGGING + /* XXX: Debugging of stack alignment, to be removed */ +#define ASSERT_STACK_ALIGNED movdqa -16(%esp), %xmm0 +#else +#define ASSERT_STACK_ALIGNED +#endif + +.text + +.globl _ffi_prep_args + + .align 4 +.globl _ffi_call_SYSV + +_ffi_call_SYSV: +LFB1: + pushl %ebp +LCFI0: + movl %esp,%ebp +LCFI1: + subl $8,%esp + /* Make room for all of the new args. */ + movl 16(%ebp),%ecx + subl %ecx,%esp + + movl %esp,%eax + + /* Place all of the ffi_prep_args in position */ + subl $8,%esp + pushl 12(%ebp) + pushl %eax + call *8(%ebp) + + /* Return stack to previous state and call the function */ + addl $16,%esp + + call *28(%ebp) + + /* Remove the space we pushed for the args */ + movl 16(%ebp),%ecx + addl %ecx,%esp + + /* Load %ecx with the return type code */ + movl 20(%ebp),%ecx + + /* If the return value pointer is NULL, assume no return value. */ + cmpl $0,24(%ebp) + jne Lretint + + /* Even if there is no space for the return value, we are + obliged to handle floating-point values. */ + cmpl $FFI_TYPE_FLOAT,%ecx + jne Lnoretval + fstp %st(0) + + jmp Lepilogue + +Lretint: + cmpl $FFI_TYPE_INT,%ecx + jne Lretfloat + /* Load %ecx with the pointer to storage for the return value */ + movl 24(%ebp),%ecx + movl %eax,0(%ecx) + jmp Lepilogue + +Lretfloat: + cmpl $FFI_TYPE_FLOAT,%ecx + jne Lretdouble + /* Load %ecx with the pointer to storage for the return value */ + movl 24(%ebp),%ecx + fstps (%ecx) + jmp Lepilogue + +Lretdouble: + cmpl $FFI_TYPE_DOUBLE,%ecx + jne Lretlongdouble + /* Load %ecx with the pointer to storage for the return value */ + movl 24(%ebp),%ecx + fstpl (%ecx) + jmp Lepilogue + +Lretlongdouble: + cmpl $FFI_TYPE_LONGDOUBLE,%ecx + jne Lretint64 + /* Load %ecx with the pointer to storage for the return value */ + movl 24(%ebp),%ecx + fstpt (%ecx) + jmp Lepilogue + +Lretint64: + cmpl $FFI_TYPE_SINT64,%ecx + jne Lretstruct1b + /* Load %ecx with the pointer to storage for the return value */ + movl 24(%ebp),%ecx + movl %eax,0(%ecx) + movl %edx,4(%ecx) + jmp Lepilogue + +Lretstruct1b: + cmpl $FFI_TYPE_SINT8,%ecx + jne Lretstruct2b + /* Load %ecx with the pointer to storage for the return value */ + movl 24(%ebp),%ecx + movb %al,0(%ecx) + jmp Lepilogue + +Lretstruct2b: + cmpl $FFI_TYPE_SINT16,%ecx + jne Lretstruct + /* Load %ecx with the pointer to storage for the return value */ + movl 24(%ebp),%ecx + movw %ax,0(%ecx) + jmp Lepilogue + +Lretstruct: + cmpl $FFI_TYPE_STRUCT,%ecx + jne Lnoretval + /* Nothing to do! */ + addl $4,%esp + popl %ebp + ret + +Lnoretval: +Lepilogue: + addl $8,%esp + movl %ebp,%esp + popl %ebp + ret +LFE1: +.ffi_call_SYSV_end: + + .align 4 +FFI_HIDDEN (ffi_closure_SYSV) +.globl _ffi_closure_SYSV + +_ffi_closure_SYSV: +LFB2: + pushl %ebp +LCFI2: + movl %esp, %ebp +LCFI3: + subl $56, %esp + leal -40(%ebp), %edx + movl %edx, -12(%ebp) /* resp */ + leal 8(%ebp), %edx + movl %edx, 4(%esp) /* args = __builtin_dwarf_cfa () */ + leal -12(%ebp), %edx + movl %edx, (%esp) /* &resp */ + movl %ebx, 8(%esp) +LCFI7: + call L_ffi_closure_SYSV_inner$stub + movl 8(%esp), %ebx + movl -12(%ebp), %ecx + cmpl $FFI_TYPE_INT, %eax + je Lcls_retint + cmpl $FFI_TYPE_FLOAT, %eax + je Lcls_retfloat + cmpl $FFI_TYPE_DOUBLE, %eax + je Lcls_retdouble + cmpl $FFI_TYPE_LONGDOUBLE, %eax + je Lcls_retldouble + cmpl $FFI_TYPE_SINT64, %eax + je Lcls_retllong + cmpl $FFI_TYPE_UINT8, %eax + je Lcls_retstruct1 + cmpl $FFI_TYPE_SINT8, %eax + je Lcls_retstruct1 + cmpl $FFI_TYPE_UINT16, %eax + je Lcls_retstruct2 + cmpl $FFI_TYPE_SINT16, %eax + je Lcls_retstruct2 + cmpl $FFI_TYPE_STRUCT, %eax + je Lcls_retstruct +Lcls_epilogue: + movl %ebp, %esp + popl %ebp + ret +Lcls_retint: + movl (%ecx), %eax + jmp Lcls_epilogue +Lcls_retfloat: + flds (%ecx) + jmp Lcls_epilogue +Lcls_retdouble: + fldl (%ecx) + jmp Lcls_epilogue +Lcls_retldouble: + fldt (%ecx) + jmp Lcls_epilogue +Lcls_retllong: + movl (%ecx), %eax + movl 4(%ecx), %edx + jmp Lcls_epilogue +Lcls_retstruct1: + movsbl (%ecx), %eax + jmp Lcls_epilogue +Lcls_retstruct2: + movswl (%ecx), %eax + jmp Lcls_epilogue +Lcls_retstruct: + lea -8(%ebp),%esp + movl %ebp, %esp + popl %ebp + ret $4 +LFE2: + +#if !FFI_NO_RAW_API + +#define RAW_CLOSURE_CIF_OFFSET ((FFI_TRAMPOLINE_SIZE + 3) & ~3) +#define RAW_CLOSURE_FUN_OFFSET (RAW_CLOSURE_CIF_OFFSET + 4) +#define RAW_CLOSURE_USER_DATA_OFFSET (RAW_CLOSURE_FUN_OFFSET + 4) +#define CIF_FLAGS_OFFSET 20 + + .align 4 +FFI_HIDDEN (ffi_closure_raw_SYSV) +.globl _ffi_closure_raw_SYSV + +_ffi_closure_raw_SYSV: +LFB3: + pushl %ebp +LCFI4: + movl %esp, %ebp +LCFI5: + pushl %esi +LCFI6: + subl $36, %esp + movl RAW_CLOSURE_CIF_OFFSET(%eax), %esi /* closure->cif */ + movl RAW_CLOSURE_USER_DATA_OFFSET(%eax), %edx /* closure->user_data */ + movl %edx, 12(%esp) /* user_data */ + leal 8(%ebp), %edx /* __builtin_dwarf_cfa () */ + movl %edx, 8(%esp) /* raw_args */ + leal -24(%ebp), %edx + movl %edx, 4(%esp) /* &res */ + movl %esi, (%esp) /* cif */ + call *RAW_CLOSURE_FUN_OFFSET(%eax) /* closure->fun */ + movl CIF_FLAGS_OFFSET(%esi), %eax /* rtype */ + cmpl $FFI_TYPE_INT, %eax + je Lrcls_retint + cmpl $FFI_TYPE_FLOAT, %eax + je Lrcls_retfloat + cmpl $FFI_TYPE_DOUBLE, %eax + je Lrcls_retdouble + cmpl $FFI_TYPE_LONGDOUBLE, %eax + je Lrcls_retldouble + cmpl $FFI_TYPE_SINT64, %eax + je Lrcls_retllong +Lrcls_epilogue: + addl $36, %esp + popl %esi + popl %ebp + ret +Lrcls_retint: + movl -24(%ebp), %eax + jmp Lrcls_epilogue +Lrcls_retfloat: + flds -24(%ebp) + jmp Lrcls_epilogue +Lrcls_retdouble: + fldl -24(%ebp) + jmp Lrcls_epilogue +Lrcls_retldouble: + fldt -24(%ebp) + jmp Lrcls_epilogue +Lrcls_retllong: + movl -24(%ebp), %eax + movl -20(%ebp), %edx + jmp Lrcls_epilogue +LFE3: +#endif + +.section __IMPORT,__jump_table,symbol_stubs,self_modifying_code+pure_instructions,5 +L_ffi_closure_SYSV_inner$stub: + .indirect_symbol _ffi_closure_SYSV_inner + hlt ; hlt ; hlt ; hlt ; hlt + + +.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support +EH_frame1: + .set L$set$0,LECIE1-LSCIE1 + .long L$set$0 +LSCIE1: + .long 0x0 + .byte 0x1 + .ascii "zR\0" + .byte 0x1 + .byte 0x7c + .byte 0x8 + .byte 0x1 + .byte 0x10 + .byte 0xc + .byte 0x5 + .byte 0x4 + .byte 0x88 + .byte 0x1 + .align 2 +LECIE1: +.globl _ffi_call_SYSV.eh +_ffi_call_SYSV.eh: +LSFDE1: + .set L$set$1,LEFDE1-LASFDE1 + .long L$set$1 +LASFDE1: + .long LASFDE1-EH_frame1 + .long LFB1-. + .set L$set$2,LFE1-LFB1 + .long L$set$2 + .byte 0x0 + .byte 0x4 + .set L$set$3,LCFI0-LFB1 + .long L$set$3 + .byte 0xe + .byte 0x8 + .byte 0x84 + .byte 0x2 + .byte 0x4 + .set L$set$4,LCFI1-LCFI0 + .long L$set$4 + .byte 0xd + .byte 0x4 + .align 2 +LEFDE1: +.globl _ffi_closure_SYSV.eh +_ffi_closure_SYSV.eh: +LSFDE2: + .set L$set$5,LEFDE2-LASFDE2 + .long L$set$5 +LASFDE2: + .long LASFDE2-EH_frame1 + .long LFB2-. + .set L$set$6,LFE2-LFB2 + .long L$set$6 + .byte 0x0 + .byte 0x4 + .set L$set$7,LCFI2-LFB2 + .long L$set$7 + .byte 0xe + .byte 0x8 + .byte 0x84 + .byte 0x2 + .byte 0x4 + .set L$set$8,LCFI3-LCFI2 + .long L$set$8 + .byte 0xd + .byte 0x4 + .align 2 +LEFDE2: + +#if !FFI_NO_RAW_API + +.globl _ffi_closure_raw_SYSV.eh +_ffi_closure_raw_SYSV.eh: +LSFDE3: + .set L$set$10,LEFDE3-LASFDE3 + .long L$set$10 +LASFDE3: + .long LASFDE3-EH_frame1 + .long LFB3-. + .set L$set$11,LFE3-LFB3 + .long L$set$11 + .byte 0x0 + .byte 0x4 + .set L$set$12,LCFI4-LFB3 + .long L$set$12 + .byte 0xe + .byte 0x8 + .byte 0x84 + .byte 0x2 + .byte 0x4 + .set L$set$13,LCFI5-LCFI4 + .long L$set$13 + .byte 0xd + .byte 0x4 + .byte 0x4 + .set L$set$14,LCFI6-LCFI5 + .long L$set$14 + .byte 0x85 + .byte 0x3 + .align 2 +LEFDE3: + +#endif + +#endif /* ifndef __x86_64__ */ + +#endif /* defined __i386__ */ diff -r -u ./Modules/_ctypes/libffi_osx/x86/x86-ffi64.c ./Modules/_ctypes/libffi_osx/x86/x86-ffi64.c new file mode 100644 index 0000000..06feaf2 --- /dev/null +++ ./Modules/_ctypes/libffi_osx/x86/x86-ffi64.c @@ -0,0 +1,734 @@ +#ifdef __x86_64__ + +/* ----------------------------------------------------------------------- + x86-ffi64.c - Copyright (c) 2002 Bo Thorsen + + x86-64 Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#include +#include + +#include +#include + +#define MAX_GPR_REGS 6 +#define MAX_SSE_REGS 8 + +typedef struct RegisterArgs { + /* Registers for argument passing. */ + UINT64 gpr[MAX_GPR_REGS]; + __int128_t sse[MAX_SSE_REGS]; +} RegisterArgs; + +extern void +ffi_call_unix64( + void* args, + unsigned long bytes, + unsigned flags, + void* raddr, + void (*fnaddr)(), + unsigned ssecount); + +/* All reference to register classes here is identical to the code in + gcc/config/i386/i386.c. Do *not* change one without the other. */ + +/* Register class used for passing given 64bit part of the argument. + These represent classes as documented by the PS ABI, with the exception + of SSESF, SSEDF classes, that are basically SSE class, just gcc will + use SF or DFmode move instead of DImode to avoid reformating penalties. + + Similary we play games with INTEGERSI_CLASS to use cheaper SImode moves + whenever possible (upper half does contain padding). */ +enum x86_64_reg_class +{ + X86_64_NO_CLASS, + X86_64_INTEGER_CLASS, + X86_64_INTEGERSI_CLASS, + X86_64_SSE_CLASS, + X86_64_SSESF_CLASS, + X86_64_SSEDF_CLASS, + X86_64_SSEUP_CLASS, + X86_64_X87_CLASS, + X86_64_X87UP_CLASS, + X86_64_COMPLEX_X87_CLASS, + X86_64_MEMORY_CLASS +}; + +#define MAX_CLASSES 4 +#define SSE_CLASS_P(X) ((X) >= X86_64_SSE_CLASS && X <= X86_64_SSEUP_CLASS) + +/* x86-64 register passing implementation. See x86-64 ABI for details. Goal + of this code is to classify each 8bytes of incoming argument by the register + class and assign registers accordingly. */ + +/* Return the union class of CLASS1 and CLASS2. + See the x86-64 PS ABI for details. */ +static enum x86_64_reg_class +merge_classes( + enum x86_64_reg_class class1, + enum x86_64_reg_class class2) +{ + /* Rule #1: If both classes are equal, this is the resulting class. */ + if (class1 == class2) + return class1; + + /* Rule #2: If one of the classes is NO_CLASS, the resulting class is + the other class. */ + if (class1 == X86_64_NO_CLASS) + return class2; + + if (class2 == X86_64_NO_CLASS) + return class1; + + /* Rule #3: If one of the classes is MEMORY, the result is MEMORY. */ + if (class1 == X86_64_MEMORY_CLASS || class2 == X86_64_MEMORY_CLASS) + return X86_64_MEMORY_CLASS; + + /* Rule #4: If one of the classes is INTEGER, the result is INTEGER. */ + if ((class1 == X86_64_INTEGERSI_CLASS && class2 == X86_64_SSESF_CLASS) + || (class2 == X86_64_INTEGERSI_CLASS && class1 == X86_64_SSESF_CLASS)) + return X86_64_INTEGERSI_CLASS; + + if (class1 == X86_64_INTEGER_CLASS || class1 == X86_64_INTEGERSI_CLASS + || class2 == X86_64_INTEGER_CLASS || class2 == X86_64_INTEGERSI_CLASS) + return X86_64_INTEGER_CLASS; + + /* Rule #5: If one of the classes is X87, X87UP, or COMPLEX_X87 class, + MEMORY is used. */ + if (class1 == X86_64_X87_CLASS + || class1 == X86_64_X87UP_CLASS + || class1 == X86_64_COMPLEX_X87_CLASS + || class2 == X86_64_X87_CLASS + || class2 == X86_64_X87UP_CLASS + || class2 == X86_64_COMPLEX_X87_CLASS) + return X86_64_MEMORY_CLASS; + + /* Rule #6: Otherwise class SSE is used. */ + return X86_64_SSE_CLASS; +} + +/* Classify the argument of type TYPE and mode MODE. + CLASSES will be filled by the register class used to pass each word + of the operand. The number of words is returned. In case the parameter + should be passed in memory, 0 is returned. As a special case for zero + sized containers, classes[0] will be NO_CLASS and 1 is returned. + + See the x86-64 PS ABI for details. */ + +static int +classify_argument( + ffi_type* type, + enum x86_64_reg_class classes[], + size_t byte_offset) +{ + switch (type->type) + { + case FFI_TYPE_UINT8: + case FFI_TYPE_SINT8: + case FFI_TYPE_UINT16: + case FFI_TYPE_SINT16: + case FFI_TYPE_UINT32: + case FFI_TYPE_SINT32: + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + case FFI_TYPE_POINTER: +#if 0 + if (byte_offset + type->size <= 4) + classes[0] = X86_64_INTEGERSI_CLASS; + else + classes[0] = X86_64_INTEGER_CLASS; + + return 1; +#else + { + int size = byte_offset + type->size; + + if (size <= 4) + { + classes[0] = X86_64_INTEGERSI_CLASS; + return 1; + } + else if (size <= 8) + { + classes[0] = X86_64_INTEGER_CLASS; + return 1; + } + else if (size <= 12) + { + classes[0] = X86_64_INTEGER_CLASS; + classes[1] = X86_64_INTEGERSI_CLASS; + return 2; + } + else if (size <= 16) + { + classes[0] = classes[1] = X86_64_INTEGERSI_CLASS; + return 2; + } + else + FFI_ASSERT (0); + } +#endif + + case FFI_TYPE_FLOAT: + if (byte_offset == 0) + classes[0] = X86_64_SSESF_CLASS; + else + classes[0] = X86_64_SSE_CLASS; + + return 1; + + case FFI_TYPE_DOUBLE: + classes[0] = X86_64_SSEDF_CLASS; + return 1; + + case FFI_TYPE_LONGDOUBLE: + classes[0] = X86_64_X87_CLASS; + classes[1] = X86_64_X87UP_CLASS; + return 2; + + case FFI_TYPE_STRUCT: + { + ffi_type** ptr; + int i; + enum x86_64_reg_class subclasses[MAX_CLASSES]; + const int UNITS_PER_WORD = 8; + int words = + (type->size + UNITS_PER_WORD - 1) / UNITS_PER_WORD; + + /* If the struct is larger than 16 bytes, pass it on the stack. */ + if (type->size > 16) + return 0; + + for (i = 0; i < words; i++) + classes[i] = X86_64_NO_CLASS; + + /* Merge the fields of structure. */ + for (ptr = type->elements; *ptr != NULL; ptr++) + { + byte_offset = ALIGN(byte_offset, (*ptr)->alignment); + + int num = classify_argument(*ptr, subclasses, byte_offset % 8); + + if (num == 0) + return 0; + + int pos = byte_offset / 8; + + for (i = 0; i < num; i++) + { + classes[i + pos] = + merge_classes(subclasses[i], classes[i + pos]); + } + + byte_offset += (*ptr)->size; + } + + if (words > 2) + { + /* When size > 16 bytes, if the first one isn't + X86_64_SSE_CLASS or any other ones aren't + X86_64_SSEUP_CLASS, everything should be passed in + memory. */ + if (classes[0] != X86_64_SSE_CLASS) + return 0; + + for (i = 1; i < words; i++) + if (classes[i] != X86_64_SSEUP_CLASS) + return 0; + } + + + /* Final merger cleanup. */ + for (i = 0; i < words; i++) + { + /* If one class is MEMORY, everything should be passed in + memory. */ + if (classes[i] == X86_64_MEMORY_CLASS) + return 0; + + /* The X86_64_SSEUP_CLASS should be always preceded by + X86_64_SSE_CLASS. */ + if (classes[i] == X86_64_SSEUP_CLASS + && classes[i - 1] != X86_64_SSE_CLASS + && classes[i - 1] != X86_64_SSEUP_CLASS) + { + FFI_ASSERT(i != 0); + classes[i] = X86_64_SSE_CLASS; + } + + /* X86_64_X87UP_CLASS should be preceded by X86_64_X87_CLASS. */ + if (classes[i] == X86_64_X87UP_CLASS + && classes[i - 1] != X86_64_X87_CLASS) + { + FFI_ASSERT(i != 0); + classes[i] = X86_64_SSE_CLASS; + } + } + + return words; + } + + default: + FFI_ASSERT(0); + } + + return 0; /* Never reached. */ +} + +/* Examine the argument and return set number of register required in each + class. Return zero if parameter should be passed in memory, otherwise + the number of registers. */ +static int +examine_argument( + ffi_type* type, + enum x86_64_reg_class classes[MAX_CLASSES], + _Bool in_return, + int* pngpr, + int* pnsse) +{ + int n = classify_argument(type, classes, 0); + int ngpr = 0; + int nsse = 0; + int i; + + if (n == 0) + return 0; + + for (i = 0; i < n; ++i) + { + switch (classes[i]) + { + case X86_64_INTEGER_CLASS: + case X86_64_INTEGERSI_CLASS: + ngpr++; + break; + + case X86_64_SSE_CLASS: + case X86_64_SSESF_CLASS: + case X86_64_SSEDF_CLASS: + nsse++; + break; + + case X86_64_NO_CLASS: + case X86_64_SSEUP_CLASS: + break; + + case X86_64_X87_CLASS: + case X86_64_X87UP_CLASS: + case X86_64_COMPLEX_X87_CLASS: + return in_return != 0; + + default: + abort(); + } + } + + *pngpr = ngpr; + *pnsse = nsse; + + return n; +} + +/* Perform machine dependent cif processing. */ +ffi_status +ffi_prep_cif_machdep( + ffi_cif* cif) +{ + int gprcount = 0; + int ssecount = 0; + int flags = cif->rtype->type; + int i, avn, n, ngpr, nsse; + enum x86_64_reg_class classes[MAX_CLASSES]; + size_t bytes; + + if (flags != FFI_TYPE_VOID) + { + n = examine_argument (cif->rtype, classes, 1, &ngpr, &nsse); + + if (n == 0) + { + /* The return value is passed in memory. A pointer to that + memory is the first argument. Allocate a register for it. */ + gprcount++; + + /* We don't have to do anything in asm for the return. */ + flags = FFI_TYPE_VOID; + } + else if (flags == FFI_TYPE_STRUCT) + { + /* Mark which registers the result appears in. */ + _Bool sse0 = SSE_CLASS_P(classes[0]); + _Bool sse1 = n == 2 && SSE_CLASS_P(classes[1]); + + if (sse0 && !sse1) + flags |= 1 << 8; + else if (!sse0 && sse1) + flags |= 1 << 9; + else if (sse0 && sse1) + flags |= 1 << 10; + + /* Mark the true size of the structure. */ + flags |= cif->rtype->size << 12; + } + } + + /* Go over all arguments and determine the way they should be passed. + If it's in a register and there is space for it, let that be so. If + not, add it's size to the stack byte count. */ + for (bytes = 0, i = 0, avn = cif->nargs; i < avn; i++) + { + if (examine_argument(cif->arg_types[i], classes, 0, &ngpr, &nsse) == 0 + || gprcount + ngpr > MAX_GPR_REGS + || ssecount + nsse > MAX_SSE_REGS) + { + long align = cif->arg_types[i]->alignment; + + if (align < 8) + align = 8; + + bytes = ALIGN(bytes, align); + bytes += cif->arg_types[i]->size; + } + else + { + gprcount += ngpr; + ssecount += nsse; + } + } + + if (ssecount) + flags |= 1 << 11; + + cif->flags = flags; + cif->bytes = bytes; + cif->bytes = ALIGN(bytes,8); + + return FFI_OK; +} + +void +ffi_call( + ffi_cif* cif, + void (*fn)(), + void* rvalue, + void** avalue) +{ + enum x86_64_reg_class classes[MAX_CLASSES]; + char* stack; + char* argp; + ffi_type** arg_types; + int gprcount, ssecount, ngpr, nsse, i, avn; + _Bool ret_in_memory; + RegisterArgs* reg_args; + + /* Can't call 32-bit mode from 64-bit mode. */ + FFI_ASSERT(cif->abi == FFI_UNIX64); + + /* If the return value is a struct and we don't have a return value + address then we need to make one. Note the setting of flags to + VOID above in ffi_prep_cif_machdep. */ + ret_in_memory = (cif->rtype->type == FFI_TYPE_STRUCT + && (cif->flags & 0xff) == FFI_TYPE_VOID); + + if (rvalue == NULL && ret_in_memory) + rvalue = alloca (cif->rtype->size); + + /* Allocate the space for the arguments, plus 4 words of temp space. */ + stack = alloca(sizeof(RegisterArgs) + cif->bytes + 4 * 8); + reg_args = (RegisterArgs*)stack; + argp = stack + sizeof(RegisterArgs); + + gprcount = ssecount = 0; + + /* If the return value is passed in memory, add the pointer as the + first integer argument. */ + if (ret_in_memory) + reg_args->gpr[gprcount++] = (long) rvalue; + + avn = cif->nargs; + arg_types = cif->arg_types; + + for (i = 0; i < avn; ++i) + { + size_t size = arg_types[i]->size; + int n; + + n = examine_argument (arg_types[i], classes, 0, &ngpr, &nsse); + + if (n == 0 + || gprcount + ngpr > MAX_GPR_REGS + || ssecount + nsse > MAX_SSE_REGS) + { + long align = arg_types[i]->alignment; + + /* Stack arguments are *always* at least 8 byte aligned. */ + if (align < 8) + align = 8; + + /* Pass this argument in memory. */ + argp = (void *) ALIGN (argp, align); + memcpy (argp, avalue[i], size); + argp += size; + } + else + { /* The argument is passed entirely in registers. */ + char *a = (char *) avalue[i]; + int j; + + for (j = 0; j < n; j++, a += 8, size -= 8) + { + switch (classes[j]) + { + case X86_64_INTEGER_CLASS: + case X86_64_INTEGERSI_CLASS: + reg_args->gpr[gprcount] = 0; + switch (arg_types[i]->type) { + case FFI_TYPE_SINT8: + { + int8_t shortval = *(int8_t*)a; + int64_t actval = (int64_t)shortval; + reg_args->gpr[gprcount] = actval; + /*memcpy (®_args->gpr[gprcount], &actval, 8);*/ + break; + } + + case FFI_TYPE_SINT16: + { + int16_t shortval = *(int16_t*)a; + int64_t actval = (int64_t)shortval; + memcpy (®_args->gpr[gprcount], &actval, 8); + break; + } + + case FFI_TYPE_SINT32: + { + int32_t shortval = *(int32_t*)a; + int64_t actval = (int64_t)shortval; + memcpy (®_args->gpr[gprcount], &actval, 8); + break; + } + + case FFI_TYPE_UINT8: + { + u_int8_t shortval = *(u_int8_t*)a; + u_int64_t actval = (u_int64_t)shortval; + /*memcpy (®_args->gpr[gprcount], &actval, 8);*/ + reg_args->gpr[gprcount] = actval; + break; + } + + case FFI_TYPE_UINT16: + { + u_int16_t shortval = *(u_int16_t*)a; + u_int64_t actval = (u_int64_t)shortval; + memcpy (®_args->gpr[gprcount], &actval, 8); + break; + } + + case FFI_TYPE_UINT32: + { + u_int32_t shortval = *(u_int32_t*)a; + u_int64_t actval = (u_int64_t)shortval; + memcpy (®_args->gpr[gprcount], &actval, 8); + break; + } + + default: + //memcpy (®_args->gpr[gprcount], a, size < 8 ? size : 8); + reg_args->gpr[gprcount] = *(int64_t*)a; + } + gprcount++; + break; + + case X86_64_SSE_CLASS: + case X86_64_SSEDF_CLASS: + reg_args->sse[ssecount++] = *(UINT64 *) a; + break; + + case X86_64_SSESF_CLASS: + reg_args->sse[ssecount++] = *(UINT32 *) a; + break; + + default: + abort(); + } + } + } + } + + ffi_call_unix64 (stack, cif->bytes + sizeof(RegisterArgs), + cif->flags, rvalue, fn, ssecount); +} + +extern void ffi_closure_unix64(void); + +ffi_status +ffi_prep_closure( + ffi_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif*, void*, void**, void*), + void* user_data) +{ + if (cif->abi != FFI_UNIX64) + return FFI_BAD_ABI; + + volatile unsigned short* tramp = + (volatile unsigned short*)&closure->tramp[0]; + + tramp[0] = 0xbb49; /* mov , %r11 */ + *(void* volatile*)&tramp[1] = ffi_closure_unix64; + tramp[5] = 0xba49; /* mov , %r10 */ + *(void* volatile*)&tramp[6] = closure; + + /* Set the carry bit if the function uses any sse registers. + This is clc or stc, together with the first byte of the jmp. */ + tramp[10] = cif->flags & (1 << 11) ? 0x49f9 : 0x49f8; + tramp[11] = 0xe3ff; /* jmp *%r11 */ + + closure->cif = cif; + closure->fun = fun; + closure->user_data = user_data; + + return FFI_OK; +} + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wmissing-prototypes" +int +ffi_closure_unix64_inner( + ffi_closure* closure, + void* rvalue, + RegisterArgs* reg_args, + char* argp) +#pragma clang diagnostic pop +{ + ffi_cif* cif = closure->cif; + void** avalue = alloca(cif->nargs * sizeof(void *)); + ffi_type** arg_types; + long i, avn; + int gprcount = 0; + int ssecount = 0; + int ngpr, nsse; + int ret; + + ret = cif->rtype->type; + + if (ret != FFI_TYPE_VOID) + { + enum x86_64_reg_class classes[MAX_CLASSES]; + int n = examine_argument (cif->rtype, classes, 1, &ngpr, &nsse); + + if (n == 0) + { + /* The return value goes in memory. Arrange for the closure + return value to go directly back to the original caller. */ + rvalue = (void *) reg_args->gpr[gprcount++]; + + /* We don't have to do anything in asm for the return. */ + ret = FFI_TYPE_VOID; + } + else if (ret == FFI_TYPE_STRUCT && n == 2) + { + /* Mark which register the second word of the structure goes in. */ + _Bool sse0 = SSE_CLASS_P (classes[0]); + _Bool sse1 = SSE_CLASS_P (classes[1]); + + if (!sse0 && sse1) + ret |= 1 << 8; + else if (sse0 && !sse1) + ret |= 1 << 9; + } + } + + avn = cif->nargs; + arg_types = cif->arg_types; + + for (i = 0; i < avn; ++i) + { + enum x86_64_reg_class classes[MAX_CLASSES]; + int n; + + n = examine_argument (arg_types[i], classes, 0, &ngpr, &nsse); + + if (n == 0 + || gprcount + ngpr > MAX_GPR_REGS + || ssecount + nsse > MAX_SSE_REGS) + { + long align = arg_types[i]->alignment; + + /* Stack arguments are *always* at least 8 byte aligned. */ + if (align < 8) + align = 8; + + /* Pass this argument in memory. */ + argp = (void *) ALIGN (argp, align); + avalue[i] = argp; + argp += arg_types[i]->size; + } + +#if !defined(X86_DARWIN) + /* If the argument is in a single register, or two consecutive + registers, then we can use that address directly. */ + else if (n == 1 || (n == 2 && + SSE_CLASS_P (classes[0]) == SSE_CLASS_P (classes[1]))) + { + // The argument is in a single register. + if (SSE_CLASS_P (classes[0])) + { + avalue[i] = ®_args->sse[ssecount]; + ssecount += n; + } + else + { + avalue[i] = ®_args->gpr[gprcount]; + gprcount += n; + } + } +#endif + + /* Otherwise, allocate space to make them consecutive. */ + else + { + char *a = alloca (16); + int j; + + avalue[i] = a; + + for (j = 0; j < n; j++, a += 8) + { + if (SSE_CLASS_P (classes[j])) + memcpy (a, ®_args->sse[ssecount++], 8); + else + memcpy (a, ®_args->gpr[gprcount++], 8); + } + } + } + + /* Invoke the closure. */ + closure->fun (cif, rvalue, avalue, closure->user_data); + + /* Tell assembly how to perform return type promotions. */ + return ret; +} + +#endif /* __x86_64__ */ diff -r -u ./Modules/_ctypes/libffi_osx/x86/x86-ffi_darwin.c ./Modules/_ctypes/libffi_osx/x86/x86-ffi_darwin.c new file mode 100644 index 0000000..706ea0f --- /dev/null +++ ./Modules/_ctypes/libffi_osx/x86/x86-ffi_darwin.c @@ -0,0 +1,438 @@ +#ifdef __i386__ +/* ----------------------------------------------------------------------- + ffi.c - Copyright (c) 1996, 1998, 1999, 2001 Red Hat, Inc. + Copyright (c) 2002 Ranjit Mathew + Copyright (c) 2002 Bo Thorsen + Copyright (c) 2002 Roger Sayle + + x86 Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#include +#include + +#include + +/* ffi_prep_args is called by the assembly routine once stack space + has been allocated for the function's arguments */ + +void ffi_prep_args(char *stack, extended_cif *ecif); + +void ffi_prep_args(char *stack, extended_cif *ecif) +{ + register unsigned int i; + register void **p_argv; + register char *argp; + register ffi_type **p_arg; + + argp = stack; + + if (ecif->cif->flags == FFI_TYPE_STRUCT) + { + *(void **) argp = ecif->rvalue; + argp += 4; + } + + p_argv = ecif->avalue; + + for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; + i != 0; + i--, p_arg++) + { + size_t z; + + /* Align if necessary */ + if ((sizeof(int) - 1) & (unsigned) argp) + argp = (char *) ALIGN(argp, sizeof(int)); + + z = (*p_arg)->size; + if (z < sizeof(int)) + { + z = sizeof(int); + switch ((*p_arg)->type) + { + case FFI_TYPE_SINT8: + *(signed int *) argp = (signed int)*(SINT8 *)(* p_argv); + break; + + case FFI_TYPE_UINT8: + *(unsigned int *) argp = (unsigned int)*(UINT8 *)(* p_argv); + break; + + case FFI_TYPE_SINT16: + *(signed int *) argp = (signed int)*(SINT16 *)(* p_argv); + break; + + case FFI_TYPE_UINT16: + *(unsigned int *) argp = (unsigned int)*(UINT16 *)(* p_argv); + break; + + case FFI_TYPE_SINT32: + *(signed int *) argp = (signed int)*(SINT32 *)(* p_argv); + break; + + case FFI_TYPE_UINT32: + *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv); + break; + + case FFI_TYPE_STRUCT: + *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv); + break; + + default: + FFI_ASSERT(0); + } + } + else + { + memcpy(argp, *p_argv, z); + } + p_argv++; + argp += z; + } + + return; +} + +/* Perform machine dependent cif processing */ +ffi_status ffi_prep_cif_machdep(ffi_cif *cif) +{ + /* Set the return type flag */ + switch (cif->rtype->type) + { + case FFI_TYPE_VOID: +#ifdef X86 + case FFI_TYPE_STRUCT: + case FFI_TYPE_UINT8: + case FFI_TYPE_UINT16: + case FFI_TYPE_SINT8: + case FFI_TYPE_SINT16: +#endif + + case FFI_TYPE_SINT64: + case FFI_TYPE_FLOAT: + case FFI_TYPE_DOUBLE: + case FFI_TYPE_LONGDOUBLE: + cif->flags = (unsigned) cif->rtype->type; + break; + + case FFI_TYPE_UINT64: + cif->flags = FFI_TYPE_SINT64; + break; + +#ifndef X86 + case FFI_TYPE_STRUCT: + if (cif->rtype->size == 1) + { + cif->flags = FFI_TYPE_SINT8; /* same as char size */ + } + else if (cif->rtype->size == 2) + { + cif->flags = FFI_TYPE_SINT16; /* same as short size */ + } + else if (cif->rtype->size == 4) + { + cif->flags = FFI_TYPE_INT; /* same as int type */ + } + else if (cif->rtype->size == 8) + { + cif->flags = FFI_TYPE_SINT64; /* same as int64 type */ + } + else + { + cif->flags = FFI_TYPE_STRUCT; + } + break; +#endif + + default: + cif->flags = FFI_TYPE_INT; + break; + } + +#ifdef X86_DARWIN + cif->bytes = (cif->bytes + 15) & ~0xF; +#endif + + return FFI_OK; +} + +extern void ffi_call_SYSV(void (*)(char *, extended_cif *), extended_cif *, + unsigned, unsigned, unsigned *, void (*fn)()); + +#ifdef X86_WIN32 +extern void ffi_call_STDCALL(void (*)(char *, extended_cif *), extended_cif *, + unsigned, unsigned, unsigned *, void (*fn)()); + +#endif /* X86_WIN32 */ + +void ffi_call(ffi_cif *cif, void (*fn)(), void *rvalue, void **avalue) +{ + extended_cif ecif; + + ecif.cif = cif; + ecif.avalue = avalue; + + /* If the return value is a struct and we don't have a return */ + /* value address then we need to make one */ + + if ((rvalue == NULL) && + (cif->flags == FFI_TYPE_STRUCT)) + { + ecif.rvalue = alloca(cif->rtype->size); + } + else + ecif.rvalue = rvalue; + + + switch (cif->abi) + { + case FFI_SYSV: + ffi_call_SYSV(ffi_prep_args, &ecif, cif->bytes, cif->flags, ecif.rvalue, + fn); + break; +#ifdef X86_WIN32 + case FFI_STDCALL: + ffi_call_STDCALL(ffi_prep_args, &ecif, cif->bytes, cif->flags, + ecif.rvalue, fn); + break; +#endif /* X86_WIN32 */ + default: + FFI_ASSERT(0); + break; + } +} + + +/** private members **/ + +static void ffi_prep_incoming_args_SYSV (char *stack, void **ret, + void** args, ffi_cif* cif); +void FFI_HIDDEN ffi_closure_SYSV (ffi_closure *) +__attribute__ ((regparm(1))); +unsigned int FFI_HIDDEN ffi_closure_SYSV_inner (ffi_closure *, void **, void *) +__attribute__ ((regparm(1))); +void FFI_HIDDEN ffi_closure_raw_SYSV (ffi_raw_closure *) +__attribute__ ((regparm(1))); + +/* This function is jumped to by the trampoline */ + +unsigned int FFI_HIDDEN +ffi_closure_SYSV_inner (closure, respp, args) +ffi_closure *closure; +void **respp; +void *args; +{ + // our various things... + ffi_cif *cif; + void **arg_area; + + cif = closure->cif; + arg_area = (void**) alloca (cif->nargs * sizeof (void*)); + + /* this call will initialize ARG_AREA, such that each + * element in that array points to the corresponding + * value on the stack; and if the function returns + * a structure, it will re-set RESP to point to the + * structure return address. */ + + ffi_prep_incoming_args_SYSV(args, respp, arg_area, cif); + + (closure->fun) (cif, *respp, arg_area, closure->user_data); + + return cif->flags; +} + +static void +ffi_prep_incoming_args_SYSV(char *stack, void **rvalue, void **avalue, + ffi_cif *cif) +{ + register unsigned int i; + register void **p_argv; + register char *argp; + register ffi_type **p_arg; + + argp = stack; + + if ( cif->flags == FFI_TYPE_STRUCT ) { + *rvalue = *(void **) argp; + argp += 4; + } + + p_argv = avalue; + + for (i = cif->nargs, p_arg = cif->arg_types; (i != 0); i--, p_arg++) + { + size_t z; + + /* Align if necessary */ + if ((sizeof(int) - 1) & (unsigned) argp) { + argp = (char *) ALIGN(argp, sizeof(int)); + } + + z = (*p_arg)->size; + + /* because we're little endian, this is what it turns into. */ + + *p_argv = (void*) argp; + + p_argv++; + argp += z; + } + + return; +} + +/* How to make a trampoline. Derived from gcc/config/i386/i386.c. */ + +#define FFI_INIT_TRAMPOLINE(TRAMP,FUN,CTX) \ +({ unsigned char *__tramp = (unsigned char*)(TRAMP); \ +unsigned int __fun = (unsigned int)(FUN); \ +unsigned int __ctx = (unsigned int)(CTX); \ +unsigned int __dis = __fun - (__ctx + FFI_TRAMPOLINE_SIZE); \ +*(unsigned char*) &__tramp[0] = 0xb8; \ +*(unsigned int*) &__tramp[1] = __ctx; /* movl __ctx, %eax */ \ +*(unsigned char *) &__tramp[5] = 0xe9; \ +*(unsigned int*) &__tramp[6] = __dis; /* jmp __fun */ \ +}) + + +/* the cif must already be prep'ed */ +ffi_status +ffi_prep_closure (ffi_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif*,void*,void**,void*), + void *user_data) +{ + if (cif->abi != FFI_SYSV) + return FFI_BAD_ABI; + + FFI_INIT_TRAMPOLINE (&closure->tramp[0], \ + &ffi_closure_SYSV, \ + (void*)closure); + + closure->cif = cif; + closure->user_data = user_data; + closure->fun = fun; + + return FFI_OK; +} + +/* ------- Native raw API support -------------------------------- */ + +#if !FFI_NO_RAW_API + +ffi_status +ffi_prep_raw_closure_loc (ffi_raw_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif*,void*,ffi_raw*,void*), + void *user_data, + void *codeloc) +{ + int i; + + FFI_ASSERT (cif->abi == FFI_SYSV); + + // we currently don't support certain kinds of arguments for raw + // closures. This should be implemented by a separate assembly language + // routine, since it would require argument processing, something we + // don't do now for performance. + + for (i = cif->nargs-1; i >= 0; i--) + { + FFI_ASSERT (cif->arg_types[i]->type != FFI_TYPE_STRUCT); + FFI_ASSERT (cif->arg_types[i]->type != FFI_TYPE_LONGDOUBLE); + } + + + FFI_INIT_TRAMPOLINE (&closure->tramp[0], &ffi_closure_raw_SYSV, + codeloc); + + closure->cif = cif; + closure->user_data = user_data; + closure->fun = fun; + + return FFI_OK; +} + +static void +ffi_prep_args_raw(char *stack, extended_cif *ecif) +{ + memcpy (stack, ecif->avalue, ecif->cif->bytes); +} + +/* we borrow this routine from libffi (it must be changed, though, to + * actually call the function passed in the first argument. as of + * libffi-1.20, this is not the case.) + */ + +extern void +ffi_call_SYSV(void (*)(char *, extended_cif *), extended_cif *, unsigned, + unsigned, unsigned *, void (*fn)()); + +#ifdef X86_WIN32 +extern void +ffi_call_STDCALL(void (*)(char *, extended_cif *), extended_cif *, unsigned, + unsigned, unsigned *, void (*fn)()); +#endif /* X86_WIN32 */ + +void +ffi_raw_call(ffi_cif *cif, void (*fn)(), void *rvalue, ffi_raw *fake_avalue) +{ + extended_cif ecif; + void **avalue = (void **)fake_avalue; + + ecif.cif = cif; + ecif.avalue = avalue; + + /* If the return value is a struct and we don't have a return */ + /* value address then we need to make one */ + + if ((rvalue == NULL) && + (cif->rtype->type == FFI_TYPE_STRUCT)) + { + ecif.rvalue = alloca(cif->rtype->size); + } + else + ecif.rvalue = rvalue; + + + switch (cif->abi) + { + case FFI_SYSV: + ffi_call_SYSV(ffi_prep_args_raw, &ecif, cif->bytes, cif->flags, + ecif.rvalue, fn); + break; +#ifdef X86_WIN32 + case FFI_STDCALL: + ffi_call_STDCALL(ffi_prep_args_raw, &ecif, cif->bytes, cif->flags, + ecif.rvalue, fn); + break; +#endif /* X86_WIN32 */ + default: + FFI_ASSERT(0); + break; + } +} + +#endif +#endif // __i386__ diff -r -u ./setup.py ./setup.py index 46b92fe..2bf6b4b 100644 --- ./setup.py +++ ./setup.py @@ -98,8 +98,14 @@ class PyBuildExt(build_ext): self.detect_modules() # Remove modules that are present on the disabled list - self.extensions = [ext for ext in self.extensions - if ext.name not in disabled_module_list] + extensions = [ext for ext in self.extensions + if ext.name not in disabled_module_list] + # move ctypes to the end, it depends on other modules + ext_map = dict((ext.name, i) for i, ext in enumerate(extensions)) + if "_ctypes" in ext_map: + ctypes = extensions.pop(ext_map["_ctypes"]) + extensions.append(ctypes) + self.extensions = extensions # Fix up the autodetected modules, prefixing all the source files # with Modules/ and adding Python's include directory to the path. @@ -1330,9 +1336,39 @@ class PyBuildExt(build_ext): # *** Uncomment these for TOGL extension only: # -lGL -lGLU -lXext -lXmu \ + def configure_ctypes_darwin(self, ext): + # Darwin (OS X) uses preconfigured files, in + # the Modules/_ctypes/libffi_osx directory. + srcdir = sysconfig.get_config_var('srcdir') + ffi_srcdir = os.path.abspath(os.path.join(srcdir, 'Modules', + '_ctypes', 'libffi_osx')) + sources = [os.path.join(ffi_srcdir, p) + for p in ['ffi.c', + 'x86/darwin64.S', + 'x86/x86-darwin.S', + 'x86/x86-ffi_darwin.c', + 'x86/x86-ffi64.c', + 'powerpc/ppc-darwin.S', + 'powerpc/ppc-darwin_closure.S', + 'powerpc/ppc-ffi_darwin.c', + 'powerpc/ppc64-darwin_closure.S', + ]] + + # Add .S (preprocessed assembly) to C compiler source extensions. + self.compiler.src_extensions.append('.S') + + include_dirs = [os.path.join(ffi_srcdir, 'include'), + os.path.join(ffi_srcdir, 'powerpc')] + ext.include_dirs.extend(include_dirs) + ext.sources.extend(sources) + return True + def configure_ctypes(self, ext): if not self.use_system_libffi: - (srcdir,) = sysconfig.get_config_vars('srcdir') + if sys.platform == 'darwin': + return self.configure_ctypes_darwin(ext) + + srcdir = sysconfig.get_config_var('srcdir') ffi_builddir = os.path.join(self.build_temp, 'libffi') ffi_srcdir = os.path.abspath(os.path.join(srcdir, 'Modules', '_ctypes', 'libffi')) @@ -1347,7 +1383,10 @@ class PyBuildExt(build_ext): ffi_configfile): from distutils.dir_util import mkpath mkpath(ffi_builddir) - config_args = [] + config_args = [arg for arg in sysconfig.get_config_var("CONFIG_ARGS").split() + if (('--host=' in arg) or ('--build=' in arg))] + if not self.verbose: + config_args.append("-q") # Pass empty CFLAGS because we'll just append the resulting # CFLAGS to Python's; -g or -O2 is to be avoided. @@ -1367,10 +1406,12 @@ class PyBuildExt(build_ext): self.compiler.src_extensions.append('.S') include_dirs = [os.path.join(ffi_builddir, 'include'), - ffi_builddir, ffi_srcdir] + ffi_builddir, + os.path.join(ffi_srcdir, 'src')] extra_compile_args = fficonfig['ffi_cflags'].split() - ext.sources.extend(fficonfig['ffi_sources']) + ext.sources.extend(os.path.join(ffi_srcdir, f) for f in + fficonfig['ffi_sources']) ext.include_dirs.extend(include_dirs) ext.extra_compile_args.extend(extra_compile_args) return True @@ -1390,6 +1431,7 @@ class PyBuildExt(build_ext): if sys.platform == 'darwin': sources.append('_ctypes/darwin/dlfcn_simple.c') + extra_compile_args.append('-DMACOSX') include_dirs.append('_ctypes/darwin') # XXX Is this still needed? ## extra_link_args.extend(['-read_only_relocs', 'warning']) @@ -1419,7 +1461,14 @@ class PyBuildExt(build_ext): if not '--with-system-ffi' in sysconfig.get_config_var("CONFIG_ARGS"): return - ffi_inc = find_file('ffi.h', [], inc_dirs) + if sys.platform == 'darwin': + # OS X 10.5 comes with libffi.dylib; the include files are + # in /usr/include/ffi + inc_dirs.append('/usr/include/ffi') + + ffi_inc = [sysconfig.get_config_var("LIBFFI_INCLUDEDIR")] + if not ffi_inc or ffi_inc[0] == '': + ffi_inc = find_file('ffi.h', [], inc_dirs) if ffi_inc is not None: ffi_h = ffi_inc[0] + '/ffi.h' fp = open(ffi_h) 005_osx_failed_modules.patch000066400000000000000000000076331517431316200353440ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.5.5/Python-2.5.5diff -r -u ./Mac/Modules/cg/_CGmodule.c ./Mac/Modules/cg/_CGmodule.c index 8115614..e36fce9 100755 --- ./Mac/Modules/cg/_CGmodule.c +++ ./Mac/Modules/cg/_CGmodule.c @@ -1025,6 +1025,7 @@ static PyObject *CGContextRefObj_CGContextSetShouldAntialias(CGContextRefObject return _res; } +#ifndef __LP64__ static PyObject *CGContextRefObj_SyncCGContextOriginWithPort(CGContextRefObject *_self, PyObject *_args) { PyObject *_res = NULL; @@ -1055,6 +1056,7 @@ static PyObject *CGContextRefObj_ClipCGContextToRegion(CGContextRefObject *_self _res = Py_None; return _res; } +#endif static PyMethodDef CGContextRefObj_methods[] = { {"CGContextSaveGState", (PyCFunction)CGContextRefObj_CGContextSaveGState, 1, @@ -1173,10 +1175,12 @@ static PyMethodDef CGContextRefObj_methods[] = { PyDoc_STR("() -> None")}, {"CGContextSetShouldAntialias", (PyCFunction)CGContextRefObj_CGContextSetShouldAntialias, 1, PyDoc_STR("(int shouldAntialias) -> None")}, +#ifndef __LP64__ {"SyncCGContextOriginWithPort", (PyCFunction)CGContextRefObj_SyncCGContextOriginWithPort, 1, PyDoc_STR("(CGrafPtr port) -> None")}, {"ClipCGContextToRegion", (PyCFunction)CGContextRefObj_ClipCGContextToRegion, 1, PyDoc_STR("(Rect portRect, RgnHandle region) -> None")}, +#endif {NULL, NULL, 0} }; @@ -1254,6 +1258,7 @@ PyTypeObject CGContextRef_Type = { /* ------------------ End object type CGContextRef ------------------ */ +#ifndef __LP64__ static PyObject *CG_CreateCGContextForPort(PyObject *_self, PyObject *_args) { PyObject *_res = NULL; @@ -1271,10 +1276,13 @@ static PyObject *CG_CreateCGContextForPort(PyObject *_self, PyObject *_args) return _res; } +#endif static PyMethodDef CG_methods[] = { +#ifndef __LP64__ {"CreateCGContextForPort", (PyCFunction)CG_CreateCGContextForPort, 1, PyDoc_STR("(CGrafPtr) -> CGContextRef")}, +#endif {NULL, NULL, 0} }; diff -r -u ./Modules/_curses_panel.c ./Modules/_curses_panel.c index 0acf3fd..1728b59 100644 --- ./Modules/_curses_panel.c +++ ./Modules/_curses_panel.c @@ -56,7 +56,7 @@ typedef struct { PyTypeObject PyCursesPanel_Type; -#define PyCursesPanel_Check(v) ((v)->ob_type == &PyCursesPanel_Type) +#define PyCursesPanel_Check(v) (Py_TYPE(v) == &PyCursesPanel_Type) /* Some helper functions. The problem is that there's always a window associated with a panel. To ensure that Python's GC doesn't pull @@ -178,12 +178,13 @@ PyCursesPanel_New(PANEL *pan, PyCursesWindowObject *wo) po = PyObject_NEW(PyCursesPanelObject, &PyCursesPanel_Type); if (po == NULL) return NULL; po->pan = pan; - po->wo = wo; - Py_INCREF(wo); if (insert_lop(po) < 0) { - PyObject_DEL(po); - return NULL; + po->wo = NULL; + Py_DECREF(po); + return NULL; } + po->wo = wo; + Py_INCREF(wo); return (PyObject *)po; } @@ -191,8 +192,10 @@ static void PyCursesPanel_Dealloc(PyCursesPanelObject *po) { (void)del_panel(po->pan); - Py_DECREF(po->wo); - remove_lop(po); + if (po->wo != NULL) { + Py_DECREF(po->wo); + remove_lop(po); + } PyObject_DEL(po); } @@ -338,11 +341,10 @@ PyCursesPanel_GetAttr(PyCursesPanelObject *self, char *name) /* -------------------------------------------------------*/ PyTypeObject PyCursesPanel_Type = { - PyObject_HEAD_INIT(NULL) - 0, /*ob_size*/ - "_curses_panel.curses panel", /*tp_name*/ - sizeof(PyCursesPanelObject), /*tp_basicsize*/ - 0, /*tp_itemsize*/ + PyVarObject_HEAD_INIT(NULL, 0) + "_curses_panel.curses panel", /*tp_name*/ + sizeof(PyCursesPanelObject), /*tp_basicsize*/ + 0, /*tp_itemsize*/ /* methods */ (destructor)PyCursesPanel_Dealloc, /*tp_dealloc*/ 0, /*tp_print*/ @@ -458,7 +460,7 @@ init_curses_panel(void) PyObject *m, *d, *v; /* Initialize object type */ - PyCursesPanel_Type.ob_type = &PyType_Type; + Py_TYPE(&PyCursesPanel_Type) = &PyType_Type; import_curses(); pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.5.6/000077500000000000000000000000001517431316200262135ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.5.6/Python-2.5.6/000077500000000000000000000000001517431316200301425ustar00rootroot00000000000000000_patch-setup.py.diff000066400000000000000000000035211517431316200341610ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.5.6/Python-2.5.6--- setup.py.orig 2011-07-07 19:19:43.800122463 +0900 +++ setup.py 2011-07-07 19:25:04.548416377 +0900 @@ -13,6 +13,7 @@ from distutils.command.build_ext import build_ext from distutils.command.install import install from distutils.command.install_lib import install_lib +from distutils.spawn import find_executable # This global variable is used to hold the list of modules to be disabled. disabled_module_list = [] @@ -242,10 +243,34 @@ return platform return sys.platform + def add_multiarch_paths(self): + # Debian/Ubuntu multiarch support. + # https://wiki.ubuntu.com/MultiarchSpec + if not find_executable('dpkg-architecture'): + return + tmpfile = os.path.join(self.build_temp, 'multiarch') + if not os.path.exists(self.build_temp): + os.makedirs(self.build_temp) + ret = os.system( + 'dpkg-architecture -qDEB_HOST_MULTIARCH > %s 2> /dev/null' % + tmpfile) + try: + if ret >> 8 == 0: + fp = open(tmpfile) + multiarch_path_component = fp.readline().strip() + fp.close() + add_dir_to_list(self.compiler.library_dirs, + '/usr/lib/' + multiarch_path_component) + add_dir_to_list(self.compiler.include_dirs, + '/usr/include/' + multiarch_path_component) + finally: + os.unlink(tmpfile) + def detect_modules(self): # Ensure that /usr/local is always used add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib') add_dir_to_list(self.compiler.include_dirs, '/usr/local/include') + self.add_multiarch_paths() # Add paths specified in the environment variables LDFLAGS and # CPPFLAGS for header and library files. 001_patch-svnversion.patch000066400000000000000000000023661517431316200350040ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.5.6/Python-2.5.6--- configure.in +++ configure.in @@ -767,7 +767,7 @@ then SVNVERSION="svnversion \$(srcdir)" else - SVNVERSION="echo exported" + SVNVERSION="echo Unversioned directory" fi case $MACHDEP in --- Makefile.pre.in +++ Makefile.pre.in @@ -501,7 +501,7 @@ $(SIGNAL_OBJS) \ $(MODOBJS) \ $(srcdir)/Modules/getbuildinfo.c - $(CC) -c $(PY_CFLAGS) -DSVNVERSION=\"`LC_ALL=C $(SVNVERSION)`\" -o $@ $(srcdir)/Modules/getbuildinfo.c + $(CC) -c $(PY_CFLAGS) -DSVNVERSION="\"`LC_ALL=C $(SVNVERSION)`\"" -o $@ $(srcdir)/Modules/getbuildinfo.c Modules/getpath.o: $(srcdir)/Modules/getpath.c Makefile $(CC) -c $(PY_CFLAGS) -DPYTHONPATH='"$(PYTHONPATH)"' \ --- Modules/getbuildinfo.c +++ Modules/getbuildinfo.c @@ -48,5 +48,5 @@ static const char svnversion[] = SVNVERSION; if (svnversion[0] != '$') return svnversion; /* it was interpolated, or passed on command line */ - return "exported"; + return "Unversioned directory"; } --- Python/sysmodule.c +++ Python/sysmodule.c @@ -1161,7 +1161,7 @@ svnversion = _Py_svnversion(); - if (strcmp(svnversion, "exported") != 0) + if (strcmp(svnversion, "Unversioned directory") != 0 && strcmp(svnversion, "exported") != 0) svn_revision = svnversion; else if (istag) { len = strlen(_patchlevel_revision); 002_darwin_c_source.patch000066400000000000000000000132671517431316200346440ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.5.6/Python-2.5.6diff -r -u ./configure ../Python-2.5/configure --- ./configure 2006-09-05 11:54:42.000000000 +0900 +++ ../Python-2.5/configure 2013-07-19 15:27:46.000000000 +0900 @@ -1396,6 +1396,16 @@ _ACEOF +# The later defininition of _XOPEN_SOURCE and _POSIX_C_SOURCE disables +# certain features on Mac OS X, so we need _DARWIN_C_SOURCE to re-enable +# them. + +cat >>confdefs.h <<\_ACEOF +#define _DARWIN_C_SOURCE 1 +_ACEOF + + + define_xopen_source=yes # Arguments passed to configure. @@ -3885,11 +3895,110 @@ ;; # is there any other compiler on Darwin besides gcc? Darwin*) - BASECFLAGS="$BASECFLAGS -Wno-long-double -no-cpp-precomp -mno-fused-madd" + # -Wno-long-double, -no-cpp-precomp, and -mno-fused-madd + # used to be here, but non-Apple gcc doesn't accept them. + if test "${CC}" = gcc + then + { echo "$as_me:${as_lineno-$LINENO}: checking which compiler should be used" >&5 +echo -n "checking which compiler should be used... " >&6; } + case "${UNIVERSALSDK}" in + */MacOSX10.4u.sdk) + # Build using 10.4 SDK, force usage of gcc when the + # compiler is gcc, otherwise the user will get very + # confusing error messages when building on OSX 10.6 + CC=gcc-4.0 + CPP=cpp-4.0 + ;; + esac + { echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +echo "$CC" >&6; } + fi + + if test "${enable_universalsdk}"; then - BASECFLAGS="-arch ppc -arch i386 -isysroot ${UNIVERSALSDK} ${BASECFLAGS}" + UNIVERSAL_ARCH_FLAGS="" + if test "$UNIVERSAL_ARCHS" = "32-bit" ; then + UNIVERSAL_ARCH_FLAGS="-arch ppc -arch i386" + ARCH_RUN_32BIT="" + LIPO_32BIT_FLAGS="" + elif test "$UNIVERSAL_ARCHS" = "64-bit" ; then + UNIVERSAL_ARCH_FLAGS="-arch ppc64 -arch x86_64" + LIPO_32BIT_FLAGS="" + ARCH_RUN_32BIT="true" + + elif test "$UNIVERSAL_ARCHS" = "all" ; then + UNIVERSAL_ARCH_FLAGS="-arch i386 -arch ppc -arch ppc64 -arch x86_64" + LIPO_32BIT_FLAGS="-extract ppc7400 -extract i386" + ARCH_RUN_32BIT="/usr/bin/arch -i386 -ppc" + + elif test "$UNIVERSAL_ARCHS" = "intel" ; then + UNIVERSAL_ARCH_FLAGS="-arch i386 -arch x86_64" + LIPO_32BIT_FLAGS="-extract i386" + ARCH_RUN_32BIT="/usr/bin/arch -i386" + + elif test "$UNIVERSAL_ARCHS" = "3-way" ; then + UNIVERSAL_ARCH_FLAGS="-arch i386 -arch ppc -arch x86_64" + LIPO_32BIT_FLAGS="-extract ppc7400 -extract i386" + ARCH_RUN_32BIT="/usr/bin/arch -i386 -ppc" + + else + as_fn_error $? "proper usage is --with-universal-arch=32-bit|64-bit|all|intel|3-way" "$LINENO" 5 + + fi + + + CFLAGS="${UNIVERSAL_ARCH_FLAGS} -isysroot ${UNIVERSALSDK} ${CFLAGS}" + if test "${UNIVERSALSDK}" != "/" + then + CFLAGS="-isysroot ${UNIVERSALSDK} ${CFLAGS}" + LDFLAGS="-isysroot ${UNIVERSALSDK} ${LDFLAGS}" + CPPFLAGS="-isysroot ${UNIVERSALSDK} ${CPPFLAGS}" + fi fi + # Calculate the right deployment target for this build. + # + cur_target=`sw_vers -productVersion | sed 's/\(10\.[0-9]*\).*/\1/'` + if test ${cur_target} '>' 10.2 && \ + test ${cur_target} '<' 10.6 + then + cur_target=10.3 + if test ${enable_universalsdk}; then + if test "${UNIVERSAL_ARCHS}" = "all"; then + # Ensure that the default platform for a + # 4-way universal build is OSX 10.5, + # that's the first OS release where + # 4-way builds make sense. + cur_target='10.5' + + elif test "${UNIVERSAL_ARCHS}" = "3-way"; then + cur_target='10.5' + + elif test "${UNIVERSAL_ARCHS}" = "intel"; then + cur_target='10.5' + + elif test "${UNIVERSAL_ARCHS}" = "64-bit"; then + cur_target='10.5' + fi + else + if test `/usr/bin/arch` = "i386"; then + # On Intel macs default to a deployment + # target of 10.4, that's the first OSX + # release with Intel support. + cur_target="10.4" + fi + fi + fi + CONFIGURE_MACOSX_DEPLOYMENT_TARGET=${MACOSX_DEPLOYMENT_TARGET-${cur_target}} + + # Make sure that MACOSX_DEPLOYMENT_TARGET is set in the + # environment with a value that is the same as what we'll use + # in the Makefile to ensure that we'll get the same compiler + # environment during configure and build time. + MACOSX_DEPLOYMENT_TARGET="$CONFIGURE_MACOSX_DEPLOYMENT_TARGET" + export MACOSX_DEPLOYMENT_TARGET + EXPORT_MACOSX_DEPLOYMENT_TARGET='' + ;; OSF*) BASECFLAGS="$BASECFLAGS -mieee" @@ -10851,7 +10960,7 @@ if test "${enable_universalsdk}"; then : else - LIBTOOL_CRUFT="${LIBTOOL_CRUFT} -arch_only `arch`" + LIBTOOL_CRUFT="${LIBTOOL_CRUFT}" fi LIBTOOL_CRUFT=$LIBTOOL_CRUFT' -install_name $(PYTHONFRAMEWORKINSTALLDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK)' LIBTOOL_CRUFT=$LIBTOOL_CRUFT' -compatibility_version $(VERSION) -current_version $(VERSION)';; @@ -10863,7 +10972,7 @@ else LIBTOOL_CRUFT="" fi - LIBTOOL_CRUFT=$LIBTOOL_CRUFT" -lSystem -lSystemStubs -arch_only `arch`" + LIBTOOL_CRUFT=$LIBTOOL_CRUFT" -lSystem -lSystemStubs" LIBTOOL_CRUFT=$LIBTOOL_CRUFT' -install_name $(PYTHONFRAMEWORKINSTALLDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK)' LIBTOOL_CRUFT=$LIBTOOL_CRUFT' -compatibility_version $(VERSION) -current_version $(VERSION)';; esac diff -r -u ./pyconfig.h.in ../Python-2.5/pyconfig.h.in --- ./pyconfig.h.in 2006-07-30 23:09:47.000000000 +0900 +++ ../Python-2.5/pyconfig.h.in 2013-07-17 23:12:31.000000000 +0900 @@ -912,6 +912,11 @@ /* Define on Irix to enable u_int */ #undef _BSD_TYPES +/* Define on Darwin to activate all library features */ +#ifndef _DARWIN_C_SOURCE +#define _DARWIN_C_SOURCE +#endif + /* This must be set to 64 on some systems to enable large file support. */ #undef _FILE_OFFSET_BITS 003_osx_lp64.patch000066400000000000000000000215441517431316200331520ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.5.6/Python-2.5.6diff -r -u ./Include/pymactoolbox.h ../Python-2.5/Include/pymactoolbox.h --- ./Include/pymactoolbox.h 2004-11-05 16:02:59.000000000 +0900 +++ ../Python-2.5/Include/pymactoolbox.h 2013-07-17 23:38:51.000000000 +0900 @@ -8,7 +8,10 @@ #endif #include + +#ifndef __LP64__ #include +#endif /* !__LP64__ */ /* ** Helper routines for error codes and such. @@ -18,8 +21,11 @@ PyObject *PyMac_GetOSErrException(void); /* Initialize & return it */ PyObject *PyErr_Mac(PyObject *, int); /* Exception with a mac error */ PyObject *PyMac_Error(OSErr); /* Uses PyMac_GetOSErrException */ +#ifndef __LP64__ extern OSErr PyMac_GetFullPathname(FSSpec *, char *, int); /* convert fsspec->path */ +#endif /* __LP64__ */ + /* ** These conversion routines are defined in mactoolboxglue.c itself. */ @@ -83,8 +89,10 @@ #endif /* USE_TOOLBOX_OBJECT_GLUE */ /* macfs exports */ +#ifndef __LP64__ int PyMac_GetFSSpec(PyObject *, FSSpec *); /* argument parser for FSSpec */ PyObject *PyMac_BuildFSSpec(FSSpec *); /* Convert FSSpec to PyObject */ +#endif /* !__LP64__ */ int PyMac_GetFSRef(PyObject *, FSRef *); /* argument parser for FSRef */ PyObject *PyMac_BuildFSRef(FSRef *); /* Convert FSRef to PyObject */ @@ -101,39 +109,54 @@ extern int CmpInstObj_Convert(PyObject *, ComponentInstance *); /* Ctl exports */ +#ifndef __LP64__ extern PyObject *CtlObj_New(ControlHandle); extern int CtlObj_Convert(PyObject *, ControlHandle *); +#endif /* !__LP64__ */ /* Dlg exports */ +#ifndef __LP64__ extern PyObject *DlgObj_New(DialogPtr); extern int DlgObj_Convert(PyObject *, DialogPtr *); extern PyObject *DlgObj_WhichDialog(DialogPtr); +#endif /* !__LP64__ */ /* Drag exports */ +#ifndef __LP64__ extern PyObject *DragObj_New(DragReference); extern int DragObj_Convert(PyObject *, DragReference *); +#endif /* !__LP64__ */ /* List exports */ +#ifndef __LP64__ extern PyObject *ListObj_New(ListHandle); extern int ListObj_Convert(PyObject *, ListHandle *); +#endif /* !__LP64__ */ /* Menu exports */ +#ifndef __LP64__ extern PyObject *MenuObj_New(MenuHandle); extern int MenuObj_Convert(PyObject *, MenuHandle *); +#endif /* !__LP64__ */ /* Qd exports */ +#ifndef __LP64__ extern PyObject *GrafObj_New(GrafPtr); extern int GrafObj_Convert(PyObject *, GrafPtr *); extern PyObject *BMObj_New(BitMapPtr); extern int BMObj_Convert(PyObject *, BitMapPtr *); extern PyObject *QdRGB_New(RGBColor *); extern int QdRGB_Convert(PyObject *, RGBColor *); +#endif /* !__LP64__ */ /* Qdoffs exports */ +#ifndef __LP64__ extern PyObject *GWorldObj_New(GWorldPtr); extern int GWorldObj_Convert(PyObject *, GWorldPtr *); +#endif /* !__LP64__ */ /* Qt exports */ +#ifndef __LP64__ extern PyObject *TrackObj_New(Track); extern int TrackObj_Convert(PyObject *, Track *); extern PyObject *MovieObj_New(Movie); @@ -146,6 +169,7 @@ extern int UserDataObj_Convert(PyObject *, UserData *); extern PyObject *MediaObj_New(Media); extern int MediaObj_Convert(PyObject *, Media *); +#endif /* !__LP64__ */ /* Res exports */ extern PyObject *ResObj_New(Handle); @@ -154,13 +178,17 @@ extern int OptResObj_Convert(PyObject *, Handle *); /* TE exports */ +#ifndef __LP64__ extern PyObject *TEObj_New(TEHandle); extern int TEObj_Convert(PyObject *, TEHandle *); +#endif /* !__LP64__ */ /* Win exports */ +#ifndef __LP64__ extern PyObject *WinObj_New(WindowPtr); extern int WinObj_Convert(PyObject *, WindowPtr *); extern PyObject *WinObj_WhichWindow(WindowPtr); +#endif /* !__LP64__ */ /* CF exports */ extern PyObject *CFObj_New(CFTypeRef); diff -r -u ./Mac/Modules/res/_Resmodule.c ../Python-2.5/Mac/Modules/res/_Resmodule.c --- ./Mac/Modules/res/_Resmodule.c 2005-07-04 05:59:44.000000000 +0900 +++ ../Python-2.5/Mac/Modules/res/_Resmodule.c 2013-07-17 23:38:51.000000000 +0900 @@ -414,6 +414,7 @@ return _res; } +#ifndef __LP64__ static PyObject *ResObj_as_Control(ResourceObject *_self, PyObject *_args) { PyObject *_res = NULL; @@ -431,6 +432,7 @@ return _res; } +#endif /* !__LP64__ */ static PyObject *ResObj_LoadResource(ResourceObject *_self, PyObject *_args) { @@ -1152,6 +1154,7 @@ return _res; } +#ifndef __LP64__ static PyObject *Res_OpenRFPerm(PyObject *_self, PyObject *_args) { PyObject *_res = NULL; @@ -1287,6 +1290,7 @@ _res = Py_None; return _res; } +#endif /* !__LP64__ */ static PyObject *Res_InsertResourceFile(PyObject *_self, PyObject *_args) { @@ -1327,6 +1331,7 @@ return _res; } +#ifndef __LP64__ static PyObject *Res_FSpResourceFileAlreadyOpen(PyObject *_self, PyObject *_args) { PyObject *_res = NULL; @@ -1413,6 +1418,7 @@ nextRefNum); return _res; } +#endif /* !__LP64__ */ static PyObject *Res_FSOpenResFile(PyObject *_self, PyObject *_args) { @@ -1438,6 +1444,7 @@ return _res; } +#ifndef __LP64__ static PyObject *Res_FSCreateResFile(PyObject *_self, PyObject *_args) { PyObject *_res = NULL; @@ -1534,6 +1541,7 @@ PyMac_BuildFSSpec, &newSpec); return _res; } +#endif /* __LP64__ */ static PyObject *Res_FSOpenResourceFile(PyObject *_self, PyObject *_args) { @@ -1637,6 +1645,7 @@ PyDoc_STR("(short refNum) -> (short _rv)")}, {"SetResFileAttrs", (PyCFunction)Res_SetResFileAttrs, 1, PyDoc_STR("(short refNum, short attrs) -> None")}, +#ifndef __LP64__ {"OpenRFPerm", (PyCFunction)Res_OpenRFPerm, 1, PyDoc_STR("(Str255 fileName, short vRefNum, SignedByte permission) -> (short _rv)")}, {"HOpenResFile", (PyCFunction)Res_HOpenResFile, 1, @@ -1647,10 +1656,12 @@ PyDoc_STR("(FSSpec spec, SignedByte permission) -> (short _rv)")}, {"FSpCreateResFile", (PyCFunction)Res_FSpCreateResFile, 1, PyDoc_STR("(FSSpec spec, OSType creator, OSType fileType, ScriptCode scriptTag) -> None")}, +#endif /* !__LP64__ */ {"InsertResourceFile", (PyCFunction)Res_InsertResourceFile, 1, PyDoc_STR("(SInt16 refNum, RsrcChainLocation where) -> None")}, {"DetachResourceFile", (PyCFunction)Res_DetachResourceFile, 1, PyDoc_STR("(SInt16 refNum) -> None")}, +#ifndef __LP64__ {"FSpResourceFileAlreadyOpen", (PyCFunction)Res_FSpResourceFileAlreadyOpen, 1, PyDoc_STR("(FSSpec resourceFile) -> (Boolean _rv, Boolean inChain, SInt16 refNum)")}, {"FSpOpenOrphanResFile", (PyCFunction)Res_FSpOpenOrphanResFile, 1, @@ -1659,14 +1670,17 @@ PyDoc_STR("() -> (SInt16 refNum)")}, {"GetNextResourceFile", (PyCFunction)Res_GetNextResourceFile, 1, PyDoc_STR("(SInt16 curRefNum) -> (SInt16 nextRefNum)")}, +#endif /* __LP64__ */ {"FSOpenResFile", (PyCFunction)Res_FSOpenResFile, 1, PyDoc_STR("(FSRef ref, SignedByte permission) -> (short _rv)")}, +#ifndef __LP64__ {"FSCreateResFile", (PyCFunction)Res_FSCreateResFile, 1, PyDoc_STR("(FSRef parentRef, Buffer nameLength) -> (FSRef newRef, FSSpec newSpec)")}, {"FSResourceFileAlreadyOpen", (PyCFunction)Res_FSResourceFileAlreadyOpen, 1, PyDoc_STR("(FSRef resourceFileRef) -> (Boolean _rv, Boolean inChain, SInt16 refNum)")}, {"FSCreateResourceFile", (PyCFunction)Res_FSCreateResourceFile, 1, PyDoc_STR("(FSRef parentRef, Buffer nameLength, Buffer forkNameLength) -> (FSRef newRef, FSSpec newSpec)")}, +#endif /* __LP64__ */ {"FSOpenResourceFile", (PyCFunction)Res_FSOpenResourceFile, 1, PyDoc_STR("(FSRef ref, Buffer forkNameLength, SignedByte permissions) -> (SInt16 refNum)")}, {"Handle", (PyCFunction)Res_Handle, 1, diff -r -u ./Modules/_ctypes/libffi/src/darwin/ffitarget.h ../Python-2.5/Modules/_ctypes/libffi/src/darwin/ffitarget.h --- ./Modules/_ctypes/libffi/src/darwin/ffitarget.h 2006-05-26 06:58:05.000000000 +0900 +++ ../Python-2.5/Modules/_ctypes/libffi/src/darwin/ffitarget.h 2013-07-17 23:38:51.000000000 +0900 @@ -4,7 +4,7 @@ * created by configure). This makes is possible to build a univeral binary * of ctypes in one go. */ -#if defined(__i386__) +#if defined(__i386__) || defined(__x86_64__) #ifndef X86_DARWIN #define X86_DARWIN diff -r -u ./Python/mactoolboxglue.c ../Python-2.5/Python/mactoolboxglue.c --- ./Python/mactoolboxglue.c 2006-07-12 01:44:25.000000000 +0900 +++ ../Python-2.5/Python/mactoolboxglue.c 2013-07-17 23:39:09.000000000 +0900 @@ -106,6 +106,7 @@ } +#ifndef __LP64__ OSErr PyMac_GetFullPathname(FSSpec *fss, char *path, int len) { @@ -153,6 +154,7 @@ Py_XDECREF(fs); return err; } +#endif /* !__LP64__ */ /* Convert a 4-char string object argument to an OSType value */ int @@ -417,6 +419,7 @@ GLUE_NEW(GWorldPtr, GWorldObj_New, "Carbon.Qdoffs") GLUE_CONVERT(GWorldPtr, GWorldObj_Convert, "Carbon.Qdoffs") +#ifndef __LP64__ GLUE_NEW(Track, TrackObj_New, "Carbon.Qt") GLUE_CONVERT(Track, TrackObj_Convert, "Carbon.Qt") GLUE_NEW(Movie, MovieObj_New, "Carbon.Qt") @@ -429,6 +432,7 @@ GLUE_CONVERT(UserData, UserDataObj_Convert, "Carbon.Qt") GLUE_NEW(Media, MediaObj_New, "Carbon.Qt") GLUE_CONVERT(Media, MediaObj_Convert, "Carbon.Qt") +#endif /* !__LP64__ */ GLUE_NEW(Handle, ResObj_New, "Carbon.Res") GLUE_CONVERT(Handle, ResObj_Convert, "Carbon.Res") 004_osx_libffi.patch000066400000000000000000005661361517431316200336340ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.5.6/Python-2.5.6diff -r -u ./Modules/_ctypes/libffi_osx/LICENSE ./Modules/_ctypes/libffi_osx/LICENSE new file mode 100644 index 0000000..f591795 --- /dev/null +++ ./Modules/_ctypes/libffi_osx/LICENSE @@ -0,0 +1,20 @@ +libffi - Copyright (c) 1996-2003 Red Hat, Inc. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +``Software''), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff -r -u ./Modules/_ctypes/libffi_osx/README ./Modules/_ctypes/libffi_osx/README new file mode 100644 index 0000000..1fc2747 --- /dev/null +++ ./Modules/_ctypes/libffi_osx/README @@ -0,0 +1,500 @@ +This directory contains the libffi package, which is not part of GCC but +shipped with GCC as convenience. + +Status +====== + +libffi-2.00 has not been released yet! This is a development snapshot! + +libffi-1.20 was released on October 5, 1998. Check the libffi web +page for updates: . + + +What is libffi? +=============== + +Compilers for high level languages generate code that follow certain +conventions. These conventions are necessary, in part, for separate +compilation to work. One such convention is the "calling +convention". The "calling convention" is essentially a set of +assumptions made by the compiler about where function arguments will +be found on entry to a function. A "calling convention" also specifies +where the return value for a function is found. + +Some programs may not know at the time of compilation what arguments +are to be passed to a function. For instance, an interpreter may be +told at run-time about the number and types of arguments used to call +a given function. Libffi can be used in such programs to provide a +bridge from the interpreter program to compiled code. + +The libffi library provides a portable, high level programming +interface to various calling conventions. This allows a programmer to +call any function specified by a call interface description at run +time. + +Ffi stands for Foreign Function Interface. A foreign function +interface is the popular name for the interface that allows code +written in one language to call code written in another language. The +libffi library really only provides the lowest, machine dependent +layer of a fully featured foreign function interface. A layer must +exist above libffi that handles type conversions for values passed +between the two languages. + + +Supported Platforms and Prerequisites +===================================== + +Libffi has been ported to: + + SunOS 4.1.3 & Solaris 2.x (SPARC-V8, SPARC-V9) + + Irix 5.3 & 6.2 (System V/o32 & n32) + + Intel x86 - Linux (System V ABI) + + Alpha - Linux and OSF/1 + + m68k - Linux (System V ABI) + + PowerPC - Linux (System V ABI, Darwin, AIX) + + ARM - Linux (System V ABI) + +Libffi has been tested with the egcs 1.0.2 gcc compiler. Chances are +that other versions will work. Libffi has also been built and tested +with the SGI compiler tools. + +On PowerPC, the tests failed (see the note below). + +You must use GNU make to build libffi. SGI's make will not work. +Sun's probably won't either. + +If you port libffi to another platform, please let me know! I assume +that some will be easy (x86 NetBSD), and others will be more difficult +(HP). + + +Installing libffi +================= + +[Note: before actually performing any of these installation steps, + you may wish to read the "Platform Specific Notes" below.] + +First you must configure the distribution for your particular +system. Go to the directory you wish to build libffi in and run the +"configure" program found in the root directory of the libffi source +distribution. + +You may want to tell configure where to install the libffi library and +header files. To do that, use the --prefix configure switch. Libffi +will install under /usr/local by default. + +If you want to enable extra run-time debugging checks use the the +--enable-debug configure switch. This is useful when your program dies +mysteriously while using libffi. + +Another useful configure switch is --enable-purify-safety. Using this +will add some extra code which will suppress certain warnings when you +are using Purify with libffi. Only use this switch when using +Purify, as it will slow down the library. + +Configure has many other options. Use "configure --help" to see them all. + +Once configure has finished, type "make". Note that you must be using +GNU make. SGI's make will not work. Sun's probably won't either. +You can ftp GNU make from prep.ai.mit.edu:/pub/gnu. + +To ensure that libffi is working as advertised, type "make test". + +To install the library and header files, type "make install". + + +Using libffi +============ + + The Basics + ---------- + +Libffi assumes that you have a pointer to the function you wish to +call and that you know the number and types of arguments to pass it, +as well as the return type of the function. + +The first thing you must do is create an ffi_cif object that matches +the signature of the function you wish to call. The cif in ffi_cif +stands for Call InterFace. To prepare a call interface object, use the +following function: + +ffi_status ffi_prep_cif(ffi_cif *cif, ffi_abi abi, + unsigned int nargs, + ffi_type *rtype, ffi_type **atypes); + + CIF is a pointer to the call interface object you wish + to initialize. + + ABI is an enum that specifies the calling convention + to use for the call. FFI_DEFAULT_ABI defaults + to the system's native calling convention. Other + ABI's may be used with care. They are system + specific. + + NARGS is the number of arguments this function accepts. + libffi does not yet support vararg functions. + + RTYPE is a pointer to an ffi_type structure that represents + the return type of the function. Ffi_type objects + describe the types of values. libffi provides + ffi_type objects for many of the native C types: + signed int, unsigned int, signed char, unsigned char, + etc. There is also a pointer ffi_type object and + a void ffi_type. Use &ffi_type_void for functions that + don't return values. + + ATYPES is a vector of ffi_type pointers. ARGS must be NARGS long. + If NARGS is 0, this is ignored. + + +ffi_prep_cif will return a status code that you are responsible +for checking. It will be one of the following: + + FFI_OK - All is good. + + FFI_BAD_TYPEDEF - One of the ffi_type objects that ffi_prep_cif + came across is bad. + + +Before making the call, the VALUES vector should be initialized +with pointers to the appropriate argument values. + +To call the function using the initialized ffi_cif, use the +ffi_call function: + +void ffi_call(ffi_cif *cif, void *fn, void *rvalue, void **avalues); + + CIF is a pointer to the ffi_cif initialized specifically + for this function. + + FN is a pointer to the function you want to call. + + RVALUE is a pointer to a chunk of memory that is to hold the + result of the function call. Currently, it must be + at least one word in size (except for the n32 version + under Irix 6.x, which must be a pointer to an 8 byte + aligned value (a long long). It must also be at least + word aligned (depending on the return type, and the + system's alignment requirements). If RTYPE is + &ffi_type_void, this is ignored. If RVALUE is NULL, + the return value is discarded. + + AVALUES is a vector of void* that point to the memory locations + holding the argument values for a call. + If NARGS is 0, this is ignored. + + +If you are expecting a return value from FN it will have been stored +at RVALUE. + + + + An Example + ---------- + +Here is a trivial example that calls puts() a few times. + + #include + #include + + int main() + { + ffi_cif cif; + ffi_type *args[1]; + void *values[1]; + char *s; + int rc; + + /* Initialize the argument info vectors */ + args[0] = &ffi_type_uint; + values[0] = &s; + + /* Initialize the cif */ + if (ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, + &ffi_type_uint, args) == FFI_OK) + { + s = "Hello World!"; + ffi_call(&cif, puts, &rc, values); + /* rc now holds the result of the call to puts */ + + /* values holds a pointer to the function's arg, so to + call puts() again all we need to do is change the + value of s */ + s = "This is cool!"; + ffi_call(&cif, puts, &rc, values); + } + + return 0; + } + + + + Aggregate Types + --------------- + +Although libffi has no special support for unions or bit-fields, it is +perfectly happy passing structures back and forth. You must first +describe the structure to libffi by creating a new ffi_type object +for it. Here is the definition of ffi_type: + + typedef struct _ffi_type + { + unsigned size; + short alignment; + short type; + struct _ffi_type **elements; + } ffi_type; + +All structures must have type set to FFI_TYPE_STRUCT. You may set +size and alignment to 0. These will be calculated and reset to the +appropriate values by ffi_prep_cif(). + +elements is a NULL terminated array of pointers to ffi_type objects +that describe the type of the structure elements. These may, in turn, +be structure elements. + +The following example initializes a ffi_type object representing the +tm struct from Linux's time.h: + + struct tm { + int tm_sec; + int tm_min; + int tm_hour; + int tm_mday; + int tm_mon; + int tm_year; + int tm_wday; + int tm_yday; + int tm_isdst; + /* Those are for future use. */ + long int __tm_gmtoff__; + __const char *__tm_zone__; + }; + + { + ffi_type tm_type; + ffi_type *tm_type_elements[12]; + int i; + + tm_type.size = tm_type.alignment = 0; + tm_type.elements = &tm_type_elements; + + for (i = 0; i < 9; i++) + tm_type_elements[i] = &ffi_type_sint; + + tm_type_elements[9] = &ffi_type_slong; + tm_type_elements[10] = &ffi_type_pointer; + tm_type_elements[11] = NULL; + + /* tm_type can now be used to represent tm argument types and + return types for ffi_prep_cif() */ + } + + + +Platform Specific Notes +======================= + + Intel x86 + --------- + +There are no known problems with the x86 port. + + Sun SPARC - SunOS 4.1.3 & Solaris 2.x + ------------------------------------- + +You must use GNU Make to build libffi on Sun platforms. + + MIPS - Irix 5.3 & 6.x + --------------------- + +Irix 6.2 and better supports three different calling conventions: o32, +n32 and n64. Currently, libffi only supports both o32 and n32 under +Irix 6.x, but only o32 under Irix 5.3. Libffi will automatically be +configured for whichever calling convention it was built for. + +By default, the configure script will try to build libffi with the GNU +development tools. To build libffi with the SGI development tools, set +the environment variable CC to either "cc -32" or "cc -n32" before +running configure under Irix 6.x (depending on whether you want an o32 +or n32 library), or just "cc" for Irix 5.3. + +With the n32 calling convention, when returning structures smaller +than 16 bytes, be sure to provide an RVALUE that is 8 byte aligned. +Here's one way of forcing this: + + double struct_storage[2]; + my_small_struct *s = (my_small_struct *) struct_storage; + /* Use s for RVALUE */ + +If you don't do this you are liable to get spurious bus errors. + +"long long" values are not supported yet. + +You must use GNU Make to build libffi on SGI platforms. + + ARM - System V ABI + ------------------ + +The ARM port was performed on a NetWinder running ARM Linux ELF +(2.0.31) and gcc 2.8.1. + + + + PowerPC System V ABI + -------------------- + +There are two `System V ABI's which libffi implements for PowerPC. +They differ only in how small structures are returned from functions. + +In the FFI_SYSV version, structures that are 8 bytes or smaller are +returned in registers. This is what GCC does when it is configured +for solaris, and is what the System V ABI I have (dated September +1995) says. + +In the FFI_GCC_SYSV version, all structures are returned the same way: +by passing a pointer as the first argument to the function. This is +what GCC does when it is configured for linux or a generic sysv +target. + +EGCS 1.0.1 (and probably other versions of EGCS/GCC) also has a +inconsistency with the SysV ABI: When a procedure is called with many +floating-point arguments, some of them get put on the stack. They are +all supposed to be stored in double-precision format, even if they are +only single-precision, but EGCS stores single-precision arguments as +single-precision anyway. This causes one test to fail (the `many +arguments' test). + + +What's With The Crazy Comments? +=============================== + +You might notice a number of cryptic comments in the code, delimited +by /*@ and @*/. These are annotations read by the program LCLint, a +tool for statically checking C programs. You can read all about it at +. + + +History +======= + +1.20 Oct-5-98 + Raffaele Sena produces ARM port. + +1.19 Oct-5-98 + Fixed x86 long double and long long return support. + m68k bug fixes from Andreas Schwab. + Patch for DU assembler compatibility for the Alpha from Richard + Henderson. + +1.18 Apr-17-98 + Bug fixes and MIPS configuration changes. + +1.17 Feb-24-98 + Bug fixes and m68k port from Andreas Schwab. PowerPC port from + Geoffrey Keating. Various bug x86, Sparc and MIPS bug fixes. + +1.16 Feb-11-98 + Richard Henderson produces Alpha port. + +1.15 Dec-4-97 + Fixed an n32 ABI bug. New libtool, auto* support. + +1.14 May-13-97 + libtool is now used to generate shared and static libraries. + Fixed a minor portability problem reported by Russ McManus + . + +1.13 Dec-2-96 + Added --enable-purify-safety to keep Purify from complaining + about certain low level code. + Sparc fix for calling functions with < 6 args. + Linux x86 a.out fix. + +1.12 Nov-22-96 + Added missing ffi_type_void, needed for supporting void return + types. Fixed test case for non MIPS machines. Cygnus Support + is now Cygnus Solutions. + +1.11 Oct-30-96 + Added notes about GNU make. + +1.10 Oct-29-96 + Added configuration fix for non GNU compilers. + +1.09 Oct-29-96 + Added --enable-debug configure switch. Clean-ups based on LCLint + feedback. ffi_mips.h is always installed. Many configuration + fixes. Fixed ffitest.c for sparc builds. + +1.08 Oct-15-96 + Fixed n32 problem. Many clean-ups. + +1.07 Oct-14-96 + Gordon Irlam rewrites v8.S again. Bug fixes. + +1.06 Oct-14-96 + Gordon Irlam improved the sparc port. + +1.05 Oct-14-96 + Interface changes based on feedback. + +1.04 Oct-11-96 + Sparc port complete (modulo struct passing bug). + +1.03 Oct-10-96 + Passing struct args, and returning struct values works for + all architectures/calling conventions. Expanded tests. + +1.02 Oct-9-96 + Added SGI n32 support. Fixed bugs in both o32 and Linux support. + Added "make test". + +1.01 Oct-8-96 + Fixed float passing bug in mips version. Restructured some + of the code. Builds cleanly with SGI tools. + +1.00 Oct-7-96 + First release. No public announcement. + + +Authors & Credits +================= + +libffi was written by Anthony Green . + +Portions of libffi were derived from Gianni Mariani's free gencall +library for Silicon Graphics machines. + +The closure mechanism was designed and implemented by Kresten Krab +Thorup. + +The Sparc port was derived from code contributed by the fine folks at +Visible Decisions Inc . Further enhancements were +made by Gordon Irlam at Cygnus Solutions . + +The Alpha port was written by Richard Henderson at Cygnus Solutions. + +Andreas Schwab ported libffi to m68k Linux and provided a number of +bug fixes. + +Geoffrey Keating ported libffi to the PowerPC. + +Raffaele Sena ported libffi to the ARM. + +Jesper Skov and Andrew Haley both did more than their fair share of +stepping through the code and tracking down bugs. + +Thanks also to Tom Tromey for bug fixes and configuration help. + +Thanks to Jim Blandy, who provided some useful feedback on the libffi +interface. + +If you have a problem, or have found a bug, please send a note to +green@cygnus.com. diff -r -u ./Modules/_ctypes/libffi_osx/README.pyobjc ./Modules/_ctypes/libffi_osx/README.pyobjc new file mode 100644 index 0000000..405d85f --- /dev/null +++ ./Modules/_ctypes/libffi_osx/README.pyobjc @@ -0,0 +1,5 @@ +This directory contains a slightly modified version of libffi, extracted from +the GCC source-tree. + +The only modifications are those that are necessary to compile libffi using +the Apple provided compiler and outside of the GCC source tree. diff -r -u ./Modules/_ctypes/libffi_osx/ffi.c ./Modules/_ctypes/libffi_osx/ffi.c new file mode 100644 index 0000000..bf42093 --- /dev/null +++ ./Modules/_ctypes/libffi_osx/ffi.c @@ -0,0 +1,226 @@ +/* ----------------------------------------------------------------------- + prep_cif.c - Copyright (c) 1996, 1998 Red Hat, Inc. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#include +#include + +#include +#include + +/* Round up to FFI_SIZEOF_ARG. */ +#define STACK_ARG_SIZE(x) ALIGN(x, FFI_SIZEOF_ARG) + +/* Perform machine independent initialization of aggregate type + specifications. */ + +static ffi_status +initialize_aggregate( +/*@out@*/ ffi_type* arg) +{ +/*@-usedef@*/ + + if (arg == NULL || arg->elements == NULL || + arg->size != 0 || arg->alignment != 0) + return FFI_BAD_TYPEDEF; + + ffi_type** ptr = &(arg->elements[0]); + + while ((*ptr) != NULL) + { + if (((*ptr)->size == 0) && (initialize_aggregate(*ptr) != FFI_OK)) + return FFI_BAD_TYPEDEF; + + /* Perform a sanity check on the argument type */ + FFI_ASSERT_VALID_TYPE(*ptr); + +#ifdef POWERPC_DARWIN + int curalign = (*ptr)->alignment; + + if (ptr != &(arg->elements[0])) + { + if (curalign > 4 && curalign != 16) + curalign = 4; + } + + arg->size = ALIGN(arg->size, curalign); + arg->size += (*ptr)->size; + arg->alignment = (arg->alignment > curalign) ? + arg->alignment : curalign; +#else + arg->size = ALIGN(arg->size, (*ptr)->alignment); + arg->size += (*ptr)->size; + arg->alignment = (arg->alignment > (*ptr)->alignment) ? + arg->alignment : (*ptr)->alignment; +#endif + + ptr++; + } + + /* Structure size includes tail padding. This is important for + structures that fit in one register on ABIs like the PowerPC64 + Linux ABI that right justify small structs in a register. + It's also needed for nested structure layout, for example + struct A { long a; char b; }; struct B { struct A x; char y; }; + should find y at an offset of 2*sizeof(long) and result in a + total size of 3*sizeof(long). */ + arg->size = ALIGN(arg->size, arg->alignment); + + if (arg->size == 0) + return FFI_BAD_TYPEDEF; + + return FFI_OK; + +/*@=usedef@*/ +} + +#ifndef __CRIS__ +/* The CRIS ABI specifies structure elements to have byte + alignment only, so it completely overrides this functions, + which assumes "natural" alignment and padding. */ + +/* Perform machine independent ffi_cif preparation, then call + machine dependent routine. */ + +#if defined(X86_DARWIN) + +static inline bool +struct_on_stack( + int size) +{ + if (size > 8) + return true; + + /* This is not what the ABI says, but is what is really implemented */ + switch (size) + { + case 1: + case 2: + case 4: + case 8: + return false; + + default: + return true; + } +} + +#endif // defined(X86_DARWIN) + +// Arguments' ffi_type->alignment must be nonzero. +ffi_status +ffi_prep_cif( +/*@out@*/ /*@partial@*/ ffi_cif* cif, + ffi_abi abi, + unsigned int nargs, +/*@dependent@*/ /*@out@*/ /*@partial@*/ ffi_type* rtype, +/*@dependent@*/ ffi_type** atypes) +{ + if (cif == NULL) + return FFI_BAD_TYPEDEF; + + if (abi <= FFI_FIRST_ABI || abi > FFI_DEFAULT_ABI) + return FFI_BAD_ABI; + + unsigned int bytes = 0; + unsigned int i; + ffi_type** ptr; + + cif->abi = abi; + cif->arg_types = atypes; + cif->nargs = nargs; + cif->rtype = rtype; + cif->flags = 0; + + /* Initialize the return type if necessary */ + /*@-usedef@*/ + if ((cif->rtype->size == 0) && (initialize_aggregate(cif->rtype) != FFI_OK)) + return FFI_BAD_TYPEDEF; + /*@=usedef@*/ + + /* Perform a sanity check on the return type */ + FFI_ASSERT_VALID_TYPE(cif->rtype); + + /* x86-64 and s390 stack space allocation is handled in prep_machdep. */ +#if !defined M68K && !defined __x86_64__ && !defined S390 && !defined PA + /* Make space for the return structure pointer */ + if (cif->rtype->type == FFI_TYPE_STRUCT +#ifdef SPARC + && (cif->abi != FFI_V9 || cif->rtype->size > 32) +#endif +#ifdef X86_DARWIN + && (struct_on_stack(cif->rtype->size)) +#endif + ) + bytes = STACK_ARG_SIZE(sizeof(void*)); +#endif + + for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++) + { + /* Initialize any uninitialized aggregate type definitions */ + if (((*ptr)->size == 0) && (initialize_aggregate((*ptr)) != FFI_OK)) + return FFI_BAD_TYPEDEF; + + if ((*ptr)->alignment == 0) + return FFI_BAD_TYPEDEF; + + /* Perform a sanity check on the argument type, do this + check after the initialization. */ + FFI_ASSERT_VALID_TYPE(*ptr); + +#if defined(X86_DARWIN) + { + int align = (*ptr)->alignment; + + if (align > 4) + align = 4; + + if ((align - 1) & bytes) + bytes = ALIGN(bytes, align); + + bytes += STACK_ARG_SIZE((*ptr)->size); + } +#elif !defined __x86_64__ && !defined S390 && !defined PA +#ifdef SPARC + if (((*ptr)->type == FFI_TYPE_STRUCT + && ((*ptr)->size > 16 || cif->abi != FFI_V9)) + || ((*ptr)->type == FFI_TYPE_LONGDOUBLE + && cif->abi != FFI_V9)) + bytes += sizeof(void*); + else +#endif + { + /* Add any padding if necessary */ + if (((*ptr)->alignment - 1) & bytes) + bytes = ALIGN(bytes, (*ptr)->alignment); + + bytes += STACK_ARG_SIZE((*ptr)->size); + } +#endif + } + + cif->bytes = bytes; + + /* Perform machine dependent cif processing */ + return ffi_prep_cif_machdep(cif); +} +#endif /* not __CRIS__ */ diff -r -u ./Modules/_ctypes/libffi_osx/include/ffi.h ./Modules/_ctypes/libffi_osx/include/ffi.h new file mode 100644 index 0000000..c104a5c --- /dev/null +++ ./Modules/_ctypes/libffi_osx/include/ffi.h @@ -0,0 +1,355 @@ +/* -----------------------------------------------------------------*-C-*- + libffi PyOBJC - Copyright (c) 1996-2003 Red Hat, Inc. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + ----------------------------------------------------------------------- */ + +/* ------------------------------------------------------------------- + The basic API is described in the README file. + + The raw API is designed to bypass some of the argument packing + and unpacking on architectures for which it can be avoided. + + The closure API allows interpreted functions to be packaged up + inside a C function pointer, so that they can be called as C functions, + with no understanding on the client side that they are interpreted. + It can also be used in other cases in which it is necessary to package + up a user specified parameter and a function pointer as a single + function pointer. + + The closure API must be implemented in order to get its functionality, + e.g. for use by gij. Routines are provided to emulate the raw API + if the underlying platform doesn't allow faster implementation. + + More details on the raw and closure API can be found in: + + http://gcc.gnu.org/ml/java/1999-q3/msg00138.html + + and + + http://gcc.gnu.org/ml/java/1999-q3/msg00174.html + -------------------------------------------------------------------- */ + +#ifndef LIBFFI_H +#define LIBFFI_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Specify which architecture libffi is configured for. */ +#ifdef MACOSX +# if defined(__i386__) || defined(__x86_64__) +# define X86_DARWIN +# elif defined(__ppc__) || defined(__ppc64__) +# define POWERPC_DARWIN +# else +# error "Unsupported MacOS X CPU type" +# endif +#else +#error "Unsupported OS type" +#endif + +/* ---- System configuration information --------------------------------- */ + +#include "ffitarget.h" +#include "fficonfig.h" + +#ifndef LIBFFI_ASM + +#include +#include + +/* LONG_LONG_MAX is not always defined (not if STRICT_ANSI, for example). + But we can find it either under the correct ANSI name, or under GNU + C's internal name. */ +#ifdef LONG_LONG_MAX +# define FFI_LONG_LONG_MAX LONG_LONG_MAX +#else +# ifdef LLONG_MAX +# define FFI_LONG_LONG_MAX LLONG_MAX +# else +# ifdef __GNUC__ +# define FFI_LONG_LONG_MAX __LONG_LONG_MAX__ +# endif +# endif +#endif + +#if SCHAR_MAX == 127 +# define ffi_type_uchar ffi_type_uint8 +# define ffi_type_schar ffi_type_sint8 +#else +#error "char size not supported" +#endif + +#if SHRT_MAX == 32767 +# define ffi_type_ushort ffi_type_uint16 +# define ffi_type_sshort ffi_type_sint16 +#elif SHRT_MAX == 2147483647 +# define ffi_type_ushort ffi_type_uint32 +# define ffi_type_sshort ffi_type_sint32 +#else +#error "short size not supported" +#endif + +#if INT_MAX == 32767 +# define ffi_type_uint ffi_type_uint16 +# define ffi_type_sint ffi_type_sint16 +#elif INT_MAX == 2147483647 +# define ffi_type_uint ffi_type_uint32 +# define ffi_type_sint ffi_type_sint32 +#elif INT_MAX == 9223372036854775807 +# define ffi_type_uint ffi_type_uint64 +# define ffi_type_sint ffi_type_sint64 +#else +#error "int size not supported" +#endif + +#define ffi_type_ulong ffi_type_uint64 +#define ffi_type_slong ffi_type_sint64 + +#if LONG_MAX == 2147483647 +# if FFI_LONG_LONG_MAX != 9223372036854775807 +# error "no 64-bit data type supported" +# endif +#elif LONG_MAX != 9223372036854775807 +#error "long size not supported" +#endif + +/* The closure code assumes that this works on pointers, i.e. a size_t + can hold a pointer. */ + +typedef struct _ffi_type { + size_t size; + unsigned short alignment; + unsigned short type; +/*@null@*/ struct _ffi_type** elements; +} ffi_type; + +/* These are defined in types.c */ +extern ffi_type ffi_type_void; +extern ffi_type ffi_type_uint8; +extern ffi_type ffi_type_sint8; +extern ffi_type ffi_type_uint16; +extern ffi_type ffi_type_sint16; +extern ffi_type ffi_type_uint32; +extern ffi_type ffi_type_sint32; +extern ffi_type ffi_type_uint64; +extern ffi_type ffi_type_sint64; +extern ffi_type ffi_type_float; +extern ffi_type ffi_type_double; +extern ffi_type ffi_type_longdouble; +extern ffi_type ffi_type_pointer; + +typedef enum ffi_status { + FFI_OK = 0, + FFI_BAD_TYPEDEF, + FFI_BAD_ABI +} ffi_status; + +typedef unsigned FFI_TYPE; + +typedef struct ffi_cif { + ffi_abi abi; + unsigned nargs; +/*@dependent@*/ ffi_type** arg_types; +/*@dependent@*/ ffi_type* rtype; + unsigned bytes; + unsigned flags; +#ifdef FFI_EXTRA_CIF_FIELDS + FFI_EXTRA_CIF_FIELDS; +#endif +} ffi_cif; + +/* ---- Definitions for the raw API -------------------------------------- */ + +#ifndef FFI_SIZEOF_ARG +# if LONG_MAX == 2147483647 +# define FFI_SIZEOF_ARG 4 +# elif LONG_MAX == 9223372036854775807 +# define FFI_SIZEOF_ARG 8 +# endif +#endif + +typedef union { + ffi_sarg sint; + ffi_arg uint; + float flt; + char data[FFI_SIZEOF_ARG]; + void* ptr; +} ffi_raw; + +void +ffi_raw_call( +/*@dependent@*/ ffi_cif* cif, + void (*fn)(void), +/*@out@*/ void* rvalue, +/*@dependent@*/ ffi_raw* avalue); + +void +ffi_ptrarray_to_raw( + ffi_cif* cif, + void** args, + ffi_raw* raw); + +void +ffi_raw_to_ptrarray( + ffi_cif* cif, + ffi_raw* raw, + void** args); + +size_t +ffi_raw_size( + ffi_cif* cif); + +/* This is analogous to the raw API, except it uses Java parameter + packing, even on 64-bit machines. I.e. on 64-bit machines + longs and doubles are followed by an empty 64-bit word. */ +void +ffi_java_raw_call( +/*@dependent@*/ ffi_cif* cif, + void (*fn)(void), +/*@out@*/ void* rvalue, +/*@dependent@*/ ffi_raw* avalue); + +void +ffi_java_ptrarray_to_raw( + ffi_cif* cif, + void** args, + ffi_raw* raw); + +void +ffi_java_raw_to_ptrarray( + ffi_cif* cif, + ffi_raw* raw, + void** args); + +size_t +ffi_java_raw_size( + ffi_cif* cif); + +/* ---- Definitions for closures ----------------------------------------- */ + +#if FFI_CLOSURES + +typedef struct ffi_closure { + char tramp[FFI_TRAMPOLINE_SIZE]; + ffi_cif* cif; + void (*fun)(ffi_cif*,void*,void**,void*); + void* user_data; +} ffi_closure; + +ffi_status +ffi_prep_closure( + ffi_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif*,void*,void**,void*), + void* user_data); + +void ffi_closure_free(void *); +void *ffi_closure_alloc (size_t size, void **code); + +typedef struct ffi_raw_closure { + char tramp[FFI_TRAMPOLINE_SIZE]; + ffi_cif* cif; + +#if !FFI_NATIVE_RAW_API + /* if this is enabled, then a raw closure has the same layout + as a regular closure. We use this to install an intermediate + handler to do the transaltion, void** -> ffi_raw*. */ + void (*translate_args)(ffi_cif*,void*,void**,void*); + void* this_closure; +#endif + + void (*fun)(ffi_cif*,void*,ffi_raw*,void*); + void* user_data; +} ffi_raw_closure; + +ffi_status +ffi_prep_raw_closure( + ffi_raw_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif*,void*,ffi_raw*,void*), + void* user_data); + +ffi_status +ffi_prep_java_raw_closure( + ffi_raw_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif*,void*,ffi_raw*,void*), + void* user_data); + +#endif // FFI_CLOSURES + +/* ---- Public interface definition -------------------------------------- */ + +ffi_status +ffi_prep_cif( +/*@out@*/ /*@partial@*/ ffi_cif* cif, + ffi_abi abi, + unsigned int nargs, +/*@dependent@*/ /*@out@*/ /*@partial@*/ ffi_type* rtype, +/*@dependent@*/ ffi_type** atypes); + +void +ffi_call( +/*@dependent@*/ ffi_cif* cif, + void (*fn)(void), +/*@out@*/ void* rvalue, +/*@dependent@*/ void** avalue); + +/* Useful for eliminating compiler warnings */ +#define FFI_FN(f) ((void (*)(void))f) + +#endif // #ifndef LIBFFI_ASM +/* ---- Definitions shared with assembly code ---------------------------- */ + +/* If these change, update src/mips/ffitarget.h. */ +#define FFI_TYPE_VOID 0 +#define FFI_TYPE_INT 1 +#define FFI_TYPE_FLOAT 2 +#define FFI_TYPE_DOUBLE 3 + +#ifdef HAVE_LONG_DOUBLE +# define FFI_TYPE_LONGDOUBLE 4 +#else +# define FFI_TYPE_LONGDOUBLE FFI_TYPE_DOUBLE +#endif + +#define FFI_TYPE_UINT8 5 +#define FFI_TYPE_SINT8 6 +#define FFI_TYPE_UINT16 7 +#define FFI_TYPE_SINT16 8 +#define FFI_TYPE_UINT32 9 +#define FFI_TYPE_SINT32 10 +#define FFI_TYPE_UINT64 11 +#define FFI_TYPE_SINT64 12 +#define FFI_TYPE_STRUCT 13 +#define FFI_TYPE_POINTER 14 + +/* This should always refer to the last type code (for sanity checks) */ +#define FFI_TYPE_LAST FFI_TYPE_POINTER + +#ifdef __cplusplus +} +#endif + +#endif // #ifndef LIBFFI_H diff -r -u ./Modules/_ctypes/libffi_osx/include/ffi_common.h ./Modules/_ctypes/libffi_osx/include/ffi_common.h new file mode 100644 index 0000000..685a358 --- /dev/null +++ ./Modules/_ctypes/libffi_osx/include/ffi_common.h @@ -0,0 +1,102 @@ +/* ----------------------------------------------------------------------- + ffi_common.h - Copyright (c) 1996 Red Hat, Inc. + + Common internal definitions and macros. Only necessary for building + libffi. + ----------------------------------------------------------------------- */ + +#ifndef FFI_COMMON_H +#define FFI_COMMON_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "fficonfig.h" + +/* Do not move this. Some versions of AIX are very picky about where + this is positioned. */ +#ifdef __GNUC__ +# define alloca __builtin_alloca +#else +# if HAVE_ALLOCA_H +# include +# else +# ifdef _AIX +# pragma alloca +# else +# ifndef alloca /* predefined by HP cc +Olibcalls */ +char* alloca(); +# endif +# endif +# endif +#endif + +/* Check for the existence of memcpy. */ +#if STDC_HEADERS +# include +#else +# ifndef HAVE_MEMCPY +# define memcpy(d, s, n) bcopy((s), (d), (n)) +# endif +#endif + +/*#if defined(FFI_DEBUG) +#include +#endif*/ + +#ifdef FFI_DEBUG +#include + +/*@exits@*/ void +ffi_assert( +/*@temp@*/ char* expr, +/*@temp@*/ char* file, + int line); +void +ffi_stop_here(void); +void +ffi_type_test( +/*@temp@*/ /*@out@*/ ffi_type* a, +/*@temp@*/ char* file, + int line); + +# define FFI_ASSERT(x) ((x) ? (void)0 : ffi_assert(#x, __FILE__,__LINE__)) +# define FFI_ASSERT_AT(x, f, l) ((x) ? 0 : ffi_assert(#x, (f), (l))) +# define FFI_ASSERT_VALID_TYPE(x) ffi_type_test(x, __FILE__, __LINE__) +#else +# define FFI_ASSERT(x) +# define FFI_ASSERT_AT(x, f, l) +# define FFI_ASSERT_VALID_TYPE(x) +#endif // #ifdef FFI_DEBUG + +#define ALIGN(v, a) (((size_t)(v) + (a) - 1) & ~((a) - 1)) + +/* Perform machine dependent cif processing */ +ffi_status +ffi_prep_cif_machdep( + ffi_cif* cif); + +/* Extended cif, used in callback from assembly routine */ +typedef struct extended_cif { +/*@dependent@*/ ffi_cif* cif; +/*@dependent@*/ void* rvalue; +/*@dependent@*/ void** avalue; +} extended_cif; + +/* Terse sized type definitions. */ +typedef unsigned int UINT8 __attribute__((__mode__(__QI__))); +typedef signed int SINT8 __attribute__((__mode__(__QI__))); +typedef unsigned int UINT16 __attribute__((__mode__(__HI__))); +typedef signed int SINT16 __attribute__((__mode__(__HI__))); +typedef unsigned int UINT32 __attribute__((__mode__(__SI__))); +typedef signed int SINT32 __attribute__((__mode__(__SI__))); +typedef unsigned int UINT64 __attribute__((__mode__(__DI__))); +typedef signed int SINT64 __attribute__((__mode__(__DI__))); +typedef float FLOAT32; + +#ifdef __cplusplus +} +#endif + +#endif // #ifndef FFI_COMMON_H \ No newline at end of file diff -r -u ./Modules/_ctypes/libffi_osx/include/fficonfig.h ./Modules/_ctypes/libffi_osx/include/fficonfig.h new file mode 100644 index 0000000..2172490 --- /dev/null +++ ./Modules/_ctypes/libffi_osx/include/fficonfig.h @@ -0,0 +1,150 @@ +/* Manually created fficonfig.h for Darwin on PowerPC or Intel + + This file is manually generated to do away with the need for autoconf and + therefore make it easier to cross-compile and build fat binaries. + + NOTE: This file was added by PyObjC. +*/ + +#ifndef MACOSX +#error "This file is only supported on Mac OS X" +#endif + +#if defined(__i386__) +# define BYTEORDER 1234 +# undef HOST_WORDS_BIG_ENDIAN +# undef WORDS_BIGENDIAN +# define SIZEOF_DOUBLE 8 +# define HAVE_LONG_DOUBLE 1 +# define SIZEOF_LONG_DOUBLE 16 + +#elif defined(__x86_64__) +# define BYTEORDER 1234 +# undef HOST_WORDS_BIG_ENDIAN +# undef WORDS_BIGENDIAN +# define SIZEOF_DOUBLE 8 +# define HAVE_LONG_DOUBLE 1 +# define SIZEOF_LONG_DOUBLE 16 + +#elif defined(__ppc__) +# define BYTEORDER 4321 +# define HOST_WORDS_BIG_ENDIAN 1 +# define WORDS_BIGENDIAN 1 +# define SIZEOF_DOUBLE 8 +# if __GNUC__ >= 4 +# define HAVE_LONG_DOUBLE 1 +# define SIZEOF_LONG_DOUBLE 16 +# else +# undef HAVE_LONG_DOUBLE +# define SIZEOF_LONG_DOUBLE 8 +# endif + +#elif defined(__ppc64__) +# define BYTEORDER 4321 +# define HOST_WORDS_BIG_ENDIAN 1 +# define WORDS_BIGENDIAN 1 +# define SIZEOF_DOUBLE 8 +# define HAVE_LONG_DOUBLE 1 +# define SIZEOF_LONG_DOUBLE 16 + +#else +#error "Unknown CPU type" +#endif + +/* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP + systems. This function is required for `alloca.c' support on those systems. */ +#undef CRAY_STACKSEG_END + +/* Define to 1 if using `alloca.c'. */ +/* #undef C_ALLOCA */ + +/* Define to the flags needed for the .section .eh_frame directive. */ +#define EH_FRAME_FLAGS "aw" + +/* Define this if you want extra debugging. */ +/* #undef FFI_DEBUG */ + +/* Define this is you do not want support for the raw API. */ +#define FFI_NO_RAW_API 1 + +/* Define this if you do not want support for aggregate types. */ +/* #undef FFI_NO_STRUCTS */ + +/* Define to 1 if you have `alloca', as a function or macro. */ +#define HAVE_ALLOCA 1 + +/* Define to 1 if you have and it should be used (not on Ultrix). */ +#define HAVE_ALLOCA_H 1 + +/* Define if your assembler supports .register. */ +/* #undef HAVE_AS_REGISTER_PSEUDO_OP */ + +/* Define if your assembler and linker support unaligned PC relative relocs. */ +/* #undef HAVE_AS_SPARC_UA_PCREL */ + +/* Define to 1 if you have the `memcpy' function. */ +#define HAVE_MEMCPY 1 + +/* Define if mmap with MAP_ANON(YMOUS) works. */ +#define HAVE_MMAP_ANON 1 + +/* Define if mmap of /dev/zero works. */ +/* #undef HAVE_MMAP_DEV_ZERO */ + +/* Define if read-only mmap of a plain file works. */ +#define HAVE_MMAP_FILE 1 + +/* Define if .eh_frame sections should be read-only. */ +/* #undef HAVE_RO_EH_FRAME */ + +/* Define to 1 if your C compiler doesn't accept -c and -o together. */ +/* #undef NO_MINUS_C_MINUS_O */ + +/* Name of package */ +#define PACKAGE "libffi" + +/* Define to the address where bug reports for this package should be sent. */ +#define PACKAGE_BUGREPORT "http://gcc.gnu.org/bugs.html" + +/* Define to the full name of this package. */ +#define PACKAGE_NAME "libffi" + +/* Define to the full name and version of this package. */ +#define PACKAGE_STRING "libffi 2.1" + +/* Define to the one symbol short name of this package. */ +#define PACKAGE_TARNAME "libffi" + +/* Define to the version of this package. */ +#define PACKAGE_VERSION "2.1" + +/* If using the C implementation of alloca, define if you know the + direction of stack growth for your system; otherwise it will be + automatically deduced at run-time. + STACK_DIRECTION > 0 => grows toward higher addresses + STACK_DIRECTION < 0 => grows toward lower addresses + STACK_DIRECTION = 0 => direction of growth unknown */ +/* #undef STACK_DIRECTION */ + +/* Define to 1 if you have the ANSI C header files. */ +#define STDC_HEADERS 1 + +/* Define this if you are using Purify and want to suppress spurious messages. */ +/* #undef USING_PURIFY */ + +/* Version number of package */ +#define VERSION "2.1-pyobjc" + +#ifdef HAVE_HIDDEN_VISIBILITY_ATTRIBUTE +# ifdef LIBFFI_ASM +# define FFI_HIDDEN(name) .hidden name +# else +# define FFI_HIDDEN __attribute__((visibility ("hidden"))) +# endif +#else +# ifdef LIBFFI_ASM +# define FFI_HIDDEN(name) +# else +# define FFI_HIDDEN +# endif +#endif \ No newline at end of file diff -r -u ./Modules/_ctypes/libffi_osx/include/ffitarget.h ./Modules/_ctypes/libffi_osx/include/ffitarget.h new file mode 100644 index 0000000..faaa30d --- /dev/null +++ ./Modules/_ctypes/libffi_osx/include/ffitarget.h @@ -0,0 +1,13 @@ +/* Dispatch to the right ffitarget file. This file is PyObjC specific; in a + normal build, the build environment copies the file to the right location or + sets up the right include flags. We want to do neither because that would + make building fat binaries harder. +*/ + +#if defined(__i386__) || defined(__x86_64__) +#include "x86-ffitarget.h" +#elif defined(__ppc__) || defined(__ppc64__) +#include "ppc-ffitarget.h" +#else +#error "Unsupported CPU type" +#endif \ No newline at end of file diff -r -u ./Modules/_ctypes/libffi_osx/include/ppc-ffitarget.h ./Modules/_ctypes/libffi_osx/include/ppc-ffitarget.h new file mode 100644 index 0000000..2318421 --- /dev/null +++ ./Modules/_ctypes/libffi_osx/include/ppc-ffitarget.h @@ -0,0 +1,104 @@ +/* -----------------------------------------------------------------*-C-*- + ppc-ffitarget.h - Copyright (c) 1996-2003 Red Hat, Inc. + Target configuration macros for PowerPC. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#ifndef LIBFFI_TARGET_H +#define LIBFFI_TARGET_H + +/* ---- System specific configurations ----------------------------------- */ + +#if (defined(POWERPC) && defined(__powerpc64__)) || \ + (defined(POWERPC_DARWIN) && defined(__ppc64__)) +#define POWERPC64 +#endif + +#ifndef LIBFFI_ASM + +typedef unsigned long ffi_arg; +typedef signed long ffi_sarg; + +typedef enum ffi_abi { + FFI_FIRST_ABI = 0, + +#ifdef POWERPC + FFI_SYSV, + FFI_GCC_SYSV, + FFI_LINUX64, +# ifdef POWERPC64 + FFI_DEFAULT_ABI = FFI_LINUX64, +# else + FFI_DEFAULT_ABI = FFI_GCC_SYSV, +# endif +#endif + +#ifdef POWERPC_AIX + FFI_AIX, + FFI_DARWIN, + FFI_DEFAULT_ABI = FFI_AIX, +#endif + +#ifdef POWERPC_DARWIN + FFI_AIX, + FFI_DARWIN, + FFI_DEFAULT_ABI = FFI_DARWIN, +#endif + +#ifdef POWERPC_FREEBSD + FFI_SYSV, + FFI_GCC_SYSV, + FFI_LINUX64, + FFI_DEFAULT_ABI = FFI_SYSV, +#endif + + FFI_LAST_ABI = FFI_DEFAULT_ABI + 1 +} ffi_abi; + +#endif // #ifndef LIBFFI_ASM + +/* ---- Definitions for closures ----------------------------------------- */ + +#define FFI_CLOSURES 1 +#define FFI_NATIVE_RAW_API 0 + +/* Needed for FFI_SYSV small structure returns. */ +#define FFI_SYSV_TYPE_SMALL_STRUCT (FFI_TYPE_LAST) + +#if defined(POWERPC64) /*|| defined(POWERPC_AIX)*/ +# define FFI_TRAMPOLINE_SIZE 48 +#elif defined(POWERPC_AIX) +# define FFI_TRAMPOLINE_SIZE 24 +#else +# define FFI_TRAMPOLINE_SIZE 40 +#endif + +#ifndef LIBFFI_ASM +# if defined(POWERPC_DARWIN) || defined(POWERPC_AIX) +typedef struct ffi_aix_trampoline_struct { + void* code_pointer; /* Pointer to ffi_closure_ASM */ + void* toc; /* TOC */ + void* static_chain; /* Pointer to closure */ +} ffi_aix_trampoline_struct; +# endif +#endif // #ifndef LIBFFI_ASM + +#endif // #ifndef LIBFFI_TARGET_H \ No newline at end of file diff -r -u ./Modules/_ctypes/libffi_osx/include/x86-ffitarget.h ./Modules/_ctypes/libffi_osx/include/x86-ffitarget.h new file mode 100644 index 0000000..55c2b6c --- /dev/null +++ ./Modules/_ctypes/libffi_osx/include/x86-ffitarget.h @@ -0,0 +1,88 @@ +/* -----------------------------------------------------------------*-C-*- + x86-ffitarget.h - Copyright (c) 1996-2003 Red Hat, Inc. + Target configuration macros for x86 and x86-64. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + ----------------------------------------------------------------------- */ + +#ifndef LIBFFI_TARGET_H +#define LIBFFI_TARGET_H + +/* ---- System specific configurations ----------------------------------- */ + +#if defined(X86_64) && defined(__i386__) +# undef X86_64 +# define X86 +#endif + +#if defined(__x86_64__) +# ifndef X86_64 +# define X86_64 +# endif +#endif + +/* ---- Generic type definitions ----------------------------------------- */ + +#ifndef LIBFFI_ASM + +typedef unsigned long ffi_arg; +typedef signed long ffi_sarg; + +typedef enum ffi_abi { + FFI_FIRST_ABI = 0, + + /* ---- Intel x86 Win32 ---------- */ +#ifdef X86_WIN32 + FFI_SYSV, + FFI_STDCALL, + /* TODO: Add fastcall support for the sake of completeness */ + FFI_DEFAULT_ABI = FFI_SYSV, +#endif + + /* ---- Intel x86 and AMD x86-64 - */ +#if !defined(X86_WIN32) && (defined(__i386__) || defined(__x86_64__)) + FFI_SYSV, + FFI_UNIX64, /* Unix variants all use the same ABI for x86-64 */ +# ifdef __i386__ + FFI_DEFAULT_ABI = FFI_SYSV, +# else + FFI_DEFAULT_ABI = FFI_UNIX64, +# endif +#endif + + FFI_LAST_ABI = FFI_DEFAULT_ABI + 1 +} ffi_abi; + +#endif // #ifndef LIBFFI_ASM + +/* ---- Definitions for closures ----------------------------------------- */ + +#define FFI_CLOSURES 1 + +#if defined(X86_64) || (defined(__x86_64__) && defined(X86_DARWIN)) +# define FFI_TRAMPOLINE_SIZE 24 +# define FFI_NATIVE_RAW_API 0 +#else +# define FFI_TRAMPOLINE_SIZE 10 +# define FFI_NATIVE_RAW_API 1 /* x86 has native raw api support */ +#endif + +#endif // #ifndef LIBFFI_TARGET_H \ No newline at end of file diff -r -u ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin.S ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin.S new file mode 100644 index 0000000..f143dbd --- /dev/null +++ ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin.S @@ -0,0 +1,365 @@ +#if defined(__ppc__) || defined(__ppc64__) + +/* ----------------------------------------------------------------------- + ppc-darwin.S - Copyright (c) 2000 John Hornkvist + Copyright (c) 2004 Free Software Foundation, Inc. + + PowerPC Assembly glue. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#define LIBFFI_ASM + +#include +#include +#include +#include + +.text + .align 2 +.globl _ffi_prep_args + +.text + .align 2 +.globl _ffi_call_DARWIN + +.text + .align 2 +_ffi_call_DARWIN: +LFB0: + mr r12,r8 /* We only need r12 until the call, + so it doesn't have to be saved. */ + +LFB1: + /* Save the old stack pointer as AP. */ + mr r8,r1 + +LCFI0: +#if defined(__ppc64__) + /* Allocate the stack space we need. + r4 (size of input data) + 48 bytes (linkage area) + 40 bytes (saved registers) + 8 bytes (extra FPR) + r4 + 96 bytes total + */ + + addi r4,r4,-96 // Add our overhead. + li r0,-32 // Align to 32 bytes. + and r4,r4,r0 +#endif + stgux r1,r1,r4 // Grow the stack. + mflr r9 + + /* Save registers we use. */ +#if defined(__ppc64__) + std r27,-40(r8) +#endif + stg r28,MODE_CHOICE(-16,-32)(r8) + stg r29,MODE_CHOICE(-12,-24)(r8) + stg r30,MODE_CHOICE(-8,-16)(r8) + stg r31,MODE_CHOICE(-4,-8)(r8) + stg r9,SF_RETURN(r8) /* return address */ +#if !defined(POWERPC_DARWIN) /* TOC unused in OS X */ + stg r2,MODE_CHOICE(20,40)(r1) +#endif + +LCFI1: +#if defined(__ppc64__) + mr r27,r3 // our extended_cif +#endif + /* Save arguments over call. */ + mr r31,r5 /* flags, */ + mr r30,r6 /* rvalue, */ + mr r29,r7 /* function address, */ + mr r28,r8 /* our AP. */ + +LCFI2: + /* Call ffi_prep_args. */ + mr r4,r1 + li r9,0 + mtctr r12 /* r12 holds address of _ffi_prep_args. */ + bctrl +#if !defined(POWERPC_DARWIN) /* TOC unused in OS X */ + lg r2,MODE_CHOICE(20,40)(r1) +#endif + + /* Now do the call. + Set up cr1 with bits 4-7 of the flags. */ + mtcrf 0x40,r31 + + /* Load all those argument registers. + We have set up a nice stack frame, just load it into registers. */ + lg r3,SF_ARG1(r1) + lg r4,SF_ARG2(r1) + lg r5,SF_ARG3(r1) + lg r6,SF_ARG4(r1) + nop + lg r7,SF_ARG5(r1) + lg r8,SF_ARG6(r1) + lg r9,SF_ARG7(r1) + lg r10,SF_ARG8(r1) + + /* Load all the FP registers. */ + bf 6,L2 /* No floats to load. */ +#if defined(__ppc64__) + lfd f1,MODE_CHOICE(-16,-40)-(14*8)(r28) + lfd f2,MODE_CHOICE(-16,-40)-(13*8)(r28) + lfd f3,MODE_CHOICE(-16,-40)-(12*8)(r28) + lfd f4,MODE_CHOICE(-16,-40)-(11*8)(r28) + nop + lfd f5,MODE_CHOICE(-16,-40)-(10*8)(r28) + lfd f6,MODE_CHOICE(-16,-40)-(9*8)(r28) + lfd f7,MODE_CHOICE(-16,-40)-(8*8)(r28) + lfd f8,MODE_CHOICE(-16,-40)-(7*8)(r28) + nop + lfd f9,MODE_CHOICE(-16,-40)-(6*8)(r28) + lfd f10,MODE_CHOICE(-16,-40)-(5*8)(r28) + lfd f11,MODE_CHOICE(-16,-40)-(4*8)(r28) + lfd f12,MODE_CHOICE(-16,-40)-(3*8)(r28) + nop + lfd f13,MODE_CHOICE(-16,-40)-(2*8)(r28) + lfd f14,MODE_CHOICE(-16,-40)-(1*8)(r28) +#elif defined(__ppc__) + lfd f1,MODE_CHOICE(-16,-40)-(13*8)(r28) + lfd f2,MODE_CHOICE(-16,-40)-(12*8)(r28) + lfd f3,MODE_CHOICE(-16,-40)-(11*8)(r28) + lfd f4,MODE_CHOICE(-16,-40)-(10*8)(r28) + nop + lfd f5,MODE_CHOICE(-16,-40)-(9*8)(r28) + lfd f6,MODE_CHOICE(-16,-40)-(8*8)(r28) + lfd f7,MODE_CHOICE(-16,-40)-(7*8)(r28) + lfd f8,MODE_CHOICE(-16,-40)-(6*8)(r28) + nop + lfd f9,MODE_CHOICE(-16,-40)-(5*8)(r28) + lfd f10,MODE_CHOICE(-16,-40)-(4*8)(r28) + lfd f11,MODE_CHOICE(-16,-40)-(3*8)(r28) + lfd f12,MODE_CHOICE(-16,-40)-(2*8)(r28) + nop + lfd f13,MODE_CHOICE(-16,-40)-(1*8)(r28) +#else +#error undefined architecture +#endif + +L2: + mr r12,r29 // Put the target address in r12 as specified. + mtctr r12 // Get the address to call into CTR. + nop + nop + bctrl // Make the call. + + // Deal with the return value. +#if defined(__ppc64__) + mtcrf 0x3,r31 // flags in cr6 and cr7 + bt 27,L(st_return_value) +#elif defined(__ppc__) + mtcrf 0x1,r31 // flags in cr7 +#else +#error undefined architecture +#endif + + bt 30,L(done_return_value) + bt 29,L(fp_return_value) + stg r3,0(r30) +#if defined(__ppc__) + bf 28,L(done_return_value) // Store the second long if necessary. + stg r4,4(r30) +#endif + // Fall through + +L(done_return_value): + lg r1,0(r1) // Restore stack pointer. + // Restore the registers we used. + lg r9,SF_RETURN(r1) // return address + lg r31,MODE_CHOICE(-4,-8)(r1) + mtlr r9 + lg r30,MODE_CHOICE(-8,-16)(r1) + lg r29,MODE_CHOICE(-12,-24)(r1) + lg r28,MODE_CHOICE(-16,-32)(r1) +#if defined(__ppc64__) + ld r27,-40(r1) +#endif + blr + +#if defined(__ppc64__) +L(st_return_value): + // Grow the stack enough to fit the registers. Leave room for 8 args + // to trample the 1st 8 slots in param area. + stgu r1,-SF_ROUND(280)(r1) // 64 + 104 + 48 + 64 + + // Store GPRs + std r3,SF_ARG9(r1) + std r4,SF_ARG10(r1) + std r5,SF_ARG11(r1) + std r6,SF_ARG12(r1) + nop + std r7,SF_ARG13(r1) + std r8,SF_ARG14(r1) + std r9,SF_ARG15(r1) + std r10,SF_ARG16(r1) + + // Store FPRs + nop + bf 26,L(call_struct_to_ram_form) + stfd f1,SF_ARG17(r1) + stfd f2,SF_ARG18(r1) + stfd f3,SF_ARG19(r1) + stfd f4,SF_ARG20(r1) + nop + stfd f5,SF_ARG21(r1) + stfd f6,SF_ARG22(r1) + stfd f7,SF_ARG23(r1) + stfd f8,SF_ARG24(r1) + nop + stfd f9,SF_ARG25(r1) + stfd f10,SF_ARG26(r1) + stfd f11,SF_ARG27(r1) + stfd f12,SF_ARG28(r1) + nop + stfd f13,SF_ARG29(r1) + +L(call_struct_to_ram_form): + ld r3,0(r27) // extended_cif->cif* + ld r3,16(r3) // ffi_cif->rtype* + addi r4,r1,SF_ARG9 // stored GPRs + addi r6,r1,SF_ARG17 // stored FPRs + li r5,0 // GPR size ptr (NULL) + li r7,0 // FPR size ptr (NULL) + li r8,0 // FPR count ptr (NULL) + li r10,0 // struct offset (NULL) + mr r9,r30 // return area + bl Lffi64_struct_to_ram_form$stub + lg r1,0(r1) // Restore stack pointer. + b L(done_return_value) +#endif + +L(fp_return_value): + /* Do we have long double to store? */ + bf 31,L(fd_return_value) + stfd f1,0(r30) + stfd f2,8(r30) + b L(done_return_value) + +L(fd_return_value): + /* Do we have double to store? */ + bf 28,L(float_return_value) + stfd f1,0(r30) + b L(done_return_value) + +L(float_return_value): + /* We only have a float to store. */ + stfs f1,0(r30) + b L(done_return_value) + +LFE1: +/* END(_ffi_call_DARWIN) */ + +/* Provide a null definition of _ffi_call_AIX. */ +.text + .align 2 +.globl _ffi_call_AIX +.text + .align 2 +_ffi_call_AIX: + blr +/* END(_ffi_call_AIX) */ + +.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms +EH_frame1: + .set L$set$0,LECIE1-LSCIE1 + .long L$set$0 ; Length of Common Information Entry +LSCIE1: + .long 0x0 ; CIE Identifier Tag + .byte 0x1 ; CIE Version + .ascii "zR\0" ; CIE Augmentation + .byte 0x1 ; uleb128 0x1; CIE Code Alignment Factor + .byte 0x7c ; sleb128 -4; CIE Data Alignment Factor + .byte 0x41 ; CIE RA Column + .byte 0x1 ; uleb128 0x1; Augmentation size + .byte 0x10 ; FDE Encoding (pcrel) + .byte 0xc ; DW_CFA_def_cfa + .byte 0x1 ; uleb128 0x1 + .byte 0x0 ; uleb128 0x0 + .align LOG2_GPR_BYTES +LECIE1: +.globl _ffi_call_DARWIN.eh +_ffi_call_DARWIN.eh: +LSFDE1: + .set L$set$1,LEFDE1-LASFDE1 + .long L$set$1 ; FDE Length + +LASFDE1: + .long LASFDE1-EH_frame1 ; FDE CIE offset + .g_long LFB0-. ; FDE initial location + .set L$set$3,LFE1-LFB0 + .g_long L$set$3 ; FDE address range + .byte 0x0 ; uleb128 0x0; Augmentation size + .byte 0x4 ; DW_CFA_advance_loc4 + .set L$set$4,LCFI0-LFB1 + .long L$set$4 + .byte 0xd ; DW_CFA_def_cfa_register + .byte 0x08 ; uleb128 0x08 + .byte 0x4 ; DW_CFA_advance_loc4 + .set L$set$5,LCFI1-LCFI0 + .long L$set$5 + .byte 0x11 ; DW_CFA_offset_extended_sf + .byte 0x41 ; uleb128 0x41 + .byte 0x7e ; sleb128 -2 + .byte 0x9f ; DW_CFA_offset, column 0x1f + .byte 0x1 ; uleb128 0x1 + .byte 0x9e ; DW_CFA_offset, column 0x1e + .byte 0x2 ; uleb128 0x2 + .byte 0x9d ; DW_CFA_offset, column 0x1d + .byte 0x3 ; uleb128 0x3 + .byte 0x9c ; DW_CFA_offset, column 0x1c + .byte 0x4 ; uleb128 0x4 + .byte 0x4 ; DW_CFA_advance_loc4 + .set L$set$6,LCFI2-LCFI1 + .long L$set$6 + .byte 0xd ; DW_CFA_def_cfa_register + .byte 0x1c ; uleb128 0x1c + .align LOG2_GPR_BYTES +LEFDE1: + +#if defined(__ppc64__) +.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 + .align LOG2_GPR_BYTES + +Lffi64_struct_to_ram_form$stub: + .indirect_symbol _ffi64_struct_to_ram_form + mflr r0 + bcl 20,31,LO$ffi64_struct_to_ram_form + +LO$ffi64_struct_to_ram_form: + mflr r11 + addis r11,r11,ha16(L_ffi64_struct_to_ram_form$lazy_ptr - LO$ffi64_struct_to_ram_form) + mtlr r0 + lgu r12,lo16(L_ffi64_struct_to_ram_form$lazy_ptr - LO$ffi64_struct_to_ram_form)(r11) + mtctr r12 + bctr + +.lazy_symbol_pointer +L_ffi64_struct_to_ram_form$lazy_ptr: + .indirect_symbol _ffi64_struct_to_ram_form + .g_long dyld_stub_binding_helper + +#endif // __ppc64__ +#endif // __ppc__ || __ppc64__ diff -r -u ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin.h ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin.h new file mode 100644 index 0000000..cf4bd50 --- /dev/null +++ ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin.h @@ -0,0 +1,85 @@ +/* ----------------------------------------------------------------------- + ppc-darwin.h - Copyright (c) 2002, 2003, 2004, Free Software Foundation, + Inc. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#define L(x) x + +#define SF_ARG9 MODE_CHOICE(56,112) +#define SF_ARG10 MODE_CHOICE(60,120) +#define SF_ARG11 MODE_CHOICE(64,128) +#define SF_ARG12 MODE_CHOICE(68,136) +#define SF_ARG13 MODE_CHOICE(72,144) +#define SF_ARG14 MODE_CHOICE(76,152) +#define SF_ARG15 MODE_CHOICE(80,160) +#define SF_ARG16 MODE_CHOICE(84,168) +#define SF_ARG17 MODE_CHOICE(88,176) +#define SF_ARG18 MODE_CHOICE(92,184) +#define SF_ARG19 MODE_CHOICE(96,192) +#define SF_ARG20 MODE_CHOICE(100,200) +#define SF_ARG21 MODE_CHOICE(104,208) +#define SF_ARG22 MODE_CHOICE(108,216) +#define SF_ARG23 MODE_CHOICE(112,224) +#define SF_ARG24 MODE_CHOICE(116,232) +#define SF_ARG25 MODE_CHOICE(120,240) +#define SF_ARG26 MODE_CHOICE(124,248) +#define SF_ARG27 MODE_CHOICE(128,256) +#define SF_ARG28 MODE_CHOICE(132,264) +#define SF_ARG29 MODE_CHOICE(136,272) + +#define ASM_NEEDS_REGISTERS 4 +#define NUM_GPR_ARG_REGISTERS 8 +#define NUM_FPR_ARG_REGISTERS 13 + +#define FFI_TYPE_1_BYTE(x) ((x) == FFI_TYPE_UINT8 || (x) == FFI_TYPE_SINT8) +#define FFI_TYPE_2_BYTE(x) ((x) == FFI_TYPE_UINT16 || (x) == FFI_TYPE_SINT16) +#define FFI_TYPE_4_BYTE(x) \ + ((x) == FFI_TYPE_UINT32 || (x) == FFI_TYPE_SINT32 ||\ + (x) == FFI_TYPE_INT || (x) == FFI_TYPE_FLOAT) + +#if !defined(LIBFFI_ASM) + +enum { + FLAG_RETURNS_NOTHING = 1 << (31 - 30), // cr7 + FLAG_RETURNS_FP = 1 << (31 - 29), + FLAG_RETURNS_64BITS = 1 << (31 - 28), + FLAG_RETURNS_128BITS = 1 << (31 - 31), + + FLAG_RETURNS_STRUCT = 1 << (31 - 27), // cr6 + FLAG_STRUCT_CONTAINS_FP = 1 << (31 - 26), + + FLAG_ARG_NEEDS_COPY = 1 << (31 - 7), + FLAG_FP_ARGUMENTS = 1 << (31 - 6), // cr1.eq; specified by ABI + FLAG_4_GPR_ARGUMENTS = 1 << (31 - 5), + FLAG_RETVAL_REFERENCE = 1 << (31 - 4) +}; + +#if defined(__ppc64__) +void ffi64_struct_to_ram_form(const ffi_type*, const char*, unsigned int*, + const char*, unsigned int*, unsigned int*, char*, unsigned int*); +void ffi64_struct_to_reg_form(const ffi_type*, const char*, unsigned int*, + unsigned int*, char*, unsigned int*, char*, unsigned int*); +bool ffi64_stret_needs_ptr(const ffi_type* inType, + unsigned short*, unsigned short*); +#endif + +#endif // !defined(LIBFFI_ASM) \ No newline at end of file diff -r -u ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin_closure.S ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin_closure.S new file mode 100644 index 0000000..c3d30c2 --- /dev/null +++ ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin_closure.S @@ -0,0 +1,308 @@ +#if defined(__ppc__) + +/* ----------------------------------------------------------------------- + ppc-darwin_closure.S - Copyright (c) 2002, 2003, 2004, Free Software Foundation, + Inc. based on ppc_closure.S + + PowerPC Assembly glue. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#define LIBFFI_ASM + +#include +#include // for FFI_TRAMPOLINE_SIZE +#include +#include + + .file "ppc-darwin_closure.S" +.text + .align LOG2_GPR_BYTES + .globl _ffi_closure_ASM + +.text + .align LOG2_GPR_BYTES + +_ffi_closure_ASM: +LFB1: + mflr r0 // Save return address + stg r0,SF_RETURN(r1) + +LCFI0: + /* 24/48 bytes (Linkage Area) + 32/64 bytes (outgoing parameter area, always reserved) + 104 bytes (13*8 from FPR) + 16/32 bytes (result) + 176/232 total bytes */ + + /* skip over caller save area and keep stack aligned to 16/32. */ + stgu r1,-SF_ROUND(176)(r1) + +LCFI1: + /* We want to build up an area for the parameters passed + in registers. (both floating point and integer) */ + + /* 176/256 bytes (callee stack frame aligned to 16/32) + 24/48 bytes (caller linkage area) + 200/304 (start of caller parameter area aligned to 4/8) + */ + + /* Save GPRs 3 - 10 (aligned to 4/8) + in the parents outgoing area. */ + stg r3,200(r1) + stg r4,204(r1) + stg r5,208(r1) + stg r6,212(r1) + stg r7,216(r1) + stg r8,220(r1) + stg r9,224(r1) + stg r10,228(r1) + + /* Save FPRs 1 - 13. (aligned to 8) */ + stfd f1,56(r1) + stfd f2,64(r1) + stfd f3,72(r1) + stfd f4,80(r1) + stfd f5,88(r1) + stfd f6,96(r1) + stfd f7,104(r1) + stfd f8,112(r1) + stfd f9,120(r1) + stfd f10,128(r1) + stfd f11,136(r1) + stfd f12,144(r1) + stfd f13,152(r1) + + // Set up registers for the routine that actually does the work. + mr r3,r11 // context pointer from the trampoline + addi r4,r1,160 // result storage + addi r5,r1,200 // saved GPRs + addi r6,r1,56 // saved FPRs + bl Lffi_closure_helper_DARWIN$stub + + /* Now r3 contains the return type. Use it to look up in a table + so we know how to deal with each type. */ + addi r5,r1,160 // Copy result storage pointer. + bl Lget_ret_type0_addr // Get pointer to Lret_type0 into LR. + mflr r4 // Move to r4. + slwi r3,r3,4 // Multiply return type by 16. + add r3,r3,r4 // Add contents of table to table address. + mtctr r3 + bctr + +LFE1: +/* Each of the ret_typeX code fragments has to be exactly 16 bytes long + (4 instructions). For cache effectiveness we align to a 16 byte boundary + first. */ + .align 4 + nop + nop + nop + +Lget_ret_type0_addr: + blrl + +/* case FFI_TYPE_VOID */ +Lret_type0: + b Lfinish + nop + nop + nop + +/* case FFI_TYPE_INT */ +Lret_type1: + lwz r3,0(r5) + b Lfinish + nop + nop + +/* case FFI_TYPE_FLOAT */ +Lret_type2: + lfs f1,0(r5) + b Lfinish + nop + nop + +/* case FFI_TYPE_DOUBLE */ +Lret_type3: + lfd f1,0(r5) + b Lfinish + nop + nop + +/* case FFI_TYPE_LONGDOUBLE */ +Lret_type4: + lfd f1,0(r5) + lfd f2,8(r5) + b Lfinish + nop + +/* case FFI_TYPE_UINT8 */ +Lret_type5: + lbz r3,3(r5) + b Lfinish + nop + nop + +/* case FFI_TYPE_SINT8 */ +Lret_type6: + lbz r3,3(r5) + extsb r3,r3 + b Lfinish + nop + +/* case FFI_TYPE_UINT16 */ +Lret_type7: + lhz r3,2(r5) + b Lfinish + nop + nop + +/* case FFI_TYPE_SINT16 */ +Lret_type8: + lha r3,2(r5) + b Lfinish + nop + nop + +/* case FFI_TYPE_UINT32 */ +Lret_type9: // same as Lret_type1 + lwz r3,0(r5) + b Lfinish + nop + nop + +/* case FFI_TYPE_SINT32 */ +Lret_type10: // same as Lret_type1 + lwz r3,0(r5) + b Lfinish + nop + nop + +/* case FFI_TYPE_UINT64 */ +Lret_type11: + lwz r3,0(r5) + lwz r4,4(r5) + b Lfinish + nop + +/* case FFI_TYPE_SINT64 */ +Lret_type12: // same as Lret_type11 + lwz r3,0(r5) + lwz r4,4(r5) + b Lfinish + nop + +/* case FFI_TYPE_STRUCT */ +Lret_type13: + b Lfinish + nop + nop + nop + +/* End 16-byte aligned cases */ +/* case FFI_TYPE_POINTER */ +// This case assumes that FFI_TYPE_POINTER == FFI_TYPE_LAST. If more types +// are added in future, the following code will need to be updated and +// padded to 16 bytes. +Lret_type14: + lg r3,0(r5) + // fall through + +/* case done */ +Lfinish: + addi r1,r1,SF_ROUND(176) // Restore stack pointer. + lg r0,SF_RETURN(r1) // Restore return address. + mtlr r0 // Restore link register. + blr + +/* END(ffi_closure_ASM) */ + +.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support +EH_frame1: + .set L$set$0,LECIE1-LSCIE1 + .long L$set$0 ; Length of Common Information Entry +LSCIE1: + .long 0x0 ; CIE Identifier Tag + .byte 0x1 ; CIE Version + .ascii "zR\0" ; CIE Augmentation + .byte 0x1 ; uleb128 0x1; CIE Code Alignment Factor + .byte 0x7c ; sleb128 -4; CIE Data Alignment Factor + .byte 0x41 ; CIE RA Column + .byte 0x1 ; uleb128 0x1; Augmentation size + .byte 0x10 ; FDE Encoding (pcrel) + .byte 0xc ; DW_CFA_def_cfa + .byte 0x1 ; uleb128 0x1 + .byte 0x0 ; uleb128 0x0 + .align LOG2_GPR_BYTES +LECIE1: +.globl _ffi_closure_ASM.eh +_ffi_closure_ASM.eh: +LSFDE1: + .set L$set$1,LEFDE1-LASFDE1 + .long L$set$1 ; FDE Length + +LASFDE1: + .long LASFDE1-EH_frame1 ; FDE CIE offset + .g_long LFB1-. ; FDE initial location + .set L$set$3,LFE1-LFB1 + .g_long L$set$3 ; FDE address range + .byte 0x0 ; uleb128 0x0; Augmentation size + .byte 0x4 ; DW_CFA_advance_loc4 + .set L$set$3,LCFI1-LCFI0 + .long L$set$3 + .byte 0xe ; DW_CFA_def_cfa_offset + .byte 176,1 ; uleb128 176 + .byte 0x4 ; DW_CFA_advance_loc4 + .set L$set$4,LCFI0-LFB1 + .long L$set$4 + .byte 0x11 ; DW_CFA_offset_extended_sf + .byte 0x41 ; uleb128 0x41 + .byte 0x7e ; sleb128 -2 + .align LOG2_GPR_BYTES + +LEFDE1: +.data + .align LOG2_GPR_BYTES +LDFCM0: +.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 + .align LOG2_GPR_BYTES + +Lffi_closure_helper_DARWIN$stub: + .indirect_symbol _ffi_closure_helper_DARWIN + mflr r0 + bcl 20,31,LO$ffi_closure_helper_DARWIN + +LO$ffi_closure_helper_DARWIN: + mflr r11 + addis r11,r11,ha16(L_ffi_closure_helper_DARWIN$lazy_ptr - LO$ffi_closure_helper_DARWIN) + mtlr r0 + lgu r12,lo16(L_ffi_closure_helper_DARWIN$lazy_ptr - LO$ffi_closure_helper_DARWIN)(r11) + mtctr r12 + bctr + +.lazy_symbol_pointer +L_ffi_closure_helper_DARWIN$lazy_ptr: + .indirect_symbol _ffi_closure_helper_DARWIN + .g_long dyld_stub_binding_helper + + +#endif // __ppc__ diff -r -u ./Modules/_ctypes/libffi_osx/powerpc/ppc-ffi_darwin.c ./Modules/_ctypes/libffi_osx/powerpc/ppc-ffi_darwin.c new file mode 100644 index 0000000..8953d5f --- /dev/null +++ ./Modules/_ctypes/libffi_osx/powerpc/ppc-ffi_darwin.c @@ -0,0 +1,1776 @@ +#if defined(__ppc__) || defined(__ppc64__) + +/* ----------------------------------------------------------------------- + ffi.c - Copyright (c) 1998 Geoffrey Keating + + PowerPC Foreign Function Interface + + Darwin ABI support (c) 2001 John Hornkvist + AIX ABI support (c) 2002 Free Software Foundation, Inc. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#include +#include + +#include +#include +#include +#include +#include + +#if 0 +#if defined(POWERPC_DARWIN) +#include // for sys_icache_invalidate() +#endif + +#else + +#pragma weak sys_icache_invalidate +extern void sys_icache_invalidate(void *start, size_t len); + +#endif + + +extern void ffi_closure_ASM(void); + +// The layout of a function descriptor. A C function pointer really +// points to one of these. +typedef struct aix_fd_struct { + void* code_pointer; + void* toc; +} aix_fd; + +/* ffi_prep_args is called by the assembly routine once stack space + has been allocated for the function's arguments. + + The stack layout we want looks like this: + + | Return address from ffi_call_DARWIN | higher addresses + |--------------------------------------------| + | Previous backchain pointer 4/8 | stack pointer here + |--------------------------------------------|-\ <<< on entry to + | Saved r28-r31 (4/8)*4 | | ffi_call_DARWIN + |--------------------------------------------| | + | Parameters (at least 8*(4/8)=32/64) | | (176) +112 - +288 + |--------------------------------------------| | + | Space for GPR2 4/8 | | + |--------------------------------------------| | stack | + | Reserved (4/8)*2 | | grows | + |--------------------------------------------| | down V + | Space for callee's LR 4/8 | | + |--------------------------------------------| | lower addresses + | Saved CR 4/8 | | + |--------------------------------------------| | stack pointer here + | Current backchain pointer 4/8 | | during + |--------------------------------------------|-/ <<< ffi_call_DARWIN + + Note: ppc64 CR is saved in the low word of a long on the stack. +*/ + +/*@-exportheader@*/ +void +ffi_prep_args( + extended_cif* inEcif, + unsigned *const stack) +/*@=exportheader@*/ +{ + /* Copy the ecif to a local var so we can trample the arg. + BC note: test this with GP later for possible problems... */ + volatile extended_cif* ecif = inEcif; + + const unsigned bytes = ecif->cif->bytes; + const unsigned flags = ecif->cif->flags; + + /* Cast the stack arg from int* to long*. sizeof(long) == 4 in 32-bit mode + and 8 in 64-bit mode. */ + unsigned long *const longStack = (unsigned long *const)stack; + + /* 'stacktop' points at the previous backchain pointer. */ +#if defined(__ppc64__) + // In ppc-darwin.s, an extra 96 bytes is reserved for the linkage area, + // saved registers, and an extra FPR. + unsigned long *const stacktop = + (unsigned long *)(unsigned long)((char*)longStack + bytes + 96); +#elif defined(__ppc__) + unsigned long *const stacktop = longStack + (bytes / sizeof(long)); +#else +#error undefined architecture +#endif + + /* 'fpr_base' points at the space for fpr1, and grows upwards as + we use FPR registers. */ + double* fpr_base = (double*)(stacktop - ASM_NEEDS_REGISTERS) - + NUM_FPR_ARG_REGISTERS; + +#if defined(__ppc64__) + // 64-bit saves an extra register, and uses an extra FPR. Knock fpr_base + // down a couple pegs. + fpr_base -= 2; +#endif + + unsigned int fparg_count = 0; + + /* 'next_arg' grows up as we put parameters in it. */ + unsigned long* next_arg = longStack + 6; /* 6 reserved positions. */ + + int i; + double double_tmp; + void** p_argv = ecif->avalue; + unsigned long gprvalue; + ffi_type** ptr = ecif->cif->arg_types; + + /* Check that everything starts aligned properly. */ + FFI_ASSERT(stack == SF_ROUND(stack)); + FFI_ASSERT(stacktop == SF_ROUND(stacktop)); + FFI_ASSERT(bytes == SF_ROUND(bytes)); + + /* Deal with return values that are actually pass-by-reference. + Rule: + Return values are referenced by r3, so r4 is the first parameter. */ + + if (flags & FLAG_RETVAL_REFERENCE) + *next_arg++ = (unsigned long)(char*)ecif->rvalue; + + /* Now for the arguments. */ + for (i = ecif->cif->nargs; i > 0; i--, ptr++, p_argv++) + { + switch ((*ptr)->type) + { + /* If a floating-point parameter appears before all of the general- + purpose registers are filled, the corresponding GPRs that match + the size of the floating-point parameter are shadowed for the + benefit of vararg and pre-ANSI functions. */ + case FFI_TYPE_FLOAT: + double_tmp = *(float*)*p_argv; + + if (fparg_count < NUM_FPR_ARG_REGISTERS) + *fpr_base++ = double_tmp; + + *(double*)next_arg = double_tmp; + + next_arg++; + fparg_count++; + FFI_ASSERT(flags & FLAG_FP_ARGUMENTS); + + break; + + case FFI_TYPE_DOUBLE: + double_tmp = *(double*)*p_argv; + + if (fparg_count < NUM_FPR_ARG_REGISTERS) + *fpr_base++ = double_tmp; + + *(double*)next_arg = double_tmp; + + next_arg += MODE_CHOICE(2,1); + fparg_count++; + FFI_ASSERT(flags & FLAG_FP_ARGUMENTS); + + break; + +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + case FFI_TYPE_LONGDOUBLE: +#if defined(__ppc64__) + if (fparg_count < NUM_FPR_ARG_REGISTERS) + *(long double*)fpr_base = *(long double*)*p_argv; +#elif defined(__ppc__) + if (fparg_count < NUM_FPR_ARG_REGISTERS - 1) + *(long double*)fpr_base = *(long double*)*p_argv; + else if (fparg_count == NUM_FPR_ARG_REGISTERS - 1) + *(double*)fpr_base = *(double*)*p_argv; +#else +#error undefined architecture +#endif + + *(long double*)next_arg = *(long double*)*p_argv; + fparg_count += 2; + fpr_base += 2; + next_arg += MODE_CHOICE(4,2); + FFI_ASSERT(flags & FLAG_FP_ARGUMENTS); + + break; +#endif // FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: +#if defined(__ppc64__) + gprvalue = *(long long*)*p_argv; + goto putgpr; +#elif defined(__ppc__) + *(long long*)next_arg = *(long long*)*p_argv; + next_arg += 2; + break; +#else +#error undefined architecture +#endif + + case FFI_TYPE_POINTER: + gprvalue = *(unsigned long*)*p_argv; + goto putgpr; + + case FFI_TYPE_UINT8: + gprvalue = *(unsigned char*)*p_argv; + goto putgpr; + + case FFI_TYPE_SINT8: + gprvalue = *(signed char*)*p_argv; + goto putgpr; + + case FFI_TYPE_UINT16: + gprvalue = *(unsigned short*)*p_argv; + goto putgpr; + + case FFI_TYPE_SINT16: + gprvalue = *(signed short*)*p_argv; + goto putgpr; + + case FFI_TYPE_STRUCT: + { +#if defined(__ppc64__) + unsigned int gprSize = 0; + unsigned int fprSize = 0; + + ffi64_struct_to_reg_form(*ptr, (char*)*p_argv, NULL, &fparg_count, + (char*)next_arg, &gprSize, (char*)fpr_base, &fprSize); + next_arg += gprSize / sizeof(long); + fpr_base += fprSize / sizeof(double); + +#elif defined(__ppc__) + char* dest_cpy = (char*)next_arg; + + /* Structures that match the basic modes (QI 1 byte, HI 2 bytes, + SI 4 bytes) are aligned as if they were those modes. + Structures with 3 byte in size are padded upwards. */ + unsigned size_al = (*ptr)->size; + + /* If the first member of the struct is a double, then align + the struct to double-word. */ + if ((*ptr)->elements[0]->type == FFI_TYPE_DOUBLE) + size_al = ALIGN((*ptr)->size, 8); + + if (ecif->cif->abi == FFI_DARWIN) + { + if (size_al < 3) + dest_cpy += 4 - size_al; + } + + memcpy((char*)dest_cpy, (char*)*p_argv, size_al); + next_arg += (size_al + 3) / 4; +#else +#error undefined architecture +#endif + break; + } + + case FFI_TYPE_INT: + case FFI_TYPE_UINT32: + case FFI_TYPE_SINT32: + gprvalue = *(unsigned*)*p_argv; + +putgpr: + *next_arg++ = gprvalue; + break; + + default: + break; + } + } + + /* Check that we didn't overrun the stack... */ + //FFI_ASSERT(gpr_base <= stacktop - ASM_NEEDS_REGISTERS); + //FFI_ASSERT((unsigned *)fpr_base + // <= stacktop - ASM_NEEDS_REGISTERS - NUM_GPR_ARG_REGISTERS); + //FFI_ASSERT(flags & FLAG_4_GPR_ARGUMENTS || intarg_count <= 4); +} + +#if defined(__ppc64__) + +bool +ffi64_struct_contains_fp( + const ffi_type* inType) +{ + bool containsFP = false; + unsigned int i; + + for (i = 0; inType->elements[i] != NULL && !containsFP; i++) + { + if (inType->elements[i]->type == FFI_TYPE_FLOAT || + inType->elements[i]->type == FFI_TYPE_DOUBLE || + inType->elements[i]->type == FFI_TYPE_LONGDOUBLE) + containsFP = true; + else if (inType->elements[i]->type == FFI_TYPE_STRUCT) + containsFP = ffi64_struct_contains_fp(inType->elements[i]); + } + + return containsFP; +} + +#endif // defined(__ppc64__) + +/* Perform machine dependent cif processing. */ +ffi_status +ffi_prep_cif_machdep( + ffi_cif* cif) +{ + /* All this is for the DARWIN ABI. */ + int i; + ffi_type** ptr; + int intarg_count = 0; + int fparg_count = 0; + unsigned int flags = 0; + unsigned int size_al = 0; + + /* All the machine-independent calculation of cif->bytes will be wrong. + Redo the calculation for DARWIN. */ + + /* Space for the frame pointer, callee's LR, CR, etc, and for + the asm's temp regs. */ + unsigned int bytes = (6 + ASM_NEEDS_REGISTERS) * sizeof(long); + + /* Return value handling. The rules are as follows: + - 32-bit (or less) integer values are returned in gpr3; + - Structures of size <= 4 bytes also returned in gpr3; + - 64-bit integer values and structures between 5 and 8 bytes are + returned in gpr3 and gpr4; + - Single/double FP values are returned in fpr1; + - Long double FP (if not equivalent to double) values are returned in + fpr1 and fpr2; + - Larger structures values are allocated space and a pointer is passed + as the first argument. */ + switch (cif->rtype->type) + { +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + case FFI_TYPE_LONGDOUBLE: + flags |= FLAG_RETURNS_128BITS; + flags |= FLAG_RETURNS_FP; + break; +#endif // FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + + case FFI_TYPE_DOUBLE: + flags |= FLAG_RETURNS_64BITS; + /* Fall through. */ + case FFI_TYPE_FLOAT: + flags |= FLAG_RETURNS_FP; + break; + +#if defined(__ppc64__) + case FFI_TYPE_POINTER: +#endif + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + flags |= FLAG_RETURNS_64BITS; + break; + + case FFI_TYPE_STRUCT: + { +#if defined(__ppc64__) + + if (ffi64_stret_needs_ptr(cif->rtype, NULL, NULL)) + { + flags |= FLAG_RETVAL_REFERENCE; + flags |= FLAG_RETURNS_NOTHING; + intarg_count++; + } + else + { + flags |= FLAG_RETURNS_STRUCT; + + if (ffi64_struct_contains_fp(cif->rtype)) + flags |= FLAG_STRUCT_CONTAINS_FP; + } + +#elif defined(__ppc__) + + flags |= FLAG_RETVAL_REFERENCE; + flags |= FLAG_RETURNS_NOTHING; + intarg_count++; + +#else +#error undefined architecture +#endif + break; + } + + case FFI_TYPE_VOID: + flags |= FLAG_RETURNS_NOTHING; + break; + + default: + /* Returns 32-bit integer, or similar. Nothing to do here. */ + break; + } + + /* The first NUM_GPR_ARG_REGISTERS words of integer arguments, and the + first NUM_FPR_ARG_REGISTERS fp arguments, go in registers; the rest + goes on the stack. Structures are passed as a pointer to a copy of + the structure. Stuff on the stack needs to keep proper alignment. */ + for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++) + { + switch ((*ptr)->type) + { + case FFI_TYPE_FLOAT: + case FFI_TYPE_DOUBLE: + fparg_count++; + /* If this FP arg is going on the stack, it must be + 8-byte-aligned. */ + if (fparg_count > NUM_FPR_ARG_REGISTERS + && intarg_count % 2 != 0) + intarg_count++; + break; + +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + case FFI_TYPE_LONGDOUBLE: + fparg_count += 2; + /* If this FP arg is going on the stack, it must be + 8-byte-aligned. */ + + if ( +#if defined(__ppc64__) + fparg_count > NUM_FPR_ARG_REGISTERS + 1 +#elif defined(__ppc__) + fparg_count > NUM_FPR_ARG_REGISTERS +#else +#error undefined architecture +#endif + && intarg_count % 2 != 0) + intarg_count++; + + intarg_count += 2; + break; +#endif // FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + /* 'long long' arguments are passed as two words, but + either both words must fit in registers or both go + on the stack. If they go on the stack, they must + be 8-byte-aligned. */ + if (intarg_count == NUM_GPR_ARG_REGISTERS - 1 + || (intarg_count >= NUM_GPR_ARG_REGISTERS + && intarg_count % 2 != 0)) + intarg_count++; + + intarg_count += MODE_CHOICE(2,1); + + break; + + case FFI_TYPE_STRUCT: + size_al = (*ptr)->size; + /* If the first member of the struct is a double, then align + the struct to double-word. */ + if ((*ptr)->elements[0]->type == FFI_TYPE_DOUBLE) + size_al = ALIGN((*ptr)->size, 8); + +#if defined(__ppc64__) + // Look for FP struct members. + unsigned int j; + + for (j = 0; (*ptr)->elements[j] != NULL; j++) + { + if ((*ptr)->elements[j]->type == FFI_TYPE_FLOAT || + (*ptr)->elements[j]->type == FFI_TYPE_DOUBLE) + { + fparg_count++; + + if (fparg_count > NUM_FPR_ARG_REGISTERS) + intarg_count++; + } + else if ((*ptr)->elements[j]->type == FFI_TYPE_LONGDOUBLE) + { + fparg_count += 2; + + if (fparg_count > NUM_FPR_ARG_REGISTERS + 1) + intarg_count += 2; + } + else + intarg_count++; + } +#elif defined(__ppc__) + intarg_count += (size_al + 3) / 4; +#else +#error undefined architecture +#endif + + break; + + default: + /* Everything else is passed as a 4/8-byte word in a GPR, either + the object itself or a pointer to it. */ + intarg_count++; + break; + } + } + + /* Space for the FPR registers, if needed. */ + if (fparg_count != 0) + { + flags |= FLAG_FP_ARGUMENTS; +#if defined(__ppc64__) + bytes += (NUM_FPR_ARG_REGISTERS + 1) * sizeof(double); +#elif defined(__ppc__) + bytes += NUM_FPR_ARG_REGISTERS * sizeof(double); +#else +#error undefined architecture +#endif + } + + /* Stack space. */ +#if defined(__ppc64__) + if ((intarg_count + fparg_count) > NUM_GPR_ARG_REGISTERS) + bytes += (intarg_count + fparg_count) * sizeof(long); +#elif defined(__ppc__) + if ((intarg_count + 2 * fparg_count) > NUM_GPR_ARG_REGISTERS) + bytes += (intarg_count + 2 * fparg_count) * sizeof(long); +#else +#error undefined architecture +#endif + else + bytes += NUM_GPR_ARG_REGISTERS * sizeof(long); + + /* The stack space allocated needs to be a multiple of 16/32 bytes. */ + bytes = SF_ROUND(bytes); + + cif->flags = flags; + cif->bytes = bytes; + + return FFI_OK; +} + +/*@-declundef@*/ +/*@-exportheader@*/ +extern void +ffi_call_AIX( +/*@out@*/ extended_cif*, + unsigned, + unsigned, +/*@out@*/ unsigned*, + void (*fn)(void), + void (*fn2)(extended_cif*, unsigned *const)); + +extern void +ffi_call_DARWIN( +/*@out@*/ extended_cif*, + unsigned long, + unsigned, +/*@out@*/ unsigned*, + void (*fn)(void), + void (*fn2)(extended_cif*, unsigned *const)); +/*@=declundef@*/ +/*@=exportheader@*/ + +void +ffi_call( +/*@dependent@*/ ffi_cif* cif, + void (*fn)(void), +/*@out@*/ void* rvalue, +/*@dependent@*/ void** avalue) +{ + extended_cif ecif; + + ecif.cif = cif; + ecif.avalue = avalue; + + /* If the return value is a struct and we don't have a return + value address then we need to make one. */ + if ((rvalue == NULL) && + (cif->rtype->type == FFI_TYPE_STRUCT)) + { + /*@-sysunrecog@*/ + ecif.rvalue = alloca(cif->rtype->size); + /*@=sysunrecog@*/ + } + else + ecif.rvalue = rvalue; + + switch (cif->abi) + { + case FFI_AIX: + /*@-usedef@*/ + ffi_call_AIX(&ecif, -cif->bytes, + cif->flags, ecif.rvalue, fn, ffi_prep_args); + /*@=usedef@*/ + break; + + case FFI_DARWIN: + /*@-usedef@*/ + ffi_call_DARWIN(&ecif, -(long)cif->bytes, + cif->flags, ecif.rvalue, fn, ffi_prep_args); + /*@=usedef@*/ + break; + + default: + FFI_ASSERT(0); + break; + } +} + +/* here I'd like to add the stack frame layout we use in darwin_closure.S + and aix_clsoure.S + + SP previous -> +---------------------------------------+ <--- child frame + | back chain to caller 4 | + +---------------------------------------+ 4 + | saved CR 4 | + +---------------------------------------+ 8 + | saved LR 4 | + +---------------------------------------+ 12 + | reserved for compilers 4 | + +---------------------------------------+ 16 + | reserved for binders 4 | + +---------------------------------------+ 20 + | saved TOC pointer 4 | + +---------------------------------------+ 24 + | always reserved 8*4=32 (previous GPRs)| + | according to the linkage convention | + | from AIX | + +---------------------------------------+ 56 + | our FPR area 13*8=104 | + | f1 | + | . | + | f13 | + +---------------------------------------+ 160 + | result area 8 | + +---------------------------------------+ 168 + | alignement to the next multiple of 16 | +SP current --> +---------------------------------------+ 176 <- parent frame + | back chain to caller 4 | + +---------------------------------------+ 180 + | saved CR 4 | + +---------------------------------------+ 184 + | saved LR 4 | + +---------------------------------------+ 188 + | reserved for compilers 4 | + +---------------------------------------+ 192 + | reserved for binders 4 | + +---------------------------------------+ 196 + | saved TOC pointer 4 | + +---------------------------------------+ 200 + | always reserved 8*4=32 we store our | + | GPRs here | + | r3 | + | . | + | r10 | + +---------------------------------------+ 232 + | overflow part | + +---------------------------------------+ xxx + | ???? | + +---------------------------------------+ xxx +*/ + +#if !defined(POWERPC_DARWIN) + +#define MIN_LINE_SIZE 32 + +static void +flush_icache( + char* addr) +{ +#ifndef _AIX + __asm__ volatile ( + "dcbf 0,%0\n" + "sync\n" + "icbi 0,%0\n" + "sync\n" + "isync" + : : "r" (addr) : "memory"); +#endif +} + +static void +flush_range( + char* addr, + int size) +{ + int i; + + for (i = 0; i < size; i += MIN_LINE_SIZE) + flush_icache(addr + i); + + flush_icache(addr + size - 1); +} + +#endif // !defined(POWERPC_DARWIN) + +ffi_status +ffi_prep_closure( + ffi_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif*, void*, void**, void*), + void* user_data) +{ + switch (cif->abi) + { + case FFI_DARWIN: + { + FFI_ASSERT (cif->abi == FFI_DARWIN); + + unsigned int* tramp = (unsigned int*)&closure->tramp[0]; + +#if defined(__ppc64__) + tramp[0] = 0x7c0802a6; // mflr r0 + tramp[1] = 0x429f0005; // bcl 20,31,+0x8 + tramp[2] = 0x7d6802a6; // mflr r11 + tramp[3] = 0x7c0803a6; // mtlr r0 + tramp[4] = 0xe98b0018; // ld r12,24(r11) + tramp[5] = 0x7d8903a6; // mtctr r12 + tramp[6] = 0xe96b0020; // ld r11,32(r11) + tramp[7] = 0x4e800420; // bctr + *(unsigned long*)&tramp[8] = (unsigned long)ffi_closure_ASM; + *(unsigned long*)&tramp[10] = (unsigned long)closure; +#elif defined(__ppc__) + tramp[0] = 0x7c0802a6; // mflr r0 + tramp[1] = 0x429f0005; // bcl 20,31,+0x8 + tramp[2] = 0x7d6802a6; // mflr r11 + tramp[3] = 0x7c0803a6; // mtlr r0 + tramp[4] = 0x818b0018; // lwz r12,24(r11) + tramp[5] = 0x7d8903a6; // mtctr r12 + tramp[6] = 0x816b001c; // lwz r11,28(r11) + tramp[7] = 0x4e800420; // bctr + tramp[8] = (unsigned long)ffi_closure_ASM; + tramp[9] = (unsigned long)closure; +#else +#error undefined architecture +#endif + + closure->cif = cif; + closure->fun = fun; + closure->user_data = user_data; + + // Flush the icache. Only necessary on Darwin. +#if defined(POWERPC_DARWIN) + sys_icache_invalidate(closure->tramp, FFI_TRAMPOLINE_SIZE); +#else + flush_range(closure->tramp, FFI_TRAMPOLINE_SIZE); +#endif + + break; + } + + case FFI_AIX: + { + FFI_ASSERT (cif->abi == FFI_AIX); + + ffi_aix_trampoline_struct* tramp_aix = + (ffi_aix_trampoline_struct*)(closure->tramp); + aix_fd* fd = (aix_fd*)(void*)ffi_closure_ASM; + + tramp_aix->code_pointer = fd->code_pointer; + tramp_aix->toc = fd->toc; + tramp_aix->static_chain = closure; + closure->cif = cif; + closure->fun = fun; + closure->user_data = user_data; + break; + } + + default: + return FFI_BAD_ABI; + } + + return FFI_OK; +} + +#if defined(__ppc__) + typedef double ldbits[2]; + + typedef union + { + ldbits lb; + long double ld; + } ldu; +#endif + +typedef union +{ + float f; + double d; +} ffi_dblfl; + +/* The trampoline invokes ffi_closure_ASM, and on entry, r11 holds the + address of the closure. After storing the registers that could possibly + contain parameters to be passed into the stack frame and setting up space + for a return value, ffi_closure_ASM invokes the following helper function + to do most of the work. */ +int +ffi_closure_helper_DARWIN( + ffi_closure* closure, + void* rvalue, + unsigned long* pgr, + ffi_dblfl* pfr) +{ + /* rvalue is the pointer to space for return value in closure assembly + pgr is the pointer to where r3-r10 are stored in ffi_closure_ASM + pfr is the pointer to where f1-f13 are stored in ffi_closure_ASM. */ + +#if defined(__ppc__) + ldu temp_ld; +#endif + + double temp; + unsigned int i; + unsigned int nf = 0; /* number of FPRs already used. */ + unsigned int ng = 0; /* number of GPRs already used. */ + ffi_cif* cif = closure->cif; + long avn = cif->nargs; + void** avalue = alloca(cif->nargs * sizeof(void*)); + ffi_type** arg_types = cif->arg_types; + + /* Copy the caller's structure return value address so that the closure + returns the data directly to the caller. */ +#if defined(__ppc64__) + if (cif->rtype->type == FFI_TYPE_STRUCT && + ffi64_stret_needs_ptr(cif->rtype, NULL, NULL)) +#elif defined(__ppc__) + if (cif->rtype->type == FFI_TYPE_STRUCT) +#else +#error undefined architecture +#endif + { + rvalue = (void*)*pgr; + pgr++; + ng++; + } + + /* Grab the addresses of the arguments from the stack frame. */ + for (i = 0; i < avn; i++) + { + switch (arg_types[i]->type) + { + case FFI_TYPE_SINT8: + case FFI_TYPE_UINT8: + avalue[i] = (char*)pgr + MODE_CHOICE(3,7); + ng++; + pgr++; + break; + + case FFI_TYPE_SINT16: + case FFI_TYPE_UINT16: + avalue[i] = (char*)pgr + MODE_CHOICE(2,6); + ng++; + pgr++; + break; + +#if defined(__ppc__) + case FFI_TYPE_POINTER: +#endif + case FFI_TYPE_SINT32: + case FFI_TYPE_UINT32: + avalue[i] = (char*)pgr + MODE_CHOICE(0,4); + ng++; + pgr++; + + break; + + case FFI_TYPE_STRUCT: + if (cif->abi == FFI_DARWIN) + { +#if defined(__ppc64__) + unsigned int gprSize = 0; + unsigned int fprSize = 0; + unsigned int savedFPRSize = fprSize; + + avalue[i] = alloca(arg_types[i]->size); + ffi64_struct_to_ram_form(arg_types[i], (const char*)pgr, + &gprSize, (const char*)pfr, &fprSize, &nf, avalue[i], NULL); + + ng += gprSize / sizeof(long); + pgr += gprSize / sizeof(long); + pfr += (fprSize - savedFPRSize) / sizeof(double); + +#elif defined(__ppc__) + /* Structures that match the basic modes (QI 1 byte, HI 2 bytes, + SI 4 bytes) are aligned as if they were those modes. */ + unsigned int size_al = size_al = arg_types[i]->size; + + /* If the first member of the struct is a double, then align + the struct to double-word. */ + if (arg_types[i]->elements[0]->type == FFI_TYPE_DOUBLE) + size_al = ALIGN(arg_types[i]->size, 8); + + if (size_al < 3) + avalue[i] = (void*)pgr + MODE_CHOICE(4,8) - size_al; + else + avalue[i] = (void*)pgr; + + ng += (size_al + 3) / sizeof(long); + pgr += (size_al + 3) / sizeof(long); +#else +#error undefined architecture +#endif + } + + break; + +#if defined(__ppc64__) + case FFI_TYPE_POINTER: +#endif + case FFI_TYPE_SINT64: + case FFI_TYPE_UINT64: + /* Long long ints are passed in 1 or 2 GPRs. */ + avalue[i] = pgr; + ng += MODE_CHOICE(2,1); + pgr += MODE_CHOICE(2,1); + + break; + + case FFI_TYPE_FLOAT: + /* A float value consumes a GPR. + There are 13 64-bit floating point registers. */ + if (nf < NUM_FPR_ARG_REGISTERS) + { + temp = pfr->d; + pfr->f = (float)temp; + avalue[i] = pfr; + pfr++; + } + else + avalue[i] = pgr; + + nf++; + ng++; + pgr++; + break; + + case FFI_TYPE_DOUBLE: + /* A double value consumes one or two GPRs. + There are 13 64bit floating point registers. */ + if (nf < NUM_FPR_ARG_REGISTERS) + { + avalue[i] = pfr; + pfr++; + } + else + avalue[i] = pgr; + + nf++; + ng += MODE_CHOICE(2,1); + pgr += MODE_CHOICE(2,1); + + break; + +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + + case FFI_TYPE_LONGDOUBLE: +#if defined(__ppc64__) + if (nf < NUM_FPR_ARG_REGISTERS) + { + avalue[i] = pfr; + pfr += 2; + } +#elif defined(__ppc__) + /* A long double value consumes 2/4 GPRs and 2 FPRs. + There are 13 64bit floating point registers. */ + if (nf < NUM_FPR_ARG_REGISTERS - 1) + { + avalue[i] = pfr; + pfr += 2; + } + /* Here we have the situation where one part of the long double + is stored in fpr13 and the other part is already on the stack. + We use a union to pass the long double to avalue[i]. */ + else if (nf == NUM_FPR_ARG_REGISTERS - 1) + { + memcpy (&temp_ld.lb[0], pfr, sizeof(temp_ld.lb[0])); + memcpy (&temp_ld.lb[1], pgr + 2, sizeof(temp_ld.lb[1])); + avalue[i] = &temp_ld.ld; + } +#else +#error undefined architecture +#endif + else + avalue[i] = pgr; + + nf += 2; + ng += MODE_CHOICE(4,2); + pgr += MODE_CHOICE(4,2); + + break; + +#endif /* FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE */ + + default: + FFI_ASSERT(0); + break; + } + } + + (closure->fun)(cif, rvalue, avalue, closure->user_data); + + /* Tell ffi_closure_ASM to perform return type promotions. */ + return cif->rtype->type; +} + +#if defined(__ppc64__) + +/* ffi64_struct_to_ram_form + + Rebuild a struct's natural layout from buffers of concatenated registers. + Return the number of registers used. + inGPRs[0-7] == r3, inFPRs[0-7] == f1 ... +*/ +void +ffi64_struct_to_ram_form( + const ffi_type* inType, + const char* inGPRs, + unsigned int* ioGPRMarker, + const char* inFPRs, + unsigned int* ioFPRMarker, + unsigned int* ioFPRsUsed, + char* outStruct, // caller-allocated + unsigned int* ioStructMarker) +{ + unsigned int srcGMarker = 0; + unsigned int srcFMarker = 0; + unsigned int savedFMarker = 0; + unsigned int fprsUsed = 0; + unsigned int savedFPRsUsed = 0; + unsigned int destMarker = 0; + + static unsigned int recurseCount = 0; + + if (ioGPRMarker) + srcGMarker = *ioGPRMarker; + + if (ioFPRMarker) + { + srcFMarker = *ioFPRMarker; + savedFMarker = srcFMarker; + } + + if (ioFPRsUsed) + { + fprsUsed = *ioFPRsUsed; + savedFPRsUsed = fprsUsed; + } + + if (ioStructMarker) + destMarker = *ioStructMarker; + + size_t i; + + switch (inType->size) + { + case 1: case 2: case 4: + srcGMarker += 8 - inType->size; + break; + + default: + break; + } + + for (i = 0; inType->elements[i] != NULL; i++) + { + switch (inType->elements[i]->type) + { + case FFI_TYPE_FLOAT: + srcFMarker = ALIGN(srcFMarker, 4); + srcGMarker = ALIGN(srcGMarker, 4); + destMarker = ALIGN(destMarker, 4); + + if (fprsUsed < NUM_FPR_ARG_REGISTERS) + { + *(float*)&outStruct[destMarker] = + (float)*(double*)&inFPRs[srcFMarker]; + srcFMarker += 8; + fprsUsed++; + } + else + *(float*)&outStruct[destMarker] = + (float)*(double*)&inGPRs[srcGMarker]; + + srcGMarker += 4; + destMarker += 4; + + // Skip to next GPR if next element won't fit and we're + // not already at a register boundary. + if (inType->elements[i + 1] != NULL && (destMarker % 8)) + { + if (!FFI_TYPE_1_BYTE(inType->elements[i + 1]->type) && + (!FFI_TYPE_2_BYTE(inType->elements[i + 1]->type) || + (ALIGN(srcGMarker, 8) - srcGMarker) < 2) && + (!FFI_TYPE_4_BYTE(inType->elements[i + 1]->type) || + (ALIGN(srcGMarker, 8) - srcGMarker) < 4)) + srcGMarker = ALIGN(srcGMarker, 8); + } + + break; + + case FFI_TYPE_DOUBLE: + srcFMarker = ALIGN(srcFMarker, 8); + destMarker = ALIGN(destMarker, 8); + + if (fprsUsed < NUM_FPR_ARG_REGISTERS) + { + *(double*)&outStruct[destMarker] = + *(double*)&inFPRs[srcFMarker]; + srcFMarker += 8; + fprsUsed++; + } + else + *(double*)&outStruct[destMarker] = + *(double*)&inGPRs[srcGMarker]; + + destMarker += 8; + + // Skip next GPR + srcGMarker += 8; + srcGMarker = ALIGN(srcGMarker, 8); + + break; + + case FFI_TYPE_LONGDOUBLE: + destMarker = ALIGN(destMarker, 16); + + if (fprsUsed < NUM_FPR_ARG_REGISTERS) + { + srcFMarker = ALIGN(srcFMarker, 8); + srcGMarker = ALIGN(srcGMarker, 8); + *(long double*)&outStruct[destMarker] = + *(long double*)&inFPRs[srcFMarker]; + srcFMarker += 16; + fprsUsed += 2; + } + else + { + srcFMarker = ALIGN(srcFMarker, 16); + srcGMarker = ALIGN(srcGMarker, 16); + *(long double*)&outStruct[destMarker] = + *(long double*)&inGPRs[srcGMarker]; + } + + destMarker += 16; + + // Skip next 2 GPRs + srcGMarker += 16; + srcGMarker = ALIGN(srcGMarker, 8); + + break; + + case FFI_TYPE_UINT8: + case FFI_TYPE_SINT8: + { + if (inType->alignment == 1) // chars only + { + if (inType->size == 1) + outStruct[destMarker++] = inGPRs[srcGMarker++]; + else if (inType->size == 2) + { + outStruct[destMarker++] = inGPRs[srcGMarker++]; + outStruct[destMarker++] = inGPRs[srcGMarker++]; + i++; + } + else + { + memcpy(&outStruct[destMarker], + &inGPRs[srcGMarker], inType->size); + srcGMarker += inType->size; + destMarker += inType->size; + i += inType->size - 1; + } + } + else // chars and other stuff + { + outStruct[destMarker++] = inGPRs[srcGMarker++]; + + // Skip to next GPR if next element won't fit and we're + // not already at a register boundary. + if (inType->elements[i + 1] != NULL && (srcGMarker % 8)) + { + if (!FFI_TYPE_1_BYTE(inType->elements[i + 1]->type) && + (!FFI_TYPE_2_BYTE(inType->elements[i + 1]->type) || + (ALIGN(srcGMarker, 8) - srcGMarker) < 2) && + (!FFI_TYPE_4_BYTE(inType->elements[i + 1]->type) || + (ALIGN(srcGMarker, 8) - srcGMarker) < 4)) + srcGMarker = ALIGN(srcGMarker, inType->alignment); // was 8 + } + } + + break; + } + + case FFI_TYPE_UINT16: + case FFI_TYPE_SINT16: + srcGMarker = ALIGN(srcGMarker, 2); + destMarker = ALIGN(destMarker, 2); + + *(short*)&outStruct[destMarker] = + *(short*)&inGPRs[srcGMarker]; + srcGMarker += 2; + destMarker += 2; + + break; + + case FFI_TYPE_INT: + case FFI_TYPE_UINT32: + case FFI_TYPE_SINT32: + srcGMarker = ALIGN(srcGMarker, 4); + destMarker = ALIGN(destMarker, 4); + + *(int*)&outStruct[destMarker] = + *(int*)&inGPRs[srcGMarker]; + srcGMarker += 4; + destMarker += 4; + + break; + + case FFI_TYPE_POINTER: + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + srcGMarker = ALIGN(srcGMarker, 8); + destMarker = ALIGN(destMarker, 8); + + *(long long*)&outStruct[destMarker] = + *(long long*)&inGPRs[srcGMarker]; + srcGMarker += 8; + destMarker += 8; + + break; + + case FFI_TYPE_STRUCT: + recurseCount++; + ffi64_struct_to_ram_form(inType->elements[i], inGPRs, + &srcGMarker, inFPRs, &srcFMarker, &fprsUsed, + outStruct, &destMarker); + recurseCount--; + break; + + default: + FFI_ASSERT(0); // unknown element type + break; + } + } + + srcGMarker = ALIGN(srcGMarker, inType->alignment); + + // Take care of the special case for 16-byte structs, but not for + // nested structs. + if (recurseCount == 0 && srcGMarker == 16) + { + *(long double*)&outStruct[0] = *(long double*)&inGPRs[0]; + srcFMarker = savedFMarker; + fprsUsed = savedFPRsUsed; + } + + if (ioGPRMarker) + *ioGPRMarker = ALIGN(srcGMarker, 8); + + if (ioFPRMarker) + *ioFPRMarker = srcFMarker; + + if (ioFPRsUsed) + *ioFPRsUsed = fprsUsed; + + if (ioStructMarker) + *ioStructMarker = ALIGN(destMarker, 8); +} + +/* ffi64_struct_to_reg_form + + Copy a struct's elements into buffers that can be sliced into registers. + Return the sizes of the output buffers in bytes. Pass NULL buffer pointers + to calculate size only. + outGPRs[0-7] == r3, outFPRs[0-7] == f1 ... +*/ +void +ffi64_struct_to_reg_form( + const ffi_type* inType, + const char* inStruct, + unsigned int* ioStructMarker, + unsigned int* ioFPRsUsed, + char* outGPRs, // caller-allocated + unsigned int* ioGPRSize, + char* outFPRs, // caller-allocated + unsigned int* ioFPRSize) +{ + size_t i; + unsigned int srcMarker = 0; + unsigned int destGMarker = 0; + unsigned int destFMarker = 0; + unsigned int savedFMarker = 0; + unsigned int fprsUsed = 0; + unsigned int savedFPRsUsed = 0; + + static unsigned int recurseCount = 0; + + if (ioStructMarker) + srcMarker = *ioStructMarker; + + if (ioFPRsUsed) + { + fprsUsed = *ioFPRsUsed; + savedFPRsUsed = fprsUsed; + } + + if (ioGPRSize) + destGMarker = *ioGPRSize; + + if (ioFPRSize) + { + destFMarker = *ioFPRSize; + savedFMarker = destFMarker; + } + + switch (inType->size) + { + case 1: case 2: case 4: + destGMarker += 8 - inType->size; + break; + + default: + break; + } + + for (i = 0; inType->elements[i] != NULL; i++) + { + switch (inType->elements[i]->type) + { + // Shadow floating-point types in GPRs for vararg and pre-ANSI + // functions. + case FFI_TYPE_FLOAT: + // Nudge markers to next 4/8-byte boundary + srcMarker = ALIGN(srcMarker, 4); + destGMarker = ALIGN(destGMarker, 4); + destFMarker = ALIGN(destFMarker, 8); + + if (fprsUsed < NUM_FPR_ARG_REGISTERS) + { + if (outFPRs != NULL && inStruct != NULL) + *(double*)&outFPRs[destFMarker] = + (double)*(float*)&inStruct[srcMarker]; + + destFMarker += 8; + fprsUsed++; + } + + if (outGPRs != NULL && inStruct != NULL) + *(double*)&outGPRs[destGMarker] = + (double)*(float*)&inStruct[srcMarker]; + + srcMarker += 4; + destGMarker += 4; + + // Skip to next GPR if next element won't fit and we're + // not already at a register boundary. + if (inType->elements[i + 1] != NULL && (srcMarker % 8)) + { + if (!FFI_TYPE_1_BYTE(inType->elements[i + 1]->type) && + (!FFI_TYPE_2_BYTE(inType->elements[i + 1]->type) || + (ALIGN(destGMarker, 8) - destGMarker) < 2) && + (!FFI_TYPE_4_BYTE(inType->elements[i + 1]->type) || + (ALIGN(destGMarker, 8) - destGMarker) < 4)) + destGMarker = ALIGN(destGMarker, 8); + } + + break; + + case FFI_TYPE_DOUBLE: + srcMarker = ALIGN(srcMarker, 8); + destFMarker = ALIGN(destFMarker, 8); + + if (fprsUsed < NUM_FPR_ARG_REGISTERS) + { + if (outFPRs != NULL && inStruct != NULL) + *(double*)&outFPRs[destFMarker] = + *(double*)&inStruct[srcMarker]; + + destFMarker += 8; + fprsUsed++; + } + + if (outGPRs != NULL && inStruct != NULL) + *(double*)&outGPRs[destGMarker] = + *(double*)&inStruct[srcMarker]; + + srcMarker += 8; + + // Skip next GPR + destGMarker += 8; + destGMarker = ALIGN(destGMarker, 8); + + break; + + case FFI_TYPE_LONGDOUBLE: + srcMarker = ALIGN(srcMarker, 16); + + if (fprsUsed < NUM_FPR_ARG_REGISTERS) + { + destFMarker = ALIGN(destFMarker, 8); + destGMarker = ALIGN(destGMarker, 8); + + if (outFPRs != NULL && inStruct != NULL) + *(long double*)&outFPRs[destFMarker] = + *(long double*)&inStruct[srcMarker]; + + if (outGPRs != NULL && inStruct != NULL) + *(long double*)&outGPRs[destGMarker] = + *(long double*)&inStruct[srcMarker]; + + destFMarker += 16; + fprsUsed += 2; + } + else + { + destGMarker = ALIGN(destGMarker, 16); + + if (outGPRs != NULL && inStruct != NULL) + *(long double*)&outGPRs[destGMarker] = + *(long double*)&inStruct[srcMarker]; + } + + srcMarker += 16; + destGMarker += 16; // Skip next 2 GPRs + destGMarker = ALIGN(destGMarker, 8); // was 16 + + break; + + case FFI_TYPE_UINT8: + case FFI_TYPE_SINT8: + if (inType->alignment == 1) // bytes only + { + if (inType->size == 1) + { + if (outGPRs != NULL && inStruct != NULL) + outGPRs[destGMarker] = inStruct[srcMarker]; + + srcMarker++; + destGMarker++; + } + else if (inType->size == 2) + { + if (outGPRs != NULL && inStruct != NULL) + { + outGPRs[destGMarker] = inStruct[srcMarker]; + outGPRs[destGMarker + 1] = inStruct[srcMarker + 1]; + } + + srcMarker += 2; + destGMarker += 2; + + i++; + } + else + { + if (outGPRs != NULL && inStruct != NULL) + { + // Avoid memcpy for small chunks. + if (inType->size <= sizeof(long)) + *(long*)&outGPRs[destGMarker] = + *(long*)&inStruct[srcMarker]; + else + memcpy(&outGPRs[destGMarker], + &inStruct[srcMarker], inType->size); + } + + srcMarker += inType->size; + destGMarker += inType->size; + i += inType->size - 1; + } + } + else // bytes and other stuff + { + if (outGPRs != NULL && inStruct != NULL) + outGPRs[destGMarker] = inStruct[srcMarker]; + + srcMarker++; + destGMarker++; + + // Skip to next GPR if next element won't fit and we're + // not already at a register boundary. + if (inType->elements[i + 1] != NULL && (destGMarker % 8)) + { + if (!FFI_TYPE_1_BYTE(inType->elements[i + 1]->type) && + (!FFI_TYPE_2_BYTE(inType->elements[i + 1]->type) || + (ALIGN(destGMarker, 8) - destGMarker) < 2) && + (!FFI_TYPE_4_BYTE(inType->elements[i + 1]->type) || + (ALIGN(destGMarker, 8) - destGMarker) < 4)) + destGMarker = ALIGN(destGMarker, inType->alignment); // was 8 + } + } + + break; + + case FFI_TYPE_UINT16: + case FFI_TYPE_SINT16: + srcMarker = ALIGN(srcMarker, 2); + destGMarker = ALIGN(destGMarker, 2); + + if (outGPRs != NULL && inStruct != NULL) + *(short*)&outGPRs[destGMarker] = + *(short*)&inStruct[srcMarker]; + + srcMarker += 2; + destGMarker += 2; + + if (inType->elements[i + 1] == NULL) + destGMarker = ALIGN(destGMarker, inType->alignment); + + break; + + case FFI_TYPE_INT: + case FFI_TYPE_UINT32: + case FFI_TYPE_SINT32: + srcMarker = ALIGN(srcMarker, 4); + destGMarker = ALIGN(destGMarker, 4); + + if (outGPRs != NULL && inStruct != NULL) + *(int*)&outGPRs[destGMarker] = + *(int*)&inStruct[srcMarker]; + + srcMarker += 4; + destGMarker += 4; + + break; + + case FFI_TYPE_POINTER: + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + srcMarker = ALIGN(srcMarker, 8); + destGMarker = ALIGN(destGMarker, 8); + + if (outGPRs != NULL && inStruct != NULL) + *(long long*)&outGPRs[destGMarker] = + *(long long*)&inStruct[srcMarker]; + + srcMarker += 8; + destGMarker += 8; + + if (inType->elements[i + 1] == NULL) + destGMarker = ALIGN(destGMarker, inType->alignment); + + break; + + case FFI_TYPE_STRUCT: + recurseCount++; + ffi64_struct_to_reg_form(inType->elements[i], + inStruct, &srcMarker, &fprsUsed, outGPRs, + &destGMarker, outFPRs, &destFMarker); + recurseCount--; + break; + + default: + FFI_ASSERT(0); + break; + } + } + + destGMarker = ALIGN(destGMarker, inType->alignment); + + // Take care of the special case for 16-byte structs, but not for + // nested structs. + if (recurseCount == 0 && destGMarker == 16) + { + if (outGPRs != NULL && inStruct != NULL) + *(long double*)&outGPRs[0] = *(long double*)&inStruct[0]; + + destFMarker = savedFMarker; + fprsUsed = savedFPRsUsed; + } + + if (ioStructMarker) + *ioStructMarker = ALIGN(srcMarker, 8); + + if (ioFPRsUsed) + *ioFPRsUsed = fprsUsed; + + if (ioGPRSize) + *ioGPRSize = ALIGN(destGMarker, 8); + + if (ioFPRSize) + *ioFPRSize = ALIGN(destFMarker, 8); +} + +/* ffi64_stret_needs_ptr + + Determine whether a returned struct needs a pointer in r3 or can fit + in registers. +*/ + +bool +ffi64_stret_needs_ptr( + const ffi_type* inType, + unsigned short* ioGPRCount, + unsigned short* ioFPRCount) +{ + // Obvious case first- struct is larger than combined FPR size. + if (inType->size > 14 * 8) + return true; + + // Now the struct can physically fit in registers, determine if it + // also fits logically. + bool needsPtr = false; + unsigned short gprsUsed = 0; + unsigned short fprsUsed = 0; + size_t i; + + if (ioGPRCount) + gprsUsed = *ioGPRCount; + + if (ioFPRCount) + fprsUsed = *ioFPRCount; + + for (i = 0; inType->elements[i] != NULL && !needsPtr; i++) + { + switch (inType->elements[i]->type) + { + case FFI_TYPE_FLOAT: + case FFI_TYPE_DOUBLE: + gprsUsed++; + fprsUsed++; + + if (fprsUsed > 13) + needsPtr = true; + + break; + + case FFI_TYPE_LONGDOUBLE: + gprsUsed += 2; + fprsUsed += 2; + + if (fprsUsed > 14) + needsPtr = true; + + break; + + case FFI_TYPE_UINT8: + case FFI_TYPE_SINT8: + { + gprsUsed++; + + if (gprsUsed > 8) + { + needsPtr = true; + break; + } + + if (inType->elements[i + 1] == NULL) // last byte in the struct + break; + + // Count possible contiguous bytes ahead, up to 8. + unsigned short j; + + for (j = 1; j < 8; j++) + { + if (inType->elements[i + j] == NULL || + !FFI_TYPE_1_BYTE(inType->elements[i + j]->type)) + break; + } + + i += j - 1; // allow for i++ before the test condition + + break; + } + + case FFI_TYPE_UINT16: + case FFI_TYPE_SINT16: + case FFI_TYPE_INT: + case FFI_TYPE_UINT32: + case FFI_TYPE_SINT32: + case FFI_TYPE_POINTER: + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + gprsUsed++; + + if (gprsUsed > 8) + needsPtr = true; + + break; + + case FFI_TYPE_STRUCT: + needsPtr = ffi64_stret_needs_ptr( + inType->elements[i], &gprsUsed, &fprsUsed); + + break; + + default: + FFI_ASSERT(0); + break; + } + } + + if (ioGPRCount) + *ioGPRCount = gprsUsed; + + if (ioFPRCount) + *ioFPRCount = fprsUsed; + + return needsPtr; +} + +/* ffi64_data_size + + Calculate the size in bytes of an ffi type. +*/ + +unsigned int +ffi64_data_size( + const ffi_type* inType) +{ + unsigned int size = 0; + + switch (inType->type) + { + case FFI_TYPE_UINT8: + case FFI_TYPE_SINT8: + size = 1; + break; + + case FFI_TYPE_UINT16: + case FFI_TYPE_SINT16: + size = 2; + break; + + case FFI_TYPE_INT: + case FFI_TYPE_UINT32: + case FFI_TYPE_SINT32: + case FFI_TYPE_FLOAT: + size = 4; + break; + + case FFI_TYPE_POINTER: + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + case FFI_TYPE_DOUBLE: + size = 8; + break; + + case FFI_TYPE_LONGDOUBLE: + size = 16; + break; + + case FFI_TYPE_STRUCT: + ffi64_struct_to_reg_form( + inType, NULL, NULL, NULL, NULL, &size, NULL, NULL); + break; + + case FFI_TYPE_VOID: + break; + + default: + FFI_ASSERT(0); + break; + } + + return size; +} + +#endif /* defined(__ppc64__) */ +#endif /* __ppc__ || __ppc64__ */ diff -r -u ./Modules/_ctypes/libffi_osx/powerpc/ppc64-darwin_closure.S ./Modules/_ctypes/libffi_osx/powerpc/ppc64-darwin_closure.S new file mode 100644 index 0000000..7162fa1 --- /dev/null +++ ./Modules/_ctypes/libffi_osx/powerpc/ppc64-darwin_closure.S @@ -0,0 +1,418 @@ +#if defined(__ppc64__) + +/* ----------------------------------------------------------------------- + ppc64-darwin_closure.S - Copyright (c) 2002, 2003, 2004, Free Software Foundation, + Inc. based on ppc_closure.S + + PowerPC Assembly glue. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#define LIBFFI_ASM + +#include +#include // for FFI_TRAMPOLINE_SIZE +#include +#include + + .file "ppc64-darwin_closure.S" +.text + .align LOG2_GPR_BYTES + .globl _ffi_closure_ASM + +.text + .align LOG2_GPR_BYTES + +_ffi_closure_ASM: +LFB1: + mflr r0 + stg r0,SF_RETURN(r1) // save return address + + // Save GPRs 3 - 10 (aligned to 8) in the parents outgoing area. + stg r3,SF_ARG1(r1) + stg r4,SF_ARG2(r1) + stg r5,SF_ARG3(r1) + stg r6,SF_ARG4(r1) + stg r7,SF_ARG5(r1) + stg r8,SF_ARG6(r1) + stg r9,SF_ARG7(r1) + stg r10,SF_ARG8(r1) + +LCFI0: +/* 48 bytes (Linkage Area) + 64 bytes (outgoing parameter area, always reserved) + 112 bytes (14*8 for incoming FPR) + ? bytes (result) + 112 bytes (14*8 for outgoing FPR) + 16 bytes (2 saved registers) + 352 + ? total bytes +*/ + + std r31,-8(r1) // Save registers we use. + std r30,-16(r1) + mr r30,r1 // Save the old SP. + mr r31,r11 // Save the ffi_closure around ffi64_data_size. + + // Calculate the space we need. + stdu r1,-SF_MINSIZE(r1) + ld r3,FFI_TRAMPOLINE_SIZE(r31) // ffi_closure->cif* + ld r3,16(r3) // ffi_cif->rtype* + bl Lffi64_data_size$stub + ld r1,0(r1) + + addi r3,r3,352 // Add our overhead. + neg r3,r3 + li r0,-32 // Align to 32 bytes. + and r3,r3,r0 + stdux r1,r1,r3 // Grow the stack. + + mr r11,r31 // Copy the ffi_closure back. + +LCFI1: + // We want to build up an area for the parameters passed + // in registers. (both floating point and integer) + +/* 320 bytes (callee stack frame aligned to 32) + 48 bytes (caller linkage area) + 368 (start of caller parameter area aligned to 8) +*/ + + // Save FPRs 1 - 14. (aligned to 8) + stfd f1,112(r1) + stfd f2,120(r1) + stfd f3,128(r1) + stfd f4,136(r1) + stfd f5,144(r1) + stfd f6,152(r1) + stfd f7,160(r1) + stfd f8,168(r1) + stfd f9,176(r1) + stfd f10,184(r1) + stfd f11,192(r1) + stfd f12,200(r1) + stfd f13,208(r1) + stfd f14,216(r1) + + // Set up registers for the routine that actually does the work. + mr r3,r11 // context pointer from the trampoline + addi r4,r1,224 // result storage + addi r5,r30,SF_ARG1 // saved GPRs + addi r6,r1,112 // saved FPRs + bl Lffi_closure_helper_DARWIN$stub + + // Look the proper starting point in table + // by using return type as an offset. + addi r5,r1,224 // Get pointer to results area. + bl Lget_ret_type0_addr // Get pointer to Lret_type0 into LR. + mflr r4 // Move to r4. + slwi r3,r3,4 // Now multiply return type by 16. + add r3,r3,r4 // Add contents of table to table address. + mtctr r3 + bctr + +LFE1: + // Each of the ret_typeX code fragments has to be exactly 16 bytes long + // (4 instructions). For cache effectiveness we align to a 16 byte + // boundary first. + .align 4 + nop + nop + nop + +Lget_ret_type0_addr: + blrl + +// case FFI_TYPE_VOID +Lret_type0: + b Lfinish + nop + nop + nop + +// case FFI_TYPE_INT +Lret_type1: + lwz r3,4(r5) + b Lfinish + nop + nop + +// case FFI_TYPE_FLOAT +Lret_type2: + lfs f1,0(r5) + b Lfinish + nop + nop + +// case FFI_TYPE_DOUBLE +Lret_type3: + lfd f1,0(r5) + b Lfinish + nop + nop + +// case FFI_TYPE_LONGDOUBLE +Lret_type4: + lfd f1,0(r5) + lfd f2,8(r5) + b Lfinish + nop + +// case FFI_TYPE_UINT8 +Lret_type5: + lbz r3,7(r5) + b Lfinish + nop + nop + +// case FFI_TYPE_SINT8 +Lret_type6: + lbz r3,7(r5) + extsb r3,r3 + b Lfinish + nop + +// case FFI_TYPE_UINT16 +Lret_type7: + lhz r3,6(r5) + b Lfinish + nop + nop + +// case FFI_TYPE_SINT16 +Lret_type8: + lha r3,6(r5) + b Lfinish + nop + nop + +// case FFI_TYPE_UINT32 +Lret_type9: // same as Lret_type1 + lwz r3,4(r5) + b Lfinish + nop + nop + +// case FFI_TYPE_SINT32 +Lret_type10: // same as Lret_type1 + lwz r3,4(r5) + b Lfinish + nop + nop + +// case FFI_TYPE_UINT64 +Lret_type11: + ld r3,0(r5) + b Lfinish + nop + nop + +// case FFI_TYPE_SINT64 +Lret_type12: // same as Lret_type11 + ld r3,0(r5) + b Lfinish + nop + nop + +// case FFI_TYPE_STRUCT +Lret_type13: + b Lret_struct + nop + nop + nop + +// ** End 16-byte aligned cases ** +// case FFI_TYPE_POINTER +// This case assumes that FFI_TYPE_POINTER == FFI_TYPE_LAST. If more types +// are added in future, the following code will need to be updated and +// padded to 16 bytes. +Lret_type14: + lg r3,0(r5) + b Lfinish + +// copy struct into registers +Lret_struct: + ld r31,FFI_TRAMPOLINE_SIZE(r31) // ffi_closure->cif* + ld r3,16(r31) // ffi_cif->rtype* + ld r31,24(r31) // ffi_cif->flags + mr r4,r5 // copy struct* to 2nd arg + addi r7,r1,SF_ARG9 // GPR return area + addi r9,r30,-16-(14*8) // FPR return area + li r5,0 // struct offset ptr (NULL) + li r6,0 // FPR used count ptr (NULL) + li r8,0 // GPR return area size ptr (NULL) + li r10,0 // FPR return area size ptr (NULL) + bl Lffi64_struct_to_reg_form$stub + + // Load GPRs + ld r3,SF_ARG9(r1) + ld r4,SF_ARG10(r1) + ld r5,SF_ARG11(r1) + ld r6,SF_ARG12(r1) + nop + ld r7,SF_ARG13(r1) + ld r8,SF_ARG14(r1) + ld r9,SF_ARG15(r1) + ld r10,SF_ARG16(r1) + nop + + // Load FPRs + mtcrf 0x2,r31 + bf 26,Lfinish + lfd f1,-16-(14*8)(r30) + lfd f2,-16-(13*8)(r30) + lfd f3,-16-(12*8)(r30) + lfd f4,-16-(11*8)(r30) + nop + lfd f5,-16-(10*8)(r30) + lfd f6,-16-(9*8)(r30) + lfd f7,-16-(8*8)(r30) + lfd f8,-16-(7*8)(r30) + nop + lfd f9,-16-(6*8)(r30) + lfd f10,-16-(5*8)(r30) + lfd f11,-16-(4*8)(r30) + lfd f12,-16-(3*8)(r30) + nop + lfd f13,-16-(2*8)(r30) + lfd f14,-16-(1*8)(r30) + // Fall through + +// case done +Lfinish: + lg r1,0(r1) // Restore stack pointer. + ld r31,-8(r1) // Restore registers we used. + ld r30,-16(r1) + lg r0,SF_RETURN(r1) // Get return address. + mtlr r0 // Reset link register. + blr + +// END(ffi_closure_ASM) + +.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support +EH_frame1: + .set L$set$0,LECIE1-LSCIE1 + .long L$set$0 ; Length of Common Information Entry +LSCIE1: + .long 0x0 ; CIE Identifier Tag + .byte 0x1 ; CIE Version + .ascii "zR\0" ; CIE Augmentation + .byte 0x1 ; uleb128 0x1; CIE Code Alignment Factor + .byte 0x7c ; sleb128 -4; CIE Data Alignment Factor + .byte 0x41 ; CIE RA Column + .byte 0x1 ; uleb128 0x1; Augmentation size + .byte 0x10 ; FDE Encoding (pcrel) + .byte 0xc ; DW_CFA_def_cfa + .byte 0x1 ; uleb128 0x1 + .byte 0x0 ; uleb128 0x0 + .align LOG2_GPR_BYTES +LECIE1: +.globl _ffi_closure_ASM.eh +_ffi_closure_ASM.eh: +LSFDE1: + .set L$set$1,LEFDE1-LASFDE1 + .long L$set$1 ; FDE Length + +LASFDE1: + .long LASFDE1-EH_frame1 ; FDE CIE offset + .g_long LFB1-. ; FDE initial location + .set L$set$3,LFE1-LFB1 + .g_long L$set$3 ; FDE address range + .byte 0x0 ; uleb128 0x0; Augmentation size + .byte 0x4 ; DW_CFA_advance_loc4 + .set L$set$3,LCFI1-LCFI0 + .long L$set$3 + .byte 0xe ; DW_CFA_def_cfa_offset + .byte 176,1 ; uleb128 176 + .byte 0x4 ; DW_CFA_advance_loc4 + .set L$set$4,LCFI0-LFB1 + .long L$set$4 + .byte 0x11 ; DW_CFA_offset_extended_sf + .byte 0x41 ; uleb128 0x41 + .byte 0x7e ; sleb128 -2 + .align LOG2_GPR_BYTES + +LEFDE1: +.data + .align LOG2_GPR_BYTES +LDFCM0: +.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 + .align LOG2_GPR_BYTES + +Lffi_closure_helper_DARWIN$stub: + .indirect_symbol _ffi_closure_helper_DARWIN + mflr r0 + bcl 20,31,LO$ffi_closure_helper_DARWIN + +LO$ffi_closure_helper_DARWIN: + mflr r11 + addis r11,r11,ha16(L_ffi_closure_helper_DARWIN$lazy_ptr - LO$ffi_closure_helper_DARWIN) + mtlr r0 + lgu r12,lo16(L_ffi_closure_helper_DARWIN$lazy_ptr - LO$ffi_closure_helper_DARWIN)(r11) + mtctr r12 + bctr + +.lazy_symbol_pointer +L_ffi_closure_helper_DARWIN$lazy_ptr: + .indirect_symbol _ffi_closure_helper_DARWIN + .g_long dyld_stub_binding_helper + +.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 + .align LOG2_GPR_BYTES + +Lffi64_struct_to_reg_form$stub: + .indirect_symbol _ffi64_struct_to_reg_form + mflr r0 + bcl 20,31,LO$ffi64_struct_to_reg_form + +LO$ffi64_struct_to_reg_form: + mflr r11 + addis r11,r11,ha16(L_ffi64_struct_to_reg_form$lazy_ptr - LO$ffi64_struct_to_reg_form) + mtlr r0 + lgu r12,lo16(L_ffi64_struct_to_reg_form$lazy_ptr - LO$ffi64_struct_to_reg_form)(r11) + mtctr r12 + bctr + +.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 + .align LOG2_GPR_BYTES + +Lffi64_data_size$stub: + .indirect_symbol _ffi64_data_size + mflr r0 + bcl 20,31,LO$ffi64_data_size + +LO$ffi64_data_size: + mflr r11 + addis r11,r11,ha16(L_ffi64_data_size$lazy_ptr - LO$ffi64_data_size) + mtlr r0 + lgu r12,lo16(L_ffi64_data_size$lazy_ptr - LO$ffi64_data_size)(r11) + mtctr r12 + bctr + +.lazy_symbol_pointer +L_ffi64_struct_to_reg_form$lazy_ptr: + .indirect_symbol _ffi64_struct_to_reg_form + .g_long dyld_stub_binding_helper + +L_ffi64_data_size$lazy_ptr: + .indirect_symbol _ffi64_data_size + .g_long dyld_stub_binding_helper + +#endif // __ppc64__ diff -r -u ./Modules/_ctypes/libffi_osx/types.c ./Modules/_ctypes/libffi_osx/types.c new file mode 100644 index 0000000..44806ae --- /dev/null +++ ./Modules/_ctypes/libffi_osx/types.c @@ -0,0 +1,115 @@ +/* ----------------------------------------------------------------------- + types.c - Copyright (c) 1996, 1998 Red Hat, Inc. + + Predefined ffi_types needed by libffi. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#include +#include + +/* Type definitions */ +#define FFI_INTEGRAL_TYPEDEF(n, s, a, t) \ + ffi_type ffi_type_##n = { s, a, t, NULL } +#define FFI_AGGREGATE_TYPEDEF(n, e) \ + ffi_type ffi_type_##n = { 0, 0, FFI_TYPE_STRUCT, e } + +FFI_INTEGRAL_TYPEDEF(uint8, 1, 1, FFI_TYPE_UINT8); +FFI_INTEGRAL_TYPEDEF(sint8, 1, 1, FFI_TYPE_SINT8); +FFI_INTEGRAL_TYPEDEF(uint16, 2, 2, FFI_TYPE_UINT16); +FFI_INTEGRAL_TYPEDEF(sint16, 2, 2, FFI_TYPE_SINT16); +FFI_INTEGRAL_TYPEDEF(uint32, 4, 4, FFI_TYPE_UINT32); +FFI_INTEGRAL_TYPEDEF(sint32, 4, 4, FFI_TYPE_SINT32); +FFI_INTEGRAL_TYPEDEF(float, 4, 4, FFI_TYPE_FLOAT); + +/* Size and alignment are fake here. They must not be 0. */ +FFI_INTEGRAL_TYPEDEF(void, 1, 1, FFI_TYPE_VOID); + +#if defined ALPHA || defined SPARC64 || defined X86_64 || \ + defined S390X || defined IA64 || defined POWERPC64 +FFI_INTEGRAL_TYPEDEF(pointer, 8, 8, FFI_TYPE_POINTER); +#else +FFI_INTEGRAL_TYPEDEF(pointer, 4, 4, FFI_TYPE_POINTER); +#endif + +#if defined X86 || defined ARM || defined M68K || defined(X86_DARWIN) + +# ifdef X86_64 + FFI_INTEGRAL_TYPEDEF(uint64, 8, 8, FFI_TYPE_UINT64); + FFI_INTEGRAL_TYPEDEF(sint64, 8, 8, FFI_TYPE_SINT64); +# else + FFI_INTEGRAL_TYPEDEF(uint64, 8, 4, FFI_TYPE_UINT64); + FFI_INTEGRAL_TYPEDEF(sint64, 8, 4, FFI_TYPE_SINT64); +# endif + +#elif defined(POWERPC_DARWIN) +FFI_INTEGRAL_TYPEDEF(uint64, 8, 8, FFI_TYPE_UINT64); +FFI_INTEGRAL_TYPEDEF(sint64, 8, 8, FFI_TYPE_SINT64); +#elif defined SH +FFI_INTEGRAL_TYPEDEF(uint64, 8, 4, FFI_TYPE_UINT64); +FFI_INTEGRAL_TYPEDEF(sint64, 8, 4, FFI_TYPE_SINT64); +#else +FFI_INTEGRAL_TYPEDEF(uint64, 8, 8, FFI_TYPE_UINT64); +FFI_INTEGRAL_TYPEDEF(sint64, 8, 8, FFI_TYPE_SINT64); +#endif + +#if defined X86 || defined X86_WIN32 || defined M68K || defined(X86_DARWIN) + +# if defined X86_WIN32 || defined X86_64 + FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE); +# else + FFI_INTEGRAL_TYPEDEF(double, 8, 4, FFI_TYPE_DOUBLE); +# endif + +# ifdef X86_DARWIN + FFI_INTEGRAL_TYPEDEF(longdouble, 16, 16, FFI_TYPE_LONGDOUBLE); +# else + FFI_INTEGRAL_TYPEDEF(longdouble, 12, 4, FFI_TYPE_LONGDOUBLE); +# endif + +#elif defined ARM || defined SH || defined POWERPC_AIX +FFI_INTEGRAL_TYPEDEF(double, 8, 4, FFI_TYPE_DOUBLE); +FFI_INTEGRAL_TYPEDEF(longdouble, 8, 4, FFI_TYPE_LONGDOUBLE); +#elif defined POWERPC_DARWIN +FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE); + +# if __GNUC__ >= 4 + FFI_INTEGRAL_TYPEDEF(longdouble, 16, 16, FFI_TYPE_LONGDOUBLE); +# else + FFI_INTEGRAL_TYPEDEF(longdouble, 8, 8, FFI_TYPE_LONGDOUBLE); +# endif + +#elif defined SPARC +FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE); + +# ifdef SPARC64 + FFI_INTEGRAL_TYPEDEF(longdouble, 16, 16, FFI_TYPE_LONGDOUBLE); +# else + FFI_INTEGRAL_TYPEDEF(longdouble, 16, 8, FFI_TYPE_LONGDOUBLE); +# endif + +#elif defined X86_64 || defined POWERPC64 +FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE); +FFI_INTEGRAL_TYPEDEF(longdouble, 16, 16, FFI_TYPE_LONGDOUBLE); +#else +FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE); +FFI_INTEGRAL_TYPEDEF(longdouble, 8, 8, FFI_TYPE_LONGDOUBLE); +#endif \ No newline at end of file diff -r -u ./Modules/_ctypes/libffi_osx/x86/darwin64.S ./Modules/_ctypes/libffi_osx/x86/darwin64.S new file mode 100644 index 0000000..165d469 --- /dev/null +++ ./Modules/_ctypes/libffi_osx/x86/darwin64.S @@ -0,0 +1,417 @@ +/* ----------------------------------------------------------------------- + darwin64.S - Copyright (c) 2006 Free Software Foundation, Inc. + derived from unix64.S + + x86-64 Foreign Function Interface for Darwin. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#ifdef __x86_64__ +#define LIBFFI_ASM +#include +#include + + .file "darwin64.S" +.text + +/* ffi_call_unix64 (void *args, unsigned long bytes, unsigned flags, + void *raddr, void (*fnaddr)()); + + Bit o trickiness here -- ARGS+BYTES is the base of the stack frame + for this function. This has been allocated by ffi_call. We also + deallocate some of the stack that has been alloca'd. */ + + .align 3 + .globl _ffi_call_unix64 + +_ffi_call_unix64: +LUW0: + movq (%rsp), %r10 /* Load return address. */ + movq %rdi, %r12 /* Save a copy of the register area. */ + leaq (%rdi, %rsi), %rax /* Find local stack base. */ + movq %rdx, (%rax) /* Save flags. */ + movq %rcx, 8(%rax) /* Save raddr. */ + movq %rbp, 16(%rax) /* Save old frame pointer. */ + movq %r10, 24(%rax) /* Relocate return address. */ + movq %rax, %rbp /* Finalize local stack frame. */ +LUW1: + /* movq %rdi, %r10 // Save a copy of the register area. */ + movq %r12, %r10 + movq %r8, %r11 /* Save a copy of the target fn. */ + movl %r9d, %eax /* Set number of SSE registers. */ + + /* Load up all argument registers. */ + movq (%r10), %rdi + movq 8(%r10), %rsi + movq 16(%r10), %rdx + movq 24(%r10), %rcx + movq 32(%r10), %r8 + movq 40(%r10), %r9 + testl %eax, %eax + jnz Lload_sse +Lret_from_load_sse: + + /* Deallocate the reg arg area. */ + leaq 176(%r10), %rsp + + /* Call the user function. */ + call *%r11 + + /* Deallocate stack arg area; local stack frame in redzone. */ + leaq 24(%rbp), %rsp + + movq 0(%rbp), %rcx /* Reload flags. */ + movq 8(%rbp), %rdi /* Reload raddr. */ + movq 16(%rbp), %rbp /* Reload old frame pointer. */ +LUW2: + + /* The first byte of the flags contains the FFI_TYPE. */ + movzbl %cl, %r10d + leaq Lstore_table(%rip), %r11 + movslq (%r11, %r10, 4), %r10 + addq %r11, %r10 + jmp *%r10 + +Lstore_table: + .long Lst_void-Lstore_table /* FFI_TYPE_VOID */ + .long Lst_sint32-Lstore_table /* FFI_TYPE_INT */ + .long Lst_float-Lstore_table /* FFI_TYPE_FLOAT */ + .long Lst_double-Lstore_table /* FFI_TYPE_DOUBLE */ + .long Lst_ldouble-Lstore_table /* FFI_TYPE_LONGDOUBLE */ + .long Lst_uint8-Lstore_table /* FFI_TYPE_UINT8 */ + .long Lst_sint8-Lstore_table /* FFI_TYPE_SINT8 */ + .long Lst_uint16-Lstore_table /* FFI_TYPE_UINT16 */ + .long Lst_sint16-Lstore_table /* FFI_TYPE_SINT16 */ + .long Lst_uint32-Lstore_table /* FFI_TYPE_UINT32 */ + .long Lst_sint32-Lstore_table /* FFI_TYPE_SINT32 */ + .long Lst_int64-Lstore_table /* FFI_TYPE_UINT64 */ + .long Lst_int64-Lstore_table /* FFI_TYPE_SINT64 */ + .long Lst_struct-Lstore_table /* FFI_TYPE_STRUCT */ + .long Lst_int64-Lstore_table /* FFI_TYPE_POINTER */ + + .text + .align 3 +Lst_void: + ret + .align 3 +Lst_uint8: + movzbq %al, %rax + movq %rax, (%rdi) + ret + .align 3 +Lst_sint8: + movsbq %al, %rax + movq %rax, (%rdi) + ret + .align 3 +Lst_uint16: + movzwq %ax, %rax + movq %rax, (%rdi) + .align 3 +Lst_sint16: + movswq %ax, %rax + movq %rax, (%rdi) + ret + .align 3 +Lst_uint32: + movl %eax, %eax + movq %rax, (%rdi) + .align 3 +Lst_sint32: + cltq + movq %rax, (%rdi) + ret + .align 3 +Lst_int64: + movq %rax, (%rdi) + ret + .align 3 +Lst_float: + movss %xmm0, (%rdi) + ret + .align 3 +Lst_double: + movsd %xmm0, (%rdi) + ret +Lst_ldouble: + fstpt (%rdi) + ret + .align 3 +Lst_struct: + leaq -20(%rsp), %rsi /* Scratch area in redzone. */ + + /* We have to locate the values now, and since we don't want to + write too much data into the user's return value, we spill the + value to a 16 byte scratch area first. Bits 8, 9, and 10 + control where the values are located. Only one of the three + bits will be set; see ffi_prep_cif_machdep for the pattern. */ + movd %xmm0, %r10 + movd %xmm1, %r11 + testl $0x100, %ecx + cmovnz %rax, %rdx + cmovnz %r10, %rax + testl $0x200, %ecx + cmovnz %r10, %rdx + testl $0x400, %ecx + cmovnz %r10, %rax + cmovnz %r11, %rdx + movq %rax, (%rsi) + movq %rdx, 8(%rsi) + + /* Bits 12-31 contain the true size of the structure. Copy from + the scratch area to the true destination. */ + shrl $12, %ecx + rep movsb + ret + + /* Many times we can avoid loading any SSE registers at all. + It's not worth an indirect jump to load the exact set of + SSE registers needed; zero or all is a good compromise. */ + .align 3 +LUW3: +Lload_sse: + movdqa 48(%r10), %xmm0 + movdqa 64(%r10), %xmm1 + movdqa 80(%r10), %xmm2 + movdqa 96(%r10), %xmm3 + movdqa 112(%r10), %xmm4 + movdqa 128(%r10), %xmm5 + movdqa 144(%r10), %xmm6 + movdqa 160(%r10), %xmm7 + jmp Lret_from_load_sse + +LUW4: + .align 3 + .globl _ffi_closure_unix64 + +_ffi_closure_unix64: +LUW5: + /* The carry flag is set by the trampoline iff SSE registers + are used. Don't clobber it before the branch instruction. */ + leaq -200(%rsp), %rsp +LUW6: + movq %rdi, (%rsp) + movq %rsi, 8(%rsp) + movq %rdx, 16(%rsp) + movq %rcx, 24(%rsp) + movq %r8, 32(%rsp) + movq %r9, 40(%rsp) + jc Lsave_sse +Lret_from_save_sse: + + movq %r10, %rdi + leaq 176(%rsp), %rsi + movq %rsp, %rdx + leaq 208(%rsp), %rcx + call _ffi_closure_unix64_inner + + /* Deallocate stack frame early; return value is now in redzone. */ + addq $200, %rsp +LUW7: + + /* The first byte of the return value contains the FFI_TYPE. */ + movzbl %al, %r10d + leaq Lload_table(%rip), %r11 + movslq (%r11, %r10, 4), %r10 + addq %r11, %r10 + jmp *%r10 + +Lload_table: + .long Lld_void-Lload_table /* FFI_TYPE_VOID */ + .long Lld_int32-Lload_table /* FFI_TYPE_INT */ + .long Lld_float-Lload_table /* FFI_TYPE_FLOAT */ + .long Lld_double-Lload_table /* FFI_TYPE_DOUBLE */ + .long Lld_ldouble-Lload_table /* FFI_TYPE_LONGDOUBLE */ + .long Lld_int8-Lload_table /* FFI_TYPE_UINT8 */ + .long Lld_int8-Lload_table /* FFI_TYPE_SINT8 */ + .long Lld_int16-Lload_table /* FFI_TYPE_UINT16 */ + .long Lld_int16-Lload_table /* FFI_TYPE_SINT16 */ + .long Lld_int32-Lload_table /* FFI_TYPE_UINT32 */ + .long Lld_int32-Lload_table /* FFI_TYPE_SINT32 */ + .long Lld_int64-Lload_table /* FFI_TYPE_UINT64 */ + .long Lld_int64-Lload_table /* FFI_TYPE_SINT64 */ + .long Lld_struct-Lload_table /* FFI_TYPE_STRUCT */ + .long Lld_int64-Lload_table /* FFI_TYPE_POINTER */ + + .text + .align 3 +Lld_void: + ret + .align 3 +Lld_int8: + movzbl -24(%rsp), %eax + ret + .align 3 +Lld_int16: + movzwl -24(%rsp), %eax + ret + .align 3 +Lld_int32: + movl -24(%rsp), %eax + ret + .align 3 +Lld_int64: + movq -24(%rsp), %rax + ret + .align 3 +Lld_float: + movss -24(%rsp), %xmm0 + ret + .align 3 +Lld_double: + movsd -24(%rsp), %xmm0 + ret + .align 3 +Lld_ldouble: + fldt -24(%rsp) + ret + .align 3 +Lld_struct: + /* There are four possibilities here, %rax/%rdx, %xmm0/%rax, + %rax/%xmm0, %xmm0/%xmm1. We collapse two by always loading + both rdx and xmm1 with the second word. For the remaining, + bit 8 set means xmm0 gets the second word, and bit 9 means + that rax gets the second word. */ + movq -24(%rsp), %rcx + movq -16(%rsp), %rdx + movq -16(%rsp), %xmm1 + testl $0x100, %eax + cmovnz %rdx, %rcx + movd %rcx, %xmm0 + testl $0x200, %eax + movq -24(%rsp), %rax + cmovnz %rdx, %rax + ret + + /* See the comment above Lload_sse; the same logic applies here. */ + .align 3 +LUW8: +Lsave_sse: + movdqa %xmm0, 48(%rsp) + movdqa %xmm1, 64(%rsp) + movdqa %xmm2, 80(%rsp) + movdqa %xmm3, 96(%rsp) + movdqa %xmm4, 112(%rsp) + movdqa %xmm5, 128(%rsp) + movdqa %xmm6, 144(%rsp) + movdqa %xmm7, 160(%rsp) + jmp Lret_from_save_sse + +LUW9: +.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support +EH_frame1: + .set L$set$0,LECIE1-LSCIE1 /* CIE Length */ + .long L$set$0 +LSCIE1: + .long 0x0 /* CIE Identifier Tag */ + .byte 0x1 /* CIE Version */ + .ascii "zR\0" /* CIE Augmentation */ + .byte 0x1 /* uleb128 0x1; CIE Code Alignment Factor */ + .byte 0x78 /* sleb128 -8; CIE Data Alignment Factor */ + .byte 0x10 /* CIE RA Column */ + .byte 0x1 /* uleb128 0x1; Augmentation size */ + .byte 0x10 /* FDE Encoding (pcrel sdata4) */ + .byte 0xc /* DW_CFA_def_cfa, %rsp offset 8 */ + .byte 0x7 /* uleb128 0x7 */ + .byte 0x8 /* uleb128 0x8 */ + .byte 0x90 /* DW_CFA_offset, column 0x10 */ + .byte 0x1 + .align 3 +LECIE1: + .globl _ffi_call_unix64.eh +_ffi_call_unix64.eh: +LSFDE1: + .set L$set$1,LEFDE1-LASFDE1 /* FDE Length */ + .long L$set$1 +LASFDE1: + .long LASFDE1-EH_frame1 /* FDE CIE offset */ + .quad LUW0-. /* FDE initial location */ + .set L$set$2,LUW4-LUW0 /* FDE address range */ + .quad L$set$2 + .byte 0x0 /* Augmentation size */ + .byte 0x4 /* DW_CFA_advance_loc4 */ + .set L$set$3,LUW1-LUW0 + .long L$set$3 + + /* New stack frame based off rbp. This is a itty bit of unwind + trickery in that the CFA *has* changed. There is no easy way + to describe it correctly on entry to the function. Fortunately, + it doesn't matter too much since at all points we can correctly + unwind back to ffi_call. Note that the location to which we + moved the return address is (the new) CFA-8, so from the + perspective of the unwind info, it hasn't moved. */ + .byte 0xc /* DW_CFA_def_cfa, %rbp offset 32 */ + .byte 0x6 + .byte 0x20 + .byte 0x80+6 /* DW_CFA_offset, %rbp offset 2*-8 */ + .byte 0x2 + .byte 0xa /* DW_CFA_remember_state */ + + .byte 0x4 /* DW_CFA_advance_loc4 */ + .set L$set$4,LUW2-LUW1 + .long L$set$4 + .byte 0xc /* DW_CFA_def_cfa, %rsp offset 8 */ + .byte 0x7 + .byte 0x8 + .byte 0xc0+6 /* DW_CFA_restore, %rbp */ + + .byte 0x4 /* DW_CFA_advance_loc4 */ + .set L$set$5,LUW3-LUW2 + .long L$set$5 + .byte 0xb /* DW_CFA_restore_state */ + + .align 3 +LEFDE1: + .globl _ffi_closure_unix64.eh +_ffi_closure_unix64.eh: +LSFDE3: + .set L$set$6,LEFDE3-LASFDE3 /* FDE Length */ + .long L$set$6 +LASFDE3: + .long LASFDE3-EH_frame1 /* FDE CIE offset */ + .quad LUW5-. /* FDE initial location */ + .set L$set$7,LUW9-LUW5 /* FDE address range */ + .quad L$set$7 + .byte 0x0 /* Augmentation size */ + + .byte 0x4 /* DW_CFA_advance_loc4 */ + .set L$set$8,LUW6-LUW5 + .long L$set$8 + .byte 0xe /* DW_CFA_def_cfa_offset */ + .byte 208,1 /* uleb128 208 */ + .byte 0xa /* DW_CFA_remember_state */ + + .byte 0x4 /* DW_CFA_advance_loc4 */ + .set L$set$9,LUW7-LUW6 + .long L$set$9 + .byte 0xe /* DW_CFA_def_cfa_offset */ + .byte 0x8 + + .byte 0x4 /* DW_CFA_advance_loc4 */ + .set L$set$10,LUW8-LUW7 + .long L$set$10 + .byte 0xb /* DW_CFA_restore_state */ + + .align 3 +LEFDE3: + .subsections_via_symbols + +#endif /* __x86_64__ */ diff -r -u ./Modules/_ctypes/libffi_osx/x86/x86-darwin.S ./Modules/_ctypes/libffi_osx/x86/x86-darwin.S new file mode 100644 index 0000000..925a841 --- /dev/null +++ ./Modules/_ctypes/libffi_osx/x86/x86-darwin.S @@ -0,0 +1,422 @@ +#ifdef __i386__ +/* ----------------------------------------------------------------------- + darwin.S - Copyright (c) 1996, 1998, 2001, 2002, 2003 Red Hat, Inc. + + X86 Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +/* + * This file is based on sysv.S and then hacked up by Ronald who hasn't done + * assembly programming in 8 years. + */ + +#ifndef __x86_64__ + +#define LIBFFI_ASM +#include +#include + +#ifdef PyObjC_STRICT_DEBUGGING + /* XXX: Debugging of stack alignment, to be removed */ +#define ASSERT_STACK_ALIGNED movdqa -16(%esp), %xmm0 +#else +#define ASSERT_STACK_ALIGNED +#endif + +.text + +.globl _ffi_prep_args + + .align 4 +.globl _ffi_call_SYSV + +_ffi_call_SYSV: +LFB1: + pushl %ebp +LCFI0: + movl %esp,%ebp +LCFI1: + subl $8,%esp + /* Make room for all of the new args. */ + movl 16(%ebp),%ecx + subl %ecx,%esp + + movl %esp,%eax + + /* Place all of the ffi_prep_args in position */ + subl $8,%esp + pushl 12(%ebp) + pushl %eax + call *8(%ebp) + + /* Return stack to previous state and call the function */ + addl $16,%esp + + call *28(%ebp) + + /* Remove the space we pushed for the args */ + movl 16(%ebp),%ecx + addl %ecx,%esp + + /* Load %ecx with the return type code */ + movl 20(%ebp),%ecx + + /* If the return value pointer is NULL, assume no return value. */ + cmpl $0,24(%ebp) + jne Lretint + + /* Even if there is no space for the return value, we are + obliged to handle floating-point values. */ + cmpl $FFI_TYPE_FLOAT,%ecx + jne Lnoretval + fstp %st(0) + + jmp Lepilogue + +Lretint: + cmpl $FFI_TYPE_INT,%ecx + jne Lretfloat + /* Load %ecx with the pointer to storage for the return value */ + movl 24(%ebp),%ecx + movl %eax,0(%ecx) + jmp Lepilogue + +Lretfloat: + cmpl $FFI_TYPE_FLOAT,%ecx + jne Lretdouble + /* Load %ecx with the pointer to storage for the return value */ + movl 24(%ebp),%ecx + fstps (%ecx) + jmp Lepilogue + +Lretdouble: + cmpl $FFI_TYPE_DOUBLE,%ecx + jne Lretlongdouble + /* Load %ecx with the pointer to storage for the return value */ + movl 24(%ebp),%ecx + fstpl (%ecx) + jmp Lepilogue + +Lretlongdouble: + cmpl $FFI_TYPE_LONGDOUBLE,%ecx + jne Lretint64 + /* Load %ecx with the pointer to storage for the return value */ + movl 24(%ebp),%ecx + fstpt (%ecx) + jmp Lepilogue + +Lretint64: + cmpl $FFI_TYPE_SINT64,%ecx + jne Lretstruct1b + /* Load %ecx with the pointer to storage for the return value */ + movl 24(%ebp),%ecx + movl %eax,0(%ecx) + movl %edx,4(%ecx) + jmp Lepilogue + +Lretstruct1b: + cmpl $FFI_TYPE_SINT8,%ecx + jne Lretstruct2b + /* Load %ecx with the pointer to storage for the return value */ + movl 24(%ebp),%ecx + movb %al,0(%ecx) + jmp Lepilogue + +Lretstruct2b: + cmpl $FFI_TYPE_SINT16,%ecx + jne Lretstruct + /* Load %ecx with the pointer to storage for the return value */ + movl 24(%ebp),%ecx + movw %ax,0(%ecx) + jmp Lepilogue + +Lretstruct: + cmpl $FFI_TYPE_STRUCT,%ecx + jne Lnoretval + /* Nothing to do! */ + addl $4,%esp + popl %ebp + ret + +Lnoretval: +Lepilogue: + addl $8,%esp + movl %ebp,%esp + popl %ebp + ret +LFE1: +.ffi_call_SYSV_end: + + .align 4 +FFI_HIDDEN (ffi_closure_SYSV) +.globl _ffi_closure_SYSV + +_ffi_closure_SYSV: +LFB2: + pushl %ebp +LCFI2: + movl %esp, %ebp +LCFI3: + subl $56, %esp + leal -40(%ebp), %edx + movl %edx, -12(%ebp) /* resp */ + leal 8(%ebp), %edx + movl %edx, 4(%esp) /* args = __builtin_dwarf_cfa () */ + leal -12(%ebp), %edx + movl %edx, (%esp) /* &resp */ + movl %ebx, 8(%esp) +LCFI7: + call L_ffi_closure_SYSV_inner$stub + movl 8(%esp), %ebx + movl -12(%ebp), %ecx + cmpl $FFI_TYPE_INT, %eax + je Lcls_retint + cmpl $FFI_TYPE_FLOAT, %eax + je Lcls_retfloat + cmpl $FFI_TYPE_DOUBLE, %eax + je Lcls_retdouble + cmpl $FFI_TYPE_LONGDOUBLE, %eax + je Lcls_retldouble + cmpl $FFI_TYPE_SINT64, %eax + je Lcls_retllong + cmpl $FFI_TYPE_UINT8, %eax + je Lcls_retstruct1 + cmpl $FFI_TYPE_SINT8, %eax + je Lcls_retstruct1 + cmpl $FFI_TYPE_UINT16, %eax + je Lcls_retstruct2 + cmpl $FFI_TYPE_SINT16, %eax + je Lcls_retstruct2 + cmpl $FFI_TYPE_STRUCT, %eax + je Lcls_retstruct +Lcls_epilogue: + movl %ebp, %esp + popl %ebp + ret +Lcls_retint: + movl (%ecx), %eax + jmp Lcls_epilogue +Lcls_retfloat: + flds (%ecx) + jmp Lcls_epilogue +Lcls_retdouble: + fldl (%ecx) + jmp Lcls_epilogue +Lcls_retldouble: + fldt (%ecx) + jmp Lcls_epilogue +Lcls_retllong: + movl (%ecx), %eax + movl 4(%ecx), %edx + jmp Lcls_epilogue +Lcls_retstruct1: + movsbl (%ecx), %eax + jmp Lcls_epilogue +Lcls_retstruct2: + movswl (%ecx), %eax + jmp Lcls_epilogue +Lcls_retstruct: + lea -8(%ebp),%esp + movl %ebp, %esp + popl %ebp + ret $4 +LFE2: + +#if !FFI_NO_RAW_API + +#define RAW_CLOSURE_CIF_OFFSET ((FFI_TRAMPOLINE_SIZE + 3) & ~3) +#define RAW_CLOSURE_FUN_OFFSET (RAW_CLOSURE_CIF_OFFSET + 4) +#define RAW_CLOSURE_USER_DATA_OFFSET (RAW_CLOSURE_FUN_OFFSET + 4) +#define CIF_FLAGS_OFFSET 20 + + .align 4 +FFI_HIDDEN (ffi_closure_raw_SYSV) +.globl _ffi_closure_raw_SYSV + +_ffi_closure_raw_SYSV: +LFB3: + pushl %ebp +LCFI4: + movl %esp, %ebp +LCFI5: + pushl %esi +LCFI6: + subl $36, %esp + movl RAW_CLOSURE_CIF_OFFSET(%eax), %esi /* closure->cif */ + movl RAW_CLOSURE_USER_DATA_OFFSET(%eax), %edx /* closure->user_data */ + movl %edx, 12(%esp) /* user_data */ + leal 8(%ebp), %edx /* __builtin_dwarf_cfa () */ + movl %edx, 8(%esp) /* raw_args */ + leal -24(%ebp), %edx + movl %edx, 4(%esp) /* &res */ + movl %esi, (%esp) /* cif */ + call *RAW_CLOSURE_FUN_OFFSET(%eax) /* closure->fun */ + movl CIF_FLAGS_OFFSET(%esi), %eax /* rtype */ + cmpl $FFI_TYPE_INT, %eax + je Lrcls_retint + cmpl $FFI_TYPE_FLOAT, %eax + je Lrcls_retfloat + cmpl $FFI_TYPE_DOUBLE, %eax + je Lrcls_retdouble + cmpl $FFI_TYPE_LONGDOUBLE, %eax + je Lrcls_retldouble + cmpl $FFI_TYPE_SINT64, %eax + je Lrcls_retllong +Lrcls_epilogue: + addl $36, %esp + popl %esi + popl %ebp + ret +Lrcls_retint: + movl -24(%ebp), %eax + jmp Lrcls_epilogue +Lrcls_retfloat: + flds -24(%ebp) + jmp Lrcls_epilogue +Lrcls_retdouble: + fldl -24(%ebp) + jmp Lrcls_epilogue +Lrcls_retldouble: + fldt -24(%ebp) + jmp Lrcls_epilogue +Lrcls_retllong: + movl -24(%ebp), %eax + movl -20(%ebp), %edx + jmp Lrcls_epilogue +LFE3: +#endif + +.section __IMPORT,__jump_table,symbol_stubs,self_modifying_code+pure_instructions,5 +L_ffi_closure_SYSV_inner$stub: + .indirect_symbol _ffi_closure_SYSV_inner + hlt ; hlt ; hlt ; hlt ; hlt + + +.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support +EH_frame1: + .set L$set$0,LECIE1-LSCIE1 + .long L$set$0 +LSCIE1: + .long 0x0 + .byte 0x1 + .ascii "zR\0" + .byte 0x1 + .byte 0x7c + .byte 0x8 + .byte 0x1 + .byte 0x10 + .byte 0xc + .byte 0x5 + .byte 0x4 + .byte 0x88 + .byte 0x1 + .align 2 +LECIE1: +.globl _ffi_call_SYSV.eh +_ffi_call_SYSV.eh: +LSFDE1: + .set L$set$1,LEFDE1-LASFDE1 + .long L$set$1 +LASFDE1: + .long LASFDE1-EH_frame1 + .long LFB1-. + .set L$set$2,LFE1-LFB1 + .long L$set$2 + .byte 0x0 + .byte 0x4 + .set L$set$3,LCFI0-LFB1 + .long L$set$3 + .byte 0xe + .byte 0x8 + .byte 0x84 + .byte 0x2 + .byte 0x4 + .set L$set$4,LCFI1-LCFI0 + .long L$set$4 + .byte 0xd + .byte 0x4 + .align 2 +LEFDE1: +.globl _ffi_closure_SYSV.eh +_ffi_closure_SYSV.eh: +LSFDE2: + .set L$set$5,LEFDE2-LASFDE2 + .long L$set$5 +LASFDE2: + .long LASFDE2-EH_frame1 + .long LFB2-. + .set L$set$6,LFE2-LFB2 + .long L$set$6 + .byte 0x0 + .byte 0x4 + .set L$set$7,LCFI2-LFB2 + .long L$set$7 + .byte 0xe + .byte 0x8 + .byte 0x84 + .byte 0x2 + .byte 0x4 + .set L$set$8,LCFI3-LCFI2 + .long L$set$8 + .byte 0xd + .byte 0x4 + .align 2 +LEFDE2: + +#if !FFI_NO_RAW_API + +.globl _ffi_closure_raw_SYSV.eh +_ffi_closure_raw_SYSV.eh: +LSFDE3: + .set L$set$10,LEFDE3-LASFDE3 + .long L$set$10 +LASFDE3: + .long LASFDE3-EH_frame1 + .long LFB3-. + .set L$set$11,LFE3-LFB3 + .long L$set$11 + .byte 0x0 + .byte 0x4 + .set L$set$12,LCFI4-LFB3 + .long L$set$12 + .byte 0xe + .byte 0x8 + .byte 0x84 + .byte 0x2 + .byte 0x4 + .set L$set$13,LCFI5-LCFI4 + .long L$set$13 + .byte 0xd + .byte 0x4 + .byte 0x4 + .set L$set$14,LCFI6-LCFI5 + .long L$set$14 + .byte 0x85 + .byte 0x3 + .align 2 +LEFDE3: + +#endif + +#endif /* ifndef __x86_64__ */ + +#endif /* defined __i386__ */ diff -r -u ./Modules/_ctypes/libffi_osx/x86/x86-ffi64.c ./Modules/_ctypes/libffi_osx/x86/x86-ffi64.c new file mode 100644 index 0000000..06feaf2 --- /dev/null +++ ./Modules/_ctypes/libffi_osx/x86/x86-ffi64.c @@ -0,0 +1,734 @@ +#ifdef __x86_64__ + +/* ----------------------------------------------------------------------- + x86-ffi64.c - Copyright (c) 2002 Bo Thorsen + + x86-64 Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#include +#include + +#include +#include + +#define MAX_GPR_REGS 6 +#define MAX_SSE_REGS 8 + +typedef struct RegisterArgs { + /* Registers for argument passing. */ + UINT64 gpr[MAX_GPR_REGS]; + __int128_t sse[MAX_SSE_REGS]; +} RegisterArgs; + +extern void +ffi_call_unix64( + void* args, + unsigned long bytes, + unsigned flags, + void* raddr, + void (*fnaddr)(), + unsigned ssecount); + +/* All reference to register classes here is identical to the code in + gcc/config/i386/i386.c. Do *not* change one without the other. */ + +/* Register class used for passing given 64bit part of the argument. + These represent classes as documented by the PS ABI, with the exception + of SSESF, SSEDF classes, that are basically SSE class, just gcc will + use SF or DFmode move instead of DImode to avoid reformating penalties. + + Similary we play games with INTEGERSI_CLASS to use cheaper SImode moves + whenever possible (upper half does contain padding). */ +enum x86_64_reg_class +{ + X86_64_NO_CLASS, + X86_64_INTEGER_CLASS, + X86_64_INTEGERSI_CLASS, + X86_64_SSE_CLASS, + X86_64_SSESF_CLASS, + X86_64_SSEDF_CLASS, + X86_64_SSEUP_CLASS, + X86_64_X87_CLASS, + X86_64_X87UP_CLASS, + X86_64_COMPLEX_X87_CLASS, + X86_64_MEMORY_CLASS +}; + +#define MAX_CLASSES 4 +#define SSE_CLASS_P(X) ((X) >= X86_64_SSE_CLASS && X <= X86_64_SSEUP_CLASS) + +/* x86-64 register passing implementation. See x86-64 ABI for details. Goal + of this code is to classify each 8bytes of incoming argument by the register + class and assign registers accordingly. */ + +/* Return the union class of CLASS1 and CLASS2. + See the x86-64 PS ABI for details. */ +static enum x86_64_reg_class +merge_classes( + enum x86_64_reg_class class1, + enum x86_64_reg_class class2) +{ + /* Rule #1: If both classes are equal, this is the resulting class. */ + if (class1 == class2) + return class1; + + /* Rule #2: If one of the classes is NO_CLASS, the resulting class is + the other class. */ + if (class1 == X86_64_NO_CLASS) + return class2; + + if (class2 == X86_64_NO_CLASS) + return class1; + + /* Rule #3: If one of the classes is MEMORY, the result is MEMORY. */ + if (class1 == X86_64_MEMORY_CLASS || class2 == X86_64_MEMORY_CLASS) + return X86_64_MEMORY_CLASS; + + /* Rule #4: If one of the classes is INTEGER, the result is INTEGER. */ + if ((class1 == X86_64_INTEGERSI_CLASS && class2 == X86_64_SSESF_CLASS) + || (class2 == X86_64_INTEGERSI_CLASS && class1 == X86_64_SSESF_CLASS)) + return X86_64_INTEGERSI_CLASS; + + if (class1 == X86_64_INTEGER_CLASS || class1 == X86_64_INTEGERSI_CLASS + || class2 == X86_64_INTEGER_CLASS || class2 == X86_64_INTEGERSI_CLASS) + return X86_64_INTEGER_CLASS; + + /* Rule #5: If one of the classes is X87, X87UP, or COMPLEX_X87 class, + MEMORY is used. */ + if (class1 == X86_64_X87_CLASS + || class1 == X86_64_X87UP_CLASS + || class1 == X86_64_COMPLEX_X87_CLASS + || class2 == X86_64_X87_CLASS + || class2 == X86_64_X87UP_CLASS + || class2 == X86_64_COMPLEX_X87_CLASS) + return X86_64_MEMORY_CLASS; + + /* Rule #6: Otherwise class SSE is used. */ + return X86_64_SSE_CLASS; +} + +/* Classify the argument of type TYPE and mode MODE. + CLASSES will be filled by the register class used to pass each word + of the operand. The number of words is returned. In case the parameter + should be passed in memory, 0 is returned. As a special case for zero + sized containers, classes[0] will be NO_CLASS and 1 is returned. + + See the x86-64 PS ABI for details. */ + +static int +classify_argument( + ffi_type* type, + enum x86_64_reg_class classes[], + size_t byte_offset) +{ + switch (type->type) + { + case FFI_TYPE_UINT8: + case FFI_TYPE_SINT8: + case FFI_TYPE_UINT16: + case FFI_TYPE_SINT16: + case FFI_TYPE_UINT32: + case FFI_TYPE_SINT32: + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + case FFI_TYPE_POINTER: +#if 0 + if (byte_offset + type->size <= 4) + classes[0] = X86_64_INTEGERSI_CLASS; + else + classes[0] = X86_64_INTEGER_CLASS; + + return 1; +#else + { + int size = byte_offset + type->size; + + if (size <= 4) + { + classes[0] = X86_64_INTEGERSI_CLASS; + return 1; + } + else if (size <= 8) + { + classes[0] = X86_64_INTEGER_CLASS; + return 1; + } + else if (size <= 12) + { + classes[0] = X86_64_INTEGER_CLASS; + classes[1] = X86_64_INTEGERSI_CLASS; + return 2; + } + else if (size <= 16) + { + classes[0] = classes[1] = X86_64_INTEGERSI_CLASS; + return 2; + } + else + FFI_ASSERT (0); + } +#endif + + case FFI_TYPE_FLOAT: + if (byte_offset == 0) + classes[0] = X86_64_SSESF_CLASS; + else + classes[0] = X86_64_SSE_CLASS; + + return 1; + + case FFI_TYPE_DOUBLE: + classes[0] = X86_64_SSEDF_CLASS; + return 1; + + case FFI_TYPE_LONGDOUBLE: + classes[0] = X86_64_X87_CLASS; + classes[1] = X86_64_X87UP_CLASS; + return 2; + + case FFI_TYPE_STRUCT: + { + ffi_type** ptr; + int i; + enum x86_64_reg_class subclasses[MAX_CLASSES]; + const int UNITS_PER_WORD = 8; + int words = + (type->size + UNITS_PER_WORD - 1) / UNITS_PER_WORD; + + /* If the struct is larger than 16 bytes, pass it on the stack. */ + if (type->size > 16) + return 0; + + for (i = 0; i < words; i++) + classes[i] = X86_64_NO_CLASS; + + /* Merge the fields of structure. */ + for (ptr = type->elements; *ptr != NULL; ptr++) + { + byte_offset = ALIGN(byte_offset, (*ptr)->alignment); + + int num = classify_argument(*ptr, subclasses, byte_offset % 8); + + if (num == 0) + return 0; + + int pos = byte_offset / 8; + + for (i = 0; i < num; i++) + { + classes[i + pos] = + merge_classes(subclasses[i], classes[i + pos]); + } + + byte_offset += (*ptr)->size; + } + + if (words > 2) + { + /* When size > 16 bytes, if the first one isn't + X86_64_SSE_CLASS or any other ones aren't + X86_64_SSEUP_CLASS, everything should be passed in + memory. */ + if (classes[0] != X86_64_SSE_CLASS) + return 0; + + for (i = 1; i < words; i++) + if (classes[i] != X86_64_SSEUP_CLASS) + return 0; + } + + + /* Final merger cleanup. */ + for (i = 0; i < words; i++) + { + /* If one class is MEMORY, everything should be passed in + memory. */ + if (classes[i] == X86_64_MEMORY_CLASS) + return 0; + + /* The X86_64_SSEUP_CLASS should be always preceded by + X86_64_SSE_CLASS. */ + if (classes[i] == X86_64_SSEUP_CLASS + && classes[i - 1] != X86_64_SSE_CLASS + && classes[i - 1] != X86_64_SSEUP_CLASS) + { + FFI_ASSERT(i != 0); + classes[i] = X86_64_SSE_CLASS; + } + + /* X86_64_X87UP_CLASS should be preceded by X86_64_X87_CLASS. */ + if (classes[i] == X86_64_X87UP_CLASS + && classes[i - 1] != X86_64_X87_CLASS) + { + FFI_ASSERT(i != 0); + classes[i] = X86_64_SSE_CLASS; + } + } + + return words; + } + + default: + FFI_ASSERT(0); + } + + return 0; /* Never reached. */ +} + +/* Examine the argument and return set number of register required in each + class. Return zero if parameter should be passed in memory, otherwise + the number of registers. */ +static int +examine_argument( + ffi_type* type, + enum x86_64_reg_class classes[MAX_CLASSES], + _Bool in_return, + int* pngpr, + int* pnsse) +{ + int n = classify_argument(type, classes, 0); + int ngpr = 0; + int nsse = 0; + int i; + + if (n == 0) + return 0; + + for (i = 0; i < n; ++i) + { + switch (classes[i]) + { + case X86_64_INTEGER_CLASS: + case X86_64_INTEGERSI_CLASS: + ngpr++; + break; + + case X86_64_SSE_CLASS: + case X86_64_SSESF_CLASS: + case X86_64_SSEDF_CLASS: + nsse++; + break; + + case X86_64_NO_CLASS: + case X86_64_SSEUP_CLASS: + break; + + case X86_64_X87_CLASS: + case X86_64_X87UP_CLASS: + case X86_64_COMPLEX_X87_CLASS: + return in_return != 0; + + default: + abort(); + } + } + + *pngpr = ngpr; + *pnsse = nsse; + + return n; +} + +/* Perform machine dependent cif processing. */ +ffi_status +ffi_prep_cif_machdep( + ffi_cif* cif) +{ + int gprcount = 0; + int ssecount = 0; + int flags = cif->rtype->type; + int i, avn, n, ngpr, nsse; + enum x86_64_reg_class classes[MAX_CLASSES]; + size_t bytes; + + if (flags != FFI_TYPE_VOID) + { + n = examine_argument (cif->rtype, classes, 1, &ngpr, &nsse); + + if (n == 0) + { + /* The return value is passed in memory. A pointer to that + memory is the first argument. Allocate a register for it. */ + gprcount++; + + /* We don't have to do anything in asm for the return. */ + flags = FFI_TYPE_VOID; + } + else if (flags == FFI_TYPE_STRUCT) + { + /* Mark which registers the result appears in. */ + _Bool sse0 = SSE_CLASS_P(classes[0]); + _Bool sse1 = n == 2 && SSE_CLASS_P(classes[1]); + + if (sse0 && !sse1) + flags |= 1 << 8; + else if (!sse0 && sse1) + flags |= 1 << 9; + else if (sse0 && sse1) + flags |= 1 << 10; + + /* Mark the true size of the structure. */ + flags |= cif->rtype->size << 12; + } + } + + /* Go over all arguments and determine the way they should be passed. + If it's in a register and there is space for it, let that be so. If + not, add it's size to the stack byte count. */ + for (bytes = 0, i = 0, avn = cif->nargs; i < avn; i++) + { + if (examine_argument(cif->arg_types[i], classes, 0, &ngpr, &nsse) == 0 + || gprcount + ngpr > MAX_GPR_REGS + || ssecount + nsse > MAX_SSE_REGS) + { + long align = cif->arg_types[i]->alignment; + + if (align < 8) + align = 8; + + bytes = ALIGN(bytes, align); + bytes += cif->arg_types[i]->size; + } + else + { + gprcount += ngpr; + ssecount += nsse; + } + } + + if (ssecount) + flags |= 1 << 11; + + cif->flags = flags; + cif->bytes = bytes; + cif->bytes = ALIGN(bytes,8); + + return FFI_OK; +} + +void +ffi_call( + ffi_cif* cif, + void (*fn)(), + void* rvalue, + void** avalue) +{ + enum x86_64_reg_class classes[MAX_CLASSES]; + char* stack; + char* argp; + ffi_type** arg_types; + int gprcount, ssecount, ngpr, nsse, i, avn; + _Bool ret_in_memory; + RegisterArgs* reg_args; + + /* Can't call 32-bit mode from 64-bit mode. */ + FFI_ASSERT(cif->abi == FFI_UNIX64); + + /* If the return value is a struct and we don't have a return value + address then we need to make one. Note the setting of flags to + VOID above in ffi_prep_cif_machdep. */ + ret_in_memory = (cif->rtype->type == FFI_TYPE_STRUCT + && (cif->flags & 0xff) == FFI_TYPE_VOID); + + if (rvalue == NULL && ret_in_memory) + rvalue = alloca (cif->rtype->size); + + /* Allocate the space for the arguments, plus 4 words of temp space. */ + stack = alloca(sizeof(RegisterArgs) + cif->bytes + 4 * 8); + reg_args = (RegisterArgs*)stack; + argp = stack + sizeof(RegisterArgs); + + gprcount = ssecount = 0; + + /* If the return value is passed in memory, add the pointer as the + first integer argument. */ + if (ret_in_memory) + reg_args->gpr[gprcount++] = (long) rvalue; + + avn = cif->nargs; + arg_types = cif->arg_types; + + for (i = 0; i < avn; ++i) + { + size_t size = arg_types[i]->size; + int n; + + n = examine_argument (arg_types[i], classes, 0, &ngpr, &nsse); + + if (n == 0 + || gprcount + ngpr > MAX_GPR_REGS + || ssecount + nsse > MAX_SSE_REGS) + { + long align = arg_types[i]->alignment; + + /* Stack arguments are *always* at least 8 byte aligned. */ + if (align < 8) + align = 8; + + /* Pass this argument in memory. */ + argp = (void *) ALIGN (argp, align); + memcpy (argp, avalue[i], size); + argp += size; + } + else + { /* The argument is passed entirely in registers. */ + char *a = (char *) avalue[i]; + int j; + + for (j = 0; j < n; j++, a += 8, size -= 8) + { + switch (classes[j]) + { + case X86_64_INTEGER_CLASS: + case X86_64_INTEGERSI_CLASS: + reg_args->gpr[gprcount] = 0; + switch (arg_types[i]->type) { + case FFI_TYPE_SINT8: + { + int8_t shortval = *(int8_t*)a; + int64_t actval = (int64_t)shortval; + reg_args->gpr[gprcount] = actval; + /*memcpy (®_args->gpr[gprcount], &actval, 8);*/ + break; + } + + case FFI_TYPE_SINT16: + { + int16_t shortval = *(int16_t*)a; + int64_t actval = (int64_t)shortval; + memcpy (®_args->gpr[gprcount], &actval, 8); + break; + } + + case FFI_TYPE_SINT32: + { + int32_t shortval = *(int32_t*)a; + int64_t actval = (int64_t)shortval; + memcpy (®_args->gpr[gprcount], &actval, 8); + break; + } + + case FFI_TYPE_UINT8: + { + u_int8_t shortval = *(u_int8_t*)a; + u_int64_t actval = (u_int64_t)shortval; + /*memcpy (®_args->gpr[gprcount], &actval, 8);*/ + reg_args->gpr[gprcount] = actval; + break; + } + + case FFI_TYPE_UINT16: + { + u_int16_t shortval = *(u_int16_t*)a; + u_int64_t actval = (u_int64_t)shortval; + memcpy (®_args->gpr[gprcount], &actval, 8); + break; + } + + case FFI_TYPE_UINT32: + { + u_int32_t shortval = *(u_int32_t*)a; + u_int64_t actval = (u_int64_t)shortval; + memcpy (®_args->gpr[gprcount], &actval, 8); + break; + } + + default: + //memcpy (®_args->gpr[gprcount], a, size < 8 ? size : 8); + reg_args->gpr[gprcount] = *(int64_t*)a; + } + gprcount++; + break; + + case X86_64_SSE_CLASS: + case X86_64_SSEDF_CLASS: + reg_args->sse[ssecount++] = *(UINT64 *) a; + break; + + case X86_64_SSESF_CLASS: + reg_args->sse[ssecount++] = *(UINT32 *) a; + break; + + default: + abort(); + } + } + } + } + + ffi_call_unix64 (stack, cif->bytes + sizeof(RegisterArgs), + cif->flags, rvalue, fn, ssecount); +} + +extern void ffi_closure_unix64(void); + +ffi_status +ffi_prep_closure( + ffi_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif*, void*, void**, void*), + void* user_data) +{ + if (cif->abi != FFI_UNIX64) + return FFI_BAD_ABI; + + volatile unsigned short* tramp = + (volatile unsigned short*)&closure->tramp[0]; + + tramp[0] = 0xbb49; /* mov , %r11 */ + *(void* volatile*)&tramp[1] = ffi_closure_unix64; + tramp[5] = 0xba49; /* mov , %r10 */ + *(void* volatile*)&tramp[6] = closure; + + /* Set the carry bit if the function uses any sse registers. + This is clc or stc, together with the first byte of the jmp. */ + tramp[10] = cif->flags & (1 << 11) ? 0x49f9 : 0x49f8; + tramp[11] = 0xe3ff; /* jmp *%r11 */ + + closure->cif = cif; + closure->fun = fun; + closure->user_data = user_data; + + return FFI_OK; +} + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wmissing-prototypes" +int +ffi_closure_unix64_inner( + ffi_closure* closure, + void* rvalue, + RegisterArgs* reg_args, + char* argp) +#pragma clang diagnostic pop +{ + ffi_cif* cif = closure->cif; + void** avalue = alloca(cif->nargs * sizeof(void *)); + ffi_type** arg_types; + long i, avn; + int gprcount = 0; + int ssecount = 0; + int ngpr, nsse; + int ret; + + ret = cif->rtype->type; + + if (ret != FFI_TYPE_VOID) + { + enum x86_64_reg_class classes[MAX_CLASSES]; + int n = examine_argument (cif->rtype, classes, 1, &ngpr, &nsse); + + if (n == 0) + { + /* The return value goes in memory. Arrange for the closure + return value to go directly back to the original caller. */ + rvalue = (void *) reg_args->gpr[gprcount++]; + + /* We don't have to do anything in asm for the return. */ + ret = FFI_TYPE_VOID; + } + else if (ret == FFI_TYPE_STRUCT && n == 2) + { + /* Mark which register the second word of the structure goes in. */ + _Bool sse0 = SSE_CLASS_P (classes[0]); + _Bool sse1 = SSE_CLASS_P (classes[1]); + + if (!sse0 && sse1) + ret |= 1 << 8; + else if (sse0 && !sse1) + ret |= 1 << 9; + } + } + + avn = cif->nargs; + arg_types = cif->arg_types; + + for (i = 0; i < avn; ++i) + { + enum x86_64_reg_class classes[MAX_CLASSES]; + int n; + + n = examine_argument (arg_types[i], classes, 0, &ngpr, &nsse); + + if (n == 0 + || gprcount + ngpr > MAX_GPR_REGS + || ssecount + nsse > MAX_SSE_REGS) + { + long align = arg_types[i]->alignment; + + /* Stack arguments are *always* at least 8 byte aligned. */ + if (align < 8) + align = 8; + + /* Pass this argument in memory. */ + argp = (void *) ALIGN (argp, align); + avalue[i] = argp; + argp += arg_types[i]->size; + } + +#if !defined(X86_DARWIN) + /* If the argument is in a single register, or two consecutive + registers, then we can use that address directly. */ + else if (n == 1 || (n == 2 && + SSE_CLASS_P (classes[0]) == SSE_CLASS_P (classes[1]))) + { + // The argument is in a single register. + if (SSE_CLASS_P (classes[0])) + { + avalue[i] = ®_args->sse[ssecount]; + ssecount += n; + } + else + { + avalue[i] = ®_args->gpr[gprcount]; + gprcount += n; + } + } +#endif + + /* Otherwise, allocate space to make them consecutive. */ + else + { + char *a = alloca (16); + int j; + + avalue[i] = a; + + for (j = 0; j < n; j++, a += 8) + { + if (SSE_CLASS_P (classes[j])) + memcpy (a, ®_args->sse[ssecount++], 8); + else + memcpy (a, ®_args->gpr[gprcount++], 8); + } + } + } + + /* Invoke the closure. */ + closure->fun (cif, rvalue, avalue, closure->user_data); + + /* Tell assembly how to perform return type promotions. */ + return ret; +} + +#endif /* __x86_64__ */ diff -r -u ./Modules/_ctypes/libffi_osx/x86/x86-ffi_darwin.c ./Modules/_ctypes/libffi_osx/x86/x86-ffi_darwin.c new file mode 100644 index 0000000..706ea0f --- /dev/null +++ ./Modules/_ctypes/libffi_osx/x86/x86-ffi_darwin.c @@ -0,0 +1,438 @@ +#ifdef __i386__ +/* ----------------------------------------------------------------------- + ffi.c - Copyright (c) 1996, 1998, 1999, 2001 Red Hat, Inc. + Copyright (c) 2002 Ranjit Mathew + Copyright (c) 2002 Bo Thorsen + Copyright (c) 2002 Roger Sayle + + x86 Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#include +#include + +#include + +/* ffi_prep_args is called by the assembly routine once stack space + has been allocated for the function's arguments */ + +void ffi_prep_args(char *stack, extended_cif *ecif); + +void ffi_prep_args(char *stack, extended_cif *ecif) +{ + register unsigned int i; + register void **p_argv; + register char *argp; + register ffi_type **p_arg; + + argp = stack; + + if (ecif->cif->flags == FFI_TYPE_STRUCT) + { + *(void **) argp = ecif->rvalue; + argp += 4; + } + + p_argv = ecif->avalue; + + for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; + i != 0; + i--, p_arg++) + { + size_t z; + + /* Align if necessary */ + if ((sizeof(int) - 1) & (unsigned) argp) + argp = (char *) ALIGN(argp, sizeof(int)); + + z = (*p_arg)->size; + if (z < sizeof(int)) + { + z = sizeof(int); + switch ((*p_arg)->type) + { + case FFI_TYPE_SINT8: + *(signed int *) argp = (signed int)*(SINT8 *)(* p_argv); + break; + + case FFI_TYPE_UINT8: + *(unsigned int *) argp = (unsigned int)*(UINT8 *)(* p_argv); + break; + + case FFI_TYPE_SINT16: + *(signed int *) argp = (signed int)*(SINT16 *)(* p_argv); + break; + + case FFI_TYPE_UINT16: + *(unsigned int *) argp = (unsigned int)*(UINT16 *)(* p_argv); + break; + + case FFI_TYPE_SINT32: + *(signed int *) argp = (signed int)*(SINT32 *)(* p_argv); + break; + + case FFI_TYPE_UINT32: + *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv); + break; + + case FFI_TYPE_STRUCT: + *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv); + break; + + default: + FFI_ASSERT(0); + } + } + else + { + memcpy(argp, *p_argv, z); + } + p_argv++; + argp += z; + } + + return; +} + +/* Perform machine dependent cif processing */ +ffi_status ffi_prep_cif_machdep(ffi_cif *cif) +{ + /* Set the return type flag */ + switch (cif->rtype->type) + { + case FFI_TYPE_VOID: +#ifdef X86 + case FFI_TYPE_STRUCT: + case FFI_TYPE_UINT8: + case FFI_TYPE_UINT16: + case FFI_TYPE_SINT8: + case FFI_TYPE_SINT16: +#endif + + case FFI_TYPE_SINT64: + case FFI_TYPE_FLOAT: + case FFI_TYPE_DOUBLE: + case FFI_TYPE_LONGDOUBLE: + cif->flags = (unsigned) cif->rtype->type; + break; + + case FFI_TYPE_UINT64: + cif->flags = FFI_TYPE_SINT64; + break; + +#ifndef X86 + case FFI_TYPE_STRUCT: + if (cif->rtype->size == 1) + { + cif->flags = FFI_TYPE_SINT8; /* same as char size */ + } + else if (cif->rtype->size == 2) + { + cif->flags = FFI_TYPE_SINT16; /* same as short size */ + } + else if (cif->rtype->size == 4) + { + cif->flags = FFI_TYPE_INT; /* same as int type */ + } + else if (cif->rtype->size == 8) + { + cif->flags = FFI_TYPE_SINT64; /* same as int64 type */ + } + else + { + cif->flags = FFI_TYPE_STRUCT; + } + break; +#endif + + default: + cif->flags = FFI_TYPE_INT; + break; + } + +#ifdef X86_DARWIN + cif->bytes = (cif->bytes + 15) & ~0xF; +#endif + + return FFI_OK; +} + +extern void ffi_call_SYSV(void (*)(char *, extended_cif *), extended_cif *, + unsigned, unsigned, unsigned *, void (*fn)()); + +#ifdef X86_WIN32 +extern void ffi_call_STDCALL(void (*)(char *, extended_cif *), extended_cif *, + unsigned, unsigned, unsigned *, void (*fn)()); + +#endif /* X86_WIN32 */ + +void ffi_call(ffi_cif *cif, void (*fn)(), void *rvalue, void **avalue) +{ + extended_cif ecif; + + ecif.cif = cif; + ecif.avalue = avalue; + + /* If the return value is a struct and we don't have a return */ + /* value address then we need to make one */ + + if ((rvalue == NULL) && + (cif->flags == FFI_TYPE_STRUCT)) + { + ecif.rvalue = alloca(cif->rtype->size); + } + else + ecif.rvalue = rvalue; + + + switch (cif->abi) + { + case FFI_SYSV: + ffi_call_SYSV(ffi_prep_args, &ecif, cif->bytes, cif->flags, ecif.rvalue, + fn); + break; +#ifdef X86_WIN32 + case FFI_STDCALL: + ffi_call_STDCALL(ffi_prep_args, &ecif, cif->bytes, cif->flags, + ecif.rvalue, fn); + break; +#endif /* X86_WIN32 */ + default: + FFI_ASSERT(0); + break; + } +} + + +/** private members **/ + +static void ffi_prep_incoming_args_SYSV (char *stack, void **ret, + void** args, ffi_cif* cif); +void FFI_HIDDEN ffi_closure_SYSV (ffi_closure *) +__attribute__ ((regparm(1))); +unsigned int FFI_HIDDEN ffi_closure_SYSV_inner (ffi_closure *, void **, void *) +__attribute__ ((regparm(1))); +void FFI_HIDDEN ffi_closure_raw_SYSV (ffi_raw_closure *) +__attribute__ ((regparm(1))); + +/* This function is jumped to by the trampoline */ + +unsigned int FFI_HIDDEN +ffi_closure_SYSV_inner (closure, respp, args) +ffi_closure *closure; +void **respp; +void *args; +{ + // our various things... + ffi_cif *cif; + void **arg_area; + + cif = closure->cif; + arg_area = (void**) alloca (cif->nargs * sizeof (void*)); + + /* this call will initialize ARG_AREA, such that each + * element in that array points to the corresponding + * value on the stack; and if the function returns + * a structure, it will re-set RESP to point to the + * structure return address. */ + + ffi_prep_incoming_args_SYSV(args, respp, arg_area, cif); + + (closure->fun) (cif, *respp, arg_area, closure->user_data); + + return cif->flags; +} + +static void +ffi_prep_incoming_args_SYSV(char *stack, void **rvalue, void **avalue, + ffi_cif *cif) +{ + register unsigned int i; + register void **p_argv; + register char *argp; + register ffi_type **p_arg; + + argp = stack; + + if ( cif->flags == FFI_TYPE_STRUCT ) { + *rvalue = *(void **) argp; + argp += 4; + } + + p_argv = avalue; + + for (i = cif->nargs, p_arg = cif->arg_types; (i != 0); i--, p_arg++) + { + size_t z; + + /* Align if necessary */ + if ((sizeof(int) - 1) & (unsigned) argp) { + argp = (char *) ALIGN(argp, sizeof(int)); + } + + z = (*p_arg)->size; + + /* because we're little endian, this is what it turns into. */ + + *p_argv = (void*) argp; + + p_argv++; + argp += z; + } + + return; +} + +/* How to make a trampoline. Derived from gcc/config/i386/i386.c. */ + +#define FFI_INIT_TRAMPOLINE(TRAMP,FUN,CTX) \ +({ unsigned char *__tramp = (unsigned char*)(TRAMP); \ +unsigned int __fun = (unsigned int)(FUN); \ +unsigned int __ctx = (unsigned int)(CTX); \ +unsigned int __dis = __fun - (__ctx + FFI_TRAMPOLINE_SIZE); \ +*(unsigned char*) &__tramp[0] = 0xb8; \ +*(unsigned int*) &__tramp[1] = __ctx; /* movl __ctx, %eax */ \ +*(unsigned char *) &__tramp[5] = 0xe9; \ +*(unsigned int*) &__tramp[6] = __dis; /* jmp __fun */ \ +}) + + +/* the cif must already be prep'ed */ +ffi_status +ffi_prep_closure (ffi_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif*,void*,void**,void*), + void *user_data) +{ + if (cif->abi != FFI_SYSV) + return FFI_BAD_ABI; + + FFI_INIT_TRAMPOLINE (&closure->tramp[0], \ + &ffi_closure_SYSV, \ + (void*)closure); + + closure->cif = cif; + closure->user_data = user_data; + closure->fun = fun; + + return FFI_OK; +} + +/* ------- Native raw API support -------------------------------- */ + +#if !FFI_NO_RAW_API + +ffi_status +ffi_prep_raw_closure_loc (ffi_raw_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif*,void*,ffi_raw*,void*), + void *user_data, + void *codeloc) +{ + int i; + + FFI_ASSERT (cif->abi == FFI_SYSV); + + // we currently don't support certain kinds of arguments for raw + // closures. This should be implemented by a separate assembly language + // routine, since it would require argument processing, something we + // don't do now for performance. + + for (i = cif->nargs-1; i >= 0; i--) + { + FFI_ASSERT (cif->arg_types[i]->type != FFI_TYPE_STRUCT); + FFI_ASSERT (cif->arg_types[i]->type != FFI_TYPE_LONGDOUBLE); + } + + + FFI_INIT_TRAMPOLINE (&closure->tramp[0], &ffi_closure_raw_SYSV, + codeloc); + + closure->cif = cif; + closure->user_data = user_data; + closure->fun = fun; + + return FFI_OK; +} + +static void +ffi_prep_args_raw(char *stack, extended_cif *ecif) +{ + memcpy (stack, ecif->avalue, ecif->cif->bytes); +} + +/* we borrow this routine from libffi (it must be changed, though, to + * actually call the function passed in the first argument. as of + * libffi-1.20, this is not the case.) + */ + +extern void +ffi_call_SYSV(void (*)(char *, extended_cif *), extended_cif *, unsigned, + unsigned, unsigned *, void (*fn)()); + +#ifdef X86_WIN32 +extern void +ffi_call_STDCALL(void (*)(char *, extended_cif *), extended_cif *, unsigned, + unsigned, unsigned *, void (*fn)()); +#endif /* X86_WIN32 */ + +void +ffi_raw_call(ffi_cif *cif, void (*fn)(), void *rvalue, ffi_raw *fake_avalue) +{ + extended_cif ecif; + void **avalue = (void **)fake_avalue; + + ecif.cif = cif; + ecif.avalue = avalue; + + /* If the return value is a struct and we don't have a return */ + /* value address then we need to make one */ + + if ((rvalue == NULL) && + (cif->rtype->type == FFI_TYPE_STRUCT)) + { + ecif.rvalue = alloca(cif->rtype->size); + } + else + ecif.rvalue = rvalue; + + + switch (cif->abi) + { + case FFI_SYSV: + ffi_call_SYSV(ffi_prep_args_raw, &ecif, cif->bytes, cif->flags, + ecif.rvalue, fn); + break; +#ifdef X86_WIN32 + case FFI_STDCALL: + ffi_call_STDCALL(ffi_prep_args_raw, &ecif, cif->bytes, cif->flags, + ecif.rvalue, fn); + break; +#endif /* X86_WIN32 */ + default: + FFI_ASSERT(0); + break; + } +} + +#endif +#endif // __i386__ diff -r -u ./setup.py ./setup.py index 46b92fe..2bf6b4b 100644 --- ./setup.py +++ ./setup.py @@ -98,8 +98,14 @@ class PyBuildExt(build_ext): self.detect_modules() # Remove modules that are present on the disabled list - self.extensions = [ext for ext in self.extensions - if ext.name not in disabled_module_list] + extensions = [ext for ext in self.extensions + if ext.name not in disabled_module_list] + # move ctypes to the end, it depends on other modules + ext_map = dict((ext.name, i) for i, ext in enumerate(extensions)) + if "_ctypes" in ext_map: + ctypes = extensions.pop(ext_map["_ctypes"]) + extensions.append(ctypes) + self.extensions = extensions # Fix up the autodetected modules, prefixing all the source files # with Modules/ and adding Python's include directory to the path. @@ -1330,9 +1336,39 @@ class PyBuildExt(build_ext): # *** Uncomment these for TOGL extension only: # -lGL -lGLU -lXext -lXmu \ + def configure_ctypes_darwin(self, ext): + # Darwin (OS X) uses preconfigured files, in + # the Modules/_ctypes/libffi_osx directory. + srcdir = sysconfig.get_config_var('srcdir') + ffi_srcdir = os.path.abspath(os.path.join(srcdir, 'Modules', + '_ctypes', 'libffi_osx')) + sources = [os.path.join(ffi_srcdir, p) + for p in ['ffi.c', + 'x86/darwin64.S', + 'x86/x86-darwin.S', + 'x86/x86-ffi_darwin.c', + 'x86/x86-ffi64.c', + 'powerpc/ppc-darwin.S', + 'powerpc/ppc-darwin_closure.S', + 'powerpc/ppc-ffi_darwin.c', + 'powerpc/ppc64-darwin_closure.S', + ]] + + # Add .S (preprocessed assembly) to C compiler source extensions. + self.compiler.src_extensions.append('.S') + + include_dirs = [os.path.join(ffi_srcdir, 'include'), + os.path.join(ffi_srcdir, 'powerpc')] + ext.include_dirs.extend(include_dirs) + ext.sources.extend(sources) + return True + def configure_ctypes(self, ext): if not self.use_system_libffi: - (srcdir,) = sysconfig.get_config_vars('srcdir') + if sys.platform == 'darwin': + return self.configure_ctypes_darwin(ext) + + srcdir = sysconfig.get_config_var('srcdir') ffi_builddir = os.path.join(self.build_temp, 'libffi') ffi_srcdir = os.path.abspath(os.path.join(srcdir, 'Modules', '_ctypes', 'libffi')) @@ -1347,7 +1383,10 @@ class PyBuildExt(build_ext): ffi_configfile): from distutils.dir_util import mkpath mkpath(ffi_builddir) - config_args = [] + config_args = [arg for arg in sysconfig.get_config_var("CONFIG_ARGS").split() + if (('--host=' in arg) or ('--build=' in arg))] + if not self.verbose: + config_args.append("-q") # Pass empty CFLAGS because we'll just append the resulting # CFLAGS to Python's; -g or -O2 is to be avoided. @@ -1367,10 +1406,12 @@ class PyBuildExt(build_ext): self.compiler.src_extensions.append('.S') include_dirs = [os.path.join(ffi_builddir, 'include'), - ffi_builddir, ffi_srcdir] + ffi_builddir, + os.path.join(ffi_srcdir, 'src')] extra_compile_args = fficonfig['ffi_cflags'].split() - ext.sources.extend(fficonfig['ffi_sources']) + ext.sources.extend(os.path.join(ffi_srcdir, f) for f in + fficonfig['ffi_sources']) ext.include_dirs.extend(include_dirs) ext.extra_compile_args.extend(extra_compile_args) return True @@ -1390,6 +1431,7 @@ class PyBuildExt(build_ext): if sys.platform == 'darwin': sources.append('_ctypes/darwin/dlfcn_simple.c') + extra_compile_args.append('-DMACOSX') include_dirs.append('_ctypes/darwin') # XXX Is this still needed? ## extra_link_args.extend(['-read_only_relocs', 'warning']) @@ -1419,7 +1461,14 @@ class PyBuildExt(build_ext): if not '--with-system-ffi' in sysconfig.get_config_var("CONFIG_ARGS"): return - ffi_inc = find_file('ffi.h', [], inc_dirs) + if sys.platform == 'darwin': + # OS X 10.5 comes with libffi.dylib; the include files are + # in /usr/include/ffi + inc_dirs.append('/usr/include/ffi') + + ffi_inc = [sysconfig.get_config_var("LIBFFI_INCLUDEDIR")] + if not ffi_inc or ffi_inc[0] == '': + ffi_inc = find_file('ffi.h', [], inc_dirs) if ffi_inc is not None: ffi_h = ffi_inc[0] + '/ffi.h' fp = open(ffi_h) 005_osx_failed_modules.patch000066400000000000000000000076331517431316200353460ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.5.6/Python-2.5.6diff -r -u ./Mac/Modules/cg/_CGmodule.c ./Mac/Modules/cg/_CGmodule.c index 8115614..e36fce9 100755 --- ./Mac/Modules/cg/_CGmodule.c +++ ./Mac/Modules/cg/_CGmodule.c @@ -1025,6 +1025,7 @@ static PyObject *CGContextRefObj_CGContextSetShouldAntialias(CGContextRefObject return _res; } +#ifndef __LP64__ static PyObject *CGContextRefObj_SyncCGContextOriginWithPort(CGContextRefObject *_self, PyObject *_args) { PyObject *_res = NULL; @@ -1055,6 +1056,7 @@ static PyObject *CGContextRefObj_ClipCGContextToRegion(CGContextRefObject *_self _res = Py_None; return _res; } +#endif static PyMethodDef CGContextRefObj_methods[] = { {"CGContextSaveGState", (PyCFunction)CGContextRefObj_CGContextSaveGState, 1, @@ -1173,10 +1175,12 @@ static PyMethodDef CGContextRefObj_methods[] = { PyDoc_STR("() -> None")}, {"CGContextSetShouldAntialias", (PyCFunction)CGContextRefObj_CGContextSetShouldAntialias, 1, PyDoc_STR("(int shouldAntialias) -> None")}, +#ifndef __LP64__ {"SyncCGContextOriginWithPort", (PyCFunction)CGContextRefObj_SyncCGContextOriginWithPort, 1, PyDoc_STR("(CGrafPtr port) -> None")}, {"ClipCGContextToRegion", (PyCFunction)CGContextRefObj_ClipCGContextToRegion, 1, PyDoc_STR("(Rect portRect, RgnHandle region) -> None")}, +#endif {NULL, NULL, 0} }; @@ -1254,6 +1258,7 @@ PyTypeObject CGContextRef_Type = { /* ------------------ End object type CGContextRef ------------------ */ +#ifndef __LP64__ static PyObject *CG_CreateCGContextForPort(PyObject *_self, PyObject *_args) { PyObject *_res = NULL; @@ -1271,10 +1276,13 @@ static PyObject *CG_CreateCGContextForPort(PyObject *_self, PyObject *_args) return _res; } +#endif static PyMethodDef CG_methods[] = { +#ifndef __LP64__ {"CreateCGContextForPort", (PyCFunction)CG_CreateCGContextForPort, 1, PyDoc_STR("(CGrafPtr) -> CGContextRef")}, +#endif {NULL, NULL, 0} }; diff -r -u ./Modules/_curses_panel.c ./Modules/_curses_panel.c index 0acf3fd..1728b59 100644 --- ./Modules/_curses_panel.c +++ ./Modules/_curses_panel.c @@ -56,7 +56,7 @@ typedef struct { PyTypeObject PyCursesPanel_Type; -#define PyCursesPanel_Check(v) ((v)->ob_type == &PyCursesPanel_Type) +#define PyCursesPanel_Check(v) (Py_TYPE(v) == &PyCursesPanel_Type) /* Some helper functions. The problem is that there's always a window associated with a panel. To ensure that Python's GC doesn't pull @@ -178,12 +178,13 @@ PyCursesPanel_New(PANEL *pan, PyCursesWindowObject *wo) po = PyObject_NEW(PyCursesPanelObject, &PyCursesPanel_Type); if (po == NULL) return NULL; po->pan = pan; - po->wo = wo; - Py_INCREF(wo); if (insert_lop(po) < 0) { - PyObject_DEL(po); - return NULL; + po->wo = NULL; + Py_DECREF(po); + return NULL; } + po->wo = wo; + Py_INCREF(wo); return (PyObject *)po; } @@ -191,8 +192,10 @@ static void PyCursesPanel_Dealloc(PyCursesPanelObject *po) { (void)del_panel(po->pan); - Py_DECREF(po->wo); - remove_lop(po); + if (po->wo != NULL) { + Py_DECREF(po->wo); + remove_lop(po); + } PyObject_DEL(po); } @@ -338,11 +341,10 @@ PyCursesPanel_GetAttr(PyCursesPanelObject *self, char *name) /* -------------------------------------------------------*/ PyTypeObject PyCursesPanel_Type = { - PyObject_HEAD_INIT(NULL) - 0, /*ob_size*/ - "_curses_panel.curses panel", /*tp_name*/ - sizeof(PyCursesPanelObject), /*tp_basicsize*/ - 0, /*tp_itemsize*/ + PyVarObject_HEAD_INIT(NULL, 0) + "_curses_panel.curses panel", /*tp_name*/ + sizeof(PyCursesPanelObject), /*tp_basicsize*/ + 0, /*tp_itemsize*/ /* methods */ (destructor)PyCursesPanel_Dealloc, /*tp_dealloc*/ 0, /*tp_print*/ @@ -458,7 +460,7 @@ init_curses_panel(void) PyObject *m, *d, *v; /* Initialize object type */ - PyCursesPanel_Type.ob_type = &PyType_Type; + Py_TYPE(&PyCursesPanel_Type) = &PyType_Type; import_curses(); pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.6.0/000077500000000000000000000000001517431316200262065ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.6.0/Python-2.6/000077500000000000000000000000001517431316200277725ustar00rootroot00000000000000000_patch-setup.py.diff000066400000000000000000000053231517431316200340130ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.6.0/Python-2.6 # HG changeset patch # User Barry Warsaw # Date 1302190091 14400 # Node ID bd0f73a9538e05f526feaf05821e68bdcff498fa # Parent 2e4cdaffe493e879fb5367a4aa454491de451137 Backport for Python 2.7 of issue 11715 support for building Python on multiarch Debian/Ubuntu. diff -r -u setup.py setup.py --- setup.py.orig +++ setup.py @@ -15,6 +15,7 @@ from distutils.command.build_ext import build_ext from distutils.command.install import install from distutils.command.install_lib import install_lib +from distutils.spawn import find_executable # This global variable is used to hold the list of modules to be disabled. disabled_module_list = [] @@ -308,10 +309,33 @@ class PyBuildExt(build_ext): return platform return sys.platform + def add_multiarch_paths(self): + # Debian/Ubuntu multiarch support. + # https://wiki.ubuntu.com/MultiarchSpec + if not find_executable('dpkg-architecture'): + return + tmpfile = os.path.join(self.build_temp, 'multiarch') + if not os.path.exists(self.build_temp): + os.makedirs(self.build_temp) + ret = os.system( + 'dpkg-architecture -qDEB_HOST_MULTIARCH > %s 2> /dev/null' % + tmpfile) + try: + if ret >> 8 == 0: + with open(tmpfile) as fp: + multiarch_path_component = fp.readline().strip() + add_dir_to_list(self.compiler.library_dirs, + '/usr/lib/' + multiarch_path_component) + add_dir_to_list(self.compiler.include_dirs, + '/usr/include/' + multiarch_path_component) + finally: + os.unlink(tmpfile) + def detect_modules(self): # Ensure that /usr/local is always used add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib') add_dir_to_list(self.compiler.include_dirs, '/usr/local/include') + self.add_multiarch_paths() # Add paths specified in the environment variables LDFLAGS and # CPPFLAGS for header and library files. @@ -1308,14 +1332,13 @@ # Platform-specific libraries - if platform == 'linux2': + if platform.startswith('linux'): # Linux-specific modules exts.append( Extension('linuxaudiodev', ['linuxaudiodev.c']) ) else: missing.append('linuxaudiodev') - if platform in ('linux2', 'freebsd4', 'freebsd5', 'freebsd6', - 'freebsd7', 'freebsd8'): + if platform.startswith('linux') or platform.startswith('freebsd'): exts.append( Extension('ossaudiodev', ['ossaudiodev.c']) ) else: missing.append('ossaudiodev') 002_readline63.patch000066400000000000000000000033001517431316200332450ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.6.0/Python-2.6diff -r -u ../Python-2.6.orig/Modules/readline.c ./Modules/readline.c --- ../Python-2.6.orig/Modules/readline.c 2013-11-10 16:36:41.000000000 +0900 +++ ./Modules/readline.c 2014-03-29 16:17:48.643305752 +0900 @@ -174,8 +174,7 @@ if (!PyArg_ParseTuple(args, buf, &function)) return NULL; if (function == Py_None) { - Py_XDECREF(*hook_var); - *hook_var = NULL; + Py_CLEAR(*hook_var); } else if (PyCallable_Check(function)) { PyObject *tmp = *hook_var; @@ -647,14 +646,22 @@ } static int +#if defined(_RL_FUNCTION_TYPEDEF) on_startup_hook(void) +#else +on_startup_hook() +#endif { return on_hook(startup_hook); } #ifdef HAVE_RL_PRE_INPUT_HOOK static int +#if defined(_RL_FUNCTION_TYPEDEF) on_pre_input_hook(void) +#else +on_pre_input_hook() +#endif { return on_hook(pre_input_hook); } @@ -749,7 +756,7 @@ * before calling the normal completer */ static char ** -flex_complete(char *text, int start, int end) +flex_complete(const char *text, int start, int end) { Py_XDECREF(begidx); Py_XDECREF(endidx); @@ -783,12 +790,12 @@ rl_bind_key_in_map ('\t', rl_complete, emacs_meta_keymap); rl_bind_key_in_map ('\033', rl_complete, emacs_meta_keymap); /* Set our hook functions */ - rl_startup_hook = (Function *)on_startup_hook; + rl_startup_hook = on_startup_hook; #ifdef HAVE_RL_PRE_INPUT_HOOK - rl_pre_input_hook = (Function *)on_pre_input_hook; + rl_pre_input_hook = on_pre_input_hook; #endif /* Set our completion function */ - rl_attempted_completion_function = (CPPFunction *)flex_complete; + rl_attempted_completion_function = flex_complete; /* Set Python word break characters */ rl_completer_word_break_characters = strdup(" \t\n`~!@#$%^&*()-=+[{]}\\|;:'\",<>/?"); pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.6.0/Python-2.6/003_tk86.patch000066400000000000000000000013531517431316200321730ustar00rootroot00000000000000diff -r -u ../Python-2.6.orig/setup.py ./setup.py --- ../Python-2.6.orig/setup.py 2013-10-30 00:04:39.000000000 +0900 +++ ./setup.py 2014-04-03 22:28:49.122061684 +0900 @@ -1541,7 +1541,7 @@ # The versions with dots are used on Unix, and the versions without # dots on Windows, for detection by cygwin. tcllib = tklib = tcl_includes = tk_includes = None - for version in ['8.5', '85', '8.4', '84', '8.3', '83', '8.2', + for version in ['8.6', '86', '8.5', '85', '8.4', '84', '8.3', '83', '82', '8.1', '81', '8.0', '80']: tklib = self.compiler.find_library_file(lib_dirs, 'tk' + version) tcllib = self.compiler.find_library_file(lib_dirs, 'tcl' + version) 010_ssl_no_ssl2_no_ssl3.patch000066400000000000000000000061071517431316200352200ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.6.0/Python-2.6diff -r -u ../Python-2.6.4.orig/Lib/ssl.py ./Lib/ssl.py --- ../Python-2.6.4.orig/Lib/ssl.py 2012-04-10 15:32:06.000000000 +0000 +++ ./Lib/ssl.py 2015-12-18 14:46:36.487188331 +0000 @@ -61,18 +61,24 @@ from _ssl import SSLError from _ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED -from _ssl import PROTOCOL_SSLv2, PROTOCOL_SSLv3, PROTOCOL_SSLv23, PROTOCOL_TLSv1 -from _ssl import RAND_status, RAND_egd, RAND_add -from _ssl import \ - SSL_ERROR_ZERO_RETURN, \ - SSL_ERROR_WANT_READ, \ - SSL_ERROR_WANT_WRITE, \ - SSL_ERROR_WANT_X509_LOOKUP, \ - SSL_ERROR_SYSCALL, \ - SSL_ERROR_SSL, \ - SSL_ERROR_WANT_CONNECT, \ - SSL_ERROR_EOF, \ - SSL_ERROR_INVALID_ERROR_CODE +from _ssl import RAND_status, RAND_add +try: + from _ssl import RAND_egd +except ImportError: + # LibreSSL does not provide RAND_egd + pass + +def _import_symbols(prefix): + for n in dir(_ssl): + if n.startswith(prefix): + globals()[n] = getattr(_ssl, n) + +_import_symbols('OP_') +_import_symbols('ALERT_DESCRIPTION_') +_import_symbols('SSL_ERROR_') +_import_symbols('PROTOCOL_') + +_PROTOCOL_NAMES = dict([(value, name) for name, value in globals().items() if name.startswith('PROTOCOL_')]) from socket import socket, _fileobject from socket import getnameinfo as _getnameinfo @@ -394,7 +400,7 @@ d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)] return base64.decodestring(d) -def get_server_certificate (addr, ssl_version=PROTOCOL_SSLv3, ca_certs=None): +def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None): """Retrieve the certificate from the server at the specified address, and return it as a PEM-encoded string. diff -r -u ../Python-2.6.4.orig/Modules/_ssl.c ./Modules/_ssl.c --- ../Python-2.6.4.orig/Modules/_ssl.c 2012-04-10 15:32:09.000000000 +0000 +++ ./Modules/_ssl.c 2015-12-18 14:45:30.419597074 +0000 @@ -61,8 +61,12 @@ }; enum py_ssl_version { +#ifndef OPENSSL_NO_SSL2 PY_SSL_VERSION_SSL2, +#endif +#ifndef OPENSSL_NO_SSL3 PY_SSL_VERSION_SSL3, +#endif PY_SSL_VERSION_SSL23, PY_SSL_VERSION_TLS1, }; @@ -298,10 +302,14 @@ PySSL_BEGIN_ALLOW_THREADS if (proto_version == PY_SSL_VERSION_TLS1) self->ctx = SSL_CTX_new(TLSv1_method()); /* Set up context */ +#ifndef OPENSSL_NO_SSL3 else if (proto_version == PY_SSL_VERSION_SSL3) self->ctx = SSL_CTX_new(SSLv3_method()); /* Set up context */ +#endif +#ifndef OPENSSL_NO_SSL2 else if (proto_version == PY_SSL_VERSION_SSL2) self->ctx = SSL_CTX_new(SSLv2_method()); /* Set up context */ +#endif else if (proto_version == PY_SSL_VERSION_SSL23) self->ctx = SSL_CTX_new(SSLv23_method()); /* Set up context */ PySSL_END_ALLOW_THREADS @@ -1627,10 +1635,14 @@ PY_SSL_CERT_REQUIRED); /* protocol versions */ +#ifndef OPENSSL_NO_SSL2 PyModule_AddIntConstant(m, "PROTOCOL_SSLv2", PY_SSL_VERSION_SSL2); +#endif +#ifndef OPENSSL_NO_SSL3 PyModule_AddIntConstant(m, "PROTOCOL_SSLv3", PY_SSL_VERSION_SSL3); +#endif PyModule_AddIntConstant(m, "PROTOCOL_SSLv23", PY_SSL_VERSION_SSL23); PyModule_AddIntConstant(m, "PROTOCOL_TLSv1", pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.6.1/000077500000000000000000000000001517431316200262075ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.6.1/Python-2.6.1/000077500000000000000000000000001517431316200301325ustar00rootroot00000000000000000_patch-setup.py.diff000066400000000000000000000053231517431316200341530ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.6.1/Python-2.6.1 # HG changeset patch # User Barry Warsaw # Date 1302190091 14400 # Node ID bd0f73a9538e05f526feaf05821e68bdcff498fa # Parent 2e4cdaffe493e879fb5367a4aa454491de451137 Backport for Python 2.7 of issue 11715 support for building Python on multiarch Debian/Ubuntu. diff -r -u setup.py setup.py --- setup.py.orig +++ setup.py @@ -15,6 +15,7 @@ from distutils.command.build_ext import build_ext from distutils.command.install import install from distutils.command.install_lib import install_lib +from distutils.spawn import find_executable # This global variable is used to hold the list of modules to be disabled. disabled_module_list = [] @@ -308,10 +309,33 @@ class PyBuildExt(build_ext): return platform return sys.platform + def add_multiarch_paths(self): + # Debian/Ubuntu multiarch support. + # https://wiki.ubuntu.com/MultiarchSpec + if not find_executable('dpkg-architecture'): + return + tmpfile = os.path.join(self.build_temp, 'multiarch') + if not os.path.exists(self.build_temp): + os.makedirs(self.build_temp) + ret = os.system( + 'dpkg-architecture -qDEB_HOST_MULTIARCH > %s 2> /dev/null' % + tmpfile) + try: + if ret >> 8 == 0: + with open(tmpfile) as fp: + multiarch_path_component = fp.readline().strip() + add_dir_to_list(self.compiler.library_dirs, + '/usr/lib/' + multiarch_path_component) + add_dir_to_list(self.compiler.include_dirs, + '/usr/include/' + multiarch_path_component) + finally: + os.unlink(tmpfile) + def detect_modules(self): # Ensure that /usr/local is always used add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib') add_dir_to_list(self.compiler.include_dirs, '/usr/local/include') + self.add_multiarch_paths() # Add paths specified in the environment variables LDFLAGS and # CPPFLAGS for header and library files. @@ -1310,14 +1334,13 @@ # Platform-specific libraries - if platform == 'linux2': + if platform.startswith('linux'): # Linux-specific modules exts.append( Extension('linuxaudiodev', ['linuxaudiodev.c']) ) else: missing.append('linuxaudiodev') - if platform in ('linux2', 'freebsd4', 'freebsd5', 'freebsd6', - 'freebsd7', 'freebsd8'): + if platform.startswith('linux') or platform.startswith('freebsd'): exts.append( Extension('ossaudiodev', ['ossaudiodev.c']) ) else: missing.append('ossaudiodev') 002_readline63.patch000066400000000000000000000033041517431316200334110ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.6.1/Python-2.6.1diff -r -u ../Python-2.6.4.orig/Modules/readline.c ./Modules/readline.c --- ../Python-2.6.4.orig/Modules/readline.c 2013-11-10 16:36:41.000000000 +0900 +++ ./Modules/readline.c 2014-03-29 16:17:48.643305752 +0900 @@ -178,8 +178,7 @@ if (!PyArg_ParseTuple(args, buf, &function)) return NULL; if (function == Py_None) { - Py_XDECREF(*hook_var); - *hook_var = NULL; + Py_CLEAR(*hook_var); } else if (PyCallable_Check(function)) { PyObject *tmp = *hook_var; @@ -655,14 +655,22 @@ } static int +#if defined(_RL_FUNCTION_TYPEDEF) on_startup_hook(void) +#else +on_startup_hook() +#endif { return on_hook(startup_hook); } #ifdef HAVE_RL_PRE_INPUT_HOOK static int +#if defined(_RL_FUNCTION_TYPEDEF) on_pre_input_hook(void) +#else +on_pre_input_hook() +#endif { return on_hook(pre_input_hook); } @@ -757,7 +757,7 @@ * before calling the normal completer */ static char ** -flex_complete(char *text, int start, int end) +flex_complete(const char *text, int start, int end) { Py_XDECREF(begidx); Py_XDECREF(endidx); @@ -791,12 +791,12 @@ rl_bind_key_in_map ('\t', rl_complete, emacs_meta_keymap); rl_bind_key_in_map ('\033', rl_complete, emacs_meta_keymap); /* Set our hook functions */ - rl_startup_hook = (Function *)on_startup_hook; + rl_startup_hook = on_startup_hook; #ifdef HAVE_RL_PRE_INPUT_HOOK - rl_pre_input_hook = (Function *)on_pre_input_hook; + rl_pre_input_hook = on_pre_input_hook; #endif /* Set our completion function */ - rl_attempted_completion_function = (CPPFunction *)flex_complete; + rl_attempted_completion_function = flex_complete; /* Set Python word break characters */ rl_completer_word_break_characters = strdup(" \t\n`~!@#$%^&*()-=+[{]}\\|;:'\",<>/?"); 003_tk86.patch000066400000000000000000000013571517431316200322600ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.6.1/Python-2.6.1diff -r -u ../Python-2.6.1.orig/setup.py ./setup.py --- ../Python-2.6.1.orig/setup.py 2013-10-30 00:04:39.000000000 +0900 +++ ./setup.py 2014-04-03 22:28:49.122061684 +0900 @@ -1543,7 +1543,7 @@ # The versions with dots are used on Unix, and the versions without # dots on Windows, for detection by cygwin. tcllib = tklib = tcl_includes = tk_includes = None - for version in ['8.5', '85', '8.4', '84', '8.3', '83', '8.2', + for version in ['8.6', '86', '8.5', '85', '8.4', '84', '8.3', '83', '82', '8.1', '81', '8.0', '80']: tklib = self.compiler.find_library_file(lib_dirs, 'tk' + version) tcllib = self.compiler.find_library_file(lib_dirs, 'tcl' + version) 010_ssl_no_ssl2_no_ssl3.patch000066400000000000000000000061071517431316200353600ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.6.1/Python-2.6.1diff -r -u ../Python-2.6.4.orig/Lib/ssl.py ./Lib/ssl.py --- ../Python-2.6.4.orig/Lib/ssl.py 2012-04-10 15:32:06.000000000 +0000 +++ ./Lib/ssl.py 2015-12-18 14:46:36.487188331 +0000 @@ -61,18 +61,24 @@ from _ssl import SSLError from _ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED -from _ssl import PROTOCOL_SSLv2, PROTOCOL_SSLv3, PROTOCOL_SSLv23, PROTOCOL_TLSv1 -from _ssl import RAND_status, RAND_egd, RAND_add -from _ssl import \ - SSL_ERROR_ZERO_RETURN, \ - SSL_ERROR_WANT_READ, \ - SSL_ERROR_WANT_WRITE, \ - SSL_ERROR_WANT_X509_LOOKUP, \ - SSL_ERROR_SYSCALL, \ - SSL_ERROR_SSL, \ - SSL_ERROR_WANT_CONNECT, \ - SSL_ERROR_EOF, \ - SSL_ERROR_INVALID_ERROR_CODE +from _ssl import RAND_status, RAND_add +try: + from _ssl import RAND_egd +except ImportError: + # LibreSSL does not provide RAND_egd + pass + +def _import_symbols(prefix): + for n in dir(_ssl): + if n.startswith(prefix): + globals()[n] = getattr(_ssl, n) + +_import_symbols('OP_') +_import_symbols('ALERT_DESCRIPTION_') +_import_symbols('SSL_ERROR_') +_import_symbols('PROTOCOL_') + +_PROTOCOL_NAMES = dict([(value, name) for name, value in globals().items() if name.startswith('PROTOCOL_')]) from socket import socket, _fileobject from socket import getnameinfo as _getnameinfo @@ -394,7 +400,7 @@ d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)] return base64.decodestring(d) -def get_server_certificate (addr, ssl_version=PROTOCOL_SSLv3, ca_certs=None): +def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None): """Retrieve the certificate from the server at the specified address, and return it as a PEM-encoded string. diff -r -u ../Python-2.6.4.orig/Modules/_ssl.c ./Modules/_ssl.c --- ../Python-2.6.4.orig/Modules/_ssl.c 2012-04-10 15:32:09.000000000 +0000 +++ ./Modules/_ssl.c 2015-12-18 14:45:30.419597074 +0000 @@ -61,8 +61,12 @@ }; enum py_ssl_version { +#ifndef OPENSSL_NO_SSL2 PY_SSL_VERSION_SSL2, +#endif +#ifndef OPENSSL_NO_SSL3 PY_SSL_VERSION_SSL3, +#endif PY_SSL_VERSION_SSL23, PY_SSL_VERSION_TLS1, }; @@ -298,10 +302,14 @@ PySSL_BEGIN_ALLOW_THREADS if (proto_version == PY_SSL_VERSION_TLS1) self->ctx = SSL_CTX_new(TLSv1_method()); /* Set up context */ +#ifndef OPENSSL_NO_SSL3 else if (proto_version == PY_SSL_VERSION_SSL3) self->ctx = SSL_CTX_new(SSLv3_method()); /* Set up context */ +#endif +#ifndef OPENSSL_NO_SSL2 else if (proto_version == PY_SSL_VERSION_SSL2) self->ctx = SSL_CTX_new(SSLv2_method()); /* Set up context */ +#endif else if (proto_version == PY_SSL_VERSION_SSL23) self->ctx = SSL_CTX_new(SSLv23_method()); /* Set up context */ PySSL_END_ALLOW_THREADS @@ -1627,10 +1635,14 @@ PY_SSL_CERT_REQUIRED); /* protocol versions */ +#ifndef OPENSSL_NO_SSL2 PyModule_AddIntConstant(m, "PROTOCOL_SSLv2", PY_SSL_VERSION_SSL2); +#endif +#ifndef OPENSSL_NO_SSL3 PyModule_AddIntConstant(m, "PROTOCOL_SSLv3", PY_SSL_VERSION_SSL3); +#endif PyModule_AddIntConstant(m, "PROTOCOL_SSLv23", PY_SSL_VERSION_SSL23); PyModule_AddIntConstant(m, "PROTOCOL_TLSv1", pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.6.2/000077500000000000000000000000001517431316200262105ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.6.2/Python-2.6.2/000077500000000000000000000000001517431316200301345ustar00rootroot00000000000000000_patch-setup.py.diff000066400000000000000000000053231517431316200341550ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.6.2/Python-2.6.2 # HG changeset patch # User Barry Warsaw # Date 1302190091 14400 # Node ID bd0f73a9538e05f526feaf05821e68bdcff498fa # Parent 2e4cdaffe493e879fb5367a4aa454491de451137 Backport for Python 2.7 of issue 11715 support for building Python on multiarch Debian/Ubuntu. diff -r -u setup.py setup.py --- setup.py.orig +++ setup.py @@ -15,6 +15,7 @@ from distutils.command.build_ext import build_ext from distutils.command.install import install from distutils.command.install_lib import install_lib +from distutils.spawn import find_executable # This global variable is used to hold the list of modules to be disabled. disabled_module_list = [] @@ -308,10 +309,33 @@ class PyBuildExt(build_ext): return platform return sys.platform + def add_multiarch_paths(self): + # Debian/Ubuntu multiarch support. + # https://wiki.ubuntu.com/MultiarchSpec + if not find_executable('dpkg-architecture'): + return + tmpfile = os.path.join(self.build_temp, 'multiarch') + if not os.path.exists(self.build_temp): + os.makedirs(self.build_temp) + ret = os.system( + 'dpkg-architecture -qDEB_HOST_MULTIARCH > %s 2> /dev/null' % + tmpfile) + try: + if ret >> 8 == 0: + with open(tmpfile) as fp: + multiarch_path_component = fp.readline().strip() + add_dir_to_list(self.compiler.library_dirs, + '/usr/lib/' + multiarch_path_component) + add_dir_to_list(self.compiler.include_dirs, + '/usr/include/' + multiarch_path_component) + finally: + os.unlink(tmpfile) + def detect_modules(self): # Ensure that /usr/local is always used add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib') add_dir_to_list(self.compiler.include_dirs, '/usr/local/include') + self.add_multiarch_paths() # Add paths specified in the environment variables LDFLAGS and # CPPFLAGS for header and library files. @@ -1331,14 +1355,13 @@ # Platform-specific libraries - if platform == 'linux2': + if platform.startswith('linux'): # Linux-specific modules exts.append( Extension('linuxaudiodev', ['linuxaudiodev.c']) ) else: missing.append('linuxaudiodev') - if platform in ('linux2', 'freebsd4', 'freebsd5', 'freebsd6', - 'freebsd7', 'freebsd8'): + if platform.startswith('linux') or platform.startswith('freebsd'): exts.append( Extension('ossaudiodev', ['ossaudiodev.c']) ) else: missing.append('ossaudiodev') 002_readline63.patch000066400000000000000000000033041517431316200334130ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.6.2/Python-2.6.2diff -r -u ../Python-2.6.4.orig/Modules/readline.c ./Modules/readline.c --- ../Python-2.6.4.orig/Modules/readline.c 2013-11-10 16:36:41.000000000 +0900 +++ ./Modules/readline.c 2014-03-29 16:17:48.643305752 +0900 @@ -178,8 +178,7 @@ if (!PyArg_ParseTuple(args, buf, &function)) return NULL; if (function == Py_None) { - Py_XDECREF(*hook_var); - *hook_var = NULL; + Py_CLEAR(*hook_var); } else if (PyCallable_Check(function)) { PyObject *tmp = *hook_var; @@ -655,14 +654,22 @@ } static int +#if defined(_RL_FUNCTION_TYPEDEF) on_startup_hook(void) +#else +on_startup_hook() +#endif { return on_hook(startup_hook); } #ifdef HAVE_RL_PRE_INPUT_HOOK static int +#if defined(_RL_FUNCTION_TYPEDEF) on_pre_input_hook(void) +#else +on_pre_input_hook() +#endif { return on_hook(pre_input_hook); } @@ -757,7 +764,7 @@ * before calling the normal completer */ static char ** -flex_complete(char *text, int start, int end) +flex_complete(const char *text, int start, int end) { Py_XDECREF(begidx); Py_XDECREF(endidx); @@ -791,12 +798,12 @@ rl_bind_key_in_map ('\t', rl_complete, emacs_meta_keymap); rl_bind_key_in_map ('\033', rl_complete, emacs_meta_keymap); /* Set our hook functions */ - rl_startup_hook = (Function *)on_startup_hook; + rl_startup_hook = on_startup_hook; #ifdef HAVE_RL_PRE_INPUT_HOOK - rl_pre_input_hook = (Function *)on_pre_input_hook; + rl_pre_input_hook = on_pre_input_hook; #endif /* Set our completion function */ - rl_attempted_completion_function = (CPPFunction *)flex_complete; + rl_attempted_completion_function = flex_complete; /* Set Python word break characters */ rl_completer_word_break_characters = strdup(" \t\n`~!@#$%^&*()-=+[{]}\\|;:'\",<>/?"); 003_tk86.patch000066400000000000000000000013571517431316200322620ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.6.2/Python-2.6.2diff -r -u ../Python-2.6.2.orig/setup.py ./setup.py --- ../Python-2.6.2.orig/setup.py 2013-10-30 00:04:39.000000000 +0900 +++ ./setup.py 2014-04-03 22:28:49.122061684 +0900 @@ -1564,7 +1564,7 @@ # The versions with dots are used on Unix, and the versions without # dots on Windows, for detection by cygwin. tcllib = tklib = tcl_includes = tk_includes = None - for version in ['8.5', '85', '8.4', '84', '8.3', '83', '8.2', + for version in ['8.6', '86', '8.5', '85', '8.4', '84', '8.3', '83', '82', '8.1', '81', '8.0', '80']: tklib = self.compiler.find_library_file(lib_dirs, 'tk' + version) tcllib = self.compiler.find_library_file(lib_dirs, 'tcl' + version) 010_ssl_no_ssl2_no_ssl3.patch000066400000000000000000000061071517431316200353620ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.6.2/Python-2.6.2diff -r -u ../Python-2.6.4.orig/Lib/ssl.py ./Lib/ssl.py --- ../Python-2.6.4.orig/Lib/ssl.py 2012-04-10 15:32:06.000000000 +0000 +++ ./Lib/ssl.py 2015-12-18 14:46:36.487188331 +0000 @@ -61,18 +61,24 @@ from _ssl import SSLError from _ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED -from _ssl import PROTOCOL_SSLv2, PROTOCOL_SSLv3, PROTOCOL_SSLv23, PROTOCOL_TLSv1 -from _ssl import RAND_status, RAND_egd, RAND_add -from _ssl import \ - SSL_ERROR_ZERO_RETURN, \ - SSL_ERROR_WANT_READ, \ - SSL_ERROR_WANT_WRITE, \ - SSL_ERROR_WANT_X509_LOOKUP, \ - SSL_ERROR_SYSCALL, \ - SSL_ERROR_SSL, \ - SSL_ERROR_WANT_CONNECT, \ - SSL_ERROR_EOF, \ - SSL_ERROR_INVALID_ERROR_CODE +from _ssl import RAND_status, RAND_add +try: + from _ssl import RAND_egd +except ImportError: + # LibreSSL does not provide RAND_egd + pass + +def _import_symbols(prefix): + for n in dir(_ssl): + if n.startswith(prefix): + globals()[n] = getattr(_ssl, n) + +_import_symbols('OP_') +_import_symbols('ALERT_DESCRIPTION_') +_import_symbols('SSL_ERROR_') +_import_symbols('PROTOCOL_') + +_PROTOCOL_NAMES = dict([(value, name) for name, value in globals().items() if name.startswith('PROTOCOL_')]) from socket import socket, _fileobject from socket import getnameinfo as _getnameinfo @@ -394,7 +400,7 @@ d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)] return base64.decodestring(d) -def get_server_certificate (addr, ssl_version=PROTOCOL_SSLv3, ca_certs=None): +def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None): """Retrieve the certificate from the server at the specified address, and return it as a PEM-encoded string. diff -r -u ../Python-2.6.4.orig/Modules/_ssl.c ./Modules/_ssl.c --- ../Python-2.6.4.orig/Modules/_ssl.c 2012-04-10 15:32:09.000000000 +0000 +++ ./Modules/_ssl.c 2015-12-18 14:45:30.419597074 +0000 @@ -61,8 +61,12 @@ }; enum py_ssl_version { +#ifndef OPENSSL_NO_SSL2 PY_SSL_VERSION_SSL2, +#endif +#ifndef OPENSSL_NO_SSL3 PY_SSL_VERSION_SSL3, +#endif PY_SSL_VERSION_SSL23, PY_SSL_VERSION_TLS1, }; @@ -298,10 +302,14 @@ PySSL_BEGIN_ALLOW_THREADS if (proto_version == PY_SSL_VERSION_TLS1) self->ctx = SSL_CTX_new(TLSv1_method()); /* Set up context */ +#ifndef OPENSSL_NO_SSL3 else if (proto_version == PY_SSL_VERSION_SSL3) self->ctx = SSL_CTX_new(SSLv3_method()); /* Set up context */ +#endif +#ifndef OPENSSL_NO_SSL2 else if (proto_version == PY_SSL_VERSION_SSL2) self->ctx = SSL_CTX_new(SSLv2_method()); /* Set up context */ +#endif else if (proto_version == PY_SSL_VERSION_SSL23) self->ctx = SSL_CTX_new(SSLv23_method()); /* Set up context */ PySSL_END_ALLOW_THREADS @@ -1627,10 +1635,14 @@ PY_SSL_CERT_REQUIRED); /* protocol versions */ +#ifndef OPENSSL_NO_SSL2 PyModule_AddIntConstant(m, "PROTOCOL_SSLv2", PY_SSL_VERSION_SSL2); +#endif +#ifndef OPENSSL_NO_SSL3 PyModule_AddIntConstant(m, "PROTOCOL_SSLv3", PY_SSL_VERSION_SSL3); +#endif PyModule_AddIntConstant(m, "PROTOCOL_SSLv23", PY_SSL_VERSION_SSL23); PyModule_AddIntConstant(m, "PROTOCOL_TLSv1", pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.6.3/000077500000000000000000000000001517431316200262115ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.6.3/Python-2.6.3/000077500000000000000000000000001517431316200301365ustar00rootroot00000000000000000_patch-setup.py.diff000066400000000000000000000053231517431316200341570ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.6.3/Python-2.6.3 # HG changeset patch # User Barry Warsaw # Date 1302190091 14400 # Node ID bd0f73a9538e05f526feaf05821e68bdcff498fa # Parent 2e4cdaffe493e879fb5367a4aa454491de451137 Backport for Python 2.7 of issue 11715 support for building Python on multiarch Debian/Ubuntu. diff -r -u setup.py setup.py --- setup.py.orig +++ setup.py @@ -15,6 +15,7 @@ from distutils.command.build_ext import build_ext from distutils.command.install import install from distutils.command.install_lib import install_lib +from distutils.spawn import find_executable # This global variable is used to hold the list of modules to be disabled. disabled_module_list = [] @@ -308,10 +309,33 @@ class PyBuildExt(build_ext): return platform return sys.platform + def add_multiarch_paths(self): + # Debian/Ubuntu multiarch support. + # https://wiki.ubuntu.com/MultiarchSpec + if not find_executable('dpkg-architecture'): + return + tmpfile = os.path.join(self.build_temp, 'multiarch') + if not os.path.exists(self.build_temp): + os.makedirs(self.build_temp) + ret = os.system( + 'dpkg-architecture -qDEB_HOST_MULTIARCH > %s 2> /dev/null' % + tmpfile) + try: + if ret >> 8 == 0: + with open(tmpfile) as fp: + multiarch_path_component = fp.readline().strip() + add_dir_to_list(self.compiler.library_dirs, + '/usr/lib/' + multiarch_path_component) + add_dir_to_list(self.compiler.include_dirs, + '/usr/include/' + multiarch_path_component) + finally: + os.unlink(tmpfile) + def detect_modules(self): # Ensure that /usr/local is always used add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib') add_dir_to_list(self.compiler.include_dirs, '/usr/local/include') + self.add_multiarch_paths() # Add paths specified in the environment variables LDFLAGS and # CPPFLAGS for header and library files. @@ -1331,14 +1355,13 @@ # Platform-specific libraries - if platform == 'linux2': + if platform.startswith('linux'): # Linux-specific modules exts.append( Extension('linuxaudiodev', ['linuxaudiodev.c']) ) else: missing.append('linuxaudiodev') - if platform in ('linux2', 'freebsd4', 'freebsd5', 'freebsd6', - 'freebsd7', 'freebsd8'): + if platform.startswith('linux') or platform.startswith('freebsd'): exts.append( Extension('ossaudiodev', ['ossaudiodev.c']) ) else: missing.append('ossaudiodev') 002_readline63.patch000066400000000000000000000033041517431316200334150ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.6.3/Python-2.6.3diff -r -u ../Python-2.6.4.orig/Modules/readline.c ./Modules/readline.c --- ../Python-2.6.4.orig/Modules/readline.c 2013-11-10 16:36:41.000000000 +0900 +++ ./Modules/readline.c 2014-03-29 16:17:48.643305752 +0900 @@ -178,8 +178,7 @@ if (!PyArg_ParseTuple(args, buf, &function)) return NULL; if (function == Py_None) { - Py_XDECREF(*hook_var); - *hook_var = NULL; + Py_CLEAR(*hook_var); } else if (PyCallable_Check(function)) { PyObject *tmp = *hook_var; @@ -655,14 +654,22 @@ } static int +#if defined(_RL_FUNCTION_TYPEDEF) on_startup_hook(void) +#else +on_startup_hook() +#endif { return on_hook(startup_hook); } #ifdef HAVE_RL_PRE_INPUT_HOOK static int +#if defined(_RL_FUNCTION_TYPEDEF) on_pre_input_hook(void) +#else +on_pre_input_hook() +#endif { return on_hook(pre_input_hook); } @@ -757,7 +764,7 @@ * before calling the normal completer */ static char ** -flex_complete(char *text, int start, int end) +flex_complete(const char *text, int start, int end) { Py_XDECREF(begidx); Py_XDECREF(endidx); @@ -791,12 +798,12 @@ rl_bind_key_in_map ('\t', rl_complete, emacs_meta_keymap); rl_bind_key_in_map ('\033', rl_complete, emacs_meta_keymap); /* Set our hook functions */ - rl_startup_hook = (Function *)on_startup_hook; + rl_startup_hook = on_startup_hook; #ifdef HAVE_RL_PRE_INPUT_HOOK - rl_pre_input_hook = (Function *)on_pre_input_hook; + rl_pre_input_hook = on_pre_input_hook; #endif /* Set our completion function */ - rl_attempted_completion_function = (CPPFunction *)flex_complete; + rl_attempted_completion_function = flex_complete; /* Set Python word break characters */ rl_completer_word_break_characters = strdup(" \t\n`~!@#$%^&*()-=+[{]}\\|;:'\",<>/?"); 003_tk86.patch000066400000000000000000000013571517431316200322640ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.6.3/Python-2.6.3diff -r -u ../Python-2.6.4.orig/setup.py ./setup.py --- ../Python-2.6.4.orig/setup.py 2013-10-30 00:04:39.000000000 +0900 +++ ./setup.py 2014-04-03 22:28:49.122061684 +0900 @@ -1573,7 +1573,7 @@ # The versions with dots are used on Unix, and the versions without # dots on Windows, for detection by cygwin. tcllib = tklib = tcl_includes = tk_includes = None - for version in ['8.5', '85', '8.4', '84', '8.3', '83', '8.2', + for version in ['8.6', '86', '8.5', '85', '8.4', '84', '8.3', '83', '82', '8.1', '81', '8.0', '80']: tklib = self.compiler.find_library_file(lib_dirs, 'tk' + version) tcllib = self.compiler.find_library_file(lib_dirs, 'tcl' + version) 010_ssl_no_ssl2_no_ssl3.patch000066400000000000000000000061071517431316200353640ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.6.3/Python-2.6.3diff -r -u ../Python-2.6.4.orig/Lib/ssl.py ./Lib/ssl.py --- ../Python-2.6.4.orig/Lib/ssl.py 2012-04-10 15:32:06.000000000 +0000 +++ ./Lib/ssl.py 2015-12-18 14:46:36.487188331 +0000 @@ -61,18 +61,24 @@ from _ssl import SSLError from _ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED -from _ssl import PROTOCOL_SSLv2, PROTOCOL_SSLv3, PROTOCOL_SSLv23, PROTOCOL_TLSv1 -from _ssl import RAND_status, RAND_egd, RAND_add -from _ssl import \ - SSL_ERROR_ZERO_RETURN, \ - SSL_ERROR_WANT_READ, \ - SSL_ERROR_WANT_WRITE, \ - SSL_ERROR_WANT_X509_LOOKUP, \ - SSL_ERROR_SYSCALL, \ - SSL_ERROR_SSL, \ - SSL_ERROR_WANT_CONNECT, \ - SSL_ERROR_EOF, \ - SSL_ERROR_INVALID_ERROR_CODE +from _ssl import RAND_status, RAND_add +try: + from _ssl import RAND_egd +except ImportError: + # LibreSSL does not provide RAND_egd + pass + +def _import_symbols(prefix): + for n in dir(_ssl): + if n.startswith(prefix): + globals()[n] = getattr(_ssl, n) + +_import_symbols('OP_') +_import_symbols('ALERT_DESCRIPTION_') +_import_symbols('SSL_ERROR_') +_import_symbols('PROTOCOL_') + +_PROTOCOL_NAMES = dict([(value, name) for name, value in globals().items() if name.startswith('PROTOCOL_')]) from socket import socket, _fileobject from socket import getnameinfo as _getnameinfo @@ -394,7 +400,7 @@ d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)] return base64.decodestring(d) -def get_server_certificate (addr, ssl_version=PROTOCOL_SSLv3, ca_certs=None): +def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None): """Retrieve the certificate from the server at the specified address, and return it as a PEM-encoded string. diff -r -u ../Python-2.6.4.orig/Modules/_ssl.c ./Modules/_ssl.c --- ../Python-2.6.4.orig/Modules/_ssl.c 2012-04-10 15:32:09.000000000 +0000 +++ ./Modules/_ssl.c 2015-12-18 14:45:30.419597074 +0000 @@ -61,8 +61,12 @@ }; enum py_ssl_version { +#ifndef OPENSSL_NO_SSL2 PY_SSL_VERSION_SSL2, +#endif +#ifndef OPENSSL_NO_SSL3 PY_SSL_VERSION_SSL3, +#endif PY_SSL_VERSION_SSL23, PY_SSL_VERSION_TLS1, }; @@ -298,10 +302,14 @@ PySSL_BEGIN_ALLOW_THREADS if (proto_version == PY_SSL_VERSION_TLS1) self->ctx = SSL_CTX_new(TLSv1_method()); /* Set up context */ +#ifndef OPENSSL_NO_SSL3 else if (proto_version == PY_SSL_VERSION_SSL3) self->ctx = SSL_CTX_new(SSLv3_method()); /* Set up context */ +#endif +#ifndef OPENSSL_NO_SSL2 else if (proto_version == PY_SSL_VERSION_SSL2) self->ctx = SSL_CTX_new(SSLv2_method()); /* Set up context */ +#endif else if (proto_version == PY_SSL_VERSION_SSL23) self->ctx = SSL_CTX_new(SSLv23_method()); /* Set up context */ PySSL_END_ALLOW_THREADS @@ -1627,10 +1635,14 @@ PY_SSL_CERT_REQUIRED); /* protocol versions */ +#ifndef OPENSSL_NO_SSL2 PyModule_AddIntConstant(m, "PROTOCOL_SSLv2", PY_SSL_VERSION_SSL2); +#endif +#ifndef OPENSSL_NO_SSL3 PyModule_AddIntConstant(m, "PROTOCOL_SSLv3", PY_SSL_VERSION_SSL3); +#endif PyModule_AddIntConstant(m, "PROTOCOL_SSLv23", PY_SSL_VERSION_SSL23); PyModule_AddIntConstant(m, "PROTOCOL_TLSv1", pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.6.4/000077500000000000000000000000001517431316200262125ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.6.4/Python-2.6.4/000077500000000000000000000000001517431316200301405ustar00rootroot00000000000000000_patch-setup.py.diff000066400000000000000000000053231517431316200341610ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.6.4/Python-2.6.4 # HG changeset patch # User Barry Warsaw # Date 1302190091 14400 # Node ID bd0f73a9538e05f526feaf05821e68bdcff498fa # Parent 2e4cdaffe493e879fb5367a4aa454491de451137 Backport for Python 2.7 of issue 11715 support for building Python on multiarch Debian/Ubuntu. diff -r -u setup.py setup.py --- setup.py.orig +++ setup.py @@ -15,6 +15,7 @@ from distutils.command.build_ext import build_ext from distutils.command.install import install from distutils.command.install_lib import install_lib +from distutils.spawn import find_executable # This global variable is used to hold the list of modules to be disabled. disabled_module_list = [] @@ -308,10 +309,33 @@ class PyBuildExt(build_ext): return platform return sys.platform + def add_multiarch_paths(self): + # Debian/Ubuntu multiarch support. + # https://wiki.ubuntu.com/MultiarchSpec + if not find_executable('dpkg-architecture'): + return + tmpfile = os.path.join(self.build_temp, 'multiarch') + if not os.path.exists(self.build_temp): + os.makedirs(self.build_temp) + ret = os.system( + 'dpkg-architecture -qDEB_HOST_MULTIARCH > %s 2> /dev/null' % + tmpfile) + try: + if ret >> 8 == 0: + with open(tmpfile) as fp: + multiarch_path_component = fp.readline().strip() + add_dir_to_list(self.compiler.library_dirs, + '/usr/lib/' + multiarch_path_component) + add_dir_to_list(self.compiler.include_dirs, + '/usr/include/' + multiarch_path_component) + finally: + os.unlink(tmpfile) + def detect_modules(self): # Ensure that /usr/local is always used add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib') add_dir_to_list(self.compiler.include_dirs, '/usr/local/include') + self.add_multiarch_paths() # Add paths specified in the environment variables LDFLAGS and # CPPFLAGS for header and library files. @@ -1331,14 +1355,13 @@ # Platform-specific libraries - if platform == 'linux2': + if platform.startswith('linux'): # Linux-specific modules exts.append( Extension('linuxaudiodev', ['linuxaudiodev.c']) ) else: missing.append('linuxaudiodev') - if platform in ('linux2', 'freebsd4', 'freebsd5', 'freebsd6', - 'freebsd7', 'freebsd8'): + if platform.startswith('linux') or platform.startswith('freebsd'): exts.append( Extension('ossaudiodev', ['ossaudiodev.c']) ) else: missing.append('ossaudiodev') 002_readline63.patch000066400000000000000000000033041517431316200334170ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.6.4/Python-2.6.4diff -r -u ../Python-2.6.4.orig/Modules/readline.c ./Modules/readline.c --- ../Python-2.6.4.orig/Modules/readline.c 2013-11-10 16:36:41.000000000 +0900 +++ ./Modules/readline.c 2014-03-29 16:17:48.643305752 +0900 @@ -178,8 +178,7 @@ if (!PyArg_ParseTuple(args, buf, &function)) return NULL; if (function == Py_None) { - Py_XDECREF(*hook_var); - *hook_var = NULL; + Py_CLEAR(*hook_var); } else if (PyCallable_Check(function)) { PyObject *tmp = *hook_var; @@ -655,14 +654,22 @@ } static int +#if defined(_RL_FUNCTION_TYPEDEF) on_startup_hook(void) +#else +on_startup_hook() +#endif { return on_hook(startup_hook); } #ifdef HAVE_RL_PRE_INPUT_HOOK static int +#if defined(_RL_FUNCTION_TYPEDEF) on_pre_input_hook(void) +#else +on_pre_input_hook() +#endif { return on_hook(pre_input_hook); } @@ -757,7 +764,7 @@ * before calling the normal completer */ static char ** -flex_complete(char *text, int start, int end) +flex_complete(const char *text, int start, int end) { Py_XDECREF(begidx); Py_XDECREF(endidx); @@ -791,12 +798,12 @@ rl_bind_key_in_map ('\t', rl_complete, emacs_meta_keymap); rl_bind_key_in_map ('\033', rl_complete, emacs_meta_keymap); /* Set our hook functions */ - rl_startup_hook = (Function *)on_startup_hook; + rl_startup_hook = on_startup_hook; #ifdef HAVE_RL_PRE_INPUT_HOOK - rl_pre_input_hook = (Function *)on_pre_input_hook; + rl_pre_input_hook = on_pre_input_hook; #endif /* Set our completion function */ - rl_attempted_completion_function = (CPPFunction *)flex_complete; + rl_attempted_completion_function = flex_complete; /* Set Python word break characters */ rl_completer_word_break_characters = strdup(" \t\n`~!@#$%^&*()-=+[{]}\\|;:'\",<>/?"); 003_tk86.patch000066400000000000000000000013571517431316200322660ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.6.4/Python-2.6.4diff -r -u ../Python-2.6.4.orig/setup.py ./setup.py --- ../Python-2.6.4.orig/setup.py 2013-10-30 00:04:39.000000000 +0900 +++ ./setup.py 2014-04-03 22:28:49.122061684 +0900 @@ -1573,7 +1573,7 @@ # The versions with dots are used on Unix, and the versions without # dots on Windows, for detection by cygwin. tcllib = tklib = tcl_includes = tk_includes = None - for version in ['8.5', '85', '8.4', '84', '8.3', '83', '8.2', + for version in ['8.6', '86', '8.5', '85', '8.4', '84', '8.3', '83', '82', '8.1', '81', '8.0', '80']: tklib = self.compiler.find_library_file(lib_dirs, 'tk' + version) tcllib = self.compiler.find_library_file(lib_dirs, 'tcl' + version) 010_ssl_no_ssl2_no_ssl3.patch000066400000000000000000000061071517431316200353660ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.6.4/Python-2.6.4diff -r -u ../Python-2.6.4.orig/Lib/ssl.py ./Lib/ssl.py --- ../Python-2.6.4.orig/Lib/ssl.py 2012-04-10 15:32:06.000000000 +0000 +++ ./Lib/ssl.py 2015-12-18 14:46:36.487188331 +0000 @@ -61,18 +61,24 @@ from _ssl import SSLError from _ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED -from _ssl import PROTOCOL_SSLv2, PROTOCOL_SSLv3, PROTOCOL_SSLv23, PROTOCOL_TLSv1 -from _ssl import RAND_status, RAND_egd, RAND_add -from _ssl import \ - SSL_ERROR_ZERO_RETURN, \ - SSL_ERROR_WANT_READ, \ - SSL_ERROR_WANT_WRITE, \ - SSL_ERROR_WANT_X509_LOOKUP, \ - SSL_ERROR_SYSCALL, \ - SSL_ERROR_SSL, \ - SSL_ERROR_WANT_CONNECT, \ - SSL_ERROR_EOF, \ - SSL_ERROR_INVALID_ERROR_CODE +from _ssl import RAND_status, RAND_add +try: + from _ssl import RAND_egd +except ImportError: + # LibreSSL does not provide RAND_egd + pass + +def _import_symbols(prefix): + for n in dir(_ssl): + if n.startswith(prefix): + globals()[n] = getattr(_ssl, n) + +_import_symbols('OP_') +_import_symbols('ALERT_DESCRIPTION_') +_import_symbols('SSL_ERROR_') +_import_symbols('PROTOCOL_') + +_PROTOCOL_NAMES = dict([(value, name) for name, value in globals().items() if name.startswith('PROTOCOL_')]) from socket import socket, _fileobject from socket import getnameinfo as _getnameinfo @@ -394,7 +400,7 @@ d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)] return base64.decodestring(d) -def get_server_certificate (addr, ssl_version=PROTOCOL_SSLv3, ca_certs=None): +def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None): """Retrieve the certificate from the server at the specified address, and return it as a PEM-encoded string. diff -r -u ../Python-2.6.4.orig/Modules/_ssl.c ./Modules/_ssl.c --- ../Python-2.6.4.orig/Modules/_ssl.c 2012-04-10 15:32:09.000000000 +0000 +++ ./Modules/_ssl.c 2015-12-18 14:45:30.419597074 +0000 @@ -61,8 +61,12 @@ }; enum py_ssl_version { +#ifndef OPENSSL_NO_SSL2 PY_SSL_VERSION_SSL2, +#endif +#ifndef OPENSSL_NO_SSL3 PY_SSL_VERSION_SSL3, +#endif PY_SSL_VERSION_SSL23, PY_SSL_VERSION_TLS1, }; @@ -298,10 +302,14 @@ PySSL_BEGIN_ALLOW_THREADS if (proto_version == PY_SSL_VERSION_TLS1) self->ctx = SSL_CTX_new(TLSv1_method()); /* Set up context */ +#ifndef OPENSSL_NO_SSL3 else if (proto_version == PY_SSL_VERSION_SSL3) self->ctx = SSL_CTX_new(SSLv3_method()); /* Set up context */ +#endif +#ifndef OPENSSL_NO_SSL2 else if (proto_version == PY_SSL_VERSION_SSL2) self->ctx = SSL_CTX_new(SSLv2_method()); /* Set up context */ +#endif else if (proto_version == PY_SSL_VERSION_SSL23) self->ctx = SSL_CTX_new(SSLv23_method()); /* Set up context */ PySSL_END_ALLOW_THREADS @@ -1627,10 +1635,14 @@ PY_SSL_CERT_REQUIRED); /* protocol versions */ +#ifndef OPENSSL_NO_SSL2 PyModule_AddIntConstant(m, "PROTOCOL_SSLv2", PY_SSL_VERSION_SSL2); +#endif +#ifndef OPENSSL_NO_SSL3 PyModule_AddIntConstant(m, "PROTOCOL_SSLv3", PY_SSL_VERSION_SSL3); +#endif PyModule_AddIntConstant(m, "PROTOCOL_SSLv23", PY_SSL_VERSION_SSL23); PyModule_AddIntConstant(m, "PROTOCOL_TLSv1", pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.6.5/000077500000000000000000000000001517431316200262135ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.6.5/Python-2.6.5/000077500000000000000000000000001517431316200301425ustar00rootroot00000000000000000_patch-setup.py.diff000066400000000000000000000053231517431316200341630ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.6.5/Python-2.6.5 # HG changeset patch # User Barry Warsaw # Date 1302190091 14400 # Node ID bd0f73a9538e05f526feaf05821e68bdcff498fa # Parent 2e4cdaffe493e879fb5367a4aa454491de451137 Backport for Python 2.7 of issue 11715 support for building Python on multiarch Debian/Ubuntu. diff -r -u setup.py setup.py --- setup.py.orig +++ setup.py @@ -15,6 +15,7 @@ from distutils.command.build_ext import build_ext from distutils.command.install import install from distutils.command.install_lib import install_lib +from distutils.spawn import find_executable # This global variable is used to hold the list of modules to be disabled. disabled_module_list = [] @@ -308,10 +309,33 @@ class PyBuildExt(build_ext): return platform return sys.platform + def add_multiarch_paths(self): + # Debian/Ubuntu multiarch support. + # https://wiki.ubuntu.com/MultiarchSpec + if not find_executable('dpkg-architecture'): + return + tmpfile = os.path.join(self.build_temp, 'multiarch') + if not os.path.exists(self.build_temp): + os.makedirs(self.build_temp) + ret = os.system( + 'dpkg-architecture -qDEB_HOST_MULTIARCH > %s 2> /dev/null' % + tmpfile) + try: + if ret >> 8 == 0: + with open(tmpfile) as fp: + multiarch_path_component = fp.readline().strip() + add_dir_to_list(self.compiler.library_dirs, + '/usr/lib/' + multiarch_path_component) + add_dir_to_list(self.compiler.include_dirs, + '/usr/include/' + multiarch_path_component) + finally: + os.unlink(tmpfile) + def detect_modules(self): # Ensure that /usr/local is always used add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib') add_dir_to_list(self.compiler.include_dirs, '/usr/local/include') + self.add_multiarch_paths() # Add paths specified in the environment variables LDFLAGS and # CPPFLAGS for header and library files. @@ -1339,14 +1363,13 @@ # Platform-specific libraries - if platform == 'linux2': + if platform.startswith('linux'): # Linux-specific modules exts.append( Extension('linuxaudiodev', ['linuxaudiodev.c']) ) else: missing.append('linuxaudiodev') - if platform in ('linux2', 'freebsd4', 'freebsd5', 'freebsd6', - 'freebsd7', 'freebsd8'): + if platform.startswith('linux') or platform.startswith('freebsd'): exts.append( Extension('ossaudiodev', ['ossaudiodev.c']) ) else: missing.append('ossaudiodev') 002_readline63.patch000066400000000000000000000033541517431316200334260ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.6.5/Python-2.6.5diff -r -u ../Python-2.6.5.orig/Modules/readline.c ./Modules/readline.c --- ../Python-2.6.5.orig/Modules/readline.c 2013-11-10 16:36:41.000000000 +0900 +++ ./Modules/readline.c 2014-03-29 16:17:48.643305752 +0900 @@ -199,8 +199,7 @@ if (!PyArg_ParseTuple(args, buf, &function)) return NULL; if (function == Py_None) { - Py_XDECREF(*hook_var); - *hook_var = NULL; + Py_CLEAR(*hook_var); } else if (PyCallable_Check(function)) { PyObject *tmp = *hook_var; @@ -699,14 +698,22 @@ } static int +#if defined(_RL_FUNCTION_TYPEDEF) on_startup_hook(void) +#else +on_startup_hook() +#endif { return on_hook(startup_hook); } #ifdef HAVE_RL_PRE_INPUT_HOOK static int +#if defined(_RL_FUNCTION_TYPEDEF) on_pre_input_hook(void) +#else +on_pre_input_hook() +#endif { return on_hook(pre_input_hook); } @@ -801,7 +808,7 @@ * before calling the normal completer */ static char ** -flex_complete(char *text, int start, int end) +flex_complete(const char *text, int start, int end) { #ifdef HAVE_RL_COMPLETION_APPEND_CHARACTER rl_completion_append_character ='\0'; @@ -841,12 +848,12 @@ rl_bind_key_in_map ('\t', rl_complete, emacs_meta_keymap); rl_bind_key_in_map ('\033', rl_complete, emacs_meta_keymap); /* Set our hook functions */ - rl_startup_hook = (Function *)on_startup_hook; + rl_startup_hook = on_startup_hook; #ifdef HAVE_RL_PRE_INPUT_HOOK - rl_pre_input_hook = (Function *)on_pre_input_hook; + rl_pre_input_hook = on_pre_input_hook; #endif /* Set our completion function */ - rl_attempted_completion_function = (CPPFunction *)flex_complete; + rl_attempted_completion_function = flex_complete; /* Set Python word break characters */ rl_completer_word_break_characters = strdup(" \t\n`~!@#$%^&*()-=+[{]}\\|;:'\",<>/?"); 003_tk86.patch000066400000000000000000000013571517431316200322700ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.6.5/Python-2.6.5diff -r -u ../Python-2.6.5.orig/setup.py ./setup.py --- ../Python-2.6.5.orig/setup.py 2013-10-30 00:04:39.000000000 +0900 +++ ./setup.py 2014-04-03 22:28:49.122061684 +0900 @@ -1581,7 +1581,7 @@ # The versions with dots are used on Unix, and the versions without # dots on Windows, for detection by cygwin. tcllib = tklib = tcl_includes = tk_includes = None - for version in ['8.5', '85', '8.4', '84', '8.3', '83', '8.2', + for version in ['8.6', '86', '8.5', '85', '8.4', '84', '8.3', '83', '82', '8.1', '81', '8.0', '80']: tklib = self.compiler.find_library_file(lib_dirs, 'tk' + version) tcllib = self.compiler.find_library_file(lib_dirs, 'tcl' + version) 010_ssl_no_ssl2_no_ssl3.patch000066400000000000000000000061061517431316200353670ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.6.5/Python-2.6.5diff -r -u ../Python-2.6.5.orig/Lib/ssl.py ./Lib/ssl.py --- ../Python-2.6.5.orig/Lib/ssl.py 2012-04-10 15:32:06.000000000 +0000 +++ ./Lib/ssl.py 2015-12-18 14:46:36.487188331 +0000 @@ -61,18 +61,24 @@ from _ssl import SSLError from _ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED -from _ssl import PROTOCOL_SSLv2, PROTOCOL_SSLv3, PROTOCOL_SSLv23, PROTOCOL_TLSv1 -from _ssl import RAND_status, RAND_egd, RAND_add -from _ssl import \ - SSL_ERROR_ZERO_RETURN, \ - SSL_ERROR_WANT_READ, \ - SSL_ERROR_WANT_WRITE, \ - SSL_ERROR_WANT_X509_LOOKUP, \ - SSL_ERROR_SYSCALL, \ - SSL_ERROR_SSL, \ - SSL_ERROR_WANT_CONNECT, \ - SSL_ERROR_EOF, \ - SSL_ERROR_INVALID_ERROR_CODE +from _ssl import RAND_status, RAND_add +try: + from _ssl import RAND_egd +except ImportError: + # LibreSSL does not provide RAND_egd + pass + +def _import_symbols(prefix): + for n in dir(_ssl): + if n.startswith(prefix): + globals()[n] = getattr(_ssl, n) + +_import_symbols('OP_') +_import_symbols('ALERT_DESCRIPTION_') +_import_symbols('SSL_ERROR_') +_import_symbols('PROTOCOL_') + +_PROTOCOL_NAMES = dict([(value, name) for name, value in globals().items() if name.startswith('PROTOCOL_')]) from socket import socket, _fileobject from socket import getnameinfo as _getnameinfo @@ -394,7 +400,7 @@ d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)] return base64.decodestring(d) -def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv3, ca_certs=None): +def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None): """Retrieve the certificate from the server at the specified address, and return it as a PEM-encoded string. diff -r -u ../Python-2.6.5.orig/Modules/_ssl.c ./Modules/_ssl.c --- ../Python-2.6.5.orig/Modules/_ssl.c 2012-04-10 15:32:09.000000000 +0000 +++ ./Modules/_ssl.c 2015-12-18 14:45:30.419597074 +0000 @@ -61,8 +61,12 @@ }; enum py_ssl_version { +#ifndef OPENSSL_NO_SSL2 PY_SSL_VERSION_SSL2, +#endif +#ifndef OPENSSL_NO_SSL3 PY_SSL_VERSION_SSL3, +#endif PY_SSL_VERSION_SSL23, PY_SSL_VERSION_TLS1, }; @@ -298,10 +302,14 @@ PySSL_BEGIN_ALLOW_THREADS if (proto_version == PY_SSL_VERSION_TLS1) self->ctx = SSL_CTX_new(TLSv1_method()); /* Set up context */ +#ifndef OPENSSL_NO_SSL3 else if (proto_version == PY_SSL_VERSION_SSL3) self->ctx = SSL_CTX_new(SSLv3_method()); /* Set up context */ +#endif +#ifndef OPENSSL_NO_SSL2 else if (proto_version == PY_SSL_VERSION_SSL2) self->ctx = SSL_CTX_new(SSLv2_method()); /* Set up context */ +#endif else if (proto_version == PY_SSL_VERSION_SSL23) self->ctx = SSL_CTX_new(SSLv23_method()); /* Set up context */ PySSL_END_ALLOW_THREADS @@ -1627,10 +1635,14 @@ PY_SSL_CERT_REQUIRED); /* protocol versions */ +#ifndef OPENSSL_NO_SSL2 PyModule_AddIntConstant(m, "PROTOCOL_SSLv2", PY_SSL_VERSION_SSL2); +#endif +#ifndef OPENSSL_NO_SSL3 PyModule_AddIntConstant(m, "PROTOCOL_SSLv3", PY_SSL_VERSION_SSL3); +#endif PyModule_AddIntConstant(m, "PROTOCOL_SSLv23", PY_SSL_VERSION_SSL23); PyModule_AddIntConstant(m, "PROTOCOL_TLSv1", pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.6.6/000077500000000000000000000000001517431316200262145ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.6.6/Python-2.6.6/000077500000000000000000000000001517431316200301445ustar00rootroot00000000000000000_patch-setup.py.diff000066400000000000000000000046221517431316200341660ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.6.6/Python-2.6.6 # HG changeset patch # User Barry Warsaw # Date 1302190091 14400 # Node ID bd0f73a9538e05f526feaf05821e68bdcff498fa # Parent 2e4cdaffe493e879fb5367a4aa454491de451137 Backport for Python 2.7 of issue 11715 support for building Python on multiarch Debian/Ubuntu. diff -r -u setup.py setup.py --- setup.py.orig +++ setup.py @@ -345,10 +345,33 @@ class PyBuildExt(build_ext): return platform return sys.platform + def add_multiarch_paths(self): + # Debian/Ubuntu multiarch support. + # https://wiki.ubuntu.com/MultiarchSpec + if not find_executable('dpkg-architecture'): + return + tmpfile = os.path.join(self.build_temp, 'multiarch') + if not os.path.exists(self.build_temp): + os.makedirs(self.build_temp) + ret = os.system( + 'dpkg-architecture -qDEB_HOST_MULTIARCH > %s 2> /dev/null' % + tmpfile) + try: + if ret >> 8 == 0: + with open(tmpfile) as fp: + multiarch_path_component = fp.readline().strip() + add_dir_to_list(self.compiler.library_dirs, + '/usr/lib/' + multiarch_path_component) + add_dir_to_list(self.compiler.include_dirs, + '/usr/include/' + multiarch_path_component) + finally: + os.unlink(tmpfile) + def detect_modules(self): # Ensure that /usr/local is always used add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib') add_dir_to_list(self.compiler.include_dirs, '/usr/local/include') + self.add_multiarch_paths() # Add paths specified in the environment variables LDFLAGS and # CPPFLAGS for header and library files. @@ -1443,14 +1443,13 @@ # Platform-specific libraries - if platform == 'linux2': + if platform.startswith('linux'): # Linux-specific modules exts.append( Extension('linuxaudiodev', ['linuxaudiodev.c']) ) else: missing.append('linuxaudiodev') - if platform in ('linux2', 'freebsd4', 'freebsd5', 'freebsd6', - 'freebsd7', 'freebsd8'): + if platform.startswith('linux') or platform.startswith('freebsd'): exts.append( Extension('ossaudiodev', ['ossaudiodev.c']) ) else: missing.append('ossaudiodev') 002_readline63.patch000066400000000000000000000034721517431316200334310ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.6.6/Python-2.6.6diff -r -u ../Python-2.7.6.orig/Modules/readline.c ./Modules/readline.c --- ../Python-2.7.6.orig/Modules/readline.c 2013-11-10 16:36:41.000000000 +0900 +++ ./Modules/readline.c 2014-03-29 16:17:48.643305752 +0900 @@ -206,8 +206,7 @@ if (!PyArg_ParseTuple(args, buf, &function)) return NULL; if (function == Py_None) { - Py_XDECREF(*hook_var); - *hook_var = NULL; + Py_CLEAR(*hook_var); } else if (PyCallable_Check(function)) { PyObject *tmp = *hook_var; @@ -750,14 +749,22 @@ } static int +#if defined(_RL_FUNCTION_TYPEDEF) on_startup_hook(void) +#else +on_startup_hook() +#endif { return on_hook(startup_hook); } #ifdef HAVE_RL_PRE_INPUT_HOOK static int +#if defined(_RL_FUNCTION_TYPEDEF) on_pre_input_hook(void) +#else +on_pre_input_hook() +#endif { return on_hook(pre_input_hook); } @@ -852,7 +859,7 @@ * before calling the normal completer */ static char ** -flex_complete(char *text, int start, int end) +flex_complete(const char *text, int start, int end) { #ifdef HAVE_RL_COMPLETION_APPEND_CHARACTER rl_completion_append_character ='\0'; @@ -911,12 +918,12 @@ rl_bind_key_in_map ('\t', rl_complete, emacs_meta_keymap); rl_bind_key_in_map ('\033', rl_complete, emacs_meta_keymap); /* Set our hook functions */ - rl_startup_hook = (Function *)on_startup_hook; + rl_startup_hook = on_startup_hook; #ifdef HAVE_RL_PRE_INPUT_HOOK - rl_pre_input_hook = (Function *)on_pre_input_hook; + rl_pre_input_hook = on_pre_input_hook; #endif /* Set our completion function */ - rl_attempted_completion_function = (CPPFunction *)flex_complete; + rl_attempted_completion_function = flex_complete; /* Set Python word break characters */ completer_word_break_characters = rl_completer_word_break_characters = 003_tk86.patch000066400000000000000000000013571517431316200322720ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.6.6/Python-2.6.6diff -r -u ../Python-2.6.9.orig/setup.py ./setup.py --- ../Python-2.6.9.orig/setup.py 2013-10-30 00:04:39.000000000 +0900 +++ ./setup.py 2014-04-03 22:28:49.122061684 +0900 @@ -1675,7 +1675,7 @@ # The versions with dots are used on Unix, and the versions without # dots on Windows, for detection by cygwin. tcllib = tklib = tcl_includes = tk_includes = None - for version in ['8.5', '85', '8.4', '84', '8.3', '83', '8.2', + for version in ['8.6', '86', '8.5', '85', '8.4', '84', '8.3', '83', '82', '8.1', '81', '8.0', '80']: tklib = self.compiler.find_library_file(lib_dirs, 'tk' + version) tcllib = self.compiler.find_library_file(lib_dirs, 'tcl' + version) 010_ssl_no_ssl2_no_ssl3.patch000066400000000000000000000063671517431316200354020ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.6.6/Python-2.6.6diff -r -u ../Python-2.6.8.orig/Lib/ssl.py ./Lib/ssl.py --- ../Python-2.6.8.orig/Lib/ssl.py 2012-04-10 15:32:06.000000000 +0000 +++ ./Lib/ssl.py 2015-12-18 14:46:36.487188331 +0000 @@ -61,18 +61,24 @@ from _ssl import SSLError from _ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED -from _ssl import PROTOCOL_SSLv2, PROTOCOL_SSLv3, PROTOCOL_SSLv23, PROTOCOL_TLSv1 -from _ssl import RAND_status, RAND_egd, RAND_add -from _ssl import \ - SSL_ERROR_ZERO_RETURN, \ - SSL_ERROR_WANT_READ, \ - SSL_ERROR_WANT_WRITE, \ - SSL_ERROR_WANT_X509_LOOKUP, \ - SSL_ERROR_SYSCALL, \ - SSL_ERROR_SSL, \ - SSL_ERROR_WANT_CONNECT, \ - SSL_ERROR_EOF, \ - SSL_ERROR_INVALID_ERROR_CODE +from _ssl import RAND_status, RAND_add +try: + from _ssl import RAND_egd +except ImportError: + # LibreSSL does not provide RAND_egd + pass + +def _import_symbols(prefix): + for n in dir(_ssl): + if n.startswith(prefix): + globals()[n] = getattr(_ssl, n) + +_import_symbols('OP_') +_import_symbols('ALERT_DESCRIPTION_') +_import_symbols('SSL_ERROR_') +_import_symbols('PROTOCOL_') + +_PROTOCOL_NAMES = dict([(value, name) for name, value in globals().items() if name.startswith('PROTOCOL_')]) from socket import socket, _fileobject, _delegate_methods from socket import error as socket_error @@ -382,7 +388,7 @@ d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)] return base64.decodestring(d) -def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv3, ca_certs=None): +def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None): """Retrieve the certificate from the server at the specified address, and return it as a PEM-encoded string. diff -r -u ../Python-2.6.8.orig/Modules/_ssl.c ./Modules/_ssl.c --- ../Python-2.6.8.orig/Modules/_ssl.c 2012-04-10 15:32:09.000000000 +0000 +++ ./Modules/_ssl.c 2015-12-18 14:45:30.419597074 +0000 @@ -62,8 +62,12 @@ }; enum py_ssl_version { +#ifndef OPENSSL_NO_SSL2 PY_SSL_VERSION_SSL2, +#endif +#ifndef OPENSSL_NO_SSL3 PY_SSL_VERSION_SSL3, +#endif PY_SSL_VERSION_SSL23, PY_SSL_VERSION_TLS1 }; @@ -300,10 +304,14 @@ PySSL_BEGIN_ALLOW_THREADS if (proto_version == PY_SSL_VERSION_TLS1) self->ctx = SSL_CTX_new(TLSv1_method()); /* Set up context */ +#ifndef OPENSSL_NO_SSL3 else if (proto_version == PY_SSL_VERSION_SSL3) self->ctx = SSL_CTX_new(SSLv3_method()); /* Set up context */ +#endif +#ifndef OPENSSL_NO_SSL2 else if (proto_version == PY_SSL_VERSION_SSL2) self->ctx = SSL_CTX_new(SSLv2_method()); /* Set up context */ +#endif else if (proto_version == PY_SSL_VERSION_SSL23) self->ctx = SSL_CTX_new(SSLv23_method()); /* Set up context */ PySSL_END_ALLOW_THREADS @@ -1688,10 +1696,14 @@ PY_SSL_CERT_REQUIRED); /* protocol versions */ +#ifndef OPENSSL_NO_SSL2 PyModule_AddIntConstant(m, "PROTOCOL_SSLv2", PY_SSL_VERSION_SSL2); +#endif +#ifndef OPENSSL_NO_SSL3 PyModule_AddIntConstant(m, "PROTOCOL_SSLv3", PY_SSL_VERSION_SSL3); +#endif PyModule_AddIntConstant(m, "PROTOCOL_SSLv23", PY_SSL_VERSION_SSL23); PyModule_AddIntConstant(m, "PROTOCOL_TLSv1", pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.6.7/000077500000000000000000000000001517431316200262155ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.6.7/Python-2.6.7/000077500000000000000000000000001517431316200301465ustar00rootroot00000000000000000_patch-setup.py.diff000066400000000000000000000046221517431316200341700ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.6.7/Python-2.6.7 # HG changeset patch # User Barry Warsaw # Date 1302190091 14400 # Node ID bd0f73a9538e05f526feaf05821e68bdcff498fa # Parent 2e4cdaffe493e879fb5367a4aa454491de451137 Backport for Python 2.7 of issue 11715 support for building Python on multiarch Debian/Ubuntu. diff -r -u setup.py setup.py --- setup.py.orig +++ setup.py @@ -345,10 +345,33 @@ class PyBuildExt(build_ext): return platform return sys.platform + def add_multiarch_paths(self): + # Debian/Ubuntu multiarch support. + # https://wiki.ubuntu.com/MultiarchSpec + if not find_executable('dpkg-architecture'): + return + tmpfile = os.path.join(self.build_temp, 'multiarch') + if not os.path.exists(self.build_temp): + os.makedirs(self.build_temp) + ret = os.system( + 'dpkg-architecture -qDEB_HOST_MULTIARCH > %s 2> /dev/null' % + tmpfile) + try: + if ret >> 8 == 0: + with open(tmpfile) as fp: + multiarch_path_component = fp.readline().strip() + add_dir_to_list(self.compiler.library_dirs, + '/usr/lib/' + multiarch_path_component) + add_dir_to_list(self.compiler.include_dirs, + '/usr/include/' + multiarch_path_component) + finally: + os.unlink(tmpfile) + def detect_modules(self): # Ensure that /usr/local is always used add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib') add_dir_to_list(self.compiler.include_dirs, '/usr/local/include') + self.add_multiarch_paths() # Add paths specified in the environment variables LDFLAGS and # CPPFLAGS for header and library files. @@ -1443,14 +1443,13 @@ # Platform-specific libraries - if platform == 'linux2': + if platform.startswith('linux'): # Linux-specific modules exts.append( Extension('linuxaudiodev', ['linuxaudiodev.c']) ) else: missing.append('linuxaudiodev') - if platform in ('linux2', 'freebsd4', 'freebsd5', 'freebsd6', - 'freebsd7', 'freebsd8'): + if platform.startswith('linux') or platform.startswith('freebsd'): exts.append( Extension('ossaudiodev', ['ossaudiodev.c']) ) else: missing.append('ossaudiodev') 002_readline63.patch000066400000000000000000000034721517431316200334330ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.6.7/Python-2.6.7diff -r -u ../Python-2.7.6.orig/Modules/readline.c ./Modules/readline.c --- ../Python-2.7.6.orig/Modules/readline.c 2013-11-10 16:36:41.000000000 +0900 +++ ./Modules/readline.c 2014-03-29 16:17:48.643305752 +0900 @@ -206,8 +206,7 @@ if (!PyArg_ParseTuple(args, buf, &function)) return NULL; if (function == Py_None) { - Py_XDECREF(*hook_var); - *hook_var = NULL; + Py_CLEAR(*hook_var); } else if (PyCallable_Check(function)) { PyObject *tmp = *hook_var; @@ -750,14 +749,22 @@ } static int +#if defined(_RL_FUNCTION_TYPEDEF) on_startup_hook(void) +#else +on_startup_hook() +#endif { return on_hook(startup_hook); } #ifdef HAVE_RL_PRE_INPUT_HOOK static int +#if defined(_RL_FUNCTION_TYPEDEF) on_pre_input_hook(void) +#else +on_pre_input_hook() +#endif { return on_hook(pre_input_hook); } @@ -852,7 +859,7 @@ * before calling the normal completer */ static char ** -flex_complete(char *text, int start, int end) +flex_complete(const char *text, int start, int end) { #ifdef HAVE_RL_COMPLETION_APPEND_CHARACTER rl_completion_append_character ='\0'; @@ -911,12 +918,12 @@ rl_bind_key_in_map ('\t', rl_complete, emacs_meta_keymap); rl_bind_key_in_map ('\033', rl_complete, emacs_meta_keymap); /* Set our hook functions */ - rl_startup_hook = (Function *)on_startup_hook; + rl_startup_hook = on_startup_hook; #ifdef HAVE_RL_PRE_INPUT_HOOK - rl_pre_input_hook = (Function *)on_pre_input_hook; + rl_pre_input_hook = on_pre_input_hook; #endif /* Set our completion function */ - rl_attempted_completion_function = (CPPFunction *)flex_complete; + rl_attempted_completion_function = flex_complete; /* Set Python word break characters */ completer_word_break_characters = rl_completer_word_break_characters = 003_tk86.patch000066400000000000000000000013571517431316200322740ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.6.7/Python-2.6.7diff -r -u ../Python-2.6.9.orig/setup.py ./setup.py --- ../Python-2.6.9.orig/setup.py 2013-10-30 00:04:39.000000000 +0900 +++ ./setup.py 2014-04-03 22:28:49.122061684 +0900 @@ -1675,7 +1675,7 @@ # The versions with dots are used on Unix, and the versions without # dots on Windows, for detection by cygwin. tcllib = tklib = tcl_includes = tk_includes = None - for version in ['8.5', '85', '8.4', '84', '8.3', '83', '8.2', + for version in ['8.6', '86', '8.5', '85', '8.4', '84', '8.3', '83', '82', '8.1', '81', '8.0', '80']: tklib = self.compiler.find_library_file(lib_dirs, 'tk' + version) tcllib = self.compiler.find_library_file(lib_dirs, 'tcl' + version) 010_ssl_no_ssl2_no_ssl3.patch000066400000000000000000000063671517431316200354040ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.6.7/Python-2.6.7diff -r -u ../Python-2.6.8.orig/Lib/ssl.py ./Lib/ssl.py --- ../Python-2.6.8.orig/Lib/ssl.py 2012-04-10 15:32:06.000000000 +0000 +++ ./Lib/ssl.py 2015-12-18 14:46:36.487188331 +0000 @@ -61,18 +61,24 @@ from _ssl import SSLError from _ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED -from _ssl import PROTOCOL_SSLv2, PROTOCOL_SSLv3, PROTOCOL_SSLv23, PROTOCOL_TLSv1 -from _ssl import RAND_status, RAND_egd, RAND_add -from _ssl import \ - SSL_ERROR_ZERO_RETURN, \ - SSL_ERROR_WANT_READ, \ - SSL_ERROR_WANT_WRITE, \ - SSL_ERROR_WANT_X509_LOOKUP, \ - SSL_ERROR_SYSCALL, \ - SSL_ERROR_SSL, \ - SSL_ERROR_WANT_CONNECT, \ - SSL_ERROR_EOF, \ - SSL_ERROR_INVALID_ERROR_CODE +from _ssl import RAND_status, RAND_add +try: + from _ssl import RAND_egd +except ImportError: + # LibreSSL does not provide RAND_egd + pass + +def _import_symbols(prefix): + for n in dir(_ssl): + if n.startswith(prefix): + globals()[n] = getattr(_ssl, n) + +_import_symbols('OP_') +_import_symbols('ALERT_DESCRIPTION_') +_import_symbols('SSL_ERROR_') +_import_symbols('PROTOCOL_') + +_PROTOCOL_NAMES = dict([(value, name) for name, value in globals().items() if name.startswith('PROTOCOL_')]) from socket import socket, _fileobject, _delegate_methods from socket import error as socket_error @@ -382,7 +388,7 @@ d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)] return base64.decodestring(d) -def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv3, ca_certs=None): +def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None): """Retrieve the certificate from the server at the specified address, and return it as a PEM-encoded string. diff -r -u ../Python-2.6.8.orig/Modules/_ssl.c ./Modules/_ssl.c --- ../Python-2.6.8.orig/Modules/_ssl.c 2012-04-10 15:32:09.000000000 +0000 +++ ./Modules/_ssl.c 2015-12-18 14:45:30.419597074 +0000 @@ -62,8 +62,12 @@ }; enum py_ssl_version { +#ifndef OPENSSL_NO_SSL2 PY_SSL_VERSION_SSL2, +#endif +#ifndef OPENSSL_NO_SSL3 PY_SSL_VERSION_SSL3, +#endif PY_SSL_VERSION_SSL23, PY_SSL_VERSION_TLS1 }; @@ -300,10 +304,14 @@ PySSL_BEGIN_ALLOW_THREADS if (proto_version == PY_SSL_VERSION_TLS1) self->ctx = SSL_CTX_new(TLSv1_method()); /* Set up context */ +#ifndef OPENSSL_NO_SSL3 else if (proto_version == PY_SSL_VERSION_SSL3) self->ctx = SSL_CTX_new(SSLv3_method()); /* Set up context */ +#endif +#ifndef OPENSSL_NO_SSL2 else if (proto_version == PY_SSL_VERSION_SSL2) self->ctx = SSL_CTX_new(SSLv2_method()); /* Set up context */ +#endif else if (proto_version == PY_SSL_VERSION_SSL23) self->ctx = SSL_CTX_new(SSLv23_method()); /* Set up context */ PySSL_END_ALLOW_THREADS @@ -1688,10 +1696,14 @@ PY_SSL_CERT_REQUIRED); /* protocol versions */ +#ifndef OPENSSL_NO_SSL2 PyModule_AddIntConstant(m, "PROTOCOL_SSLv2", PY_SSL_VERSION_SSL2); +#endif +#ifndef OPENSSL_NO_SSL3 PyModule_AddIntConstant(m, "PROTOCOL_SSLv3", PY_SSL_VERSION_SSL3); +#endif PyModule_AddIntConstant(m, "PROTOCOL_SSLv23", PY_SSL_VERSION_SSL23); PyModule_AddIntConstant(m, "PROTOCOL_TLSv1", pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.6.8/000077500000000000000000000000001517431316200262165ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.6.8/Python-2.6.8/000077500000000000000000000000001517431316200301505ustar00rootroot00000000000000000_patch-setup.py.diff000066400000000000000000000046221517431316200341720ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.6.8/Python-2.6.8 # HG changeset patch # User Barry Warsaw # Date 1302190091 14400 # Node ID bd0f73a9538e05f526feaf05821e68bdcff498fa # Parent 2e4cdaffe493e879fb5367a4aa454491de451137 Backport for Python 2.7 of issue 11715 support for building Python on multiarch Debian/Ubuntu. diff -r -u setup.py setup.py --- setup.py.orig +++ setup.py @@ -345,10 +345,33 @@ class PyBuildExt(build_ext): return platform return sys.platform + def add_multiarch_paths(self): + # Debian/Ubuntu multiarch support. + # https://wiki.ubuntu.com/MultiarchSpec + if not find_executable('dpkg-architecture'): + return + tmpfile = os.path.join(self.build_temp, 'multiarch') + if not os.path.exists(self.build_temp): + os.makedirs(self.build_temp) + ret = os.system( + 'dpkg-architecture -qDEB_HOST_MULTIARCH > %s 2> /dev/null' % + tmpfile) + try: + if ret >> 8 == 0: + with open(tmpfile) as fp: + multiarch_path_component = fp.readline().strip() + add_dir_to_list(self.compiler.library_dirs, + '/usr/lib/' + multiarch_path_component) + add_dir_to_list(self.compiler.include_dirs, + '/usr/include/' + multiarch_path_component) + finally: + os.unlink(tmpfile) + def detect_modules(self): # Ensure that /usr/local is always used add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib') add_dir_to_list(self.compiler.include_dirs, '/usr/local/include') + self.add_multiarch_paths() # Add paths specified in the environment variables LDFLAGS and # CPPFLAGS for header and library files. @@ -1443,14 +1443,13 @@ # Platform-specific libraries - if platform == 'linux2': + if platform.startswith('linux'): # Linux-specific modules exts.append( Extension('linuxaudiodev', ['linuxaudiodev.c']) ) else: missing.append('linuxaudiodev') - if platform in ('linux2', 'freebsd4', 'freebsd5', 'freebsd6', - 'freebsd7', 'freebsd8'): + if platform.startswith('linux') or platform.startswith('freebsd'): exts.append( Extension('ossaudiodev', ['ossaudiodev.c']) ) else: missing.append('ossaudiodev') 002_readline63.patch000066400000000000000000000034721517431316200334350ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.6.8/Python-2.6.8diff -r -u ../Python-2.7.6.orig/Modules/readline.c ./Modules/readline.c --- ../Python-2.7.6.orig/Modules/readline.c 2013-11-10 16:36:41.000000000 +0900 +++ ./Modules/readline.c 2014-03-29 16:17:48.643305752 +0900 @@ -206,8 +206,7 @@ if (!PyArg_ParseTuple(args, buf, &function)) return NULL; if (function == Py_None) { - Py_XDECREF(*hook_var); - *hook_var = NULL; + Py_CLEAR(*hook_var); } else if (PyCallable_Check(function)) { PyObject *tmp = *hook_var; @@ -750,14 +749,22 @@ } static int +#if defined(_RL_FUNCTION_TYPEDEF) on_startup_hook(void) +#else +on_startup_hook() +#endif { return on_hook(startup_hook); } #ifdef HAVE_RL_PRE_INPUT_HOOK static int +#if defined(_RL_FUNCTION_TYPEDEF) on_pre_input_hook(void) +#else +on_pre_input_hook() +#endif { return on_hook(pre_input_hook); } @@ -852,7 +859,7 @@ * before calling the normal completer */ static char ** -flex_complete(char *text, int start, int end) +flex_complete(const char *text, int start, int end) { #ifdef HAVE_RL_COMPLETION_APPEND_CHARACTER rl_completion_append_character ='\0'; @@ -911,12 +918,12 @@ rl_bind_key_in_map ('\t', rl_complete, emacs_meta_keymap); rl_bind_key_in_map ('\033', rl_complete, emacs_meta_keymap); /* Set our hook functions */ - rl_startup_hook = (Function *)on_startup_hook; + rl_startup_hook = on_startup_hook; #ifdef HAVE_RL_PRE_INPUT_HOOK - rl_pre_input_hook = (Function *)on_pre_input_hook; + rl_pre_input_hook = on_pre_input_hook; #endif /* Set our completion function */ - rl_attempted_completion_function = (CPPFunction *)flex_complete; + rl_attempted_completion_function = flex_complete; /* Set Python word break characters */ completer_word_break_characters = rl_completer_word_break_characters = 003_tk86.patch000066400000000000000000000013571517431316200322760ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.6.8/Python-2.6.8diff -r -u ../Python-2.6.9.orig/setup.py ./setup.py --- ../Python-2.6.9.orig/setup.py 2013-10-30 00:04:39.000000000 +0900 +++ ./setup.py 2014-04-03 22:28:49.122061684 +0900 @@ -1675,7 +1675,7 @@ # The versions with dots are used on Unix, and the versions without # dots on Windows, for detection by cygwin. tcllib = tklib = tcl_includes = tk_includes = None - for version in ['8.5', '85', '8.4', '84', '8.3', '83', '8.2', + for version in ['8.6', '86', '8.5', '85', '8.4', '84', '8.3', '83', '82', '8.1', '81', '8.0', '80']: tklib = self.compiler.find_library_file(lib_dirs, 'tk' + version) tcllib = self.compiler.find_library_file(lib_dirs, 'tcl' + version) 010_ssl_no_ssl2_no_ssl3.patch000066400000000000000000000063671517431316200354060ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.6.8/Python-2.6.8diff -r -u ../Python-2.6.8.orig/Lib/ssl.py ./Lib/ssl.py --- ../Python-2.6.8.orig/Lib/ssl.py 2012-04-10 15:32:06.000000000 +0000 +++ ./Lib/ssl.py 2015-12-18 14:46:36.487188331 +0000 @@ -61,18 +61,24 @@ from _ssl import SSLError from _ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED -from _ssl import PROTOCOL_SSLv2, PROTOCOL_SSLv3, PROTOCOL_SSLv23, PROTOCOL_TLSv1 -from _ssl import RAND_status, RAND_egd, RAND_add -from _ssl import \ - SSL_ERROR_ZERO_RETURN, \ - SSL_ERROR_WANT_READ, \ - SSL_ERROR_WANT_WRITE, \ - SSL_ERROR_WANT_X509_LOOKUP, \ - SSL_ERROR_SYSCALL, \ - SSL_ERROR_SSL, \ - SSL_ERROR_WANT_CONNECT, \ - SSL_ERROR_EOF, \ - SSL_ERROR_INVALID_ERROR_CODE +from _ssl import RAND_status, RAND_add +try: + from _ssl import RAND_egd +except ImportError: + # LibreSSL does not provide RAND_egd + pass + +def _import_symbols(prefix): + for n in dir(_ssl): + if n.startswith(prefix): + globals()[n] = getattr(_ssl, n) + +_import_symbols('OP_') +_import_symbols('ALERT_DESCRIPTION_') +_import_symbols('SSL_ERROR_') +_import_symbols('PROTOCOL_') + +_PROTOCOL_NAMES = dict([(value, name) for name, value in globals().items() if name.startswith('PROTOCOL_')]) from socket import socket, _fileobject, _delegate_methods from socket import error as socket_error @@ -382,7 +388,7 @@ d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)] return base64.decodestring(d) -def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv3, ca_certs=None): +def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None): """Retrieve the certificate from the server at the specified address, and return it as a PEM-encoded string. diff -r -u ../Python-2.6.8.orig/Modules/_ssl.c ./Modules/_ssl.c --- ../Python-2.6.8.orig/Modules/_ssl.c 2012-04-10 15:32:09.000000000 +0000 +++ ./Modules/_ssl.c 2015-12-18 14:45:30.419597074 +0000 @@ -62,8 +62,12 @@ }; enum py_ssl_version { +#ifndef OPENSSL_NO_SSL2 PY_SSL_VERSION_SSL2, +#endif +#ifndef OPENSSL_NO_SSL3 PY_SSL_VERSION_SSL3, +#endif PY_SSL_VERSION_SSL23, PY_SSL_VERSION_TLS1 }; @@ -300,10 +304,14 @@ PySSL_BEGIN_ALLOW_THREADS if (proto_version == PY_SSL_VERSION_TLS1) self->ctx = SSL_CTX_new(TLSv1_method()); /* Set up context */ +#ifndef OPENSSL_NO_SSL3 else if (proto_version == PY_SSL_VERSION_SSL3) self->ctx = SSL_CTX_new(SSLv3_method()); /* Set up context */ +#endif +#ifndef OPENSSL_NO_SSL2 else if (proto_version == PY_SSL_VERSION_SSL2) self->ctx = SSL_CTX_new(SSLv2_method()); /* Set up context */ +#endif else if (proto_version == PY_SSL_VERSION_SSL23) self->ctx = SSL_CTX_new(SSLv23_method()); /* Set up context */ PySSL_END_ALLOW_THREADS @@ -1688,10 +1696,14 @@ PY_SSL_CERT_REQUIRED); /* protocol versions */ +#ifndef OPENSSL_NO_SSL2 PyModule_AddIntConstant(m, "PROTOCOL_SSLv2", PY_SSL_VERSION_SSL2); +#endif +#ifndef OPENSSL_NO_SSL3 PyModule_AddIntConstant(m, "PROTOCOL_SSLv3", PY_SSL_VERSION_SSL3); +#endif PyModule_AddIntConstant(m, "PROTOCOL_SSLv23", PY_SSL_VERSION_SSL23); PyModule_AddIntConstant(m, "PROTOCOL_TLSv1", pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.6.9/000077500000000000000000000000001517431316200262175ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.6.9/Python-2.6.9/000077500000000000000000000000001517431316200301525ustar00rootroot00000000000000000_patch-setup.py.diff000066400000000000000000000046221517431316200341740ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.6.9/Python-2.6.9 # HG changeset patch # User Barry Warsaw # Date 1302190091 14400 # Node ID bd0f73a9538e05f526feaf05821e68bdcff498fa # Parent 2e4cdaffe493e879fb5367a4aa454491de451137 Backport for Python 2.7 of issue 11715 support for building Python on multiarch Debian/Ubuntu. diff -r -u setup.py setup.py --- setup.py.orig +++ setup.py @@ -345,10 +345,33 @@ class PyBuildExt(build_ext): return platform return sys.platform + def add_multiarch_paths(self): + # Debian/Ubuntu multiarch support. + # https://wiki.ubuntu.com/MultiarchSpec + if not find_executable('dpkg-architecture'): + return + tmpfile = os.path.join(self.build_temp, 'multiarch') + if not os.path.exists(self.build_temp): + os.makedirs(self.build_temp) + ret = os.system( + 'dpkg-architecture -qDEB_HOST_MULTIARCH > %s 2> /dev/null' % + tmpfile) + try: + if ret >> 8 == 0: + with open(tmpfile) as fp: + multiarch_path_component = fp.readline().strip() + add_dir_to_list(self.compiler.library_dirs, + '/usr/lib/' + multiarch_path_component) + add_dir_to_list(self.compiler.include_dirs, + '/usr/include/' + multiarch_path_component) + finally: + os.unlink(tmpfile) + def detect_modules(self): # Ensure that /usr/local is always used add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib') add_dir_to_list(self.compiler.include_dirs, '/usr/local/include') + self.add_multiarch_paths() # Add paths specified in the environment variables LDFLAGS and # CPPFLAGS for header and library files. @@ -1443,14 +1443,13 @@ # Platform-specific libraries - if platform == 'linux2': + if platform.startswith('linux'): # Linux-specific modules exts.append( Extension('linuxaudiodev', ['linuxaudiodev.c']) ) else: missing.append('linuxaudiodev') - if platform in ('linux2', 'freebsd4', 'freebsd5', 'freebsd6', - 'freebsd7', 'freebsd8'): + if platform.startswith('linux') or platform.startswith('freebsd'): exts.append( Extension('ossaudiodev', ['ossaudiodev.c']) ) else: missing.append('ossaudiodev') 001_remove_systemstubs.patch000066400000000000000000000011521517431316200354550ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.6.9/Python-2.6.9diff -ru ../Python-2.6.9/configure ./configure --- ../Python-2.6.9/configure 2013-10-29 17:04:39.000000000 +0200 +++ ./configure 2014-11-14 11:33:00.000000000 +0200 @@ -7227,7 +7227,7 @@ #ARCH_RUN_32BIT="true" fi - LIBTOOL_CRUFT=$LIBTOOL_CRUFT" -lSystem -lSystemStubs -arch_only ${MACOSX_DEFAULT_ARCH}" + LIBTOOL_CRUFT=$LIBTOOL_CRUFT" -lSystem -arch_only ${MACOSX_DEFAULT_ARCH}" LIBTOOL_CRUFT=$LIBTOOL_CRUFT' -install_name $(PYTHONFRAMEWORKINSTALLDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK)' LIBTOOL_CRUFT=$LIBTOOL_CRUFT' -compatibility_version $(VERSION) -current_version $(VERSION)';; esac 002_readline63.patch000066400000000000000000000034721517431316200334370ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.6.9/Python-2.6.9diff -r -u ../Python-2.7.6.orig/Modules/readline.c ./Modules/readline.c --- ../Python-2.7.6.orig/Modules/readline.c 2013-11-10 16:36:41.000000000 +0900 +++ ./Modules/readline.c 2014-03-29 16:17:48.643305752 +0900 @@ -206,8 +206,7 @@ if (!PyArg_ParseTuple(args, buf, &function)) return NULL; if (function == Py_None) { - Py_XDECREF(*hook_var); - *hook_var = NULL; + Py_CLEAR(*hook_var); } else if (PyCallable_Check(function)) { PyObject *tmp = *hook_var; @@ -750,14 +749,22 @@ } static int +#if defined(_RL_FUNCTION_TYPEDEF) on_startup_hook(void) +#else +on_startup_hook() +#endif { return on_hook(startup_hook); } #ifdef HAVE_RL_PRE_INPUT_HOOK static int +#if defined(_RL_FUNCTION_TYPEDEF) on_pre_input_hook(void) +#else +on_pre_input_hook() +#endif { return on_hook(pre_input_hook); } @@ -852,7 +859,7 @@ * before calling the normal completer */ static char ** -flex_complete(char *text, int start, int end) +flex_complete(const char *text, int start, int end) { #ifdef HAVE_RL_COMPLETION_APPEND_CHARACTER rl_completion_append_character ='\0'; @@ -911,12 +918,12 @@ rl_bind_key_in_map ('\t', rl_complete, emacs_meta_keymap); rl_bind_key_in_map ('\033', rl_complete, emacs_meta_keymap); /* Set our hook functions */ - rl_startup_hook = (Function *)on_startup_hook; + rl_startup_hook = on_startup_hook; #ifdef HAVE_RL_PRE_INPUT_HOOK - rl_pre_input_hook = (Function *)on_pre_input_hook; + rl_pre_input_hook = on_pre_input_hook; #endif /* Set our completion function */ - rl_attempted_completion_function = (CPPFunction *)flex_complete; + rl_attempted_completion_function = flex_complete; /* Set Python word break characters */ completer_word_break_characters = rl_completer_word_break_characters = 003_tk86.patch000066400000000000000000000013571517431316200323000ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.6.9/Python-2.6.9diff -r -u ../Python-2.6.9.orig/setup.py ./setup.py --- ../Python-2.6.9.orig/setup.py 2013-10-30 00:04:39.000000000 +0900 +++ ./setup.py 2014-04-03 22:28:49.122061684 +0900 @@ -1675,7 +1675,7 @@ # The versions with dots are used on Unix, and the versions without # dots on Windows, for detection by cygwin. tcllib = tklib = tcl_includes = tk_includes = None - for version in ['8.5', '85', '8.4', '84', '8.3', '83', '8.2', + for version in ['8.6', '86', '8.5', '85', '8.4', '84', '8.3', '83', '82', '8.1', '81', '8.0', '80']: tklib = self.compiler.find_library_file(lib_dirs, 'tk' + version) tcllib = self.compiler.find_library_file(lib_dirs, 'tcl' + version) 010_ssl_no_ssl2_no_ssl3.patch000066400000000000000000000061241517431316200353770ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.6.9/Python-2.6.9diff -r -u ../Python-2.6.9.orig/Lib/ssl.py ./Lib/ssl.py --- ../Python-2.6.9.orig/Lib/ssl.py 2013-10-29 15:04:37.000000000 +0000 +++ ./Lib/ssl.py 2015-12-18 14:39:22.213215077 +0000 @@ -61,18 +61,24 @@ from _ssl import SSLError from _ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED -from _ssl import PROTOCOL_SSLv2, PROTOCOL_SSLv3, PROTOCOL_SSLv23, PROTOCOL_TLSv1 -from _ssl import RAND_status, RAND_egd, RAND_add -from _ssl import \ - SSL_ERROR_ZERO_RETURN, \ - SSL_ERROR_WANT_READ, \ - SSL_ERROR_WANT_WRITE, \ - SSL_ERROR_WANT_X509_LOOKUP, \ - SSL_ERROR_SYSCALL, \ - SSL_ERROR_SSL, \ - SSL_ERROR_WANT_CONNECT, \ - SSL_ERROR_EOF, \ - SSL_ERROR_INVALID_ERROR_CODE +from _ssl import RAND_status, RAND_add +try: + from _ssl import RAND_egd +except ImportError: + # LibreSSL does not provide RAND_egd + pass + +def _import_symbols(prefix): + for n in dir(_ssl): + if n.startswith(prefix): + globals()[n] = getattr(_ssl, n) + +_import_symbols('OP_') +_import_symbols('ALERT_DESCRIPTION_') +_import_symbols('SSL_ERROR_') +_import_symbols('PROTOCOL_') + +_PROTOCOL_NAMES = dict([(value, name) for name, value in globals().items() if name.startswith('PROTOCOL_')]) from socket import socket, _fileobject, _delegate_methods from socket import error as socket_error @@ -382,7 +388,7 @@ d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)] return base64.decodestring(d) -def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv3, ca_certs=None): +def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None): """Retrieve the certificate from the server at the specified address, and return it as a PEM-encoded string. diff -r -u ../Python-2.6.9.orig/Modules/_ssl.c ./Modules/_ssl.c --- ../Python-2.6.9.orig/Modules/_ssl.c 2013-10-29 15:04:38.000000000 +0000 +++ ./Modules/_ssl.c 2015-12-18 14:32:08.051962468 +0000 @@ -62,8 +62,12 @@ }; enum py_ssl_version { +#ifndef OPENSSL_NO_SSL2 PY_SSL_VERSION_SSL2, +#endif +#ifndef OPENSSL_NO_SSL3 PY_SSL_VERSION_SSL3, +#endif PY_SSL_VERSION_SSL23, PY_SSL_VERSION_TLS1 }; @@ -300,8 +304,10 @@ PySSL_BEGIN_ALLOW_THREADS if (proto_version == PY_SSL_VERSION_TLS1) self->ctx = SSL_CTX_new(TLSv1_method()); /* Set up context */ +#ifndef OPENSSL_NO_SSL3 else if (proto_version == PY_SSL_VERSION_SSL3) self->ctx = SSL_CTX_new(SSLv3_method()); /* Set up context */ +#endif #ifndef OPENSSL_NO_SSL2 else if (proto_version == PY_SSL_VERSION_SSL2) self->ctx = SSL_CTX_new(SSLv2_method()); /* Set up context */ @@ -1746,10 +1752,14 @@ PY_SSL_CERT_REQUIRED); /* protocol versions */ +#ifndef OPENSSL_NO_SSL2 PyModule_AddIntConstant(m, "PROTOCOL_SSLv2", PY_SSL_VERSION_SSL2); +#endif +#ifndef OPENSSL_NO_SSL3 PyModule_AddIntConstant(m, "PROTOCOL_SSLv3", PY_SSL_VERSION_SSL3); +#endif PyModule_AddIntConstant(m, "PROTOCOL_SSLv23", PY_SSL_VERSION_SSL23); PyModule_AddIntConstant(m, "PROTOCOL_TLSv1", pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.7.0/000077500000000000000000000000001517431316200262075ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.7.0/Python-2.7/000077500000000000000000000000001517431316200277745ustar00rootroot00000000000000000_patch-setup.py.diff000066400000000000000000000034151517431316200340150ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.7.0/Python-2.7 # HG changeset patch # User Barry Warsaw # Date 1302190091 14400 # Node ID bd0f73a9538e05f526feaf05821e68bdcff498fa # Parent 2e4cdaffe493e879fb5367a4aa454491de451137 Backport for Python 2.7 of issue 11715 support for building Python on multiarch Debian/Ubuntu. diff -r -u setup.py setup.py --- setup.py.orig +++ setup.py @@ -345,10 +345,33 @@ class PyBuildExt(build_ext): return platform return sys.platform + def add_multiarch_paths(self): + # Debian/Ubuntu multiarch support. + # https://wiki.ubuntu.com/MultiarchSpec + if not find_executable('dpkg-architecture'): + return + tmpfile = os.path.join(self.build_temp, 'multiarch') + if not os.path.exists(self.build_temp): + os.makedirs(self.build_temp) + ret = os.system( + 'dpkg-architecture -qDEB_HOST_MULTIARCH > %s 2> /dev/null' % + tmpfile) + try: + if ret >> 8 == 0: + with open(tmpfile) as fp: + multiarch_path_component = fp.readline().strip() + add_dir_to_list(self.compiler.library_dirs, + '/usr/lib/' + multiarch_path_component) + add_dir_to_list(self.compiler.include_dirs, + '/usr/include/' + multiarch_path_component) + finally: + os.unlink(tmpfile) + def detect_modules(self): # Ensure that /usr/local is always used add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib') add_dir_to_list(self.compiler.include_dirs, '/usr/local/include') + self.add_multiarch_paths() # Add paths specified in the environment variables LDFLAGS and # CPPFLAGS for header and library files. 002_readline63.patch000066400000000000000000000034721517431316200332610ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.7.0/Python-2.7diff -r -u ../Python-2.7.6.orig/Modules/readline.c ./Modules/readline.c --- ../Python-2.7.6.orig/Modules/readline.c 2013-11-10 16:36:41.000000000 +0900 +++ ./Modules/readline.c 2014-03-29 16:17:48.643305752 +0900 @@ -206,8 +206,7 @@ if (!PyArg_ParseTuple(args, buf, &function)) return NULL; if (function == Py_None) { - Py_XDECREF(*hook_var); - *hook_var = NULL; + Py_CLEAR(*hook_var); } else if (PyCallable_Check(function)) { PyObject *tmp = *hook_var; @@ -750,14 +749,22 @@ } static int +#if defined(_RL_FUNCTION_TYPEDEF) on_startup_hook(void) +#else +on_startup_hook() +#endif { return on_hook(startup_hook); } #ifdef HAVE_RL_PRE_INPUT_HOOK static int +#if defined(_RL_FUNCTION_TYPEDEF) on_pre_input_hook(void) +#else +on_pre_input_hook() +#endif { return on_hook(pre_input_hook); } @@ -852,7 +859,7 @@ * before calling the normal completer */ static char ** -flex_complete(char *text, int start, int end) +flex_complete(const char *text, int start, int end) { #ifdef HAVE_RL_COMPLETION_APPEND_CHARACTER rl_completion_append_character ='\0'; @@ -911,12 +918,12 @@ rl_bind_key_in_map ('\t', rl_complete, emacs_meta_keymap); rl_bind_key_in_map ('\033', rl_complete, emacs_meta_keymap); /* Set our hook functions */ - rl_startup_hook = (Function *)on_startup_hook; + rl_startup_hook = on_startup_hook; #ifdef HAVE_RL_PRE_INPUT_HOOK - rl_pre_input_hook = (Function *)on_pre_input_hook; + rl_pre_input_hook = on_pre_input_hook; #endif /* Set our completion function */ - rl_attempted_completion_function = (CPPFunction *)flex_complete; + rl_attempted_completion_function = flex_complete; /* Set Python word break characters */ completer_word_break_characters = rl_completer_word_break_characters = 010_ssl_no_ssl2_no_ssl3.patch000066400000000000000000000066711517431316200352300ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.7.0/Python-2.7diff -r -u ../Python-2.7.1.orig/Lib/ssl.py ./Lib/ssl.py --- ../Python-2.7.1.orig/Lib/ssl.py 2010-09-14 14:37:18.000000000 +0000 +++ ./Lib/ssl.py 2015-12-18 14:14:39.089679248 +0000 @@ -62,18 +62,29 @@ from _ssl import OPENSSL_VERSION_NUMBER, OPENSSL_VERSION_INFO, OPENSSL_VERSION from _ssl import SSLError from _ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED -from _ssl import PROTOCOL_SSLv2, PROTOCOL_SSLv3, PROTOCOL_SSLv23, PROTOCOL_TLSv1 -from _ssl import RAND_status, RAND_egd, RAND_add -from _ssl import \ - SSL_ERROR_ZERO_RETURN, \ - SSL_ERROR_WANT_READ, \ - SSL_ERROR_WANT_WRITE, \ - SSL_ERROR_WANT_X509_LOOKUP, \ - SSL_ERROR_SYSCALL, \ - SSL_ERROR_SSL, \ - SSL_ERROR_WANT_CONNECT, \ - SSL_ERROR_EOF, \ - SSL_ERROR_INVALID_ERROR_CODE +from _ssl import RAND_status, RAND_add +try: + from _ssl import RAND_egd +except ImportError: + # LibreSSL does not provide RAND_egd + pass + +def _import_symbols(prefix): + for n in dir(_ssl): + if n.startswith(prefix): + globals()[n] = getattr(_ssl, n) + +_import_symbols('OP_') +_import_symbols('ALERT_DESCRIPTION_') +_import_symbols('SSL_ERROR_') +_import_symbols('PROTOCOL_') + +_PROTOCOL_NAMES = {value: name for name, value in globals().items() if name.startswith('PROTOCOL_')} + +try: + _SSLv2_IF_EXISTS = PROTOCOL_SSLv2 +except NameError: + _SSLv2_IF_EXISTS = None from socket import socket, _fileobject, _delegate_methods, error as socket_error from socket import getnameinfo as _getnameinfo @@ -388,7 +399,7 @@ d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)] return base64.decodestring(d) -def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv3, ca_certs=None): +def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None): """Retrieve the certificate from the server at the specified address, and return it as a PEM-encoded string. diff -r -u ../Python-2.7.1.orig/Modules/_ssl.c ./Modules/_ssl.c --- ../Python-2.7.1.orig/Modules/_ssl.c 2010-10-13 22:10:31.000000000 +0000 +++ ./Modules/_ssl.c 2015-12-18 14:18:21.612222848 +0000 @@ -62,8 +62,12 @@ }; enum py_ssl_version { +#ifndef OPENSSL_NO_SSL2 PY_SSL_VERSION_SSL2, +#endif +#ifndef OPENSSL_NO_SSL3 PY_SSL_VERSION_SSL3, +#endif PY_SSL_VERSION_SSL23, PY_SSL_VERSION_TLS1 }; @@ -300,10 +304,14 @@ PySSL_BEGIN_ALLOW_THREADS if (proto_version == PY_SSL_VERSION_TLS1) self->ctx = SSL_CTX_new(TLSv1_method()); /* Set up context */ +#ifndef OPENSSL_NO_SSL3 else if (proto_version == PY_SSL_VERSION_SSL3) self->ctx = SSL_CTX_new(SSLv3_method()); /* Set up context */ +#endif +#ifndef OPENSSL_NO_SSL2 else if (proto_version == PY_SSL_VERSION_SSL2) self->ctx = SSL_CTX_new(SSLv2_method()); /* Set up context */ +#endif else if (proto_version == PY_SSL_VERSION_SSL23) self->ctx = SSL_CTX_new(SSLv23_method()); /* Set up context */ PySSL_END_ALLOW_THREADS @@ -1706,10 +1714,14 @@ PY_SSL_CERT_REQUIRED); /* protocol versions */ +#ifndef OPENSSL_NO_SSL2 PyModule_AddIntConstant(m, "PROTOCOL_SSLv2", PY_SSL_VERSION_SSL2); +#endif +#ifndef OPENSSL_NO_SSL3 PyModule_AddIntConstant(m, "PROTOCOL_SSLv3", PY_SSL_VERSION_SSL3); +#endif PyModule_AddIntConstant(m, "PROTOCOL_SSLv23", PY_SSL_VERSION_SSL23); PyModule_AddIntConstant(m, "PROTOCOL_TLSv1", pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.7.1/000077500000000000000000000000001517431316200262105ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.7.1/Python-2.7.1/000077500000000000000000000000001517431316200301345ustar00rootroot00000000000000000_patch-setup.py.diff000066400000000000000000000034151517431316200341550ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.7.1/Python-2.7.1 # HG changeset patch # User Barry Warsaw # Date 1302190091 14400 # Node ID bd0f73a9538e05f526feaf05821e68bdcff498fa # Parent 2e4cdaffe493e879fb5367a4aa454491de451137 Backport for Python 2.7 of issue 11715 support for building Python on multiarch Debian/Ubuntu. diff -r -u setup.py setup.py --- setup.py.orig +++ setup.py @@ -345,10 +345,33 @@ class PyBuildExt(build_ext): return platform return sys.platform + def add_multiarch_paths(self): + # Debian/Ubuntu multiarch support. + # https://wiki.ubuntu.com/MultiarchSpec + if not find_executable('dpkg-architecture'): + return + tmpfile = os.path.join(self.build_temp, 'multiarch') + if not os.path.exists(self.build_temp): + os.makedirs(self.build_temp) + ret = os.system( + 'dpkg-architecture -qDEB_HOST_MULTIARCH > %s 2> /dev/null' % + tmpfile) + try: + if ret >> 8 == 0: + with open(tmpfile) as fp: + multiarch_path_component = fp.readline().strip() + add_dir_to_list(self.compiler.library_dirs, + '/usr/lib/' + multiarch_path_component) + add_dir_to_list(self.compiler.include_dirs, + '/usr/include/' + multiarch_path_component) + finally: + os.unlink(tmpfile) + def detect_modules(self): # Ensure that /usr/local is always used add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib') add_dir_to_list(self.compiler.include_dirs, '/usr/local/include') + self.add_multiarch_paths() # Add paths specified in the environment variables LDFLAGS and # CPPFLAGS for header and library files. 002_readline63.patch000066400000000000000000000034721517431316200334210ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.7.1/Python-2.7.1diff -r -u ../Python-2.7.6.orig/Modules/readline.c ./Modules/readline.c --- ../Python-2.7.6.orig/Modules/readline.c 2013-11-10 16:36:41.000000000 +0900 +++ ./Modules/readline.c 2014-03-29 16:17:48.643305752 +0900 @@ -206,8 +206,7 @@ if (!PyArg_ParseTuple(args, buf, &function)) return NULL; if (function == Py_None) { - Py_XDECREF(*hook_var); - *hook_var = NULL; + Py_CLEAR(*hook_var); } else if (PyCallable_Check(function)) { PyObject *tmp = *hook_var; @@ -750,14 +749,22 @@ } static int +#if defined(_RL_FUNCTION_TYPEDEF) on_startup_hook(void) +#else +on_startup_hook() +#endif { return on_hook(startup_hook); } #ifdef HAVE_RL_PRE_INPUT_HOOK static int +#if defined(_RL_FUNCTION_TYPEDEF) on_pre_input_hook(void) +#else +on_pre_input_hook() +#endif { return on_hook(pre_input_hook); } @@ -852,7 +859,7 @@ * before calling the normal completer */ static char ** -flex_complete(char *text, int start, int end) +flex_complete(const char *text, int start, int end) { #ifdef HAVE_RL_COMPLETION_APPEND_CHARACTER rl_completion_append_character ='\0'; @@ -911,12 +918,12 @@ rl_bind_key_in_map ('\t', rl_complete, emacs_meta_keymap); rl_bind_key_in_map ('\033', rl_complete, emacs_meta_keymap); /* Set our hook functions */ - rl_startup_hook = (Function *)on_startup_hook; + rl_startup_hook = on_startup_hook; #ifdef HAVE_RL_PRE_INPUT_HOOK - rl_pre_input_hook = (Function *)on_pre_input_hook; + rl_pre_input_hook = on_pre_input_hook; #endif /* Set our completion function */ - rl_attempted_completion_function = (CPPFunction *)flex_complete; + rl_attempted_completion_function = flex_complete; /* Set Python word break characters */ completer_word_break_characters = rl_completer_word_break_characters = 010_ssl_no_ssl2_no_ssl3.patch000066400000000000000000000066711517431316200353700ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.7.1/Python-2.7.1diff -r -u ../Python-2.7.1.orig/Lib/ssl.py ./Lib/ssl.py --- ../Python-2.7.1.orig/Lib/ssl.py 2010-09-14 14:37:18.000000000 +0000 +++ ./Lib/ssl.py 2015-12-18 14:14:39.089679248 +0000 @@ -62,18 +62,29 @@ from _ssl import OPENSSL_VERSION_NUMBER, OPENSSL_VERSION_INFO, OPENSSL_VERSION from _ssl import SSLError from _ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED -from _ssl import PROTOCOL_SSLv2, PROTOCOL_SSLv3, PROTOCOL_SSLv23, PROTOCOL_TLSv1 -from _ssl import RAND_status, RAND_egd, RAND_add -from _ssl import \ - SSL_ERROR_ZERO_RETURN, \ - SSL_ERROR_WANT_READ, \ - SSL_ERROR_WANT_WRITE, \ - SSL_ERROR_WANT_X509_LOOKUP, \ - SSL_ERROR_SYSCALL, \ - SSL_ERROR_SSL, \ - SSL_ERROR_WANT_CONNECT, \ - SSL_ERROR_EOF, \ - SSL_ERROR_INVALID_ERROR_CODE +from _ssl import RAND_status, RAND_add +try: + from _ssl import RAND_egd +except ImportError: + # LibreSSL does not provide RAND_egd + pass + +def _import_symbols(prefix): + for n in dir(_ssl): + if n.startswith(prefix): + globals()[n] = getattr(_ssl, n) + +_import_symbols('OP_') +_import_symbols('ALERT_DESCRIPTION_') +_import_symbols('SSL_ERROR_') +_import_symbols('PROTOCOL_') + +_PROTOCOL_NAMES = {value: name for name, value in globals().items() if name.startswith('PROTOCOL_')} + +try: + _SSLv2_IF_EXISTS = PROTOCOL_SSLv2 +except NameError: + _SSLv2_IF_EXISTS = None from socket import socket, _fileobject, _delegate_methods, error as socket_error from socket import getnameinfo as _getnameinfo @@ -388,7 +399,7 @@ d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)] return base64.decodestring(d) -def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv3, ca_certs=None): +def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None): """Retrieve the certificate from the server at the specified address, and return it as a PEM-encoded string. diff -r -u ../Python-2.7.1.orig/Modules/_ssl.c ./Modules/_ssl.c --- ../Python-2.7.1.orig/Modules/_ssl.c 2010-10-13 22:10:31.000000000 +0000 +++ ./Modules/_ssl.c 2015-12-18 14:18:21.612222848 +0000 @@ -62,8 +62,12 @@ }; enum py_ssl_version { +#ifndef OPENSSL_NO_SSL2 PY_SSL_VERSION_SSL2, +#endif +#ifndef OPENSSL_NO_SSL3 PY_SSL_VERSION_SSL3, +#endif PY_SSL_VERSION_SSL23, PY_SSL_VERSION_TLS1 }; @@ -300,10 +304,14 @@ PySSL_BEGIN_ALLOW_THREADS if (proto_version == PY_SSL_VERSION_TLS1) self->ctx = SSL_CTX_new(TLSv1_method()); /* Set up context */ +#ifndef OPENSSL_NO_SSL3 else if (proto_version == PY_SSL_VERSION_SSL3) self->ctx = SSL_CTX_new(SSLv3_method()); /* Set up context */ +#endif +#ifndef OPENSSL_NO_SSL2 else if (proto_version == PY_SSL_VERSION_SSL2) self->ctx = SSL_CTX_new(SSLv2_method()); /* Set up context */ +#endif else if (proto_version == PY_SSL_VERSION_SSL23) self->ctx = SSL_CTX_new(SSLv23_method()); /* Set up context */ PySSL_END_ALLOW_THREADS @@ -1706,10 +1714,14 @@ PY_SSL_CERT_REQUIRED); /* protocol versions */ +#ifndef OPENSSL_NO_SSL2 PyModule_AddIntConstant(m, "PROTOCOL_SSLv2", PY_SSL_VERSION_SSL2); +#endif +#ifndef OPENSSL_NO_SSL3 PyModule_AddIntConstant(m, "PROTOCOL_SSLv3", PY_SSL_VERSION_SSL3); +#endif PyModule_AddIntConstant(m, "PROTOCOL_SSLv23", PY_SSL_VERSION_SSL23); PyModule_AddIntConstant(m, "PROTOCOL_TLSv1", pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.7.10/000077500000000000000000000000001517431316200262705ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.7.10/Python-2.7.10/000077500000000000000000000000001517431316200302745ustar00rootroot00000000000000003_system_library_path_in_sys_path.patch000066400000000000000000000011421517431316200403020ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.7.10/Python-2.7.10Only in .: 003_system_library_path_in_sys_path.patch diff -ur ../Python-2.7.10/Lib/site.py ./Lib/site.py --- ../Python-2.7.10/Lib/site.py 2014-06-30 05:05:30.000000000 +0300 +++ ./Lib/site.py 2014-12-12 11:42:33.000000000 +0200 @@ -300,7 +300,7 @@ # locations. from sysconfig import get_config_var framework = get_config_var("PYTHONFRAMEWORK") - if framework: + if False and framework: sitepackages.append( os.path.join("/Library", framework, sys.version[:3], "site-packages")) pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.7.18/000077500000000000000000000000001517431316200263005ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.7.18/Python-2.7.18/000077500000000000000000000000001517431316200303145ustar00rootroot000000000000000001-Detect-arm64-in-configure.patch000066400000000000000000000017431517431316200363630ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.7.18/Python-2.7.18From 5495fb4719fa67ea3abeda0434699c8b28c77bb3 Mon Sep 17 00:00:00 2001 From: Takumi Sueda Date: Sat, 11 Sep 2021 16:50:14 +0900 Subject: [PATCH 1/7] Detect arm64 in configure --- configure | 3 +++ configure.ac | 3 +++ 2 files changed, 6 insertions(+) diff --git a/configure b/configure index 63d675312d..c40ec120de 100755 --- a/configure +++ b/configure @@ -8474,6 +8474,9 @@ fi ppc) MACOSX_DEFAULT_ARCH="ppc64" ;; + arm64) + MACOSX_DEFAULT_ARCH="arm64" + ;; *) as_fn_error $? "Unexpected output of 'arch' on OSX" "$LINENO" 5 ;; diff --git a/configure.ac b/configure.ac index efe6922b5d..df05bee87b 100644 --- a/configure.ac +++ b/configure.ac @@ -2066,6 +2066,9 @@ case $ac_sys_system/$ac_sys_release in ppc) MACOSX_DEFAULT_ARCH="ppc64" ;; + arm64) + MACOSX_DEFAULT_ARCH="arm64" + ;; *) AC_MSG_ERROR([Unexpected output of 'arch' on OSX]) ;; -- 2.30.1 0002-Fix-macOS-_tkinter-use-of-Tck-Tk-in-Library-Framewor.patch000066400000000000000000000240571517431316200432650ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.7.18/Python-2.7.18From f17b9e30bd295b1eec68105e3f04568477ce6286 Mon Sep 17 00:00:00 2001 From: Takumi Sueda Date: Sat, 11 Sep 2021 17:14:34 +0900 Subject: [PATCH 2/7] Fix macOS _tkinter use of Tck/Tk in /Library/Framework Modified and imported from https://github.com/Homebrew/formula-patches/blob/master/python/3.8.7.patch --- setup.py | 148 +++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 106 insertions(+), 42 deletions(-) diff --git a/setup.py b/setup.py index f764223d06..da1d34efaf 100644 --- a/setup.py +++ b/setup.py @@ -50,6 +50,7 @@ def add_dir_to_list(dirlist, dir): dirlist.insert(0, dir) MACOS_SDK_ROOT = None +MACOS_SDK_SPECIFIED = None def macosx_sdk_root(): """Return the directory of the current macOS SDK. @@ -61,8 +62,9 @@ def macosx_sdk_root(): (The SDK may be supplied via Xcode or via the Command Line Tools). The SDK paths used by Apple-supplied tool chains depend on the setting of various variables; see the xcrun man page for more info. + Also sets MACOS_SDK_SPECIFIED for use by macosx_sdk_specified(). """ - global MACOS_SDK_ROOT + global MACOS_SDK_ROOT, MACOS_SDK_SPECIFIED # If already called, return cached result. if MACOS_SDK_ROOT: @@ -72,8 +74,10 @@ def macosx_sdk_root(): m = re.search(r'-isysroot\s+(\S+)', cflags) if m is not None: MACOS_SDK_ROOT = m.group(1) + MACOS_SDK_SPECIFIED = MACOS_SDK_ROOT != '/' else: MACOS_SDK_ROOT = '/' + MACOS_SDK_SPECIFIED = False cc = sysconfig.get_config_var('CC') tmpfile = '/tmp/setup_sdk_root.%d' % os.getpid() try: @@ -101,6 +105,27 @@ def macosx_sdk_root(): return MACOS_SDK_ROOT +def macosx_sdk_specified(): + """Returns true if an SDK was explicitly configured. + + True if an SDK was selected at configure time, either by specifying + --enable-universalsdk=(something other than no or /) or by adding a + -isysroot option to CFLAGS. In some cases, like when making + decisions about macOS Tk framework paths, we need to be able to + know whether the user explicitly asked to build with an SDK versus + the implicit use of an SDK when header files are no longer + installed on a running system by the Command Line Tools. + """ + global MACOS_SDK_SPECIFIED + + # If already called, return cached result. + if MACOS_SDK_SPECIFIED: + return MACOS_SDK_SPECIFIED + + # Find the sdk root and set MACOS_SDK_SPECIFIED + macosx_sdk_root() + return MACOS_SDK_SPECIFIED + def is_macosx_sdk_path(path): """ Returns True if 'path' can be located in an OSX SDK @@ -1834,31 +1859,72 @@ class PyBuildExt(build_ext): return 1 def detect_tkinter_darwin(self, inc_dirs, lib_dirs): - # The _tkinter module, using frameworks. Since frameworks are quite - # different the UNIX search logic is not sharable. - from os.path import join, exists - framework_dirs = [ - '/Library/Frameworks', - '/System/Library/Frameworks/', - join(os.getenv('HOME'), '/Library/Frameworks') - ] + # Build default _tkinter on macOS using Tcl and Tk frameworks. + # + # The macOS native Tk (AKA Aqua Tk) and Tcl are most commonly + # built and installed as macOS framework bundles. However, + # for several reasons, we cannot take full advantage of the + # Apple-supplied compiler chain's -framework options here. + # Instead, we need to find and pass to the compiler the + # absolute paths of the Tcl and Tk headers files we want to use + # and the absolute path to the directory containing the Tcl + # and Tk frameworks for linking. + # + # We want to handle here two common use cases on macOS: + # 1. Build and link with system-wide third-party or user-built + # Tcl and Tk frameworks installed in /Library/Frameworks. + # 2. Build and link using a user-specified macOS SDK so that the + # built Python can be exported to other systems. In this case, + # search only the SDK's /Library/Frameworks (normally empty) + # and /System/Library/Frameworks. + # + # Any other use case should be able to be handled explicitly by + # using the options described above in detect_tkinter_explicitly(). + # In particular it would be good to handle here the case where + # you want to build and link with a framework build of Tcl and Tk + # that is not in /Library/Frameworks, say, in your private + # $HOME/Library/Frameworks directory or elsewhere. It turns + # out to be difficult to make that work automtically here + # without bringing into play more tools and magic. That case + # can be hamdled using a recipe with the right arguments + # to detect_tkinter_explicitly(). + # + # Note also that the fallback case here is to try to use the + # Apple-supplied Tcl and Tk frameworks in /System/Library but + # be forewarned that they are deprecated by Apple and typically + # out-of-date and buggy; their use should be avoided if at + # all possible by installing a newer version of Tcl and Tk in + # /Library/Frameworks before bwfore building Python without + # an explicit SDK or by configuring build arguments explicitly. - sysroot = macosx_sdk_root() + from os.path import join, exists + sysroot = macosx_sdk_root() # path to the SDK or '/' + + if macosx_sdk_specified(): + # Use case #2: an SDK other than '/' was specified. + # Only search there. + framework_dirs = [ + join(sysroot, 'Library', 'Frameworks'), + join(sysroot, 'System', 'Library', 'Frameworks'), + ] + else: + # Use case #1: no explicit SDK selected. + # Search the local system-wide /Library/Frameworks, + # not the one in the default SDK, othewise fall back to + # /System/Library/Frameworks whose header files may be in + # the default SDK or, on older systems, actually installed. + framework_dirs = [ + join('/', 'Library', 'Frameworks'), + join(sysroot, 'System', 'Library', 'Frameworks'), + ] - # Find the directory that contains the Tcl.framework and Tk.framework - # bundles. - # XXX distutils should support -F! + # Find the directory that contains the Tcl.framework and + # Tk.framework bundles. for F in framework_dirs: # both Tcl.framework and Tk.framework should be present - - for fw in 'Tcl', 'Tk': - if is_macosx_sdk_path(F): - if not exists(join(sysroot, F[1:], fw + '.framework')): - break - else: - if not exists(join(F, fw + '.framework')): - break + if not exists(join(F, fw + '.framework')): + break else: # ok, F is now directory with both frameworks. Continure # building @@ -1868,32 +1934,20 @@ class PyBuildExt(build_ext): # will now resume. return 0 - # For 8.4a2, we must add -I options that point inside the Tcl and Tk - # frameworks. In later release we should hopefully be able to pass - # the -F option to gcc, which specifies a framework lookup path. - # include_dirs = [ join(F, fw + '.framework', H) for fw in 'Tcl', 'Tk' - for H in 'Headers', 'Versions/Current/PrivateHeaders' + for H in ('Headers',) ] - # For 8.4a2, the X11 headers are not included. Rather than include a - # complicated search, this is a hard-coded path. It could bail out - # if X11 libs are not found... - include_dirs.append('/usr/X11R6/include') - frameworks = ['-framework', 'Tcl', '-framework', 'Tk'] + # Add the base framework directory as well + compile_args = ['-F', F] - # All existing framework builds of Tcl/Tk don't support 64-bit - # architectures. + # Do not build tkinter for archs that this Tk was not built with. cflags = sysconfig.get_config_vars('CFLAGS')[0] archs = re.findall('-arch\s+(\w+)', cflags) - if is_macosx_sdk_path(F): - fp = os.popen("file %s/Tk.framework/Tk | grep 'for architecture'"%(os.path.join(sysroot, F[1:]),)) - else: - fp = os.popen("file %s/Tk.framework/Tk | grep 'for architecture'"%(F,)) - + fp = os.popen("file %s/Tk.framework/Tk | grep 'for architecture'"%(F,)) detected_archs = [] for ln in fp: a = ln.split()[-1] @@ -1901,16 +1955,26 @@ class PyBuildExt(build_ext): detected_archs.append(ln.split()[-1]) fp.close() + arch_args = [] for a in detected_archs: - frameworks.append('-arch') - frameworks.append(a) + arch_args.append('-arch') + arch_args.append(a) + + compile_args += arch_args + link_args = [','.join(['-Wl', '-F', F, '-framework', 'Tcl', '-framework', 'Tk'])] + arch_args + + # The X11/xlib.h file bundled in the Tk sources can cause function + # prototype warnings from the compiler. Since we cannot easily fix + # that, suppress the warnings here instead. + if '-Wstrict-prototypes' in cflags.split(): + compile_args.append('-Wno-strict-prototypes') ext = Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'], define_macros=[('WITH_APPINIT', 1)], include_dirs = include_dirs, libraries = [], - extra_compile_args = frameworks[2:], - extra_link_args = frameworks, + extra_compile_args = compile_args, + extra_link_args = link_args, ) self.extensions.append(ext) return 1 -- 2.30.1 0003-Support-arm64-in-Mac-Tools-pythonw.patch000066400000000000000000000015671517431316200401600ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.7.18/Python-2.7.18From d93a26fee21a5f91c51d8cb14ecaf29122f1b222 Mon Sep 17 00:00:00 2001 From: Takumi Sueda Date: Sat, 11 Sep 2021 17:25:00 +0900 Subject: [PATCH 3/7] Support "arm64" in Mac/Tools/pythonw Imported from: https://github.com/Homebrew/formula-patches/blob/master/python/3.8.7.patch --- Mac/Tools/pythonw.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Mac/Tools/pythonw.c b/Mac/Tools/pythonw.c index 76734c1063..ebe5e8d975 100644 --- a/Mac/Tools/pythonw.c +++ b/Mac/Tools/pythonw.c @@ -116,10 +116,16 @@ setup_spawnattr(posix_spawnattr_t* spawnattr) #elif defined(__ppc__) cpu_types[0] = CPU_TYPE_POWERPC; + #elif defined(__i386__) cpu_types[0] = CPU_TYPE_X86; + +#elif defined(__arm64__) + cpu_types[0] = CPU_TYPE_ARM64; + #else # error "Unknown CPU" + #endif if (posix_spawnattr_setbinpref_np(spawnattr, count, -- 2.30.1 0004-Use-system-libffi-for-Mac-OS-10.15-and-up.patch000066400000000000000000000064631517431316200406040ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.7.18/Python-2.7.18From a1b08c7de72c27d80a86b92c263d1f5b351e581b Mon Sep 17 00:00:00 2001 From: Takumi Sueda Date: Sat, 11 Sep 2021 18:07:48 +0900 Subject: [PATCH 4/7] Use system libffi for Mac OS 10.15 and up Modified and imported from: https://github.com/Homebrew/formula-patches/blob/master/python/3.8.7.patch --- setup.py | 37 ++++++++++++++++++++++++++++--------- 1 file changed, 28 insertions(+), 9 deletions(-) diff --git a/setup.py b/setup.py index da1d34efaf..c92d0552e3 100644 --- a/setup.py +++ b/setup.py @@ -126,6 +126,13 @@ def macosx_sdk_specified(): macosx_sdk_root() return MACOS_SDK_SPECIFIED +def is_macosx_at_least(vers): + if host_platform == 'darwin': + dep_target = sysconfig.get_config_var('MACOSX_DEPLOYMENT_TARGET') + if dep_target: + return tuple(map(int, str(dep_target).split('.'))) >= vers + return False + def is_macosx_sdk_path(path): """ Returns True if 'path' can be located in an OSX SDK @@ -2180,7 +2187,11 @@ class PyBuildExt(build_ext): return True def detect_ctypes(self, inc_dirs, lib_dirs): - self.use_system_libffi = False + if not sysconfig.get_config_var("LIBFFI_INCLUDEDIR") and is_macosx_at_least((10,15)): + self.use_system_libffi = True + else: + self.use_system_libffi = '--with-system-ffi' in sysconfig.get_config_var("CONFIG_ARGS") + include_dirs = [] extra_compile_args = [] extra_link_args = [] @@ -2224,15 +2235,24 @@ class PyBuildExt(build_ext): sources=['_ctypes/_ctypes_test.c']) self.extensions.extend([ext, ext_test]) - if not '--with-system-ffi' in sysconfig.get_config_var("CONFIG_ARGS"): - return + ffi_inc = [sysconfig.get_config_var("LIBFFI_INCLUDEDIR")] + ffi_lib = None + #inc_dirs = self.inc_dirs.copy() + inc_dirs = self.compiler.include_dirs[:] if host_platform == 'darwin': - # OS X 10.5 comes with libffi.dylib; the include files are - # in /usr/include/ffi - inc_dirs.append('/usr/include/ffi') + if not self.use_system_libffi: + return + ffi_in_sdk = os.path.join(macosx_sdk_root(), "usr/include/ffi") + if os.path.exists(ffi_in_sdk): + ffi_inc = [ffi_in_sdk] + ffi_lib = 'ffi' + sources.remove('_ctypes/malloc_closure.c') + else: + # OS X 10.5 comes with libffi.dylib; the include files are + # in /usr/include/ffi + inc_dirs.append('/usr/include/ffi') - ffi_inc = [sysconfig.get_config_var("LIBFFI_INCLUDEDIR")] if not ffi_inc or ffi_inc[0] == '': ffi_inc = find_file('ffi.h', [], inc_dirs) if ffi_inc is not None: @@ -2247,8 +2267,7 @@ class PyBuildExt(build_ext): ffi_inc = None print('Header file {} does not define LIBFFI_H or ' 'ffi_wrapper_h'.format(ffi_h)) - ffi_lib = None - if ffi_inc is not None: + if ffi_lib is None and ffi_inc is not None: for lib_name in ('ffi_convenience', 'ffi_pic', 'ffi'): if (self.compiler.find_library_file(lib_dirs, lib_name)): ffi_lib = lib_name -- 2.30.1 0005-ctypes-use-the-correct-ABI-for-variadic-functions.patch000066400000000000000000000204051517431316200431220ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.7.18/Python-2.7.18From 4394ec26842b04335b30b9a0595fcc8591c68496 Mon Sep 17 00:00:00 2001 From: Takumi Sueda Date: Sat, 11 Sep 2021 18:59:44 +0900 Subject: [PATCH 5/7] ctypes: use the correct ABI for variadic functions Modified and imported from https://github.com/Homebrew/formula-patches/blob/master/python/3.8.7.patch --- Doc/library/ctypes.rst | 6 +++++ Lib/test/test_str.py | 2 ++ Lib/test/test_unicode.py | 3 +++ Modules/_ctypes/_ctypes.c | 31 +++++++++++++++++++++++ Modules/_ctypes/callproc.c | 51 +++++++++++++++++++++++++++++--------- Modules/_ctypes/ctypes.h | 1 + 6 files changed, 82 insertions(+), 12 deletions(-) diff --git a/Doc/library/ctypes.rst b/Doc/library/ctypes.rst index 6a5299145f..ec97da607f 100644 --- a/Doc/library/ctypes.rst +++ b/Doc/library/ctypes.rst @@ -1584,6 +1584,12 @@ They are instances of a private class: value usable as argument (integer, string, ctypes instance). This allows defining adapters that can adapt custom objects as function parameters. + .. attribute:: variadic + + Assign a boolean to specify that the function takes a variable number of + arguments. This does not matter on most platforms, but for Apple arm64 + platforms variadic functions have a different calling convention than + normal functions. .. attribute:: errcheck diff --git a/Lib/test/test_str.py b/Lib/test/test_str.py index 73ed542a51..131f6d13e0 100644 --- a/Lib/test/test_str.py +++ b/Lib/test/test_str.py @@ -489,6 +489,8 @@ class CAPITest(unittest.TestCase): c_char_p) PyString_FromFormat = pythonapi.PyString_FromFormat + PyString_FromFormat.variadic = True + PyString_FromFormat.argtypes = (c_char_p,) PyString_FromFormat.restype = py_object # basic tests diff --git a/Lib/test/test_unicode.py b/Lib/test/test_unicode.py index 92476f68a5..23e9e643e0 100644 --- a/Lib/test/test_unicode.py +++ b/Lib/test/test_unicode.py @@ -1676,6 +1676,7 @@ class CAPITest(unittest.TestCase): def test_from_format(self): test_support.import_module('ctypes') from ctypes import ( + c_char_p, pythonapi, py_object, sizeof, c_int, c_long, c_longlong, c_ssize_t, c_uint, c_ulong, c_ulonglong, c_size_t, c_void_p) @@ -1684,6 +1685,8 @@ class CAPITest(unittest.TestCase): else: name = "PyUnicodeUCS4_FromFormat" _PyUnicode_FromFormat = getattr(pythonapi, name) + _PyUnicode_FromFormat.argtypes = (c_char_p,) + _PyUnicode_FromFormat.variadic = True _PyUnicode_FromFormat.restype = py_object def PyUnicode_FromFormat(format, *args): diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c index bef251ef04..d03b98d09c 100644 --- a/Modules/_ctypes/_ctypes.c +++ b/Modules/_ctypes/_ctypes.c @@ -3253,6 +3253,34 @@ PyCFuncPtr_get_restype(PyCFuncPtrObject *self) } } +static int +PyCFuncPtr_set_variadic(PyCFuncPtrObject *self, PyObject *ob) +{ + StgDictObject *dict = PyObject_stgdict((PyObject *)self); + assert(dict); + int r = PyObject_IsTrue(ob); + if (r == 1) { + dict->flags |= FUNCFLAG_VARIADIC; + return 0; + } else if (r == 0) { + dict->flags &= ~FUNCFLAG_VARIADIC; + return 0; + } else { + return -1; + } +} + +static PyObject * +PyCFuncPtr_get_variadic(PyCFuncPtrObject *self) +{ + StgDictObject *dict = PyObject_stgdict((PyObject *)self); + assert(dict); /* Cannot be NULL for PyCFuncPtrObject instances */ + if (dict->flags & FUNCFLAG_VARIADIC) + Py_RETURN_TRUE; + else + Py_RETURN_FALSE; +} + static int PyCFuncPtr_set_argtypes(PyCFuncPtrObject *self, PyObject *ob) { @@ -3299,6 +3327,8 @@ static PyGetSetDef PyCFuncPtr_getsets[] = { { "argtypes", (getter)PyCFuncPtr_get_argtypes, (setter)PyCFuncPtr_set_argtypes, "specify the argument types", NULL }, + { "variadic", (getter)PyCFuncPtr_get_variadic, (setter)PyCFuncPtr_set_variadic, + "specify if function takes variable number of arguments", NULL }, { NULL, NULL } }; @@ -5838,6 +5868,7 @@ init_ctypes(void) PyModule_AddObject(m, "FUNCFLAG_USE_ERRNO", PyInt_FromLong(FUNCFLAG_USE_ERRNO)); PyModule_AddObject(m, "FUNCFLAG_USE_LASTERROR", PyInt_FromLong(FUNCFLAG_USE_LASTERROR)); PyModule_AddObject(m, "FUNCFLAG_PYTHONAPI", PyInt_FromLong(FUNCFLAG_PYTHONAPI)); + PyModule_AddObject(m, "FUNCFLAG_VARIADIC", PyInt_FromLong(FUNCFLAG_VARIADIC)); PyModule_AddStringConstant(m, "__version__", "1.1.0"); PyModule_AddObject(m, "_memmove_addr", PyLong_FromVoidPtr(memmove)); diff --git a/Modules/_ctypes/callproc.c b/Modules/_ctypes/callproc.c index 066fefc0cc..39a539db47 100644 --- a/Modules/_ctypes/callproc.c +++ b/Modules/_ctypes/callproc.c @@ -88,6 +88,9 @@ #define DONT_USE_SEH #endif +#if defined(__APPLE__) && __arm64__ +#define HAVE_FFI_PREP_CIF_VAR 1 +#endif #define CTYPES_CAPSULE_ERROROBJ "_ctypes/callproc.c error object" CTYPES_CAPSULE_INSTANTIATE_DESTRUCTOR(CTYPES_CAPSULE_ERROROBJ) @@ -773,7 +776,8 @@ static int _call_function_pointer(int flags, ffi_type **atypes, ffi_type *restype, void *resmem, - int argcount) + int argcount, + int argtypecount) { #ifdef WITH_THREAD PyThreadState *_save = NULL; /* For Py_BLOCK_THREADS and Py_UNBLOCK_THREADS */ @@ -801,15 +805,39 @@ static int _call_function_pointer(int flags, if ((flags & FUNCFLAG_CDECL) == 0) cc = FFI_STDCALL; #endif - if (FFI_OK != ffi_prep_cif(&cif, - cc, - argcount, - restype, - atypes)) { - PyErr_SetString(PyExc_RuntimeError, - "ffi_prep_cif failed"); - return -1; + +#if HAVE_FFI_PREP_CIF_VAR + /* Everyone SHOULD set f.variadic=True on variadic function pointers, but + * lots of existing code will not. If there's at least one arg and more + * args are passed than are defined in the prototype, then it must be a + * variadic function. */ + if ((flags & FUNCFLAG_VARIADIC) || + (argtypecount != 0 && argcount > argtypecount)) + { + if (FFI_OK != ffi_prep_cif_var(&cif, + cc, + argtypecount, + argcount, + restype, + atypes)) { + PyErr_SetString(PyExc_RuntimeError, + "ffi_prep_cif_var failed"); + return -1; + } + } else { +#endif + if (FFI_OK != ffi_prep_cif(&cif, + cc, + argcount, + restype, + atypes)) { + PyErr_SetString(PyExc_RuntimeError, + "ffi_prep_cif failed"); + return -1; + } +#if HAVE_FFI_PREP_CIF_VAR } +#endif if (flags & (FUNCFLAG_USE_ERRNO | FUNCFLAG_USE_LASTERROR)) { error_object = _ctypes_get_errobj(&space); @@ -1181,9 +1209,8 @@ PyObject *_ctypes_callproc(PPROC pProc, if (-1 == _call_function_pointer(flags, pProc, avalues, atypes, rtype, resbuf, - Py_SAFE_DOWNCAST(argcount, - Py_ssize_t, - int))) + Py_SAFE_DOWNCAST(argcount, Py_ssize_t, int), + Py_SAFE_DOWNCAST(argtype_count, Py_ssize_t, int))) goto cleanup; #ifdef WORDS_BIGENDIAN diff --git a/Modules/_ctypes/ctypes.h b/Modules/_ctypes/ctypes.h index 12b56c4342..8aec3d1ade 100644 --- a/Modules/_ctypes/ctypes.h +++ b/Modules/_ctypes/ctypes.h @@ -325,6 +325,7 @@ PyObject *_ctypes_callproc(PPROC pProc, #define FUNCFLAG_PYTHONAPI 0x4 #define FUNCFLAG_USE_ERRNO 0x8 #define FUNCFLAG_USE_LASTERROR 0x10 +#define FUNCFLAG_VARIADIC 0x20 #define TYPEFLAG_ISPOINTER 0x100 #define TYPEFLAG_HASPOINTER 0x200 -- 2.30.1 0006-ctypes-probe-libffi-for-ffi_closure_alloc-and-ffi_pr.patch000066400000000000000000000100641517431316200437460ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.7.18/Python-2.7.18From 43819cd35cddd189cbe513032e76f1c1a6ec6d8c Mon Sep 17 00:00:00 2001 From: Takumi Sueda Date: Sat, 11 Sep 2021 19:14:50 +0900 Subject: [PATCH 6/7] ctypes: probe libffi for ffi_closure_alloc and ffi_prep_cif_var Modified and imported from https://github.com/Homebrew/formula-patches/blob/master/python/3.8.7.patch --- Modules/_ctypes/callproc.c | 4 ---- setup.py | 34 +++++++++++++++++++++++++--------- 2 files changed, 25 insertions(+), 13 deletions(-) diff --git a/Modules/_ctypes/callproc.c b/Modules/_ctypes/callproc.c index 39a539db47..5273e8d246 100644 --- a/Modules/_ctypes/callproc.c +++ b/Modules/_ctypes/callproc.c @@ -88,10 +88,6 @@ #define DONT_USE_SEH #endif -#if defined(__APPLE__) && __arm64__ -#define HAVE_FFI_PREP_CIF_VAR 1 -#endif - #define CTYPES_CAPSULE_ERROROBJ "_ctypes/callproc.c error object" CTYPES_CAPSULE_INSTANTIATE_DESTRUCTOR(CTYPES_CAPSULE_ERROROBJ) diff --git a/setup.py b/setup.py index c92d0552e3..beaf60f3e5 100644 --- a/setup.py +++ b/setup.py @@ -141,6 +141,13 @@ def is_macosx_sdk_path(path): or path.startswith('/System/') or path.startswith('/Library/') ) +def grep_headers_for(function, headers): + for header in headers: + with open(header, 'r') as f: + if function in f.read(): + return True + return False + def find_file(filename, std_dirs, paths): """Searches for the directory where a given file is located, and returns a possibly-empty list of additional directories, or None @@ -2235,7 +2242,7 @@ class PyBuildExt(build_ext): sources=['_ctypes/_ctypes_test.c']) self.extensions.extend([ext, ext_test]) - ffi_inc = [sysconfig.get_config_var("LIBFFI_INCLUDEDIR")] + ffi_inc = sysconfig.get_config_var("LIBFFI_INCLUDEDIR") ffi_lib = None #inc_dirs = self.inc_dirs.copy() @@ -2245,18 +2252,19 @@ class PyBuildExt(build_ext): return ffi_in_sdk = os.path.join(macosx_sdk_root(), "usr/include/ffi") if os.path.exists(ffi_in_sdk): - ffi_inc = [ffi_in_sdk] + ffi_inc = ffi_in_sdk ffi_lib = 'ffi' - sources.remove('_ctypes/malloc_closure.c') else: # OS X 10.5 comes with libffi.dylib; the include files are # in /usr/include/ffi inc_dirs.append('/usr/include/ffi') - if not ffi_inc or ffi_inc[0] == '': - ffi_inc = find_file('ffi.h', [], inc_dirs) - if ffi_inc is not None: - ffi_h = ffi_inc[0] + '/ffi.h' + if not ffi_inc: + found = find_file('ffi.h', [], inc_dirs) + if found: + ffi_inc = found[0] + if ffi_inc: + ffi_h = ffi_inc + '/ffi.h' with open(ffi_h) as f: for line in f: line = line.strip() @@ -2267,14 +2275,22 @@ class PyBuildExt(build_ext): ffi_inc = None print('Header file {} does not define LIBFFI_H or ' 'ffi_wrapper_h'.format(ffi_h)) - if ffi_lib is None and ffi_inc is not None: + if ffi_lib is None and ffi_inc: for lib_name in ('ffi_convenience', 'ffi_pic', 'ffi'): if (self.compiler.find_library_file(lib_dirs, lib_name)): ffi_lib = lib_name break if ffi_inc and ffi_lib: - ext.include_dirs.extend(ffi_inc) + ffi_headers = glob(os.path.join(ffi_inc, '*.h')) + if grep_headers_for('ffi_closure_alloc', ffi_headers): + try: + sources.remove('_ctypes/malloc_closure.c') + except ValueError: + pass + if grep_headers_for('ffi_prep_cif_var', ffi_headers): + ext.extra_compile_args.append("-DHAVE_FFI_PREP_CIF_VAR=1") + ext.include_dirs.append(ffi_inc) ext.libraries.append(ffi_lib) self.use_system_libffi = True -- 2.30.1 0007-Remove-QuickTime-from-link-args.patch000066400000000000000000000027251517431316200376240ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.7.18/Python-2.7.18From 41ee254166bb690feb665991fc2442e335631314 Mon Sep 17 00:00:00 2001 From: Takumi Sueda Date: Sat, 11 Sep 2021 19:20:30 +0900 Subject: [PATCH 7/7] Remove QuickTime from link args --- Mac/Modules/qt/setup.py | 2 +- setup.py | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/Mac/Modules/qt/setup.py b/Mac/Modules/qt/setup.py index 8442011ab9..4b5bc2bc20 100644 --- a/Mac/Modules/qt/setup.py +++ b/Mac/Modules/qt/setup.py @@ -6,7 +6,7 @@ from distutils.core import Extension, setup setup(name="QuickTime", version="0.2", ext_modules=[ Extension('QuickTime._Qt', ['_Qtmodule.c'], - extra_link_args=['-framework', 'Carbon', '-framework', 'QuickTime']) + extra_link_args=['-framework', 'Carbon']) ], py_modules=['QuickTime.Qt', 'QuickTime.QuickTime'], package_dir={'QuickTime':'../../../Lib/plat-mac/Carbon'} diff --git a/setup.py b/setup.py index beaf60f3e5..ff2298af91 100644 --- a/setup.py +++ b/setup.py @@ -1819,8 +1819,7 @@ class PyBuildExt(build_ext): exts.append( Extension('_Qt', ['qt/_Qtmodule.c'], extra_compile_args=carbon_extra_compile_args, - extra_link_args=['-framework', 'QuickTime', - '-framework', 'Carbon']) ) + extra_link_args=['-framework', 'Carbon']) ) self.extensions.extend(exts) -- 2.30.1 pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.7.2/000077500000000000000000000000001517431316200262115ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.7.2/Python-2.7.2/000077500000000000000000000000001517431316200301365ustar00rootroot00000000000000002_readline63.patch000066400000000000000000000034721517431316200334230ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.7.2/Python-2.7.2diff -r -u ../Python-2.7.6.orig/Modules/readline.c ./Modules/readline.c --- ../Python-2.7.6.orig/Modules/readline.c 2013-11-10 16:36:41.000000000 +0900 +++ ./Modules/readline.c 2014-03-29 16:17:48.643305752 +0900 @@ -206,8 +206,7 @@ if (!PyArg_ParseTuple(args, buf, &function)) return NULL; if (function == Py_None) { - Py_XDECREF(*hook_var); - *hook_var = NULL; + Py_CLEAR(*hook_var); } else if (PyCallable_Check(function)) { PyObject *tmp = *hook_var; @@ -750,14 +749,22 @@ } static int +#if defined(_RL_FUNCTION_TYPEDEF) on_startup_hook(void) +#else +on_startup_hook() +#endif { return on_hook(startup_hook); } #ifdef HAVE_RL_PRE_INPUT_HOOK static int +#if defined(_RL_FUNCTION_TYPEDEF) on_pre_input_hook(void) +#else +on_pre_input_hook() +#endif { return on_hook(pre_input_hook); } @@ -852,7 +859,7 @@ * before calling the normal completer */ static char ** -flex_complete(char *text, int start, int end) +flex_complete(const char *text, int start, int end) { #ifdef HAVE_RL_COMPLETION_APPEND_CHARACTER rl_completion_append_character ='\0'; @@ -911,12 +918,12 @@ rl_bind_key_in_map ('\t', rl_complete, emacs_meta_keymap); rl_bind_key_in_map ('\033', rl_complete, emacs_meta_keymap); /* Set our hook functions */ - rl_startup_hook = (Function *)on_startup_hook; + rl_startup_hook = on_startup_hook; #ifdef HAVE_RL_PRE_INPUT_HOOK - rl_pre_input_hook = (Function *)on_pre_input_hook; + rl_pre_input_hook = on_pre_input_hook; #endif /* Set our completion function */ - rl_attempted_completion_function = (CPPFunction *)flex_complete; + rl_attempted_completion_function = flex_complete; /* Set Python word break characters */ completer_word_break_characters = rl_completer_word_break_characters = 003_system_library_path_in_sys_path.patch000066400000000000000000000012701517431316200401460ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.7.2/Python-2.7.2Only in .: 003_system_library_path_in_sys_path.patch diff -ur ../Python-2.7.2/Lib/site.py ./Lib/site.py --- ../Python-2.7.2/Lib/site.py 2014-12-12 10:59:47.000000000 +0200 +++ ./Lib/site.py 2014-12-12 11:24:28.000000000 +0200 @@ -312,7 +312,7 @@ # locations. from sysconfig import get_config_var framework = get_config_var("PYTHONFRAMEWORK") - if framework and "/%s.framework/"%(framework,) in prefix: + if False and framework and "/%s.framework/"%(framework,) in prefix: sitepackages.append( os.path.join("/Library", framework, sys.version[:3], "site-packages")) 010_ssl_no_ssl3.patch000066400000000000000000000065531517431316200337320ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.7.2/Python-2.7.2diff -r -u ../Python-2.7.2.orig/Lib/ssl.py ./Lib/ssl.py --- ../Python-2.7.2.orig/Lib/ssl.py 2011-06-11 15:46:25.000000000 +0000 +++ ./Lib/ssl.py 2015-12-18 13:55:37.444270735 +0000 @@ -62,29 +62,29 @@ from _ssl import OPENSSL_VERSION_NUMBER, OPENSSL_VERSION_INFO, OPENSSL_VERSION from _ssl import SSLError from _ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED -from _ssl import RAND_status, RAND_egd, RAND_add -from _ssl import \ - SSL_ERROR_ZERO_RETURN, \ - SSL_ERROR_WANT_READ, \ - SSL_ERROR_WANT_WRITE, \ - SSL_ERROR_WANT_X509_LOOKUP, \ - SSL_ERROR_SYSCALL, \ - SSL_ERROR_SSL, \ - SSL_ERROR_WANT_CONNECT, \ - SSL_ERROR_EOF, \ - SSL_ERROR_INVALID_ERROR_CODE -from _ssl import PROTOCOL_SSLv3, PROTOCOL_SSLv23, PROTOCOL_TLSv1 -_PROTOCOL_NAMES = { - PROTOCOL_TLSv1: "TLSv1", - PROTOCOL_SSLv23: "SSLv23", - PROTOCOL_SSLv3: "SSLv3", -} +from _ssl import RAND_status, RAND_add try: - from _ssl import PROTOCOL_SSLv2 + from _ssl import RAND_egd except ImportError: + # LibreSSL does not provide RAND_egd pass -else: - _PROTOCOL_NAMES[PROTOCOL_SSLv2] = "SSLv2" + +def _import_symbols(prefix): + for n in dir(_ssl): + if n.startswith(prefix): + globals()[n] = getattr(_ssl, n) + +_import_symbols('OP_') +_import_symbols('ALERT_DESCRIPTION_') +_import_symbols('SSL_ERROR_') +_import_symbols('PROTOCOL_') + +_PROTOCOL_NAMES = {value: name for name, value in globals().items() if name.startswith('PROTOCOL_')} + +try: + _SSLv2_IF_EXISTS = PROTOCOL_SSLv2 +except NameError: + _SSLv2_IF_EXISTS = None from socket import socket, _fileobject, _delegate_methods, error as socket_error from socket import getnameinfo as _getnameinfo @@ -416,7 +416,7 @@ d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)] return base64.decodestring(d) -def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv3, ca_certs=None): +def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None): """Retrieve the certificate from the server at the specified address, and return it as a PEM-encoded string. diff -r -u ../Python-2.7.2.orig/Modules/_ssl.c ./Modules/_ssl.c --- ../Python-2.7.2.orig/Modules/_ssl.c 2011-06-11 15:46:27.000000000 +0000 +++ ./Modules/_ssl.c 2015-12-18 13:49:22.254728756 +0000 @@ -65,7 +65,9 @@ #ifndef OPENSSL_NO_SSL2 PY_SSL_VERSION_SSL2, #endif +#ifndef OPENSSL_NO_SSL3 PY_SSL_VERSION_SSL3=1, +#endif PY_SSL_VERSION_SSL23, PY_SSL_VERSION_TLS1 }; @@ -302,8 +304,10 @@ PySSL_BEGIN_ALLOW_THREADS if (proto_version == PY_SSL_VERSION_TLS1) self->ctx = SSL_CTX_new(TLSv1_method()); /* Set up context */ +#ifndef OPENSSL_NO_SSL3 else if (proto_version == PY_SSL_VERSION_SSL3) self->ctx = SSL_CTX_new(SSLv3_method()); /* Set up context */ +#endif #ifndef OPENSSL_NO_SSL2 else if (proto_version == PY_SSL_VERSION_SSL2) self->ctx = SSL_CTX_new(SSLv2_method()); /* Set up context */ @@ -1716,8 +1720,10 @@ PyModule_AddIntConstant(m, "PROTOCOL_SSLv2", PY_SSL_VERSION_SSL2); #endif +#ifndef OPENSSL_NO_SSL3 PyModule_AddIntConstant(m, "PROTOCOL_SSLv3", PY_SSL_VERSION_SSL3); +#endif PyModule_AddIntConstant(m, "PROTOCOL_SSLv23", PY_SSL_VERSION_SSL23); PyModule_AddIntConstant(m, "PROTOCOL_TLSv1", Only in ./Modules: _ssl.c.orig pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.7.3/000077500000000000000000000000001517431316200262125ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.7.3/Python-2.7.3/000077500000000000000000000000001517431316200301405ustar00rootroot00000000000000002_readline63.patch000066400000000000000000000034721517431316200334250ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.7.3/Python-2.7.3diff -r -u ../Python-2.7.6.orig/Modules/readline.c ./Modules/readline.c --- ../Python-2.7.6.orig/Modules/readline.c 2013-11-10 16:36:41.000000000 +0900 +++ ./Modules/readline.c 2014-03-29 16:17:48.643305752 +0900 @@ -206,8 +206,7 @@ if (!PyArg_ParseTuple(args, buf, &function)) return NULL; if (function == Py_None) { - Py_XDECREF(*hook_var); - *hook_var = NULL; + Py_CLEAR(*hook_var); } else if (PyCallable_Check(function)) { PyObject *tmp = *hook_var; @@ -750,14 +749,22 @@ } static int +#if defined(_RL_FUNCTION_TYPEDEF) on_startup_hook(void) +#else +on_startup_hook() +#endif { return on_hook(startup_hook); } #ifdef HAVE_RL_PRE_INPUT_HOOK static int +#if defined(_RL_FUNCTION_TYPEDEF) on_pre_input_hook(void) +#else +on_pre_input_hook() +#endif { return on_hook(pre_input_hook); } @@ -852,7 +859,7 @@ * before calling the normal completer */ static char ** -flex_complete(char *text, int start, int end) +flex_complete(const char *text, int start, int end) { #ifdef HAVE_RL_COMPLETION_APPEND_CHARACTER rl_completion_append_character ='\0'; @@ -911,12 +918,12 @@ rl_bind_key_in_map ('\t', rl_complete, emacs_meta_keymap); rl_bind_key_in_map ('\033', rl_complete, emacs_meta_keymap); /* Set our hook functions */ - rl_startup_hook = (Function *)on_startup_hook; + rl_startup_hook = on_startup_hook; #ifdef HAVE_RL_PRE_INPUT_HOOK - rl_pre_input_hook = (Function *)on_pre_input_hook; + rl_pre_input_hook = on_pre_input_hook; #endif /* Set our completion function */ - rl_attempted_completion_function = (CPPFunction *)flex_complete; + rl_attempted_completion_function = flex_complete; /* Set Python word break characters */ completer_word_break_characters = rl_completer_word_break_characters = 003_system_library_path_in_sys_path.patch000066400000000000000000000011401517431316200401440ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.7.3/Python-2.7.3Only in .: 003_system_library_path_in_sys_path.patch diff -ur ../Python-2.7.3/Lib/site.py ./Lib/site.py --- ../Python-2.7.3/Lib/site.py 2012-04-10 02:07:31.000000000 +0300 +++ ./Lib/site.py 2014-12-12 11:35:33.000000000 +0200 @@ -312,7 +312,7 @@ # locations. from sysconfig import get_config_var framework = get_config_var("PYTHONFRAMEWORK") - if framework: + if False and framework: sitepackages.append( os.path.join("/Library", framework, sys.version[:3], "site-packages")) 010_ssl_no_ssl3.patch000066400000000000000000000065631517431316200337350ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.7.3/Python-2.7.3diff -r -u ../Python-2.7.8.orig/Lib/ssl.py ./Lib/ssl.py --- ../Python-2.7.8.orig/Lib/ssl.py 2014-06-30 02:05:31.000000000 +0000 +++ ./Lib/ssl.py 2015-12-18 14:04:15.266072550 +0000 @@ -62,30 +62,29 @@ from _ssl import OPENSSL_VERSION_NUMBER, OPENSSL_VERSION_INFO, OPENSSL_VERSION from _ssl import SSLError from _ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED -from _ssl import RAND_status, RAND_egd, RAND_add -from _ssl import \ - SSL_ERROR_ZERO_RETURN, \ - SSL_ERROR_WANT_READ, \ - SSL_ERROR_WANT_WRITE, \ - SSL_ERROR_WANT_X509_LOOKUP, \ - SSL_ERROR_SYSCALL, \ - SSL_ERROR_SSL, \ - SSL_ERROR_WANT_CONNECT, \ - SSL_ERROR_EOF, \ - SSL_ERROR_INVALID_ERROR_CODE -from _ssl import PROTOCOL_SSLv3, PROTOCOL_SSLv23, PROTOCOL_TLSv1 -_PROTOCOL_NAMES = { - PROTOCOL_TLSv1: "TLSv1", - PROTOCOL_SSLv23: "SSLv23", - PROTOCOL_SSLv3: "SSLv3", -} +from _ssl import RAND_status, RAND_add try: - from _ssl import PROTOCOL_SSLv2 - _SSLv2_IF_EXISTS = PROTOCOL_SSLv2 + from _ssl import RAND_egd except ImportError: + # LibreSSL does not provide RAND_egd + pass + +def _import_symbols(prefix): + for n in dir(_ssl): + if n.startswith(prefix): + globals()[n] = getattr(_ssl, n) + +_import_symbols('OP_') +_import_symbols('ALERT_DESCRIPTION_') +_import_symbols('SSL_ERROR_') +_import_symbols('PROTOCOL_') + +_PROTOCOL_NAMES = {value: name for name, value in globals().items() if name.startswith('PROTOCOL_')} + +try: + _SSLv2_IF_EXISTS = PROTOCOL_SSLv2 +except NameError: _SSLv2_IF_EXISTS = None -else: - _PROTOCOL_NAMES[PROTOCOL_SSLv2] = "SSLv2" from socket import socket, _fileobject, _delegate_methods, error as socket_error from socket import getnameinfo as _getnameinfo @@ -436,7 +435,7 @@ d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)] return base64.decodestring(d) -def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv3, ca_certs=None): +def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None): """Retrieve the certificate from the server at the specified address, and return it as a PEM-encoded string. diff -r -u ../Python-2.7.8.orig/Modules/_ssl.c ./Modules/_ssl.c --- ../Python-2.7.8.orig/Modules/_ssl.c 2014-06-30 02:05:42.000000000 +0000 +++ ./Modules/_ssl.c 2015-12-18 14:02:42.618029896 +0000 @@ -67,7 +67,9 @@ #ifndef OPENSSL_NO_SSL2 PY_SSL_VERSION_SSL2, #endif +#ifndef OPENSSL_NO_SSL3 PY_SSL_VERSION_SSL3=1, +#endif PY_SSL_VERSION_SSL23, PY_SSL_VERSION_TLS1 }; @@ -306,8 +308,10 @@ PySSL_BEGIN_ALLOW_THREADS if (proto_version == PY_SSL_VERSION_TLS1) self->ctx = SSL_CTX_new(TLSv1_method()); /* Set up context */ +#ifndef OPENSSL_NO_SSL3 else if (proto_version == PY_SSL_VERSION_SSL3) self->ctx = SSL_CTX_new(SSLv3_method()); /* Set up context */ +#endif #ifndef OPENSSL_NO_SSL2 else if (proto_version == PY_SSL_VERSION_SSL2) self->ctx = SSL_CTX_new(SSLv2_method()); /* Set up context */ @@ -1808,8 +1812,10 @@ PyModule_AddIntConstant(m, "PROTOCOL_SSLv2", PY_SSL_VERSION_SSL2); #endif +#ifndef OPENSSL_NO_SSL3 PyModule_AddIntConstant(m, "PROTOCOL_SSLv3", PY_SSL_VERSION_SSL3); +#endif PyModule_AddIntConstant(m, "PROTOCOL_SSLv23", PY_SSL_VERSION_SSL23); PyModule_AddIntConstant(m, "PROTOCOL_TLSv1", pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.7.4/000077500000000000000000000000001517431316200262135ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.7.4/Python-2.7.4/000077500000000000000000000000001517431316200301425ustar00rootroot00000000000000002_readline63.patch000066400000000000000000000034721517431316200334270ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.7.4/Python-2.7.4diff -r -u ../Python-2.7.6.orig/Modules/readline.c ./Modules/readline.c --- ../Python-2.7.6.orig/Modules/readline.c 2013-11-10 16:36:41.000000000 +0900 +++ ./Modules/readline.c 2014-03-29 16:17:48.643305752 +0900 @@ -206,8 +206,7 @@ if (!PyArg_ParseTuple(args, buf, &function)) return NULL; if (function == Py_None) { - Py_XDECREF(*hook_var); - *hook_var = NULL; + Py_CLEAR(*hook_var); } else if (PyCallable_Check(function)) { PyObject *tmp = *hook_var; @@ -750,14 +749,22 @@ } static int +#if defined(_RL_FUNCTION_TYPEDEF) on_startup_hook(void) +#else +on_startup_hook() +#endif { return on_hook(startup_hook); } #ifdef HAVE_RL_PRE_INPUT_HOOK static int +#if defined(_RL_FUNCTION_TYPEDEF) on_pre_input_hook(void) +#else +on_pre_input_hook() +#endif { return on_hook(pre_input_hook); } @@ -852,7 +859,7 @@ * before calling the normal completer */ static char ** -flex_complete(char *text, int start, int end) +flex_complete(const char *text, int start, int end) { #ifdef HAVE_RL_COMPLETION_APPEND_CHARACTER rl_completion_append_character ='\0'; @@ -911,12 +918,12 @@ rl_bind_key_in_map ('\t', rl_complete, emacs_meta_keymap); rl_bind_key_in_map ('\033', rl_complete, emacs_meta_keymap); /* Set our hook functions */ - rl_startup_hook = (Function *)on_startup_hook; + rl_startup_hook = on_startup_hook; #ifdef HAVE_RL_PRE_INPUT_HOOK - rl_pre_input_hook = (Function *)on_pre_input_hook; + rl_pre_input_hook = on_pre_input_hook; #endif /* Set our completion function */ - rl_attempted_completion_function = (CPPFunction *)flex_complete; + rl_attempted_completion_function = flex_complete; /* Set Python word break characters */ completer_word_break_characters = rl_completer_word_break_characters = 003_system_library_path_in_sys_path.patch000066400000000000000000000011401517431316200401460ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.7.4/Python-2.7.4Only in .: 003_system_library_path_in_sys_path.patch diff -ur ../Python-2.7.3/Lib/site.py ./Lib/site.py --- ../Python-2.7.3/Lib/site.py 2012-04-10 02:07:31.000000000 +0300 +++ ./Lib/site.py 2014-12-12 11:35:33.000000000 +0200 @@ -312,7 +312,7 @@ # locations. from sysconfig import get_config_var framework = get_config_var("PYTHONFRAMEWORK") - if framework: + if False and framework: sitepackages.append( os.path.join("/Library", framework, sys.version[:3], "site-packages")) 010_ssl_no_ssl3.patch000066400000000000000000000065631517431316200337370ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.7.4/Python-2.7.4diff -r -u ../Python-2.7.8.orig/Lib/ssl.py ./Lib/ssl.py --- ../Python-2.7.8.orig/Lib/ssl.py 2014-06-30 02:05:31.000000000 +0000 +++ ./Lib/ssl.py 2015-12-18 14:04:15.266072550 +0000 @@ -62,30 +62,29 @@ from _ssl import OPENSSL_VERSION_NUMBER, OPENSSL_VERSION_INFO, OPENSSL_VERSION from _ssl import SSLError from _ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED -from _ssl import RAND_status, RAND_egd, RAND_add -from _ssl import \ - SSL_ERROR_ZERO_RETURN, \ - SSL_ERROR_WANT_READ, \ - SSL_ERROR_WANT_WRITE, \ - SSL_ERROR_WANT_X509_LOOKUP, \ - SSL_ERROR_SYSCALL, \ - SSL_ERROR_SSL, \ - SSL_ERROR_WANT_CONNECT, \ - SSL_ERROR_EOF, \ - SSL_ERROR_INVALID_ERROR_CODE -from _ssl import PROTOCOL_SSLv3, PROTOCOL_SSLv23, PROTOCOL_TLSv1 -_PROTOCOL_NAMES = { - PROTOCOL_TLSv1: "TLSv1", - PROTOCOL_SSLv23: "SSLv23", - PROTOCOL_SSLv3: "SSLv3", -} +from _ssl import RAND_status, RAND_add try: - from _ssl import PROTOCOL_SSLv2 - _SSLv2_IF_EXISTS = PROTOCOL_SSLv2 + from _ssl import RAND_egd except ImportError: + # LibreSSL does not provide RAND_egd + pass + +def _import_symbols(prefix): + for n in dir(_ssl): + if n.startswith(prefix): + globals()[n] = getattr(_ssl, n) + +_import_symbols('OP_') +_import_symbols('ALERT_DESCRIPTION_') +_import_symbols('SSL_ERROR_') +_import_symbols('PROTOCOL_') + +_PROTOCOL_NAMES = {value: name for name, value in globals().items() if name.startswith('PROTOCOL_')} + +try: + _SSLv2_IF_EXISTS = PROTOCOL_SSLv2 +except NameError: _SSLv2_IF_EXISTS = None -else: - _PROTOCOL_NAMES[PROTOCOL_SSLv2] = "SSLv2" from socket import socket, _fileobject, _delegate_methods, error as socket_error from socket import getnameinfo as _getnameinfo @@ -436,7 +435,7 @@ d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)] return base64.decodestring(d) -def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv3, ca_certs=None): +def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None): """Retrieve the certificate from the server at the specified address, and return it as a PEM-encoded string. diff -r -u ../Python-2.7.8.orig/Modules/_ssl.c ./Modules/_ssl.c --- ../Python-2.7.8.orig/Modules/_ssl.c 2014-06-30 02:05:42.000000000 +0000 +++ ./Modules/_ssl.c 2015-12-18 14:02:42.618029896 +0000 @@ -67,7 +67,9 @@ #ifndef OPENSSL_NO_SSL2 PY_SSL_VERSION_SSL2, #endif +#ifndef OPENSSL_NO_SSL3 PY_SSL_VERSION_SSL3=1, +#endif PY_SSL_VERSION_SSL23, PY_SSL_VERSION_TLS1 }; @@ -306,8 +308,10 @@ PySSL_BEGIN_ALLOW_THREADS if (proto_version == PY_SSL_VERSION_TLS1) self->ctx = SSL_CTX_new(TLSv1_method()); /* Set up context */ +#ifndef OPENSSL_NO_SSL3 else if (proto_version == PY_SSL_VERSION_SSL3) self->ctx = SSL_CTX_new(SSLv3_method()); /* Set up context */ +#endif #ifndef OPENSSL_NO_SSL2 else if (proto_version == PY_SSL_VERSION_SSL2) self->ctx = SSL_CTX_new(SSLv2_method()); /* Set up context */ @@ -1808,8 +1812,10 @@ PyModule_AddIntConstant(m, "PROTOCOL_SSLv2", PY_SSL_VERSION_SSL2); #endif +#ifndef OPENSSL_NO_SSL3 PyModule_AddIntConstant(m, "PROTOCOL_SSLv3", PY_SSL_VERSION_SSL3); +#endif PyModule_AddIntConstant(m, "PROTOCOL_SSLv23", PY_SSL_VERSION_SSL23); PyModule_AddIntConstant(m, "PROTOCOL_TLSv1", pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.7.5/000077500000000000000000000000001517431316200262145ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.7.5/Python-2.7.5/000077500000000000000000000000001517431316200301445ustar00rootroot00000000000000002_readline63.patch000066400000000000000000000034721517431316200334310ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.7.5/Python-2.7.5diff -r -u ../Python-2.7.6.orig/Modules/readline.c ./Modules/readline.c --- ../Python-2.7.6.orig/Modules/readline.c 2013-11-10 16:36:41.000000000 +0900 +++ ./Modules/readline.c 2014-03-29 16:17:48.643305752 +0900 @@ -206,8 +206,7 @@ if (!PyArg_ParseTuple(args, buf, &function)) return NULL; if (function == Py_None) { - Py_XDECREF(*hook_var); - *hook_var = NULL; + Py_CLEAR(*hook_var); } else if (PyCallable_Check(function)) { PyObject *tmp = *hook_var; @@ -750,14 +749,22 @@ } static int +#if defined(_RL_FUNCTION_TYPEDEF) on_startup_hook(void) +#else +on_startup_hook() +#endif { return on_hook(startup_hook); } #ifdef HAVE_RL_PRE_INPUT_HOOK static int +#if defined(_RL_FUNCTION_TYPEDEF) on_pre_input_hook(void) +#else +on_pre_input_hook() +#endif { return on_hook(pre_input_hook); } @@ -852,7 +859,7 @@ * before calling the normal completer */ static char ** -flex_complete(char *text, int start, int end) +flex_complete(const char *text, int start, int end) { #ifdef HAVE_RL_COMPLETION_APPEND_CHARACTER rl_completion_append_character ='\0'; @@ -911,12 +918,12 @@ rl_bind_key_in_map ('\t', rl_complete, emacs_meta_keymap); rl_bind_key_in_map ('\033', rl_complete, emacs_meta_keymap); /* Set our hook functions */ - rl_startup_hook = (Function *)on_startup_hook; + rl_startup_hook = on_startup_hook; #ifdef HAVE_RL_PRE_INPUT_HOOK - rl_pre_input_hook = (Function *)on_pre_input_hook; + rl_pre_input_hook = on_pre_input_hook; #endif /* Set our completion function */ - rl_attempted_completion_function = (CPPFunction *)flex_complete; + rl_attempted_completion_function = flex_complete; /* Set Python word break characters */ completer_word_break_characters = rl_completer_word_break_characters = 003_system_library_path_in_sys_path.patch000066400000000000000000000011401517431316200401500ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.7.5/Python-2.7.5Only in .: 003_system_library_path_in_sys_path.patch diff -ur ../Python-2.7.5/Lib/site.py ./Lib/site.py --- ../Python-2.7.5/Lib/site.py 2013-05-12 06:32:44.000000000 +0300 +++ ./Lib/site.py 2014-12-12 11:29:29.000000000 +0200 @@ -300,7 +300,7 @@ # locations. from sysconfig import get_config_var framework = get_config_var("PYTHONFRAMEWORK") - if framework: + if False and framework: sitepackages.append( os.path.join("/Library", framework, sys.version[:3], "site-packages")) 010_ssl_no_ssl3.patch000066400000000000000000000065631517431316200337410ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.7.5/Python-2.7.5diff -r -u ../Python-2.7.8.orig/Lib/ssl.py ./Lib/ssl.py --- ../Python-2.7.8.orig/Lib/ssl.py 2014-06-30 02:05:31.000000000 +0000 +++ ./Lib/ssl.py 2015-12-18 14:04:15.266072550 +0000 @@ -62,30 +62,29 @@ from _ssl import OPENSSL_VERSION_NUMBER, OPENSSL_VERSION_INFO, OPENSSL_VERSION from _ssl import SSLError from _ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED -from _ssl import RAND_status, RAND_egd, RAND_add -from _ssl import \ - SSL_ERROR_ZERO_RETURN, \ - SSL_ERROR_WANT_READ, \ - SSL_ERROR_WANT_WRITE, \ - SSL_ERROR_WANT_X509_LOOKUP, \ - SSL_ERROR_SYSCALL, \ - SSL_ERROR_SSL, \ - SSL_ERROR_WANT_CONNECT, \ - SSL_ERROR_EOF, \ - SSL_ERROR_INVALID_ERROR_CODE -from _ssl import PROTOCOL_SSLv3, PROTOCOL_SSLv23, PROTOCOL_TLSv1 -_PROTOCOL_NAMES = { - PROTOCOL_TLSv1: "TLSv1", - PROTOCOL_SSLv23: "SSLv23", - PROTOCOL_SSLv3: "SSLv3", -} +from _ssl import RAND_status, RAND_add try: - from _ssl import PROTOCOL_SSLv2 - _SSLv2_IF_EXISTS = PROTOCOL_SSLv2 + from _ssl import RAND_egd except ImportError: + # LibreSSL does not provide RAND_egd + pass + +def _import_symbols(prefix): + for n in dir(_ssl): + if n.startswith(prefix): + globals()[n] = getattr(_ssl, n) + +_import_symbols('OP_') +_import_symbols('ALERT_DESCRIPTION_') +_import_symbols('SSL_ERROR_') +_import_symbols('PROTOCOL_') + +_PROTOCOL_NAMES = {value: name for name, value in globals().items() if name.startswith('PROTOCOL_')} + +try: + _SSLv2_IF_EXISTS = PROTOCOL_SSLv2 +except NameError: _SSLv2_IF_EXISTS = None -else: - _PROTOCOL_NAMES[PROTOCOL_SSLv2] = "SSLv2" from socket import socket, _fileobject, _delegate_methods, error as socket_error from socket import getnameinfo as _getnameinfo @@ -436,7 +435,7 @@ d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)] return base64.decodestring(d) -def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv3, ca_certs=None): +def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None): """Retrieve the certificate from the server at the specified address, and return it as a PEM-encoded string. diff -r -u ../Python-2.7.8.orig/Modules/_ssl.c ./Modules/_ssl.c --- ../Python-2.7.8.orig/Modules/_ssl.c 2014-06-30 02:05:42.000000000 +0000 +++ ./Modules/_ssl.c 2015-12-18 14:02:42.618029896 +0000 @@ -67,7 +67,9 @@ #ifndef OPENSSL_NO_SSL2 PY_SSL_VERSION_SSL2, #endif +#ifndef OPENSSL_NO_SSL3 PY_SSL_VERSION_SSL3=1, +#endif PY_SSL_VERSION_SSL23, PY_SSL_VERSION_TLS1 }; @@ -306,8 +308,10 @@ PySSL_BEGIN_ALLOW_THREADS if (proto_version == PY_SSL_VERSION_TLS1) self->ctx = SSL_CTX_new(TLSv1_method()); /* Set up context */ +#ifndef OPENSSL_NO_SSL3 else if (proto_version == PY_SSL_VERSION_SSL3) self->ctx = SSL_CTX_new(SSLv3_method()); /* Set up context */ +#endif #ifndef OPENSSL_NO_SSL2 else if (proto_version == PY_SSL_VERSION_SSL2) self->ctx = SSL_CTX_new(SSLv2_method()); /* Set up context */ @@ -1808,8 +1812,10 @@ PyModule_AddIntConstant(m, "PROTOCOL_SSLv2", PY_SSL_VERSION_SSL2); #endif +#ifndef OPENSSL_NO_SSL3 PyModule_AddIntConstant(m, "PROTOCOL_SSLv3", PY_SSL_VERSION_SSL3); +#endif PyModule_AddIntConstant(m, "PROTOCOL_SSLv23", PY_SSL_VERSION_SSL23); PyModule_AddIntConstant(m, "PROTOCOL_TLSv1", pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.7.6/000077500000000000000000000000001517431316200262155ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.7.6/Python-2.7.6/000077500000000000000000000000001517431316200301465ustar00rootroot00000000000000002_readline63.patch000066400000000000000000000034721517431316200334330ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.7.6/Python-2.7.6diff -r -u ../Python-2.7.6.orig/Modules/readline.c ./Modules/readline.c --- ../Python-2.7.6.orig/Modules/readline.c 2013-11-10 16:36:41.000000000 +0900 +++ ./Modules/readline.c 2014-03-29 16:17:48.643305752 +0900 @@ -206,8 +206,7 @@ if (!PyArg_ParseTuple(args, buf, &function)) return NULL; if (function == Py_None) { - Py_XDECREF(*hook_var); - *hook_var = NULL; + Py_CLEAR(*hook_var); } else if (PyCallable_Check(function)) { PyObject *tmp = *hook_var; @@ -750,14 +749,22 @@ } static int +#if defined(_RL_FUNCTION_TYPEDEF) on_startup_hook(void) +#else +on_startup_hook() +#endif { return on_hook(startup_hook); } #ifdef HAVE_RL_PRE_INPUT_HOOK static int +#if defined(_RL_FUNCTION_TYPEDEF) on_pre_input_hook(void) +#else +on_pre_input_hook() +#endif { return on_hook(pre_input_hook); } @@ -852,7 +859,7 @@ * before calling the normal completer */ static char ** -flex_complete(char *text, int start, int end) +flex_complete(const char *text, int start, int end) { #ifdef HAVE_RL_COMPLETION_APPEND_CHARACTER rl_completion_append_character ='\0'; @@ -911,12 +918,12 @@ rl_bind_key_in_map ('\t', rl_complete, emacs_meta_keymap); rl_bind_key_in_map ('\033', rl_complete, emacs_meta_keymap); /* Set our hook functions */ - rl_startup_hook = (Function *)on_startup_hook; + rl_startup_hook = on_startup_hook; #ifdef HAVE_RL_PRE_INPUT_HOOK - rl_pre_input_hook = (Function *)on_pre_input_hook; + rl_pre_input_hook = on_pre_input_hook; #endif /* Set our completion function */ - rl_attempted_completion_function = (CPPFunction *)flex_complete; + rl_attempted_completion_function = flex_complete; /* Set Python word break characters */ completer_word_break_characters = rl_completer_word_break_characters = 003_system_library_path_in_sys_path.patch000066400000000000000000000011401517431316200401520ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.7.6/Python-2.7.6Only in .: 003_system_library_path_in_sys_path.patch diff -ur ../Python-2.7.5/Lib/site.py ./Lib/site.py --- ../Python-2.7.5/Lib/site.py 2013-05-12 06:32:44.000000000 +0300 +++ ./Lib/site.py 2014-12-12 11:29:29.000000000 +0200 @@ -300,7 +300,7 @@ # locations. from sysconfig import get_config_var framework = get_config_var("PYTHONFRAMEWORK") - if framework: + if False and framework: sitepackages.append( os.path.join("/Library", framework, sys.version[:3], "site-packages")) 010_ssl_no_ssl3.patch000066400000000000000000000065631517431316200337430ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.7.6/Python-2.7.6diff -r -u ../Python-2.7.8.orig/Lib/ssl.py ./Lib/ssl.py --- ../Python-2.7.8.orig/Lib/ssl.py 2014-06-30 02:05:31.000000000 +0000 +++ ./Lib/ssl.py 2015-12-18 14:04:15.266072550 +0000 @@ -62,30 +62,29 @@ from _ssl import OPENSSL_VERSION_NUMBER, OPENSSL_VERSION_INFO, OPENSSL_VERSION from _ssl import SSLError from _ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED -from _ssl import RAND_status, RAND_egd, RAND_add -from _ssl import \ - SSL_ERROR_ZERO_RETURN, \ - SSL_ERROR_WANT_READ, \ - SSL_ERROR_WANT_WRITE, \ - SSL_ERROR_WANT_X509_LOOKUP, \ - SSL_ERROR_SYSCALL, \ - SSL_ERROR_SSL, \ - SSL_ERROR_WANT_CONNECT, \ - SSL_ERROR_EOF, \ - SSL_ERROR_INVALID_ERROR_CODE -from _ssl import PROTOCOL_SSLv3, PROTOCOL_SSLv23, PROTOCOL_TLSv1 -_PROTOCOL_NAMES = { - PROTOCOL_TLSv1: "TLSv1", - PROTOCOL_SSLv23: "SSLv23", - PROTOCOL_SSLv3: "SSLv3", -} +from _ssl import RAND_status, RAND_add try: - from _ssl import PROTOCOL_SSLv2 - _SSLv2_IF_EXISTS = PROTOCOL_SSLv2 + from _ssl import RAND_egd except ImportError: + # LibreSSL does not provide RAND_egd + pass + +def _import_symbols(prefix): + for n in dir(_ssl): + if n.startswith(prefix): + globals()[n] = getattr(_ssl, n) + +_import_symbols('OP_') +_import_symbols('ALERT_DESCRIPTION_') +_import_symbols('SSL_ERROR_') +_import_symbols('PROTOCOL_') + +_PROTOCOL_NAMES = {value: name for name, value in globals().items() if name.startswith('PROTOCOL_')} + +try: + _SSLv2_IF_EXISTS = PROTOCOL_SSLv2 +except NameError: _SSLv2_IF_EXISTS = None -else: - _PROTOCOL_NAMES[PROTOCOL_SSLv2] = "SSLv2" from socket import socket, _fileobject, _delegate_methods, error as socket_error from socket import getnameinfo as _getnameinfo @@ -436,7 +435,7 @@ d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)] return base64.decodestring(d) -def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv3, ca_certs=None): +def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None): """Retrieve the certificate from the server at the specified address, and return it as a PEM-encoded string. diff -r -u ../Python-2.7.8.orig/Modules/_ssl.c ./Modules/_ssl.c --- ../Python-2.7.8.orig/Modules/_ssl.c 2014-06-30 02:05:42.000000000 +0000 +++ ./Modules/_ssl.c 2015-12-18 14:02:42.618029896 +0000 @@ -67,7 +67,9 @@ #ifndef OPENSSL_NO_SSL2 PY_SSL_VERSION_SSL2, #endif +#ifndef OPENSSL_NO_SSL3 PY_SSL_VERSION_SSL3=1, +#endif PY_SSL_VERSION_SSL23, PY_SSL_VERSION_TLS1 }; @@ -306,8 +308,10 @@ PySSL_BEGIN_ALLOW_THREADS if (proto_version == PY_SSL_VERSION_TLS1) self->ctx = SSL_CTX_new(TLSv1_method()); /* Set up context */ +#ifndef OPENSSL_NO_SSL3 else if (proto_version == PY_SSL_VERSION_SSL3) self->ctx = SSL_CTX_new(SSLv3_method()); /* Set up context */ +#endif #ifndef OPENSSL_NO_SSL2 else if (proto_version == PY_SSL_VERSION_SSL2) self->ctx = SSL_CTX_new(SSLv2_method()); /* Set up context */ @@ -1808,8 +1812,10 @@ PyModule_AddIntConstant(m, "PROTOCOL_SSLv2", PY_SSL_VERSION_SSL2); #endif +#ifndef OPENSSL_NO_SSL3 PyModule_AddIntConstant(m, "PROTOCOL_SSLv3", PY_SSL_VERSION_SSL3); +#endif PyModule_AddIntConstant(m, "PROTOCOL_SSLv23", PY_SSL_VERSION_SSL23); PyModule_AddIntConstant(m, "PROTOCOL_TLSv1", 012_fix_bundle_loader_for_new_osx.patch000066400000000000000000000043271517431316200375550ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.7.6/Python-2.7.6diff -ur ../Python-2.7.6/configure ./configure --- ../Python-2.7.6/configure 2014-06-19 14:35:59.000000000 -0400 +++ ./configure 2018-04-24 12:44:24.143179222 -0400 @@ -6045,8 +6045,14 @@ # Calculate the right deployment target for this build. # - cur_target=`sw_vers -productVersion | sed 's/\(10\.[0-9]*\).*/\1/'` - if test ${cur_target} '>' 10.2; then + cur_target_major=`sw_vers -productVersion | \ + sed 's/\([0-9]*\)\.\([0-9]*\).*/\1/'` + cur_target_minor=`sw_vers -productVersion | \ + sed 's/\([0-9]*\)\.\([0-9]*\).*/\2/'` + cur_target="${cur_target_major}.${cur_target_minor}" + if test ${cur_target_major} -eq 10 && \ + test ${cur_target_minor} -ge 3 + then cur_target=10.3 if test ${enable_universalsdk}; then if test "${UNIVERSAL_ARCHS}" = "all"; then @@ -8230,15 +8236,14 @@ # Use -undefined dynamic_lookup whenever possible (10.3 and later). # This allows an extension to be used in any Python - if test ${MACOSX_DEPLOYMENT_TARGET} '>' 10.2 + dep_target_major=`echo ${MACOSX_DEPLOYMENT_TARGET} | \ + sed 's/\([0-9]*\)\.\([0-9]*\).*/\1/'` + dep_target_minor=`echo ${MACOSX_DEPLOYMENT_TARGET} | \ + sed 's/\([0-9]*\)\.\([0-9]*\).*/\2/'` + if test ${dep_target_major} -eq 10 && \ + test ${dep_target_minor} -le 2 then - if test "${enable_universalsdk}"; then - LDFLAGS="${UNIVERSAL_ARCH_FLAGS} -isysroot ${UNIVERSALSDK} ${LDFLAGS}" - fi - LDSHARED='$(CC) -bundle -undefined dynamic_lookup' - LDCXXSHARED='$(CXX) -bundle -undefined dynamic_lookup' - BLDSHARED="$LDSHARED" - else + # building for OS X 10.0 through 10.2 LDSHARED='$(CC) -bundle' LDCXXSHARED='$(CXX) -bundle' if test "$enable_framework" ; then @@ -8252,6 +8257,14 @@ LDSHARED="$LDSHARED "'-bundle_loader $(BINDIR)/python$(VERSION)$(EXE)' LDCXXSHARED="$LDCXXSHARED "'-bundle_loader $(BINDIR)/python$(VERSION)$(EXE)' fi + else + # building for OS X 10.3 and later + if test "${enable_universalsdk}"; then + LDFLAGS="${UNIVERSAL_ARCH_FLAGS} -isysroot ${UNIVERSALSDK} ${LDFLAGS}" + fi + LDSHARED='$(CC) -bundle -undefined dynamic_lookup' + LDCXXSHARED='$(CXX) -bundle -undefined dynamic_lookup' + BLDSHARED="$LDSHARED" fi ;; Linux*|GNU*|QNX*) pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.7.7/000077500000000000000000000000001517431316200262165ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.7.7/Python-2.7.7/000077500000000000000000000000001517431316200301505ustar00rootroot00000000000000003_system_library_path_in_sys_path.patch000066400000000000000000000011401517431316200401540ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.7.7/Python-2.7.7Only in .: 003_system_library_path_in_sys_path.patch diff -ur ../Python-2.7.5/Lib/site.py ./Lib/site.py --- ../Python-2.7.5/Lib/site.py 2013-05-12 06:32:44.000000000 +0300 +++ ./Lib/site.py 2014-12-12 11:29:29.000000000 +0200 @@ -300,7 +300,7 @@ # locations. from sysconfig import get_config_var framework = get_config_var("PYTHONFRAMEWORK") - if framework: + if False and framework: sitepackages.append( os.path.join("/Library", framework, sys.version[:3], "site-packages")) 010_ssl_no_ssl3.patch000066400000000000000000000065631517431316200337450ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.7.7/Python-2.7.7diff -r -u ../Python-2.7.8.orig/Lib/ssl.py ./Lib/ssl.py --- ../Python-2.7.8.orig/Lib/ssl.py 2014-06-30 02:05:31.000000000 +0000 +++ ./Lib/ssl.py 2015-12-18 14:04:15.266072550 +0000 @@ -62,30 +62,29 @@ from _ssl import OPENSSL_VERSION_NUMBER, OPENSSL_VERSION_INFO, OPENSSL_VERSION from _ssl import SSLError from _ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED -from _ssl import RAND_status, RAND_egd, RAND_add -from _ssl import \ - SSL_ERROR_ZERO_RETURN, \ - SSL_ERROR_WANT_READ, \ - SSL_ERROR_WANT_WRITE, \ - SSL_ERROR_WANT_X509_LOOKUP, \ - SSL_ERROR_SYSCALL, \ - SSL_ERROR_SSL, \ - SSL_ERROR_WANT_CONNECT, \ - SSL_ERROR_EOF, \ - SSL_ERROR_INVALID_ERROR_CODE -from _ssl import PROTOCOL_SSLv3, PROTOCOL_SSLv23, PROTOCOL_TLSv1 -_PROTOCOL_NAMES = { - PROTOCOL_TLSv1: "TLSv1", - PROTOCOL_SSLv23: "SSLv23", - PROTOCOL_SSLv3: "SSLv3", -} +from _ssl import RAND_status, RAND_add try: - from _ssl import PROTOCOL_SSLv2 - _SSLv2_IF_EXISTS = PROTOCOL_SSLv2 + from _ssl import RAND_egd except ImportError: + # LibreSSL does not provide RAND_egd + pass + +def _import_symbols(prefix): + for n in dir(_ssl): + if n.startswith(prefix): + globals()[n] = getattr(_ssl, n) + +_import_symbols('OP_') +_import_symbols('ALERT_DESCRIPTION_') +_import_symbols('SSL_ERROR_') +_import_symbols('PROTOCOL_') + +_PROTOCOL_NAMES = {value: name for name, value in globals().items() if name.startswith('PROTOCOL_')} + +try: + _SSLv2_IF_EXISTS = PROTOCOL_SSLv2 +except NameError: _SSLv2_IF_EXISTS = None -else: - _PROTOCOL_NAMES[PROTOCOL_SSLv2] = "SSLv2" from socket import socket, _fileobject, _delegate_methods, error as socket_error from socket import getnameinfo as _getnameinfo @@ -436,7 +435,7 @@ d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)] return base64.decodestring(d) -def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv3, ca_certs=None): +def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None): """Retrieve the certificate from the server at the specified address, and return it as a PEM-encoded string. diff -r -u ../Python-2.7.8.orig/Modules/_ssl.c ./Modules/_ssl.c --- ../Python-2.7.8.orig/Modules/_ssl.c 2014-06-30 02:05:42.000000000 +0000 +++ ./Modules/_ssl.c 2015-12-18 14:02:42.618029896 +0000 @@ -67,7 +67,9 @@ #ifndef OPENSSL_NO_SSL2 PY_SSL_VERSION_SSL2, #endif +#ifndef OPENSSL_NO_SSL3 PY_SSL_VERSION_SSL3=1, +#endif PY_SSL_VERSION_SSL23, PY_SSL_VERSION_TLS1 }; @@ -306,8 +308,10 @@ PySSL_BEGIN_ALLOW_THREADS if (proto_version == PY_SSL_VERSION_TLS1) self->ctx = SSL_CTX_new(TLSv1_method()); /* Set up context */ +#ifndef OPENSSL_NO_SSL3 else if (proto_version == PY_SSL_VERSION_SSL3) self->ctx = SSL_CTX_new(SSLv3_method()); /* Set up context */ +#endif #ifndef OPENSSL_NO_SSL2 else if (proto_version == PY_SSL_VERSION_SSL2) self->ctx = SSL_CTX_new(SSLv2_method()); /* Set up context */ @@ -1808,8 +1812,10 @@ PyModule_AddIntConstant(m, "PROTOCOL_SSLv2", PY_SSL_VERSION_SSL2); #endif +#ifndef OPENSSL_NO_SSL3 PyModule_AddIntConstant(m, "PROTOCOL_SSLv3", PY_SSL_VERSION_SSL3); +#endif PyModule_AddIntConstant(m, "PROTOCOL_SSLv23", PY_SSL_VERSION_SSL23); PyModule_AddIntConstant(m, "PROTOCOL_TLSv1", pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.7.8/000077500000000000000000000000001517431316200262175ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.7.8/Python-2.7.8/000077500000000000000000000000001517431316200301525ustar00rootroot00000000000000003_system_library_path_in_sys_path.patch000066400000000000000000000011401517431316200401560ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.7.8/Python-2.7.8Only in .: 003_system_library_path_in_sys_path.patch diff -ur ../Python-2.7.8/Lib/site.py ./Lib/site.py --- ../Python-2.7.8/Lib/site.py 2014-06-30 05:05:30.000000000 +0300 +++ ./Lib/site.py 2014-12-12 11:42:33.000000000 +0200 @@ -300,7 +300,7 @@ # locations. from sysconfig import get_config_var framework = get_config_var("PYTHONFRAMEWORK") - if framework: + if False and framework: sitepackages.append( os.path.join("/Library", framework, sys.version[:3], "site-packages")) 010_ssl_no_ssl3.patch000066400000000000000000000065631517431316200337470ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.7.8/Python-2.7.8diff -r -u ../Python-2.7.8.orig/Lib/ssl.py ./Lib/ssl.py --- ../Python-2.7.8.orig/Lib/ssl.py 2014-06-30 02:05:31.000000000 +0000 +++ ./Lib/ssl.py 2015-12-18 14:04:15.266072550 +0000 @@ -62,30 +62,29 @@ from _ssl import OPENSSL_VERSION_NUMBER, OPENSSL_VERSION_INFO, OPENSSL_VERSION from _ssl import SSLError from _ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED -from _ssl import RAND_status, RAND_egd, RAND_add -from _ssl import \ - SSL_ERROR_ZERO_RETURN, \ - SSL_ERROR_WANT_READ, \ - SSL_ERROR_WANT_WRITE, \ - SSL_ERROR_WANT_X509_LOOKUP, \ - SSL_ERROR_SYSCALL, \ - SSL_ERROR_SSL, \ - SSL_ERROR_WANT_CONNECT, \ - SSL_ERROR_EOF, \ - SSL_ERROR_INVALID_ERROR_CODE -from _ssl import PROTOCOL_SSLv3, PROTOCOL_SSLv23, PROTOCOL_TLSv1 -_PROTOCOL_NAMES = { - PROTOCOL_TLSv1: "TLSv1", - PROTOCOL_SSLv23: "SSLv23", - PROTOCOL_SSLv3: "SSLv3", -} +from _ssl import RAND_status, RAND_add try: - from _ssl import PROTOCOL_SSLv2 - _SSLv2_IF_EXISTS = PROTOCOL_SSLv2 + from _ssl import RAND_egd except ImportError: + # LibreSSL does not provide RAND_egd + pass + +def _import_symbols(prefix): + for n in dir(_ssl): + if n.startswith(prefix): + globals()[n] = getattr(_ssl, n) + +_import_symbols('OP_') +_import_symbols('ALERT_DESCRIPTION_') +_import_symbols('SSL_ERROR_') +_import_symbols('PROTOCOL_') + +_PROTOCOL_NAMES = {value: name for name, value in globals().items() if name.startswith('PROTOCOL_')} + +try: + _SSLv2_IF_EXISTS = PROTOCOL_SSLv2 +except NameError: _SSLv2_IF_EXISTS = None -else: - _PROTOCOL_NAMES[PROTOCOL_SSLv2] = "SSLv2" from socket import socket, _fileobject, _delegate_methods, error as socket_error from socket import getnameinfo as _getnameinfo @@ -436,7 +435,7 @@ d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)] return base64.decodestring(d) -def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv3, ca_certs=None): +def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None): """Retrieve the certificate from the server at the specified address, and return it as a PEM-encoded string. diff -r -u ../Python-2.7.8.orig/Modules/_ssl.c ./Modules/_ssl.c --- ../Python-2.7.8.orig/Modules/_ssl.c 2014-06-30 02:05:42.000000000 +0000 +++ ./Modules/_ssl.c 2015-12-18 14:02:42.618029896 +0000 @@ -67,7 +67,9 @@ #ifndef OPENSSL_NO_SSL2 PY_SSL_VERSION_SSL2, #endif +#ifndef OPENSSL_NO_SSL3 PY_SSL_VERSION_SSL3=1, +#endif PY_SSL_VERSION_SSL23, PY_SSL_VERSION_TLS1 }; @@ -306,8 +308,10 @@ PySSL_BEGIN_ALLOW_THREADS if (proto_version == PY_SSL_VERSION_TLS1) self->ctx = SSL_CTX_new(TLSv1_method()); /* Set up context */ +#ifndef OPENSSL_NO_SSL3 else if (proto_version == PY_SSL_VERSION_SSL3) self->ctx = SSL_CTX_new(SSLv3_method()); /* Set up context */ +#endif #ifndef OPENSSL_NO_SSL2 else if (proto_version == PY_SSL_VERSION_SSL2) self->ctx = SSL_CTX_new(SSLv2_method()); /* Set up context */ @@ -1808,8 +1812,10 @@ PyModule_AddIntConstant(m, "PROTOCOL_SSLv2", PY_SSL_VERSION_SSL2); #endif +#ifndef OPENSSL_NO_SSL3 PyModule_AddIntConstant(m, "PROTOCOL_SSLv3", PY_SSL_VERSION_SSL3); +#endif PyModule_AddIntConstant(m, "PROTOCOL_SSLv23", PY_SSL_VERSION_SSL23); PyModule_AddIntConstant(m, "PROTOCOL_TLSv1", pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.7.9/000077500000000000000000000000001517431316200262205ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.7.9/Python-2.7.9/000077500000000000000000000000001517431316200301545ustar00rootroot00000000000000003_system_library_path_in_sys_path.patch000066400000000000000000000011401517431316200401600ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.7.9/Python-2.7.9Only in .: 003_system_library_path_in_sys_path.patch diff -ur ../Python-2.7.9/Lib/site.py ./Lib/site.py --- ../Python-2.7.9/Lib/site.py 2014-06-30 05:05:30.000000000 +0300 +++ ./Lib/site.py 2014-12-12 11:42:33.000000000 +0200 @@ -300,7 +300,7 @@ # locations. from sysconfig import get_config_var framework = get_config_var("PYTHONFRAMEWORK") - if framework: + if False and framework: sitepackages.append( os.path.join("/Library", framework, sys.version[:3], "site-packages")) 010_ssl_no_ssl3.patch000066400000000000000000000011611517431316200337360ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/2.7.9/Python-2.7.9diff -r -u ../Python-2.7.9.orig/Lib/ssl.py ./Lib/ssl.py --- ../Python-2.7.9.orig/Lib/ssl.py 2014-12-10 15:59:40.000000000 +0000 +++ ./Lib/ssl.py 2015-12-18 14:09:51.218138658 +0000 @@ -106,7 +106,12 @@ from _ssl import (VERIFY_DEFAULT, VERIFY_CRL_CHECK_LEAF, VERIFY_CRL_CHECK_CHAIN, VERIFY_X509_STRICT) from _ssl import txt2obj as _txt2obj, nid2obj as _nid2obj -from _ssl import RAND_status, RAND_egd, RAND_add +from _ssl import RAND_status, RAND_add +try: + from _ssl import RAND_egd +except ImportError: + # LibreSSL does not provide RAND_egd + pass def _import_symbols(prefix): for n in dir(_ssl): pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.0.1/000077500000000000000000000000001517431316200262025ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.0.1/Python-3.0.1/000077500000000000000000000000001517431316200301205ustar00rootroot00000000000000000_patch-setup.py.diff000066400000000000000000000035001517431316200341340ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.0.1/Python-3.0.1--- setup.py.orig 2011-07-07 19:41:48.610196111 +0900 +++ setup.py 2011-07-07 19:46:44.986310031 +0900 @@ -14,6 +14,7 @@ from distutils.command.build_ext import build_ext from distutils.command.install import install from distutils.command.install_lib import install_lib +from distutils.spawn import find_executable # This global variable is used to hold the list of modules to be disabled. disabled_module_list = [] @@ -308,10 +309,33 @@ return platform return sys.platform + def add_multiarch_paths(self): + # Debian/Ubuntu multiarch support. + # https://wiki.ubuntu.com/MultiarchSpec + if not find_executable('dpkg-architecture'): + return + tmpfile = os.path.join(self.build_temp, 'multiarch') + if not os.path.exists(self.build_temp): + os.makedirs(self.build_temp) + ret = os.system( + 'dpkg-architecture -qDEB_HOST_MULTIARCH > %s 2> /dev/null' % + tmpfile) + try: + if ret >> 8 == 0: + with open(tmpfile) as fp: + multiarch_path_component = fp.readline().strip() + add_dir_to_list(self.compiler.library_dirs, + '/usr/lib/' + multiarch_path_component) + add_dir_to_list(self.compiler.include_dirs, + '/usr/include/' + multiarch_path_component) + finally: + os.unlink(tmpfile) + def detect_modules(self): # Ensure that /usr/local is always used add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib') add_dir_to_list(self.compiler.include_dirs, '/usr/local/include') + self.add_multiarch_paths() # Add paths specified in the environment variables LDFLAGS and # CPPFLAGS for header and library files. 001_patch-svnversion.patch000066400000000000000000000023661517431316200347620ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.0.1/Python-3.0.1--- configure.in +++ configure.in @@ -767,7 +767,7 @@ then SVNVERSION="svnversion \$(srcdir)" else - SVNVERSION="echo exported" + SVNVERSION="echo Unversioned directory" fi case $MACHDEP in --- Makefile.pre.in +++ Makefile.pre.in @@ -501,7 +501,7 @@ $(SIGNAL_OBJS) \ $(MODOBJS) \ $(srcdir)/Modules/getbuildinfo.c - $(CC) -c $(PY_CFLAGS) -DSVNVERSION=\"`LC_ALL=C $(SVNVERSION)`\" -o $@ $(srcdir)/Modules/getbuildinfo.c + $(CC) -c $(PY_CFLAGS) -DSVNVERSION="\"`LC_ALL=C $(SVNVERSION)`\"" -o $@ $(srcdir)/Modules/getbuildinfo.c Modules/getpath.o: $(srcdir)/Modules/getpath.c Makefile $(CC) -c $(PY_CFLAGS) -DPYTHONPATH='"$(PYTHONPATH)"' \ --- Modules/getbuildinfo.c +++ Modules/getbuildinfo.c @@ -48,5 +48,5 @@ static const char svnversion[] = SVNVERSION; if (svnversion[0] != '$') return svnversion; /* it was interpolated, or passed on command line */ - return "exported"; + return "Unversioned directory"; } --- Python/sysmodule.c +++ Python/sysmodule.c @@ -1161,7 +1161,7 @@ svnversion = _Py_svnversion(); - if (strcmp(svnversion, "exported") != 0) + if (strcmp(svnversion, "Unversioned directory") != 0 && strcmp(svnversion, "exported") != 0) svn_revision = svnversion; else if (istag) { len = strlen(_patchlevel_revision); 010_ssl_no_ssl2_no_ssl3.patch000066400000000000000000000061721517431316200353500ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.0.1/Python-3.0.1diff -r -u ../Python-3.1.2.orig/Lib/ssl.py ./Lib/ssl.py --- ../Python-3.1.2.orig/Lib/ssl.py 2010-01-18 09:16:17.000000000 +0000 +++ ./Lib/ssl.py 2015-12-20 07:36:08.545346519 +0000 @@ -60,20 +60,23 @@ from _ssl import SSLError from _ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED -from _ssl import (PROTOCOL_SSLv2, PROTOCOL_SSLv3, PROTOCOL_SSLv23, - PROTOCOL_TLSv1) -from _ssl import RAND_status, RAND_egd, RAND_add -from _ssl import ( - SSL_ERROR_ZERO_RETURN, - SSL_ERROR_WANT_READ, - SSL_ERROR_WANT_WRITE, - SSL_ERROR_WANT_X509_LOOKUP, - SSL_ERROR_SYSCALL, - SSL_ERROR_SSL, - SSL_ERROR_WANT_CONNECT, - SSL_ERROR_EOF, - SSL_ERROR_INVALID_ERROR_CODE, - ) +from _ssl import RAND_status, RAND_add +try: + from _ssl import RAND_egd +except ImportError: + # LibreSSL does not provide RAND_egd + pass + +def _import_symbols(prefix): + for n in dir(_ssl): + if n.startswith(prefix): + globals()[n] = getattr(_ssl, n) + +_import_symbols('OP_') +_import_symbols('SSL_ERROR_') +_import_symbols('PROTOCOL_') + +_PROTOCOL_NAMES = {value: name for name, value in globals().items() if name.startswith('PROTOCOL_')} from socket import getnameinfo as _getnameinfo from socket import error as socket_error @@ -415,7 +418,7 @@ d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)] return base64.decodebytes(d.encode('ASCII', 'strict')) -def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv3, ca_certs=None): +def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None): """Retrieve the certificate from the server at the specified address, and return it as a PEM-encoded string. If 'ca_certs' is specified, validate the server cert against it. diff -r -u ../Python-3.1.2.orig/Modules/_ssl.c ./Modules/_ssl.c --- ../Python-3.1.2.orig/Modules/_ssl.c 2010-03-02 22:49:30.000000000 +0000 +++ ./Modules/_ssl.c 2015-12-20 07:35:02.675100987 +0000 @@ -62,8 +62,12 @@ }; enum py_ssl_version { +#ifndef OPENSSL_NO_SSL2 PY_SSL_VERSION_SSL2, +#endif +#ifndef OPENSSL_NO_SSL3 PY_SSL_VERSION_SSL3, +#endif PY_SSL_VERSION_SSL23, PY_SSL_VERSION_TLS1, }; @@ -299,10 +303,14 @@ PySSL_BEGIN_ALLOW_THREADS if (proto_version == PY_SSL_VERSION_TLS1) self->ctx = SSL_CTX_new(TLSv1_method()); /* Set up context */ +#ifndef OPENSSL_NO_SSL3 else if (proto_version == PY_SSL_VERSION_SSL3) self->ctx = SSL_CTX_new(SSLv3_method()); /* Set up context */ +#endif +#ifndef OPENSSL_NO_SSL2 else if (proto_version == PY_SSL_VERSION_SSL2) self->ctx = SSL_CTX_new(SSLv2_method()); /* Set up context */ +#endif else if (proto_version == PY_SSL_VERSION_SSL23) self->ctx = SSL_CTX_new(SSLv23_method()); /* Set up context */ PySSL_END_ALLOW_THREADS @@ -1698,10 +1706,14 @@ PY_SSL_CERT_REQUIRED); /* protocol versions */ +#ifndef OPENSSL_NO_SSL2 PyModule_AddIntConstant(m, "PROTOCOL_SSLv2", PY_SSL_VERSION_SSL2); +#endif +#ifndef OPENSSL_NO_SSL3 PyModule_AddIntConstant(m, "PROTOCOL_SSLv3", PY_SSL_VERSION_SSL3); +#endif PyModule_AddIntConstant(m, "PROTOCOL_SSLv23", PY_SSL_VERSION_SSL23); PyModule_AddIntConstant(m, "PROTOCOL_TLSv1", pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.1.0/000077500000000000000000000000001517431316200262025ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.1.0/Python-3.1/000077500000000000000000000000001517431316200277625ustar00rootroot00000000000000000_patch-setup.py.diff000066400000000000000000000044351517431316200340060ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.1.0/Python-3.1diff -r -u ../Python-3.1/setup.py ./setup.py --- ../Python-3.1/setup.py 2009-05-24 02:13:14.000000000 +0900 +++ ./setup.py 2015-08-15 13:29:18.300777605 +0900 @@ -14,6 +14,7 @@ from distutils.command.build_ext import build_ext from distutils.command.install import install from distutils.command.install_lib import install_lib +from distutils.spawn import find_executable # This global variable is used to hold the list of modules to be disabled. disabled_module_list = [] @@ -293,10 +294,33 @@ return platform return sys.platform + def add_multiarch_paths(self): + # Debian/Ubuntu multiarch support. + # https://wiki.ubuntu.com/MultiarchSpec + if not find_executable('dpkg-architecture'): + return + tmpfile = os.path.join(self.build_temp, 'multiarch') + if not os.path.exists(self.build_temp): + os.makedirs(self.build_temp) + ret = os.system( + 'dpkg-architecture -qDEB_HOST_MULTIARCH > %s 2> /dev/null' % + tmpfile) + try: + if ret >> 8 == 0: + with open(tmpfile) as fp: + multiarch_path_component = fp.readline().strip() + add_dir_to_list(self.compiler.library_dirs, + '/usr/lib/' + multiarch_path_component) + add_dir_to_list(self.compiler.include_dirs, + '/usr/include/' + multiarch_path_component) + finally: + os.unlink(tmpfile) + def detect_modules(self): # Ensure that /usr/local is always used add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib') add_dir_to_list(self.compiler.include_dirs, '/usr/local/include') + self.add_multiarch_paths() # Add paths specified in the environment variables LDFLAGS and # CPPFLAGS for header and library files. @@ -1203,8 +1203,7 @@ # End multiprocessing # Platform-specific libraries - if platform in ('linux2', 'freebsd4', 'freebsd5', 'freebsd6', - 'freebsd7', 'freebsd8'): + if platform.startswith('linux') or platform.startswith('freebsd'): exts.append( Extension('ossaudiodev', ['ossaudiodev.c']) ) else: missing.append('ossaudiodev') 010_ssl_no_ssl2_no_ssl3.patch000066400000000000000000000061721517431316200352120ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.1.0/Python-3.1diff -r -u ../Python-3.1.2.orig/Lib/ssl.py ./Lib/ssl.py --- ../Python-3.1.2.orig/Lib/ssl.py 2010-01-18 09:16:17.000000000 +0000 +++ ./Lib/ssl.py 2015-12-20 07:36:08.545346519 +0000 @@ -60,20 +60,23 @@ from _ssl import SSLError from _ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED -from _ssl import (PROTOCOL_SSLv2, PROTOCOL_SSLv3, PROTOCOL_SSLv23, - PROTOCOL_TLSv1) -from _ssl import RAND_status, RAND_egd, RAND_add -from _ssl import ( - SSL_ERROR_ZERO_RETURN, - SSL_ERROR_WANT_READ, - SSL_ERROR_WANT_WRITE, - SSL_ERROR_WANT_X509_LOOKUP, - SSL_ERROR_SYSCALL, - SSL_ERROR_SSL, - SSL_ERROR_WANT_CONNECT, - SSL_ERROR_EOF, - SSL_ERROR_INVALID_ERROR_CODE, - ) +from _ssl import RAND_status, RAND_add +try: + from _ssl import RAND_egd +except ImportError: + # LibreSSL does not provide RAND_egd + pass + +def _import_symbols(prefix): + for n in dir(_ssl): + if n.startswith(prefix): + globals()[n] = getattr(_ssl, n) + +_import_symbols('OP_') +_import_symbols('SSL_ERROR_') +_import_symbols('PROTOCOL_') + +_PROTOCOL_NAMES = {value: name for name, value in globals().items() if name.startswith('PROTOCOL_')} from socket import getnameinfo as _getnameinfo from socket import error as socket_error @@ -415,7 +418,7 @@ d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)] return base64.decodebytes(d.encode('ASCII', 'strict')) -def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv3, ca_certs=None): +def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None): """Retrieve the certificate from the server at the specified address, and return it as a PEM-encoded string. If 'ca_certs' is specified, validate the server cert against it. diff -r -u ../Python-3.1.2.orig/Modules/_ssl.c ./Modules/_ssl.c --- ../Python-3.1.2.orig/Modules/_ssl.c 2010-03-02 22:49:30.000000000 +0000 +++ ./Modules/_ssl.c 2015-12-20 07:35:02.675100987 +0000 @@ -62,8 +62,12 @@ }; enum py_ssl_version { +#ifndef OPENSSL_NO_SSL2 PY_SSL_VERSION_SSL2, +#endif +#ifndef OPENSSL_NO_SSL3 PY_SSL_VERSION_SSL3, +#endif PY_SSL_VERSION_SSL23, PY_SSL_VERSION_TLS1, }; @@ -299,10 +303,14 @@ PySSL_BEGIN_ALLOW_THREADS if (proto_version == PY_SSL_VERSION_TLS1) self->ctx = SSL_CTX_new(TLSv1_method()); /* Set up context */ +#ifndef OPENSSL_NO_SSL3 else if (proto_version == PY_SSL_VERSION_SSL3) self->ctx = SSL_CTX_new(SSLv3_method()); /* Set up context */ +#endif +#ifndef OPENSSL_NO_SSL2 else if (proto_version == PY_SSL_VERSION_SSL2) self->ctx = SSL_CTX_new(SSLv2_method()); /* Set up context */ +#endif else if (proto_version == PY_SSL_VERSION_SSL23) self->ctx = SSL_CTX_new(SSLv23_method()); /* Set up context */ PySSL_END_ALLOW_THREADS @@ -1698,10 +1706,14 @@ PY_SSL_CERT_REQUIRED); /* protocol versions */ +#ifndef OPENSSL_NO_SSL2 PyModule_AddIntConstant(m, "PROTOCOL_SSLv2", PY_SSL_VERSION_SSL2); +#endif +#ifndef OPENSSL_NO_SSL3 PyModule_AddIntConstant(m, "PROTOCOL_SSLv3", PY_SSL_VERSION_SSL3); +#endif PyModule_AddIntConstant(m, "PROTOCOL_SSLv23", PY_SSL_VERSION_SSL23); PyModule_AddIntConstant(m, "PROTOCOL_TLSv1", pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.1.1/000077500000000000000000000000001517431316200262035ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.1.1/Python-3.1.1/000077500000000000000000000000001517431316200301225ustar00rootroot00000000000000000_patch-setup.py.diff000066400000000000000000000044351517431316200341460ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.1.1/Python-3.1.1diff -r -u ../Python-3.1/setup.py ./setup.py --- ../Python-3.1/setup.py 2009-05-24 02:13:14.000000000 +0900 +++ ./setup.py 2015-08-15 13:29:18.300777605 +0900 @@ -14,6 +14,7 @@ from distutils.command.build_ext import build_ext from distutils.command.install import install from distutils.command.install_lib import install_lib +from distutils.spawn import find_executable # This global variable is used to hold the list of modules to be disabled. disabled_module_list = [] @@ -293,10 +294,33 @@ return platform return sys.platform + def add_multiarch_paths(self): + # Debian/Ubuntu multiarch support. + # https://wiki.ubuntu.com/MultiarchSpec + if not find_executable('dpkg-architecture'): + return + tmpfile = os.path.join(self.build_temp, 'multiarch') + if not os.path.exists(self.build_temp): + os.makedirs(self.build_temp) + ret = os.system( + 'dpkg-architecture -qDEB_HOST_MULTIARCH > %s 2> /dev/null' % + tmpfile) + try: + if ret >> 8 == 0: + with open(tmpfile) as fp: + multiarch_path_component = fp.readline().strip() + add_dir_to_list(self.compiler.library_dirs, + '/usr/lib/' + multiarch_path_component) + add_dir_to_list(self.compiler.include_dirs, + '/usr/include/' + multiarch_path_component) + finally: + os.unlink(tmpfile) + def detect_modules(self): # Ensure that /usr/local is always used add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib') add_dir_to_list(self.compiler.include_dirs, '/usr/local/include') + self.add_multiarch_paths() # Add paths specified in the environment variables LDFLAGS and # CPPFLAGS for header and library files. @@ -1203,8 +1203,7 @@ # End multiprocessing # Platform-specific libraries - if platform in ('linux2', 'freebsd4', 'freebsd5', 'freebsd6', - 'freebsd7', 'freebsd8'): + if platform.startswith('linux') or platform.startswith('freebsd'): exts.append( Extension('ossaudiodev', ['ossaudiodev.c']) ) else: missing.append('ossaudiodev') 010_ssl_no_ssl2_no_ssl3.patch000066400000000000000000000061721517431316200353520ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.1.1/Python-3.1.1diff -r -u ../Python-3.1.2.orig/Lib/ssl.py ./Lib/ssl.py --- ../Python-3.1.2.orig/Lib/ssl.py 2010-01-18 09:16:17.000000000 +0000 +++ ./Lib/ssl.py 2015-12-20 07:36:08.545346519 +0000 @@ -60,20 +60,23 @@ from _ssl import SSLError from _ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED -from _ssl import (PROTOCOL_SSLv2, PROTOCOL_SSLv3, PROTOCOL_SSLv23, - PROTOCOL_TLSv1) -from _ssl import RAND_status, RAND_egd, RAND_add -from _ssl import ( - SSL_ERROR_ZERO_RETURN, - SSL_ERROR_WANT_READ, - SSL_ERROR_WANT_WRITE, - SSL_ERROR_WANT_X509_LOOKUP, - SSL_ERROR_SYSCALL, - SSL_ERROR_SSL, - SSL_ERROR_WANT_CONNECT, - SSL_ERROR_EOF, - SSL_ERROR_INVALID_ERROR_CODE, - ) +from _ssl import RAND_status, RAND_add +try: + from _ssl import RAND_egd +except ImportError: + # LibreSSL does not provide RAND_egd + pass + +def _import_symbols(prefix): + for n in dir(_ssl): + if n.startswith(prefix): + globals()[n] = getattr(_ssl, n) + +_import_symbols('OP_') +_import_symbols('SSL_ERROR_') +_import_symbols('PROTOCOL_') + +_PROTOCOL_NAMES = {value: name for name, value in globals().items() if name.startswith('PROTOCOL_')} from socket import getnameinfo as _getnameinfo from socket import error as socket_error @@ -415,7 +418,7 @@ d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)] return base64.decodebytes(d.encode('ASCII', 'strict')) -def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv3, ca_certs=None): +def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None): """Retrieve the certificate from the server at the specified address, and return it as a PEM-encoded string. If 'ca_certs' is specified, validate the server cert against it. diff -r -u ../Python-3.1.2.orig/Modules/_ssl.c ./Modules/_ssl.c --- ../Python-3.1.2.orig/Modules/_ssl.c 2010-03-02 22:49:30.000000000 +0000 +++ ./Modules/_ssl.c 2015-12-20 07:35:02.675100987 +0000 @@ -62,8 +62,12 @@ }; enum py_ssl_version { +#ifndef OPENSSL_NO_SSL2 PY_SSL_VERSION_SSL2, +#endif +#ifndef OPENSSL_NO_SSL3 PY_SSL_VERSION_SSL3, +#endif PY_SSL_VERSION_SSL23, PY_SSL_VERSION_TLS1, }; @@ -299,10 +303,14 @@ PySSL_BEGIN_ALLOW_THREADS if (proto_version == PY_SSL_VERSION_TLS1) self->ctx = SSL_CTX_new(TLSv1_method()); /* Set up context */ +#ifndef OPENSSL_NO_SSL3 else if (proto_version == PY_SSL_VERSION_SSL3) self->ctx = SSL_CTX_new(SSLv3_method()); /* Set up context */ +#endif +#ifndef OPENSSL_NO_SSL2 else if (proto_version == PY_SSL_VERSION_SSL2) self->ctx = SSL_CTX_new(SSLv2_method()); /* Set up context */ +#endif else if (proto_version == PY_SSL_VERSION_SSL23) self->ctx = SSL_CTX_new(SSLv23_method()); /* Set up context */ PySSL_END_ALLOW_THREADS @@ -1698,10 +1706,14 @@ PY_SSL_CERT_REQUIRED); /* protocol versions */ +#ifndef OPENSSL_NO_SSL2 PyModule_AddIntConstant(m, "PROTOCOL_SSLv2", PY_SSL_VERSION_SSL2); +#endif +#ifndef OPENSSL_NO_SSL3 PyModule_AddIntConstant(m, "PROTOCOL_SSLv3", PY_SSL_VERSION_SSL3); +#endif PyModule_AddIntConstant(m, "PROTOCOL_SSLv23", PY_SSL_VERSION_SSL23); PyModule_AddIntConstant(m, "PROTOCOL_TLSv1", pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.1.2/000077500000000000000000000000001517431316200262045ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.1.2/Python-3.1.2/000077500000000000000000000000001517431316200301245ustar00rootroot00000000000000000_patch-setup.py.diff000066400000000000000000000044351517431316200341500ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.1.2/Python-3.1.2diff -r -u ../Python-3.1/setup.py ./setup.py --- ../Python-3.1/setup.py 2009-05-24 02:13:14.000000000 +0900 +++ ./setup.py 2015-08-15 13:29:18.300777605 +0900 @@ -14,6 +14,7 @@ from distutils.command.build_ext import build_ext from distutils.command.install import install from distutils.command.install_lib import install_lib +from distutils.spawn import find_executable # This global variable is used to hold the list of modules to be disabled. disabled_module_list = [] @@ -293,10 +294,33 @@ return platform return sys.platform + def add_multiarch_paths(self): + # Debian/Ubuntu multiarch support. + # https://wiki.ubuntu.com/MultiarchSpec + if not find_executable('dpkg-architecture'): + return + tmpfile = os.path.join(self.build_temp, 'multiarch') + if not os.path.exists(self.build_temp): + os.makedirs(self.build_temp) + ret = os.system( + 'dpkg-architecture -qDEB_HOST_MULTIARCH > %s 2> /dev/null' % + tmpfile) + try: + if ret >> 8 == 0: + with open(tmpfile) as fp: + multiarch_path_component = fp.readline().strip() + add_dir_to_list(self.compiler.library_dirs, + '/usr/lib/' + multiarch_path_component) + add_dir_to_list(self.compiler.include_dirs, + '/usr/include/' + multiarch_path_component) + finally: + os.unlink(tmpfile) + def detect_modules(self): # Ensure that /usr/local is always used add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib') add_dir_to_list(self.compiler.include_dirs, '/usr/local/include') + self.add_multiarch_paths() # Add paths specified in the environment variables LDFLAGS and # CPPFLAGS for header and library files. @@ -1207,8 +1207,7 @@ # End multiprocessing # Platform-specific libraries - if platform in ('linux2', 'freebsd4', 'freebsd5', 'freebsd6', - 'freebsd7', 'freebsd8'): + if platform.startswith('linux') or platform.startswith('freebsd'): exts.append( Extension('ossaudiodev', ['ossaudiodev.c']) ) else: missing.append('ossaudiodev') 010_ssl_no_ssl2_no_ssl3.patch000066400000000000000000000061721517431316200353540ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.1.2/Python-3.1.2diff -r -u ../Python-3.1.2.orig/Lib/ssl.py ./Lib/ssl.py --- ../Python-3.1.2.orig/Lib/ssl.py 2010-01-18 09:16:17.000000000 +0000 +++ ./Lib/ssl.py 2015-12-20 07:36:08.545346519 +0000 @@ -60,20 +60,23 @@ from _ssl import SSLError from _ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED -from _ssl import (PROTOCOL_SSLv2, PROTOCOL_SSLv3, PROTOCOL_SSLv23, - PROTOCOL_TLSv1) -from _ssl import RAND_status, RAND_egd, RAND_add -from _ssl import ( - SSL_ERROR_ZERO_RETURN, - SSL_ERROR_WANT_READ, - SSL_ERROR_WANT_WRITE, - SSL_ERROR_WANT_X509_LOOKUP, - SSL_ERROR_SYSCALL, - SSL_ERROR_SSL, - SSL_ERROR_WANT_CONNECT, - SSL_ERROR_EOF, - SSL_ERROR_INVALID_ERROR_CODE, - ) +from _ssl import RAND_status, RAND_add +try: + from _ssl import RAND_egd +except ImportError: + # LibreSSL does not provide RAND_egd + pass + +def _import_symbols(prefix): + for n in dir(_ssl): + if n.startswith(prefix): + globals()[n] = getattr(_ssl, n) + +_import_symbols('OP_') +_import_symbols('SSL_ERROR_') +_import_symbols('PROTOCOL_') + +_PROTOCOL_NAMES = {value: name for name, value in globals().items() if name.startswith('PROTOCOL_')} from socket import getnameinfo as _getnameinfo from socket import error as socket_error @@ -415,7 +418,7 @@ d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)] return base64.decodebytes(d.encode('ASCII', 'strict')) -def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv3, ca_certs=None): +def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None): """Retrieve the certificate from the server at the specified address, and return it as a PEM-encoded string. If 'ca_certs' is specified, validate the server cert against it. diff -r -u ../Python-3.1.2.orig/Modules/_ssl.c ./Modules/_ssl.c --- ../Python-3.1.2.orig/Modules/_ssl.c 2010-03-02 22:49:30.000000000 +0000 +++ ./Modules/_ssl.c 2015-12-20 07:35:02.675100987 +0000 @@ -62,8 +62,12 @@ }; enum py_ssl_version { +#ifndef OPENSSL_NO_SSL2 PY_SSL_VERSION_SSL2, +#endif +#ifndef OPENSSL_NO_SSL3 PY_SSL_VERSION_SSL3, +#endif PY_SSL_VERSION_SSL23, PY_SSL_VERSION_TLS1, }; @@ -299,10 +303,14 @@ PySSL_BEGIN_ALLOW_THREADS if (proto_version == PY_SSL_VERSION_TLS1) self->ctx = SSL_CTX_new(TLSv1_method()); /* Set up context */ +#ifndef OPENSSL_NO_SSL3 else if (proto_version == PY_SSL_VERSION_SSL3) self->ctx = SSL_CTX_new(SSLv3_method()); /* Set up context */ +#endif +#ifndef OPENSSL_NO_SSL2 else if (proto_version == PY_SSL_VERSION_SSL2) self->ctx = SSL_CTX_new(SSLv2_method()); /* Set up context */ +#endif else if (proto_version == PY_SSL_VERSION_SSL23) self->ctx = SSL_CTX_new(SSLv23_method()); /* Set up context */ PySSL_END_ALLOW_THREADS @@ -1698,10 +1706,14 @@ PY_SSL_CERT_REQUIRED); /* protocol versions */ +#ifndef OPENSSL_NO_SSL2 PyModule_AddIntConstant(m, "PROTOCOL_SSLv2", PY_SSL_VERSION_SSL2); +#endif +#ifndef OPENSSL_NO_SSL3 PyModule_AddIntConstant(m, "PROTOCOL_SSLv3", PY_SSL_VERSION_SSL3); +#endif PyModule_AddIntConstant(m, "PROTOCOL_SSLv23", PY_SSL_VERSION_SSL23); PyModule_AddIntConstant(m, "PROTOCOL_TLSv1", pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.1.3/000077500000000000000000000000001517431316200262055ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.1.3/Python-3.1.3/000077500000000000000000000000001517431316200301265ustar00rootroot00000000000000000_patch-setup.py.diff000066400000000000000000000042611517431316200341470ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.1.3/Python-3.1.3 # HG changeset patch # User Barry Warsaw # Date 1302190091 14400 # Node ID bd0f73a9538e05f526feaf05821e68bdcff498fa # Parent 2e4cdaffe493e879fb5367a4aa454491de451137 Backport for Python 2.7 of issue 11715 support for building Python on multiarch Debian/Ubuntu. diff -r -u setup.py setup.py --- setup.py.orig +++ setup.py @@ -345,10 +345,33 @@ class PyBuildExt(build_ext): return platform return sys.platform + def add_multiarch_paths(self): + # Debian/Ubuntu multiarch support. + # https://wiki.ubuntu.com/MultiarchSpec + if not find_executable('dpkg-architecture'): + return + tmpfile = os.path.join(self.build_temp, 'multiarch') + if not os.path.exists(self.build_temp): + os.makedirs(self.build_temp) + ret = os.system( + 'dpkg-architecture -qDEB_HOST_MULTIARCH > %s 2> /dev/null' % + tmpfile) + try: + if ret >> 8 == 0: + with open(tmpfile) as fp: + multiarch_path_component = fp.readline().strip() + add_dir_to_list(self.compiler.library_dirs, + '/usr/lib/' + multiarch_path_component) + add_dir_to_list(self.compiler.include_dirs, + '/usr/include/' + multiarch_path_component) + finally: + os.unlink(tmpfile) + def detect_modules(self): # Ensure that /usr/local is always used add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib') add_dir_to_list(self.compiler.include_dirs, '/usr/local/include') + self.add_multiarch_paths() # Add paths specified in the environment variables LDFLAGS and # CPPFLAGS for header and library files. @@ -1321,8 +1321,7 @@ # End multiprocessing # Platform-specific libraries - if platform in ('linux2', 'freebsd4', 'freebsd5', 'freebsd6', - 'freebsd7', 'freebsd8'): + if platform.startswith('linux') or platform.startswith('freebsd'): exts.append( Extension('ossaudiodev', ['ossaudiodev.c']) ) else: missing.append('ossaudiodev') 002_readline63.patch000066400000000000000000000037751517431316200334210ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.1.3/Python-3.1.3diff -r -u ../Python-3.3.3.orig/Modules/readline.c ./Modules/readline.c --- ../Python-3.3.3.orig/Modules/readline.c 2013-11-17 16:23:01.000000000 +0900 +++ ./Modules/readline.c 2014-03-29 16:22:10.219305878 +0900 @@ -231,8 +231,7 @@ if (!PyArg_ParseTuple(args, buf, &function)) return NULL; if (function == Py_None) { - Py_XDECREF(*hook_var); - *hook_var = NULL; + Py_CLEAR(*hook_var); } else if (PyCallable_Check(function)) { PyObject *tmp = *hook_var; @@ -774,14 +773,22 @@ } static int +#if defined(_RL_FUNCTION_TYPEDEF) on_startup_hook(void) +#else +on_startup_hook() +#endif { return on_hook(startup_hook); } #ifdef HAVE_RL_PRE_INPUT_HOOK static int +#if defined(_RL_FUNCTION_TYPEDEF) on_pre_input_hook(void) +#else +on_pre_input_hook() +#endif { return on_hook(pre_input_hook); } @@ -819,7 +826,7 @@ (r != Py_None && PyLong_AsLong(r) == -1 && PyErr_Occurred())) { goto error; } - Py_XDECREF(r); r=NULL; + Py_CLEAR(r); if (0) { error: @@ -877,7 +884,7 @@ * before calling the normal completer */ static char ** -flex_complete(char *text, int start, int end) +flex_complete(const char *text, int start, int end) { #ifdef HAVE_RL_COMPLETION_APPEND_CHARACTER rl_completion_append_character ='\0'; @@ -936,12 +943,12 @@ rl_bind_key_in_map ('\t', rl_complete, emacs_meta_keymap); rl_bind_key_in_map ('\033', rl_complete, emacs_meta_keymap); /* Set our hook functions */ - rl_startup_hook = (Function *)on_startup_hook; + rl_startup_hook = on_startup_hook; #ifdef HAVE_RL_PRE_INPUT_HOOK - rl_pre_input_hook = (Function *)on_pre_input_hook; + rl_pre_input_hook = on_pre_input_hook; #endif /* Set our completion function */ - rl_attempted_completion_function = (CPPFunction *)flex_complete; + rl_attempted_completion_function = flex_complete; /* Set Python word break characters */ completer_word_break_characters = rl_completer_word_break_characters = 010_ssl_no_ssl2_no_ssl3.patch000066400000000000000000000064361517431316200353610ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.1.3/Python-3.1.3diff -r -u ../Python-3.1.3.orig/Lib/ssl.py ./Lib/ssl.py --- ../Python-3.1.3.orig/Lib/ssl.py 2010-09-14 14:47:08.000000000 +0000 +++ ./Lib/ssl.py 2015-12-20 07:32:44.351880682 +0000 @@ -60,20 +60,23 @@ from _ssl import SSLError from _ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED -from _ssl import (PROTOCOL_SSLv2, PROTOCOL_SSLv3, PROTOCOL_SSLv23, - PROTOCOL_TLSv1) -from _ssl import RAND_status, RAND_egd, RAND_add -from _ssl import ( - SSL_ERROR_ZERO_RETURN, - SSL_ERROR_WANT_READ, - SSL_ERROR_WANT_WRITE, - SSL_ERROR_WANT_X509_LOOKUP, - SSL_ERROR_SYSCALL, - SSL_ERROR_SSL, - SSL_ERROR_WANT_CONNECT, - SSL_ERROR_EOF, - SSL_ERROR_INVALID_ERROR_CODE, - ) +from _ssl import RAND_status, RAND_add +try: + from _ssl import RAND_egd +except ImportError: + # LibreSSL does not provide RAND_egd + pass + +def _import_symbols(prefix): + for n in dir(_ssl): + if n.startswith(prefix): + globals()[n] = getattr(_ssl, n) + +_import_symbols('OP_') +_import_symbols('SSL_ERROR_') +_import_symbols('PROTOCOL_') + +_PROTOCOL_NAMES = {value: name for name, value in globals().items() if name.startswith('PROTOCOL_')} from socket import getnameinfo as _getnameinfo from socket import error as socket_error @@ -408,7 +411,7 @@ d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)] return base64.decodebytes(d.encode('ASCII', 'strict')) -def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv3, ca_certs=None): +def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None): """Retrieve the certificate from the server at the specified address, and return it as a PEM-encoded string. If 'ca_certs' is specified, validate the server cert against it. diff -r -u ../Python-3.1.3.orig/Modules/_ssl.c ./Modules/_ssl.c --- ../Python-3.1.3.orig/Modules/_ssl.c 2010-10-13 22:20:48.000000000 +0000 +++ ./Modules/_ssl.c 2015-12-20 07:31:44.644359788 +0000 @@ -63,8 +63,12 @@ }; enum py_ssl_version { +#ifndef OPENSSL_NO_SSL2 PY_SSL_VERSION_SSL2, +#endif +#ifndef OPENSSL_NO_SSL3 PY_SSL_VERSION_SSL3, +#endif PY_SSL_VERSION_SSL23, PY_SSL_VERSION_TLS1 }; @@ -304,10 +308,14 @@ PySSL_BEGIN_ALLOW_THREADS if (proto_version == PY_SSL_VERSION_TLS1) self->ctx = SSL_CTX_new(TLSv1_method()); /* Set up context */ +#ifndef OPENSSL_NO_SSL3 else if (proto_version == PY_SSL_VERSION_SSL3) self->ctx = SSL_CTX_new(SSLv3_method()); /* Set up context */ +#endif +#ifndef OPENSSL_NO_SSL2 else if (proto_version == PY_SSL_VERSION_SSL2) self->ctx = SSL_CTX_new(SSLv2_method()); /* Set up context */ +#endif else if (proto_version == PY_SSL_VERSION_SSL23) self->ctx = SSL_CTX_new(SSLv23_method()); /* Set up context */ PySSL_END_ALLOW_THREADS @@ -1785,10 +1793,14 @@ PY_SSL_CERT_REQUIRED); /* protocol versions */ +#ifndef OPENSSL_NO_SSL2 PyModule_AddIntConstant(m, "PROTOCOL_SSLv2", PY_SSL_VERSION_SSL2); +#endif +#ifndef OPENSSL_NO_SSL3 PyModule_AddIntConstant(m, "PROTOCOL_SSLv3", PY_SSL_VERSION_SSL3); +#endif PyModule_AddIntConstant(m, "PROTOCOL_SSLv23", PY_SSL_VERSION_SSL23); PyModule_AddIntConstant(m, "PROTOCOL_TLSv1", pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.1.4/000077500000000000000000000000001517431316200262065ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.1.4/Python-3.1.4/000077500000000000000000000000001517431316200301305ustar00rootroot00000000000000000_patch-setup.py.diff000066400000000000000000000010141517431316200341420ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.1.4/Python-3.1.4--- setup.py.orig 2012-04-10 01:25:37.000000000 +0200 +++ setup.py 2021-09-03 10:16:58.575042300 +0200 @@ -1344,8 +1344,7 @@ # End multiprocessing # Platform-specific libraries - if platform in ('linux2', 'freebsd4', 'freebsd5', 'freebsd6', - 'freebsd7', 'freebsd8'): + if platform.startswith('linux') or platform.startswith('freebsd'): exts.append( Extension('ossaudiodev', ['ossaudiodev.c']) ) else: missing.append('ossaudiodev') 002_readline63.patch000066400000000000000000000037751517431316200334230ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.1.4/Python-3.1.4diff -r -u ../Python-3.3.3.orig/Modules/readline.c ./Modules/readline.c --- ../Python-3.3.3.orig/Modules/readline.c 2013-11-17 16:23:01.000000000 +0900 +++ ./Modules/readline.c 2014-03-29 16:22:10.219305878 +0900 @@ -231,8 +231,7 @@ if (!PyArg_ParseTuple(args, buf, &function)) return NULL; if (function == Py_None) { - Py_XDECREF(*hook_var); - *hook_var = NULL; + Py_CLEAR(*hook_var); } else if (PyCallable_Check(function)) { PyObject *tmp = *hook_var; @@ -774,14 +773,22 @@ } static int +#if defined(_RL_FUNCTION_TYPEDEF) on_startup_hook(void) +#else +on_startup_hook() +#endif { return on_hook(startup_hook); } #ifdef HAVE_RL_PRE_INPUT_HOOK static int +#if defined(_RL_FUNCTION_TYPEDEF) on_pre_input_hook(void) +#else +on_pre_input_hook() +#endif { return on_hook(pre_input_hook); } @@ -819,7 +826,7 @@ (r != Py_None && PyLong_AsLong(r) == -1 && PyErr_Occurred())) { goto error; } - Py_XDECREF(r); r=NULL; + Py_CLEAR(r); if (0) { error: @@ -877,7 +884,7 @@ * before calling the normal completer */ static char ** -flex_complete(char *text, int start, int end) +flex_complete(const char *text, int start, int end) { #ifdef HAVE_RL_COMPLETION_APPEND_CHARACTER rl_completion_append_character ='\0'; @@ -936,12 +943,12 @@ rl_bind_key_in_map ('\t', rl_complete, emacs_meta_keymap); rl_bind_key_in_map ('\033', rl_complete, emacs_meta_keymap); /* Set our hook functions */ - rl_startup_hook = (Function *)on_startup_hook; + rl_startup_hook = on_startup_hook; #ifdef HAVE_RL_PRE_INPUT_HOOK - rl_pre_input_hook = (Function *)on_pre_input_hook; + rl_pre_input_hook = on_pre_input_hook; #endif /* Set our completion function */ - rl_attempted_completion_function = (CPPFunction *)flex_complete; + rl_attempted_completion_function = flex_complete; /* Set Python word break characters */ completer_word_break_characters = rl_completer_word_break_characters = 010_ssl_no_ssl3.patch000066400000000000000000000063651517431316200337250ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.1.4/Python-3.1.4diff -r -u ../Python-3.1.5.orig/Lib/ssl.py ./Lib/ssl.py --- ../Python-3.1.5.orig/Lib/ssl.py 2012-04-09 23:25:35.000000000 +0000 +++ ./Lib/ssl.py 2015-12-20 07:28:44.015492213 +0000 @@ -60,30 +60,28 @@ from _ssl import SSLError from _ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED -from _ssl import RAND_status, RAND_egd, RAND_add -from _ssl import ( - SSL_ERROR_ZERO_RETURN, - SSL_ERROR_WANT_READ, - SSL_ERROR_WANT_WRITE, - SSL_ERROR_WANT_X509_LOOKUP, - SSL_ERROR_SYSCALL, - SSL_ERROR_SSL, - SSL_ERROR_WANT_CONNECT, - SSL_ERROR_EOF, - SSL_ERROR_INVALID_ERROR_CODE, - ) -from _ssl import PROTOCOL_SSLv3, PROTOCOL_SSLv23, PROTOCOL_TLSv1 -_PROTOCOL_NAMES = { - PROTOCOL_TLSv1: "TLSv1", - PROTOCOL_SSLv23: "SSLv23", - PROTOCOL_SSLv3: "SSLv3", -} +from _ssl import RAND_status, RAND_add try: - from _ssl import PROTOCOL_SSLv2 + from _ssl import RAND_egd except ImportError: + # LibreSSL does not provide RAND_egd pass -else: - _PROTOCOL_NAMES[PROTOCOL_SSLv2] = "SSLv2" + +def _import_symbols(prefix): + for n in dir(_ssl): + if n.startswith(prefix): + globals()[n] = getattr(_ssl, n) + +_import_symbols('OP_') +_import_symbols('SSL_ERROR_') +_import_symbols('PROTOCOL_') + +_PROTOCOL_NAMES = {value: name for name, value in globals().items() if name.startswith('PROTOCOL_')} + +try: + _SSLv2_IF_EXISTS = PROTOCOL_SSLv2 +except NameError: + _SSLv2_IF_EXISTS = None from socket import getnameinfo as _getnameinfo from socket import error as socket_error @@ -418,7 +416,7 @@ d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)] return base64.decodebytes(d.encode('ASCII', 'strict')) -def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv3, ca_certs=None): +def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None): """Retrieve the certificate from the server at the specified address, and return it as a PEM-encoded string. If 'ca_certs' is specified, validate the server cert against it. diff -r -u ../Python-3.1.5.orig/Modules/_ssl.c ./Modules/_ssl.c --- ../Python-3.1.5.orig/Modules/_ssl.c 2012-04-09 23:25:36.000000000 +0000 +++ ./Modules/_ssl.c 2015-12-20 07:27:06.620775506 +0000 @@ -66,7 +66,9 @@ #ifndef OPENSSL_NO_SSL2 PY_SSL_VERSION_SSL2, #endif +#ifndef OPENSSL_NO_SSL3 PY_SSL_VERSION_SSL3=1, +#endif PY_SSL_VERSION_SSL23, PY_SSL_VERSION_TLS1 }; @@ -306,8 +308,10 @@ PySSL_BEGIN_ALLOW_THREADS if (proto_version == PY_SSL_VERSION_TLS1) self->ctx = SSL_CTX_new(TLSv1_method()); /* Set up context */ +#ifndef OPENSSL_NO_SSL3 else if (proto_version == PY_SSL_VERSION_SSL3) self->ctx = SSL_CTX_new(SSLv3_method()); /* Set up context */ +#endif #ifndef OPENSSL_NO_SSL2 else if (proto_version == PY_SSL_VERSION_SSL2) self->ctx = SSL_CTX_new(SSLv2_method()); /* Set up context */ @@ -1796,8 +1800,10 @@ PyModule_AddIntConstant(m, "PROTOCOL_SSLv2", PY_SSL_VERSION_SSL2); #endif +#ifndef OPENSSL_NO_SSL3 PyModule_AddIntConstant(m, "PROTOCOL_SSLv3", PY_SSL_VERSION_SSL3); +#endif PyModule_AddIntConstant(m, "PROTOCOL_SSLv23", PY_SSL_VERSION_SSL23); PyModule_AddIntConstant(m, "PROTOCOL_TLSv1", pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.1.5/000077500000000000000000000000001517431316200262075ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.1.5/Python-3.1.5/000077500000000000000000000000001517431316200301325ustar00rootroot00000000000000000_patch-setup.py.diff000066400000000000000000000010141517431316200341440ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.1.5/Python-3.1.5--- setup.py.orig 2012-04-10 01:25:37.000000000 +0200 +++ setup.py 2021-09-03 10:16:58.575042300 +0200 @@ -1344,8 +1344,7 @@ # End multiprocessing # Platform-specific libraries - if platform in ('linux2', 'freebsd4', 'freebsd5', 'freebsd6', - 'freebsd7', 'freebsd8'): + if platform.startswith('linux') or platform.startswith('freebsd'): exts.append( Extension('ossaudiodev', ['ossaudiodev.c']) ) else: missing.append('ossaudiodev') 002_readline63.patch000066400000000000000000000037751517431316200334250ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.1.5/Python-3.1.5diff -r -u ../Python-3.3.3.orig/Modules/readline.c ./Modules/readline.c --- ../Python-3.3.3.orig/Modules/readline.c 2013-11-17 16:23:01.000000000 +0900 +++ ./Modules/readline.c 2014-03-29 16:22:10.219305878 +0900 @@ -231,8 +231,7 @@ if (!PyArg_ParseTuple(args, buf, &function)) return NULL; if (function == Py_None) { - Py_XDECREF(*hook_var); - *hook_var = NULL; + Py_CLEAR(*hook_var); } else if (PyCallable_Check(function)) { PyObject *tmp = *hook_var; @@ -774,14 +773,22 @@ } static int +#if defined(_RL_FUNCTION_TYPEDEF) on_startup_hook(void) +#else +on_startup_hook() +#endif { return on_hook(startup_hook); } #ifdef HAVE_RL_PRE_INPUT_HOOK static int +#if defined(_RL_FUNCTION_TYPEDEF) on_pre_input_hook(void) +#else +on_pre_input_hook() +#endif { return on_hook(pre_input_hook); } @@ -819,7 +826,7 @@ (r != Py_None && PyLong_AsLong(r) == -1 && PyErr_Occurred())) { goto error; } - Py_XDECREF(r); r=NULL; + Py_CLEAR(r); if (0) { error: @@ -877,7 +884,7 @@ * before calling the normal completer */ static char ** -flex_complete(char *text, int start, int end) +flex_complete(const char *text, int start, int end) { #ifdef HAVE_RL_COMPLETION_APPEND_CHARACTER rl_completion_append_character ='\0'; @@ -936,12 +943,12 @@ rl_bind_key_in_map ('\t', rl_complete, emacs_meta_keymap); rl_bind_key_in_map ('\033', rl_complete, emacs_meta_keymap); /* Set our hook functions */ - rl_startup_hook = (Function *)on_startup_hook; + rl_startup_hook = on_startup_hook; #ifdef HAVE_RL_PRE_INPUT_HOOK - rl_pre_input_hook = (Function *)on_pre_input_hook; + rl_pre_input_hook = on_pre_input_hook; #endif /* Set our completion function */ - rl_attempted_completion_function = (CPPFunction *)flex_complete; + rl_attempted_completion_function = flex_complete; /* Set Python word break characters */ completer_word_break_characters = rl_completer_word_break_characters = 010_ssl_no_ssl3.patch000066400000000000000000000063651517431316200337270ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.1.5/Python-3.1.5diff -r -u ../Python-3.1.5.orig/Lib/ssl.py ./Lib/ssl.py --- ../Python-3.1.5.orig/Lib/ssl.py 2012-04-09 23:25:35.000000000 +0000 +++ ./Lib/ssl.py 2015-12-20 07:28:44.015492213 +0000 @@ -60,30 +60,28 @@ from _ssl import SSLError from _ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED -from _ssl import RAND_status, RAND_egd, RAND_add -from _ssl import ( - SSL_ERROR_ZERO_RETURN, - SSL_ERROR_WANT_READ, - SSL_ERROR_WANT_WRITE, - SSL_ERROR_WANT_X509_LOOKUP, - SSL_ERROR_SYSCALL, - SSL_ERROR_SSL, - SSL_ERROR_WANT_CONNECT, - SSL_ERROR_EOF, - SSL_ERROR_INVALID_ERROR_CODE, - ) -from _ssl import PROTOCOL_SSLv3, PROTOCOL_SSLv23, PROTOCOL_TLSv1 -_PROTOCOL_NAMES = { - PROTOCOL_TLSv1: "TLSv1", - PROTOCOL_SSLv23: "SSLv23", - PROTOCOL_SSLv3: "SSLv3", -} +from _ssl import RAND_status, RAND_add try: - from _ssl import PROTOCOL_SSLv2 + from _ssl import RAND_egd except ImportError: + # LibreSSL does not provide RAND_egd pass -else: - _PROTOCOL_NAMES[PROTOCOL_SSLv2] = "SSLv2" + +def _import_symbols(prefix): + for n in dir(_ssl): + if n.startswith(prefix): + globals()[n] = getattr(_ssl, n) + +_import_symbols('OP_') +_import_symbols('SSL_ERROR_') +_import_symbols('PROTOCOL_') + +_PROTOCOL_NAMES = {value: name for name, value in globals().items() if name.startswith('PROTOCOL_')} + +try: + _SSLv2_IF_EXISTS = PROTOCOL_SSLv2 +except NameError: + _SSLv2_IF_EXISTS = None from socket import getnameinfo as _getnameinfo from socket import error as socket_error @@ -418,7 +416,7 @@ d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)] return base64.decodebytes(d.encode('ASCII', 'strict')) -def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv3, ca_certs=None): +def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None): """Retrieve the certificate from the server at the specified address, and return it as a PEM-encoded string. If 'ca_certs' is specified, validate the server cert against it. diff -r -u ../Python-3.1.5.orig/Modules/_ssl.c ./Modules/_ssl.c --- ../Python-3.1.5.orig/Modules/_ssl.c 2012-04-09 23:25:36.000000000 +0000 +++ ./Modules/_ssl.c 2015-12-20 07:27:06.620775506 +0000 @@ -66,7 +66,9 @@ #ifndef OPENSSL_NO_SSL2 PY_SSL_VERSION_SSL2, #endif +#ifndef OPENSSL_NO_SSL3 PY_SSL_VERSION_SSL3=1, +#endif PY_SSL_VERSION_SSL23, PY_SSL_VERSION_TLS1 }; @@ -306,8 +308,10 @@ PySSL_BEGIN_ALLOW_THREADS if (proto_version == PY_SSL_VERSION_TLS1) self->ctx = SSL_CTX_new(TLSv1_method()); /* Set up context */ +#ifndef OPENSSL_NO_SSL3 else if (proto_version == PY_SSL_VERSION_SSL3) self->ctx = SSL_CTX_new(SSLv3_method()); /* Set up context */ +#endif #ifndef OPENSSL_NO_SSL2 else if (proto_version == PY_SSL_VERSION_SSL2) self->ctx = SSL_CTX_new(SSLv2_method()); /* Set up context */ @@ -1796,8 +1800,10 @@ PyModule_AddIntConstant(m, "PROTOCOL_SSLv2", PY_SSL_VERSION_SSL2); #endif +#ifndef OPENSSL_NO_SSL3 PyModule_AddIntConstant(m, "PROTOCOL_SSLv3", PY_SSL_VERSION_SSL3); +#endif PyModule_AddIntConstant(m, "PROTOCOL_SSLv23", PY_SSL_VERSION_SSL23); PyModule_AddIntConstant(m, "PROTOCOL_TLSv1", pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.10.0/000077500000000000000000000000001517431316200262625ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.10.0/Python-3.10.0/000077500000000000000000000000001517431316200302605ustar00rootroot000000000000000001-bpo-45350-Rerun-autoreconf-with-the-pkg-config-macro.patch000066400000000000000000000436261517431316200431550ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.10.0/Python-3.10.0From f146ca36f81075f222aa3a1595042597d96dfad3 Mon Sep 17 00:00:00 2001 From: Pablo Galindo Salgado Date: Mon, 4 Oct 2021 00:39:54 +0100 Subject: [PATCH] bpo-45350: Rerun autoreconf with the pkg-config macros (GH-28707) diff --git a/aclocal.m4 b/aclocal.m4 index 987bfdf215..2f1bd37528 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -275,3 +275,347 @@ AC_DEFUN([AX_CHECK_OPENSSL], [ AC_SUBST([OPENSSL_LDFLAGS]) ]) +# pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- +# serial 11 (pkg-config-0.29.1) + +dnl Copyright © 2004 Scott James Remnant . +dnl Copyright © 2012-2015 Dan Nicholson +dnl +dnl This program is free software; you can redistribute it and/or modify +dnl it under the terms of the GNU General Public License as published by +dnl the Free Software Foundation; either version 2 of the License, or +dnl (at your option) any later version. +dnl +dnl This program is distributed in the hope that it will be useful, but +dnl WITHOUT ANY WARRANTY; without even the implied warranty of +dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +dnl General Public License for more details. +dnl +dnl You should have received a copy of the GNU General Public License +dnl along with this program; if not, write to the Free Software +dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +dnl 02111-1307, USA. +dnl +dnl As a special exception to the GNU General Public License, if you +dnl distribute this file as part of a program that contains a +dnl configuration script generated by Autoconf, you may include it under +dnl the same distribution terms that you use for the rest of that +dnl program. + +dnl PKG_PREREQ(MIN-VERSION) +dnl ----------------------- +dnl Since: 0.29 +dnl +dnl Verify that the version of the pkg-config macros are at least +dnl MIN-VERSION. Unlike PKG_PROG_PKG_CONFIG, which checks the user's +dnl installed version of pkg-config, this checks the developer's version +dnl of pkg.m4 when generating configure. +dnl +dnl To ensure that this macro is defined, also add: +dnl m4_ifndef([PKG_PREREQ], +dnl [m4_fatal([must install pkg-config 0.29 or later before running autoconf/autogen])]) +dnl +dnl See the "Since" comment for each macro you use to see what version +dnl of the macros you require. +m4_defun([PKG_PREREQ], +[m4_define([PKG_MACROS_VERSION], [0.29.1]) +m4_if(m4_version_compare(PKG_MACROS_VERSION, [$1]), -1, + [m4_fatal([pkg.m4 version $1 or higher is required but ]PKG_MACROS_VERSION[ found])]) +])dnl PKG_PREREQ + +dnl PKG_PROG_PKG_CONFIG([MIN-VERSION]) +dnl ---------------------------------- +dnl Since: 0.16 +dnl +dnl Search for the pkg-config tool and set the PKG_CONFIG variable to +dnl first found in the path. Checks that the version of pkg-config found +dnl is at least MIN-VERSION. If MIN-VERSION is not specified, 0.9.0 is +dnl used since that's the first version where most current features of +dnl pkg-config existed. +AC_DEFUN([PKG_PROG_PKG_CONFIG], +[m4_pattern_forbid([^_?PKG_[A-Z_]+$]) +m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$]) +m4_pattern_allow([^PKG_CONFIG_(DISABLE_UNINSTALLED|TOP_BUILD_DIR|DEBUG_SPEW)$]) +AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility]) +AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path]) +AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path]) + +if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then + AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) +fi +if test -n "$PKG_CONFIG"; then + _pkg_min_version=m4_default([$1], [0.9.0]) + AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) + if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + PKG_CONFIG="" + fi +fi[]dnl +])dnl PKG_PROG_PKG_CONFIG + +dnl PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) +dnl ------------------------------------------------------------------- +dnl Since: 0.18 +dnl +dnl Check to see whether a particular set of modules exists. Similar to +dnl PKG_CHECK_MODULES(), but does not set variables or print errors. +dnl +dnl Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG]) +dnl only at the first occurence in configure.ac, so if the first place +dnl it's called might be skipped (such as if it is within an "if", you +dnl have to call PKG_CHECK_EXISTS manually +AC_DEFUN([PKG_CHECK_EXISTS], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +if test -n "$PKG_CONFIG" && \ + AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then + m4_default([$2], [:]) +m4_ifvaln([$3], [else + $3])dnl +fi]) + +dnl _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) +dnl --------------------------------------------- +dnl Internal wrapper calling pkg-config via PKG_CONFIG and setting +dnl pkg_failed based on the result. +m4_define([_PKG_CONFIG], +[if test -n "$$1"; then + pkg_cv_[]$1="$$1" + elif test -n "$PKG_CONFIG"; then + PKG_CHECK_EXISTS([$3], + [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes ], + [pkg_failed=yes]) + else + pkg_failed=untried +fi[]dnl +])dnl _PKG_CONFIG + +dnl _PKG_SHORT_ERRORS_SUPPORTED +dnl --------------------------- +dnl Internal check to see if pkg-config supports short errors. +AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG]) +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi[]dnl +])dnl _PKG_SHORT_ERRORS_SUPPORTED + + +dnl PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], +dnl [ACTION-IF-NOT-FOUND]) +dnl -------------------------------------------------------------- +dnl Since: 0.4.0 +dnl +dnl Note that if there is a possibility the first call to +dnl PKG_CHECK_MODULES might not happen, you should be sure to include an +dnl explicit call to PKG_PROG_PKG_CONFIG in your configure.ac +AC_DEFUN([PKG_CHECK_MODULES], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl +AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl + +pkg_failed=no +AC_MSG_CHECKING([for $1]) + +_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) +_PKG_CONFIG([$1][_LIBS], [libs], [$2]) + +m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS +and $1[]_LIBS to avoid the need to call pkg-config. +See the pkg-config man page for more details.]) + +if test $pkg_failed = yes; then + AC_MSG_RESULT([no]) + _PKG_SHORT_ERRORS_SUPPORTED + if test $_pkg_short_errors_supported = yes; then + $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1` + else + $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD + + m4_default([$4], [AC_MSG_ERROR( +[Package requirements ($2) were not met: + +$$1_PKG_ERRORS + +Consider adjusting the PKG_CONFIG_PATH environment variable if you +installed software in a non-standard prefix. + +_PKG_TEXT])[]dnl + ]) +elif test $pkg_failed = untried; then + AC_MSG_RESULT([no]) + m4_default([$4], [AC_MSG_FAILURE( +[The pkg-config script could not be found or is too old. Make sure it +is in your PATH or set the PKG_CONFIG environment variable to the full +path to pkg-config. + +_PKG_TEXT + +To get pkg-config, see .])[]dnl + ]) +else + $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS + $1[]_LIBS=$pkg_cv_[]$1[]_LIBS + AC_MSG_RESULT([yes]) + $3 +fi[]dnl +])dnl PKG_CHECK_MODULES + + +dnl PKG_CHECK_MODULES_STATIC(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], +dnl [ACTION-IF-NOT-FOUND]) +dnl --------------------------------------------------------------------- +dnl Since: 0.29 +dnl +dnl Checks for existence of MODULES and gathers its build flags with +dnl static libraries enabled. Sets VARIABLE-PREFIX_CFLAGS from --cflags +dnl and VARIABLE-PREFIX_LIBS from --libs. +dnl +dnl Note that if there is a possibility the first call to +dnl PKG_CHECK_MODULES_STATIC might not happen, you should be sure to +dnl include an explicit call to PKG_PROG_PKG_CONFIG in your +dnl configure.ac. +AC_DEFUN([PKG_CHECK_MODULES_STATIC], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +_save_PKG_CONFIG=$PKG_CONFIG +PKG_CONFIG="$PKG_CONFIG --static" +PKG_CHECK_MODULES($@) +PKG_CONFIG=$_save_PKG_CONFIG[]dnl +])dnl PKG_CHECK_MODULES_STATIC + + +dnl PKG_INSTALLDIR([DIRECTORY]) +dnl ------------------------- +dnl Since: 0.27 +dnl +dnl Substitutes the variable pkgconfigdir as the location where a module +dnl should install pkg-config .pc files. By default the directory is +dnl $libdir/pkgconfig, but the default can be changed by passing +dnl DIRECTORY. The user can override through the --with-pkgconfigdir +dnl parameter. +AC_DEFUN([PKG_INSTALLDIR], +[m4_pushdef([pkg_default], [m4_default([$1], ['${libdir}/pkgconfig'])]) +m4_pushdef([pkg_description], + [pkg-config installation directory @<:@]pkg_default[@:>@]) +AC_ARG_WITH([pkgconfigdir], + [AS_HELP_STRING([--with-pkgconfigdir], pkg_description)],, + [with_pkgconfigdir=]pkg_default) +AC_SUBST([pkgconfigdir], [$with_pkgconfigdir]) +m4_popdef([pkg_default]) +m4_popdef([pkg_description]) +])dnl PKG_INSTALLDIR + + +dnl PKG_NOARCH_INSTALLDIR([DIRECTORY]) +dnl -------------------------------- +dnl Since: 0.27 +dnl +dnl Substitutes the variable noarch_pkgconfigdir as the location where a +dnl module should install arch-independent pkg-config .pc files. By +dnl default the directory is $datadir/pkgconfig, but the default can be +dnl changed by passing DIRECTORY. The user can override through the +dnl --with-noarch-pkgconfigdir parameter. +AC_DEFUN([PKG_NOARCH_INSTALLDIR], +[m4_pushdef([pkg_default], [m4_default([$1], ['${datadir}/pkgconfig'])]) +m4_pushdef([pkg_description], + [pkg-config arch-independent installation directory @<:@]pkg_default[@:>@]) +AC_ARG_WITH([noarch-pkgconfigdir], + [AS_HELP_STRING([--with-noarch-pkgconfigdir], pkg_description)],, + [with_noarch_pkgconfigdir=]pkg_default) +AC_SUBST([noarch_pkgconfigdir], [$with_noarch_pkgconfigdir]) +m4_popdef([pkg_default]) +m4_popdef([pkg_description]) +])dnl PKG_NOARCH_INSTALLDIR + + +dnl PKG_CHECK_VAR(VARIABLE, MODULE, CONFIG-VARIABLE, +dnl [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) +dnl ------------------------------------------- +dnl Since: 0.28 +dnl +dnl Retrieves the value of the pkg-config variable for the given module. +AC_DEFUN([PKG_CHECK_VAR], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +AC_ARG_VAR([$1], [value of $3 for $2, overriding pkg-config])dnl + +_PKG_CONFIG([$1], [variable="][$3]["], [$2]) +AS_VAR_COPY([$1], [pkg_cv_][$1]) + +AS_VAR_IF([$1], [""], [$5], [$4])dnl +])dnl PKG_CHECK_VAR + +dnl PKG_WITH_MODULES(VARIABLE-PREFIX, MODULES, +dnl [ACTION-IF-FOUND],[ACTION-IF-NOT-FOUND], +dnl [DESCRIPTION], [DEFAULT]) +dnl ------------------------------------------ +dnl +dnl Prepare a "--with-" configure option using the lowercase +dnl [VARIABLE-PREFIX] name, merging the behaviour of AC_ARG_WITH and +dnl PKG_CHECK_MODULES in a single macro. +AC_DEFUN([PKG_WITH_MODULES], +[ +m4_pushdef([with_arg], m4_tolower([$1])) + +m4_pushdef([description], + [m4_default([$5], [build with ]with_arg[ support])]) + +m4_pushdef([def_arg], [m4_default([$6], [auto])]) +m4_pushdef([def_action_if_found], [AS_TR_SH([with_]with_arg)=yes]) +m4_pushdef([def_action_if_not_found], [AS_TR_SH([with_]with_arg)=no]) + +m4_case(def_arg, + [yes],[m4_pushdef([with_without], [--without-]with_arg)], + [m4_pushdef([with_without],[--with-]with_arg)]) + +AC_ARG_WITH(with_arg, + AS_HELP_STRING(with_without, description[ @<:@default=]def_arg[@:>@]),, + [AS_TR_SH([with_]with_arg)=def_arg]) + +AS_CASE([$AS_TR_SH([with_]with_arg)], + [yes],[PKG_CHECK_MODULES([$1],[$2],$3,$4)], + [auto],[PKG_CHECK_MODULES([$1],[$2], + [m4_n([def_action_if_found]) $3], + [m4_n([def_action_if_not_found]) $4])]) + +m4_popdef([with_arg]) +m4_popdef([description]) +m4_popdef([def_arg]) + +])dnl PKG_WITH_MODULES + +dnl PKG_HAVE_WITH_MODULES(VARIABLE-PREFIX, MODULES, +dnl [DESCRIPTION], [DEFAULT]) +dnl ----------------------------------------------- +dnl +dnl Convenience macro to trigger AM_CONDITIONAL after PKG_WITH_MODULES +dnl check._[VARIABLE-PREFIX] is exported as make variable. +AC_DEFUN([PKG_HAVE_WITH_MODULES], +[ +PKG_WITH_MODULES([$1],[$2],,,[$3],[$4]) + +AM_CONDITIONAL([HAVE_][$1], + [test "$AS_TR_SH([with_]m4_tolower([$1]))" = "yes"]) +])dnl PKG_HAVE_WITH_MODULES + +dnl PKG_HAVE_DEFINE_WITH_MODULES(VARIABLE-PREFIX, MODULES, +dnl [DESCRIPTION], [DEFAULT]) +dnl ------------------------------------------------------ +dnl +dnl Convenience macro to run AM_CONDITIONAL and AC_DEFINE after +dnl PKG_WITH_MODULES check. HAVE_[VARIABLE-PREFIX] is exported as make +dnl and preprocessor variable. +AC_DEFUN([PKG_HAVE_DEFINE_WITH_MODULES], +[ +PKG_HAVE_WITH_MODULES([$1],[$2],[$3],[$4]) + +AS_IF([test "$AS_TR_SH([with_]m4_tolower([$1]))" = "yes"], + [AC_DEFINE([HAVE_][$1], 1, [Enable ]m4_tolower([$1])[ support])]) +])dnl PKG_HAVE_DEFINE_WITH_MODULES + diff --git a/configure b/configure index 753f956469..02d882ed39 100755 --- a/configure +++ b/configure @@ -630,7 +630,6 @@ OPENSSL_RPATH OPENSSL_LDFLAGS OPENSSL_LIBS OPENSSL_INCLUDES -PKG_CONFIG ENSUREPIP SRCDIRS THREADHEADERS @@ -662,6 +661,9 @@ DTRACE TCLTK_LIBS TCLTK_INCLUDES LIBFFI_INCLUDEDIR +PKG_CONFIG_LIBDIR +PKG_CONFIG_PATH +PKG_CONFIG TZPATH SHLIBS CFLAGSFORSHARED @@ -873,7 +875,10 @@ LDFLAGS LIBS CPPFLAGS CPP -PROFILE_TASK' +PROFILE_TASK +PKG_CONFIG +PKG_CONFIG_PATH +PKG_CONFIG_LIBDIR' # Initialize some variables set by options. @@ -1637,6 +1642,11 @@ Some influential environment variables: CPP C preprocessor PROFILE_TASK Python args for PGO generation task + PKG_CONFIG path to pkg-config utility + PKG_CONFIG_PATH + directories to add to pkg-config's search path + PKG_CONFIG_LIBDIR + path overriding pkg-config's built-in search path Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. @@ -10542,7 +10552,126 @@ $as_echo "no" >&6; } fi -PKG_PROG_PKG_CONFIG + + + + + + + +if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. +set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_PKG_CONFIG+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $PKG_CONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +PKG_CONFIG=$ac_cv_path_PKG_CONFIG +if test -n "$PKG_CONFIG"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 +$as_echo "$PKG_CONFIG" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_path_PKG_CONFIG"; then + ac_pt_PKG_CONFIG=$PKG_CONFIG + # Extract the first word of "pkg-config", so it can be a program name with args. +set dummy pkg-config; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $ac_pt_PKG_CONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG +if test -n "$ac_pt_PKG_CONFIG"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 +$as_echo "$ac_pt_PKG_CONFIG" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_pt_PKG_CONFIG" = x; then + PKG_CONFIG="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + PKG_CONFIG=$ac_pt_PKG_CONFIG + fi +else + PKG_CONFIG="$ac_cv_path_PKG_CONFIG" +fi + +fi +if test -n "$PKG_CONFIG"; then + _pkg_min_version=0.9.0 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 +$as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } + if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + PKG_CONFIG="" + fi +fi # Check for use of the system expat library { $as_echo "$as_me:${as_lineno-$LINENO}: checking for --with-system-expat" >&5 -- 2.29.2.windows.2 0002-bpo-45405-Prevent-internal-configure-error-when-runn.patch000066400000000000000000000054361517431316200433300ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.10.0/Python-3.10.0From c8ee4dc57dd995e96ef9af0a04957b61ae1a7ac9 Mon Sep 17 00:00:00 2001 From: David Bohman Date: Tue, 12 Oct 2021 17:10:26 -0700 Subject: [PATCH] bpo-45405: Prevent ``internal configure error`` when running ``configure`` with recent versions of non-Apple clang. (#28845) Change the configure logic to function properly on macOS when the compiler outputs a platform triplet for option --print-multiarch. Co-authored-by: Ned Deily --- .../next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst | 2 ++ configure | 8 +++++--- configure.ac | 8 +++++--- 3 files changed, 12 insertions(+), 6 deletions(-) create mode 100644 Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst diff --git a/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst b/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst new file mode 100644 index 0000000000..a2dc5bcc32 --- /dev/null +++ b/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst @@ -0,0 +1,2 @@ +Prevent ``internal configure error`` when running ``configure`` +with recent versions of non-Apple clang. Patch by David Bohman. diff --git a/configure b/configure index cc37185068..f238470c17 100755 --- a/configure +++ b/configure @@ -5226,9 +5226,6 @@ $as_echo "$as_me: fi -MULTIARCH=$($CC --print-multiarch 2>/dev/null) - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the platform triplet based on compiler characteristics" >&5 $as_echo_n "checking for the platform triplet based on compiler characteristics... " >&6; } cat >> conftest.c <&6; } fi rm -f conftest.c conftest.out +if test x$PLATFORM_TRIPLET != xdarwin; then + MULTIARCH=$($CC --print-multiarch 2>/dev/null) +fi + + if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then if test x$PLATFORM_TRIPLET != x$MULTIARCH; then as_fn_error $? "internal configure error for the platform triplet, please file a bug report" "$LINENO" 5 diff --git a/configure.ac b/configure.ac index 3e6c07c279..dd68777b6a 100644 --- a/configure.ac +++ b/configure.ac @@ -717,9 +717,6 @@ then fi -MULTIARCH=$($CC --print-multiarch 2>/dev/null) -AC_SUBST(MULTIARCH) - AC_MSG_CHECKING([for the platform triplet based on compiler characteristics]) cat >> conftest.c </dev/null) +fi +AC_SUBST(MULTIARCH) + if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then if test x$PLATFORM_TRIPLET != x$MULTIARCH; then AC_MSG_ERROR([internal configure error for the platform triplet, please file a bug report]) -- 2.29.2.windows.2 0003-Recognize-an-argument-to-j-in-MAKEFLAGS.patch000066400000000000000000000015631517431316200405130ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.10.0/Python-3.10.0From 3fec519d6b326918f39ceb142ef762042ce8365f Mon Sep 17 00:00:00 2001 From: Ivan Pozdeev Date: Fri, 26 Dec 2025 13:39:21 +0300 Subject: [PATCH] Recognize an argument to -j in MAKEFLAGS --- setup.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index ad8fb81b218..5666deaf67b 100644 --- a/setup.py +++ b/setup.py @@ -307,8 +307,8 @@ def __init__(self, dist): self.failed_on_import = [] self.missing = [] self.disabled_configure = [] - if '-j' in os.environ.get('MAKEFLAGS', ''): - self.parallel = True + if (m:=re.search(r'(?:^|\s)(?:-j|--jobs)(?:\s+|=)?(\d*)',os.environ.get('MAKEFLAGS', ''))) is not None: + self.parallel = int(m.group(1)) if m.group(1) else True def add(self, ext): self.extensions.append(ext) -- 2.36.1.windows.1 pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.10.1/000077500000000000000000000000001517431316200262635ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.10.1/Python-3.10.1/000077500000000000000000000000001517431316200302625ustar00rootroot000000000000000001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch000066400000000000000000000015631517431316200405130ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.10.1/Python-3.10.1From 3fec519d6b326918f39ceb142ef762042ce8365f Mon Sep 17 00:00:00 2001 From: Ivan Pozdeev Date: Fri, 26 Dec 2025 13:39:21 +0300 Subject: [PATCH] Recognize an argument to -j in MAKEFLAGS --- setup.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index ad8fb81b218..5666deaf67b 100644 --- a/setup.py +++ b/setup.py @@ -307,8 +307,8 @@ def __init__(self, dist): self.failed_on_import = [] self.missing = [] self.disabled_configure = [] - if '-j' in os.environ.get('MAKEFLAGS', ''): - self.parallel = True + if (m:=re.search(r'(?:^|\s)(?:-j|--jobs)(?:\s+|=)?(\d*)',os.environ.get('MAKEFLAGS', ''))) is not None: + self.parallel = int(m.group(1)) if m.group(1) else True def add(self, ext): self.extensions.append(ext) -- 2.36.1.windows.1 pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.10.10/000077500000000000000000000000001517431316200263435ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.10.10/Python-3.10.10/000077500000000000000000000000001517431316200304225ustar00rootroot000000000000000001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch000066400000000000000000000015631517431316200406530ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.10.10/Python-3.10.10From 3fec519d6b326918f39ceb142ef762042ce8365f Mon Sep 17 00:00:00 2001 From: Ivan Pozdeev Date: Fri, 26 Dec 2025 13:39:21 +0300 Subject: [PATCH] Recognize an argument to -j in MAKEFLAGS --- setup.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index ad8fb81b218..5666deaf67b 100644 --- a/setup.py +++ b/setup.py @@ -307,8 +307,8 @@ def __init__(self, dist): self.failed_on_import = [] self.missing = [] self.disabled_configure = [] - if '-j' in os.environ.get('MAKEFLAGS', ''): - self.parallel = True + if (m:=re.search(r'(?:^|\s)(?:-j|--jobs)(?:\s+|=)?(\d*)',os.environ.get('MAKEFLAGS', ''))) is not None: + self.parallel = int(m.group(1)) if m.group(1) else True def add(self, ext): self.extensions.append(ext) -- 2.36.1.windows.1 pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.10.11/000077500000000000000000000000001517431316200263445ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.10.11/Python-3.10.11/000077500000000000000000000000001517431316200304245ustar00rootroot000000000000000001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch000066400000000000000000000015631517431316200406550ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.10.11/Python-3.10.11From 3fec519d6b326918f39ceb142ef762042ce8365f Mon Sep 17 00:00:00 2001 From: Ivan Pozdeev Date: Fri, 26 Dec 2025 13:39:21 +0300 Subject: [PATCH] Recognize an argument to -j in MAKEFLAGS --- setup.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index ad8fb81b218..5666deaf67b 100644 --- a/setup.py +++ b/setup.py @@ -307,8 +307,8 @@ def __init__(self, dist): self.failed_on_import = [] self.missing = [] self.disabled_configure = [] - if '-j' in os.environ.get('MAKEFLAGS', ''): - self.parallel = True + if (m:=re.search(r'(?:^|\s)(?:-j|--jobs)(?:\s+|=)?(\d*)',os.environ.get('MAKEFLAGS', ''))) is not None: + self.parallel = int(m.group(1)) if m.group(1) else True def add(self, ext): self.extensions.append(ext) -- 2.36.1.windows.1 pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.10.12/000077500000000000000000000000001517431316200263455ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.10.12/Python-3.10.12/000077500000000000000000000000001517431316200304265ustar00rootroot000000000000000001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch000066400000000000000000000015631517431316200406570ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.10.12/Python-3.10.12From 3fec519d6b326918f39ceb142ef762042ce8365f Mon Sep 17 00:00:00 2001 From: Ivan Pozdeev Date: Fri, 26 Dec 2025 13:39:21 +0300 Subject: [PATCH] Recognize an argument to -j in MAKEFLAGS --- setup.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index ad8fb81b218..5666deaf67b 100644 --- a/setup.py +++ b/setup.py @@ -307,8 +307,8 @@ def __init__(self, dist): self.failed_on_import = [] self.missing = [] self.disabled_configure = [] - if '-j' in os.environ.get('MAKEFLAGS', ''): - self.parallel = True + if (m:=re.search(r'(?:^|\s)(?:-j|--jobs)(?:\s+|=)?(\d*)',os.environ.get('MAKEFLAGS', ''))) is not None: + self.parallel = int(m.group(1)) if m.group(1) else True def add(self, ext): self.extensions.append(ext) -- 2.36.1.windows.1 pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.10.13/000077500000000000000000000000001517431316200263465ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.10.13/Python-3.10.13/000077500000000000000000000000001517431316200304305ustar00rootroot000000000000000001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch000066400000000000000000000015631517431316200406610ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.10.13/Python-3.10.13From 3fec519d6b326918f39ceb142ef762042ce8365f Mon Sep 17 00:00:00 2001 From: Ivan Pozdeev Date: Fri, 26 Dec 2025 13:39:21 +0300 Subject: [PATCH] Recognize an argument to -j in MAKEFLAGS --- setup.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index ad8fb81b218..5666deaf67b 100644 --- a/setup.py +++ b/setup.py @@ -307,8 +307,8 @@ def __init__(self, dist): self.failed_on_import = [] self.missing = [] self.disabled_configure = [] - if '-j' in os.environ.get('MAKEFLAGS', ''): - self.parallel = True + if (m:=re.search(r'(?:^|\s)(?:-j|--jobs)(?:\s+|=)?(\d*)',os.environ.get('MAKEFLAGS', ''))) is not None: + self.parallel = int(m.group(1)) if m.group(1) else True def add(self, ext): self.extensions.append(ext) -- 2.36.1.windows.1 pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.10.14/000077500000000000000000000000001517431316200263475ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.10.14/Python-3.10.14/000077500000000000000000000000001517431316200304325ustar00rootroot000000000000000001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch000066400000000000000000000015631517431316200406630ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.10.14/Python-3.10.14From 3fec519d6b326918f39ceb142ef762042ce8365f Mon Sep 17 00:00:00 2001 From: Ivan Pozdeev Date: Fri, 26 Dec 2025 13:39:21 +0300 Subject: [PATCH] Recognize an argument to -j in MAKEFLAGS --- setup.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index ad8fb81b218..5666deaf67b 100644 --- a/setup.py +++ b/setup.py @@ -307,8 +307,8 @@ def __init__(self, dist): self.failed_on_import = [] self.missing = [] self.disabled_configure = [] - if '-j' in os.environ.get('MAKEFLAGS', ''): - self.parallel = True + if (m:=re.search(r'(?:^|\s)(?:-j|--jobs)(?:\s+|=)?(\d*)',os.environ.get('MAKEFLAGS', ''))) is not None: + self.parallel = int(m.group(1)) if m.group(1) else True def add(self, ext): self.extensions.append(ext) -- 2.36.1.windows.1 pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.10.15/000077500000000000000000000000001517431316200263505ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.10.15/Python-3.10.15/000077500000000000000000000000001517431316200304345ustar00rootroot000000000000000001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch000066400000000000000000000015631517431316200406650ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.10.15/Python-3.10.15From 3fec519d6b326918f39ceb142ef762042ce8365f Mon Sep 17 00:00:00 2001 From: Ivan Pozdeev Date: Fri, 26 Dec 2025 13:39:21 +0300 Subject: [PATCH] Recognize an argument to -j in MAKEFLAGS --- setup.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index ad8fb81b218..5666deaf67b 100644 --- a/setup.py +++ b/setup.py @@ -307,8 +307,8 @@ def __init__(self, dist): self.failed_on_import = [] self.missing = [] self.disabled_configure = [] - if '-j' in os.environ.get('MAKEFLAGS', ''): - self.parallel = True + if (m:=re.search(r'(?:^|\s)(?:-j|--jobs)(?:\s+|=)?(\d*)',os.environ.get('MAKEFLAGS', ''))) is not None: + self.parallel = int(m.group(1)) if m.group(1) else True def add(self, ext): self.extensions.append(ext) -- 2.36.1.windows.1 pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.10.16/000077500000000000000000000000001517431316200263515ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.10.16/Python-3.10.16/000077500000000000000000000000001517431316200304365ustar00rootroot000000000000000001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch000066400000000000000000000015631517431316200406670ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.10.16/Python-3.10.16From 3fec519d6b326918f39ceb142ef762042ce8365f Mon Sep 17 00:00:00 2001 From: Ivan Pozdeev Date: Fri, 26 Dec 2025 13:39:21 +0300 Subject: [PATCH] Recognize an argument to -j in MAKEFLAGS --- setup.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index ad8fb81b218..5666deaf67b 100644 --- a/setup.py +++ b/setup.py @@ -307,8 +307,8 @@ def __init__(self, dist): self.failed_on_import = [] self.missing = [] self.disabled_configure = [] - if '-j' in os.environ.get('MAKEFLAGS', ''): - self.parallel = True + if (m:=re.search(r'(?:^|\s)(?:-j|--jobs)(?:\s+|=)?(\d*)',os.environ.get('MAKEFLAGS', ''))) is not None: + self.parallel = int(m.group(1)) if m.group(1) else True def add(self, ext): self.extensions.append(ext) -- 2.36.1.windows.1 pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.10.17/000077500000000000000000000000001517431316200263525ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.10.17/Python-3.10.17/000077500000000000000000000000001517431316200304405ustar00rootroot000000000000000001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch000066400000000000000000000015631517431316200406710ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.10.17/Python-3.10.17From 3fec519d6b326918f39ceb142ef762042ce8365f Mon Sep 17 00:00:00 2001 From: Ivan Pozdeev Date: Fri, 26 Dec 2025 13:39:21 +0300 Subject: [PATCH] Recognize an argument to -j in MAKEFLAGS --- setup.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index ad8fb81b218..5666deaf67b 100644 --- a/setup.py +++ b/setup.py @@ -307,8 +307,8 @@ def __init__(self, dist): self.failed_on_import = [] self.missing = [] self.disabled_configure = [] - if '-j' in os.environ.get('MAKEFLAGS', ''): - self.parallel = True + if (m:=re.search(r'(?:^|\s)(?:-j|--jobs)(?:\s+|=)?(\d*)',os.environ.get('MAKEFLAGS', ''))) is not None: + self.parallel = int(m.group(1)) if m.group(1) else True def add(self, ext): self.extensions.append(ext) -- 2.36.1.windows.1 pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.10.18/000077500000000000000000000000001517431316200263535ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.10.18/Python-3.10.18/000077500000000000000000000000001517431316200304425ustar00rootroot000000000000000001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch000066400000000000000000000015631517431316200406730ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.10.18/Python-3.10.18From 3fec519d6b326918f39ceb142ef762042ce8365f Mon Sep 17 00:00:00 2001 From: Ivan Pozdeev Date: Fri, 26 Dec 2025 13:39:21 +0300 Subject: [PATCH] Recognize an argument to -j in MAKEFLAGS --- setup.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index ad8fb81b218..5666deaf67b 100644 --- a/setup.py +++ b/setup.py @@ -307,8 +307,8 @@ def __init__(self, dist): self.failed_on_import = [] self.missing = [] self.disabled_configure = [] - if '-j' in os.environ.get('MAKEFLAGS', ''): - self.parallel = True + if (m:=re.search(r'(?:^|\s)(?:-j|--jobs)(?:\s+|=)?(\d*)',os.environ.get('MAKEFLAGS', ''))) is not None: + self.parallel = int(m.group(1)) if m.group(1) else True def add(self, ext): self.extensions.append(ext) -- 2.36.1.windows.1 pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.10.19/000077500000000000000000000000001517431316200263545ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.10.19/Python-3.10.19/000077500000000000000000000000001517431316200304445ustar00rootroot000000000000000001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch000066400000000000000000000015631517431316200406750ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.10.19/Python-3.10.19From 3fec519d6b326918f39ceb142ef762042ce8365f Mon Sep 17 00:00:00 2001 From: Ivan Pozdeev Date: Fri, 26 Dec 2025 13:39:21 +0300 Subject: [PATCH] Recognize an argument to -j in MAKEFLAGS --- setup.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index ad8fb81b218..5666deaf67b 100644 --- a/setup.py +++ b/setup.py @@ -307,8 +307,8 @@ def __init__(self, dist): self.failed_on_import = [] self.missing = [] self.disabled_configure = [] - if '-j' in os.environ.get('MAKEFLAGS', ''): - self.parallel = True + if (m:=re.search(r'(?:^|\s)(?:-j|--jobs)(?:\s+|=)?(\d*)',os.environ.get('MAKEFLAGS', ''))) is not None: + self.parallel = int(m.group(1)) if m.group(1) else True def add(self, ext): self.extensions.append(ext) -- 2.36.1.windows.1 pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.10.2/000077500000000000000000000000001517431316200262645ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.10.2/Python-3.10.2/000077500000000000000000000000001517431316200302645ustar00rootroot000000000000000001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch000066400000000000000000000015631517431316200405150ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.10.2/Python-3.10.2From 3fec519d6b326918f39ceb142ef762042ce8365f Mon Sep 17 00:00:00 2001 From: Ivan Pozdeev Date: Fri, 26 Dec 2025 13:39:21 +0300 Subject: [PATCH] Recognize an argument to -j in MAKEFLAGS --- setup.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index ad8fb81b218..5666deaf67b 100644 --- a/setup.py +++ b/setup.py @@ -307,8 +307,8 @@ def __init__(self, dist): self.failed_on_import = [] self.missing = [] self.disabled_configure = [] - if '-j' in os.environ.get('MAKEFLAGS', ''): - self.parallel = True + if (m:=re.search(r'(?:^|\s)(?:-j|--jobs)(?:\s+|=)?(\d*)',os.environ.get('MAKEFLAGS', ''))) is not None: + self.parallel = int(m.group(1)) if m.group(1) else True def add(self, ext): self.extensions.append(ext) -- 2.36.1.windows.1 pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.10.3/000077500000000000000000000000001517431316200262655ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.10.3/Python-3.10.3/000077500000000000000000000000001517431316200302665ustar00rootroot000000000000000001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch000066400000000000000000000015631517431316200405170ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.10.3/Python-3.10.3From 3fec519d6b326918f39ceb142ef762042ce8365f Mon Sep 17 00:00:00 2001 From: Ivan Pozdeev Date: Fri, 26 Dec 2025 13:39:21 +0300 Subject: [PATCH] Recognize an argument to -j in MAKEFLAGS --- setup.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index ad8fb81b218..5666deaf67b 100644 --- a/setup.py +++ b/setup.py @@ -307,8 +307,8 @@ def __init__(self, dist): self.failed_on_import = [] self.missing = [] self.disabled_configure = [] - if '-j' in os.environ.get('MAKEFLAGS', ''): - self.parallel = True + if (m:=re.search(r'(?:^|\s)(?:-j|--jobs)(?:\s+|=)?(\d*)',os.environ.get('MAKEFLAGS', ''))) is not None: + self.parallel = int(m.group(1)) if m.group(1) else True def add(self, ext): self.extensions.append(ext) -- 2.36.1.windows.1 pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.10.4/000077500000000000000000000000001517431316200262665ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.10.4/Python-3.10.4/000077500000000000000000000000001517431316200302705ustar00rootroot000000000000000001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch000066400000000000000000000015631517431316200405210ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.10.4/Python-3.10.4From 3fec519d6b326918f39ceb142ef762042ce8365f Mon Sep 17 00:00:00 2001 From: Ivan Pozdeev Date: Fri, 26 Dec 2025 13:39:21 +0300 Subject: [PATCH] Recognize an argument to -j in MAKEFLAGS --- setup.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index ad8fb81b218..5666deaf67b 100644 --- a/setup.py +++ b/setup.py @@ -307,8 +307,8 @@ def __init__(self, dist): self.failed_on_import = [] self.missing = [] self.disabled_configure = [] - if '-j' in os.environ.get('MAKEFLAGS', ''): - self.parallel = True + if (m:=re.search(r'(?:^|\s)(?:-j|--jobs)(?:\s+|=)?(\d*)',os.environ.get('MAKEFLAGS', ''))) is not None: + self.parallel = int(m.group(1)) if m.group(1) else True def add(self, ext): self.extensions.append(ext) -- 2.36.1.windows.1 pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.10.5/000077500000000000000000000000001517431316200262675ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.10.5/Python-3.10.5/000077500000000000000000000000001517431316200302725ustar00rootroot000000000000000001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch000066400000000000000000000015631517431316200405230ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.10.5/Python-3.10.5From 3fec519d6b326918f39ceb142ef762042ce8365f Mon Sep 17 00:00:00 2001 From: Ivan Pozdeev Date: Fri, 26 Dec 2025 13:39:21 +0300 Subject: [PATCH] Recognize an argument to -j in MAKEFLAGS --- setup.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index ad8fb81b218..5666deaf67b 100644 --- a/setup.py +++ b/setup.py @@ -307,8 +307,8 @@ def __init__(self, dist): self.failed_on_import = [] self.missing = [] self.disabled_configure = [] - if '-j' in os.environ.get('MAKEFLAGS', ''): - self.parallel = True + if (m:=re.search(r'(?:^|\s)(?:-j|--jobs)(?:\s+|=)?(\d*)',os.environ.get('MAKEFLAGS', ''))) is not None: + self.parallel = int(m.group(1)) if m.group(1) else True def add(self, ext): self.extensions.append(ext) -- 2.36.1.windows.1 pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.10.6/000077500000000000000000000000001517431316200262705ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.10.6/Python-3.10.6/000077500000000000000000000000001517431316200302745ustar00rootroot000000000000000001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch000066400000000000000000000015631517431316200405250ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.10.6/Python-3.10.6From 3fec519d6b326918f39ceb142ef762042ce8365f Mon Sep 17 00:00:00 2001 From: Ivan Pozdeev Date: Fri, 26 Dec 2025 13:39:21 +0300 Subject: [PATCH] Recognize an argument to -j in MAKEFLAGS --- setup.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index ad8fb81b218..5666deaf67b 100644 --- a/setup.py +++ b/setup.py @@ -307,8 +307,8 @@ def __init__(self, dist): self.failed_on_import = [] self.missing = [] self.disabled_configure = [] - if '-j' in os.environ.get('MAKEFLAGS', ''): - self.parallel = True + if (m:=re.search(r'(?:^|\s)(?:-j|--jobs)(?:\s+|=)?(\d*)',os.environ.get('MAKEFLAGS', ''))) is not None: + self.parallel = int(m.group(1)) if m.group(1) else True def add(self, ext): self.extensions.append(ext) -- 2.36.1.windows.1 pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.10.7/000077500000000000000000000000001517431316200262715ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.10.7/Python-3.10.7/000077500000000000000000000000001517431316200302765ustar00rootroot000000000000000001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch000066400000000000000000000015631517431316200405270ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.10.7/Python-3.10.7From 3fec519d6b326918f39ceb142ef762042ce8365f Mon Sep 17 00:00:00 2001 From: Ivan Pozdeev Date: Fri, 26 Dec 2025 13:39:21 +0300 Subject: [PATCH] Recognize an argument to -j in MAKEFLAGS --- setup.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index ad8fb81b218..5666deaf67b 100644 --- a/setup.py +++ b/setup.py @@ -307,8 +307,8 @@ def __init__(self, dist): self.failed_on_import = [] self.missing = [] self.disabled_configure = [] - if '-j' in os.environ.get('MAKEFLAGS', ''): - self.parallel = True + if (m:=re.search(r'(?:^|\s)(?:-j|--jobs)(?:\s+|=)?(\d*)',os.environ.get('MAKEFLAGS', ''))) is not None: + self.parallel = int(m.group(1)) if m.group(1) else True def add(self, ext): self.extensions.append(ext) -- 2.36.1.windows.1 pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.10.8/000077500000000000000000000000001517431316200262725ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.10.8/Python-3.10.8/000077500000000000000000000000001517431316200303005ustar00rootroot000000000000000001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch000066400000000000000000000015631517431316200405310ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.10.8/Python-3.10.8From 3fec519d6b326918f39ceb142ef762042ce8365f Mon Sep 17 00:00:00 2001 From: Ivan Pozdeev Date: Fri, 26 Dec 2025 13:39:21 +0300 Subject: [PATCH] Recognize an argument to -j in MAKEFLAGS --- setup.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index ad8fb81b218..5666deaf67b 100644 --- a/setup.py +++ b/setup.py @@ -307,8 +307,8 @@ def __init__(self, dist): self.failed_on_import = [] self.missing = [] self.disabled_configure = [] - if '-j' in os.environ.get('MAKEFLAGS', ''): - self.parallel = True + if (m:=re.search(r'(?:^|\s)(?:-j|--jobs)(?:\s+|=)?(\d*)',os.environ.get('MAKEFLAGS', ''))) is not None: + self.parallel = int(m.group(1)) if m.group(1) else True def add(self, ext): self.extensions.append(ext) -- 2.36.1.windows.1 pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.10.9/000077500000000000000000000000001517431316200262735ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.10.9/Python-3.10.9/000077500000000000000000000000001517431316200303025ustar00rootroot000000000000000001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch000066400000000000000000000015631517431316200405330ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.10.9/Python-3.10.9From 3fec519d6b326918f39ceb142ef762042ce8365f Mon Sep 17 00:00:00 2001 From: Ivan Pozdeev Date: Fri, 26 Dec 2025 13:39:21 +0300 Subject: [PATCH] Recognize an argument to -j in MAKEFLAGS --- setup.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index ad8fb81b218..5666deaf67b 100644 --- a/setup.py +++ b/setup.py @@ -307,8 +307,8 @@ def __init__(self, dist): self.failed_on_import = [] self.missing = [] self.disabled_configure = [] - if '-j' in os.environ.get('MAKEFLAGS', ''): - self.parallel = True + if (m:=re.search(r'(?:^|\s)(?:-j|--jobs)(?:\s+|=)?(\d*)',os.environ.get('MAKEFLAGS', ''))) is not None: + self.parallel = int(m.group(1)) if m.group(1) else True def add(self, ext): self.extensions.append(ext) -- 2.36.1.windows.1 pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.11.0/000077500000000000000000000000001517431316200262635ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.11.0/Python-3.11.0/000077500000000000000000000000001517431316200302625ustar00rootroot000000000000000001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch000066400000000000000000000015631517431316200405130ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.11.0/Python-3.11.0From 3fec519d6b326918f39ceb142ef762042ce8365f Mon Sep 17 00:00:00 2001 From: Ivan Pozdeev Date: Fri, 26 Dec 2025 13:39:21 +0300 Subject: [PATCH] Recognize an argument to -j in MAKEFLAGS --- setup.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index ad8fb81b218..5666deaf67b 100644 --- a/setup.py +++ b/setup.py @@ -307,8 +307,8 @@ def __init__(self, dist): self.failed_on_import = [] self.missing = [] self.disabled_configure = [] - if '-j' in os.environ.get('MAKEFLAGS', ''): - self.parallel = True + if (m:=re.search(r'(?:^|\s)(?:-j|--jobs)(?:\s+|=)?(\d*)',os.environ.get('MAKEFLAGS', ''))) is not None: + self.parallel = int(m.group(1)) if m.group(1) else True def add(self, ext): self.extensions.append(ext) -- 2.36.1.windows.1 pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.11.0/openssl-1.1.1q/000077500000000000000000000000001517431316200305635ustar00rootroot00000000000000openssl_1.1.1q_fix_c_include.patch000066400000000000000000000004101517431316200367550ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.11.0/openssl-1.1.1qdiff --git a/test/v3ext.c b/test/v3ext.c index 7a240cd706..6cec6f1a9b 100644 --- a/test/v3ext.c +++ b/test/v3ext.c @@ -15,6 +15,7 @@ #include #include "internal/nelem.h" +#include #include "testutil.h" static const char *infile; pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.11.1/000077500000000000000000000000001517431316200262645ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.11.1/Python-3.11.1/000077500000000000000000000000001517431316200302645ustar00rootroot000000000000000001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch000066400000000000000000000015631517431316200405150ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.11.1/Python-3.11.1From 3fec519d6b326918f39ceb142ef762042ce8365f Mon Sep 17 00:00:00 2001 From: Ivan Pozdeev Date: Fri, 26 Dec 2025 13:39:21 +0300 Subject: [PATCH] Recognize an argument to -j in MAKEFLAGS --- setup.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index ad8fb81b218..5666deaf67b 100644 --- a/setup.py +++ b/setup.py @@ -307,8 +307,8 @@ def __init__(self, dist): self.failed_on_import = [] self.missing = [] self.disabled_configure = [] - if '-j' in os.environ.get('MAKEFLAGS', ''): - self.parallel = True + if (m:=re.search(r'(?:^|\s)(?:-j|--jobs)(?:\s+|=)?(\d*)',os.environ.get('MAKEFLAGS', ''))) is not None: + self.parallel = int(m.group(1)) if m.group(1) else True def add(self, ext): self.extensions.append(ext) -- 2.36.1.windows.1 pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.11.10/000077500000000000000000000000001517431316200263445ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.11.10/Python-3.11.10/000077500000000000000000000000001517431316200304245ustar00rootroot000000000000000001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch000066400000000000000000000015631517431316200406550ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.11.10/Python-3.11.10From 3fec519d6b326918f39ceb142ef762042ce8365f Mon Sep 17 00:00:00 2001 From: Ivan Pozdeev Date: Fri, 26 Dec 2025 13:39:21 +0300 Subject: [PATCH] Recognize an argument to -j in MAKEFLAGS --- setup.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index ad8fb81b218..5666deaf67b 100644 --- a/setup.py +++ b/setup.py @@ -307,8 +307,8 @@ def __init__(self, dist): self.failed_on_import = [] self.missing = [] self.disabled_configure = [] - if '-j' in os.environ.get('MAKEFLAGS', ''): - self.parallel = True + if (m:=re.search(r'(?:^|\s)(?:-j|--jobs)(?:\s+|=)?(\d*)',os.environ.get('MAKEFLAGS', ''))) is not None: + self.parallel = int(m.group(1)) if m.group(1) else True def add(self, ext): self.extensions.append(ext) -- 2.36.1.windows.1 pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.11.11/000077500000000000000000000000001517431316200263455ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.11.11/Python-3.11.11/000077500000000000000000000000001517431316200304265ustar00rootroot000000000000000001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch000066400000000000000000000015631517431316200406570ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.11.11/Python-3.11.11From 3fec519d6b326918f39ceb142ef762042ce8365f Mon Sep 17 00:00:00 2001 From: Ivan Pozdeev Date: Fri, 26 Dec 2025 13:39:21 +0300 Subject: [PATCH] Recognize an argument to -j in MAKEFLAGS --- setup.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index ad8fb81b218..5666deaf67b 100644 --- a/setup.py +++ b/setup.py @@ -307,8 +307,8 @@ def __init__(self, dist): self.failed_on_import = [] self.missing = [] self.disabled_configure = [] - if '-j' in os.environ.get('MAKEFLAGS', ''): - self.parallel = True + if (m:=re.search(r'(?:^|\s)(?:-j|--jobs)(?:\s+|=)?(\d*)',os.environ.get('MAKEFLAGS', ''))) is not None: + self.parallel = int(m.group(1)) if m.group(1) else True def add(self, ext): self.extensions.append(ext) -- 2.36.1.windows.1 pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.11.12/000077500000000000000000000000001517431316200263465ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.11.12/Python-3.11.12/000077500000000000000000000000001517431316200304305ustar00rootroot000000000000000001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch000066400000000000000000000015631517431316200406610ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.11.12/Python-3.11.12From 3fec519d6b326918f39ceb142ef762042ce8365f Mon Sep 17 00:00:00 2001 From: Ivan Pozdeev Date: Fri, 26 Dec 2025 13:39:21 +0300 Subject: [PATCH] Recognize an argument to -j in MAKEFLAGS --- setup.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index ad8fb81b218..5666deaf67b 100644 --- a/setup.py +++ b/setup.py @@ -307,8 +307,8 @@ def __init__(self, dist): self.failed_on_import = [] self.missing = [] self.disabled_configure = [] - if '-j' in os.environ.get('MAKEFLAGS', ''): - self.parallel = True + if (m:=re.search(r'(?:^|\s)(?:-j|--jobs)(?:\s+|=)?(\d*)',os.environ.get('MAKEFLAGS', ''))) is not None: + self.parallel = int(m.group(1)) if m.group(1) else True def add(self, ext): self.extensions.append(ext) -- 2.36.1.windows.1 pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.11.13/000077500000000000000000000000001517431316200263475ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.11.13/Python-3.11.13/000077500000000000000000000000001517431316200304325ustar00rootroot000000000000000001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch000066400000000000000000000015631517431316200406630ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.11.13/Python-3.11.13From 3fec519d6b326918f39ceb142ef762042ce8365f Mon Sep 17 00:00:00 2001 From: Ivan Pozdeev Date: Fri, 26 Dec 2025 13:39:21 +0300 Subject: [PATCH] Recognize an argument to -j in MAKEFLAGS --- setup.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index ad8fb81b218..5666deaf67b 100644 --- a/setup.py +++ b/setup.py @@ -307,8 +307,8 @@ def __init__(self, dist): self.failed_on_import = [] self.missing = [] self.disabled_configure = [] - if '-j' in os.environ.get('MAKEFLAGS', ''): - self.parallel = True + if (m:=re.search(r'(?:^|\s)(?:-j|--jobs)(?:\s+|=)?(\d*)',os.environ.get('MAKEFLAGS', ''))) is not None: + self.parallel = int(m.group(1)) if m.group(1) else True def add(self, ext): self.extensions.append(ext) -- 2.36.1.windows.1 pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.11.14/000077500000000000000000000000001517431316200263505ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.11.14/Python-3.11.14/000077500000000000000000000000001517431316200304345ustar00rootroot000000000000000001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch000066400000000000000000000015631517431316200406650ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.11.14/Python-3.11.14From 3fec519d6b326918f39ceb142ef762042ce8365f Mon Sep 17 00:00:00 2001 From: Ivan Pozdeev Date: Fri, 26 Dec 2025 13:39:21 +0300 Subject: [PATCH] Recognize an argument to -j in MAKEFLAGS --- setup.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index ad8fb81b218..5666deaf67b 100644 --- a/setup.py +++ b/setup.py @@ -307,8 +307,8 @@ def __init__(self, dist): self.failed_on_import = [] self.missing = [] self.disabled_configure = [] - if '-j' in os.environ.get('MAKEFLAGS', ''): - self.parallel = True + if (m:=re.search(r'(?:^|\s)(?:-j|--jobs)(?:\s+|=)?(\d*)',os.environ.get('MAKEFLAGS', ''))) is not None: + self.parallel = int(m.group(1)) if m.group(1) else True def add(self, ext): self.extensions.append(ext) -- 2.36.1.windows.1 pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.11.2/000077500000000000000000000000001517431316200262655ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.11.2/Python-3.11.2/000077500000000000000000000000001517431316200302665ustar00rootroot000000000000000001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch000066400000000000000000000015631517431316200405170ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.11.2/Python-3.11.2From 3fec519d6b326918f39ceb142ef762042ce8365f Mon Sep 17 00:00:00 2001 From: Ivan Pozdeev Date: Fri, 26 Dec 2025 13:39:21 +0300 Subject: [PATCH] Recognize an argument to -j in MAKEFLAGS --- setup.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index ad8fb81b218..5666deaf67b 100644 --- a/setup.py +++ b/setup.py @@ -307,8 +307,8 @@ def __init__(self, dist): self.failed_on_import = [] self.missing = [] self.disabled_configure = [] - if '-j' in os.environ.get('MAKEFLAGS', ''): - self.parallel = True + if (m:=re.search(r'(?:^|\s)(?:-j|--jobs)(?:\s+|=)?(\d*)',os.environ.get('MAKEFLAGS', ''))) is not None: + self.parallel = int(m.group(1)) if m.group(1) else True def add(self, ext): self.extensions.append(ext) -- 2.36.1.windows.1 pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.11.3/000077500000000000000000000000001517431316200262665ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.11.3/Python-3.11.3/000077500000000000000000000000001517431316200302705ustar00rootroot000000000000000001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch000066400000000000000000000015631517431316200405210ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.11.3/Python-3.11.3From 3fec519d6b326918f39ceb142ef762042ce8365f Mon Sep 17 00:00:00 2001 From: Ivan Pozdeev Date: Fri, 26 Dec 2025 13:39:21 +0300 Subject: [PATCH] Recognize an argument to -j in MAKEFLAGS --- setup.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index ad8fb81b218..5666deaf67b 100644 --- a/setup.py +++ b/setup.py @@ -307,8 +307,8 @@ def __init__(self, dist): self.failed_on_import = [] self.missing = [] self.disabled_configure = [] - if '-j' in os.environ.get('MAKEFLAGS', ''): - self.parallel = True + if (m:=re.search(r'(?:^|\s)(?:-j|--jobs)(?:\s+|=)?(\d*)',os.environ.get('MAKEFLAGS', ''))) is not None: + self.parallel = int(m.group(1)) if m.group(1) else True def add(self, ext): self.extensions.append(ext) -- 2.36.1.windows.1 pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.11.4/000077500000000000000000000000001517431316200262675ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.11.4/Python-3.11.4/000077500000000000000000000000001517431316200302725ustar00rootroot000000000000000001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch000066400000000000000000000015631517431316200405230ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.11.4/Python-3.11.4From 3fec519d6b326918f39ceb142ef762042ce8365f Mon Sep 17 00:00:00 2001 From: Ivan Pozdeev Date: Fri, 26 Dec 2025 13:39:21 +0300 Subject: [PATCH] Recognize an argument to -j in MAKEFLAGS --- setup.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index ad8fb81b218..5666deaf67b 100644 --- a/setup.py +++ b/setup.py @@ -307,8 +307,8 @@ def __init__(self, dist): self.failed_on_import = [] self.missing = [] self.disabled_configure = [] - if '-j' in os.environ.get('MAKEFLAGS', ''): - self.parallel = True + if (m:=re.search(r'(?:^|\s)(?:-j|--jobs)(?:\s+|=)?(\d*)',os.environ.get('MAKEFLAGS', ''))) is not None: + self.parallel = int(m.group(1)) if m.group(1) else True def add(self, ext): self.extensions.append(ext) -- 2.36.1.windows.1 pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.11.5/000077500000000000000000000000001517431316200262705ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.11.5/Python-3.11.5/000077500000000000000000000000001517431316200302745ustar00rootroot000000000000000001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch000066400000000000000000000015631517431316200405250ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.11.5/Python-3.11.5From 3fec519d6b326918f39ceb142ef762042ce8365f Mon Sep 17 00:00:00 2001 From: Ivan Pozdeev Date: Fri, 26 Dec 2025 13:39:21 +0300 Subject: [PATCH] Recognize an argument to -j in MAKEFLAGS --- setup.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index ad8fb81b218..5666deaf67b 100644 --- a/setup.py +++ b/setup.py @@ -307,8 +307,8 @@ def __init__(self, dist): self.failed_on_import = [] self.missing = [] self.disabled_configure = [] - if '-j' in os.environ.get('MAKEFLAGS', ''): - self.parallel = True + if (m:=re.search(r'(?:^|\s)(?:-j|--jobs)(?:\s+|=)?(\d*)',os.environ.get('MAKEFLAGS', ''))) is not None: + self.parallel = int(m.group(1)) if m.group(1) else True def add(self, ext): self.extensions.append(ext) -- 2.36.1.windows.1 pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.11.6/000077500000000000000000000000001517431316200262715ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.11.6/Python-3.11.6/000077500000000000000000000000001517431316200302765ustar00rootroot000000000000000001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch000066400000000000000000000015631517431316200405270ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.11.6/Python-3.11.6From 3fec519d6b326918f39ceb142ef762042ce8365f Mon Sep 17 00:00:00 2001 From: Ivan Pozdeev Date: Fri, 26 Dec 2025 13:39:21 +0300 Subject: [PATCH] Recognize an argument to -j in MAKEFLAGS --- setup.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index ad8fb81b218..5666deaf67b 100644 --- a/setup.py +++ b/setup.py @@ -307,8 +307,8 @@ def __init__(self, dist): self.failed_on_import = [] self.missing = [] self.disabled_configure = [] - if '-j' in os.environ.get('MAKEFLAGS', ''): - self.parallel = True + if (m:=re.search(r'(?:^|\s)(?:-j|--jobs)(?:\s+|=)?(\d*)',os.environ.get('MAKEFLAGS', ''))) is not None: + self.parallel = int(m.group(1)) if m.group(1) else True def add(self, ext): self.extensions.append(ext) -- 2.36.1.windows.1 pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.11.7/000077500000000000000000000000001517431316200262725ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.11.7/Python-3.11.7/000077500000000000000000000000001517431316200303005ustar00rootroot000000000000000001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch000066400000000000000000000015631517431316200405310ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.11.7/Python-3.11.7From 3fec519d6b326918f39ceb142ef762042ce8365f Mon Sep 17 00:00:00 2001 From: Ivan Pozdeev Date: Fri, 26 Dec 2025 13:39:21 +0300 Subject: [PATCH] Recognize an argument to -j in MAKEFLAGS --- setup.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index ad8fb81b218..5666deaf67b 100644 --- a/setup.py +++ b/setup.py @@ -307,8 +307,8 @@ def __init__(self, dist): self.failed_on_import = [] self.missing = [] self.disabled_configure = [] - if '-j' in os.environ.get('MAKEFLAGS', ''): - self.parallel = True + if (m:=re.search(r'(?:^|\s)(?:-j|--jobs)(?:\s+|=)?(\d*)',os.environ.get('MAKEFLAGS', ''))) is not None: + self.parallel = int(m.group(1)) if m.group(1) else True def add(self, ext): self.extensions.append(ext) -- 2.36.1.windows.1 pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.11.8/000077500000000000000000000000001517431316200262735ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.11.8/Python-3.11.8/000077500000000000000000000000001517431316200303025ustar00rootroot000000000000000001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch000066400000000000000000000015631517431316200405330ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.11.8/Python-3.11.8From 3fec519d6b326918f39ceb142ef762042ce8365f Mon Sep 17 00:00:00 2001 From: Ivan Pozdeev Date: Fri, 26 Dec 2025 13:39:21 +0300 Subject: [PATCH] Recognize an argument to -j in MAKEFLAGS --- setup.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index ad8fb81b218..5666deaf67b 100644 --- a/setup.py +++ b/setup.py @@ -307,8 +307,8 @@ def __init__(self, dist): self.failed_on_import = [] self.missing = [] self.disabled_configure = [] - if '-j' in os.environ.get('MAKEFLAGS', ''): - self.parallel = True + if (m:=re.search(r'(?:^|\s)(?:-j|--jobs)(?:\s+|=)?(\d*)',os.environ.get('MAKEFLAGS', ''))) is not None: + self.parallel = int(m.group(1)) if m.group(1) else True def add(self, ext): self.extensions.append(ext) -- 2.36.1.windows.1 pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.11.9/000077500000000000000000000000001517431316200262745ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.11.9/Python-3.11.9/000077500000000000000000000000001517431316200303045ustar00rootroot000000000000000001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch000066400000000000000000000015631517431316200405350ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.11.9/Python-3.11.9From 3fec519d6b326918f39ceb142ef762042ce8365f Mon Sep 17 00:00:00 2001 From: Ivan Pozdeev Date: Fri, 26 Dec 2025 13:39:21 +0300 Subject: [PATCH] Recognize an argument to -j in MAKEFLAGS --- setup.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index ad8fb81b218..5666deaf67b 100644 --- a/setup.py +++ b/setup.py @@ -307,8 +307,8 @@ def __init__(self, dist): self.failed_on_import = [] self.missing = [] self.disabled_configure = [] - if '-j' in os.environ.get('MAKEFLAGS', ''): - self.parallel = True + if (m:=re.search(r'(?:^|\s)(?:-j|--jobs)(?:\s+|=)?(\d*)',os.environ.get('MAKEFLAGS', ''))) is not None: + self.parallel = int(m.group(1)) if m.group(1) else True def add(self, ext): self.extensions.append(ext) -- 2.36.1.windows.1 pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.2.0/000077500000000000000000000000001517431316200262035ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.2.0/Python-3.2/000077500000000000000000000000001517431316200277645ustar00rootroot00000000000000000_patch-setup.py.diff000066400000000000000000000031601517431316200340020ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.2.0/Python-3.2--- setup.py.orig 2011-07-07 20:26:15.000000000 +0900 +++ setup.py 2011-07-07 20:29:28.735543350 +0900 @@ -370,12 +370,35 @@ return platform return sys.platform + def add_multiarch_paths(self): + # Debian/Ubuntu multiarch support. + # https://wiki.ubuntu.com/MultiarchSpec + if not find_executable('dpkg-architecture'): + return + tmpfile = os.path.join(self.build_temp, 'multiarch') + if not os.path.exists(self.build_temp): + os.makedirs(self.build_temp) + ret = os.system( + 'dpkg-architecture -qDEB_HOST_MULTIARCH > %s 2> /dev/null' % + tmpfile) + try: + if ret >> 8 == 0: + with open(tmpfile) as fp: + multiarch_path_component = fp.readline().strip() + add_dir_to_list(self.compiler.library_dirs, + '/usr/lib/' + multiarch_path_component) + add_dir_to_list(self.compiler.include_dirs, + '/usr/include/' + multiarch_path_component) + finally: + os.unlink(tmpfile) + def detect_modules(self): # Ensure that /usr/local is always used, but the local build # directories (i.e. '.' and 'Include') must be first. See issue # 10520. add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib') add_dir_to_list(self.compiler.include_dirs, '/usr/local/include') + self.add_multiarch_paths() # Add paths specified in the environment variables LDFLAGS and # CPPFLAGS for header and library files. 002_readline63.patch000066400000000000000000000037751517431316200332570ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.2.0/Python-3.2diff -r -u ../Python-3.3.3.orig/Modules/readline.c ./Modules/readline.c --- ../Python-3.3.3.orig/Modules/readline.c 2013-11-17 16:23:01.000000000 +0900 +++ ./Modules/readline.c 2014-03-29 16:22:10.219305878 +0900 @@ -231,8 +231,7 @@ if (!PyArg_ParseTuple(args, buf, &function)) return NULL; if (function == Py_None) { - Py_XDECREF(*hook_var); - *hook_var = NULL; + Py_CLEAR(*hook_var); } else if (PyCallable_Check(function)) { PyObject *tmp = *hook_var; @@ -774,14 +773,22 @@ } static int +#if defined(_RL_FUNCTION_TYPEDEF) on_startup_hook(void) +#else +on_startup_hook() +#endif { return on_hook(startup_hook); } #ifdef HAVE_RL_PRE_INPUT_HOOK static int +#if defined(_RL_FUNCTION_TYPEDEF) on_pre_input_hook(void) +#else +on_pre_input_hook() +#endif { return on_hook(pre_input_hook); } @@ -819,7 +826,7 @@ (r != Py_None && PyLong_AsLong(r) == -1 && PyErr_Occurred())) { goto error; } - Py_XDECREF(r); r=NULL; + Py_CLEAR(r); if (0) { error: @@ -877,7 +884,7 @@ * before calling the normal completer */ static char ** -flex_complete(char *text, int start, int end) +flex_complete(const char *text, int start, int end) { #ifdef HAVE_RL_COMPLETION_APPEND_CHARACTER rl_completion_append_character ='\0'; @@ -936,12 +943,12 @@ rl_bind_key_in_map ('\t', rl_complete, emacs_meta_keymap); rl_bind_key_in_map ('\033', rl_complete, emacs_meta_keymap); /* Set our hook functions */ - rl_startup_hook = (Function *)on_startup_hook; + rl_startup_hook = on_startup_hook; #ifdef HAVE_RL_PRE_INPUT_HOOK - rl_pre_input_hook = (Function *)on_pre_input_hook; + rl_pre_input_hook = on_pre_input_hook; #endif /* Set our completion function */ - rl_attempted_completion_function = (CPPFunction *)flex_complete; + rl_attempted_completion_function = flex_complete; /* Set Python word break characters */ completer_word_break_characters = rl_completer_word_break_characters = 010_ssl_no_ssl2_no_ssl3.patch000066400000000000000000000066011517431316200352110ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.2.0/Python-3.2diff -r -u ../Python-3.2.orig/Lib/ssl.py ./Lib/ssl.py --- ../Python-3.2.orig/Lib/ssl.py 2010-10-22 18:19:07.000000000 +0000 +++ ./Lib/ssl.py 2015-12-20 07:12:00.759323661 +0000 @@ -62,23 +62,26 @@ from _ssl import OPENSSL_VERSION_NUMBER, OPENSSL_VERSION_INFO, OPENSSL_VERSION from _ssl import _SSLContext, SSLError from _ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED -from _ssl import (PROTOCOL_SSLv2, PROTOCOL_SSLv3, PROTOCOL_SSLv23, - PROTOCOL_TLSv1) -from _ssl import OP_ALL, OP_NO_SSLv2, OP_NO_SSLv3, OP_NO_TLSv1 -from _ssl import RAND_status, RAND_egd, RAND_add -from _ssl import ( - SSL_ERROR_ZERO_RETURN, - SSL_ERROR_WANT_READ, - SSL_ERROR_WANT_WRITE, - SSL_ERROR_WANT_X509_LOOKUP, - SSL_ERROR_SYSCALL, - SSL_ERROR_SSL, - SSL_ERROR_WANT_CONNECT, - SSL_ERROR_EOF, - SSL_ERROR_INVALID_ERROR_CODE, - ) +from _ssl import RAND_status, RAND_add +try: + from _ssl import RAND_egd +except ImportError: + # LibreSSL does not provide RAND_egd + pass + +def _import_symbols(prefix): + for n in dir(_ssl): + if n.startswith(prefix): + globals()[n] = getattr(_ssl, n) + +_import_symbols('OP_') +_import_symbols('SSL_ERROR_') +_import_symbols('PROTOCOL_') + from _ssl import HAS_SNI +_PROTOCOL_NAMES = {value: name for name, value in globals().items() if name.startswith('PROTOCOL_')} + from socket import getnameinfo as _getnameinfo from socket import error as socket_error from socket import socket, AF_INET, SOCK_STREAM @@ -518,7 +521,7 @@ d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)] return base64.decodebytes(d.encode('ASCII', 'strict')) -def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv3, ca_certs=None): +def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None): """Retrieve the certificate from the server at the specified address, and return it as a PEM-encoded string. If 'ca_certs' is specified, validate the server cert against it. diff -r -u ../Python-3.2.orig/Modules/_ssl.c ./Modules/_ssl.c --- ../Python-3.2.orig/Modules/_ssl.c 2011-01-29 11:31:20.000000000 +0000 +++ ./Modules/_ssl.c 2015-12-20 07:10:38.285929662 +0000 @@ -63,8 +63,12 @@ }; enum py_ssl_version { +#ifndef OPENSSL_NO_SSL2 PY_SSL_VERSION_SSL2, +#endif +#ifndef OPENSSL_NO_SSL3 PY_SSL_VERSION_SSL3, +#endif PY_SSL_VERSION_SSL23, PY_SSL_VERSION_TLS1 }; @@ -1448,10 +1452,14 @@ PySSL_BEGIN_ALLOW_THREADS if (proto_version == PY_SSL_VERSION_TLS1) ctx = SSL_CTX_new(TLSv1_method()); +#ifndef OPENSSL_NO_SSL3 else if (proto_version == PY_SSL_VERSION_SSL3) ctx = SSL_CTX_new(SSLv3_method()); +#endif +#ifndef OPENSSL_NO_SSL2 else if (proto_version == PY_SSL_VERSION_SSL2) ctx = SSL_CTX_new(SSLv2_method()); +#endif else if (proto_version == PY_SSL_VERSION_SSL23) ctx = SSL_CTX_new(SSLv23_method()); else @@ -2110,10 +2118,14 @@ PY_SSL_CERT_REQUIRED); /* protocol versions */ +#ifndef OPENSSL_NO_SSL2 PyModule_AddIntConstant(m, "PROTOCOL_SSLv2", PY_SSL_VERSION_SSL2); +#endif +#ifndef OPENSSL_NO_SSL3 PyModule_AddIntConstant(m, "PROTOCOL_SSLv3", PY_SSL_VERSION_SSL3); +#endif PyModule_AddIntConstant(m, "PROTOCOL_SSLv23", PY_SSL_VERSION_SSL23); PyModule_AddIntConstant(m, "PROTOCOL_TLSv1", pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.2.1/000077500000000000000000000000001517431316200262045ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.2.1/Python-3.2.1/000077500000000000000000000000001517431316200301245ustar00rootroot00000000000000002_readline63.patch000066400000000000000000000037751517431316200334170ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.2.1/Python-3.2.1diff -r -u ../Python-3.3.3.orig/Modules/readline.c ./Modules/readline.c --- ../Python-3.3.3.orig/Modules/readline.c 2013-11-17 16:23:01.000000000 +0900 +++ ./Modules/readline.c 2014-03-29 16:22:10.219305878 +0900 @@ -231,8 +231,7 @@ if (!PyArg_ParseTuple(args, buf, &function)) return NULL; if (function == Py_None) { - Py_XDECREF(*hook_var); - *hook_var = NULL; + Py_CLEAR(*hook_var); } else if (PyCallable_Check(function)) { PyObject *tmp = *hook_var; @@ -774,14 +773,22 @@ } static int +#if defined(_RL_FUNCTION_TYPEDEF) on_startup_hook(void) +#else +on_startup_hook() +#endif { return on_hook(startup_hook); } #ifdef HAVE_RL_PRE_INPUT_HOOK static int +#if defined(_RL_FUNCTION_TYPEDEF) on_pre_input_hook(void) +#else +on_pre_input_hook() +#endif { return on_hook(pre_input_hook); } @@ -819,7 +826,7 @@ (r != Py_None && PyLong_AsLong(r) == -1 && PyErr_Occurred())) { goto error; } - Py_XDECREF(r); r=NULL; + Py_CLEAR(r); if (0) { error: @@ -877,7 +884,7 @@ * before calling the normal completer */ static char ** -flex_complete(char *text, int start, int end) +flex_complete(const char *text, int start, int end) { #ifdef HAVE_RL_COMPLETION_APPEND_CHARACTER rl_completion_append_character ='\0'; @@ -936,12 +943,12 @@ rl_bind_key_in_map ('\t', rl_complete, emacs_meta_keymap); rl_bind_key_in_map ('\033', rl_complete, emacs_meta_keymap); /* Set our hook functions */ - rl_startup_hook = (Function *)on_startup_hook; + rl_startup_hook = on_startup_hook; #ifdef HAVE_RL_PRE_INPUT_HOOK - rl_pre_input_hook = (Function *)on_pre_input_hook; + rl_pre_input_hook = on_pre_input_hook; #endif /* Set our completion function */ - rl_attempted_completion_function = (CPPFunction *)flex_complete; + rl_attempted_completion_function = flex_complete; /* Set Python word break characters */ completer_word_break_characters = rl_completer_word_break_characters = 010_ssl_no_ssl3.patch000066400000000000000000000065671517431316200337250ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.2.1/Python-3.2.1diff -r -u ../Python-3.2.1.orig/Lib/ssl.py ./Lib/ssl.py --- ../Python-3.2.1.orig/Lib/ssl.py 2011-07-09 06:58:49.000000000 +0000 +++ ./Lib/ssl.py 2015-12-20 07:06:01.609146268 +0000 @@ -62,32 +62,30 @@ from _ssl import OPENSSL_VERSION_NUMBER, OPENSSL_VERSION_INFO, OPENSSL_VERSION from _ssl import _SSLContext, SSLError from _ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED -from _ssl import OP_ALL, OP_NO_SSLv2, OP_NO_SSLv3, OP_NO_TLSv1 -from _ssl import RAND_status, RAND_egd, RAND_add -from _ssl import ( - SSL_ERROR_ZERO_RETURN, - SSL_ERROR_WANT_READ, - SSL_ERROR_WANT_WRITE, - SSL_ERROR_WANT_X509_LOOKUP, - SSL_ERROR_SYSCALL, - SSL_ERROR_SSL, - SSL_ERROR_WANT_CONNECT, - SSL_ERROR_EOF, - SSL_ERROR_INVALID_ERROR_CODE, - ) -from _ssl import HAS_SNI -from _ssl import PROTOCOL_SSLv3, PROTOCOL_SSLv23, PROTOCOL_TLSv1 -_PROTOCOL_NAMES = { - PROTOCOL_TLSv1: "TLSv1", - PROTOCOL_SSLv23: "SSLv23", - PROTOCOL_SSLv3: "SSLv3", -} +from _ssl import RAND_status, RAND_add try: - from _ssl import PROTOCOL_SSLv2 + from _ssl import RAND_egd except ImportError: + # LibreSSL does not provide RAND_egd pass -else: - _PROTOCOL_NAMES[PROTOCOL_SSLv2] = "SSLv2" + +def _import_symbols(prefix): + for n in dir(_ssl): + if n.startswith(prefix): + globals()[n] = getattr(_ssl, n) + +_import_symbols('OP_') +_import_symbols('SSL_ERROR_') +_import_symbols('PROTOCOL_') + +from _ssl import HAS_SNI + +_PROTOCOL_NAMES = {value: name for name, value in globals().items() if name.startswith('PROTOCOL_')} + +try: + _SSLv2_IF_EXISTS = PROTOCOL_SSLv2 +except NameError: + _SSLv2_IF_EXISTS = None from socket import getnameinfo as _getnameinfo from socket import error as socket_error @@ -545,7 +543,7 @@ d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)] return base64.decodebytes(d.encode('ASCII', 'strict')) -def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv3, ca_certs=None): +def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None): """Retrieve the certificate from the server at the specified address, and return it as a PEM-encoded string. If 'ca_certs' is specified, validate the server cert against it. diff -r -u ../Python-3.2.1.orig/Modules/_ssl.c ./Modules/_ssl.c --- ../Python-3.2.1.orig/Modules/_ssl.c 2011-07-09 06:58:54.000000000 +0000 +++ ./Modules/_ssl.c 2015-12-20 07:04:34.878266042 +0000 @@ -66,7 +66,9 @@ #ifndef OPENSSL_NO_SSL2 PY_SSL_VERSION_SSL2, #endif +#ifndef OPENSSL_NO_SSL3 PY_SSL_VERSION_SSL3=1, +#endif PY_SSL_VERSION_SSL23, PY_SSL_VERSION_TLS1 }; @@ -1450,8 +1452,10 @@ PySSL_BEGIN_ALLOW_THREADS if (proto_version == PY_SSL_VERSION_TLS1) ctx = SSL_CTX_new(TLSv1_method()); +#ifndef OPENSSL_NO_SSL3 else if (proto_version == PY_SSL_VERSION_SSL3) ctx = SSL_CTX_new(SSLv3_method()); +#endif #ifndef OPENSSL_NO_SSL2 else if (proto_version == PY_SSL_VERSION_SSL2) ctx = SSL_CTX_new(SSLv2_method()); @@ -2118,8 +2122,10 @@ PyModule_AddIntConstant(m, "PROTOCOL_SSLv2", PY_SSL_VERSION_SSL2); #endif +#ifndef OPENSSL_NO_SSL3 PyModule_AddIntConstant(m, "PROTOCOL_SSLv3", PY_SSL_VERSION_SSL3); +#endif PyModule_AddIntConstant(m, "PROTOCOL_SSLv23", PY_SSL_VERSION_SSL23); PyModule_AddIntConstant(m, "PROTOCOL_TLSv1", pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.2.2/000077500000000000000000000000001517431316200262055ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.2.2/Python-3.2.2/000077500000000000000000000000001517431316200301265ustar00rootroot00000000000000002_readline63.patch000066400000000000000000000037751517431316200334210ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.2.2/Python-3.2.2diff -r -u ../Python-3.3.3.orig/Modules/readline.c ./Modules/readline.c --- ../Python-3.3.3.orig/Modules/readline.c 2013-11-17 16:23:01.000000000 +0900 +++ ./Modules/readline.c 2014-03-29 16:22:10.219305878 +0900 @@ -231,8 +231,7 @@ if (!PyArg_ParseTuple(args, buf, &function)) return NULL; if (function == Py_None) { - Py_XDECREF(*hook_var); - *hook_var = NULL; + Py_CLEAR(*hook_var); } else if (PyCallable_Check(function)) { PyObject *tmp = *hook_var; @@ -774,14 +773,22 @@ } static int +#if defined(_RL_FUNCTION_TYPEDEF) on_startup_hook(void) +#else +on_startup_hook() +#endif { return on_hook(startup_hook); } #ifdef HAVE_RL_PRE_INPUT_HOOK static int +#if defined(_RL_FUNCTION_TYPEDEF) on_pre_input_hook(void) +#else +on_pre_input_hook() +#endif { return on_hook(pre_input_hook); } @@ -819,7 +826,7 @@ (r != Py_None && PyLong_AsLong(r) == -1 && PyErr_Occurred())) { goto error; } - Py_XDECREF(r); r=NULL; + Py_CLEAR(r); if (0) { error: @@ -877,7 +884,7 @@ * before calling the normal completer */ static char ** -flex_complete(char *text, int start, int end) +flex_complete(const char *text, int start, int end) { #ifdef HAVE_RL_COMPLETION_APPEND_CHARACTER rl_completion_append_character ='\0'; @@ -936,12 +943,12 @@ rl_bind_key_in_map ('\t', rl_complete, emacs_meta_keymap); rl_bind_key_in_map ('\033', rl_complete, emacs_meta_keymap); /* Set our hook functions */ - rl_startup_hook = (Function *)on_startup_hook; + rl_startup_hook = on_startup_hook; #ifdef HAVE_RL_PRE_INPUT_HOOK - rl_pre_input_hook = (Function *)on_pre_input_hook; + rl_pre_input_hook = on_pre_input_hook; #endif /* Set our completion function */ - rl_attempted_completion_function = (CPPFunction *)flex_complete; + rl_attempted_completion_function = flex_complete; /* Set Python word break characters */ completer_word_break_characters = rl_completer_word_break_characters = 010_ssl_no_ssl3.patch000066400000000000000000000066411517431316200337200ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.2.2/Python-3.2.2diff -r -u ../Python-3.2.2.orig/Lib/ssl.py ./Lib/ssl.py --- ../Python-3.2.2.orig/Lib/ssl.py 2011-09-03 16:16:42.000000000 +0000 +++ ./Lib/ssl.py 2015-12-20 07:01:09.947260656 +0000 @@ -62,34 +62,30 @@ from _ssl import OPENSSL_VERSION_NUMBER, OPENSSL_VERSION_INFO, OPENSSL_VERSION from _ssl import _SSLContext, SSLError from _ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED -from _ssl import OP_ALL, OP_NO_SSLv2, OP_NO_SSLv3, OP_NO_TLSv1 -from _ssl import RAND_status, RAND_egd, RAND_add -from _ssl import ( - SSL_ERROR_ZERO_RETURN, - SSL_ERROR_WANT_READ, - SSL_ERROR_WANT_WRITE, - SSL_ERROR_WANT_X509_LOOKUP, - SSL_ERROR_SYSCALL, - SSL_ERROR_SSL, - SSL_ERROR_WANT_CONNECT, - SSL_ERROR_EOF, - SSL_ERROR_INVALID_ERROR_CODE, - ) +from _ssl import RAND_status, RAND_add +try: + from _ssl import RAND_egd +except ImportError: + # LibreSSL does not provide RAND_egd + pass + +def _import_symbols(prefix): + for n in dir(_ssl): + if n.startswith(prefix): + globals()[n] = getattr(_ssl, n) + +_import_symbols('OP_') +_import_symbols('SSL_ERROR_') +_import_symbols('PROTOCOL_') + from _ssl import HAS_SNI -from _ssl import PROTOCOL_SSLv3, PROTOCOL_SSLv23, PROTOCOL_TLSv1 from _ssl import _OPENSSL_API_VERSION -_PROTOCOL_NAMES = { - PROTOCOL_TLSv1: "TLSv1", - PROTOCOL_SSLv23: "SSLv23", - PROTOCOL_SSLv3: "SSLv3", -} +_PROTOCOL_NAMES = {value: name for name, value in globals().items() if name.startswith('PROTOCOL_')} try: - from _ssl import PROTOCOL_SSLv2 -except ImportError: - pass -else: - _PROTOCOL_NAMES[PROTOCOL_SSLv2] = "SSLv2" + _SSLv2_IF_EXISTS = PROTOCOL_SSLv2 +except NameError: + _SSLv2_IF_EXISTS = None from socket import getnameinfo as _getnameinfo from socket import error as socket_error @@ -547,7 +543,7 @@ d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)] return base64.decodebytes(d.encode('ASCII', 'strict')) -def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv3, ca_certs=None): +def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None): """Retrieve the certificate from the server at the specified address, and return it as a PEM-encoded string. If 'ca_certs' is specified, validate the server cert against it. diff -r -u ../Python-3.2.2.orig/Modules/_ssl.c ./Modules/_ssl.c --- ../Python-3.2.2.orig/Modules/_ssl.c 2011-09-03 16:16:46.000000000 +0000 +++ ./Modules/_ssl.c 2015-12-20 06:59:12.632993190 +0000 @@ -66,7 +66,9 @@ #ifndef OPENSSL_NO_SSL2 PY_SSL_VERSION_SSL2, #endif +#ifndef OPENSSL_NO_SSL3 PY_SSL_VERSION_SSL3=1, +#endif PY_SSL_VERSION_SSL23, PY_SSL_VERSION_TLS1 }; @@ -1450,8 +1452,10 @@ PySSL_BEGIN_ALLOW_THREADS if (proto_version == PY_SSL_VERSION_TLS1) ctx = SSL_CTX_new(TLSv1_method()); +#ifndef OPENSSL_NO_SSL3 else if (proto_version == PY_SSL_VERSION_SSL3) ctx = SSL_CTX_new(SSLv3_method()); +#endif #ifndef OPENSSL_NO_SSL2 else if (proto_version == PY_SSL_VERSION_SSL2) ctx = SSL_CTX_new(SSLv2_method()); @@ -2136,8 +2140,10 @@ PyModule_AddIntConstant(m, "PROTOCOL_SSLv2", PY_SSL_VERSION_SSL2); #endif +#ifndef OPENSSL_NO_SSL3 PyModule_AddIntConstant(m, "PROTOCOL_SSLv3", PY_SSL_VERSION_SSL3); +#endif PyModule_AddIntConstant(m, "PROTOCOL_SSLv23", PY_SSL_VERSION_SSL23); PyModule_AddIntConstant(m, "PROTOCOL_TLSv1", pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.2.3/000077500000000000000000000000001517431316200262065ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.2.3/Python-3.2.3/000077500000000000000000000000001517431316200301305ustar00rootroot00000000000000002_readline63.patch000066400000000000000000000037751517431316200334230ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.2.3/Python-3.2.3diff -r -u ../Python-3.3.3.orig/Modules/readline.c ./Modules/readline.c --- ../Python-3.3.3.orig/Modules/readline.c 2013-11-17 16:23:01.000000000 +0900 +++ ./Modules/readline.c 2014-03-29 16:22:10.219305878 +0900 @@ -231,8 +231,7 @@ if (!PyArg_ParseTuple(args, buf, &function)) return NULL; if (function == Py_None) { - Py_XDECREF(*hook_var); - *hook_var = NULL; + Py_CLEAR(*hook_var); } else if (PyCallable_Check(function)) { PyObject *tmp = *hook_var; @@ -774,14 +773,22 @@ } static int +#if defined(_RL_FUNCTION_TYPEDEF) on_startup_hook(void) +#else +on_startup_hook() +#endif { return on_hook(startup_hook); } #ifdef HAVE_RL_PRE_INPUT_HOOK static int +#if defined(_RL_FUNCTION_TYPEDEF) on_pre_input_hook(void) +#else +on_pre_input_hook() +#endif { return on_hook(pre_input_hook); } @@ -819,7 +826,7 @@ (r != Py_None && PyLong_AsLong(r) == -1 && PyErr_Occurred())) { goto error; } - Py_XDECREF(r); r=NULL; + Py_CLEAR(r); if (0) { error: @@ -877,7 +884,7 @@ * before calling the normal completer */ static char ** -flex_complete(char *text, int start, int end) +flex_complete(const char *text, int start, int end) { #ifdef HAVE_RL_COMPLETION_APPEND_CHARACTER rl_completion_append_character ='\0'; @@ -936,12 +943,12 @@ rl_bind_key_in_map ('\t', rl_complete, emacs_meta_keymap); rl_bind_key_in_map ('\033', rl_complete, emacs_meta_keymap); /* Set our hook functions */ - rl_startup_hook = (Function *)on_startup_hook; + rl_startup_hook = on_startup_hook; #ifdef HAVE_RL_PRE_INPUT_HOOK - rl_pre_input_hook = (Function *)on_pre_input_hook; + rl_pre_input_hook = on_pre_input_hook; #endif /* Set our completion function */ - rl_attempted_completion_function = (CPPFunction *)flex_complete; + rl_attempted_completion_function = flex_complete; /* Set Python word break characters */ completer_word_break_characters = rl_completer_word_break_characters = 010_ssl_no_ssl3.patch000066400000000000000000000065651517431316200337270ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.2.3/Python-3.2.3diff -r -u ../Python-3.2.6.orig/Lib/ssl.py ./Lib/ssl.py --- ../Python-3.2.6.orig/Lib/ssl.py 2014-10-12 06:52:02.000000000 +0000 +++ ./Lib/ssl.py 2015-12-20 06:40:11.895384463 +0000 @@ -62,35 +62,30 @@ from _ssl import OPENSSL_VERSION_NUMBER, OPENSSL_VERSION_INFO, OPENSSL_VERSION from _ssl import _SSLContext, SSLError from _ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED -from _ssl import OP_ALL, OP_NO_SSLv2, OP_NO_SSLv3, OP_NO_TLSv1 from _ssl import RAND_status, RAND_egd, RAND_add -from _ssl import ( - SSL_ERROR_ZERO_RETURN, - SSL_ERROR_WANT_READ, - SSL_ERROR_WANT_WRITE, - SSL_ERROR_WANT_X509_LOOKUP, - SSL_ERROR_SYSCALL, - SSL_ERROR_SSL, - SSL_ERROR_WANT_CONNECT, - SSL_ERROR_EOF, - SSL_ERROR_INVALID_ERROR_CODE, - ) +try: + from _ssl import RAND_egd +except ImportError: + # LibreSSL does not provide RAND_egd + pass + +def _import_symbols(prefix): + for n in dir(_ssl): + if n.startswith(prefix): + globals()[n] = getattr(_ssl, n) + +_import_symbols('OP_') +_import_symbols('SSL_ERROR_') +_import_symbols('PROTOCOL_') + from _ssl import HAS_SNI -from _ssl import PROTOCOL_SSLv3, PROTOCOL_SSLv23, PROTOCOL_TLSv1 from _ssl import _OPENSSL_API_VERSION -_PROTOCOL_NAMES = { - PROTOCOL_TLSv1: "TLSv1", - PROTOCOL_SSLv23: "SSLv23", - PROTOCOL_SSLv3: "SSLv3", -} +_PROTOCOL_NAMES = {value: name for name, value in globals().items() if name.startswith('PROTOCOL_')} try: - from _ssl import PROTOCOL_SSLv2 _SSLv2_IF_EXISTS = PROTOCOL_SSLv2 -except ImportError: +except NameError: _SSLv2_IF_EXISTS = None -else: - _PROTOCOL_NAMES[PROTOCOL_SSLv2] = "SSLv2" from socket import getnameinfo as _getnameinfo from socket import error as socket_error @@ -557,7 +552,7 @@ d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)] return base64.decodebytes(d.encode('ASCII', 'strict')) -def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv3, ca_certs=None): +def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None): """Retrieve the certificate from the server at the specified address, and return it as a PEM-encoded string. If 'ca_certs' is specified, validate the server cert against it. diff -r -u ../Python-3.2.6.orig/Modules/_ssl.c ./Modules/_ssl.c --- ../Python-3.2.6.orig/Modules/_ssl.c 2014-10-12 06:52:03.000000000 +0000 +++ ./Modules/_ssl.c 2015-12-20 06:37:10.124337227 +0000 @@ -66,7 +66,9 @@ #ifndef OPENSSL_NO_SSL2 PY_SSL_VERSION_SSL2, #endif +#ifndef OPENSSL_NO_SSL3 PY_SSL_VERSION_SSL3=1, +#endif PY_SSL_VERSION_SSL23, PY_SSL_VERSION_TLS1 }; @@ -1512,8 +1514,10 @@ PySSL_BEGIN_ALLOW_THREADS if (proto_version == PY_SSL_VERSION_TLS1) ctx = SSL_CTX_new(TLSv1_method()); +#ifndef OPENSSL_NO_SSL3 else if (proto_version == PY_SSL_VERSION_SSL3) ctx = SSL_CTX_new(SSLv3_method()); +#endif #ifndef OPENSSL_NO_SSL2 else if (proto_version == PY_SSL_VERSION_SSL2) ctx = SSL_CTX_new(SSLv2_method()); @@ -2199,8 +2203,10 @@ PyModule_AddIntConstant(m, "PROTOCOL_SSLv2", PY_SSL_VERSION_SSL2); #endif +#ifndef OPENSSL_NO_SSL3 PyModule_AddIntConstant(m, "PROTOCOL_SSLv3", PY_SSL_VERSION_SSL3); +#endif PyModule_AddIntConstant(m, "PROTOCOL_SSLv23", PY_SSL_VERSION_SSL23); PyModule_AddIntConstant(m, "PROTOCOL_TLSv1", pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.2.4/000077500000000000000000000000001517431316200262075ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.2.4/Python-3.2.4/000077500000000000000000000000001517431316200301325ustar00rootroot00000000000000002_readline63.patch000066400000000000000000000037751517431316200334250ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.2.4/Python-3.2.4diff -r -u ../Python-3.3.3.orig/Modules/readline.c ./Modules/readline.c --- ../Python-3.3.3.orig/Modules/readline.c 2013-11-17 16:23:01.000000000 +0900 +++ ./Modules/readline.c 2014-03-29 16:22:10.219305878 +0900 @@ -231,8 +231,7 @@ if (!PyArg_ParseTuple(args, buf, &function)) return NULL; if (function == Py_None) { - Py_XDECREF(*hook_var); - *hook_var = NULL; + Py_CLEAR(*hook_var); } else if (PyCallable_Check(function)) { PyObject *tmp = *hook_var; @@ -774,14 +773,22 @@ } static int +#if defined(_RL_FUNCTION_TYPEDEF) on_startup_hook(void) +#else +on_startup_hook() +#endif { return on_hook(startup_hook); } #ifdef HAVE_RL_PRE_INPUT_HOOK static int +#if defined(_RL_FUNCTION_TYPEDEF) on_pre_input_hook(void) +#else +on_pre_input_hook() +#endif { return on_hook(pre_input_hook); } @@ -819,7 +826,7 @@ (r != Py_None && PyLong_AsLong(r) == -1 && PyErr_Occurred())) { goto error; } - Py_XDECREF(r); r=NULL; + Py_CLEAR(r); if (0) { error: @@ -877,7 +884,7 @@ * before calling the normal completer */ static char ** -flex_complete(char *text, int start, int end) +flex_complete(const char *text, int start, int end) { #ifdef HAVE_RL_COMPLETION_APPEND_CHARACTER rl_completion_append_character ='\0'; @@ -936,12 +943,12 @@ rl_bind_key_in_map ('\t', rl_complete, emacs_meta_keymap); rl_bind_key_in_map ('\033', rl_complete, emacs_meta_keymap); /* Set our hook functions */ - rl_startup_hook = (Function *)on_startup_hook; + rl_startup_hook = on_startup_hook; #ifdef HAVE_RL_PRE_INPUT_HOOK - rl_pre_input_hook = (Function *)on_pre_input_hook; + rl_pre_input_hook = on_pre_input_hook; #endif /* Set our completion function */ - rl_attempted_completion_function = (CPPFunction *)flex_complete; + rl_attempted_completion_function = flex_complete; /* Set Python word break characters */ completer_word_break_characters = rl_completer_word_break_characters = 010_ssl_no_ssl3.patch000066400000000000000000000065651517431316200337310ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.2.4/Python-3.2.4diff -r -u ../Python-3.2.6.orig/Lib/ssl.py ./Lib/ssl.py --- ../Python-3.2.6.orig/Lib/ssl.py 2014-10-12 06:52:02.000000000 +0000 +++ ./Lib/ssl.py 2015-12-20 06:40:11.895384463 +0000 @@ -62,35 +62,30 @@ from _ssl import OPENSSL_VERSION_NUMBER, OPENSSL_VERSION_INFO, OPENSSL_VERSION from _ssl import _SSLContext, SSLError from _ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED -from _ssl import OP_ALL, OP_NO_SSLv2, OP_NO_SSLv3, OP_NO_TLSv1 from _ssl import RAND_status, RAND_egd, RAND_add -from _ssl import ( - SSL_ERROR_ZERO_RETURN, - SSL_ERROR_WANT_READ, - SSL_ERROR_WANT_WRITE, - SSL_ERROR_WANT_X509_LOOKUP, - SSL_ERROR_SYSCALL, - SSL_ERROR_SSL, - SSL_ERROR_WANT_CONNECT, - SSL_ERROR_EOF, - SSL_ERROR_INVALID_ERROR_CODE, - ) +try: + from _ssl import RAND_egd +except ImportError: + # LibreSSL does not provide RAND_egd + pass + +def _import_symbols(prefix): + for n in dir(_ssl): + if n.startswith(prefix): + globals()[n] = getattr(_ssl, n) + +_import_symbols('OP_') +_import_symbols('SSL_ERROR_') +_import_symbols('PROTOCOL_') + from _ssl import HAS_SNI -from _ssl import PROTOCOL_SSLv3, PROTOCOL_SSLv23, PROTOCOL_TLSv1 from _ssl import _OPENSSL_API_VERSION -_PROTOCOL_NAMES = { - PROTOCOL_TLSv1: "TLSv1", - PROTOCOL_SSLv23: "SSLv23", - PROTOCOL_SSLv3: "SSLv3", -} +_PROTOCOL_NAMES = {value: name for name, value in globals().items() if name.startswith('PROTOCOL_')} try: - from _ssl import PROTOCOL_SSLv2 _SSLv2_IF_EXISTS = PROTOCOL_SSLv2 -except ImportError: +except NameError: _SSLv2_IF_EXISTS = None -else: - _PROTOCOL_NAMES[PROTOCOL_SSLv2] = "SSLv2" from socket import getnameinfo as _getnameinfo from socket import error as socket_error @@ -557,7 +552,7 @@ d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)] return base64.decodebytes(d.encode('ASCII', 'strict')) -def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv3, ca_certs=None): +def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None): """Retrieve the certificate from the server at the specified address, and return it as a PEM-encoded string. If 'ca_certs' is specified, validate the server cert against it. diff -r -u ../Python-3.2.6.orig/Modules/_ssl.c ./Modules/_ssl.c --- ../Python-3.2.6.orig/Modules/_ssl.c 2014-10-12 06:52:03.000000000 +0000 +++ ./Modules/_ssl.c 2015-12-20 06:37:10.124337227 +0000 @@ -66,7 +66,9 @@ #ifndef OPENSSL_NO_SSL2 PY_SSL_VERSION_SSL2, #endif +#ifndef OPENSSL_NO_SSL3 PY_SSL_VERSION_SSL3=1, +#endif PY_SSL_VERSION_SSL23, PY_SSL_VERSION_TLS1 }; @@ -1512,8 +1514,10 @@ PySSL_BEGIN_ALLOW_THREADS if (proto_version == PY_SSL_VERSION_TLS1) ctx = SSL_CTX_new(TLSv1_method()); +#ifndef OPENSSL_NO_SSL3 else if (proto_version == PY_SSL_VERSION_SSL3) ctx = SSL_CTX_new(SSLv3_method()); +#endif #ifndef OPENSSL_NO_SSL2 else if (proto_version == PY_SSL_VERSION_SSL2) ctx = SSL_CTX_new(SSLv2_method()); @@ -2199,8 +2203,10 @@ PyModule_AddIntConstant(m, "PROTOCOL_SSLv2", PY_SSL_VERSION_SSL2); #endif +#ifndef OPENSSL_NO_SSL3 PyModule_AddIntConstant(m, "PROTOCOL_SSLv3", PY_SSL_VERSION_SSL3); +#endif PyModule_AddIntConstant(m, "PROTOCOL_SSLv23", PY_SSL_VERSION_SSL23); PyModule_AddIntConstant(m, "PROTOCOL_TLSv1", pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.2.5/000077500000000000000000000000001517431316200262105ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.2.5/Python-3.2.5/000077500000000000000000000000001517431316200301345ustar00rootroot00000000000000002_readline63.patch000066400000000000000000000037751517431316200334270ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.2.5/Python-3.2.5diff -r -u ../Python-3.3.3.orig/Modules/readline.c ./Modules/readline.c --- ../Python-3.3.3.orig/Modules/readline.c 2013-11-17 16:23:01.000000000 +0900 +++ ./Modules/readline.c 2014-03-29 16:22:10.219305878 +0900 @@ -231,8 +231,7 @@ if (!PyArg_ParseTuple(args, buf, &function)) return NULL; if (function == Py_None) { - Py_XDECREF(*hook_var); - *hook_var = NULL; + Py_CLEAR(*hook_var); } else if (PyCallable_Check(function)) { PyObject *tmp = *hook_var; @@ -774,14 +773,22 @@ } static int +#if defined(_RL_FUNCTION_TYPEDEF) on_startup_hook(void) +#else +on_startup_hook() +#endif { return on_hook(startup_hook); } #ifdef HAVE_RL_PRE_INPUT_HOOK static int +#if defined(_RL_FUNCTION_TYPEDEF) on_pre_input_hook(void) +#else +on_pre_input_hook() +#endif { return on_hook(pre_input_hook); } @@ -819,7 +826,7 @@ (r != Py_None && PyLong_AsLong(r) == -1 && PyErr_Occurred())) { goto error; } - Py_XDECREF(r); r=NULL; + Py_CLEAR(r); if (0) { error: @@ -877,7 +884,7 @@ * before calling the normal completer */ static char ** -flex_complete(char *text, int start, int end) +flex_complete(const char *text, int start, int end) { #ifdef HAVE_RL_COMPLETION_APPEND_CHARACTER rl_completion_append_character ='\0'; @@ -936,12 +943,12 @@ rl_bind_key_in_map ('\t', rl_complete, emacs_meta_keymap); rl_bind_key_in_map ('\033', rl_complete, emacs_meta_keymap); /* Set our hook functions */ - rl_startup_hook = (Function *)on_startup_hook; + rl_startup_hook = on_startup_hook; #ifdef HAVE_RL_PRE_INPUT_HOOK - rl_pre_input_hook = (Function *)on_pre_input_hook; + rl_pre_input_hook = on_pre_input_hook; #endif /* Set our completion function */ - rl_attempted_completion_function = (CPPFunction *)flex_complete; + rl_attempted_completion_function = flex_complete; /* Set Python word break characters */ completer_word_break_characters = rl_completer_word_break_characters = 010_ssl_no_ssl3.patch000066400000000000000000000065651517431316200337330ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.2.5/Python-3.2.5diff -r -u ../Python-3.2.6.orig/Lib/ssl.py ./Lib/ssl.py --- ../Python-3.2.6.orig/Lib/ssl.py 2014-10-12 06:52:02.000000000 +0000 +++ ./Lib/ssl.py 2015-12-20 06:40:11.895384463 +0000 @@ -62,35 +62,30 @@ from _ssl import OPENSSL_VERSION_NUMBER, OPENSSL_VERSION_INFO, OPENSSL_VERSION from _ssl import _SSLContext, SSLError from _ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED -from _ssl import OP_ALL, OP_NO_SSLv2, OP_NO_SSLv3, OP_NO_TLSv1 from _ssl import RAND_status, RAND_egd, RAND_add -from _ssl import ( - SSL_ERROR_ZERO_RETURN, - SSL_ERROR_WANT_READ, - SSL_ERROR_WANT_WRITE, - SSL_ERROR_WANT_X509_LOOKUP, - SSL_ERROR_SYSCALL, - SSL_ERROR_SSL, - SSL_ERROR_WANT_CONNECT, - SSL_ERROR_EOF, - SSL_ERROR_INVALID_ERROR_CODE, - ) +try: + from _ssl import RAND_egd +except ImportError: + # LibreSSL does not provide RAND_egd + pass + +def _import_symbols(prefix): + for n in dir(_ssl): + if n.startswith(prefix): + globals()[n] = getattr(_ssl, n) + +_import_symbols('OP_') +_import_symbols('SSL_ERROR_') +_import_symbols('PROTOCOL_') + from _ssl import HAS_SNI -from _ssl import PROTOCOL_SSLv3, PROTOCOL_SSLv23, PROTOCOL_TLSv1 from _ssl import _OPENSSL_API_VERSION -_PROTOCOL_NAMES = { - PROTOCOL_TLSv1: "TLSv1", - PROTOCOL_SSLv23: "SSLv23", - PROTOCOL_SSLv3: "SSLv3", -} +_PROTOCOL_NAMES = {value: name for name, value in globals().items() if name.startswith('PROTOCOL_')} try: - from _ssl import PROTOCOL_SSLv2 _SSLv2_IF_EXISTS = PROTOCOL_SSLv2 -except ImportError: +except NameError: _SSLv2_IF_EXISTS = None -else: - _PROTOCOL_NAMES[PROTOCOL_SSLv2] = "SSLv2" from socket import getnameinfo as _getnameinfo from socket import error as socket_error @@ -557,7 +552,7 @@ d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)] return base64.decodebytes(d.encode('ASCII', 'strict')) -def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv3, ca_certs=None): +def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None): """Retrieve the certificate from the server at the specified address, and return it as a PEM-encoded string. If 'ca_certs' is specified, validate the server cert against it. diff -r -u ../Python-3.2.6.orig/Modules/_ssl.c ./Modules/_ssl.c --- ../Python-3.2.6.orig/Modules/_ssl.c 2014-10-12 06:52:03.000000000 +0000 +++ ./Modules/_ssl.c 2015-12-20 06:37:10.124337227 +0000 @@ -66,7 +66,9 @@ #ifndef OPENSSL_NO_SSL2 PY_SSL_VERSION_SSL2, #endif +#ifndef OPENSSL_NO_SSL3 PY_SSL_VERSION_SSL3=1, +#endif PY_SSL_VERSION_SSL23, PY_SSL_VERSION_TLS1 }; @@ -1512,8 +1514,10 @@ PySSL_BEGIN_ALLOW_THREADS if (proto_version == PY_SSL_VERSION_TLS1) ctx = SSL_CTX_new(TLSv1_method()); +#ifndef OPENSSL_NO_SSL3 else if (proto_version == PY_SSL_VERSION_SSL3) ctx = SSL_CTX_new(SSLv3_method()); +#endif #ifndef OPENSSL_NO_SSL2 else if (proto_version == PY_SSL_VERSION_SSL2) ctx = SSL_CTX_new(SSLv2_method()); @@ -2199,8 +2203,10 @@ PyModule_AddIntConstant(m, "PROTOCOL_SSLv2", PY_SSL_VERSION_SSL2); #endif +#ifndef OPENSSL_NO_SSL3 PyModule_AddIntConstant(m, "PROTOCOL_SSLv3", PY_SSL_VERSION_SSL3); +#endif PyModule_AddIntConstant(m, "PROTOCOL_SSLv23", PY_SSL_VERSION_SSL23); PyModule_AddIntConstant(m, "PROTOCOL_TLSv1", pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.2.6/000077500000000000000000000000001517431316200262115ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.2.6/Python-3.2.6/000077500000000000000000000000001517431316200301365ustar00rootroot00000000000000002_readline63.patch000066400000000000000000000037751517431316200334310ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.2.6/Python-3.2.6diff -r -u ../Python-3.3.3.orig/Modules/readline.c ./Modules/readline.c --- ../Python-3.3.3.orig/Modules/readline.c 2013-11-17 16:23:01.000000000 +0900 +++ ./Modules/readline.c 2014-03-29 16:22:10.219305878 +0900 @@ -231,8 +231,7 @@ if (!PyArg_ParseTuple(args, buf, &function)) return NULL; if (function == Py_None) { - Py_XDECREF(*hook_var); - *hook_var = NULL; + Py_CLEAR(*hook_var); } else if (PyCallable_Check(function)) { PyObject *tmp = *hook_var; @@ -774,14 +773,22 @@ } static int +#if defined(_RL_FUNCTION_TYPEDEF) on_startup_hook(void) +#else +on_startup_hook() +#endif { return on_hook(startup_hook); } #ifdef HAVE_RL_PRE_INPUT_HOOK static int +#if defined(_RL_FUNCTION_TYPEDEF) on_pre_input_hook(void) +#else +on_pre_input_hook() +#endif { return on_hook(pre_input_hook); } @@ -819,7 +826,7 @@ (r != Py_None && PyLong_AsLong(r) == -1 && PyErr_Occurred())) { goto error; } - Py_XDECREF(r); r=NULL; + Py_CLEAR(r); if (0) { error: @@ -877,7 +884,7 @@ * before calling the normal completer */ static char ** -flex_complete(char *text, int start, int end) +flex_complete(const char *text, int start, int end) { #ifdef HAVE_RL_COMPLETION_APPEND_CHARACTER rl_completion_append_character ='\0'; @@ -936,12 +943,12 @@ rl_bind_key_in_map ('\t', rl_complete, emacs_meta_keymap); rl_bind_key_in_map ('\033', rl_complete, emacs_meta_keymap); /* Set our hook functions */ - rl_startup_hook = (Function *)on_startup_hook; + rl_startup_hook = on_startup_hook; #ifdef HAVE_RL_PRE_INPUT_HOOK - rl_pre_input_hook = (Function *)on_pre_input_hook; + rl_pre_input_hook = on_pre_input_hook; #endif /* Set our completion function */ - rl_attempted_completion_function = (CPPFunction *)flex_complete; + rl_attempted_completion_function = flex_complete; /* Set Python word break characters */ completer_word_break_characters = rl_completer_word_break_characters = 010_ssl_no_ssl3.patch000066400000000000000000000065651517431316200337350ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.2.6/Python-3.2.6diff -r -u ../Python-3.2.6.orig/Lib/ssl.py ./Lib/ssl.py --- ../Python-3.2.6.orig/Lib/ssl.py 2014-10-12 06:52:02.000000000 +0000 +++ ./Lib/ssl.py 2015-12-20 06:40:11.895384463 +0000 @@ -62,35 +62,30 @@ from _ssl import OPENSSL_VERSION_NUMBER, OPENSSL_VERSION_INFO, OPENSSL_VERSION from _ssl import _SSLContext, SSLError from _ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED -from _ssl import OP_ALL, OP_NO_SSLv2, OP_NO_SSLv3, OP_NO_TLSv1 from _ssl import RAND_status, RAND_egd, RAND_add -from _ssl import ( - SSL_ERROR_ZERO_RETURN, - SSL_ERROR_WANT_READ, - SSL_ERROR_WANT_WRITE, - SSL_ERROR_WANT_X509_LOOKUP, - SSL_ERROR_SYSCALL, - SSL_ERROR_SSL, - SSL_ERROR_WANT_CONNECT, - SSL_ERROR_EOF, - SSL_ERROR_INVALID_ERROR_CODE, - ) +try: + from _ssl import RAND_egd +except ImportError: + # LibreSSL does not provide RAND_egd + pass + +def _import_symbols(prefix): + for n in dir(_ssl): + if n.startswith(prefix): + globals()[n] = getattr(_ssl, n) + +_import_symbols('OP_') +_import_symbols('SSL_ERROR_') +_import_symbols('PROTOCOL_') + from _ssl import HAS_SNI -from _ssl import PROTOCOL_SSLv3, PROTOCOL_SSLv23, PROTOCOL_TLSv1 from _ssl import _OPENSSL_API_VERSION -_PROTOCOL_NAMES = { - PROTOCOL_TLSv1: "TLSv1", - PROTOCOL_SSLv23: "SSLv23", - PROTOCOL_SSLv3: "SSLv3", -} +_PROTOCOL_NAMES = {value: name for name, value in globals().items() if name.startswith('PROTOCOL_')} try: - from _ssl import PROTOCOL_SSLv2 _SSLv2_IF_EXISTS = PROTOCOL_SSLv2 -except ImportError: +except NameError: _SSLv2_IF_EXISTS = None -else: - _PROTOCOL_NAMES[PROTOCOL_SSLv2] = "SSLv2" from socket import getnameinfo as _getnameinfo from socket import error as socket_error @@ -557,7 +552,7 @@ d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)] return base64.decodebytes(d.encode('ASCII', 'strict')) -def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv3, ca_certs=None): +def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None): """Retrieve the certificate from the server at the specified address, and return it as a PEM-encoded string. If 'ca_certs' is specified, validate the server cert against it. diff -r -u ../Python-3.2.6.orig/Modules/_ssl.c ./Modules/_ssl.c --- ../Python-3.2.6.orig/Modules/_ssl.c 2014-10-12 06:52:03.000000000 +0000 +++ ./Modules/_ssl.c 2015-12-20 06:37:10.124337227 +0000 @@ -66,7 +66,9 @@ #ifndef OPENSSL_NO_SSL2 PY_SSL_VERSION_SSL2, #endif +#ifndef OPENSSL_NO_SSL3 PY_SSL_VERSION_SSL3=1, +#endif PY_SSL_VERSION_SSL23, PY_SSL_VERSION_TLS1 }; @@ -1512,8 +1514,10 @@ PySSL_BEGIN_ALLOW_THREADS if (proto_version == PY_SSL_VERSION_TLS1) ctx = SSL_CTX_new(TLSv1_method()); +#ifndef OPENSSL_NO_SSL3 else if (proto_version == PY_SSL_VERSION_SSL3) ctx = SSL_CTX_new(SSLv3_method()); +#endif #ifndef OPENSSL_NO_SSL2 else if (proto_version == PY_SSL_VERSION_SSL2) ctx = SSL_CTX_new(SSLv2_method()); @@ -2199,8 +2203,10 @@ PyModule_AddIntConstant(m, "PROTOCOL_SSLv2", PY_SSL_VERSION_SSL2); #endif +#ifndef OPENSSL_NO_SSL3 PyModule_AddIntConstant(m, "PROTOCOL_SSLv3", PY_SSL_VERSION_SSL3); +#endif PyModule_AddIntConstant(m, "PROTOCOL_SSLv23", PY_SSL_VERSION_SSL23); PyModule_AddIntConstant(m, "PROTOCOL_TLSv1", pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.3.0/000077500000000000000000000000001517431316200262045ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.3.0/Python-3.3.0/000077500000000000000000000000001517431316200301245ustar00rootroot00000000000000002_readline63.patch000066400000000000000000000037751517431316200334170ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.3.0/Python-3.3.0diff -r -u ../Python-3.3.3.orig/Modules/readline.c ./Modules/readline.c --- ../Python-3.3.3.orig/Modules/readline.c 2013-11-17 16:23:01.000000000 +0900 +++ ./Modules/readline.c 2014-03-29 16:22:10.219305878 +0900 @@ -231,8 +231,7 @@ if (!PyArg_ParseTuple(args, buf, &function)) return NULL; if (function == Py_None) { - Py_XDECREF(*hook_var); - *hook_var = NULL; + Py_CLEAR(*hook_var); } else if (PyCallable_Check(function)) { PyObject *tmp = *hook_var; @@ -774,14 +773,22 @@ } static int +#if defined(_RL_FUNCTION_TYPEDEF) on_startup_hook(void) +#else +on_startup_hook() +#endif { return on_hook(startup_hook); } #ifdef HAVE_RL_PRE_INPUT_HOOK static int +#if defined(_RL_FUNCTION_TYPEDEF) on_pre_input_hook(void) +#else +on_pre_input_hook() +#endif { return on_hook(pre_input_hook); } @@ -819,7 +826,7 @@ (r != Py_None && PyLong_AsLong(r) == -1 && PyErr_Occurred())) { goto error; } - Py_XDECREF(r); r=NULL; + Py_CLEAR(r); if (0) { error: @@ -877,7 +884,7 @@ * before calling the normal completer */ static char ** -flex_complete(char *text, int start, int end) +flex_complete(const char *text, int start, int end) { #ifdef HAVE_RL_COMPLETION_APPEND_CHARACTER rl_completion_append_character ='\0'; @@ -936,12 +943,12 @@ rl_bind_key_in_map ('\t', rl_complete, emacs_meta_keymap); rl_bind_key_in_map ('\033', rl_complete, emacs_meta_keymap); /* Set our hook functions */ - rl_startup_hook = (Function *)on_startup_hook; + rl_startup_hook = on_startup_hook; #ifdef HAVE_RL_PRE_INPUT_HOOK - rl_pre_input_hook = (Function *)on_pre_input_hook; + rl_pre_input_hook = on_pre_input_hook; #endif /* Set our completion function */ - rl_attempted_completion_function = (CPPFunction *)flex_complete; + rl_attempted_completion_function = flex_complete; /* Set Python word break characters */ completer_word_break_characters = rl_completer_word_break_characters = 010_ssl_no_ssl3.patch000066400000000000000000000066571517431316200337250ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.3.0/Python-3.3.0diff -r -u ../Python-3.3.6.orig/Lib/ssl.py ./Lib/ssl.py --- ../Python-3.3.6.orig/Lib/ssl.py 2014-10-12 07:03:53.000000000 +0000 +++ ./Lib/ssl.py 2015-12-20 06:43:59.175134734 +0000 @@ -66,47 +66,32 @@ SSLSyscallError, SSLEOFError, ) from _ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED -from _ssl import ( - OP_ALL, OP_NO_SSLv2, OP_NO_SSLv3, OP_NO_TLSv1, - OP_CIPHER_SERVER_PREFERENCE, OP_SINGLE_DH_USE - ) -try: - from _ssl import OP_NO_COMPRESSION -except ImportError: - pass +from _ssl import RAND_status, RAND_add, RAND_bytes, RAND_pseudo_bytes try: - from _ssl import OP_SINGLE_ECDH_USE + from _ssl import RAND_egd except ImportError: + # LibreSSL does not provide RAND_egd pass -from _ssl import RAND_status, RAND_egd, RAND_add, RAND_bytes, RAND_pseudo_bytes -from _ssl import ( - SSL_ERROR_ZERO_RETURN, - SSL_ERROR_WANT_READ, - SSL_ERROR_WANT_WRITE, - SSL_ERROR_WANT_X509_LOOKUP, - SSL_ERROR_SYSCALL, - SSL_ERROR_SSL, - SSL_ERROR_WANT_CONNECT, - SSL_ERROR_EOF, - SSL_ERROR_INVALID_ERROR_CODE, - ) + +def _import_symbols(prefix): + for n in dir(_ssl): + if n.startswith(prefix): + globals()[n] = getattr(_ssl, n) + +_import_symbols('OP_') +_import_symbols('SSL_ERROR_') +_import_symbols('PROTOCOL_') + from _ssl import HAS_SNI, HAS_ECDH, HAS_NPN -from _ssl import (PROTOCOL_SSLv3, PROTOCOL_SSLv23, - PROTOCOL_TLSv1) + from _ssl import _OPENSSL_API_VERSION -_PROTOCOL_NAMES = { - PROTOCOL_TLSv1: "TLSv1", - PROTOCOL_SSLv23: "SSLv23", - PROTOCOL_SSLv3: "SSLv3", -} +_PROTOCOL_NAMES = {value: name for name, value in globals().items() if name.startswith('PROTOCOL_')} + try: - from _ssl import PROTOCOL_SSLv2 _SSLv2_IF_EXISTS = PROTOCOL_SSLv2 -except ImportError: +except NameError: _SSLv2_IF_EXISTS = None -else: - _PROTOCOL_NAMES[PROTOCOL_SSLv2] = "SSLv2" from socket import getnameinfo as _getnameinfo from socket import error as socket_error @@ -664,7 +649,7 @@ d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)] return base64.decodebytes(d.encode('ASCII', 'strict')) -def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv3, ca_certs=None): +def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None): """Retrieve the certificate from the server at the specified address, and return it as a PEM-encoded string. If 'ca_certs' is specified, validate the server cert against it. diff -r -u ../Python-3.3.6.orig/Modules/_ssl.c ./Modules/_ssl.c --- ../Python-3.3.6.orig/Modules/_ssl.c 2014-10-12 07:03:53.000000000 +0000 +++ ./Modules/_ssl.c 2015-12-20 06:42:45.773667904 +0000 @@ -1746,8 +1746,10 @@ PySSL_BEGIN_ALLOW_THREADS if (proto_version == PY_SSL_VERSION_TLS1) ctx = SSL_CTX_new(TLSv1_method()); +#ifndef OPENSSL_NO_SSL3 else if (proto_version == PY_SSL_VERSION_SSL3) ctx = SSL_CTX_new(SSLv3_method()); +#endif #ifndef OPENSSL_NO_SSL2 else if (proto_version == PY_SSL_VERSION_SSL2) ctx = SSL_CTX_new(SSLv2_method()); @@ -2842,8 +2844,10 @@ PyModule_AddIntConstant(m, "PROTOCOL_SSLv2", PY_SSL_VERSION_SSL2); #endif +#ifndef OPENSSL_NO_SSL3 PyModule_AddIntConstant(m, "PROTOCOL_SSLv3", PY_SSL_VERSION_SSL3); +#endif PyModule_AddIntConstant(m, "PROTOCOL_SSLv23", PY_SSL_VERSION_SSL23); PyModule_AddIntConstant(m, "PROTOCOL_TLSv1", pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.3.1/000077500000000000000000000000001517431316200262055ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.3.1/Python-3.3.1/000077500000000000000000000000001517431316200301265ustar00rootroot00000000000000002_readline63.patch000066400000000000000000000037751517431316200334210ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.3.1/Python-3.3.1diff -r -u ../Python-3.3.3.orig/Modules/readline.c ./Modules/readline.c --- ../Python-3.3.3.orig/Modules/readline.c 2013-11-17 16:23:01.000000000 +0900 +++ ./Modules/readline.c 2014-03-29 16:22:10.219305878 +0900 @@ -231,8 +231,7 @@ if (!PyArg_ParseTuple(args, buf, &function)) return NULL; if (function == Py_None) { - Py_XDECREF(*hook_var); - *hook_var = NULL; + Py_CLEAR(*hook_var); } else if (PyCallable_Check(function)) { PyObject *tmp = *hook_var; @@ -774,14 +773,22 @@ } static int +#if defined(_RL_FUNCTION_TYPEDEF) on_startup_hook(void) +#else +on_startup_hook() +#endif { return on_hook(startup_hook); } #ifdef HAVE_RL_PRE_INPUT_HOOK static int +#if defined(_RL_FUNCTION_TYPEDEF) on_pre_input_hook(void) +#else +on_pre_input_hook() +#endif { return on_hook(pre_input_hook); } @@ -819,7 +826,7 @@ (r != Py_None && PyLong_AsLong(r) == -1 && PyErr_Occurred())) { goto error; } - Py_XDECREF(r); r=NULL; + Py_CLEAR(r); if (0) { error: @@ -877,7 +884,7 @@ * before calling the normal completer */ static char ** -flex_complete(char *text, int start, int end) +flex_complete(const char *text, int start, int end) { #ifdef HAVE_RL_COMPLETION_APPEND_CHARACTER rl_completion_append_character ='\0'; @@ -936,12 +943,12 @@ rl_bind_key_in_map ('\t', rl_complete, emacs_meta_keymap); rl_bind_key_in_map ('\033', rl_complete, emacs_meta_keymap); /* Set our hook functions */ - rl_startup_hook = (Function *)on_startup_hook; + rl_startup_hook = on_startup_hook; #ifdef HAVE_RL_PRE_INPUT_HOOK - rl_pre_input_hook = (Function *)on_pre_input_hook; + rl_pre_input_hook = on_pre_input_hook; #endif /* Set our completion function */ - rl_attempted_completion_function = (CPPFunction *)flex_complete; + rl_attempted_completion_function = flex_complete; /* Set Python word break characters */ completer_word_break_characters = rl_completer_word_break_characters = 010_ssl_no_ssl3.patch000066400000000000000000000066571517431316200337270ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.3.1/Python-3.3.1diff -r -u ../Python-3.3.6.orig/Lib/ssl.py ./Lib/ssl.py --- ../Python-3.3.6.orig/Lib/ssl.py 2014-10-12 07:03:53.000000000 +0000 +++ ./Lib/ssl.py 2015-12-20 06:43:59.175134734 +0000 @@ -66,47 +66,32 @@ SSLSyscallError, SSLEOFError, ) from _ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED -from _ssl import ( - OP_ALL, OP_NO_SSLv2, OP_NO_SSLv3, OP_NO_TLSv1, - OP_CIPHER_SERVER_PREFERENCE, OP_SINGLE_DH_USE - ) -try: - from _ssl import OP_NO_COMPRESSION -except ImportError: - pass +from _ssl import RAND_status, RAND_add, RAND_bytes, RAND_pseudo_bytes try: - from _ssl import OP_SINGLE_ECDH_USE + from _ssl import RAND_egd except ImportError: + # LibreSSL does not provide RAND_egd pass -from _ssl import RAND_status, RAND_egd, RAND_add, RAND_bytes, RAND_pseudo_bytes -from _ssl import ( - SSL_ERROR_ZERO_RETURN, - SSL_ERROR_WANT_READ, - SSL_ERROR_WANT_WRITE, - SSL_ERROR_WANT_X509_LOOKUP, - SSL_ERROR_SYSCALL, - SSL_ERROR_SSL, - SSL_ERROR_WANT_CONNECT, - SSL_ERROR_EOF, - SSL_ERROR_INVALID_ERROR_CODE, - ) + +def _import_symbols(prefix): + for n in dir(_ssl): + if n.startswith(prefix): + globals()[n] = getattr(_ssl, n) + +_import_symbols('OP_') +_import_symbols('SSL_ERROR_') +_import_symbols('PROTOCOL_') + from _ssl import HAS_SNI, HAS_ECDH, HAS_NPN -from _ssl import (PROTOCOL_SSLv3, PROTOCOL_SSLv23, - PROTOCOL_TLSv1) + from _ssl import _OPENSSL_API_VERSION -_PROTOCOL_NAMES = { - PROTOCOL_TLSv1: "TLSv1", - PROTOCOL_SSLv23: "SSLv23", - PROTOCOL_SSLv3: "SSLv3", -} +_PROTOCOL_NAMES = {value: name for name, value in globals().items() if name.startswith('PROTOCOL_')} + try: - from _ssl import PROTOCOL_SSLv2 _SSLv2_IF_EXISTS = PROTOCOL_SSLv2 -except ImportError: +except NameError: _SSLv2_IF_EXISTS = None -else: - _PROTOCOL_NAMES[PROTOCOL_SSLv2] = "SSLv2" from socket import getnameinfo as _getnameinfo from socket import error as socket_error @@ -664,7 +649,7 @@ d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)] return base64.decodebytes(d.encode('ASCII', 'strict')) -def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv3, ca_certs=None): +def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None): """Retrieve the certificate from the server at the specified address, and return it as a PEM-encoded string. If 'ca_certs' is specified, validate the server cert against it. diff -r -u ../Python-3.3.6.orig/Modules/_ssl.c ./Modules/_ssl.c --- ../Python-3.3.6.orig/Modules/_ssl.c 2014-10-12 07:03:53.000000000 +0000 +++ ./Modules/_ssl.c 2015-12-20 06:42:45.773667904 +0000 @@ -1746,8 +1746,10 @@ PySSL_BEGIN_ALLOW_THREADS if (proto_version == PY_SSL_VERSION_TLS1) ctx = SSL_CTX_new(TLSv1_method()); +#ifndef OPENSSL_NO_SSL3 else if (proto_version == PY_SSL_VERSION_SSL3) ctx = SSL_CTX_new(SSLv3_method()); +#endif #ifndef OPENSSL_NO_SSL2 else if (proto_version == PY_SSL_VERSION_SSL2) ctx = SSL_CTX_new(SSLv2_method()); @@ -2842,8 +2844,10 @@ PyModule_AddIntConstant(m, "PROTOCOL_SSLv2", PY_SSL_VERSION_SSL2); #endif +#ifndef OPENSSL_NO_SSL3 PyModule_AddIntConstant(m, "PROTOCOL_SSLv3", PY_SSL_VERSION_SSL3); +#endif PyModule_AddIntConstant(m, "PROTOCOL_SSLv23", PY_SSL_VERSION_SSL23); PyModule_AddIntConstant(m, "PROTOCOL_TLSv1", pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.3.2/000077500000000000000000000000001517431316200262065ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.3.2/Python-3.3.2/000077500000000000000000000000001517431316200301305ustar00rootroot00000000000000002_readline63.patch000066400000000000000000000037751517431316200334230ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.3.2/Python-3.3.2diff -r -u ../Python-3.3.3.orig/Modules/readline.c ./Modules/readline.c --- ../Python-3.3.3.orig/Modules/readline.c 2013-11-17 16:23:01.000000000 +0900 +++ ./Modules/readline.c 2014-03-29 16:22:10.219305878 +0900 @@ -231,8 +231,7 @@ if (!PyArg_ParseTuple(args, buf, &function)) return NULL; if (function == Py_None) { - Py_XDECREF(*hook_var); - *hook_var = NULL; + Py_CLEAR(*hook_var); } else if (PyCallable_Check(function)) { PyObject *tmp = *hook_var; @@ -774,14 +773,22 @@ } static int +#if defined(_RL_FUNCTION_TYPEDEF) on_startup_hook(void) +#else +on_startup_hook() +#endif { return on_hook(startup_hook); } #ifdef HAVE_RL_PRE_INPUT_HOOK static int +#if defined(_RL_FUNCTION_TYPEDEF) on_pre_input_hook(void) +#else +on_pre_input_hook() +#endif { return on_hook(pre_input_hook); } @@ -819,7 +826,7 @@ (r != Py_None && PyLong_AsLong(r) == -1 && PyErr_Occurred())) { goto error; } - Py_XDECREF(r); r=NULL; + Py_CLEAR(r); if (0) { error: @@ -877,7 +884,7 @@ * before calling the normal completer */ static char ** -flex_complete(char *text, int start, int end) +flex_complete(const char *text, int start, int end) { #ifdef HAVE_RL_COMPLETION_APPEND_CHARACTER rl_completion_append_character ='\0'; @@ -936,12 +943,12 @@ rl_bind_key_in_map ('\t', rl_complete, emacs_meta_keymap); rl_bind_key_in_map ('\033', rl_complete, emacs_meta_keymap); /* Set our hook functions */ - rl_startup_hook = (Function *)on_startup_hook; + rl_startup_hook = on_startup_hook; #ifdef HAVE_RL_PRE_INPUT_HOOK - rl_pre_input_hook = (Function *)on_pre_input_hook; + rl_pre_input_hook = on_pre_input_hook; #endif /* Set our completion function */ - rl_attempted_completion_function = (CPPFunction *)flex_complete; + rl_attempted_completion_function = flex_complete; /* Set Python word break characters */ completer_word_break_characters = rl_completer_word_break_characters = 010_ssl_no_ssl3.patch000066400000000000000000000066571517431316200337310ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.3.2/Python-3.3.2diff -r -u ../Python-3.3.6.orig/Lib/ssl.py ./Lib/ssl.py --- ../Python-3.3.6.orig/Lib/ssl.py 2014-10-12 07:03:53.000000000 +0000 +++ ./Lib/ssl.py 2015-12-20 06:43:59.175134734 +0000 @@ -66,47 +66,32 @@ SSLSyscallError, SSLEOFError, ) from _ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED -from _ssl import ( - OP_ALL, OP_NO_SSLv2, OP_NO_SSLv3, OP_NO_TLSv1, - OP_CIPHER_SERVER_PREFERENCE, OP_SINGLE_DH_USE - ) -try: - from _ssl import OP_NO_COMPRESSION -except ImportError: - pass +from _ssl import RAND_status, RAND_add, RAND_bytes, RAND_pseudo_bytes try: - from _ssl import OP_SINGLE_ECDH_USE + from _ssl import RAND_egd except ImportError: + # LibreSSL does not provide RAND_egd pass -from _ssl import RAND_status, RAND_egd, RAND_add, RAND_bytes, RAND_pseudo_bytes -from _ssl import ( - SSL_ERROR_ZERO_RETURN, - SSL_ERROR_WANT_READ, - SSL_ERROR_WANT_WRITE, - SSL_ERROR_WANT_X509_LOOKUP, - SSL_ERROR_SYSCALL, - SSL_ERROR_SSL, - SSL_ERROR_WANT_CONNECT, - SSL_ERROR_EOF, - SSL_ERROR_INVALID_ERROR_CODE, - ) + +def _import_symbols(prefix): + for n in dir(_ssl): + if n.startswith(prefix): + globals()[n] = getattr(_ssl, n) + +_import_symbols('OP_') +_import_symbols('SSL_ERROR_') +_import_symbols('PROTOCOL_') + from _ssl import HAS_SNI, HAS_ECDH, HAS_NPN -from _ssl import (PROTOCOL_SSLv3, PROTOCOL_SSLv23, - PROTOCOL_TLSv1) + from _ssl import _OPENSSL_API_VERSION -_PROTOCOL_NAMES = { - PROTOCOL_TLSv1: "TLSv1", - PROTOCOL_SSLv23: "SSLv23", - PROTOCOL_SSLv3: "SSLv3", -} +_PROTOCOL_NAMES = {value: name for name, value in globals().items() if name.startswith('PROTOCOL_')} + try: - from _ssl import PROTOCOL_SSLv2 _SSLv2_IF_EXISTS = PROTOCOL_SSLv2 -except ImportError: +except NameError: _SSLv2_IF_EXISTS = None -else: - _PROTOCOL_NAMES[PROTOCOL_SSLv2] = "SSLv2" from socket import getnameinfo as _getnameinfo from socket import error as socket_error @@ -664,7 +649,7 @@ d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)] return base64.decodebytes(d.encode('ASCII', 'strict')) -def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv3, ca_certs=None): +def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None): """Retrieve the certificate from the server at the specified address, and return it as a PEM-encoded string. If 'ca_certs' is specified, validate the server cert against it. diff -r -u ../Python-3.3.6.orig/Modules/_ssl.c ./Modules/_ssl.c --- ../Python-3.3.6.orig/Modules/_ssl.c 2014-10-12 07:03:53.000000000 +0000 +++ ./Modules/_ssl.c 2015-12-20 06:42:45.773667904 +0000 @@ -1746,8 +1746,10 @@ PySSL_BEGIN_ALLOW_THREADS if (proto_version == PY_SSL_VERSION_TLS1) ctx = SSL_CTX_new(TLSv1_method()); +#ifndef OPENSSL_NO_SSL3 else if (proto_version == PY_SSL_VERSION_SSL3) ctx = SSL_CTX_new(SSLv3_method()); +#endif #ifndef OPENSSL_NO_SSL2 else if (proto_version == PY_SSL_VERSION_SSL2) ctx = SSL_CTX_new(SSLv2_method()); @@ -2842,8 +2844,10 @@ PyModule_AddIntConstant(m, "PROTOCOL_SSLv2", PY_SSL_VERSION_SSL2); #endif +#ifndef OPENSSL_NO_SSL3 PyModule_AddIntConstant(m, "PROTOCOL_SSLv3", PY_SSL_VERSION_SSL3); +#endif PyModule_AddIntConstant(m, "PROTOCOL_SSLv23", PY_SSL_VERSION_SSL23); PyModule_AddIntConstant(m, "PROTOCOL_TLSv1", pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.3.3/000077500000000000000000000000001517431316200262075ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.3.3/Python-3.3.3/000077500000000000000000000000001517431316200301325ustar00rootroot00000000000000002_readline63.patch000066400000000000000000000037751517431316200334250ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.3.3/Python-3.3.3diff -r -u ../Python-3.3.3.orig/Modules/readline.c ./Modules/readline.c --- ../Python-3.3.3.orig/Modules/readline.c 2013-11-17 16:23:01.000000000 +0900 +++ ./Modules/readline.c 2014-03-29 16:22:10.219305878 +0900 @@ -231,8 +231,7 @@ if (!PyArg_ParseTuple(args, buf, &function)) return NULL; if (function == Py_None) { - Py_XDECREF(*hook_var); - *hook_var = NULL; + Py_CLEAR(*hook_var); } else if (PyCallable_Check(function)) { PyObject *tmp = *hook_var; @@ -774,14 +773,22 @@ } static int +#if defined(_RL_FUNCTION_TYPEDEF) on_startup_hook(void) +#else +on_startup_hook() +#endif { return on_hook(startup_hook); } #ifdef HAVE_RL_PRE_INPUT_HOOK static int +#if defined(_RL_FUNCTION_TYPEDEF) on_pre_input_hook(void) +#else +on_pre_input_hook() +#endif { return on_hook(pre_input_hook); } @@ -819,7 +826,7 @@ (r != Py_None && PyLong_AsLong(r) == -1 && PyErr_Occurred())) { goto error; } - Py_XDECREF(r); r=NULL; + Py_CLEAR(r); if (0) { error: @@ -877,7 +884,7 @@ * before calling the normal completer */ static char ** -flex_complete(char *text, int start, int end) +flex_complete(const char *text, int start, int end) { #ifdef HAVE_RL_COMPLETION_APPEND_CHARACTER rl_completion_append_character ='\0'; @@ -936,12 +943,12 @@ rl_bind_key_in_map ('\t', rl_complete, emacs_meta_keymap); rl_bind_key_in_map ('\033', rl_complete, emacs_meta_keymap); /* Set our hook functions */ - rl_startup_hook = (Function *)on_startup_hook; + rl_startup_hook = on_startup_hook; #ifdef HAVE_RL_PRE_INPUT_HOOK - rl_pre_input_hook = (Function *)on_pre_input_hook; + rl_pre_input_hook = on_pre_input_hook; #endif /* Set our completion function */ - rl_attempted_completion_function = (CPPFunction *)flex_complete; + rl_attempted_completion_function = flex_complete; /* Set Python word break characters */ completer_word_break_characters = rl_completer_word_break_characters = 010_ssl_no_ssl3.patch000066400000000000000000000066571517431316200337330ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.3.3/Python-3.3.3diff -r -u ../Python-3.3.6.orig/Lib/ssl.py ./Lib/ssl.py --- ../Python-3.3.6.orig/Lib/ssl.py 2014-10-12 07:03:53.000000000 +0000 +++ ./Lib/ssl.py 2015-12-20 06:43:59.175134734 +0000 @@ -66,47 +66,32 @@ SSLSyscallError, SSLEOFError, ) from _ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED -from _ssl import ( - OP_ALL, OP_NO_SSLv2, OP_NO_SSLv3, OP_NO_TLSv1, - OP_CIPHER_SERVER_PREFERENCE, OP_SINGLE_DH_USE - ) -try: - from _ssl import OP_NO_COMPRESSION -except ImportError: - pass +from _ssl import RAND_status, RAND_add, RAND_bytes, RAND_pseudo_bytes try: - from _ssl import OP_SINGLE_ECDH_USE + from _ssl import RAND_egd except ImportError: + # LibreSSL does not provide RAND_egd pass -from _ssl import RAND_status, RAND_egd, RAND_add, RAND_bytes, RAND_pseudo_bytes -from _ssl import ( - SSL_ERROR_ZERO_RETURN, - SSL_ERROR_WANT_READ, - SSL_ERROR_WANT_WRITE, - SSL_ERROR_WANT_X509_LOOKUP, - SSL_ERROR_SYSCALL, - SSL_ERROR_SSL, - SSL_ERROR_WANT_CONNECT, - SSL_ERROR_EOF, - SSL_ERROR_INVALID_ERROR_CODE, - ) + +def _import_symbols(prefix): + for n in dir(_ssl): + if n.startswith(prefix): + globals()[n] = getattr(_ssl, n) + +_import_symbols('OP_') +_import_symbols('SSL_ERROR_') +_import_symbols('PROTOCOL_') + from _ssl import HAS_SNI, HAS_ECDH, HAS_NPN -from _ssl import (PROTOCOL_SSLv3, PROTOCOL_SSLv23, - PROTOCOL_TLSv1) + from _ssl import _OPENSSL_API_VERSION -_PROTOCOL_NAMES = { - PROTOCOL_TLSv1: "TLSv1", - PROTOCOL_SSLv23: "SSLv23", - PROTOCOL_SSLv3: "SSLv3", -} +_PROTOCOL_NAMES = {value: name for name, value in globals().items() if name.startswith('PROTOCOL_')} + try: - from _ssl import PROTOCOL_SSLv2 _SSLv2_IF_EXISTS = PROTOCOL_SSLv2 -except ImportError: +except NameError: _SSLv2_IF_EXISTS = None -else: - _PROTOCOL_NAMES[PROTOCOL_SSLv2] = "SSLv2" from socket import getnameinfo as _getnameinfo from socket import error as socket_error @@ -664,7 +649,7 @@ d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)] return base64.decodebytes(d.encode('ASCII', 'strict')) -def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv3, ca_certs=None): +def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None): """Retrieve the certificate from the server at the specified address, and return it as a PEM-encoded string. If 'ca_certs' is specified, validate the server cert against it. diff -r -u ../Python-3.3.6.orig/Modules/_ssl.c ./Modules/_ssl.c --- ../Python-3.3.6.orig/Modules/_ssl.c 2014-10-12 07:03:53.000000000 +0000 +++ ./Modules/_ssl.c 2015-12-20 06:42:45.773667904 +0000 @@ -1746,8 +1746,10 @@ PySSL_BEGIN_ALLOW_THREADS if (proto_version == PY_SSL_VERSION_TLS1) ctx = SSL_CTX_new(TLSv1_method()); +#ifndef OPENSSL_NO_SSL3 else if (proto_version == PY_SSL_VERSION_SSL3) ctx = SSL_CTX_new(SSLv3_method()); +#endif #ifndef OPENSSL_NO_SSL2 else if (proto_version == PY_SSL_VERSION_SSL2) ctx = SSL_CTX_new(SSLv2_method()); @@ -2842,8 +2844,10 @@ PyModule_AddIntConstant(m, "PROTOCOL_SSLv2", PY_SSL_VERSION_SSL2); #endif +#ifndef OPENSSL_NO_SSL3 PyModule_AddIntConstant(m, "PROTOCOL_SSLv3", PY_SSL_VERSION_SSL3); +#endif PyModule_AddIntConstant(m, "PROTOCOL_SSLv23", PY_SSL_VERSION_SSL23); PyModule_AddIntConstant(m, "PROTOCOL_TLSv1", pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.3.4/000077500000000000000000000000001517431316200262105ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.3.4/Python-3.3.4/000077500000000000000000000000001517431316200301345ustar00rootroot00000000000000010_ssl_no_ssl3.patch000066400000000000000000000066571517431316200337350ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.3.4/Python-3.3.4diff -r -u ../Python-3.3.6.orig/Lib/ssl.py ./Lib/ssl.py --- ../Python-3.3.6.orig/Lib/ssl.py 2014-10-12 07:03:53.000000000 +0000 +++ ./Lib/ssl.py 2015-12-20 06:43:59.175134734 +0000 @@ -66,47 +66,32 @@ SSLSyscallError, SSLEOFError, ) from _ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED -from _ssl import ( - OP_ALL, OP_NO_SSLv2, OP_NO_SSLv3, OP_NO_TLSv1, - OP_CIPHER_SERVER_PREFERENCE, OP_SINGLE_DH_USE - ) -try: - from _ssl import OP_NO_COMPRESSION -except ImportError: - pass +from _ssl import RAND_status, RAND_add, RAND_bytes, RAND_pseudo_bytes try: - from _ssl import OP_SINGLE_ECDH_USE + from _ssl import RAND_egd except ImportError: + # LibreSSL does not provide RAND_egd pass -from _ssl import RAND_status, RAND_egd, RAND_add, RAND_bytes, RAND_pseudo_bytes -from _ssl import ( - SSL_ERROR_ZERO_RETURN, - SSL_ERROR_WANT_READ, - SSL_ERROR_WANT_WRITE, - SSL_ERROR_WANT_X509_LOOKUP, - SSL_ERROR_SYSCALL, - SSL_ERROR_SSL, - SSL_ERROR_WANT_CONNECT, - SSL_ERROR_EOF, - SSL_ERROR_INVALID_ERROR_CODE, - ) + +def _import_symbols(prefix): + for n in dir(_ssl): + if n.startswith(prefix): + globals()[n] = getattr(_ssl, n) + +_import_symbols('OP_') +_import_symbols('SSL_ERROR_') +_import_symbols('PROTOCOL_') + from _ssl import HAS_SNI, HAS_ECDH, HAS_NPN -from _ssl import (PROTOCOL_SSLv3, PROTOCOL_SSLv23, - PROTOCOL_TLSv1) + from _ssl import _OPENSSL_API_VERSION -_PROTOCOL_NAMES = { - PROTOCOL_TLSv1: "TLSv1", - PROTOCOL_SSLv23: "SSLv23", - PROTOCOL_SSLv3: "SSLv3", -} +_PROTOCOL_NAMES = {value: name for name, value in globals().items() if name.startswith('PROTOCOL_')} + try: - from _ssl import PROTOCOL_SSLv2 _SSLv2_IF_EXISTS = PROTOCOL_SSLv2 -except ImportError: +except NameError: _SSLv2_IF_EXISTS = None -else: - _PROTOCOL_NAMES[PROTOCOL_SSLv2] = "SSLv2" from socket import getnameinfo as _getnameinfo from socket import error as socket_error @@ -664,7 +649,7 @@ d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)] return base64.decodebytes(d.encode('ASCII', 'strict')) -def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv3, ca_certs=None): +def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None): """Retrieve the certificate from the server at the specified address, and return it as a PEM-encoded string. If 'ca_certs' is specified, validate the server cert against it. diff -r -u ../Python-3.3.6.orig/Modules/_ssl.c ./Modules/_ssl.c --- ../Python-3.3.6.orig/Modules/_ssl.c 2014-10-12 07:03:53.000000000 +0000 +++ ./Modules/_ssl.c 2015-12-20 06:42:45.773667904 +0000 @@ -1746,8 +1746,10 @@ PySSL_BEGIN_ALLOW_THREADS if (proto_version == PY_SSL_VERSION_TLS1) ctx = SSL_CTX_new(TLSv1_method()); +#ifndef OPENSSL_NO_SSL3 else if (proto_version == PY_SSL_VERSION_SSL3) ctx = SSL_CTX_new(SSLv3_method()); +#endif #ifndef OPENSSL_NO_SSL2 else if (proto_version == PY_SSL_VERSION_SSL2) ctx = SSL_CTX_new(SSLv2_method()); @@ -2842,8 +2844,10 @@ PyModule_AddIntConstant(m, "PROTOCOL_SSLv2", PY_SSL_VERSION_SSL2); #endif +#ifndef OPENSSL_NO_SSL3 PyModule_AddIntConstant(m, "PROTOCOL_SSLv3", PY_SSL_VERSION_SSL3); +#endif PyModule_AddIntConstant(m, "PROTOCOL_SSLv23", PY_SSL_VERSION_SSL23); PyModule_AddIntConstant(m, "PROTOCOL_TLSv1", pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.3.5/000077500000000000000000000000001517431316200262115ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.3.5/Python-3.3.5/000077500000000000000000000000001517431316200301365ustar00rootroot00000000000000010_ssl_no_ssl3.patch000066400000000000000000000066571517431316200337370ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.3.5/Python-3.3.5diff -r -u ../Python-3.3.6.orig/Lib/ssl.py ./Lib/ssl.py --- ../Python-3.3.6.orig/Lib/ssl.py 2014-10-12 07:03:53.000000000 +0000 +++ ./Lib/ssl.py 2015-12-20 06:43:59.175134734 +0000 @@ -66,47 +66,32 @@ SSLSyscallError, SSLEOFError, ) from _ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED -from _ssl import ( - OP_ALL, OP_NO_SSLv2, OP_NO_SSLv3, OP_NO_TLSv1, - OP_CIPHER_SERVER_PREFERENCE, OP_SINGLE_DH_USE - ) -try: - from _ssl import OP_NO_COMPRESSION -except ImportError: - pass +from _ssl import RAND_status, RAND_add, RAND_bytes, RAND_pseudo_bytes try: - from _ssl import OP_SINGLE_ECDH_USE + from _ssl import RAND_egd except ImportError: + # LibreSSL does not provide RAND_egd pass -from _ssl import RAND_status, RAND_egd, RAND_add, RAND_bytes, RAND_pseudo_bytes -from _ssl import ( - SSL_ERROR_ZERO_RETURN, - SSL_ERROR_WANT_READ, - SSL_ERROR_WANT_WRITE, - SSL_ERROR_WANT_X509_LOOKUP, - SSL_ERROR_SYSCALL, - SSL_ERROR_SSL, - SSL_ERROR_WANT_CONNECT, - SSL_ERROR_EOF, - SSL_ERROR_INVALID_ERROR_CODE, - ) + +def _import_symbols(prefix): + for n in dir(_ssl): + if n.startswith(prefix): + globals()[n] = getattr(_ssl, n) + +_import_symbols('OP_') +_import_symbols('SSL_ERROR_') +_import_symbols('PROTOCOL_') + from _ssl import HAS_SNI, HAS_ECDH, HAS_NPN -from _ssl import (PROTOCOL_SSLv3, PROTOCOL_SSLv23, - PROTOCOL_TLSv1) + from _ssl import _OPENSSL_API_VERSION -_PROTOCOL_NAMES = { - PROTOCOL_TLSv1: "TLSv1", - PROTOCOL_SSLv23: "SSLv23", - PROTOCOL_SSLv3: "SSLv3", -} +_PROTOCOL_NAMES = {value: name for name, value in globals().items() if name.startswith('PROTOCOL_')} + try: - from _ssl import PROTOCOL_SSLv2 _SSLv2_IF_EXISTS = PROTOCOL_SSLv2 -except ImportError: +except NameError: _SSLv2_IF_EXISTS = None -else: - _PROTOCOL_NAMES[PROTOCOL_SSLv2] = "SSLv2" from socket import getnameinfo as _getnameinfo from socket import error as socket_error @@ -664,7 +649,7 @@ d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)] return base64.decodebytes(d.encode('ASCII', 'strict')) -def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv3, ca_certs=None): +def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None): """Retrieve the certificate from the server at the specified address, and return it as a PEM-encoded string. If 'ca_certs' is specified, validate the server cert against it. diff -r -u ../Python-3.3.6.orig/Modules/_ssl.c ./Modules/_ssl.c --- ../Python-3.3.6.orig/Modules/_ssl.c 2014-10-12 07:03:53.000000000 +0000 +++ ./Modules/_ssl.c 2015-12-20 06:42:45.773667904 +0000 @@ -1746,8 +1746,10 @@ PySSL_BEGIN_ALLOW_THREADS if (proto_version == PY_SSL_VERSION_TLS1) ctx = SSL_CTX_new(TLSv1_method()); +#ifndef OPENSSL_NO_SSL3 else if (proto_version == PY_SSL_VERSION_SSL3) ctx = SSL_CTX_new(SSLv3_method()); +#endif #ifndef OPENSSL_NO_SSL2 else if (proto_version == PY_SSL_VERSION_SSL2) ctx = SSL_CTX_new(SSLv2_method()); @@ -2842,8 +2844,10 @@ PyModule_AddIntConstant(m, "PROTOCOL_SSLv2", PY_SSL_VERSION_SSL2); #endif +#ifndef OPENSSL_NO_SSL3 PyModule_AddIntConstant(m, "PROTOCOL_SSLv3", PY_SSL_VERSION_SSL3); +#endif PyModule_AddIntConstant(m, "PROTOCOL_SSLv23", PY_SSL_VERSION_SSL23); PyModule_AddIntConstant(m, "PROTOCOL_TLSv1", pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.3.6/000077500000000000000000000000001517431316200262125ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.3.6/Python-3.3.6/000077500000000000000000000000001517431316200301405ustar00rootroot00000000000000010_ssl_no_ssl3.patch000066400000000000000000000066571517431316200337410ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.3.6/Python-3.3.6diff -r -u ../Python-3.3.6.orig/Lib/ssl.py ./Lib/ssl.py --- ../Python-3.3.6.orig/Lib/ssl.py 2014-10-12 07:03:53.000000000 +0000 +++ ./Lib/ssl.py 2015-12-20 06:43:59.175134734 +0000 @@ -66,47 +66,32 @@ SSLSyscallError, SSLEOFError, ) from _ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED -from _ssl import ( - OP_ALL, OP_NO_SSLv2, OP_NO_SSLv3, OP_NO_TLSv1, - OP_CIPHER_SERVER_PREFERENCE, OP_SINGLE_DH_USE - ) -try: - from _ssl import OP_NO_COMPRESSION -except ImportError: - pass +from _ssl import RAND_status, RAND_add, RAND_bytes, RAND_pseudo_bytes try: - from _ssl import OP_SINGLE_ECDH_USE + from _ssl import RAND_egd except ImportError: + # LibreSSL does not provide RAND_egd pass -from _ssl import RAND_status, RAND_egd, RAND_add, RAND_bytes, RAND_pseudo_bytes -from _ssl import ( - SSL_ERROR_ZERO_RETURN, - SSL_ERROR_WANT_READ, - SSL_ERROR_WANT_WRITE, - SSL_ERROR_WANT_X509_LOOKUP, - SSL_ERROR_SYSCALL, - SSL_ERROR_SSL, - SSL_ERROR_WANT_CONNECT, - SSL_ERROR_EOF, - SSL_ERROR_INVALID_ERROR_CODE, - ) + +def _import_symbols(prefix): + for n in dir(_ssl): + if n.startswith(prefix): + globals()[n] = getattr(_ssl, n) + +_import_symbols('OP_') +_import_symbols('SSL_ERROR_') +_import_symbols('PROTOCOL_') + from _ssl import HAS_SNI, HAS_ECDH, HAS_NPN -from _ssl import (PROTOCOL_SSLv3, PROTOCOL_SSLv23, - PROTOCOL_TLSv1) + from _ssl import _OPENSSL_API_VERSION -_PROTOCOL_NAMES = { - PROTOCOL_TLSv1: "TLSv1", - PROTOCOL_SSLv23: "SSLv23", - PROTOCOL_SSLv3: "SSLv3", -} +_PROTOCOL_NAMES = {value: name for name, value in globals().items() if name.startswith('PROTOCOL_')} + try: - from _ssl import PROTOCOL_SSLv2 _SSLv2_IF_EXISTS = PROTOCOL_SSLv2 -except ImportError: +except NameError: _SSLv2_IF_EXISTS = None -else: - _PROTOCOL_NAMES[PROTOCOL_SSLv2] = "SSLv2" from socket import getnameinfo as _getnameinfo from socket import error as socket_error @@ -664,7 +649,7 @@ d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)] return base64.decodebytes(d.encode('ASCII', 'strict')) -def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv3, ca_certs=None): +def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None): """Retrieve the certificate from the server at the specified address, and return it as a PEM-encoded string. If 'ca_certs' is specified, validate the server cert against it. diff -r -u ../Python-3.3.6.orig/Modules/_ssl.c ./Modules/_ssl.c --- ../Python-3.3.6.orig/Modules/_ssl.c 2014-10-12 07:03:53.000000000 +0000 +++ ./Modules/_ssl.c 2015-12-20 06:42:45.773667904 +0000 @@ -1746,8 +1746,10 @@ PySSL_BEGIN_ALLOW_THREADS if (proto_version == PY_SSL_VERSION_TLS1) ctx = SSL_CTX_new(TLSv1_method()); +#ifndef OPENSSL_NO_SSL3 else if (proto_version == PY_SSL_VERSION_SSL3) ctx = SSL_CTX_new(SSLv3_method()); +#endif #ifndef OPENSSL_NO_SSL2 else if (proto_version == PY_SSL_VERSION_SSL2) ctx = SSL_CTX_new(SSLv2_method()); @@ -2842,8 +2844,10 @@ PyModule_AddIntConstant(m, "PROTOCOL_SSLv2", PY_SSL_VERSION_SSL2); #endif +#ifndef OPENSSL_NO_SSL3 PyModule_AddIntConstant(m, "PROTOCOL_SSLv3", PY_SSL_VERSION_SSL3); +#endif PyModule_AddIntConstant(m, "PROTOCOL_SSLv23", PY_SSL_VERSION_SSL23); PyModule_AddIntConstant(m, "PROTOCOL_TLSv1", pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.3.7/000077500000000000000000000000001517431316200262135ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.3.7/Python-3.3.7/000077500000000000000000000000001517431316200301425ustar00rootroot00000000000000010_ssl_no_ssl3.patch000066400000000000000000000066571517431316200337430ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.3.7/Python-3.3.7diff -r -u ../Python-3.3.6.orig/Lib/ssl.py ./Lib/ssl.py --- ../Python-3.3.6.orig/Lib/ssl.py 2014-10-12 07:03:53.000000000 +0000 +++ ./Lib/ssl.py 2015-12-20 06:43:59.175134734 +0000 @@ -66,47 +66,32 @@ SSLSyscallError, SSLEOFError, ) from _ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED -from _ssl import ( - OP_ALL, OP_NO_SSLv2, OP_NO_SSLv3, OP_NO_TLSv1, - OP_CIPHER_SERVER_PREFERENCE, OP_SINGLE_DH_USE - ) -try: - from _ssl import OP_NO_COMPRESSION -except ImportError: - pass +from _ssl import RAND_status, RAND_add, RAND_bytes, RAND_pseudo_bytes try: - from _ssl import OP_SINGLE_ECDH_USE + from _ssl import RAND_egd except ImportError: + # LibreSSL does not provide RAND_egd pass -from _ssl import RAND_status, RAND_egd, RAND_add, RAND_bytes, RAND_pseudo_bytes -from _ssl import ( - SSL_ERROR_ZERO_RETURN, - SSL_ERROR_WANT_READ, - SSL_ERROR_WANT_WRITE, - SSL_ERROR_WANT_X509_LOOKUP, - SSL_ERROR_SYSCALL, - SSL_ERROR_SSL, - SSL_ERROR_WANT_CONNECT, - SSL_ERROR_EOF, - SSL_ERROR_INVALID_ERROR_CODE, - ) + +def _import_symbols(prefix): + for n in dir(_ssl): + if n.startswith(prefix): + globals()[n] = getattr(_ssl, n) + +_import_symbols('OP_') +_import_symbols('SSL_ERROR_') +_import_symbols('PROTOCOL_') + from _ssl import HAS_SNI, HAS_ECDH, HAS_NPN -from _ssl import (PROTOCOL_SSLv3, PROTOCOL_SSLv23, - PROTOCOL_TLSv1) + from _ssl import _OPENSSL_API_VERSION -_PROTOCOL_NAMES = { - PROTOCOL_TLSv1: "TLSv1", - PROTOCOL_SSLv23: "SSLv23", - PROTOCOL_SSLv3: "SSLv3", -} +_PROTOCOL_NAMES = {value: name for name, value in globals().items() if name.startswith('PROTOCOL_')} + try: - from _ssl import PROTOCOL_SSLv2 _SSLv2_IF_EXISTS = PROTOCOL_SSLv2 -except ImportError: +except NameError: _SSLv2_IF_EXISTS = None -else: - _PROTOCOL_NAMES[PROTOCOL_SSLv2] = "SSLv2" from socket import getnameinfo as _getnameinfo from socket import error as socket_error @@ -664,7 +649,7 @@ d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)] return base64.decodebytes(d.encode('ASCII', 'strict')) -def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv3, ca_certs=None): +def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None): """Retrieve the certificate from the server at the specified address, and return it as a PEM-encoded string. If 'ca_certs' is specified, validate the server cert against it. diff -r -u ../Python-3.3.6.orig/Modules/_ssl.c ./Modules/_ssl.c --- ../Python-3.3.6.orig/Modules/_ssl.c 2014-10-12 07:03:53.000000000 +0000 +++ ./Modules/_ssl.c 2015-12-20 06:42:45.773667904 +0000 @@ -1746,8 +1746,10 @@ PySSL_BEGIN_ALLOW_THREADS if (proto_version == PY_SSL_VERSION_TLS1) ctx = SSL_CTX_new(TLSv1_method()); +#ifndef OPENSSL_NO_SSL3 else if (proto_version == PY_SSL_VERSION_SSL3) ctx = SSL_CTX_new(SSLv3_method()); +#endif #ifndef OPENSSL_NO_SSL2 else if (proto_version == PY_SSL_VERSION_SSL2) ctx = SSL_CTX_new(SSLv2_method()); @@ -2842,8 +2844,10 @@ PyModule_AddIntConstant(m, "PROTOCOL_SSLv2", PY_SSL_VERSION_SSL2); #endif +#ifndef OPENSSL_NO_SSL3 PyModule_AddIntConstant(m, "PROTOCOL_SSLv3", PY_SSL_VERSION_SSL3); +#endif PyModule_AddIntConstant(m, "PROTOCOL_SSLv23", PY_SSL_VERSION_SSL23); PyModule_AddIntConstant(m, "PROTOCOL_TLSv1", pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.4.0/000077500000000000000000000000001517431316200262055ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.4.0/Python-3.4.0/000077500000000000000000000000001517431316200301265ustar00rootroot00000000000000010_ssl_no_ssl3.patch000066400000000000000000000053371517431316200337210ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.4.0/Python-3.4.0diff -r -u ../Python-3.4.2.orig/Lib/ssl.py ./Lib/ssl.py --- ../Python-3.4.2.orig/Lib/ssl.py 2014-10-08 08:18:12.000000000 +0000 +++ ./Lib/ssl.py 2015-12-18 13:34:24.530051626 +0000 @@ -106,7 +106,12 @@ from _ssl import (VERIFY_DEFAULT, VERIFY_CRL_CHECK_LEAF, VERIFY_CRL_CHECK_CHAIN, VERIFY_X509_STRICT) from _ssl import txt2obj as _txt2obj, nid2obj as _nid2obj -from _ssl import RAND_status, RAND_egd, RAND_add, RAND_bytes, RAND_pseudo_bytes +from _ssl import RAND_status, RAND_add, RAND_bytes, RAND_pseudo_bytes +try: + from _ssl import RAND_egd +except ImportError: + # LibreSSL does not provide RAND_egd + pass def _import_symbols(prefix): for n in dir(_ssl): @@ -116,18 +121,14 @@ _import_symbols('OP_') _import_symbols('ALERT_DESCRIPTION_') _import_symbols('SSL_ERROR_') +_import_symbols('PROTOCOL_') from _ssl import HAS_SNI, HAS_ECDH, HAS_NPN -from _ssl import PROTOCOL_SSLv3, PROTOCOL_SSLv23, PROTOCOL_TLSv1 from _ssl import _OPENSSL_API_VERSION -_PROTOCOL_NAMES = { - PROTOCOL_TLSv1: "TLSv1", - PROTOCOL_SSLv23: "SSLv23", - PROTOCOL_SSLv3: "SSLv3", -} +_PROTOCOL_NAMES = {value: name for name, value in globals().items() if name.startswith('PROTOCOL_')} try: from _ssl import PROTOCOL_SSLv2 _SSLv2_IF_EXISTS = PROTOCOL_SSLv2 @@ -922,7 +923,7 @@ d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)] return base64.decodebytes(d.encode('ASCII', 'strict')) -def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv3, ca_certs=None): +def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None): """Retrieve the certificate from the server at the specified address, and return it as a PEM-encoded string. If 'ca_certs' is specified, validate the server cert against it. diff -r -u ../Python-3.4.2.orig/Modules/_ssl.c ./Modules/_ssl.c --- ../Python-3.4.2.orig/Modules/_ssl.c 2014-10-08 08:18:15.000000000 +0000 +++ ./Modules/_ssl.c 2015-12-18 13:32:44.967611074 +0000 @@ -2016,8 +2016,10 @@ else if (proto_version == PY_SSL_VERSION_TLS1_2) ctx = SSL_CTX_new(TLSv1_2_method()); #endif +#ifndef OPENSSL_NO_SSL3 else if (proto_version == PY_SSL_VERSION_SSL3) ctx = SSL_CTX_new(SSLv3_method()); +#endif #ifndef OPENSSL_NO_SSL2 else if (proto_version == PY_SSL_VERSION_SSL2) ctx = SSL_CTX_new(SSLv2_method()); @@ -4071,8 +4073,10 @@ PyModule_AddIntConstant(m, "PROTOCOL_SSLv2", PY_SSL_VERSION_SSL2); #endif +#ifndef OPENSSL_NO_SSL3 PyModule_AddIntConstant(m, "PROTOCOL_SSLv3", PY_SSL_VERSION_SSL3); +#endif PyModule_AddIntConstant(m, "PROTOCOL_SSLv23", PY_SSL_VERSION_SSL23); PyModule_AddIntConstant(m, "PROTOCOL_TLSv1", pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.4.1/000077500000000000000000000000001517431316200262065ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.4.1/Python-3.4.1/000077500000000000000000000000001517431316200301305ustar00rootroot00000000000000010_ssl_no_ssl3.patch000066400000000000000000000053371517431316200337230ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.4.1/Python-3.4.1diff -r -u ../Python-3.4.2.orig/Lib/ssl.py ./Lib/ssl.py --- ../Python-3.4.2.orig/Lib/ssl.py 2014-10-08 08:18:12.000000000 +0000 +++ ./Lib/ssl.py 2015-12-18 13:34:24.530051626 +0000 @@ -106,7 +106,12 @@ from _ssl import (VERIFY_DEFAULT, VERIFY_CRL_CHECK_LEAF, VERIFY_CRL_CHECK_CHAIN, VERIFY_X509_STRICT) from _ssl import txt2obj as _txt2obj, nid2obj as _nid2obj -from _ssl import RAND_status, RAND_egd, RAND_add, RAND_bytes, RAND_pseudo_bytes +from _ssl import RAND_status, RAND_add, RAND_bytes, RAND_pseudo_bytes +try: + from _ssl import RAND_egd +except ImportError: + # LibreSSL does not provide RAND_egd + pass def _import_symbols(prefix): for n in dir(_ssl): @@ -116,18 +121,14 @@ _import_symbols('OP_') _import_symbols('ALERT_DESCRIPTION_') _import_symbols('SSL_ERROR_') +_import_symbols('PROTOCOL_') from _ssl import HAS_SNI, HAS_ECDH, HAS_NPN -from _ssl import PROTOCOL_SSLv3, PROTOCOL_SSLv23, PROTOCOL_TLSv1 from _ssl import _OPENSSL_API_VERSION -_PROTOCOL_NAMES = { - PROTOCOL_TLSv1: "TLSv1", - PROTOCOL_SSLv23: "SSLv23", - PROTOCOL_SSLv3: "SSLv3", -} +_PROTOCOL_NAMES = {value: name for name, value in globals().items() if name.startswith('PROTOCOL_')} try: from _ssl import PROTOCOL_SSLv2 _SSLv2_IF_EXISTS = PROTOCOL_SSLv2 @@ -922,7 +923,7 @@ d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)] return base64.decodebytes(d.encode('ASCII', 'strict')) -def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv3, ca_certs=None): +def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None): """Retrieve the certificate from the server at the specified address, and return it as a PEM-encoded string. If 'ca_certs' is specified, validate the server cert against it. diff -r -u ../Python-3.4.2.orig/Modules/_ssl.c ./Modules/_ssl.c --- ../Python-3.4.2.orig/Modules/_ssl.c 2014-10-08 08:18:15.000000000 +0000 +++ ./Modules/_ssl.c 2015-12-18 13:32:44.967611074 +0000 @@ -2016,8 +2016,10 @@ else if (proto_version == PY_SSL_VERSION_TLS1_2) ctx = SSL_CTX_new(TLSv1_2_method()); #endif +#ifndef OPENSSL_NO_SSL3 else if (proto_version == PY_SSL_VERSION_SSL3) ctx = SSL_CTX_new(SSLv3_method()); +#endif #ifndef OPENSSL_NO_SSL2 else if (proto_version == PY_SSL_VERSION_SSL2) ctx = SSL_CTX_new(SSLv2_method()); @@ -4071,8 +4073,10 @@ PyModule_AddIntConstant(m, "PROTOCOL_SSLv2", PY_SSL_VERSION_SSL2); #endif +#ifndef OPENSSL_NO_SSL3 PyModule_AddIntConstant(m, "PROTOCOL_SSLv3", PY_SSL_VERSION_SSL3); +#endif PyModule_AddIntConstant(m, "PROTOCOL_SSLv23", PY_SSL_VERSION_SSL23); PyModule_AddIntConstant(m, "PROTOCOL_TLSv1", pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.4.2/000077500000000000000000000000001517431316200262075ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.4.2/Python-3.4.2/000077500000000000000000000000001517431316200301325ustar00rootroot00000000000000010_ssl_no_ssl3.patch000066400000000000000000000053371517431316200337250ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.4.2/Python-3.4.2diff -r -u ../Python-3.4.2.orig/Lib/ssl.py ./Lib/ssl.py --- ../Python-3.4.2.orig/Lib/ssl.py 2014-10-08 08:18:12.000000000 +0000 +++ ./Lib/ssl.py 2015-12-18 13:34:24.530051626 +0000 @@ -106,7 +106,12 @@ from _ssl import (VERIFY_DEFAULT, VERIFY_CRL_CHECK_LEAF, VERIFY_CRL_CHECK_CHAIN, VERIFY_X509_STRICT) from _ssl import txt2obj as _txt2obj, nid2obj as _nid2obj -from _ssl import RAND_status, RAND_egd, RAND_add, RAND_bytes, RAND_pseudo_bytes +from _ssl import RAND_status, RAND_add, RAND_bytes, RAND_pseudo_bytes +try: + from _ssl import RAND_egd +except ImportError: + # LibreSSL does not provide RAND_egd + pass def _import_symbols(prefix): for n in dir(_ssl): @@ -116,18 +121,14 @@ _import_symbols('OP_') _import_symbols('ALERT_DESCRIPTION_') _import_symbols('SSL_ERROR_') +_import_symbols('PROTOCOL_') from _ssl import HAS_SNI, HAS_ECDH, HAS_NPN -from _ssl import PROTOCOL_SSLv3, PROTOCOL_SSLv23, PROTOCOL_TLSv1 from _ssl import _OPENSSL_API_VERSION -_PROTOCOL_NAMES = { - PROTOCOL_TLSv1: "TLSv1", - PROTOCOL_SSLv23: "SSLv23", - PROTOCOL_SSLv3: "SSLv3", -} +_PROTOCOL_NAMES = {value: name for name, value in globals().items() if name.startswith('PROTOCOL_')} try: from _ssl import PROTOCOL_SSLv2 _SSLv2_IF_EXISTS = PROTOCOL_SSLv2 @@ -922,7 +923,7 @@ d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)] return base64.decodebytes(d.encode('ASCII', 'strict')) -def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv3, ca_certs=None): +def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None): """Retrieve the certificate from the server at the specified address, and return it as a PEM-encoded string. If 'ca_certs' is specified, validate the server cert against it. diff -r -u ../Python-3.4.2.orig/Modules/_ssl.c ./Modules/_ssl.c --- ../Python-3.4.2.orig/Modules/_ssl.c 2014-10-08 08:18:15.000000000 +0000 +++ ./Modules/_ssl.c 2015-12-18 13:32:44.967611074 +0000 @@ -2016,8 +2016,10 @@ else if (proto_version == PY_SSL_VERSION_TLS1_2) ctx = SSL_CTX_new(TLSv1_2_method()); #endif +#ifndef OPENSSL_NO_SSL3 else if (proto_version == PY_SSL_VERSION_SSL3) ctx = SSL_CTX_new(SSLv3_method()); +#endif #ifndef OPENSSL_NO_SSL2 else if (proto_version == PY_SSL_VERSION_SSL2) ctx = SSL_CTX_new(SSLv2_method()); @@ -4071,8 +4073,10 @@ PyModule_AddIntConstant(m, "PROTOCOL_SSLv2", PY_SSL_VERSION_SSL2); #endif +#ifndef OPENSSL_NO_SSL3 PyModule_AddIntConstant(m, "PROTOCOL_SSLv3", PY_SSL_VERSION_SSL3); +#endif PyModule_AddIntConstant(m, "PROTOCOL_SSLv23", PY_SSL_VERSION_SSL23); PyModule_AddIntConstant(m, "PROTOCOL_TLSv1", pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.5.10/000077500000000000000000000000001517431316200262675ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.5.10/Python-3.5.10/000077500000000000000000000000001517431316200302725ustar00rootroot000000000000000001-bpo-27987-pymalloc-align-by-16bytes-on-64bit-platfor.patch000066400000000000000000000032331517431316200427070ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.5.10/Python-3.5.10From 112cceb514e79b4c9805f9e5ea037a205be428da Mon Sep 17 00:00:00 2001 From: Inada Naoki Date: Tue, 14 May 2019 18:51:15 +0900 Subject: [PATCH 1/2] bpo-27987: pymalloc: align by 16bytes on 64bit platform (GH-12850) --- .../2019-04-16-11-52-21.bpo-27987.n2_DcQ.rst | 3 +++ Objects/obmalloc.c | 6 ++++++ 2 files changed, 9 insertions(+) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2019-04-16-11-52-21.bpo-27987.n2_DcQ.rst diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-04-16-11-52-21.bpo-27987.n2_DcQ.rst b/Misc/NEWS.d/next/Core and Builtins/2019-04-16-11-52-21.bpo-27987.n2_DcQ.rst new file mode 100644 index 0000000000..b0f32a5c6c --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-04-16-11-52-21.bpo-27987.n2_DcQ.rst @@ -0,0 +1,3 @@ +pymalloc returns memory blocks aligned by 16 bytes, instead of 8 bytes, on +64-bit platforms to conform x86-64 ABI. Recent compilers assume this alignment +more often. Patch by Inada Naoki. diff --git a/Objects/obmalloc.c b/Objects/obmalloc.c index 9dd8421a33..da9029c4a6 100644 --- a/Objects/obmalloc.c +++ b/Objects/obmalloc.c @@ -540,8 +540,14 @@ static int running_on_valgrind = -1; * * You shouldn't change this unless you know what you are doing. */ + +#if SIZEOF_VOID_P > 4 +#define ALIGNMENT 16 /* must be 2^N */ +#define ALIGNMENT_SHIFT 4 +#else #define ALIGNMENT 8 /* must be 2^N */ #define ALIGNMENT_SHIFT 3 +#endif /* Return the number of bytes in size class I, as a uint. */ #define INDEX2SIZE(I) (((uint)(I) + 1) << ALIGNMENT_SHIFT) -- 2.38.4 0002-bpo-27987-align-PyGC_Head-to-alignof-long-double-GH-.patch000066400000000000000000000031661517431316200425230ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.5.10/Python-3.5.10From 618ef35426ecc57da1bee50f8dc5896f5fb178a9 Mon Sep 17 00:00:00 2001 From: Inada Naoki Date: Sat, 25 May 2019 21:13:33 +0900 Subject: [PATCH 2/2] bpo-27987: align PyGC_Head to alignof(long double) (GH-13335) --- Include/objimpl.h | 6 +++++- .../2019-05-15-18-28-43.bpo-27987.FaxuLy.rst | 2 ++ 2 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2019-05-15-18-28-43.bpo-27987.FaxuLy.rst diff --git a/Include/objimpl.h b/Include/objimpl.h index 65b6d91c36..eaf57975c8 100644 --- a/Include/objimpl.h +++ b/Include/objimpl.h @@ -250,7 +250,11 @@ typedef union _gc_head { union _gc_head *gc_prev; Py_ssize_t gc_refs; } gc; - double dummy; /* force worst-case alignment */ + long double dummy; /* force worst-case alignment */ + // malloc returns memory block aligned for any built-in types and + // long double is the largest standard C type. + // On amd64 linux, long double requires 16 byte alignment. + // See bpo-27987 for more discussion. } PyGC_Head; extern PyGC_Head *_PyGC_generation0; diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-05-15-18-28-43.bpo-27987.FaxuLy.rst b/Misc/NEWS.d/next/Core and Builtins/2019-05-15-18-28-43.bpo-27987.FaxuLy.rst new file mode 100644 index 0000000000..97ca37b262 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-05-15-18-28-43.bpo-27987.FaxuLy.rst @@ -0,0 +1,2 @@ +``PyGC_Head`` structure is aligned to ``long double``. This is needed to +GC-ed objects are aligned properly. Patch by Inada Naoki. -- 2.38.4 0003-bpo-45405-Prevent-internal-configure-error-when-runn.patch000066400000000000000000000061011517431316200433310ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.5.10/Python-3.5.10From 655f26bb742d6bd32c388e9fea14b64eb25fd4de Mon Sep 17 00:00:00 2001 From: Ned Deily Date: Tue, 15 Mar 2022 03:18:39 -0400 Subject: [PATCH] bpo-45405: Prevent internal configure error when running configure with recent versions of clang. (GH-28845) (GH-31890) Change the configure logic to function properly on macOS when the compiler outputs a platform triplet for option --print-multiarch. The Apple Clang included with Xcode 13.3 now supports --print-multiarch causing configure to fail without this change. Co-authored-by: Ned Deily (cherry picked from commit 9c4766772cda67648184f8ddba546a5fc0167f91) Co-authored-by: David Bohman (cherry picked from commit 720bb456dc711b0776bae837d1f9a0b10c28ddf2) --- .../next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst | 2 ++ configure | 8 +++++--- configure.ac | 8 +++++--- 3 files changed, 12 insertions(+), 6 deletions(-) create mode 100644 Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst diff --git a/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst b/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst new file mode 100644 index 0000000000..13c93d1b8a --- /dev/null +++ b/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst @@ -0,0 +1,2 @@ +Prevent ``internal configure error`` when running ``configure`` +with recent versions of clang. Patch by David Bohman. diff --git a/configure b/configure index fb0a499145..67e6e69b5f 100755 --- a/configure +++ b/configure @@ -5203,9 +5203,6 @@ $as_echo "$as_me: fi -MULTIARCH=$($CC --print-multiarch 2>/dev/null) - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the platform triplet based on compiler characteristics" >&5 $as_echo_n "checking for the platform triplet based on compiler characteristics... " >&6; } cat >> conftest.c <&6; } fi rm -f conftest.c conftest.out +if test x$PLATFORM_TRIPLET != xdarwin; then + MULTIARCH=$($CC --print-multiarch 2>/dev/null) +fi + + if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then if test x$PLATFORM_TRIPLET != x$MULTIARCH; then as_fn_error $? "internal configure error for the platform triplet, please file a bug report" "$LINENO" 5 diff --git a/configure.ac b/configure.ac index d86dad9a7c..468ad6070f 100644 --- a/configure.ac +++ b/configure.ac @@ -747,9 +747,6 @@ then fi -MULTIARCH=$($CC --print-multiarch 2>/dev/null) -AC_SUBST(MULTIARCH) - AC_MSG_CHECKING([for the platform triplet based on compiler characteristics]) cat >> conftest.c </dev/null) +fi +AC_SUBST(MULTIARCH) + if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then if test x$PLATFORM_TRIPLET != x$MULTIARCH; then AC_MSG_ERROR([internal configure error for the platform triplet, please file a bug report]) -- 2.32.0 (Apple Git-132) 0004-Detect-arm64-in-configure.patch000066400000000000000000000017611517431316200363440ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.5.10/Python-3.5.10From 002501946bad91a308f37a09204393c172f03c3e Mon Sep 17 00:00:00 2001 From: Takumi Sueda Date: Sat, 11 Sep 2021 16:50:14 +0900 Subject: [PATCH 2/6] Detect arm64 in configure --- configure | 3 +++ configure.ac | 3 +++ 2 files changed, 6 insertions(+) diff --git a/configure b/configure index e39c16eee2..8dc1fc7595 100755 --- a/configure +++ b/configure @@ -9230,6 +9230,9 @@ fi ppc) MACOSX_DEFAULT_ARCH="ppc64" ;; + arm64) + MACOSX_DEFAULT_ARCH="arm64" + ;; *) as_fn_error $? "Unexpected output of 'arch' on OSX" "$LINENO" 5 ;; diff --git a/configure.ac b/configure.ac index cf280506bd..34846a7df3 100644 --- a/configure.ac +++ b/configure.ac @@ -2435,6 +2435,9 @@ case $ac_sys_system/$ac_sys_release in ppc) MACOSX_DEFAULT_ARCH="ppc64" ;; + arm64) + MACOSX_DEFAULT_ARCH="arm64" + ;; *) AC_MSG_ERROR([Unexpected output of 'arch' on OSX]) ;; -- 2.30.1 (Apple Git-130) 0005-BPO-41100-Support-macOS-11-when-building-GH-21113.patch000066400000000000000000000036521517431316200412730ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.5.10/Python-3.5.10From 8ea6353f60625c96ce96588c70ff24a77f8c71f9 Mon Sep 17 00:00:00 2001 From: Ronald Oussoren Date: Thu, 25 Jun 2020 16:55:48 +0200 Subject: [PATCH] BPO-41100: Support macOS 11 when building (GH-21113) --- Misc/NEWS.d/next/macOS/2020-06-24-13-51-57.bpo-41100.mcHdc5.rst | 1 + configure | 2 +- configure.ac | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/macOS/2020-06-24-13-51-57.bpo-41100.mcHdc5.rst diff --git a/Misc/NEWS.d/next/macOS/2020-06-24-13-51-57.bpo-41100.mcHdc5.rst b/Misc/NEWS.d/next/macOS/2020-06-24-13-51-57.bpo-41100.mcHdc5.rst new file mode 100644 index 0000000000..ded66b567a --- /dev/null +++ b/Misc/NEWS.d/next/macOS/2020-06-24-13-51-57.bpo-41100.mcHdc5.rst @@ -0,0 +1 @@ +Support macOS 11 when building. diff --git a/configure b/configure index c51f396824..5024860ca4 100755 --- a/configure +++ b/configure @@ -3375,7 +3375,7 @@ $as_echo "#define _BSD_SOURCE 1" >>confdefs.h # has no effect, don't bother defining them Darwin/[6789].*) define_xopen_source=no;; - Darwin/1[0-9].*) + Darwin/[12][0-9].*) define_xopen_source=no;; # On AIX 4 and 5.1, mbstate_t is defined only when _XOPEN_SOURCE == 500 but # used in wcsnrtombs() and mbsnrtowcs() even if _XOPEN_SOURCE is not defined diff --git a/configure.ac b/configure.ac index 70deefb6b9..5a3e340aa3 100644 --- a/configure.ac +++ b/configure.ac @@ -495,7 +495,7 @@ case $ac_sys_system/$ac_sys_release in # has no effect, don't bother defining them Darwin/@<:@6789@:>@.*) define_xopen_source=no;; - Darwin/1@<:@0-9@:>@.*) + Darwin/@<:@[12]@:>@@<:@0-9@:>@.*) define_xopen_source=no;; # On AIX 4 and 5.1, mbstate_t is defined only when _XOPEN_SOURCE == 500 but # used in wcsnrtombs() and mbsnrtowcs() even if _XOPEN_SOURCE is not defined -- 2.30.1 (Apple Git-130) 0006-bpo-41100-fix-_decimal-for-arm64-Mac-OS-GH-21228.patch000066400000000000000000000027101517431316200410610ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.5.10/Python-3.5.10From 604d95e235d86465b8c17f02095edcaf18464d4c Mon Sep 17 00:00:00 2001 From: Lawrence D'Anna <64555057+lawrence-danna-apple@users.noreply.github.com> Date: Tue, 30 Jun 2020 02:15:46 -0700 Subject: [PATCH] bpo-41100: fix _decimal for arm64 Mac OS (GH-21228) Patch by Lawrence Danna. --- .../Core and Builtins/2020-06-30-04-44-29.bpo-41100.PJwA6F.rst | 1 + Modules/_decimal/libmpdec/mpdecimal.h | 3 +++ 2 files changed, 4 insertions(+) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-06-30-04-44-29.bpo-41100.PJwA6F.rst diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-06-30-04-44-29.bpo-41100.PJwA6F.rst b/Misc/NEWS.d/next/Core and Builtins/2020-06-30-04-44-29.bpo-41100.PJwA6F.rst new file mode 100644 index 0000000000..d6176d69f0 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-06-30-04-44-29.bpo-41100.PJwA6F.rst @@ -0,0 +1 @@ +add arm64 to the allowable Mac OS arches in mpdecimal.h \ No newline at end of file diff --git a/Modules/_decimal/libmpdec/mpdecimal.h b/Modules/_decimal/libmpdec/mpdecimal.h index 108b76efa8..35ce429f60 100644 --- a/Modules/_decimal/libmpdec/mpdecimal.h +++ b/Modules/_decimal/libmpdec/mpdecimal.h @@ -135,6 +135,9 @@ const char *mpd_version(void); #elif defined(__x86_64__) #define CONFIG_64 #define ASM + #elif defined(__arm64__) + #define CONFIG_64 + #define ANSI #else #error "unknown architecture for universal build." #endif -- 2.30.1 (Apple Git-130) 0007-Port-ctypes-and-system-libffi-patch-for-arm64-macOS-.patch000066400000000000000000000117661517431316200432640ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.5.10/Python-3.5.10From 409b4ecef88643996ce00482b650c0246a977a4b Mon Sep 17 00:00:00 2001 From: Chaim Halbert Date: Sun, 26 Feb 2023 06:21:54 -0700 Subject: [PATCH] Port ctypes and system libffi patch for arm64/macOS 10.15+ to Python 3.5.10 This backports the following ctypes and libffi pyenv patch for Python 3.6.15 to Python 3.5.10: * `0004-Port-ctypes-and-system-libffi-patches-for-arm64-macO.patch` This patch enables use of system libffi (fixing a broken `ctypes` module on arm64 targets) and enables calling variadic functions on arm64. --- setup.py | 65 +++++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 50 insertions(+), 15 deletions(-) diff --git a/setup.py b/setup.py index 2944c9dd6f..ab8065866f 100644 --- a/setup.py +++ b/setup.py @@ -73,6 +73,13 @@ def macosx_sdk_root(): sysroot = m.group(1) return sysroot +def is_macosx_at_least(vers): + if host_platform == 'darwin': + dep_target = sysconfig.get_config_var('MACOSX_DEPLOYMENT_TARGET') + if dep_target: + return tuple(map(int, str(dep_target).split('.'))) >= vers + return False + def is_macosx_sdk_path(path): """ Returns True if 'path' can be located in an OSX SDK @@ -81,6 +88,13 @@ def is_macosx_sdk_path(path): or path.startswith('/System/') or path.startswith('/Library/') ) +def grep_headers_for(function, headers): + for header in headers: + with open(header, 'r') as f: + if function in f.read(): + return True + return False + def find_file(filename, std_dirs, paths): """Searches for the directory where a given file is located, and returns a possibly-empty list of additional directories, or None @@ -1939,7 +1953,11 @@ class PyBuildExt(build_ext): return True def detect_ctypes(self, inc_dirs, lib_dirs): - self.use_system_libffi = False + if not sysconfig.get_config_var("LIBFFI_INCLUDEDIR") and is_macosx_at_least((10,15)): + self.use_system_libffi = True + else: + self.use_system_libffi = '--with-system-ffi' in sysconfig.get_config_var("CONFIG_ARGS") + include_dirs = [] extra_compile_args = [] extra_link_args = [] @@ -1986,19 +2004,29 @@ class PyBuildExt(build_ext): libraries=math_libs) self.extensions.extend([ext, ext_test]) - if not '--with-system-ffi' in sysconfig.get_config_var("CONFIG_ARGS"): - return + ffi_inc = sysconfig.get_config_var("LIBFFI_INCLUDEDIR") + ffi_lib = None if host_platform == 'darwin': - # OS X 10.5 comes with libffi.dylib; the include files are - # in /usr/include/ffi - inc_dirs.append('/usr/include/ffi') - - ffi_inc = [sysconfig.get_config_var("LIBFFI_INCLUDEDIR")] - if not ffi_inc or ffi_inc[0] == '': - ffi_inc = find_file('ffi.h', [], inc_dirs) - if ffi_inc is not None: - ffi_h = ffi_inc[0] + '/ffi.h' + if not self.use_system_libffi: + return + ffi_in_sdk = os.path.join(macosx_sdk_root(), "usr/include/ffi") + if os.path.exists(ffi_in_sdk): + ffi_inc = ffi_in_sdk + ffi_lib = 'ffi' + else: + # OS X 10.5 comes with libffi.dylib; the include files are + # in /usr/include/ffi + inc_dirs.append('/usr/include/ffi') + elif '--without-system-ffi' in sysconfig.get_config_var("CONFIG_ARGS"): + return + + if not ffi_inc: + found = find_file('ffi.h', [], inc_dirs) + if found: + ffi_inc = found[0] + if ffi_inc: + ffi_h = ffi_inc + '/ffi.h' with open(ffi_h) as f: for line in f: line = line.strip() @@ -2009,15 +2037,22 @@ class PyBuildExt(build_ext): ffi_inc = None print('Header file {} does not define LIBFFI_H or ' 'ffi_wrapper_h'.format(ffi_h)) - ffi_lib = None - if ffi_inc is not None: + if ffi_lib is None and ffi_inc is not None: for lib_name in ('ffi_convenience', 'ffi_pic', 'ffi'): if (self.compiler.find_library_file(lib_dirs, lib_name)): ffi_lib = lib_name break if ffi_inc and ffi_lib: - ext.include_dirs.extend(ffi_inc) + ffi_headers = glob(os.path.join(ffi_inc, '*.h')) + if grep_headers_for('ffi_closure_alloc', ffi_headers): + try: + sources.remove('_ctypes/malloc_closure.c') + except ValueError: + pass + if grep_headers_for('ffi_prep_cif_var', ffi_headers): + ext.extra_compile_args.append("-DHAVE_FFI_PREP_CIF_VAR=1") + ext.include_dirs.append(ffi_inc) ext.libraries.append(ffi_lib) self.use_system_libffi = True -- 2.39.2 0008-bpo-36231-Support-building-on-macOS-without-usr-incl.patch000066400000000000000000000066641517431316200432030ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.5.10/Python-3.5.10From 2ad0bb719f5ce416d3bfa366814ebcf3b654f081 Mon Sep 17 00:00:00 2001 From: Ivan Pozdeev Date: Sat, 10 Jun 2023 20:17:25 +0300 Subject: [PATCH] bpo-36231: Support building on macOS without /usr/include (GH-13773) (GH-14208) --- .../2019-06-03-05-49-49.bpo-36231.RfmW_p.rst | 3 ++ setup.py | 53 ++++++++++++++++--- 2 files changed, 49 insertions(+), 7 deletions(-) create mode 100644 Misc/NEWS.d/next/macOS/2019-06-03-05-49-49.bpo-36231.RfmW_p.rst diff --git a/Misc/NEWS.d/next/macOS/2019-06-03-05-49-49.bpo-36231.RfmW_p.rst b/Misc/NEWS.d/next/macOS/2019-06-03-05-49-49.bpo-36231.RfmW_p.rst new file mode 100644 index 0000000000..c82e54c12c --- /dev/null +++ b/Misc/NEWS.d/next/macOS/2019-06-03-05-49-49.bpo-36231.RfmW_p.rst @@ -0,0 +1,3 @@ +Support building Python on macOS without /usr/include installed. As of macOS +10.14, system header files are only available within an SDK provided by +either the Command Line Tools or the Xcode app. diff --git a/setup.py b/setup.py index ab8065866f..28dc801845 100644 --- a/setup.py +++ b/setup.py @@ -60,18 +60,57 @@ def add_dir_to_list(dirlist, dir): return dirlist.insert(0, dir) +MACOS_SDK_ROOT = None + def macosx_sdk_root(): + """Return the directory of the current macOS SDK. + + If no SDK was explicitly configured, call the compiler to find which + include files paths are being searched by default. Use '/' if the + compiler is searching /usr/include (meaning system header files are + installed) or use the root of an SDK if that is being searched. + (The SDK may be supplied via Xcode or via the Command Line Tools). + The SDK paths used by Apple-supplied tool chains depend on the + setting of various variables; see the xcrun man page for more info. """ - Return the directory of the current OSX SDK, - or '/' if no SDK was specified. - """ + global MACOS_SDK_ROOT + + # If already called, return cached result. + if MACOS_SDK_ROOT: + return MACOS_SDK_ROOT + cflags = sysconfig.get_config_var('CFLAGS') m = re.search(r'-isysroot\s+(\S+)', cflags) - if m is None: - sysroot = '/' + if m is not None: + MACOS_SDK_ROOT = m.group(1) else: - sysroot = m.group(1) - return sysroot + MACOS_SDK_ROOT = '/' + cc = sysconfig.get_config_var('CC') + tmpfile = '/tmp/setup_sdk_root.%d' % os.getpid() + try: + os.unlink(tmpfile) + except: + pass + ret = os.system('%s -E -v - %s 1>/dev/null' % (cc, tmpfile)) + in_incdirs = False + try: + if ret >> 8 == 0: + with open(tmpfile) as fp: + for line in fp.readlines(): + if line.startswith("#include <...>"): + in_incdirs = True + elif line.startswith("End of search list"): + in_incdirs = False + elif in_incdirs: + line = line.strip() + if line == '/usr/include': + MACOS_SDK_ROOT = '/' + elif line.endswith(".sdk/usr/include"): + MACOS_SDK_ROOT = line[:-12] + finally: + os.unlink(tmpfile) + + return MACOS_SDK_ROOT def is_macosx_at_least(vers): if host_platform == 'darwin': -- 2.36.1.windows.1 0009-bpo-42351-Avoid-error-when-opening-header-with-non-U.patch000066400000000000000000000015241517431316200430340ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.5.10/Python-3.5.10From 3cc28dc409d0db3752278379e7a8d4c23e0f2e29 Mon Sep 17 00:00:00 2001 From: Ronald Oussoren Date: Sat, 14 Nov 2020 16:07:47 +0100 Subject: [PATCH] bpo-42351: Avoid error when opening header with non-UTF8 encoding (GH-23279) grep_headers_for() would error out when a header contained text that cannot be interpreted as UTF-8. --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 28dc801845..dd50485213 100644 --- a/setup.py +++ b/setup.py @@ -129,7 +129,7 @@ def is_macosx_sdk_path(path): def grep_headers_for(function, headers): for header in headers: - with open(header, 'r') as f: + with open(header, 'r', errors='surrogateescape') as f: if function in f.read(): return True return False -- 2.36.1.windows.1 0010-bpo-36106-Resolve-sinpi-name-clash-with-libm-IEEE-75.patch000066400000000000000000000047741517431316200424560ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.5.10/Python-3.5.10From f57cd8288dbe6aba99c057f37ad6d58f8db75350 Mon Sep 17 00:00:00 2001 From: Dima Pasechnik Date: Tue, 26 Feb 2019 06:36:11 +0000 Subject: [PATCH] bpo-36106: Resolve sinpi name clash with libm (IEEE-754 violation). (GH-12027) The standard math library (libm) may follow IEEE-754 recommendation to include an implementation of sinPi(), i.e. sinPi(x):=sin(pi*x). And this triggers a name clash, found by FreeBSD developer Steve Kargl, who worken on putting sinpi into libm used on FreeBSD (it has to be named "sinpi", not "sinPi", cf. e.g. https://en.cppreference.com/w/c/experimental/fpext4). --- .../next/Library/2019-02-25-13-21-43.bpo-36106.VuhEiQ.rst | 1 + Modules/mathmodule.c | 8 ++++---- 2 files changed, 5 insertions(+), 4 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2019-02-25-13-21-43.bpo-36106.VuhEiQ.rst diff --git a/Misc/NEWS.d/next/Library/2019-02-25-13-21-43.bpo-36106.VuhEiQ.rst b/Misc/NEWS.d/next/Library/2019-02-25-13-21-43.bpo-36106.VuhEiQ.rst new file mode 100644 index 00000000000..36e17508cd4 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-02-25-13-21-43.bpo-36106.VuhEiQ.rst @@ -0,0 +1 @@ +Resolve potential name clash with libm's sinpi(). Patch by Dmitrii Pasechnik. diff --git a/Modules/mathmodule.c b/Modules/mathmodule.c index 2272f622f0b..fd0eb327c74 100644 --- a/Modules/mathmodule.c +++ b/Modules/mathmodule.c @@ -100,7 +100,7 @@ static const double sqrtpi = 1.772453850905516027298167483341145182798; } static double -sinpi(double x) +m_sinpi(double x) { double y, r; int n; @@ -328,7 +328,7 @@ m_tgamma(double x) integer. */ if (absx > 200.0) { if (x < 0.0) { - return 0.0/sinpi(x); + return 0.0/m_sinpi(x); } else { errno = ERANGE; @@ -352,7 +352,7 @@ m_tgamma(double x) } z = z * lanczos_g / y; if (x < 0.0) { - r = -pi / sinpi(absx) / absx * exp(y) / lanczos_sum(absx); + r = -pi / m_sinpi(absx) / absx * exp(y) / lanczos_sum(absx); r -= z * r; if (absx < 140.0) { r /= pow(y, absx - 0.5); @@ -423,7 +423,7 @@ m_lgamma(double x) r += (absx - 0.5) * (log(absx + lanczos_g - 0.5) - 1); if (x < 0.0) /* Use reflection formula to get value for negative x. */ - r = logpi - log(fabs(sinpi(absx))) - log(absx) - r; + r = logpi - log(fabs(m_sinpi(absx))) - log(absx) - r; if (Py_IS_INFINITY(r)) errno = ERANGE; return r; -- 2.36.1.windows.1 0011-Recognize-an-argument-to-j-in-MAKEFLAGS.patch000066400000000000000000000015661517431316200405270ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.5.10/Python-3.5.10From ed9010349e8f6351a64ba2c7005fa0c3e40655bd Mon Sep 17 00:00:00 2001 From: Ivan Pozdeev Date: Fri, 26 Dec 2025 13:39:21 +0300 Subject: [PATCH] Recognize an argument to -j in MAKEFLAGS --- setup.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index 467362813dc..a3623c577af 100644 --- a/setup.py +++ b/setup.py @@ -277,8 +277,10 @@ class PyBuildExt(build_ext): build_ext.__init__(self, dist) self.failed = [] self.failed_on_import = [] - if '-j' in os.environ.get('MAKEFLAGS', ''): - self.parallel = True + m=re.search(r'(?:^|\s)(?:-j|--jobs)(?:\s+|=)?(\d*)',os.environ.get('MAKEFLAGS', '')) + if m is not None: + self.parallel = int(m.group(1)) if m.group(1) else True + del m def build_extensions(self): -- 2.36.1.windows.1 pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.5.2/000077500000000000000000000000001517431316200262105ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.5.2/Python-3.5.2/000077500000000000000000000000001517431316200301345ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.5.2/Python-3.5.2/venv.patch000066400000000000000000000016751517431316200321440ustar00rootroot00000000000000 # HG changeset patch # User Brett Cannon # Date 1467312199 25200 # Node ID 8d7bde14d7a48f747b1ea2f77385352c507da6b9 # Parent f2d1dba10a0e9db6c77889ff8ca18718ce1e76c6# Parent 4fc0154ec84a65feb580e62729ac1d26ddfcbfa1 Merge from 3.5 for issue #26664 diff --git a/Lib/venv/scripts/posix/activate.fish b/Lib/venv/scripts/posix/activate.fish --- a/Lib/venv/scripts/posix/activate.fish +++ b/Lib/venv/scripts/posix/activate.fish @@ -55,8 +55,8 @@ if test -z "$VIRTUAL_ENV_DISABLE_PROMPT" # with the original prompt function renamed, we can override with our own. function fish_prompt # Prompt override? - if test -n "$__VENV_PROMPT__" - printf "%s%s%s" "$__VENV_PROMPT__" (set_color normal) (_old_fish_prompt) + if test -n "__VENV_PROMPT__" + printf "%s%s%s" "__VENV_PROMPT__" (set_color normal) (_old_fish_prompt) return end # ...Otherwise, prepend env pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.6.15/000077500000000000000000000000001517431316200262755ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.6.15/Python-3.6.15/000077500000000000000000000000001517431316200303065ustar00rootroot000000000000000001-Detect-arm64-in-configure.patch000066400000000000000000000017611517431316200363550ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.6.15/Python-3.6.15From 002501946bad91a308f37a09204393c172f03c3e Mon Sep 17 00:00:00 2001 From: Takumi Sueda Date: Sat, 11 Sep 2021 16:50:14 +0900 Subject: [PATCH 2/6] Detect arm64 in configure --- configure | 3 +++ configure.ac | 3 +++ 2 files changed, 6 insertions(+) diff --git a/configure b/configure index e39c16eee2..8dc1fc7595 100755 --- a/configure +++ b/configure @@ -9230,6 +9230,9 @@ fi ppc) MACOSX_DEFAULT_ARCH="ppc64" ;; + arm64) + MACOSX_DEFAULT_ARCH="arm64" + ;; *) as_fn_error $? "Unexpected output of 'arch' on OSX" "$LINENO" 5 ;; diff --git a/configure.ac b/configure.ac index cf280506bd..34846a7df3 100644 --- a/configure.ac +++ b/configure.ac @@ -2435,6 +2435,9 @@ case $ac_sys_system/$ac_sys_release in ppc) MACOSX_DEFAULT_ARCH="ppc64" ;; + arm64) + MACOSX_DEFAULT_ARCH="arm64" + ;; *) AC_MSG_ERROR([Unexpected output of 'arch' on OSX]) ;; -- 2.30.1 (Apple Git-130) 00012-Recognize-an-argument-to-j-in-MAKEFLAGS.patch000066400000000000000000000015661517431316200406240ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.6.15/Python-3.6.15From ed9010349e8f6351a64ba2c7005fa0c3e40655bd Mon Sep 17 00:00:00 2001 From: Ivan Pozdeev Date: Fri, 26 Dec 2025 13:39:21 +0300 Subject: [PATCH] Recognize an argument to -j in MAKEFLAGS --- setup.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index 467362813dc..a3623c577af 100644 --- a/setup.py +++ b/setup.py @@ -277,8 +277,10 @@ class PyBuildExt(build_ext): build_ext.__init__(self, dist) self.failed = [] self.failed_on_import = [] - if '-j' in os.environ.get('MAKEFLAGS', ''): - self.parallel = True + m=re.search(r'(?:^|\s)(?:-j|--jobs)(?:\s+|=)?(\d*)',os.environ.get('MAKEFLAGS', '')) + if m is not None: + self.parallel = int(m.group(1)) if m.group(1) else True + del m def build_extensions(self): -- 2.36.1.windows.1 0002-bpo-36231-Support-building-on-macOS-without-usr-incl.patch000066400000000000000000000066261517431316200432070ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.6.15/Python-3.6.15From c7302116573d853d3181133477d9d0e4d4d3abfd Mon Sep 17 00:00:00 2001 From: Ned Deily Date: Tue, 18 Jun 2019 16:28:13 -0400 Subject: [PATCH] bpo-36231: Support building on macOS without /usr/include (GH-13773) (GH-14208) --- .../2019-06-03-05-49-49.bpo-36231.RfmW_p.rst | 3 ++ setup.py | 53 ++++++++++++++++--- 2 files changed, 49 insertions(+), 7 deletions(-) create mode 100644 Misc/NEWS.d/next/macOS/2019-06-03-05-49-49.bpo-36231.RfmW_p.rst diff --git a/Misc/NEWS.d/next/macOS/2019-06-03-05-49-49.bpo-36231.RfmW_p.rst b/Misc/NEWS.d/next/macOS/2019-06-03-05-49-49.bpo-36231.RfmW_p.rst new file mode 100644 index 0000000000..c82e54c12c --- /dev/null +++ b/Misc/NEWS.d/next/macOS/2019-06-03-05-49-49.bpo-36231.RfmW_p.rst @@ -0,0 +1,3 @@ +Support building Python on macOS without /usr/include installed. As of macOS +10.14, system header files are only available within an SDK provided by +either the Command Line Tools or the Xcode app. diff --git a/setup.py b/setup.py index bcc4bfa89d..5e0cd02430 100644 --- a/setup.py +++ b/setup.py @@ -90,18 +90,57 @@ def sysroot_paths(make_vars, subdirs): break return dirs +MACOS_SDK_ROOT = None + def macosx_sdk_root(): + """Return the directory of the current macOS SDK. + + If no SDK was explicitly configured, call the compiler to find which + include files paths are being searched by default. Use '/' if the + compiler is searching /usr/include (meaning system header files are + installed) or use the root of an SDK if that is being searched. + (The SDK may be supplied via Xcode or via the Command Line Tools). + The SDK paths used by Apple-supplied tool chains depend on the + setting of various variables; see the xcrun man page for more info. """ - Return the directory of the current OSX SDK, - or '/' if no SDK was specified. - """ + global MACOS_SDK_ROOT + + # If already called, return cached result. + if MACOS_SDK_ROOT: + return MACOS_SDK_ROOT + cflags = sysconfig.get_config_var('CFLAGS') m = re.search(r'-isysroot\s+(\S+)', cflags) - if m is None: - sysroot = '/' + if m is not None: + MACOS_SDK_ROOT = m.group(1) else: - sysroot = m.group(1) - return sysroot + MACOS_SDK_ROOT = '/' + cc = sysconfig.get_config_var('CC') + tmpfile = '/tmp/setup_sdk_root.%d' % os.getpid() + try: + os.unlink(tmpfile) + except: + pass + ret = os.system('%s -E -v - %s 1>/dev/null' % (cc, tmpfile)) + in_incdirs = False + try: + if ret >> 8 == 0: + with open(tmpfile) as fp: + for line in fp.readlines(): + if line.startswith("#include <...>"): + in_incdirs = True + elif line.startswith("End of search list"): + in_incdirs = False + elif in_incdirs: + line = line.strip() + if line == '/usr/include': + MACOS_SDK_ROOT = '/' + elif line.endswith(".sdk/usr/include"): + MACOS_SDK_ROOT = line[:-12] + finally: + os.unlink(tmpfile) + + return MACOS_SDK_ROOT def is_macosx_sdk_path(path): """ -- 2.30.1 (Apple Git-130) 0003-Fix-macOS-_tkinter-use-of-Tck-Tk-in-Library-Framewor.patch000066400000000000000000000243731517431316200432610ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.6.15/Python-3.6.15From 942db3e6b96225ef8330f5329c702d62483c6ef8 Mon Sep 17 00:00:00 2001 From: Takumi Sueda Date: Sat, 11 Sep 2021 17:14:34 +0900 Subject: [PATCH 3/6] Fix macOS _tkinter use of Tck/Tk in /Library/Framework Modified and imported from https://github.com/Homebrew/formula-patches/blob/master/python/3.8.7.patch --- setup.py | 147 ++++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 107 insertions(+), 40 deletions(-) diff --git a/setup.py b/setup.py index e2c1898253..8e03c77997 100644 --- a/setup.py +++ b/setup.py @@ -91,6 +91,7 @@ def sysroot_paths(make_vars, subdirs): return dirs MACOS_SDK_ROOT = None +MACOS_SDK_SPECIFIED = None def macosx_sdk_root(): """Return the directory of the current macOS SDK. @@ -102,8 +103,9 @@ def macosx_sdk_root(): (The SDK may be supplied via Xcode or via the Command Line Tools). The SDK paths used by Apple-supplied tool chains depend on the setting of various variables; see the xcrun man page for more info. + Also sets MACOS_SDK_SPECIFIED for use by macosx_sdk_specified(). """ - global MACOS_SDK_ROOT + global MACOS_SDK_ROOT, MACOS_SDK_SPECIFIED # If already called, return cached result. if MACOS_SDK_ROOT: @@ -113,8 +115,10 @@ def macosx_sdk_root(): m = re.search(r'-isysroot\s+(\S+)', cflags) if m is not None: MACOS_SDK_ROOT = m.group(1) + MACOS_SDK_SPECIFIED = MACOS_SDK_ROOT != '/' else: MACOS_SDK_ROOT = '/' + MACOS_SDK_SPECIFIED = False cc = sysconfig.get_config_var('CC') tmpfile = '/tmp/setup_sdk_root.%d' % os.getpid() try: @@ -142,6 +146,27 @@ def macosx_sdk_root(): return MACOS_SDK_ROOT +def macosx_sdk_specified(): + """Returns true if an SDK was explicitly configured. + + True if an SDK was selected at configure time, either by specifying + --enable-universalsdk=(something other than no or /) or by adding a + -isysroot option to CFLAGS. In some cases, like when making + decisions about macOS Tk framework paths, we need to be able to + know whether the user explicitly asked to build with an SDK versus + the implicit use of an SDK when header files are no longer + installed on a running system by the Command Line Tools. + """ + global MACOS_SDK_SPECIFIED + + # If already called, return cached result. + if MACOS_SDK_SPECIFIED: + return MACOS_SDK_SPECIFIED + + # Find the sdk root and set MACOS_SDK_SPECIFIED + macosx_sdk_root() + return MACOS_SDK_SPECIFIED + def is_macosx_sdk_path(path): """ Returns True if 'path' can be located in an OSX SDK @@ -1758,31 +1783,72 @@ class PyBuildExt(build_ext): return 1 def detect_tkinter_darwin(self, inc_dirs, lib_dirs): - # The _tkinter module, using frameworks. Since frameworks are quite - # different the UNIX search logic is not sharable. - from os.path import join, exists - framework_dirs = [ - '/Library/Frameworks', - '/System/Library/Frameworks/', - join(os.getenv('HOME'), '/Library/Frameworks') - ] + # Build default _tkinter on macOS using Tcl and Tk frameworks. + # + # The macOS native Tk (AKA Aqua Tk) and Tcl are most commonly + # built and installed as macOS framework bundles. However, + # for several reasons, we cannot take full advantage of the + # Apple-supplied compiler chain's -framework options here. + # Instead, we need to find and pass to the compiler the + # absolute paths of the Tcl and Tk headers files we want to use + # and the absolute path to the directory containing the Tcl + # and Tk frameworks for linking. + # + # We want to handle here two common use cases on macOS: + # 1. Build and link with system-wide third-party or user-built + # Tcl and Tk frameworks installed in /Library/Frameworks. + # 2. Build and link using a user-specified macOS SDK so that the + # built Python can be exported to other systems. In this case, + # search only the SDK's /Library/Frameworks (normally empty) + # and /System/Library/Frameworks. + # + # Any other use case should be able to be handled explicitly by + # using the options described above in detect_tkinter_explicitly(). + # In particular it would be good to handle here the case where + # you want to build and link with a framework build of Tcl and Tk + # that is not in /Library/Frameworks, say, in your private + # $HOME/Library/Frameworks directory or elsewhere. It turns + # out to be difficult to make that work automtically here + # without bringing into play more tools and magic. That case + # can be hamdled using a recipe with the right arguments + # to detect_tkinter_explicitly(). + # + # Note also that the fallback case here is to try to use the + # Apple-supplied Tcl and Tk frameworks in /System/Library but + # be forewarned that they are deprecated by Apple and typically + # out-of-date and buggy; their use should be avoided if at + # all possible by installing a newer version of Tcl and Tk in + # /Library/Frameworks before bwfore building Python without + # an explicit SDK or by configuring build arguments explicitly. - sysroot = macosx_sdk_root() + from os.path import join, exists + sysroot = macosx_sdk_root() # path to the SDK or '/' + + if macosx_sdk_specified(): + # Use case #2: an SDK other than '/' was specified. + # Only search there. + framework_dirs = [ + join(sysroot, 'Library', 'Frameworks'), + join(sysroot, 'System', 'Library', 'Frameworks'), + ] + else: + # Use case #1: no explicit SDK selected. + # Search the local system-wide /Library/Frameworks, + # not the one in the default SDK, othewise fall back to + # /System/Library/Frameworks whose header files may be in + # the default SDK or, on older systems, actually installed. + framework_dirs = [ + join('/', 'Library', 'Frameworks'), + join(sysroot, 'System', 'Library', 'Frameworks'), + ] - # Find the directory that contains the Tcl.framework and Tk.framework - # bundles. - # XXX distutils should support -F! + # Find the directory that contains the Tcl.framework and + # Tk.framework bundles. for F in framework_dirs: # both Tcl.framework and Tk.framework should be present - - for fw in 'Tcl', 'Tk': - if is_macosx_sdk_path(F): - if not exists(join(sysroot, F[1:], fw + '.framework')): - break - else: - if not exists(join(F, fw + '.framework')): - break + if not exists(join(F, fw + '.framework')): + break else: # ok, F is now directory with both frameworks. Continure # building @@ -1792,24 +1858,16 @@ class PyBuildExt(build_ext): # will now resume. return 0 - # For 8.4a2, we must add -I options that point inside the Tcl and Tk - # frameworks. In later release we should hopefully be able to pass - # the -F option to gcc, which specifies a framework lookup path. - # include_dirs = [ join(F, fw + '.framework', H) for fw in ('Tcl', 'Tk') - for H in ('Headers', 'Versions/Current/PrivateHeaders') + for H in ('Headers',) ] - # For 8.4a2, the X11 headers are not included. Rather than include a - # complicated search, this is a hard-coded path. It could bail out - # if X11 libs are not found... - include_dirs.append('/usr/X11R6/include') - frameworks = ['-framework', 'Tcl', '-framework', 'Tk'] + # Add the base framework directory as well + compile_args = ['-F', F] - # All existing framework builds of Tcl/Tk don't support 64-bit - # architectures. + # Do not build tkinter for archs that this Tk was not built with. cflags = sysconfig.get_config_vars('CFLAGS')[0] archs = re.findall(r'-arch\s+(\w+)', cflags) @@ -1819,10 +1877,7 @@ class PyBuildExt(build_ext): # Note: cannot use os.popen or subprocess here, that # requires extensions that are not available here. - if is_macosx_sdk_path(F): - os.system("file %s/Tk.framework/Tk | grep 'for architecture' > %s"%(os.path.join(sysroot, F[1:]), tmpfile)) - else: - os.system("file %s/Tk.framework/Tk | grep 'for architecture' > %s"%(F, tmpfile)) + os.system("file %s/Tk.framework/Tk | grep 'for architecture' > %s"%(F, tmpfile)) with open(tmpfile) as fp: detected_archs = [] @@ -1832,16 +1887,26 @@ class PyBuildExt(build_ext): detected_archs.append(ln.split()[-1]) os.unlink(tmpfile) + arch_args = [] for a in detected_archs: - frameworks.append('-arch') - frameworks.append(a) + arch_args.append('-arch') + arch_args.append(a) + + compile_args += arch_args + link_args = [','.join(['-Wl', '-F', F, '-framework', 'Tcl', '-framework', 'Tk'])] + arch_args + + # The X11/xlib.h file bundled in the Tk sources can cause function + # prototype warnings from the compiler. Since we cannot easily fix + # that, suppress the warnings here instead. + if '-Wstrict-prototypes' in cflags.split(): + compile_args.append('-Wno-strict-prototypes') ext = Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'], define_macros=[('WITH_APPINIT', 1)], include_dirs = include_dirs, libraries = [], - extra_compile_args = frameworks[2:], - extra_link_args = frameworks, + extra_compile_args = compile_args, + extra_link_args = link_args, ) self.extensions.append(ext) return 1 -- 2.30.1 (Apple Git-130) 0004-Port-ctypes-and-system-libffi-patches-for-arm64-macO.patch000066400000000000000000000302641517431316200434170ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.6.15/Python-3.6.15From: Christian Hammond Date: Wed, 15 Dec 2021 23:12:36 -0800 Subject: Port ctypes and system libffi patches for arm64/macOS 10.15+ to Python 3.6.15 This ports the following ctypes and libffi pyenv patches for Python 2.7.18 to Python 3.6.15: * `0004-Use-system-libffi-for-Mac-OS-10.15-and-up.patch` * `0005-ctypes-use-the-correct-ABI-for-variadic-functions.patch` * `0006-ctypes-probe-libffi-for-ffi_closure_alloc-and-ffi_pr.patch` These patches enable use of system libffi (fixing a broken `ctypes` module on arm64 targets) and enable calling variadic functions on arm64. They've been combined from patches port from Homebrew to pyenv by Takumi Sueda, updated to work on the Python 3.6.15 codebase. The Homebrew patches are themselves backports of changes in Python 3.9 and 3.10. That patch can be found at: https://github.com/Homebrew/formula-patches/blob/master/python/3.8.7.patch diff --git a/Doc/library/ctypes.rst b/Doc/library/ctypes.rst index a7cc0c84df..f25f3c78d9 100644 --- a/Doc/library/ctypes.rst +++ b/Doc/library/ctypes.rst @@ -1551,6 +1551,13 @@ They are instances of a private class: value usable as argument (integer, string, ctypes instance). This allows defining adapters that can adapt custom objects as function parameters. + .. attribute:: variadic + + Assign a boolean to specify that the function takes a variable number of + arguments. This does not matter on most platforms, but for Apple arm64 + platforms variadic functions have a different calling convention than + normal functions. + .. attribute:: errcheck Assign a Python function or another callable to this attribute. The diff --git a/Lib/test/test_unicode.py b/Lib/test/test_unicode.py index 56ab0ad732..013b1e9ce7 100644 --- a/Lib/test/test_unicode.py +++ b/Lib/test/test_unicode.py @@ -2443,11 +2443,14 @@ class CAPITest(unittest.TestCase): def test_from_format(self): support.import_module('ctypes') from ctypes import ( + c_char_p, pythonapi, py_object, sizeof, c_int, c_long, c_longlong, c_ssize_t, c_uint, c_ulong, c_ulonglong, c_size_t, c_void_p) name = "PyUnicode_FromFormat" _PyUnicode_FromFormat = getattr(pythonapi, name) + _PyUnicode_FromFormat.argtypes = (c_char_p,) + _PyUnicode_FromFormat.variadic = True _PyUnicode_FromFormat.restype = py_object def PyUnicode_FromFormat(format, *args): diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c index 24d64858ed..351f274ad3 100644 --- a/Modules/_ctypes/_ctypes.c +++ b/Modules/_ctypes/_ctypes.c @@ -3120,6 +3120,34 @@ PyCFuncPtr_get_restype(PyCFuncPtrObject *self, void *Py_UNUSED(ignored)) } } +static int +PyCFuncPtr_set_variadic(PyCFuncPtrObject *self, PyObject *ob) +{ + StgDictObject *dict = PyObject_stgdict((PyObject *)self); + assert(dict); + int r = PyObject_IsTrue(ob); + if (r == 1) { + dict->flags |= FUNCFLAG_VARIADIC; + return 0; + } else if (r == 0) { + dict->flags &= ~FUNCFLAG_VARIADIC; + return 0; + } else { + return -1; + } +} + +static PyObject * +PyCFuncPtr_get_variadic(PyCFuncPtrObject *self) +{ + StgDictObject *dict = PyObject_stgdict((PyObject *)self); + assert(dict); /* Cannot be NULL for PyCFuncPtrObject instances */ + if (dict->flags & FUNCFLAG_VARIADIC) + Py_RETURN_TRUE; + else + Py_RETURN_FALSE; +} + static int PyCFuncPtr_set_argtypes(PyCFuncPtrObject *self, PyObject *ob, void *Py_UNUSED(ignored)) { @@ -3166,6 +3194,8 @@ static PyGetSetDef PyCFuncPtr_getsets[] = { { "argtypes", (getter)PyCFuncPtr_get_argtypes, (setter)PyCFuncPtr_set_argtypes, "specify the argument types", NULL }, + { "variadic", (getter)PyCFuncPtr_get_variadic, (setter)PyCFuncPtr_set_variadic, + "specify if function takes variable number of arguments", NULL }, { NULL, NULL } }; @@ -5576,6 +5606,7 @@ PyInit__ctypes(void) PyModule_AddObject(m, "FUNCFLAG_USE_ERRNO", PyLong_FromLong(FUNCFLAG_USE_ERRNO)); PyModule_AddObject(m, "FUNCFLAG_USE_LASTERROR", PyLong_FromLong(FUNCFLAG_USE_LASTERROR)); PyModule_AddObject(m, "FUNCFLAG_PYTHONAPI", PyLong_FromLong(FUNCFLAG_PYTHONAPI)); + PyModule_AddObject(m, "FUNCFLAG_VARIADIC", PyLong_FromLong(FUNCFLAG_VARIADIC)); PyModule_AddStringConstant(m, "__version__", "1.1.0"); PyModule_AddObject(m, "_memmove_addr", PyLong_FromVoidPtr(memmove)); diff --git a/Modules/_ctypes/callproc.c b/Modules/_ctypes/callproc.c index 2bb289bce0..12951eadbf 100644 --- a/Modules/_ctypes/callproc.c +++ b/Modules/_ctypes/callproc.c @@ -752,7 +754,8 @@ static int _call_function_pointer(int flags, ffi_type **atypes, ffi_type *restype, void *resmem, - int argcount) + int argcount, + int argtypecount) { #ifdef WITH_THREAD PyThreadState *_save = NULL; /* For Py_BLOCK_THREADS and Py_UNBLOCK_THREADS */ @@ -780,15 +783,39 @@ static int _call_function_pointer(int flags, if ((flags & FUNCFLAG_CDECL) == 0) cc = FFI_STDCALL; #endif - if (FFI_OK != ffi_prep_cif(&cif, - cc, - argcount, - restype, - atypes)) { - PyErr_SetString(PyExc_RuntimeError, - "ffi_prep_cif failed"); - return -1; + +#if HAVE_FFI_PREP_CIF_VAR + /* Everyone SHOULD set f.variadic=True on variadic function pointers, but + * lots of existing code will not. If there's at least one arg and more + * args are passed than are defined in the prototype, then it must be a + * variadic function. */ + if ((flags & FUNCFLAG_VARIADIC) || + (argtypecount != 0 && argcount > argtypecount)) + { + if (FFI_OK != ffi_prep_cif_var(&cif, + cc, + argtypecount, + argcount, + restype, + atypes)) { + PyErr_SetString(PyExc_RuntimeError, + "ffi_prep_cif_var failed"); + return -1; + } + } else { +#endif + if (FFI_OK != ffi_prep_cif(&cif, + cc, + argcount, + restype, + atypes)) { + PyErr_SetString(PyExc_RuntimeError, + "ffi_prep_cif failed"); + return -1; + } +#if HAVE_FFI_PREP_CIF_VAR } +#endif if (flags & (FUNCFLAG_USE_ERRNO | FUNCFLAG_USE_LASTERROR)) { error_object = _ctypes_get_errobj(&space); @@ -1181,9 +1208,8 @@ PyObject *_ctypes_callproc(PPROC pProc, if (-1 == _call_function_pointer(flags, pProc, avalues, atypes, rtype, resbuf, - Py_SAFE_DOWNCAST(argcount, - Py_ssize_t, - int))) + Py_SAFE_DOWNCAST(argcount, Py_ssize_t, int), + Py_SAFE_DOWNCAST(argtype_count, Py_ssize_t, int))) goto cleanup; #ifdef WORDS_BIGENDIAN diff --git a/Modules/_ctypes/ctypes.h b/Modules/_ctypes/ctypes.h index 5d3b966338..1299ec25aa 100644 --- a/Modules/_ctypes/ctypes.h +++ b/Modules/_ctypes/ctypes.h @@ -285,6 +285,7 @@ PyObject *_ctypes_callproc(PPROC pProc, #define FUNCFLAG_PYTHONAPI 0x4 #define FUNCFLAG_USE_ERRNO 0x8 #define FUNCFLAG_USE_LASTERROR 0x10 +#define FUNCFLAG_VARIADIC 0x20 #define TYPEFLAG_ISPOINTER 0x100 #define TYPEFLAG_HASPOINTER 0x200 diff --git a/setup.py b/setup.py index 8e03c77997..3b124c4b7b 100644 --- a/setup.py +++ b/setup.py @@ -167,6 +167,13 @@ def macosx_sdk_specified(): macosx_sdk_root() return MACOS_SDK_SPECIFIED +def is_macosx_at_least(vers): + if host_platform == 'darwin': + dep_target = sysconfig.get_config_var('MACOSX_DEPLOYMENT_TARGET') + if dep_target: + return tuple(map(int, str(dep_target).split('.'))) >= vers + return False + def is_macosx_sdk_path(path): """ Returns True if 'path' can be located in an OSX SDK @@ -175,6 +182,13 @@ def is_macosx_sdk_path(path): or path.startswith('/System/') or path.startswith('/Library/') ) +def grep_headers_for(function, headers): + for header in headers: + with open(header, 'r') as f: + if function in f.read(): + return True + return False + def find_file(filename, std_dirs, paths): """Searches for the directory where a given file is located, and returns a possibly-empty list of additional directories, or None @@ -2115,7 +2129,11 @@ class PyBuildExt(build_ext): return True def detect_ctypes(self, inc_dirs, lib_dirs): - self.use_system_libffi = False + if not sysconfig.get_config_var("LIBFFI_INCLUDEDIR") and is_macosx_at_least((10,15)): + self.use_system_libffi = True + else: + self.use_system_libffi = '--with-system-ffi' in sysconfig.get_config_var("CONFIG_ARGS") + include_dirs = [] extra_compile_args = [] extra_link_args = [] @@ -2162,20 +2180,29 @@ class PyBuildExt(build_ext): libraries=math_libs) self.extensions.extend([ext, ext_test]) + ffi_inc = sysconfig.get_config_var("LIBFFI_INCLUDEDIR") + ffi_lib = None + if host_platform == 'darwin': - if '--with-system-ffi' not in sysconfig.get_config_var("CONFIG_ARGS"): - return - # OS X 10.5 comes with libffi.dylib; the include files are - # in /usr/include/ffi - inc_dirs.append('/usr/include/ffi') + if not self.use_system_libffi: + return + ffi_in_sdk = os.path.join(macosx_sdk_root(), "usr/include/ffi") + if os.path.exists(ffi_in_sdk): + ffi_inc = ffi_in_sdk + ffi_lib = 'ffi' + else: + # OS X 10.5 comes with libffi.dylib; the include files are + # in /usr/include/ffi + inc_dirs.append('/usr/include/ffi') elif '--without-system-ffi' in sysconfig.get_config_var("CONFIG_ARGS"): return - ffi_inc = [sysconfig.get_config_var("LIBFFI_INCLUDEDIR")] - if not ffi_inc or ffi_inc[0] == '': - ffi_inc = find_file('ffi.h', [], inc_dirs) - if ffi_inc is not None: - ffi_h = ffi_inc[0] + '/ffi.h' + if not ffi_inc: + found = find_file('ffi.h', [], inc_dirs) + if found: + ffi_inc = found[0] + if ffi_inc: + ffi_h = ffi_inc + '/ffi.h' with open(ffi_h) as f: for line in f: line = line.strip() @@ -2186,15 +2213,22 @@ class PyBuildExt(build_ext): ffi_inc = None print('Header file {} does not define LIBFFI_H or ' 'ffi_wrapper_h'.format(ffi_h)) - ffi_lib = None - if ffi_inc is not None: + if ffi_lib is None and ffi_inc is not None: for lib_name in ('ffi', 'ffi_pic'): if (self.compiler.find_library_file(lib_dirs, lib_name)): ffi_lib = lib_name break if ffi_inc and ffi_lib: - ext.include_dirs.extend(ffi_inc) + ffi_headers = glob(os.path.join(ffi_inc, '*.h')) + if grep_headers_for('ffi_closure_alloc', ffi_headers): + try: + sources.remove('_ctypes/malloc_closure.c') + except ValueError: + pass + if grep_headers_for('ffi_prep_cif_var', ffi_headers): + ext.extra_compile_args.append("-DHAVE_FFI_PREP_CIF_VAR=1") + ext.include_dirs.append(ffi_inc) ext.libraries.append(ffi_lib) self.use_system_libffi = True -- 2.30.1 (Apple Git-130) 0005-BPO-41100-Support-macOS-11-when-building-GH-21113.patch000066400000000000000000000036521517431316200413070ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.6.15/Python-3.6.15From 8ea6353f60625c96ce96588c70ff24a77f8c71f9 Mon Sep 17 00:00:00 2001 From: Ronald Oussoren Date: Thu, 25 Jun 2020 16:55:48 +0200 Subject: [PATCH] BPO-41100: Support macOS 11 when building (GH-21113) --- Misc/NEWS.d/next/macOS/2020-06-24-13-51-57.bpo-41100.mcHdc5.rst | 1 + configure | 2 +- configure.ac | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/macOS/2020-06-24-13-51-57.bpo-41100.mcHdc5.rst diff --git a/Misc/NEWS.d/next/macOS/2020-06-24-13-51-57.bpo-41100.mcHdc5.rst b/Misc/NEWS.d/next/macOS/2020-06-24-13-51-57.bpo-41100.mcHdc5.rst new file mode 100644 index 0000000000..ded66b567a --- /dev/null +++ b/Misc/NEWS.d/next/macOS/2020-06-24-13-51-57.bpo-41100.mcHdc5.rst @@ -0,0 +1 @@ +Support macOS 11 when building. diff --git a/configure b/configure index c51f396824..5024860ca4 100755 --- a/configure +++ b/configure @@ -3375,7 +3375,7 @@ $as_echo "#define _BSD_SOURCE 1" >>confdefs.h # has no effect, don't bother defining them Darwin/[6789].*) define_xopen_source=no;; - Darwin/1[0-9].*) + Darwin/[12][0-9].*) define_xopen_source=no;; # On AIX 4 and 5.1, mbstate_t is defined only when _XOPEN_SOURCE == 500 but # used in wcsnrtombs() and mbsnrtowcs() even if _XOPEN_SOURCE is not defined diff --git a/configure.ac b/configure.ac index 70deefb6b9..5a3e340aa3 100644 --- a/configure.ac +++ b/configure.ac @@ -495,7 +495,7 @@ case $ac_sys_system/$ac_sys_release in # has no effect, don't bother defining them Darwin/@<:@6789@:>@.*) define_xopen_source=no;; - Darwin/1@<:@0-9@:>@.*) + Darwin/@<:@[12]@:>@@<:@0-9@:>@.*) define_xopen_source=no;; # On AIX 4 and 5.1, mbstate_t is defined only when _XOPEN_SOURCE == 500 but # used in wcsnrtombs() and mbsnrtowcs() even if _XOPEN_SOURCE is not defined -- 2.30.1 (Apple Git-130) 0006-bpo-41100-fix-_decimal-for-arm64-Mac-OS-GH-21228.patch000066400000000000000000000027101517431316200410750ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.6.15/Python-3.6.15From 604d95e235d86465b8c17f02095edcaf18464d4c Mon Sep 17 00:00:00 2001 From: Lawrence D'Anna <64555057+lawrence-danna-apple@users.noreply.github.com> Date: Tue, 30 Jun 2020 02:15:46 -0700 Subject: [PATCH] bpo-41100: fix _decimal for arm64 Mac OS (GH-21228) Patch by Lawrence Danna. --- .../Core and Builtins/2020-06-30-04-44-29.bpo-41100.PJwA6F.rst | 1 + Modules/_decimal/libmpdec/mpdecimal.h | 3 +++ 2 files changed, 4 insertions(+) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-06-30-04-44-29.bpo-41100.PJwA6F.rst diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-06-30-04-44-29.bpo-41100.PJwA6F.rst b/Misc/NEWS.d/next/Core and Builtins/2020-06-30-04-44-29.bpo-41100.PJwA6F.rst new file mode 100644 index 0000000000..d6176d69f0 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-06-30-04-44-29.bpo-41100.PJwA6F.rst @@ -0,0 +1 @@ +add arm64 to the allowable Mac OS arches in mpdecimal.h \ No newline at end of file diff --git a/Modules/_decimal/libmpdec/mpdecimal.h b/Modules/_decimal/libmpdec/mpdecimal.h index 108b76efa8..35ce429f60 100644 --- a/Modules/_decimal/libmpdec/mpdecimal.h +++ b/Modules/_decimal/libmpdec/mpdecimal.h @@ -135,6 +135,9 @@ const char *mpd_version(void); #elif defined(__x86_64__) #define CONFIG_64 #define ASM + #elif defined(__arm64__) + #define CONFIG_64 + #define ANSI #else #error "unknown architecture for universal build." #endif -- 2.30.1 (Apple Git-130) 0007-bpo-42351-Avoid-error-when-opening-header-with-non-U.patch000066400000000000000000000016101517431316200430420ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.6.15/Python-3.6.15From d9782f66445c9fa5d835ad29c23b22be85cde354 Mon Sep 17 00:00:00 2001 From: Ronald Oussoren Date: Sat, 14 Nov 2020 16:07:47 +0100 Subject: [PATCH] bpo-42351: Avoid error when opening header with non-UTF8 encoding (GH-23279) grep_headers_for() would error out when a header contained text that cannot be interpreted as UTF-8. cherry-picked from 7a27c7ed4b by Pedro Fonini --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 4aaa51e0d4..3556bbe041 100644 --- a/setup.py +++ b/setup.py @@ -184,7 +184,7 @@ def is_macosx_sdk_path(path): def grep_headers_for(function, headers): for header in headers: - with open(header, 'r') as f: + with open(header, 'r', errors='surrogateescape') as f: if function in f.read(): return True return False -- 2.34.1 0008-bpo-45405-Prevent-internal-configure-error-when-runn.patch000066400000000000000000000061011517431316200433520ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.6.15/Python-3.6.15From 655f26bb742d6bd32c388e9fea14b64eb25fd4de Mon Sep 17 00:00:00 2001 From: Ned Deily Date: Tue, 15 Mar 2022 03:18:39 -0400 Subject: [PATCH] bpo-45405: Prevent internal configure error when running configure with recent versions of clang. (GH-28845) (GH-31890) Change the configure logic to function properly on macOS when the compiler outputs a platform triplet for option --print-multiarch. The Apple Clang included with Xcode 13.3 now supports --print-multiarch causing configure to fail without this change. Co-authored-by: Ned Deily (cherry picked from commit 9c4766772cda67648184f8ddba546a5fc0167f91) Co-authored-by: David Bohman (cherry picked from commit 720bb456dc711b0776bae837d1f9a0b10c28ddf2) --- .../next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst | 2 ++ configure | 8 +++++--- configure.ac | 8 +++++--- 3 files changed, 12 insertions(+), 6 deletions(-) create mode 100644 Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst diff --git a/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst b/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst new file mode 100644 index 0000000000..13c93d1b8a --- /dev/null +++ b/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst @@ -0,0 +1,2 @@ +Prevent ``internal configure error`` when running ``configure`` +with recent versions of clang. Patch by David Bohman. diff --git a/configure b/configure index fb0a499145..67e6e69b5f 100755 --- a/configure +++ b/configure @@ -5203,9 +5203,6 @@ $as_echo "$as_me: fi -MULTIARCH=$($CC --print-multiarch 2>/dev/null) - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the platform triplet based on compiler characteristics" >&5 $as_echo_n "checking for the platform triplet based on compiler characteristics... " >&6; } cat >> conftest.c <&6; } fi rm -f conftest.c conftest.out +if test x$PLATFORM_TRIPLET != xdarwin; then + MULTIARCH=$($CC --print-multiarch 2>/dev/null) +fi + + if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then if test x$PLATFORM_TRIPLET != x$MULTIARCH; then as_fn_error $? "internal configure error for the platform triplet, please file a bug report" "$LINENO" 5 diff --git a/configure.ac b/configure.ac index d86dad9a7c..468ad6070f 100644 --- a/configure.ac +++ b/configure.ac @@ -747,9 +747,6 @@ then fi -MULTIARCH=$($CC --print-multiarch 2>/dev/null) -AC_SUBST(MULTIARCH) - AC_MSG_CHECKING([for the platform triplet based on compiler characteristics]) cat >> conftest.c </dev/null) +fi +AC_SUBST(MULTIARCH) + if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then if test x$PLATFORM_TRIPLET != x$MULTIARCH; then AC_MSG_ERROR([internal configure error for the platform triplet, please file a bug report]) -- 2.32.0 (Apple Git-132) 0009-bpo-27987-pymalloc-align-by-16bytes-on-64bit-platfor.patch000066400000000000000000000032351517431316200427350ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.6.15/Python-3.6.15From 54dc627769bf112b0181972a52c4b45e4a02da57 Mon Sep 17 00:00:00 2001 From: Inada Naoki Date: Tue, 14 May 2019 18:51:15 +0900 Subject: [PATCH 09/10] bpo-27987: pymalloc: align by 16bytes on 64bit platform (GH-12850) --- .../2019-04-16-11-52-21.bpo-27987.n2_DcQ.rst | 3 +++ Objects/obmalloc.c | 6 ++++++ 2 files changed, 9 insertions(+) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2019-04-16-11-52-21.bpo-27987.n2_DcQ.rst diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-04-16-11-52-21.bpo-27987.n2_DcQ.rst b/Misc/NEWS.d/next/Core and Builtins/2019-04-16-11-52-21.bpo-27987.n2_DcQ.rst new file mode 100644 index 0000000000..b0f32a5c6c --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-04-16-11-52-21.bpo-27987.n2_DcQ.rst @@ -0,0 +1,3 @@ +pymalloc returns memory blocks aligned by 16 bytes, instead of 8 bytes, on +64-bit platforms to conform x86-64 ABI. Recent compilers assume this alignment +more often. Patch by Inada Naoki. diff --git a/Objects/obmalloc.c b/Objects/obmalloc.c index d46d149311..47283354f4 100644 --- a/Objects/obmalloc.c +++ b/Objects/obmalloc.c @@ -650,8 +650,14 @@ static int running_on_valgrind = -1; * * You shouldn't change this unless you know what you are doing. */ + +#if SIZEOF_VOID_P > 4 +#define ALIGNMENT 16 /* must be 2^N */ +#define ALIGNMENT_SHIFT 4 +#else #define ALIGNMENT 8 /* must be 2^N */ #define ALIGNMENT_SHIFT 3 +#endif /* Return the number of bytes in size class I, as a uint. */ #define INDEX2SIZE(I) (((uint)(I) + 1) << ALIGNMENT_SHIFT) -- 2.38.4 0010-bpo-27987-align-PyGC_Head-to-alignof-long-double-GH-.patch000066400000000000000000000031701517431316200425310ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.6.15/Python-3.6.15From e68ff170dc6764b22886e703f583fb53e90367ef Mon Sep 17 00:00:00 2001 From: Inada Naoki Date: Sat, 25 May 2019 21:13:33 +0900 Subject: [PATCH 10/10] bpo-27987: align PyGC_Head to alignof(long double) (GH-13335) --- Include/objimpl.h | 6 +++++- .../2019-05-15-18-28-43.bpo-27987.FaxuLy.rst | 2 ++ 2 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2019-05-15-18-28-43.bpo-27987.FaxuLy.rst diff --git a/Include/objimpl.h b/Include/objimpl.h index e7a3696d7a..90d71b87ea 100644 --- a/Include/objimpl.h +++ b/Include/objimpl.h @@ -255,7 +255,11 @@ typedef union _gc_head { union _gc_head *gc_prev; Py_ssize_t gc_refs; } gc; - double dummy; /* force worst-case alignment */ + long double dummy; /* force worst-case alignment */ + // malloc returns memory block aligned for any built-in types and + // long double is the largest standard C type. + // On amd64 linux, long double requires 16 byte alignment. + // See bpo-27987 for more discussion. } PyGC_Head; extern PyGC_Head *_PyGC_generation0; diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-05-15-18-28-43.bpo-27987.FaxuLy.rst b/Misc/NEWS.d/next/Core and Builtins/2019-05-15-18-28-43.bpo-27987.FaxuLy.rst new file mode 100644 index 0000000000..97ca37b262 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-05-15-18-28-43.bpo-27987.FaxuLy.rst @@ -0,0 +1,2 @@ +``PyGC_Head`` structure is aligned to ``long double``. This is needed to +GC-ed objects are aligned properly. Patch by Inada Naoki. -- 2.38.4 0011-bpo-36106-Resolve-sinpi-name-clash-with-libm-IEEE-75.patch000066400000000000000000000047741517431316200424730ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.6.15/Python-3.6.15From f57cd8288dbe6aba99c057f37ad6d58f8db75350 Mon Sep 17 00:00:00 2001 From: Dima Pasechnik Date: Tue, 26 Feb 2019 06:36:11 +0000 Subject: [PATCH] bpo-36106: Resolve sinpi name clash with libm (IEEE-754 violation). (GH-12027) The standard math library (libm) may follow IEEE-754 recommendation to include an implementation of sinPi(), i.e. sinPi(x):=sin(pi*x). And this triggers a name clash, found by FreeBSD developer Steve Kargl, who worken on putting sinpi into libm used on FreeBSD (it has to be named "sinpi", not "sinPi", cf. e.g. https://en.cppreference.com/w/c/experimental/fpext4). --- .../next/Library/2019-02-25-13-21-43.bpo-36106.VuhEiQ.rst | 1 + Modules/mathmodule.c | 8 ++++---- 2 files changed, 5 insertions(+), 4 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2019-02-25-13-21-43.bpo-36106.VuhEiQ.rst diff --git a/Misc/NEWS.d/next/Library/2019-02-25-13-21-43.bpo-36106.VuhEiQ.rst b/Misc/NEWS.d/next/Library/2019-02-25-13-21-43.bpo-36106.VuhEiQ.rst new file mode 100644 index 00000000000..36e17508cd4 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-02-25-13-21-43.bpo-36106.VuhEiQ.rst @@ -0,0 +1 @@ +Resolve potential name clash with libm's sinpi(). Patch by Dmitrii Pasechnik. diff --git a/Modules/mathmodule.c b/Modules/mathmodule.c index 2272f622f0b..fd0eb327c74 100644 --- a/Modules/mathmodule.c +++ b/Modules/mathmodule.c @@ -100,7 +100,7 @@ static const double sqrtpi = 1.772453850905516027298167483341145182798; } static double -sinpi(double x) +m_sinpi(double x) { double y, r; int n; @@ -328,7 +328,7 @@ m_tgamma(double x) integer. */ if (absx > 200.0) { if (x < 0.0) { - return 0.0/sinpi(x); + return 0.0/m_sinpi(x); } else { errno = ERANGE; @@ -352,7 +352,7 @@ m_tgamma(double x) } z = z * lanczos_g / y; if (x < 0.0) { - r = -pi / sinpi(absx) / absx * exp(y) / lanczos_sum(absx); + r = -pi / m_sinpi(absx) / absx * exp(y) / lanczos_sum(absx); r -= z * r; if (absx < 140.0) { r /= pow(y, absx - 0.5); @@ -423,7 +423,7 @@ m_lgamma(double x) r += (absx - 0.5) * (log(absx + lanczos_g - 0.5) - 1); if (x < 0.0) /* Use reflection formula to get value for negative x. */ - r = logpi - log(fabs(sinpi(absx))) - log(absx) - r; + r = logpi - log(fabs(m_sinpi(absx))) - log(absx) - r; if (Py_IS_INFINITY(r)) errno = ERANGE; return r; -- 2.36.1.windows.1 pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.7.10/000077500000000000000000000000001517431316200262715ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.7.10/Python-3.7.10/000077500000000000000000000000001517431316200302765ustar00rootroot000000000000000001-bpo-45405-Prevent-internal-configure-error-when-runn.patch000066400000000000000000000054361517431316200433450ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.7.10/Python-3.7.10From 35ddc7ad61b20a18496ba9410aa31b405e23fe78 Mon Sep 17 00:00:00 2001 From: David Bohman Date: Tue, 12 Oct 2021 17:10:26 -0700 Subject: [PATCH] bpo-45405: Prevent ``internal configure error`` when running ``configure`` with recent versions of non-Apple clang. (#28845) Change the configure logic to function properly on macOS when the compiler outputs a platform triplet for option --print-multiarch. Co-authored-by: Ned Deily --- .../next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst | 2 ++ configure | 8 +++++--- configure.ac | 8 +++++--- 3 files changed, 12 insertions(+), 6 deletions(-) create mode 100644 Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst diff --git a/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst b/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst new file mode 100644 index 0000000000..a2dc5bcc32 --- /dev/null +++ b/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst @@ -0,0 +1,2 @@ +Prevent ``internal configure error`` when running ``configure`` +with recent versions of non-Apple clang. Patch by David Bohman. diff --git a/configure b/configure index 829dd69bb8..455481bc50 100755 --- a/configure +++ b/configure @@ -5183,9 +5183,6 @@ $as_echo "$as_me: fi -MULTIARCH=$($CC --print-multiarch 2>/dev/null) - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the platform triplet based on compiler characteristics" >&5 $as_echo_n "checking for the platform triplet based on compiler characteristics... " >&6; } cat >> conftest.c <&6; } fi rm -f conftest.c conftest.out +if test x$PLATFORM_TRIPLET != xdarwin; then + MULTIARCH=$($CC --print-multiarch 2>/dev/null) +fi + + if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then if test x$PLATFORM_TRIPLET != x$MULTIARCH; then as_fn_error $? "internal configure error for the platform triplet, please file a bug report" "$LINENO" 5 diff --git a/configure.ac b/configure.ac index f1cc8e9bcb..1afcba3307 100644 --- a/configure.ac +++ b/configure.ac @@ -724,9 +724,6 @@ then fi -MULTIARCH=$($CC --print-multiarch 2>/dev/null) -AC_SUBST(MULTIARCH) - AC_MSG_CHECKING([for the platform triplet based on compiler characteristics]) cat >> conftest.c </dev/null) +fi +AC_SUBST(MULTIARCH) + if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then if test x$PLATFORM_TRIPLET != x$MULTIARCH; then AC_MSG_ERROR([internal configure error for the platform triplet, please file a bug report]) -- 2.29.2.windows.2 pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.7.11/000077500000000000000000000000001517431316200262725ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.7.11/Python-3.7.11/000077500000000000000000000000001517431316200303005ustar00rootroot000000000000000001-bpo-45405-Prevent-internal-configure-error-when-runn.patch000066400000000000000000000054361517431316200433470ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.7.11/Python-3.7.11From 0c2fd7c1de5121ea636134f131cf7ebada023acf Mon Sep 17 00:00:00 2001 From: David Bohman Date: Tue, 12 Oct 2021 17:10:26 -0700 Subject: [PATCH] bpo-45405: Prevent ``internal configure error`` when running ``configure`` with recent versions of non-Apple clang. (#28845) Change the configure logic to function properly on macOS when the compiler outputs a platform triplet for option --print-multiarch. Co-authored-by: Ned Deily --- .../next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst | 2 ++ configure | 8 +++++--- configure.ac | 8 +++++--- 3 files changed, 12 insertions(+), 6 deletions(-) create mode 100644 Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst diff --git a/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst b/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst new file mode 100644 index 0000000000..a2dc5bcc32 --- /dev/null +++ b/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst @@ -0,0 +1,2 @@ +Prevent ``internal configure error`` when running ``configure`` +with recent versions of non-Apple clang. Patch by David Bohman. diff --git a/configure b/configure index 829dd69bb8..455481bc50 100755 --- a/configure +++ b/configure @@ -5183,9 +5183,6 @@ $as_echo "$as_me: fi -MULTIARCH=$($CC --print-multiarch 2>/dev/null) - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the platform triplet based on compiler characteristics" >&5 $as_echo_n "checking for the platform triplet based on compiler characteristics... " >&6; } cat >> conftest.c <&6; } fi rm -f conftest.c conftest.out +if test x$PLATFORM_TRIPLET != xdarwin; then + MULTIARCH=$($CC --print-multiarch 2>/dev/null) +fi + + if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then if test x$PLATFORM_TRIPLET != x$MULTIARCH; then as_fn_error $? "internal configure error for the platform triplet, please file a bug report" "$LINENO" 5 diff --git a/configure.ac b/configure.ac index f1cc8e9bcb..1afcba3307 100644 --- a/configure.ac +++ b/configure.ac @@ -724,9 +724,6 @@ then fi -MULTIARCH=$($CC --print-multiarch 2>/dev/null) -AC_SUBST(MULTIARCH) - AC_MSG_CHECKING([for the platform triplet based on compiler characteristics]) cat >> conftest.c </dev/null) +fi +AC_SUBST(MULTIARCH) + if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then if test x$PLATFORM_TRIPLET != x$MULTIARCH; then AC_MSG_ERROR([internal configure error for the platform triplet, please file a bug report]) -- 2.29.2.windows.2 pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.7.12/000077500000000000000000000000001517431316200262735ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.7.12/Python-3.7.12/000077500000000000000000000000001517431316200303025ustar00rootroot000000000000000001-Port-ctypes-and-system-libffi-patches-for-arm64-macO.patch000066400000000000000000000276401517431316200434140ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.7.12/Python-3.7.12From: Christian Hammond Date: Wed, 15 Dec 2021 23:12:36 -0800 Subject: Port ctypes and system libffi patches for arm64/macOS 10.15+ to Python 3.7.12 This ports the following ctypes and libffi pyenv patches for Python 2.7.18 to Python 3.7.12: * `0004-Use-system-libffi-for-Mac-OS-10.15-and-up.patch` * `0005-ctypes-use-the-correct-ABI-for-variadic-functions.patch` * `0006-ctypes-probe-libffi-for-ffi_closure_alloc-and-ffi_pr.patch` These patches enable use of system libffi (fixing a broken `ctypes` module on arm64 targets) and enable calling variadic functions on arm64. They've been combined from patches port from Homebrew to pyenv by Takumi Sueda, updated to work on the Python 3.7.12 codebase. The Homebrew patches are themselves backports of changes in Python 3.9 and 3.10. That patch can be found at: https://github.com/Homebrew/formula-patches/blob/master/python/3.8.7.patch diff --git a/Doc/library/ctypes.rst b/Doc/library/ctypes.rst index 715d595b24..7743144978 100644 --- a/Doc/library/ctypes.rst +++ b/Doc/library/ctypes.rst @@ -1551,6 +1551,13 @@ They are instances of a private class: value usable as argument (integer, string, ctypes instance). This allows defining adapters that can adapt custom objects as function parameters. + .. attribute:: variadic + + Assign a boolean to specify that the function takes a variable number of + arguments. This does not matter on most platforms, but for Apple arm64 + platforms variadic functions have a different calling convention than + normal functions. + .. attribute:: errcheck Assign a Python function or another callable to this attribute. The diff --git a/Lib/test/test_unicode.py b/Lib/test/test_unicode.py index 4ebd82d3e0..7b73c190b6 100644 --- a/Lib/test/test_unicode.py +++ b/Lib/test/test_unicode.py @@ -2458,11 +2458,14 @@ class CAPITest(unittest.TestCase): def test_from_format(self): support.import_module('ctypes') from ctypes import ( + c_char_p, pythonapi, py_object, sizeof, c_int, c_long, c_longlong, c_ssize_t, c_uint, c_ulong, c_ulonglong, c_size_t, c_void_p) name = "PyUnicode_FromFormat" _PyUnicode_FromFormat = getattr(pythonapi, name) + _PyUnicode_FromFormat.argtypes = (c_char_p,) + _PyUnicode_FromFormat.variadic = True _PyUnicode_FromFormat.restype = py_object def PyUnicode_FromFormat(format, *args): diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c index dd0c61fd8a..79137e1dc7 100644 --- a/Modules/_ctypes/_ctypes.c +++ b/Modules/_ctypes/_ctypes.c @@ -3174,6 +3174,34 @@ PyCFuncPtr_get_restype(PyCFuncPtrObject *self, void *Py_UNUSED(ignored)) } } +static int +PyCFuncPtr_set_variadic(PyCFuncPtrObject *self, PyObject *ob) +{ + StgDictObject *dict = PyObject_stgdict((PyObject *)self); + assert(dict); + int r = PyObject_IsTrue(ob); + if (r == 1) { + dict->flags |= FUNCFLAG_VARIADIC; + return 0; + } else if (r == 0) { + dict->flags &= ~FUNCFLAG_VARIADIC; + return 0; + } else { + return -1; + } +} + +static PyObject * +PyCFuncPtr_get_variadic(PyCFuncPtrObject *self) +{ + StgDictObject *dict = PyObject_stgdict((PyObject *)self); + assert(dict); /* Cannot be NULL for PyCFuncPtrObject instances */ + if (dict->flags & FUNCFLAG_VARIADIC) + Py_RETURN_TRUE; + else + Py_RETURN_FALSE; +} + static int PyCFuncPtr_set_argtypes(PyCFuncPtrObject *self, PyObject *ob, void *Py_UNUSED(ignored)) { @@ -3219,6 +3247,8 @@ static PyGetSetDef PyCFuncPtr_getsets[] = { { "argtypes", (getter)PyCFuncPtr_get_argtypes, (setter)PyCFuncPtr_set_argtypes, "specify the argument types", NULL }, + { "variadic", (getter)PyCFuncPtr_get_variadic, (setter)PyCFuncPtr_set_variadic, + "specify if function takes variable number of arguments", NULL }, { NULL, NULL } }; @@ -5632,6 +5662,7 @@ PyInit__ctypes(void) PyModule_AddObject(m, "FUNCFLAG_USE_ERRNO", PyLong_FromLong(FUNCFLAG_USE_ERRNO)); PyModule_AddObject(m, "FUNCFLAG_USE_LASTERROR", PyLong_FromLong(FUNCFLAG_USE_LASTERROR)); PyModule_AddObject(m, "FUNCFLAG_PYTHONAPI", PyLong_FromLong(FUNCFLAG_PYTHONAPI)); + PyModule_AddObject(m, "FUNCFLAG_VARIADIC", PyLong_FromLong(FUNCFLAG_VARIADIC)); PyModule_AddStringConstant(m, "__version__", "1.1.0"); PyModule_AddObject(m, "_memmove_addr", PyLong_FromVoidPtr(memmove)); diff --git a/Modules/_ctypes/callproc.c b/Modules/_ctypes/callproc.c index 9cbf9801ad..e7fe11176b 100644 --- a/Modules/_ctypes/callproc.c +++ b/Modules/_ctypes/callproc.c @@ -754,7 +756,8 @@ static int _call_function_pointer(int flags, ffi_type **atypes, ffi_type *restype, void *resmem, - int argcount) + int argcount, + int argtypecount) { PyThreadState *_save = NULL; /* For Py_BLOCK_THREADS and Py_UNBLOCK_THREADS */ PyObject *error_object = NULL; @@ -780,15 +783,39 @@ static int _call_function_pointer(int flags, if ((flags & FUNCFLAG_CDECL) == 0) cc = FFI_STDCALL; #endif - if (FFI_OK != ffi_prep_cif(&cif, - cc, - argcount, - restype, - atypes)) { - PyErr_SetString(PyExc_RuntimeError, - "ffi_prep_cif failed"); - return -1; + +#if HAVE_FFI_PREP_CIF_VAR + /* Everyone SHOULD set f.variadic=True on variadic function pointers, but + * lots of existing code will not. If there's at least one arg and more + * args are passed than are defined in the prototype, then it must be a + * variadic function. */ + if ((flags & FUNCFLAG_VARIADIC) || + (argtypecount != 0 && argcount > argtypecount)) + { + if (FFI_OK != ffi_prep_cif_var(&cif, + cc, + argtypecount, + argcount, + restype, + atypes)) { + PyErr_SetString(PyExc_RuntimeError, + "ffi_prep_cif_var failed"); + return -1; + } + } else { +#endif + if (FFI_OK != ffi_prep_cif(&cif, + cc, + argcount, + restype, + atypes)) { + PyErr_SetString(PyExc_RuntimeError, + "ffi_prep_cif failed"); + return -1; + } +#if HAVE_FFI_PREP_CIF_VAR } +#endif if (flags & (FUNCFLAG_USE_ERRNO | FUNCFLAG_USE_LASTERROR)) { error_object = _ctypes_get_errobj(&space); @@ -1187,9 +1214,8 @@ PyObject *_ctypes_callproc(PPROC pProc, if (-1 == _call_function_pointer(flags, pProc, avalues, atypes, rtype, resbuf, - Py_SAFE_DOWNCAST(argcount, - Py_ssize_t, - int))) + Py_SAFE_DOWNCAST(argcount, Py_ssize_t, int), + Py_SAFE_DOWNCAST(argtype_count, Py_ssize_t, int))) goto cleanup; #ifdef WORDS_BIGENDIAN diff --git a/Modules/_ctypes/ctypes.h b/Modules/_ctypes/ctypes.h index e58f85233c..e45975f6ad 100644 --- a/Modules/_ctypes/ctypes.h +++ b/Modules/_ctypes/ctypes.h @@ -285,6 +285,7 @@ PyObject *_ctypes_callproc(PPROC pProc, #define FUNCFLAG_PYTHONAPI 0x4 #define FUNCFLAG_USE_ERRNO 0x8 #define FUNCFLAG_USE_LASTERROR 0x10 +#define FUNCFLAG_VARIADIC 0x20 #define TYPEFLAG_ISPOINTER 0x100 #define TYPEFLAG_HASPOINTER 0x200 diff --git a/setup.py b/setup.py index bf90600eaa..48ff120e9a 100644 --- a/setup.py +++ b/setup.py @@ -142,6 +142,13 @@ def macosx_sdk_root(): return MACOS_SDK_ROOT +def is_macosx_at_least(vers): + if host_platform == 'darwin': + dep_target = sysconfig.get_config_var('MACOSX_DEPLOYMENT_TARGET') + if dep_target: + return tuple(map(int, str(dep_target).split('.'))) >= vers + return False + def is_macosx_sdk_path(path): """ Returns True if 'path' can be located in an OSX SDK @@ -150,6 +157,13 @@ def is_macosx_sdk_path(path): or path.startswith('/System/') or path.startswith('/Library/') ) +def grep_headers_for(function, headers): + for header in headers: + with open(header, 'r') as f: + if function in f.read(): + return True + return False + def find_file(filename, std_dirs, paths): """Searches for the directory where a given file is located, and returns a possibly-empty list of additional directories, or None @@ -1972,7 +1986,11 @@ class PyBuildExt(build_ext): return True def detect_ctypes(self, inc_dirs, lib_dirs): - self.use_system_libffi = False + if not sysconfig.get_config_var("LIBFFI_INCLUDEDIR") and is_macosx_at_least((10,15)): + self.use_system_libffi = True + else: + self.use_system_libffi = '--with-system-ffi' in sysconfig.get_config_var("CONFIG_ARGS") + include_dirs = [] extra_compile_args = [] extra_link_args = [] @@ -2018,30 +2036,47 @@ class PyBuildExt(build_ext): libraries=['m']) self.extensions.extend([ext, ext_test]) + ffi_inc = sysconfig.get_config_var("LIBFFI_INCLUDEDIR") + ffi_lib = None + if host_platform == 'darwin': - if '--with-system-ffi' not in sysconfig.get_config_var("CONFIG_ARGS"): + if not self.use_system_libffi: return - # OS X 10.5 comes with libffi.dylib; the include files are - # in /usr/include/ffi - inc_dirs.append('/usr/include/ffi') - - ffi_inc = [sysconfig.get_config_var("LIBFFI_INCLUDEDIR")] - if not ffi_inc or ffi_inc[0] == '': - ffi_inc = find_file('ffi.h', [], inc_dirs) - if ffi_inc is not None: - ffi_h = ffi_inc[0] + '/ffi.h' + ffi_in_sdk = os.path.join(macosx_sdk_root(), "usr/include/ffi") + if os.path.exists(ffi_in_sdk): + ffi_inc = ffi_in_sdk + ffi_lib = 'ffi' + else: + # OS X 10.5 comes with libffi.dylib; the include files are + # in /usr/include/ffi + inc_dirs.append('/usr/include/ffi') + + if not ffi_inc: + found = find_file('ffi.h', [], inc_dirs) + if found: + ffi_inc = found[0] + if ffi_inc: + ffi_h = ffi_inc + '/ffi.h' if not os.path.exists(ffi_h): ffi_inc = None print('Header file {} does not exist'.format(ffi_h)) - ffi_lib = None - if ffi_inc is not None: - for lib_name in ('ffi', 'ffi_pic'): + + if ffi_lib is None and ffi_inc: + for lib_name in ('ffi_convenience', 'ffi_pic', 'ffi'): if (self.compiler.find_library_file(lib_dirs, lib_name)): ffi_lib = lib_name break if ffi_inc and ffi_lib: - ext.include_dirs.extend(ffi_inc) + ffi_headers = glob(os.path.join(ffi_inc, '*.h')) + if grep_headers_for('ffi_closure_alloc', ffi_headers): + try: + sources.remove('_ctypes/malloc_closure.c') + except ValueError: + pass + if grep_headers_for('ffi_prep_cif_var', ffi_headers): + ext.extra_compile_args.append("-DHAVE_FFI_PREP_CIF_VAR=1") + ext.include_dirs.append(ffi_inc) ext.libraries.append(ffi_lib) self.use_system_libffi = True -- 2.30.1 (Apple Git-130) 0002-bpo-41100-fix-_decimal-for-arm64-Mac-OS-GH-21228.patch000066400000000000000000000027071517431316200410730ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.7.12/Python-3.7.12From 604d95e235d86465b8c17f02095edcaf18464d4c Mon Sep 17 00:00:00 2001 From: Lawrence D'Anna <64555057+lawrence-danna-apple@users.noreply.github.com> Date: Tue, 30 Jun 2020 02:15:46 -0700 Subject: [PATCH] bpo-41100: fix _decimal for arm64 Mac OS (GH-21228) Patch by Lawrence Danna. --- .../Core and Builtins/2020-06-30-04-44-29.bpo-41100.PJwA6F.rst | 1 + Modules/_decimal/libmpdec/mpdecimal.h | 3 +++ 2 files changed, 4 insertions(+) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-06-30-04-44-29.bpo-41100.PJwA6F.rst diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-06-30-04-44-29.bpo-41100.PJwA6F.rst b/Misc/NEWS.d/next/Core and Builtins/2020-06-30-04-44-29.bpo-41100.PJwA6F.rst new file mode 100644 index 0000000000..d6176d69f0 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-06-30-04-44-29.bpo-41100.PJwA6F.rst @@ -0,0 +1 @@ +add arm64 to the allowable Mac OS arches in mpdecimal.h \ No newline at end of file diff --git a/Modules/_decimal/libmpdec/mpdecimal.h b/Modules/_decimal/libmpdec/mpdecimal.h index 108b76efa8..35ce429f60 100644 --- a/Modules/_decimal/libmpdec/mpdecimal.h +++ b/Modules/_decimal/libmpdec/mpdecimal.h @@ -135,6 +135,9 @@ const char *mpd_version(void); #elif defined(__x86_64__) #define CONFIG_64 #define ASM + #elif defined(__arm64__) + #define CONFIG_64 + #define ANSI #else #error "unknown architecture for universal build." #endif -- 2.30.1 (Apple Git-130) 0003-bpo-42351-Avoid-error-when-opening-header-with-non-U.patch000066400000000000000000000016101517431316200430320ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.7.12/Python-3.7.12From 245427d207ee88a4ba26a66c3de350bcbcc036f2 Mon Sep 17 00:00:00 2001 From: Ronald Oussoren Date: Sat, 14 Nov 2020 16:07:47 +0100 Subject: [PATCH] bpo-42351: Avoid error when opening header with non-UTF8 encoding (GH-23279) grep_headers_for() would error out when a header contained text that cannot be interpreted as UTF-8. cherry-picked from 7a27c7ed4b by Pedro Fonini --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index f211989aac..467362813d 100644 --- a/setup.py +++ b/setup.py @@ -159,7 +159,7 @@ def is_macosx_sdk_path(path): def grep_headers_for(function, headers): for header in headers: - with open(header, 'r') as f: + with open(header, 'r', errors='surrogateescape') as f: if function in f.read(): return True return False -- 2.34.1 0004-bpo-45405-Prevent-internal-configure-error-when-runn.patch000066400000000000000000000026651517431316200433550ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.7.12/Python-3.7.12From 720bb456dc711b0776bae837d1f9a0b10c28ddf2 Mon Sep 17 00:00:00 2001 From: Ned Deily Date: Tue, 15 Mar 2022 03:18:39 -0400 Subject: [PATCH] bpo-45405: Prevent internal configure error when running configure with recent versions of clang. (GH-28845) (GH-31890) Change the configure logic to function properly on macOS when the compiler outputs a platform triplet for option --print-multiarch. The Apple Clang included with Xcode 13.3 now supports --print-multiarch causing configure to fail without this change. --- configure | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git configure configure index 829dd69bb8..455481bc50 100755 --- a/configure +++ b/configure @@ -5183,9 +5183,6 @@ $as_echo "$as_me: fi -MULTIARCH=$($CC --print-multiarch 2>/dev/null) - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the platform triplet based on compiler characteristics" >&5 $as_echo_n "checking for the platform triplet based on compiler characteristics... " >&6; } cat >> conftest.c <&6; } fi rm -f conftest.c conftest.out +if test x$PLATFORM_TRIPLET != xdarwin; then + MULTIARCH=$($CC --print-multiarch 2>/dev/null) +fi + + if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then if test x$PLATFORM_TRIPLET != x$MULTIARCH; then as_fn_error $? "internal configure error for the platform triplet, please file a bug report" "$LINENO" 5 -- 2.35.1 pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.7.13/000077500000000000000000000000001517431316200262745ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.7.13/Python-3.7.13/000077500000000000000000000000001517431316200303045ustar00rootroot000000000000000001-Port-ctypes-and-system-libffi-patches-for-arm64-macO.patch000066400000000000000000000276401517431316200434160ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.7.13/Python-3.7.13From: Christian Hammond Date: Wed, 15 Dec 2021 23:12:36 -0800 Subject: Port ctypes and system libffi patches for arm64/macOS 10.15+ to Python 3.7.12 This ports the following ctypes and libffi pyenv patches for Python 2.7.18 to Python 3.7.12: * `0004-Use-system-libffi-for-Mac-OS-10.15-and-up.patch` * `0005-ctypes-use-the-correct-ABI-for-variadic-functions.patch` * `0006-ctypes-probe-libffi-for-ffi_closure_alloc-and-ffi_pr.patch` These patches enable use of system libffi (fixing a broken `ctypes` module on arm64 targets) and enable calling variadic functions on arm64. They've been combined from patches port from Homebrew to pyenv by Takumi Sueda, updated to work on the Python 3.7.12 codebase. The Homebrew patches are themselves backports of changes in Python 3.9 and 3.10. That patch can be found at: https://github.com/Homebrew/formula-patches/blob/master/python/3.8.7.patch diff --git a/Doc/library/ctypes.rst b/Doc/library/ctypes.rst index 715d595b24..7743144978 100644 --- a/Doc/library/ctypes.rst +++ b/Doc/library/ctypes.rst @@ -1551,6 +1551,13 @@ They are instances of a private class: value usable as argument (integer, string, ctypes instance). This allows defining adapters that can adapt custom objects as function parameters. + .. attribute:: variadic + + Assign a boolean to specify that the function takes a variable number of + arguments. This does not matter on most platforms, but for Apple arm64 + platforms variadic functions have a different calling convention than + normal functions. + .. attribute:: errcheck Assign a Python function or another callable to this attribute. The diff --git a/Lib/test/test_unicode.py b/Lib/test/test_unicode.py index 4ebd82d3e0..7b73c190b6 100644 --- a/Lib/test/test_unicode.py +++ b/Lib/test/test_unicode.py @@ -2458,11 +2458,14 @@ class CAPITest(unittest.TestCase): def test_from_format(self): support.import_module('ctypes') from ctypes import ( + c_char_p, pythonapi, py_object, sizeof, c_int, c_long, c_longlong, c_ssize_t, c_uint, c_ulong, c_ulonglong, c_size_t, c_void_p) name = "PyUnicode_FromFormat" _PyUnicode_FromFormat = getattr(pythonapi, name) + _PyUnicode_FromFormat.argtypes = (c_char_p,) + _PyUnicode_FromFormat.variadic = True _PyUnicode_FromFormat.restype = py_object def PyUnicode_FromFormat(format, *args): diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c index dd0c61fd8a..79137e1dc7 100644 --- a/Modules/_ctypes/_ctypes.c +++ b/Modules/_ctypes/_ctypes.c @@ -3174,6 +3174,34 @@ PyCFuncPtr_get_restype(PyCFuncPtrObject *self, void *Py_UNUSED(ignored)) } } +static int +PyCFuncPtr_set_variadic(PyCFuncPtrObject *self, PyObject *ob) +{ + StgDictObject *dict = PyObject_stgdict((PyObject *)self); + assert(dict); + int r = PyObject_IsTrue(ob); + if (r == 1) { + dict->flags |= FUNCFLAG_VARIADIC; + return 0; + } else if (r == 0) { + dict->flags &= ~FUNCFLAG_VARIADIC; + return 0; + } else { + return -1; + } +} + +static PyObject * +PyCFuncPtr_get_variadic(PyCFuncPtrObject *self) +{ + StgDictObject *dict = PyObject_stgdict((PyObject *)self); + assert(dict); /* Cannot be NULL for PyCFuncPtrObject instances */ + if (dict->flags & FUNCFLAG_VARIADIC) + Py_RETURN_TRUE; + else + Py_RETURN_FALSE; +} + static int PyCFuncPtr_set_argtypes(PyCFuncPtrObject *self, PyObject *ob, void *Py_UNUSED(ignored)) { @@ -3219,6 +3247,8 @@ static PyGetSetDef PyCFuncPtr_getsets[] = { { "argtypes", (getter)PyCFuncPtr_get_argtypes, (setter)PyCFuncPtr_set_argtypes, "specify the argument types", NULL }, + { "variadic", (getter)PyCFuncPtr_get_variadic, (setter)PyCFuncPtr_set_variadic, + "specify if function takes variable number of arguments", NULL }, { NULL, NULL } }; @@ -5632,6 +5662,7 @@ PyInit__ctypes(void) PyModule_AddObject(m, "FUNCFLAG_USE_ERRNO", PyLong_FromLong(FUNCFLAG_USE_ERRNO)); PyModule_AddObject(m, "FUNCFLAG_USE_LASTERROR", PyLong_FromLong(FUNCFLAG_USE_LASTERROR)); PyModule_AddObject(m, "FUNCFLAG_PYTHONAPI", PyLong_FromLong(FUNCFLAG_PYTHONAPI)); + PyModule_AddObject(m, "FUNCFLAG_VARIADIC", PyLong_FromLong(FUNCFLAG_VARIADIC)); PyModule_AddStringConstant(m, "__version__", "1.1.0"); PyModule_AddObject(m, "_memmove_addr", PyLong_FromVoidPtr(memmove)); diff --git a/Modules/_ctypes/callproc.c b/Modules/_ctypes/callproc.c index 9cbf9801ad..e7fe11176b 100644 --- a/Modules/_ctypes/callproc.c +++ b/Modules/_ctypes/callproc.c @@ -754,7 +756,8 @@ static int _call_function_pointer(int flags, ffi_type **atypes, ffi_type *restype, void *resmem, - int argcount) + int argcount, + int argtypecount) { PyThreadState *_save = NULL; /* For Py_BLOCK_THREADS and Py_UNBLOCK_THREADS */ PyObject *error_object = NULL; @@ -780,15 +783,39 @@ static int _call_function_pointer(int flags, if ((flags & FUNCFLAG_CDECL) == 0) cc = FFI_STDCALL; #endif - if (FFI_OK != ffi_prep_cif(&cif, - cc, - argcount, - restype, - atypes)) { - PyErr_SetString(PyExc_RuntimeError, - "ffi_prep_cif failed"); - return -1; + +#if HAVE_FFI_PREP_CIF_VAR + /* Everyone SHOULD set f.variadic=True on variadic function pointers, but + * lots of existing code will not. If there's at least one arg and more + * args are passed than are defined in the prototype, then it must be a + * variadic function. */ + if ((flags & FUNCFLAG_VARIADIC) || + (argtypecount != 0 && argcount > argtypecount)) + { + if (FFI_OK != ffi_prep_cif_var(&cif, + cc, + argtypecount, + argcount, + restype, + atypes)) { + PyErr_SetString(PyExc_RuntimeError, + "ffi_prep_cif_var failed"); + return -1; + } + } else { +#endif + if (FFI_OK != ffi_prep_cif(&cif, + cc, + argcount, + restype, + atypes)) { + PyErr_SetString(PyExc_RuntimeError, + "ffi_prep_cif failed"); + return -1; + } +#if HAVE_FFI_PREP_CIF_VAR } +#endif if (flags & (FUNCFLAG_USE_ERRNO | FUNCFLAG_USE_LASTERROR)) { error_object = _ctypes_get_errobj(&space); @@ -1187,9 +1214,8 @@ PyObject *_ctypes_callproc(PPROC pProc, if (-1 == _call_function_pointer(flags, pProc, avalues, atypes, rtype, resbuf, - Py_SAFE_DOWNCAST(argcount, - Py_ssize_t, - int))) + Py_SAFE_DOWNCAST(argcount, Py_ssize_t, int), + Py_SAFE_DOWNCAST(argtype_count, Py_ssize_t, int))) goto cleanup; #ifdef WORDS_BIGENDIAN diff --git a/Modules/_ctypes/ctypes.h b/Modules/_ctypes/ctypes.h index e58f85233c..e45975f6ad 100644 --- a/Modules/_ctypes/ctypes.h +++ b/Modules/_ctypes/ctypes.h @@ -285,6 +285,7 @@ PyObject *_ctypes_callproc(PPROC pProc, #define FUNCFLAG_PYTHONAPI 0x4 #define FUNCFLAG_USE_ERRNO 0x8 #define FUNCFLAG_USE_LASTERROR 0x10 +#define FUNCFLAG_VARIADIC 0x20 #define TYPEFLAG_ISPOINTER 0x100 #define TYPEFLAG_HASPOINTER 0x200 diff --git a/setup.py b/setup.py index bf90600eaa..48ff120e9a 100644 --- a/setup.py +++ b/setup.py @@ -142,6 +142,13 @@ def macosx_sdk_root(): return MACOS_SDK_ROOT +def is_macosx_at_least(vers): + if host_platform == 'darwin': + dep_target = sysconfig.get_config_var('MACOSX_DEPLOYMENT_TARGET') + if dep_target: + return tuple(map(int, str(dep_target).split('.'))) >= vers + return False + def is_macosx_sdk_path(path): """ Returns True if 'path' can be located in an OSX SDK @@ -150,6 +157,13 @@ def is_macosx_sdk_path(path): or path.startswith('/System/') or path.startswith('/Library/') ) +def grep_headers_for(function, headers): + for header in headers: + with open(header, 'r') as f: + if function in f.read(): + return True + return False + def find_file(filename, std_dirs, paths): """Searches for the directory where a given file is located, and returns a possibly-empty list of additional directories, or None @@ -1972,7 +1986,11 @@ class PyBuildExt(build_ext): return True def detect_ctypes(self, inc_dirs, lib_dirs): - self.use_system_libffi = False + if not sysconfig.get_config_var("LIBFFI_INCLUDEDIR") and is_macosx_at_least((10,15)): + self.use_system_libffi = True + else: + self.use_system_libffi = '--with-system-ffi' in sysconfig.get_config_var("CONFIG_ARGS") + include_dirs = [] extra_compile_args = [] extra_link_args = [] @@ -2018,30 +2036,47 @@ class PyBuildExt(build_ext): libraries=['m']) self.extensions.extend([ext, ext_test]) + ffi_inc = sysconfig.get_config_var("LIBFFI_INCLUDEDIR") + ffi_lib = None + if host_platform == 'darwin': - if '--with-system-ffi' not in sysconfig.get_config_var("CONFIG_ARGS"): + if not self.use_system_libffi: return - # OS X 10.5 comes with libffi.dylib; the include files are - # in /usr/include/ffi - inc_dirs.append('/usr/include/ffi') - - ffi_inc = [sysconfig.get_config_var("LIBFFI_INCLUDEDIR")] - if not ffi_inc or ffi_inc[0] == '': - ffi_inc = find_file('ffi.h', [], inc_dirs) - if ffi_inc is not None: - ffi_h = ffi_inc[0] + '/ffi.h' + ffi_in_sdk = os.path.join(macosx_sdk_root(), "usr/include/ffi") + if os.path.exists(ffi_in_sdk): + ffi_inc = ffi_in_sdk + ffi_lib = 'ffi' + else: + # OS X 10.5 comes with libffi.dylib; the include files are + # in /usr/include/ffi + inc_dirs.append('/usr/include/ffi') + + if not ffi_inc: + found = find_file('ffi.h', [], inc_dirs) + if found: + ffi_inc = found[0] + if ffi_inc: + ffi_h = ffi_inc + '/ffi.h' if not os.path.exists(ffi_h): ffi_inc = None print('Header file {} does not exist'.format(ffi_h)) - ffi_lib = None - if ffi_inc is not None: - for lib_name in ('ffi', 'ffi_pic'): + + if ffi_lib is None and ffi_inc: + for lib_name in ('ffi_convenience', 'ffi_pic', 'ffi'): if (self.compiler.find_library_file(lib_dirs, lib_name)): ffi_lib = lib_name break if ffi_inc and ffi_lib: - ext.include_dirs.extend(ffi_inc) + ffi_headers = glob(os.path.join(ffi_inc, '*.h')) + if grep_headers_for('ffi_closure_alloc', ffi_headers): + try: + sources.remove('_ctypes/malloc_closure.c') + except ValueError: + pass + if grep_headers_for('ffi_prep_cif_var', ffi_headers): + ext.extra_compile_args.append("-DHAVE_FFI_PREP_CIF_VAR=1") + ext.include_dirs.append(ffi_inc) ext.libraries.append(ffi_lib) self.use_system_libffi = True -- 2.30.1 (Apple Git-130) 0002-bpo-41100-fix-_decimal-for-arm64-Mac-OS-GH-21228.patch000066400000000000000000000027071517431316200410750ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.7.13/Python-3.7.13From 604d95e235d86465b8c17f02095edcaf18464d4c Mon Sep 17 00:00:00 2001 From: Lawrence D'Anna <64555057+lawrence-danna-apple@users.noreply.github.com> Date: Tue, 30 Jun 2020 02:15:46 -0700 Subject: [PATCH] bpo-41100: fix _decimal for arm64 Mac OS (GH-21228) Patch by Lawrence Danna. --- .../Core and Builtins/2020-06-30-04-44-29.bpo-41100.PJwA6F.rst | 1 + Modules/_decimal/libmpdec/mpdecimal.h | 3 +++ 2 files changed, 4 insertions(+) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-06-30-04-44-29.bpo-41100.PJwA6F.rst diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-06-30-04-44-29.bpo-41100.PJwA6F.rst b/Misc/NEWS.d/next/Core and Builtins/2020-06-30-04-44-29.bpo-41100.PJwA6F.rst new file mode 100644 index 0000000000..d6176d69f0 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-06-30-04-44-29.bpo-41100.PJwA6F.rst @@ -0,0 +1 @@ +add arm64 to the allowable Mac OS arches in mpdecimal.h \ No newline at end of file diff --git a/Modules/_decimal/libmpdec/mpdecimal.h b/Modules/_decimal/libmpdec/mpdecimal.h index 108b76efa8..35ce429f60 100644 --- a/Modules/_decimal/libmpdec/mpdecimal.h +++ b/Modules/_decimal/libmpdec/mpdecimal.h @@ -135,6 +135,9 @@ const char *mpd_version(void); #elif defined(__x86_64__) #define CONFIG_64 #define ASM + #elif defined(__arm64__) + #define CONFIG_64 + #define ANSI #else #error "unknown architecture for universal build." #endif -- 2.30.1 (Apple Git-130) 0003-bpo-42351-Avoid-error-when-opening-header-with-non-U.patch000066400000000000000000000016101517431316200430340ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.7.13/Python-3.7.13From 245427d207ee88a4ba26a66c3de350bcbcc036f2 Mon Sep 17 00:00:00 2001 From: Ronald Oussoren Date: Sat, 14 Nov 2020 16:07:47 +0100 Subject: [PATCH] bpo-42351: Avoid error when opening header with non-UTF8 encoding (GH-23279) grep_headers_for() would error out when a header contained text that cannot be interpreted as UTF-8. cherry-picked from 7a27c7ed4b by Pedro Fonini --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index f211989aac..467362813d 100644 --- a/setup.py +++ b/setup.py @@ -159,7 +159,7 @@ def is_macosx_sdk_path(path): def grep_headers_for(function, headers): for header in headers: - with open(header, 'r') as f: + with open(header, 'r', errors='surrogateescape') as f: if function in f.read(): return True return False -- 2.34.1 pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.7.14/000077500000000000000000000000001517431316200262755ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.7.14/Python-3.7.14/000077500000000000000000000000001517431316200303065ustar00rootroot000000000000000001-Port-ctypes-and-system-libffi-patches-for-arm64-macO.patch000066400000000000000000000276401517431316200434200ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.7.14/Python-3.7.14From: Christian Hammond Date: Wed, 15 Dec 2021 23:12:36 -0800 Subject: Port ctypes and system libffi patches for arm64/macOS 10.15+ to Python 3.7.12 This ports the following ctypes and libffi pyenv patches for Python 2.7.18 to Python 3.7.12: * `0004-Use-system-libffi-for-Mac-OS-10.15-and-up.patch` * `0005-ctypes-use-the-correct-ABI-for-variadic-functions.patch` * `0006-ctypes-probe-libffi-for-ffi_closure_alloc-and-ffi_pr.patch` These patches enable use of system libffi (fixing a broken `ctypes` module on arm64 targets) and enable calling variadic functions on arm64. They've been combined from patches port from Homebrew to pyenv by Takumi Sueda, updated to work on the Python 3.7.12 codebase. The Homebrew patches are themselves backports of changes in Python 3.9 and 3.10. That patch can be found at: https://github.com/Homebrew/formula-patches/blob/master/python/3.8.7.patch diff --git a/Doc/library/ctypes.rst b/Doc/library/ctypes.rst index 715d595b24..7743144978 100644 --- a/Doc/library/ctypes.rst +++ b/Doc/library/ctypes.rst @@ -1551,6 +1551,13 @@ They are instances of a private class: value usable as argument (integer, string, ctypes instance). This allows defining adapters that can adapt custom objects as function parameters. + .. attribute:: variadic + + Assign a boolean to specify that the function takes a variable number of + arguments. This does not matter on most platforms, but for Apple arm64 + platforms variadic functions have a different calling convention than + normal functions. + .. attribute:: errcheck Assign a Python function or another callable to this attribute. The diff --git a/Lib/test/test_unicode.py b/Lib/test/test_unicode.py index 4ebd82d3e0..7b73c190b6 100644 --- a/Lib/test/test_unicode.py +++ b/Lib/test/test_unicode.py @@ -2458,11 +2458,14 @@ class CAPITest(unittest.TestCase): def test_from_format(self): support.import_module('ctypes') from ctypes import ( + c_char_p, pythonapi, py_object, sizeof, c_int, c_long, c_longlong, c_ssize_t, c_uint, c_ulong, c_ulonglong, c_size_t, c_void_p) name = "PyUnicode_FromFormat" _PyUnicode_FromFormat = getattr(pythonapi, name) + _PyUnicode_FromFormat.argtypes = (c_char_p,) + _PyUnicode_FromFormat.variadic = True _PyUnicode_FromFormat.restype = py_object def PyUnicode_FromFormat(format, *args): diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c index dd0c61fd8a..79137e1dc7 100644 --- a/Modules/_ctypes/_ctypes.c +++ b/Modules/_ctypes/_ctypes.c @@ -3174,6 +3174,34 @@ PyCFuncPtr_get_restype(PyCFuncPtrObject *self, void *Py_UNUSED(ignored)) } } +static int +PyCFuncPtr_set_variadic(PyCFuncPtrObject *self, PyObject *ob) +{ + StgDictObject *dict = PyObject_stgdict((PyObject *)self); + assert(dict); + int r = PyObject_IsTrue(ob); + if (r == 1) { + dict->flags |= FUNCFLAG_VARIADIC; + return 0; + } else if (r == 0) { + dict->flags &= ~FUNCFLAG_VARIADIC; + return 0; + } else { + return -1; + } +} + +static PyObject * +PyCFuncPtr_get_variadic(PyCFuncPtrObject *self) +{ + StgDictObject *dict = PyObject_stgdict((PyObject *)self); + assert(dict); /* Cannot be NULL for PyCFuncPtrObject instances */ + if (dict->flags & FUNCFLAG_VARIADIC) + Py_RETURN_TRUE; + else + Py_RETURN_FALSE; +} + static int PyCFuncPtr_set_argtypes(PyCFuncPtrObject *self, PyObject *ob, void *Py_UNUSED(ignored)) { @@ -3219,6 +3247,8 @@ static PyGetSetDef PyCFuncPtr_getsets[] = { { "argtypes", (getter)PyCFuncPtr_get_argtypes, (setter)PyCFuncPtr_set_argtypes, "specify the argument types", NULL }, + { "variadic", (getter)PyCFuncPtr_get_variadic, (setter)PyCFuncPtr_set_variadic, + "specify if function takes variable number of arguments", NULL }, { NULL, NULL } }; @@ -5632,6 +5662,7 @@ PyInit__ctypes(void) PyModule_AddObject(m, "FUNCFLAG_USE_ERRNO", PyLong_FromLong(FUNCFLAG_USE_ERRNO)); PyModule_AddObject(m, "FUNCFLAG_USE_LASTERROR", PyLong_FromLong(FUNCFLAG_USE_LASTERROR)); PyModule_AddObject(m, "FUNCFLAG_PYTHONAPI", PyLong_FromLong(FUNCFLAG_PYTHONAPI)); + PyModule_AddObject(m, "FUNCFLAG_VARIADIC", PyLong_FromLong(FUNCFLAG_VARIADIC)); PyModule_AddStringConstant(m, "__version__", "1.1.0"); PyModule_AddObject(m, "_memmove_addr", PyLong_FromVoidPtr(memmove)); diff --git a/Modules/_ctypes/callproc.c b/Modules/_ctypes/callproc.c index 9cbf9801ad..e7fe11176b 100644 --- a/Modules/_ctypes/callproc.c +++ b/Modules/_ctypes/callproc.c @@ -754,7 +756,8 @@ static int _call_function_pointer(int flags, ffi_type **atypes, ffi_type *restype, void *resmem, - int argcount) + int argcount, + int argtypecount) { PyThreadState *_save = NULL; /* For Py_BLOCK_THREADS and Py_UNBLOCK_THREADS */ PyObject *error_object = NULL; @@ -780,15 +783,39 @@ static int _call_function_pointer(int flags, if ((flags & FUNCFLAG_CDECL) == 0) cc = FFI_STDCALL; #endif - if (FFI_OK != ffi_prep_cif(&cif, - cc, - argcount, - restype, - atypes)) { - PyErr_SetString(PyExc_RuntimeError, - "ffi_prep_cif failed"); - return -1; + +#if HAVE_FFI_PREP_CIF_VAR + /* Everyone SHOULD set f.variadic=True on variadic function pointers, but + * lots of existing code will not. If there's at least one arg and more + * args are passed than are defined in the prototype, then it must be a + * variadic function. */ + if ((flags & FUNCFLAG_VARIADIC) || + (argtypecount != 0 && argcount > argtypecount)) + { + if (FFI_OK != ffi_prep_cif_var(&cif, + cc, + argtypecount, + argcount, + restype, + atypes)) { + PyErr_SetString(PyExc_RuntimeError, + "ffi_prep_cif_var failed"); + return -1; + } + } else { +#endif + if (FFI_OK != ffi_prep_cif(&cif, + cc, + argcount, + restype, + atypes)) { + PyErr_SetString(PyExc_RuntimeError, + "ffi_prep_cif failed"); + return -1; + } +#if HAVE_FFI_PREP_CIF_VAR } +#endif if (flags & (FUNCFLAG_USE_ERRNO | FUNCFLAG_USE_LASTERROR)) { error_object = _ctypes_get_errobj(&space); @@ -1187,9 +1214,8 @@ PyObject *_ctypes_callproc(PPROC pProc, if (-1 == _call_function_pointer(flags, pProc, avalues, atypes, rtype, resbuf, - Py_SAFE_DOWNCAST(argcount, - Py_ssize_t, - int))) + Py_SAFE_DOWNCAST(argcount, Py_ssize_t, int), + Py_SAFE_DOWNCAST(argtype_count, Py_ssize_t, int))) goto cleanup; #ifdef WORDS_BIGENDIAN diff --git a/Modules/_ctypes/ctypes.h b/Modules/_ctypes/ctypes.h index e58f85233c..e45975f6ad 100644 --- a/Modules/_ctypes/ctypes.h +++ b/Modules/_ctypes/ctypes.h @@ -285,6 +285,7 @@ PyObject *_ctypes_callproc(PPROC pProc, #define FUNCFLAG_PYTHONAPI 0x4 #define FUNCFLAG_USE_ERRNO 0x8 #define FUNCFLAG_USE_LASTERROR 0x10 +#define FUNCFLAG_VARIADIC 0x20 #define TYPEFLAG_ISPOINTER 0x100 #define TYPEFLAG_HASPOINTER 0x200 diff --git a/setup.py b/setup.py index bf90600eaa..48ff120e9a 100644 --- a/setup.py +++ b/setup.py @@ -142,6 +142,13 @@ def macosx_sdk_root(): return MACOS_SDK_ROOT +def is_macosx_at_least(vers): + if host_platform == 'darwin': + dep_target = sysconfig.get_config_var('MACOSX_DEPLOYMENT_TARGET') + if dep_target: + return tuple(map(int, str(dep_target).split('.'))) >= vers + return False + def is_macosx_sdk_path(path): """ Returns True if 'path' can be located in an OSX SDK @@ -150,6 +157,13 @@ def is_macosx_sdk_path(path): or path.startswith('/System/') or path.startswith('/Library/') ) +def grep_headers_for(function, headers): + for header in headers: + with open(header, 'r') as f: + if function in f.read(): + return True + return False + def find_file(filename, std_dirs, paths): """Searches for the directory where a given file is located, and returns a possibly-empty list of additional directories, or None @@ -1972,7 +1986,11 @@ class PyBuildExt(build_ext): return True def detect_ctypes(self, inc_dirs, lib_dirs): - self.use_system_libffi = False + if not sysconfig.get_config_var("LIBFFI_INCLUDEDIR") and is_macosx_at_least((10,15)): + self.use_system_libffi = True + else: + self.use_system_libffi = '--with-system-ffi' in sysconfig.get_config_var("CONFIG_ARGS") + include_dirs = [] extra_compile_args = [] extra_link_args = [] @@ -2018,30 +2036,47 @@ class PyBuildExt(build_ext): libraries=['m']) self.extensions.extend([ext, ext_test]) + ffi_inc = sysconfig.get_config_var("LIBFFI_INCLUDEDIR") + ffi_lib = None + if host_platform == 'darwin': - if '--with-system-ffi' not in sysconfig.get_config_var("CONFIG_ARGS"): + if not self.use_system_libffi: return - # OS X 10.5 comes with libffi.dylib; the include files are - # in /usr/include/ffi - inc_dirs.append('/usr/include/ffi') - - ffi_inc = [sysconfig.get_config_var("LIBFFI_INCLUDEDIR")] - if not ffi_inc or ffi_inc[0] == '': - ffi_inc = find_file('ffi.h', [], inc_dirs) - if ffi_inc is not None: - ffi_h = ffi_inc[0] + '/ffi.h' + ffi_in_sdk = os.path.join(macosx_sdk_root(), "usr/include/ffi") + if os.path.exists(ffi_in_sdk): + ffi_inc = ffi_in_sdk + ffi_lib = 'ffi' + else: + # OS X 10.5 comes with libffi.dylib; the include files are + # in /usr/include/ffi + inc_dirs.append('/usr/include/ffi') + + if not ffi_inc: + found = find_file('ffi.h', [], inc_dirs) + if found: + ffi_inc = found[0] + if ffi_inc: + ffi_h = ffi_inc + '/ffi.h' if not os.path.exists(ffi_h): ffi_inc = None print('Header file {} does not exist'.format(ffi_h)) - ffi_lib = None - if ffi_inc is not None: - for lib_name in ('ffi', 'ffi_pic'): + + if ffi_lib is None and ffi_inc: + for lib_name in ('ffi_convenience', 'ffi_pic', 'ffi'): if (self.compiler.find_library_file(lib_dirs, lib_name)): ffi_lib = lib_name break if ffi_inc and ffi_lib: - ext.include_dirs.extend(ffi_inc) + ffi_headers = glob(os.path.join(ffi_inc, '*.h')) + if grep_headers_for('ffi_closure_alloc', ffi_headers): + try: + sources.remove('_ctypes/malloc_closure.c') + except ValueError: + pass + if grep_headers_for('ffi_prep_cif_var', ffi_headers): + ext.extra_compile_args.append("-DHAVE_FFI_PREP_CIF_VAR=1") + ext.include_dirs.append(ffi_inc) ext.libraries.append(ffi_lib) self.use_system_libffi = True -- 2.30.1 (Apple Git-130) 0002-bpo-41100-fix-_decimal-for-arm64-Mac-OS-GH-21228.patch000066400000000000000000000026701517431316200410760ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.7.14/Python-3.7.14From f2595c038ed7bfd182d9d05d83786106ebd02ca0 Mon Sep 17 00:00:00 2001 From: Lawrence D'Anna <64555057+lawrence-danna-apple@users.noreply.github.com> Date: Tue, 30 Jun 2020 02:15:46 -0700 Subject: [PATCH] bpo-41100: fix _decimal for arm64 Mac OS (GH-21228) Patch by Lawrence Danna. --- .../Core and Builtins/2020-06-30-04-44-29.bpo-41100.PJwA6F.rst | 1 + Modules/_decimal/libmpdec/mpdecimal.h | 3 +++ 2 files changed, 4 insertions(+) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-06-30-04-44-29.bpo-41100.PJwA6F.rst diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-06-30-04-44-29.bpo-41100.PJwA6F.rst b/Misc/NEWS.d/next/Core and Builtins/2020-06-30-04-44-29.bpo-41100.PJwA6F.rst new file mode 100644 index 0000000000..d6176d69f0 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-06-30-04-44-29.bpo-41100.PJwA6F.rst @@ -0,0 +1 @@ +add arm64 to the allowable Mac OS arches in mpdecimal.h \ No newline at end of file diff --git a/Modules/_decimal/libmpdec/mpdecimal.h b/Modules/_decimal/libmpdec/mpdecimal.h index a67dd9bc12..3e9c8185c3 100644 --- a/Modules/_decimal/libmpdec/mpdecimal.h +++ b/Modules/_decimal/libmpdec/mpdecimal.h @@ -135,6 +135,9 @@ const char *mpd_version(void); #elif defined(__x86_64__) #define CONFIG_64 #define ASM + #elif defined(__arm64__) + #define CONFIG_64 + #define ANSI #else #error "unknown architecture for universal build." #endif -- 2.37.3 0003-bpo-42351-Avoid-error-when-opening-header-with-non-U.patch000066400000000000000000000016101517431316200430360ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.7.14/Python-3.7.14From 245427d207ee88a4ba26a66c3de350bcbcc036f2 Mon Sep 17 00:00:00 2001 From: Ronald Oussoren Date: Sat, 14 Nov 2020 16:07:47 +0100 Subject: [PATCH] bpo-42351: Avoid error when opening header with non-UTF8 encoding (GH-23279) grep_headers_for() would error out when a header contained text that cannot be interpreted as UTF-8. cherry-picked from 7a27c7ed4b by Pedro Fonini --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index f211989aac..467362813d 100644 --- a/setup.py +++ b/setup.py @@ -159,7 +159,7 @@ def is_macosx_sdk_path(path): def grep_headers_for(function, headers): for header in headers: - with open(header, 'r') as f: + with open(header, 'r', errors='surrogateescape') as f: if function in f.read(): return True return False -- 2.34.1 pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.7.15/000077500000000000000000000000001517431316200262765ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.7.15/Python-3.7.15/000077500000000000000000000000001517431316200303105ustar00rootroot000000000000000001-Port-ctypes-and-system-libffi-patches-for-arm64-macO.patch000066400000000000000000000276401517431316200434220ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.7.15/Python-3.7.15From: Christian Hammond Date: Wed, 15 Dec 2021 23:12:36 -0800 Subject: Port ctypes and system libffi patches for arm64/macOS 10.15+ to Python 3.7.12 This ports the following ctypes and libffi pyenv patches for Python 2.7.18 to Python 3.7.12: * `0004-Use-system-libffi-for-Mac-OS-10.15-and-up.patch` * `0005-ctypes-use-the-correct-ABI-for-variadic-functions.patch` * `0006-ctypes-probe-libffi-for-ffi_closure_alloc-and-ffi_pr.patch` These patches enable use of system libffi (fixing a broken `ctypes` module on arm64 targets) and enable calling variadic functions on arm64. They've been combined from patches port from Homebrew to pyenv by Takumi Sueda, updated to work on the Python 3.7.12 codebase. The Homebrew patches are themselves backports of changes in Python 3.9 and 3.10. That patch can be found at: https://github.com/Homebrew/formula-patches/blob/master/python/3.8.7.patch diff --git a/Doc/library/ctypes.rst b/Doc/library/ctypes.rst index 715d595b24..7743144978 100644 --- a/Doc/library/ctypes.rst +++ b/Doc/library/ctypes.rst @@ -1551,6 +1551,13 @@ They are instances of a private class: value usable as argument (integer, string, ctypes instance). This allows defining adapters that can adapt custom objects as function parameters. + .. attribute:: variadic + + Assign a boolean to specify that the function takes a variable number of + arguments. This does not matter on most platforms, but for Apple arm64 + platforms variadic functions have a different calling convention than + normal functions. + .. attribute:: errcheck Assign a Python function or another callable to this attribute. The diff --git a/Lib/test/test_unicode.py b/Lib/test/test_unicode.py index 4ebd82d3e0..7b73c190b6 100644 --- a/Lib/test/test_unicode.py +++ b/Lib/test/test_unicode.py @@ -2458,11 +2458,14 @@ class CAPITest(unittest.TestCase): def test_from_format(self): support.import_module('ctypes') from ctypes import ( + c_char_p, pythonapi, py_object, sizeof, c_int, c_long, c_longlong, c_ssize_t, c_uint, c_ulong, c_ulonglong, c_size_t, c_void_p) name = "PyUnicode_FromFormat" _PyUnicode_FromFormat = getattr(pythonapi, name) + _PyUnicode_FromFormat.argtypes = (c_char_p,) + _PyUnicode_FromFormat.variadic = True _PyUnicode_FromFormat.restype = py_object def PyUnicode_FromFormat(format, *args): diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c index dd0c61fd8a..79137e1dc7 100644 --- a/Modules/_ctypes/_ctypes.c +++ b/Modules/_ctypes/_ctypes.c @@ -3174,6 +3174,34 @@ PyCFuncPtr_get_restype(PyCFuncPtrObject *self, void *Py_UNUSED(ignored)) } } +static int +PyCFuncPtr_set_variadic(PyCFuncPtrObject *self, PyObject *ob) +{ + StgDictObject *dict = PyObject_stgdict((PyObject *)self); + assert(dict); + int r = PyObject_IsTrue(ob); + if (r == 1) { + dict->flags |= FUNCFLAG_VARIADIC; + return 0; + } else if (r == 0) { + dict->flags &= ~FUNCFLAG_VARIADIC; + return 0; + } else { + return -1; + } +} + +static PyObject * +PyCFuncPtr_get_variadic(PyCFuncPtrObject *self) +{ + StgDictObject *dict = PyObject_stgdict((PyObject *)self); + assert(dict); /* Cannot be NULL for PyCFuncPtrObject instances */ + if (dict->flags & FUNCFLAG_VARIADIC) + Py_RETURN_TRUE; + else + Py_RETURN_FALSE; +} + static int PyCFuncPtr_set_argtypes(PyCFuncPtrObject *self, PyObject *ob, void *Py_UNUSED(ignored)) { @@ -3219,6 +3247,8 @@ static PyGetSetDef PyCFuncPtr_getsets[] = { { "argtypes", (getter)PyCFuncPtr_get_argtypes, (setter)PyCFuncPtr_set_argtypes, "specify the argument types", NULL }, + { "variadic", (getter)PyCFuncPtr_get_variadic, (setter)PyCFuncPtr_set_variadic, + "specify if function takes variable number of arguments", NULL }, { NULL, NULL } }; @@ -5632,6 +5662,7 @@ PyInit__ctypes(void) PyModule_AddObject(m, "FUNCFLAG_USE_ERRNO", PyLong_FromLong(FUNCFLAG_USE_ERRNO)); PyModule_AddObject(m, "FUNCFLAG_USE_LASTERROR", PyLong_FromLong(FUNCFLAG_USE_LASTERROR)); PyModule_AddObject(m, "FUNCFLAG_PYTHONAPI", PyLong_FromLong(FUNCFLAG_PYTHONAPI)); + PyModule_AddObject(m, "FUNCFLAG_VARIADIC", PyLong_FromLong(FUNCFLAG_VARIADIC)); PyModule_AddStringConstant(m, "__version__", "1.1.0"); PyModule_AddObject(m, "_memmove_addr", PyLong_FromVoidPtr(memmove)); diff --git a/Modules/_ctypes/callproc.c b/Modules/_ctypes/callproc.c index 9cbf9801ad..e7fe11176b 100644 --- a/Modules/_ctypes/callproc.c +++ b/Modules/_ctypes/callproc.c @@ -754,7 +756,8 @@ static int _call_function_pointer(int flags, ffi_type **atypes, ffi_type *restype, void *resmem, - int argcount) + int argcount, + int argtypecount) { PyThreadState *_save = NULL; /* For Py_BLOCK_THREADS and Py_UNBLOCK_THREADS */ PyObject *error_object = NULL; @@ -780,15 +783,39 @@ static int _call_function_pointer(int flags, if ((flags & FUNCFLAG_CDECL) == 0) cc = FFI_STDCALL; #endif - if (FFI_OK != ffi_prep_cif(&cif, - cc, - argcount, - restype, - atypes)) { - PyErr_SetString(PyExc_RuntimeError, - "ffi_prep_cif failed"); - return -1; + +#if HAVE_FFI_PREP_CIF_VAR + /* Everyone SHOULD set f.variadic=True on variadic function pointers, but + * lots of existing code will not. If there's at least one arg and more + * args are passed than are defined in the prototype, then it must be a + * variadic function. */ + if ((flags & FUNCFLAG_VARIADIC) || + (argtypecount != 0 && argcount > argtypecount)) + { + if (FFI_OK != ffi_prep_cif_var(&cif, + cc, + argtypecount, + argcount, + restype, + atypes)) { + PyErr_SetString(PyExc_RuntimeError, + "ffi_prep_cif_var failed"); + return -1; + } + } else { +#endif + if (FFI_OK != ffi_prep_cif(&cif, + cc, + argcount, + restype, + atypes)) { + PyErr_SetString(PyExc_RuntimeError, + "ffi_prep_cif failed"); + return -1; + } +#if HAVE_FFI_PREP_CIF_VAR } +#endif if (flags & (FUNCFLAG_USE_ERRNO | FUNCFLAG_USE_LASTERROR)) { error_object = _ctypes_get_errobj(&space); @@ -1187,9 +1214,8 @@ PyObject *_ctypes_callproc(PPROC pProc, if (-1 == _call_function_pointer(flags, pProc, avalues, atypes, rtype, resbuf, - Py_SAFE_DOWNCAST(argcount, - Py_ssize_t, - int))) + Py_SAFE_DOWNCAST(argcount, Py_ssize_t, int), + Py_SAFE_DOWNCAST(argtype_count, Py_ssize_t, int))) goto cleanup; #ifdef WORDS_BIGENDIAN diff --git a/Modules/_ctypes/ctypes.h b/Modules/_ctypes/ctypes.h index e58f85233c..e45975f6ad 100644 --- a/Modules/_ctypes/ctypes.h +++ b/Modules/_ctypes/ctypes.h @@ -285,6 +285,7 @@ PyObject *_ctypes_callproc(PPROC pProc, #define FUNCFLAG_PYTHONAPI 0x4 #define FUNCFLAG_USE_ERRNO 0x8 #define FUNCFLAG_USE_LASTERROR 0x10 +#define FUNCFLAG_VARIADIC 0x20 #define TYPEFLAG_ISPOINTER 0x100 #define TYPEFLAG_HASPOINTER 0x200 diff --git a/setup.py b/setup.py index bf90600eaa..48ff120e9a 100644 --- a/setup.py +++ b/setup.py @@ -142,6 +142,13 @@ def macosx_sdk_root(): return MACOS_SDK_ROOT +def is_macosx_at_least(vers): + if host_platform == 'darwin': + dep_target = sysconfig.get_config_var('MACOSX_DEPLOYMENT_TARGET') + if dep_target: + return tuple(map(int, str(dep_target).split('.'))) >= vers + return False + def is_macosx_sdk_path(path): """ Returns True if 'path' can be located in an OSX SDK @@ -150,6 +157,13 @@ def is_macosx_sdk_path(path): or path.startswith('/System/') or path.startswith('/Library/') ) +def grep_headers_for(function, headers): + for header in headers: + with open(header, 'r') as f: + if function in f.read(): + return True + return False + def find_file(filename, std_dirs, paths): """Searches for the directory where a given file is located, and returns a possibly-empty list of additional directories, or None @@ -1972,7 +1986,11 @@ class PyBuildExt(build_ext): return True def detect_ctypes(self, inc_dirs, lib_dirs): - self.use_system_libffi = False + if not sysconfig.get_config_var("LIBFFI_INCLUDEDIR") and is_macosx_at_least((10,15)): + self.use_system_libffi = True + else: + self.use_system_libffi = '--with-system-ffi' in sysconfig.get_config_var("CONFIG_ARGS") + include_dirs = [] extra_compile_args = [] extra_link_args = [] @@ -2018,30 +2036,47 @@ class PyBuildExt(build_ext): libraries=['m']) self.extensions.extend([ext, ext_test]) + ffi_inc = sysconfig.get_config_var("LIBFFI_INCLUDEDIR") + ffi_lib = None + if host_platform == 'darwin': - if '--with-system-ffi' not in sysconfig.get_config_var("CONFIG_ARGS"): + if not self.use_system_libffi: return - # OS X 10.5 comes with libffi.dylib; the include files are - # in /usr/include/ffi - inc_dirs.append('/usr/include/ffi') - - ffi_inc = [sysconfig.get_config_var("LIBFFI_INCLUDEDIR")] - if not ffi_inc or ffi_inc[0] == '': - ffi_inc = find_file('ffi.h', [], inc_dirs) - if ffi_inc is not None: - ffi_h = ffi_inc[0] + '/ffi.h' + ffi_in_sdk = os.path.join(macosx_sdk_root(), "usr/include/ffi") + if os.path.exists(ffi_in_sdk): + ffi_inc = ffi_in_sdk + ffi_lib = 'ffi' + else: + # OS X 10.5 comes with libffi.dylib; the include files are + # in /usr/include/ffi + inc_dirs.append('/usr/include/ffi') + + if not ffi_inc: + found = find_file('ffi.h', [], inc_dirs) + if found: + ffi_inc = found[0] + if ffi_inc: + ffi_h = ffi_inc + '/ffi.h' if not os.path.exists(ffi_h): ffi_inc = None print('Header file {} does not exist'.format(ffi_h)) - ffi_lib = None - if ffi_inc is not None: - for lib_name in ('ffi', 'ffi_pic'): + + if ffi_lib is None and ffi_inc: + for lib_name in ('ffi_convenience', 'ffi_pic', 'ffi'): if (self.compiler.find_library_file(lib_dirs, lib_name)): ffi_lib = lib_name break if ffi_inc and ffi_lib: - ext.include_dirs.extend(ffi_inc) + ffi_headers = glob(os.path.join(ffi_inc, '*.h')) + if grep_headers_for('ffi_closure_alloc', ffi_headers): + try: + sources.remove('_ctypes/malloc_closure.c') + except ValueError: + pass + if grep_headers_for('ffi_prep_cif_var', ffi_headers): + ext.extra_compile_args.append("-DHAVE_FFI_PREP_CIF_VAR=1") + ext.include_dirs.append(ffi_inc) ext.libraries.append(ffi_lib) self.use_system_libffi = True -- 2.30.1 (Apple Git-130) 0002-bpo-41100-fix-_decimal-for-arm64-Mac-OS-GH-21228.patch000066400000000000000000000026701517431316200411000ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.7.15/Python-3.7.15From f2595c038ed7bfd182d9d05d83786106ebd02ca0 Mon Sep 17 00:00:00 2001 From: Lawrence D'Anna <64555057+lawrence-danna-apple@users.noreply.github.com> Date: Tue, 30 Jun 2020 02:15:46 -0700 Subject: [PATCH] bpo-41100: fix _decimal for arm64 Mac OS (GH-21228) Patch by Lawrence Danna. --- .../Core and Builtins/2020-06-30-04-44-29.bpo-41100.PJwA6F.rst | 1 + Modules/_decimal/libmpdec/mpdecimal.h | 3 +++ 2 files changed, 4 insertions(+) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-06-30-04-44-29.bpo-41100.PJwA6F.rst diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-06-30-04-44-29.bpo-41100.PJwA6F.rst b/Misc/NEWS.d/next/Core and Builtins/2020-06-30-04-44-29.bpo-41100.PJwA6F.rst new file mode 100644 index 0000000000..d6176d69f0 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-06-30-04-44-29.bpo-41100.PJwA6F.rst @@ -0,0 +1 @@ +add arm64 to the allowable Mac OS arches in mpdecimal.h \ No newline at end of file diff --git a/Modules/_decimal/libmpdec/mpdecimal.h b/Modules/_decimal/libmpdec/mpdecimal.h index a67dd9bc12..3e9c8185c3 100644 --- a/Modules/_decimal/libmpdec/mpdecimal.h +++ b/Modules/_decimal/libmpdec/mpdecimal.h @@ -135,6 +135,9 @@ const char *mpd_version(void); #elif defined(__x86_64__) #define CONFIG_64 #define ASM + #elif defined(__arm64__) + #define CONFIG_64 + #define ANSI #else #error "unknown architecture for universal build." #endif -- 2.37.3 0003-bpo-42351-Avoid-error-when-opening-header-with-non-U.patch000066400000000000000000000016101517431316200430400ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.7.15/Python-3.7.15From 245427d207ee88a4ba26a66c3de350bcbcc036f2 Mon Sep 17 00:00:00 2001 From: Ronald Oussoren Date: Sat, 14 Nov 2020 16:07:47 +0100 Subject: [PATCH] bpo-42351: Avoid error when opening header with non-UTF8 encoding (GH-23279) grep_headers_for() would error out when a header contained text that cannot be interpreted as UTF-8. cherry-picked from 7a27c7ed4b by Pedro Fonini --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index f211989aac..467362813d 100644 --- a/setup.py +++ b/setup.py @@ -159,7 +159,7 @@ def is_macosx_sdk_path(path): def grep_headers_for(function, headers): for header in headers: - with open(header, 'r') as f: + with open(header, 'r', errors='surrogateescape') as f: if function in f.read(): return True return False -- 2.34.1 pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.7.15/openssl-1.1.1q/000077500000000000000000000000001517431316200305765ustar00rootroot00000000000000openssl_1.1.1q_fix_c_include.patch000066400000000000000000000004101517431316200367700ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.7.15/openssl-1.1.1qdiff --git a/test/v3ext.c b/test/v3ext.c index 7a240cd706..6cec6f1a9b 100644 --- a/test/v3ext.c +++ b/test/v3ext.c @@ -15,6 +15,7 @@ #include #include "internal/nelem.h" +#include #include "testutil.h" static const char *infile; pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.7.16/000077500000000000000000000000001517431316200262775ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.7.16/Python-3.7.16/000077500000000000000000000000001517431316200303125ustar00rootroot000000000000000001-Port-ctypes-and-system-libffi-patches-for-arm64-macO.patch000066400000000000000000000276401517431316200434240ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.7.16/Python-3.7.16From: Christian Hammond Date: Wed, 15 Dec 2021 23:12:36 -0800 Subject: Port ctypes and system libffi patches for arm64/macOS 10.15+ to Python 3.7.12 This ports the following ctypes and libffi pyenv patches for Python 2.7.18 to Python 3.7.12: * `0004-Use-system-libffi-for-Mac-OS-10.15-and-up.patch` * `0005-ctypes-use-the-correct-ABI-for-variadic-functions.patch` * `0006-ctypes-probe-libffi-for-ffi_closure_alloc-and-ffi_pr.patch` These patches enable use of system libffi (fixing a broken `ctypes` module on arm64 targets) and enable calling variadic functions on arm64. They've been combined from patches port from Homebrew to pyenv by Takumi Sueda, updated to work on the Python 3.7.12 codebase. The Homebrew patches are themselves backports of changes in Python 3.9 and 3.10. That patch can be found at: https://github.com/Homebrew/formula-patches/blob/master/python/3.8.7.patch diff --git a/Doc/library/ctypes.rst b/Doc/library/ctypes.rst index 715d595b24..7743144978 100644 --- a/Doc/library/ctypes.rst +++ b/Doc/library/ctypes.rst @@ -1551,6 +1551,13 @@ They are instances of a private class: value usable as argument (integer, string, ctypes instance). This allows defining adapters that can adapt custom objects as function parameters. + .. attribute:: variadic + + Assign a boolean to specify that the function takes a variable number of + arguments. This does not matter on most platforms, but for Apple arm64 + platforms variadic functions have a different calling convention than + normal functions. + .. attribute:: errcheck Assign a Python function or another callable to this attribute. The diff --git a/Lib/test/test_unicode.py b/Lib/test/test_unicode.py index 4ebd82d3e0..7b73c190b6 100644 --- a/Lib/test/test_unicode.py +++ b/Lib/test/test_unicode.py @@ -2458,11 +2458,14 @@ class CAPITest(unittest.TestCase): def test_from_format(self): support.import_module('ctypes') from ctypes import ( + c_char_p, pythonapi, py_object, sizeof, c_int, c_long, c_longlong, c_ssize_t, c_uint, c_ulong, c_ulonglong, c_size_t, c_void_p) name = "PyUnicode_FromFormat" _PyUnicode_FromFormat = getattr(pythonapi, name) + _PyUnicode_FromFormat.argtypes = (c_char_p,) + _PyUnicode_FromFormat.variadic = True _PyUnicode_FromFormat.restype = py_object def PyUnicode_FromFormat(format, *args): diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c index dd0c61fd8a..79137e1dc7 100644 --- a/Modules/_ctypes/_ctypes.c +++ b/Modules/_ctypes/_ctypes.c @@ -3174,6 +3174,34 @@ PyCFuncPtr_get_restype(PyCFuncPtrObject *self, void *Py_UNUSED(ignored)) } } +static int +PyCFuncPtr_set_variadic(PyCFuncPtrObject *self, PyObject *ob) +{ + StgDictObject *dict = PyObject_stgdict((PyObject *)self); + assert(dict); + int r = PyObject_IsTrue(ob); + if (r == 1) { + dict->flags |= FUNCFLAG_VARIADIC; + return 0; + } else if (r == 0) { + dict->flags &= ~FUNCFLAG_VARIADIC; + return 0; + } else { + return -1; + } +} + +static PyObject * +PyCFuncPtr_get_variadic(PyCFuncPtrObject *self) +{ + StgDictObject *dict = PyObject_stgdict((PyObject *)self); + assert(dict); /* Cannot be NULL for PyCFuncPtrObject instances */ + if (dict->flags & FUNCFLAG_VARIADIC) + Py_RETURN_TRUE; + else + Py_RETURN_FALSE; +} + static int PyCFuncPtr_set_argtypes(PyCFuncPtrObject *self, PyObject *ob, void *Py_UNUSED(ignored)) { @@ -3219,6 +3247,8 @@ static PyGetSetDef PyCFuncPtr_getsets[] = { { "argtypes", (getter)PyCFuncPtr_get_argtypes, (setter)PyCFuncPtr_set_argtypes, "specify the argument types", NULL }, + { "variadic", (getter)PyCFuncPtr_get_variadic, (setter)PyCFuncPtr_set_variadic, + "specify if function takes variable number of arguments", NULL }, { NULL, NULL } }; @@ -5632,6 +5662,7 @@ PyInit__ctypes(void) PyModule_AddObject(m, "FUNCFLAG_USE_ERRNO", PyLong_FromLong(FUNCFLAG_USE_ERRNO)); PyModule_AddObject(m, "FUNCFLAG_USE_LASTERROR", PyLong_FromLong(FUNCFLAG_USE_LASTERROR)); PyModule_AddObject(m, "FUNCFLAG_PYTHONAPI", PyLong_FromLong(FUNCFLAG_PYTHONAPI)); + PyModule_AddObject(m, "FUNCFLAG_VARIADIC", PyLong_FromLong(FUNCFLAG_VARIADIC)); PyModule_AddStringConstant(m, "__version__", "1.1.0"); PyModule_AddObject(m, "_memmove_addr", PyLong_FromVoidPtr(memmove)); diff --git a/Modules/_ctypes/callproc.c b/Modules/_ctypes/callproc.c index 9cbf9801ad..e7fe11176b 100644 --- a/Modules/_ctypes/callproc.c +++ b/Modules/_ctypes/callproc.c @@ -754,7 +756,8 @@ static int _call_function_pointer(int flags, ffi_type **atypes, ffi_type *restype, void *resmem, - int argcount) + int argcount, + int argtypecount) { PyThreadState *_save = NULL; /* For Py_BLOCK_THREADS and Py_UNBLOCK_THREADS */ PyObject *error_object = NULL; @@ -780,15 +783,39 @@ static int _call_function_pointer(int flags, if ((flags & FUNCFLAG_CDECL) == 0) cc = FFI_STDCALL; #endif - if (FFI_OK != ffi_prep_cif(&cif, - cc, - argcount, - restype, - atypes)) { - PyErr_SetString(PyExc_RuntimeError, - "ffi_prep_cif failed"); - return -1; + +#if HAVE_FFI_PREP_CIF_VAR + /* Everyone SHOULD set f.variadic=True on variadic function pointers, but + * lots of existing code will not. If there's at least one arg and more + * args are passed than are defined in the prototype, then it must be a + * variadic function. */ + if ((flags & FUNCFLAG_VARIADIC) || + (argtypecount != 0 && argcount > argtypecount)) + { + if (FFI_OK != ffi_prep_cif_var(&cif, + cc, + argtypecount, + argcount, + restype, + atypes)) { + PyErr_SetString(PyExc_RuntimeError, + "ffi_prep_cif_var failed"); + return -1; + } + } else { +#endif + if (FFI_OK != ffi_prep_cif(&cif, + cc, + argcount, + restype, + atypes)) { + PyErr_SetString(PyExc_RuntimeError, + "ffi_prep_cif failed"); + return -1; + } +#if HAVE_FFI_PREP_CIF_VAR } +#endif if (flags & (FUNCFLAG_USE_ERRNO | FUNCFLAG_USE_LASTERROR)) { error_object = _ctypes_get_errobj(&space); @@ -1187,9 +1214,8 @@ PyObject *_ctypes_callproc(PPROC pProc, if (-1 == _call_function_pointer(flags, pProc, avalues, atypes, rtype, resbuf, - Py_SAFE_DOWNCAST(argcount, - Py_ssize_t, - int))) + Py_SAFE_DOWNCAST(argcount, Py_ssize_t, int), + Py_SAFE_DOWNCAST(argtype_count, Py_ssize_t, int))) goto cleanup; #ifdef WORDS_BIGENDIAN diff --git a/Modules/_ctypes/ctypes.h b/Modules/_ctypes/ctypes.h index e58f85233c..e45975f6ad 100644 --- a/Modules/_ctypes/ctypes.h +++ b/Modules/_ctypes/ctypes.h @@ -285,6 +285,7 @@ PyObject *_ctypes_callproc(PPROC pProc, #define FUNCFLAG_PYTHONAPI 0x4 #define FUNCFLAG_USE_ERRNO 0x8 #define FUNCFLAG_USE_LASTERROR 0x10 +#define FUNCFLAG_VARIADIC 0x20 #define TYPEFLAG_ISPOINTER 0x100 #define TYPEFLAG_HASPOINTER 0x200 diff --git a/setup.py b/setup.py index bf90600eaa..48ff120e9a 100644 --- a/setup.py +++ b/setup.py @@ -142,6 +142,13 @@ def macosx_sdk_root(): return MACOS_SDK_ROOT +def is_macosx_at_least(vers): + if host_platform == 'darwin': + dep_target = sysconfig.get_config_var('MACOSX_DEPLOYMENT_TARGET') + if dep_target: + return tuple(map(int, str(dep_target).split('.'))) >= vers + return False + def is_macosx_sdk_path(path): """ Returns True if 'path' can be located in an OSX SDK @@ -150,6 +157,13 @@ def is_macosx_sdk_path(path): or path.startswith('/System/') or path.startswith('/Library/') ) +def grep_headers_for(function, headers): + for header in headers: + with open(header, 'r') as f: + if function in f.read(): + return True + return False + def find_file(filename, std_dirs, paths): """Searches for the directory where a given file is located, and returns a possibly-empty list of additional directories, or None @@ -1972,7 +1986,11 @@ class PyBuildExt(build_ext): return True def detect_ctypes(self, inc_dirs, lib_dirs): - self.use_system_libffi = False + if not sysconfig.get_config_var("LIBFFI_INCLUDEDIR") and is_macosx_at_least((10,15)): + self.use_system_libffi = True + else: + self.use_system_libffi = '--with-system-ffi' in sysconfig.get_config_var("CONFIG_ARGS") + include_dirs = [] extra_compile_args = [] extra_link_args = [] @@ -2018,30 +2036,47 @@ class PyBuildExt(build_ext): libraries=['m']) self.extensions.extend([ext, ext_test]) + ffi_inc = sysconfig.get_config_var("LIBFFI_INCLUDEDIR") + ffi_lib = None + if host_platform == 'darwin': - if '--with-system-ffi' not in sysconfig.get_config_var("CONFIG_ARGS"): + if not self.use_system_libffi: return - # OS X 10.5 comes with libffi.dylib; the include files are - # in /usr/include/ffi - inc_dirs.append('/usr/include/ffi') - - ffi_inc = [sysconfig.get_config_var("LIBFFI_INCLUDEDIR")] - if not ffi_inc or ffi_inc[0] == '': - ffi_inc = find_file('ffi.h', [], inc_dirs) - if ffi_inc is not None: - ffi_h = ffi_inc[0] + '/ffi.h' + ffi_in_sdk = os.path.join(macosx_sdk_root(), "usr/include/ffi") + if os.path.exists(ffi_in_sdk): + ffi_inc = ffi_in_sdk + ffi_lib = 'ffi' + else: + # OS X 10.5 comes with libffi.dylib; the include files are + # in /usr/include/ffi + inc_dirs.append('/usr/include/ffi') + + if not ffi_inc: + found = find_file('ffi.h', [], inc_dirs) + if found: + ffi_inc = found[0] + if ffi_inc: + ffi_h = ffi_inc + '/ffi.h' if not os.path.exists(ffi_h): ffi_inc = None print('Header file {} does not exist'.format(ffi_h)) - ffi_lib = None - if ffi_inc is not None: - for lib_name in ('ffi', 'ffi_pic'): + + if ffi_lib is None and ffi_inc: + for lib_name in ('ffi_convenience', 'ffi_pic', 'ffi'): if (self.compiler.find_library_file(lib_dirs, lib_name)): ffi_lib = lib_name break if ffi_inc and ffi_lib: - ext.include_dirs.extend(ffi_inc) + ffi_headers = glob(os.path.join(ffi_inc, '*.h')) + if grep_headers_for('ffi_closure_alloc', ffi_headers): + try: + sources.remove('_ctypes/malloc_closure.c') + except ValueError: + pass + if grep_headers_for('ffi_prep_cif_var', ffi_headers): + ext.extra_compile_args.append("-DHAVE_FFI_PREP_CIF_VAR=1") + ext.include_dirs.append(ffi_inc) ext.libraries.append(ffi_lib) self.use_system_libffi = True -- 2.30.1 (Apple Git-130) 0002-bpo-41100-fix-_decimal-for-arm64-Mac-OS-GH-21228.patch000066400000000000000000000026701517431316200411020ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.7.16/Python-3.7.16From f2595c038ed7bfd182d9d05d83786106ebd02ca0 Mon Sep 17 00:00:00 2001 From: Lawrence D'Anna <64555057+lawrence-danna-apple@users.noreply.github.com> Date: Tue, 30 Jun 2020 02:15:46 -0700 Subject: [PATCH] bpo-41100: fix _decimal for arm64 Mac OS (GH-21228) Patch by Lawrence Danna. --- .../Core and Builtins/2020-06-30-04-44-29.bpo-41100.PJwA6F.rst | 1 + Modules/_decimal/libmpdec/mpdecimal.h | 3 +++ 2 files changed, 4 insertions(+) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-06-30-04-44-29.bpo-41100.PJwA6F.rst diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-06-30-04-44-29.bpo-41100.PJwA6F.rst b/Misc/NEWS.d/next/Core and Builtins/2020-06-30-04-44-29.bpo-41100.PJwA6F.rst new file mode 100644 index 0000000000..d6176d69f0 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-06-30-04-44-29.bpo-41100.PJwA6F.rst @@ -0,0 +1 @@ +add arm64 to the allowable Mac OS arches in mpdecimal.h \ No newline at end of file diff --git a/Modules/_decimal/libmpdec/mpdecimal.h b/Modules/_decimal/libmpdec/mpdecimal.h index a67dd9bc12..3e9c8185c3 100644 --- a/Modules/_decimal/libmpdec/mpdecimal.h +++ b/Modules/_decimal/libmpdec/mpdecimal.h @@ -135,6 +135,9 @@ const char *mpd_version(void); #elif defined(__x86_64__) #define CONFIG_64 #define ASM + #elif defined(__arm64__) + #define CONFIG_64 + #define ANSI #else #error "unknown architecture for universal build." #endif -- 2.37.3 0003-bpo-42351-Avoid-error-when-opening-header-with-non-U.patch000066400000000000000000000016101517431316200430420ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.7.16/Python-3.7.16From 245427d207ee88a4ba26a66c3de350bcbcc036f2 Mon Sep 17 00:00:00 2001 From: Ronald Oussoren Date: Sat, 14 Nov 2020 16:07:47 +0100 Subject: [PATCH] bpo-42351: Avoid error when opening header with non-UTF8 encoding (GH-23279) grep_headers_for() would error out when a header contained text that cannot be interpreted as UTF-8. cherry-picked from 7a27c7ed4b by Pedro Fonini --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index f211989aac..467362813d 100644 --- a/setup.py +++ b/setup.py @@ -159,7 +159,7 @@ def is_macosx_sdk_path(path): def grep_headers_for(function, headers): for header in headers: - with open(header, 'r') as f: + with open(header, 'r', errors='surrogateescape') as f: if function in f.read(): return True return False -- 2.34.1 pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.7.16/openssl-1.1.1q/000077500000000000000000000000001517431316200305775ustar00rootroot00000000000000openssl_1.1.1q_fix_c_include.patch000066400000000000000000000004101517431316200367710ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.7.16/openssl-1.1.1qdiff --git a/test/v3ext.c b/test/v3ext.c index 7a240cd706..6cec6f1a9b 100644 --- a/test/v3ext.c +++ b/test/v3ext.c @@ -15,6 +15,7 @@ #include #include "internal/nelem.h" +#include #include "testutil.h" static const char *infile; pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.7.17/000077500000000000000000000000001517431316200263005ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.7.17/Python-3.7.17/000077500000000000000000000000001517431316200303145ustar00rootroot000000000000000001-Port-ctypes-and-system-libffi-patches-for-arm64-macO.patch000066400000000000000000000276401517431316200434260ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.7.17/Python-3.7.17From: Christian Hammond Date: Wed, 15 Dec 2021 23:12:36 -0800 Subject: Port ctypes and system libffi patches for arm64/macOS 10.15+ to Python 3.7.12 This ports the following ctypes and libffi pyenv patches for Python 2.7.18 to Python 3.7.12: * `0004-Use-system-libffi-for-Mac-OS-10.15-and-up.patch` * `0005-ctypes-use-the-correct-ABI-for-variadic-functions.patch` * `0006-ctypes-probe-libffi-for-ffi_closure_alloc-and-ffi_pr.patch` These patches enable use of system libffi (fixing a broken `ctypes` module on arm64 targets) and enable calling variadic functions on arm64. They've been combined from patches port from Homebrew to pyenv by Takumi Sueda, updated to work on the Python 3.7.12 codebase. The Homebrew patches are themselves backports of changes in Python 3.9 and 3.10. That patch can be found at: https://github.com/Homebrew/formula-patches/blob/master/python/3.8.7.patch diff --git a/Doc/library/ctypes.rst b/Doc/library/ctypes.rst index 715d595b24..7743144978 100644 --- a/Doc/library/ctypes.rst +++ b/Doc/library/ctypes.rst @@ -1551,6 +1551,13 @@ They are instances of a private class: value usable as argument (integer, string, ctypes instance). This allows defining adapters that can adapt custom objects as function parameters. + .. attribute:: variadic + + Assign a boolean to specify that the function takes a variable number of + arguments. This does not matter on most platforms, but for Apple arm64 + platforms variadic functions have a different calling convention than + normal functions. + .. attribute:: errcheck Assign a Python function or another callable to this attribute. The diff --git a/Lib/test/test_unicode.py b/Lib/test/test_unicode.py index 4ebd82d3e0..7b73c190b6 100644 --- a/Lib/test/test_unicode.py +++ b/Lib/test/test_unicode.py @@ -2458,11 +2458,14 @@ class CAPITest(unittest.TestCase): def test_from_format(self): support.import_module('ctypes') from ctypes import ( + c_char_p, pythonapi, py_object, sizeof, c_int, c_long, c_longlong, c_ssize_t, c_uint, c_ulong, c_ulonglong, c_size_t, c_void_p) name = "PyUnicode_FromFormat" _PyUnicode_FromFormat = getattr(pythonapi, name) + _PyUnicode_FromFormat.argtypes = (c_char_p,) + _PyUnicode_FromFormat.variadic = True _PyUnicode_FromFormat.restype = py_object def PyUnicode_FromFormat(format, *args): diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c index dd0c61fd8a..79137e1dc7 100644 --- a/Modules/_ctypes/_ctypes.c +++ b/Modules/_ctypes/_ctypes.c @@ -3174,6 +3174,34 @@ PyCFuncPtr_get_restype(PyCFuncPtrObject *self, void *Py_UNUSED(ignored)) } } +static int +PyCFuncPtr_set_variadic(PyCFuncPtrObject *self, PyObject *ob) +{ + StgDictObject *dict = PyObject_stgdict((PyObject *)self); + assert(dict); + int r = PyObject_IsTrue(ob); + if (r == 1) { + dict->flags |= FUNCFLAG_VARIADIC; + return 0; + } else if (r == 0) { + dict->flags &= ~FUNCFLAG_VARIADIC; + return 0; + } else { + return -1; + } +} + +static PyObject * +PyCFuncPtr_get_variadic(PyCFuncPtrObject *self) +{ + StgDictObject *dict = PyObject_stgdict((PyObject *)self); + assert(dict); /* Cannot be NULL for PyCFuncPtrObject instances */ + if (dict->flags & FUNCFLAG_VARIADIC) + Py_RETURN_TRUE; + else + Py_RETURN_FALSE; +} + static int PyCFuncPtr_set_argtypes(PyCFuncPtrObject *self, PyObject *ob, void *Py_UNUSED(ignored)) { @@ -3219,6 +3247,8 @@ static PyGetSetDef PyCFuncPtr_getsets[] = { { "argtypes", (getter)PyCFuncPtr_get_argtypes, (setter)PyCFuncPtr_set_argtypes, "specify the argument types", NULL }, + { "variadic", (getter)PyCFuncPtr_get_variadic, (setter)PyCFuncPtr_set_variadic, + "specify if function takes variable number of arguments", NULL }, { NULL, NULL } }; @@ -5632,6 +5662,7 @@ PyInit__ctypes(void) PyModule_AddObject(m, "FUNCFLAG_USE_ERRNO", PyLong_FromLong(FUNCFLAG_USE_ERRNO)); PyModule_AddObject(m, "FUNCFLAG_USE_LASTERROR", PyLong_FromLong(FUNCFLAG_USE_LASTERROR)); PyModule_AddObject(m, "FUNCFLAG_PYTHONAPI", PyLong_FromLong(FUNCFLAG_PYTHONAPI)); + PyModule_AddObject(m, "FUNCFLAG_VARIADIC", PyLong_FromLong(FUNCFLAG_VARIADIC)); PyModule_AddStringConstant(m, "__version__", "1.1.0"); PyModule_AddObject(m, "_memmove_addr", PyLong_FromVoidPtr(memmove)); diff --git a/Modules/_ctypes/callproc.c b/Modules/_ctypes/callproc.c index 9cbf9801ad..e7fe11176b 100644 --- a/Modules/_ctypes/callproc.c +++ b/Modules/_ctypes/callproc.c @@ -754,7 +756,8 @@ static int _call_function_pointer(int flags, ffi_type **atypes, ffi_type *restype, void *resmem, - int argcount) + int argcount, + int argtypecount) { PyThreadState *_save = NULL; /* For Py_BLOCK_THREADS and Py_UNBLOCK_THREADS */ PyObject *error_object = NULL; @@ -780,15 +783,39 @@ static int _call_function_pointer(int flags, if ((flags & FUNCFLAG_CDECL) == 0) cc = FFI_STDCALL; #endif - if (FFI_OK != ffi_prep_cif(&cif, - cc, - argcount, - restype, - atypes)) { - PyErr_SetString(PyExc_RuntimeError, - "ffi_prep_cif failed"); - return -1; + +#if HAVE_FFI_PREP_CIF_VAR + /* Everyone SHOULD set f.variadic=True on variadic function pointers, but + * lots of existing code will not. If there's at least one arg and more + * args are passed than are defined in the prototype, then it must be a + * variadic function. */ + if ((flags & FUNCFLAG_VARIADIC) || + (argtypecount != 0 && argcount > argtypecount)) + { + if (FFI_OK != ffi_prep_cif_var(&cif, + cc, + argtypecount, + argcount, + restype, + atypes)) { + PyErr_SetString(PyExc_RuntimeError, + "ffi_prep_cif_var failed"); + return -1; + } + } else { +#endif + if (FFI_OK != ffi_prep_cif(&cif, + cc, + argcount, + restype, + atypes)) { + PyErr_SetString(PyExc_RuntimeError, + "ffi_prep_cif failed"); + return -1; + } +#if HAVE_FFI_PREP_CIF_VAR } +#endif if (flags & (FUNCFLAG_USE_ERRNO | FUNCFLAG_USE_LASTERROR)) { error_object = _ctypes_get_errobj(&space); @@ -1187,9 +1214,8 @@ PyObject *_ctypes_callproc(PPROC pProc, if (-1 == _call_function_pointer(flags, pProc, avalues, atypes, rtype, resbuf, - Py_SAFE_DOWNCAST(argcount, - Py_ssize_t, - int))) + Py_SAFE_DOWNCAST(argcount, Py_ssize_t, int), + Py_SAFE_DOWNCAST(argtype_count, Py_ssize_t, int))) goto cleanup; #ifdef WORDS_BIGENDIAN diff --git a/Modules/_ctypes/ctypes.h b/Modules/_ctypes/ctypes.h index e58f85233c..e45975f6ad 100644 --- a/Modules/_ctypes/ctypes.h +++ b/Modules/_ctypes/ctypes.h @@ -285,6 +285,7 @@ PyObject *_ctypes_callproc(PPROC pProc, #define FUNCFLAG_PYTHONAPI 0x4 #define FUNCFLAG_USE_ERRNO 0x8 #define FUNCFLAG_USE_LASTERROR 0x10 +#define FUNCFLAG_VARIADIC 0x20 #define TYPEFLAG_ISPOINTER 0x100 #define TYPEFLAG_HASPOINTER 0x200 diff --git a/setup.py b/setup.py index bf90600eaa..48ff120e9a 100644 --- a/setup.py +++ b/setup.py @@ -142,6 +142,13 @@ def macosx_sdk_root(): return MACOS_SDK_ROOT +def is_macosx_at_least(vers): + if host_platform == 'darwin': + dep_target = sysconfig.get_config_var('MACOSX_DEPLOYMENT_TARGET') + if dep_target: + return tuple(map(int, str(dep_target).split('.'))) >= vers + return False + def is_macosx_sdk_path(path): """ Returns True if 'path' can be located in an OSX SDK @@ -150,6 +157,13 @@ def is_macosx_sdk_path(path): or path.startswith('/System/') or path.startswith('/Library/') ) +def grep_headers_for(function, headers): + for header in headers: + with open(header, 'r') as f: + if function in f.read(): + return True + return False + def find_file(filename, std_dirs, paths): """Searches for the directory where a given file is located, and returns a possibly-empty list of additional directories, or None @@ -1972,7 +1986,11 @@ class PyBuildExt(build_ext): return True def detect_ctypes(self, inc_dirs, lib_dirs): - self.use_system_libffi = False + if not sysconfig.get_config_var("LIBFFI_INCLUDEDIR") and is_macosx_at_least((10,15)): + self.use_system_libffi = True + else: + self.use_system_libffi = '--with-system-ffi' in sysconfig.get_config_var("CONFIG_ARGS") + include_dirs = [] extra_compile_args = [] extra_link_args = [] @@ -2018,30 +2036,47 @@ class PyBuildExt(build_ext): libraries=['m']) self.extensions.extend([ext, ext_test]) + ffi_inc = sysconfig.get_config_var("LIBFFI_INCLUDEDIR") + ffi_lib = None + if host_platform == 'darwin': - if '--with-system-ffi' not in sysconfig.get_config_var("CONFIG_ARGS"): + if not self.use_system_libffi: return - # OS X 10.5 comes with libffi.dylib; the include files are - # in /usr/include/ffi - inc_dirs.append('/usr/include/ffi') - - ffi_inc = [sysconfig.get_config_var("LIBFFI_INCLUDEDIR")] - if not ffi_inc or ffi_inc[0] == '': - ffi_inc = find_file('ffi.h', [], inc_dirs) - if ffi_inc is not None: - ffi_h = ffi_inc[0] + '/ffi.h' + ffi_in_sdk = os.path.join(macosx_sdk_root(), "usr/include/ffi") + if os.path.exists(ffi_in_sdk): + ffi_inc = ffi_in_sdk + ffi_lib = 'ffi' + else: + # OS X 10.5 comes with libffi.dylib; the include files are + # in /usr/include/ffi + inc_dirs.append('/usr/include/ffi') + + if not ffi_inc: + found = find_file('ffi.h', [], inc_dirs) + if found: + ffi_inc = found[0] + if ffi_inc: + ffi_h = ffi_inc + '/ffi.h' if not os.path.exists(ffi_h): ffi_inc = None print('Header file {} does not exist'.format(ffi_h)) - ffi_lib = None - if ffi_inc is not None: - for lib_name in ('ffi', 'ffi_pic'): + + if ffi_lib is None and ffi_inc: + for lib_name in ('ffi_convenience', 'ffi_pic', 'ffi'): if (self.compiler.find_library_file(lib_dirs, lib_name)): ffi_lib = lib_name break if ffi_inc and ffi_lib: - ext.include_dirs.extend(ffi_inc) + ffi_headers = glob(os.path.join(ffi_inc, '*.h')) + if grep_headers_for('ffi_closure_alloc', ffi_headers): + try: + sources.remove('_ctypes/malloc_closure.c') + except ValueError: + pass + if grep_headers_for('ffi_prep_cif_var', ffi_headers): + ext.extra_compile_args.append("-DHAVE_FFI_PREP_CIF_VAR=1") + ext.include_dirs.append(ffi_inc) ext.libraries.append(ffi_lib) self.use_system_libffi = True -- 2.30.1 (Apple Git-130) 0002-bpo-41100-fix-_decimal-for-arm64-Mac-OS-GH-21228.patch000066400000000000000000000026701517431316200411040ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.7.17/Python-3.7.17From f2595c038ed7bfd182d9d05d83786106ebd02ca0 Mon Sep 17 00:00:00 2001 From: Lawrence D'Anna <64555057+lawrence-danna-apple@users.noreply.github.com> Date: Tue, 30 Jun 2020 02:15:46 -0700 Subject: [PATCH] bpo-41100: fix _decimal for arm64 Mac OS (GH-21228) Patch by Lawrence Danna. --- .../Core and Builtins/2020-06-30-04-44-29.bpo-41100.PJwA6F.rst | 1 + Modules/_decimal/libmpdec/mpdecimal.h | 3 +++ 2 files changed, 4 insertions(+) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-06-30-04-44-29.bpo-41100.PJwA6F.rst diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-06-30-04-44-29.bpo-41100.PJwA6F.rst b/Misc/NEWS.d/next/Core and Builtins/2020-06-30-04-44-29.bpo-41100.PJwA6F.rst new file mode 100644 index 0000000000..d6176d69f0 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-06-30-04-44-29.bpo-41100.PJwA6F.rst @@ -0,0 +1 @@ +add arm64 to the allowable Mac OS arches in mpdecimal.h \ No newline at end of file diff --git a/Modules/_decimal/libmpdec/mpdecimal.h b/Modules/_decimal/libmpdec/mpdecimal.h index a67dd9bc12..3e9c8185c3 100644 --- a/Modules/_decimal/libmpdec/mpdecimal.h +++ b/Modules/_decimal/libmpdec/mpdecimal.h @@ -135,6 +135,9 @@ const char *mpd_version(void); #elif defined(__x86_64__) #define CONFIG_64 #define ASM + #elif defined(__arm64__) + #define CONFIG_64 + #define ANSI #else #error "unknown architecture for universal build." #endif -- 2.37.3 0003-bpo-42351-Avoid-error-when-opening-header-with-non-U.patch000066400000000000000000000016101517431316200430440ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.7.17/Python-3.7.17From 245427d207ee88a4ba26a66c3de350bcbcc036f2 Mon Sep 17 00:00:00 2001 From: Ronald Oussoren Date: Sat, 14 Nov 2020 16:07:47 +0100 Subject: [PATCH] bpo-42351: Avoid error when opening header with non-UTF8 encoding (GH-23279) grep_headers_for() would error out when a header contained text that cannot be interpreted as UTF-8. cherry-picked from 7a27c7ed4b by Pedro Fonini --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index f211989aac..467362813d 100644 --- a/setup.py +++ b/setup.py @@ -159,7 +159,7 @@ def is_macosx_sdk_path(path): def grep_headers_for(function, headers): for header in headers: - with open(header, 'r') as f: + with open(header, 'r', errors='surrogateescape') as f: if function in f.read(): return True return False -- 2.34.1 0004-Recognize-an-argument-to-j-in-MAKEFLAGS.patch000066400000000000000000000015661517431316200405530ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.7.17/Python-3.7.17From ed9010349e8f6351a64ba2c7005fa0c3e40655bd Mon Sep 17 00:00:00 2001 From: Ivan Pozdeev Date: Fri, 26 Dec 2025 13:39:21 +0300 Subject: [PATCH] Recognize an argument to -j in MAKEFLAGS --- setup.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index 467362813dc..a3623c577af 100644 --- a/setup.py +++ b/setup.py @@ -277,8 +277,10 @@ class PyBuildExt(build_ext): build_ext.__init__(self, dist) self.failed = [] self.failed_on_import = [] - if '-j' in os.environ.get('MAKEFLAGS', ''): - self.parallel = True + m=re.search(r'(?:^|\s)(?:-j|--jobs)(?:\s+|=)?(\d*)',os.environ.get('MAKEFLAGS', '')) + if m is not None: + self.parallel = int(m.group(1)) if m.group(1) else True + del m def build_extensions(self): -- 2.36.1.windows.1 pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.7.8/000077500000000000000000000000001517431316200262205ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.7.8/Python-3.7.8/000077500000000000000000000000001517431316200301545ustar00rootroot000000000000000001-bpo-45405-Prevent-internal-configure-error-when-runn.patch000066400000000000000000000054361517431316200432230ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.7.8/Python-3.7.8From 5b79a7da20953f107657dea5192ed77cc8554ff0 Mon Sep 17 00:00:00 2001 From: David Bohman Date: Tue, 12 Oct 2021 17:10:26 -0700 Subject: [PATCH] bpo-45405: Prevent ``internal configure error`` when running ``configure`` with recent versions of non-Apple clang. (#28845) Change the configure logic to function properly on macOS when the compiler outputs a platform triplet for option --print-multiarch. Co-authored-by: Ned Deily --- .../next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst | 2 ++ configure | 8 +++++--- configure.ac | 8 +++++--- 3 files changed, 12 insertions(+), 6 deletions(-) create mode 100644 Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst diff --git a/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst b/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst new file mode 100644 index 0000000000..a2dc5bcc32 --- /dev/null +++ b/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst @@ -0,0 +1,2 @@ +Prevent ``internal configure error`` when running ``configure`` +with recent versions of non-Apple clang. Patch by David Bohman. diff --git a/configure b/configure index c807c98e56..51a7d60f54 100755 --- a/configure +++ b/configure @@ -5183,9 +5183,6 @@ $as_echo "$as_me: fi -MULTIARCH=$($CC --print-multiarch 2>/dev/null) - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the platform triplet based on compiler characteristics" >&5 $as_echo_n "checking for the platform triplet based on compiler characteristics... " >&6; } cat >> conftest.c <&6; } fi rm -f conftest.c conftest.out +if test x$PLATFORM_TRIPLET != xdarwin; then + MULTIARCH=$($CC --print-multiarch 2>/dev/null) +fi + + if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then if test x$PLATFORM_TRIPLET != x$MULTIARCH; then as_fn_error $? "internal configure error for the platform triplet, please file a bug report" "$LINENO" 5 diff --git a/configure.ac b/configure.ac index 805c0bba08..ede2197cb3 100644 --- a/configure.ac +++ b/configure.ac @@ -724,9 +724,6 @@ then fi -MULTIARCH=$($CC --print-multiarch 2>/dev/null) -AC_SUBST(MULTIARCH) - AC_MSG_CHECKING([for the platform triplet based on compiler characteristics]) cat >> conftest.c </dev/null) +fi +AC_SUBST(MULTIARCH) + if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then if test x$PLATFORM_TRIPLET != x$MULTIARCH; then AC_MSG_ERROR([internal configure error for the platform triplet, please file a bug report]) -- 2.29.2.windows.2 pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.7.9/000077500000000000000000000000001517431316200262215ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.7.9/Python-3.7.9/000077500000000000000000000000001517431316200301565ustar00rootroot000000000000000001-bpo-45405-Prevent-internal-configure-error-when-runn.patch000066400000000000000000000054361517431316200432250ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.7.9/Python-3.7.9From 1d6f94126d0af2370ba0e4c7d8befc1c7ecf35d8 Mon Sep 17 00:00:00 2001 From: David Bohman Date: Tue, 12 Oct 2021 17:10:26 -0700 Subject: [PATCH] bpo-45405: Prevent ``internal configure error`` when running ``configure`` with recent versions of non-Apple clang. (#28845) Change the configure logic to function properly on macOS when the compiler outputs a platform triplet for option --print-multiarch. Co-authored-by: Ned Deily --- .../next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst | 2 ++ configure | 8 +++++--- configure.ac | 8 +++++--- 3 files changed, 12 insertions(+), 6 deletions(-) create mode 100644 Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst diff --git a/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst b/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst new file mode 100644 index 0000000000..a2dc5bcc32 --- /dev/null +++ b/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst @@ -0,0 +1,2 @@ +Prevent ``internal configure error`` when running ``configure`` +with recent versions of non-Apple clang. Patch by David Bohman. diff --git a/configure b/configure index 829dd69bb8..455481bc50 100755 --- a/configure +++ b/configure @@ -5183,9 +5183,6 @@ $as_echo "$as_me: fi -MULTIARCH=$($CC --print-multiarch 2>/dev/null) - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the platform triplet based on compiler characteristics" >&5 $as_echo_n "checking for the platform triplet based on compiler characteristics... " >&6; } cat >> conftest.c <&6; } fi rm -f conftest.c conftest.out +if test x$PLATFORM_TRIPLET != xdarwin; then + MULTIARCH=$($CC --print-multiarch 2>/dev/null) +fi + + if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then if test x$PLATFORM_TRIPLET != x$MULTIARCH; then as_fn_error $? "internal configure error for the platform triplet, please file a bug report" "$LINENO" 5 diff --git a/configure.ac b/configure.ac index f1cc8e9bcb..1afcba3307 100644 --- a/configure.ac +++ b/configure.ac @@ -724,9 +724,6 @@ then fi -MULTIARCH=$($CC --print-multiarch 2>/dev/null) -AC_SUBST(MULTIARCH) - AC_MSG_CHECKING([for the platform triplet based on compiler characteristics]) cat >> conftest.c </dev/null) +fi +AC_SUBST(MULTIARCH) + if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then if test x$PLATFORM_TRIPLET != x$MULTIARCH; then AC_MSG_ERROR([internal configure error for the platform triplet, please file a bug report]) -- 2.29.2.windows.2 pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.8.10/000077500000000000000000000000001517431316200262725ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.8.10/Python-3.8.10/000077500000000000000000000000001517431316200303005ustar00rootroot000000000000000001-bpo-45405-Prevent-internal-configure-error-when-runn.patch000066400000000000000000000054241517431316200433440ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.8.10/Python-3.8.10From 8ced1a904558ff9499673083cf13abf03a76b7d0 Mon Sep 17 00:00:00 2001 From: David Bohman Date: Tue, 12 Oct 2021 17:10:26 -0700 Subject: [PATCH] bpo-45405: Prevent ``internal configure error`` when running ``configure`` with recent versions of non-Apple clang. (#28845) Change the configure logic to function properly on macOS when the compiler outputs a platform triplet for option --print-multiarch. Co-authored-by: Ned Deily --- .../next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst | 2 ++ configure | 8 +++++--- configure.ac | 8 +++++--- 3 files changed, 12 insertions(+), 6 deletions(-) create mode 100644 Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst diff --git a/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst b/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst new file mode 100644 index 0000000000..a2dc5bcc32 --- /dev/null +++ b/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst @@ -0,0 +1,2 @@ +Prevent ``internal configure error`` when running ``configure`` +with recent versions of non-Apple clang. Patch by David Bohman. diff --git a/configure b/configure index 936f3d4596..c091865aff 100755 --- a/configure +++ b/configure @@ -5160,9 +5160,6 @@ $as_echo "$as_me: fi -MULTIARCH=$($CC --print-multiarch 2>/dev/null) - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the platform triplet based on compiler characteristics" >&5 $as_echo_n "checking for the platform triplet based on compiler characteristics... " >&6; } cat >> conftest.c <&6; } fi rm -f conftest.c conftest.out +if test x$PLATFORM_TRIPLET != xdarwin; then + MULTIARCH=$($CC --print-multiarch 2>/dev/null) +fi + + if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then if test x$PLATFORM_TRIPLET != x$MULTIARCH; then as_fn_error $? "internal configure error for the platform triplet, please file a bug report" "$LINENO" 5 diff --git a/configure.ac b/configure.ac index e02cc2c656..de83332dd3 100644 --- a/configure.ac +++ b/configure.ac @@ -719,9 +719,6 @@ then fi -MULTIARCH=$($CC --print-multiarch 2>/dev/null) -AC_SUBST(MULTIARCH) - AC_MSG_CHECKING([for the platform triplet based on compiler characteristics]) cat >> conftest.c </dev/null) +fi +AC_SUBST(MULTIARCH) + if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then if test x$PLATFORM_TRIPLET != x$MULTIARCH; then AC_MSG_ERROR([internal configure error for the platform triplet, please file a bug report]) -- 2.36.0 pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.8.11/000077500000000000000000000000001517431316200262735ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.8.11/Python-3.8.11/000077500000000000000000000000001517431316200303025ustar00rootroot000000000000000001-bpo-45405-Prevent-internal-configure-error-when-runn.patch000066400000000000000000000054241517431316200433460ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.8.11/Python-3.8.11From 7f35b41fa1e13fb9915fd476eaec2b15e2082c4f Mon Sep 17 00:00:00 2001 From: David Bohman Date: Tue, 12 Oct 2021 17:10:26 -0700 Subject: [PATCH] bpo-45405: Prevent ``internal configure error`` when running ``configure`` with recent versions of non-Apple clang. (#28845) Change the configure logic to function properly on macOS when the compiler outputs a platform triplet for option --print-multiarch. Co-authored-by: Ned Deily --- .../next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst | 2 ++ configure | 8 +++++--- configure.ac | 8 +++++--- 3 files changed, 12 insertions(+), 6 deletions(-) create mode 100644 Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst diff --git a/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst b/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst new file mode 100644 index 0000000000..a2dc5bcc32 --- /dev/null +++ b/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst @@ -0,0 +1,2 @@ +Prevent ``internal configure error`` when running ``configure`` +with recent versions of non-Apple clang. Patch by David Bohman. diff --git a/configure b/configure index 936f3d4596..c091865aff 100755 --- a/configure +++ b/configure @@ -5160,9 +5160,6 @@ $as_echo "$as_me: fi -MULTIARCH=$($CC --print-multiarch 2>/dev/null) - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the platform triplet based on compiler characteristics" >&5 $as_echo_n "checking for the platform triplet based on compiler characteristics... " >&6; } cat >> conftest.c <&6; } fi rm -f conftest.c conftest.out +if test x$PLATFORM_TRIPLET != xdarwin; then + MULTIARCH=$($CC --print-multiarch 2>/dev/null) +fi + + if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then if test x$PLATFORM_TRIPLET != x$MULTIARCH; then as_fn_error $? "internal configure error for the platform triplet, please file a bug report" "$LINENO" 5 diff --git a/configure.ac b/configure.ac index e02cc2c656..de83332dd3 100644 --- a/configure.ac +++ b/configure.ac @@ -719,9 +719,6 @@ then fi -MULTIARCH=$($CC --print-multiarch 2>/dev/null) -AC_SUBST(MULTIARCH) - AC_MSG_CHECKING([for the platform triplet based on compiler characteristics]) cat >> conftest.c </dev/null) +fi +AC_SUBST(MULTIARCH) + if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then if test x$PLATFORM_TRIPLET != x$MULTIARCH; then AC_MSG_ERROR([internal configure error for the platform triplet, please file a bug report]) -- 2.36.0 pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.8.12/000077500000000000000000000000001517431316200262745ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.8.12/Python-3.8.12/000077500000000000000000000000001517431316200303045ustar00rootroot000000000000000001-bpo-45405-Prevent-internal-configure-error-when-runn.patch000066400000000000000000000054241517431316200433500ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.8.12/Python-3.8.12From c4379ecd43dab0d2c836787d82bce4f20eed892b Mon Sep 17 00:00:00 2001 From: David Bohman Date: Tue, 12 Oct 2021 17:10:26 -0700 Subject: [PATCH] bpo-45405: Prevent ``internal configure error`` when running ``configure`` with recent versions of non-Apple clang. (#28845) Change the configure logic to function properly on macOS when the compiler outputs a platform triplet for option --print-multiarch. Co-authored-by: Ned Deily --- .../next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst | 2 ++ configure | 8 +++++--- configure.ac | 8 +++++--- 3 files changed, 12 insertions(+), 6 deletions(-) create mode 100644 Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst diff --git a/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst b/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst new file mode 100644 index 0000000000..a2dc5bcc32 --- /dev/null +++ b/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst @@ -0,0 +1,2 @@ +Prevent ``internal configure error`` when running ``configure`` +with recent versions of non-Apple clang. Patch by David Bohman. diff --git a/configure b/configure index 936f3d4596..c091865aff 100755 --- a/configure +++ b/configure @@ -5160,9 +5160,6 @@ $as_echo "$as_me: fi -MULTIARCH=$($CC --print-multiarch 2>/dev/null) - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the platform triplet based on compiler characteristics" >&5 $as_echo_n "checking for the platform triplet based on compiler characteristics... " >&6; } cat >> conftest.c <&6; } fi rm -f conftest.c conftest.out +if test x$PLATFORM_TRIPLET != xdarwin; then + MULTIARCH=$($CC --print-multiarch 2>/dev/null) +fi + + if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then if test x$PLATFORM_TRIPLET != x$MULTIARCH; then as_fn_error $? "internal configure error for the platform triplet, please file a bug report" "$LINENO" 5 diff --git a/configure.ac b/configure.ac index e02cc2c656..de83332dd3 100644 --- a/configure.ac +++ b/configure.ac @@ -719,9 +719,6 @@ then fi -MULTIARCH=$($CC --print-multiarch 2>/dev/null) -AC_SUBST(MULTIARCH) - AC_MSG_CHECKING([for the platform triplet based on compiler characteristics]) cat >> conftest.c </dev/null) +fi +AC_SUBST(MULTIARCH) + if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then if test x$PLATFORM_TRIPLET != x$MULTIARCH; then AC_MSG_ERROR([internal configure error for the platform triplet, please file a bug report]) -- 2.36.0 pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.8.15/000077500000000000000000000000001517431316200262775ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.8.15/openssl-1.1.1q/000077500000000000000000000000001517431316200305775ustar00rootroot00000000000000openssl_1.1.1q_fix_c_include.patch000066400000000000000000000004101517431316200367710ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.8.15/openssl-1.1.1qdiff --git a/test/v3ext.c b/test/v3ext.c index 7a240cd706..6cec6f1a9b 100644 --- a/test/v3ext.c +++ b/test/v3ext.c @@ -15,6 +15,7 @@ #include #include "internal/nelem.h" +#include #include "testutil.h" static const char *infile; pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.8.16/000077500000000000000000000000001517431316200263005ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.8.16/openssl-1.1.1q/000077500000000000000000000000001517431316200306005ustar00rootroot00000000000000openssl_1.1.1q_fix_c_include.patch000066400000000000000000000004101517431316200367720ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.8.16/openssl-1.1.1qdiff --git a/test/v3ext.c b/test/v3ext.c index 7a240cd706..6cec6f1a9b 100644 --- a/test/v3ext.c +++ b/test/v3ext.c @@ -15,6 +15,7 @@ #include #include "internal/nelem.h" +#include #include "testutil.h" static const char *infile; pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.8.20/000077500000000000000000000000001517431316200262735ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.8.20/Python-3.8.20/000077500000000000000000000000001517431316200303025ustar00rootroot000000000000000001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch000066400000000000000000000015521517431316200405310ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.8.20/Python-3.8.20From 89a756fe5d31962b8daf5d31c445556c42dfb764 Mon Sep 17 00:00:00 2001 From: Ivan Pozdeev Date: Fri, 26 Dec 2025 13:39:21 +0300 Subject: [PATCH] Recognize an argument to -j in MAKEFLAGS --- setup.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index 57be07a7e0f..e55cfb88c35 100644 --- a/setup.py +++ b/setup.py @@ -288,8 +288,8 @@ class PyBuildExt(build_ext): self.failed = [] self.failed_on_import = [] self.missing = [] - if '-j' in os.environ.get('MAKEFLAGS', ''): - self.parallel = True + if (m:=re.search(r'(?:^|\s)(?:-j|--jobs)(?:\s+|=)?(\d*)',os.environ.get('MAKEFLAGS', ''))) is not None: + self.parallel = int(m.group(1)) if m.group(1) else True def add(self, ext): self.extensions.append(ext) -- 2.36.1.windows.1 pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.8.4/000077500000000000000000000000001517431316200262155ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.8.4/Python-3.8.4/000077500000000000000000000000001517431316200301465ustar00rootroot000000000000000001-bpo-45405-Prevent-internal-configure-error-when-runn.patch000066400000000000000000000054241517431316200432120ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.8.4/Python-3.8.4From 3af555f75a53a82fa074572b24cb6516d3db0645 Mon Sep 17 00:00:00 2001 From: David Bohman Date: Tue, 12 Oct 2021 17:10:26 -0700 Subject: [PATCH] bpo-45405: Prevent ``internal configure error`` when running ``configure`` with recent versions of non-Apple clang. (#28845) Change the configure logic to function properly on macOS when the compiler outputs a platform triplet for option --print-multiarch. Co-authored-by: Ned Deily --- .../next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst | 2 ++ configure | 8 +++++--- configure.ac | 8 +++++--- 3 files changed, 12 insertions(+), 6 deletions(-) create mode 100644 Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst diff --git a/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst b/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst new file mode 100644 index 0000000000..a2dc5bcc32 --- /dev/null +++ b/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst @@ -0,0 +1,2 @@ +Prevent ``internal configure error`` when running ``configure`` +with recent versions of non-Apple clang. Patch by David Bohman. diff --git a/configure b/configure index 96dcd0dcd5..1fb735bf8b 100755 --- a/configure +++ b/configure @@ -5167,9 +5167,6 @@ $as_echo "$as_me: fi -MULTIARCH=$($CC --print-multiarch 2>/dev/null) - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the platform triplet based on compiler characteristics" >&5 $as_echo_n "checking for the platform triplet based on compiler characteristics... " >&6; } cat >> conftest.c <&6; } fi rm -f conftest.c conftest.out +if test x$PLATFORM_TRIPLET != xdarwin; then + MULTIARCH=$($CC --print-multiarch 2>/dev/null) +fi + + if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then if test x$PLATFORM_TRIPLET != x$MULTIARCH; then as_fn_error $? "internal configure error for the platform triplet, please file a bug report" "$LINENO" 5 diff --git a/configure.ac b/configure.ac index 18a044629a..6d841d928d 100644 --- a/configure.ac +++ b/configure.ac @@ -706,9 +706,6 @@ then fi -MULTIARCH=$($CC --print-multiarch 2>/dev/null) -AC_SUBST(MULTIARCH) - AC_MSG_CHECKING([for the platform triplet based on compiler characteristics]) cat >> conftest.c </dev/null) +fi +AC_SUBST(MULTIARCH) + if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then if test x$PLATFORM_TRIPLET != x$MULTIARCH; then AC_MSG_ERROR([internal configure error for the platform triplet, please file a bug report]) -- 2.36.0 pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.8.5/000077500000000000000000000000001517431316200262165ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.8.5/Python-3.8.5/000077500000000000000000000000001517431316200301505ustar00rootroot000000000000000001-bpo-45405-Prevent-internal-configure-error-when-runn.patch000066400000000000000000000054241517431316200432140ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.8.5/Python-3.8.5From 988821dfd8b087368dfee462d73f518ca4cfbfe0 Mon Sep 17 00:00:00 2001 From: David Bohman Date: Tue, 12 Oct 2021 17:10:26 -0700 Subject: [PATCH] bpo-45405: Prevent ``internal configure error`` when running ``configure`` with recent versions of non-Apple clang. (#28845) Change the configure logic to function properly on macOS when the compiler outputs a platform triplet for option --print-multiarch. Co-authored-by: Ned Deily --- .../next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst | 2 ++ configure | 8 +++++--- configure.ac | 8 +++++--- 3 files changed, 12 insertions(+), 6 deletions(-) create mode 100644 Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst diff --git a/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst b/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst new file mode 100644 index 0000000000..a2dc5bcc32 --- /dev/null +++ b/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst @@ -0,0 +1,2 @@ +Prevent ``internal configure error`` when running ``configure`` +with recent versions of non-Apple clang. Patch by David Bohman. diff --git a/configure b/configure index 96dcd0dcd5..1fb735bf8b 100755 --- a/configure +++ b/configure @@ -5167,9 +5167,6 @@ $as_echo "$as_me: fi -MULTIARCH=$($CC --print-multiarch 2>/dev/null) - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the platform triplet based on compiler characteristics" >&5 $as_echo_n "checking for the platform triplet based on compiler characteristics... " >&6; } cat >> conftest.c <&6; } fi rm -f conftest.c conftest.out +if test x$PLATFORM_TRIPLET != xdarwin; then + MULTIARCH=$($CC --print-multiarch 2>/dev/null) +fi + + if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then if test x$PLATFORM_TRIPLET != x$MULTIARCH; then as_fn_error $? "internal configure error for the platform triplet, please file a bug report" "$LINENO" 5 diff --git a/configure.ac b/configure.ac index 18a044629a..6d841d928d 100644 --- a/configure.ac +++ b/configure.ac @@ -706,9 +706,6 @@ then fi -MULTIARCH=$($CC --print-multiarch 2>/dev/null) -AC_SUBST(MULTIARCH) - AC_MSG_CHECKING([for the platform triplet based on compiler characteristics]) cat >> conftest.c </dev/null) +fi +AC_SUBST(MULTIARCH) + if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then if test x$PLATFORM_TRIPLET != x$MULTIARCH; then AC_MSG_ERROR([internal configure error for the platform triplet, please file a bug report]) -- 2.36.0 pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.8.6/000077500000000000000000000000001517431316200262175ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.8.6/Python-3.8.6/000077500000000000000000000000001517431316200301525ustar00rootroot000000000000000001-bpo-45405-Prevent-internal-configure-error-when-runn.patch000066400000000000000000000054241517431316200432160ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.8.6/Python-3.8.6From 7ec2de6bb20a934424df28c6566e6fc3a5eab6d4 Mon Sep 17 00:00:00 2001 From: David Bohman Date: Tue, 12 Oct 2021 17:10:26 -0700 Subject: [PATCH] bpo-45405: Prevent ``internal configure error`` when running ``configure`` with recent versions of non-Apple clang. (#28845) Change the configure logic to function properly on macOS when the compiler outputs a platform triplet for option --print-multiarch. Co-authored-by: Ned Deily --- .../next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst | 2 ++ configure | 8 +++++--- configure.ac | 8 +++++--- 3 files changed, 12 insertions(+), 6 deletions(-) create mode 100644 Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst diff --git a/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst b/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst new file mode 100644 index 0000000000..a2dc5bcc32 --- /dev/null +++ b/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst @@ -0,0 +1,2 @@ +Prevent ``internal configure error`` when running ``configure`` +with recent versions of non-Apple clang. Patch by David Bohman. diff --git a/configure b/configure index 96dcd0dcd5..1fb735bf8b 100755 --- a/configure +++ b/configure @@ -5167,9 +5167,6 @@ $as_echo "$as_me: fi -MULTIARCH=$($CC --print-multiarch 2>/dev/null) - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the platform triplet based on compiler characteristics" >&5 $as_echo_n "checking for the platform triplet based on compiler characteristics... " >&6; } cat >> conftest.c <&6; } fi rm -f conftest.c conftest.out +if test x$PLATFORM_TRIPLET != xdarwin; then + MULTIARCH=$($CC --print-multiarch 2>/dev/null) +fi + + if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then if test x$PLATFORM_TRIPLET != x$MULTIARCH; then as_fn_error $? "internal configure error for the platform triplet, please file a bug report" "$LINENO" 5 diff --git a/configure.ac b/configure.ac index 18a044629a..6d841d928d 100644 --- a/configure.ac +++ b/configure.ac @@ -706,9 +706,6 @@ then fi -MULTIARCH=$($CC --print-multiarch 2>/dev/null) -AC_SUBST(MULTIARCH) - AC_MSG_CHECKING([for the platform triplet based on compiler characteristics]) cat >> conftest.c </dev/null) +fi +AC_SUBST(MULTIARCH) + if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then if test x$PLATFORM_TRIPLET != x$MULTIARCH; then AC_MSG_ERROR([internal configure error for the platform triplet, please file a bug report]) -- 2.36.0 pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.8.7/000077500000000000000000000000001517431316200262205ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.8.7/Python-3.8.7/000077500000000000000000000000001517431316200301545ustar00rootroot000000000000000001-bpo-45405-Prevent-internal-configure-error-when-runn.patch000066400000000000000000000054241517431316200432200ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.8.7/Python-3.8.7From 97f07c98cac3d095c5c3f5816e4c7b3fe7b9c251 Mon Sep 17 00:00:00 2001 From: David Bohman Date: Tue, 12 Oct 2021 17:10:26 -0700 Subject: [PATCH] bpo-45405: Prevent ``internal configure error`` when running ``configure`` with recent versions of non-Apple clang. (#28845) Change the configure logic to function properly on macOS when the compiler outputs a platform triplet for option --print-multiarch. Co-authored-by: Ned Deily --- .../next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst | 2 ++ configure | 8 +++++--- configure.ac | 8 +++++--- 3 files changed, 12 insertions(+), 6 deletions(-) create mode 100644 Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst diff --git a/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst b/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst new file mode 100644 index 0000000000..a2dc5bcc32 --- /dev/null +++ b/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst @@ -0,0 +1,2 @@ +Prevent ``internal configure error`` when running ``configure`` +with recent versions of non-Apple clang. Patch by David Bohman. diff --git a/configure b/configure index c164d68c4e..dcc0795296 100755 --- a/configure +++ b/configure @@ -5167,9 +5167,6 @@ $as_echo "$as_me: fi -MULTIARCH=$($CC --print-multiarch 2>/dev/null) - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the platform triplet based on compiler characteristics" >&5 $as_echo_n "checking for the platform triplet based on compiler characteristics... " >&6; } cat >> conftest.c <&6; } fi rm -f conftest.c conftest.out +if test x$PLATFORM_TRIPLET != xdarwin; then + MULTIARCH=$($CC --print-multiarch 2>/dev/null) +fi + + if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then if test x$PLATFORM_TRIPLET != x$MULTIARCH; then as_fn_error $? "internal configure error for the platform triplet, please file a bug report" "$LINENO" 5 diff --git a/configure.ac b/configure.ac index fc082a3cd2..5c9bee2850 100644 --- a/configure.ac +++ b/configure.ac @@ -706,9 +706,6 @@ then fi -MULTIARCH=$($CC --print-multiarch 2>/dev/null) -AC_SUBST(MULTIARCH) - AC_MSG_CHECKING([for the platform triplet based on compiler characteristics]) cat >> conftest.c </dev/null) +fi +AC_SUBST(MULTIARCH) + if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then if test x$PLATFORM_TRIPLET != x$MULTIARCH; then AC_MSG_ERROR([internal configure error for the platform triplet, please file a bug report]) -- 2.36.0 pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.8.8/000077500000000000000000000000001517431316200262215ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.8.8/Python-3.8.8/000077500000000000000000000000001517431316200301565ustar00rootroot000000000000000001-bpo-45405-Prevent-internal-configure-error-when-runn.patch000066400000000000000000000054241517431316200432220ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.8.8/Python-3.8.8From cb51d8b90c5668e77b9ed8ded562eeaabf518f5c Mon Sep 17 00:00:00 2001 From: David Bohman Date: Tue, 12 Oct 2021 17:10:26 -0700 Subject: [PATCH] bpo-45405: Prevent ``internal configure error`` when running ``configure`` with recent versions of non-Apple clang. (#28845) Change the configure logic to function properly on macOS when the compiler outputs a platform triplet for option --print-multiarch. Co-authored-by: Ned Deily --- .../next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst | 2 ++ configure | 8 +++++--- configure.ac | 8 +++++--- 3 files changed, 12 insertions(+), 6 deletions(-) create mode 100644 Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst diff --git a/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst b/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst new file mode 100644 index 0000000000..a2dc5bcc32 --- /dev/null +++ b/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst @@ -0,0 +1,2 @@ +Prevent ``internal configure error`` when running ``configure`` +with recent versions of non-Apple clang. Patch by David Bohman. diff --git a/configure b/configure index c164d68c4e..dcc0795296 100755 --- a/configure +++ b/configure @@ -5167,9 +5167,6 @@ $as_echo "$as_me: fi -MULTIARCH=$($CC --print-multiarch 2>/dev/null) - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the platform triplet based on compiler characteristics" >&5 $as_echo_n "checking for the platform triplet based on compiler characteristics... " >&6; } cat >> conftest.c <&6; } fi rm -f conftest.c conftest.out +if test x$PLATFORM_TRIPLET != xdarwin; then + MULTIARCH=$($CC --print-multiarch 2>/dev/null) +fi + + if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then if test x$PLATFORM_TRIPLET != x$MULTIARCH; then as_fn_error $? "internal configure error for the platform triplet, please file a bug report" "$LINENO" 5 diff --git a/configure.ac b/configure.ac index fc082a3cd2..5c9bee2850 100644 --- a/configure.ac +++ b/configure.ac @@ -706,9 +706,6 @@ then fi -MULTIARCH=$($CC --print-multiarch 2>/dev/null) -AC_SUBST(MULTIARCH) - AC_MSG_CHECKING([for the platform triplet based on compiler characteristics]) cat >> conftest.c </dev/null) +fi +AC_SUBST(MULTIARCH) + if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then if test x$PLATFORM_TRIPLET != x$MULTIARCH; then AC_MSG_ERROR([internal configure error for the platform triplet, please file a bug report]) -- 2.36.0 pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.8.9/000077500000000000000000000000001517431316200262225ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.8.9/Python-3.8.9/000077500000000000000000000000001517431316200301605ustar00rootroot000000000000000001-bpo-45405-Prevent-internal-configure-error-when-runn.patch000066400000000000000000000054241517431316200432240ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.8.9/Python-3.8.9From 9d066808637164f1386ece0d3b26b8e4262c4dfd Mon Sep 17 00:00:00 2001 From: David Bohman Date: Tue, 12 Oct 2021 17:10:26 -0700 Subject: [PATCH] bpo-45405: Prevent ``internal configure error`` when running ``configure`` with recent versions of non-Apple clang. (#28845) Change the configure logic to function properly on macOS when the compiler outputs a platform triplet for option --print-multiarch. Co-authored-by: Ned Deily --- .../next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst | 2 ++ configure | 8 +++++--- configure.ac | 8 +++++--- 3 files changed, 12 insertions(+), 6 deletions(-) create mode 100644 Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst diff --git a/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst b/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst new file mode 100644 index 0000000000..a2dc5bcc32 --- /dev/null +++ b/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst @@ -0,0 +1,2 @@ +Prevent ``internal configure error`` when running ``configure`` +with recent versions of non-Apple clang. Patch by David Bohman. diff --git a/configure b/configure index c737256c15..97a371c6da 100755 --- a/configure +++ b/configure @@ -5155,9 +5155,6 @@ $as_echo "$as_me: fi -MULTIARCH=$($CC --print-multiarch 2>/dev/null) - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the platform triplet based on compiler characteristics" >&5 $as_echo_n "checking for the platform triplet based on compiler characteristics... " >&6; } cat >> conftest.c <&6; } fi rm -f conftest.c conftest.out +if test x$PLATFORM_TRIPLET != xdarwin; then + MULTIARCH=$($CC --print-multiarch 2>/dev/null) +fi + + if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then if test x$PLATFORM_TRIPLET != x$MULTIARCH; then as_fn_error $? "internal configure error for the platform triplet, please file a bug report" "$LINENO" 5 diff --git a/configure.ac b/configure.ac index 040ddfc791..0969bb5b0c 100644 --- a/configure.ac +++ b/configure.ac @@ -713,9 +713,6 @@ then fi -MULTIARCH=$($CC --print-multiarch 2>/dev/null) -AC_SUBST(MULTIARCH) - AC_MSG_CHECKING([for the platform triplet based on compiler characteristics]) cat >> conftest.c </dev/null) +fi +AC_SUBST(MULTIARCH) + if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then if test x$PLATFORM_TRIPLET != x$MULTIARCH; then AC_MSG_ERROR([internal configure error for the platform triplet, please file a bug report]) -- 2.36.0 pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.9.0/000077500000000000000000000000001517431316200262125ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.9.0/Python-3.9.0/000077500000000000000000000000001517431316200301405ustar00rootroot000000000000000001-bpo-45405-Prevent-internal-configure-error-when-runn.patch000066400000000000000000000054241517431316200432040ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.9.0/Python-3.9.0From b8f6adaf38973076542c54e5d9a4fd7c6665c8f2 Mon Sep 17 00:00:00 2001 From: David Bohman Date: Tue, 12 Oct 2021 17:10:26 -0700 Subject: [PATCH] bpo-45405: Prevent ``internal configure error`` when running ``configure`` with recent versions of non-Apple clang. (#28845) Change the configure logic to function properly on macOS when the compiler outputs a platform triplet for option --print-multiarch. Co-authored-by: Ned Deily --- .../next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst | 2 ++ configure | 8 +++++--- configure.ac | 8 +++++--- 3 files changed, 12 insertions(+), 6 deletions(-) create mode 100644 Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst diff --git a/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst b/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst new file mode 100644 index 0000000000..a2dc5bcc32 --- /dev/null +++ b/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst @@ -0,0 +1,2 @@ +Prevent ``internal configure error`` when running ``configure`` +with recent versions of non-Apple clang. Patch by David Bohman. diff --git a/configure b/configure index 9e6fd46583..80c3a6589a 100755 --- a/configure +++ b/configure @@ -5193,9 +5193,6 @@ $as_echo "$as_me: fi -MULTIARCH=$($CC --print-multiarch 2>/dev/null) - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the platform triplet based on compiler characteristics" >&5 $as_echo_n "checking for the platform triplet based on compiler characteristics... " >&6; } cat >> conftest.c <&6; } fi rm -f conftest.c conftest.out +if test x$PLATFORM_TRIPLET != xdarwin; then + MULTIARCH=$($CC --print-multiarch 2>/dev/null) +fi + + if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then if test x$PLATFORM_TRIPLET != x$MULTIARCH; then as_fn_error $? "internal configure error for the platform triplet, please file a bug report" "$LINENO" 5 diff --git a/configure.ac b/configure.ac index d60f05251a..110318545d 100644 --- a/configure.ac +++ b/configure.ac @@ -718,9 +718,6 @@ then fi -MULTIARCH=$($CC --print-multiarch 2>/dev/null) -AC_SUBST(MULTIARCH) - AC_MSG_CHECKING([for the platform triplet based on compiler characteristics]) cat >> conftest.c </dev/null) +fi +AC_SUBST(MULTIARCH) + if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then if test x$PLATFORM_TRIPLET != x$MULTIARCH; then AC_MSG_ERROR([internal configure error for the platform triplet, please file a bug report]) -- 2.36.0 pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.9.1/000077500000000000000000000000001517431316200262135ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.9.1/Python-3.9.1/000077500000000000000000000000001517431316200301425ustar00rootroot000000000000000001-bpo-45405-Prevent-internal-configure-error-when-runn.patch000066400000000000000000000054241517431316200432060ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.9.1/Python-3.9.1From 8ada29fb655f9803bab4777308c77db8c1f74735 Mon Sep 17 00:00:00 2001 From: David Bohman Date: Tue, 12 Oct 2021 17:10:26 -0700 Subject: [PATCH] bpo-45405: Prevent ``internal configure error`` when running ``configure`` with recent versions of non-Apple clang. (#28845) Change the configure logic to function properly on macOS when the compiler outputs a platform triplet for option --print-multiarch. Co-authored-by: Ned Deily --- .../next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst | 2 ++ configure | 8 +++++--- configure.ac | 8 +++++--- 3 files changed, 12 insertions(+), 6 deletions(-) create mode 100644 Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst diff --git a/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst b/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst new file mode 100644 index 0000000000..a2dc5bcc32 --- /dev/null +++ b/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst @@ -0,0 +1,2 @@ +Prevent ``internal configure error`` when running ``configure`` +with recent versions of non-Apple clang. Patch by David Bohman. diff --git a/configure b/configure index 2d379feb4b..e36d8d523d 100755 --- a/configure +++ b/configure @@ -5193,9 +5193,6 @@ $as_echo "$as_me: fi -MULTIARCH=$($CC --print-multiarch 2>/dev/null) - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the platform triplet based on compiler characteristics" >&5 $as_echo_n "checking for the platform triplet based on compiler characteristics... " >&6; } cat >> conftest.c <&6; } fi rm -f conftest.c conftest.out +if test x$PLATFORM_TRIPLET != xdarwin; then + MULTIARCH=$($CC --print-multiarch 2>/dev/null) +fi + + if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then if test x$PLATFORM_TRIPLET != x$MULTIARCH; then as_fn_error $? "internal configure error for the platform triplet, please file a bug report" "$LINENO" 5 diff --git a/configure.ac b/configure.ac index c968d149c2..a16e475bc2 100644 --- a/configure.ac +++ b/configure.ac @@ -718,9 +718,6 @@ then fi -MULTIARCH=$($CC --print-multiarch 2>/dev/null) -AC_SUBST(MULTIARCH) - AC_MSG_CHECKING([for the platform triplet based on compiler characteristics]) cat >> conftest.c </dev/null) +fi +AC_SUBST(MULTIARCH) + if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then if test x$PLATFORM_TRIPLET != x$MULTIARCH; then AC_MSG_ERROR([internal configure error for the platform triplet, please file a bug report]) -- 2.36.0 pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.9.15/000077500000000000000000000000001517431316200263005ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.9.15/openssl-1.1.1q/000077500000000000000000000000001517431316200306005ustar00rootroot00000000000000openssl_1.1.1q_fix_c_include.patch000066400000000000000000000004101517431316200367720ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.9.15/openssl-1.1.1qdiff --git a/test/v3ext.c b/test/v3ext.c index 7a240cd706..6cec6f1a9b 100644 --- a/test/v3ext.c +++ b/test/v3ext.c @@ -15,6 +15,7 @@ #include #include "internal/nelem.h" +#include #include "testutil.h" static const char *infile; pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.9.16/000077500000000000000000000000001517431316200263015ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.9.16/openssl-1.1.1q/000077500000000000000000000000001517431316200306015ustar00rootroot00000000000000openssl_1.1.1q_fix_c_include.patch000066400000000000000000000004101517431316200367730ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.9.16/openssl-1.1.1qdiff --git a/test/v3ext.c b/test/v3ext.c index 7a240cd706..6cec6f1a9b 100644 --- a/test/v3ext.c +++ b/test/v3ext.c @@ -15,6 +15,7 @@ #include #include "internal/nelem.h" +#include #include "testutil.h" static const char *infile; pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.9.2/000077500000000000000000000000001517431316200262145ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.9.2/Python-3.9.2/000077500000000000000000000000001517431316200301445ustar00rootroot000000000000000001-bpo-45405-Prevent-internal-configure-error-when-runn.patch000066400000000000000000000054241517431316200432100ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.9.2/Python-3.9.2From 9e317124ae4d1f133c18485e83b952360741519d Mon Sep 17 00:00:00 2001 From: David Bohman Date: Tue, 12 Oct 2021 17:10:26 -0700 Subject: [PATCH] bpo-45405: Prevent ``internal configure error`` when running ``configure`` with recent versions of non-Apple clang. (#28845) Change the configure logic to function properly on macOS when the compiler outputs a platform triplet for option --print-multiarch. Co-authored-by: Ned Deily --- .../next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst | 2 ++ configure | 8 +++++--- configure.ac | 8 +++++--- 3 files changed, 12 insertions(+), 6 deletions(-) create mode 100644 Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst diff --git a/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst b/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst new file mode 100644 index 0000000000..a2dc5bcc32 --- /dev/null +++ b/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst @@ -0,0 +1,2 @@ +Prevent ``internal configure error`` when running ``configure`` +with recent versions of non-Apple clang. Patch by David Bohman. diff --git a/configure b/configure index 1252335472..0da9fa285e 100755 --- a/configure +++ b/configure @@ -5193,9 +5193,6 @@ $as_echo "$as_me: fi -MULTIARCH=$($CC --print-multiarch 2>/dev/null) - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the platform triplet based on compiler characteristics" >&5 $as_echo_n "checking for the platform triplet based on compiler characteristics... " >&6; } cat >> conftest.c <&6; } fi rm -f conftest.c conftest.out +if test x$PLATFORM_TRIPLET != xdarwin; then + MULTIARCH=$($CC --print-multiarch 2>/dev/null) +fi + + if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then if test x$PLATFORM_TRIPLET != x$MULTIARCH; then as_fn_error $? "internal configure error for the platform triplet, please file a bug report" "$LINENO" 5 diff --git a/configure.ac b/configure.ac index 972287a9c4..76252ad36c 100644 --- a/configure.ac +++ b/configure.ac @@ -718,9 +718,6 @@ then fi -MULTIARCH=$($CC --print-multiarch 2>/dev/null) -AC_SUBST(MULTIARCH) - AC_MSG_CHECKING([for the platform triplet based on compiler characteristics]) cat >> conftest.c </dev/null) +fi +AC_SUBST(MULTIARCH) + if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then if test x$PLATFORM_TRIPLET != x$MULTIARCH; then AC_MSG_ERROR([internal configure error for the platform triplet, please file a bug report]) -- 2.36.0 pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.9.25/000077500000000000000000000000001517431316200263015ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.9.25/Python-3.9.25/000077500000000000000000000000001517431316200303165ustar00rootroot000000000000000001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch000066400000000000000000000015631517431316200405470ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.9.25/Python-3.9.25From 3fec519d6b326918f39ceb142ef762042ce8365f Mon Sep 17 00:00:00 2001 From: Ivan Pozdeev Date: Fri, 26 Dec 2025 13:39:21 +0300 Subject: [PATCH] Recognize an argument to -j in MAKEFLAGS --- setup.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index ad8fb81b218..5666deaf67b 100644 --- a/setup.py +++ b/setup.py @@ -307,8 +307,8 @@ def __init__(self, dist): self.failed_on_import = [] self.missing = [] self.disabled_configure = [] - if '-j' in os.environ.get('MAKEFLAGS', ''): - self.parallel = True + if (m:=re.search(r'(?:^|\s)(?:-j|--jobs)(?:\s+|=)?(\d*)',os.environ.get('MAKEFLAGS', ''))) is not None: + self.parallel = int(m.group(1)) if m.group(1) else True def add(self, ext): self.extensions.append(ext) -- 2.36.1.windows.1 pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.9.4/000077500000000000000000000000001517431316200262165ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.9.4/Python-3.9.4/000077500000000000000000000000001517431316200301505ustar00rootroot000000000000000001-bpo-45405-Prevent-internal-configure-error-when-runn.patch000066400000000000000000000054241517431316200432140ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.9.4/Python-3.9.4From d93aaf050384705ac744a4e6cbbab1408e770c0a Mon Sep 17 00:00:00 2001 From: David Bohman Date: Tue, 12 Oct 2021 17:10:26 -0700 Subject: [PATCH] bpo-45405: Prevent ``internal configure error`` when running ``configure`` with recent versions of non-Apple clang. (#28845) Change the configure logic to function properly on macOS when the compiler outputs a platform triplet for option --print-multiarch. Co-authored-by: Ned Deily --- .../next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst | 2 ++ configure | 8 +++++--- configure.ac | 8 +++++--- 3 files changed, 12 insertions(+), 6 deletions(-) create mode 100644 Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst diff --git a/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst b/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst new file mode 100644 index 0000000000..a2dc5bcc32 --- /dev/null +++ b/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst @@ -0,0 +1,2 @@ +Prevent ``internal configure error`` when running ``configure`` +with recent versions of non-Apple clang. Patch by David Bohman. diff --git a/configure b/configure index c7a7291fea..708c9215e4 100755 --- a/configure +++ b/configure @@ -5193,9 +5193,6 @@ $as_echo "$as_me: fi -MULTIARCH=$($CC --print-multiarch 2>/dev/null) - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the platform triplet based on compiler characteristics" >&5 $as_echo_n "checking for the platform triplet based on compiler characteristics... " >&6; } cat >> conftest.c <&6; } fi rm -f conftest.c conftest.out +if test x$PLATFORM_TRIPLET != xdarwin; then + MULTIARCH=$($CC --print-multiarch 2>/dev/null) +fi + + if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then if test x$PLATFORM_TRIPLET != x$MULTIARCH; then as_fn_error $? "internal configure error for the platform triplet, please file a bug report" "$LINENO" 5 diff --git a/configure.ac b/configure.ac index 45e0af4493..559a40eda9 100644 --- a/configure.ac +++ b/configure.ac @@ -725,9 +725,6 @@ then fi -MULTIARCH=$($CC --print-multiarch 2>/dev/null) -AC_SUBST(MULTIARCH) - AC_MSG_CHECKING([for the platform triplet based on compiler characteristics]) cat >> conftest.c </dev/null) +fi +AC_SUBST(MULTIARCH) + if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then if test x$PLATFORM_TRIPLET != x$MULTIARCH; then AC_MSG_ERROR([internal configure error for the platform triplet, please file a bug report]) -- 2.36.0 pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.9.5/000077500000000000000000000000001517431316200262175ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.9.5/Python-3.9.5/000077500000000000000000000000001517431316200301525ustar00rootroot000000000000000001-bpo-45405-Prevent-internal-configure-error-when-runn.patch000066400000000000000000000054241517431316200432160ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.9.5/Python-3.9.5From 16a65fb399eb8d1a5cfecd597e579a4402b2e4c8 Mon Sep 17 00:00:00 2001 From: David Bohman Date: Tue, 12 Oct 2021 17:10:26 -0700 Subject: [PATCH] bpo-45405: Prevent ``internal configure error`` when running ``configure`` with recent versions of non-Apple clang. (#28845) Change the configure logic to function properly on macOS when the compiler outputs a platform triplet for option --print-multiarch. Co-authored-by: Ned Deily --- .../next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst | 2 ++ configure | 8 +++++--- configure.ac | 8 +++++--- 3 files changed, 12 insertions(+), 6 deletions(-) create mode 100644 Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst diff --git a/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst b/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst new file mode 100644 index 0000000000..a2dc5bcc32 --- /dev/null +++ b/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst @@ -0,0 +1,2 @@ +Prevent ``internal configure error`` when running ``configure`` +with recent versions of non-Apple clang. Patch by David Bohman. diff --git a/configure b/configure index 8dcdbf1989..ac03aff210 100755 --- a/configure +++ b/configure @@ -5196,9 +5196,6 @@ $as_echo "$as_me: fi -MULTIARCH=$($CC --print-multiarch 2>/dev/null) - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the platform triplet based on compiler characteristics" >&5 $as_echo_n "checking for the platform triplet based on compiler characteristics... " >&6; } cat >> conftest.c <&6; } fi rm -f conftest.c conftest.out +if test x$PLATFORM_TRIPLET != xdarwin; then + MULTIARCH=$($CC --print-multiarch 2>/dev/null) +fi + + if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then if test x$PLATFORM_TRIPLET != x$MULTIARCH; then as_fn_error $? "internal configure error for the platform triplet, please file a bug report" "$LINENO" 5 diff --git a/configure.ac b/configure.ac index b1e4c6ce19..94102dd324 100644 --- a/configure.ac +++ b/configure.ac @@ -727,9 +727,6 @@ then fi -MULTIARCH=$($CC --print-multiarch 2>/dev/null) -AC_SUBST(MULTIARCH) - AC_MSG_CHECKING([for the platform triplet based on compiler characteristics]) cat >> conftest.c </dev/null) +fi +AC_SUBST(MULTIARCH) + if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then if test x$PLATFORM_TRIPLET != x$MULTIARCH; then AC_MSG_ERROR([internal configure error for the platform triplet, please file a bug report]) -- 2.36.0 pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.9.6/000077500000000000000000000000001517431316200262205ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.9.6/Python-3.9.6/000077500000000000000000000000001517431316200301545ustar00rootroot000000000000000001-bpo-45405-Prevent-internal-configure-error-when-runn.patch000066400000000000000000000054241517431316200432200ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.9.6/Python-3.9.6From 9b7f2f9ce024d2cceb90f9a9d939b37090c525e2 Mon Sep 17 00:00:00 2001 From: David Bohman Date: Tue, 12 Oct 2021 17:10:26 -0700 Subject: [PATCH] bpo-45405: Prevent ``internal configure error`` when running ``configure`` with recent versions of non-Apple clang. (#28845) Change the configure logic to function properly on macOS when the compiler outputs a platform triplet for option --print-multiarch. Co-authored-by: Ned Deily --- .../next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst | 2 ++ configure | 8 +++++--- configure.ac | 8 +++++--- 3 files changed, 12 insertions(+), 6 deletions(-) create mode 100644 Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst diff --git a/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst b/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst new file mode 100644 index 0000000000..a2dc5bcc32 --- /dev/null +++ b/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst @@ -0,0 +1,2 @@ +Prevent ``internal configure error`` when running ``configure`` +with recent versions of non-Apple clang. Patch by David Bohman. diff --git a/configure b/configure index ffa61c1dc5..18597d4de8 100755 --- a/configure +++ b/configure @@ -5196,9 +5196,6 @@ $as_echo "$as_me: fi -MULTIARCH=$($CC --print-multiarch 2>/dev/null) - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the platform triplet based on compiler characteristics" >&5 $as_echo_n "checking for the platform triplet based on compiler characteristics... " >&6; } cat >> conftest.c <&6; } fi rm -f conftest.c conftest.out +if test x$PLATFORM_TRIPLET != xdarwin; then + MULTIARCH=$($CC --print-multiarch 2>/dev/null) +fi + + if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then if test x$PLATFORM_TRIPLET != x$MULTIARCH; then as_fn_error $? "internal configure error for the platform triplet, please file a bug report" "$LINENO" 5 diff --git a/configure.ac b/configure.ac index 8fe5fa5742..577ce9040f 100644 --- a/configure.ac +++ b/configure.ac @@ -727,9 +727,6 @@ then fi -MULTIARCH=$($CC --print-multiarch 2>/dev/null) -AC_SUBST(MULTIARCH) - AC_MSG_CHECKING([for the platform triplet based on compiler characteristics]) cat >> conftest.c </dev/null) +fi +AC_SUBST(MULTIARCH) + if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then if test x$PLATFORM_TRIPLET != x$MULTIARCH; then AC_MSG_ERROR([internal configure error for the platform triplet, please file a bug report]) -- 2.36.0 pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.9.7/000077500000000000000000000000001517431316200262215ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.9.7/Python-3.9.7/000077500000000000000000000000001517431316200301565ustar00rootroot000000000000000001-bpo-45405-Prevent-internal-configure-error-when-runn.patch000066400000000000000000000054241517431316200432220ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/3.9.7/Python-3.9.7From 785de1ab8b4ab8b89d0e62ffd7521b5b2636923a Mon Sep 17 00:00:00 2001 From: David Bohman Date: Tue, 12 Oct 2021 17:10:26 -0700 Subject: [PATCH] bpo-45405: Prevent ``internal configure error`` when running ``configure`` with recent versions of non-Apple clang. (#28845) Change the configure logic to function properly on macOS when the compiler outputs a platform triplet for option --print-multiarch. Co-authored-by: Ned Deily --- .../next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst | 2 ++ configure | 8 +++++--- configure.ac | 8 +++++--- 3 files changed, 12 insertions(+), 6 deletions(-) create mode 100644 Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst diff --git a/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst b/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst new file mode 100644 index 0000000000..a2dc5bcc32 --- /dev/null +++ b/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst @@ -0,0 +1,2 @@ +Prevent ``internal configure error`` when running ``configure`` +with recent versions of non-Apple clang. Patch by David Bohman. diff --git a/configure b/configure index ffa61c1dc5..18597d4de8 100755 --- a/configure +++ b/configure @@ -5196,9 +5196,6 @@ $as_echo "$as_me: fi -MULTIARCH=$($CC --print-multiarch 2>/dev/null) - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the platform triplet based on compiler characteristics" >&5 $as_echo_n "checking for the platform triplet based on compiler characteristics... " >&6; } cat >> conftest.c <&6; } fi rm -f conftest.c conftest.out +if test x$PLATFORM_TRIPLET != xdarwin; then + MULTIARCH=$($CC --print-multiarch 2>/dev/null) +fi + + if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then if test x$PLATFORM_TRIPLET != x$MULTIARCH; then as_fn_error $? "internal configure error for the platform triplet, please file a bug report" "$LINENO" 5 diff --git a/configure.ac b/configure.ac index 8fe5fa5742..577ce9040f 100644 --- a/configure.ac +++ b/configure.ac @@ -727,9 +727,6 @@ then fi -MULTIARCH=$($CC --print-multiarch 2>/dev/null) -AC_SUBST(MULTIARCH) - AC_MSG_CHECKING([for the platform triplet based on compiler characteristics]) cat >> conftest.c </dev/null) +fi +AC_SUBST(MULTIARCH) + if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then if test x$PLATFORM_TRIPLET != x$MULTIARCH; then AC_MSG_ERROR([internal configure error for the platform triplet, please file a bug report]) -- 2.36.0 pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/cinder-3.10-dev/000077500000000000000000000000001517431316200301425ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/cinder-3.10-dev/Cinder-3.10-dev/000077500000000000000000000000001517431316200325015ustar00rootroot00000000000000001-disable-werror.patch000066400000000000000000000021011517431316200366540ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/cinder-3.10-dev/Cinder-3.10-devdiff --git a/configure b/configure index 5c74f00a..8bb51f40 100755 --- a/configure +++ b/configure @@ -7057,8 +7057,8 @@ $as_echo "$ac_cv_extra_warnings" >&6; } if test $ac_cv_extra_warnings = yes then - CFLAGS_NODIST="$CFLAGS_NODIST -Wextra -Werror" - CXXFLAGS_NODIST="$CXXFLAGS_NODIST -Wextra -Werror -Wno-implicit-fallthrough" + CFLAGS_NODIST="$CFLAGS_NODIST -Wextra" + CXXFLAGS_NODIST="$CXXFLAGS_NODIST -Wextra -Wno-implicit-fallthrough" fi # Python doesn't violate C99 aliasing rules, but older versions of diff --git a/configure.ac b/configure.ac index c06b992d..6dee6632 100644 --- a/configure.ac +++ b/configure.ac @@ -1622,8 +1622,8 @@ yes) if test $ac_cv_extra_warnings = yes then - CFLAGS_NODIST="$CFLAGS_NODIST -Wextra -Werror" - CXXFLAGS_NODIST="$CXXFLAGS_NODIST -Wextra -Werror -Wno-implicit-fallthrough" + CFLAGS_NODIST="$CFLAGS_NODIST -Wextra" + CXXFLAGS_NODIST="$CXXFLAGS_NODIST -Wextra -Wno-implicit-fallthrough" fi # Python doesn't violate C99 aliasing rules, but older versions of pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/cinder-3.8-dev/000077500000000000000000000000001517431316200300715ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/cinder-3.8-dev/Cinder-3.8-dev/000077500000000000000000000000001517431316200323575ustar00rootroot00000000000000001-disable-werror.patch000066400000000000000000000021011517431316200365320ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/cinder-3.8-dev/Cinder-3.8-devdiff --git a/configure b/configure index 0df332f7..df8143cf 100755 --- a/configure +++ b/configure @@ -6952,8 +6952,8 @@ $as_echo "$ac_cv_extra_warnings" >&6; } if test $ac_cv_extra_warnings = yes then - CFLAGS_NODIST="$CFLAGS_NODIST -Wextra -Werror" - CXXFLAGS_NODIST="$CXXFLAGS_NODIST -Wextra -Werror -Wno-implicit-fallthrough" + CFLAGS_NODIST="$CFLAGS_NODIST -Wextra" + CXXFLAGS_NODIST="$CXXFLAGS_NODIST -Wextra -Wno-implicit-fallthrough" fi # Python doesn't violate C99 aliasing rules, but older versions of diff --git a/configure.ac b/configure.ac index f6718e36..0a651e7d 100644 --- a/configure.ac +++ b/configure.ac @@ -1579,8 +1579,8 @@ yes) if test $ac_cv_extra_warnings = yes then - CFLAGS_NODIST="$CFLAGS_NODIST -Wextra -Werror" - CXXFLAGS_NODIST="$CXXFLAGS_NODIST -Wextra -Werror -Wno-implicit-fallthrough" + CFLAGS_NODIST="$CFLAGS_NODIST -Wextra" + CXXFLAGS_NODIST="$CXXFLAGS_NODIST -Wextra -Wno-implicit-fallthrough" fi # Python doesn't violate C99 aliasing rules, but older versions of pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/stackless-3.2.2/000077500000000000000000000000001517431316200301775ustar00rootroot00000000000000stackless-322-export/000077500000000000000000000000001517431316200337375ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/stackless-3.2.2002_readline63.patch000066400000000000000000000037751517431316200373110ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/stackless-3.2.2/stackless-322-exportdiff -r -u ../Python-3.3.3.orig/Modules/readline.c ./Modules/readline.c --- ../Python-3.3.3.orig/Modules/readline.c 2013-11-17 16:23:01.000000000 +0900 +++ ./Modules/readline.c 2014-03-29 16:22:10.219305878 +0900 @@ -231,8 +231,7 @@ if (!PyArg_ParseTuple(args, buf, &function)) return NULL; if (function == Py_None) { - Py_XDECREF(*hook_var); - *hook_var = NULL; + Py_CLEAR(*hook_var); } else if (PyCallable_Check(function)) { PyObject *tmp = *hook_var; @@ -774,14 +773,22 @@ } static int +#if defined(_RL_FUNCTION_TYPEDEF) on_startup_hook(void) +#else +on_startup_hook() +#endif { return on_hook(startup_hook); } #ifdef HAVE_RL_PRE_INPUT_HOOK static int +#if defined(_RL_FUNCTION_TYPEDEF) on_pre_input_hook(void) +#else +on_pre_input_hook() +#endif { return on_hook(pre_input_hook); } @@ -819,7 +826,7 @@ (r != Py_None && PyLong_AsLong(r) == -1 && PyErr_Occurred())) { goto error; } - Py_XDECREF(r); r=NULL; + Py_CLEAR(r); if (0) { error: @@ -877,7 +884,7 @@ * before calling the normal completer */ static char ** -flex_complete(char *text, int start, int end) +flex_complete(const char *text, int start, int end) { #ifdef HAVE_RL_COMPLETION_APPEND_CHARACTER rl_completion_append_character ='\0'; @@ -936,12 +943,12 @@ rl_bind_key_in_map ('\t', rl_complete, emacs_meta_keymap); rl_bind_key_in_map ('\033', rl_complete, emacs_meta_keymap); /* Set our hook functions */ - rl_startup_hook = (Function *)on_startup_hook; + rl_startup_hook = on_startup_hook; #ifdef HAVE_RL_PRE_INPUT_HOOK - rl_pre_input_hook = (Function *)on_pre_input_hook; + rl_pre_input_hook = on_pre_input_hook; #endif /* Set our completion function */ - rl_attempted_completion_function = (CPPFunction *)flex_complete; + rl_attempted_completion_function = flex_complete; /* Set Python word break characters */ completer_word_break_characters = rl_completer_word_break_characters = 010_ssl_no_ssl3.patch000066400000000000000000000066411517431316200376100ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/stackless-3.2.2/stackless-322-exportdiff -r -u ../Python-3.2.2.orig/Lib/ssl.py ./Lib/ssl.py --- ../Python-3.2.2.orig/Lib/ssl.py 2011-09-03 16:16:42.000000000 +0000 +++ ./Lib/ssl.py 2015-12-20 07:01:09.947260656 +0000 @@ -62,34 +62,30 @@ from _ssl import OPENSSL_VERSION_NUMBER, OPENSSL_VERSION_INFO, OPENSSL_VERSION from _ssl import _SSLContext, SSLError from _ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED -from _ssl import OP_ALL, OP_NO_SSLv2, OP_NO_SSLv3, OP_NO_TLSv1 -from _ssl import RAND_status, RAND_egd, RAND_add -from _ssl import ( - SSL_ERROR_ZERO_RETURN, - SSL_ERROR_WANT_READ, - SSL_ERROR_WANT_WRITE, - SSL_ERROR_WANT_X509_LOOKUP, - SSL_ERROR_SYSCALL, - SSL_ERROR_SSL, - SSL_ERROR_WANT_CONNECT, - SSL_ERROR_EOF, - SSL_ERROR_INVALID_ERROR_CODE, - ) +from _ssl import RAND_status, RAND_add +try: + from _ssl import RAND_egd +except ImportError: + # LibreSSL does not provide RAND_egd + pass + +def _import_symbols(prefix): + for n in dir(_ssl): + if n.startswith(prefix): + globals()[n] = getattr(_ssl, n) + +_import_symbols('OP_') +_import_symbols('SSL_ERROR_') +_import_symbols('PROTOCOL_') + from _ssl import HAS_SNI -from _ssl import PROTOCOL_SSLv3, PROTOCOL_SSLv23, PROTOCOL_TLSv1 from _ssl import _OPENSSL_API_VERSION -_PROTOCOL_NAMES = { - PROTOCOL_TLSv1: "TLSv1", - PROTOCOL_SSLv23: "SSLv23", - PROTOCOL_SSLv3: "SSLv3", -} +_PROTOCOL_NAMES = {value: name for name, value in globals().items() if name.startswith('PROTOCOL_')} try: - from _ssl import PROTOCOL_SSLv2 -except ImportError: - pass -else: - _PROTOCOL_NAMES[PROTOCOL_SSLv2] = "SSLv2" + _SSLv2_IF_EXISTS = PROTOCOL_SSLv2 +except NameError: + _SSLv2_IF_EXISTS = None from socket import getnameinfo as _getnameinfo from socket import error as socket_error @@ -547,7 +543,7 @@ d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)] return base64.decodebytes(d.encode('ASCII', 'strict')) -def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv3, ca_certs=None): +def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None): """Retrieve the certificate from the server at the specified address, and return it as a PEM-encoded string. If 'ca_certs' is specified, validate the server cert against it. diff -r -u ../Python-3.2.2.orig/Modules/_ssl.c ./Modules/_ssl.c --- ../Python-3.2.2.orig/Modules/_ssl.c 2011-09-03 16:16:46.000000000 +0000 +++ ./Modules/_ssl.c 2015-12-20 06:59:12.632993190 +0000 @@ -66,7 +66,9 @@ #ifndef OPENSSL_NO_SSL2 PY_SSL_VERSION_SSL2, #endif +#ifndef OPENSSL_NO_SSL3 PY_SSL_VERSION_SSL3=1, +#endif PY_SSL_VERSION_SSL23, PY_SSL_VERSION_TLS1 }; @@ -1450,8 +1452,10 @@ PySSL_BEGIN_ALLOW_THREADS if (proto_version == PY_SSL_VERSION_TLS1) ctx = SSL_CTX_new(TLSv1_method()); +#ifndef OPENSSL_NO_SSL3 else if (proto_version == PY_SSL_VERSION_SSL3) ctx = SSL_CTX_new(SSLv3_method()); +#endif #ifndef OPENSSL_NO_SSL2 else if (proto_version == PY_SSL_VERSION_SSL2) ctx = SSL_CTX_new(SSLv2_method()); @@ -2136,8 +2140,10 @@ PyModule_AddIntConstant(m, "PROTOCOL_SSLv2", PY_SSL_VERSION_SSL2); #endif +#ifndef OPENSSL_NO_SSL3 PyModule_AddIntConstant(m, "PROTOCOL_SSLv3", PY_SSL_VERSION_SSL3); +#endif PyModule_AddIntConstant(m, "PROTOCOL_SSLv23", PY_SSL_VERSION_SSL23); PyModule_AddIntConstant(m, "PROTOCOL_TLSv1", pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/stackless-3.2.5/000077500000000000000000000000001517431316200302025ustar00rootroot00000000000000stackless-325-export/000077500000000000000000000000001517431316200337455ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/stackless-3.2.5002_readline63.patch000066400000000000000000000037751517431316200373170ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/stackless-3.2.5/stackless-325-exportdiff -r -u ../Python-3.3.3.orig/Modules/readline.c ./Modules/readline.c --- ../Python-3.3.3.orig/Modules/readline.c 2013-11-17 16:23:01.000000000 +0900 +++ ./Modules/readline.c 2014-03-29 16:22:10.219305878 +0900 @@ -231,8 +231,7 @@ if (!PyArg_ParseTuple(args, buf, &function)) return NULL; if (function == Py_None) { - Py_XDECREF(*hook_var); - *hook_var = NULL; + Py_CLEAR(*hook_var); } else if (PyCallable_Check(function)) { PyObject *tmp = *hook_var; @@ -774,14 +773,22 @@ } static int +#if defined(_RL_FUNCTION_TYPEDEF) on_startup_hook(void) +#else +on_startup_hook() +#endif { return on_hook(startup_hook); } #ifdef HAVE_RL_PRE_INPUT_HOOK static int +#if defined(_RL_FUNCTION_TYPEDEF) on_pre_input_hook(void) +#else +on_pre_input_hook() +#endif { return on_hook(pre_input_hook); } @@ -819,7 +826,7 @@ (r != Py_None && PyLong_AsLong(r) == -1 && PyErr_Occurred())) { goto error; } - Py_XDECREF(r); r=NULL; + Py_CLEAR(r); if (0) { error: @@ -877,7 +884,7 @@ * before calling the normal completer */ static char ** -flex_complete(char *text, int start, int end) +flex_complete(const char *text, int start, int end) { #ifdef HAVE_RL_COMPLETION_APPEND_CHARACTER rl_completion_append_character ='\0'; @@ -936,12 +943,12 @@ rl_bind_key_in_map ('\t', rl_complete, emacs_meta_keymap); rl_bind_key_in_map ('\033', rl_complete, emacs_meta_keymap); /* Set our hook functions */ - rl_startup_hook = (Function *)on_startup_hook; + rl_startup_hook = on_startup_hook; #ifdef HAVE_RL_PRE_INPUT_HOOK - rl_pre_input_hook = (Function *)on_pre_input_hook; + rl_pre_input_hook = on_pre_input_hook; #endif /* Set our completion function */ - rl_attempted_completion_function = (CPPFunction *)flex_complete; + rl_attempted_completion_function = flex_complete; /* Set Python word break characters */ completer_word_break_characters = rl_completer_word_break_characters = 010_ssl_no_ssl3.patch000066400000000000000000000065651517431316200376230ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/share/python-build/patches/stackless-3.2.5/stackless-325-exportdiff -r -u ../Python-3.2.6.orig/Lib/ssl.py ./Lib/ssl.py --- ../Python-3.2.6.orig/Lib/ssl.py 2014-10-12 06:52:02.000000000 +0000 +++ ./Lib/ssl.py 2015-12-20 06:40:11.895384463 +0000 @@ -62,35 +62,30 @@ from _ssl import OPENSSL_VERSION_NUMBER, OPENSSL_VERSION_INFO, OPENSSL_VERSION from _ssl import _SSLContext, SSLError from _ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED -from _ssl import OP_ALL, OP_NO_SSLv2, OP_NO_SSLv3, OP_NO_TLSv1 from _ssl import RAND_status, RAND_egd, RAND_add -from _ssl import ( - SSL_ERROR_ZERO_RETURN, - SSL_ERROR_WANT_READ, - SSL_ERROR_WANT_WRITE, - SSL_ERROR_WANT_X509_LOOKUP, - SSL_ERROR_SYSCALL, - SSL_ERROR_SSL, - SSL_ERROR_WANT_CONNECT, - SSL_ERROR_EOF, - SSL_ERROR_INVALID_ERROR_CODE, - ) +try: + from _ssl import RAND_egd +except ImportError: + # LibreSSL does not provide RAND_egd + pass + +def _import_symbols(prefix): + for n in dir(_ssl): + if n.startswith(prefix): + globals()[n] = getattr(_ssl, n) + +_import_symbols('OP_') +_import_symbols('SSL_ERROR_') +_import_symbols('PROTOCOL_') + from _ssl import HAS_SNI -from _ssl import PROTOCOL_SSLv3, PROTOCOL_SSLv23, PROTOCOL_TLSv1 from _ssl import _OPENSSL_API_VERSION -_PROTOCOL_NAMES = { - PROTOCOL_TLSv1: "TLSv1", - PROTOCOL_SSLv23: "SSLv23", - PROTOCOL_SSLv3: "SSLv3", -} +_PROTOCOL_NAMES = {value: name for name, value in globals().items() if name.startswith('PROTOCOL_')} try: - from _ssl import PROTOCOL_SSLv2 _SSLv2_IF_EXISTS = PROTOCOL_SSLv2 -except ImportError: +except NameError: _SSLv2_IF_EXISTS = None -else: - _PROTOCOL_NAMES[PROTOCOL_SSLv2] = "SSLv2" from socket import getnameinfo as _getnameinfo from socket import error as socket_error @@ -557,7 +552,7 @@ d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)] return base64.decodebytes(d.encode('ASCII', 'strict')) -def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv3, ca_certs=None): +def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None): """Retrieve the certificate from the server at the specified address, and return it as a PEM-encoded string. If 'ca_certs' is specified, validate the server cert against it. diff -r -u ../Python-3.2.6.orig/Modules/_ssl.c ./Modules/_ssl.c --- ../Python-3.2.6.orig/Modules/_ssl.c 2014-10-12 06:52:03.000000000 +0000 +++ ./Modules/_ssl.c 2015-12-20 06:37:10.124337227 +0000 @@ -66,7 +66,9 @@ #ifndef OPENSSL_NO_SSL2 PY_SSL_VERSION_SSL2, #endif +#ifndef OPENSSL_NO_SSL3 PY_SSL_VERSION_SSL3=1, +#endif PY_SSL_VERSION_SSL23, PY_SSL_VERSION_TLS1 }; @@ -1512,8 +1514,10 @@ PySSL_BEGIN_ALLOW_THREADS if (proto_version == PY_SSL_VERSION_TLS1) ctx = SSL_CTX_new(TLSv1_method()); +#ifndef OPENSSL_NO_SSL3 else if (proto_version == PY_SSL_VERSION_SSL3) ctx = SSL_CTX_new(SSLv3_method()); +#endif #ifndef OPENSSL_NO_SSL2 else if (proto_version == PY_SSL_VERSION_SSL2) ctx = SSL_CTX_new(SSLv2_method()); @@ -2199,8 +2203,10 @@ PyModule_AddIntConstant(m, "PROTOCOL_SSLv2", PY_SSL_VERSION_SSL2); #endif +#ifndef OPENSSL_NO_SSL3 PyModule_AddIntConstant(m, "PROTOCOL_SSLv3", PY_SSL_VERSION_SSL3); +#endif PyModule_AddIntConstant(m, "PROTOCOL_SSLv23", PY_SSL_VERSION_SSL23); PyModule_AddIntConstant(m, "PROTOCOL_TLSv1", pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy-1.5-src000066400000000000000000000005641517431316200261330ustar00rootroot00000000000000prefer_openssl11 install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl install_package "pypy-1.5-src" "https://foss.heptapod.net/pypy/pypy/-/archive/release-1.5/pypy-release-1.5.tar.gz" "pypy_builder" verify_py27 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy-1.6000066400000000000000000000020341517431316200253410ustar00rootroot00000000000000case "$(pypy_architecture 2>/dev/null || true)" in "linux" ) install_package "pypy-1.6" "https://downloads.python.org/pypy/pypy-1.6-linux.tar.bz2#1266c8b5918d84432b8649535fb5c84f6b977331c242bf45c5944033562ce0b2" "pypy" verify_py27 ensurepip ;; "linux64" ) install_package "pypy-1.6" "https://downloads.python.org/pypy/pypy-1.6-linux64.tar.bz2#95b229c496339a51c4c1e9749bf8dbd11e4f698521803c089b52577be2cdbab8" "pypy" verify_py27 ensurepip ;; "osx64" ) install_package "pypy-1.6" "https://downloads.python.org/pypy/pypy-1.6-osx64.tar.bz2#147a0e34b3d3a568d5c5926252a2c27e137677b3121cd8daab1d746df2d91e38" "pypy" verify_py27 ensurepip ;; "win32" ) # FIXME: never tested on Windows install_zip "pypy-1.6" "https://downloads.python.org/pypy/pypy-1.6-win32-c.zip#75bf79f08e2d65fce51b14fb8fe0309f136ffc368f977017dc3029baf8426e53" "pypy" verify_py27 ensurepip ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy-1.7000066400000000000000000000021161517431316200253430ustar00rootroot00000000000000case "$(pypy_architecture 2>/dev/null || true)" in "linux" ) install_package "pypy-1.7" "https://downloads.python.org/pypy/pypy-1.7-linux.tar.bz2#d8f6af52dd5c32ca65de8b1507ef49490188ec131d53a68db6f81201943b4227" "pypy" verify_py27 ensurepip ;; "linux64" ) install_package "pypy-1.7" "https://downloads.python.org/pypy/pypy-1.7-linux64.tar.bz2#cd7ff7a4beaaa78c3b9dbcd567fb0b2d672258051f837e727d4fd636788552ca" "pypy" verify_py27 ensurepip ;; "osx64" ) install_package "pypy-1.7" "https://downloads.python.org/pypy/pypy-1.7-osx64.tar.bz2#9ad01f6e194b1a3d5f2fa82cd6760b4f9e8a791d5ca28cc156c5f03fe43a08ac" "pypy" verify_py27 ensurepip ;; "win32" ) # FIXME: never tested on Windows install_zip "pypy-1.7" "https://downloads.python.org/pypy/pypy-1.7-win32.zip#1d70faaed00f2f69c634dfbb61b54901df64f093d07d976e035578f812ed31ea" "pypy" verify_py27 ensurepip ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." echo "try 'pypy-1.7-dev' to build from source." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy-1.8000066400000000000000000000021161517431316200253440ustar00rootroot00000000000000case "$(pypy_architecture 2>/dev/null || true)" in "linux" ) install_package "pypy-1.8" "https://downloads.python.org/pypy/pypy-1.8-linux.tar.bz2#9c293d8540780260718f8fd8dc433c97b614a31b115ccfe2d68df720ad7e55b1" "pypy" verify_py27 ensurepip ;; "linux64" ) install_package "pypy-1.8" "https://downloads.python.org/pypy/pypy-1.8-linux64.tar.bz2#1045606cceb993844a016b76c55aa43a9924bcf526f91a0572fc97cee69b61dc" "pypy" verify_py27 ensurepip ;; "osx64" ) install_package "pypy-1.8" "https://downloads.python.org/pypy/pypy-1.8-osx64.tar.bz2#b823b6b919082cfb67861b8253313b877618672377164086c0364fa8eaa88b8a" "pypy" verify_py27 ensurepip ;; "win32" ) # FIXME: never tested on Windows install_zip "pypy-1.8" "https://downloads.python.org/pypy/pypy-1.8-win32.zip#a844f54551805d300beffd10b18684e0c08fa080c1b6f7be52bb7fbdfdf38292" "pypy" verify_py27 ensurepip ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." echo "try 'pypy-1.8-dev' to build from source." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy-1.9000066400000000000000000000021161517431316200253450ustar00rootroot00000000000000case "$(pypy_architecture 2>/dev/null || true)" in "linux" ) install_package "pypy-1.9" "https://downloads.python.org/pypy/pypy-1.9-linux.tar.bz2#1e3f9c3d06f8bbfa0dcb1301b40c298096249a7d7c2b4594b3fb1c3e7b9888f2" "pypy" verify_py27 ensurepip ;; "linux64" ) install_package "pypy-1.9" "https://downloads.python.org/pypy/pypy-1.9-linux64.tar.bz2#4298252515e78c96f4ecd9f25be957411c060ece02d9213eef8d781cf528d18f" "pypy" verify_py27 ensurepip ;; "osx64" ) install_package "pypy-1.9" "https://downloads.python.org/pypy/pypy-1.9-osx64.tar.bz2#4858f200e32c1070c77c1234ea0e9473eeda98bcd3832c4231f3e46e4e3b74b1" "pypy" verify_py27 ensurepip ;; "win32" ) # FIXME: never tested on Windows install_zip "pypy-1.9" "https://downloads.python.org/pypy/pypy-1.9-win32.zip#54fafe8c69df390d2a460bab022145aaacd2c62c4a569873b22fdc7475f31581" "pypy" verify_py27 ensurepip ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." echo "try 'pypy-1.9-dev' to build from source." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy-2.0000066400000000000000000000032561517431316200253430ustar00rootroot00000000000000case "$(pypy_architecture 2>/dev/null || true)" in "linux" ) require_distro "Ubuntu 10.04" || true install_package "pypy-2.0" "https://downloads.python.org/pypy/pypy-2.0-linux.tar.bz2#275dbbee67eac527a1177403a0386b17d008740f83030544800d87994edd46b9" "pypy" verify_py27 ensurepip ;; "linux-armel" ) require_distro "Ubuntu 12.04" || true install_package "pypy-2.0-alpha-arm" "https://downloads.python.org/pypy/pypy-2.0-alpha-arm-armel.tar.bz2#2f8f252d43a15661602a98f93d3292e333423459c5facb43eb2de1bda8eb8495" "pypy" verify_py27 ensurepip ;; "linux-armhf" ) require_distro "Ubuntu 12.04" || true install_package "pypy-2.0-alpha-arm" "https://downloads.python.org/pypy/pypy-2.0-alpha-arm-armhf.tar.bz2#00e678e5a226be0692ee18438ace1c91d346256cfab8f32e34a24584d018ca34" "pypy" verify_py27 ensurepip ;; "linux64" ) require_distro "Ubuntu 12.04" || true install_package "pypy-2.0" "https://downloads.python.org/pypy/pypy-2.0-linux64.tar.bz2#14c716d53a507eece89606d547456b886dbdfc0ba6e3fb29062fafe86d1b6038" "pypy" verify_py27 ensurepip ;; "osx64" ) install_package "pypy-2.0" "https://downloads.python.org/pypy/pypy-2.0-osx64.tar.bz2#6d190f32c9dce9d36d4a2bb91faed581a50fb7fa6249eee201dbf5dbc3e3c7d7" "pypy" verify_py27 ensurepip ;; "win32" ) # FIXME: never tested on Windows install_zip "pypy-2.0" "https://downloads.python.org/pypy/pypy-2.0-win32.zip#2f1d5a0d2cb2fa61902eba5479b100d6d26aab211149b06d5acf64089dd20fe1" "pypy" verify_py27 ensurepip ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." echo "try 'pypy-2.0-src' to build from source." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy-2.0-src000066400000000000000000000006321517431316200261230ustar00rootroot00000000000000prefer_openssl11 install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl install_package "pypy-2.0-src" "https://downloads.python.org/pypy/pypy-2.0-src.tar.bz2#d92dfd418beac915d3efc28f8a2090f3c13a89ec653419deff3d7112c5c111f3" "pypy_builder" verify_py27 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy-2.0.1000066400000000000000000000022601517431316200254740ustar00rootroot00000000000000case "$(pypy_architecture 2>/dev/null || true)" in "linux" ) require_distro "Ubuntu 10.04" || true install_package "pypy-2.0.1" "https://downloads.python.org/pypy/pypy-2.0.1-linux.tar.bz2#548686c5b95b424c79586d9a303ed41fca8eba52bd35c1527f39f5cd8fa35ea9" "pypy" verify_py27 ensurepip ;; "linux64" ) require_distro "Ubuntu 12.04" || true install_package "pypy-2.0.1" "https://downloads.python.org/pypy/pypy-2.0.1-linux64.tar.bz2#0eb57e28f2bd5f2a4ad396df322de5adf711eb7d9a2bfeb8be2d9eb9e125c5cc" "pypy" verify_py27 ensurepip ;; "osx64" ) install_package "pypy-2.0.1" "https://downloads.python.org/pypy/pypy-2.0.1-osx64.tar.bz2#337f2fda672827f2d706fd98e3344a83a8b80675e21b83dd6933da38d110c857" "pypy" verify_py27 ensurepip ;; "win32" ) # FIXME: never tested on Windows install_zip "pypy-2.0.1" "https://downloads.python.org/pypy/pypy-2.0.1-win32.zip#78fff168c10176a3a7f6a5b97d2048ed87f3cd9a6284b5afa86115baa19af946" "pypy" verify_py27 ensurepip ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." echo "try 'pypy-2.0.1-src' to build from source." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy-2.0.1-src000066400000000000000000000006361517431316200262660ustar00rootroot00000000000000prefer_openssl11 install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl install_package "pypy-2.0.1-src" "https://downloads.python.org/pypy/pypy-2.0.1-src.tar.bz2#d1327bc325545939236ac609ec509548a545f97b1c933dedbe42f2482a130aa0" "pypy_builder" verify_py27 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy-2.0.2000066400000000000000000000022601517431316200254750ustar00rootroot00000000000000case "$(pypy_architecture 2>/dev/null || true)" in "linux" ) require_distro "Ubuntu 10.04" || true install_package "pypy-2.0.2" "https://downloads.python.org/pypy/pypy-2.0.2-linux.tar.bz2#3b43c1ac147f6bb11981dd7f8c5458b95d6bdcf1adceb8043c32ca5e8fcab4da" "pypy" verify_py27 ensurepip ;; "linux64" ) require_distro "Ubuntu 12.04" || true install_package "pypy-2.0.2" "https://downloads.python.org/pypy/pypy-2.0.2-linux64.tar.bz2#3f9bc07959a2d6058a0c1b84da837e2ec457642fe03ac46123d145c419a7b5cd" "pypy" verify_py27 ensurepip ;; "osx64" ) install_package "pypy-2.0.2" "https://downloads.python.org/pypy/pypy-2.0.2-osx64.tar.bz2#34f5a7bf22a8bca3b9d79ae3186016c34638669ab19b4af6e38412181c757761" "pypy" verify_py27 ensurepip ;; "win32" ) # FIXME: never tested on Windows install_zip "pypy-2.0.2" "https://downloads.python.org/pypy/pypy-2.0.2-win32.zip#f3cfa54740076c59e6ef02e1411f62551230df5cd20a247e81b6e589478afe66" "pypy" verify_py27 ensurepip ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." echo "try 'pypy-2.0.2-src' to build from source." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy-2.0.2-src000066400000000000000000000006361517431316200262670ustar00rootroot00000000000000prefer_openssl11 install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl install_package "pypy-2.0.2-src" "https://downloads.python.org/pypy/pypy-2.0.2-src.tar.bz2#1991c90d6b98e2408b3790d4b57b71ec1c69346328b8321505ce8f6ab4544c3c" "pypy_builder" verify_py27 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy-2.1000066400000000000000000000036661517431316200253510ustar00rootroot00000000000000case "$(pypy_architecture 2>/dev/null || true)" in "linux" ) require_distro "Ubuntu 10.04" || true install_package "pypy-2.1" "https://downloads.python.org/pypy/pypy-2.1-linux.tar.bz2#9c0a38a40d3b4e642a159e51abef2827b33e3f7a254365daa24eae85d840eaf5" "pypy" verify_py27 ensurepip ;; "linux-armel" ) require_distro "Ubuntu 12.04" || true install_package "pypy-2.1" "https://downloads.python.org/pypy/pypy-2.1-linux-armel.tar.bz2#15af2d7485c9e4363805ad5b63bf8a67cd9516e7e34c4abb822229a2a41aee1d" "pypy" verify_py27 ensurepip ;; "linux-armhf" ) if [[ "$(cat /etc/issue 2>/dev/null || true)" == "Raspbian"* ]]; then install_package "pypy-2.1" "https://downloads.python.org/pypy/pypy-2.1-linux-armhf-raspbian.tar.bz2#b11c27447051af00928fcc3d1f20f1441c285045a3acb8cfba8721c63ee90df3" "pypy" verify_py27 ensurepip else require_distro "Ubuntu 13.04" || true install_package "pypy-2.1" "https://downloads.python.org/pypy/pypy-2.1-linux-armhf-raring.tar.bz2#fbab31154848f309ef72b6e845e289285907eda950f6b632963217c463b5d4de" "pypy" verify_py27 ensurepip fi ;; "linux64" ) require_distro "Ubuntu 12.04" || true install_package "pypy-2.1" "https://downloads.python.org/pypy/pypy-2.1-linux64.tar.bz2#80f90bb473635a0249049e87c5cc7cf738e13537c1f1e2857b6345848a3e6d20" "pypy" verify_py27 ensurepip ;; "osx64" ) install_package "pypy-2.1" "https://downloads.python.org/pypy/pypy-2.1-osx64.tar.bz2#d0d788c6d54bb866ace67a1740133cb5bc62357b5ca4783244097f1f648876f0" "pypy" verify_py27 ensurepip ;; "win32" ) # FIXME: never tested on Windows install_zip "pypy-2.1" "https://downloads.python.org/pypy/pypy-2.1-win32.zip#c425a35a6c4938e314ad48014816e05c8e5246d770abe135e11a1f9821eecf53" "pypy" verify_py27 ensurepip ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." echo "try 'pypy-2.1-src' to build from source." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy-2.1-src000066400000000000000000000006321517431316200261240ustar00rootroot00000000000000prefer_openssl11 install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl install_package "pypy-2.1-src" "https://downloads.python.org/pypy/pypy-2.1-src.tar.bz2#31b3066c9739b117d6bb1bdc485a919dc3b67370ec00437de1b74069943f7f17" "pypy_builder" verify_py27 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy-2.2000066400000000000000000000040041517431316200253350ustar00rootroot00000000000000case "$(pypy_architecture 2>/dev/null || true)" in "linux" ) require_distro "Ubuntu 10.04" || true install_package "pypy-2.2-linux" "https://downloads.python.org/pypy/pypy-2.2-linux.tar.bz2#2bdab70106f6b6d0dd97e42535ce73711c987887fb81fb821801f6fdcd92cdc4" "pypy" verify_py27 ensurepip ;; "linux-armel" ) require_distro "Ubuntu 12.04" || true install_package "pypy-2.2-linux-armel" "https://downloads.python.org/pypy/pypy-2.2-linux-armel.tar.bz2#98bfc524f9cf4fd96225f9fc9b0a3a379b8a1a06231b058c51bb875b363f4d75" "pypy" verify_py27 ensurepip ;; "linux-armhf" ) if [[ "$(cat /etc/issue 2>/dev/null || true)" == "Raspbian"* ]]; then install_package "pypy-2.2-linux-armhf-raspbian" "https://downloads.python.org/pypy/pypy-2.2-linux-armhf-raspbian.tar.bz2#4856151d9a6dda82edd9d74f872e97243df3676fc25bbf661f976982194caa47" "pypy" verify_py27 ensurepip else require_distro "Ubuntu 13.04" || true install_package "pypy-2.2-linux-armhf-raring" "https://downloads.python.org/pypy/pypy-2.2-linux-armhf-raring.tar.bz2#d64eeeac0a73bd073d8f875210b0e85ed8f0d9655d3f3cc8abb68093a1eb7366" "pypy" verify_py27 ensurepip fi ;; "linux64" ) require_distro "Ubuntu 12.04" || true install_package "pypy-2.2-linux64" "https://downloads.python.org/pypy/pypy-2.2-linux64.tar.bz2#1583af0122c6ccb0cb95f8c3732925551ce3ca6d5ea0657e21523f8bf97837a3" "pypy" verify_py27 ensurepip ;; "osx64" ) install_package "pypy-2.2-osx64" "https://downloads.python.org/pypy/pypy-2.2-osx64.tar.bz2#8aa943de7ec38f13fa836b6964dbf58b45142e4fe7b3fdd5fffe37fdcf974e01" "pypy" verify_py27 ensurepip ;; "win32" ) # FIXME: never tested on Windows install_zip "pypy-2.2-win32" "https://downloads.python.org/pypy/pypy-2.2-win32.zip#c7a6682cde9034835b337be95415aee21cb4de85049d65a4674efe15d214dfb9" "pypy" verify_py27 ensurepip ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." echo "try 'pypy-2.2-src' to build from source." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy-2.2-src000066400000000000000000000006321517431316200261250ustar00rootroot00000000000000prefer_openssl11 install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl install_package "pypy-2.2-src" "https://downloads.python.org/pypy/pypy-2.2-src.tar.bz2#50fffcb86039e019530a63d656580bc53c173e5f19768bddd8699cd08448e04e" "pypy_builder" verify_py27 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy-2.2.1000066400000000000000000000040421517431316200254760ustar00rootroot00000000000000case "$(pypy_architecture 2>/dev/null || true)" in "linux" ) require_distro "Ubuntu 10.04" || true install_package "pypy-2.2.1-linux" "https://downloads.python.org/pypy/pypy-2.2.1-linux.tar.bz2#4d13483a0e13fc617a7b3d36918ed0e63cf07a7d2827c0a08132b80bc401a55a" "pypy" verify_py27 ensurepip ;; "linux-armel" ) require_distro "Ubuntu 12.04" || true install_package "pypy-2.2.1-linux-armel" "https://downloads.python.org/pypy/pypy-2.2.1-linux-armel.tar.bz2#f0a15c7f4d66f152c58d73475314b906dcd3052fc422a8bb8cf88ae1ca0a8b19" "pypy" verify_py27 ensurepip ;; "linux-armhf" ) if [[ "$(cat /etc/issue 2>/dev/null || true)" == "Raspbian"* ]]; then install_package "pypy-2.2.1-linux-armhf-raspbian" "https://downloads.python.org/pypy/pypy-2.2.1-linux-armhf-raspbian.tar.bz2#31d921a8139ec6accf9749df2baff4aed844f6f46eeb37184119ff9c7d6fca55" "pypy" verify_py27 ensurepip else require_distro "Ubuntu 13.04" || true install_package "pypy-2.2.1-linux-armhf-raring" "https://downloads.python.org/pypy/pypy-2.2.1-linux-armhf-raring.tar.bz2#6f5fe3285a32d1ea8fe148265467f870c6863ae00bc2e279b31b94d2d7f80102" "pypy" verify_py27 ensurepip fi ;; "linux64" ) require_distro "Ubuntu 12.04" || true install_package "pypy-2.2.1-linux64" "https://downloads.python.org/pypy/pypy-2.2.1-linux64.tar.bz2#022d611ac62a276890d3e262f4f7cc839fcf9f5e1416df01dcd83ba335eacb16" "pypy" verify_py27 ensurepip ;; "osx64" ) install_package "pypy-2.2.1-osx64" "https://downloads.python.org/pypy/pypy-2.2.1-osx64.tar.bz2#93e215dcffc9073acf41c63518f47fb59de60386aca4416cfe32190c7a096f29" "pypy" verify_py27 ensurepip ;; "win32" ) # FIXME: never tested on Windows install_zip "pypy-2.2.1-win32" "https://downloads.python.org/pypy/pypy-2.2.1-win32.zip#d36f4f1b4f146b3a0a623abef9b5a837c08f66e67c90023c724dfdcd8e0133bb" "pypy" verify_py27 ensurepip ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." echo "try 'pypy-2.2.1-src' to build from source." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy-2.2.1-src000066400000000000000000000006361517431316200262700ustar00rootroot00000000000000prefer_openssl11 install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl install_package "pypy-2.2.1-src" "https://downloads.python.org/pypy/pypy-2.2.1-src.tar.bz2#252045187e443656a2beb412dadac9296e8fe8db0f75a66ed5265db58c35035f" "pypy_builder" verify_py27 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy-2.3000066400000000000000000000040041517431316200253360ustar00rootroot00000000000000case "$(pypy_architecture 2>/dev/null || true)" in "linux" ) require_distro "Ubuntu 10.04" || true install_package "pypy-2.3-linux" "https://downloads.python.org/pypy/pypy-2.3-linux.tar.bz2#9071072d42344fb37cc588429864b00fff447bd5d33d51008641fe6822823f1b" "pypy" verify_py27 ensurepip ;; "linux-armel" ) require_distro "Ubuntu 12.04" || true install_package "pypy-2.3-linux-armel" "https://downloads.python.org/pypy/pypy-2.3-linux-armel.tar.bz2#18394acc9ce356d109cbd92224a9d724a7eb53a0505ce0ec5de36ee20b288a07" "pypy" verify_py27 ensurepip ;; "linux-armhf" ) if [[ "$(cat /etc/issue 2>/dev/null || true)" == "Raspbian"* ]]; then install_package "pypy-2.3-linux-armhf-raspbian" "https://downloads.python.org/pypy/pypy-2.3-linux-armhf-raspbian.tar.bz2#92584cfccde188b6a3a850ecf226daa9924788a1da8574c57c10a7551fb127d4" "pypy" verify_py27 ensurepip else require_distro "Ubuntu 13.04" || true install_package "pypy-2.3-linux-armhf-raring" "https://downloads.python.org/pypy/pypy-2.3-linux-armhf-raring.tar.bz2#c8c4a4da406db8ea6dfec074951e1ac150619b0709317ceaafb6bdd837acf96e" "pypy" verify_py27 ensurepip fi ;; "linux64" ) require_distro "Ubuntu 12.04" || true install_package "pypy-2.3-linux64" "https://downloads.python.org/pypy/pypy-2.3-linux64.tar.bz2#777dbdd9c67ad1b8906288b01ae76bc9f7b80c95e967836f9a700a1679b80008" "pypy" verify_py27 ensurepip ;; "osx64" ) install_package "pypy-2.3-osx64" "https://downloads.python.org/pypy/pypy-2.3-osx64.tar.bz2#df7ca23ba6c8a63149d910b482be04f069b26dd1f7d0ca15e6342cac94e759d7" "pypy" verify_py27 ensurepip ;; "win32" ) # FIXME: never tested on Windows install_zip "pypy-2.3-win32" "https://downloads.python.org/pypy/pypy-2.3-win32.zip#72f46afe69281147ad9abc88a7b39d1840e112e626a8be251a5f9f7308c559c7" "pypy" verify_py27 ensurepip ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." echo "try 'pypy-2.3-src' to build from source." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy-2.3-src000066400000000000000000000006441517431316200261310ustar00rootroot00000000000000prefer_openssl11 install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl install_package "pypy-pypy-394146e9bb67" "https://downloads.python.org/pypy/pypy-2.3-src.tar.bz2#be2c271e7f9d7c0059a551ba1501713c00336e551e7f13107f0f34c721d95b0c" "pypy_builder" verify_py27 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy-2.3.1000066400000000000000000000052621517431316200255040ustar00rootroot00000000000000case "$(pypy_architecture 2>/dev/null || true)" in "linux" ) if require_distro "Ubuntu 10.04" 1>/dev/null 2>&1; then install_package "pypy-2.3.1-linux" "https://downloads.python.org/pypy/pypy-2.3.1-linux.tar.bz2#3eed698e8533cca7cbd2c2c87fce39dc14baa7dec03f4b082d870131d2a470e4" "pypy" verify_py27 ensurepip else install_package "pypy-2.3.1-linux_i686-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy-2.3.1-linux_i686-portable.tar.bz2#d8784020f6b8a5812fd8b3f5e1df8afb176fd56c2a929d4408d28d4a925525fa" "pypy" verify_py27 ensurepip fi ;; "linux-armel" ) require_distro "Ubuntu 12.04" || true install_package "pypy-2.3.1-linux-armel" "https://downloads.python.org/pypy/pypy-2.3.1-linux-armel.tar.bz2#4d71679597b4e971d7e566d9696851dd2ec1a90a04696184d2d0f6b5446d9706" "pypy" verify_py27 ensurepip ;; "linux-armhf" ) if [[ "$(cat /etc/issue 2>/dev/null || true)" == "Raspbian"* ]]; then install_package "pypy-2.3.1-linux-armhf-raspbian" "https://downloads.python.org/pypy/pypy-2.3.1-linux-armhf-raspbian.tar.bz2#74ac62f8cf6dfa0b2f04debd8bbedaed21a12a1a4d4da22856410d06dc0c971c" "pypy" verify_py27 ensurepip else require_distro "Ubuntu 13.04" || true install_package "pypy-2.3.1-linux-armhf-raring" "https://downloads.python.org/pypy/pypy-2.3.1-linux-armhf-raring.tar.bz2#f65ad31c364e8122f55d77388026cf4750c6a8774af361b79dc9942612c3a8c1" "pypy" verify_py27 ensurepip fi ;; "linux64" ) if require_distro "Ubuntu 12.04" 1>/dev/null 2>&1; then install_package "pypy-2.3.1-linux64" "https://downloads.python.org/pypy/pypy-2.3.1-linux64.tar.bz2#dab7940496d96f1f255a8ef402fa96b94444775e373484e057d2fcabc3928b42" "pypy" verify_py27 ensurepip else install_package "pypy-2.3.1-linux_x86_64-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy-2.3.1-linux_x86_64-portable.tar.bz2#453bd1291f0372e25ceab6b37b7a8d1756bebd3e708fcce1379ef931ccf9f75a" "pypy" verify_py27 ensurepip fi ;; "osx64" ) install_package "pypy-2.3.1-osx64" "https://downloads.python.org/pypy/pypy-2.3.1-osx64.tar.bz2#12e363bf5ea3a508600e043b68c47d4148359ca3d999ee207665bb139f8fbf37" "pypy" verify_py27 ensurepip ;; "win32" ) # FIXME: never tested on Windows install_zip "pypy-2.3.1-win32" "https://downloads.python.org/pypy/pypy-2.3.1-win32.zip#c8db46d0e5199420dae583f6d2901eb4d4023ced75f035a6e26c232f229f8e0a" "pypy" verify_py27 ensurepip ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." echo "try 'pypy-2.3.1-src' to build from source." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy-2.3.1-src000066400000000000000000000006461517431316200262720ustar00rootroot00000000000000prefer_openssl11 install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl install_package "pypy-pypy-32f35069a16d" "https://downloads.python.org/pypy/pypy-2.3.1-src.tar.bz2#6b10efab2be5502b475a25181870616e9ff83296b225aa2c7a7ec617c0ff78ef" "pypy_builder" verify_py27 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy-2.4.0000066400000000000000000000052521517431316200255030ustar00rootroot00000000000000case "$(pypy_architecture 2>/dev/null || true)" in "linux" ) if require_distro "Ubuntu 10.04" 1>/dev/null 2>&1; then install_package "pypy-2.4.0-linux" "https://downloads.python.org/pypy/pypy-2.4.0-linux.tar.bz2#a24adb366f87ac0eba829d7188a156a7d897e71893689fab06502c3f4152ac0e" "pypy" verify_py27 ensurepip else install_package "pypy-2.4-linux_i686-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy-2.4-linux_i686-portable.tar.bz2#2a330bbeae038c143366982f2104bf4096752f1ec7520fc5608f0527c124b0c2" "pypy" verify_py27 ensurepip fi ;; "linux-armel" ) require_distro "Ubuntu 12.04" || true install_package "pypy-2.4.0-linux-armel" "https://downloads.python.org/pypy/pypy-2.4.0-linux-armel.tar.bz2#8362d634bf86fbfb3b99b578b13c0a9fd673b2b7580d6d65b4a181934c659ccd" "pypy" verify_py27 ensurepip ;; "linux-armhf" ) if [[ "$(cat /etc/issue 2>/dev/null || true)" == "Raspbian"* ]]; then install_package "pypy-2.4.0-linux-armhf-raspbian" "https://downloads.python.org/pypy/pypy-2.4.0-linux-armhf-raspbian.tar.bz2#5e0ba69b28ffbd5b61b0b6be2a130ab0c80e7d2da289d9530b0b6eac4302d5fa" "pypy" verify_py27 ensurepip else require_distro "Ubuntu 13.04" || true install_package "pypy-2.4.0-linux-armhf-raring" "https://downloads.python.org/pypy/pypy-2.4.0-linux-armhf-raring.tar.bz2#ddbdd6207c41cf82d8c96d52a2a204a2cdada9301cb577f9b323f22394bb1f0a" "pypy" verify_py27 ensurepip fi ;; "linux64" ) if require_distro "Ubuntu 12.04" 1>/dev/null 2>&1; then install_package "pypy-2.4.0-linux64" "https://downloads.python.org/pypy/pypy-2.4.0-linux64.tar.bz2#27cdc0d6e8bce2637678f6d076fc780877dffe1bf9aec9e253f95219af9ed099" "pypy" verify_py27 ensurepip else install_package "pypy-2.4-linux_x86_64-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy-2.4-linux_x86_64-portable.tar.bz2#b6ed31aff0ebcc9b40554576b1ce789fe4e8c93f7a34cd3983515e1a9a8a45b6" "pypy" verify_py27 ensurepip fi ;; "osx64" ) install_package "pypy-2.4.0-osx64" "https://downloads.python.org/pypy/pypy-2.4.0-osx64.tar.bz2#3eb8afdfa42bc9b08b4d3058e21d4ce978a52722fdcfdc67d6c3ee5013a51aaa" "pypy" verify_py27 ensurepip ;; "win32" ) # FIXME: never tested on Windows install_zip "pypy-2.4.0-win32" "https://downloads.python.org/pypy/pypy-2.4.0-win32.zip#297fa3820a3aa8da291f52b6e2398b23232192b69773638e3d06999d92a2b0aa" "pypy" verify_py27 ensurepip ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." echo "try 'pypy-2.4.0-src' to build from source." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy-2.4.0-src000066400000000000000000000006461517431316200262720ustar00rootroot00000000000000prefer_openssl11 install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl install_package "pypy-pypy-c6ad44ecf5d8" "https://downloads.python.org/pypy/pypy-2.4.0-src.tar.bz2#38810007aee4885ca0703b566db6594dd7649adaaa287df7a1012f10e067740f" "pypy_builder" verify_py27 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy-2.5.0000066400000000000000000000053461517431316200255100ustar00rootroot00000000000000case "$(pypy_architecture 2>/dev/null || true)" in "linux" ) if require_distro "Ubuntu 10.04" 1>/dev/null 2>&1; then install_package "pypy-2.5.0-linux" "https://downloads.python.org/pypy/pypy-2.5.0-linux.tar.bz2#3dfd56a986d25929b4ed9f40a5484f72f1d513cd816cf8aaa683106c3391247c" "pypy" verify_py27 ensurepip else install_package "pypy-2.5-linux_i686-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy-2.5-linux_i686-portable.tar.bz2#6cbe3e1a48900f22c8e4412f82906fba92dd4a165bac5fe6866a2a26383fe3b8" "pypy" verify_py27 ensurepip fi ;; "linux-armel" ) require_distro "Ubuntu 12.04" || true install_package "pypy-2.5.0-linux-armel" "https://downloads.python.org/pypy/pypy-2.5.0-linux-armel.tar.bz2#277fa6c61d63af96893dafd19e1ffea7b988397c6a0fd66cd99dc0db1029be56" "pypy" verify_py27 ensurepip ;; "linux-armhf" ) if [[ "$(cat /etc/issue 2>/dev/null || true)" == "Raspbian"* ]]; then install_package "pypy-2.5.0-linux-armhf-raspbian" "https://downloads.python.org/pypy/pypy-2.5.0-linux-armhf-raspbian.tar.bz2#6c975e39f0e7d57176b49a987a08862a3cbd9aeb52f47eb4ab148ea334e747fd" "pypy" verify_py27 ensurepip else require_distro "Ubuntu 13.04" || true install_package "pypy-2.5.0-linux-armhf-raring" "https://downloads.python.org/pypy/pypy-2.5.0-linux-armhf-raring.tar.bz2#1866bf2b8a8144c68d64f2ba982c6c545849913167b4602b762716332ec1fa0b" "pypy" verify_py27 ensurepip fi ;; "linux64" ) if require_distro "Ubuntu 12.04" "Ubuntu 12.10" "Ubuntu 13.04" "Ubuntu 13.10" "Ubuntu 14.04" 1>/dev/null 2>&1; then install_package "pypy-2.5.0-linux64" "https://downloads.python.org/pypy/pypy-2.5.0-linux64.tar.bz2#7764fb6b662407f8709eaa334c542aac9cb6bfe3291ac198dad0980ca129f3c2" "pypy" verify_py27 ensurepip else install_package "pypy-2.5-linux_x86_64-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy-2.5-linux_x86_64-portable.tar.bz2#26c5a0964b32b09be0282766c27937c843a12b6820ff2d440c6d47a6092837e0" "pypy" verify_py27 ensurepip fi ;; "osx64" ) install_package "pypy-2.5.0-osx64" "https://downloads.python.org/pypy/pypy-2.5.0-osx64.tar.bz2#30b392b969b54cde281b07f5c10865a7f2e11a229c46b8af384ca1d3fe8d4e6e" "pypy" verify_py27 ensurepip ;; "win32" ) # FIXME: never tested on Windows install_zip "pypy-2.5.0-win32" "https://downloads.python.org/pypy/pypy-2.5.0-win32.zip#692391434cf14016d74c6b8bda8f93135ef026f48c8327f3195bfa24d314317d" "pypy" verify_py27 ensurepip ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." echo "try 'pypy-2.5.0-src' to build from source." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy-2.5.0-src000066400000000000000000000006461517431316200262730ustar00rootroot00000000000000prefer_openssl11 install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl install_package "pypy-pypy-10f1b29a2bd2" "https://downloads.python.org/pypy/pypy-2.5.0-src.tar.bz2#8ff1e131d8fefd79032dd81bcf3fde927e152d3acde5105356f6ffc1aad33f81" "pypy_builder" verify_py27 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy-2.5.1000066400000000000000000000053561517431316200255120ustar00rootroot00000000000000case "$(pypy_architecture 2>/dev/null || true)" in "linux" ) if require_distro "Ubuntu 10.04" 1>/dev/null 2>&1; then install_package "pypy-2.5.1-linux" "https://downloads.python.org/pypy/pypy-2.5.1-linux.tar.bz2#c0035a2650cafcb384050a8c476ddc41c9fd40b0c3677fab68026f57c715907a" "pypy" verify_py27 ensurepip else install_package "pypy-2.5.1-linux_i686-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy-2.5.1-linux_i686-portable.tar.bz2#ed532ddde3332d10faa59af49854cacbca458c597889352e619a87ab22363063" "pypy" verify_py27 ensurepip fi ;; "linux-armel" ) require_distro "Ubuntu 12.04" || true install_package "pypy-2.5.1-linux-armel" "https://downloads.python.org/pypy/pypy-2.5.1-linux-armel.tar.bz2#91d68551b6e738c1e47aaed869a6df8208abb8c60194a1647c6aa13c7363a61d" "pypy" verify_py27 ensurepip ;; "linux-armhf" ) if [[ "$(cat /etc/issue 2>/dev/null || true)" == "Raspbian"* ]]; then install_package "pypy-2.5.1-linux-armhf-raspbian" "https://downloads.python.org/pypy/pypy-2.5.1-linux-armhf-raspbian.tar.bz2#2b730f86b56fcc72f5bfcfe6a38b5a6fe27654f73b2256e10297373af169a69e" "pypy" verify_py27 ensurepip else require_distro "Ubuntu 13.04" || true install_package "pypy-2.5.1-linux-armhf-raring" "https://downloads.python.org/pypy/pypy-2.5.1-linux-armhf-raring.tar.bz2#0a5648c18cc604b0a8eaa559549cb332d18358fc551865e9b7ef051b796e4ec7" "pypy" verify_py27 ensurepip fi ;; "linux64" ) if require_distro "Ubuntu 12.04" "Ubuntu 12.10" "Ubuntu 13.04" "Ubuntu 13.10" "Ubuntu 14.04" 1>/dev/null 2>&1; then install_package "pypy-2.5.1-linux64" "https://downloads.python.org/pypy/pypy-2.5.1-linux64.tar.bz2#68e0955dbc80a0d51dfa9a8a76d8623f34920ece1bcbc6d910c2be019a653ba8" "pypy" verify_py27 ensurepip else install_package "pypy-2.5.1-linux_x86_64-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy-2.5.1-linux_x86_64-portable.tar.bz2#157bee6349878cf0ef575b0d7bfd6cbb837c00e83b2872c924580ef7bc32c0d7" "pypy" verify_py27 ensurepip fi ;; "osx64" ) install_package "pypy-2.5.1-osx64" "https://downloads.python.org/pypy/pypy-2.5.1-osx64.tar.bz2#db40dc8b5e95ef9c3322bd9897099e91555ef34188cf1c3852a92b081142d183" "pypy" verify_py27 ensurepip ;; "win32" ) # FIXME: never tested on Windows install_zip "pypy-2.5.1-win32" "https://downloads.python.org/pypy/pypy-2.5.1-win32.zip#0dbf90c30e848a91611bea99968a215244db02cf5f649114f10269cf1a15d607" "pypy" verify_py27 ensurepip ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." echo "try 'pypy-2.5.1-src' to build from source." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy-2.5.1-src000066400000000000000000000006361517431316200262730ustar00rootroot00000000000000prefer_openssl11 install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl install_package "pypy-2.5.1-src" "https://downloads.python.org/pypy/pypy-2.5.1-src.tar.bz2#ddb3a580b1ee99c5a699172d74be91c36dda9a38946d4731d8c6a63120a3ba2a" "pypy_builder" verify_py27 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy-2.6.0000066400000000000000000000053461517431316200255110ustar00rootroot00000000000000case "$(pypy_architecture 2>/dev/null || true)" in "linux" ) if require_distro "Ubuntu 10.04" 1>/dev/null 2>&1; then install_package "pypy-2.6.0-linux" "https://downloads.python.org/pypy/pypy-2.6.0-linux.tar.bz2#6e0b052c40a59bf5a85ee239980bbcab8b031b4c2bc33b99efe1b072977d9910" "pypy" verify_py27 ensurepip else install_package "pypy-2.6-linux_i686-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy-2.6-linux_i686-portable.tar.bz2#e01db0984f7fecd80dadfb1d5f65118e596e3984d12643b4d552e83f92bff549" "pypy" verify_py27 ensurepip fi ;; "linux-armel" ) require_distro "Ubuntu 12.04" || true install_package "pypy-2.6.0-linux-armel" "https://downloads.python.org/pypy/pypy-2.6.0-linux-armel.tar.bz2#9d0cb9b15283f9c15f83c05293f8bd41d302c96090fd89b778f359df9bc8e619" "pypy" verify_py27 ensurepip ;; "linux-armhf" ) if [[ "$(cat /etc/issue 2>/dev/null || true)" == "Raspbian"* ]]; then install_package "pypy-2.6.0-linux-armhf-raspbian" "https://downloads.python.org/pypy/pypy-2.6.0-linux-armhf-raspbian.tar.bz2#e9f6a16c3e21f38bd571adb33757649ceef3f2ebfdd6d37eea923ce26ea6728c" "pypy" verify_py27 ensurepip else require_distro "Ubuntu 13.04" || true install_package "pypy-2.6.0-linux-armhf-raring" "https://downloads.python.org/pypy/pypy-2.6.0-linux-armhf-raring.tar.bz2#ccb37a6d861b6dd69cd038337664885dcf91852a2ab6aef480dd7cfbda8de502" "pypy" verify_py27 ensurepip fi ;; "linux64" ) if require_distro "Ubuntu 12.04" "Ubuntu 12.10" "Ubuntu 13.04" "Ubuntu 13.10" "Ubuntu 14.04" 1>/dev/null 2>&1; then install_package "pypy-2.6.0-linux64" "https://downloads.python.org/pypy/pypy-2.6.0-linux64.tar.bz2#f5d2b0e3594cec57e32d3e43a951041ec330e1e962a836be470d591633e51388" "pypy" verify_py27 ensurepip else install_package "pypy-2.6-linux_x86_64-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy-2.6-linux_x86_64-portable.tar.bz2#97284b66476c5d1b17a62f5017569a0073730928e19f95b49d78d6bc60b69495" "pypy" verify_py27 ensurepip fi ;; "osx64" ) install_package "pypy-2.6.0-osx64" "https://downloads.python.org/pypy/pypy-2.6.0-osx64.tar.bz2#77f1d056484e40e0a8e2e2b2b489eedfe785605ef36b144ffce05f7b748f6acd" "pypy" verify_py27 ensurepip ;; "win32" ) # FIXME: never tested on Windows install_zip "pypy-2.6.0-win32" "https://downloads.python.org/pypy/pypy-2.6.0-win32.zip#de907e7fef7b9b6ceccfc8aa5f4781ee3bc4a49b119d4b22ab5e25eab21c6e8d" "pypy" verify_py27 ensurepip ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." echo "try 'pypy-2.6.0-src' to build from source." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy-2.6.0-src000066400000000000000000000006361517431316200262730ustar00rootroot00000000000000prefer_openssl11 install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl install_package "pypy-2.6.0-src" "https://downloads.python.org/pypy/pypy-2.6.0-src.tar.bz2#9bf353f22d25e97a85a6d3766619966055edea1ea1b2218445d683a8ad0399d9" "pypy_builder" verify_py27 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy-2.6.1000066400000000000000000000057111517431316200255060ustar00rootroot00000000000000case "$(pypy_architecture 2>/dev/null || true)" in "freebsd64" ) install_package "pypy-2.6.1-freebsd64" "https://downloads.python.org/pypy/pypy-2.6.1-freebsd64.tar.bz2#58118e88ce01c1d48b31d293db40687efbdeba54334eb55ba96de9ecf3c39055" "pypy" verify_py27 ensurepip ;; "linux" ) if require_distro "Ubuntu 10.04" 1>/dev/null 2>&1; then install_package "pypy-2.6.1-linux" "https://downloads.python.org/pypy/pypy-2.6.1-linux.tar.bz2#d010b1f1aafdb01beb107f16843985508ce81698260ce830690686d9b2768c88" "pypy" verify_py27 ensurepip else install_package "pypy-2.6.1-linux_i686-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy-2.6.1-linux_i686-portable.tar.bz2#af8f05790fe21bffdb0619d39f2890e2ecabe47bbd3b21c2c97b9778e4cdb378" "pypy" verify_py27 ensurepip fi ;; "linux-armel" ) require_distro "Ubuntu 12.04" || true install_package "pypy-2.6.1-linux-armel" "https://downloads.python.org/pypy/pypy-2.6.1-linux-armel.tar.bz2#0ca15d289e78a82f927b375a016b7c3246accac5d7eebded4e32a496fb3245ab" "pypy" verify_py27 ensurepip ;; "linux-armhf" ) if [[ "$(cat /etc/issue 2>/dev/null || true)" == "Raspbian"* ]]; then install_package "pypy-2.6.1-linux-armhf-raspbian" "https://downloads.python.org/pypy/pypy-2.6.1-linux-armhf-raspbian.tar.bz2#13d983805ebc6d9a3627dea3c34898375a4e4e7b6f0171cfbde463c1c04a92aa" "pypy" verify_py27 ensurepip else require_distro "Ubuntu 13.04" || true install_package "pypy-2.6.1-linux-armhf-raring" "https://downloads.python.org/pypy/pypy-2.6.1-linux-armhf-raring.tar.bz2#4caa7c1922a212cca4690bfa181cd368760a23b50163b3cbbd6d28401dd5cef5" "pypy" verify_py27 ensurepip fi ;; "linux64" ) if require_distro "Ubuntu 12.04" "Ubuntu 12.10" "Ubuntu 13.04" "Ubuntu 13.10" "Ubuntu 14.04" 1>/dev/null 2>&1; then install_package "pypy-2.6.1-linux64" "https://downloads.python.org/pypy/pypy-2.6.1-linux64.tar.bz2#78a48490d1b2dba8571156c2bf822324ca7dae6f6a56a4bbb96d3e8e8885367b" "pypy" verify_py27 ensurepip else install_package "pypy-2.6.1-linux_x86_64-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy-2.6.1-linux_x86_64-portable.tar.bz2#ed6a35dee4c982123af716e62975039e18920b599afc4f6a2f3c7c89d0403389" "pypy" verify_py27 ensurepip fi ;; "osx64" ) install_package "pypy-2.6.1-osx64" "https://downloads.python.org/pypy/pypy-2.6.1-osx64.tar.bz2#4a78ef76ec38a49a9de40225c337e89486fa09938c600df2bd2dd60110066f65" "pypy" verify_py27 ensurepip ;; "win32" ) # FIXME: never tested on Windows install_zip "pypy-2.6.1-win32" "https://downloads.python.org/pypy/pypy-2.6.1-win32.zip#ccea3940fdedc03e2fcb5acf6badfe6d9c1ae876d5faf0a004e1d94edd7fd856" "pypy" verify_py27 ensurepip ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." echo "try 'pypy-2.6.1-src' to build from source." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy-2.6.1-src000066400000000000000000000006361517431316200262740ustar00rootroot00000000000000prefer_openssl11 install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl install_package "pypy-2.6.1-src" "https://downloads.python.org/pypy/pypy-2.6.1-src.tar.bz2#7fddd414c9348c2f899f79ad86adc3fc2b19443855b5243f58487e1f0ac46560" "pypy_builder" verify_py27 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy-4.0.0000066400000000000000000000063401517431316200255000ustar00rootroot00000000000000case "$(pypy_architecture 2>/dev/null || true)" in "linux" ) if require_distro "Ubuntu 10.04" 1>/dev/null 2>&1; then install_package "pypy-4.0.0-linux" "https://downloads.python.org/pypy/pypy-4.0.0-linux.tar.bz2#365600947775bc73a902a5b1d11f8b96cf49f07cdbbab28bb47240097b4bb4c5" "pypy" verify_py27 ensurepip else install_package "pypy-4.0-linux_i686-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy-4.0-linux_i686-portable.tar.bz2#8d6b775a1fdc79db453f80e6b50cd9979d89be3714cd71d3af21bf9f56745610" "pypy" verify_py27 ensurepip fi ;; "linux-armel" ) require_distro "Ubuntu 12.04" || true install_package "pypy-4.0.0-linux-armel" "https://downloads.python.org/pypy/pypy-4.0.0-linux-armel.tar.bz2#612df41fa21c5bc95d8d3575e0d8c09f605de6f0684109222afa561672dd9c7b" "pypy" verify_py27 ensurepip ;; "linux-armhf" ) if [[ "$(cat /etc/issue 2>/dev/null || true)" == "Raspbian"* ]]; then install_package "pypy-4.0.0-linux-armhf-raspbian" "https://downloads.python.org/pypy/pypy-4.0.0-linux-armhf-raspbian.tar.bz2#fccd9d8436781cbeb8c94e2b37e590303c52e63bc50ed30c4a99a46f022c44bb" "pypy" verify_py27 ensurepip else require_distro "Ubuntu 13.04" || true install_package "pypy-4.0.0-linux-armhf-raring" "https://downloads.python.org/pypy/pypy-4.0.0-linux-armhf-raring.tar.bz2#9586d9accdb8faa488a313132047e0dad73c8facc222201380d4935a2ba429b8" "pypy" verify_py27 ensurepip fi ;; "linux-ppc64" ) require_distro "Fedora 20" || true install_package "pypy-4.0.0-ppc64" "https://downloads.python.org/pypy/pypy-4.0.0-ppc64.tar.bz2#729eab7fa84289a094d69fe1607ef97c8e7acc08588db5cd410c9dd26bdd4110" "pypy" verify_py27 ensurepip ;; "linux-ppc64le" ) require_distro "Fedora 21" || true install_package "pypy-4.0.0-ppc64le" "https://downloads.python.org/pypy/pypy-4.0.0-ppc64le.tar.bz2#0ba3c313afb48cba2798c9b46e9a27e24a597f90e092b649b6ac9cd8af4f7765" "pypy" verify_py27 ensurepip ;; "linux64" ) if require_distro "Ubuntu 12.04" "Ubuntu 12.10" "Ubuntu 13.04" "Ubuntu 13.10" "Ubuntu 14.04" 1>/dev/null 2>&1; then install_package "pypy-4.0.0-linux64" "https://downloads.python.org/pypy/pypy-4.0.0-linux64.tar.bz2#30365cf4fa6cd8e9ff44126f06dcaebefda35c2543ddcf9b9e8516c29cabe726" "pypy" verify_py27 ensurepip else install_package "pypy-4.0-linux_x86_64-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy-4.0-linux_x86_64-portable.tar.bz2#61fb04eaa823763b8de777e16edc02b09116985586f53c14c6e85d531072a38f" "pypy" verify_py27 ensurepip fi ;; "osx64" ) install_package "pypy-4.0.0-osx64" "https://downloads.python.org/pypy/pypy-4.0.0-osx64.tar.bz2#d9e590fe5b9461bbdff56c76636e844ef90a297f82d0d2e204866c8a21759a50" "pypy" verify_py27 ensurepip ;; "win32" ) # FIXME: never tested on Windows install_zip "pypy-4.0.0-win32" "https://downloads.python.org/pypy/pypy-4.0.0-win32.zip#86493202261c62ba5b4b8840b1d0005bc9bf46af4f46d3b9a54ddbe8335da568" "pypy" verify_py27 ensurepip ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." echo "try 'pypy-4.0.0-src' to build from source." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy-4.0.0-src000066400000000000000000000006361517431316200262670ustar00rootroot00000000000000prefer_openssl11 install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl install_package "pypy-4.0.0-src" "https://downloads.python.org/pypy/pypy-4.0.0-src.tar.bz2#acff480e44ce92acd057f2e786775af36dc3c2cd12e9efc60a1ac6a562ad7b4d" "pypy_builder" verify_py27 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy-4.0.1000066400000000000000000000061461517431316200255050ustar00rootroot00000000000000case "$(pypy_architecture 2>/dev/null || true)" in "linux" ) if require_distro "Ubuntu 10.04" 1>/dev/null 2>&1; then install_package "pypy-4.0.1-linux" "https://downloads.python.org/pypy/pypy-4.0.1-linux.tar.bz2#721920fcbb6aefc9a98e868e32b7f4ea5fd68b7f9305d08d0a2595327c9c0611" "pypy" verify_py27 ensurepip else install_package "pypy-4.0.1-linux_i686-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy-4.0.1-linux_i686-portable.tar.bz2#2a1078bf36372b1c2919c11c418860dd7f0d44c92e6772bb36490eaf793b5c47" "pypy" verify_py27 ensurepip fi ;; "linux-armel" ) require_distro "Ubuntu 12.04" || true install_package "pypy-4.0.1-linux-armel" "https://downloads.python.org/pypy/pypy-4.0.1-linux-armel.tar.bz2#d1acdd45ebd34580dd632c63c95211f6bae5e9a8f7a46ffa6f0443286ff9f61b" "pypy" verify_py27 ensurepip ;; "linux-armhf" ) if [[ "$(cat /etc/issue 2>/dev/null || true)" == "Raspbian"* ]]; then install_package "pypy-4.0.1-linux-armhf-raspbian" "https://downloads.python.org/pypy/pypy-4.0.1-linux-armhf-raspbian.tar.bz2#52eef495f560af59a787b9935367cb5f8c83b48e32a80ec3e7060bffac011ecc" "pypy" verify_py27 ensurepip else require_distro "Ubuntu 13.04" || true install_package "pypy-4.0.1-linux-armhf-raring" "https://downloads.python.org/pypy/pypy-4.0.1-linux-armhf-raring.tar.bz2#e67278ce7423aa7bf99a95fd271cb76763eae3106930f4b7de1fba6a70a3f383" "pypy" verify_py27 ensurepip fi ;; "linux-ppc64" ) require_distro "Fedora 20" || true install_package "pypy-4.0.1-ppc64" "https://downloads.python.org/pypy/pypy-4.0.1-ppc64.tar.bz2" "pypy" verify_py27 ensurepip ;; "linux-ppc64le" ) require_distro "Fedora 21" || true install_package "pypy-4.0.1-ppc64le" "https://downloads.python.org/pypy/pypy-4.0.1-ppc64le.tar.bz2" "pypy" verify_py27 ensurepip ;; "linux64" ) if require_distro "Ubuntu 12.04" "Ubuntu 12.10" "Ubuntu 13.04" "Ubuntu 13.10" "Ubuntu 14.04" 1>/dev/null 2>&1; then install_package "pypy-4.0.1-linux64" "https://downloads.python.org/pypy/pypy-4.0.1-linux64.tar.bz2#0d6090cee59f4b9bab91ddbea76580d0c232b78dae65aaa9e8fa8d4449ba25b4" "pypy" verify_py27 ensurepip else install_package "pypy-4.0.1-linux_x86_64-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy-4.0.1-linux_x86_64-portable.tar.bz2#b3803f6dd9bbb964f7d322aa4aeb93191ff0ebe573428c1d2014ea26da49ff53" "pypy" verify_py27 ensurepip fi ;; "osx64" ) install_package "pypy-4.0.1-osx64" "https://downloads.python.org/pypy/pypy-4.0.1-osx64.tar.bz2#06be1299691f7ea558bf8e3bdf3d20debb8ba03cd7cadf04f2d6cbd5fd084430" "pypy" verify_py27 ensurepip ;; "win32" ) # FIXME: never tested on Windows install_zip "pypy-4.0.1-win32" "https://downloads.python.org/pypy/pypy-4.0.1-win32.zip#9a350a5e6f9b86fb525c6f1300b0c97c021ea8b1e37bfd32a8c4bb7a415d5329" "pypy" verify_py27 ensurepip ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." echo "try 'pypy-4.0.1-src' to build from source." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy-4.0.1-src000066400000000000000000000006361517431316200262700ustar00rootroot00000000000000prefer_openssl11 install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl install_package "pypy-4.0.1-src" "https://downloads.python.org/pypy/pypy-4.0.1-src.tar.bz2#29f5aa6ba17b34fd980e85172dfeb4086fdc373ad392b1feff2677d2d8aea23c" "pypy_builder" verify_py27 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy-5.0.0000066400000000000000000000063321517431316200255020ustar00rootroot00000000000000case "$(pypy_architecture 2>/dev/null || true)" in "linux" ) if require_distro "Ubuntu 10.04" 1>/dev/null 2>&1; then install_package "pypy-5.0.0-linux" "https://downloads.python.org/pypy/pypy-5.0.0-linux.tar.bz2#a9cc9afa94ff1cde811626a70081c477c9840e7816c0562d1903fd823d222ceb" "pypy" verify_py27 ensurepip else install_package "pypy-5.0-linux_i686-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy-5.0-linux_i686-portable.tar.bz2#316e03afdd2f6212857789933c01f0d41a1665c80d28526c0fb4082b6d3f4f60" "pypy" verify_py27 ensurepip fi ;; "linux-armel" ) require_distro "Ubuntu 12.04" || true install_package "pypy-5.0.0-linux-armel" "https://downloads.python.org/pypy/pypy-5.0.0-linux-armel.tar.bz2#87bd85441b16ecca0d45ba6e9c0e9d26bb7bd8867afbf79d80312cf79b032dc1" "pypy" verify_py27 ensurepip ;; "linux-armhf" ) if [[ "$(cat /etc/issue 2>/dev/null || true)" == "Raspbian"* ]]; then install_package "pypy-5.0.0-linux-armhf-raspbian" "https://downloads.python.org/pypy/pypy-5.0.0-linux-armhf-raspbian.tar.bz2#8033c0cc39e9f6771688f2eda95c726595f5453b3e73e1cd5f7ebbe3dae1f685" "pypy" verify_py27 ensurepip else require_distro "Ubuntu 13.04" || true install_package "pypy-5.0.0-linux-armhf-raring" "https://downloads.python.org/pypy/pypy-5.0.0-linux-armhf-raring.tar.bz2#5bb52cf5db4ae8497c4e03cd8a70e49867e6b93d9f29ad335d030fcd3a375769" "pypy" verify_py27 ensurepip fi ;; "linux-ppc64" ) require_distro "Fedora 20" || true install_package "pypy-5.0.0-ppc64" "https://downloads.python.org/pypy/pypy-5.0.0-ppc64.tar.bz2#334a37e68cb543cf2cbcdd12379b9b770064bb70ba7fd104f1e451cfa10cdda5" "pypy" verify_py27 ensurepip ;; "linux-ppc64le" ) require_distro "Fedora 21" || true install_package "pypy-5.0.0-ppc64le" "https://downloads.python.org/pypy/pypy-5.0.0-ppc64le.tar.bz2#e72fe5c094186f79c997000ddbaa01616def652a8d1338b75a27dfa3755eb86c" "pypy" verify_py27 ensurepip ;; "linux64" ) if require_distro "Ubuntu 12.04" "Ubuntu 12.10" "Ubuntu 13.04" "Ubuntu 13.10" "Ubuntu 14.04" 1>/dev/null 2>&1; then install_package "pypy-5.0.0-linux64" "https://downloads.python.org/pypy/pypy-5.0.0-linux64.tar.bz2#b9c73be8e3c3b0835df83bdb86335712005240071cdd4dc245ac30b457063ae0" "pypy" verify_py27 ensurepip else install_package "pypy-5.0-linux_x86_64-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy-5.0-linux_x86_64-portable.tar.bz2#57c9ea251bf1e7074e14aeecdd1ac8bb2fc53dbf3f90a9613d03e33076a7fa08" "pypy" verify_py27 ensurepip fi ;; "osx64" ) install_package "pypy-5.0.0-osx64" "https://downloads.python.org/pypy/pypy-5.0.0-osx64.tar.bz2#45ed8bf799d0fd8eb051cbcc427173fba74dc9c2f6c309d7a3cc90f4917e6a10" "pypy" verify_py27 ensurepip ;; "win32" ) # FIXME: never tested on Windows install_zip "pypy-5.0.0-win32" "https://downloads.python.org/pypy/pypy-5.0.0-win32.zip#c53f0946703f5e4885484c7cde2554a0320537135bf8965e054757c214412438" "pypy" verify_py27 ensurepip ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." echo "try 'pypy-5.0.0-src' to build from source." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy-5.0.0-src000066400000000000000000000006361517431316200262700ustar00rootroot00000000000000prefer_openssl11 install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl install_package "pypy-5.0.0-src" "https://downloads.python.org/pypy/pypy-5.0.0-src.tar.bz2#89027b1b33553b53ff7733dc4838f0a76af23552c0d915d9f6de5875b8d7d4ab" "pypy_builder" verify_py27 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy-5.0.1000066400000000000000000000053561517431316200255100ustar00rootroot00000000000000case "$(pypy_architecture 2>/dev/null || true)" in "linux" ) if require_distro "Ubuntu 10.04" 1>/dev/null 2>&1; then install_package "pypy-5.0.1-linux" "https://downloads.python.org/pypy/pypy-5.0.1-linux.tar.bz2#4b9a294033f917a1674c9ddcb2e7e8d32c4f4351f8216fd1fe23f6d2ad2b1a36" "pypy" verify_py27 ensurepip else install_package "pypy-5.0.1-linux_i686-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy-5.0.1-linux_i686-portable.tar.bz2#96f1b487655c914a03f56747dfff9c20350175cae01e2911f19b1016442ed6b5" "pypy" verify_py27 ensurepip fi ;; "linux-armel" ) require_distro "Ubuntu 12.04" || true install_package "pypy-5.0.1-linux-armel" "https://downloads.python.org/pypy/pypy-5.0.1-linux-armel.tar.bz2#17d55804b2253acd9de42276d756d4a08b7d1d2da09ef81dd325e14b18a1bcda" "pypy" verify_py27 ensurepip ;; "linux-armhf" ) if [[ "$(cat /etc/issue 2>/dev/null || true)" == "Raspbian"* ]]; then install_package "pypy-5.0.1-linux-armhf-raspbian" "https://downloads.python.org/pypy/pypy-5.0.1-linux-armhf-raspbian.tar.bz2#338d1c32c1326e6321b222ae357711b38c4a0ffddf020c2a35536b5f69376e28" "pypy" verify_py27 ensurepip else require_distro "Ubuntu 13.04" || true install_package "pypy-5.0.1-linux-armhf-raring" "https://downloads.python.org/pypy/pypy-5.0.1-linux-armhf-raring.tar.bz2#1e9146978cc7e7bd30683a518f304a824db7b9b1c6fae5e866eb703684ba3c98" "pypy" verify_py27 ensurepip fi ;; "linux64" ) if require_distro "Ubuntu 12.04" "Ubuntu 12.10" "Ubuntu 13.04" "Ubuntu 13.10" "Ubuntu 14.04" 1>/dev/null 2>&1; then install_package "pypy-5.0.1-linux64" "https://downloads.python.org/pypy/pypy-5.0.1-linux64.tar.bz2#1b1363a48edd1c1b31ca5e995987eda3d460a3404f36c3bb2dd9f52c93eecff5" "pypy" verify_py27 ensurepip else install_package "pypy-5.0.1-linux_x86_64-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy-5.0.1-linux_x86_64-portable.tar.bz2#14d65f84fe8228cfa2b8e924364cf4c71e2bc6b13649098fa340baf044606436" "pypy" verify_py27 ensurepip fi ;; "osx64" ) install_package "pypy-5.0.1-osx64" "https://downloads.python.org/pypy/pypy-5.0.1-osx64.tar.bz2#6ebdb9d91203f053b38e3c21841c11a72f416dc185f7b3b7c908229df15e924a" "pypy" verify_py27 ensurepip ;; "win32" ) # FIXME: never tested on Windows install_zip "pypy-5.0.1-win32" "https://downloads.python.org/pypy/pypy-5.0.1-win32.zip#c12254d8b1747322736d26e014744a426c6900d232c1799140fbb43f44319730" "pypy" verify_py27 ensurepip ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." echo "try 'pypy-5.0.1-src' to build from source." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy-5.0.1-src000066400000000000000000000006361517431316200262710ustar00rootroot00000000000000prefer_openssl11 install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl install_package "pypy-5.0.1-src" "https://downloads.python.org/pypy/pypy-5.0.1-src.tar.bz2#1573c9284d3ec236c8e6ef3b954753932dff29462c54b5885b761d1ee68b6e05" "pypy_builder" verify_py27 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy-5.1000066400000000000000000000064341517431316200253500ustar00rootroot00000000000000case "$(pypy_architecture 2>/dev/null || true)" in "linux" ) if require_distro "Ubuntu 12.04" "Ubuntu 12.10" "Ubuntu 13.04" "Ubuntu 13.10" "Ubuntu 14.04" 1>/dev/null 2>&1; then install_package "pypy-5.1.0-linux" "https://downloads.python.org/pypy/pypy-5.1.0-linux.tar.bz2#2f6c521b5b3c1082eab58be78655aa01ec400d19baeec93c455864a7483b8744" "pypy" verify_py27 ensurepip else install_package "pypy-5.1-linux_i686-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy-5.1-linux_i686-portable.tar.bz2#893507603a58b8983b69924e60591de39b8f71f70ba36d6e3894db8f7c49c3ea" "pypy" verify_py27 ensurepip fi ;; "linux-armel" ) require_distro "Ubuntu 12.04" || true install_package "pypy-5.1.0-linux-armel" "https://downloads.python.org/pypy/pypy-5.1.0-linux-armel.tar.bz2#ea7017449ff0630431866423220c3688fc55c1a0b80a96af0ae138dd0751b81c" "pypy" verify_py27 ensurepip ;; "linux-armhf" ) if [[ "$(cat /etc/issue 2>/dev/null || true)" == "Raspbian"* ]]; then install_package "pypy-5.1.0-linux-armhf-raspbian" "https://downloads.python.org/pypy/pypy-5.1.0-linux-armhf-raspbian.tar.bz2#3bfcd251b4f3fd1a09520b2741c647c364d16d50c82b813732a78ac60ccb2b69" "pypy" verify_py27 ensurepip else require_distro "Ubuntu 13.04" || true install_package "pypy-5.1.0-linux-armhf-raring" "https://downloads.python.org/pypy/pypy-5.1.0-linux-armhf-raring.tar.bz2#a3e13083591bccc301fb974ff0a6c7e4ab4e611e4b31c0932898b981c794462b" "pypy" verify_py27 ensurepip fi ;; "linux-ppc64" ) require_distro "Fedora 20" || true install_package "pypy-5.1.0-ppc64" "https://downloads.python.org/pypy/pypy-5.1.0-ppc64.tar.bz2#32a31b9ff5174d69f8cf8db711ba2a593fed49b52bdf590bcecd6b727419b6df" "pypy" verify_py27 ensurepip ;; "linux-ppc64le" ) require_distro "Fedora 21" || true install_package "pypy-5.1.0-ppc64le" "https://downloads.python.org/pypy/pypy-5.1.0-ppc64le.tar.bz2#303764f44154f81d7f0753258c89f8a14653658911a16ec2bcfee04055cbfab6" "pypy" verify_py27 ensurepip ;; "linux64" ) if require_distro "Ubuntu 12.04" "Ubuntu 12.10" "Ubuntu 13.04" "Ubuntu 13.10" "Ubuntu 14.04" 1>/dev/null 2>&1; then install_package "pypy-5.1.0-linux64" "https://downloads.python.org/pypy/pypy-5.1.0-linux64.tar.bz2#0e8913351d043a50740b98cb89d99852b8bd6d11225a41c8abfc0baf7084cbf6" "pypy" verify_py27 ensurepip else install_package "pypy-5.1-linux_x86_64-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy-5.1-linux_x86_64-portable.tar.bz2#b2df9b0127457d1c3cc0dc9b8f027a53569ccd3ba5a79012d641e576d9cc003a" "pypy" verify_py27 ensurepip fi ;; "osx64" ) install_package "pypy-5.1.0-osx64" "https://downloads.python.org/pypy/pypy-5.1.0-osx64.tar.bz2#7e270c66347158dd794c101c4817f742f760ed805aa0d10abe19ba4a78a75118" "pypy" verify_py27 ensurepip ;; "win32" ) # FIXME: never tested on Windows install_zip "pypy-5.1.0-win32" "https://downloads.python.org/pypy/pypy-5.1.0-win32.zip#044e7f35223a443412b5948740e60e93069a6f8b0a72053cc9d472874bb1b6cc" "pypy" verify_py27 ensurepip ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." echo "try 'pypy-5.1.0-src' to build from source." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy-5.1-src000066400000000000000000000006361517431316200261330ustar00rootroot00000000000000prefer_openssl11 install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl install_package "pypy-5.1.0-src" "https://downloads.python.org/pypy/pypy-5.1.0-src.tar.bz2#16bab9501e942c0704abbf9cd6c4e950c6a76dc226cf1e447ea084916aef4714" "pypy_builder" verify_py27 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy-5.1.1000066400000000000000000000054521517431316200255060ustar00rootroot00000000000000case "$(pypy_architecture 2>/dev/null || true)" in "linux" ) if require_distro "Ubuntu 12.04" "Ubuntu 12.10" "Ubuntu 13.04" "Ubuntu 13.10" "Ubuntu 14.04" 1>/dev/null 2>&1; then install_package "pypy-5.1.1-linux" "https://downloads.python.org/pypy/pypy-5.1.1-linux.tar.bz2#7951fd2b87c9e621ec57c932c20da2b8a4a9e87d8daeb9e2b7373f9444219abc" "pypy" verify_py27 ensurepip else install_package "pypy-5.1.1-linux_i686-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy-5.1.1-linux_i686-portable.tar.bz2#f00faf426f41f9980344d03fd74bb949875c0cf86048ad762dd445f72353eb8f" "pypy" verify_py27 ensurepip fi ;; "linux-armel" ) require_distro "Ubuntu 12.04" || true install_package "pypy-5.1.1-linux-armel" "https://downloads.python.org/pypy/pypy-5.1.1-linux-armel.tar.bz2#062b33641c24dfc8c6b5af955c2ddf3815b471de0af4bfc343020651b94d13bf" "pypy" verify_py27 ensurepip ;; "linux-armhf" ) if [[ "$(cat /etc/issue 2>/dev/null || true)" == "Raspbian"* ]]; then install_package "pypy-5.1.1-linux-armhf-raspbian" "https://downloads.python.org/pypy/pypy-5.1.1-linux-armhf-raspbian.tar.bz2#fc2a1f8719a7eca5d85d0bdcf499c6ab7409fc32aa312435bcbe66950b47e863" "pypy" verify_py27 ensurepip else require_distro "Ubuntu 13.04" || true install_package "pypy-5.1.1-linux-armhf-raring" "https://downloads.python.org/pypy/pypy-5.1.1-linux-armhf-raring.tar.bz2#c4bcdabccd15669ea44d1c715cd36b2ca55b340a27b63e1a92ef5ab6eb158a8d" "pypy" verify_py27 ensurepip fi ;; "linux64" ) if require_distro "Ubuntu 12.04" "Ubuntu 12.10" "Ubuntu 13.04" "Ubuntu 13.10" "Ubuntu 14.04" 1>/dev/null 2>&1; then install_package "pypy-5.1.1-linux64" "https://downloads.python.org/pypy/pypy-5.1.1-linux64.tar.bz2#c852622e8bc81618c137da35fcf57b2349b956c07b6fd853300846e3cefa64fc" "pypy" verify_py27 ensurepip else install_package "pypy-5.1.1-linux_x86_64-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy-5.1.1-linux_x86_64-portable.tar.bz2#c0502d8db1cc2b81513cc6047813669b0a561cb20e41d60e179f51fe8657a794" "pypy" verify_py27 ensurepip fi ;; "osx64" ) install_package "pypy-5.1.1-osx64" "https://downloads.python.org/pypy/pypy-5.1.1-osx64.tar.bz2#fe2bbb7cf95eb91b1724029f81e85d1dbb6025a2e9a005cfe7258fe07602f771" "pypy" verify_py27 ensurepip ;; "win32" ) # FIXME: never tested on Windows install_zip "pypy-5.1.1-win32" "https://downloads.python.org/pypy/pypy-5.1.1-win32.zip#22a780e328ef053e098f2edc2302957ac3119adf7bf11ff23e225931806e7bcd" "pypy" verify_py27 ensurepip ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." echo "try 'pypy-5.1.1-src' to build from source." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy-5.1.1-src000066400000000000000000000006361517431316200262720ustar00rootroot00000000000000prefer_openssl11 install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl install_package "pypy-5.1.1-src" "https://downloads.python.org/pypy/pypy-5.1.1-src.tar.bz2#ca3d943d7fbd78bb957ee9e5833ada4bb8506ac99a41b7628790e286a65ed2be" "pypy_builder" verify_py27 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy-5.3000066400000000000000000000000451517431316200253420ustar00rootroot00000000000000source "${BASH_SOURCE%/*}/pypy2-5.3" pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy-5.3-src000066400000000000000000000000511517431316200261240ustar00rootroot00000000000000source "${BASH_SOURCE%/*}/pypy2-5.3-src" pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy-5.3.1000066400000000000000000000000471517431316200255030ustar00rootroot00000000000000source "${BASH_SOURCE%/*}/pypy2-5.3.1" pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy-5.3.1-src000066400000000000000000000000531517431316200262650ustar00rootroot00000000000000source "${BASH_SOURCE%/*}/pypy2-5.3.1-src" pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy-5.4000066400000000000000000000000451517431316200253430ustar00rootroot00000000000000source "${BASH_SOURCE%/*}/pypy2-5.4" pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy-5.4-src000066400000000000000000000000511517431316200261250ustar00rootroot00000000000000source "${BASH_SOURCE%/*}/pypy2-5.4-src" pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy-5.4.1000066400000000000000000000000471517431316200255040ustar00rootroot00000000000000source "${BASH_SOURCE%/*}/pypy2-5.4.1" pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy-5.4.1-src000066400000000000000000000000531517431316200262660ustar00rootroot00000000000000source "${BASH_SOURCE%/*}/pypy2-5.4.1-src" pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy-5.6.0000066400000000000000000000000471517431316200255050ustar00rootroot00000000000000source "${BASH_SOURCE%/*}/pypy2-5.6.0" pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy-5.6.0-src000066400000000000000000000000531517431316200262670ustar00rootroot00000000000000source "${BASH_SOURCE%/*}/pypy2-5.6.0-src" pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy-5.7.0000066400000000000000000000000471517431316200255060ustar00rootroot00000000000000source "${BASH_SOURCE%/*}/pypy2-5.7.0" pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy-5.7.0-src000066400000000000000000000000531517431316200262700ustar00rootroot00000000000000source "${BASH_SOURCE%/*}/pypy2-5.7.0-src" pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy-5.7.1000066400000000000000000000000471517431316200255070ustar00rootroot00000000000000source "${BASH_SOURCE%/*}/pypy2-5.7.1" pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy-5.7.1-src000066400000000000000000000000531517431316200262710ustar00rootroot00000000000000source "${BASH_SOURCE%/*}/pypy2-5.7.2-src" pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy-c-jit-latest000066400000000000000000000032211517431316200273340ustar00rootroot00000000000000case "$(pypy_architecture 2>/dev/null || true)" in "linux" ) install_nightly_package "pypy-c-jit-latest-linux" "http://buildbot.pypy.org/nightly/trunk/pypy-c-jit-latest-linux.tar.bz2" "pypy-c-jit-*-linux" "pypy" verify_py27 ensurepip ;; "linux-armel" ) install_nightly_package "pypy-c-jit-latest-linux-armel" "http://buildbot.pypy.org/nightly/trunk/pypy-c-jit-latest-linux-armel.tar.bz2" "pypy-c-jit-*-linux-armel" "pypy" verify_py27 ensurepip ;; "linux-armhf" ) if [[ "$(cat /etc/issue 2>/dev/null || true)" == "Raspbian"* ]]; then install_nightly_package "pypy-c-jit-latest-linux-armhf-raspbian" "http://buildbot.pypy.org/nightly/trunk/pypy-c-jit-latest-linux-armhf-raspbian.tar.bz2" "pypy-c-jit-*-linux-armhf-raspbian" "pypy" verify_py27 ensurepip else { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." echo } >&2 exit 1 fi ;; "linux64" ) install_nightly_package "pypy-c-jit-latest-linux64" "http://buildbot.pypy.org/nightly/trunk/pypy-c-jit-latest-linux64.tar.bz2" "pypy-c-jit-*-linux64" "pypy" verify_py27 ensurepip ;; "osx64" ) install_nightly_package "pypy-c-jit-latest-osx64" "http://buildbot.pypy.org/nightly/trunk/pypy-c-jit-latest-osx64.tar.bz2" "pypy-c-jit-*-osx64" "pypy" verify_py27 ensurepip ;; "win32" ) install_zip "pypy-c-jit-latest-win32" "http://buildbot.pypy.org/nightly/trunk/pypy-c-jit-latest-win32.zip" "pypy" verify_py27 ensurepip ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy-dev000066400000000000000000000005071517431316200256160ustar00rootroot00000000000000prefer_openssl11 install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl install_hg "pypy-dev" "https://foss.heptapod.net/pypy/pypy" "default" "pypy_builder" verify_py27 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy-stm-2.3000066400000000000000000000010501517431316200261350ustar00rootroot00000000000000case "$(pypy_architecture 2>/dev/null || true)" in "linux64" ) require_distro "Ubuntu 12.04" "Ubuntu 12.10" "Ubuntu 13.04" "Ubuntu 13.10" "Ubuntu 14.04" || true install_package "pypy-stm-2.3-linux64" "https://downloads.python.org/pypy/pypy-stm-2.3-linux64.tar.bz2#2a489280c679503442219782a87a2d16504a1467cac85ad4be1361a21d1f4d54" "pypy" verify_py27 ensurepip ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy-STM is not available for $(pypy_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy-stm-2.5.1000066400000000000000000000010541517431316200263020ustar00rootroot00000000000000case "$(pypy_architecture 2>/dev/null || true)" in "linux64" ) require_distro "Ubuntu 12.04" "Ubuntu 12.10" "Ubuntu 13.04" "Ubuntu 13.10" "Ubuntu 14.04" || true install_package "pypy-stm-2.5.1-linux64" "https://downloads.python.org/pypy/pypy-stm-2.5.1-linux64.tar.bz2#f280788002f2acf8690b8f9c479bb5b6f0e699ebb42f8bf203da3f70f1a38134" "pypy" verify_py27 ensurepip ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy-STM is not available for $(pypy_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy2-5.3000066400000000000000000000053101517431316200254240ustar00rootroot00000000000000case "$(pypy_architecture 2>/dev/null || true)" in "linux" ) if require_distro "Ubuntu 12.04" "Ubuntu 12.10" "Ubuntu 13.04" "Ubuntu 13.10" "Ubuntu 14.04" 1>/dev/null 2>&1; then install_package "pypy2-v5.3.0-linux" "https://downloads.python.org/pypy/pypy2-v5.3.0-linux32.tar.bz2#bd422fe9d0b7d525d1da3f32855b047bc39ba397d0cf708d8f4f96fe874424f2" "pypy" verify_py27 ensurepip else { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." echo "try 'pypy2-5.3-src' to build from source." echo } >&2 exit 1 fi ;; "linux-armel" ) require_distro "Ubuntu 12.04" || true install_package "pypy2-v5.3.0-linux-armel" "https://downloads.python.org/pypy/pypy2-v5.3.0-linux-armel.tar.bz2#81b6f589a947d7353bb69408c46d4833d6e9cb501f3c3f0c73bd28d0e3df69aa" "pypy" verify_py27 ensurepip ;; "linux-armhf" ) if [[ "$(cat /etc/issue 2>/dev/null || true)" == "Raspbian"* ]]; then install_package "pypy2-v5.3.0-linux-armhf-raspbian" "https://downloads.python.org/pypy/pypy2-v5.3.0-linux-armhf-raspbian.tar.bz2#87b3566b6bbb8bf31c2f0d72bf31d95142fdce004d987812336a59d788005bed" "pypy" verify_py27 ensurepip else require_distro "Ubuntu 13.04" || true install_package "pypy2-v5.3.0-linux-armhf-raring" "https://downloads.python.org/pypy/pypy2-v5.3.0-linux-armhf-raring.tar.bz2#bdb911a87e773a292334061b9c33b907f46d987e403fe94cc627a3b9b1c9cb19" "pypy" verify_py27 ensurepip fi ;; "linux64" ) if require_distro "Ubuntu 12.04" "Ubuntu 12.10" "Ubuntu 13.04" "Ubuntu 13.10" "Ubuntu 14.04" 1>/dev/null 2>&1; then install_package "pypy2-v5.3.0-linux64" "https://downloads.python.org/pypy/pypy2-v5.3.0-linux64.tar.bz2#ac336e8877ed676bf87a9a546d5926b6afc4679fa2d3fdf9f3ca56f28ec40588" "pypy" verify_py27 ensurepip else { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." echo "try 'pypy2-5.3-src' to build from source." echo } >&2 exit 1 fi ;; "osx64" ) install_package "pypy2-v5.3.0-osx64" "https://downloads.python.org/pypy/pypy2-v5.3.0-osx64.tar.bz2#1b103bacbdcdbbc490660ec0c7b3d99d1ff1cfc2f13cd403db21c27f03d36a1d" "pypy" verify_py27 ensurepip ;; "win32" ) # FIXME: never tested on Windows install_zip "pypy2-v5.3.0-win32" "https://downloads.python.org/pypy/pypy2-v5.3.0-win32.zip#32a9e5286fc344165f63b529a9f84e521e9368e717c583488115654676428a20" "pypy" verify_py27 ensurepip ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." echo "try 'pypy-5.3-src' to build from source." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy2-5.3-src000066400000000000000000000006421517431316200262140ustar00rootroot00000000000000prefer_openssl11 install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl install_package "pypy2-v5.3.0-src" "https://downloads.python.org/pypy/pypy2-v5.3.0-src.tar.bz2#4142eb8f403810bc88a4911792bb5a502e152df95806e33e69050c828cd160d5" "pypy_builder" verify_py27 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy2-5.3.1000066400000000000000000000055111517431316200255660ustar00rootroot00000000000000case "$(pypy_architecture 2>/dev/null || true)" in "linux" ) if require_distro "Ubuntu 12.04" "Ubuntu 12.10" "Ubuntu 13.04" "Ubuntu 13.10" "Ubuntu 14.04" 1>/dev/null 2>&1; then install_package "pypy2-v5.3.1-linux" "https://downloads.python.org/pypy/pypy2-v5.3.1-linux32.tar.bz2#da69f4280b288e524387103eaa3eb4d036965724c3e546da27135c15a77bd2eb" "pypy" verify_py27 ensurepip else install_package "pypy-5.3.1-linux_i686-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy-5.3.1-linux_i686-portable.tar.bz2#4460dad6376406c221406676208abae989c126115b0f0b2e46c8b8a027bf978a" "pypy" verify_py27 ensurepip fi ;; "linux-armel" ) require_distro "Ubuntu 12.04" || true install_package "pypy2-v5.3.1-linux-armel" "https://downloads.python.org/pypy/pypy2-v5.3.1-linux-armel.tar.bz2#0425f2022c35ef7f0bb3d2b854c5bcbe500b1aba511a0d83581ba6c784913961" "pypy" verify_py27 ensurepip ;; "linux-armhf" ) if [[ "$(cat /etc/issue 2>/dev/null || true)" == "Raspbian"* ]]; then install_package "pypy2-v5.3.1-linux-armhf-raspbian" "https://downloads.python.org/pypy/pypy2-v5.3.1-linux-armhf-raspbian.tar.bz2#5c93eb3c54fbb2c7d7332f775a096671512e590565e6051196bbc5039c5033b5" "pypy" verify_py27 ensurepip else require_distro "Ubuntu 13.04" || true install_package "pypy2-v5.3.1-linux-armhf-raring" "https://downloads.python.org/pypy/pypy2-v5.3.1-linux-armhf-raring.tar.bz2#b4859496099bde4b17c1e56cc5749dcdcd25b4c68fde1d2ea426de84130e84cc" "pypy" verify_py27 ensurepip fi ;; "linux64" ) if require_distro "Ubuntu 12.04" "Ubuntu 12.10" "Ubuntu 13.04" "Ubuntu 13.10" "Ubuntu 14.04" 1>/dev/null 2>&1; then install_package "pypy2-v5.3.1-linux64" "https://downloads.python.org/pypy/pypy2-v5.3.1-linux64.tar.bz2#6d0e8b14875b76b1e77f06a2ee3f1fb5015a645a951ba7a7586289344d4d9c22" "pypy" verify_py27 ensurepip else install_package "pypy-5.3.1-linux_x86_64-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy-5.3.1-linux_x86_64-portable.tar.bz2#73014c3840609a62c0984b9c383652097f0a8c52fb74dd9de70d9df2a9a743ff" "pypy" verify_py27 ensurepip fi ;; "osx64" ) install_package "pypy2-v5.3.1-osx64" "https://downloads.python.org/pypy/pypy2-v5.3.1-osx64.tar.bz2#7a242d7373b4f18c7f5fe6c2fe6f15e2a405d9adf1f4f934c89b875e60ac5def" "pypy" verify_py27 ensurepip ;; "win32" ) # FIXME: never tested on Windows install_zip "pypy2-v5.3.1-win32" "https://downloads.python.org/pypy/pypy2-v5.3.1-win32.zip#d83477e2c5f032ebd8c7f47afce03dc8adbeb41a3c74f7db50d9de317dcf3a4a" "pypy" verify_py27 ensurepip ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." echo "try 'pypy2-5.3.1-src' to build from source." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy2-5.3.1-src000066400000000000000000000006421517431316200263530ustar00rootroot00000000000000prefer_openssl11 install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl install_package "pypy2-v5.3.1-src" "https://downloads.python.org/pypy/pypy2-v5.3.1-src.tar.bz2#31a52bab584abf3a0f0defd1bf9a29131dab08df43885e7eeddfc7dc9b71836e" "pypy_builder" verify_py27 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy2-5.4000066400000000000000000000054771517431316200254430ustar00rootroot00000000000000case "$(pypy_architecture 2>/dev/null || true)" in "linux" ) if require_distro "Ubuntu 12.04" "Ubuntu 12.10" "Ubuntu 13.04" "Ubuntu 13.10" "Ubuntu 14.04" 1>/dev/null 2>&1; then install_package "pypy2-v5.4.0-linux" "https://downloads.python.org/pypy/pypy2-v5.4.0-linux32.tar.bz2#ce581270464b14cdecd13dedb9bd7bf98232f767ac4ac282229a405d8e807af1" "pypy" verify_py27 ensurepip else install_package "pypy-5.4-linux_i686-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy-5.4-linux_i686-portable.tar.bz2#7d7d253f009bb2624f43db6b8caeeb73d29177c4166a643a581a231a099c8689" "pypy" verify_py27 ensurepip fi ;; "linux-armel" ) require_distro "Ubuntu 12.04" || true install_package "pypy2-v5.4.0-linux-armel" "https://downloads.python.org/pypy/pypy2-v5.4.0-linux-armel.tar.bz2#04509044f21bb41ee6d3fafcf637fc0c586c248d4cdae6ac3357606a7b660fdb" "pypy" verify_py27 ensurepip ;; "linux-armhf" ) if [[ "$(cat /etc/issue 2>/dev/null || true)" == "Raspbian"* ]]; then install_package "pypy2-v5.4.0-linux-armhf-raspbian" "https://downloads.python.org/pypy/pypy2-v5.4.0-linux-armhf-raspbian.tar.bz2#839b08db89b7e20cb670b8cf02596e033ea0b76fb8336af7bedfbb04b6b502da" "pypy" verify_py27 ensurepip else require_distro "Ubuntu 13.04" || true install_package "pypy2-v5.4.0-linux-armhf-raring" "https://downloads.python.org/pypy/pypy2-v5.4.0-linux-armhf-raring.tar.bz2#95c690bcae6771ebce6cf06c7c2842e0662e007e35162afc963337aa597b471a" "pypy" verify_py27 ensurepip fi ;; "linux64" ) if require_distro "Ubuntu 12.04" "Ubuntu 12.10" "Ubuntu 13.04" "Ubuntu 13.10" "Ubuntu 14.04" 1>/dev/null 2>&1; then install_package "pypy2-v5.4.0-linux64" "https://downloads.python.org/pypy/pypy2-v5.4.0-linux64.tar.bz2#bdfea513d59dcd580970cb6f79f3a250d00191fd46b68133d5327e924ca845f8" "pypy" verify_py27 ensurepip else install_package "pypy-5.4-linux_x86_64-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy-5.4-linux_x86_64-portable.tar.bz2#0a48c7ba7163589b1ade9cfe184f422d1bc9a0f988321b2fdcbd924d90594d9a" "pypy" verify_py27 ensurepip fi ;; "osx64" ) install_package "pypy2-v5.4.0-osx64" "https://downloads.python.org/pypy/pypy2-v5.4.0-osx64.tar.bz2#3adf21c2bf3432759c99123f21240d71a72aba81d73129e48ef912c34631b723" "pypy" verify_py27 ensurepip ;; "win32" ) # FIXME: never tested on Windows install_zip "pypy2-v5.4.0-win32" "https://downloads.python.org/pypy/pypy2-v5.4.0-win32.zip#442c0a917781b6155bf78d2648f1ccd9a36c321926a043f83efcea22a99960b4" "pypy" verify_py27 ensurepip ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." echo "try 'pypy2-5.4-src' to build from source." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy2-5.4-src000066400000000000000000000006421517431316200262150ustar00rootroot00000000000000prefer_openssl11 install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl install_package "pypy2-v5.4.0-src" "https://downloads.python.org/pypy/pypy2-v5.4.0-src.tar.bz2#d9568ebe9a14d0eaefde887d78f3cba63d665e95c0d234bb583932341f55a655" "pypy_builder" verify_py27 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy2-5.4.1000066400000000000000000000055131517431316200255710ustar00rootroot00000000000000case "$(pypy_architecture 2>/dev/null || true)" in "linux" ) if require_distro "Ubuntu 12.04" "Ubuntu 12.10" "Ubuntu 13.04" "Ubuntu 13.10" "Ubuntu 14.04" 1>/dev/null 2>&1; then install_package "pypy2-v5.4.1-linux32" "https://downloads.python.org/pypy/pypy2-v5.4.1-linux32.tar.bz2#6d1e2386ec1e05dffed493aa2d5e6db5cf5de18d7350d44b85f2e45aa5c9a774" "pypy" verify_py27 ensurepip else install_package "pypy-5.4.1-linux_i686-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy-5.4.1-linux_i686-portable.tar.bz2#190e1df78886f0b2bd700f110b7d312d91cafc84886c5de3c5d55c10fe1a5e75" "pypy" verify_py27 ensurepip fi ;; "linux-armel" ) require_distro "Ubuntu 12.04" || true install_package "pypy2-v5.4.1-linux-armel" "https://downloads.python.org/pypy/pypy2-v5.4.1-linux-armel.tar.bz2#a1eb5f672aae62606176305e52a51b060ba974b6181ebefcd2c555ecf5f8614f" "pypy" verify_py27 ensurepip ;; "linux-armhf" ) if [[ "$(cat /etc/issue 2>/dev/null || true)" == "Raspbian"* ]]; then install_package "pypy2-v5.4.1-linux-armhf-raspbian" "https://downloads.python.org/pypy/pypy2-v5.4.1-linux-armhf-raspbian.tar.bz2#b38646519ee1a888c68f8f4713c122867b4b36693c8acabb38eb827a9d2d51f9" "pypy" verify_py27 ensurepip else require_distro "Ubuntu 13.04" || true install_package "pypy2-v5.4.1-linux-armhf-raring" "https://downloads.python.org/pypy/pypy2-v5.4.1-linux-armhf-raring.tar.bz2#2c4befc4517adec874155a8b6fa0b9d18388943d4ffe778002072db7783e417a" "pypy" verify_py27 ensurepip fi ;; "linux64" ) if require_distro "Ubuntu 12.04" "Ubuntu 12.10" "Ubuntu 13.04" "Ubuntu 13.10" "Ubuntu 14.04" 1>/dev/null 2>&1; then install_package "pypy2-v5.4.1-linux64" "https://downloads.python.org/pypy/pypy2-v5.4.1-linux64.tar.bz2#9c85319778224d7fb0c348f55fe3fada15bb579c5f3870a13ad63b42a737dd72" "pypy" verify_py27 ensurepip else install_package "pypy-5.4.1-linux_x86_64-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy-5.4.1-linux_x86_64-portable.tar.bz2#0b59f8e69c7883d454fce6364ab01a5ec6a481ed7f0cc0f1612c3b0c253f7da4" "pypy" verify_py27 ensurepip fi ;; "osx64" ) install_package "pypy2-v5.4.1-osx64" "https://downloads.python.org/pypy/pypy2-v5.4.1-osx64.tar.bz2#ae9329c8f0a6df431c6224c27c634f998688ac803e8d100cee9a774e6bba38b5" "pypy" verify_py27 ensurepip ;; "win32" ) # FIXME: never tested on Windows install_zip "pypy2-v5.4.1-win32" "https://downloads.python.org/pypy/pypy2-v5.4.1-win32.zip#ec729218a820bc2aa2cf1fcacf9de0fee9e04144fe138596198a6b4615505e03" "pypy" verify_py27 ensurepip ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." echo "try 'pypy2-5.4.1-src' to build from source." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy2-5.4.1-src000066400000000000000000000006421517431316200263540ustar00rootroot00000000000000prefer_openssl11 install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl install_package "pypy2-v5.4.1-src" "https://downloads.python.org/pypy/pypy2-v5.4.1-src.tar.bz2#45dbc50c81498f6f1067201b8fc887074b43b84ee32cc47f15e7db17571e9352" "pypy_builder" verify_py27 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy2-5.6.0000066400000000000000000000055031517431316200255710ustar00rootroot00000000000000case "$(pypy_architecture 2>/dev/null || true)" in "linux" ) if require_distro "Ubuntu 12.04" "Ubuntu 12.10" "Ubuntu 13.04" "Ubuntu 13.10" "Ubuntu 14.04" 1>/dev/null 2>&1; then install_package "pypy2-v5.6.0-linux32" "https://downloads.python.org/pypy/pypy2-v5.6.0-linux32.tar.bz2#5d4ad43aed5c5e147f7e7c84766c729f34f63b714b6d224e912a2bb42dc95d62" "pypy" verify_py27 ensurepip else install_package "pypy-5.6-linux_i686-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy-5.6-linux_i686-portable.tar.bz2#1f220e05ddd4423882794f0e9d3e2dfdecee259d00f1151a52dd244607313399" "pypy" verify_py27 ensurepip fi ;; "linux-armel" ) require_distro "Ubuntu 12.04" || true install_package "pypy2-v5.6.0-linux-armel" "https://downloads.python.org/pypy/pypy2-v5.6.0-linux-armel.tar.bz2#2d1c7820f6368c92bb43a153d2c995f70aa183ff8f1df6916b0d2e57838d8a30" "pypy" verify_py27 ensurepip ;; "linux-armhf" ) if [[ "$(cat /etc/issue 2>/dev/null || true)" == "Raspbian"* ]]; then install_package "pypy2-v5.6.0-linux-armhf-raspbian" "https://downloads.python.org/pypy/pypy2-v5.6.0-linux-armhf-raspbian.tar.bz2#0f69c40a38d72254bf12094620bda9d2face758f763cd0d989588642d81eccae" "pypy" verify_py27 ensurepip else require_distro "Ubuntu 13.04" || true install_package "pypy2-v5.6.0-linux-armhf-raring" "https://downloads.python.org/pypy/pypy2-v5.6.0-linux-armhf-raring.tar.bz2#2c430240cecb562102c677598f106aa57899f00cd37f719989e18ed9ca44bd01" "pypy" verify_py27 ensurepip fi ;; "linux64" ) if require_distro "Ubuntu 12.04" "Ubuntu 12.10" "Ubuntu 13.04" "Ubuntu 13.10" "Ubuntu 14.04" 1>/dev/null 2>&1; then install_package "pypy2-v5.6.0-linux64" "https://downloads.python.org/pypy/pypy2-v5.6.0-linux64.tar.bz2#aad55328cb0673a60b2633dcc3c36cf452917ac906b577eb3aed5876a7666fca" "pypy" verify_py27 ensurepip else install_package "pypy-5.6-linux_x86_64-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy-5.6-linux_x86_64-portable.tar.bz2#9bd220bc54000e142bd4929435959305efeef8c832fbe3c907211cc5214095ce" "pypy" verify_py27 ensurepip fi ;; "osx64" ) install_package "pypy2-v5.6.0-osx64" "https://downloads.python.org/pypy/pypy2-v5.6.0-osx64.tar.bz2#6121f791f440564d3a0a41315e9f2d2d61bc484654acffd85d9e1c6e92b85c36" "pypy" verify_py27 ensurepip ;; "win32" ) # FIXME: never tested on Windows install_zip "pypy2-v5.6.0-win32" "https://downloads.python.org/pypy/pypy2-v5.6.0-win32.zip#bab4fa37ef2d32660e291393d955a4e951d5e883abea8bee83be1ec044ddcaac" "pypy" verify_py27 ensurepip ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." echo "try 'pypy2-5.6.0-src' to build from source." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy2-5.6.0-src000066400000000000000000000006421517431316200263550ustar00rootroot00000000000000prefer_openssl11 install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl install_package "pypy2-v5.6.0-src" "https://downloads.python.org/pypy/pypy2-v5.6.0-src.tar.bz2#7411448045f77eb9e087afdce66fe7eafda1876c9e17aad88cf891f762b608b0" "pypy_builder" verify_py27 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy2-5.7.0000066400000000000000000000050321517431316200255670ustar00rootroot00000000000000case "$(pypy_architecture 2>/dev/null || true)" in "linux" ) if require_distro "Ubuntu 12.04" "Ubuntu 12.10" "Ubuntu 13.04" "Ubuntu 13.10" "Ubuntu 14.04" 1>/dev/null 2>&1; then install_package "pypy2-v5.7.0-linux32" "https://downloads.python.org/pypy/pypy2-v5.7.0-linux32.tar.bz2#aaa55085d11a49cb982b059b4159495d7a4fb9afcfda7bfd680cc0175e9fa33b" "pypy" verify_py27 ensurepip fi ;; "linux-armel" ) require_distro "Ubuntu 12.04" || true install_package "pypy2-v5.7.0-linux-armel" "https://downloads.python.org/pypy/pypy2-v5.7.0-linux-armel.tar.bz2#3bc0d2616cacef9f544e739d4c25a89e16d7aa8c1ccb18c32dceeb021ed73711" "pypy" verify_py27 ensurepip ;; "linux-armhf" ) if [[ "$(cat /etc/issue 2>/dev/null || true)" == "Raspbian"* ]]; then install_package "pypy2-v5.7.0-linux-armhf-raspbian" "https://downloads.python.org/pypy/pypy2-v5.7.0-linux-armhf-raspbian.tar.bz2#6328e4767cf20d20a290739db2d1ec769f3c9c360fa9824f61581b3356add79b" "pypy" verify_py27 ensurepip else require_distro "Ubuntu 13.04" || true install_package "pypy2-v5.7.0-linux-armhf-raring" "https://downloads.python.org/pypy/pypy2-v5.7.0-linux-armhf-raring.tar.bz2#413df8097c87a8e79cc46df65837b1d533de83b7cb06ce88b168697807fff696" "pypy" verify_py27 ensurepip fi ;; "linux64" ) if require_distro "Ubuntu 12.04" "Ubuntu 12.10" "Ubuntu 13.04" "Ubuntu 13.10" "Ubuntu 14.04" 1>/dev/null 2>&1; then install_package "pypy2-v5.7.0-linux64" "https://downloads.python.org/pypy/pypy2-v5.7.0-linux64.tar.bz2#64bed80e299b09c13296f577a0f52c5d4be9f7c699a390ca6026f967aeff3846" "pypy" verify_py27 ensurepip else install_package "pypy-5.7-linux_x86_64-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy-5.7-linux_x86_64-portable.tar.bz2#209d2224fe461d85afb201a0c8da18df21219687defadd4550b60420a120bacb" "pypy" verify_py27 ensurepip fi ;; "osx64" ) install_package "pypy2-v5.7.0-osx64" "https://downloads.python.org/pypy/pypy2-v5.7.0-osx64.tar.bz2#9204aa1b55771a374a3118bb43e498c88caca8c33710eecf3249855c4dd1352a" "pypy" verify_py27 ensurepip ;; "win32" ) # FIXME: never tested on Windows install_zip "pypy2-v5.7.0-win32" "https://downloads.python.org/pypy/pypy2-v5.7.0-win32.zip#09c8da3a7e09cea821f9b300c6f4f52f4a571d949d91839ecbce93b84a08d570" "pypy" verify_py27 ensurepip ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." echo "try 'pypy2-5.7.0-src' to build from source." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy2-5.7.0-src000066400000000000000000000006421517431316200263560ustar00rootroot00000000000000prefer_openssl11 install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl install_package "pypy2-v5.7.0-src" "https://downloads.python.org/pypy/pypy2-v5.7.0-src.tar.bz2#e522ea7ca51b16ee5505f22b86803664b762a263a6d69ba84c359fcf8365ad3e" "pypy_builder" verify_py27 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy2-5.7.1000066400000000000000000000050361517431316200255740ustar00rootroot00000000000000case "$(pypy_architecture 2>/dev/null || true)" in "linux" ) if require_distro "Ubuntu 12.04" "Ubuntu 12.10" "Ubuntu 13.04" "Ubuntu 13.10" "Ubuntu 14.04" 1>/dev/null 2>&1; then install_package "pypy2-v5.7.1-linux32" "https://downloads.python.org/pypy/pypy2-v5.7.1-linux32.tar.bz2#f125a227f8c814ba1698168a639ea6ca59bb69c280529639eed29076d8429a73" "pypy" verify_py27 ensurepip fi ;; "linux-armel" ) require_distro "Ubuntu 12.04" || true install_package "pypy2-v5.7.1-linux-armel" "https://downloads.python.org/pypy/pypy2-v5.7.1-linux-armel.tar.bz2#591a4a73cc945a1125848f3615a28559692db8febf677d7087eaef40cb119a8d" "pypy" verify_py27 ensurepip ;; "linux-armhf" ) if [[ "$(cat /etc/issue 2>/dev/null || true)" == "Raspbian"* ]]; then install_package "pypy2-v5.7.1-linux-armhf-raspbian" "https://downloads.python.org/pypy/pypy2-v5.7.1-linux-armhf-raspbian.tar.bz2#67544f8c4b284db71cf1af74edef290722f97f82476cbdaff2015fdab244c6ee" "pypy" verify_py27 ensurepip else require_distro "Ubuntu 13.04" || true install_package "pypy2-v5.7.1-linux-armhf-raring" "https://downloads.python.org/pypy/pypy2-v5.7.1-linux-armhf-raring.tar.bz2#c1b1a0968b22c58672f7492dc7900bc85e3bd02c791f219f31401a00ef387207" "pypy" verify_py27 ensurepip fi ;; "linux64" ) if require_distro "Ubuntu 12.04" "Ubuntu 12.10" "Ubuntu 13.04" "Ubuntu 13.10" "Ubuntu 14.04" 1>/dev/null 2>&1; then install_package "pypy2-v5.7.1-linux64" "https://downloads.python.org/pypy/pypy2-v5.7.1-linux64.tar.bz2#c4fa3da42156bed4a9d912433b618a141e0c5161d7cc8c328786736ea5d1c2da" "pypy" verify_py27 ensurepip else install_package "pypy-5.7.1-linux_x86_64-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy-5.7.1-linux_x86_64-portable.tar.bz2#8a6a194963eb58d582413c4bcdef6119f9f9f117a05032d1fb13192d934510c6" "pypy" verify_py27 ensurepip fi ;; "osx64" ) install_package "pypy2-v5.7.1-osx64" "https://downloads.python.org/pypy/pypy2-v5.7.1-osx64.tar.bz2#4e99ba356432861534917a9477ace0ccee617bd631512759a530f8383e153a3d" "pypy" verify_py27 ensurepip ;; "win32" ) # FIXME: never tested on Windows install_zip "pypy2-v5.7.1-win32" "https://downloads.python.org/pypy/pypy2-v5.7.1-win32.zip#a3ba7c946635236836f8536d8767a0f456b3b9a86876cb5c3173a04522bf451b" "pypy" verify_py27 ensurepip ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." echo "try 'pypy2-5.7.0-src' to build from source." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy2-5.7.1-src000066400000000000000000000006421517431316200263570ustar00rootroot00000000000000prefer_openssl11 install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl install_package "pypy2-v5.7.0-src" "https://downloads.python.org/pypy/pypy2-v5.7.0-src.tar.bz2#e522ea7ca51b16ee5505f22b86803664b762a263a6d69ba84c359fcf8365ad3e" "pypy_builder" verify_py27 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy2.7-5.10.0000066400000000000000000000046521517431316200260150ustar00rootroot00000000000000case "$(pypy_architecture 2>/dev/null || true)" in "linux" ) if require_distro "Ubuntu 14.04" 1>/dev/null 2>&1; then install_package "pypy2-v5.10.0-linux32" "https://downloads.python.org/pypy/pypy2-v5.10.0-linux32.tar.bz2#ee1980467ac8cc9fa9d609f7da93c5282503e59a548781248fe1914a7199d540" "pypy" verify_py27 ensurepip fi ;; "linux64" ) if require_distro "Ubuntu 14.04" "Ubuntu 16.04" 1>/dev/null 2>&1; then install_package "pypy2-v5.10.0-linux64" "https://downloads.python.org/pypy/pypy2-v5.10.0-linux64.tar.bz2#da85af9240220179493ad66c857934dc7ea91aef8f168cd293a2d99af8346ee2" "pypy" verify_py27 ensurepip else install_package "pypy-5.10.0-linux_x86_64-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy-5.10.0-linux_x86_64-portable.tar.bz2#c966124497ba8728654ce1161fa4c46b035ff30f289be70960f58292e5897cc8" "pypy" verify_py27 ensurepip fi ;; "linux-armel" ) require_distro "Ubuntu 12.04" || true install_package "pypy2-v5.10.0-linux-armel" "https://downloads.python.org/pypy/pypy2-v5.10.0-linux-armel.tar.bz2#6fdd55dd8f674efd06f76edb60a09a03b9b04a5fbc56741f416a94a0b9d2ff91" "pypy" verify_py27 ensurepip ;; "linux-armhf" ) if [[ "$(cat /etc/issue 2>/dev/null || true)" == "Raspbian"* ]]; then install_package "pypy2-v5.10.0-linux-armhf-raspbian" "https://downloads.python.org/pypy/pypy2-v5.10.0-linux-armhf-raspbian.tar.bz2#5ec3617bb9a07a0a0b2f3c8fbe69912345da4696cdb0a2aca7889b6f1e74435c" "pypy" verify_py27 ensurepip else { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." echo "try 'pypy2.7-5.10.0-src' to build from source." echo } >&2 exit 1 fi ;; "osx64" ) install_package "pypy2-v5.10.0-osx64" "https://downloads.python.org/pypy/pypy2-v5.10.0-osx64.tar.bz2#7e4120f0a83529a6851cbae0ec107dc7085ba8a4aeff4e7bd9da9aadb1ef37a4" "pypy" verify_py27 ensurepip ;; "win32" ) # FIXME: never tested on Windows install_zip "pypy2-v5.10.0-win32" "https://downloads.python.org/pypy/pypy2-v5.10.0-win32.zip#350914f9b70404781674f2f188f84d440d9d25da46ed9733b3f98269a510e033" "pypy" verify_py27 ensurepip ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." echo "try 'pypy2.7-5.10.0-src' to build from source." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy2.7-5.10.0-src000066400000000000000000000006441517431316200265770ustar00rootroot00000000000000prefer_openssl11 install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl install_package "pypy2-v5.10.0-src" "https://downloads.python.org/pypy/pypy2-v5.10.0-src.tar.bz2#1209f2db718e6afda17528baa5138177a14a0938588a7d3e1b7c722c483079a8" "pypy_builder" verify_py27 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy2.7-5.8.0000066400000000000000000000046461517431316200257470ustar00rootroot00000000000000case "$(pypy_architecture 2>/dev/null || true)" in "linux" ) if require_distro "Ubuntu 14.04" 1>/dev/null 2>&1; then install_package "pypy2-v5.8.0-linux32" "https://downloads.python.org/pypy/pypy2-v5.8.0-linux32.tar.bz2#a0b125a5781f7e5ddfc3baca46503b14f4ee6a0e234e8d72bfcf3afdf4120bef" "pypy" verify_py27 ensurepip fi ;; "linux-armel" ) require_distro "Ubuntu 12.04" || true install_package "pypy2-v5.8.0-linux-armel" "https://downloads.python.org/pypy/pypy2-v5.8.0-linux-armel.tar.bz2#28b7fd0cc7418ffc66c71520728e87941be40ebf4b82675c57e25598a2a702b0" "pypy" verify_py27 ensurepip ;; "linux-armhf" ) if [[ "$(cat /etc/issue 2>/dev/null || true)" == "Raspbian"* ]]; then install_package "pypy2-v5.8.0-linux-armhf-raspbian" "https://downloads.python.org/pypy/pypy2-v5.8.0-linux-armhf-raspbian.tar.bz2#da58279a0e3706889fc0df06087cea08f8cfd22322139fe9bae73ef9b2d119b7" "pypy" verify_py27 ensurepip else require_distro "Ubuntu 13.04" || true install_package "pypy2-v5.8.0-linux-armhf-raring" "https://downloads.python.org/pypy/pypy2-v5.8.0-linux-armhf-raring.tar.bz2#ddceca9c5c9a456d4bf1beab177660adffbbdf255a922244e1cc05f20318be46" "pypy" verify_py27 ensurepip fi ;; "linux64" ) if require_distro "Ubuntu 14.04" 1>/dev/null 2>&1; then install_package "pypy2-v5.8.0-linux64" "https://downloads.python.org/pypy/pypy2-v5.8.0-linux64.tar.bz2#6274292d0e954a2609b15978cde6efa30942ba20aa5d2acbbf1c70c0a54e9b1e" "pypy" verify_py27 ensurepip else install_package "pypy-5.8-linux_x86_64-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy-5.8-1-linux_x86_64-portable.tar.bz2#52556230af5769c656173ae8a1bdcb2e16aef46e3993ed89f3aec3d220aec862" "pypy" verify_py27 ensurepip fi ;; "osx64" ) install_package "pypy2-v5.8.0-osx64" "https://downloads.python.org/pypy/pypy2-v5.8.0-osx64.tar.bz2#04b61d1cf13aaca6d0420e854c820b8bd049dc88be16c02542abe8ca26eb075c" "pypy" verify_py27 ensurepip ;; "win32" ) # FIXME: never tested on Windows install_zip "pypy2-v5.8.0-win32" "https://downloads.python.org/pypy/pypy2-v5.8.0-win32.zip#43d6217653e5bdc09e3ff8cb56fb52c4eb019429063d80107be4e88eef79ea8d" "pypy" verify_py27 ensurepip ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." echo "try 'pypy2.7-5.8.0-src' to build from source." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy2.7-5.8.0-src000066400000000000000000000006421517431316200265240ustar00rootroot00000000000000prefer_openssl11 install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl install_package "pypy2-v5.8.0-src" "https://downloads.python.org/pypy/pypy2-v5.8.0-src.tar.bz2#504c2d522595baf8775ae1045a217a2b120732537861d31b889d47c340b58bd5" "pypy_builder" verify_py27 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy2.7-5.9.0000066400000000000000000000046441517431316200257460ustar00rootroot00000000000000case "$(pypy_architecture 2>/dev/null || true)" in "linux" ) if require_distro "Ubuntu 14.04" 1>/dev/null 2>&1; then install_package "pypy2-v5.9.0-linux32" "https://downloads.python.org/pypy/pypy2-v5.9.0-linux32.tar.bz2#a2431a9e4ef879da1a2b56b111013b4a6efb87d4173a37bf650de47834ac5fe4" "pypy" verify_py27 ensurepip fi ;; "linux-armel" ) require_distro "Ubuntu 12.04" || true install_package "pypy2-v5.9.0-linux-armel" "https://downloads.python.org/pypy/pypy2-v5.9.0-linux-armel.tar.bz2#ac0676d91dfb388c799ec5c2845f42018a666423376f52f3ae13d61fd2e6f87d" "pypy" verify_py27 ensurepip ;; "linux-armhf" ) if [[ "$(cat /etc/issue 2>/dev/null || true)" == "Raspbian"* ]]; then install_package "pypy2-v5.9.0-linux-armhf-raspbian" "https://downloads.python.org/pypy/pypy2-v5.9.0-linux-armhf-raspbian.tar.bz2#b8a20042a3f34486a372ff7c751539b2e16859c0a7ea69d5a73af92f0fdcb25a" "pypy" verify_py27 ensurepip else require_distro "Ubuntu 13.04" || true install_package "pypy2-v5.9.0-linux-armhf-raring" "https://downloads.python.org/pypy/pypy2-v5.9.0-linux-armhf-raring.tar.bz2#2597b7b21acdef4f2b81074a594157c9450363c74a17f005548c6b102f93cff4" "pypy" verify_py27 ensurepip fi ;; "linux64" ) if require_distro "Ubuntu 14.04" 1>/dev/null 2>&1; then install_package "pypy2-v5.9.0-linux64" "https://downloads.python.org/pypy/pypy2-v5.9.0-linux64.tar.bz2#790febd4f09e22d6e2f81154efc7dc4b2feec72712aaf4f82aa91b550abb4b48" "pypy" verify_py27 ensurepip else install_package "pypy-5.9-linux_x86_64-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy-5.9-linux_x86_64-portable.tar.bz2#8d39eb98df3adf7882a7f3551f47b8c7cff47a0e20d6aabc57bb592f155c2616" "pypy" verify_py27 ensurepip fi ;; "osx64" ) install_package "pypy2-v5.9.0-osx64" "https://downloads.python.org/pypy/pypy2-v5.9.0-osx64.tar.bz2#94de50ed80c7f6392ed356c03fd54cdc84858df43ad21e9e971d1b6da0f6b867" "pypy" verify_py27 ensurepip ;; "win32" ) # FIXME: never tested on Windows install_zip "pypy2-v5.9.0-win32" "https://downloads.python.org/pypy/pypy2-v5.9.0-win32.zip#b61081e24e05b83d8110da1262be19f0094532c6cacc293e318a1c186d926533" "pypy" verify_py27 ensurepip ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." echo "try 'pypy2.7-5.9.0-src' to build from source." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy2.7-5.9.0-src000066400000000000000000000006421517431316200265250ustar00rootroot00000000000000prefer_openssl11 install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl install_package "pypy2-v5.9.0-src" "https://downloads.python.org/pypy/pypy2-v5.9.0-src.tar.bz2#de4bf05df47f1349dbac97233d9277bbaf1ef3331663ea2557fd5da3dbcfd0a7" "pypy_builder" verify_py27 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy2.7-6.0.0000066400000000000000000000054011517431316200257260ustar00rootroot00000000000000case "$(pypy_architecture 2>/dev/null || true)" in "linux" ) if require_distro "Ubuntu 12.04" "Ubuntu 12.10" "Ubuntu 13.04" "Ubuntu 13.10" "Ubuntu 14.04" 1>/dev/null 2>&1; then install_package "pypy2-v6.0.0-linux32" "https://downloads.python.org/pypy/pypy2-v6.0.0-linux32.tar.bz2#ad1082d4328ae8f32617b14628648583b82b6d29df3aa42b97bd1853c08c4bc8" "pypy" verify_py27 ensurepip else { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true), OS X < 10.13." echo "try 'pypy3.5-6.0.0-src' to build from source." echo } >&2 exit 1 fi ;; "linux-armel" ) require_distro "Ubuntu 12.04" || true install_package "pypy2-v6.0.0-linux-armel" "https://downloads.python.org/pypy/pypy2-v6.0.0-linux-armel.tar.bz2#924ca3f90aa28e8961859508c25752c95253b842318a0f267267ffe90f56a916" "pypy" verify_py27 ensurepip ;; "linux-armhf" ) if [[ "$(cat /etc/issue 2>/dev/null || true)" == "Raspbian"* ]]; then install_package "pypy2-v6.0.0-linux-armhf-raspbian" "https://downloads.python.org/pypy/pypy2-v6.0.0-linux-armhf-raspbian.tar.bz2#6506ce739e31981e5596d3cc2e2c7f5b086ee77bb4d97773082b62b2f283eef2" "pypy" verify_py27 ensurepip else { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." echo "try 'pypy2-6.0.0-src' to build from source." echo } >&2 exit 1 fi ;; "linux64" ) if require_distro "Ubuntu 12.04" "Ubuntu 12.10" "Ubuntu 13.04" "Ubuntu 13.10" "Ubuntu 14.04" 1>/dev/null 2>&1; then install_package "pypy2-v6.0.0-linux64" "https://downloads.python.org/pypy/pypy2-v6.0.0-linux64.tar.bz2#6cbf942ba7c90f504d8d6a2e45d4244e3bf146c8722d64e9410b85eac6b5af67" "pypy" verify_py27 ensurepip else install_package "pypy-6.0.0-linux_x86_64-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy-6.0.0-linux_x86_64-portable.tar.bz2#1d2a833680f9432b6b5f6b8503f656535f429eeb6c4bc5408abe5b637bfb9b94" "pypy" verify_py27 ensurepip fi ;; "osx64" ) install_package "pypy2-v6.0.0-osx64" "https://downloads.python.org/pypy/pypy2-v6.0.0-osx64.tar.bz2#d7dc443e6bb9a45212e8d8f5a63e9f6ce23f1d88c50709efea1c75b76c8bc186" "pypy" verify_py27 ensurepip ;; "win32" ) # FIXME: never tested on Windows install_zip "pypy2-v6.0.0-win32" "https://downloads.python.org/pypy/pypy2-v6.0.0-win32.zip#6e2210dae1ae721ed4eb9cba19f15453514b64111511c84f24843c4fdefdaf7f" "pypy" verify_py27 ensurepip ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." echo "try 'pypy2-6.0.0-src' to build from source." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy2.7-6.0.0-src000066400000000000000000000006421517431316200265150ustar00rootroot00000000000000prefer_openssl11 install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl install_package "pypy2-v6.0.0-src" "https://downloads.python.org/pypy/pypy2-v6.0.0-src.tar.bz2#6097ec5ee23d0d34d8cd27a1072bed041c8a080ad48731190a03a2223029212d" "pypy_builder" verify_py27 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy2.7-7.0.0000066400000000000000000000042211517431316200257260ustar00rootroot00000000000000case "$(pypy_architecture 2>/dev/null || true)" in "linux" ) if require_distro "Ubuntu 12.04" "Ubuntu 14.04" "Ubuntu 16.04" 1>/dev/null 2>&1; then install_package "pypy2.7-v7.0.0-linux32" "https://downloads.python.org/pypy/pypy2.7-v7.0.0-linux32.tar.bz2#446fc208dd77a0048368da830564e6e4180bcd786e524b5369c61785af5c903a" "pypy" verify_py27 ensurepip else { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." echo "try 'pypy2.7-7.0.0-src' to build from source." echo } >&2 exit 1 fi ;; "linux64" ) if require_distro "Ubuntu 12.04" "Ubuntu 14.04" "Ubuntu 16.04" 1>/dev/null 2>&1; then install_package "pypy2.7-v7.0.0-linux64" "https://downloads.python.org/pypy/pypy2.7-v7.0.0-linux64.tar.bz2#971b1909f9fe960c4c643a6940d3f8a60d9a7a2937119535ab0cfaf83498ecd7" "pypy" verify_py27 ensurepip else install_package "pypy-7.0.0-linux_x86_64-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy-7.0.0-linux_x86_64-portable.tar.bz2#fd71f2bef69c342e492239c2de04a67676bbc08b262d31948bef9e1385a44646" "pypy" verify_py27 ensurepip fi ;; "osx64" ) if require_osx_version "10.13"; then install_package "pypy2.7-v7.0.0-osx64" "https://downloads.python.org/pypy/pypy2.7-v7.0.0-osx64.tar.bz2#e7ecb029d9c7a59388838fc4820a50a2f5bee6536010031060e3dfa882730dc8" "pypy" verify_py27 ensurepip else { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true), OS X < 10.13." echo "try 'pypy2.7-7.0.0-src' to build from source." echo } >&2 exit 1 fi ;; "win32" ) install_zip "pypy2.7-v7.0.0-win32" "https://downloads.python.org/pypy/pypy2.7-v7.0.0-win32.zip#04477a41194240cd71e485c3f41dec35a787d1b3bc030f9aa59e5e81bcf4118b" "pypy" verify_py27 ensurepip ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." echo "try 'pypy2.7-7.0.0-src' to build from source." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy2.7-7.0.0-src000066400000000000000000000006461517431316200265220ustar00rootroot00000000000000prefer_openssl11 install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl install_package "pypy2.7-v7.0.0-src" "https://downloads.python.org/pypy/pypy2.7-v7.0.0-src.tar.bz2#f51d8bbfc4e73a8a01820b7871a45d13c59f1399822cdf8a19388c69eb20c18c" "pypy_builder" verify_py27 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy2.7-7.1.0000066400000000000000000000042211517431316200257270ustar00rootroot00000000000000case "$(pypy_architecture 2>/dev/null || true)" in "linux" ) if require_distro "Ubuntu 12.04" "Ubuntu 14.04" "Ubuntu 16.04" 1>/dev/null 2>&1; then install_package "pypy2.7-v7.1.0-linux32" "https://downloads.python.org/pypy/pypy2.7-v7.1.0-linux32.tar.bz2#44ec91e8cb01caab289d8763c203f3aaf288d14325a6c42692bd1ac4e870d758" "pypy" verify_py27 ensurepip else { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." echo "try 'pypy2.7-7.1.0-src' to build from source." echo } >&2 exit 1 fi ;; "linux64" ) if require_distro "Ubuntu 12.04" "Ubuntu 14.04" "Ubuntu 16.04" 1>/dev/null 2>&1; then install_package "pypy2.7-v7.1.0-linux64" "https://downloads.python.org/pypy/pypy2.7-v7.1.0-linux64.tar.bz2#fef176a29a2ef068c00c8098e59dab935ca6e956f089672b3f7351da95a034f5" "pypy" verify_py27 ensurepip else install_package "pypy-7.1.0-linux_x86_64-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy-7.1.0-linux_x86_64-portable.tar.bz2#ee917d9d72fb6a7d15e31e6c5e470ce561a940f112e99f29ac5dd6b41f512657" "pypy" verify_py27 ensurepip fi ;; "osx64" ) if require_osx_version "10.13"; then install_package "pypy2.7-v7.1.0-osx64" "https://downloads.python.org/pypy/pypy2.7-v7.1.0-osx64.tar.bz2#8be43685ce718b0768387450fc6dc395d60809b778b6146c353ef67826022153" "pypy" verify_py27 ensurepip else { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true), OS X < 10.13." echo "try 'pypy2.7-7.1.0-src' to build from source." echo } >&2 exit 1 fi ;; "win32" ) install_zip "pypy2.7-v7.1.0-win32" "https://downloads.python.org/pypy/pypy2.7-v7.1.0-win32.zip#76658c9ad679d562b8b6a09d006caa666406337b9834ff56db16980c5e549f20" "pypy" verify_py27 ensurepip ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." echo "try 'pypy2.7-7.1.0-src' to build from source." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy2.7-7.1.0-src000066400000000000000000000006461517431316200265230ustar00rootroot00000000000000prefer_openssl11 install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl install_package "pypy2.7-v7.1.0-src" "https://downloads.python.org/pypy/pypy2.7-v7.1.0-src.tar.bz2#b051a71ea5b4fa27d0a744b28e6054661adfce8904dcc82500716b5edff5ce4b" "pypy_builder" verify_py27 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy2.7-7.1.1000066400000000000000000000042211517431316200257300ustar00rootroot00000000000000case "$(pypy_architecture 2>/dev/null || true)" in "linux" ) if require_distro "Ubuntu 12.04" "Ubuntu 14.04" "Ubuntu 16.04" 1>/dev/null 2>&1; then install_package "pypy2.7-v7.1.1-linux32" "https://downloads.python.org/pypy/pypy2.7-v7.1.1-linux32.tar.bz2#41ca390a76ca0d47b8353a0d6a20d5aab5fad8b0bb647b960d8c33e873d18ef5" "pypy" verify_py27 ensurepip else { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." echo "try 'pypy2.7-7.1.1-src' to build from source." echo } >&2 exit 1 fi ;; "linux64" ) if require_distro "Ubuntu 12.04" "Ubuntu 14.04" "Ubuntu 16.04" 1>/dev/null 2>&1; then install_package "pypy2.7-v7.1.1-linux64" "https://downloads.python.org/pypy/pypy2.7-v7.1.1-linux64.tar.bz2#73b09ef0860eb9ad7997af3030b22909806a273d90786d78420926df53279d66" "pypy" verify_py27 ensurepip else install_package "pypy-7.1.1-linux_x86_64-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy-7.1.1-linux_x86_64-portable.tar.bz2#d0b226d2dd656c622cee4e3e982225e1b346653823b49f736d8b0ddc06fd0c73" "pypy" verify_py27 ensurepip fi ;; "osx64" ) if require_osx_version "10.13"; then install_package "pypy2.7-v7.1.1-osx64" "https://downloads.python.org/pypy/pypy2.7-v7.1.1-osx64.tar.bz2#31a17294dec96c2191885c776b4ee02112957dc874f7ba03e570537a77b78c35" "pypy" verify_py27 ensurepip else { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true), OS X < 10.13." echo "try 'pypy2.7-7.1.1-src' to build from source." echo } >&2 exit 1 fi ;; "win32" ) install_zip "pypy2.7-v7.1.1-win32" "https://downloads.python.org/pypy/pypy2.7-v7.1.1-win32.zip#9c59226311f216a181e70ee7b5aa4d9665a15d00f24ae02acec9af7d96355f63" "pypy" verify_py27 ensurepip ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." echo "try 'pypy2.7-7.1.1-src' to build from source." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy2.7-7.1.1-src000066400000000000000000000006461517431316200265240ustar00rootroot00000000000000prefer_openssl11 install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl install_package "pypy2.7-v7.1.1-src" "https://downloads.python.org/pypy/pypy2.7-v7.1.1-src.tar.bz2#5f06bede6d71dce8dfbfe797aab26c8e35cb990e16b826914652dc093ad74451" "pypy_builder" verify_py27 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy2.7-7.2.0000066400000000000000000000041601517431316200257320ustar00rootroot00000000000000case "$(pypy_architecture 2>/dev/null || true)" in "linux" ) if require_distro "Ubuntu 12.04" "Ubuntu 14.04" "Ubuntu 16.04" 1>/dev/null 2>&1; then install_package "pypy2.7-v7.2.0-linux32" "https://downloads.python.org/pypy/pypy2.7-v7.2.0-linux32.tar.bz2#76d666e5aee54b519d6ec1af4ef0cbdc85f7f9276dd554e97deb026adfd0c936" "pypy" verify_py27 ensurepip else { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." echo "try 'pypy2.7-7.2.0-src' to build from source." echo } >&2 exit 1 fi ;; "linux64" ) if require_distro "Ubuntu 12.04" "Ubuntu 14.04" "Ubuntu 16.04" 1>/dev/null 2>&1; then install_package "pypy2.7-v7.2.0-linux64" "https://downloads.python.org/pypy/pypy2.7-v7.2.0-linux64.tar.bz2#05acf28e6a243026ecad933b9361d8f74b41f00818071b76b38c4694cc4c9599" "pypy" verify_py27 ensurepip else install_package "pypy-7.2.0-linux_x86_64-portable" "https://github.com/squeaky-pl/portable-pypy/releases/download/pypy-7.2.0/pypy-7.2.0-linux_x86_64-portable.tar.bz2#a4f301e7629aafe4691ed1c3e9a39cf2158d86524f6ce584e5b850303e77ad81" "pypy" verify_py27 ensurepip fi ;; "osx64" ) if require_osx_version "10.13"; then install_package "pypy2.7-v7.2.0-osx64" "https://downloads.python.org/pypy/pypy2.7-v7.2.0-osx64.tar.bz2#36aa2f2440e762333569118dd0b3d5371d575c40966effa194d116c5453ddb52" "pypy" verify_py27 ensurepip else { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true), OS X < 10.13." echo "try 'pypy2.7-7.2.0-src' to build from source." echo } >&2 exit 1 fi ;; "win32" ) install_zip "pypy2.7-v7.2.0-win32" "https://downloads.python.org/pypy/pypy2.7-v7.2.0-win32.zip#956eeaaaac053e5d0917e77a3d2ad1933ab5561eb3e6e71235780b5aa5fd2bb7" "pypy" verify_py27 ensurepip ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." echo "try 'pypy2.7-7.2.0-src' to build from source." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy2.7-7.2.0-src000066400000000000000000000006461517431316200265240ustar00rootroot00000000000000prefer_openssl11 install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl install_package "pypy2.7-v7.2.0-src" "https://downloads.python.org/pypy/pypy2.7-v7.2.0-src.tar.bz2#55cb7757784fbe3952102447f65b27d80e6c885a464a7af1a9ce264492439dcc" "pypy_builder" verify_py27 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy2.7-7.3.0000066400000000000000000000035421517431316200257360ustar00rootroot00000000000000VERSION='7.3.0' PYVER='2.7' case "$(pypy_architecture 2>/dev/null || true)" in "linux" ) install_package "pypy${PYVER}-v${VERSION}-linux32" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-linux32.tar.bz2#eac1308b7d523003a5f6d20f58406d52ab14611bcec750122ae513a5a35110db" "pypy" "verify_py${PYVER//./}" ensurepip ;; "linux64" ) install_package "pypy${PYVER}-v${VERSION}-linux64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-linux64.tar.bz2#f4950a54378ac637da2a6defa52d6ffed96af12fcd5d74e1182fb834883c9826" "pypy" "verify_py${PYVER//./}" ensurepip ;; "linux-aarch64" ) install_package "pypy${PYVER}-v${VERSION}-aarch64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-aarch64.tar.bz2#a3dd8d5e2a656849fa344dce4679d854a19bc4a096a0cf62b46a1be127a5d56c" "pypy" "verify_py${PYVER//./}" ensurepip ;; "osx64" ) if require_osx_version "10.13"; then install_package "pypy${PYVER}-v${VERSION}-osx64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-osx64.tar.bz2#ca7b056b243a6221ad04fa7fc8696e36a2fb858396999dcaa31dbbae53c54474" "pypy" "verify_py${PYVER//./}" ensurepip else { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true), OS X < 10.13." echo "try 'pypy${PYVER}-${VERSION}-src' to build from source." echo } >&2 exit 1 fi ;; "win32" ) install_zip "pypy${PYVER}-v${VERSION}-win32" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-win32.zip#a9e3c5c983edba0313a41d3c1ab55b080816c4129e67a6c272c53b9dbcdd97ec" "pypy" "verify_py${PYVER//./}" ensurepip ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." echo "try 'pypy${PYVER}-${VERSION}-src' to build from source." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy2.7-7.3.0-src000066400000000000000000000006461517431316200265250ustar00rootroot00000000000000prefer_openssl11 install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl install_package "pypy2.7-v7.3.0-src" "https://downloads.python.org/pypy/pypy2.7-v7.3.0-src.tar.bz2#b0b25c7f8938ab0fedd8dedf26b9e73c490913b002b484c1b2f19d5844a518de" "pypy_builder" verify_py27 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy2.7-7.3.1000066400000000000000000000035421517431316200257370ustar00rootroot00000000000000VERSION='7.3.1' PYVER='2.7' case "$(pypy_architecture 2>/dev/null || true)" in "linux" ) install_package "pypy${PYVER}-v${VERSION}-linux32" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-linux32.tar.bz2#cd155d06cd0956d9de4a16e8a6bdf0722cb45b5bc4bbf805825d393ebd6690ad" "pypy" "verify_py${PYVER//./}" ensurepip ;; "linux64" ) install_package "pypy${PYVER}-v${VERSION}-linux64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-linux64.tar.bz2#be74886547df7bf7094096a11fc0a48496779d0d1b71901797b0c816f92caca3" "pypy" "verify_py${PYVER//./}" ensurepip ;; "linux-aarch64" ) install_package "pypy${PYVER}-v${VERSION}-aarch64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-aarch64.tar.bz2#094f23ab262e666d8740bf27459a6b1215a628dad9b6c2a88f1ed5c793fab267" "pypy" "verify_py${PYVER//./}" ensurepip ;; "osx64" ) if require_osx_version "10.13"; then install_package "pypy${PYVER}-v${VERSION}-osx64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-osx64.tar.bz2#dfd4651243441d2f8f1c348e9ecc09848642d0c31bb323aa8ac320e5b9f232f0" "pypy" "verify_py${PYVER//./}" ensurepip else { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true), OS X < 10.13." echo "try 'pypy${PYVER}-${VERSION}-src' to build from source." echo } >&2 exit 1 fi ;; "win32" ) install_zip "pypy${PYVER}-v${VERSION}-win32" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-win32.zip#e3c0dfb385d9825dd7723f26576d55d43ed92f1178f2399ab39e9fa11621a47b" "pypy" "verify_py${PYVER//./}" ensurepip ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." echo "try 'pypy${PYVER}-${VERSION}-src' to build from source." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy2.7-7.3.1-src000066400000000000000000000006341517431316200265230ustar00rootroot00000000000000prefer_openssl11 install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl install_package "pypy2.7-v7.3.1-src" "https://downloads.python.org/pypy/pypy2.7-v7.3.1-src.tar.bz2#fa3771514c8a354969be9bd3b26d65a489c30e28f91d350e4ad2f4081a9c9321" "pypy_builder" verify_py27 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy2.7-7.3.10000066400000000000000000000043551517431316200260220ustar00rootroot00000000000000VERSION='7.3.10' PYVER='2.7' # https://www.pypy.org/checksums.html aarch64_hash=274342f0e75e99d60ba7a0cfb0e13792e7664163e01450d2f7f2f7825603a0ae linux32_hash=0b17132f62d2a0c3c4572c57eb53820f25611afad71f3d6a310202942baed6e1 linux64_hash=461fb6df524208af9e94ffb16989f628b585bdb4b9e97d81e668899fc3a064a3 osarm64_hash=14b178f005603e3df6db7574b77b9c65ae79feda1a629214cafcb4eee7da679d osx64_hash=188551185ee945d5e42a3a619205d02ac31db77bdd5d98b6c11469e125c3bdb5 s390x_hash=0fac1ec1e05c70941f758be05d40ce7ffe6a42c0416e70b55d40a7523e3e70ae ### end of manual settings - following lines same for every download function err_no_binary { local archmsg="${1}" local ver="pypy${PYVER}-v${VERSION}-src" local url="https://downloads.python.org/pypy/${ver}.tar.bz2" { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for ${archmsg}." echo "try '${url}' to build from source." echo } >&2 exit 1 } function pypy_pkg_data { # pypy architecture tag local ARCH="${1}" # defaults local cmd='install_package' # use bz2 local pkg="${ARCH}" # assume matches local ext='tar.bz2' local hash='' # undefined # select the hash, fix pkg if not match ARCH case "${ARCH}" in 'linux-aarch64' ) hash="${aarch64_hash}" pkg='aarch64' ;; 'linux' ) hash="${linux32_hash}" pkg='linux32' ;; 'linux64' ) hash="${linux64_hash}" ;; 'osarm64' ) hash="${osarm64_hash}" pkg='macos_arm64' ;; 'osx64' ) if require_osx_version "10.13"; then hash="${osx64_hash}" pkg='macos_x86_64' else err_no_binary "${ARCH}, OS X < 10.13" fi ;; 's390x' ) hash="${s390x_hash}" ;; * ) err_no_binary "${ARCH}" ;; esac local basever="pypy${PYVER}-v${VERSION}" local baseurl="https://downloads.python.org/pypy/${basever}" # result - command, package dir, url+hash echo "${cmd}" "${basever}-${pkg}" "${baseurl}-${pkg}.${ext}#${hash}" } # determine command, package directory, url+hash declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" # install ${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip' pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy2.7-7.3.10-src000066400000000000000000000011331517431316200265760ustar00rootroot00000000000000VERSION='7.3.10' PYVER='2.7' # https://www.pypy.org/checksums.html hash=35e2cf4519cb51c4d5ffb4493ee24f0c7f42b4b04944903ca4b33981a04a3bc5 ### end of manual settings - following lines same for every download ver="pypy${PYVER}-v${VERSION}-src" url="https://downloads.python.org/pypy/${ver}.tar.bz2" prefer_openssl11 install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip' pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy2.7-7.3.11000066400000000000000000000043551517431316200260230ustar00rootroot00000000000000VERSION='7.3.11' PYVER='2.7' # https://www.pypy.org/checksums.html aarch64_hash=ea924da1defe9325ef760e288b04f984614e405580f5321eb6a5c8f539bd415a linux32_hash=30fd245fab7068c96a75b9ff1323ac55174c64fc8c4751cceb4b7a9bedc1851e linux64_hash=ba8ed958a905c0735a4cfff2875c25089954dc020e087d982b0ffa5b9da316cd osarm64_hash=cc5696ab4f93cd3481c1e4990b5dedd7ba60ac0602fa1890d368889a6c5bf771 osx64_hash=56deee9c22640f5686c35b9d64fdb1ce3abd044583e4078f0b171ca2fd2a198e s390x_hash=8fe9481c473178e53266983678684a70fe0c42bafc95f1807bf3ef28770316d4 ### end of manual settings - following lines same for every download function err_no_binary { local archmsg="${1}" local ver="pypy${PYVER}-v${VERSION}-src" local url="https://downloads.python.org/pypy/${ver}.tar.bz2" { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for ${archmsg}." echo "try '${url}' to build from source." echo } >&2 exit 1 } function pypy_pkg_data { # pypy architecture tag local ARCH="${1}" # defaults local cmd='install_package' # use bz2 local pkg="${ARCH}" # assume matches local ext='tar.bz2' local hash='' # undefined # select the hash, fix pkg if not match ARCH case "${ARCH}" in 'linux-aarch64' ) hash="${aarch64_hash}" pkg='aarch64' ;; 'linux' ) hash="${linux32_hash}" pkg='linux32' ;; 'linux64' ) hash="${linux64_hash}" ;; 'osarm64' ) hash="${osarm64_hash}" pkg='macos_arm64' ;; 'osx64' ) if require_osx_version "10.13"; then hash="${osx64_hash}" pkg='macos_x86_64' else err_no_binary "${ARCH}, OS X < 10.13" fi ;; 's390x' ) hash="${s390x_hash}" ;; * ) err_no_binary "${ARCH}" ;; esac local basever="pypy${PYVER}-v${VERSION}" local baseurl="https://downloads.python.org/pypy/${basever}" # result - command, package dir, url+hash echo "${cmd}" "${basever}-${pkg}" "${baseurl}-${pkg}.${ext}#${hash}" } # determine command, package directory, url+hash declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" # install ${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip' pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy2.7-7.3.11-src000066400000000000000000000011331517431316200265770ustar00rootroot00000000000000VERSION='7.3.11' PYVER='2.7' # https://www.pypy.org/checksums.html hash=1117afb66831da4ea6f39d8d2084787a74689fd0229de0be301f9ed9b255093c ### end of manual settings - following lines same for every download ver="pypy${PYVER}-v${VERSION}-src" url="https://downloads.python.org/pypy/${ver}.tar.bz2" prefer_openssl11 install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip' pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy2.7-7.3.12000066400000000000000000000043551517431316200260240ustar00rootroot00000000000000VERSION='7.3.12' PYVER='2.7' # https://www.pypy.org/checksums.html aarch64_hash=e04dcb6286a7b4724ec3f0e50d3cc1ba8583301dd1658c06d7f37599e4201c59 linux32_hash=abf3ae477bd0e526ac6dcefe0bfa845e1535aa053342c0d641219bfcde4b9b56 linux64_hash=1a61a2574b79466f606010f2999a2b995bd96cd085f91a78ebdd3d5c2c40e81d osarm64_hash=6b747aa076ae8597e49603c5dec4ca5935a1a0a132d7404a559be96a260d9bf7 osx64_hash=6e89ffdd15537ce4ffce3145b65ee57c2e9c952892bd95b934012d2f009f503b s390x_hash=80c0154d8b0949f9dc6a227c322abbc9590c8ae4c9f11c13bf4022aa38b82064 ### end of manual settings - following lines same for every download function err_no_binary { local archmsg="${1}" local ver="pypy${PYVER}-v${VERSION}-src" local url="https://downloads.python.org/pypy/${ver}.tar.bz2" { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for ${archmsg}." echo "try '${url}' to build from source." echo } >&2 exit 1 } function pypy_pkg_data { # pypy architecture tag local ARCH="${1}" # defaults local cmd='install_package' # use bz2 local pkg="${ARCH}" # assume matches local ext='tar.bz2' local hash='' # undefined # select the hash, fix pkg if not match ARCH case "${ARCH}" in 'linux-aarch64' ) hash="${aarch64_hash}" pkg='aarch64' ;; 'linux' ) hash="${linux32_hash}" pkg='linux32' ;; 'linux64' ) hash="${linux64_hash}" ;; 'osarm64' ) hash="${osarm64_hash}" pkg='macos_arm64' ;; 'osx64' ) if require_osx_version "10.13"; then hash="${osx64_hash}" pkg='macos_x86_64' else err_no_binary "${ARCH}, OS X < 10.13" fi ;; 's390x' ) hash="${s390x_hash}" ;; * ) err_no_binary "${ARCH}" ;; esac local basever="pypy${PYVER}-v${VERSION}" local baseurl="https://downloads.python.org/pypy/${basever}" # result - command, package dir, url+hash echo "${cmd}" "${basever}-${pkg}" "${baseurl}-${pkg}.${ext}#${hash}" } # determine command, package directory, url+hash declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" # install ${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip' pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy2.7-7.3.12-src000066400000000000000000000011331517431316200266000ustar00rootroot00000000000000VERSION='7.3.12' PYVER='2.7' # https://www.pypy.org/checksums.html hash=dd61d88da274c2ce2cec77667d4a3df9a652bcc50e26f90991d4dd0af66bccf4 ### end of manual settings - following lines same for every download ver="pypy${PYVER}-v${VERSION}-src" url="https://downloads.python.org/pypy/${ver}.tar.bz2" prefer_openssl11 install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip' pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy2.7-7.3.13000066400000000000000000000043621517431316200260230ustar00rootroot00000000000000VERSION='7.3.13' PYVER='2.7' # https://www.pypy.org/checksums.html aarch64_hash=f1e20f833cc86a097c1f1318069fc17d01c3988678c1438fe27ed567fcb5cfd0 linux32_hash=b727d2e759a740f45bab1e333029d001c4384b52949bcbb4bd2ad7912eae8dad linux64_hash=e41ceb5dc6c4d3a9311ed5f88edfeedbf3e8abbd1ed3c4f2e151a90a5cf4e1d7 osarm64_hash=5b86cf0750abc188a0355380d10c7bab1dec51b610cde23ce78f30a9ef296618 osx64_hash=50769df0091e8fa51c9e4356e0cb204e6f6aa54f502ec5a6e55aef03d0ac5675 s390x_hash=fbb2f3d92831c02b094f17e9609b95a6202d4bdcddae437e380ab14388d4556e ### end of manual settings - following lines same for every download function err_no_binary { local archmsg="${1}" local ver="pypy${PYVER}-v${VERSION}-src" local url="https://downloads.python.org/pypy/${ver}.tar.bz2" { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for ${archmsg}." echo "try '${url}' to build from source." echo } >&2 exit 1 } function pypy_pkg_data { # pypy architecture tag local ARCH="${1}" # defaults local cmd='install_package' # use bz2 local pkg="${ARCH}" # assume matches local ext='tar.bz2' local hash='' # undefined # select the hash, fix pkg if not match ARCH case "${ARCH}" in 'linux-aarch64' ) hash="${aarch64_hash}" pkg='aarch64' ;; 'linux' ) hash="${linux32_hash}" pkg='linux32' ;; 'linux64' ) hash="${linux64_hash}" ;; 'osarm64' ) hash="${osarm64_hash}" pkg='macos_arm64' ;; 'osx64' ) if require_osx_version "10.13"; then hash="${osx64_hash}" pkg='macos_x86_64' else err_no_binary "${ARCH}, OS X < 10.13" fi ;; 's390x' ) hash="${s390x_hash}" ;; * ) err_no_binary "${ARCH}" ;; esac local basever="pypy${PYVER}-v${VERSION}" local baseurl="https://downloads.python.org/pypy/${basever}" # result - command, package dir, url+hash echo "${cmd}" "${basever}-${pkg}" "${baseurl}-${pkg}.${ext}#${hash}" } # determine command, package directory, url+hash declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" # install ${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip_lt21' pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy2.7-7.3.13-src000066400000000000000000000011401517431316200265770ustar00rootroot00000000000000VERSION='7.3.13' PYVER='2.7' # https://www.pypy.org/checksums.html hash=976984bc6ca5ec9d37ae4e219b020cbed2751d1a02267033f59ed700ba8cec40 ### end of manual settings - following lines same for every download ver="pypy${PYVER}-v${VERSION}-src" url="https://downloads.python.org/pypy/${ver}.tar.bz2" prefer_openssl11 install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip_lt21' pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy2.7-7.3.14000066400000000000000000000043621517431316200260240ustar00rootroot00000000000000VERSION='7.3.14' PYVER='2.7' # https://www.pypy.org/checksums.html aarch64_hash=98468f4cc704a2821401afdd001ebddd367e594e05a70c7767fb86f1364fb21a linux32_hash=b12b4b587da55c8f212ae854e31d29258451e069c65aca596e577644e520bc8b linux64_hash=5938c3c6cddb2e8eb5e435cd3bf61d15134b94a9ac026e26a533bdda6c28a4a0 osarm64_hash=a428e18fcf1470b032fb1f4d75795aeed9216b4314a4c8a3e4d7e13f10f8607e osx64_hash=8af24683621937e65c518fbca1eb34e17ffc741c2ac917e4ca20694348157d78 s390x_hash=5abc6a0f55a89c08def13b5f410b8e7bd706fe1b472f31db01ecbc4d0a49e8dc ### end of manual settings - following lines same for every download function err_no_binary { local archmsg="${1}" local ver="pypy${PYVER}-v${VERSION}-src" local url="https://downloads.python.org/pypy/${ver}.tar.bz2" { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for ${archmsg}." echo "try '${url}' to build from source." echo } >&2 exit 1 } function pypy_pkg_data { # pypy architecture tag local ARCH="${1}" # defaults local cmd='install_package' # use bz2 local pkg="${ARCH}" # assume matches local ext='tar.bz2' local hash='' # undefined # select the hash, fix pkg if not match ARCH case "${ARCH}" in 'linux-aarch64' ) hash="${aarch64_hash}" pkg='aarch64' ;; 'linux' ) hash="${linux32_hash}" pkg='linux32' ;; 'linux64' ) hash="${linux64_hash}" ;; 'osarm64' ) hash="${osarm64_hash}" pkg='macos_arm64' ;; 'osx64' ) if require_osx_version "10.13"; then hash="${osx64_hash}" pkg='macos_x86_64' else err_no_binary "${ARCH}, OS X < 10.13" fi ;; 's390x' ) hash="${s390x_hash}" ;; * ) err_no_binary "${ARCH}" ;; esac local basever="pypy${PYVER}-v${VERSION}" local baseurl="https://downloads.python.org/pypy/${basever}" # result - command, package dir, url+hash echo "${cmd}" "${basever}-${pkg}" "${baseurl}-${pkg}.${ext}#${hash}" } # determine command, package directory, url+hash declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" # install ${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip_lt21' pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy2.7-7.3.14-src000066400000000000000000000011401517431316200266000ustar00rootroot00000000000000VERSION='7.3.14' PYVER='2.7' # https://www.pypy.org/checksums.html hash=e096fe67ce2d8d4d5e7dceb84fe1ca854498f00766d31b27d32c8d8833131373 ### end of manual settings - following lines same for every download ver="pypy${PYVER}-v${VERSION}-src" url="https://downloads.python.org/pypy/${ver}.tar.bz2" prefer_openssl11 install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip_lt21' pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy2.7-7.3.15000066400000000000000000000043621517431316200260250ustar00rootroot00000000000000VERSION='7.3.15' PYVER='2.7' # https://www.pypy.org/checksums.html aarch64_hash=31b41fca7280636d7818713b7a0fab8f34ece9c82cc88e51d305d43b3e6306d6 linux32_hash=cb5c1da62a8ca31050173c4f6f537bc3ff316026895e5f1897b9bb526babae79 linux64_hash=e857553bdc4f25ba9670a5c173a057a9ff71262d5c5da73a6ddef9d7dc5d4f5e osarm64_hash=618d33df7ac6570d88a58183e3e15c56f63f862968cecbd2ee896eac6255cea6 osx64_hash=72dac262fc63115b6ccd2c3c15e7afd1b2e7a65d7e97265c116246d1cf2cdffd s390x_hash=eb442279ec3f1eb17da296e38b531d3ca50c6418eab208a020bca4646a1dea46 ### end of manual settings - following lines same for every download function err_no_binary { local archmsg="${1}" local ver="pypy${PYVER}-v${VERSION}-src" local url="https://downloads.python.org/pypy/${ver}.tar.bz2" { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for ${archmsg}." echo "try '${url}' to build from source." echo } >&2 exit 1 } function pypy_pkg_data { # pypy architecture tag local ARCH="${1}" # defaults local cmd='install_package' # use bz2 local pkg="${ARCH}" # assume matches local ext='tar.bz2' local hash='' # undefined # select the hash, fix pkg if not match ARCH case "${ARCH}" in 'linux-aarch64' ) hash="${aarch64_hash}" pkg='aarch64' ;; 'linux' ) hash="${linux32_hash}" pkg='linux32' ;; 'linux64' ) hash="${linux64_hash}" ;; 'osarm64' ) hash="${osarm64_hash}" pkg='macos_arm64' ;; 'osx64' ) if require_osx_version "10.13"; then hash="${osx64_hash}" pkg='macos_x86_64' else err_no_binary "${ARCH}, OS X < 10.13" fi ;; 's390x' ) hash="${s390x_hash}" ;; * ) err_no_binary "${ARCH}" ;; esac local basever="pypy${PYVER}-v${VERSION}" local baseurl="https://downloads.python.org/pypy/${basever}" # result - command, package dir, url+hash echo "${cmd}" "${basever}-${pkg}" "${baseurl}-${pkg}.${ext}#${hash}" } # determine command, package directory, url+hash declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" # install ${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip_lt21' pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy2.7-7.3.15-src000066400000000000000000000011401517431316200266010ustar00rootroot00000000000000VERSION='7.3.15' PYVER='2.7' # https://www.pypy.org/checksums.html hash=a66ddaed39544a35bb7ab7a17dbf673a020c7cb3a614bd2b61a54776888daf2c ### end of manual settings - following lines same for every download ver="pypy${PYVER}-v${VERSION}-src" url="https://downloads.python.org/pypy/${ver}.tar.bz2" prefer_openssl11 install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip_lt21' pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy2.7-7.3.16000066400000000000000000000043621517431316200260260ustar00rootroot00000000000000VERSION='7.3.16' PYVER='2.7' # https://www.pypy.org/checksums.html aarch64_hash=be44e65dd8c00d2388b2580dbe2af6a5179f951a8f4979efc74360f92f3c7e96 linux32_hash=a19712d7a6bd4f6d113e352c5271803c583b5129b76a357d387b1fa85204f8e5 linux64_hash=04b2fceb712d6f811274825b8a471ee392d3d1b53afc83eb3f42439ce00d8e07 osarm64_hash=9cc13f4d6c4096820e1e0ddabb3959f853e45150ce0166a39aa23867e99f0145 osx64_hash=e8744c1cef8b9e4eb2d2b6b368ed19a1c5cde482c7ef750f2d9f0807bb77fd1c s390x_hash=09eb70b932e6aac484cf4b5f2de5845f71589f2cbb53e5ed37a497613b43cd53 ### end of manual settings - following lines same for every download function err_no_binary { local archmsg="${1}" local ver="pypy${PYVER}-v${VERSION}-src" local url="https://downloads.python.org/pypy/${ver}.tar.bz2" { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for ${archmsg}." echo "try '${url}' to build from source." echo } >&2 exit 1 } function pypy_pkg_data { # pypy architecture tag local ARCH="${1}" # defaults local cmd='install_package' # use bz2 local pkg="${ARCH}" # assume matches local ext='tar.bz2' local hash='' # undefined # select the hash, fix pkg if not match ARCH case "${ARCH}" in 'linux-aarch64' ) hash="${aarch64_hash}" pkg='aarch64' ;; 'linux' ) hash="${linux32_hash}" pkg='linux32' ;; 'linux64' ) hash="${linux64_hash}" ;; 'osarm64' ) hash="${osarm64_hash}" pkg='macos_arm64' ;; 'osx64' ) if require_osx_version "10.13"; then hash="${osx64_hash}" pkg='macos_x86_64' else err_no_binary "${ARCH}, OS X < 10.13" fi ;; 's390x' ) hash="${s390x_hash}" ;; * ) err_no_binary "${ARCH}" ;; esac local basever="pypy${PYVER}-v${VERSION}" local baseurl="https://downloads.python.org/pypy/${basever}" # result - command, package dir, url+hash echo "${cmd}" "${basever}-${pkg}" "${baseurl}-${pkg}.${ext}#${hash}" } # determine command, package directory, url+hash declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" # install ${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip_lt21' pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy2.7-7.3.16-src000066400000000000000000000011401517431316200266020ustar00rootroot00000000000000VERSION='7.3.16' PYVER='2.7' # https://www.pypy.org/checksums.html hash=43721cc0c397f0f3560b325c20c70b11f7c76c27910d3df09f8418cec4f9c2ad ### end of manual settings - following lines same for every download ver="pypy${PYVER}-v${VERSION}-src" url="https://downloads.python.org/pypy/${ver}.tar.bz2" prefer_openssl11 install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip_lt21' pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy2.7-7.3.17000066400000000000000000000041641517431316200260270ustar00rootroot00000000000000VERSION='7.3.17' PYVER='2.7' # https://www.pypy.org/checksums.html aarch64_hash=a8df5ce1650f4756933f8780870c91a0a40e7c9870d74629bf241392bcb5c2e3 linux32_hash=a3aa0867cc837a34941047ece0fbb6ca190410fae6ad35fae4999d03bf178750 linux64_hash=9f3497f87b3372d17e447369e0016a4bec99a6b4d2a59aba774a25bfe4353474 osarm64_hash=8573172db377ee0831bf20492cdee9bac4e0b194e3dfe8bf7c44ee257a824766 osx64_hash=e3e1af1d6ad15e51d8d19ea36e1ac65c4c792314cc8b8dc5cf771ec4353b50f8 ### end of manual settings - following lines same for every download function err_no_binary { local archmsg="${1}" local ver="pypy${PYVER}-v${VERSION}-src" local url="https://downloads.python.org/pypy/${ver}.tar.bz2" { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for ${archmsg}." echo "try '${url}' to build from source." echo } >&2 exit 1 } function pypy_pkg_data { # pypy architecture tag local ARCH="${1}" # defaults local cmd='install_package' # use bz2 local pkg="${ARCH}" # assume matches local ext='tar.bz2' local hash='' # undefined # select the hash, fix pkg if not match ARCH case "${ARCH}" in 'linux-aarch64' ) hash="${aarch64_hash}" pkg='aarch64' ;; 'linux' ) hash="${linux32_hash}" pkg='linux32' ;; 'linux64' ) hash="${linux64_hash}" ;; 'osarm64' ) hash="${osarm64_hash}" pkg='macos_arm64' ;; 'osx64' ) if require_osx_version "10.13"; then hash="${osx64_hash}" pkg='macos_x86_64' else err_no_binary "${ARCH}, OS X < 10.13" fi ;; * ) err_no_binary "${ARCH}" ;; esac local basever="pypy${PYVER}-v${VERSION}" local baseurl="https://downloads.python.org/pypy/${basever}" # result - command, package dir, url+hash echo "${cmd}" "${basever}-${pkg}" "${baseurl}-${pkg}.${ext}#${hash}" } # determine command, package directory, url+hash declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" # install ${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip_lt21' pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy2.7-7.3.17-src000066400000000000000000000011401517431316200266030ustar00rootroot00000000000000VERSION='7.3.17' PYVER='2.7' # https://www.pypy.org/checksums.html hash=50e06840f4bbde91448080a4118068a89b8fbcae25ff8da1e2bb1402dc9a0346 ### end of manual settings - following lines same for every download ver="pypy${PYVER}-v${VERSION}-src" url="https://downloads.python.org/pypy/${ver}.tar.bz2" prefer_openssl11 install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip_lt21' pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy2.7-7.3.18000066400000000000000000000041641517431316200260300ustar00rootroot00000000000000VERSION='7.3.18' PYVER='2.7' # https://www.pypy.org/checksums.html aarch64_hash=d647cad5be915df65f44277fd051c8d52e708d22838b5cb21b2de033530acc80 linux32_hash=54990fb1ae2266c260a7ce694b84ab91a8d0d298da440cd5695ac671dc5615e2 linux64_hash=1da34354e5fa59400609e94c00ba6feccf5aa575abb26fb6caf9c2ac16100ff4 osarm64_hash=48927b1931a4feadea945f7c988c429b42e9fb6567af3810ab86ad95efbe98bc osx64_hash=db9d2bcc8dbe089b34a19083a11116697e8679acc2c47a2862264429810f666e ### end of manual settings - following lines same for every download function err_no_binary { local archmsg="${1}" local ver="pypy${PYVER}-v${VERSION}-src" local url="https://downloads.python.org/pypy/${ver}.tar.bz2" { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for ${archmsg}." echo "try '${url}' to build from source." echo } >&2 exit 1 } function pypy_pkg_data { # pypy architecture tag local ARCH="${1}" # defaults local cmd='install_package' # use bz2 local pkg="${ARCH}" # assume matches local ext='tar.bz2' local hash='' # undefined # select the hash, fix pkg if not match ARCH case "${ARCH}" in 'linux-aarch64' ) hash="${aarch64_hash}" pkg='aarch64' ;; 'linux' ) hash="${linux32_hash}" pkg='linux32' ;; 'linux64' ) hash="${linux64_hash}" ;; 'osarm64' ) hash="${osarm64_hash}" pkg='macos_arm64' ;; 'osx64' ) if require_osx_version "10.13"; then hash="${osx64_hash}" pkg='macos_x86_64' else err_no_binary "${ARCH}, OS X < 10.13" fi ;; * ) err_no_binary "${ARCH}" ;; esac local basever="pypy${PYVER}-v${VERSION}" local baseurl="https://downloads.python.org/pypy/${basever}" # result - command, package dir, url+hash echo "${cmd}" "${basever}-${pkg}" "${baseurl}-${pkg}.${ext}#${hash}" } # determine command, package directory, url+hash declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" # install ${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip_lt21' pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy2.7-7.3.18-src000066400000000000000000000011401517431316200266040ustar00rootroot00000000000000VERSION='7.3.18' PYVER='2.7' # https://www.pypy.org/checksums.html hash=737435ddfc5afa5b97a7209c87d70d5f1062426c053b9bb8b99a0347cb4891fa ### end of manual settings - following lines same for every download ver="pypy${PYVER}-v${VERSION}-src" url="https://downloads.python.org/pypy/${ver}.tar.bz2" prefer_openssl11 install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip_lt21' pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy2.7-7.3.19000066400000000000000000000041641517431316200260310ustar00rootroot00000000000000VERSION='7.3.19' PYVER='2.7' # https://www.pypy.org/checksums.html aarch64_hash=fe89d4fd4af13f76dfe7315975003518cf176520e3ccec1544a88d174f50910e linux32_hash=cc52df02b6926bd8645c1651cd7f6637ce51c2f352d0fb3c6b9330d15194b409 linux64_hash=d38445508c2eaf14ebb380d9c1ded321c5ebeae31c7e66800173d83cb8ddf423 osarm64_hash=28780e0b908ad6db4b4e096f4237124be79ecc9731946d840d9c8749eb67a759 osx64_hash=6be28d448d8e64fffc586d9b0ae4d09064a83ccaeb5b8060c651c5cd9ae06878 ### end of manual settings - following lines same for every download function err_no_binary { local archmsg="${1}" local ver="pypy${PYVER}-v${VERSION}-src" local url="https://downloads.python.org/pypy/${ver}.tar.bz2" { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for ${archmsg}." echo "try '${url}' to build from source." echo } >&2 exit 1 } function pypy_pkg_data { # pypy architecture tag local ARCH="${1}" # defaults local cmd='install_package' # use bz2 local pkg="${ARCH}" # assume matches local ext='tar.bz2' local hash='' # undefined # select the hash, fix pkg if not match ARCH case "${ARCH}" in 'linux-aarch64' ) hash="${aarch64_hash}" pkg='aarch64' ;; 'linux' ) hash="${linux32_hash}" pkg='linux32' ;; 'linux64' ) hash="${linux64_hash}" ;; 'osarm64' ) hash="${osarm64_hash}" pkg='macos_arm64' ;; 'osx64' ) if require_osx_version "10.13"; then hash="${osx64_hash}" pkg='macos_x86_64' else err_no_binary "${ARCH}, OS X < 10.13" fi ;; * ) err_no_binary "${ARCH}" ;; esac local basever="pypy${PYVER}-v${VERSION}" local baseurl="https://downloads.python.org/pypy/${basever}" # result - command, package dir, url+hash echo "${cmd}" "${basever}-${pkg}" "${baseurl}-${pkg}.${ext}#${hash}" } # determine command, package directory, url+hash declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" # install ${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip_lt21' pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy2.7-7.3.19-src000066400000000000000000000011401517431316200266050ustar00rootroot00000000000000VERSION='7.3.19' PYVER='2.7' # https://www.pypy.org/checksums.html hash=8703cdcb01f9f82966dd43b6a6018f140399db51ebb43c125c1f9a215e7bb003 ### end of manual settings - following lines same for every download ver="pypy${PYVER}-v${VERSION}-src" url="https://downloads.python.org/pypy/${ver}.tar.bz2" prefer_openssl11 install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip_lt21' pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy2.7-7.3.2000066400000000000000000000035421517431316200257400ustar00rootroot00000000000000VERSION='7.3.2' PYVER='2.7' case "$(pypy_architecture 2>/dev/null || true)" in "linux" ) install_package "pypy${PYVER}-v${VERSION}-linux32" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-linux32.tar.bz2#78f30ac17abe3cc077fc2456ef55adb51b052c5126011b2a32bacc858acaca7d" "pypy" "verify_py${PYVER//./}" ensurepip ;; "linux64" ) install_package "pypy${PYVER}-v${VERSION}-linux64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-linux64.tar.bz2#8d4f08116a97153a0f739de8981874d544b564cbc87dd064cca33f36c29da13b" "pypy" "verify_py${PYVER//./}" ensurepip ;; "linux-aarch64" ) install_package "pypy${PYVER}-v${VERSION}-aarch64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-aarch64.tar.bz2#fce1f06f20ab8bcacb9ac1c33572d6425033de53c3a93fbd5391189cc3e106cb" "pypy" "verify_py${PYVER//./}" ensurepip ;; "osx64" ) if require_osx_version "10.13"; then install_package "pypy${PYVER}-v${VERSION}-osx64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-osx64.tar.bz2#10ca57050793923aea3808b9c8669cf53b7342c90c091244e9660bf797d397c7" "pypy" "verify_py${PYVER//./}" ensurepip else { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true), OS X < 10.13." echo "try 'pypy${PYVER}-${VERSION}-src' to build from source." echo } >&2 exit 1 fi ;; "win32" ) install_zip "pypy${PYVER}-v${VERSION}-win32" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-win32.zip#0fd62265e0421a02432f10a294a712a5e784a8e061375e6d8ea5fd619be1be62" "pypy" "verify_py${PYVER//./}" ensurepip ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." echo "try 'pypy${PYVER}-${VERSION}-src' to build from source." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy2.7-7.3.2-src000066400000000000000000000006341517431316200265240ustar00rootroot00000000000000prefer_openssl11 install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl install_package "pypy2.7-v7.3.2-src" "https://downloads.python.org/pypy/pypy2.7-v7.3.2-src.tar.bz2#8189480d8350ad6364d05c2b39fd7d832644d4b1cd018f785126389df45928d1" "pypy_builder" verify_py27 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy2.7-7.3.20000066400000000000000000000041641517431316200260210ustar00rootroot00000000000000VERSION='7.3.20' PYVER='2.7' # https://www.pypy.org/checksums.html aarch64_hash=f22a1be607deeaa4f9be6bc63aae09fe4fb5b990d6a23aa4e7c5960dc5d93c96 linux32_hash=9d554c5efcb6ef80146bb82965f5d8404d6848e6f04b25c378852a095768a69c linux64_hash=aa3bb92dbb529fa2d4920895b16d67a810b0c709207857d56cfe4a6e3b41e02a osarm64_hash=be3ffbb243316b1ffbf63ac60d72e099d5b64702e4429eeeb18a0608fb3b8dcc osx64_hash=9e7cf34e9d4c8d890439fcd10b09a2c0825d8709c63dd4cbf85645711bfb15b7 ### end of manual settings - following lines same for every download function err_no_binary { local archmsg="${1}" local ver="pypy${PYVER}-v${VERSION}-src" local url="https://downloads.python.org/pypy/${ver}.tar.bz2" { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for ${archmsg}." echo "try '${url}' to build from source." echo } >&2 exit 1 } function pypy_pkg_data { # pypy architecture tag local ARCH="${1}" # defaults local cmd='install_package' # use bz2 local pkg="${ARCH}" # assume matches local ext='tar.bz2' local hash='' # undefined # select the hash, fix pkg if not match ARCH case "${ARCH}" in 'linux-aarch64' ) hash="${aarch64_hash}" pkg='aarch64' ;; 'linux' ) hash="${linux32_hash}" pkg='linux32' ;; 'linux64' ) hash="${linux64_hash}" ;; 'osarm64' ) hash="${osarm64_hash}" pkg='macos_arm64' ;; 'osx64' ) if require_osx_version "10.13"; then hash="${osx64_hash}" pkg='macos_x86_64' else err_no_binary "${ARCH}, OS X < 10.13" fi ;; * ) err_no_binary "${ARCH}" ;; esac local basever="pypy${PYVER}-v${VERSION}" local baseurl="https://downloads.python.org/pypy/${basever}" # result - command, package dir, url+hash echo "${cmd}" "${basever}-${pkg}" "${baseurl}-${pkg}.${ext}#${hash}" } # determine command, package directory, url+hash declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" # install ${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip_lt21' pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy2.7-7.3.20-src000066400000000000000000000011401517431316200265750ustar00rootroot00000000000000VERSION='7.3.20' PYVER='2.7' # https://www.pypy.org/checksums.html hash=bf958498445f7bf78338723c8d86bd6711e8792461725d2481df77a9566a3e62 ### end of manual settings - following lines same for every download ver="pypy${PYVER}-v${VERSION}-src" url="https://downloads.python.org/pypy/${ver}.tar.bz2" prefer_openssl11 install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip_lt21' pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy2.7-7.3.3000066400000000000000000000035421517431316200257410ustar00rootroot00000000000000VERSION='7.3.3' PYVER='2.7' case "$(pypy_architecture 2>/dev/null || true)" in "linux" ) install_package "pypy${PYVER}-v${VERSION}-linux32" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-linux32.tar.bz2#bfbc81874b137837a8ba8c517b97de29f5a336f7ec500c52f2bfdbd3580d1703" "pypy" "verify_py${PYVER//./}" ensurepip ;; "linux64" ) install_package "pypy${PYVER}-v${VERSION}-linux64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-linux64.tar.bz2#f412b602ccd6912ddee0e7523e0e38f4b2c7a144449c2cad078cffbdb66fd7b1" "pypy" "verify_py${PYVER//./}" ensurepip ;; "linux-aarch64" ) install_package "pypy${PYVER}-v${VERSION}-aarch64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-aarch64.tar.bz2#23b145b7cfbaeefb6ee76fc8216c83b652ab1daffac490558718edbbd60082d8" "pypy" "verify_py${PYVER//./}" ensurepip ;; "osx64" ) if require_osx_version "10.13"; then install_package "pypy${PYVER}-v${VERSION}-osx64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-osx64.tar.bz2#f34dc4f5ded1f6bcea05841aa9781b9307329e3ab755607917148568824ae0b0" "pypy" "verify_py${PYVER//./}" ensurepip else { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true), OS X < 10.13." echo "try 'pypy${PYVER}-${VERSION}-src' to build from source." echo } >&2 exit 1 fi ;; "win32" ) install_zip "pypy${PYVER}-v${VERSION}-win32" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-win32.zip#b3e660dae8d25d8278fd6a0db77e76a16ac9a8c1dca22e7e103d39ed696dc69e" "pypy" "verify_py${PYVER//./}" ensurepip ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." echo "try 'pypy${PYVER}-${VERSION}-src' to build from source." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy2.7-7.3.3-src000066400000000000000000000006341517431316200265250ustar00rootroot00000000000000prefer_openssl11 install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl install_package "pypy2.7-v7.3.3-src" "https://downloads.python.org/pypy/pypy2.7-v7.3.3-src.tar.bz2#f63488051ba877fd65840bf8d53822a9c6423d947839023b8720139f4b6e2336" "pypy_builder" verify_py27 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy2.7-7.3.4000066400000000000000000000035421517431316200257420ustar00rootroot00000000000000VERSION='7.3.4' PYVER='2.7' case "$(pypy_architecture 2>/dev/null || true)" in "linux" ) install_package "pypy${PYVER}-v${VERSION}-linux32" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-linux32.tar.bz2#653cc3f0612399e494021027f4463d62639dffa4345736a16d0704f3f8a61d5f" "pypy" "verify_py${PYVER//./}" ensurepip ;; "linux64" ) install_package "pypy${PYVER}-v${VERSION}-linux64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-linux64.tar.bz2#d3f7b0625e770d9be62201765d7d2316febc463372fba9c93a12969d26ae03dd" "pypy" "verify_py${PYVER//./}" ensurepip ;; "linux-aarch64" ) install_package "pypy${PYVER}-v${VERSION}-aarch64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-aarch64.tar.bz2#9e741162ce486b14fbcf5aa377796d26b0529a9352fb602ee8b66c005f8420d1" "pypy" "verify_py${PYVER//./}" ensurepip ;; "osx64" ) if require_osx_version "10.13"; then install_package "pypy${PYVER}-v${VERSION}-osx64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-osx64.tar.bz2#ee7bf42ce843596521e02c763408a5164d18f23c9617f1b8e032ce0675686582" "pypy" "verify_py${PYVER//./}" ensurepip else { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true), OS X < 10.13." echo "try 'pypy${PYVER}-${VERSION}-src' to build from source." echo } >&2 exit 1 fi ;; "win32" ) install_zip "pypy${PYVER}-v${VERSION}-win32" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-win32.zip#1080012d7a3cea65182528259b51d52b1f61a3717377c2d9ba11ef36e06162d5" "pypy" "verify_py${PYVER//./}" ensurepip ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." echo "try 'pypy${PYVER}-${VERSION}-src' to build from source." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy2.7-7.3.4-src000066400000000000000000000006341517431316200265260ustar00rootroot00000000000000prefer_openssl11 install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl install_package "pypy2.7-v7.3.4-src" "https://downloads.python.org/pypy/pypy2.7-v7.3.4-src.tar.bz2#ff9b928237767efe08ccfba79dae489519b3c768fb6e3af52d39c2a8a1c21ca4" "pypy_builder" verify_py27 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy2.7-7.3.5000066400000000000000000000035421517431316200257430ustar00rootroot00000000000000VERSION='7.3.5' PYVER='2.7' case "$(pypy_architecture 2>/dev/null || true)" in "linux" ) install_package "pypy${PYVER}-v${VERSION}-linux32" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-linux32.tar.bz2#35bb5cb1dcca8e05dc58ba0a4b4d54f8b4787f24dfc93f7562f049190e4f0d94" "pypy" "verify_py${PYVER//./}" ensurepip ;; "linux64" ) install_package "pypy${PYVER}-v${VERSION}-linux64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-linux64.tar.bz2#4858b347801fba3249ad90af015b3aaec9d57f54d038a58d806a1bd3217d5150" "pypy" "verify_py${PYVER//./}" ensurepip ;; "linux-aarch64" ) install_package "pypy${PYVER}-v${VERSION}-aarch64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-aarch64.tar.bz2#8dc2c753f8a94eca1a304d7736c99b439c09274f492eaa3446770c6c32ed010e" "pypy" "verify_py${PYVER//./}" ensurepip ;; "osx64" ) if require_osx_version "10.13"; then install_package "pypy${PYVER}-v${VERSION}-osx64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-osx64.tar.bz2#8b10442ef31c3b28048816f858adde6d6858a190d9367001a49648e669cbebb6" "pypy" "verify_py${PYVER//./}" ensurepip else { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true), OS X < 10.13." echo "try 'pypy${PYVER}-${VERSION}-src' to build from source." echo } >&2 exit 1 fi ;; "win32" ) install_zip "pypy${PYVER}-v${VERSION}-win32" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-win32.zip#0b90eded11ba89a526c4288f17fff7e75000914ac071bd6d67912748ae89d761" "pypy" "verify_py${PYVER//./}" ensurepip ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." echo "try 'pypy${PYVER}-${VERSION}-src' to build from source." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy2.7-7.3.5-src000066400000000000000000000006341517431316200265270ustar00rootroot00000000000000prefer_openssl11 install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl install_package "pypy2.7-v7.3.5-src" "https://downloads.python.org/pypy/pypy2.7-v7.3.5-src.tar.bz2#c0444fd9873058c1c0d99e13a934e92285cb05992c9968bf523c32bf9bec0a9d" "pypy_builder" verify_py27 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy2.7-7.3.6000066400000000000000000000035421517431316200257440ustar00rootroot00000000000000VERSION='7.3.6' PYVER='2.7' case "$(pypy_architecture 2>/dev/null || true)" in "linux" ) install_package "pypy${PYVER}-v${VERSION}-linux32" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-linux32.tar.bz2#7a1145f3a278ffab4da0e2d4c4bd024ab8d67106a502e4bb7f6d67337e7af2b7" "pypy" "verify_py${PYVER//./}" ensurepip ;; "linux64" ) install_package "pypy${PYVER}-v${VERSION}-linux64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-linux64.tar.bz2#82127f43fae6ce75d47d6c4539f8c1ea372e9c2dbfa40fae8b58351d522793a4" "pypy" "verify_py${PYVER//./}" ensurepip ;; "linux-aarch64" ) install_package "pypy${PYVER}-v${VERSION}-aarch64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-aarch64.tar.bz2#90e9aafb310314938f54678d4d6d7db1163b57c9343e640b447112f74d7f9151" "pypy" "verify_py${PYVER//./}" ensurepip ;; "osx64" ) if require_osx_version "10.13"; then install_package "pypy${PYVER}-v${VERSION}-osx64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-osx64.tar.bz2#9a97de82037d4be1949ec0c35a4d638ba635e8b34948549ae2fa08abd2cbaa8c" "pypy" "verify_py${PYVER//./}" ensurepip else { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true), OS X < 10.13." echo "try 'pypy${PYVER}-${VERSION}-src' to build from source." echo } >&2 exit 1 fi ;; "win32" ) install_zip "pypy${PYVER}-v${VERSION}-win32" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-win32.zip#fcc8f6b3b472a77eaa754951f288fe234b4953bfba845888dd839b9b862cb891" "pypy" "verify_py${PYVER//./}" ensurepip ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." echo "try 'pypy${PYVER}-${VERSION}-src' to build from source." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy2.7-7.3.6-src000066400000000000000000000006341517431316200265300ustar00rootroot00000000000000prefer_openssl11 install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl install_package "pypy2.7-v7.3.6-src" "https://downloads.python.org/pypy/pypy2.7-v7.3.6-src.tar.bz2#0114473c8c57169cdcab1a69c60ad7fef7089731fdbe6f46af55060b29be41e4" "pypy_builder" verify_py27 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy2.7-7.3.8000066400000000000000000000047201517431316200257450ustar00rootroot00000000000000VERSION='7.3.8' PYVER='2.7' # https://www.pypy.org/checksums.html aarch64_hash=ca1f8d3146c83002ee97615906b0930e821297dcce3063b5b28933a0690ef298 linux32_hash=7c84f173bbcd73d0eb10909259d11b5cc253d4c6ea4492e6da8f2532df9b3da5 linux64_hash=1f2e84fb539ffce233c34769d2f11647955f894be091e85419e05f48011e8940 osx64_hash=e5c1ff39ad9916ea23e3deb8012fe42367b6b19284cf13b1a1ea2b2f53a43add s390x_hash=b4ae4e708ba84602d976ad6ae391ef2eef4b1896d831b8f2b2ec69927dd92014 win64_hash=806a29a6c5550b1e669d8870683d3379138d3d43eb1e07bdf26d65a0691265f2 ### end of manual settings - following lines same for every download function pypy_pkg_data { # pypy architecture local ARCH="${1}" local basesrc="pypy${PYVER}-${VERSION}-src" local basever="pypy${PYVER}-v${VERSION}" local baseurl="https://downloads.python.org/pypy/${basever}" # defaults local cmd='install_package' # use bz2 local pkg="${ARCH}" # assume matches local url="${baseurl}-${pkg}.tar.bz2" # use bz2 local hash='' # undefined case "${pkg}" in 'linux-aarch64' ) hash="${aarch64_hash}" url="${baseurl}-aarch64.tar.bz2" # diff url ;; 'linux' ) hash="${linux32_hash}" pkg='linux32' # package name revised url="${baseurl}-${pkg}.tar.bz2" # new url ;; 'linux64' ) hash="${linux64_hash}" ;; 'osx64' ) if require_osx_version "10.13"; then hash="${osx64_hash}" else { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true), OS X < 10.13." echo "try '${basesrc}' to build from source." echo } >&2 exit 1 fi ;; 's390x' ) hash="${s390x_hash}" ;; 'win64' ) hash="${win64_hash}" cmd='install_zip' # diff command url="${baseurl}-${pkg}.zip" # zip rather than bz2 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." echo "try '${basesrc}' to build from source." echo } >&2 exit 1 ;; esac # result - command, package dir, url+hash echo "${cmd}" "${basever}-${pkg}" "${url}#${hash}" } # determine command, package directory, url+hash declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" # install ${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip' pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy2.7-7.3.8-src000066400000000000000000000011321517431316200265240ustar00rootroot00000000000000VERSION='7.3.8' PYVER='2.7' # https://www.pypy.org/checksums.html hash=0cdad270c62d3ccc53cc87eeb069a6dc46acaf95521b584624bcd6697d94fa1c ### end of manual settings - following lines same for every download ver="pypy${PYVER}-v${VERSION}-src" url="https://downloads.python.org/pypy/${ver}.tar.bz2" prefer_openssl11 install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip' pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy2.7-7.3.9000066400000000000000000000044651517431316200257540ustar00rootroot00000000000000VERSION='7.3.9' PYVER='2.7' # https://www.pypy.org/checksums.html aarch64_hash=aff4e4dbab53448f662cd01acb2251571d60f836d2f48382a7d8da54ca5b3442 linux32_hash=bbf4e7343d43c8217099a9bffeed6a1781f4b5a3e186ed1a0befca65e647aeb9 linux64_hash=172a928b0096a7e00b7d58f523f57300c35c3de7f822491e2a7bc845375c23f8 osx64_hash=77314f5a6b2cc35d24e6f952bef89f5da612b90e4127a8034aed708d9ae483c4 s390x_hash=62481dd3c6472393ca05eb3a0880c96e4f5921747157607dbaa772a7369cab77 win64_hash=ca7b0f4c576995b388cfb4c796e3f6f20b037e5314571bf267daa068a3a2af31 ### end of manual settings - following lines same for every download function err_no_binary { local archmsg="${1}" local ver="pypy${PYVER}-v${VERSION}-src" local url="https://downloads.python.org/pypy/${ver}.tar.bz2" { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for ${archmsg}." echo "try '${url}' to build from source." echo } >&2 exit 1 } function pypy_pkg_data { # pypy architecture tag local ARCH="${1}" # defaults local cmd='install_package' # use bz2 local pkg="${ARCH}" # assume matches local ext='tar.bz2' # windows is always diff... local hash='' # undefined # select the hash, fix pkg if not match ARCH, windows has ext of zip case "${ARCH}" in 'linux-aarch64' ) hash="${aarch64_hash}" pkg='aarch64' ;; 'linux' ) hash="${linux32_hash}" pkg='linux32' ;; 'linux64' ) hash="${linux64_hash}" ;; 'osx64' ) if require_osx_version "10.13"; then hash="${osx64_hash}" else err_no_binary "${ARCH}, OS X < 10.13" fi ;; 's390x' ) hash="${s390x_hash}" ;; 'win64' ) hash="${win64_hash}" cmd='install_zip' # diff command ext='zip' # zip rather than bz2 ;; * ) err_no_binary "${ARCH}" ;; esac local basever="pypy${PYVER}-v${VERSION}" local baseurl="https://downloads.python.org/pypy/${basever}" # result - command, package dir, url+hash echo "${cmd}" "${basever}-${pkg}" "${baseurl}-${pkg}.${ext}#${hash}" } # determine command, package directory, url+hash declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" # install ${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip' pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy2.7-7.3.9-src000066400000000000000000000011321517431316200265250ustar00rootroot00000000000000VERSION='7.3.9' PYVER='2.7' # https://www.pypy.org/checksums.html hash=39b0972956f6548ce5828019dbae12503c32d6cbe91a2becf88d3e42cc52197b ### end of manual settings - following lines same for every download ver="pypy${PYVER}-v${VERSION}-src" url="https://downloads.python.org/pypy/${ver}.tar.bz2" prefer_openssl11 install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip' pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3-2.3.1000066400000000000000000000053041517431316200255640ustar00rootroot00000000000000case "$(pypy_architecture 2>/dev/null || true)" in "linux" ) if require_distro "Ubuntu 10.04" 1>/dev/null 2>&1; then install_package "pypy3-2.3.1-linux" "https://downloads.python.org/pypy/pypy3-2.3.1-linux.tar.bz2#7eddc6826e58c9c89e68b59ec8caf1596b76401517ad8d26ad5e18e0ffa45db9" "pypy" verify_py32 ensurepip else install_package "pypy3-2.3.1-linux_i686-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy3-2.3.1-linux_i686-portable.tar.bz2#32a5b3fd4299b13aedf7bc6262eee0f6be9a27744ccf787718553d973ec38abb" "pypy" verify_py32 ensurepip fi ;; "linux-armel" ) require_distro "Ubuntu 12.04" || true install_package "pypy3-2.3.1-linux-armel" "https://downloads.python.org/pypy/pypy3-2.3.1-linux-armel.tar.bz2#37ccdc68df322ba1bafe4177593b4ca293d1fffd60d72f2cf2326d090677f04f" "pypy" verify_py32 ensurepip ;; "linux-armhf") if [[ "$(cat /etc/issue 2>/dev/null || true)" == "Raspbian"* ]]; then install_package "pypy3-2.3.1-linux-armhf-raspbian" "https://downloads.python.org/pypy/pypy3-2.3.1-linux-armhf-raspbian.tar.bz2#033ccca1e3d7156d05ca8accd58b6371e15efc17468bbc3f963625b0c829b66b" "pypy" verify_py32 ensurepip else require_distro "Ubuntu 13.04" || true install_package "pypy3-2.3.1-linux-armhf-raring" "https://downloads.python.org/pypy/pypy3-2.3.1-linux-armhf-raring.tar.bz2#bd7c19bde4b18158da42534a677f27c9b23855968e7cc3d4178cc9d1620a250a" "pypy" verify_py32 ensurepip fi ;; "linux64" ) if require_distro "Ubuntu 12.04" 1>/dev/null 2>&1; then install_package "pypy3-2.3.1-linux64" "https://downloads.python.org/pypy/pypy3-2.3.1-linux64.tar.bz2#303df2cf4766db20ec77786d9091dce284fdab01d7173c5828a35e86bc931b99" "pypy" verify_py32 ensurepip else install_package "pypy3-2.3.1-linux_x86_64-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy3-2.3.1-linux_x86_64-portable.tar.bz2#cb56b5bde8f444d44a0ea9cd475ddeed00aa895f3dcc89fd37577a51439540aa" "pypy" verify_py32 ensurepip fi ;; "osx64" ) install_package "pypy3-2.3.1-osx64" "https://downloads.python.org/pypy/pypy3-2.3.1-osx64.tar.bz2#600d4dad2039b8035582c0e0ce9b71e8236d95db26cff48c84c6d1e0ea6814c1" "pypy" verify_py32 ensurepip ;; "win32" ) # FIXME: never tested on Windows install_zip "pypy3-2.3.1-win32" "https://downloads.python.org/pypy/pypy3-2.3.1-win32.zip#3f3566a39100da9b0fb730ff629352b48c5ae322546fce2c528c58fc0a652b26" "pypy" verify_py32 ensurepip ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." echo "try 'pypy3-2.3.1-src' to build from source." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3-2.3.1-src000066400000000000000000000006401517431316200263470ustar00rootroot00000000000000prefer_openssl11 install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl install_package "pypy3-2.3.1-src" "https://downloads.python.org/pypy/pypy3-2.3.1-src.tar.bz2#924ca36bf85e02469c71d451c145f9a6d19b905df473a3d1c25179c63ea79d74" "pypy_builder" verify_py32 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3-2.4.0000066400000000000000000000053701517431316200255670ustar00rootroot00000000000000case "$(pypy_architecture 2>/dev/null || true)" in "linux" ) if require_distro "Ubuntu 10.04" 1>/dev/null 2>&1; then install_package "pypy3-2.4.0-linux" "https://downloads.python.org/pypy/pypy3-2.4.0-linux.tar.bz2#108fdcccfddb9b2cb2fc3cbca5e6f7902ed3ab74a24c8ae29da7fbdadbab4345" "pypy" verify_py32 ensurepip else install_package "pypy3-2.4-linux_i686-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy3-2.4-linux_i686-portable.tar.bz2#7ce050b4928dc58f7e9dd01e3e48c443c85616ca83f4bcc9147f1078d0fd126c" "pypy" verify_py32 ensurepip fi ;; "linux-armel" ) require_distro "Ubuntu 12.04" "Ubuntu 12.10" "Ubuntu 13.04" "Ubuntu 13.10" "Ubuntu 14.04" || true install_package "pypy3-2.4.0-linux-armel" "https://downloads.python.org/pypy/pypy3-2.4.0-linux-armel.tar.bz2#322ddc863006a97d48edc302a73bb0981bbc142951237ed161ca0ca2cd02831f" "pypy" verify_py32 ensurepip ;; "linux-armhf") if [[ "$(cat /etc/issue 2>/dev/null || true)" == "Raspbian"* ]]; then install_package "pypy3-2.4.0-linux-armhf-raspbian" "https://downloads.python.org/pypy/pypy3-2.4.0-linux-armhf-raspbian.tar.bz2#ad8f00255c85bf3c1012d56d5638c7aee12bc9f1ddcdaad35985bbd65a16c602" "pypy" verify_py32 ensurepip else require_distro "Ubuntu 13.04" || true install_package "pypy3-2.4.0-linux-armhf-raring" "https://downloads.python.org/pypy/pypy3-2.4.0-linux-armhf-raring.tar.bz2#eb41a3ee62741199aeeab818553ded460db991911609acf36e5710f491e5ac0a" "pypy" verify_py32 ensurepip fi ;; "linux64" ) if require_distro "Ubuntu 12.04" 1>/dev/null 2>&1; then install_package "pypy3-2.4.0-linux64" "https://downloads.python.org/pypy/pypy3-2.4.0-linux64.tar.bz2#24e680b1742af7361107876a421dd793f5ef852dd5f097546f84b1378f7f70cc" "pypy" verify_py32 ensurepip else install_package "pypy3-2.4-linux_x86_64-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy3-2.4-linux_x86_64-portable.tar.bz2#7b3e0f0bc924bd0d68d85c0b566979e74a2b366595db3d81502267367370a5fb" "pypy" verify_py32 ensurepip fi ;; "osx64" ) install_package "pypy3-2.4.0-osx64" "https://downloads.python.org/pypy/pypy3-2.4.0-osx64.tar.bz2#dcd86bdb753e93dbf55e1f3af3ffa97eea328b8b77aa60e92ea2260a6258cedb" "pypy" verify_py32 ensurepip ;; "win32" ) # FIXME: never tested on Windows install_zip "pypy3-2.4.0-win32" "https://downloads.python.org/pypy/pypy3-2.4.0-win32.zip#7ea499993b07405898dee9435836220d8c7b8abfa1b1f760c4a1c04b43945797" "pypy" verify_py32 ensurepip ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." echo "try 'pypy3-2.4.0-src' to build from source." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3-2.4.0-src000066400000000000000000000006401517431316200263470ustar00rootroot00000000000000prefer_openssl11 install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl install_package "pypy3-2.4.0-src" "https://downloads.python.org/pypy/pypy3-2.4.0-src.tar.bz2#d9ba207d6eecf8a0dc4414e9f4e92db1abd143e8cc6ec4a6bdcac75b29f104f3" "pypy_builder" verify_py32 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.10-7.3.12000066400000000000000000000043561517431316200261000ustar00rootroot00000000000000VERSION='7.3.12' PYVER='3.10' # https://www.pypy.org/checksums.html aarch64_hash=26208b5a134d9860a08f74cce60960005758e82dc5f0e3566a48ed863a1f16a1 linux32_hash=811667825ae58ada4b7c3d8bc1b5055b9f9d6a377e51aedfbe0727966603f60e linux64_hash=6c577993160b6f5ee8cab73cd1a807affcefafe2f7441c87bd926c10505e8731 osarm64_hash=45671b1e9437f95ccd790af10dbeb57733cca1ed9661463b727d3c4f5caa7ba0 osx64_hash=dbc15d8570560d5f79366883c24bc42231a92855ac19a0f28cb0adeb11242666 s390x_hash=043c13a585479428b463ab69575a088db74aadc16798d6e677d97f563585fee3 ### end of manual settings - following lines same for every download function err_no_binary { local archmsg="${1}" local ver="pypy${PYVER}-v${VERSION}-src" local url="https://downloads.python.org/pypy/${ver}.tar.bz2" { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for ${archmsg}." echo "try '${url}' to build from source." echo } >&2 exit 1 } function pypy_pkg_data { # pypy architecture tag local ARCH="${1}" # defaults local cmd='install_package' # use bz2 local pkg="${ARCH}" # assume matches local ext='tar.bz2' local hash='' # undefined # select the hash, fix pkg if not match ARCH case "${ARCH}" in 'linux-aarch64' ) hash="${aarch64_hash}" pkg='aarch64' ;; 'linux' ) hash="${linux32_hash}" pkg='linux32' ;; 'linux64' ) hash="${linux64_hash}" ;; 'osarm64' ) hash="${osarm64_hash}" pkg='macos_arm64' ;; 'osx64' ) if require_osx_version "10.13"; then hash="${osx64_hash}" pkg='macos_x86_64' else err_no_binary "${ARCH}, OS X < 10.13" fi ;; 's390x' ) hash="${s390x_hash}" ;; * ) err_no_binary "${ARCH}" ;; esac local basever="pypy${PYVER}-v${VERSION}" local baseurl="https://downloads.python.org/pypy/${basever}" # result - command, package dir, url+hash echo "${cmd}" "${basever}-${pkg}" "${baseurl}-${pkg}.${ext}#${hash}" } # determine command, package directory, url+hash declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" # install ${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip' pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.10-7.3.12-src000066400000000000000000000011341517431316200266540ustar00rootroot00000000000000VERSION='7.3.12' PYVER='3.10' # https://www.pypy.org/checksums.html hash=86e4e4eacc36046c6182f43018796537fe33a60e1d2a2cc6b8e7f91a5dcb3e42 ### end of manual settings - following lines same for every download ver="pypy${PYVER}-v${VERSION}-src" url="https://downloads.python.org/pypy/${ver}.tar.bz2" prefer_openssl11 install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip' pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.10-7.3.13000066400000000000000000000043561517431316200261010ustar00rootroot00000000000000VERSION='7.3.13' PYVER='3.10' # https://www.pypy.org/checksums.html aarch64_hash=ac476f01c9653358404f2e4b52f62307b2f64ccdb8c96dadcbfe355824d81a63 linux32_hash=bfba57eb1f859dd0ad0d6fe841bb12e1256f1f023c7fbca083b536cccbc1233b linux64_hash=54936eeafd9350a5ea0375b036272a260871b9bca82e1b0bb3201deea9f5a442 osarm64_hash=efb3007b7aace0af6e3b30d381088a5bbc175973a6627b6b0d624a2ca2dc63ce osx64_hash=2c6238b9ece7b94ffdfd1d9b50619edef4b169a5c78adcdb691fce6709cd6610 s390x_hash=3c813c7efa6a026b281313b299c186c585155fc164c7538e65d41efdabff87c9 ### end of manual settings - following lines same for every download function err_no_binary { local archmsg="${1}" local ver="pypy${PYVER}-v${VERSION}-src" local url="https://downloads.python.org/pypy/${ver}.tar.bz2" { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for ${archmsg}." echo "try '${url}' to build from source." echo } >&2 exit 1 } function pypy_pkg_data { # pypy architecture tag local ARCH="${1}" # defaults local cmd='install_package' # use bz2 local pkg="${ARCH}" # assume matches local ext='tar.bz2' local hash='' # undefined # select the hash, fix pkg if not match ARCH case "${ARCH}" in 'linux-aarch64' ) hash="${aarch64_hash}" pkg='aarch64' ;; 'linux' ) hash="${linux32_hash}" pkg='linux32' ;; 'linux64' ) hash="${linux64_hash}" ;; 'osarm64' ) hash="${osarm64_hash}" pkg='macos_arm64' ;; 'osx64' ) if require_osx_version "10.13"; then hash="${osx64_hash}" pkg='macos_x86_64' else err_no_binary "${ARCH}, OS X < 10.13" fi ;; 's390x' ) hash="${s390x_hash}" ;; * ) err_no_binary "${ARCH}" ;; esac local basever="pypy${PYVER}-v${VERSION}" local baseurl="https://downloads.python.org/pypy/${basever}" # result - command, package dir, url+hash echo "${cmd}" "${basever}-${pkg}" "${baseurl}-${pkg}.${ext}#${hash}" } # determine command, package directory, url+hash declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" # install ${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip' pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.10-7.3.13-src000066400000000000000000000011341517431316200266550ustar00rootroot00000000000000VERSION='7.3.13' PYVER='3.10' # https://www.pypy.org/checksums.html hash=4ac1733c19d014d3193c804e7f40ffccbf6924bcaaee1b6089b82b9bf9353a6d ### end of manual settings - following lines same for every download ver="pypy${PYVER}-v${VERSION}-src" url="https://downloads.python.org/pypy/${ver}.tar.bz2" prefer_openssl11 install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip' pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.10-7.3.14000066400000000000000000000043561517431316200261020ustar00rootroot00000000000000VERSION='7.3.14' PYVER='3.10' # https://www.pypy.org/checksums.html aarch64_hash=fbef65dfc69dcd6006d843553d268b331f1b13dfc3938492bd35f0f477b5bcf4 linux32_hash=d37e7c7a03bed5dceca2ab7f821ad7655808cccf6908155f78f0effd811b7f4f linux64_hash=a83879891dc0a6c1504da0954fba1125b21a2591782897231a8168100ea72b94 osarm64_hash=0f09584e21ed8f45e8ff1e3dd1582f077ebdd23a1068298f45006f67bc692632 osx64_hash=31ce62b7ea3b5b5bde68241ae9404f0a68f5a7d0094ef651062b7a64caecfd4e s390x_hash=363e87ad3b6547cc68981c665cf049449bed44cf9e49cabbbcc61df73ea2d40b ### end of manual settings - following lines same for every download function err_no_binary { local archmsg="${1}" local ver="pypy${PYVER}-v${VERSION}-src" local url="https://downloads.python.org/pypy/${ver}.tar.bz2" { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for ${archmsg}." echo "try '${url}' to build from source." echo } >&2 exit 1 } function pypy_pkg_data { # pypy architecture tag local ARCH="${1}" # defaults local cmd='install_package' # use bz2 local pkg="${ARCH}" # assume matches local ext='tar.bz2' local hash='' # undefined # select the hash, fix pkg if not match ARCH case "${ARCH}" in 'linux-aarch64' ) hash="${aarch64_hash}" pkg='aarch64' ;; 'linux' ) hash="${linux32_hash}" pkg='linux32' ;; 'linux64' ) hash="${linux64_hash}" ;; 'osarm64' ) hash="${osarm64_hash}" pkg='macos_arm64' ;; 'osx64' ) if require_osx_version "10.13"; then hash="${osx64_hash}" pkg='macos_x86_64' else err_no_binary "${ARCH}, OS X < 10.13" fi ;; 's390x' ) hash="${s390x_hash}" ;; * ) err_no_binary "${ARCH}" ;; esac local basever="pypy${PYVER}-v${VERSION}" local baseurl="https://downloads.python.org/pypy/${basever}" # result - command, package dir, url+hash echo "${cmd}" "${basever}-${pkg}" "${baseurl}-${pkg}.${ext}#${hash}" } # determine command, package directory, url+hash declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" # install ${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip' pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.10-7.3.14-src000066400000000000000000000011341517431316200266560ustar00rootroot00000000000000VERSION='7.3.14' PYVER='3.10' # https://www.pypy.org/checksums.html hash=a3481af466103fa13740db4e27780e0423dcf8626b3340f60d3d3c28fbc11ae0 ### end of manual settings - following lines same for every download ver="pypy${PYVER}-v${VERSION}-src" url="https://downloads.python.org/pypy/${ver}.tar.bz2" prefer_openssl11 install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip' pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.10-7.3.15000066400000000000000000000043561517431316200261030ustar00rootroot00000000000000VERSION='7.3.15' PYVER='3.10' # https://www.pypy.org/checksums.html aarch64_hash=52146fccaf64e87e71d178dda8de63c01577ec3923073dc69e1519622bcacb74 linux32_hash=75dd58c9abd8b9d78220373148355bc3119febcf27a2c781d64ad85e7232c4aa linux64_hash=33c584e9a70a71afd0cb7dd8ba9996720b911b3b8ed0156aea298d4487ad22c3 osarm64_hash=d927c5105ea7880f7596fe459183e35cc17c853ef5105678b2ad62a8d000a548 osx64_hash=559b61ba7e7c5a5c23cef5370f1fab47ccdb939ac5d2b42b4bef091abe3f6964 s390x_hash=209e57596381e13c9914d1332f359dc4b78de06576739747eb797bdbf85062b8 ### end of manual settings - following lines same for every download function err_no_binary { local archmsg="${1}" local ver="pypy${PYVER}-v${VERSION}-src" local url="https://downloads.python.org/pypy/${ver}.tar.bz2" { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for ${archmsg}." echo "try '${url}' to build from source." echo } >&2 exit 1 } function pypy_pkg_data { # pypy architecture tag local ARCH="${1}" # defaults local cmd='install_package' # use bz2 local pkg="${ARCH}" # assume matches local ext='tar.bz2' local hash='' # undefined # select the hash, fix pkg if not match ARCH case "${ARCH}" in 'linux-aarch64' ) hash="${aarch64_hash}" pkg='aarch64' ;; 'linux' ) hash="${linux32_hash}" pkg='linux32' ;; 'linux64' ) hash="${linux64_hash}" ;; 'osarm64' ) hash="${osarm64_hash}" pkg='macos_arm64' ;; 'osx64' ) if require_osx_version "10.13"; then hash="${osx64_hash}" pkg='macos_x86_64' else err_no_binary "${ARCH}, OS X < 10.13" fi ;; 's390x' ) hash="${s390x_hash}" ;; * ) err_no_binary "${ARCH}" ;; esac local basever="pypy${PYVER}-v${VERSION}" local baseurl="https://downloads.python.org/pypy/${basever}" # result - command, package dir, url+hash echo "${cmd}" "${basever}-${pkg}" "${baseurl}-${pkg}.${ext}#${hash}" } # determine command, package directory, url+hash declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" # install ${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip' pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.10-7.3.15-src000066400000000000000000000011341517431316200266570ustar00rootroot00000000000000VERSION='7.3.15' PYVER='3.10' # https://www.pypy.org/checksums.html hash=837622130b36603a1893899bd9f529961a8e4a56c9eb67268d72ddf8920c9579 ### end of manual settings - following lines same for every download ver="pypy${PYVER}-v${VERSION}-src" url="https://downloads.python.org/pypy/${ver}.tar.bz2" prefer_openssl11 install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip' pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.10-7.3.16000066400000000000000000000043561517431316200261040ustar00rootroot00000000000000VERSION='7.3.16' PYVER='3.10' # https://www.pypy.org/checksums.html aarch64_hash=fc720999bc5050e1d3706b3b6445e695cf42bfc71ebc7c88ed6bb88828b1d385 linux32_hash=0df48aa780159e879ac89a805d143e4a6cd1b842f98046f5a3f865814bfaa2a4 linux64_hash=404e6180d6caf9258eaab0c02c72018e9aa8eb03ab9094a0ff17ee5e3b265ac1 osarm64_hash=6c003376667a95c7a228544649677b9927b8210d6444b901817aad24b8719b93 osx64_hash=490f2c6ba2489f405444f3b4ad42166da6e2eb73489a9535b206067eaaf21737 s390x_hash=af97efe498a209ba18c7bc7d084164a9907fb3736588b6864955177e19d5216a ### end of manual settings - following lines same for every download function err_no_binary { local archmsg="${1}" local ver="pypy${PYVER}-v${VERSION}-src" local url="https://downloads.python.org/pypy/${ver}.tar.bz2" { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for ${archmsg}." echo "try '${url}' to build from source." echo } >&2 exit 1 } function pypy_pkg_data { # pypy architecture tag local ARCH="${1}" # defaults local cmd='install_package' # use bz2 local pkg="${ARCH}" # assume matches local ext='tar.bz2' local hash='' # undefined # select the hash, fix pkg if not match ARCH case "${ARCH}" in 'linux-aarch64' ) hash="${aarch64_hash}" pkg='aarch64' ;; 'linux' ) hash="${linux32_hash}" pkg='linux32' ;; 'linux64' ) hash="${linux64_hash}" ;; 'osarm64' ) hash="${osarm64_hash}" pkg='macos_arm64' ;; 'osx64' ) if require_osx_version "10.13"; then hash="${osx64_hash}" pkg='macos_x86_64' else err_no_binary "${ARCH}, OS X < 10.13" fi ;; 's390x' ) hash="${s390x_hash}" ;; * ) err_no_binary "${ARCH}" ;; esac local basever="pypy${PYVER}-v${VERSION}" local baseurl="https://downloads.python.org/pypy/${basever}" # result - command, package dir, url+hash echo "${cmd}" "${basever}-${pkg}" "${baseurl}-${pkg}.${ext}#${hash}" } # determine command, package directory, url+hash declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" # install ${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip' pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.10-7.3.16-src000066400000000000000000000011341517431316200266600ustar00rootroot00000000000000VERSION='7.3.16' PYVER='3.10' # https://www.pypy.org/checksums.html hash=4a3a3177d0a1f51d59982bb981d1d485403bda3419d5437b9e077f55f59424ff ### end of manual settings - following lines same for every download ver="pypy${PYVER}-v${VERSION}-src" url="https://downloads.python.org/pypy/${ver}.tar.bz2" prefer_openssl11 install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip' pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.10-7.3.17000066400000000000000000000041601517431316200260760ustar00rootroot00000000000000VERSION='7.3.17' PYVER='3.10' # https://www.pypy.org/checksums.html aarch64_hash=53b6e5907df869c49e4eae7aca09fba16d150741097efb245892c1477d2395f2 linux32_hash=e534110e1047da37c1d586c392f74de3424f871d906a2083de6d41f2a8cc9164 linux64_hash=fdcdb9b24f1a7726003586503fdeb264fd68fc37fbfcea022dcfe825a7fee18b osarm64_hash=a050e25e8d686853dd5afc363e55625165825dacfb55f8753d8225ebe417cfd2 osx64_hash=6c2c5f2300d7564e711421b4968abd63243cb96f76e363975dd648ebf4a362ee ### end of manual settings - following lines same for every download function err_no_binary { local archmsg="${1}" local ver="pypy${PYVER}-v${VERSION}-src" local url="https://downloads.python.org/pypy/${ver}.tar.bz2" { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for ${archmsg}." echo "try '${url}' to build from source." echo } >&2 exit 1 } function pypy_pkg_data { # pypy architecture tag local ARCH="${1}" # defaults local cmd='install_package' # use bz2 local pkg="${ARCH}" # assume matches local ext='tar.bz2' local hash='' # undefined # select the hash, fix pkg if not match ARCH case "${ARCH}" in 'linux-aarch64' ) hash="${aarch64_hash}" pkg='aarch64' ;; 'linux' ) hash="${linux32_hash}" pkg='linux32' ;; 'linux64' ) hash="${linux64_hash}" ;; 'osarm64' ) hash="${osarm64_hash}" pkg='macos_arm64' ;; 'osx64' ) if require_osx_version "10.13"; then hash="${osx64_hash}" pkg='macos_x86_64' else err_no_binary "${ARCH}, OS X < 10.13" fi ;; * ) err_no_binary "${ARCH}" ;; esac local basever="pypy${PYVER}-v${VERSION}" local baseurl="https://downloads.python.org/pypy/${basever}" # result - command, package dir, url+hash echo "${cmd}" "${basever}-${pkg}" "${baseurl}-${pkg}.${ext}#${hash}" } # determine command, package directory, url+hash declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" # install ${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip' pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.10-7.3.17-src000066400000000000000000000011341517431316200266610ustar00rootroot00000000000000VERSION='7.3.17' PYVER='3.10' # https://www.pypy.org/checksums.html hash=6ad74bc578e9c6d3a8a1c51503313058e3c58c35df86f7485453c4be6ab24bf7 ### end of manual settings - following lines same for every download ver="pypy${PYVER}-v${VERSION}-src" url="https://downloads.python.org/pypy/${ver}.tar.bz2" prefer_openssl11 install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip' pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.10-7.3.18000066400000000000000000000041601517431316200260770ustar00rootroot00000000000000VERSION='7.3.18' PYVER='3.10' # https://www.pypy.org/checksums.html aarch64_hash=e843aecd48eb06b625af67891b99e3440313cfb64c6851fc37df1e5572c8ef9e linux32_hash=34ef09a481254aad0f22bf09fd7c99efb65ffef4f79f5b4222505f55f8d9c22e linux64_hash=834ccd4544bb47112a66977add7e47f30619f74061ae990876bcba95d98c27c5 osarm64_hash=1d47da22bc9f7b5329f97c9c7b3ee0b051252ff1e82ca76999ad2d44758be41f osx64_hash=b7031cbf815b7ba26ed2503b76ee3e73d7322b55f3671219019e8385042e212f ### end of manual settings - following lines same for every download function err_no_binary { local archmsg="${1}" local ver="pypy${PYVER}-v${VERSION}-src" local url="https://downloads.python.org/pypy/${ver}.tar.bz2" { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for ${archmsg}." echo "try '${url}' to build from source." echo } >&2 exit 1 } function pypy_pkg_data { # pypy architecture tag local ARCH="${1}" # defaults local cmd='install_package' # use bz2 local pkg="${ARCH}" # assume matches local ext='tar.bz2' local hash='' # undefined # select the hash, fix pkg if not match ARCH case "${ARCH}" in 'linux-aarch64' ) hash="${aarch64_hash}" pkg='aarch64' ;; 'linux' ) hash="${linux32_hash}" pkg='linux32' ;; 'linux64' ) hash="${linux64_hash}" ;; 'osarm64' ) hash="${osarm64_hash}" pkg='macos_arm64' ;; 'osx64' ) if require_osx_version "10.13"; then hash="${osx64_hash}" pkg='macos_x86_64' else err_no_binary "${ARCH}, OS X < 10.13" fi ;; * ) err_no_binary "${ARCH}" ;; esac local basever="pypy${PYVER}-v${VERSION}" local baseurl="https://downloads.python.org/pypy/${basever}" # result - command, package dir, url+hash echo "${cmd}" "${basever}-${pkg}" "${baseurl}-${pkg}.${ext}#${hash}" } # determine command, package directory, url+hash declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" # install ${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip' pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.10-7.3.18-src000066400000000000000000000011341517431316200266620ustar00rootroot00000000000000VERSION='7.3.18' PYVER='3.10' # https://www.pypy.org/checksums.html hash=08eb70e866987e4abe88ae9f54a98f919df92b595f7cdf4041703e8802b11552 ### end of manual settings - following lines same for every download ver="pypy${PYVER}-v${VERSION}-src" url="https://downloads.python.org/pypy/${ver}.tar.bz2" prefer_openssl11 install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip' pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.10-7.3.19000066400000000000000000000041601517431316200261000ustar00rootroot00000000000000VERSION='7.3.19' PYVER='3.10' # https://www.pypy.org/checksums.html aarch64_hash=af27a589178f11198e2244ab65ca510630ba97c131d7ccc4021eb5bc58de7f57 linux32_hash=e63a4fcad2641ee541e852918befb513abf04ce7070f743a50778cae9f9da80e linux64_hash=c73ac2cc2380ac9227fd297482bf2a3e17a80618ba46db7544d535515321ec1e osarm64_hash=3db8a03fc496164801646844d7f3b12baa0adb3ad9a0b7cb124521bc2e168a36 osx64_hash=2c5e5c2a33ac882551d7f28b98d19d486b8995aa50824a73b4edcc6aeec35c63 ### end of manual settings - following lines same for every download function err_no_binary { local archmsg="${1}" local ver="pypy${PYVER}-v${VERSION}-src" local url="https://downloads.python.org/pypy/${ver}.tar.bz2" { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for ${archmsg}." echo "try '${url}' to build from source." echo } >&2 exit 1 } function pypy_pkg_data { # pypy architecture tag local ARCH="${1}" # defaults local cmd='install_package' # use bz2 local pkg="${ARCH}" # assume matches local ext='tar.bz2' local hash='' # undefined # select the hash, fix pkg if not match ARCH case "${ARCH}" in 'linux-aarch64' ) hash="${aarch64_hash}" pkg='aarch64' ;; 'linux' ) hash="${linux32_hash}" pkg='linux32' ;; 'linux64' ) hash="${linux64_hash}" ;; 'osarm64' ) hash="${osarm64_hash}" pkg='macos_arm64' ;; 'osx64' ) if require_osx_version "10.13"; then hash="${osx64_hash}" pkg='macos_x86_64' else err_no_binary "${ARCH}, OS X < 10.13" fi ;; * ) err_no_binary "${ARCH}" ;; esac local basever="pypy${PYVER}-v${VERSION}" local baseurl="https://downloads.python.org/pypy/${basever}" # result - command, package dir, url+hash echo "${cmd}" "${basever}-${pkg}" "${baseurl}-${pkg}.${ext}#${hash}" } # determine command, package directory, url+hash declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" # install ${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip' pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.10-7.3.19-src000066400000000000000000000011341517431316200266630ustar00rootroot00000000000000VERSION='7.3.19' PYVER='3.10' # https://www.pypy.org/checksums.html hash=a7c22930b918f40870865ed8a74147f4434ef84d3d6ca2b3c1eba9355d4929c8 ### end of manual settings - following lines same for every download ver="pypy${PYVER}-v${VERSION}-src" url="https://downloads.python.org/pypy/${ver}.tar.bz2" prefer_openssl11 install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip' pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.11-7.3.18000066400000000000000000000041601517431316200261000ustar00rootroot00000000000000VERSION='7.3.18' PYVER='3.11' # https://www.pypy.org/checksums.html aarch64_hash=95bc3021cb9be2aa766ecb776c215e97ae8c0dda99dd48840b40b5b87d90bc45 linux32_hash=70357a69cdbf4ce449b5743901fcd36208e0a89eadcfb4d2ebdc9b4711a0612c linux64_hash=df5fa534800ff09d990e50ca4fdb02d8a06b9ed948dbcb3a09bea0739ef42de7 osarm64_hash=cc4d6dd621dffd474eb9a2d01e5844d1b6a6f88b404aac2c48a9c267b5370df4 osx64_hash=4f2274ffb4b787fd5b5f15cd61f7fef5a3710bf0ecbd4293bf0251035b468865 ### end of manual settings - following lines same for every download function err_no_binary { local archmsg="${1}" local ver="pypy${PYVER}-v${VERSION}-src" local url="https://downloads.python.org/pypy/${ver}.tar.bz2" { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for ${archmsg}." echo "try '${url}' to build from source." echo } >&2 exit 1 } function pypy_pkg_data { # pypy architecture tag local ARCH="${1}" # defaults local cmd='install_package' # use bz2 local pkg="${ARCH}" # assume matches local ext='tar.bz2' local hash='' # undefined # select the hash, fix pkg if not match ARCH case "${ARCH}" in 'linux-aarch64' ) hash="${aarch64_hash}" pkg='aarch64' ;; 'linux' ) hash="${linux32_hash}" pkg='linux32' ;; 'linux64' ) hash="${linux64_hash}" ;; 'osarm64' ) hash="${osarm64_hash}" pkg='macos_arm64' ;; 'osx64' ) if require_osx_version "10.13"; then hash="${osx64_hash}" pkg='macos_x86_64' else err_no_binary "${ARCH}, OS X < 10.13" fi ;; * ) err_no_binary "${ARCH}" ;; esac local basever="pypy${PYVER}-v${VERSION}" local baseurl="https://downloads.python.org/pypy/${basever}" # result - command, package dir, url+hash echo "${cmd}" "${basever}-${pkg}" "${baseurl}-${pkg}.${ext}#${hash}" } # determine command, package directory, url+hash declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" # install ${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip' pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.11-7.3.18-src000066400000000000000000000011341517431316200266630ustar00rootroot00000000000000VERSION='7.3.18' PYVER='3.11' # https://www.pypy.org/checksums.html hash=fbc82b8ff67b942e6fce49980dc0f0f83193b005173f9bddd39d6396fb6b939d ### end of manual settings - following lines same for every download ver="pypy${PYVER}-v${VERSION}-src" url="https://downloads.python.org/pypy/${ver}.tar.bz2" prefer_openssl11 install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip' pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.11-7.3.19000066400000000000000000000041601517431316200261010ustar00rootroot00000000000000VERSION='7.3.19' PYVER='3.11' # https://www.pypy.org/checksums.html aarch64_hash=13207dbf81ce24e96da760b1b863627b77bb20b1fb4c95191e02a0b72383df74 linux32_hash=5c6cdafd0a0abd14ca59926ed1b6aeb13b228c18b4b46de655aae48734c731ad linux64_hash=9177d9e0bb91b05f921c642cb0ff71a0f3653b5d29a42d40d6a078c15b75720f osarm64_hash=7704e0d5302e53920d32dcfe9afeeb10436d4c94233e8830cf603aa955a861c1 osx64_hash=a2439f9d30dfdae96a5e9101c7dc54a8a68b56c9d7314ea399b0a25d3e87ebb2 ### end of manual settings - following lines same for every download function err_no_binary { local archmsg="${1}" local ver="pypy${PYVER}-v${VERSION}-src" local url="https://downloads.python.org/pypy/${ver}.tar.bz2" { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for ${archmsg}." echo "try '${url}' to build from source." echo } >&2 exit 1 } function pypy_pkg_data { # pypy architecture tag local ARCH="${1}" # defaults local cmd='install_package' # use bz2 local pkg="${ARCH}" # assume matches local ext='tar.bz2' local hash='' # undefined # select the hash, fix pkg if not match ARCH case "${ARCH}" in 'linux-aarch64' ) hash="${aarch64_hash}" pkg='aarch64' ;; 'linux' ) hash="${linux32_hash}" pkg='linux32' ;; 'linux64' ) hash="${linux64_hash}" ;; 'osarm64' ) hash="${osarm64_hash}" pkg='macos_arm64' ;; 'osx64' ) if require_osx_version "10.13"; then hash="${osx64_hash}" pkg='macos_x86_64' else err_no_binary "${ARCH}, OS X < 10.13" fi ;; * ) err_no_binary "${ARCH}" ;; esac local basever="pypy${PYVER}-v${VERSION}" local baseurl="https://downloads.python.org/pypy/${basever}" # result - command, package dir, url+hash echo "${cmd}" "${basever}-${pkg}" "${baseurl}-${pkg}.${ext}#${hash}" } # determine command, package directory, url+hash declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" # install ${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip' pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.11-7.3.19-src000066400000000000000000000011341517431316200266640ustar00rootroot00000000000000VERSION='7.3.19' PYVER='3.11' # https://www.pypy.org/checksums.html hash=4817c044bb469a3274e60aa3645770f81eb4f9166ea7fdc4e6c351345554c8d8 ### end of manual settings - following lines same for every download ver="pypy${PYVER}-v${VERSION}-src" url="https://downloads.python.org/pypy/${ver}.tar.bz2" prefer_openssl11 install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip' pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.11-7.3.20000066400000000000000000000041601517431316200260710ustar00rootroot00000000000000VERSION='7.3.20' PYVER='3.11' # https://www.pypy.org/checksums.html aarch64_hash=9347fe691a07fd9df17a1b186554fb9d9e6210178ffef19520a579ce1f9eb741 linux32_hash=d08ce15dd61e9ace5e010b047104f0137110a258184e448ea8239472f10cf99b linux64_hash=1410db3a7ae47603e2b7cbfd7ff6390b891b2e041c9eb4f1599f333677bccb3e osarm64_hash=84a48e09c97f57df62cc9f01b7a6d8c3e306b6270671d871aa8ab8c06945940d osx64_hash=bb3ae80cf5fca5044af2e42933e7692c7c5e76a828ce0eb6404a5d5da83b313c ### end of manual settings - following lines same for every download function err_no_binary { local archmsg="${1}" local ver="pypy${PYVER}-v${VERSION}-src" local url="https://downloads.python.org/pypy/${ver}.tar.bz2" { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for ${archmsg}." echo "try '${url}' to build from source." echo } >&2 exit 1 } function pypy_pkg_data { # pypy architecture tag local ARCH="${1}" # defaults local cmd='install_package' # use bz2 local pkg="${ARCH}" # assume matches local ext='tar.bz2' local hash='' # undefined # select the hash, fix pkg if not match ARCH case "${ARCH}" in 'linux-aarch64' ) hash="${aarch64_hash}" pkg='aarch64' ;; 'linux' ) hash="${linux32_hash}" pkg='linux32' ;; 'linux64' ) hash="${linux64_hash}" ;; 'osarm64' ) hash="${osarm64_hash}" pkg='macos_arm64' ;; 'osx64' ) if require_osx_version "10.13"; then hash="${osx64_hash}" pkg='macos_x86_64' else err_no_binary "${ARCH}, OS X < 10.13" fi ;; * ) err_no_binary "${ARCH}" ;; esac local basever="pypy${PYVER}-v${VERSION}" local baseurl="https://downloads.python.org/pypy/${basever}" # result - command, package dir, url+hash echo "${cmd}" "${basever}-${pkg}" "${baseurl}-${pkg}.${ext}#${hash}" } # determine command, package directory, url+hash declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" # install ${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip' pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.11-7.3.20-src000066400000000000000000000011341517431316200266540ustar00rootroot00000000000000VERSION='7.3.20' PYVER='3.11' # https://www.pypy.org/checksums.html hash=7786dda760003e2ea7409c1037e50200c578ec427ce0245ac4cd758710b206fb ### end of manual settings - following lines same for every download ver="pypy${PYVER}-v${VERSION}-src" url="https://downloads.python.org/pypy/${ver}.tar.bz2" prefer_openssl11 install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip' pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.3-5.2-alpha1000066400000000000000000000053221517431316200267340ustar00rootroot00000000000000case "$(pypy_architecture 2>/dev/null || true)" in "linux" ) if require_distro "Ubuntu 10.04" 1>/dev/null 2>&1; then install_package "pypy3.3-v5.2.0-alpha1-linux" "https://downloads.python.org/pypy/pypy3.3-v5.2.0-alpha1-linux32.tar.bz2#351aec101bdedddae7ea1b63845a5654b1a95fc9393894ef84a66749f6945f17" "pypy" verify_py33 ensurepip else install_package "pypy3.3-5.2-alpha-20160602-linux_i686-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy3.3-5.2-alpha-20160602-linux_i686-portable.tar.bz2#6f2412167c63d6711b41062a23794828f95a75400082a6957595867762cb170d" "pypy" verify_py33 ensurepip fi ;; "linux-armel" ) require_distro "Ubuntu 12.04" || true install_package "pypy3.3-v5.2.0-alpha1-linux-armel" "https://downloads.python.org/pypy/pypy3.3-v5.2.0-alpha1-linux-armel.tar.bz2#ac83e632213f078ab60045e6ad0564b146d65dcd9a52c130026fab6dd85bf2dc" "pypy" verify_py33 ensurepip ;; "linux-armhf" ) if [[ "$(cat /etc/issue 2>/dev/null || true)" == "Raspbian"* ]]; then install_package "pypy3.3-v5.2.0-alpha1-linux-armhf-raspbian" "https://downloads.python.org/pypy/pypy3.3-v5.2.0-alpha1-linux-armhf-raspbian.tar.bz2#ba9a5d0cbac1c622363315b30df288ab2cf8fcccf7e2882bf5946115dbfa657e" "pypy" verify_py33 ensurepip else require_distro "Ubuntu 13.04" || true install_package "pypy3.3-v5.2.0-alpha1-linux-armhf-raring" "https://downloads.python.org/pypy/pypy3.3-v5.2.0-alpha1-linux-armhf-raring.tar.bz2#b4d847d33c1bf9b3956d1d17b9e37505eb32f68e341c9333a74a82010a63e799" "pypy" verify_py33 ensurepip fi ;; "linux64" ) if require_distro "Ubuntu 12.04" "Ubuntu 12.10" "Ubuntu 13.04" "Ubuntu 13.10" "Ubuntu 14.04" 1>/dev/null 2>&1; then install_package "pypy3.3-v5.2.0-alpha1-linux64" "https://downloads.python.org/pypy/pypy3.3-v5.2.0-alpha1-linux64.tar.bz2#f5e66ab24267d6ddf662d07c512d06c10ebc732ae62093dabbd775ac63b9060a" "pypy" verify_py33 ensurepip else install_package "pypy3.3-5.2-alpha-20160602-linux_x86_64-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy3.3-5.2-alpha-20160602-linux_x86_64-portable.tar.bz2#4d1e7dd727448c1b2caa90c943713c0aa10b32e9d977c2c3b348835f515a3ad4" "pypy" verify_py33 ensurepip fi ;; "osx64" ) install_package "pypy3.3-v5.2.0-alpha1-osx64" "https://downloads.python.org/pypy/pypy3.3-v5.2.0-alpha1-osx64.tar.bz2#abaceab5d2790f49e04e0d80669283da41f94b77cf483b30ac0de48d3c19f304" "pypy" verify_py33 ensurepip ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." echo "try 'pypy3.3-5.2-alpha1-src' to build from source." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.3-5.2-alpha1-src000066400000000000000000000006641517431316200275250ustar00rootroot00000000000000prefer_openssl11 install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl install_package "pypy3.3-v5.2.0-alpha1-src" "https://downloads.python.org/pypy/pypy3.3-v5.2.0-alpha1-src.tar.bz2#344c2f088c82ea1274964bb0505ab80d3f9e538cc03f91aa109325ddbaa61426" "pypy_builder" verify_py33 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.3-5.5-alpha000066400000000000000000000052641517431316200266630ustar00rootroot00000000000000case "$(pypy_architecture 2>/dev/null || true)" in "linux" ) if require_distro "Ubuntu 12.04" "Ubuntu 12.10" "Ubuntu 13.04" "Ubuntu 13.10" "Ubuntu 14.04" 1>/dev/null 2>&1; then install_package "pypy3.3-v5.5.0-linux32" "https://downloads.python.org/pypy/pypy3.3-v5.5.0-alpha-linux32.tar.bz2#966ee7951ad497ac907e01554fe48da77cc64a5e35a1307477c2f78652eba622" "pypy" verify_py33 ensurepip else install_package "pypy3.3-5.5-alpha-20161014-linux_i686-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy3.3-5.5-alpha-20161014-linux_i686-portable.tar.bz2#af32420f368bc3276d15a5cf4e2e8cb0bef16f711ee830a636ad117e55c3268f" "pypy" verify_py33 ensurepip fi ;; "linux-armel" ) require_distro "Ubuntu 12.04" || true install_package "pypy3-v5.5.0-linux-armel" "https://downloads.python.org/pypy/pypy3.3-v5.5.0-alpha-linux-armel.tar.bz2#9f081041867f434f18456f936befbacd9f40c0ede24137cbf80f9f45ff37b69f" "pypy" verify_py33 ensurepip ;; "linux-armhf" ) if [[ "$(cat /etc/issue 2>/dev/null || true)" == "Raspbian"* ]]; then install_package "pypy3-v5.5.0-linux-armhf-raspbian" "https://downloads.python.org/pypy/pypy3.3-v5.5.0-alpha-linux-armhf-raspbian.tar.bz2#d8e94c834307081d5c4be863fab935e34df360a77b06e8bc833624c4b712b2aa" "pypy" verify_py33 ensurepip else { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." echo "try 'pypy3.3-5.5-alpha-src' to build from source." echo } >&2 exit 1 fi ;; "linux64" ) if require_distro "Ubuntu 12.04" "Ubuntu 12.10" "Ubuntu 13.04" "Ubuntu 13.10" "Ubuntu 14.04" 1>/dev/null 2>&1; then install_package "pypy3-v5.5.0-linux64" "https://downloads.python.org/pypy/pypy3.3-v5.5.0-alpha-linux64.tar.bz2#41ef7c25fd04eeb20deaa83c5d88c10aef2bbc8bcfd9e53e7cc61136220861cc" "pypy" verify_py33 ensurepip else install_package "pypy3.3-5.5-alpha-20161013-linux_x86_64-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy3.3-5.5-alpha-20161013-linux_x86_64-portable.tar.bz2#1cd7a00da376b2db29b3e1f3e9bb7a77afc8ad988b3f13fd0805f37b23960a34" "pypy" verify_py33 ensurepip fi ;; "osx64" ) install_package "pypy3-v5.5.0-osx64" "https://downloads.python.org/pypy/pypy3.3-v5.5.0-alpha-osx64.tar.bz2#fa45f861a6c40ae44f99ec94c521adfb6b64b0c9c0b6fc6e9df018241a648986" "pypy" verify_py33 ensurepip ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." echo "try 'pypy3.3-5.5-alpha-src' to build from source." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.3-5.5-alpha-src000066400000000000000000000006521517431316200274440ustar00rootroot00000000000000prefer_openssl11 install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl install_package "pypy3-v5.5.0-src" "https://downloads.python.org/pypy/pypy3.3-v5.5.0-alpha-src.tar.bz2#d5591c34d77253e9ed57d182b6f49585b95f7c09c3e121f0e8630e5a7e75ab5f" "pypy_builder" verify_py33 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.5-5.10.0000066400000000000000000000052611517431316200260110ustar00rootroot00000000000000case "$(pypy_architecture 2>/dev/null || true)" in "linux" ) if require_distro "Ubuntu 14.04" 1>/dev/null 2>&1; then install_package "pypy3-v5.10.0-linux32" "https://downloads.python.org/pypy/pypy3-v5.10.0-linux32.tar.bz2#529bc3b11edbdcdd676d90c805b8f607f6eedd5f0ec457a31bbe09c03f5bebfe" "pypy" verify_py27 ensurepip fi ;; "linux64" ) if require_distro "Ubuntu 14.04" "Ubuntu 16.04" 1>/dev/null 2>&1; then install_package "pypy3-v5.10.0-linux64" "https://downloads.python.org/pypy/pypy3-v5.10.0-linux64.tar.bz2#aa4fb52fb858d973dd838dcf8d74f30705e5afdf1150acb8e056eb99353dfe77" "pypy" verify_py27 ensurepip else install_package "pypy3.5-5.10.0-linux_x86_64-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy3.5-5.10.0-linux_x86_64-portable.tar.bz2#d03f81f26e5e67d808569c5c69d56ceb007df78f7e36ab1c50da4d9096cebde0" "pypy" verify_py35 ensurepip fi ;; "linux-armel" ) require_distro "Ubuntu 12.04" || true install_package "pypy3-v5.10.0-linux-armel" "https://downloads.python.org/pypy/pypy3-v5.10.0-linux-armel.tar.bz2#c2cc529befb3e1f2ef8bd4e96af4a823c52ef2d180b0b3bd87511c5b47d59210" "pypy" verify_py27 ensurepip ;; "linux-armhf" ) if [[ "$(cat /etc/issue 2>/dev/null || true)" == "Raspbian"* ]]; then install_package "pypy3-v5.10.0-linux-armhf-raspbian" "https://downloads.python.org/pypy/pypy3-v5.10.0-linux-armhf-raspbian.tar.bz2#4e902e0e79f62f2a9049c1c71310ff4fc801011bec4d25082edb5c537d3f15c9" "pypy" verify_py27 ensurepip else { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." echo "try 'pypy3.5-5.10.0-src' to build from source." echo } >&2 exit 1 fi ;; "osx64" ) if require_osx_version "10.13"; then install_package "pypy3-v5.10.0-osx64" "https://downloads.python.org/pypy/pypy3-v5.10.0-osx64.tar.bz2#7e389a103f560de1eead1271ec3a2df9424c6ccffe7cbae8e95e6e81ae811a16" "pypy" verify_py27 ensurepip else install_package "pypy3-v5.10.0-osx64-2" "https://downloads.python.org/pypy/pypy3-v5.10.0-osx64-2.tar.bz2#f5ced20934fff78e55c72aa82a4703954349a5a8099b94e77d74b96a94326a2c" "pypy" verify_py27 ensurepip fi ;; "win32" ) # FIXME: never tested on Windows install_zip "pypy3-v5.10.0-win32" "https://downloads.python.org/pypy/pypy3-v5.10.0-win32.zip#2d93bf2bd7b1d031b96331d3fde6cacdda95673ce6875d6d1669c4c0ea2a52bc" "pypy" verify_py27 ensurepip ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." echo "try 'pypy3.5-5.10.0-src' to build from source." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.5-5.10.0-src000066400000000000000000000006441517431316200265760ustar00rootroot00000000000000prefer_openssl11 install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl install_package "pypy3-v5.10.0-src" "https://downloads.python.org/pypy/pypy3-v5.10.0-src.tar.bz2#a6e4cffde71e3f08b6e1befa5c0352a9bcc5f4e9f5cbf395001e0763a1a0d9e3" "pypy_builder" verify_py35 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.5-5.10.1000066400000000000000000000056541517431316200260200ustar00rootroot00000000000000case "$(pypy_architecture 2>/dev/null || true)" in "linux" ) if require_distro "Ubuntu 14.04" 1>/dev/null 2>&1; then install_package "pypy3-v5.10.1-linux32" "https://downloads.python.org/pypy/pypy3-v5.10.1-linux32.tar.bz2#a6ceca9ee5dc511de7902164464b88311fec9366c5673d0c00528eda862bbe54" "pypy" verify_py27 ensurepip fi ;; "linux64" ) if require_distro "Ubuntu 14.04" "Ubuntu 16.04" 1>/dev/null 2>&1; then install_package "pypy3-v5.10.1-linux64" "https://downloads.python.org/pypy/pypy3-v5.10.1-linux64.tar.bz2#75a276e1ee1863967bbacb70c5bff636de200768c0ec90e72f7ec17aace0aefe" "pypy" verify_py27 ensurepip else install_package "pypy3.5-5.10.1-linux_x86_64-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy3.5-5.10.1-linux_x86_64-portable.tar.bz2#b7c7b0e0905208ce8a8061b1a0ae136a702e5218d0d350cb5216ad5a7c20d12e" "pypy" verify_py35 ensurepip fi ;; "linux-armel" ) require_distro "Ubuntu 12.04" || true install_package "pypy3-v5.10.1-linux-armel" "https://downloads.python.org/pypy/pypy3-v5.10.1-linux-armel.tar.bz2#5065e9ad958d06b9612ba974f43997d20168d4245c054dd43270e4b458782282" "pypy" verify_py27 ensurepip ;; "linux-armhf" ) if [[ "$(cat /etc/issue 2>/dev/null || true)" == "Raspbian"* ]]; then install_package "pypy3-v5.10.1-linux-armhf-raspbian" "https://downloads.python.org/pypy/pypy3-v5.10.1-linux-armhf-raspbian.tar.bz2#203dd595fbad7055340b23326f20c85b0d6c11c4877e3559a437611fc2ac40c2" "pypy" verify_py27 ensurepip else { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." echo "try 'pypy3.5-5.10.1-src' to build from source." echo } >&2 exit 1 fi ;; "osx64" ) if require_osx_version "10.13"; then install_package "pypy3-v5.10.1-osx64" "https://downloads.python.org/pypy/pypy3-v5.10.1-osx64.tar.bz2#52f006611513c995fdebba6e72d394186d4085460408cbbe086e5467bf3fb9b6" "pypy" verify_py27 ensurepip else # install_package "pypy3-v5.10.1-osx64-2" "https://downloads.python.org/pypy/pypy3-v5.10.1-osx64.tar.bz2#52f006611513c995fdebba6e72d394186d4085460408cbbe086e5467bf3fb9b6" "pypy" verify_py27 ensurepip { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true), OS X < 10.13." echo "try 'pypy3.5-5.10.1-src' to build from source." echo } >&2 exit 1 fi ;; "win32" ) # FIXME: never tested on Windows install_zip "pypy3-v5.10.1-win32" "https://downloads.python.org/pypy/pypy3-v5.10.1-win32.zip#4edf4f021689a529e5a631c5cca72a1a9dc19a6ea2091e64289cdd5b60eaf929" "pypy" verify_py27 ensurepip ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." echo "try 'pypy3.5-5.10.1-src' to build from source." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.5-5.10.1-src000066400000000000000000000006441517431316200265770ustar00rootroot00000000000000prefer_openssl11 install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl install_package "pypy3-v5.10.1-src" "https://downloads.python.org/pypy/pypy3-v5.10.1-src.tar.bz2#f5548e06e2fc0c24ec8b6e3c5b09f90081818f7caa3e436dc312592611724713" "pypy_builder" verify_py35 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.5-5.7-beta000066400000000000000000000016661517431316200265170ustar00rootroot00000000000000case "$(pypy_architecture 2>/dev/null || true)" in "linux64" ) if require_distro "Ubuntu 12.04" "Ubuntu 12.10" "Ubuntu 13.04" "Ubuntu 13.10" "Ubuntu 14.04" 1>/dev/null 2>&1; then install_package "pypy3-v5.7.0-linux64" "https://downloads.python.org/pypy/pypy3-v5.7.0-linux64.tar.bz2#921894884a647220a712ecdaad516d9c22fbadf3b4bb3a5db8f3635c60eabc7b" "pypy" verify_py35 ensurepip else install_package "pypy3.5-5.7-beta-linux_x86_64-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy3.5-5.7-beta-linux_x86_64-portable.tar.bz2#d289ff7c32fd4263c3889994c8191c626891513e8ab60a65ba41a58b331db92c" "pypy" verify_py35 ensurepip fi ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." echo "try 'pypy3.5-5.7-beta-src' to build from source." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.5-5.7-beta-src000066400000000000000000000006421517431316200272750ustar00rootroot00000000000000prefer_openssl11 install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl install_package "pypy3-v5.7.0-src" "https://downloads.python.org/pypy/pypy3-v5.7.0-src.tar.bz2#f0f563b74f8b82ec33b022393219b93cc0d81e9f9500614fe8417b67a52e9569" "pypy_builder" verify_py35 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.5-5.7.1-beta000066400000000000000000000016721517431316200266530ustar00rootroot00000000000000case "$(pypy_architecture 2>/dev/null || true)" in "linux64" ) if require_distro "Ubuntu 12.04" "Ubuntu 12.10" "Ubuntu 13.04" "Ubuntu 13.10" "Ubuntu 14.04" 1>/dev/null 2>&1; then install_package "pypy3-v5.7.1-linux64" "https://downloads.python.org/pypy/pypy3-v5.7.1-linux64.tar.bz2#2abaa54d88c9b70b64c37083e7e430a1d3a8f78f8de92e484a988b7aca1e50a7" "pypy" verify_py35 ensurepip else install_package "pypy3.5-5.7.1-beta-linux_x86_64-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy3.5-5.7.1-beta-linux_x86_64-portable.tar.bz2#3d1b02f6ef50d4e9069885e0b3f19f26491c7f4f9c5ccc8aa118e38fd6a23997" "pypy" verify_py35 ensurepip fi ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." echo "try 'pypy3.5-5.7-beta-src' to build from source." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.5-5.7.1-beta-src000066400000000000000000000006421517431316200274340ustar00rootroot00000000000000prefer_openssl11 install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl install_package "pypy3-v5.7.1-src" "https://downloads.python.org/pypy/pypy3-v5.7.1-src.tar.bz2#40ece0145282980ac121390f13709404c0532896507d5767496381180b631bd0" "pypy_builder" verify_py35 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.5-5.8.0000066400000000000000000000015711517431316200257400ustar00rootroot00000000000000case "$(pypy_architecture 2>/dev/null || true)" in "linux64" ) if require_distro "Ubuntu 14.04" 1>/dev/null 2>&1; then install_package "pypy3-v5.8.0-linux64" "https://downloads.python.org/pypy/pypy3-v5.8.0-linux64.tar.bz2#57d871a7f1135719c138cee4e3533c3275d682a76a40ff668e95150c65923035" "pypy" verify_py35 ensurepip else install_package "pypy3.5-5.8-beta-linux_x86_64-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy3.5-5.8-1-beta-linux_x86_64-portable.tar.bz2#cab20a6d315a1bb05aa953ebc37d8deaa34dcbe298cb5938e373c42c05542b99" "pypy" verify_py35 ensurepip fi ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." echo "try 'pypy3.5-5.8.0-src' to build from source." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.5-5.8.0-src000066400000000000000000000006421517431316200265230ustar00rootroot00000000000000prefer_openssl11 install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl install_package "pypy3-v5.8.0-src" "https://downloads.python.org/pypy/pypy3-v5.8.0-src.tar.bz2#9d090127335c3c0fd2b14c8835bf91752e62756e55ea06aad3353f24a6854223" "pypy_builder" verify_py35 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.5-5.9.0000066400000000000000000000015671517431316200257460ustar00rootroot00000000000000case "$(pypy_architecture 2>/dev/null || true)" in "linux64" ) if require_distro "Ubuntu 14.04" 1>/dev/null 2>&1; then install_package "pypy3-v5.9.0-linux64" "https://downloads.python.org/pypy/pypy3-v5.9.0-linux64.tar.bz2#d8c41ede3758127718944cc2fd6bf78ed4303d946f85596cac91281ccce36165" "pypy" verify_py35 ensurepip else install_package "pypy3.5-5.9-beta-linux_x86_64-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy3.5-5.9-beta-linux_x86_64-portable.tar.bz2#b0a79dabe2c48b0374d567936139ecf1379904a504d4a645be5c3e7e35140575" "pypy" verify_py35 ensurepip fi ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." echo "try 'pypy3.5-5.9.0-src' to build from source." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.5-5.9.0-src000066400000000000000000000006421517431316200265240ustar00rootroot00000000000000prefer_openssl11 install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl install_package "pypy3-v5.9.0-src" "https://downloads.python.org/pypy/pypy3-v5.9.0-src.tar.bz2#a014f47f50a1480f871a0b82705f904b38c93c4ca069850eb37653fedafb1b97" "pypy_builder" verify_py35 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.5-6.0.0000066400000000000000000000053201517431316200257250ustar00rootroot00000000000000case "$(pypy_architecture 2>/dev/null || true)" in "linux" ) if require_distro "Ubuntu 14.04" 1>/dev/null 2>&1; then install_package "pypy3-v6.0.0-linux32" "https://downloads.python.org/pypy/pypy3-v6.0.0-linux32.tar.bz2#b04eeee5160e6cb5f8962de80f077ea1dc7be34e77d74bf075519c23603f5ff9" "pypy" verify_py27 ensurepip fi ;; "linux64" ) if require_distro "Ubuntu 14.04" "Ubuntu 16.04" 1>/dev/null 2>&1; then install_package "pypy3-v6.0.0-linux64" "https://downloads.python.org/pypy/pypy3-v6.0.0-linux64.tar.bz2#4cfffa292b9ef34bb6ba39cdbaa196c5c5cbbc5aa3faaa157cf45d7e34027048" "pypy" verify_py27 ensurepip else install_package "pypy3.5-6.0.0-linux_x86_64-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy3.5-6.0.0-linux_x86_64-portable.tar.bz2#07f16282d126abfa759702baea869b0f661aa97f4c553ebec66c624bda28155f" "pypy" verify_py35 ensurepip fi ;; "linux-armel" ) require_distro "Ubuntu 12.04" || true install_package "pypy3-v6.0.0-linux-armel" "https://downloads.python.org/pypy/pypy3-v6.0.0-linux-armel.tar.bz2#6a6888a55192f58594838b8b3d2e7daaad43d3bf4293afab3dd8987d0bbd1124" "pypy" verify_py27 ensurepip ;; "linux-armhf" ) if [[ "$(cat /etc/issue 2>/dev/null || true)" == "Raspbian"* ]]; then install_package "pypy3-v6.0.0-linux-armhf-raspbian" "https://downloads.python.org/pypy/pypy3-v6.0.0-linux-armhf-raspbian.tar.bz2#8a0420dda23413925400538bbfc0cff2bbb2ab0de984eef6faaeab6d3309cbcc" "pypy" verify_py27 ensurepip else { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." echo "try 'pypy3.5-6.0.0-src' to build from source." echo } >&2 exit 1 fi ;; "osx64" ) if require_osx_version "10.13"; then install_package "pypy3-v6.0.0-osx64" "https://downloads.python.org/pypy/pypy3-v6.0.0-osx64.tar.bz2#938b8034e30f5f5060d2a079070c56c3be5559bc7ae9cc0c8395fe6fc45cfe4c" "pypy" verify_py27 ensurepip else { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true), OS X < 10.13." echo "try 'pypy3.5-6.0.0-src' to build from source." echo } >&2 exit 1 fi ;; "win32" ) # FIXME: never tested on Windows install_zip "pypy3-v6.0.0-win32" "https://downloads.python.org/pypy/pypy3-v6.0.0-win32.zip#72dddb3746a51f7672c77d619c818e27efe899e08ae82762448e50dbfdc2f5f3" "pypy" verify_py27 ensurepip ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." echo "try 'pypy3.5-6.0.0-src' to build from source." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.5-6.0.0-src000066400000000000000000000006421517431316200265140ustar00rootroot00000000000000prefer_openssl11 install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl install_package "pypy3-v6.0.0-src" "https://downloads.python.org/pypy/pypy3-v6.0.0-src.tar.bz2#ed8005202b46d6fc6831df1d13a4613bc40084bfa42f275068edadf8954034a3" "pypy_builder" verify_py35 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.5-7.0.0000066400000000000000000000042271517431316200257330ustar00rootroot00000000000000case "$(pypy_architecture 2>/dev/null || true)" in "linux" ) if require_distro "Ubuntu 12.04" "Ubuntu 14.04" "Ubuntu 16.04" 1>/dev/null 2>&1; then install_package "pypy3.5-v7.0.0-linux32" "https://downloads.python.org/pypy/pypy3.5-v7.0.0-linux32.tar.bz2#b8db8fbca9621de8ea8cd7184b322f2dddb2f385e8e5a63dfb75bb3fea4b2e3f" "pypy" verify_py35 ensurepip else { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." echo "try 'pypy3.5-7.0.0-src' to build from source." echo } >&2 exit 1 fi ;; "linux64" ) if require_distro "Ubuntu 12.04" "Ubuntu 14.04" "Ubuntu 16.04" 1>/dev/null 2>&1; then install_package "pypy3.5-v7.0.0-linux64" "https://downloads.python.org/pypy/pypy3.5-v7.0.0-linux64.tar.bz2#729e3c54325969c98bd3658c6342b9f5987b96bad1d6def04250a08401b54c4b" "pypy" verify_py35 ensurepip else install_package "pypy3.5-7.0.0-linux_x86_64-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy3.5-7.0.0-linux_x86_64-portable.tar.bz2#b0fa200f25a5a0ef90b8776ab1d0665c47d47c607d2ef057cce1da1ad2568e1f" "pypy" verify_py35 ensurepip fi ;; "osx64" ) if require_osx_version "10.13"; then install_package "pypy3.5-v7.0.0-osx64" "https://downloads.python.org/pypy/pypy3.5-v7.0.0-osx64.tar.bz2#7c6d71653d9b1a7946d1eeebbf24b454fe934fba8b0c39f648bdc545fb2895ce" "pypy" verify_py35 ensurepip else { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true), OS X < 10.13." echo "try 'pypy3.5-7.0.0-src' to build from source." echo } >&2 exit 1 fi ;; "win32" ) install_zip "pypy3.5-v7.0.0-win32" "https://downloads.python.org/pypy/pypy3.5-v7.0.0-win32.zip#a840305c24f426e11d8bb3f062cacec1edf7fcbce6a99122d59f73e1984bc5c0" "pypy" verify_py35 ensurepip ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." echo "try 'pypy3.5-7.0.0-src' to build from source." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.5-7.0.0-src000066400000000000000000000006461517431316200265210ustar00rootroot00000000000000prefer_openssl11 install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl install_package "pypy3.5-v7.0.0-src" "https://downloads.python.org/pypy/pypy3.5-v7.0.0-src.tar.bz2#b2ddb0f45cb4e0384fb498ef7fcca2ac96c730b9000affcf8d730169397f017f" "pypy_builder" verify_py35 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.5-c-jit-latest000066400000000000000000000042071517431316200275670ustar00rootroot00000000000000echo colorize 1 "WARNING" echo ": This may eat your kittens/ affect timespace in alternate dimensions/" echo "cause you to complain more. Nightly builds are meant for testing only." echo echo "To report bugs/regressions, please see:" echo echo "http://doc.pypy.org/en/latest/faq.html#how-should-i-report-a-bug" echo case "$(pypy_architecture 2>/dev/null || true)" in "linux" ) install_nightly_package "pypy-c-jit-latest-linux" "http://buildbot.pypy.org/nightly/py3.5/pypy-c-jit-latest-linux.tar.bz2" "pypy-c-jit-*-linux" "pypy" verify_py27 ensurepip ;; "linux-armel" ) install_nightly_package "pypy-c-jit-latest-linux-armel" "http://buildbot.pypy.org/nightly/py3.5/pypy-c-jit-latest-linux-armel.tar.bz2" "pypy-c-jit-*-linux-armel" "pypy" verify_py27 ensurepip ;; "linux-armhf" ) if [[ "$(cat /etc/issue 2>/dev/null || true)" == "Raspbian"* ]]; then install_nightly_package "pypy-c-jit-latest-linux-armhf-raspbian" "http://buildbot.pypy.org/nightly/py3.5/pypy-c-jit-latest-linux-armhf-raspbian.tar.bz2" "pypy-c-jit-*-linux-armhf-raspbian" "pypy" verify_py27 ensurepip else { echo colorize 1 "ERROR" echo ": The latest nightly build of PyPy 3.5 is not available for $(pypy_architecture 2>/dev/null || true)," echo "Please check http://buildbot.pypy.org/nightly/py3.5/ for previous builds." echo } >&2 exit 1 fi ;; "linux64" ) install_nightly_package "pypy3.5-c-jit-latest-linux64" "http://buildbot.pypy.org/nightly/py3.5/pypy-c-jit-latest-linux64.tar.bz2" "pypy-c-jit-*-linux64" "pypy" verify_py35 ensurepip ;; "osx64" ) install_nightly_package "pypy-c-jit-latest-osx64" "http://buildbot.pypy.org/nightly/py3.5/pypy-c-jit-latest-osx64.tar.bz2" "pypy-c-jit-*-osx64" "pypy" verify_py27 ensurepip ;; "win32" ) install_zip "pypy-c-jit-latest-win32" "http://buildbot.pypy.org/nightly/py3.5/pypy-c-jit-latest-win32.zip" "pypy" verify_py27 ensurepip ;; * ) { echo colorize 1 "ERROR" echo ": The latest nightly build of PyPy 3.5 is not available for $(pypy_architecture 2>/dev/null || true)," echo "Please check http://buildbot.pypy.org/nightly/py3.5/ for previous builds." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.6-7.0.0000066400000000000000000000035651517431316200257400ustar00rootroot00000000000000case "$(pypy_architecture 2>/dev/null || true)" in "linux" ) { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." echo "try 'pypy3.6-7.0.0-src' to build from source." echo } >&2 exit 1 ;; "linux64" ) if require_distro "Ubuntu 12.04" "Ubuntu 14.04" "Ubuntu 16.04" 1>/dev/null 2>&1; then install_package "pypy3.6-v7.0.0-linux64" "https://downloads.python.org/pypy/pypy3.6-v7.0.0-linux64.tar.bz2#8576bde0760c239040706cf4952995eb0e77938b175885392a465a0d1616173d" "pypy" verify_py36 ensurepip else install_package "pypy3.6-7.0.0-alpha-20190209-linux_x86_64-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy3.6-7.0.0-alpha-20190209-linux_x86_64-portable.tar.bz2#ef8a5254b9a082dec23a6e029b1bb674a122a789c29d9c452452a9e97498bcbe" "pypy" verify_py36 ensurepip fi ;; "osx64" ) if require_osx_version "10.13"; then install_package "pypy3.6-v7.0.0-osx64" "https://downloads.python.org/pypy/pypy3.6-v7.0.0-osx64.tar.bz2#4a95ffd61fd2d626a9c099db6e44889c2a7eecee9cb1cbc29e06603c218ba8e2" "pypy" verify_py36 ensurepip else { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true), OS X < 10.13." echo "try 'pypy3.6-7.0.0-src' to build from source." echo } >&2 exit 1 fi ;; "win32" ) install_zip "pypy3.6-v7.0.0-win32" "https://downloads.python.org/pypy/pypy3.6-v7.0.0-win32.zip#645d81472d16922fd592e9261da449cb19847ff7d5eaa89bcf05d9214b6b2698" "pypy" verify_py36 ensurepip ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." echo "try 'pypy3.6-7.0.0-src' to build from source." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.6-7.0.0-src000066400000000000000000000006461517431316200265220ustar00rootroot00000000000000prefer_openssl11 install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl install_package "pypy3.6-v7.0.0-src" "https://downloads.python.org/pypy/pypy3.6-v7.0.0-src.tar.bz2#7ccbf81db5c647fa0c27636c7d18d059d2570fff7eaffc03857c67bee84b8a26" "pypy_builder" verify_py36 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.6-7.1.0000066400000000000000000000042411517431316200257310ustar00rootroot00000000000000case "$(pypy_architecture 2>/dev/null || true)" in "linux" ) if require_distro "Ubuntu 12.04" "Ubuntu 14.04" "Ubuntu 16.04" 1>/dev/null 2>&1; then install_package "pypy3.6-v7.1.0-linux32" "https://downloads.python.org/pypy/pypy3.6-v7.1.0-linux32.tar.bz2#031bfac61210a6e161bace0691b854dc15d01b0e624dc0588c544ee5e1621a83" "pypy" verify_py27 ensurepip else { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." echo "try 'pypy3.6-7.1.0-src' to build from source." echo } >&2 exit 1 fi ;; "linux64" ) if require_distro "Ubuntu 12.04" "Ubuntu 14.04" "Ubuntu 16.04" 1>/dev/null 2>&1; then install_package "pypy3.6-v7.1.0-linux64" "https://downloads.python.org/pypy/pypy3.6-v7.1.0-linux64.tar.bz2#270dd06633cf03337e6f815d7235e790e90dabba6f4b6345c9745121006925fc" "pypy" verify_py36 ensurepip else install_package "pypy3.6-7.1.0-beta-linux_x86_64-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy3.6-7.1.0-beta-linux_x86_64-portable.tar.bz2#d1bde814fb0c3645dfc0bdab67c335c8aa259b83fb39106e2e11b0112bcbb602" "pypy" verify_py36 ensurepip fi ;; "osx64" ) if require_osx_version "10.13"; then install_package "pypy3.6-v7.1.0-osx64" "https://downloads.python.org/pypy/pypy3.6-v7.1.0-osx64.tar.bz2#d46e005ba095cb4a7006079ffbf4fe63c18cf5e9d8ce9ce8383efc1a4863ab5b" "pypy" verify_py36 ensurepip else { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true), OS X < 10.13." echo "try 'pypy3.6-7.1.0-src' to build from source." echo } >&2 exit 1 fi ;; "win32" ) install_zip "pypy3.6-v7.1.0-win32" "https://downloads.python.org/pypy/pypy3.6-v7.1.0-win32.zip#77a0576a3d518210467f0df2d0d9a1892c664566dc02f25d974c2dbc6b4749e7" "pypy" verify_py36 ensurepip ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." echo "try 'pypy3.6-7.1.0-src' to build from source." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.6-7.1.0-src000066400000000000000000000006461517431316200265230ustar00rootroot00000000000000prefer_openssl11 install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl install_package "pypy3.6-v7.1.0-src" "https://downloads.python.org/pypy/pypy3.6-v7.1.0-src.tar.bz2#faa81f469bb2a7cbd22c64f22d4b4ddc5a1f7c798d43b7919b629b932f9b1c6f" "pypy_builder" verify_py36 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.6-7.1.1000066400000000000000000000042411517431316200257320ustar00rootroot00000000000000case "$(pypy_architecture 2>/dev/null || true)" in "linux" ) if require_distro "Ubuntu 12.04" "Ubuntu 14.04" "Ubuntu 16.04" 1>/dev/null 2>&1; then install_package "pypy3.6-v7.1.1-linux32" "https://downloads.python.org/pypy/pypy3.6-v7.1.1-linux32.tar.bz2#cb11ef4b0df569c28390b1ee93029159e1b90bfbad98df6abd629d5203b2abd9" "pypy" verify_py27 ensurepip else { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." echo "try 'pypy3.6-7.1.1-src' to build from source." echo } >&2 exit 1 fi ;; "linux64" ) if require_distro "Ubuntu 12.04" "Ubuntu 14.04" "Ubuntu 16.04" 1>/dev/null 2>&1; then install_package "pypy3.6-v7.1.1-linux64" "https://downloads.python.org/pypy/pypy3.6-v7.1.1-linux64.tar.bz2#8014f63b1a34b155548852c7bf73aab2d41ebddf2c8fb603dc9dd8509be93db0" "pypy" verify_py36 ensurepip else install_package "pypy3.6-7.1.1-beta-linux_x86_64-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy3.6-7.1.1-beta-linux_x86_64-portable.tar.bz2#82c878b61ad34fc2cf1686fa600a7a002d352e1b33a99a43007eec486ecd068e" "pypy" verify_py36 ensurepip fi ;; "osx64" ) if require_osx_version "10.13"; then install_package "pypy3.6-v7.1.1-osx64" "https://downloads.python.org/pypy/pypy3.6-v7.1.1-osx64.tar.bz2#a5c2f2bfa2b4a4d29e8a67baab95699b169054066df218a14f171bb84a6df0c0" "pypy" verify_py36 ensurepip else { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true), OS X < 10.13." echo "try 'pypy3.6-7.1.1-src' to build from source." echo } >&2 exit 1 fi ;; "win32" ) install_zip "pypy3.6-v7.1.1-win32" "https://downloads.python.org/pypy/pypy3.6-v7.1.1-win32.zip#8b513b254de5f31890f5956569de9aec3a0a91d7aba72fc89d66901f4a8ccf49" "pypy" verify_py36 ensurepip ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." echo "try 'pypy3.6-7.1.1-src' to build from source." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.6-7.1.1-src000066400000000000000000000006461517431316200265240ustar00rootroot00000000000000prefer_openssl11 install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl install_package "pypy3.6-v7.1.1-src" "https://downloads.python.org/pypy/pypy3.6-v7.1.1-src.tar.bz2#6a3ef876e3691a54f4cff045028ec3be94ab9beb2e99f051b83175302c1899a8" "pypy_builder" verify_py36 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.6-7.2.0000066400000000000000000000041761517431316200257410ustar00rootroot00000000000000case "$(pypy_architecture 2>/dev/null || true)" in "linux" ) if require_distro "Ubuntu 12.04" "Ubuntu 14.04" "Ubuntu 16.04" 1>/dev/null 2>&1; then install_package "pypy3.6-v7.2.0-linux32" "https://downloads.python.org/pypy/pypy3.6-v7.2.0-linux32.tar.bz2#45e99de197cb3e974cfc8d45e0076ad2066852e61e56b3eafd1237efafd2c43e" "pypy" verify_py27 ensurepip else { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." echo "try 'pypy3.6-7.2.0-src' to build from source." echo } >&2 exit 1 fi ;; "linux64" ) if require_distro "Ubuntu 12.04" "Ubuntu 14.04" "Ubuntu 16.04" 1>/dev/null 2>&1; then install_package "pypy3.6-v7.2.0-linux64" "https://downloads.python.org/pypy/pypy3.6-v7.2.0-linux64.tar.bz2#aa128e555ad0fe5c4c15104ae0903052bd232b6e3a73f5fe023d27b8fd0d6089" "pypy" verify_py36 ensurepip else install_package "pypy3.6-7.2.0-beta-linux_x86_64-portable" "https://github.com/squeaky-pl/portable-pypy/releases/download/pypy3.6-7.2.0/pypy3.6-7.2.0-linux_x86_64-portable.tar.bz2#59099546b4dee56edcde2c9ff706687e35bb2aa94354cd56daa78aca036bd3d8" "pypy" verify_py36 ensurepip fi ;; "osx64" ) if require_osx_version "10.13"; then install_package "pypy3.6-v7.2.0-osx64" "https://downloads.python.org/pypy/pypy3.6-v7.2.0-osx64.tar.bz2#836abb0ec303b90a684533711ed3b8269d3e8c64805b595e410920abdea678ac" "pypy" verify_py36 ensurepip else { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true), OS X < 10.13." echo "try 'pypy3.6-7.2.0-src' to build from source." echo } >&2 exit 1 fi ;; "win32" ) install_zip "pypy3.6-v7.2.0-win32" "https://downloads.python.org/pypy/pypy3.6-v7.2.0-win32.zip#c926f622bec24a8b348591d631717ace83b3a6c3c2dac02b157b622b97d1fc9c" "pypy" verify_py36 ensurepip ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." echo "try 'pypy3.6-7.2.0-src' to build from source." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.6-7.2.0-src000066400000000000000000000006461517431316200265240ustar00rootroot00000000000000prefer_openssl11 install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl install_package "pypy3.6-v7.2.0-src" "https://downloads.python.org/pypy/pypy3.6-v7.2.0-src.tar.bz2#0d7c707df5041f1593fe82f29c40056c21e4d6cb66554bbd66769bd80bcbfafc" "pypy_builder" verify_py36 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.6-7.3.0000066400000000000000000000035421517431316200257360ustar00rootroot00000000000000VERSION='7.3.0' PYVER='3.6' case "$(pypy_architecture 2>/dev/null || true)" in "linux" ) install_package "pypy${PYVER}-v${VERSION}-linux32" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-linux32.tar.bz2#7045b295d38ba0b5ee65bd3f078ca249fcf1de73fedeaab2d6ad78de2eab0f0e" "pypy" "verify_py${PYVER//./}" ensurepip ;; "linux64" ) install_package "pypy${PYVER}-v${VERSION}-linux64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-linux64.tar.bz2#d3d549e8f43de820ac3385b698b83fa59b4d7dd6cf3fe34c115f731e26ad8856" "pypy" "verify_py${PYVER//./}" ensurepip ;; "linux-aarch64" ) install_package "pypy${PYVER}-v${VERSION}-aarch64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-aarch64.tar.bz2#b900241bca7152254c107a632767f49edede99ca6360b9a064141267b47ef598" "pypy" "verify_py${PYVER//./}" ensurepip ;; "osx64" ) if require_osx_version "10.13"; then install_package "pypy${PYVER}-v${VERSION}-osx64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-osx64.tar.bz2#87b2545dad75fe3027b4b2108aceb9fdadcdd24e61ae312ac48b449fdd452bf3" "pypy" "verify_py${PYVER//./}" ensurepip else { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true), OS X < 10.13." echo "try 'pypy${PYVER}-${VERSION}-src' to build from source." echo } >&2 exit 1 fi ;; "win32" ) install_zip "pypy${PYVER}-v${VERSION}-win32" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-win32.zip#30e6870c4f3d8ef91890a6556a98080758000ba7c207cccdd86a8f5d358998c1" "pypy" "verify_py${PYVER//./}" ensurepip ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." echo "try 'pypy${PYVER}-${VERSION}-src' to build from source." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.6-7.3.0-src000066400000000000000000000006461517431316200265250ustar00rootroot00000000000000prefer_openssl11 install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl install_package "pypy3.6-v7.3.0-src" "https://downloads.python.org/pypy/pypy3.6-v7.3.0-src.tar.bz2#48d12c15fbcbcf4a32882a883195e1f922997cde78e7a16d4342b9b521eefcfa" "pypy_builder" verify_py36 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.6-7.3.1000066400000000000000000000035421517431316200257370ustar00rootroot00000000000000VERSION='7.3.1' PYVER='3.6' case "$(pypy_architecture 2>/dev/null || true)" in "linux" ) install_package "pypy${PYVER}-v${VERSION}-linux32" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-linux32.tar.bz2#2e7a818c67f3ac0708e4d8cdf1961f30cf9586b3f3ca2f215d93437c5ea4567b" "pypy" "verify_py${PYVER//./}" ensurepip ;; "linux64" ) install_package "pypy${PYVER}-v${VERSION}-linux64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-linux64.tar.bz2#f67cf1664a336a3e939b58b3cabfe47d893356bdc01f2e17bc912aaa6605db12" "pypy" "verify_py${PYVER//./}" ensurepip ;; "linux-aarch64" ) install_package "pypy${PYVER}-v${VERSION}-aarch64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-aarch64.tar.bz2#0069bc3c1570b935f1687f5e128cf050cd7229309e48fad2a2bf2140d43ffcee" "pypy" "verify_py${PYVER//./}" ensurepip ;; "osx64" ) if require_osx_version "10.13"; then install_package "pypy${PYVER}-v${VERSION}-osx64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-osx64.tar.bz2#d9c1778cd1ba37e129b495ea0f35ccdd9b68f5cd9d33ef0ce24e955c16d8840b" "pypy" "verify_py${PYVER//./}" ensurepip else { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true), OS X < 10.13." echo "try 'pypy${PYVER}-${VERSION}-src' to build from source." echo } >&2 exit 1 fi ;; "win32" ) install_zip "pypy${PYVER}-v${VERSION}-win32" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-win32.zip#752fbe8c4abee6468e5ce22af82818f821daded36faa65f3d69423f9c217007a" "pypy" "verify_py${PYVER//./}" ensurepip ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." echo "try 'pypy${PYVER}-${VERSION}-src' to build from source." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.6-7.3.1-src000066400000000000000000000006341517431316200265230ustar00rootroot00000000000000prefer_openssl11 install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl install_package "pypy3.6-v7.3.1-src" "https://downloads.python.org/pypy/pypy3.6-v7.3.1-src.tar.bz2#0c2cc3229da36c6984baee128c8ff8bb4516d69df1d73275dc4622bf249afa83" "pypy_builder" verify_py36 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.6-7.3.2000066400000000000000000000035421517431316200257400ustar00rootroot00000000000000VERSION='7.3.2' PYVER='3.6' case "$(pypy_architecture 2>/dev/null || true)" in "linux" ) install_package "pypy${PYVER}-v${VERSION}-linux32" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-linux32.tar.bz2#6fa871dedf5e60372231362d2ccb0f28f623d42267cabb49be11a3e10bee2726" "pypy" "verify_py${PYVER//./}" ensurepip ;; "linux64" ) install_package "pypy${PYVER}-v${VERSION}-linux64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-linux64.tar.bz2#d7a91f179076aaa28115ffc0a81e46c6a787785b2bc995c926fe3b02f0e9ad83" "pypy" "verify_py${PYVER//./}" ensurepip ;; "linux-aarch64" ) install_package "pypy${PYVER}-v${VERSION}-aarch64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-aarch64.tar.bz2#164d6a0503c83dd328e1a6bf7fcb2b2e977c1d27c6fcc491a7174fd37bc32a12" "pypy" "verify_py${PYVER//./}" ensurepip ;; "osx64" ) if require_osx_version "10.13"; then install_package "pypy${PYVER}-v${VERSION}-osx64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-osx64.tar.bz2#fd457bfeaf54aa69417b6aa4817df40e702dc8aaaf7e83ba005d391a1bddfa96" "pypy" "verify_py${PYVER//./}" ensurepip else { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true), OS X < 10.13." echo "try 'pypy${PYVER}-${VERSION}-src' to build from source." echo } >&2 exit 1 fi ;; "win32" ) install_zip "pypy${PYVER}-v${VERSION}-win32" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-win32.zip#13a39d46340afed20f11de24e9068968386e4bb7c8bd168662711916e2bf1da6" "pypy" "verify_py${PYVER//./}" ensurepip ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." echo "try 'pypy${PYVER}-${VERSION}-src' to build from source." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.6-7.3.2-src000066400000000000000000000006341517431316200265240ustar00rootroot00000000000000prefer_openssl11 install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl install_package "pypy3.6-v7.3.2-src" "https://downloads.python.org/pypy/pypy3.6-v7.3.2-src.tar.bz2#fd6175fed63ff9fccd7886068078853078948d98afae9bd4f5554c6f7873c10d" "pypy_builder" verify_py36 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.6-7.3.3000066400000000000000000000035421517431316200257410ustar00rootroot00000000000000VERSION='7.3.3' PYVER='3.6' case "$(pypy_architecture 2>/dev/null || true)" in "linux" ) install_package "pypy${PYVER}-v${VERSION}-linux32" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-linux32.tar.bz2#f183c61e66fd2c536a65695bd7ff770748c2884c235a589b9c6ac63690770c69" "pypy" "verify_py${PYVER//./}" ensurepip ;; "linux64" ) install_package "pypy${PYVER}-v${VERSION}-linux64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-linux64.tar.bz2#4fb85fdd516482cab727bb9473b066ff8fb672940dedf7ccc32bf92957d29e0a" "pypy" "verify_py${PYVER//./}" ensurepip ;; "linux-aarch64" ) install_package "pypy${PYVER}-v${VERSION}-aarch64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-aarch64.tar.bz2#bc82cf7f0182b942a2cfad4a0d167f364bfbf18f434e100a2fe62bc88547ac9b" "pypy" "verify_py${PYVER//./}" ensurepip ;; "osx64" ) if require_osx_version "10.13"; then install_package "pypy${PYVER}-v${VERSION}-osx64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-osx64.tar.bz2#84126fcb957f260de221244222152c981643144df1d817329781f555daa52e35" "pypy" "verify_py${PYVER//./}" ensurepip else { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true), OS X < 10.13." echo "try 'pypy${PYVER}-${VERSION}-src' to build from source." echo } >&2 exit 1 fi ;; "win32" ) install_zip "pypy${PYVER}-v${VERSION}-win32" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-win32.zip#b935253877b703d29b1b11f79e66944f1f88adb8a76f871abf765d4de9d25f8a" "pypy" "verify_py${PYVER//./}" ensurepip ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." echo "try 'pypy${PYVER}-${VERSION}-src' to build from source." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.6-7.3.3-src000066400000000000000000000006341517431316200265250ustar00rootroot00000000000000prefer_openssl11 install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl install_package "pypy3.6-v7.3.3-src" "https://downloads.python.org/pypy/pypy3.6-v7.3.3-src.tar.bz2#a23d21ca0de0f613732af4b4abb0b0db1cc56134b5bf0e33614eca87ab8805af" "pypy_builder" verify_py36 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.7-7.3.2000066400000000000000000000035421517431316200257410ustar00rootroot00000000000000VERSION='7.3.2' PYVER='3.7' case "$(pypy_architecture 2>/dev/null || true)" in "linux" ) install_package "pypy${PYVER}-v${VERSION}-linux32" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-linux32.tar.bz2#34c7e1c7bd06e437ad43cc90a20f9444be1f0a264d0955e32098294c30274784" "pypy" "verify_py${PYVER//./}" ensurepip ;; "linux64" ) install_package "pypy${PYVER}-v${VERSION}-linux64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-linux64.tar.bz2#a285ddcbc909d68c648585fae4f33b0ba24961bb4e8fafe5874cf725d6e83df6" "pypy" "verify_py${PYVER//./}" ensurepip ;; "linux-aarch64" ) install_package "pypy${PYVER}-v${VERSION}-aarch64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-aarch64.tar.bz2#c5c35a37917f759c19e2a6b3df3b4d56298faa2fae83c143469bcbda42ca5dd2" "pypy" "verify_py${PYVER//./}" ensurepip ;; "osx64" ) if require_osx_version "10.13"; then install_package "pypy${PYVER}-v${VERSION}-osx64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-osx64.tar.bz2#337dd4d9e529d2f221e0beb092236c18430e0564ab835c6bba425a1daf7c9958" "pypy" "verify_py${PYVER//./}" ensurepip else { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true), OS X < 10.13." echo "try 'pypy${PYVER}-${VERSION}-src' to build from source." echo } >&2 exit 1 fi ;; "win32" ) install_zip "pypy${PYVER}-v${VERSION}-win32" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-win32.zip#e3c589be07760bc3042981c379b7fd1603e832a4db426075f09e090473846a96" "pypy" "verify_py${PYVER//./}" ensurepip ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." echo "try 'pypy${PYVER}-${VERSION}-src' to build from source." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.7-7.3.2-src000066400000000000000000000006341517431316200265250ustar00rootroot00000000000000prefer_openssl11 install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl install_package "pypy3.7-v7.3.2-src" "https://downloads.python.org/pypy/pypy3.7-v7.3.2-src.tar.bz2#9274186eb0c28716a8c6134803b1df857bc3f496e25e50e605c4d95201c8817d" "pypy_builder" verify_py37 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.7-7.3.3000066400000000000000000000035421517431316200257420ustar00rootroot00000000000000VERSION='7.3.3' PYVER='3.7' case "$(pypy_architecture 2>/dev/null || true)" in "linux" ) install_package "pypy${PYVER}-v${VERSION}-linux32" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-linux32.tar.bz2#7d81b8e9fcd07c067cfe2f519ab770ec62928ee8787f952cadf2d2786246efc8" "pypy" "verify_py${PYVER//./}" ensurepip ;; "linux64" ) install_package "pypy${PYVER}-v${VERSION}-linux64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-linux64.tar.bz2#37e2804c4661c86c857d709d28c7de716b000d31e89766599fdf5a98928b7096" "pypy" "verify_py${PYVER//./}" ensurepip ;; "linux-aarch64" ) install_package "pypy${PYVER}-v${VERSION}-aarch64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-aarch64.tar.bz2#ee4aa041558b58de6063dd6df93b3def221c4ca4c900d6a9db5b1b52135703a8" "pypy" "verify_py${PYVER//./}" ensurepip ;; "osx64" ) if require_osx_version "10.13"; then install_package "pypy${PYVER}-v${VERSION}-osx64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-osx64.tar.bz2#d72b27d5bb60813273f14f07378a08822186a66e216c5d1a768ad295b582438d" "pypy" "verify_py${PYVER//./}" ensurepip else { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true), OS X < 10.13." echo "try 'pypy${PYVER}-${VERSION}-src' to build from source." echo } >&2 exit 1 fi ;; "win32" ) install_zip "pypy${PYVER}-v${VERSION}-win32" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-win32.zip#a282ce40aa4f853e877a5dbb38f0a586a29e563ae9ba82fd50c7e5dc465fb649" "pypy" "verify_py${PYVER//./}" ensurepip ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." echo "try 'pypy${PYVER}-${VERSION}-src' to build from source." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.7-7.3.3-src000066400000000000000000000006341517431316200265260ustar00rootroot00000000000000prefer_openssl11 install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl install_package "pypy3.7-v7.3.3-src" "https://downloads.python.org/pypy/pypy3.7-v7.3.3-src.tar.bz2#f6c96401f76331e474cca2d14437eb3b2f68a0f27220a6dcbc537445fe9d5b78" "pypy_builder" verify_py37 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.7-7.3.4000066400000000000000000000035421517431316200257430ustar00rootroot00000000000000VERSION='7.3.4' PYVER='3.7' case "$(pypy_architecture 2>/dev/null || true)" in "linux" ) install_package "pypy${PYVER}-v${VERSION}-linux32" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-linux32.tar.bz2#04de1a2e80530f3d74abcf133ec046a0fb12d81956bc043dee8ab4799f3b77eb" "pypy" "verify_py${PYVER//./}" ensurepip ;; "linux64" ) install_package "pypy${PYVER}-v${VERSION}-linux64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-linux64.tar.bz2#09d7298b44a38648a87995ec06e1e093761644e50f547c8bb0b2d7f4fe433548" "pypy" "verify_py${PYVER//./}" ensurepip ;; "linux-aarch64" ) install_package "pypy${PYVER}-v${VERSION}-aarch64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-aarch64.tar.bz2#a4148fa73b74a091e004e1f378b278c0b8830984cbcb91e10fa31fd915c43efe" "pypy" "verify_py${PYVER//./}" ensurepip ;; "osx64" ) if require_osx_version "10.13"; then install_package "pypy${PYVER}-v${VERSION}-osx64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-osx64.tar.bz2#8a4f0e6c7e3845820202bf7f46b48e36886ceb820ff0767963fd74091c4f5d13" "pypy" "verify_py${PYVER//./}" ensurepip else { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true), OS X < 10.13." echo "try 'pypy${PYVER}-${VERSION}-src' to build from source." echo } >&2 exit 1 fi ;; "win64" ) install_zip "pypy${PYVER}-v${VERSION}-win64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-win64.zip#0ff4e4653f1ff0653f105680eb101c64c857fa8f828a54a61b02f65c94b5d262" "pypy" "verify_py${PYVER//./}" ensurepip ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." echo "try 'pypy${PYVER}-${VERSION}-src' to build from source." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.7-7.3.4-src000066400000000000000000000006341517431316200265270ustar00rootroot00000000000000prefer_openssl11 install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl install_package "pypy3.7-v7.3.4-src" "https://downloads.python.org/pypy/pypy3.7-v7.3.4-src.tar.bz2#74d3c1e79f3fc7d384ffb32d3d2a95c2d5f61b81091eccce12ac76030d96ad08" "pypy_builder" verify_py37 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.7-7.3.5000066400000000000000000000035431517431316200257450ustar00rootroot00000000000000VERSION='7.3.5' PYVER='3.7' case "$(pypy_architecture 2>/dev/null || true)" in "linux" ) install_package "pypy${PYVER}-v${VERSION}-linux32" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-linux32.tar.bz2#3dd8b565203d372829e53945c599296fa961895130342ea13791b17c84ed06c4" "pypy" "verify_py${PYVER//./}" ensurepip ;; "linux64" ) install_package "pypy${PYVER}-v${VERSION}-linux64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-linux64.tar.bz2#9000db3e87b54638e55177e68cbeb30a30fe5d17b6be48a9eb43d65b3ebcfc26" "pypy" "verify_py${PYVER//./}" ensurepip ;; "linux-aarch64" ) install_package "pypy${PYVER}-v${VERSION}-aarch64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-aarch64.tar.bz2#85d83093b3ef5b863f641bc4073d057cc98bb821e16aa9361a5ff4898e70e8ee" "pypy" "verify_py${PYVER//./}" ensurepip ;; "osx64" ) if require_osx_version "10.13"; then install_package "pypy${PYVER}-v${VERSION}-osx64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-osx64.tar.bz2#b3a7d3099ad83de7c267bb79ae609d5ce73b01800578ffd91ba7e221b13f80db" "pypy" "verify_py${PYVER//./}" ensurepip else { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true), OS X < 10.13." echo "try 'pypy${PYVER}-${VERSION}-src' to build from source." echo } >&2 exit 1 fi ;; "win64" ) install_zip "pypy${PYVER}-v${VERSION}-win64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-win64.zip#072bd22427178dc4e65d961f50281bd2f56e11c4e4d9f16311c703f69f46ae24" "pypy" "verify_py${PYVER//./}" ensurepip ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." echo "try 'pypy${PYVER}-${VERSION}-src' to build from source." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.7-7.3.5-src000066400000000000000000000006341517431316200265300ustar00rootroot00000000000000prefer_openssl11 install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl install_package "pypy3.7-v7.3.5-src" "https://downloads.python.org/pypy/pypy3.7-v7.3.5-src.tar.bz2#d920fe409a9ecad9d074aa8568ca5f3ed3581be66f66e5d8988b7ec66e6d99a2" "pypy_builder" verify_py37 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.7-7.3.6000066400000000000000000000041771517431316200257520ustar00rootroot00000000000000VERSION='7.3.6' PYVER='3.7' # https://www.pypy.org/checksums.html case "$(pypy_architecture 2>/dev/null || true)" in "linux" ) install_package "pypy${PYVER}-v${VERSION}-linux32" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-linux32.tar.bz2#459e77c845b31fa9367f7b1b1122155f0ba7888b1d4ce4455c35d2111eeeb275" "pypy" "verify_py${PYVER//./}" ensurepip ;; "linux64" ) install_package "pypy${PYVER}-v${VERSION}-linux64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-linux64.tar.bz2#c41d07063b1d002a91ad2a0763b4baaca2b306ec635889c2e4826e706cc7f9ca" "pypy" "verify_py${PYVER//./}" ensurepip ;; "linux-aarch64" ) install_package "pypy${PYVER}-v${VERSION}-aarch64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-aarch64.tar.bz2#d446b6987eeaa03d706603863e83d6b99df69232cf1e06d3ee5706add6a84cd6" "pypy" "verify_py${PYVER//./}" ensurepip ;; "osx64" ) if require_osx_version "10.13"; then install_package "pypy${PYVER}-v${VERSION}-osx64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-osx64.tar.bz2#26f0c5c2a5f4a2ce35281d2fa760aa10715300dd110387eac43699a78ed32365" "pypy" "verify_py${PYVER//./}" ensurepip else { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true), OS X < 10.13." echo "try 'pypy${PYVER}-${VERSION}-src' to build from source." echo } >&2 exit 1 fi ;; "s390x" ) install_package "pypy${PYVER}-v${VERSION}-s390x" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-s390x.tar.bz2#3659bf96a177a53426ffc38d3619c6ee307e600c80e924edc9cee604680c141d" "pypy" "verify_py${PYVER//./}" ensurepip ;; "win64" ) install_zip "pypy${PYVER}-v${VERSION}-win64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-win64.zip#341e69a369da5a1f4f69dbbd47e7dff5e745439b203e28c7afcf98308a24b003" "pypy" "verify_py${PYVER//./}" ensurepip ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." echo "try 'pypy${PYVER}-${VERSION}-src' to build from source." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.7-7.3.6-src000066400000000000000000000007311517431316200265270ustar00rootroot00000000000000VERSION='7.3.6' PYVER='3.7' prefer_openssl11 install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl install_package "pypy${PYVER}-v${VERSION}-src" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-src.tar.bz2#9252ccaa130094205b3c7f0a2cad5adc0d9dfba31658ff3172f788dec1fdb348" "pypy_builder" "verify_py${PYVER//./}" ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.7-7.3.7000066400000000000000000000041771517431316200257530ustar00rootroot00000000000000VERSION='7.3.7' PYVER='3.7' # https://www.pypy.org/checksums.html case "$(pypy_architecture 2>/dev/null || true)" in "linux" ) install_package "pypy${PYVER}-v${VERSION}-linux32" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-linux32.tar.bz2#0ab9e2e8ae1ac463bb811b9d3ba24d138f41f7378c17ca9e2d8dee51bf151d19" "pypy" "verify_py${PYVER//./}" ensurepip ;; "linux64" ) install_package "pypy${PYVER}-v${VERSION}-linux64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-linux64.tar.bz2#8332f923755441fedfe4767a84601c94f4d6f8475384406cb5f259ad8d0b2002" "pypy" "verify_py${PYVER//./}" ensurepip ;; "linux-aarch64" ) install_package "pypy${PYVER}-v${VERSION}-aarch64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-aarch64.tar.bz2#a1a84882525dd574c4b051b66e9b7ef0e132392acc2f729420d7825f96835216" "pypy" "verify_py${PYVER//./}" ensurepip ;; "osx64" ) if require_osx_version "10.13"; then install_package "pypy${PYVER}-v${VERSION}-osx64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-osx64.tar.bz2#edc9df7d0f7c56f7ee05b24117bdb6c03aa65e768471e210c05ccdbbfd11a866" "pypy" "verify_py${PYVER//./}" ensurepip else { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true), OS X < 10.13." echo "try 'pypy${PYVER}-${VERSION}-src' to build from source." echo } >&2 exit 1 fi ;; "s390x" ) install_package "pypy${PYVER}-v${VERSION}-s390x" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-s390x.tar.bz2#7f91efc65a69e727519cc885ca6351f4bfdd6b90580dced2fdcc9ae1bf10013b" "pypy" "verify_py${PYVER//./}" ensurepip ;; "win64" ) install_zip "pypy${PYVER}-v${VERSION}-win64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-win64.zip#53505dc0b57590290efd7656117ee5384bcd036f7f7c4f0bc3f5cd10299037d1" "pypy" "verify_py${PYVER//./}" ensurepip ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." echo "try 'pypy${PYVER}-${VERSION}-src' to build from source." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.7-7.3.7-src000066400000000000000000000007771517431316200265420ustar00rootroot00000000000000VERSION='7.3.7' PYVER='3.7' # https://www.pypy.org/checksums.html prefer_openssl11 install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl install_package "pypy${PYVER}-v${VERSION}-src" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-src.tar.bz2#2ed02ac9e710859c41bc82deafb08619792bb9a27eeaa1676c741ededd214dd7" "pypy_builder" "verify_py${PYVER//./}" ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.7-7.3.8000066400000000000000000000047201517431316200257460ustar00rootroot00000000000000VERSION='7.3.8' PYVER='3.7' # https://www.pypy.org/checksums.html aarch64_hash=4fb2f8281f3aaca72e6fe62ecc5fc054fcc79cd061ca3e0eea730f7d82d610d4 linux32_hash=38429ec6ea1aca391821ee4fbda7358ae86de4600146643f2af2fe2c085af839 linux64_hash=409085db79a6d90bfcf4f576dca1538498e65937acfbe03bd4909bdc262ff378 osx64_hash=76b8eef5b059a7e478f525615482d2a6e9feb83375e3f63c16381d80521a693f s390x_hash=5c2cd3f7cf04cb96f6bcc6b02e271f5d7275867763978e66651b8d1605ef3141 win64_hash=96df67492bc8d62b2e71dddf5f6c58965a26cac9799c5f4081401af0494b3bcc ### end of manual settings - following lines same for every download function pypy_pkg_data { # pypy architecture local ARCH="${1}" local basesrc="pypy${PYVER}-${VERSION}-src" local basever="pypy${PYVER}-v${VERSION}" local baseurl="https://downloads.python.org/pypy/${basever}" # defaults local cmd='install_package' # use bz2 local pkg="${ARCH}" # assume matches local url="${baseurl}-${pkg}.tar.bz2" # use bz2 local hash='' # undefined case "${pkg}" in 'linux-aarch64' ) hash="${aarch64_hash}" url="${baseurl}-aarch64.tar.bz2" # diff url ;; 'linux' ) hash="${linux32_hash}" pkg='linux32' # package name revised url="${baseurl}-${pkg}.tar.bz2" # new url ;; 'linux64' ) hash="${linux64_hash}" ;; 'osx64' ) if require_osx_version "10.13"; then hash="${osx64_hash}" else { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true), OS X < 10.13." echo "try '${basesrc}' to build from source." echo } >&2 exit 1 fi ;; 's390x' ) hash="${s390x_hash}" ;; 'win64' ) hash="${win64_hash}" cmd='install_zip' # diff command url="${baseurl}-${pkg}.zip" # zip rather than bz2 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." echo "try '${basesrc}' to build from source." echo } >&2 exit 1 ;; esac # result - command, package dir, url+hash echo "${cmd}" "${basever}-${pkg}" "${url}#${hash}" } # determine command, package directory, url+hash declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" # install ${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip' pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.7-7.3.8-src000066400000000000000000000011321517431316200265250ustar00rootroot00000000000000VERSION='7.3.8' PYVER='3.7' # https://www.pypy.org/checksums.html hash=35752be62b148fa6f7fb69e58e1f993c7cc319bea54928eb03ed2e75b8248d5f ### end of manual settings - following lines same for every download ver="pypy${PYVER}-v${VERSION}-src" url="https://downloads.python.org/pypy/${ver}.tar.bz2" prefer_openssl11 install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip' pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.7-7.3.9000066400000000000000000000044651517431316200257550ustar00rootroot00000000000000VERSION='7.3.9' PYVER='3.7' # https://www.pypy.org/checksums.html aarch64_hash=dfc62f2c453fb851d10a1879c6e75c31ffebbf2a44d181bb06fcac4750d023fc linux32_hash=3398cece0167b81baa219c9cd54a549443d8c0a6b553ec8ec13236281e0d86cd linux64_hash=c58195124d807ecc527499ee19bc511ed753f4f2e418203ca51bc7e3b124d5d1 osx64_hash=12d92f578a200d50959e55074b20f29f93c538943e9a6e6522df1a1cc9cef542 s390x_hash=fcab3b9e110379948217cf592229542f53c33bfe881006f95ce30ac815a6df48 win64_hash=8acb184b48fb3c854de0662e4d23a66b90e73b1ab73a86695022c12c745d8b00 ### end of manual settings - following lines same for every download function err_no_binary { local archmsg="${1}" local ver="pypy${PYVER}-v${VERSION}-src" local url="https://downloads.python.org/pypy/${ver}.tar.bz2" { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for ${archmsg}." echo "try '${url}' to build from source." echo } >&2 exit 1 } function pypy_pkg_data { # pypy architecture tag local ARCH="${1}" # defaults local cmd='install_package' # use bz2 local pkg="${ARCH}" # assume matches local ext='tar.bz2' # windows is always diff... local hash='' # undefined # select the hash, fix pkg if not match ARCH, windows has ext of zip case "${ARCH}" in 'linux-aarch64' ) hash="${aarch64_hash}" pkg='aarch64' ;; 'linux' ) hash="${linux32_hash}" pkg='linux32' ;; 'linux64' ) hash="${linux64_hash}" ;; 'osx64' ) if require_osx_version "10.13"; then hash="${osx64_hash}" else err_no_binary "${ARCH}, OS X < 10.13" fi ;; 's390x' ) hash="${s390x_hash}" ;; 'win64' ) hash="${win64_hash}" cmd='install_zip' # diff command ext='zip' # zip rather than bz2 ;; * ) err_no_binary "${ARCH}" ;; esac local basever="pypy${PYVER}-v${VERSION}" local baseurl="https://downloads.python.org/pypy/${basever}" # result - command, package dir, url+hash echo "${cmd}" "${basever}-${pkg}" "${baseurl}-${pkg}.${ext}#${hash}" } # determine command, package directory, url+hash declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" # install ${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip' pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.7-7.3.9-src000066400000000000000000000011321517431316200265260ustar00rootroot00000000000000VERSION='7.3.9' PYVER='3.7' # https://www.pypy.org/checksums.html hash=70426163b194ee46009986eea6d9426098a3ffb552d9cdbd3dfaa64a47373f49 ### end of manual settings - following lines same for every download ver="pypy${PYVER}-v${VERSION}-src" url="https://downloads.python.org/pypy/${ver}.tar.bz2" prefer_openssl11 install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip' pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.7-c-jit-latest000066400000000000000000000033061517431316200275700ustar00rootroot00000000000000echo colorize 1 "WARNING" echo ": This may eat your kittens/ affect timespace in alternate dimensions/" echo "cause you to complain more. Nightly builds are meant for testing only." echo "Current pypy py3.7 development status:" echo echo "https://foss.heptapod.net/pypy/pypy/-/wikis/py3.7%20status" echo echo "for the latest status updates. To report bugs/regressions, please see:" echo echo "https://doc.pypy.org/en/latest/faq.html#how-should-i-report-a-bug" echo case "$(pypy_architecture 2>/dev/null || true)" in "linux" ) install_nightly_package "pypy-c-jit-latest-linux" "https://buildbot.pypy.org/nightly/py3.7/pypy-c-jit-latest-linux.tar.bz2" "pypy-c-jit-*-linux" "pypy" verify_py27 ensurepip ;; "linux64" ) install_nightly_package "pypy3.7-c-jit-latest-linux64" "https://buildbot.pypy.org/nightly/py3.7/pypy-c-jit-latest-linux64.tar.bz2" "pypy-c-jit-*-linux64" "pypy" verify_py35 ensurepip ;; "linux-aarch64" ) install_nightly_package "pypy3.7-c-jit-latest-aarch64" "https://buildbot.pypy.org/nightly/py3.7/pypy-c-jit-latest-aarch64.tar.bz2" "pypy-c-jit-*-aarch64" "pypy" verify_py35 ensurepip ;; "osx64" ) install_nightly_package "pypy-c-jit-latest-osx64" "https://buildbot.pypy.org/nightly/py3.7/pypy-c-jit-latest-osx64.tar.bz2" "pypy-c-jit-*-osx64" "pypy" verify_py27 ensurepip ;; "win32" ) install_zip "pypy-c-jit-latest-win32" "https://buildbot.pypy.org/nightly/py3.7/pypy-c-jit-latest-win32.zip" "pypy" verify_py27 ensurepip ;; * ) { echo colorize 1 "ERROR" echo ": The latest nightly build of PyPy 3.7 is not available for $(pypy_architecture 2>/dev/null || true)," echo "Please check https://buildbot.pypy.org/nightly/py3.7/ for previous builds." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.8-7.3.10000066400000000000000000000043551517431316200260240ustar00rootroot00000000000000VERSION='7.3.10' PYVER='3.8' # https://www.pypy.org/checksums.html aarch64_hash=e4caa1a545f22cfee87d5b9aa6f8852347f223643ad7d2562e0b2a2f4663ad98 linux32_hash=b70ed7fdc73a74ebdc04f07439f7bad1a849aaca95e26b4a74049d0e483f071c linux64_hash=ceef6496fd4ab1c99e3ec22ce657b8f10f8bb77a32427fadfb5e1dd943806011 osarm64_hash=6cb1429371e4854b718148a509d80143f801e3abfc72fef58d88aeeee1e98f9e osx64_hash=399eb1ce4c65f62f6a096b7c273536601b7695e3c0dc0457393a659b95b7615b s390x_hash=c294f8e815158388628fe77ac5b8ad6cd93c8db1359091fa02d41cf6da4d61a1 ### end of manual settings - following lines same for every download function err_no_binary { local archmsg="${1}" local ver="pypy${PYVER}-v${VERSION}-src" local url="https://downloads.python.org/pypy/${ver}.tar.bz2" { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for ${archmsg}." echo "try '${url}' to build from source." echo } >&2 exit 1 } function pypy_pkg_data { # pypy architecture tag local ARCH="${1}" # defaults local cmd='install_package' # use bz2 local pkg="${ARCH}" # assume matches local ext='tar.bz2' local hash='' # undefined # select the hash, fix pkg if not match ARCH case "${ARCH}" in 'linux-aarch64' ) hash="${aarch64_hash}" pkg='aarch64' ;; 'linux' ) hash="${linux32_hash}" pkg='linux32' ;; 'linux64' ) hash="${linux64_hash}" ;; 'osarm64' ) hash="${osarm64_hash}" pkg='macos_arm64' ;; 'osx64' ) if require_osx_version "10.13"; then hash="${osx64_hash}" pkg='macos_x86_64' else err_no_binary "${ARCH}, OS X < 10.13" fi ;; 's390x' ) hash="${s390x_hash}" ;; * ) err_no_binary "${ARCH}" ;; esac local basever="pypy${PYVER}-v${VERSION}" local baseurl="https://downloads.python.org/pypy/${basever}" # result - command, package dir, url+hash echo "${cmd}" "${basever}-${pkg}" "${baseurl}-${pkg}.${ext}#${hash}" } # determine command, package directory, url+hash declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" # install ${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip' pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.8-7.3.10-src000066400000000000000000000011331517431316200266000ustar00rootroot00000000000000VERSION='7.3.10' PYVER='3.8' # https://www.pypy.org/checksums.html hash=218a1e062f17aba89f61bc398e8498f13c048b9fcf294343f5d9d56c3ac9b882 ### end of manual settings - following lines same for every download ver="pypy${PYVER}-v${VERSION}-src" url="https://downloads.python.org/pypy/${ver}.tar.bz2" prefer_openssl11 install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip' pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.8-7.3.11000066400000000000000000000043551517431316200260250ustar00rootroot00000000000000VERSION='7.3.11' PYVER='3.8' # https://www.pypy.org/checksums.html aarch64_hash=9a2fa0b8d92b7830aa31774a9a76129b0ff81afbd22cd5c41fbdd9119e859f55 linux32_hash=a79b31fce8f5bc1f9940b6777134189a1d3d18bda4b1c830384cda90077c9176 linux64_hash=470330e58ac105c094041aa07bb05676b06292bc61409e26f5c5593ebb2292d9 osarm64_hash=78cdc79ff964c4bfd13eb45a7d43a011cbe8d8b513323d204891f703fdc4fa1a osx64_hash=194ca0b4d91ae409a9cb1a59eb7572d7affa8a451ea3daf26539aa515443433a s390x_hash=eab7734d86d96549866f1cba67f4f9c73c989f6a802248beebc504080d4c3fcd ### end of manual settings - following lines same for every download function err_no_binary { local archmsg="${1}" local ver="pypy${PYVER}-v${VERSION}-src" local url="https://downloads.python.org/pypy/${ver}.tar.bz2" { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for ${archmsg}." echo "try '${url}' to build from source." echo } >&2 exit 1 } function pypy_pkg_data { # pypy architecture tag local ARCH="${1}" # defaults local cmd='install_package' # use bz2 local pkg="${ARCH}" # assume matches local ext='tar.bz2' local hash='' # undefined # select the hash, fix pkg if not match ARCH case "${ARCH}" in 'linux-aarch64' ) hash="${aarch64_hash}" pkg='aarch64' ;; 'linux' ) hash="${linux32_hash}" pkg='linux32' ;; 'linux64' ) hash="${linux64_hash}" ;; 'osarm64' ) hash="${osarm64_hash}" pkg='macos_arm64' ;; 'osx64' ) if require_osx_version "10.13"; then hash="${osx64_hash}" pkg='macos_x86_64' else err_no_binary "${ARCH}, OS X < 10.13" fi ;; 's390x' ) hash="${s390x_hash}" ;; * ) err_no_binary "${ARCH}" ;; esac local basever="pypy${PYVER}-v${VERSION}" local baseurl="https://downloads.python.org/pypy/${basever}" # result - command, package dir, url+hash echo "${cmd}" "${basever}-${pkg}" "${baseurl}-${pkg}.${ext}#${hash}" } # determine command, package directory, url+hash declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" # install ${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip' pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.8-7.3.11-src000066400000000000000000000011331517431316200266010ustar00rootroot00000000000000VERSION='7.3.11' PYVER='3.8' # https://www.pypy.org/checksums.html hash=4d6769bfca73734e8666fd70503b7ceb06a6e259110e617331bb3899ca4e6058 ### end of manual settings - following lines same for every download ver="pypy${PYVER}-v${VERSION}-src" url="https://downloads.python.org/pypy/${ver}.tar.bz2" prefer_openssl11 install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip' pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.8-7.3.6000066400000000000000000000041731517431316200257470ustar00rootroot00000000000000VERSION='7.3.6' PYVER='3.8' # https://www.pypy.org/checksums.html case "$(pypy_architecture 2>/dev/null || true)" in "linux" ) install_package "pypy${PYVER}-v${VERSION}-linux32" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-linux32.tar.bz2#e857a04a76285f0ef5bae84f6f5e9943ca415d499204c531b1c33fe8f015b48d" "pypy" "verify_py${PYVER//./}" ensurepip ;; "linux64" ) install_package "pypy${PYVER}-v${VERSION}-linux64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-linux64.tar.bz2#8579ea990e95d2b7e101ef47fd9ebf25a9500d5086e8f708c43f9bae83306ece" "pypy" "verify_py${PYVER//./}" ensurepip ;; "linux-aarch64" ) install_package "pypy${PYVER}-v${VERSION}-aarch64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-aarch64.tar.bz2#704d5303096e8a3173e73435f3bb204e31a8bf02ed5ba617a4a0f1e7491edf50" "pypy" "verify_py${PYVER//./}" ensurepip ;; "osx64" ) if require_osx_version "10.13"; then install_package "pypy${PYVER}-v${VERSION}-osx64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-osx64.tar.bz2#8195e52a20cf2a4f42c2d7e4969fbf44fe349c1f80f758e20525dd0f8c134bec" "pypy" "verify_py${PYVER//./}" ensurepip else { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true), OS X < 10.13." echo "try 'pypy${PYVER}-${VERSION}-src' to build from source." echo } >&2 exit 1 fi ;; "s390x" ) install_package "pypy${PYVER}-v${VERSION}-s390x" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-s390x.zip#a36208d5e950ec4b630b33d0aede8ca3da383d973fc5ca387082c7e5bad8d245" "pypy" "verify_py${PYVER//./}" ensurepip ;; "win64" ) install_zip "pypy${PYVER}-v${VERSION}-win64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-win64.zip#1b216fd75f8f0a48633cc21dce7d6f25ba65016142df758842e1df661269b458" "pypy" "verify_py${PYVER//./}" ensurepip ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." echo "try 'pypy${PYVER}-${VERSION}-src' to build from source." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.8-7.3.6-src000066400000000000000000000007771517431316200265420ustar00rootroot00000000000000VERSION='7.3.6' PYVER='3.8' # https://www.pypy.org/checksums.html prefer_openssl11 install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl install_package "pypy${PYVER}-v${VERSION}-src" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-src.tar.bz2#f234c56eb0d4ab0afb196232fb38cd1ca8e19b1c65cf7b65eb691695499be259" "pypy_builder" "verify_py${PYVER//./}" ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.8-7.3.7000066400000000000000000000041731517431316200257500ustar00rootroot00000000000000VERSION='7.3.7' PYVER='3.8' # https://www.pypy.org/checksums.html case "$(pypy_architecture 2>/dev/null || true)" in "linux" ) install_package "pypy${PYVER}-v${VERSION}-linux32" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-linux32.tar.bz2#dfb9d005f0fc917edc60fd618143e4934c412f9168b55166f5519ba0a3b1a835" "pypy" "verify_py${PYVER//./}" ensurepip ;; "linux64" ) install_package "pypy${PYVER}-v${VERSION}-linux64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-linux64.tar.bz2#5dee37c7c3cb8b160028fbde3a5901c68043dfa545a16794502b897d4bc40d7e" "pypy" "verify_py${PYVER//./}" ensurepip ;; "linux-aarch64" ) install_package "pypy${PYVER}-v${VERSION}-aarch64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-aarch64.tar.bz2#cbd44e0a9146b3c03a9d14b265774a848f387ed846316c3e984847e278d0efd3" "pypy" "verify_py${PYVER//./}" ensurepip ;; "osx64" ) if require_osx_version "10.13"; then install_package "pypy${PYVER}-v${VERSION}-osx64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-osx64.tar.bz2#1f044fe7bbdd443b7913ecf554683dab6dade5dcd7f47d4e6d01f4bb4cf84836" "pypy" "verify_py${PYVER//./}" ensurepip else { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true), OS X < 10.13." echo "try 'pypy${PYVER}-${VERSION}-src' to build from source." echo } >&2 exit 1 fi ;; "s390x" ) install_package "pypy${PYVER}-v${VERSION}-s390x" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-s390x.zip#ae7d6a76490b317a74b87788d596610c7ffd0ae2d3ffa2433d5bb5300f6b4b77" "pypy" "verify_py${PYVER//./}" ensurepip ;; "win64" ) install_zip "pypy${PYVER}-v${VERSION}-win64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-win64.zip#8ceb03d2f7b73c6ce0758290bc42ba366a45c46e033eda36f1779d957a905735" "pypy" "verify_py${PYVER//./}" ensurepip ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." echo "try 'pypy${PYVER}-${VERSION}-src' to build from source." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.8-7.3.7-src000066400000000000000000000007771517431316200265430ustar00rootroot00000000000000VERSION='7.3.7' PYVER='3.8' # https://www.pypy.org/checksums.html prefer_openssl11 install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl install_package "pypy${PYVER}-v${VERSION}-src" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-src.tar.bz2#21ae339f4f5016d6ca7300305f3e3b554373835cb3c39a9041fe30e6811c80c6" "pypy_builder" "verify_py${PYVER//./}" ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.8-7.3.8000066400000000000000000000047201517431316200257470ustar00rootroot00000000000000VERSION='7.3.8' PYVER='3.8' # https://www.pypy.org/checksums.html aarch64_hash=fe41df391f87239925e573e195e631a9d03d37f471eb1479790ee13ca47a28af linux32_hash=bea4b275decd492af6462157d293dd6fcf08a949859f8aec0959537b40afd032 linux64_hash=089f8e3e357d6130815964ddd3507c13bd53e4976ccf0a89b5c36a9a6775a188 osx64_hash=de1b283ff112d76395c0162a1cf11528e192bdc230ee3f1b237f7694c7518dee s390x_hash=0c46527770ec1322b98942860ad3551767d3e09d4481bcb49abd92001a293840 win64_hash=0894c468e7de758c509a602a28ef0ba4fbf197ccdf946c7853a7283d9bb2a345 ### end of manual settings - following lines same for every download function pypy_pkg_data { # pypy architecture local ARCH="${1}" local basesrc="pypy${PYVER}-${VERSION}-src" local basever="pypy${PYVER}-v${VERSION}" local baseurl="https://downloads.python.org/pypy/${basever}" # defaults local cmd='install_package' # use bz2 local pkg="${ARCH}" # assume matches local url="${baseurl}-${pkg}.tar.bz2" # use bz2 local hash='' # undefined case "${pkg}" in 'linux-aarch64' ) hash="${aarch64_hash}" url="${baseurl}-aarch64.tar.bz2" # diff url ;; 'linux' ) hash="${linux32_hash}" pkg='linux32' # package name revised url="${baseurl}-${pkg}.tar.bz2" # new url ;; 'linux64' ) hash="${linux64_hash}" ;; 'osx64' ) if require_osx_version "10.13"; then hash="${osx64_hash}" else { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true), OS X < 10.13." echo "try '${basesrc}' to build from source." echo } >&2 exit 1 fi ;; 's390x' ) hash="${s390x_hash}" ;; 'win64' ) hash="${win64_hash}" cmd='install_zip' # diff command url="${baseurl}-${pkg}.zip" # zip rather than bz2 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." echo "try '${basesrc}' to build from source." echo } >&2 exit 1 ;; esac # result - command, package dir, url+hash echo "${cmd}" "${basever}-${pkg}" "${url}#${hash}" } # determine command, package directory, url+hash declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" # install ${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip' pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.8-7.3.8-src000066400000000000000000000011321517431316200265260ustar00rootroot00000000000000VERSION='7.3.8' PYVER='3.8' # https://www.pypy.org/checksums.html hash=f1a378b264cdbfb0e03d77dfc4d105d02f91d542bd7c9c957d1f8083a9808f1f ### end of manual settings - following lines same for every download ver="pypy${PYVER}-v${VERSION}-src" url="https://downloads.python.org/pypy/${ver}.tar.bz2" prefer_openssl11 install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip' pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.8-7.3.9000066400000000000000000000044651517431316200257560ustar00rootroot00000000000000VERSION='7.3.9' PYVER='3.8' # https://www.pypy.org/checksums.html aarch64_hash=5e124455e207425e80731dff317f0432fa0aba1f025845ffca813770e2447e32 linux32_hash=4b261516c6c59078ab0c8bd7207327a1b97057b4ec1714ed5e79a026f9efd492 linux64_hash=08be25ec82fc5d23b78563eda144923517daba481a90af0ace7a047c9c9a3c34 osx64_hash=91a5c2c1facd5a4931a8682b7d792f7cf4f2ba25cd2e7e44e982139a6d5e4840 s390x_hash=c6177a0016c9145c7b99fddb5d74cc2e518ccdb216a6deb51ef6a377510cc930 win64_hash=05022baaa55db2b60880f2422312d9e4025e1267303ac57f33e8253559d0be88 ### end of manual settings - following lines same for every download function err_no_binary { local archmsg="${1}" local ver="pypy${PYVER}-v${VERSION}-src" local url="https://downloads.python.org/pypy/${ver}.tar.bz2" { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for ${archmsg}." echo "try '${url}' to build from source." echo } >&2 exit 1 } function pypy_pkg_data { # pypy architecture tag local ARCH="${1}" # defaults local cmd='install_package' # use bz2 local pkg="${ARCH}" # assume matches local ext='tar.bz2' # windows is always diff... local hash='' # undefined # select the hash, fix pkg if not match ARCH, windows has ext of zip case "${ARCH}" in 'linux-aarch64' ) hash="${aarch64_hash}" pkg='aarch64' ;; 'linux' ) hash="${linux32_hash}" pkg='linux32' ;; 'linux64' ) hash="${linux64_hash}" ;; 'osx64' ) if require_osx_version "10.13"; then hash="${osx64_hash}" else err_no_binary "${ARCH}, OS X < 10.13" fi ;; 's390x' ) hash="${s390x_hash}" ;; 'win64' ) hash="${win64_hash}" cmd='install_zip' # diff command ext='zip' # zip rather than bz2 ;; * ) err_no_binary "${ARCH}" ;; esac local basever="pypy${PYVER}-v${VERSION}" local baseurl="https://downloads.python.org/pypy/${basever}" # result - command, package dir, url+hash echo "${cmd}" "${basever}-${pkg}" "${baseurl}-${pkg}.${ext}#${hash}" } # determine command, package directory, url+hash declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" # install ${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip' pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.8-7.3.9-src000066400000000000000000000011321517431316200265270ustar00rootroot00000000000000VERSION='7.3.9' PYVER='3.8' # https://www.pypy.org/checksums.html hash=5b5d9d9256f12a129af8384e2f581bdfab3bc0fbbe3a0a480d9c1d2e95490eb1 ### end of manual settings - following lines same for every download ver="pypy${PYVER}-v${VERSION}-src" url="https://downloads.python.org/pypy/${ver}.tar.bz2" prefer_openssl11 install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip' pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.9-7.3.10000066400000000000000000000043551517431316200260250ustar00rootroot00000000000000VERSION='7.3.10' PYVER='3.9' # https://www.pypy.org/checksums.html aarch64_hash=657a04fd9a5a992a2f116a9e7e9132ea0c578721f59139c9fb2083775f71e514 linux32_hash=b6db59613b9a1c0c1ab87bc103f52ee95193423882dc8a848b68850b8ba59cc5 linux64_hash=95cf99406179460d63ddbfe1ec870f889d05f7767ce81cef14b88a3a9e127266 osarm64_hash=e2a6bec7408e6497c7de8165aa4a1b15e2416aec4a72f2578f793fb06859ccba osx64_hash=f90c8619b41e68ec9ffd7d5e913fe02e60843da43d3735b1c1bc75bcfe638d97 s390x_hash=ca6525a540cf0c682d1592ae35d3fbc97559a97260e4b789255cc76dde7a14f0 ### end of manual settings - following lines same for every download function err_no_binary { local archmsg="${1}" local ver="pypy${PYVER}-v${VERSION}-src" local url="https://downloads.python.org/pypy/${ver}.tar.bz2" { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for ${archmsg}." echo "try '${url}' to build from source." echo } >&2 exit 1 } function pypy_pkg_data { # pypy architecture tag local ARCH="${1}" # defaults local cmd='install_package' # use bz2 local pkg="${ARCH}" # assume matches local ext='tar.bz2' local hash='' # undefined # select the hash, fix pkg if not match ARCH case "${ARCH}" in 'linux-aarch64' ) hash="${aarch64_hash}" pkg='aarch64' ;; 'linux' ) hash="${linux32_hash}" pkg='linux32' ;; 'linux64' ) hash="${linux64_hash}" ;; 'osarm64' ) hash="${osarm64_hash}" pkg='macos_arm64' ;; 'osx64' ) if require_osx_version "10.13"; then hash="${osx64_hash}" pkg='macos_x86_64' else err_no_binary "${ARCH}, OS X < 10.13" fi ;; 's390x' ) hash="${s390x_hash}" ;; * ) err_no_binary "${ARCH}" ;; esac local basever="pypy${PYVER}-v${VERSION}" local baseurl="https://downloads.python.org/pypy/${basever}" # result - command, package dir, url+hash echo "${cmd}" "${basever}-${pkg}" "${baseurl}-${pkg}.${ext}#${hash}" } # determine command, package directory, url+hash declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" # install ${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip' pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.9-7.3.10-src000066400000000000000000000011331517431316200266010ustar00rootroot00000000000000VERSION='7.3.10' PYVER='3.9' # https://www.pypy.org/checksums.html hash=3738d32575ed2513e3e66878e4e4c6c208caed267570f3f9f814748830002967 ### end of manual settings - following lines same for every download ver="pypy${PYVER}-v${VERSION}-src" url="https://downloads.python.org/pypy/${ver}.tar.bz2" prefer_openssl11 install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip' pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.9-7.3.11000066400000000000000000000043551517431316200260260ustar00rootroot00000000000000VERSION='7.3.11' PYVER='3.9' # https://www.pypy.org/checksums.html aarch64_hash=09175dc652ed895d98e9ad63d216812bf3ee7e398d900a9bf9eb2906ba8302b9 linux32_hash=0099d72c2897b229057bff7e2c343624aeabdc60d6fb43ca882bff082f1ffa48 linux64_hash=d506172ca11071274175d74e9c581c3166432d0179b036470e3b9e8d20eae581 osarm64_hash=91ad7500f1a39531dbefa0b345a3dcff927ff9971654e8d2e9ef7c5ae311f57e osx64_hash=d33f40b207099872585afd71873575ca6ea638a27d823bc621238c5ae82542ed s390x_hash=e1f30f2ddbe3f446ddacd79677b958d56c07463b20171fb2abf8f9a3178b79fc ### end of manual settings - following lines same for every download function err_no_binary { local archmsg="${1}" local ver="pypy${PYVER}-v${VERSION}-src" local url="https://downloads.python.org/pypy/${ver}.tar.bz2" { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for ${archmsg}." echo "try '${url}' to build from source." echo } >&2 exit 1 } function pypy_pkg_data { # pypy architecture tag local ARCH="${1}" # defaults local cmd='install_package' # use bz2 local pkg="${ARCH}" # assume matches local ext='tar.bz2' local hash='' # undefined # select the hash, fix pkg if not match ARCH case "${ARCH}" in 'linux-aarch64' ) hash="${aarch64_hash}" pkg='aarch64' ;; 'linux' ) hash="${linux32_hash}" pkg='linux32' ;; 'linux64' ) hash="${linux64_hash}" ;; 'osarm64' ) hash="${osarm64_hash}" pkg='macos_arm64' ;; 'osx64' ) if require_osx_version "10.13"; then hash="${osx64_hash}" pkg='macos_x86_64' else err_no_binary "${ARCH}, OS X < 10.13" fi ;; 's390x' ) hash="${s390x_hash}" ;; * ) err_no_binary "${ARCH}" ;; esac local basever="pypy${PYVER}-v${VERSION}" local baseurl="https://downloads.python.org/pypy/${basever}" # result - command, package dir, url+hash echo "${cmd}" "${basever}-${pkg}" "${baseurl}-${pkg}.${ext}#${hash}" } # determine command, package directory, url+hash declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" # install ${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip' pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.9-7.3.11-src000066400000000000000000000011331517431316200266020ustar00rootroot00000000000000VERSION='7.3.11' PYVER='3.9' # https://www.pypy.org/checksums.html hash=b0f3166fb2a5aadfd5ceb9db5cdd5f7929a0eccca02b4a26c0dae0492f7ca8ea ### end of manual settings - following lines same for every download ver="pypy${PYVER}-v${VERSION}-src" url="https://downloads.python.org/pypy/${ver}.tar.bz2" prefer_openssl11 install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip' pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.9-7.3.12000066400000000000000000000043551517431316200260270ustar00rootroot00000000000000VERSION='7.3.12' PYVER='3.9' # https://www.pypy.org/checksums.html aarch64_hash=e9327fb9edaf2ad91935d5b8563ec5ff24193bddb175c1acaaf772c025af1824 linux32_hash=aa04370d38f451683ccc817d76c2b3e0f471dbb879e0bd618d9affbdc9cd37a4 linux64_hash=84c89b966fab2b58f451a482ee30ca7fec3350435bd0b9614615c61dc6da2390 osarm64_hash=0e8a1a3468b9790c734ac698f5b00cc03fc16899ccc6ce876465fac0b83980e3 osx64_hash=64f008ffa070c407e5ef46c8256b2e014de7196ea5d858385861254e7959f4eb s390x_hash=20d84658a6899bdd2ca35b00ead33a2f56cff2c40dce1af630466d27952f6d4f ### end of manual settings - following lines same for every download function err_no_binary { local archmsg="${1}" local ver="pypy${PYVER}-v${VERSION}-src" local url="https://downloads.python.org/pypy/${ver}.tar.bz2" { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for ${archmsg}." echo "try '${url}' to build from source." echo } >&2 exit 1 } function pypy_pkg_data { # pypy architecture tag local ARCH="${1}" # defaults local cmd='install_package' # use bz2 local pkg="${ARCH}" # assume matches local ext='tar.bz2' local hash='' # undefined # select the hash, fix pkg if not match ARCH case "${ARCH}" in 'linux-aarch64' ) hash="${aarch64_hash}" pkg='aarch64' ;; 'linux' ) hash="${linux32_hash}" pkg='linux32' ;; 'linux64' ) hash="${linux64_hash}" ;; 'osarm64' ) hash="${osarm64_hash}" pkg='macos_arm64' ;; 'osx64' ) if require_osx_version "10.13"; then hash="${osx64_hash}" pkg='macos_x86_64' else err_no_binary "${ARCH}, OS X < 10.13" fi ;; 's390x' ) hash="${s390x_hash}" ;; * ) err_no_binary "${ARCH}" ;; esac local basever="pypy${PYVER}-v${VERSION}" local baseurl="https://downloads.python.org/pypy/${basever}" # result - command, package dir, url+hash echo "${cmd}" "${basever}-${pkg}" "${baseurl}-${pkg}.${ext}#${hash}" } # determine command, package directory, url+hash declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" # install ${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip' pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.9-7.3.12-src000066400000000000000000000011331517431316200266030ustar00rootroot00000000000000VERSION='7.3.12' PYVER='3.9' # https://www.pypy.org/checksums.html hash=e7a2046c7e6c25fc386abbb5132e92a7cc2491e3935699a946cb5dcbb342c2aa ### end of manual settings - following lines same for every download ver="pypy${PYVER}-v${VERSION}-src" url="https://downloads.python.org/pypy/${ver}.tar.bz2" prefer_openssl11 install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip' pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.9-7.3.13000066400000000000000000000043551517431316200260300ustar00rootroot00000000000000VERSION='7.3.13' PYVER='3.9' # https://www.pypy.org/checksums.html aarch64_hash=317d7876c5825a086f854253648b967a432b993ce87695d2895d3ad6ed0d2716 linux32_hash=ac695238b4a3635ac6b482e74e04e2ea78b31acca0decd5de601dfd2f4ebf35a linux64_hash=323b05a9f607e932cda1995cbe77a96e4ea35994631aa6d734c8035e8479b74e osarm64_hash=a07b17a790a1952b551e69d47d77a5546ad5e666ed1bd90b9ad60baaca6aa51e osx64_hash=180802aa0122d4a05ec480bf3130c78591ba88fdde25d8e65a92d4a798b318a3 s390x_hash=213c88f652a99c4dc4e8e00b4b5b58f381c7f7e9ea1a9b65801fc0eb1e50df0a ### end of manual settings - following lines same for every download function err_no_binary { local archmsg="${1}" local ver="pypy${PYVER}-v${VERSION}-src" local url="https://downloads.python.org/pypy/${ver}.tar.bz2" { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for ${archmsg}." echo "try '${url}' to build from source." echo } >&2 exit 1 } function pypy_pkg_data { # pypy architecture tag local ARCH="${1}" # defaults local cmd='install_package' # use bz2 local pkg="${ARCH}" # assume matches local ext='tar.bz2' local hash='' # undefined # select the hash, fix pkg if not match ARCH case "${ARCH}" in 'linux-aarch64' ) hash="${aarch64_hash}" pkg='aarch64' ;; 'linux' ) hash="${linux32_hash}" pkg='linux32' ;; 'linux64' ) hash="${linux64_hash}" ;; 'osarm64' ) hash="${osarm64_hash}" pkg='macos_arm64' ;; 'osx64' ) if require_osx_version "10.13"; then hash="${osx64_hash}" pkg='macos_x86_64' else err_no_binary "${ARCH}, OS X < 10.13" fi ;; 's390x' ) hash="${s390x_hash}" ;; * ) err_no_binary "${ARCH}" ;; esac local basever="pypy${PYVER}-v${VERSION}" local baseurl="https://downloads.python.org/pypy/${basever}" # result - command, package dir, url+hash echo "${cmd}" "${basever}-${pkg}" "${baseurl}-${pkg}.${ext}#${hash}" } # determine command, package directory, url+hash declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" # install ${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip' pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.9-7.3.13-src000066400000000000000000000011331517431316200266040ustar00rootroot00000000000000VERSION='7.3.13' PYVER='3.9' # https://www.pypy.org/checksums.html hash=bc6147268105e7cb3bd57b401e6d97f66aa4ede269104b2712a7cdd9f02f68cd ### end of manual settings - following lines same for every download ver="pypy${PYVER}-v${VERSION}-src" url="https://downloads.python.org/pypy/${ver}.tar.bz2" prefer_openssl11 install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip' pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.9-7.3.14000066400000000000000000000043551517431316200260310ustar00rootroot00000000000000VERSION='7.3.14' PYVER='3.9' # https://www.pypy.org/checksums.html aarch64_hash=14b842f32f60ce2d9d130971f9bcbdb6875824a0e78fac36806d267e0982179c linux32_hash=4ad89a22369a6f2f83a7d8d047e0fc4cf5597f0921fa7afa23499ed05f663503 linux64_hash=febd770a616641ca8419c381c7fb224e515b892551d0db49a1231397ed38859d osarm64_hash=4f8f2464a743f855b8fc8bda7ce7994a674616db3b5c2c1955cd08502fa782ca osx64_hash=0e2fea9b2dadb82b7acf05f21c0144f7bb1cfaaa39c693ab1eba4aef5ed52680 s390x_hash=ba2451e9081db5bc724a05530a7f98817231de83ff6fdf15bad21a4e9b6dfeae ### end of manual settings - following lines same for every download function err_no_binary { local archmsg="${1}" local ver="pypy${PYVER}-v${VERSION}-src" local url="https://downloads.python.org/pypy/${ver}.tar.bz2" { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for ${archmsg}." echo "try '${url}' to build from source." echo } >&2 exit 1 } function pypy_pkg_data { # pypy architecture tag local ARCH="${1}" # defaults local cmd='install_package' # use bz2 local pkg="${ARCH}" # assume matches local ext='tar.bz2' local hash='' # undefined # select the hash, fix pkg if not match ARCH case "${ARCH}" in 'linux-aarch64' ) hash="${aarch64_hash}" pkg='aarch64' ;; 'linux' ) hash="${linux32_hash}" pkg='linux32' ;; 'linux64' ) hash="${linux64_hash}" ;; 'osarm64' ) hash="${osarm64_hash}" pkg='macos_arm64' ;; 'osx64' ) if require_osx_version "10.13"; then hash="${osx64_hash}" pkg='macos_x86_64' else err_no_binary "${ARCH}, OS X < 10.13" fi ;; 's390x' ) hash="${s390x_hash}" ;; * ) err_no_binary "${ARCH}" ;; esac local basever="pypy${PYVER}-v${VERSION}" local baseurl="https://downloads.python.org/pypy/${basever}" # result - command, package dir, url+hash echo "${cmd}" "${basever}-${pkg}" "${baseurl}-${pkg}.${ext}#${hash}" } # determine command, package directory, url+hash declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" # install ${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip' pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.9-7.3.14-src000066400000000000000000000011331517431316200266050ustar00rootroot00000000000000VERSION='7.3.14' PYVER='3.9' # https://www.pypy.org/checksums.html hash=560fe6161e159557e1fe612aaadf9b293eefded1da372e70b8e3b23bba598366 ### end of manual settings - following lines same for every download ver="pypy${PYVER}-v${VERSION}-src" url="https://downloads.python.org/pypy/${ver}.tar.bz2" prefer_openssl11 install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip' pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.9-7.3.15000066400000000000000000000043551517431316200260320ustar00rootroot00000000000000VERSION='7.3.15' PYVER='3.9' # https://www.pypy.org/checksums.html aarch64_hash=03e35fcba290454bb0ccf7ee57fb42d1e63108d10d593776a382c0a2fe355de0 linux32_hash=c6209380977066c9e8b96e8258821c70f996004ce1bc8659ae83d4fd5a89ff5c linux64_hash=f062be307200bde434817e1620cebc13f563d6ab25309442c5f4d0f0d68f0912 osarm64_hash=300541c32125767a91b182b03d9cc4257f04971af32d747ecd4d62549d72acfd osx64_hash=18ad7c9cb91c5e8ef9d40442b2fd1f6392ae113794c5b6b7d3a45e04f19edec6 s390x_hash=deeb5e54c36a0fd9cfefd16e63a0d5bed4f4a43e6bbc01c23f0ed8f7f1c0aaf3 ### end of manual settings - following lines same for every download function err_no_binary { local archmsg="${1}" local ver="pypy${PYVER}-v${VERSION}-src" local url="https://downloads.python.org/pypy/${ver}.tar.bz2" { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for ${archmsg}." echo "try '${url}' to build from source." echo } >&2 exit 1 } function pypy_pkg_data { # pypy architecture tag local ARCH="${1}" # defaults local cmd='install_package' # use bz2 local pkg="${ARCH}" # assume matches local ext='tar.bz2' local hash='' # undefined # select the hash, fix pkg if not match ARCH case "${ARCH}" in 'linux-aarch64' ) hash="${aarch64_hash}" pkg='aarch64' ;; 'linux' ) hash="${linux32_hash}" pkg='linux32' ;; 'linux64' ) hash="${linux64_hash}" ;; 'osarm64' ) hash="${osarm64_hash}" pkg='macos_arm64' ;; 'osx64' ) if require_osx_version "10.13"; then hash="${osx64_hash}" pkg='macos_x86_64' else err_no_binary "${ARCH}, OS X < 10.13" fi ;; 's390x' ) hash="${s390x_hash}" ;; * ) err_no_binary "${ARCH}" ;; esac local basever="pypy${PYVER}-v${VERSION}" local baseurl="https://downloads.python.org/pypy/${basever}" # result - command, package dir, url+hash echo "${cmd}" "${basever}-${pkg}" "${baseurl}-${pkg}.${ext}#${hash}" } # determine command, package directory, url+hash declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" # install ${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip' pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.9-7.3.15-src000066400000000000000000000011331517431316200266060ustar00rootroot00000000000000VERSION='7.3.15' PYVER='3.9' # https://www.pypy.org/checksums.html hash=6bb9537d85aa7ad13c0aad2e41ff7fd55080bc9b4d1361b8f502df51db816e18 ### end of manual settings - following lines same for every download ver="pypy${PYVER}-v${VERSION}-src" url="https://downloads.python.org/pypy/${ver}.tar.bz2" prefer_openssl11 install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip' pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.9-7.3.16000066400000000000000000000043551517431316200260330ustar00rootroot00000000000000VERSION='7.3.16' PYVER='3.9' # https://www.pypy.org/checksums.html aarch64_hash=de3f2ed3581b30555ac0dd3e4df78a262ec736a36fb2e8f28259f8539b278ef4 linux32_hash=583b6d6dd4e8c07cbc04da04a7ec2bdfa6674825289c2378c5e018d5abe779ea linux64_hash=16f9c5b808c848516e742986e826b833cdbeda09ad8764e8704595adbe791b23 osarm64_hash=88f824e7a2d676440d09bc90fc959ae0fd3557d7e2f14bfbbe53d41d159a47fe osx64_hash=fda015431621e7e5aa16359d114f2c45a77ed936992c1efff86302e768a6b21c s390x_hash=7a56ebb27dba3110dc1ff52d8e0449cdb37fe5c2275f7faf11432e4e164833ba ### end of manual settings - following lines same for every download function err_no_binary { local archmsg="${1}" local ver="pypy${PYVER}-v${VERSION}-src" local url="https://downloads.python.org/pypy/${ver}.tar.bz2" { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for ${archmsg}." echo "try '${url}' to build from source." echo } >&2 exit 1 } function pypy_pkg_data { # pypy architecture tag local ARCH="${1}" # defaults local cmd='install_package' # use bz2 local pkg="${ARCH}" # assume matches local ext='tar.bz2' local hash='' # undefined # select the hash, fix pkg if not match ARCH case "${ARCH}" in 'linux-aarch64' ) hash="${aarch64_hash}" pkg='aarch64' ;; 'linux' ) hash="${linux32_hash}" pkg='linux32' ;; 'linux64' ) hash="${linux64_hash}" ;; 'osarm64' ) hash="${osarm64_hash}" pkg='macos_arm64' ;; 'osx64' ) if require_osx_version "10.13"; then hash="${osx64_hash}" pkg='macos_x86_64' else err_no_binary "${ARCH}, OS X < 10.13" fi ;; 's390x' ) hash="${s390x_hash}" ;; * ) err_no_binary "${ARCH}" ;; esac local basever="pypy${PYVER}-v${VERSION}" local baseurl="https://downloads.python.org/pypy/${basever}" # result - command, package dir, url+hash echo "${cmd}" "${basever}-${pkg}" "${baseurl}-${pkg}.${ext}#${hash}" } # determine command, package directory, url+hash declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" # install ${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip' pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.9-7.3.16-src000066400000000000000000000011331517431316200266070ustar00rootroot00000000000000VERSION='7.3.16' PYVER='3.9' # https://www.pypy.org/checksums.html hash=5b75af3f8e76041e79c1ef5ce22ce63f8bd131733e9302081897d8f650e81843 ### end of manual settings - following lines same for every download ver="pypy${PYVER}-v${VERSION}-src" url="https://downloads.python.org/pypy/${ver}.tar.bz2" prefer_openssl11 install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip' pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.9-7.3.8000066400000000000000000000047201517431316200257500ustar00rootroot00000000000000VERSION='7.3.8' PYVER='3.9' # https://www.pypy.org/checksums.html aarch64_hash=89d7ee12a8c416e83fae80af82482531fc6502321e75e5b7a0cc01d756ee5f0e linux32_hash=0894c468e7de758c509a602a28ef0ba4fbf197ccdf946c7853a7283d9bb2a345 linux64_hash=129a055032bba700cd1d0acacab3659cf6b7180e25b1b2f730e792f06d5b3010 osx64_hash=95bd88ac8d6372cd5b7b5393de7b7d5c615a0c6e42fdb1eb67f2d2d510965aee s390x_hash=37b596bfe76707ead38ffb565629697e9b6fa24e722acc3c632b41ec624f5d95 win64_hash=c1b2e4cde2dcd1208d41ef7b7df8e5c90564a521e7a5db431673da335a1ba697 ### end of manual settings - following lines same for every download function pypy_pkg_data { # pypy architecture local ARCH="${1}" local basesrc="pypy${PYVER}-${VERSION}-src" local basever="pypy${PYVER}-v${VERSION}" local baseurl="https://downloads.python.org/pypy/${basever}" # defaults local cmd='install_package' # use bz2 local pkg="${ARCH}" # assume matches local url="${baseurl}-${pkg}.tar.bz2" # use bz2 local hash='' # undefined case "${pkg}" in 'linux-aarch64' ) hash="${aarch64_hash}" url="${baseurl}-aarch64.tar.bz2" # diff url ;; 'linux' ) hash="${linux32_hash}" pkg='linux32' # package name revised url="${baseurl}-${pkg}.tar.bz2" # new url ;; 'linux64' ) hash="${linux64_hash}" ;; 'osx64' ) if require_osx_version "10.13"; then hash="${osx64_hash}" else { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true), OS X < 10.13." echo "try '${basesrc}' to build from source." echo } >&2 exit 1 fi ;; 's390x' ) hash="${s390x_hash}" ;; 'win64' ) hash="${win64_hash}" cmd='install_zip' # diff command url="${baseurl}-${pkg}.zip" # zip rather than bz2 ;; * ) { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." echo "try '${basesrc}' to build from source." echo } >&2 exit 1 ;; esac # result - command, package dir, url+hash echo "${cmd}" "${basever}-${pkg}" "${url}#${hash}" } # determine command, package directory, url+hash declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" # install ${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip' pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.9-7.3.8-src000066400000000000000000000011321517431316200265270ustar00rootroot00000000000000VERSION='7.3.8' PYVER='3.9' # https://www.pypy.org/checksums.html hash=546b7fc3789728869d5ada7b6a95ce9d03047e8489b92ada84613c900e431ee9 ### end of manual settings - following lines same for every download ver="pypy${PYVER}-v${VERSION}-src" url="https://downloads.python.org/pypy/${ver}.tar.bz2" prefer_openssl11 install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip' pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.9-7.3.9000066400000000000000000000044651517431316200257570ustar00rootroot00000000000000VERSION='7.3.9' PYVER='3.9' # https://www.pypy.org/checksums.html aarch64_hash=2e1ae193d98bc51439642a7618d521ea019f45b8fb226940f7e334c548d2b4b9 linux32_hash=0de4b9501cf28524cdedcff5052deee9ea4630176a512bdc408edfa30914bae7 linux64_hash=46818cb3d74b96b34787548343d266e2562b531ddbaf330383ba930ff1930ed5 osx64_hash=59c8852168b2b1ba1f0211ff043c678760380d2f9faf2f95042a8878554dbc25 s390x_hash=774dca83bcb4403fb99b3d155e7bd572ef8c52b9fe87a657109f64e75ad71732 win64_hash=be48ab42f95c402543a7042c999c9433b17e55477c847612c8733a583ca6dff5 ### end of manual settings - following lines same for every download function err_no_binary { local archmsg="${1}" local ver="pypy${PYVER}-v${VERSION}-src" local url="https://downloads.python.org/pypy/${ver}.tar.bz2" { echo colorize 1 "ERROR" echo ": The binary distribution of PyPy is not available for ${archmsg}." echo "try '${url}' to build from source." echo } >&2 exit 1 } function pypy_pkg_data { # pypy architecture tag local ARCH="${1}" # defaults local cmd='install_package' # use bz2 local pkg="${ARCH}" # assume matches local ext='tar.bz2' # windows is always diff... local hash='' # undefined # select the hash, fix pkg if not match ARCH, windows has ext of zip case "${ARCH}" in 'linux-aarch64' ) hash="${aarch64_hash}" pkg='aarch64' ;; 'linux' ) hash="${linux32_hash}" pkg='linux32' ;; 'linux64' ) hash="${linux64_hash}" ;; 'osx64' ) if require_osx_version "10.13"; then hash="${osx64_hash}" else err_no_binary "${ARCH}, OS X < 10.13" fi ;; 's390x' ) hash="${s390x_hash}" ;; 'win64' ) hash="${win64_hash}" cmd='install_zip' # diff command ext='zip' # zip rather than bz2 ;; * ) err_no_binary "${ARCH}" ;; esac local basever="pypy${PYVER}-v${VERSION}" local baseurl="https://downloads.python.org/pypy/${basever}" # result - command, package dir, url+hash echo "${cmd}" "${basever}-${pkg}" "${baseurl}-${pkg}.${ext}#${hash}" } # determine command, package directory, url+hash declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" # install ${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip' pyenv-pyenv-485090e/plugins/python-build/share/python-build/pypy3.9-7.3.9-src000066400000000000000000000011321517431316200265300ustar00rootroot00000000000000VERSION='7.3.9' PYVER='3.9' # https://www.pypy.org/checksums.html hash=2abaa1e9fe1ec0e233c9fbc377a0c8e9a0634080a8f4f30eb6898301f6618c12 ### end of manual settings - following lines same for every download ver="pypy${PYVER}-v${VERSION}-src" url="https://downloads.python.org/pypy/${ver}.tar.bz2" prefer_openssl11 install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip' pyenv-pyenv-485090e/plugins/python-build/share/python-build/pyston-2.2000066400000000000000000000011761517431316200256770ustar00rootroot00000000000000echo colorize 1 "WARNING" echo ": Pyston only runs on x86_64 platforms, and only has been tested on Ubuntu" echo "so, your mileage may vary with other Linux distributions." echo case "$(pyston_architecture 2>/dev/null || true)" in "linux64" ) install_package "pyston_2.2" "https://github.com/pyston/pyston/releases/download/pyston_2.2/pyston_2.2_portable.tar.gz#d113cc4d1f6821c0f117f7a84978823d8ac751d7970fa7841eb994663ec5a59f" "pyston2_2" verify_py38 get_pip ;; * ) { echo colorize 1 "ERROR" echo ": A Pyston 2.2 binary is not available for $(pyston_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/pyston-2.3000066400000000000000000000011731517431316200256750ustar00rootroot00000000000000echo colorize 1 "WARNING" echo ": Pyston only runs on x86_64 platforms, and only has been tested on Ubuntu" echo "so, your mileage may vary with other Linux distributions." echo case "$(pyston_architecture 2>/dev/null || true)" in "linux64" ) install_package "pyston_2.3" "https://github.com/pyston/pyston/releases/download/v2.3/pyston_2.3_portable-v2.tar.gz#90185e29e4a1a19562c095f2bb4e81a5d0715150fa10eca363ec1188b5ba7ee7" "pyston2_2" verify_py38 get_pip ;; * ) { echo colorize 1 "ERROR" echo ": A Pyston 2.3 binary is not available for $(pyston_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/pyston-2.3.1000066400000000000000000000012061517431316200260310ustar00rootroot00000000000000echo colorize 1 "WARNING" echo ": Pyston only runs on x86_64 platforms, and only has been tested on Ubuntu" echo "so, your mileage may vary with other Linux distributions." echo case "$(pyston_architecture 2>/dev/null || true)" in "linux64" ) install_package "pyston_2.3.1" "https://github.com/pyston/pyston/releases/download/pyston_2.3.1/pyston_2.3.1_portable_v2.tar.gz#4e16df1eaf5f226c0629f2db1e63033454c94cb9e29f50154177819662df5b15" "pyston" verify_py38 get_pip ;; * ) { echo colorize 1 "ERROR" echo ": A Pyston 2.3.1 binary is not available for $(pyston_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/pyston-2.3.2000066400000000000000000000012031517431316200260270ustar00rootroot00000000000000echo colorize 1 "WARNING" echo ": Pyston only runs on x86_64 platforms, and only has been tested on Ubuntu" echo "so, your mileage may vary with other Linux distributions." echo case "$(pyston_architecture 2>/dev/null || true)" in "linux64" ) install_package "pyston_2.3.2" "https://github.com/pyston/pyston/releases/download/pyston_2.3.2/pyston_2.3.2_portable.tar.gz#80e71dd2db504e09951ee835e04c9e1183c79412da9aa11d98a6d3f44b95bec1" "pyston" verify_py38 get_pip ;; * ) { echo colorize 1 "ERROR" echo ": A Pyston 2.3.2 binary is not available for $(pyston_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/pyston-2.3.3000066400000000000000000000013571517431316200260420ustar00rootroot00000000000000case "$(pyston_architecture 2>/dev/null || true)" in "linux64" ) install_package "pyston_2.3.3_portable_amd64" "https://github.com/pyston/pyston/releases/download/pyston_2.3.3/pyston_2.3.3_portable_amd64.tar.gz#7a38e2bd2fed38e6daba4d513bae32af0d5ba6185cadf37cb1af6bcc4de0cb57" "pyston" verify_py38 get_pip ;; "linux-aarch64" ) install_package "pyston_2.3.3_portable_arm64" "https://github.com/pyston/pyston/releases/download/pyston_2.3.3/pyston_2.3.3_portable_arm64.tar.gz#f93f55b59120f576e5755bd8f86fa38361a30ca5389dbadc68450051ee2dccb1" "pyston" verify_py38 get_pip ;; * ) { echo colorize 1 "ERROR" echo ": A Pyston 2.3.3 binary is not available for $(pyston_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/pyston-2.3.4000066400000000000000000000015131517431316200260350ustar00rootroot00000000000000# sha256sum used for checksum values # version of pyston VER='2.3.4' # alias for download location DOWNLOAD='https://github.com/pyston/pyston/releases/download' case "$(pyston_architecture 2>/dev/null || true)" in "linux64" ) install_package "pyston_${VER}_portable_amd64" "${DOWNLOAD}/pyston_${VER}/pyston_${VER}_portable_amd64.tar.gz#f8274bdead746f839791d785a5edad8a0b8723016b38751321c8eaf16ebd22db" "pyston" verify_py38 get_pip ;; "linux-aarch64" ) install_package "pyston_${VER}_portable_arm64" "${DOWNLOAD}/pyston_${VER}/pyston_${VER}_portable_arm64.tar.gz#0733d120562c73f129af5633f8ea7faad3fdcab931f2234c02cd81f21eada2cd" "pyston" verify_py38 get_pip ;; * ) { echo colorize 1 "ERROR" echo ": A Pyston ${VER} binary is not available for $(pyston_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/pyston-2.3.5000066400000000000000000000015131517431316200260360ustar00rootroot00000000000000# sha256sum used for checksum values # version of pyston VER='2.3.5' # alias for download location DOWNLOAD='https://github.com/pyston/pyston/releases/download' case "$(pyston_architecture 2>/dev/null || true)" in "linux64" ) install_package "pyston_${VER}_portable_amd64" "${DOWNLOAD}/pyston_${VER}/pyston_${VER}_portable_amd64.tar.gz#c71c711d60a9c18f243a9e30fd35e0818674ae96f534c67c27b0cdfbc9132ef8" "pyston" verify_py38 get_pip ;; "linux-aarch64" ) install_package "pyston_${VER}_portable_arm64" "${DOWNLOAD}/pyston_${VER}/pyston_${VER}_portable_arm64.tar.gz#c578cb806c62d9dca8728f190a87e172305bd80887e206df42c4c5658ab469c1" "pyston" verify_py38 get_pip ;; * ) { echo colorize 1 "ERROR" echo ": A Pyston ${VER} binary is not available for $(pyston_architecture 2>/dev/null || true)." echo } >&2 exit 1 ;; esac pyenv-pyenv-485090e/plugins/python-build/share/python-build/stackless-2.7-dev000066400000000000000000000010261517431316200271120ustar00rootroot00000000000000prefer_openssl11 install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline install_git "stackless-2.7-dev" "https://github.com/stackless-dev/stackless/" "2.7-slp" standard verify_py27 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/stackless-2.7.10000066400000000000000000000011061517431316200265540ustar00rootroot00000000000000install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline install_package "stackless-dev-stackless-b6b4c928e880" "http://www.stackless.com/binaries/stackless-2710-export.tar.xz#8af1318f95965138de51e290a509dc3d" standard verify_py27 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/stackless-2.7.11000066400000000000000000000011061517431316200265550ustar00rootroot00000000000000install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline install_package "stackless-dev-stackless-456e93659e69" "http://www.stackless.com/binaries/stackless-2711-export.tar.xz#d5229693498a4ccc0b3245f7bf8e2b09" standard verify_py27 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/stackless-2.7.12000066400000000000000000000011061517431316200265560ustar00rootroot00000000000000install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline install_package "stackless-dev-stackless-82aaa252fbdc" "http://www.stackless.com/binaries/stackless-2712-export.tar.xz#c610611b39ee374ae36e891c5c739f39" standard verify_py27 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/stackless-2.7.14000066400000000000000000000011561517431316200265650ustar00rootroot00000000000000prefer_openssl11 install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline install_package "stackless-2.7.14-slp" "https://github.com/stackless-dev/stackless/archive/v2.7.14-slp.tar.gz#e67f60984d034bfd80fef58d26df9d5a1cdecb429c55ac7bc8d932cff6f88ab8" standard verify_py27 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/stackless-2.7.16000066400000000000000000000011341517431316200265630ustar00rootroot00000000000000install_package "openssl-1.0.2k" "https://www.openssl.org/source/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline install_package "stackless-dev-stackless-43302de87df4" "http://www.stackless.com/binaries/stackless-2716-export.tar.xz#2db64fbd47567a1c0683fba7a54387892d2299915f9848b54c450b5eb95358dc" standard verify_py27 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/stackless-2.7.2000066400000000000000000000011261517431316200264770ustar00rootroot00000000000000install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline install_package "stackless-272-export" "http://www.stackless.com/binaries/stackless-272-export.tar.bz2#e2e2706b22839e3e3f45085d0ec8030dd7374d8a65d3297981b7189a7c613197" standard verify_py27 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/stackless-2.7.3000066400000000000000000000011261517431316200265000ustar00rootroot00000000000000install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline install_package "stackless-273-export" "http://www.stackless.com/binaries/stackless-273-export.tar.bz2#77bee863bfd16dc4eca7fc078b12db608db7dd6e2481981bb68250118e001dfc" standard verify_py27 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/stackless-2.7.4000066400000000000000000000011261517431316200265010ustar00rootroot00000000000000install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline install_package "stackless-274-export" "http://www.stackless.com/binaries/stackless-274-export.tar.bz2#ba566b18c66b095b65addbcfc4d814fc84f163c9fcffa1d0678755c581e64f45" standard verify_py27 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/stackless-2.7.5000066400000000000000000000011261517431316200265020ustar00rootroot00000000000000install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline install_package "stackless-275-export" "http://www.stackless.com/binaries/stackless-275-export.tar.bz2#5a389357762b32c590e1154a86b098cc379c71d10238b458a3e9b4fa4aac60d4" standard verify_py27 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/stackless-2.7.6000066400000000000000000000011261517431316200265030ustar00rootroot00000000000000install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline install_package "stackless-276-export" "http://www.stackless.com/binaries/stackless-276-export.tar.bz2#1e905deaf74e8922f49b99139aa48e6670e9456c55fec8e60c47501f78c38ff5" standard verify_py27 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/stackless-2.7.7000066400000000000000000000011061517431316200265020ustar00rootroot00000000000000install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline install_package "stackless-dev-stackless-a182f63395c3" "http://www.stackless.com/binaries/stackless-277-export.tar.bz2#4ac0a1e95bc12d6733d9e7f3c221ec4a" standard verify_py27 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/stackless-2.7.8000066400000000000000000000011061517431316200265030ustar00rootroot00000000000000install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline install_package "stackless-dev-stackless-ff29dd4f67de" "http://www.stackless.com/binaries/stackless-278-export.tar.bz2#2880f05e599020eb8f2624ce3796592b" standard verify_py27 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/stackless-2.7.9000066400000000000000000000011051517431316200265030ustar00rootroot00000000000000install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline install_package "stackless-dev-stackless-43302de87df4" "http://www.stackless.com/binaries/stackless-279-export.tar.xz#35307558796389aa51d96b0bc83f6f6f" standard verify_py27 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/stackless-3.2.2000066400000000000000000000016551517431316200265020ustar00rootroot00000000000000install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline install_package "stackless-322-export" "http://www.stackless.com/binaries/stackless-322-export.tar.bz2#779700f12b451a350fe7af4cd2849842adc7006dc83fe14712dd1a0999277b07" standard verify_py32 install_package "setuptools-17.1.1" "https://pypi.python.org/packages/source/s/setuptools/setuptools-17.1.1.tar.gz#5bf42dbf406fd58a41029f53cffff1c90db5de1c5e0e560b5545cf2ec949c431" python install_package "pip-7.1.2" "https://pypi.python.org/packages/source/p/pip/pip-7.1.2.tar.gz#ca047986f0528cfa975a14fb9f7f106271d4e0c3fe1ddced6c1db2e7ae57a477" python pyenv-pyenv-485090e/plugins/python-build/share/python-build/stackless-3.2.5000066400000000000000000000016551517431316200265050ustar00rootroot00000000000000install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline install_package "stackless-325-export" "http://www.stackless.com/binaries/stackless-325-export.tar.bz2#b021125e578ddd267d38feee9e1cbdb675f6aab247a2b88f4494abcf23babb05" standard verify_py32 install_package "setuptools-17.1.1" "https://pypi.python.org/packages/source/s/setuptools/setuptools-17.1.1.tar.gz#5bf42dbf406fd58a41029f53cffff1c90db5de1c5e0e560b5545cf2ec949c431" python install_package "pip-7.1.2" "https://pypi.python.org/packages/source/p/pip/pip-7.1.2.tar.gz#ca047986f0528cfa975a14fb9f7f106271d4e0c3fe1ddced6c1db2e7ae57a477" python pyenv-pyenv-485090e/plugins/python-build/share/python-build/stackless-3.3.5000066400000000000000000000011051517431316200264740ustar00rootroot00000000000000install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline install_package "stackless-dev-stackless-c856cc204b1c" "http://www.stackless.com/binaries/stackless-335-export.tar.xz#d839295b932eb10443f2ddfecf2c25e9" standard verify_py33 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/stackless-3.3.7000066400000000000000000000011331517431316200264770ustar00rootroot00000000000000install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline install_package "stackless-3.3.7-slp" "https://github.com/stackless-dev/stackless/archive/v3.3.7-slp.tar.gz#f05b8ff8a0e318aa5880dc995518ab4453894d068a26a171b89e21b98da5a5c1" standard verify_py33 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/stackless-3.4-dev000066400000000000000000000010261517431316200271100ustar00rootroot00000000000000prefer_openssl11 install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline install_git "stackless-3.4-dev" "https://github.com/stackless-dev/stackless/" "3.4-slp" standard verify_py34 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/stackless-3.4.2000066400000000000000000000011451517431316200264760ustar00rootroot00000000000000install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline install_package "stackless-dev-stackless-587417070fe4" "http://www.stackless.com/binaries/stackless-342-export.tar.xz#dd6ae57cc8a162690a24f21ce1f0c4d96e096c24e17137783bacc9182b96b6dc" standard verify_py34 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/stackless-3.4.7000066400000000000000000000011331517431316200265000ustar00rootroot00000000000000install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline install_package "stackless-3.4.7-slp" "https://github.com/stackless-dev/stackless/archive/v3.4.7-slp.tar.gz#e41959afcfc9381cbc9ac14c12110e3e748e65ceeec4fe61fb1c34cabcb9e6bf" standard verify_py34 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/stackless-3.5.4000066400000000000000000000011331517431316200264760ustar00rootroot00000000000000install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline install_package "stackless-3.5.4-slp" "https://github.com/stackless-dev/stackless/archive/v3.5.4-slp.tar.gz#ddb65a8118c754f66875f65c4d5d2a4937d67858ec8c361a6c5b386f5e4d9fce" standard verify_py35 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/stackless-3.7.5000066400000000000000000000011331517431316200265010ustar00rootroot00000000000000install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline install_package "stackless-3.7.5-slp" "https://github.com/stackless-dev/stackless/archive/v3.7.5-slp.tar.gz#e2562a8d235adc19be5451c170837f53ef916aec4cd5cd17d9e0ab1f1b875d3f" standard verify_py37 ensurepip pyenv-pyenv-485090e/plugins/python-build/share/python-build/stackless-dev000066400000000000000000000010251517431316200266050ustar00rootroot00000000000000prefer_openssl11 install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline install_git "stackless-dev" "https://github.com/stackless-dev/stackless/" "master-slp" standard verify_py35 ensurepip pyenv-pyenv-485090e/plugins/python-build/test/000077500000000000000000000000001517431316200213535ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/test/arguments.bats000066400000000000000000000012161517431316200242330ustar00rootroot00000000000000#!/usr/bin/env bats load test_helper @test "not enough arguments for python-build" { # use empty inline definition so nothing gets built anyway local definition="${BATS_TEST_TMPDIR}/build-definition" echo '' > "$definition" run python-build "$definition" assert_failure assert_output_contains 'Usage: python-build' } @test "extra arguments for python-build" { # use empty inline definition so nothing gets built anyway local definition="${BATS_TEST_TMPDIR}/build-definition" echo '' > "$definition" run python-build "$definition" "${BATS_TEST_TMPDIR}/install" "" assert_failure assert_output_contains 'Usage: python-build' } pyenv-pyenv-485090e/plugins/python-build/test/build.bats000066400000000000000000001204741517431316200233350ustar00rootroot00000000000000#!/usr/bin/env bats load test_helper _setup() { export PYTHON_BUILD_CACHE_PATH="$BATS_TEST_TMPDIR/cache" export MAKE=make export MAKE_OPTS="-j 2" export CC=cc export -n PYTHON_CONFIGURE_OPTS mkdir -p "$INSTALL_ROOT" stub md5 false stub curl false } executable() { local file="$1" mkdir -p "${file%/*}" cat > "$file" chmod +x "$file" } cached_tarball() { mkdir -p "$PYTHON_BUILD_CACHE_PATH" pushd "$PYTHON_BUILD_CACHE_PATH" >/dev/null tarball "$@" popd >/dev/null } tarball() { local name="$1" shift local path="$PWD/$name" local configure="$1" if [[ ${configure:0:1} == "-" ]]; then configure=""; fi configure="$path/${configure:-configure}" shift || true local extra_vars var_name if [[ $# -gt 0 ]]; then for var_name in "$@"; do extra_vars="${extra_vars:+$extra_vars }$var_name=\$$var_name" done fi executable "$configure" <> build.log echo "$name:" "\$@" \${PYTHONOPT:+PYTHONOPT=\$PYTHONOPT} >> build.log ${extra_vars:+echo $name: $extra_vars >>build.log} OUT for file; do mkdir -p "$(dirname "${path}/${file}")" touch "${path}/${file}" done tar czf "${path}.tar.gz" -C "${path%/*}" "$name" } stub_make_install() { stub "$MAKE" \ " : echo \"$MAKE \$@\" >> build.log" \ "${1:-install} : echo \"$MAKE \$@\" >> build.log && cat build.log >> '$INSTALL_ROOT/build.log'" } assert_build_log() { run cat "$INSTALL_ROOT/build.log" assert_output } stub_tcltk() { local tcltk_prefix="${1:?}" mkdir -p "$tcltk_prefix/lib" cat >"$tcltk_prefix/lib/tclConfig.sh" <"$tcltk_prefix/lib/tkConfig.sh" <> build.log' TMPDIR="$BATS_TEST_TMPDIR" install_fixture --patch definitions/needs-yaml <<<"" assert_success unstub uname unstub make unstub patch assert_build_log <> build.log' TMPDIR="$BATS_TEST_TMPDIR" install_fixture --patch definitions/needs-yaml <<<"diff --git a/script.py" assert_success unstub uname unstub make unstub patch assert_build_log <>"$tcl_tk_libdir/lib/tclConfig.sh" <>"$tcl_tk_libdir/lib/tclConfig.sh" <> build.log' stub_make_install export PYTHON_CONFIGURE="${BATS_TEST_TMPDIR}/custom-configure" run_inline_definition <&2; echo 4.2.1' run_inline_definition < ./configure < "${BATS_TEST_TMPDIR}/definitions/2.7.8-test" mkdir -p "${BATS_TEST_TMPDIR}/other" echo false > "${BATS_TEST_TMPDIR}/other/2.7.8-test" run python-build "2.7.8-test" "${BATS_TEST_TMPDIR}/install" assert_success "" } @test "installing nonexistent definition" { run python-build "nonexistent" "${BATS_TEST_TMPDIR}/install" assert [ "$status" -eq 2 ] assert_output "python-build: definition not found: nonexistent" } @test "sorting Python versions" { export PYTHON_BUILD_ROOT="$BATS_TEST_TMPDIR" mkdir -p "${PYTHON_BUILD_ROOT}/share/python-build" expected="2.7-dev 2.7 2.7.1 2.7.2 2.7.3 3.4.0 3.4-dev 3.4.1 3.4.2 jython-dev jython-2.5.0 jython-2.5-dev jython-2.5.1 jython-2.5.2 jython-2.5.3 jython-2.5.4-rc1 jython-2.7-beta1 jython-2.7-beta2 jython-2.7-beta3" while IFS=$'\n' read -r ver; do touch "${PYTHON_BUILD_ROOT}/share/python-build/$ver" done <<<"$expected" run python-build --definitions assert_success "$expected" } @test "removing duplicate Python versions" { export PYTHON_BUILD_ROOT="$BATS_TEST_TMPDIR" export PYTHON_BUILD_DEFINITIONS="${PYTHON_BUILD_ROOT}/share/python-build" mkdir -p "$PYTHON_BUILD_DEFINITIONS" touch "${PYTHON_BUILD_DEFINITIONS}/2.7.8" touch "${PYTHON_BUILD_DEFINITIONS}/3.4.2" run python-build --definitions assert_success assert_output < http://example.com/packages/package-1.0.0.tar.gz" assert_output_contains "error: failed to download package-1.0.0.tar.gz" } @test "using aria2c if available" { export PYTHON_BUILD_ARIA2_OPTS= export -n PYTHON_BUILD_HTTP_CLIENT stub aria2c "--allow-overwrite=true --no-conf=true -d * -o * http://example.com/* : cp $FIXTURE_ROOT/\${7##*/} \$6" install_fixture definitions/without-checksum assert_success assert_output < http://example.com/packages/package-1.0.0.tar.gz Installing package-1.0.0... Installed package-1.0.0 to ${BATS_TEST_TMPDIR}/install OUT unstub aria2c } @test "fetching from git repository" { stub git "clone --depth 1 --branch master http://example.com/packages/package.git package-dev : mkdir package-dev" run_inline_definition <dQ:ÎÖ&K‹µiul+о½$î:éFc(pyenv-pyenv-485090e/plugins/python-build/test/hooks.bats000066400000000000000000000041261517431316200233540ustar00rootroot00000000000000#!/usr/bin/env bats load test_helper _setup() { export PYENV_ROOT="${BATS_TEST_TMPDIR}/pyenv" export HOOK_PATH="${BATS_TEST_TMPDIR}/i has hooks" mkdir -p "$HOOK_PATH" } @test "pyenv-install hooks" { cat > "${HOOK_PATH}/install.bash" < "$definition" <<<"echo python-build" run pyenv-install "$definition" assert_success assert_output <<-OUT before: ${PYENV_ROOT}/versions/3.6.2 python-build after: 0 rehashed OUT } @test "pyenv-uninstall hooks" { cat > "${HOOK_PATH}/uninstall.bash" < "${HOOK_PATH}/uninstall.bash" <&2 assert_success assert [ -x "${INSTALL_ROOT}/bin/package" ] unstub curl unstub shasum } @test "package URL with checksum but no shasum support bypasses mirror" { stub shasum false stub curl "-q -o * -*S* http://example.com/* : cp $FIXTURE_ROOT/\${5##*/} \$3" install_fixture definitions/with-checksum assert_success assert [ -x "${INSTALL_ROOT}/bin/package" ] unstub curl unstub shasum } @test "package URL with checksum hits mirror first" { local checksum="ba988b1bb4250dee0b9dd3d4d722f9c64b2bacfc805d1b6eba7426bda72dd3c5" local mirror_url="${PYTHON_BUILD_MIRROR_URL}/$checksum" stub shasum true "echo $checksum" stub curl "-*I* $mirror_url : true" \ "-q -o * -*S* $mirror_url : cp $FIXTURE_ROOT/package-1.0.0.tar.gz \$3" install_fixture definitions/with-checksum assert_success assert [ -x "${INSTALL_ROOT}/bin/package" ] unstub curl unstub shasum } @test "package is fetched from original URL if mirror download fails" { local checksum="ba988b1bb4250dee0b9dd3d4d722f9c64b2bacfc805d1b6eba7426bda72dd3c5" local mirror_url="${PYTHON_BUILD_MIRROR_URL}/$checksum" stub shasum true "echo $checksum" stub curl "-*I* $mirror_url : false" \ "-q -o * -*S* http://example.com/* : cp $FIXTURE_ROOT/\${5##*/} \$3" install_fixture definitions/with-checksum assert_success assert [ -x "${INSTALL_ROOT}/bin/package" ] unstub curl unstub shasum } @test "package is fetched from mirror when checksum is invalid if SKIP_CHECKSUM set" { export PYTHON_BUILD_MIRROR_URL_SKIP_CHECKSUM=1 export PYTHON_BUILD_MIRROR_URL=https://custom.mirror.org export URL_BASE=example.com local checksum="ba988b1bb4250dee0b9dd3d4d722f9c64b2bacfc805d1b6eba7426bda72dd3c5" stub shasum false stub curl "-*I* : true" \ "-q -o * -*S* https://custom.mirror.org/* : cp $FIXTURE_ROOT/package-1.0.0.tar.gz \$3" \ install_fixture definitions/with-checksum assert_success assert [ -x "${INSTALL_ROOT}/bin/package" ] unstub curl unstub shasum unset PYTHON_BUILD_MIRROR_URL_SKIP_CHECKSUM } @test "package is fetched from original URL if mirror download checksum is invalid" { local checksum="ba988b1bb4250dee0b9dd3d4d722f9c64b2bacfc805d1b6eba7426bda72dd3c5" local mirror_url="${PYTHON_BUILD_MIRROR_URL}/$checksum" stub shasum true "echo invalid" "echo $checksum" stub curl "-*I* $mirror_url : true" \ "-q -o * -*S* $mirror_url : cp $FIXTURE_ROOT/package-1.0.0.tar.gz \$3" \ "-q -o * -*S* http://example.com/* : cp $FIXTURE_ROOT/\${5##*/} \$3" install_fixture definitions/with-checksum echo "$output" >&2 assert_success assert [ -x "${INSTALL_ROOT}/bin/package" ] unstub curl unstub shasum } @test "default mirror URL" { export PYTHON_BUILD_MIRROR_URL= local checksum="ba988b1bb4250dee0b9dd3d4d722f9c64b2bacfc805d1b6eba7426bda72dd3c5" stub shasum true "echo $checksum" stub curl "-*I* : true" \ "-q -o * -*S* https://?*/$checksum : cp $FIXTURE_ROOT/package-1.0.0.tar.gz \$3" \ install_fixture definitions/with-checksum assert_success assert [ -x "${INSTALL_ROOT}/bin/package" ] unstub curl unstub shasum } @test "package URL with ruby-lang CDN with default mirror URL will bypasses mirror" { export PYTHON_BUILD_MIRROR_URL= local checksum="ba988b1bb4250dee0b9dd3d4d722f9c64b2bacfc805d1b6eba7426bda72dd3c5" stub shasum true "echo $checksum" stub curl "-q -o * -*S* https://www.python.org/* : cp $FIXTURE_ROOT/\${5##*/} \$3" run_inline_definition <&2 && exit 2' stub_python_build "--definitions : echo 2.6.9 2.7.9-rc1 2.7.9-rc2 3.4.2 | tr ' ' $'\\n'" mkdir "$BATS_TEST_TMPDIR/.git" #Faking the Pyenv installation prefix may break things. # May have to move some dependent stuff into the fake root for the code to find it # or introduce an overriding test variable in the code specifically for the hint. _PYENV_INSTALL_PREFIX="$BATS_TEST_TMPDIR" run pyenv-install 2.7.9 assert_failure assert_output <&2 && exit 2' \ "--definitions : true" _PYENV_INSTALL_PREFIX="$BATS_TEST_TMPDIR" run pyenv-install 1.9.3 assert_failure assert_output < "$file" chmod +x "$file" } cached_tarball() { mkdir -p "$PYTHON_BUILD_CACHE_PATH" pushd "$PYTHON_BUILD_CACHE_PATH" >/dev/null tarball "$@" popd >/dev/null } tarball() { local name="$1" local path="$PWD/$name" local configure="$path/configure" shift 1 executable "$configure" <> build.log echo "$name: \$@" \${PYTHONOPT:+PYTHONOPT=\$PYTHONOPT} >> build.log OUT for file; do mkdir -p "$(dirname "${path}/${file}")" touch "${path}/${file}" done tar czf "${path}.tar.gz" -C "${path%/*}" "$name" } stub_make_install() { stub "$MAKE" \ " : echo \"$MAKE \$@\" >> build.log" \ "install : echo \"$MAKE \$@\" >> build.log && cat build.log >> '$INSTALL_ROOT/build.log'" } assert_build_log() { run cat "$INSTALL_ROOT/build.log" assert_output } install_patch() { local name="$1" local patch="$2" [ -n "$patch" ] || patch="python.patch" mkdir -p "${TMP_FIXTURES}/${name%/*}/patches/${name##*/}/${patch%/*}" cat > "${TMP_FIXTURES}/${name%/*}/patches/${name##*/}/${patch}" } install_tmp_fixture() { local args while [ "${1#-}" != "$1" ]; do args="$args $1" shift 1 done local name="$1" local destination="$2" [ -n "$destination" ] || destination="$INSTALL_ROOT" # Copy fixture to temporary path mkdir -p "${TMP_FIXTURES}/${name%/*}" cp "${FIXTURE_ROOT}/${name}" "${TMP_FIXTURES}/${name}" run python-build $args "$TMP_FIXTURES/$name" "$destination" } resolve_link() { $(type -P greadlink readlink | head -n1) "$1" } run_inline_definition_with_name() { local definition_name="build-definition" case "$1" in "--name="* ) local definition_name="${1#--name=}" shift 1 ;; esac local definition="${BATS_TEST_TMPDIR}/${definition_name}" cat > "$definition" run python-build "$definition" "${1:-$INSTALL_ROOT}" } @test "apply built-in python patch before building" { cached_tarball "Python-3.6.2" stub brew false stub_make_install stub patch ' : echo patch "$@" | sed -E "s/\.[[:alnum:]]+$/.XXX/" >> build.log' echo | install_patch definitions/vanilla-python "Python-3.6.2/empty.patch" # yyuu/pyenv#257 stub uname '-s : echo Linux' stub uname '-s : echo Linux' TMPDIR="$BATS_TEST_TMPDIR" install_tmp_fixture definitions/vanilla-python < /dev/null assert_success assert_build_log <> build.log' echo "foo" | install_patch definitions/vanilla-python "Python-3.6.2/foo.patch" echo "bar" | install_patch definitions/vanilla-python "Python-3.6.2/bar.patch" echo "baz" | install_patch definitions/vanilla-python "Python-3.6.2/baz.patch" stub uname '-s : echo Linux' TMPDIR="$BATS_TEST_TMPDIR" install_tmp_fixture definitions/vanilla-python < /dev/null assert_success assert_build_log <> build.log" \ " : echo \"$MAKE \$@\" >> build.log && cat build.log >> '$INSTALL_ROOT/build.log'" stub uname '-s : echo Darwin' PYTHON_MAKE_INSTALL_TARGET="altinstall" TMPDIR="$BATS_TEST_TMPDIR" install_tmp_fixture definitions/vanilla-python < /dev/null assert_success assert_build_log < "${INSTALL_ROOT}/bin/python" #!$BASH echo "python \$@" >> "${INSTALL_ROOT}/build.log" OUT chmod +x "${INSTALL_ROOT}/bin/python" PYTHON_MAKE_INSTALL_TARGET="" TMPDIR="$BATS_TEST_TMPDIR" run_inline_definition < "${INSTALL_ROOT}/bin/python" #!$BASH echo "python \$@" >> "${INSTALL_ROOT}/build.log" OUT chmod +x "${INSTALL_ROOT}/bin/python" PYTHON_MAKE_INSTALL_TARGET="altinstall" TMPDIR="$BATS_TEST_TMPDIR" run_inline_definition <> build.log" \ " : echo \"$MAKE \$@\" >> build.log && cat build.log >> '$INSTALL_ROOT/build.log'" PYTHON_CONFIGURE_OPTS="--enable-unicode=ucs2" TMPDIR="$BATS_TEST_TMPDIR" install_tmp_fixture definitions/vanilla-python < /dev/null assert_success assert_build_log <>"${!_STUB_LOG}"; fi [ -e "${!_STUB_PLAN}" ] || exit 1 [ -n "${!_STUB_RUN}" ] || eval "${_STUB_RUN}"="${BATS_TEST_TMPDIR}/${program}-stub-run" # Initialize or load the stub run information. eval "${_STUB_INDEX}"=1 eval "${_STUB_RESULT}"=0 if test -e "${!_STUB_RUN}"; then source "${!_STUB_RUN}"; fi # Loop over each line in the plan. index=0 while IFS= read -r line; do index=$(($index + 1)) if [ -z "${!_STUB_END}" ] && [ $index -eq "${!_STUB_INDEX}" ]; then # We found the plan line we're interested in. # Start off by assuming success. result=0 # Split the line into an array of arguments to # match and a command to run to produce output. command=" $line" if [ "$command" != "${command/ : }" ]; then patterns="${command%% : *}" command="${command#* : }" fi # Naively split patterns by whitespace for now. # In the future, use a sed script to split while # respecting quoting. set -f patterns=($patterns) set +f arguments=("$@") # Match the expected argument patterns to actual # arguments. for (( i=0; i<${#patterns[@]}; i++ )); do pattern="${patterns[$i]}" argument="${arguments[$i]}" case "$argument" in $pattern ) ;; * ) result=1 ;; esac done # If the arguments matched, evaluate the command # in a subshell. Otherwise, log the failure. if [ $result -eq 0 ] ; then set +e ( eval "$command" ) status="$?" set -e else eval "${_STUB_RESULT}"=1 fi fi done < "${!_STUB_PLAN}" if [ -n "${!_STUB_END}" ]; then # If the number of lines in the plan is larger than # the requested index, we failed. if [ $index -ge "${!_STUB_INDEX}" ]; then eval "${_STUB_RESULT}"=1 fi if [ "${!_STUB_RESULT}" -ne 0 ]; then { echo "index: $index; stub index: ${!_STUB_INDEX}" echo "plan:" cat "${!_STUB_PLAN}" || true echo "run:" cat "${!_STUB_RUN}" || true echo "log:" cat "${!_STUB_LOG}" || true } >&2 fi # Clean up the run file. rm -f "${!_STUB_RUN}" rm -f "${!_STUB_LOG}" # Return the result. exit "${!_STUB_RESULT}" else # If the requested index is larger than the number # of lines in the plan file, we failed. if [ "${!_STUB_INDEX}" -gt $index ]; then eval "${_STUB_RESULT}"=1 fi # Write out the run information. { echo "${_STUB_INDEX}=$((${!_STUB_INDEX} + 1))" echo "${_STUB_RESULT}=${!_STUB_RESULT}" } > "${!_STUB_RUN}" exit "$status" fi pyenv-pyenv-485090e/plugins/python-build/test/test_helper.bash000066400000000000000000000074011517431316200245320ustar00rootroot00000000000000setup() { export PYTHON_BUILD_CURL_OPTS= export PYTHON_BUILD_HTTP_CLIENT="curl" export FIXTURE_ROOT="${BATS_TEST_DIRNAME}/fixtures" export INSTALL_ROOT="${BATS_TEST_TMPDIR}/install" PATH="/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin" PATH="${BATS_TEST_DIRNAME}/../bin:$PATH" PATH="${BATS_TEST_TMPDIR}/bin:$PATH" export PATH # If test specific setup exist, run it if [[ $(type -t _setup) == function ]];then _setup fi } stub() { local program="$1" local prefix="$(echo "$program" | tr a-z- A-Z_)" shift export "${prefix}_STUB_PLAN"="${BATS_TEST_TMPDIR}/${program}-stub-plan" export "${prefix}_STUB_RUN"="${BATS_TEST_TMPDIR}/${program}-stub-run" export "${prefix}_STUB_LOG"="${BATS_TEST_TMPDIR}/${program}-stub-log" export "${prefix}_STUB_END"= mkdir -p "${BATS_TEST_TMPDIR}/bin" cp "${BATS_TEST_DIRNAME}/stubs/stub" "${BATS_TEST_TMPDIR}/bin/${program}" touch "${BATS_TEST_TMPDIR}/${program}-stub-plan" for arg in "$@"; do printf "%s\n" "$arg" >> "${BATS_TEST_TMPDIR}/${program}-stub-plan"; done } unstub() { local program="$1" local prefix="$(echo "$program" | tr a-z- A-Z_)" local path="${BATS_TEST_TMPDIR}/bin/${program}" export "${prefix}_STUB_END"=1 local STATUS=0 "$path" || STATUS="$?" rm -f "$path" rm -f "${BATS_TEST_TMPDIR}/${program}-stub-plan" "${BATS_TEST_TMPDIR}/${program}-stub-run" return "$STATUS" } run_inline_definition() { local definition="${BATS_TEST_TMPDIR}/build-definition" cat > "$definition" run python-build "$definition" "${1:-$INSTALL_ROOT}" } install_fixture() { local args while [ "${1#-}" != "$1" ]; do args="$args $1" shift 1 done local name="$1" local destination="$2" [ -n "$destination" ] || destination="$INSTALL_ROOT" run python-build $args "$FIXTURE_ROOT/$name" "$destination" } assert() { if ! "$@"; then flunk "failed: $@" fi } refute() { if "$@"; then flunk "expected to fail: $@" fi } flunk() { { if [ "$#" -eq 0 ]; then cat - else echo "$@" fi } | sed "s:${BATS_TEST_TMPDIR}:\${BATS_TEST_TMPDIR}:g" >&2 return 1 } assert_success() { if [ "$status" -ne 0 ]; then { echo "command failed with exit status $status" echo "output: $output" } | flunk elif [ "$#" -gt 0 ]; then assert_output "$1" fi } assert_failure() { if [ "$status" -eq 0 ]; then flunk "expected failed exit status" elif [ "$#" -gt 0 ]; then assert_output "$1" fi } assert_equal() { if [ "$1" != "$2" ]; then { echo "expected:" echo "$1" echo "actual:" echo "$2" } | flunk fi } assert_output() { local expected if [ $# -eq 0 ]; then expected="$(cat -)" else expected="$1" fi assert_equal "$expected" "$output" } assert_output_contains() { local expected="$1" if [ -z "$expected" ]; then echo "assert_output_contains needs an argument" >&2 return 1 fi echo "$output" | $(type -P ggrep grep | head -n1) -F "$expected" >/dev/null || { { echo "expected output to contain $expected" echo "actual: $output" } | flunk } } # Output a modified PATH that ensures that the given executable is not present, # but in which system utils necessary for pyenv operation are still available. path_without() { local path=":${PATH}:" for exe; do local found alt util for found in $(PATH="$path" type -aP "$exe"); do found="${found%/*}" if [ "$found" != "${PYENV_ROOT}/shims" ]; then alt="${PYENV_TEST_DIR}/$(echo "${found#/}" | tr '/' '-')" mkdir -p "$alt" for util in bash head cut readlink greadlink; do if [ -x "${found}/$util" ]; then ln -s "${found}/$util" "${alt}/$util" fi done path="${path/:${found}:/:${alt}:}" fi done done path="${path#:}" path="${path%:}" echo "$path" } pyenv-pyenv-485090e/plugins/python-build/test/tmp/000077500000000000000000000000001517431316200221535ustar00rootroot00000000000000pyenv-pyenv-485090e/plugins/python-build/test/tmp/.gitignore000066400000000000000000000000021517431316200241330ustar00rootroot00000000000000* pyenv-pyenv-485090e/plugins/python-build/test/version.bats000066400000000000000000000020511517431316200237110ustar00rootroot00000000000000#!/usr/bin/env bats load test_helper python_build_bin="${BATS_TEST_DIRNAME}/../bin/python-build" static_version="$(grep VERSION "$python_build_bin" | head -n1 | cut -d'"' -f 2)" @test "python-build static version" { stub git 'echo "ASPLODE" >&2; exit 1' run python-build --version assert_success "python-build ${static_version}" unstub git } @test "python-build git version" { stub git \ 'remote -v : echo origin https://github.com/pyenv/pyenv.git' \ "describe --tags HEAD : echo v1984-12-gSHA" run python-build --version assert_success "python-build 1984-12-gSHA" unstub git } @test "git describe fails" { stub git \ 'remote -v : echo origin https://github.com/pyenv/pyenv.git' \ "describe --tags HEAD : echo ASPLODE >&2; exit 1" run python-build --version assert_success "python-build ${static_version}" unstub git } @test "git remote doesn't match" { stub git \ 'remote -v : echo origin https://github.com/Homebrew/homebrew.git' run python-build --version assert_success "python-build ${static_version}" } pyenv-pyenv-485090e/pyenv.d/000077500000000000000000000000001517431316200156605ustar00rootroot00000000000000pyenv-pyenv-485090e/pyenv.d/exec/000077500000000000000000000000001517431316200166045ustar00rootroot00000000000000pyenv-pyenv-485090e/pyenv.d/exec/pip-rehash.bash000066400000000000000000000012331517431316200215020ustar00rootroot00000000000000PYENV_PIP_REHASH_ROOT="${BASH_SOURCE[0]%/*}/pip-rehash" PYENV_REHASH_COMMAND="${PYENV_COMMAND##*/}" # Remove any version information, from e.g. "pip2" or "pip3.10". if [[ $PYENV_REHASH_COMMAND =~ ^(pip|easy_install)[23](\.[0-9]+)?$ ]]; then PYENV_REHASH_COMMAND="${BASH_REMATCH[1]}" # Check for ` -m pip ` in arguments elif [[ "$*" =~ [[:space:]]-m[[:space:]]pip[[:space:]] ]]; then PYENV_REHASH_COMMAND="pip" fi if [ -x "${PYENV_PIP_REHASH_ROOT}/${PYENV_REHASH_COMMAND}" ]; then PYENV_COMMAND_PATH="${PYENV_PIP_REHASH_ROOT}/${PYENV_REHASH_COMMAND##*/}" PYENV_BIN_PATH="${PYENV_PIP_REHASH_ROOT}" export PYENV_REHASH_REAL_COMMAND="${PYENV_COMMAND##*/}" fi pyenv-pyenv-485090e/pyenv.d/exec/pip-rehash/000077500000000000000000000000001517431316200206445ustar00rootroot00000000000000pyenv-pyenv-485090e/pyenv.d/exec/pip-rehash/conda000077500000000000000000000013071517431316200216570ustar00rootroot00000000000000#!/usr/bin/env bash set -e [ -n "$PYENV_DEBUG" ] && set -x # Remove pyenv-pip-rehash/libexec from PATH to avoid infinite loops in `pyenv-which` (yyuu/pyenv#146) _PATH=":${PATH}:" _HERE="$(dirname "${BASH_SOURCE[0]}")" # remove this from PATH _PATH="${_PATH//:${_HERE}:/:}" _PATH="${_PATH#:}" _PATH="${_PATH%:}" PATH="${_PATH}" PYENV_COMMAND_PATH="$(pyenv-which "${PYENV_REHASH_REAL_COMMAND}")" PYENV_BIN_PATH="${PYENV_COMMAND_PATH%/*}" export PATH="${PYENV_BIN_PATH}:${PATH}" STATUS=0 "$PYENV_COMMAND_PATH" "$@" || STATUS="$?" # Run `pyenv-rehash` after a successful installation. if [ "$STATUS" == "0" ]; then case "$1" in "install" | "remove" | "uninstall") pyenv-rehash;; esac fi exit "$STATUS" pyenv-pyenv-485090e/pyenv.d/exec/pip-rehash/easy_install000077500000000000000000000012131517431316200232560ustar00rootroot00000000000000#!/usr/bin/env bash set -e [ -n "$PYENV_DEBUG" ] && set -x # Remove pyenv-pip-rehash/libexec from PATH to avoid infinite loops in `pyenv-which` (yyuu/pyenv#146) _PATH=":${PATH}:" _HERE="$(dirname "${BASH_SOURCE[0]}")" # remove this from PATH _PATH="${_PATH//:${_HERE}:/:}" _PATH="${_PATH#:}" _PATH="${_PATH%:}" PATH="${_PATH}" PYENV_COMMAND_PATH="$(pyenv-which "${PYENV_REHASH_REAL_COMMAND}")" PYENV_BIN_PATH="${PYENV_COMMAND_PATH%/*}" export PATH="${PYENV_BIN_PATH}:${PATH}" STATUS=0 "$PYENV_COMMAND_PATH" "$@" || STATUS="$?" # Run `pyenv-rehash` after a successful installation. if [ "$STATUS" == "0" ]; then pyenv-rehash fi exit "$STATUS" pyenv-pyenv-485090e/pyenv.d/exec/pip-rehash/pip000077500000000000000000000013601517431316200213620ustar00rootroot00000000000000#!/usr/bin/env bash set -e [ -n "$PYENV_DEBUG" ] && set -x # Remove pyenv-pip-rehash/libexec from PATH to avoid infinite loops in `pyenv-which` (yyuu/pyenv#146) _PATH=":${PATH}:" _HERE="$(dirname "${BASH_SOURCE[0]}")" # remove this from PATH _PATH="${_PATH//:${_HERE}:/:}" _PATH="${_PATH#:}" _PATH="${_PATH%:}" PATH="${_PATH}" PYENV_COMMAND_PATH="$(pyenv-which "${PYENV_REHASH_REAL_COMMAND}")" PYENV_BIN_PATH="${PYENV_COMMAND_PATH%/*}" export PATH="${PYENV_BIN_PATH}:${PATH}" STATUS=0 "$PYENV_COMMAND_PATH" "$@" || STATUS="$?" # Run `pyenv-rehash` after a successful installation. if [ "$STATUS" == "0" ]; then for piparg in "$@"; do case ${piparg} in "install" | "uninstall" ) pyenv-rehash ; break;; esac done fi exit "$STATUS" pyenv-pyenv-485090e/pyenv.d/install/000077500000000000000000000000001517431316200173265ustar00rootroot00000000000000pyenv-pyenv-485090e/pyenv.d/install/latest.bash000066400000000000000000000014751517431316200214700ustar00rootroot00000000000000pyenv_install_resolve_latest() { local DEFINITION_PREFIX DEFINITION_TYPE local -a DEFINITION_CANDIDATES local DEFINITION="$1" DEFINITION_PREFIX="${DEFINITION%%:*}" DEFINITION_TYPE="${DEFINITION_PREFIX%%-*}" # TODO: support non-CPython versions if [[ "${DEFINITION}" != "${DEFINITION_PREFIX}" ]]; then DEFINITION_CANDIDATES=(\ $(python-build --definitions | \ grep -F "${DEFINITION_PREFIX}" | \ grep "^${DEFINITION_TYPE}" | \ sed -E -e '/-dev$/d' -e '/-src$/d' -e '/(b|rc)[0-9]+$/d' -e '/[0-9]+t$/d' | \ sort -t. -k1,1r -k 2,2nr -k 3,3nr \ || true)) DEFINITION="${DEFINITION_CANDIDATES}" fi echo "$DEFINITION" } for i in ${!DEFINITIONS[*]}; do DEFINITIONS[$i]="$(pyenv_install_resolve_latest "${DEFINITIONS[$i]}")" done unset pyenv_install_resolve_latest pyenv-pyenv-485090e/pyenv.d/rehash/000077500000000000000000000000001517431316200171325ustar00rootroot00000000000000pyenv-pyenv-485090e/pyenv.d/rehash/conda.bash000066400000000000000000000042431517431316200210600ustar00rootroot00000000000000# Anaconda comes with binaries of system packages (e.g. `openssl`, `curl`). # Creating shims for those binaries will prevent pyenv users to run those # commands normally when not using Anaconda. # # This hooks is intended to skip creating shims for those executables. conda_exists() { shopt -s dotglob nullglob local condas=($(echo "${PYENV_ROOT}/versions/"*"/bin/conda" "${PYENV_ROOT}/versions/"*"/envs/"*"/bin/conda")) shopt -u dotglob nullglob [ -n "${condas}" ] } if conda_exists; then # Reads the list of `blacklisted` conda binaries # from `conda.d/default.list` and creates a function # `conda_shim` to skip creating shims for those binaries. build_conda_exclusion_list() { shims=() for shim in $(sed 's/#.*$//; /^[[:space:]]*$/d' "${BASH_SOURCE%/*}/conda.d/default.list"); do if [ -n "${shim##*/}" ]; then shims[${#shims[*]}]="${shim})return 0;;" fi done eval \ "conda_shim() { case \"\${1##*/}\" in ${shims[@]} *) return 1;; esac }" } # override `make_shims` to avoid conflict between pyenv-virtualenv's `envs.bash` # https://github.com/pyenv/pyenv-virtualenv/blob/v20160716/etc/pyenv.d/rehash/envs.bash # The only difference between this `make_shims` and the `make_shims` defined # in `libexec/pyenv-rehash` is that this one calls `conda_shim` to check # if shim is blacklisted. If blacklisted -> skip creating shim. make_shims() { local file shim for file do shim="${file##*/}" if ! conda_shim "${shim}" 1>&2; then register_shim "$shim" fi done } deregister_conda_shims() { # adapted for Bash 4.x's associative array (#1749) if declare -p registered_shims 2> /dev/null | grep -Eq '^(declare|typeset) -A'; then for shim in ${!registered_shims[*]}; do if conda_shim "${shim}" 1>&2; then unset registered_shims[${shim}] fi done else local shim local shims=() for shim in ${registered_shims}; do if ! conda_shim "${shim}" 1>&2; then shims[${#shims[*]}]="${shim}" fi done registered_shims=" ${shims[@]} " fi } build_conda_exclusion_list deregister_conda_shims fi pyenv-pyenv-485090e/pyenv.d/rehash/conda.d/000077500000000000000000000000001517431316200204405ustar00rootroot00000000000000pyenv-pyenv-485090e/pyenv.d/rehash/conda.d/.gitignore000066400000000000000000000000361517431316200224270ustar00rootroot00000000000000* !/.gitignore !/default.list pyenv-pyenv-485090e/pyenv.d/rehash/conda.d/default.list000066400000000000000000000030371517431316200227640ustar00rootroot00000000000000bunzip2 clear # curl curl curl-config # fontconfig fc-cache fc-cat fc-list fc-match fc-pattern fc-query fc-scan fc-validate # freetype freetype-config # libglib2.0-bin gapplication gdbus gresource gsettings gio-querymodules glib-compile-resources glib-compile-schemas infocmp # libpng libpng-config # libxml2 xml2-config # libxml2-utils xmlcatalog xmllint # ncurses tput # openssl openssl # qtchooser assistant designer lconvert linguist lrelease lupdate moc pixeltool qcollectiongenerator qdbus qdbuscpp2xml qdbusviewer qdbusxml2cpp qhelpconverter qhelpgenerator qmake qmlplugindump qmlviewer qtconfig rcc uic xmlpatterns xmlpatternsvalidator # redis redis-benchmark redis-check-aof redis-check-dump redis-cli redis-server # sed sed # sqlite3 sqlite3 # xslt-config xslt-config # xsltproc xsltproc # xz unxz xz xzcat xzcmd xzdiff xzegrep xzfgrep xzgrep xzless xzmore reset # --- start exclusions from coreutils [ b2sum base32 base64 basename basenc cat chcon chgrp chmod chown chroot cksum comm cp csplit cut date dd df dir dircolors dirname du echo env expand expr factor false fmt fold greadlink groups head hostid id install join kill link ln logname ls md5sum mkdir mkfifo mknod mktemp mv nice nl nohup nproc numfmt od paste pathchk pinky pr printenv printf ptx pwd readlink realpath rm rmdir runcon seq sha1sum sha224sum sha256sum sha384sum sha512sum shred shuf sleep sort split stat stdbuf stty sum sync tac tail tee test timeout touch tr true truncate tsort tty uname unexpand uniq unlink uptime users vdir wc who whoami yes # --- end exclusions from coreutilspyenv-pyenv-485090e/pyenv.d/rehash/source.bash000066400000000000000000000015261517431316200212750ustar00rootroot00000000000000PROTOTYPE_SOURCE_SHIM_PATH="${SHIM_PATH}/.pyenv-source-shim" shims=() shopt -s nullglob for shim in $(sort -u "${BASH_SOURCE%/*}/source.d/"*".list" | sed -e 's/#.*$//' -e '/^[[:space:]]*$/d'); do if [ -n "${shim##*/}" ]; then shims[${#shims[*]}]="${shim})return 0;;" fi done shopt -u nullglob eval "source_shim(){ case \"\${1##*/}\" in ${shims[@]} *)return 1;;esac;}" cat > "${PROTOTYPE_SOURCE_SHIM_PATH}" </dev/null; then CC=gcc else echo "warning: gcc not found; using CC=cc" >&2 CC=cc fi fi if ! type -p "$CC" >/dev/null; then echo "aborted: compiler not found: $CC" >&2 exit 1 fi case "$(uname -s)" in Darwin* ) host_os="darwin$(uname -r)" ;; FreeBSD* ) host_os="freebsd$(uname -r)" ;; OpenBSD* ) host_os="openbsd$(uname -r)" ;; * ) host_os="linux-gnu" esac eval "$("$src_dir"/shobj-conf -C "$CC" -o "$host_os")" sed " s#@CC@#${CC}# s#@CFLAGS@#${CFLAGS}# s#@LOCAL_CFLAGS@#${LOCAL_CFLAGS}# s#@DEFS@#${DEFS}# s#@LOCAL_DEFS@#${LOCAL_DEFS}# s#@SHOBJ_CC@#${SHOBJ_CC}# s#@SHOBJ_CFLAGS@#${SHOBJ_CFLAGS}# s#@SHOBJ_LD@#${SHOBJ_LD}# s#@SHOBJ_LDFLAGS@#${SHOBJ_LDFLAGS}# s#@SHOBJ_XLDFLAGS@#${SHOBJ_XLDFLAGS}# s#@SHOBJ_LIBS@#${SHOBJ_LIBS}# s#@SHOBJ_STATUS@#${SHOBJ_STATUS}# " "$src_dir"/Makefile.in > "$src_dir"/Makefile pyenv-pyenv-485090e/src/realpath.c000066400000000000000000000015001517431316200170240ustar00rootroot00000000000000#include "bash.h" #include #include int realpath_builtin(list) WORD_LIST *list; { int es; char *realbuf, *p; if (list == 0) { // builtin_usage(); return (EX_USAGE); } for (es = EXECUTION_SUCCESS; list; list = list->next) { p = list->word->word; realbuf = realpath(p, NULL); if (realbuf == NULL) { es = EXECUTION_FAILURE; // builtin_error("%s: cannot resolve: %s", p, strerror(errno)); } else { printf("%s\n", realbuf); free(realbuf); } } return es; } char *realpath_doc[] = { "Display each PATHNAME argument, resolving symbolic links. The exit status", "is 0 if each PATHNAME was resolved; non-zero otherwise.", (char *)NULL }; struct builtin realpath_struct = { "realpath", realpath_builtin, BUILTIN_ENABLED, realpath_doc, "realpath pathname [pathname...]", 0 }; pyenv-pyenv-485090e/src/shobj-conf000077500000000000000000000345501517431316200170510ustar00rootroot00000000000000#! /bin/sh # # shobj-conf -- output a series of variable assignments to be substituted # into a Makefile by configure which specify system-dependent # information for creating shared objects that may be loaded # into bash with `enable -f' # # usage: shobj-conf [-C compiler] -c host_cpu -o host_os -v host_vendor # # Chet Ramey # chet@po.cwru.edu # Copyright (C) 1996-2014 Free Software Foundation, Inc. # # This file is part of GNU Bash, the Bourne Again SHell. # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # # defaults # SHOBJ_STATUS=supported SHLIB_STATUS=supported SHOBJ_CC=cc SHOBJ_CFLAGS= SHOBJ_LD= SHOBJ_LDFLAGS= SHOBJ_XLDFLAGS= SHOBJ_LIBS= SHLIB_XLDFLAGS= SHLIB_LIBS= SHLIB_DOT='.' SHLIB_LIBPREF='lib' SHLIB_LIBSUFF='so' SHLIB_LIBVERSION='$(SHLIB_LIBSUFF)' SHLIB_DLLVERSION='$(SHLIB_MAJOR)' PROGNAME=`basename $0` USAGE="$PROGNAME [-C compiler] -c host_cpu -o host_os -v host_vendor" while [ $# -gt 0 ]; do case "$1" in -C) shift; SHOBJ_CC="$1"; shift ;; -c) shift; host_cpu="$1"; shift ;; -o) shift; host_os="$1"; shift ;; -v) shift; host_vendor="$1"; shift ;; *) echo "$USAGE" >&2 ; exit 2;; esac done case "${host_os}-${SHOBJ_CC}-${host_vendor}" in nsk-cc-tandem) SHOBJ_CFLAGS=-Wglobalized case `uname -m` in NSR*) SHOBJ_CFLAGS="${SHOBJ_CFLAGS} -Wcall_shared" # default on TNS/E, needed on TNS/R SHOBJ_LD=/usr/bin/ld # for TNS/R ;; NSE*|NEO*) SHOBJ_LD=/usr/bin/eld ;; esac SHOBJ_LDFLAGS='-shared -bglobalized -unres_symbols ignore' ;; sunos4*-*gcc*) SHOBJ_CFLAGS=-fpic SHOBJ_LD=/usr/bin/ld SHOBJ_LDFLAGS='-assert pure-text' SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)$(SHLIB_MINOR)' ;; sunos4*) SHOBJ_CFLAGS=-pic SHOBJ_LD=/usr/bin/ld SHOBJ_LDFLAGS='-assert pure-text' SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)$(SHLIB_MINOR)' ;; sunos5*-*gcc*|solaris2*-*gcc*) SHOBJ_LD='${CC}' ld_used=`gcc -print-prog-name=ld` if ${ld_used} -V 2>&1 | grep GNU >/dev/null 2>&1; then # This line works for the GNU ld SHOBJ_LDFLAGS='-shared -Wl,-h,$@' # http://sourceware.org/ml/binutils/2001-08/msg00361.html SHOBJ_CFLAGS=-fPIC else # This line works for the Solaris linker in /usr/ccs/bin/ld SHOBJ_LDFLAGS='-shared -Wl,-i -Wl,-h,$@' SHOBJ_CFLAGS=-fpic fi # SHLIB_XLDFLAGS='-R $(libdir)' SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' ;; sunos5*|solaris2*) SHOBJ_CFLAGS='-K pic' SHOBJ_LD=/usr/ccs/bin/ld SHOBJ_LDFLAGS='-G -dy -z text -i -h $@' # SHLIB_XLDFLAGS='-R $(libdir)' SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' ;; # All versions of Linux (including Gentoo/FreeBSD) or the semi-mythical GNU Hurd. linux*-*|gnu*-*|k*bsd*-gnu-*|freebsd*-gentoo) SHOBJ_CFLAGS=-fPIC SHOBJ_LD='${CC}' SHOBJ_LDFLAGS='-shared -Wl,-soname,$@' SHLIB_XLDFLAGS='-Wl,-rpath,$(libdir) -Wl,-soname,`basename $@ $(SHLIB_MINOR)`' SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)$(SHLIB_MINOR)' ;; freebsd2*) SHOBJ_CFLAGS=-fpic SHOBJ_LD=ld SHOBJ_LDFLAGS='-x -Bshareable' SHLIB_XLDFLAGS='-R$(libdir)' SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)$(SHLIB_MINOR)' ;; # FreeBSD-3.x ELF freebsd3*|freebsdaout*) SHOBJ_CFLAGS=-fPIC SHOBJ_LD='${CC}' if [ -x /usr/bin/objformat ] && [ "`/usr/bin/objformat`" = "elf" ]; then SHOBJ_LDFLAGS='-shared -Wl,-soname,$@' SHLIB_XLDFLAGS='-Wl,-rpath,$(libdir)' SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' else SHOBJ_LDFLAGS='-shared' SHLIB_XLDFLAGS='-R$(libdir)' SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)$(SHLIB_MINOR)' fi ;; # FreeBSD-4.x and later have only ELF freebsd[4-9]*|freebsd1[0-9]*|freebsdelf*|dragonfly*) SHOBJ_CFLAGS=-fPIC SHOBJ_LD='${CC}' SHOBJ_LDFLAGS='-shared -Wl,-soname,$@' SHLIB_XLDFLAGS='-Wl,-rpath,$(libdir)' SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' ;; # Darwin/MacOS X darwin*) # Common definitions for all darwin/mac os x versions SHOBJ_CFLAGS='-fno-common' SHOBJ_LD='${CC}' SHLIB_LIBVERSION='$(SHLIB_MAJOR)$(SHLIB_MINOR).$(SHLIB_LIBSUFF)' SHLIB_LIBSUFF='dylib' # unused at this time SHLIB_SONAME='$(libdir)/`echo $@ | sed "s:\\..*::"`.$(SHLIB_MAJOR).$(SHLIB_LIBSUFF)' case "${host_os}" in # Darwin versions 1, 5, 6, 7 correspond to Mac OS X 10.0, 10.1, 10.2, # and 10.3, respectively. darwin[1-7].*) SHOBJ_STATUS=unsupported SHOBJ_LDFLAGS='-dynamic' SHLIB_XLDFLAGS='-arch_only `/usr/bin/arch` -install_name $(libdir)/`echo $@ | sed "s:\\..*::"`.$(SHLIB_MAJOR).$(SHLIB_LIBSUFF) -current_version $(SHLIB_MAJOR)$(SHLIB_MINOR) -compatibility_version $(SHLIB_MAJOR) -v' ;; # Darwin 8 == Mac OS X 10.4; Mac OS X 10.N == Darwin N+4 *) case "${host_os}" in darwin[89]*|darwin1[012]*) SHOBJ_ARCHFLAGS='-arch_only `/usr/bin/arch`' ;; *) # Mac OS X 10.9 (Mavericks) and later SHOBJ_ARCHFLAGS= # for 32 and 64bit universal library #SHOBJ_ARCHFLAGS='-arch i386 -arch x86_64' #SHOBJ_CFLAGS=${SHOBJ_CFLAGS}' -arch i386 -arch x86_64' ;; esac SHOBJ_LDFLAGS="-dynamiclib -dynamic -undefined dynamic_lookup ${SHOBJ_ARCHFLAGS}" SHLIB_XLDFLAGS="-dynamiclib ${SHOBJ_ARCHFLAGS}"' -install_name $(libdir)/`echo $@ | sed "s:\\..*::"`.$(SHLIB_MAJOR).$(SHLIB_LIBSUFF) -current_version $(SHLIB_MAJOR)$(SHLIB_MINOR) -compatibility_version $(SHLIB_MAJOR) -v' ;; esac SHLIB_LIBS='-lncurses' # see if -lcurses works on MacOS X 10.1 ;; openbsd*|netbsd*|mirbsd*) SHOBJ_CFLAGS=-fPIC SHOBJ_LD='${CC}' SHOBJ_LDFLAGS='-shared' SHLIB_XLDFLAGS='-R$(libdir)' SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)$(SHLIB_MINOR)' ;; bsdi2*) SHOBJ_CC=shlicc2 SHOBJ_CFLAGS= SHOBJ_LD=ld SHOBJ_LDFLAGS=-r SHOBJ_LIBS=-lc_s.2.1.0 # BSD/OS 2.x and 3.x `shared libraries' are too much of a pain in # the ass -- they require changing {/usr/lib,etc}/shlib.map on # each system, and the library creation process is byzantine SHLIB_STATUS=unsupported ;; bsdi3*) SHOBJ_CC=shlicc2 SHOBJ_CFLAGS= SHOBJ_LD=ld SHOBJ_LDFLAGS=-r SHOBJ_LIBS=-lc_s.3.0.0 # BSD/OS 2.x and 3.x `shared libraries' are too much of a pain in # the ass -- they require changing {/usr/lib,etc}/shlib.map on # each system, and the library creation process is byzantine SHLIB_STATUS=unsupported ;; bsdi4*) # BSD/OS 4.x now supports ELF and SunOS-style dynamically-linked # shared libraries. gcc 2.x is the standard compiler, and the # `normal' gcc options should work as they do in Linux. SHOBJ_CFLAGS=-fPIC SHOBJ_LD='${CC}' SHOBJ_LDFLAGS='-shared -Wl,-soname,$@' SHLIB_XLDFLAGS='-Wl,-soname,`basename $@ $(SHLIB_MINOR)`' SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)$(SHLIB_MINOR)' ;; osf*-*gcc*) # Fix to use gcc linker driver from bfischer@TechFak.Uni-Bielefeld.DE SHOBJ_LD='${CC}' SHOBJ_LDFLAGS='-shared -Wl,-soname,$@' SHLIB_XLDFLAGS='-rpath $(libdir)' SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' ;; osf*) SHOBJ_LD=ld SHOBJ_LDFLAGS='-shared -soname $@ -expect_unresolved "*"' SHLIB_XLDFLAGS='-rpath $(libdir)' SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' ;; aix4.[2-9]*-*gcc*|aix[5-9].*-*gcc*) # lightly tested by jik@cisco.com SHOBJ_CFLAGS=-fpic SHOBJ_LD='ld' SHOBJ_LDFLAGS='-bdynamic -bnoentry -bexpall' SHOBJ_XLDFLAGS='-G' SHLIB_XLDFLAGS='-bM:SRE' SHLIB_LIBS='-lcurses -lc' SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' ;; aix4.[2-9]*|aix[5-9].*) SHOBJ_CFLAGS=-K SHOBJ_LD='ld' SHOBJ_LDFLAGS='-bdynamic -bnoentry -bexpall' SHOBJ_XLDFLAGS='-G' SHLIB_XLDFLAGS='-bM:SRE' SHLIB_LIBS='-lcurses -lc' SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' ;; # # THE FOLLOWING ARE UNTESTED -- and some may not support the dlopen interface # irix[56]*-*gcc*) SHOBJ_CFLAGS='-fpic' SHOBJ_LD='${CC}' SHOBJ_LDFLAGS='-shared -Wl,-soname,$@' SHLIB_XLDFLAGS='-Wl,-rpath,$(libdir)' SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' ;; irix[56]*) SHOBJ_CFLAGS='-K PIC' SHOBJ_LD=ld # SHOBJ_LDFLAGS='-call_shared -hidden_symbol -no_unresolved -soname $@' # Change from David Kaelbling . If you have problems, # remove the `-no_unresolved' SHOBJ_LDFLAGS='-shared -no_unresolved -soname $@' SHLIB_XLDFLAGS='-rpath $(libdir)' SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' ;; hpux9*-*gcc*) # must use gcc; the bundled cc cannot compile PIC code SHOBJ_CFLAGS='-fpic' SHOBJ_LD='${CC}' SHOBJ_LDFLAGS='-shared -Wl,-b -Wl,+s' SHLIB_XLDFLAGS='-Wl,+b,$(libdir)' SHLIB_LIBSUFF='sl' SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' ;; hpux9*) SHOBJ_STATUS=unsupported SHLIB_STATUS=unsupported # If you are using the HP ANSI C compiler, you can uncomment and use # this code (I have not tested it) # SHOBJ_STATUS=supported # SHLIB_STATUS=supported # # SHOBJ_CFLAGS='+z' # SHOBJ_LD='ld' # SHOBJ_LDFLAGS='-b +s' # # SHLIB_XLDFLAGS='+b $(libdir)' # SHLIB_LIBSUFF='sl' # SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' ;; hpux10*-*gcc*) # must use gcc; the bundled cc cannot compile PIC code SHOBJ_CFLAGS='-fpic' SHOBJ_LD='${CC}' # if you have problems linking here, moving the `-Wl,+h,$@' from # SHLIB_XLDFLAGS to SHOBJ_LDFLAGS has been reported to work SHOBJ_LDFLAGS='-shared -fpic -Wl,-b -Wl,+s' SHLIB_XLDFLAGS='-Wl,+h,$@ -Wl,+b,$(libdir)' SHLIB_LIBSUFF='sl' SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' ;; hpux10*) SHOBJ_STATUS=unsupported SHLIB_STATUS=unsupported # If you are using the HP ANSI C compiler, you can uncomment and use # this code (I have not tested it) # SHOBJ_STATUS=supported # SHLIB_STATUS=supported # # SHOBJ_CFLAGS='+z' # SHOBJ_LD='ld' # SHOBJ_LDFLAGS='-b +s +h $@' # # SHLIB_XLDFLAGS='+b $(libdir)' # SHLIB_LIBSUFF='sl' # SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' ;; hpux11*-*gcc*) # must use gcc; the bundled cc cannot compile PIC code SHOBJ_CFLAGS='-fpic' SHOBJ_LD='${CC}' # SHOBJ_LDFLAGS='-shared -Wl,-b -Wl,-B,symbolic -Wl,+s -Wl,+std -Wl,+h,$@' SHOBJ_LDFLAGS='-shared -fpic -Wl,-b -Wl,+s -Wl,+h,$@' SHLIB_XLDFLAGS='-Wl,+b,$(libdir)' SHLIB_LIBSUFF='sl' SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' ;; hpux11*) SHOBJ_STATUS=unsupported SHLIB_STATUS=unsupported # If you are using the HP ANSI C compiler, you can uncomment and use # this code (I have not tested it) # SHOBJ_STATUS=supported # SHLIB_STATUS=supported # # SHOBJ_CFLAGS='+z' # SHOBJ_LD='ld' # SHOBJ_LDFLAGS='-b +s +h $@' # # SHLIB_XLDFLAGS='+b $(libdir)' # SHLIB_LIBSUFF='sl' # SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' ;; sysv4*-*gcc*) SHOBJ_CFLAGS=-shared SHOBJ_LDFLAGS='-shared -h $@' SHOBJ_LD='${CC}' SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' ;; sysv4*) SHOBJ_CFLAGS='-K PIC' SHOBJ_LD=ld SHOBJ_LDFLAGS='-dy -z text -G -h $@' SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' ;; sco3.2v5*-*gcc*) SHOBJ_CFLAGS='-fpic' # DEFAULTS TO ELF SHOBJ_LD='${CC}' SHOBJ_LDFLAGS='-shared' SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' ;; sco3.2v5*) SHOBJ_CFLAGS='-K pic -b elf' SHOBJ_LD=ld SHOBJ_LDFLAGS='-G -b elf -dy -z text -h $@' SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' ;; sysv5uw7*-*gcc*) SHOBJ_CFLAGS='-fpic' SHOBJ_LD='${CC}' SHOBJ_LDFLAGS='-shared' SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' ;; sysv5uw7*) SHOBJ_CFLAGS='-K PIC' SHOBJ_LD=ld SHOBJ_LDFLAGS='-G -dy -z text -h $@' SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' ;; sysv5UnixWare*-*gcc*) SHOBJ_CFLAGS=-fpic SHOBJ_LD='${CC}' SHOBJ_LDFLAGS='-shared' SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' ;; sysv5UnixWare*) SHOBJ_CFLAGS='-K PIC' SHOBJ_LD=ld SHOBJ_LDFLAGS='-G -dy -z text -h $@' SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' ;; sysv5OpenUNIX*-*gcc*) SHOBJ_CFLAGS=-fpic SHOBJ_LD='${CC}' SHOBJ_LDFLAGS='-shared' SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' ;; sysv5OpenUNIX*) SHOBJ_CFLAGS='-K PIC' SHOBJ_LD=ld SHOBJ_LDFLAGS='-G -dy -z text -h $@' SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' ;; dgux*-*gcc*) SHOBJ_CFLAGS=-fpic SHOBJ_LD='${CC}' SHOBJ_LDFLAGS='-shared' SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' ;; dgux*) SHOBJ_CFLAGS='-K pic' SHOBJ_LD=ld SHOBJ_LDFLAGS='-G -dy -h $@' SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' ;; msdos*) SHOBJ_STATUS=unsupported SHLIB_STATUS=unsupported ;; cygwin*) SHOBJ_LD='$(CC)' SHOBJ_LDFLAGS='-shared -Wl,--enable-auto-import -Wl,--enable-auto-image-base -Wl,--export-all -Wl,--out-implib=$(@).a' SHLIB_LIBPREF='cyg' SHLIB_LIBSUFF='dll' SHLIB_LIBVERSION='$(SHLIB_DLLVERSION).$(SHLIB_LIBSUFF)' SHLIB_LIBS='$(TERMCAP_LIB)' SHLIB_DOT= # For official cygwin releases, DLLVERSION will be defined in the # environment of configure, and will be incremented any time the API # changes in a non-backwards compatible manner. Otherwise, it is just # SHLIB_MAJOR. if [ -n "$DLLVERSION" ] ; then SHLIB_DLLVERSION="$DLLVERSION" fi ;; mingw*) SHOBJ_LD='$(CC)' SHOBJ_LDFLAGS='-shared -Wl,--enable-auto-import -Wl,--enable-auto-image-base -Wl,--export-all -Wl,--out-implib=$(@).a' SHLIB_LIBSUFF='dll' SHLIB_LIBVERSION='$(SHLIB_DLLVERSION).$(SHLIB_LIBSUFF)' SHLIB_LIBS='$(TERMCAP_LIB)' SHLIB_DOT= # For official cygwin releases, DLLVERSION will be defined in the # environment of configure, and will be incremented any time the API # changes in a non-backwards compatible manner. Otherwise, it is just # SHLIB_MAJOR. if [ -n "$DLLVERSION" ] ; then SHLIB_DLLVERSION="$DLLVERSION" fi ;; # # Rely on correct gcc configuration for everything else # *-*gcc*) SHOBJ_CFLAGS=-fpic SHOBJ_LD='${CC}' SHOBJ_LDFLAGS='-shared' SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' ;; *) SHOBJ_STATUS=unsupported SHLIB_STATUS=unsupported ;; esac echo SHOBJ_CC=\'"$SHOBJ_CC"\' echo SHOBJ_CFLAGS=\'"$SHOBJ_CFLAGS"\' echo SHOBJ_LD=\'"$SHOBJ_LD"\' echo SHOBJ_LDFLAGS=\'"$SHOBJ_LDFLAGS"\' echo SHOBJ_XLDFLAGS=\'"$SHOBJ_XLDFLAGS"\' echo SHOBJ_LIBS=\'"$SHOBJ_LIBS"\' echo SHLIB_XLDFLAGS=\'"$SHLIB_XLDFLAGS"\' echo SHLIB_LIBS=\'"$SHLIB_LIBS"\' echo SHLIB_DOT=\'"$SHLIB_DOT"\' echo SHLIB_LIBPREF=\'"$SHLIB_LIBPREF"\' echo SHLIB_LIBSUFF=\'"$SHLIB_LIBSUFF"\' echo SHLIB_LIBVERSION=\'"$SHLIB_LIBVERSION"\' echo SHLIB_DLLVERSION=\'"$SHLIB_DLLVERSION"\' echo SHOBJ_STATUS=\'"$SHOBJ_STATUS"\' echo SHLIB_STATUS=\'"$SHLIB_STATUS"\' exit 0 pyenv-pyenv-485090e/terminal_output.png000066400000000000000000003144741517431316200202530ustar00rootroot00000000000000‰PNG  IHDRTÆP?IÙ IDATxœìÝÝs]ç}Ø{üñŒ_¢D–\+Ž|dÙ±­­Ì–‡°L4 -æ)85Y.‚ r†¨Mth¦LRðFèiÑÂf˜¡–ÇŽ0 )ië Q„$C2¡X2-Ù–d»m"7NZ5Ϲ °¸±ß÷zÛŸ‹Ï…G2¸öÚ âóÅóüþùŸÿ9ÿóþ$&ïuï­d ï èGy°µå½NÞ•.åýM­È{=½× *mÈûa€$å½îÞK•:ò~ˆiìý÷ßzTÞë‹4–÷ú|Q *kò~@ûYÞÎ@ÿË{´Ÿå½~_[6¨äýö¢¼?’–÷ºk/Ê{}_PPr‘÷‡@¯È{=·¨ò^ÿTD”®åýá°Õä½.œ·¼»€ " ˆ&=.ïõde‹•¼Ñ€nå½-®ôiPÉûMNHÓÿþßÿr_§¢ò^·Wz0¨äýæŠ'Å”÷5 uy¯'ö‹¼×··j\)tPÉûMO’—÷6Ð?ò^ï,’¼×Á·B\)dPÉû OÄ ?å½®*²ônX)LPÉûÍPD€¸¼×k–bŕ܃JÞoÄV (yô‹¼×{·Z`É»gäTò¾éýPòþà†¼×‹û9°ô}PÉû÷S@Éûƒ _ü¯ÿõ¿€彞×/ò^_î§ÀÒwA%ïÚË%ïoì<åýÃÈ^Þë’BKoÆ•ž*yßÀ^ (y³ "@¯Ë{]t«D–¼×ùó+©•¼oX/D”¼¿ ·j$ù§ú' !y¯÷mÕø’÷úv/ĕ•¼oP‘#JÞß`½Kòþ!ä/ïuÊ^Š.y¯9®.¨ä}CŠQòþæ)J0ÉûØz—âD–¼{AÒa¥« ’÷ (JHÉû#Ëh’÷‡!@R¶RlVº+•¼_°ˆ’N<Éûà  hú1²ˆ+…•¶ƒJÞ/2¯Òá$ïž"ûÇüG Ž¼×BËV +©•¼_ØV‰(‰Ø[QÞëE -âJ±ÂJÓ ’÷ é÷ˆ²UÂIÞÆ@ÿÊ{ý3«ÐÒïq%ïÑUPÙ*!E<I€­!ïuÕ^,[%¬´T¶BH)r@Éû›W,¶²¼×g»‰,ýWŠV6•~)E(¢I:~õ«_Ë{]°_cËVŽ+E‰*ýR¶z@ÉûÃE:•÷ze‘cKK¿‡•¼bJ/‡”¢”¼?,Ä oy¯‹æYŠWú1¬üó?ÿsè§R”ˆÒïá$ïD€nå½ÎZ¤ÀÒ«q%뾑YPéÅR”ˆ"˜$çþငä½Þ×OÁ¥ßãJ?„•ÔƒJ¯…”¼Šh"€ÀV•÷zdÑbKÞEXÉ(¨ˆ(Å(y°#@Úò^ÿÌ*´ˆ+ù†•T‚J/„”¼"J¿Å“¼?(·‚ÿù?ÿ'[@ÞëP[A¿E–~‰+½U *ýRz!¢&­Éû‡ l%y¯öJpé—¸²ÕÂJbA¥È!%ëˆÒkñ$ï)!ˆË{}2ØRäÀ’u\)jTé:¨)ÉG”~ 'yøý¯ßBKãÊV+]•^ )E‹(½NòþLÛ/ùKØ2ò^ë§èRÔÀ’U\)jXÉ<¨qWJV»QŠP¶r0Éû‡ о¼×ó .E ,½´k¥»UÚ*½Rú-¢ôc4ÉãCû½÷Þ:´CL‘K¯Ä•¢…•Ô‚ÊV )E(½N U½_ŠYòŽ+ýVZ *EŠ)i†”~Š(EŽ%y8½¯ÈÑE\É&¬dUš!%݈RÔx²UCÉßÿýßkò^¯Ë+¼5²äW¶BXé8¨)éD”¢”^ &yÿ :—÷úb§Á¥Ÿ‹°Ò~X©TŠSÒ )½Q²'ÂPTE-Eˆ,½WÒ +iF•MA%ïÒ,¦ôJHÉ3¢!œäýÁÚ¿û»¿€-/ïuº"‡—,"Kq¥Ha¥»U•¼cJQBJÖ¥ãIÞˆÂô¦¼×Ó .iG–^ˆ+E +IG•!¥»R´€Ò‹Ñ$ïp øz1¶-°+Ý…•~‹)ýQÒ(BÉß…ÿñ?þÐDÞëxE/E ,E+ýUº*[%¤dQz)ž @§ú%¸¤YŠWz5¬äTÒØ•Ò!¥(¥W¢IÞÚEñßÿû€ºò^¿*Š^‰-½Wz)¬ä±[¥£ R„])E )IF”¼J¿Ç’¼à@?Ë{ý/íèR´À’v\)ZX)Ên•¶ƒJÞ»RÒ )iîFIzJÞáD’Ò«Ñ%ËÀ’Ôî•4w­äV²Š*m!%™ˆ’U@)r8Éûºÿí¿ý7è;y¯»)ÀäYòÚ½"¬´UZ *½´+¥¨!¥è¥bIÞ?xâ~ñ‹_@nò^+B°)JhÉ"°ôCXé…Ý*MƒÊV)E(y…“^ #yÿà€­¤—BL^¡¥_âJ?†•®‚J^1%’Æn”n#JÑJBIÞ?€ì!¼ôS`é&®¤±k%­°’UT©TŠSz5¤¤Pò '½I~þóŸM低×M|É3´¤Xú=¬-ªÔ *IÅ”^Ø•ÒË%ëxR´`’÷ }E .YG–~+EÜ­’TTÙT¶Ê®”´CJ%«x’G0ÉûC¼?ûÙÏ ïä½î–W„I+´¤X’Ž+½VòØ­Ò0¨dSz)¤$½%ˆ’t<éÅX’÷`C/F—¤#Kžq¥Ó]+ýVÒˆ*IÆ”¼v¥$RÒÞ’tDI*ž1˜äýAß­wß}r“÷úXCLZ¡%­À’G\ét×JRa¥¨G€ÝT²Œ)[-¤äP’Ž'½Jòþá[A/‡—<#K’EXI7ª lå˜ÒIH)jDI* 5˜äýà Mï¼ó4•÷:V/Ƙ¬CK·¥hq¥“°ÒÏQ¥å ’ż”¼BJV»Q’Œ(I”¼£‰x½­—ãK‘¥›À’T\Ik×J‘ÂJVsUZ *ÝÄ”¤v¥5¤$µ¥Óˆ’f@)b,ÉûDÞÞ~ûmúHÞëMy+btÉ:°$W’صRÔ°’än•n¢JÓ Ò »RŠRÒŠ(EŠ'½Iòþa™„Ÿþô§ô¼×“z9å[ÒŠ,yÅ•"†•"ìVé*¨äSòØ•’wDétJšñ¤ˆ±DŒ€|9ÊdZ’,ì^I;®ôên•´¢JÝ Rô˜’dHI{7Jž%‹p’G Éû‡FQüä'? ‡ä½žTy˜,BK‘ãJš»V²Þ­’WT©TÒŒ)E )iîHI#¢äP²ˆ%b_QãKV±%ëÀ’t\é¥+݆•¤£Ê¦ ’æðù4cJV!%éÝ(YE”´ãI±$ïiúñ À–÷úT¯™4bKÒ‘%¸’殕¬ÂJQv«´Uz!¦´³+¥ˆ!%鈒d@I*œôb Éû‡"ô¢^ 0I…–,K’q¥a¥›Ý*E‰*iÇ”¢ìJI#¤´³%툒tê+˜òæ›o†7ß|3÷zA´®Þ¯Q¥ÑÑ_ÿðÿº9ê+í˜RT’Ž)‚ ´&¾¶žFT©îyF•ZídSPI먯Væ¦dS~ô£åþ@/øÑ~”kTIcžJ;G dqÔWQcŠ ­‰ÖÕû=ªÔ;ú«fPÉû¨¯z1% *IÅ”ëׯçþ@/¸~ýz¢Q¥zý¿ˆóTj•¤Žú꥘"¨@k¢uõ^Œ*IýÕ4¨dyÔWüFÕ:ê+‰˜½á‚ ´®z}=¨RÝ Špô×MA¥ÓÝ)­õ•FL©*Ä”þð‡á‡?üaî ô‚h]½Û¨R½ÞŸdTiçè¯vw©4 *iõ•ÔúnbJ¯•Sº'|ãÞ{ÂøÝ¾qï=a_éžÜ¯+²ïO‡¯ï½+üÉØáOÆî _ß{WØ÷À§s¿®È]ð™ðÛ_»;ܱÿ®pÇþ»Âoíîð©?øLî×PDñµõ$£JRCêÓ8ú릠’ÕQ_ÌMI;¦¼ñƹ?€íúýÒ=áx¹^½ïžðÒý÷…׿t_øÅŽÁð‹ƒáõ/Ý^ºÿ¾ðê}7þßË!®üþýŸ ßþww„—¿uKX>öѰúç·†ŸŸ¹aõÏo ËÇ>^þÖ-á[w„ßü\æ×÷;_ú\¸íß2üÚ_Ü>ôO„~÷áƒ{ç ßýDøðw>~í/n·ýûO†Ï~1ûë(ª7Þx£Q¥Ýy*IýÕQPI먯¬cJ¯•Ùr)¼ö…Røå®¡ðþžBø×PÓû#„_î ¯}¡Ž•³»¾c‡î¯|û–ðÞ_ÞÞäã!pêcá³_ìþúzÍ~ðƒÄ¢J/ýU7¨äqÔW§sSªcJ<¨4Š)«««¹?€õüY¹~¹k(ñ òÞCáÛ ìRùö¿»#¼÷—ÉíN‰¼÷—·…oMt?¯ä¶gøHåîăÊG*Ÿ ·ý‘]*ÀÖ³ººÚRT©>ú+UÒš§’ÖÑ_5ƒJ»S²ž›Ò,¦9¨¼zß=áý=$TÞùrxå¾îw¨¼ü­[Âû|<ñ òþ…‡•oÝÒõõýÚ_Ü~óÒç*¿qéóás·çþ|d-ZWï$ªä9O%©]*I¢_p+A%‰¹)Æ”¢•}¥{ÂK÷ß—xL‰¼ôÅrøjÇ~íÛõéðâ±&S"/Î~4üë/ºãëûÔðg‡¿ó‰ÄcJäCßùDøÔ®ßÉý9ÈR|m=¨Òê<•V‚J­¨Òí€ú¦A%‹Ý)ÝÌM©SâA¥QLyíµ×rkùƽ÷„׿”^PyýK÷…¯ßÛyPùúÞ»ÂêŸßšZPYýó[ÿýê]_ßoíîðÁï¦T>øÝO„;¿vwîÏ @–^{íµ–¢J­y*¢JG%±KeSPiuwJ?Ä”¢•ÿð»÷„_ìL-¨übÇ`ø“ßí<¨üÉØáçgÒ *??skøã?¼³ãë»cÿ]áƒ{gzAåoï wìï<øô¢h]½_£J³Y*yíNitÔW»Cè;)¯¾újî`-‚Š P4¯¾új×Q¥Ý!õÝý•ä.•"ïNIbnJ½˜Rä ’ú‘_÷;òË‘_퉕FQ%íy*yíR©TšíN‰_@½ Ò(¦ÄƒJG}Õ‹)ñ RSŠTþMéžðÒËÅJÿÀ§Ã‹³ÅJ×|&|(Å¡ôþÎ'§v}&÷ç KѺz­¨­ÇwUšýU½K¥^T©Tj ¨ou—Ê@‘v§´rÔW§sSjÅ”W^y%÷°îƒyß=áý‘)ï|9¼r_ç1%òò·n ï_øxâ1åý +ߺ¥ëëûµ¿¸=üæ¥Ï'S~ãÒçÃænÏýùÈÚ+¯¼Ò4ªt:O¥Ý£¿òØ¥R3¨´³;%«£¾º™›R/¦9¨/—Â/w %TÞ{`{øV¹ûëûöÄ὿º-ñ òÞ_ÞfÝÑõõÝöGŸ ©Üüî”ÊÝá¶?údîÏ@Ö¢uõ¤¢J+óTÒ<ú«Ý]*YîNIꨯn†ÐÇcJ‘ƒÊï•î ¯}¡”xPYýB)lïⸯõëü\xõÛ·$T^=~Kؾís]_ßg¿ø¹ðSK<¨üÚ½=|vðó¹?Y‹¯­WG•n†Ô'qôW»T6•øí‡_ê3]Ç”_ò3áCßúxêï7@QEëê­D•zCê³:ú+]*EÜ’ÄQ_æ¦Doz/•R©.áÞð«.¢Ê¯¾²#\ú½©]ߥÿøÑð«¿¾½«˜òôôGS»¾»£«¨òëO~&|øX÷s]zY|m=y*­ý•×.•ºA¥(»S:9ê«Õ˜²²²’ûتgï+…w;8þëg;ïOegJµ+ÿéÖðîÿ×þñ_ï~÷¶Tv¦Tûà·?ÞÑñ_þ›»ìL(•ÂÊÊJWQ¥Û£¿òÞ¥ÒrPIs};G}u27%>('S®]»–ûØŽcåRxí ¥ðÞCáý‘/×(ï|9¼÷ÀPXýB)üi‚3SšùÓoüVxõø-὿¼=¼áãu#Êû>þþ/o ¯¿%ü—o$73¥™Û¿ùÉðS ®Ü~ãÒçëF”߸ôùð‘ÊÝá×þëíác‡ÿ¯Ì® È®]»vSTédH}£¨ÒéÑ_I ¨o+¨d½;%©£¾:™›Å”^ *¥R)üËÒ=áÛåRxå¾{ÂK_,‡×ï¿/übÇ`øÅŽÁðúý÷…—¾X¯ÜwOøV¹¶—îÉþú?f'î+ߺ%¼8ûѰúç·†ŸŸ¹aõÏo /Î~4¬|ë–0;qGؾís™_ßg¿ø¹pÛ}2|`îöð¡ï|"|ð»ŸüÛ;oøî'‡¾ó‰ð¹ÛÃmG>>;øù̯ ¨¢uõZQ%Éy*Iý•ä.•¶ƒJV»SõÕÍÜ”•••ž*q_-³ã~ IDATݾ~ï=áO~÷†¯ß{Oøj¥îõ}ùÓáß~õ®ðÇxgøã?¼3üÛ¯Þ¾úåOç~]‘OíúL¸ókw‡;ößîØW¸ókw‡»øÜ¯  ˆâA¥QTédžJ·Gu³K¥­ ’ä0ú´v§tsÔWõÜ”èMÿþ÷¿Ÿû½àûßÿ~Í]*¢J§Gå±K¥ÙpúMA¥Õã¾òÞÒ쨯FsS¢˜"¨@k¢uõFG5Š*ÍŽþÊz—J»Ç~ iwJ§ƒèÛ›½é‚ ´&¾¶ÞÍ<•nÔç¹Ke ïÝ)¢o稯xL‰•—^z)÷zÁK/½´)¨4‹*­ýÕÉ€ú¬w©4 *YïNéf};sS¢˜"¨@k¢uõF»TZ‰*ݨÏk—Ê@­˜ÒjPI{wJZG}Eoú‹/¾˜û½àÅ_l)ª$}ôW»TZ *ñ¨R3¨T÷U”Ý)Ýõ?ÛMP€öÔ *­F•vþÊk—J£c¿ê•Nv§T•,w§´{Ô׋/¾(¨@‹¢uõ4ŽþJc—J­ ÒÉ.•›‚J’Ãè³ØÝôvw§TÇ”åååÜ@èËËËmE•zA¥YTIc—JÃék•$†Ñ'±;¥ÓAôbŠ í«T:*í¨Or—J§Ãé; *iìN‰nN«»SªcJ'»ShM´®ÞÉ.•vþŠ7ƒ4w©´TÒFŸäî”üà‰íN©Ž)ßûÞ÷r |ï{ßë*ª4 *­ý•å.•ZÇ~m *îN©T²ÚÒÉQ_‚ ´®QPIòè¯$w©Dý"‰]*£¯·;¥VPéfwJt3ÓØò /äþ@/xá…RÛ¥Òê€úVw©Ô;ö«Ù.•FÃéë•nûjuwJ«A%˜"¨@k¢uõ4þjT:Ý¥’ı_i£^L³ã¾òØ"¨@kÒ*ìR‰7ˆ´‡Ó$yÜW+Ãè‹´;åùçŸÏý€^ðüóÏ÷Ä.•n‡Ó×;ö«fPIj}»S¢›ÙJPi7¦*Кh]½Ý¨ÒJPi7ª´»K¥Óáô5ƒJšÇ}ÅcJ§A%Ý)‚ ´¦Ó ’Æ.•¨7t:œ¾“c¿’>î«ÕaôÌNI:¦<÷Üs¹?€Ð ž{î¹T¢J’³T’N_ëØ¯MA%­Ý)Ý÷•Äî”Z1EP€ÖDëêÕQ%Ï]*ñ‘Ö.•›‚J·Ç}µ;Œ¾:¦´T’Ü"¨@kê•nv©´TÚÝ¥Òl8}»Ç~Õ *y÷Õíî”VbÊÒÒRî ô‚¥¥¥–£J»TÒ>ök ‹ã¾â1¥› ’Äî”xLT 5Ѻz<ªd½K¥:¨´ºK%‰c¿ò>î+ÏÝ)‚ ´¦VP)ú.•$ýªTº9î+ºØ´‚J’»S®^½šû½àêÕ«‰ïRI+¨4Ú¥Òé±_Y÷U¤Ý)W¯^T EѺz¯îRéöد®‚JÇ}µ»;¥ÞQ_‚ ´.TêE•vv©ôÚ±_›‚JÇ}EÝiPÉjwʳÏ>›û½àÙgŸÍt—J§A¥•]*ûÕVP)Êq_IíN¹råJî ô‚+W®$ºK¥ˆÇ~5 *E>î+ÍÝ)‚ ´æÊ•+©ïR)ò±_MƒJšÇ}u3Œ>‰Ý)‚ ´&ZWOb—J7Ãé³:ö«aPivÜW;A%É㾚íN‰‚J»»ShM´®Þî.•fÃ飨’õ±_Q÷hõد"÷Õî0úz»S¢ ÒlwÊ3Ï<“û½à™gžii—J½c¿¢¨’Õpú¤ýê*¨TÇ”V‚JZÃè;Ù"¨@kâA%É]*Ý §o%¨´zìWËA¥Ñq_íÎOÉb}»ShM´®žÅ.•,ýj4G%UZ *ñ˜’VPév}'»Ss ,..v´K%‰áôi•z»TZ *í÷ÕIPIj}·»ShMTºÝ¥’ÔpúN‚J7Ç~Õ *½xÜW»»ShM´®Þî.•^?ö릠Ò츯´ƒJÃè«w§DA%¾;EP€ÖăJUªƒJUÒNŸfPi娝–‚J’óSò8î«zwJT._¾œû½àòåË5ýŠ¢J¯ûÕé•næ§DQ+¨$}ÜWÃè«w§*К(¨4Û¥’äpúNýªTZ=ö«Þ•šA%Ëù)I÷ÕîîAZ­«w»K¥¨Ç~5›£’yP鿏¯$‡Ñ *кxPÉb8}³c¿2*YÌOÉò¸¯V†ÑGoú¥K—r \ºt©î.•V‡Ó§yìWÚsTZ*i÷•¬ŽûªÞ"¨@kªƒJ½]*iûÕî•nv©4 *¤ï$¨4:îëå—_Nü¸¯ZÃè/]º$¨@‹¢uõn†Ó·zìW£9*QTÉ"¨Ä£Ê¦ ’Öü”<Žûj4Œ^P€ÖŃJ½áôyû•Å•ºA%«ù)y÷½éO?ýtî ô‚§Ÿ~ºî.•¢û•æ•–‚JôE•vç§´sÜWT’>îKP€Ö4 *ÝûU+¨4;ö«9*Í‚J«sTŠ4?¥ú¸¯zóS’8îëé§Ÿ/^Ìý€^pñâÅõ¨’Ʊ_ÕA%Ú¥R”9*™•$ç§$yÜ— ­‰•4ý*Ê•†A%éôIÎOéö¸¯êaô/^T EѺz³áôIû•Ç•Fƒék•NÒ§1?¥ú¸¯ZA¥Óã¾hM´®žÄ±_ÕA¥Þ±_IÌQIj0}Ó RS¢ ’öü”,ŽûZXXÈý€^°°°Û±_IÏQ‰7VÓ·T:HŸÅü”NŽûê» R ó«WÃêê™p`°×ýdp_˜]¸VWÂüä®PÎûz cQPéöد4樤=˜þg?ûYÈk }RóSº9îKPZU=VV¯†ÕÕ«auñÁ0\€k€,ŃJÇ~%1G%ÍÁôI¤Os~J|wJ­ Òîq_ýTÊahïáPY½VWÏ…é±=adx{Ìýº ?”G ‹QP™ß† pM¥h]½›c¿âAå…^H}ŽJ’ƒé *Ý ¤¯>î«VPig~J|wJuP‰ïNé‹ RÞÆgNm,ônr9,ž?¦ÇQÝ)‡á±Cajr± €-(TªýŠ•êc¿Ú£RTÍQIc0}ËA%Sš•nÒg=?¥ú¸¯§žz*÷°+ƒûÂÌB½r³•³cv«Ð±§žzª­c¿²œ£ÒÎ`úfA¥Þ±_ ƒJZóSê•$ç§Äw§T•¨¢õvP)‡Ñ ëÁdqîPÙ¿>Ce|çö0¼w4™9*KçÂÌH¹× @¯Š‚Jõ±_ñ R}ìWsTê ¦O{ŽJ.A¥•ôYÌOéé RÞN¯¬í@© ;K%CéHM½ ’ö•¢ ¦O%¨d9?¥›ã¾z:¨ \@5,Íì¾1%· ²-8¿v-³{B¹T å£aòÄ©°¸;¶Ï SêÍr)‡Ñ¹hÇÍ…0=ÜüÏ-<–ÖîÁòܾú3bw‡ñéca~¡V¢cЖ/„ÊÙépdt{ƒÙ2å06}ý¯«4´/™=–.o§¶t.ÌŸ8ÆvÖÚ´-ŒŽþÝsa*É×Õá{•Úõt|Ÿ×ì|0,¬^ ««‡#C_sbæx¨Äî÷òÒ¹0?w4L4Ùu5´÷`˜ž;uÓ{µºz9,/>æOO‡©ñ=ag¹Áõ Ž…óõŽÐëà}Ù¿éz–—ggë=;I>‡)ܶœh]=‹c¿’˜£Rè ’Ä@ú´ç§Äw§ôtP[‹'WÃÊéÑ•ÕóûÃðޣ뱧–¥¹±0Tãë”G¦×î—fw7Y°.‡‘ÙÊÚ׬„Ù½µ‘G†ÊJýk¹q\Úþ: Ç Ù«•ƒaxäÁp¾á×:fF·m~]£ÇÂrôgMíjr/Ëad&z] áD×Õ4®§»û¼f=¨TÂÌH9”‡…³Ëõ¾Þåpz¬Þ½ÙÆfϵ4[¨q  g뼦ö‚ʶ0:}f#2ÕT §'êÇÆ$žÃÄï[N<¨4:ö+Í9* ¦O4¨Ä§ÕwTÒHŸÄü”FÇ}=ù䓹?€Û&6P§÷n+FPY¹Wn,¾Ÿ?q4™ØŒ “3'Ãbl¡vaºV0Ù¦¢×´|,Œ6Z|/ï '¢Åö¥‡ÂH·¼÷¡µú Öó±ë92=Î/Å#ÏhÜôçIJW/„…µEìåóÇÂôäÁ0~`˜˜|(œ^ˆ-B/Ïl¾îøµ. Ãîeyw˜®kiºæëêZÂ×Óý}^³T.‡ÓãûÉõ?÷ápvn&ÌÎN‡¹Ó'ÃùÅËauõTÝg|hüÔF¼X:NLãcáÀýaâȃafîTXXn#X•·…¡¡adì¡õg¸õ R#Ó±x±r.œž=&Æ÷‡ññCaj6þ}q9ÌÙQók$ò¦uØ2ž|òÉŽŽýêfŽJ’ƒé; *QT¨·;¥YPi6?åõ×_Y ¤oe~J­ã¾z;¨”ÂàØÆNƒÕÕËaáìɵ9•õÀ³y!¶<|(̯ÿfý™01´ùk yxýõœ=Pÿ·ì›î²(ï 3Ñ‚üÊÉ01\ca¸¼;LU¢ë©µx_ȾáüTTÞ&Ïo¼gǪ¯»öÆvÓÌ48ªª¼7¶Kg¦Ù.N%x=‰Üç5ëAåjX]YÛµqdwÍS¬÷llãëqïxƒïƒrÙU?îÔ2th}çU«A¥<²aVgÂXg¾44æÖ£ÓÃarçækMæ9LùþÐ÷¢ R}ìW·sT’Lß(¨Ä£J³ Rk—JÝ RÔôñ㾪ƒJ»óSz=¨”Jå0Qýµ“{S½?ô½zA¥Õc¿âA¥úد^LŸxP©7?¥^PÉr }õq_½TÖ í GfOÕ +•ÃHê»UâAe!Ì68&hçáEóóûk“øpúÚ±¤48N7Œ.ÛÂõèúGC•J¥P*ïÛøZË3aoùæk‰/dŸo JC7æÆœ­yœÙôb“£¼âGq¥¾ØÄõ$uŸ£g#TšùVW9ŒÞˆsj¡Õ¡vƒJü9máhµõ>›^{’ÏaŠ÷€¾­«g5G¥z0};A%Áô™•nÒÇûª*ÎOé› ‰ ª¿ÉÒñ0^+L$&TGíŒ)ï sËòãÃé§7ïRÆíö¨Vˆ* •¤ï}/ *iÍQiw0}­ ²ººÚ0¨\¿~½£ òÎ;ïl•·ß~»å Ro~JTze ýV*Cã-ˆ®ÅƒJAòëר|†Ê ñáôgÖv·oì¨hôÿSoøg4“ÂBöM;l¢Eùm±AáÍŽLKX7דØ}^“ZPÙP 3çÖ£A<Ö5¿WE˜¡’FPIèþÐ÷Ò*I¦¯T¢]*­•xTHr };A¥ô‚J§éŸx≞*åáƒáȪAÒÕAep_˜Yß ’æB}<¨\§Ç„›ØÜŽÕóûmN_™Ø~Ó‚vã߸߯נ›ž†ÒXÈŽ]ÛÊñÇl•÷­¯µr¶Î1f©éæz’ºÏѳ‘~P)•J¡TÞ¦«^s+ÿ¿vƒJì>®. à ÿÝÝaf©Þ5eTºº?ô½h]=éÁô‚J+sT: *íîRI4¨TÏO‰‚JQÒ÷tP‰ŽòZ¹ΟžÓ“ÃøÄѵéJ8;wò¦Ù‹3).PßT®†å¹ú‹ð;'ϵ1W"6œþüÁ0²~<Õ¹¦ó`†ÆO­ÿ9K'öu)ÒYÈfæN…Êbe}øõú.‘Ê©07s(ŒíLknÊÍײTÖ~Ó~!T掆#ãcáÀýáÈÌñ…åÕ«aaºÅóØpúÈù‰Ö†¶—G\_¿± }*ÌÍ S“‡ÃäÔƒazf&œž?·v½•03’âBvÕ×]ß¹°t<œ^ŠbÆžwe¤w=Ýßç5I•Áh&L%TÎ΄™©CaüÀX Ɔəã¡{ž*MwIů/TN·º§†'Ïl|®œ §g‡‰ñ±õë‰_T¦j½îŸÃ4ï}/Tº™£R/¨T¦•vÓW•(ªäTjÍOé&¨Äç§T•4Ò÷vP©¡ÆPúlÄ‚ÊòL{è¦Eâj‹sí옉›t5¬®žZPßšòÈápv©þµÄwÕLo:F,½£–Ê{7ŽxjåH¨´u{=ÝÝç5‰•æN4xã³~ZU9Tçë•ÃÈ‘“ëó€j[ó“õ^sA¥ËûÀ–”TPi4G%Tj ¦ï&¨DQ¥PA¥Ù@úV‚JÒékÍOT’ *+'ÃX¹ÊC£aòÄ©°°|y}Áxñü±0}`WÛ åñÅþކ¶—·‡Ñ‰‡ÂéóçÂr|·ËJ%,œ?NL £5wò¤8»¢¼'Ì.Ç®%’¸žŽïóš„f¨ íݦf‡ó •›¯cõjXY:æçކ‰½Mv9%TÖžã£aòÄÉPYº»ž‡ÃÙ‡ÃMÇ|¥÷&rØ’¢ RïØ¯´Ó7 *õÓ&¨ÔšŸ•êù)õ‚J|~JZA¥Ù@úJ¥’û˜¨"•ÕSa,á0°1Går˜ÍoÀVV©TºLßmP¹víZKA%Ú¥R+¨\¿~=› Ro };A¥Ñ@úê Òl~J½ ÒÊ@ú¾ *¥a|êh˜™>†3ÝífPÙ&Ö¾öòLØk@6@.*•J[ƒék•VÓǃJ+ƒéÛ *Ñ.•¶ƒÊÛo¿Ý4¨ÔHß,¨Äç§´T¢óÑZ *ÝÌOé¿ ’—ô‚Jyïôúì‰Åéö  ÕA%ÁôQP©5˜¾QP‰¢J»A%Š*‚JU:ŸRTªÒ *[IJA¥¼'L/l|Ýv†Ñ¬^ *QTiTZÙ¥’iPi4¾:¨4›ŸR/¨ÔH*ñô‚JR’ *ƒ{÷‡‰ñ±p`l,Œ9N/l Ë®LÙ§xP‰ûU+¨ÄýªTÍQ©Tê ¦ï™ ?î+TâóSZ *y ¤T’’DP)‡‘ÙÊz@‰[>}0ìÌý5lmѺzÞƒé•(ªT•(ª*‚JÎ’Ù¡2G¥VPi4˜¾“ E•\ƒJõü”ê R=>Ë R=þÒ¥K›Ò *ÐVƒÊÅ‹7•ø`ú¬ƒJUê•(ªtTê ¤ï$¨Db¢ Ro }+AåÊ•+•è¸/AZ*ñ9*í•+W®´Tj ¦‚JU’*QT©Tâ1% *õÒgT¢ù)•踯xP©7^P€ÖDëêÓGëóñ9*•hŽJA%Š*ñvòöÛoßTÍO©TâóSâA%>>é ÷*­ ¤T s­•fƒé£õýø`ú¤ƒJUªƒJUZ *Õ»T Tžþùõ ²´´´)¨T¤T =I•ê9*ÑúT¢¨"¨¼üòMé³ *Ñ€œxPyôÑGs <ú裛‚J|ŽJ–AåÚµkýT^y啺A套^Ê<¨ÄÒ *iØFÆ 'Î>––/‡ÕÕ«auõrXZ8æ¦ÇÂð`×PÞæ–¯®ýÙmXš#å ïUyw˜<»°öçŸ “;Ûüÿî 3'CeéòúkX^<æ¦÷‡á,_°%ăJ¥RÉ<¨DQ¥VP‰¢Já‚J| }<¨ÄÒ·T–——» *—.]ÚTžzê)A%Cƒ{‡Ó‹M¢ÅòÉ09RN÷Zz ¨”wîs7Ý«ö‚JyäÁp~¥Ñk9&Ú 4 4 *ñÁôQP‰¦ï$¨DQ¥“ ²ººZ3¨DQ¥ÐA%šŸÒIP¹zõꦠ²¸¸¸)¨\¼x±nP‰ŽûT’WÞûPXŒ-è¯,ž 'f G&†#SÓál<, c©îTÙL=fg§[p2,E×U9†2¸WCcÓ¡²)‚´TÇÂéX0Z>,LO“S…¹ÊÂÆ×\|(ìµSHHuP‰ÏQ©*/^ÜTâƒé£ LßnP‰æ¨ô\P‰Žûê6¨¼ð ëAå¹çžK%¨Dƒs••w…#ó—ÃêÊ™0s`W(oúç;ÂÄÙ£©&wäÍ¥R=–׎%;{`[ÊÞ¶°wêLXYKÇÃÔôÃm•rØ;[Y¿•é=U÷z[9·qŸ§vår_€þ•Zƒé“*QT‰:AA%:ö+ó ŸŸÒ,¨ÄÒ'T®\¹ÒVPyòÉ'•¬”w„vž ?¸±‹åüþLvƒ4¶=ŒÏoìšMy7ÇðÔFèX]˜†ÊaèH›Aep4œŽŽúZ{x=„ìœ<×VP)¯ï¨i¼ËgxêÂÚ×­„Ù´gÖ[B»A%>˜¾¨A%Ú¥RØ òýï=¨¼øâ‹ëA%šŸÒmPYXXTŠ(T‡¹^Oüè¬öÂw£<´# Æþw»Ae#”,„{뇒òÞ™ðr¤Ç«½­Õ R=˜¾Ó ÍQ‰:BT¢¨ÒsA%èÒ(¨¼üòˉ•h~J<¨\¾|¹£ òè£ *Y:´>Œ}åô¾ôw„4?:k>¿ãÇ6I+A¥ÆÖçÐ<&†ÝëƒÅ¹×@_ˆÖÕ; *QT‰•hŽJ·A%Š*‚JUR *Õé³*KKK]•'žxBP)€y!Y €or-gÖ¯åôX~×Ò^PÙ&*khådã™/åÑp6š×R)¼ ×Õ *ñÁô•(ªäT¢¨ÒsAåùçŸoTžy晎‚J¥RTò2¸/œˆ¥/Ϥ>¾±]azqch{ÍÁîi/¨ì S‹÷°á°ùòžpb¹(Ç«ý :¨T*•Ž‚JUê•(ªô}Pyíµ× Tžzê)A¥0¶…±•Ý)ãÛs½ž›æ‹LíÊõZÚ *å6BPyw˜ÖâÑ0œû3ôºV‚J|0}žA%Š*™•øü”~ *<òHîàV°óÈ©°²0–Oå|üÔ¶p`}É™ÆsH2 ¨½â‘Géû E•DƒÊo¼ÑvP¹víZ*AåÒ¥KMƒJ4?EPÉÖàètXŒfy,>öæ|M;ņµ†Áœï#¿€^Q+¨ÄÓ× *QTI:¨\»v­í E•Ž‚J£ã¾Ò */½ôÒzPY^^N$¨\¼x±iPyì±Ç•Œ”G‡óQLY9&šƒ´•ÃÈL0‰½åÜïQªCéW¢¡ô ¥º*Õƒék•‹/&T¢¨u…,‚J­¨’jPyå•W *W¯^ÝT•"Ûy0œŽvH¬>¦Gò¥Á}an¹XÇ`µTÊaôôåõ{Ú𸲡ƒ±8ûB¹¯èmI•(ªÄƒJUº *QTT:*O>ù¤ ’‡ÁÑp"šß±z!ÌŽmËÿšJ¥04~jíš®†Ê‘¹_O©ÔnP)…“çZÚaSÞ;–×^ëÂd1^+ÐÛš•(ª*M‚Êêêjà ¤o5¨<÷Üs›‚Ê•+W•¢Ü¦¢˜R sãÛó¿¦R)”J;ÂäÂÆqYòžå²¦Ý Òj(ÙøºÅ8Ú è}I•+W®l *QTi5¨Dƒéë•ÕÕÕþ */¼ðBÇA%H/¨ä¨¼+™Ž¤ºÎNìH਩matæá°²ö5+3û:$_™Kk!by®›#°’¹žH»Aå¦aó‹GÃp­9*åÝaf}xý±Æ³VZÔIP‰ÓwT^xá…Þ*?üá Tš•G}TPIÜö0~zaýH­óS»“™Û±óPXˆÛ¯Í9Òöpûmal}öÈ…0ÓÍ<—D®gCÛA¥T ÃÓÖÿüʦû¼-ì>·þÏgz€-/ *QTiT¢¨RÔ EAEPÉX9ŒÌl,ò¯®<NŸ˜ 'š˜=²«éb|gItŒØl»Adè`8ýÿ+‡ÃÎ.^k"×ÓIP) î ³K×°4?¦Ž “GÉùÊÆµ- c9Ú è}‚JA%HŸuP¹|ùrÓ òÄO*©ÛœG†Í6ß=±óP¨t¹#d#Z\ óÝÎtIàzj_[A¥T åáCáìrƒ{»|*L›$§QP‰¢J£ E•¬ƒJ4˜~Ë•gŸ}¶« R©T•Ô¤TJÛÂÞéSk»B*a~zO{3Kâ3G–…Ñ®wlty=U: *¥R)”w‡‰™ã¡²tyýž®,=NÏ #v¦ «T*•JWAåÙgŸÝÚAåÕW_­T¾ÿýï× *ßûÞ÷(¨<‚Ê÷¾÷½šA%Š*µ‚JUú*¨¼øâ‹m•gžy&‘ òÈ#*Тh]=‰ E•v‚JU T®_¿žyPYZZê(¨<õÔS‚ $¨Õ E•vƒJU² *ׯ_THŽ ’rPyùå—Û *Ï?ÿ¼ “eP‰¢J«A%Š*¹•h~JƒÊ¥K—š•Ç\P€.Ô *?þxÓ E•"•hŽŠ  *=ö˜ ¨*QTTZ*¯¿þza‚ÊÅ‹Û*.\Èý€^páÂ…¶ƒÊÅ‹ T¢¨"¨*AEPšTú4¨<ùä“‚ $¤• EA¥IPyíµ×2 *‹‹‹‚ d(© E•´ƒJU2 *o¾ù¦ ô}P‰¢JÏ•«W¯ *³4ƒJU•—_×®]«T–——3 *>ú¨ mŠ•(ªdT¢¨RT®]»ÖßA套^T ‡%¨DQEPé ¨<ýôÓ‚J©†§/„ÕÕ«auõj¨ÙžûõÀÖ¶-8uí{òT+ç}=PƒûÂìÂÕ°ººæ'w…rÞ×´¥Ó òôÓO *Y•+W®*M ŽŸY*gÇʹ_lm‚ T++kÿ½ººø`.À5­K#¨\¹rEPé&¨<÷Üs•………-T6þ‚Z ³#ù•¡½ûÃÔ‰“áüâÂÆ_–WÂRåT815†³¼Çb×ÐÀòLØ›åb÷àž01s2T–.¯_Ãòâ™07½? aѽ¼;LÎ/ܸ¶•3ajï¶ü¯©ãײ#ŒO Sväðçoñ RÞæ–×^ÿüþ0TõÏË#…¥èù?±§Éo(—ÃÞÙµgrµfrú|ëkMÞ¯-ÏýÙš¼ï©(<Wûã¾î}0œ_YûYvöP1þ;RÖnP‰¢J»A%Š*[&¨¼òÊ+‚JÖ†®ýõ\˜Ü™íŸ]Þ9fÎ/´/Ne¶@?xàLóëÉ8¨”G6þâ]ÓÒñ0‘ñ{w“òî0yþòzL™îí…ëhÑ~åô¾ŽÙÚAehüÔzPÝü *ÅÒìýÚêÜŸ­Éûž–r;¦&÷‡‘ Ñ&-åáÃëÿm·rþpÙb?ïØzz!¨DQ%³ òÖ[o5 *o¼ñ† ’«r™šÓGFÃÈPì/øCCemñö@ì/¨å¡Ýalâh˜ÚS¹žáÈùx 8ÎÎ=¦&…‰‰ƒarj:œ]Œýó•“a|(ýû´óȹµ?ór8b:ÌÎÖ635–ÍoGŽ…ÓË÷aùü±0=u8LN=æ*±µøP¶;fbïãÄÙh×̹0ÓË;S¢g`òÆ3 ¨dmG˜¬D‘𡚋K‚J‘4¿¶6÷gkò¾ÓºÁ½……µŸi+g†¸&HK¿•(ªÔ *QTTú"¨ì S±@±²p*ÌM F†ùÕ«auùx GfŽ…ùÅ˱…ú£éS½ó`8]9fÆwÕ‰6ÛùÊúµ,NïJù•ÃÈLe}1û@î¿Y{g7^eºzy[9·þϦҾ?5î×ÔÃëjþHGd%m[_ ‚J¶â±¤2YûYTŠ£•÷k+s¶&ï;íÚyäLì¿ãvçðß A¥ƒÊO<ÑŸA¥¼/œntlT=+'ó]Ô]ßAs5¬V¦¼+¤Fç.ç3#¥–ÁÑ÷lñhíßt-ï3KÑoÃNgzÍåá7~³r>í÷&û{žPÉù{/ã×=:ÅSuw£ *EÑÚûµu¹?[“÷NìóÑÏýsaÚÏ*úT³ EA%å ò /¤T*•J•Ò¶02:Œ G&‡©é‡Âì‰ã¡,ËgÂ܉é03ý`˜œ<&ÆÇÂØèüjQy4œ®oápÊÇ!l ¢¿Ô.<˜ÞΜ•G…åè·ü¦ëðÔ…õEãÙÌþ"¾#L¬/ü?Üñü¡½ÃôÜ©°°Ûµz9,/>æOO‡©ñ=ag+QapwŸ>æ*aeýy¾*g§Ã‘Ñí Þ·‡±#GÃìéS¡²ØÂ<ŸÕ«auõLOm÷R,¨¬£å³†¦æÎ„Åõ£ßÂâùcaêÀ®:¯«[Ô»¦‡[xÖâ¡b.‡4´ÿÆN¹&~ZA%ÿçpÍÎ(R>Ž m|͉™ã¡»¶å¥sa~îh˜hòýžØëêèýJò9,‡±ùᅥ»Ë£ë×¶:?ZumI}džçäl|n,ÍÞø¾(ï “'Nãs£ãï‹÷kyníû}h_82{ò¦gzeé\˜?q8Œí¬õý°-ŒÞ8–r*ÍÏÖÞ÷¯§ß>ÇÂù:?‡W:ø¾Ù¿éz–—ggë=;I>‡MÄ~Aeõü!GЗê•J¥’ZPyá…A%Yå½­ ¤ßXŸ*Ú@ñá£×8?–rÜÙŽ,D¡ÝŸoH*ÅCÉB8±·þûRÞ;³^2:v«¼wú¦žöïÕö06{®æBIµf Zƒ£Goƒ5,Îí¯½pv-Ë(¨, Lo,²Ô°4W{–OydãýYšmv„H9Œ¬-W ³ žµ´Dskš…äƒJAžÃÈú‚æë- g—ë}½ËáôX½{•ÜëêîýJê9ì­ ÒêýINìsãüþ0¼÷èÆÎΜ?7ºû¾ˆ½_•ƒaxäÁõ!Þµ 3£›çxÅ9a±éјñ£?ÿì­Öò÷E ×Ó—Ÿ?ƒ£ál×Ô^PÙF§ÏlD¦š*áôDýؘÄsØìÇÖƒf{Ïô AEPé}ƒûÂìR´p2&æ×~Ë.·áæ5”w…Éõ]—Ãüøö”ÿ¼Ýaf±“¿¬§¡ÆÖ‡½?&;-›cªâ¿aÛÙ‚áÐø©Å¥3áÄôá01>Ø&Ž<fæN……åæ åØ@×ÕÕJ˜?q4™Øc'ÖôL8¿´±È±47Z3ü nCCk†mÜ˳caçP쟭ۖâ=Žùµ°¶è¶ÎÏ “k¯kræäM!taºÖÂç®0ÅÁåca´Ñ÷tyO8-šå1D9~l]¥ñ.´¤ƒJ‘žÃR©[мNï'Öó{8œ› ³³ÓaîôÉp~ñrh4ç)©×Õíû•ÜsØCA¥­û“”øÎ¶ aqeís#öæñ¹Ñý÷EüýºÖ±—Ï Ó“Ãøýabò¡pzaãë¬.Ïl¾îøµ6› WÞ½þßF«KÓ­¶ó¾'|=}ÿùSÞ††v„‘±_jý¿ÑÊad:wVÎ…Ó³‡ÃÄøþ0>~(LÍÆ¿/êÍ‚Kè9l"þómålƒ÷ z” ’APYYYI<¨\¾|¹ã òÈ#ôQP‰ÿ&ܹ0¹óæK'òü‹\9 í£GÃÙÅ¿œ®ÌgpBy_˜‹9–/„Ūc*–N…¹éýa$“aõÛÃD%Z8Ùda+¶Ë¢²?ýY&U³]Ú?mûúà÷Õ•ã 5ËahdWýg±¼gckåd˜¨µ»ª¼;LE÷±•Å›¡ýÇ©jñ rãûszo߸>æ×CöLÍà6täáõg÷ìú¿-ÛÞoK'o0öç7‹¦É•>‡;cǾ¬Ü¸îÓGj»X¬÷ž&ôºx¿J‰=‡½TÚ½?ɨõ¹±ùËôs#‘ï‹øûuÃùZC»«~ùâìXõu—ÃÞØnš†»Gâÿ-4Óú€ðöÞ÷¯çÿgïþ]SyÛ<ŽÿiSÄ"B‚La ›)"Ä"B6¦9Å4SDB  ˜Âð0°kÙ'²¬°¸°,,ûg|¶HfæÖèŒ?F£É»x5ÏÉÑÛ{&~Ÿs溮ßôý“1xX2P±òF%öÀ•=ïᔌ­V:ÍkašÔ}à 寲wòÿ5€Ýñ?TY'PñC•$•ñxL B /S~Ÿìúð'ªOÆ·K»:J)•:•3˜þǪdxÍKåvñÔ|Ú8@‹ô¬†½íý9UÝß“‘]5d>íºõ93Ó-ÆF¸CíyNTóŸäÜ`VMºü\“¨,ó@*ö©Ï= T¢Bƒ°½Ì‚;i;l—Ò»Z´Y*¶Â~þëÎÂYß±ÊþAUÜñ©¤•=¼ÍÍÉ»¼Ú:W2Ÿk¾Õ®W*±ûðP•5ö'û÷½‘ÌïÅÌAvDå‡ðÌkWf~w,J,š«Í‘I­yÝ“ZϯúþY9P92*}£ÛYZEãÿ×4g_;¹û0šy½iû€Ÿ‡@å*½^ïÛoÀm­&“¾ZFŸgó‚“Á.[ÿÌTÆý{9 ènG¦x£fç^­Æ­êµkU*WªToä4îåMõUcåÙ«\'cOâÚŽ˜-AÖªYM6x‚ù]݈'˜³¦Z†µJëÌ}9R)8àXÜzäc.Šš¸pj¯•7µ‹*Ùcˆí¼Ê$sÈô‚°Ä¬6ZxxºEÆg,ñ4x²ÊÞ‡ææÚòI|®d®—¿žÍïà TÖÚŸ$L· l}û÷FR¿ÓÙ½¨Ê£õå¤3ïz-ñßÔ©‡VÖºîI¬ç—}ÿ¬¨¬RMkV‡|ùìIÞ‡ÑÒå§èÀ8`½^@…@å€Y'²ë÷ê{·3ÿˆ?U­÷¢Žcï¦"$`)[,ªT²U*Ù*W>Œ ï÷èIònƒ•ùŽUj¼ÿØÝjx±·Šù¥§Æš—§ÚpLÞ5칪Ù+´ÿ°ÎÕڳݫj_¨X\À¾V;ÃbQ÷*P‰©±ÎÃu‹zëC¦Î×§Ó¥°Zmwí‰Â{)¶ü¬êÕ1IÏPÙ»ûÐ<ÐìÚk·^Üøs%t½ÂõlzB ²þþlÎüÞxV5jæÖ.¾7û½˜ž]Y1’¶c¯W®îÿ÷{~µ‚ùPÉò‡Ùë_÷×ó«¾R«*¹ÛpæJìÏ͹u¯ªçfþ,Áû0rï ŽQ)³N0°¿TŒ@åÿ÷ T°%G*ÔŸ‚ƒ›^mBchïšÙ—~Ÿ½lùeÉî,yà#[räÃC—Ïú¢¶{¥b6f_ÍC‹•<ÏØ«@%æÀ×¼G&²çÞ#Æý:tfî#ãéæñCÌ{mAÚ˜YÔ½\ê°-é@%µo÷¡q ¹éaÚFŸ+¡ëÚô><€@e£ýÙ”ù½S©°‹ïÄ~/ÌëóݽÌõ2*I¾þ~™mÌVF6¹î›®ç7}ÿ¤R+*Vñ>øÿó‚Áif06[å•ð}%g†Zkü}`ý¶@ÅUTT¾Á±ÊÁSƒÑÿݳ½·µ§úWJï\xÛnÛ4}°ù$ô2¬S•œ{õg^&oê·®UXt0˜¾TïÇ* ;}F¯úˆŸ ‡LÏeÂ=·cfËlA&èýӢȰ@%µO÷¡q ¹zÿý?WB×kêïot®„D>!žÔë$¿?›Ù³ïÄ~/’ÀNTõÿ»:ÛÖiÍö‡›]÷ ×ó‹¾R©ÔêŠý¼ç2G9ç5X_ga ²ÙKæ50[ò­_%ì#ìPºö”^ofG²VýGúz,Ûoч>£g÷öC€ä*T¦)_ºQ³ëM¼ŒîUž÷ÙÓvxÔ¿N®*g¯•$*TRSC¦Çð€&Sñ¯¾cø­q¨»Ê¼¦[¸„Ox/;`ú›ïä4×ý\I]¯ÄîÃU‚ãy£@%êu¶°?^ß½úÞHì÷"ùƒlsýf’¶Ãj†È _÷Öók¾>íE…Ê–*Tðƒ¨¨`‡v`,/m?ëñ*Û›;VÂDx[w¾ïëJf†J+gËíõƒ=6óf›³¸3«Ø«@eó*©Ïk™~ú<À:ŸŒNrÿ–½ÆF¥‰W]ážÍ^O ÔŽ~z÷Xec/Wiñ-÷áÖ4Wü\I]¯ÄîÃ4³Q’I½Î6ög{ö½‘ØïŲ§*lüïø#cz\Ë´„¯û&ëù%ß?á^íà •í*V!œ_4j1C? v([5Zlm1ÀX–Ù¢½ÅÖ.Ë%á`ÛÝT˜-϶V1dÊñŸ¢ßÏiyv¤rpÀ‘`¥ÌÜí]2FßÔ¶#®çTkËÈ5æi¯rÜÁærŸ+¡ë•Ø}hVÆEWì¥íp`úÜ@%‘×ÙÎþ¬oß¾7’ú½ØÆA¶±6ÿÞ·.‚öZãβ퓺ç7|ÿV TŒ}œ n•‹üÙ3¹ÃEkÚ] bVdïÃD@’TT&“ÉV•þóŸ*?‚Ùï}ÙŠˆ#ÝçÏð7yîEr}¨Ít/ý$ëšë1Ÿ>Ü*7ïÐÁ:“ ¯9`NˆU¸ ‚žíº˜-Ïæ`„½ëß5l&t§æ&|Gÿró`ô]£ÖâÃ43ØŠ?x1†L÷®”Ú̼Ì<‰»™Ë`GËŠM9VÅ88îD´æÉ”ÍñèƒãÅv|îê@s‰ÏØèz%uZÊ7µã1©?PIæu¶µ?ï½ú/öï{#™ß‹íd§KþwÃÇ=`ýÿ¦½©m/ù@‚×}“õüøïŸ©=_1P™ª²òÔˆªô-†°| ´«@Ŭ~û†YLÀvm+Pùç?ÿ¹Õ@e2™¨¨ì‰ô…êõKå#ûgËn„‡?“Áír--̶@ŸO"/Óî'[ú£jñdñ?€­•[aðQsÉC”5דJ™Õ0ïòê³G*8áþ Üm€˜×ÎVǸ&‘O}ÎÝÇSÙ¥³èîŒm´¥YÐ›Þ “&}ujg‘Oòæl;~îÔSª«õwOÄôÁèdòªFñëš•½VwðDÎØù™~RÓ/Áù3K t_åäÖnn NÆOª¾îOºðG½`Jîã}˜ÄfRŸ+¡ë5kÝûpªb¤w=7`Δ°wÑfR¯³­ýYï¿{ø½‘ÈïÅ–²ï£æ…Š~ȶÂC ‰^÷MÖóÿ¦ÿÞªJjz&ÉÀ•=ïžÏØjʼ¨þåzî*P1*wVh= lÊø‡ñÐ{PÓý£jåJåò¥Ê•kÕ÷êÿÀý8´p—lge¶)Y¥²%/†Ïê4ÿª^»V¥r¥JõFNã^ÞÈxÍ¡+{é>ëë­'•J)•¾PÃØ‡a×Q½z¥JívzÀëènéõlÎ|z{ÙaßægòÛjyò:®ÜúµÊ%[¶]T©|¥š{/o~f/â)j+ÿ'¸>LÕjܪ^»Q­þGŽëªÝ}ù<õäÆî»9˜ö]“Á½œêÇÚìÒ¥*ÕÕë—[ !fF?ɼ֭ªe[¥Ò¥ªîýÔkßYòàË2íëíº…žuÞÏë†9Ö©êÞôçtïÔpo帎ZÝ×ðÀ|ò®qçjþáÞ>Þ‡Ih&ø¹¹^I݇ÖEX±7y׸'§z©RÉV¹òGÎç÷÷ø5˜›0÷@3©×ÙÒþ¬÷ß ó{£ÿyŸ}ÿ÷Ææ¿Û:È6*†÷jý0cÉ™‰_÷ÍÖóc¿¾¬ïzjÆÙrÕ8–rµ§ð¿ ãµÝUÊv°ó÷âëƒ+Û¼g3_&ݸaÀá!P!PÁ¦2WÁ¬ŠX£'9sž¶]ÈøG÷òOø¦”­¿,µž±ç¨´JåšëñY¹kuFQûó¨ZOF¯ lI²B¥Ž/}¹ôµï7íØVMVþFá2¯·dø“¾Ûxuçq,Å8í^ªX{œ f Zñû2ÛŸ¼k2yÜyNÚ¾Zu6™¿“)Êõâ¯ù¨{³øéç}¼=ÐÜüs%v½ºÓ…¿3Õ³žT/œªâß 4{mìÏZÿ½0¾7F®l;úóíò{c³ß‹íd›3Ê>D·„2mãºo²žÍ÷Ù¿÷öèûÇœõ³,ïzÁëYÊWf‚ÊY}uk‹>ó.ó÷¬¯Ö²­ç€B B ‚X™sUê®Ú½ gƒÑ«¼îœÊ…²+^©à<~þãÙS×9_þIFûZnëQÞ ?ý”ûèU^ÇQ­tºÆSƒë®Ç>SŽ—7 ûú‡Ïj»WÊK[ˆÕ‚íÕ¢T*¥Láò£ ©ïi4óôóxø¢nëV• ÕֱЕ¿j÷^¦_oì©ß{PÓ¹R1»BèdªäÜ©70ß4ì?©Ó¸ÚI…Š÷ùx:)·ý¤Á(<øôîä”NW>ð2í–¾œ”c•CßÍC©#*·ju_4Ï|wtÕìøýÙ»û0¡É|®¤¯W2÷¡•-ªÞ|Td|Ž^ÔmÞ¨˜I)•²Tð&#47míÏ:ÿ½0•ñƒl+%+STmêó}ã÷ÆÚ¿[<ȶÎÕ˜ª:]¶õÔ–®ûÚëIbŸ?íÓ÷O¢Êç}œ-ªÖ|øòÿ£:Í•"JÙA ’A™’á IDAT½ ƒÔþŸÕ[©€@å3L!P~/«ð7hO1î¬;ô»ÎC`à-¾÷aÒÌ–_²® ãzÛt¬rÐFuµÊ$àüÖ@ÅUTöà&¾Ÿ¥‚û´uv=+:QÍoe6rUØZÛ2 ÷aò¶¨p½€mÊT‚Šè»äਨH¥”²NUíúOV>ˉžŒïbÂa×gõ¶?@¸·a{ × Ø+´úw¯•#°ÀF B À—>—ãÏS?¨Ù‹ßÂ:—Ó\w=ŒH¥R܇[³¥@…ël•»VÇŸ1ãݪð-óð€Ý!P!P`²ÎTó+UƪQ©ò­Ò…KUʶJ¶­rõVíàPô]^§Ì±܇»’L ÂõvÃÊߨû¦Œº7ÊS™€_€@…@ö”¥|à BM£ö•²ß¾>ü܇»“D Âõl ì­\íQñq ÚT³z®ô¬ ¿÷á®$S¡Âõl Ê Tþõ_ÿ•@€„­¨ø¡ ¿ ˆA B b¨¨€**  ˆA B b¨¨€**Øwé 5úïšLúêÖNe±žÃcÕ¼k2yפg+ýÝë°2ì9«x¯±?ø£ë9<*ÀÁ#P!PÁž³ò5ð㻗ʰžÃ³ã@%S¸T½ù Þ †_“¾†Þ£šu[¹ôn?ÿ¾­gŠu¦Z§ÿ¹¦Õ²ë½N:©zcö3¾klÄ8œ¾j4zR£z©Jý>h4<È¿kÔý«jùJõ¶?ë೪eÑk[GÊdN”·ÿÎ+*“Wõ?ÂQïNNíJåÒ¥*µ¿j›Ã´G®Šq-€Ö^oz^Ædò®QÿQ­Æ­êõ?ª;Žš' ÆïšŒî¬ÇRÞ1Z6_ÔnܨR¾T¹|­zã!<œŸ¼©;÷Ð8Éý™YÏäU=•¹m?<òÂûaA…J6h;å©×v>ÖR¶U®\Ëi=á“É»¼uíSÕzÆþ”×{¤ìÉzÂ@b¹@Å*Þ^× þÒÇÊåN•Íí0d±dûÕ2“gU2?k´W·¿?84**؈y8ÿ¦¶}üïæè©j”´T|,5„;s‚®¨|èÕϾþ½™ÃìŽU…±Éz>¤K÷FUɳ{Ñá¹¥LvþZ¬|æL®ìy‡Ç[­aø>_ÈÜŸÌ•ÑíIµÜ×€,m;Fȳ8PIY§*•η³Ã¶N«µÆ²”Μ©X¹Ug`Tu¯¿©Ý×¾­gõ@%¬hy•“³”.ܨ՟­NóÔk^«°õv`Ǫx~ÀøŒšíÕ¼Ëp`ü@åÿø‡þñgï~ ò/ÿò/A Òï÷Õï÷ƒ0ÅTƒƒApæÿoÿöoA˜â*ÿþïÿ*ÿñÿ±T˜â*ÿùŸÿ*~vñ_ÿõ_SÊÿ÷ÊÿüÏÿÊl˜â*ÿ÷ÿG B ’ópþQ¶qxjÃa:89Q­¿ÂSâ›*ÞâÃwsö°1'THd=)¥R§ª}5— o¦Oâ{jDµ6*†­FÍÙ5&·?áÁú»õEáØ‘ì¶qؾöPúð¾™LdGVʘ‡û¦7yÍKåv:”|ßÖ3mµ@ÅR¡Õ»jy&0›5¼SyÉA÷ëîmÝßÛ‘=lÞ:[ÏíÃü€C B ‚˜-¿¦g¢Xù¿A›§îT€p¤²_ù°Ì̈ •^T%£ФSÜ^ ’½Q‰#RºvÜ*õ³Ö™\¿JåKû°¤öç8¼Ž“Õ#ÍÓ¶Q³v b©3O*GV>Ì0Æý{9¥E³e¶ißÖ3mµ@åH%ãþMÞ5=©Q¹P.m)•²”ÉUo3qÖ½ç—a{;tæÏe ~öLá’¿Cø‚@…@1çgŸø†m÷Õšª¦8R©·ÂáúFÊ«œ\ÄÏõ'Ýí*iû1¬äX¦ÍÙ<ÆðòøÊs®Ä«ê¹™?KbÌÃéñ}t«%3PÚ P +#âKÙbQ¥’­RÉV¹r#§q¯^2=©QÞe±oë™¶Z b´Øú¬@)Í[r¬RÛ¿^ÑÃâ7B °3**؈q8ï]MÏ$€ÙöT» Tb†T[Å*fk¬©!Þ+XÜBmþä]/8Ìn­©?KdÌyq‡ÓéËpÖJÄ5·²ª8®:Þ«†cãÐþ‹¸@e‘#êOÁ>öjQ!Ʊ캣F#F½¸Á,ŽUÖ³=«*Õ Pés“æÈý BÀ¥[ê­Œ–_»B B ‚,¨ä¿+PyR)êà}GJx`ý¦Nq½'õ-û!úµ“ø÷t½gBûcþYÿOôá´ù³s¯ù‘ õÇpè|àM£‘§áðCÐ6lí@%¥TêXå zç1"PŠš{bظÒaÙõlÏú*Ós“¾°ÎÕòŒÞåš•I+¬g™¡ô~P7û}€X**ØÊaW¨l¨,_¡bG*™òC–ŒŸÕ¨^(÷e]«ÌP‰–.=-q=v¨,»žíYu(½Ýñ¯UL«7s–w½¥Ã¼/b*®Œ™@ñmó0‹@…@!PYj†Jɘ¡Rß§*›*çá<ŠÑ]t«%cϾ^óSÕûïÁZÝü¢ ã Ã@eÕjŸmûîõ¬¨ä]ÿçŸUlg´ØÚZ…ŠXFÏj± nPµ×àШ¨`#*Ký# YûI}ëBm¿]Q\U„Y𥊠©ý9VÅ¿Ž1ñVá.lç5{ÍÍ÷ˆü\'ªöÃuo¨d«aÅW9^ûu’òÝëY-P™®–ê–#Ö›¹ fçŒZç[«Y6( ?gtð€ùTT°•¥þŽpL<5Ö:̵Tlõ—z «0ÛÅ™=NnÌVfýú¢ƒlK…†ü\d 5(<{V¹l¨œ¨Ö7®ÅŠ˜]Yg=G*ºÏŸ¡Æ›<÷b£êU•Tº†{ý?Ê-¨NÊTVme¶æç2+a·ó×cÉ †×ßE·*À\**ØʲOÝg*aÛ¯ÉèQµÂâf+sªì¼uçþ¨Ts¸²çµ[ÊØjáÍ‹ê¹Ùú÷'{T Lƪ~y¯”¬ü#™¨˜aÓ“ªóôÓrûÆkÌ TÒª×/•ê~,»†@“Á­òÛ:Xßæz²×á}à·ÞZ&Y`å@eªí×»¯Á‡•½ À×'ð¹rN¸¯~6s¯©à„ûWú"œé3y×°ë¨^½R¥v«fרÝ-îà l$á@%{3ó„ú¾Ì$I²#‰õ˜ïw¢róe‰×Y¨||¾|õákP1¥¯nmÑSøINÇ*·¼Èµtªªz!šu.Ç‹ÿ<é‚à>/P çuÄ=É).Ó‚jÛ\ê}O…Šÿ‹jô£>Û›zõóåCÇ ?—•»VgµÏªÍ©¢ÀrTT°•••Oéü¥êÍGyÃ銕ñðU^Ç•S¹P6¦õ“•-ªÖ|˜zñðYæJ‘‡ÆÛ¨à±”+ݪÕ{ ‡Ï=yí¿*ç”JY*4û‹•TJ)ëD¥úzƒ~¸'cO^ÇQÕo–¶?×3†Š•9W¥îªÝ{Ñpö`}ô*¯{·ÔÞ&e{ë9RÁñ«SŽÿò{Ñv¯”§2`#**  ˆA B b¨¨€**  ˆA B b¨¨€**  ˆA B b¨¨€**  ˆA B b¨¨€**  ˆA B  #åËÔìÕtÿ¨Z¹Rµî¨c-£;Ù»ªTI_Èíï=~Q§y«ZåR¥RQ¥Ò¥ªµkw±ž´­ö(\˨w'§~£Zý¯Z^?\ã௠TªK#P!P‡uªj÷M“ñ“ÜÒ©¬/~¢J'lqÕ¯ì`]Ç*µ÷lØÊ~[Pa©Ðð‚µxÎù̩辄k­Ÿ~Ó:€ÃC B ëDÙ¨JÜŸ°Š¥w©Ì–×c\ ?ßoØ,*ý{“.ªí·úÜ*?/رÎäýÖ_U*À’TT°±#•zŸêŠ+[T­ù¨AÐz©¯AïNõyU©”R)KŖߎéUγ6¬üßà Ôº0^wßÖ³cÖ…ZF¨Ûöµ÷+bÆ*íªÅØ¢kP¼Óh‰êœ\ÝŸõ⩱ëY3À"P!PÁÆÂcÒ»T®p+/b`ú°eÏ­š°òNXéÐ8‹ $,åƒÖNžk׳cf Ò¿Qv›ï•¶Õ݇éS”ôÕŒ¸VÁ ƒ—ê.Ú¢‡@…@3Œñ«ãí^óVÕÊ¥Jå+Õ܇©aê}g^@qªº?Ø|t§bT+&ë\M¿Údøw¦µÓ¾­gÇ2×A€4no7ä°Šw¾W·tþYúX¹Ü©²™£†,–ì`~̳*™¨=ºÚÙ? 6f“wM&/ræTX¹kuýʉÉÓÜïLõùóÏßÔ1èg_Ëhí4ø2X|ßÖ³[Ë®9 Ùš?àýUNÎRºp£VÿÍØûŠ^óZ…­·;VÅóƒ´‡˜¬¨Ž¿>oûsf€Ÿ€@…@›0FÍó…Oü‡ð f\¤muü£wµà ÛR±õ„%µì¾¯g‡Òjú×Gnt¨°1K…`Î̳ªegªêç‹áÊ[Ý›SÕág6oVm»-ðC¨¨`cf€ÑW«1?${£¾ÀÞ›W`ƒ_N¤‹jG†û¶žÝ]»éÏqyS§|¼õ÷+uàjò®ÉèIÊ…riK©”¥L¾¨zû5 U¼-†Ö©?P:Ñm׬35üàip«Ü·]3àp¨¨`cf€ñ¬jÔì ë\­Qô¡·9 ~à|mŸ•.=„s;æ†û¶žÝÈVƒuŒÚö‚£ÅÖgJiî^«ÔîWÔ°ø¨[E B ‚™Æ£J‘³2Œ¶L“Ùs½aðCg¦u“Q1~Xð^û¶߱캣F#F½¸r’.í¶w0¯äãóTƒ@¥¯¶1¯%÷'Xß°q¶¥!ð´ü¶‰@…@›0懾Õúñ?VŸiÙ•¹Tïó`~Ü.*}ëñQV¬˜°ò7Á&ãUv6ÃŬPy”☕@½Ë˜}J`=Ë ¥÷Û´yßÙ¦ 8**ؘ`<%P’š?îØÁ|¦ò´Dë¨}[Oø^‰*Ù+µý bò,'¿¥vZsY²;~€q`œÉõ[ly×[ 0,ÛoÁ^T¢Z½e®äAØÅ–*f€Ÿ…@…@3ŒƒÛ}KÌ,ù`ƒR9“ÒT‹©È¿»oëÙ’tQM?¤˜¼ªÕrk+,åÝ× Àˆ›UÓÜz…JJÙÚËR—Up5ú Túµ“ïp˜TT°13ÀxSÛŽ¨’ÈÞ¨? Ö£*Ìað^åX©ÌuPU0o8üþ®g Òçr‚VežZåãݾ¿¿'Å{?÷ µ†ÌUЖlÔ:ßZEȲAI®þºTð D B ‚™Æ»F­Å³D ‚e*Œað½+åƒöZ/ªçi= ³NUí¾Q§r’@@q¤¢ûü޼És/–«"IÕög‘ôÿ(·hM°Wïê––©¤Ys=f%Ìàvþz¬3¹Áðú»èVe**ØØt€1™¼ªQüzhne¯Õõß'OÑ3.>…ÃàŸÔôßûVö Ö“¤c•Ûýà³õêgÉT{d¯ÃJ¿…×RÃíͶ_ï4¾Vö*?¾^¿ñzRÊ9áz¼/ûs¤‚†h7¡ý~lÌ 0úŸ-—úòZ·ª–m•J—ªº÷Sä}gɃlc|"TâÚ[íÛz’2^LÆÏj7]5c4ª§±ŸÍlgæ·k,;àÞ:+>&ï{wrªW*—¯Tkp–mϵoë€ÃG B ‚m)À°ÎåôÃ×]~øû¾­ 6–L€‘.\ªR¶U²m•«·jáÅ»¼ú*Õ û¶8|**ØX†¥|à  Ó¨}¥ìA¯ 6–LEH®ö¨áØ.újVÏ•>øõÀá#P!P1TT@ ƒ@…@Ä P!P1TT@ ƒ@…@Ä P!P1TT@ ƒ@…@Ä P!P1TT@ ƒ@…@Ä P!P1TT@ ƒ@…@Ä P!P1TT@ ƒ@…@Ä P!P1TT@ ƒ@…@Ä P!P1TT@ ƒ@…@Ä P!P1TT@ ƒ@…@Ä P!P1TT@ ƒ@…@Ä P!P1TT@ ƒ@…@Ä P!P1TT@ ƒ@…@Ä P!P1TT~«¨îä]“É“Jé=XÏÁ³dwß5aOñ“¥/Ôè¿k2é«[;•õÝëÀÞ"P!Pù9TF ‚ŸÏ*Þk<ù¼Ï”Ûƒ5`?¨¨ü–2…y“wM&/rìsåsÇJûºö„u¢rýVõÒÉ @?Ÿ•ÿ«¨t/•Ùƒ5`?¨¨6ëTe÷1<ýâMƒÞœòïnåcåÿj8y׸}±Â>¨à7°”³¯U¯]*Ï=€**‡+}!·¿(H™6îØ¿ºZ%[{ùØX ʲTlöƒÀdкV1ÌP)g•+Uuïå _äæ­=Xów9R¹÷N  P!P9LÖ…ÚãÏÃ~ïZÙTŠ¡ô‹¤‹Á^¨ÀzTTSæêsý»†îÙGHðmÊ‘JŸ ÃÆ¹¬TJV¶¨ZóQƒ‘Hô5èÝ©^Z4ËÅR±åWܼÊÉÅ¿¯?e2yרe%Dz«·j´å Â*žhO*Ù33PyüØÓÌ…ªõ‡oa;µá‹ºÍÙÙ媀ÒùK9­Ç©× ŸÕiĽF¸žQëcŸ“XÏÏp$»íïÁ‹êÝ?3Òg*;wêö=ýûeô*¯ã¨Z<Žè²ÔŸ¼k2yV5¾fŽ—7u¼¨ÛºU%¦š,S¸úrÿL&o žÕm;ª—Ï•µ"Ö“¶Õ[Ô0j¸Ÿ~=•Ô¶?ÓwÛŽ T&½Kå ·AØ3ϰe+3çu¬¼pg1»–ò ïó5=5 Æa«UTg©e…@e|¯Rñzã¨×x‘[<ŠÜ§¢óÊÏå©]Y:ëñ®”ËoºžŸÅ*Þiä·À«ŸÆü¼¥¼ëß?}5 óëÓÅ[y‘{ü®Aë2:ÀOnÞ’•»Vg´èõÞÔ¶Dz/KÝÏÑQQŸiµ@…ûàÚ—¡: IDAT·!P!P9P'ªõÃF§p´ÊøUƒñÇ!u¯y«jåR¥ò•jîƒÆáhß™˜œªî¦ÑŠQ‡ÔÖ¹šþ¡ôð¯ò3?›N+“ù”»žqÇV6cüYàhÎzÌ ïós½kÔ»“S»R¹t©Jí¯Ú}ãÐwä.X·¥¼c†_ÔnܨR¾T¹|­zÃÜŸ7u«'s_#\Ï«ú­ç2ï‰Á­r‘?{¦ÆÐ¿œ/÷O*•’Uøû„|\ÿ®q?WW½a¸ÏÃVQéEï*oj—/Õ Þ÷Y–«FÃQ«ý ÞàMA%Ôœ×É”Ãðbø¤¦s£JÙV©t©JõÜÖ£ú£è€hzŽ”Éœ(oÿ î½åîg€ßˆ@…@å`¥íð‰üÉäMýÎÃg…Ç7*AÀóõ@×Ê]«<þ¤JæëkeªÏÁçé”?¾R5Bæ2 TÖž¡ò¡WŸY§ªõÂëб¿®Ûʇ‡Ö“+{ÎgOelµ‚CúgÕ²Û[ÏÏd©`T-¹­³¬‚Q åÎÛÃs¹þµ?¨’›óZ֙ꞿÏ!F¨¼k2þ¬Ú¨žÍ `¬ô¢ku¬rZÞGü~[ÊäO‡;ódŒÀqÉ@…ûàw"P!P9`–r•»©Êÿp·ë\ª0ïs+¦•Qó|á¡l¶>ÕÞ¯Íyj=m‡íˆzWs[ƒ}Ì[ çe|=¨‘T âÝ(»àgÍ€çk»²#Ù½3íɾ¼Ž¼Î¨9»Ö¤Öós™sQæ%ŸûXhFÏëI—ƒ}î–¿ŸÌŒ; ªTÌ@eò.¯׎l£"­ÿ'ºúfU+*ÜÏ¿ ÊáËœ«Úxœ¬xÍ+å·^­b*}µŠ톲7áárïrN`b§_–¤‹jdž.æþ$¨ô"ÖS™«pnL§8ýæz—hETF|i{–Ðz~´S9¿-ÖüV^S­Áæ†G*û¼¸×Çk]„×väª0ïýÌ@%®•]Ô½ØCŒVi^ ­5­¨p?üZ**?‡1¨~Êð^å¸*Ž˜Ê³ªQ•1Ö¹Z£èos8ýÀùú4ºôÌ’ˆª$¨Ì¯d˜»÷Ý™ßÜm8£"öý-ãéÿWÕs[XÏ—«¿FVO˜Õs«¤¬s5ü{tt¯ª}¡bqûZí`Àü‚V{f ÒµWkÇe®Ûl³5y×°çªf¯ØÞkžUîg€_‹@…@åç0†ÒW EÕ;^pø:ñ®¶ÓÙœ¨Ä<ÑŸ:Uݯ ˜<Èžû´¾1œ~èÌ<õoTŒ–›“H òɬ'yDzëŽõbL5QB¯cTA}m?g¶‹{VunÔ‚`2Ö‚kb*Qíð–‘-9òÆ3ï;zQÛ½R1»Ä ú¹¿«*?ÿ~À"**?‡¨| Ǫt=ž¤é@e~Hâ3fADül8œ~æ6s©^Ž,˜Y1+‘@eAõÁ—½Ÿ¨ØÁá÷ÜŠˆ9ǯ°xSgáôúëIžÑf+J\{¨Ä^çDUXül›©eÚÅ¥Ã{,é@%‘ùÖ©Jνú³ÁÊäMýÖµ «¶ø[5Pùñ÷3!P!Pù9¾*)¥íÇà0³5Ûd#f s0ºT…Jjj8ý¸¶IÊTž‚ ¥1 {Êw*[y¢Ÿ ÷-P™¾OÌ=LÛáµX8³#m‡J?Ê®¤•À‘ò¥5»ÞôþŒîUŽªöøòû±*ût?`•ŸcN ’)¯@¬Ì T ’Ö?Cåƒ9œþéó€ø8¬<ˆü»3¾9PÙÎÌ  #MU2ù{~d vhMg­_å>[dkJÈÊÙr{þïËt¿Wû0C…ûਨ$+w¥jif õl ’¾<ñ7Ûdf ò¦¶Üó-&½ËÈYæpz¯r÷öMmû(òïfÊÁ}:l^¬pÏ̱«@%e©TàĵÞ3¬¨p?üZ**)Tb½ÉkØ‘• ››T&“W5Š_¬­ìµºãðuîïápú'5ý÷ðVœk1õ”üà ó%<ðÍ…‡ê“+{Þ2¶šþ:'/ªçfª9€^‰1€~Ô¼P±ñ9ËcvPý¢{&¨îê«S;‹¬hÉÙöâaðI*Ö©ìÒYôïqÆ6Úéý]¡%ÞªJŠûà—"P!P9PGÊÙ×r[ò^0$:¨ñÕr¯eg·57ez-a Òÿ|"½/¯u«jÙV©t©ª{ÀNÞÕw–¾¨Û¼‘]n.L:)§õ8õ£á³:¸××3j}V:$°ž­³ŠêøûÜ¿Qv«ïw¤’ÍúvØEÝ£F€Ø¯,ü¹\ýõóúyjä÷äº{Ž@…@å -¨¤Nå Âìú°òN g1•$–òA+%O‚ñžæþÒb•ñ½JŘÁ⓹ŨÁëG*:OG®ÃS»rºà³ëñ®”‹t»žÉÝj௩k/h –”UûŸïÕ»Üò{Å ƒ’¾š…Å¿VÁ ƒ—êâà@ˆ@…@å -_¡r®†ßÞhlV¨¤”Jªî†îTŒj}d«éWº ÿ~i¥”N+“ù”»ZN;¶²ãÏGsB ³BÅÓ`l ¯]©\ºT¥öWí¾bŒÜë¶”wÂ=šŒ_ÔnܨR¾T¹|­zã! &oêÎ=T7×óªþFëÙëTµžñ¹ÊÇ[~¿3¹ŸÝ¸µJ{·m°dwüÊ¡gU2?k´E[­-ð{¨¨¤¥•ìõ#Ú?eªÏÁá{§´¸ºÂl¥4ˆä¹\ó°Ú 0>ôês*gfBƒŽýuÝVþo˜ \Ùó×3¶Z~Ø4yV-»½õl—¥tæLÅÊ­:ƒp­ãîõ–Û}¥¦[Ê^50Z¡M&oöÕr.•ßÉ<œcU¼0<Œª*ïrËsf€Ÿ@…@å -¨œ¨Ò ¸ûó‚´­Žßƪ·h€¹1x|ò2'x˜‘T â-žÿa<_Û•• 3íɾ¼NØúiÔœ]kRëÙ³•Û¬7yÍKåvQ)“.ª»T‹·g5ì-WˤNU÷÷däF›7+®¶>gøTTÒâ@ÅR:{ªbùZžQ-0tUœ[%`§_–¤‹jdž.†„•^T»*£eÓ¤Sœ~s½ƒÛèAéÖ™\¿JåKÛ³„Ö³ó•qÿ^NiÑL˜íÈoÔìܫոU½v­JåJ•êœÆ½¼‘¹¾W5¶9cÆ2ödè|iK7ý³ga+¼¸{€R)•=¸ ×a*±Fªæ"ª4ŒáôçkKºô v_j&G"Ê«œ\ÄϦí°2¢;`CÙãßßœ»ñªzn ëÙ KÙbQ¥’­RÉV¹ò`ô‚pèIònƒ•ùŽUj¼†÷â6à `«TTÒrÊ«º«%æWÃé‡ÎL«¤#•üPaü Ò2³0 Tb†Š[Å…†U¼ yÑì{æ]ïó=ûj§«}’XÏn©P >¯¶¡ŠqM<¹ùˆ™?›¾-¿€­!P!P9Hf 2hÞ¨Z½þt¥JÙV1²ÒAz8œ~&TÈ\ª„#E¥—y½D•§èð&*P±‚½é×Nbß7çøoê, TÖ_Ïî«TÝ,ýQµx²øóZ'*·¼àuGÍ%+–Ö\O*eVü˫ŸÍ¼ß‘ N¸?wöÏ,B B r¶¨˜Ãé}½•[F™ƒÞß5Ü˩ڲí¢ìÒ¥*ÕÕë—sBš$ K¹ÚS0œ~2~QÛ½Q¥l«T¾RͽŸ:°ÿzðžôz`´`zjºT­\©\¾T¹r­zã^½¡yí^å.ÙÎÊl÷¶JeK^ ŸÕiþU½v­JåJ•êœÆ½¼‘ñšCWöRÕ)ë¯'•J)•¾PÃØ‡a×Q½z¥JíVÍ®q_Žî–^•=¸ ×±µ@eª]ÖG‹¦å+L é ¹}ó@|Æ—y%ïl€a)_}˜9˜ŸÕW·¶¨Jaß•«`6M¬Ñ“œâÑò¯ Ú•*Tê/K­gì9*­r­¹Ÿ•»Vgµ?ª}©H…@…@å m/P™ì=îÌÎYuª’s§ÞÀ hÞ4ì?©Ó¸Úr…Šñy²EÕšò†oáÿðYæJ‘‡ê{¨¤R²2çªÔ]µ{/ΣWyÝ;9• eWž r¤‚óø>yê:çK^wK9ûZnëQÞ VMÞ5½Êë8ª•N׸‡Ö]!}¦Š{ÿ康Ý+å©LVF B ‚á•7µŠ<Å P!PÙƒ›p¿œ¨æ·ê¹*¬\éø‰TT`° á0ðsºµÖU€ÃB B Ÿu.'$¿æ0zÀD B òk¥ —ª”m•l[åê­Úýp ¸W§:"P!Pù¥,å^ ˜Fí+e¿}}€}B B òkåjŽ ¥ÿ¨fõ\é=X`¿¨¨€**  ˆA B b¨¨€**  ˆA B b¨¨€**  ˆA B b¨¨€**  ˆA B b¨¨€**  ˆA B b¨¨€**  ˆA B b¨¨€**  ˆA B b¨¨þŸ½ûgMÞëã8þÐ:d¨C…")ØÁY2(Ô¡BŠ‹]:dÉP¡"E(R°ƒ²8Ô¡...>—ï5T“£Æ$ê‰Æ^ïáµÜ÷ïJ''Çx>ç@…@D P!PTT@@…@D P!PTT@@…@D P!PTT@@…@D P!PTT@@…@D P!PTT@@…@åï0LéÏ~d6{—r&åÁÿ!÷(ÃÙÌŒW,˹”‹¿ý&–‘‚ºIUýû!P!Pù;Tp ¹{LÓ¤5PIKýû!P!Pù# ÉÄýÈlö)¶u#…ü…dŽ^.ü? Éd/¥Py• J ë‡w.…Ê£´z2ž|ÏÛæ·Œ‡oÒ±-É1øÎJÒh¶e0ÊT ù¦£¶Ts,KæFªN[Üñ·W†Éè]:vIò©{† Êi3®¤â¼ÉhÖB³Ù·Œ/bW®Ä8vYñ_0 ¶Œ TRX?8¤LñAº£Mýòܤ-õ‚qزe®¥Öý )×—4ò‡)‹Qxܸzk6û‘Ùøõ°áˆD B rº2·â #쳎{«Up*i­ŠQ|^ ¹§£7i9R«ÞI­aKO Z&/bj¥ÊêwÆôSz­'©WKR.›R.—¤V¿óåÉXÒøe™ ^ÄnËüTTN”!fËtuîÅ,”¼3T*¹ ÉM©9¯âŽ?Å9ô,hü·TÒZ?8ãJjýo™MßÅ)¬4.¥Úó·¸Ö/P® )w•¿Ù´$w´gÄbÓõÊâÚ7+ut.¦óé—•ç€Ô P!P9MÆ­t[¥¸÷’;;ãPz¤B:•6 ŽË¸”\X?œôW± J’M¸‹gßÀ S(‰Ýy[ªãÉøCzÍMu¼ÞgÓW131r–4:ï[´Ã•²äM©ÚŽôÜ/™¨õ3ù·ïH£|µõÀt§t<§i+Ï·ÒQB…|Ò÷~±"fÚ>zàn˜/2‰±:'ßXœõâJ“U–¤ ÊiÊXóðäG¦]35ÊlP’|ñÉ {‚Œ;Vàllu yܼŽè4¤àmãJ³<Ø–1ŸÄ FÒ†­oü@eæÞI>êåÙ§8æùúçR£Ð )8‹Ï5”ֆϥ…q)Õ®Z7‡ TÎÅ´ßýÐ++Ýê¦2(ípò"å²-ÃÚáâZV'ìànߤw÷»B,¦4*éxNÓVžS•áÃVmhkÊ÷ÅQC¤9?( ï㌢ã/µCl‹¢¨¨œ¨K©{‡ Š]SZ T~ ºÆ•Ôþ}èY«åV`vÅ ÙºÆ(*³í¨Ùö{0n¥£†<ËùƧWæm¶ÛÙ%00 ÏþÀùÈ+h5kIÇ Á>¤ž‹ÓV Åh‡góûZ._o ‘–ž¿-V¤"PIÅsš¶òVÜ2ë«/žå/±ó†dŠÒ~‹Ú·Íf® Z÷RLü»ãBª‹~wÚŽÀLé-Êç&Î ˆF B r ÉW_–fp/¾]’bØÌ_­–F'­›Í³þëþ*„À½ó3–ôƒ§ƒ» h†˜ÿ\’õõ3ÉTÞ¼¿Ó¯\l,»`L{««TVwó ¹:P´íznÃæ Äbk»ó v–òÚÍÈÞ0°¬š½ÍàóöÁ¹2c=|&Ãô·š´Vg¬kl‡±¨«ÄÚbÅ\í–@åøÏiÚÊs@™[i-ÂÁ UmZR»Ëö² IDATôΙùZÅøÎPŒ_¤’hÝ\IcäöÐÃæÕEIo‹b!P!P9}Ù©5߃·u'…Äg/oµÔ1CV3äüm¸A3ŽÕC¦7 zfL醞žKÙ BÞÂWë·þµÖ÷–•AH0£nM3ë™ÛÙ‹AÄM[y- >&zHµz6[Ýð¹²%ï3… v¯]{ÛÀ@½Ÿ1¶DóV­m虜ÃoéîÕã0Äì.èߥó9KG ’’ç4Uå9Ü}°Z®×N{aýŠ®û®ôc“ÙÌ&ïÒ¬ÞJ>cÈÙ™!Ù‚)®rfPHx¼7#F_èý·ÊˆQ}8•¿C9xxyÆñkÂ3ŽÕÑ©…­Œ1nü­¦6 ¦- 8¬žÈ”ÛþyAƒ‘Æ4cò*5ëVLsë^º‹ÿvm«´å3TBWŒ¨uß TÔƒ˜ƒWa¨«\v_5ºbf¸iP?÷è bo³ýØÖ²Z&úœõü…/i,ݵF¬@ˆÑ£©3ÿO-PIÁsšºòF®öæ•cÒµì([lÍW ”ëúBÊÝE{?,~/*œ4•¿C9”¾Z4¥ÑsýA4÷>ÁíRÔш!êv/·IR™Û+«F”ÙÖÓvðßÚ,EZ= Y T"Oöê~s ¢Î²__ñ¡nGô!µ¤·#RWæ *ým–"V{¬Ø600ÌWo€yãöcJ=œE»^]Õ ¶Ã¨s„â´Ã31r·Rµé¹_2ž†µS TR𜦮< b5li6#4Ì­ÃŒ©l·5z>Ày%¿Ÿ§¦œÕ];ãI¡ló´u¡lùÀ)#P!Pù;”@åwÀðBªýM³ùuZ ?KB=wbóëؼ2hž-ÉÀ[ͰzæÉ\Æÿoô*ôq•³K`su»ªƒoGdHÞöÏ¥wÄÊŸ‹qv&FæJ̺r6Ï0øÐúM¶T¬¶WŽ8+sòöb¥Ï·ô6*û¶Ãs)6ÞüCç=ß2™¸2ÿšÎüöqjÊÑŸÓÔ•gAYAfËFáÁï—¦m©ì u…Ê›X¡ý˜²hPЍ' å‰s(ý¢_t¹MX P!Pù;Ö•3ÉX‹ÃÙ·[e°ý+ÔC¦§=ËØËVß½Ó[Òd,àr¸ÏÊÝÊrùÕߌå¯Ò=«Ek{¹”jo¹@%ÏiêÊ“Œ)­±ßžša[n%‚³XÕ}VM+ñ*êv‚áßKFÑ9عR •“däï¤V¾ZðZ T2·þ`y¢õêÀè·t­àF9Gd6(…΀VžÝê…œeï½ÙÊá+Î¥Ò9P*@E-Ûb¶¸ržÉ´µ‘NR‡㎾ñ· Ôó\¢fý«3è×fÛkj‡ê½ -Ï¥Ô†~û8­@%ÏiºÊ“€ÌØ^q¥s¨Õg«u¢¬뇕!{羓Îê9OË3(É7AP’À6TTN’±ØÊkú%ƒ®-výN*Õ§ù £+½N[†Ê!Ú#'©†Ïdy`ôG&Í¡€?39ÎŒce¥ÀàN Þ¶=Ÿ‘çÁd+oÞß·nw )’TÎ$S^l'õ»e•a¾Ì¿ÃŒÖ݆Šöüヌo»³íu· ÔU®4Ãf¬›þ@ìúYšÚ¡z/ÃÂÎ=xõ§¨¤á9M[y43®¤æaõ-½ê¥†>ø\LçcÞ|‹ëÄìÛÔ3š†ÏDò·Fû‘~9N_´cyÔ•0£ g4×þ„€Õ3§ÀѨ¨œ$/P‰ô-nSßêƒ`Ë£³Ù—4ÍõÁ8#w/}/ä‰7ˆï2ý.­Åßpcœ‹¢ÆÍ†Ò«_‡ ôKÞ²¤pFFŠ:¸9iÝŠÙt2h˜ñ¶ƒ‹8Ç`Û¶¹K`ôW Œ±‚Ê“µ”­“>¥‘_ ^4µCuÌì]jA+œ2·â Õ¿uzÊñŸÓ´•G§ ©týó‰ MvîÞNæÏn`û\£nûõ#£æzðaäîü৯á‡×ï]ž3ÉÛ~yܵú9—¢í‡hÉNÛ P!P9Qç’·îÅ鼉;rý´³½Ý7é8÷bå±MŠ:0:œ¯ ŠÛy’ZÅ’r¹$5çuiàmhÇ S™ö'«ñ¶Í1 Ê ‚™Þ¤Ó|’FýAêG±GºýÏyyÝ€³2 TÔãWéŽáJr[ìÖ²íÎlò.Ýæ³Øö“§ÑxZÕ”â–mÈ(.ñ>“!ùú»rü§t©V,)WÒ~Ö`WÛ¡ß·o‡†”ÁÞÙ¸-NÍ˼«\ú-ËtV”ó:â*;ÕÏ_|NÓV]–ËÙôCº-GZšµè¶ †qÞŠ®¸Ü«ç%Í~d꾈]»“JåNêͶwŽÑlö-ýj¼óJö*OæVšcÿߎû¶4jwR­?I«ïúל¼Ä wÀA¨¨ü‡Ò†20:qIJžWf-/mu^‡ºÔÌfoóƒ¦ã1 Òo.‹:;Þ^Û(©@e%ÌX DüŒ€ )wÜuó#ãÞCÀ ž31Š/+Ÿ#Ú´·éàyC µöÊíz@Ò¯oTWÚa¿$fým-hŒÝ±Ýèrd¼p$8PÑ[?í9M[y¨çmÄè7Îr÷Ë!ñ+BÎÎÎä,kJsVŽo4nâo‘¸gyŒü½ô&!噼I}m%8&•¿# Ê´-–q&FÖ”zëM†“ÅC ^Ä.o?#_ v:´Ý¸³ú,ÝÁ§LÔYëSW†ƒ¶´ì;1Wa$¨œ7ÒTÇÏR8䯅XÄ ›Ÿënmˤ$#gJ½Õwüíÿ›ñ‡ôZR\õÛ¡;_)”Äé¾ËÈ«ë-Ú¡q)寋 FÊÀüÔ·gK­8ßš*cyÏÜI*©xNÓVžêYw rv.Eûmâ¹Ò··?<bÖlé¹ÊÊÆÉ— ºÏR-l{†“†òd®¥ê¼®=ï]çN ¬L uTTþŽ4*³7±4þyßÒ1™­¼¿Kÿ°ìɛؕÉeÖëÕ0.$_¼Sf´öPoh–¶ç4må@•?äR*'qì;ÉrµC¢£—R_ èO)ôsýMëu>3}(­͆՞ÿ÷ßÒe`ú„¥í9M[y…@…@{Kn`téoûxÿ]ùÆâÀìx©g¬¶·ýRëàç¼@Ÿ´=§i+¢¨¨`o Œ7býëîPé¿-Wûô3âÌ„Œr¦ío%½Òöœ¦­<ˆB B ‚½éÍKR­XR¶,©Ôž¤ë ŠþˆÛ`–¹6¹q½Ã°?¥Ó(‰U¸’\öB²Ù É寥h•¤î¼Š;åüi{NÓVD!P!PÁÞt ŒRhºÞ@¨jÒ½“ÜÑ?ãß’«¼x["EJ¿q+™”ûHÛsš¶ò ö¦g¦y¾þ&ceEÄdø&­Ú ù 1r·Rs^¥?tç‡Îû¦ã/qû/Ò¬—¤À–IDÚžÓ´•QTT@@…@D P!PTT@@…@D P!PTT@@…@D P!PTT@@…@D P!PTT@@…@D P!PTT@@…@D P!PTT@@…@D P!PTT@@…@D P!PTT@@…@D P!PTT@@…@D P!PTT@@…@D P!PTT@@…@D P!PTT@•¿Ã0¥?û‘Ùì]Ê™”çäbõdFâ/ËÜJsø#³ÙPúõ+1Ž]¤ ÊßA ¢ þ>Ã|•élÞÎG’OA™N**„!Ù⃸³™Í>Ŷn¤¿ÌÑ˕ƥTOÒ(_nñïTð÷…g-•~I²)(Ò‰@…@å´WRqÞüÑ5ß2¼ˆ]ù¿·ò1 Ï2žýÈ´{»E=¨à`HÞº—F½$Ú8B¨¨œ®Ì­8ÃMAʲiÏú¯W«äꟿõ@ ;!P!P9Q†˜­¡˜Œ:÷bJÞ*•܅䋦ԜWqǟ⌔ùXÎ¥2ø!P€=¨¨œ&ãVºÓù`¿{/¹³3¥ß$czuE »!P!P9MÙ»ùô?2v®C‚£*çRž¯7oÄ8;#gJ½õ&£É"Êhð"ò¦³\ 1;‹7_bç£ÿîâ\”ÙìG&5(¹«ö$Í#O¸w©¬Õ™¨¼ýÖiöVjͶ ÇßþvjãOé·ÄÊÅ[”)”Äî¼-]c2þ^3ê~y&ßzÖQž¿á\¬î¢>¥±WûY‘¹–Šý"ý¡+ÓE{™|‰Û³¥f^Dt¹GÎ~d6ûZÖ¿fÕyw© |J¿ó$ÕˆÕdÙâÝZû™Í¾e2ú~×–FåFrFHy2– 6m V´g€ÿ ÊiÊXóðäG¦]35ÊlP’|ñÉ {‚Œ;–d®clo€{ܼŽØ5¤Ðtç×t¥YT[ Sz±B”-•é«”ÍGLîñ)ŽyZO¦ýîÊr¥[Ý:yåqï$_Ø·<‹a¾Èd±^ã*â¿7¤à,ÚÏPZÅàÁúŒù$nhÿȨS 0¼@ŧ`ˆ‘¿—ÞdÓõ¾¥km .Äj~ÆjÏá‘)½ Ÿi»@…ö ð¿!P!P9Q—Rúvñ<ÊôKFÓßAêAëIjÕ’”+wRwÚ2RG‡vP`r%Ågš¼ˆ6HmÜHk1(=~–ÂÊ›É\H6;—¿÷žiÏ’\Vùÿ<çåQW¨¸óÏõ#“Á‹Øõ;©”KR­?Kw¨ úNœ å6¤`+ƒáÓOé6¤Z)I¥r/¦Z?ßÒ¯]^Ã/Ï— ÷*Ϥ¶‰Ñ“äCÿÛkiŽíÇ^k?gggbŸçAÈïýï+í¹f;2ûõ<Ùô·¼@å[º•’´¼¿û!½Ž#ͦ-n[£oñVB\'[yóËñ»´ì©V,)—KR­=ŠÓy“á$< Z®ƒsÉf/¥`={m/~ B{ø¨¨œ¬ŒåÏȟ;eØkÏWx1Pñžõ]#/}oú»T³ë×ÊÖ>¼ÏÓ+ož¾Õj„lÉTv>Cå× WRø÷¡g­—Û(øƒÖ³‘#VÀg?ËZÒñé?¤žK®<“!EeÕ’²u–QTVC9Aux#Îâ^LÛRÍ\˸–†»¨çà T~d6¯Ú¨]0FfÓ½ºŠZ¾†<߆d W›Ã Y%pŒ¨ÐžþO**'Ì|õeiåÇbp·o—¤4È™ˆå@eÒºÙ8(›«û³Ú‡õ€YëËߎhp¸5Øïy+þyëµ+t*îƒä6ü·jÀ³¾]Ù¹X½EyW¶'[»Žã]gÒZ-«®òü]ê¹(Aɼ‹­ðóz2•7¯žû•‹ÍO f¦½ «TÔ@eö#n=j;² ÊŠ´ácøê›mm¨ÐžþW**§/{#µæ[`°â¶î¤øj5PJÇ Ùn(÷à.J‰z8ý†°$cJ72tQëGO 2X?ËÞùçÆôÌå¿¡–7ÆVTÞʈµmÏ4•çO»{´Ø+x+¯¥­ÁÉs){õ¼y ®ßkÝú÷vâH1èï©JÔVvam±ë‡rÐZ;Ú6P¡=ü·TTþå ú%ãW©D­âØ‹¨|H-leŒq#Iø€·z8ýÈ^ŸÍŸ)·½³$ÂVx´*Á+뾿2à›òϨˆüû†2ûÿKùÊóÇå_¡«'ÔÕ«¤Œi.ÚèäUjÖ­˜æÖ½t½æ7lµ§*}k»í¸Ôr«ÛlÍ~dàk˜¯^­þÍ‚³¸o««}ô”G¿ ±¶4›fÄj"M×QVA­o?§n÷!µÀP‚ÉH„m‡G®l‹;]ù»“Oé:wbæbDø|l¨üýö €MTTþ%Pù .¤Úß4;\§å@%8$YP΂ùoýÃéWa³%xáȆ3+Vi T6¬>X«û€@Åj{ƒß+"VäíÅ ‹oém€Þ½<ú)Ûl…‰ÚJÛu.¥¶8,~u›©8ÛÅeü6¦;PÑrþ‡q%eûU†«ÁÊì[†{)n»Åß¶ÊŸoÏØ„@…@åïX TÎ$c½yƒ™Ý°³Mö¢*£±V¨œ-N?íùÛ$e«ï^ÐÒ 9 {ɱ•Dfô§i:mÊr;Që0cù÷bã™ËT†VvéT<çR(?H«ï.×ÏäU*a«=Öž4¬PIS{À&**G@ ’­ì@lM T6$ï•1ú •_êáôïóâ åAè¿]qä@%™3'€µ´’iQççÊÁî![Ó©‡ÖoÓÎ6I,PñyKœÁâyY!£ë* g¨ÐžN ÊI2òwR+¯H½¨dnÅñfüGm²5Pù–®Ü(ç[̥г0ÔÃéÝêÅÒÀoôÌxEààzš|[›©¨ÕƵ8ãù;}]Þ®Šè-œK¥¿RÊ}˜ö¶‹SþmT@Ç•³³393”>km'Ķ íà¿E B r’ŒÅV^Ó/tm±ëwR©>Ín]éuÚKg,Œœr—•™t6VçêŸÞ}þ‚r8ýàN Þ6NŸÛ£2Þßbæ¾¶_uµ+Í•B†éÈÄ Vë‘èmdÊíùÖT¿[MæË¼n¿¥k‡þÛlåÍk§ãÖím&À¡•3CLoNÔÖ{ŠmÚ3À‹@…@å$yJ¤oq›VèJý-*³Ù—4Íõk#w/ý©?€x€÷ ÿpúwi-þ†»å¹K³äÛ[œ/¡qÀ7ïªÏFŽXAeÈZÒZ”sö)üê@5Ð[Q Ÿ´nÅlÎÏòX=¨~S›ñVw ¥W¿]Ñ’·¬Í‡ÁëTŒ+±Ê×áÏqÖR¶Ó{ÞbK¼m•3Ú3ÀŠ@…@åDKÞº§ó&îÈõ‰öV‰¸oÒqîÅÊ%unÊrYü@e8Ÿ‘>·ó$µŠ%årIjΫ?;û‘¡s`Y9œ~aPÝp˜øFêÁØ?2½Š]³Ä²L±Ê%©Ö¤Ñ(„4:| É×ßýû4ý”®ó ÕŠ%åÊÔWêÇmÕÐÛQVRŒ_¥;^„+7±êÃ(d<ùöf¾Ž‡oÒ±-É¢îŒéLÂŒ6ÛR8À£lñ^œî‡Œ¼2~ËØmK³v{œgb­þ®¥Þþ–mú.âyŒ§ï¾ï[?†ù¢Ìº1q¤x‚?†uµ#oI£õ&Ãñ·W'Óñ§ô;OR)„Ýód2…’4šmŒ†K÷q:jK5ÆÌy=õ£¯=ï^ÏÉ\gÝ¥Tû~=*®•t¿j\K½7ïwfŸR¼× µÃÌT¶¸J=OFïÒ±K’ßúoRhº~]Œ^Å©•¤\¶¤\¹“ZãYZŽuÀ~ßò¤àû=Ñû•°#*zúÞ÷}ëEë{‚ÆúÑÔžÿž™Lÿ¬ísí\Ïÿw ’­~øï å}Þ;Nœîï­ß’¾~lßúùë¿w®Ÿ“d‹%i´Veì¾I«qävx¬û•@ýdŠ2˜Îë¤wŸ¾÷eMTTNRT ²dô"Õ¼qÐò…gÏ~dÚ½#ö¿#P‰#S|nèÌ×™MÚR/$|ÏSû¢p!V3âùÚbsv°q-õÁüÅcú.õϧ¾û®§~2å÷x÷ûä^ uµC õ7™„ÖÏ·ô7ü’Ⱦ–Z÷+¤L_ÒÈ ýhkÏûÖ³îëËUß–®uŒ@ÅÈ•¤³TçÇ TŒ‚ÿ#ø³¼Æ õü:»–æxþo§¯bûÝaò¤æû=Éû•xý2PÑÓo¤ñ¾ë ë=AgýèiÏiyÏÔÝ?ëû\ûÕ3Š÷®ðŸ*º¿wv{ÿÑ+}ý˜žúù»¿÷¬ŸŽ“9KœÁ0ƽz‹5Ñ3­ï‡»¶gÝõsvv&FþÁ«£éàá “Š@…@å$©Ê¨õ(õúÃܣ؎#Ý»òà¿t!Wÿ-Š^FñYFÊ}ŽÞ¤åßXœñãJsí‡!ÅÆ«ô2ã„õž´(_Þ”zóUjß1û–ÉøKÜž#vÍ’Böpå ´í÷ûýªžû¥¯Ä±Li-]C•½Ë“H¿±ÿ}߯=ë¼_zßö­íý¦ïÁýêYWÿ¬ïsé©gï?'èJZ~çêþÞÙïýçÀÖ鬟öóG|ûÙuœäJꙘÃG}ã=Êo•Mçên‡º>×Až÷õ³Ù¹XÞ„öðº;%**')þ •i.~ðMW—M+VÔCãÆÿð²É\H6;—÷÷áö,Ée•ÿÏs0¨§¾ º2š¿TL/b×ï¤R.Iµþ,]µ£8ʽr¸âôSºÍ©VJR©ÜK£ÙV‡Ût–…Zž/îUžÊÞ§g?yuIh?ém*Ô„vøBukoõFÎÅòf©ºâ$±Ì3ò¾k¬ãZœyP»ï;†rPÛOR«–¤\¹“šíÈ`ì?_ãÎæ­ªö¿ŽÞö“·/›ŸÒÈÌâT¶è=ćóÒ¡ :óCä+wRwÚK‡\7ìin˜/ÞàZ_ýqž¹|þJrýñ‘Ÿ¯˜ýØþõ¬÷: þV__Þ²nu•ç^ÊžýªÿChÛ-¿öi‡†XÞþàR ;È1â #³ò>QP¶R |ç8ùÁ³¼òlö#“á›tšOÒh_±û±½ëYóuÎÎÖ¶úZ|g¨«B÷ TöíWwTöi‡Ê€Ý´1CYõêÆø©Blùƒ>S~UfòˆmmúqdH6³®÷(O”XÏ…–þPãýÒÕÏgïd0óÛX=à:Ë^d Tt•gq-]ýƾ÷]W{Öö½¬é=AKýèjÏ:ߣtÔ³®þY×çÒUÏúÞNÑq•ùß;êïÜßæÒ¨®ÓX?ìçÓ@wûÙý}~y‚É~²!™ìµ˜Õ'é)aÆ´¿iKª$Û¡ÎÏ¥ë~m[?ÔÕÍÓð-6O ÊIЍ\Jµç±ÎŽËXÒó~ðmøR‹Ó!é TÜÍÛ¨ÏúveçJr¾²=ÙÚuü¥ˆ“ÖjYu•ç€2·ÒZtÒG_-£Ì2ˆšñ¦I¦òæÝ¯‘s|Œk±Õ-ZÜûÄuÉ뤹¡\¸ïÚêG=Œ7Ô‡47è,—'l–‡:Ë7h6G×ÑÒ~²–´¼—¯oq;OÒh½ûátç.dmy@aÒÚÜnüÀ$h/[CŠÞòâ©UVW_¤²¡?Øóµm?¶W=ë¾Î¥Ô÷må F=Êþýê>ÊîíðJ#ÿž†N©®ˆ³måΆºµÀPZº‰’ TvèçwïõÝ/]ý³Ú¾6OìQWƒþ*ºÊãÑÕÿìyßuµgmõ£é=AOý$Óž÷ùÔSϺúg]ŸKW=ëû\§èhÊÑç&øž0—Ú@åÀý˜¶ú9T?ŸzÛϾïó†dó×RÈoqÎhÐß^ó-n«òÞ’t;Üçséº_ûÔOôç+¶þÖ¶_**'is bH&w%fåQ:®ò£rìˆøÂ¥N¿¡³Qg×o ]š•AØ2:e áÚ’ómV¨)ñÚöšÊs0çbµ\¯³ïé< lKûfî³ÕÅ6Ô-îfßâ6ïÅÌÿngdd.¥Xy’Þø÷ Ìÿ‘ü •\ÍÿqÔ×¾jh‹û®±~²æƒ´z¯¿[‰Ôï¥Z½“jíAìæ«¸ÿ¹™Í¾¤¸ç²raÔa½êk/oº®“PûÉ–¤»Tó‚n)âÅRPˆ8Ô6÷ r0ÓSéÇ&³™MÞ¥Y½•|Ƴ3C²S]å\‚M?ªò|íØí\Ïz¯“«-f›ù[}-èTtô«»*{´Cc‹ŽÆµßÎâ¬èÛ5ÀPË2´µD•¸Ï…¦þPÛýÒÕ?_HÅk‡ŸÒi·KY¥±¨hü¾XºçšúŸï»®ö¬·~öOÐT?:û-߃ß´¼'hú\:û ]Ÿë+P9úïÜ$ßæÒ¨¡ÓX?É÷ó顳ýeœÄL‡¯b—7-|¸v¨‹î@%VýÄ©¼{×ü TTN’¨Dš´¥´”|Nä :`0SnûûïÇÜÒ¨|‰ùo•C×^•åèÑ_ÝòKùÊs°6ñæÝ§I÷Ø4žK¹oûÝŒÈC]iUîý­C¶>Pl[êLWššÏOÙö¾¦~.¤ÜTè7 JxËÄ_¥fÝŠin`Ý+ƒU+?u]'úÉZÏÞa³SבšeJ­¥RîFϘIºýìÒíWϯ“ó?÷(`™úþŠž~u÷@ev˜Â@%c)3²CÞZJìçB[¿ªé~i+ò7¦¯á«Ö–XWúÍßggúúŸ½î»®öœ@ýlã=AÛs¡·ÿÙû{P[=ëzOÐõ¹’Töÿ\§æXg¨ýwnJƒ¤«;Lýìßϧ‰¾ú9Þ8É/Cr¦)å²%å²%•êoæÛ5y—feCpð_*{ÔO FÑVvÈI`ç’#P!P9Iñ•/é7ïbì[©l0¶7Ïþž¶ãý`Ò¨Drò‚h˜þìÄ蕆œÅ¬¡tÌåÕ>:ÊsSÙÆgôrÂäÔƒõà–‘3¥Ñù𾬦ÃW©›çb(.“NÒ_d†X½˜? tßS?êö#®8«A’úãl++Ï¢®ëh®ŸlY9wªi.ý@Êx¾K#0dS¢«”å׳¶X+JMÙƒ=tÞü£×žÂ¶tHªýìÒž÷¯g]×Ù¼Õ—Woû*šúÕÝ•}Úaú¶üR·ŠÑºrPs ²Õs¡­?Ôt¿t•G݇;êGy¦äø®*š¿/tõ?{ßw]í9ïÓpï ÚêGÿ³×÷ ¶zÖÕ?kú\‰lù¥çs’ã*iø›Â-­vì~ì0õ³{?Ÿ6ÚêçÈã$›K±ñî£ êA¡AòíPýí9NýÄWθ>ÒDlTTN’¨ŒZR«ÝÏÝIµb‰Y¸ÜêáôB[ ²þÓØ¾–@e÷DÃj{ug]Þ^t¶ßÒÛ¨ìóš,£ðàLÛR=ú ¢!çËkOÇÝÒlîJòù+Éeür¨{'¿ÔrùKMÓ,=÷=ÙúQxÜÕÕmê ×> º®£³~²%ïlªiÖW™[ÿ0ãÀ-Õ…·ˆA‚K©7ý·ê •·ðÃïÔ™žƒRŒþ^_ûÙ©=k©g=× ÛêËÿŒû*úúÕÝMí0Î!–‹YÒq¶ŒÛ1Àðëaõ»O•­Ÿ mý¡¦û¥«<ê;Öð1üG¹úß®*¿/tõ?:î»®öœè÷i°Ð÷mõ“`ÿ³Ë÷ ¶zÖÕ?kú\Úê9ÉÏ•~Z•Е%iû›äsú+MJºú±dëg—~>tržžq’àvVñVϼ|·'ßuI¦=GÕO a+©O ÊIŠw(ý”Ãé§=ÿÁÎVß·ïð¨$²B% /šrwÊVò*sëʦti¯ÿb·zÏ“À •„ï»®ú 73–ÿCbx¿û¬]×ÑX?þÿ>K=lÖ­­Lèš¡©´¿¨­rÔ3¥v9L~×ö³c{ÖSÏ®£|ÎÆoÒjÚÒ Òõ¿·'}gþ¿?K=ÎAûÕã¬P1Äô |UöjõñWW¨ìò\hë5Ý/]åÙj…Ѝèû¾ÐÕÿ¬Ù»?Üo…Ê¡¿O·µ[ý$ØÿDÞ€ïAmõ|ø•áßïºê™*ú%¼K} ’üsšš@%¥ýXRõ³u?ŸRZêçÆI2eÿŒõ÷‰ÃŸî*©ö^?1°B…@…@åø´*K‡Ó¿K%{&K[Ål³/í‘•dÎPIË抌)-ïÉ/i†mås@ÙŠ¿w¬ÁƒƒS·@Š8 T Íg¨$~ßõÕº§»[]4V—ï³ïµ®ëh«Ÿs¿ßˆ 0”Ãfû«+uí!®Î„ŠX!¥Öe¬*ÚÏÎíY_=ï}u¦ÑFvô’qýêQÎP9[ˆ › ±tPgœÞ»ž¡RVΜÐy ¨Ž@e×çBc¨å~iìç½}¸'/Äûõt†ŠžúÑÕÿhºïºÚóÁ¿O#Þ4ÖObýO ˆïAíð°gD¿ë©çÿû õ7~?ð7þ¿Osawéû›ôsšŠ@%ÅýXbÐÛôó)¦£~Ò?N€öûô¸÷k—ú‰ü÷ÊD›ä·žO ÊIÒ¨,oGâV/–~”nuÀåÒ6aGTÔ¯QÉ¿:#{íGqú^4=™±•ýH;©Y>«,½{æÎjàÖ;Ì2Km3¡pßuÖº^wm&ã¹T¼çkŸ]×ÑU?çRY L_â´­ê€Â·tÃúù¥¥Ã¥µ•%ꪽ~X›ÉÞy}÷®/x[µŸ½Ú³¾zÞû:‰*zûÕÝ•=ÛaÌV~ùb®ŒÝ5ÀPÚê>+²´•G×s¡©?Ôs¿t•çBª1X¢¿%ÑúV ¿w´ô?ºî»®ö|ØïÓ³³¨÷}õ“Xÿô·â¼'hj‡ºúg=ŸK_¿qÈÏ•.†˜o¯OÂRW¾‡ÏÏXmïýŸÓ£*)ïÇ’ªŸØý|Êí_?é'9;[g Àù}ºÄ¶°‹¨Ÿ(ê —S^±µ@ B r’’T– ÜIÁÛîëseåF„¥ýZ·ÕwÈž¿ÚÆ•fXrnú_ëgĤïEó÷o]I­¿xÙþ–^u»ór‚‹é|Ì_º¿ÅunwHWC¹É^{Çë)OPÝÕ½iîÁ¾ÜÕž°Ã¾£Ê®ÿ¾'X?jX¹a&£:KgÜÚý뺎žúQ—BG üžý祵`¨ ?2élžÙ¬v/fÓÐ>J~ÃàŸ¿ÅãŽÁß6ígïö¬«žu]'Ú®g¨èëWí¨ìÙÕYÙ£§àvh\ûgNL"ªv 0–ú¨ðw…­ì¨hèçµõ‡šî—®ò,µ¯Æ¦ †›®÷ßíM­§<šû ßïšÚóÁ¾O×ʲ¢QKý$Ôÿ”5Î÷ žzÖØ?kú\zê9éÏu!fåNªÕ_V.E¼¹;ÿ÷äôuùw†š›¶«^©Go†ÓT’~N¨œ@?–HýÄíçפï9Ý·~ô¾Ï’É_K!¯{§ õ\ª ¡n¢íPßçJæyQ?ŸÏß¹äû[Ï'@…@å$%¨¨‡Ó¿Kkñ2ën¹¿ïÒªö|û°84¾Ø©{ޱ‚ʵ”%·ŸÒȯͳ ©t‡Þ½4vœ_•»_™aý!µ­¿xÎÅêúÛ§…í)~˜ò¬È\K­ç×Ý´kn&[ÆŠ¿ÿû!ïûŽõ“+?JÍ ù!`\J¥ãjMZ^Õ—­ÙPzõëA…sÉ[–ƒžC]×ÑT?êÖ+“n)¸ÿÌ܈íúe^¡ZP˜Í¾¤i®¿\¹{éOý~*x¦¢ºí׌šëƒ7FîÎ?dãx=õ£«=ë©g}׉²[ ¢±_Û'PÙ¯ª³Ä]»ïçR´ýw›‘³]ì`d«þ½ŸMÞ¤^Ü|_Œì•äâ<;—GS?¯±?Ôr¿t•'w¯àû&µµw¶31 þv_³ŸàÃ>5•G_¿¡ïû]K{ÖT?ÚÞ4ÖO"ýÏÒýÞâ{PK=ëퟵ|.-õœðçRöõÿý>>Ô*ÿ )/7Þg#'‘_®qH\Zy2¸ÐÌ–•Õz¿OÓø;7ÙçôxÊiôcÛÖ¾~>ÀÑžÓ¤ÚÎ÷yC Ê}Ú1îsæV’BûÉ ±šþug£§Û(&Ówø\ºî—æúÙìJl¯Ÿ?ÄÖóÉ#P!P9II*K‡ë.¾À¶^ʦôþ#³Ñ«Ø5K,Ë«\’jíA Ÿ:_ì É×ßý—Íé§t©V,)Wî¤î¼. دè.˃¢³é‡t[Ž´"4kÑûó«}¿vHÜ•í‚fîÃ^‡™îUžÌ­Ô÷R)›bY¦”«÷b·Þü­0f?2>‹yÐ/0u–Ø—ØÛ¬øÒ}ß5Ô÷5þ^ëYõûßDµ±›¯âN”kÐÁùµ°Ñ›tšOÒ¨?H½ñ(¶ãH·ÿ9ÿQ¸ùð_]×ÑÒ~ŒkeIÿ̆mi6î¤R¶¤\¾“ºý²TGÓ^Ð6« ¿ƒ.nçIjKÊå’ÔVú±ÐOãF¼ù‘©û"víN*•;©7ÛÊçû–~5d–çÞõ£±=k©g×Ù¢_‹¨hìWö Töl‡™[ÿ,ŒÙŒû¶4jwR­?I«¯¼7L^â‡z{m±u)UuïìGƃWiÚR¯?Hö¥ÕiË`ô-±·ªØ©åQ` 0î>Há³ ÓŸ)¶Õ Ý÷]Cý䟱Ê0um)Çè?ŒÂƒôÆq>Wx¥å:ºÚOÖ’VXè]ï~Ãìå¾÷KbÖßü€8À¨cÅUÖ”fh™¾eи ¹Û»~4·ç½ëYóuBÛùöŠÖ~uíš[*šÚ¡‘¿—Þ$¤ž'oRX}°ùÞíyf‰q)•Vœ>-É@Eÿ÷»¶~UÓýÒSž‹¥Ù®ë†Ò«ÝúgoT´•Gg?¯é¾ëjÏûÖž÷„ž íYã{æ~õ¬¹Öù¹öªçÞþn ?2Ꙩ‹ú[1ĤÿkÒW¦øq~Û»4ŠWR]ô‡§¨èzN'PIi?¦¡~tÿTí9M¨ýè}Ÿ¿ô·éŸýÈlø]?j eò.vÀªÀUúÛáŸK×ýJ ~Ö©ã¬CéXº·k;•“”\ ²<#`ÚÛ¼om$ãJÊö‹ Fj@ó-ãá»ôšw ¯PQ>OΔz«-îØŸµ7H¯õ åÐN>m/š *gçR´³;]éÛƒªkŸ_ÙKsò¢aõÇåÉ–¤;þ^js“чôZR)ó‹ëRêÞÖÛVº uÔ!yë^œÎ›¸£áÒÝéäKÜž-õòÕ–mèBÌê³tŸ2QWÉM]ÚÒ²ïÄŒ³î¾×ÑÚ~.¤X}’NÿSÆjY&_2èÚáËä•û¾8ð.S(‰Ó}—‘÷ò:”ÑàEìrô*4µLfÍ–žëú÷mò%ƒî³Tã|¾½ë'‰~lŸzNâ:Á¶T´÷«¿v T´¶Ã̵T×µïå®s·}à½o 2—)”¤Ñz[*Óo¹¾Äí9bWo%—Ø™. }¿ëêWuÝ/-å1$_~’ÎàËŸ½:uÅí>Ïû eê@E_yôôóºßë´´ç½êGÇ{BBõ³o{Öýž¹s=kîŸu®ë9©÷Ÿßvéú~èÏ¥Py”VïCF“•çrþV³¶{Ï0r¦4Zo2T®7|J¿õ fö÷óx'¨œíÕ~6û+Jzê'߃óëï9M ý$ð>Ÿ­¼ÌW:|I'f@cdo¤Úp¤;ø”ñj2ù·ÿÿ]7¡v¸ËçÚdÛû•Hý¨rþ„ááã^«oÒ„@…@+üã $ -Œâ³·Ìs×mƒlëJÞ–2ÎgžSü5Rñ¶du¥¹Ëva)E B ‚%—R_,µ›8áû·Ø’!EoÝoém}>€­e,¥Å€‰M@*ñœâÉVÛÞ ®‘ss˜U~B B …Qô·$ÙÛ.£ɸ’ZÿÛ›uco: €þ¶ÖßÒý#û× ÏPÉ«Í IDAT)þ£ðäoÜ¿—ü›°N B ‚ãFlï ¨£-s#öâ<•i[j; ž\}~éØf ¥xNñWù{é-ÎFsŸ¤¨é<Ì4!P!PùoeŠ%©V,)[–TjOÒõ”q¬Ne\K}±Reú&uVªœ,£ð ýy˜2é?Hᆃ**ÿ)C M× PT“îäŽ^>@š¨¨ü·òõ7O• eø&­ÚdRP6@º¨¨€**  ˆ@ B "¨¨€**  ˆ@ B "¨¨€**p8™[id6J¿~%ÆÁþ¶!VÿGf³™ÍÞ¥œIA]न¨ÀÁæ«Lgó`cô(ùƒýmì‡@…@åô¦ô´A†’ÛðosµÏÍÿnö#ÓÉ—¸=G•kÉ೤­<úK¡ò(­Þ‡Œ'ßóÏõ-ãá›tlKòGäÎJÒh¶e0úþ³™ŽÚRͰ,™©:mqÇß^&£wéØ%ÉǾû3 Ï2ZÔo¿´[;6.¥Òx’Fùr‹wJöFªö‹ô‡îRœŒ>¤ßy’ªy{EÏo{~•Áʵ¦“/qû¯âÔ-)dwý.¥Ú÷Ë3¨œôïg‹÷ât?d4ùñû1·-ÍÚíúfýê¥Ô‡!ߣ³¶X ÿ`_**§/Á@eÉèEªy#ÑÏ’¶òè”)>Hwñ™&m©ü™2×Rë~…”ëKùÔÅ(<Ê`R?ãׯ;‰0$oÝK£^’ÂŽ¡†Qx–ñìG¦ÝÛ-¶ Ks r.Åz[Æ1žû‘±MZöV=7f?ò.µMíI×u’«¾-•ápÊ…X͈~zh‹u I_¿J @**§O TFÏR±L±fñbã¤`ŒZR¯?Ì=Ší8Ò¬ (N^ÄJp 6måÑÅ(*«f?2½IËy”ZõNj [z£#}¦Ì­8ê âôSz­'©WKR.›R.—¤V¿óåÉXÒøe™ ^ÄnKÚÊ£q%µþ·Ì¦ïâ”fØ—Ríù[\ ëÛlå´« )w•¿Ù´$w´CCŠM?,s훕:Zt6Nàž'æ\*ƒŸ?¨d+me+­¡ôê7}˜‘»•Zívsÿ–1¥5VÐßĶ6mv.…ò½T‚V¸éºNbü­¾&=G†‡ Tr÷âzÓ‹”×V¡Rh¼+}óõís‰÷«þ³F À/•Ó—p rvv&óE&Þ §ÄÒN[y´2.%6ˆôg[’Ÿñno†ý¸enÕn´Ë˜Òú÷³4pi\‹³èÛÿï*¥®N>PÉÜJG9ƒ£_Û5H<³¥¬Žì?äu’“«-¶úúºùpÐ@e±2j6û–®µéï]Hµ?1¦¯É¯¶K´_%P` Êé;@ rf¨ŸêÀ’!f'Þv< ‹óf³™t–„ÓVžƒ2n¥£„ ɆDçR^ÌÜž¶>¸n(YØ,ò|cqÖ‹+MÝgͦôæõïV/Öÿ¶íŸ33n®Ï¼Ï”ß¼ú\xÍX2XÙžÉÛ¢(V{»«ö$Í£aàuÖ½Ke힪ÊÛï=ÏÞJ­Ù–áØŸÅ?J¿õ V.ùUÙª¿ša6¸Û=DTWN̾ÄÞµmèºNRr÷ÞV_#ûZ2JX| bˆÕSúÜ>Ã(:óçù[ºæ‘ëp¯~•@€U**§ïÊÙ•Ø#°V€7 ¶¿Ò¡µÅ‹!ok'WšÅå¿™¶ò”:ð7|\’+cy³G ‘æü d(­{àÔþÈpçÕ ›ø‡ROZ«[Ž](«?2sïWî!Ç ¾w?¨Ù)PQŸïØ"•é«”ÍGl(ׯOqÌ$é/¤êÕéP:{ ¼ç~¿1íî¾ÚJ×u’q)µÅý[¬âÊ?0P¹ª»X¹ó¼ŠÌkó–üy{¾½úUV¨¨œ¾ƒ¬P¹‘æb»¥ÕøgWÒXl>y3lÐɸ‘Ödó \ÚÊsPYvüv[9mÏ0_¼s+úee 6s!ùü•ä²ç Y ±¼s>¤¶ÅRö.Á:2¤¸XÝ䮬–XZÔæü×Ig5ŒY\ã\²ÙK)XþAÚñV¨œI&s!Ùì\^i'=KrYåÿóÝ?u…Š+£ù ódð"výN*å’TëÏÒ*Ÿsâ„??û0nýmÞ¦á+Â)ý{3º®“ «/区ºî°ŠÞWª÷¶g7°Ý«_%P` Êé;D ’{ôöêšå›­}̯ó-½òæ=uk§QÀÁâi+Ï!Å-³þY_bç ɤ3ô·}Z ºZ÷RL|;0e vÚŽÀ”¶îê?g&[ýð‚¸¥3Z[+ éŽëÍQ·ƒ2®½€/h»°%êï.«ƒ²¥ˆÕ@e>ßXÁe\IÝDþ–ÞÆ³2ö”{}†cSW ,¶2;æu©«å­¾÷L]wˆ-¿Ìî¢x > eåÌZ8y`ûõ«*¬"P!P9}‰*—Ríùƒíàà!cùÛm< Á³³¸Î§Ôsé/ÏÁdn¥µXq“䪀ùçöVbÌ>¤V±ýÁÏ ã©$Z7WÒùŸ=ô°yuEQÛ¢ùÔRSŒ3•ß³>&-S*ós$jpâ­œqÿ±wÿ¬és}ÇZ† u¨P„";ØÁ%ƒB*ᇋ]:dq¨P„"E(R°ƒ²8Ô¡...y.ßk¨&G›ê‰Æ^ïá7÷Õ_{<9‰ÉùäœïzÐ$+ŠÞjпmÞŽ}­lß¶×*†\Õ¯Q·râ¿G» i®&õW[}ý¯‡)JŸ«¿zãgÚ [‰u%¶£Ž³»ã*{_W TØD B rúR TLÉ.¥Rÿ'}GY¹0ëH%ðÍmµ|H8‘«øÛÀ„„YkÏaœ‰Õ[Õqù’a=f…ƒ†¿WS&Öçî·¸ó7é6n¤˜3Å0LÉ—*Ò|J’É÷½™J=œØ­„ü• Û˜NÀ«ý nùäPãÆ¹—«{Ô0ĬlÈH 2ŽgÊÖjimÙdVž½mçûA]å°f£>LáÎ_é2ý·û˜Ðõ{4+4ßüÕdaÝ¡•µ­Ý/qºwR)þl/gæ.¤\áìçüñ¯Ǻ¶ê¸®¨°‰@…@åôi TbÍ_¤YŒ(®Lî"ÎÕ^üº!“[YkÏ!š¯^;æë“j­ˆŸ(µÀí{Î¥6XMŒF‹ßK–Ão‹_ô~U“Ç‘nÉôëÏ(“îÞ¶BI&â3¨|Š]ŒøY¥¨¸;:¡@e¢)PÙç÷èT¸óVͨ[}y}xè@Å0Ä,ý“ñ"踬8Ò«ûívGÖVßIºè¹®¨°‰@…@åô¥¨|ʨ{+¥ØšJ1ø™½±u“²*bñúÖÚ“¶\EÙnkúx€z%†ƹ4•âÛƒ¨«Ú!nz[?eiË/Ã0ÅZÖ‰ð&ù½pa¹úÄ[½±Zâo—(àÈD òYÃ0+é*q[~ån¤Ù~Û~Û~”áê¸o*J¸³ÇÝ·êÒõ{´ ßêËëÃ#*†aˆY¨H»ÿî¿ÕxœËíÑ.w-¶ò|¿~œ7ÉՂࣨ6xáBºµ’%Åö*Jqe‘·*g"½ÊÕ²Hýú„¿º X©²úßÉ ™kTüíêN9P1¤ÐöÏ÷è=QÊF=–ÅóΓøº~ÏÞN8P1‹ÞVnêªÀT¥v]%P` ÊéËX ²V ~|+%o{­iG¾…ž½öhe^Js´ÚÚêK†íêÁ;“Jç}Ž|‰Ó¹Ivüs¿^ÄäŸC& ý­Ñ¾eTKòÆ÷ŽíQWÂL‚Ûc^IÇ+^ÿ½UÙž}ºÚÒkܸý 6·FË­Bi,k],† kñì¨ä,%ìØfÂ:{Šع‹aç|t ²¾]×·,†·RØ©Mº~Ïaì^CeÇó4Žy)-ï89[„ž{´'•ëªß.Ö¨¨œ¾Ì*j1ø7é­&¤œ»ØÉɬµGŸs©üí„ÆmMÛ yÛMù“ÒÍDE˜Õm¿¾eÚý=iný:‹çèâõ{·Ç¢í·ÇùÕ?gR¶ý±1í¤»Ój%Ìtðü3aý«hú¥·re0tbWÖ¬Ù7PQëÚ,^–ÛØ%;æ™ T6Æ¡;‘V9(ˆ T 1Ë~‘{÷[棱 ×Ü…ó¿ÿ»®ßs;*{œ§áýp%Í¡[ ¬ä5—vnOJ×Ueܨ°Ž@…@åôe0PY+ª¼šìjÄoÃ’µöè±1i¼x—A¯#½Ýfü¶=ê„êê­ðnÒBÌæµ¿âÃý–…ó$vóVêõ[iu_”Iå/5’…{µ'w#Ý™ÿog#[ÚÍ[i´¤7r”I÷§dáμ-Ñ–cfö+À1¥2øR>çDúI߯/Ü­Õ@Ù~e€)¥ŽÒÓg±›–XVE¬ZUÍ{i·«aaC óRÚãõssæ¼H¯û ¶ý(î“ ÇŸÞuáµjL)4_”ŸóW¿û(¶ý vÇ–ÞàUœéϱ›¶ƒ¶üÓõ{Ò·k ²ïyÚjßI½V˪H­q'vïu-„r'RÙâÝ­=é]W}*l"P!P9}Y TÖŠÁ‹ë¾&z“>kíÑC}»~ I&²•ÉùÞ4ÏW¤;‰jÇ—ŒÛ×ÉÇÔží1‹w2œG´gþ*­Ðm¡4Zû_2 (pí¯zúùœ ñ´K- ç.þÍþÜt¢ŽÛæeËs “Šaˆ‘»’Öp’°¢ j2^$ëë¨ D×ïIÓ>+Tv>O ÿ"Çôlp/¥mÏÚ“âuUù*¬#P!P9}™ TÖ <'­/‘µöè‘æÄß™”í×太##{‹ðÃs.•¦-CÇñßÊŸÊxð(Ò6u4µ'w%γ83Èbö.ƒÎíöµ»Rkº¸“»koÕÏl)M¶¦¨†æ¥Ôì'OÕ âKf“7vƒjd8PY¶¯`ÝKwø.³µ ãKf“wõmi7*RL2Ì ©4¤?z—ÙF@·˜}Š3z’n«*¥¸PU×ïIÉ>5Tv>OóU̾֎Ï|ú.ÃÞ?©o}½Ø§=* ÊéÛ#PI“ÿÿ—ô+Ç©1åö²Œ@€M**§/“Ê…´V[Í;R>úDTÖÚÈ66¨¨œ¾ *fÙߊfjoSøÿÑ@Ö¨°‰@…@åô©JÉ}@=…4Ûs-¶W0ûÅßO¤=€ŒQV1"PÀ0TT20÷vä@%W®J£nIͲ¤Þ|2)å´¿$kíd I¨¨ügRªTIJB”ÏS L)uÀ ¨ùàö°+c2Ù@ö™’/G|V®2±&ÇF B ‚=[¯2[(ÁÅäUzÍë£M>e­=𨨀**  ˆA B b¨¨€**  ˆA B b¨¨€**  ˆA B b¨¨€**  ˆA B b¨¨€**  ˆA B b¨¨€**  ˆA B b¨¨€**  ˆA B b¨¨€**  ˆA B b¨¨€**  ˆA B b¨¨€**  ˆA B b¨¨€**  ˆA B b¨¨€**  ˆA B b¨¨€**‡Y‘‘û-®û&µ\ÚsÏú-îØ’Ü±ÛsŠ ÿd²êà ÓöåñÛà°¸®¦&gudê~‹;‘fáøí`W** ¶Q¸“ñ‚@À×Õ”˜büëë¤y‘6°•?”|ù^÷[\÷ClëZJÅó¿;!–¥‰?óFúóe[FUÉ+ÿ-_õ&Ñf+1Ër×ñþݨ~žòg0%—¿RýYæ*‡1~ÂÿÍ…ÔÛÒ®11 Žu]=…ñ¼ËyêQ¯é_2¬ÿódÁ)wÀ/**§Í¼”zçõg+‘@_2?‰]¿L8™"2¨ø¡ÉDúsý¿ç«2^µsú ÅDŸíJ:³Õñ{“zþ0ŸÃ,Ù2#P9¸Èñz¬eæ~Ëbpó·Îkב®«§0žw9Oט—Rký“Výúï¾èð;à7•Ó•»‘Î$,HY·þ±í[2¨\HËY¶cö(%só¿ŸKc¼:ŸÒ.&øÅ? oû&ôîT²8~‚Z?ç5‘ÐéH×ÕìçÝÎSœúq!P!P9Q¦Tz¿æEÿN*¥ªWC¥^8—b¹"Íγ8³é”vx£6Ë2¨¬Þ°uÝoqZÁÛ–äoþÞù!?£*¶?½Ÿ7ÒÞîKý,*‡–düüv&õeHÇD$´:Êu5ûãy·óѲÜÁTTN“y#ƒUAqçN †AQúƒ;“Jj½†oÍ•¿õ·ýZ«PÒòV½Iã@Û}Êá%?›rïÜg"Z㺚ùñ¼ãyŠh™?î€0**§)»,@¯;ÏP b+Òê>ËxâÈB©ç2Ÿ}Š3ìˆÝ´¤”Z5cJ¡öOúãO¯Púbþ!£Þ½TòÆz t¬@%_õ&çý¨ ¡si¬¶‹qߣC’Âw\]ç6r»¯\©*vÿU&³/oEË|ö.Ãî½X…íW$m¨˜büð'rÌ©µ£ŠÒW«ßñ%ƒŠ)FîZÚÃÏŸ13ÿ~s9¶3)·že2ÿùÙÙÈ–zÜgÌ]IÝ~’‘:çŸâ miVÎOàåË·¿úÙu¿d>}—ÑÀ–výZ »l´Åø±šÒ¼Š3(mˆò&õ°ãQø'“åXl®ÆbîJgqÖÆÒ‡ŒúÒˆ[ݦ¡ŸsÅŠ4ìŽ O™/”Ï1ÿgÔ‘ví2ñ9¾ûñÒ1ž³ÝϺ®«û/ÍãYóøù%ñyúô^c?÷rŒôŒÃ3©-W€Ìº×b†˜…Š´z¯2¯~ÿD¦ã'i×Âj¬™J˜ô)v‚-+ÕÕ<ëý¥ÿ¸:Î Ýç)ü¨¨œ¦œåM¤,• *çbuÞ•%Ì— kg¡¿£ÖûŒø·ïÒ±*Ò[M )PYíÿîºNì–jùæ»×þq=|¯|Ãÿ9§ösgR±ßbúØ‘A#l’,Øq•o™´o¤1úÚøé[çRh¾ýþŒÓðZ¹Êƒ8‹¨þù–i¿„œ‹ÕýˆüÞd[‚‰ÖM‰ÇY‘a¢ÉÇ„‘ÞâÏß5‹w2œ‡ýž/XámÛ¿ŸÏÄêGëJocVwí{¼Ò T²ÐÏ?ý³ÿuUÃñÒ:žuŽŸ=ÏÓ¥,*î¸*ÅòƒÖµ©oøê÷¬Õ—ºŽ×_ݲ¹ÖV­×1]ç…Æóþ/TTN”º5Ô‡Øå³ *çRë;kóÉ«ô»Ònÿ“¶mKoø&ÓÅ·¸ó'©„¼%^²ÕIÑOvï¥Q¯J½q/Á*¬q¼Iž£*æ•tfË¿ïÜÇOÔ©+OFÕöªìߥYHÐ?‹¬ú§~'íî‹_ÐÞý’Q3ù~ÿÇTÜÙ§ÌçoÒmV¥Ñ~öïôEœÅ·ÌGÒ¬ßJ{àø“[•ß“[fùq9Aö3NF½i6ªR«ßJÓîÈxæÏY¿:vòõW?´š½IϾ—FÝ’Z­*æ?éô_—+f&Ò+o9ɶåøÉåÎ%Ÿ_*úci1´¤Wþ›ç,|âÓ›@ü’A½*½U;fï2ìw¤Ûµ¥?x‘ñôK\÷5ô¸êêç‚6:2Øb·n¥^·¤Þ¸»ÿî­¤pÝoq"ÆóþÇ+­@% ý¬ïºªãxéϺÆOðqÞò:¿ìkÓü-W~ô®ÍTŸ?ß»îDÆÊøiuÔï‹o™ØAíº”öê^#ô{{Õžk?›ý¼uw]×]ç)üŸ¨¨œ¬œõ¤L}Édø²œ ;N ’«=+«&ÞŶÂVX˜’/„¬NQë¸oÒ*þžøÌYöÚ$Ð1•\ÅïûQÄŠß…4½m¿^‚OÎßZ&¬ÖŠYò'åÜiG¬ íÃò–ôgþqh3A¿ûÈŠû%ëÌûÿË]%œSW£ä,.ßJžÚí4¯ý ÐÅ‹4Æa^IÛ;a“ëç^ÁdwññÙLÉ—¶ßNhûñ£ߪ?¹Kíoñ[ÜÅÏdä yøÌ\Èyª­Ÿ 1ÌK©Õ‚ÿ¾al\ç&a“Ú:ŽWZJúYçuUËñÒ8žu·Gý·ûœ§›ŠÇ TÜoùyñ" €.ÞÉháÿ½ -)ý–Q+K 1•þŠýÙç¸ë¼þè8Oà†@…@å„™Rl<­O‚-'FvUÊ-ž«¼ÅêN¤gí6ñào¯5!s&Ö@ÙêàʹÔW^qoì~658ðåj/1oRŸ‰5\}îíT6˜•Ž7±5ï%›¬:~ ò*VNý ~@·œø«³6'âru»¨ P³ìÖÅ0èíeeØäŸ30~<:÷[œV’c½1Vµõsêj¼±ûKÇñJ1P9r?öºšäxiϺÛãÙó<Ýtä@eÞ»_壌I+à»G ±ÝqXm/S*ýÕøùˆò÷8îZ¯?ÎSø¿!P!P9}ùkiv_ƒ§w+¥C¬V)Üû“‰·FÙ¤¼eî~H;bB&g)«a¨(Ÿu91þï~O ©aIÈdT®âŒž>DO«[Õ$œ +{“¹áâû¯•cöóÁ¯«ÉŽ—çÊVíYþ›½ÏÓMG TÞ¥µbÕ¼–¾WûÄþUûÄ06¾¾ãsµ/ŒK´=Ú®Ç]÷õgßóþ‡TTþ¥(}£\‘öP©AR“CuËQÄëqí®Ú·#Wõk2PÉÝøO¡ÅåÃÛ«~ZßÓ]Ý{>pË#j ¬ ê„`ÌÛÉ«ßì@ÅÙx«Ù›€ÜÜÞ,$P c½Ö 0 C 5[œÅÆÏÏ?dй•JaËBôÆaZ•¨m€Â?ƒþ~6 7Ò°;2t>e¶Ùßk¢'Ä÷;^é*Gí箫ºŽ—¡c<ën®ótÓQ•¸bê—Òž®~6l[4e[Ï™½±ÚCY5²©¦ë¸ë¾þì{žÀÿ Êß¡*?çÒm·JaWÅöçòï|É0Áä}tû¿Åü‹€ÔŸ=` ’÷önORüRüçOªuW“j¦”{þv*aÇÉ´ü+a¡‹ªhowLR TÔI°]•R’@E™ Ö4ÑoÆOÑkûY&¿&j¿dÒ¿“ò«.ö?†¡5PñÇà´öó™”Û¯~Ñp¥oçsGf³Þ6TI&Äw>^:ÆsûYëu5…ãµ×xN¡=ºÎÓMi*‘ãp=P‰®£Ö™ ÿY¿8ýF¿äý±º$¬•´s ¢ù:¿ïy ÿC**ǯ@EÝŠëKº&†~…Šu„@E™tš>n‹OyxU3DÝ’g^Pû¤W¨¨“`©*–ÿ7&i¬È:“Rí^z#g}¢nþ,õ¨@Fëø12¨èëç|Ýß&È]¼K·y#Å_ãhÇ[/ã9ƒý¬ñºšÊñÚc<§3~4§›R T¢Æ¡¨Äm·—d…бVœ~1ôÇG¾ñæ}×ôÊ ï3öX¡¢õ:O [#P!Pù;•|}‡‰ŽäjJ •D“ñAí¿öƒ…ùStëü7s¨@E-’î4w/Rî¯YˆV&Ú"ûî”k¨¬íSŸR b^K/¦€.fÑ’Îxâyur1¼õŒŸ£*ÚúYÙBÈý”N)ìúdŠ5ôÇYò@eÛã¥cø–Yï&åq±¾•Pää«Îñ³V7a‡±¯aQK?¯Õö¸ߺ§pﯚØ'P‰=^:ÆsûÙÐt]Mëxí:žÓhÎótÓŠžq¨*ß2Øú\ÊÊ ñ­”¼í¾ÂëÚã:¦õ:O [#P!P9I^ ëKœ®µãŠ‘íäJ›æ¯Ò*‡×R1ó—RšØ*Üùû£/^¥Yü=™d–þ)d‡ TÖW‘ì»ušRßdñáo÷•äíÞ¢²ÅË´#VÐÛËyKz^¸õ!í„íÝ>PÙxCz|'Å€UùÚÓzÑè5¬r݉ [WcãLŠ–\¤Ü¼«v}Þä-e›œèZ ZÇÏÚ꣗„õ[:&uôóZû&Í 7Ís7Ò™(c'lB\ÓñÚ~”@Îýwú,vó§mV­*æ½´ÛÕˆ7öõL îßϦ”¼zBßâÎ^¤Ó´ÄªÜˆU«þŒåÅ÷O(&âô¤Y·¤V«Jsãûbb'§Jqú•qã|Ë>Ùï:¦ç¼ÐwžÀÿ ÊßP”þðm¸zïcm¢%XX bˆaœK½ïDüÛ‰ ›7~!Ü”•œõ¼ 0¾dX _u³]?)“wîwì ‡u¦”š/¿'@7úhÔ ŸZ«•Ðb¼N®ü¸6)÷Û›´Ë—ÒX¯”Ã0Ä,ÝËp–äs…Ô­ÉùûûÇ™ô¢W€¥2~~½y¿!ª¦‹Æ ĽûÙ¼Û‰úw?ã8ç…}qІãµ×xÎh?†h¹®ê:^ºÆ³Æö¤ržª¶ T´ŒCå:9ïˆeEÿ¾i›•¬êö“ß⺯ۯ”Ûç¸ëdÔF9î­ì´Æ!†y)5ûIÆSubóKf“7voS_¡¢«Ÿ óBjíϱpÄÚÒ\mèÕ[Ÿ×s¼öÏîçåù¶÷uUÓñúý{wÏZÚ“âyº²e bì=•ëäâE,Ó3_‘ÖÚï›Ètü$v-áŠDµme¥N×0Y®àã·ãq×u^¨ÀÖTTþŽ *`i‡@e?ê–_¯bi‰ü:*_Ò]m ø‹TTþ ©·¤cß±‡g–ÿP r!­‰¿¢§Ìýü¯¨¨¤&W{YÖhù§yq€¿™^ bz5i¾ejo¿]à´¨¨¤Ã¼Û+¾îH§tˆ-²R TÖ>ËŽÅè'@…@`wæôƯÒï>H«y+õº%µZUm[F3¿Xúbt+ùƒ´IO ’+W¥Q·¤fYRo>È`â§Íêø?"P!PØ]Î’±ë‡ &båÕ&Š)¥®øYæƒ[)»ÏGA B °;óRš½q¦ŽW+åÇD¦ãgé4®´2eEÏ •bëUf %H™¼J¯y-¹c÷7àhTT@ ƒ@…@Ä P!P1TT@ ƒ@…@Ä P!P1TT@ ƒ@…@Ä P!P1TT@ ƒ@…@Ä P!P1TT@ ƒ@…@Ä P!P1TT@ ƒ@…@Ä P!P1TT@ ƒ@…@Ä P!P1TT@ ƒ@…@Ä P!P1TT@ ƒ@…@Ä P!P1TT@ ƒ@…@Ä P!P1TT@ ƒ@…@Ä P!P1TT@ ƒ@…@Ä P!P1TT@ •¿Ã¬ÈÈý×}“Z.íþ’Üt'ß⺵.Å{—a7lìè‡ÀþTTNSÎZ†'ß²T2¨¸ãªË^ØdÖ·$ð{Ì’íMÜϺW1Ö¦”ºÎòw:Ò-O"ç*â,ÂÛò³]Z5dbÝŸÈv[)–þÉ8òw}H§röûsUžd¾ú[í˘¾4¥ÔY}®‰ôB>×>ÒhÏ~ý¼ä*ŽtJ¦˜Å;ÎÃ~ß— ¬°¾9«û‘¨¶Pt@T‘aÈgÚ.P9“Šýæ‡L4ÂÃFãØ ʉºÖÄŸ@µËgÙTŸ2]üL¾{ÒlT¥V¿•VçE¦Ê¤ïÄ L.¥½úLó'©DM¾›×Ò[M¶Ï¥ð³fùq9Aÿ3a=RÚÓ´;2ž©!OEr¿þŽ2‘í~Êd9‰=?‰Ýº•z­*Ö£ &Êdö¼ó»Ýj[§RŒêKóJº«vÍìÀϵ7ÍíÙ¿Ÿ—¼@åKõªô¼¿û.Ã~Gº][úƒO¿Äu_CÇx¾þꇳ7éÙ÷Ò¨[R«U¥Ñü'þ«Læ[Væ™äóR²½1œKµ{é”[î·¸óg©G­öØ”‰**8•¿# PÉ×{S•Bò^ãk¨üP‹Ó¿-'¾ÏýQÿV-¦ù7â¤0‘½¶Âf5)¦RÛ2M³}Ú£­Ÿ—R T|fÑ’Îx5®Öúø¾ÊB  ÊI2‹·Ò¬mÚÞ Tr7ÒñVƒ¤9Q¯*_2°"‚¥n‡;®Fnm¥§wçkÚÑoüŸIÝ›€Ž x"¥1‘­´mñü³Í–yãm¯µ†lc–š}Ú£«ŸWc#ý@Å0 1ÌK±§Ÿ9É¿Û6PQúÑ>H1òg¯¤3 k ²@…@å$™«­¼Ÿ2Øb·n¥ÞxXNH;2쿬Վ˜vRœ ^ T¾eÞŸ„/´>¶¨+¡§ßJÉÛžê#¶L¾þêýYïfÇ"‰ì\íe¹ÔÏÖNfåIæ^u¦ùØÄÛ§=zúyéPŠaJÅ[·EbÛ@em••#݈bf¥³ìó Ú@*È•“ä*±¾ÄéZ)9_T\÷Sº•ßñfáNF b8°0ù¿8ý›ôVÃIP¯Ã¼RVçLdغŠ\iQ´¬€"å)Md+ß罩t—µ36 ÃÊ>íÑÒÏK:óR¬ÚUôxÏ[ʶsÉ·*Û:P1Ä(úŸÉvÄ óyKz«Õ)‹›Á ²@…@åDIѺ“NÿUœ©ã¿öV‰8¯Òï܉UH«nÊz[ü@e²|Ó~"NÿAšuKjµª4;ÏþIJû-;ᄹRœ~eÜHV´Ý,ýó&À&´_¥ß}vë^Zíbw:2},ÛëH§t¨‰leåÂìY³U˜q}¤ ðýÚ³?/éTr«š0Ž8ÃŽtÚwR¯YbY©Õo¥ÕyGONì*)µ}J 2HºÇ”bëÍ??2èÜK£nyíQÏ §ô¹ T **G@QúÃP•yG,ëqm’xÓ´¿ÍŠuÛ¤oqÝ×eúdÌÒ½ gámQWÕØ¿¶Ko"Û,û[<%Ù*mû¶g¿~^Ҩěô"Æ¡Zë')ç.ä÷™Rj¾xõ€‚MdÔ ûÌ*È•¿# ÊâE,Ó3_‘VïU&ó/oÂx:~»v¹õ$¯:Ù¿SÑvó\*GŒ?d®®vY82¿HϾ•JàJž'²ÍkéΕ¶l³õT*cGC{vîç%M5Tò媴»Ï2ž8ëíp¿e1ûQÿAå˜UNZ•å8.T¤Õ{gö¥´ç]†½{©ýÚæë@ãØ Êß‘…@Å}Ks0à×Qù’~åx«8àÿŒ@…@å¹zûA:ö­ºÚ!Í@åBZ;±ò1WqÀÿ ö–^ b–m¯öÄÔÞ~»0€**Ø[JŠy-öÄÿ½Û£èE B ‚½é Tråª4ê–Ô,KêÍLü‚ßN›Õ)pL**Ø›Ž@Å”R×ñÕ|p+…£Fø#P!PÁÞô¬P)¶^e¶P‚”É«ôš×’;ú稨€**  ˆA B b¨¨€**  ˆA B b¨¨€**Ø”»‘îä[\w"£Ö¥˜´çô˜¹ßâºßâŽ-É»=NÜ™ÔÆËkŠû*–yìö ‘Â?™¬¾ 6LÛ—Ço€Ãâþ©1Å­¾cÞ¤–;v{ð'0™E B ‚ fåY«‡­é?)ÒžÓÃ3­TNRáNÆ KÜ"5*ÐyÈ.l0K2]ݸŒª’§=§çÀÌùrUÚ½O'þM¯;‘™ó*½¶%Å?Te­=kÌ+i 'Ë6}H«°ÛïÉ•ªÒîn~ÆoYL_¤±ãïÜIîZqf_^æÓ7éÛU)faÒݼ’ÖhÙß‹7i—ώߦ?Ë…ÔÛÒ®]áïÿÏóFúóàï¡|ýÕû³ÎU·'M)wïßêç)Srù )ÕŸeN rxã'üßó|ÇŸu¬@åÆó.çé_µÓñ"P~i Wþç½ä2Þeã9 ö@ B ‚_L)ZwÒnU¥”‰›á¬µçèÙ,XÒOdóÍç_毙ÈÎZ{~·¯*ý©Ú–•Ü•4ŸŸïSÚÅ}žÒ¿Ð·ß]÷[ÜÙóaÃMæ•´Æ_^˜Ò*šÇk‹–þ~”™û-‹ÁͶ<ø*~h2‘~ecå«2öÞž|Höö¤y%™?ñTÏj Ù2#P9¸Èñz¬Žy¾ãÏ:R r ãy—óô¯Úíx¨ kÀ,Þ{ÏN‹ñ½”þg÷Óþàï9Èó…4ÇÊäùüC†ýGi·î¤Ñ¸•VÛ–¡,^Rž4ÌZ{Öå-[œ_¡Ã–JîF:õ3|Ȱ÷ ­FUjµŠÔjUi¶î¤rˆŽœ%ƒ¹ß–ùøIìö½´ÚÒw”Pkú(å£<,\Hcøåõsç”W¦,Z?`*v!-g><üžKÃ뛄fñÁãr|¸7. T²8~‚÷|ÇŸu¤@%ûãy·óô¯Úíx¨IäÊ^}»ÅðV hì‚@…@ø{õÀ\¸•ó"úeÈß8—ZßßÖfj§<—µö†Æ™”Ûoþ¶\ógiÛï;*çRøÛjMº–ŽöÀ¿¾]‘c_oþ’Q3Ã[Œl1ŽêËI{•ÃZ½©ëºßâ´‚ÇR¾ñæ÷ŸQÛþ*³q#íí¾ÔÏB rhIÆÏoÇ>ßñg%PÉþxÞí<ý«v=^*@R…¦rߨNº],d ð÷d©èhþÖ_™áÜïÛ·§ØöƒwbK-oJ¾¹} b–;ÞÃþ¬W9î1ÍUd°Úêkúü&§º¥ÑÌ>è*³øÏók”1§¹Ï¨¼ü•3©ôW+®^Ôð½ IDATWµåoým¿œ»˜· /¤5ñ'\)G ’Ññ³éèç;þ¬cÜf~<ïxžþU;/ ¹ ixçˇإÿ÷6ƒN ʉYݬ~É bŠ‘»–öðóçí÷ù‡ô›«7ΤÜz–Éüçgg#[ê…/êœåOmXô“ÜHû7ÐóþòMõü4»/2Q U/f2êÝ‹ÖmíùÍ,V¤Õ}–ñÄQ xÉ|ö)ΰ#vÓ’R>º]¹RUìþëÚgšÏÞeØûLšûgù; µÒz†óŸ_Éb˜7þ„wÄs®X‘†Ý‘¡ó)sµÆüSœQGÚµ°•[0+2ô…ûã/k>t{réϾe>ô÷É]m¥ißHcôµq³1‘¾u¾¶ŒÔ3 Ù8W‘aHaém×¹•b\¡j÷C:•ˆz{·Gu.Vç] QÂ|ɰÖ¦3©Øo1¿Ã‘A#ü¡GkÿçRëE%—ŽU‘Þê¡,ðùL¬~ÔïðÍ÷ÝÛU­0:òj™#µÇÌ_¬ý­•œuà‡ýh~P2‘^9üÂ,wüàå@Ûn™e{ítûã{.V÷#Ù¹s,r•q"Ïõo™ö«Á–jð—Ø•ù“Ôj¶ÿ`Ö·ƒuBÖÛâÀ”’·µœ#݈±–ÿ\u¤7‰à­<û–q=|¯|Ãÿ9§ösû~G T4Þ·ì{~¥p¾I<~tŸïÞÙÏß5‹w2œ‡ýž/XámÛ¿ŸuÞoì{¼Ò T²ÐÏ?ý“‰ûC­ã9ýûÕm®óz(ß§ãªË5ö|©Ÿj;^Êùµx–Zeßç¬=íG})þû×”Rgu¼Âïµµ\7´]Ç4}Ÿj›8…ñs&–ŒF?S@¨¨œåË}ö)óù›t›Ui´Ÿ½›jwú"Îâ[æ£GiÖo¥=XÝ-ß ûÝæ™äóR²½ ç­÷S&Ë›ùøIìÖ­ÔkUi´e Óžw¤÷¶çÎíYY¯—áºß2Ÿ¼J¿û íö?iÛ¶ô†o2]|‹; i)%[¹9\|È {/zUêõ;iw_üÉùÐZ :ûg£=î§ WíiÜKg° <„¼Xð&ÿ쟶Ô-©7îÄî¿{7ý®û-ή“áæ¥´ÆJÿDL2DFÚãɳòä=ŒÔà/w.Åâ¥òg YL±¼bï1oâ+Û«f›õ ÀÝ&FòõWÿákö&=û^uKjµª4šÿ¤Ó]¾A&=*ƒ#£Þƒ4U©Õo¥iwd<óϯY?x ·\î\òù¥¢¿ªa1´¤Wþ›'Íq nù5Y^&2î?Hkù¹Zõzø-;h‚çRÚ«k]èuwɼö'þŽQ$XݶÎI°šM]y2ª†ÖqRWP5Ïß;!ãòÈŠ®ûç—¡ñ|×1~´žïÞÙ— êUéyÛ/¾Ë°ß‘n×–þàEÆÓ/ñÞ$/šúY×ýÆþÇ+­@% ýœ­ûCã9ÕûÕm¯óZ¨+>?žC܉Œ•ã~èïS=ÇK=¿œåçÒô¼sôç/ Ôc0}b̸ì*ÛæÝÿèº>뺎iÿ>Ýkàtƺi1<ò–ΰ%•£~¹ÉÀ:óþµHôÚ[9Ë{Ó#Qî¼r#½u òcT\mc2{h%|‹cëöüÈÕž•·RÞŶÂ&ÏMÉ‚Ûb–ü›8wÚ+hò8oIæÿßäûGݧß}“Vñ÷ iβ×ÂB·t0/¥V» ßîÁòߤÚnk,Srù+©4d8õÛ±k)sÖÚ³} â¿=ù)vÑ”\ù^ú“Í·¼÷úv`ÊÖF‹—˜xå­G§š~-“Ú.‘«!Ÿ­®lk>ÙfJ¾±½ˆyíOÐ,^¤pžæ•´½-¢<\æ«§6©ÊÏØµË¿¯QfñNF ÿ¸ù+9¢Vnû6§~9åï' _/¤éÓ­ùrþÖ2aµVô|ï„ôé±÷-ÚÎ/Mç»¶ñ£ß=Ï÷‚²ÈâçûaÐ þ¾7s!ç Î똖û Ç+­@%ýœåûÃ}Çsj÷«{ž§; ú> Žõ}ºóñÒ÷¼“¹ç/-Ôï¼è—~ÔÕÖ³NP›5^Ÿu\ÇÒü>Ýaà¤Æê.^Ä¢ö€B B rbÖ÷§U¿tÍŠ ¬O@øpÝï¨D¼á¥ÞÐÇ/Oßµ=†¬½µåN¤·ÓÍñ™ò&~ôv3fÅßÚhÞÛl£¾þñ'Ö£ˆÔ·ô#˜c©…“ãŠP_Š=]¿éô}‰Ó«Jñ o—g­=ë¶ TL){ËÁߥYߘÙ4{’úŽuC’öm{Õ·óNt±yõm¼Ô«Q·›/÷%ßîw(c~òo‡@æG®þê¨ õ9ö­´Œ*ó^xÿª×©À;Êd¹;«!bJ¥ÿµÅy¢Û¹ÔW×í¸7?»(c£öâõMð›Ôº¾wBþÍÑ•ýï[ô_zÎ÷`»Î@Åý§µ} ™Êu,T’û Ç+Å@åÈýœÝûC ãYw{<{ž§;Ëø÷©®@eççì=颮F J–í.÷¢ëãh½>k¸Ž¥ú}ºõ<À©õx³í€ÓB B rbÔ­3Ö—l«7i£µ‰œ3ÿ­‘$5#ö T¢öŽW·r‡!¨{·Ç£pïß›·ÝÕ·K~=”éêåí÷CÚD9KY³ó³)ïÁ;®6Cp€±˜<‹ZP3MYkϺí•3©)ãgî~‹;“nãFŠ9S~ÞöªH{ ì1žæ¶¦Ò·!Ûø?«lY°ÓŠ‘í”£ˆ75Ùk[†õk»lu§¯ð­~úG)Ne*P‰Ù>R½þŽƒV&©ÅtCÎõú:I”"å3LC'=¢ÿÝïã¤>ä'øÜ{}ï;z ²÷}‹ÎóKÇù®yü¬è Tvš(Né:1Îâï7t¯•£ös–ï5ŒgÝíñŽßžçéÎÖ·ÐìgíûTS ²óóNæž¿tJp½ö2RP8¡ùú¼÷ulÙ×i}Ÿn;p‚ã'W÷kȧQ**'Fùrß|ãÛ+¶=‘þÚÛ jñô•à7ir ²ï}‹æókïó]ûøYÒ¨$y‘æ×±Lé:ÑgIî7ö?^)*ÇìçLßjϺ۳ü7{Ÿ§;S¿OߥU‹îß§Z•=žw²öü¥™ÿ ¼zB]í8¹®ûú¼ïu̇i|ŸÛÏœàø1˶²Rf—öp**'Fùrw6Þ2òn 6oШĩNò€ºw{Ö—Èïö¦zÔV$Á}à?˜m¾m¦©Ôzq“Ó¹ª¿—vÄ17 7Ò°;2t>e¶ðo‚Ûâ¿5gRn¿yý8nE…çbµmévc´+{¼­¾M{Ò³m ÒTö@ÚFÈSüç=D¤·eAV·ü2Å~oѯá 5[œÍóaþ!ƒÎ­T 1AúPµ•˜kC¦•¸ISeŒ„n¿¢lË8³7Æ‘òöå"¤Išr7þVhqùpÅö‡w¾ªÁfì$‰¡ó{'ØÑ•}ï[R8¿ö:ßS?†ah TvšœI¡ŸuÝoìw¼Ò TŽÚÏY¿?Ôðý¥ý~UÇyº3õû4f…Á1¾Oµ*»?ïdîùË£é9E 5_7ÔíÙB‚>Ý×ç}¯c íß§†±õ<@vÇO„¢j¥è€N**'&áÄDéXІÔ½Û£NXÉ0Á$SÓò÷ºO²ü¶h‡ýMMý£þ·É¿èÉiõgù™”Û¯~OÏ—ÌçŽÌf?¼m!vT 1Œs©{oÿ¼FÜFÕ=Qì½Ò!i{Ò³û •×èb…ꛌã´&¶,J¿z°Ú¼^i·þàùÆgæ¥Ôìg™üš¸ù’IÿNÊaÇA¬Òñ »’©@å5fzu?ûðŸõ‹én<Äæý>\ v­É°»¼·7y²â—À`S]AõºšDß÷NÈïO3P }CSã}KZç×®ç{ãgyè Tv ×µös ÷;/ã9ƒýœõûýÆs:÷«ZÎÓeüûTK ²ûóNæž¿<ºžS.ü¥6W²&ÙžM÷÷à¾×±_}©ïûÔ0Œí•ÌŽŸZVÀᨨœ•Ó^¡²_ ’ü D+ò9_÷—ÿ»‹wé6o¤ø«];îI W{Kp<¨$mOz¶-Jï­¼ˆÛÊCÝ Ø¹K)ÀPÇE\p{À@ß •ugRªÝKoä¬Ãù³Ôƒ>{Îòt'wúVåd*PѱBÅX+¦»úש|cu~£8§2y5}ŒÞÒ.Éç_Õ YÛþ.¼`ëI¯PQ'yR TR:¿”¿»ÕùžÊø12¨èëçtï7¶=^:Æsû9ë÷‡{ŒçtƦótgÿ>=v ’µç/åXèzNQ‹ÚfµÆQhÍÝ߃ºeœï÷}ºYX¡’r Â 'Š@…@åĨ$ª¡RSj¨$š4 ʬû*×þ„Üü)¦€µßg¿¹²5€û)ÐZêõ~ʶo ¥íØíÙ6P)uV?¿×v/õ*j`ý€n–;±[飧†J³hIg<ñÆŽ:iáQA\™md*PÙ¿†Š±ÜýF²ã¥c$uèKVÄñ\Ûº yýU'øÆùÚõ>þÍBýŸÑ›ÌØ·v‹ò4n\(c3¦°©¶ïøþN¨x•Ñ+Òr–ò&yZJZçWhÇï)Ÿ}Ï÷½'È4õó¡ï7b—ŽñœÁ~Îúýá®ã9•öh÷bµ=›æïÁ*†alù}ªŽÇ-çNpü¨;'dáÅCHŠ@…@åĨ$ú7ê Ò¯b·ÉûÚÛ+úw˜‚ù÷ÅúúG0ž´Ãn¸L)w•åÕQÌQ… ÷þ[Œ{*êþÏé¬H¿=gRé¼/'W¾ÄéÜìµúcÛ@emOåÉ?)†í¡ÝØv+³?—úvÜô!¸=æ•t¼âõOÉœö N¥÷P¸¾µHÐùìïÍþ-³Þ~cų¶Ÿÿ1öWV'€¾eÞØ_»NÅ>*o o¥äáð:#©ÉW½>ž'ý® £ŒÿÅðVšcå|‰_Z¾wBþÍJ©›d[±3©yoyn~é½oIåüŠ:1ç»GçøÙ÷|×0A¦¥Ÿ~¿w¼tŒç ö³‘ñûÃ]ÇsíÑyž.ÇÊö÷Qÿ>Ýùú£ëy'{Ï_iÈÕV¡íϵȬ¬îa¿d`EßÃký¸çbuý‡AwúÞ-i¶§pç÷[\÷=¸ßÚ:PYÛöë[¦ÝßOfáÖ/¿xŽ.^¯ásù[}‹ÓÞ|;“²í÷ó´“æš:¬äûÈ1/Ū]E¯hË[Êö!{¯«a’;‘aë*òMâeÅé\{‹îe»ý§µXŸrÝOéV~_SÍÂŒþu#²ÆÎ’_L÷Mz«¿á¤Q#Úú*’}h•}¹þv_IÞÖò½lû@eãMýñ]`€š¯=­N1PÑv~é:ßÓ?ûžï:&Ètô³®û ÇkÿñœÁ~6ŒlÝêÏ)´GïuÞØñ>*ãß§;_4>ïdíù+ ÊËRóÞTVag’—tÞgj¹Žéý>]ÿw»ìTqJãG­Í±Õd ʉ9@ R¸[Û;7þ­—”o8¶nÏÊ…4Ô7 Ýo™Ÿ¥kÿ“Vë^Ú¶-½þ‹Œ§_âº_2|#Ä”bëM)ˆù!ƒÎ½4ê–Ôê·Òê<¯=HýžXÖÝ?¦””‰j×ý”AçNê5Kjõ;i÷^½É²ÐfÔ’2îÎ^¤Ó´ÄªÜˆU«þ|¦Å·¸î—8ce?æÍv+7¸3çEzÒlÜJ½^•zãNÚÝgϾ×ÚÚIsÛ§Û£NBºçØv¶T 1Ìkåáé[ΓØÍ[©×o¥Õ}ñ·¸s¿dÔH¶\|¯Ï•»ñ÷lw¿e6²¥Ý¼•Fëa½åü)Y¸£…úVqÌÖJŸiµÍ…#ΰ#öϹeYï|wþgv"Þý5q5}•~÷AÚ­{iµÿ‰ÝéÈ`ô±œ´s"ö†WÎÛŽÒ¯Óg±›?m³jUi4ï¥Ý®¦BlNý<Ä;ýiÖ-©ÕªÒܸNì„æJ1Ý•ñ¡·âS‹Æk sÔ}úÝÄÇùçXïÿ½Ò¦òz ’lÅç¿"Íý–ÅäIìfUj5KêÒ.¯g‹Oÿ:”f ¢ëüÒx¾ë?{žïšÞ8Þ¿Ÿ5Ýoè<^{ç,öóª¯3r¨mýÕ¾]æNhü¨Û”Ò« i P!P91š'&Ô½y“úU“Dç íQÿÞ…Ô{ ~OX òóùJ͗ߢk&2j…Ý„ê¾!;—z߉l˰y㢠ÑÌk±øÏ“ó&ß‚¿^G¬ù›Øoßi•f{”›ù‡^¡²úŒéN¢>Û—ŒÛ×ÉoÆ÷ü\fñN†ó¨~~•–Ž7@·ào™ðóÆßV5¹jâ14éY±µ™ÌÒ½ gI~_Âðç×›¸¶Ù“zkÊ÷Ȩ*•Ö«ÿ `Ú=÷¸îëÁWàä¬goË–¡®ú;êäû½Ý™{ïlÔJHh1 >gråǘïæ7i—/¥±ú^I9P1tœ_Ï÷TÆÏ>ç»Æ-\öîg÷º×^ã9£ýl’™ûCãYc{R9OwºR®oóŽXVôx<Ê÷éNÇK÷óNÖž¿ôSkþØn›j-× ­Êž×g­ó§0~Ôóu"ý˜­Þ kTTN Jò)_®T•vïUœÙúŠ•ÅìSœaGìÆb&ºÌBEZ½—µß±˜½Ë°w/µÈIã4nÈL)Ö¤?þôoÄŽ8ƒG©—Îdm?Ö°UIæ…ÔÚO2ž*^ Gœ¡-ÍÕöhÞ>ÊÁ¨fþZíŽ Æ2ÛœXŸŠ3zJÔ·º¤×ž3)Û«·;Ù[„vT C ã\*M[†ŽãOhÏ?eøÊ—«?«™&ŽÌ7Þò\Ì>dÔFy‹·=Ís©4e0þXÿ} G&ãéÙ·R)l:™—R³7Î[÷Kf“7vo²BÅY¾íš+U¥3x“©w®Md:~ú½»ùm+;?>ÿ™\X,ÀPaFd rn¸ka®Cyã–@­ÖUê(ªRGq*'‘2¡'ጥ‰¥&Ã#/Å,~yŸ¼5o›ç·°yyu_Îë=—ÔwñÙ4S M]Ižç«si¯hž|HHŠ—±†p]VÃ-Q*¹¯áTÎ,®¾³ÿ¹ã7¨¨×²¹½+½~âµô_ÈÁö}iνûó.©Á@AeÆÃ×—Ÿ¯÷PÏÏŒý×»ï;ñ]¿yøû†¿Ï—ëó\ã÷ùâë­?ÌþóY>Ï^^O¨¯S›¿G%¾¿?•VcFsMÙ{kðóÔøóf]¯ÿþò¬q[¶’ÿ½bô‹êc8~ßðô}ÌË÷çs€Z??ÉýO½æW@d‚ `Š4– ÏŸï/üf'bÝûÎBNÀ4K^ùµ+-Ï¿tÄÏS`\—Õá5Åf'“ .*ÀTiÈRçh8Pدz Ý uµH¿#Kh z!ƒ ?OI0·ötxÓÀIGooÔ A… ˜6›²~ ~óë¹´µ–#†±EémóëM˜á‚ ?Oúk,>^õu~pOŸ&A… ˜F³‰e¶çOe½dç"hÜ–vo4Xªz=Õ Tøy Ô^cážì«3݇²eß$øAP!¨¦Uã–l¨“*绲ÁI•¨f—–emµ%+­–¬®?”½áðçTº›ü6-`Úù *ü<&Kcñ¾\Ä”þÁ}Yäd € GP!¨€à²¸Õ|’ú{we>úë 4A…Ÿ§ .‚ AT`acWÎ΃ŸÞ®l¯ß–Ù¼6ÂósB…Ÿ§ &‚ A” ¨T@ ‚ A” ¨T@ TTTùîw¿;TTTQsú^¯'~øá0ª¨¹þÉɉ|üñÇùÿëׯ‡QEõT~ô£ ;BYTQ]B•dTIUT÷PA%+ª¨~BP!¨ … BP%*P‚ BP%*P‚ BP%*P‚ BP%*P‚ BP%*P‚ BP%*P‚ BP%*P‚ BP%*P‚ BP%*STTT!¨àIPQóz‚ A€+… BP%*P‚ BP%*P‚ BP%*ÿïÿ‰Š*åªÕQ*5x¨;‚ A” ¨T@ ‚ A” ¨x*?ùÉO‚•ÓÓS‚ … *ª„ *?ùÉO*ªAP!¨€‚ (AP!¨€•DPQQ… ’®ZPQÝ„ BP@Aå •£££è “àè舠BPE*•7oÞx**ªØU*èQAEÍÙm‚Ššïû *ªCT*DGP!¨€•š•O>ù$XPyùò%AyAååË—Á‚Ê'Ÿ|BP©"¨¨¨BPÀMYPQsy‚ A€+‹ ’TTTÉ **ªTj¦Ñ”ƒÁ© Ïde¶¯gâ5¤up*ÞSL³Ù;²Õ;•Á '7¥ûõ ¶¦%¨¨Î‘TT'©,¨¨¨BP©AÅ3‚ ¦_£ùDÎÏùÉY¨Ák@=MBPQ}âÊULƒŠŠ*W3¨4dné¾t§2¼vë¶,.\—Ù诫&7duó¡l®Ü0øÿ#¨`ú5ɉ *Ë2Wƒ×€z2 *jnoTT' ¨X•ׯ_T²4nÊjgw4½äXNK{õj_åÓX|$gƒS9ß»cð>Tp4d¡u|}Ç IDATO67–e‘gB•ׯ_Tª *¯^½ºšAeöŽtzy!eÜù~ëJŸV™ßxñî} ¨€Û ¢æø‹ ¢¢ AÅECšÛ½a09Ù¹'ÍÅåá•Õùë²°Ô”õÎéž½Îb£¯9–k²zxJPu *ª3LmP9??Ï **ªTTTT™ø Ò¸#{çÃþî=™Ÿ™a)}žÙæð½"¨€dPQóöª‚Šê é r~~NPQAEE‚JÊÜÝ‹ô§rÖ¹õ.D *×dåâÈÙÖmiÌÌHc¾)Û»rÒWA¢''‡es%o—KCš;êÄÍ‘´Êÿ½j/Ê`p*ýd(¹.­õ‡²µ·+ݓޥëϲ=“ÕKïY2¨ì¾{OçîÈúÖSé®S;{!Û÷¥5¯w hvqYÚ;»c£ö\ö·Ê>ÆèõôwÞ½Ï>^Ït¸&­=õ¼M§ç'eö–¬¶ËA¯+çêyéIw¿-ëÍëånþô§2<—õ¹ÑÇ\ë<‘îØ3ðBvÊZÉi²¹¥»—žŸÁàXú'Ïå`¯-›«·e¾Qðzf[r˜w5`ÑûÀó på… *ªLlPQQ… RC³­‹xr*ç{ÍÚ•Áá²,,=Æž,g;-™Ëø8ÅöpÀ}¶u«d°ÛÅ­îÅÇìÊÖRbØÚhʾVD1*çOd¥ù@Ï‹>Æ é4¯¾OÍö³ÑP>SWöÖò£ÓðõtïÊ¢ëë™.æcé«+ð6o–üó Yì¨ç§'ÛKÙÃúÙæCé¾Ç§r²³\0†A¥+ņ4îÉ~?ïãË^+/\—ÖÖ ­ç¹85e?çÏdTxž®ši*ª‹TTTT TTT¹ÒAeæ†lôFƒÆöÒµz•ó#997¤>Ü~(ëk˲²zW6:Oå$1íµ³‚ÉMÙT¦þci ©·e[ ¥ÏÉbꟽ.ssî Ïù~KæçÿÛеŒ×“<¡Ò½øsJÿð±´7îÊêʲ¬m<’½^bèÛïä¼î†,¶Ãðó²·u_ÖV—euõžln%ߟc9X¿‘ù1F¯çHzN¯g %Ÿ‰“‡²PøÏÞ’­3õü´/=?333ÒXztBÞ}þÏóz»#‡g£÷ùl§)³yÿ®aP9–½ÕeÙþ{ŸËþNG¶¶Ú²³÷TOŽex*ããÌ­îŽâÅÙ3Ùnß—µÕ–¬¬,ËÚúéììJ¯_ˆÆßƒk27wC[†Ïž~Páy¸Š|5çTT· ¨”U¦7¨ÌÈlkôùƒÁ±ôöŸ^œðˆT†çò@·±pO†¿þLÖæ.¬¹õçÃ?ÏþJþo£F˜[ë*ïnf„ ÆMÙ8}ö[—_wcq4´œt¤•ñgŸ™kÉÎpHÿ\6æÃ½žéԥĩ¥NÁÕY¥Äi¨NÖ{x[:êsqþTÖ2>Vã–lvÕû\1†AåTç§6Öoe˜ÆlÞç꺬£å“‚¯ï†Ì-ÞÌ;YæÁQ3¨ð<\M:AEÍç *•šiÈÂÚ㱓j¸{Ð^–¥¬!gãA¥¿};w(;¿1ú­öÞFÆo­Ï¶F×Þͼìݾ•ѾŒËƒÚ_A¥{_æsþÙdà¹|]Ù5ií«×›ºžìÒÇé ?N;ýZ}½žé•Ü‹’J.ÞÇ¥íâ}=³«»Ã÷ù`õzþ¿/fÎ÷sN©$ƒÊàTºeבeIœHë=(>}cÊ8¨ð<\U‚Êä›»-ë[»™a¥»}WƒŸVI•žì4 ®š¿?..g“ärúœX2Û”½Òè’|ü•ÂÁúÌÜÝÑÞ˜ýæø¿#ùz5®¢žŒ¸tí™§×3ÕnJûD]‹•}•רÕ`™q⚬ ßçü+¸Þ}¬;£Ïm¿#KYÿ¾dP)»Ê®èYÜEŒ•¬+´,™žg€+‹ âTTT©CPù裌ƒÊw¾óè W‰EõcΞÈjÙ)'É ò\Ö‹NÆ4nËN¿xà\NÒ¾üÛü³+O‡»$ŠN y *Ù'2ßûƒÔÀwááhGEé¿¿‘øíÿ#Ù\ðz¦ÜÂæQáé‰äi‡ÌSRÛ²¥žÑþYoÝ‘f3Gëžì Ìç\µ— *-³ë¸’¯;yÍÖàTÎ;²Ñ2¼Þ+‹iPáy¸²Ô\Ý$¨|ôÑGµ *ªkT4‚ŠŠ*STKé×–š²¹ß_Ý{¹×é¸K•’ß蟹)›êÁà©´2[?±œþ¬ú­ÿÄéó§z»b¼•ç™;_.¿÷—¾æ“aÊ DéçbG}ÞÒ§}ü¼ÿ®Kk³-[[%6›%§‰<}œÄ)¨Ë×Ï%¯‹{.ë™' rÂd©œÏI"¨]‡§c~¥-ÝóÔ¿·ÿBö:w¥9¯±ˆ>óëÃ,¨Lÿó €<é ¢æî•DPùì³ÏjTTT) *|ðÁ• *ïBÃuY;ÈûípŸÆƒJv$Q» þÙÑrúÔvnY‡q$ggEš— ’súàÒ{ŸTZO‡ÃïÌ) muÂâXösÐö¯Ç¿Ä5[EÊ®‡òöqnȺZŸ¾fJ纸ÙÑ3æ;¨xÙÿѸ)+í'ÒK‡•Á±ôvîÉ’é¦AeêŸgäÉ *j_TÔ<¿ŽAEuèAEEÝ ¢¢ AÅÂ¥ 2#³­Ýá0s¯h·‰“dP)ŒjP™[N¾?º&iníÙ0´l,Ã;¨ùþ:  ëTÆŸ“ä{8Û}.rwv̶FA¥çád—ï 2tMWîËöAwüýé?‘Õ¢Ó—¾>êpB¥NÏ3òTTT/Ð *ªGT*z2‚ÊܪE€0– *9‹ä‡¯±|‡Ê;ÉåôÏ.Ä×G' ÿS"•0;'@;ɤÞók‰ÅîWÓ%—֛îêÉþÆ­Â- ­Vþ2xA¥qSZ+·Š¿ŽçZ‰ëô\‰gTfxž®¨AEõƒtPQ½!+¨¨NqeƒÊéé©SPyùòåT•wCÜ{ÒÙÙ•îIw¸$zxJ¤»+;{Òšµ7eüµŒ‚Jïâ7Ò{ÒÝy(ë«-YYY–õΓÑvp*½¶æ`9±œ^9\ËY&ž+¹ûT'O¤½Þ’V«)­•eY[¿/››Ë‘ÆçÀ·! ÏFŸ§ó²×¹/k«-YY½+©÷§»™õþ0€6“8IqöDöÎT\¹­õ~4 CûçfWv¶ÊæÆ}ÙØ| íNGö^\<ï]é,æ|­ù*³êÚº®t÷;ÒÙ¼'«+ïžaõüt_'ÝÒÓ_É×wolÇÞižg€«(+¨¼|ùÒ)¨¨ùÿ• *oß¾TTT) **ªL_Pɱ”¾‰ ÒïH«õhl˜šv²crb&y½Ð© »'LfïH§—ÿš²wNøø6dqýép/L¶žlä Ý@›j,®œÒ¹¢êÒÿÿâ}Ù?+ú|Neµó®¡óTÊõ¶ ¾¾’;Œtuïå|<žg€«¦(¨¨y|QPQsýªƒŠê‚ÊH‚ÊùSi5f¤1×”í]éõ‡ƒÕ“ÃÇÒ^¹i< MÅ‹—‰—½?7e¥ýXO’æXÎzÏdënà*‰?Ï|S6¶ŸJ÷ìxø:ÎÏžËþö}Y¹t-Rø×3Õ·e«Ÿð›\…5ü×¥¹öHö_H?yZê¼+½Ã§²Ý¾+Í¢“`žv¨Ì--ËæÖ9ìuÇ_ÇàTÎÏ^ÈÁÎCY[*9½å5¨ð<\5ࢢJ]ƒŠŠ*EAEE‚Š/É+¿v¥e:°.1Ú£r,;Í*®0¤© ¢æìEAEÍëëTTï˜Ø òÉ'ŸX•W¯^TfnÈêæCé´ïÊ‚ç¨Q,dP¹!ꪮ~G–*ýs› ¢æ÷6Aå“O>™Î ¢Óç•7oÞU’AåõëוZ TKíᎆ“¶ùua?|•ׯ__ *ªèÕò‚ŠZHOP) **ªTB T·¥Ý}\«eô/Ê‚ŠšËT,‚ŠŠ*®AEE•dPQQ… R~‚ÊìÒ²¬­¶d¥Õ’Õõ‡²×-Æînr:bòTÔ|?TTp *ªK *?ýéO%+ª„**ªüÏÿüÏ0ª¸µ˜¾(¨¨¨BPñÉGPiÈâVwP’ú{we>úŸ®¶dPQóö¢ ¢Ò»ÕTL©"¨¤cÊOúSû ¢¢ŠIPQ‹é}UŠ‚Ê|@P ÆÏ •…]9;O„”Þ®l¯ß–Ùè>@VPQó÷¢ ¢æø¾ƒŠZHoTTßðTTT™æ òþûïG˜j®>ÍA%ﺯ AEE•ØAEE‚ ît‚ŠšÏÇ*ªWL}PQQ%/¨¨¨bT’‹é *èKµ?Å4¨¨9^PQ`₊Š*±‚ŠŠ*.A%½˜ž €™¼ ¢æð.AEõ€XA%¹?%XPQQ¥(¨¨¨âTNOO/ULƒŠŠ*±@&Š)6AEÍó“AEÍý]ƒŠêEAEõŒ‰ **ªüøÇ?F•~¿/ý~ßKPI.¦'¨àN7¨¨9½kPQÝ@ÅTTg¨mPùì³ÏjT^½zEP Ó ¢æöu*Éý)^ƒŠ:¥¢TTTñTÔÝ ’\LOPÀNQPQóxÝ ¢ö§ø*ªOè•ôBúÊ‚ÊÛ·o½µGå‡?üá0ªø*ÉÅô±@&Ar!}ˆ ¢º@rŠkPI.¤Ÿ¨ òæÍë ¢¢J2¨¨¨’ *ÉÅôé òÁTj­!­ƒS Ne0x&+³±_x2{G¶z§2ôä`ã¦4b¿\ ó¤7P?WÇlÞŒÿú|áë *“*jîžTÔþ”dPQsýdPQó› ¢ºC­ƒŠŠ*é ¢®ý² **ªØ•ôbú^¯7¶G… 2 *¦S£ùDÎÕ0ûä,Ôà5á ˜¿'‡çÓTøú€ê”5—O/¤w *ªØuÝW:¨¤Ò×&¨¨¨’TTT©2¨$÷¨LrP™_‘9 QÎûGÒÝïÈæê-™‹ñ7duó¡l®Ü0øÿ#¨èš[Z–Íí§rxÒ ‘=9ëîÊöfKjñÞݵƒÑ3y¸z÷gŠÍ..ËæÖ9ìuïùÅ÷¢ƒ'ÒÙhÉâ\ü×iÄêûX¶Æâ#9QïËÁrœïËÐÔæÎñðîïÜ™‚ ™»!‹«O¤_— Â×WÍ]“ÕÃü¿g^rМ‚¯:’AE]÷UePQ]!+¨$ÒOMPQ{Tª*y‹éc?€¶Ê‚ʘ“Dz¶Ð¨ôõ5ÉÙàTÎ÷LQ•2ù–t{åŸóþ®l.U0²Ì¯í޽¦*‚Ê$½?ScîŽlîw5¿=“õù¼fÝçÉêûXž†,´îÉæÆ²,ò½­Þwd§Ÿü~Ñ‘¥F ^—ŶœÕ$¨ðõUwÙòÒÇ*j AåG?F•ÿþïÿ[L¯‚Jr1ýU*'Ûdcãþ…Òîtdï05àì?–V…C†ùw¯ âÓ YO7ú/dç‘lnÜ“µµ»²±Ù–ý“Äÿ~þTVc˜¿+©aKø 2AïÏ”h,Ü•ý~j¨vö\öw:²Õy$­Žì¼p'í7Çí¾aÒ5–:ÃSêtÛöRµ¿”ìÏV£ Â××$hH£12·ö<ñ3ýúØÿÿµ¨Š ¢æûÉ ¢:€Š)TTTÑ **ª¤ƒŠŠ*!‚Êéé饠’\L¯‚Jr1ý´•ýVöÈÎ.Þvž´«žŒ~«‘ âÙü]Ùë>•ÎêM™Íüg®ËÊN7Âç«ôÔ)€zÒ *j>Ÿ *jŽŸ *jÞ"¨¨N‘*É…ô:A%ÙN~úÓŸÊ{?ûÙÏ$ï”JŒ Òï÷‚Ê«W¯.•äTTT‰ýÚÒ *3332Û|<úMÛ“‡Õ,jmÊÞ9A%š¹»ÒUŸóîÝÊO̯««¾žËFó~µAeÞŸépMšÛ‰«ÕÎËÊ´ö±þ>†‰Ö¸-Û¿ˆÐßiÉêþÅ.•³¶,NÁµ_µ *|}M$‚ €™™™±…ôÉ ¢æðÉ ¢æõ¶AEõ‚A%ëtÊÏ~ö³â ¢¢Š ¢¢Š **ªüøÇ?FÝ ’Ü£bT>øàƒ+TÆï‚*­á@¨!Í5=’öBù¿SÝwþnД€\—ÖúCÙÚÛ•î‰ÆþŠ‹`²z)˜$ƒÊî» 2wGÖ·žJïl´ øüì…lß—Ö¼Þo»Ï..K{gwìcôÏžËþVÙǽžþÎÅo'{x=Á5š²¯ÞçÞ}™¯òß=oxÕ×Iû–Ì.<. ®Íð%æû33#s«/Þ“#ÙY½ýãX™¿7ŠRƒ#i/º?ûñ¿N}}»0ےÜÿ¿s­%ç¾þ\¡ºÑ]Õwi‚£>Ʊì523{[6÷äü⊾õ[ÿì5YÚx"½þ»öì -«}M‡ƒ•k2·ªqW¶ Ÿsÿ?/fš²ÖîÈ~÷HúçÉÓ`GÒ=èÈæJÞI<½?_yP©ãß|}}e¼ö…¦ll=‘Ã^÷Ý39x÷üõÏŽ¤»ß‘özKçŠ?osKw/} Ž¥ò\öÚ²¹z[æ'8Ì™•pòñù`'TÒ éM‚ŠºîK7¨¨Ž\H¯‚Šê>‚JÑu_ÚAEE•¼ ¢¢JŒ ’Ü£¢>AÉ=*W>¨ÌÜ”öÉh8‘‚%+g[·J YÜRW%ue+yŸ|r@­­$¨œ?‘•æ9Ž…ÍÑ÷Ÿó½¦ã{X“¯SoßÇ.Ì6e?çu˜·ï?u *§ÒÛ¼#kÇ©?COvZ×e~ýÙå?ßÉ£ Nˆ$Î={·ciîîppÖ)ú9éóçÅ5iíi=ƒýý»F_û¦'Tê÷÷___I×¥Õy^ò=èTƒcÙ_Éûœ]—ÖÖ ­?Wß2øÔKPñ÷÷(Ÿ/.tƒŠºî+T²ÒWT’ûS²‚ŠÎþ”àAEEÓ ¢ö¨üð‡?F•³³³K‹éÓA¥l1½ú'÷¨Ä~méŸP¹-[jÏÁyò„ÊŒŒ eû¥Y4¬J\ƒ28»<Øš½.ssF¿½~¾ß’ù¹Äÿ6t-c ØuåDÝ]øXÚweueYÖ6É^rÜïä¼î†,¶Ãó²·u_ÖV—euõžln= ÕÇr°~#ócŒ^Ï‘ôœ^OE7eã0ñçªðäÂ誯щ…äo+×"¨D|ÞIÎS‡kø|}×e­›€7]~¸^_§~¾¥Ÿ¹k27wC[†ã âôçªgPœI¿ÿL¶Ö—emóÉðûÄàä©tÏO¥ðHÖWïÊæ^wøùßszÖ44nIGý¼RðçŸ[Ý øÏžÉvû¾¬­¶deeYÖÖHgg÷âÄUO¶—&÷Ô„SPñò÷(?Ÿ/nÒûS’AEg!}:¨¨¹¿Š)*¨¨ý)¦A%¹>zPùì³Ï&:¨d-¦ýÚÒ*ó†;,²®7šmŠ“¯‘ØÅR:„™[ J¬w¨\üûfÆoĦ†âû­Ë¯»±8® N:ÒÊÚï0×’áRíç²1îõ„ÕÙ¹[Ò\{(û‰!ûùÁ½êN-¤®úRïQrx/¨ÔàýI¼–d@èµ3ž§J?Ž…ÆÙþ†ñ®Ó®£ZZËûx‰²qPqùsÕ4¨ ŽeoøZ²´•’&O£Ì¶†'NÚaw~$p2RŒ~Þ]{åù9lÜ”••[¹§¿f[‰ýhWÚìP©×ß|}}]¼+O'žK»•Ù27Ÿ:eU}NÏŸ|m4dnÑüš¶:q *î_~>_\•-¤Ÿ´ R´ÞKPQ§T²‚ÊÛ·oKƒÊ›7oÆ‚JÖbz‚J9½ rCÖöGWªô²‰aÕè7rÓÒÜQçEÆ@3ÅWP鿉’ƒ›Ë×\“ÖðϺväÒÇé ?N;ýZ}½žR'ÆKw{Y*ûÍ̲®!êª/õ¾D *uzÒ2·pK®;>'¾>Ž¡ÙåÑî§EÝ5ÿ:>ðõõçªkPÙ•Vò ÊæhP:NnÈFÏãç¡ÀB[]³•ú97ø‹ ùQ§êŸ£÷e|?Z1«¥ôµú{BÞdz *É«{²mýˉÏEïA…§«çTœ¾.|}¾¸ª:¨ä-¤ÿôÓOÇÒç•äþ”tPÉ[H_iPQ§Tª*y‹éUPIîQ¹:A¥!³ó7¥¹ú@vº‰ûéÏ:ÒÌ€%—Îæ Af›²W:LIðT‹®cš»;ZнŸü%_oÙUHÉ+^.]áéõ‘ Î{O¤½’·k"Ô³¨,——“×-¨Äx¦Îü½Ñ©·‡áaÝ¿N£|}ý¹jTRWB%O‡Œ J¯~û?èΣÄ÷ŒKÏõMÙÌýß?‡ÏGsïxøùÈÝ5’bTjõ÷„¼gT¡¬hЯóþ´öFqxgEÿ ¶IãTœ¾.¼}¾¸* *j.Ÿ *é…ôU•ôBú¨AEE ¢¢Šúªk¿Ê‚JÑbú¢ òêÕ«KA%o1}ìÐV2¨”ê?•õ…‚ßþNX2~ûvvåéð7‡µvNx *EW«ÌÈÌl+ð—X:^þïo$~KþH6¼ž 2ßlÊÊJKVVZ²ºv_Ú[Oäp8t~&[«„ƒù{ÃÓ '×NÅ *5y¦Q2¨¸ü6vÝ¿N£|}ý¹jTÒ×T Ÿ‡žìŒVº&+*¨ * †ÏcÖÏÁäé•ÍÌÏEÕ?/²4Œ¡ƒJþž÷ñ̃ÊlKíýr¿NnìúÂÁ©œvd£5Ù×{eqÝ¡âòuáóóÀÎBú?üðÒBútP)[H_TÔu_*¨$Ò—•ôþ‚ Aeø¯[we±tÐ’¸Fá¬-Kc¿ý}MVÔ Ÿ?ÕÛ—à%¨<—µ¬} JÁà/ÿê˜ìçbGÝÝŸ^°íçõTëš,m>þù7BFƒü«¾”zìP‰õþL©Ä×wñ’îbµÿ:>ðõõçªiPé¦N1 ƒJúú·j‚ÊÂæègêÉÞ#étRvކÿ{o#ë‚ÿç°1GÖÚÙïÉÙpoQ–ðA¥>Oðõõ5#ó£ÏùAÁn]ó+mé¦?Oý²×¹+ÍùÉ]DŸäTܾ.|¾Ø#¨8UÒAEEÝ ’^L_Tòö¨¨OTÞõ‰V×~Å~m%ƒÊÉö}Y_¿wᮬ­¶¤¹xÃh@1Z:›VÎö%œï5õ†Y^‚Šýà¯ÑzZ2ø7úÍãcÙÏÔº "«v]V‡¿Í¿[<Àpzó¯úRêTª{¦VãÎèjƒÝ iµÿ:>ðB|tÉý8šAe±ê ’ÜG¢!s ¼Ïçðš,mÎK¿ß•³³wF˹«*uù{‚¯¯¯E÷ IDATYØÌûžâ qSVÚO¤w)€Koçž,i~žêÊ-¨¸}]ù|°’¼î+T²ö§$ƒJÖþ”¢ ’·^'¨¤Ò« ’^H_û ¢¢Š **ªd•ªÓÇ~mé-¥7X:{¾?ZÍ­=P¶ –F‰T‚üæû$•™] =‚ü&grIñÙ®loµe+ËÞè9ít.þïd£¥q%Ì$¿?S-9|îJ''¦•©ý×iôoŒ 2Œ‡ù85 *ÉÝ Z²öˆø{çVG×g ΟËÖúY¸ôñªÜ¡¢>¯uø{‚¯¯¯Ð'®ÉâÊ}Ù>èŽ?;ý'²:Á?fPá„ PU.¤Ï *ª+¨ ’ÜŸRiP)‹*eAEE‚J5¼•±¥³Ï.þƒÿº¬wÕм­µOä f7ÃdÓßþ7f<€wÒŽ{ÕVð÷gª5di«—ø\^Þ£¥î_§Ñ¾‚ÊüƒÑ×uSÏ 2úyšŽuãÍÇÃS#Ýõô÷ _Ÿ¯ÄÕZƒ£‚`ÙÖþèßWIP©Åßò>žÅ••ÄNã÷B_c¡%ÃÑ÷ÌdŒš41ƒJUŸ/å&1¨d-¤Ï *E1e,¨˜œR1 **ªè•ô•² ’·GE•¼=*•Ë’ƒ–îÚõ±…Ñбë?"•ä•D'‹—f7nIG-*?"ÍF€×ùùè®8 2áA%øû3åKÑuDçOôv&¤ÕýëÔúûXÞÇ‹T†ƒ÷â³­ÄɈ §ŽAåÆ(\z¶Rf›£g¶{oüõ{ûù•øß ¿.nÈzoôï«&¨Ôáï yÏ<¨$£îåϧg›Ò>Ñ|Îj,fP©ôó P:¨díOI•¬ý)ºA%¹?E'¨$÷§˜ÝÓ)VAå³Ï>s*oÞ¼ *1ÓÇ~m…*c¿{xW‡×x¼HýFx‰±ûóM`þˆ£ß¢M/8×hŽ×ï~ŸÔ 2~%Ó–Ö•LפÙy~1=–n玗Á¥ý•0¯Çþýñ©!³ ·dqÁõÊ_Çõ=<•óý»;%Ê_­¿N­¿åˆT·ò®KKº&+ÃS@¡>N ƒJòó²_¶ÿ㚬äF¥A%sWË…ùûÃ×]eP‰ÿ÷Ï£nPI†Ú’ïAîÆ¯hÓÐ×¥¹zWÖÖÞiE^n5¨û|…üû0ê°þÓO?ÛŸbTL¯û²*ê”JVPyûö­VPÉZLï;¨$¯ýÊ */_¾ŒþÚ T’KgŸÉ¶buï™ KÇ~›ü©Á}á>“1qåÌIGZY¯a®%ÛÃÿ8!› é÷±fAeöŽln.Ëbáûy]Z[£gcpòPï –ù{©'ÏeýÒŽsÖAÅæõ„|¼iÈb{ôïïÙ^—åíã8|n—~[xp*ýƒ‡ÅþÙ²0—úßëüujý},G´ ’:1rxO2žù¹•ÇãKЃ|œú•¹µçÃת³—avutíÐáØé6_A%94~–ý}oöŽtA³Ú ûï ¾¾¾Ôçôùôwec)ÿhÌÝ”ù¬÷¹qSZ+·ŠOL̵d§ñï9{dp5ÚÝD8;•ÃÕÈûÇb_Ÿ¯´@ÿ¦YÖBúdPÉZHï;¨¤Òç•äþ”tP±ÙŸ,¨¨S*É ¢¢ŠnPé÷û¥AÅǕؠ­PAelÙxæÐHGrô© NžH{½%­VSZ+˲¶~_67—3†/>ÿû! Ï‹}_È^羬­¶deõ®ltžŒýtw3k ]³ ’uŸÊv笯ݕÕÕeY]»'›[Oäð,ù¹;’Žæop&‡l>OnØ«×ðýñ'qíËEÐ)¼ê*øÇqÑùõÄ€=ñÞïl=’vû¡´;mÙÞÛ•îÉqηÎ_§¶ßÇrÌßÛQ|þf÷ÙîÞÇóÞci¯/ËÊJKV×ÈÖþÑÅû4ŠdA>NÝ‚ÊuY;½ÇZCý¹»Ã«ª‡É?ƒÇEí£ÑswöT:ë-i5ïHkeùÝ×Äù© ÇÒ=Lì3Ñ *KãAÅêgUÔ¿'øúúRnÈZòDÕàTΟÈVûllÜ—Ív[¶wžÊáɱ Dz—u2kV]_Ö•î~G:›÷duåÝŸE}ë&Þ¯®ÁÞ®±ë/¢ú“R/îøþþìáó•~ýý˜f¾ö§•äþ ’ÜŸ¢‚Jz!}-‚ŠŠ*¾‚Jz1}2¨„ZLû´,¨Œ]Ãs*ƒÁ®ÝoŽ^ú Ú”Ì;Ä}ÿ‡wCן¦þC9­'y¿Ý_· ’ä•é?“vÓìDHwìcÄ?¡büzB¾?ÞÜH,œ>•AïÅUY>?Ž»ù•Grx®÷¾gÿF|¿N­¾ÍØí µ“ãÂìÒ£’×ôL6—nÊZ7äÇ©YPIìñ¸ôz ¾ö†;WÆ"ŒÏv[ÚÝ¢÷øÝ×Ãì0Žd•ÆRê´†ó}½ÓSñþžàëë+ù~ßÕí§,¨”ëm·ŒvŒN_Ä5Y=4xs~¹Åû÷g×Ï×¥ç)Ì߀iz!}:¨$÷§ø*y é+ **ª¤ƒŠŠ*É ¢³˜^½aº‹éË‚JÑbúØ ­pAeü7"Ëï”/и)+íÇrxÒûܳÞ3ÙßÊÚ¹f0Ú˜oÊÆöSéž~«ñüì¹ìoß—•K×…=NŸ›¹Û²¶Ù‘½ÃrÖO úGÒ=x,íµ;2o|Õ5Yjï^ çºrо}‡ŠÍë ÷þø3·úøbp|$;×·øú8^4nHsí¡ì<¿ô¾ŸŸ½{ß·6Нc«íשñ÷±™ZõonïJ¯Ÿxû/ä`û¾4çÞý;—Ô <ÈÇ©WP™K\ßÕ]×?50¿1úù{0üÚóüùjÜ•ÍÔswÞ•î~[ÖÕ5GÃ=$U•˜OðõõuÙìâ²lnïŽ}~Ûïþì˜[Z~w ²×•~*0ŸŸ½ƒ‡²¶d~Ч¹3z-=ƒ“-~Ô4¨xø|¥ÿœ!þþL3“…ô6AE]÷•TŠÒ« ’ÞŸ¢‚JÞBú+T\ÓÇ~ëhô‘Ç‹‡ÀUÄߪpS6‡W;rj@}¸.¤'¨dìQI•¬ÅôEA%Ôbúäµ_•<7dC]ÁÑïÈRÄßäuÃß*1«kÕŽe¯cçd ½>+¨$÷§|úé§cûS\ƒŠNLÉ *¦§TŠ‚ÊÛ·o3ƒŠÎbúdPI/¦'¨Ö¸-íá‚XË%³`:ñ÷„Ê wõœµ9 VB•äu_YAEg!ý`0È\HŸ *6§S~ö³ŸÉ{?ÿùÏ­‚Š:¥’TÔ)Ó RõbúØ`L³K˲¶Ú’•VKV×Ê^o´Ô³»Éop•ñ÷@Z¬…ô&A%½?%Tl¯ûúùÏîTTT1 *uZLûŒ§!‹[Ýá`$©¿wW棿>O\Vç…ôeAÅuŠ× ¢¢J:¨¨¨bTÒ{T’AÅ×búï}ï{ÑÀ˜6våì<1 éíÊöúm™­Ákqñ÷@ZÙu_6 éÓAÅt!½ *éý)*¨øZH_iP©ëbúØ “`’ÒODPQQE7¨¸,¦÷±G%öÀ$ð¹?Åu!}YPÉ[H$¨”E•² òöíÛÌ r1½Í•Ø “ Æþ“…ôƒÁ p!}2¨”ŔҠb{J%/¨-¦O—Åô.{Tb?€LûS\Ò•¼…ô*¨ØžN *¾®ýÊ *¾ÓûÞ£òýï?úÀ$HžN ½?ÅÇBzT|\÷å=¨”-¦× *¡Ó§¯ýŠý0 \ö§¸.¤· *>÷§ *¡ÓÛîQÉ:¥û`Ø\÷U¶?eRÒG *!ÓíQ)ºö+öÀ$йîËçþÓ…ôQƒJYT) *>Ó‡¾ö+öÀ$¨êº¯ é“A¥,¦hÛS*eA%ä•ôµ_É ’¾ö+Tz½^ô€I<òá‡æ^÷•*ÉÓ)UíOIÛÓ)A‚ŠŠ*6AåÍ›7¥A%Ô•Ø “ Æþ”O?ý4sŠnPq½î+3¨Ôq1½ëk¿b?€L“ë¾BíO‰µþç?ÿ¹¼÷‹_ü"hPyûö­ÑbúÐ{TÒ×~Å~˜y×}ÅÞŸ2 ´÷§Ø•_üâæAEE“ R´˜>oŠiP±½ö+öÀ$p½îË%¨d]÷e³^•dóðTªZL¯»GÅ÷µ_±@&AÈë¾BìO±YHoT|]û•T|ïQq¹ö+öÀ$ðqÝWÈý)*¨øºî«0¨T½˜Þ÷›k¿b?€L‚X×}•íO©b!}eAÅvJÞµ_É âzíWì€Ià뺯ýèGZ×}…ÚŸâTtÓEÝ b³GÅ×µ_Y§Tb?€L‚¢Ó)¾¯ûòµ?åÿ÷KcŠÎBzí R—=*!®ýŠý0 ª¸î+æþë Rç=*¾®ýzõêUô€IP¶ŒÞ庯ºíOÑ *±÷¨ä]û•*¾®ýŠý0 B\÷•·?¥èº¯ûSÆ‚ŠîA¥×~©¨û`¤O§Ôíº¯A%ÙP´ƒJÈ=*!¯ýÊ:¥BPÀLÑu_éÓ)U^÷UÅþ”_üâòÞ/ùËÜ â”JQPQQ%T|\û•wJ%öÀ$Ð9âãº/TŠ®û ÁN§d•_þò—Õ•ô)•¼=*¡®ýJŸR‰ý0 Š–Ñ‡¾îK•*®û2 *¦{T²¢ŠéŸ×~™,§ý0 \–ч¾î+T²bŠËBúKA%äUÊ‚JÙµ_*ª¤¯ý²=¥û`ø8¢‚JÖé“ë¾TPñq:EgŠvP™¤k¿L–ÓŸœœD˜:§Sò–Ñ×ýº/í {Šîµ_!–ÓÇ~˜U-£w½î+Äþ” ¢»GeR®ý:==ͼö+öÀ$Ⱥî+ëtJ¯û²ÝŸ’TªØ£bsí—ÏåôÉS*±@&ÍéÛeôU]÷¥»?E;¨LÒµ_¦§Tb?€L§S&íº¯Ì ârí—zA:QE7¨øZN_vJ%öÀ$°9âc}QPщ)ºA¥èº/ç ëÚ/Ÿ§Tb?€L‚ªN§„¾îË:¨üêW¿ºTòö¨T}í—îrz—S*_øÂ¢?„ÔÙ¾ð… §Sl–Ñû¼îKwʯ~õ«ñ ’uJÅvŠNT±¹ö«l9½Š*YA%ë”Ê¿øÅè"uöÅ/~QëtŠ *y§SL—Ñg˜âcJ²h•ª¯ý2]N¯¢JÞµ_e§Tþþïÿ>úƒ@­­­YNQA¥ìtJUËèm¯û“k¿Ô¿¨êk¿t—Ó›žRùÊW¾ýA Î¾üå/{;âc½ëu_yA%ïº/ã âÚ/Ëé]N©ËßüÍßD¨£/~ñ‹òÑG?âk½ë¾´‚J¯ýJFåô&§T^¿~-_ýêW£?ÔÑ׿þõK1ÅõtʧŸ~Zùé—뾜ƒJÌk¿|ïRù§ú§è%uòÿø•ìN©Ãu_ÚAÅ÷µ_¡¢JYP)Š*E§T~ðƒH§Ó‰þpPy1%TòbŠNP S|_÷•Tê~í—¯S**ª¨ òƒü@ö÷÷eaa!úƒ @ òµ¯}m87WA¥èª¯ºŸNq½îëW¿ú•¼÷ë_ÿÚ)¨˜^ûåUtƒŠË)•üàòñÇËÎÎŽ¬¯¯Ëßþíßʾð…è0!\»vMþîïþNþáþAvvväã?¾SBœNQAÅ%¦TuÝׯýëñ âëÚ¯I<¥’Œ*ü±|üñÇrrr"'''r||,ÇÇÇòêÕ+yõê•|ôÑGòá‡ʇ~(½^Oz½ž|ÿûß—ïÿûò½ï}O¾÷½ïÉ| |ð¼|ùRºÝ®t»]ùîw¿+ßýîwåý÷ß—÷ß_¾óïÈw¾ó9::’ÃÃC9<<”oûÛòío[¾õ­oÉ·¾õ-ùæ7¿)ßüæ7åÅ‹òâÅ 988ÿú¯ÿúÆ7¾!ßøÆ7äùóçòüùsùú׿>´¿¿/ûûûòµ¯}M¾öµ¯É³gÏäÙ³gòŸÿùŸC_ýêW‡ööö†þã?þchwwWvwwå+_ùÊÐÎÎΘ/ùËCOŸ>óïÿþï—|éK_’/}éK²½½éßþíß2=yò$Ó¿þë¿–ú—ù-[[[…?~Õ?ÿó?W.öŸ ´«8s)›ƒéÎÓtfsys½¼9`ÞÜPͳfŽé¹drf™žg&gjþ™œ‰&g¥Éjr¶ªæ­jþªæ±É­šÛª9nr¶{pp0œûª9°š «9±š çÉj¾¬æÍjþüòåËá\ZÍ©ÕÜZͱÕ\û£>λÕü[ÍÃÕ|\'¦ÔýtŠÏë¾ ƒJ•×~U}J¥lA½¨bTl¢J2¬¤£J2¬¨/bVÔy2¬èDV’ßhÊŠi\É ,yßT‹‹nd1 -¦á¥n!&äW€I{þRåìÆv¦;o+šÙÍúŠŠMD) )*¦¤ç e1%9cM†”dLIÎjÓ1EÍwmbŠIPq).‹èCN‰yÝ×0¨TqíWŒS*ɨbzJ¥,ªø>¥bUÒ§U\£JÕaÅ6®¸ÓÐâ\B…™B¿±Åž¿ÔaFc:7әř›ˆRUHñS’3ÞP1E'¨˜Æ”¢ bS|žN }ÝWfP©Óµ_é¨âTl®þRQ¥Ê«¿|D•²+À|†•²«À\âŠn`)‹,º¡Å6¸Äˆ0UóñžÔYìùKç9&3µ²ù\Ñl¯, ØF«½|†”¬+¾\cJÕW}ÙÄ—Ó)*¨¤cJ¯ûúõ¯-ï}þùç¹A%Ärú˜§Tò¢Ší)•˜QÅd¯ŠÍi×°¢sjÅ4®˜ÈbZB„ j.31™[ÙÜN' èFÝÓ(¶!ÅÇ©”¼})u‹):A%DLq9RÅ2zT>ÿüóQP±½ö«è”ŠúøXN¯UBžR©2ªè^ÿeUlO«Ø†—¸bXt"‹nhñ]¦%Ê„|ê öü¥sÓ¹™Î,.=¿3 (¶Å&¤¸žJñSB]óåûª/Ý ¢S|,£/ *ªgØ^÷•T\¯ýÒ]N_§S*“UL–ÕëžV± +.§VòâŠm`±,¶±%F„‰Á×ûPW±ç/uç˜ÌÖLâ‰i@ѹÒK7¢˜†“S)&Ëç¯JL q:Åu½Íu_àRŵ_>w©øŽ*¡‚JŒ¨âã´Jˆ°¢Wl‹NdÉ -¦±%Dxb°‹eÍØtfsE³=“€RQª )¦§RbÄ”PA%tL u:ÅÇu_—‚JÙµ_!–Ó_•S*¾£Ší`¾ÂJÑŽ›¸â;°˜„–¼Øâ]¦)΄~b‹=©ÃŒ¦hF¦;gÓ™Ù¹Óˆbº#Å4¤Ø^ñå;¦p:ÅÏ2ú¼ë¾ ƒŠíµ_:ËéëxJ¥Ê«¿t£JzY½iT±9­âVtN­èÄ›À"´˜„—*#LÕtÿÜ“*öü%Ö<ÇvNæNlJYD1=bR\N¥˜Ä”älX'¦LÓU_6§Sl–ÑÛ^÷5T\¯ýr9¥¢Þ§T¦-ªø¸L÷´ŠmXÑ+e íË‹NdÑ ->¢‹ S7!Þ €:‰=©ÓÜÆtަ3›+šíÍ‹ŠND± )®§Rt¯øš¶˜òtJÙu_e§S|\÷•T|^ûåë”J]®þª:ªd]vttäý´Šë‰Û¸ârz¥,°˜„›ØRU€© ï@Åž¿Ô}¶£;gÓ™ÙéÝS(6ÅåDŠÏS)Y1%9®*¦ÔátŠê¾N§„¸îëóÏ?—÷~ó›ßˆ¯S*E×~…>¥ëê¯QEç °¢Ó*U†׸’,e‘E7´˜Ä–ñˆÍv>¦;+›ã¥ç~º§Pt#Jèbr*Åd_Jè˜몯§S|-£ÿüóÏå7¿ù]P©ú”ʤ\ýå{Q½É²ú²+ÀLN«˜„•Pq¥(°ØD“Ðâ\¦1Ì„~/b‹=©Ó¬Ætަ3›Ó'yÅwD1 )6§Rt®ø*Z>ï{ý¤\õU—Ó)FAÅd9½ÏS*º êÕâê/_ûTBFÓ+Àª+.q¥(°˜FÝÐb\b…˜|½7u{þR癎Ɍ-kFgOòŠiD‰Rt®ø S|íM qÕ—îé”d;q:EwýXPñuíWˆS*¶ ê}^ý+ªØ^fsZÅ$¬¸ÆŸ¥,²øŠ-¡â ƒËlÌ4šèÄ×€âQtBJÈS)é+¾bÆŸW}Ù.¢}:Åöº¯Â âc9}ÈS*¶W¹îSñU²öª¨/—½*¶§UÒa¥hÇJVXñWŠ‹NdÑ -EÁÅGx™–PSå{CìùKæ2E32“Y›Îì®hö—7/t(e!%=µ )®1%9ÎÛ—â;¦¸îM±½ê«ÊÓ)®Ëè ƒŠërúX§Tl¯þ²Ý§#ª”]VUX±+E;WÊKYdÑ -¦±E7¼ÄŽ1±~˜LƒØó—XsÛ9™î®lžW4 ̛曈RuHѹ⫊˜b»7Åöª¯§S|-£Ï *¡–Óû>¥úê¯:E½*E§U\ÃJÖŽ°bWl‹Nd1 ->¢KÈ@Kï@L±ç/ušÓØÌÒtftes¾²€âQtCJz>jRLN¥äíK©SL }ÕWN§]÷UT\–Óû:¥âûê¯Kê]£Šî^+ÀlO«è„•ÐqE7°ø -®Ñ%fŒ©’Ï÷ ŽbÏ_ê<Ï1³Ù†Ý€â;¢˜„×S)&W|eíK©"¦˜îMñ}ÕW§SL—Ñg•:œR©òê/ŸQåõë×…Q%V|F•º„—¸¢X|D—à2ÀUq‹™ÌàLâ‰i@±(±CŠï˜’œAgÅ”¢%ô¶1¥ª«¾êt:å7¿ù¼÷Ûßþ¶0¨TqJÅvA½ÎÕ_ºûTt—Ô‡ˆ*¶W€ÙœV± +®qÅW`± -¦±Ågx™†pû=-öü¥3Ûù™ÎlN7œø(.Å4¤ØœJ±½â+TLÑ]B¯»7¥ìª/—Eô1O§üö·¿½TbŸR±]PïsŸŠKT)»þ++ªèìUñ}Z¥(¬íXÉ +¾âJQ`±‰,º¡ÅWx©s”‰õÃ`RÄž¿Ôq~c3[ËšÑÙÆ“¼€â#¢”…”ô¼Ô5¤˜žJÉÛ—bSt®ùòµ„Þåª/›Eô1N§ ƒŠÉ)•² Rå)•¼«¿Êö©ÄŠ*Y{Uò¢JÙ`E§UB…•Pq¥(°”EÐ’[lƒKU¦N|½Ou{þ2)ó¼9›ÎŒ®lÎW4#Ì›+úŒ(!CJÙ©+¾²bJrö\uLÑÙ›âs½ïÓ)É ¢s:Å*¨Ä<¥bsõ—%õ¡£ŠÎ^•²+ÀÊN«˜†•²ëÀLãŠi`q,º¡E'º„0@èÌÄLçl:³;›xRPl#Jѵ^¦!E÷TJÙ_&Ëç}ÆKèm®úªÃ飠RUL‚НS*¾¯þrYR_uT1¹Ìö0›°¢sjÅ6®”–²È¢Zlƒ‹Kˆ™ôPããÏPg±ç/UÌg|ÍÃLfpeó¼²y`ÞÑ4¢˜žFÑ )6×{é^ñU·˜â²7ÅÇ"ú§SÊ®ûJ6í ┊ëÕ_yQEçê¯XQÅv¯ŠÍiÛ°¢âJúˆN\ñX|DÛà*Àuâ233™ÍÙÆ_E'¢¨’ž—š„_§Rt÷¥ÄŠ)6W}ÅÛ«¾ª:RT|žR©âê¯:F•dX1‰*¾O«Ø^frjÅ5®˜FÐb[|…—iŒ4U½±Äž¿ÔmNc;WÓ™Ù•ÍýÊâÃʹksIDAT‰kDÑ=bzµWèS):1%9›®[L©úª/ŸËè3ƒJ]O©„ܧ’UÔƒã;ªØ\¦{ZÅgX WòKQdI~óÔ‰,º¡ÅGt‰cªäû=¨›Øó—I˜é˜ÎÝtfyéùŸI<É (>#JèRt*E犯1%o }QLñ±7¥î§S~ûÛßÊ{¿ûÝïrƒJÌS*>®þ2YR_§¨RtXŠn\ñXòB‹nl±.¡# P%×ù˜É,.k–W6ÿóPŠ"J]BŠÉ_1cŠézßW}ÕátÊï~÷»ËAÅ÷)Óõ¾¯þ2YRïU’aE=´>öªø8­¢V|ÇŸE'²øŠ-¾ãKh“ð î˜±˜EѤ,žø(>#ŠNHñy*Åv_J2¦$g×>cŠÉzŸW}ù^Dor:eTêpJÅçÕ_&ûTÒQE=(1£JÈÓ*¾ÂŠM\± ,e‘Å4¶äáeâLˆ¦“ öü¥®s›¢YšÉLNgÆW4#4 (¦¥êb{*¥ê˜’¾ê«(¦¸ìMñ}ÕW¨Ó)¹A%ä)•WMZT)ºÌæ´Š°â;®¸–²È¢ZLc‹I|©:ÆÄdò>L¢Øó—ºÌv\fiºóº²¹_ÑÌÐ& øŒ(!BŠî©”²+¾&-¦Ä¾êËôtÊXPq9¥’UЂЫ¿tö©„Ž*ɰ’UÊöªØœV)»¬(¬íX1 +&qE7°¸FÓØâ+¼øŽ3uú½ˆ-öü¥Î³›Y›îÏ&žè݈bRÒóÖ¼bs½—î©”²})阒œi‡Š)¶{S\®úÊ *y1ÅötJaP‰uJ¥ìê/_Kêm£J2¬äE•²eõEW€™,¬OG×°"®ø,e‘Å4¶¸D—X1pásf:‡Ó™í•ÍmŠÏˆâRLcJúTJÙ_éåóe1%9óv).Kèc\ões:åRP1=¥âsA½éÕ_>—ÔûŽ*.W€ù8­"¬Å_Å4²è†Ûà:±ù˜™™Ìètf~:ñÄ5 E”Ø!E÷TŠé_>bН%ô.W}…\D_t:åw¿û¼÷ûßÿ>7¨ÔᔊéÕ_!¢J2¬øˆ*ºW€UVªŠ+EÅ$²è†›àâ;¾LSÀ‰ý>„{þR·9Œí\Ídv—žûÙÄ“¼€:¢„ )¾®ø2‰)j:¦¸\õûtÊïÿûËA¥ÊS*ÓUL—Õû8­RuX±‰+¶¥,²d…ÓØâ#¼LRœÀt 9ã²»eÍðÊæ~esC“€bQª )®§R\–ÏSÌO§h•¢S*Y ê“/Öõê/ßûTªŒ*E{Ul®Ó=­¢Vªˆ+6E'²è„–¢àâ]ª1uâó=¨£Øó—IœóäÍßtçw:³À¢YbY@ QLBŠS)EW|™,ŸSBíM1½ê++¨¤û†îé”± R‡S*ɨRvJ%VT)Ú«RU|V©:¬¸ÄÝÀRYtC‹IlÑ /¡" P7:32›Ù›î\¯l>X4[, (¶¥Ž!ſНdLÉÛ—R‡˜’TÒ1%Öé”± b»K%ë”JW-©Ut÷ªø¾Ì$¬øŽ+.Å5²˜Æ—èbbLÅþÁ €z 1ƒò53ËéÎûtã‰k@ñQLBНë½|-Ÿ¯"¦˜,¡÷}Õ—ëé”dCÉ *¡N©„ܧ’Œ*YûTt£J2¬¸D•§Uª +®q¥(°˜FÓØb\B Î\çh&3; n<É (.¥ªRÅ©›˜’œ•›Æ”dPIÇ”P{Sª8r)¨˜œR©âê/›}*UGÛ½*¾N«è„•¢åõYaÅW\) ,e‘Å6´˜ÆßñeZ£M¬÷ *±ç/uϸÌÚtçy&á¤(žä¥,¤-›÷R\bJz_J̘b³7¥Š«¾ŠN§”•XW…اâU’a¥(ª„<­â;¬„Š+EÅ5²d…“Øâ+¼Ô5Ìï¿ïB|…’¢h¢NlãI^@ñQ|‡”ЧRòbJÖ_®1¥{S|-¢ *øÃ.ý'íê¯Q%Ä`1Êi\1 ,.‘E7´äÅ—è#ÆÔ‘Ï÷ ŽbÏ_&yÞS4“Óë•ÍmâIY@±(U‡”*®øªSL©ãU_¿ÿýïåøƒyPÑ9¥âzõ×´G“Ó*®aÅǩ۸âXt"‹ilÑ /! 0)tfg639Ýy_ÙÜÐ4 ØDÛÓ(¾BŠÉ©”i)¾®úr=2 *>O©„ºúk’¢Šëi•XaE7®¸–²È¢ZLb‹Ktq‰1„âk>åsff:¯Ó™–Í‹f6E'¢Ä)¾¯øª{L©âª/›Ó)ÖAÅõê¯Iˆ*u9­Rt ˜mX±+&§WÒÅ5²è†Ûà2À“Æu¾f2ËÓ™ êÆ“¼€¢{ Å4¢¸„—ë½BŸJ™¤˜â{}aPù¿ÿû?ñU\®þšæ¨bsZÅwX19µâWŠ‹idÑ -6ÁÅg|¹ Á&Æ{P¥Øó—I˜×ØÎßLf|eóBÝxbr E7¢èžFñRª>•R÷˜㪯?üáòÿ÷ÅA%ÖÕ_eK꫊*>®+;­bz ˜ï°â+®ß‘Å&¶¸F—:F@W¨¹˜ÍŒNwþç#žä%DHѽޫìTŠ+¾ªŠ)eKèc^õ•T|RѹúËWTI¾ù¶QÅÇ^•§UlÂJÙŽ•PqÅ6°”E–¬Ðb[\¢K•!¨_s4Óù]Ö °lnX6w4 (!"ŠÎŽ“âTŠ})¶1¥l ½KL uÕ—ê(¥A%ôÕ_ºûT|F•XW€eV VtN­ØÄ›Àâ#²Å›à*ÀÔA Ô³”l®ó¶¼9žîÐ6ž˜ÓˆbzÅwHñy*ÅöН1ÅçÞ׫¾ ƒJ¨S*W5ª¸œV©*¬ØÄ›ÀRYtB‹Il)‹.¾âËU 5¨Ÿ*g]es7Ó9žÎl°l¾X4›, (.¥Šâr*…˜âïtJnP‰}õ—Ë’úÐQ%ë 0ÝÓ*±ÂŠï¸â#°èDÝÐb\LLÌ ›é{0ibÏ_ê<ëq»™Ìøtf†esGÛ€â3¢Ä)º§R\÷¥øŠ)>–Ї¾ê«0¨ø¼úk¢J§U|„—S+&qÅ5°èDÝÐb[|Ç—P‘¦®ªz¿b‰=™´9ŽËlNwþ§3K,šEÚ݈b{ÅGH©âTÊU)y§S2ƒJ®þª"ª¸.«÷uZEg¿ŠÏ°2®¤KYdÑ -&±ÅWx‰c€|ÏÍlfwºsÁ²ùbzY4»ôQB…=)¦§R|-ŸSb^õ5 *üãsƒJ¢JòͬKT1=­âz ˜°â+®ß‘Å$´¸—*" 0I|ÍÙLç{:3Cñ$/ øˆ(¾BŠíõ^¦§RêSê´7%+¨üñÌ*!¯þªST }˜É5`¡ÂН¸"°¸„Ûà*ÀL{À‰ýþ„{þ2)ó×yœÉìÏ$œø(>"J!Åç©Ó+¾¦-¦”NÓ¨’þ‡Ø§âUÒa¥Š¨bsZÅf¿JVX WlKYd± -6ÁÅg|™”8$…ž‹ÙÎëòæ®á¤(ž˜”E7¤˜ìIÑ9•RULIÏé}Æ_{SL¯úRE+¨TuõW•Q%ä`*¬VñVtN­ØÄßE'²è†–²àâ]b„˜Iàóý¨£Øó—:ðù~ÍîLf€:3Ų¹¤m@q‰(:§QB„SŠBŠÏ+¾êSB_õ•Têrõ—KTQaÅgT19­bs ˜éâú§V\âJQ`щ,º¡Å4¶è†—˜6:36Ûùî|PgÖX4«,šqÚDß§Q\ö¤ØìJÑ9•âSÒóû:ÆÝÓ)—‚ÊU‰*®W€ÙœVq=±RÕ©•¼¸â+°„->¢‹mˆ!Ö .|ͳ|ÎØlf|®áÄG@1‰(>O£ØžHñq*Å×¾”i)ÆA%Ä>•QÅdY}èÓ*U„ÛS+>KYdñZ\£K¨š¯ˆ±ˆÔ³=®ó8ÓùŸk8IÇ_Åô4J]BŠïS):ËçëS\®úÊ *!N©LjT±9­âë0›°bzjÅ&®›È¢Zlb‹Ïð2­‘¦ª”u{þ2é3—Ùî|PgÖ¨OŠŠkDq¹Ö++¤„¸ÞËæTÊ$Å”§SrƒÊ$E•tXщ*.W€…¾ÌæÄŠé©•¼¸"°ØF“Ðâ3¼Ô!ÈU 1S³ïéÎMâ‰Ï€RQtN£ØœH y½—+¾ÊbJz®?i1åü£¼÷§?ý)÷ ½O%TTI‡›¨RÅi×°bzjÅW\) ,:‘%+´˜Ä×èRE„¦…¯9œéü/k†¨3{,›_Í>}EÓ(!CJ§RòbJÑ©Ÿ1¥Š½)ÊŸþô§wA%/ªT±O¥ª¨â °:‡Û¸RXªˆ,y¡Å&¶„Š/W1ØÄ|ïª{þ2Éó×¹]Þg3Ì›3ºÆ“¢€+¢„)&×{ÙœJ1Ù—2i1åÏþó» bUl–ÔÇŠ*¾O«Ô-¬„ˆ+eE'²è†ß±%T|¹êÁ&æûP…Øó—i™åø˜é¹DpROŠŠïˆR§âûTJ̘âk }2¦h•ºF×+ÀtN«¸^fVBœZÑ+®E7²˜„–²àâ3¼Ô1ÈÔIÈ÷ bÏ_ê"ä{\6ç3êÎ#uf›6E'¢ø:â3¤˜\ïåëTJÑ_u)™AÅ×Õ_6Q%+¬ÄŠ*®§Uª+¦'W|ÝÈbZlb‹i|©"ÂÓNwç:ï3™-êÎ+Ëæž!J^D‰R\O¥TS²š‚Ϙ¢s:åRP©[TÉ +EQÅö 0×Ó*.aÅæ:°Pq¥,°èD–P¡Ågtq 1W5Øø~ê&öü¥îóœ39Ûù ¯pROÒ%tD1½Ö+TH±=•bzÅWVLÑ9•+¦d•Iˆ*¦{U|žV‰Vªˆ+6E7²˜„×àRE€©{Й„˜u{þ2 ó_ó<Ó9¢î|RgÖ©PBD”:†§R|îK‰SŒƒJÝ£Šé`>®«*¬„Š+e%td±-¡âË4Ä@WUs5×ùŸé¼Ñw<) (!"JÈâóz¯*÷¥TSŒ‚Ê´D—°bzZ%DX W|ÝÈb[|E—˜!˜!ft¶óB“™dÖL3D@ QB†ݘbR¦1¦•IŠ*±O«ø +1âJY`щ,>B‹kp _®r¼‰ýÞ„{þ2m³3>›Ù¢M8)‹'e¥ÊˆRuH y*eÒbÊŸÿügyï/ùKá?PǨRõi•ÐaÅ4®ä}áéÆE7²ä…ÛØâ;¼Lb˜B©bææ:Ì›7êÎ+ufŸ¶E7¢˜\é•QêR\O¥Ô=¦üå/yTbD•¼°’õ†¹^fsZ%tX }j%Wª,&‘¥,¶øŠ.1" pUøžß•Í MçºsM_Å&¢ø8:¤ØœJq½â+/¦$C•1e,¨ØF•¼3ª„>­bV’qÅ$¬ØÄ_§Wt‹ih±‰-ºÑ%T|!Ö„ûÁP7±ç/Ó<ÛÑïÙÎMf”ºsϲù©k@ñu%RòæÓº!%ô©”Ø1¥(¨èÄ£ RuT uXÙi•*ÂJÝâŠN`1‰,¦¡Å5¸Ø˜:Å Îlfn¾æ}6³F“Y¦ÎlÔÇ)”¥êâóTŠí_UƔ 2)Q¥ŠÓ*u +¶q¥,°ØFÓÐb[|G—Q&´Iû 0I˜½Œ«jç2+4KêÎ;MâIY@±‰(u)UŸJ©KLÉ *“UlO«øØ¯’VbÄ—Ó+yÅ$²Ø„Á%f„®2ßs=Ûù¢É 3kª3;µ (UGÓb{½—S)“SrƒŠKTq]Tò °I+¡âŠkd1 -.±%dx!Ôà*ˆ=Wó14GæÍ5]ãI¨ˆ2É!%Ä_U. Ï‹)…A¥ê¨Råiß×€ù +UÄŸÅwhñ]êc€Irvç2St '¾Jèˆ:¤ø¾Þ+Ô©”ªcJiP¹ŠQ%TX‰Wt‹nd1 -E±Å5¸T`®zȉý¾„{þ2ÍsŸ3À¢Y£éÜRwª3[-›Ïƈ(!BÊUŽ)ZA%TTqÝ«R÷°bsjÅW\ñXL"‹MhÑ .¾£Ë4D *UÎæÊæ„¶óG“§îÜÔ% øˆ(6§QêRBîKñSþò—¿È{ýë_µþÁª£Šëi•ªÃŠïS+&qÅG` Y\c‹nt‰aŒ3ç¹Îmf–¾â‰i@ QlN£TRBžJ©"¦üõ¯}T&=ªø<­2¬ØžZñW|—Ðâ+¸øˆ0?&MìùKl>ß˳>—Ù£éœÓG@ñQ|ŸFq )1N¥Ô!¦Œ•I‰*UVÑ +¾¯s+!‹mhq-¡ÃKÌPÄ{ÎæJ\¢‰n8 P\"Šk½ª )º§R&!¦\ *UD•˜§Ub…•:ÅÝÀbYlCKˆèR×L«³=×¹£éœSw~š5{­[D©cH©âTJˆ˜ò׿þÿöì‡a¢(+9çïF7v+ÔpIZö/^ÅŽÀ6^oçœyŒ &Ó€™0KaUc-l„­°+Ù ‡€£p28\*®‘n î-z|±çÊý¯]ËÝ_þ±ë´Ù Sšel­vUK‹µ4]Õ„C=Yµèr³Vm[5qÕÒëú»jöÕ¾¯¶µ!„ö‡Ð~aÙ@|Û‰+jr*1ÃJʨÒǰÒå¸bX,íXRF–Ô¡¥«Ñe¨ƒ 0}õ¼¦Ý1¥uú𩵷6PÚQúRbÆ”Ô!%ç˜R|l'+G“)¯GIEND®B`‚pyenv-pyenv-485090e/test/000077500000000000000000000000001517431316200152545ustar00rootroot00000000000000pyenv-pyenv-485090e/test/--version.bats000066400000000000000000000021011517431316200177400ustar00rootroot00000000000000#!/usr/bin/env bats load test_helper _setup() { export GIT_DIR="${PYENV_TEST_DIR}" export GIT_WORK_TREE="$GIT_DIR" git init --quiet git config user.name "Tester" git config user.email "tester@test.local" cd "$PYENV_TEST_DIR" } git_commit() { git commit --quiet --allow-empty -m "empty" } @test "default version" { assert [ ! -e "$PYENV_ROOT" ] run pyenv---version assert_success [[ $output == "pyenv "?.?.* ]] } @test "doesn't read version from non-pyenv repo" { git remote add origin https://github.com/homebrew/homebrew.git git_commit git tag v1.0 run pyenv---version assert_success [[ $output == "pyenv "?.?.* ]] } @test "reads version from git repo" { git remote add origin https://github.com/pyenv/pyenv.git git_commit git tag v0.4.1 git_commit git_commit run pyenv---version assert_success "pyenv 0.4.1-2-g$(git rev-parse --short HEAD)" } @test "prints default version if no tags in git repo" { git remote add origin https://github.com/pyenv/pyenv.git git_commit run pyenv---version [[ $output == "pyenv "?.?.* ]] } pyenv-pyenv-485090e/test/Dockerfile000066400000000000000000000012471517431316200172520ustar00rootroot00000000000000ARG BASH FROM alpine/git:v2.30.0 as bats ARG BATS_VERSION RUN git clone https://github.com/bats-core/bats-core.git /root/bats-core \ && cd /root/bats-core \ && git checkout "${BATS_VERSION}" FROM bash:$BASH # Gnu tools RUN if [[ "${GNU:-}" == True ]];then \ apk add sed coreutils findutils \ ;fi # Bats RUN apk add --update parallel ncurses git \ && mkdir -p ~/.parallel \ && touch ~/.parallel/will-cite COPY --from=bats /root/bats-core /root/bats-core RUN /root/bats-core/install.sh "/usr/local" # Clean RUN rm -rf /var/cache/apk/* # Setup RUN echo 'source /etc/profile' >> ~/.bashrc WORKDIR /code/ CMD ["bash"] pyenv-pyenv-485090e/test/README.md000066400000000000000000000057161517431316200165440ustar00rootroot00000000000000# TEST --- ## Running test suite Test suite could be launch with `make` by providing the right target depending what you want to achieve. Under the hood, `pyenv` test suites use `bats` as a test framework and are run on the host or docker depending of the target provided to make. ### Targets - `test` - Run the whole test suite on the local host - `test-docker` - Run the whole test suite on docker - Some volumes are used in read-only mode - `test-unit` - Run the unit test - `test-plugin` - Run the plugin test - `test-unit-docker-[BASH_VERSION]` - Run the unit test under **official** bash docker container (alpine/busybox) with the specified bash version if present is in the `Makefile` - Some volumes are used in read-only mode - `test-unit-docker-gnu-[BASH_VERSION]` - Run the unit test under **official** bash docker container (alpine/busybox), completed by **GNU Tools**, with the specified bash version if present is in the `Makefile` - Some volumes are used in read-only mode - `test-plugin-docker-[BASH_VERSION]` - Run the plugin test under **official** bash docker container (alpine/busybox), completed by **GNU Tools**, with the specified bash version if present is in the `Makefile` - Some volumes are used in read-only mode - `test-plugin-docker-gnu-[BASH_VERSION]` - Run the plugin test under **official** bash docker container (alpine/busybox), completed by **GNU Tools**, with the specified bash version if present is in the `Makefile` - Some volumes are used in read-only mode ## Targeting specific test / test file By setting some environment variables, it is possible to filtering which test and/or test file who will be tested with bats - `BATS_FILE_FILTER` - Run test only with the specified file - `BATS_TEST_FILTER` - Run test only who corresponding to the filter provided ### Examples ```bash $ BATS_TEST_FILTER=".*installed.*" BATS_FILE_FILTER="build.bats" make test-plugin-docker-gnu-3.2.57 build.bats ✓ yaml is installed for python ✓ homebrew is used in Linux if Pyenv is installed with Homebrew ✓ homebrew is not used in Linux if Pyenv is not installed with Homebrew 3 tests, 0 failures $ BATS_TEST_FILTER=".*installed.*" BATS_FILE_FILTER="build.bats" make test-plugin build.bats ✓ yaml is installed for python ✓ homebrew is used in Linux if Pyenv is installed with Homebrew ✓ homebrew is not used in Linux if Pyenv is not installed with Homebrew 3 tests, 0 failures ``` ## Writing test To be reproducible, each test use/should use its own `TMPDIR` . It's achieved by using the environment variable `BATS_TEST_TMPDIR` provided by bats that is automatically deleted at the end of each test. More info [here](https://bats-core.readthedocs.io/en/stable/writing-tests.html#special-variables) Another variable who could be used to source some file who need to be tested is `BATS_TEST_DIRNAME` who point to the directory in which the bats test file is located.pyenv-pyenv-485090e/test/commands.bats000066400000000000000000000012651517431316200177340ustar00rootroot00000000000000#!/usr/bin/env bats load test_helper @test "commands" { run pyenv-commands assert_success assert_line "init" assert_line "rehash" assert_line "shell" refute_line "sh-shell" assert_line "echo" } @test "commands --sh" { run pyenv-commands --sh assert_success refute_line "init" assert_line "shell" } @test "commands in path with spaces" { path="${PYENV_TEST_DIR}/my commands" cmd="${path}/pyenv-sh-hello" mkdir -p "$path" touch "$cmd" chmod +x "$cmd" PATH="${path}:$PATH" run pyenv-commands --sh assert_success assert_line "hello" } @test "commands --no-sh" { run pyenv-commands --no-sh assert_success assert_line "init" refute_line "shell" } pyenv-pyenv-485090e/test/completions.bats000066400000000000000000000015601517431316200204650ustar00rootroot00000000000000#!/usr/bin/env bats load test_helper create_command() { bin="${PYENV_TEST_DIR}/bin" mkdir -p "$bin" echo "$2" > "${bin}/$1" chmod +x "${bin}/$1" } @test "command with no completion support" { create_command "pyenv-hello" "#!$BASH echo hello" run pyenv-completions hello assert_success "--help" } @test "command with completion support" { create_command "pyenv-hello" "#!$BASH # Provide pyenv completions if [[ \$1 = --complete ]]; then echo hello else exit 1 fi" run pyenv-completions hello assert_success assert_output < .python-version run -127 pyenv-exec nonexistent assert_failure < "$PYENV_ROOT/version" run pyenv-global assert_success assert_output "1.2.3" } @test "set PYENV_ROOT/version" { mkdir -p "$PYENV_ROOT/versions/1.2.3" run pyenv-global "1.2.3" assert_success run pyenv-global assert_success "1.2.3" } @test "fail setting invalid PYENV_ROOT/version" { mkdir -p "$PYENV_ROOT" run pyenv-global "1.2.3" assert_failure "pyenv: version \`1.2.3' not installed" } pyenv-pyenv-485090e/test/help.bats000066400000000000000000000044711517431316200170650ustar00rootroot00000000000000#!/usr/bin/env bats load test_helper @test "without args shows summary of common commands" { run pyenv-help assert_success assert_line "Usage: pyenv []" assert_line "Some useful pyenv commands are:" } @test "invalid command" { run pyenv-help hello assert_failure "pyenv: no such command \`hello'" } @test "shows help for a specific command" { mkdir -p "${PYENV_TEST_DIR}/bin" cat > "${PYENV_TEST_DIR}/bin/pyenv-hello" < # Summary: Says "hello" to you, from pyenv # This command is useful for saying hello. echo hello SH run pyenv-help hello assert_success assert_output < This command is useful for saying hello. SH } @test "replaces missing extended help with summary text" { mkdir -p "${PYENV_TEST_DIR}/bin" cat > "${PYENV_TEST_DIR}/bin/pyenv-hello" < # Summary: Says "hello" to you, from pyenv echo hello SH run pyenv-help hello assert_success assert_output < Says "hello" to you, from pyenv SH } @test "extracts only usage" { mkdir -p "${PYENV_TEST_DIR}/bin" cat > "${PYENV_TEST_DIR}/bin/pyenv-hello" < # Summary: Says "hello" to you, from pyenv # This extended help won't be shown. echo hello SH run pyenv-help --usage hello assert_success "Usage: pyenv hello " } @test "multiline usage section" { mkdir -p "${PYENV_TEST_DIR}/bin" cat > "${PYENV_TEST_DIR}/bin/pyenv-hello" < # pyenv hi [everybody] # pyenv hola --translate # Summary: Says "hello" to you, from pyenv # Help text. echo hello SH run pyenv-help hello assert_success assert_output < pyenv hi [everybody] pyenv hola --translate Help text. SH } @test "multiline extended help section" { mkdir -p "${PYENV_TEST_DIR}/bin" cat > "${PYENV_TEST_DIR}/bin/pyenv-hello" < # Summary: Says "hello" to you, from pyenv # This is extended help text. # It can contain multiple lines. # # And paragraphs. echo hello SH run pyenv-help hello assert_success assert_output < This is extended help text. It can contain multiple lines. And paragraphs. SH } pyenv-pyenv-485090e/test/hooks.bats000066400000000000000000000034631517431316200172600ustar00rootroot00000000000000#!/usr/bin/env bats load test_helper @test "prints usage help given no argument" { run pyenv-hooks assert_failure "Usage: pyenv hooks " } @test "prints list of hooks" { path1="${PYENV_TEST_DIR}/pyenv.d" path2="${PYENV_TEST_DIR}/etc/pyenv_hooks" PYENV_HOOK_PATH="$path1" create_hook exec "hello.bash" create_hook exec "ahoy.bash" create_hook exec "invalid.sh" create_hook which "boom.bash" PYENV_HOOK_PATH="$path2" create_hook exec "bueno.bash" PYENV_HOOK_PATH="$path1:$path2" run pyenv-hooks exec assert_success assert_output < myscript.sh </dev/null" } @test "adds shims to PATH" { export PATH="${BATS_TEST_DIRNAME}/../libexec:/usr/bin:/bin:/usr/local/bin" run pyenv-init - bash assert_success assert_line 'export PATH="'${PYENV_ROOT}'/shims:${PATH}"' } @test "adds shims to PATH (fish)" { export PATH="${BATS_TEST_DIRNAME}/../libexec:/usr/bin:/bin:/usr/local/bin" run pyenv-init - fish assert_success assert_line "set -gx PATH '${PYENV_ROOT}/shims' \$PATH" } @test "adds shims to PATH (pwsh)" { export PATH="${BATS_TEST_DIRNAME}/../libexec:/usr/bin:/bin:/usr/local/bin" run pyenv-init - pwsh assert_success assert_line '$Env:PATH="'${PYENV_ROOT}'/shims:$Env:PATH"' } @test "removes existing shims from PATH" { OLDPATH="$PATH" export PATH="${BATS_TEST_DIRNAME}/nonexistent:${PYENV_ROOT}/shims:$PATH" run bash -e </dev/null || skip "-- fish not installed" OLDPATH="$PATH" export PATH="${BATS_TEST_DIRNAME}/nonexistent:${PYENV_ROOT}/shims:$PATH" run fish </dev/null || skip "-- pwsh not installed" OLDPATH="$PATH" export PATH="${BATS_TEST_DIRNAME}/nonexistent:${PYENV_ROOT}/shims:$PATH" run pwsh -noni -c - </dev/null || skip "-- fish not installed" export PATH="${BATS_TEST_DIRNAME}/../libexec:/usr/bin:/bin:/usr/local/bin" run fish </dev/null || skip "-- pwsh not installed" PATH="${BATS_TEST_DIRNAME}/../libexec:/usr/bin:/bin:/usr/local/bin" run pwsh -nop -c - </dev/null || skip "-- fish not installed" export PATH="${BATS_TEST_DIRNAME}/../libexec:/usr/bin:${PYENV_ROOT}/shims:/bin:/usr/local/bin" run fish </dev/null || skip "-- pwsh not installed" PATH="${BATS_TEST_DIRNAME}/../libexec:/usr/bin:${PYENV_ROOT}/shims:/bin:/usr/local/bin" run pwsh -nop -c - <] VAR if [[ $1 == -F* ]]; then sep="${1:2}" echo "${!2}" | tr "${sep:-:}" $'\n' else echo "${!1}" fi pyenv-pyenv-485090e/test/local.bats000066400000000000000000000031261517431316200172230ustar00rootroot00000000000000#!/usr/bin/env bats load test_helper _setup() { mkdir -p "${PYENV_TEST_DIR}/myproject" cd "${PYENV_TEST_DIR}/myproject" } @test "no version" { assert [ ! -e "${PWD}/.python-version" ] run pyenv-local assert_failure "pyenv: no local version configured for this directory" } @test "local version" { echo "1.2.3" > .python-version run pyenv-local assert_success "1.2.3" } @test "discovers version file in parent directory" { echo "1.2.3" > .python-version mkdir -p "subdir" && cd "subdir" run pyenv-local assert_success "1.2.3" } @test "ignores PYENV_DIR" { echo "1.2.3" > .python-version mkdir -p "$HOME" echo "3.4-home" > "${HOME}/.python-version" PYENV_DIR="$HOME" run pyenv-local assert_success "1.2.3" } @test "sets local version" { mkdir -p "${PYENV_ROOT}/versions/1.2.3" run pyenv-local 1.2.3 assert_success "" assert [ "$(cat .python-version)" = "1.2.3" ] } @test "fails to set a nonexistent local version" { run pyenv-local 1.2.3 assert_failure "pyenv: version \`1.2.3' not installed" assert [ ! -e .python-version ] } @test "sets a nonexistent local version with --force" { run pyenv-local -f 1.2.3 assert_success "" assert [ "$(cat .python-version)" = "1.2.3" ] } @test "changes local version" { echo "1.0-pre" > .python-version mkdir -p "${PYENV_ROOT}/versions/1.2.3" run pyenv-local assert_success "1.0-pre" run pyenv-local 1.2.3 assert_success "" assert [ "$(cat .python-version)" = "1.2.3" ] } @test "unsets local version" { touch .python-version run pyenv-local --unset assert_success "" assert [ ! -e .python-version ] } pyenv-pyenv-485090e/test/pip-rehash.bats000077500000000000000000000027411517431316200201760ustar00rootroot00000000000000#!/usr/bin/env bats load test_helper copy_src_pyenvd() { mkdir -p "${PYENV_ROOT}" cp -r "${BATS_TEST_DIRNAME}/../pyenv.d" "${PYENV_ROOT}" } @test "pip-rehash triggered when using 'pip'" { export PYENV_VERSION="3.7.14" create_alt_executable "example" create_alt_executable "pip" copy_src_pyenvd run command -v example 2> /dev/null assert_failure run pyenv-exec pip install example assert_success run command -v example 2> /dev/null assert_success } @test "pip-rehash triggered when using 'pip3'" { export PYENV_VERSION="3.7.14" create_alt_executable "example" create_alt_executable "pip3" copy_src_pyenvd run command -v example 2> /dev/null assert_failure run pyenv-exec pip3 install example assert_success run command -v example 2> /dev/null assert_success } @test "pip-rehash triggered when using 'pip3.x'" { export PYENV_VERSION="3.7.14" create_alt_executable "example" create_alt_executable "pip3.7" copy_src_pyenvd run command -v example 2> /dev/null assert_failure run pyenv-exec pip3.7 install example assert_success run command -v example 2> /dev/null assert_success } @test "pip-rehash triggered when using 'python -m pip install'" { export PYENV_VERSION="3.7.14" create_alt_executable "example" create_alt_executable "python" copy_src_pyenvd run command -v example 2> /dev/null assert_failure run pyenv-exec python -m pip install example assert_success run command -v example 2> /dev/null assert_success } pyenv-pyenv-485090e/test/prefix.bats000066400000000000000000000027561517431316200174360ustar00rootroot00000000000000#!/usr/bin/env bats load test_helper @test "prefix" { mkdir -p "${PYENV_TEST_DIR}/myproject" cd "${PYENV_TEST_DIR}/myproject" echo "1.2.3" > .python-version mkdir -p "${PYENV_ROOT}/versions/1.2.3" run pyenv-prefix assert_success "${PYENV_ROOT}/versions/1.2.3" } @test "prefix for invalid version" { PYENV_VERSION="1.2.3" run pyenv-prefix assert_failure "pyenv: version \`1.2.3' not installed" } @test "prefix for system" { mkdir -p "${PYENV_TEST_DIR}/bin" touch "${PYENV_TEST_DIR}/bin/python" chmod +x "${PYENV_TEST_DIR}/bin/python" PATH="${PYENV_TEST_DIR}/libexec:$PATH" PYENV_VERSION="system" run pyenv-prefix assert_success "$PYENV_TEST_DIR" } #Arch has Python at sbin as well as bin @test "prefix for system in sbin" { mkdir -p "${PYENV_TEST_DIR}/sbin" touch "${PYENV_TEST_DIR}/sbin/python" chmod +x "${PYENV_TEST_DIR}/sbin/python" PATH="${PYENV_TEST_DIR}/sbin:$PATH" PYENV_VERSION="system" run pyenv-prefix assert_success "$PYENV_TEST_DIR" } @test "prefix for system in /" { mkdir -p "${PYENV_TEST_DIR}/libexec" cat >"${PYENV_TEST_DIR}/libexec/pyenv-which" </dev/null || true" } @test "sh-rehash in bash (integration)" { create_alt_executable_in_version "3.4" "python" PYENV_SHELL=bash run eval "$(pyenv-sh-rehash)" assert_success assert [ -x "${PYENV_ROOT}/shims/python" ] } @test "sh-rehash in fish" { create_alt_executable_in_version "3.4" "python" PYENV_SHELL=fish run pyenv-sh-rehash assert_success "command pyenv rehash" } @test "sh-rehash in fish (integration)" { command -v fish >/dev/null || skip "-- fish not installed" create_alt_executable_in_version "3.4" "python" PYENV_SHELL=fish fish -Nc "source (pyenv-sh-rehash | psub)" assert_success assert [ -x "${PYENV_ROOT}/shims/python" ] } @test "sh-rehash in pwsh" { create_alt_executable_in_version "3.4" "python" PYENV_SHELL=pwsh run pyenv-sh-rehash assert_success "& (get-command pyenv -commandtype application) rehash" } @test "sh-rehash in pwsh (integration)" { command -v pwsh >/dev/null || skip "-- pwsh not installed" assert [ ! -x "${PYENV_ROOT}/shims/python" ] create_alt_executable_in_version "3.4" "python" run pwsh -nop -c -<<'!' $ErrorActionPreference = "Stop" $PSNativeCommandUseErrorActionPreference = $true iex ((& pyenv init - pwsh) -join "`n") & pyenv rehash ! assert_success "" assert [ -x "${PYENV_ROOT}/shims/python" ] } @test "shim sets _PYENV_SHIM_PATH when linked from elsewhere" { export PYENV_VERSION="custom" create_alt_executable python3 #must stub pyenv before rehash 'cuz the path is hardcoded into shims create_stub pyenv < .python-version PYENV_VERSION="" run pyenv-sh-shell assert_failure "pyenv: no shell-specific version configured" } @test "shell version" { PYENV_SHELL=bash PYENV_VERSION="1.2.3" run pyenv-sh-shell assert_success 'echo "$PYENV_VERSION"' } @test "shell version (fish)" { PYENV_SHELL=fish PYENV_VERSION="1.2.3" run pyenv-sh-shell assert_success 'echo "$PYENV_VERSION"' } @test "shell version (pwsh)" { PYENV_SHELL=pwsh PYENV_VERSION="1.2.3" run pyenv-sh-shell assert_success 'echo "$PYENV_VERSION"' } @test "shell revert" { PYENV_SHELL=bash run pyenv-sh-shell - assert_success assert_line 0 'if [ -n "${PYENV_VERSION_OLD+x}" ]; then' } @test "shell revert (fish)" { PYENV_SHELL=fish run pyenv-sh-shell - assert_success assert_line 0 'if set -q PYENV_VERSION_OLD' } @test "shell revert (pwsh)" { PYENV_SHELL=pwsh run pyenv-sh-shell - assert_success assert_line 0 'if ( Get-Item -Path Env:\PYENV_VERSION* ) {' } @test "shell unset" { PYENV_SHELL=bash run pyenv-sh-shell --unset assert_success assert_output </dev/null; then if [ -n "$PYENV_NATIVE_EXT" ]; then echo "pyenv: failed to load \`realpath' builtin" >&2 exit 1 fi fi local bats_test_tmpdir="$(realpath "${BATS_TEST_TMPDIR}")" if [ -z "${bats_test_tmpdir}" ];then # Use readlink if running in a container instead of realpath lib bats_test_tmpdir="$(readlink -f "${BATS_TEST_TMPDIR}")" fi # update BATS_TEST_TMPDIR discover by realpath/readlink to avoid "//" export BATS_TEST_TMPDIR="${bats_test_tmpdir}" export PYENV_TEST_DIR="${BATS_TEST_TMPDIR}/pyenv" export PYENV_ROOT="${PYENV_TEST_DIR}/root" export HOME="${PYENV_TEST_DIR}/home" export PYENV_HOOK_PATH="${PYENV_ROOT}/pyenv.d" PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin PATH="${PYENV_TEST_DIR}/bin:$PATH" PATH="${_PYENV_INSTALL_PREFIX}/libexec:$PATH" PATH="${BATS_TEST_DIRNAME}/libexec:$PATH" PATH="${PYENV_ROOT}/shims:$PATH" PATH="${BATS_TEST_TMPDIR}/stubs:$PATH" for xdg_var in `env 2>/dev/null | grep ^XDG_ | cut -d= -f1`; do unset "$xdg_var"; done unset xdg_var # Workaround for Powershell. When tests are run from a terminal, # and running a script fron a here-document, # Powershell 7.5.4 erroneously prints ANSI escape sequences # even if its output is redirected, breaking the comparison logic export NO_COLOR=1 # If test specific setup exist, run it if [[ $(type -t _setup) == function ]];then _setup fi } flunk() { { if [ "$#" -eq 0 ]; then cat - else echo "$@" fi } | sed "s:${PYENV_TEST_DIR}:TEST_DIR:g" >&2 return 1 } assert_success() { if [ "$status" -ne 0 ]; then flunk "command failed with exit status $status" $'\n'\ "output: $output" elif [ "$#" -gt 0 ]; then assert_output "$1" fi } assert_failure() { if [ "$status" -eq 0 ]; then flunk "expected failed exit status" $'\n'\ "output: $output" elif [ "$#" -gt 0 ]; then assert_output "$1" fi } assert_equal() { if [ "$1" != "$2" ]; then { echo "expected: \`$1'" echo "actual: \`$2'" } | flunk fi } assert_output() { local expected if [ $# -eq 0 ]; then expected="$(cat -)" else expected="$1" fi assert_equal "$expected" "$output" } assert_line() { if [ "$1" -ge 0 ] 2>/dev/null; then assert_equal "$2" "${lines[$1]}" else local line for line in "${lines[@]}"; do if [ "$line" = "$1" ]; then return 0; fi done flunk "expected line \`$1'" $'\n'\ "output: $output" fi } refute_line() { if [ "$1" -ge 0 ] 2>/dev/null; then local num_lines="${#lines[@]}" if [ "$1" -lt "$num_lines" ]; then flunk "output has $num_lines lines" fi else local line for line in "${lines[@]}"; do if [ "$line" = "$1" ]; then flunk "expected to not find line \`$line'" $'\n'\ "output: $output" fi done fi } assert() { if ! "$@"; then flunk "failed: $@" fi } # Output a modified PATH that ensures that the given executable is not present, # but in which system utils necessary for pyenv operation are still available. path_without() { local path=":${PATH}:" for exe; do local found alt util for found in $(PATH="$path" type -aP "$exe"); do found="${found%/*}" if [ "$found" != "${PYENV_ROOT}/shims" ]; then alt="${PYENV_TEST_DIR}/$(echo "${found#/}" | tr '/' '-')" mkdir -p "$alt" for util in bash head cut readlink greadlink tr sed xargs basename sort; do if [ -x "${found}/$util" ]; then ln -s "${found}/$util" "${alt}/$util" fi done path="${path/:${found}:/:${alt}:}" fi done done path="${path#:}" path="${path%:}" echo "$path" } create_path_executable() { create_executable "${PYENV_TEST_DIR}/bin" "$@" } create_alt_executable() { create_alt_executable_in_version "${PYENV_VERSION}" "$@" } create_alt_executable_in_version() { local version="${1:?}" shift 1 create_executable "${PYENV_ROOT}/versions/$version/bin" "$@" } create_stub() { create_executable "${BATS_TEST_TMPDIR}/stubs" "$@" } create_executable() { local bin="${1:?}" local name="${2:?}" shift 2 mkdir -p "$bin" local payload # Bats doesn't redirect stdin if [[ $# -eq 0 && ! -t 0 ]]; then payload="$(cat -)" else payload="$(printf '%s\n' "$@")" fi if [[ $payload != "#!/"* ]]; then payload="#!$BASH"$'\n'"$payload" fi echo "$payload" > "${bin}/$name" chmod +x "${bin}/$name" } create_hook() { mkdir -p "${PYENV_HOOK_PATH}/$1" touch "${PYENV_HOOK_PATH}/$1/$2" if [ ! -t 0 ]; then cat > "${PYENV_HOOK_PATH}/$1/$2" fi } pyenv-pyenv-485090e/test/version-file-read.bats000066400000000000000000000047011517431316200214440ustar00rootroot00000000000000#!/usr/bin/env bats load test_helper _setup() { mkdir -p "${PYENV_TEST_DIR}/myproject" cd "${PYENV_TEST_DIR}/myproject" } @test "fails without arguments" { run pyenv-version-file-read assert_failure "" } @test "fails for invalid file" { run pyenv-version-file-read "non-existent" assert_failure "" } @test "fails for blank file" { echo > my-version run pyenv-version-file-read my-version assert_failure "" } @test "reads simple version file" { cat > my-version <<<"3.3.5" run pyenv-version-file-read my-version assert_success "3.3.5" } @test "ignores leading spaces" { cat > my-version <<<" 3.3.5" run pyenv-version-file-read my-version assert_success "3.3.5" } @test "reads only the first word from file" { cat > my-version <<<"3.3.5 2.7.6 hi" run pyenv-version-file-read my-version assert_success "3.3.5" } @test "loads *not* only the first line in file" { cat > my-version < my-version < my-version run pyenv-version-file-read my-version assert_success "2.7.6" } @test "ignores carriage returns" { cat > my-version <<< $'3.3.5\r' run pyenv-version-file-read my-version assert_success "3.3.5" } @test "skips comment lines" { cat > my-version < my-version run pyenv-version-file-read my-version assert_failure "pyenv: invalid version \`..' ignored in \`my-version'" } @test "skips glob path traversal" { cat > my-version < my-version run pyenv-version-file-read my-version assert_success "${venv}" } @test "skips relative paths that lead outside of versions" { venv=../3.10.3/envs/test mkdir -p "${PYENV_ROOT}/versions/${venv}" echo -n "${venv}" > my-version run pyenv-version-file-read my-version assert_failure } pyenv-pyenv-485090e/test/version-file-write.bats000066400000000000000000000017771517431316200216750ustar00rootroot00000000000000#!/usr/bin/env bats load test_helper _setup() { mkdir -p "${PYENV_TEST_DIR}" cd "$PYENV_TEST_DIR" } @test "invocation without 2 arguments prints usage" { run pyenv-version-file-write assert_failure "Usage: pyenv version-file-write [-f|--force] [...]" run pyenv-version-file-write "one" "" assert_failure } @test "setting nonexistent version fails" { assert [ ! -e ".python-version" ] run pyenv-version-file-write ".python-version" "2.7.6" assert_failure "pyenv: version \`2.7.6' not installed" assert [ ! -e ".python-version" ] } @test "setting nonexistent version succeeds with force" { assert [ ! -e ".python-version" ] run pyenv-version-file-write --force ".python-version" "2.7.6" assert_success assert [ -e ".python-version" ] } @test "writes value to arbitrary file" { mkdir -p "${PYENV_ROOT}/versions/2.7.6" assert [ ! -e "my-version" ] run pyenv-version-file-write "${PWD}/my-version" "2.7.6" assert_success "" assert [ "$(cat my-version)" = "2.7.6" ] } pyenv-pyenv-485090e/test/version-file.bats000066400000000000000000000035451517431316200205400ustar00rootroot00000000000000#!/usr/bin/env bats load test_helper _setup() { mkdir -p "${PYENV_TEST_DIR}" cd "$PYENV_TEST_DIR" } create_file() { mkdir -p "$(dirname "$1")" echo "system" > "$1" } @test "detects global 'version' file" { create_file "${PYENV_ROOT}/version" run pyenv-version-file assert_success "${PYENV_ROOT}/version" } @test "prints global file if no version files exist" { assert [ ! -e "${PYENV_ROOT}/version" ] assert [ ! -e ".python-version" ] run pyenv-version-file assert_success "${PYENV_ROOT}/version" } @test "in current directory" { create_file ".python-version" run pyenv-version-file assert_success "${PYENV_TEST_DIR}/.python-version" } @test "in parent directory" { create_file ".python-version" mkdir -p project cd project run pyenv-version-file assert_success "${PYENV_TEST_DIR}/.python-version" } @test "topmost file has precedence" { create_file ".python-version" create_file "project/.python-version" cd project run pyenv-version-file assert_success "${PYENV_TEST_DIR}/project/.python-version" } @test "PYENV_DIR has precedence over PWD" { create_file "widget/.python-version" create_file "project/.python-version" cd project PYENV_DIR="${PYENV_TEST_DIR}/widget" run pyenv-version-file assert_success "${PYENV_TEST_DIR}/widget/.python-version" } @test "PWD is searched if PYENV_DIR yields no results" { mkdir -p "widget/blank" create_file "project/.python-version" cd project PYENV_DIR="${PYENV_TEST_DIR}/widget/blank" run pyenv-version-file assert_success "${PYENV_TEST_DIR}/project/.python-version" } @test "finds version file in target directory" { create_file "project/.python-version" run pyenv-version-file "${PWD}/project" assert_success "${PYENV_TEST_DIR}/project/.python-version" } @test "fails when no version file in target directory" { run pyenv-version-file "$PWD" assert_failure "" } pyenv-pyenv-485090e/test/version-name.bats000066400000000000000000000063331517431316200205370ustar00rootroot00000000000000#!/usr/bin/env bats load test_helper create_version() { mkdir -p "${PYENV_ROOT}/versions/$1" } _setup() { mkdir -p "${PYENV_TEST_DIR}" cd "$PYENV_TEST_DIR" } @test "no version selected" { assert [ ! -d "${PYENV_ROOT}/versions" ] run pyenv-version-name assert_success "system" } @test "system version is not checked for existence" { PYENV_VERSION=system run pyenv-version-name assert_success "system" } @test "PYENV_VERSION can be overridden by hook" { create_version "2.7.11" create_version "3.5.1" create_hook version-name test.bash <<<"PYENV_VERSION=3.5.1" PYENV_VERSION=2.7.11 run pyenv-version-name assert_success "3.5.1" } @test "carries original IFS within hooks" { create_hook version-name hello.bash < ".python-version" <<<"2.7.11" run pyenv-version-name assert_success "2.7.11" PYENV_VERSION=3.5.1 run pyenv-version-name assert_success "3.5.1" } @test "local file has precedence over global" { create_version "2.7.11" create_version "3.5.1" cat > "${PYENV_ROOT}/version" <<<"2.7.11" run pyenv-version-name assert_success "2.7.11" cat > ".python-version" <<<"3.5.1" run pyenv-version-name assert_success "3.5.1" } @test "missing version" { PYENV_VERSION=1.2 run pyenv-version-name assert_failure "pyenv: version \`1.2' is not installed (set by PYENV_VERSION environment variable)" } @test "missing version with --force" { PYENV_VERSION=1.2 run pyenv-version-name -f assert_success "1.2" } @test "one missing version (second missing)" { create_version "3.5.1" PYENV_VERSION="3.5.1:1.2" run pyenv-version-name assert_failure assert_output </dev/null } @test "one missing version (without stderr)" { create_version "3.5.1" PYENV_VERSION="1.2:3.5.1" run pyenv-version-name-without-stderr assert_failure assert_output < ".python-version" <<<"python-2.7.11" run pyenv-version-name assert_success assert_output "2.7.11" } @test "falls back to pyenv-latest" { create_version "2.7.11" PYENV_VERSION="2.7" run pyenv-version-name assert_success assert_output "2.7.11" } @test "pyenv-latest fallback with prefix in name" { create_version "3.12.6" PYENV_VERSION="python-3.12" run pyenv-version-name assert_success assert_output "3.12.6" } @test "pyenv version started by python-" { create_version "python-3.12.6" PYENV_VERSION="python-3.12.6" run pyenv-version-name assert_success assert_output "python-3.12.6" } pyenv-pyenv-485090e/test/version-origin.bats000066400000000000000000000025241517431316200211040ustar00rootroot00000000000000#!/usr/bin/env bats load test_helper _setup() { mkdir -p "${PYENV_TEST_DIR}" cd "$PYENV_TEST_DIR" } @test "reports global file even if it doesn't exist" { assert [ ! -e "${PYENV_ROOT}/version" ] run pyenv-version-origin assert_success "${PYENV_ROOT}/version" } @test "detects global file" { mkdir -p "$PYENV_ROOT" touch "${PYENV_ROOT}/version" run pyenv-version-origin assert_success "${PYENV_ROOT}/version" } @test "detects PYENV_VERSION" { PYENV_VERSION=1 run pyenv-version-origin assert_success "PYENV_VERSION environment variable" } @test "detects local file" { echo "system" > .python-version run pyenv-version-origin assert_success "${PWD}/.python-version" } @test "reports from hook" { create_hook version-origin test.bash <<<"PYENV_VERSION_ORIGIN=plugin" PYENV_VERSION=1 run pyenv-version-origin assert_success "plugin" } @test "carries original IFS within hooks" { create_hook version-origin hello.bash < ".python-version" <<<"3.3.3" run pyenv-version assert_success "3.3.3 (set by ${PWD}/.python-version)" } @test "set by global file" { create_version "3.3.3" cat > "${PYENV_ROOT}/version" <<<"3.3.3" run pyenv-version assert_success "3.3.3 (set by ${PYENV_ROOT}/version)" } @test "set by PYENV_VERSION, one missing" { create_version "3.3.3" PYENV_VERSION=3.3.3:1.2 run pyenv-version assert_failure assert_output </dev/null } @test "set by PYENV_VERSION, one missing (stderr filtered)" { create_version "3.3.3" PYENV_VERSION=3.4.2:3.3.3 run pyenv-version-without-stderr assert_failure assert_output < "${PYENV_ROOT}/version" <<<"3.3.3" run pyenv-versions assert_success assert_output < ".python-version" <<<"3.3.3" run pyenv-versions assert_success assert_output </dev/null if [ "\$1" == "--version-sort" ]; then echo "${PYENV_ROOT}/versions/1.9.0" echo "${PYENV_ROOT}/versions/1.53.0" echo "${PYENV_ROOT}/versions/1.218.0" else exit 1 fi SH run pyenv-versions --bare assert_success assert_output < 1.9.0 OUT } pyenv-pyenv-485090e/test/whence.bats000066400000000000000000000007061517431316200174030ustar00rootroot00000000000000#!/usr/bin/env bats load test_helper @test "finds versions where present" { create_alt_executable_in_version "2.7" "python" create_alt_executable_in_version "2.7" "fab" create_alt_executable_in_version "3.4" "python" create_alt_executable_in_version "3.4" "py.test" run pyenv-whence python assert_success assert_output < "${PYENV_ROOT}/version" <<<"3.4" create_alt_executable_in_version "3.4" "python" mkdir -p "$PYENV_TEST_DIR" cd "$PYENV_TEST_DIR" PYENV_VERSION= run pyenv-which python assert_success "${PYENV_ROOT}/versions/3.4/bin/python" } @test "tolerates nonexistent versions from pyenv-version-name" { mkdir -p "$PYENV_ROOT" cat > "${PYENV_ROOT}/version" <