pax_global_header00006660000000000000000000000064147112100240014502gustar00rootroot0000000000000052 comment=2105caa49bae87c5809c274e407619a0de2639d1 cli-3.2.4/000077500000000000000000000000001471121002400122575ustar00rootroot00000000000000cli-3.2.4/.editorconfig000066400000000000000000000003661471121002400147410ustar00rootroot00000000000000# https://editorconfig.org root = true [*] indent_style = space indent_size = 4 end_of_line = lf charset = utf-8 trim_trailing_whitespace = true insert_final_newline = true [*.yml] indent_size = 2 [Makefile] indent_style = tab indent_size = 8 cli-3.2.4/.github/000077500000000000000000000000001471121002400136175ustar00rootroot00000000000000cli-3.2.4/.github/ISSUE_TEMPLATE/000077500000000000000000000000001471121002400160025ustar00rootroot00000000000000cli-3.2.4/.github/ISSUE_TEMPLATE/bug_report.md000066400000000000000000000011241471121002400204720ustar00rootroot00000000000000--- name: Bug report about: Report a possible bug in HTTPie title: '' labels: "new, bug" assignees: '' --- ## Checklist - [ ] I've searched for similar issues. - [ ] I'm using the latest version of HTTPie. --- ## Minimal reproduction code and steps 1. 2. 3. ## Current result … ## Expected result … --- ## Debug output Please re-run the command with `--debug`, then copy the entire command & output and paste both below: ```bash $ http --debug ``` ## Additional information, screenshots, or code examples … cli-3.2.4/.github/ISSUE_TEMPLATE/feature_request.md000066400000000000000000000006311471121002400215270ustar00rootroot00000000000000--- name: Feature request about: Suggest an enhancement for HTTPie title: '' labels: "new, enhancement" assignees: '' --- ## Checklist - [ ] I've searched for similar feature requests. --- ## Enhancement request … --- ## Problem it solves E.g. “I'm always frustrated when […]”, “I’m trying to do […] so that […]”. --- ## Additional information, screenshots, or code examples … cli-3.2.4/.github/ISSUE_TEMPLATE/other.md000066400000000000000000000003111471121002400174400ustar00rootroot00000000000000--- name: Other about: Anything else that isn't a feature or a bug title: '' labels: "new" assignees: '' --- If you have a general question, please consider asking on Discord: https://httpie.io/chat cli-3.2.4/.github/dependabot.yml000066400000000000000000000002411471121002400164440ustar00rootroot00000000000000version: 2 updates: # GitHub Actions - package-ecosystem: github-actions directory: / schedule: interval: daily assignees: - BoboTiG cli-3.2.4/.github/workflows/000077500000000000000000000000001471121002400156545ustar00rootroot00000000000000cli-3.2.4/.github/workflows/benchmark.yml000066400000000000000000000026251471121002400203360ustar00rootroot00000000000000name: Benchmark on: pull_request: types: [ labeled ] permissions: issues: write pull-requests: write jobs: test: if: github.event.label.name == 'benchmark' runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - uses: actions/setup-python@v4 with: python-version: "3.9" - id: benchmarks name: Run Benchmarks run: | python -m pip install pyperf>=2.3.0 python extras/profiling/run.py --fresh --complex --min-speed=6 --file output.txt body=$(cat output.txt) body="${body//'%'/'%25'}" body="${body//$'\n'/'%0A'}" body="${body//$'\r'/'%0D'}" echo "::set-output name=body::$body" - name: Find Comment uses: peter-evans/find-comment@v2 id: fc with: issue-number: ${{ github.event.pull_request.number }} comment-author: 'github-actions[bot]' body-includes: '# Benchmarks' - name: Create or update comment uses: peter-evans/create-or-update-comment@v2 with: comment-id: ${{ steps.fc.outputs.comment-id }} issue-number: ${{ github.event.pull_request.number }} body: | # Benchmarks ${{ steps.benchmarks.outputs.body }} edit-mode: replace - uses: actions-ecosystem/action-remove-labels@v1 with: labels: benchmark cli-3.2.4/.github/workflows/code-style.yml000066400000000000000000000006241471121002400204510ustar00rootroot00000000000000name: Code Style Check on: pull_request: paths: - .github/workflows/code-style.yml - extras/*.py - httpie/**/*.py - setup.py - tests/**/*.py jobs: code-style: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - uses: actions/setup-python@v4 with: python-version: 3.9 - run: make venv - run: make codestyle cli-3.2.4/.github/workflows/content.yml000066400000000000000000000011111471121002400200430ustar00rootroot00000000000000name: Update Generated Content on: push: branches: - master jobs: update-content: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - uses: actions/setup-python@v4 with: python-version: 3.9 - run: make content - name: Create Pull Request id: cpr uses: peter-evans/create-pull-request@v4 with: commit-message: "[automated] Update generated content" title: "[automated] Update generated content" delete-branch: true token: ${{ secrets.GITHUB_TOKEN }} cli-3.2.4/.github/workflows/coverage.yml000066400000000000000000000007771471121002400202050ustar00rootroot00000000000000name: Coverage on: pull_request: paths: - .github/workflows/coverage.yml - httpie/**/*.py - setup.* - tests/**/*.py jobs: coverage: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - uses: actions/setup-python@v4 with: python-version: "3.10" - run: make install - run: make test-cover - run: make codecov-upload env: CODECOV_TOKEN: ${{ secrets.CODECOV_REPO_TOKEN }} - run: make test-dist cli-3.2.4/.github/workflows/docs-check-markdown.yml000066400000000000000000000006171471121002400222260ustar00rootroot00000000000000name: Check Markdown Style on: pull_request: paths: - "*.md" - "**/*.md" jobs: doc: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Setup Ruby uses: ruby/setup-ruby@v1 with: ruby-version: 2.7 - name: Install the linter run: sudo gem install mdl - name: Check files run: make doc-check cli-3.2.4/.github/workflows/docs-deploy.yml000066400000000000000000000007121471121002400206210ustar00rootroot00000000000000name: Deploy Documentation on: push: branches: - master paths: - docs/README.md - docs/config.json release: types: - published - unpublished - deleted jobs: trigger-doc-build: runs-on: ubuntu-latest steps: - name: Install HTTPie run: sudo pip install httpie - name: Trigger new documentation build run: http --ignore-stdin POST ${{ secrets.DOCS_UPDATE_VERCEL_HOOK }} cli-3.2.4/.github/workflows/release-brew.yml000066400000000000000000000011451471121002400207550ustar00rootroot00000000000000name: Release on Homebrew on: workflow_dispatch: inputs: branch: description: "The branch, tag or SHA to release from" required: true default: "master" jobs: brew-release: name: Release the Homebrew Package runs-on: macos-latest steps: - uses: actions/checkout@v3 with: ref: ${{ github.event.inputs.branch }} - uses: mislav/bump-homebrew-formula-action@v2 with: formula-name: httpie tag-name: ${{ github.events.inputs.branch }} env: COMMITTER_TOKEN: ${{ secrets.BREW_UPDATE_TOKEN }} cli-3.2.4/.github/workflows/release-choco.yml000066400000000000000000000036311471121002400211130ustar00rootroot00000000000000name: Release on Chocolatey on: workflow_dispatch: inputs: branch: description: "The branch, tag or SHA to release from" required: true default: "master" jobs: brew-release: name: Release the Chocolatey runs-on: windows-2019 env: package-dir: docs\packaging\windows-chocolatey steps: - uses: actions/checkout@v3 with: ref: ${{ github.event.inputs.branch }} # Chocolatey comes already installed on the Windows GHA image - name: Build the Choco package shell: cmd run: choco pack -v working-directory: ${{ env.package-dir }} - name: Check the Choco package run: choco info httpie -s . working-directory: ${{ env.package-dir }} - name: Local installation run: | choco install httpie -y -dv -s "'.;https://community.chocolatey.org/api/v2/'" working-directory: ${{ env.package-dir }} - name: Test the locally installed binaries run: | # Source: https://stackoverflow.com/a/46760714/15330941 # Make `refreshenv` available right away, by defining the $env:ChocolateyInstall # variable and importing the Chocolatey profile module. $env:ChocolateyInstall = Convert-Path "$((Get-Command choco).Path)\..\.." Import-Module "$env:ChocolateyInstall\helpers\chocolateyProfile.psm1" refreshenv http --version https --version httpie --version choco uninstall -y httpie working-directory: ${{ env.package-dir }} - name: Publish on Chocolatey shell: bash env: CHOCO_API_KEY: ${{ secrets.CHOCO_API_KEY }} run: | choco apikey --key $CHOCO_API_KEY --source https://push.chocolatey.org/ choco push httpie*.nupkg --source https://push.chocolatey.org/ working-directory: ${{ env.package-dir }} cli-3.2.4/.github/workflows/release-linux-standalone.yml000066400000000000000000000045471471121002400233140ustar00rootroot00000000000000name: Release as Standalone Linux Package on: workflow_dispatch: inputs: branch: description: "The branch, tag or SHA to release from" required: true default: "master" tag_name: description: "Which release to upload the artifacts to (e.g., 3.0)" required: true release: types: [released, prereleased] jobs: binary-build-and-release: name: Build and Release runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 with: ref: ${{ github.event.inputs.branch }} - uses: actions/setup-python@v4 with: python-version: 3.9 - name: Build Artifacts run: | cd extras/packaging/linux ./get_release_artifacts.sh - uses: actions/upload-artifact@v3 with: name: http path: extras/packaging/linux/artifacts/dist/http - uses: actions/upload-artifact@v3 with: name: httpie.deb path: extras/packaging/linux/artifacts/dist/*.deb - uses: actions/upload-artifact@v3 with: name: httpie.rpm path: extras/packaging/linux/artifacts/dist/*.rpm - name: Determine the release upload upload_url id: release_id run: | pip install httpie export API_URL="api.github.com/repos/httpie/cli/releases/tags/${{ github.event.inputs.tag_name }}" export UPLOAD_URL=`https --ignore-stdin GET $API_URL | jq -r ".upload_url"` echo "::set-output name=UPLOAD_URL::$UPLOAD_URL" - name: Publish Debian Package uses: actions/upload-release-asset@v1.0.2 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: upload_url: ${{ steps.release_id.outputs.UPLOAD_URL }} asset_path: extras/packaging/linux/artifacts/dist/httpie_${{ github.event.inputs.tag_name }}_amd64.deb asset_name: httpie-${{ github.event.inputs.tag_name }}.deb asset_content_type: binary/octet-stream - name: Publish Single Executable uses: actions/upload-release-asset@v1.0.2 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: upload_url: ${{ steps.release_id.outputs.UPLOAD_URL }} asset_path: extras/packaging/linux/artifacts/dist/http asset_name: http asset_content_type: binary/octet-stream cli-3.2.4/.github/workflows/release-pypi.yml000066400000000000000000000012751471121002400210030ustar00rootroot00000000000000name: Release on PyPI on: workflow_dispatch: inputs: branch: description: "The branch, tag or SHA to release from" required: true default: "master" jobs: pypi-build-and-release: name: Build and Release runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 with: ref: ${{ github.event.inputs.branch }} - uses: actions/setup-python@v4 with: python-version: 3.9 - name: Build a binary wheel and a source tarball run: make install && make build - name: Release on PyPI uses: pypa/gh-action-pypi-publish@master with: password: ${{ secrets.PYPI_TOKEN }} cli-3.2.4/.github/workflows/release-snap.yml000066400000000000000000000020521471121002400207550ustar00rootroot00000000000000name: Release on Snap on: workflow_dispatch: inputs: branch: description: "The branch, tag or SHA to release from" required: true default: "master" jobs: snap-build-and-release: name: Build & Release the Snap Package runs-on: ubuntu-latest strategy: # If any of the stages fail, then we'll stop the action # to give release manager time to investigate the underlying # issue. fail-fast: true matrix: level: [edge, beta, candidate, stable] # Set the concurrency level for this version, so # that we'll release one by one. concurrency: ${{ github.event.inputs.branch }} steps: - uses: actions/checkout@v3 with: ref: ${{ github.event.inputs.branch }} - uses: snapcore/action-build@v1 id: build - uses: snapcore/action-publish@v1 env: SNAPCRAFT_STORE_CREDENTIALS: ${{ secrets.SNAP_STORE_LOGIN }} with: snap: ${{ steps.build.outputs.snap }} release: ${{ matrix.level }} cli-3.2.4/.github/workflows/stale.yml000066400000000000000000000012231471121002400175050ustar00rootroot00000000000000name: Mark stale pull requests on: workflow_dispatch permissions: pull-requests: write jobs: stale: runs-on: ubuntu-latest steps: - uses: actions/stale@v8 with: close-pr-message: 'Thanks for the pull request, but since it was stale for more than a 30 days we are closing it. If you want to work back on it, feel free to re-open it or create a new one.' stale-pr-label: 'stale' days-before-stale: -1 days-before-issue-stale: -1 days-before-pr-stale: 30 days-before-close: -1 days-before-issue-close: -1 days-before-pr-close: 0 operations-per-run: 300 cli-3.2.4/.github/workflows/test-package-linux-snap.yml000066400000000000000000000012711471121002400230440ustar00rootroot00000000000000name: Test Snap Package (Linux) on: pull_request: paths: - .github/workflows/test-package-linux-snap.yml - snapcraft.yaml workflow_dispatch: jobs: snap: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Build uses: snapcore/action-build@v1 id: snapcraft - name: Install run: sudo snap install --dangerous ${{ steps.snapcraft.outputs.snap }} - name: Test run: | httpie.http --version httpie.https --version httpie --version # Auto-aliases cannot be tested when installing a snap outside the store. # http --version # https --version cli-3.2.4/.github/workflows/test-package-mac-brew.yml000066400000000000000000000006441471121002400224460ustar00rootroot00000000000000name: Test Brew Package (MacOS) on: pull_request: paths: - .github/workflows/test-package-mac-brew.yml - docs/packaging/brew/httpie.rb workflow_dispatch: jobs: brew: runs-on: macos-latest steps: - uses: actions/checkout@v3 - name: Setup brew run: | brew developer on brew update - name: Build and test the formula run: make brew-test cli-3.2.4/.github/workflows/tests.yml000066400000000000000000000025221471121002400175420ustar00rootroot00000000000000name: Tests concurrency: group: ${{ github.head_ref || github.run_id }} cancel-in-progress: true on: push: branches: - master paths: - .github/workflows/tests.yml - httpie/**/*.py - setup.* - tests/**/*.py pull_request: paths: - .github/workflows/tests.yml - httpie/**/*.py - setup.* - tests/**/*.py jobs: test: strategy: fail-fast: false matrix: os: [ubuntu-latest, macos-13, windows-latest] python-version: - '3.12' - '3.11' - '3.10' - '3.9' - '3.8' - '3.7' pyopenssl: [0, 1] runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v4 - uses: actions/setup-python@v4 with: python-version: ${{ matrix.python-version }} - name: Windows setup if: matrix.os == 'windows-latest' run: | python -m pip install --upgrade pip wheel python -m pip install --upgrade '.[dev]' python -m pytest --verbose ./httpie ./tests env: HTTPIE_TEST_WITH_PYOPENSSL: ${{ matrix.pyopenssl }} - name: Linux & Mac setup if: matrix.os != 'windows-latest' run: | make install make test env: HTTPIE_TEST_WITH_PYOPENSSL: ${{ matrix.pyopenssl }} cli-3.2.4/.gitignore000066400000000000000000000043221471121002400142500ustar00rootroot00000000000000.DS_Store .idea/ *.egg-info .cache/ *.pyc htmlcov ############################################################################## # The below is GitHub template for Python project. gitignore. # ############################################################################## # Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] *$py.class # C extensions *.so # Distribution / packaging .Python build/ develop-eggs/ dist/ downloads/ eggs/ .eggs/ lib/ lib64/ parts/ sdist/ var/ wheels/ pip-wheel-metadata/ share/python-wheels/ *.egg-info/ .installed.cfg *.egg MANIFEST # PyInstaller # Usually these files are written by a python script from a template # before PyInstaller builds the exe, so as to inject date/other infos into it. *.spec *.manifest # Installer logs pip-log.txt pip-delete-this-directory.txt # Unit test / coverage reports htmlcov/ .nox/ .coverage .coverage.* .cache nosetests.xml coverage.xml *.cover *.py,cover .hypothesis/ .pytest_cache/ # Translations *.mo *.pot # Django stuff: *.log local_settings.py db.sqlite3 db.sqlite3-journal # Flask stuff: instance/ .webassets-cache # Scrapy stuff: .scrapy # Sphinx documentation docs/_build/ # PyBuilder target/ # Jupyter Notebook .ipynb_checkpoints # IPython profile_default/ ipython_config.py # pyenv .python-version # pipenv # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. # However, in case of collaboration, if having platform-specific dependencies or dependencies # having no cross-platform support, pipenv may install dependencies that don't work, or not # install all needed dependencies. #Pipfile.lock # PEP 582; used by e.g. github.com/David-OConnor/pyflow __pypackages__/ # Celery stuff celerybeat-schedule celerybeat.pid # SageMath parsed files *.sage.py # Environments .env .venv env/ venv/ venv*/ ENV/ env.bak/ venv.bak/ # Spyder project settings .spyderproject .spyproject # Rope project settings .ropeproject # mkdocs documentation /site # mypy .mypy_cache/ .dmypy.json dmypy.json # Pyre type checker .pyre/ # Packit /httpie.spec /httpie-*.rpm /httpie-*.tar.gz # VS Code .vscode/ # Windows Chocolatey *.nupkg artifacts/ cli-3.2.4/.packit.yaml000066400000000000000000000010101471121002400144640ustar00rootroot00000000000000# See the documentation for more information: # https://packit.dev/docs/configuration/ specfile_path: httpie.spec actions: # get the current Fedora Rawhide specfile: post-upstream-clone: "wget https://src.fedoraproject.org/rpms/httpie/raw/rawhide/f/httpie.spec -O httpie.spec" # Use this when the latest spec is not up-to-date. # post-upstream-clone: "cp docs/packaging/linux-fedora/httpie.spec.txt httpie.spec" jobs: - job: propose_downstream trigger: release metadata: dist_git_branches: - rawhide cli-3.2.4/AUTHORS.md000066400000000000000000000033711471121002400137320ustar00rootroot00000000000000# HTTPie authors - [Jakub Roztocil](https://github.com/jakubroztocil) ## Patches, features, ideas [Complete list of contributors on GitHub](https://github.com/httpie/cli/graphs/contributors) - [Cláudia T. Delgado](https://github.com/claudiatd) - [Hank Gay](https://github.com/gthank) - [Jake Basile](https://github.com/jakebasile) - [Vladimir Berkutov](https://github.com/dair-targ) - [Jakob Kramer](https://github.com/gandaro) - [Chris Faulkner](https://github.com/faulkner) - [Alen Mujezinovic](https://github.com/flashingpumpkin) - [Praful Mathur](https://github.com/tictactix) - [Marc Abramowitz](https://github.com/msabramo) - [Ismail Badawi](https://github.com/isbadawi) - [Laurent Bachelier](https://github.com/laurentb) - [Isman Firmansyah](https://github.com/iromli) - [Simon Olofsson](https://github.com/simono) - [Churkin Oleg](https://github.com/Bahus) - [Jökull Sólberg Auðunsson](https://github.com/jokull) - [Matthew M. Boedicker](https://github.com/mmb) - [marblar](https://github.com/marblar) - [Tomek Wójcik](https://github.com/tomekwojcik) - [Davey Shafik](https://github.com/dshafik) - [cido](https://github.com/cido) - [Justin Bonnar](https://github.com/jargonjustin) - [Nathan LaFreniere](https://github.com/nlf) - [Matthias Lehmann](https://github.com/matleh) - [Dennis Brakhane](https://github.com/brakhane) - [Matt Layman](https://github.com/mblayman) - [Edward Yang](https://github.com/honorabrutroll) - [Aleksandr Vinokurov](https://github.com/aleksandr-vin) - [Jeff Byrnes](https://github.com/jeffbyrnes) - [Denis Belavin](https://github.com/LuckyDenis) - [Mickaël Schoentgen](https://github.com/BoboTiG) - [Elena Lape](https://github.com/elenalape) - [Rohit Sehgal](https://github.com/r0hi7) - [Bartłomiej Jacak](https://github.com/bartekjacak) cli-3.2.4/CHANGELOG.md000066400000000000000000000636501471121002400141020ustar00rootroot00000000000000# Change Log This document records all notable changes to [HTTPie](https://httpie.io). This project adheres to [Semantic Versioning](https://semver.org/). ## [3.2.4](https://github.com/httpie/cli/compare/3.2.3...3.2.4) (2024-11-01) - Fix default certs loading and unpin `requests`. ([#1596](https://github.com/httpie/cli/issues/1596)) ## [3.2.3](https://github.com/httpie/cli/compare/3.2.2...3.2.3) (2024-07-10) - Fix SSL connections by pinning the `requests` version to `2.31.0`. (#1583, #1581) - Make it possible to [unset](https://httpie.io/docs/cli/default-request-headers) the `User-Agent` and `Accept-Encoding` request headers. ([#1502](https://github.com/httpie/cli/issues/1502)) ## [3.2.2](https://github.com/httpie/cli/compare/3.2.1...3.2.2) (2023-05-19) - Fixed compatibility with urllib3 2.0.0. ([#1499](https://github.com/httpie/cli/issues/1499)) ## [3.2.1](https://github.com/httpie/cli/compare/3.1.0...3.2.1) (2022-05-06) - Improved support for determining auto-streaming when the `Content-Type` header includes encoding information. ([#1383](https://github.com/httpie/cli/pull/1383)) - Fixed the display of the crash happening in the secondary process for update checks. ([#1388](https://github.com/httpie/cli/issues/1388)) ## [3.2.0](https://github.com/httpie/cli/compare/3.1.0...3.2.0) (2022-05-05) - Added a warning for notifying the user about the new updates. ([#1336](https://github.com/httpie/cli/pull/1336)) - Added support for single binary executables. ([#1330](https://github.com/httpie/cli/pull/1330)) - Added support for man pages (and auto generation of them from the parser declaration). ([#1317](https://github.com/httpie/cli/pull/1317)) - Added `http --manual` for man pages & regular manual with pager. ([#1343](https://github.com/httpie/cli/pull/1343)) - Added support for session persistence of repeated headers with the same name. ([#1335](https://github.com/httpie/cli/pull/1335)) - Added support for sending `Secure` cookies to the `localhost` (and `.local` suffixed domains). ([#1308](https://github.com/httpie/cli/issues/1308)) - Improved UI for the progress bars. ([#1324](https://github.com/httpie/cli/pull/1324)) - Fixed redundant creation of `Content-Length` header on `OPTIONS` requests. ([#1310](https://github.com/httpie/cli/issues/1310)) - Fixed blocking of warning thread on some use cases. ([#1349](https://github.com/httpie/cli/issues/1349)) - Changed `httpie plugins` to the new `httpie cli` namespace as `httpie cli plugins` (`httpie plugins` continues to work as a hidden alias). ([#1320](https://github.com/httpie/cli/issues/1320)) - Soft deprecated the `--history-print`. ([#1380](https://github.com/httpie/cli/pull/1380)) ## [3.1.0](https://github.com/httpie/cli/compare/3.0.2...3.1.0) (2022-03-08) - **SECURITY** Fixed the [vulnerability](https://github.com/httpie/cli/security/advisories/GHSA-9w4w-cpc8-h2fq) that caused exposure of cookies on redirects to third party hosts. ([#1312](https://github.com/httpie/cli/pull/1312)) - Fixed escaping of integer indexes with multiple backslashes in the nested JSON builder. ([#1285](https://github.com/httpie/cli/issues/1285)) - Fixed displaying of status code without a status message on non-`auto` themes. ([#1300](https://github.com/httpie/cli/issues/1300)) - Fixed redundant issuance of stdin detection warnings on some rare cases due to underlying implementation. ([#1303](https://github.com/httpie/cli/pull/1303)) - Fixed double `--quiet` so that it will now suppress all python level warnings. ([#1271](https://github.com/httpie/cli/issues/1271)) - Added support for specifying certificate private key passphrases through `--cert-key-pass` and prompts. ([#946](https://github.com/httpie/cli/issues/946)) - Added `httpie cli export-args` command for exposing the parser specification for the `http`/`https` commands. ([#1293](https://github.com/httpie/cli/pull/1293)) - Improved regulation of top-level arrays. ([#1292](https://github.com/httpie/cli/commit/225dccb2186f14f871695b6c4e0bfbcdb2e3aa28)) - Improved UI layout for standalone invocations. ([#1296](https://github.com/httpie/cli/pull/1296)) ## [3.0.2](https://github.com/httpie/cli/compare/3.0.1...3.0.2) (2022-01-24) [What’s new in HTTPie for Terminal 3.0 →](https://httpie.io/blog/httpie-3.0.0) - Fixed usage of `httpie` when there is a presence of a config with `default_options`. ([#1280](https://github.com/httpie/cli/pull/1280)) ## [3.0.1](https://github.com/httpie/cli/compare/3.0.0...3.0.1) (2022-01-23) [What’s new in HTTPie for Terminal 3.0 →](https://httpie.io/blog/httpie-3.0.0) - Changed the value shown as time elapsed from time-to-read-headers to total exchange time. ([#1277](https://github.com/httpie/cli/issues/1277)) ## [3.0.0](https://github.com/httpie/cli/compare/2.6.0...3.0.0) (2022-01-21) [What’s new in HTTPie for Terminal 3.0 →](https://httpie.io/blog/httpie-3.0.0) - Dropped support for Python 3.6. ([#1177](https://github.com/httpie/cli/issues/1177)) - Improved startup time by 40%. ([#1211](https://github.com/httpie/cli/pull/1211)) - Added support for nested JSON syntax. ([#1169](https://github.com/httpie/cli/issues/1169)) - Added `httpie plugins` interface for plugin management. ([#566](https://github.com/httpie/cli/issues/566)) - Added support for Bearer authentication via `--auth-type=bearer` ([#1215](https://github.com/httpie/cli/issues/1215)). - Added support for quick conversions of pasted URLs into HTTPie calls by adding a space after the protocol name (`$ https ://pie.dev` → `https://pie.dev`). ([#1195](https://github.com/httpie/cli/issues/1195)) - Added support for _sending_ multiple HTTP header lines with the same name. ([#130](https://github.com/httpie/cli/issues/130)) - Added support for _receiving_ multiple HTTP headers lines with the same name. ([#1207](https://github.com/httpie/cli/issues/1207)) - Added support for basic JSON types on `--form`/`--multipart` when using JSON only operators (`:=`/`:=@`). ([#1212](https://github.com/httpie/cli/issues/1212)) - Added support for automatically enabling `--stream` when `Content-Type` is `text/event-stream`. ([#376](https://github.com/httpie/cli/issues/376)) - Added support for displaying the total elapsed time through `--meta`/`-vv` or `--print=m`. ([#243](https://github.com/httpie/cli/issues/243)) - Added new `pie-dark`/`pie-light` (and `pie`) styles that match with [HTTPie for Web and Desktop](https://httpie.io/product). ([#1237](https://github.com/httpie/cli/issues/1237)) - Added support for better error handling on DNS failures. ([#1248](https://github.com/httpie/cli/issues/1248)) - Added support for storing prompted passwords in the local sessions. ([#1098](https://github.com/httpie/cli/issues/1098)) - Added warnings about the `--ignore-stdin`, when there is no incoming data from stdin. ([#1255](https://github.com/httpie/cli/issues/1255)) - Fixed crashing due to broken plugins. ([#1204](https://github.com/httpie/cli/issues/1204)) - Fixed auto addition of XML declaration to every formatted XML response. ([#1156](https://github.com/httpie/cli/issues/1156)) - Fixed highlighting when `Content-Type` specifies `charset`. ([#1242](https://github.com/httpie/cli/issues/1242)) - Fixed an unexpected crash when `--raw` is used with `--chunked`. ([#1253](https://github.com/httpie/cli/issues/1253)) - Changed the default Windows theme from `fruity` to `auto`. ([#1266](https://github.com/httpie/cli/issues/1266)) ## [2.6.0](https://github.com/httpie/cli/compare/2.5.0...2.6.0) (2021-10-14) [What’s new in HTTPie for Terminal 2.6.0 →](https://httpie.io/blog/httpie-2.6.0) - Added support for formatting & coloring of JSON bodies preceded by non-JSON data (e.g., an XXSI prefix). ([#1130](https://github.com/httpie/cli/issues/1130)) - Added charset auto-detection when `Content-Type` doesn’t include it. ([#1110](https://github.com/httpie/cli/issues/1110), [#1168](https://github.com/httpie/cli/issues/1168)) - Added `--response-charset` to allow overriding the response encoding for terminal display purposes. ([#1168](https://github.com/httpie/cli/issues/1168)) - Added `--response-mime` to allow overriding the response mime type for coloring and formatting for the terminal. ([#1168](https://github.com/httpie/cli/issues/1168)) - Added the ability to silence warnings through using `-q` or `--quiet` twice (e.g. `-qq`) ([#1175](https://github.com/httpie/cli/issues/1175)) - Added installed plugin list to `--debug` output. ([#1165](https://github.com/httpie/cli/issues/1165)) - Fixed duplicate keys preservation in JSON data. ([#1163](https://github.com/httpie/cli/issues/1163)) ## [2.5.0](https://github.com/httpie/cli/compare/2.4.0...2.5.0) (2021-09-06) [What’s new in HTTPie for Terminal 2.5.0 →](https://httpie.io/blog/httpie-2.5.0) - Added `--raw` to allow specifying the raw request body without extra processing as an alternative to `stdin`. ([#534](https://github.com/httpie/cli/issues/534)) - Added support for XML formatting. ([#1129](https://github.com/httpie/cli/issues/1129)) - Added internal support for file-like object responses to improve adapter plugin support. ([#1094](https://github.com/httpie/cli/issues/1094)) - Fixed `--continue --download` with a single byte to be downloaded left. ([#1032](https://github.com/httpie/cli/issues/1032)) - Fixed `--verbose` HTTP 307 redirects with streamed request body. ([#1088](https://github.com/httpie/cli/issues/1088)) - Fixed handling of session files with `Cookie:` followed by other headers. ([#1126](https://github.com/httpie/cli/issues/1126)) ## [2.4.0](https://github.com/httpie/cli/compare/2.3.0...2.4.0) (2021-02-06) - Added support for `--session` cookie expiration based on `Set-Cookie: max-age=`. ([#1029](https://github.com/httpie/cli/issues/1029)) - Show a `--check-status` warning with `--quiet` as well, not only when the output is redirected. ([#1026](https://github.com/httpie/cli/issues/1026)) - Fixed upload with `--session` ([#1020](https://github.com/httpie/cli/issues/1020)). - Fixed a missing blank line between request and response ([#1006](https://github.com/httpie/cli/issues/1006)). ## [2.3.0](https://github.com/httpie/cli/compare/2.2.0...2.3.0) (2020-10-25) - Added support for streamed uploads ([#201](https://github.com/httpie/cli/issues/201)). - Added support for multipart upload streaming ([#684](https://github.com/httpie/cli/issues/684)). - Added support for body-from-file upload streaming (`http pie.dev/post @file`). - Added `--chunked` to enable chunked transfer encoding ([#753](https://github.com/httpie/cli/issues/753)). - Added `--multipart` to allow `multipart/form-data` encoding for non-file `--form` requests as well. - Added support for preserving field order in multipart requests ([#903](https://github.com/httpie/cli/issues/903)). - Added `--boundary` to allow a custom boundary string for `multipart/form-data` requests. - Added support for combining cookies specified on the CLI and in a session file ([#932](https://github.com/httpie/cli/issues/932)). - Added out of the box SOCKS support with no extra installation ([#904](https://github.com/httpie/cli/issues/904)). - Added `--quiet, -q` flag to enforce silent behaviour. - Fixed the handling of invalid `expires` dates in `Set-Cookie` headers ([#963](https://github.com/httpie/cli/issues/963)). - Removed Tox testing entirely ([#943](https://github.com/httpie/cli/issues/943)). ## [2.2.0](https://github.com/httpie/cli/compare/2.1.0...2.2.0) (2020-06-18) - Added support for custom content types for uploaded files ([#668](https://github.com/httpie/cli/issues/668)). - Added support for `$XDG_CONFIG_HOME` ([#920](https://github.com/httpie/cli/issues/920)). - Added support for `Set-Cookie`-triggered cookie expiration ([#853](https://github.com/httpie/cli/issues/853)). - Added `--format-options` to allow disabling sorting, etc. ([#128](https://github.com/httpie/cli/issues/128)) - Added `--sorted` and `--unsorted` shortcuts for (un)setting all sorting-related `--format-options`. ([#128](https://github.com/httpie/cli/issues/128)) - Added `--ciphers` to allow configuring OpenSSL ciphers ([#870](https://github.com/httpie/cli/issues/870)). - Added `netrc` support for auth plugins. Enabled for `--auth-type=basic` and `digest`, 3rd parties may opt in ([#718](https://github.com/httpie/cli/issues/718), [#719](https://github.com/httpie/cli/issues/719), [#852](https://github.com/httpie/cli/issues/852), [#934](https://github.com/httpie/cli/issues/934)). - Fixed built-in plugins-related circular imports ([#925](https://github.com/httpie/cli/issues/925)). ## [2.1.0](https://github.com/httpie/cli/compare/2.0.0...2.1.0) (2020-04-18) - Added `--path-as-is` to bypass dot segment (`/../` or `/./`) URL squashing ([#895](https://github.com/httpie/cli/issues/895)). - Changed the default `Accept` header value for JSON requests from `application/json, */*` to `application/json, */*;q=0.5` to clearly indicate preference ([#488](https://github.com/httpie/cli/issues/488)). - Fixed `--form` file upload mixed with redirected `stdin` error handling ([#840](https://github.com/httpie/cli/issues/840)). ## [2.0.0](https://github.com/httpie/cli/compare/1.0.3...2.0.0) (2020-01-12) - Removed Python 2.7 support ([EOL Jan 2020](https://www.python.org/doc/sunset-python-2/). - Added `--offline` to allow building an HTTP request and printing it but not actually sending it over the network. - Replaced the old collect-all-then-process handling of HTTP communication with one-by-one processing of each HTTP request or response as they become available. This means that you can see headers immediately, see what is being sent even if the request fails, etc. - Removed automatic config file creation to avoid concurrency issues. - Removed the default 30-second connection `--timeout` limit. - Removed Python’s default limit of 100 response headers. - Added `--max-headers` to allow setting the max header limit. - Added `--compress` to allow request body compression. - Added `--ignore-netrc` to allow bypassing credentials from `.netrc`. - Added `https` alias command with `https://` as the default scheme. - Added `$ALL_PROXY` documentation. - Added type annotations throughout the codebase. - Added `tests/` to the PyPi package for the convenience of downstream package maintainers. - Fixed an error when `stdin` was a closed fd. - Improved `--debug` output formatting. ## [1.0.3](https://github.com/httpie/cli/compare/1.0.2...1.0.3) (2019-08-26) - Fixed CVE-2019-10751 — the way the output filename is generated for `--download` requests without `--output` resulting in a redirect has been changed to only consider the initial URL as the base for the generated filename, and not the final one. This fixes a potential security issue under the following scenario: 1. A `--download` request with no explicit `--output` is made (e.g., `$ http -d example.org/file.txt`), instructing httpie to [generate the output filename](https://httpie.org/doc#downloaded-filename) from the `Content-Disposition` response header, or from the URL if the header is not provided. 2. The server handling the request has been modified by an attacker and instead of the expected response the URL returns a redirect to another URL, e.g., `attacker.example.org/.bash_profile`, whose response does not provide a `Content-Disposition` header (i.e., the base for the generated filename becomes `.bash_profile` instead of `file.txt`). 3. Your current directory doesn’t already contain `.bash_profile` (i.e., no unique suffix is added to the generated filename). 4. You don’t notice the potentially unexpected output filename as reported by httpie in the console output (e.g., `Downloading 100.00 B to ".bash_profile"`). Reported by Raul Onitza and Giulio Comi. ## [1.0.2](https://github.com/httpie/cli/compare/1.0.1...1.0.2) (2018-11-14) - Fixed tests for installation with pyOpenSSL. ## [1.0.1](https://github.com/httpie/cli/compare/1.0.0...1.0.1) (2018-11-14) - Removed external URL calls from tests. ## [1.0.0](https://github.com/httpie/cli/compare/0.9.9...1.0.0) (2018-11-02) - Added `--style=auto` which follows the terminal ANSI color styles. - Added support for selecting TLS 1.3 via `--ssl=tls1.3` (available once implemented in upstream libraries). - Added `true`/`false` as valid values for `--verify` (in addition to `yes`/`no`) and the boolean value is case-insensitive. - Changed the default `--style` from `solarized` to `auto` (on Windows it stays `fruity`). - Fixed default headers being incorrectly case-sensitive. - Removed Python 2.6 support. ## [0.9.9](https://github.com/httpie/cli/compare/0.9.8...0.9.9) (2016-12-08) - Fixed README. ## [0.9.8](https://github.com/httpie/cli/compare/0.9.6...0.9.8) (2016-12-08) - Extended auth plugin API. - Added exit status code `7` for plugin errors. - Added support for `curses`-less Python installations. - Fixed `REQUEST_ITEM` arg incorrectly being reported as required. - Improved `CTRL-C` interrupt handling. - Added the standard exit status code `130` for keyboard interrupts. ## [0.9.6](https://github.com/httpie/cli/compare/0.9.4...0.9.6) (2016-08-13) - Added Python 3 as a dependency for Homebrew installations to ensure some of the newer HTTP features work out of the box for macOS users (starting with HTTPie 0.9.4.). - Added the ability to unset a request header with `Header:`, and send an empty value with `Header;`. - Added `--default-scheme ` to enable things like `$ alias https='http --default-scheme=https`. - Added `-I` as a shortcut for `--ignore-stdin`. - Added fish shell completion (located in `extras/httpie-completion.fish` in the GitHub repo). - Updated `requests` to 2.10.0 so that SOCKS support can be added via `pip install requests[socks]`. - Changed the default JSON `Accept` header from `application/json` to `application/json, */*`. - Changed the pre-processing of request HTTP headers so that any leading and trailing whitespace is removed. ## [0.9.4](https://github.com/httpie/cli/compare/0.9.3...0.9.4) (2016-07-01) - Added `Content-Type` of files uploaded in `multipart/form-data` requests - Added `--ssl=` to specify the desired SSL/TLS protocol version to use for HTTPS requests. - Added JSON detection with `--json, -j` to work around incorrect `Content-Type` - Added `--all` to show intermediate responses such as redirects (with `--follow`) - Added `--history-print, -P WHAT` to specify formatting of intermediate responses - Added `--max-redirects=N` (default 30) - Added `-A` as short name for `--auth-type` - Added `-F` as short name for `--follow` - Removed the `implicit_content_type` config option (use `"default_options": ["--form"]` instead) - Redirected `stdout` doesn't trigger an error anymore when `--output FILE` is set - Changed the default `--style` back to `solarized` for better support of light and dark terminals - Improved `--debug` output - Fixed `--session` when used with `--download` - Fixed `--download` to trim too long filenames before saving the file - Fixed the handling of `Content-Type` with multiple `+subtype` parts - Removed the XML formatter as the implementation suffered from multiple issues ## [0.9.3](https://github.com/httpie/cli/compare/0.9.2...0.9.3) (2016-01-01) - Changed the default color `--style` from `solarized` to `monokai` - Added basic Bash autocomplete support (need to be installed manually) - Added request details to connection error messages - Fixed `'requests.packages.urllib3' has no attribute 'disable_warnings'` errors that occurred in some installations - Fixed colors and formatting on Windows - Fixed `--auth` prompt on Windows ## [0.9.2](https://github.com/httpie/cli/compare/0.9.1...0.9.2) (2015-02-24) - Fixed compatibility with Requests 2.5.1 - Changed the default JSON `Content-Type` to `application/json` as UTF-8 is the default JSON encoding ## [0.9.1](https://github.com/httpie/cli/compare/0.9.0...0.9.1) (2015-02-07) - Added support for Requests transport adapter plugins (see [httpie-unixsocket](https://github.com/httpie/httpie-unixsocket) and [httpie-http2](https://github.com/httpie/httpie-http2)) ## [0.9.0](https://github.com/httpie/cli/compare/0.8.0...0.9.0) (2015-01-31) - Added `--cert` and `--cert-key` parameters to specify a client side certificate and private key for SSL - Improved unicode support - Improved terminal color depth detection via `curses` - To make it easier to deal with Windows paths in request items, `\` now only escapes special characters (the ones that are used as key-value separators by HTTPie) - Switched from `unittest` to `pytest` - Added Python `wheel` support - Various test suite improvements - Added `CONTRIBUTING` - Fixed `User-Agent` overwriting when used within a session - Fixed handling of empty passwords in URL credentials - Fixed multiple file uploads with the same form field name - Fixed `--output=/dev/null` on Linux - Miscellaneous bugfixes ## [0.8.0](https://github.com/httpie/cli/compare/0.7.1...0.8.0) (2014-01-25) - Added `field=@file.txt` and `field:=@file.json` for embedding the contents of text and JSON files into request data - Added curl-style shorthand for localhost - Fixed request `Host` header value output so that it doesn't contain credentials, if included in the URL ## [0.7.1](https://github.com/httpie/cli/compare/0.6.0...0.7.1) (2013-09-24) - Added `--ignore-stdin` - Added support for auth plugins - Improved `--help` output - Improved `Content-Disposition` parsing for `--download` mode - Update to Requests 2.0.0 ## [0.6.0](https://github.com/httpie/cli/compare/0.5.1...0.6.0) (2013-06-03) - XML data is now formatted - `--session` and `--session-read-only` now also accept paths to session files (eg. `http --session=/tmp/session.json example.org`) ## [0.5.1](https://github.com/httpie/cli/compare/0.5.0...0.5.1) (2013-05-13) - `Content-*` and `If-*` request headers are not stored in sessions anymore as they are request-specific ## [0.5.0](https://github.com/httpie/cli/compare/0.4.1...0.5.0) (2013-04-27) - Added a download mode via `--download` - Fixes miscellaneous bugs ## [0.4.1](https://github.com/httpie/cli/compare/0.4.0...0.4.1) (2013-02-26) - Fixed `setup.py` ## [0.4.0](https://github.com/httpie/cli/compare/0.3.0...0.4.0) (2013-02-22) - Added Python 3.3 compatibility - Added Requests >= v1.0.4 compatibility - Added support for credentials in URL - Added `--no-option` for every `--option` to be config-friendly - Mutually exclusive arguments can be specified multiple times. The last value is used ## [0.3.0](https://github.com/httpie/cli/compare/0.2.7...0.3.0) (2012-09-21) - Allow output redirection on Windows - Added configuration file - Added persistent session support - Renamed `--allow-redirects` to `--follow` - Improved the usability of `http --help` - Fixed installation on Windows with Python 3 - Fixed colorized output on Windows with Python 3 - CRLF HTTP header field separation in the output - Added exit status code `2` for timed-out requests - Added the option to separate colorizing and formatting (`--pretty=all`, `--pretty=colors` and `--pretty=format`) `--ugly` has bee removed in favor of `--pretty=none` ## [0.2.7](https://github.com/httpie/cli/compare/0.2.5...0.2.7) (2012-08-07) - Added compatibility with Requests 0.13.6 - Added streamed terminal output. `--stream, -S` can be used to enable streaming also with `--pretty` and to ensure a more frequent output flushing - Added support for efficient large file downloads - Sort headers by name (unless `--pretty=none`) - Response body is fetched only when needed (e.g., not with `--headers`) - Improved content type matching - Updated Solarized color scheme - Windows: Added `--output FILE` to store output into a file (piping results in corrupted data on Windows) - Proper handling of binary requests and responses - Fixed printing of `multipart/form-data` requests - Renamed `--traceback` to `--debug` ## [0.2.6](https://github.com/httpie/cli/compare/0.2.5...0.2.6) (2012-07-26) - The short option for `--headers` is now `-h` (`-t` has been removed, for usage use `--help`) - Form data and URL parameters can have multiple fields with the same name (e.g.,`http -f url a=1 a=2`) - Added `--check-status` to exit with an error on HTTP 3xx, 4xx and 5xx (3, 4, and 5, respectively) - If the output is piped to another program or redirected to a file, the default behaviour is to only print the response body (It can still be overwritten via the `--print` flag.) - Improved highlighting of HTTP headers - Added query string parameters (`param==value`) - Added support for terminal colors under Windows ## [0.2.5](https://github.com/httpie/cli/compare/0.2.2...0.2.5) (2012-07-17) - Unicode characters in prettified JSON now don't get escaped for improved readability - --auth now prompts for a password if only a username provided - Added support for request payloads from a file path with automatic `Content-Type` (`http URL @/path`) - Fixed missing query string when displaying the request headers via `--verbose` - Fixed Content-Type for requests with no data ## [0.2.2](https://github.com/httpie/cli/compare/0.2.1...0.2.2) (2012-06-24) - The `METHOD` positional argument can now be omitted (defaults to `GET`, or to `POST` with data) - Fixed --verbose --form - Added support for Tox ## [0.2.1](https://github.com/httpie/cli/compare/0.2.0...0.2.1) (2012-06-13) - Added compatibility with `requests-0.12.1` - Dropped custom JSON and HTTP lexers in favor of the ones newly included in `pygments-1.5` ## [0.2.0](https://github.com/httpie/cli/compare/0.1.6...0.2.0) (2012-04-25) - Added Python 3 support - Added the ability to print the HTTP request as well as the response (see `--print` and `--verbose`) - Added support for Digest authentication - Added file upload support (`http -f POST file_field_name@/path/to/file`) - Improved syntax highlighting for JSON - Added support for field name escaping - Many bug fixes ## [0.1.6](https://github.com/httpie/cli/compare/0.1.5...0.1.6) (2012-03-04) - Fixed `setup.py` ## [0.1.5](https://github.com/httpie/cli/compare/0.1.4...0.1.5) (2012-03-04) - Many improvements and bug fixes ## [0.1.4](https://github.com/httpie/cli/compare/b966efa...0.1.4) (2012-02-28) - Many improvements and bug fixes ## [0.1.0](https://github.com/httpie/cli/commit/b966efa) (2012-02-25) - Initial public release cli-3.2.4/CODE_OF_CONDUCT.md000066400000000000000000000064061471121002400150640ustar00rootroot00000000000000# 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, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, 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 the project team at jakub@roztocil.co. 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. ## Attribution This Code of Conduct is adapted from the [Contributor Covenant](https://www.contributor-covenant.org), version 1.4, available at For answers to common questions about this code of conduct, see cli-3.2.4/CONTRIBUTING.md000066400000000000000000000152311471121002400145120ustar00rootroot00000000000000# Contributing to HTTPie Bug reports and code and documentation patches are welcome. You can help this project also by using the development version of HTTPie and by reporting any bugs you might encounter. ## 1. Reporting bugs **It's important that you provide the full command argument list as well as the output of the failing command.** Use the `--debug` flag and copy&paste both the command and its output to your bug report, e.g.: ```bash $ http --debug ``` ## 2. Contributing Code and Docs Before working on a new feature or a bug, please browse [existing issues](https://github.com/httpie/cli/issues) to see whether it has previously been discussed. If your change alters HTTPie’s behaviour or interface, it's a good idea to discuss it before you start working on it. If you are fixing an issue, the first step should be to create a test case that reproduces the incorrect behaviour. That will also help you to build an understanding of the issue at hand. **Pull requests introducing code changes without tests will generally not get merged. The same goes for PRs changing HTTPie’s behaviour and not providing documentation.** Conversely, PRs consisting of documentation improvements or tests for existing-yet-previously-untested behavior will very likely be merged. Therefore, docs and tests improvements are a great candidate for your first contribution. Consider also adding a [CHANGELOG](https://github.com/httpie/cli/blob/master/CHANGELOG.md) entry for your changes. ### Development Environment #### Getting the code Go to and fork the project repository. ```bash # Clone your fork $ git clone git@github.com:/httpie.git # Enter the project directory $ cd httpie # Create a branch for your changes $ git checkout -b my_topical_branch ``` #### Setup The [Makefile](https://github.com/httpie/cli/blob/master/Makefile) contains a bunch of tasks to get you started. You can run `$ make` to see all the available tasks. To get started, run the command below, which: - Creates an isolated Python virtual environment inside `./venv` (via the standard library [venv](https://docs.python.org/3/library/venv.html) tool); - installs all dependencies and also installs HTTPie (in editable mode so that the `http` command will point to your working copy). - and runs tests (It is the same as running `make install test`). ```bash $ make all ``` #### Python virtual environment Activate the Python virtual environment—created via the `make install` task during [setup](#setup) for your active shell session using the following command: ```bash $ source venv/bin/activate ``` (If you use `virtualenvwrapper`, you can also use `workon httpie` to activate the environment — we have created a symlink for you. It’s a bit of a hack but it works™.) You should now see `(httpie)` next to your shell prompt, and the `http` command should point to your development copy: ```bash (httpie) ~/Code/httpie $ which http /Users//Code/httpie/venv/bin/http (httpie) ~/Code/httpie $ http --version 2.0.0-dev ``` (Btw, you don’t need to activate the virtual environment if you just want run some of the `make` tasks. You can also invoke the development version of HTTPie directly with `./venv/bin/http` without having to activate the environment first. The same goes for `./venv/bin/pytest`, etc.). ### Making Changes Please make sure your changes conform to [Style Guide for Python Code](https://python.org/dev/peps/pep-0008/) (PEP8) and that `make pycodestyle` passes. ### Testing & CI Please add tests for any new features and bug fixes. When you open a Pull Request, [GitHub Actions](https://github.com/httpie/cli/actions) will automatically run HTTPie’s [test suite](https://github.com/httpie/cli/tree/master/tests) against your code, so please make sure all checks pass. #### Running tests locally HTTPie uses the [pytest](https://pytest.org/) runner. ```bash # Run tests on the current Python interpreter with coverage. $ make test # Run tests with coverage $ make test-cover # Test PEP8 compliance $ make codestyle # Run extended tests — for code as well as .md files syntax, packaging, etc. $ make test-all ``` #### Running specific tests After you have activated your virtual environment (see [setup](#setup)), you can run specific tests from the terminal: ```bash # Run specific tests on the current Python $ python -m pytest tests/test_uploads.py $ python -m pytest tests/test_uploads.py::TestMultipartFormDataFileUpload $ python -m pytest tests/test_uploads.py::TestMultipartFormDataFileUpload::test_upload_ok ``` See [Makefile](https://github.com/httpie/cli/blob/master/Makefile) for additional development utilities. #### Running benchmarks If you are trying to work on speeding up HTTPie and want to verify your results, you can run the benchmark suite. The suite will compare the last commit of your branch with the master branch of your repository (or a fresh checkout of HTTPie master, through `--fresh`) and report the results back. ```bash $ python extras/profiling/run.py ``` The benchmarks can also be run on the CI. Since it is a long process, it requires manual oversight. Ping one of the maintainers to get a `benchmark` label on your branch. #### Windows If you are on a Windows machine and not able to run `make`, follow the next steps for a basic setup. As a prerequisite, you need to have Python 3.7+ installed. Create a virtual environment and activate it: ```powershell C:\> python -m venv --prompt httpie venv C:\> venv\Scripts\activate ``` Install HTTPie in editable mode with all the dependencies: ```powershell C:\> python -m pip install --upgrade -e .[dev] ``` You should now see `(httpie)` next to your shell prompt, and the `http` command should point to your development copy: ```powershell # In PowerShell: (httpie) PS C:\Users\\httpie> Get-Command http CommandType Name Version Source ----------- ---- ------- ------ Application http.exe 0.0.0.0 C:\Users\\httpie\venv\Scripts\http.exe ``` ```bash # In CMD: (httpie) C:\Users\\httpie> where http C:\Users\\httpie\venv\Scripts\http.exe C:\Users\\AppData\Local\Programs\Python\Python38-32\Scripts\http.exe (httpie) C:\Users\\httpie> http --version 2.3.0-dev ``` Use `pytest` to run tests locally with an active virtual environment: ```bash # Run all tests $ python -m pytest ``` ______________________________________________________________________ Finally, feel free to add yourself to [AUTHORS](https://github.com/httpie/cli/blob/master/AUTHORS.md)! cli-3.2.4/LICENSE000066400000000000000000000027761471121002400133000ustar00rootroot00000000000000Copyright © 2012-2022 Jakub Roztocil Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. cli-3.2.4/MANIFEST.in000066400000000000000000000002521471121002400140140ustar00rootroot00000000000000include LICENSE include README.md include CHANGELOG.md include AUTHORS.md include docs/README.md # recursive-include tests/ * cli-3.2.4/Makefile000066400000000000000000000150001471121002400137130ustar00rootroot00000000000000############################################################################### # See ./CONTRIBUTING.md ############################################################################### .PHONY: build ROOT_DIR:=$(shell dirname $(realpath $(firstword $(MAKEFILE_LIST)))) VERSION=$(shell grep __version__ httpie/__init__.py) H1="\n\n\033[0;32m\#\#\# " H1END=" \#\#\# \033[0m\n" # Only used to create our venv. SYSTEM_PYTHON=python3 VENV_ROOT=venv VENV_BIN=$(VENV_ROOT)/bin VENV_PIP=$(VENV_BIN)/pip3 VENV_PYTHON=$(VENV_BIN)/python export PATH := $(VENV_BIN):$(PATH) default: list-tasks ############################################################################### # Default task to get a list of tasks when `make' is run without args. # ############################################################################### list-tasks: @echo Available tasks: @echo ---------------- @$(MAKE) -pRrq -f $(lastword $(MAKEFILE_LIST)) : 2>/dev/null | awk -v RS= -F: '/^# File/,/^# Finished Make data base/ {if ($$1 !~ "^[#.]") {print $$1}}' | sort | grep -E -v -e '^[^[:alnum:]]' -e '^$@$$' @echo ############################################################################### # Installation ############################################################################### all: uninstall-httpie install test install: venv install-reqs install-reqs: @echo $(H1)Updating package tools$(H1END) $(VENV_PIP) install --upgrade pip wheel build @echo $(H1)Installing dev requirements$(H1END) $(VENV_PIP) install --upgrade '.[dev]' '.[test]' @echo $(H1)Installing HTTPie$(H1END) $(VENV_PIP) install --upgrade --editable . @echo clean: @echo $(H1)Cleaning up$(H1END) rm -rf $(VENV_ROOT) # Remove symlink for virtualenvwrapper, if we’ve created one. [ -n "$(WORKON_HOME)" -a -L "$(WORKON_HOME)/httpie" -a -f "$(WORKON_HOME)/httpie" ] && rm $(WORKON_HOME)/httpie || true rm -rf *.egg dist build .coverage .cache .pytest_cache httpie.egg-info find . -name '__pycache__' -delete -o -name '*.pyc' -delete @echo venv: @echo $(H1)Creating a Python environment $(VENV_ROOT) $(H1END) $(SYSTEM_PYTHON) -m venv --prompt httpie $(VENV_ROOT) @echo @echo done. @echo @echo To active it manually, run: @echo @echo " source $(VENV_BIN)/activate" @echo @echo '(learn more: https://docs.python.org/3/library/venv.html)' @echo @if [ -n "$(WORKON_HOME)" ]; then \ echo $(ROOT_DIR) > $(VENV_ROOT)/.project; \ if [ ! -d $(WORKON_HOME)/httpie -a ! -L $(WORKON_HOME)/httpie ]; then \ ln -s $(ROOT_DIR)/$(VENV_ROOT) $(WORKON_HOME)/httpie ; \ echo ''; \ echo 'Since you use virtualenvwrapper, we created a symlink'; \ echo 'so you can also use "workon httpie" to activate the venv.'; \ echo ''; \ fi; \ fi ############################################################################### # Testing ############################################################################### test: @echo $(H1)Running tests$(HEADER_EXTRA)$(H1END) $(VENV_BIN)/python -m pytest $(COV) @echo test-cover: COV=--cov=httpie --cov=tests test-cover: HEADER_EXTRA=' (with coverage)' test-cover: test # test-all is meant to test everything — even this Makefile test-all: clean install test test-dist codestyle @echo test-dist: test-sdist test-bdist-wheel @echo test-sdist: clean venv @echo $(H1)Testing sdist build an installation$(H1END) $(VENV_PIP) install build $(VENV_PYTHON) -m build --sdist $(VENV_PIP) install --force-reinstall --upgrade dist/*.gz $(VENV_BIN)/http --version @echo test-bdist-wheel: clean venv @echo $(H1)Testing wheel build an installation$(H1END) $(VENV_PIP) install build $(VENV_PYTHON) -m build --wheel $(VENV_PIP) install --force-reinstall --upgrade dist/*.whl $(VENV_BIN)/http --version @echo twine-check: twine check dist/* # Kept for convenience, "make codestyle" is preferred though pycodestyle: codestyle codestyle: @echo $(H1)Running flake8$(H1END) @[ -f $(VENV_BIN)/flake8 ] || $(VENV_PIP) install --upgrade --editable '.[dev]' $(VENV_BIN)/flake8 httpie/ tests/ extras/profiling/ docs/packaging/brew/ *.py @echo codecov-upload: @echo $(H1)Running codecov$(H1END) @[ -f $(VENV_BIN)/codecov ] || $(VENV_PIP) install codecov # $(VENV_BIN)/codecov --required $(VENV_BIN)/codecov @echo doc-check: @echo $(H1)Running documentations checks$(H1END) mdl --git-recurse --style docs/markdownlint.rb . ############################################################################### # Publishing to PyPi ############################################################################### build: rm -rf build/ dist/ mv httpie/internal/__build_channel__.py httpie/internal/__build_channel__.py.original echo 'BUILD_CHANNEL = "pip"' > httpie/internal/__build_channel__.py $(VENV_PYTHON) -m build --sdist --wheel --outdir dist/ mv httpie/internal/__build_channel__.py.original httpie/internal/__build_channel__.py publish: test-all publish-no-test publish-no-test: @echo $(H1)Testing wheel build an installation$(H1END) @echo "$(VERSION)" @echo "$(VERSION)" | grep -q "dev" && echo '!!!Not publishing dev version!!!' && exit 1 || echo ok make build make twine-check $(VENV_BIN)/twine upload --repository=httpie dist/* @echo ############################################################################### # Uninstalling ############################################################################### uninstall-httpie: @echo $(H1)Uninstalling httpie$(H1END) - $(VENV_PIP) uninstall --yes httpie &2>/dev/null @echo "Verifying…" cd .. && ! $(VENV_PYTHON) -m httpie --version &2>/dev/null @echo "Done" @echo ############################################################################### # Homebrew ############################################################################### brew-deps: docs/packaging/brew/brew-deps.py brew-test: @echo $(H1)Uninstalling httpie$(H1END) - brew uninstall httpie @echo $(H1)Building from source…$(H1END) - brew install --HEAD --build-from-source ./docs/packaging/brew/httpie.rb @echo $(H1)Verifying…$(H1END) http --version https --version @echo $(H1)Auditing…$(H1END) brew audit --strict httpie ############################################################################### # Generated content ############################################################################### content: man installation-docs man: install @echo $(H1)Regenerate man pages$(H1END) $(VENV_PYTHON) extras/scripts/generate_man_pages.py installation-docs: @echo $(H1)Updating installation instructions in the docs$(H1END) $(VENV_PYTHON) docs/installation/generate.py cli-3.2.4/README.md000066400000000000000000000114351471121002400135420ustar00rootroot00000000000000

HTTPie
HTTPie CLI: human-friendly HTTP client for the API era

[![HTTPie for Desktop](https://img.shields.io/static/v1?label=HTTPie&message=Desktop&color=4B78E6)](https://httpie.io/product) [![](https://img.shields.io/static/v1?label=HTTPie&message=Web%20%26%20Mobile&color=73DC8C)](https://httpie.io/app) [![](https://img.shields.io/static/v1?label=HTTPie&message=CLI&color=FA9BFA)](https://httpie.io/cli) [![Twitter](https://img.shields.io/twitter/follow/httpie?style=flat&color=%234B78E6&logoColor=%234B78E6)](https://twitter.com/httpie) [![Chat](https://img.shields.io/discord/725351238698270761?style=flat&label=Chat%20on%20Discord&color=%23FA9BFA)](https://httpie.io/discord)
[![Docs](https://img.shields.io/badge/stable%20docs-httpie.io%2Fdocs%2Fcli-brightgreen?style=flat&color=%2373DC8C&label=Docs)](https://httpie.org/docs/cli) [![Latest version](https://img.shields.io/pypi/v/httpie.svg?style=flat&label=Latest&color=%234B78E6&logo=&logoColor=white)](https://pypi.python.org/pypi/httpie) [![Build](https://img.shields.io/github/actions/workflow/status/httpie/cli/tests.yml?branch=master&color=%23FA9BFA&label=Build)](https://github.com/httpie/cli/actions) [![Coverage](https://img.shields.io/codecov/c/github/httpie/cli?style=flat&label=Coverage&color=%2373DC8C)](https://codecov.io/gh/httpie/cli) [![PyPi downloads](https://img.shields.io/pepy/dt/httpie?style=flat&label=Downloads%20from%20PyPi%20only&color=4B78E6)](https://www.pepy.tech/projects/httpie)
HTTPie (pronounced _aitch-tee-tee-pie_) is a command-line HTTP client. Its goal is to make CLI interaction with web services as human-friendly as possible. HTTPie is designed for testing, debugging, and generally interacting with APIs & HTTP servers. The `http` & `https` commands allow for creating and sending arbitrary HTTP requests. They use simple and natural syntax and provide formatted and colorized output.
HTTPie in action
## We lost 54k GitHub stars Please note we recently accidentally made this repo private for a moment, and GitHub deleted our community that took a decade to build. Read the full story here: https://httpie.io/blog/stardust ![](docs/stardust.png) ## Getting started - [Installation instructions →](https://httpie.io/docs#installation) - [Full documentation →](https://httpie.io/docs) ## Features - Expressive and intuitive syntax - Formatted and colorized terminal output - Built-in JSON support - Forms and file uploads - HTTPS, proxies, and authentication - Arbitrary request data - Custom headers - Persistent sessions - `wget`-like downloads [See all features →](https://httpie.io/docs) ## Examples Hello World: ```bash https httpie.io/hello ``` Custom [HTTP method](https://httpie.io/docs#http-method), [HTTP headers](https://httpie.io/docs#http-headers) and [JSON](https://httpie.io/docs#json) data: ```bash http PUT pie.dev/put X-API-Token:123 name=John ``` Build and print a request without sending it using [offline mode](https://httpie.io/docs/cli/offline-mode): ```bash http --offline pie.dev/post hello=offline ``` Use [GitHub API](https://developer.github.com/v3/issues/comments/#create-a-comment) to post a comment on an [Issue](https://github.com/httpie/cli/issues/83) with [authentication](https://httpie.io/docs#authentication): ```bash http -a USERNAME POST https://api.github.com/repos/httpie/cli/issues/83/comments body='HTTPie is awesome! :heart:' ``` [See more examples →](https://httpie.io/docs#examples) ## Community & support - Visit the [HTTPie website](https://httpie.io) for full documentation and useful links. - Join our [Discord server](https://httpie.io/discord) is to ask questions, discuss features, and for general API chat. - Tweet at [@httpie](https://twitter.com/httpie) on Twitter. - Use [StackOverflow](https://stackoverflow.com/questions/tagged/httpie) to ask questions and include a `httpie` tag. - Create [GitHub Issues](https://github.com/httpie/cli/issues) for bug reports and feature requests. - Subscribe to the [HTTPie newsletter](https://httpie.io) for occasional updates. ## Contributing Have a look through existing [Issues](https://github.com/httpie/cli/issues) and [Pull Requests](https://github.com/httpie/cli/pulls) that you could help with. If you'd like to request a feature or report a bug, please [create a GitHub Issue](https://github.com/httpie/cli/issues) using one of the templates provided. [See contribution guide →](https://github.com/httpie/cli/blob/master/CONTRIBUTING.md) cli-3.2.4/SECURITY.md000066400000000000000000000011151471121002400140460ustar00rootroot00000000000000# Security policy ## Reporting a vulnerability When you identify a vulnerability in HTTPie, please report it privately using one of the following channels: - Email to [`security@httpie.io`](mailto:security@httpie.io) - Report on [huntr.dev](https://huntr.dev/) In addition to the description of the vulnerability, include the following information: - A short reproducer to verify it (it can be a small HTTP server, shell script, docker image, etc.) - Your deemed severity level of the vulnerability (`LOW`/`MEDIUM`/`HIGH`/`CRITICAL`) - [CWE](https://cwe.mitre.org/) ID, if available. cli-3.2.4/docs/000077500000000000000000000000001471121002400132075ustar00rootroot00000000000000cli-3.2.4/docs/README.md000066400000000000000000002450351471121002400144770ustar00rootroot00000000000000
# HTTPie documentation
HTTPie (pronounced _aitch-tee-tee-pie_) is a command-line HTTP client. Its goal is to make CLI interaction with web services as human-friendly as possible. HTTPie is designed for testing, debugging, and generally interacting with APIs & HTTP servers. The `http` & `https` commands allow for creating and sending arbitrary HTTP requests. They use simple and natural syntax and provide formatted and colorized output.
## About this document This documentation is best viewed at [httpie.io/docs](https://httpie.org/docs). You can select your corresponding HTTPie version as well as run examples directly from the browser using a [termible.io](https://termible.io?utm_source=httpie-readme) embedded terminal. If you are reading this on GitHub, then this text covers the current *development* version. You are invited to submit fixes and improvements to the docs by editing [this file](https://github.com/httpie/cli/blob/master/docs/README.md).
## Main features - Expressive and intuitive syntax - Formatted and colorized terminal output - Built-in JSON support - Forms and file uploads - HTTPS, proxies, and authentication - Arbitrary request data - Custom headers - Persistent sessions - Wget-like downloads - Linux, macOS, Windows, and FreeBSD support - Plugins - Documentation - Test coverage ## Installation
- [Universal](#universal) - [macOS](#macos) - [Windows](#windows) - [Linux](#linux) - [FreeBSD](#freebsd) ### Universal #### PyPI Please make sure you have Python 3.7 or newer (`python --version`). ```bash # Install httpie $ python -m pip install --upgrade pip wheel $ python -m pip install httpie ``` ```bash # Upgrade httpie $ python -m pip install --upgrade pip wheel $ python -m pip install --upgrade httpie ``` ### macOS #### Homebrew To install [Homebrew](https://brew.sh/), see [its installation](https://docs.brew.sh/Installation). ```bash # Install httpie $ brew update $ brew install httpie ``` ```bash # Upgrade httpie $ brew update $ brew upgrade httpie ``` #### MacPorts To install [MacPorts](https://www.macports.org/), see [its installation](https://www.macports.org/install.php). ```bash # Install httpie $ port selfupdate $ port install httpie ``` ```bash # Upgrade httpie $ port selfupdate $ port upgrade httpie ``` ### Windows #### Chocolatey To install [Chocolatey](https://chocolatey.org/), see [its installation](https://chocolatey.org/install). ```bash # Install httpie $ choco install httpie ``` ```bash # Upgrade httpie $ choco upgrade httpie ``` ### Linux #### Debian and Ubuntu Also works for other Debian-derived distributions like MX Linux, Linux Mint, deepin, Pop!_OS, KDE neon, Zorin OS, elementary OS, Kubuntu, Devuan, Linux Lite, Peppermint OS, Lubuntu, antiX, Xubuntu, etc. ```bash # Install httpie $ curl -SsL https://packages.httpie.io/deb/KEY.gpg | sudo gpg --dearmor -o /usr/share/keyrings/httpie.gpg $ echo "deb [arch=amd64 signed-by=/usr/share/keyrings/httpie.gpg] https://packages.httpie.io/deb ./" | sudo tee /etc/apt/sources.list.d/httpie.list > /dev/null $ sudo apt update $ sudo apt install httpie ``` ```bash # Upgrade httpie $ sudo apt update && sudo apt upgrade httpie ``` #### Fedora ```bash # Install httpie $ dnf install httpie ``` ```bash # Upgrade httpie $ dnf upgrade httpie ``` #### CentOS and RHEL Also works for other RHEL-derived distributions like ClearOS, Oracle Linux, etc. ```bash # Install httpie $ yum install epel-release $ yum install httpie ``` ```bash # Upgrade httpie $ yum upgrade httpie ``` #### Single binary executables Get the standalone HTTPie Linux executables when you don't want to go through the full installation process. ```bash # Install httpie $ https --download packages.httpie.io/binaries/linux/http-latest -o http $ ln -ls ./http ./https $ chmod +x ./http ./https ``` ```bash # Upgrade httpie $ https --download packages.httpie.io/binaries/linux/http-latest -o http ``` #### Snapcraft (Linux) To install [Snapcraft](https://snapcraft.io/), see [its installation](https://snapcraft.io/docs/installing-snapd). ```bash # Install httpie $ snap install httpie ``` ```bash # Upgrade httpie $ snap refresh httpie ``` #### Linuxbrew To install [Linuxbrew](https://docs.brew.sh/Homebrew-on-Linux), see [its installation](https://docs.brew.sh/Homebrew-on-Linux#install). ```bash # Install httpie $ brew update $ brew install httpie ``` ```bash # Upgrade httpie $ brew update $ brew upgrade httpie ``` #### Arch Linux Also works for other Arch-derived distributions like ArcoLinux, EndeavourOS, Artix Linux, etc. ```bash # Install httpie $ pacman -Syu httpie ``` ```bash # Upgrade httpie $ pacman -Syu ``` ### FreeBSD #### FreshPorts ```bash # Install httpie $ pkg install www/py-httpie ``` ```bash # Upgrade httpie $ pkg upgrade www/py-httpie ```
### Unstable version If you want to try out the latest version of HTTPie that hasn't been officially released yet, you can install the development or unstable version directly from the master branch on GitHub. However, keep in mind that the development version is a work in progress and may not be as reliable as the stable version. You can use the following command to install the development version of HTTPie on Linux, macOS, Windows, or FreeBSD operating systems. With this command, the code present in the `master` branch is downloaded and installed using `pip`. ```bash $ python -m pip install --upgrade https://github.com/httpie/cli/archive/master.tar.gz ``` There are other ways to install the development version of HTTPie on macOS and Linux. You can install it using Homebrew by running the following commands: ```bash $ brew uninstall --force httpie $ brew install --HEAD httpie ``` You can install it using Snapcraft by running the following commands: ```bash $ snap remove httpie $ snap install httpie --edge ``` To verify the installation, you can compare the [version identifier on GitHub](https://github.com/httpie/cli/blob/master/httpie/__init__.py#L6) with the one available on your machine. You can check the version of HTTPie on your machine by using the command `http --version`. ```bash $ http --version # 3.X.X.dev0 ``` Note that on your machine, the version name will have the `.dev0` suffix. ## Usage Hello World: ```bash $ https httpie.io/hello ``` Synopsis: ```bash $ http [flags] [METHOD] URL [ITEM [ITEM]] ``` See also `http --help` (and for systems where man pages are available, you can use `man http`). ### Examples Custom [HTTP method](#http-method), [HTTP headers](#http-headers) and [JSON](#json) data: ```bash $ http PUT pie.dev/put X-API-Token:123 name=John ``` Submitting [forms](#forms): ```bash $ http -f POST pie.dev/post hello=World ``` See the request that is being sent using one of the [output options](#output-options): ```bash $ http -v pie.dev/get ``` Build and print a request without sending it using [offline mode](#offline-mode): ```bash $ http --offline pie.dev/post hello=offline ``` Use [GitHub API](https://developer.github.com/v3/issues/comments/#create-a-comment) to post a comment on an [issue](https://github.com/httpie/cli/issues/83) with [authentication](#authentication): ```bash $ http -a USERNAME POST https://api.github.com/repos/httpie/cli/issues/83/comments body='HTTPie is awesome! :heart:' ``` Upload a file using [redirected input](#redirected-input): ```bash $ http pie.dev/post < files/data.json ``` Download a file and save it via [redirected output](#redirected-output): ```bash $ http pie.dev/image/png > image.png ``` Download a file `wget` style: ```bash $ http --download pie.dev/image/png ``` Use named [sessions](#sessions) to make certain aspects of the communication persistent between requests to the same host: ```bash $ http --session=logged-in -a username:password pie.dev/get API-Key:123 ``` ```bash $ http --session=logged-in pie.dev/headers ``` Set a custom `Host` header to work around missing DNS records: ```bash $ http localhost:8000 Host:example.com ``` ## HTTP method The name of the HTTP method comes right before the URL argument: ```bash $ http DELETE pie.dev/delete ``` Which looks similar to the actual `Request-Line` that is sent: ```http DELETE /delete HTTP/1.1 ``` In addition to the standard methods (`GET`, `POST`, `HEAD`, `PUT`, `PATCH`, `DELETE`, etc.), you can use custom method names, for example: ```bash $ http AHOY pie.dev/post ``` There are no restrictions regarding which request methods can include a body. You can send an empty `POST` request: ```bash $ http POST pie.dev/post ``` You can also make `GET` requests containing a body: ```bash $ http GET pie.dev/get hello=world ``` ### Optional `GET` and `POST` The `METHOD` argument is optional, and when you don’t specify it, HTTPie defaults to: - `GET` for requests without body - `POST` for requests with body Here we don’t specify any request data, so both commands will send the same `GET` request: ```bash $ http GET pie.dev/get ``` ```bash $ http pie.dev/get ``` Here, on the other hand, we do have some data, so both commands will make the same `POST` request: ```bash $ http POST pie.dev/post hello=world ``` ```bash $ http pie.dev/post hello=world ``` ## Request URL The only information HTTPie needs to perform a request is a URL. The default scheme is `http://` and can be omitted from the argument: ```bash $ http example.org # → http://example.org ``` HTTPie also installs an `https` executable, where the default scheme is `https://`: ```bash $ https example.org # → https://example.org ``` When you paste a URL into the terminal, you can even keep the `://` bit in the URL argument to quickly convert the URL into an HTTPie call just by adding a space after the protocol name. ```bash $ https ://example.org # → https://example.org ``` ```bash $ http ://example.org # → http://example.org ``` ### Querystring parameters If you find yourself manually constructing URLs with querystring parameters on the terminal, you may appreciate the `param==value` syntax for appending URL parameters. With that, you don’t have to worry about escaping the `&` separators for your shell. Additionally, any special characters in the parameter name or value get automatically URL-escaped (as opposed to the parameters specified in the full URL, which HTTPie doesn’t modify). ```bash $ http https://api.github.com/search/repositories q==httpie per_page==1 ``` ```http GET /search/repositories?q=httpie&per_page=1 HTTP/1.1 ``` You can even retrieve the `value` from a file by using the `param==@file` syntax. This would also effectively strip the newlines from the end. See [file based separators](#file-based-separators) for more examples. ```bash $ http pie.dev/get text==@files/text.txt ``` ### URL shortcuts for `localhost` Additionally, curl-like shorthand for localhost is supported. This means that, for example, `:3000` would expand to `http://localhost:3000`. If the port is omitted, then port 80 is assumed. ```bash $ http :/foo ``` ```http GET /foo HTTP/1.1 Host: localhost ``` ```bash $ http :3000/bar ``` ```http GET /bar HTTP/1.1 Host: localhost:3000 ``` ```bash $ http : ``` ```http GET / HTTP/1.1 Host: localhost ``` ### Other default schemes When HTTPie is invoked as `https` then the default scheme is `https://` (`$ https example.org` will make a request to `https://example.org`). You can also use the `--default-scheme ` option to create shortcuts for other protocols than HTTP (possibly supported via [plugins](https://pypi.org/search/?q=httpie)). Example for the [httpie-unixsocket](https://github.com/httpie/httpie-unixsocket) plugin: ```bash # Before $ http http+unix://%2Fvar%2Frun%2Fdocker.sock/info ``` ```bash # Create an alias $ alias http-unix='http --default-scheme="http+unix"' ``` ```bash # Now the scheme can be omitted $ http-unix %2Fvar%2Frun%2Fdocker.sock/info ``` ### `--path-as-is` The standard behavior of HTTP clients is to normalize the path portion of URLs by squashing dot segments as a typical filesystem would: ```bash $ http -v example.org/./../../etc/password ``` ```http GET /etc/password HTTP/1.1 ``` The `--path-as-is` option allows you to disable this behavior: ```bash $ http --path-as-is -v example.org/./../../etc/password ``` ```http GET /../../etc/password HTTP/1.1 ``` ## Request items There are a few different *request item* types that provide a convenient mechanism for specifying HTTP headers, JSON and form data, files, and URL parameters. This is a very practical way of constructing HTTP requests from scratch on the CLI. Each *request item* is simply a key/value pair separated with the following characters: `:` (headers), `=` (data field, e.g., JSON, form), `:=` (raw data field) `==` (query parameters), `@` (file upload). ```bash $ http PUT pie.dev/put \ X-Date:today \ # Header token==secret \ # Query parameter name=John \ # Data field age:=29 # Raw JSON ``` | Item Type | Description | |-------------------------------------------------------------:|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | HTTP Headers `Name:Value` | Arbitrary HTTP header, e.g. `X-API-Token:123` | | URL parameters `name==value` | Appends the given name/value pair as a querystring parameter to the URL. The `==` separator is used. | | Data Fields `field=value` | Request data fields to be serialized as a JSON object (default), to be form-encoded (with `--form, -f`), or to be serialized as `multipart/form-data` (with `--multipart`) | | Raw JSON fields `field:=json` | Useful when sending JSON and one or more fields need to be a `Boolean`, `Number`, nested `Object`, or an `Array`, e.g., `meals:='["ham","spam"]'` or `pies:='[1,2,3]'` (note the quotes) | | File upload fields `field@/dir/file`, `field@file;type=mime` | Only available with `--form`, `-f` and `--multipart`. For example `screenshot@~/Pictures/img.png`, or `'cv@cv.txt;type=text/markdown'`. With `--form`, the presence of a file field results in a `--multipart` request | Note that the structured data fields aren’t the only way to specify request data: [raw request body](#raw-request-body) is a mechanism for passing arbitrary request data. ### File based separators Using file contents as values for specific fields is a very common use case, which can be achieved through adding the `@` suffix to the operators above. For example, instead of using a static string as the value for some header, you can use `:@` operator to pass the desired value from a file. ```bash $ http POST pie.dev/post \ X-Data:@files/text.txt # Read a header from a file token==@files/text.txt # Read a query parameter from a file name=@files/text.txt # Read a data field’s value from a file bookmarks:=@files/data.json # Embed a JSON object from a file ``` ### Escaping rules You can use `\` to escape characters that shouldn’t be used as separators (or parts thereof). For instance, `foo\==bar` will become a data key/value pair (`foo=` and `bar`) instead of a URL parameter. Often it is necessary to quote the values, e.g. `foo='bar baz'`. If any of the field names or headers starts with a minus (e.g. `-fieldname`), you need to place all such items after the special token `--` to prevent confusion with `--arguments`: ```bash $ http pie.dev/post -- -name-starting-with-dash=foo -Unusual-Header:bar ``` ```http POST /post HTTP/1.1 -Unusual-Header: bar Content-Type: application/json { "-name-starting-with-dash": "foo" } ``` ## JSON JSON is the *lingua franca* of modern web services, and it is also the **implicit content type** HTTPie uses by default. Simple example: ```bash $ http PUT pie.dev/put name=John email=john@example.org ``` ```http PUT / HTTP/1.1 Accept: application/json, */*;q=0.5 Accept-Encoding: gzip, deflate Content-Type: application/json Host: pie.dev { "name": "John", "email": "john@example.org" } ``` ### Default behavior If your command includes some data [request items](#request-items), they are serialized as a JSON object by default. HTTPie also automatically sets the following headers, both of which can be overwritten: | Header | Value | |---------------:|-------------------------------| | `Content-Type` | `application/json` | | `Accept` | `application/json, */*;q=0.5` | ### Explicit JSON You can use `--json, -j` to explicitly set `Accept` to `application/json` regardless of whether you are sending data (it’s a shortcut for setting the header via the usual header notation: `http url Accept:'application/json, */*;q=0.5'`). Additionally, HTTPie will try to detect JSON responses even when the `Content-Type` is incorrectly `text/plain` or unknown. ### Non-string JSON fields Non-string JSON fields use the `:=` separator, which allows you to embed arbitrary JSON data into the resulting JSON object. Additionally, text and raw JSON files can also be embedded into fields using `=@` and `:=@`: ```bash $ http PUT pie.dev/put \ name=John \ # String (default) age:=29 \ # Raw JSON — Number married:=false \ # Raw JSON — Boolean hobbies:='["http", "pies"]' \ # Raw JSON — Array favorite:='{"tool": "HTTPie"}' \ # Raw JSON — Object bookmarks:=@files/data.json \ # Embed JSON file description=@files/text.txt # Embed text file ``` ```http PUT /person/1 HTTP/1.1 Accept: application/json, */*;q=0.5 Content-Type: application/json Host: pie.dev { "age": 29, "hobbies": [ "http", "pies" ], "description": "John is a nice guy who likes pies.", "married": false, "name": "John", "favorite": { "tool": "HTTPie" }, "bookmarks": { "HTTPie": "https://httpie.org", } } ``` The `:=`/`:=@` syntax is JSON-specific. You can switch your request to `--form` or `--multipart`, and string, float, and number values will continue to be serialized (as string form values). Other JSON types, however, are not allowed with `--form` or `--multipart`. ### Nested JSON If your use case involves sending complex JSON objects as part of the request body, HTTPie can help you build them right from your terminal. You still use the existing data field operators (`=`/`:=`) but instead of specifying a top-level field name (like `key=value`), you specify a path declaration. This tells HTTPie where and how to put the given value inside an object: ```bash http pie.dev/post \ platform[name]=HTTPie \ platform[about][mission]='Make APIs simple and intuitive' \ platform[about][homepage]=httpie.io \ platform[about][homepage]=httpie.io \ platform[about][stars]:=54000 \ platform[apps][]=Terminal \ platform[apps][]=Desktop \ platform[apps][]=Web \ platform[apps][]=Mobile ``` ```json { "platform": { "name": "HTTPie", "about": { "mission": "Make APIs simple and intuitive", "homepage": "httpie.io", "stars": 54000 }, "apps": [ "Terminal", "Desktop", "Web", "Mobile" ] } } ``` #### Introduction Let’s start with a simple example, and build a simple search query: ```bash $ http --offline --print=B pie.dev/post \ category=tools \ search[type]=id \ search[id]:=1 ``` In the example above, the `search[type]` is an instruction for creating an object called `search`, and setting the `type` field of it to the given value (`"id"`). Also note that, just as the regular syntax, you can use the `:=` operator to directly pass raw JSON values (e.g., numbers in the case above). ```json { "category": "tools", "search": { "id": 1, "type": "id" } } ``` Building arrays is also possible, through `[]` suffix (an append operation). This tells HTTPie to create an array in the given path (if there is not one already), and append the given value to that array. ```bash $ http --offline --print=B pie.dev/post \ category=tools \ search[type]=keyword \ search[keywords][]=APIs \ search[keywords][]=CLI ``` ```json { "category": "tools", "search": { "keywords": [ "APIs", "CLI" ], "type": "keyword" } } ``` If you want to explicitly specify the position of elements inside an array, you can simply pass the desired index as the path: ```bash $ http --offline --print=B pie.dev/post \ category=tools \ search[type]=keyword \ search[keywords][1]=APIs \ search[keywords][0]=CLI ``` ```json { "category": "tools", "search": { "keywords": [ "CLIs", "API" ], "type": "keyword" } } ``` If there are any missing indexes, HTTPie will nullify them in order to create a concrete object that can be sent: ```bash $ http --offline --print=B pie.dev/post \ category=tools \ search[type]=platforms \ search[platforms][]=Terminal \ search[platforms][1]=Desktop \ search[platforms][3]=Mobile ``` ```json { "category": "tools", "search": { "platforms": [ "Terminal", "Desktop", null, "Mobile" ], "type": "platforms" } } ``` It is also possible to embed raw JSON to a nested structure, for example: ```bash $ http --offline --print=B pie.dev/post \ category=tools \ search[type]=platforms \ 'search[platforms]:=["Terminal", "Desktop"]' \ search[platforms][]=Web \ search[platforms][]=Mobile ``` ```json { "category": "tools", "search": { "platforms": [ "Terminal", "Desktop", "Web", "Mobile" ], "type": "platforms" } } ``` And just to demonstrate all of these features together, let’s create a very deeply nested JSON object: ```bash $ http PUT pie.dev/put \ shallow=value \ # Shallow key-value pair object[key]=value \ # Nested key-value pair array[]:=1 \ # Array — first item array[1]:=2 \ # Array — second item array[2]:=3 \ # Array — append (third item) very[nested][json][3][httpie][power][]=Amaze # Nested object ``` #### Advanced usage ##### Top level arrays If you want to send an array instead of a regular object, you can simply do that by omitting the starting key: ```bash $ http --offline --print=B pie.dev/post \ []:=1 \ []:=2 \ []:=3 ``` ```json [ 1, 2, 3 ] ``` You can also apply the nesting to the items by referencing their index: ```bash http --offline --print=B pie.dev/post \ [0][type]=platform [0][name]=terminal \ [1][type]=platform [1][name]=desktop ``` ```json [ { "type": "platform", "name": "terminal" }, { "type": "platform", "name": "desktop" } ] ``` Sending scalar JSON types (a single `null`, `true`, `false`, string or number) as the top-level object is impossible using the key/value syntax. But you can still pass it via [`--raw=''`](#raw-request-body). ##### Escaping behavior Nested JSON syntax uses the same [escaping rules](#escaping-rules) as the terminal. There are 3 special characters, and 1 special token that you can escape. If you want to send a bracket as is, escape it with a backslash (`\`): ```bash $ http --offline --print=B pie.dev/post \ 'foo\[bar\]:=1' \ 'baz[\[]:=2' \ 'baz[\]]:=3' ``` ```json { "baz": { "[": 2, "]": 3 }, "foo[bar]": 1 } ``` If you want to send the literal backslash character (`\`), escape it with another backslash: ```bash $ http --offline --print=B pie.dev/post \ 'backslash[\\]:=1' ``` ```json { "backslash": { "\\": 1 } } ``` A regular integer in a path (e.g `[10]`) means an array index; but if you want it to be treated as a string, you can escape the whole number by using a backslash (`\`) prefix. ```bash $ http --offline --print=B pie.dev/post \ 'object[\1]=stringified' \ 'object[\100]=same' \ 'array[1]=indexified' ``` ```json { "array": [ null, "indexified" ], "object": { "1": "stringified", "100": "same" } } ``` ##### Guiding syntax errors If you make a typo or forget to close a bracket, the errors will guide you to fix it. For example: ```bash $ http --offline --print=B pie.dev/post \ 'foo[bar]=OK' \ 'foo[baz][quux=FAIL' ``` ```console HTTPie Syntax Error: Expecting ']' foo[baz][quux ^ ``` You can follow to given instruction (adding a `]`) and repair your expression. ##### Type safety Each container path (e.g., `x[y][z]` in `x[y][z][1]`) has a certain type, which gets defined with the first usage and can’t be changed after that. If you try to do a key-based access to an array or an index-based access to an object, HTTPie will error out: ```bash $ http --offline --print=B pie.dev/post \ 'array[]:=1' \ 'array[]:=2' \ 'array[key]:=3' HTTPie Type Error: Can't perform 'key' based access on 'array' which has a type of 'array' but this operation requires a type of 'object'. array[key] ^^^^^ ``` Type Safety does not apply to value overrides, for example: ```bash $ http --offline --print=B pie.dev/post \ user[name]:=411 # Defined as an integer user[name]=string # Overridden with a string ``` ```json { "user": { "name": "string" } } ``` ### Raw JSON For very complex JSON structures, it may be more convenient to [pass it as raw request body](#raw-request-body), for example: ```bash $ echo -n '{"hello": "world"}' | http POST pie.dev/post ``` ```bash $ http POST pie.dev/post < files/data.json ``` ## Forms Submitting forms is very similar to sending [JSON](#json) requests. Often the only difference is in adding the `--form, -f` option, which ensures that data fields are serialized as key-value tuples separated by '&', with a '=' between the key and the value. In addition `Content-Type` is set to `application/x-www-form-urlencoded; charset=utf-8`. It is possible to make form data the implicit content type instead of JSON via the [config](#config) file. ### Regular forms ```bash $ http --form POST pie.dev/post name='John Smith' ``` ```http POST /post HTTP/1.1 Content-Type: application/x-www-form-urlencoded; charset=utf-8 name=John+Smith ``` ### File upload forms If one or more file fields is present, the serialization and content type is `multipart/form-data`: ```bash $ http -f POST pie.dev/post name='John Smith' cv@~/files/data.xml ``` The request above is the same as if the following HTML form were submitted: ```html
``` Please note that `@` is used to simulate a file upload form field, whereas `=@` just embeds the file content as a regular text field value. When uploading files, their content type is inferred from the file name. You can manually override the inferred content type: ```bash $ http -f POST pie.dev/post name='John Smith' cv@'~/files/data.bin;type=application/pdf' ``` To perform a `multipart/form-data` request even without any files, use `--multipart` instead of `--form`: ```bash $ http --multipart --offline example.org hello=world ``` ```http POST / HTTP/1.1 Content-Length: 129 Content-Type: multipart/form-data; boundary=c31279ab254f40aeb06df32b433cbccb Host: example.org --c31279ab254f40aeb06df32b433cbccb Content-Disposition: form-data; name="hello" world --c31279ab254f40aeb06df32b433cbccb-- ``` File uploads are always streamed to avoid memory issues with large files. By default, HTTPie uses a random unique string as the multipart boundary, but you can use `--boundary` to specify a custom string instead: ```bash $ http --form --multipart --boundary=xoxo --offline example.org hello=world ``` ```http POST / HTTP/1.1 Content-Length: 129 Content-Type: multipart/form-data; boundary=xoxo Host: example.org --xoxo Content-Disposition: form-data; name="hello" world --xoxo-- ``` If you specify a custom `Content-Type` header without including the boundary bit, HTTPie will add the boundary value (explicitly specified or auto-generated) to the header automatically: ```bash $ http --form --multipart --offline example.org hello=world Content-Type:multipart/letter ``` ```http POST / HTTP/1.1 Content-Length: 129 Content-Type: multipart/letter; boundary=c31279ab254f40aeb06df32b433cbccb Host: example.org --c31279ab254f40aeb06df32b433cbccb Content-Disposition: form-data; name="hello" world --c31279ab254f40aeb06df32b433cbccb-- ``` ## HTTP headers To set custom headers you can use the `Header:Value` notation: ```bash $ http pie.dev/headers User-Agent:Bacon/1.0 'Cookie:valued-visitor=yes;foo=bar' \ X-Foo:Bar Referer:https://httpie.org/ ``` ```http GET /headers HTTP/1.1 Accept: */* Accept-Encoding: gzip, deflate Cookie: valued-visitor=yes;foo=bar Host: pie.dev Referer: https://httpie.org/ User-Agent: Bacon/1.0 X-Foo: Bar ``` ### Default request headers There are a couple of default headers that HTTPie sets: ```http GET / HTTP/1.1 Accept: */* Accept-Encoding: gzip, deflate User-Agent: HTTPie/ Host: ``` All of these can be overwritten or unset (see below). ### Reading headers from a file You can read headers from a file by using the `:@` operator. This would also effectively strip the newlines from the end. See [file based separators](#file-based-separators) for more examples. ```bash $ http pie.dev/headers X-Data:@files/text.txt ``` ### Empty headers and header un-setting To unset a previously specified header (such a one of the default headers), use `Header:`: ```bash $ http pie.dev/headers Accept: User-Agent: ``` To send a header with an empty value, use `Header;`, with a semicolon: ```bash $ http pie.dev/headers 'Header;' ``` Please note that some internal headers, such as `Content-Length`, can’t be unset if they are automatically added by the client itself. ### Multiple header values with the same name If the request is sent with multiple headers that are sharing the same name, then the HTTPie will send them individually. ```bash http --offline example.org Cookie:one Cookie:two ``` ```http GET / HTTP/1.1 Cookie: one Cookie: two ``` It is also possible to pass a single header value pair, where the value is a comma separated list of header values. Then the client will send it as a single header. ```bash http --offline example.org Numbers:one,two ``` ```http GET / HTTP/1.1 Numbers: one,two ``` Also be aware that if the current session contains any headers they will get overwritten by individual commands when sending a request instead of being joined together. ### Limiting response headers The `--max-headers=n` option allows you to control the number of headers HTTPie reads before giving up (the default `0`, i.e., there’s no limit). ```bash $ http --max-headers=100 pie.dev/get ``` ## Offline mode Use `--offline` to construct HTTP requests without sending them anywhere. With `--offline`, HTTPie builds a request based on the specified options and arguments, prints it to `stdout`, and then exits. It works completely offline; no network connection is ever made. This has a number of use cases, including: Generating API documentation examples that you can copy & paste without sending a request: ```bash $ http --offline POST server.chess/api/games API-Key:ZZZ w=magnus b=hikaru t=180 i=2 ``` ```bash $ http --offline MOVE server.chess/api/games/123 API-Key:ZZZ p=b a=R1a3 t=77 ``` Generating raw requests that can be sent with any other client: ```bash # 1. save a raw request to a file: $ http --offline POST pie.dev/post hello=world > request.http ``` ```bash # 2. send it over the wire with, for example, the fantastic netcat tool: $ nc pie.dev 80 < request.http ``` You can also use the `--offline` mode for debugging and exploring HTTP and HTTPie, and for “dry runs”. `--offline` has the side effect of automatically activating `--print=HB`, i.e., both the request headers and the body are printed. You can customize the output with the usual [output options](#output-options), with the exception where there is no response to be printed. You can use `--offline` in combination with all the other options (e.g. `--session`). ## Cookies HTTP clients send cookies to the server as regular [HTTP headers](#http-headers). That means, HTTPie does not offer any special syntax for specifying cookies — the usual `Header:Value` notation is used: Send a single cookie: ```bash $ http pie.dev/cookies Cookie:sessionid=foo ``` ```http GET / HTTP/1.1 Accept: */* Accept-Encoding: gzip, deflate Connection: keep-alive Cookie: sessionid=foo Host: pie.dev User-Agent: HTTPie/0.9.9 ``` Send multiple cookies (note: the header is quoted to prevent the shell from interpreting the `;`): ```bash $ http pie.dev/cookies 'Cookie:sessionid=foo;another-cookie=bar' ``` ```http GET / HTTP/1.1 Accept: */* Accept-Encoding: gzip, deflate Connection: keep-alive Cookie: sessionid=foo;another-cookie=bar Host: pie.dev User-Agent: HTTPie/0.9.9 ``` If you often deal with cookies in your requests, then you’d appreciate the [sessions](#sessions) feature. ## Authentication The currently supported authentication schemes are Basic and Digest (see [auth plugins](#auth-plugins) for more). There are two flags that control authentication: | Flag | Arguments | |------------------:|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `--auth, -a` | Pass either a `username:password` pair or a `token` as the argument. If the selected authenticated method requires username/password combination and if you only specify a username (`-a username`), you’ll be prompted for the password before the request is sent. To send an empty password, pass `username:`. The `username:password@hostname` URL syntax is supported as well (but credentials passed via `-a` have higher priority) | | `--auth-type, -A` | Specify the auth mechanism. Possible values are `basic`, `digest`, `bearer` or the name of any [auth plugins](#auth-plugins) you have installed. The default value is `basic` so it can often be omitted | ### Basic auth ```bash $ http -a username:password pie.dev/basic-auth/username/password ``` ### Digest auth ```bash $ http -A digest -a username:password pie.dev/digest-auth/httpie/username/password ``` ### Bearer auth ```bash https -A bearer -a token pie.dev/bearer ``` ### Password prompt If you omit the password part of `--auth, -a`, HTTPie securely prompts you for it: ```bash $ http -a username pie.dev/basic-auth/username/password ``` Please note that when you use [`--session`](#sessions), prompted passwords are persisted in session files. ### Empty password To send an empty password without being prompted for it, include a trailing colon in the credentials: ```bash $ http -a username: pie.dev/headers ``` ### `.netrc` Authentication information from your `~/.netrc` file is by default honored as well. For example: ```bash $ cat ~/.netrc machine pie.dev login httpie password test ``` ```bash $ http pie.dev/basic-auth/httpie/test HTTP/1.1 200 OK [...] ``` This can be disabled with the `--ignore-netrc` option: ```bash $ http --ignore-netrc pie.dev/basic-auth/httpie/test HTTP/1.1 401 UNAUTHORIZED [...] ``` ### Auth plugins Additional authentication mechanism can be installed as plugins. They can be found on the [Python Package Index](https://pypi.python.org/pypi?%3Aaction=search&term=httpie&submit=search). Here are a few picks: - [httpie-api-auth](https://github.com/pd/httpie-api-auth): ApiAuth - [httpie-aws-auth](https://github.com/httpie/httpie-aws-auth): AWS / Amazon S3 - [httpie-edgegrid](https://github.com/akamai-open/httpie-edgegrid): EdgeGrid - [httpie-hmac-auth](https://github.com/guardian/httpie-hmac-auth): HMAC - [httpie-jwt-auth](https://github.com/teracyhq/httpie-jwt-auth): JWTAuth (JSON Web Tokens) - [httpie-negotiate](https://github.com/ndzou/httpie-negotiate): SPNEGO (GSS Negotiate) - [httpie-ntlm](https://github.com/httpie/httpie-ntlm): NTLM (NT LAN Manager) - [httpie-oauth1](https://github.com/qcif/httpie-oauth1): OAuth 1.0a - [requests-hawk](https://github.com/mozilla-services/requests-hawk): Hawk See [plugin manager](#plugin-manager) for more details. ## HTTP redirects By default, HTTP redirects are not followed and only the first response is shown: ```bash $ http pie.dev/redirect/3 ``` ### Follow `Location` To instruct HTTPie to follow the `Location` header of `30x` responses and show the final response instead, use the `--follow, -F` option: ```bash $ http --follow pie.dev/redirect/3 ``` With `307 Temporary Redirect` and `308 Permanent Redirect`, the method and the body of the original request are reused to perform the redirected request. Otherwise, a body-less `GET` request is performed. ### Showing intermediary redirect responses If you wish to see the intermediary requests/responses, then use the `--all` option: ```bash $ http --follow --all pie.dev/redirect/3 ``` ### Limiting maximum redirects followed To change the default limit of maximum `30` redirects, use the `--max-redirects=` option: ```bash $ http --follow --all --max-redirects=2 pie.dev/redirect/3 ``` ## Proxies You can specify proxies to be used through the `--proxy` argument for each protocol (which is included in the value in case of redirects across protocols): ```bash $ http --proxy=http:http://10.10.1.10:3128 --proxy=https:https://10.10.1.10:1080 example.org ``` With Basic authentication: ```bash $ http --proxy=http:http://user:pass@10.10.1.10:3128 example.org ``` ### Environment variables You can also configure proxies by environment variables `ALL_PROXY`, `HTTP_PROXY` and `HTTPS_PROXY`, and the underlying [Requests library](https://requests.readthedocs.io/en/latest/) will pick them up. If you want to disable proxies configured through the environment variables for certain hosts, you can specify them in `NO_PROXY`. In your `~/.bash_profile`: ```bash export HTTP_PROXY=http://10.10.1.10:3128 export HTTPS_PROXY=https://10.10.1.10:1080 export NO_PROXY=localhost,example.com ``` ### SOCKS Usage for SOCKS is the same as for other types of [proxies](#proxies): ```bash $ http --proxy=http:socks5://user:pass@host:port --proxy=https:socks5://user:pass@host:port example.org ``` ## HTTPS ### Server SSL certificate verification To skip the host’s SSL certificate verification, you can pass `--verify=no` (default is `yes`): ```bash $ http --verify=no https://pie.dev/get ``` ### Custom CA bundle You can also use `--verify=` to set a custom CA bundle path: ```bash $ http --verify=/ssl/custom_ca_bundle https://example.org ``` ### Client side SSL certificate To use a client side certificate for the SSL communication, you can pass the path of the cert file with `--cert`: ```bash $ http --cert=client.pem https://example.org ``` If the private key is not contained in the cert file, you may pass the path of the key file with `--cert-key`: ```bash $ http --cert=client.crt --cert-key=client.key https://example.org ``` If the given private key requires a passphrase, HTTPie will automatically detect it and ask it through a prompt: ```bash $ http --cert=client.pem --cert-key=client.key https://example.org http: passphrase for client.key: **** ``` If you don't want to see a prompt, you can supply the passphrase with the `--cert-key-pass` argument: ```bash $ http --cert=client.pem --cert-key=client.key --cert-key-pass=my_password https://example.org ``` ### SSL version Use the `--ssl=` option to specify the desired protocol version to use. This will default to SSL v2.3 which will negotiate the highest protocol that both the server and your installation of OpenSSL support. The available protocols are `ssl2.3`, `ssl3`, `tls1`, `tls1.1`, `tls1.2`, `tls1.3`. (The actually available set of protocols may vary depending on your OpenSSL installation.) ```bash # Specify the vulnerable SSL v3 protocol to talk to an outdated server: $ http --ssl=ssl3 https://vulnerable.example.org ``` ### SSL ciphers You can specify the available ciphers with `--ciphers`. It should be a string in the [OpenSSL cipher list format](https://www.openssl.org/docs/man1.1.0/man1/ciphers.html). ```bash $ http --ciphers=ECDHE-RSA-AES128-GCM-SHA256 https://pie.dev/get ``` Note: these cipher strings do not change the negotiated version of SSL or TLS, they only affect the list of available cipher suites. To see the default cipher string, run `http --help` and see the `--ciphers` section under SSL. ## Output options By default, HTTPie only outputs the final response and the whole response message is printed (headers as well as the body). You can control what should be printed via several options: | Option | What is printed | |---------------------------:|----------------------------------------------------------------------------------------------------| | `--headers, -h` | Only the response headers are printed | | `--body, -b` | Only the response body is printed | | `--meta, -m` | Only the [response metadata](#response-meta) is printed | | `--verbose, -v` | Print the whole HTTP exchange (request and response). This option also enables `--all` (see below) | | `--verbose --verbose, -vv` | Just like `-v`, but also include the response metadata. | | `--print, -p` | Selects parts of the HTTP exchange | | `--quiet, -q` | Don’t print anything to `stdout` and `stderr` | ### What parts of the HTTP exchange should be printed All the other [output options](#output-options) are under the hood just shortcuts for the more powerful `--print, -p`. It accepts a string of characters each of which represents a specific part of the HTTP exchange: | Character | Stands for | |----------:|---------------------------------| | `H` | request headers | | `B` | request body | | `h` | response headers | | `b` | response body | | `m` | [response meta](#response-meta) | Print request and response headers: ```bash $ http --print=Hh PUT pie.dev/put hello=world ``` #### Response meta The response metadata section currently includes the total time elapsed. It’s the number of seconds between opening the network connection and downloading the last byte of response the body. To _only_ show the response metadata, use `--meta, -m` (analogically to `--headers, -h` and `--body, -b`): ```bash $ http --meta pie.dev/delay/1 ``` ```console Elapsed time: 1.099171542s ``` The [extra verbose `-vv` output](#extra-verbose-output) includes the meta section by default. You can also show it in combination with other parts of the exchange via [`--print=m`](#what-parts-of-the-http-exchange-should-be-printed). For example, here we print it together with the response headers: ```bash $ http --print=hm pie.dev/get ``` ```http HTTP/1.1 200 OK Content-Type: application/json Elapsed time: 0.077538375s ``` Please note that it also includes time spent on formatting the output, which adds a small penalty. Also, if the body is not part of the output, [we don’t spend time downloading it](#conditional-body-download). If you [use `--style` with one of the Pie themes](#colors-and-formatting), you’ll see the time information color-coded (green/yellow/orange/red) based on how long the exchange took. ### Verbose output `--verbose` can often be useful for debugging the request and generating documentation examples: ```bash $ http --verbose PUT pie.dev/put hello=world PUT /put HTTP/1.1 Accept: application/json, */*;q=0.5 Accept-Encoding: gzip, deflate Content-Type: application/json Host: pie.dev User-Agent: HTTPie/0.2.7dev { "hello": "world" } HTTP/1.1 200 OK Connection: keep-alive Content-Length: 477 Content-Type: application/json Date: Sun, 05 Aug 2012 00:25:23 GMT Server: gunicorn/0.13.4 { […] } ``` #### Extra verbose output If you run HTTPie with `-vv` or `--verbose --verbose`, then it would also display the [response metadata](#response-meta). ```bash # Just like the above, but with additional columns like the total elapsed time $ http -vv pie.dev/get ``` ### Quiet output `--quiet` redirects all output that would otherwise go to `stdout` and `stderr` to `/dev/null` (except for errors and warnings). This doesn’t affect output to a file via `--output` or `--download`. ```bash # There will be no output: $ http --quiet pie.dev/post enjoy='the silence' ``` If you’d like to silence warnings as well, use `-q` or `--quiet` twice: ```bash # There will be no output, even in case of an unexpected response status code: $ http -qq --check-status pie.dev/post enjoy='the silence without warnings' ``` ### Update warnings When there is a new release available for your platform (for example; if you installed HTTPie through `pip`, it will check the latest version on `PyPI`), HTTPie will regularly warn you about the new update (once a week). If you want to disable this behavior, you can set `disable_update_warnings` to `true` in your [config](#config) file. ### Viewing intermediary requests/responses To see all the HTTP communication, i.e. the final request/response as well as any possible intermediary requests/responses, use the `--all` option. The intermediary HTTP communication include followed redirects (with `--follow`), the first unauthorized request when HTTP digest authentication is used (`--auth=digest`), etc. ```bash # Include all responses that lead to the final one: $ http --all --follow pie.dev/redirect/3 ``` The intermediary requests/responses are by default formatted according to `--print, -p` (and its shortcuts described above). ### Conditional body download As an optimization, the response body is downloaded from the server only if it’s part of the output. This is similar to performing a `HEAD` request, except that it applies to any HTTP method you use. Let’s say that there is an API that returns the whole resource when it is updated, but you are only interested in the response headers to see the status code after an update: ```bash $ http --headers PATCH pie.dev/patch name='New Name' ``` Since you are only printing the HTTP headers here, the connection to the server is closed as soon as all the response headers have been received. Therefore, bandwidth and time isn’t wasted downloading the body which you don’t care about. The response headers are downloaded always, even if they are not part of the output ## Raw request body In addition to crafting structured [JSON](#json) and [forms](#forms) requests with the [request items](#request-items) syntax, you can provide a raw request body that will be sent without further processing. These two approaches for specifying request data (i.e., structured and raw) cannot be combined. There are three methods for passing raw request data: piping via `stdin`, `--raw='data'`, and `@/file/path`. ### Redirected Input The universal method for passing request data is through redirected `stdin` (standard input)—piping. By default, `stdin` data is buffered and then with no further processing used as the request body. If you provide `Content-Length`, then the request body is streamed without buffering. You may also use `--chunked` to enable streaming via [chunked transfer encoding](#chunked-transfer-encoding) or `--compress, -x` to [compress the request body](#compressed-request-body). There are multiple useful ways to use piping: Redirect from a file: ```bash $ http PUT pie.dev/put X-API-Token:123 < files/data.json ``` Or the output of another program: ```bash $ grep '401 Unauthorized' /var/log/httpd/error_log | http POST pie.dev/post ``` You can use `echo` for simple data: ```bash $ echo -n '{"name": "John"}' | http PATCH pie.dev/patch X-API-Token:123 ``` You can also use a Bash *here string*: ```bash $ http pie.dev/post <<<'{"name": "John"}' ``` You can even pipe web services together using HTTPie: ```bash $ http GET https://api.github.com/repos/httpie/cli | http POST pie.dev/post ``` You can use `cat` to enter multiline data on the terminal: ```bash $ cat | http POST pie.dev/post ^D ``` ```bash $ cat | http POST pie.dev/post Content-Type:text/plain - buy milk - call parents ^D ``` On macOS, you can send the contents of the clipboard with `pbpaste`: ```bash $ pbpaste | http PUT pie.dev/put ``` Passing data through `stdin` **can’t** be combined with data fields specified on the command line: ```bash $ echo -n 'data' | http POST example.org more=data # This is invalid ``` To prevent HTTPie from reading `stdin` data you can use the `--ignore-stdin` option. ### Request data via `--raw` In a situation when piping data via `stdin` is not convenient (for example, when generating API docs examples), you can specify the raw request body via the `--raw` option. ```bash $ http --raw 'Hello, world!' pie.dev/post ``` ```bash $ http --raw '{"name": "John"}' pie.dev/post ``` ### Request data from a filename An alternative to redirected `stdin` is specifying a filename (as `@/path/to/file`) whose content is used as if it came from `stdin`. It has the advantage that the `Content-Type` header is automatically set to the appropriate value based on the filename extension. For example, the following request sends the verbatim contents of that XML file with `Content-Type: application/xml`: ```bash $ http PUT pie.dev/put @files/data.xml ``` File uploads are always streamed to avoid memory issues with large files. ## Chunked transfer encoding You can use the `--chunked` flag to instruct HTTPie to use `Transfer-Encoding: chunked`: ```bash $ http --chunked PUT pie.dev/put hello=world ``` ```bash $ http --chunked --multipart PUT pie.dev/put hello=world foo@files/data.xml ``` ```bash $ http --chunked pie.dev/post @files/data.xml ``` ```bash $ cat files/data.xml | http --chunked pie.dev/post ``` ## Compressed request body You can use the `--compress, -x` flag to instruct HTTPie to use `Content-Encoding: deflate` and compress the request data: ```bash $ http --compress pie.dev/post @files/data.xml ``` ```bash $ cat files/data.xml | http --compress pie.dev/post ``` If compressing the data does not save size, HTTPie sends it untouched. To always compress the data, specify `--compress, -x` twice: ```bash $ http -xx PUT pie.dev/put hello=world ``` ## Terminal output HTTPie does several things by default in order to make its terminal output easy to read. ### Colors and formatting Syntax highlighting is applied to HTTP headers and bodies (where it makes sense). You can choose your preferred color scheme via the `--style` option if you don’t like the default one. There are dozens of styles available, here are just a few notable ones: | Style | Description | |------------:|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `auto` | Follows your terminal ANSI color styles. This is the default style used by HTTPie | | `default` | Default styles of the underlying Pygments library. Not actually used by default by HTTPie. You can enable it with `--style=default` | | `pie-dark` | HTTPie’s original brand style. Also used in [HTTPie for Web and Desktop](https://httpie.io/product). | | `pie-light` | Like `pie-dark`, but for terminals with light background colors. | | `pie` | A generic version of `pie-dark` and `pie-light` themes that can work with any terminal background. Its universality requires compromises in terms of legibility, but it’s useful if you frequently switch your terminal between dark and light backgrounds. | | `monokai` | A popular color scheme. Enable with `--style=monokai` | | `fruity` | A bold, colorful scheme. Enable with `--style=fruity` | | … | See `$ http --help` for all the possible `--style` values | Use one of these options to control output processing: | Option | Description | |------------------:|---------------------------------------------------------------| | `--pretty=all` | Apply both colors and formatting. Default for terminal output | | `--pretty=colors` | Apply colors | | `--pretty=format` | Apply formatting | | `--pretty=none` | Disables output processing. Default for redirected output | HTTPie looks at `Content-Type` to select the right syntax highlighter and formatter for each message body. If that fails (e.g., the server provides the wrong type), or you prefer a different treatment, you can manually overwrite the mime type for a response with `--response-mime`: ```bash $ http --response-mime=text/yaml pie.dev/get ``` Formatting has the following effects: - HTTP headers are sorted by name. - JSON data is indented, sorted by keys, and unicode escapes are converted to the characters they represent. - XML and XHTML data is indented. Please note that sometimes there might be changes made by formatters on the actual response body (e.g., collapsing empty tags on XML) but the end result will always be semantically indistinguishable. Some of these formatting changes can be configured more granularly through [format options](#format-options). ### Format options The `--format-options=opt1:value,opt2:value` option allows you to control how the output should be formatted when formatting is applied. The following options are available: | Option | Default value | Shortcuts | |-----------------:|:-------------:|--------------------------| | `headers.sort` | `true` | `--sorted`, `--unsorted` | | `json.format` | `true` | N/A | | `json.indent` | `4` | N/A | | `json.sort_keys` | `true` | `--sorted`, `--unsorted` | | `xml.format` | `true` | N/A | | `xml.indent` | `2` | N/A | For example, this is how you would disable the default header and JSON key sorting, and specify a custom JSON indent size: ```bash $ http --format-options headers.sort:false,json.sort_keys:false,json.indent:2 pie.dev/get ``` There are also two shortcuts that allow you to quickly disable and re-enable sorting-related format options (currently it means JSON keys and headers): `--unsorted` and `--sorted`. This is something you will typically store as one of the default options in your [config](#config) file. ### Redirected output HTTPie uses a different set of defaults for redirected output than for [terminal output](#terminal-output). The differences being: - Formatting and colors aren’t applied (unless `--pretty` is specified). - Only the response body is printed (unless one of the [output options](#output-options) is set). - Also, binary data isn’t suppressed. The reason is to make piping HTTPie’s output to another programs and downloading files work with no extra flags. Most of the time, only the raw response body is of an interest when the output is redirected. Download a file: ```bash $ http pie.dev/image/png > image.png ``` Download an image of an [Octocat](https://octodex.github.com/images/original.jpg), resize it using [ImageMagick](https://imagemagick.org/), and upload it elsewhere: ```bash $ http octodex.github.com/images/original.jpg | convert - -resize 25% - | http example.org/Octocats ``` Force colorizing and formatting, and show both the request and the response in `less` pager: ```bash $ http --pretty=all --verbose pie.dev/get | less -R ``` The `-R` flag tells `less` to interpret color escape sequences included HTTPie’s output. You can create a shortcut for invoking HTTPie with colorized and paged output by adding the following to your `~/.bash_profile`: ```bash function httpless { # `httpless example.org' http --pretty=all --print=hb "$@" | less -R; } ``` ### Binary data Binary data is suppressed for terminal output, which makes it safe to perform requests to URLs that send back binary data. Binary data is also suppressed in redirected but prettified output. The connection is closed as soon as we know that the response body is binary, ```bash $ http pie.dev/bytes/2000 ``` You will nearly instantly see something like this: ```http HTTP/1.1 200 OK Content-Type: application/octet-stream +-----------------------------------------+ | NOTE: binary data not shown in terminal | +-----------------------------------------+ ``` ### Display encoding HTTPie tries to do its best to decode message bodies when printing them to the terminal correctly. It uses the encoding specified in the `Content-Type` `charset` attribute. If a message doesn’t define its charset, we auto-detect it. For very short messages (1–32B), where auto-detection would be unreliable, we default to UTF-8. For cases when the response encoding is still incorrect, you can manually overwrite the response charset with `--response-charset`: ```bash $ http --response-charset=big5 pie.dev/get ``` ## Download mode HTTPie features a download mode in which it acts similarly to `wget`. When enabled using the `--download, -d` flag, response headers are printed to the terminal (`stderr`), and a progress bar is shown while the response body is being saved to a file. ```bash $ http --download https://github.com/httpie/cli/archive/master.tar.gz ``` ```http HTTP/1.1 200 OK Content-Disposition: attachment; filename=httpie-master.tar.gz Content-Length: 257336 Content-Type: application/x-gzip Downloading 251.30 kB to "httpie-master.tar.gz" Done. 251.30 kB in 2.73862s (91.76 kB/s) ``` ### Downloaded filename There are three mutually exclusive ways through which HTTPie determines the output filename (with decreasing priority): 1. You can explicitly provide it via `--output, -o`. The file gets overwritten if it already exists (or appended to with `--continue, -c`). 2. The server may specify the filename in the optional `Content-Disposition` response header. Any leading dots are stripped from a server-provided filename. 3. The last resort HTTPie uses is to generate the filename from a combination of the request URL and the response `Content-Type`. The initial URL is always used as the basis for the generated filename — even if there has been one or more redirects. To prevent data loss by overwriting, HTTPie adds a unique numerical suffix to the filename when necessary (unless specified with `--output, -o`). ### Piping while downloading You can also redirect the response body to another program while the response headers and progress are still shown in the terminal: ```bash $ http -d https://github.com/httpie/cli/archive/master.tar.gz | tar zxf - ``` ### Resuming downloads If `--output, -o` is specified, you can resume a partial download using the `--continue, -c` option. This only works with servers that support `Range` requests and `206 Partial Content` responses. If the server doesn’t support that, the whole file will simply be downloaded: ```bash $ http -dco file.zip example.org/file ``` `-dco` is shorthand for `--download` `--continue` `--output`. ### Other notes - The `--download` option only changes how the response body is treated. - You can still set custom headers, use sessions, `--verbose, -v`, etc. - `--download` always implies `--follow` (redirects are followed). - `--download` also implies `--check-status` (error HTTP status will result in a non-zero exist static code). - HTTPie exits with status code `1` (error) if the body hasn’t been fully downloaded. - `Accept-Encoding` can’t be set with `--download`. ## Streamed responses Responses are downloaded and printed in chunks. This allows for streaming and large file downloads without using too much memory. However, when [colors and formatting](#colors-and-formatting) are applied, the whole response is buffered and only then processed at once. ### Disabling buffering You can use the `--stream, -S` flag to make two things happen: 1. The output is flushed in much smaller chunks without any buffering, which makes HTTPie behave kind of like `tail -f` for URLs. 2. Streaming becomes enabled even when the output is prettified: It will be applied to each line of the response and flushed immediately. This makes it possible to have a nice output for long-lived requests, such as one to the [Twitter streaming API](https://developer.twitter.com/en/docs/tutorials/consuming-streaming-data). The `--stream` option is automatically enabled when the response headers include `Content-Type: text/event-stream`. ### Example use cases Prettified streamed response: ```bash $ http --stream pie.dev/stream/3 ``` Streamed output by small chunks à la `tail -f`: ```bash # Send each new line (JSON object) to another URL as soon as it arrives from a streaming API: $ http --stream pie.dev/stream/3 | while read line; do echo "$line" | http pie.dev/post ; done ``` ## Sessions By default, every request HTTPie makes is completely independent of any previous ones to the same host. However, HTTPie also supports persistent sessions via the `--session=SESSION_NAME_OR_PATH` option. In a session, custom [HTTP headers](#http-headers) (except for the ones starting with `Content-` or `If-`), [authentication](#authentication), and [cookies](#cookies) (manually specified or sent by the server) persist between requests to the same host. ```bash # Create a new session: $ http --session=./session.json pie.dev/headers API-Token:123 ``` ```bash # Inspect / edit the generated session file: $ cat session.json ``` ```bash # Re-use the existing session — the API-Token header will be set: $ http --session=./session.json pie.dev/headers ``` All session data, including credentials, prompted passwords, cookie data, and custom headers are stored in plain text. That means session files can also be created and edited manually in a text editor—they are regular JSON. It also means that they can be read by anyone who has access to the session file. ### Named sessions You can create one or more named session per host. For example, this is how you can create a new session named `user1` for `pie.dev`: ```bash $ http --session=user1 -a user1:password pie.dev/get X-Foo:Bar ``` From now on, you can refer to the session by its name (`user1`). When you choose to use the session again, all previously specified authentication or HTTP headers will automatically be set: ```bash $ http --session=user1 pie.dev/get ``` To create or reuse a different session, simply specify a different name: ```bash $ http --session=user2 -a user2:password pie.dev/get X-Bar:Foo ``` Named sessions’ data is stored in JSON files inside the `sessions` subdirectory of the [config](#config) directory, typically `~/.config/httpie/sessions//.json` (`%APPDATA%\httpie\sessions\\.json` on Windows). If you have executed the above commands on a Unix machine, you should be able to list the generated sessions files using: ```bash $ ls -l ~/.config/httpie/sessions/pie.dev ``` ### Anonymous sessions Instead of giving it a name, you can also directly specify a path to a session file. This allows for sessions to be re-used across multiple hosts: ```bash # Create a session: $ http --session=/tmp/session.json example.org ``` ```bash # Use the session to make a request to another host: $ http --session=/tmp/session.json admin.example.org ``` ```bash # You can also refer to a previously created named session: $ http --session=~/.config/httpie/sessions/another.example.org/test.json example.org ``` When creating anonymous sessions, please remember to always include at least one `/`, even if the session files is located in the current directory (i.e. `--session=./session.json` instead of just `--session=session.json`), otherwise HTTPie assumes a named session instead. ### Readonly session To use the original session file without updating it from the request/response exchange after it has been created, specify the session name via `--session-read-only=SESSION_NAME_OR_PATH` instead. ```bash # If the session file doesn’t exist, then it is created: $ http --session-read-only=./ro-session.json pie.dev/headers Custom-Header:orig-value ``` ```bash # But it is not updated: $ http --session-read-only=./ro-session.json pie.dev/headers Custom-Header:new-value ``` ### Host-based cookie policy Cookies persisted in sessions files have a `domain` field. This _binds_ them to a specified hostname. For example: ```json { "cookies": [ { "domain": "pie.dev", "name": "pie", "value": "apple" }, { "domain": "httpbin.org", "name": "bin", "value": "http" } ] } ``` Using this session file, we include `Cookie: pie=apple` only in requests against `pie.dev` and subdomains (e.g., `foo.pie.dev` or `foo.bar.pie.dev`): ```bash $ http --session=./session.json pie.dev/cookies ``` ```json { "cookies": { "pie": "apple" } } ``` To make a cookie domain _unbound_ (i.e., to make it available to all hosts, including throughout a cross-domain redirect chain), you can set the `domain` field to `null` in the session file: ```json { "cookies": [ { "domain": null, "name": "unbound-cookie", "value": "send-me-to-any-host" } ] } ``` ```bash $ http --session=./session.json pie.dev/cookies ``` ```json { "cookies": { "unbound-cookie": "send-me-to-any-host" } } ``` ### Cookie storage behavior There are three possible sources of persisted cookies within a session. They have the following storage priority: 1—response; 2—command line; 3—session file. 1. Receive a response with a `Set-Cookie` header: ```bash $ http --session=./session.json pie.dev/cookie/set?foo=bar ``` 2. Send a cookie specified on the command line as seen in [cookies](#cookies): ```bash $ http --session=./session.json pie.dev/headers Cookie:foo=bar ``` 3. Manually set cookie parameters in the session file: ```json { "cookies": { "foo": { "expires": null, "path": "/", "secure": false, "value": "bar" } } } ``` In summary: - Cookies set via the CLI overwrite cookies of the same name inside session files. - Server-sent `Set-Cookie` header cookies overwrite any pre-existing ones with the same name. Cookie expiration handling: - When the server expires an existing cookie, HTTPie removes it from the session file. - When a cookie in a session file expires, HTTPie removes it before sending a new request. ### Upgrading sessions HTTPie may introduce changes in the session file format. When HTTPie detects an obsolete format, it shows a warning. You can upgrade your session files using the following commands: Upgrade all existing [named sessions](#named-sessions) inside the `sessions` subfolder of your [config directory](https://httpie.io/docs/cli/config-file-directory): ```bash $ httpie cli sessions upgrade-all Upgraded 'api_auth' @ 'pie.dev' to v3.1.0 Upgraded 'login_cookies' @ 'httpie.io' to v3.1.0 ``` Upgrading individual sessions requires you to specify the session's hostname. That allows HTTPie to find the correct file in the case of name sessions. Additionally, it allows it to correctly bind cookies when upgrading with [`--bind-cookies`](#session-upgrade-options). Upgrade a single [named session](#named-sessions): ```bash $ httpie cli sessions upgrade pie.dev api_auth Upgraded 'api_auth' @ 'pie.dev' to v3.1.0 ``` Upgrade a single [anonymous session](#anonymous-sessions) using a file path: ```bash $ httpie cli sessions upgrade pie.dev ./session.json Upgraded 'session.json' @ 'pie.dev' to v3.1.0 ``` #### Session upgrade options These flags are available for both `sessions upgrade` and `sessions upgrade-all`: | Option | Description | |------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `--bind-cookies` | Bind all previously [unbound cookies](#host-based-cookie-policy) to the session’s host ([context](https://github.com/httpie/cli/security/advisories/GHSA-9w4w-cpc8-h2fq)). | ## Config HTTPie uses a simple `config.json` file. The file doesn’t exist by default, but you can create it manually. ### Config file directory To see the exact location for your installation, run `http --debug` and look for `config_dir` in the output. The default location of the configuration file on most platforms is `$XDG_CONFIG_HOME/httpie/config.json` (defaulting to `~/.config/httpie/config.json`). For backward compatibility, if the directory `~/.httpie` exists, the configuration file there will be used instead. On Windows, the config file is located at `%APPDATA%\httpie\config.json`. The config directory can be changed by setting the `$HTTPIE_CONFIG_DIR` environment variable: ```bash $ export HTTPIE_CONFIG_DIR=/tmp/httpie $ http pie.dev/get ``` ### Configurable options Currently, HTTPie offers a single configurable option: #### `default_options` An `Array` (by default empty) of default options that should be applied to every invocation of HTTPie. For instance, you can use this config option to change your default color theme: ```bash $ cat ~/.config/httpie/config.json ``` ```json { "default_options": [ "--style=fruity" ] } ``` Technically, it is possible to include any HTTPie options in there. However, it is not recommended modifying the default behavior in a way that would break your compatibility with the wider world as that may become confusing. #### `plugins_dir` The directory where the plugins will be installed. HTTPie needs to have read/write access on that directory, since `httpie cli plugins install` will download new plugins to there. See [plugin manager](#plugin-manager) for more information. ### Un-setting previously specified options Default options from the config file, or specified any other way, can be unset for a particular invocation via `--no-OPTION` arguments passed via the command line (e.g., `--no-style` or `--no-session`). ## Scripting When using HTTPie from shell scripts, it can be handy to set the `--check-status` flag. It instructs HTTPie to exit with an error if the HTTP status is one of `3xx`, `4xx`, or `5xx`. The exit status will be `3` (unless `--follow` is set), `4`, or `5`, respectively. ```bash #!/bin/bash if http --check-status --ignore-stdin --timeout=2.5 HEAD pie.dev/get &> /dev/null; then echo 'OK!' else case $? in 2) echo 'Request timed out!' ;; 3) echo 'Unexpected HTTP 3xx Redirection!' ;; 4) echo 'HTTP 4xx Client Error!' ;; 5) echo 'HTTP 5xx Server Error!' ;; 6) echo 'Exceeded --max-redirects= redirects!' ;; *) echo 'Other Error!' ;; esac fi ``` ### Best practices The default behavior of automatically reading `stdin` is typically not desirable during non-interactive invocations. You most likely want to use the `--ignore-stdin` option to disable it. It's important to note that without the `--ignore-stdin` option, HTTPie may appear to have stopped working (hang). This happens because, in situations where HTTPie is invoked outside of an interactive session, such as from a cron job, `stdin` is not connected to a terminal. This means that the rules for [redirected input](#redirected-input) will be followed. When `stdin` is redirected, HTTPie assumes that the input will contain the request body, and it waits for the input to be provided. But, since there is neither any input data nor an end-of-file (`EOF`) signal, HTTPie gets stuck. To avoid this problem, the `--ignore-stdin` flag should be used in scripts, unless data is being piped to HTTPie. To prevent your program from becoming unresponsive when the server fails to respond, it's a good idea to use the `--timeout` option to set a connection timeout limit. ## Plugin manager HTTPie offers extensibility through a [plugin API](https://github.com/httpie/cli/blob/master/httpie/plugins/base.py), and there are dozens of plugins available to try! They add things like new authentication methods ([akamai/httpie-edgegrid](https://github.com/akamai/httpie-edgegrid)), transport mechanisms ([httpie/httpie-unixsocket](https://github.com/httpie/httpie-unixsocket)), message convertors ([banteg/httpie-image](https://github.com/banteg/httpie-image)), or simply change how a response is formatted. > Note: Plugins are usually made by our community members, and thus have no direct relationship with > the HTTPie project. We do not control / review them at the moment, so use them at your own discretion. For managing these plugins; starting with 3.0, we are offering a new plugin manager. This command is currently in beta. ### `httpie cli` #### `httpie cli check-updates` You can check whether a new update is available for your system by running `httpie cli check-updates`: ```bash-termible $ httpie cli check-updates ``` #### `httpie cli export-args` `httpie cli export-args` command can expose the parser specification of `http`/`https` commands (like an API definition) to outside tools so that they can use this to build better interactions over them (e.g., offer auto-complete). Available formats to export in include: | Format | Description | |--------|---------------------------------------------------------------------------------------------------------------------------------------------------| | `json` | Export the parser spec in JSON. The schema includes a top-level `version` parameter which should be interpreted in [semver](https://semver.org/). | You can use any of these formats with `--format` parameter, but the default one is `json`. ```bash $ httpie cli export-args | jq '"Program: " + .spec.name + ", Version: " + .version' "Program: http, Version: 0.0.1a0" ``` #### `httpie cli plugins` `plugins` interface is a very simple plugin manager for installing, listing and uninstalling HTTPie plugins. In the past `pip` was used to install/uninstall plugins, but on some environments (e.g., brew installed packages) it wasn’t working properly. The new interface is a very simple overlay on top of `pip` to allow plugin installations on every installation method. By default, the plugins (and their missing dependencies) will be stored under the configuration directory, but this can be modified through `plugins_dir` variable on the config. ##### `httpie cli plugins install` For installing plugins from [PyPI](https://pypi.org/) or from local paths, `httpie cli plugins install` can be used. ```bash $ httpie cli plugins install httpie-plugin Installing httpie-plugin... Successfully installed httpie-plugin-1.0.2 ``` > Tip: Generally HTTPie plugins start with `httpie-` prefix. Try searching for it on [PyPI](https://pypi.org/search/?q=httpie-) > to find out all plugins from the community. ##### `httpie cli plugins list` List all installed plugins. ```bash $ httpie cli plugins list httpie_plugin (1.0.2) httpie_plugin (httpie.plugins.auth.v1) httpie_plugin_2 (1.0.6) httpie_plugin_2 (httpie.plugins.auth.v1) httpie_converter (1.0.0) httpie_iterm_converter (httpie.plugins.converter.v1) httpie_konsole_konverter (httpie.plugins.converter.v1) ``` ##### `httpie cli plugins upgrade` For upgrading already installed plugins, use `httpie plugins upgrade`. ```bash $ httpie cli plugins upgrade httpie-plugin ``` ##### `httpie cli plugins uninstall` Uninstall plugins from the isolated plugins directory. If the plugin is not installed through `httpie cli plugins install`, it won’t uninstall it. ```bash $ httpie cli plugins uninstall httpie-plugin ``` ## Meta ### Interface design The syntax of the command arguments closely correspond to the actual HTTP requests sent over the wire. It has the advantage that it’s easy to remember and read. You can often translate an HTTP request to an HTTPie argument list just by inlining the request elements. For example, compare this HTTP request: ```http POST /post HTTP/1.1 Host: pie.dev X-API-Key: 123 User-Agent: Bacon/1.0 Content-Type: application/x-www-form-urlencoded name=value&name2=value2 ``` with the HTTPie command that sends it: ```bash $ http -f POST pie.dev/post \ X-API-Key:123 \ User-Agent:Bacon/1.0 \ name=value \ name2=value2 ``` Notice that both the order of elements and the syntax are very similar, and that only a small portion of the command is used to control HTTPie and doesn’t directly correspond to any part of the request (here, it’s only `-f` asking HTTPie to send a form request). The two modes, `--pretty=all` (default for terminal) and `--pretty=none` (default for [redirected output](#redirected-output)), allow for both user-friendly interactive use and usage from scripts, where HTTPie serves as a generic HTTP client. In the future, the command line syntax and some of the `--OPTIONS` may change slightly, as HTTPie improves and new features are added. All changes are recorded in the [change log](#change-log). ### Community and Support HTTPie has the following community channels: - [GitHub Issues](https://github.com/httpie/cli/issues) for bug reports and feature requests - [Discord server](https://httpie.io/discord) to ask questions, discuss features, and for general API development discussion - [StackOverflow](https://stackoverflow.com) to ask questions (make sure to use the [httpie](https://stackoverflow.com/questions/tagged/httpie) tag) ### Related projects #### Dependencies Under the hood, HTTPie uses these two amazing libraries: - [Requests](https://requests.readthedocs.io/en/latest/) — Python HTTP library for humans - [Pygments](https://pygments.org/) — Python syntax highlighter #### HTTPie friends HTTPie plays exceptionally well with the following tools: - [http-prompt](https://github.com/httpie/http-prompt) — an interactive shell for HTTPie featuring autocomplete and command syntax highlighting - [jq](https://stedolan.github.io/jq/) — CLI JSON processor that works great in conjunction with HTTPie Helpers to convert from other client tools: - [CurliPie](https://curlipie.open-api.vn) — library to convert cURL commands to HTTPie #### Alternatives - [httpcat](https://github.com/httpie/httpcat) — a lower-level sister utility of HTTPie for constructing raw HTTP requests on the command line - [curl](https://curl.haxx.se) — a "Swiss knife" command line tool and an exceptional library for transferring data with URLs. ### Contributing See [CONTRIBUTING](https://github.com/httpie/cli/blob/master/CONTRIBUTING.md). ### Security policy See [github.com/httpie/cli/security/policy](https://github.com/httpie/cli/security/policy). ### Change log See [CHANGELOG](https://github.com/httpie/cli/blob/master/CHANGELOG.md). ### Artwork - [README Animation](https://github.com/httpie/cli/blob/master/docs/httpie-animation.gif) by [Allen Smith](https://github.com/loranallensmith). ### Licence BSD-3-Clause: [LICENSE](https://github.com/httpie/cli/blob/master/LICENSE). ### Authors [Jakub Roztocil](https://roztocil.co) ([@jakubroztocil](https://twitter.com/jakubroztocil)) created HTTPie and [these fine people](https://github.com/httpie/cli/blob/master/AUTHORS.md) have contributed. cli-3.2.4/docs/config.json000066400000000000000000000001111471121002400153400ustar00rootroot00000000000000{ "website": { "master_and_released_docs_differ_after": null } } cli-3.2.4/docs/contributors/000077500000000000000000000000001471121002400157445ustar00rootroot00000000000000cli-3.2.4/docs/contributors/README.md000066400000000000000000000002501471121002400172200ustar00rootroot00000000000000Here we maintain a database of contributors, from which we generate credits on release blog posts and social media. For the HTTPie blog see: . cli-3.2.4/docs/contributors/fetch.py000066400000000000000000000213241471121002400174110ustar00rootroot00000000000000""" Generate the contributors database. FIXME: replace `requests` calls with the HTTPie API, when available. """ import json import os import re import sys from copy import deepcopy from datetime import datetime from pathlib import Path from subprocess import check_output from time import sleep from typing import Any, Dict, Optional, Set import requests FullNames = Set[str] GitHubLogins = Set[str] Person = Dict[str, str] People = Dict[str, Person] UserInfo = Dict[str, Any] CO_AUTHORS = re.compile(r'Co-authored-by: ([^<]+) <').finditer API_URL = 'https://api.github.com' REPO = OWNER = 'httpie' REPO_URL = f'{API_URL}/repos/{REPO}/{OWNER}' HERE = Path(__file__).parent DB_FILE = HERE / 'people.json' DEFAULT_PERSON: Person = {'committed': [], 'reported': [], 'github': '', 'twitter': ''} SKIPPED_LABELS = {'invalid'} GITHUB_TOKEN = os.getenv('GITHUB_TOKEN') assert GITHUB_TOKEN, 'GITHUB_TOKEN envar is missing' class FinishedForNow(Exception): """Raised when remaining GitHub rate limit is zero.""" def main(previous_release: str, current_release: str) -> int: since = release_date(previous_release) until = release_date(current_release) contributors = load_awesome_people() try: committers = find_committers(since, until) reporters = find_reporters(since, until) except Exception as exc: # We want to save what we fetched so far. So pass. print(' !! ', exc) try: merge_all_the_people(current_release, contributors, committers, reporters) fetch_missing_users_details(contributors) except FinishedForNow: # We want to save what we fetched so far. So pass. print(' !! Committers:', committers) print(' !! Reporters:', reporters) exit_status = 1 else: exit_status = 0 save_awesome_people(contributors) return exit_status def find_committers(since: str, until: str) -> FullNames: url = f'{REPO_URL}/commits' page = 1 per_page = 100 params = { 'since': since, 'until': until, 'per_page': per_page, } committers: FullNames = set() while 'there are commits': params['page'] = page data = fetch(url, params=params) for item in data: commit = item['commit'] committers.add(commit['author']['name']) debug(' >>> Commit', item['html_url']) for co_author in CO_AUTHORS(commit['message']): name = co_author.group(1) committers.add(name) if len(data) < per_page: break page += 1 return committers def find_reporters(since: str, until: str) -> GitHubLogins: url = f'{API_URL}/search/issues' page = 1 per_page = 100 params = { 'q': f'repo:{REPO}/{OWNER} is:issue closed:{since}..{until}', 'per_page': per_page, } reporters: GitHubLogins = set() while 'there are issues': params['page'] = page data = fetch(url, params=params) for item in data['items']: # Filter out unwanted labels. if any(label['name'] in SKIPPED_LABELS for label in item['labels']): continue debug(' >>> Issue', item['html_url']) reporters.add(item['user']['login']) if len(data['items']) < per_page: break page += 1 return reporters def merge_all_the_people(release: str, contributors: People, committers: FullNames, reporters: GitHubLogins) -> None: """ >>> contributors = {'Alice': new_person(github='alice', twitter='alice')} >>> merge_all_the_people('2.6.0', contributors, {}, {}) >>> contributors {'Alice': {'committed': [], 'reported': [], 'github': 'alice', 'twitter': 'alice'}} >>> contributors = {'Bob': new_person(github='bob', twitter='bob')} >>> merge_all_the_people('2.6.0', contributors, {'Bob'}, {'bob'}) >>> contributors {'Bob': {'committed': ['2.6.0'], 'reported': ['2.6.0'], 'github': 'bob', 'twitter': 'bob'}} >>> contributors = {'Charlotte': new_person(github='charlotte', twitter='charlotte', committed=['2.5.0'], reported=['2.5.0'])} >>> merge_all_the_people('2.6.0', contributors, {'Charlotte'}, {'charlotte'}) >>> contributors {'Charlotte': {'committed': ['2.5.0', '2.6.0'], 'reported': ['2.5.0', '2.6.0'], 'github': 'charlotte', 'twitter': 'charlotte'}} """ # Update known contributors. for name, details in contributors.items(): if name in committers: if release not in details['committed']: details['committed'].append(release) committers.remove(name) if details['github'] in reporters: if release not in details['reported']: details['reported'].append(release) reporters.remove(details['github']) # Add new committers. for name in committers: user_info = user(fullname=name) contributors[name] = new_person( github=user_info['login'], twitter=user_info['twitter_username'], committed=[release], ) if user_info['login'] in reporters: contributors[name]['reported'].append(release) reporters.remove(user_info['login']) # Add new reporters. for github_username in reporters: user_info = user(github_username=github_username) contributors[user_info['name'] or user_info['login']] = new_person( github=github_username, twitter=user_info['twitter_username'], reported=[release], ) def release_date(release: str) -> str: date = check_output(['git', 'log', '-1', '--format=%ai', release], text=True).strip() return datetime.strptime(date, '%Y-%m-%d %H:%M:%S %z').isoformat() def load_awesome_people() -> People: try: with DB_FILE.open(encoding='utf-8') as fh: return json.load(fh) except (FileNotFoundError, ValueError): return {} def fetch(url: str, params: Optional[Dict[str, str]] = None) -> UserInfo: headers = { 'Accept': 'application/vnd.github.v3+json', 'Authentication': f'token {GITHUB_TOKEN}' } for retry in range(1, 6): debug(f'[{retry}/5]', f'{url = }', f'{params = }') with requests.get(url, params=params, headers=headers) as req: try: req.raise_for_status() except requests.exceptions.HTTPError as exc: if exc.response.status_code == 403: # 403 Client Error: rate limit exceeded for url: ... now = int(datetime.utcnow().timestamp()) xrate_limit_reset = int(exc.response.headers['X-RateLimit-Reset']) wait = xrate_limit_reset - now if wait > 20: raise FinishedForNow() debug(' !', 'Waiting', wait, 'seconds before another try ...') sleep(wait) continue return req.json() assert ValueError('Rate limit exceeded') def new_person(**kwargs: str) -> Person: data = deepcopy(DEFAULT_PERSON) data.update(**kwargs) return data def user(fullname: Optional[str] = '', github_username: Optional[str] = '') -> UserInfo: if github_username: url = f'{API_URL}/users/{github_username}' return fetch(url) url = f'{API_URL}/search/users' for query in (f'fullname:{fullname}', f'user:{fullname}'): params = { 'q': f'repo:{REPO}/{OWNER} {query}', 'per_page': 1, } user_info = fetch(url, params=params) if user_info['items']: user_url = user_info['items'][0]['url'] return fetch(user_url) def fetch_missing_users_details(people: People) -> None: for name, details in people.items(): if details['github'] and details['twitter']: continue user_info = user(github_username=details['github'], fullname=name) if not details['github']: details['github'] = user_info['login'] if not details['twitter']: details['twitter'] = user_info['twitter_username'] def save_awesome_people(people: People) -> None: with DB_FILE.open(mode='w', encoding='utf-8') as fh: json.dump(people, fh, indent=4, sort_keys=True) fh.write("\n") def debug(*args: Any) -> None: if os.getenv('DEBUG') == '1': print(*args) if __name__ == '__main__': ret = 1 try: ret = main(*sys.argv[1:]) except TypeError: ret = 2 print(f''' Fetch contributors to a release. Usage: python {sys.argv[0]} {sys.argv[0]} Example: python {sys.argv[0]} 2.4.0 2.5.0 Define the DEBUG=1 environment variable to enable verbose output. ''') except KeyboardInterrupt: ret = 255 sys.exit(ret) cli-3.2.4/docs/contributors/generate.py000066400000000000000000000021261471121002400201110ustar00rootroot00000000000000""" Generate snippets to copy-paste. """ import sys from jinja2 import Template from fetch import HERE, load_awesome_people TPL_FILE = HERE / 'snippet.jinja2' HTTPIE_TEAM = { 'claudiatd', 'jakubroztocil', 'jkbr', 'isidentical' } BOT_ACCOUNTS = { 'dependabot-sr' } IGNORE_ACCOUNTS = HTTPIE_TEAM | BOT_ACCOUNTS def generate_snippets(release: str) -> str: people = load_awesome_people() contributors = { name: details for name, details in people.items() if details['github'] not in IGNORE_ACCOUNTS and (release in details['committed'] or release in details['reported']) } template = Template(source=TPL_FILE.read_text(encoding='utf-8')) output = template.render(contributors=contributors, release=release) print(output) return 0 if __name__ == '__main__': ret = 1 try: ret = generate_snippets(sys.argv[1]) except (IndexError, TypeError): ret = 2 print(f''' Generate snippets for contributors to a release. Usage: python {sys.argv[0]} {sys.argv[0]} ''') sys.exit(ret) cli-3.2.4/docs/contributors/people.json000066400000000000000000000334011471121002400201240ustar00rootroot00000000000000{ "Aaron Miller": { "committed": [], "github": "aaronhmiller", "reported": [ "3.0.0" ], "twitter": "aaronmiller8" }, "Alexander Bogdanov": { "committed": [], "github": "ab-kily", "reported": [ "3.0.0" ], "twitter": null }, "Almad": { "committed": [ "2.5.0" ], "github": "Almad", "reported": [ "2.6.0", "3.0.0" ], "twitter": "almadcz" }, "Andr\u00e1s Czig\u00e1ny": { "committed": [], "github": "andrascz", "reported": [ "3.0.0" ], "twitter": null }, "Annette Wilson": { "committed": [], "github": "annettejanewilson", "reported": [ "2.6.0", "3.0.0" ], "twitter": null }, "Anton Emelyanov": { "committed": [ "2.5.0" ], "github": "king-menin", "reported": [], "twitter": null }, "Batuhan Taskaya": { "committed": [ "3.0.0", "3.2.0" ], "github": "isidentical", "reported": [ "3.0.0", "3.2.0" ], "twitter": "isidentical" }, "Brad Crittenden": { "committed": [], "github": "bac", "reported": [ "3.0.0" ], "twitter": null }, "Chad": { "committed": [], "github": "cythrawll", "reported": [ "3.0.0" ], "twitter": null }, "D8ger": { "committed": [], "github": "caofanCPU", "reported": [ "2.5.0" ], "twitter": null }, "Dave": { "committed": [ "2.6.0", "3.0.0" ], "github": "davecheney", "reported": [], "twitter": "davecheney" }, "Dawid Ferenczy Rogo\u017ean": { "committed": [], "github": "ferenczy", "reported": [ "2.5.0" ], "twitter": "DawidFerenczy" }, "Ed Rooth": { "committed": [], "github": "sym3tri", "reported": [ "3.0.0" ], "twitter": null }, "Elena Lape": { "committed": [ "2.5.0" ], "github": "elenalape", "reported": [], "twitter": "elena_lape" }, "Ethan Mills": { "committed": [ "3.2.0" ], "github": "ethanmills", "reported": [], "twitter": null }, "Fabio Peruzzo": { "committed": [], "github": "peruzzof", "reported": [ "2.6.0", "3.0.0" ], "twitter": null }, "F\u00fash\u0113ng": { "committed": [], "github": "lienide", "reported": [ "2.5.0" ], "twitter": null }, "Gabriel Cruz": { "committed": [], "github": "gmelodie", "reported": [ "3.0.0" ], "twitter": "gmelodiecruz" }, "Gaurav": { "committed": [ "3.0.0" ], "github": "gkcs", "reported": [], "twitter": null }, "Giampaolo Rodola": { "committed": [], "github": "giampaolo", "reported": [ "2.5.0" ], "twitter": null }, "Greg Myers": { "committed": [ "3.0.0" ], "github": "myersg86", "reported": [], "twitter": null }, "Hugh Williams": { "committed": [], "github": "hughpv", "reported": [ "2.5.0" ], "twitter": null }, "Ilya Sukhanov": { "committed": [ "2.5.0" ], "github": "IlyaSukhanov", "reported": [ "2.5.0" ], "twitter": null }, "Jakub Roztocil": { "committed": [ "2.5.0", "2.6.0", "3.0.0", "3.2.0" ], "github": "jakubroztocil", "reported": [ "2.5.0", "2.6.0", "3.0.0" ], "twitter": "jakubroztocil" }, "Jan Bra\u0161na": { "committed": [ "3.0.0" ], "github": "janbrasna", "reported": [], "twitter": "janbrasna" }, "Jan Verbeek": { "committed": [ "2.5.0" ], "github": "blyxxyz", "reported": [ "3.0.0", "3.2.0" ], "twitter": null }, "Jannik Vieten": { "committed": [ "2.5.0" ], "github": "exploide", "reported": [], "twitter": null }, "Jesper Holmberg": { "committed": [], "github": "strindberg", "reported": [ "3.0.0" ], "twitter": null }, "Kirill Krasnov": { "committed": [], "github": "Kirill", "reported": [ "3.0.0" ], "twitter": null }, "Marcel St\u00f6r": { "committed": [ "2.5.0" ], "github": "marcelstoer", "reported": [], "twitter": "frightanic" }, "Marco Seguri": { "committed": [], "github": "seguri", "reported": [ "3.0.0" ], "twitter": null }, "Mariano Ruiz": { "committed": [], "github": "mrsarm", "reported": [ "2.5.0" ], "twitter": "mrsarm82" }, "Mark Rosenbaum": { "committed": [], "github": "markrosenbaum", "reported": [ "3.0.0" ], "twitter": null }, "Micka\u00ebl Schoentgen": { "committed": [ "2.5.0", "2.6.0", "3.0.0" ], "github": "BoboTiG", "reported": [ "2.5.0", "2.6.0", "3.0.0" ], "twitter": "__tiger222__" }, "Mike DePalatis": { "committed": [], "github": "mivade", "reported": [ "3.0.0" ], "twitter": null }, "Miro Hron\u010dok": { "committed": [ "2.5.0", "2.6.0", "3.0.0" ], "github": "hroncok", "reported": [], "twitter": "hroncok" }, "Mohamed Daahir": { "committed": [], "github": "ducaale", "reported": [ "2.5.0", "3.2.0" ], "twitter": null }, "Nanashi.": { "committed": [], "github": "sevenc-nanashi", "reported": [ "3.0.0" ], "twitter": "sevenc_nanashi" }, "Nicklas Ansman Giertz": { "committed": [], "github": "ansman", "reported": [ "3.2.0" ], "twitter": null }, "Oliver Fish": { "committed": [], "github": "Oliver-Fish", "reported": [ "3.2.0" ], "twitter": null }, "Omer Akram": { "committed": [ "2.6.0", "3.0.0" ], "github": "om26er", "reported": [ "2.6.0", "3.0.0" ], "twitter": "om26er" }, "Patrick Taylor": { "committed": [], "github": "pmeister", "reported": [ "3.0.0" ], "twitter": null }, "Paul Laffitte": { "committed": [], "github": "paullaffitte", "reported": [ "3.0.0" ], "twitter": "plaffitt" }, "Pavel Alexeev aka Pahan-Hubbitus": { "committed": [], "github": "Hubbitus", "reported": [ "2.5.0" ], "twitter": null }, "Roberto L\u00f3pez L\u00f3pez": { "committed": [], "github": "robertolopezlopez", "reported": [ "3.2.0" ], "twitter": null }, "Russell Shurts": { "committed": [], "github": "rshurts", "reported": [ "3.0.0" ], "twitter": null }, "Samuel Marks": { "committed": [], "github": "SamuelMarks", "reported": [ "2.5.0" ], "twitter": null }, "Sebastian Czech": { "committed": [ "3.0.0" ], "github": "sebastianczech", "reported": [], "twitter": "sebaczech" }, "Sullivan SENECHAL": { "committed": [], "github": "soullivaneuh", "reported": [ "2.5.0" ], "twitter": null }, "Thomas Klinger": { "committed": [], "github": "mosesontheweb", "reported": [ "2.5.0" ], "twitter": null }, "Vincent van \u2019t Zand": { "committed": [], "github": "vovtz", "reported": [ "2.6.0", "3.0.0" ], "twitter": null }, "Vivaan Verma": { "committed": [ "3.0.0" ], "github": "doublevcodes", "reported": [], "twitter": "doublevcodes" }, "Vladimir Berkutov": { "committed": [ "3.0.0" ], "github": "dair-targ", "reported": [], "twitter": null }, "Will Rogers": { "committed": [], "github": "wjrogers", "reported": [ "3.0.0" ], "twitter": null }, "Yannic Schneider": { "committed": [], "github": "cynay", "reported": [ "2.5.0" ], "twitter": null }, "a1346054": { "committed": [ "2.5.0" ], "github": "a1346054", "reported": [], "twitter": null }, "arloan": { "committed": [], "github": "arloan", "reported": [ "3.0.0" ], "twitter": null }, "bl-ue": { "committed": [ "2.5.0" ], "github": "FiReBlUe45", "reported": [], "twitter": null }, "blueray453": { "committed": [], "github": "blueray453", "reported": [ "3.0.0" ], "twitter": null }, "claudiatd": { "committed": [ "2.6.0", "3.0.0" ], "github": "claudiatd", "reported": [], "twitter": null }, "coldcoff": { "committed": [], "github": "coldcoff", "reported": [ "3.0.0" ], "twitter": null }, "dependabot[bot]": { "committed": [ "3.2.0" ], "github": "dependabot-sr", "reported": [], "twitter": null }, "dkreeft": { "committed": [ "2.6.0", "3.0.0" ], "github": "dkreeft", "reported": [], "twitter": null }, "greg": { "committed": [ "3.0.0" ], "github": "gregkh", "reported": [], "twitter": null }, "henryhu712": { "committed": [ "2.5.0" ], "github": "henryhu712", "reported": [], "twitter": null }, "hosseingt": { "committed": [ "3.0.0" ], "github": "hosseingt", "reported": [], "twitter": null }, "jakubroztocil": { "committed": [ "2.6.0", "3.0.0" ], "github": "jkbr", "reported": [], "twitter": null }, "josephworks": { "committed": [], "github": "josephworks", "reported": [ "3.0.0" ], "twitter": null }, "jungle-boogie": { "committed": [], "github": "jungle-boogie", "reported": [ "2.5.0" ], "twitter": null }, "luisuimi": { "committed": [], "github": "luisuimi", "reported": [ "3.0.0" ], "twitter": null }, "luzpaz": { "committed": [ "3.2.0" ], "github": "luzpaz", "reported": [], "twitter": null }, "nixbytes": { "committed": [ "2.5.0" ], "github": "nixbytes", "reported": [], "twitter": "linuxbyte3" }, "peterpt": { "committed": [], "github": "peterpt", "reported": [ "3.0.0" ], "twitter": null }, "qiulang": { "committed": [], "github": "qiulang", "reported": [ "2.5.0" ], "twitter": null }, "stonebig": { "committed": [], "github": "stonebig", "reported": [ "3.0.0" ], "twitter": null }, "whodidthis": { "committed": [], "github": "whodidthis", "reported": [ "3.0.0" ], "twitter": null }, "zhaohanqing95": { "committed": [], "github": "zhaohanqing95", "reported": [ "3.2.0" ], "twitter": null }, "zoulja": { "committed": [], "github": "zoulja", "reported": [ "3.0.0" ], "twitter": null }, "zwx00": { "committed": [], "github": "zwx00", "reported": [ "2.5.0" ], "twitter": null }, "\u5d14\u5c0f\u4e8c": { "committed": [], "github": "rogerdehe", "reported": [ "2.6.0", "3.0.0" ], "twitter": null }, "\u9ec4\u6d77": { "committed": [], "github": "hh-in-zhuzhou", "reported": [ "2.6.0", "3.0.0" ], "twitter": null } } cli-3.2.4/docs/contributors/snippet.jinja2000066400000000000000000000010301471121002400205170ustar00rootroot00000000000000 ## Community contributions We’d like to thank these amazing people for their contributions to this release: {% for name, details in contributors.items() -%} - [{{ name }}](https://github.com/{{ details.github }}){{ '' if loop.last else '\n' }} {%- endfor %} We’d like to thank these amazing people for their contributions to HTTPie {{ release }}: {% for name, details in contributors.items() if details.twitter -%} @{{ details.twitter }}{{ '' if loop.last else ', ' }} {%- endfor %} 🥧 cli-3.2.4/docs/httpie-animation.gif000066400000000000000000037656241471121002400171770ustar00rootroot00000000000000GIF89a̙K"*̱Pgm *DFS%Rqs",G+w(G-($Ю! Q&'gg0JwKUKvvYb)T?D1!Δ#.w`̹ D 2L-mffSvriIrl'RfU+ݓm)hwQDIUfonm lsLUfTfUF*׫$/j )ImHMdT-hND#!I(s$EFF̻K& Qݲq͌30'IjJR5+mm$fD*Sg&j;(wyūD݊.}._k2|N"w:GU J=s/̙&7q"Hj3""3U3"""335353333"3!4"5"""DBDDDUUUfff33 D?3UUxwx"8ݙ>UUfe3UUBDD`wxffwwwyDWyweewfUDݙCUD"4UUfw⨻UDYxfDDU""!컪"3wffwVCCDVwf`ffw3"Y<~f|ݺ---! NETSCAPE2.0! XMP DataXMP ~}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)('&%$#"!  !, H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ LG%UQ?3Mʔ ˘3klPӄϠ+1%  'S $ΰc˞Mlf̄ȭsjp`GRNGs:Myz6өӇ:mt =ҧ/~`&0D :Ͽ(xA^H`'}UhvnIoCz |h_~h8 w!( z)L1Za9F)T%!ޏ%*`_: d2bZlMMߙ! c )G(x8!hևaep&袌Τɕfx $`|އhj)=J{~9&J @M@Hk{Hi '=pڢ(/Z dfvs'ޕA"z+Y{Qh4j֨g[n)vP'\v{t\pƫ [;iQ wLJ)0'q V 4l8<@-DmH'L7PG-TWmXg\w`-dmhlp-tmU@{ӷx.n8AT63x?.|U SAw|:袗N꬯5'pBN~=FXsyn<'|nGoo}}K=ޕh(|H>O&g}ܚx@@$H5M ,@ o{^G9w Hab/00$PNx`d8ľջ?iDpCv 6NLa r@*"bMD?9@~H!0ޘaKPC? |_(q@ G=#1nLהX4?LbDa S?J<`^d-vQ$ c=R謚ZyCXJ %r`(E}~ cHQ9Y(kz-w?߁1dJO!0-C7iߊx=N Lb.Ҷ33Mh֐^30(d\gH ` @.UtSHU $1El d$l҉d@޻ `@fjWxԿvܛfǼG&!  k3Mt m'|+S)IO2N.8a^d ;&/B ҏ\PlMj=ǂƚ'l>&s Cq[Pq!|3 C@aԉ|.oB!BARYӲ@-m#3ԭRd@;/! lTN*`_<`Ǯ8)| /)@$R-qewgG*n{?>vܴׄ K^25b=cAꏟαcl" bJ7n*'/+WΧN&@_ ˷-D H42smӣt>mp}ǖc_HmOvN„\x/J܋u Oy-W~"e)ʛjF5%?yN۾I{`yD F>H _Zt"5HDGh0%_}!l#؁*M7|e`mwJ'Fx$2IK(K3Q>XP2pMo Yȥ=7O/xdpMw@"!KFZ~E_Ȃ>֔8cE(?(8Xx蘎긎؎8Xx؏9Yy ِ9Yyّ "9$Y&y(*,ْ.0294Y6y8:<ٓ>@B9DYFyHJLٔNPR9TYVyXZ\ٕ^`b9dYfyhjlٖnpr9tYvyxz|ٗ~9Yy٘9Yyٙ9Yyٚ9Yyٛ9Yyșʹٜ9Yyؙڹٝ9Yy虞깞ٞ9Yyٟ:Zz ڠ:Zzڡ ":$Z&z(*,ڢ.02:4Z6z8:<ڣ>@B:DZFzHJLڤNPR:TZVzXZ\ڥ^`b:dZfzhjlڦnpr:tZvzxz|ڧ~:Zzڨ:Zzک:Zzڪ:Zzګ:ZzȚʺڬ:Zzؚںڭ:Zz蚮꺮ڮ:Zzگ;[{ ۰;[{۱ ";$[&{(*,۲.K!,.`5!,!,!,.`!,.`5!,!,!,.`!,.`5!,!,!,.`!,.`5!,!,!,.`!,.`5!,!,!,.`!,.`5!,!,!,.`!,.`5!,!,!,.`!,.`5!,!,!,.`!,.`5!,.`!,!,.`5!,!,!,.`!,.`5!,!,!,.`!,.`5!,!,!,.`!,*16 ?M V䏠Ç#Jċ1x6ff %5ɒ&'!~iIsEVR@ ~0#-YiA;4㟞 >xs`HNTujUUjI̢߬ Ǐ"zџe $*0܋Nv?3//,HyNזԷWJ~ aZxtƜs/A$z'UIJ}۬C;㍂ %UNPKYaúVQ^~32?0ݼ7֞DKe ԁ^W ?Flx1HSZՇE^%CvhO!by`ыH=4R- gEAEdDEށ8!$`}CL6aU7Ux$8I?TyPifѴCy m9fO{ t-uM'әGf@{jdTW5!؂o$c5 9%jV3kMn9eJ f%kSIvcID*BFF)xزFQIdPeI$nd&A mDu%j^~Ems]E ,eZC]Ryơ& )ՁX$4+Yj_Q2p9\?丘\- >Q j',+c= adC+HfAYw*D 3|DI'a{%Fr"Nmtaodz>Wb'l )UbgNpF6aJкJ1jCTmEX3f}V=_ <=3CaCjpD}}p^?|&&p,V|B-g&&0D`H kR!̗wCr_raԷ'Fϡ"n~ Alw 1Iv1Tw;% {pѓC刂CB U"ymDhJ 'p=3.\ AUO*Ak@:Xևqzh.A`}2A4')$A2GA51x GVF$ Bϡ8ӑ-%hȟBҁ|Io?xBzɨ+ȴH&ITC$S/ lqʾT?~uM=E:E>SIOҼ\pDANs8NZa^O)bKD1q<5e%O/j\Dvz6DxOٸ`.yIdV!,*== HV_Ç #JHCM3TI'@dɎ$?5H {*ػ#Mpꜙ,%Ψ‰MiҧITK*}+T~RPЬ_M 5+d@-ҢuN*p_n ӵoN7)SPDz]ʵݰDj<خڻwN=xD b97dtq'kb+>Yѧ=ڠ'^FdZvL\}'_!gX-vZUQ_x1cY~v܂Mo_TZhGna_ PK3* 00f}6e1( ށW % 0 %"~@V\2P&|Ɨ "]Ae%S)kJlkJhWyP *@3˪D b8Pxnb%:Тߝ #ȒȀHɩ@} iƝwS@/'c3eڊCGD@Ԟ54ɇӊ(fA~*5_8@R,l4P¦a0jN#@4хV6{OYa ? ưulqqYq{] /|MzN@Vs"T4q|M ۡpsA xEK-0rt ͝꺥)&sɑ#7wtˌݦױg͂*ň5[~SԻ.K{XTҜ)ΜŬV"OQY jC$')JRҒɐ>@ (GOq FF3ft'9$ !,e H*T88Qb !,-8: H*\ȰJE/jxƏ CnpB IJ\Y@,cTa5Odr"J3!jr'Ϛ IhPJOD(ψQs6U4%#Of:+S v,ְ .d+RA/*7dFz\bJzAZc [wb8ORZSSX`8UYe7%W薨gJ])UK o j&U\gm EUz0lo.mU5NP@3NnT, %4Dw7md^sa' MR*@V`yDyI"}!p@dV@ANC ΅҉ `s%.$@gRDn4T-5_$a%dTyic@I0)VHe?6E:Cݔ&)\?cO6hK!w+N挍 5?gze^6?9Dk~} ڡ P%ؔ~59"YGP]}@T2 wzgEVG竗\?CihN ,LP%J+?{$ =yA*{ *S!\ZMϧ2 /{iҡHWgNFp0S)@DŽlDhtEwTAI+,?b,$FSO]3AptH /6=Pٕb@!,*U= H*\ȰÇ j8_ŋ1ZcJ|6&Q,2eɑ ="idM6s  `b thѣHMSfA<ڔ*Pb*ժu+Q]cӂ#$g[9KԬ`AժW ^yŒ5{V`%=I2Z&HΩndy8t]rk>$8T6=Zcd(056/NYx0Vvo)TcӣX"30'IeWxMl9bc4 T&Ag[ץwXiaXl%"`+дb5؛djrVXj(tIh0pϧϴ[>a1z_e`Ci<¥CV4M_Zeda9P1yHӐ뒋dײٛ8R*.h ʹCsOUG0Ŝ2ͶDH 6' MVeqa~0<)%L)\LgӜrFԏR)Ҥ2*cV3,Q= 3\Lv&%)/%aD]׸+:H%ޘa /6)Uq;{!?J6r׃X +hK '`}(.nlZTV x4nr~XYo,ٸ[(a}d 5y-dj׎[ +16m)i/Z吇aL U#;y!敠UV.2u6dg$OLT; I3cpP4WE2dAN!9)]\!#F墁CG,nIzeUi?d:+z'u/A{}zfm&@RRBӐ x 1saKC,FiUcPlgĸD/F&ٵTR&"MUVH}-~^~=Mה(c90[݌a* jwE+ׄoOz"6smr׻JrgQ]dglzsM C洮-1Jƒ+( C=ʱLD#G&T1U4ArM('9$P~|=VH*3!,*T= H*$XI`C#:ŋ' Ǐ 1JJ Tr˖0?= I"5{*PO= 5'OB=1өO騴kJ3JVjԣ^NTp߾JWn\[;ݺ QGQ5p jcX"5pS |wn&Ui˔f"`1̰f~  WL{U@Ij3:df47j+oٜe7q+xq Fu̎~hCU# 4,c=&Yy]x8 -v6 ~ßy@ӟAUɃ⍘$.wa+ L1ϜHI8ӨrJ棧8":ͣN3 /.HY]~J %@NxN;J4x2 (ndb. $J8P*HzrӪۢHX'| B!R 4̴ԾҀFgucꦹecyu"Ty}hn*C/ͫRyCijNQY.ְD̟x|y'h{9Яs8Uw㙟AX'%u`B"58XqC#[AM)\Q%HJB@yϯg0ɸP~+b R H*,Xi`C# |ŋ!J8QD CܨS%T˕'?D)&#*ػSg w~*hN{Fl*`FOH= Xj=qť` VUT[Ӣ5[ǰp')kZZӚ6.PKx]m5dӲY ֋߁$Kd 2رQ 9T 'l)[z>1J|5+ ax 6Npɏ@6  U:͍r U X-hbȚN V+AA9#R26HL&MokB&m@3e/a#As0\B 4p7 S܃YE25I+ Vc9%3L>2_6 " M e&:ӄ9왳|0Ppzj =i@(x*Թz#MJeJFx j fC.6IBZ!,!,!,*y@ H*\o`# |@0j1 CHQ?4=L9˗/I͓fTIA%~*(ѣ0\ӧ4ٳWj wfŪ+ת(eJ6$Գ7+ D۶nOĝ {F4 ߙf}ƒ݆˷1¿5ͨ˕/gf:̘OƼdCVȝXׯKƔ uÉ&^<^Pk]X+/M_^y+ԸN\yyGYH< DMQ[z!4V(hga晖_H5B\xc& [́L! PRPI-! ff_v!]A#HRZ*5 iu4B?ŞQO+t.[]$a APNMWTRB :'ucF I Rc@y %S?4 &U(63*ˡ6t! 8?#LCI8F+JC(Lb,Ӟ(H4Px+ XFeZ*ew?<[KQBI<*K폙dۋJӌ>ʿ@,qU >ڛie:,%YǦΞ.'?X$0ɧ+T8"JNaL0;03 q,)M`|ݣ@32-,fS[+ ![z[H+S)(b@(㍃2 ']ix#=K+LR+o.`hnSjsǂzw8Y A zRC|Rtϫ2 /`3 DJ?O2 'ȌaH;d)8A??3X?$h@*(95ˀ2TZb<"J`#?Џt*,BF+͈>o ?&;dI-yB+Z?d&pE$^ W6!Pv'h 9I&Pc#*!CǐgHfka\>D.CkƑ^TU @%2pJ浞DPOOb/x2UB bSfTE4W (pZj2rFEn 7&SJB3ë+8eUf^2K΍sHj;fxR!:ڇXRJANf!hP ) QnTEwyl|1S bO=ib9r84zC@1^$3S?Б͚ _EF=#Jpf֒0> Pq2 Wc8T ס)õEkEvK,E`FnUhoI;ƁԔ̠.9ԟD\Tg)kb4%TQ&܁d Ch^d4skÙ=\h=U9 {$gA?5P @ijX,$H1/C5JHy[L P3ь[.4 'èU"'ñKi.B%@Tg?4Qd P<J*T..3(JV˜͙ӜPpwϬ ݾW )%㔍̡Ж{ CO47*GMQ ɒ%I5QsgOoDȓ`Ր02'ǃGvkrB^ѝTj۾o mT(bW3Yx޹;)VWB,F8 ㅋӹ9gkF_֩7cĪzRA&9R:;z H8uf¶"K;')fV ڠB Qϗ\ru$HQ\ǐ?_BV( -Fc&Q[>wWGs bM97HYp!)GSMQiX6?@b8Ti?UfbP%晕LEqb(ws!!,!,!,2*7 8PS%*\P#.<(DM3jȱcC dEiˁ(Vx"I%OgȔf&Ay,Z#; dQRJ=xpACR( !ҭR]NXagI+2WhI8hDnuiFUduk\:fV ݄>-7mZ×+s@C g؎(М;J&ԝR-7Χ[N|8ckk A4wb|M#JͳXmҨcG̞R]UvB[ mE7`w>9֗D wqdVFϩ!qVph4wYrzX{!6Ճ$~B饑kUZvAd?BDZf#Qb %Е3eedH-dY&d~tf%TbAd&{ŽG!,2*7 8П?*\P`#.$bŇ3jȱ#G=w"dEM+iˁ$ ,A*I<1$4;>ɒ%I5QsgOoDȓ`Ր02'ǃGvkrB^ѝTj۾o mT(bW3Yx޹;)VWB,F8 ㅋӹ9gkF_֩7cĪzRA&9R:;z H8uf¶"K;')fV ڠB Qϗ\ru$HQ\ǐ?_BV( -Fc&Q[>wWGs bM97HYp!)GSMQiX6?@b8Ti?UfbP%晕LEqb(ws!!,!,!,2*7 8PS%*\P#.<(DM3jȱcC dEiˁ(Vx"I%OgȔf&Ay,Z#; dQRJ=xpACR( !ҭR]NXagI+2WhI8hDnuiFUduk\:fV ݄>-7mZ×+s@C g؎(М;J&ԝR-7Χ[N|8ckk A4wb|M#JͳXmҨcG̞R]UvB[ mE7`w>9֗D wqdVFϩ!qVph4wYrzX{!6Ճ$~B饑kUZvAd?BDZf#Qb %Е3eedH-dY&d~tf%TbAd&{ŽG!,!,++< H*\ȰÇ#J(q?5aȱǏ C9q?$S\ɲK^ʜI͆3nɳG{'8PJ>*] СJ5:uMLj݊)`=p יL"=@FFWl"$AۿWP^务C5J7*Vb1gzbB^8itûtxw1FB2=X9+(M'\<5qoFFAM_bU8aK~Z7ӊBzLweŒ ߵB2U\KkaARi-dkF%yA)Xu40*!G 4'EOlVd-fBe%ɀ,1Hu %Ɛ&M78>MX@𸔖-y8Pd`x]SC$JLR+:阕w'eQB\`@(wt&-t@cِ cAz@JIh +,*bF^q&o*_MO8 trLϐFG$KW"u\뒯7()' G Ͻ)5ظ=eAmdBA RTKJl$Ji&EdU+C1fqJGksCiAE\UfA&N4N3!63A5#ן`B+Lʌ iBD['+[)!TP,^ؒ:+H@& lD$̖j=FD\Mx6Dc՞_)幦RP >Y\hr?TyM?8d_ GO jJ/3TګO8LtC+56v0E=_@#fu;h9Ud&!Hѧ~׹U@8n!WL ҀJ\·G )2Ǝ@ zyń12BrmE49 ^!94 b~XI آc fSLAR$=B>ʏ$yDҞ2ETA7m-!;DkED6hoe|FBN!o%( DTr@DRuW."zŶ1im)Cbd0C ;x!*Kf9I.UAPBYӘC$(,!E  MˀJG8Cp:1]ӓdq+D-ֹ.v9͠@ F+)@ @iOR|/1K ӨFQC%x*H%x8N+HӠz׻:4%kD XT @fC2N"',(Ӭhyr(]&Ȥ+FP(U^nƖ&L"T@ A.r;61t̆;Z /HSCL7/5/^$ !,*@ H*\Р?EĆ3j1aā;IIIR L@J/˙8aԔϟ>M J6#FE)SMF}#3@eݪ+ׯ^AQ#J?jbQ˖ZjΛq$]Xݫ lew׭È w!G8'1V"g)Io{MC8 rf ZojX+G󁲉N!9PO. 9pg=Yd㍱lPώq}ӎ[fϋjɩ_gFyơ'`bݥaUfځٖu1_(݅(a-!zic *E߅Ј$2emǡvau$3sa]9j$ fLb@?[eagރIYY~YT’cPD  QtOejTNI`oM+H336+Rr %bAfXߔxdP%@0k @b ([pXey?:PċC,9YjuR!c-"3=S@A姭 4B/^ԲX̕iz 0QlL Krm $Zkh§(>(:dSD0%M@-x?"J61kAp gqq Tf%8eD/)\tN$A<@'o_!%e^5d RT?VK5ؼXUΟ̌#S.e :1zO8b5#PKwxtѡ4"S=.Ż*&UIxRW XVU5J ",x! +By`ڔd0ciqDqxlmn3_\Ʋ"1*A;$q$>HRϘH!k2ir=0E/Edm8DE#ɊEkW0Q~"Z"W i qAp@G#0yH[sKTk\LUնk~U h@ b!JV|f)l,kS`zzkH?$9ЩH~1҇h:/Gu&1q@Dp$6q@!,*@ H*\ȰCF7ć3jq +iHdF(S\ɲ$ >URP ?6q޼3'<'JT`ˣHUΠgN+Du ujS{w*3"WIò|0) 8۶k㲭`d׻'EYi=g ~-Zv*^w/YӾKmdX/|޲-WLZ SwthcBfոNpiٲg˭ 7IˢU-aimk69Rjњ-׮[ox9mϣy|ׁG˟.U^y'^~JvvZ% JAl taJYX!}k^SІs(t%(B%%#A(]t' p1TE 9PTB7L( y屘bhPtJ'*?$?@I8ӄ*k ciDI'dI+*(8Y@8kRbbj]rNc`=p9,<@C+^)LJŪ)8 Bg s_Mh.*(dbmvغfD 4;(^+K$( * ae@ԥ(2["d+DZy% 6H3ɡ? V@1UN؟f=P -3(8s8cZ&]QqBAnfi?}Pq#P;M g$2A" {DOVik.XᨂnM?wvw7߸ $)ߜûd71 }i3u={v9LūdDpi uc\ H0Ubnsr_.%jHHq eZZIpa6M"4r-+T@@ nsBo!c\(z%@A@UNC)DTS.=D)ԧ1qO@ԙL:jBS/E5Ce}z%'MC a3R5 JOr;%Pb-r@@ C2 [2K?3~\ @e6\dQg֖vT-='\0yHCNyr %ԹN x\ P8ņn[$ZƚhMQgI8F钢qFtz )BH$GbMmzPz! H*\Ȑ?T.V8A{@V¿;&Q1iHWnY^^'lӳeWhj6gå n3Az篣o. Xdዻr&Lդպsf qY%žcФs[7:&[}ݗd-EYked_q~Oa^z] PWc [j)V\'&C&?OL5meMD~oC*Hu5IPlZ?Qw]{ͷwHxفeaHrV%f IBAhU|hcymߗyz>XVSEQHYFPj6g[%j $sAx؞:PPjҧ!,*!> H*\Ȑ$*)MbE-jTi 6Ugo'+ܱ'PHN|0 NĩS翞9wDH@Vpt6}$xs`BA *$UVٳ`D[n]+RW[m֖XN&ŷԧLTNbp'RGU xAAr N+Yj*D@!,*@ H*\П@ J|Ȱ@0j1#Ï C$ȒV4˗0)IM)l> JtOc*]zS٫0B;V^u+ F.;ٛ@Yp-۶'}K=#, yJ3Lx`]IWpkr[(g˸sCf_|tfn!hfT|6ɚq ƫסeg&]Ӽ}츶GkF{̝>4ڦU>6{S1{Ǽ:mJ?\f٣& qma~vz!ȟ%6uE!gEaIp5^-}XӑaA*`H}2@*Vx-@ a4S9p?XpE`~-$ksJLSA]/gB$*N *_7%wW~4@n2+rƓʩli$ s#PL*IAs&27ɂ&}'ؘ@:$ËI p3h>"~ !ZM6VV;~d` h$-T?֤,bx) =PˏXB%lp%|IŸk鍈Z&G84 t 30,< 乴Sw׋vYJ?鯞>ɺ>I%p A-zM (.(!ZYpN,m4pJxO!`?ʆRܚQRNZBrY*bV> `a@Ȣ\_P`FD|?Ne8QA!jȖ1D @?4^~YZ<` 6C$.!>JՎvA±H)A2!?6B$tGpIR9AG5bL zՊ]I# V?\ۘs2M:OJ K&5i֑.6CEO1'?ZIM 4&.42eCPx zDWэnN/G(UIS!,)/-8 H   !JE/jtq`ņ 1ԘcljQVh"H3~lQ+a,ipbϏ$R`D5!Rb8 'ӡUX=rQFiT EJ2nP;12%{v&EŋЫՐBe8hӄ6Kp۞e YY܋En_"e{64ѥ(G4Q2uMen 3Ugô:- Zj7- ]J/NR3YhXҔ%wB?cwU%$? N ^JZ'p:6`WN}tOhU֚y [}F\9hdߋk5REq VsW~Y7ubd_M8cNIZtلW\|icu]YGOqHTFT \TcKxg74ZHy9[ C.\hA+4@je Wʊ&hRA*_l%!,!,/q8 H*\ȰÁ'TxHŋ㿈 ɓ( FHK/SʜicD0E%͟@5]JAOW3´ɣ9J55҉}XgF;%?r ]JE]WRYM*#j%4[KL!C@3?TOs)v}$#-؊}?"(0)?dZOuvy;*V{%dehMdT7neJ ŝr V Б'r4\ϗy&ۍؕC-X&v *P@)htѷЈB@Ύ\IXh}*@ 'cay&C:PYQ%T3@ eifO?i&[-ӟ<*>0.e"dCH2םd{.Zi]*rġoQF__nA ̮%jXd T1NeItBY1Dc$?+ 22C5t/G&!{䀘)Nƺ-)xFl(ocӜgLgeę'$|V1d cO%G\d`Q$AEQF@)հ }Zh?4x/ݮ$zH%{BuSH5FV$*Orϔ *uw 4A($*sJ3(8G'Bϴ_;1KRP:Y"L1sֶp*UM D$, ױ<8^*qM_ `NM>J0P'm 'i>P\?%=IX sɜ>H =E1>dE7StfP,J!L\#guJҢfQFʯA,Y?\')|15Bol\ns6NIM BY$0tJ8h7<0q,P8azXǂI Rwg@ID_Q< &^ÜޅHGe}8Ѕl;NQuގ!,L*'@ H*\ȰÇ#JHEfF/Iɓ(S4A?0cʜIfIM)l{ OG\ʴӘJJ*ػSW]j+Y#OӪ]շp>@NͫD߾{V@۶2*ǐK]#^"̹sŠ 4ཨųװ NǧU yxeʼ֭oУ3%i)oSReQ׋9"6~ ]wiVAk6Ae~w af`UWfsUMjfޙ(t(NU`z#>7½ṵZe"2 Zg5JU^`"d{Of Td2$SdRxYfZf GMvU% g `*6I%'S&~Pr*)*"J\)L0prI]:? >д2)\OL gv{aY8 0U0 %LN():I~(%$sXU "@f'>tQ@ LQj[^hiox0E!Ь O2ɭRv\+e@9[ T2SBKVޒst+@ U;;T=@pѿU->?=I%O;M@%@RMH\U+(1?3vܿ.Gx@ڒI$ ?.4{ M$ˤ]o.OI84 q˽b<]zD@D%JhzYOSo;+}c [0qW0jeꕌOlsZ ݲӗ/H ILv+yO ָ/p׬&ql|qF%gTN$&31gcxYÉp6'$|^FCJ 16HdLG&&!BTrzX27)X'?L`{#g6 DLL|R`4pS JhKc~*b٫5FW0>Ǣ2-VåpdY%]:Tl`HWQd(PB[J:ks2rJ8+#WVR>J< @)gid 2fhq:&Ǹ1 -N fg Il\ !kb ,rG. ƕgfVs| S܌\{KGfQ939Vm*r9.USE6xhI:znz *ABRXDw1ȯl4[=ъ@(edIElu RD?參-L$˪i,l1Jۯ5?Av{޾>*#I▮Ak,ȹ5g)Fa-J f v!J F}#t0]5Ȫkn|e#ئ@~[^D/z-bx!LCZx@orxbCScH_@2J^!,D K'*\Ȱ*%(h0#G0> ٬$QX_Lq"I!,*t= H*\Ȱa%EĆ3jܘpJ8IdCI|RPI/]œ)槈&slH͞ ?+T#ТH`ΧP% DժVOd݊ {FBFҌWѪM*SdjllZ o߰rs47}_e*VcfT@2~1 gvzkbΟS| Y~on iSqڎ櫛_=2n<0룭bA.]y.we;7^˱QǦ{w7_yQUR%4x@T' ЃIƞqLs+ `B)1'xqjcJ14  =Pu_qť"@  ,O?4dV>8JHsN:Y`q) 4瓈2.a@y(( sᄳ%,A@ @ {>Ш}IH)q7֦kW7WjȜ_fN!A*Q :(FIZ߼:)o;d65"[[󿸤H t @BB A:t- eh d%Qxb sLDM86FH+.`cèJ$g*\& @L:I0pű 79PRg\qmJ8lgVXnVU0яžg0ƿ8" .h B2OWr'bWHx_>Őc"IgB%355\&zč/ DG 5ﲧrteNMjzԨ OysURmdI&S\Iȏ0caB w*ԙsϛ=(98t)O6eZ@#j]XiFթO T鉡Y-ɫٷM㖝Ti,i8.\rŻa ռvvTcTzYɉ/7vqg}G)[W-lV–v5+y@tw̶\k2n<=Κ;]cN˜D6LXR J _LR PK hC1Ȩ2(` b f^`M3JP4Ls 0p)r?U7n'$Bɑ#^"p,C)3<`%4D!`yG R 0dZ%0\!u6uDJm@-P+"M̰HRr) ryF$3ᄣJ.5 f8 *$g3ifg9d&Sz$g *"ʒ ezUm]4Z˒5kCrt $D:%>Pn+8]b ׅ?c+D1plxJ.\<䧞gjP5h&%"z&`>|*t䇂)]mM ^h--ƌn+~P;L/+ZNLA͊Hmd~-<h@$^6\{= 0S2%SgZ6PBEŽh2ObƆ4_da)LYjLB4?>8U}9Imމ?mgND:iτ$Fs.d\ﳯ}ldݖ`0k㦵'0B(%"%5-5rU F8@xħ$R@),^#dOJJ Jp AVc[ 6>-E7,3N#QE26"JU0,.KUڛ6 Meg2,ƍ'!Y9Z(-/F^ ; 3}0)酷 f7%]A/6y.-#j'_)ka2eZ@D DcHԎ蔖F9 [?Y= 4 D#L*`!yHh<<8gA򕪸*'pbdܘh7@pcܢA*A FMԥ:U'KB_XȪVUbu#TG~AF:!,!,!,{*L= H&F7ċjȑ5uIǓ(S\ɟO *)&̚8o4•@WVBI͞ G+TҦP"`gɠXV ^K6mJ3*+lݻvR:ҭIᯇU߬p*F2T^}ohPMqE,rijrc&3ʦLYک7J%^q4^ÖQk֍ij۸ c b6 /PρRb0{*4}.8 gMRħxཷ%A =18_,J'E&saB,В$L#۲}9І,%ϣ ~"dA9y$p׭?w>6ٟ[C4&c(ʯ,H( w-}gs+6q.~P"r{pck>j(v5F TK'irӲH;̶+ʨ@Ӵ}7ׄWJ,`:Vr@NJ;?ޗՠdPWU4unܾ ;S9i6H%TAWP:I*¡ Nc%lGWj'$O *|40",d!HDjPE,PzyE ,]E#R8Ht2nÔ+R,f9qEt,rQ19ˋ9r'wKImXV8fFDٰ#ʅX8TN7`k$5qy:U@^%Q% $A!HxdIDˏƑ3YRwX1iF6212x u9XKO)"&kt((qg,?Zfrj@a%3WT~ $g4q A (F/QjENE҄JWcKwq΢S4?]TN_:!,{E  Hp RJ0@ 'mH p!I\ ?Z"@`Vz@k*&ix F(ϟ@ JN|YD5i`ʂS5N(dUQN=!Qr1QhU!,*\@ H*\诒@ JȰŋi C2TP [%&\yO/!q={ػS!gO>jD&ͣ  @'Bz*UO+kJ35+ٲR@=6}6j]uwƝvKVe"iqFtVZdzұO<'UBD mƽ|貙#`@)SDaD0,hڤm[Zn:uLk/>ﶥ8Z'JRd +C G҉C%_B.B.4 mr3 WhoNNy pL7BQB l{!5Q"iNd)"B]lކsS"ll~aR`tM5iQD%]lT )FEB"]ے@ "kNB92Z @*1 P$ :!ؾ0԰LCahbbO㖺@5=v$&aO \(u^%K %W 68{-m+> 4 9 ,m29)^+YX(Fg\ْAdX`+1 P9 >rHgiHD'J jH:hШ|Ҍ6@( ʝyb8Rq7ҩի_eZPhfHQ6Fv4L,e#hի2!q[q`E#,+M'4;$E%+klH*q-T@ EjSՊᵩehG/hQnw[;ęp[F91nc -}tۖ"$ !,!,!,*E@ H*\ȰÇ#JHʼnfƅ7ȓ(/\ɲ˗0c 5ɳϟ@2IѣH)lN>JuO#jʵׅIÊD͞ w*Mv۶pJݻ-EZi',xˆO3ǐL3ys FtFMtPʔ5@׬]cش۸Wf_g M@٠E^Μ.͋j[as㈱q}>]_[=??Q6(P6IT(0+_j3z%݀G 4H$6% ˃7p梋f(CUrD1(dPQ6$*{Q'u,RY{4F( 56+QN8r"b=KJ(!Ifn>Bd9'BD8˗E$bhV囈> 3D?CAA>r)d8&)ߨjf0 *\D@8x jXvš`]]$ 0%b@qi+*^evf1"knNBAQ9^D@8 ~TR %[Ԯ=9Dd߹3" D%8,1rOğhчrZҌ3*8à Ҵ_7~JW22͐`]F)L4@T@zk0S3#R+L/ybk>K4⤪Lf#7%Iʲ"%ZO@ FS&i2 xSrŌ81K!gl*A+kq33+r?Čn CfOS2Mޓ‹nJ."B9rzv?pS! W;Z 8QiŪ+‡6 C["ց+(f,5%ʅweW7I(TG#86t{xP6?&Mv}+G29 7J)L9JyPkcz!γĐvN$u 'VdwyTQ'#QHKaaoI_܊S'YtoJ1|r U7m"[i[d W;%躞WV&!D$RpE\ZWd9*E*)j s'2CIi#d݂I\[|R:E\)H܅YHQx/iOwHF%DZú/JcƆ>{YIdMCW;.LJx.`J9f[$fb2"!w80%i|]*DFHE:TڐVM$j`ڒ%Nšd۴/!|(ߞ r}/(kʤX(Ag(W*-(Z 4XoC{dUVyXw|LZwr'"Av P#u\o~-bҟ|Vl0ˆ>%]܈_Y yZT!vϛqڈ>JZ6}m\LZ~ƘCXaq=\Ene?K䄣!|qife]XÅt/$m`"Ei܁?0#j§GqX2uWvRfQ:cb{QG3&eL[}ZAl<;Q9pY oxaZHOTP)JB!? xXM7ܗgwV51h1Q4sGpsh8= Á ،D1b 阎؎7JRM( Shy K2e9)Yڸɐ "9$!!,!,!,!,*> H*\П@ J|HJ11#Ï CDq`ɑ+IR&0c4鯦͛8sޔS%~*(ѣɴiAP NktomY)Բ9PFc@֪(\otXŝ/vOw:Nb̫)z?Nx>}S%}+Ȃ2ɪA@Xc$(ZMSOƣE ޡ+ח)OR=|yoGKll7AE5Q1Xa02Ď19V2X!D# 0V'x# h.L{ ("rM 6J|+:/MkKlLs"Hd#H;g 5& tlv dȅ2;Bc;&A[LDi!]4= C H6ƀST &w8X Ώbȵ)A( 䌅<`ĸ qhl^ UüqG&+"抰("մǃuJ[e\CȔ)Hmi'hŧj2>q3dI*Ʉxʁ(99{1S<)rS5pmN>oW٬`(Q+se,w+N!YLV**85S T q0 @?ǚE6 UBP%6H ̀=>-)ݤd+/c|PaAckDdؚc>C xFn^L$2HBjadj)S8WD*fA\L"d1U2ĭ"LE*Wΐ hd%)DIR*6&:m VKޥ e S1n"^Q &02oNhJ6@D 8?ErX# #!i&f0\BWPq1SM2m$*KtAcCL1h_.{/C4A:x\I NKgE2!,!,*{> H*\H߿J!>Hŋ3jϡ7IrdG>UzR˗,c>r͚8YgIja'ѡF*Mʴf|ıٮCw9jPq-깛v] ^ъmz26 _h?r,)04jÄݽ2_/y5[,=!w6M2P觐zb{ŁFqhU6 ԏ=]XᕦT^@pb'ŷ܊T]Bl?#A wƁ"SݧP8V]U@"ǙEcE%U-2#"hȭ"V@S948f^w&oYʐS~!P7ʙ]^6]]ۢ!@68CI8 #<@'~YAwex}8$P+dÐkAP%JƉW޹b **ϼ8$ @9I{ǍLؕ$׾+P%8y?'3q,Z U% ?J.ebo kLU[Q!#њ|?0n19 'c)ϐ\/={UV0^|Gf*M_Fmk䴳)H+;%]w&< sF#lmCe-5i-bOۢ "9@WoYV)K% 6%NΔnv_hy)Fg*o3^0F>bޜ{a vQ#;)Q,}BF7I Kҧ~ilrLrRw?]]GH=܃H1CծXLSP8-!䂧up v VQfbU@Q;? h(,|Y#(2$HyUOl&Yr+K:Ʒؐ|bF t@^Q!2fC,lj+c,C Xw~U\pR1O[?(C"gF'ry 70 j/ 8D(F=lhM +-L.aFNɒ<`Y¡ >yF*ׄ0o@XNDݣD8(3*_^BfW ]y[Uibyo|+֗ U.kXkx F!,*u> H*TO`#.XI`3Z8Ǐ =Pɓ(Svɲ˗0)l6qsOU J,5QgB @uժN+uѯ.+̀zhӞU[Y#&5nw̺mv߾'Kخ]*V1ƏpL"5̙̀cL>wkגI|ؽ>*@ ?*!T9RQvMZl;V]̩i nxswˇUI)(r9^]ciY\Ub@ጳDUR 3Sufk{qPx2N?WAL(:-̄:hb(gn @ E"$p95Y]ґXVb&W$?D9BpaIKP ߭֙FͩJ!C-W' !P sB$1VX |bC1*2Ԭ*pBDP2P1(4@,w @=HMφ(Y $ 23S|r`RHMpBM+RC xL HxJ<@C)#*{NingҝR( +OaL %1B52 |Hxw"^[bP8\Yq@91ݪ@3,ҘgwɔptIYg&x2IV*Mcz\w ,Л++u.nU&-Ϥ2{t vKCۨXՐ?>[((M54R w jz+BPtö6%)r{# hLAydQtĝkB fb !29U{\ %&(1 6`JFty@dݍcqݩ|(x8@8`$vcCHbt U#VkqAQ:K8D"6 pG.(Ѕ )An9Y8tW$^"1Y`Fcu#CɢH2=1 D0S9Sʐ:|4hɋdA"U)zj/lVJR@H(6*Q P&b! H@,<5+dO q^zGFo <4*`ի R%q0,DKF3 Ui3P %{Thc8^c4lafr! $f$D̝@a92<@l5cAt (@vFx ~<7pHVL\d:$(pW^V⨘d m|p,x!a5P$9 ;t:CJ-ebA5ObD)XRr(J?,Plm!R5% ֆh9Qr+PJIJ;@ƱhPn8+Y8mӠ VIm7lvbڞa?@TU H URҟ@KógЌ0BW\y4=[۔OUIŮ~繽Ihp,!Z4 N #Cfl1;6:D: +,R z8CθEn$Eqjl8,R)SA+4Jj\K qWHFgbfgnucR1MuHVv})B뗤~"_w]^*0*1lbʌ"Iju3u$&5l6h@r>؞mC -zۛt?nIL>51p#n , >g5'x39!,/*9 H jCX>H񟦊8QPbF `G";9"9VƛRX3aHMSP.\a%@4)IFJĠ?u $џh}DRC&) A9trUƙ$s- ds{zb)JviSa&Be<,ʐd ]T(F:l@!, Q* H`"4ȰÇN@pO8!ܺrνcģٿ" Yi[qU[#+K8xp#ݜfX"O]Pbe34]͙ IX4ڵZ{v͡e 'h;ax*׽v",pn߬= 7v*Sŷd$'bU\~ )46yjA7*ރda}!AOz"Mڍ+@-#(qj(҇L# cV$ҙ攑R"K6bA w%J!VE%XI1ȥkpg^L/R ?*vZ#x8Yr?P'-@0"?@8Ϧ%s&X_j,% T&)PtjR-%ݚFKWA"k"J*P@Ȗkn1)Tr?0NeY+dyJ. ̭ b6go ց%dwċ Çb(BJ.|"Ы ⩛*9@-_d@WsɯO&33m[bA((`.6ʫpOҮS5܆]f^ʧ}hA+%G&$u ?K3N+cv,AziGT?+ lŚfiIr-.)o`%`DЙ-9[ 3cAH@hҭU.sѧG`RLc-(o>/S϶;0,I]6ywMAO!.T5I&h}9>Q*f0ɬT{B2B-' 䎡(1!Y⨲|2 O0Q\1 k8HRNvjqL 2 L:ͯY=!al4xza.PIq$CΠ8|%c HEJySi H) h@w;F8%h0Zz%LՊxnKԨg*$0)b¡ h4 d+HEnR GH'hT@"O5:I$l dma#4hW8yZ͖OۡV ^,]*3H1^E^##eyv3$zyFI2%HƥJI< jZ+^gMûm2!$AxtV!hq /z3҆8fԊ55*"LgLZB&!TbHɤ7_$^@MԬU2)>嘢̐ԩǩxy19UvXl{Ohz3Hy[iU$d*ь(b(9^ɑԪV=gIBNZY*_BȣYUj j VⷹpYsOTQB4L%d'yc&-2=-g׳yh}@BB᫄'k;`όm ?Qb6n0 0{ \E ‚#n^2Yf(׻Ĕ•C2B`QL^ISMN0ro&w!FP10Pnr&cF$ML1?_XrsabU9Y4!,!,!,*{= H*\(@ JlȰŋ3f#GC1bOSɒ*2oܩgNH Y5PF]ʴPXՋuԪXj:oW1:XcMjZ9LݹxD-G_+.-031ǎ#?+&@{>QOTe1qJ0q2ԨRq]HMO3-q#(fh<DDRR{wE#j% &ZI(c`(Ӂ0(U\)px&-MN zjq Ec2΅l dZ+##)4rZ t)Z;GF\DQM4A7 BSm ͉A -i Bl)eKgvoEgU+SWȚ^A?:W0@Et0,tY(3fp_)BgʐpK[]&nWX,:D54KLZOC6h x+ a7BDa9̇E.fUHa={yL|N!,*y> H*\Ȱ!J!E3jȱ4- idǓ(_˗,9ӥOĶ?}IH*]:S5{@SV0FêdJ 'NP˖ڷi᮵gD݅e*X\˭z#ׯܷFvlD.4SӌN}0X1՜gɏGŲ껬[+/oy/uKo#]3a7+@))wȜkv{mb{wc.m*/\%da)T gБG oVhm0+ . R|Q8_}`rXlNX[B H*\ȰÇ#JHŋ3jȱǏ ȓ(M$?0[I͛8sɳϐ<(`т&HӧPJJUBjʵ?M*)M6g͢]V'.ʝKݻxzW z \`Å=#MJLVj`b-z ӦIW]H\̰c˞M͸+ͰӤS 'ݻudȓ+_'͝ {4q}Wr';թ_O7d˟OӁcg? ,'}yq5XjfVhBhUڃM{hfn r؟" Zw(hȩUt-pفDid}:vv:i)TJy Ic`)fGWnbqߓ8p)QZ){Xܐrm" JgVKyZF*)u(wt}9駠Z /$m]M⏪ZI !i2G #'HK23?%jVT@ 6ӌ .'f?,@rk * @@84BP3P OJ20T"(Ya] iQ%Œ 1Ԫvq4BɡPDf6`BS>'8]&+ KaC$Wį$CJPVZ8Rrp(^{!Ɉ J r THV$4*HW ̸/jgjn ؝c]jEa&|M- "J$&*G* P&A HNWZ S#>L%%Hʏx8a&:ոbl#*RT4k7Ӗ.)&s@ʱ̫b5 *kb vuw(A >rtf`0Ʒ 4Dk29?FlA܂Xk.Mōw9?虷gx_J7 2{ŖeI.1K즗]5dǦI@mzE XŌs+wK(޸(Ì$͑ n{yfZpJf¶4pݎ /p0Z@%_FC'xы!]0F}#%3c9k7gqS=7]zARATuZڑ;F@xP1,`Ce&Je@*P7 |qNȟNw$9K8ԞŸ8t)D ivϼ@noQf7yk':T3˱IsGz=g{vұ`s?4\f9 U# fK&bqfdBC sC y9OR%1T@ ~XS{LA 4}ULqDJDDL1"8W!,!,L*Z= H*\ȰÇ#JHŋ3jȱǏ -odI&S\ɲ˗0cʜI͛+iΟ@ JѣH jD$9u*p >5:0ת`ٳhӪ]KZąK.],pQK ^} L'+^̸1Zb`{Qɺ>]X'4~49 ubpSMUu0-}rST X8ԐRlIM*=]xaҨϵ`ՕxS)*VieD7_R MxK`ԜL֌/~Gt=#M{ao-pGJLJ(B I-r 갘W*+`;&%Ob*JjP# (ST-u2 $[,M˲H;K>(2R(?WNsp, '$.GՎr| iRd#(I:ӈ~u珡yψd H*LO`#.X1^̨qǏ {R4\ɲ‘0cʜIJ '6@{ ѥQ5*D͞ ؃XVjѯ9c gӢMvKػ0+ͨ_ ۵axj{ZKWÉxϑT(|n|,~-6}Z ؂'=Z-k'{ϏCW 𚋍CL_|tt %+5Ty>kW~21vz\n'\Jh}[v 2t$LBV%xPQ#?PɌ0M2#2ǗUu2 U|R64 R?L38@Hgxj0%Pr?$$bG$@+*SI/+8p w9djWʝf8ʋc,w)m;y*~3 /̰"NgaW?o¦h3 Ο楥RB 6SBYdv;4I-$(-d #ji3R "q 4NT?ʦK* $KCD f2L+VRKk2L4@Sy㘢aGAk~Txh*"D)RO.T2 8J>>P wR2N+g18$G&ݒP ,I2ISȹP=2`Q? 6=NO2.3wHw{J_CgK 2Vj feGh`RāJx_غ>HR&0&AH%a+P@gBhPbj $ӬGb $:HWp P%Xʠ{9` JF5/kbDǦ0Lub:"B4e /wZ$"ȥ5bg! N"jk|$=lf4)GJJdS?ղ.%A^n`_wHJtJsǐ/4Y]W ;D@4jʁPeFu5WMG1[a/Ce(J d:,5cAib[φ0n&SLWOtzT&i,ך_FjS*̟o]*ϿsJiהr,Y@ {tbYr3A6jtYO-ZvKZm*۱MW(]Y,AiljI5Zլ3vť_ց8{_$76_Sx˦0\Y5T }xqw_M?Y eZM@bfM6(`jdl %UWXZ PWU_VUEK4@觜Zوјar* ؖz:U2?=TE&fL&rt$Z[:i+]'dSikz_iަrbF䅓6x`i*IfxWlf6*p?X[i)Aý$,N85W@8@bD[T[T5B=bFXBEW%E=ಋ*k+!,a * H🦂N_%O?1>Î !,7,p< H*\P?aD3ZذǏ JhB;*?0M IMN@ >JO>w|XiS4<ڳ?WwbݪTӯ_&zֳd]KTiXl|\޵0È'TZ֬dž#wzڟ !S>5g:p1/Fk녍 %Gj6ןnt౉ZuY Gԫ+;9p[>1\٦F.t:szaP`*~ [LB_o55}xGSw[֔*LP~ J(_'f"C``UM5@fpy@~(NQJ_\病 F$XH} M +p?5byG%4A6(Q"P65e"Pi~Y$qv)fhHtc? (1rW>ZЖYx8 1 3E X˹# M($*QIkHeb, Ͷ۩4ZQcd&YJk Ɠs@j[P\C~~ؚkS@Ij]C!W<Ѐ /A+ @]Q6'q]9]wm?眢i*Xs@ 4AF@.%b?@9d&,z N*G,H3 hQ2? /Bu[rKBU&|") ?$3y"cEBvǾ$@x=RM5yi"jAa?UMMQP<TA;ә&b1ۈ'>N}Wg=PH>PJ1摍+.4qC[sGdGW2Kt?N`$4&r7ˍd 'VFڴG6tALP[{G< 1-?~?SJ͂MP_jG'cY{^ a$ҀYv, EQ 9"HF>߽!T, N?  4`SȤK;hAY GNd~g8$DgJuґq"^D܋ "؍d1@Mc"ÇTU8T`x4Z;/DP@(1Ō)3ۉE2K$t[C&!F6DXBċ ݧa+٤!Dc>?/2؉̆#2., :$G ռ4D7iOj"ZÈIm䣧Sv5ŽIQ9s9yC;I/!^4gA(a#52UʔĊB(CF(ֿBP/g?*Z%,H K +d6U} ZrѝAgшE1s\jQ/^ E[QZOB B`mAbX%as4Yx4 u $TeB<;+ml\MèJ/@"(b$h5FZ ~3({>m=>K]DaQkȡ =9xe7$u|̰|3w]PՈ:|~$TeHDRxK`=*:n ji ǵΰ&cQ<# P$ I%A jPV2ejl`hJe RBc5C*'ygozW-!ѠHZg&;jhz`n$M/#K}rxJ+8/_jkvވOuLS#u[4(+&ɭ=S+ MLO\ݜ>*+4F \з9ծi-ҭż6>Ah|mo%S/-?/Si$(0=CBz/YpG@ӔO!  RYo|)o`kpP(M-$u/ebr+ X&p߄= ADt8 X/@щFtA 1ZG"_yxd$YB9S&ā21>qUIH6US(19)Z#,#C2? Y!d$QJ(%3It>I1;=*P;ҕ|,WKVV`F()w9͠'&I L0a|ŧ 2nr%4ɛH1Nez3h&9IMR:ѩauM%OuL'4ˀ:2m0׉oV }FcOt(EђVff?U\fԤ0 CY~$iLwsԝ?11ӢMS:>M0 R|XKGTԘ ͪXQԫV5!VtJ )<ֺqjUCz_(ZJQcJD W󪉍lTXRf2PpիfGv]ugXIڞ,h[K[Ա-,fY+lD(aߙY:#=-cֵ>ljTblJ:]S/zbZ\z;&7l߅kpgsݮPI\; )jq;W>n ;X02I`W5.yqa>k _;8AM2[l8n:Kc— r_WdG8"2|Z41;SV*]kNYCEٯ`a7XZo,dZ6rֳqq 6Xt1|+fD}^nM.OUr)]2T '9sWkL5:g}Ρzֳ[JPbCM`{6=ZMmML>#h'o-rNw]܀!,HD{ 8߿*\oÇ#JHŋ:aug ξO/hBϿ?rQԚT? ^c5#If9hQ oU5zB($&8f v]BO%hŅX <@)DiH&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6rSs T& T馓B鈝ei!P%`@v@!Ы$Ɏ[b9|{`񪰔M,M }Bг8M@H"m)`K$)$ìILs)In?ï1'U ;P+HC@ Q lP%@?ȢK0@0? I-ж@@|xr3X70SK4I-L3@bOVOi3C<AP#qF tͪ@sEs@@NO?L`MQ-4k@\ҫ}G{IK.FTAu!SBbmv2 Y0֍RzQNiC '>D;V>4JO-l tX8DM(C6cqZ&'>4cp?lPidt@hmh٦"HQNЗklHt082'K0(nLjP]J8ʴhP bGJEl!!F,$ Q(3 jExF=\/ I7/w:'8L?hL k2ALR #@ G>$H9"O@p3x Iȇ];bC_$E4ϱADf$Wَ Q60I%\2n&2at+U ,+.^U=  .x@B!^_pCEn ƚG.ZċL)H.J݂*i%(Tųb{o @ Zk뤪dc\?8GQ2X|wL}^u 2%[3}36|ЃI pIs:L#cYL6 "^0u$.r<w-Ő0o" w} P6$ DOgEEdefa0-o2ep: #tk$k<0`YنwsJ`_XE`4֑;]1_d%#a},;,Q H(VfW v$#$[16qn'IPwcA=% S12 hD&qYquAp c qFx3QHe5wi)xI@XΧ }Ep|c1$z!{1o4ה7%9?eh8#)sY#5! U76 cG.ZC`W~ K271; h^fOӚH6G`c/dxQ"A6gaPY q8mУ8?#"7s0 хT!"32it†;Eu11 0J*r [*p_vs:uʑGe\`'nbgR?!g ؙe3bm2=W QsIu9ETHǖ9lzd zT?ƥ+yN~*! ԣxr`Wzmezpr 71p%nQQs q->)T5luf;ynXF7h#`^*h)S ba늈!J alps kJqqUdL5p d"<Z Ju@WɮTY;@WmבH AU2_F@1I1~dWa\o2IC]Naje)8h>]gQ yuCg|I(2n3e!Sh yz WaAacڄ njAI`YsƠHڦ1lxjs6 c3qOj: wۅm 0= , E[or !+A9`g[*yʶCa1K27C:2wvBH70skЖ9xjIWY16647f~k@:-rB,3q^zD<95YD0#1 v zd6cƠWvwb$ׁ;q +uaה:D|MGJ#{@1:&0lѲlcy0E2f Wkl[F8I˾so\ѳO sFQЏznnAxud\# #0k!qwlȴ{bTI˅kI;RÒQ|ApGã|$q!Lxś})k5ʶB3<*΃x>XGjHvە9z 44Mf\%Uȟˁc;K$j^B:A-$6qyΣM2GSp޳1 ?EU1d^FK |[Q _kL쳒U]$f -\84i)ٓj%C*P(Lk^ _0ؕnnӕE59׆21:b+T`hy̷A`ٸUyXxeoHnF<ժX,稗[n8b?i@h_=9ہHYm  JW`AE ?^%N*h *QիSA '* ߫qfbͶOOUO>L",H)%hG"[#Pvl"^j{JEDP6BRU~ɢ@rXOYYPY_j⠖N 'Q>6k(r1-OT & );?Q!&"Rg 0lĂ7HTLpB{rEN9K<9%nhp2ȡ4D6R2wO)jTʪRpVjN ..2H42 #O(4GH(1i~!fs&1$G0}!9 JjӅ^%2-h=(!>T]T:c賸҂E*jTN L9͌(MC gB-2j ļT oۚ P :g ‰Le=mc[7gZo;Ҿuoٳ'Bm\ g8Ov@pg\}.lpxM~HQrǜ%pcSZ;繹K=rv!q{~tzަ6C$]SWvUrR\/սuU.? ]k1AkC{[-~w:ǺN]onF'|^|#wg^Hzܛ'}UK]7}]V{N_y_{ܯwPJ?/=':?l~Gx|=B'9i }g_)Ԅ8r#' ryYv~k{AyQtzs?@>a6k!@t=[==6k@ $9`C@3 ;+Ah<A<:ϫ>֣9nC?;>AӶ 9?<©>@Z:CB([C(£37۫@>, CsA>xA1LÓ8{:A51t5|c9C<49lC(< r#5<rDE<;CEDsB>q9LDN6jR7=0DSTcBZ;EW5}+B@WETC/*C"DCZE_|[ƒ+REdT38x6B#dF8_P 4wm@j G'"Gs,G(Gt<ZGq|G P. 8&M G1MP}Ȩ1Jȃ<\H !, n (P2L#:Hŋ3jȱǏ CIɓ(S\Qӄ0-P" MDM $, JѣH*]ʔh ̄IJ&N 8L0tҢFGgӷpʝKݻJ5IӇL`xpfh3O:(Pc!:̹ϠCv8߿?\ bKaAlL ]DI N%M:u'X![6b c%Dn4#O7=o`IRP3z(h n'h g1{GP%AuY׃[Uށ ($^{)AQh}j&Y`8& !?wu`H@G!P3TdDOheB hyI( oq$eExY,O4E@!)ZΊ$e+x9 geJ>Y BtC(9JEITsdL67bZY@@J”y-HJW# >f|)l `ֱwdBUqNyK$DZ^ռG82JQp*.*N2x ^'-9pJiIF}}]<D]:J#Q  OJ$CU'}pMJX\(hEȃ<``*\:0uQxP0Gg: MqwkRڻ})ć4uE Ũ*4YXT9b8w@[>!pKŸ.mxc눲FSѯf4λP/b:#{_!'\(4B%lD'H, >MtXut\չ1-Q2Rb UHd4ND(B!Ɲi1+ rA;!6TWΉN`Et gMYj 'PHd;d! f\+ąeFH}7 )NvYQ=fZgK;U8F(tR(Z 9 ]TNu#!:aO7yJUcI5R_Q_H *KrŠN229ůXF}0)qD=nI~;& (Y@8 1rPZ79*'n'tn@sS )PH8~@1X:{?^1KJ[5 m$@jM6XQEM Yv 0 J )ȉ] &:) ]KfY+&A[ J]iĪ=[#EA嫞5xOB( ⛒+ʵXŭުbK"Tխ.)d 인Ȋd  xG UUJ|=ձEuǃ<+dHU<3<59&Fu*6 EXMXps|MFNAm |@p ~p @|=|@` JF~Sdz=9͡ j+dRIu <tK@& :X>@AP<,Y;#,_f ]]ORX#@A7UpMR8}6*DJD*YP8C?LqwvTz{C|`30;9˓Q0XƨSEoNG,m7 a* m,u}^#@]ݐ>ԸԘ@rq4 K[]YxZLDPZW j8ʡ 5 ׊!|}*K5} j qSt fH NDɠkCU@0 >c[9 z T>2`24K jH\\^EԽ/M@H*VQ@/ ,5AH43OV" Y{$!]뇽<*;ƏCevŵEAӸfZ-y0aZU>y\ $X rU(jyR* 5n- @$Y$T#y $8@TE^90ObPUO$A|@AptҤFmP5lkXX\LفXhP8l%+ՂA ` X'JU7G.LeWB57pJ>ֆSUׄ&!5x 5ڀ ЦάϖE:`X#i&Asz4AXIӖȬ^=I둘TdopkԘJ '#*d()$2pDKL$łW)A%(Ъbz% Zm1a 9{:pW^i8§VTpٍÈp +H&Zh˄ F>As&,3 5V# J8x+j{hPp ;9R c=3h$JKl4,u84XAWBD6P$J8#Þmg %잽2u #9ĀwGz^HԘ" 9my+'A(R 9MiJX"|\%Aъz A:"0=U $S̰^.P4HZTȅ+ CB_b TT*s9PK@Q.J9mi~-K}S"$~j ȆP RJ9*IH)rhT&EF RBs&a ~j5lj;tECVhS0L$V).KdWB t,ыBԸ;I?R$Af_ǎx\̲X ^8rUVzS|LA'50 =h2x1#UB$'%JPF.!p dT(9QS͛Z5śނ7Auyb z44GhQ792I3Lw " m+rL"5H0t[Bk +)+d< |z?,FÃd@FX\AQH21yd81J,T7dDE |31oq x #aJ f@JΓG<☇SoN+[5Uק2a5̬!!R^+*J)qq8Yo5SwԳZ`C ȽoBv*bH0Xlqhcpੁ&8 V%MX b*?Cʿx`:P2|CZ`p@ 8BD*Eʿ+x0*bI8D@PIr "Ӏ3*!g JIvS$Y@T_ pK$?qL৊-謬Y@UXMԀPXLR1y,KT)Bx 8ҷtJQpTP$ni@H4\g@óy#l+ڔR%T^BqT(qZT^YXt^꜐J<phYSdpʈ0N^貟T8fX(zxBNdL4^ I@al^#N^P?#N^ p P$HkP^ O(E]f PRQ8;hPSH!St#xti-Oll ^&QD)W2S ӄ=(}2о7 TCM4H}pL POzADTAEQұMF}UHչ9`|BOLiShUsIh`%%V:XU7lTXRQ4`5^,8!inIOH`[ x-k5 A ڡ73Z=sY].}-%̓/ J]=ک<0Iץh–[JbV@@۵[(:*MhZS6[OERU\ȍI(=ٚ Ê\\e[ V![C9|X0]]]]޽7Ts޽Y<\v1Ym^}^EZJ=!,iI'^ Z޲MW;_0d0GDAVu_mޥ#__[W(X. bhfPdhc J`ЭIx0>aNaFaxP^V]}aCNa0.sa]H~;b".b#>"a&n[';+>,b,b-b&(%b2.c3>c` 7~c8c9v1Fcd&HcFndGnb?ncB6dJ.d:d1~dMdN>c?dC>J7:N;dU^eV^5fI.eK&CFVe\ePQ&:Teb.fc6Wnc-CeANa>fifj+^QdS:Vjfp JfPvfs6gvnjflAfhvg{g|V5Vmfy&e[gigYnff&fnher^mdmt^haFPhniFgfQniNii~ii=鄶ijsSfNj[isd^j)^fFjjĦ>h>j>kFk~k 랞ijk.劎nl屮eul^lkflɞ(Zlvll~l.Nm6IiՎ.ijlgm^jl>{fynmSm~.mlVnжnhnmNnm&onv^ofjjn.n>p'6>pepUNo pM6fkpl?2mFq'cVptq'~mqWem/ryc%7r'?_* r*r+r,;' \j=2's33Os4_sr8_R[Ms;;s<čs?_:`A'B?? !, l ORA ePL2AtHŋ3jȱǏ CIɓ(S\ɲJ&Y cjpQ$Q0ѥѣH*]ʴӧP'D'JTjPTXP#JLBA!:hʝKݻxuiN>jf&2-X,aqYQ % Cet̹ϠC7:J b7Q2L*[mܢ Nq}C^^8=d^uDMHËOQw2Pk鱣`&{(U†WA_tIe~Gv$gZƠI7 t߅ۡN, h8v#^{!|A!BxY96P&Ii$u󩱠?DDeahFMp uRؗMeYe "1f lj衈b4Xal``8IhDFe_j})FJ@4jA+Q২˙+N馪LiL,C~*ʦfجI"(e.+k,l' 7G,Wlgw ,$l(,0,4l8<+a&&e" jR' @]L]QQ[]5Օ\jFak=ò(UM eo̳8JO`TMu5?@~`G ~x k䍒& 7>2QArP-A(7% N O]N{1@.I1C{R%G%E8Oc(|ҼG[SSBJ}7!~&{ w@zgx)Ant)S<GVO xFO<y Ѐ4؊Oְz%P0C$ x\K*up< W|ӎD)*+ p P$1!`HOB,&6y ,})ĝ:*%qZŀ:d$CU%A@*fƒ;ьe T)PVb RfVĈy UNy@%@ pm G}M5iH0̶!0$/@ ?# I08+Zˎ=`!PNkC@.a‹xc1j?v~afU0tbPL>9kb3 DQNX+O=145N£JHD:C#!WgM>+xPSY p2ɋ+Bҧ_E8I3SImc[;*@@dF9I< HJ<8ȹXMYyk#ɸŴMP9{6キ/b;C0@K* Py}*g@ [ܟ.M#`ۮ{͋P,TVT|1 gnOxƱaSp0NY9%o3fDsS ㏇^`|E B  {w i@̠z?i*@I @kPȶ^CLv>D j%bgv? 1 u>I*MY6ix8 u GC @T PuJ _OFw 0 W4E6*MeyIDA SYp DSb Άy{sz\EEFfXK͠uRPs rOwXx5蕥8O@% e*~$"'ZB%Ў1K}|w ׆6 ͘VА؛ΐiǗ* *`iQO* [*zE nx`t 4@ )2 @ F;5wuX  j'sv ]KTs` x\Ņ71-bZy"f Y w@ $Zxzt ,yp} ~{gcE>Q EE_ a[$Ip< `@ zJpi6Е9&K@̰F`FW?3*c d)!vytOsAqqp~  Z hN` u Ft y v 0 YB+I\430;CP1L9GI~Z w$.&^xd"a22O : Yە V ]2NPet1Rڇl$Y Wl`&ISTEZ`WP ~UahYtlP#LkኪG*WaDymㆿTJWSa oBО6D SAVu8W`0땼psֆ> 4LG3b8cwjzTG ZW~$DA` @'WYOp0RcabZg7 pwߺ$CXHPbyl{]L@TFJ`_9{͊F ~ LE~p!~]GZi`yNf eulõPW FVL5= ?jۮ*0W H G' p 60 ifY :>8!W9Pcwz~V;rJ(RɶpjENU : U}U E+g'y 98Gp401 5]Ie|Z{\}P?IS _D_{YpXl\ipJt >AWmzzce>!(HCV͠qu'dLrl(|Xhz ϣ 0< ?P@pFϦ ΕCۿ 1HfgUH˺ 'V?\HξܵY%y p yz|k5^ ~Źd/ RE(W`2nBI^Q[?*фcą| {c!*zĕ yqmx(̛ 4lI*XW؛O4=`lO' m RM?s;k{ʴ?oph3'p6ch$HH!ayqZ T \VbSx BHdL\ '@W&@l' IBh\xYJy;FyYۿ 7i IGEޒptX+t0宮}̐Ž.jf္Z,mܞ j}Ϸq=JWT}vl0PK$t6j k.dಗ(PfT1HtD=u{49{@A`- ] o_m#FVEY `̆VaZ|B% SLR~19#!Hhyþ%^Ip6GVI3Af` PıJ @̪ڮS;YoK(7ŬWSŲ-ܞN0E- ¥|d"@V "emqI.:ɿ FTZFr֚qx 8Qvq89ǔh2p钾>;@`uUi AdxcOW"Vm־|:}N[00h gbʥ( .dؐOΜ:5E)Z<է&@J$tu(@h xMpXӦJ40 :YNBC+UZyߤ# W(  ɊҬM~ՈU8F2e5D`ВPS oO+@XDETM+ԬVd!\8铁b%NL3gkuP@!f`~UCXr*P4HOz1h@Ų[0>Uy`x^]S:!` C64WȴP=4ȈA4S%(hkh+d \ꂐZ WxA9DW6VԀ? %Tz!H$$H^rlyCX*YTҩvZ*p*)Wt0i0^:P,,x)+x`Tsr\ȋV:EVfqJZ;Kx5H;L->)'3˚J`f9 7j J\qY PS!dDZnA&m^sn p?/5930MB j}=xDBqbXԧ8w9K 1^ '7lns%0fP…gb,*D#CE\f# i"q0; q[{j"jY}.? Y+{H4 !)Vq ;Eʍ + ɀ"ChQhO ђgc%@*YZ^2xM .PU65-bm!+^&qu hR n^! 1K2X+LI %yȑ2QZh2* HKSupЀ #,?iQn rhFa|b9tjלd,Cw{@S=$+"!D 1w AqMBc&QODߊZ*$[JR8O -H9~! /y_ohY]W ) Ɗ0{=< KMȂĴ" kNuza"ClPq-(GfSH#ӠDT֤xc*-q) v\yNq  ܘdEu#C@ iw0HpK!j=b `G|g]eJ:m{EkB TG4[\4WYh_[,ϡQ%@ ZGu~3+pzO̙3.q cU(9ε4X^LV&MaL@>𺀱L1(y6lG KV-ȍ%",IiRJcoqG(S$`YVxJTwB-/fL$b a d#0Z؄CFC`|XTpGlmi)ghjL@L+9m}!ftW$ AMu[+]> vDJQQK[xa'8SXWU@54WYIFqS%X *ʳ5[j=&`P@ buзcqGi:Öl%HwZ\7|zsaUFv`QVF ۫*R9U0+ㄷQ߬?ZGaRt r=%XdLF 3aqp,1!.u:f)m{Jbxehn(Q}}1,Z8w#NއE*'ȥSǮ YaR{$xŅQb.0k]uP+7O@М#:eszJ-|PQ7`/@#5oܽC2@UtPN"P3.;赞*rP ? ~+W vJ+K\*fg!8::O'(C: ۂP[sF9*: ̷%jlP=AA8";~ސ=V!dpIأaĢ7#騣seIC?MwԜ6@0Rj0k 'p(gpXN|;R;ZZ:8El,(7SʅO,=EyR=dpiĝ;Fg*$ːZYisi<A8k/Y|kQFPyz\djd ³-d8[9TY8;fi04FS1g۩I5!aePf`F>QP8CL64 ?n 5M IXSPQyW pNJ`i. ZiX.K:,+~ b++8sFdCТe,+n"dJcJأ i:(t.[WDž. KA`(s \~3FS2%~&̢ZcT S%R,DZ̀M4{nj2Z/< LH8HɒJ/rhC?~IX(QcHD UÐ{JjRi(x71Kl-I:!KGhbK On5 oK\NUTdH @}JcḰh`Lrc\.C PǠ--H<;18y7 gPY0i :RwGYB"M(Bi" ; ¿lrl[fy4ھ4cpP)*QP˗ON`0JO#}? ǑYY#TS-k[&(q;X@!J"U%/"(UjaS;j-K3rRTN9NTC ҧh xg}VŨ> PάDž VbSҔ1#=7אVaaZ3Ի= 2 5Y8xy$pEFeL {bL(C:[=]U޳Q z M_x._ ϣ FZ I;՘ _~E`>ZW`+r ^ . ?5jG*Q+?U9/&XZ}I(j̸&.^b]Y* i .ڰU2(*I+9~7tcA^?ʺ#dE"%G2(YEcd"/O{j8Tp؃eA-:XC%@-bN͟Vn(b/1E6YfaDN봞V~D*F߲(fidixP?bbfs>gtx[t&e(~YFY#`-;Cc2ghxvlhC0ik>E<,/\vhhBŘ;hN-0|ЀdNKf͒~iޯS9eiVrd0(YbzQHqT8TjjjjjƆhM l3F^rk~gHH{ k뻮zX[ *ڜ6lJy`;;8ʾl lnl>=mf ʞm̖mڎm]mmn`پmm~~.mnn6NFnmnov>o>َ ~oo~^n6oFooiMHFn_popnnnwvp p Og6(p o /q?Jo׎pfm oq/a#mOoGnq r!9Gp#pw!_r&#Go'&r+rprݎ+r0Gq76fo%s5_sVm*gs:s&s9Os;s@,'s3.@OtEg'?8?3EtJApJtO_2LO9tTOuzvs-ROrWuY[s8/u qZu^WdVu\O^vb_<sMS/vfo+rd'Cugvk/wt'\kvktn?p_vp?wtPOQWvoOwx_mrDw|cu]wA'um>xFQrsOxy/tv^nx(/yT_-GVxoy@`u/wyOuvW/yg&5p&GnwozEHzv*yo2gy/Gy>W gzofBvy x({opouv?M'|ŗo7t~'ŏ|F{4|nV||^|җnf};ҏ}ք#ܷ}ܿ}T}g{(:?**/e~jMxE~'~oN!, b XIRP‡2M$ŋ3jȱǏ CIɓ(S\ɲK*7sB%D!FI J#LϗH*]ʴӧPJ uX;a0b(S,hЃ'MC6LJݻx˗N 4ABQX,aqQD= ̭!C| $ SϠCM鋚& s!v8J8D)/xȓ+_.p_֬;-P$m7^LmGљӫ_Rѧ'](H'h _ǚ|qmփ$$o]Fgv &)(wac`Y B(l(8f(NXц'J,̘!(TV %FǕaQ0xu @(@VpWɝfUB 9/NPada6iƤYB^ 8aWŘɚtΚ 骬*ejz:Ŗ)W(&Ĺ*$r,( B(s.ɱ1$Zdv+k,l' 7G,Wlgw ,$l(,0,4l8ll9ų@ 5)0F1 R%D_@OK=/iR'@ f _8[P6hC`'ɢyUe`w@F mw& `QT'x#ń'1m柔zLQUb3\G pQZI Ҩ,( 080 (H- MA J*@*N;DD$k̐ZK<H x. 1#JG*IP#1 >6J2cH4A\|2fhBd)Rq SدJh H(\ 8QnC/kZR2qdh 5#H @G* CP hX-N>|H CaCY܋yG,F@DA` Sw,xE2Pg84ZqÎx 83>ñ8QrGHE14 V"& |[QCCl>y@DQN7TyNh1)] @82v@)(1V0##0)qd˜ 8f' PiΐhZ pBK>CN5&;}N |r%,I4@OLG8+ ^c9 - C*%;V} jEcJ%Yq"PE*lPeiV:[F(8 ٻ^"F c(3^KmPk |8a} R-}d0^]VP/ g4aMbB^y77>eUt<'wp>C=TiP~) #Fxa'Q ??uhd\e OI @ tvX!b fGhywG 0 V8  xf Tjpwax @zqY  D VU7U  im<`iw Q6|uw p 3%M Uj *G4fGH Yx  rCwp 0 批zou, 0f!XzH>4=Ip^|7xw Wz*B &H _fM=P d Vw&Lp{ 6`oP8 FXwegyw ד6u3`PdD'q`W4<:`wwwxGx 0G Uww F\#Yӈx<q@jHeh|Ty RQ xWSempX|8 g|FH |ϸ o(dxHV9yH1w o9ku ǣ9 pyah'>1IG ?qamh=UFS~dؕ0Tɍr(T PfnVCΐ'H>}qPӗwxwGL'AeSv4H TC IV\ Khw v `k* xt|x e8 =YfQmHPfXf^xnO uj`B&0 "&M4 &<RQKÇ x =Ďp Dc 8|X9 MYG~wD~rY Ÿk@Cq ǎ)_% `_R6Gݓt`M}lv;fHIt3GyDNq<_wGm:~xiHNn:7~GB@d=x#;|E`ݥ {@@7@zS hCXAРW! ЏzbMY%_Hj (B:@AP p:f*U8y!ڒ &T<&eiq:AMiRͰ sz7IwhBB$  2j`rIffp:eۧLYn^9j_qph ֤h@~m^'5Y  t `m׆tydt=Ж>t^G#D?g9 D‰>X@\[d9"ypc\VwOаB`aP+sa  Q P*] d+j tv|PI2Flu8% (`*}iN G`^jVٲpUmpg5>TIcUD#>t5~dfdS 1;He@4eW1: (IKUnKIr*tFHj;l*E}E?;9@`C*Zg XF |\Tp gPjZ>d[jJuPe]X ~q(V,VLSQJsU O]  JćVhQx9V}=mHd^e B CrPp[Q/TG۰l^lĖ9>TYmktGS b 6pmGY,Ⳉ7P kNJ_ ocIl,I9OC6NZ9oBF` 0 =W`vbޡaoy IaU .df NiϐK3ʼʬf PΪBje(ZI ƈ~Ww|8|Av^xLhZdf$ZmCȽ{B9?U4ܤeԢ^tX_7ȝQǭ՛feos1aPvM?>&=u:IU5'"N싨 ?3 s; k 6;)PP;M EV PyJϵմs 9bA`t(罪t>vmrl!aDH 9{N1 Td1p6*6s)YWOQA(T܄Z]jaђG8YUB9Zvz{Lj ,FxvhvHgyYKև V#V}.negGG黢=0UH'UNRIMwbѓŮ4N*Уj>Mgt $l.Eh$_j}qHmUr4Z&ư2},?=_SC1L#ZAM?B:jX>ĶQH_NN@˒UzmDt Sc>6aݳ-kU^OeFjn9Cu:6.XF4E{h2_P(+J>D4WHA} DV^[}:Z P@A=ϫAK=WJlR0 :ڥ]-<' s* n*c[Qmu Tvw䱕+?$Ҥ=[d|Q0AIMӡycѣ<':`+A.d8jA&U^iQ*pfiJzCX/TIʲ#9Z!I*T>sqGsF&A 6b^B!RXQ!&&QJ襘:j%PCTD #9F <O<-)s$: apS."L#j %PR+?- +`@)I*!T͎i!$ 2B5 5 H0 64+tV@ȍ6[۲ܐKUJ ΛND=jآ<Ͷ$M3/NܛvIlpdhI%i@|0JfA|,SUrZb 0 /bm4WR$&PzFRw5$ UbM+Pz Ch#ltۓ/R0B/.Pdg(:CNyEBFCF|dlR?WY,A,d/l9, Lb"[i oz)4NyV(46$7J0 xP,rR YX)\2uniQ[2e:֭W'A'=q) WLS lJ9ubLe*IlҘX~ G/cʖ<qK{@  &fP cp_& X(eE:EÀ!UMZX2.ƜJ"~G.x8DE2 sJ)(,X$Jt)]nb7YK0Eg[![C{ؠ+[OOŸpOz*^1*xl|xkrY4#1¤pO&i:ὡYAR}5)mlgV5̏~- @5gL'l^Y4+zɽjk׏ԙu#/2Ћ1׾^SxL9N0UpOly>C,gYABv@mOD2RbE dٔH)I/ ͦY0H[thS㚂 *@KJKPMlAƾ3/Fnv[ ]Ϙo_9nPjE!xJЖiT[4}2Qߴѽz87ftԨCNǞ VZxxɃA0)ږV+C@ rHJm$8S/<19?)2 #?Tžx@I]ԣq( s<[,ơtgh(g)%1+iHLBA!Cg*GaZ;)ZafАi;%:TJmiA(y))Lq+B!ɿ@02g8D/C[6lI7쥃. " V X4 ېC|ÊD(+A[TPj2?H1*(ǟ9'ҜU"%ѩ0%h?*蘏77eJH  2@XQ /!WP< {rƄ/ 2a՗;KeҝisE գ5!9X`m;iS 0Wr-׈Dt#0@3P P'П)+UP>ϴ!3x6s0̉=KA";D*J}p{a@?вT582X۩f}VaB U Qc{YB~Y)s`}7)ZLXW=ܬ&I]a [\ax]xډ z[,>ꀬ]ܐVؤI^[d8u^ܾؒ^-eT: hqT{dp K^X;fafbfc&`_]![fZap׮chf<MЂ fofpgoyl>gt.ّ*tn:ք 8yyg|g}&0Hpghh&; VhNFh&hhh1P{Vhzii>gNi^iH葞i0miingxi頶zViNjf&i&꒎~饮j-ih|騾ijkᦆ袾~&~kki&ik6갖kkkj{6jINlkiF>~Ůl˶~vlk&lFk>Nmjyn՞mNƶFm.mNF>n~~l6NnPnj}lnnkݎ.og>oo]n&no.fp׶k.poNfojvp Lo~npTl{gq_/&o'oqq6qnNq!O wqop%n ¾ir-n.mj$r1o*pf s57>sVp^s9sz.9jGsAm"q}AOtq6NsEt&"#7gIfN_pM.fnuT.j<8OuXgmsnÎu\gWu`i*uS`?v^uwlPGvgo.uicvkOiR/j>voh.q脮o_քzxwywz H(gw}fMHwr}OKjPlxxDowxdžO@x?6KMxaxnyyyyyyy?!,O O%B`#JHŋ3jȱǏ CIɓ(3NX DQJ7a!L8aʟ@ JѣH* i3! rXp&I!!:&-]˶۷pʝKr%o>t@QPpLWchL6JL˘jsNS blukB|fM۸3O` % Q"2N:(\Gomسkν;Ŧ!|{]U(IQz$_տMwWnG$jrAsч 'Vh!F+`'"s@`k(u,"wMSM@LB.MB:H$Nץi衈$MYcS)DjTZ)T 訤JM!CTMҤi,j뭸I%MWD0Qe#`$[&6F+Vkfv+k覫+k,l' 7G,ŻfOY: _L3qH PSr{<+)݌sG(P ?- @PGaDC (:OM 1`@k$dx51@sJ%`#'Tm5F%Mw vTI{]I('^oe`A~D _@JRHw {( ,B2RUJ/ (ЭxF s]6 ;фcHbs{l}$OzM Ȝ p޻G4N0" H/r7mp+|;^]NO00x+G8< |2@B$ }NJ) ԁ#E*[`6 pb#[^ "8a#^GA$oHzA5"x=sCptv_,pxx rqhdw }R?TG`P1`:;aw <%襉9 k~1j s2L"Co#@Ii u$\QC4C*ÙYw."`E/F ]VQb@%ˑTjeh$~Ў[R|)qNQCbA@9f8 o"~y+jQ d@' `~ %* rIa4qN?K6,X4 ~Xy gp 0D'f莎4#h 1e" ,'2) M [%EV h(S{g}ѱaL"4Ҩk$輢`za۫ (h?s" 7Qu99əpα8Uma'B aBkלn-nqDo"su1(;2KdāםyK.8׽IZ ;@4zjr4(zQDÇGh#bE3@0<Ng;BAa&t(20֛R]`QuqA# o$q*7nnsp׭d|?<Ȳxp z̋b2wyf,c]]k5K> }]iA3 `8@rpqۜn>\sK uBa7$J sQAiOK*h@+Yֳh PTAlWpF3O~ f}|C0a SגP_++{gp7B7ј6:љe{y h7 EUrWv)]Ms/;&/i@H2y4(xA_ol=H>x?2?aZX.sܲ1TUKb4eS]U:T 0kBnpEHf >w d3v  lNd`J.Նwl7Xv$~ a lY;LSd()gv fmWpTôcY{%Gm=W&8uvw _7ml*0vPfSxVvQ'nF;v&v^6n\&C S>`U xm}WIwUE+Cla & C,eIv  PGnxّ͐X[,` gSIx VF·SEwe 4 HVCTWRcU$KUJ4h6@|c@mbB\G XFfJ%0cGyef:t; OXeePYZ5Eb4d$E X9TX@c NUWZW:dFԖFuK pZGt: {ufصiNV5@SXVvZǤxr oFtipGQU+_p6919=!pB `5HH0I: pC]$apHuWyTNNsm l4A CPeD5 qȷ~6_ w$HB5j' R\i { y 0kU4 >T:U;=b.RR/H"V% M}[y:ߤif,K 뜰PﶣA{PvU$ 6pa%7I-O܉+KڔO+Q+AEطtOۊV^P0|X;a&͡?5Y&A+rdt>|idX[XXJ̉K  jeC_K5t$Du|Ǘsa:C&UhE~ӕZ]ؾ4;vKcG̉K+oc=bDK{Xnb;?X5#tuG|VčΝ6C18%$>S{8l9ܱ -w`VSnH %LN]S,I5Dk;dk~[Dg_^ݻe窦{ ؇ %`OT8 r]$DbtXv+Y!O]f>&PzS< ]ΥS(WE!֮CKʳJ~Jl^ +ŶYżRBc@8=VNBpS95AC 0@Ƭ2^DAZŐPJj*q$Ud J2,'/휒 '*HtRR%W,2g͖UOPLyio [ ĽڨoT Re$VMlj0 Pm~T4gFTu׺ifrgЖ^Fs~ vnƂCrS~v˚C>>g- tb^÷m<[կ }.yΧ/~0`X)(GMz=!B TIj/5p> SYH rgq(gf1  * ZI% z Yf&WBa I`@1C 7 bT!TX%>&;jkJ1$.2*,0ҟJpnJрZ\q]gc~`' Z!_*+x.6vm\ɩclkr@SL|h9P /aCZ:rlǪ24lh;-J+OG+*NA1FrP'+8[#< 5')0$f(pe.q)dfQ l7=:tv(t*+zNBT*,fVQ\`C^@p%8\Xu"p\SfQqis1zHWiUFu}|\'%$?N D'XxU<#Q&g2VchƍG҂(4x aBm;ъR~QEb ܆8%)cJPA3jcaHik"# lGS`/b cv"#uNh=-3gze@VSOXdH;YDUY/7ę)1U4`h\CϮHĤht4yv=9ƫ$+Y` q,3Of)I cm&"Q3(Ag@{&^̘*YSw8Z||AI p.d5*o6Ƹ Tq5swWEhT%(wz.zg\7|[ Tì852 {lhz)auY4vE*+p#&q=Ƚ1 嶹{ ryf{۫ cM 4<ɡE=c"|Gmu7гgn%5)i|y||nfV;}%NFe69l@ǖoqki;vs0 `ZeG |œ [[Ƭ$4`+ @$Mǥx! 약;īZJ:ll"O79K oJ)"lK8TIdJ橄-JʗPˡȄAd<|t IHLK F*IɁ/ R-PMM;hlM$x@:Q"VNP,`^q ̾TL dNY܂vN\xك/\/PPN$#-OAjΎ 21SO@rJ=lP\DE ]P "ࡹ8˄ڮmQ} ãJ 0$P:ّ*Q漠ҨB6 )F!}R(RQR@ÜR|CK;-`Q0mS7Qy7RqぬPSYZ# 㑲b#jSC=T EEm€@T7%IMʧ!jڀL-US yrT]VeUUeU*=UAa[UmT: =?-L_=Vd I1zhVh}ViV,flH(Jǖ<RVrEVH(;8`Ww=v]Wxey=;qr9MW5J`r`vMXUWuE urӀ7W`WYYxuXHX]YmH&PXE؆Y{XYY% Heu%ٜMZ- Z}ZZX5ZXUW&WZڊڄYEW][m[Cڜڤ]ؑY['X۫5ZM[\-\ۚYZZ5\ȍ\ɭX܆ܲ\\e\ҍ[X ]]]֕۹ܜ֭]۝\E][-]\M^%^UZ^5ޑ^}^U\^Mcu]ݓU[_޳]__0^^E^-`^]=`~`]`^` Z%{= a.)} \^af ]=na &%`a5`a#a ܦ=b'^%Y}b+f[^P+b b c3v`-nX/>c7 F1"~c;$VcmX c?^1cM?.bAaCn =vdJ4^\FdNV82dR.eV\HV䲭VeEdӝe]W`]浽d.fdf[b.[}d怕1flfm cig1(j5gs.stfgw#fqgsņg|g}g|dzg+h6hlg~LꩄJxl˄h} uMQTu~iiiiiiiiij.Հ!,/ (iED0? #JHŋ3jȱǏ CIɓ(SfrBJL(!j$LtSϟ@ JѣHV'S3&hB SpD0S :BҳhӪ]˶۷'f&_"@!>PHǐ#KLYv3!ՠ6~%@A Z}ʰc˞MRIl0k)޾=DC^УK^ݙIzO ޺0Q场O)iݽ d ^mw\j%FO% 6 a׉T BA_e*&@Y h(RR'ap~0qG`zt@)$Q5].Ne2g6xyUcY= \vYQlXg,)$107P& g:rxeه$f4,IR_D96(EY w)$ Ք#vꨤjꩨꪬ꫰*무j뭸뮼+k&6F+Vkfv+[ 6 5 |ILhZF  νiFkKi@> OQ29|AGnQ ~Đ k I%|STI˟0K<6Ü3I;|3> `Pd1I ~`1»%-Ǥ1G/60. i676ڠ}7=` H$ p& lD$2tЁ o|xןRL3 hoߟ P/i۠v(Nw͸㝷;0t6:·M"KC ^l2̃Vl5‰66 MZ+-gHjBMjEv{gU^0e>S0m937X?64_gqFc c`VFC9yspDM1`*WP~Ev wp@LD%o$~XEd &cHqFqeEp8!HehXsgfZa\IKKԐ_oܣ+T]ѕV^q k i Pw &o>`*' {H[5rnfDqD}Y't2JDJC!Yal9bGI~ YDF@{9OR HP4b5q33]2FT wpP n7 _BHk\H8A)n `37i9IWYEeuMCqbfgxHjV6ssBh؅ufGp\$@@d?-RȥR4/f^(dždYyؑIz''VxhmSDv&FDxxDSprug;}g sYc\s><OTC2JCd%$"?K 8@G ]A:QuvHFFW`n2Y3M6yT }Ai} A(3õ?PevZ6cFSvX;KhYׅxegYNXRXNEN2N%oĎ7o5oAxEIzZaI*$33Y@ݔSm5W*KE[xf2V`5W%A@ u}ALbPG$#@9c_ЧX05ҳ م ŘDt ݖ QHDL$M: bU |H72 WQj`pZZ6ogҹLHgje?eeYD:oɄU):؀XӤrpmƵqWajҚjXMO+)@@xKt?D6`}L$JP$%YɤYofIgyh;-7%KTA)  )?CE0(&n ӎ[W{1od&@ كB#K@K)`Ge9tHB;1] E`ЩgMz 2Str@HT3We 6Lo# vpi4r.'bjF=%3Ƣ&f}4?:NܷzX)[󤉛f7oJ@cAFbV%Lc؆}nEvv7ϛFo TӼ[P5W{`k 23 3dL50P C #?u 5)0Ib6SH{  >PȺ'l׉6:{<ԙb6[ƙi3>jPZ_@N$Z۸,l*-츲hC6%Y նsFQtP= `GBC0N@ued4^UtHVMEM] =Gbڊ|]UF"BeC׈lC*# 9iۂS D||墤ȭ-gX8) v@'F]6@ FxՇ`0 d{EAtFw:C9BiC]um j ܀;(3l)D 6{cwI  A/ C#]&mx=fjrBORDE@*jjVxy,N:r?9b^7?ч A`5><8u눺>n>JpN${@k9{[_,ؽ@6CUAVZ Mq0Ue'z `n:zvuHflc<\MEYM:JzT$@fFhc_՝WՇnDڧ)$g^׸DHJJSxɪ אmD_nUc]7}!O^`דOw~,khG8Hd=Pf5A7HQ=C'^I |?mQ*w"z~5EHg3D֕䤬:5FcGB2iWFf?ʦ2ȧ Ccjk&mq{̉pw;sr׻GM^ QEpYG NI[Ƨ.\XH/T$X*P ~1fXvW*Pb2OΤYM>(˚"T(0eⴉ`gTi YenJu⭏.m[* J'ʞdp]KVY6lQTePX[7%ʏŀLc?ѓ YgA^y]]u+´SpW}ke*+ۘLo0Уf XdoNneR9h&BaT9҈YNydnP& Hf hfIҢ Y&oƜ\)+b4J{ !uH[xXFDJ` +1&+̞--^`*A0Ƴe,%^.S*ʴI`l@g::feqFd3q@/71,`;)V¬ OT*J72Z9Q F#듷`k)kU=aclIx=$ ZSA^&ƀ2 I 8!L%<%UTe~PDwU\ Oj=y ^2J1P .;벲(jf0ӒUa'#3L`|LR )%3΀*e$UP5N9dO(Cu9BZbRKJ ӱLˠ Nؒ:b`od?0 #z{{P3N'1\g|_3aꆷ?^_—=eO|MzԟAA${:?,B#D+A#lB'  +B/(</,+B;&4C6<0#6CDl5C=lATB= DDDDD>C$D|$TC.DKLEFDNT@ITC 18eLF1pFfgW,FkL=S2(1nFoFpFFs=5˸8㸎3j8GyD={K{G|G}Llyǿ]#$ 1ID(M@w 1$[L6餅'IM I@dOv hlp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜vꩣI骑j2:8b Jʨ&XP2EUB +3XQ A@jGn+Z{`dȐ=j_.d5jT 6(~ Q 7Q% 0şP[Bл@` HƱEUH2%HCq!qL10O?M (HtE,1Ԡ`õS-rB4ɑ衇 $]&(G2P3SUJ*<4@+|"'J(= ƍ8_牀N7ds1b Q؜>c5v_[%x{l/5& 4@($0x UJ(0o*g؟w >gg.tƯ|cvB A hJQ 4Y,r5P\DwbX_[|y8溬1 }A(z.kأv텴AnW)} p89d*$z (Fn |5q f[AU'B*C!Bav](R|h$xNc3{CE5o H 85#H> Wqx BAK$uJ]mhXQ.lbإ1qؠE*zQ Zڀi E mi &[85 cj@>o00.bLV \C]IBO*?J#"nJhFT5*F(&TC <ЀHU0SB˸E&/UTH,g,s^oQbldI24L1~4[6Ӈ4+1J`,AՒcԩe4,gl1Z2ukhMN ]@rQA8-Wr b-gǶU~iҊUq՟+$;)fspPIgipF+@Q 1-,XP(@3JKju3NAWB|\T dH#LVk;z1^UbL[c6:-l*FDQ83Kk-y 6 /Zj9Sm8/k28KƊJ7?Vr%FA\)=Y$t\Bc9Yi*}<(kD͊:6oBϢ ZzT:82籷ӄ[qӡ$z+>Ym\N[XC?Nwz>n9663ec#vBg˜Ę4QkV͂`s]419{Zn.Tʔ1c?z;°FuxئlXw dVFuN|nQPHE $3~`2d 0c@_&4 a s PQ9whSAe_'̳C=VNi ,$:Z:=16P|SX &_>4496iuFWGY5 wx0LTYLs7Yj3GYȖ8(Nu8mm5y46GU2YXNjY&u}5_#:l7=D3&y" ~'*,)`/C[6GER EXq=ܳ/1/tJg5/5PuIҴB Px:iŦ? f5sJ[q=wlN}NuUqg _׉?HHc?G;' 4N>=(vxovFe~-$5@ozT7e.o1I1I>=BA3*{&E`79XV/E{ 70@ Ȅ >Unq`

U$TccLÇÇM93uGY3'MUC)J" Cc?Wo6fcє~hSgbCWOF{47S?Dd _07 ds3[0,802*2IID=3A}tAԘ==ؘ{`ل̷XQ1`_e[ ]&_q R]kYkxm~T$~s( (t釮N7bVN+:boB1zG?}^cS:$bY/<X}KeWZo&a2s `((_o0ߙepDg83 R3JVQXjjONWpaUB U:u6ЌJT5XJBDNLCvLv99*šcxXc4Bu Y*$zTtNӚ sTXvl| uRW^u9Z)-+RPH²2޹PfH=ˈϸG Ux:׍[NH9vE`9 }ŦBQs1e5>׏pm֦h*9MUswIq/j2+gW) 9SCꑧL<:"Vj Џ~U`-}yZP*Jo?3C39_eZ31I禱d3Wph)>{VXRjEW5@:wGJOtcl\iPsiaUtV:%I. V:wsT^U6:5tCcWM7/i);{YKyWĩ׊Wb*V2^;7՝KP *,u`FX;د `[1фl K1 ߁p W浱_eV\^y~&ve>lBzJ#9Qgl iк q\WcɆY~Y?/4*>B}3VnWtHoVyz@+0Bcg+AS@oj!`VXCUR\ vab`"Qsea} bP:j5wSqH} qgȮzlKȁ2tۆ@'yF2*S3N65-?pt7tyz0Itx >ayZ GzצFP]Jf=*HYjpN)Nҗ^co:N3?$,vJ]{s0YN_&:;ꇎi%E%jXYqʖv\W5_uV{XWF>AZ%?3. H3X#S<`[PRҠ<- e[[yZ7 `ǐM4jJ L]Hk_v xY~u]cz6X8·ϳJѯS!\lSEFaJ=ATd_x~Cɡ0;l:6ƺ ڶ5\E ;xʬ!e';Qo Eah1ф 蹄 gh6 K* Ͱr -m\% JYj7D% КUds >]eS>3m~dYՇRuWwPsYl5s7=H$aw]v&tpufyYțTLkouTk@Œ^ЁՉp8K᤹X7Q0WvN|*`kPTRh;j*q2Ө ]Tu \P^Ҍ /.Uk-k0EErEgRIa&mM3Prϖvdt0ԧVvaԃ?lpj/VmxtYXUa~Jr2#ƘGBԐy 0Wz= *#SUaDu[{X}ag+'1;PSqk&ccnXRѷqb5u]>nex̐nw cG9H} ZСF#e"@pM Q5gu}ɬS  }F8Qb3XxyT Ozs59G*]c~xsL3B]: 9T5~&5*lL C%+.,:N5s4 Q[ @_P E 9pBSG2VGs-fx"-Rc 0fC]sP8am* .5cfoN5 )-=rZx =^L?\;G2k++nQ1 `*ԅԇۜKh%! ԀӯXW6Vkm?w(=4PD߲L@TL9^UَqV DN,sqmkйN u=a8d[ >5: s `3rd 8pD8/[p "y7" v%2N 8!@@/V.$޷ gįc82Pi#d()/8:ګIb3ZM2T3|zQ _,[3$[FoQPivjg`يc r쮫2Kޮe+Am8TJ?tj\=N ˓ B?a90// H{Y `l+0?| "@-~rUM4EjW,(jȄߓN9~ۿa1`R`v+`˲Ւ«w 78T1C1];#>978 De: pdҧ-pn'}ƴLj5V JF$%0eYMbuxO G";qG"vu~#xQ8 (`8[c(u D?@4WNt4}"6[{'`;b//%KQWC; Ėل';7̦P3r OG2~WdF- wiLt4告oeD%` dCrHjd69tDeW1XZ7SeMO4DC8cwFZwuyxOڨI4 4\1u;1 XqIR EGwZ*8J`]/(5 'T!וN%jӈ *`4 U*_9ZsCo%6\~Ca1c8OwzHK)Ed%+l6 𰃹lIA9~XDotdHH*u1bRȮʢdCOM7H!Fspi)Mb^9#TBۢ,Z9c!P G4^% ډ C_+tMDu Pr䆴6!pZqƤPn決vRT G,eE3c8#e\OYGxYYe"I. [姏~ wGVpdշpgtL KFIہA'A=ڣBX3C`{R{ࠦP p Ґ ;$oS º1"3R6U wW;%?qVXjV$a{R@|>% 9 iXsFDu#n 6b8c4@Ge34n%N+Tİ1|E˰!GH2E~`;) hҌq5j?9>7բ?Cm2[DC銪O8;At?-ܲSA1Hs+R+xj2jI ҳC;؀I4'\ڴsڴmH1(Goo;bB ;]s6h#6|'ّ 7Ij*j땦3]?Ms`44# {0{ ܈M |G.}X'+!n>©T\ύ˿Ѧ6T eFm_! ^O2n6avOu?XKxg2 4>68qN'łe! PXMX`XPؠ)2 9WĒG1 3pP'j~f~PwP-6t0L|~~wX~~$))o~~^%y蚾) FP苞^>頞L" z^Irh뮮^ّ軾遾Ⱦ"^{Ҿ쁎>!߮>N..>IN.a./~~>̞ _~Ů?> $5 0?&(671>,;?H@B0./T|U .^_ b)l)h^f'b;xoe=Uz)`F0)0OvލA"䜄'}=_"l#?_?!,~] 'iu0L39Hŋ3jȱǏ CII*M0MEE!CɄJnɟ@ JѣH N37R38D ̉OWBKٳhQ.C3 %YAnbcȐWa L vj t%HC(EϠC8MƝ ylѸsލVlCHAM&K'_ByKNGIU5,U!sB(e */| ?B(gFA8M@6(Œ(> hfv ($h(,0(4h8<@Yc`$).~B 5 P L)$5@'V2P o(`F|e9P3fGeFmV"RrZ~8'Ā _HRG P%b0@"D)('v'ʪj_()EAQ/0E U0j(6kb%Gr-':'.Z08 2jH-/馲.(  QGhk:K  )b4 6Z (~€3Τl ׂg~˹%(K(0pbQ_2 _tϨJEH,4|J9$RKBi›56.H;cʠ@"iR桉p( nR8CE 4*8I&S'tg{k a$; e۠GT'lga^F7G)l{F v}ׄKs¾ 3ͨk6w 0ςp /mU&نjіPL1ҋ*x4VŐ3X3 MRd)qgH?>eHbx+!  0n:"ŘJ`CZxb\{E eZx=x3 P4f44)<<:8*:01J/:F>B5iNv 4C*p#Qv C@f `JDÄh"|p*ȅ46 tCKEF "r`D4SP'0+"%& |`JX8W`hb {'7Mӂg !k4W Hp:-"EdTh#|Ef773HpJcohՉR'] :ypa^F^/.C? CQQB'R4-*2_dhzr-ަ-*'ۤi0qe v~@(k~ kP{ay=D4!c77+ S0 eGwEC6}l* !?XgVfu b(K2*у `_H5m{pm Pvh>2w\ m>f, 2f0sF5g]5^6y#  XSpg>xYT ?5`.t *s2q{ `>7'`"&r:[a0DsMSsҐ f8?F|8k<W}Ұ P!'Gp u^eu NxULz1 v,1v]5FQn.6ww_%2w:T*R txC g)DB,Lez=obqdтtu[0_"H3*;d@r!C #cH)+YK#8ذ8 Pcc3}USLqAFДLȠ]t~sm )aHe&\1DZ5t7XbP6o H}9T6^',6l."h@ncgXy$TyHUm(]+2a/{uC20Q0s,Z|ÇsŇP<3 89v '8LE~%@ 5J`vfM4IХ2Բftw-aS2p_6]1:oײ KAՁ'<&un=2=M6F:=<.}N=AMO]չ\C=m\W DJٳhӦiN$)tj(L@ǫtƪLh mMC 푷Rt3ϠCWtbI&P!EȌB۸sJЌN^M8Gd yfs:wKNCM. jQX_Ͼs%QQ#EA\!ھdibEU& 6F(Vhfv ($h(," Xɀ(#!Ui2X:8CB~#H(R#A ju h}T (GJ EzTIoVgty熚F>" dH0M2^d'd4'n8I*8s0]j'Eƒ0d$2P‡ z5*dG$@ m* `*Ԃ4R5 ,s {"2CICn+|%[`GrA 0j,VӜCM3$3Tr08CL@2̊PJ$UqV.rb*40ZhUU?qx`qgv%(G1J#*Fy@ ~/[$F o(HSxҁ#`@HBH4V>hRyiF SPb+8T|T* "*iP>1ZRb( ^h,19= 4^J StdܢsҜ5y zBME*^` ](nьҸE(t`< ыbVY4A 3AW3(훷h2(GA'Igc0(z!f}(R*dҠ+(8De!(AT@Et^@+Z⤝+ 6[`_@LgCt`:XxOd4sd8C3ZыT2;4iF6gz8 ɱC<8rt$') ' r1H_FuMfbx' 3#hӀ 7M;]F%6I`"Z(&XkJ pL!n8ƊEв|[Q*d n&fɒ̸T IwS-JM1_&~d\58(*p,gWp pp g j_ W 0B`> cT$i YS eii DPLMzV-r 2(=gZN16j1#6qCt t6RV@urS8YGW*s[Š~Xg7n\^r7w2Hkv8wwV/0Qp mx6P? 6hrp 7p `A^3P1(p -zv 7X@< 61hS gZco3| ^8ǐC PO2lHO-ED' Lݷ Ff} e~W ڶ8Penv(a%G#.@_013 / ۥj@xp ^>gD@ C) {R U/XZezE&(5Y%P 8 I<&|u- ذ:ΔQUid炄FGv @P= 免ft) X|P  # 2:%=ԓ w pvT&eoX`i94%,*74B7FUZJ& @$ 4LHUT!5KKdA"{dttfZ 6`G1'3jyN T q*_E"Z8gbפN0e%6R1HmTnSi)+ Q Ԑo) L BZS|AH07 > Kw 4 ˰{F G;꠫M6DQ$ 6+%P &DD61.>CY  jWES`VtjOdNWE=I22zx6!5Dc)s⡳I*t ~ 堆@e`&%F b\w3S S9A9 r1Sh <YCMB'EFsJc< ]L\S$G>+s^ E>3'{<3( 5zbnVrg@µ{fo`3!^#3lC |KBKIE7 A^ K1 ^Rɻv5cq^{u Xa%K% z%zAyGR51Q?:46m&fq/ji"JUaQz:w8fw3fQA D\B;$70G0|q&*:= P/0 !flT&P, <B| ub+xZM %E )6&eiEO o(phCB8 @N'-g0$0M+3$*EJ :Av>;&r? .A@%6ⵧE$TR /(@,#ЁK_d)8lH- }IoJm@62AxNr)|@9PC`'H_#6mPXW $vp5 ,$lpu39öNuiP%T6XvO$px*&pDP@803$@}"wdL@V2v NCC`( dv?I4ivQCz@ @ B-wu=.GR @B*;Չzp$ si* 4 PB#') 2Q;DI `* 7z& <*v=4Ұ <0 <`A@ <fDyAGxRq [MD4Hr<$I2eq 2G3% 1I, q%UA3 a'36;5%? w < p V c!Lr\_ޑnlҰ>kUW;U]+!bf=`VR0~)0 [Kذm+p]$ 5=3wP{'pp+[ =+rL L .jx!! 3{pۻ KK țۼ!s{>a̋Kƛ˺ ᛾*ۻ;+:_L滺˿L{[ L۽ \N܋K\1&EK.›p\<|۽;=gL[[X: h4YXa@1vW4]'4/1Ys)1W8 |5;ISzTQHOdk`(SB$3J-.-ZPBT)%NA)3qx,8' 3=l $͒>6AVR_ip}UOH?H J >8Vq h>c8*(CO~_(<3tx4SNj{P J|A &SYU Bq3*ua[`aY';}Wi-%R1YR"4c|!QM&7 `"`[gIqO" x bΞ e"xsЧvVp1jYl| |tf+oB\l_;ۀM89NJe@Q\)PVڊXꥭM˨š ۊXӨ{r֟:tx'"Ev _g*OHl"vXpŒZ|آ0Lgׇ0?^,2~ɦg#0M,/OTtLIp0CJ! Ds9d%[Yx`2AiB )@:pqԚp2vlJȂεH~Bb H"Qm D) p{@}@aCoKg PJ*)Rhyζti*3%^arVU@/~95 #63`fLz,<٤2i?%j) i+Zɶi@hR"L<)nLhટ-jI{8&fIxdhy^qb]n4[dfe%GɣZ&}exh2E\[҄A =HPdЃ֮Fa,|H hdm4*9OJ䂩tz>XL Jx` uwW G` :7i;Mq4o ~ aPWbE RbLGM0i{F~jugpGQFT}D,X7&*k2{22' 36/~`~=v G$wPQgs_5<3 kqj{Ef_WK'Ohi :q;: P0h 'Y7 Df4yb f7~#| j}dW0PK4foEBJ=!T"}TH2A]xJ/؅97~ zoY W7Yf hr uF  F=;it `5<4S@P"0fiph08Y>qHD7YTŊ@qÉgEWc zV1/e_!9 P`FGm*B~7T;SPv3xdČwp sG(kSD+-!G4 ϠI2/Y Xqd[ NPf\sѴ $3u 60f048?y@ɠ7wxZ27lUP]u ~7 YyEJp 9A qCWuxRu6dd"WU AY ECI zR @KН&; Vh$L{ S0 FF X-6NʇFEv& +5};d4i\!wb]8Q/:P^@a] +UZUYwx*r7z7\5S;P]t@ 8YPY p|9D z FU37jʪsJPU7dCt3P^ tɇpM(:+c23  6 p Gq0 zC y Т 0VRP 5 ` *y [;ꀋ @S2 0 e o) 0S`4 [ $V$J1 @Ptn Mp P9,3[uQ8^ r[A>?Bu!B@rA`uU0F\IWLԺ@[=As=3$g7F gF6<?gGKS@ϑ{2[[k{e3sD= (+HEĕ2SV-f=- ]D? L*! b 2#TBvQad@I,$\W!@CZY4k4\W&X&: P * *P@lL\’ @b Tai喞A $^ԕa5PuJArQkz5I> `>'(XN.>S gLe$؀"3!:Ui V` k(N" Ġ9UI*xÞ4UR6-{$$*xLW1M,0A %$6xBȦ3Īܺ&d8S&PB (r=ϔ0L"|^`Ɔ?aS2y^(1Y=-[n$K$F f LS,›H :tAc PbgL%XAF-*a _/ѭ,yބ (z9cȤyM4ly.%QAHY lɽDgT,θa!LA`}DոF遻6s~ҚӒd~{ܮŞN:ۤ| (40^emZiRZ'{I3 g_e&sF4:"EzT^k4jV2VZ4CPBS%>jY[59 /h]b?keӉTA׷ZK˄L~W6{6Y&BS𭅾RQ,'p  7 gj0a G1c Z47QQsQ|s@srs^lv3p?V.4PEOw$'_ӐNM0ue 2$.%/~ }H`}vٗ: ASywF_ |gWf1 Fe{4`yzV Kg@F~)x#q Ƞyyj]6ㄡck4 ##IZ SPX4lq ɰ[vXϠF3:xt8 wd|TFXT'ay5´;I;ے6}@c=P@SVE rR ETf%-@gi-D ^dԲ= Q3 r" 30! W? E:/ yr'TFd 8b{Y`aY63.ZӃ3QLL>7 45o2Zq 9 Vk WCS,L X G y4 ` &aMW@>D we0s!gWH\u r/X.P5` X} H +t3v2ZCn}t ,Ұ S~`kv5ZN']>xԌd@gXE ˠg0 SrBIΠrpHqtP[S c]q/5x &-Tj^ K4 w$d2 '$ U$7wYe^ `|3uƒ}2! 0/j%U Dz^CH J?46FtI!,).D? fjJS$F-etJ1,8MF7tJ4Fu1)%.{EG tH @2 S Ţ$jEbt & uqt5@ '09~* jc z`34a(ѧ(BU+P'e1t3ZS@ UU:`=1t`?\ ʓF7:`)}%_adEG7|S"S:__!. +yrzZE@Юi$z^&l *c8.-K + VE* p\Phaa.W=aVEa1 .SdT8_z;bp0'k{lV ʹ6 bP[ R{;ںK2K'𻓫{" {Kk{+һX!;MA[0۾Aqۻ[Faۻ̫ۿBὲk[Y"+k|k\{[w l  |ۃ(\k', $,#Lij[4I# ML !2<5 kۼ'f˼rAMzx.v` г &eȹ!,*()%H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻxzE)/J((X0NY~nr?(8%n%/.9-X)y"bhVf*%U:xߩJ${tnaTx]i$` M~\h;kX /+۸d%RCU GXL?Mҹ3N(vyz8w(iH8㛵4됂2IŸ!,R HI*\ȰÇ#JHŋ{Ǐ CI2b%HP.U˗0cbT<xꖴK2 J3J  O4EJJ OձTÊ;AMU4 -ٷpJi@ ' '߾hIi]e; ?3koQh)xӨ!Z>%zUQ5ps>7 N|nf'KYK|u! 4Y+Ca%ӣޤ! X9cx'`L\@!, 2/+')\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ LÈ+^̸-CQRy?(@9sRPBxKa(%@/$_&@:{6+O=V8oiZҴy߳/@l/ ƭtits?Z@Igiݓ|IA+ˑ2Dm %UP=P&4IQMЅ+ 9'S?p*0($_@["mF~WN.Ћ0t^H/2=m4,dP 2 ?䏈K>`1!]bCB襖r40FN(@UعY@!,84 H*\ȰÇ#JHŋ)@҈Ǐ CI$O63ɲ˗0c,`e3sɳ'L(골ѣH "R!.QDn[r9AςŌDwøt\ O_4z\Ʉ65 RfMv/jA`:qR D$9տϮcM?m*:%U8˲fE ͊{W9XI2I}(tNr^kb! @>1lsX:0@~C_%H5zśB{Xq=+s/w)sxqIPӈr( 79Ql[ ELzom_Z5g'a0?>jI%Vٹ2pew'VPD3(Vdu(5y!&2cNeU\'OOP XE>* |&lT8E'[y=P@f;`f$$ Mb.qfdG)n996b*Q#CM^T&V svR錁\ bnT 2:d%"@MZѦ;+R**.-E]݁Bį>=!XDȂ ҐHTbOevTf ;u0t*:&y-G#)5HSÅҔٖuC.v{I77QW.&:Vi[WU^OPJ _-_1]:X ި\c]鹮Lf%Me#p?$U1Fis(bC_nN):K FcOHS܎5c0GpJxDн鯟 ؋A0,Fg5reW9fSX a`cq&t ~U;7 l\~9zƕqe4rSlIG`Iq0>p'۾=]wP|cِK{ݨ[8?^%}h`mOWl#O~G0[|is^=7_y?%oնt| !}.` !kHqig#T nw2y}w+vUq(zMw-XUFʆ\$rN}9 Ag G@}m%PF\Amf9M"hx1Y/fGA$}6J(n 'X|!zt|vc'W*~,(o|؇5*t7WM2Am1rhcuׅȁrvuo,fi[X6|ksu}kQ ؀s v*jtm$vcvnxH_uf~V~M6lxFIq<h#|Mu{guuy:' B!i8(WjzhHdQhx[8gXh8ɥqֆ.lІwfmgFFmv)_$, 0ÖR*6lu2‰iө+hCDvy+$Ib8.it4דjǞ} (4v$98IH kNn|ƈn6})o8oM;dn'o0hj\VɊel\q 7yK" wyDʚ!{wTEO R +Lr3znWqkb:YiعM#rHooHqYl3XqGGm]/s_|::7|yvR@8\*qg;ڈڷ*t+iHC8%"vS8y2pH7jnVWqwF^8(h`q z@bMrQ7Cot薌uZF6CRu6y(u3h=d ܚ\jhfSH>DprA(8VJCtDAZ $(dy²0$8N(x}o7ފ u'W)Dz-*G#fjbo2 {|z~yw爅v(TrOg Jd=[8L&rw4Եʚ􉘮Z[i7> ʴZzx8Ȧ2 qia/ yz ڷ:3*0zz<˷Dx%Ǚ+> s jf9E'Am`@ kj; [ A~}5EWShxXIxiQ9rBzvlJ7wYuw>KW/"U:CA۩c[Rj+Ge?m RʥJbGzn lQW7su,vٷ)- iLW|k!!ʮ  Q[శ1 Vg8xyf,',[Fڅ:ǝU 7[LTk'}h~Gw mzNSa ئZS^n۬U㸛(8 gm ʉv&wwHP~($*,{"kEe9iԸ;nM,wyLWMnڋ5z l(ynnܣc{7vܷGzZˤ<y1wWˁo٭}n&Gٱb463ylq 2;.mqmcط6h,v誒d-vwij 뷦+Ӭrȸ|*:1~R7-gXG+2$uz*XxDd ݶlA @Uo'%$daO2DJJ?=d8_F56 + EK1eΤYM\Cs+W&y+ 0$B EJjPxZJZJF&5XӝR5tR%c<NB 'Ʉ SvԸP(%ej8rR $Ae&cHdV1? Q.kرk. 3oώTn@PQcڸaRmܘپZj^Aj'.r|A>g?${+I"m#akOa<2L44odpB qck(<ҩܰ)RKʰE8Q8z,{/"ƴ"LpXڈ$Qh(; @>{%-s~sL O#haʍDv%.hYJϥz&\N'K7J0Ҽ|=$՛8!A*LS9,3*$W)tRɴ֚d;gDF KLK:-|Q^zY-hǎS(;uՅ2lB0L=Ւ@,ރ Ws_s֎848m3V&3kцVD:+Y(}} ,ɾ- ыi?ETSfR%'In{,3;.g`5G|NfVj64J h8> R5xV)Vԙ^r4Rֻ硎Š("6 o᢭ک!:ߞ c}L W:,ZI`Ywb/G`HCHՄX%ȇv~L<:'KJc쥂jIao^)|wC8Zjƃ92HLHwPJ@C%nRE 87"M2PޣRU6f% $ JAAME͑=Bh"1VnⷿC&NQo;ͱ"t YTǮ#:YK823!GjUI-fq rh.$$x\$fEG$ºga^BIbLqeYDIT`*jU҂kPSPs=$ZPRJJ|/J-sRDTDW# ,[؆~CDь~,C^E3 4q`?/a Az3)b1r +@nPRA)'f-jT>a5nzp&@+CPGe&|UZcӠ~2DR<(U[K7W&\@{evi\RV)HV2Y!)͐lqB~ <5yIscT,ɯ%}DߣRpǧm9k[x$q力7YE81J2Zk*Ƅ]%Hr7RYe1d1$,yŐ9[-Uu֌,AmHOai$YJ@)XUlP!hCڲ{SC1o]K}KܥsPY M=P~:q}sw7cCJe<-P m2Z4C6#ז "p(^沠e t$^q)͚mU=~ T2l9I *镡=k}{!/HwK;fK7n2"ԤݱaR+$ʪ4YTIp:Vr5G]t ^?-A-wv#O8Ù̦uٸ_ jioWelDƺٕx[KIlR˭Q9QO4/Fr# SgU}ed UvR}!k69UUWNy7?(C)_ j4Eϻ)# 8T\c#I:<%B_"$LUUϑRrD'>[X >̠Xq٣@  i@LA^22|AsA$A B!B",B#i9CH맨ē,b$,ѫ> +u|$EC;YGD?A2y ވKГZz3)cs.Ə+\<㢨KnD*D"ħ`Dɪ[b9*y%д#ED!)Ix%0,L89Hκ)Ġ[uF E&WƧJ~̢Y! 5j #Pﳯ~[ Ц) K/`: ]tCuKQ-sΛqL u{ɪlӯQ!,aKHRP18 ~>< Z 0B,3 $?L<Ɓx4_RjQK|,iA> .3ط@T ڕ1YƌAQCNŬ)EeEX9R R>}o7&e1.mjC@#G7 $5ZV_RFkJR+%/7F dRH!۸Ә`PLH6]( 7; `V[@aD0F݀2UMP݋U'~ P&5"9_ ߇歒jMϴ#8(ಸ>[G(OMjTRCOZO&L H 1+A CVH8a$a'/[ &N& 4͐M%Y#AMV&.@y $"WɈrv@@eRLP(aZ8.c Ih4cԀ|:@ObbGˈ!nBhJ䐸*dP^; eS~*S^eVneW~eXeYeZe[e\e]e^e_e`fafb.fc>fdNfe^ffnfg~fhfifjfkflfmfnfofpgqgr.gs>gtNgu^gvngw~gxgygzg{g|g}g~gghh.h>hNh^hnh~hhhhhhhhhii.i>iNi^ini~iiiiiiiiijj.j>jNj^d~@Z Dl+u+ju-ͫj\?[PXC(b먞y/2)D*x~&@(6lnialpl~~kx9lfl&˶lޒʎlljh-C;ئdZƞϦlnnmզlflnl30n6 6Ϟ.hl>+f& CöJٙX@oVX킨loבS no^4V np ~ym~Nm!( kNloODnvoFfn?iŢPR9zݱzJX@NŚa·zI)_(?0r5&o=&O.8[Koxqr4qNlj> mp I"t8m+pcPd_Yh]&Dc1K\ٯz N /}I؀25GC\ȧFnlODov^O\84W7yNnFqQ6e`LQm\R>qYq=!g!L-&\Mg I\C@'1DP&6A<:J"+5Aѥ˔DÌ%q|eϠ#+yDItdK3_IRHZ,NH⿪vfp"&UeH6NeKvŃ u"۴ /۩rlP հq_D Zc Ua_mS4lֈCO3x1g#Hr\'S?>U䧚%ygFMd)Q1wtsz% ,مLD|+^TO;|c#},{{_\w__՘Y1DZC^Uh$ԝHjLh"⦑]'%6#TJ.x2bۊJLwK^ju^eu5z}DpYݔS_چvQTrav`fWY%bfXUFF)[h^PXfa%pyF8Tm#T%.qRH}PM0zmMvݍ&TQejˁx%D$$To>ũ˩%Xfg+v+iJ畹 'a'ax}^8`**Nۢ9mI\"(w=MJXvSQciH٨hBenke&kiSidկ> xؙwhYXdr @#UJ^-b"sDq:FTpPhs(˥ry4wq(EqB 2 d}W\uv zq{gvBX=,buXg\)9\L&#["Sp0m EKJ[=\:QDyIDwdIXeg_K{pç5Pq!j9&&1Ɖ n|Yy9X y'=Uw,ӒgD9%JCG)qI6bi_焄+iQL- UD"HZIZǟ;yNm}!L &bQ;zPP-]V[xBp?"Rąq{jB^8&HgVtJUzq1=1Љ9jYt6+n꧐vA<金j# ';=td(T'KN3ݥ 0rL nNJ[}R7]if,\ U % YRVA՘tLver!'r>1'&v*a&8)q tu|'<)yQ %}'@ɖ=(Bn* }(D#*щӗ(F3эr(HC*Rv*B8ҕzQC@ TMs72O)g HF 'XNDR|P\MHyԭ/ @hTňy)Ȳډmfu8\+v">u^{; ɻuZ{MIQT5^# 󙈫DV26JeMIY̮, ԘشiOF 0d,_H řF)̖hZ-ST27{U?ۻaި; zu7?{2ZPjbRgCwڢؕ+*YMYȕ XlmN’T^!%(9yOX,yIևwɪAZ>5XŦDw.̚S\$SS3ճC4Wуmn?ܜPr N1zkWӖHdPֵXf -\:+4^þ6غ!,S/<Jy8qm4w3p3RHǼ>YL-`=7ﺷoX8$m3,mIh5w=$NV"ױ<^2b!L'v8Wx<@`vw+RnDnsmƷ'j*aԩedZz[ra#Aq}Q+1^2[^Dn\Nb%CЗqʖ[O|84wk6H yލ`v,Ե~,|# >&fի@u%7b*ߜ.S1Tr%qFX"7BǼPdVMWbJ 6n2FLu]cUSʣ\GE OuZ}`` \2gj~fQ VMB'n_1 T ^,&vugJ1 4ZXcJ>>:|O&fopʧjaP:*gf%W]Y [h]iB_r?`?f}~flh'ʘgdGW$ٖeX 5UVPh^Q{fRt;"BqY%fA[.)gso&qgr(Od)C2)v`]q刂l}ff< ~ +5b)]QڏyLgp(((¼W&Z%H(QJEv\1Ii^ʅpjj.m$Tv諞$H$J1^Y:J-}}t̴_'5V0$ΆPiPV)UOTg*PZB n֔r|NV~-B+qo +(=uΥDLUۆɚNr~hy>ɒj^"kFKBʎ* +>Dr!hrSͤZh.Pp*>!gc+Ơ s= bϝۘ`$ՆL"\%䴝,(Ȃj~rZ#ڲ?﹮*쎮M&Dl*mp֩ p,/f]'nE, a >DQMUkKጦ/\Pڄ(X>%MlVĺң>DUp0* 5)V6(2/c'dZ=KO:^u_wPFWmXk jYN|ЖV !nG#' .,r%42%2fUE*\S,~}*tLc<~nJYB##e*)XL 3-.fef 3) C0ԎxY(TXFPP=|I ^*cg~|rDjⲷ 1kf5,~Ez3hFfKg*1 C]AL=hi\PϑcQ'$ˎX>#n򧲮PIWvk~AsjbR5Ӱ$N8^vupqv\w%WvZ\BUU]Z$]\\ɥ~r1k[$"D"Vm9]QSOT$JCQHx6TԘǟ|iCjk6l$e%.6kkpV?6B@ҡJ $ &<6o #G.I19T0ug>fs-b]w;E4k7|VcT /w|?sG~788'/87?8GO8W_8go8w88888Ǹ8׸8縎8899'/97?9GO9W_9go9w99999ǹ9׹9繞99::'/:7?:GO:W_:go:w:xz(~5`5:6:5ok":6:6::H:C{뺳{%wص::7{T';#;{GIz;o{]{cC˻c ;{ܷ<DssU+W|{纪7J QHZ@%g2DE4PQ Vh<\dSd'POqs$r)?34$@W<04PST/JdL6 $IX$ve9)y|!^If&l! i)'oEc'I$9|:f矀砄衇L!蟌F*iL::iafV@'$$*sjEz|XW뭶檪:P>$Ih㬚(B!m:dҖ0 P> r \'[͢` `!((2t/LH,M \x 5a VX,πd rJ3I/4S?@L݄A@H#JjVt\ ;IY$]tȱdBw1,}-2ɖMdp(1 V,AM,m M/M$,p޹AW9I+$a gsPwC+<'?8 B!)Cs*J,  28dj 6HP \` U>3 ^(E`HP  bG eWi2 P PL*^!x0Qi@U|rJ=HvP pIfd P` E6cWhED h 22@g -D tˁ `SD s ϐ ڈNb3 N@pPd0 v*E`C9c`.` 4j.  `&0kx~0 0 ~ & 7tJ&v /i#L``(0a8HkcPIp\k40jPebx dh 0PP `\P ) sq ΀ !#+ o %P, % @:y `7@7 R T @` V  -Ɛ ` UDPDY& H-P p ߀ Y ;On 9 #PP P2 + 0  5i ϰY!0p 7`b%\ ( PtN (Р e 0`  С ` `` pD0 90Op 9 @ SP a0 ? jE p ? v @ 0 %"@9UNgH8HBW= 4- ϴ@ x: 05piQ 3@P 0 < +r 0 9* 0@FSਫ਼Z\ ` v- \W HJ tcP:iN 9 T t~8@g y8M0, e #JM# Sz e0m#b3P ƀ ʼn`j1 j :P pY4Hq7<\t ! X" P %@,I 5` ¯ cx4Жe9z[_ {i հ@[۵  ڡ\&0 $+حߊP : @ 8 s ! J 9+\IPX{ 0NRb[ ;( ;S Zk 0E 0 6 p 1  Zp ࣯ !Q8\˵:P  ebUe{ᛂq8*LzH" = \ Ī p <cw ?A6 @2k1p 09 @ [J2{wXh iPj[TNj  07 % M 6ހZBk1HI#q 00h(c @"l (tS;(OG @|P #: 70P04j \>`H6"j xp@Q;`8fƘ 0v1 Bar(ŌmL0e :LʼnvV 0 :: $sqYOUlaBa:|ƞ`  P-j3p ©= ç\y&`Q yz pb D*ԡD- 0,G ,} +yP I_H58@٨ȘD]+PШd (NC A]b"a};$oUm+#k-[ I  Q+ yN7e 0 `eJ::ٱ% Vءo ڤ 臥ڪ{-!bXۙhz ~aֲa7}>! T1 ƀݴ.1 >pյ @} P :- Π ] !)O)̍v`!97fx@ i|Ė Ջ ~{ + g *r ew|Pk#( tD4n␫RDn {k@Od b áp@ d1Ŷ(ƍt m !`= X: ~ 9Ƣs/UkK|Nǭ-/^rPg**4 * c!PX L @%lZ :xJ :%0>˞)cFٰ8Xxڸ8ŮNxj &pKNqދi"-P  \L sPfQA1/oA?[_, a" o#o#Q kBPd݃`0yIG 0&0&i`eK >WpҺWlnjmؓ *8hky`@S2`PW)k WBz Ȱ ~ p ˀzˠ   h>} Glx 0 G  % ?>! Gƿ 0ѣcl * !< 4*2JHR*dNJBC'Jé-Z`8ɒ\Jq*DM<0eN0J\КD4?WrC+$c4R3Œidu `dMip[>bi5(eR5ĝ4R4Wp/ 4^ua)%0YpiC>ܖ:о 7iD*]esֹg]cSmdZT56-uL#uZA;W )y 3l?j>7ěuRIJ0UqkȕS3RfD .W#@c9)I%=,QƃNnp!I,@%N "nHDKtQtЁ< jqXi\X&R2Z$'YIE2ò0ė&M `WJ:AV0Ya 3.Ҕjs/Z2 n2"z8#jl"pA4FIC.[ !iPz Y+$cnXN*$bn8^3f%%[U֞ņfD>f`0ǟO@`oONYB!@K^4(T@pJ$yϳ@xxIH5H2IeTPb =o6h A<9| n0T`xYRƤl& KQ& gf& gt %vRd`';K`I&bl$ILI|1"RDUy) (l?bR:4(v43(tṔHL%vтRzŘ[ ;I'^l0ִ|^ƬRџITDr&&Кe$ghM2q9 D%ӀMh,CiK#bS9hM0LCUjv YpNa&[lA ٘%; ]a M7 P!4iOySL5GhT ĶJf2D` AKbř 8QCTE[XBTVi 0~5 O8##8F?G w%+S-1aK&\I +i 9|@ h4 :#"(( J; u8CH4Nj@H(W&QW8PqgnD5` %iF1QQNʢ)$(K擌qj%hbFGYIK &(1v( $  +N.*zTC`$ I.d: ;#̄;ӗO0^V-\H-lj cZ [h@&RT 9g[O$`]D-s 8ǹ>@$fN t.0!9G's 6YC(\@iScf:9[i J"N2وUS &1hvaK:צ1P*Ӯ @Q*UK@bL)^T̥!ZaE")c,{ Q~81ՙYܵ&sF4k/ո )0X/pP 5ĠRF(YK&oA(BATx<(J[Ά4}l k <x9z /H?@5񖕸~{H۹.,|IQ[z9! c] (\g;׿fN&?, ό)hT&^5h*xƘDa>~'C)dG(bg58hd`Ha:\PAjʠY $ 7"sHl鼒zVk_5?C"@ObPQ; I i_SR &LqcАoEAX%#(J+04 ]0+*'* <6*Tpש@+p sNQ%tS7v;HRb:.g(8jz.[%*R.Q`x,k;Uxۂ8Kie`i MXȹ\٬!JԈuZ%TraKhsրšۄ!K@xB&ںX?8- C8 Oq)e:G_KBzlMڅAX(ٱͻiH0Fz AdزdHά}e^[e`fP(fdNf` AejCe ky.;pV'Vfs>gt毻V_t~gx,ћ_kh&`Ax.h>hT`n6}fgK_Avh.`.f^i|^7GeEfiiFijafaN\< CV[C ipQ^ZK@ @Zj)`jHg@f9xPlHkxkpWfKg暡PRI&T怳x .^nTl`qEQΞ(E \蒮֘l6xpXVFY 9?f&?T IͶh:@@(8G,!($W]N+[Mj"SH\]tpd$Kv [`k(T L%\Lq׏!0Ykap:9ҿD51'+ɉ5?Z\aߨ-h)';bDS% Q&W|LV˕+?B§͜4ڎvPbS9\xW[}>cM]N Ž65_$9쇉qd0 !+Xa k*1ၗrXT+oTXCYhHD- [1&MȎ*{9-cR<(<p{PT!X-¨WyYM(Ol'#LfP %tL i5U! R &VWMV 5mW P6m>!ƒB)ʄ| 7jat4rX r?Jb&Hк,G/J&䄳T_G*R(@i99MӉPe2 yPb$DP`Kpz9ੌsE!PoPa,&|%44LA2-3}L8Y &tQ 0l1R,k^AaA.k@[3NDa嚄Ar |@ K!#ą.!E+4 0 f+q'&mJJ`flivaŜ 22P,C0Q(#^1 jp /J  )@66lc$iȷq ' pP xxpls 1tvvUE%^T#`nLB J$@%Z:H*X%ɜLPw%Qo(!`3SbϐN*1 J,Ɍ`Brސv6ڧT[ [ y}OAb<}!1 "Tn*i((2R>`V*tc B+diQu,x Gw-P@~Yl'R A$B&B#$0/,BFDN$EVda En$GvGFd-G$I$edX$IKr$K5&GLTM/N䧔9bc@L( ?E?@(4ՀB(OFT.q X@ C!8FBQ~JZ'xAA&GB.hT֥TZB`Kyx`5-# $|^< Ɓ3%eF嫔"ɄByrԤprPM6iKaNщ%ʛ8cZ"ZB \2՜fjlU&qV &J 1!JW`yTN`b&P '^$aw&hanh8M||BBLC;2ZLEg@NH"eq.(e'fƏFq1!\bl@@d!-(C .zW|S^H2G(h@3Z% ' *a|BUS&?8fR2 ɏBvō^a2h62,-h[U ,hibڀC1$C(d(C3ީrd&$C$ *^#H x@F1%Y:_\ҰV_bYF34U|em~K2V(?}3aW*aL$4`!ôF*((.L@BH*w,.gP ,/$ @ 8y(S-h%< @B1TQB8D1d˵f[kB3Hŵ] ,}%Đ)4 l&|•dE3,dZdBxa3h *PB,ڶ6mLJ T틔`),*L@58(EIPTע%_-trD&dB1W%LY Ld>QB/T?LFa+P tF3`+jܑ[%L CTA-d4L\lO !V9U]&Îd*%8nk%H05O ;p&&lY%H'ٕ&~G H`jVAG1(TA&$dPk UQ,knE 0L?@F2&v߂Dor̂(z}zmʑCBop(./B-G -b2X\B+z)o}Rb0XUm,S ^/1~AZ9pD. )H(N.Td1?1@{h#Z't)`p&P)؀6q~yUeϔF60V—[@F.)Ys@B_/e=ϤQ Sz1"GB}xFM%׀p]ۍЀy'tЧX)8qB[%ViLg3e='PI[Kn-4@LFWl4r EJC sqJ9@fN(Њ1 tdĸ `eL1't+oVY]KoźZ( A%ZnC{LW,%%r+8taN>V-TA WHLte*OIՊ,gF ,oD HW)'B('<"oV1V`0$X5߾Za^$0*F?b4]Uc _>,F*Ac4U`W5ڷQ kH-nWŎЌUĮ )7{9p 3ud94'QD⊍FڋJReE bEv$2$) QZ%0[U`4\2P*ģE3l;'kca\uȊ%3} =ѫ-H?}Bt;e,b1d`DDu ,@/-؂ 3I),,hRڀ (-$$U[SB)( t6CჂB,t΍.(6H*0-43`3~.E(,l2,C/TB*3ChɎ*bb(Y"e}| `=#}Jmmܐ )SHIUv R옓eKa 2* Vj`0C: V)cpPAP#LP6@`1PNMOʩ[xMI[)OnieD@hœ;hXd.<0&&.pȢ"6qMfN4CqE+J<:s;DRPRDV*OL4[kJRaeKxqq&H@Klg*QPJH!P=R%Kt 0,!hJXnd-N<@`.h Y&1`e̊>aenY9ngfCwp)7gn99: %Qj9%O»؅Ig>3DdJxy%H>xEUg =faeiRQT'̈.ghlvr\9Ɣv"gfּfK!6 1NĊx6L6iƫ6d淏U*7%J;WP%Q4mc&ԓYThxSxBdpR2 VqtASWD8jX  T" ;"cc ~I*Ax`HiZ`y!Iȃ~Z&a"H^ȷ曙yqfZo޴3;v+(Σ q|لP^! |#-sq`iE a -< [$T#E8_bW$qQ٢-F4jX8$ $-PHKA0b )( e(la ebAVI.ZxF2_g$䀄?qb8eʾ%@F O ^cJ1#pR* adĐ@ F WAg/+{n  bE!1IN2.jp;<*QBaK+E 8.q`Ų0 0a L"{c*[-cb @&Q(cXE-2>=\O3ʉ'ת:Eԑ偢^(xvMtXxSI$C%juN%I&iur*bAѷgx gd_6Y<+3+ `1$AܘH E{0 `~-A]ǃ5a`E "np]HXd k Z2<XF+4Qo31 1-8`OT|3N'2m +.USh 0+4@. 3WC%"N `,Pڈ-šmm`@cf>Z.FZwd]h H9 JnA@}K uh'Q,s7vM!\@s K4 Xهֿ9M (2,z0TwHNӖIVT BN*(vZPf0 wȐBکJ@8ntaL;"aYVo0A Ά!VНDވAy@j2 ZV<8mO6!lJ!:"@A Ƌ6HaNRMbڮIYJC!Q,D #`U(!rv|LeIhb!0`(JX`Fa|AI!hbhaJQCqe1aL0X!Df`1-JpG0O'Dk%[Zl,A b)#Xvm1#@AqN>F##zF(,QL4JF,륛( 2%vfr.aRbGG"@qJerpΒ~@P(V.h)q/}F hn! x!u A(]!3gB.bX Qi@A,VCfRr`8Rc88!T TXQx0̈R&s!#9k,3ǘ4w~HQ Gf-( 9`|!`(" , шfN3*-uRRU&aDz#A#.:e+9uB7E (DfLkvU8')R&AX` ᵖCk6"4iܞF D5%*bj&(B1AƉ3]m]gB{$Nb@82>dg.R%*, Fjξ؟×#0 nJ!j|Ecx7ڣ .q@{>SZ#WZgksZb{ڧZڨZکZڪZګZǚڬZךڭZ皮ڮZگ[ ۰[۱#['+۲/3[7;۳?C[GK۴OS[W[۵_c[gk۶os[w{۷[۸[۹[ۺ[ۻ[Ǜۼ[כ۽7CriifTiVVN,2D##s#%6cd3Eq˱Pet f|LCB.b ,_[_k #(3wAk~q AU60PP60v b<Ç~c`f`TOFMXWX`_ W@,&;0„ |ʅ YLjrDY9b! ["Ddm7XYʉ)N0I7ֆA2f ?(E8ɘ'Y2c h9W-;D}e.ZB偓Q?-Z3BRc}U$W6` `)jl_ 6;;2튵 ]w10 ZN`GNjA0$X8EuR iM5@^WA^TOeGXiJ@Q@ۆ~_Tpt!mTGQ &pI 0(T$ƤQJ7^Xb؁u 1db8i#'-p-lr fU<c K@풆 e)\0 G8 7ĘW8zPi&5fq(Uaޘc C#.R*4YM5׀gLZ7'7$zƕ7ꢣ0w $~/RxC$MTC $Ά %PSK RB<$QyDIwGBD°/| Qqn0 Oq`fO2F)Tf.Z%H:D R a5F GlJ5`eo]f0)ٜiL,U0@gJт)N-,pM)v`INq5xrYsSxQ [ ) 8uYK)=27KW@}@0OO(75(D&B5N4P)Hб)ϫQ@'IKug. =dEw鞐xYdk6`{>r10D)DQ: MZKs(p 7Xm2 &ݒ. L8.`$L@BD &t4h:( 9Ʉ'(*|ݘ@ ?0'] lQ>YW( &k =,@ŔG  Fv8% [@Jqa}sc:@L/xaD&yzC>q O@ZxU|#+"Š tBv t/spn BŔvkkD@b&(EN8XLp怙Tqhf8-6oøA at~\e &eDP_Cn29N4j-(FR@@}Zַ :dU蹥Ih@i e )P?>Λa=*"@ 4 Q mGB+XA`FfiB.A,̅cb>hƔ>L`AilWmZxrh@;xQk#뽚BO\]J]l9"hCt ``R? WX-B3-JT -`D+N4bAO`ԕ57fLqĥ%MN#ar Nssh_$*T{ ds sGB5=  %PH+S[w`ra]g!v,==7 /1b%slast5Ol19>d 𥁓E#Yw@6l`14 #c"]VP"vqp0C$wB"@P$24 >4-eD7|@1|7 ?f  v ,DYy5q&9s.FtS%T_2MVPL fHBuyPчb%G.Y\uVR!t+^Y r F"x~b26\8%p7wsfA& evpO@ "jr @%7 7 ` `0{.oZ0pdp5@':YXi0B(qgP"43.t9%8Tbp)#` Zxa8` :G F,GHts:Ѣ] 0 P@:Y-Ypv! E0-c0p>5g}}Tvp SwmDQy8Ò뇇9.kZc ,B RgN4Vawp 0HRV82V`kaXLSIz ԝ{r471ua1}U e4@vrh 1G`0">duNrQ#& ӕuesJ2>3gdӓ`c/jmu V6Tq ! k ~ 4$=밝W1pk e@ |?ఇ 45ȏ$4P9½  <ȧVb&rdki0t"HtP*,$ 0`@YL+Ep p @ ՌS8C0%0\0p c5k 8 ` ;w,KC0s&jP 0 @ fm` bS"p:@g\ q6O @͎݂y>Mы? ِy34]% O>@?x* ! 6 -  0йpl`0  vƀok Чl|omHl-{VQFlCDa`"D tXqk]mbap}Уk-Բ4d fM @ ` P~  uvB/Ɂ @r'iq`D3rKSeë2}#x`&&JD&l8$ $2e'H؜)\ OpCg6/#C`0-d$2a*=5d@ \rc|@ЩP;  B ͆+1~@r%%#t^f#cKժ&0 .02`(+c D6QVW7^I $ 0/RBX:2Aތl3%P lI~ Mn1-d2);S0^ 0p %.~@癶#B?!D%5XR2 @ 5BNz.ObGT0w*DAQĨ~R*n T|$rbiSCAVa"oct1+'Q&8Af'TUk+&IL#Z"iLjR, E{v+J@ DIV^}X`…cQԐira$K8qE3Í2Mr!Q"Rלh|au 聜nzC#jc3oI.!Ǹ"@D9h@w#$P`I4.uZ'pI`C?RTG#DK(D.6$KAda[b8A0`H64q6xJn`)H*G;R%40WPfL%6JX4.E9Б\.FdGYe81)l fggEVW CU%K)Ssh%3eX@ZME wUIVY=bt՘H|Lp`%41 |>G] L0Xb7v4@IqF&kD@ @BҠ$0 e-X49g [2ID @J!&B x` +R R,@)Fʌ)%Wő( HAࣅ2C p4^eZ *M3!"Ta, dHC`B;XRVv*KcXĞ 4 E"" `B v"N}, |1hdm'3٘]--.V6H&KZО(?0H=υ&״P8|+&V$]ˆ׼iY@Ġ%hHᲮ3ox]򊊽p<`%X@:b, p%U|]"nRސȏrde4Cp勔A폽GP--FٹUBPl Y xG{Xˌd^f_zD9"݊F~v1tI67 L'wg:%5qRh,y'K-Ii(K%(c `4J 썴G_=A2 Z M~e~GR1܎n ݴ/gE|+B( uH% }w%~ 駢%5 TK^qrUuL(3CA+sEr ?#qF"#xx? p?P32Mh? + d)h05 /0 BcXS[B)p41Ӛ 0. < P,ZH!P <p(Gf\Pc6JSWS8JMDKTSxDUX-Y#Jh c8WP[,B:ipC 0M8 `hAxWȶxSxS@bpWķ#R[P#^0f0dLO6 #c gWHO`\6Q~*[b($iGH9^Ğ#S腓K  xKii4$ƌMJhG3S]HNp[0Ll[8Db,XSV 3T,udɣR0"(;RРNc=,"&oh\ԋWE0 \k*0T Ʉg0XeURpHRpDHRh3={L+Kє؄*:F:L !`P^ Ȝc%NxȀЍ %_Ac0M:p-\ӠhDI\],񅥠M F}d` D5HOV%4~<B (rpۄF5P\7I3We_xYm+H]w|"!4uCc?s(T|0rRɣDA+Y[b$9 ?%A:3Ŧy @ OnJMr'I4[>D+(H#$MsjY̡N3 0TPy"55+(:TȕKS(I=d2 'k]J=JH&QbN8.U 4,"hSE߸a%LjT=Ɂ`7PekHhiF9FxjB{[եq2a CT#`7ֺbe<)L4\@RIN]}M Z HJaA^RGh0N%eb'~x %H"GhqIZHπ(M%lY E0TQ&ŀH<#ʀqaTOd-=xᔔ*3*\2 ~X@S)Mr%$yE  L!(Tх%xfH( "v:Fc)I刟 CA.Y  Pj F jʐZCXcl)-ɥābJBC`)N *-bIrЩ1|@1?N C $N2.0P&bo+  L#M+%ů  _m%"JARI*8(6|$[G|2lbJR_>A FPI3+!}r3R4n <Ҙ24= 6|HI|Bu߽I/"rM&>81:((U0M2 &G.yadI7~ֹ R,Qo˸ "7Hl"2$gI$Zx2N A d_2V%H1К+%\;I x˞ |#{Ƈ=U}7J8׾l4r}C6d]Y|MH2$* e΀8Wf27l(R PRCPI2C\ЅR JH2"Q& .BghI C V2(B & "o.H0]p+7>gK,?Ȕ<#K"Kb2ʘIj/dfT J y'ԘW2ei[2W~]f:r~:!@͇S.>>3Ҝ&53R R@gB˰s3\:N0o_Ĝi{3%ȟ@3(A jЃ"4 ](CЇB4(E+jыb4(G;я4")IKjғ4*])K[җ42)Mkjӛ4:)O{ӟ5B*Qjԣ"5J]*SԧB5R*Ujիb5Z*Wկ5b+Yjֳ5j]+[ַ5r+]j׻5z+_׿6,a k"6],cB6,e+kb6,g;ς6-iKkӢ6]-k[6-mkk6-o{7.qk"7].sBKCk.B}vhݨRx;"]$*7L?UbN'5ߥ ]&P ; :1 aV f0*p=@q,bGXGMo똧CW<8Eq}L`+941! (,vG^1 T-c]6<4#l)'٧asC<"1fcąީb/Z{2%i zń4N+6]gQtM^ j]S-9qu _;.3e!~5$> g;[فg!,lR H*#JHŋ3jH$Dɓ()Jɲ˗0c^4 ;z@͆b$T¯\(-|R&[$ĺ, K^pS̍?I =($dU @HqIP &+Ay}'S)4?p)IP?O|EP/aTJ5KRYѽ1҂@ppan0`x0k'6Ds$d ]_KӅj h->T#$raRD/=4s,-ܦNӾ5m +p/<@-7G/Wogw/o觯/o HL:'H Z̠7z GH(L W0 gHpFtÁPe=D!xN F5ADFE&:q2{"ƞH*v3RpTx7H2hL'm\#(:x̣> IBL"55KX$'IJZ̤&7Nz%hFAuL*WV򕰌,gIZ̥.w^ 0IbL2f:Ќ4IjZ̦6nz 8IrL:N7H Ƀ)z̧>9IP~BЅBT+?*O"$R&x ?DT(Mit"(Nڴ5eIWP` k@B҈4kXC%"0P)MqSt3X(@Et&U LqVV@l>0V ` [jQ a f}QA_Ms[o[K7M/uTAApl`1\?$3cw>;JؾnҖֹڴMAwLSnd% bex6(@z_@ |*VryU2pxgU`^H%@Zv,U Q5f@t=4R!ʀM:[Өcҳfs_cWBG_ . %Kν{GHzOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4<$BMRBB£w!tϐL6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰U*무j뭸뮼+k&6F+Vkfv+k覫zx!,Qi H*\HÇ#J!H(jȱǏ w%ɓ 3 U˗0c"&nj=ߥ@MJt+ *]!K71$T%V 'ٳh~/V2=HUŹE}ݫU.ߢ^ _D!> œ<{jŘ3s2͠C},MPI$Nēy6S`oZN<榫œ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfvb92}u PP,؜x]lbwh8<@)DiH&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸뮼+k&6F+Vkfv+'I覫+k,l' 7G,Wlgw ,$l(,0,4u)H'h(A X 4ώBM@R_z?M dtA,֓Z-PQ J l]6ِ.?dXm])Oߍ_Yd' x7wL(),xf?$d~i3z]:֠ V7i@!, Lm H*7jÇ#JHŋ3jȱAKCIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*U_BIkի)@ª`t+,G>f J +HHI!{ ESjꗨ( Z+2Fc,dwVo(o?S@ m{ҔiP]pDYeMp'$AM0AI% Igb Rk'HJϚ}_տ{.| ХySJF$|o_L? T%J+ f(RYU'I$bGAB%0(4h89ՈB$cI!PT?GDiO\ބ U"(tiIMߙl@H/I&yB 9xi=$I )(NVꐀUX)BO;P?Dn)Da(qI ? $ +k&6F$t]j6~/UeS%%d EcЀ,!ኋx`KLV+H`XJM ĢhD2/oGv' R@ t@ u\4(d,a2G4D i tI,R'q4AB JN(YI&'WmѨ/9VtAIq'&,Pn?#Nr$D5d?"mu4bڝ Lv]G[@ H)D5Are2q55mD(Q2M=ED5#>@5'to 3YR &#\7PCvGg.@0,~?*m>B޲Β)EnY[ɓrbf Qf"H ZR?v% GH(L W0 gH8̡w@ H"HL&:PH*ZX̢.z` H2hL6pH:x̣> IBL"FΈ"!@GL)HLp#RȤ(GHeyL*M.$JQ~p̥.w^(;[*'JT3<2f:Ќ4IjZ̦6nzJIrL:vL0D-Hg<~ @JЂMBІ:D'JъZͨF7юz HGJҒ(MJWҖ0LgJӚ8ͩNwӞ;cSJTn)MA% y MpHê8UYQ3 UD3iVUF:5YmjY ֬UW=A9ռuZ U&r+sMk^I juX5UjY"}*\v^ll9 W/֐-i XBwgCk֐|RwNBik ֿU~4K>^44QIeo.KOĞSꔰ\tQ@M ^2EĀ@I IE` DAhFm"ɇ!,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|T}-M~2?R4S4J&2Urg:R\ pKL.)G$XJ'RX"95 ?ɪB\פfB'dᅒV4?R& CN ?LU#ө ?&!.Gަ4 & /;2cVW4ɯ.jAW)Hr#ez t@} $TU<ЫDpIO≀!Gy'S)44?bJ=$9pA;X,6RM47uA`C?&@~Q'$oL \A&X)Iۣ&:c2's~dˮ$<'IlL2ASDm 'K^ˉ D˵doM_+~&O);o'7G/Wogw/o觯/o HL:'H Z̠7z GH(L W0La62R e1 r,?HxH"~e<ċNE \" Ul.z` c!䐌bTa6pH:x̣> #BL"F:򑐌>ь$Nz (GIRL*WV򕰌,gIZ̥.w^ 0IbL2f:Ќ4IjZ̦6nzxJ81rLgO䰝'R ĝt' !;[OvS)Ԅ=:PS(f J +HHI!{ ESjꗨ( Z+2Fc,dwVo(o?S@ m{ҔiP]pDYeMp'$AM0AI% Igb Rk'HJϚ}_տ{.| ХySJF$|o_L? T%J+ f(RYU'I$bGAB%0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|矀:g/]WxMKUTI DC4 PK<# d5h&ӦF`XJM ĢhD2/Ev' R@ tC@ 5\ˮ4(d,amE4D i tI,R'q/AB rN( I& ?X&]P@V0"1Bˎ8uZ@il¢?Š= x@W|$3quk-d" k9L0Are 2q55llDϻ(Q2DL+po]-dI%L;2r@ s -L?xL r.@0̻,B>*|@r͒l-jINvKYohgoG/Wogw/o觯/o HL:'H Z̠7z GH(L W0 gH8̡w Qć5xXB MtHHP ݦÿIX^ܹ@F@aw,hL6v cGFx̣> IBL"F1b$'IJZ̤&7N&I "HjJ@ғL*WV򕰌,gIZ̥.w^ 0IbL2f:Ќ4IjZ̦6nz 8IrL:8=\:I  ">P3H>2BqOe?ІJԟ5d@Oj RЃ`4D9p҇nT)(? bQuImڇ ?Ѝ"!ZRTLoXU;}Mծʰ=Kq.*QZ!^-*!, Lm H*GkÇ#JHŋ3jȱALCIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*UY響Biiի!Q`B ,Ff ӿ[j)ǩ?q^B:I೼9ې/`6t8] 7j`)aYl9Q]D |T+.8dl -v`& V+qesG>|RwNBik ֿU~4K>^44QIeo.KOĞSꔰ\tQ@M ^2EĀ@I IE` DAhFm"ɇ!,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|T}-M~2?R4S4J&2Urg:R\ pKL.)G$XJ'RX"95 ?ɪB\פfB'dᅒV4?R& CN ?LU#ө ?&!.Gަ4 & /;2cVW4ɯ.jAW)Hr#ez t@} $TU<ЫDpIO≀!Gy'S)44?bJ=$9pA;X,6RM47uA`C?&@~Q'$oL \A&X)Iۣ&:c2's~dˮ$<'IlL2ASDm 'K^ˉ D˵doM_+~&O);o'7G/Wogw/o觯/o HL:'H Z̠7z GH(L W0La62R e1 r,?HxH"~e<ċNE \" Ul.z` c!䐌bTa6pH:x̣> #BL"F:򑐌>ь$Nz (GIRL*WV򕰌,gIZ̥.w^ 0IbL2f:Ќ4IjZ̦6nzxJ81rLgO䰝'R ĝt' !;[OvS)Ԅ=:PS(f J +HHI!{ ESjꗨ( Z+2Fc,dwVo(o?S@ m{ҔiP]pDYeMp'$AM0AI% Igb Rk'HJϚ}_տ{.| ХySJF$|o_L? T%J+ f(RYU'I$bGAB%0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|矀:g/]WxMKUTI DC4 PK<# d5h&ӦF`XJM ĢhD2/Ev' R@ tC@ 5\ˮ4(d,amE4D i tI,R'q/AB rN( I& ?X&]P@V0"1Bˎ8uZ@il¢?Š= x@W|$3quk-d" k9L0Are 2q55llDϻ(Q2DL+po]-dI%L;2r@ s -L?xL r.@0̻,B>*|@r͒l-jINvKYohgoG/Wogw/o觯/o HL:'H Z̠7z GH(L W0 gH8̡w Qć5xXB MtHHP ݦÿIX^ܹ@F@aw,hL6v cGFx̣> IBL"F1b$'IJZ̤&7N&I "HjJ@ғL*WV򕰌,gIZ̥.w^ 0IbL2f:Ќ4IjZ̦6nz 8IrL:8=\:I  ">P3H>2BqOe?ІJԟ5d@Oj RЃ`4D9p҇nT)(? bQuImڇ ?Ѝ"!ZRTLoXU;}Mծʰ=Kq.*QZ!^-*!, Lm H*GkÇ#JHŋ3jȱALCIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*UY響Biiի!Q`B ,Ff ӿ[j)ǩ?q^B:I೼9ې/`6t8] 7j`)aYl9Q]D |T+.8dl -v`& V+qesG>|RwNBik ֿU~4K>^44QIeo.KOĞSꔰ\tQ@M ^2EĀ@I IE` DAhFm"ɇ!,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|T}-M~2?R4S4J&2Urg:R\ pKL.)G$XJ'RX"95 ?ɪB\פfB'dᅒV4?R& CN ?LU#ө ?&!.Gަ4 & /;2cVW4ɯ.jAW)Hr#ez t@} $TU<ЫDpIO≀!Gy'S)44?bJ=$9pA;X,6RM47uA`C?&@~Q'$oL \A&X)Iۣ&:c2's~dˮ$<'IlL2ASDm 'K^ˉ D˵doM_+~&O);o'7G/Wogw/o觯/o HL:'H Z̠7z GH(L W0La62R e1 r,?HxH"~e<ċNE \" Ul.z` c!䐌bTa6pH:x̣> #BL"F:򑐌>ь$Nz (GIRL*WV򕰌,gIZ̥.w^ 0IbL2f:Ќ4IjZ̦6nzxJ81rLgO䰝'R ĝt' !;[OvS)Ԅ=:PS(f J +HHI!{ ESjꗨ( Z+2Fc,dwVo(o?S@ m{ҔiP]pDYeMp'$AM0AI% Igb Rk'HJϚ}_տ{.| ХySJF$|o_L? T%J+ f(RYU'I$bGAB%0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|矀:g/]WxMKUTI DC4 PK<# d5h&ӦF`XJM ĢhD2/Ev' R@ tC@ 5\ˮ4(d,amE4D i tI,R'q/AB rN( I& ?X&]P@V0"1Bˎ8uZ@il¢?Š= x@W|$3quk-d" k9L0Are 2q55llDϻ(Q2DL+po]-dI%L;2r@ s -L?xL r.@0̻,B>*|@r͒l-jINvKYohgoG/Wogw/o觯/o HL:'H Z̠7z GH(L W0 gH8̡w Qć5xXB MtHHP ݦÿIX^ܹ@F@aw,hL6v cGFx̣> IBL"F1b$'IJZ̤&7N&I "HjJ@ғL*WV򕰌,gIZ̥.w^ 0IbL2f:Ќ4IjZ̦6nz 8IrL:8=\:I  ">P3H>2BqOe?ІJԟ5d@Oj RЃ`4D9p҇nT)(? bQuImڇ ?Ѝ"!ZRTLoXU;}Mծʰ=Kq.*QZ!^-*!,!,+H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜџ@8sɳϟ@ J4&IE*]ʴi7BqJի@%ʵׯC|Kٳ']˶mգnʝVݻx̔I߿ ޜ7È+^̸ǐ#KL˘3k̹ϠCMrmۊe zFln]۠&'{+>nH#*C/ܔx(oNsoտKdK `?A5TPYO<^6(!}( {ʹI&IAl}1hFR/@D0#]B?|H&5z8$P@,$؀(`c%M$$ x]B%LCہ44%yDpO}x2TY4%,CIН =3 M3f"B )I1jRIrhPODmr%l@:PBʝx,v gE4 z4p3$[Z@E<04I w-{bʟ}Q =9P?*KmfzJPb#Ee4GȌ)+Q@'[$\a,wI`IdIMzt~riB- j % UE(AdXL%4g" D|aO @a%銈?hJ, ̣L%=Ԇ P2 4 Ay[G6zDcTP:@U>U<hTCLw<GUЫ%CvSl*|[fH)d#. b]%pȍ)qJ : $UQQNxdpB)Гx '@%3žK!K?yP:G)2a$&F ǝ[ø+WEOc!1W khi2J6{UeDb~zcyJ)L+?"ԇ5 #wu}2plg)M׀9    6wZt|0`i? z6P WQ Fhq6W8!xxQ P@ zQxNքy1qOH0 zeQb G88 ,HsYxz|؇~2jd@gGw &f ytFS|DvwL5fYkyx zL(0 rvz7װX &\*xQ q@kӈ ps41;z a gbIA<36@hp90axrQJ=(4qʲ p <`I+y#! $r3Jt~C1&p.V$4& C,DF .ё8(Hh4 )|wE ,|(RT OB 97Ј>qy W"1C RT+H 8N(--8  6 P`-.wr0`9eQ A5ЅA}n-@P` 11{" S[X"%Q o_'+`7 8:1eO=P|ؚ& Rd @}I1wDM=5STI&h`?~ !l Q pv~@#qޙl[ ԙ $ ͠$g s1̩)A%[   azц2&11Mgp&UU"1DQAc8c2  } 3AF٣ 1 G[6f:"Bæ5W|T,B r IRB)bYHIr} eC CYD &ѓQ ু*sZp|*:7` :pF71M;( ࢦo HZ3$nRc%Idx;Wji>rQ 2p P A1%2ia~Q= AA"q! 1 ? 1$qm >i Wh>vP y`3T:<B41G" :R 0D+! M= y Hh1%NAa ?PP IpYp 7Էd&渦ȗz] 1 8wI [|Zbzq^r(Fuv" QXpi!.avF3euvzX2 i 6B4q r ;^ r'+Q1Hr )aRS>FI <J1 | Aw'Ih4 QrA4ؐ97 K#h4B6#ZH<a 7f6UH:!~ #CM#YEq? Rv\0!L, H3%-e:  WE1x7KL0 Ѯ;q(}(wr(<"| C@H<6xj05@}?{WhzA6J!BHw  @H2B3 V|ʴꚷxL}v sk20p ]yLIVxuКp~8 O=:٬r]Zž< q'U>Vf@Ċ * 8}uaWLJ(cNreB "-{ azt)I2MW0N GիDz5 pL !m vr R P m#f3*"`X 9:`) 2BYVz1# 13܋k0(Q l 1/!< 0+ Yxe'A

UP?O!Q]G4٠1 "p5 +|:i@ 8_7Y8q ]) 0+'a< &J5ܶ! 9 >fOX{#9q.[H2+L@Cg0 gp'ԠBK2WȻg>@&R g Q1 1 ۱0w$j0Z :4 B[rdŐȒz1. oc,Al6JflBcEAJo%/q%. Ax }AX/v\Ѕ0Hq fH}kX#%T{ p e~Tk0 a8 B% QA %jD&#RA C̔ʤLNR=pQ" '˂pOA%JВKcE <@P=5 P?ъ1)JRD@MB!LMr?81&̇nt4R 02I&͡bfdNf)h\$Є$LKJ+M0|(K 1Q%Ktʰ(IFr!hT(葒!dRbUEZ1.EK` EW/,% A!U4O ?Icw!B)[J@P6PdOBڂ!!EhO!Hhy&١WrH[e,NKD?^QaKP>aq¹dkW9ess`?ZЃ&t }hD'ZыfthHGZғt-}iLgZӛt=iPZԣ&uM}jTZիfu]jXZֳum}k\Z׻u}k`[&v}ld'[fvlhG[Ӧv}mlg[vmp[&w}nt[fwnx[w}o|[wo\'x ~p'\ gxpG\x-~qg\x=q\#'yM~r\+gy] :\3O57kwO&4\t%(w'׊KI z(KA U߆"B,a R!R/8\e3aWJR bA v@bb=U? &D674JycH*8 !m<` 1Nh1mqg 4+y VzP!NW=d!?j#5dF#(>Æ,B!}.pg0 w& Gk2~Ⱦ+ ~ASp> )U 9Яy{oqK# " @zߣN@@b=[ 3JhÚ 4 Xջij Xh LAHhG:S?U`{&>hю#UH ( |S Z9d,`L+cqAX88 % Bx R ,L3IN82QDp@ $%É; BZI4CI8CЂ})c qT'$4#=HJ>b?# K XN%bT +p 023R2.x.xѨ\[a H>јx ?P`C<H HCø xaQGhD  nx ")(Gr0 8 HUt <XR*d7#H"(Zɂ, Xƞ L^L- dǺ(.@BSȯ‰C$]x3)PLHJ'k,Ƽ :͠Dt˝J G@0k͇ۼ$M $ lz@T (Zxo4*$tJ1p2TGE|(CUhא2EυMHθ(K `SD`Q HЇPj\9<[  9]Qm9C2IA8Ѻ9 eL1ѐ! KK̷#܉ٓ U%Q^c@1OTO(f3SLNyRB#T_XT\SЀLJh _/<ԀMϠװ% qX Z@Ǵ 0@_Y8wz".@Ȃ؅RH cTLFEᘋLR1g̏TxK)DĉKR]TL(c)i X ٨UYY(b QfcZ; XxL VE#uj-Nqψ dhjRPՈ X*ILUm ן \ K|Mab:ŕ]lE-TR0uY;=u6SL5W(O ˚|'Shև0NL=ؠWNj\рE} YqK⃡ ~B ۉUTч( ]9[\օx ,%%4WڷÝ5Ν k0*\?}RݍGm"YxهDt V2 `SBTj ݸTZޟDh[][nݧ ^9=8Yjոa$}__ߐY_) ]J!RQ R5`8Ux_A' \`8! IP_ n(ޠh04& I2ថ`2؀p^Aq # @PpP aੇ-r!Nü]\0BSESìr@RK7 zcpS .s $"ֳR/9 ^ƉL$Uh/6]x)M8Nb ` H>% WV O0/)ޱh材)]:TC2Tk5%/F]ˆ9p) g »Eռ9)8]  MvG}:YE T9i҅)z$%CI0IR؄⵩x`93IG f I1O cQȒHvo$ci+KiVݸ`\:K!y0XU2ēiy2.P@bg(L&r,i򙄲 9rHЉ,α 1H8ip0SM؄sa[>qH2H)#z]> bۂؓM w@w zgP1a,ˆ7ǁ?y  9x| 8oHxQeha_yoyyyyyyyyyyzz/z?zOz_zozzzzzzzzzz{{/{?{O{_{o{{{{{{{{{{||/|?|O|_|o||ȏ|ɟ|ʯMxww˷{6'{{/}?} Ÿ M`s?%}} !,b3c H*\ȰÇ#JpS%P3jȱǏ C (S\ɲK<|I͛8s[: J>*]ʴiIL>+ᴪիXw"8@֯` Mʪ+$hӪO $KĨv[i*{ g+KŐ#-&S7! +)M qO^ͺװc˞M۸sͻ Nȓ+_μУKNسkνË7~vӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸뮼+k&6F+Vkfv+k[\}g)5YыpB,.HAU''-yC"(&' 8L&nPᦾ ) ? v&( +\i d1\,caI[D42)0B-X´TWmXg\w`-dmhl^ ݦ$~!T$șB&3M3 >PHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ LÈ+^̸ǐ#KL˘3k̹ϠCMӨS^ͺװc˞M۸sͻ Nȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6裐F*)O4Y5d)/E^SAL `3I$' @W`ˏ0kA =ʐWhʣ ZP z+mP ?8&cID.(A򃌖xk,l' 7G,Wl_oBI:,C A@'Q"BT@ @sH B@b'p\aI& utB "I%Bx09H;}d@!,sG". H*\ȰCJHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ LÈ+^̸ǐ#KL˘3k̙ΠCMӨS^ͺװc˞M۸sͻ Nȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& B $#IVhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|M(RC5 h 'hr4?#r҂7lj(1 ra2-a B%b -c!*\, a L+f+B-XBnd;+k,lW,0lP%Da* B1gP"4d BJ#!,%pi H*\ȰÇ#%ŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ L8m #P!58 @ nka cCƛ\)yBR6l8i _l`УK,]5!mνËkϓӏLKqqt{:K-=0aLy&*(@~? D MA7X) q?5@DXCa2%!,%pi H*\ȰÇ#'ŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ L8m"$)4@HfڴBC"`jӘ]iBOmyo _lHУKzn譇o$yËoO,X|+špTQM>ɒA]vAx$ @ ~7(k|&@"?Tyq\st&Ԡn?LGˀ!,sG". H*\ȰCJHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ LÈ+^̸ǐ#KL˘3k̙#ΠCMӨS^ͺװc˞M۸sͻ Nȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& B&CAVhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|Eb-(PJ СxM hri$#b,p&].2Wl)C^q*Y TP J*Zk ?*8&cD.s*(ā򃂖(;覫+k,W&Tj? sB0<3D4RP%z@8?!,+HП@*LÅB(bċ1ZqG ;($ɓ#STr˖0Y|Y͛8sɳϟ@ JѣH*]ʴiЃNJJիXj uׯ`ÊKlQHfӪ]˶[NJ-i} Lᰕ& )pŁCQQDT!(tӨSSG.Gx3 >|*1IȓMl&KRۘEeڐУOPa7ź h?^k3fFduE1(̇w(!@qUhᅅI%I%ĥƈjĕɉ0(QuC;o".hHFU7" N%)TViXf\v`)dihlp)t֩%D5duI&% >T| 5D:5<ӣC5֜h)ԧHEjj)0bCkPXJFvS%|k 'uŢU%3l! |1THD"CjO%3,nGVM*8s (7kS򠮲L3dlV5nO*@!p2q1M 0`l^%L3|RS|lqQr3 c;3LOJqA[ I9< /NU8 #KM%sL6,2`)ai3}o@ 0L&@@|L+@8Tb(gr9A.㛌>U85>zlMעE3|@63 :^Ó(4@(0Q_@W:*nI/S#NRs (ܒJ !5˨7(ò h`A+P}kJ%800jD'5^P`(n ȟZь}_B,H, 8aʦ7OP5)n WJπQKx"X b.i*d%q g |+q6% |t!%8|JJx J|g2x3z3f!JBk;E{,`<JYа(֫ZzƊ{ %p xY\٤6 w~Tg1J`O 'vbt.ei2@"'"d8*$jtL.FP#@ E>O'%00f1 aǐ Z!XC0lp2lPxUQ^Ő-"w?AM,ԀAI t" -,U'_:5sJ HXoS)pA PR_= ОXNv 1dGu0v nNPɥ@3<6-d6"L؃ 1.oH@D iX>A*!]2?Qe9㋽HC51\s#Db~0>ani"ԍu{mPB @tyA2в##otFk#< 80Mĵ5r~ ` o$i D'z׀zuCI[$9mݲe$ |P܃Xdh,}`w p\hqw:ڒBU.*Qʫ_?@dC1۶^/4nbt}t ȀA9/5y5cF>:)Xq-``C|DRȀ7rXG{J1 D9'B'c?@?<-vc9Fkz6szڲpS<@ԁt 7M5f@ zSu@*0 a33GS"|c=Q,Ӂ S0`vD nW&v4o۲H ~WhF1_we5E5\`tFSsu < Tg|B7As:P0UFr>'lic`FȦ8w53GmeZvQJq$ 84ss8G7͕8pWclzXaVzTMf O\e?afclrKl"CBQgq)e6[X+  662gV3Ws6rngmB>wV,_-~h@>36^3?*\^)esdEO()tZt6odR& SKGUscGg?s:ͥd5H.̗Jϧ9Q^ЕI}DcGiZ- M6+zuy:;A 7 V A|M M6YDQFlO0l A"Ad<|0-@` -S+T+;$ȋȊȎLlT@,ȏW6/YÔl\ʀ@+ } l, ," )˾((3` -p@ 6T`ņ,/p/ØT݌T+,W\7Yď|Ʉ<>;,^, ")B B2$U$P,CҹAQ@71 м\Mί= MV4,ȯ#'@]X^!у:Aӎ0 "rƱ '2$ B,'R0CF<̈́lҀY@,M)NDM̀@-R6,S|L P2 }"Ƶb ` wƐ6ATytb:7Q=EOP21b^s]?є $LmK^t A W 5;l0ί/VıL&L1'vmÍ=ma )B$" |MQ}D@R5DA<ýTt!ݼ,!-$m%<m  = !B ^[<$M~N^b,Z} np9v' z8Immׯ沍ukNMP؏8OWKNų~,\˱`-;!*3A]qF|-tϗ|ɲ ݻuQ-tJQឭ B O|N` D |\"-q1~߂L+>ҬN|2- !6g ګʹQ=Aƿ^]$nއ ``0 n0M^_un3ڶ6(M`P&(a f|"~\mnWhA=͛ ?4n+.F@<30m! ,gY<*Ⱦѕ }-&߃,?ةOÉ+no/WW.b,@vo#iJ  R} VZ}J$cȑ%OlIC" $yg-w% ;{"Xŭeȑk"c԰EʐB9$FHG RQ(OL(`44I4g|@0MH*&qHJЄH'J*sN:(7Z8;#k@ 5PDmϷUtRJ+UQK3tSN;SPCuTRK5TTSUWuUD%9!$RZsյI*A`c@`SF15OvuȬ#4D|bnQa5܍&1Fj8]A\o4ŸD_! 0%2w'a(bX 0>##7`C0p Q,Ř`i!F_Yjbe(>weeZ469B[nVނ PWյc8`+쐭 2چ~o&Zm!.\P7C^JX:z!#Jf[QP"F6bIY{Gշ pm! c!W(Nj{)`k~42peZOnd12ik ? dR81NJ@rce[,N1m(?`#bC-uX %y;*|K0Ly LX ,a0;alf$MX 'o\!s-[DB6PV<᱌V3]/[9 De1t'PHa#9; C.Ђ+xAi1 PPZI\b(_ۮumX*IYbҔ6 LXO} E|Pr`*ӊY)`T3@;GRk %2X'u Mi+?tP5? %*lK*] DlFO/؈/Ϙ)qW_kRGFX3p U (<:)@/Cu T2ilnLPcH[@oC$4Q\ B uD)~zί٪[v0ߘ>=,4,Ut8zJ^~#7tY" "D3Z|c\ Ap[ y#2 C#A n~Bj;1 K E>MIWz)f˖|~ & _P7_640̓ZYXV%;LY[L$ONu7JmA`a1nܲ|-ˮ։v @?l#Qƨ |J ӅLpV٫XV-dYܭ@G9tI3Hd0QFأ\Ѳ&0(,y<#- ׿Rĝ7xE/e1ʂ,.u<?NbC)rl{ꓗ߈ۉ!5%vK&]& i &IxAJ>mn{rF TiI0e,Ff]J S^U"PeNljE% ӡL&: Q2SNEk4ug@yd>H:Hr좙O piH @@e \a@ <)g8@|oф,J>A"|ka.K*B'LJxH|yB,BP+B0)0,C3AZMaRjD!CpA#0r0WDhD [pB&`eH) XLċ@% 11S _1D` 0)xızAN|+dX^E!#zA s#8iO*lOYhy 櫒ui_3۟׺Q>X;BF0DtJ(bpq /рf#)diP2Afp{lj&-pxIR''NpmË8Ȓ%E2:KJ$X #aq ܒ{Xd's ;<@d BJehk,Q)#i5JJ 'yW(xe0ڨYIs5JbHu$Y#8[v Lղsi!p!Zi1*+N!ɘ)FM"c"0Ȝ$"Л,ʥ "Q|͗](Kn C (C+2+#%E"A ʩ*٫!ҧ#"ҽ≸(Jmqr>McXYs7cCjXLA4]U4s<0UXPPS@[žOhcE=)`Uh;g3>3;z]aebfSU1"` z؄?R'&Uڅ(n!T_RQ]=:kVڅZB[Pd"M\I6 ;41Wh:! bt`b14#Ti8IcDl$ Kj8-$dO93k̮݁Na9u{N|ۮI.h54VP_qT73wCD| U:4#yTl۬O@m2̄MxcpP|Mc ȵ([|bSRlɭtp "%K3Ubh 6xi(F6N*B^!c8.f$X?[pi&s v;n>R5PH$鐎HwYgWI1 I)uXdvx'Ydp̚2q<,%^2*xq-p*9~(d#X͟.gsȧlM?c 햛"KT`)$1*^?yb㜰D'"xܥ6:-1ˁ+- Nu@hnTlgHSfPIǶZ ~k"*hgKXvfiP _lXdpgb(~ѩzu\ylVn%fOGSp,?-~G4]="^C=s`u"Hkʲ.x0:FH?[8ocج˲hVDx!XȥVcPoox L P&s̖V973ӞpanҸ a\ a` cLP >qWKVLӀ4TdP4o rqdH rrrjxk@ tqٮr51MwA&2./K$Ks\eL E,Sꇘ>yoy+t?Yl>4HL|Tr@:01L> QB'R\1BUWdn2Ec(6=tH_DGR5栄B>Ғ aΏ hJҦJ%[‹Ś-10Ȝiʯ1'NB !2dW`ED.,Zt҂u.Z!ފe11ĎI2Y"[3YX[D09tC, l/hedlv 0tܽAo_0u;{0B)|`˖raLn-[F$П+ RiP##M"?2F%D-D~M?} (JFG8ؠ3 |""V4L*WO4T|Jݢ3T4d$" -T 6cG - ( .C, ,ʙi;V2I%}Qi1m1,d# ` c -Aءmf)ћUX& es \$edyovƙYlnM&@wʑ8\!+bA2ġ:I|b%ڵw-Pf5ւ{}R =ll-,iz/?Dܺ0m7 -h>}-`hǝaej0+z`:pG; W@Gʿ "( TU2~-(m %+)@N({b;s4p idANOl6 lp `OJ)!,0^6eEŐFf6+0RAA]EZ&h]s1`.)O 8qt1tЂ$`xXS^6N0q\(~p'\0~(*O&H"', (#'J&b0 kBOBo0g "X$aVXjI[J1 Np7.wd=A{h!,ftBWx Ph4(1%Le>|<1)M" @2W(@0%e(Tf c @6y jn2N6/B@99W̢O+ KP68ׂS*Y80l Y 1p6 ǰf)\XBP2i$ `5ZpʨsbCuzVwu]ŖҿjvF"R^ ~P'Q-@^ D` q&7ctl:=T\ɸK%yЃRj8Od43f>JQ 0@_>C-1 uS8B* Vp($ y(݊ (1x:MD1)Ʉ 2Z%J]k\*J~1dS'09K$ p pdlBlH`_B(\:]Ѕ-PaߜK18 BLEd&K6&pp:6raG¾}`{pQ,bL4qZ~2Da[Zs'ZkD`9mE PA4@7\.& 5΁B_Jt&ML38l >ёyG΁1S˖KleT&o,XHd S4+GGk :HDcDZXS]!hq0[Lsl5#h%x&\%s ϸemdeV6Mě}&-&\.73+RGa?r3dlHmTg ED( g2Q3-fF9Ѓ.]'R \/. h.P 1:9 qTB@w.ef?;ڙ!.i;r;uVGs?SL#(םTGh;yœwň =Ȼ0.Px};0:zU'LؙLm2"o6UfP.j1 ro@ʡFz *7 Nqx2}df$b<>vFe0Nqa8RRh<ī`%%% B1B#SC"F1311#m28=m3He2LS3$7\JF.Dژ% \7l.$K"jt2-0j1n*q` P Tn~< v5Q(A!o^4<:C1C1\3\?=KM-4P9/ i+2a)(`}G\ 2L2C+C+3G_ȥdeG+{Iy\AXF -D+zC4%r._<DHBjX+1U610.Y% $,J/nV2:ӜJ* 9"EKlRE"Q2"#ZiDzpC30 |<-kmTHs̨C(JG7oFrGT)A*?+eY-,Ub(ѥnC sh4Kj ?;5/ǻŕ2GՔF a dZd\ f -H'M^~i>ބ^M"D4*óT\^ 8  EW++ C\2oW=C 4A %[w- iEV*LGyB{r{; ,(cP6|=m._&di-\5RIhhAE+NQ%Z qahרGe*Z՜ā(_Zd)nASvÆ-q%Ȃ5+U-QjM[v֪c"ꖃTJl-X[kTe BS%I] d\cjX W+VWd#P6}ujիYn}Өؘ[vĩm6$Le_zTvn]#Bɦ8|Tnm]?H}o5y(lrOߟk3Dm_&L+l<OO2+@5ܐWBP;D KDbejOB)`(m} e #[D&Y+?vt*,RoLf82<4D*|8圓N b<ܓN}C@BTFD0IE2=[J-%sTKY P2RG?5 =;<}V*0Ǝ `*6cZ t"Լ EЫ [IƁO4qPbݖ'1f*A|EX3+K) z.i&i,eۆoh o,B@-׵D; _Mk]<+H[@c9.U؁SfPWRy];ᦝYZ@Z2Ę)ź: *Ke2@9̛C'$R $njcM$.f.AMRAYn5kTnJǃ/Hs#&b Zj0 l݀ [6 t#=  SS)^ZC?FTT}ހ[4Pc`Pn9`&UaN^%ݽ8/FEJدp T|E/n.šL0D h7]\\_IvC@+|0pA zi)q8̝, %(1gB<@]RSxWM>dL1T)( H,e-gA3-(68g<Tt#/ך?``$)!C5Ki,AB ϠDrғT%εEa] @;cd50u%|yd,'rj` [+.#9[ \HcmWDZ1ZzFjZdoBNLM*KhAd &~Ԛbha@)(&lXS@@*e.j@!CᨔDk g&ږ~>j,ˋ1)B)IͤalQ? 礁Tް`dL߶e j@dԅvhjK \*uɃ&f1\djapȃyD̋IHlGh,.HY$ϵI/) S@ TMXL^ʠH2n]`2dA,+A7⩰jxo|&8b&^|lP^`NzR0Nl “Gq5@L&$pDA&eBx@n"$=DBBc@ccT#=)E+i$FDQ+Rscs.S;S$>UTQhLULueʣ8$TGb;dL$l0t+^EmHIqGۣ=fXtB^4X+JB=@D<5WUC'@aeWh-W[sMVn0#^u ܧR CZ!^cn^^PT_U[T<@$aJ@h<4O&ħ 1HW2x*-n\M(f-K"+^jTU ʏl4`3/Es(ΠH/G8i(P.4foCZ3 8lD !F ZdM(ɳTF҈UAkK[Ǩ.&cRg$b\MVjgFF(X TT 2Y ^IFPUaZSh YS JTe ')IGTVxu:\ Bl%C4dWUvb*94ǼfBB7\mpO7J4.J/G jfr kčATHlڋ-&/5D|6ag!k\IkގuWzf\͵EEXhAW6f4nxcVxxw:`WjM7q8cu1ő LqyY<,O,KBh?>(  L=3UyN~P:B$>Y2FsANȂRF:h6&^ `` [a Fd]xeE| gU\S9 h]dm#\`=` PwbhA ͡TMWc `~qF>['IOt4֞xA2X! !Q`Xli}e| *%*M |/F*Js;F2mIo_&)Iz{) NZEdLj jj\9 ˕%hk 6J6Jڗ W` jZJ  toP5Jܠc ;4!F;X9hF( O Xxw+!/D9ЭFTM@Z .6YjJ0tB!pҁ"6@M\b,kz!b*5fi ^!P癮@i$l*qbZ픩)*%.  I65̐f!lQXAȘ"{@ U+XGf1"@|l?PwpPzَs%eL {|衡 t5)::oYld@R0M+6 BzJ6&Cȉ<6xBJF@jP`![ӒD(`ke&Be;7hBQCXAm/ϫ#z6LL_\ f שă%p6!U@@[ɨC͐7Lҭˣk5±( D;x<`aS?lTQv؋؋c b{7i#`}Z =0&!EHF ta24~N4Y.0A¤a@b3zͰ"\T``-N»סOb} 'f:aŨTL'S9µnma*JZWǫZy懠WDi*{Q]._ڟbF\ *FhZ v̥)}ĵ3m90\-5@-"O[=])ߙb_"(C&"sIP %_/@("  B'h %8'ܩ0A(2UM*I9'˝b)*VX@|% -*-W}sDЁcbd@rVX-Ԑ^,.A@1_"V `|cp-J`%i1@0DoKv7 F{ TI% A˕@3ȔhK. bҌ3I-' QԐ €ϕT $@.:ƍ`mlmpdWBq6 V)hPc4Y 8ҩP]wۢ4 9CP3ͼ%6B(Ib$ 9ґʀ.UkB"B4< _QJ_h h yV)fjD.Cf:1C%fH6#0b-@%LOVbI?`@ -D *3`В {zU ĵI}Ā47UiІ(^+JxPxcjbLC>& b4V؄?PD$(Sm=1jWK@3ZU*dH@zf1 i/U@aJQbiż"fXX.2X&`̻Фy,aȀ3'4ZTRX2ĩMlA L`X/n8Ӄp|CaJ:Qvsc**N2Rq4:뉨3SQ ָ&#ʖq E0tI Hܴ)x) ab[j3N- &$<;1A|"q'JKP8"Sh}'?[tp:=A׵VO2<`Z)MpE-i\uzVEk@(T14B)f`k@]"F,ڸpGa _#R;wv#bKz\Z,, G|T " @1_"@U$\1_%T,  fp*YK)3`o>S0.p>`cuÆr c.3(Y YChY`Љ艡艜8YX&"zJȉX(2؊Q!x艼OP<i03i?5pSӄb(cO OPF(Xu0=91aM@M0T+TH) (TT@ ؂b w-؉$Pq!9XX9Oh`2V"9xjl5s=GEEXQS`Np%I0eiM+2O x!#0d=A &ix//09/I)V ,T8cXV@V ؉¸Ax.)9I I)]rs=Gsa&o6VqP) PRE# ʰ&Ј9 !N婞ˉhO$jAc .k0)YA+`MȒ:O)WNJ,`i*o*O  ډy+zI 5l2` lj\me_с1#;_a o>SzoWd/T `H4&#PkSUQl 'h z8wj jvov`ꈃ}:z%\{za:֧>0f_x 0wSʆRWGʁ0d;dꪱ5V M Aɠڡ㏔O8IeS#AH-F:I+T⚚+*:EʭڄC%R{RMH 55Ɛ.{USi1p5Gkv/^ &=&pH7r0[E4"P15#P'D-F"P5!(&QvO#-2:] `0 pP/t$=EŎ9Wy YYM菘IZ8٠*>`."\y^eڒy8*ٙS/eu C&qkl]Y'k*׶!P !#rKt['C 5 G⥔:W@W/YpEH FFIC$Uר0w\7EZZA6  гU/9 lF|dYOVIƐ+rA&u_ ԅ[tP9ؗۨ } =c# 2֙f瀢EZq}»2Q}C8 /C 6JMĸlq뒡)<߮BOX.QF~͙KkGtlC#MR=MjdDf'_Ax?go  "- 1Kו+`њdLA"`5\@%&DkX>A IѲCB5:[WDJpңdbJDE\YM'ne6\Vru V"K ܵsfYq'rօ,Ýz5z /pa Ѥ7d ;#aH=LFXw B+z:b|L7O>]JxH]-LzhH-2s70- JwOc L1X( ]$0"@!p ' <͟ۀ!>zsɨJCj=qYjhjB($ /*J|,(< Pq&^J&FK+ &ٚĭT$ú 7T,'x!Za2* kʚ,Q붐fbߞ ]~f #XT`j'89`o@ +* [G-5T6R3*GsVcvI0F]' eх!j辏3aP-yb` ߃qW;1椚,6|SRcVenV;SGm,D6BFV+IfT+3lȂ\r̫'9P,iz6NZQZg|gcbI'&zv4# wp".ÅA{]ġH6@jZ)" qnd@㛁<@tӨ!"0.t)ߣdUdqF{ʱ><om:?Zp- lk ^v/* K̕*1&g8#hfF m2IzJ9)gh&%i;Si>9f5oRAɸd\2S8 `I''JQ X8l\ xط\/ ":DoQZآJul8PAtQ ᐬ+,H'.ȉ`RD L.Zx?4/$z&47Pœ/Y^S҂-^Y% 8`ԅJ,7˜LA%$q[9&d)X`5˼X9s6$LEk4UƄfL)9!B.]ױ-v -@(]HOR, T 'l 0 ;4)*&Z.YPLp]/M)jRtvEi1VDz"2D(B-AԠURrj \X*RNV5EfrJ/[ʙܨ a\_[)O_ˁU=m$+X&5 Xþ/a IMԒ&XŖ7Mmj#ZZB%mkKtǴ@la[њ':nrA+6'-rk\۞V0n@{Mh#M ",[ E*z! v׾m}{Oo_v#v}r쓺*™ A` wqEy$mpr|5?LYߗ{ 0k5sg\f|J*H0@qc)@ /H DHf PHIh5 ̈́)F >   1/ 78TTMtCaTr 5lU卧@|cxćT[.eHK@'9X V Ò PÉ7+;xSfPcBӘt1ziPrOIeS”||JP , Q*W}(J &5D(]XZ]WAH"XIN; I*E3 ;D8YJ0cЫTQp%7 v{b,=܀+Le=kW8|"-`'Uqul-X1qR -# đBқOG%cd#ݰ6*=ln8Уm^ PЀ2OYq]J%[ W ۉ !US5`"Mu Rj06]+)*@5ꉥPPKD -h$SYօ!fmPaaeqۜ YMh \xޮz7͈2{PQ9ܫ ٝ;A 8EA2<0 gYÄ1]ʃ:gV9^3P0b>=_aܤ14#vъlp0p0#"HH ›"@DRQKI\]a1.cWr#V=IH#.26@HٌT.1@72M+0AWh ͎XQd,I^`8siI FP!%r!܈CWa@!)Z[S/:M`Q܏-$N !^$h"1!J"[#Mm$M( E 8@hG LMOpiK<VׅGLJ@dh*% )8e@'~"D~_Fm b;؏y (ftB(tq ೗((iD!hel8r\LҮ-1"y-^2"-kXpH--2(.®")H7 ;k-l9H0Z !:Fx0a20n'؆=C|ʐXc,҄ HmӶV8. %*Rl$-f6Plv/`tn/9.Yoc0 Ɩ p9 /p6>w3Hаgs !4E pQRsleVpJ8P^P񵳯J8oUe ]dW6UL4q "d'. c96b)"+Tru\P[(O2"riHr21pcUsb Pd0';QO0`&̾t͙2s*zNL'lf(rZf@EʤB7 C*!T;e( 0b@ rP6 HVQг+pV:\7ߜ#:m-I :Mg9fp+q^rL k3v 4>_8PmW'G}LU; 4 Iq[\=/3_\w!/ I`xw9yw@ UHIj<繿Ϛ'<] 8OnFáRӼyiܭp_8 g0]gfVp_;aqr@[Tt%ͣ`{zg^٩t a´ bObPOhlcrɿO|X\D>ƥEl({"{Bm'(?.NC1[fS \'0ܑ?W3x?1\]IcHfPuePJiYWUe/STf>}*4iϦMF%?)JT8e_fZȖ*L%K$ L? 7N%Y3`*bԳ<^1@ST:%Me%aPl`T* X[HJa۸H+0b+6l4O|#3< T6%4N[et$c $@P @P{;.q\F$5n@d,z158 w᷽(ĕKOwA[g0~7+vdbQ%8 LjM])ӼRV (IBADV*8B "!DA5'4LYFh|R 2< /%HW% R$i$-3L%)#=-RR/%@\haa.3&6I> DD6Z$s,qK3θ5B$V0(hx2!訖f ! +#Y48N䔉֚. 07V&5D`!ͬ& -Ab Aт2D:B mT@`@70z IJC^{$ )*# !)h x 9%J( 1|R[v+4sb 2B( HQ%|bC*P6IψKi QCUNΤXS%G#044Wp\\ 0R 2Ȁiy ?2 r3RI\$@s3yyp'mKCΘIC/8KrX0 i* ] m.vư`2b -{ĻX2 &-bINb.BjţWxc@*$!pa X:Iˆh$9$준eGx$e``f$dD5I P&*!`8) B#.pY3#QQр H39{&13u}Bb%(Jq0 X0o"і!c.%2=H1TƂD&z]l x[v:U qꥻm |C 0N`5yFZ=C@~IMBSAuƒ%J<ĕlVwZiyS̑ %&2H7Pߖ35 NtRK',#$D$i=M81F X3|Hvq#M\Oi)5T™-1 H,5!Z1xY$@vE&ImIыp)y $6lU{` Qu!lQ'I|Dh@p9%!|/=wf%\' ``AZ\Pe{ޓMX䄥 4'Y"?"2fl7GrE@`ibfWh ԚtFRV-r@3 \O ϭ=WNpA o(^VEY \E R@&>aѤi̘7I[PILH?*fzUFu1:[ԡ+arjV$Xi 8ߨ)'xk ".}2.}K5O\^܉dܖ̨s.% (H7%"BHB X:K>U9GH N &i@!wM@H,thJTEvIƐO+ HQr(|Л؎AӢT{$O#N@tD׺ ^%[ >u6Bje r- ŵe[!@W F+Y3i ]PW(ҁTHА *(-݌h4ID00r3(NC Nj1 Bz$ \m2OgsTv>UqI3Z厉4' "`[F<]ȟgaeXa* HE(>ADl7KUC@CG8l~S3k߸0-t`ktq KkRխz u&.kWU`]7MDGLY5UJi@ݑfY[|xM $LBC- 3,NS% \\Ε H d؍\HQEľ-$;aۤي S6!A @# TR\Adb ؁d%o'! Av؁ C% ObRel+R MF "` Bgʨ Dq .9 Qk2dE;8BbiH Mi`BBJ \א_$ApA-hACJD*A&㏀#^sbSbb8>DhECcDDDhEV-`YS& Q0 R%VHk@x'pB)o@zR}As؎/l ''I|'xs܎0Cz}@ miXR4@+$lٵ%dTq^)BYMQHŕ@'4mѠ2' T1 o qH%#BtQ@9rDKN,) @ T[5hI03HSlG@F1hYYhCi<O x’ [<$̅C)yr_ A.*@-`lphϳتQ2@. 먖5t - + }8|.`kzـ%JϰDI/^F0q@<zVVb,C|:E PC-BRxfLh1*0l+,ŽM(Žž YmA5B/VCSx-`N[mcOa0:D$QI8_(pL(ԅ̦𡜧%`bB7-&X'Y\Oy-pپnQuBz؎mܞ/-bZOKx k9ZmA@IBȵc.B41;EaA& 7 ĮMxb0K&/f' o.n"U3:z떉 J_T/lKTZDY`':5rmH&aJh!&'FUoƯKo$ϼDmկr YekI,Gn7E,HUK<#(1(k[!)P bU)a+?/ pPEL8H41M`$Ls "s^`q,-XLA!mFx£>٨[q_qjzE3q!;#Cr$K2;N. A^r'{'r(2V()r**r++r,,r--r..r//s0 0s11#s2+23s3;3Cs4K4Ss5[5cs6k6ss7{7s88s99s::s;;s<>s??t@ @tAA#tB+B3tC;CCtDKDStE[EctFkFstG{GtHHtIItJJtKKtLLtMMtNNtOOuP PuQQ#uR+R3uS;SCuTKTSuU[UcuVkVsuW{WuXXuYYuZZu[[u\\5]^Gu<5((a65P!u/q(`0Ae[ec7-kgNh63̀ j @%vgr%P ̀,6o`vmiWr+wklowtr% Aq N*|@vjEwkj;l{r%L7 ggAv|i6s6kw{+*k68(@' m 7 |cy666x.7h}~w7j8s@2|!IB[/7K)3; dyKD7QySCj87r |By*g!|̀hoZDLc;9+7@ ysy+ 7j?syr@T&l8T>oyOQ:9 , 7S:m̷ D (SC ̃S8l,9pA~v+:8:|{9j;Oxc(@;; 5 PLo8ݯ|{맺&@&Og/vxSrYwp{ls3Ӥ?cc ТH*5ʴPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ LÈ+^̸ǐ#KL˘3k̹ϠCMӨS^ͺkעH76msͻ AH0:Ǎ (1`УKNzLġ@J:˭Oъ"$/<ߏ:6!p'0 0 & 6ȗ(dN(J&8vᆕt`8(~,"oT24h8r&@)]!8AC&L6)TVi(0Wv`g$8fihZGΨp)gd;r9xg^P矀*W!f9衈&z&6w 餔VzeT'vi!Z*ꨤ&X$5@ꫨSAEjkݪ+Q뮥kl~*2KD U%%|0 (@R+q "- .>y.~n/yj"+/r)(ĝk s(ş| X1Rmrr8 ]%<'Ds( #. L'>f! QL2wmf pǝ[%(,ϕé.F-j<2ZB%H $AInd9dZk[1(60AN@$pou9$>ywk^-mw?~M1領^zȽӋȡ||([,4.%G `P腌S+R,ew/tض}e` u3Y|3)=۹H^-f8C?3f,*,X1gBHA JXt3 `F+nacqYFl_h\`[8a\ehAd#04pD# 챋#/1d7)ICacab H-Z =c+D j=HF &UfZ)yaR"}HDZq<+ifd8KJ`zŰQ { G9&4PPMxl2D_,"yV􈶴!9 #.c`!/MrdF:"8>B8Qz4 v &̞PG3Y ͘.LІ7a*gC7N{VM&JT v5 BY}l*S T@uX/z5 PVvTCTtd8z-0_l(UՎ c1Nif,cUu8{lL,hQR&-+_V!U !Z ЋubjĢ:.s& PFUrL tY{6V|mU|SkW X"ֹ V5]ڨ 7 TJvF6/NB /C'+˷ثHm\uac2L5̱&=?ѩ/Nz9nA#8@X1OlVNzCϞšҳmoVK^ eIYR _谇?aW*V@SVR+LE -ߎEîdOޓ}AU@&>Q7Q Ͻf]0kdm{(WVuy¡P1'Ijs/TFcSG/"3]+r+k4=-j`%\I>R6_We([f2ԀӢ9>3o᪬X`qg}2v($y (V/=U2bmzםW MVGn9VFV(ٍ}4Sx%\%\֏ógة{ݲk]jʅ'LWm{ca{5Ka5uvTwTnTt}Ji{H< b=pĹ-ߪNëW5{ N^|ْMk-ka/Xƴ5o4^3XGT|cd 8}*֙OL]\qHI~x%a)M,”7pTvbWc2u-MkEl`>@OX#SH)h1fUx-kU{Uo'7lɦJeI`X v}]YtI7Rv S f~`悅eI746/GJ(p4V$xvs&Z_Fme*X@bE6P eףg4<(!bT -v&+KWuU>FG'F@v %P\$d.g3L_cvb1t$dR΀ ܀SDZGIdX 4IڤEXTM Jj=DddCĎ]4Hm8X$wfj9'Y,bpY-F?:#?ٲzR?o@Ue^e`+-?)^#ww_-.MV^^N#2Ub%nϣ|Ѓ8yX@9:"S@9ky`r**+U<9;S8]x/9)"i)S;89c8i9CY؅S8ԙ))P iYr"Q77‚z02 Y<1i t y4 &Єzv.nfՌX>!g"ڣ>')'[h. j?Vc?:Tr l'c%NZU:d$Jh3`kZpr:tZvzx&*ڧ+'Zi !Z򩨊oqZȑ! v"1"S$"p E!z*ګʪZ$r?𘏙jJj s(` :ʭZt2` ::zM`YV0Pp k {[VYЯOԀ ɱp pO૴*ڲګ*:qjڳ(1 *Hk : ,T`TY+` `b++`YkV!V!? kY`VPYjʯ>К{4{> ۱" +!JM@,`Y/T+/ZkY@p {skVM/p;A:R{kQ L"[QK!3 k .[jO Rk ,O@l;KtR+;[+,<<曾2¾ׂK[NQ '|/@\l*(ܯH\‚ ;˱<#[*K: +K,,n\˸"@uܸvA I ONܿ\I,Pk:H|L[`l,ȮڷkƟkܲo @?˭ @ǹ %D+F[9,dʻꪁW{ʬW{zMT[ɓlܽ{ƫ.*J,봲Z \,6˒% j;̛J۴kKh;K{"k(lV=f-)$&1.-*B,qtlJ :ܴ̀˯X =˜<ɠ+\ V 06Ԁ˲(cZҎܲlM)p+wB[\}G;_||Q9>P˳=pͮ8|>;-|N<߃~ο˶"&iZ  LYOZ_^j/$ @ p5, BR":A" d촄 =)/_< .d!M1P _݌JNJk?Jn" ZV;o/_!J 82D{״%_؟ڿ?_(3,(c״Ye&$XA .dC%NXE5nG!VI)MiRO1}EfMP¨}*OA%ZQI.eSVRYդ1VӫL:Tiծe[qΥ r]hW/߽~ acRX1_ טeiP6@*qWuUfkرeώ;vd oݸ7ww\~woah<+f^όM&P?ړ} ,pk@ t9#@:\hL@ꮘۮZ#B#> >k,OEc*EpH"4H$TIӅ7" ]" 2"$/ (`.:)3+tsLto`fnRF!K1zIeTzqQGwцPMFytQ(,&!uTRK5TTX`lYkE\tV[^}U$@`2X]t VW5PV70W6AC.;CYc)`x[ЍH{c)&uu^FS5`VxaQWe5 ~P1qeotiZVaV]EVE[ƛo6H pΕ\f,Ț1xoٷ~]L{ gs.`ZA7t-TxLakf$c+Z`V싓͇ 1 d7X8_^2 GRJwtRnq\LvREUPC}tK7I\7Z_7]2+<0ACJb<+ɺ \xyКMH2t|tlYYXVe|5vX\QFkpc=xC& a.h4ajzLS,@~ i]AG1p]Z.x%mGXTn=}]óQc$cru3֥@bp}ٚYNyg 9-b셽JR&}όd'=iJ,70VDY6-!pkLnVYQKv;6V S.l+Ìf ,i^SH'yMlfT͓@GKyo|<;lju$R8 { jz5Qer8O4^ɍWEdhCL9j*P 8v|c N&XĤ&&J0;==pj$])f13C#&ez0BTKejSM;X]RPf!Xu,MUBV)U͵ W 5'5YKhaJG5 MPH\sja {XE/alck bEL~ T0ZƐC ZBi"ڼ@qT&BH&kbm{[#VB1}"B+>kfn2MfWAV+2VQiĤ65d/a^WS˛>Wo;޴iJt{`'XL^H.Xp{afqp=aX#&q]{bO!]y d3`%?it#"+A5\g}T%d2N6 fjQ \ $%0PEc&TK84wk9 ,Nt:#\KK^&[zV_U8#={ئ=6iϺBQqe,]芐a&G~I\fTz!?sJ$ Gvp -!UKQuB6 mD'Ji#B+bfHg;i3hP&kVu߫bn5`anjx[φ:!Nȝo| [3I&OrT2bOBQg;U4iBF[mpR],b\܊M +p -01ZԚ\+Oy˕>$FbS.НnZG>ɄT AH\:7Mp]̈́?8{3}+c|lf,e_N9QC;%<+]|y5mO|<9?o&po*M/ ҇vxϿޭkS[#2:i z2/}\;Lސq(G/H}] k=+b*r rFQ>A}߂WE9oGm{M;A8 a0'i 5!1h iT%2Jh x ,DkQ@x dqA\)jA`9$@O("Is"dPiHi2TfXwigPxCg`C[heXC6~?tFʩbEaud8D=DJk47\C`ED+JلSKq7Sg JǩN (S.<>O9Jot$4 9lqLR !̈́!*ᛲFјIcu> V )Z"lI:ѩ!:J%ڱ)u̒RZ+=LٝP*Z+'ǖ!%a[#)-%ޘ;Ș4ZDžO"-ѡ< H;L"];$e@"<ܜ("Q5It3K[gIi JqR>-r"nɫV"DTvI74L"(/W15OՅi^ɕb`LZRZ%ՅD\W'YT!VzULGճ+W-%8<̵'XمU04M5HASg"R4ݜdWq Bcތd̩"w͚FYҋъEMi$%JPcRu߮Ir7ڹT_ ؁MrQ] Xqp#%'YhjY9YXE, 3ܭ*E]%8J܂#D+RHJ+HIQ> E;P$/ SC6UER7/cW=+#;:~_:>4¥ҵ5Y[RW۵"/u Ue cYlld ՛Z"]l%FTXF-LsvDS@b&e/HbHIi$c$JR[~9wi],q,o{H9 x890P3;I7h ~$. :O| Zcޚ゠O:P3ZD:8\e~3;/;˺ p}د}}t}w{8B |"1X-G{kky<<z,_`e_]F7: 0k 7K@Uҵ!$X'PBJ[ Z*FVP6@}T TRǔ 9l0eɎ gҬi&Μ:w'РB-j(ҤJ2m)ԨC+!jլYM$Um(ˎgӢ-k ;+ʆPհ!8n TXȆRl2̚7s3I.M$ԨnM4شF=j(_}զZO‡W Kɮ3o9ҧS+vӥ֞<׳o=%it]>? 8 x *x] T5Hfv:aatAK 8J""!%-"1(pWcZh+Vu]#aА|2$6P 6=']H9~u^LdBC:܌a9&eN&h+VUK(%c2}%"nÔR$dI)YR f:(J5gVƼ$py@&K.F*Z餵z+w]q\lТ,2+YV , $Lw696P&Iϻ%bvPq@"P/;0꾛+ +0~nED얛eY\V[<\1Y[,"(5+V<[<[V+<'&6HwTyiD~ J `_ 0ld"Y&\DB`6xN27}m$h0 n8p 7> _Bጣe@v`^x>.0&>z앣nl`3nzgP䔃r >R"&F*'I I_s-2<-njL3/s-2Ψ`hL+2!I%{Hgb8H-/"^ &0p0 c($p`  @`;@ .?@0 >ܡ0+01eA" "C$x!D  @31Ѕ../2nl"n1A嚇:`#u[II7#%D "Š_37>/h3GO`\ )IbDkZ(j/L/R(@,fJ>5|&4c8 ]D`fTو57ϸkTiN2ڙwPQz1` ](pbgT'Sv:k| !C/ {+E{q"H`%pD29P7sk6+` kQȔ6^^*DFVj&]`3('W Pͅ_kBM\|u jUՅ7 c 8Pa h-+d{+J tpִUquP9G] HQrCfШliQK&^ELB`'JiGZO 5cDRi%*-QRFrEZYjzQT(ck.x7-90b߈Xa DpL/yNM=30 Hl8]#YE'1Qf{EfYK^D37øZt$-/ Q)钃(rʐ>է.,|BCg^.~p+]"-8s 03'qb&9?aVy c ٭=]eK[hQw$H&kUZC3!g8C-QzpF&SRHHF R,f-  C/F&Fzaho#rKQ^<[wjgP2V-5msr\ p9dd#)NUB<}LS·y]|Csa.5u(D&0ZI <_2[cXr1Ui27Sr2#LCe%m'\heDUz6ғh5-4,Ңnፐzz."DٙP Ae^L3`Q1@UJHT:C2R'IH[Z&I FIMb<}T0@`^jLJk@&O&LeEm\1E,R0D8%vfgUU²VaVl-$g\xƆ8*@K ֲ>&az`BxZyrlzj&. @/@'M Gi" ,ݰ ѡ_ |ɄԫXȄvȊjl-i'v L k}(bǐzj)( ˱hjPwv)vx\t1E&̗KyHB y@ƬuL$GGiD G@(K)Di&| (6*49 ŖvLjv+FNyɵjph ur+Wh)H"ņ֋(+뱝DJDg+EVrb$T-aB4HkukfNXW2D (+BIL k, !GB &db i@imF ~'P<|i̩Paª?b&JH@ޞ"*έTa $1MVJq XMlnOg*ꉰ7_.p OFxM͏+ݶ$ OꬌN4jMJTdIna*BL#Q?R$"i4ZP|dm^LA"ʸ<\􄸘I@7ֱ.3fDCccZllNi!GepIuZ6iw@9]!߸q$tܫga unIBKbs͜_pCtIᐸd4VS֕X7cYW6wij&B[Հ8bXHZi0s_167UISr Y3qZlH,r|/)g 4Βjww8i\-`,, @a_Tf2.g08I#B9Lsq5BRo_v4>s)UmAJUw:5Fnar OLyo"o 髇%,[@I3_-ofoHު ؎ Fm_OQUjA!XTP%Ct1i!71QzTG  TY99#SQ4@Q{#Ү f&h2nu4Q $kjC:aR!ySOjoO e+`WPtt3Rjp %)0h6Rʰqx{([,Q)QEzE(Flm|+#8o&E|&q&/!ЯҮ$Lϯ;E3B"CKX3g0»Gݶ2,A6+_ilx]lܴ茺hvia$4h˽(^ Un-Vn_HQmO2}77WNb(~&L@&mNOMa Rlۆ)~>) iyn%7hl 01"  AfI`SNai( 5pSPaeiT@f[R %1߰K +@ L-Zs̱K LTn2\F;zRʎ 9EԘ2<4\̈́Ȅփo:sr)>/=WzS[@'2AFMpYHT4N 4UhexXbrf# 2T}22|#İC4(K{P ,0J05WZ%lݖnI&Hr t-h]7N9Ȕ39>Y1:ꪭÊK.ksӻ.K:Wuq`Nnt.N qđDNb)ΘHXbDyH"SM_d^ ݂ˍX:$oV;.6_ h+ϣ^Vm$X^~ A|6z2~ޥNX6F;2#7?}W`.P F A*jaYgnqx^5#R1PH:2ȜV1AXPg4U}ELҡp+ q%0! #b'ys TCi͍1hVE/~aDw@`fGF0q``#ߘ?1s۠{"бo@ Hю`8c (E"Ҍ4A 6 RfdjQ ױF0fSu΅" ahı]q<$_2I/HSq&̱TW;; ֌|`4 {ыQ3 o8T:)Il #$m,l@jIj4%Xh4{_2 o:%)jbQYTA@`2JEf v ˾W;M-IiȑUZhu~g{FhF%7Zj}uh"`7r~`xK;]sDx%#!\#:؟h>lhmjyIcͥ 4:kj(J-r"MsHEb$Ƃkh,$&I W}q;Bqv?E`mwu8hA K.P}%8O+,.j \X` Ϛ^c۞nV h%fncz:.骦@lc+:󥳣W}?ki JP\V`x IO?`º^J~`G~f`^CP'>f:k0Ǹ ʼC9vnhd hci6kb h%HʡwIj%bG PJKph`jn`_PaFiF"R̲XGNp0bM~bnftV5К+X fˆHbTwIV2bzFYmh&ĭlwXxpd @c| vhi[E a h0afNah a&K@K4 @Lt0Fz6@tkZ#&h*D PUjh/(Gi0J.f5fʁ.j~u+YR)W&4j1@Vkgd@ʆg"'"+M-H -"^ dl9Ox ]N* @-҈ ڨGb6@X,$q|§ Fpirijܪ5Y ATLQx`ݘ:tx(ZATNB #ZGKIxQDrK xF"2#S-MZM'+O8-${Q>ا^lh={^~G3a f&Ѩi~(i zz{j,5Gt"vĖ2bS9 5srdʆE!RJD!T !AAUG2ŧ;UFs4=y*{{$L=Hj .laG}i ԙٝ!Y 9 Y,yG0@)p ġ Y'z+ڑq =ڤA-ZږbIS>z~:sNZ"by7#>rjzOf%^nZ֜ VzzW ƚ ŁZy `<&ِ횑oy"ڢʚ [͚GڬCڥOd^T(ie%Hvem$*J Ǧ4ŵ_HH!&f@^ڲ9 zڲ ۰#]Z "4'a۱:Y ; υm g~0~B`na eMblȆoϵ G*nF8mX*~ag Nf`f$i+ 8Y[QZU9/ڥӻۭպ! 67[6Uyz{ ܬ˜"/'62 WRNڃ}|Z.EN䛡G/(P7T==>*Nl{=]Y6ON ]O=PF=R}ҹiZd4C?|= Z[?+zY%Z)z%ۉ}!|\;!") ^ ]`+:&4I'類Ht4ݨ766aj:G~Pưw7ގ01m`RM8#HuH&8dnѣzo"М̓ܥ՝]񺑥\Z>##y߻圤5 ܾ]%z!mD8^,I42Vn_J()'o[ihL ¡"Ol-N~ 5)^ f_2, hҒ42ֈ&?2) TH6*mc ٧D>]z>GY]ž8:,Md1H%B <PlBAI!h,$ te J" |I2c(i%N2VL]4mU3f%zj +c6~JA 6!J$ND(ezR2oMjm̕mqՅK7X%uDe7M6.am - T~VHZY!СumTSN;ٴk۾;ݼ{ <ċ?<̛;}$kD\ӭgye`' @|Hc&(WG?kk`EQE]TvرE ` +P,ĠA ]buu4 VƔVIe1D .Fcb!5#_DWiK^2V]!EVL4ZHJR5 G iuWvD`\RZdxu#^4eM5bSq'=(ӑ7W`3X-FSIސSV $VZ6j.JWAk} jJjj~]$D Q "CYXdq{' 67ݫE"6!WD jŅR^]J5鑉}Yf-f/HIR8tR XCe$5 һvTi Ђ P/C\ӽ?gfcSDT;f')MEJWgJ:}s(#)-&FZW^jZ!^uZou^ n b՚Pj#dz{`0q76V[ w_{K߳Y u/\GEA&4! 1 xrhm7?%>z",dLKmuO8}IM[yp A&a_qG(!1HI%JoƷN}Fv(h95R8D>WB ێC5Rn& [=Sܻ)PhHVDK-4QJp/]ױb\ ЖГl =ŰBelf*a5ZM0mGvkf9JVcH:ru!˒LT0;+Oߏnd{eY$0|E4SsTp%a [`),j4fR5R|9 cY%a g+ [z|JCX$l7i&_˻ƕuVXEu% T 0Xr-#-b11\ 'anG۲4Yz EeeӆEē P#J#C"(AE|u+80 (à@A#3& ۈ;DS&j2 GzP[4'g=;(J|Tr@_JMSJ% b]HА)| e@(h[T2TUլʛ:,d6O`2l:ի>Z)kVꫵrJqB G<"+ (~DiJz R1%h_!S>a篙hOu5Z_EeVϋwmbXBn.̛+C( V|Q#ځ6  a9ĦS;(q+S(^;Ic*5}X$ U:\I qL3r RTQe:ߦ,lOt2Ԙ';$Z2'ɍ- L(n>wPJ-4Wa 8jяjUVX:k3ֶkXm&60Ciȶ,I$&oJM` @pzԧo/g9v:ݯFT:qԵ~+kL=+}`Ż]{zT!Ǭ|[g#0|r?# nj83U r(dm2ȨMwg0g KCPNT Yɕ`:!}z%%=Riw1]^"p-*P hgǼo׭(0+b0-/ /<W/X'VfP I{ p BjE˺T; P*t11%S qPPG,r1cSᇖQZp؆Ѩ5)إ6b/A[3["vj&s#`8;y뛳 @˖舮Fۦ= @ Qۺ,42ylEI$qZ| u 'FB8aY!̒Hi H54>UB'|B$`P(/ 4S#]Tz(X vP >6ڳ6T6Zq8*?{ [K [|S4]#Z6nO2"y/Ja(r]lN?P#7%=e/m2۷I#M#Nb fqǘ F KV`?lu ˱uVv?d:z1b}@@[m(f1wӹ0{ S| uS7l_Oet}fDdTfw)ÇIDwHXZWxQ+Bl=\ ʝ/:ͭu]v(u`O, 0T|J?͛ʭ@cJ#)]1OpRHPR` j GuQ،։PmQ'&"}u( )Nu@52mHܹʦKC:,@؉ݚ 3OϪ=#LcAOqZd) !Q(4Tc (]2ڣn)JTDJcKqʣ* ѽ^F7Gmt jdֵFvJf @]TfM Nm0FYݝ"t3OE 49͔=׾D\ 6pDzm ׹[ V-^v$n"ɒ 1[,I:$w})wxPF+BGqJ峪+X[hk%T:c2ֽv'1>Pvel=nn=;ɓx 1Gg$HvN[@Q~31Pxkw)6BoL ~hG?*X.]yV;0dtڣOZM:2?fѲm|A)c~v=1:S)B;1Cw.e"mF2<$%gDD >؀ɱq;Kآs6 Q 𘒐}|z/o٘y)̱B"nF1z/2khZo/%ǓtX@O_K3 lZ/)Oii\)LhIYlU/JOط_Q.?BO@ DPBQbĈ,~SE+^0%r$5VR $5ę#ŌUTU^E]L՘ezzfOڂw#ƒ"AݭReд/b# X1mc+aLavK7]P0lV4F d:O[TipbP#Ɲ[n޽}\[G1ak0e\9}{q6N;rt\P3t+\%M-aę۠xmw d-#`O4Z-A 'B /0C DC=DdjI^1E_1ODC:,rE#L@2 ;$&yrӎD10030I4=?~kT L0I;4C?0PA%PCP+QhQc.4Ka1KieFQCFBRI_+A/T@HnieeIdQd4 H@PAiFf [Ff`bexop LOPصO]ďT+` d2+P1efK!A^0W 1B"i*OyհXNjg6m*0윑YPPL P9Ébbػyثgw$2̶Z|(GDS;c<ik[18-#wXص9-^+LN[Ώy [)7gmp35ё+\Şϕe,ei"` ]f -y \ &0#pLfRʰ~`oBń4%3l\aD p\ ˴ЌL)Q~KC]Y.$ VДvzen(!=oMǖO#ȁQBzb/(B4sfEsvHj0 ^ΌhX эKaQp%=iJO2#L)G90@2&ZXp4Ř)`jNUKMXDxƙ}o*ε3&<ڌsH:ŒL|P63BaPҤHV@nߞR-*͞i,\,G\U( jDH[06}T3'ԼŹ'}K&i耊޾TWxƉsi.6-2 "(%aǺ+!<anܴu#`opS+u 99 pbSgֳq ^P|u%yG\ЊݠVK4>yWNa/gox!e;uW`qF9Vy.eb\w׽'z^~?2qlG;0L4*BC[p#U{[˹}˼.Md9߅Ν9Uv~s {OaP- ˃ ,'X9KCo9Z@ `5xõ S[ok0p }їo˓rA ,b KS;R+)2^?a7B#7 ^!2;r;S)?R3ڷ3٢(v/4(I: ϩB8Vj% Io:&;L4 o2'=[AܹL=L˴A1!@]Ѣ #3ݒ24`1 3ҏ I)닞xؒBR( +Atߢ(BT?"ӭb6* =\4Gm~ F:īG; Ĉȉ%1p0]=kp I& 󊓌Hcڵ w ;EEm^;b/cfGFb2C80Ė14àǫ*:[) %sCc 2R:ZHb⩨3:K:KJʯD$+:/{ȔB BS TCTY9)5 )9I'_P3Z^T-#㫶3I #"E4*񪏻%L,媪*I*1%)N$>!xG靭יa᪬7ac*㔡YJB4G%՚474ǰr; PTD;>α3I uWݰ&`][,o@=uR'^b"V\h*,mBk:S=dEt]*&+[lcKYWWr%”yxqs32BK4Bq^(h\p>`"d6rMz;r3>AB\Pu>L"Ja| n&jXٛ٦KZYYٞLZ%ZZKYyZ]ڥZKeګ٨L>3Q0Q[9)[H x[̈́  8{̱%ᓄsY?-Q% Ћ6HM[H[&&[݄;8[xۺ[()ۂxUMeU aսʼn9!I݂Q[ БU8^ ?weHDeN]>c[i>S>S H߅_ 3Y‰IPtMZ*;C88vY9rɖ2aL &fui\Y]ސM\ȥX".]V%f&v'()*+,-./01&263F4V5f6v789:;<=>?@A&B6CFDVEfFvGHIJKLMNOPQ&R6SFTVUfVvWXYZ[\]^_`a&b6cFdVeffvghijklmnopq&r6sFtVufvvwxyz{|}~&6FVfv臆舖艦芶&6FVfv闆阖陦隶&6FVfv꧆ꨖꩦFjj!F;y[̕ ]6ޗlXpX닀 <뺮`kPrHy0,1l1 z#0HrxkȮlʆ^ fk, l1^ PPp` jpPj8VmrƆ ~nn~kpJP(@6mNm⮍J~km޾mЄ m^fln۞opߦp ll&Nm՞#` fp۾mߞo&k/2@F7 muU w ?m&WlfWp(نrnvr.?+7:0?.?0oZo&V*wo8tJH!o(sr^Kωm~p#/rC'r.j &m/fn*q+WWoVvpGoHugbo//Pns'pVoVoo7vXW/Hffmgq1^s&mv7vׄpo_pPw>tnwAM fxpЃs\ovp5wK_xc=gfo&ZggRRlv(Uquo[6OW7жI7qv:tO~G^vuwPs:W v?s`'vBPssGxmwpgmsm?6W Ζm^y?4t}m /tVW2GvwvAlaՄy{~s7~17zNuFx?&o?)Gx֎nǗ ^w?!, 4? "\a‡ !:HqE+f#ǏCz rɒ(I<2%˗.c ̚8o3gϝ>PD*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ LÈ+^̸ǐ#KL˘3k̹ϠCMӨS^ͺװc˞M۸sͻ Nȓ+_μУKNfx](Ã/ӫ_>r&ğ/>%&N?S`&`%%2I%D("ޅfW7"ΉD*f4X‹,;F,%#0%`Ey rPF|]ɟj%,"JC8p&0!mfti'!r# 锐 }`R&袌_|Zg'j)f)ƩJ'pFaC@} 9kE"r餓(i3fzj*˩vƶ)L'+h~8a BB֎*madڦ.KG:ʚVb$v uNƨC /,ajaFmBȸPB s+JFhaPG-Li2l|nY&+%N+v+r 1Jm$*$1x7W+i_+:+pϼfg7-<&}q Pw{wNj"}X(W*eeƾxmtiCʚdoUb5W: {)84ZF.f_#9#Knh.!q _=l?g( ߁H@pp*ny'HHĠ \Rcv à(.؝fB gB;wx(Iİ@ H"HP"&6!NtbB8*RI:Q%O0%6@hdF8qģ4. [HH>edL$O 0>HPDR'E (PR*WI:R_S~BWL' K6򒘤0 PXtGPa4(5^@l.H):3;)s꒖8n'>{ @icLc SD9 Ȇ^=HDDXqqD' jP BJҐ AICzIMzRm$Gr¬dN?!JԢjX24Cǀ1nq "VAՂR>m#WfZZֵRMm* (x]0xPe$ծ<(\Tu+0b±o*[SA^jZ7ֳ*c[ع+`Y ޲G-,1ml&)'UL5ѽY-j\uc"]Ng^Us3R]",WqI4>2{sK8Žsy5Y 7r-W:VIUk^];稧^\Xw`tNnX55rr\-[E&_c]6;:9Z yXvفmk=Լ /ޑ?czRëzmaf[ydejqvuhY_s{mFFcąsVfgdfwrr'.Xni!PFWL({ŷ԰q&bMiEb&D6luu9l@_eU[ZJ}^dG]`~j'~w j+jr^vntfNci8{[h]WU O5`Y؆XXu (XXuxo@&UmXoXHZcND6gô*Hn䥈VՇkE[|FxKNltmYs p(WeW TU^@TFZ5W^vUUNXU[sd'iXebwawLLHNd4B !?wx2i%u9eaIɔH|M؏&[4`TFarAtM4IQ5pA M 1AiD@;ٓA@CJOTO)RY[yOICO1:A'̪BJ*%jʙiyڴQ%~6 D T@V@+`Vj +rm +&;'1{'KM;ъ7{:E ФIɝK M;P;i /TcK,0 T໾+ K#& ˸Mܻ6+໬5[HJY `9K؉_[ىO[ J0%5aA ܽ %ۼӛ$˲L +;2GjʠN+F{>B|Ā٩PˡJ Qɕ,Y ̸ۜ͡)Kƣ(ʂZeؠ- ː{: s˲CK JzSO[ Q Ȏ R M\޼ Lŋ Ł%|1*j@;<]49kÛٝD*O9͍+uK͌](d](0ʢTµ|AJ,x7%7)Yf8L/ ż˰" f.ܬz9yRCLۜɦktTem-jȭ%ܘU [,i ԺK-ǧ ˷vu-˗ 2-{ F aj ImڮQY͛YUmR%zҙ O`̽bdLݟ|2F/ ˕r:?K@&1MTJ]≠u:Le} ̍kӚd̲<]/ Z[Z'jdÜ ѓIə -މcn6L("#4T|ɔl Q*[-0ɩL ۸^ά],aDϹ Q+ꝹhQqV,l4{I+ ž!N>{kVnӳ(rBNVA p<ޖ/Oe'4[l)<ЎTN^#.N \ϛU\>ݑ[QJPԖ/y_5~ʭP|Ki<Ϩ%kfݼk"Td4/ [c͌{Ӻ VѪي\־J.+)Y+NٔzkBv$ P+vTu;, o k.=o HJ9J:4_?_?5XV4Q/Q fT1Hty5jG/J䚸{T_T=LaDJ?M0 ? iecfFF\ $A ?!T`O~&A qLj%*UIH)UdK1eΤYM9uOA%ZQI.eSQN2``#@QXE 7bHYa?d{!JΥ[]y_î*(O^8PCڜ*Uϙ9kܘƦFÇ&E]mܹuoGj@r9Mg nIUcOґ1ۀ5mBկg{[I#a8?f<![ˮ[NT2sL2L蠑oC;CCqD@"BZdL6eL ȠO.,D rH"4Ȧ*1QɄRTB1 bqKI0sL24S7B1s2`na@l<5 '3Ta4,^AZw<F/׼-zѻ-<$i0ԧ*|+dF>'~6Il3t"ibC5%x}ZLF@2?o xE(){⣅E1{`D׷ xBQq<R⽣/ @uE.c6EDrLbZ`2f`QTA ZL"e)8JPR$ZJR4e-QIJP2Le/oJWDdGP)? gFѤ4 h:3% 6_WLI'A^|b^篪QId=퉓]{ Ԃ z  ehCЄBZPF*]Fgt +AH K E*xRЀƥMAϐ#XX9J+L4HGPLyNT2AT]jSȌ%cUgYIAty hC3` Uq0vk_:+@ .k5{M^:6VūB|PTEU) ԋ] H@u1`hXAf6h2|VPЦ'`ITcC*TX^;fmm{cS-l^뵔x+[6ch}{+L@gQb!xf%ѺX4hCu5qp v_jXnX#&a3P (^]l am\aVi BFVjN/j[8tk9$w O̐IUOtLt'@Ɏ^WRfڋJwΦL6U-ҳ 股V#a@D%Ig7N&u1S0uiR::85.jMkT)U= N6>Oq40}yӲ# #Wn7#MЄ&8&D'T u\i.E+ ]`8,2q]E=q[W9=ox#?yCnF_a6&b`EJ3ѭқ$$o+a靐I*F2<ՊUn+0-dٺ'R ~wM+MlH\a38y476C4`]$ OA]0Z/""\+(Ҍ0y?1l [?\PZS9C<λѧ<Ä =;Ck< @<C? d~j˞FsAN9;y=z\ P1(2+˕+q=2稅**[rjc9 BCdtI'Z$Pb~ӧc0[:@Ћ;m@s<@dG̻ @=AL!* =p >8r*$ :úlpPqӈzG$tbfdl$28$DSDK Go8L8;DX(s =L =KwĹ`k+{* n*,*"M, kS6 9;?h;?{ d8K=y:,!!\LɞOǜI~ClFqJʅ Džc<{DüKJ8nL{@o8 \0s(騞;8696P=,>p8||:zt΍XKZHtA)ޫ2pNP0\90 jFs;;EO 0s4GO]CP;PSmPӱ򁋢Z"V Zh#AA\d((P θ*B_^XBͨ)e5CP-) 0Od aO(P+,"1 R Shh2}S6m9]64!4> ,@꣝m\ȕZm\ImRdJ!Z:%Xʄ< ]m]ѥ%![ёۅ#~;0ޟ/a 9 u }^`IU fb]^nJ&ޖ^5m_Q&%](]Q_G㕘&Őѡ| CD0t_ GDH=`)JtگD:Hv`aA=- `.n6oC)ia'~bA`BRPYRbY$Zع#u)c8(Nc5)F&Z2d%8>bR5cc?\? A.d)\a\@~fI>ϱd[[D:$v m`r*ayRHneB!Y6ױcݩ$ALd!ePa8I|X {eregKn!-f(R'=\AR Z8gsgngVj%V*%ygXrW:vcdKYf1Fy6eI qy\I hgJugfʌO|i)֨ p>Vas3KPyjH^@j<誼#0 'N&[>4QK c|i } . {р雮E ln?0GL\09?uIFF@3"i "R -TPPeU-`7QMUaWTvgwdeg]iV߲BRޔ%ֿf:K".4K0bR0?uTIӛL ,l(Yi)4#*֊kVk'au&kx'cnũɶON.K?&AwךJ|{Gv=AiLԞ(\V;7*E=l3 ckȭihޔ2'L pD=WJJT GT:boK𖩗2DKr$HH?{1{FD л_빏*)? \oZ^|:\:,E@Np_ 7+}/[^`|CBk@ l!BP6$R O7r,Q#JF,i$ʔ*Wl%̘2gҬi&Μ:w'РB-jI`0e:R0`@Zٺ5)[vWi]Mk[@͝(b^JĭŎðxhX 3d&;7uclN_Ԩn\e-6|Ϡ1N ;[A] HҧSn:ڷs;euk翂;H-G\#!B q[ae2vXca `kfZ*`A.j (xLffŴ[kvasL+X^8dyOt)$M:$QJ9%MB8Y8x%d &e҂&9 qV'HL2H!}xQH@ i$' ʢb!zF2:ijTh ~iHI'r:~"꩞ +&Y%++KiIq[,kdbg&l$VRIp˭H2R|"in}ꧭ;ҷ%q$ z돶$.I+ ,?&l$h,K<1[|2]3ɮ:+ɴ~Gb2-21< ܮ=Wr8~8+y6'xxf'{9衋]%Yk^2$z~;Ժa#:60\ A~=kЛzO1>|/E ҍUcQf,5 VMo|~z(|+"p< RkxX(.7Cys9mepA" سq 5pLj &.mE GC/U Ǹ/(y6s.(S>̓./ ><"6"53N?Zm}V:q3mY:IlPf?;Ӯi{{.~&wk!M{^;#k?LEftP@U K(^11I "+"+⚜""'j-rb eC] W?EUXDaX2!GJMʸiJ|6nJԊyy":V$@X#;c;<Σ< ==#;;ւ $A$ AG)e2TR՗$H6^ᑂq^]]?A#mW= 5a yLKdP]:dz)EV,EzAS@PB%UXEQeSXy 0SYćE-؁4I@b 9Ǻ9ʢ|CY#E>@B90s_-%8"ɟFFEQG@bR^:aJeL N>LBe^&fZfeb&tg~fgf@gBi.l,&Z+Z+ @BHԊfTrT y:WrP^(c2|_yeԃ#QOLL^@&y:$Bz'jgi.{77|,|C|Zg~&~Ԧ H5)`XZ GNY*ܒ*Q"aE%srd]Ga0# TqݖuQ#reVOքwW96fyΨXYBD@igighjځk"+()-梒0uE>aUrzىmZ+*H-M!]-1I1'nU}T^#&ZabjDcNn9&i2MBpVtJE꠶XE.Aj)"-""fa5.hݗEZz)k%a4Z*}RٕX N#uTAX3~B U"(L"6@YTdWh^k{`k`.)J1l"~"5(q*hq.3 ~ފ=ш0@.`Qp"3ҐAS 8wV(kf쟊 .j.x7,,1),˖\ 2j+| HE^ }#tW m!_V[7Yi^6hM i,*y7ɢEȪf)n@&ܾV- .ujee1n߮v Ϫd-(fy A&6 Xdv#MgjB*7m~,kJfZ)Z Z,'H逖.\`D`vD,MKƫsPj uY-m%!b9hr\w՗Աh/iBiFgڲl([<~t[_B 5n;qXxmH4©o Ґ%h*^F~h jnX` 뷪oTNeYX.U~0mC[ faV2:qpڗ~9(\*y!E&Ȋi0Z旆n cc / #ꡂ./j;T·U)}E&ASVn( [50^trơ&&}r` Ǔ=F.a4ڡ!!1ҬȗXs~7322ʶ+>sݲɠ؞4&L^Il4i>gLm3Ҳi:jc'/>/Ε(?/?4@?c%(B[C;$K8KDIE{15ǍDܷ< Leʵ&l4e`L/\L5N4PsmtI@\m4SN UST -E!WFNMu8KJlGSzE[WN 5][ܺ&^fZu_]5` HU| Fu`/6ckGX{c7dO6eWe_6fgfo6gwg6hh6ii6jj6kk6lǶl6m׶m6nn6oo6pp7qq7r'r/7s7s?7tGtO7uWu_7vgvo7www7xx7yy7zz7{{7|Ƿ|7}׷}7~~7788'/87?8GO8W_8go8w88888Ǹ8׸8縎8899'/97?9GO9W_9go9w99y9Su>  bI ygڤDM?@%<@:?6z :HzIy8)o b5PJ…Īɥɒ*/)::z:ݏh[5-bע0!\9z<;{;784AS{7;/>̿@мW>ۼp>}|Cn>Z{ԛbC}. J4 o ؛ I+=˚뽋=,b`IP¤5?{P?}=9F~8z?[;᫿c{7?>0 @CP<!ꮫPhO*,&A`IkU\]|em+3:C6LB{"8RcMb{R6* %H' 2XaƎ̔.\"h7|SlPAn:{dL;)L]'BԓN"ps+K5TK3`LhRI]SPUVR`VeR"u9SM=XTf(vD2kJtnprmH?->R#Um7rSݲx!&_)-Ih#aX0 /z82U]2Ѕb<6c#8c]8YIV6ْ'V]u(fH!DecZhA6IYui&"iX'VYot[w.lc֤e Zsޛv=; ҊDI|wIX_~r]s`ˆ=07f/VLvW؛.>aΝ0#rˉ`kgźbueez]k^Q'_&jۣYuGՆ#/Ŀtm K:@4e[~S@>g585A\ZK_D(,`WXHυlc]1dX8ԡ늵4d+MZrUBш[tu1ƊT8Ĕ)vk+&kdCYZ1~ "!mQfRCP h@mM" YHC2]gy gwЈ&5ʍtFJ2!Մ~}0qư/!e^i 9,-=a(;vȐ.y3- ;S.yZ*>1\2VlXN-T:Nws2 Mf((8z:4E L5m^sBK:nY2)=f1*Ҍ<BJfeb*yM<Db66iqeMD]D&.:iEHmBNS'1vtH͛L=i ۦ5ōD'$ypUg>V= '+9)~,|!u/#lcaBm@1Z{t=Q'>֬%q!'r9Sbl91O̓-9t[;Ljm~=?Ǯ|(o 5v2zNryғ7N]& O*XAX'*Nt6a65i9 cIE?ЀNELqYF@j( 91WSڐX>%c4): !OA\]S1BPu0MZh[q_œW c]q5 P^P5ڏ88P&;˳.p.|P<=kPL NQRWSI5o/rp|8_GpQOP_pmā|ppFa6}} p5p w ]0p٥' 1pqg{dLq $7q,?=Q;-GOqAqIA1.]C;ouEQwq=gqh!QqDD 1QQGP$$.OGFn,%L$ڱ ѫBQD r\҂!!+"/#31nx#c]BER$I#SR%W%[%_&cR&g&k&o'sR'w'p-ND(.qOR҂2.)2*ө*'R+%Q"2D$Ȳ,&--b-زӢR-"-J*>//00 10+1S,++P/R3-S"p2/?4?LLT4US5[4[66A!5Is/2{73i1);7"43D3/I@A;Ɠf 3?1?%S!$O2.29 :k.";SB'B%THB?B7==DCTDoĩ8wl:O4, nlr2²B3tCדC{GHSHtG)GTII#<2(&*z;r@@`ACL>ȴ?\KKM3| " `BP`ƓHs;tHS<B?I#UR'0&t&F=MNOK>RSHU?BEUTV#A)<ƃNtN}NO4@! 5=Q3=+R)UYY'>+vE1 gjphhj"iGhbt4b)l"tlO WWyW<B&-w#cgsD]#AkX Ulf;%t/Tm3WswRg eO:NNωޭ#!Ej3Ŷ$곜DBkAQVl!7l_0usWySYIaQXa%K Ozzf}z{p+}tzlf k vc&gTv7%l8CDwFH/G7Hf%<-Ckvy ؀1rDEZX&axZkw4whf~p&"wid l (&I(PeS;+2wgx4Cs{ fB5DgjLwgg[fL׉]]sBd]zdmOѳ^+WC%t=S1Cr+Iׇ瘎hEmZ ؕfObЍ&4($B])]]d^}48uXHtBX/帎On8*juN)$Occhto4DN̓N9((d WT,?"BX0 T1xr0ՠ{ڧ#QQiZ:1Q72A]z22.t$:AB@%aT.皮M-.:B3'ӑ.&[ .۱r-\jdžL7![:)#ަ8[b$$LӨb"1[۵@?D){۷9WKR7z$Q["#"ۺR*.ۻ-c-vxxw3/׻FҾ[㻽{BӿrcBux[ \#\˛IM4;½|Bg4]sf3/2[\m?4WBg֓i8HgӸItu2Lď|+OmnX[-CBV=yuws'){=CBuͻ6TQW<|{;<|%\ÍÍ4+C#ud'¦͖ó3B|E]ǹ|U\ɼ-v09}{׿Dt3 W[1EΟoGx]O<]'554<:[FXua7ϼ{!0û)usށTyNTdBO}PS>n!@nx`2>9D3~AX)bk>{vaZ5`>Y~ZAa>^[ԡ[ACAˁ>~e>ly煵e\o'&CVeMc8MOj{?ݞ#[?TUq_m{?5>/忾~ q>~79y >+Q_->_)~뿞 >~To9 [Z(D-kY3dɚYXȑC0ePl%>UifJz 4СD=4ҥL:} 5ԩTZ5֭\z:tʖSlvں!n\;6ذk T^P-m`ҥ`Pq(*Cre/SMnx!-.h/ .m#/K҆^ٵdؖϮ8eŇq{fB ",x Dqe~uss;TI *LjI-O8+!y'ۿ?`Rl.`[]v HHi/Y( 6”!LFZ_ kxhb`%'4K)׉,W_<ؗKX$_Tbe\dӵd&"jI6emI&dfF'h:zz3MIgvމgzɧւ2(\n1h / ^XڌFdjK?!d~qn\*I㗢3""w+:IkfkcaNsg6 9 rLg|}n o;`\l1껁1 0ӂ1+Zꍻ;b\ƀq*_'،I 15l"yC+M\b/(2_OZZo)&L nK<͙,fIs|6bMvf6~\׿*o"'7n2,>l#3cKGዋ-k΅VӪ51i`I3^ja=ςk㖛v,KnR? Z̒^hy/ X-Ay͸\NiOO}_}D{o޻/=5%^z[J5$5_<#1i"3:'fJz٩Pg `xf&Bcĺ Ɋw ^/3Dn7C+Qs[7)y6!(78Yg1Gc6'EwM it-*UC, uYc|lPc YT7E>٠,ʜICd%/(AjP\RF!jBr"e,jqR@w}/m:@8NF>厲H%NtL]&nJlHFLATҐ4qV吵1 wkD=%h–xs -@](FQ\SJ*to$xQN<蚥9NWjR;J*'!UܚQ0QI7|HJ b$d.] 13pKUIDrQ*TyK%eGg` d;Ɏ@Lcí١eeIi֜u§.m)rPc vLrkm+eSY0Zq `VU+]IJ-F+$$9Y?G#uk|o brq0 LuvUAPD tAS2e(3]LA[H$G+hIH6;d!/f-[[ͶH3 |D"oߒX; ^FE, a+^ k%l\9[:+|'a^;qC5Br d ހ!`;D&6L}R^ߵH$mJQS‹U7ԨJ)26Ez&Jiwhxfg$mh(g9bM V.yҔdL[b?iLB@D& Id'I[TԐ(uOv"=\D׼y-ɛ@O' ,e5ѸǯRCOmk[׺֙P5QXF{"nLlb:^zn:ZƵp\]V&tُ$% b{5Rw[R|dNr'4*'V1yɰO6 s.,oӟu<;!9o#.W=г +^";%}lo{Q:k_;s{Az&ޏͤkhw+@ɺߓQ7_/k^+ؼ?Ћ~/Oԫ~o_~o~ /+oKԯk/Ϗo(Hh (Hhȁ!(#H%h')+Ȃ-/1(3H5h79;ȃ=?A(CHEhGIKȄMOQ(SHUhWY[ȅ]_a(cHehgikȆmoq(sHuhwy{ȇ}(HhȈ舏(Hhȉ艟(HhȊ芯(Hhaȋ苿(HhLjɨȌ(Hh׈٨ȍ(Hh爎騎Ȏ(Hi!,$*40aÅ#BD/jǍ;)dȓ$QLrK0[|)&͛3sԉsϞ@g JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ LÈ+^̸ǐ#KL˘3k̹ϠCMӨS^ͺװc˞M۸sͻ Nȓ+_μ9qΣKNJسkߎ}B%࿋?wE__ݗ?}{7_$(yݍx΄R(jHFqaNXB8aQlފ,{2Hc%<ځ *8U8 8j$LŔTViXf9% ̈_%fM>)t>F(gG9JBS#edT&ڨQ0A,~q{f&2cvmG 嬁ik^ĔFE*,b*LePZyY?wSwzGʤQ)+YJFQ0J,Z ExΤeFG)(wqQBI O!8T+FAc)ʑ(0,QZB:+qh"|,TY&@6'|`2Y<lsFl '0^X pv[߀\wu#?:By(f%%d;kf.=hଷp홧'J:I?y<먘t'{t)6)3F WokZ &` E"|d$eBnfQ} `h$eg ոCȮ3 '"?!AT2AL5I0 G Ԑ `X用Ň@l HDňE&:P1HdX̢ic0`H2;yFp#e҈6Q;ṛXpG!Ny@L" lx'&IJNRd&-YOt %(G)JQiDXENnAZ,kc—%.k TӘ2d:,G*9T0Sd6#DR&+J@^-b2E1Q u(F+LxL/9ЀԠ&6MP|0aJ;̨F[T$ GGRcE/RPtCm@S.C!H #ܤy.zcRT:iOJUL83IOmbDXꭜ.U&KV6S~k^#IHJ@V+iU⑬MΊVuoUK U@ծ{+O IJ&Mj>֬kuRIYu^;Wj`-%-:NMrCY2vmdc H4nsWuAdax@.Ccit*]i/^:Vu!vV .i'YX"7NnH R5)};[-D[Ђw5Px61 ؘ*H=j_UU_LULŘ'L&s201ws-)< ش,*5oPR`Թg0ĺT4nkS-KR@NeXF7%$~7wJhծX8GN2~-HyfGI% Vհ~cMkW֭58AQ׻ij1:-D&!e7lvLD&!jCE$j ILB:IG\8!p6BD;~w=`Scus|{e.FF|Eq6H 'AOH':5zM p4N:ԡNɆz3>t -sY+`cH5{ A_ ;^vx:=#o!>yJ^KCJ>\4W/}O/Z2;..[k|~"Qi̻ϵc2Ǻճnyz{~{MG*QMb82[GRw?O\4a[n$|Gć !H5w7x XxwWu|7Iuu!nwodo}kSG0PE '~G@ (x~4 ބzz7w,o@(pwsxfD|tBGa@ rtAxg`r}NoH%IUߤ~짂~~(M3M3tzgwhG{5烬IʇZHXcT| t|X|XSHrWh$j&g}~xQrTD@ evP`h FPhL`0尋ȋДM('wwtHbSx|MPhxs%xG$Ww;xڴLTQP LDeS֎OfgZ  ` @ΰ @P 0g 𠐪HK8x󠋺؋Th~wȌ j 1a@xEDw q7~4 PTM戎<L OQFexg ( ܐHh )eАFb(MT5I /({{f!yJXY\y[st92z؂4Xd~'h_`=t9 LLL4*؂ vxzpj CķCgQ|ygyvvٍK729©)hM4MȤuDL鉟Y4M7h~Gpzs`U}?Gy7gwzI9ù3@3@ʟ^MSP9JYM؂ə~y~~I1bu*Z=Jx0y¦KGz4I zZ@Zق3igYɝ=eY ډ ڠʕMXL\lM` W'r(zl+UÞ8xYwt[X6zrvj:ZsaD yGAqq1ɳO7'DˬTV+U{LFW Xyx˫H˸^J#[v7fjL\n8pYpwxX\['2ne.]WeId'p:~KG`Ƣv,(̃B6W)Ā< Qpxqq9k|D|AƩykf{s{ɛ{q̃=8XtȬ 5DPX@ d#齨 8QEFFkLɢY{@̀kΜ#{Ls鑟*¬,nGlμlqi6{zg͎${\ʡc7Wkeph,Wst,Ϡ\v1o=zH܇ɸѰFzHi$jgkmr6Wue5TEYUaD2@B=D]F}HJLNPR=T]V}XZ\^`b=d]f}hjlnpr=t]v}xz|~׀؂=؄]؆}؈؊،؎ْؐ=ٔ]ٖ}ًٜ٘ٚ8lKȥɧdQ MҬڮڟ`ًmڦj$۹JCi]Y%i \|W=5>f`DH֧uFIGRXEh_nڝi[MiΧiEm>Kl1- Jh]fެ Ҡڨٽƶ]_ ,@HaDAmFڢ૔ɹj| 'nQ"n&IQJ ݤ j I]`SASf%SZ%Uf%c䗕?>]ڤ@\P6K-K1 `@%]ffUUffEkJRmKGKK~NKb|K< c.KPnK\PPńǰdǐOe<GngPfSV yK0v/`*6%`5vn%5PRR R^J5_4Q(E3`m^~PO>K.K ^e ieW$m\S=iSGUISWUpmPES_ Uص_VV[ΒWWY=N1-"F^E]M)SEU O_;eFn BJ^Ži^HipNI 66^#F%՘_ /w%NKe6QS^ <c!MGR[t/~dO՚j-R?Um[7VP^nNLKtdO.%EQ]R]F_P=c>XuUQN]&NVW],3//i]R^.ha]eVİoܸ>Z"D筤P]az_-5o[^]R/Soe@UEUU&^N/HA/.$hCAC` >XТD5 C@Z(H Un#(.; &O9m3gJ|JD%IVSQNZUYnWaŎ%[Yiծe[qZI%ʔC$7߾ms3:z*Bl8;CCqDK4Ѹ[Q`abiXFkQGalicV,RF ['xY.?*/K'\G"c4adK'l2'L8r+ /<  5PDUtQF=N7ㄓ6K&aӁ&9M&2NݼSK-n>C0uJ;uN:Eӹ;Oyz ֺ\P3I -P%QjZlv[ (2m(h˅6 aK\,4WJq^|_} U_u*).`nva#xD:JZJu;܏ cq/NJZSXC2,[ğ旟٩wgzh])Czeiy?iwizkk9Dl^ЖPW0iqRJn3F6{ooB7|qwqȫPɿj*r3|s;sC}tK7tSW}u[wuckkvobLFp~v7x䝒dp/\䣗~z9xe6iVjs٭:`7|p/Ʌ_X}~jG|`YYw@&P!ZhfRФqK((]-[` MxB>V{VT)@)}>ЈD GM&&19RxD$&|-\/ **@.ďc deQ  h(,`'D4QJ䑑8!6 d|MHF %\\c! yΑ$`TdE$2Gޤ&$! b;#"=IP`hRV@!|SG@#yԈre/}3PIkjQ+#`Rr*e*ËF2~YbT4~Mp[R9G(O^"blq btIqS Y&b_5k=9 IM2LUsj%M:pAρb{ dFM;_9Z\caF=Œ>9*-*όmM2L=:6HMa#"i*9u$05ȍb{h'~'y;U)[p|Vrf'3זH4:٫(]_Y]`q1atb_S6M3Qd M  B;hU;ȀWuUW U\WU^U_U00V00c5aM+h+@Vdme-cmVVl}VhVnVoaVq V`_XUY݀VJ8QQTU4bȀ~W]ՀU~̀EXa%a%`MXV"b%++Xg0!YYٖٔ-Y]EYXXXbuXY}[ZՅ;PZo؀mZ;px-5TU.ML}%V][[-[=۰5Z[%]p[[[[}[[[ܸ}[]5[o@Յo] x ˵5c\MSϝۼQQ%Q ׮UI؀]\em]m\}\oo]]]ݰ][@[\ݰooܵ۽]ō]]Žɕ\̽\΍2 QѽQENZ0MCWWEX5Z̀-ۥ߰_-X"Y%`\%-X [\M^ۦw8T _4NMNI` &>W[}ZUU U&V"q-"W!^>WUuUUWuVө5S,P]c N.a`ea:}[ĵ_u` ~߂__-`XFdA`[d=^ZֵS6a8MaO O4^cuX.ST@SW2^]\\fʵ}o`a] ^\H[eu\6>[Ej^Vleo>bTR>eHeOZ^gyeU^xەeg][E޲ h::T5|>T 6gOSjc$M߰^ivUZb^v b&+(^_=XZ.W'mt-UlvuW@ATqZ5]TlCZݸ)_߽VW`K>lk(E[ dnU6`eX^}&ڣk*mNS>SdOUZ@q@opc`ZnpTHpZqq@]p pppTT؅Wpqq WqqqpOq! 706rZ%7'](mQ)5R+I,R-r/-. r3r-OsKXs54ws8s9s:s-or 0r=ӵr(/)sE]*1˔.UR5ϕdJuLGcX2%mR@cc/hRc?fwLTnKvlvmvnAAv4G4#_qWwjkI-swE㞡И9pyA;2 4kwWr1x%LC;w[xxO4a0AzBc Cyxxhzw~ߺaA|?2{rE|󞻃[z@;GӤtz>syt!38+{?{O{_{o{{{T%̺7L{L|C\N{!],La|o||ɏ1|G4w4+,ÚW|:G̷*+x?IO-C~_}xпz.zq }E9}q|o\D}gw9mc;s vPJ;Dߠ yC$q~TR Bo1lÆo;b6jc#b#ޚ0-:`Xe[ gti%΅9*׳rB T> i(PQjU(l +J%*-kjײm-ܸrҭk.޼z/.l0Ċ3n옰BU|xeZUGy,+]?13H%GB yq3ٳ-j1x7f-%AS!D3CzZjTA kOgWzl<׳o=ՀSEORH@3!d/< uE`2`ԃ58S4E&"f(ua"b~/N qw9IxdE^Y 9$Ey$I*$MEcQJEcUR(Ũ"]"T[jS[PC\ugfieVRiybV8玕|U @$*(:(VRՌQըݥ8~S*)2J5fTy.T0H]vV锶i#VT%߁<%:,J;-&+RԔbi8حb#:ծyꩾV SRUVb5k- +0 ;U]Ui3f*Ti9f۱ݩfkU1 vxa[=3A =4EĠ0iZfjIiTykb)vZkcx?Jy7}vKGSY-z\5;kH 2ȗ֩]I]~+x|ߩ:뭻n$C]i:6)YuW>FEx4x< ;!w-\|&k0={=z:~)jF.D^ӁI_K+oQ& _[UŠ7,}XY| R|R!y P05qHBʨ0n2T"q!KRr%) QáȨRj[ΪWBY ()R/ )dl"0d Lo64iiԌfGz΀D c2Nay g0"8A"? ɀ(&>$&3=J\;*VD*ԸFk$+e9r֩{銗 bYt3XN$M2|f>ztXiC,~ ,<(BPGz+xV)tO?ѢO)'H?jёl&=)JSQPt(%34Fd픚T)P*ԡ UmCTD}*T*(n$*@խrܛ?Vue*ZӪֵn}+\ !, 4? "\a‡ !:HqE+f#ǏCz rɒ(I<2%˗.c)fM6sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ LÈ+^̸ǐ#KL˘3k̹ϠCMӨS^ͺװc˞M۸sͻ N3Jȓ+G>arQɡ#^اgӫ_yO(1>Ͽ((% ` VRwTVH$eVA"2"8+0",'c8ިc~(易 IJ&7 -P@H&Lp ]y@G t&|;;@HB0K*E!No !1M!J(' lD<0'O yX)RQ"&z` H2hL6pH:x̣> IBL"F:򑐌$'IJZ̤&7Nz (GIRL*WV򕰌FbIZڄiD%t ^%/)b2Le:d2 jRפ6YMg:(9 g*q^*k8e<{!Ϡk-Am}Ovg&o"Y gOvy%X| PgxlVSE\x&e PYMgӷ}0D6J}%~ gk.k/7'k7(43xWw @8uBhm߇wwB{GdܴQSFaG '{w q^R^Ej8[Y}DUWdMGvhCv`(M) }X~A~엂fk8h0զ~G66j~wko*ydgfoMJaf` M`(hA eZaxT\E8`Y%`OH}XԠڄ{s&~}肋4ȂJЈ=X6w'kx~vh7ǎhYXo\`O؊7Sc[&e[w\l\UT)g,XfkV~ƃ1Hk3kr@hx~fod( ֐we{V{%`D|^fFZgU [U%LaxO6[$`}؇}`tar%~Gh8Ȗ+f.tKKdHe<م;X&9/AZ_gtɘVZ5Z}Yih舎G9舿Ffx+LwOXduL扢SJn](WXIW^bGbmKK%gʤUUԩUv}voggu7j郐H6j~v{hGM|fٟoAxwKAtQ6V6։{g!)kl~VlrFl6u:lPGl"ZPWlȦzѶ{y~syBy(sfPa]ggW|k&logrRGpRGu Rw'SWpQWzzOl*Gvmkk&6{ğ8:efyxJ||b)XYyeRO){ّxk&NtLZKMd;$%tZbѣeo ؔXXʉX4O `v;&yLJnhhLO:Eaza5Mv`TBTizP'gx16\ Oy|iD\g]VV&Xx\Ԛ:՚YPVPfcڭ dA4T91ADlZ+۱H>wPi[ˬET_e"&b(aY 1BAF {K; N;PDO\SMcN\\ER\IUiƚ Bevj&oJX0[]g0uW ^f&nbj;^PⴹLN[VUg۸*g񤮏Sщ]S &X;S[K#8Ѻ뺨p!GH;K;[{țʻۼ;[{؛ڻ۽;[{蛾껾۾;[{ۿ<\| <\| "<$\&|(*,.02<4\6|8:<>@B@B=D]F}HJLNPR=T]V}XZ\^`b=d]f}hjlnpr=t]v}xz|~׀؂=؄]؆}؈؊،؎ْؐ=ٔ]ٖ}ٜ٘ٚٞ٠ڢ=ڤ]ڦ}ڨڪڬڮڰ۲=۴]۶}۸{!,K H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKbg][0mٷp*Dݻu'Tw߾J\D‡KR̸blj7 廓̙i޿ ӧKV Nu(6mٷKZvk nxR 㓐+?ҤУϤw'\܄ԀO>⣨_Ϟ,߫l Cϟa `\ `qYf5IgUw~y7wzail|7"}(F| 0&0%X#4w`%#r%Dz^]ga%(AfL ej10[c 8) E:wh`aU"fE橧CHB椅}!8Wjh{m(цz!KME`{0F7yǣܞ:_Z$OxRj)bFzZ,{rMڢgZ6jqΙ*jS]^IbXZ y_FJ)r%/:j $p9k:\f]!y~&8&xa]K5Ƽ-'tL]|yz߉7(%ԟrY`! lGWIWh`k߀ $f\%pf>&tQ^v(Gs~!{ b f:O@bꌉ"wnЮ@ +A.h"$!AKgw/o觯/o HL:'H ZZa>O`ÃBU eH0D%txa ?Є& EH#1P|HE)~)! ;C3<F4qol#X1ыk[ehD%Љ~lH@^Q%d ],8c%/..:$$HGe͘Fpєq*Tc39ZҒwc&=h6D/CB4TG\ВJ KOjtDc8&}œtfHXS)t&5N0slcggXBAR=( y+61 !izk8CnZ.LY2'Fnv7wyN~gCCДhiNsJ@B jbGEQT&O3H2md3{b_fH2ҲZƇoe>V&T*+;NM)Qœ0Ć_=Ӡv5bjQ է0.t 1+Q$1&hiYɱ.Se˜ڔt %[pnh APVJ̩p?1XSTF6=*({VU(U YbSD 7*.ִDc֊u 6S*JfTEh~Ln(LE9RT"p{1 ΰ`#fS0r# p P(QU;yYjvEoQ̪ڳsųlkJ5TA .S X1\V0f2y̭ s| 0c:Y r+0x30(Ԅ*ҴU 8(>I"!' Ѡ8S!"A*n,ۺhyVuf0yn2 zY}Ŭ5,bVc)Fu9ZLntEQK_'<&'Crkg:IogzEc,Ŏ-ǢEx0E L^$)| OvA&vE.r}lt>Wis7XMIQÓtgEQCu $NtNu Bp ^p_[04GnrBKOGt%<ʗ{+bg=j+:(Vbj(h{('`5EYm[FuL1U4d^g|@!FOIM~7P}$8yO}uPo~/yJysWz)WwpGpegvvDx3 pb.\eTIXTL7MCUa9tZZx4}g~W~~yF o_~WpJz?(u7`#G{vbz{OoLddQ(4Z&x]xsaGjcR%PGdF<7OOHDM8o4OHI']oLX6~Vj@9jqæC9~ZcR*DtR}cP4U>HiU8nͧhz{  !cZD,IYx税P]C%X|Q Rj>s1xzHJUrhԘuʜ\qܪء|HLQQ?u_9TAŮCJ@zZ"6*ȣcRjh+*ʨcr:'G){dzd9^{׺"n-*LzۭqUFCI {Vy)w29EAb,vI|cgr7$|9@~ 񁷄4YÅj ED'@/Of5dIR_GN2*L]hFj+aiOϟdAOZ=Mm*Dj Pl*(QZj5'8AU{#ƓS'=C)'k唟Ȝ ?YG^Df-O!̴CTVU*m`PPֲ,V:UjhvYf6҈/< EƔf !LezU!Dݫ O~]`uJ(ԑh P⹡E(RыTLA*p[ûwA]¼-vۋr@*|o9Qrþ Gءğ+?f+qvtUi<E[:jp}iN{f\JUuNx';Kľ9N6w u+bd!c#8ݏ\sQrώ eKuq>Bys@<heCaS<08ԟO7SZ_:9]/~ֲ֭4uv’aXk=(+HGzáZNՉO84sEATӉIO\5I2$J.ř_(urcu8I8Ao8&)AQ*GVTr3R'Ev*G@ɏz ꣡ڞoqSdbWBej)uzωv1u`N>>E&?nJ.U`@V'HDJ;Z z[z^aWej>!,%K H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣHFTI*1ӦE5A+׭O5lLeӒ%-Jₛ0ܸq-NQE[B ap%'P7FиҤIږJK7!WCmh7y.{8׽XwS@?2uOxmk! A6bÅp$0P#"p lÏ<| C䶸Qb(`h7gKf=2/BX*R-0Gí1jWP.\,!C r \vPxim(Q.hW0VxfV\ʒt mKsHE( UGnƌ^2(8Hr`?#K+7O`QqsE9CT Mpcä%=V [¤01c-EKRēwWر `Z5p \1X6]2~VVLۊc0( 4ztjG[X /u]|:o3(!A1֠զ. 1QRCX=^`7]p* ٖ;,xDpB>RMKֹ k‹="dJ;ErAc px~ ^cl-7,*-mQj9,:mnzxՃ+]!f`cna @x^>a3~ ded:,lOȏf'}Kzӗl?Rt DE6ou{cLk$ )3i\β6\ʶ4zkY^l|ӭ eglS*@,5/R$Z2FtVߍïT8Gs[G2[e?.HVCxx-?l`VT6N-EY*z^+s+ZQc[ϑ`r ; 6|Wyl[.8H#+Qa?I05f 76Ҿ6IFs<_ ݧQ8w=ydd{.QIq/#9`Åҟ͛Iܷʣ.FUۄ}4[aw_0B#Dgu/=[, 82361G 6O N H?&|ndsYrtI?;&A״j%_D cxB87Du4Z鲏Zڣ C@02}N0Kӎ|XH`DYgb3;E-ӑ\đ20ّS}Jms6lPOunJ68& 4Cm:8r|6:asC?N:Cu7Գ9lV8iR8a)?Y!,K H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sQR%IEE/QJ異 wb1 Nl F)y`t@zt 2E̺yvN(m=t.**pQԉ3v {(=p_ǎCM Gx7$z9@w[|C]B ߁'i&WYdY|Ʌf\(v(r] uNge8܆xY9:`%%b5Ym@>,׋}F*9S0$tQPiaeib=g<4[eɅv-vgAyYahvUAB5eneAD^ir80ЪPP %@,FAzi*DS}(mU"6F+Vkfv+k覫.F oyT6(o2&?F$0VZTP==W`D9&*M[ 5F0'2\3S)`QFodbC +QgG.O 3 } d + ) bQG 0SAwMPQ%3˄4g|[!  ;ǐjI@9 /''N㍺ꬃtS[m 3pבDZ+@ D$m' &3"ߓ`S 2$x[AsQMWlIkN = Hy}|3WBh/PI z#]dEٮj دq@X*2! [A&O@ s(J d2`3T L3 2%0PLc }]o/o !!SA3xf8CE*T4V8v8&P9fX W"yx (rQ3Vĥ/D׀;QĄ9TH{H)1 hPy,FVP"8+AbT4^ g]pB>vRI2m~o0<,0HPe*!с@+ܱJU> OUBL%y͗!SHs'789j!-<,Dnɐ^`1(`yD68m`yvTSutTYE&ERdWٶP 2XH1Ȅ:F+@2aD<,4ZÁ!vҔx5T f!n .&;(mR~C U_8)?ak^:H} x=ʦbav+H"Pp yP?THPV4a04Korxe8U @@ f.sSW #=!"b<]*?dT}b+Q (KŸlkHgǙ8%]@NBN+q4?  ]3X4t`df ZjϽRX/Jm.0 P`z ,fl/N1jV{ycrj[acKbJ8C21+'@DUg 3!JjSͬaD3d4Ȓ'.9ϩ`+VLoL rОȝo ޣ&` eh¼Pxu]orrT ] i*@!Y$[4يR&9|4M\f+f98H; @xe)  }a]T-f"brwD.' ΂GUv8B|gO[[RSHzj۟#c`@q …Llk>XM" iy@Xt3:]HJmFg58a i-maNjN^mHq8ɰ%(x[ وLPK Mǫqo]\4z*cw ~ oss3<:vakU~"%i4FIvtOG$"C8deN֧qch0}P7/d  aMD b:9h30v.2JAyhK9WN0#>XInR'|vه߃6i&X)&t8t,8 (rq6 t%U(H TW]g[Ycff@o%W]<ZN;o ETNZt)ULX%JvEcP-KKƹ@TɠGndR{}矌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*+`6ZFZI%T@ Kl6)kcOR[Aw\;Z[† v Ԟ.FX+3 5@+ ocoGPj2=D Tqj 5HdȠǸAM A#TH ͯSjk 2C?ܴ?r4 Q% (J*d<A7@t 0; G d䠇=0I9R  pN4O@pC^oS7F쁄{Vl1$o){}O [y'D4{nϡ_1L !-m@Z8 4I% p ]j3I"p'$ 8 o>?ZruؓnW fL0FQT!`!8Fa OPAV$6nqPH3x?TbmK 09@t!<~6 jDT 'Hȷ=xelU1   8f+pc2d Pv J$C 'Rr0{A#1,dP@ d5WzdIL2kPE. Z@pwuiə2$ |8`8My?qyٜ[!xLj 5`s 8L fJhHu;~HIEHTJ@ y+:K`6 bπPwcOn!xBqӊԖy] Mc !RE$[ՑbT1x@5mClژTîPeہ֥+B|>5mm[켎ԙR @V,{L^]jV5B}nKaqrwz/(_3E粕w!ӽ Q5A&8N Pҕ q ehk[l1Rn H6({5q?ְ6䡪ɚcԥpG3\\Yb#~WԊV Ir3׊<Ȕ8E.р:D 4reX̀8q x%Ȳ Hʔ~bVX[ C|lgő P+4W+܍xlZpq./ԍ*m_Vȯ/lyS p΄ E-2XnBu>m-FvԥnH(cY^p|2ņb~[07fP @{Ed@ uG&L+!x-nC8Dc3Ct' 8=رZjV2D̐sU1Q_m\vx,bp]GzHZq4-n fJ!?)PU yGLY.XM^V1x<+ 9kY4N!,}*J! HV򗰡Ç#d(E3jWIAJpqGD@l&<,5gb7j@((l.RI'ΦN:c*ѪXAK꒚`K1+SkF] My9ПmrLQ],Jٓhi) L1:q,) K*YHp]ѢN,Ϟ<0DvbഷD ?Jk/@WֽFL~ZG R5m+agL8sEVvBMFA@!ctŧ}O$ ( I%0{v:gy8vi=X7)g)&ag1[YDWj?@ # sP3h[z Pi1cWC7cSV857lt[ 9bQ{dUZpBa ~XbDdn8I< ]PH=JL"hgX8({$IBz1#F=JGvTRzr&-&vX9UiP b{U|i\h*ν-j7>f4@3Eͭw?MAW٩kM$ ?j&SņEVݺAy*%iBq SR9*jÝP%CYX:=fDXe%t؁`aSEwl?,F6sMUk- Q(¸tcAvߍP|7(PC6P%.WH$[@!,Qx5G*\ȰÇNHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣHX)SF-8U)Jb ҟׯ`jlVRSUi={'T`o^T סJs"> R߆R˅ \JJ9[H43 fm.㚸F]zFmxL?hRN&pd! ]BĠʁ[uE`h|2K?1z bch. i> JɠuE|cy&HM@ !,*X" H*\XПJ+1HEI$_Nj COb%NT0ȗɜIsf%Mw*Qez &;?O8!T<`ͯ3{U]A~*(JdeJ SNM;5\*;}_LH߫DuU+6slcaku{Y!3O  OU mYs ۵ %'ǁ"1VdNw+'`u=zIf'`!P6ޟݱWzR5h%C0?@*7^yPU[UptaAWP~'L(?R=ggEݣGES03xEy=ᕗ!'̀A0Pqp7Pϒ%Y?/d@ҙf8yZVedZ@Q A W\&+0&gYU?f@%CKH\84e\j *? PRcedɨ WcrTCYJ3t8y+ ^Ui*mfSAQ$@'Pv`*D'BّcM$R2(~Eٰ4 J $!WϹM@ K\ro u@4ӀAԕв ɨC#+4SLc| WsFJ9d a?7$,#K/An12{q#˲n15v 4TOҭsg@fAP7L0p8YEt@Ӽ̶W2'=h7w֣sT$1yU) ](IX`U2d#7ORh9t2"@Op{ 0ܲ}M<'?Ծ@I#T:MIMxe*_&@!,*?" H TaC* E B)&/џɓ(Oj҄l^*pR#EܙRӑ T# G ԘӠDP@Z@ 'zžMuV:9_ٲ&gZUVVDE+UBDݿ~VkV[rQ _5ȷ@I;3i>?l%S;~U?6SB*ҰYMr4^(!ɚSU=`@4@3L TLA d"P +$#XMNTsE|-B0'͍wX5Po%EZm곍IN2Eg.XCD'G*7} Fbd+5)2oG<G/@!,Q/ !,QM/ !,!,*M! H&'‡#Jaŋ +iȱBU 9I%S %BRGsL8S9gNXflHѥAl4yTLg0ѡCt|TO]* JҧBѶ,qYl?QJ]G6 p*`zߴil]jSݠcF)qVd% YkyͩW= L Pu.z8kS_O=`T(hW7!{"6,^M߬:. T?bG 0PQ tvU}1> GvdS)eY%vvFÀk'LW:JW- 3N!&?`z5Ձx}= MPL*ގ2W_eOi T(cbPHh@ iJD(@Md6J5Q[mz Ӭ]fسWޝ Wld ]stwT|'*{ecy#MF4uDEdָKWkƟPqˣ7wߴSNMnm|,8ŋF.9j t 4W?4xy% DP(Q 33p3fچQ ARmP o Jdu t!YIb@1 O2ֺّZ_8?sd*Jm^[/zNB8kI)_gÍ,.qۨW:|Ilp.,d-\oWog@m&hƚY nv8cy\ށt 0>78rjg 4cqZg cR!,*H! H*4A #J@)I)L \G(f^yz2 + B@@RY @ swk!H"@P%ֆT`'RIGr5geA]Aδs?PL1 (M+J(٣jk^zP:AI$@L3?+ |24pS $oIiQ9G)Z,)rH%.g PYWQX(B?zAVAkW0uCMNP23,@*\'Lf) ^f!H<%h0`h_K' V34;;$(b″h&P8!.z12Q^֒0HAj?,g. y/jMLe.sˊfU'[E%/*I0牕H$*%LRB ` +0+\nyc !,+1 '*\ȰaC8H?3٫b%8Wȃp,Xi'~ oh?wB8ƿpI v-XZQJNAVeU_* jߤJjP5 |JlC(_ɵ |=ܽST FEcPN)wl] T48MbqM!^e5_\ Y',x![Ey@ i@!b$M?䕓w]y!$$@ f%l @q>$NAgA#sAgƛ@I(֕PW;1s 7EP- K%%)\e9XPz2|TAZFN)WDqy:oAwT`Pz"U}D<v]U1ʸV@0vRMVrkn)BHi%T.ߦ[с:qy_2mIڊڸ2I% O !,Q/ !,Q6MG*\ȰÇ#JH"E3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`b7vJц]Пه4궮ݻ+)^z?[afسWƏ+ػ؈\TV:ȉ N-d˘r<4iҡȮM1\˖-:8;X4T@=ਙ#=oA00Z/8ڙf7~hUr wxWYn!!_ ՚\I?0! *r̊0$Flg?r%L#c+@8PrJ8*{F=CP=+̜r)ϸh]l%PA? '&# (|?3|alYV? [Џ~▋:\'Cbh%u&\{B$60yn!{'*(?'ɦ Vr%^kI['^Mp\r*[S1*YZ]⧫]H;YC0L?@9D%n։/IB$4M;߁W 3HΒ2ҟҦ+@!J*HJϸ Cr 7a*)fL҂,M ?c  MP+d:$3[O1AM @BtAdU_}m3Qp' `!QV?ÈxԷo ݅{V+6} 㨁m9Mw bT 騧~u&?@{\hy:S!,Q5G*\ȰÇ#JHI3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ LÈ+^̸ǐ#KLrJj'!,Q6MG*\ȰÇ#JHņ.jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`Êk5JdNg ZpVB;_]xݫ7.X32 +ƐS`ĘkF<˅=2W6yk3VNb;ߴ__xuY^[ِ]ƍ\(gn4cۆԖ><`w]%2O]o߬ p% !@1 O(hgbablAWcS4dB3͉T^=S#oA'\"4AMiǬ f,M2Z4 J9JzENfBVBRvV]T^M3/=4z"Q%iG(PB%pA_ku !PB1? ńbC3 L/%hsvnYxS8P)A$?lx)< 48H';r)  0&SgOqA(\nq0C(IAO1)LjW 3ᄓ %p% `G SP&H"IB}l3V0MpVA,x!AdJ5$ Ls tAȺ&34P @ܨc-M uH\J>1%,SF(B%,[N# =_+27L??`+ɔ1p 0l~usKy,rC:̌*+ x5W@: v%kVb)Js5JHm@A=*_^썊_Y[Bb0lB!n= x@4F<;iL3x@4\AKc0@/dј@ HD!_4IQZH!,Q5MG*\ȰÇ#JHŇ.jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷:5K.Jv˷ی~ 0ÈX-5UԸ 2Lvsxsb3\aWUc&x ʥl+ҥ{L0? Ye˩Vn$?tT6tC}^)ނĴ*G!,/# H!\ȰÇ5A83 TqቁX::P?K`ФHM81%ˁ xg̖ ;.i? ]p鿟.Nz2`O?2!f)VK*uᓁSf)dpl+)ԅ#nBA& 0AnMνڰSz tϺTM! 2;XϘWM&(;ҟYfd*@~O$۴P 0Hd!,/# H5!\ȰÇ+A83q!F::<@OT yG@˖A,$p&͗>,߳HV)BI 73B>@ SJDe*T/mbO'CcQ+h3,ZP28;|68V_5n`:K |)7lã95WJsdfuW4xV)rF{oZCӔB{a S D5I|@|,!,Q5G*\ȰÇ#JHŇ.jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷:KBMvV˷/\~ 0È8X +ix 2Lvsx)sb3$Ԥ/g> +dƟmqҼm:Uژ[nrʧK[&ӽS޼5AOu^h1[7Pк?!,*.! H?*!РÇ6$)ŋ?=ȱ *T7@+\ɒeGj"G0sf̑-s(ĉ?)NVOTp4ǒ@diª-1V:9֮bfb V%Ɗ&?B{)m^VsGR;vɁu:=e#NTq䝦B&)UZҦ>埒wM  }ʶmDWOULIw9CAD d7Dj2LkG<,xU [_1^$gY\\L֗A4Q.$Sgz1`5$؂wTA?DbU^FPeXug@`t^O#$354QO} `Tk@4P Sq?$$m$҇%EeW%F5XӀ?|URi-7ۅ?s!S^dgac=FH\!, %B H̤Ç#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8se@ 9aѣHG(!ӧA5qU 26ʵKI+Iƫٳ zTSڷpAJp) vpZn6"C*Z8I#KHw˘3k̹ϠCMӨS^ͺװc˞M۸sͻ `t+/7NJذWRJG]tM3٫~};د7RoJo?p?y>P''a} 8^E~%ay3(`|Z86`@9|q'%!jn53_y̰ $6H6i$Od34R1Hs4_\%|M%?V"xbXh@BO ȽT?ZrP`0?\y+ZN](VsYehI]CqF$MuOUbp"PCjB"Mv5g\5@9)3Q'Bj?Ì@Qʫ$3%0KASe퇀x; 75WBCLC ?ڔ*!A8B@~8" r? 'ʘM(H#3: iD9daEpB T@)Ǭ d$VWt,` Q NdW@C*SBxRh؅C%vk@{4jB(0Ib t@rT?E 3aCJ%i6IV~Z.Zsķ8ѵt!J &u#KBR|O05b@TI'-y*& E-sRf_" u2(1 T*R`"胁[@d~p@xH2dPAJ@\#;1S-1 P+wce@Z0p?S"x`%-;{A!r3_D#B&GsĈAQ 7H&i ąrh8@M`]Y ބnj{4Xc@"6DГ@|֢&%+45#8h6AΏ5A~WAf9ds *h@(ElH` VD0 xqXF 2ԉ+Pb &1l ' Jܮc< 1FC/ feI "W0;J'p3?SBRIh˔%$W4 w0CG!d?J}k}A)B&u 횋aubU!JOemmAբ'ss e%0*Z!DcӶ#0⧼T#-?X\$L0auCT }H['Ж'r;>HdCEb +*`$I>IE6$D R W \ԃQЯBee 1;=)VJqeѥ䛪pԈ,N"}P[mq52 dijwo+<G2g&X,>?nR-w{E2@UdvPyGTZfEZϔ6i#bB)IaK%decE&In1q;mG;3l /79$1i1%am.x@V ELV*[{m FCѯ "z66rߑÞ3@X?Es:K ( 7ҁYZtfn.֜SGbm!uXmnjݬяfdnĘJE%($ 2?O= Lb*s_̈́=K47gej}gJVr$+uF9p",hAfZH-aR_mXVA{:#"&!.,)O*5gw˾s{ %+>"&'=%Eq@Bi~#y! _ OSvB~]ڿ>hH@!,*@" HS@ BLH"BM1ZѠ C['MTibG"ctĞ 6+ܩM#._RI;p)ӥ'(T` CVWRF@*ӳV%!QT3ufϒ0um_J嘽Z6 z.9-UN @M2bvbF&(y_GO-Ћ!HT@-%g+"T8j fBX-< 0E=0)ƛATpf 2+L 7 vOz$+D(+T,PLb߿u嵯&B/a $x;msґyKgKP3IB y{V 5&iZu]Lu7 ˁDQ$%.B@DaKa\ .>a?گ/.^kɨ҇E5߼!,!,0 HJ*\ȰÇ#JHb7"W8ғx?1sI\!TM#'29A *q1 pjiCKPЀӁn$'Ae v<!57泟YK1 !,*V" H*O`.HB1*ɢǏ !II|%ʕBʴOn -TL=FS\z&NpؠJڌCj͚#S`8&ΜguVUL1%xdd߾g}Юs=(lZ:ō`%7U~R9'ۡ 2DOL1f%A&8|oZpW lPB8HRcMS?qc2i_eJdϮMqZlX+b7A-̈́Rljd(J98#4PnY6i!Q"x2%eQ3<#4g#ܴYaV} ?Ę'&VLA =JgL +1 (F }D+@R@(1 qgQJs 6 s ThaA&* TKc?NT? iy3Ϩsx1ύmc+|4I9ٴ#ΐsV-g93\i-$Hu?(< 8PaS+ZwÑ=&)Uee= tVNJ}gE w48 = 4'1rlNHsJՍf%vXzPdÃxe[vG^߶Zc>SXhQ<9SdUslo` LlZb;1 毢TK,!N!l[ͣɺyH$"pOtNl[waaV)+&ZJ9tr63* yA O*Ȓ0cgw*TȹӦ-%OQP 'F@,WOhjDI%耠Vf4JX[&ӆ}{`K[W *9TX$  __"pKQ]6 =Pf%Qp 4Tz<ŭR"h8e΍ sbšv]5 n A1O A4J3;Tx_,DIB_T) ADwhduUp4A*@-J8̸Ӣ*QTaa'U~u HP is){ϊ2 JUWׅRi+ TTGDqf0eZ3W!SY=NtJ+u?p*M$Ӛ)h(Y]U 'r4 4P$Nrhm-$dAjaf$&m/M,]gUNAM(ZXbY1 yFv_*zJڀ,{Eo{P`%HjcsbpYQRrk NC7%\OZA ḣ#$m@ PΧE>uYBy+}iWIDE[?*"^x=pT Ō4 J*MT!,1@ 8*\ȰJH2qE'Z$ɠ?Z0ر"/2|0\\'!L7?U;9VSax +jqd4%uVw>BK- Rr:TlӐ]M8M`F ̪*rVu: c>_3$B93X@,φ+ .L!2<`Љܜp8@O-y0ٳMx G;3.Sd ?o_؁2G0k=BuPJM'P/$2!wnPM?"TDtPF`E3BtaC,lU?%D!f-iP8&Uf4'V96`D&$G>?`|UqB).جJ3N.V-ߞ(0AA=ظ%EA]B+MFk`g%Q y54GD-͇?kRWP_!,N0S~RYo^4 @A$TI9w@Ӽ oׅ(Oyt(P|J&_(=XQL ǖpI!W=<rK+H$ c"r(pO"P9 &GM`8L`@0CI2Jt@Ouiyřg?9M2UA@scQ"P7CV\1_ *c~T)IМP@%L?D1$X#g\Qx$Zޝ%9EΎt7Y@ %RuҘX!1@LS,@Cm _l*ΨP@0$5DG΄ @x9@dhcxx0‹^ZV@.k*!:[2(

CN%H#6O,M2hzȜ1K.0GnkMR_EAQd@rPeCDMrbCW?#Q/?(-dŻ-Pۯtʬ-A*>`QGNMd#8I.ߵx ٕT yOP[Y Po#H)T#(La A)p'HH0$8l be$ !,!,!,!,2*J" H'†+ ŋ1th#Ə +jI`KRO (ѤM3٫POv5B(6gT8q@ӦD=qLj&EԩצJ`U!,XN+`9Z\}U*:AoJҾbߞ;p t=zV({V&JM@PD%J%G+-tbVB!KY^\\Eՠf dߤIGYD1VnI?+wW,0 %UsnI? Du? T MwO$  2^2%&\]O%I'$=~ hp,MR2ÊWm5v i3^8ϴF$4SXd#3mrh$8 _NJ3c2h؃EJ ITxLQi9K8"{R Y[AP$ وaِe%$0 A4tWLbg@ixJ]EJP%'mR8eZ*80k͆C ά,䒄ZvJ8Rv'rDIMr0 W9Ϻڧi о0:^VˆZg0r /*xJ[^:PyJ;; @ tw$w3Pr4ᜂO2p{YP@$0YA}(!P +:N. _Ju_޽GhUcbA~I*s ruf1QO&x$ʗ13TϡqH=0KkBil;i#n$={onWw}5??^?gd_ >{@!,8+R  H&ԤÇ#$l+}ď REɒLߧ0c&J#U)O^JS H\3Jj%I TA1bV_`ekՃ?@se!]O 0YJwC&W,?D]G>P@!,8*S! H&'J!ŋ^QSƏ I$I*)PRAO >q Iɛ#+=e|ԞH\o@  Ff&:jT[jSSFQZ95ͨ jܳF ޑnN]l&+sܸ>x|AJ)TJv{U,پ9Wd@xh,ֱPR!,Z[A QN,w*,d ʭ$V5 %?4=,S<)XpTH40vI * ܗ~PM =ΜWcq'XF N;]XN$#(UU!~"MwP+Ub@Ë($x\zUGQF A?LTKI7&#YG172 d?1*!MLBЗhӑ(IIzq_98eB%H" c(HȄs qdkPJA@%9K JH)З=P*fw֔ '3 Rhaǐ (aCFP8S$3A؁ ?@zQBV0+D~|)'@RC C8p*B[i %9 .y@LT,R- 0Cg3N!ߋ4 ʿe&DAzbEpE9编$34di*D9FDA4SizF T |(-Ss)'t!(xI6CU"V*W YEkBMbW0f4R75TD鑍~.Q@!,!,!,T*F! HS0JJHqB&NJ Iɑ >)K+SB Iɛ#5Qg Hͣ q4މ 'D B;F>"$SJj[v-iTpZEkZk(+/ YgRLӟJNfD߲pxEp nܨ'"&|IXITWBPid=u"P+@fI%H☰P {"XF<:<20/I`Ju@ U%3tneIB +@%+A#p%<3)[w^A D^5/0@ϴ+ؗ qV(^| t @ d 2, U@@^di0J.ivi,@4I@Xٙ rڴg87܃))i*B1 t*SBr8?DHjC!i-mr!ʈZ_'$ f# Tu- ÊrȜrJ2xF0fIO1A/Id0|B)p7"imm%ԆL32Lw%}sZ(8|_y/tAG4(]fs0h)HlGrY.#=q- H+-5_<9OQ1v&Q?!,!,d*E! H 0aJ#JdС3jX? ?BHɍ(~2y.SȜI3&̛0AALRӧFd5hr1]4<56/hMXjw$jJl4MahӭNz8uՙXS֫:5yqŁܷweœVjkX4ibȠV*/50sy5""A;IU0?RW!:3JSjA=yڈ_W^1fJoB `ܿcfP<#uA!vvwl IBP8)@ b=VTU͔$@@za\ǔk @5T(@(dLXTPbK9@_9d/Q^EŃLF@@c3~I)3 dWTaL؃{%~G6$ѧL%_5S5)e8ABR!PhIO)!#@ H0ťGSA??NUad}A4):^ kB tJ \mfqJڜD;p#e vvkMYD Uҥ+5kUQ,W&%4q=>[nT Tl( Nd !g#22 R2sNQ??}jY՜Xk T?`< Wf2A k cҥ >p2j"prZTI>2j±H?w2PMS?dt4YM}v JS0*9O/Ԡ@X($ >%žV3riU dp%p$T@/CAwm`բTu)ΐb` UaAe"0"@}(&M==ϴBU9<:HS +(%CH$!S^#6 ?p(DT()d,ᣒ9- 8c==pVa:V@$mfs=E~Ì}I6V 8 ep* 5b3~aT>B&bLCC\2JLoPn؉Ԅ{2Űe5fB%42AN# ֪C(:bZ? 4I9ARP(%[ p;M;ק:Cj@⌦?dﭬ3F#=Qq\ڊ 1M-P8f( j+o3 xJޗNK@eѻA@G g6Jsgx^gMrۓ9+1J0iB< /J*cD5*JI'<0ԤUN JFcuC1ЊA2d1zxuSG^%XW 5: Ҟ88TS+$@x2R2 da>/:B9ROP53) Sb=R0ŽL†H4IR8I6% !,r*G! HW@*HE4]1aOHTԱ%0c|Ϟ;*˹FtQQP P+(JGl ӯ]bZ4\z]{Lj&dHYP͉E͸'c (I23|okXyo8ezVKy" 0+V]BT Ѯ dwjn eYxm/Sn!P揕ʝTAkqFZ_O:i~aZ/R5dQF=Q$0, TrD%3y^{?<`=@?eB`d]5e Y J;M$L wtW{.1+Ic-60AFsH4V`=U[H"A83[ 6TeKVL`I8Ŗ<@˝m{QD!Dݕy|)|FՓD @XW=%%)G dh ݤ.WP@`6?0}9i=X l@4'iF%Υ+ީ]tO/V6Y7еqs,i{O8wӨKgfftFiDO2I--RLh ȧ~vy&iey EpnQ%SպԊM?LLFT w<'Z u8 W|4b2A F 2E"K(XL!Fzwz@FefqD &.!,f*`! H*\H@+1'qŋ/Ǐ 7sHRJ')R˖/]IIP̩'5j)ՃWK=#E&-S>5HիԮZ-hׯ_xJvIRMvF\Ǵ]>1uF֬}p…xqD]+9ƒBӔe9xD트f #mfeMw󚖝4!(Xio(T>u]%/ I׿L jm9gu O;/Q?ӄ@0 %p?F=%#^3}]v90A? =x Auo+bƌlBEDKm C̤dYIp"BMYh 7ʝ'%I?5mM+/Пn}YQ/N8uG0Ms+}pEiM) @$m@I%?d+%Ymyxh AXA=?Jwxσ7 TXgr؆ ċACD=!BsY?O+T"9 8=e1G DUx&BmT$"PuMJ403PţdU?9МBP%TbF6?!>T~ȍr}Jhe4B4I-(U@ @P b*lc>24ɯ=bBuE >`@V2){`ra~ )StHBВ0#೓Ϛ$J2dO`.F,P8&hgE@8)P @?Ȟ`(Ţ;94@ 2DQaO3%ܳ,SLKe`6G&J4I,A,?\k6BÝyQ2/=`10 A(UWxC@xybȢy4E&1fǦEz&Ԩhp4A!,!,!,y*]" H*\ϟ@ V8_EjȱaƋCПɓ(OJl.at $ɛSLy={wUSahQFpthSiÝ&+AN8=#(N)+Ͱ ۮWizAcC {nkݺ,]GㅷJRvm E'KTh16LhZx$&0A QNZ9H2愧 *YIDIu0ܮ"AWbTpv1je\m ^cQq C6@J8J`p='3I-x+s?$N! %)ZvU"4?g? 4? R,{!O2 (%HyXNZt"3 S] c,p5@tCޑlZ$IR@S$ `%98[@p c3li]@9S?~jǡW`g9RArJqrkZtbudsXEHZ2MDqIXk\{Vm.zSu0CI'ЬϬ9v6 $ʋhs' 9'kTUÒD CKVP%0J.5'(QIyrQPLBD*4΀RFA+0m+ AT_+WzbL*` ZD. ̛+S(Ak!x JHj?%@ dvjY̾Z@ f2 @>W@$^ T.צݶTW~ô>@S(f1sEe@2 WPZ|wV=vPx? ĝzw)@|,j-O-V$6(NW^(pOxuC?o)@L8S)$3A$Deo(P.%Zx) L]UGVt%JwP=PN]I2UR)4^GQ 1Y3=(RBqy^CInufLYuhЪ%@0(Mr^12@Gۼawg A8Ty0I$Qgq䖲zgcOT0 P4$a4`UPX,d]%85^+ a\tX>ec$ &U#5*StG]vILQ@!,$*! H*\ȰÇ#JHŋ3j?;Iɓ(S\91$˗0cʜI͛1g>JOH*]ʴLB(7C*UUʵkPKVβh%jD\۶SJ댴xs_P .bjruc]K p/0%#[8{uӨS2VX__j\XtLpXH{`+_1eF HY3r~ n_ӫXiR9fIRQs&ݶwgg?$_L<%4 EӚ@%a7!HULAQ,Ya?}G03O aC KP/ *t@EtB )4a%xsYq)@ <BbC EI4O6D@L RkS$BOJR-3$6rPڎ,Spu9oH\3֘)?!3?%Ԟ<?aDn>"C}e 8e@` +JS@U-ŒP h~a-@,$2*(>$pA)++?l%h樥!VKQ_o T@yJ8y\Z*j!`>:%P&C_W<,dANVYf׆)efZ:A"cĨPb)%Xj%)ăIwJ9 hIMsHPA3?Ԓ):5baEסjed}=%)O"Jɼ-J,@kf?^R> "D pBx4'4J&$ת_vQؕtEHS@d't:EC) HFǐJ.!@k JH(g@H7` e q-s#Ț"#,a"d6zjaS ;?`et ( . yROi Hr1;5 1Cl.Mdz@% (ЏVV Ju p )ewd-( QavkV5"O\7z(BNCBŎ'kH-"1[9WnЊ Mzff$O&wV!+JMŝ5A];;bh~6k3K'8Pʕy,LwEv12lI'!w!,*7" HV_Ä#JH3fG?rTѢƓgثPK-_V0⯤A8+Q[ BON:́8Oj!T(РPt`R8} ԩP#U ^XiϭMV،K+xTT'׮s݋ٴtbK0T!ؽKzM;1AP R8U6.]l z`ppߧhv.꟒A ]L0{o3vYjv}9ktXkIG=&`}X{@ZBa!]1LD (x!~ A*P2NATb?JSjMلJ4M /1x#PbpΊ d0.SX4W ?*0 TAPx2VXH)Bsk1ݔԍ9i}y୩$TJ$v$#Fb*ꨡ! Uh@T뢨Vuj@!,!,!,!,!,!,!,*7" HV`Ä jHŋ URƍ|zUXyʕ)e'p;F&dR$ V)ϞO{bє#*3zNOsV:tZp3*t&<ƍ{"4'U20 z;w''}PԴOgLHVޫeJ -!JT80D hO,e|摚Xa&`zN}k$Yj87߄:*T Bk,&8 zSǎKYodEIL,ԩ<:i6SmKp,!Сfu.Jt_7S kI;{Vp bD_5+ٟ&יhPғ):oWVЎz /m3sە[q؉Qwi5$`%lQs]IF1AP6HR?]bTbvxxrz Gh{:8|0MAGvFd3@.Ԕ{Ŧ%U3u[AߑXrmW@ V%N8]+9UQQD[iu("bcRT #w*h1mu@@X#hZE}6YAbw<^y֔n"Q8(YVeB)k Zgd@*HI1lRDPSJƶw}) AJTg.-es߇XKaITG?PI%(Iu!,*1" H+ T!‡#&,XIċ5UVIAG @~R!FW -aމiM3f`ON3bR&o |0^ϧ?ybQa#ΤKz PyjĢImBE K)в8uN)'رR]83"=9ҌuW ^H"%89 v,i.L4gJP7kʛS( U '!86*x]ֺgURf1DxjwZrMcB%$@u 2+ȴW/arM2Z<@d4(!+J2%UMTbBi1C5L8-^)- )p3 QeS)23Me+ (6B*BZUEyYJE) 6 P,3M{$ )@`i<[ Df@.`* 6`'iIr W[E9͠h, dRIG@O5PpC$j&68M+ $Jd5iOD1i}%fHʒ Ǵ7 /:ƞ4ˈˬ-,2N3 Ќ4 jfeUZYEp!Jrn-d+퍓!X2 v!24NjL" 2π3*m{'Ad?m-@)(&'OvQR UR48-xS`5/Oe,e2ĩ&GD5]i}5bT ߀<\=UhxETb!,*:" HA&J!:HqbC+IǁB9_I`SPIeKl-[~ț"OjfB;>w5)yҌ ND*j{Gi&-(JT$ hX 5+ҭ=Y2ijnIؐc \dQʆ|60m5iHO %`5-\%:;u'5,PC!T.@DIlյ'VHOF-kc^oR%6Z~GVM9uo6QUк4ܩSI_Fv5'}M?[qtP-8)^2@QIX!US C O 48 8܀w i  ATz{VXAD4MI?PFV cM@ql^|Jʚ0$)s3O. T2&ͩބ~^UQ8#xat圔G Ef5d%T+n!h@zƞ@?rcA%+@AY`QU6? !Yr GR( r*6kFoD0<x$KS$,3_QDH%As@24RMe e:&AVr_B-eVkIfer-ձgvV<6|Iƺ=Qq o #UBa[ۍ; 9ri鍧~!,!,!,*;" Ha%EDHI kXDMC\pɓNnMA%lȊ%U4I =Ю&^ঞ:!,!,!,2 x4Ri@JX Lh_G6R„$rE)!<&B1>nfM+tX'P+7SyѢΝOEx/B= HNէ$MQ s4X4VH1~ ؗd@!,*W" H KHp?V8ŋ3>c%MC"?N8e%8EEyd2?U"4` =B0WYLbCĂڟ8 Zb"Y/g x: Tgd k,zړl!Z$/M$'AC4)u]c.550@!)S#@ m{T' );̸{ wfVHN]LPg< 8y(!̄ /ȺrH]h|vFW??q@x85+@ dx2%ʝagA v$ȟ3MfZJS 8%>'QBtlF1$THA jpbvk` RU/!!,!,!,!,*M" H7J !*,pŋ +bȱ#A C9ɓ(Oz\R9f̘2sڜY&(,H9#1Ptf8o,B')ל`ÂS-5aӫR3eF;â$ _u+Xj` ]OL+^( Va#S<pJKHZ~8I4*8#z%=85qL4F.6ݟ2#TFX.ܹS?@@Tt(qWz BA "@P<( 2Q\:t&P{ BL]Dw#OCQX(uA ~DA"{E=l%^b$e+ČjRg "B 6c.T>'Qw)3r # xE*yhcj=Ifbo 4@YwjE\i1T=4_EMR@4]J'D(3n #9AsWo)0h2,WiA<K5WmJ+5^,65 uSMcԐc˅F_86Eic)&+U3%iwotCWU?56TӚPnyc?Q@!,*K! H*`%JH@M3j4诣Ǐ )&Ȓ"?Er ȗ5Ͱg w*YH˟0aVt$N(M=?[9tFNX&ZԃQp*HwnEH'lǪm{[VBPIvc>W+[VVhbX67I(#/ȋf^K  \߃^%"'0Y.]UΒ/J \Rwݻ3~1,D}JpU%2dΚ߯?y5WR`O% c?4B,(8!phN+uplu@{B33 ̜⎏8)0yJV@$XPt AHx$b@/&/b 35ffh*KPC#Е ґUfA${4co'@VKs?UI q]%c絆=EYjNebФI3<33OMhpLh}!AF4%ڃs)n@ $ͲgAP +;˽'풭E4 + ޡ@aw"]3J^fte21AƘu  ʕ0AD}]$]2)\fZ  ʃ= A&kY.m[ܚ?A v`E@' s1 L}WȭVLe%&vYvyu寸+&>kh9gK>9؋c|k,`W2ꬣ>O%BkPwC u& Yd!,!,!,!,!,!,!,!,*L" H J #JJ fǏIO`KrJADXHpQw|ẒGԙS鑟DzO#,&I< ةX"U<5k,֘ UX)ο FlX4a8߹BD=x&ל6+ZUlݲ4pjIArZ?BMY5]gA)|dxso%QŽ26ZF^6*; d5$$D% Z LsxZYAXb2$!1мL _iV 33yEuXz"t@ @2t@P?CR,ɸJJX} =#^xVYT@t@"30#)l?2*R'Ë?h3d9AOo&g9@S }2zL%3*p3YY 3 $Yn$$ 2408zajv)Ad̢!P= 9ScZSȃ :Q(23 Rx13EXGWy0S?Ր?4G9*3  32 ̒@8YE+u#d=#a BᄣP$O'x\E(A%@ɍ0I$6I/ !6R+ p+.3Pګ # 㧯 VjCDAG"L8$#ҧˆ:@\΅2 3.Fp.U^NH!`@0dU%T.rKdP^S~4=%x\Q6Q[5a 2{esUWwsW,?-ToHV@ ̠5hC b4AB> !,*1" H+XI`C#J\H"E#JTIAGl)Sƈ^w䟽w\s˓/9B́N'Dޡ9DӠ?&СDsԤ SR=+WF> ՋߤRi5GC&P& 8P`f9WFX[aQfWenYSqMd)5*PKo]6Zfԕŕj_17P[3X5i ݅XEgM)B}PC֐RP@!,$*9" H*\ȰÇ#JHŋ3jȱǏ #8_ɐ(S\ɲ˗0cʜIsI4g͟@ Jѣ)]ʴiDmO"ʵׯ`ٳgg'm[-nኙ'ݻx=OPhUMÈŤ𻷱ǐ#KFط,6e1_$XĉL{\2֖?.x1۸s>Zh͂9[ެ E e$mKNտ~LBi_sb0ײFl[7]!4U(dSTfgPlќ@@_GТP$s VT),!eBYe5[[e|s_=e@(t 1?J 0 }T 58#4,Yfc[I`1>@?*pSIn $F iP%%6P 0 $x&@3=Ls#Hg5f9()wtJ?@+h3z%L2ͨO3s M(G s)g<Ӝ̦w|MOkDPH&(+oJ"RkF. 1@P 0`@%0,*їj@. >L9`<+Pc7#Az(Ӽ=d EM@-ޜ6C,%@7/M/B)8zH;ta C =:VBɻ8Qag-//ȉI岄hy%%% ! TRfQcA>GC ,+# "wъD Du `㈫c#OvI+ZQH8.%:1@vRĐ RI%ȦTO YId|2w0!@rOhI4$\Ĩ1|Jl"0|7 x$QG`fsjNsc)~=0LcRHW)˘+xa X2 2=Oq84xdTSY$  $IuҕhPcw9|1VkeIX,2^1  H8   W0H) /0&} %$ d%cegP0F(ǩ(lj$ &0"O!M$9H&MNO*\V6HbBZDg0#YPkCizFb}bAҬU.Ӡ`[cZVC-LfDl8_^E)m$rQ mml1  t񵴧2Etgd*߈#DJ%&$SϞCŒ5!DA9 %bCTͦn>=Q#F?N߲L %UМ@ōN꠳f*%CcK6@00s)gpJxur %**BTRK(D/ԃzYB.t 44%t+&#K&L+gcYP%%}J- 0M+ cwE[B db&)$ J3=O20K8?a R?^ EfɭK54(WjgU Iɛ$gЫPO=+WHͣq*NT*MHSzҌP;ՙZAr=9ClTQO`ڒ-DQMh>|HֵrRx\3$q# h~x+(K~NABu:ث1>lu,4xȚXb\r@Z^nwf%K_WP ܫYDu*,PzQkWkYAd J%,+r?$zB3!,!,*{# H*\П@ Fd(PӄfȱǏ' rń4\ɲ0cʔPO *)gΛ[ jpQ٫PӦLI`U1+ɬ5BQf4=q@Y65[*MAJwE5oFe .[A-M*1V Qb# M)1 atøX_!ze|P̴J:M8aMAM'D$@*Bb .A{sW@ۛm+$NI&:@t]}jZܞz7{-uW% Ar ^ť)@Dص 0J(a~  3 A"P+b6  #MP$T@/^M1$p}nGbB"R{##PPN83 /3 @ %Ӱ nJlYߕ"I;Cr?Pro9dL))<Engw C1+PO9(Z h}H8 L+%*voEjb8@GУrbDLO-fN6P$sPr`Y? 2K/䢏ZRR@R/FӰ03} J88bp_ֈ٭04!CC1@3:1E[K/u7%JTb@q%pk$EOlÖ^!`\q3l-rHr rG@Q LINR%F+ j(LX%p Q Q@vJǓB8D,=t< p7Ҁ[ =CTh F-18Wa$Gl1i< 4 !"6PV,8_($7Dl%6M \ajew Po)PȚ!/p) i8 J9@v8 ~PBiU)(,XI<-u@˘@|"SFF\ :) )JU}nتFӲ|H*BP bbRJ,f pD-|a2|"HH%X⢕TB8@͈"\+#H&41}y0FR#J ,[nIh񌇘dĂWz'¤!hB@QI%! L9l*YHb 3%ȟ 4uf!,!,!,IU !,!,!,*k? H*\ȰÇ#JHŋ3jȱǏ C$_AP\ɲ˗0cʜIM*IN$_%MKJѣH*]ʔ$%JիXjʵ+H>+[Il%hӪ]˶ۓkܪo˷߇>7pǐ#3?V1z&h*;7YS^ͺGUrX%&4M7 @ @<5PbާNu:C{UHICN( },ӫ_JUsV*Q|`ѡfϿߑW?wX`밇TIᘟ枟 ^;7Pg:+g_헻n8<7/NoSǹ}:WTgԥNyˋfů[Gx o;I“.} [HÒq/y kCsu {Hi UxțHK /~ǃ_5*zPCh%~qOH.^w;]x87Zn.߰@?X.XS5!#0DU34=y`5A!,!,!,!,!,!,!,!,!,+] H*\ȰÇ#JHŋ3jȱǏ C,O`ɑ(S\ɲ˗0cʜIɚ8sɳϟ@ JѣH*]XRn.JիXRׯ`ÊuٮhӪ]6dImKݻxGre)18kÈ+;ߤ;Ik̹2J%:^ڮa7+{ؿYbֺ?J6`P μ .8гksyP͒| B;g')(~kR?o(@_P-Rl`?A< iVI&%I(RU\q$%3, T1@20tb1MP#D AS % _ M֑?9De-#xdJp9%i晬B, &nM$cA@%0NpWЈhcDIA 0'Me#A I^, 59Q )|JE (Q Se ?.F31J* sMSRJb X.3E3]b+#@bn$[h-aѤeN R%ֆs~U6<4& =&ЦMs߿1 "?M! $ece֐h`Heum>#ijS&+IU4BS3KUXIGR5֘SU [mlc6Z0vtmxwBQSQ~{^(go[ᐣ}GfgswU.TI ~f`67?/خ{sp{; UZ R~>7:?;]=َ_N -?x ,c`.$_}SVXkB,X^` l`+PY@ 'x&$dxJnԥ *">V0wSxw@  T^ xV0_ {hA>Ȁ JQ``E81xHvax H]XVLhR$xHЎuhPxģaā< 0Ԅ !CxH<~ ]Gc/DBlgִv7YyUpŔQeA^5=抬\E NIy8 xl1Dk#Ip~`bSTc}!?hڌMPxќ 2K;1=ܠ[ $aIŴ'W a$R#*g@K1 -p\lшƲ[ gGcs*Ӟ336\52{| un P AĻ"Eh@V☠,ZKho؏.6Y<lc7e>^?`{ʔo +rF|teT|/[Hd#?M !WwLK^PK`3IbbISF&ZfdtYFd2p.07w_B_Ӄgjc!ΤGuXeXFGCk|bEg pgleX|Flu7^jzFgmфdG5y>ȷmp@Q3 g,{KvZT(V`.x%th;@4eSttY3f@HbPQ7 Ͷb5QrKIUNhR'O'!{dU dd :s|܄`CSep'@O;ZXan;NIfsnƣaGqWQ@] 0e 0 ?0dWRć(uF!@g:Y؅tH?}6=sUkfu7GqE5K3v]-`L @Qxl& FSO [eUwutGttwxt2 5OfLsŀ?IIE6GDJ c=C@0 KD@Q^%6e &EWvj 7T2avrUvJY&VU[c%XV5[(r׶4\Yy$H8o5rJW6:GWic @WlC  &yg v5F0h=9I5+inY=?YƁT8:MTAY y@ÉCVhA3<ϷM@9 AidV љPH d`e`|>>9;;+|I#e0ژI;Y%!SJOȠ*:85Yg1Vg`N=sZ H;I S<_Y;>Q2z4?9- pv sezg808sQ~:|7:ICZ8 9a*/!5:t"x"S?#:3:کj"!C-c Ɛ !`  *ѫЬiEJ` ` :?ڬ?Rҫ` c q2P0vpʭa .iZA?0PQIEPK} ; NlWPvf  W ;`d! @*v K˦gQ WDD7~wWІ5Kpjg1 I$Qr-W2[ NE&Iz[Q p1:I{k i Kzqu7pD_Ds%Rk `:H qE5P hNc> "JRJ0&K`Zwdz+D5KZip 0R@pIL+ ؋Rq1 Ƅa5״cJ!N L/*뽨y `ecbz\\ =JIPQ\=Z(`kS bZ _*C@!#B?HLQ P6c 0Eq>L,E3>?ĪQ пYCƢ_\? gy { ]veruϕ#|B|fi X ol?D Q jI`,]:+C@[JhL?P5gd 29!aʏ1Ik<ʳɺy <̜,J $P̀[slXv5cJ W`źb`>,. +0 ,q t%cQiʳ(6  = g v` DI`9 ? i- q5W|g&NI`pģu۫=ksĮp4ю!'M6`5#Z., h*{@n: Q/KQKE/` Q[`Q4ŴP΁~"L@ )w`^.?K:V1p :/0 S`pZ j%`aP lBupgНNp@g `  YQLbQ z)φC` 1 W\εQp&3_¶C Ew?0U(KhRRlKGkҿIQTla.Lb uƍ58Ae)MA mJ"&J8qcK6>銯X65rL5n,@k+RhYJ8K'jI'I嫉VJIZye]tX`a$;mX:רG, ׂlъ\~9!-q?r)1'qHbﺀ.-%lj7~3/TdT#r׾I\(?,Y@0 W)PBi@T&9&V^)D ja&S E?dPerDoECLƖ䠌ja'"mT``Z~Ў0!r_3 ̗0Q0qkBFK%3"R!6Th1J"Q~)I~FAa084?5i+tj@ ?]$7 PAa K'tFj-#8joӓSwم0\њQ lV]Ns|'m5*ka4]`6^R&2D0kN<[QrZ|yɔEGE8%%*hѹ~{= \x E&iH<4oC V)@Q\)1dJIl@&WZ fF0!64Uu,\R3+2" d)ΏZE3T ␌)1`؍|1q]W r=B5)u[^({r7kb+鄔uN:4&,'JA|(3b2BT+ȡZe`3\q,\,+]:t/?HHMqvc#A IHg3 ďLbesy@Ia[d ' _2;w%8j?Z@VbJ}ES\pK&-\ :I~-e[)ptb`C30H繊BEÚC~De(V tSL)PMPmBsfDK5z4!<԰aA"9B@x#Y6Li‘/+ hR(L2'G˴04)  . C LlM铌@ ${Xj] ]XH/x PgD X騞!."(~d5⸻Hp` ?+ @q9A C69G;8 #y"4~ rLt"хlDCࣰ;#BcvG\|{R gPc2?*J(0dPs(ACVAPhZƚD#@޹&] H9@$4DZN004p9X4aHN\ j kq1I"4N\BAћk0H8^+0X8}L Lp e0z$AP%Q'1OHpJ ux<@+ +h~\K<$^+8T!(xIRN쌽o)ԅR (P0؀F%(A"8PTH"Të<QIoN $ Zp[WxdXehY Ys:Rgb`IQd fS+7 B q:N ՠ]},A3 ^ քx:NdQ*N\S PSҮ '^u1 ЗbhSyQVdq`-VNi>Id) 䚨3h&EV=ˊs:Yplo#X׊5v0 K}}^MV'vs˟#Xd2իOQ$` {|H4ȀX(ΰ"%P^5A1H;' 3iŠ$PF\^)_4_:mE0C+SQ6ݼ7zo fdH2L z+HGJ$߼ȋ Zx1<H,†@$߻-_b$X'"S ؑ譨Н=w MYvx`ƥb SxYh2YHt';w()`e?;Z+\U @-!MxX%,T&Je8dЅȊ:G ?d_փA]N@FK>sP8BL؅'|i{^Ie@&V^ce*ǹxm־~mخmmmcmnn.n>nNn^nnn~nnnnnnn&m^>DtvȞ\Fжin~nۮi^cGȆm2qFc/C5o~o mf k]Xp^mAWn+$7N7'0 xqIl^o}kހApp&"X& ac;0b5W#*YYZ..Lj2d5 ;hR wͷ"]4g4*oQG]+Kկ..4_9, /nxI@<2 W/143L+B!? )1O>aGYGOv֩ma9զh!HBb1&_ve8<\oH spVB`N6 [r0sX 6v8ZCQvΓ|yhP<'h[a+lk6!mR 7m ?ѝS"XqVQd#yaf|yny+iwY=SqĈ5ܚ&zIƏPJT#5-TQpfwAnVŒ7rJlP C}Y+hNI9ȚzaƑ^p]G~jɀiNfR|ⳋ/]|](<$i)35g2x"a}w[o8Ǽdz.u^5< h} clBOl&ĘY< ?|OZld~'0&@ +CX&1e l- bcZ,Z|ձ"%̗l:ժe̜:w'РB$@ 'ZJ2dCheI +C S]-P٭iB2 i9]zo" EH҂$7LW7>f(Kp'^K4e0bZ7we]:B%MX\>S)T-qRfvFaaS&N(30IdUr`r k-@ XoPh e@PY$`IT<!We], N@URB% 1 4TɐD9$QJ9%I@lC ި7-e. }Ie`B] Y)`Y  pE: Yg\n \d2&8SNyf8: p'e2UB8M5m~4F 1Z pb um(Ԧz.jz(O-$ $$pRܲ؊gJ& .ʊa9q j8L YBm+zj\ [ā2|gI$qŹ 4 qkiB,K?=PI9*8PL53 6,@ T}4I#7& cBDJvS!f b &@WYK z.f-I hB5,`q/ 5͉ "E QHu9T6u`%f,0Ob05c.;Y5Ruؼ |tIÝsHr:+ɏ$K BI7xg^ AF\R8s>-bqSM"5{g^6CtѦ (~:,9CFRSзm4%\`.~,`k!HG5Ai >gPP()I9|'1(a bpNq"&h _l`N?0P]B;Ԡ̩"3F[5dNvG!*e2I״8])q # "ͱU7WVR)C(^I+ p ٥/ =DS9IpIh2VUr=2[AM … 6cj7 v>UQ9LGX/#UU|H 0Nd{n a!K11DRq\^]Tx4$f"H@Mc3эc*PAI9f!FYL̨0uH4wjwWKt|A`@fJP̀ؔ?Mbڄ SI&  '1H-諉e@yҲ$OhbD-i$xaO3G8NQL}'!IŸ!cYj*dMVg vTh]8P z`MvA]TYL `% }pGבVc^v0Rx!lk *raO݉VjK8?eNzR( sä2ft [ѨVdS|,yCX\襥#vt@,2 ZFkʶq"ʑD%Q`TtlhQ}"8tst$*a Z{U;%nzqL,& UN5(&hj4!9&;/9(%vșf.eT8'u!j3ܔZjSOd!^%h5e 3"k1K% ʶ8]\ޜV/,"vԪoF/,򕔁9j&ВV%UN8At6+cropTKd_W%6I~NNh(ixgP# 祄*NӬ:;zcNTȓ)$8swN&}K5w[/StmOVFȻ.p k(/$?N!+gF2^KPF1r:h(ld,]NJ qC&FcQLKAp1DoQ̂˜"`2EYM"Ľ[Tr*_[^F<ֹPfDw\i2QHTPHm=Lq&ִ`~cS 1ZˌLe"rQ!T+(&T`B! FE-(03K pRE e:RC!K#rjf%Bs\d&E6 UGM3r}f<9H;F;k=stB4&8#s1u3=6b'b/69OuI3d?2ije^0[3 hP~djo.D.l"ud02s% @1HV5o+3@BQ2Ie"DPOQFi NZ6Sm]NK _J(5L! TL=[|`ZihԠQPnL9He(LzM~X$nt&ӄ"5XR}$'liSiec V*W($jEɥriE3J}`B)U)@ (=zrj('y A&^$ l_|\?}蠅OL-CG Ԅh Ē]9lKS4jP!0ujN8^AM @|X,ԉa}lM,deVJYl!ZI``,]Ug 1[@8iĆY \@` &Kx9̓ޥAfI2iaz9u/dJ%z^K'.hԩ"GlH[gvJqtF(CŇ47೙`nV#\|8G A)5Ayk\HP`njnE W>i j ܬ,KL!؅pj ImET oH}P8T ^ u`JJ0_cξb+2YZ.aؔŠ3 r9nL|saߔB)_!FHɢHǷq&9y'zj LP pg_Y  ā YxK^ rb[bb80&61w4"?4CY1_st$HÜ"'8LQEa)/xX0|l94rRs8ahtEJ7>PD^Sx-: u(JYRd3M~DiRg -.LoV4.W/u jFּTKQ:&Iԁ<NST Ԏ)'ݼܑa 4 6_?QB _m )%DE(zYrf E88̝aR.) vh°;A_ PUrg]mRv%,XJbqF+K) zRop]hrz1A"dP-nMCb *hPr &S ^LZEƐ`YFU=W"LNQ a)V; sEI$pQSWB¤"-hXJZx!djmfe8Ċf"->x˳e8ܟ "VĂrM *6pJbWINq ؅0Uvƒ'~G#iN [8*  3V_B ϵ2o\rBȭ{"H K:"V6n:k@ ` 05K9 :ځG BFabv9xruHQ*%f-X:H3G.}瓖# ZqAȊ:G ZdEE{XQRd8@0_foRQBsy!tۖYVD* &`4Tg PD_MP8@\C:  Z|pD`Pc"nB qFz'h#d2*4/h.d'*A6*uB">e@$!*bH'$ d@mT/(!ht'X*‰C&DN}4_16!"aT !*ddI H# kb^Z]-#!:#}d+f&Jf!!s2'sa!D-b!IH!#JF`*O4ae/@t!qč" L" 0A:qn6:""@mtTotHj2.QrQn‚8`QEH2,g-*dqHHb*\NHL3!>nď3)>>@PJ*8}3Ѣ]a5]59ge,6#Vh*s$DZSFlO12:>++3/-h?oK?+OR,6ATAAC!TB'B+BPX4 ^.C?DCT@WNDOEM>SEdE[F=.ctOFsTGA?w<^VE}H-ataCH>G)زqI&b>aJL˴&&JF6S!l LN糫tJTOӡKaOAPs1&46 PoP4`h0e %F!H2- ҋvbG\-N_*4 V+O*ҀQ=Iv5 W#c .X5XEim `j[_g͉).VǕJFZ`L'W)c?ৢO&1$X7ioш,ia(|/NA(A|\7V8`v nRTٮC4N3k~H3ԽHU6ghwh=f1!ThiHW3p) DaB,HBǵRuIpcVzbkS6 &>~@ 2H?!2@t "/K#m82FV tn `R(9Έ qQE5u*>qp t/X3Zwp:pt!:ϽZra2ew!q-AZ!maמ(=*>2$|~a o_5C Cn\ *t!  p HˌA`Q7 hؚjrc$x0j4V$[*0FW7#qI聏OV0XYk>!ic^-cNApao#L]5i,֡d)5S)ZhL:rʸÔ8 <0p5 `PVx)=V#=p,>Br%؎X"RV̎#E :Q\`MqRJ&$nr$;CǷZqƀۦ O*;nȭ >bl*+9 oꦪKk6 ! [{vU=Zn8chaQkLIGT  Ҙ4'$r`42&s$#Xa2!>IHp0Szs>)KV1P({bW M< $h{ߨѬi[hW)X6 Bk% CGIVX PCϊ]iTh8AŪ#Yf%\}$$2ffF|u?3q,e8E2k9-\kK  < z^Nc!B(MWА?\ y訳k ʯҕ<"- +܏;e V<7*p l J&s" Ӗ A.-|t,]B?8]b$fF!r," L "@w§ i*lbQAL FuQ')歄Ҽ2 $Sk#V 7Ĥ&M#:^8 &Jf9 HJrCuub#lLf/A!-,Ir] 3$UR6 J9J;&t(cQBN;Rb 9Q.2̀Sq+5'r=ъl:VZr]|(# u}>lHo8Ff-DE~ a<<"i`z2CfʊC8rcCʋY<:ͭɉH31ʉUP@mNkWֲ=E0lFLVn;{BLmg Pgsc{)Q¸I{ߖEV`O:7]6Dht|p(1:_;dx"KcF0E~ 093ہ9ZP S߻E,9E/-Z`X . | eB;]Qb8S `65ŞSPN/OG Ii?p ` p' Hwi$? E+nx`~ؼP cm([#<*L" 0d |K#> i`7Iы'@<ĕ092/W$S d8 pn1Ia 2R 233 DP 0S`#0p29a1  _> U^9\Ps"1F}g!1pU+` QP5g!]2q Xh WctT ]"5Ӡ *\t_5^ P+`H tx+cxD[ UǕ=P"GA?H{Gm` kX4P ` 5 e(5 Džp[CU7"uex (5o,77p&0-77-772r r7 ;-3נ^08oQqQ3tT&daN$"SP!ub@rj 3Qڸ$pAeN24 v6@+1 Q Hcp}Uhe!a+ g ,6^̅+ A= d ux @f@fh"R)0 РY0%N gsU1**9?5 v 41EQ@RU-`$EMpC` m"3 *p`$~9,Ff D$b1@1R-97B` h$a vul-]2hd h2#I"! iT-.yԗ 0 o1y8 ]x376X@ `f4 `gvXP >@}p 8w g=bQ! `DN]X緢ТwI3 GG Ѐ  @XQॠ>2 \膪Пhg!Cb t@ V`B#s,AZcT:kq#z_QB8AflVHuR`u ޠ;ћX#:epw6 r8цPanH ц, #ɋyt bfn/Y\U ㅠE 7 % P40QN*a5gȕ&_ @8хVSQz7^@gfqP]Ͳ 'N ` 'fRX\JEJuz(`&a1A'1QR@.#& d ײ %BA` QLoR˨dW{qt312MHSK #RPK`L oRBD@F dpw{V @H EydХSĢ5!PQ` z*V 8ZSRp pp(j5y OsmY Yiq 2 mp H $A7 (U5X`*1aaєȎL #֣'&pJEa$+!B<+<5P aIm Pԛ7La(PߑI=֐C̏21b:ƃ. ܹ Rb @Rd0l 6` 0 4PoHė2!b҆Py&fn&ٸI\W Ϡ0O^/yA52%I: 10 O*}9q34R( q Ⅼ .!a q,05ɒ\ kҶl=[2? Er^\!D(9EwA Mə-p1!l ͧikbafId 6 Nh}*yoe` fzw <@!;i2b]z=$ !vflt=! %iR0ι Z8@nU >@Lcҩ-D]P(1ML4 0>muSJ C0;mqԛ4P=U=uRkq]\u #l- %#b1#Fcz4Y-G 00v " z뺼gMN ڳX. {K7%]ěJ= pڗQG#&o2ѢL3g|k~=N2 idBor` 7ən/wQץP ? N.L" xlP, p Ԭ 8#W yQJ&O rŤ DmCA babo>JG@pnm :}x_e?M2C""QG^#|?8`@ )pq@j )]"2e"T.?eF%,#Orֿf!CaSWpEc" o2GArQF'A@e x09Q ܣT2NxlDýJ&%$m|JSTxIR- U4kV*d4YcWs*\oeF RY4"j5\\ P' \R w(M z`Bl "ɢiOɕvBt)-4n"^;nrTXV]tխ_Ǟ] pa'1mD81e>R,=Ԁ!&ETfea 0ĒBO]t &EI80f3o̎'d; A b=4ɯjaSh؅4ϼҳ8qjAp(&pTZJT'p v0h1UpjIԢb"Fc ,*-BI$1;EBPHB3-4RU -&!-'%4d^lWD(2NIaf&Xg PzUg"X:ДKq%\s;qjp‰лZNlvpOf 4L#Il[`L08EVlwH] P4^|+Z~a%:HÄ+ )hJZtv jA=KZXuM݈}rZXaŝ VfX9%lhhF\NjI Sfqdf<)8C@wfN hSi f&l.S-fVpWߺ3Z\E.i ":֦XnN#Wa ۛ.VawsQ|9{n<&tƗ`dTt!"X@:-;A(8y@A ?TL~8AtU#YG<Gt$,!,xAy X@oؙD%@[Dj2f|p@/37fPN1ȑ;p1jcE,?A^Ӌ& rQ#c,A*Evՙ#l,凰!-TY0 ; |e(E "LТ~"`r6H u)J ҂x"<+-o=!%uvS,c|{?V+L&-SS:qVHV6չNv^;Nx3; zB@$ j0a3Lf')rD'ҩQ*1K{nD* K%\Qb7lY@Qԥ]9_zOq .>_rE9L&〳#Sf(TNueYs"TTvի_8t1X. 3ejQ$tk^5ķm ^;X{ҁpU2I@ Pҹ Bavv:WA/* QԳEmjj HkU֖Nyim[ַP\ ]V+QẔ "r\rR+VNBs\bר]ЖⰥ-(.z W%J_8 q >9(lܦ~(˝J]L 00G`3XX˽B#DP"pbkw .w+`_aqi,$x,VX7o7 VWBv0l9H"27qNQI+K=!:I'f"Ap#p9ģqf6`l&qԡbh|%`{ OɈ¸4jss3.V%ab ɪF=Аn9DTS7q 4Nq̘E&f8WDr-dkg<5HCv>qd i^ڭ; TLgz%6wN /lz4n|н*2W,#^)qnguf<,qSvDZ &3~bnJxaV<1t3nvsLLux>1A=/r ߠb?q v3>ဌ,'(N"^ggkZR:2H솵b4Q˻zLT /5W,TPY7[0y{I(h*4ԁĤDcLJ-֓ӻ[VLU} UqrXUGWE-PAX4wJ ` ?#U.4f>k\h PYP 7 k ap<K70 ["7zR"X, /-{Dx3( ;!*L+᫈^HimQ(H1V /$1:/ rrOh B't33Ifc=ik >RK{.U8 QȄAJ9V#`P8H6P$-Cɀ0,縧ZUaH^pT&l೼ĠȔIA»YI*a c38j!0XepИ+:V 6z b"P(H؈5ҢJ H7[ "`JdI.c4fXh?.c,˙H; oPVpT[iޫ["8똄PPbHg tHc(c8TL4fCh8ϑH/Hx# )|h6<P*zFJWap›:8:ai TÇtPi3Z01hPMHZ؀4|hȷ0̥x! a^"K4UCȖhnAL<'΀+N q89*9o9 Wk&WjAh+C8 =1QK˩dx=5AO1JĔH x욝t3`ĉYsڱ3I»PqQ+ q 8fjąQe\ wIyo91;qm$RȀyA"('`S{HAC:G4٦%z:Prn "+AqpVdM$ t Odb4 g!Wp ARh9,1*Dh r`. (҈( bS^H#G(LبgP H>"!9r*V: h8QJ")~Kʊ#`iP `0",SP8c`i(^aؔgؠ[h ] $5 ]Ѕ`ILe5%D lXcTu$fíe JJ-N `^$~;ƹ`@aE5;"+:ݛ'FPf ZaH7Dx\:yP@faDhZXhj Vx= LiS̱B&veaQɍVX*sډsE~ɟ3`dHpPHWX?5`Lk #!Yq(R0a`0{dRRSjSMW $VRʛb9\ @ WЕENn =Qyc+$NJ08SAL9Vz)o?lB.x+@xnbA@څX@G yB p6XH@VLï;@hUDC`ЀO0VO%-X%اM#SNX"+%(S yJe"3`TrNs \8DYTQI*f&ؑsSpHbLNpa`eldXVLC} @ej6r0>l$|*9s˙JlϳxH0^Uh^QeF %Ry-xNkMI"4u[4˙ _ka> Fv8SPm+ٍHl  P8"&ƌ!B @O@4CId­Iįȼsm"lWCAhL8 {'TMϺVfba2J*r^^O%(mlsDAD׫q%N8]#!i_8YNky (Wgu,&ofPSq踯%RQɜAaϞq=$ X<9T6@HLLsa\5/.Ƒ\P+4@$`\+H|Р OP/:ȸN 8#P(L{Ȏeh.[xe8B̉p^oeXuQ_u!X0x+eP_Q?%qVIikXXani eXy%?hRo ?%D+QkEYVPpv!?QUJoVH‰/NT MAJB^\ N*\cr8,^`W &XLx BL\ʒO^'M2LY u%fŬd+iEž:7NJZAEj(DG,&ZJMXԫBJDjitah|;Nz5֪'R6|0Ӏbq7]:^ %VIkpZ-Z`-XP oz,Bk=Tkf ,ff9P b~=\-A^k<Q{aG&1""a8&p3rdEB#Wd{|8Ւ+wB_;T 8R[XE" XPGv% g!+gE#0@*z WK6/Nq4 'nw?@v4a͵ fO+W}}8#-fW`(-yFeR %⑮vmO^L>d/]j@/*>XVrO#e)ǐsS  nLЇNzZ91Ѓ,nq\\/p K3%ƶ׷q?g;SF+JJ~ M >+ Zi#gX9/4,jvӣA n7؅.a:񱃕 uHY4B:T`T,[hD_H] `U\J`B ŌH`iT0Jr\My@?=@x̨F$D!H C$%C}LکB2JA HpLm+D_^pcnA, e,.@ !-Bd_>H1؁Ph긃4k$ÓOA$:2\)N @JzidK?7@(l hmr´R)t@!)@2BF(ON}"]! LQTI`RdJ(E Hz:G{Eh]`B.tةϮPeOiC2֪2=(/qhFhVBHh=Rpt/r$蝷lrX mkĤȍ\|l*h[ hbdF5E@0&}&ZF.5lñ^JBhs-y8ITК)4j) xLQA`!Wj ѭe 2FɈ L6 H]Zg (jGp~B/1@G`QHЯ>Pqm"q/ZKds-B6(@>.m&|01˭5n)Z›UB"g Kx[W>t3ExU.`Y:fb>rV!7$DuΩ:R0QB$1@c"[ ET4aRA %^K-/o9K6iBaDApB n†2@ Yˑ-!+(\.ӈ)t7$(:7. BQ:,B=„%^bW"b,sCrnAo}FzLUQY4@vcDE3; E4Mw%L ,KlP5?nhrAr @5Rۭ>-o`6 T5RT a`FehB;DCeLK(TE\NTV;Iw*8l Nԇ] 4Fiقr:D%Fr._ѱ5&KlqFMi[8m1jBZsjU rB5?X jw7d1xqMgjJ<u9M; |iau֤@^4J% -`X_HurTn%u5%aC x JM} B|Q>M?&'ATbHD,Z@t__x x\*K \q6@^m;)*;\oFzAad}K)9F4!X>HBHg320AZs H/hh@,,@+T(l3S;OBۘD'30+Is);iJ%^9D8yZ}(~(r_sY P6+@O2^ĘܛP() 9y~ A~դX:JPz>o.r$k -8CiiKm-q7${J2YPd5yAVPO͐kͱrDCB/uMDU3E< T4Q TXH.LA-^hÏS@`gN%<ծ,bLaQT8rcBy\qc&ۥiO1X̎2 1[Fct„M@ cpHjyFb\e?7@|kiSF^ӳ^̆fEf`$5# p0zn  0ß(F/>Q H @A i5C  ,1f$1 7@쀽 zE.xq6L6D0A1d2źT2acxW$!9ĢJ%H}<(U<*sF.7dT,l$IChEHE~iXaZf 8 0aNY 0CDf!‘ DR(mG `G2iKi@ϐ4?![8 Bfl|3B!Eވ7 qb(^`~,lP DlC"rP˧ԀX ̠,2.f.0#b?E J ͎N1 + 9b{p:M -~5l q2<X?_<Ȍb8 8d#*4+`[CQc$lRhTިp$C D9X|IGHFb9 Ӝv_xnXkKġRL. O-@ H-7 6.97sYQ-3SBe y)}2J Vry%% J>Z U0}񻬔8(JHv Gh 0Lq F͆DFh35[򒸝o|3C\<!#MPET" Gjlnsfz4Q@und&8 oKa\Ch48IPуB!\!?E 8q@ A5$۞r|^V$?I9&QA‚֌^a~7cAf!HMhaga=>a- `PnFjn F#\8 ̄~6`8vnL!.fb(aHb"^LZi6PH K"Q(X `Ih*)VѸA:^0 h,6  OƀzNJ DÕ&'q''@xR&'p'!bMxn="sbr"ʁIВDT T"gB@1F`F|aD ~@c1<4+q$n5!6Æ;HD."!cg ;68jB \I9C.lJ9l$:˻x~x$(lMNAnN I2*ň~r+v B(F!+,=B?-2.=12!'.2/r///s0 0 031s111!32%s2)2-21335s393=3A34Es4I4M4Q35Us5Y5]5a36es6i6m6q37us7y7}738s88839qt9m.3:]9g!@:;U9SiD 3=39YO!>Wsg? WT@tU3-A)SbJEt*tC5Am4CER6'$4DGtEeq ITEiOAmsFkGnag2 ȡ\HK# "IJ;>j,wzutL3<sdGtMe?gለJtN>&N.CCL4PBt-2TN5Qgq -P5R[gqI%GN̰2S'Q^J T39!B@Z! U:aQeUOi:oUQa%huW015Xi'?@sZ'TX1r#V #ZS!!^!%aR;r 'r U[;Rڕ]]6)~GA+j\r 6 6Z9%a]vaCD2Gxm?z,I`r. ԕ `]bX`WedWe#Ђn i!_O7UdX`.d_ i$.eb2fݚd ^6j=#1OaʒholVv]আ^ubo ^vZkviKVjuXGJjvViiku@a Va> Bb#uٵ bQe[6ZvIak vl@;SlD6$*/2sw6' dqvz]i7nYV]@e|]CWsesBqsnm(N!&w/zJr DrIqi Jek|I6 8od.kɷ-(/Xn] 6}^"_Ϩ$!`ۢru 1to{Z_`w7i- N]G؂7 Xh/؂W`KxV|?7bu&~"/䅛ƁD㊊ON6pokvu Pix!xՕVqWp7`W'K)&R3R҂` pCh6Ik9t)8{c^Y nkY ^i Xk7k {(N+.`,dhKw㖃-kzn ؂|y|iavLW#|0p]sz^Opxzo}]9n/v.4~1܃" @*M1L:{'a|)xi7!8VJ0!DІI$˹/CWw$VRAisq/2rS b@^im'lRfv*!k` z6G"XU]!!ZH=#6VIA:w;zkYnJ~8  66/v&עm APֺ !:]Cx7ϹBكw.09[/(B͒9T; ڴUK3xxg(mcd fi!{[{]i Y/ B"x"qm ?nC" *p[׵oui 5Swv{,,#0Ƙ u&R }59fG7 ֜1 W EMdџ6DH4"D2'`q+z#SRa{ H 2h{@N0ۛluYb">Tejwq{][nC>]ݔ}y_sE.zץouuuI4I_"V "1-/ǽC=܇%%"G DAۏ@ñ^Y]]-2 ` v. (! 㱹ܵ}$2' q2޽9I/7@v L~XDU>omVOsIU`@Z! .` a $^=.Da]q9D! Ax /^)> ~>bw Dm] .^P~w@ e >@޾+ۀ~냞d @]wvzc`uc6[6g5$2w v@ ) x^~ۿ_^,`"u HAApDEA& hFq Rc 3jSrIQP.0Abț7)QQǃ2iRaI Pl\4Q4qBR(ٓՁ(hdK2iZP"J7K(,Ǣi|mʷ߿|ʅ Y^0|ʋD *}$M a@T^>B܃IR%8.DRr ղ=BH%Y $Raq㦋]L@[UEXho0a%s}]Rlr(|EhėBKFyyH)%V *j4(xKYJetSmuF<bpfYPeYf~i Me$ C qF #ФW)1Ez&@m)WqW#yuq`h@.NA׋bGPPvVFnX^q^A >fM{yPG:JrTa^ת(U #UE xVk-aVT؏&Pf=J^8/Ln59g,|9T~dMb$gB$kE[% ء \#GA:knD0m'^egt\kկVעY%T<Eԡx ^ iXıB\Gh'5Z(No(&q)ô5h'b녠j'ЭȨJ賉QT.x`ϓ#@5+vƂ[vVVdnEj ti[. <Ë,hҽR*/GylZvˢ(;I{Ua(BoZ[\kA*eRzRgrP&H*PI,Cʔ)hɡ6@؆Lv1K%W*W\y/ h*V VfNM"SD'AI[\bLdy&r 8yU0Bh:ɅbL#Fse^(N @q hzՁb57ۏ㶨c5S#P vfTBDN2 d=VJL (7>2iPJ& nB  1gpE^(d0)_:iA6DMD%>m A $q$&)\UsY]/((pr_ ͕^ь#ZӒc[zdFsB(S&2.y[K>LYhOV^(EӤWLe%t!lJC舤&M\AJbRްO()A'0)#.Ϥg%vBPg&wZ!>| Tuzq6He%熨L bOc!EA h J%Yp x0LBx%q uŽ`BrKݺb38 L ,q畩T:Bټl@8+ӂ3RzRElwgp:fmBo\n&T$A2wTdSjNt^ѓ9{, M#yJiBL| rͨ)gA{h&6?@X97+mPʦؾo^8D܏*>ښGĺ.=w{3 ƘΈ--q3̨y]A]w-qNFi%/H8i}IY'3- !V´ת ;^t'q1*gYjLLSՍYPtX9%t]`T:87y0#k< r(U(ZWHzE!wf/p|`R~NpӰ"%z&u LoskqMn@76eH@ <YæX EDiUg#I,G ߂&7xX{r5ŜP&BފO>&T_ka̟X-%njpJDb&#gN&*уi3*z6 ن*_WI g@˰Εh|%yiVBr1Zh1\_d⼄@R5Q;Dpy q!6E6,~!slylW>!\:;{xq;DrGh/qJNZoL-1[kG7}Ky(rEo,pEZP1Q:o-]rE/Fgq2O? ~$q'65*A4^?>.+Yu5>#^62|^9e14h#NcHgduUQ31uab1n=׆v Ƀj2q(N3^$VgHs<*ZO2Q ere" LqT=miRc%- ga!(o}6{C/xns"@%PĈ` Vҏp6hK2xPzah3/reg\U;KG p H ɃxwXI,8o S4S+=813IUiQj9'7LRxoDcз0J6(cL35y("MfvwGkCeV1 p Q9 yru%8$vց) RL4T}nLh7{|O!kib2c2V!=5#Q'WC#~^, &'bbUYЗ4d1H2assba5jǑ2VnBMlVdH9+j1 p* 4JPQUeEEyIEg5gr{I G 2C}7 +|0Pq'JgJTWEc703^o1pdFA) tY ӦM>qBn o_JjљA@#D w$tTw2fB}ZA3DO#=f K [[zEaD%V\e"\ɺKRU *11N4bC(d;RqI12uIXI#BH&_g#7pek=0V62r`­ DH7itꮳII6R2|4bP ,KFr$R`OgY /^YFT2 WrqY"4[E`91wP 0 Dצe3eӣu+ QP?c qvPE>eKBsG<)=iAPP* B(W.4:RS,,A B8aF\ơd+Ac7sѨ p* 2ɲ w%wrk G/egхO GT/uƻC/d҃% DK3*Y i)3itJO95+c—2IKQi32@aȸ*3'["y6a3ckoro ~\#6K,ޛO]86[[4LypȰ]]˲mhf뒻UV/}!&?:E>`G>B6Ws5"6&֦Ni6M3[&Jd YkW WjVI>{ֶZ{lA ?BƄ0CV`p '24@tT |,5E*lR@Gl~-H0y\=7)O7Q ({ ]`IɕƽD!/ Laˁo^L-v~{iq̞ Lk#|@# P̌M1вf,} ^1 [YP`Q Е^  Ίf/OY9mD2MղŐ ӧ ]F}.W$%Frlvq%:#89 }R×~0s* *dnpD\d+)=]хdĈ2SMrXFK-dT(MV8  J0 Hzq٠QEP:3=WqڅX2P%Cl8/p @ˢ}q-RtЎhzb/ctqg&7KLCk-8) f] qM+LE eg8v%$r㢁,Pg&W@r먗S02dzֿU~1 P  SPӌ]h-ټp /z9WBr 4NYXgh=%G2#P(>rkt}!Lofn/_oD^>RZGWĞEZ!&|I jG^fP@M_vy1$s㮭-x:P71OQ=  Gަ% w*ЍߒQPѺFKkO݁L*L*8.f"Ğu&F.!揨 J!`"P !%]In{]Nr##z^ /,X4iB`&>H #$.Xy1E5^SX$I6E^MPir O=uOA%ZQI.eSQ$+=0 +Fb' +Bٳ G,U+V \J¢ 8-/QK'I'dpNJJV2qVfkرeϦ]{&TRzcEw۱oev]Yf [Y8X$ڑ3f.>:/=2,zZCK-}a $, 9P^A,Kȭ j3Z  SjI\20{CdSVy娠eecYHP(c$$BiU`]L\yY>EɿpK$PD7y^`|N#i3 ^UJn$Pѫl*'|K,&(fZ`th@ 0E\ Zf$ebH)ŲT%[A%/t9K 'QxzF bUPJ1:5,r' `1j r#93JK@n}iطl@tY@Elp6( -KEh1ꛀ$~7r<$8M\O.Y( R>"jPs9e<8rL+N_]b+ `YD`E@|Y$e>Ōڧz4%ri| O]NyAI)Q pbHj(!'+WWd6XxA!LX8ƣA9*Y+%al ,H'bu%pF2Hr$ScH)|(fzHFd&{S) j$NR}=*/A InY4"dd=pý΍o CJQ*x"/h L< x]N$f_kj@^~s3$3rs]Cod̉~gJ_M & S_c#; 4vdc< !,+\ H*\ȰÇ#JHŋ3jȱǏ CDoɓ(S\ɲ˗0cʜI͛8sɳϟ@ Jќ<ʴӧPJtիXjj$ҀM𷔫ٳhӪ` ʝK] U߿oD+^̸1Zf )5˘3,V?$L _Bh@ڿ۸5'*灔fMqU!Sbp}V W@ E$ 5KN*I6B?p? |߀?]AKO/=@0{f=З})H& (bB^pղ@>Pd+0‹@hGa<6餆XfyA"$@ȸZeZi}A#M2*OrЉkeg_{j_^@P. ?*סV$U-ǀWIZ*vUEPR9ꪬ꫰*무c뮼Mp0J-*K8$ v[ξp ޖkAM8+ M{˚:PC/v.DgÚBjK 6œ GjQ+P,j˂ A,X-(YIM-)׼)A<\Y6aak9s2FG"M}D\\{дJjt/͢6|BM?wukH Ŗ7m8f%=w'D6ZU=o$s砇.褗n騧ꬷ.n/o'7G/Wogw/o觯/o HL:'H Z̠7z GH(L W0 gH8̡w@ H"HL&:PH*ZX̢.z` HF=i"aeLhͱl9x̣> IBL"F:򑐌$'IJZ̤&7Nz (GIRL*WV򕰌,gIZ̥.w^ 0IbL2f:Ќ4IjZ̦6nz 8IrL:v~ @LMMІ:D'JъZͨF7юz HGJx(IףД QJ@^р,)s^:47]@‘ 8`2 j E E)~dyhPYUաZOWyq֬tG`ld(Ө`hX AAn̑Z@KWE>SdE5M?`d rj!40M p<ъȢlz%2cMfkZ"hl뙱Z vŪnD]~JtUvYYj"+ܚ $5}IJ~EVMZd>eh@ L3UjdJ5h?&UH ,oȜu2@Py`;i~ @ntmSU`ZDv*}+ɫmvQ] wZVf $1+H{#qD(S(fͳ-.s]êӲs* IUw9L%4r_趲i%ɲ>O $0#4rSCl `tT3؄hL8ŗ,H# )YN[A鏏Ծ tb4TP3+f ='sC?i\s oV?(ҋ0: S'}duNsrc҇~u10&3 3E|qn t z5mW&d!jTs2oA '{!W`V9vw#k4xdrmcr}$kcx!rD9H:we΍KZi-`Y" skAyț #A0 acMm, k>s2óY`pk; ߩū]mn{QZ=$[/NΫ!.M_ޮ1ۗ:*JUn*bb@bíS8:!>45fH h$QfI.jKbZ-UU~ZQoݙdIreE䣺ȪYK}nZk(BSm|Yg|1B+c|m<#^)©]Y Î jZ#$ܙ3IR"籉A4+,1'jǻ"U!L |/7 죋`_ɋz<׈j}qoq֕!/ 5pD dfDB%N8!E~ڨG!E$Y$QaR?G\2d̕ 3,r K PR"EeoɈ8(J tXp:jXk1ПX\$QHֈS.h!]\iu 4Q!9"Y% |e|-m5jŸc`V'^b^ތHЗH}D\, \1}eY8 9ii|@5>QmD {F> "؈(+0j$r!9>.C l 5 @49"G I,h *ȍȄX"܂6@iŋ(1$a ڳJ,1Ҥ&饉s(20_B.)q \82ˈ^{ң8h[BAZ 1M8x 3 ?4*ͬ!"" ÔԪr-9eVs[n%@+K2nj4˙ΐ)^%< (όvpcB ,Do3Q 6&fH:$ x$(x! AR3kψC! Ԡeg^D[W"b @s픪kDiM)+#<yf ^fMֽ> ٲ7b4"EK$}C1 q0,3nB-A uxQ^E)9č% gPzea{& *Q>:7E-G.phb[F98x+DhUfv]Sexud"_;g]ǴƄ&XM>s~O o!gT֛p|@-S0dS{q|" sns,r^q$A@(j0 6Z+:d~'}齗WS<$Ld "ڰ!$p"u?mz'_׌Ҵ_p')Bĝh 60FB>ψ'Ρ|E.33Vc 4ϫC,8i=@ <G:p906(8 @h*W/1ˈI(y A ӢE6sq4!2. ;`˭PdcxA/BꓛG+,]ih˽94Q@C#3 |`?mcJx?6<)lA0b7'uXH*+;9:nH I(pH:hx8J1:KTA[0Yp@:dJ0bԒ'x{䖟t%:Tȸk|ؠ9S7SĠX08#9Gp ԍS)ՌI|RYm9YM 0X8N`Sx7xvi+ YjݹX6ܰ55WJNc %̉P9A7 <%996Ċ>0s,JBs:nVQ[h5/͞h+I˅Qԍ#Vr,ǥ>\5'ʨ8)*7A#uVY(^]'3URrX7ycd͈J ܑ+ތw9a2+l1]ӪL)COxU8;*$3CB^0P=GXGӊDu"mҵSxFxl@ kIbNځHC$`¨Yxda/4pP`a!b#>b$%*jNb*)njz+JXܬ !,. H*\ȰÇ#JHŋ3jȱlj>Iɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ LÈ+^̸ǐ#KL˘3k̹ϠCMӨS^ͺװc˞M۸sͻ Nȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0R4h8<@)DiH&L6PF)TViXf\@}edih@lp)tix|矀*蠄j衈&袌6yZW,XA~v駠*ꨤjꩨꪬ꫰a*무j뭸뮼Z)ʓ kȾf;F+Vkfvlk.e{@GMFrb2!,]4 H*\ȰÇ#JHŋ3jȱǏ @ȓ(S\ɲ˗0c̛8sɳϟ7-\p@*]ʴӧJ)MJիXj}ׯ`ÊJ?cӪ]˶m\x˗!/ kLa*,C-f D9L. ~F{HJLJX.װcEAҖͻo\&(yȓ/ w g*XHqUu9NyGT8kJC;O*>(m 5& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸뮼+k&6F+Vkfv+k覫+k,l' 7G,Wlgw ,$l(,0,4l8<@-DmH'L7PG-TWmXg\w`-dmhw^lp-tmx|߀.n'7G.Wngw砇.褗n騧ꬷ.n/o'7G/Wogw>(y4JY(|桁NcƙHL:D\nHNesT \P#`Z>*r! p { Y@ȏO0}+`H#M@\(:P|FT "! TFgGc>M< BD ;>~l` &4Zp1G@XHKIr|! Qqp&@eFqHHaR h:BB9Je-0hA@)U2Y@#wI[*BH,$hJ,@0)H6s N&OB*;Kӭf5h@+EB΁aCY: 6yFB@?(PKA dA0czd+h pRIܓKe*A0iJ QI.>A(A=P&tROn/ʩْ“ 64:3+ȄBIFlV0iT`SPV(M6_" TA)A%Q>k=DYO4ԣRFV D[Q"Xx5!8ibqV eWВCRTeD:r`e[díH2.uR[-bVjC)"w_%KZͮvz\>0ۙb@/,4|Kͯ~١wCC6+ g &Gcg2#" Eٍф; ':8b+XNϸC@:?%Yx3Ln?B  CNP;ϙ& aT -@N DTa)O0 ӄ&8d{=&YQiY@H9{-4Q5KVx" ı h.7 $ҍG-NGC#Dj=7 +4v`Aհ!f. !,5\ H*\ȰÇ#JHŋ3jȱǏ Cz,&I(S\ɲ˗0cʜIcS ɳϟ@ J!iq+ʴӧPJ1ܳDQʵׯ`J JٳhӪ]3@(?l˷oX|xQÈ+ql Ř3kZ^q߽%u^ͺkzň۸szٟ'NqW*9μ*"-سk?nNGT8_8IswL'UO@su߁&(T F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸뮼+k&6F+Vkfv+k覫+k,l' 7G,Wlgw ,$l(,0,4<&٬<@=}maBtH'L7PG-TWmXg\w`-dmhlp-tmx|߀.n'7G.Wngw砇.褗n騧ꬷ.n/o'7G/Wu&Zw/o觯/o HL:'H Z`>5֣m<^!vxDӄ _}D%v("HL"Zv BA8c@ լ/nD6_:bLX ^m da ]@ (F(?F=t] Ɓh 0-#21D rC# b?^IFėsU wd^!u ( DDEQzI@YB&`L-A]PD2QMA &E~]f` B Ҍ-dC$yV1` Yn51O'ͬ>![o!3#w%4!,E⏣UHGJҒ(MJѕ8DBҚM4tmӞ@ PJT?;-r*+d!}TDAY hJV  aR[ru fu ՝\@ k[Yw8 OIZՑ)`S MjY:=_if.Py$2+B $s|_ YWt/jXpu- =d/H 4^`kU[k,z@\RUnmMM׼)]ycVȀVJ "A !,lOs H*\ȰaAJHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ LÈ+^̸ǐ#KL˘3k̹ϠCMӨS^ͺװc˞M۸sͻ Nȓ+_μУKNسkνw#wh (矕#EAiTA t{D}*A+^̸cp8̹g!`^ͺ6X%۸sKGA Mqv2yУMZ2:(X@* Tv75l\J|6о8dMB# 6ҁAVhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸뮼+k&6F+Vkfv+k覫+k,l' 7G,Wlgw ,$l(,0,45dQ8mH'L7PG-TWmXg\w`-dmhlp-tmx|߀.n'7G.Wngw砇.褗n騧ꬷ.n/o'7G/ gw/o觯/o HL:'H ZSc>|+GHBI@8׉{?NغI,l&PO! H"`A7Ac R8a( h|VbF`(O_<|61eH;Бtib76ˉtb78 dK#xG֩A}L_$+V"yDH}d#GIRL*WJMbc+gi ̥.w^ pX4Y pEH`>+\ Tфx1'$s|$p V M=}&d=[/8LHWsfx P݋'AV{`& &4DBx' $AMdYAHZmzoDMl3{6YIDMR 4\@!,&05MG*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8s`Ο@ JѣH*]ʴiNJJU>jʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ LÈ+^̸ǐ#KL˘3k̹ϠCMӨS^ͺװc˞M۸sͻ Nȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|'a砄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸뮼+k&6F+Vkf~%J\W+榫U~B֫-X@D-=?{TBG,W\KX< BBOLrP#X|­8$4&3|- mHk v1 cTDA9v|Ya6HD.^Aa$ Í;Ǚ pVvp'7G.7&[Twwn&z~ân騧ꬷ-׎PYPAAV /+=቎A>@P h1*Ajʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ LÈ+^̸ǐ#KL˘3k̹ϠCMӨS^ͺװc˞M۸sͻ Nȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|'ad砄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸뮼+k&6F+Vkf(ڂO\W,榫UVCзֻ8 D-i@%K& G,#5 ,PL@A:L$)ܲP $1| ,Dk'r],4Y=1M߇2* ZPEuHQ0$8 #dK:D ez$#NA+L{>A4DB_Y9 @w\ MdYA+HwnS +tHúW[䠡w^pu!,&05MG*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8s`Ο@ JѣH*]ʴiNJJU>jʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ LÈ+^̸ǐ#KL˘3k̹ϠCMӨS^ͺװc˞M۸sͻ Nȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|'a砄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸뮼+k&6F+Vkf~%J\W+榫U~B֫-X@D-=?{TBG,W\KX< BBOLrP#X|­8$4&3|- mHk v1 cTDA9v|Ya6HD.^Aa$ Í;Ǚ pVvp'7G.7&[Twwn&z~ân騧ꬷ-׎PYPAAV /+=቎A>@P h1*Ajʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ LÈ+^̸ǐ#KL˘3k̹ϠCMӨS^ͺװc˞M۸sͻ Nȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|'ad砄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸뮼+k&6F+Vkf(ڂO\W,榫UVCзֻ8 D-i@%K& G,#5 ,PL@A:L$)ܲP $1| ,Dk'r],4Y=1M߇2* ZPEuHQ0$8 #dK:D ez$#NA+L{>A4DB_Y9 @w\ MdYA+HwnS +tHúW[䠡w^pu!,&05MG*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8s`Ο@ JѣH*]ʴiNJJU>jʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ LÈ+^̸ǐ#KL˘3k̹ϠCMӨS^ͺװc˞M۸sͻ Nȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|'a砄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸뮼+k&6F+Vkf~%J\W+榫U~B֫-X@D-=?{TBG,W\KX< BBOLrP#X|­8$4&3|- mHk v1 cTDA9v|Ya6HD.^Aa$ Í;Ǚ pVvp'7G.7&[Twwn&z~ân騧ꬷ-׎PYPAAV /+=቎A>@P h1*Ajʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ LÈ+^̸ǐ#KL˘3k̹ϠCMӨS^ͺװc˞M۸sͻ Nȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|'ad砄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸뮼+k&6F+Vkf(ڂO\W,榫UVCзֻ8 D-i@%K& G,#5 ,PL@A:L$)ܲP $1| ,Dk'r],4Y=1M߇2* ZPEuHQ0$8 #dK:D ez$#NA+L{>A4DB_Y9 @w\ MdYA+HwnS +tHúW[䠡w^pu!,&05MG*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8s`Ο@ JѣH*]ʴiNJJU>jʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ LÈ+^̸ǐ#KL˘3k̹ϠCMӨS^ͺװc˞M۸sͻ Nȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|'a砄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸뮼+k&6F+Vkf~%J\W+榫U~B֫-X@D-=?{TBG,W\KX< BBOLrP#X|­8$4&3|- mHk v1 cTDA9v|Ya6HD.^Aa$ Í;Ǚ pVvp'7G.7&[Twwn&z~ân騧ꬷ-׎PYPAAV /+=቎A>@P h1*Ajʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ LÈ+^̸ǐ#KL˘3k̹ϠCMӨS^ͺװc˞M۸sͻ Nȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|'ad砄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸뮼+k&6F+Vkf(ڂO\W,榫UVCзֻ8 D-i@%K& G,#5 ,PL@A:L$)ܲP $1| ,Dk'r],4Y=1M߇2* ZPEuHQ0$8 #dK:D ez$#NA+L{>A4DB_Y9 @w\ MdYA+HwnS +tHúW[䠡w^pu!,&05MG*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8s`Ο@ JѣH*]ʴiNJJU>jʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ LÈ+^̸ǐ#KL˘3k̹ϠCMӨS^ͺװc˞M۸sͻ Nȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|'a砄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸뮼+k&6F+Vkf~%J\W+榫U~B֫-X@D-=?{TBG,W\KX< BBOLrP#X|­8$4&3|- mHk v1 cTDA9v|Ya6HD.^Aa$ Í;Ǚ pVvp'7G.7&[Twwn&z~ân騧ꬷ-׎PYPAAV /+=቎A>@P h1*Ajʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ LÈ+^̸ǐ#KL˘3k̹ϠCMӨS^ͺװc˞M۸sͻ Nȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|'ad砄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸뮼+k&6F+Vkf(ڂO\W,榫UVCзֻ8 D-i@%K& G,#5 ,PL@A:L$)ܲP $1| ,Dk'r],4Y=1M߇2* ZPEuHQ0$8 #dK:D ez$#NA+L{>A4DB_Y9 @w\ MdYA+HwnS +tHúW[䠡w^pu!, b (PR%I*(jÁEŋ3jȱǏ CIɓ(S\ɲ@Mb4hQ(1V̔iO<{JѣH*]ʴӒbcp4=P"  8ªSOt"V@ OʝKݻx$WncDh 9ē?-<|F%0ʗktD86Ѐ4X1 i,R%\ p,6 +?1O{d H 0$.GQ` H } P!lC ~(4pH1@QP2zAJp hxg8q@O!f"|D9dbIH"Q=ܠGbB8G8#cP% p 0J#Hh)QV(A"*DV҈"*YW  Wn!Ma䑃X7(A P@"8jSȊi@D,AJG lp()1p((8VIt2xL=Ӝ47NY,"Duhm֑G`>굇 F+AˌL⛎`Mc9Gd<+[KkQ dP1 hE2Ze SA@rNu0aAz"3Ҵ G mz !Ij'j w]I昀'O"ЋJ3tь̂s1v(5}H]U09d `Ͳr5݈V qOS-}#i85 `8ֱ߼ {C+s@4To{Z H\ xAp8eDА|_ S/C  a&_sYQP('4Q` @aȃӠD8^N5*N |‡NMA{k7TmvIB֏'OO\]&v> I !|8p]g1wBۙ A Jl GRäDN~R$K<@ME@% TX`PdKJwelKM${Fgv 4U4w{P@N$U:_>dPP2iʧggeaJ M`}R&eT h A`HD"XbsFA]` ЊHL$D@TdzOMp8|  UNtoUHlxFWsTS5]:񀥷J =Od'R H 8M QE 4 wPZqx*0VzdDϐX J5]SyUM' 4:԰ AWITX rD< d&ST _v_(X5UtTv#OU(mp &\D}0 ~9v E:U6IoT  aSv i)X3abDMq7v1nI`GuTp %4 OT x fQt R ^,| @f8 iH O Rgv  a\FVpN|YEAmVvU^9yTR vXvrFz({j4J#bu vX* 4 ^QKy Px&jH(@Ft-T) 1 o4`ByF4X$ ևDd4VZ hWj/8㔖w y[NEjDQ ˜2b5bZ<h@]9i5qQQ^3Rg9kO@H^g/XN7LTl`e4Zۙ}H5`CNKXV@ːƵQTE6GX:ga( \ 0An TwGDFP j ,R `x!;T[T۩HtVo;:k:C<7[/vנ@rch'T4UVY))DG \:\mWLj1n[IDZ *e J;Y`"R&`U QO7mVaɕ%`lJ25˖InY _穠8TķT `Y,lWK9?FiC9VOOaG @s꛾ m p{ s[ A%<%F8{#Қ`C;H:{V2k@M_o) MoC`GЮTvZ];v 4Q,H2*bPt$ʁm 6ߔ}dnQɠzUZ@ի'A8|S iFƃDAOr)C׹œ!_dԇJp+ cEVEU@|fpuArRd`-KLl&Z}[[U 6A:CM;B_4Ӵ:1Ц W=B<M1LQ2Z?E87f[EXp #xv|l|K,n|LHXz,NT 5ڱEiՃ I'v(L@ipK<A*դ̕@a =[Rz) ~f8<+6 `Ypl65Wɏu죊4X6$`݌KiHtX~Xk |O`Yp d8ϣVZg3XSxvҧ>Hcyb ;2(˲,~qDy# j4։wv"9eZb=]}<+)lIS,u7e%SC6[̆9X}Jl sH+-A2a9]yJL/}@=m\0hyFN)S5SEKgsxg['ͺ`at pKYȣT EcR6HTVL<"Hit!kzpf 0M%\v0bW^AƓ,'-¤Z՟LZ9s _ ǚ%[(Sx}T(0@Yl{D嬖RhR]9Y 5⤩,6Tb ?=wl!js%YaZv{)t 8&cm.g G82#b^УA5i{A$d $| HvBA X0_1lX/^2,ZN%#ւ-`Xb\O:C28bbBdTJQUC `t+Ob! c.;$P[iU_C8#P)"TbYxQ`/Tf&dyc,,+C(UU*蓏:i<)WaHH4b|4M;<0CrwЄRcI,([-pK-v# h!j~& @$R(nfo2&1Dl)%7WKh[( 0(aN :U:IqcGDhE*xrT5[@ csӕhESCr| ;,ã2?&c-19hE3ꑣ48g5Y{/7 .PdmYPiUN TےiTrJJaAУ=iPZc;R8hIjXZֳ5F?Zk\Z׻u[1f}}ld'`~lh3 x=j_v&T;&mhsvnmx{Vv]z+,-X(ViAZWpKYP V !V0rXq+||&.V%nWT/xu<$=7}†:ȥM nP0$ 0\x~w? YXA˧]]#'A ?Cq _ʝEac#D {N+|˳'PW|˟0~??5+0E0+DZ`!b?@ N V]EJo7 T7n;~Ver@/-]J/z3=*K@sK;#=8$8+X0Xoth> lAI639x |#B#ȓ<4&¾$ 9K,)Ũij @S<%$@/Tc,A!A3`GPB{B +Q#\\XlB3"_"xDM5o#?;:۸˂ 7'j6U=;T68d9T6=@p9i8 $?WS,dEaC3&8FDZT–{&5d X#DTTPD>`h! pLDzGc9TĶfjS78gs f;CFr0" 7S{H7k$?dA[,F9"j|л@1 oZs v!>kI{\4j0mHBKO=86D[M lCH 9aң@uM( ItM%Ik̽Id:Ñt:$%>3;XȀPAtkSpd;DQ5]uTkLOBkƏTB͠ )@Mÿ*MmShX"u{ŽSо39hBY LPM }>EIu8k ,'VZY䀫d0C"?QX]%Z؀ ]<8IFvlGCLDSٛD@]J#. ^%WהS[U8ke28Sǘ9΄>&_.MUEy}@uA=8c0*; RgM6`:i{` i{CHxh÷tK^d࿵(_f;B TDȄթc؇>Bf6S=T<˾ MO4Di7ehsQ8XL*܅QyeyidSE,́*ljhS7`6LV>Q^ibF7mhs7iZxiK.8Bk^k W8T5;nkkkkkkll.l>lNl622Gӱ~3;cs1v5[jN~lƲcʶlZ@{+56in׼큓m_cPg]c(ю;:]W;ߺڦgh8+g3n&m:;m C ;)ƷtFw&Dn]1;7C'A{I;4H^z 0Qv7Ӟo R ?)H8p OZj 37pO1 o1 oSBܖߖ*0g.X,&rJ"54;: Kdf0#gLe+'-/}L[&% 4 t s ;'c(Q+' d4O-m1,F >;rvЅe rJ0t/tP$2 M*;6@-j.6uK nW)C:'|#bvЦqrq0*bm)OEDB\qN?@q(>Br']!rzwuvwz2I\L v:k n, Fr:ǰnwxcvn*NpD:0xv*#ULJNrox luU#mI?)~^m/y~_zcW I&k@Ug;@va7;,WEDz {mx08.G~?,]'Q v>JξvsJOzw/ts܅/lGCtvw|%[ Q|&ѷ$X Xڏj.6 h؋5E oIGJ?;0+--n~z}qPd/ x?Q+[\_ZeiI6B;4f웮` ʰ@tYp"tm0Fqov0fc i-l t &D-"HԨRF5SN `RGXAS *ej28( z]@oKTZ%2rt `y3'H|B'v2<٦i1 &΁DfacǏrID9$Bi=ћIlni`ľE{qhJ : Ƨ l1@)T-RK1Ȩ-}bC/^ 6˃UrD|L!!>pQu'PlDE\- 7 `B65X&G @\KlA :8D)ɤI}R@ x)TP @+$@z ` ,|J< 0*$,p1 %L ƬL+3YoR}!8@VIp9N= CHP0^؍58ك+ xXim;QÉDަ$- Cf)O0L㊮7^Ӫ&Ys).`U-@@ZSR6>رnJ;Q&`nٸ&,%z Q6yrm堟xNgbUL$$&Y#9p#DH]>'80 Ld0#n& * ly[G!z5;iJ 2Rd3` q~F"Gp+/*!tKnYzcRuJ~k^\WBI԰lQU;Pa p9]5XCp$%7tԧYCy [K͒S ߚHQQa %UQ՝|$HxhЕ^1$ɨ%@)܁VXǗKbImӘJP9PV UG UxDٰ!bЛQ܀Obx}Q^#f8dۯeG{H!(NablJtO .E()(X<u--=AAϙD1R@"DX~و IM6q k@ɭF93%圄T}\V 7T`!ƨ3L!Ὑ:]T3,B"(д9^ E7BT!Ȍ?aHa[HN8˯0a̒2$.}b+HEFq8($TdLהJ Ԣ$YNj\cL L~QZhV_ rXEX[9eTFeLݏE 4YC ѥaJYRuۗc%TޛT89z[@TW;>-A"قgE#aō5BP&<@OSX~߈ EAU ~,qKib >z 氊z,i^!-$6рBU\%}C(H|T&dLV?T]A3",е.(lZQ8FxQIE.PJ%-lׇ4~%riA$@)qD!8Zg&)e(rS\]'6Lf  >JŐ[V\J=lEۀIWx(nQ T!hL5(l):]pE݉QZ%֏-5X F%pnKMme*x%&>-dhuK|00$`A8hmH*T|F9 ^FL/*~juJuŲEZRWdp||! uQW.?-l1XEjƮUIoק4O1m Z( Ư_Q$áĦ)Qk]Gb,H`FRVa?ΪȤT'(IiK-FqEڨXShjɼn.*kQaUGJhWUR l-rf]aqwD…"CB}x:'!rn{k(1iu.ȹ]#E)E,BK\uŃE.,El@/՛Y1\8HpqtV*0X&pFs-jfdhb^+P1 H_ӖQ+!((]S,Sԉg$UQ+юxlXJ @#G;#VTVC[u4QӴ&,a5g )HźasVÂw-@V )%ڴ#ogVSԥ:q cQ0TC0Tý!dI03N ,XKdltPq1F9 j'+X4%PcOHr- OhhFSvTu@v(S wcf^>ݍ&,НlN+N&±\ I iƈ3 S3 Vq.KhI\@\LDD֡g%>:9r/Iȣ"E-S 3.chP5rgv` lu7}x\qn uFE@¨o+E)Y+Տ1l,ȣ {~whU*t,̂Z$-լ3W%CY,]YP%p@A,΅C!z-|J0$AZA{Fd%踱mDL22DXXD\6]|Mq8.s2lDkX<- Λ OdXKt(?W/<7Tje,GcDo&h.kkЃcP~}q=;,xCFvM.J@}"DJv"|zAG(-  "V>h_V[pt(}AVjVH~ך ~Ǽ\T׾?n4~T~{?(+EtmFQKO~? ?? tp6t"J)2\bƊ .RG1>$Ycʔ$U6 %^@)dZӉmdAcv!09L=CG#Slr38YCMi g]"+j7y{_6L'Z DE2Ѣ X@c!quXXC>UJ T8Ve xV%|A/}*W+@503B~ ol7 u8;j;oK @p Slpf4#H[f%o!NIzQf@Qlj#E<LP%q2%k*GTVG"LRrT-6ISi\kh %JM2l wf۱6)LR@׷%[87}=8P-g@bp c65)Y:4>kc't 2d.+):%MЂFk:Zh`ȁxh#Ts,KٕfmX$MP})0JA*XT$IdTQW"Z<<ŰCE^)?I*QH("IIݟLa 3CO҂V }$ I ˀ3Ms=agfu/ f1EU J?qک G4˞h7b-Y" =H uQ{dX*7U&$tt BۛĨ IIGYԤR^h@pWLZ.]8(j-6\Z!j#o pDcd!^^H;SkkLv L`0,"8م-nۢ\]EE@z]5MA0a;WH g+(st7B2.K2ļ!28, ֮I-7cvF~B% ,7 T)tu?p]<{pɤ;rh@/[ΘH7H40R,جN#BFd$iQld>lJQDc sL5k>zپAy_2U5y3sO9w(-oq1xGbyə[2Z\<&FU&TYJȑ.׳^l X쏅1j815e^t-f8v+U:*c3?m_c? @%U£`4fޘJ`3NY}k?EZ[+Ae{jrGb[hVHuf:CKҢᏝw`@n.&7B}"-ٹa*3D̂qQ@yi(^b0me!r}lfgEP왥 _C/N>%ئq\&褎ϊO2 xilJEmXF2J RNnz,k (EJ| XUSFL l!F$DIU\$3bDċA ːAD( )L|&0aڭI2H0 5N1dKx* ) Lp~a@. KzNNx-aÆ氌 A㌁F 10&NOI/ t`Ce>fRdbc\4 N. HG~jx 8Mla\Iq*"Jx0ExРFl_JqL#/ff\׭];OP# 4lLt8@SΞS: b rQP֬=CnPe쿘 8NeQ?y"n\O$`"W"fĘ2`4F%iSRC.QUK+4h+~#T+s!lN>@HNAhlõtlq-0iltd"0366Ia!28Bm"B*wā *$ f+F v"p7=fg2R!MTnf|FR#UhO&u -Cg 8J 4[EpGr Vkj>c%YFPLiwoŮzfUe@̮ <kJ1f \\l󆊪\@ؾ ?\*%NzlRF'Zv)xW !APe(ƕ [L !o [C~'wdvGKBCgp2oeIlR%RIe,: ljO " 1cԆՐyfQ8=,2!9)>Re$/rjhn/vxtKpBP  L̬O P,6"NԬeԑ B ,$~`ag3P*Pt7)e^#ndbJ@Z׋cT+J\K:d Cd eHr)Z$ ?Ĩ*ɸĘblNK`Tg`6#.  `ᆞpR$|$d I&iE/̢D^HX`1lɝv҈kvIr+jWW˸8II)'#&S ]"]85n?rAĉFĀ&9M E,敦Q4z#ai1to@@ Rb1,fFc bN(P)Pp@;JSR hO4 k#UJ'Y/:b䣯Ó$pL$f:w^H zO@GGo ƀ1$* bYѠD@¨=wô 7l7fƶjt#XBT!̧:p#J[Ne4þ$aH!fٻ,b \NV [>B!N3v!L!_6Ago'5*s8@ ²gxNs<S26d\=vblÇ^ <!8#gZT4<ɧT22Ƈ>7_khۀc$uGs.CFkJ/wpi--JmMe;;12,PAƄrUbSqC#L^(¦#\?Fh_&C\cE0q5tɓǜV}f3Eo}|#׋}.JB8jAd?bC~8 QW['z]o"tb(t̗.{^?"~ -,؍F5x,D,<^nY0M9(؉_ڃ/aLQ1`dIdMFcŸ 6 UZ* ، dL3GΨ /i? l!i+< /|'rL (#͸?Vy\JhD x-\YYItT 5pR &\ -s \z)'@_T߀!*_@0'p*f!@)5bk 7P)T)zEY%:kB]S k)hԢ+2/`^CRʺJL*+.)n 8+>%w@2)HqDVb<*LI8ϲJi¤kZ $8o* bótN? uR[H7p@f$T)N8&8e'qvBmM C4H5 ׀}@`76;ۘ- Dxs^\=&1sa)n 9z.Ȯ4E.">K3;Cd4̄K" h4/'M4I%Ix_*4CM)^25mF(zd<ո"0jVԚר` xd1fK&hJSP.G$Qp l1 TЛ7F8\p*8 \47[BB.~@TQ u *:mX<x΃o\,t3.*ե:AftTpde* JPwdS2,4׼j[FWJ<`̚CQ+œiF66J f"C!6\dNslE-54ؖh1X3X@oՁe#` Znqɀ2C CJ8UDX#KJ`C$@<%1@@&6(|,E dwhFJdPh,0hypH*[ g8#:{@bs Bb|pFJ]-Oy KY"G/ZMqc.˸4J#{\?1T~F@0ɏM7 :  CRxua HB?Pe p\+gD:8x 5pڸvch7ޣЬ%~2 9/!c6 @{T<q U`S_PE*Hɀ=hh 2,0 bH^ 1_)Mogm(Nec'fra A Uo7YXWvo`0w%5)פ7fAXp (mDppu P2Q }^4j%p> $V&  Pi 0R2U 0@av`H'&P& `_~u m* V+r>m{2yN#QvefydvCO Py`AXzD@\*05` ~uQ5W U>xq&w5fec0Bf[wwщ *g|#jx#\3 V@Q|RWHVHuGa?CcIC" ٧U|R T'k&6=T 3QGXR54̶CHa0!"[#dSE*bw4B XYDcgd8z PN ERfF  rYVPCm   YmoQZ Bx8:k  kVƒ1T RF7X !h3-љސj30- a e7dOf`v:gTc v9yBdDZD7Ȓ7tA뱭!VUʰaR&40 &=QSeG7" ij ""mh#?BJêKj5^!;P@A[Z]ӡj@E7P:6{1 [i z+{k Cr !]{`qȵqv&;Kw [g!'s ( zB-! &eJ2}agCU$PLkƋ@0f!` Q+bAb4dWQg;G$"ɥ7"ҺX63++]a`U6l\w71#nHVfLl~/`x 6!ʈ#)+4{1+w59<5ӔR*6E+H×Z4LLMQL>4qᗟ`%@ƒq |$ kmuuM).5A0)/ V9pAMbyLe-2' )SKe1pd& / ơ|WE.#;BtЁ81 OW`s^cBiA|eW( ##·iP2 &C=GV,btChDxo-||pآ}uA ^m|w\43#sP?ESS ( >L Kʁ1M!P[q7 rQT, RvA7FO<1yd K1@l>=-97:e\S/Ghi[B sr ŀ=ȬWgAN9V\WAʳFѲO!vѓ` q-SZ9 -^+*2נժ .46ߊy=Q5ph v טm-"omQkC5ChǺTO$llzGX&.p3hmQZ((Dn8b)8jv@M6K.,,lˡ].">Fm)pc,ML}Ө M8-.,fN7R)+ h*L6:tvdf*'U 40%IͰѹ-4s=n(vc/d k6:-F2;7!cc [g78B)ƐY6`⛂wa ji܍}Aⓖ"8[>BZ^6)诙C6pbc I:(DCb8NV רhՆEP@U 3 > elZG&4Y][ JTdF EDBmFCY0N5 ENz7cC 5a7CA)} O$C[ "Z6TxnNCI QƞN.7J^Y#G*?-U&%2~Fj@xL1EkۆӁ=vCI 4BQ*R8) Pk PdO[ VZQ.mDvQqlr4QO: YYcNoE DO%n6}7vG 0$7%T/h 0V4Fs\Oq.YCP֯ RD։pg[f6D?9YQѯ` @o]vڝ ғ(0>f'D5xHBL=cHFٔ( 9YN,jq,\0 \/ 6S}v `:.辖vJ02_Wծ(cq>.Wc8A-qX@ IZ0IU S9}h*I ta8ҚI "o;|i&5E!`Zjk5m@BeԌky;؂F2È6ZdRe@!nJe% bƍ+Urf@ c,A3^.(*f%kdbW4:KVcڵmƝ[n޽}\pōn@`K WN[[{!J AJ:jI5K Nh$/jdȄKH񊹦 /6bs# !\ktQ$&G0,K.[Q#Ȼ:Bx GAff@4ƜEhBæ f9-pV;.N9礳N;3*h=&0!k솈+"țHGM "Ȱ*IH[FTPKREL.LboP~e\ltPAKCDǎ@%WRaqXz.kFڲoh /QbO:ZI sx%U\ HM1>1@E`='b/8:$XHL0)Z,.tN)Ay<CO=j/Q_F99he?ZkGfR/A eLd@`/}eJվFIF\*9Z(~\JA"Y/HqDw?PP7z_7ihTp@ {&Ga.%8tG't+yZ%<E&K-Fӧݛ9|aK^>w.hjNu 1M`v Q^zu߀SF®~%k^|ݹ?) 0G3p  pTB6\IFfQȉBCa UBF.kAQ Zv,`q5ʑZ {3Hb 5 Wb XÊ+"Cj՘.&9;[hD, n#7` ]ld  61>1UYL4ñ/&y @ 8J|'J: rD(w0E diµЖe.M5zL0x>+";[IT3+Dl Ivp映4`vYJ.xPQM܆P#I }%> @ ĝMYS @8q" "f:Ud JĤ'hqBrD "fB,L?Ad!T@jT:U3+~Lƒ0ذ50/#䱷m@G Y!(-m9AQ`<эNDVOkzCLBؑ"^:Wȅ/X %Ѻj Tjeѥ6@XF9vCp)8qQ VihKa#5/pdqF8F}BdN/}F_JUv׻( KC(JĔ,G|` >mR舠&pA6w |Z;a;"+s%7I9I6bbV@~Oy[PV%1"0y_yeTq `xNG:YLũ0\ `,g2䚞gyHSf6bh1 @"4 x]p1:31yHXQVũ~$tnZpa3` b.0B:#CUt&¯K_Z ( ]S rPgɳ3a*#$) ࠆ=Nǂnw='Ybڟaj涏toڼND.hyHsǗoy#'jcH hs;gi_ [M~;큶8=n+/6H"奫fA\!EsqS'ی?zЅ>t PJĺ}7!wzԥ>u2/q|ʺ@ż_{>vպ1o{w6'w︔>x=W9 #{\cp&=u1< 1owb]x)ϹS+=9x}aCTxD8T61ᙉe6A`PpȿAS]V@4a;G ~V"?_8cHC?1GL{TLVgp Z?$PTڮCM7L'' bp:r:] 0pk‚1yy p  Ҹƒrd`1 8iqn ? 4Kٰ@,@9RhP g*qګXz|{8Ƹ#@Ak ÏP7 TxòS/'؆X1C84뷍y#CB@)IO8[Ѐepðr @pOԀH$%:B!e#1:B!;!oЯn[##JKF]>ZѸ3"Aɳf8K``0xKDo&B7)xKzk:<<Yz*/ /i@A %H S~G¹s˿THX2 #~ljȑ W@ .sHڠHt 'HȎE)]`;Y3p10(3҅E:2z'h&cn:,i0/XAJJj""9jAܐ p#p'9b4zHrtKy WcH$$,g$mTJk;fPe8Tl0L Ba@l0ZZBg>N< HiLPLb@P[| WׄZ Hlʌ2d@ZT ,DNHӔNhPHΤ@dPeHPdճI|!X0 ‘3 @rjkPzH:NPй2%NДujS;Rpq!bڀ$PbJ)r؀L Q}*ocBV\H(P JWQ.WXbP:JxM BMTHBdPKBV@LP8R|y$0X{R|gH' .U\ fU8v055ݲ6}I?B |-}y?= ,ihXgpH:ITu.JUYMD0rlV$YP*:ЋJmrPЬ y#hB׎!1 :lAck5 +8=Arl|E+@ c OLrYx5RMI~J*TTuQ BOŸʅ42ޕ_å]\q!+dSq]' K\@3f뱺qf该H:`4a'pD?de ][H4P X/Wp_4#T)LgӃ< LYQ` 4M5M" # :xY%R̃ WȸeBH,Xzl1oV)L3Y )1% !.l@P`iSgHbJ iob&xcK71Xc& M0:^ х+ (iu"hmXbh%Jd\:+a-9LJ3hTcm~)MSȂ.$:]"$k$ 0VjdjxI`BgZ_$R,bQe.ae*..9 Å9"3 ϋ@ g،"s)_>q'v:KIGX@yᔄ'͚֮`Nh1:lž+ 'A2K 7 r:i !3y(qt DXj@d Z~v^SlMYElD.Y}q @?)@,q^PH #8ˎ%=ktO9p>.Bِ<NW$%.g˩(ϤD֣i{D ]p $'(9/хW+$Y'#k :s0Q؋?#a:4Ƭ@C:_1[<#Rԓ)wp2)va$ȋXuig8Y&kYekgZ.fa+_d(G=g2Y@vOvSn *O.UU/uz>̌S%Qk,Or߸츙u(H#Aqt;F]`k_\ɛA։xkޤ1Mvpxy`X3k@C#EŨV8뿝^L:*apY*Pufa<)SZ͒%?RKKlJP6d$W_ P h%T-+ѠӺvͫw/߾~ط!&L,k$KhAEŁPAVFD+~".chmlY &2@k6ޏ} AiZGG`[Q[*IeX9B:Zt=‰$#,ܰ ""FL@ǐ v rX0DB #R|Q ~GLA \ 3 O>#MX6a 2x'uM2QEj$KGT$M M(t3 I*P@TcTATY6'NV4"/ZY %Jc W KȈKdLɕN24CDHdeԑ+2ڨh v-?b7-L&c@,=-(=0. ,7Ajxp*@F cRv*g,@6ǘ8vl6@ \k˼ lcIw, #_%8 |"<N!h U$T(&'(RbyD7bSU!`EnⲔgLe 0D/@U,ќkj@%$'2 hA2| OAݴP3IgWE~WTd002LJ-<tlHR4ʔqQJ4'6S4(zQ  )4Ѕ?g+Ť E4rz;mQx4A!(YLT0A. 'V4x (4VT T56IE(l\.׿/;ǣN` ;HA[ m!] e[]W&$+e@Z W]X-,IxI*R=-X'$a}j#6 7:0y qg"wA>MkV@la nL`"{(DȐ`Oq9,   JbvC ޗl/ ሔXG9,ך!a I &J!~'Y*t3T)M2p qZp@r`LFW'9*l[&sD . )BͿ1.Jg/K |aF` rPBՎ ^bKzIT‹^`Ktʝ /C@m6Hz2LdՐ:H&CیĴoP:z6R3#pdt$P r#[82 npD4xj7Yon3ι,qճȆϡLOuQݴ맰 n~k8]ç!$7ANA_:-nێ%?~TttuPe J砇u;p0-U*k]P$Ohr Q|򠣎 o#0@҅|pm\>&qWV3Bӱ( *F 머y!koE=g?W.ƙM^j  "Þ>}ܫKЁ-c$=?~`b7W>y$P>ƣ5aY]2 ^]B`J`Zb`6`]M*[q_I[ . >J j %}Y E~,`H! -h0@Õ>@M[(hax+#!0B E ԌzaKـT [ MڛMqM(*! F`3e @)@@@慺,aWWNT̼I1V⋡Tp CtM$y4$-ܠ N@ O H% E/jȇD)4p%xB)$:x Hac)L,IF$ 40E*0u}_(@SSDa$BPUCͰHSBlML +$TLc1`xlF5S4lI_WAoYIB]TLCS 10@EDK C+TA 9)}P <`@1A+`\ Lԑ!U@=WFMB*Na/ؑDT!`K᥎Om\%D%}\US LE%`C-ЃbT8Ԟԉ bnRH L%M@>TV1T THfMJt}'9d@".4Nu^(WY1Ɏ3L̂ޕf@4\w Az8% UgH2Ao @88TUU2 2d!^lEBUf2 v'aPW}$g짃_B  M3 &6ۍ5N11JlxHPY~,'- e 8=8HƧ fG=~uЃ^%B&=# ێXÄL3WP `L 5 шfF\ MԐM1i2@UbV1`W)TME%R;2XwFŜB{D9D2P=j*a-e@ WxI`+$}̀tI=@M/pIc@o (p'ZX/vmG7bnpqeOgO5},aN!6[8ΐʅ9Na/BMa(ہ`Y:LBCH&LBdN̂4j8ւm3 w`)@;BðB" Б% [2ɑ!21|DHDD0ȅGޅ9Y9F#>y, ndXѦzظ*ĕcEL-~& I2PEzj*k`,fclndFn ,fb+ hAmNjNn'-v|#"eǘ?\ . YC8H̝B La\8DXHE_QMz6m6,GԔ۶TK fK2* 8^,h4^aXn m3@XT;{n+ 45 {l0eҫW"YIL!))H MVreif l 7 @l666ll@`ǯidNЖm3"Ĭ)%IP;'H[E%,D24Ifd$)b1* ʨWyjנ1+Y4H}MLW􉧆BT,G.0H`rn^e.iOQID9]TZY ̰aMG4u|m I(@VMCXZP@+cF\V,<B} . 7)ud̩-QnAO ێ-jU['1$Fr_HC8՗BRTNmdrrpSd?1ۺ0{)ҢH(Ld%3C3ecnWX,$M*< W\hM\% ިŮ9Ɇ5DܭBX`F2z2HC5EϱI$@ [ lu~(V/!sn@d.J]ʼd8RF(|p\̇ tw_B E}D^18DHNVKZkݮBy~ko̓6 1DK013Y$uMC08vz 3B`Eq_8KsK3pfVE3\v-К6dE[]|s)syBh\I/"4lWIi^ y M5EHNMM׀KKIx@-ž|JĢ10sT0'RiҋepE@vDG㕍QcvHV *jU+BT ӶM: 9L儬IsD==hWKhm'4-[/hF}09GQ)qVض2O8CX+' 9rP)Ed U3ƺe8L&v,0,\zL$LdW!dȸ%2X(8"C+RNdCkvE(Ov\qaH«+IO.ECWP,ܫ%2N[іB7> ȮY$<sS4+gѓCo 'FD;Wnf2lnl#ȻiLm19i9tô,^NQp%CcՏ PEuBq>kJ $ @( dd+aXd`7bE1"U,pf5a2"SSA 4 F*1T/%ZVbN%uwݳQ\ԊҧrJ \%G%81$P14IZ`9({2V*Z*njnUPQ` 'qE`@K=8J1@XY-+Ƙ$W deL@+!(''P%< YSJ *WZa}{'тE!h@Ąt!Xp!`L@ K3FZh!pzo8ED'?[4%&qƙǀR!1>A˪QLѦQ+h~᭝DE("m3 !d ņPԄP>Q@H;eDK %TFlk &Pf&\M,ۛ4f>3,,ˤ"1 X @STDppeR%X/HrRI)@E%iz*AJ+.lFr"wJ@Hŀ 'j1:Wy qta!@PIGZX@c2SM_FcK0x:1~gnϨYJȽڸjx(,W䬒+N `p(9hRdxWx5m25Kی#@P=sh)gK:Y絪D>[mal>mX>tBƯ0'p '0dXd]0:4#-88Ɏ! qs"x "!6&BtE!%V, X`'ՀJ?>(ZسPT=,BJ(切;3ጞ%h22dи-/k ZibYZ%lЗ"}xUP[N,}]!#@Jg>5l +O}|c&^`? F է2nj cP w),5II`axTp5SOx &=Y&CF`H@Y(N >a3US) MlVϜc7$Ϝ$P&a;Rwa2 Q#Qӕ%0) >#;?Ji \P|84DǙ B?3S1fZ' z a-SڈfIE/x:<2ZB8TʙPOz[#^ ^Ev( J' NH .Ak>9 ZX8t' .G -PCsG. 1LtdWD"IHNBe+1iinMNN-FKx[3t7AP2|'A 4< x^`cek  spCOdnut()Q,Zݰʞ/;4#i`f4ug&CMH\.=p# ஋nK9jfa0pvPAPchB*h@A |c,T3vcSvgj#D!%A.BdFi"P50e\zGNʂIj@@oUXc\@ J@8m=JU&A  ~&'p e֪E5Da,MdMhC# P5rP5TEl %E0d0 E 5b\z+"F5aP\@o*\G-y(ȥBGnwWh0+30a@~,1d0cFA  dha~P1 +"(^"%)#1^P5hcSMqKP! Q1 )>N"5&[ybo#3"'" c/$7r"xf%]%a2&efp&q2'ur'y'}' D 25yF())(O2***2+r+++2,r,R%,2-r12*iH $h.2/SitA`0D/,*wz1 ul` J.;O0%(2(A3 s4a`  V IS'**sh$#΂MբK#81GJhx0-6)i 2 L!j-?ʱ"Y.R|1@;4K34.Ѳjhh7h,SNBXN#$ߴT24P4PTP-#H lO4TX(Ri ZF59 F둇$CQPJLjTtUs>G1 \ at! @`arufTW"Vqt XUX]Xgj@ڥ`GM@Dh9*"txFZBAMPF@;THj>LH"jA\jy$^5`(+6hJ 8LFe' 蓪eKVHHg97xd:Xug]Rz8BNi02B:k8&&C5mi i@ `aLn}N:iv@njҎ6 ?H$(dVNn"l @DoVs/$^TS_63Mf2ڲЎ܆")\4N.;(dh (!ЋK''056U4NhsnyxE CT `La"(>yCb\I I8L!~`1'b=4B%/) t&&X EN/ths U^fs$HDŽ1F-)x:NrDEchB<E(hRPwe?KE'*wtb&H"䚳7}Y ~~~Z@kCC&@ {ZImaDpAA}LC" Qvw( EY)A'H $x( TjejGg*H^O7څF'P,P[(⌖tT3}@ ǃ̡,9$Άylky2PLY9`A@>I}~ca )|%VlgU@l<@|pCU&hgUKlC#Y|7Ʃoz 5 H`i-ug(kb.m%fgDxeو󭎆&Tᤉ:&X9G"`K.=I$EG?9\'.ay)xڰ m?&ܷ;Q&bta?B ^@daJC[`Fg$Qp>-,68 q*DUN> eDvxdp"oV!U&Di&=d>qWE%/9z#2GݚzsZv-W櫿ʟf4>2@`w~C3B+"4c? 3ʼ Y.ӁLWJzHxI!!zKLhra@$* u6[ŁK(O ^xZ o@Mw%.UUՒm-Zp%ʮF@9-$~ʑ{@(F܊Q!?}/f{@|_C!{ h).mj66/ 6/!(rv~ĉ"cLB\O`K,FRD4$Z#hP{%9f'9zJ.*I|47y>=]5| aicZk7^&C*DyY+~C곖3B#ARuev\2,ZL.,{:e- sYNig(^fY>S']:Jӊ͊S E$\!@Y'6U2* 8eQ_t~ΝZۻC:隖 =}۰[~eBtWhl=٨iB=fDbZ0:q'aAs)/.E&gԝ|:K >jBYU2p,S*ɟŋ +Ur5pVVE-,ԩYS&ZY$P4`ȳϟ@ JѣH*]ʴS&!7T ā!lXp]XwkOi I>'FmIKزgmTq|[@(G 餍*(?d@ iA 5pbȜ8Yв.DȜpRyWv哛||@])_&s'G^AO\4uKJ8,-u^4zj$t@)5ե}Ғ$3*SިoY Jkn!m %,Jؔ0M8Bxp5D9F. mPȗ@US{m}'7u@ N̬w=&ޤ-dKC-U&@@x70}`A:U@ĄdwKa}lHK&Td4 2b#9Vi)Aw`)VdIPYS q ȩ4`yV B9*1`-À'<3R a jBqlf$UKJ#GwR\캔I yx̣E XQA,A0**-`ID,tA4i,I@'*"iJ# W*H/dq!W' "ȑ$PtaI%!s&+yۦefDNs FtiM+ȟTЀZ)Nl^%X r=ͪVծzUypd :U%WWѵpk*WE5Hl(V׾ `8p':d' 5eSͬf7Y hGKZC-jWv|*5PI vA0 . H#ܐMSMz cubp`(eR< s 8JPztO L=0kA?n`A[(lȅ(8*>gLH{s,8I.PQt-PkW" Z3)S=0e_^ t(-3/N6m} 0?.2@#Q1\$%0D5E@@X4+)2chZLʓ5cZ2PTUaݺjN\:  JP-i;U"pTk~ȴLW`i ;!L>*DPx4RbmL&r j\Gc8\t#.:vqtDy"'Gԍ3ܣ7mKV LBkYƮM+3CY&D|R)~o s`WHYTpV"'L%opC=v.D X9Y~3I~OL${ԥ\88bV9=x6O2=O81kA3](c,qD! Y¢&_Y_PrdL+\E%xi QA pF<&aNIldNm>VǛRV8` B9&ʁK?G _B,6'AuԘja.jN6ufQRfS.2x f*K!!)7$~.(~gGCmW2u 0H}3t D9}Zg(  6Fak 2 @NB@GKu   1R;-r68}!)meQ!z8gCwVI#'I&00 P atU dj=bjH0b0q+: b#6i 8΀pxAV kS#){x4P??&f=% _ѥ3c N`2hd6qGp{3rh"1|C6|7 Ҁ*J8.wK%!*J tg[Ϙ aryf 1-' 0GC0aID#g(&c@Z+IKve b & G *l"'`, Ő !6և^t?5x @?$= 08: `w*5{h{ q7*&-֒@-0!*LjCl8x)qt,$ gZeg~a2(g>g fI?FI?P&J'Vu5pt03.9#,(jOB'ȂrKS8 F #xLh47荊w6ր lg)5BOqRd 9b.zU i /W:\h.qQr0`/q+ o P@AuH9%dэ9|mt0}!om5` eaS.weu& Rh6%8"PeYb)`u] (C!-y/A< pb,7c9,10͂4z5_ cP?bn I oF C=z:Zu'1jQ a b51!^Ad+!(:'^Hq}ccbb76`J-cVed-𐈚Evp$X%a Vsy2JtR‘W`oaz+rt(a(0,viF })؟3F/="qs 4,) _0P &*ZG 7 L$dD `6 J:@D@R3sYEaI* UE=a3 OJ "% mUX pK-,! LQ=1@๲pFeJw+4Ih1T1:C% EyA)QHgp4v$ 3 VLA9t:'^2 /as"ƺ[Oeۻ;[{țʻۼ;[{؛ڻ۽;[{蛾껾۾;[{ۿ<\| <,б.`. ",XI61#€U E@ 2 WAQ3nGk:Y$11B|^U@N,P9_TlPhZZ,UR<[<ƂEeGllS{Sxаt1+xuD!V|<-8d1{ȒL#M<ɘ¡)ɞ! ɤJy×\ʞg,˟QuZ ^o$ /8끞H=RSTzǻSؠeX~M&~C]4մ.iMT,p,']E ȺoĊߧ߳N2Bm(~0.nCqĵ ?ro/?S^@3\Z-<H+nCaPm#vq v7W2 TI 倝;(0=@,>|ZX۞@6P b<Q6 x\NTB-1|FfO~$fu?jc;$wO7'q~1}ZM`2^.: a| (CwuZ$.PD *.X?+5aa / dɊ5t0I'򡁙 `HYfJPlfJjiPJ@ h`ujV^4mNZUYnWaŎ%[Yc4bqF+e)+Tpx4Z ^HP[Q99۫ kÎ-PdBI8 zE  /j JɺғH$9*:99_Z`e:Q[E0TJIifrhOQ/ݚյ3fz1Ib͈ZB DTҬVqbsrz/XԭT;qm5WSY~J9QOenJ:'[rig" d Dž4: -D "H]XCx -E=8l>qh55`֍@$}L-6])Bm#hX0M939ꪕ%$Fĭy-JeFjPŕf{*$/jPC@m ؙFMrf+^ې1픭8DIN(A4h6Z\E>h%V >?X8u-F*LAı=ÅQ®GaG!a6 R`Kt^Ô4 4%JkJ’zHm[`vagTVQTm@F@p`س2~Z0A@f;qD>qM5%pfgQǍiC3(tXo#sPVuPUL&m hCͯ߷q1ߚe ˷?~m7K!ನͤO{v4MX0yW鬳Nci3  Qg+ 1Ơ( g(qd(`J +!9Hڻ0%:)Z WڹQ0sA[!# R-YJ /Y4<)-"3%%H:+&AR+Z?2J:)7%*!Ҩ1ܼ:̜-58B"+,75l9/kC/22)AQ`{ B( ,>ZPx}QEp Ũ V !m2dIfbdzYc$) yM*+A/p+:.p"۴JAxi##aƇQy:+5z *٦r45JR >1% c`?lBL 9lYLaDZF7=rx$FP hz:B ۗ۵E 0C@h1Ia٠%Q+#u*Hܮh'ǥ)IBB.J;8r+&GK;F %?"k=]⊵2-"+3G;$L{Do 5F2+X(ru"2, qd? {(T e #f#;fC;j۰esHpq>EHn"1bI2 Lb+C!!ܼ'{)J8s|d?v()d7l"2jԝg-Sz0ȼLc k,"e!FDP8c+" !\c S \k;5xJ6A; Zct"Ԯp2Ow.D)AH8K rTP ̝YIxĵ!IsYӴP3< KKv"S##t̳!%o?+Q9\ˉLy; ,hE*p{C \e# yT ,P JkO9XǮlO Ǜ4'P #$Y"'4#ճ1-JcsoĺըP;*)켴x %( ?W#Գ-!TB-A(5=CESI a1f@N 'qP3?h5*D=&!-'"̭2 z饝q.y1 }<`C0 ZS1ܼ!\S*.PF2؟20jb-.J8J(tMDHep7YɆ \0ů& ׀S<` + q]5dB֒ y|Spz I8FRVt VR[ԩqrVE9 )7^c!MݢuUmks偸Liԅ]O5$ۙ相봒S$=˜$%vG&gN_ ޻82B4n>36r;%PJ3X8U2KP3?,9Љ4뤊0-#;@;@#@+XuT0KQtcm[xO")'JZTFù5R!D>%5~ہA483e޾8h v1 Tz:Vd|K8_Nt[+M m^%T # %LT%8 w!j!zhV%m]Oh\VP`祷Ra UWdHEhrTF,UGK53ФWф[(`m%Tۇa9&eyfC&hv*d 'YXx&ӌ40(DJ,(J|!ISxlPvE h,$ 81*03K2"Kh*:+[4E&)Qwޅ؄^ ʮB5f "B3(*V}+rJJTOZ)P@(к/! ٸ+h]K[}$}\m'A$j?#3TjUlI)* 5|39'[&FM`,vQP%BSzr 4|yt4U 2Z!} 5sN@6mrJV6$ F.HD vXC*XO&B6kZpO4¶e,`LO#5"Bߥc|Fk'€"Nc5 SF2CJ,K@ ^"9Kvܑ +,Xc)F˗ѝʂML*l#XlG%uQ%ipTa/ɤi4yNiK,\D{#xTQYf&BJ b%h»Wt67*<(!zZE0G?AMo;zS,C1m*cjTC%rF)l%) M'8Y1v#N(3(/IEz*|+| 'fV KjIȡ,҈nMjG#*SJOHBe~?A "hmE$K,_"p%BpD̐r\ %%UXS DZl&85lGÁMH hFY0v)*Gd]fSxBl.Mr!;L9pRyLqL$[c.4 94J8Jd0RgD MԢ6)N40ccR^K-@6JK&kөRUNEF@TfE`> /n}+\*׹Zt+^~ɫ[VW@.=Tq84INpJr%;لх!EN]7PR"*gs[V.#C֓kGCBps o\gqOT:Y̢m-xûdZ.M 뀦 *p(%+]R q a愢Du4_G+N;-qf M@J^)BTk#Nyɡ貦H1i;Ҹ+΂}YCw}qV˵J!h_L3tH%Ut^^l%ä J£Fv2`2iy%B"\ơ.1;DTA(ৄ ce2J޹EQIHA1>ҴjO%nc4wt{UtUJ] Mc}a9gPc}DV NO7Dֹ;ZZ,D rPϒ_n&m5$!A* V㑋AN?S υYVw+@`8co6h,~V٘S̀آR,99a{WR-#@Vm>/B&QQbG\ļ.M裈8k`'![tU85S h(N=$c֗!Qnm?O+YH&rWuG̭P5UB#V>vr^"MEdO jN!*2{w`U?Fġ']hDx½YڻJtyɲxR>Y?< {@ $eέ xKRAw3/5?8Qd$@0 Hv4 M8 K)MAE W\ Oh42`*i_8 GbRhpfީ|uՒTjԟWނ؟$%OWL1Q>m эMVx$B2a`&EOܟn H.DޡQbDXЕ݈a 9¥ "Y6!a qQ VQLL)vYFE$gڔ p0|0-劈xhp"rL(+LMi,jP"3#4#5Ӛti $0tF2B!úh DL(>F*34@*89|H/OxU὜n$Ljڔc& XUHGƤN$ WOP^$dP/%R^JR.o$SEZ#2UETTr$6@3d(\%!, H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ`/'T9͛8sɳϟ@ Jя3'S iӣPJJիXjʕ˥ǸkٳhӪ]˶۷p&رq˷߿i&X3*̸ǐ#K,u&7P?Q5AI3ZԤLQL۸s놚5K^QJDQ#K*0Գ}Ë?^?M&H",IRQpm'4]Xt(t# u 6i͇ÄVHa~Q" !ѡraXj,G 8XP׆!ҁ!("@݋H&L.( 6FC^ b@alM)d$8aaX0eB d["h|^b꫰9#NFsxD %* RHc0G%êf7JjnHZkr[o`)5A Jtnv,({& 7N#I%TB\w$LNd%8mlMW-t=׭|o/-Ux⌷7G.wޔg9[}8砇ιOk-/nPz9nFۮTG.@Gy'<͚ У\a#Tc=xw/ч/>E3T ~>5YOPk?cI@oK@&'(<<|ھ;5Hgg0 wVEá +A b0}>31{I fDPP&6[eDp07"GC jq1"_ P o {^8A :1#a(UlG@ $ CzAc!L;=z ?R:y;# ) jBl'xZpStvY\䖋LE*@<hF3=´#qLy FngA !~t$/9L<8SGBC-aT1|BaYPYiJ2=𩟤TAI];VЌ*VNJ E9BFX.Ԭ8+yԄسuI 4CU2y ނ65 ts&8Uet=V3!dBZHU(\aZģ hUPhmgYW\CehQ \tXmY[U5F:mF:ZEr)#XrHӤpS;Ex!cyY޶LmAT)i;T~'hE9 n%QAaa}0ZwfjWLl3bӚ#5Rd l2VuYVnl'l9 %MnpJ\U2ѭ/J tC<*eu׽faxMZflJg򍃄'gf& "gB-LDiRҗ6ZSF(5rc)TEe,%D~ kcC8\?:+O %3e3i]TB:@pc}o .DkWw/@luK`!{u`F5o/1~q~AQ"ԟ@&tkeeP6$ Xt{&`:ag7{nwEKoZTd)Z Hqu~gјaH̜.#md^MtHL[DA _C32($iUlu橰yIǶ;@Ǧyk# v#Hpc臾6w(_9>3{.36Q)RގrD}WyvGuyfDv;{VB;]'pum#,yɫ>C%jѡ}/# Zoo(?L4점aȘw,-?L&AEHawiaOV0LӔbǴ XHNW*M06 XΠL 8NDb |UMNp@huv:uG)bk6s9%lZ"`PGPj ;wLˤMMN P XQpM}XX NLԄR}DXs%uMsW +vbSi3 eRTL' ghMBW bO(cxb':RlWsx b LZ^4RUgk]L4XmVD/TwԔR@LxLL>x !fNfp~~7v{subjYlc1W] hyXRzh8wb.LbGPx{vvׅVHXGt 4aq1`diOrt E` HNXLb @̴Xr7f]UVR6&^yV7'lFlbWl8xx>RBL899EbPY W([X~ՉLHsz(Z'M ȇˤr׈5 0MLLԐ6V 5^2WXcbR* }%\tpZWuZWX 7ɉb"oe4s;sŠsXȐtM 5$^HkX89EșV|%t{؂)B3uBC {>>,f4r6KDdw&xX^7sI7yعG^uȈbXuHGg^=5H~4o8kmЙRa֊w4LdNeN~Dv=EPىNMHYXX)byԇ ؇1NĴk;{9LI*fcǐtg 0_Ш3Bڨif`XU.q_vJ{?hW][z~IôN:>6z"jt()9L disVvY~JhyhxyfL1u]xu;Gj7RVjW~ꔈJdSu7^sD :RɮEic_ǂIGOb6iv)kk'_4V䐈Ypx;Uu"/&)bGӄsR= Syyyq$IzF@u$TNhaoz6kzJB?Tr@kYnTdw#Gg}`|z8sJR)mɈi91v'֦lTvVT`6r[FzM\{Tfg kLԸ=]N %Hu;KCpm gSs{xZ8yEuӄGˣ}4WTiv\tP9t]`c2 d G|S'L4~vds87$=^Ƈ;c;lOzT^ZPZ kk[쿑dC5d5jT^EG4 +\h]l5ejE}KWH R~؀iXRvoz\[RE^l굋DGN:\jve=Rz ;27sSG՛87eHdSHWGuxFs_.Ei,HyxGˣ|t'#CVGTڑr9bń3Fb^iN+evįt|A\\WG7єY }qhxfsq+ jS4Ÿh6fRKėm~Q ))pHpo*4?FUS[AERp\8] W6g] @5GVL\Ǡ{MyB(\ySΙz$a3 H Rs7v| L6Fk%e|N֜u$ܺ4Yjg LT ] -y>ZR~j 3VaIM̛Mʄ )YTYV,Hoڷ0DͫbVLk.wZ }xVZjՕv7˺,дXpJrS;qkvhˏtς4D`6j`m{ӴER&hU|ћRS3Ӷs\ؗ<|:Exe%u;(PS;Vk5U[lliLs2ҼN8%_a7WډG4g7sz:ίU ѕUkt k'EHyYp ~otđsT%fȀebtz]jٻO_~ǝWo930Jך VJyS7Pٞ+ 'vi] m0vko&oޭS9|BeЊ*ZfKͥjusSFl>őAM+*}{dXÓEV pY.eΔX$ǰQmw[ԥgyӑ ϼ:|RjONhb hcۓ;Ȏzgn썡 &wr>G`J5]-+İ*G{yGGJ \.!ZPj{ne?=G޵ m*VÖh8xb6_bl]@w륷+Xhuׂ*{x8:՟k 6_;Wy䮟,sʬˮKgJ/t8W x:ĭH0P@ ("ŊmjhB F(d}*K1eΤYM9uOA%ZQ3?)TI̦K)PԲNZ)fO>ud^Rq셶c :Lucq6eXaxB)W>Ul*C nNJ5Q"F?yY ɕA2#/S!]"57U N\ ͜5kzo!q+5xOWȆts4.CE7CŊo 攨BN4.fCNr-s萩nˎ?1t$jj`Fl$bnq7 #F+bb#NC03  D2p+c;:N#md(LI , |SoՒsO>O@tPA54iJ [m2a-r 6s@4|ۍD,f/H:b*3|Ƣ0A+SƶrMM#i,`1rH[v vc.dWQY˱YeuF RXE&&T!W9i~zqӯ8/<$j>ҍlx8V0 Wf r&ȔtO5,-C)̓>ʝ34-peqv. uNR3JHKv눷<{U9xεR1"Xo|VK&)"YcPW|qwqbRR2fjλ:J.ZbcSԬlqr0鰣[!J6=_w,NH5U,B=\l-L<n .Y1<>vb^mgH5Zs)Dh{[6,h&d^}8K}nԆBHTDY, HǸnduo7jmxX-gEJV2UM,]xXlR),2 mv${X wF4Qkd49Pr Ϧh1hcӐBdPC68\ji4:ӟhC%jQzTPb(D5ST1zQX459I VYDdd*<aő4ckek_WVS:I&OSx&'RZx +_ lKяac@HR$lX3*VmmmF^X*ժoU52E\x'elbU`}3nw]r5%0e ){ Ws,oMo_X= RX fp`GXp-|a 'xJ3aX#L܄X)f]bX3~$RBmz\X>q< &2_L&XLr+LB˓$e. 󘻼e4YW&qf8&Ȃ@?Yxs;S! BH#Ƭ/(qL>+H&Wf82.5L jHg ntm}&<:׳uwkY?)!Wc d C"`]<;~md{;_N}ntۻttIpwwM|+ZO,ezVp` h,%7\ š';&'|{T  $_9]]Sx6  D + v" ]1`lozխ~ҙ.tg>{\WpvDSYxA3icbz( |@5MlJ4<͂, o2F+ΓG4Վo}/Al ]<BZ a<' p{kL}j_'|#g|_C~gAB2 j{-h/ 9q*̺ ^%7Y ~򐳼磾:9;{H; 29Ӆ#ڋ@"! $Xxo;6-+>lA|=I,@ƒƭ;4ļr\4]D/C ̹ڋ9@#:D6GI3:9cGD{B*>';N4|<C5D2d@ $;:ۀq Q]WvmW>"lE{J]4\SIÆ 7EQK;68MDG?/SDdM8A^D`7BZd&@G Ih,i Ӆk:TwYYH5SÃa[X1S]5|cUWW]IZPøUէD!3$Ӂ<ӠA7k9T4ZW$%K6 @lA WAh<<-Զ3L ;R<:;0Dic{t [NEe ` R+'P؅8ԵGԸܲ%ZO;1UVe3#{e)"1#7#Pe`&`61_&^6xcfa>fa MZN_fljNj^jnj~jjj08i5j>RQj5;3kr%jVi`3f+cbu6s+k$^볮j/fNd4g$MF&. 0jek6n`rlʆ66.&`gk6?a/#PFE KVm& Aуcȶ9f6.mNF&Q peހ;mGo{hk[:[k+Ėlgp,@qKesF;@Wq-~6EP&pHoQ7[.=$5= =efCNEtqۦK S+p=`l`k|kt~ pT μTqfkEn2'eOt^0sxm59o%At< W2I!oߥKTԾmIo4IcII02m]皓s2MM7W-3cNMPR+U2tvɲ>~.2GV>m}]umNGx'lw:n@2xVxm˓qf L=w?hNM1`%+@=ey63'kx/QEt(xcm`{g}zNgz6/}^\͘\n&e{t/Ov¯Y=ަ$"o%/`Mv;C|%dr1'sa0JnbhcIN]bi':'D=1Sm/=GYɟ?޶k6ʦll3Ͼ6=俷sV܋M+ORnOyme~/g6p^r'* PR1 [9E 2c(P}")l$Bm %OJi&Μ:w'РB-j(ҤJ2m)Ԟ2`U0`@W ڢװcvM+*m{Վ  T/߽& c5Bֲsj{ ̗.geLlԞb汮Âoο|imCl]‡Aڅ7xMwoGpu++V6W}0w?JrX o{]+׳/~-!an~gW1V|Vei6h}~eu ֵWmd!\1>`@(/)Q1PMBs tIBj T%8MtD$#o1P !"@&1f<#g1).9rOw7la ooS8!惺` c$T1h!IKb1GU u@u: )w QA1"(?PFFi+y!$EuIZaظKFDFmAw IANs` K n_AzS?UGJPq 9{Q `ȉ'F=4#Dr/E, 2`pEgihd⊒ $>B0h E/Xҏ"yE"7L#P*ԡ:5?iAJJA|llp[!WIi[)da7IRw|#+2y+6驣 ȻjdI4c2`kD9Fԗ-]+}S>@A hʚ 5` f>|V*xs:{Rj|]l}ϸ|lPJ [ގ,y$ GAN 50R"a*bCPcJEO7S&"єv5T#jQ,Q_MǦUs$k Xb PBslC Ec `BX9f7 BnENZ3O7f%&TeBaͧYUl\Ŋqd!*Vf3Q2.'v1([.Wt|'33O}'ORyqf\$7ԩ/c2kvFc2OfZ̫@Dth%-`r4&(1iZ-q䊭8x N3T( ,he3.ݖ0˧釧?9 ^> ( hrz2(bk|Ⰷ[߄lmڱMp}Lw)XfhşrUP钷=<8ߪtKX79I89ptmr}Eo7#= kG,=0X^0o2L=}u]JN_+Df?yQ:/B=BF{Rink()I"-B/g%|Ҵ P\s Y1'gKg}0.HDceZAUbe^ARVS9dH-d фNl` IEC]xc(ȕALuJ $hh-QᘐVve3fV:Bee,ґm^]yXd؉ހ\ \[38eQaGnATNnqNФqء^`@5qSϽUUEOs]_@1 Lqg:5F'OƌhYqΎ  ]1YSeS`RMc%_ pBgIQz)DJdpW)  UFjvE\EedŝʼF/]O - ^|hu$gYvXp 0ZZ{`%=Aƺ(8jZ^DK_G4! 5G"V\`{@t ^TVGh@ Kk1}V_NbV(^ XtjDxFYH v p,8H@)gzxR]eh ƅ͍LvlZz΢Y),ERɄgtLJ"7yzcFŶYVxR1\ǘ ΉE$$FeKݪ숡嚘1 &USV,ɦ*e G ^IC+H]dW ,Q 2,HڨN,&R}iIe!},Zʐ$".ϧxR[eIMvP]dlZo.X2f -bdOXKo}HK.To)s>\%3vPmH˧,m*(`..Zmt_md'؜J^Y~i\عX:Pk4J|kEmKH(%F4,=5͋4DDNHxMԘM./ۄ-8`!"ad!.2B-r1&.*.")1]` $E0yʨt(G`(c#)T!8*!N%2)2)2"J-[$p%pD S 22r02/߲3Ez.oV35r%Es/o6۲6_+ $%s44Ĩ3*1,{26x+1=2921@c+t<_-34-#%%aD'""r@J.*B BBs!=K++s(2SͧOP @L*iH ʄ4OߠVP5Zs5O35'='BSsJCu-GQHR7F4Qe36/JQWW;75YcuZ5X#$ZV\uM\ Q5``tMPsMd_5a(T3d?QQ\޴If XN.Te?dt6`6kk6lǶl6m׶m6nn6oo6pp7qq7r'r/7ns3j'h;7bO7i@Qh7swwh>7>wQg^sR_u%/50KsPЈyzstye7rw_$s$$JsO g|+~Rׂe8u'JO7)H{^D N:/w'2p88ao$8 8yoNjڄ`ն);jtQHMHQ~[]@] fچv7FEX;G˘í:$Ő;[ t%+8]`T~"@{vǪFsh>e$vBnqxCKY~/Ţw̰J]fm9fv/;kjEMMNϘdVe gn00|[m] Qgmɒ Y.w$;xgk{;@8vuU7{S Gj̓ %ܼ"z2Y8y vtg۶ %ܫ0}Cwj{uUWOOaTN??TlX_WX\DTGA|iiEkT؁N̊7 u|)\i$H[ȁX`2 rB $!CD` #]edH4.oul!.q# ;7ĹeEuQ+aکٓE%V*M]t@t! p-ڑX[:)܁d:Z>B( qb> (W$ 'P°mycѣI6}ujիYvvlٳi׶}wnݻyFm`R"łǗ~\B!3`d(k8C /ŝ'jLcΓ'aEĈ¯D/!SȄZ@)"Ļ.64 XXj&#6bqⰬ.<b:8A|BӰPz)J@ D?S3  L5ݔN=PEuI#fJ,VeE!^m5WR9]wRUhEU06p P1Ihio&CEo.XqP WWXqQF\wU\rm=W"b ;Zh&&X)&pomC"Bu^ZUXa%ZXRzaV=Vo`[oO5_}}F]lRYYy׽Ӏ^l31s J( ={I[) xc@!GCEH}垛{TKvi]ƖY&]qepgQmimAZ<>cl(bQWxyYw]+77foV&uyuQ\nnie鍊Zޜۯ1IU^hTpףD`-}"}aygO>&bXTf-YJ'>%w`4,RUCTB[Mh3f,lp@*x@ 1 iXC5J|-m,'[O+s+dJ<=>8CT6(!|i Ĉ8Eq"ʀy\V}%.I|R>z["h<"E薂e㪎0*c긾A(VfIJAX\ _Rpd.,HF:ic͑{)>vDIm.6k_ؘ > T4YMk^,Q~ GVB8@LVg)IVåpI,hiPuHCIqEp|/g-+#wBFiE{bʾ/ҁ|^}N+)ܧ P9!sX$HEOÅ;N2ԥ}^B:z' (GZWE{OtgTdNE"LBP 5khKMy^k (7Q8u2GQ@vdI!Hw$$; Y: đ,7v*Q^i_HAr+F(D{ТHeF#TR#K j+!;ɍXux϶cbiqIG9½v ԡbW@cᬇ7>EItC6? ,~MGZ#(WhFOk\@&_`?x@XE,Êz7ݭ,hEVD(Oy"S K2~)NĊ;dXb$Rr#`ʼnF:tWy wۜ-llD[իa r# Ibc$m[Y=6n!1Vyڋύd kmX5Ǒ7",4$)o=$V8m2&}*Ί⥍ϲsr<&%\R:U~9j"ABOALj mZϏqMj[L2t_ُEP'.RJTEgOh1q nsb[ j9I'fQ/A }VT%R¶'ty\ #l{h_Jpm>E\$ZI惈d-JUPhZUt@O8$EBX&/Dpq Y (Yeʬ'%pڢ| !B*6#0/&PMƐ qTK?cŔbIŲC< I)+ !ČG~k"K*J;E"":-MtM"B) $B( HItM~ /Vd%ڂ&B5PɶP>/X%b-؂& )ƒ: )9>FWxa~ fȌzq,#0*C;Œ9"Q_;_DD#p2A3Q15LE 0 M&d@d,@Li8H!*$4x@9q9(Q!&Ǧ'ڤ)jqp*XDE(8"ۢBܜh'B b)Vb,K!B;(fA#JGp08+2N+/ b(-94@n!!.i%WwNQOQD-/*C 12oG* pJd8ČS="$I*_lD$IV˾qt1** -QRwbJ j(7E0G"*b+s77Y9)&-_r2O&&k( 9ef$M*:,"/ ?̓~ 3 \@-. @  mf4hP& 'P,1#SC7CZP!D#~DmFY6BEEF4DqFEED1'p\4sPGxmͪD40HqGDmBq~r.'DtZ&=sKiz th!Kt`<ZܭLLL3+LstKgO.K4z.m|4G-DQATOO+3+EMZFF O OtvT}!QSD]qhtƔVc5EQUkTMu|׼4޴O !64CYBOJRKN'uNWLHKc`4TMOO\\ 5U]/U3\ٕ\S1`\5^U]u[\]+`][SauP?H'fWZuaUc7c;5c,C |7H$B#d[e_fcVf3d5B`(ʄ)YsfhVh6d$^a(#F=jVjjoH0MG[lVlǖlo]_lזmm7@CnnmVd3V]GS@Cp52 W fNqe 74 o#Wr'Wn\Rip/54/:;*0me2t)sM7QzZtK(vowyc 9W`tHMs{. n꿐3|yfjnp.Q8uk*mZȅ*14}2r||]c2_hhb~JPIMbTQy}ķvqHP3O{A=16{!|#Xw >oVsѳ]Av4݃=sC8a;A57 ]ytPRqv9{w؈)sή=MR؉6T=MONr3w*  eqQp0qY6Cxp{W2qq qek'I7cxSGh=`J9ق(?CtK7OX7Q)1A7kv+1.El1,ȂQ"uu嘯W{! z05HtuϭZ(QxyO`1 18#~ A Y9Y+-(2-M)!BD)!/@jrqIHʤ r!.k)-(.Y"0 ۹mP ÷im@>kBmxfln&aJHRԌ/2HV0 )c P8E ϥ*_Ʉ #A?5,NOOz2S!F5 :ZAz۷Phl4& 8-?mIAAzz0aӖ9{۪|mlȦ{盾UWfgxE@~E@D]P@i@iQf |H~(x pTnrtc@wE9|X"c09Ptjljmk`[l|ZFoĆ~ZC-f4&tK{{8k c:m:ʭĦl{mb&A'X|̇]\fg[}6'Jt#JHf%J'pC2`tyS{lƪ&<ƙBkLƕ̻l`wuC.yY/0t./V&OAͯ6%4*IXvFX [%B=X'2O(ƪHcZќ"PQظj/ eJQR)DH[sK}o!NȦ=ƷkB#obw 7Ɨμ1ۏ enũDd0!*:(DHm~ɖ:!.=*pko.PߪH\*~ngg! @ <{U@~  -oaO?fT$&MEΚU`T4[Fs P< HP>2T4Aub2f@0fDX͔,KT5ԩTZ5֭\z 6رd˚=6ڵlۺ} 7ܮ۰A^]2W/g ؛ Eēbyr̸t hcIo mט]OJ>zu ݠxÁuXo`6 IO5onR ll ۏӰU.ciūTAJ)sfi_Svv޲^ *eMJT K_*`N"X sK_%I NU\6ވc:c>dBV%5VؒXzզaua: YcK-bǭjvlʹi.y)d` &YE&e`xi.Z#T4~" GX] xQ+xJ % cI$M*HD (~4"*(S%dXjI_HvH$ 3b0j  R+1HdKn枋n;ɑ{E`eWa7!Mqlc]6klMn9W g7vltumSS=K&M֖C1R6!%QX]GuwS=(-*t ۂ"00m 5Jة(_#z s”pn wrMwvc5IV|iqQ会EY .voE0mhTR8~[6VJs ǯ~HJE)db3 bmJۙH~R;;݁]tҧԫdL1;MɨSwߏt[+@ 0^@+ʀt!4 >BŁ`p 0Y !p] H,Q6H 1SbtJ,$v@PqDf0Qb\q Giـd\FA 0[dYHK:D3r$S(ZGPt<舦RcD<@䣞uLҸF`m%/LjrSZЂ2Dp81~1PCXD JP2d`-iJiD (MKS~&8\ֲa'8nuvh v;a{OJg"?i<ynўYA*BOdNɨq| FGCS }v2L$Ԣ=rUz T"'ISɘt4MB[bF2R:( /=Xq' ~sMZƖb\iF `!prdUe|6xrgؠᴁ]S< 5z0rI`Y )|V4E ;z"SsTzcQi389"<3si[M;dӛvo9ٮb-qIb̝%Bwmt{w(nJ]Wnt\(ԫ-+TW% v 77uWuI8J:cA%U9SXNGrTL [o# 9nQ[+>t8$eYFAqAQHp t ~QWp0'tJl.NwMqrnW4ouө5NQ'>iUuF&ٜ)2g;kARٕ/Rfw-rK]ίr]gsX{\T4*9v6ۓx;سZYOhya}W3&*ww| u0CTxb$xA=T%!KBQpmTXJ2TLeq@Ld'qyKY&~7h(w1(O%1Tw:1JB/ D:-%XRT)d )b6|IBas /S6'! H43mhiHI(sȀT)@4@aBć-L|V؇d@DB{HA4@K@`V,pL\6x <):+$@|xȊ tdȄLLJBCNDYzq5)Tq!"lF]c*m(![FgH/K@@7J0UdLVLA tLK B(uav! 3(Sz؎hV鏶L KhV~V`5|0 aF]$W+Os$R6a a,/,}gۈ,A)f7TJIJ!CCS1!/NPNy! @fi&`_^ʕ0z/72Liy]M\yd7Q>ptU'|aE-SEs@A2C6gdHS2;iCi l~P1ٔ؄U ]WQ`К7%p9ʇ~G00kU0!IJyS%9@&̩ @%[rUTMt-Dn0g$#+Nc"AF 6-3R ):jET{$d8y.Vi㙕 D1~G2)TsB(L$ $0H9~Qi~1s%B9~p0~{a>`?dW'=Qv+J0GTQB~#@tx~0#xJ؊P&0ϴ(%9JJdؗ T:N:!039yUj_d )}VaDrX2>Icp39p zhwCC$396z(*1DpKT*'S1v2%ͤK4|CTL'4U+ʃN1Tdz'~]A#>DZ%;rL6![hrY*+˲f$(Q8‘M6 {~NZ >˞6BU0?&&I b91DLj(0J:jIH%&a4T V w7OcTP5'*6-L!=L! ڲ˸5/UVVjΩi h"0*hJc\] кh&qiW~V&{ (%ښM*(0ӭq( ʱoF;tpG!O}<9y-7azո髾4f$ʛz1H+A9ىx~[9ә{4JkydgF 'C &[{$1R~{$yVmTTD÷x51Hq"4<.0p>"8=? MSJ1ZV[9/ KV}YLVg58'W9P9UK%A +1xb 9> NVS:WY!ey LS[)zf3ĕlɕd J@tPBM TKTC$J1ADl1k+dG:2y6x&$T(`5Mj@9ā"*A$͵A Tv04M':@M-'|.ьa-Y4P*eQd{7R3 amzI@ ɨSzc 6n6nJ7'Rq!0 ]e Ha.m!y<'7-'7m撖 yWB,0{}^lɶą%^)}~艮Rn+|&闎y|IB'fL[oN;F:^.ngϦf6Bf q]ŖnS+a,*X%\Ib`>LЁYn4 Wxum6dtپcnJ':.Rx횔4B-^[B/g]-*[$jo)蓟gծg!Q!N1et2^VwFv&yQm }L´: 7c!3Im}BQ -5a*c4Ws(񌩠);%d ynF~ 0>n/nH'o˺ư$DtҜCfFs3y,_OaV-!u ve+f& WGe_Wai|5w}_e ٗ0;w}>l$Q~FNa&A|omi~voNvfꭖP(Oxe%so/__>y^Q'a JBP6~*Q_%'U(1F'~8H%MDRJ-]SL5męSN=}TP('!0flCҤn `UMj xKW 2PSXJ:65ӫWrM@رfņ]NV::bu F1ӧb}JN[Kc聥M@a ;T^RaWl|╪6nݱ}-֭O ]+thC[n6T w[-n}w*Tt V;oϸ`sȀr.?lϺͶ܄!ג- <8 *ᣢND1EWdE_1F]*"G! !Z82Z`&#G0I%L73j0[J.9uhzfv9+pC5Cl"Vk 6ۖ=wT]ՙGUlWaqZ'te(Z*a7Bn`l塙hWWa[Ze]G`)XnTs/55S!w&f(״^e/n!oc܀Ƀ~ւmc]_USke_=&d e߇?~秿jԊlB!\Fg#^to(C $X!h 8NbТ0+ ڄWPfb.-Kg@pG! QP8H 4]/6[-+y<WZ}TqrË4g!q(ס ?mxhpRW|  y~+ARTƬj eBòMT0|x8|b)҈9Mo@dQjA^. *n7P,QH {Ftt Q ֆխm /oﱄCF7O^UjVge ]5l "ù6&v4U𳷆aT5]P4WrȿafgRcQ!dDl&Bp v)n*LLVJVV2Y6hb3A K{ ez{_TN,wȋˡj$:-ga6m'*q :)唱͠W_t7>Jי:l|r=4l_/&.t0vxP@{\-e3|V [p`qs#dU`ȗۡlE{N3gP!NZFM0|SbM.uM.yL1aF"B'գ5#|겔{.ɗ/W:2SiކҳEEo}CqRO'σ'/Ջ;+H/+~(C6u n|`ǀph T&@3? k]\mIZ p2T ̊11&k+!BĘJP/:4> 0 T  9:`Xy c0q9 K39)QUJK.Fs`( >2#qF[3¤׫>XŒïa9 ^(H㸎kҩꩡMiE38;,˳>[R=b0Iɐɑ1^bp 7+FX a !p8]! TLI0JYLpa  X?c6 '_+܀0}II-0(b* F(S0zIY0Y-NPR.)z#d+DL9^A0C/C3!*ArQ=285hDG0&q i#AoI;1@1ɧ!:NʿȑpHQJ@j cȟ, h]L' < 0"~^fl?єT1w QQDJ$ z㞋94Aƙ8Kwad䙜YiZq# FĴ9x9bPۉK!({3C(Lʪ-v9Q13"ݍQ.0Iڵ1 ӑ'Q75u^Ul59ơwWZ<_Eް="/S"83/U dәz7\ɘxsW%;5Jd n2ѭo:Uo4!p*]r'q l]ֽ@ 4!=J0ʕ( 8ދ@m[tmIƠ<]q%ޚ(OH4ؘ})䈐lGQ?= ,LH^3_Ԑ%__%^=~g1&2fJ!Q!pK,FA3)T) >␬@E\'C4$Kq=Z`3NOEE} !c7aeHT_4pHC>)(II( Hh4EPQP\y5fvgd''c8'Yf9U`޸GwA0jn^A-;Kh|g݀6J;.h*Fe0 Gy n}hea ^]!&If^蘖陦YN29ؠj[2ꤦa>jy[nXRj$ajjƉj@㖀5!`iPh^'jҼIk0(Gv茞dHk`nX0Gؐ &*jNkiǎlÖl`pvߨvFl6^VlވmV=h°<6ʳγlYVhi9/& $K?`b>fuIJ{sR2Cj BP:,1,$JW.Fǁ1Y[!3כaNd}`]&i“Ť),#ީ7d#Eb* $mn19QVPv ϔer$@)tqUgUnő\މSd9"^)l*ysj*`, > 0[QW”xɲJy?AT8.yNxRڊs^ ڏL{{y '(Qzۡ2+tN>.ܲ"a uZ9iESpnpEq$cze]TV6O g %o2'9'VV9cJgA)5Fa-L\QN/&Eq7O+][aUܑ-i[ R=+LB[=VQens!2}a:шX`f8xb|KuXKFxP?tܼ9yVIKtoWVQ)qG'qu],E @E56a)&A+sjq&Ɣ(ˡ r0{kшglhn_m8uK0%{OzRSGR{1-hov.8 vD 7(j0c+ߡ/'|׀X{RG%ÕLjy[d6.3:r,oOl0;`6<6 7(n ̈4FF p"UTSq PlJا-)cJ> )_° h@ ر[n- P=Am8@S U!„Y*'D:J!מKoRI]%!L5֪cxʉgM{t`ß""6_U0/%bX拞+ pZL GlpXNmDm_DR~_ ᇘ-ZJ*}t0\'Vϯ?[xA - &AvXA` ҡ>f=֋qG')֜c\4u r-4]/PfD YQX-DWW[wW'a)g(CK ^vi%]4$]]w6W%U!]˴ 9i_dP("IUJKrc(J9e>%Wh6EU\(c:4Q*)u^)&e>b(s/2[1a׌;J,A-+˕qۭ߂ ` A &,X/D@ D(a-d٧AVN(0wi he]yZPCm -vR#jF)M = & # s̲Tk]1]1i mM/r㵐IgiL:W@qji5S-a:5DVIVE@ioSTTNyURAHL']Tv* Vl 7%sMNvę˘fo 9sn\Lؓa|_#Y D1S<ࢌ33O0ᇽ0PEdk^d\Jُx*"f՞$!ED0BSr1d$` (ǚQ&lt3V4 vE&3r2a<-k]$; !`r G,K]vŒd8,2" `]6eG<f0&Z3 K9ښľN'[ \V& bga Cؑ1 (M.7vGE<ČtKb2$';IЅ.p [?.Z= e) eBtp! C Jl^5&R R@'D)kC'Bs*ɲ\W Rv ` H T -FV0#.5'1Q#D JQ$Z@I&P#8:)I"(}^3Vb,I%iL(:7H.X8&>F.㫨;.!`j6=䋄$),$)J%Ae@MMEHГj]+[ַvkE]̒#@tWXE׽v`P!l'T)I?=QV[UyxyÕP9lwfi!\&þh&uwj:b0dv4e&kHb5HfFiLf}8JP&sX!c'E~(}63lWӻSߊv0Nfm;ZXEx&]E&N3NHG99RIwp1Klw2]Zwl*7di |%X6ՋA2C""BvI)R IF2?Q2HdJԋDiwSۨ0lJ.m.X'NiHЎ\‹QyIʙ_f ,-l5.Yc(OAo1S(2ݰԝJ$dWcؖYf)~ YRaDgʉVl8"dUHDqtACvG ACQ87mZ`ZZ/vE f`"X 0iHv@<]E; LD^WjtB*vzfhflR[ȶ%X*:v.haa 3ZpE;_"Q褰AM>K5*$R9SL.N"eH%,n33.nʚ$lSYsp{]n7PIEi ?MtvgmBDZ67Ǘ=n7gݕ5,IYXߨe,Q!c"Pre;hP:/ȂKeWh;ӦlԲG)acfS/ +m^-&F2;dN 7$+$6|. Y{RҨNy$pKRݾ@J!aYN9ԲIQ Dw8fIxTmIMA0$-` $(O<]a,a``*%Q "s klU4qBZ( @W$Ƥ$Yjm\SQ@ -Y5(IUI͝T!r4 Ol ۽@  BASdq8si7aF v Q?ɖ\ȑ`)A!n1fHㄉw0_)GFNhy`2*22} <-ej^X )Y`1B8Ĉ\q4OM<lQE R "թHU '$gIu$,I[PdE9inK"( Yh hY8X LؾOZ pH05_cIIx!1N{EW9qI`g`gu5 Ԅ]$hT^&]hǴ D]GBKRCrNIH9 ;)M(R`PpYۅ̏tPT] qd14ЅQ)VhCD\|uhDwDxBhQhO9ԡ >T@24^xjt[ j[Kŋ6bePh(+ Aœ^QNu YYEmG:E'40+<)v4tZLì2}BɁ(E}2)h]eMEF񩘂ȏѸ:%@-1Cd8CB˶4LP0j'R9C If DE v%uҧ.ҵ6- W:`$õ WVؒLa囆,fȅ؁ڊ,]bL0^&Uݖ<ݰ땙CA&t={&U?%!`wq[AClHLb`@fI䊌Ιj!Jc”DU)NmYݑS=W@~+H&JhvJOwPJ8EGRWQKաDbnC!0rf8ϸdݬyroƕ81*@/.-X%8p/.011*^&LGؒ E rƨ' pO +zQOgE y0?dsFE Kp GDf+y0 o {mǒ}+pŊ$7prY& m*1¤eJ '1g(ԓr ,Y!!#r!E"[!7r"+ZEq}dr E&()0'$Y+ɲ(1(r.. .χji*23s3;3T/F04k6ss7{7{4N 89s::s;;s<>s?{/Pe4*@Bg?3tC;4(Y$na/dIF{!, ŕlDQ1GLTJ sFIFs4X(F?M4C˕+C\D8gEhhS$"ќ')L6'X@MTshJpNX߳4-CVPSV&YU**؝ KBR]P _Z(\Ȥɡ2ow G-#YKd\Ycq""'r'o'rgkvgw26ZEP߆基bOK fNo,v_ȑ,.9dʕŊS3/ "6v0Ոj5K [ ,@:O-[8|KۺVH5s,1mU͢h ш3hד^ZGԤ;i/v~PQIVDD_ *ҫ#_<}7\^I<K 䵛LO%42#H0|`0Lwb_tRuZo]p8")x^\Qf=*R_w g. h_'dࠜ%b J``Ηvɞ4bHؿ!E ok3RxO ܠ2(^b⋿[,}C\ArԺ$@` 0P6BJcZ9[xZx%*W($SIB4҉>oM"(cŎa\d?SqcǏ!G 1O ,oy\sI1Gnke>1 .NXnJK<\-bP"2;;38Xd-SƘe `NI!I:ӋI@%'h }pMjz[琔( IVܢ@&=+G3+uZ ڂ89Bz  ~Ho[_xE_ EX%c+aKYΒ"@&yc <]gMmC]Nev7py؀l!@"S9/jh QG@x"س14X@VJ>zNCDHzG|9ҳ^BFHZu{$ϊ|M I~nBɒ.#yjSΔ5)k,78N/#e;n:FQ ԅ7xAyMh%+.lznq LH6z8M}D"D9+Ԑ[ -QJ .AhLlT|=0$!IKҋ#P^$. =)wSΖmLi+, Wh* Ivvl,dQN2w L7[h*p^`*b%\Ax\38c\H2Qn-c\Xag$zH&iq0ar `U$t%tiKR5gtRwí v3A_60Qbn>g,C`x m[a$¼5%_me)OaDlX[-֝4:agOE.["q-:F'0#`֜J&H^xӸǫȐU wHъ e!G݌ЈF4}-{ZhƅT#hI5oi926Z |{ӂQy௎ڵq`#tKB tXsRnqܙp96unP1u:mv͕.;&Ƿ7$jǻbA>w)Ϟ;4xf@Ju1\2z ryk KYJѣ~JTctIBQX!S lGg=N,~?}O(T_π~{ޚ=+V/qTYѨ~ipV}]?'o1p4oY#" Ȧ$`˼h*DS8E4/fA0Ep$aKBֆb[\jlJCenpupy}Pa@'XJ"F~0 p y0Gt󤧋 0 p Í 0 p ɰ 0 UctO 0pR0HWZ.\o20qQK&k&Ho-h/K,B+MQ41Oc,RRD:<*e@d+4daSCf;bQ#GVCBI?,G/dm<Q Ҏ&NqS;bh f%1G&diq2 1!"'+r"ӱ#=#fꙔN *CO`1j,2zZlqG=q$$57x 8pa?g7}@+x2/SsS@ad=i=i%A/Ӣ ! #Dcp0G0,sҖDj)P $hN/03Gu4,ERlpԆht.IK>O'B7"9J3t*g;3k;CԬ%_,I=h?V ?!ԧCSrGOq ;^f~̮8 2zaF :+A/KBdK7Eg)$A9UC%1&p80_~,>R#`BUPE@0aOyWQ8 ̞`JX6u nf2tS)*ro e.$+*d!'B=l,2YufaTs|b?ІN&G}5`*5-ȷ4F9Q&eZO/&Z 42*(13Cᮒ؋4Գ]*vhtC@|ʢ[WFU&#](DI.)za#YF #>Zd"@!`k6p Wfzh?8ri6o25*K8Zzg)X&FL3~`f@V+ jg?FDL#LkrpywpL;$q̞j%Is8;; Vg%&BA yK%P=( j"Z$PB_mP"#Dnw~Gi';CqDji#@7wWoZF0`E+C9//:',RJ8#\^ !Hp"6M@)>[Jt,䊦2,.-X(N sJHM@D54x|D*ΒDMx 2cr@ bubڰV.$@f~|3z"bM] Q3fo*(*>FvaF*H5Ht|2R<kA10/å]sO3.?(W/ iCFS퇞,o'a߱ݱ0H&[ɖzHj(Dҫ:"g>E[պ N;kl_Z;sQ!;%{)-1;5{9=A;E{IMQ;U{Y]a;e{imq;u{y};{;{;{;{;{ɻ;{ٻݛ 7{WF蚾K[+ҿ<{ zܲ%|-\#5ܮA7ýA|Ļ`Iķ:AQ|ōZYx ii3J| ׁ  ^Y Jᛀ (a>]^^U}ܹ FA\Yܳ`oO߱={}O]변տ^ܵׯ]گ^Q ]8“} $˧7S=o} @W ? @#/ a/;!9 *??>&sK~W:VIc}ۧڥ;W/ /`Qǝڟ  %)cq+Ɩm @ Ep`J*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗"tHħ,7U/ Q`RQ/p:DUKqIZk/lH 8ɵK^=3,l͜A0g#x1] 'c$g 1j`OjQFn ^q6Qzʝuᷪ@3͌3?Jҵ^xo\NOy.UXb^SdZ[Vk|P6aZ%uλv6% ~ɜ.*b1&Z]~ H@<qSlAU4TPh{_ǚw%MO!P+T/OFoCBD7 $:SbA a .\G@ HD,=!̕-9' NSU)P>5Jn!70l㗍|(8a:g,>JUINBt: -RS ֌@O+K!儩Lq[h(c"PnK~,gIŽNDL*SgZGbV%/]2 P 80x@V"u"aQ1\-Irh4 |l( "33,"|1fg!uIЂϲ f%}BP4L|Q%2_0 HGzt.aI (gAIgJӚ43 rB4̢MJԢu$sJq>%DGTJժ&ĢXe(U`_WZ jĬ*AB̪d3l]kf*v]׾B]N VPb(0U,zUZְze7ٽfjfYЊֳ%1mWGW֞!l XBBXC;Z֜I&nRY\:uT_ Y8Vmpm! mAcu隷nw[]NWӕt 6ԷE0}UeEV Vծm+zMWٍl{-7 LSQn;lNaArclmXWXAΊS _Yp*r/i.!M20w-"bnz}]no[`rNb9L,^yE0b]΃fXc,cY@A}ofKZ_ya,cNX~f3X?+6IY{cm;t3pgٸ1\8ר]ASsZ*Ň1M"Rv /m%@=9N4QM͌U Aē=gWwx+z/;/{p@9=x/UNP4>>/|&3ckkL_D19i.j? Zh8nkzpL* c"wBrj$M3UVW޷.mbb."֘'XWKn\mG.Y0mfz|jxCZ ^c/'sG|yk]`#WzU  \ՄS'^wr[Ӫp p[ʨd(G mr}Vh:JP UԪlq^ ׯZjf|إعg*ڃۄPPڱqrI[ j٩׆[tRRn +rbDR?AI-nDdAFOQ?kvʜzctkA*}idhjWitvZrVؓeȍAe^t ze^W[EVbZ%|AsZVYi]W`iDZ{ho]=g:鏁ZE'q&NeHJP`:˳[sF~ڼui"L<9Uf1^RM.@I=e)U'!Fe)s}ad";|ǍxG۝ɶ{8^܋:GrڐV޸hqV+{ y5]ijjif]敿]{P|㕳#ȋS%kJRNqOQ1D d!=>*PE3/|"Ui$ i}B,gkjqv)ai )qB\{`520tb/wיOfurƯ[HJF|6́^nȊ|ψL89Gú9ӴS5R6|f/.2h:^w$#"~`럒 ~hg}^VtNcu[D芣ڿ%zwqשVXWFWi& sLd7ٳfۜIu@ٽJJpq(ْuu[r:}sApz 㜟yiUM|r?5FA8=%Ss^q]&GH>CQ:91O#:vxgu8QHܷv`xȂj0qFlMstj׃ǟq(^7?݉~G[˘kݾ_l=*tB}(Γt+u_k<׌ sv#"(Ēy =.u%`@M/j![viż C͋ A=gziXU_Vg]ikiהdvK0FmG^vf-^ajƧu^gzYuq(x9^:0Р_pnMxnϱQ3>axS<ْ.`ALWSLYohiVʢ/7kdGm}V y!X%]bYblhB +Fk.v?^_ezjceؕi^p^]娇*R{im^hkf Xⱜنk;Lx$Ƌ)N,(QK zd0Ÿ u%jP2e 3DA& Rɔ'$ԒX"˘>HR%-ai36>XO@1PCԧN\e̙5ogСE&]iԩU<d?4ڵe 6mޭ;n֢EUUDYm.Դ7oX9?vZ~gϯG/gBf˾~E?NHJ)ɥtˤH=3HCKϡ Q<O&EL@:`JWGKLȒ3H$TrI&tI(rJJhVʹҹ2r()LL?/s"ڊ|M\):1;sNI=Qr.%1+l@;SPCuTRK55524BҤ VO;L&qV47<,`UWe+dGjFlA$[pw\r5\tU7J@I{]xyw׵^|w_~_x` 6xIVxava#طގ%wc"y5wdK6dSV`ᆢfk xfi~k6kO{ r^@`р`n%^B%je{lNҷӖmfg淳h",'f{o{{F4վ8wwt1SyifZ9S<ƼlC}tM~mkΛ'v='[nۛx`V≷xMOOٖ 0J #Ɲ.[@%kmȺ1KW}w\٨o΂y&nX!xܚ;+Oxv|3λFzkE$KiK8b`+[z'$>P3j"x_h;wKƶQ,`Aި?(f7 pbCn˝3*FG"1R\XC8Qsv&E d|4wɶ,m[$^8ƎষAxPZfRe aӋT0idd^HGXRT y,HWľvO$ΎG&mtgu|fc7n=|"`w֎P{ |Od$EFZSN=D^<XCn]D= `G}YY ˾ѭV0@9 RPq3%R:%5-JҔICB6gQzT;3iw&0+(Dfu ~7)pZt waU~O] Z.E Η>}Z)FXIelc%f8̙@_F醿'sL6;Ru EU?j+vm`Җ”1bJZѶL UDls\j6dx߽@*R?|d Ygqwxe(C:!r7 lA8B(יnk:yz w~e\`[n +{a g8X,"g&>c߶qhE#^o3;#WP:n~ᴄ~-29pӚPJ$sNp|e~fb]f'wc[܌,Ze3DX-ELLg -Ӝ\a-YC!C̡r} hHGZv-(;Iv[e3U@NKͻy1^ ]x0$k`}4pb-+'UM_V3yU &{3ȑ¶05vnQg`F (M/ww?&p1يX9&-QEc(Tj8q\_>ܿב[T;̴K%ߙ6,8'''l('ݬ! CJI;>Q v <.tkQ0R-UVڰ֤>Q>*)4 [(GHZ$CDR$% B Irq&3FA] DI-]TF%--T"#6 <+ @8]1bIJО$0ZӚ#K2A Z}0F+FU^50Lzͳ*=_#?Br\26ؐIBh2y#kR황l}LUr-W8ɰã?J+1Vϧ8O*(lT A ʌ E5W5W4jIӊR/9$WC3H+T҄-Y*2>c+!h]$q$5ōEiI:q?LH<l4m̓m^ Yi!%($$̓R;b+JA!A|?e8ő2<0Q5Ҝ ۻAsZ]Ԕ}cK-"* Zֻ${]2ʢ)0YYݳE1}l<۽=]]X~c<;$N#lV?"KTϵ5Qk[D->=Xԭ^ltH)ܽظKz*^bbLz-03'15^1^F6:SKzzkY X3  =HTu^@3j4; `Ŗ9ۘy$JjU/Ñr :xT2HCzDɱA2qț5ma-ϢhxoB2Ip !$ce=́'uS UZ-c[SD+'XF@ndGoYs*K#S}dMdqU|8NeQeR.eS>eT>ĥTneWV 7]%|e[!, H*\ȰÇ#JHŋ3jȱǏ CIɓ(S}IT&+*]ʴӧPJJիX>,Sp_+(dM6J[Yh)KXJ-$rNzÈ+^̸ǐ{2دaŪy(J-:0H" -{{0ȸsͻ/˜4ХI FtԄFP]ִKI_Ͼ?)eo6s룕6Z%!LlE[&~'Vhfeդef˝g'W QW^ `3XI&i<@ơ&2H&$75)l&e O>I%P\IezL z)dihJ AkN&n@ɥ?H$|) dIzO&x))餔Vjx *ꨤjꩨꪬ꫰*무j뭸뮼+k&6F+Vkfv+Eɹ覫;[-Qb 5櫯GP3(+"' $Q: %Õ|qsKM$q<"p#/(#0,|Eu<2}' ɾ@ N> 0=C(13P`6Ӈ9W&m6QifͳFKIoMO}5ˡuMK=z7~Q3T/m68kcs =slyStP5~Kݯn;S5箻 7m\'SJ9}G4 թg=Hw8 L7`<|(K.(zvD"Qo#KdDu3PǷP\i^8?Ri~ (; m Je|,)IuO Rpr@ :ɴN232).U<FV3_dZFU}y9>qSğ088fr&GH8&5O C*Am~4-.ԘȄD' -y&f&gFs>ۘ@WFuJ[wÅ0,ɤ|ŜB3t#i[:_rd0Q:&Qm/Ҥb''ENsPMZi5՛]5?S}tc[EJ/]oMfrTm YHUvz+$ҚvTDĚ$$-I-lU@ږ-n״{6_[-85j[\֮obsllh xgJ/!^mJ e+㍯|s[GͯK "/{0!'ՋBNR|` O 1;.+L!)qC`L8O>Q\êʓ7]e50;6S8Le "Orc& E a+̠AA5@͡xsl9 0`eft$% ?!BhF3A. 6qLi]V \:"E*D 0xe4կf5cԶ^:H? N}ؐ K#7cP?'ʍ$/[4t泟 msbع2Hzw/ ~m~d)f6ˬz9yhOLӉIg1Z3_bq%  oQԺFu1V *p2b ̺Ő9{-t[7vaWpde.jc.3bGٍ1wW;%ٙD`ݰid&t\6Ӈs_Ek3;V3ԛn㋏8q`ohf T2\ d$ː5sk06-jt 7xgff=W?soH&}I?Orlx{~wkzˬ>7m'mz.}v{p qҶn79*1EcS~Sg pgqulqw0iշdѦ.٦dbfff6rr.g{WjHj jffBh(~ w/ izfhTXvhOecY4&w7~#eb&babj7dn.^z7:fMdnwdGn^rHfهr'1sm}wZn^w }[ mS?!bjHa& w5&wr'oZ}7m1#/Gk||PηxĦyiwoft= 9) +oH{k8ʧvl7j)Tjfr@wuӗA}ԗA'x'gǃioXȋHTli 9jtphgD 9l|sriy6qyVzr`Ɠ yA{V1yǐHt0p9fz(/98dI :IدjH뒓tBH9ZZ I=x)oL'pu0{5X q ɟj27ɩ>gV> Y+jxJXO9:Gx y[8eGovokuʌyɎ ثE R8lnx!JwY=+K:{oo׷ \I检kIʃz;܋Ηfh80jLJw*;9Om1ٶ(4:6Z: *48 lO< ؕ8&=t zM 6_z QɎ؝|"}v{_.*˴r;O.0˘K2gD^ోo*r^<;{3(롦*õDZ'kt ~oJv›.-ג2Kd َNJԲx Rm=Kzt ̤֫A7j{zn{˛Ȟ{9LvZ|)+(kFw K 0c۱Bז籫p7d,'L!jFje;Vq˸;욡KiXO-!ʧxnkկy`_z9kKo xaٲf%C֬YCTL̙Ä:$#`<;&1)Q:- R| S͙9Arb)Y̙Jћ,)I@jj%ˠ<"-;wi4UPiբUWP}[TdY bTR4eVQ[ҙam\Yxg lƐꥉ3t͚dܹYlNja(a>(Q?'^qɕ/gsѥO^uٵoLWWuOd7nkNXdۀcU[^Nx[{`pgw܀3auMc1yVOK6dSVye[.by4hcxc ؂uٜ{ WX%Yu Ҥ?v85hu#]j9#d6#=hS5ԵuK?}nm;no\;;gw𚑶Yq r>X?I3yft|vkvs}cUqp#޼יWq`y[f_|x[\ӳw>e3ژyV|W}ۏɏon! /HfE@cVx7\ol 㔩taS;." $+Yyk@gSTF9GH)C_e-*dV$ +@0֓Z(Q+k2IJьNtYAK,|#KezΜ?it'8aTYІVj|?O:х A{U_b /(&4m3gEId]F;\hn@[N5laa*So":nw] UA,;9SVeo{È VDh"i6V#np{QgTxmDNW=u jwߕNaX,R=^X+,YK_[|!kl߮ƸyZb4kp` tY Sn`ذ.|So䴧Y^Βc&s`|lgG&qd~U2%0ZQ@vp:QTv0|Θtٽs*^zE*SiPZԓ*_USԹUgx|&L׍}Q@ԅleodÎ){`g&Q9jlg[N} :VK2q!_2d7\\R޾.@he4mvu1LWGU*pl^sAIn]Nԕoxhm|p%r? l ;xTla Jy;ϲd Squ=q']Pd~HVr$aZҬ mZ-\^Unu׈NXOyaTr/K{[xtr-E-J䗧EܗcT9ehq˙LS5]z؛ё}-c uVwx< r65u.H'R3"9>{J2q}{'o/.#ˬB/BADB̔I+\̻({DR&[&ǣE+xJܫ ",Ӳ)))CjB{*D\E]Ԏ㫫(0\+e¼Ddܨ]s::+<#'*SEq0;(@@Ew|GxIcbH*hJkl4~\v3)Z&5ٺ-ʦlR)n¦ 'p)cJ'G#ɑ,ID$JRI>ZɖDDɘLI>DDxlI JR$ZDJZI|JlJlJJO vI 7<##K F#WuU֌V@%51 mU&OTt$eSe8 ՖZYi q፜כLh* DԼ[84K',@ԈyX$PMZXX[>u'뾠 >zَXk[ CԗVSCS;]ڇ}JBXY͚،KbT'٦u'ZSXZ YB3m)(Q9[]X=vmlT=ِ%1cZŽm[ۿ%ܬ]ZُH5ٓ2Yp >5t 1=Q[Z[ۗE\e]\=|[\[M\] ^]\j;O1W=QeQi ^^ηI0=]ԭ/oRʒrsc2*e_+3G//ZMpJBX$ټߺM*e8 $sJbRN.-9-ҟ#,9f>q2㩠TUiѢau!Pp8AA0@a+AauuJx_ቬ` H4F 8ch:+X>c8c6~cGfc `4 $`='dé,cHF's2ٺUE,J5F~,6+=c?=[c\_f:Bc>:Vfe&!(dnX^Vi&d~陎inic""j5>cǒ4.01n.Չ4d/T\p,>cp;r9U\N:M)X"pNj0cfik&div&>"X9&i&hl0l^gm~v~k f.gt. 0rx.^Xy'xPh`h9~€[^x蹀 TiSJP_rVc.X&&novo jojh2:!.J6;]oU `c.4)/j>o"`lG^qwVqf6o&pЁ]q9 !+,::<6^pp`vRbRr U!ў7ib ` ϰ uh pXnV fEYMht0 ?t rB:rr):4Fǹ$ʝ6N󼛶MYM$L–/Ht o5 D'wYN_:n]Iwtq`q'v/v`o i?nNKtm7,-߀-r^uaa0ws/iZ)i XwOfiGy;A\T'/LCn雎i&[Fz_m`vԧ7&ia.ddNd钮'j8N:+ meL PÅ4DDЕ!C Ab:n%̕Œ!Y%JA \}**((@1mjT( UTZAzW UvִYJe5jӢxVg.޼z/.l0Ċ3n1Ȓ' ̙g" hҥ :ko um7%3+!ڿ MPzthۤG^gΛ3{֮3!گXZFo78\ط3x$}ZC¢AivkEXj fm]imwNzqYsl#Rz&-4$+b̑1%i'9U'PT\ra#QH5[WV8UW]ške&o C\EE}' :(z_Pу颚2" Pnz76QB)ЩdЪ[pˉz[E )k+zMC44:i&BfV@k:}Cˁk\2kr+k:dqKAlmVɗk6mnJ,ӑIJMMe%!$FY) 5]2 T_ZETYEf/ST03 O̥A?)rvՅ(I+4M;4ԕj1?TԿ]^dj!ع)p"BGPBXPmkX* +[ 3 QlkU7ZRGʭ;Ơw kr+qׁ۬g K듖wƊu ͭE6p}qL34!Ie}g/R*+L ( Pȶf5:Q;,LQ#|)Lc*әT%NqzDHp4)RA$ijF(LS>HIs#:Hgr:v>HH Tr n*\9d@ȬfT1bևLdH 7&R!bU RwT"r ĕ*OQTֵA a1Xf稢@vVU<=RG|؁m0P}{gp)^Ce1Kܯ]9SYt]h+nIҴ=/zKI@u$M)R`HCC OQ3sʞCJjFldjv$`ش4ۿB)<zl[ SAC펴F#M #jt*.$@M is C Xfêm+iKژ@Npc7<;en Pf61mP:O!T~&gIk.XR]RF17},:./`Щu׼DWգ.]LG$ܽ99yn q~7w.q|+G r3>En ZX<][^/=~x{ ws{4d^}E椑Q@)e'>yS'oݷ=oeϾ_/_?~?}OK1_ __] ` 1_Ӆ1&$CN$8$d >`y j 2 ` ڠ(`E^ad -E"aQ B`D!I~!!!!!ơ!֡!!!  &5""&". #&M^$N$V"% &~%Z$f'~^!>b"mb) +b+"#Ƣ,΢vb*&b}i}IK1#2"c%e KQKdU9#0cN\`p*r-^M2^yc#6_7c6-#L$ɑ؄AF"Ya#CU[!E^ IF?r >c8c_^C6H-c81$82LB텤SSRDT2=~C$//)ɴMMAQ@cV^D2"%DOQ5jAJeS$6%_B%%>e;a&b*1:#XbLP2iVڣQ׽deJޤLRe/rM8&i?Υ?&]PP4&?d1ʞ9!=B5Jne]_eR^&#Nx&Lg/2eqJsH&tN'u:FJG"ej\2eIyxιMĜi}c~gXҋRL&wu&y"ޭ~&(PLqmA]I(.qޅj("qVhN')ʊ)@U؅F̗Ȑ%XtDdW)Ű INv/I\mPD )[~~HlVn  AҖkRAOj#+~!{m@sIZ7qĎ YiXAV=^u,hǬ jꗲ k+U)maiQdlF|3闆vdMdI֗,+[,uնV@nqS40DP EQp_R'N0OQX:jXLKfDˆPK jFh P΃D <(*dQVTټ C$5p R51 à4J-jʮd6Tnͮ1@Qn/h[tH \DƙOМ>/MJ|NZMt SmK<ʃ` oG\kTJxoxฒ0qBHMxCΧHnk| ?"O`S+MK[FZ okoAB- ! F-oB ߰LD 7UFY)J^M ě6JPUPI(YlGȗKڒ Mȶ,l0u[mFQURɰM_En<1 ;LN}V54Q+qi!W#YqEEA"q֒2)g% QeВ*Q!1VGzp ӦRpr.PBXz`Hǒ1s\۰MJlMP0mЇilȇF Ȏ؍=ـQ툲8;Pxl/})wǸu-HmQPP5Ö`#BBDOeՁGvhr)}Fꐍ- @D.)0ˊ ƭ҈b5u,Yc-F[yLӍF >Ou 'R"L@Fw"-tu$E^ww$xyMAP!nG796}mPl|,i iq[sDVGt8yoQR~=JK#e08$בϼ0ILK}xww1)u/lDpʛM̆=-` ŤݸfKnm(?Y;j@؁ʷ;Ho8nרzyˌmԲEv՚@4rQ^G^9&E8zapR<t t p,Ey46񷖻w P!Є.j\>p9^;3/K˸60f1[S"cd-o#C5xy-\Ĉr;Iix~ljFu2PSYY;zT5U]| Vq"F'ɀD<[a4Ql=ʏ&ɇn`YsR}D@I5hЛ})+%#Cr];KOh}w{1*j^UjVjQ ˮHx_d^EDۡ)pVEĮW+']|Bn@ɽ 8v}ǗAA) D6#>c&U"DV1Q4ڴ*n(`$hP`02\ذ >LHрlp dHW\ +YSJ+KTr?3eΤgN;yhPC5ziRK6ujTSVzkIhj+X\~58hCe _ĕ%{/YK,mwR[溕pa‹E< rd!Ӣ|s|95thŖI'F\4IY8Pe[.Ty;noQ M 62I9cf~{v۹w|xW=y%_Y}'>T?[> AT2d2Z-<4kC 7P&T\]|em|QJ W0$$H$Gӑ*,ܒ.R~\HW2S,47(R,c4#7:<ܓ>@%1\I#BH%m3%MHL5ݔN=)UO|T5RɬDPeZm\³D!?iSB`Y-XEAAdȶk^V([U=5}ѥmO6&Z閚^;k-YqE]O25tRQ_}~!kuzqg9Q^^Yh)\NI>I_q5>$k,12>/Dݕzqꔔ~}ӽ^u~T4lIUq/x= ^WA ^z9olv؀.6vp`ִAM*t]ްf2v(FI:lK"(l '"P(^QR"D/rl`cE2i$[(@aPmpcA]^81;vLy\w5 |$!\C@ApGNҒp|TDAҔE@2#1, p!00yYE'E/IL8F1 f.4@iVs,F+q xg8I[H9*:ѝV f*sTg0Lu<&nMe*$B^AYQ^TYh$ D:zԑ`R#UK2Ot tEJXA.Dr'= Zb,ĦьeTUm2M`4=Ɋ{vl(/EBf7 -Ә$2ׂs'?ΠBTmbLMЅtQY^,e']x hIK !TC&Rp`Gl 6D"nŅ*՜b}*cWيtM'^ŵ6[DV-lm]P{Wţ:U̴$ v gXrHI?A6/~ȅm0N\~K0njJ|l߮6`ċɚ/xb >lMLLM^(l*,4l@\v0XmOGM4흴Kl2h0lІl& 0FlPɽol8.cy'א ?N ؘ Zu!.˳"0bla>brĂʖxӶ,JԪzaн̺ˡq <зO+0|i&sq&AbTF)N+ '{. <$ h FB,* j!I ߬nI)ΩN쬚mM q+ytQ#7z "ID$'I$C$Fr$!I$WjZJ ތ6̆.,o)jL隨*QT@mk r "5-+Ŕ+ͪ n1 xr+8N#R/a_ZQ0gR  {q-DB"\zrұT. 5OT h Q(3*Xv+؈˨93fCC/83f=c@e'&&8Ј2&ccii%fʸ==0'D!(ܓ>Ux3eH9?[oP'@d@%X#@Nd:*j4SBvvTx6Nѥ>HSfʎHݳ[TR'JNf^HpUbgLfTT4@-UN['SQSUuSu5z&`xbx ѨԾr6w3ܮ ŦyRXcoUYdn&JdgUSX%OQoRvuuP3pF3/RL K r3:X^Wf@g6IPUof>(*uBu__Y_&_G%B~k0WŪ6 n58eS6;*#DbC^V-tMODZ5DDCreuV|4"DBCbV,~gOibFrHlk$ҝ(l.23hCUVl)4Ph>oܯ_eVڏʯo<> L/1q2'DqAGDyHkr jk3t"s (lVtGw(&aQ ,Zm38#V74w5 ~xW&xw%ɒ \Nק|@`#l)l@sl/Dg.Bi&ift~/Q!oDhn;h/q!Z*Y`r$[Uҁ[؁Ir!W$, Z˕lk+|. 3Y Ð"7%mTWɶ/%+p-hq8iPJ HʊEjEʂPwcIz4'kk !V< g;CwYl+F0 ,-|FKx"@HY$ 5b\׆P#lΨvT.`+I˼վv}UbGE0TboVoW/y."X=@]Zevr'E'q ۊ(sK8yb 蘓٠U3W/ 8!"L%Oґ< SO+0 ӥd25MtmRQFkGSl ƈB0m.%,feǶ/wpG 8O Z*\1 B195ko@ȬqՇ$cL l@,x kx ;e5!RPo'yl[pu!* ,P< KMo++/k^oMdaD$ 46JdoG t!9$V.N+-"pn#l5K%)/ug6Md9 Kr],ku4ۿ4טOIIE[>HP.+ى,oYv1, w|K"cđPo7OFLkdA%d(v ȿ^H+?KCK˙CK,+Ӹ2B⬆<sP2OBd\4Wŷhz4%]VD;N(dYQ-HvITn,3_a;MTNDz`6SJ.U(Ia_$7YTsF.uT_V`R:u};oXK M3NJQمJT`̟ՔuRɇDrjyR"d(a $*!„b%#1Ɖ#rȐ;1JN>|iL3kҜ2Ν<{ 4СD=4ҥL:} 5ԩT>8 Ivuʚ=lhvX^+!`i5Ǝ  ` .lbPm[Cɑ'f#%{oh~'W>ٳDo /?;mwȼSs <ċ?<̭Vʊ:W^p[;ܻ~ˣ5FkME~/l 3h%_O{_ wYԒ{EXbh$A8Cma~b"HREGt]b1.f7vi݈ޠˋM$> 8k%,yiXReZ^ɛiF5XeQdRGNu [ 5SdUbzg~ (s\bX'΋HˡNJi2)*(@d:sY\k9kgY ]6)ٮPlMnFK2گdi lTwgҺg$kGhn$ff]/v=ꋯUբ-:]hқoe zVa+ !dc8Fr(&r/2ˡbr2 (X(9\='35l 4R˩,4 4 RG'[2VsF u}t6lFی8 v43voz,RNx$gyvHNcUݽu'9d0z7x;  "`vk/ݲ|Ǩ/[Ͽh5c%{^yex|4.?ޯa<-o~s@P|;_+dyo<(F+8X?A} t36uB(J]d D]hףVzE81X#+ {!p@ZqtםpxvA-l`S˚ڇZODF2<9@ :ի Ec*|ZPB0zhGyeos\2`.)X=dGhAgJ!\_X-/cCh%%c"}#t5@hLx=|3/Q 6=*h`.2.66F@q$EFjŢF:ԙnrxb@pl5CvIer& AW.ZfPdMfQkSBWk+SY$ "RMjO$\!ZsdVTLjS=ӴY? -=mG|E} v-a52Bml~!Etm#(*GB(iՙr3w  0q[ļ-mZ->5Zz7ДX[`A" R f6SSNqUkxu#dʭ[S^28b^f<_3 A%tv nOnvDFҵџ`i8~tD9|VttrGQ/Nemr睵T.-(\A·hF/Wj v_XkBuiK.! 3YMOsStol fv|/<Q\B? :mh j.lܻc"TEթXse8Y8mp?xͲy2dƬV%{OҸ̝i,Y[뽽nn߼rajF3ƏnZn|_֔3y6DR˿,e JYȞl^TP0#:2`piEq 0U/ 3Y0]&@z!S}DDgM+ws&n~tm7acoTrs](\smFnh^dc5Lփ_sc6Sqfp\[cgV;\JMT_ւw8Dž]ST9 uFP]9##}Q_daFqprVe=c1GP[esFn7W5~C\fƧ6Vg_.|nT1{P'_5˕mLm26nFuEce6d!fu|QrE\g٥~&&ah_苿"/e0 E>9 0eAQ5b F%G&F:Ha3["3G5Zg7|gM/TW`uWcDlR^^Al0sm) U7mlnh_Wen1t/smMx_{BΤ??C䎭p>DtLNǠLLA4=NA%D_ChD5LeDeSA1SS 僘dsfVƗ-7/X )XEj70c5#_Ā,yEWRW:9;m;P vB&Cɔ@I* *JCz LdIƤ=CDY@p*ٟK4bKٳKK=I@`@سIiSM#oOD8`HV\l\BTJ䖽@BjN%Sh?Ct @uzTW"NTWyIDM5$>M|T2Vsmx}h)y2f-~:١>]~C'7~9Jj>a*$r*A,*(J 5X')?Z(*b1v*т-r"s]T6-L"&Â+-u--,^Q[a`mR!᮫ X筭!⚧:giU(2(' ABEB$+ B+(Hh&o&ƚcb$ x 2Q ZBh#h* Ԁzp{!q-&khGIvq"Jzh{/ +"0oȢn1 ocofK!j,o15{18[aF{˷}+XQ[dh#11W+uWAh^7rrB 3*P[: Cve !Q2~˺J+0sgB*ʻѡFhw!`+"AX{ѻ뼯k׋ˮl|4]ŷ|n|o($v\o&$~╞]&S^d]@xD1 1r{edʘx4͵z#`PU~;ukzχ^|Se7\⧩z]~Pe4^2SCvl'1Y56rv\({ldWك82m\^)ѽ($o-um~k3M(mPD%vFde.qeSxd84ag ,4N*CԄIn~g{4nq<,-j~0Enl~}r&X#\%eOU[5ոWO5¼TH`CA~TUSסB4Z vA .mO~W ͖HwU,.2ْ2x=H]M@ML<|u[Kߎxd OL@ &{H&Alcm72o5qN%QEm4KFȞyETDX8bNvS~(/n/w'CuaU}f! 7~@ MӺ~;>XTmnӐ|0PAe@P .앪W-SyF%BJY *& m4pb=AhqKhРϟȀHL3e0Tȑ[A+JdDdGmN++Z>9$/ma$4(>U"\R%?Ydʕ-_ƜYfΝ=ZhҥMFZjӂ?a#XA0͛˵(aؠ *x>xSA D(!ϫLs:ռ}aً]n,&Ӧ|Tsv2Tu1ˆ".cю ?S)&ƛ.Pɤ{Z *1EVk*˭Ġ.r/.V@Ȫ|l;[5+2K-K/3L1K>޺ %p㋡ N ,%#$V$%jK-y bII›"ëp $tRL -OaT=g#(َނAٜByYMil@ڕNZ ѹ#wdTһ:TBORHɣF1͜>1 O*8`&`F5>4yӫ^a8%8߆eI%s'ͬ??#WDz꥜D6E[聾=XP+Ltq]Q/}- Jh&Dkg"Z@ DJ:vRb9vЃaAص`9b'OkE|d<>MmT ]pMj|Pt޳6TJo< +Wmt;lwT09(' [IN btU%DKsEG]pnСAv6"/BzZe-K"/b+(}Nra(E9JRҔA X;'bb 8ŒZUTZ0WDұoz 5>XO|%&M)KD6!s,yaL%Hn6W'JhN!}fT{Mn[PKԩ4vid4e?$V6A_$'Q'EiJU=ql˒}Zeg{IN!dž0&l'( DԻDgt7 q*`$!/]\Φm_A0!G b#ẏѵh[pGD xrvJ iA)Id/)f_K5YvֳqRL8:J]X.ߑՑ!m`Wy;SʥL[ZH <xЌe4Cp;۩\ GuJ_bWnv5`f׻.q˃b#Y9oҨ[xEtUUZ.(O=PD"\>I =o*HEʑD2ݠ@ّFw(v=mZ^ gUbX ]^[p-Q־Uii@HهHBaUn H IVp evr2 gd7P6s\#Q-PQ68O13w!f>'$A GJE9{=#Wmy}``LHz3zZ48lZRTKHOq>bZַ5CfRg 0@ ъw[Vcf$ADybGR<#%oۿSU` /!Ia]=nsV>{]xK\s^wCIdфe.2+"6`$榏V"%m{Z%GPɤFyUr1MUrbrsk4B/QڗHJҞG_^t\B`ԇA} ݲjz̳>Jp}r&CIaw_^l_:ةtv}mDE{R29ѮS'&X>yW\دNrǹ!?[i]*f.&9}Wo?FИI=yb.x~R.!÷~}w_4ZWsJ=j'ad ?1#C9߫$4DTdt @@$A4A\dtA̱;As+QAC?+T<$D>{'(?#!|BkՠB+q$')[!18F*+MÛP?@>2D:.$+LD1\%AR%+ ðz(5qĶz>tBAtW"BHC vx3ah q+rzT{"ڟVmnČ Gq Ǯ%t t%,kGAG%lBvA<'#§A'dDPf #&jy* 覙[E())oɐIʘW0p4dIDIa@=xҤЁ)[gte8uJ|!@ GcJ$jïr #'7X^Pٟ L a@٩J,Jd˶I;;˻Kp'Ù413G2*H3 ǜ vLhӀڮLj4u[0!0LQ@M&7陋Tȡ O&yH T`E4I˻\\WbFQDk'3G" ߢ4N3S34îd@5.dOj4ČLblMTi1(,!)(/*Ef $\D P KKeQQ&zch 4zў`žYLWiŬ/+a̞4=9F9 :B9Ƴ # ;[?sl+|;Ҟ\ҮBVy;Z)<ĸ#˜S?§5DӼB>A@nv>CQ]'P_H;xG'Y|^F.{"UTEe`Vov9ܕlj 7^:K  Gt,AzDg!;ϣnإڌCNo~ a5#G\ N) tTWUt-q+&\:&:2GvTss6G*8'QkͿ~Ɨנɛe#$Z^ țӤG,c1jbj qK Y0 y4 1u"RO#cH]]31BT?M6|.N4,LZLGdE6"uM28\K^q K/ӆd `ELD]\vqEZrsJbx=ZqlHPq)joasX+Qy8G!7jGCEkHҔJ"p`J#o> R<89x݊I[W) NԌ42f N&Wvy\Y>wb8a`7rJR6KJCoz)S0 .h?HvA> I֧>U*qR%B(q"Ŋ/b̨q#ǎ? )r$ɒ&OLr%˖._Œ)s&͚A2j'P6veѢC (ӡ>}0*PB+U*@0zkW ~=vٶ_גl*^uS]JA}RZP!B Lx1ƎC,y2ʖ/cرbxدt3^\So*]rZ4 r-ZV"f-+Yr!@ mikb%7_)KCQle+ NZ$ѵR5aY&΄ ܧ &d @ JЃB@'}DJыMFFO<I$4&5vM'M3,X VXNӟ BOSGTZRDQlXpVIi1`(M%ɯf51H3=ɪh4zN/@z]Լ+`T<]ND=B(k'lW#/=X(yIg]R0F° ;+m_tS&6| ,`׾:mSP0ԲŬg9JzX8{Xdʓmmˋ2]zX+T`AK8ŨgܑrtAZ6P0jEuBP/LI5SbXE7|a*ֽ}K7},0Qj/k c]m\WhӵD% "@# ^^2z 9 :+W]1C_䀲-ŘCh!PCH/>^l %ɒv509MoA|Ŏ9/SJ\7 Š*E^Z$+<,t;,SL)RUwщ~jS 馊YsxMD6R؟ C+`P*լEQm@"#5#_~;\/,' aSP}z3o|7tn*A65"b6k#1NF]GCeꤛ@\?^@ߏw&WZb1Pș@I^jH)9:MpK9L專e}k+o۩w L.ʨYJb|тL7"u5RZmC֐he]UZ@ͷj%{P NŻ®eK^C^$2.b*wx6PZuVlWEj 1b%U[§й_o>~%4C!~tZ[ۑ/΂DK3Sf_'<>XO>󟟛F7~YZ$sI0T 9#%R$:E-W/^!M_S8[-"!u`9IISh ~O$QԅI N8e.e9 vVK=cH,DAIddJJKdȤL$Md HcN$N,d$D$PdQI$ e0SB%SJe P%U6NjQ>#AWeX A⯼bBxXZj ZQ$Q6ReV %dNdMJL L`fKfIX^d\e5u*Jffdrdg$D6,@PʁJʁKjfkAk%K&Kd`fnilM&J&Idnp"pFAiqb埤%2q gbmVgsg^8F+hdyrgpobo¦o&A8@||Lb:1N@c~aai$-aZ"[9ah3r>CFojhAt臾f&lhz艆ALgi&`rnhifi&4&!J&Jo(r*ijh ^r Z(C*d @F甚A(B(&c^)'x'Z*#u..g:iKi 搂`)ha艦&$}gl&"$iʖ'J6yjdU!-i6R!J4OBi*歞ꪋvL苒)hjNcf(,#BBB&dBڪ)0kI&ʁ0hiNv+jsdriNgA2g~Bjr뽮iu2c*Z(r)A lf蓖ꊶL *&|B,~)&N&wb*[ɎvSi!R&h"Q(3Rr"+i"*2jkA*JB$vk&z*i>FVk)hJz*dl4++-Mfh¨B$x).N#NB*lA(:.mlz.jhI֦Bm)d ]Bڷq[ID!]GyF=G1$] /k{j^krѶg}Ƨ'gk>l"pg2B*Ӧ'(~k֨k+q>CzlւkΤR``ji`ji 6&*Z> +Ro֦fmJn?eo^!Vn-کU ]qMUTEU"sgX ,JZUް,p/fm6pFpJoXƧ&871KqG}b#0*n&fd_Ijkj.k1}&'[/t;K171q+*'[ ."Cj$^Cf] ^y'(pkP rY*+eYU=W}բ$0 0 hBuVnqq,22 q q"GjV /&M2mirZlBj k:vs22G3;3C3>S4S1}'#3@c3жq#;Bh1n*&+Zj&`ioGUTAN4r]V9WtȂ0@/QZp,#;LF,_6qQӱV,!s*N,SoC spZ[0Wh3䚭F4Q5[sw15++"4J+4i^A+EϕSyXR 1=vښQZ%t؀]G W6N#r2'ߞihҪ䇒m&mQ(8C"m0Y5n&nRv+CmzhzY3-Z[#sq]7 *nӶv"㺷Amآ6iWkiS+i;$c5v)Y|-ZTE!]ݖE!syH'lɴ`Ow4fVif޴BO6+ ?*SF0$od**Fg2&+t:f5k0*\7¸0-$zkj6dض/屑gyb(tkkMi^b;vc[ޢ@@ATz&GzD*ܢ13grBf-o>AKW11|mq8s`6"2V?$"yvk/R3x*x"tb/rmDb,ꥐON^-d z0yp %,S79覉*eJ[iv+^&U3'+S;}57 0bnjI=1w$oI+lZYf<ǽ&3^.@ømfv_gm*ooV:j|VtH|pR1#̗b9|5Z6T˛qPy_GjD'njh7:?w_*lߨNʸ/`V+f+syY5vHzk)Z[csv {-@"'J(AڴA0‚% E((F)aqFPJPBI K,1RdK*)M3qifO?:hQG&UiSOF:jUWf +TV K b͖%+ *YRimrI#|c{ 6W}BSƌ!G 9d%*MTY,%*zdh39r"&t={6 .P늵]'0pYWCQ޺5hOԾvWԜvr,x\۳An9] ﳎHn2l<ͤPhmhV`FYVVOdzVoՓ{5y55%dٷ)vܻ[[\ /y$ |Zrɾ|߿(G KHI-K4)QJU) BKYʲ +& "e*6rKg 54,N"SGCVNUUe6sԪ3Ugv2c5Z/uSD$IeNE idzRb(XQdba 0Ub% *6b*,T*5*=ېrѕz%”Rög[ְ`_QҦ-p FvCQ!0HQ(Tw^*&$(I+$;ωNQ䢹O$H#Y\jt+`{ -u`mfL#V/# @!ijbzďa1S Θ5`xD d J$3EFʒd)/PrPܓ&okUFEefu3{hV3Ag$ug= pPL@Ѕ6hE/эv!iIOҕ1MiV5& N<jA{ԥ6;LխvUVY\17=./M72( {6l;6A(m9նyIsv_A6 ,wMk[U(j\Wy$H` 0 7xka,n!qk+pa]wgAIAr{f뭛Zַɉr,nd~p `sNKёt[zx yGt? ty׃v^}Z;vwPslQrt _SCD絋O7|x%,-v\@qЕZeֹK[僙]>:0ݎfŌ!!# lȞEߩQ?͠佊xrx7ii˪R/+W~+oyΧ{ַ|3̵v s^w{8YƷ2.}   N&F(%J$K8g/!/T]a0*(H* m_(꾢.+ܐ/#0@ <0ڏ.AV +#p ɰ u,'mِ 0I"Hz,H $H0- gfoH0~mZ Y =A*.-"}pMa+^q-HJ gJNh-1lO s.2ޯ3 aLB1q).-..@I܂H@Ʊ ͢q0rJxr`Nxnnـmm- AAZF!*$8" Ñ+Ą `TsMA!BAP S(( ./P7PPqGIp| 1N,?UDM ;%tB)T+@)"I$ԓBDS=-7/3{/2̜A31/υv~5x*Lb2S(Z@cˎ{oSS01$|O8ت/cǷB/-IIެͬ41A_Oö 38x#H/"PB44qS+I+JO`h*%8A po+VUPH,9qǒɢH8_lюQU4'kO U1OTm\t-]ru]%Wy]vq']G! @! eRF0 _T/T(]O(o1ɹq+yWY^x՗Ww$Q `rq~ G􆽙y} !ؓDz9%*HV$,~Jr$PS(10kwؗv}` .'mZ)D7ңpHTK8یǔc S}4&aRgm`foVTnr}•Q11=1+t,R$W4؈5'Xπؚ79SdI:[BIθQ23RU08ӃYc,;`[4.&K`E[.$S1bBD/j(x{KN֐p۫ϰEHBqoC'RܾܶN͌&uQ%?(8:NJڶwrx#}P V[[J/2C"J0/\f2nOAIsT e(`t{9W2U'H#/R^k)8KRQ;NqZϮM5HIu4U9|G,.2t"oJVs1Ҕ[ׯZTqWSM Q5~&|5.XzV;O>SFhrJh c1}:v4m4E)]u#&Ou62<%;`/gtFwftYڼz`\2h}=sX&8 :捬j4Av&'Zv[eeSxa4_s33ܝ8kwt}jRQ`s}?ԴΌr[}S_hԼA^Vo͌Z pOފ4BEeq>u~y}"9~?^O>{>lm^!, H*\ȰÇ#JHŋ3jȱǏ CII\ҟJ0c| f%8eάϛ=LyѣH*]ʴӧPJJU+uƜPf V*AٳhӪ]6ز2'UKջx˷߿ ,sLÆ+qk KL˔3WϠCܶt^ͺװc˞wm7~q Q w>yrɪ %2͟>lpmETB^Oӫ_OҰ$:{~qZpbl6JHfI]Zڑ5\\E(Vhumoaf|fǕ".[YY :Zxre<@%@DaOb&hU֤LVvPfoV\JMM$.)Ap) (b'Bx'Az&'I碌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸뮼+k&6F+VkZy'v-%n+.vn+>mM~o/ L0DWWg[K$l`C)ʟ' p֌8sKlDTV*e MK 6V[351L $=b{m,ln[5dx-07Q|W &1>L 5ِ?.#S^50cN1wë騧]DxL'N;:]?+ٖSu+v"L:mWovnKw/i'n>ɔykrܤo4k:V}bJ@lk]+(@P̠d @Zd 3xre:Ԧp^^1>jf@ g;tDPÁ@ A&2M"hAKzB;- vMtRέg;_ y:pAd<@>^0zd @!7aH\L"?1j$8UyГ!5֧ѓ:oXP;$YFHݑ}vbfV0eq%Bdw\%?!LJj ܚ#9A P1 (HB.޼#89 _u.[5rvY+`% awdvkh?:FSA;(Ȓ >WLB0jS2ጘ4>Ŧ6i?F8:p}|Cpfc[jH42QpZnر gטySl njU~vܩ8/XNZI\)  ;.*D͖ͱŒL2XA>T}`죖:M٢*ZbXnC+O[Vs;:5Ʃ+S fRg;YWkX-Bܕ2چzYz:[\ZΣ$oe-u$<%an[~q6Pqr^ $ 8}wdovDze_p~ C ^gȻV³)<رxQqOEr*g7}Cx-qdaq!ehZm& #3ZƯF?nMN#%}pƗ/7Ce~Vkb)nqedHM2AIHy2643mJq&pG jRcԠVզEjZ:ֵhK\i-_\.|\ssW >1jS_Dns{۠vA!qgNwn}U-&e d7~{eٗ5,Kꘛ< ]pb+/9ϟ W򖻼V̩KnƜ7_k4 =(OҗaP 6:X7z?fg|y{>gvϭoSk/ƝrSx9;_]CxAkp%+Aܑ[}^x1%01zã=?X G 6 Q OXU8SDSh`\r\](]XahR(^^(VN؄OHQV rohe8ExXLtxt\D`h6D0ІxWJ RQr/Fz/'sh_w+wnvTxXJdrt6r] ͠pȀ< Ӹ Gi ܑ٘CZ\ˊ*gpnHt'<QHj2i5ʲ[+ΘZꃁ {,q{MTiȋP,3˯gKCcLK\|rx.MwQplTJΈ8sLٙ>͍y xQ F  I9, 1JlɘJYD.:(Ze Z )Q{3iGy,Mzl6=)薛)y9o)sG͎Twʚ+`m̸ 4:B 9J۩YM 8_ h͠xꉑmihZYմ-] Zڨ^̊j؅_Fو\C}jty @Z8\#O=:JaLMX kʐ> ` ֓^z{D,bzKޫ@ ڄj$;*7a&+F8+^j+M\X=c|nv"'&oqu}Wyئm( mVD-]zgnn4nMHw]q{~{mŖd,<}$聾b^%}^>@䔝=1^nTq}g{ߌvVޣ5B QYw떞Vwc΁q RzF%lXݣо?Ea/|n8z8z^)0}w`xeѾC3^'q~.ul=µ1:&k?_u0 "_" #?,/$o$OG$_i98g &#9?K?^O]{[s& Riԏ(Oϟ%?_Es#OO_Qo$X`J[PCXQň'>TG!AYI 'aE1eΤYM9uOA%ZQI.ezsQJ5*USnuWaQDYi՞ ٶJpv,Ǻx/ԧe\pשW*L7ӧ.e̙5ogСE<ɕ1RF}ژױOF]:U2߈'c" _ѡ^ԙo*{5СѯWߞ{ϧ_}DMo̵k\ ,0skl*ܭ PJ.@N8Ū;BQ+N,8qFkFs1?{G rHB#T /*Z|B u*ݦJK$D7{!ů{顿ㇾ#yO~ x;vAX  >!PC0@ nAT 'E B2a o0E*xыP(.p'=qSd\BwE,fQ[$62ecY^ ]g`a+kjF-]tޙQ2@w[2 u4 kБETmhGa fc(Ѥ8iK]G] @yG2d.s)KY6NJTK%T.1K]FoBoF::V YժFֳVkdֳm0]k6r{׿1kj&6=" <p>O51 (4PІV5*яTkjƭfUUڲ6gZ})Y[[..ȗHaXa:Sя+>W11M(S/x8Lu\_2?.$zԦEV"ԣ.D1U+tŭVoӚ vY;s׮fkp0\`:Vϑul`=O|f^ֲ0?}vēt-yC6!;E*ϗteYy:}FU|dw\xTr=* 55:9Ә#x(Igѻ'CZm5Y; C\ w;0'YͿ7o*g{>bKR68Qd+}SeZFwJrue ] >x-[2|[w^GlgMkzLZTS߫}W#͍m{[pp/Iy{zq}g2e ?)KRjw%?~ߪkc Rَ UGq _/F;e0-l272/yTր 6:;c"E3 >,rA<>*7[Al1-♾s)sݲ.{-D ‡ /+4? 24Z7zӪ)T†b"1" ,$/;Cl/3pӚ#@0c4@s+F|y,zEFnF(1= ;ӹ>2$@9$?`:w|G> zT1=2B:6`&1B H Cc^KQ뵐!9d6[xH)&cZr& b`dZ8Ih hzI\ZvIɝIB"3z,K>oJʤ(#@R$Cqș@qG;(K3""+<5[5XڸZYVWJS$X ɞS Œ W硤|L,i`""der XI r7'x۴M+=a4rFlTA\NlN":6̙ 9bC| E,9 N"ϕ6Et6ϋy1*Gܹ1)OӹZ^%545vGzP^&1y& ƶ;grP`D+`w'*|gECDN~"QQ85ɓҳ0"5!$MR&e.&'on\o ZqȖ( Si)c1S4MS5]S6]I\6]S9-)%* $] H8БlHJqLq TKAmAA%TO}NP]X T=S=@ BEM%TSEO}SuUTXM [Z _}`[P=I`I8UՙUO=IȄiVO5Ub%cm K WqW:V8։LցvReo%WzW{W||W~WW XX-X=XMX]XmX}XXvmU>UTXÜWou~9YMY]YX݊YٓP E`EՔcYMZ%T {Z]/y=+ +) ,Q+YYɠZVY=ڥ}[}XR۠ 1[ѐ Zٜ ڟe[5\mX=Z11#9݈2x Q\E\?\݀5]I*(yTuh@A?VyBq^'Aq^kq^4K 8] ߽Vm !Z a_x_]_]߄ڏ@3]/k35I@i($=Q:&@,LJ#(چ)6k@  {F-K_~6#[ߔa{9ܙwac2Ib⹝ y(M dP u+0n03:~ KN6܅a8cС9r=2b{2t :1LdPFbYY_I,&R&BI tdp:+eyʙIeQ_9eZ6*! S<,Ŗ .Z42.[z}|{bcfdr&g:Q$u>:|")"("*,e|Aj?^Je B-YA«?+L aO:o&`MD5QrF, ÑFP4~J}i&1gSEdf+qʮL5P+2O*<$BE^D`/E1P3><;7/77gi+Hgs= ~2;%%t4#-&T@꼑&+^5g~+aLq'?e =ouWF?|H*[-D-J2hEufg`Fh-3h+- [D IVqk/+󞽬:qUTXVYew}utOwB9啫2`?>-oʵqẋ40yli/S|HiR oIOoz".R`Dw\cڴ>AeIˡh5CYJ:GdN|"TAf &)}S,iIi2°}R 3ţ(ұvE0=h,yU9kdZȰE2҃FT!Y%)rY3MnVBWNXP]t@7,{͐%I):%09t]׺1u*H=y<(5Is2Q 1xRb&ux΅/S˔SP9O} O~Ld0`AN|(D#LmR~R9$2U #l(JSҕԒIW*әTD-PMsӝ 3)P*T4rC=*R*"51;J}*T*թRV*Vխr+*XzI_zfezinEZR/_zֽurіXvL -R}},dWf +,a 5eR\hђv\HR6r0&GF-nG rVDRUZ&-}l`E9Sc UJnh?!t)tӫ^c?̍ ʹwCE/ >ΰQ3+#̘-.R 7`mmjga 1{zpX”Z..NVkEy+IЮh,e^_,!8TTFA'CV ( Wpe}ə]Gޟ]n.M{Ŷy=ġ q 40ɏbA+h/s:kHآ>{ 4?|a6YS Zs3UGE3,q7zJ8e׾$RU| ,.YxדT. j1|_+a'c"'*< ~wFKHbld8?lE(&+.3Ic2O‹@b8#.S83s8C.򑓜ʛrʡS򙻳67IX_(F)͓&2ꖖHN#/DYI7Ыg*4)j6^wڕt>.?j1=A=P{#ɶ ?)VO$[gQٓ'>C_{l$~ruNH~??m&3‘p#֝/KFauZ@v9B*BZ%V4ּl,J`X} qhO1D蜠2yR|O1(S똠C X瀏@hp5 !j@3!4>5}Ȏ ^ Vad7ŋ_̭xLZ 9-  F59 2yN+`N bS ` ^SX6 !2$a3`blN%v bS1Q~2*!B6  b# zҹR윏,ψP&^Ȓ7ٍ= J5[ɬ D4M=M ʨOǴLX#9O} ¬U!qW^~PޥU44I~a T /\Vm$]VJ `)&B#&`AX[ @fU fF֛LΌ1EI]^&TM4zeQzdK xmHte@c@#eϝ @Qc]tV%rQf1ΰ@YLyĿ䰡!K`Km.&  Aَ#'WK^"ˁ⦮h=aḕpY@'D%0'BbM R_, (`!ַo>f&QL !ʏфb M-Qfyv(_c֎Q/$`L ֘MFI9h:[Fo2'A(ng/dd̏U1:fiK) <8>S~n Z%(X#9PDP{ f- YgR$ HHW*L2!%v#(j56  kRSP!aʣ *< cteۨ-$1]+ЎD#:kN8Ҷ-faӯ,:2,b!)Ύ/K;"gʼʢ$7__Fzأ1.-x֮g%BHLB-T1FR% ^Geݟ$@ِ汇)m~DεjJ؍DhBL$L.NNM! 5_.HiYqnYTK]D.Nez*U,aT }(z~ީޕ ^쭇]oVe詁YM ]o坈ʖ碯ټH-FpNT_D`}~__ U%! pJ0 ?%uTy˧ \u\h  1#µ[ /17?1_qSpљT]1' ~oy1G֝.3kqZ-vr%B2grjafۊ&Z֤~jfe%>aW* 'z[- ""& `'M0@rX,K gD#PU˫gIYXuAcөĎZ j7"<Φd!'sd73@jq2Q6KJ@#3x< j$>s!a5[k;jai0,'̀ 9L: ?, 4Y*βn3ʤ 5^&rbX(䊶lmڎfʔC˲Jlʺ2 |+Jꪐ, b`Ģ.r.J;cbj1Cݩ݌WV'JjJ= εNi1YG̏͝=ʌU|j tbmL[hX6Z/#M5< c3ho[ rF(J*/U*Z֌EjYK\)kqؙЍ qZ#gfcBYeYwo)+HI] M6wkatͺlrڊ^!=Z)[uBo$6u팲KO^ha$n%wxwOZ+Rxc ܭYy93j+4S-tm_*,4, l[!ZfɄ*9L{5/lI(cfXsS pr- vϛb·)Y~n+1 =&$9sw2_gެl@td=Hf4M ='u*0@o) [88=K#f[ {#Vl:Nsg9[ OCeHy6jb'|vNMmrйB50ң39GRGsȊ2Qmbu܍٪߈-3xw7ʹ֒1 C/AKy777(&(%yv׸X̖s8s;s*9;g&<9:3aUcTi_e}VGĤ-9͵3w$"fs2<L!~MU|}ԴT{j/v߼y6|A ?Y=ͣu D㐆gym(ʷYɀz̎UFڶ<;6#QäVr)1œ5}kۙB5u=2 O*/.E3wȇL( S_v(߽љO8}{}z0}+=s n_l}5NbIrTe>X/ ~Uosֽݟ6D(8`^ .ta^yIk!A@Gr, :t!˓6h gΛ!gOCdSI+5-JUzkV[vlXcɖ5{mZkٶun\sֵ{w- ( Iw$ 00ɒÖ9LxWT ,^t=ck &Ne{vkݷaf|p2DO74nqb(5 ^8OR5>$z+0)Jxٷw~|׷~ } η p{1-HCȘ ΀Bv { A<16kAj6ސk-FSq Bn7NB(+o{(*K,o9-[9cx8VK.LM2L1yA@[nHA*F<&Q@RHtSG!45T5[5YUuWuT9QVB(:h2v c Gn(M餕FI=ї'8SW˵T\iLsTJ_M5 jܺkL!u6J]Җe'ȶgThV .Y,sg}g&VkM?b2J*Ϩ=m*^ɧn{*\>&\IA^\סxTx7|g?Rj{/|JZՓyljhDu X@$$*TqV8 +NBL"V 2¬-(Lx@1 i$9yCAXD#ITD'>QXE+^YE/~aXF3iT<7qܑxcxC6dpGJ! DGh,&qSH|rdvTJWbh)G!.qTR"qU"waih/2,=bYMk^i!eh͛T\ܤ6ǹ-XQrp&vYOhI>kvNe 4HA_عɚH'\D-T^TՒQ~T!CxL@lCd#+YA\f5Ks=(vxҢ&R\ xJD;d&󗚈d:̎\g=՜Oxɠ +jRV*V`SeT-ԥL_U䘎d6DV:sD+4u'-qd]a2.- S2Ll&0%+)͊gGZ+ei[[.VQth 9H$"F},êV- f{[^Zgo \^DMF&6l뜇9Y]NH)]Z5_JQ`QҜȊ8oo!dY[!^+$rAVTĵhE-B ej!L $;,ߡ@KZM"(4#[A0wt5ұ59X@iFĢb ;լuyі[{6F8lzT&bOf2F66I%hW$i ݴ]oʞ*bWR-+;mUcZVCV*mcLT$Dz u9~T .c!TDW%+@Mc2SJ>U4cuQF)ЉOkgx;Oc.vyt[R|tpXtݚc3B*&&! hoEhk+:;QEu>^xWx?)_y_9yI_zӟWYz&>{%AeA J`4T>T>OA7D5EESDc4DG>g>oTDotFsATF4DatGCTFHADQ4B[@@+J/4 JtJ tKKKI@?)4HHͣ%M>3?(SB@C%TSOOE4GcE=uESC )?EIsMTQ!=K=A3B?COR P'DQP[PHRPcM ~2|UgT4At>]DL54@K5L53B9X4E#TIHM%2%(DABuOE\_THEOg4Uմ<93u\ADRՔGyT_R;STtT!4XFytMiFU> RW]taQaՀ]O\I3L%XXd5L!4L6CH`]''%$55\IvY4YIV6v<7chEYg@a3@IY6˛?>b%O嘵jA/~QP uVP Xw & UQx~_|uᇠW'2Zugیq#S8wIdBIdFdMP$U9^IsYzPaA%~""82cjf) grIgvމgzy}SٝIZ(&J蛇((NJi^ini~ jJjjjJkފki}kPPeKl쐼ʫR8lNKmFSzm~ nT㞋nn}nrnKoɖ˦ozLp̞& p? q_ _qTj r",mT%4ӯr.*4'1:su c>tJ7F!uKOMuVpR]u^{*ufjݫtncwrM>l=|u x8 x'v/KuI9oιmvL-y馟)( xZtFN{׹:(#9|+SPA>:/|QLOO}[c7h[}~O~柏~~Oߏ p*p l3BpV* RtUp OTI0,la+pw[uFI@#|8 qфf qLPحTYlgVD$d,#Wd';3qY2B81zrǦ=;q|Hpa )R"!,u H*\ȰÇ#JHŋ3jȱǃ72d(STI&IʌIs͚4_dɳ'ϛ6? JѣH*]ʴӧPJuZf %fz2J_Â+,ٳfӢ]-[&U9ݻx˷߿5zSa%&^bFf r\1KȠ=CM(`E;Idkc˞M۸siKWiBgŕE1㵖LtEO IJtv\޵wS#w}z׬:~mw8lx% s;?A. ѻhҒ0YpySp5p^Φ'Be(Lᔜ;aj5Pt64 ACj;Ԙ(D"tPau(D(N4Ʃh\&W95zZUDFGkwlyPQ3#(Bq?E H@Б'IJR5 L`6񔨄 ?VJ́ez%^eы^"K,Vq#.bΘ cOd1~D` 8SؔM%BV"s,9׾r~{`ۢKvOt0{YS> Қ @A$$+1'JpМyȾ5^FqzĨ;Kvbԗd<ϙLA>g5o0i]* d-XBo}G*2Յ5Fя6UKM/yc kI4DhMRjҡ =5+zr,<;7NZ}(1-{W)lprmZ'K١ԍ> ՛cfYsuFjWdL)&Yhf H`6$C嬒XL$8Q0BqlîvtZ2E@d\mիoJsq所K6xH4@9ƀt) tB+y[+[lL8lXYx-qmOKIf%`VkyDӋ.۹E+\emQ2w&r}]b]h<1`y3|k@*Ё4>Jsa0 \6.5P*Խ*lWm{Z7.Zo[}foLՄ@D<$" P^{\p۞uJWAMΖ qy8gzꆜ BjWqXqtDm #hU ޳I1Nȕln[r{RM>.L[iO2H 1Ht[yT!I?:Nj?o5egF69u@íSi9Hғ} vKG[ޣTԿr"zF;pN2a@vC]~o#HG^wE]dxDN<_.Ə=ޑnK cdD3f{1N,6LUxȏ8 }J<+}gNO}_.WIO|d hSeJw8+-ܯWߕF /?c_GحTn6CCI(0ChICvCiC$ vhW6( v&sGn72KGwHXeT 4 38 p9h 6  BF `G7h;6H S VxXZ 0W؅`a(6Cysz+8x0XT ǀyx |؇~ȇp x p Xx 8؇x5HA؉ApTXXF䁚q8yϷvģX xh4H؋;UXcȅb`xδh{7'gX(X؎I8HȄ9?BxxwyMw|wBSG6X@XDh IHU8a(HhlxyetGw&T BӄP،ɏh'&V(Ҹag/ U9HHiǍ4>Kwx{=)Y@Ls>8Sؔ؉uyzɔKO tHaX[IۈvNt92'xo4FlhK:x H9h ꈏɏ`SX[h 0Gy+}x0/옌ɚx؜HʸلsDP V9Iؕ z}wxW zW0|1Y袌ؚB:XYَ>؃;FُNII!xG3OO#Xoґɏ%iuyЏzؔSXQH)2؈]v^fct;C|<ɡD .x(IؙIE[xX6*7ڕ'#w=Yf . 8ojΉ y5((ڑhI駀~0:H+YI9 "y`ڨ'{w-x$Iz$ّЏLY}V8CΤ9mzҐ'j|'Ubֲ%s%C:Zzؚںڭ:Zz蚮꺮ڮ:Zzگ;[{ ۰;[{۱ ";$[&{(*,۲.02(36;%!9; ;۳:@t?'tC{Y7{|pNPxR;}S;{v6Hrq/g`[bK{Z[MjL+nEkf 6`t w[uKv[ vvv ۸y+(8QguA /r뱓>[>;K[ ʧ,*XZ*؁*%ǂe; йK ŋۼ :@X |]h8}c:|`` 컾K[뻾x)h9\v`M?rXwk <`\6{۷Gз#|vf$ * ix8ҫ ; 8\75l\?<"LZGC!؍9+ ~d/2\W7;|?lzk8f̆*lv*ܘrUKvv`>Z]_\Jąvm5y1,;  tv ܷʀ i 'Ȩ5)cwxuG; ˡˡ|¬\̟ʪ+Fw[Ylîp̷0 =[ꢄi Ƞ?Ԁhh8l^,0s<͹ËEMJ(`ZiRJ0J,vIoC +Jzb\i xx:}+~7d}:;^~ >^~ ">$^&~(*,.02>4^6~8:<>@B>D^F~HJLNPR>T^V~XZ\^`b>d^f~hjln-ښjjTJ~^灮}^1z9 :nޗnjϋgzܢ^~ꨞꪾ갎BvؗC}JB#u=]ȿW˚J iWjt}Mv^>fx̮42xYRO@tPB 5PDUtQFuQH#tRJ+RL3tSN;SPCuTRK5TTSUuUV[uUXcuVZkV\suW^{W`vXb5XdUvYfuYhvZjZlv[n[pw\r5\tUw]vu]xw^z^|w_~_x` 6`Vxava#xb+b3xc;cCydK6dSVye[vecyfkfsyg{gzh'QNiFizjj=RzkR(.l@[(JhmK놛n{oֻ#BJl!Ei# BoC(g|ƣ`<'?rӆ9E!x$7ܵMx_wA1kK|60vah8< }.\^oAp!$b83aJ ݆btH8X pah`)(4a9Jst[wG~"?#1v#H !&mG+)A}2~!!-bLZZ4R$JD©Mw\ûxղAlPI&?H@/:P)G NOke׾GN/X0& Nq-LC$ Ⱦ͎,AtkӨ0fA2\dEM*ѯhE'J3ҋl#617gB%jl ޶@xrNFfZ=jWΤz{!\gÕ3M;9z)@j]U4"J[dVC[U7*\JcLFv$!vS-meAͳqU,ޞrZr5]xCv)KK5*5jkI[+o[13{4.wU'H[]f*`E.n/w*M'A}z5o{ PRepݥo}{_Wo_X&p |`'X fp`GXp-|a gXp=aX#&qM|bX+fq]bX3qm|cX;q}c YC&r|d$'YK frd(G?!, H*\ȰÇ#JH"J*iǎ=n)dȓ$Qv\ɲ%ɒ-ʜI͛8sɳϟ@ JLt4iPJJիX:Et$;ٳhӪ]˶۷ V0\pGW/߽~K+p`ˆ&1㨊SEI˹ϠC.]x'Uͺ/(%`7;mk&qÑ'CD%2$ͼУK i땘eW5Ƕ~Z5Pd}2I'Qϟ܌rERxxd` NT^%@A {MS%Eه瑈}Q(,x?hFa7((G#RM# юJYGQGs# .v`&I" M(db@v$|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸=R8,K[%Բ6,WjUQVk,ɶ|MzmrK.+rfҵSQD-ll~K 64 GG' Ћ*e\ 6L,k0WF3LsG"f̱3pàP3H'=t*NGMmv|r覼R`F\v%{FjsG+)ӝ>_< GrҀ#IR~-8S~ܭ*m?2fĹuJMFҽ1H GMMۮ{-1ŠNx{ט7o}dTz:~08wѼn+=xĠ xq.ɫ`K_=;[QWկ\CP ,G91yP' B !GHKNa(M3W3vS`KX^ЂGhA VЉM 1zX PxvQ >F-W4lI(mm/t#0bҶ8@dA1[d`"(D!/]&Vj\7+^926Օk, GUNR[G9ЏL&;vD7.p܏[ʛaf z.7Moxf0>2p,Z,o9r$$pK &<}bOW>IM:󟰊xjnlj6I͉%JzNÜ9FKztC" H4C-vmtd&@g*h~ n/O@+װN @*iˌ⒜OmgkH4 gF}j bMNJ*zR+V̔)6VM -||,>o|bgpR*KtLd쨪9шl$(Z56l^+SW.H8Oy [>3{i͟lhSi!p6w\T.zBACӑ$_#UޕL+r*Kr=̀>3\=]:X~+K" RW1y5ּbF:Ld[d&{ixnKuKϼE7FƓ02-y:Mۆ7\c!vJOP'59#82*.gL^2,u̚Hs1YmfƨéկvAY#3Ǧ<ZNĹ0ѐ.@J%[XyӜ>%m5ĪV?/[3rEB0k9HY͍V}I~69lI/{Ҍ,OB-MrNvMzη~NO;'N[ϸ7{ GN(OW0gN8Ϲw@ЇNHOҗ;PԧN[XϺַ{`NhOpNxϻOO;񐏼'O[ϼ7{GOқOWֻgOϽwOO;ЏO[Ͼ{OOOϿ8Xx ؀8Xx؁ "8$X&x(*,؂.0284X6x8:<؃>@B8DXFxHJL؄NPR8TXVxXZ\؅^`b8dXfxhjl؆npr8tXvxxz|؇~8Xx؈8Xx؉8Xx؊8Xx؋8XxȘʸ،8Xxؘڸ؍8Xx蘎긎؎8Xx؏9Yl5!,k(, A V!KT*!'jXIA Iɓ(S\ɲ˗0cʜIfJ s:7ϟ@e"KѢH&-!04$Wmjʵׯ`2naٞ=6(JmKn[¢+LSH<5È+FpZӪ13qQ,Ϟ`kt(%S]o PMuRŸsޝxT1o˙mFSԄ\"AË ; ej2-M>ԫfJuDހ[c(z詗zQ]$E EZXGp$(\iRHR$آ?*J¢@H"ʍ5RP#8xc&d"@fb(?I$PF)%M3IUN\v`)dihlp)tix|矀zB}b衈&袌" *)x  5 AR3PSbꪘ^ͫ|j뭅j$kE" 6k`:~zJk ) DT*+ۮ~B'ҋk)n 0~Zj*홐X|1Y*qǕ 28kh˭R*(\3< jΊ iGϪqˮKVe)ӽ{Ϋ'`s6ϐB9cLsozĿjڰ.CEinx첅* !}uZ.,5̚Lv(y9)ۜ|]y^⦼ <-b-S; FF=$Yh<#3%TYD/NdANg H9-rh$ ,=\ˌ#ո4L ~3NudK<%fjcVx*YD3dD4aʌf$gRLj?qNU[!e9 u*KhAӖ"}CUzy9&o$3PLs Д5@nzѫ,@Ei?WͫkLb'[&юy$G?QiL*ADˣEbe)ΕȧE7O1,^Ra)(:iZ.[ {+EJn-[YKLu6r(/_"&dD%fʚMUʦJ%%RLť5vS`6I6:vQEǦZTܙu-[k7EHqUb}Xn2u)y]mRMъ(Anp1 w rW&!pJ] W8 gyZn[6L= ^ಗUIPr1zT-f޷AUy, x.^O8B x獯bP^[ !,, Hp$ f0Ç#JHŋ3 TiBǏ'Ip#K\ɲI0EU4ƛ8sܙcɟ@) ((J F^`:T"ɳׯ`!d3e*1S-Ѣm 3WBxIGGT%LFi6N>hG\aP+:ҦӨS+𘶵b5o!wlYnfa⥳/h%&N<$Ӗlc6m3Q%4: >ITsj&ՀSSV%\%$?; ϿJLxNP`( 2I&<Vwe!A!B#wO5,0(4h8<@)DiHnd7?@"ɓRBUR'`C (G"f9) B 6\~GXgiy ̓X'!<35k9gU%_~ 5~mrh ؀ӦdꑨFxg {*+k 3(p2 )8Ko*ર̮8on9V1 (j*k<삳n%rI% "웚N/ؤyĨIbJ溫:V\ B.%W 𿣂 Cm~YN9{gi+"Ȗ›L+P) ʟb(|ey0S q>GТrqi'N 'i - 28C2Г8=wT Š'K-1P,*.*BQc-s 2*84 8;=8'T ydjvouIo-5nbK?@*b3CsXXs<7 @y ғp99jul Z-~( πMBЈNF;ѐ'MJ[Ҙδ7N{ӠGMRԨNWVհgMZָεw^MbNf;ЎMj[ζn{MrN7!,y. 'DT_JHŋ3 Ti8pfMtDr8#)0Ӥt+1I͛8s"0!D>͌$)j!B|P DΫX dӛ:u)j =DtP0dtZر+X!jm kC@ ܺvTe@kFh(8#f[Btrֽ} ,R(5P3:rH'W% й3 qHɻt L?AfIxNpvS @,BD߀G& 6F(Vhf K6($@I#8b ~rd (PeM#t%]/2*q!;桭Ue P\W S K 9dA+E/1O( ?x[Uzzd8We N=JN(s&oUh>@}_Xf$+!GL@bٴAWvӞ Іhf}<sy1'S!,!,[+ HA&4XI`C!HDH0Bƈ Z(铑'o4r+G8o212d2+JH1" $VDQI?PR-鉳F+l$qҙJ4իX"56%a-B$C{  TTϖGԲ"ŚoHJTRFF(]:5%gd^ I] cAO*TOJbXd?,~%%|nl;q\B*vH yB"w4w %^sG{yրm=ITI;hRnC T$>S$l%VQ.$UB&B0n;X + J( 'v!$lbpl1p 4V'}TW@$9h%3@P&EO&RrP] I{L"-Z@]S$XjTC2@4Eݭ"=p2 @B$@MbD+q*Lj&.@D>[Kb@!,!,05U !,V< HU*B #J(_AOR>8dBBJJE&Mj>4S J#@ 52o^HSGmgO?A:5EUX2 ϫU&{iWNKvֈ bԔvUb"5+B*'w%;5 JM7kٝ(R kJ$R3ŦߧŽ|6PO#ګF-()S>ߤXMb)I:?k  ̓UaA^(E@ s-N t%4*1@J(FZ^%%FT +7%]aX!5Opm5V ="a< twp&yQᎈ^=D?$@7&e ibiGh?s Or )T>5 ??4?2GdAVA!mb`I ?SR$f!r D!)x@te.:LV*dO`U+u"X l~Rܬee% =&a?JPiRm\h>U_<!,LF H PaJ#JtȰ? AҨFC诤ɓ3˗𨍜M$w';L~b#ͣoڄ4 P`2Cҫ$lz@ר A&:z-}&zB8 ⥈F״Ԩ]NTgpI<ɪoۮaBDZVJt [$N%G@㽔M{ݽN 6bߧ ~:N  EaZ܋7 Q|AY'Lʼ?smWLpGvmםCwKq9!T bb&&{Z]wWxqAmpTnP}v DYuhARn=5BW ߩb_HsAID )\š^J?ċÜyCN*@3Ɉ`^p E)A$PFk#&YdWamC $dؕTAzHXR`TPA _F+QZkܭF9:"B6$h? O@!,!,!,!,!,!,!,!,!,!, `AH! \Ȑ$lHq-j*UʸQcF3 }TzIR3AK(li Ƶl]ji2T_ؽbmqk3 NQ&M,x}N ou{$ ^e \t6]IXV@d|"'@\jR=A O\?8W- FCJUHB$YGdb33P/AxȍdzaQYz @ ?"Ȓ?h!PVTMVpCA0qAR )#Yh,ã?%iyv(&4@SĵI*a|5@AXDzY[V,%e2"QW%P+! 2M2,cUvIYɨI, (0 _R-O364 Tad,Rm-Up?LiABU2RP%t$ b֝^c)$(s IoqUpA+ġeܠaHEb6S?D$ $ȐFumW <E]q(?6AR©b@$$(Ab+5vIH4b'y")<9'xrI<~{=FeP' ?Y $$#, ]  9e%(` $d& !Tb:E%ݴcX}׹S2!z(E#ƿ\&oRi J;EbT@kb),!,9 H*\Ȱ F}I{m[s x&?J>3gQ:Z]2xi( @)4U^Q҆i(%DjVJC{;ظya%!OE3` TZHӴ/㭏'@?'|Ж&"^@i a% C-8RbB3g!Õ!d4 B%w!AR%PS`'،)?@#%P0$R/HΥdF-P'Ȃ&)d]hZ%sJE=@5JIJ+l2v^[1 (ǜ*ꀂ4hx]xœ%鷒xB%dpYԅJ?K! "B7(ҠP^Q'JFfP\Ux BA aТGa%m+kzY3Q6+w^hq` %B=!,9)%!,6 H+!Çf$I$*Fqyʁ \PR\aǍZȜIذݤۧ+գITMH{C*0,W*ԥS2"QGI jɉ@1VΟom"ɟTi]uiӗg U*LTV'R^R(gfўu 0K1S͝RxJd3g`j2 vԒƪݦB5nT^ŌM_.pڳv8fi[[LQ$C3aV{VApQ2 fb_y)P- V)PcFk;%?C(q 0UQNJ}tH2XAC-Z TxNu,%PPP%V)V|%|/y&B^Xא@F*?9T'VB[ &ej?=iƱj` Q@!,; H TaF(ŋiQ#$ > IƓ'UҸOȜyKPP,RGȻsIѢF1iCJDXPөNRMsISϪ'jDם $MRGHԮVU#lޢT'qƭ;F X O6U)$: 2$˞T:EYJlbMUR"($ش_I#uə?lIA4YԦ yҬO UN=z`e*)M&hM&@'\6? 0&)T9PZPN4_&QZ} WJH,}Le%2 %OG &Z&I 5m%J%uiZKЪڼj9VP8B' wxfs @L")$t}UHbI$Usvm5Pm2Pp%-  AsabAR*2-2RX@U̇w`Uw6Ђ5֋@lr|@dJLfxX\[yU%¥@IP Xe#Uv[Zi B? $ L"m$UҊ@( "%s@(Z% =8b^Ms? @ς' l< lז"LA5 EMRI9 |#gW?R~xZRi&R}l&&4K Cn`Lg`ƕNYY\)dRQ$3T $Q&+qFh12slSB1@VbB3?CTR@!,= HTJ!ŋ2j()?I )œ(UIJO敓Is&QgPfFm(QjĈWozZIڹGb=B  ^~]J-'Ջ 0ґGM w튑zi[Gk.6}NJ/C=W1bRII"\Š2遳n5-?^Фwg{"z큛RyG*{h3~a^ۤ'e}`{ T9gQyr G& 3\ACOuT?,3 A5)A9Řt%չ8?Dmp7gy6A8O(#b F̄sT9b`e2(&ADiFoXuDP&VZaG)BZfQ3F[^H?s YDh.nd$i +LI=$0O?!,; HC J(!AIA #ŏ Iҟ$PRe*u@\X$$#Ls̙5KJѣGpVDWT`*ӂR'P&fzWJ4jQV^-AڤS H]{ԭ_%P!-HH`+`4(w֮RG/eHyw*>Up'5ف: 6V%>Ԏx2֗jo]*XSI6DUx{*cɾ4B%H(0:-z5& DS E C$x 8D $x^.F$PryA'uj4aHC+BɅ"WZGPE?ce4P `¢'ПVq'r?LC /6B!tl*n4DyUmE%1Y"pI< 5(Р +1F']M{BB?!V 5B?s CLhx$I*4?QZXm䏗 &Rx]VF1&p@%Y]%tC(Q| $JXݖ+$)T ƻ[5v;C !Pu"d]=@&,(eA!,. H?I\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɒ$0cʜI͛8siᄝ@ƔpHT(PKPJJիXjʵׯ`ÊKٳhӆ?jj)H =Q!\L42[f$)M)0Ï^Ř1G 369-"$x`34)#G7I'^a籓rTt!.?\a ֯:0a%P% ]#){ k5'4Ԅd5)ea-Ŝ"'=@WG4@HO]@eP%nF$ 3&6@Pu@LGg2f+-N $ t2x$?C{!C]@ @? $A d -‘nɹޒ%?g>?e4& %@iD@]C ]5>_G?x2HИ0AcѢuAҘB1TA?yҎB x-CvaD[ 4&}XjE$P1:$?t%Oo3~pxzX )oE޴SmQ5_~&`TT1tKݱU IJG 04*Hk>ծ"@mS,s?Lk ;A >&EvPBr\@(m+7s^Aݓ? A<а(GpAZk})C'DOp}xDLI.B1BGCɒ.Ccs QU$l'=2}S ?gBlQL)*B 09w\Pr A@9u DCU]%3'@ĺA6*Q@1SM%*f Z4Ȑeo R1xȂc %^&&TwܕidQD1. T-r54{RF_"]Gk?KP‰gR<͈;$Ѵ(B{AZ810d\<ph Arl"(! Ob!E 4&!(4 @ Ȃ. Tp+P@!,r 8$uKC_nqʿJ9Rq$D(I$#W 4pS*eHF UB_L o )CDN3aʵׯ`!,= H TJ!ŋ iH>$ $$(/v\10aJA+5U`r ϟ=Pi'GMbXʔiM5)M>JF4j͡)YB:*&lS'*餬+mS* +S;ƣ?ftjYm]*fAzZiRɧ$IR̈́lI%` @ R"8ԣIny&BM<=d0ͳ1.M.Io-O*eFN_1*<9pb$4ԴUfD}&S(mb|s܇nufD%U2I*PK T Ww ʶSAYm %R&HIƑrBАbCL@ pwE5' D )E@B2'Pr %ˈbfe@㥥BSRCZ@h 8#30B`="\ A#}P%g:T&qTGԞUV'"WqD _cxȪU%UViy btb`Q@e&+nQ qd& @n!,X H*LO` V8_Ņ3j诣Ǐ!Iȍ(Sҟ^4rkʛ8 Y;?*FSΣ7wzԤP2gUJeRP_(zjmر&D1E+y #W'ޞ`\ޏ~RׯŒ=KR+ 7iD]ݖap"RU2IR%ZP UH[ҽm)V]m"4Q\w$qҎ(! TG }R%Hr?kmNQ*cs?,! 7/jRoU!A8P;- $L?i$̋}-(- 0AR %wi3%$Y )͠|MI ')ip x(&U?$&% $EX9?2A @&gB` 4%P0>P%~: 7'8A)˫ Mb+ ^h@3%X_@ ;P J(I̭ (8 #[LTuurI %6qh(&]jS6 I b,2!@ƌҳ[fQtkL61PAH( f*%IZKHP,v1R1*RM7+z4 P2IhĤ{DPԪěBQS_VZժJ:L: )gtѣ3&PIGQ"iXaܡzSN9h4x*OґPVxZ?JIE$lH񢠩i9Gx-Odrj-Nri3"M0*#vT]qivmWѤ3P$})I.ߵfxPf"0Pv|rF~el0rO1LtX $ xrJ 3l!ԀzMRPE ! X t,60A&x+䥔caV%S*#+=r$T'<0XIL([ MbIDB )=B4pxqFya(A|*%Ɉb)BbBY~ "~P`knjA̴'pSqLu4I%AA 'TJ[/`VQn3t$}?XY&&̯&&dC"<&Ipl!,7 H+‡#@$IѠOB*R\cGM艙)F M1aFOj<H24 SԄ}@,bdu)T;J7vP hb?T(e7yEOq5ZP*v6`:*:}6j#C$E@h򏮺DB#C!,> H`%FLHAf̘ $I)xѢISbtDxFb4r들8 T ;L *oFϜH)Lٓ P`B(R IZ'B3U6Te%M;=VV\/[ +vz @ F[2$7 KX 7,2 'g(M{SS`sۥ8AW<1t%i<] gfœ]p$-No閧W6*5?uDBL6$4ilynxf^B M|YD3ܔQ9I (WaOw3&! 1 e4"0tdU%8^kMΐHJ+}Uz$eApeIjHCJ;8nZe4#$JV!$l%^d`Bs =7P)˄ <\MsI6E(* TZlrx4naUUrhP"ˌmE? 0J%ht-QBoa*l?\%`V=}TT2n]FEtADk\YXP}^N Tɻ&P\p?WQ${d??TrqDSgrB!!,9 H%\Xi`C#JGE$eDƌCBHҟr\V%M"c,yQS=&806I2eҴ H"=qG1-VZJbjȊ x,ŗF`=V-O,MZ.%tJV*w俊V#mSŢGiȞ4RgQ:N3xl.]… o)oyҴW-CqCr>x (@R>i`aCf(ljqbnUD{q'@*V$\_uq֕\lF %<3?faT%PWZAA* x:ޥc1n6 (@D?|? Xb,I%UdnU0"AxW<hQq8nS*FАڭRhO*y59ƒTgIt/! 0Bd/8I(8-8boA&j<$A ǙUF%'~AvX;k؉2_4`]Ќ\d?TWb44NGohFdYSFN $e-P@!,2? H$†JHq$H^GC)ռyNDߧ0c~Xџ͛8QEϟ>+F(G2)ȑN,T 1JRMO VTPOR^.{ЦX D{U Lѹt ڵ oT`EM\l%a3Jz*ʃjL ʼnyKhG?gr Zr lh,4on~z"h MBSZ';@[ͽkT)|*l2?tU`@iՂ_4M.bP. hrUwZ rgTq=#JC̀7$QBm0DځU)f5\AgD]#4$ZLܱoFD mB? $X|IQq\n', O}R&yie`OmY_q62+?X(%Ҕ%oEX} t@4f 1%,!O!gADЖ"Kc A%d2Z=jPc95Yla^;!هht*N>]՗grz+g dUQS wٛ5`aFW06 O xk&O ?إH!,8: H T!ÁF7ŋ i$I(@ q$Ɠ9( T=#0cL$8 TYI?~wʄ ?jr*ݹ?&'H:uFR(j DDRZɑX)URMJw,i-mrR%Vy*T{ TPZH(M5IX0#6;O?iR2IR5\< 4@igM瀂MRR9xFbʔyʛY'zL0 TOp*]Ӥ?MXJj%MK+cT ` g=-V@Q'J*JDکIzEJr*)JDA*VߩHs;AO,zHE˚jK+IB?@%$lFH <%J첬+UIthPv(n_UWLa-5 ԒTW\0NUdP&lPOr)%l%Ҕ_Xs1EcF xB?k(J8m8P%h4€RB3J%%T)T% )?$ ALR"%ӼX82E R9 a$A]AuHT$ݏ)+ś.p?8t@ Uqm8DBT瞙7l1 L6=!Cb%uJh-i&JPeNhq'թO+3s 訐N"j@J^l׸q T/9CP/eR?T$sJN,M"L/0~Hvbae 6VI3I*2$ hXmV3+nU,5-ƗU2J%&T @7cɚ$t(]4Nw4&PUX=(!,!,M= HSP`%=LHA3jBGHCZYqIT$c2$͌*0arϞw&j㦌*h4T( f%HJ@u*6Ъ+m*F32rҥOq2m oThN`L&i8OY6PrJ* OR2`(%eeRJF$) PlP=zұ~'Ǯ ɠ*iS>]:$ &RM]͸%ZE70(CzdRKjY~}GZMKh V ?`uWYUr_&,I#K qDT%xI2@ )@n d$N]VjXee)'+ t %U.CWTvb5eQT$y2 Bx d"|0JU !e"PsC` 2Ҝ2M2pSIX%ur@U$Pqm%\B]Oȡ?ɖM1EZM'J/B9"udЙ ?mBU@"dɍɤArf(لTae+%I%"YN1q-HaQoohS%TǴ 6!,!,c2 H&pJJxПŋ-JH 7JHaƌey%cXɢJwܩ<1b)Sя4OXʴHB'bd@IYiS@BRDR[`4}=T)%--;Mտy4+gnSiu)ؠ$%ewJ`eAJlĊ v4Q##p[N7Id׽ Yb7$;m-J& Xp3iMӿ*&5A&!K}Ҕ{j j^L3oL[нC Tcف@g Dυ3$ 2r /`ʳkW n>ξ=SV7@ ׽>ebP3u7Mc&U P@G+TK]% V3FKU&2M8[/h$x?@?uDT,i$Hc('@oLO}dGv%C3@*)qC)!sXD*4t٤\dRA\?  @PIou6$8Pw? 4@0_A)8P%WB 'B̉2Z`Q}$$!~T'TOFɲآ,p~{bTky&Kn%ɦkFp»Knb n2 @,q /T@Vp1bQ>@%JEPVRCb ;c'GIb K\ *Wy3M *)(3 ]̥09Wd$1DeIj̦6kgV6INL:7Rg@ :Iσtş>M`ܧ@K|<;!$!JjVE7K1lҔ!%GGJHԟ4I.޳--})JS8u2cY~bBA6yS;6?R0]Gj4QTZO'ʫz5!,!,!,!,!,!,!,!,/ H*\ȰÇ#JHŋ3jD CIɓ(S\ɲeLI͛8sɳ+JѣH*%AJ+mb@IҫXjʵ+J *]˶۷'"^˷oO~BăR x#K6yI/޽WS +"x0LR3װcE\? wP/X6LZ 6'_ Iewزdk-Yxk)TT>iq26Խ!$t4?-C?u(mfAn4?@W0#~:(f $I{AB0?L5C%Ԁ^2F)eF!5/Pp'D.VYZ@S@fA服SiCsb/'jJONC$ȼqNhs' DN*'G$S靜vjPGl@ɓP) (TMr!jJo!:z rEʫª& I]"$ [եbq$z+.VܖA6 +oC,M7bdI.If $zQU_& >whKQm$&1D,sAbG@->$?=1 PEO?<66Y.{䬻.Z[H>NDX\~_ 췿> O$3g<|۟D6>+Po}Vh b ]p (E)BH_(- @t p,e ]C,C$hQ!8. Ȁ'z@'.r\¿ xp/80'p"0 mNh .5O}/` G}t!yCr+x qE~yD(<1 Vi~ *aX5 ; Riqe#I s .I  !u91T:()8L`"' 0E)ȐIp@61tbFҙN4!MhA0pn?' T,9wcD)(L lLT8$ 8`R<@/`R,_/wF(J:\ d*ʍ %V˄K!Q!C `=8 [Xi 3}QKDIH/vN\cD7j *&80 590(lqI(bu!(vp_Ď⟥0(:LaD,qYpKQU4J<dT#pry JT.*JGO$Wː崖r¼|rAlo))L8b8 F9rm%<"L,E Vk o t-4r XL qczcGG*﷢4ARkc$A>+hA2 O@4IU TugBϤzyѬ TqS k~љ4`bB)@A뗛x[`e.63X\h-Z0òc X@) PGs~ν,jP oD:º--Kr.mV86Q.F`6HuZIP#A>,!OCN t>- T5} NİV :0A)K" \ *Z"z! v0{BX40e !,-qPEq}pkNX Y}M[`ohLJ2T!tϕ<}dT4@v`Yd3wɽʿU ʒfyc<$T,X-n\e= < ]&+.zh/@Ѳm`o@oH L0R\s4ZUܺ׹ĮQosh}ӝnґ]7@ĭD(b p=~ViD7 ˮ1\87׹]ށ 7I5i9AT^ͱZB_C">xs*oBN 5/[4 T 5p `Vr6 -wc 3/w,\7RJ>WdWt|\B5]M[ Z 0" TT,Fn77YKcu!U[R|pvxVp& ְ th 1 `r^8MRdTiEi5Y0=-dNu--`r}` ހ `Fkaz (k7 :r[YGslBK0lƵG@ `|H>&0vtvJ`|>Jnnu/0 A$D pVx~~s7pgtC6DVV VZa sGVx`C&w` [$bTa`Q )fr/zFVk1EXsuT$Ru{Y@K\G7T @ P "d2,TS4c?P&fq@+@U$8k2%e qR8]^utBX pY/PvcM` vx`Ei0nVX%Y0x~(qP L 晟eb.pZcaNkAW s.bi'Z?'>#h\J?7S 07.TsftF>>^:Ru >JmtSf g_&0lyZi @9 0 i0iGxv0mz:` 0pj iU k~u j+yp:*%ZRӪЗ1tG/'  S/5BJ\&%8**cC0W xY~*DPi8~E̳ Z:T~@ eJ~WJ5X1-.C3 Z0 `|2G:ۖKٱ234Tˣ.30ı4%3:8=SS2kQ"/ڒ1m4Ӱ~Qs ,S2B13Q(rnCJe;2H^ lܲn,qt+"Ȇ.K03 SY!qJu! q.mKQ@ [K3syNùM[KhMsil<`>9<0ksE0cP K434:6 CkhT>`)q / c+DSE`:3a<\jgGv` vKZ xнa 54yigF |&G0#``C"ti` ; ca P;=[`q {yW# 9MZ+0Yh40+6d`Dx8 K400zb .L0MΔhXYP `whǘ//VCND@P20L,0P|fx[igiBD-QA! ~MyQ $sHC5` NVɒ*˝/l Ɓ0M46z4 <1 ;༏3.D >ػư:.`:|O`:RԃS ax|b+>` .KE[/?pX30P@{CP94b#Ѫ㼍@ד9[ب3 .0':VYME0~3.@&pj,[Pmk; #pJ:E0I:@+=D\<m] QҀ @ P"  P|  0 Q &@~D`30qy9EƐ"8C \4_"Zj CfcEuZO3NTPHslTF:yX `&w k Ev5kCnNdF7E'sh_vgN`/2!rurjqpc*q"BR8SLQ.b3]eЎ6AFk00bB4i*qPD/%.I> fΓid&V< gQW>w^+L'T~xԃ͞I,T8ȀkZa1< 5pyp!5K .Y~H. g;t,%K"4ՙ0!œoe |@eFaJy}R=0pSl. [&K*KJfNhEҰQ<_8Z麙-0ih M]AɄvI1L~j8S@7J,ԤLHE .ŐQf3 ZyU*&{ĺvDM\ p@' E3&0J \`/EPZAJsaKH61ӚPbFy$v",Pg "+7| 0-Ł xNfrKd*XiH 8LL HD U8498 E\)P4 Jӥ(ą5P%QU|LtTPR,1@#«HD[KREr,@DYjp-؁ XSDAW \,N(@Bmb;D1셯wD&Jc|BS C@/< ; !1ԕՁ RSu"`|IO8M`AhSCRK `D ;Ȁ+d\\h0!$Eoh\"Hx(@ʼn*ʏX$]4bE&!S( X ]9]ȀMAyL dl"12 otMZp w\79nu6eEJGؕoȀ&FS|Ek6æXEaE E Ȏ!^YȀP\v%] >H0DH$ #F\NTƉ~lZЅ+`!i LPIp[嘄TPihp‰O^-L|":@مbEBh4-¨X_PC㏌T"L)@8h l:8PG)A$Ğۈ䷋1`(M"MȜǔ(ldM`Lsd0Ŕu),Tǎx,0fN,錅 ΅LA(m<؄*hy؄.mD #Q S?ߪ.ڷ+SDMTE]TFIpS T}CŘ 'xD+=PHIJ8NmTR- bM]Ԅrм ZNc0Zc 'IZջ ,KE ;SVi=IuKVD 0;p@2Tѩoݏ>b <Y Pc@0xkryJI}ŏ V]X\(4T3]18è&вڏbA(0I!-"چH.2!"`$be 3=I0qHWьYЁ)L@-T P:4xT后@ T[OZu힙ZZۤ=ŗ[}𴂵Y  ܴM \9 ܰeYF۾}qH[ZG-PZܽZ0E"YUM³ILP\^=^浄]|,٢N e]UWPRgZU0BcPi[ 3IHs)DaYxZ0~b$@_Bѩ$Z mq]J T 0–@.t!/7ۀi!D6Uc.q+E9PQ `a}XP-]V IKh{+ȹՐ¤1pqW'`' 1 Ŷxb0RSpj;Wp$<|@/.HWq r%Ǫrhx, 8YDs104 c:i ++,#})EpCzc HoA_9 '` Zaj:U ilx !05 o>ƒAhx#tn4ȹ(!HM]؉es tpij ց!vkp!~ ;>&pު1i9#,Kd"By@h{ M.{>.20gƁ^JlX̉! qHpp6R c!v7@ i`@5- %PpfƘqNrq \ =*]nm@[ #@jG m9ФpL#))NHbd` U 8m#s%3wФ?z"\ I`jƄmMZ2 FX^2Uc~--G#d>à< DxH0igg[( ݼp /"'g]K 猙S%[Xĸ)( ׿{ sq@i!Q@ݹ(0] )Qa4((21 Vqqk1Al@@0)A"C 9ń Ts'9K b`j 3I= \puXcQL #pX2FWXJW8Atf uBI%Z HTaP?hh wSPd f+PeQ+ (T`"%*ZRlKX /#0# ϊnI6#!!(,CeHLiϔ1,$AorQhjQxLcKG!& bDJVuϘea90ú1dѢ,z16!S'ij^䌐: fYg>x(bz`! X&"ٚ@ r:10i|z;v0NXN`7?2*$01hE h! {w1rʺ6Z1G`?")ɸF٢0R iTyOjhN+? +ZآKz.Ƹm(\ bG8V)q, & )Lf)8yN"!Lh0pR-F+G&4CLiYB5ڵj8EKA83S,P#!8"\ BS-X &L 2eiR"&8QaY]$VK P)-`pɓ6R -$(``/PN% H s1T.We0 -Z6(p1=Aj`.zWCVQC)0'`x(df)&F`__YǦIIWWh]]|eI*PJ m6I*lI10G&Yk5]kRY *v\c C#4d5 Eа:܀Gk@ Zbw#>0T2 T`ev[]r=>}cl'94|(q 7x2F#lpN}[Q \x\ CCE@Ȼ@>A"f}iPB OZB}kyʇ=02bzko%p ~b _G3\ `wkoQF`yBHg&0AO0O.L၁}i\e#C$޷ȍ'[(&H (FO[0!}0[…/ $k"`@BThE%Y6 gCƠXc ,o"M<nLîhq) Ѭ@LVՒD3@)\ 9qA p$OAŁ&x6p/1 Dv&M)fQ yMS^u[*T^+*\+,,> O'C (NEO"!@>USsp Gp+(~`R-P"C!F-4WIQa&b+Eҍt4MLXROS\(M 2s@tzԕZm;kF+Y)O[:$@DH~+` Q&6șUR0aD}GX:Vd-&Jt֏c鴕.<5SJ)Md,Va#~6)(kQۧ(Ų11 }kV% ,x+FxyS `fNmAax%'yS k~1Zq> U#}0#,a_F̅'kî$zY&>1S842DZӸOm^@^L[XÕ>Q7V2h d2l 2t68Eq5ˀB`3g#[Eh`LjS%@̸`)QBU7=I Rb!%=*~y!(V I'DTd4\Ѵ.LJ~JGhE_ T|k  G rpmDlS܂]\ Ox4$IV;XKK\ɡwF:q_}IGhv+v@LTvL0u.@\t\˄"pbIwAK, B ]LKK؂ɫ&hxA"F&0: mB(3'æ,2|' )<d|(^.E%@30|-DUB1 P), A'0'BL+'3+X#E[CKnHHWXpB ('&l98.GxSD 0Dx_Js|emGܔH(OBLu9$uX$Gi%BaЂ-v!cl6/o'@D& )4L'(d&¦Pm @[HdVnBP]BA.R3%0)B@x)`:D%:#e[%E.$ՒtK D^.Y< y&,±L)lC ,mH͈hrZ @ xnLLOtJ¬kD IM'B(BjBxdr$ xB,4“݉ 45CBc#rȃm2$3 @&C1$2'%^%%!%8CA+)B[2HM2g3%4dV&N,.fVƈ,Z.pslŘ|D| ⁎dnpQoր.Мqbqh,Zü!\K}܇/\&H+ z(8o0)%`/̉%8' :d,p! ^I R(S^X\-33P7T+)e-x FjjRJ@‹.G¤!& IAV`-č-2X-<8HHvы m<Ї.̶t&gl'B1 +(L* ̫@>JHc+H(B( &, LB.B 2VBA¥~m¨>a$OB/kĆ'*GO H(ENrAZB2d @ YTk8@ |Ì (.,֋,s~)JXBA*QE6CZbxՔJ&P@](%B&MBA-ԭ-*?TYNl49\%h,9 e-bmm˞:RH֔ 5x򪯎D~.bY(>C/aM^릨ſh$pF {D@AxB

B ԙ &C=x38@(0+d 0#(*B80#(#ɡ0XX@) Ҵ'L _b CUt3^ym&l5\',P MJ JNP^%ebx%LP,`1xBBSPB=0nZ@N<D b(m3DÝ KǃN[wZ\D`<4(0j@) u($JtD|.,0@)Z[&|%mړ2Q ň\A7Զ0B}-C j43̂<$Cӈě C29Vc32OujhKɶBeExC1C+v1a.ml L4,C(O'x% Cdpۻpmta=KadPsFfjfK‡/IiӤ#(٠@'R(vJv<>.yyr˙7w\WF']"8ŝSQFm'2*չ]`k4+wvTpq ee|I$PBK2$*|hZdP>"Lv1a$AŖ8Kt$9liJiL]P"%K# r_"  B󀆖Lĩ$ ga!H h袑* #(z20ڃAGY 3yR b\M@.4n.<6PlSIWlػL61=$R .FD/h_1!M)G0M~K"O LP>Т+$%@@ DTV@Ȯj`[q 0foͳ$FL(d'PJuGT=K8BE\o}{'Z$R!{P5{t"TR~3H4NUDzmb0'YrNhvݒLvzs;E>g)$wuy 4D^bdŦ]~F#_Z:<+q.@BSw~'T!?$^#oHA"yBY<&Ix&_`:\l&қkd~̄s=娏b{^"7aӇL~E{kh¿Po.7'"Fi!'(ѥCLUYT<۫DAQh]Mn-"@R J/O2.0"@AJ@m:" oO"(0In/POA9,jkL b#&|)D  HD$n!&!ư "$eZA^tca*̌!B)t^P!2"!ʞ:B(a@IȊ]>N7#"bTCVa 0]aTN0B d `h` b.z;N!`^A6!(A&`fHRa op .0!"4h(H5p!A5e (@>!xq&!7ċA#nańNT$O 랱 I_NʖAHBA$`rLj @QT` h#aLF6ZAL$i$+_~1Mf~$}Bt,:xC$4>A @ ؐ B>.PzoJHzXA` x>f7.p// P0BR(`x Aʎ6 56EfA!HT 82+cs.6 aNa GZ& I0) "ABl)_)^ޅ7\c%TQr>P^4)DR "4~A^Q#$>rM;P s#ɹLbpxsq5SS#6l9Gz!x!X3⼓` !_|R s5S .A" GQ&!AYn$I!*ROn?H>YvZa"@ RB}lA'΄e 7h` l]HD UzT j&qL" ?S=AN! De Đ7&@BX5A`nLnX4#Ј~` @XpH(!wb_h_DThc!ⰁRj{~ M7XU3a7ak hf@W+43΂)!̦A(94!K8dR%Uɸg@C%4J[AbbAIiyw]FU!ʁDnv]#U0eA;Gn^!EAq(L(2'6$$T`S 5< b'`#?Sn.%bjUvr@%A2 ԚX^!{O+A1  Gw31dZ1zWa9TV(ݫw;U7=`FMR.wIwD.6ht~Jy0:`oJ`/ȡgAO iH986|3Q:)N Aaeu]>"@IQ `ġ߿J\jEA<50ĉ+Z1ƍ;r" `Z]P \ZTLz0j4hM2c i6͙G\1DnIQO$(ݢ`)W8 0,H\% H*1G J\XYO$Mʤa@{Bո@UĠ]Ry ĭ[@ tY$^Эi`Tr`)P3cRUYO@DIVwHN#q!$H7,UmRI*qq@UB}aR?d LU$Wu$@I32' *-L48U>d@rE 2S SҠ$XI_@LA'ɌUu/ BR%T'ӘE$d'%7PYR%BAxUL%Ҕ@EF )x2MR 2Ar^-ڑ'Dl%hzv&3%VJI+NV೤ &θ驔-bBXw[!c-nT턵PVJJ<2J)iWj [.%|=(PCΤ+d FdW -X"&PP-B$+| >< Dp\ ˉ2 Q&h (B2,T 0؀&p)*2tgI$1m )8Iw\L̂`=P ̓$Rv.͠+Я4S3ΐQ/Tˤ2_- }vkp8˄W& S)uE/sxg/t M3 Q%Z-/E9WR 4p\DҴK}^ż.8E, /0/t2F2  p= v1 L(m+la T0 M0Z6*N‚DҧJ"]%& 1%DTYJ Hć%(6 P5qP  LP@NZD ( '܄6Qb1"Ic/+pDFHaU&&22*Id&z+GʋZHo#U$HTaID!/Lne,DFH K h$80B rR$}<Fd(L2H;^PD!#b*wI3H̙25+*VԤ7 ps*D- YXrl; xsgGXe|s? PMF3fG JЄ*t%C"tʔfEЌjtә%hrT(VF+Qe2PT(ut<է%4Sz:N>! 2<q6Sg̢0phDSYHi Hm[멳AT Qb4#{ݫY0K|b+F ۔fx" *  ZF0 sȸ$U8-m&-%.,?< 9fKš/GypHVhb܉g?QD'j E~p?BzJ>! i kHJPS^nCV`P"5+@KdH.v2؀12KZ ހQEYbp(aKT-'H3Z"l*=QE/@=(ϊSM'P"{2_Fp[3%J %1׫:L?QxtR%t"(0 -0Rh-0@ IxH-bi6`.iH@`DaJ%1xBD-4E~IbuX$Xnˎߌұ,UnzJ]&[6 jcҵ %RѠ^| 'o bUX dUŠ[(LV F/xE܂@ ,] .$F.dXG%~Z,^O.-8\BU(Nuee-=5o'PҀVVI Qr8,CpF S9/0KJ%Ga.iD1e0L'& `D/*1#" G@5 0,u, d"@J=kO40`V\`ʸ{`rWP+7 zJ0W`v0E@&% ڡHt" ˰xLUjA ^ Mw t!0 x 0 z U 1 0 n&5 q!!;1v~`2Cd T B+xa]]w C `^M ͛Pht|˷y\`& r!0j3+atEW7S}K%R+")}9B zX,&p yy@ *ǐko!)2 CttrN ;.015<,b]w',KKp9du' ) |ȇLL 9 qSH4B$`(4B@yuɢ3gu 7#aS=u5M˵2]rR!8Mm(zKDU2]h$]2\ MP/_ oKf }Xpi)s m'my|ʭ/  Ϫ119 W̩? A#4a Ngz4B-S OFĔpT#C՚D+ ufTmMO <8&3b|PAS;Nmʄ :<ٴ9̈́MnMpzlyuA trur]9-D\өv~+`" sFJПܤwT-!\|!1EϕA07}vp@``DP ՕPjc; 6  ZP[=ΐ A"5 86d Ű ` `Umř5ȇ P!&SG5 F91%J 8 ?(+ usr *R*00 ,_rI W7 p u:B s]` G'r9PTci0ħ7m7 w b{οoұ(5[B U f ` +* s ^NP D@ @\LDP W斐LjRpL~]"r|e @ 8 ?bp.sEk1* Gp 04~PpEEtӥ4I4`yl` @eT QFi㿈'y* q @p ӠU&8~v2B,"ZT uJSzW %U`0T"3gF[X2^Q#>Ԝ0`K*"ح fB SPy%O V>/eOgG8j: 05ىI PEc ܺ6#Pp<]UTU^ŚUV]~]jGap-ZԸ -85JW7li&)U9N9E.LL BPj9$-T*N*D R.? '>%ـB&W̦%W i<O*tխ_Ǟ]v]'jQĨ,KÅSj8`lNfkr <46I xJHn!HT0@RB@61A^PZg.S(2!EJ :VRN An'O;!$H#D2I8dvXhe8"BqJ#Tp&dlL ӋP*83N4dj iA6D)yƙT^CgI HiR9[OB RIUWeUW_n,˒ILW[iETxV&"ԩ&d"HRYu(d7HÆ>FpXL(l>)aL6!X祷^{uW\aW[E[ɬJ`^8 w!ymP)IPLkH %dOF-ҷߋVN<)O.i%՘wgJ,AIݠfinzI>jknlh68l׮j2jM{䳫z>ۛ`VJLBGʕ$d7>{J|$oT(&)!P`ٽtCDaK0G7Mo5AE_e3r3/c%o@61OϠ0+!0#+TKSP%:[) %S - YPYvH2:euaӚåATB{gHy" H@ HJMqP3 h(I8ɂU8w;r9˅O%Xıi瀄a3Jc3EDQ$pgBp2:Ҧ堄q(-vPMp׺ O5R#<8,)1ᄒ0TbsDR`' [ L0XLpc  G50e0>L[H`Ha>`@R@CiibFgXc {@JpJ@ )i!RLvV)1ash>@ SL<ϑRʁP(HP;cHӰo,*,WxYJ'H8i)cNXCŔeWI,) b|\#ШLDZ#jX`Q 8xo/^8]]<_QXs]0QPL@.Ѿ,Ѕ򯼐(ܼ;2\ǂM(d0&CKj+Jת\jTyFU(T<kGBa-1s[0gI]R_iQL.:`YXH@Q.\0*(+„Q Z gt%<hZC)ab'(N$[@d8iJ.~BUc g[KKJE̙㦉Hf qenridiqZX]L* ]5QT"6|, WH(DaScB'HfUšcUOeK+e::+X 9^^ebݧ(/{֑P' f0gc mhd#fء* D[sxV3;е+)PYYH \h>\pe х >6 mڅ](b%U l]M Jvb5)Vpe LIH8Aar:K8;AIrȑX*:tXFh\?4H,{,JH-A(m@Pg0*MP[^Py AOhPȡx8vuل^nW]썷PeGVe-B2n'VȦan`ig8؈5-ft|j<^nY`O9ʵMۄr^fykd{MƸ"zc! %ni9mYտ0 ZbN"]|> pSAyK`H]8.vlHRXՁ=gPF%H9Va UhO|h XO (W I&-MHQ#2O$m8)JZpJ4,TCRjT<),uR%PHr(n[Rm -y!*)0fAʖNW Oh& ^`H/D;Ts8B*4Hiv<`ЖƐ̛l!Oz"VN]1x %%iZʕD3~aiRx(ZTRA'0C":Ȏ )iLsVi1֢~5)Rij01(qr 6x͝n`bAYTO$40T- }0M[T:۱N8=:o$l6Lux''RģdƢHDiS!HQxTp`cg:E(jG@VZ k_-^aoFf1 =0D(m됇ZA3̓V|/iH* 0~U >pW(YB^PB|D&JN0uRA%(FHBDXB* ,]֜aԽ,*'LQ4 M<4Q 1[[(S2N3ț` )[&E,% l`4uaBD )|H)ă j(,"6L04b5x$5QS|°,\2|sxaZ E >i` P@8%`JBX8F#%`[u,Ҝ+u3*} zH{/TEx>IEZCPU0E Q(B)E)@. l@]RLYZDF z@PFz-m3K%POBPa`@}42`MC}bY>W)&̉*B!EhKdWp޽T2UHabOy)XZG}^3pYT8djd BX2JDE;hInTQBœ'&'`l2V++|} i|(6"Qbijriz闂i阒i院i隲iiiiij j"j*2j:BjJRj}b*0QA?)ژ%"/ e^\kRΐBȼѳQB <֪4,$pFI_&2(z6u%RʳAjD iLQ TjH)B'$>_HH¢+7T0ykR(()HF]eTB`lHY(D(SlylDm%(P$llHlFtlUBLaV%Xh"X%0C12m1dž-.-ނm}4+fd2),5U ئvVřmjAB/Hr*$۶_83Pm}`S堞E*ࢗBLE@S LhA.ƗCsVuʗIݚ+YYn-qu^tfnE*.W6$&E@4\*W&,)LBWhnVi!Rn0/Q¸xs!-:`)GYrN--BorI+UU|0,XZA0@?V(p~ewtGU4@LE2pU[Xܚ0 SBEp װU'404p700?QܧAM™;Mu$$ړI1疕oB@ /O ojb'B/q 1FTB.$/$r0LI\TǬ\O*dęB ;py%8CHR;@KBԐ3Lo nKY1HĸV2+)xbA,WL*K0+l%Мm0Kb*-peFcѲZ•q!BAH Ǧ)'T3LQ%%|:E)2Fղ*(Q$ Ӕ@tN( 42_ /#k9S-e@KjA5߲P)eUbmA'h&P+]I't37J?@%OD(.jc@ $%ON kB9V]Up%D1]#T%XooLnS\ Z[I34JWљ]Ö7~N}B9[W]Gv\eWuKep-ĝ$V?^3$F W8DNj\uICPBqLdĉl3`6"kThuFފnJubTr$*l$R I_7QE^U3kaB ,Cw2&CLzv/{W&"xL7 Z\B;8uIB(,S~SUhLA*c'?3E4YV^bE1= /pUd7C+tB`5S&P3C2"J_d=8QM+.[G/7U™Wx`le , Ċ9 o[( q%8s\$&n\AP&XKE 6L%PnARPgO3k@%L1:CLֈ[ =LLKLy C6OaI̧M%I2XxBJ'L6Pjb N5H.^cZ-B/ҵl!=](Te:?$Reh .6ӯm` O'e`CIƉz $)wk%TGU\%\6" N K U-Iq =o_T%PcT/~(]kL`Χ ; \\$8Uݙ>'Ń`.ȂE8Ow~DNu ?B(S?UD\XYup|K@ _A&L( M(lr?N$_FrT8IIAg<ґB,gO?:hQG&UiSQz6!$iH5iJv9Onb@K i$ Xwջo_nrמ (j pcT-8i+Rt %^:=tiӧQ#Raa ]̩Œ5[$TӬJq'Wys;{zJG 3A%q9Ҕ+ERNyHyr@|}?Jv2OD  YM뭙y=Gf(ؔ祙>``e5l髱 cW;&QgJy`s1OTpFe.n Zĕ I+h)柶n >*ĕ(!Awܒes MjGCl\Α6(D7=^Q=Lߙ=pS}C9&)AIkBN;OkKRIф_)Rbi_f PeQ4 J+RHыH4P.KA.3|&B7r)@ Jo5te\1 RxQ`FRhC!"2z CpMdSM?U*8#ALdPoRd%RE+=?*G=>@#ȒdqY B.x 5f4R(A6InRM@eZ؄AKLJU"4H`.Aٓ BaJtKr@Qj4E&P!3ucUeA%K32RIQ0gәCD^ɦQ_yMQIIL E9SIJ$6p4``Uf4gyY.'̱pSFH `ZCR\t$4lg2Rtz "=1D;J -Pfb.%6ʚds$MeqO^)a^"A*+#fgs'sC $=vYi8ŭTdPⅈuE^VԬܱ{ V8 7;WYX^!}Н+@bAsaoXM IvRM+ 9ˀ!,rk9X H*\ȰÇ#JHetǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ LÈ+^̸ǐ#KL˘3k̹ϠCMӨS^ͺװc˞M۸s[XRF]B 共 ' '%*zJ\MoPJދbxʬ*ِ( e 8?d }g `mċHg)<G + RF,m"Ѕ#-T (*T_(J32$J&2Ҟ }"AE4$ F $Q&D2'^ e)Е)h@;8=59P9g3E|ia y"%ψKDwf@&*zUYQMcAt@pDfH PQiFbQb"%?m AnvIÞA¥9BP&&UPm!x@.ciO@V[&"& }@$ $k,l'Gi}nd6' -[  B̠7z GHB T%LX>qυ+t gH8̡w@ H"IO!, ) HÇB*A@ ?JA !, ) HPLÇQDO &?O+A !,rk9X H*\ȰÇ#JHwǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ LÈ+^̸ǐ#KL˘3k̹ϠCMӨS^ͺװc˞M۸sWo-H rY%4%6OQgfsYbO>ư{%+U: |09 zjevh*%P $ YC h@-#P? im[#.?}t4U?$1tCo {'Аi ;5`pQI^VGUlH$e:)dIj)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸뮼+k&6F+Vkfv+k覫+k,l' 7G,Wlgw ,$l(,0,4l8<@-Dfl2 prklrI|Vw`-dmh6pW%($\ƭ|߀.n'O +06!,rk9X H*\ȰÇ#JHetǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ LÈ+^̸ǐ#KL˘3k̹ϠCMӨS^ͺװc˞M۸s㮔7S ᅱ ' 'Ǒ4OIm).nR"( %_7K>M2V S?*%J&`2}A@, }(iu8]0 + Ez0zUDqB4=4:A^}"5 AU_}TAA&!* &6Yp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸뮼+k&6F+Vkfv+k覫+k,l' 7G,Wlgw ,$l(,0,4l8<@-DIJl $n2[fv>m|XM\w`-dmhpZT Rx|߀.n'xœ`Ê2F!, ) HÇB*A@ ?JA !, ) HPLÇQDO &?O+A !,rk9X H*\ȰÇ#JHwǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ LÈ+^̸ǐ#KL˘3k̹ϠCMӨS^ͺװc˞M۸sWo-H rY%4%6OQgfsYbO>ư{%+U: |09 zjevh*%P $ YC h@-#P? im[#.?}t4U?$1tCo {'Аi ;5`pQI^VGUlH$e:)dIj)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸뮼+k&6F+Vkfv+k覫+k,l' 7G,Wlgw ,$l(,0,4l8<@-Dfl2 prklrI|Vw`-dmh6pW%($\ƭ|߀.n'O +06!,rk9X H*\ȰÇ#JHetǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ LÈ+^̸ǐ#KL˘3k̹ϠCMӨS^ͺװc˞M۸s㮔7S ᅱ ' 'Ǒ4OIm).nR"( %_7K>M2V S?*%J&`2}A@, }(iu8]0 + Ez0zUDqB4=4:A^}"5 AU_}TAA&!* &6Yp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸뮼+k&6F+Vkfv+k覫+k,l' 7G,Wlgw ,$l(,0,4l8<@-DIJl $n2[fv>m|XM\w`-dmhpZT Rx|߀.n'xœ`Ê2F!, ) HÇB*A@ ?JA !, ) HPLÇQDO &?O+A !,rk9X H*\ȰÇ#JHwǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ LÈ+^̸ǐ#KL˘3k̹ϠCMӨS^ͺװc˞M۸sWo-H rY%4%6OQgfsYbO>ư{%+U: |09 zjevh*%P $ YC h@-#P? im[#.?}t4U?$1tCo {'Аi ;5`pQI^VGUlH$e:)dIj)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸뮼+k&6F+Vkfv+k覫+k,l' 7G,Wlgw ,$l(,0,4l8<@-Dfl2 prklrI|Vw`-dmh6pW%($\ƭ|߀.n'O +06!,rk9X H*\ȰÇ#JHetǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ LÈ+^̸ǐ#KL˘3k̹ϠCMӨS^ͺװc˞M۸s㮔7S ᅱ ' 'Ǒ4OIm).nR"( %_7K>M2V S?*%J&`2}A@, }(iu8]0 + Ez0zUDqB4=4:A^}"5 AU_}TAA&!* &6Yp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸뮼+k&6F+Vkfv+k覫+k,l' 7G,Wlgw ,$l(,0,4l8<@-DIJl $n2[fv>m|XM\w`-dmhpZT Rx|߀.n'xœ`Ê2F!, ) HÇB*A@ ?JA !, ) HPLÇQDO &?O+A !,rk9X H*\ȰÇ#JHwǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ LÈ+^̸ǐ#KL˘3k̹ϠCMӨS^ͺװc˞M۸sWo-H rY%4%6OQgfsYbO>ư{%+U: |09 zjevh*%P $ YC h@-#P? im[#.?}t4U?$1tCo {'Аi ;5`pQI^VGUlH$e:)dIj)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸뮼+k&6F+Vkfv+k覫+k,l' 7G,Wlgw ,$l(,0,4l8<@-Dfl2 prklrI|Vw`-dmh6pW%($\ƭ|߀.n'O +06!,rk9X H*\ȰÇ#JHetǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ LÈ+^̸ǐ#KL˘3k̹ϠCMӨS^ͺװc˞M۸s㮔7S ᅱ ' 'Ǒ4OIm).nR"( %_7K>M2V S?*%J&`2}A@, }(iu8]0 + Ez0zUDqB4=4:A^}"5 AU_}TAA&!* &6Yp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸뮼+k&6F+Vkfv+k覫+k,l' 7G,Wlgw ,$l(,0,4l8<@-DIJl $n2[fv>m|XM\w`-dmhpZT Rx|߀.n'xœ`Ê2F!, ) HÇB*A@ ?JA !, ) HPLÇQDO &?O+A !,rk9X H*\ȰÇ#JHwǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ LÈ+^̸ǐ#KL˘3k̹ϠCMӨS^ͺװc˞M۸sWo-H rY%4%6OQgfsYbO>ư{%+U: |09 zjevh*%P $ YC h@-#P? im[#.?}t4U?$1tCo {'Аi ;5`pQI^VGUlH$e:)dIj)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸뮼+k&6F+Vkfv+k覫+k,l' 7G,Wlgw ,$l(,0,4l8<@-Dfl2 prklrI|Vw`-dmh6pW%($\ƭ|߀.n'O +06!,rk9X H*\ȰÇ#JHetǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ LÈ+^̸ǐ#KL˘3k̹ϠCMӨS^ͺװc˞M۸s㮔7S ᅱ ' 'Ǒ4OIm).nR"( %_7K>M2V S?*%J&`2}A@, }(iu8]0 + Ez0zUDqB4=4:A^}"5 AU_}TAA&!* &6Yp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸뮼+k&6F+Vkfv+k覫+k,l' 7G,Wlgw ,$l(,0,4l8<@-DIJl $n2[fv>m|XM\w`-dmhpZT Rx|߀.n'xœ`Ê2F!, ) HÇB*A@ ?JA !, ) HPLÇQDO &?O+A !,rk9X H*\ȰÇ#JHwǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ LÈ+^̸ǐ#KL˘3k̹ϠCMӨS^ͺװc˞M۸sWo-H rY%4%6OQgfsYbO>ư{%+U: |09 zjevh*%P $ YC h@-#P? im[#.?}t4U?$1tCo {'Аi ;5`pQI^VGUlH$e:)dIj)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸뮼+k&6F+Vkfv+k覫+k,l' 7G,Wlgw ,$l(,0,4l8<@-Dfl2 prklrI|Vw`-dmh6pW%($\ƭ|߀.n'O +06!,rk9X H*\ȰÇ#JHetǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ LÈ+^̸ǐ#KL˘3k̹ϠCMӨS^ͺװc˞M۸s㮔7S ᅱ ' 'Ǒ4OIm).nR"( %_7K>M2V S?*%J&`2}A@, }(iu8]0 + Ez0zUDqB4=4:A^}"5 AU_}TAA&!* &6Yp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸뮼+k&6F+Vkfv+k覫+k,l' 7G,Wlgw ,$l(,0,4l8<@-DIJl $n2[fv>m|XM\w`-dmhpZT Rx|߀.n'xœ`Ê2F!, ) HÇB*A@ ?JA !, ) HPLÇQDO &?O+A !,rk9X H*\ȰÇ#JHwǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ LÈ+^̸ǐ#KL˘3k̹ϠCMӨS^ͺװc˞M۸sWo-H rY%4%6OQgfsYbO>ư{%+U: |09 zjevh*%P $ YC h@-#P? im[#.?}t4U?$1tCo {'Аi ;5`pQI^VGUlH$e:)dIj)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸뮼+k&6F+Vkfv+k覫+k,l' 7G,Wlgw ,$l(,0,4l8<@-Dfl2 prklrI|Vw`-dmh6pW%($\ƭ|߀.n'O +06!,rk9X H*\ȰÇ#JHetǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ LÈ+^̸ǐ#KL˘3k̹ϠCMӨS^ͺװc˞M۸s㮔7S ᅱ ' 'Ǒ4OIm).nR"( %_7K>M2V S?*%J&`2}A@, }(iu8]0 + Ez0zUDqB4=4:A^}"5 AU_}TAA&!* &6Yp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸뮼+k&6F+Vkfv+k覫+k,l' 7G,Wlgw ,$l(,0,4l8<@-DIJl $n2[fv>m|XM\w`-dmhpZT Rx|߀.n'xœ`Ê2F!, ) HÇB*A@ ?JA !, ) HPLÇQDO &?O+A !,rk9X H*\ȰÇ#JHwǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ LÈ+^̸ǐ#KL˘3k̹ϠCMӨS^ͺװc˞M۸sWo-H rY%4%6OQgfsYbO>ư{%+U: |09 zjevh*%P $ YC h@-#P? im[#.?}t4U?$1tCo {'Аi ;5`pQI^VGUlH$e:)dIj)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸뮼+k&6F+Vkfv+k覫+k,l' 7G,Wlgw ,$l(,0,4l8<@-Dfl2 prklrI|Vw`-dmh6pW%($\ƭ|߀.n'O +06!,rk9X H*\ȰÇ#JHetǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ LÈ+^̸ǐ#KL˘3k̹ϠCMӨS^ͺװc˞M۸s㮔7S ᅱ ' 'Ǒ4OIm).nR"( %_7K>M2V S?*%J&`2}A@, }(iu8]0 + Ez0zUDqB4=4:A^}"5 AU_}TAA&!* &6Yp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸뮼+k&6F+Vkfv+k覫+k,l' 7G,Wlgw ,$l(,0,4l8<@-DIJl $n2[fv>m|XM\w`-dmhpZT Rx|߀.n'xœ`Ê2F!,rk9X H*\ȰÇ#JHwǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ LÈ+^̸ǐ#KL˘3k̹ϠCMӨS^ͺװc˞M۸sWo-H rY%4%6OQgfsYbO>ư{%+U: |09 zjevh*%P $ YC h@-#P? im[#.?}t4U?$1tCo {'Аi ;5`pQI^VGUlH$e:)dIj)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸뮼+k&6F+Vkfv+k覫+k,l' 7G,Wlgw ,$l(,0,4l8<@-Dfl2 prklrI|Vw`-dmh6pW%($\ƭ|߀.n'O +06!,+ H*\ȰÇHAN(p#Ǐ CIɓ(S\re -cʜIi6sɳϟ#%K 0#P*]rҿ3LfՃQJS:P&huV!նpWR{0?^ K6߿ArR 1IR u5JiJ攠Ǡ׷V)] @U`va%wE`0b uV + Vܶv?ՃS>ny=ZwOϿ(h& 6F(Z4WR!fCs׆.CA# 8c2@$ˌ B?T 3PFUQEduݑHJQB!,rk9X H*\ȰÇ#JHetǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ LÈ+^̸ǐ#KL˘3k̹ϠCMӨS^ͺװc˞M۸s[XRF]B 共 ' '%*zJ\MoPJދbxʬ*ِ( e 8?d }g `mċHg)<G + RF,m"Ѕ#-T (*T_(J32$J&2Ҟ }"AE4$ F $Q&D2'^ e)Е)h@;8=59P9g3E|ia y"%ψKDwf@&*zUYQMcAt@pDfH PQiFbQb"%?m AnvIÞA¥9BP&&UPm!x@.ciO@V[&"& }@$ $k,l'Gi}nd6' -[  B̠7z GHB T%LX>qυ+t gH8̡w@ H"IO!, ) HÇB*A@ ?JA !, ) HPLÇQDO &?O+A !,rk9X H*\ȰÇ#JHwǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ LÈ+^̸ǐ#KL˘3k̹ϠCMӨS^ͺװc˞M۸sWo-H rY%4%6OQgfsYbO>ư{%+U: |09 zjevh*%P $ YC h@-#P? im[#.?}t4U?$1tCo {'Аi ;5`pQI^VGUlH$e:)dIj)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸뮼+k&6F+Vkfv+k覫+k,l' 7G,Wlgw ,$l(,0,4l8<@-Dfl2 prklrI|Vw`-dmh6pW%($\ƭ|߀.n'O +06!,rk9X H*\ȰÇ#JHetǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ LÈ+^̸ǐ#KL˘3k̹ϠCMӨS^ͺװc˞M۸s㮔7S ᅱ ' 'Ǒ4OIm).nR"( %_7K>M2V S?*%J&`2}A@, }(iu8]0 + Ez0zUDqB4=4:A^}"5 AU_}TAA&!* &6Yp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸뮼+k&6F+Vkfv+k覫+k,l' 7G,Wlgw ,$l(,0,4l8<@-DIJl $n2[fv>m|XM\w`-dmhpZT Rx|߀.n'xœ`Ê2F!, ) HÇB*A@ ?JA !, ) HPLÇQDO &?O+A !,rk9X H*\ȰÇ#JHwǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ LÈ+^̸ǐ#KL˘3k̹ϠCMӨS^ͺװc˞M۸sWo-H rY%4%6OQgfsYbO>ư{%+U: |09 zjevh*%P $ YC h@-#P? im[#.?}t4U?$1tCo {'Аi ;5`pQI^VGUlH$e:)dIj)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸뮼+k&6F+Vkfv+k覫+k,l' 7G,Wlgw ,$l(,0,4l8<@-Dfl2 prklrI|Vw`-dmh6pW%($\ƭ|߀.n'O +06!,rk9X H*\ȰÇ#JHetǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ LÈ+^̸ǐ#KL˘3k̹ϠCMӨS^ͺװc˞M۸s㮔7S ᅱ ' 'Ǒ4OIm).nR"( %_7K>M2V S?*%J&`2}A@, }(iu8]0 + Ez0zUDqB4=4:A^}"5 AU_}TAA&!* &6Yp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸뮼+k&6F+Vkfv+k覫+k,l' 7G,Wlgw ,$l(,0,4l8<@-DIJl $n2[fv>m|XM\w`-dmhpZT Rx|߀.n'xœ`Ê2F!, ) HÇB*A@ ?JA !, ) HPLÇQDO &?O+A !,rk9X H*\ȰÇ#JHwǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ LÈ+^̸ǐ#KL˘3k̹ϠCMӨS^ͺװc˞M۸sWo-H rY%4%6OQgfsYbO>ư{%+U: |09 zjevh*%P $ YC h@-#P? im[#.?}t4U?$1tCo {'Аi ;5`pQI^VGUlH$e:)dIj)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸뮼+k&6F+Vkfv+k覫+k,l' 7G,Wlgw ,$l(,0,4l8<@-Dfl2 prklrI|Vw`-dmh6pW%($\ƭ|߀.n'O +06!,rk9X H*\ȰÇ#JHetǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ LÈ+^̸ǐ#KL˘3k̹ϠCMӨS^ͺװc˞M۸s㮔7S ᅱ ' 'Ǒ4OIm).nR"( %_7K>M2V S?*%J&`2}A@, }(iu8]0 + Ez0zUDqB4=4:A^}"5 AU_}TAA&!* &6Yp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸뮼+k&6F+Vkfv+k覫+k,l' 7G,Wlgw ,$l(,0,4l8<@-DIJl $n2[fv>m|XM\w`-dmhlp-tmx|߀^$ذ"!,2 'EIEL!:Hŋ3jȱǏ CIɓ(S\ɲ%GI)1nB%Jp(! ˣH*]ʴӧPJ5Y \o:pP`=zrfAыѩpʝKݻxKNpf&02AcBL˘3df`=@cnjiM۸-WoF֍_УKǸ\MR:5gt~ξj4 $ ܫT D s% 6nlLa]G^{5xd(${M! X4hc\ݨ<@)DiH&L6PF)TViXf\v`)di7My3 )љ kpeggS}bpcğU2OLa'9jTI LF)z~R`j$jER*$fI& \( 2)B2ft2Ґ z6H ^mG# 0Z4'y}J*rHfK("I/2Q%  2\쁅 k(hb~!4΄b'($ aC:̳]lEJ -ى0²F̷ Ҍ30)ǜ"]|4ʹ[B**LC-2}'B3Tʐ{&( oE8S(Nt3|@S,FgT'HCrm3dmQl[L̟ @ܲL/r>N3NznDW"[@H-? +@ 3 تxV%<3 58RGlA7E"4? E' M(2&*Y& 7Ms\%ILB8Me4u >>? 3)u" { B)h`ºO846&ʇ!Q dX)x-8 db0C& \T;Jھp7"S_V%`P)V1` `)^3ixAcGXFѼBz%` fLcE> yܦ@"ИĞ -,E;1X,:hZPA37VS39n9Ș(9R:iDfPD2\Gϐ @wi dRa/1ԭ#GH֤%M84 9^*T_ xפWhP#";%:6VCL}@SFq/@Ȁ3P+ZzA-Lx2Ub8ƚD6Ԁ>efrMbnfHjDaZt)+: yCc[QKHk=yqLc@xgTM,fA4P஭3]V\mmR2uـvm"- Ud̅bV&v5 N_8Ӊi D*ZQ|$(8WbS,C8k;ѿ%lx\! * y VO aSi1`cx0 0bRĴ1@H n ^ET I>i@  H)8[FIK[E  솼xGza Ha/9Ew !<S$HSަ bXCv*o>T^z Ql<6%m~y $'@(. 3jr""Y 6QGT D9YQ+QY8fwZm1M960b, 1scģN]s?PN;o@!3(-@/ZT REcE3ƽV!$*6k"*4䂓w]U ƅ$ \ds[&(BoH'm >3|8O#vj+} jAHXC0]/־x<2v РzmRAn Pgb٣z9C 3 Gfiq'#.͢5U5p2p GP~31I\\'-06آq'TbVt<" %Ob({3qS0[+cSS_TV 6A(H<(u),VF,@xV`T1xu<#G{>dXf4pdG 9\[/%_LYW ,d@ uG+C\/<7zY9 Ԇ3l&3u(x^ MW r&GWȓ#JLWĶ)ؖ aIF%_1 73 B%GtԖ7 UrE1*Z5 " D  Ahr;9Ԡ7 V^ v oY }9`EV:`]ZБ4ƒ K D( N`LF*9&90@|y~\X4`6 WA t;w|)i\t`d)镒@{z1koS>_=>q؋W{!`63 ג _*x~5  TdV?(ŠyQ8 @.kr14 2c`F 0G7H5bt/z }1GFp7qR&ExYQ} IZg3%9p P V>p[8p pϠ|X w x L 569Nb .1`Ӑ `XY1u-` Hl3 FHX Ƞj C5 ^ WgԤj405_107w?% uC 9f p 0uGs _s74j5`âEW05#;6C{~uW{ p @ PO MzFQ 0z 4 kz7K6rYtAK4 W*CXW P ű{ 3l5c5H@˳ reXchP6`wɐfȷ PG8+('j2l.vvt B ce H9 @9 )) tA.kHW C `1`e.K " 0`RQc@LIㅿK'hp pm:; '?kR 0`۾` p0`ct @}^}B[ -V ׌z Ck(^Fk` ذ'  @"<]-7~Ar-n] oK7-*c]r72 ]žGFm)F\*!F*t UtyXuǢ:8G**cĭ28*YEjDvśƾ*i&d'Q qc09҂S#ranC 'AyQà @*HC 7F>C/\,ˬp1͡(.huu1c=C' P ɟ,GӁ9z~B%W ss pp4~ʘF(&R>T-l,}'? #"-3m82<=;Ӓ_40"a\F]:'D0P_(/>Pհ[9a&^_pU`=1 OippxY{|uMxOK uBCavpp-L}oVH;.Pڥ>f@|` T 0`= @0`ȉ>P܍` v]ڇf ڽ|Y>p.0Q= `E@4P>@ mڍ` R yMM`VT`~NV@YYpؾR$O Tԝ-V1n-P 4#D D 70@ `i&`h 0㖐 .04n5^\4^i` BM~2P6~hM `505ppƀ {N_ ]▽`,++@~,@$@/V@NV KMo#~n/ ^m6nNm줎n؈2  :@- 0` @O.N &@5` &a `a @Dؾ ? p-@ W> 0@N p@ 0  @/6/=@T+/)+ TYT%$=VP~,LO6b &o % 0I0p`  @ 0&- Dp`wO ?C w? ` O@P>@@& ?o` -0` _pw O @$pM:#$2j]QLۯ;6#E]ҿŽ QyA NEd[2I 3hNFkB`NONfǒQfg A\gSJ , ,-JgXJdY P"˃lU:<a%Z ā- ~5kq+GΓ A.;LNib2bHPد"DZHkC;CCĀ˂[ Pn &k"14-8$VI XT ˨ 1V82@{a="¢Pe_v&`+)N\p)Ф&<8:Aer0ekR&Q@H=)zH՝kv=|@9`1H r[|FZm8W4xODIW*஖ Vȴ0,LD2m; G\\ 8,;T!D2Pt Ȯ@ ZA,rA<DbvN+da I(5p,&G6J ^h- hL_ƈEX_0DR"<%)\Dl=E6 v5bF8j$4#Kc.neTr: &(OL܂̫?WE, "Ǐ|SRƔE (;.ghWJFTv֊LSL4%M" *aBj1řb%⓫ fE;Mpҕe.lYdx#@5v#˥ 0 :j܉$wAe՛uf XCƠ%[:L);]$Ae`@.X2(D {X\,!+a+Yb-ΐE7I0V%8'TIGm5DSZ&@\' 0'Z! 05LHsq@:Рb]Sr,Co'i +:b,VBj3 $`&E" u"R,,6.`WsQ^ $!e (5B3Q e R>hu@ ¹hjIN- \@%!`X Hf5>N\ łG!2B<Nwʵ<{:5td@N#2*dM@a(F<]<<~-F'`9Q5Qff#PpŻ]Q/G9'\iP5Rt`Aӝ\0j~,+EAsvq1 iv]A`}^2]x `0~c /{0)嫋JgH̳yh?+2 <Ҏ!c+H+=z+$6K S,ؙYCX59U XBr"(3đ*T0;YX4]06KL 62o'f`( #\9d~9 SH7c>;к?T6J\D0@A4TCyDt@$H>Za .6e(D*"]pDT3Cé$Z+[;HdM${0:*$FLGghJqLpICQuFOCà 3q8cF1ເHS kHr@X :sˑt# ػ3x0s)0CK>VMӁ4Ch5 GkB:FpΫ[l>h2QaĀIIH<+3+ցIԏAPɁt4蔚dKc ?Kr~[;|<,fp`:<HgP38@Sd0"Ifؔ͂e̓`hQgxi^GxrrI)@04hN.$>V<K.kB HۀiHL(KROZ2? 0աPHRH:M, $L|Pt#ᱞȣrVԅIAąHJId+]$c$$S8 @$/$>;ߣAS0 RLI1$8M U[ ./DxR%OЂ{UJ8#ʬS@%JxT;=ps fOC}d )J -.c>"X!K?!kț+H65@WXUN[Y ",A00%0Xi+'pT'!@=iZy7cSeE+\KɎa 40W{i]8Մ*B ALT'HOۧ!XVS MkŅĉ*Z@em}@(++WeN+QN hPJH3S@PYhY8N@8JVPh`gPP8PNtaVx\PNUP8XI4L  Qe#@P= x#$FVīKhDI} FT` MgS{hU]IM:O+-؞BX 4 0_0 q΀E_%}*'өE? *!Ɋ戮opů_6r؊`(] X̎wI+#,UP3RJH&BTHiXZVMg8`aHgx.uМMAŋxə(T ũP0b:68"h/~<0> =Y*a] \r'l}#vKb\$AZ2 J$Z0~"8`O|:ΌMiY$K)Kr_e!4p[Ѕ06d1 獟E^5 >I9 \pF9m! ܍}PROCpS@ۊڷMIո@x,N-$ q}c({v(p /33&[P(2IA/#a#Q&,(PQh9=$ڵŧ|c3)xBDdFK˜ 4QOV:х`eM)+k"2NQ]kh.h_pZKR/ J_@aC!h !Zh3}dN4@J%~g+ANXFoD+i«jվ\݅M~ )5]ۅ))-50/TrhK55֚+l§:N ÓjP1VVsAZׇpdpVH$|%{^%{m6]QNH~nm$h J³V)LԮn#"hAe`œ4pJS3 3*q KM ǵ&ğYXt~ZpԳug瑚[Px0pV:v(_F]5R8Z$+ `4 4( p\B܁y="E|ةqE`D:6kݏR+B޽[+tDž5vHv]5 zf F|V eU_uHJH qP_[丆ɵ`JrkNe wuXLhņ G_هfM[(*S `*Vau +x pdaזsr"n2]@Vdl" Mh7)3cwmԐtn" EZiM%"S߉RG_{L$`JG4AUNzJrK+\oEQQLN04N__p+xwEge 7,noEOmq{ÄdsB2Qޣj~ΔycKyI_:It9=:`gр'M)iLrx.x^w= I/^>m5.L>aI&?c=]XpԅhV 甽  v 0 j\AhMEd)MG "6 Chk-]&n\ѥE,A-"1%RZ kQ dŋM#bH]hapM- $0eX`hRu..6LzAzi) !1c\ lU]n96ʗYm-!iY o'R8&!H`5vkNMYa@X mTUJUPy#]3B}rYЬe%V2TP xv$<  G : J8aKAғ%`(OA $”HEU%z1B.PAMcp1@W=H biL42-xG92%ZE`,X1fE8baLyrFr!B u00x%5Md&pds-GgBYXb)xZbLA~cBU=('_7@y] zц 5ƛp\p7`2Ez3` S&$@,> Qbi2PPC^[ #F1 )Ҁ24P2 0a[3ʹWB |0 %Pr%8PI{1"(V(c&0DhiD-$B@D&< kB *n1QJ aE˺\L &!MQ2UKm%T@ҖUXMz=p6jwZrڅ#IԺd@E:0[,h.&j+5drRbiUm*@.FE+YƔ,1WH *ŷvؑm - .DP&wv$uD gK^ 0L$R%q^܂4< /I* Z |v Ln V Tb\ҋ6e#2G(O$BA!L! lE P)GHDWOaHAHGH44A(VITQ+_qdq G4qS.xENyG'`c E!q7Ft"TJHlb8*P$bLP(ey6QR%.q)32Nn65FFb0[sL^ s/LdVʏ&=)JSҕ.})Lc*әҴD9S6O*ԡ$I6А pDzQPc'(Tբr3 T P$%o6<$_`gS^I<4Z@+q-" f*bQaWb#4 8ky#FHC)Jq2 j0i.c] H>`K.8X~ha6pw-0Wq ,rQ ANWR|ӗf.@)jp<| /ety3"qPOG9A']t4x\rYvP](=8: ‘_CʝA=`U…82,.8BߝDaV&'tRCnu+qK$ Dŋ#)WA$"[Mv $P; ŋ苓BU- #xoQRׂi@,r go$ rAJxF2} ״\mwc+ D6ЖY1FuTh'`T70ʻ.pqmm!xHi  QGJY2 d ]h_ 5)7ƀNb28gE".5ьM~$h efr`Dх|t\&bp,ھWG؋Fj;IHyb*E ~ɧq)Bq-`-Snt˘- 2iLIP:-P6|'l/S0eΈO :'yX,\tuͶTu9 - @%GE9DHBM ~ěpM7 vtq=C$E\_ܑB85#gSq2%x.gٵGP Up)-p %$_/q],M ~AzF-jfI2( x\ |D~@DA0m8#OߡbE@FJ؅-L}E?XBf Ϡ$E a Gg(-DtȆo)h@*BB YT'  bgS\ ΄t. k0(.gR]DFFDF0hctu2Ϊ.g,'ʈ2''%a:(!eͪ-,ҬlHE5l >K]&Ka†BeDgcfLB%4$3AH+*":*v4Dm86,qz$ɹDM&Pw l.e͒i4G`Eџ^@QzfF(ŕ-1ieڭSRE|$AAߴ <^>8T! $a5aBYmSCey9A-;>q pz21TAEy)}y5Iy׈ + GW s4:OfFTVG%T?z̩IzWUBR%xW+r-_0Kz{:'Kݭ1;+{7㔁D1g+TS䊡wͷnչSȷUzPU9wA哆KcW;';idW!jo/{K)$s O-Ǩ$؀ $@㏾'%&c%xJErF4]oE(|@\q@?2I<] >' @\N8bdd `Kc' a E dƯ$ 3 `0*B6KZ2^$ v`X [$XbJ+5ԠbV%VN:@Z(Q*+a^VJ'xdykV[vlXcɖ5{mI Xc$=ˍlk̇\3$K\̥~np1x4|.D0h fi|ru'N71 ff)`RL*LZ&cYvYxzPT(o%-0K$ Q,Ŗ5#9%Zx0\G/haZh! +N5˒b0KȸcIkD4R_]vė!!@ŸJ Y-N.Q iɀ(A5H+N5!h+1 d MWp(x XPT еJӚ5*<yCV\,rJh@c2wnE6 AR L< U1@fEb e` mR#6v",4F eNe(s8HașsW j)`+SIg̨y #= q4x= Ew hsvTݲT @@6iSg?T2LXBD$J<4ƅ}BD =V1u)^Dְ.0J&5Q5E!30 qI| ǔ@bW*Y$$5c6 0iH"rGhJ^9'>qgH*dJ,UÚe%fPq"iU~u "LŚDnJQ 8 ZخR̈.aRR6Oq (K44zX79͵]R*!ۓTc$L@ L@Dɟ4z!Mp @!Ml1\P+"Y ih{mD# pIkFfd%” )Lh7\ DZ^Wrv46Us#‘h!Š`"}3G+@R=L(ƮI4DDӅ%жHɛ,+EpxL$P~ʑWh(@D^4ܶ)!\c A.4Ɛn j`";*hdv8̴ A+@ h RXN|[`(> `8Y#Uz!TA+ؔ4R!TƳ֤q ^&(0 P{3wBV  W8Wૌ/ 5(L]ըfv 7EA_1\Rvp)/E`Á *׍07N 67&h7Fchwյ-bO^Ӟb%C E;0'.[`)h!ݞ;( - P%rbV{;`84fŃ>P-W$H`wD%,:"-728؅.ZGXH>z[ :X[ z- @-> ġ ɮN4rCd+Rqka( imI\Ci#"kAA"lBaJ @n!#!bj:h1O^ͫFg"&cbctFI/.8z~0'ba06a|!b#8x {8@wacp+k\,½ &n +FVbl&<"ok? LlbP'1,%p,B "c*ͰFsbbSq9dBmR]},w{{&~]8brq+4˂Q"ѫƢº3 ](בb±ubA>1%}\n~Ʊ ".aҮ6,K$3`r"9 A#;,0)TnJ*ebR&CA &ۑF$5bN,&!Ĥh \|@@粢&'!I&D±C]@ (@,N^A-!t&&ILj`t`O "4fjo?JOE=xN&ܨm\#8K+x1Sy @Q1aځ,b~3`. ilPb&s666`D hȤ":/=::!vզ)vv*sƓ"<ɥ9Q@-syb"s!$~lcR Dq-&uⷿFJ(-@~wdHL4.)\HפʇFum\xwjpI%HzWw̮tF,-z:inc%Xc0Dl^ౚH@ǭ$Iyc#rǠdaE.8&L1cq;V4*' vgjmP3K` Znn0@vn"/bin%d6ٝ1o-f)"&ArdN'*wic1!Pu2,"'nt&r*iqEbp&l-wlgXx zDf~X(`HI.qNB,f̶ TpBP:j`GJ `Au`!]E {&IEsՋH L> qyyȠ0وifġLʤv Ġʳ{Ds^J*OaoDjƄkLψ@Ӧ[5kz*B!J&FNq(k;8ጆHA*x/VKxHZ Zi F5ީ3_Ԩnk@VFZmE  'jIKf uNuLL!jZF,Td(yyY,0>aA(:bPV̶GJ!/ b}^Y'p Cq+y !l_+Gl*_%"_]KBzl!X=+>+īSb3*^ CL:w-d:j,[>az!t0>&][< (S*'ڨ ɢ?%-Boș?ŸJ $0>Zذ+Z1ƍ;zq1!IE3%și@)紜9_-uY2p4R Kɚ+JHjcgK0ST) b8%ȒsY̛3E Snbe+Mc̠eZѕggN3`.#zp"w~*v4 H4˄@1x3䒌a"|Qb,yr `H4a\3| d38Q1x4*#+SF=INά$[Y,tma N$WI9 \E=3㑢pX FH/Q2 /2U $)8% 8h.:@-aJIL1U -vp-gPZ&@ HB %|RITpSP ɪmr`v  (*2+/+@;(jP&I&u (dc;, ڌWP4$0}Mb@(+Q(f O j+zk$Y@cǰç4Ц?ZAh=^)d1l@١6۴0\LnFb.&2*8JJ_riU њY( pWG- 6xK\j,=(m11yRHF47KR% @KgF5H HŬ@@QDE&"ic:`'q,,pv+n vg h񌢭p5L?X _ء @%SDX6 O[M`Ia2 #ָ: ]"Θ>1@APCdɰAGT= dD 3PxSiT4cjJTr/%VC%zޮT3)w>iڪ%ѐF?8 `MW +LaC ݢyA?YdB}iRHיu8QHS(2J'6Tbk;_ =.L` "P1 LH pQ(dK+8)5$|^`U4 DQ.5 p  [.$ @QBJf9fEfE36!#HuQ66d`0#b4(`#U] .U g[TpBlMl$՗jTP x"f.)= iΌ$ap( &Y-TPNiߊȄ%q[TX@f]h0|!d`(D0!#HŠ.XW't~xGHB VPF8$q0 j2 ۱8Q*A8cb>i4ʘل՞WxvybT lB@@/Tv0@*Ba&?@,(D[\"cdѩ)bU[f@0L%^b^EehBV(60EqaC0F$"LDl"&1q zeQqDizEf/L^56zvnfiAp ,(ҮUZ(@~/ [#47 `V^JgDP)͕.uo.;.Rlw OL8̵[/ͭlw֊%93>חGi?pJ,"KLKM"58O"B (ROH'@ ҋ4+ZvެNdU߈Mv " TA%tZ"/gR " T GP"d 3"| JSe %%K  4@Wo%€PIcA*vT F ! h7p%J=f~Qi '$ 0 nR=5 # qaW|oBrlP) :Bɵ r1!}g}as\[u* 0+ZEE V^+2(|3#4|p+t|\\ptc yi sgt Ag&p\e$@&0` 7B5s Q]gf<ܣn(xjv Jq$H.Q#%@/!c.n%a.3"8Qܳ!R $ SB&P@3i! *pMr.H?#* j9q8]h$|_rW 6G r$Y BnW~*) b6yeVVT"G+ H! Sp#qq&X(.4&P4G 4Ts8`P66*0O"6vpC)8F 1-Y9!X3@ЖhA!U;cRJx1w H0RS Z3o8<9c @  S$G0P`l r p 6 )   0mP 2r%YZ u$  %5 0:I2e{9qG\W@8*x{«c.i, iI.Z;,YŤ1!s6$][u*REM}UFa.(#aQ (2A{~\ulTGNj<ܱZll|?Qə́şb%ʥlʫʭʯ EQ˳˹ Uph-|Bl̦tvCsFǬ([Npa$|*3- |K`[g,q h,i Ged|/Jv*PP $0iЧ}١!:sq贌МR9?5 حqR} z s mӧ,h6` Aƒzͤ)!0AALjڬe*Pz@hB ;@(vgxxUU^mFXbƍ?Ydʕ-_]p-p2 *j89pj|M⠫e҂DTC\AK܂өU%cDyAHZ#J3DONItDTKhrMj'(>o36 ?*9#J<Yf-$\OY) 3NiJ@`& 3#H#D2I%l'G~EŗQFeZ&Ҁ@Kd @ ln!E:Gqrq0IQM`( vSf6DY^B t+iE(*5!lă[ɺ;uOz!PfJ>OLAPRIņYgA`Q&E7]ue7pA/]`Q%l8+aEpD]TuiG*0}+l`YH0bx.kOXьT(2A`3 `hU%<5b;RH 8H# H&l;*`ŎN '.[0f^:TQPx0H Rgfy'4<4jAbӘǜ20N0# +mtq&~k93̎Hd&Rnw J|0>SQ ڈc 3l0Xh}"F*I| )cR W6)h'rTW'T\2ȵhl. # JδGEl3׼=0L7(ވIe$S_Η_U'2&6* FYQ&Tt!Dą/\L,W&Rd`#kp&!=@:J`"@ ¾ʄS᭠Hǥ0$F gAڑѻd&7]tr! g4|ro)GO'!r݀ [FatUj&#EħCȰ-zzp.WB EuՎKFi4X3qdbC[d)ܗldJ=o9GN;ĸs2h -lYdQPi#3@b@qitoF#fNA%dQr7rN1 \`b 8 2qc|*ot3 F[2?X*he :Z>!A+_ "h9' H(bsd^i[cYHci[(TLZ`D 22dV) k6ej ' .1[QxcF4YG8'tȩݻ'\ I-B ch WxAιY A18<6!HЄg =0`hd W@ `EHpqcHIape(gӏJDX# Ǜɭx9ָ+xjх!T Èf,ɰD\J(PSJ:Ђ;9C8aV;Isd,Y@Yɻ,4) 'p:\G1JA@'Yq {M.J34R#*8Y 7T YO9Q>VBɗڼ'SGC[p"Z1e2!X?_RsT8^#@LP3H#*JtciPYxeZRfAWvĈu11a0,XCF5̙Mмp p0{)tSP>W1*3a gpKp}(\=\!'C=!@0>Z"p?zhpqepg@7M[;7ZdhXz8MQbpī#X!e2NiHbHJ0D iXbXPⴵڒ-U-8Dd?ф?1 X1gpL8IN!]!,18qS8N,8SW<4Ȱ:m؆`Q+X dJqE[##s) }3p3><OP 1"{wt҄x0PS; GPQ踢-+` P@ZpV:;F^HDYb^ScB% D73X^HgxRΰ=_{\s`;$hT 0$xxAcP|ݧNKi]>c\0.uJqF^X4W+."ť;]A`B6kH9>TH/"gay8}SxPpɥdfbB6H $:5dfv-Ŀdl=^]Xq Jz8pb_%yM@rȤ( q ,D9 њ$*9  pP3h  wb{:f8G ;_zf#3 vFI-ޭK$"Mԍ=\x/p4``FaRXbw9(vX'o7A@eJ0_d1O`>S2o.-$VS3TMJh{*G+^ǯof`*<-&IΖ#sOf [90yfTJȲ|/CČ/>ppxh$ʼn|CetF#x Cʪw)(V ~e0D¶\Fr,w~\ Q-<TyAA"^q^ΉS6K(X WH('\+oM6R\ ,T!U:+۷9!6CePJG- P}"vbRdo9d\Ѻ}2O,0 pka(),*7ݚTD;l3Bx쓿P-VWS8 4d [%&} E%̞>VBJCMZXS,"t, B ! ޙY* J C@Pq 0 fi6Y.% ,` xI{fP4A`U+@JЫ׬J`"Oπ9i@|ԋǃ Xu'X' {AK+]I81 2~ H Z"1Ac07I'M2Ma}k)&1ʑ%Ѣ -B b|'/e!>&Cm DP\<BL4l@eiWZ9 ( H$c"tAWc|O009BPX\`?9՛Η(Oa\)8 7ÔL)KN2Q08ꧨi`:e,%!'$a`ő2 bZ` \: " ٢LZ,Q$Aes1Z, 

@?Ap: ͘ k(8R]g W (4YD*d`O;))qd8) 0y,[(FW0$,a Y"C("ɇz5/IXpQvƣtLƸ|1)OGr GcΊE%%-i8ZD@I{'i$ `F}e63dKWHik*i|T3ɅKf3bd+N|sJTf^N2SGCQR%1.G_ZWbz]r#L$+zN}9!OF %X\xY^SE .wP%8fJ&5PQ L-YT . aҒF.]Q`)hw ˀNtJK4Ep=tj`eMƪ-$W*&P0Hc"", &~G` + فP֓~" vEђv!mYV%N4$06;|0/=%E@*S!~{FV&6X3IFTMl #8H Q:F| %bJCSd~(~{rOK>)(a8򢀙X}q?Q 4r9@Չ_`n.1Wś!Jʼn50lQU i3Ct (bFD p3%asX| @*@(kLx]0|Ss"z1 ÛD(WϛFku-l@6tKr,' J3g9q4= 9Irr~Sr]%l'IYXuw4vo/6)㴟B5q N\'3DLc3 QF|_Q#$RHC*ĄG_\!VR0|jA4FLGӄ4~MUI%nəD>+pt+P6U4+^D(-IC/hF'H q&xdX-\OHXL4xB0%-nOrN\pB v/T9akltxe JţO4 ݢT/`חLk9'InLMnwLX9aBgB+tL3!ΐ琿3|Po 푚aO1tdJ?DX'(F ̧ZL<NlɏKL;V/<_4v;+-C3@,C* 'k/s+ZELY4}+Ex\;E Ct34u'GPXσk; t/K;1#۾-fB8qhDK`Vq`O),D&(1 ̉B(G" Jcx4@n<0gflGDX.p QÄb>+s:qkO}d[3:@P6 اIR%D3 x|T,i((ßI\iHTA:Nrֳgdi8&͕4*TǑ'Wys%2XT z2$Hӧ??|yѧ'ZvǗ?~}*}h >LPl!P ) 1P 9A QI,QLQYlaQiqQy R!,#LR%l'R)+R-/ S1,3LS5l7S9;S=? TA -CE}ҋџHtMT&LSMi”KIRI>A5PPR%/V{QսRydfImfdVEiVZ[ZlzRN^oI% g_EzkuQepTُ_@+6@2xST C40OHFWĽ(ا^\ьgL !,x 2%ܢr2*%|{" .!J4l'|3;EG5Y'OcnjhҔFγ 2<HEP> = $M٨[t4zz5<3:RAi8B)Q$jO4$a,1bZ+$(52OpIw2yRN0dEĔS%@ R(H(.OyI% r- ,r8c(P\\"HPe DFnNK(4"i1D"Rz qPћ2 hOݔb"]Qh͏"}AJf!;J%J+l4K3 I PRԣ.ЀKe % ,5A5{h ՗LYOa#|F2rbJ&z 9ŨS++`KZ6Ud"TjMJu}; ЬQ0TB Jj)SCǙFN9/;cD04ISKK8xjF;oۀ832uMVu_Ԧ*^~+= *8FbEqcȰ  oQ%$x]H!5 IH9vC^z]d Up9 L"Wy/xU%o΃+* !YE.V0.@mT/hE/DJZ_>H0>i\ӝ> `і/ari8)>- k(ZaFyڮ1nWOR="^1Z0lo 2Ќ(pC-TcP$4:L$&4C0z_By[ O0E~BB'&tpy׊0{P!nh)n.OV ~0tAd6&ba.0 ( _A`o,"O Y$ԌbReV#1 To a/q }ܯ/F)8SrVcW1Vm5D0e{R! GC"'>Q0ehb6%ca@6j&">(qf^ #$E5Kd0Q /9E*n,|N&BvXmp^ !nA"k2EF"T!#Tk+ Μ)g$?,(-3)KCvJ,$Sx4g4dJ.B&e/[DL0WTsH&aqBx`)2d2#ۄAZ-93)xVa:i~bl+53BEXhH&@A]`e5Els0c]d,.:(sz$d"T`&eƨ1;{35-SawG83$=9)i 5Ev!b!A?q6A]ڡf"$@G6" A3F9d[fB"PDO$@=zCSFkDaG$\v&zcGKdCk<H*?D1-S(HD>a> mITClL*дCLμHS$jN N12d2Q#4 4 n_<ܘgUܢZGadkO,t6Æ2}F1ZQOPA285X 9O+FSQ9݊zk0)5CV dҕ([N($&G9"K\(z%(d-*Ol\0)h#b,3r|bl^s37VRrCf!?ǩ%37Fbf9nYNZ7W8TcC53h C8* t\H.1[{I;lF+%@5UNkSsT'2rN D'lE $rL:'9MUG"#9}\#ʘI\é\'0~ً R14 e`m&_ZUTt'W9%qF#HVl*)S~u<,7b*T)aKłjcS -uXv 07Sam&@i%+ZcYVϡfAaӥg1NJ\0 x2\*~̼Bp%U Y4I5a _H0Zs>Rram0kfЄ<;0WYTmlF1)Nml )a2 ' VJKUK o^m+j wph*[oB|qB"[C צ2+CB \bc/n E^۱tp/mcK^x~`Ir߸@=@_B 5`ˢtA =i mecNw6Mk[3D7wi'wֱyK8|džzYO59(bXkhqY 񂙝t$XmbGjL%pylB9yj7^k"׊"񆉘WjQ+F4[KۣlcR6пA [ȱ &o+.0Rf`d5RS▇cOLЫc:B/vH;p1-2-HݍM!}=a2ΑpjG3.t wu+o:.Z(w5}"U޼pcw4=Tg8' Geyb7C.C-L5~>c8*IC7iess63!8M`9|71=kg7t)D4v FՁgZV[us"4pg~u?cuLENH 0 0 ?U ~664QV{:#Ck~ \:25{32 px9؀*YC [sz k&Cr)14h[sF{q7g=6Bs)@F~F3N%D3TXrXBvPUX\dK%A3x)Tk u?%}d*nXLXnA0Љyf=v87&}16ЋPXL< 75 Xb[6 \sFl(w\2*?!,!:pQ=#+yOd `&M8Lq UBmCF%}(hzXq Y7e~U88Fi6pZ6QiHBhx38Dnt)Th2, גQ8bsHV>~%9%jyiK8Y GL>K`*1 }K(Yf/ԙC9\asMN Lui8ŠsM3K4JMr8.<MÜNvv) QG'-}x0?bGG;MM0Js5?DȧU K@;`xV9"? YEU~JT?  &* Πh(Y8i68O*$Vvtm89sID NS:""9 _5Id ^yyc'L 9"j9U:s Fpʢ؂3uj -( 7S %DSEs;ҦX7Y0=cZY}NLN>}D 0n 2Ϩcɝ}퓭݋iLaDT΍^%\|N,,%Ìi=ŭ}A}Y>̉>F"׭kϳ쫭 `ۻn <ߐ$ƳЫm(_2>}  M؞3nKlLA V|<: Bh}PCvAm(kB- Dް& 4 ` YbtM4J.7ڠK *˜%Z+'Α'@ 8f+ uH6ڡʲT[qΥ[]y_4ia xqM D0x0q57!$ ++Bwn#T`“-?\InɄ3[V?Ifㄟdq*K~á'2jm[Agzkt*yD$AVSfG7[TXlA%@q>#b"I”Z옩"Z6J4DSTqEKM 2 ˍcN3vrBYm5l>l2%CH!|M˜-̹袃/̬š`.K-- +ʾ2bH&]  0Oz,S:> ! 0>]lƛooCJ%@O6˨D #VGk!c ~$Ljη{5V˥Jh="=GD@l"*;bɧעV{+NU:;)Ú2]r |yu[wքrIHnW&}6HhA*S:*l}rlz^`v/ |^ڴ?'(ь#ffɣAPzrMjR8BRupA5"BqQ6G|$ژw:P+K%49yx+$GZ B*#1IhЕ.u3͋ ds3c[rCt)42@BŁ/2kj<!qCxc;xs"OXr!UYUӧ`e+& $![p%%6T8cZf:1uba'=ɜFMje`K6LVYX"P;.KT`u]-:LW\v5,qI tɜHV1F2uhq$zH$ђȬ%&[E 88P~rJHD"*ZFCZ;i@PFtE &hڃ`zԢ`F4g)jTMF8g{ iFrQn )L9ND Lu=GJ%ODL(jU-AF2b t5pWՍTiT-: faFh!fUk-D {XĢH!-2O Al~yq]潸$qg !DP}:ԾXc9S`DXXİYdNY4g?͓ps^QZ#dL 1ё/fx Kf,ĉrRPk\#* NG)~vd@]m[>0D`tvoΞ7ΈL@;s4cpw^P: ~J7Yğ4q^8;xFgytžly-MWIODqFGOp{u2yGp+NwruG:5sZkJP Ig{-p*H'K\cX"?NxXw,xb+B{njc D[;gCE'lC9ѸΙO`vj/{f&2JsspK@o񶟽u_ >η}c܇ǫ4__xDtk}Ft" 1 fJ(I[Xehe[T[([8bcT%T @r0;:XG1My7@A+ M A%II+=[;p$ B!DM!Bb8BIC$J5׺Ti qӤ 'B! h7;뺊aӏQC/|.4$$#<-$FĮ0BNY?D@@Ę`>'HtCT%iq@)(@iHidX,A`Ѐ tpgH[e@fp bpYj ^Al:<>ɐ͡vl$;ivéx\G!:J9CñG{\:QМGGeer !HnßCR󎂤Q c#}RH[٘'(6ڀ'n2 ɏ$aH"8 ǢDHTʉGAeЅӣ [`v܉ ɤdC r[ZHZPaYEZ\)^Q\Ks,ZT86;֨S<u@FO@$ 6kFhA8.4 I9RJkl e$0B@QdIH鈚 ˁ#;M?0P'nۘ~\c #1ceߋ PyQ[Td LdPFa\V@Z ;C>H#HkjHC @$:tBOD44zUCDqJ1e$;\ F7dyRCnјAKXB|QW61TY1 QXB1,AVT9%6\uZ#%G}$< 5*4f90PK*XJ(6 7 (l W|1Mg^q"HēNA&n2 ~tNqfw>{C@AC,DO=LFd rjm֙szlW8EMfrCB Ⱦ ޮwքf{D ׊TI"$w8 Ar,gPs )' j HEBIt{O rT{[`a exB"P!o7 @jcla W ) |n!H](Cną cQM.t xP'1 GnPL),=K4DSLew)ہAD^dbD,Ydj*ǔ,nWd-݇gƽ|E-(JMzc7'/n=MtSf|t/oیEPe쑹6>̜b6UcUf"XRиZc+n#j<`B<(F1qbsN0]r_7hpfB&?pl bQW+-v$ yIٴbd!qk.x! [+n 6;@󛋧錫J8:~ H a [L Lxg̠<}F  x, :z LHu8BܠP 0Wƒ@  LMьMGl|FN92@/`!`?56L@`x f"HH!K \혞VLgΉg5M|Fm 8ʌ,(v"_pp p h  rTSŞpT~ "]bN 颏LtE ]Oa |}"԰r]n,^:4%̅iERSXTEtdGڨق$IH$IʮJʑK$*LJIvd.$8ԑ4d/G^]ů. %SbGdG$*BGN[R/hZlW"% ZSWre1R$R[%V@ -P%*,G^GSO`2X-@2lK$M%Z XmV܌BEDAE~&WzITTŴFfN$jfk&l&kjj C\ljNZ|TdfmZHEFfmZBEX"0'_TiΦluJ'vg}iW}8[C]%mtJhgQĦJEf|fDLʑxNg~jJsC`f(} 6a ` [`'VI>Q0)Ƈd(YHUB%(hW&(uJigv zJ(vLq<ƫ`LHPb$ՃMX9,DLL'n?}d@} V fGh灎U]=V| -,/ C 1*<ȓM.0:el+\l}+a:} %F09./8[:/'iwYKf̽d՜G.S q&ClѮ 8,\ ?6b6"~jTBRk&l&d,!\BB 1`0\,1:I#,/0tn$3D3@+>AuHH̀v]߱c^="/[ZqsHqPIߍEH: g2,piq9Fvl,Fim&[^/vs>i"Q|'+)}Ν:" p^2, 7Eҵt454Q\\!&^iU06l(8MPi(DFCfrﶞZi R2ޝiz&C 7Dipf+<}+ kx$2v'kN7cN `4ؼM0KndK ʅUvA IB"Di.wr-Ƭͦ fN9m52^R[?Xp;2tQ%[1t 3ƸD.kk@w!5Oᄤ#̢Im }qqȦbB1-80s_%3i3P00dp '^-oQs'Qjkol:r;'Clc$wIߴg [chP KyWA̕NɸѴWgYVzeeЉMI+"K;HdA/1)0C=U_9n.6U=-.=T`Us?]\x9;4HC82`pj/0_˿3H_Q^/8'uד7YK+@&9l*I5 Cm - X=QٳJ6}kq(&9BMF 1"c)p~NW4pǖ&wR?0In)B̂qs,]8l}8^8YclpGӯYky&(Pe&w&>-`B~~U'+oi&$%5?>nzT@&"L?o&g{ve?c7**Ε Yp"ch4V" pOL1^[9f[+`q&elљfffeQ \"tсhRX`1h ƒZL&K-BLMlIaQ2̈́+=ǜ/9 TL3U(oa`TƫN;s#dž>YPE 4T*iY@ҪR~{u@=auYe n5W1Ɋ0]Sfەќu6 C]Vl@!TҒ>DP|n,I(~{,ɀٴ2|8>Aava,a5Vx/Qc-k8@W5caCFc#XdI A@xZN]W{#:E;K:j>1sdu O{{ƻ禯o|b "ȏke]on ;G' [''b /aP<`(c^о{FuJe\t&&uIpQF[lQF|wgITP,1 /)mr,g̠2$|_?s:@I<)bEڹ4f(G1\ AMIJtQAdo10J(Œh)YU V~l`NQ%l1l#`a XP1E(i7^SX b`$7L\Rk1;!% ئIXXbFLt&k>K4! V'6OlE(h ΋]Aav64L3 ִ}M+"ӘT\-Ȍ&J'TjXCa@bgF9ʓ011(L0M䜶q\Z!PpŴܶD3]3Iߠ4зoP-0n5Og>Z%Be5-es:y(Qޕ&MZƬ"2We j[a~IMmqM.FYT|T Rp~RH~"Ic> kY>Zɲ䶐=46TD|D- Ieå ѕ.DW-ֺֺILTJ](q0z^&SJ-֗@*UR-vϋIcB-[ŬF ˀ7/wXm۵ IlJ+*VΆ&ѺN)b\]`dLٞT'#YVl۠Z:.Ӥ]П @]铓ǠsVmVԲ昫XP9y>`!@;{Lj Q󻧁aZ( B>X ]<0nsOZZ9Up\ w7'-jO#iMUA!b &`us4}w Ԙjh,Z¬~n%LV<ؔ@x d$*ж#g =ḛqm!iPR}1=PEMSMnP16m?|0>:}lRÇi aG]糀|*9!m`!Mf8k[\PB>tM*(d$ '@2"v[A+@@PhY뻽X^:hՋ qJTvcn@Wb 7E8h Z{?k@}hQy)oW;d]D\!WwA 0cke}iO L޾LӛM W(p{i={.5coo ^>Qu0%_R ???$(Mdb2B ${wTp! Of O"`dlK0c*4:?0B ~k?SP{0$Unk;J3b#%"=b0BDlbn*// +˄3O.2 B&3t -c-  O P gb6Dv/ B\J9¢@blṢ#PcjC,`5)\b%Q,e{nT%qD*% 1c< 5R!4CW1b9#qA_> ߢ=mͥCEZj'%EbNNaFЭx'%؅Q~$<ԭ+Rn' ;ET;EQS$p(;FH"1iܬvErG@`!U 1E U`?>,"]l@?Q!!x`Zyfa)afA|DEq;ޣng$nY4(C5N+%Sx@G`1nP& jQgQA \%Ah16!0._EZD!RÕ%# Ee҇£x/>p:;.A6>#XD"%7A;&V"^R~(F.R͇T@(qFhini)5ʬgM 0@P #̅J2n>JGoZ ZG>fC%!%Mg y0zHkI)NbD^|E\Qe;PbG90L~jd!-S2{edxu](R:a`PI?[\X5fab$\ٶ42?\r\mg-]$i<( 9{'D٥_l'%G'iCsF.FVW>USj7RN8}YGMɡ+w-FS.ACBCKiNdiux?¶Zc1EJX}#eAEdaB^ t^TT9u}QE$ʅ$5XT n_H#d{azukN 'wތ j&U9[arQ[#Mhhȼ9> wO]@*v%]<:̓9UCU;zև"X] TPm2'_dnT176Sy 2!1~k66FYHGS U}ߌ(*,xHS.Q{I^<њ^j iT7Yo:U@~)oUїge6s[  c9v&m$LL`@p;EjCb_\iw&-П$T]Ʊx6SbUc(@a4~qS(ydFrrZ?a@7YLV::DkRU9l,&ފ&>Em q5 zC Z!tm\JsfڂGel4<L` Ln䪻t@t}6h>>B(8Q99QZC}{sw!SxfY]BXJ >ŠrNBjiG7^CڜQB%sב&ft4)t4WRƦa"loY{1{r9L;RmWQ ё\D2U[[+mFEC%e"5i.Caw8sTT8R{:5{ æuESrm l5\kC Gq  tab2y n|q@T@ ֭kLĈx:V-BQԧJWTU #L`<44C>U: 4,S̥EaE"`9s"Kح")T[ŎJ5KZԜn&} M6UHCYĈv\q P$OՋ J{8ݨAbV/4`呓TaB<=L+! WS7elNe GUܻ{>ˏ y ,c?6O ""0zǞءK~v6! (C p)yVP}xv!B ltFҚsVBv'M+ 4/lfG,Rf"(a!HTL9`Y*;BQYa_T]t l_l(dYt`Xˉ(^t2F抾 jPOC'=$iu: " 0)҇pӝx);oۇ\$yJk$Zb(+2Jr2,`"r, %@$fRl돷&uۭIɶfRPϺ&.yn.$@4(/{l \0‰2@R[k\1˱pܾwvܥsI I)l.S$$,ɺkROM5պ^fm$]cubwM6UG]0ک5mܽ-W2 g덒p wy|Nxx}rۃ2nyoyz袏Nz馟zꪯz뮿{N{ߎ{>vֻ[h«NpPC{/9zgGÝ^)yioBhڏ䠩HڋzؑA. | *R`000MET,k%`!FiK?~!@ \q Oa$V<91p_qFI;9JnA$Ed<ӊ0q%V#=:T  q& }@N =0|`[(#ZT@%#IIJRlW#HV(? ;))A WJxl%*Zo_rɥ`b +cWQPXu&4%Pqf $)]ǎ%)P W7ʟ O*Ig=i1 I#zg?  W P 1zZ@ Tz%@A vr$F Urs*0d6ANLʔb`5QG.31c& <2(TAF gD BR$VEJS3$|b74&ԑ4 C>ҕxu"dOc`z-CPB5A Q;D b_Ћ .Q1I47B䥄QfZe)DIJ\UjR$/ZQH1ڪZD6ynbsmVht1/!ȐA-j_)Ȩ4+椫y͛D/\,C*ox.2@0@I@oطA|`@#@g@A-.#Xȝ_F|Ē n0)P c(xQH %!Klv$/99@Xt2P0A]BJ4֩u[uUUYhh(L1ۧ-3]ҰH?I?"АQar,9Q*UN.IuPjy@{_ASKn7uĂ%'Vjh є0zr~O!a!AЊD#S{ǞD}N_/Ш0<;GqQ:._3A 6RuRe59 &fQuYW~('c C/! $<Bc"?rwQFSc3wǁ/hD|OvJTO͗Dn`@G({@ux d" w U+~d #p*)Tj!YUaTVhy"$%ڵ)ݓA Z#60T7S.j`Ձ;sI=Vo uHuzW@/Hv1Ho aI |]o=. "c{(_BM`M9U[>Ry7"0@/g0P  f!W>GL\#jJr#dQd&#Ci+iD[7eys ^QD!`5PmQ58=I +`uďCTO!wp6 B ̦z5UBG?R~7E3[orqD9ESQR͠Z1T\G'WS'%Q%" q['Ske(`4{qT"xApzӃ먕C#A@uXUvYQp^Ha%n~WCuwf2 9,S6J pnE&?˰Q@ZNp"'bm6R?''qkB%gqJuyTP`~ eC3cy7[@i!zY:HDg` i ? ̙HɩyƜH4pWc ,h y $64<daBr{"K LL:z"!$2(JILnJ#"LJu'3K JK-ׇJ=';^#,- -%+BpDpaI_c#5,/ [-<2-;: RD0ME2~C+Fܤ3C:J2!.=z0Jj+P_ UB[2S_mez@tPRmeiy{9])ȧJ:5TJ.Cxè }D+n @@!@78t$kta)z~< hĪ D4R{bĆ~zGY LA/KW$lֺt5؂ߠXp?hO]O_;o3B 2'Z0ZYfs.ң1å 3޲ #pgHa ł<" k#q>;rM-\,ҍ+E*a9k'*" s8*KOKW@vh2 tY [].pY 6rWuR iSAU$`McE%dXV5F1  ^uyv[{wP˸$`v^7 # v o_6Dvpa60F.Gt27g8A'Hȸ#d[i3a64!b%VUSQad]3 ̷v ph 0 ug ksW(ApM!0V#Bg?6NzrB&U&VC])  v| V_k> $cAMҺkǘx S[<&q)f"S#NvJ5d D@8@fKJaăr;Nrɀ πeR"@rV]6ƀIav GO _ 0Q_.[T76= LyX_ MPY*+bw7~UؾNƛ< ha؂ht6h d @Ju;"#y;hƔ~O9^RLEqOƞw$ќ* U 8G.20BޑMTK~}Xr]4b ߊ7[â(J09-s6HKq>h1Mfv?e_N%kV.ᲂĭ(<*>Sܛ4z<:+.:ޠã+J#ʩQ#C#2!JMFLNLr#rGŊ[JP8<!Rx \N>`q! !:^;(j77J~N5)9((%W)q4 f jv%XvۅWSaҷ\t+z>TQT{\7#\R2f+??NJ|%Q@!K ѣ}`UC@jW %Qr75:d`u r8)>F^>]}hz.8b&oOJl^dBv!3(J=A^QJE T/[*=sDQz^`nWLjw_1){⹜&,o!V!? g"29̈+!rxw xuc]r{9xA.(sϡWMLWtowx`ckg l7V[[*q{0 #@ \v )HI&avl @J4ODttgxg i9D zHI_jEr#/OVܚ(B'9*“69I`J%DOB 2O@Q#(aA M48B(Sd##RH+ɴQ$( NtuQƢ2C-eڒ' x!IS?qbư3alTf"1cte@$v6E`I!-, "90|daǀh6sjփV mwMNڻaX|7z5k֝p4б8W(y<4-`- ͚!sV@3gس_Lf_!6uR'ɀ6H3`1OĻ%C@bނڮ9T@">j릹%EλfQa>gQ>_Ƞ~A oe,`򫍢p<i @`:tK<`iEC&=,Jjt(9K.^*/Uy7] t1$7]t".l"b"Y02l3 6ZZZ ;L1­/qy6g8Zc96Yv!vrSc 騃)llhOj*=g<846LsG}|*J&>U0КR63OR㦾e)ZD B\)j2i` TaB^/d#L[to+9YXtSI$ R{kD[m6XYf)n -o!/ɷF:K/f&DA5,lԸ; Uj vozSl1{0XX̆Uy~Xa\`[j,Z}@2]pq{~|`j}"/N r6:,9tH)Qg;#k6Y*"u`'DRR[0nnЋ!(y Wo'_ жNjCl@ LHuaCQN$:wNUI@GJ9cU"x7_0J*ΔhT2uqwc/i n`]ay̳e=]O`vؕ3maW7\47 oLYM>S#2d‰x#vP"5CЈ9H9H$ˉHЪXQA9n7%*H@yI0bDDZa QMxOtCHP]5FBM,,:HDdk;(+aFg٢T@W hHH\URH4e JQjJ@$5:iZP&˙J\|j<3C4E ưYZͻ?V_\p :;lv E- .F8Ziyƀ8X cP81kL9ȁ"!}JB40]P iEv K֋B0x0KSLzm)HP&(d jN0?oQ1#}y6`4u/ }DP DaWyLlwDJUdWZB<ڨvasE !ey0Ae,üyXUaZU`e44|-fv&dsfxȅsYgݸYf.*a5aXlۡɚx ^p?;4Un \CAPbTaR 8H M 5" S>;GڎVЀfYbx,+px8.Ġ+ b.cP4 0FXZI&FӨ *M{M@[ZJp4h,E q:-߉9('FJ/}Cԙ8 O)(z*HiGBZ1T9: 0A= WbJq.<>zGB²*+rH2'> Cċ7R1(wc 7OAtC2iݛx?tOCnӨ|䢇dP3AVPiQ{̐PuÙ.1!cAT× 8Đ a<SD0AZ !:6я iNHRK h)2Okq+㈴@Tq1WqqxYh} (?/&P 3Z@4ݦqXu?Z0'Ԫ?fB.c%Z%n*䪥Z 4Xs2\X[Qؒu -%Y %('U< M⊟$$%a a[/ @̓R>9OM"ў[Z[/lI\ۼۨ ڗH(Dh[x"KO";ڭZ8ڼEC튂4$7 [M /<R ʴJDjڣH -%\m ]% @@KQH^ Y ^}=@^}@%SHX[ZH:EˀUJ Q)0 PߗL_ `8 _`_h` a >Kv`= ` VH\ 3`va_b UX M0 2F`&c bݕݕ ]Y_cc9VݰT n"۰U]JE.XM2MdP5\dLfܕHVvWXYZcf _Ed=ya.X_fgijP$mfkof(EO]sFtVufg>b.nxgW`{|}~&6FVfv臆舖艦芶&6FVfv闆阖陦隶&6FVfv꧆ꨖꩦꪶ&6FVfv뷆븖빦뺶&6FVfvdžȖɦʶn&i36Vm>Pa- FB0906o l8l;C'}of g ,f&U1{%Jo/Z67Xc{/ oΆDZH; *Ic.n.a~)nCCaS$>/lÆl $:(Gj}*q/%B/(y|$::M o _쬐 o1hV}תqd3iӹXAVD*V Sf#лqqsX@mBej j`=VȒhξhE$s?,Q\A _fYUUsqN%21j݄1t H6SS<ʈ& Yxt)NDjKZ(X˴@UP)̠ٔry+Y y86eMMtm>r=0@s-* Bd~~}w MIt1"XGu(Ď SA)gsv8aT$IȄMvlW*ndsŢ9yS@6Aөϝ }B6."**y2!!SWGQxZd#R 58P["\wU1*ʉ^!T(?z( ބ,fT!KԈlqCCC^&!/# g ʘq:AGݏ별L`Q4f>+۞5Tȧr`Pر[ు +rBM+KT'r$Jx( 0a*M9IT&6o̩s'Ϟ> *t(ѢF"Mt)ӦNքTsLVz& 'Y>4*-`f lZ ɐ9C *U! g}Um,! 7KT2;kP.C,qFJj°}BPj&UNz5֮_Î-[IP0Bـk Lر[VHpjٮLXlpΠ.>&+nj/ov˳Ï/>%;Ac^I%(Z%H} ^G/)8` -[U1%V-1p }'+Q W UMH%9V?'.]FUUF :یSRYLHw J$'&vk٦*([$!W,{٧)Z"6ٸBRZbrکZڪZ⚫ګ["2۬BR[brۭ߂[碛ۮ[⛯ۯ\# Ëٜ"=S S<*(J1NHfq#'2_-2 \ /]4^;LcYxąGܴW2/l 6/(a/G4IMz09k_Iu*SWa7@Z\T}wdw}QڀSfG^.MjC9Q"vyN_maWLBB4fJIOZ6( / \ B0=MOhf;b&-kid,.Wk(q fAr߮BgL(D! 'JhbĕͰwu2nbH&6 hL I?A(Fc$D ':Qሌ/K:Y̚3ZIti71rhLol΄L7EJ8/u"ʤLb!奱̭h5(HrjyS_!+ /arnC[ QueJJ`e#~h~At$L0?6)4Zz2&4=JhFt1 OTQpęTPH8,=Qґd)2! /P ,HFw8c!&e4.83 qC[B% p? MB@LihjSs PŪN2=! ((&2IԠ =v Z4AKҲobt ;2 0y3w2PrL}\ta6$9vE6I)iozPmBb)OŇTbïnW2$-DAq]IܪK*lay}Hc({B9P'![Y'm$ԒZ8 D"Je m#[rRd GݝAc@d 4񗒯8e1ˀx3\H9?pA@BQmB|,1rCǓ Пw;7.C;7.XI Nh^+a|ư#ὐRj6e=ޒ6?C9IxWqĮ Vd ^aىg`@/Ā*=H9@ IH4J!o|eY PR/l I EIćVS @te*!V e__[]R(C,#ӁyIؙɒ0Z nNjfm;e&P2i"Sq&zb''șh4DW,+2i]"nA]VDIZc0 0#= -8qTq+–9 "-J }!)ք$T$\QD݅>#>+L:>94:c C E ﹘q5VY5֢,⮱b!a״a9FGDnG@ uJn)"AJWɤLHPl&h&0MrNH'JNdPB&^-I ?dڢ)ɋtR:\&5 1P[MS $rDS^%M` ڔכ#iDJhVZf _~=P%la H6 ^IhT_Z;ML}Vp>QbԘ4 [Rf-PA]z\Y 5&,bP`j^0u 0\Ô< 4[x8lalwdB]&HP?)gbXnPpv0ZK'Ht'ňf!|KD"RD,2hLeL6h\. NܙuM%Bv@MJX(hp(`d^Egxè!茎0a yIb#eudUF6lP_J2൘5i'2[IJН}P%J*@i({~)q霎x yšN WH%9h+ **0AUj؝(oπ?h6=)riT!X T^$ Ќ *v Wꮠ韙*~4HEq1n걦%f>"M".+̥]SZ.+a~+ތ^~Wk.j鼮 7%k[E JⴾWt,ڐ4}USÖ %]&"%ĂzV*PwlʟŢlc^~v*Ii#)iެ5-A.#NӊU,i"d`tI_Ҋ-EK@#I۶ώrέr(ܡ)l H H2-rʐlMXJ['@YM!D5ICМ34l|lvC2̃,Exxզ*;g$2/poy G-zbߓJ 59|x$hXdeF|^Jp|p3 R fJ` _ӖPpF n :I2!M8vd0mMva!ibo=xpGcp4v0w:#Ұ` Y*p  O`Ik%Ԅ V   mE8@ q,ɂLOOrJ Ri7M*$Q@!,!s H*\`#JHŋ3jȱǏ CIdJ(SP0_,AfMQ%ZDҤ?+JѣH*]ʴS(Y0aUpJ*ٚVJ`D!YY Ĥt>Kݻx;(WVŌV҆68`, ( ɒ#s i4I(ӨS^ͺ끕XVU`pq Ŀ#5Ye̘"$ J:pA%سk. `pN(wb!0~x2!3Cq;%,rDrJ4՛1!L%' -١)-]PWTSTS]N/=06 6;,6},(ltg [f-2i6j-ykv[ \lw&+6]q}ΙqB Ky6GJ* J1r κꡜ~9Ak*utL;]`tبxv76S35gC˸"C\I\]j v!ⳳ}tpː pY8PC|koKA'b!(T׋ׁ`wsvc8FP ޱU%mk9Q@x 376buY'EY1q<|y".x:A}˟+f8>+\lc1cؓY+GHhs \ZB3}L2H#TIhݥ“(kX;*C3}IiQZ0׬Lm{twhF3 g4c{*0 ilx6KM`pӛmlbY&hXjbsLdqWV-[ 5)W¢hgBl _(2hgٌd Tw d\S5 h?zF7%5RUpLegEIhU#̨ȻKFk◿Vy%oBf6FuM)VjQk$o~sHկEeХL(1Y$M/:U+> cw2w Aq{kNRwm%UJ^.2W/4E(xU^9j3{,~YwQj',֡a K_'hH'+kp]]9QP(*BQl#( vU-=0x`[S ő o֡Ow-XSx5o2WM=es:l`5'wϗי]foWts+:Mj /CPΉdk&0_^KJ޺`|aYlMn]7&mZy6ჇqkgS-\[wzG,qn&z^Cjxuckf;FfgT|lYXU ut fLxvtaVk?Is_ՈQgN_֋G6u#T}nDe 4ECTbhn:?nD4cox(D[4(LcaD=qi,_X2f|dQfFtȒ>VTh\`[~;tS{:;DRhBB)J6$2}?;:@D49<۴NP["Gr$ AQ[V{Z; _еcc{h{eKk ]+!Q>q|۷|k$x{u;{k$~[`˸;+AH)MM MY [cٓKڻ >(Q˹>Ûw{˹=Q[ {MջP0[``{v`K@ޫp*仾{ ܾ ܾ v [㋿ۗ(>f+{2@7LV@3|GĪ[= šTlS : @HNMMGT=HC@YJMԸ` ;= 6M `ֆˇ˽\ L/Ps|vwm,ȌuI̺,ΰ[;OWgKgSO2,,c}ڴ@ 3mMѺ Mҿ=(]/}@ҁӸ<5-Ӷ=` cm p?` ;  mʠ >: adm ߳= ֊ҹk-pmŐ]q} ݹ.i=ſ|UTP*)>'؋\Ӷ'm=m`=Һ-/ ݷ,Lܵ 4( InѺ0Vn `-(7䊼>n(Ř\.nx>#>~ε؋mK(ſ<[Ϗm*ڭsmt֢{3~йNnE{ }%=]Ǯ.PS|ѽNܵnd> c>=}­ |mδo'\d캧+KLq 󜺃M^肾[@"νq]~).̩K㋜l7cnD]G>f ?)!㎜sǝ,ʓ<ʣ2/{ }ۿMn>ؾ>(s]I .mJΰ r萎,xڦF\p-.z{n~͞^рn܅΍(m$ 7OD?Ԙ19D0Mz;s-u} \n-YPحN\NζOE&ƙ= , oy&]nȅӵNΝm=d-Ѱl)ÅK.[q @HCHl te̐Q]`m0F$c(D0iJ*YM9uOA%ZQI|PP`g&M]6(k׆u[wu1u d~ol,)ճt ̥ϧ_}:ug -zbj  .k· 0,13C 1ɲ@,bFɂ>Ҟ\b֔ f%I;2|++$"gSIz#)4s7.D HPk/&O@tЦ&*3qZ Cp% 34/R 4s3  1I7ʬbUREʹ҂/KW<#i$F3LڸLݜOoZnɎ3.UBM/doPvu]xTuH | 0KߺR -}/ tU*waE*ΦG*^h,*4,,EUmTxܕh!jS.X=S­G찻H.+Kn_b[-3FZ건ryd|aO`ctCVk\5X@ekD':FT6ũ8O,w%=ڀ`uy;a}54b 5 CA`'&M>qJ`Le`OfECH"&1ѣSF4$$-1C H$"+IHZ$'-Mn&-IDX&YyJTrlReNH-3LtUB˜?HA\-fkkLPsf!m ⤜QΞӗ|$: sN`/s泚eA zP kMGP\SDөBThG=QT#}CIzRT+eiK]RT3%icrS47aNfәD$P:ԝ4>6iS9ԫTS3LuթR2weL~U`KCm$C'V@$seI\/d r\  5_7ؿ9,2̱F6*Nzټ^UV YYJkiz A!Di&v5mw|SRnp(5^`Dnr\-\'\KH.{rĦ|+8q얷 po던q:pw\IG9o{"WtAP{.^"`-vu P{/®eO>h^0+.9+uQb|+@vC |毰yk7ݑ$sUn]:_-=?{ϼo;q#7Ξ_F.gu|7b6\so[v u=ǿ7 ܿ~0d^!O>#@%߈8x+*,l#8˻T;cc(` eXdhe@ \`(Vc@ Xn@`8;^;3;+*<o3嘠 ]h"xHˆ8!$kh C20op!] `!$0R0ACp @NΓ<5= 91$(ZˑC-)7#<4ۢ+ZL;P;Tg@Fgc,;:jH3p|L?"0!HjQ.6|KO0[<Ӽ>3=6!,l cSɖp!6)㼋{QoyRqM$6[s3!қN* .bڱ0 ]SJQ33k;` lAiFgTF# `AP?Q.2a1+R.\g,i=.a<su x1v`IdOvgvhvivjvkvlvmvnr^Aw2J>,իɒs9Ҳߕ,~r|7w}㲪z9v'Pw/B4HZ 3׉#:|.z^Mzr9R/vk"z*+ɣGf&YsY5j(/´P$"M$\~,I1Bi3ld>Q!I(y&zb+toOʾײyGcѿ}b,͝>WT}~~N{ЙReTh7^͗(XǞ.aeTAACSomSq$w(u s|00's6wF}w(*(!DXbFy7˧} lzʀ K*=D "@`B*0, 쨰.(ì~lkh``a>YW_1dnb*XV ~駛o޴),jj<kla&p;gqGpD(K*q/sw^ p@- yfRbd)Ud Ftqo|ozs'aB.0`(OrQaiO(=!  !%V ^3xC {@mW#R:H.GsWr4osS*"txV$QS60H$ D*t䐈" m$ )I'blFqyЂm Xg} 3B`X'ݩda^:ҲK!;HCSduhKViM\`LVMɔ1B ~3ՃE?уZ`roDMd%ch\O0%(UrFգq=ﱒ.@I~T ֺ'8)qBZ#@&ȂSWD-|@Pc,Eb9 e%NsӐ,R9)PկG9+-5'8P cL5S*Uy̥=ᘎ jJE9N%#H\Kj__%5ap̬ '/;, &]{:*R;1olIqR<Αt(*a{L!)ns 3iO83"1ϥIyvV%2%q[Kow8Jt,Tt4pۻҗP;VK71=0(:EfuW[ ‰MoXhG9W69- #ap8".GnXu0%(iʋ08e<7:q5'Jo,ӴX/ b# Q=خ7hraZ\foy;3"Ū Hoc_9_M[2Q|4 R\c'9tnc8ơra=!4E\MsZe3B;8H!r?[ʉhZxg)"?(oS(R}l90`$if6vi2ˆHLT_!ZkIq|[$+ !:? RpCd6V6Π!>85Lwo'A KԊ؅-]R8Qa [!'Gr*|ዌW\ⴚys~q|9gqB-t'H?/Z|JkEqKHպ'uӊV?;ڭ~ǜnzq=bz>|;w'y[^0!>?#m36# g)sbSOԳG=.^cozǽ?>?~kzw~|~컷ã|g>c?Vƨ8O<ϫD$GH?@y22JGL I K@I``v`v`Dx|Hq 䰠@ՠ :ԋt! !&ב=o:\.!fn!f(_i1_!jmC!a桒 aaZaP쀚!!\!FP$VG$N$`L *+Td")NxZ +RL ^!- %ĉD%\ss G/06`y"5l+tLQD"6fVQƵ` #7"b-cO"*"v0qb 1<#>6!@? QCr 0 \1>G6.$C^) D D_=_HMGvF] ^]y_]D|=?4btL>#EL#%NDLZG `I_CQ9BRRႨӏgEM9ő`ŜiFXɄ/q@sILB-pLKɔL%jN,YjuNP jIƔC(kY@|Ν_ʖ fAVQv&--^[T  && ZѦ l &lޘƐAqlm%Z@qĐ+b^-0x-02,'zj2433 z01:xT9BDŽxނ/dt 洔2xg^2(*h^ҥ}C:-DLiL4N>zn!oA҈QULHm QhŬHaN{ Kh?aO$΃)CaDi*̈́mdZԂ^%8(g~ާx0)0v' ev3@`vk\)](~*(e+)jfh.()հL*:^* .l**2p*.5,؂TeU5J ZVyX'$+X`Fpή^w^)+@*laɉM EksRBcF`d&ȌhmF*kaha`M B+Q$9NBӻW~ͣ q,,MЌlKJ( g~i{.4y6Ʈ}yyRC+hhxwhzLlAix2~~(, (& r#Ucx Դ>ƄFUj_TG퀗 Rh1i8J!&qܪ+IlxVlȢ'|  H"3g3x,ᾧ3$3$nn3 C|'>'hTkVȸZ}z)άj.T<Ҷn)-0X8 ӯjﺋT'NN8Bm:t[XI2’0ZfL kn%weȠڥ.(ъLi+-ΖÄJL Jߊ:1 HbSG؂Є^O2-ҔzucWn/=\ >iTg ,aFve^e'Fe)V&ĶD"9/'C.M#͙}}%8J4 hJ$SUYo QrnF,hn̄&jkj}Ν^  !N!V0,-ƖN0rfgZbci4ѷb >% /1aUf̍0.R?Bu:Z1 *̞rx&21-+nL9CzL*΃ib9L7T9tbb&3NGEO~dʫPȘ,RAӆ΅[@]C]܇^8rČq֭qjbh{"C>3mV.kwz/(Ţ2tyiybQ}Z{jnl UF$Sڂ..ʦ6-p Z[S]W+(7.5|*.5Xo^u^Sj]v^s.ljtO;-D"Dd')2rvs4s)zLөlib+b F,i7w_R G U6mMopo%7a%8w9(`sC7$dP~xC&"OʣϣDTcNw&@|7$@7}C&$~ }7$t7~6.n.>aCM?EdO.C7B)A&8ߜS<ܓ>LrE%|ι MLD2Ј2t#̔S";J7TT=%!3Ȕ0b#L5W_%BW8uTK2C$-,Ք]vfkIy.˙fRjc%aaL@iS\qkZzB[+A [ XHS[$VFb[`Qb\l89X0`0@d[PxOFTVfkX9qс0P1SڒDҹ#TV(ʸlZ[s[oOV7-!߶~@2ꠧz80wQ٧X4R:PJ=PҪ SZ^tk Xg) U:9 D2Rw2 RV|賒Qt/I2Co/}<.`)8N6OEf6W铧,Nݞ^Mk4yY7[.FYpB'Sx I|=;a 9ӁT;I&tǛܧ}m$ms.{JޞslF;Ng,߆<{sDwT?˔IVԥw,uxS?pvom&J]ޮѸ;}ї7/JG<}an!2wΤƤG˜:Os yLP#M,45z J$ PdH:fG$::vp,Lmtookx Xc8)lwzJp&ʡJ*pЭx. )hlrMMģ% fP #c #>( /#ׄ)zP#) O趰j;t =#x !1+1~FFXd h["&)ZP'wTj<<@(0 pد( )(&O=cN-'Pߪx!2LOz' zPPMON(O$mZОp'mA {"d4p1&!R!!$Fd$D)<4VbL. հ1Iq$&1=|".In(/LhP{a UN)- ܏<2Dť&'у'ITQМN +Fh>Tg\ք lj '\N[ Y(.0HF1 Fb"dFba9F9$vv4Pn/ Cwl" Go {.0PٲobM1 I?>//mS+ v.lԤq֣5m=ڃ c,P&)G1'bpb ;9"켳D&Gzn~$v{&:,$aJpI=v(n:6y1 6PrlD;8S$aR)znL2DHJ'I6{(xEȄl8S'pq -@ S)n=΃fd4'Ȳ(iq+iln&ޅt.Pg(P~W.D4J dKD&V3n=1D.H ~//(&ESSq ɐ/SmmwhDs)V;m TDsSokel/Yۤ^k.4p6-)Sp5Q$-1JR=~rPTu*7(G1(^#OvzLO{Hb'a(#7*uB@gYˎ6Rh=rWMmbr)oֳ#ޢ(tt-C4FvejݾLv>J ʱ-5hCjlOk.IV /Dgw9rӯDP^0sSP>ĭ 7ZW0MT:η#PiCG|hH)$6J8RUbT%F Nߖq Ӑ3).&u:sXmѐ6@8UP]/j+zێi'RT'ZaI \YcE]n=JBCYNˈ8D`9#0h1H#cBv6PLuEYyπ+E3I393M~W)kUL..m"u.90;-WSCLyvn0vlg}O\0Jrɨz,Jk0aF{{Ga J*$ƎK6j ξ;"`kC 2BZ;k J{IK(d <˳+ۿS[B*_KKRK\'Ok+48|:y Ȋp\k kpWΨj[RT\-Bƛ|˜ţ"]3[|?˻Ê^\ǜ\לŪ\ΙNa-Ī ]ʪ-LN;TqMmotM6l]+n#-vv,΅YYKC&k(Qz1#-ksNSwB}-M/5kA'Kp zŒ0oEM%١0>[ѥ߽"j$rB$. jhka,^Zmp=l]g K,B>X -rHU.G4q)YG]0ސM\l^md:$EA9DE^dVDEXwurߞ6]G(MYmߴ.Ve@ӊa.v{kMܐ]JY3푒yEn@0aliDYZ FYF:!0goՐO$ 넗؏gyxm鑼 qM{4O4O[W|s-/_4p%:ħ?E|_S"" $KWv:ܰ]Y ƍ:j1Ȏz:y+% @tP2IJ23N&O ճ%Ld)eTEGFcǫ n ב`hJ(¨i UUgPECլ׍>-Qɟ >8Ō;~ 9ɔ+[93Ix6&4DlHhj FKWl]:bN;pv=o[t=цE]y+VuS iԐ{mH@nOl\WGd]dixfwUiW%jFa^an!fәgl`Lf\"-1`,p.Fk. dc.Y:q@T1"gL"a%'ب]TeՓOaz]^}yU8 {pV^Wmf-T<4u4fJ*1UHtK݉i|QEYEXni~ *dMB -4i",6PAAA*[jȫB+jF"Nٔ菄}b_kNR5*&w5TpSExx`GzoR 1$Uv-CGiU쾹w~UX`> qOLqavf*M¢1,"2ȫ7#ͪ-18 %qf3T &!VFZ0HOngmA'Yux:Z~֤֥BtN UvBpzw~3Fg;1걉sK7!3x![!`Ρ-ztʔ%|L]Ʃh2H|660/ P?U.yM~柏:+숏*Y\_2DG͒!CtPr;h6`(p}TX;Q1m)Ge'Z(D5>u5$_ Xz<5&P-̃$*qLL < ѐ"i2pE;,d!``CU9ؐ0F@l#r ,`āVMb(0xC*-YcP1aIxHHނ<)X]P'4%;H`T<:L-[^0%7d[9"4&Js8!![@Mhơ\+Α(U9k5V=:PZ7KWN^,h.%9P,c @?І.Ψh3 A㒣P%0'+dYIJrl#I&)1@1y eҒ9Oxӡm!W@$VsLmjFeRIU@UQ[BYͪ-l񃫊-|1VTBS**VVu؅Uz5RZ*Ih0ƼM -b+K"g%l(V- thҢa}B [:u>t^q\W B׹fӳ#Bkŭd?L-/$2AWe?LHćKJ=bg50!gf؄_׽ oa;+8i/N¾? Sg]-\؁V%01n`)x<^`(0akҋ{$+yL`k(gWT>r,kyˊi0#0yd.ό4<8tqWy|x:g]Ӝ(} tj֞EtPZ=yӜ4hЕ9&h *sn#i"{JO6kN+um _ 7&6d+Yg&"]℉yabnomqqbK y{y/{C]So&r$8 ovtfs?19'?8g,Qtj!"OOyP]X%3,wj3)#/P$+O8i!ylw X}U::E&[Yu,fcz9@.[Ϛ!zBDu_,+! duS,Eu;)0u[zI0U4I) `(b #Fr:)w1Ӈ?$ ?aL9Ks3%}5*wv1COB3#WF ܱh*WLx%u|mk,Ym-݇X]vn*Ä~ucնܶ<]hv˫zkC-kXY8@K|AӺlQY:Уq5kyz&ZqKX) D8++|kM<@s?WtDg0G:$b[VEzɛyYtDt wtGht@VBePǼ e̙4J5ET=[!=A$v[ znBH$4.LTv HKdI v,Uܜ?EBF5B4wJ$LdK(Q|(ePjwͰz{Qun(Q6-.EH|Q -Ҋ"Himbr#7( Hx!Bx7Gj,M` !+,$rIUk5NFidxHxۄFg)ZjZ,˙:! Xm?aJf u*~ / Rrk0K9/%J0K v }H E ͜dHuRKޑ۸HG(skLȰvڠm8S&vm؝T RUrj- ~қIٞ4)A 5LH J 0 IS~ DS9]&C&Eȅ|cp!*I*+ 1* 1-i9:ു Niy s$OiL|⑪, rXKg)PD ;J!d0%Aϵ&V1DCYs(237ROB"0^ǵAD9y@ѱ D!;Lw6:I/K ;eA11C.(B7?z6O $N35ՃTU+1O @I"OARBp-)s +# C2" ` *n9hȁ!:!kuB6#Q B4-8 (DHz F.+I:E7`0ptyWpkYf#9$E5lK_ˍF`t"-cX9@,?M'z+ VNAu*qSzΈz.GJ ?(hw|)z?E:%wkٵD#g&F{Ld$?)Xnd@BDxAs(<) ԡb1COE,2r W0"C.F#N6BXmXr [-ZKb-`*@øǒ`J ~BPħO6Jb(PlXb(0$^H1cHK%!Ï? r0lm)cƆ(-n GR5TQD W*`pD铢̞HV-6*TC:|S/?aS+I 8QPjSURխQu+rbɾv ,fĒ]$mTΛ̺pߪFFцǔ2,Q?ōG\r"0 aeKv\:ttE q!^ӵ7u}Sf+-\Q P`e >o6'Ao*TP6=qIJd)47h,$dƇTd&z۬/ M7%rBrKl7c̆dQބz4!vd!jDiE,19r(ZPҍN(cj2zSZ* %JMMP5GZz /bqȈTɳ 3@ `xV*K-B[!5W\+ nCa7=d==c6C;KXca1q[TwX tIXLB j ~WhGrԨ/Ӏ ll 24k<̫y=PL1JMzKߚN$rHjN+ζb**ND-i}׳vw~_W?>6̜ҙ8#M?[~*l4B;Oʾz'{.u Rrmm.!&h '@ e6;c"R%ۚnt?11LӠ6("/SI7 bXV$*̃V BhP!Y o8WՆ5ȩ] uŠݵZ2ܱZ"#;Mȋ:~7!}Z\<#X- 5zZwg<$"ԠZ>r5˜6] KY ` UnqJV80#!QŷEC"QHŠ,\dIY@ ZnE吩Z$Kbpi |Ob]^ d( `\2VcQGLCs#d1itH' vDޢ웪xpe4ß&ɧ"ǠʕTժyJ|擑l$aMm*31'hz63ЧFtU1lٷEj@+`WuVIFr\F#ehhBM ^l>jvFŘ9,/hK e4eqf%sUE~cZ՚MnyO`")V(Og@ 4Td ֽnvYj%mגt?,D51:ʾ#¯@+d xΈCN8t.cC ^p{kau;a# P:8D8/ˋOc 1K KdcF. ǕFK z6iaM2 o"7Z  ɼ2OT.?rud2ǘ.t$vI <:ƃβCBB,})"&trdR'3N}G_N/WmC=Ԥ&Gd VOՖp]_XiWZ5WY.=LLqI$'Րq qmC8sq1]lh `ʓ£-j҆N=odڙĶ]oL; }3.p;޶$R}pIt;7EnG8|׍eBWsҞ8$DAKi(ɝik+ol/}:Ŀ)S\L/;NIu؉# եѩǮvUo?q'i{vj iXC8!box}!? =rrO0nAOyҗG}Uz9sp;}XJBnI xG~2}?}ۇg}P?~G?rnE'N?$4DTdt $4DTdt !$"4#D$T%d&t'()*+,-./01$243D4T5d6t789:;<=>?@A$B4CDDTEdFtGHIJKLMNOPQ$R4SDӱVdW4UtZWdT,E x` Cl_FŻ ƄFQ佖k36=FF>=juE/깞E33z6.GK:+7K{4Gs}jH32ôګ=C{?}6Ȅ+;;[=ar۱{/0 EK4C `tF9 y aّx8Sۼx3ILHlLC>ǿa Ja$VA,,g.+V,2(~BKZ:KB,UYʞEy<17KIsȪĄJ@ʈ$ h Ӓ)NOڦjUjdV M,MV(rMbrJY5q# JjLY ZL<|:o[ॴ$Z H1 BZ ^(i(% sMu$IR\CC3c૊F[ɾ4a2D)HS!.j( ͈H$O8 z2A+XO2ġhDI&rXYHKڭ'l˽b%R+ Ҟٟ+>A(q{1`QB R)C aeb'A.yJW:RaVIBRXY-M$@$6 Htx%ًXGvOEs7S#1HbT-'DRW7J5٣1|WEܸi;jErJA*xHUѫf@BZTYdȬ̊KfJ"e(l+! ը\E4LwGHmUs&%ZlV.,TլR%O8k l.3lH$7Y(ƕ[ʪ>m2B \"5홼[Y[FD~lC3xt$5ܐ+zաamܑ؏L=c]Y}\LNj+ȌóՕR«lJNj8ڝMHMUo{`}<_HnHEɟ.[3xGs,N)F aPmxqN5fL$P@#J d !Zmt\'o˪&$*m0Yb/C(& #mbX<_7@&nb|4@U$013ާ5T̀]E.Ñ*a \ @VdҺI:eeeePB1MGc2JN] x29 F\6T8-݁ܝ<#ҵf8]eÏ6fm~W5sfq~ȽKE[eԻFZ;;S)g<#̒gy>RImHzȀ ġu3-7V]>Fn3/^\uF=#̏;sșThy۾-ܽJ,a}RוIÄsDz3BoHCFVfꦎC?rDFqvj Fll[j}@ޣPxZk6PUnk{dkN=My(PkfEt[}d/[ka}!V=psE.Lu^p^M!#̮L5ȠIC޶Цnp\AROY,'{2,`-JͧMm8<;fCꦵ\+Ui-X\EsW{]J3ơK̲5:jk79lo5($#p$o4^멦`ݞc]Be4^]G6I:\qt!; '2r4ظ P(PrGh6OL,+óH'g$*ވͪ^<!"/OޣM^e00rsىvH$gp/3-3 \/ >t*2'3A/q@ɭd۸=m'kc?|y;Qs3xNwL'3^(Qqyg/z[sE2g=0jHmS 3 UX ՄVQc$6h7zng/x,hb~oOZ}?a4mjȍT~wDv vԣ~v~wJ"WFP\)H2|2\g^G(QJ"WiO>@E6Ba"(0(~*$& LRC* 1#͙0hC'azV&K2A&'ӥ :ʪVbͪu+׮^ +v,ٲfϢMvmڅ?I|!]v6dHwaJK ؕLC˘'ФH1+<8T>"H;VltQu_d+{6ڶoέ{7uC 7ø JɣΝĖVHr1K rdO(7ϯ^QCD(| )hG ^wHuR#rɽiIQ(LDR4cyc ZA 4Cᘣ;أ\1]C CzGyK6WXFQcEBXV5Dw2EeTKUyg(TU>sY[1p!Ƥ ]IE(*A(sDCMN\pޙjkQ:ޠh$II&@B K+n,6[?:촐 m]!fEhhE벻Rp i{BM0`J*r- 0 C1ߒũ`jbWD.ݨl_A۲/ÌI)ɇ\YcRJ/|1 ;3GK,<3Ot O\9JK$dX^oTo\{f+i2|N2O/Fڒ ::Ppmvy6vrIqcudWIA*(FkZl#Hrm 1xzIIE=YHEc-!)y+s^Ul@>B>XZLB7)e{ S53De8!sLĤKA0}>o\!OGx$T/V++ KhBIBжE fCrbGlC %6'"F\q mR.`T5(IF#]?u+p tTыbk[j=&ԧan(Pw[ j׻F(-WC OPq%͇ӽ5 EFsjkGE=Ub;Y~5RBU/?}Eg[Zl孚hMTJnHrDߺ`ǨlޥC)g\/-;r0Ltա()"s+cun4+d[ ]k 4O[m#jKXNc"T)8B vkQݺc8=J1:vIg`d8"fCKvP&s`8Th_>3G-E1:^ (U&!Id2/ϱb3l39w}am󛕬;nE@PTL;_T `<#mt;v2ѭD&:ӊon2WU_&WӪ¢L tպA;TR#Ǔm oo1~xngu›|zAzf5HNxKa jao;ܫKN+5=6SvGMĿ66 ]\;뚙vYлqK!`#Yo a=$9mFaWzIW_9[ RѺ\J7 KkI˱*g9W86$-Hǜ[ܱ{ޠONbfӻntivGjhgCCWwNrʾ|s/i3T|]P_[%v[,rșb,X.1նyv`%/Ln}mz"z4v _r>; *_p^˽4Eߣ(#-*S&7}Xx㌝2ǕVp[eزdU["mpʅksR%xʷ߿ LKO185\!?% ʲdάsfp;S\B%&U- Ic˞M۸-&vjQKVsQJ#?^yo +1}IUgJ-ʮËO'(w]1'[;; ny& 6TLc-&8P\s݆q"jqmkwu,0*(aW4XXV; \?(?%=5S,TwAy$]Xf\J%?)M@Е_kZj t)J&MY'lr埀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸뮼+(L>%O9}F+V fԊmK$kn~k캷f{mֺ'K 8P 5 οVK歋A;0yWN88YԐ(1Ɏu<x Nⓠ1nQc(e*EP|e(c)KQ,)KY `2`<1qK^-C ZE6@9`/jZsK/IT0[ē'Jfҟ(F@{IRr,B)Oœ|h5͉unӁq(7  c=' [<LF]xRڼ tGNSQk6.)Laj`EEj0yLԘ,fSiLX*R Usf3d8*@3:Vd4cnQIױիM%*kJZ৬4h`S UfS4):ծUE]czT`.tk!׺ub]gʧR+,Ssrse ;i:iAoJS(TVka%gԹ]#H`׭$e[sRQ94/^tmg9&p${M> 9M#t`9Q6dy@CrXu W$/;*^u>{[>v,oq2.p6{QMER)P3'Iɲ.8v4]EZf"{O7Yn,]2ɺࣿ wе-E} 8oqymt^#S򲝍eS;վvmځWKr;l&y8E~I5\ݘ[d>+:uDNx{'!ZκWsz;!sY vٌ;[.^;DG>&BW("-%\˵4S/2520\=Vl\v5EtSt6En\ofLvyn8v I@&Aq3v7p~| fpoDpsjy$rjvgt4i7:V|}u`w'_wT`.6;?I4\H(G>PSCBT6a/= 2I`ydhm5iAu{F&;u:Ap#wAǂp'ATpV`c4~%6^7apaN:Bh Wp7wGutfGMȈ(iRi$URv>v0%Erg(R5̵42džJ, 6//(t!aOj N@:MN^Z;h/ .XVZ|JI?$xvg_[__sg_%_dNWzuwZtX}w>uM|G }&^uX;6ch-kH3kZ BZ38<9/I@[et8S JP9wvxy7_|a JBU UKZYsEL4YTXLLWwJ%Q wwt9K@XhPt T4WFuLDYRUX5?OYDMN1Wb|'R֣0%5yFf].r4dC;D7h>Fh>[޳tFc>2$--A46t"C@Q7RI$C:9ߓi#@&@MifVVy&r6A>>rzS9yM\%\B"l/9]\f/95RG40-vRHD-  `$: #:dB2h-Bc16 FX1eQ,3E%%-j%zH%2z#HR>!DIz2*GjFZb&a8- jPm4nqڦk4.5j &O3i0**HSt9<=a{3+3Jr qf*:*&Z ڪʪ*d2Bz:ksD/ C 2VD:3.s2E瓌yëzغZ)|ڭ*@皮躮ڮZߊگ'q ۰;[˰;[y1VP %[M`O.- M2K3 MPO<۳>K4 0 @D[&{PDL{D#K"P;#'{&k& U[ *FE+`j lk l q t{xg| K{{v+k`{kkk > >pvP;۸Ky;|{~Mck+v1ʵV3ۻ;Y0YO0KKVkY+Vk;Ż?[;+9+㻴'˻.۲--ۻM< ;˿ |k`lL l sKol `0$\$ (|(`pp.04\ 0`+l < Lzk ƀ|;ҵV([R\/T`MT\L^^Tb|kKӫƻ;1ۻ Q+.++M0[;Łܻ|OK??@; O@`ɑ Y ɠ ʰ pʨ| \ʧK` lİ@ʾ˶ʺ |̸ʌ LD <\Ќ @̮ʰ ˸lL ƠδΓ˰LL+\OOL R\YM۲K Є^CNs!ľnŽOY. Kfn\[ŋ'>|Ŕ<˲9{Ek ^GK>';ҵMS^o ԝհ̿|iLN\,O帞:^܂@B*N~n҉Wn(m鉮чN~}k/ Mk.햞b w 6nխQhʏT;nʆI & A .dC%NXE5n V IT"Pٲ%&+U6ĦMq7o>igl4 QXb{@)Х2*lN[fuiO4m,Ohe{۞ wf'u5&c"\8 J1bȊ%G2bɉ1kngС8ۆϨzձֵvo:,´O]  NsѥO^zCJTIҪK2ݘG(TOkϤsտSi`k,:𦜚ɬp+'r2@ 3ƨJ$L87zsEb EU IÑw2+K6o ,3gFCEŒ#ʁ:.K09N OƓ@Ų *ġs/)B>ЂtAF#|ⅼjH}|SߒCTS}KFJcVs\I!2ƌEot5~V uyC TrJ)dnLn[pí$ *5M7YJ/&xr(.~'xB`x`R+&8 8 " 48,H6䁿ybHNve`Yd,3%inl|-фmX#3%2z"H:X&'7Zm=I\V{m3Ӡ<\^[hZI+"(@_} ѵ0zv8/A SU=fSWF\11z m\7n,7GҾ9hV5u~ܫnz~{3$ծ\\}LB OB|5͒X~d$ 9Zp> 8"D:APYANB%VA0TaeXCZP9 wCЇ)$bEm!{KdbDDS,xE,^1$"xxVˇ 'c40HDF%v0yBx1>'u,_!G@2D& )Fd % ELfRD>l)!&8!*KJXRe-myK\Re/}K`S$f1yLd&SI3LDә )HrifS5Im&4YNtNsfA/f9)t}@i:GZ{V蠱5v-hSeFvhbgQ:ְ{5]:U͂ntbDGי +mbƎgpr3|gl9֨FmpCaPXw(R u;ީw{ |ŻMox'x P|B D T"oVJY3e:C4dR#y3_+g9T~3E#4RL}Ns\- p._:M>r4QMvѺ՞ihzu7C Ai'g9]qG:a>w+]Kyc``ӥF gslZ<pc\<8y/F1ZQ `X11ϧ.p#6\yw\jG<կqaEӧ~_}@|]ހ G1~`y~0}"?}+?c_ [>^iY5ZX ]y@S$a( c蛾뫿|AdA?>\ A `Y D6C 6kB'Lrsq 78*By,~7/|y7Pt3B8aH8[8,>ZsC{"A"oO QCIC^ޑPPX%@!8P>`a\E]@Qlay>d>Afg Baj,?[ lD?lr>\Els:.n{O(a76Ć55|8~GP{\OxCK=,Y&B*:oHH CIK9$+;Z< $I ̑ẏ\ɜ$sH˴9Hd9SJ9IʩlJ#QJbY%i4%+jwKWKKkCz$| ,r zPz+KDC},88C$%*0P \J;㻿k;#O? BAARAjA]xF5D`I|@ _| 3A'`/>%5A\AA\#MRTAh#Uke[ejS>Յ!<7%T< BcQ3#! e,FbTDJVupBXY\ ^! ƅEE[ 'U1Պ(KzGW=ƌفl[U^ >*:,ݢ14S1EuS WSdXPmXL*Ud) 0\TEmRXTIXK|D\>;H"@_^YҰM ]$FOR- @ě,AõYè6xtx]"]|UGC8PGUU8t)%a.j HԚ̀\R MOʏK<;tNNH֨4P] A܍Ġ1߱Q_sR#^MS=!Ja^T[5 5Su~%]Jϧ9M4H} P^6椺94G ;6*7nYpG,P{S7/7u{7x Ƚ]CSHY]*:>6\FI:#\:;A89ʒ<+D7tB/t{[T\7,Ly<]YbM**&ͮ}r!|=B'aZNg]TrF>Xڿpru] tg{r EؚW{]EkWzGP׉ҚY@Gc@G(a )]U8aZYeÑU;2 VfY $B!iLꠦ>j!LQPjK`Qji!kf!NFf!Fkii궞kkibvņjFꩶjɦꭦvlɾꬶil쮾.ͦlkrIIpmK#Vr$mGmHmIFj΄nm0nFJ:I2"N!HУmmn#n1*G =*oo$W2nN2鶤֭CF/n?"'vmؖnn w"M`Npp pqq/q?qOq_qoqq/8%7oqw-, * 0*lJgbfZ0rڲmqr,q-*q1iZQ+:*8rs3+&LFCMG=>!O3G/ 1Jt&&FO-/!3#?-,K-%/"Mw0BuZ"c \Z|;h5iY, Ǔ/o<GNJW8V¡wJ=4-mAe^giVa^EPRT AVoey֛X=obeXnjv[P n<niEeg?Jc<dӔ V"hirv(&p+6rtD0Ըy0}RvbW'' :(^{(K1da]&V7A\dbiriA jZ*ʩ@k7U"~cYiqٖfr-EMkE^mf@`[/kdc9 hiL\"#'\A}r1!s< ^)2- *Ia5GboB{[boPfpA*z*:uе @m9Ԋ8b~.>Xvktַ}vasj.ݯE~8MKDz5nBchE C|:ꩫ Ĭg|ם˹;+4R|0bŋ0lv EفN5=U?9Yo{a+;"͊6_6)XYiXjBl˂&^)"-I X~=QMY:g*@j#ш `d&1Li: &WuNOr#"if>)Jܫ YDM *A )oXqW8$N*D 3#H&A2BDt ( _H#-v#IIRҷH2!Dw05s;#-QK^l#hL)S8BJNxS S1|%,y(E%Èy},BOd4tN3,Uxqfmd_$!XML旿AT$/':7f2^Li*bmz^oLM g>f7*:M u IʉRa,3э fYJȰLg%ڍR[ KC5t6̀pӜځJӞ┨Iz%-TMRҧ-ijTIrUʍWsSPR,*Y>U)VJŚҪv`[TTLb; cb +>U(f3Yo|Dj(I}RjT]F/QkSml[4MI5X?6o6n[䛾ՐX2 HLo1B`JRUjUuL.Uԩʒ%QWbce b\ 92^?&Dx@-ړa sGa_&ޅ/P ,ŋM c(61-Vbx,1{L!Ĵ wA JNqGb+yQE< oyKr by >L Kx`N3]Hʻs8{XU2˙acט-VcY$6?\ nNB$QԺ5#aQ[_= Xzֶs\Ӱm_:Ǝ$b#^u Ԇv% is6/qw;|rpmL71+ ,X<Ⱦ-p !V5A38'qpdb ![8=?<% J.63 ,A O\2O|>9Ѓ޲YF?:ғN:ԣ.VIs^anm=Կ3;C}n;,q'w̽v;p;OY =| '|;bO޲q3s^AB/2U)G&> =}~'99q~X"I  g͏񇪦[/Sc`sީGӯ~#<{/=1Ih*$|`bEA Iz^>*8]EnF_-DD ۱a ՠ zJΞV_ezI*!62XGIlڦTGb4LuIuUAUZnA嗗 %=@'FǙ @( a( "!!!"I(4#N"R$N&Fs!I& (PBP A=!+dah bNLT_@M] \ 1c1200J#5֔5V d6_Va"aq8@- G-:#c*B*B*#B*B=-1C1c?c?->c1?C1B:D=cEc>ZFJB*,b!z'P ݎ+֤MN_MXH HKЬ˺<ͮ4 PLp. NdJQtUf nU`U\FpHK8 :*:B-2_%\$eJcG.b%NLFbfRQ(bE% JV pm KYMz!lKiVfpih%ɡ Z#[c_i$@C@CJ24C3 38C224C2 C3Hj32,CVCceAjH&i=#ʥJ:`|'&(bM)n $ Ҍƍȳx)P2XlDRxOn1GzrdRs#!a."G緦/\+巊,/bvl$btDb&BJǀi|:$,Z.n mm)u.^Oj!$Pe [ՊSeoI նp Wb sdw,fvdv~i\Vd0ʶzd(B̆l9i !r"(PoƉfwbp/v.\U4̋8ӤʼKK\h1CCkp1KA/.v .P) G[cJ$:iC6$Cq3:)0r!Gi!7d!<d1!j>-:`2#[4BND~Fk>넌1+oM-=ij:dTPܦ7(Ç-E]4qgqR2fomD3fnNs4?34RłhH9N  a %''Ύ+!<̆/ b>3abbVot ?)0.h*02 r+?tס\؄QZښ횮uG{4H4I4&4JtFZEBd$dBDeM#L4$ LLK$D$P_R?DA4UڍG%mE$DYf4XtU5Yu5N;Y[5Z"ءZõ^5__5``6aۛV_a'bucad)af_fZ5&]WeSQ^iEik66)E(-6n[s(.NUqK6ʫMasM9wq򢘄vfrkw5: |b=f>O }_e}H!o]D- xvJ[-mXԎ`jvK!`&8JLJH8KT,'p;@.vlPV޷3"JYxox/.R}،a0ʑvgEĤJ&!0H5dp%Nk tuAf.!=3R 3iʌPI:iFSe23$̛Mtɒ$H6|Dveh0+b]t ٳk]@ n\s֍[SJy@o% Wwqbŋ7vrdɓ)W|sf͛9wth͕F@Z A5&kٮΘ*ܰ`]Mp]{ xFars[ѥKy?;޽zx[֜+˛2XÇ>~5xǫ5bm /,W>f-  A Jp˯O* 0DEM<'Kʹ*5z赮,ȶ6fncNې>~6f[|'? ;+H찣07sLW6( \Y6rE5@P&B +/ pP;LD]F}RH# Ja*Lt$R;<22>ۑ1j6*>%ď*#c!K #/̜̍v3t#l8m!OPlEp&OtMWv=O6W0C#|ݗ~qQFf1ǧDRif#0$F*b,)3cc`ҥ㗚icTx&[)(0Xub9fKxdf4`0Zj1Z:![:^;~Pe\s߭^ݛpL ?3t#A.J/(H߼ٔ7|蒇-mx(ȅ͑ړfڇZޫ޺kkn&N%%<%KߞIJF I2M7q|iőo_}dW@/_h?T4_h?!`} 1>Ր;ARBC˅\Hy_($ P޾CߛĿÄCD$ZbPb,!EY1Y,D"r1P %'@LŗIDLdBq$ H xHQ9d$DK^ +YGO&f'"~lL&BVJ WKe*%M0peiIє4YMLJ|f6L_ϋd"7_iMsT')JWz22ZdrAW ykXE<\iUҧ@%0XZzг]jWʭzsu\媸ƾ lTs ˋrDt3B!W-nolfC+ڹ k7PkmeS&kPG1q xE^٘ ֍b[o=^1*oJH>m@pErzg]YJ֮*[m_>QWeK7DW삝\zv*W&ĶvwbW6q8x'Pb˂0 e׶5é(x3n-/$  yZ1ZAe*OYNc^rk b͉6y5$6RBo[ĥB{B.\n{;}(01raz*.~]>Miuii[2y] = ztvV\>m_N_+^=k-5찝}kf/ֲU{ƨS\`|1k#LЂyoj&W`cgo.l]Ɠ+_F -XR]>?WޮZVNɴh{㺶<| VWY Nϱ:dоs- 'ӡ֐C#aG/s"&A|0 3|,]iL[Ӟ^|=[>Ғ]z m]y[VkzǮtZi ='׼~{\WUxsc~`z-"&襘K0iJYΰc71RF2ef/ mi*OzKOnAO̫Lz˲fmVLyԆmjL``,PϹd iN"P.ȡpjmTyydmZoɎ/kjz+\k.(,,Lnr(-bjIC8*x`F$Be!bn^Ra,K.A9K<՜mFtz0X2l`P^|O̮ +lx{vPۈhK4kR |/ 1\n.r̶ xbI"bL4Y޺`ȤZmMML,f],q/P'kG;猌nfг2q BjM1 k.䎰@00jCyֆoI밮Ϻ EHhݰS-qqTBc/c:h oLE*ڑ5/\%*۠m.ϰPZ Wl d-kmbOd_n۔' /9No8 1c$mr+ηvH/ l0'Q'y.eݼSIxW=F%$p87xc7PIĐ4ׄm21P P0Bpƀ3-ɤKzz1 Ŵ ,q20:@*m|mzoٌ2 L2M2&%ц :;7n3 :3ѬFO qE9j6Jj6g "@ -ނM@r0-ybOnjﴐ,21i//ұA7*;e 3Oj Osvo헬Sk.sT^.z\EWk?L"tB$*Z$"<&$|b"eJȤ[&ngj湵zaCLCl׎o^o2c5b5_`6s1SꬲdAgDPãqIq""UcB &u@#p5] ([u0ȕ\dkRkre"PL].XW.}dL][ TuiPXЧyCDgF*8#2(l RGb3B&Fd8aOqjLvёM@a7=Do[o~i~ԕ\t~F[K"m>> N$r.5y2 ^GAK35#4HȄ*)|(*u*^fb#~$V Zr0( rl/\&ƝUp:kMR1"1*3|;CX$NbN?a $qb8dBoVl!j-M.N<2=fVAxͪI搐"4<{}5IG֛q3ZYts)SFPS9JIt %»j|uSNB+Pe㈍Bp#ĉR+U^9N ȋ )>lx1%E(I6|iɘSDSf΃3hYD u0)(aJ &TlZSJ\V6رd˚=6ڵlۺ} 7ܹtڽ7oد]'U$ *LXbŌ06؆ 7WTB91F}x!b$ڑH"#n`dvxkH+h@-AH\/Rqddr N-V^y1%0^e1N1_zy-\bilBerB$s$餔&SRIlƙ VfVy"KrMSUiWU2WJjjeaa9dH#ڡ 檋.D뮺:#HcVc> y$A$x 'Qby 0v2,22<1$e&FgQ hf9(`su2ʕyoιʓy2z1[::걫^z1%| X%I@"O/}W}o/4}ϼHK"?%Iߏ?Ydl+ )HT )w9r/ j~^ ?(p$, Opk [8p4 op< qD,()~W*@qNb=D\EMhBjՅxF 0j#'41lWǁ#w@ ,!E0A# H+ǪP>SLZE{l`)hT"rleș f4 a[m_%/F3 @i:>lRpj+Z&9207sy gYNWslcFI^HC'd2D 3'15ƒ-f1 )ahJnt{[ܤԍSTQg&3A| )EwlKI:xƱ'=EF7~5+Z>np3TUF@RLf%"yVnLQY"׼d01`s2R`C?dCU:—u`d?fHSV!llU+pHG]@aMuHQ׻nH>({ע jZNAF5fm㌝)|r'YR&C&b%/&0b)1DX5W%g´q(KG+$rF1XNkK_k_qR'n7XeO=#\a `)GF2 iUIMmHX]fza3H~ԅd!9)UFkIRGQʸ%"i'^%G*6mfR{9DM43%O鸔ƅnk4St354SSKd_IuG 8Y7 b vÁh9YyG'UO札dj?}AiҴ2iM7URi7 92 P ]%6R2!iCDQDS[vSuwXސ,Ru0b7v('8n',C5"5T;S9z@$G#@b$ق$KRr$ے^% .j&_2/g.p.h lB&`0x&vw^rwm0 xVUPW$5l K^{R1lwW"S10f&>'ebڤVr r&gb.g%&f%V*Xx(nBqz0VtR)δPՉ|шm{9>y[vyJi !b,,[ j",","Z"ҭ+v"ܪu":u+"v\w"dgvfvm> f&cbxb.< /."/`ҥJ0mZ0+/zjb/c%f,Icڧ{dZ'J\&cRZ3Yr/&[Vg.gbd%x.G.<.´.`.rJ/V7(Z⩦&%22Y/ 31 Z*yl$!{)YR6q_jH + :ญK Kk ߠ ߀ Qۺ;ڬB+z2zG `%i{&Z%aޑs xJ=pPqb,̾"< #b'6XDhXdIXs1_Yp"ͤPyfz;K{^;i'M)EK)M٣ϴ-{ӛ(A|'lݶ^ rILQeiяW׺:1@d˸.3P54?ߠ 0]MݺM` ]` Ѝ޸ ޶KO75n%_XhrHlp,dI\2@PzgT n-E=V(?WT֬Y&T[{OCo;V ZkWۤI* X۶iC2l8.ݷ-ݤAVX^uTO9U+^Z^[M 2ѤJ9u*M6c*ֲpm\0f˪/[6 mʛ;I( I~J߯O~0@$@*oI*YԯId/T phGG0EMdqKlFCı[dqGslGcv"SD I%P&trI4,aJK//>.A4c3=8/D8 >LԄS<3QFE4H54PK4/ܲ-?Ͳ/$4O3Q:5KI[t>VcSNeJNWgu4>I8DM V.oJɏZ@m[ope01D7I,QCv]7^x}u7 ՗_|]3qpIa2L a>j̘Z+Y`eT-EfOI8jbIjf3f燃y)hQdbvii:hG#>NYW]?˕uIv;3vkco6ﻳ=zgFzi|k&h6s7sÍ0A!$C/&]tMW?gѽuطw wRp8[l y矿Kq=Lvfn[й6||G?}g}>~}VZU8@ЀD`́~[&| `σ`E8BЄ'Da UBЅ/a e8CІ7auCЇ?b8D"шGDbD&6щOb8E*VъWbE.vы_c8F2ьgDcոF6эoc8G:юwcG>яd 9HBҐDd"HF6ґd$%9IJVҒd&5INvғe(E9JRҔDe*UJVҕe,e9KZҖe.uK^җf09LbӘDf2Lf6әτf49MjVӚf6Mnvӛg89NrӜDg:չNvӝ  o޹OT@dЁ6+B9~b<]3Q[[EQlJ&娕R|/PK'+O]o/sE?.OMITzShKa͒*3Y*d[2[ptRi}W> 9%PUiz-?j3Qi<1Fujny<=.OW};Ofd-6Vy@DTdt $4DTdt !$"4#D$T%d&t'(Bh!3(r( .|ê)&K,s#8mKk:4ճ°C2s>8{cct26QJCn*P{1)+zÌ2)㯆[VmB=k{ʫ*ëy[9i+`ᨤҿS4Übi_I)qFՃ[yiS\:(W/x3k`q\:*aS2r,GEL>H[⛔i=iz*U .=ؓBG_:8I,ُaoqHH)LHIi ɏl?D%̿!*t)$%i1Ó㜜,?ICLɝJPI Jt*zʨ$ʢ!䧤,E|CI1$K*˭Z?T˵d˶t˷|/<˛ʮ>˻˺ ʘ>CJܨzırLU"TƄLD#H MD<DLK{2ͨr| ̴JڴML<è**?LM̌ͫ )ބMh Ψr>2M=2?>DIj~jKO;D|ɫI<&k[57 H2 =k[|9ZMÔ8 бҸ @1H2R< O 4KqYJ2`p yHQr:,RZBˎJPM*+Ih-̓DNIR8I|L3r 5m;Ag{FtT,2tĆԣƂ 8IGm\t6Vx\:I5+6t82ӛ3)@U1M^,d"ĽfDV10VHM3ӧkSWTK1P[yCUs5#'U[QId<#e=΁InX$)& YR̩:1˘]ҙ]O4.W}:. 1 Z=g̘!U\q1LΤBӼͩ Ng4IڕYe=?͹ӌL,IEh>^BXs ͰF!BWoL$t̓N<*\UKI^L*Zr-d0$"EL٤lΥ!Bݻ-;T3Qd4WpS@*Tb|ҡ,IË8C^D/(*=i qݒY եYmYY"]el] C߳ݢ,@Z#Hzڇ*iL^}*M&_"X@aQTS/^K-n]űQ76!2ܚ)>/`Rk)˽KSP`BV+$%÷2EVD]}Qa%>72]WūWtQTIלI,v!O9~?bE2vU16@dD3Y!I9b6JcSͪ,WU6iaGSY+~8ʆ 3KV/cڔYS\:RVn-CZW)XHXʁM xfk~lg6IyaiL+$b6fҜP 5-߀m| M*K!^7Vr*Lhim] Žގ؋e֮}p-[U=hSuv☱BdfEUT46.3䗳#㖮\rJ~!˔hkk6kmjjo5`LăƔ^U~g.5Rb j F2=v뭵޵fkiHkG?ށ? kkNvXWT@WZ|onlLVkvwv)QxYukK>?Qyё)(Yޟ+B<ɬ"o,eë#7F}.76Ƅ˖'Ȉȉġ0w_D _ Ouq à_= q^R9[# bd[4l~gs…F-q![F?e.s`L l4V[P&*KMpuqW߄sp5ELn4o#HMoZY%g\՝MHuH&uZsDžrċXr-u g0)1V?r_NWMh%E8W3*cպrtgv}LSL~F>[n,^ou*]>-W{Wڮl1;VB~_DXwIFYW΀qL Ad(q"Ŋąq#ǎ? )r$ɒ&OLr%˖._Œ)s&͚6o8D 4(FmBj#PNC*WTRʪթP>JѲQ [ -+w.ݺvͫw/߾+6䉠PԖ]JyklӢHtVz5֮_Î-{vG \+ZtQWGu*կ"K~.:(酟,};޿?GBgԀ}V7a% fWFW" $O>b%%_S0bR2ա )e0`umt2آ/It[YF9Ua}`h#biv+ؤOB!e7$]D+j ]ieFNYgf Fns!,. H*\ȰÇ#JLX_ŋ-ıǏ CIF'+xė0cʜI͛8sɳϟ@ J4 KT)PJJիXFkү'UlƢhӪ]˶۷pʝK7bGxrnBMJ֦QWP7n+Ҥ3k̹ϠC\ʒ#R%N j뾲N5_ٶ_ݭ[߭.̵(&PI+Nسk|WiUQGj{ᩥ|}=IFe݁& 6]H-kUA5|yrVA&d<(4h#KKH"djEOwFJ?bҖ' 8[^&E3hl$@r$Jk9Йcfb)蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸뮼+k&6,]=+qTHUcn^r-^Ե#%ݻ+/MFKe-)mGsre'k0K wm#}ܰl榋0/֋|/31 VGwd$!tHGM3&w hQוauYc@ Glokk{x'w߀n8-G[1ͮӒCb✳@z " (꬛N 0w=J 0<[(} s$r1#WwC,v|R"|2üw4\} ӯ= ((@p`Q;oi1^lf5mms^ٲg|z+.M]\hP|8P- F}cG2 ]Abu>AS!>UшL>P. ԕьsG6э {$9Ӡ2x34O36AHjΐ`C1P8<1Jb &ANz(%SAR-VJV(0f9KYe.X|1V9bd%]rw !9^6=t^Ũ#;ߋҗ/)yqyEINo VERM.(C^#Ň7 &0aGB&|g[7{skXnl@iFVPbKQqjs6q[헰LrAH6԰iKȜyNQg홁hT QWFTn x`QGN:Ȗ`1]GR:^"AF`(xZ@Eڷ>fc5Mb-V/cbjv7ބl;CS<: <؄V$=E6< 4 ,Nw{ 1W-rgpsqxx:z7d8b`bGzgJgz$aFb [k @SGCI#|"|0 a6b6Su!%f"of=XHJP^k'~uvooFlwwww$CX^c(&s qFiDfqq%Wa*_bsb4q[9ƀ&p@p;GQF?FMm*x,ϕG5]#]f\4S|fw1hVgxoBHo8E^o'wspiw(x]s-_00v]sz芉Gq귊>5xx'kx;pTm;78č\DZ.GȈ=RӂOB6gX^ux?vwUa"F`yzHJziOUz P Ր NNĐd Nz4TIMzi19O%IO Myy&^?kD:2$RRu8,m.a |4c?xc77}ӧ@5I_b$b;IJ(O eLR%XdK4LZ K{9KEKuKPY|9OXL4PT[Lv9PKL~iUXKXKXR} Tj9 YJ2JkH?0AfU1KQR`V]2?6bSf31"a]y8hvz A ;h:04m9vbԛ򉄶n;9ywi::FCW{wmXG6.#4(ɔ0<Bc@$$s6 j]ͷE&2/AJ)Ps#(HOS<\/?A>@p M:I [˃_ڥQZaV*ZZh}eQrZF:-e+SY?HCJt2PRMɧwJ9 uvJZ u7C67Sd??ĺ9=X42Fr2 A5Ge6sJI3/@/=ZwE٢p.#:ZzZe"+k Ae1k{ ұK-"$;%&;),۲"02۱A6Ժ>;C[`pJJPQ N[WkTKZ\{_^[L+O[c+^lJ۴W IKSx{zK|kvnT+{ b T K[ ۹ p`[{[K;k`>ۻk۹{˸ n9r;Cģ?[!E۷IIPM ;+Y@{O۾۾;kO컾\̾ R;U<\O ߰\P$+l`01v4|5 4,;|>6B`@`pWp`JE|FJ<8,1,+ [ _c{bj<5Zܻr,vM /xM M ;ȃ@ȈKMɈLȌ;\k[O +yʨ\ʥ< ˲ ?¸ ˸l ˼˰ `Ɛ̼ Ӭ pͰŌ|ެ , Lκ  θκ@\ ߠʼ ]ƴ=-,klٻBoLoܴo,$,⠶vʨ3- lv1ʩll?ԘR+BMD.-`M-/PM=˼, ̳<̼|ÜOe2Z 0p|ruۤ ^ L۽ n۽ Gڥң 7MLeVUW]mMN)]!ѳN=BJ" ދ{l0~[ԝ\ԓTVT+0Ԍ.=9N2$bkDF>ݷM]pa>$|ް` .ʮ"v n.L+( a s^n{" nѠ=ǯ/n=ʡ K?g ?O}R{G0,NܴnV=R,'rsi.;ͮn0nȾg~h.`,tnu hlmLk҈Ny,顾ڡN✬>ALklO~)?jR{}ʐV*_ }=r mzfym,smro-ϸS_Yz znٛmN9n>w?l 2~?3.$~ۮ.PM =̝)—/RN= 6H]&!o !,;4F:~ 9I(UtdΤ`M7+٬tsRϟ? WQI.eSQNZUYnWI'{Pٳf͖]q"KAx߿wF}mŃ#}R M +6ogS&-zpM`1Odn-Am'{7l^4F7q/-s; }@(nݻʝl^<),޽L3iN=?p@ 4@,~rk-Ϣ결Bʰ8d,C4$3qRS0Lܬ q<a+F`,1{̵Zl6vsN*%Tr%,DIDڨ /LiMz2˘i'/#JA@tPB 5ЮI2AG2 + 2A10 3\ EJDq0< 1R1TU1VuMk1F<3׻~ )[cirٕi*EN=\7)[lCӠ/;M73>:kNt'Q~_*x,ԂKaߢC )kCDZl6C͢'>.u3K5ACc*\~",f^Qe؜ٚ`ao^'vsn:#׹:]2Ӯ7 kjjڕO:ės` 7pOʬuJ+PJ1.Ӌx@Ս;{T2lBMVknXk|Woh*hϭIݚwt3Lž 綟n&)uUɕT߾7(?#G~~+!k1(D)Β%P dK(L> X+er*%P qJXB4$4!\,Nz mr2lT^C PxD$IL8 ':q;<iaZ^X,N^TxF4qC(F6acxG>JRԚ@U&jjUzդbCNaUR^OUFnkUk[ַA k%7zW"4iCWMb&>ab>*'lb-[PlYD{FKӚ+NhTZԪv :[斲no᧨t\Lo3A[ddu/y]HbWӝn^/=,Pc"+\o{^ݭo[և~)X;͇&~o2+}6|`Ӣ10 g>a0-k/0q{bi' 80qnX$ϱ}cr[ȱN^*wHB2GNrEd %\leU½dV9'_~e9L7ͪwȾ6'{ %0>:^09}3It4'zϼg6v;M 7nߛ/9W'3|D,O|D:Sb+ݮ{Q(pb{·OM+>Mi6m9&7vmko 6@t֍n[Y=7pWks7l6Z8WZɴi8ގx+o;흏;>Kq;"wDvw `:C^<>'PHzӛnPR @qug]['@ ]b/'JP WkغAgGC: y '} '~?|+^C+?y[^1{ Ox|q[}j>x0~a;I`ŏ^3P| _+D_/~'?~/Ɨ}p~O?p~g@-@Ԃ `@?T(^(4@rPp@|@K:H:P:Pl;8;;C; ?:d3@{,ɖH0 0хhԅoA!DAB"D&lB&(D\*d+B*Ѕ.B' C1.Êo@È06H4<(`s1 irC%4C&BD|Š ЅD$HHDI$JDLDL$MKD\E\R,EGL0TË n;9uk79t˹ZȹZş9`4#Fc::fdF@Ư4S l\ KAoT;I0M wi-mQ .qvxlyGy|C}6G~G~ Hmȁ,ǒȖlHtHp)p!CTC$C!A!43LC|C6\I6[ho\AePIoǓ41951ut-g+6g;J:(JgCFgW#t:kFK jƲ;˰+`;F<:6,1FKt3K=L,L[숽}cLż;̻{=\<;;=;[M#􎴱o8؄M{Ͳ9M]M쎴ٸ8-LJANBt#JW0Jb4F:dJJ :h˲,K$LOm2-,i!ޣ "(>]PP<E%Q$}QG<ͲQLS;LöRk6k,ӞEdNlS7N$;.KZC|lԍI,B+ԅ*/dTHmTXEIHFT\*LT5LCBDB7H;,lÍp&DVe1C:$O]CB,BME]U1M*TFTFM%_UgmgMEVdeJ]C?lCP֊eXbɚ"TAvĒ!;҂;Jhs6lNWWW X;;S5˱CKƶT=MH qkw5eȀlGX .G|Ǔe.nqiׅG,CtŚH:|$TCoA6CQ蚃`1H|Idǖ%ـG/:xfCXՊ8~=N8NJh X:[ MXƵmF+؉e$U:;D J\,a- ]5ٓ`w xׄMحKUE7ٱBYrCUݵH[UTڿP@{^AM  ZYړϪӲWWi+ ۻU7<JsNJʫS%;5*ܩkF|Dž=%/4;kXq Ͳ`qFҿQ(<f PP 9 MY᮹ҩ瀛@ݎUa&$݅ H3 Q +Q%Q M 4NaA/^D;Q(b0>L˴7z8Ycr9й]4:Z0dBF 5ed6e|Ӭξ$MiEr`1 =LMSMVϋ<[QMZ΀kkkfngogr&gpA0s+9gyF?zg;g;CοKZ^@ @:ddd·:h:lOjdƲX``K&9 8*Jt J5 KHCUS 4Iwě,j-j, 1I6j+IG[ vj=u,A}w-}Ȟ> raLض6a8ʢ$ʦ[gWSdNK.AiFO%i>Tz*%zl("K."˾",Z̾"lQQLHmn&mZPmlͶѮl̾lm˞lml~NnFnfnn^nl^nlPmo.mm6m&mF^mҶ^oٶ.onnnnL8K8{9LXIpMxL8 p q.@p:M"bZlW#aB#^q%#g5&qsq!G&"'#r[?ZR##Y2%?"r&&,r.ץ"]j w%/s34OsЄ3s8s9s:s;ss?s@K5C/tD'!¢5AjIt҉HttLtI+FPtR9tEXAo{juYuYO+ .\ω<.2,sA.Scs"@ -)Y8SvHӛAJxCC-AK;щ)uG5s.wuuGR3wwxyzA)wG.xS,\hh_x@˹Mj-sE#x2x2[+wZw#ԓ`Oyr7,RYm?J/q _y|ArM;I0<+?SE,-UzβĢy.2{'0&wwLC1ozjA`Qj~j{xjxj`͍0_X:w+&|tX}$xغ`̼O{M{ڌiI޾cGC~F0Z[]aY6X'?F2,ʤ&m26RIcʬeʴcgv h`]m`5ذ?BPO>.7OJT*n8Ub9ҧSn:ڷs;Ǔ/ox㓊#( 7!C?_8`EW?l0׀ : .H`bab(N upYx"&`x7"u (\-~藄8^^>θW.ߌ墆DхTR)Kja5Zyi9`pn`Ck0Jɟ6(\p GrΡ(J:)Zz) @yjPA -J~ EORY ˂p 8剸6k4>9!5sլ-򊖋n-Y]VY.Q.QF^+7Vko"jW lbfיv𝼽nZ[%q:qf:2%|2)g)A0*ߩ ZAѲqZ"TOLAS=ETSFH/=MBXk}!`^HdQ\_6MFSPLݍwG75SRn-c1V ~Kr߶8vki6Q~$|^%5z*>;~̥{~S^=XV{tLLdC%V%ݔI}ae=.r#\kɇ/Yk, H'y%UR@:*F_tu{ _g6dkIC‹~*šis\>96nݰp! _Ȩ!Aƨஇ>!HNwΒ'?ّt-j5HX**kQ(D#QTjeX5*t#K_ި$-IZY.++FY,8@걐0.J\l[٪ѫr*#"ubE0$ s;e QURb|o BB8B%.s]>Gw ըJw)!~'V΄`IMR&kFIAfF襜;;i-B PI -L'XmY\m%4pK[\<^`qE@y 5 +(jцr +#ql(v%Lc*әZe]BU* gI}fF3Vс$%K5uJ5TrU T\b2o[3g-PCԔ+! Gdžr>M/=-3Ǧ5|DubD3^0n s$fC`CV3®h ZGw>< 4#fia泶/_bh=stuK4Z\.!؄ TaHŽz7,Aj _2ь$ KHS3i_XӴ4w _ 5AS5*vjWӺֳQ-]Ա? Q|ؠ.6-viR[أളiQ(Ҷ.imKۣpmkc[ζfϮvy[{Ԗ6^z׿uulӚoᚎ4+m ;ыV=H8C~_%Ot5NFO|-g9_sG8]\>y+.t;DzOnqJg:}S}Qz%MGeSX?7%s!;.wtuݱw?;߯w}{ᡓwY< /?<橓ws ."xWĔ^u=CԳ_UӾ=s_|/CKϞߛ\)+.c>aSֿ>?Dh٧K_\o:ɵɓ?^  tL6b TvKUg]`rH P `&` E묠  搢@ g ڠ BT- }-_<@@H!Fz^aBQ0 N )ffْa ! TǨPI@x a!-z ""J!"#>b5BL|QQe&'fbD_{|%Q,a^j}++:_-Th- ."0 #$1j*2Vؙ36cו4FcM#M-`Za#5B5:#'̐]"2" ʡa.=Zg1b;?b^)-hPDE׸vWxM$ЈwYai(FjFe(I Jd$J؀K(L$(LMΤNM¤ BPQP QP%SP2%RLN%U (X0PUUVfW J, `Ze.Q`+VGbGFdhh(pp  B b&fbcdfdFdfffgvg~&hzf-th2i&j&Ħll2&nf*--gpog*q'1gs 't"'t.gtVgr&vf/BQvw~gQTRTZ%(|T'`X`. ['}[,&E)E 򔅗a)ND*b(heRΤLf)UdMV%(y^zF'!"a}@"9}$3;U5 ]8˟.|à*2.$ *.4*"R[GNԜddIɈh›*JdS S*Lʪ*Lªd)Tf)jvLUvßWj%PC{V\k5vT6 S1Vtѕ)_)! ҡkXINɔ8gmXP@/|hf/h4싶(TmZnr&t20sV't 'uނLgʊ"nn&”wOҪTykX>+Z+o&Қ~稌c0!ѹiπ V 輬?zמEh rElD@F*jĢhĦ&źh-ئ&-m100 .".@1@BBnj@>ᶂFn18nrCɾ,vf6)xF'zNV&+5\%{gXeo|.nNn 'Gӹ2Ql]&Տ|UR5W5UUKD0`I t.A6B3RnVZ+ɧH?|)1e'- 6ʞ:-5BhiGj:jj+*,-~5(,X"nGq7EIrds7wLb*[j6v2R0+cEoq{Fn"ec :*y1<9gs;69F=Fy?*o99ǹ9׹9_J09=a{.벞i$y7`197 'Twz)*DkJ||VA9Tb#O̰:`AYe 6< s{2>3Q'g7o1oh4zwcouXEa˨$z)'aN̻;̸z9ݜN |{{̤: M+IF'r`o|W|cxTV[>>g~h^7>i0>h;oK1ܺBC탱?zDO+ 4XD% sbD)VxcF9vdH#I4yeJ++*TeLD0fN;wi 1@5 RXK67oʦeWV[Rk׬`me֨*ڮ`b{V[`ptm&.; $K6`ǀ˵0k6نFpE6@a vl„a'۸kƭvn۹7^` +tztөW~{v2e.&O>yD@>hz+utoKo?`Þ"@ o> \J $1o돲B?G4q lmPqISqU%FHsGP\9•ք-HP!8&?q'ҸBNOjH.02'͘jʩh*'SܓC# 3QBM |(F%H)PF4QEC>EW4 xLRU]TYxWreRO W 2H asY(ZnUjlΟ|&7뜓Nt7 zj~w t8#uF a eS W7a7^1J/ϒ,Rj7ec]Zo5_mny؂|hZ焂zgfΟ}ꨥj\; ܮ[(;d(J )pmamVƖnXo2|B$g][V5V][=U\ ]_}蜃.zusصTeZi}Z'k9 lTV5uB)󾽢޽ˇ{˯^rGQTD~UgVZuVZs_WO KZ*Ϡu8iM˝ӂWA ^TK8&k=6wIO'Y w/Kd2G"L^6!t~?FUD#iE, `dӸ‰N߬fe]pgQ $A jiT5&rM 􆒲;ꈒd|,c @9ȁ1LaKX9HB Q Ba&An"@ VK*S4ԧ|`,k!K`<nyZ0kыrHf( 0ф k^SPs nE1wl8YNl\+OT̎'4YFDƏ#0l#dV}j Be (=2Qء ZQOҨ`W^,G R¥D2C1Sg"дA(vSP⧬iPZTlFIJRs>Qt$'8Nծb^$hQVN;LVɄ$^ Ld»nn+랷.z͛އ@B|{9͵~Ϩ>ĿD[[8#oDZ<fv:a o$׆%.ˤ!I\my\yH\f""hf7q\g8K0 g!zCgCfEhG?v} S)ZI[Ґִ?{i2~6i#]jRJ -8Gjڙ՛9Iף5hiMk :ۯm_J8[ajA k HZwm=n7T*Mw973}*6Tw4;lxI8PNy8r"9rb fV}p;<-W8(^nl|&NɋT|\ yAby*t<8[ԟG5pa֜=Yi?$(5Nܑ}()F 6$'{I{׷P.?X&ͳ79/|NqӋ˛L3.;=7q EWz׳^;y;}oxN ꆊ& 1')#5v'M1ʡ s$rXrnnjQ2$kfy戄|ȈPqP.R33.a4h@) 1+'y %7r$O%y/{Pr("\02R2:']Ro%KbS7X2V0'Q1"P `ycݒs IKh+s$qê SօB=JHCE5\DE\L~DN|dH$nR aP4$5E01tE12X -GT)1Qas-)CsQ!56]l3iTQo!c0p+zGS݊9EkؐV1: (4TOdEX-Y1Y[dEGT4G qUꮊ-xjc S50DRF]5K4J/oPU3E;4T=5m8oQunN  [Q=ahB]TF7O &8ͯV>B(VS"&6 '=FhyuC瘎 4V455@S4FSnqPwn2C9SNbRbT5Eu3/^5%D1PAe4{Xkc9A}R0EvJ TU,c,ɝV4tDH3,C.2.]2CFJ IC rk ?tC?W]VOn!ɷUa Z$Z$x@a?9zoa)gZiqwڤ]:Z`/{a3 .7 zoM^R'yUUy7@p8Lm;P sŸXzZU&YTWtUgSeUc}M/raIx c8FcT4B4PՕ{j{q EN/i/{,lU)QJ|*e~XwZ`+|,+ۼۻJ˛fⷔHςdsGѰwtG$ث!߫˽ + k%A+*=!\ "H7\˻L|#5\/b[Y"oܺ|Lȩr+\Kɧl]14͌mWw \ǜ) оd˻<<|ͅ :ϫ] }mЪkU+L83]1]kۘ|ymiՑC9`Ye kXb]9%_e}'ҋj\/ƐeMǦM$m+Nyk0xx2+뷄цկv H@.8` p)U`{wvdqXBkvevngiҎ(I~䧞D%ߚ53>5?9ʙ)H_/ X/!eZ51s_/Vg^spoT6ͬ90ٺi9Щ&GqgCĞ` %RTiSP^Qe}PN* dp ᭅ :1e<4dxѢŊʕeLA&^B 4hC1T(Pl(m4*(aR~bJOԲ~5ر[K (ҧ̢6-۴tڭ/޽| 8 >8Ō;~ 9ɔOt2͓lٳ>m,թ7s ֆ kϦ7tm͎p;Ǔ7`z|uzٱU݀43}Qzپg|hT*|?騑BCT(W%ekues:s>[6If-[hG[f歗AUYm]u[ &k`m)orkw}+~/G@%Sr"CKȩ6(-xPz'KqR'{ZXf"4ӌxsN{?=-E#ɚ8J|_Km<?O+6Xo?!L]7ި 8SRrz\ɧ)󛬪IEb0"Y -uAҺԽu/ Kw@L낶)[N$-I,TҜԚIa g-MNk#_P!T)y*Tbf(R6EQ)}SW-S\ħP+i$6HEiij; q|3Y!5KIIb &a.ybRkK/~2o e-RLIR G=6G2oBe,>]d$FW ocX[E4`ljsĂ $D"!ј4N4OZb܄IxʓN/ًM֩(t;sZb;6QBoP"6KZf%YHGbјPtDrQfT&+MI]R8&MtT6)~~D1dH9UAD DKSuTUZ3L늄NUkId]g a$yrkMjj+sW6ԩchg>N_ T !ab$QIG!Y$HHRYht*Ae?ٔbT&0} E_ZQ8ĥ )PZP.OA^*lca\ wx\o£E%J7xcn]Zhwܥ8|!톗/^C]/ugsEDB+Ew; dSH`-%`p4x-pyoyU kXSK^4kw$.6'-/(ĊY* $PLx6l3{ӝ&lk{ p{.qn o箷Mf.=/8髣!~::о[Yf"e;x*$/Odfwgx_N/9rsS܁7'| Ku+Q g:}K} ?(x\1}Gc_B:X>+}y˽6d8'2Fӻg7vꍓZ <_=+wE3ta4U/Tވ̯Q<ꪲ@_幫~^r=yG<#FF},Ӝv0ZtnC[/Mr$/wI$JoCBJV8!PH(՗yEs)z?!Fy!—F) #M?"{}7i4I Oy2>@}Ya0>p IP PP}Qu eYeZ1Χ0[EG[%i‰ *khuAprH΢I$II=t/Q ę9ER0}ACJACL^`rqei Am.fd+\G:6d]cJc` 0 . UbTFbE sS;#'doR%g*r6ejBJuwynv:wB+a:`NTƨvr&a\ f=k""vdpqa:ʆ}fȪ!:m *J%׫~n&m3bV9՚pldڭʫ:oJV:ɖjeʬZlкjpNpf!sگ ' n!qk_hzhF{:gǍoE{kZfhZi˲;f1T`G597 VQl6MlZsZGxUN~'SH>H~XKNzwcxCssiksWhi tH_3[zc1q,MUA L`/󲳊ʠ"~븎|w4uH4H_1]U43(KT_Cku!3r`@x[ф[_Kq*ң03waGF!+Gjn"jKpQG M5t d&"yJF;#"CExK2ˆ ̀ y2<۾Jm84 ruK<ȼK<ؼ5EЛS۵]6'qF(8Wő}KItSJWۨ1c 'g"jQ5hhx,a LjW"*#_2GB];+7[A:2T!!°8ȣ*3``p|jeeӒVDi's6o'!ҙqWvuWż&eI#zWY yAXǀ:STZ Yp +q U ,-S!1  ϯR0U/RSYXeX Z#!P0%1Қ"uZKiQ5 89U*I~0+AoWrx[%BHNVWm˽ ^ W^\ cm\k`ljoMoW!v {}ݝ흃@؂M؇} ؉؇ZRQ] ,} 'qYZ+8SMR< ѪUQ6UR垕]Y *15, AY* qܼ%)}1 (EϟK@e TE&l_c yqeʩ;Xr8$FB.CT2%N&V Xn@  % )4e5-LW4u&p"'q'  D%lE+:SK D}>L)>9Fb($8>[=|$L1K> ڷ1q A61"uN ҨE(B!Fy EUz5Fȝk嫦me؊[2P% T2a-X2&A ໡ V%>-قIN"'Ǟɾ=7<=Fd9s!G0Lh$0+ *#(N?ݾӌsI8Έ )0T_y7_q>WĹz?)¹" K() #<8YK={s›߁Ua'@TȔŜ rĔM~q¨6Tb/Zg>փ>@`@n=qMD/t}`/ 9dtK*)"OaN?sEiTo[yz}iǢGn~/)WI2ΜO#"d}ֺP`@E__pEOn]/o0_/AVof"6̙Gxp.<(j_|J0j>DP( 6PD C1*b7j$P%IXIQP2TPRѤyT3KSIGHr%JH:%rP1^iHBM:O4NtTK.ӌ֝hnʦ]p!BP "L)1bƊ?J?U*s%ΝUZhҥMFZj֭];tIhk nÉCnrc?;ѫÂe+v{WfwqY.\⿏u޽xgf,ecN;T`9ct96@nW ]C 71 eĄ9h {!H"**s!ǔ裎|/ H!f D-'z/ 1'Zɬ4B$Ԓ+* KRͶh%,+ KȠ:Ѡ&: 46SO?5FJtmx7ߌ-V䦻5\W^:_@_)5B Zc.VBWCk7kVC Е#l( s]I#2*QE'ʢ!abA髣r+V =2btPz̄`A?^nZ3dra߆.%{D/?"@~ rQUdT1T J/cz25PjΔTj+6TOE7&[Ageh]m}׺ev[ `)j-d ur srɍr=W2#r]%1m_\$~av6scXw&?й0YiLj^ᅧC7+eK<{_^a:Ĉxޒr41IvO.uLI-Sg(5ЁiL5R} ʆ61gB`6 p',\ foA^h1t! a Ұ/!{:<ޒX8ANrELщbEW p_E/#YA %e9Ff:ю6ASG:`~#@q# oE* E$IJ>$$G"ғ4$PHOєz!Ii8ڤt) CvDd+YOM7Hb1!J.3D%1Tdc( g(B"@KpT`չNv&kLn⩙T`98"Ԣ8PЈH PⰡ UBo*RԢN\59"X xdDi/ZliKtsf1Hgђ*3Gd3}JclS `T*ъfTSVL0: c㬑tPKJLe!uIGk4y'hү_X^c%%k׺BOlY:YM&~+#Jbš+J]*j49[4 mQ$P4 pUq7R4Т No]@-vKv85Nq7pKnmrO o~ WW_Y?-,20H-R:`=X!0k!3o;v O_a#WWzֵتug]cϩvo}X7m2Nf~K=ww2Nk2=v7|%?2^Q_ -OyvNg9~^97yַ}e?{}u{~?|G~|7χ~?}W~}w?~Gտ~?$4DTdt $4DTdt !$"4#D$T%d&t'()*+,-./01$243D4T5d6t789:;<=>?D2A4BDDBTC\DdDKX<{DGFJDL@D,;f9P5Q̶SD)2T+;I<9U&y !lM  ռmȑ 1;:tP9-)۱Im D G!HhBBM,P-RQ2 8HF0$0!S *۸#Mt $sP&} ؼIAY?4 5 5S9l`eG)ΥRti4JYYNK0߼GCDbP5TVTR+ x,C$d**IJ*jf:*Rj%iSM%k%Դ,Id Ua,<k ,ɑta ̀%S"XĢV IU|ԛēWz=TT:JOU9Ka@e2NE2&J22%M1\U;PD|6] 0Wl0e5_-5߃_p:GΎ$:Ox^O|;rQџ&T ŀûX `N `A5xàRsa)Ua^AE̥aNW@DÌsVٟQHjLe .'e`"1pSa}Q IbM31 :46FrrYPR9NYcU42U%c5G?1BtP\_P笊{@1bCn¯!@kN" e:MOS_K>P=>ട'l+Ş+L+8r{{ fk5dVHfffIfԈ]k>\ڂ|DnXnDeelAE;Ep&mv6fugp縭Xr^BJT}FvF硵guĝ5EemyVBZ|NBsfh=P{Jgzfu#L[V[vC:i/.5o^[mGfis6Weg>jzZ%Լ-v鬆E6暎&64ڴGTٳAadkTNkk fFk6lUmhEvlva4Uz^vCD,ܮBA1St=#kϓ2<ږ(&ɓ nt5qb;1L^6wZENd >o@$PoՐ]o%lVV YCpXe GmwYpB0یZFo^Ȍ@GyOUpH_?nZ+퓎e).6{YHs%ǔH?wkqë6"?w wfsGO_ȏ{Usz{ǻzu z|hqڄ'V=Ol׺TN}_}}+|%xKH3E %U}ҿĠڥSo_xƒ_oRpRM ?0'q_P+>Tɟ@ ۓTvX"p1D5y$^Pش'C0|2"6#+(̇%"(7~9渣8Ȓ^yI&ؤOBu9ԑC1%IWS OwbK.1 n&#v!nyn hפּL(רWB$RZv%9h @J.ҩdRSY,Ih*+K+g嵚dB\byܥ2۬ϊ\QqIajC*MB}" SXﯹRBj>](J\pF$p%G(O,̉'x"h1La7]riE\7Zo o%"(|WԸ7ԗ=mPDKH"\gMצT&ZO3w{'suu*Awxש+6S~҂c'w|"z(RP:飫:묓"쭯~Jz(d|38+t]eC=]Fc-m ܒ- ~(㣴$5b2KxF%~P*^ =rkK<$5P TE?z*r8ʟs?WF˒$3̬`Sz%12neėf)L*iP؈0+3!vQ+t#iGUr|&?O Z,MaR%ySڍc E4J3^FUS#^0Yr\)K36*scgbQ/Nq8j-KeV!lZzKPԘ$UQ4Z"Q֫aEĚDa"CkId5x<[yT M4QxXL_[`G*[],ciN,euu2xP>lf娒KGZ]-kAi6EbT;ԀZ5b®9OB.qk"7].s;@8ّntk87ݮl67A o7xI%Ubm{7U,wk >|QZW}|n[7~WM0{C:L Yom. KZG8*n͉a SX1q &&wW/w+`׽EVvRJ OZ2eb kXS]$VM6ԨD;2`6㗇a ̾[,#fZBI0F3+7Co;m3; o_d*m-lW43gz:N1rb^5}"Ds];ƒmmxYն7ENO#Rù6Wneܟ)~ev{kswZ8j΢0',x&>9Y8W F|aT60svzibUo>={?7h?>WO~W"h-wc߾33]mc:<?FW?7[po?ٯqFKG_N_V~jٟ ظX%"` QaZͩΙQiPf - `A_@Hu`ԝ ߂5^ 2M *"sn ZˬVIZ`baZa\hՖ-~[fa :! eN`9ZU q 2bTY"aݶUb!a#z"X$T~!n!$M f"''"(2`"a)`Š_, cm1*#t0:c4ҋŸɊ|Od I5c=c9NiTL8xB< ɻc>c?c,#18Y@Fr?*$?4W^4C"FdLEC>$XDO\uZ&μTQ |OTȝV R$ɑ&S\ɒI0cʔIRɋ8sɳϟ@ JѣHr9GM+9-QԫRRuW`Kٳau sRF&Kݻx˷1M8ҧVU>F idye%.O:u%J^ͺװc%pVw,8w&8sɣC'+jlI%DMڮ\ËOyk,{7b⹃[m>|s#ߏ=gTՁ]v j5F(je4F=^o-Vbd$hXYFZ#a`\188<t$ $&z! RL/ޒ*DR{!4'Yy%JN%JOIefjlf_A# AsҹPi'CyYP|Zh案&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸뮼+k&6$lele-ܖ0Nk.GIBѼ+o9+/G{LT + qc K g;+# (n,벽0rz4W(*Gۨ]]FEݴDB4E#|t_=Uc}q\-dZh}qhlMm-tmwc\",Lzl$Nq}€8(C.W.yS~X9{?O$3`~d~G-Uhu .uن{Nov/k{TT O<'O6 0؈'xCN:K^n.8mc];l|[– `U\ 2JjAT<핦avM|d;(9jDn !Jn|kC-qS67OOQqj̄Nw`D51FjfL_("xH7qr,9ʑyb}L Sq B-yc4ǀd11I`d$1yI`Pp#3 IFrX1E*Ҕ `%#eS|%, җ )Ab,f/y ҙ-d9K\ %4/u#1> 08LD-RJ^2x.7iMkJӜ6C<)PJSFiQI:ՓPE%5@SƔ|)L-iIj$$)9IPcge12)FteeXJVuR:S;+W=VUcM,bz׶խ:}Yc#>}(AGIJQ@j( p\̶Fn+J pȾ|¸,P(wob/V>; /zt̾0kg\Ϡv.L5ُv>Q$n g~j[,ntYlF315;u7~_™|{!_/7"[=PX:^檝`[5%{Jr++3[ 3låHm\~s&sٍ܊cg.p-4o۞os}xLeY_aӝu.xsO}D糢݄/hsxͮvŭnrbHs}'۹M'q.g[޼:>7u >0x~֗;{ w%gss|N+iN 5'׶ms+$#LVk8_{mXmXmX{۷Ƨ_awYƀ'wg|ioxFb^ 6`օ`5]"aƷ{nfVzb#~l23G/1a~1t;616%FlDvX&tvnVgg7ofwuUvׅ7ppg^`g`oY8q]k8g&j`6jDwgfqb悗>>C#Z#Pc/w2>(5>=rSdhDd4}C{F|pviWwL%eHtN&ՊLYvwLqg_J(YԊ}HHDNd_i7_KȊtRqNwvHc95>&0B?;@@C[@[LnHva}tL|oV,RHIW H$TIiTd%VkuM I%KhNKwUV״RIiX U$XI4YIpVɑy 1KD G{:4?#4O~BUr`; D6Vy5dg9ysÎ9bD>ODS>:CyCMTh+F?isAԶOւiY9棗YE3P(<^R)@_3Yx"S~cd&;<2)C4/? q7S3#0Z9OR=s4 6C0ٙ=R 9)ݙɝPPɝyY噞33̜B9-/Ơ H\l|wӟCDq{Lŭč>Ԋ<|l+vŶ vű۝PN[Vn+;^N{؇؊؝(Ѥ|#^ ~کڴlƼ#Ҵ 3}~!c{lc+'^ʼmK, ΙN<.mOJnI^ C I^KݽT`+_ ]ߢoJ:\=NN$mtƜ~ގ=d)gìHzܛ^͝^,эc}QΦWLn,\|V׊\+"/a&3˫>):=p>~=ڰ @B,|S.׌8>\O|=ο=l ֤~ivc/v]xMT;m*-)-jm>]9B~c; 0d;D)\5]H+޸=͝<:-d_ͽ Kݴ+O_e-]= ~?. bΩ)}]+ʜ ~_۪4! M'{i3gˣO3Q߶ŪjTZ+:묫+p-O jJ.+ 0+&1lN\l4[tEcqF)c[qf{5fr-7DꪋN)JrK.r,< ,Ȥ 2uR/))y <)>j'PDcEMQHTToto*;tM;HK5)UXK1S\F\suW^{ERX\ baG *OTv6݂;QHl{2K[EOB2L,Ѵ&|y{I>8|_}q>:'>JJҊ0b+Vp%>cI%64- 59 +lCX_qD 0HfsygD3,ŠYCXdi^LiOcik Hut6gMG-٬zl&8Mm~x\농GM|oZ{ݦ6YW|K7q#|Mr+I4\r|r #]>裉uc}vڃ Â}ix6vi[ݕfyOM/1EؐnP4|XUO]ub||S\ak=Yg?utڧ?N d`3H2 t"ǔ}< ѐv#kdBP+da ]BP3a mxCP;a}C QC$bxD$FV+ZD[EщQje vnD0Q"̸2idݨF8ʛ^'<$3E@CJj<^dE!h,(#F9>z4iI?:Be)}`Z Qd_dBNS5)>*PvjKRTZ uQe*R!W.S{! UiNVeՙ(f5Vjh$dE:lVyM_DW0 3  1ӁN.q,4+7YUbp|ZT~V'i T66'k ƞu/*OBTeh2BSqT{B5]n47٠.iz%exW좻T 2ͪsH.^/}HAQ27_xQ|`;*o)LSQ}T3a팊\^Ti RƇ0,x nc ?&| #BCpl+[rx3fRΠPԐf7grsc:g@{sAY gBЅf;9s- i9Spv.(s8RWiqJ}P@g;Dҗ C׻®y+׾Ƶ}A >p} g6}kY۽(aOָʖuAqP EݰnX"օ.)o[#~tAp]ۻޙE+>qG\ k 'y0EOUR\rKHc^S>rۛx#@B^t'| '@қN?]S:~u"[{o FKn[5zbF̀]:c~ws[@jQV]Rx#b|xE{W ?A/Kb2y,Uʂy G_ޱ7,޽xy|9_|{OS8Uڝ?vtf}IJ+ 3(UiFqZ'?(UCGԢjà^'~6'bu L3kV3J54IN12l3?P˰/tB3Ax&Wx>l^*C>* 4DY3 7]г93Y =#!@lfCCXB&5;#t )A 4CsDC HAO _r%:/Y>K=v˷|۸oe8E}9]E9۹ZxK7[;Ʋ÷z#|Oi[Ʈ^#oC8X=Y\[w G\8w\GyzkP\G[TG[htL[7\!MpLr{ 9*fEh;A`֨:Ee;1Ֆ|Lxd^-UeͱIN ѾTW }]9 XXXZE؅=؅UX]XLL@QQL؍،Xu؉-ً؃Eي=YUXmٖٗMXYم圄YXXY٠%ڀ=Z=Z%Z]ڛ}چؗ}YeXZژڇXؕ؍XEؒX5Yدۋي}ZY|[!Ȅ֩U :"\ )\aǝ}  \\ * bԥ\=\ōɕ]a]Ѡ\]1] ^^-^=^M^]^m^}^(#9ڕ%2#`a0`I`V_b’`XڣY262"(J(VLIV fż*~Ґ~)a:(-F`*ݢ\_$`%&/6&)'L?~z+&a`BV1cv-r{`zN8>Y'RܦlR`_@z)Ob)b#jC'djB ;)}K+,z;Nla"-"RSFMja~*eڤRf(M3Nd"U Bs;++⬸s,XI˩3Ƌ5֚26gN1Vij5Vǜ֕>aVVp^VgkvahNNcj. jbŠ(B v` fZbZbifa>̰;}h5Sӊ.vAhA@\31?36n;&EQ3 Rĵ! @3#Cm732&5;Gc>mtrO(m.`#'RIY&Vɘ WuSWd`KukN\KuԽVMxnӛn)oWlWoǖNT9y78,Վ KR*{#pmWq.q/q.Ƒ'i粪;zmIɔL\e<=>tSaN+LN(?F_5I)&El,Qtʊp߻P9V7;pű;%s^C*c/> m?OtP0f&oKX>C5v3 4Vø6k>sB'C$tDRP=CmQB`LPu}PQJ\BCL"lESBvQ`BфC t3F-GN0+A88J(R`S#G,rqQjdh'niSZOkUDJW"w7v-$mClV4>C@t1'Q0o,luskB9Jvt?0CJ;ؑ>`Zxa>`!j8!!NȠ2x"X4x4ڈ78.A&X"ZDxbv4d:Xv@ ]إ@ 4@)tu a&C^{uy'yMͤN5t~ISa^{cxvbyFZ* *v趪jm۫ZZ1(o0Θmvn=`Vj [^`!^ $j뢐Njb2&3>Z\q7Aњ)x{{/ $;  9[89s8$:멻8쯻.p׮:;ﺓ>:;w>p}ի>}S}?>)?裏~OR?˿?'+πyU@;զ g/HAM&`mb.|! c(;u&aC'<sD9?e>= ()RVz'`b6E0 8)cҝil(9ұv#=t 99 < HC&\$$IAK5' r$Cz}RSNIC䑒 J)Yn$.mKypE`Zė/td.|1HS %&M<ljM܎qӂ 8#uSP,}~,Ԡ1XAy%@u9`R0A%Љ<N-05r$Ԡ(F/Q3 (DcyMEn&"XDpP't|d :iOx(*N>;,>=(vS.zXs^zhUU'*X]M2qwnxAz 3 VFok=ҥ`}5X#թŦ-Mr*dZ2eX3YDmKo蓝P: $jQj֣ʥqW62me [qTrd p#GPs pK]ꂢ Es+^%oy{^ _v' a䷿0@WV(ELsǙV%f#,ᖤrNOIvg Fq.I&R XCb 200x51qƃ1A F>2]dD^r}#OSfqZ` r-@1{̷`n yͷHs*g69gN-=Yǀ1g69νHšyP0ю~4mܷ(,~4'UNԦ  pɥYiWKE0l_`t*ظJ5ta;v,flckؠկY5&v6}`&M>7uE-xHE(zQ}߽hDߵ  {oFxk[ޯ|`}Өtꕯptړ)L ΍ѕk>'V.ptBNozңl1E7`ᘼWfTkkǮrʷ?Cq\mny]Wә>'BŋW(K+T],YoD]J3ڞ'O 5k/J+ b*#аf1zlnC׭aW<e82.vqbw7^[b&3Lh6 H3ßgot?=w<~B7x*x;/W0PC=QE<2=`f9ݔQESVrF=f< ZEY슸7ЊD F@JEr mp5aia101C1Ha-P0xj!@~!!h2YZEuW ZZb X1D (!A#T}^9\ ͙ޫZ圢X뵅[ UF d4c`칖S\k-ݠ-ꠈ r ra#5q0FZ(2:ZA) đC3^2 W0D^-QE,f5#cIՄZ:hi)SI&2u+e앢_Znex,k9tX.lt@qـF$t+IB$J Zwve\Lvcr\}d!P"B!#Ea:Z^#IScP}hO\bQ TTZWk +hEJ[ 9 fd"/#0^]ras yy6WxMMnO! (}CDD::w("US6M`L>SV.| `iƁT˧fJJTʸH o%Q s~sH=_t^1-\(C3Fcy'z*a3.f}ٝ7N|%mf6T.e晦ՔkZsk ʵ=Hh Yd\(hf~fhVhZ覘XX=Yؐ!^Iy٠YZ!a10܂ZߛZzi_66Z ~22bSQ8c>ʝ-dT^υ",7(áZC5B.j)2,7X-,XCWd]ftd(e b[  q_ns!q+uY(jw!a=2[9@yk27WaZd `!z9ibt++~\^Ď%X-+k뽦NȎkO0y(MUeDDD#O&t $pDƚ$|DnȎJ<6U?dBJ,dMi2aQhN.2,,丬Jc-,V&b!-i-FԶ+9R#]>"QR6"U-EԎ-ٖٞ-ڦڮ-۶۾-6)֭2BfU=mGFY+n~>5-OSh Mfijv.~ȜZ.UNV.fT@4ęs*nd~#/NV&RCUD0e5.VNg:}ZeTnro"Po/ީPdoZnn^V鹮~PI$B DBI J DwJ$J&A`;ަeeR6l􆰾|ӜP%nUviQ&>#pR pk1S^冡A E+I$ CBtC969@0m$zS|GLu@Fb\~Ib p!HHH Ȕd챃 r #!/!GH ""7r+TrHI۸u}6uەr@HIC#;nGEm;FG):`2 TnJk]q qTH` 4o(56OhL(xs6K 9K #KHq**++Jf1ₚA$X/3A | l9ޜi1o Dk؂.`j¤)5Ljft.HCI4JJtҭtG[CY,kFM]mڤDrXJq%qqWVW `=+%TOu!)w,UVG˶9\. /&f Vhiaj+Wm8䨂k8\L՞l_gC54d_]b{]oQ jtHntѥ/fvI.8dN:-^)^!"KaVyV̩q { Wz`p(bʊ Ts677x fȱCS2AWA#k?QD!yk7D0P^0s`TܶoTo&i4D˪n>n\[`˵=(۵E(& >~ӆ}+ws0ttt[IEI:v]^/bHEe5 xؚğX(;C3k0?i,~"[5ffc`*,\c?9G2`-L^2T[yW|kݗ * ,EsI}؆yEgzC1FqG45-T8$%wmoWEE&|y5EA\,FZ'Z@^:,ns 0y""DAԚtGjҋ+m':oR8QX_?5ub׍EY_p$Z`\(r;nqp)_dt{B',UH܋\G|sCK|r 跪@f44Kċʥ#LK4Cg|d',8LK\)r,(EY!U=@{׮җ76+6CE ||10kfDzpjˮQ 8b I9Sː\O|xܳr!<%𨑝E6Zb*OIE w!AB]oè3닃i>>ؾ׾~Ĵo m:u9QPoU/8cy>Dʣ|θ*8OkNOON(lDL&e*o? *$p%VtXaˆ9vdH#I4yeJ+YtfL3En|qcNMBkxI6iSSRJkեV+QkTP^5lڲ.%Jn\sֵ{o^{m׮F@iaOV츱ȓ>,`͉ 681>6}ujիYv])AGy.X{6Du7DG-Cⳕ}ztөW~ڱw|xɗ7}z}d0|i7w8 <Kl+qي %5LB- =0D4D -\Q]0BC mgLH[ "E-$BI&rr,;\ْ.Ka24L4\MjMPsP@;P,@SN7C7C a;mSA9)T?/ROAPrz4P\XmTn PR)gP33TIQCQe4YKAOUTLsՕ_MX{3r([7u? +y׳Os#\_P؆x1]1\Q4PBTXg;uLQ-5M>ԏ7^3c4d]Wy)a}^r5TVZWoq[6Zifۜatܝ{![{'9Py帛zn>omȲR)* +ųrɩW*Gr|(2Γ5s?)t}\u3~sQ91TsϼLǬCDyҌMΑ=Vl}C^lG&SA S9y=_9{qV[𛥴d^A@YJj,)@ ni A 6 AX0`^0 l4%;)N{JF A,,EeQZk6&=C^E]|}Bq?= s6,e9qT[Uh6.7MhqȼG-Q=q˒9c7BT"9xH;xd$PIᒵ8IO~( PRLe(ViVҕ U:Z}4KB,]m[/*nukqY6qshL9f@o+UE\r~8 ?sef*,qQX:ﳗ.-N duU$R ұg@$%,Ai]k[ ]$Y2_\q2+HT6˺blƂB#;gYx^qJKM967 ٩v'sy + HA bX` L sX ē!Ӧ:1>/UG;*tWz% n{npSز8ϡr㷈>כjGՌ怤J=c(]ȅ3>}v +2Kx|;Y:(U)}9^ߌ.v>1;hLӨ2⩨N}LD}2ІM3B-8y/-G7{y#^.IR: -Hpߚ֔UPWNd)fMQURr)\)RV^>tJL,`/q]݂#7Cf4{~ѸO~ О鬞j-TY./4D1 Kːƌ;i:: 8GɓDEps0K{z!Ɣ덤NhjnRi pjpn n  a ˰Z! ې P Za[  p p! 5 n AKkkZ 00go&u6s7mCFB*tPBN@+D@1D@S'ATAuB#B?+dsC3TD'C<c0#4eItD/1H^>cDC1^3\MNDm%>37{GHg>SF0ASLabQĤIaf 'ŋDO^Z,pN&JTLIͤB[uAJ'FtCߔ&pbNN4ܢNO&c4υH٢tRtMzGJwxIgNjMz(S0/b$uTMt$UOGUe&pVrV]W* * Xb|Ģ*#2D3S3Ut8TG BIIb&IPbPPv(T+Tg]xQQ"TQL@9gUYUBV5GUvGoqIhbmrʲ,"I&b%b+ )11 4cIwy0GdQ A JW@f` f&/ggEh h鈪hN 9-T/RzMܤuBL5UITuC1S`6%`2봮F6؋ɘb+.n3n+n=6|`o6Ap}8ieGpgfffŐFf 9 1q P KWh&j&i KkoKq(6v&QuT@=lMw`ɖxK;: O1"z'* {{/Jn֢6\|הLM)OPhJflPɪ ȕ&lήܦKi*\M\ewϤ@ͤ_uAشGĶx;8$Y-yW  ZZc 6gakua({I˲"]a8ԬXKNFDSe_8[`} cȉ}r+}*P}l`g^uwV3U3=?`nL $#I&xXuA퀒'-|;8jU@ @JCNDK֊KUQ NYJZbGTEuulx'CjEakɬz!zǹ{IؙB T Ԭ`LjRlNORE)dISSԠE)-5`'xd^5{P٣J!Xj Aʥ)_L(+K/2lKNJZiKz| oP1d%QdbL6MQw{'Y]Zsyˋg͐.kKk\/gϛI/|\KjS̈X`׈OmwNpI غZwǬUx9?qe)k옑{[KS밯/RYTb)pfV0LAnq4%`;B_A72k5Z^(ې{KP;Hn7 dUi}d|OԷK{jf6 quQiFt6uM[\jB OQuP M|nu/o 8v`_ADۃmq(}.Vb<{1n2ca|aPOdߜeYveWqivf|ro!Wty6s!/=n,ԡpZ< C1 Nj@1u/=Sb1ka»YxUjGMG.MxDWծ,z֧dh؃]؃]!ٗ؋|qxѿ8ALP[4]Bj^I\]Az@5CCtDDP& >k]9SV!W !C cpc1 !D==h߮S㫓7d$:":Z'7;="9s!$-9+5!`"H$hoՈEHFA6GEbdyGvEδUC4PS>;OޟqFEE4T#D5_܎>:t3>C>6_sH^ _:3U'_C336lHDY-E2 20C_U+JB7k[5{H:, *nqtq^8_]䅤K^adKMܻLEnE. G*۟"!]s\?Kd__'|:hp :|1J%*Y1F:z2ȑ$K<2ʕ,[| 3̙4kڼ3ΐ*PB+!8ԨУL:} 5QWRj5+cv%5W~{`ڳl1t0Pw\|A=w.~ .,\/, Ȕ)Zxƍ;;{ :ѤK~YԬ"H:vlR*6Wܺ{νH mj6 r^0(Bٰ{+TT"*^zG?y鯿>}~XxaCIi .`>a!ZQC$RT!a ("U"rV*Ջ1o QG]tawwםF.ߒG6 emW =X^CQI%aiG>IfjfQ$@gƹTS gm~2e"(n(Xa .x%uDzguV]u#]qID_NVffk=PFE깡SԲzh1@+Ԯ1¤HUY#vk@]r^iSf.M ։z)_vA_Yk /p8 U,,Oe,VA{U[Mbr*ڕ`r;#uҥ,eE30%8 }ee9 uRO0kF۟^qU=12jV"7UrT; C7^}u*NaFKDfeayEt&ՒONy妱6įIgL :{qXr("8Wl-'`[n*4]94;riX-NјajOO}֣F1/e5Sxblz'*8\3oʕ 3sKo={ .%mU9ٷ ӭ7* iP`a WBia SC%ݐJY$<䨅|3I@v`7IP^C7z qdE(v)k 2f q+27pB<*#}`@ 2A! Dd"iGҐ %kL2  '9[ܢ(Oy[#,F+VySb4%(?yKO'=/S$}GhZvzf c h>({p7>Zp,!fo, [ZІ;qw:CԺ^.D{ZgT[-; KeǙ/Js(&#tG? ҏfԣhHDG]IԥDLmҜb4'DGx&J#s&Q2iyFԧ6qUzU~DjZ ְaRfմul\F*3qe<zk"C53ۊ*v-Yk4 q^Ӗ6ٍ`3g?YDEh=ԡ Uu@ vmo۫iהZvE-qkZ0*7̍^3@ǭt–5-e ^f%yˋ7d/k,6|w]D6ll3| KXLHK^C 8`! br7wF)_k(ZS]B,hlc zC UQ|d" n38D,?Ā1%5ƀ^Vȗ"۶'[;s,:[Τ_2d@%K -t\zrZ->XP+q `"l1`)˯2]3)G|/30 ?~g@ӿiAf?~"1A`߈C 8RnKSra?*~ h iW `v xP l'v @JHyZuāJvyw vyyD$hyx  xv4h yQ)9#g1}qo S @VHYT Ѕ ` cHeHP@jH o p deV  Ї}zG'Gr)?@*>r9B*3K8ElH!rh5lO8rnTRV[XX88h dX PzhqxrB"6>02"C#C1)443%/?)NDh*Vrȴ;/<./*ƃ}ac?c%`%?ҒВEH[Fh!s:rdr(rg}>0}J}7˗Q QY|`}G|W}^8W{h{B&BxBC#Q#;RP(/!Ȇ *5C%C@bYP$KPDhPDEC"?2/A2P$8REaEl|&c"Gr!7r隄r{@˧|ʗDȗ|Gyķ{q{{0{ 'a{zr2:sQ.aA;R)xA7E~*{~q~Eb/YO6O p$ DROxA.*%*[5QƄg 6wFOR , @5j7z` :j :֠ 5j =J@Aߠ ȤZ([ R ? ưSQq4_JbQ#rAoS4О{z#Y#U}Ù;/縀sh46t4 LK)%xdtGyׁguvĺgvԻ;yuG{KNjKIDZX8I!gf^[Al7>&'GAzrxsWFYk니[tBHI7`{HdH[  TFIvIhtu軄GK [J; a#SZϙl i$1DHJ{q;r*q<&lj6E艞㑨ȋ%14**ӑH휸$)D$b/R1t~ȶ0ٌ5`or]+Bo֮)DYRٯ< @|Zl͘QS  pB> "(-eF(C}RȍGcI%3 "Fa!C ATRMe4TU^ŚUV]~VXe͞EVZmz4ѨM:DToO|{bK⑊1QPR9NYd@ܺYfRi|KhҥE[Z5dǡR5ҰE ;t ߼E֥kōG\r͝?[:w;t(_=?YeL&ED[Ȭۿ߫ɐ'ߧ=ɋ)ON!z뫄툢n8|#: 'B /0C 낰C?1J;nEsq EFRMxrD.D%!d 2J)ʷrp[AB.2L3ό:DSI+߄3N9礳N|0<O?˔.8>O>|pM;eQG4RG$#O&&oa`$nI,wtQx |YK6l+ *Ǝ!ݙT`ېeCۋ;g"5xbܠC@++'зdǝ@A)rZޖC@J{Wο_}# _7Uޑ }{?(˿T #Mv~U,k_/8q37*"+kMH@0iK"!@fcP@I")A)3::@<^8'q-\)xZ A' rGQ3WAݑU{6 ǛC? a;yZ;$fS@o3ۑ\3(# tT(E ӱᡡz˳Ak%mlH\ *4 y8<8!QaCT,|,I%*ǭ< ;=ѳ廸tHF.ū좣 0) ,#jTiɌn(<&RBɳ3'H9BIA; I@AGUD:E#ZE Ձ=kGk8[3O3'{#KD0Z짢389CC#yd'\eɈ4?LKk-!.H `ܡ#j0`a;;+Mķ:>;CPOPOp ^(^ǰ˰ xϑNT#̶`{e<lگĞ*D3E%L+]5][#^Etӽ :/ͺ#U]T=Uk9%߇<ݷ,$= =F5ذ=T ͝( _kW1uT,U]==߹`R2`6NE8m#ښF ~:`lZe8:\TaT"MOܹ_qC8]Y%av'b!}UE۶*naM,VѤmb^ab;,^_5S`=dM0c1&V%c܍F 0ƒCm3ա#D̯Si*-cԅޛK&SMBnc-r{_ij3}d[Iq[VVNv[_1de9SDaU^{Fr{D &2^v=V=(efc$? N*|ipq&r%tf݄D#.v]*U)sBJ*QM&gѺůgge+ZgEu(-?݉vh.bZoO&&~Ń݇hS%yַhX}~inJi\r@U>N=4>iݜvi.'le\Vgfjvjc߻_ij;jtMU )c|:ϕ^' \g빶ӬninhVjQ`ҥ%jck&i)]حji k&k{~\;PNڜ[қ~^FNe}>'vV\h[j&X&Zxzk~ll#`[: 77fny>zz$`^`.FYW1:ʲY^on/,!!RNk50ipl>wѻEVqO\#qqCCxGڊ벮E"rqG$nݖur%%W-32/sUKF2"3*O؋?)/s0?Os,yRUsIM?2.'Frt̊d-*שPT(:7mq/X\~b-Q`ܧ?='k:ttDLVi&&c-dщkZ#:wY<%=|ֲ 'FiӛܟA!cCG|蛊83LFqX hV9kb=;tg,iӁՠ0((A'נT-:FNjӈьJM&Xd)+TCX & U SjEWzt-&. g]K]>RHM| CqX1qZ(DL[jrEYkjs,۪L?/W^vt5 џֶim>r-8v~G\$rUֻu$#X9cqlHՅb  ԰5LZ}KV|ڹ{q7BP2<غQme+(@E:yuSTg>2/NGBJw s e\@3-`*DaԌc5 $MUhgy3]REh&J 3I;Zn>7a`7 Z}]5i&uh@3KfLUplW 6HAB5Ib/lMXeQemkge~!pS &.k ^1b]f H7|+DwBpAoVO5Vݚa⮊*~<(OW@&8Gw4@d>i+HJo+NOw-:7ן0<dGڟ'nF޿wo F~#YǺFxg\%s]G@վjwDO8}QzгSב*?@a;wgOȂO >'_~O}[f<>M;u'{v[qF7{:B{Xyu䷀ ~/MH/`THHYV`T`ȇ'(!8|M }'}d{{l~m}c~>~>/8CHv@n'TO'?UT Y YЅ`` @f @Bt3by x{@(׃M|~'|E{Y~5{huwvd buvX~xyHh/pW(e(Xpưe Btxh{qv h~Bngh茚vi~8~۸ww~ɨFX_DŽKȎMh}P Whiȋ Ysxqh{_Ȉ5vuӘ{ǃi~g }ywiwB}~H8؊؏׏؊YGsøuv Y~Ȍ.I }؈G7|u^{}#ɕYAh8~=H5'vP؊?)(PFyØ Ḁ-~|9r~H(v Xvw{O'逘 tI~|HTYnO? )` iY{HyH~Qه͸ٝn׈^ ָH8$I#}阒yIى~ȖFH4yHvɊHiٜorX~ H@8W({'{G!igY~$d))~x뗄|8?{'IIZ'lx J8ٖ YXi؈yۇܧ}*wzwh~~i~2ytvʩkJ}Izi =8x[A{ 9yHʒIʑgv}9_i'8שpYy.eI p{u:qx (v9v橕fg:(c~mgvc ^/|(}hJȎMwh v)i:?x{ZGE*eǥw'6xVgI/(G }TP9qU+8}=9yzHZ0gyɠp9ʃ#ڕ}OjyɝI78BKO+ʌ~nWMvVDZ@Yw%KFgt33sG rt~gyy8y'B o yH ~6Gs y;~跐ks{sr ];&lqxp_>5W:ۺGٺ`+s?jKa s+#bt Qb$;[&&tI7#{b+'+kVW"^{2sxzۿ{xyGz e] P>\Ɍ,,CɵLO<9,m `}  m= l } }0 1] $|=6Z"jK ޠ T] W\ո_:PfmQ Km l mMuMw `y}ZՂD0]Wft}TMrjMhxh(5S|I-fXhԦmړ}gPʼn PH-ڶMmۺԳ}gx|Ԑm ʐ׸Poժ۾Ԥ͏-4tEžHݪ#+m}%>@!-?mԥ=Wh ڛtݠ纜# ފ)]=/m}(.v%ܕ=qmhH-SnL=n^a*ʪ zc^ L>gmހ ܸ߰` p:pz縠tN0˭fzm|j ~8nٖ]ڪh}g [NB܏9ۙ.@䚮B }ũ۸n ۯXܹۤܳ E^nIӎ >/X< ~ʭNB ۢ]X nQtQ >AdgξϚBN⺠+^Yv OWQ,- R=^7/~E,z{-9l:=,]уV@ M>\<R:h? , .Lˌ+V׽]t,ƨ^ h xP=k^۸흏皣ڠ/bỼa ` pɲ_O _ 0 0 /_ȏo ?؟o_/Qc$XA&)PC %>lHQ UX0cB(r$I1rK1eΤYM9uOA$Sƣ5SQNZUYnWaŎ%[Yiծe[qZFyWo˒UVyf%ĉ/fxRLj#OBPe˗cȡ%H:rѩM63b϶Lp֝Yo x}O><+2&1 C ZT<#Hh+匳eM_YsV\!-ui*_ֿK_ GK]g>m {isҦAQqa`B>jvv6ِPj uA5;l0#֖4!d< ZDΈCaP'3b4x%mB#Y(ua"7%Ifa Cv5lGZu0#!TAl9T[DHXugmqm! ssc):)KwӘAq"-Dq2P$#E>RPeޯ9m0{\Y13bhc9@o&LϘ4 NWl 4&R(FR`{S̀ Z ?#BSbC;lA!52#ѣ2by>MZ:4X!OAC?5Wе^5Pp`c+b3b4Fb3DIPM#贔ـZAQ̠R)%W\qu?Ca'cAxC\ܻaG@4CeHh HB4ȁ$6DlR%C7F6I'3KJDQADAqީk9T!EQJ(o㨄G;|Խ\۽ZH+sL$T`Hg9!Q˞I V yXIY9+K)䁕tVy($(b88$; !9x0989c|@tFU.@>"Qe<]kșљo8MoK IBK4<[%JTKWS!)qOE3ylT#:#:B<9:VLܒ3s2,NEWU1AőEY6{=úLW[W WcWzT$ 7WzEWz-Xvx5XIuoɄ=m}T*01@PDJJ$˱KJFApS(s9*U1J!8KJ\Db ̰^/!" cCq̜)K JٜE" &ݿ?9rqVݘ㓒; ٻ:_!xџ<}^G^*z$5([Ȍ<E1&uL)4Vc=uVŒX0&mD! oxa!,BpȘ vMi^kpYvG:ơJnꠎi݌ {7meQեR#}]"=]I͹̹]beb'`bb%~b+vb\`۔.FMNz?@qaOӍ aa=.밣%&*J &c$Uģ@d1" #m$GɑQkZ5층HV1P^DNFѩ9j=E;T#aLUTi/&9?k_t5G[SZJvAmֽd +ai [!AfUiY)TلiJY^KXa@2F^/jPy 5AꔒQY(UNihR(qv)p)k`aSĽz 0SE3IUB3;+q"$闾i;3ii;0j0AA*,j6zL6Z6+.`Њh-抮Z kX-.χOh p1z   :lPP0. F /Ųk +).CvlZPTVk*rmζ mNnꌰ#ecn>1%l@뮄nnnnVRư0& 2=>S'lƍ$p,Pod dop\caRP~ppco N Nk_oTo&)'dFj #>aOB,D?Hcsp /^(G4;#I$Ge3D`F u>C]o+!qŒGWRJ3/2W.R,5srs:sF>Wpl'AHCfG~Z5I'N]FaKON>p>ooO(/tSSo?OFfqPp;uYss%eki&Cr{蛒YSsG9~~Wړˉ8;l ΂\N(pwPF ^rkcdqd$]?>GK";ӆ>& /幝3KvOX \ ߋhq ?yXKphkTy,~Ĕ(9@N?%t*,LS#9]ڡuZ^ DAT64r/FOf6 #]NuI"D[0w?f IUF^q5_6&XA5^? 8]4jsx'HicDrjp ?H@}đ8 U6v:"KtU'W\at q^\_3y\|{+>'M91Qw:_3Yk=WuůŷP6@"H0Bm$hp 'NTȰa^R*#DŽ0$ʔ*Wl%̘2gҬi&Μ2'U'J&!(Qƌ.5ԨQ7Hժ1ZVRJuYfײu'aREnݺ"Ab(|<0E %xdC6 Bi2̚7sܳ$M,Y fӮm6뷮6+m;ą g|aEfl`oa1BP׳oOBI 6Xoeg8`H Fn +E6 Ѕ"tFY 4bH$G'nTt-‘G 2c* 6H##A )gAEZN9nN-Hhvd``>d \ `tev`f~yaqYmK-x4$"+Ψc9r "j#4^'R3 Xz 0S1ꐥz*2UO%EQiEfT++l)S:ɤooqDp%ѳyIs5@M Mt5*嚛jh../-{o; -(\|0N⮼,$Z&,jj*k1!2 \|8U\1J,19%yQW>@Ul=:Ncqߍ~u5H:iUEɇgǥ O!# g㞔C<9OʷK#7%=ϠlP'!ŧ_f? ЁbX +]WRrX% @ha p! MgDIhċHQ6K%*S^ܔ4ũM}^ p[@* 4 ,QP`X)m0 `8!t+Z¡TIk0< '5(KG"ȩUԨ6EFrXpyZҕ05 `qw;Ӝ)O Ux6lF 6 H>@l`((J?ԋ$N'yh#Pzh#S4G6AE+z1#ڙ\oYTӚ]m5^M]t&̀.M\tm<<&JP S B`Bo1g?^H/V>$Ru3=YL<ɏ 7i4P 3@0\+\՚̵|fH_?5M_ @7iֶ◠:(G㘦6u/5HaBQfF}Xɚ+XamzޜIJR(ͦYQ?9lJk"l*;rH: (pH2⺈I8]˘p.RJs҈c"mWLo+y۔h)h}"Y,r"r(.Od Ig1e5 |ޤ-ް5&nb,&K*Nqs#,;nd*ӡ={ȴ{0ܽYs)U3U+T61iˠvMtSИЂI'2#hP$&:,;%Y%!;튒%IA1eC, yDMm .NuS-LiNY(+f&+YQ65ICS&@kV&Фq&5`6{5l HA@<)i-?)|ӛؔI%扟NC#T1ryK\.%/4yu<.}_?c(\p8ip_B*2bp+~CQY'*rԠ;xsr {B?t଄KΌz®n?g O2}ck76Hem$NKboZQw-X9(s|:Aw97WA[u{~|V5#<>y̓{wv}/p Dc/Ӿ=yݺ7/ L (|ޫc=11ɔgQYQ_+AQ\s q.ާE~%L+vW}7'ܒWh=gAdT x@ 5D*zP>2N6}ܯE}aT< ݤN$Cޗ1|S\ZZaiP^!E̢u#u\ǤdU&Gbs!-bϵ㑌兕%SA ~tU,ȗ &^ⒸŒ%Q[Q q_ +aS ?UZeʢ( 9tͅJDFX 3NvUAf$^Qa_R%aqPV"8WĈ?ip'= UBle]XEefwYjiFf4 Kj"T "JdP!GY,DrR&]$K:s"SȑY%b#6Nڤ[\"ք4((0 eEEISg&f5cIT rjD\Wb~\gYdYQM|(ZB U!gaESuXuCArm~.QSb&_YF Y6 j﮶(<3'+Z2ê C(F|<4,@,.i'S騫;n3-K͊2-K{RQjH%ґ S۴SȞб"Qo(VIyF,rO^}L&E xj]FfiFex[ z=\?&x lziA31BD0r +ssou#b2Ilފ-ܸN1Kpc}UN.ֱl7cvySO7Y٦,㢍>0{Δ.c k:i²몓tcO5^> kmaNM~Z︧i0 p O%-5ߜ=EM?U_]emuߝ}?_襟ꭿߞ?_域^6U@c c1jlcy  'r4A'L"E,E( 1FqahiHSn6H{B 2hgyrOů\-)pu*JD C%nXcY '#;MiTɐhěl1e<̘>D&hّeB$˄9,2L") B~jq&q$#]>y$N%1 e&e̜HK[ xWce.qt2W8Д&G ILBGD6? nmY/usr~S:/&vsm<7woa ƟgPqSh9Ps3DQQCڵϣ!H?Q)UJYRt1L#(2K{D @)Me-&؂T1<52 la&~CjES'Fi-YzVNjEV>qFj]EGqW*2իc5[N!Cmv%lGgodl+FO 69AYvt\]PsDE .ډ[ߎGD(DesWv8!R[9VeQYb"( 66 E LoyG*Ί7y،?䛉bK vT/?Z`sjTc0`>.+EA6 aNαmۈA(VNĕtLe| d >r2E:D5Pjl'm+?a'Rp$q*q%c ^kɚ\Xtsp[IyHX84>17ö92*֞b#IAn㘱F?˜h1_t!KhrLu2mI(֭6S,,g(c̨QcrZFFl&9Iȗ؀[; j %orgl;F^t613]Enr4'8}V.eI pB-!>@0A;hA2Gի^c#]YUj܏wGGLL-s@#^׹,9rf5_jA y;sS=c-9[#I!^MDvM='?{Ԟo}Mvܗf]}bN;. 嬀9S븡=< |';p=(L/t$l/|Fdlb7MBe3%,(cѱb:DWi_uJ3?ɾU6ǍizNHT ($ @Ӧ.2OeXd$M.pBPg "Ã(V h h9σj NF0DKHPqmioʦ/j-4vogHf`;RN -D f. # !0 )` A#qB+R&0i bjϊP<FxAVd.,x5ZCS5zQւ:XP oiL90M7H%2QYC=ԁ= " ""os B"\dLDJ@q&DqF_j vP:\M<M2oBqOi"0lB™4 E ApКpQ8Eq)0H,$ zc'.-"/"И e^"Hۄ嬴d:N,#)>!_0b("k&^ƭBi "]1RXE-gNRSr>f"(&(2%Hvo: ú+_2,Pd7|hPv;d/^S*./MHn.;1ƈNY('N0mp(0櫚k4SS5d5c6g/VSD3ik֍ D4y3%/8Ս m@82mi= :SfV/&nkRS:12EsiznhS|39S7o/jP ݒS +oSAS%' )2:3A8k:B+tB32O6 sCA3Q4C9B A}0:,FҮFi *N(e2A@7 ?=*h>dHBCy“iTo?:7Nʆ "}3LWTHGR&cdOM>Cs9sF?QRzn#OLY3HAQ5tJ3u^8b3P/SSUUW:bȌ+rXm6V2JWwozWX^rWu= SUY[JYuYu41kv6r(6XD6mM+BkIB.lmECvFrVqp0 o5r4rK.$w+*mVCe)I'ClLxEA/`f$wvQJLuC)RWPj#C)d Wj y o*KǗt!, H*\ȰÇ#JHŋ3jȱǏ CIɓ(S Y/[VPb̚7iɳJ%DR褗G+]ɴӧPJJիXjʵbK3NYJU6 ۷JȚK0a;9Iˮ LÈ+^k%pd#\Q`Mrm:1(PW@ `.۸sͻߌ΄LlYfhV8D'=JmR>MHa)/ӫ_ϾPeJ 53_֬s=Wv!6qw  |VhfVWMcEfFYaf"y[!sx;9XRa|Y8YgTP|,7/ @Iυ gHÈH9[@ ч@QG5 P4p3iBۡ?cG<'AӋ-QHbЂFwKD >nc I-7zl#7neW"(̤HGlc''v7|90`j d MĪb8YkG: c$UyԕL7yD;HDnЗr^Il  8k%)Ns҄:NsSgua!6΂+sbBuEHCPK^^fPr#0HzT 'ՂPփ# i9RȝRoAwR)-: JG%)18Oe*Fԏs`tӮz5R2F%QƠbuFMR 1QTEVbUG +վ)K lA+e}B- ꚂJO-[:WcXz#$0> hO-jZ42NnBJu|-QTNV \Z׻oo tϤ®v< xw@fMz^7E@ |rg|5*REX&7]nsWll%H Mhwɛ&dF  Rb@V0b@7~yQfNJq(cTթ-CSkY:\o|P OxE0fqdM L + LgGs3:xЃ X Gߎ]lZ\ܦFXT{Yz2G-ξPx`f-Ȝ&̭nͷ5_5Vy;lZ$I"7f%ߒ:eةsؼzȤ8-Z0Y0X7[=xw88DD#ھmvˊ@2Ņ‘inF)`i+1yի7qtX}Mokxny^MnD9]bej(8ZW3U\ N3Yn6Ƨ>/k p5r7 /8;'O@93r|H{vE6フ)EDXFXKȄ5EqP'Փs8w8?2)\ J`WYpY>7o94]iLi/獓6\V)$m`dĹ49'FxH (VHmp&eHN$YB8}ٟ#!uȗS 9s{96{VN9XY!3*!!>^t1_۸fGp멛MMOIϢ# #CzHB]?ttEIJeL7yC@}fƠi*dop:oc;8皏A$)G0⸞9Um\(:-BjGưJ`vzv z3}ו:9E8i)&LgY7q:RJ Pj`0ӚJWW۪ :WФ9}:/QFF|wGxmUXWH,3 C [ а  K@{oۤҍjp٫ @)Ÿ! :k ` = =۳@ NдAS۳?iE /ڗ4:|L5 U Vƣ 2۶ʔp ;p={`jЩj@0њkrMszCXWY,l붠[+~Aj::{H߰` z pp\2 3/l@&ktox ۽" @zΪz{wK` ?г p ` :@: Ե@w_䉠%{ږeK[:UٹޛR7::$ [0:*0 4 Mtwy$ZK5myX9=L+ &+luT `ߠD Ep{J+ƒP2|}̫R:ڙFGW%MǕP< 6K>ۺ &@ [ ̻\r9s} W~(U(|˧bڡ zz:jz.Ƽ  :7h;\Bli`y7~&} Ľ\e̳`{k|lM2ZA|Df˥+zu`b @]і` ј@ = "M #-&}((æbɜ|Hǹ YPVyV>m*&C&HJL6p% z9Ĕ7]{Nk ?]֮ʜ"B lAfMqLY5 ixl~-vhCa)Ї5WS6m=" 'dB!r=Dgup5ǥiML٪m,E$@+4 T<=oCVXb[\IymXٟ,'$$]NtmVjtdU8; j`:ڝ!m-?>Cř~E֜m)!gG:]mC\mIxiڸ ݦ%seԍAp5Xe LƇLk#1DHXdi|"㽁gJ {|k{ tHE\PTYip dq*Ź Dq:JNwnxJRN/_0GPVSF%EfU55tj]斾iifܺl~H ޠź` ȧ꫎ ^F `  D$OrBa pOO4.Jh}~J1ȑj 9 ψTkCKE+JG+ )P|ꢍsa[(iɟlx~jB~șZC#\KkG;W|Š r} 2j;ڷ[^ɸy۳< i9.(F:v z&곛l 0lR/ƀ \*ԛN>\l\|y뺖ںjcﺸt*BѮ˾Hñ>p?\_*ɡz/k^󊻻n~JWPy``O?*`RMM `B ?? o O?`D-IM&ڿޯ)0 ?/< pK & $? .dC%NXE5nG!E$YI)UdK17VMrOYPQI.eSQNZU *W 5V֬YeqV:[qΥ[]y&d;&-i l aZ&6xI&[e̕ngСE&MUkXdϖml;Ν[o޷gPqɕ/g9F4Q~sWgm'v|dfA]Y޼z埧}߿GJX묲67]@ xB# 3pC /$` *$ DSTqE[j 'XqBuG\rH" "TE&tI(t նH5\CsTpo60uG]1$ M7d3)N<.$:/ϔMG]M]" 4H%R2sSN;SP-KH릴bq sofQlt4{EPvXbE@;MiPXsC3 WћXr5\tjFdm-AqiL2#-ٻoo#Lp[nwFhi+r3|s;sC}tK7tSW}u[wucTdoĦw߃hxNx囟yWv"/+n'J]|W}nwO=6Bi }$`o5{Z#(ب2kwYЀ`R)PadɞvdޠA B`2! mXCЃ;ac2*hayp 63WD(2щS(EfQ[ %H'K6‘-_ZCtP7QHrtH.Q{Y@wŦ^:ӄb322d8!>FRz8BQAJT EBZ e x;A$]^ѩRyr^7@)&=_E'X&StFL66ʹVEUj/o~C_.leSRKZeYM(& j%@@9$#[ b2㼢5pT ]j9(@GIY0Eҙ9J9N2RMqT3Ŝk,ZxFt)*1<4ejS1A8haUBHVcթUbTzVMrHV8.ock[jWɤU{=&2 S,V\bXFVle-{YfVlg=ٸIA$ht?9e-ּK,!YNe>OCZ3^l CBi';S.WO p{ݹZm xf:`$eWutS?x=eFDewt;o7_dwz |-"q䠒6ъM@-l+@ 1Of(W@pM Ui&ģ6)N#"@ҊF7NqNc d|bi*zEve󭦵& ʚ.tЫk-k[pǿ|M]C&Ő2~0 ?%Пa (* QaR!٘ y)Y@䠃%Lb NjZAD:'iA5P'A4 K 1{f U(\y*e]\B!ʵQ6B|2>\R6{W%&BةJ;=HCһN{D0CI8뱍5$:2YQ|B|B4*CFL<ڪ@JDKLJDqPEQ􅯺0ERE F| ":E̐E[9XE` FaFb,Fc~  PI,MI1.//A#iٞщO 04LAϬ ި8+ ݉X|'q\ɌL~iȅlMd[$G$/I2S˗ti+N!2|['1%Q #@ɠ PpN\tHg)G"=/ < ЎO"=ɍ (4Ȱ շ51^0P^H-PH3A'q16#Ȕ\3E[QՏ9p  źQ%Z+$mҿZR)MR+R,R-R.R/Rn$2E1 )SSS8}wB; ZSYS@u> _ \à @T(A=. ʠC&SDe.B8̓TREKKɜ3 &nOқJJRեOT䤈2&[驠z& s%"f]}֣xK֐˳&F\Ip Wp1!1lѴ48)n9?IW~] c ;17 ;Ȱͽ 7ꘌa~X 6ɛd]`!pPd- y;@YL $D([ #N4%ana$eP#(Y0U= dL˻lXyQ [4a4EEB"EA#C3x[Q_տ#$[HE{*AM\v#(,T- ۨ6C]P\u#4 ]ʈ*C]ՕK q΍݈(-QۥŻ]PڕZ 9]^m^}^^^^^^^^^ __-_=_M_]_m_}_________``.`>`N`^`n`~`` ` ` ` ` ```aa.a>aNa^ana~aaF(Hi P LlwHDK=d -+P(vn\tP-b̄(26b4N)Ι8cc?c@dAdB.dC>dDNdE^dFndG~dHdIdJdKdLdMdNdOdPeQeR.eS>eTNeU^eVneW~eXeYeZe[e\e]e^e_e`fafb.fc>fdNfe^ffnfg~fhfifjfkflfmfnfofȑ%GpvH&.g;bNu/6tw27 zg}g~gg詸ggns^m&(m(fmu"ooZh髶h.(1vDwNo1n&ofmzehvS&tmfT63TOo!H7 OpQ%qOq_qoqqqqqqqqqq r!r"/r#?r$$^r'r(r)r*r+r,r-r.r/r0s1s2/s3?s4Os5_s6os7G!, H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲaJ-cʜI͛8sɳϟ@|9УH*]ʴӧPJ(8Tjʵׯ`ÊRѢdӪ]˶۷p&P Vx˷߿O* fAQD"?EM<)SL3 ϠC}T?'&ZQEM{*!TB% &IH+_μ k@ͮjν٢J/A|yB// ]˟O}صvw 8X 8&G 2zt}Vhf(fthFF=ЃEFy(( #{<(&! ]mb3!IXf\N%IÇ (dG36!7Nx'IaDJ؆06e 'd)餔Vj@QGfr#Go2`y6x髰*+fNRhyWj&$N"nb%@AS>tRʖkzU8g9;[wl& k^:tgY,Bi],Ʈk|% `"e \&@%,$++vMV((F͉+<3E'O@"H'L7PG-TWmXg\w`-dmhlp-tmx|߀.n'7G.fyagҦm|$ `SI駛ꦟ>K.;| 5PyxydXCrr|&l,$߀TT+XcF 93߀I0'3<ꑏK<HSX@%sP7) Uz)Oqk' RgDǿ |K31\bY9_^˺hZRmOZZ46k_F*lmgw;`cR@hDtC,rӋh@Ukd%;?.+oYE>5bhJ=~`x M*E FΎꒈ!~fRVAsACW4]{{APUQBm{,k#HB,vq-Z6w9? ch-j;,^/8*j;ށPaNS8ڂT,6^1+ žģmo+.9+}s+6MBdX: ިٙ68=do HVnN4т }EtA +2g5TjG%nRNXgĆ1DQ:jvs~-xLm.u]Wk4,S.{^jNDP5W1g][rlF\6ڣ{)ʕ^qܬ(Ъvי.Kn\Nը5X~]=]r^bYk^.yféi2+'iD0:~snf?=S?Z~pr[HwZ!/2k\Ѡ>H_d2p,}G6yů(dnUzd$Fa5?V씍mi$_nmzJ-G-{'VQrwC5gF*$?Z[pLHu>I\cGyMG[ hpp8bOg7F:|RP<a'cLM3Di^rgwETmj3RHX(+0 q&gohwC:C%s:i$U 8I= :Ug/1Cmm#7`V~ VFl2+s3a7FWD$ol}HlM$`b0d=KEI7iditwDc_XnX)\x˷jfeJwI%t5%ZsWBWgtme)׊θ'\l))4m C2Qkey)6PX@|G@HcW%[8\we_4CV2XXU?%owHxTtgDP'uW#|36Ffu\ؖgbU>uyTW2#1|t&VdU?W_#yuGNBcه3ٔYz5\`YC^!{nԉZ&iQ%|&]j=Pg(V#!q?b@9$ǂfIfƔkxtiIbYu{7~w~{xH|(Fsu}{ADi^XI{Jd)l=y9|A]đ[mgmC]%mDF5ws֐>x[eL@o0TU=_IoP̄I!SGwUN2fKRz V'IXrQ$qHt}>=> 螟FBrV8Yy[]TIYd9\gLWIĆ;`vAGBh6%JFPqOPWy;E;OHj^ihDYu*7z^UV2\ڥX]ʥ ȓe$cQyOVX:ˁ9A{Xe~0 ÇVJ,whDXYJ)Z+uԚ0ʀ W 2=VNtɨ䨝cJXi6K4@k :@;;M@́B[FJ۴}Ny4+V8{Z5^0b;d[f{hjl۶npr;t[Vv qz۷*~$ֵ[A۸[ 1۹K4x[k3ۺ;[{[l ۷Tk[yK;rUq[;kԻk۽g{{l;[{k黿VKM;{Ik ܳ<\| .|6۾$|(*,.Q0\ ;4 6 T9@̱;:|FL+LܱNR\V|XZ\^`b@B=D]F}HJLNPR=T]V}XZ\^`b=d]f}hjlnpr=t]v}xz|~׀؂=؄]؆}؈؊،؎ْؐ=ٔ]ٖ}ٜ٘ٚٞ٠ڢ=ڤ]ڦ}ڨڪڬY!, H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊU?I a&ޒKݻxXIӄx? '⽐#KLټY߄aat 6.A!Bt҉۸s ٯN|܌%&ѣyjj- !( NGcËO1x4\%\hF2_5G#XXa * o{o$w:j 2[%@E2A  nHB$>q#m^$׼/\_5AH`SyX% ٗTb ExJ2|&6I*PkuMAN stdٿ7ޮܧDMovl lP$:jr(]6Hpn0"*5y#)CĔl}?/*Drm'#JXSoO:~zk`tH9R&ZIvzKTD. H,:I\[i[jl%2em G>&`'{n gVBWnѣ֊g ٳJUY=p!b*CNAc5bYKV٦?JXvß?| CK2msV }/PmDB H6=&* !`SawKh} LU\47ͪsUy-Pl88{'덾;Lðwc\&D%S[/7%F;С|O$v7 6jdwg޶p'\eu7]=WKpT|׀2{cZEoXgb6MLw haa%uGhRaW}Ԅm!jv^f:>La+fDGK2XrCEC~@Lh`w$=CfXGmܓqL; h`xH3T FEvUVEB;xg}xIfr?CO,t`8 S~suDG0XDs2P2p2oPeoaxpQEkÁ[=D"2$Lx\!{82Xmd;GHy8W"!r%L7XGwxԨ3H.XOq؍1?hw4sp3Y'KučHs;=s`;t";`Gt%)#y0!9&2!yY"(I%)\'I>#ْ.0294Y6y8:<ٓ>@B9DYFyHJLٔNPR9TYVyXZ\ٕ^`b9dYfyhjlٖnpr9tYvyxz|ٗ~9Yy٘9Yyٙ9Yyٚ9Yyٛ9Yyșʹٜ9Yyؙڹٝ9Yy虞깞ٞ9Yyٟ:Zz ڠ:Zzڡ ":$Z&z(*,ڢ.02:4Z6z8::!, ^ 8PR%I*(_Å3Mʔ ŋ3j1 CV(j/N(@IcʜIb%f̄ȩŒjG %#fJGS:IUtNf|*,BzXta&0D :.+sBNw~l ӮV]FK2Ĭ\{3$58&NVToB^m7ו ME>^YEJJ{sXϻ}‰s<&dn$'DO;QhK'Vc.Akؑ[i$\u_~ j45mMZZIgGġ@K 6hBYFmUtmVnX tw x[GaB@vYLX\مk>`-JQs]\تGpdJtPq2r!7 (|,'%>L!mAb~l!XhB yIq-Ӄ7j WvL%2YL~CwρDN P۴h7&L2qʒ5?` HJɰ3 { *џ$)xs~Qwfn\C%̷ǚ~5iZHF]:U ?l̓5ue524!dY 2TVo pŠ%4c#v.1DR--W\ۙ٧a CZmX5"YAY"hͱ"$eqs7NW|k!E+"FAaԓY$m jUJ7q`׌wO\#C֌kX`%l3b A! )涪cchˢ %aمL|Όʀ M9UP5J7of{ x#zF|Sд(Ȍ7>,#TUu/I,T{Tj^y[Vx6gQ_ug9wH9Sޤ˿9oHxd0Γ稸F;zp6WFAL{J=kT6]Hk92v֗wKM;æ- 7cd*AlLun|^uk&ں[1kD!DS;^Ny. 6q쮕56o1fm\ވB 3Wn6FQۀ n ;95gU`5#ŝ>: 箧Pɰ^2szW`vx}n_zvPbC>a)\/~ά;ND>Üyf;cli-3.2.4/docs/httpie-logo.svg000066400000000000000000000057001471121002400161650ustar00rootroot00000000000000 cli-3.2.4/docs/installation/000077500000000000000000000000001471121002400157105ustar00rootroot00000000000000cli-3.2.4/docs/installation/README.md000066400000000000000000000004751471121002400171750ustar00rootroot00000000000000Here we maintain a database of installation methods, from which we generate the installation section in docs. If you’d like add or update an installation method, edit [methods.yml](./methods.yml), do not edit the main docs directly. For HTTPie installation instructions see: . cli-3.2.4/docs/installation/generate.py000066400000000000000000000045261471121002400200630ustar00rootroot00000000000000import re import sys from pathlib import Path from typing import Dict import yaml from jinja2 import Template Database = Dict[str, dict] # Files HERE = Path(__file__).parent DB_FILE = HERE / 'methods.yml' DOC_FILE = HERE.parent / 'README.md' TPL_FILE = HERE / 'installation.jinja2' # Database keys KEY_DOC_STRUCTURE = 'docs-structure' KEY_TOOLS = 'tools' # Markers in-between content will be put. MARKER_START = '

' def generate_documentation() -> str: database = load_database() structure = build_docs_structure(database) template = Template(source=TPL_FILE.read_text(encoding='utf-8')) output = template.render(structure=structure) output = clean_template_output(output) return output def save_doc_file(content: str) -> None: current_doc = load_doc_file() marker_start = current_doc.find(MARKER_START) + len(MARKER_START) assert marker_start > 0, 'cannot find the start marker' marker_end = current_doc.find(MARKER_END, marker_start) assert marker_start < marker_end, f'{marker_end=} < {marker_start=}' updated_doc = ( current_doc[:marker_start] + '\n\n' + content + '\n\n' + current_doc[marker_end:] ) if current_doc != updated_doc: DOC_FILE.write_text(updated_doc, encoding='utf-8') def build_docs_structure(database: Database): tools = database[KEY_TOOLS] assert len(tools) == len({tool['title'] for tool in tools.values()}), 'tool titles need to be unique' tree = database[KEY_DOC_STRUCTURE] structure = [] for platform, tools_ids in tree.items(): assert platform.isalnum(), f'{platform=} must be alphanumeric for generated links to work' platform_tools = [tools[tool_id] for tool_id in tools_ids] structure.append((platform, platform_tools)) return structure def clean_template_output(output): output = '\n'.join(line.strip() for line in output.strip().splitlines()) output = re.sub('\n{3,}', '\n\n', output) return output def load_database() -> Database: return yaml.safe_load(DB_FILE.read_text(encoding='utf-8')) def load_doc_file() -> str: return DOC_FILE.read_text(encoding='utf-8') def main() -> int: content = generate_documentation() save_doc_file(content) return 0 if __name__ == '__main__': sys.exit(main()) cli-3.2.4/docs/installation/installation.jinja2000066400000000000000000000015661471121002400215200ustar00rootroot00000000000000 {% for platform, tools in structure %} - [{{ platform }}](#{{ platform.lower() }}){% endfor %} {# <= keep `endfor` here to prevent unwanted `\n` #} {% for platform, tools in structure %} ### {{ platform }} {% for tool in tools %} #### {{ tool.title }} {% if tool.note %} {{ tool.note }} {% endif %} {% if tool.links.setup %} To install [{{ tool.name }}]({{ tool.links.homepage }}), see [its installation]({{ tool.links.setup }}). {% endif %} ```bash # Install httpie $ {{ tool.commands.install|join('\n$ ') }} ``` ```bash # Upgrade httpie $ {{ tool.commands.upgrade|join('\n$ ') }} ``` {% endfor %} {% endfor %} cli-3.2.4/docs/installation/methods.yml000066400000000000000000000130461471121002400201020ustar00rootroot00000000000000# Database of HTTPie installation methods. Used to build the docs. # # We currently only include here methods for popular systems where we take care of the package, # or have a good relationship with the maintainers. # # Each tool name should be unique (it becomes a linkable header). # If a tools have `links.setup`, it also needs `links.homepage`. # Some tools are available on multiple platforms, take into account when editing. # docs-structure: Universal: - pypi macOS: - brew-mac - port Windows: - chocolatey Linux: - apt - dnf - yum - single-binary - snap-linux - brew-linux - pacman FreeBSD: - pkg tools: apt: title: Debian and Ubuntu note: Also works for other Debian-derived distributions like MX Linux, Linux Mint, deepin, Pop!_OS, KDE neon, Zorin OS, elementary OS, Kubuntu, Devuan, Linux Lite, Peppermint OS, Lubuntu, antiX, Xubuntu, etc. name: APT links: homepage: https://en.wikipedia.org/wiki/APT_(software) package: https://packages.debian.org/sid/web/httpie commands: install: - curl -SsL https://packages.httpie.io/deb/KEY.gpg | sudo gpg --dearmor -o /usr/share/keyrings/httpie.gpg # - curl -SsL -o /etc/apt/sources.list.d/httpie.list https://packages.httpie.io/deb/httpie.list - echo "deb [arch=amd64 signed-by=/usr/share/keyrings/httpie.gpg] https://packages.httpie.io/deb ./" | sudo tee /etc/apt/sources.list.d/httpie.list > /dev/null - sudo apt update - sudo apt install httpie upgrade: - sudo apt update && sudo apt upgrade httpie brew-mac: title: Homebrew name: Homebrew links: homepage: https://brew.sh/ setup: https://docs.brew.sh/Installation package: https://formulae.brew.sh/formula/httpie commands: install: - brew update - brew install httpie upgrade: - brew update - brew upgrade httpie brew-linux: title: Linuxbrew name: Linuxbrew links: homepage: https://docs.brew.sh/Homebrew-on-Linux setup: https://docs.brew.sh/Homebrew-on-Linux#install package: https://formulae.brew.sh/formula/httpie commands: install: - brew update - brew install httpie upgrade: - brew update - brew upgrade httpie chocolatey: title: Chocolatey name: Chocolatey links: homepage: https://chocolatey.org/ setup: https://chocolatey.org/install package: https://community.chocolatey.org/packages/httpie/ commands: install: - choco install httpie upgrade: - choco upgrade httpie dnf: title: Fedora name: DNF links: homepage: https://fedoraproject.org/wiki/DNF package: https://src.fedoraproject.org/rpms/httpie commands: install: - dnf install httpie upgrade: - dnf upgrade httpie pacman: title: Arch Linux name: pacman note: Also works for other Arch-derived distributions like ArcoLinux, EndeavourOS, Artix Linux, etc. links: homepage: https://archlinux.org/pacman/ package: https://archlinux.org/packages/community/any/httpie/ commands: install: - pacman -Syu httpie upgrade: - pacman -Syu pkg: title: FreshPorts name: FreshPorts links: homepage: https://www.freebsd.org/cgi/man.cgi?query=pkg&sektion=8&n=1 package: https://www.freshports.org/www/py-httpie/ commands: install: - pkg install www/py-httpie upgrade: - pkg upgrade www/py-httpie port: title: MacPorts name: MacPorts links: homepage: https://www.macports.org/ setup: https://www.macports.org/install.php package: https://ports.macports.org/port/httpie/ commands: install: - port selfupdate - port install httpie upgrade: - port selfupdate - port upgrade httpie pypi: title: PyPI name: pip note: Please make sure you have Python 3.7 or newer (`python --version`). links: homepage: https://pypi.org/ # setup: https://pip.pypa.io/en/stable/installation/ package: https://pypi.org/project/httpie/ commands: install: - python -m pip install --upgrade pip wheel - python -m pip install httpie upgrade: - python -m pip install --upgrade pip wheel - python -m pip install --upgrade httpie snap-linux: title: Snapcraft (Linux) name: Snapcraft links: homepage: https://snapcraft.io/ setup: https://snapcraft.io/docs/installing-snapd package: https://snapcraft.io/httpie commands: install: - snap install httpie upgrade: - snap refresh httpie yum: title: CentOS and RHEL name: Yum note: Also works for other RHEL-derived distributions like ClearOS, Oracle Linux, etc. links: homepage: http://yum.baseurl.org/ package: https://src.fedoraproject.org/rpms/httpie commands: install: - yum install epel-release - yum install httpie upgrade: - yum upgrade httpie single-binary: title: Single binary executables name: Single binary executables note: Get the standalone HTTPie Linux executables when you don't want to go through the full installation process. links: commands: install: - https --download packages.httpie.io/binaries/linux/http-latest -o http - ln -ls ./http ./https - chmod +x ./http ./https upgrade: - https --download packages.httpie.io/binaries/linux/http-latest -o http cli-3.2.4/docs/markdownlint.rb000066400000000000000000000021241471121002400162440ustar00rootroot00000000000000# Rules for # Load all rules by default all # # Tweak rules # # MD002 First header should be a top level header # Because we use HTML to hide them on the website. exclude_rule 'MD002' # MD007 Allow unordered list indentation exclude_rule 'MD007' # MD013 Line length exclude_rule 'MD013' # MD014 Dollar signs used before commands without showing output exclude_rule 'MD014' # MD028 Blank line inside blockquote exclude_rule 'MD028' # MD012 Multiple consecutive blank lines exclude_rule 'MD012' # Tell the linter to use ordered lists: # 1. Foo # 2. Bar # 3. Baz # # Instead of: # 1. Foo # 1. Bar # 1. Baz rule 'MD029', :style => :ordered # MD033 Inline HTML # TODO: Tweak elements when https://github.com/markdownlint/markdownlint/issues/118 will be done? exclude_rule 'MD033' # MD034 Bare URL used # TODO: Remove when https://github.com/markdownlint/markdownlint/issues/328 will be fixed. exclude_rule 'MD034' # MD041 First line in file should be a top level header # Because we use HTML to hide them on the website. exclude_rule 'MD041' cli-3.2.4/docs/packaging/000077500000000000000000000000001471121002400151335ustar00rootroot00000000000000cli-3.2.4/docs/packaging/README.md000066400000000000000000000054441471121002400164210ustar00rootroot00000000000000# HTTPie release process Welcome on the documentation part of the **HTTPie release process**. - If you do not know HTTPie, have a look [here](https://httpie.io/cli). - If you are looking for HTTPie installation or upgrade instructions, then you can find all you need for your OS on [that page](https://httpie.io/docs#installation). In the case you do not find your OS, [let us know](https://github.com/httpie/cli/issues/). - If you are looking for technical information about the HTTPie packaging, then you are at the good place. ## About You are looking at the HTTPie packaging documentation, where you will find valuable information about how we manage to release HTTPie to lots of OSes, including technical data that may be worth reading if you are a package maintainer. The overall release process starts simple: 1. Bump the version identifiers in the following places: - `httpie/__init__.py` - `docs/packaging/windows-chocolatey/httpie.nuspec` - `CHANGELOG.md` 2. Commit your changes and make a PR against the `master`. 3. Merge the PR, and tag the last commit with your version identifier. 4. Make a GitHub release (by copying the text in `CHANGELOG.md`) 5. Push that release to PyPI (dispatch the `Release PyPI` GitHub action). 6. Once PyPI is ready, push the release to the Snap, Homebrew and Chocolatey with their respective actions. 7. Go to the [`httpie/debian.httpie.io`](https://github.com/httpie/debian.httpie.io) repo and trigger the package index workflow. ## Company-specific tasks - Blank the `master_and_released_docs_differ_after` value in [config.json](https://github.com/httpie/cli/blob/master/docs/config.json). - Update the [contributors list](../contributors). - Update the HTTPie version bundled into [Termible](https://termible.io/) ([example](https://github.com/httpie/termible/pull/1)). ## Finally, spread dowstream Find out how we do release new versions for each and every supported OS in the following table. A more complete state of deployment can be found on [repology](https://repology.org/project/httpie/versions), including unofficial packages. | OS | Maintainer | | -------------------------------------------: | -------------- | | [Arch Linux, and derived](linux-arch/) | trusted person | | [CentOS, RHEL, and derived](linux-centos/) | trusted person | | [Fedora](linux-fedora/) | trusted person | | [Debian, Ubuntu, and derived](linux-debian/) | **HTTPie** | | [Homebrew, Linuxbrew](brew/) | **HTTPie** | | [Snapcraft](snapcraft/) | **HTTPie** | | [Windows — Chocolatey](windows-chocolatey/) | **HTTPie** | :new: You do not find your system or you would like to see HTTPie supported on another OS? Then [let us know](https://github.com/httpie/cli/issues/). cli-3.2.4/docs/packaging/brew/000077500000000000000000000000001471121002400160725ustar00rootroot00000000000000cli-3.2.4/docs/packaging/brew/README.md000066400000000000000000000027721471121002400173610ustar00rootroot00000000000000# HTTPie on Homebrew, and Linuxbrew Welcome to the documentation about **packaging HTTPie for Homebrew**. - If you do not know HTTPie, have a look [here](https://httpie.io/cli). - If you are looking for HTTPie installation or upgrade instructions on Homebrew, then you can find them on [that page](https://httpie.io/docs#homebrew) ([that one](https://httpie.io/docs#linuxbrew) for Linuxbrew). - If you are looking for technical information about the HTTPie packaging on Homebrew, then you are in a good place. ## About This document contains technical details, where we describe how to create a patch for the latest HTTPie version for Homebrew. They apply to Linuxbrew as well. We will discuss setting up the environment, installing development tools, installing and testing changes before submitting a patch downstream. ## Overall process The brew deployment is completely automated, and only requires a trigger to [`Release on Homebrew`](https://github.com/httpie/cli/actions/workflows/release-brew.yml) action from the release manager. If it is needed to be done manually, the following command can be used: ```console $ brew bump-formula-pr httpie --version={TARGET_VERSION} ``` which will bump the formula, and create a PR against the package index. ## Hacking Make your changes, test the formula through the [`Test Brew Package`](https://github.com/httpie/cli/actions/workflows/test-package-mac-brew.yml) action and then finally submit your patch to [`homebrew-core`](https://github.com/Homebrew/homebrew-core`) cli-3.2.4/docs/packaging/brew/httpie.rb000066400000000000000000000102301471121002400177100ustar00rootroot00000000000000class Httpie < Formula include Language::Python::Virtualenv desc "User-friendly cURL replacement (command-line HTTP client)" homepage "https://httpie.io/" url "https://files.pythonhosted.org/packages/32/85/bb095699be20cc98731261cb80884e9458178f8fef2a38273530ce77c0a5/httpie-3.1.0.tar.gz" sha256 "2e4a2040b84a912e65c01fb34f7aafe88cad2a3af2da8c685ca65080f376feda" license "BSD-3-Clause" head "https://github.com/httpie/cli.git", branch: "master" bottle do sha256 cellar: :any_skip_relocation, arm64_monterey: "9bb6e8c1ef5ba8b019ddedd7e908dd2174da695351aa9a238dfb28b0f57ef005" sha256 cellar: :any_skip_relocation, arm64_big_sur: "47ffccd3241155d863e1b4f6259d538a34d42a0cdeed8152bda257ee607b51be" sha256 cellar: :any_skip_relocation, monterey: "dc4a04cb05a9cd1bfa6a632a0e4a21975905954af54ece41f9050c52474267be" sha256 cellar: :any_skip_relocation, big_sur: "ae469e37864e967e0fd99fba15a78e719dcb351b462f98f3843c78ed1473df6d" sha256 cellar: :any_skip_relocation, catalina: "291a3eaecb2a2cc845c1652686a9a14b21053d7e3a7d0115245b2150ca2e199e" sha256 cellar: :any_skip_relocation, x86_64_linux: "710836e27c44c8e3ad181d668f4a9f78c4cb4c355d7b148a397599a7cd42713d" end depends_on "python@3.10" resource "certifi" do url "https://files.pythonhosted.org/packages/6c/ae/d26450834f0acc9e3d1f74508da6df1551ceab6c2ce0766a593362d6d57f/certifi-2021.10.8.tar.gz" sha256 "78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872" end resource "charset-normalizer" do url "https://files.pythonhosted.org/packages/56/31/7bcaf657fafb3c6db8c787a865434290b726653c912085fbd371e9b92e1c/charset-normalizer-2.0.12.tar.gz" sha256 "2857e29ff0d34db842cd7ca3230549d1a697f96ee6d3fb071cfa6c7393832597" end resource "defusedxml" do url "https://files.pythonhosted.org/packages/0f/d5/c66da9b79e5bdb124974bfe172b4daf3c984ebd9c2a06e2b8a4dc7331c72/defusedxml-0.7.1.tar.gz" sha256 "1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69" end resource "idna" do url "https://files.pythonhosted.org/packages/62/08/e3fc7c8161090f742f504f40b1bccbfc544d4a4e09eb774bf40aafce5436/idna-3.3.tar.gz" sha256 "9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d" end resource "multidict" do url "https://files.pythonhosted.org/packages/fa/a7/71c253cdb8a1528802bac7503bf82fe674367e4055b09c28846fdfa4ab90/multidict-6.0.2.tar.gz" sha256 "5ff3bd75f38e4c43f1f470f2df7a4d430b821c4ce22be384e1459cb57d6bb013" end resource "Pygments" do url "https://files.pythonhosted.org/packages/94/9c/cb656d06950268155f46d4f6ce25d7ffc51a0da47eadf1b164bbf23b718b/Pygments-2.11.2.tar.gz" sha256 "4e426f72023d88d03b2fa258de560726ce890ff3b630f88c21cbb8b2503b8c6a" end resource "PySocks" do url "https://files.pythonhosted.org/packages/bd/11/293dd436aea955d45fc4e8a35b6ae7270f5b8e00b53cf6c024c83b657a11/PySocks-1.7.1.tar.gz" sha256 "3f8804571ebe159c380ac6de37643bb4685970655d3bba243530d6558b799aa0" end resource "requests" do url "https://files.pythonhosted.org/packages/60/f3/26ff3767f099b73e0efa138a9998da67890793bfa475d8278f84a30fec77/requests-2.27.1.tar.gz" sha256 "68d7c56fd5a8999887728ef304a6d12edc7be74f1cfa47714fc8b414525c9a61" end resource "requests-toolbelt" do url "https://files.pythonhosted.org/packages/28/30/7bf7e5071081f761766d46820e52f4b16c8a08fef02d2eb4682ca7534310/requests-toolbelt-0.9.1.tar.gz" sha256 "968089d4584ad4ad7c171454f0a5c6dac23971e9472521ea3b6d49d610aa6fc0" end resource "urllib3" do url "https://files.pythonhosted.org/packages/b0/b1/7bbf5181f8e3258efae31702f5eab87d8a74a72a0aa78bc8c08c1466e243/urllib3-1.26.8.tar.gz" sha256 "0e7c33d9a63e7ddfcb86780aac87befc2fbddf46c58dbb487e0855f7ceec283c" end def install virtualenv_install_with_resources end test do assert_match version.to_s, shell_output("#{bin}/httpie --version") assert_match version.to_s, shell_output("#{bin}/https --version") assert_match version.to_s, shell_output("#{bin}/http --version") raw_url = "https://raw.githubusercontent.com/Homebrew/homebrew-core/HEAD/Formula/httpie.rb" assert_match "PYTHONPATH", shell_output("#{bin}/http --ignore-stdin #{raw_url}") end end cli-3.2.4/docs/packaging/brew/update.sh000077500000000000000000000002101471121002400177040ustar00rootroot00000000000000#!/bin/bash set -xe rm -f httpie.rb http --download https://raw.githubusercontent.com/Homebrew/homebrew-core/master/Formula/httpie.rb cli-3.2.4/docs/packaging/linux-arch/000077500000000000000000000000001471121002400172055ustar00rootroot00000000000000cli-3.2.4/docs/packaging/linux-arch/PKGBUILD000066400000000000000000000030471471121002400203350ustar00rootroot00000000000000# Maintainer: Jelle van der Waa # Maintainer: daurnimator # Contributor: Daniel Micay # Contributor: Thomas Weißschuh pkgname=httpie pkgver=2.6.0 pkgrel=1 pkgdesc="human-friendly CLI HTTP client for the API era" url="https://github.com/httpie/cli" depends=('python-defusedxml' 'python-pygments' 'python-pysocks' 'python-requests' 'python-requests-toolbelt' 'python-charset-normalizer') makedepends=('python-setuptools') checkdepends=('python-pytest' 'python-pytest-httpbin' 'python-responses') conflicts=(python-httpie) replaces=(python-httpie python2-httpie) license=('BSD') arch=('any') source=($pkgname-$pkgver.tar.gz::"https://github.com/httpie/cli/archive/$pkgver.tar.gz") sha256sums=('3bcd9a8cb2b11299da12d3af36c095c6d4b665e41c395898a07f1ae4d99fc14a') build() { cd $pkgname-$pkgver python3 setup.py build } package() { cd $pkgname-$pkgver install -Dm644 LICENSE "$pkgdir/usr/share/licenses/httpie/LICENSE" python3 setup.py install --root="$pkgdir" --optimize=1 # Fix upstream, include them in MANIFEST.in and use data_files in setup.py to install them automatically # TODO: add zsh support install -Dm644 extras/httpie-completion.bash "$pkgdir"/usr/share/bash-completion/completions/http install -Dm644 extras/httpie-completion.fish "$pkgdir"/usr/share/fish/vendor_completions.d/http.fish } check() { cd $pkgname-$pkgver PYTHONDONTWRITEBYTECODE=1 pytest tests } cli-3.2.4/docs/packaging/linux-arch/README.md000066400000000000000000000025411471121002400204660ustar00rootroot00000000000000# HTTPie on Arch Linux, and derived Welcome to the documentation about **packaging HTTPie for Arch Linux**. - If you do not know HTTPie, have a look [here](https://httpie.io/cli). - If you are looking for HTTPie installation or upgrade instructions on Arch Linux, then you can find them on [that page](https://httpie.io/docs#arch-linux). - If you are looking for technical information about the HTTPie packaging on Arch Linux, then you are in a good place. ## About This document contains technical details, where we describe how to create a patch for the latest HTTPie version for Arch Linux. They apply to Arch-derived distributions as well, like ArcoLinux, EndeavourOS, Artix Linux, etc. We will discuss setting up the environment, installing development tools, installing and testing changes before submitting a patch downstream. ## Overall process Note: Sending patches downstream does not seem easy. We failed to find where is located the package file on . So we are relying on the last maintainer, daurnimator, and it works pretty well so far. Check and if the version is outdated, simply [report it](https://archlinux.org/packages/community/any/httpie/flag/). ## Hacking Left blank on purpose, we will fill that section when we will have access to the downstream repository. cli-3.2.4/docs/packaging/linux-centos/000077500000000000000000000000001471121002400175635ustar00rootroot00000000000000cli-3.2.4/docs/packaging/linux-centos/README.md000066400000000000000000000032101471121002400210360ustar00rootroot00000000000000# HTTPie on CentOS, RHEL, and derived Welcome to the documentation about **packaging HTTPie for CentOS and RHEL**. - If you do not know HTTPie, have a look [here](https://httpie.io/cli). - If you are looking for HTTPie installation or upgrade instructions on CentOS, then you can find them on [that page](https://httpie.io/docs#centos-and-rhel). - If you are looking for technical information about the HTTPie packaging on CentOS, then you are in a good place. ## About This document contains technical details, where we describe how to create a patch for the latest HTTPie version for CentOS. They apply to RHEL as well, and any RHEL-derived distributions like ClearOS, Oracle Linux, etc. We will discuss setting up the environment, installing development tools, installing and testing changes before submitting a patch downstream. The current maintainer is [Mikel Olasagasti](https://github.com/kaxero). ## Overall process Same as [Fedora](../linux-fedora/README.md#overall-process). ## Q/A with Mikel Q: What should we do to help seeing a new version on CentOS? A: When a new release is published Miro and I get notified by [release-monitoring](https://release-monitoring.org/project/1337/), that fills a BugZilla ticket reporting a new version being available. The system also tries to create a simple patch to update the spec file, but in the case of CentOS it needs some manual revision. For example for 2.5.0 `defuxedxml` dep is required. Maybe with CentOS-9 and some new macros that are available now in Fedora it can be automated same way. But even the bump can be automated, maintainers should check for license changes, new binaries/docs/ and so on. cli-3.2.4/docs/packaging/linux-debian/000077500000000000000000000000001471121002400175125ustar00rootroot00000000000000cli-3.2.4/docs/packaging/linux-debian/README.md000066400000000000000000000042041471121002400207710ustar00rootroot00000000000000# HTTPie on Debian, Ubuntu, and derived Welcome to the documentation about **packaging HTTPie for Debian GNU/Linux**. - If you do not know HTTPie, have a look [here](https://httpie.io/cli). - If you are looking for HTTPie installation or upgrade instructions on Debian GNU/Linux, then you can find them on [that page](https://httpie.io/docs#debian-and-ubuntu). - If you are looking for technical information about the HTTPie packaging on Debian GNU/Linux, then you are in a good place. ## About This document contains technical details, where we describe how to create a patch for the latest HTTPie version for Debian GNU/Linux. They apply to Ubuntu as well, and any Debian-derived distributions like MX Linux, Linux Mint, deepin, Pop!_OS, KDE neon, Zorin OS, elementary OS, Kubuntu, Devuan, Linux Lite, Peppermint OS, Lubuntu, antiX, Xubuntu, etc. We will discuss setting up the environment, installing development tools, installing and testing changes before submitting a patch downstream. We create the standalone binaries (see this [for more details](../../../extras/packaging/linux/)) and package them with [FPM](https://github.com/jordansissel/fpm)'s `dir` mode. The core `http`/`https` commands don't have any dependencies, but the `httpie` command (due to the underlying `httpie cli plugins` interface) explicitly depends to the system Python (through `python3`/`python3-pip`). ## Overall process The [`Release as Standalone Linux Binary`](https://github.com/httpie/cli/actions/workflows/release-linux-standalone.yml) will be automatically triggered when a new release is created, and it will submit the `.deb` package as a release asset. For making that asset available for all debian users, the release manager needs to go to the [`httpie/debian.httpie.io`](https://github.com/httpie/debian.httpie.io) repo and trigger the [`Update Index`](https://github.com/httpie/debian.httpie.io/actions/workflows/update-index.yml) action. It will automatically scrape all new debian packages from the release assets, properly update the indexes and create a new PR ([an example](https://github.com/httpie/debian.httpie.io/pull/1)) which then will become active when merged. cli-3.2.4/docs/packaging/linux-fedora/000077500000000000000000000000001471121002400175305ustar00rootroot00000000000000cli-3.2.4/docs/packaging/linux-fedora/README.md000066400000000000000000000044251471121002400210140ustar00rootroot00000000000000# HTTPie on Fedora Welcome to the documentation about **packaging HTTPie for Fedora**. - If you do not know HTTPie, have a look [here](https://httpie.io/cli). - If you are looking for HTTPie installation or upgrade instructions on Fedora, then you can find them on [that page](https://httpie.io/docs#fedora). - If you are looking for technical information about the HTTPie packaging on Fedora, then you are in a good place. ## About This document contains technical details, where we describe how to create a patch for the latest HTTPie version for Fedora. We will discuss setting up the environment, installing development tools, installing and testing changes before submitting a patch downstream. The current maintainer is [Miro Hrončok](https://github.com/hroncok). ## Overall process We added the [.packit.yaml](https://github.com/httpie/cli/blob/master/.packit.yaml) local file. It unlocks real-time Fedora checks on pull requests and new releases. So there is nothing to do on our side: `Packit` will see the new release and open a pull request [there](https://src.fedoraproject.org/rpms/httpie). Then, the Fedora maintainer will review and merge. It is also possible to follow [user feedbacks](https://bodhi.fedoraproject.org/updates/?packages=httpie) for all builds. ## Q/A with Miro Q: What would the command to install the latest stable version look like? A: Assuming the latest stable version is already propagated to Fedora: ```bash # Note that yum is an alias to dnf. $ sudo dnf install httpie ``` Q: Will dnf/yum upgrade then update to the latest? A: Yes, assuming the same as above. Q: Are new versions backported automatically? A: No. The process is: 1. A new HTTPie release is created on Github. 2. A pull request for Fedora `rawhide` (the development version of Fedora, currently Fedora 36) is created. 3. A Fedora packager (usually Miro) sanity checks the pull request and merges, builds. HTTPie is updated in `rawhide` within 24 hours (sometimes more, for unrelated issues). 4. A Fedora packager decides whether the upgrade is suitable for stable Fedora releases (currently 35, 34, 33), if so, merges the changes there. 5. (if the above is yes) The new version of HTTPie lands in `updates-testing` repo where it waits for user feedback and lands within ~1 week for broad availability. cli-3.2.4/docs/packaging/linux-fedora/httpie.spec.txt000066400000000000000000000222111471121002400225150ustar00rootroot00000000000000Name: httpie Version: 3.1.0 Release: 1%{?dist} Summary: A Curl-like tool for humans License: BSD URL: https://httpie.org/ Source0: https://github.com/httpie/cli/archive/%{version}/%{name}-%{version}.tar.gz BuildArch: noarch BuildRequires: python3-devel BuildRequires: pyproject-rpm-macros BuildRequires: help2man %description HTTPie is a CLI HTTP utility built out of frustration with existing tools. The goal is to make CLI interaction with HTTP-based services as human-friendly as possible. HTTPie does so by providing an http command that allows for issuing arbitrary HTTP requests using a simple and natural syntax and displaying colorized responses. %prep %autosetup -p1 %generate_buildrequires %pyproject_buildrequires -rx test %build %pyproject_wheel %install %pyproject_install %pyproject_save_files httpie # Bash completion mkdir -p %{buildroot}%{_datadir}/bash-completion/completions cp -a extras/httpie-completion.bash %{buildroot}%{_datadir}/bash-completion/completions/http ln -s ./http %{buildroot}%{_datadir}/bash-completion/completions/https # Fish completion mkdir -p %{buildroot}%{_datadir}/fish/vendor_completions.d/ cp -a extras/httpie-completion.fish %{buildroot}%{_datadir}/fish/vendor_completions.d/http.fish ln -s ./http.fish %{buildroot}%{_datadir}/fish/vendor_completions.d/https.fish # Generate man pages for everything export PYTHONPATH=%{buildroot}%{python3_sitelib} mkdir -p %{buildroot}%{_mandir}/man1 help2man %{buildroot}%{_bindir}/http > %{buildroot}%{_mandir}/man1/http.1 help2man %{buildroot}%{_bindir}/https > %{buildroot}%{_mandir}/man1/https.1 help2man %{buildroot}%{_bindir}/httpie > %{buildroot}%{_mandir}/man1/httpie.1 %check %pytest -v %files -f %{pyproject_files} %doc README.md %license LICENSE %{_bindir}/http %{_bindir}/https %{_bindir}/httpie %{_mandir}/man1/http.1* %{_mandir}/man1/https.1* %{_mandir}/man1/httpie.1* # we co-own the entire directory structures for bash/fish completion to avoid a dependency %{_datadir}/bash-completion/ %{_datadir}/fish/ %changelog * Tue Mar 08 2022 Miro Hrončok - 3.1.0-1 - Update to 3.1.0 - Fixes: rhbz#2061597 * Mon Jan 24 2022 Miro Hrončok - 3.0.2-1 - Update to 3.0.2 - Fixes: rhbz#2044572 * Mon Jan 24 2022 Miro Hrončok - 3.0.1-1 - Update to 3.0.1 - Fixes: rhbz#2044058 * Fri Jan 21 2022 Miro Hrončok - 3.0.0-1 - Update to 3.0.0 - Fixes: rhbz#2043680 * Thu Jan 20 2022 Fedora Release Engineering - 2.6.0-2 - Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild * Fri Oct 15 2021 Miro Hrončok - 2.6.0-1 - Update to 2.6.0 - Fixes: rhbz#2014022 * Tue Sep 07 2021 Miro Hrončok - 2.5.0-1 - Update to 2.5.0 - Fixes: rhbz#2001693 * Thu Jul 22 2021 Fedora Release Engineering - 2.4.0-4 - Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild * Fri Jun 04 2021 Python Maint - 2.4.0-3 - Rebuilt for Python 3.10 * Thu May 27 2021 Miro Hrončok - 2.4.0-2 - Add Bash and Fish completion - Fixes rhbz#1834441 - Run tests on build time * Wed Mar 24 2021 Mikel Olasagasti Uranga - 2.4.0-1 - Update to 2.4.0 - Use pypi_source macro * Tue Jan 26 2021 Fedora Release Engineering - 2.3.0-3 - Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild * Thu Jan 21 2021 Nils Philippsen - 2.3.0-2 - use macros for Python dependencies - add missing Python dependencies needed for running help2man - remove manual Python dependencies - discard stderr when running help2man * Thu Dec 24 2020 Nils Philippsen - 2.3.0-1 - version 2.3.0 - Python 2 is no more - use %%autosetup and Python build macros - remove EL7-isms - explicitly require sed for building * Tue Jul 28 2020 Fedora Release Engineering - 1.0.3-4 - Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild * Tue May 26 2020 Miro Hrončok - 1.0.3-3 - Rebuilt for Python 3.9 * Wed Jan 29 2020 Fedora Release Engineering - 1.0.3-2 - Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild * Mon Sep 30 2019 Rick Elrod - 1.0.3-1 - Latest upstream * Mon Aug 19 2019 Miro Hrončok - 0.9.4-15 - Rebuilt for Python 3.8 * Thu Jul 25 2019 Fedora Release Engineering - 0.9.4-14 - Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild * Fri Feb 01 2019 Fedora Release Engineering - 0.9.4-13 - Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild * Fri Jul 13 2018 Fedora Release Engineering - 0.9.4-12 - Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild * Tue Jun 19 2018 Miro Hrončok - 0.9.4-11 - Rebuilt for Python 3.7 * Wed Feb 07 2018 Fedora Release Engineering - 0.9.4-10 - Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild * Wed Jul 26 2017 Fedora Release Engineering - 0.9.4-9 - Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild * Fri Mar 10 2017 Ralph Bean - 0.9.4-8 - Fix help2man usage with python3. https://bugzilla.redhat.com/show_bug.cgi?id=1430733 * Mon Feb 27 2017 Ralph Bean - 0.9.4-7 - Fix missing Requires. https://bugzilla.redhat.com/show_bug.cgi?id=1417730 * Fri Feb 10 2017 Fedora Release Engineering - 0.9.4-6 - Rebuilt for https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild * Mon Jan 2 2017 Ricky Elrod - 0.9.4-5 - Add missing Obsoletes. * Mon Jan 2 2017 Ricky Elrod - 0.9.4-4 - Nuke python-version-specific subpackages. Just use py3 if we can. * Mon Dec 19 2016 Miro Hrončok - 0.9.4-3 - Rebuild for Python 3.6 * Tue Jul 19 2016 Fedora Release Engineering - 0.9.4-2 - https://fedoraproject.org/wiki/Changes/Automatic_Provides_for_Python_RPM_Packages * Tue Jul 05 2016 Ricky Elrod - 0.9.4-1 - Update to latest upstream. * Fri Jun 03 2016 Ricky Elrod - 0.9.3-4 - Add proper Obsoletes for rhbz#1329226. * Wed Feb 03 2016 Fedora Release Engineering - 0.9.3-3 - Rebuilt for https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild * Mon Jan 04 2016 Ralph Bean - 0.9.3-2 - Modernize python macros and subpackaging. - Move LICENSE to %%license macro. - Make python3 the default on modern Fedora. * Mon Jan 04 2016 Ralph Bean - 0.9.3-1 - new version * Tue Nov 10 2015 Fedora Release Engineering - 0.9.2-3 - Rebuilt for https://fedoraproject.org/wiki/Changes/python3.5 * Wed Jun 17 2015 Fedora Release Engineering - 0.9.2-2 - Rebuilt for https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild * Thu Mar 26 2015 Ricky Elrod - 0.9.2-1 - Latest upstream release. * Sat Jun 07 2014 Fedora Release Engineering - 0.8.0-3 - Rebuilt for https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild * Wed May 28 2014 Kalev Lember - 0.8.0-2 - Rebuilt for https://fedoraproject.org/wiki/Changes/Python_3.4 * Fri Jan 31 2014 Ricky Elrod - 0.8.0-1 - Latest upstream release. * Fri Oct 4 2013 Ricky Elrod - 0.7.2-2 - Add in patch to work without having python-requests 2.0.0. * Sat Sep 28 2013 Ricky Elrod - 0.7.2-1 - Latest upstream release. * Thu Sep 5 2013 Ricky Elrod - 0.6.0-7 - Only try building the manpage on Fedora, since RHEL's help2man doesn't have the --no-discard-stderr flag. * Thu Sep 5 2013 Ricky Elrod - 0.6.0-6 - Loosen the requirement on python-pygments. * Sat Aug 03 2013 Fedora Release Engineering - 0.6.0-5 - Rebuilt for https://fedoraproject.org/wiki/Fedora_20_Mass_Rebuild * Tue Jul 2 2013 Ricky Elrod - 0.6.0-4 - python-requests 1.2.3 exists in rawhide now. * Sun Jun 30 2013 Ricky Elrod - 0.6.0-3 - Patch to use python-requests 1.1.0 for now. * Sat Jun 29 2013 Ricky Elrod - 0.6.0-2 - Update to latest upstream release. * Mon Apr 29 2013 Ricky Elrod - 0.5.0-2 - Fix changelog messup. * Mon Apr 29 2013 Ricky Elrod - 0.5.0-1 - Update to latest upstream release. * Mon Apr 8 2013 Ricky Elrod - 0.4.1-3 - Fix manpage generation by exporting PYTHONPATH. * Tue Mar 26 2013 Ricky Elrod - 0.4.1-2 - Include Python3 support, and fix other review blockers. * Mon Mar 11 2013 Ricky Elrod - 0.4.1-1 - Update to latest upstream release * Thu Jul 19 2012 Ricky Elrod - 0.2.5-1 - Initial build. cli-3.2.4/docs/packaging/linux-fedora/update.sh000077500000000000000000000002141471121002400213460ustar00rootroot00000000000000#!/bin/bash set -xe rm -f httpie.spec.txt https --download src.fedoraproject.org/rpms/httpie/raw/rawhide/f/httpie.spec -o httpie.spec.txt cli-3.2.4/docs/packaging/mac-ports/000077500000000000000000000000001471121002400170405ustar00rootroot00000000000000cli-3.2.4/docs/packaging/mac-ports/Portfile000066400000000000000000000043601471121002400205520ustar00rootroot00000000000000# -*- coding: utf-8; mode: tcl; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- vim:fenc=utf-8::et:sw=4:ts=4:sts=4 PortSystem 1.0 PortGroup github 1.0 PortGroup python 1.0 github.setup httpie httpie 2.6.0 maintainers {g5pw @g5pw} openmaintainer categories net description Modern, user-friendly command-line HTTP client for the API era long_description HTTPie (pronounced aych-tee-tee-pie) is a command line HTTP \ client. Its goal is to make CLI interaction with web \ services as human-friendly as possible. It provides a simple \ http command that allows for sending arbitrary HTTP requests \ using a simple and natural syntax, and displays colorized \ responses. HTTPie can be used for testing, debugging, and \ generally interacting with HTTP servers. platforms darwin license BSD homepage https://httpie.io/ variant python37 conflicts python36 python38 python39 python310 description "Use Python 3.7" {} variant python38 conflicts python36 python37 python39 python310 description "Use Python 3.8" {} variant python39 conflicts python36 python37 python38 python310 description "Use Python 3.9" {} variant python310 conflicts python36 python37 python38 python39 description "Use Python 3.10" {} if {[variant_isset python37]} { python.default_version 37 } elseif {[variant_isset python39]} { python.default_version 39 } elseif {[variant_isset python310]} { python.default_version 310 } else { default_variants +python38 python.default_version 38 } depends_lib-append port:py${python.version}-requests \ port:py${python.version}-requests-toolbelt \ port:py${python.version}-pygments \ port:py${python.version}-socks \ port:py${python.version}-charset-normalizer \ port:py${python.version}-defusedxml checksums rmd160 07b1d1592da1c505ed3ee4ef3b6056215e16e9ff \ sha256 63cf104bf3552305c68a74f16494a90172b15296610a875e17918e5e36373c0b \ size 1133491 python.link_binaries_suffix cli-3.2.4/docs/packaging/mac-ports/README.md000066400000000000000000000030241471121002400203160ustar00rootroot00000000000000# HTTPie on MacPorts Welcome to the documentation about **packaging HTTPie for MacPorts**. - If you do not know HTTPie, have a look [here](https://httpie.io/cli). - If you are looking for HTTPie installation or upgrade instructions on MacPorts, then you can find them on [that page](https://httpie.io/docs#macports). - If you are looking for technical information about the HTTPie packaging on MacPorts, then you are in a good place. ## About This document contains technical details, where we describe how to create a patch for the latest HTTPie version for MacPorts. We will discuss setting up the environment, installing development tools, installing and testing changes before submitting a patch downstream. ## Overall process Open a pull request to update the [downstream file](https://github.com/macports/macports-ports/blob/master/net/httpie/Portfile) ([example](https://github.com/macports/macports-ports/pull/12583)). - Here is how to calculate the size and checksums (replace `2.5.0` with the correct version): ```bash # Download the archive $ wget https://api.github.com/repos/httpie/cli/tarball/2.5.0 # Size $ stat --printf="%s\n" 2.5.0 1105185 # Checksums $ openssl dgst -rmd160 2.5.0 RIPEMD160(2.5.0)= 88d227d52199c232c0ddf704a219d1781b1e77ee $ openssl dgst -sha256 2.5.0 SHA256(2.5.0)= 00c4b7bbe7f65abe1473f37b39d9d9f8f53f44069a430ad143a404c01c2179fc ``` - The commit message must be `httpie: update to XXX`. - The commit must be signed-off (`git commit -s`). ## Hacking :construction: Work in progress. cli-3.2.4/docs/packaging/snapcraft/000077500000000000000000000000001471121002400171145ustar00rootroot00000000000000cli-3.2.4/docs/packaging/snapcraft/README.md000066400000000000000000000035161471121002400204000ustar00rootroot00000000000000# HTTPie on Snapcraft Welcome to the documentation about **packaging HTTPie for Snapcraft**. - If you do not know HTTPie, have a look [here](https://httpie.io/cli). - If you are looking for HTTPie installation or upgrade instructions on Snapcraft, then you can find them on [that page](https://httpie.io/docs#snapcraft-linux) ([that one](https://httpie.io/docs#snapcraft-macos) for macOS). - If you are looking for technical information about the HTTPie packaging on Snapcraft, then you are in a good place. ## About This document contains technical details, where we describe how to create a patch for the latest HTTPie version for Snapcraft. They apply to Snapcraft on Linux, macOS, and Windows. We will discuss setting up the environment, installing development tools, installing and testing changes before submitting a patch downstream. ## Overall process Trigger the [`Release on Snap`](https://github.com/httpie/cli/actions/workflows/release-snap.yml) action, which will create a snap package for HTTPie and then push it to Snap Store in the following channels: - Edge - Beta - Candidate - Stable If a push to any of them fail, all the release tasks for the following channels will be cancelled so that the release manager can look into the underlying cause. ## Hacking Launch the docker image: ```bash docker pull ubuntu/latest docker run -it --rm ubuntu/latest ``` From inside the container: ```bash # Clone git clone --depth=1 https://github.com/httpie/cli.git cd httpie # Build export SNAPCRAFT_BUILD_ENVIRONMENT_CPU=8 export SNAPCRAFT_BUILD_ENVIRONMENT_MEMORY=16G snapcraft --debug # Install sudo snap install --dangerous httpie_XXX_amd64.snap # Test httpie.http --version httpie.https --version # Auto-aliases cannot be tested when installing a snap outside the store. # http --version # https --version # Remove sudo snap remove httpie ``` cli-3.2.4/docs/packaging/windows-chocolatey/000077500000000000000000000000001471121002400207555ustar00rootroot00000000000000cli-3.2.4/docs/packaging/windows-chocolatey/README.md000066400000000000000000000031411471121002400222330ustar00rootroot00000000000000# HTTPie on Chocolatey Welcome to the documentation about **packaging HTTPie for Chocolatey**. - If you do not know HTTPie, have a look [here](https://httpie.io/cli). - If you are looking for HTTPie installation or upgrade instructions on Chocolatey, then you can find them on [that page](https://httpie.io/docs#chocolatey). - If you are looking for technical information about the HTTPie packaging on Chocolatey, then you are in a good place. ## About This document contains technical details, where we describe how to create a patch for the latest HTTPie version for Chocolatey. We will discuss setting up the environment, installing development tools, installing and testing changes before submitting a patch downstream. ## Overall process After having successfully [built and tested](#hacking) the package, either trigger the [`Release on Chocolatey`](https://github.com/httpie/cli/actions/workflows/release-choco.yml) action to push it to the `Chocolatey` store or use the CLI: ```bash # Replace 2.5.0 with the correct version choco push httpie.2.5.0.nupkg -s https://push.chocolatey.org/ --api-key=API_KEY ``` Be aware that it might take multiple days until the release is approved, sine it goes through multiple sets of reviews (some of them are done manually). ## Hacking ```bash # Clone git clone --depth=1 https://github.com/httpie/cli.git cd httpie/docs/packaging/windows-chocolatey # Build choco pack # Check metadata choco info httpie -s . # Install choco install httpie -y -dv -s "'.;https://community.chocolatey.org/api/v2/'" # Test http --version https --version # Remove choco uninstall -y httpie ``` cli-3.2.4/docs/packaging/windows-chocolatey/httpie.nuspec000066400000000000000000000044541471121002400235000ustar00rootroot00000000000000 httpie 3.2.2 Modern, user-friendly command-line HTTP client for the API era HTTPie *aitch-tee-tee-pie* is a user-friendly command-line HTTP client for the API era. It comes with JSON support, syntax highlighting, persistent sessions, wget-like downloads, plugins, and more. The project's goal is to make CLI interaction with web services as human-friendly as possible. HTTPie is designed for testing, debugging, and generally interacting with APIs and HTTP servers. The `http` and `https` commands allow for creating and sending arbitrary HTTP requests. They use simple and natural syntax and provide formatted and colorized output. Main features: - Built-in JSON support - Colorized and formatted terminal output - Sensible defaults for the API era - Persistent sessions - Forms and file uploads - HTTPS, proxies, and authentication support - Support for arbitrary request data and headers - Wget-like downloads - Extensions API - Expressive and intuitive syntax - Linux, macOS, Windows, and FreeBSD support - All that and more in 2 simple commands: `http` + `https` HTTPie HTTPie jakubroztocil 2012-2022 Jakub Roztocil https://raw.githubusercontent.com/httpie/cli/master/LICENSE https://pie-assets.s3.eu-central-1.amazonaws.com/LogoIcons/GB.png false See the [changelog](https://github.com/httpie/cli/releases/tag/3.2.2). httpie http https rest api client curl python ssl cli foss oss url https://httpie.io https://github.com/httpie/cli/tree/master/docs/packaging/windows-chocolatey https://github.com/httpie/cli https://httpie.io/docs https://github.com/httpie/cli/issues cli-3.2.4/docs/packaging/windows-chocolatey/tools/000077500000000000000000000000001471121002400221155ustar00rootroot00000000000000cli-3.2.4/docs/packaging/windows-chocolatey/tools/chocolateyinstall.ps1000066400000000000000000000002141471121002400262600ustar00rootroot00000000000000$ErrorActionPreference = 'Stop'; py -m pip install $env:ChocolateyPackageName==$env:ChocolateyPackageVersion --disable-pip-version-check cli-3.2.4/docs/packaging/windows-chocolatey/tools/chocolateyuninstall.ps1000066400000000000000000000001621471121002400266250ustar00rootroot00000000000000$ErrorActionPreference = 'Stop'; py -m pip uninstall -y $env:ChocolateyPackageName --disable-pip-version-check cli-3.2.4/docs/stardust.png000066400000000000000000001630671471121002400156030ustar00rootroot00000000000000PNG  IHDR?Ln pHYs  sRGBgAMA aIDATx]\'?YTTFFP RcUF (z nbm_tgQjĆw/7}fac:'ܾ @ р8nX,)f[E^UysToy>O*O>ɔPP qJA @)(8 @RP qJA @)(8 @RP qJA @)(8 @RP qJA @)(8 @RP qJA @)(8 @RP qJA @):rp{H tc/k|6Я _<:}x0i<ԱNX-sޭɻ߳Ι[kYs Gz80X O?6TҽZX:|ΰk?{&෿"_|Y=jwΙ5N/Us+O?=fZ|7}qwx)!EL sv {sTؼ{KX)5'7g~GmkC89{pdux|40x|y/W)Ni^.\{y Mi(_i-?W֏@҉a毟<ꌎu?XFcUkP?7[L6@4yk$M6o׍ Eͦox! (ۓ3_O]4Q^9h[={p:}~?txN/h'4bޗI*ЌA|\-ܸ2ۤ1yZ8?^ = w*KT3=jyv`:}s ;1$_s}=?uG)n?׋_?cϠ1ئ}jb+k(@I|ީж!㵰mjC5gknQ86)9t懵;bSۦv{z_/z7x:I|/Fe_!rr2>%\ cGv"< q::SGo>z=Pvxlcs]Ͽټn㞮\kwG6³>6>yOs=YlJ֋L?.|FdsHLV7hxR\{m\1]Փ)3m?Wfw|׵`^5̣z@x3筵6 jo'Nuk W5Y?*S8y=w|a}q-õປ:P{pޓc<{owg7Av'3f>`kNJtO  ΢%Q `Eb87Ca`;OcOyf:bJNն?|gk;sߝ >>ߓY*?jD _Oc_x(g#.ks+> FN})wc78 n?x|>/N=#bj /><꿯7`w?Jկa u ؍OMC?@ɩ,l @)TR0!@)(8 @RP qJA @)(8 @RP qJA @)(8 @RP qJA @)(8 @RP qJA @)(8 @RP qJA @)(8 @RP qJA @)(8 @RP qJA @)(8pS`E͝{7\4W0\0<66{ 3vu/>X:ė)N]g;0=ͩ|nݱ{ہkl GzV5P 3/'04w}n c@^ ‰xv6t=O1$>ywƙIl]?Pt, Ǔ3ֿ:q{dl> xnk|9wr;q*<9%_gϽr;2>.<{m{žTerq{zWwަެJɻFtCӡȞ{s wkO׾Ʀ˔A ~0<x'W/%J%E6N?7sv7|9u,ppRF.kOߨ'[ z{r[~=n=~o7$Nw_|lX>yOj!o7 og׈lo&&зug}O!k_gE8*ok5Xc5Xc5Xc5Xc5 6mg`<~%5jU(O"1@Oə@⩳/^?\3 ߭kkkkп02FgvljX4wB:^7)Nwj[>pzѯ׿߳kkkkka ?nzHrunooO  ;kZXTɞ{+Y1.u,1|]?~׹ 0L/Ӟ{=B=ӶO>N:d}Mb^LGO_#E磸&[7̻WAuS`Ybq;zB=N[:ur,L;LԂCP=>߭GO'+W͆H L1nԒ4:~9|g$o5b:_a#?Ia}7rT|VZ: ×{{!u,z~d%$w^RJxdK# WTVww o{pڱ]ϱ*%\ѯ*|gF kƀS V@8)7J5'޴3Ϲ_iۜo Jb:y4p#FGO=a}G  h%ى(N{ U)1 K_kmsk.g7OTjA?P<[ȗ\_˩c1$0`~n8SgێgROW/myژ s5!sp3 w^o?i U)qJ V`{z=ICvɅG~ cJs=Gq6N\[jfΤΆmS_G  W'1_W/aO&q:;Nrǩ?ǰ=k"Dx&>$Rt'ʵ? <t 12Ǎ7WJ cX~?Ou 8osOVq`oW4b Jʊ\f7ezWCqcB(c9X{+5&W/~6m&?P{:KBK g~`>a9'N u$Q ;U*O/u|*ߴ{ˢ&7xS8'NPB#qRhն=JJ޼+nF*z~>? @Yc?v֞o[O F̣RmmY1>Qbŏl9~7&_OA$sq̽w!xAxC w>{>kVbX>?A2eC(0du?o}o;Pf' Cx|vtne߿M'Wdj| %sw?}QDq>Iܱm3qs_t> *8@5#1F*abnCM` ԡjL_Ndq>l9~#bkWΙ JA  [q??ޯe!a1?ph|OPVqkQ6޼{Ep=e%HXw0VA8*38۰)=Lm+XCq5>io` V 7V V 7 V  I7H_K$Oq. Cop! qp" &8A8`svvہaxlc_|yxp҇Տm { 3s\Ws\S6wo PFpr\v0xl8Z`Yx />f=ﴅ1 C\/IX}7@E guWjĉp쩇 }c/5e!(ũ劓yaxNyǺjKcJ oTԯ]0m*GÑ-w JƄ }"d=x8l=Q~d|$8NngmSS7^<=yw :xNvϻ& 2A8If0qF?mƦ~ʄ2 փ[9u$_|ytԱ]}Mb^LGO_#1.;s>(L^4/vsa8rS`Y|߁tw 4v)1 1N-:5?0}0q`{1'xr%͆+⦙Ƕ `Eė)[ku2hsc<<6=ZK׈Am{#?5)X1Ԙ ?4?JQbܨ'Y̶01 }D7hnT1N'CrXOSQ4 As o{p&*kQ↙/L }hȎznL@ n@@DAxHn@zXc#[ 5CHe8'shlE+K ="nylL/Xyqp``mǶԿK $Np`m`Ŏ8ktG֎@؉Gm `(kfj^a88#[`}`%5b:֗@րpXqX` ` Uvh?8]#;&t@*Fw7`0bbkRL@ ><f' c6'§6 @o 6#>8, @kQfN O `Fvԃq&пP q];{ `p a=0P3aS8mF= 08QbWplqJkD6%!tl $Tvo;rP q*<֣Lmr0l DqVE9mƦ@@T4s|pI JqGmǷ6vo>^ySa}Sars\굮\ _|y]a-ջ·Lͺ4*a+in ~3) ΆϞ֟ϝ{7\|zp c_3-R OR5x0ĎaD Ͼ/ӯԾ~'A돽:؇G@?^<>}8݈Ov~"P|/xO=, 0@|Ŏd|?OM;Nv6t΄q)XŒXn3a8R21õy.lh>9;ն)N]##³gڦ'@gc6oN~MtM b?xx*h_amMss]@<)ӵ/~;ֿtK ?w&5 ~Ƿu7w֞tڈss1sv7|9u,p uS`YU)1̎&ݺI{x:^v{vz G7K}ʻe-m>m&c&s?l0 '?3\E7쟮?^C}׾

This is an example of an XHTML 1.0 Strict document.
Valid XHTML 1.0 Strict

cli-3.2.4/tests/fixtures/xmldata/xhtml/xhtml_formatted_python_less_than_3.8.xml000066400000000000000000000017321471121002400300370ustar00rootroot00000000000000 XHTML 1.0 Strict Example

This is an example of an XHTML 1.0 Strict document.
Valid XHTML 1.0 Strict

cli-3.2.4/tests/fixtures/xmldata/xhtml/xhtml_raw.xml000066400000000000000000000016561471121002400226170ustar00rootroot00000000000000 XHTML 1.0 Strict Example

This is an example of an XHTML 1.0 Strict document.
Valid XHTML 1.0 Strict

cli-3.2.4/tests/test_auth.py000066400000000000000000000120611471121002400157730ustar00rootroot00000000000000"""HTTP authentication-related tests.""" from unittest import mock import pytest from httpie.plugins.builtin import HTTPBasicAuth from httpie.status import ExitStatus from httpie.utils import ExplicitNullAuth from .utils import http, add_auth, HTTP_OK, MockEnvironment import httpie.cli.constants import httpie.cli.definition def test_basic_auth(httpbin_both): r = http('--auth=user:password', 'GET', httpbin_both + '/basic-auth/user/password') assert HTTP_OK in r assert r.json == {'authenticated': True, 'user': 'user'} @pytest.mark.parametrize('argument_name', ['--auth-type', '-A']) def test_digest_auth(httpbin_both, argument_name): r = http(argument_name + '=digest', '--auth=user:password', 'GET', httpbin_both.url + '/digest-auth/auth/user/password') assert HTTP_OK in r assert r.json == {'authenticated': True, 'user': 'user'} @pytest.mark.parametrize('token', [ 'token_1', 'long_token' * 5, 'user:style', ]) def test_bearer_auth(httpbin_both, token): r = http('--auth-type', 'bearer', '--auth', token, httpbin_both + '/bearer') assert HTTP_OK in r assert r.json == {'authenticated': True, 'token': token} @mock.patch('httpie.cli.argtypes.AuthCredentials._getpass', new=lambda self, prompt: 'password') def test_password_prompt(httpbin): r = http('--auth', 'user', 'GET', httpbin + '/basic-auth/user/password') assert HTTP_OK in r assert r.json == {'authenticated': True, 'user': 'user'} def test_credentials_in_url(httpbin_both): url = add_auth(httpbin_both.url + '/basic-auth/user/password', auth='user:password') r = http('GET', url) assert HTTP_OK in r assert r.json == {'authenticated': True, 'user': 'user'} def test_credentials_in_url_auth_flag_has_priority(httpbin_both): """When credentials are passed in URL and via -a at the same time, then the ones from -a are used.""" url = add_auth(httpbin_both.url + '/basic-auth/user/password', auth='user:wrong') r = http('--auth=user:password', 'GET', url) assert HTTP_OK in r assert r.json == {'authenticated': True, 'user': 'user'} @pytest.mark.parametrize('url', [ 'username@example.org', 'username:@example.org', ]) def test_only_username_in_url(url): """ https://github.com/httpie/cli/issues/242 """ args = httpie.cli.definition.parser.parse_args(args=[url], env=MockEnvironment()) assert args.auth assert args.auth.username == 'username' assert args.auth.password == '' def test_missing_auth(httpbin): r = http( '--auth-type=basic', 'GET', httpbin + '/basic-auth/user/password', tolerate_error_exit_status=True ) assert HTTP_OK not in r assert '--auth required' in r.stderr def test_netrc(httpbin_both): # This one gets handled by requests (no --auth, --auth-type present), # that’s why we patch inside `requests.sessions`. with mock.patch('requests.sessions.get_netrc_auth') as get_netrc_auth: get_netrc_auth.return_value = ('httpie', 'password') r = http(httpbin_both + '/basic-auth/httpie/password') assert get_netrc_auth.call_count == 1 assert HTTP_OK in r def test_ignore_netrc(httpbin_both): with mock.patch('httpie.cli.argparser.get_netrc_auth') as get_netrc_auth: get_netrc_auth.return_value = ('httpie', 'password') r = http('--ignore-netrc', httpbin_both + '/basic-auth/httpie/password') assert get_netrc_auth.call_count == 0 assert 'HTTP/1.1 401 UNAUTHORIZED' in r def test_ignore_netrc_together_with_auth(): args = httpie.cli.definition.parser.parse_args( args=['--ignore-netrc', '--auth=username:password', 'example.org'], env=MockEnvironment(), ) assert isinstance(args.auth, HTTPBasicAuth) def test_ignore_netrc_with_auth_type_resulting_in_missing_auth(httpbin): with mock.patch('httpie.cli.argparser.get_netrc_auth') as get_netrc_auth: get_netrc_auth.return_value = ('httpie', 'password') r = http( '--ignore-netrc', '--auth-type=basic', httpbin + '/basic-auth/httpie/password', tolerate_error_exit_status=True, ) assert get_netrc_auth.call_count == 0 assert r.exit_status == ExitStatus.ERROR assert '--auth required' in r.stderr @pytest.mark.parametrize( 'auth_type, endpoint', [ ('basic', '/basic-auth/httpie/password'), ('digest', '/digest-auth/auth/httpie/password'), ] ) def test_auth_plugin_netrc_parse(auth_type, endpoint, httpbin): # Test with mock.patch('httpie.cli.argparser.get_netrc_auth') as get_netrc_auth: get_netrc_auth.return_value = ('httpie', 'password') r = http('--auth-type', auth_type, httpbin + endpoint) assert get_netrc_auth.call_count == 1 assert HTTP_OK in r def test_ignore_netrc_null_auth(): args = httpie.cli.definition.parser.parse_args( args=['--ignore-netrc', 'example.org'], env=MockEnvironment(), ) assert isinstance(args.auth, ExplicitNullAuth) cli-3.2.4/tests/test_auth_plugins.py000066400000000000000000000071511471121002400175400ustar00rootroot00000000000000from unittest import mock from httpie.cli.constants import SEPARATOR_CREDENTIALS from httpie.plugins import AuthPlugin from httpie.plugins.registry import plugin_manager from .utils import http, HTTP_OK # TODO: run all these tests in session mode as well USERNAME = 'user' PASSWORD = 'password' # Basic auth encoded `USERNAME` and `PASSWORD` # noinspection SpellCheckingInspection BASIC_AUTH_HEADER_VALUE = 'Basic dXNlcjpwYXNzd29yZA==' BASIC_AUTH_URL = f'/basic-auth/{USERNAME}/{PASSWORD}' AUTH_OK = {'authenticated': True, 'user': USERNAME} def basic_auth(header=BASIC_AUTH_HEADER_VALUE): def inner(r): r.headers['Authorization'] = header return r return inner def test_auth_plugin_parse_auth_false(httpbin): class Plugin(AuthPlugin): auth_type = 'test-parse-false' auth_parse = False def get_auth(self, username=None, password=None): assert username is None assert password is None assert self.raw_auth == BASIC_AUTH_HEADER_VALUE return basic_auth(self.raw_auth) plugin_manager.register(Plugin) try: r = http( httpbin + BASIC_AUTH_URL, '--auth-type', Plugin.auth_type, '--auth', BASIC_AUTH_HEADER_VALUE, ) assert HTTP_OK in r assert r.json == AUTH_OK finally: plugin_manager.unregister(Plugin) def test_auth_plugin_require_auth_false(httpbin): class Plugin(AuthPlugin): auth_type = 'test-require-false' auth_require = False def get_auth(self, username=None, password=None): assert self.raw_auth is None assert username is None assert password is None return basic_auth() plugin_manager.register(Plugin) try: r = http( httpbin + BASIC_AUTH_URL, '--auth-type', Plugin.auth_type, ) assert HTTP_OK in r assert r.json == AUTH_OK finally: plugin_manager.unregister(Plugin) def test_auth_plugin_require_auth_false_and_auth_provided(httpbin): class Plugin(AuthPlugin): auth_type = 'test-require-false-yet-provided' auth_require = False def get_auth(self, username=None, password=None): assert self.raw_auth == USERNAME + SEPARATOR_CREDENTIALS + PASSWORD assert username == USERNAME assert password == PASSWORD return basic_auth() plugin_manager.register(Plugin) try: r = http( httpbin + BASIC_AUTH_URL, '--auth-type', Plugin.auth_type, '--auth', USERNAME + SEPARATOR_CREDENTIALS + PASSWORD, ) assert HTTP_OK in r assert r.json == AUTH_OK finally: plugin_manager.unregister(Plugin) @mock.patch('httpie.cli.argtypes.AuthCredentials._getpass', new=lambda self, prompt: 'UNEXPECTED_PROMPT_RESPONSE') def test_auth_plugin_prompt_password_false(httpbin): class Plugin(AuthPlugin): auth_type = 'test-prompt-false' prompt_password = False def get_auth(self, username=None, password=None): assert self.raw_auth == USERNAME assert username == USERNAME assert password is None return basic_auth() plugin_manager.register(Plugin) try: r = http( httpbin + BASIC_AUTH_URL, '--auth-type', Plugin.auth_type, '--auth', USERNAME, ) assert HTTP_OK in r assert r.json == AUTH_OK finally: plugin_manager.unregister(Plugin) cli-3.2.4/tests/test_binary.py000066400000000000000000000036661471121002400163310ustar00rootroot00000000000000"""Tests for dealing with binary request and response data.""" import requests from .fixtures import BIN_FILE_PATH, BIN_FILE_CONTENT, BIN_FILE_PATH_ARG from httpie.output.streams import BINARY_SUPPRESSED_NOTICE from .utils import MockEnvironment, http class TestBinaryRequestData: def test_binary_stdin(self, httpbin): with open(BIN_FILE_PATH, 'rb') as stdin: env = MockEnvironment( stdin=stdin, stdin_isatty=False, stdout_isatty=False ) r = http('--print=B', 'POST', httpbin + '/post', env=env) assert r == BIN_FILE_CONTENT def test_binary_file_path(self, httpbin): env = MockEnvironment(stdin_isatty=True, stdout_isatty=False) r = http('--print=B', 'POST', httpbin + '/post', '@' + BIN_FILE_PATH_ARG, env=env) assert r == BIN_FILE_CONTENT def test_binary_file_form(self, httpbin): env = MockEnvironment(stdin_isatty=True, stdout_isatty=False) r = http('--print=B', '--form', 'POST', httpbin + '/post', 'test@' + BIN_FILE_PATH_ARG, env=env) assert bytes(BIN_FILE_CONTENT) in bytes(r) class TestBinaryResponseData: def test_binary_suppresses_when_terminal(self, httpbin): r = http('GET', httpbin + '/bytes/1024?seed=1') assert BINARY_SUPPRESSED_NOTICE.decode() in r def test_binary_suppresses_when_not_terminal_but_pretty(self, httpbin): env = MockEnvironment(stdin_isatty=True, stdout_isatty=False) r = http('--pretty=all', 'GET', httpbin + '/bytes/1024?seed=1', env=env) assert BINARY_SUPPRESSED_NOTICE.decode() in r def test_binary_included_and_correct_when_suitable(self, httpbin): env = MockEnvironment(stdin_isatty=True, stdout_isatty=False) url = httpbin + '/bytes/1024?seed=1' r = http('GET', url, env=env) expected = requests.get(url).content assert r == expected cli-3.2.4/tests/test_cli.py000066400000000000000000000336451471121002400156140ustar00rootroot00000000000000"""CLI argument parsing related tests.""" import argparse import pytest from requests.exceptions import InvalidSchema import httpie.cli.argparser from httpie.cli import constants from httpie.cli.definition import parser from httpie.cli.argtypes import KeyValueArg, KeyValueArgType from httpie.cli.requestitems import RequestItems from httpie.status import ExitStatus from httpie.utils import load_json_preserve_order_and_dupe_keys from .fixtures import ( FILE_CONTENT, FILE_PATH, FILE_PATH_ARG, JSON_FILE_CONTENT, JSON_FILE_PATH_ARG, ) from .utils import HTTP_OK, MockEnvironment, StdinBytesIO, http class TestItemParsing: key_value_arg = KeyValueArgType(*constants.SEPARATOR_GROUP_ALL_ITEMS) def test_invalid_items(self): items = ['no-separator'] for item in items: pytest.raises(argparse.ArgumentTypeError, self.key_value_arg, item) def test_escape_separator(self): items = RequestItems.from_args([ # headers self.key_value_arg(r'foo\:bar:baz'), self.key_value_arg(r'jack\@jill:hill'), # data self.key_value_arg(r'baz\=bar=foo'), # files self.key_value_arg(fr'bar\@baz@{FILE_PATH_ARG}'), ]) # `HTTPHeadersDict` => `dict` headers = dict(items.headers) assert headers == { 'foo:bar': 'baz', 'jack@jill': 'hill', } assert items.data == { 'baz=bar': 'foo' } assert 'bar@baz' in items.files @pytest.mark.parametrize('string, key, sep, value', [ ('path=c:\\windows', 'path', '=', 'c:\\windows'), ('path=c:\\windows\\', 'path', '=', 'c:\\windows\\'), ('path\\==c:\\windows', 'path=', '=', 'c:\\windows'), ]) def test_backslash_before_non_special_character_does_not_escape( self, string, key, sep, value ): expected = KeyValueArg(orig=string, key=key, sep=sep, value=value) actual = self.key_value_arg(string) assert actual == expected def test_escape_longsep(self): items = RequestItems.from_args([ self.key_value_arg(r'bob\:==foo'), ]) assert items.params == { 'bob:': 'foo' } def test_valid_items(self): items = RequestItems.from_args([ self.key_value_arg('string=value'), self.key_value_arg('Header:value'), self.key_value_arg('Unset-Header:'), self.key_value_arg('Empty-Header;'), self.key_value_arg('list:=["a", 1, {}, false]'), self.key_value_arg('obj:={"a": "b"}'), self.key_value_arg(r'nested\[2\][a][]=1'), self.key_value_arg('nested[2][a][]:=1'), self.key_value_arg('ed='), self.key_value_arg('bool:=true'), self.key_value_arg('file@' + FILE_PATH_ARG), self.key_value_arg('query==value'), self.key_value_arg('Embedded-Header:@' + FILE_PATH_ARG), self.key_value_arg('string-embed=@' + FILE_PATH_ARG), self.key_value_arg('param-embed==@' + FILE_PATH_ARG), self.key_value_arg('raw-json-embed:=@' + JSON_FILE_PATH_ARG), ]) # Parsed headers # `HTTPHeadersDict` => `dict` headers = dict(items.headers) assert headers == { 'Header': 'value', 'Unset-Header': None, 'Empty-Header': '', 'Embedded-Header': FILE_CONTENT.rstrip('\n') } # Parsed data raw_json_embed = items.data.pop('raw-json-embed') assert raw_json_embed == load_json_preserve_order_and_dupe_keys(JSON_FILE_CONTENT) items.data['string-embed'] = items.data['string-embed'].strip() assert dict(items.data) == { 'ed': '', 'string': 'value', 'bool': True, 'list': ['a', 1, load_json_preserve_order_and_dupe_keys('{}'), False], 'nested[2]': {'a': ['1']}, 'nested': [None, None, {'a': [1]}], 'obj': load_json_preserve_order_and_dupe_keys('{"a": "b"}'), 'string-embed': FILE_CONTENT } # Parsed query string parameters assert items.params == { 'query': 'value', 'param-embed': FILE_CONTENT.rstrip('\n') } # Parsed file fields assert 'file' in items.files assert (items.files['file'][1].read().strip(). decode() == FILE_CONTENT) def test_multiple_file_fields_with_same_field_name(self): items = RequestItems.from_args([ self.key_value_arg('file_field@' + FILE_PATH_ARG), self.key_value_arg('file_field@' + FILE_PATH_ARG), ]) assert len(items.files['file_field']) == 2 def test_multiple_text_fields_with_same_field_name(self): items = RequestItems.from_args( request_item_args=[ self.key_value_arg('text_field=a'), self.key_value_arg('text_field=b') ], request_type=constants.RequestType.FORM, ) assert items.data['text_field'] == ['a', 'b'] assert list(items.data.items()) == [ ('text_field', 'a'), ('text_field', 'b'), ] class TestQuerystring: def test_query_string_params_in_url(self, httpbin): r = http('--print=Hhb', 'GET', httpbin + '/get?a=1&b=2') path = '/get?a=1&b=2' url = httpbin + path assert HTTP_OK in r assert f'GET {path} HTTP/1.1' in r assert f'"url": "{url}"' in r def test_query_string_params_items(self, httpbin): r = http('--print=Hhb', 'GET', httpbin + '/get', 'a==1') path = '/get?a=1' url = httpbin + path assert HTTP_OK in r assert f'GET {path} HTTP/1.1' in r assert f'"url": "{url}"' in r def test_query_string_params_in_url_and_items_with_duplicates(self, httpbin): r = http('--print=Hhb', 'GET', httpbin + '/get?a=1&a=1', 'a==1', 'a==1') path = '/get?a=1&a=1&a=1&a=1' url = httpbin + path assert HTTP_OK in r assert f'GET {path} HTTP/1.1' in r assert f'"url": "{url}"' in r @pytest.mark.parametrize(['program_name', 'url_arg', 'parsed_url'], [ ('http', '://pie.dev/get', 'http://pie.dev/get'), ('https', '://pie.dev/get', 'https://pie.dev/get'), ]) def test_url_leading_colon_slash_slash(program_name, url_arg, parsed_url): env = MockEnvironment(program_name=program_name) args = parser.parse_args(args=[url_arg], env=env) assert args.url == parsed_url def test_url_colon_slash_slash_only(): r = http('://', tolerate_error_exit_status=True) assert r.stderr.strip() == "http: error: InvalidURL: Invalid URL 'http://': No host supplied" class TestLocalhostShorthand: def test_expand_localhost_shorthand(self): args = parser.parse_args(args=[':'], env=MockEnvironment()) assert args.url == 'http://localhost' def test_expand_localhost_shorthand_with_slash(self): args = parser.parse_args(args=[':/'], env=MockEnvironment()) assert args.url == 'http://localhost/' def test_expand_localhost_shorthand_with_port(self): args = parser.parse_args(args=[':3000'], env=MockEnvironment()) assert args.url == 'http://localhost:3000' def test_expand_localhost_shorthand_with_path(self): args = parser.parse_args(args=[':/path'], env=MockEnvironment()) assert args.url == 'http://localhost/path' def test_expand_localhost_shorthand_with_port_and_slash(self): args = parser.parse_args(args=[':3000/'], env=MockEnvironment()) assert args.url == 'http://localhost:3000/' def test_expand_localhost_shorthand_with_port_and_path(self): args = parser.parse_args(args=[':3000/path'], env=MockEnvironment()) assert args.url == 'http://localhost:3000/path' def test_dont_expand_shorthand_ipv6_as_shorthand(self): args = parser.parse_args(args=['::1'], env=MockEnvironment()) assert args.url == 'http://::1' def test_dont_expand_longer_ipv6_as_shorthand(self): args = parser.parse_args( args=['::ffff:c000:0280'], env=MockEnvironment() ) assert args.url == 'http://::ffff:c000:0280' def test_dont_expand_full_ipv6_as_shorthand(self): args = parser.parse_args( args=['0000:0000:0000:0000:0000:0000:0000:0001'], env=MockEnvironment() ) assert args.url == 'http://0000:0000:0000:0000:0000:0000:0000:0001' class TestArgumentParser: def setup_method(self, method): self.parser = httpie.cli.argparser.HTTPieArgumentParser() def test_guess_when_method_set_and_valid(self): self.parser.args = argparse.Namespace() self.parser.args.method = 'GET' self.parser.args.url = 'http://example.com/' self.parser.args.request_items = [] self.parser.args.ignore_stdin = False self.parser.env = MockEnvironment() self.parser._guess_method() assert self.parser.args.method == 'GET' assert self.parser.args.url == 'http://example.com/' assert self.parser.args.request_items == [] def test_guess_when_method_not_set(self): self.parser.args = argparse.Namespace() self.parser.args.method = None self.parser.args.url = 'http://example.com/' self.parser.args.request_items = [] self.parser.args.ignore_stdin = False self.parser.env = MockEnvironment() self.parser._guess_method() assert self.parser.args.method == 'GET' assert self.parser.args.url == 'http://example.com/' assert self.parser.args.request_items == [] def test_guess_when_method_set_but_invalid_and_data_field(self): self.parser.args = argparse.Namespace() self.parser.args.method = 'http://example.com/' self.parser.args.url = 'data=field' self.parser.args.request_items = [] self.parser.args.ignore_stdin = False self.parser.env = MockEnvironment() self.parser._guess_method() assert self.parser.args.method == 'POST' assert self.parser.args.url == 'http://example.com/' assert self.parser.args.request_items == [ KeyValueArg(key='data', value='field', sep='=', orig='data=field') ] def test_guess_when_method_set_but_invalid_and_header_field(self): self.parser.args = argparse.Namespace() self.parser.args.method = 'http://example.com/' self.parser.args.url = 'test:header' self.parser.args.request_items = [] self.parser.args.ignore_stdin = False self.parser.env = MockEnvironment() self.parser._guess_method() assert self.parser.args.method == 'GET' assert self.parser.args.url == 'http://example.com/' assert self.parser.args.request_items, [ KeyValueArg(key='test', value='header', sep=':', orig='test:header') ] def test_guess_when_method_set_but_invalid_and_item_exists(self): self.parser.args = argparse.Namespace() self.parser.args.method = 'http://example.com/' self.parser.args.url = 'new_item=a' self.parser.args.request_items = [ KeyValueArg( key='old_item', value='b', sep='=', orig='old_item=b') ] self.parser.args.ignore_stdin = False self.parser.env = MockEnvironment() self.parser._guess_method() assert self.parser.args.request_items, [ KeyValueArg(key='new_item', value='a', sep='=', orig='new_item=a'), KeyValueArg( key='old_item', value='b', sep='=', orig='old_item=b'), ] class TestNoOptions: def test_valid_no_options(self, httpbin): r = http('--verbose', '--no-verbose', 'GET', httpbin + '/get') assert 'GET /get HTTP/1.1' not in r def test_invalid_no_options(self, httpbin): r = http('--no-war', 'GET', httpbin + '/get', tolerate_error_exit_status=True) assert r.exit_status == ExitStatus.ERROR assert 'unrecognized arguments: --no-war' in r.stderr assert 'GET /get HTTP/1.1' not in r class TestStdin: def test_ignore_stdin(self, httpbin): env = MockEnvironment( stdin=StdinBytesIO(FILE_PATH.read_bytes()), stdin_isatty=False, ) r = http('--ignore-stdin', '--verbose', httpbin + '/get', env=env) assert HTTP_OK in r assert 'GET /get HTTP' in r, "Don't default to POST." assert FILE_CONTENT not in r, "Don't send stdin data." def test_ignore_stdin_cannot_prompt_password(self, httpbin): r = http('--ignore-stdin', '--auth=no-password', httpbin + '/get', tolerate_error_exit_status=True) assert r.exit_status == ExitStatus.ERROR assert 'because --ignore-stdin' in r.stderr def test_stdin_closed(self, httpbin): r = http(httpbin + '/get', env=MockEnvironment(stdin=None)) assert HTTP_OK in r class TestSchemes: def test_invalid_custom_scheme(self): # InvalidSchema is expected because HTTPie # shouldn't touch a formally valid scheme. with pytest.raises(InvalidSchema): http('foo+bar-BAZ.123://bah') def test_invalid_scheme_via_via_default_scheme(self): # InvalidSchema is expected because HTTPie # shouldn't touch a formally valid scheme. with pytest.raises(InvalidSchema): http('bah', '--default=scheme=foo+bar-BAZ.123') def test_default_scheme_option(self, httpbin_secure): url = f'{httpbin_secure.host}:{httpbin_secure.port}' assert HTTP_OK in http(url, '--default-scheme=https') def test_scheme_when_invoked_as_https(self, httpbin_secure): url = f'{httpbin_secure.host}:{httpbin_secure.port}' assert HTTP_OK in http(url, program_name='https') cli-3.2.4/tests/test_cli_ui.py000066400000000000000000000037511471121002400163040ustar00rootroot00000000000000import pytest import shutil import os from tests.utils import http NAKED_BASE_TEMPLATE = """\ usage: http {extra_args}[METHOD] URL [REQUEST_ITEM ...] error: {error_msg} for more information: run 'http --help' or visit https://httpie.io/docs/cli """ NAKED_HELP_MESSAGE = NAKED_BASE_TEMPLATE.format( extra_args="", error_msg="the following arguments are required: URL" ) NAKED_HELP_MESSAGE_PRETTY_WITH_NO_ARG = NAKED_BASE_TEMPLATE.format( extra_args="--pretty {all, colors, format, none} ", error_msg="argument --pretty: expected one argument" ) NAKED_HELP_MESSAGE_PRETTY_WITH_INVALID_ARG = NAKED_BASE_TEMPLATE.format( extra_args="--pretty {all, colors, format, none} ", error_msg="argument --pretty: invalid choice: '$invalid' (choose from 'all', 'colors', 'format', 'none')" ) PREDEFINED_TERMINAL_SIZE = (200, 100) @pytest.fixture(scope="function") def ignore_terminal_size(monkeypatch): """Some tests wrap/crop the output depending on the size of the executed terminal, which might not be consistent through all runs. This fixture ensures every run uses the same exact configuration. """ def fake_terminal_size(*args, **kwargs): return os.terminal_size(PREDEFINED_TERMINAL_SIZE) # Setting COLUMNS as an env var is required for 3.8< monkeypatch.setitem(os.environ, 'COLUMNS', str(PREDEFINED_TERMINAL_SIZE[0])) monkeypatch.setattr(shutil, 'get_terminal_size', fake_terminal_size) monkeypatch.setattr(os, 'get_terminal_size', fake_terminal_size) @pytest.mark.parametrize( 'args, expected_msg', [ ([], NAKED_HELP_MESSAGE), (['--pretty'], NAKED_HELP_MESSAGE_PRETTY_WITH_NO_ARG), (['pie.dev', '--pretty'], NAKED_HELP_MESSAGE_PRETTY_WITH_NO_ARG), (['--pretty', '$invalid'], NAKED_HELP_MESSAGE_PRETTY_WITH_INVALID_ARG), ] ) def test_naked_invocation(ignore_terminal_size, args, expected_msg): result = http(*args, tolerate_error_exit_status=True) assert result.stderr == expected_msg cli-3.2.4/tests/test_cli_utils.py000066400000000000000000000044221471121002400170230ustar00rootroot00000000000000import pytest from argparse import ArgumentParser from unittest.mock import Mock from httpie.cli.utils import LazyChoices def test_lazy_choices(): mock = Mock() getter = mock.getter getter.return_value = ['a', 'b', 'c'] parser = ArgumentParser() parser.register('action', 'lazy_choices', LazyChoices) parser.add_argument( '--option', help="the regular option", default='a', metavar='SYMBOL', choices=['a', 'b'], ) parser.add_argument( '--lazy-option', help="the lazy option", default='a', metavar='SYMBOL', action='lazy_choices', getter=getter, cache=False # for test purposes ) # Parser initialization doesn't call it. getter.assert_not_called() # If we don't use --lazy-option, we don't retrieve it. parser.parse_args([]) getter.assert_not_called() parser.parse_args(['--option', 'b']) getter.assert_not_called() # If we pass a value, it will retrieve to verify. parser.parse_args(['--lazy-option', 'c']) getter.assert_called() getter.reset_mock() with pytest.raises(SystemExit): parser.parse_args(['--lazy-option', 'z']) getter.assert_called() getter.reset_mock() def test_lazy_choices_help(): mock = Mock() getter = mock.getter getter.return_value = ['a', 'b', 'c'] help_formatter = mock.help_formatter help_formatter.return_value = '' parser = ArgumentParser() parser.register('action', 'lazy_choices', LazyChoices) parser.add_argument( '--lazy-option', default='a', metavar='SYMBOL', action='lazy_choices', getter=getter, help_formatter=help_formatter, cache=False # for test purposes ) # Parser initialization doesn't call it. getter.assert_not_called() # If we don't use `--help`, we don't use it. parser.parse_args([]) getter.assert_not_called() help_formatter.assert_not_called() parser.parse_args(['--lazy-option', 'b']) help_formatter.assert_not_called() # If we use --help, then we call it with styles with pytest.raises(SystemExit): parser.parse_args(['--help']) help_formatter.assert_called_once_with(['a', 'b', 'c'], isolation_mode=False) cli-3.2.4/tests/test_compress.py000066400000000000000000000074421471121002400166740ustar00rootroot00000000000000""" We test against httpbin which doesn't return the request data in a consistent way: 1. Non-form requests: the `data` field contains base64 encoded version of our zlib-encoded request data. 2. Form requests: `form` contains a messed up version of the data. """ import base64 import zlib from .fixtures import FILE_PATH, FILE_CONTENT from httpie.status import ExitStatus from .utils import StdinBytesIO, http, HTTP_OK, MockEnvironment def assert_decompressed_equal(base64_compressed_data, expected_str): compressed_data = base64.b64decode( base64_compressed_data.split(',', 1)[1]) data = zlib.decompress(compressed_data) actual_str = data.decode() # FIXME: contains a trailing linebreak with an uploaded file actual_str = actual_str.rstrip() assert actual_str == expected_str def test_cannot_combine_compress_with_chunked(httpbin): r = http('--compress', '--chunked', httpbin + '/get', tolerate_error_exit_status=True) assert r.exit_status == ExitStatus.ERROR assert 'cannot combine --compress and --chunked' in r.stderr def test_cannot_combine_compress_with_multipart(httpbin): r = http('--compress', '--multipart', httpbin + '/get', tolerate_error_exit_status=True) assert r.exit_status == ExitStatus.ERROR assert 'cannot combine --compress and --multipart' in r.stderr def test_compress_skip_negative_ratio(httpbin_both): r = http( '--compress', httpbin_both + '/post', 'foo=bar', ) assert HTTP_OK in r assert 'Content-Encoding' not in r.json['headers'] assert r.json['json'] == {'foo': 'bar'} def test_compress_force_with_negative_ratio(httpbin_both): r = http( '--compress', '--compress', httpbin_both + '/post', 'foo=bar', ) assert HTTP_OK in r assert r.json['headers']['Content-Encoding'] == 'deflate' assert_decompressed_equal(r.json['data'], '{"foo": "bar"}') def test_compress_json(httpbin_both): r = http( '--compress', '--compress', httpbin_both + '/post', 'foo=bar', ) assert HTTP_OK in r assert r.json['headers']['Content-Encoding'] == 'deflate' assert_decompressed_equal(r.json['data'], '{"foo": "bar"}') assert r.json['json'] is None def test_compress_form(httpbin_both): r = http( '--form', '--compress', '--compress', httpbin_both + '/post', 'foo=bar', ) assert HTTP_OK in r assert r.json['headers']['Content-Encoding'] == 'deflate' assert r.json['data'] == "" assert '"foo": "bar"' not in r def test_compress_raw(httpbin_both): r = http( '--raw', FILE_CONTENT, '--compress', '--compress', httpbin_both + '/post', ) assert HTTP_OK in r assert r.json['headers']['Content-Encoding'] == 'deflate' assert_decompressed_equal(r.json['data'], FILE_CONTENT.strip()) def test_compress_stdin(httpbin_both): env = MockEnvironment( stdin=StdinBytesIO(FILE_PATH.read_bytes()), stdin_isatty=False, ) r = http( '--compress', '--compress', 'PATCH', httpbin_both + '/patch', env=env, ) assert HTTP_OK in r assert r.json['headers']['Content-Encoding'] == 'deflate' assert_decompressed_equal(r.json['data'], FILE_CONTENT.strip()) assert not r.json['json'] def test_compress_file(httpbin_both): r = http( '--form', '--compress', '--compress', 'PUT', httpbin_both + '/put', f'file@{FILE_PATH}', ) assert HTTP_OK in r assert r.json['headers']['Content-Encoding'] == 'deflate' assert r.json['headers']['Content-Type'].startswith( 'multipart/form-data; boundary=') assert r.json['files'] == {} assert FILE_CONTENT not in r cli-3.2.4/tests/test_config.py000066400000000000000000000072651471121002400163110ustar00rootroot00000000000000from pathlib import Path import pytest from _pytest.monkeypatch import MonkeyPatch from httpie.compat import is_windows from httpie.encoding import UTF8 from httpie.config import ( Config, DEFAULT_CONFIG_DIRNAME, DEFAULT_RELATIVE_LEGACY_CONFIG_DIR, DEFAULT_RELATIVE_XDG_CONFIG_HOME, DEFAULT_WINDOWS_CONFIG_DIR, ENV_HTTPIE_CONFIG_DIR, ENV_XDG_CONFIG_HOME, get_default_config_dir, ) from .utils import HTTP_OK, MockEnvironment, http def test_default_options(httpbin): env = MockEnvironment() env.config['default_options'] = ['--form'] env.config.save() r = http(httpbin + '/post', 'foo=bar', env=env) assert r.json['form'] == { "foo": "bar" } def test_config_file_not_valid(httpbin): env = MockEnvironment() env.create_temp_config_dir() (env.config_dir / Config.FILENAME).write_text('{invalid json}', encoding=UTF8) r = http(httpbin + '/get', env=env) assert HTTP_OK in r assert 'http: warning' in r.stderr assert 'invalid config file' in r.stderr @pytest.mark.skipif(is_windows, reason='cannot chmod 000 on Windows') def test_config_file_inaccessible(httpbin): env = MockEnvironment() env.create_temp_config_dir() config_path = env.config_dir / Config.FILENAME assert not config_path.exists() config_path.touch(0o000) assert config_path.exists() r = http(httpbin + '/get', env=env) assert HTTP_OK in r assert 'http: warning' in r.stderr assert 'cannot read config file' in r.stderr def test_default_options_overwrite(httpbin): env = MockEnvironment() env.config['default_options'] = ['--form'] env.config.save() r = http('--json', httpbin + '/post', 'foo=bar', env=env) assert r.json['json'] == { "foo": "bar" } @pytest.mark.skipif(is_windows, reason='XDG_CONFIG_HOME needs *nix') def test_explicit_xdg_config_home(monkeypatch: MonkeyPatch, tmp_path: Path): home_dir = tmp_path monkeypatch.delenv(ENV_HTTPIE_CONFIG_DIR, raising=False) monkeypatch.setenv('HOME', str(home_dir)) custom_xdg_config_home = home_dir / 'custom_xdg_config_home' monkeypatch.setenv(ENV_XDG_CONFIG_HOME, str(custom_xdg_config_home)) expected_config_dir = custom_xdg_config_home / DEFAULT_CONFIG_DIRNAME assert get_default_config_dir() == expected_config_dir @pytest.mark.skipif(is_windows, reason='XDG_CONFIG_HOME needs *nix') def test_default_xdg_config_home(monkeypatch: MonkeyPatch, tmp_path: Path): home_dir = tmp_path monkeypatch.delenv(ENV_HTTPIE_CONFIG_DIR, raising=False) monkeypatch.delenv(ENV_XDG_CONFIG_HOME, raising=False) monkeypatch.setenv('HOME', str(home_dir)) expected_config_dir = ( home_dir / DEFAULT_RELATIVE_XDG_CONFIG_HOME / DEFAULT_CONFIG_DIRNAME ) assert get_default_config_dir() == expected_config_dir @pytest.mark.skipif(is_windows, reason='legacy config dir needs *nix') def test_legacy_config_dir(monkeypatch: MonkeyPatch, tmp_path: Path): home_dir = tmp_path monkeypatch.delenv(ENV_HTTPIE_CONFIG_DIR, raising=False) monkeypatch.setenv('HOME', str(home_dir)) legacy_config_dir = home_dir / DEFAULT_RELATIVE_LEGACY_CONFIG_DIR legacy_config_dir.mkdir() assert get_default_config_dir() == legacy_config_dir def test_custom_config_dir(monkeypatch: MonkeyPatch, tmp_path: Path): httpie_config_dir = tmp_path / 'custom/directory' monkeypatch.setenv(ENV_HTTPIE_CONFIG_DIR, str(httpie_config_dir)) assert get_default_config_dir() == httpie_config_dir @pytest.mark.skipif(not is_windows, reason='windows-only') def test_windows_config_dir(monkeypatch: MonkeyPatch): monkeypatch.delenv(ENV_HTTPIE_CONFIG_DIR, raising=False) assert get_default_config_dir() == DEFAULT_WINDOWS_CONFIG_DIR cli-3.2.4/tests/test_cookie.py000066400000000000000000000035241471121002400163070ustar00rootroot00000000000000from http.cookies import SimpleCookie from http.server import BaseHTTPRequestHandler, HTTPServer from threading import Thread from .utils import http class TestIntegration: def setup_mock_server(self, handler): """Configure mock server.""" # Passing 0 as the port will cause a random free port to be chosen. self.mock_server = HTTPServer(('localhost', 0), handler) _, self.mock_server_port = self.mock_server.server_address # Start running mock server in a separate thread. # Daemon threads automatically shut down when the main process exits. self.mock_server_thread = Thread(target=self.mock_server.serve_forever) self.mock_server_thread.setDaemon(True) self.mock_server_thread.start() def test_cookie_parser(self): """Not directly testing HTTPie but `requests` to ensure their cookies handling is still as expected by `get_expired_cookies()`. """ class MockServerRequestHandler(BaseHTTPRequestHandler): """"HTTP request handler.""" def do_GET(self): """Handle GET requests.""" # Craft multiple cookies cookie = SimpleCookie() cookie['hello'] = 'world' cookie['hello']['path'] = self.path cookie['oatmeal_raisin'] = 'is the best' cookie['oatmeal_raisin']['path'] = self.path # Send HTTP headers self.send_response(200) self.send_header('Set-Cookie', cookie.output()) self.end_headers() self.setup_mock_server(MockServerRequestHandler) response = http(f'http://localhost:{self.mock_server_port}/') assert 'Set-Cookie: hello=world; Path=/' in response assert 'Set-Cookie: oatmeal_raisin="is the best"; Path=/' in response cli-3.2.4/tests/test_cookie_on_redirects.py000066400000000000000000000161001471121002400210410ustar00rootroot00000000000000import pytest from .utils import http @pytest.mark.parametrize('target_httpbin', [ 'httpbin', 'remote_httpbin', ]) def test_explicit_user_set_cookie(httpbin, target_httpbin, request): """User set cookies ARE NOT persisted within redirects when there is no session, even on the same domain.""" target_httpbin = request.getfixturevalue(target_httpbin) r = http( '--follow', httpbin + '/redirect-to', f'url=={target_httpbin}/cookies', 'Cookie:a=b' ) assert r.json == {'cookies': {}} @pytest.mark.parametrize('target_httpbin', [ 'httpbin', 'remote_httpbin', ]) def test_explicit_user_set_cookie_in_session(tmp_path, httpbin, target_httpbin, request): """User set cookies ARE persisted within redirects when there is A session, even on the same domain.""" target_httpbin = request.getfixturevalue(target_httpbin) r = http( '--follow', '--session', str(tmp_path / 'session.json'), httpbin + '/redirect-to', f'url=={target_httpbin}/cookies', 'Cookie:a=b' ) assert r.json == {'cookies': {'a': 'b'}} @pytest.mark.parametrize('target_httpbin', [ 'httpbin', 'remote_httpbin', ]) def test_saved_user_set_cookie_in_session(tmp_path, httpbin, target_httpbin, request): """User set cookies ARE persisted within redirects when there is A session, even on the same domain.""" target_httpbin = request.getfixturevalue(target_httpbin) http( '--follow', '--session', str(tmp_path / 'session.json'), httpbin + '/get', 'Cookie:a=b' ) r = http( '--follow', '--session', str(tmp_path / 'session.json'), httpbin + '/redirect-to', f'url=={target_httpbin}/cookies', ) assert r.json == {'cookies': {'a': 'b'}} @pytest.mark.parametrize('target_httpbin', [ 'httpbin', 'remote_httpbin', ]) @pytest.mark.parametrize('session', [True, False]) def test_explicit_user_set_headers(httpbin, tmp_path, target_httpbin, session, request): """ User set headers ARE persisted within redirects even on different domains domain with or without an active session. """ target_httpbin = request.getfixturevalue(target_httpbin) session_args = [] if session: session_args.extend([ '--session', str(tmp_path / 'session.json') ]) r = http( '--follow', *session_args, httpbin + '/redirect-to', f'url=={target_httpbin}/get', 'X-Custom-Header:value' ) assert 'X-Custom-Header' in r.json['headers'] @pytest.mark.parametrize('session', [True, False]) def test_server_set_cookie_on_redirect_same_domain(tmp_path, httpbin, session): """Server set cookies ARE persisted on the same domain when they are forwarded.""" session_args = [] if session: session_args.extend([ '--session', str(tmp_path / 'session.json') ]) r = http( '--follow', *session_args, httpbin + '/cookies/set/a/b', ) assert r.json['cookies'] == {'a': 'b'} @pytest.mark.parametrize('session', [True, False]) def test_server_set_cookie_on_redirect_different_domain(tmp_path, http_server, httpbin, session): # Server set cookies ARE persisted on different domains # when they are forwarded. session_args = [] if session: session_args.extend([ '--session', str(tmp_path / 'session.json') ]) r = http( '--follow', *session_args, http_server + '/cookies/set-and-redirect', f"X-Redirect-To:{httpbin + '/cookies'}", 'X-Cookies:a=b' ) assert r.json['cookies'] == {'a': 'b'} def test_saved_session_cookies_on_same_domain(tmp_path, httpbin): """Saved session cookies ARE persisted when making a new request to the same domain.""" http( '--session', str(tmp_path / 'session.json'), httpbin + '/cookies/set/a/b' ) r = http( '--session', str(tmp_path / 'session.json'), httpbin + '/cookies' ) assert r.json == {'cookies': {'a': 'b'}} def test_saved_session_cookies_on_different_domain(tmp_path, httpbin, remote_httpbin): """Saved session cookies ARE persisted when making a new request to a different domain.""" http( '--session', str(tmp_path / 'session.json'), httpbin + '/cookies/set/a/b' ) r = http( '--session', str(tmp_path / 'session.json'), remote_httpbin + '/cookies' ) assert r.json == {'cookies': {}} @pytest.mark.parametrize(['initial_domain', 'first_request_domain', 'second_request_domain', 'expect_cookies'], [ ( # Cookies are set by Domain A # Initial domain is Domain A # Redirected domain is Domain A 'httpbin', 'httpbin', 'httpbin', True, ), ( # Cookies are set by Domain A # Initial domain is Domain B # Redirected domain is Domain B 'httpbin', 'remote_httpbin', 'remote_httpbin', False, ), ( # Cookies are set by Domain A # Initial domain is Domain A # Redirected domain is Domain B 'httpbin', 'httpbin', 'remote_httpbin', False, ), ( # Cookies are set by Domain A # Initial domain is Domain B # Redirected domain is Domain A 'httpbin', 'remote_httpbin', 'httpbin', True, ), ]) def test_saved_session_cookies_on_redirect( tmp_path, initial_domain, first_request_domain, second_request_domain, expect_cookies, request): initial_domain = request.getfixturevalue(initial_domain) first_request_domain = request.getfixturevalue(first_request_domain) second_request_domain = request.getfixturevalue(second_request_domain) http( '--session', str(tmp_path / 'session.json'), initial_domain + '/cookies/set/a/b' ) r = http( '--session', str(tmp_path / 'session.json'), '--follow', first_request_domain + '/redirect-to', f'url=={second_request_domain}/cookies' ) if expect_cookies: expected_data = {'cookies': {'a': 'b'}} else: expected_data = {'cookies': {}} assert r.json == expected_data def test_saved_session_cookie_pool(tmp_path, httpbin, remote_httpbin): http( '--session', str(tmp_path / 'session.json'), httpbin + '/cookies/set/a/b' ) http( '--session', str(tmp_path / 'session.json'), remote_httpbin + '/cookies/set/a/c' ) http( '--session', str(tmp_path / 'session.json'), remote_httpbin + '/cookies/set/b/d' ) response = http( '--session', str(tmp_path / 'session.json'), httpbin + '/cookies' ) assert response.json['cookies'] == {'a': 'b'} response = http( '--session', str(tmp_path / 'session.json'), remote_httpbin + '/cookies' ) assert response.json['cookies'] == {'a': 'c', 'b': 'd'} cli-3.2.4/tests/test_defaults.py000066400000000000000000000113371471121002400166460ustar00rootroot00000000000000""" Tests for the provided defaults regarding HTTP method, and --json vs. --form. """ from io import BytesIO from httpie.client import JSON_ACCEPT from .utils import MockEnvironment, http, HTTP_OK from .fixtures import FILE_PATH def test_default_headers_case_insensitive(httpbin): """ """ r = http( '--debug', '--print=H', httpbin + '/post', 'CONTENT-TYPE:application/json-patch+json', 'a=b', ) assert 'CONTENT-TYPE: application/json-patch+json' in r assert 'Content-Type' not in r # noinspection PyPep8Naming class TestImplicitHTTPMethod: def test_implicit_GET(self, httpbin): r = http(httpbin + '/get') assert HTTP_OK in r def test_implicit_GET_with_headers(self, httpbin): r = http(httpbin + '/headers', 'Foo:bar') assert HTTP_OK in r assert r.json['headers']['Foo'] == 'bar' def test_implicit_POST_json(self, httpbin): r = http(httpbin + '/post', 'hello=world') assert HTTP_OK in r assert r.json['json'] == {'hello': 'world'} def test_implicit_POST_form(self, httpbin): r = http('--form', httpbin + '/post', 'foo=bar') assert HTTP_OK in r assert r.json['form'] == {'foo': 'bar'} def test_implicit_POST_raw(self, httpbin): r = http('--raw', 'foo bar', httpbin + '/post') assert HTTP_OK in r assert r.json['data'] == 'foo bar' def test_implicit_POST_stdin(self, httpbin): env = MockEnvironment( stdin_isatty=False, stdin=BytesIO(FILE_PATH.read_bytes()) ) r = http('--form', httpbin + '/post', env=env) assert HTTP_OK in r class TestAutoContentTypeAndAcceptHeaders: """ Test that `Accept` and `Content-Type` correctly default to JSON, but can still be overridden. The same with Content-Type when `--form` `-f` is used. """ def test_GET_no_data_no_auto_headers(self, httpbin): # https://github.com/httpie/cli/issues/62 r = http('GET', httpbin + '/headers') assert HTTP_OK in r assert r.json['headers']['Accept'] == '*/*' assert 'Content-Type' not in r.json['headers'] def test_POST_no_data_no_auto_headers(self, httpbin): # JSON headers shouldn't be automatically set for POST with no data. r = http('POST', httpbin + '/post') assert HTTP_OK in r assert '"Accept": "*/*"' in r assert '"Content-Type": "application/json' not in r def test_POST_with_data_auto_JSON_headers(self, httpbin): r = http('POST', httpbin + '/post', 'a=b') assert HTTP_OK in r assert r.json['headers']['Accept'] == JSON_ACCEPT assert r.json['headers']['Content-Type'] == 'application/json' def test_GET_with_data_auto_JSON_headers(self, httpbin): # JSON headers should automatically be set also for GET with data. r = http('POST', httpbin + '/post', 'a=b') assert HTTP_OK in r assert r.json['headers']['Accept'] == JSON_ACCEPT assert r.json['headers']['Content-Type'] == 'application/json' def test_POST_explicit_JSON_JSON_ACCEPT(self, httpbin): r = http('--json', 'POST', httpbin + '/post') assert HTTP_OK in r assert r.json['headers']['Accept'] == JSON_ACCEPT # Make sure Content-Type gets set even with no data. # https://github.com/httpie/cli/issues/137 assert 'application/json' in r.json['headers']['Content-Type'] def test_GET_explicit_JSON_explicit_headers(self, httpbin): r = http('--json', 'GET', httpbin + '/headers', 'Accept:application/xml', 'Content-Type:application/xml') assert HTTP_OK in r assert '"Accept": "application/xml"' in r assert '"Content-Type": "application/xml"' in r def test_POST_form_auto_Content_Type(self, httpbin): r = http('--form', 'POST', httpbin + '/post') assert HTTP_OK in r assert '"Content-Type": "application/x-www-form-urlencoded' in r def test_POST_form_Content_Type_override(self, httpbin): r = http('--form', 'POST', httpbin + '/post', 'Content-Type:application/xml') assert HTTP_OK in r assert '"Content-Type": "application/xml"' in r def test_print_only_body_when_stdout_redirected_by_default(self, httpbin): env = MockEnvironment(stdin_isatty=True, stdout_isatty=False) r = http('GET', httpbin + '/get', env=env) assert 'HTTP/' not in r def test_print_overridable_when_stdout_redirected(self, httpbin): env = MockEnvironment(stdin_isatty=True, stdout_isatty=False) r = http('--print=h', 'GET', httpbin + '/get', env=env) assert HTTP_OK in r cli-3.2.4/tests/test_downloads.py000066400000000000000000000230071471121002400170260ustar00rootroot00000000000000import os import tempfile import time import requests from unittest import mock from urllib.request import urlopen import pytest from requests.structures import CaseInsensitiveDict from httpie.downloads import ( parse_content_range, filename_from_content_disposition, filename_from_url, get_unique_filename, ContentRangeError, Downloader, PARTIAL_CONTENT ) from .utils import http, MockEnvironment class Response(requests.Response): # noinspection PyDefaultArgument def __init__(self, url, headers={}, status_code=200): self.url = url self.headers = CaseInsensitiveDict(headers) self.status_code = status_code class TestDownloadUtils: def test_Content_Range_parsing(self): parse = parse_content_range assert parse('bytes 100-199/200', 100) == 200 assert parse('bytes 100-199/*', 100) == 200 # single byte assert parse('bytes 100-100/*', 100) == 101 # missing pytest.raises(ContentRangeError, parse, None, 100) # syntax error pytest.raises(ContentRangeError, parse, 'beers 100-199/*', 100) # unexpected range pytest.raises(ContentRangeError, parse, 'bytes 100-199/*', 99) # invalid instance-length pytest.raises(ContentRangeError, parse, 'bytes 100-199/199', 100) # invalid byte-range-resp-spec pytest.raises(ContentRangeError, parse, 'bytes 100-99/199', 100) @pytest.mark.parametrize('header, expected_filename', [ ('attachment; filename=hello-WORLD_123.txt', 'hello-WORLD_123.txt'), ('attachment; filename=".hello-WORLD_123.txt"', 'hello-WORLD_123.txt'), ('attachment; filename="white space.txt"', 'white space.txt'), (r'attachment; filename="\"quotes\".txt"', '"quotes".txt'), ('attachment; filename=/etc/hosts', 'hosts'), ('attachment; filename=', None) ]) def test_Content_Disposition_parsing(self, header, expected_filename): assert filename_from_content_disposition(header) == expected_filename def test_filename_from_url(self): assert 'foo.txt' == filename_from_url( url='http://example.org/foo', content_type='text/plain' ) assert 'foo.html' == filename_from_url( url='http://example.org/foo', content_type='text/html; charset=UTF-8' ) assert 'foo' == filename_from_url( url='http://example.org/foo', content_type=None ) assert 'foo' == filename_from_url( url='http://example.org/foo', content_type='x-foo/bar' ) @pytest.mark.parametrize( 'orig_name, unique_on_attempt, expected', [ # Simple ('foo.bar', 0, 'foo.bar'), ('foo.bar', 1, 'foo.bar-1'), ('foo.bar', 10, 'foo.bar-10'), # Trim ('A' * 20, 0, 'A' * 10), ('A' * 20, 1, 'A' * 8 + '-1'), ('A' * 20, 10, 'A' * 7 + '-10'), # Trim before ext ('A' * 20 + '.txt', 0, 'A' * 6 + '.txt'), ('A' * 20 + '.txt', 1, 'A' * 4 + '.txt-1'), # Trim at the end ('foo.' + 'A' * 20, 0, 'foo.' + 'A' * 6), ('foo.' + 'A' * 20, 1, 'foo.' + 'A' * 4 + '-1'), ('foo.' + 'A' * 20, 10, 'foo.' + 'A' * 3 + '-10'), ] ) @mock.patch('httpie.downloads.get_filename_max_length') def test_unique_filename(self, get_filename_max_length, orig_name, unique_on_attempt, expected): def attempts(unique_on_attempt=0): # noinspection PyUnresolvedReferences,PyUnusedLocal def exists(filename): if exists.attempt == unique_on_attempt: return False exists.attempt += 1 return True exists.attempt = 0 return exists get_filename_max_length.return_value = 10 actual = get_unique_filename(orig_name, attempts(unique_on_attempt)) assert expected == actual class TestDownloads: def test_actual_download(self, httpbin_both, httpbin): robots_txt = '/robots.txt' body = urlopen(httpbin + robots_txt).read().decode() env = MockEnvironment(stdin_isatty=True, stdout_isatty=False, show_displays=True) r = http('--download', httpbin_both.url + robots_txt, env=env) assert 'Downloading' in r.stderr assert body == r def test_download_with_Content_Length(self, mock_env, httpbin_both): with open(os.devnull, 'w') as devnull: downloader = Downloader(mock_env, output_file=devnull) downloader.start( initial_url='/', final_response=Response( url=httpbin_both.url + '/', headers={'Content-Length': 10} ) ) time.sleep(1.1) downloader.chunk_downloaded(b'12345') time.sleep(1.1) downloader.chunk_downloaded(b'12345') downloader.finish() assert not downloader.interrupted def test_download_no_Content_Length(self, mock_env, httpbin_both): with open(os.devnull, 'w') as devnull: downloader = Downloader(mock_env, output_file=devnull) downloader.start( final_response=Response(url=httpbin_both.url + '/'), initial_url='/' ) time.sleep(1.1) downloader.chunk_downloaded(b'12345') downloader.finish() assert not downloader.interrupted def test_download_output_from_content_disposition(self, mock_env, httpbin_both): with tempfile.TemporaryDirectory() as tmp_dirname: orig_cwd = os.getcwd() os.chdir(tmp_dirname) try: assert not os.path.isfile('filename.bin') downloader = Downloader(mock_env) downloader.start( final_response=Response( url=httpbin_both.url + '/', headers={ 'Content-Length': 5, 'Content-Disposition': 'attachment; filename="filename.bin"', } ), initial_url='/' ) downloader.chunk_downloaded(b'12345') downloader.finish() downloader.failed() # Stop the reporter assert not downloader.interrupted # TODO: Auto-close the file in that case? downloader._output_file.close() assert os.path.isfile('filename.bin') finally: os.chdir(orig_cwd) def test_download_interrupted(self, mock_env, httpbin_both): with open(os.devnull, 'w') as devnull: downloader = Downloader(mock_env, output_file=devnull) downloader.start( final_response=Response( url=httpbin_both.url + '/', headers={'Content-Length': 5} ), initial_url='/' ) downloader.chunk_downloaded(b'1234') downloader.finish() assert downloader.interrupted def test_download_resumed(self, mock_env, httpbin_both): with tempfile.TemporaryDirectory() as tmp_dirname: file = os.path.join(tmp_dirname, 'file.bin') with open(file, 'a'): pass with open(file, 'a+b') as output_file: # Start and interrupt the transfer after 3 bytes written downloader = Downloader(mock_env, output_file=output_file) downloader.start( final_response=Response( url=httpbin_both.url + '/', headers={'Content-Length': 5} ), initial_url='/' ) downloader.chunk_downloaded(b'123') downloader.finish() downloader.failed() assert downloader.interrupted # Write bytes with open(file, 'wb') as fh: fh.write(b'123') with open(file, 'a+b') as output_file: # Resume the transfer downloader = Downloader(mock_env, output_file=output_file, resume=True) # Ensure `pre_request()` is working as expected too headers = {} downloader.pre_request(headers) assert headers['Accept-Encoding'] == 'identity' assert headers['Range'] == 'bytes=3-' downloader.start( final_response=Response( url=httpbin_both.url + '/', headers={'Content-Length': 5, 'Content-Range': 'bytes 3-4/5'}, status_code=PARTIAL_CONTENT ), initial_url='/' ) downloader.chunk_downloaded(b'45') downloader.finish() def test_download_with_redirect_original_url_used_for_filename(self, httpbin): # Redirect from `/redirect/1` to `/get`. expected_filename = '1.json' orig_cwd = os.getcwd() with tempfile.TemporaryDirectory() as tmp_dirname: os.chdir(tmp_dirname) try: assert os.listdir('.') == [] http('--download', httpbin + '/redirect/1') assert os.listdir('.') == [expected_filename] finally: os.chdir(orig_cwd) cli-3.2.4/tests/test_encoding.py000066400000000000000000000150511471121002400166220ustar00rootroot00000000000000""" Various encoding handling related tests. """ import pytest import responses from charset_normalizer.constant import TOO_SMALL_SEQUENCE from httpie.cli.constants import PRETTY_MAP from httpie.encoding import UTF8 from .utils import http, HTTP_OK, DUMMY_URL, MockEnvironment from .fixtures import UNICODE CHARSET_TEXT_PAIRS = [ ('big5', '卷首卷首卷首卷首卷卷首卷首卷首卷首卷首卷首卷首卷首卷首卷首卷首卷首卷首'), ('windows-1250', 'Všichni lidé jsou si rovni. Všichni lidé jsou si rovni.'), (UTF8, 'Všichni lidé jsou si rovni. Všichni lidé jsou si rovni.'), ] def test_charset_text_pairs(): # Verify our test data is legit. for charset, text in CHARSET_TEXT_PAIRS: assert len(text) > TOO_SMALL_SEQUENCE if charset != UTF8: with pytest.raises(UnicodeDecodeError): assert text != text.encode(charset).decode(UTF8) def test_unicode_headers(httpbin): # httpbin doesn't interpret UFT-8 headers r = http(httpbin + '/headers', f'Test:{UNICODE}') assert HTTP_OK in r def test_unicode_headers_verbose(httpbin): # httpbin doesn't interpret UTF-8 headers r = http('--verbose', httpbin + '/headers', f'Test:{UNICODE}') assert HTTP_OK in r assert UNICODE in r def test_unicode_raw(httpbin): r = http('--raw', f'test {UNICODE}', 'POST', httpbin + '/post') assert HTTP_OK in r assert r.json['data'] == f'test {UNICODE}' def test_unicode_raw_verbose(httpbin): r = http('--verbose', '--raw', f'test {UNICODE}', 'POST', httpbin + '/post') assert HTTP_OK in r assert UNICODE in r def test_unicode_form_item(httpbin): r = http('--form', 'POST', httpbin + '/post', f'test={UNICODE}') assert HTTP_OK in r assert r.json['form'] == {'test': UNICODE} def test_unicode_form_item_verbose(httpbin): r = http('--verbose', '--form', 'POST', httpbin + '/post', f'test={UNICODE}') assert HTTP_OK in r assert UNICODE in r def test_unicode_json_item(httpbin): r = http('--json', 'POST', httpbin + '/post', f'test={UNICODE}') assert HTTP_OK in r assert r.json['json'] == {'test': UNICODE} def test_unicode_json_item_verbose(httpbin): r = http('--verbose', '--json', 'POST', httpbin + '/post', f'test={UNICODE}') assert HTTP_OK in r assert UNICODE in r def test_unicode_raw_json_item(httpbin): r = http('--json', 'POST', httpbin + '/post', f'test:={{ "{UNICODE}" : [ "{UNICODE}" ] }}') assert HTTP_OK in r assert r.json['json'] == {'test': {UNICODE: [UNICODE]}} def test_unicode_raw_json_item_verbose(httpbin): r = http('--json', 'POST', httpbin + '/post', f'test:={{ "{UNICODE}" : [ "{UNICODE}" ] }}') assert HTTP_OK in r assert r.json['json'] == {'test': {UNICODE: [UNICODE]}} def test_unicode_url_query_arg_item(httpbin): r = http(httpbin + '/get', f'test=={UNICODE}') assert HTTP_OK in r assert r.json['args'] == {'test': UNICODE}, r def test_unicode_url_query_arg_item_verbose(httpbin): r = http('--verbose', httpbin + '/get', f'test=={UNICODE}') assert HTTP_OK in r assert UNICODE in r def test_unicode_url(httpbin): r = http(f'{httpbin}/get?test={UNICODE}') assert HTTP_OK in r assert r.json['args'] == {'test': UNICODE} def test_unicode_url_verbose(httpbin): r = http('--verbose', f'{httpbin}/get?test={UNICODE}') assert HTTP_OK in r assert r.json['args'] == {'test': UNICODE} def test_unicode_basic_auth(httpbin): # it doesn't really authenticate us because httpbin # doesn't interpret the UTF-8-encoded auth http('--verbose', '--auth', f'test:{UNICODE}', f'{httpbin}/basic-auth/test/{UNICODE}') def test_unicode_digest_auth(httpbin): # it doesn't really authenticate us because httpbin # doesn't interpret the UTF-8-encoded auth http('--auth-type=digest', '--auth', f'test:{UNICODE}', f'{httpbin}/digest-auth/auth/test/{UNICODE}') @pytest.mark.parametrize('charset, text', CHARSET_TEXT_PAIRS) @responses.activate def test_terminal_output_response_charset_detection(text, charset): responses.add( method=responses.POST, url=DUMMY_URL, body=text.encode(charset), content_type='text/plain', ) r = http('--form', 'POST', DUMMY_URL) assert text in r @pytest.mark.parametrize('charset, text', CHARSET_TEXT_PAIRS) @responses.activate def test_terminal_output_response_content_type_charset(charset, text): responses.add( method=responses.POST, url=DUMMY_URL, body=text.encode(charset), content_type=f'text/plain; charset={charset}', ) r = http('--form', 'POST', DUMMY_URL) assert text in r @pytest.mark.parametrize('charset, text', CHARSET_TEXT_PAIRS) @pytest.mark.parametrize('pretty', PRETTY_MAP.keys()) @responses.activate def test_terminal_output_response_content_type_charset_with_stream(charset, text, pretty): responses.add( method=responses.GET, url=DUMMY_URL, body=f'\n{text}'.encode(charset), stream=True, content_type=f'text/xml; charset={charset.upper()}', ) r = http('--pretty', pretty, '--stream', DUMMY_URL) assert text in r @pytest.mark.parametrize('charset, text', CHARSET_TEXT_PAIRS) @pytest.mark.parametrize('pretty', PRETTY_MAP.keys()) @responses.activate def test_terminal_output_response_charset_override(charset, text, pretty): responses.add( responses.GET, DUMMY_URL, body=text.encode(charset), content_type='text/plain; charset=utf-8', ) args = ['--pretty', pretty, DUMMY_URL] if charset != UTF8: # Content-Type charset wrong -> garbled text expected. r = http(*args) assert text not in r r = http('--response-charset', charset, *args) assert text in r @pytest.mark.parametrize('charset, text', CHARSET_TEXT_PAIRS) def test_terminal_output_request_content_type_charset(charset, text): r = http( '--offline', DUMMY_URL, f'Content-Type: text/plain; charset={charset.upper()}', env=MockEnvironment( stdin=text.encode(charset), stdin_isatty=False, ), ) assert text in r @pytest.mark.parametrize('charset, text', CHARSET_TEXT_PAIRS) def test_terminal_output_request_charset_detection(charset, text): r = http( '--offline', DUMMY_URL, 'Content-Type: text/plain', env=MockEnvironment( stdin=text.encode(charset), stdin_isatty=False, ), ) assert text in r cli-3.2.4/tests/test_errors.py000066400000000000000000000045301471121002400163500ustar00rootroot00000000000000import pytest import socket from unittest import mock from pytest import raises from requests import Request from requests.exceptions import ConnectionError from httpie.status import ExitStatus from .utils import HTTP_OK, http @mock.patch('httpie.core.program') def test_error(program): exc = ConnectionError('Connection aborted') exc.request = Request(method='GET', url='http://www.google.com') program.side_effect = exc r = http('www.google.com', tolerate_error_exit_status=True) assert r.exit_status == ExitStatus.ERROR error_msg = ( 'ConnectionError: ' 'Connection aborted while doing a GET request to URL: ' 'http://www.google.com' ) assert error_msg in r.stderr @mock.patch('httpie.core.program') def test_error_traceback(program): exc = ConnectionError('Connection aborted') exc.request = Request(method='GET', url='http://www.google.com') program.side_effect = exc with raises(ConnectionError): http('--traceback', 'www.google.com') @mock.patch('httpie.core.program') @pytest.mark.parametrize("error_code, expected_message", [ (socket.EAI_AGAIN, "check your connection"), (socket.EAI_NONAME, "check the URL"), ]) def test_error_custom_dns(program, error_code, expected_message): exc = ConnectionError('Connection aborted') exc.__context__ = socket.gaierror(error_code, "") program.side_effect = exc r = http('www.google.com', tolerate_error_exit_status=True) assert r.exit_status == ExitStatus.ERROR assert expected_message in r.stderr def test_max_headers_limit(httpbin_both): with raises(ConnectionError) as e: http('--max-headers=1', httpbin_both + '/get') assert 'got more than 1 headers' in str(e.value) def test_max_headers_no_limit(httpbin_both): assert HTTP_OK in http('--max-headers=0', httpbin_both + '/get') def test_response_charset_option_unknown_encoding(httpbin_both): r = http( '--response-charset=foobar', httpbin_both + '/get', tolerate_error_exit_status=True, ) assert "'foobar' is not a supported encoding" in r.stderr def test_response_mime_option_invalid_mime_type(httpbin_both): r = http( '--response-mime=foobar', httpbin_both + '/get', tolerate_error_exit_status=True, ) assert "'foobar' doesn’t look like a mime type" in r.stderr cli-3.2.4/tests/test_exit_status.py000066400000000000000000000051221471121002400174060ustar00rootroot00000000000000from unittest import mock from httpie.status import ExitStatus from .utils import MockEnvironment, http, HTTP_OK def test_keyboard_interrupt_during_arg_parsing_exit_status(httpbin): with mock.patch('httpie.cli.definition.parser.parse_args', side_effect=KeyboardInterrupt()): r = http('GET', httpbin + '/get', tolerate_error_exit_status=True) assert r.exit_status == ExitStatus.ERROR_CTRL_C def test_keyboard_interrupt_in_program_exit_status(httpbin): with mock.patch('httpie.core.program', side_effect=KeyboardInterrupt()): r = http('GET', httpbin + '/get', tolerate_error_exit_status=True) assert r.exit_status == ExitStatus.ERROR_CTRL_C def test_ok_response_exits_0(httpbin): r = http('GET', httpbin + '/get') assert HTTP_OK in r assert r.exit_status == ExitStatus.SUCCESS def test_error_response_exits_0_without_check_status(httpbin): r = http('GET', httpbin + '/status/500') assert '500 INTERNAL SERVER ERROR' in r assert r.exit_status == ExitStatus.SUCCESS assert not r.stderr def test_timeout_exit_status(httpbin): r = http('--timeout=0.01', 'GET', httpbin + '/delay/0.5', tolerate_error_exit_status=True) assert r.exit_status == ExitStatus.ERROR_TIMEOUT def test_3xx_check_status_exits_3_and_stderr_when_stdout_redirected( httpbin): env = MockEnvironment(stdout_isatty=False) r = http('--check-status', '--headers', 'GET', httpbin + '/status/301', env=env, tolerate_error_exit_status=True) assert '301 MOVED PERMANENTLY' in r assert r.exit_status == ExitStatus.ERROR_HTTP_3XX assert '301 moved permanently' in r.stderr.lower() def test_3xx_check_status_redirects_allowed_exits_0(httpbin): r = http('--check-status', '--follow', 'GET', httpbin + '/status/301', tolerate_error_exit_status=True) # The redirect will be followed so 200 is expected. assert HTTP_OK in r assert r.exit_status == ExitStatus.SUCCESS def test_4xx_check_status_exits_4(httpbin): r = http('--check-status', 'GET', httpbin + '/status/401', tolerate_error_exit_status=True) assert '401 UNAUTHORIZED' in r assert r.exit_status == ExitStatus.ERROR_HTTP_4XX # Also stderr should be empty since stdout isn't redirected. assert not r.stderr def test_5xx_check_status_exits_5(httpbin): r = http('--check-status', 'GET', httpbin + '/status/500', tolerate_error_exit_status=True) assert '500 INTERNAL SERVER ERROR' in r assert r.exit_status == ExitStatus.ERROR_HTTP_5XX cli-3.2.4/tests/test_httpie.py000066400000000000000000000242151471121002400163330ustar00rootroot00000000000000"""High-level tests.""" import io from unittest import mock import pytest import httpie import httpie.__main__ from .fixtures import FILE_CONTENT, FILE_PATH from httpie.cli.exceptions import ParseError from httpie.context import Environment from httpie.encoding import UTF8 from httpie.status import ExitStatus from .utils import HTTP_OK, MockEnvironment, StdinBytesIO, http def test_main_entry_point(): # Patch stdin to bypass pytest capture with mock.patch.object(Environment, 'stdin', io.StringIO()): assert httpie.__main__.main() == ExitStatus.ERROR.value @mock.patch('httpie.core.main') def test_main_entry_point_keyboard_interrupt(main): main.side_effect = KeyboardInterrupt() with mock.patch.object(Environment, 'stdin', io.StringIO()): assert httpie.__main__.main() == ExitStatus.ERROR_CTRL_C.value def test_debug(): r = http('--debug') assert r.exit_status == ExitStatus.SUCCESS assert f'HTTPie {httpie.__version__}' in r.stderr def test_help(): r = http('--help', tolerate_error_exit_status=True) assert r.exit_status == ExitStatus.SUCCESS assert 'https://github.com/httpie/cli/issues' in r def test_version(): r = http('--version', tolerate_error_exit_status=True) assert r.exit_status == ExitStatus.SUCCESS assert httpie.__version__ == r.strip() def test_GET(httpbin_both): r = http('GET', httpbin_both + '/get') assert HTTP_OK in r def test_path_dot_normalization(): r = http( '--offline', 'example.org/../../etc/password', 'param==value' ) assert 'GET /etc/password?param=value' in r def test_path_as_is(): r = http( '--offline', '--path-as-is', 'example.org/../../etc/password', 'param==value' ) assert 'GET /../../etc/password?param=value' in r def test_DELETE(httpbin_both): r = http('DELETE', httpbin_both + '/delete') assert HTTP_OK in r def test_PUT(httpbin_both): r = http('PUT', httpbin_both + '/put', 'foo=bar') assert HTTP_OK in r assert r.json['json']['foo'] == 'bar' def test_POST_JSON_data(httpbin_both): r = http('POST', httpbin_both + '/post', 'foo=bar') assert HTTP_OK in r assert r.json['json']['foo'] == 'bar' def test_POST_form(httpbin_both): r = http('--form', 'POST', httpbin_both + '/post', 'foo=bar') assert HTTP_OK in r assert '"foo": "bar"' in r def test_POST_form_multiple_values(httpbin_both): r = http('--form', 'POST', httpbin_both + '/post', 'foo=bar', 'foo=baz') assert HTTP_OK in r assert r.json['form'] == { 'foo': ['bar', 'baz'] } def test_POST_raw(httpbin_both): r = http('--raw', 'foo bar', 'POST', httpbin_both + '/post') assert HTTP_OK in r assert '"foo bar"' in r def test_POST_stdin(httpbin_both): env = MockEnvironment( stdin=StdinBytesIO(FILE_PATH.read_bytes()), stdin_isatty=False, ) r = http('--form', 'POST', httpbin_both + '/post', env=env) assert HTTP_OK in r assert FILE_CONTENT in r def test_POST_file(httpbin_both): r = http('--form', 'POST', httpbin_both + '/post', f'file@{FILE_PATH}') assert HTTP_OK in r assert FILE_CONTENT in r def test_form_POST_file_redirected_stdin(httpbin): """ """ with open(FILE_PATH, encoding=UTF8): r = http( '--form', 'POST', httpbin + '/post', f'file@{FILE_PATH}', tolerate_error_exit_status=True, env=MockEnvironment( stdin=StdinBytesIO(FILE_PATH.read_bytes()), stdin_isatty=False, ), ) assert r.exit_status == ExitStatus.ERROR assert 'cannot be mixed' in r.stderr def test_raw_POST_key_values_supplied(httpbin): r = http( '--raw', 'foo bar', 'POST', httpbin + '/post', 'foo=bar', tolerate_error_exit_status=True, ) assert r.exit_status == ExitStatus.ERROR assert 'cannot be mixed' in r.stderr def test_raw_POST_redirected_stdin(httpbin): r = http( '--raw', 'foo bar', 'POST', httpbin + '/post', tolerate_error_exit_status=True, env=MockEnvironment( stdin='some=value', stdin_isatty=False, ), ) assert r.exit_status == ExitStatus.ERROR assert 'cannot be mixed' in r.stderr def test_headers(httpbin_both): r = http('GET', httpbin_both + '/headers', 'Foo:bar') assert HTTP_OK in r assert '"User-Agent": "HTTPie' in r, r assert '"Foo": "bar"' in r def test_headers_unset(httpbin_both): r = http('GET', httpbin_both + '/headers') assert 'Accept' in r.json['headers'] # default Accept present r = http('GET', httpbin_both + '/headers', 'Accept:') assert 'Accept' not in r.json['headers'] # default Accept unset @pytest.mark.skip('unimplemented') def test_unset_host_header(httpbin_both): r = http('GET', httpbin_both + '/headers') assert 'Host' in r.json['headers'] # default Host present r = http('GET', httpbin_both + '/headers', 'Host:') assert 'Host' not in r.json['headers'] # default Host unset def test_unset_useragent_header(httpbin_both): r = http('GET', httpbin_both + '/headers') assert 'User-Agent' in r.json['headers'] # default User-Agent present r = http('GET', httpbin_both + '/headers', 'User-Agent:') assert 'User-Agent' not in r.json['headers'] # default User-Agent unset def test_headers_empty_value(httpbin_both): r = http('GET', httpbin_both + '/headers') assert r.json['headers']['Accept'] # default Accept has value r = http('GET', httpbin_both + '/headers', 'Accept;') assert r.json['headers']['Accept'] == '' # Accept has no value def test_headers_empty_value_with_value_gives_error(httpbin): with pytest.raises(ParseError): http('GET', httpbin + '/headers', 'Accept;SYNTAX_ERROR') def test_headers_omit(httpbin_both): r = http('GET', httpbin_both + '/headers', 'Accept:') assert 'Accept' not in r.json['headers'] def test_headers_multiple_omit(httpbin_both): r = http('GET', httpbin_both + '/headers', 'Foo:bar', 'Bar:baz', 'Foo:', 'Baz:quux') assert 'Foo' not in r.json['headers'] assert r.json['headers']['Bar'] == 'baz' assert r.json['headers']['Baz'] == 'quux' def test_headers_same_after_omit(httpbin_both): r = http('GET', httpbin_both + '/headers', 'Foo:bar', 'Foo:', 'Foo:quux') assert r.json['headers']['Foo'] == 'quux' def test_headers_fully_omit(httpbin_both): r = http('GET', httpbin_both + '/headers', 'Foo:bar', 'Foo:baz', 'Foo:') assert 'Foo' not in r.json['headers'] def test_headers_multiple_values(httpbin_both): r = http('GET', httpbin_both + '/headers', 'Foo:bar', 'Foo:baz') assert r.json['headers']['Foo'] == 'bar,baz' def test_headers_multiple_values_repeated(httpbin_both): r = http('GET', httpbin_both + '/headers', 'Foo:bar', 'Foo:baz', 'Foo:bar') assert r.json['headers']['Foo'] == 'bar,baz,bar' @pytest.mark.parametrize("headers, expected", [ ( ["Foo;", "Foo:bar"], ",bar" ), ( ["Foo:bar", "Foo;"], "bar," ), ( ["Foo:bar", "Foo;", "Foo:baz"], "bar,,baz" ), ]) def test_headers_multiple_values_with_empty(httpbin_both, headers, expected): r = http('GET', httpbin_both + '/headers', *headers) assert r.json['headers']['Foo'] == expected def test_headers_multiple_values_mixed(httpbin_both): r = http('GET', httpbin_both + '/headers', 'Foo:bar', 'Vary:XXX', 'Foo:baz', 'Vary:YYY', 'Foo:quux') assert r.json['headers']['Vary'] == 'XXX,YYY' assert r.json['headers']['Foo'] == 'bar,baz,quux' def test_headers_preserve_prepared_headers(httpbin_both): r = http('POST', httpbin_both + '/post', 'Content-Length:0', '--raw', 'foo') assert r.json['headers']['Content-Length'] == '3' @pytest.mark.parametrize('pretty', ['format', 'none']) def test_headers_multiple_headers_representation(httpbin_both, pretty): r = http('--offline', '--pretty', pretty, 'example.org', 'A:A', 'A:B', 'A:C', 'B:A', 'B:B', 'C:C', 'c:c') assert 'A: A' in r assert 'A: B' in r assert 'A: C' in r assert 'B: A' in r assert 'B: B' in r assert 'C: C' in r assert 'c: c' in r def test_response_headers_multiple(http_server): r = http('GET', http_server + '/headers', 'Foo:bar', 'Foo:baz') assert 'Foo: bar' in r assert 'Foo: baz' in r def test_response_headers_multiple_repeated(http_server): r = http('GET', http_server + '/headers', 'Foo:bar', 'Foo:baz', 'Foo:bar') assert r.count('Foo: bar') == 2 assert 'Foo: baz' in r @pytest.mark.parametrize('pretty', ['format', 'none']) def test_response_headers_multiple_representation(http_server, pretty): r = http('--pretty', pretty, http_server + '/headers', 'A:A', 'A:B', 'A:C', 'B:A', 'B:B', 'C:C', 'C:c') assert 'A: A' in r assert 'A: B' in r assert 'A: C' in r assert 'B: A' in r assert 'B: B' in r assert 'C: C' in r assert 'C: c' in r def test_json_input_preserve_order(httpbin_both): r = http('PATCH', httpbin_both + '/patch', 'order:={"map":{"1":"first","2":"second"}}') assert HTTP_OK in r assert r.json['data'] == \ '{"order": {"map": {"1": "first", "2": "second"}}}' @pytest.mark.parametrize('extra_args, expected_content_length', [ ( ['Content-Length:0'], '0' ), ( ['Content-Length:xxx'], 'xxx', ), ( ['--raw=data'], '4' ), ( ['query[param]=something'], '33' ) ]) def test_options_content_length_preservation(httpbin, extra_args, expected_content_length): r = http( '--offline', 'OPTIONS', httpbin + '/anything', *extra_args ) assert f'Content-Length: {expected_content_length}' in r @pytest.mark.parametrize('method', ['options', 'Options', 'OPTIONS']) def test_options_dropping_redundant_content_length(httpbin, method): r = http( '--offline', method, httpbin + '/anything' ) assert 'Content-Length' not in r cli-3.2.4/tests/test_httpie_cli.py000066400000000000000000000104631471121002400171620ustar00rootroot00000000000000import pytest import shutil import json from httpie.sessions import SESSIONS_DIR_NAME from httpie.status import ExitStatus from httpie.cli.options import PARSER_SPEC_VERSION from tests.utils import DUMMY_HOST, httpie from tests.fixtures import SESSION_FILES_PATH, SESSION_FILES_NEW, SESSION_FILES_OLD, read_session_file OLD_SESSION_FILES_PATH = SESSION_FILES_PATH / 'old' @pytest.mark.requires_installation def test_plugins_cli_error_message_without_args(): # No arguments result = httpie(no_debug=True) assert result.exit_status == ExitStatus.ERROR assert 'usage: ' in result.stderr assert 'specify one of these' in result.stderr assert 'please use the http/https commands:' in result.stderr @pytest.mark.parametrize( 'example', [ 'pie.dev/get', 'DELETE localhost:8000/delete', 'POST pie.dev/post header:value a=b header_2:value x:=1', ], ) @pytest.mark.requires_installation def test_plugins_cli_error_messages_with_example(example): result = httpie(*example.split(), no_debug=True) assert result.exit_status == ExitStatus.ERROR assert 'usage: ' in result.stderr assert f'http {example}' in result.stderr assert f'https {example}' in result.stderr @pytest.mark.parametrize( 'example', [ 'cli', 'plugins', 'cli foo', 'plugins unknown', 'plugins unknown.com A:B c=d', 'unknown.com UNPARSABLE????SYNTAX', ], ) @pytest.mark.requires_installation def test_plugins_cli_error_messages_invalid_example(example): result = httpie(*example.split(), no_debug=True) assert result.exit_status == ExitStatus.ERROR assert 'usage: ' in result.stderr assert f'http {example}' not in result.stderr assert f'https {example}' not in result.stderr HTTPIE_CLI_SESSIONS_UPGRADE_OPTIONS = [ ( # Default settings [], {'__host__': json.dumps(None)}, ), ( # When --bind-cookies is applied, the __host__ becomes DUMMY_URL. ['--bind-cookies'], {'__host__': json.dumps(DUMMY_HOST)}, ), ] @pytest.mark.parametrize( 'old_session_file, new_session_file', zip(SESSION_FILES_OLD, SESSION_FILES_NEW) ) @pytest.mark.parametrize( 'extra_args, extra_variables', HTTPIE_CLI_SESSIONS_UPGRADE_OPTIONS, ) def test_httpie_sessions_upgrade(tmp_path, old_session_file, new_session_file, extra_args, extra_variables): session_path = tmp_path / 'session.json' shutil.copyfile(old_session_file, session_path) result = httpie( 'cli', 'sessions', 'upgrade', *extra_args, DUMMY_HOST, str(session_path) ) assert result.exit_status == ExitStatus.SUCCESS assert read_session_file(session_path) == read_session_file( new_session_file, extra_variables=extra_variables ) def test_httpie_sessions_upgrade_on_non_existent_file(tmp_path): session_path = tmp_path / 'session.json' result = httpie('cli', 'sessions', 'upgrade', DUMMY_HOST, str(session_path)) assert result.exit_status == ExitStatus.ERROR assert 'does not exist' in result.stderr @pytest.mark.parametrize( 'extra_args, extra_variables', HTTPIE_CLI_SESSIONS_UPGRADE_OPTIONS, ) def test_httpie_sessions_upgrade_all(tmp_path, mock_env, extra_args, extra_variables): mock_env._create_temp_config_dir = False mock_env.config_dir = tmp_path / "config" session_dir = mock_env.config_dir / SESSIONS_DIR_NAME / DUMMY_HOST session_dir.mkdir(parents=True) for original_session_file in SESSION_FILES_OLD: shutil.copy(original_session_file, session_dir) result = httpie( 'cli', 'sessions', 'upgrade-all', *extra_args, env=mock_env ) assert result.exit_status == ExitStatus.SUCCESS for refactored_session_file, expected_session_file in zip( sorted(session_dir.glob("*.json")), SESSION_FILES_NEW ): assert read_session_file(refactored_session_file) == read_session_file( expected_session_file, extra_variables=extra_variables ) @pytest.mark.parametrize( 'load_func, extra_options', [ (json.loads, []), (json.loads, ['--format=json']) ] ) def test_cli_export(load_func, extra_options): response = httpie('cli', 'export-args', *extra_options) assert response.exit_status == ExitStatus.SUCCESS assert load_func(response)['version'] == PARSER_SPEC_VERSION cli-3.2.4/tests/test_json.py000066400000000000000000000444131471121002400160110ustar00rootroot00000000000000import json import pytest import responses from httpie.cli.constants import PRETTY_MAP from httpie.cli.exceptions import ParseError from httpie.cli.nested_json import NestedJSONSyntaxError from httpie.output.formatters.colors import ColorFormatter from httpie.utils import JsonDictPreservingDuplicateKeys from .fixtures import ( FILE_CONTENT, FILE_PATH, JSON_FILE_CONTENT, JSON_FILE_PATH, JSON_WITH_DUPE_KEYS_FILE_PATH, ) from .utils import DUMMY_URL, MockEnvironment, http TEST_JSON_XXSI_PREFIXES = [ r")]}',\n", ")]}',", 'while(1);', 'for(;;)', ')', ']', '}', ] TEST_JSON_VALUES = [ # FIXME: missing int & float {}, {'a': 0, 'b': 0}, [], ['a', 'b'], 'foo', True, False, None, ] TEST_PREFIX_TOKEN_COLOR = '\x1b[04m\x1b[91m' JSON_WITH_DUPES_RAW = '{"key": 15, "key": 15, "key": 3, "key": 7}' JSON_WITH_DUPES_FORMATTED_SORTED = """{ "key": 3, "key": 7, "key": 15, "key": 15 }""" JSON_WITH_DUPES_FORMATTED_UNSORTED = """{ "key": 15, "key": 15, "key": 3, "key": 7 }""" @pytest.mark.parametrize('data_prefix', TEST_JSON_XXSI_PREFIXES) @pytest.mark.parametrize('json_data', TEST_JSON_VALUES) @pytest.mark.parametrize('pretty', PRETTY_MAP.keys()) @responses.activate def test_json_formatter_with_body_preceded_by_non_json_data( data_prefix, json_data, pretty ): """Test JSON bodies preceded by non-JSON data.""" body = data_prefix + json.dumps(json_data) content_type = 'application/json;charset=utf8' responses.add( responses.GET, DUMMY_URL, body=body, content_type=content_type, ) colored_output = pretty in {'all', 'colors'} env = MockEnvironment(colors=256) if colored_output else None r = http('--pretty', pretty, DUMMY_URL, env=env) indent = None if pretty in {'none', 'colors'} else 4 expected_body = data_prefix + json.dumps(json_data, indent=indent) if colored_output: fmt = ColorFormatter( env, format_options={'json': {'format': True, 'indent': 4}} ) expected_body = fmt.format_body(expected_body, content_type) # Check to ensure the non-JSON data prefix is colored only one time, # meaning it was correctly handled as a whole. assert ( TEST_PREFIX_TOKEN_COLOR + data_prefix in expected_body ), expected_body assert expected_body in r @responses.activate def test_duplicate_keys_support_from_response(): """JSON with duplicate keys should be handled correctly.""" responses.add( responses.GET, DUMMY_URL, body=JSON_WITH_DUPES_RAW, content_type='application/json', ) args = ('--pretty', 'format', DUMMY_URL) # Check implicit --sorted if JsonDictPreservingDuplicateKeys.SUPPORTS_SORTING: r = http(*args) assert JSON_WITH_DUPES_FORMATTED_SORTED in r # Check --unsorted r = http(*args, '--unsorted') assert JSON_WITH_DUPES_FORMATTED_UNSORTED in r def test_duplicate_keys_support_from_input_file(): """JSON file with duplicate keys should be handled correctly.""" args = ( '--verbose', '--offline', DUMMY_URL, f'@{JSON_WITH_DUPE_KEYS_FILE_PATH}', ) # Check implicit --sorted if JsonDictPreservingDuplicateKeys.SUPPORTS_SORTING: r = http(*args) assert JSON_WITH_DUPES_FORMATTED_SORTED in r # Check --unsorted r = http(*args, '--unsorted') assert JSON_WITH_DUPES_FORMATTED_UNSORTED in r @pytest.mark.parametrize('value', [1, 1.1, True, 'some_value']) def test_simple_json_arguments_with_non_json(httpbin, value): r = http( '--form', httpbin + '/post', f'option:={json.dumps(value)}', ) assert r.json['form'] == {'option': str(value)} @pytest.mark.parametrize( 'request_type', [ '--form', '--multipart', ], ) @pytest.mark.parametrize('value', [[1, 2, 3], {'a': 'b'}, None]) def test_complex_json_arguments_with_non_json(httpbin, request_type, value): with pytest.raises(ParseError) as cm: http( request_type, httpbin + '/post', f'option:={json.dumps(value)}', ) cm.match('Cannot use complex JSON value types') @pytest.mark.parametrize( 'input_json, expected_json', [ # Examples taken from https://www.w3.org/TR/html-json-forms/ ( [ 'bottle-on-wall[]:=1', 'bottle-on-wall[]:=2', 'bottle-on-wall[]:=3', ], {'bottle-on-wall': [1, 2, 3]}, ), ( [ 'pet[species]=Dahut', 'pet[name]:="Hypatia"', 'kids[1]=Thelma', 'kids[0]:="Ashley"', ], { 'pet': {'species': 'Dahut', 'name': 'Hypatia'}, 'kids': ['Ashley', 'Thelma'], }, ), ( [ 'pet[0][species]=Dahut', 'pet[0][name]=Hypatia', 'pet[1][species]=Felis Stultus', 'pet[1][name]:="Billie"', ], { 'pet': [ {'species': 'Dahut', 'name': 'Hypatia'}, {'species': 'Felis Stultus', 'name': 'Billie'}, ] }, ), ( ['wow[such][deep][3][much][power][!]=Amaze'], { 'wow': { 'such': { 'deep': [ None, None, None, {'much': {'power': {'!': 'Amaze'}}}, ] } } }, ), ( ['mix[]=scalar', 'mix[2]=something', 'mix[4]:="something 2"'], {'mix': ['scalar', None, 'something', None, 'something 2']}, ), ( ['highlander[]=one'], {'highlander': ['one']}, ), ( ['error[good]=BOOM!', r'error\[bad:="BOOM BOOM!"'], {'error': {'good': 'BOOM!'}, 'error[bad': 'BOOM BOOM!'}, ), ( [ 'special[]:=true', 'special[]:=false', 'special[]:="true"', 'special[]:=null', ], {'special': [True, False, 'true', None]}, ), ( [ r'\[\]:=1', r'escape\[d\]:=1', r'escaped\[\]:=1', r'e\[s\][c][a][p][\[ed\]][]:=1', ], { '[]': 1, 'escape[d]': 1, 'escaped[]': 1, 'e[s]': {'c': {'a': {'p': {'[ed]': [1]}}}}, }, ), ( ['[]:=1', '[]=foo'], [1, 'foo'], ), ( [r'\]:=1', r'\[\]1:=1', r'\[1\]\]:=1'], {']': 1, '[]1': 1, '[1]]': 1}, ), ( [ r'foo\[bar\][baz]:=1', r'foo\[bar\]\[baz\]:=3', r'foo[bar][\[baz\]]:=4', ], { 'foo[bar]': {'baz': 1}, 'foo[bar][baz]': 3, 'foo': {'bar': {'[baz]': 4}}, }, ), ( ['key[]:=1', 'key[][]:=2', 'key[][][]:=3', 'key[][][]:=4'], {'key': [1, [2], [[3]], [[4]]]}, ), ( ['x[0]:=1', 'x[]:=2', 'x[]:=3', 'x[][]:=4', 'x[][]:=5'], {'x': [1, 2, 3, [4], [5]]}, ), ( [ f'x=@{FILE_PATH}', f'y[z]=@{FILE_PATH}', f'q[u][]:=@{JSON_FILE_PATH}', ], { 'x': FILE_CONTENT, 'y': {'z': FILE_CONTENT}, 'q': {'u': [json.loads(JSON_FILE_CONTENT)]}, }, ), ( [ 'foo[bar][5][]:=5', 'foo[bar][]:=6', 'foo[bar][][]:=7', 'foo[bar][][x]=dfasfdas', 'foo[baz]:=[1, 2, 3]', 'foo[baz][]:=4', ], { 'foo': { 'bar': [ None, None, None, None, None, [5], 6, [7], {'x': 'dfasfdas'}, ], 'baz': [1, 2, 3, 4], } }, ), ( [ 'foo[]:=1', 'foo[]:=2', 'foo[][key]=value', 'foo[2][key 2]=value 2', r'foo[2][key \[]=value 3', r'bar[nesting][under][!][empty][?][\\key]:=4', ], { 'foo': [ 1, 2, {'key': 'value', 'key 2': 'value 2', 'key [': 'value 3'}, ], 'bar': { 'nesting': {'under': {'!': {'empty': {'?': {'\\key': 4}}}}} }, }, ), ( [ r'foo\[key\]:=1', r'bar\[1\]:=2', r'baz\[\]:3', r'quux[key\[escape\]]:=4', r'quux[key 2][\\][\\\\][\\\[\]\\\]\\\[\n\\]:=5', ], { 'foo[key]': 1, 'bar[1]': 2, 'quux': { 'key[escape]': 4, 'key 2': {'\\': {'\\\\': {'\\[]\\]\\[\\n\\': 5}}}, }, }, ), ( [r'A[B\\]=C', r'A[B\\\\]=C', r'A[\B\\]=C'], {'A': {'B\\': 'C', 'B\\\\': 'C', '\\B\\': 'C'}}, ), ( [ 'name=python', 'version:=3', 'date[year]:=2021', 'date[month]=December', 'systems[]=Linux', 'systems[]=Mac', 'systems[]=Windows', 'people[known_ids][1]:=1000', 'people[known_ids][5]:=5000', ], { 'name': 'python', 'version': 3, 'date': {'year': 2021, 'month': 'December'}, 'systems': ['Linux', 'Mac', 'Windows'], 'people': {'known_ids': [None, 1000, None, None, None, 5000]}, }, ), ( [ r'foo[\1][type]=migration', r'foo[\2][type]=migration', r'foo[\dates]:=[2012, 2013]', r'foo[\dates][0]:=2014', r'foo[\2012 bleh]:=2013', r'foo[bleh \2012]:=2014', r'\2012[x]:=2', r'\2012[\[3\]]:=4', ], { 'foo': { '1': {'type': 'migration'}, '2': {'type': 'migration'}, '\\dates': [2014, 2013], '\\2012 bleh': 2013, 'bleh \\2012': 2014, }, '2012': {'x': 2, '[3]': 4}, }, ), ( [ r'a[\0]:=0', r'a[\\1]:=1', r'a[\\\2]:=2', r'a[\\\\\3]:=3', r'a[-1\\]:=-1', r'a[-2\\\\]:=-2', r'a[\\-3\\\\]:=-3', ], { 'a': { '0': 0, r'\1': 1, r'\\2': 2, r'\\\3': 3, '-1\\': -1, '-2\\\\': -2, '\\-3\\\\': -3, } }, ), ( ['[]:=0', '[]:=1', '[5]:=5', '[]:=6', '[9]:=9'], [0, 1, None, None, None, 5, 6, None, None, 9], ), ( ['=empty', 'foo=bar', 'bar[baz][quux]=tuut'], {'': 'empty', 'foo': 'bar', 'bar': {'baz': {'quux': 'tuut'}}}, ), ( [ r'\1=top level int', r'\\1=escaped top level int', r'\2[\3][\4]:=5', ], { '1': 'top level int', '\\1': 'escaped top level int', '2': {'3': {'4': 5}}, }, ), ( [':={"foo": {"bar": "baz"}}', 'top=val'], {'': {'foo': {'bar': 'baz'}}, 'top': 'val'}, ), ( ['[][a][b][]:=1', '[0][a][b][]:=2', '[][]:=2'], [{'a': {'b': [1, 2]}}, [2]], ), ([':=[1,2,3]'], {'': [1, 2, 3]}), ([':=[1,2,3]', 'foo=bar'], {'': [1, 2, 3], 'foo': 'bar'}), ], ) def test_nested_json_syntax(input_json, expected_json, httpbin): r = http(httpbin + '/post', *input_json) assert r.json['json'] == expected_json @pytest.mark.parametrize( 'input_json, expected_error', [ ( ['A[:=1'], "HTTPie Syntax Error: Expecting a text, a number or ']'\nA[\n ^", ), (['A[1:=1'], "HTTPie Syntax Error: Expecting ']'\nA[1\n ^"), (['A[text:=1'], "HTTPie Syntax Error: Expecting ']'\nA[text\n ^"), ( ['A[text][:=1'], "HTTPie Syntax Error: Expecting a text, a number or ']'\nA[text][\n ^", ), ( ['A[key]=value', 'B[something]=u', 'A[text][:=1', 'C[key]=value'], "HTTPie Syntax Error: Expecting a text, a number or ']'\nA[text][\n ^", ), ( ['A[text]1:=1'], "HTTPie Syntax Error: Expecting '['\nA[text]1\n ^", ), (['A\\[]:=1'], "HTTPie Syntax Error: Expecting '['\nA\\[]\n ^"), ( ['A[something\\]:=1'], "HTTPie Syntax Error: Expecting ']'\nA[something\\]\n ^", ), ( ['foo\\[bar\\]\\\\[ bleh:=1'], "HTTPie Syntax Error: Expecting ']'\nfoo\\[bar\\]\\\\[ bleh\n ^", ), ( ['foo\\[bar\\]\\\\[ bleh :=1'], "HTTPie Syntax Error: Expecting ']'\nfoo\\[bar\\]\\\\[ bleh \n ^", ), ( ['foo[bar][1]][]:=2'], "HTTPie Syntax Error: Expecting '['\nfoo[bar][1]][]\n ^", ), ( ['foo[bar][1]something[]:=2'], "HTTPie Syntax Error: Expecting '['\nfoo[bar][1]something[]\n ^^^^^^^^^", ), ( ['foo[bar][1][142241[]:=2'], "HTTPie Syntax Error: Expecting ']'\nfoo[bar][1][142241[]\n ^", ), ( ['foo[bar][1]\\[142241[]:=2'], "HTTPie Syntax Error: Expecting '['\nfoo[bar][1]\\[142241[]\n ^^^^^^^^", ), ( ['foo=1', 'foo[key]:=2'], "HTTPie Type Error: Cannot perform 'key' based access on 'foo' which has a type of 'string' but this operation requires a type of 'object'.\nfoo[key]\n ^^^^^", ), ( ['foo=1', 'foo[0]:=2'], "HTTPie Type Error: Cannot perform 'index' based access on 'foo' which has a type of 'string' but this operation requires a type of 'array'.\nfoo[0]\n ^^^", ), ( ['foo=1', 'foo[]:=2'], "HTTPie Type Error: Cannot perform 'append' based access on 'foo' which has a type of 'string' but this operation requires a type of 'array'.\nfoo[]\n ^^", ), ( ['data[key]=value', 'data[key 2]=value 2', 'data[0]=value'], "HTTPie Type Error: Cannot perform 'index' based access on 'data' which has a type of 'object' but this operation requires a type of 'array'.\ndata[0]\n ^^^", ), ( ['data[key]=value', 'data[key 2]=value 2', 'data[]=value'], "HTTPie Type Error: Cannot perform 'append' based access on 'data' which has a type of 'object' but this operation requires a type of 'array'.\ndata[]\n ^^", ), ( [ 'foo[bar][baz][5]:=[1,2,3]', 'foo[bar][baz][5][]:=4', 'foo[bar][baz][key][]:=5', ], "HTTPie Type Error: Cannot perform 'key' based access on 'foo[bar][baz]' which has a type of 'array' but this operation requires a type of 'object'.\nfoo[bar][baz][key][]\n ^^^^^", ), ( ['foo[-10]:=[1,2]'], 'HTTPie Value Error: Negative indexes are not supported.\nfoo[-10]\n ^^^', ), ( ['foo[0]:=1', 'foo[]:=2', 'foo[\\2]:=3'], "HTTPie Type Error: Cannot perform 'key' based access on 'foo' which has a type of 'array' but this operation requires a type of 'object'.\nfoo[\\2]\n ^^^^", ), ( ['foo[\\1]:=2', 'foo[5]:=3'], "HTTPie Type Error: Cannot perform 'index' based access on 'foo' which has a type of 'object' but this operation requires a type of 'array'.\nfoo[5]\n ^^^", ), ( ['x=y', '[]:=2'], "HTTPie Type Error: Cannot perform 'append' based access on '' which has a type of 'object' but this operation requires a type of 'array'.", ), ( ['[]:=2', 'x=y'], "HTTPie Type Error: Cannot perform 'key' based access on '' which has a type of 'array' but this operation requires a type of 'object'.", ), ( [':=[1,2,3]', '[]:=4'], "HTTPie Type Error: Cannot perform 'append' based access on '' which has a type of 'object' but this operation requires a type of 'array'.", ), ( ['[]:=4', ':=[1,2,3]'], "HTTPie Type Error: Cannot perform 'key' based access on '' which has a type of 'array' but this operation requires a type of 'object'.", ), ], ) def test_nested_json_errors(input_json, expected_error, httpbin): with pytest.raises(NestedJSONSyntaxError) as exc: http(httpbin + '/post', *input_json) exc_lines = str(exc.value).splitlines() expected_lines = expected_error.splitlines() if len(expected_lines) == 1: # When the error offsets are not important, we'll just compare the actual # error message. exc_lines = exc_lines[:1] assert expected_lines == exc_lines def test_nested_json_sparse_array(httpbin_both): r = http(httpbin_both + '/post', 'test[0]:=1', 'test[100]:=1') assert len(r.json['json']['test']) == 101 cli-3.2.4/tests/test_meta.py000066400000000000000000000010721471121002400157600ustar00rootroot00000000000000import pytest from httpie.models import ELAPSED_TIME_LABEL from httpie.output.formatters.colors import PIE_STYLE_NAMES from .utils import http, MockEnvironment, COLOR def test_meta_elapsed_time(httpbin): r = http('--meta', httpbin + '/delay/1') assert f'{ELAPSED_TIME_LABEL}: 1.' in r @pytest.mark.parametrize('style', ['auto', 'fruity', *PIE_STYLE_NAMES]) def test_meta_elapsed_time_colors(httpbin, style): r = http('--style', style, '--meta', httpbin + '/get', env=MockEnvironment(colors=256)) assert COLOR in r assert ELAPSED_TIME_LABEL in r cli-3.2.4/tests/test_offline.py000066400000000000000000000036731471121002400164650ustar00rootroot00000000000000from .fixtures import FILE_CONTENT, FILE_PATH_ARG from .utils import http def test_offline(): r = http( '--offline', 'https://this-should.never-resolve/foo', ) assert 'GET /foo' in r def test_offline_raw(): r = http( '--offline', '--raw', 'foo bar', 'https://this-should.never-resolve/foo', ) assert 'POST /foo' in r assert 'foo bar' in r def test_offline_raw_empty_should_use_POST(): r = http( '--offline', '--raw', '', 'https://this-should.never-resolve/foo', ) assert 'POST /foo' in r def test_offline_form(): r = http( '--offline', '--form', 'https://this-should.never-resolve/foo', 'foo=bar' ) assert 'POST /foo' in r assert 'foo=bar' in r def test_offline_json(): r = http( '--offline', 'https://this-should.never-resolve/foo', 'foo=bar' ) assert 'POST /foo' in r assert r.json == {'foo': 'bar'} def test_offline_multipart(): r = http( '--offline', '--multipart', 'https://this-should.never-resolve/foo', 'foo=bar' ) assert 'POST /foo' in r assert 'name="foo"' in r def test_offline_from_file(): r = http( '--offline', 'https://this-should.never-resolve/foo', f'@{FILE_PATH_ARG}' ) assert 'POST /foo' in r assert FILE_CONTENT in r def test_offline_chunked(): r = http( '--offline', '--chunked', '--form', 'https://this-should.never-resolve/foo', 'hello=world' ) assert 'POST /foo' in r assert 'Transfer-Encoding: chunked' in r, r assert 'hello=world' in r def test_offline_download(): """Absence of response should be handled gracefully with --download""" r = http( '--offline', '--download', 'https://this-should.never-resolve/foo', ) assert 'GET /foo' in r cli-3.2.4/tests/test_output.py000066400000000000000000000504061471121002400163770ustar00rootroot00000000000000import argparse from pathlib import Path from unittest import mock import json import os import io import warnings from urllib.request import urlopen import pytest import requests import responses from httpie.cli.argtypes import ( PARSED_DEFAULT_FORMAT_OPTIONS, parse_format_options, ) from httpie.cli.definition import parser from httpie.encoding import UTF8 from httpie.output.formatters.colors import get_lexer, PIE_STYLE_NAMES, BUNDLED_STYLES from httpie.status import ExitStatus from .fixtures import XML_DATA_RAW, XML_DATA_FORMATTED from .utils import COLOR, CRLF, HTTP_OK, MockEnvironment, http, DUMMY_URL, strip_colors # For ensuring test reproducibility, avoid using the unsorted # BUNDLED_STYLES set. SORTED_BUNDLED_STYLES = sorted(BUNDLED_STYLES) @pytest.mark.parametrize('stdout_isatty', [True, False]) def test_output_option(tmp_path, httpbin, stdout_isatty): output_filename = tmp_path / 'test_output_option' url = httpbin + '/robots.txt' r = http('--output', str(output_filename), url, env=MockEnvironment(stdout_isatty=stdout_isatty)) assert r == '' expected_body = urlopen(url).read().decode() actual_body = output_filename.read_text(encoding=UTF8) assert actual_body == expected_body class TestQuietFlag: QUIET_SCENARIOS = [('--quiet',), ('-q',), ('--quiet', '--quiet'), ('-qq',)] @pytest.mark.parametrize('quiet_flags', QUIET_SCENARIOS) def test_quiet(self, httpbin, quiet_flags): env = MockEnvironment( stdin_isatty=True, stdout_isatty=True, devnull=io.BytesIO() ) r = http(*quiet_flags, 'GET', httpbin + '/get', env=env) assert env.stdout is env.devnull assert env.stderr is env.devnull assert HTTP_OK in r.devnull assert r == '' assert r.stderr == '' def test_quiet_with_check_status_non_zero(self, httpbin): r = http( '--quiet', '--check-status', httpbin + '/status/500', tolerate_error_exit_status=True, ) assert 'http: warning: HTTP 500' in r.stderr def test_quiet_with_check_status_non_zero_pipe(self, httpbin): r = http( '--quiet', '--check-status', httpbin + '/status/500', tolerate_error_exit_status=True, env=MockEnvironment(stdout_isatty=False) ) assert 'http: warning: HTTP 500' in r.stderr def test_quiet_quiet_with_check_status_non_zero(self, httpbin): r = http( '--quiet', '--quiet', '--check-status', httpbin + '/status/500', tolerate_error_exit_status=True, ) assert not r.stderr def test_quiet_quiet_with_check_status_non_zero_pipe(self, httpbin): r = http( '--quiet', '--quiet', '--check-status', httpbin + '/status/500', tolerate_error_exit_status=True, env=MockEnvironment(stdout_isatty=False) ) assert 'http: warning: HTTP 500' in r.stderr @mock.patch('httpie.core.program') @pytest.mark.parametrize('flags, expected_warnings', [ ([], 1), (['-q'], 1), (['-qq'], 0), ]) # Might fail on Windows due to interference from other warnings. @pytest.mark.xfail def test_quiet_on_python_warnings(self, test_patch, httpbin, flags, expected_warnings): def warn_and_run(*args, **kwargs): warnings.warn('warning!!') return ExitStatus.SUCCESS test_patch.side_effect = warn_and_run with pytest.warns(None) as record: http(*flags, httpbin + '/get') assert len(record) == expected_warnings def test_double_quiet_on_error(self, httpbin): r = http( '-qq', '--check-status', '$$$this.does.not.exist$$$', tolerate_error_exit_status=True, ) assert not r assert 'Couldn’t resolve the given hostname' in r.stderr @pytest.mark.parametrize('quiet_flags', QUIET_SCENARIOS) @mock.patch('httpie.cli.argtypes.AuthCredentials._getpass', new=lambda self, prompt: 'password') def test_quiet_with_password_prompt(self, httpbin, quiet_flags): """ Tests whether httpie still prompts for a password when request requires authentication and only username is provided """ env = MockEnvironment( stdin_isatty=True, stdout_isatty=True, devnull=io.BytesIO() ) r = http( *quiet_flags, '--auth', 'user', 'GET', httpbin + '/basic-auth/user/password', env=env ) assert env.stdout is env.devnull assert env.stderr is env.devnull assert HTTP_OK in r.devnull assert r == '' assert r.stderr == '' @pytest.mark.parametrize('quiet_flags', QUIET_SCENARIOS) @pytest.mark.parametrize('output_options', ['-h', '-b', '-v', '-p=hH']) def test_quiet_with_explicit_output_options(self, httpbin, quiet_flags, output_options): env = MockEnvironment(stdin_isatty=True, stdout_isatty=True) r = http(*quiet_flags, output_options, httpbin + '/get', env=env) assert env.stdout is env.devnull assert env.stderr is env.devnull assert r == '' assert r.stderr == '' @pytest.mark.parametrize('quiet_flags', QUIET_SCENARIOS) @pytest.mark.parametrize('with_download', [True, False]) def test_quiet_with_output_redirection(self, tmp_path, httpbin, quiet_flags, with_download): url = httpbin + '/robots.txt' output_path = Path('output.txt') env = MockEnvironment() orig_cwd = os.getcwd() output = requests.get(url).text extra_args = ['--download'] if with_download else [] os.chdir(tmp_path) try: assert os.listdir('.') == [] r = http( *quiet_flags, '--output', str(output_path), *extra_args, url, env=env ) assert os.listdir('.') == [str(output_path)] assert r == '' assert r.stderr == '' assert env.stderr is env.devnull if with_download: assert env.stdout is env.devnull else: assert env.stdout is not env.devnull # --output swaps stdout. assert output_path.read_text(encoding=UTF8) == output finally: os.chdir(orig_cwd) class TestVerboseFlag: def test_verbose(self, httpbin): r = http('--verbose', 'GET', httpbin + '/get', 'test-header:__test__') assert HTTP_OK in r assert r.count('__test__') == 2 def test_verbose_raw(self, httpbin): r = http('--verbose', '--raw', 'foo bar', 'POST', httpbin + '/post') assert HTTP_OK in r assert 'foo bar' in r def test_verbose_form(self, httpbin): # https://github.com/httpie/cli/issues/53 r = http('--verbose', '--form', 'POST', httpbin + '/post', 'A=B', 'C=D') assert HTTP_OK in r assert 'A=B&C=D' in r def test_verbose_json(self, httpbin): r = http('--verbose', 'POST', httpbin + '/post', 'foo=bar', 'baz=bar') assert HTTP_OK in r assert '"baz": "bar"' in r def test_verbose_implies_all(self, httpbin): r = http('--verbose', '--follow', httpbin + '/redirect/1') assert 'GET /redirect/1 HTTP/1.1' in r assert 'HTTP/1.1 302 FOUND' in r assert 'GET /get HTTP/1.1' in r assert HTTP_OK in r class TestColors: @pytest.mark.parametrize( 'mime, explicit_json, body, expected_lexer_name', [ ('application/json', False, None, 'JSON'), ('application/json+foo', False, None, 'JSON'), ('application/foo+json', False, None, 'JSON'), ('application/json-foo', False, None, 'JSON'), ('application/x-json', False, None, 'JSON'), ('foo/json', False, None, 'JSON'), ('foo/json+bar', False, None, 'JSON'), ('foo/bar+json', False, None, 'JSON'), ('foo/json-foo', False, None, 'JSON'), ('foo/x-json', False, None, 'JSON'), ('application/vnd.comverge.grid+hal+json', False, None, 'JSON'), ('text/plain', True, '{}', 'JSON'), ('text/plain', True, 'foo', 'Text only'), ] ) def test_get_lexer(self, mime, explicit_json, body, expected_lexer_name): lexer = get_lexer(mime, body=body, explicit_json=explicit_json) assert lexer is not None assert lexer.name == expected_lexer_name def test_get_lexer_not_found(self): assert get_lexer('xxx/yyy') is None @pytest.mark.parametrize("endpoint", [ "/encoding/utf8", "/html", "/json", "/xml", ]) def test_ensure_contents_colored(httpbin, endpoint): env = MockEnvironment(colors=256) r = http('--body', 'GET', httpbin + endpoint, env=env) assert COLOR in r @pytest.mark.parametrize('style', PIE_STYLE_NAMES) def test_ensure_meta_is_colored(httpbin, style): env = MockEnvironment(colors=256) r = http('--meta', '--style', style, 'GET', httpbin + '/get', env=env) assert COLOR in r @pytest.mark.parametrize('style', SORTED_BUNDLED_STYLES) @pytest.mark.parametrize('msg', [ '', ' ', ' OK', ' OK ', ' CUSTOM ', ]) def test_ensure_status_code_is_shown_on_all_themes(http_server, style, msg): env = MockEnvironment(colors=256) r = http('--style', style, http_server + '/status/msg', '--raw', msg, env=env) # Trailing space is stripped away. assert 'HTTP/1.0 200' + msg.rstrip() in strip_colors(r) class TestPrettyOptions: """Test the --pretty handling.""" def test_pretty_enabled_by_default(self, httpbin): env = MockEnvironment(colors=256) r = http('GET', httpbin + '/get', env=env) assert COLOR in r def test_pretty_enabled_by_default_unless_stdout_redirected(self, httpbin): r = http('GET', httpbin + '/get') assert COLOR not in r def test_force_pretty(self, httpbin): env = MockEnvironment(stdout_isatty=False, colors=256) r = http('--pretty=all', 'GET', httpbin + '/get', env=env) assert COLOR in r def test_force_ugly(self, httpbin): r = http('--pretty=none', 'GET', httpbin + '/get') assert COLOR not in r def test_subtype_based_pygments_lexer_match(self, httpbin): """Test that media subtype is used if type/subtype doesn't match any lexer. """ env = MockEnvironment(colors=256) r = http('--print=B', '--pretty=all', httpbin + '/post', 'Content-Type:text/foo+json', 'a=b', env=env) assert COLOR in r def test_colors_option(self, httpbin): env = MockEnvironment(colors=256) r = http('--print=B', '--pretty=colors', 'GET', httpbin + '/get', 'a=b', env=env) # Tests that the JSON data isn't formatted. assert not r.strip().count('\n') assert COLOR in r def test_format_option(self, httpbin): env = MockEnvironment(colors=256) r = http('--print=B', '--pretty=format', 'GET', httpbin + '/get', 'a=b', env=env) # Tests that the JSON data is formatted. assert r.strip().count('\n') == 2 assert COLOR not in r class TestLineEndings: """ Test that CRLF is properly used in headers and as the headers/body separator. """ def _validate_crlf(self, msg): lines = iter(msg.splitlines(True)) for header in lines: if header == CRLF: break assert header.endswith(CRLF), repr(header) else: assert 0, f'CRLF between headers and body not found in {msg!r}' body = ''.join(lines) assert CRLF not in body return body def test_CRLF_headers_only(self, httpbin): r = http('--headers', 'GET', httpbin + '/get') body = self._validate_crlf(r) assert not body, f'Garbage after headers: {r!r}' def test_CRLF_ugly_response(self, httpbin): r = http('--pretty=none', 'GET', httpbin + '/get') self._validate_crlf(r) def test_CRLF_formatted_response(self, httpbin): r = http('--pretty=format', 'GET', httpbin + '/get') assert r.exit_status == ExitStatus.SUCCESS self._validate_crlf(r) def test_CRLF_ugly_request(self, httpbin): r = http('--pretty=none', '--print=HB', 'GET', httpbin + '/get') self._validate_crlf(r) def test_CRLF_formatted_request(self, httpbin): r = http('--pretty=format', '--print=HB', 'GET', httpbin + '/get') self._validate_crlf(r) class TestFormatOptions: def test_header_formatting_options(self): def get_headers(sort): return http( '--offline', '--print=H', '--format-options', 'headers.sort:' + sort, 'example.org', 'ZZZ:foo', 'XXX:foo', ) r_sorted = get_headers('true') r_unsorted = get_headers('false') assert r_sorted != r_unsorted assert f'XXX: foo{CRLF}ZZZ: foo' in r_sorted assert f'ZZZ: foo{CRLF}XXX: foo' in r_unsorted @pytest.mark.parametrize( 'options, expected_json', [ # @formatter:off ( 'json.sort_keys:true,json.indent:4', json.dumps({'a': 0, 'b': 0}, indent=4), ), ( 'json.sort_keys:false,json.indent:2', json.dumps({'b': 0, 'a': 0}, indent=2), ), ( 'json.format:false', json.dumps({'b': 0, 'a': 0}), ), # @formatter:on ] ) def test_json_formatting_options(self, options: str, expected_json: str): r = http( '--offline', '--print=B', '--format-options', options, 'example.org', 'b:=0', 'a:=0', ) assert expected_json in r @pytest.mark.parametrize( 'defaults, options_string, expected', [ # @formatter:off ({'foo': {'bar': 1}}, 'foo.bar:2', {'foo': {'bar': 2}}), ({'foo': {'bar': True}}, 'foo.bar:false', {'foo': {'bar': False}}), ({'foo': {'bar': 'a'}}, 'foo.bar:b', {'foo': {'bar': 'b'}}), # @formatter:on ] ) def test_parse_format_options(self, defaults, options_string, expected): actual = parse_format_options(s=options_string, defaults=defaults) assert expected == actual @pytest.mark.parametrize( 'options_string, expected_error', [ ('foo:2', 'invalid option'), ('foo.baz:2', 'invalid key'), ('foo.bar:false', 'expected int got bool'), ] ) def test_parse_format_options_errors(self, options_string, expected_error): defaults = { 'foo': { 'bar': 1 } } with pytest.raises(argparse.ArgumentTypeError, match=expected_error): parse_format_options(s=options_string, defaults=defaults) @pytest.mark.parametrize( 'args, expected_format_options', [ ( [ '--format-options', 'headers.sort:false,json.sort_keys:false', '--format-options=json.indent:10' ], { 'headers': { 'sort': False }, 'json': { 'sort_keys': False, 'indent': 10, 'format': True }, 'xml': { 'format': True, 'indent': 2, }, } ), ( [ '--unsorted' ], { 'headers': { 'sort': False }, 'json': { 'sort_keys': False, 'indent': 4, 'format': True }, 'xml': { 'format': True, 'indent': 2, }, } ), ( [ '--format-options=headers.sort:true', '--unsorted', '--format-options=headers.sort:true', ], { 'headers': { 'sort': True }, 'json': { 'sort_keys': False, 'indent': 4, 'format': True }, 'xml': { 'format': True, 'indent': 2, }, } ), ( [ '--no-format-options', # --no-

Xc5Xc2пT,TUJ$U)㍪lJtE/ ף%N{_5ٍ>cug^'O<* VMv'/>8o3U^'_gaad7<O|f>)\_7"X e&񫓷OOgcL`a&0%{g'Ԧ` Jضw0udNa8Pq:4Pq۰I@db~b0Re"(Cqt><H PGo PV7p}2|jPfq'l9hM Hqcf®yqQm=rg M 0 vǶԧh'sq*<֣ݸ;PL l =8@><f'm q>QO4q>aLM3գ,@4`zPG:]<!!6X=qwQV@`4`mQe|p5 XqXXq5dL#X#1?zu"Xeq*Yf38*;dvbZW8@8 ~lی#XAS٭6Aq7<2~PE @,pYg882ĉ#[Hq+Rƙ{78mQgKpdzE G Ѕ8 +Rv'8"bOxHq&@g??8@Xrٰ}x"0q"&WܹwKsõ> ca0/#{[7m { 3s\ض;km}c7`Ѝ ;7\+_?yo\;/5^~}|R{76l ߜ0+7M*H&dx^Pu'ՂNyVT}>`0Σʔeۧ/JGiN]Ǡ;N'ݫþv6 65>p3~kC38̣n 0<`B|Iq: o=0YxsMng}Mw΋!y7S1VM7` 3!LڑlIJW֩V@0rv TxrJ<{=򌌏 Ϟi>?|s`P3r0@@|bp]T;C߼.JM{pؖry=4w*@;@jA| )geaZѯ׿߳kkf_p%kkYWT ܰ8=0ተҷN~㝵x-xtdϽSS]#?ߥ5z={?'@_]3{? eeB|6JOwՑ̝}7P:@b^LG38M:GI8~3I?0rS`Ybؿ~tsT}:v/mx9c`R7ɻāzox /Jn.xoʕ'_7@/5#>"&_foɠ9nW>y48V$kMb8Ɠ/Kqɇˏg{zI5)*SV@ $ݘ}:볏fK_3;Uc W XP᎛Tƍ4ܿ :|_߫}={ݱjoN~-ݸ;J򏪁}# {ȭax|k\{p\0·MM.ЯbEʑ-He8~@Y_ [r pQG848bEJ >q`UpXmq`] gîւ@Xs'sdNL/S ^Jof_*}M;Ԛ9siΆ<)L*l]?Pt囝@/S2Ȏb7u=vVeۧ/r5WS)qJSH왶' {;Xpbphlzʔejԣ4oNyÉuW.}zC=Os~W;n{p;n<)፪n\ E Lq{kblG>$ů7v`nw!O]7^tµgVr_֧ݏ~Xc5Ďaj߭k5J8oN,i͆W~WjkZ.XǩDIÞ{̣ۂ78;=pۺb[:ə[s1,O g0(~ J%zVT4h9ſt1vQ{(9[Jf<1Ԏw|$kZgb ލ75a8@CJ,yw80Y !S@<>߭gdJ 0;1a8ۘOc(^Ԅq o66 KCTy>AR`Ќ 7zL^#^J=0xO]x{W_I<4Qq\7ڴ7n#@o7PZvcЌǫ=D`N (#w#[zOhDZJxkr\(@gnSzB=Jx 5g ÉF }71^!_7OygֳJJO @)0Σ61*1 ON'x x8Q4^~ vw<4Q*ͮV| z*N@vhlZX=\0BRʰ? 1y-w7l&0bqz@-g+Cc1N-5?USjXvƜ20pFñm3a7ͼ!1PRmEڅ\x[u'-E @y&@%C |CbfwnJ>]-82GjVp ۇ'[f=`Ce!z(H'lׯ/WS٭a2X?zz]F]ib _M@pdpd7ܐ / j-9nM k 57lMr'7l<kN!unJu~dέ^2ЗFÉG8>\N`6,2_%ol\=+jg!{e{h&Cq;<`ʼn l*Ɠn~7͆ ĉ<`}zD=J~uI+oiEϷ[aw%wuH=$*iW2+ XJ&Ʃ𡐝.Gnzīm߉:6ىJs٠7ߩ&`znf(^H[vVexj<;. /;8}!o8>\ia*<˝.J6fnL'NM_.(e7TzM8q‘-UF=MCBh o_јN?[hV'Wsr,zꤚw''l5w/,ԦuH̕Lx])&5!^PzYdyJbWjb5&ō4X]q*|2(gjZ0d]\BR4= ۦCEa7fke+@'m bOxGi踒T}ʻ۝N\usY`Bpi*7 *MZU)sy*ŽL<ބ3%=^h`QRnqz4VV Xinunj-NT'Cjh(n`q~{bjVۯy5a8qzN ><Xb5bb\A\3l¤moj sVR{UN@b#M7mNnX>l^^HO̲hs͐s~rcxp1v󬅅!ӕ%(59ɝ>fŚ"M4c݋en *TBS3aq|^m\%fbsp:1qf9նɛ2D` b=H024}Yꝯ6,.,lѤwJv:9h]4]W<^NqEDsD;7U6ԧ‡*Ct xJYqʔ,P9b[fv*Z[:g7̆l нF=MM3ռ *O՜`3uQKyvx5_%OQx)8k*NNL724iuΎMл[ϯ47xJm9jQ+}!оgȝnBx$ A }7b=H1n!&;hW;<|fx[j/VwRaPH 9M4:q"|thva:BFR϶zĻL=4o;̼; aJfeh5sn{w~+)ֽOXqS٭a2hSᛇ6/td˜zlHkgVX]W`Ҭ^$z* O,țL/?OfWI!|0#w#[F7Ѷ=mҐ}BQ*{OWmDIUZoA;Kgax X0e:LmQnC#n^@WN/ֺj|( fZ 0Z~W#7]NX`Cо^i2H 0ĎM4o6JfXiR;yɠ"/R_N[u+$B+W[ KS`J$yT_80p*666f(XObBբm6CU:rzhpPχ 7縋5qy#n9j5م!TT['|y@$vw J 7\ 7^jʙI7?mD"V VUד$'UZt&^;1%Jxg|Uҿh=J{\2avb: d>Tj W;M'E+sUqn2l>[|ww!Эv~/n/\=WN\^yd8q l(ig’jN 7\^+u̕usu!9U/1Ws%.?VCH5Ew7n*@e'_#sm<<6,\'NW/}}Q֩ɰ義09sk9W.ϥm;Z^4Աͻ&[081Ƿφ];@P 7oT Th%]ER8@Ԃg+:}&R[j7T4q_XYMy{V"sgf_텿 OT3S!N b|0k/:?{X:ϿY;mu Ó}WjG~:s y&0(+ !FaxqY!9޹R\QV: lGqq%$OXJ[I]5.ZQr+U(n ^LM~_,ʥպsORe['_~Sݺ^Hk qo~kp ['Žm0|~vEӍՅ^J3*+UBƟjGS]4lOO=.46n?{_Щ%fù<ŸUЩ2\_xWOv>Rh>Z h%gbJH="$s .\ZΞ x?:Dv} R4!s[ÝTr>ҿPhJq4_GTw5gQ jgkw&e2eİDv7lmj2}fX֋ùP|-hy^_H1dO^o/Ag}+c6׿G逳=ͶwWO6TQ\_]B%7O=j֥TrjNH%ħ^1 ySIH,R͒C"w+^5rB_16 ν6 =4Oޝ:/L*l]?PtG@_jL SEu'Ͱr/>3-cv])xsL5dCƠEyBj~P\Ri'x5WGr%)ViT+W< ռT"@}B̗s'WS)1x%>2>.<{m{žmWdӆa-0|>ϖM͵9igৢym~QIx4v>+ 5!!QܹJe![\u~㭰67UPmnOkN^X][H9ph|po rݼC4|wBE*lt {Wk\ڬ7.MrT}J53̋k<[.SA}{86''uqKL1=L˾R/a-O$_gq;[{+Slޝ~.nzo>Vo?M|uL?c3#O\G-?.—)/>],KS7 .O?O)/yVɷAA**u|Q.߯Om|Q.|p4cN\XT@Q??[^tF{rrgo+{7+e(C~^"?d9, (C,e2 O bϽ 7uk.Wq3u}rob ʷ.aFO1"}W9(yye-ƫpW[RqewjDŽ 㯊#'_gcwU"huQ>xYo Z=q{R\Y]/zOģ~IW߻$[/BUKCբb!z=f_ycN\ďm_|sÝٲܺ'-y>)׿{cry;^W|Jʌ{'W|B>[K(C,Es^"?u32Qt^- ?go02M/_2=oZ`}A5\s3ޞs/ߟ{񢷜_ /|K6/^+SWwc?{iCT~uXo}Yc:(vo}2Wgy~k;_ʯ7/G{zOKWK3qW^S+ԟ~ݧ}z? 1KOV_?)9tx2E7eo?1'.կ[Yb~A:3pzOyՙ|SbGE|uiu*KX8ưH&,7X^5-m eKvVjOueۅ6ݠ%Ŝ塳#ų[qx5ȹ>ܦۋG@6m;RI?85Q$rEUV;Ws`?xA_{Ү:-ʹ럇'3=|__ W >U"zJ'?LXH-{]nzK#]^F]ę* j1\ b, ¶0b;ri߹!mȊbSA;710L sTVZEi9m/yU$P#+O\ۍrX4̵;d6ٶzhgVLrhD_ҷߤJqٺA^zSg dZE9}T`q+2:m/+5W^ʸCZ|",:'~`XA0~ 'h ?Ws*dE{|}6?Ug%y` - 講X+kd*MʛɕF{b1]Ql{ʬC=**I8Bٱv0_srX"وQRtnB|S-}?~IwK aCʔ׏TY,sGk HEyWEU=v:9efl%MѥͰGC<$Xe'Ub//[I,ڊH$q÷ !:w9_3Q˱mEc[Wj 2 cvTUgg|̈́FU EmVA8Bs~Ydg#(`]뷼(p¡BԜd8^&&2wHusb{#-欻| ֙st G-IheIkXO\+Qv݈~*>BPev{8Da >ubhƃo-&ECU?.wW>ؐo$L&loe)ǘ[[J=u?M\O{%y|LQxڏk,~ Jܥ«d #~YI1>E4ฤ5q]AN2rtXoE}gG-wvt'.j+JcÄ%]眴=lVQJ>LobpN9tm\oI`,fp>+q#dԼgM8X3'S!Dq+B fJYhdOT)srdgvޞ߮KmE`#Sޏo/ Ly7('v+RL3!_xaGwW@(*OG+/G Ixanbljn Xg%'ɋtkGRY_'%' \%U}Q<4_:AO,$p'3qw} /#I#c1򲓥CH)1޷6[8 @WM뷼E4NOɆٞPU*5t#·glKi?R2BQPrQ1'2J+ԻV*^K-);md]|Pҭ?UbNh7' t8%4FRU uBo7?FqM"W1A`rNp8=UthPa/)J؎-|<)Qeht$ZN*ըkp'VLuDDU-07}b:c.Tj^jRC1ۏoǎ9 "ks`n|;u #g˹+ˍ/kDx.[\VDKҪD| 맢uNln%U%{C Atx突t)S[YBZI GaIDmΎt~V'Tz{b{5hʹ%{ }#^ 8l]r dn(ʿͻflIHX h: ¸0R<d]ZyT De'UxB%VxCK]{UЖo;?ٝܔHJYwQ#wOAtyna\AמK5k|nr`Ka; TΈdɓƍ .kW.R K]SsXlkڱSo*.7co^DvSjpv@k)fY*WIn:'n%=[3| 8MofMXT?ir:nw}/un?3oK±lwu zeWeZIҋdOU.83Zp.3eI}{m'7lɒ1EЊҸo2)V:cQ2KČy1A`;ְ&,-*rr"6 =m8/e鲓 =ۮ/㸾d$CtRx[8% Ǔ' QFCѹ6sw_6#cewlޅ!.mYҥ3)VTw91hU C6s,k{B'[dj"lE;FZqX4b`-1Egdn!!xTӦB5@^{.XZ d\ăj{jZMu05'$ꋦ,]P,`GcmzBPS.NLKg]4bk{~zFĖã ͬ״ϴ] &A6i3K~y{"n$76~l)]՝~PJm;1tuLJ> 4EX*zp](S_sN|sr_$R$%ZŰ|,Zh({INn)Fn,ȋ^R UZ粱hM]ӷ9QԹ?`~l$)Bd%gͧ^5FI[?U~va*#x Ap!0 7LZYjJ&jZ+I ׽ޞ4Z8R%[lzR [5qiP/18Σ,ʜ ~|հ#񻙍r߇W4Q['I8=wf%kq9)bc/=xb.cbx Pbjդ̭Z'sh"f@ vE)pɑꘋ$Mhʻ"^;Z ֙$>c4G\//\ ,4Qו[zϬOAӧURp42=_I B8GW)[O;載F2%j A Î@X'zx#DJ[N$0Ҷ׹Y&|Ajϖ@s"|;onC'"=^ѐ[9Npc# ʥbҬ<"pyvKhc{p컶|#`wb-g{9`e `0jqQ{vrX+U^JĿrlC墍x\ `+$b^0u#J䏴78Ҧ8Y~ڲ u˳Hű%{"bM.9;<Ӂ?3/ ߒ_WNӼڷN-O4(EDxnFğ "8 `0ެXS09oE6%qR#1x!K-h) $'K.x*Tb{% -/y>%MK8 N&xZFw~/-1_55KT%ۈbuX7rECYy5_"A0 ] x̪2O4h]o)n:?+J6ruHrtǿۑUƲ[[Rz4qֶMcUSNzx!K;O3DKyҠS2O|F_۞[ Z?o. EKg 6M lTX'j1|Ő5Ҡs'TlDKm0K۲c{K%ܹpfkqM@e%S'ۚHԭ|U^f;b5=%s f\:V*t5ڒD77._ǺFzDQ4ZA bvblDXarMӢIJ[_*efKB\'[s%F:_LX&;ƭ6]|9?!D\>vz~M-K*,1qJ:A֚#%itH*FYפM1{1t*MZDI$1MLm.?`]'I_'*g/ ,l"Z5%'j\Bs_sq$tQ~=_Dߕdʐ Rt."1x@ C'f괁.g`2v֣,ZŪQÃ(> VsB 6%Txl=0Z꒘d2!7s %r]̚ޫRX DXCpF8^NHnMG+6(p}6{^YG 6%:bE5{R82ݷF=g$wv]{(Vy@|'HlC%c.?{ZVIAs>M0N D!pb.qjN⚰n4%nD3﷣sT98=6II!q$k'2<#?*Obx(&W/X Ztu_a3߷/\mq,(.ޓi Q^BszS2LdN%f̹'Fx{YOϟ[X xl,ՔkV S{Bl(fUKNv_+`),9'rFX4ƶ[ Dz7nwrqqgC'7l_VQRt~¾=|J!ucQ8+lw-'A4DḧGo Ɵ=Q/К`!<*+qM, p<|O05_u$!Ű*[-*bjtĒDrw%_=K:\mc_:hv T漄 aJ3n_ rɈpŵfĵC/rs=U@ukCҳ .#Ie?6]faO1XIOJv[>[d8MTi3u}IrtR\;w-Pv06  ^5Ep~ijXz%,F"S9[-IoSexz '=mX  :آ߳k|kVʹh^[` Ec v0[}H'&EږMyóV*0vlV$ٱf{K7h,'\7D*>׸Nˋ%6 y~[v\NvqU^rh'Z =eLĖ8Mq$vs*Sֺ6qt-WFV\<-;kzc7iT07#*,O~*r( Z~YS+e`e cA#vG&,*zo\_DkEVD5Qm\Y̋bz,y!(Z, Ih|>Z;g͚HvŴV2 v]*p1G-9h~F|{8kqQK6ElSU*UI[V"iv8XT߱fnLWSdO4(sfbPe+"CN4KgpIi!+;ϟ-ܖʷa=n "lGEK:?-?s61S真;{C/S>2XK2Z.=f/ϽHt@|ty9<;;{痍KiXS:U`;,F Iƣ )▫@8v^5ʜdf,jbh#ζXѹ"`ǰ!TyTRqbcnnΟs#s+0rgn9.6S·*7!`w CvޖÇjIїNT[cVy$'Y "2u'XtH%MviANxskevr]*C8?s"]W/%]RfXs.J~H<[1͚q[TWnc/]Kͽ[?мaG-CF,[Rp( ;U=m1_UQp!a9$SC\IL/UiyzAN8WMɦyDpcz{;i-|zzH*xZc(y\'#{c%V=Z{T'۲vӢ$6~@&(үKX-쐅j]ˡ`Dǚ}x4#F[mVdW߯wS)N65QeEF}.LvpW*[ m`X X  A#`|kVȆrFR5JxR{@dľptɋOi*tS22QsNT$`QvY–%-;7q?RA4wXÒIkKL[ݑ)Srli[~Qeϥ:xIUcj2u$GyhoT]< Jr]XS@y˩`@wlmOBXfTkH YΔS*'4C>5lדUhT-$Z+7'F0?$ + -a l^CךsiqR6sGJ(ђ_?ޚK7,=f"ktut2Fl ב52)H7brESد5ey(@ย\{lGXFT?ijl532|ƪPM5+ jbb@S>ʀ\sXbxɆ-VmaK)hNqf IzU.OV0'ۇ 4e,ҍH&ݖf*gZ 2V- jenTޤoߒs]Ӷ?XO~̺MI=q8h*m3{B6Dpef)N"\(f,SoOokU|%zH@H9|p7EC[q ]$/,B`Mr[SdUmY?48)UCtBqFs|94t(| 8Im:+,}RXJo;+'B!.EZ S3'"pD/TT Tf?qy_+0NuEײgYQړK~nȉ{.?)`ɣ4?E# q7ĶeP3T.7*3mFۓ1&"_m<9C^_[ QQܻBQ<r|N`<@%Ysǚm=|lX^4{SOhp DP3)T%Ljoj2d4CP 2?F[Z*{IFiE-]_tXBf[E{ߥx%QӶ]{;sұ3[zdwua%WIX;C8wMiiu%]iSx,)'}Rׯ.nq`I6NBc:9iz4Q&z[^Y43Q2Tˍ~Xu.W=HPv }v5JUQl3}hY[njժ[9)luHQ= ڗX.Jȍj փn_U(J'0qno`̠WhKF~fܵRJAىu8! AE3ezl\[%uNDUcdwUb/%4jKS]PՉVͧL\mI[o)|zûcraio9<6,)n2µ΍cyF^ɷ`_{tC`Km%]G%.ЅM=k9<<;,xOH>9lc&Qu. MA#BӠhx|f򢢷W\pvK^UTʌcRi k"{؛*65BXZNleT@jbI1(>|6yKwʋ^z|vLo ~rVRXHhT/ie)OJR~PhZ1 cw(\Yβ<&:.S;{$:hf':i嶤q{k㯋 {G~w6{kzcB*WҮ5Ѝp{Xg89['yd'`l@,Mm=|f3iPO͞ ;O\\M~UӲ'ʱ) 6z)947rm(Ej({\yQ -u#M!R3Mkh~En|p|4^JZJmi ZjMSی"(=մ[ڣpiXh_v#Uο'k5Đ\kJa%_vQqx WM.T5`|@MOɹ:|'ڙZzJT7l,PȎ0gEX6L%Bk.ؘbq+Yt|fg%kUy.N+nM%8I{,͇ m@<ح۩M#OxF Zڮ4}z*'עx%ISI71`jp; dugs_wKk~} $%3q1FMcͶ>O%@+Nug{dOobzvy+c avbMm<e%K_iXft}ny[T[:KLsi~k-f؉uL5sJzzo*+ Xrں_32[IbF{\R%S~j!xo?&>4w>c\Ag8I䟶"hr^T45\|ٱdmea<@3T';fz")mƶ3fhIn, G;(X p4(GX^e_brp_aXS?_f(h:fS" F\Vث<=l^s5WN"-cHf[s睶]*boDFmQXLg}2Rյc/Ӟ6=s7[,}'gIJp(6OFTAt,Jd{xUaD{Ssc(qj4QƙEzwvq<ǖo^uC%)?w(۾o"OiP& mQH)٩@X5v$ vC*ڶGemزi*v|-ǐG8I5,_K0JKLl;/d_ps1itR9n--Qԫ??"ar%aN4],uwm5H#tA 8vj?q^+Gv"5_,q̚Ȱ48uDŽW%CNt{W@Xl\GkpҠ?b>/|l ׅzw,9:aǙ%J>uV1m(&/wyaZ<_Bj*I}G56}nXU (HOM}ry ?d,*;zmfun{.s}85kw6DBդU KFN-iYl.?WRBs^6{?Co pQ&dzҠ쉢ßeO>u{YӦhn8P{G g ^Mhڶ2sb18.ze3+ֳn҅ub(Ƞ F*h*ZbdTp-Ur\fIz-DCX>EؗF{sW%{ɘt"S'ՠ[s5^ن,@wc=s~};k TﶷjF/i  'd 8׵7*xqcm)IN4 JN'{aJ#կ*2U"w- /'3E mby-o OZq?Fܙ-[՗:JV:l?l3͉;߮-絊yaH2[K"g~{NL (-p~2!}}vlV/ՆKSzU_7trMH8~6X "iMx3G`{lU>PA8IcfyV{/[VS5|h5u&wG(yyɼ貟hlIƾc QZ>s8_Je`XR%¾F# x[pl^9-*}//%}=],ˉ0uf.4C·#a5NiALhƪ"s;4EIug%4AZJ;T<:r-Bt?7k؋Xt\:M[oiOX #4 ?Ӡ`E|w e~۷U G_TրS[!|-TBqȗ\F*+ak`G(qC.ia!/R5\`9`KH: go2d=0Rm^-5kJ{mFsԻmh? áԉ޾W\qu(UIȤHn{0n%>Jt[xEC!|A8h:nޅyv$'zk$%t >?',jV|cO_7&$jDk[ds胑@XkUshӝ'ec_JTn%缵Z1 gbU _(GE-{b:4=W6;[Z eɄ?/BhIgq]i#Z;2Ѯ>PGSw9PI.ݿH\WFsQU)Sj]=VS\8ThۻK8׾S. 82w?G\C`PaKXyvqDϯwXSajN?:$'XҘ%mhjl.Z~3 [ɒF;ϙ^Qūx_+;IyaY۹+{x]rJ O:*״ ƕ +;z@l4}NN:Ir:iKx2kkU~W>oy?W3CMf~J5wkgIDz&D7vgO|ʆoG=#=iWe~o:/Ͼ-Tw䉃OOPn{u\ġ'x@ e}!|4OAړì=_@1avDLuPeJI@ M=w0hQ(YۍO2ZY45}T m儿BpwA]*qFz농H_1[j/l?٣s{9ߴQ3w[Y7sc}(@iſן\$źNrO"މ?̒^8J1Q'NYHal-;o+_ҍے= d}5ﻸsٽ4`ٲk8û\_Nov̼М:1*At!nO(%bKq0_qyoc 9Yј 97bm=PŇxzaЊdu%%A ['^a4gh3e$O]`>=n6=ϖgОJba|@_AhdT"Otohq82T49/g;MvNz8PqO|(pZ7w~x [~o:&$C,;[x̉hl.p$eY W-Uc=}\P#lqVEF`N"Se|cx3[Iiu$8S1߂ 6"|8bR}Xg/Z>m["X֑v5}WOp2c?}?-K%FDv +sQP4wz1NBrgӲQ-'5^}ʌľU?{SEJT^Eg(ۄ ▋z7]WA|/{ڭl˅sr^-h~pDp8Q\sޠns}uDkwuT,)> 7z4 \_-%d*lnDxJ17=Nj8Փh_I.iDwwR2e?l/\cԒ>m˯3 xۉbj@l[_iİÞGcW$Zr}F*uZ[}vʋvf ONx8:.C_E|+ϸ4KNd7OH}Vǩ~Y$'8VFFcs;NJm="s%p( ǝd=O Lab1:*Ӯ mAt$<; F Z<9~mD$#bBDC$rQ*Nvإ%jޥwFO'⹩&5+fo(24]{v}p. #\Cq}m4T<~ .ei4(@=r,<=W^0la'Oq RyI/UO\x,*FSzQsVTv:VGvBo/tMNLvkI拥`C9z=}z/錶R9 GEqkjD;y;U2-UV6kA*jQ[uAJP]ξrF'w?JKlv 5c g0XXӷ ֖U-i_hJĶ.`_mNQViȪ3u)Eɡ0`@_!<Eo6QN ?SmTb,YE( ӷk"z*+~ܪ|P-LKR+845l:fow`9<=Sv*K-#L;vF N,>Hjg{ڏ}F~-H mv% rׅK+Xo˚)7m2:iFϣ.L>9Ǿ^D筻!#r^` B೦FQڷ\hz]ΩWGEa)S+e+Ho2m%ݐ6[%?b4϶Mp`+SڈUw6:x~4[é;򺟑JP%g1ZKzg[=;.WY89||x;^Nxmm]ڔ;OS(yˋeznrB //KS<<܎5>;Fh}XA5b<{kAff~NF\y·oUoX!Gr7we4>tr?#g6чG};f֏n#w]?'F"OӃ߽_~sbR[+㋈y{\4붬N7-_mqs[MJtSmtoXܶ /Uv@{7Os7%{]_}c?}L.7t?ec}?n)#^IAO|VO4t畷ɍ^]6ŝW"W7lWo>vy~M7ӷ/5_\՝ͦK-egl &6?_ߟ*rnk~Z;'u oKu<?\ _uɒRw? ?_m]7n?nasu}_O [wBu/j9(3Eqk}ʥϧ[_pJ[o>%uǷ>~|~~9b7JҿO~ᩑs?B> m^xZۖW~Ǯ?miƎ\.?lg??X]>S,__;ۖGw3geT>ߟ7%ݴwuo,Qԗ1Sտ{|mP_識Yv?ok׳ÉA+?^~6+~w]iXLυ=-)RӲ4y_-g!`YM}l餯F\x잇2qv*랺l"mQ;qWC0/B^è.G=PY?mĢNS~ŀOo/)@|omtmgaOo@7<FJxwkύwd:Ы7 8~z{oA?0Uz۽WK𛻷'eW_~^w]󽨅.Nn44?Vo$_-cG> |}nNNLc |7 *k}@Uum~WFm_Q¸NJK7_xoX}x|T : RDo1^_}n濺ڦI}*Wr7fwe ɤ?u}-Joz|י՟u2E_v77k8ՕօWx[oU}O4:)S~ o{8Fnu<Uoujz}Ow#Qax7*7ē*WLtG?>o2H'w:o_\{2 UDPxiUwUo"ȉ}W'+W ^aeAʔ†-PfP-hzWni> KCt9rͣ7fZ=w>{y;^'/;u+>Z0˜)Y̙2Ϛhܵ~́LeYƽ`M[ާ4ˬz\[& m,fZYfe'e~~fUtG2^-;qO>n2u$Nmcm'3<ク-f®әT^/u2WeCfʫ;nopz՟hxYo߰2pRmNxAl۟5Sw3[v&8qyWȶi:Cnx컵hUק6_0,S 䒇+p֞0EKe{{c< g |u*4Vwdc;PGT!xΛ >yŲg]~7ʥoxPfݶy9h5bxz+3z¶FޠQDwZ`e޵$RD~;`%C 㕿:u(|k?K`堢gܙY.FskypXTsr;>{?]X(SQ]-)?~lyH6<~񍁍 gmj[ȁ'k9쾫]ǎ=X/춺/Ժ,Y}6tZw>cF`ڇ[;Gcc!܃fk{Zy穲e玑,'}H>s͘ml{&,=DpeпIľXq[1מ3̈́GO\%dfZY=f$>-ؘZpayǏʏ's$pGɡЁCՓ2vjFjU%&dwϘ\;}D6?&{Gj@Z9ܳ;1fJ&M˪ CA}uRUTLLOcmwVbsrw:?cQj1jz7K>^~r_or˅e|fbC$|k?K'_o8Gvf{_{a>⠢5ﻸ#m׻ߐQl췽؟q췽\>Gzo_o]ˌ%f{ J?wң5|ӎ-^۫cS` '}H ¦؞2NXn 7(z9m/+ ҷسS1>4c=Q>-߸['g-*?r2*n~3ja:g;~(O>xڭs2ccw=,{}DJ~m=q4qk4=Xzꍫ[ *9i]Q~'>Qc$Fbc:aj2,-*@>ȡ&7 j`O3:tF=qӛ(荋OduOKa1w @ėO䞯V,BFl;䏅.}LJx·2}2=g!K7v4D^|z>Q|϶G/!#=X8g׳?woo?zyorEǧsbso|B2z=qMutg/}dذ{ާ~^}7Ra@Lm=yߣјKʼnxjO3N8zTlGÅi=D#N:~ G>(߻l$?*oܨ6:[?@DRĩ7N'rc\ƑQܳo}rԞef:jGE~^SEEwSpo35{bfJ u,vlXZåJ/VMT2&7=UqԃOTL:ݏdG̨ODQZ'8'?‚Ӿ=KE`#O QGls5;~$&B1[}}fظX>r/ w}:~/IlcT?N*>Zptaˋ􅖳Š-cP'e Y(-G:ey>!s{?D܃~\ӳ? o:ncږ5~n>8:NPnh{VTeoXn F[?&}Hqn49~SÄlխuc\3VA{T8wOkTwlC#!'WO%*O Mm2*|P!+k8*RmMh4w"pru6Fʾ^Y}4r= !CmQݣȊ:Yػ?QJ>bgQݹ 7Zv.J[9_`y!89֨xM?4q_pWe=炗 *DT64?/8߾Dm#;g?®Qw\xmPF}!y}hi4BA_5GՖwO\ "ϰx!Jq{6 ,>dM7{އ{}^+>q_iE؆Ƿ~}o7Z]dRCq5W1ھߕ឵4X89i̝nUZI:kI+ycDF_7F6:{S46gTG7~6T רaF|lSuJ)]`qy*J"m|u.GA}=)k6֟Ug2b`,5fl.>}˷QݷOpo?'}n0:u(ʼn>i}&7!}}:|F#)x6oE(mG3`kA>%8ާ)Yz%~ az"r ~d?E#|[j#n?\ 3|/'>jz{ސ rw}}ECAo?U?8~bT D` *4܃4߃{?n&=P|U g-L- '}(a{MV',.‚ *7R {~7hSM t,ՎSyyAo=z?}oLPF唆#gԿq9>߸[. '7NixlwGbx}߿긊Y{n@Ñs0Umm}Ua;^|iO`/}6jcɡp'@Grozm*(}O)Eu_p\_#$|k<>=I=Ҡ"):1ӏq~Bc<>{{E<в/C{XOxӑ&l?ߝ{DuC|:#N,N9\ݾ̳m4m *7VZB)kQs2ǩRf\|ðhbk釞Ӭ蘛ް^TSšKB簗JP;񽯉̮8\첔)'GEwUSA=2t˯~A7U#~-6z"#=PG鿆3<,>=z^<{3}aߘY+Ћ])zЄEnjF@6ӽ遠d1K.Ax)xt\5Q|\gI>p oY~F&q09cO)"T8ApUk^ߙM ) !,N.`aQ{TVMةb`4r~໳::wxWyɭ<f:SG'$ }ȇ{Bv]G5;~¹6_3ƴM6G'#,( K 8hǰh3bG9e pǺ~!(Ix?2z@52? /tQEgկVT^[ʓ_T);jg{P$Js!1-x<{P,|t{A}{z>bpއb={*zH}˴;S_O~NL>A -G71to&@(È2Wxb^PAsX:.lP"пq eԿq1Fz'kr){`iQ:5⺉E-BШQ9?5T)J $`J#K0Q>3^^x_T-',?:~$īS )Iu2DԖhJkl.ď"w1sÏQPX)ǖw}: }8;,=\vkEvr,S( pHX(PvղXXk& l9m"/{E4R|;_C2rއ#*nO3YȤQ7!Kх-/rYNC8.:̏8-J uqϙMk_F4 YrC)Ç@5|EEwO9X D>Tc8 EDn8t)Wd>_KΏ/^Ѿ/a&I^£9vG?Q:uTȣ-]L\4="EO4 rs<ƦwwuL_]xEFIG~jd0Ԩƞߵ~ڗIL4RGOϥ}܇]ɭQpX ~/['Xfa!f7NeM}ˋ1H=Go'V$PJCTQGT_X|U}&& ~J~ho"iPZ<1qX~-48~:A͝A[IjRiL# ul(WG&httxϫ#1\#\s 8͓ d_=B* X:ġHG~U!Ή/qݣ]+>`8z:ez~ֿ?H"|e=!cwt X6 }|{7In)ȭ}g#s:c'w`a8}#[7.^T574U?gKҽvK7$R: -HQF8yNR?4C oOlu'kgX:T$Rh J*` *z"9[hNO>x2A~hķ/ʷq:UXsUOĵ,:62O^_<٢֭~͔'doVj'WGL} Ac}_lF0Y?~ԴEQlKCN =P۳xx*>GaFY#ts˳Q1X+o-$O,'}ho9/ƅK'u`(݇tBSa| BVQw/1&6n} 7drgœ߸ ]~hG)sY>N\E:>la3xNP_C鍽s/>~R-oP\H,-GNoܨԣǖN4e\leli ,>*<Gn+ *57q=}f6u*V$処\DٞXXdor PpI*_4͉䎅~MۚBk#}VsHߢm .:*|pC _uF{h""~tWב)Yx_4 M|/w)߽躡>`Nr}.h*,^ {}d<?GP= wSS}m_t^V=蹽CYo<;w{Fmٹ;* b׳P~$]|pgr/z Y[ 0+ }HS}IۈIߠQb1cO>5zkꇮxdC(cʯ݌7w:Ehڞ?z6M]I1vlfP}WI&|⮇sK܍дꇊV? *Ϟ2_LR_zXl4;۳rx~e#Z[_\S'iSZֱUX8vxubx5z"k#j=Cש}˸H踠u,Bk=&*=_ܷsK:N4Tiv'b&Otl%)&VT-hhݷ4騚.5c 8 ޗZwшGCb ktnz(4B rK_^M2#q9JC/F}<[_{:ܔ*| #č(?X:t>?4z_X QPt>W_H9'뾏:Kc_xD)0:{VI폙a!֟GZCǕFEuba1؊5 '|{-,5gt# ۳y*{uE|EnEMv); _VT*tNYlHXeVhi2z8M9c{ =q۟EL*:)24gco21#j*[z8'~/c KP$~={DYtńG:F㌉#Oh*AGIevزr߇T6"ZIeH]mfץCfIQO͸"q$ Qo~0bF)P6 -~/p|3L{o{᳧lB(XO@| -4 {jHɡu? 7YPz k-DÒTXlJ-ps')49Pi8̈́ l^Vep|!?*Dypf{ yO,trnr.NOU??r'Չr@En a9t@Ӛh9F|%g**l\+7]pcwpf,b Bo|{$uw4+*pys{lnPX^_> @4ɓ#K0*8ZGn۳lc(nOn=4)[d L|_8s?`Xq0hڕ:~G*tn04mDM`pe}ڧ*V/7:jQ5=JoBu| c0 X c80 X c80 X c80 X c80 X c80 X c80 X c80 X c80 X c80 X c80 X c80 X c80 X c80 X c80 X c80 X c80 X c80 X c80 X c80 X c80 X c80 XfIENDB`cli-3.2.4/extras/000077500000000000000000000000001471121002400135655ustar00rootroot00000000000000cli-3.2.4/extras/httpie-completion.bash000066400000000000000000000013511471121002400200700ustar00rootroot00000000000000_http_complete() { local cur_word=${COMP_WORDS[COMP_CWORD]} local prev_word=${COMP_WORDS[COMP_CWORD - 1]} if [[ "$cur_word" == -* ]]; then _http_complete_options "$cur_word" fi } complete -o default -F _http_complete http httpie.http httpie.https https _http_complete_options() { local cur_word=$1 local options="-j --json -f --form --pretty -s --style -p --print -v --verbose -h --headers -b --body -S --stream -o --output -d --download -c --continue --session --session-read-only -a --auth --auth-type --proxy --follow --verify --cert --cert-key --timeout --check-status --ignore-stdin --help --version --traceback --debug --raw" COMPREPLY=( $( compgen -W "$options" -- "$cur_word" ) ) } cli-3.2.4/extras/httpie-completion.fish000066400000000000000000000145361471121002400201150ustar00rootroot00000000000000function __fish_httpie_styles printf '%s\n' abap algol algol_nu arduino auto autumn borland bw colorful default emacs friendly fruity gruvbox-dark gruvbox-light igor inkpot lovelace manni material monokai murphy native paraiso-dark paraiso-light pastie perldoc pie pie-dark pie-light rainbow_dash rrt sas solarized solarized-dark solarized-light stata stata-dark stata-light tango trac vim vs xcode zenburn end function __fish_httpie_mime_types test -r /usr/share/mime/types && cat /usr/share/mime/types end function __fish_httpie_print_args set -l arg (commandline -t) string match -qe H "$arg" || echo -e $arg"H\trequest headers" string match -qe B "$arg" || echo -e $arg"B\trequest body" string match -qe h "$arg" || echo -e $arg"h\tresponse headers" string match -qe b "$arg" || echo -e $arg"b\tresponse body" string match -qe m "$arg" || echo -e $arg"m\tresponse metadata" end function __fish_httpie_auth_types echo -e "basic\tBasic HTTP auth" echo -e "digest\tDigest HTTP auth" echo -e "bearer\tBearer HTTP Auth" end function __fish_http_verify_options echo -e "yes\tEnable cert verification" echo -e "no\tDisable cert verification" end # Predefined Content Types complete -c http -s j -l json -d 'Data items are serialized as a JSON object' complete -c http -s f -l form -d 'Data items are serialized as form fields' complete -c http -l multipart -d 'Always sends a multipart/form-data request' complete -c http -l boundary -x -d 'Custom boundary string for multipart/form-data requests' complete -c http -l raw -x -d 'Pass raw request data without extra processing' # Content Processing Options complete -c http -s x -l compress -d 'Content compressed with Deflate algorithm' # Output Processing complete -c http -l pretty -xa "all colors format none" -d 'Controls output processing' complete -c http -s s -l style -xa "(__fish_httpie_styles)" -d 'Output coloring style' complete -c http -l unsorted -d 'Disables all sorting while formatting output' complete -c http -l sorted -d 'Re-enables all sorting options while formatting output' complete -c http -l response-charset -x -d 'Override the response encoding' complete -c http -l response-mime -xa "(__fish_httpie_mime_types)" -d 'Override the response mime type for coloring and formatting' complete -c http -l format-options -x -d 'Controls output formatting' # Output Options complete -c http -s p -l print -xa "(__fish_httpie_print_args)" -d 'String specifying what the output should contain' complete -c http -s h -l headers -d 'Print only the response headers' complete -c http -s m -l meta -d 'Print only the response metadata' complete -c http -s b -l body -d 'Print only the response body' complete -c http -s v -l verbose -d 'Print the whole request as well as the response' complete -c http -l all -d 'Show any intermediary requests/responses' complete -c http -s S -l stream -d 'Always stream the response body by line' complete -c http -s o -l output -F -d 'Save output to FILE' complete -c http -s d -l download -d 'Download a file' complete -c http -s c -l continue -d 'Resume an interrupted download' complete -c http -s q -l quiet -d 'Do not print to stdout or stderr' # Sessions complete -c http -l session -F -d 'Create, or reuse and update a session' complete -c http -l session-read-only -F -d 'Create or read a session without updating it' # Authentication complete -c http -s a -l auth -x -d 'Username and password for authentication' complete -c http -s A -l auth-type -xa "(__fish_httpie_auth_types)" -d 'The authentication mechanism to be used' complete -c http -l ignore-netrc -d 'Ignore credentials from .netrc' # Network complete -c http -l offline -d 'Build the request and print it but don\'t actually send it' complete -c http -l proxy -x -d 'String mapping protocol to the URL of the proxy' complete -c http -s F -l follow -d 'Follow 30x Location redirects' complete -c http -l max-redirects -x -d 'Set maximum number of redirects' complete -c http -l max-headers -x -d 'Maximum number of response headers to be read before giving up' complete -c http -l timeout -x -d 'Connection timeout in seconds' complete -c http -l check-status -d 'Error with non-200 HTTP status code' complete -c http -l path-as-is -d 'Bypass dot segment URL squashing' complete -c http -l chunked -d 'Enable streaming via chunked transfer encoding' # SSL complete -c http -l verify -xa "(__fish_http_verify_options)" -d 'Enable/disable cert verification' complete -c http -l ssl -x -d 'Desired protocol version to use' complete -c http -l ciphers -x -d 'String in the OpenSSL cipher list format' complete -c http -l cert -F -d 'Client side SSL certificate' complete -c http -l cert-key -F -d 'Private key to use with SSL' complete -c http -l cert-key-pass -x -d 'Passphrase for the given private key' # Troubleshooting complete -c http -s I -l ignore-stdin -d 'Do not attempt to read stdin' complete -c http -l help -d 'Show help' complete -c http -l manual -d 'Show the full manual' complete -c http -l version -d 'Show version' complete -c http -l traceback -d 'Prints exception traceback should one occur' complete -c http -l default-scheme -x -d 'The default scheme to use' complete -c http -l debug -d 'Show debugging output' # Alias for https to http function https --wraps http http $argv; end cli-3.2.4/extras/man/000077500000000000000000000000001471121002400143405ustar00rootroot00000000000000cli-3.2.4/extras/man/http.1000066400000000000000000000344731471121002400154140ustar00rootroot00000000000000.\" This file is auto-generated from the parser declaration in httpie/cli/definition.py by extras/scripts/generate_man_pages.py. .TH http 1 "2024-07-10" "HTTPie 3.2.4" "HTTPie Manual" .SH NAME http .SH SYNOPSIS http [METHOD] URL [REQUEST_ITEM ...] .SH DESCRIPTION HTTPie: modern, user-friendly command-line HTTP client for the API era. .SH Positional arguments These arguments come after any flags and in the order they are listed here. Only URL is required. .IP "\fB\,METHOD\/\fR" The HTTP method to be used for the request (GET, POST, PUT, DELETE, ...). This argument can be omitted in which case HTTPie will use POST if there is some data to be sent, otherwise GET: $ http example.org # => GET $ http example.org hello=world # => POST .IP "\fB\,URL\/\fR" The request URL. Scheme defaults to \[aq]http://\[aq] if the URL does not include one. (You can override this with: \fB\,--default-scheme\/\fR=http/https) You can also use a shorthand for localhost $ http :3000 # => http://localhost:3000 $ http :/foo # => http://localhost/foo .IP "\fB\,REQUEST_ITEM\/\fR" Optional key-value pairs to be included in the request. The separator used determines the type: \[aq]:\[aq] HTTP headers: Referer:https://httpie.io Cookie:foo=bar User-Agent:bacon/1.0 \[aq]==\[aq] URL parameters to be appended to the request URI: search==httpie \[aq]=\[aq] Data fields to be serialized into a JSON object (with \fB\,--json\/\fR, \fB\,-j\/\fR) or form data (with \fB\,--form\/\fR, \fB\,-f\/\fR): name=HTTPie language=Python description=\[aq]CLI HTTP client\[aq] \[aq]:=\[aq] Non-string JSON data fields (only with \fB\,--json\/\fR, \fB\,-j\/\fR): awesome:=true amount:=42 colors:=\[aq][\[dq]red\[dq], \[dq]green\[dq], \[dq]blue\[dq]]\[aq] \[aq]@\[aq] Form file fields (only with \fB\,--form\/\fR or \fB\,--multipart\/\fR): cv@\(ti/Documents/CV.pdf cv@\[aq]\(ti/Documents/CV.pdf;type=application/pdf\[aq] \[aq]=@\[aq] A data field like \[aq]=\[aq], but takes a file path and embeds its content: essay=@Documents/essay.txt \[aq]:=@\[aq] A raw JSON field like \[aq]:=\[aq], but takes a file path and embeds its content: package:=@./package.json You can use a backslash to escape a colliding separator in the field name: field-name-with\e:colon=value .PP .SH Predefined content types .IP "\fB\,--json\/\fR, \fB\,-j\/\fR" (default) Data items from the command line are serialized as a JSON object. The Content-Type and Accept headers are set to application/json (if not specified). .IP "\fB\,--form\/\fR, \fB\,-f\/\fR" Data items from the command line are serialized as form fields. The Content-Type is set to application/x-www-form-urlencoded (if not specified). The presence of any file fields results in a multipart/form-data request. .IP "\fB\,--multipart\/\fR" Similar to \fB\,--form\/\fR, but always sends a multipart/form-data request (i.e., even without files). .IP "\fB\,--boundary\/\fR" Specify a custom boundary string for multipart/form-data requests. Only has effect only together with \fB\,--form\/\fR. .IP "\fB\,--raw\/\fR" This option allows you to pass raw request data without extra processing (as opposed to the structured request items syntax): $ http \fB\,--raw\/\fR=\[aq]data\[aq] pie.dev/post You can achieve the same by piping the data via stdin: $ echo data | http pie.dev/post Or have HTTPie load the raw data from a file: $ http pie.dev/post @data.txt .PP .SH Content processing options .IP "\fB\,--compress\/\fR, \fB\,-x\/\fR" Content compressed (encoded) with Deflate algorithm. The Content-Encoding header is set to deflate. Compression is skipped if it appears that compression ratio is negative. Compression can be forced by repeating the argument. .PP .SH Output processing .IP "\fB\,--pretty\/\fR" Controls output processing. The value can be \[dq]none\[dq] to not prettify the output (default for redirected output), \[dq]all\[dq] to apply both colors and formatting (default for terminal output), \[dq]colors\[dq], or \[dq]format\[dq]. .IP "\fB\,--style\/\fR, \fB\,-s\/\fR \fI\,STYLE\/\fR" Output coloring style (default is \[dq]auto\[dq]). It can be one of: auto, pie, pie-dark, pie-light, solarized For finding out all available styles in your system, try: $ http \fB\,--style\/\fR The \[dq]auto\[dq] style follows your terminal\[aq]s ANSI color styles. For non-auto styles to work properly, please make sure that the $TERM environment variable is set to \[dq]xterm-256color\[dq] or similar (e.g., via `export TERM=xterm-256color\[aq] in your \(ti/.bashrc). .IP "\fB\,--unsorted\/\fR" Disables all sorting while formatting output. It is a shortcut for: \fB\,--format-options\/\fR=headers.sort:false,json.sort_keys:false .IP "\fB\,--sorted\/\fR" Re-enables all sorting options while formatting output. It is a shortcut for: \fB\,--format-options\/\fR=headers.sort:true,json.sort_keys:true .IP "\fB\,--response-charset\/\fR \fI\,ENCODING\/\fR" Override the response encoding for terminal display purposes, e.g.: \fB\,--response-charset\/\fR=utf8 \fB\,--response-charset\/\fR=big5 .IP "\fB\,--response-mime\/\fR \fI\,MIME_TYPE\/\fR" Override the response mime type for coloring and formatting for the terminal, e.g.: \fB\,--response-mime\/\fR=application/json \fB\,--response-mime\/\fR=text/xml .IP "\fB\,--format-options\/\fR" Controls output formatting. Only relevant when formatting is enabled through (explicit or implied) \fB\,--pretty\/\fR=all or \fB\,--pretty\/\fR=format. The following are the default options: headers.sort:true json.format:true json.indent:4 json.sort_keys:true xml.format:true xml.indent:2 You may use this option multiple times, as well as specify multiple comma-separated options at the same time. For example, this modifies the settings to disable the sorting of JSON keys, and sets the indent size to 2: \fB\,--format-options\/\fR json.sort_keys:false,json.indent:2 This is something you will typically put into your config file. .PP .SH Output options .IP "\fB\,--print\/\fR, \fB\,-p\/\fR \fI\,WHAT\/\fR" String specifying what the output should contain: \[aq]H\[aq] request headers \[aq]B\[aq] request body \[aq]h\[aq] response headers \[aq]b\[aq] response body \[aq]m\[aq] response metadata The default behaviour is \[aq]hb\[aq] (i.e., the response headers and body is printed), if standard output is not redirected. If the output is piped to another program or to a file, then only the response body is printed by default. .IP "\fB\,--headers\/\fR, \fB\,-h\/\fR" Print only the response headers. Shortcut for \fB\,--print\/\fR=h. .IP "\fB\,--meta\/\fR, \fB\,-m\/\fR" Print only the response metadata. Shortcut for \fB\,--print\/\fR=m. .IP "\fB\,--body\/\fR, \fB\,-b\/\fR" Print only the response body. Shortcut for \fB\,--print\/\fR=b. .IP "\fB\,--verbose\/\fR, \fB\,-v\/\fR" Verbose output. For the level one (with single `\fB\,-v\/\fR`/`\fB\,--verbose\/\fR`), print the whole request as well as the response. Also print any intermediary requests/responses (such as redirects). For the second level and higher, print these as well as the response metadata. Level one is a shortcut for: \fB\,--all\/\fR \fB\,--print\/\fR=BHbh Level two is a shortcut for: \fB\,--all\/\fR \fB\,--print\/\fR=BHbhm .IP "\fB\,--all\/\fR" By default, only the final request/response is shown. Use this flag to show any intermediary requests/responses as well. Intermediary requests include followed redirects (with \fB\,--follow\/\fR), the first unauthorized request when Digest auth is used (\fB\,--auth\/\fR=digest), etc. .IP "\fB\,--stream\/\fR, \fB\,-S\/\fR" Always stream the response body by line, i.e., behave like `tail \fB\,-f\/\fR\[aq]. Without \fB\,--stream\/\fR and with \fB\,--pretty\/\fR (either set or implied), HTTPie fetches the whole response before it outputs the processed data. Set this option when you want to continuously display a prettified long-lived response, such as one from the Twitter streaming API. It is useful also without \fB\,--pretty\/\fR: It ensures that the output is flushed more often and in smaller chunks. .IP "\fB\,--output\/\fR, \fB\,-o\/\fR \fI\,FILE\/\fR" Save output to FILE instead of stdout. If \fB\,--download\/\fR is also set, then only the response body is saved to FILE. Other parts of the HTTP exchange are printed to stderr. .IP "\fB\,--download\/\fR, \fB\,-d\/\fR" Do not print the response body to stdout. Rather, download it and store it in a file. The filename is guessed unless specified with \fB\,--output\/\fR [filename]. This action is similar to the default behaviour of wget. .IP "\fB\,--continue\/\fR, \fB\,-c\/\fR" Resume an interrupted download. Note that the \fB\,--output\/\fR option needs to be specified as well. .IP "\fB\,--quiet\/\fR, \fB\,-q\/\fR" Do not print to stdout or stderr, except for errors and warnings when provided once. Provide twice to suppress warnings as well. stdout is still redirected if \fB\,--output\/\fR is specified. Flag doesn\[aq]t affect behaviour of download beyond not printing to terminal. .PP .SH Sessions .IP "\fB\,--session\/\fR \fI\,SESSION_NAME_OR_PATH\/\fR" Create, or reuse and update a session. Within a session, custom headers, auth credential, as well as any cookies sent by the server persist between requests. Session files are stored in: [HTTPIE_CONFIG_DIR]//.json. See the following page to find out your default HTTPIE_CONFIG_DIR: https://httpie.io/docs/cli/config-file-directory .IP "\fB\,--session-read-only\/\fR \fI\,SESSION_NAME_OR_PATH\/\fR" Create or read a session without updating it form the request/response exchange. .PP .SH Authentication .IP "\fB\,--auth\/\fR, \fB\,-a\/\fR \fI\,USER[:PASS] | TOKEN\/\fR" For username/password based authentication mechanisms (e.g basic auth or digest auth) if only the username is provided (\fB\,-a\/\fR username), HTTPie will prompt for the password. .IP "\fB\,--auth-type\/\fR, \fB\,-A\/\fR" The authentication mechanism to be used. Defaults to \[dq]basic\[dq]. \[dq]basic\[dq]: Basic HTTP auth \[dq]digest\[dq]: Digest HTTP auth \[dq]bearer\[dq]: Bearer HTTP Auth To see all available auth types on your system, including ones installed via plugins, run: $ http \fB\,--auth-type\/\fR .IP "\fB\,--ignore-netrc\/\fR" Ignore credentials from .netrc. .PP .SH Network .IP "\fB\,--offline\/\fR" Build the request and print it but don\(gat actually send it. .IP "\fB\,--proxy\/\fR \fI\,PROTOCOL:PROXY_URL\/\fR" String mapping protocol to the URL of the proxy (e.g. http:http://foo.bar:3128). You can specify multiple proxies with different protocols. The environment variables $ALL_PROXY, $HTTP_PROXY, and $HTTPS_proxy are supported as well. .IP "\fB\,--follow\/\fR, \fB\,-F\/\fR" Follow 30x Location redirects. .IP "\fB\,--max-redirects\/\fR" By default, requests have a limit of 30 redirects (works with \fB\,--follow\/\fR). .IP "\fB\,--max-headers\/\fR" The maximum number of response headers to be read before giving up (default 0, i.e., no limit). .IP "\fB\,--timeout\/\fR \fI\,SECONDS\/\fR" The connection timeout of the request in seconds. The default value is 0, i.e., there is no timeout limit. This is not a time limit on the entire response download; rather, an error is reported if the server has not issued a response for timeout seconds (more precisely, if no bytes have been received on the underlying socket for timeout seconds). .IP "\fB\,--check-status\/\fR" By default, HTTPie exits with 0 when no network or other fatal errors occur. This flag instructs HTTPie to also check the HTTP status code and exit with an error if the status indicates one. When the server replies with a 4xx (Client Error) or 5xx (Server Error) status code, HTTPie exits with 4 or 5 respectively. If the response is a 3xx (Redirect) and \fB\,--follow\/\fR hasn\[aq]t been set, then the exit status is 3. Also an error message is written to stderr if stdout is redirected. .IP "\fB\,--path-as-is\/\fR" Bypass dot segment (/../ or /./) URL squashing. .IP "\fB\,--chunked\/\fR" Enable streaming via chunked transfer encoding. The Transfer-Encoding header is set to chunked. .PP .SH SSL .IP "\fB\,--verify\/\fR" Set to \[dq]no\[dq] (or \[dq]false\[dq]) to skip checking the host\[aq]s SSL certificate. Defaults to \[dq]yes\[dq] (\[dq]true\[dq]). You can also pass the path to a CA_BUNDLE file for private certs. (Or you can set the REQUESTS_CA_BUNDLE environment variable instead.) .IP "\fB\,--ssl\/\fR" The desired protocol version to use. This will default to SSL v2.3 which will negotiate the highest protocol that both the server and your installation of OpenSSL support. Available protocols may vary depending on OpenSSL installation (only the supported ones are shown here). .IP "\fB\,--ciphers\/\fR" A string in the OpenSSL cipher list format. See `http \fB\,--help\/\fR` for the default ciphers list on you system. .IP "\fB\,--cert\/\fR" You can specify a local cert to use as client side SSL certificate. This file may either contain both private key and certificate or you may specify \fB\,--cert-key\/\fR separately. .IP "\fB\,--cert-key\/\fR" The private key to use with SSL. Only needed if \fB\,--cert\/\fR is given and the certificate file does not contain the private key. .IP "\fB\,--cert-key-pass\/\fR" The passphrase to be used to with the given private key. Only needed if \fB\,--cert-key\/\fR is given and the key file requires a passphrase. If not provided, you\(gall be prompted interactively. .PP .SH Troubleshooting .IP "\fB\,--ignore-stdin\/\fR, \fB\,-I\/\fR" Do not attempt to read stdin .IP "\fB\,--help\/\fR" Show this help message and exit. .IP "\fB\,--manual\/\fR" Show the full manual. .IP "\fB\,--version\/\fR" Show version and exit. .IP "\fB\,--traceback\/\fR" Prints the exception traceback should one occur. .IP "\fB\,--default-scheme\/\fR" The default scheme to use if not specified in the URL. .IP "\fB\,--debug\/\fR" Prints the exception traceback should one occur, as well as other information useful for debugging HTTPie itself and for reporting bugs. .PP .SH SEE ALSO For every \fB\,--OPTION\/\fR there is also a \fB\,--no-OPTION\/\fR that reverts OPTION to its default value. Suggestions and bug reports are greatly appreciated: https://github.com/httpie/cli/issuescli-3.2.4/extras/man/httpie.1000066400000000000000000000044601471121002400157230ustar00rootroot00000000000000.\" This file is auto-generated from the parser declaration in httpie/manager/cli.py by extras/scripts/generate_man_pages.py. .TH httpie 1 "2024-07-10" "HTTPie 3.2.4" "HTTPie Manual" .SH NAME httpie .SH SYNOPSIS httpie .SH DESCRIPTION Managing interface for the HTTPie itself. Be aware that you might be looking for http/https commands for sending HTTP requests. This command is only available for managing the HTTTPie plugins and the configuration around it. If you are looking for the man pages of http/https commands, try one of the following: $ man http $ man https .SH httpie cli export-args Export available options for the CLI .IP "\fB\,-f\/\fR, \fB\,--format\/\fR" Format to export in. .PP .SH httpie cli check-updates Check for updates .PP .SH httpie cli sessions upgrade Upgrade the given HTTPie session with the latest layout. A list of changes between different session versions can be found in the official documentation. .IP "\fB\,HOSTNAME\/\fR" The host this session belongs. .IP "\fB\,SESSION_NAME_OR_PATH\/\fR" The name or the path for the session that will be upgraded. .IP "\fB\,--bind-cookies\/\fR" Bind domainless cookies to the host that session belongs. .PP .SH httpie cli sessions upgrade-all Upgrade all named sessions with the latest layout. A list of changes between different session versions can be found in the official documentation. .IP "\fB\,--bind-cookies\/\fR" Bind domainless cookies to the host that session belongs. .PP .SH httpie cli plugins install Install the given targets from PyPI or from a local paths. .IP "\fB\,TARGET\/\fR" targets to install .PP .SH httpie cli plugins upgrade Upgrade the given plugins .IP "\fB\,TARGET\/\fR" targets to upgrade .PP .SH httpie cli plugins uninstall Uninstall the given HTTPie plugins. .IP "\fB\,TARGET\/\fR" targets to install .PP .SH httpie cli plugins list List all installed HTTPie plugins. .PP .SH httpie plugins install Install the given targets from PyPI or from a local paths. .IP "\fB\,TARGET\/\fR" targets to install .PP .SH httpie plugins upgrade Upgrade the given plugins .IP "\fB\,TARGET\/\fR" targets to upgrade .PP .SH httpie plugins uninstall Uninstall the given HTTPie plugins. .IP "\fB\,TARGET\/\fR" targets to install .PP .SH httpie plugins list List all installed HTTPie plugins. .PPcli-3.2.4/extras/man/https.1000066400000000000000000000344761471121002400156020ustar00rootroot00000000000000.\" This file is auto-generated from the parser declaration in httpie/cli/definition.py by extras/scripts/generate_man_pages.py. .TH https 1 "2024-07-10" "HTTPie 3.2.4" "HTTPie Manual" .SH NAME https .SH SYNOPSIS https [METHOD] URL [REQUEST_ITEM ...] .SH DESCRIPTION HTTPie: modern, user-friendly command-line HTTP client for the API era. .SH Positional arguments These arguments come after any flags and in the order they are listed here. Only URL is required. .IP "\fB\,METHOD\/\fR" The HTTP method to be used for the request (GET, POST, PUT, DELETE, ...). This argument can be omitted in which case HTTPie will use POST if there is some data to be sent, otherwise GET: $ http example.org # => GET $ http example.org hello=world # => POST .IP "\fB\,URL\/\fR" The request URL. Scheme defaults to \[aq]http://\[aq] if the URL does not include one. (You can override this with: \fB\,--default-scheme\/\fR=http/https) You can also use a shorthand for localhost $ http :3000 # => http://localhost:3000 $ http :/foo # => http://localhost/foo .IP "\fB\,REQUEST_ITEM\/\fR" Optional key-value pairs to be included in the request. The separator used determines the type: \[aq]:\[aq] HTTP headers: Referer:https://httpie.io Cookie:foo=bar User-Agent:bacon/1.0 \[aq]==\[aq] URL parameters to be appended to the request URI: search==httpie \[aq]=\[aq] Data fields to be serialized into a JSON object (with \fB\,--json\/\fR, \fB\,-j\/\fR) or form data (with \fB\,--form\/\fR, \fB\,-f\/\fR): name=HTTPie language=Python description=\[aq]CLI HTTP client\[aq] \[aq]:=\[aq] Non-string JSON data fields (only with \fB\,--json\/\fR, \fB\,-j\/\fR): awesome:=true amount:=42 colors:=\[aq][\[dq]red\[dq], \[dq]green\[dq], \[dq]blue\[dq]]\[aq] \[aq]@\[aq] Form file fields (only with \fB\,--form\/\fR or \fB\,--multipart\/\fR): cv@\(ti/Documents/CV.pdf cv@\[aq]\(ti/Documents/CV.pdf;type=application/pdf\[aq] \[aq]=@\[aq] A data field like \[aq]=\[aq], but takes a file path and embeds its content: essay=@Documents/essay.txt \[aq]:=@\[aq] A raw JSON field like \[aq]:=\[aq], but takes a file path and embeds its content: package:=@./package.json You can use a backslash to escape a colliding separator in the field name: field-name-with\e:colon=value .PP .SH Predefined content types .IP "\fB\,--json\/\fR, \fB\,-j\/\fR" (default) Data items from the command line are serialized as a JSON object. The Content-Type and Accept headers are set to application/json (if not specified). .IP "\fB\,--form\/\fR, \fB\,-f\/\fR" Data items from the command line are serialized as form fields. The Content-Type is set to application/x-www-form-urlencoded (if not specified). The presence of any file fields results in a multipart/form-data request. .IP "\fB\,--multipart\/\fR" Similar to \fB\,--form\/\fR, but always sends a multipart/form-data request (i.e., even without files). .IP "\fB\,--boundary\/\fR" Specify a custom boundary string for multipart/form-data requests. Only has effect only together with \fB\,--form\/\fR. .IP "\fB\,--raw\/\fR" This option allows you to pass raw request data without extra processing (as opposed to the structured request items syntax): $ http \fB\,--raw\/\fR=\[aq]data\[aq] pie.dev/post You can achieve the same by piping the data via stdin: $ echo data | http pie.dev/post Or have HTTPie load the raw data from a file: $ http pie.dev/post @data.txt .PP .SH Content processing options .IP "\fB\,--compress\/\fR, \fB\,-x\/\fR" Content compressed (encoded) with Deflate algorithm. The Content-Encoding header is set to deflate. Compression is skipped if it appears that compression ratio is negative. Compression can be forced by repeating the argument. .PP .SH Output processing .IP "\fB\,--pretty\/\fR" Controls output processing. The value can be \[dq]none\[dq] to not prettify the output (default for redirected output), \[dq]all\[dq] to apply both colors and formatting (default for terminal output), \[dq]colors\[dq], or \[dq]format\[dq]. .IP "\fB\,--style\/\fR, \fB\,-s\/\fR \fI\,STYLE\/\fR" Output coloring style (default is \[dq]auto\[dq]). It can be one of: auto, pie, pie-dark, pie-light, solarized For finding out all available styles in your system, try: $ http \fB\,--style\/\fR The \[dq]auto\[dq] style follows your terminal\[aq]s ANSI color styles. For non-auto styles to work properly, please make sure that the $TERM environment variable is set to \[dq]xterm-256color\[dq] or similar (e.g., via `export TERM=xterm-256color\[aq] in your \(ti/.bashrc). .IP "\fB\,--unsorted\/\fR" Disables all sorting while formatting output. It is a shortcut for: \fB\,--format-options\/\fR=headers.sort:false,json.sort_keys:false .IP "\fB\,--sorted\/\fR" Re-enables all sorting options while formatting output. It is a shortcut for: \fB\,--format-options\/\fR=headers.sort:true,json.sort_keys:true .IP "\fB\,--response-charset\/\fR \fI\,ENCODING\/\fR" Override the response encoding for terminal display purposes, e.g.: \fB\,--response-charset\/\fR=utf8 \fB\,--response-charset\/\fR=big5 .IP "\fB\,--response-mime\/\fR \fI\,MIME_TYPE\/\fR" Override the response mime type for coloring and formatting for the terminal, e.g.: \fB\,--response-mime\/\fR=application/json \fB\,--response-mime\/\fR=text/xml .IP "\fB\,--format-options\/\fR" Controls output formatting. Only relevant when formatting is enabled through (explicit or implied) \fB\,--pretty\/\fR=all or \fB\,--pretty\/\fR=format. The following are the default options: headers.sort:true json.format:true json.indent:4 json.sort_keys:true xml.format:true xml.indent:2 You may use this option multiple times, as well as specify multiple comma-separated options at the same time. For example, this modifies the settings to disable the sorting of JSON keys, and sets the indent size to 2: \fB\,--format-options\/\fR json.sort_keys:false,json.indent:2 This is something you will typically put into your config file. .PP .SH Output options .IP "\fB\,--print\/\fR, \fB\,-p\/\fR \fI\,WHAT\/\fR" String specifying what the output should contain: \[aq]H\[aq] request headers \[aq]B\[aq] request body \[aq]h\[aq] response headers \[aq]b\[aq] response body \[aq]m\[aq] response metadata The default behaviour is \[aq]hb\[aq] (i.e., the response headers and body is printed), if standard output is not redirected. If the output is piped to another program or to a file, then only the response body is printed by default. .IP "\fB\,--headers\/\fR, \fB\,-h\/\fR" Print only the response headers. Shortcut for \fB\,--print\/\fR=h. .IP "\fB\,--meta\/\fR, \fB\,-m\/\fR" Print only the response metadata. Shortcut for \fB\,--print\/\fR=m. .IP "\fB\,--body\/\fR, \fB\,-b\/\fR" Print only the response body. Shortcut for \fB\,--print\/\fR=b. .IP "\fB\,--verbose\/\fR, \fB\,-v\/\fR" Verbose output. For the level one (with single `\fB\,-v\/\fR`/`\fB\,--verbose\/\fR`), print the whole request as well as the response. Also print any intermediary requests/responses (such as redirects). For the second level and higher, print these as well as the response metadata. Level one is a shortcut for: \fB\,--all\/\fR \fB\,--print\/\fR=BHbh Level two is a shortcut for: \fB\,--all\/\fR \fB\,--print\/\fR=BHbhm .IP "\fB\,--all\/\fR" By default, only the final request/response is shown. Use this flag to show any intermediary requests/responses as well. Intermediary requests include followed redirects (with \fB\,--follow\/\fR), the first unauthorized request when Digest auth is used (\fB\,--auth\/\fR=digest), etc. .IP "\fB\,--stream\/\fR, \fB\,-S\/\fR" Always stream the response body by line, i.e., behave like `tail \fB\,-f\/\fR\[aq]. Without \fB\,--stream\/\fR and with \fB\,--pretty\/\fR (either set or implied), HTTPie fetches the whole response before it outputs the processed data. Set this option when you want to continuously display a prettified long-lived response, such as one from the Twitter streaming API. It is useful also without \fB\,--pretty\/\fR: It ensures that the output is flushed more often and in smaller chunks. .IP "\fB\,--output\/\fR, \fB\,-o\/\fR \fI\,FILE\/\fR" Save output to FILE instead of stdout. If \fB\,--download\/\fR is also set, then only the response body is saved to FILE. Other parts of the HTTP exchange are printed to stderr. .IP "\fB\,--download\/\fR, \fB\,-d\/\fR" Do not print the response body to stdout. Rather, download it and store it in a file. The filename is guessed unless specified with \fB\,--output\/\fR [filename]. This action is similar to the default behaviour of wget. .IP "\fB\,--continue\/\fR, \fB\,-c\/\fR" Resume an interrupted download. Note that the \fB\,--output\/\fR option needs to be specified as well. .IP "\fB\,--quiet\/\fR, \fB\,-q\/\fR" Do not print to stdout or stderr, except for errors and warnings when provided once. Provide twice to suppress warnings as well. stdout is still redirected if \fB\,--output\/\fR is specified. Flag doesn\[aq]t affect behaviour of download beyond not printing to terminal. .PP .SH Sessions .IP "\fB\,--session\/\fR \fI\,SESSION_NAME_OR_PATH\/\fR" Create, or reuse and update a session. Within a session, custom headers, auth credential, as well as any cookies sent by the server persist between requests. Session files are stored in: [HTTPIE_CONFIG_DIR]//.json. See the following page to find out your default HTTPIE_CONFIG_DIR: https://httpie.io/docs/cli/config-file-directory .IP "\fB\,--session-read-only\/\fR \fI\,SESSION_NAME_OR_PATH\/\fR" Create or read a session without updating it form the request/response exchange. .PP .SH Authentication .IP "\fB\,--auth\/\fR, \fB\,-a\/\fR \fI\,USER[:PASS] | TOKEN\/\fR" For username/password based authentication mechanisms (e.g basic auth or digest auth) if only the username is provided (\fB\,-a\/\fR username), HTTPie will prompt for the password. .IP "\fB\,--auth-type\/\fR, \fB\,-A\/\fR" The authentication mechanism to be used. Defaults to \[dq]basic\[dq]. \[dq]basic\[dq]: Basic HTTP auth \[dq]digest\[dq]: Digest HTTP auth \[dq]bearer\[dq]: Bearer HTTP Auth To see all available auth types on your system, including ones installed via plugins, run: $ http \fB\,--auth-type\/\fR .IP "\fB\,--ignore-netrc\/\fR" Ignore credentials from .netrc. .PP .SH Network .IP "\fB\,--offline\/\fR" Build the request and print it but don\(gat actually send it. .IP "\fB\,--proxy\/\fR \fI\,PROTOCOL:PROXY_URL\/\fR" String mapping protocol to the URL of the proxy (e.g. http:http://foo.bar:3128). You can specify multiple proxies with different protocols. The environment variables $ALL_PROXY, $HTTP_PROXY, and $HTTPS_proxy are supported as well. .IP "\fB\,--follow\/\fR, \fB\,-F\/\fR" Follow 30x Location redirects. .IP "\fB\,--max-redirects\/\fR" By default, requests have a limit of 30 redirects (works with \fB\,--follow\/\fR). .IP "\fB\,--max-headers\/\fR" The maximum number of response headers to be read before giving up (default 0, i.e., no limit). .IP "\fB\,--timeout\/\fR \fI\,SECONDS\/\fR" The connection timeout of the request in seconds. The default value is 0, i.e., there is no timeout limit. This is not a time limit on the entire response download; rather, an error is reported if the server has not issued a response for timeout seconds (more precisely, if no bytes have been received on the underlying socket for timeout seconds). .IP "\fB\,--check-status\/\fR" By default, HTTPie exits with 0 when no network or other fatal errors occur. This flag instructs HTTPie to also check the HTTP status code and exit with an error if the status indicates one. When the server replies with a 4xx (Client Error) or 5xx (Server Error) status code, HTTPie exits with 4 or 5 respectively. If the response is a 3xx (Redirect) and \fB\,--follow\/\fR hasn\[aq]t been set, then the exit status is 3. Also an error message is written to stderr if stdout is redirected. .IP "\fB\,--path-as-is\/\fR" Bypass dot segment (/../ or /./) URL squashing. .IP "\fB\,--chunked\/\fR" Enable streaming via chunked transfer encoding. The Transfer-Encoding header is set to chunked. .PP .SH SSL .IP "\fB\,--verify\/\fR" Set to \[dq]no\[dq] (or \[dq]false\[dq]) to skip checking the host\[aq]s SSL certificate. Defaults to \[dq]yes\[dq] (\[dq]true\[dq]). You can also pass the path to a CA_BUNDLE file for private certs. (Or you can set the REQUESTS_CA_BUNDLE environment variable instead.) .IP "\fB\,--ssl\/\fR" The desired protocol version to use. This will default to SSL v2.3 which will negotiate the highest protocol that both the server and your installation of OpenSSL support. Available protocols may vary depending on OpenSSL installation (only the supported ones are shown here). .IP "\fB\,--ciphers\/\fR" A string in the OpenSSL cipher list format. See `http \fB\,--help\/\fR` for the default ciphers list on you system. .IP "\fB\,--cert\/\fR" You can specify a local cert to use as client side SSL certificate. This file may either contain both private key and certificate or you may specify \fB\,--cert-key\/\fR separately. .IP "\fB\,--cert-key\/\fR" The private key to use with SSL. Only needed if \fB\,--cert\/\fR is given and the certificate file does not contain the private key. .IP "\fB\,--cert-key-pass\/\fR" The passphrase to be used to with the given private key. Only needed if \fB\,--cert-key\/\fR is given and the key file requires a passphrase. If not provided, you\(gall be prompted interactively. .PP .SH Troubleshooting .IP "\fB\,--ignore-stdin\/\fR, \fB\,-I\/\fR" Do not attempt to read stdin .IP "\fB\,--help\/\fR" Show this help message and exit. .IP "\fB\,--manual\/\fR" Show the full manual. .IP "\fB\,--version\/\fR" Show version and exit. .IP "\fB\,--traceback\/\fR" Prints the exception traceback should one occur. .IP "\fB\,--default-scheme\/\fR" The default scheme to use if not specified in the URL. .IP "\fB\,--debug\/\fR" Prints the exception traceback should one occur, as well as other information useful for debugging HTTPie itself and for reporting bugs. .PP .SH SEE ALSO For every \fB\,--OPTION\/\fR there is also a \fB\,--no-OPTION\/\fR that reverts OPTION to its default value. Suggestions and bug reports are greatly appreciated: https://github.com/httpie/cli/issuescli-3.2.4/extras/packaging/000077500000000000000000000000001471121002400155115ustar00rootroot00000000000000cli-3.2.4/extras/packaging/linux/000077500000000000000000000000001471121002400166505ustar00rootroot00000000000000cli-3.2.4/extras/packaging/linux/Dockerfile000066400000000000000000000021741471121002400206460ustar00rootroot00000000000000# Use the oldest (but still supported) Ubuntu as the base for PyInstaller # packages. This will prevent stuff like glibc from conflicting. FROM ubuntu:18.04 RUN apt-get update RUN apt-get install -y software-properties-common binutils RUN apt-get install -y ruby-dev RUN gem install fpm # Use deadsnakes for the latest Pythons (e.g 3.9) RUN add-apt-repository ppa:deadsnakes/ppa RUN apt-get update && apt-get install -y python3.9 python3.9-dev python3.9-venv # Install rpm as well, since we are going to build fedora dists too RUN apt-get install -y rpm ADD . /app WORKDIR /app/extras/packaging/linux ENV VIRTUAL_ENV=/opt/venv RUN python3.9 -m venv $VIRTUAL_ENV ENV PATH="$VIRTUAL_ENV/bin:$PATH" # Ensure that pip is renewed, otherwise we would be using distro-provided pip # which strips vendored packages and doesn't work with PyInstaller. RUN python -m pip install /app RUN python -m pip install pyinstaller wheel RUN python -m pip install --force-reinstall --upgrade pip RUN echo 'BUILD_CHANNEL="pypi"' > /app/httpie/internal/__build_channel__.py RUN python build.py ENTRYPOINT ["mv", "/app/extras/packaging/linux/dist/", "/artifacts"] cli-3.2.4/extras/packaging/linux/README.md000066400000000000000000000056231471121002400201350ustar00rootroot00000000000000# Standalone Linux Packages ![packaging.png](https://user-images.githubusercontent.com/47358913/159950478-2d090d1b-69b9-4914-a1b4-d3e3d8e25fe0.png) This directory contains the build scripts for creating: - A self-contained binary executable for the HTTPie itself - `httpie.deb` and `httpie.rpm` packages for Debian and Fedora. The process of constructing them are fully automated, and can be easily done through the [`Release as Standalone Linux Package`](https://github.com/httpie/cli/actions/workflows/release-linux-standalone.yml) action. Once it finishes, the release artifacts will be attached in the summary page of the triggered run. ## Hacking The main entry point for the package builder is the [`build.py`](https://github.com/httpie/cli/blob/master/extras/packaging/linux/build.py). It contains 2 major methods: - `build_binaries`, for the self-contained executables - `build_packages`, for the OS-specific packages (which wrap the binaries) ### `build_binaries` We use [PyInstaller](https://pyinstaller.readthedocs.io/en/stable/) for the binaries. Normally pyinstaller offers two different modes: - Single directory (harder to distribute, low redundancy. Library files are shared across different executables) - Single binary (easier to distribute, higher redundancy. Same libraries are statically linked to different executables, so higher total size) Since our binary size (in total 20 MiBs) is not that big, we have decided to choose the single binary mode for the sake of easier distribution. We also disable `UPX`, which is a runtime decompression method since it adds some startup cost. ### `build_packages` We build our OS-specific packages with [FPM](https://github.com/jordansissel/fpm) which offers a really nice abstraction. We use the `dir` mode, and package `http`, `https` and `httpie` commands. More can be added to the `files` option. Since the `httpie` depends on having a pip executable, we explicitly depend on the system Python even though the core does not use it. ### Docker Image This directory also contains a [docker image](https://github.com/httpie/cli/blob/master/extras/packaging/linux/Dockerfile) which helps building our standalone binaries in an isolated environment with the lowest possible library versions. This is important, since even though the executables are standalone they still depend on some main system C libraries (like `glibc`) so we need to create our executables inside an environment with a very old (but not deprecated) glibc version. It makes us soundproof for all active Ubuntu/Debian versions. It also contains the Python version we package our HTTPie with, so it is the place if you need to change it. ### `./get_release_artifacts.sh` If you make a change in the `build.py`, run the following script to test it out. It will return multiple files under `artifacts/dist` which then you can test out and ensure their quality (it is also the script that we use in our automation). cli-3.2.4/extras/packaging/linux/build.py000066400000000000000000000053171471121002400203270ustar00rootroot00000000000000import stat import subprocess from pathlib import Path from typing import Iterator, Tuple BUILD_DIR = Path(__file__).parent HTTPIE_DIR = BUILD_DIR.parent.parent.parent EXTRAS_DIR = HTTPIE_DIR / 'extras' MAN_PAGES_DIR = EXTRAS_DIR / 'man' SCRIPT_DIR = BUILD_DIR / Path('scripts') HOOKS_DIR = SCRIPT_DIR / 'hooks' DIST_DIR = BUILD_DIR / 'dist' TARGET_SCRIPTS = { SCRIPT_DIR / 'http_cli.py': [], SCRIPT_DIR / 'httpie_cli.py': ['--hidden-import=pip'], } def build_binaries() -> Iterator[Tuple[str, Path]]: for target_script, extra_args in TARGET_SCRIPTS.items(): subprocess.check_call( [ 'pyinstaller', '--onefile', '--noupx', '-p', HTTPIE_DIR, '--additional-hooks-dir', HOOKS_DIR, *extra_args, target_script, ] ) for executable_path in DIST_DIR.iterdir(): if executable_path.suffix: continue stat_r = executable_path.stat() executable_path.chmod(stat_r.st_mode | stat.S_IEXEC) yield executable_path.stem, executable_path def build_packages(http_binary: Path, httpie_binary: Path) -> None: import httpie # Mapping of src_file -> dst_file files = [ (http_binary, '/usr/bin/http'), (http_binary, '/usr/bin/https'), (httpie_binary, '/usr/bin/httpie'), ] files.extend( (man_page, f'/usr/share/man/man1/{man_page.name}') for man_page in MAN_PAGES_DIR.glob('*.1') ) # A list of additional dependencies deps = [ 'python3 >= 3.7', 'python3-pip' ] processed_deps = [ f'--depends={dep}' for dep in deps ] processed_files = [ '='.join([str(src.resolve()), dst]) for src, dst in files ] for target in ['deb', 'rpm']: subprocess.check_call( [ 'fpm', '--force', '-s', 'dir', '-t', target, '--name', 'httpie', '--version', httpie.__version__, '--description', httpie.__doc__.strip(), '--license', httpie.__licence__, *processed_deps, *processed_files, ], cwd=DIST_DIR, ) def main(): binaries = dict(build_binaries()) build_packages(binaries['http_cli'], binaries['httpie_cli']) # Rename http_cli/httpie_cli to http/httpie binaries['http_cli'].rename(DIST_DIR / 'http') binaries['httpie_cli'].rename(DIST_DIR / 'httpie') if __name__ == '__main__': main() cli-3.2.4/extras/packaging/linux/get_release_artifacts.sh000077500000000000000000000007271471121002400235340ustar00rootroot00000000000000#!/bin/bash set -xe REPO_ROOT=../../../ ARTIFACTS_DIR=$(pwd)/artifacts # Reset the ARTIFACTS_DIR. rm -rf $ARTIFACTS_DIR mkdir -p $ARTIFACTS_DIR # Operate on the repository root to have the proper # docker context. pushd $REPO_ROOT # Build the PyInstaller image docker build -t pyinstaller-httpie -f extras/packaging/linux/Dockerfile . # Copy the artifacts to the designated directory. docker run --rm -i -v $ARTIFACTS_DIR:/artifacts pyinstaller-httpie:latest popd cli-3.2.4/extras/packaging/linux/scripts/000077500000000000000000000000001471121002400203375ustar00rootroot00000000000000cli-3.2.4/extras/packaging/linux/scripts/hooks/000077500000000000000000000000001471121002400214625ustar00rootroot00000000000000cli-3.2.4/extras/packaging/linux/scripts/hooks/hook-pip.py000066400000000000000000000005711471121002400235650ustar00rootroot00000000000000from pathlib import Path from PyInstaller.utils.hooks import collect_all def hook(hook_api): for pkg in [ 'pip', 'setuptools', 'distutils', 'pkg_resources' ]: datas, binaries, hiddenimports = collect_all(pkg) hook_api.add_datas(datas) hook_api.add_binaries(binaries) hook_api.add_imports(*hiddenimports) cli-3.2.4/extras/packaging/linux/scripts/http_cli.py000066400000000000000000000001411471121002400225130ustar00rootroot00000000000000from httpie.__main__ import main if __name__ == '__main__': import sys sys.exit(main()) cli-3.2.4/extras/packaging/linux/scripts/httpie_cli.py000066400000000000000000000001511471121002400230320ustar00rootroot00000000000000from httpie.manager.__main__ import main if __name__ == '__main__': import sys sys.exit(main()) cli-3.2.4/extras/profiling/000077500000000000000000000000001471121002400155565ustar00rootroot00000000000000cli-3.2.4/extras/profiling/README.md000066400000000000000000000030111471121002400170300ustar00rootroot00000000000000# HTTPie Benchmarking Infrastructure This directory includes the benchmarks we use for testing HTTPie's speed and the infrastructure to automate this testing across versions. ## Usage Ensure the following requirements are satisfied: - Python 3.7+ - `pyperf` Then, run the `extras/profiling/run.py`: ```console $ python extras/profiling/run.py ``` Without any options, this command will initially create an isolated environment and install `httpie` from the latest commit. Then it will create a second environment with the `master` of the current repository and run the benchmarks on both of them. It will compare the results and print it as a markdown table: | Benchmark | master | this_branch | | -------------------------------------- | :----: | :------------------: | | `http --version` (startup) | 201 ms | 174 ms: 1.16x faster | | `http --offline pie.dev/get` (startup) | 200 ms | 174 ms: 1.15x faster | | Geometric mean | (ref) | 1.10x faster | If your `master` branch is not up-to-date, you can get a fresh clone by passing `--fresh` option. This way, the benchmark runner will clone the `httpie/cli` repo from `GitHub` and use it as the baseline. You can customize these branches by passing `--local-repo`/`--target-branch`, and customize the repos by passing `--local-repo`/`--target-repo` (can either take a URL or a path). If you want to run a third environment with additional dependencies (such as `pyOpenSSL`), you can pass `--complex`. cli-3.2.4/extras/profiling/benchmarks.py000066400000000000000000000134451471121002400202540ustar00rootroot00000000000000""" This file is the declaration of benchmarks for HTTPie. It is also used to run them with the current environment. Each instance of BaseRunner class will be an individual benchmark. And if run without any arguments, this file will execute every benchmark instance and report the timings. The benchmarks are run through 'pyperf', which allows to do get very precise results. For micro-benchmarks like startup, please run `pyperf system tune` to get even more accurate results. Examples: # Run everything as usual, the default is that we do 3 warm-up runs # and 5 actual runs. $ python extras/profiling/benchmarks.py # For retrieving results faster, pass --fast $ python extras/profiling/benchmarks.py --fast # For verify everything works as expected, pass --debug-single-value. # It will only run everything once, so the resuls are not reliable. But # very useful when iterating on a benchmark $ python extras/profiling/benchmarks.py --debug-single-value # If you want to run with a custom HTTPie command (for example with # and HTTPie instance installed in another virtual environment), # pass HTTPIE_COMMAND variable. $ HTTPIE_COMMAND="/my/python /my/httpie" python extras/profiling/benchmarks.py """ from __future__ import annotations import os import shlex import subprocess import sys import threading from contextlib import ExitStack, contextmanager from dataclasses import dataclass, field from functools import cached_property, partial from http.server import HTTPServer, SimpleHTTPRequestHandler from tempfile import TemporaryDirectory from typing import ClassVar, Final, List import pyperf # For download benchmarks, define a set of files. # file: (block_size, count) => total_size = block_size * count PREDEFINED_FILES: Final = {'3G': (3 * 1024 ** 2, 1024)} class QuietSimpleHTTPServer(SimpleHTTPRequestHandler): def log_message(self, *args, **kwargs): pass @contextmanager def start_server(): """Create a server to serve local files. It will create the PREDEFINED_FILES through dd.""" with TemporaryDirectory() as directory: for file_name, (block_size, count) in PREDEFINED_FILES.items(): subprocess.check_call( [ 'dd', 'if=/dev/zero', f'of={file_name}', f'bs={block_size}', f'count={count}', ], cwd=directory, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, ) handler = partial(QuietSimpleHTTPServer, directory=directory) server = HTTPServer(('localhost', 0), handler) thread = threading.Thread(target=server.serve_forever) thread.start() yield '{}:{}'.format(*server.socket.getsockname()) server.shutdown() thread.join(timeout=0.5) @dataclass class Context: benchmarks: ClassVar[List[BaseRunner]] = [] stack: ExitStack = field(default_factory=ExitStack) runner: pyperf.Runner = field(default_factory=pyperf.Runner) def run(self) -> pyperf.BenchmarkSuite: results = [benchmark.run(self) for benchmark in self.benchmarks] return pyperf.BenchmarkSuite(results) @property def cmd(self) -> List[str]: if cmd := os.getenv('HTTPIE_COMMAND'): return shlex.split(cmd) http = os.path.join(os.path.dirname(sys.executable), 'http') assert os.path.exists(http) return [sys.executable, http] @cached_property def server(self) -> str: return self.stack.enter_context(start_server()) def __enter__(self): return self def __exit__(self, *exc_info): self.stack.close() @dataclass class BaseRunner: """ An individual benchmark case. By default it has the category (e.g like startup or download) and a name. """ category: str title: str def __post_init__(self): Context.benchmarks.append(self) def run(self, context: Context) -> pyperf.Benchmark: raise NotImplementedError @property def name(self) -> str: return f'{self.title} ({self.category})' @dataclass class CommandRunner(BaseRunner): """ Run a single command, and benchmark it. """ args: List[str] def run(self, context: Context) -> pyperf.Benchmark: return context.runner.bench_command(self.name, [*context.cmd, *self.args]) @dataclass class DownloadRunner(BaseRunner): """ Benchmark downloading a single file from the remote server. """ file_name: str def run(self, context: Context) -> pyperf.Benchmark: return context.runner.bench_command( self.name, [ *context.cmd, '--download', 'GET', f'{context.server}/{self.file_name}', ], ) CommandRunner('startup', '`http --version`', ['--version']) CommandRunner('startup', '`http --offline pie.dev/get`', ['--offline', 'pie.dev/get']) for pretty in ['all', 'none']: CommandRunner( 'startup', f'`http --pretty={pretty} pie.dev/stream/1000`', [ '--print=HBhb', f'--pretty={pretty}', 'httpbin.org/stream/1000' ] ) DownloadRunner('download', '`http --download :/big_file.txt` (3GB)', '3G') def main() -> None: # PyPerf will bring it's own argument parser, so configure the script. # The somewhat fast and also precise enough configuration is this. We run # benchmarks 3 times to warm up (e.g especially for download benchmark, this # is important). And then 5 actual runs where we record. sys.argv.extend( ['--worker', '--loops=1', '--warmup=3', '--values=5', '--processes=2'] ) with Context() as context: context.run() if __name__ == '__main__': main() cli-3.2.4/extras/profiling/run.py000066400000000000000000000206451471121002400167430ustar00rootroot00000000000000""" Run the HTTPie benchmark suite with multiple environments. This script is configured in a way that, it will create two (or more) isolated environments and compare the *last commit* of this repository with it's master. > If you didn't commit yet, it won't be showing results. You can also pass --fresh, which would test the *last commit* of this repository with a fresh copy of HTTPie itself. This way even if you don't have an up-to-date master branch, you can still compare it with the upstream's master. You can also pass --complex to add 2 additional environments, which would include additional dependencies like pyOpenSSL. Examples: # Run everything as usual, and compare last commit with master $ python extras/profiling/run.py # Include complex environments $ python extras/profiling/run.py --complex # Compare against a fresh copy $ python extras/profiling/run.py --fresh # Compare against a custom branch of a custom repo $ python extras/profiling/run.py --target-repo my_repo --target-branch my_branch # Debug changes made on this script (only run benchmarks once) $ python extras/profiling/run.py --debug """ import dataclasses import shlex import subprocess import sys import tempfile import venv from argparse import ArgumentParser, FileType from contextlib import contextmanager from dataclasses import dataclass from pathlib import Path from typing import (IO, Dict, Generator, Iterable, List, Optional, Tuple) BENCHMARK_SCRIPT = Path(__file__).parent / 'benchmarks.py' CURRENT_REPO = Path(__file__).parent.parent.parent GITHUB_URL = 'https://github.com/httpie/cli.git' TARGET_BRANCH = 'master' # Additional dependencies for --complex ADDITIONAL_DEPS = ('pyOpenSSL',) def call(*args, **kwargs): kwargs.setdefault('stdout', subprocess.DEVNULL) return subprocess.check_call(*args, **kwargs) class Environment: """ Each environment defines how to create an isolated instance where we could install HTTPie and run benchmarks without any environmental factors. """ @contextmanager def on_repo(self) -> Generator[Tuple[Path, Dict[str, str]], None, None]: """ Return the path to the python interpreter and the environment variables (e.g HTTPIE_COMMAND) to be used on the benchmarks. """ raise NotImplementedError @dataclass class HTTPieEnvironment(Environment): repo_url: str branch: Optional[str] = None dependencies: Iterable[str] = () @contextmanager def on_repo(self) -> Generator[Path, None, None]: with tempfile.TemporaryDirectory() as directory_path: directory = Path(directory_path) # Clone the repo repo_path = directory / 'httpie' call( ['git', 'clone', self.repo_url, repo_path], stderr=subprocess.DEVNULL, ) if self.branch is not None: call( ['git', 'checkout', self.branch], cwd=repo_path, stderr=subprocess.DEVNULL, ) # Prepare the environment venv_path = directory / '.venv' venv.create(venv_path, with_pip=True) # Install basic dependencies python = venv_path / 'bin' / 'python' call( [ python, '-m', 'pip', 'install', 'wheel', 'pyperf==2.3.0', *self.dependencies, ] ) # Create a wheel distribution of HTTPie call([python, 'setup.py', 'bdist_wheel'], cwd=repo_path) # Install httpie distribution_path = next((repo_path / 'dist').iterdir()) call( [python, '-m', 'pip', 'install', distribution_path], cwd=repo_path, ) http = venv_path / 'bin' / 'http' yield python, {'HTTPIE_COMMAND': shlex.join([str(python), str(http)])} @dataclass class LocalCommandEnvironment(Environment): local_command: str @contextmanager def on_repo(self) -> Generator[Path, None, None]: yield sys.executable, {'HTTPIE_COMMAND': self.local_command} def dump_results( results: List[str], file: IO[str], min_speed: Optional[str] = None ) -> None: for result in results: lines = result.strip().splitlines() if min_speed is not None and "hidden" in lines[-1]: lines[-1] = ( 'Some benchmarks were hidden from this list ' 'because their timings did not change in a ' 'significant way (change was within the error ' 'margin ±{margin}%).' ).format(margin=min_speed) result = '\n'.join(lines) print(result, file=file) print("\n---\n", file=file) def compare(*args, directory: Path, min_speed: Optional[str] = None): compare_args = ['pyperf', 'compare_to', '--table', '--table-format=md', *args] if min_speed: compare_args.extend(['--min-speed', min_speed]) return subprocess.check_output( compare_args, cwd=directory, text=True, ) def run( configs: List[Dict[str, Environment]], file: IO[str], debug: bool = False, min_speed: Optional[str] = None, ) -> None: result_directory = Path(tempfile.mkdtemp()) results = [] current = 1 total = sum(1 for config in configs for _ in config.items()) def iterate(env_name, status): print( f'Iteration: {env_name} ({current}/{total}) ({status})' + ' ' * 10, end='\r', flush=True, ) for config in configs: for env_name, env in config.items(): iterate(env_name, 'setting up') with env.on_repo() as (python, env_vars): iterate(env_name, 'running benchmarks') args = [python, BENCHMARK_SCRIPT, '-o', env_name] if debug: args.append('--debug-single-value') call( args, cwd=result_directory, env=env_vars, ) current += 1 results.append(compare( *config.keys(), directory=result_directory, min_speed=min_speed )) dump_results(results, file=file, min_speed=min_speed) print('Results are available at:', result_directory) def main() -> None: parser = ArgumentParser() parser.add_argument('--local-repo', default=CURRENT_REPO) parser.add_argument('--local-branch', default=None) parser.add_argument('--target-repo', default=CURRENT_REPO) parser.add_argument('--target-branch', default=TARGET_BRANCH) parser.add_argument( '--fresh', action='store_const', const=GITHUB_URL, dest='target_repo', help='Clone the target repo from upstream GitHub URL', ) parser.add_argument( '--complex', action='store_true', help='Add a second run, with a complex python environment.', ) parser.add_argument( '--local-bin', help='Run the suite with the given local binary in addition to' ' existing runners. (E.g --local-bin $(command -v xh))', ) parser.add_argument( '--file', type=FileType('w'), default=sys.stdout, help='File to print the actual results', ) parser.add_argument( '--min-speed', help='Minimum of speed in percent to consider that a ' 'benchmark is significant' ) parser.add_argument( '--debug', action='store_true', ) options = parser.parse_args() configs = [] base_config = { options.target_branch: HTTPieEnvironment(options.target_repo, options.target_branch), 'this_branch': HTTPieEnvironment(options.local_repo, options.local_branch), } configs.append(base_config) if options.complex: complex_config = { env_name + '-complex': dataclasses.replace(env, dependencies=ADDITIONAL_DEPS) for env_name, env in base_config.items() } configs.append(complex_config) if options.local_bin: base_config['binary'] = LocalCommandEnvironment(options.local_bin) run(configs, file=options.file, debug=options.debug, min_speed=options.min_speed) if __name__ == '__main__': main() cli-3.2.4/extras/scripts/000077500000000000000000000000001471121002400152545ustar00rootroot00000000000000cli-3.2.4/extras/scripts/generate_man_pages.py000066400000000000000000000136321471121002400214370ustar00rootroot00000000000000import os import re from contextlib import contextmanager from pathlib import Path from typing import Optional, Iterator, Iterable # So that httpie.cli.definition can provide man-page-specific output. Must be set before importing httpie. os.environ['HTTPIE_BUILDING_MAN_PAGES'] = '1' import httpie from httpie.cli.definition import options as core_options, IS_MAN_PAGE from httpie.cli.options import ParserSpec from httpie.manager.cli import options as manager_options from httpie.output.ui.rich_help import OptionsHighlighter, to_usage from httpie.output.ui.rich_utils import render_as_string assert IS_MAN_PAGE, 'CLI definition does not understand we’re building man pages' # Escape certain characters, so they are rendered properly on all terminals. # ESCAPE_MAP = { '"': '\[dq]', "'": '\[aq]', '~': '\(ti', '’': "\(ga", '\\': '\e', } ESCAPE_MAP = {ord(key): value for key, value in ESCAPE_MAP.items()} EXTRAS_DIR = Path(__file__).parent.parent MAN_PAGE_PATH = EXTRAS_DIR / 'man' PROJECT_ROOT = EXTRAS_DIR.parent OPTION_HIGHLIGHT_RE = re.compile( OptionsHighlighter.highlights[0] ) class ManPageBuilder: def __init__(self): self.source = [] def title_line( self, full_name: str, program_name: str, program_version: str, last_edit_date: str, ) -> None: self.source.append( f'.TH {program_name} 1 "{last_edit_date}" ' f'"{full_name} {program_version}" "{full_name} Manual"' ) def set_name(self, program_name: str) -> None: with self.section('NAME'): self.write(program_name) def write(self, text: str, *, bold: bool = False) -> None: if bold: text = '.B ' + text self.source.append(text) def separate(self) -> None: self.source.append('.PP') def format_desc(self, desc: str) -> str: description = _escape_and_dedent(desc) description = OPTION_HIGHLIGHT_RE.sub( # Boldify the option part, but don't remove the prefix (start of the match). lambda match: match[1] + self.boldify(match['option']), description ) return description def add_comment(self, comment: str) -> None: self.source.append(f'.\\" {comment}') def add_options(self, options: Iterable[str], *, metavar: Optional[str] = None) -> None: text = ", ".join(map(self.boldify, options)) if metavar: text += f' {self.underline(metavar)}' self.write(f'.IP "{text}"') def build(self) -> str: return '\n'.join(self.source) @contextmanager def section(self, section_name: str) -> Iterator[None]: self.write(f'.SH {section_name}') self.in_section = True yield self.in_section = False def underline(self, text: str) -> str: return r'\fI\,{}\/\fR'.format(text) def boldify(self, text: str) -> str: return r'\fB\,{}\/\fR'.format(text) def _escape_and_dedent(text: str) -> str: lines = [] for should_act, line in enumerate(text.splitlines()): # Only dedent after the first line. if should_act: if line.startswith(' '): line = line[4:] lines.append(line) return '\n'.join(lines).translate(ESCAPE_MAP) def to_man_page(program_name: str, spec: ParserSpec, *, is_top_level_cmd: bool = False) -> str: builder = ManPageBuilder() builder.add_comment( f"This file is auto-generated from the parser declaration " + (f"in {Path(spec.source_file).relative_to(PROJECT_ROOT)} " if spec.source_file else "") + f"by {Path(__file__).relative_to(PROJECT_ROOT)}." ) builder.title_line( full_name='HTTPie', program_name=program_name, program_version=httpie.__version__, last_edit_date=httpie.__date__, ) builder.set_name(program_name) with builder.section('SYNOPSIS'): # `http` and `https` are commands that can be directly used, so they can have # a valid usage. But `httpie` is a top-level command with multiple sub commands, # so for the synopsis we'll only reference the `httpie` name. if is_top_level_cmd: synopsis = program_name else: synopsis = render_as_string(to_usage(spec, program_name=program_name)) builder.write(synopsis) with builder.section('DESCRIPTION'): builder.write(spec.description) if spec.man_page_hint: builder.write(spec.man_page_hint) for index, group in enumerate(spec.groups, 1): with builder.section(group.name): if group.description: builder.write(group.description) for argument in group.arguments: if argument.is_hidden: continue raw_arg = argument.serialize(isolation_mode=True) metavar = raw_arg.get('metavar') if raw_arg.get('is_positional'): # In case of positional arguments, metavar is always equal # to the list of options (e.g `METHOD`). metavar = None builder.add_options(raw_arg['options'], metavar=metavar) desc = builder.format_desc(raw_arg.get('description', '')) builder.write('\n' + desc + '\n') builder.separate() if spec.epilog: with builder.section('SEE ALSO'): builder.write(builder.format_desc(spec.epilog)) return builder.build() def main() -> None: for program_name, spec, config in [ ('http', core_options, {}), ('https', core_options, {}), ('httpie', manager_options, {'is_top_level_cmd': True}), ]: with open((MAN_PAGE_PATH / program_name).with_suffix('.1'), 'w') as stream: stream.write(to_man_page(program_name, spec, **config)) if __name__ == '__main__': main() cli-3.2.4/httpie/000077500000000000000000000000001471121002400135545ustar00rootroot00000000000000cli-3.2.4/httpie/__init__.py000066400000000000000000000002621471121002400156650ustar00rootroot00000000000000""" HTTPie: modern, user-friendly command-line HTTP client for the API era. """ __version__ = '3.2.4' __date__ = '2024-11-01' __author__ = 'Jakub Roztocil' __licence__ = 'BSD' cli-3.2.4/httpie/__main__.py000066400000000000000000000006121471121002400156450ustar00rootroot00000000000000"""The main entry point. Invoke as `http' or `python -m httpie'. """ def main(): try: from httpie.core import main exit_status = main() except KeyboardInterrupt: from httpie.status import ExitStatus exit_status = ExitStatus.ERROR_CTRL_C return exit_status.value if __name__ == '__main__': # pragma: nocover import sys sys.exit(main()) cli-3.2.4/httpie/adapters.py000066400000000000000000000007001471121002400157260ustar00rootroot00000000000000from httpie.cli.dicts import HTTPHeadersDict from requests.adapters import HTTPAdapter class HTTPieHTTPAdapter(HTTPAdapter): def build_response(self, req, resp): """Wrap the original headers with the `HTTPHeadersDict` to preserve multiple headers that have the same name""" response = super().build_response(req, resp) response.headers = HTTPHeadersDict(getattr(resp, 'headers', {})) return response cli-3.2.4/httpie/cli/000077500000000000000000000000001471121002400143235ustar00rootroot00000000000000cli-3.2.4/httpie/cli/__init__.py000066400000000000000000000000001471121002400164220ustar00rootroot00000000000000cli-3.2.4/httpie/cli/argparser.py000066400000000000000000000551401471121002400166700ustar00rootroot00000000000000import argparse import errno import os import re import sys from argparse import RawDescriptionHelpFormatter from textwrap import dedent from urllib.parse import urlsplit from requests.utils import get_netrc_auth from .argtypes import ( AuthCredentials, SSLCredentials, KeyValueArgType, PARSED_DEFAULT_FORMAT_OPTIONS, parse_auth, parse_format_options, ) from .constants import ( HTTP_GET, HTTP_POST, BASE_OUTPUT_OPTIONS, OUTPUT_OPTIONS, OUTPUT_OPTIONS_DEFAULT, OUTPUT_OPTIONS_DEFAULT_OFFLINE, OUTPUT_OPTIONS_DEFAULT_STDOUT_REDIRECTED, OUT_RESP_BODY, PRETTY_MAP, PRETTY_STDOUT_TTY_ONLY, RequestType, SEPARATOR_CREDENTIALS, SEPARATOR_GROUP_ALL_ITEMS, SEPARATOR_GROUP_DATA_ITEMS, URL_SCHEME_RE, ) from .exceptions import ParseError from .requestitems import RequestItems from ..context import Environment from ..plugins.registry import plugin_manager from ..utils import ExplicitNullAuth, get_content_type class HTTPieHelpFormatter(RawDescriptionHelpFormatter): """A nicer help formatter. Help for arguments can be indented and contain new lines. It will be de-dented and arguments in the help will be separated by a blank line for better readability. """ def __init__(self, max_help_position=6, *args, **kwargs): # A smaller indent for args help. kwargs['max_help_position'] = max_help_position super().__init__(*args, **kwargs) def _split_lines(self, text, width): text = dedent(text).strip() + '\n\n' return text.splitlines() def add_usage(self, usage, actions, groups, prefix=None): # Only display the positional arguments displayed_actions = [ action for action in actions if not action.option_strings ] _, exception, _ = sys.exc_info() if ( isinstance(exception, argparse.ArgumentError) and len(exception.args) >= 1 and isinstance(exception.args[0], argparse.Action) ): # add_usage path is also taken when you pass an invalid option, # e.g --style=invalid. If something like that happens, we want # to include to action that caused to the invalid usage into # the list of actions we are displaying. displayed_actions.insert(0, exception.args[0]) super().add_usage( usage, displayed_actions, groups, prefix="usage:\n " ) # TODO: refactor and design type-annotated data structures # for raw args + parsed args and keep things immutable. class BaseHTTPieArgumentParser(argparse.ArgumentParser): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.env = None self.args = None self.has_stdin_data = False self.has_input_data = False # noinspection PyMethodOverriding def parse_args( self, env: Environment, args=None, namespace=None ) -> argparse.Namespace: self.env = env self.args, no_options = self.parse_known_args(args, namespace) if self.args.debug: self.args.traceback = True self.has_stdin_data = ( self.env.stdin and not getattr(self.args, 'ignore_stdin', False) and not self.env.stdin_isatty ) self.has_input_data = self.has_stdin_data or getattr(self.args, 'raw', None) is not None return self.args # noinspection PyShadowingBuiltins def _print_message(self, message, file=None): # Sneak in our stderr/stdout. if hasattr(self, 'root'): env = self.root.env else: env = self.env if env is not None: file = { sys.stdout: env.stdout, sys.stderr: env.stderr, None: env.stderr }.get(file, file) if not hasattr(file, 'buffer') and isinstance(message, str): message = message.encode(env.stdout_encoding) super()._print_message(message, file) class HTTPieManagerArgumentParser(BaseHTTPieArgumentParser): def parse_known_args(self, args=None, namespace=None): try: return super().parse_known_args(args, namespace) except SystemExit as exc: if not hasattr(self, 'root') and exc.code == 2: # Argument Parser Error raise argparse.ArgumentError(None, None) raise class HTTPieArgumentParser(BaseHTTPieArgumentParser): """Adds additional logic to `argparse.ArgumentParser`. Handles all input (CLI args, file args, stdin), applies defaults, and performs extra validation. """ def __init__(self, *args, formatter_class=HTTPieHelpFormatter, **kwargs): kwargs.setdefault('add_help', False) super().__init__(*args, formatter_class=formatter_class, **kwargs) # noinspection PyMethodOverriding def parse_args( self, env: Environment, args=None, namespace=None ) -> argparse.Namespace: self.env = env self.env.args = namespace = namespace or argparse.Namespace() self.args, no_options = super().parse_known_args(args, namespace) if self.args.debug: self.args.traceback = True self.has_stdin_data = ( self.env.stdin and not self.args.ignore_stdin and not self.env.stdin_isatty ) self.has_input_data = self.has_stdin_data or self.args.raw is not None # Arguments processing and environment setup. self._apply_no_options(no_options) self._process_request_type() self._process_download_options() self._setup_standard_streams() self._process_output_options() self._process_pretty_options() self._process_format_options() self._guess_method() self._parse_items() self._process_url() self._process_auth() self._process_ssl_cert() if self.args.raw is not None: self._body_from_input(self.args.raw) elif self.has_stdin_data: self._body_from_file(self.env.stdin) if self.args.compress: # TODO: allow --compress with --chunked / --multipart if self.args.chunked: self.error('cannot combine --compress and --chunked') if self.args.multipart: self.error('cannot combine --compress and --multipart') return self.args def _process_request_type(self): request_type = self.args.request_type self.args.json = request_type is RequestType.JSON self.args.multipart = request_type is RequestType.MULTIPART self.args.form = request_type in { RequestType.FORM, RequestType.MULTIPART, } def _process_url(self): if self.args.url.startswith('://'): # Paste URL & add space shortcut: `http ://pie.dev` → `http://pie.dev` self.args.url = self.args.url[3:] if not URL_SCHEME_RE.match(self.args.url): if os.path.basename(self.env.program_name) == 'https': scheme = 'https://' else: scheme = self.args.default_scheme + '://' # See if we're using curl style shorthand for localhost (:3000/foo) shorthand = re.match(r'^:(?!:)(\d*)(/?.*)$', self.args.url) if shorthand: port = shorthand.group(1) rest = shorthand.group(2) self.args.url = scheme + 'localhost' if port: self.args.url += ':' + port self.args.url += rest else: self.args.url = scheme + self.args.url def _setup_standard_streams(self): """ Modify `env.stdout` and `env.stdout_isatty` based on args, if needed. """ self.args.output_file_specified = bool(self.args.output_file) if self.args.download: # FIXME: Come up with a cleaner solution. if not self.args.output_file and not self.env.stdout_isatty: # Use stdout as the download output file. self.args.output_file = self.env.stdout # With `--download`, we write everything that would normally go to # `stdout` to `stderr` instead. Let's replace the stream so that # we don't have to use many `if`s throughout the codebase. # The response body will be treated separately. self.env.stdout = self.env.stderr self.env.stdout_isatty = self.env.stderr_isatty elif self.args.output_file: # When not `--download`ing, then `--output` simply replaces # `stdout`. The file is opened for appending, which isn't what # we want in this case. self.args.output_file.seek(0) try: self.args.output_file.truncate() except OSError as e: if e.errno == errno.EINVAL: # E.g. /dev/null on Linux. pass else: raise self.env.stdout = self.args.output_file self.env.stdout_isatty = False if self.args.quiet: self.env.quiet = self.args.quiet self.env.stderr = self.env.devnull if not (self.args.output_file_specified and not self.args.download): self.env.stdout = self.env.devnull self.env.apply_warnings_filter() def _process_ssl_cert(self): from httpie.ssl_ import _is_key_file_encrypted if self.args.cert_key_pass is None: self.args.cert_key_pass = SSLCredentials(None) if ( self.args.cert_key is not None and self.args.cert_key_pass.value is None and _is_key_file_encrypted(self.args.cert_key) ): self.args.cert_key_pass.prompt_password(self.args.cert_key) def _process_auth(self): # TODO: refactor & simplify this method. self.args.auth_plugin = None default_auth_plugin = plugin_manager.get_auth_plugins()[0] auth_type_set = self.args.auth_type is not None url = urlsplit(self.args.url) if self.args.auth is None and not auth_type_set: if url.username is not None: # Handle http://username:password@hostname/ username = url.username password = url.password or '' self.args.auth = AuthCredentials( key=username, value=password, sep=SEPARATOR_CREDENTIALS, orig=SEPARATOR_CREDENTIALS.join([username, password]) ) if self.args.auth is not None or auth_type_set: if not self.args.auth_type: self.args.auth_type = default_auth_plugin.auth_type plugin = plugin_manager.get_auth_plugin(self.args.auth_type)() if (not self.args.ignore_netrc and self.args.auth is None and plugin.netrc_parse): # Only host needed, so it’s OK URL not finalized. netrc_credentials = get_netrc_auth(self.args.url) if netrc_credentials: self.args.auth = AuthCredentials( key=netrc_credentials[0], value=netrc_credentials[1], sep=SEPARATOR_CREDENTIALS, orig=SEPARATOR_CREDENTIALS.join(netrc_credentials) ) if plugin.auth_require and self.args.auth is None: self.error('--auth required') plugin.raw_auth = self.args.auth self.args.auth_plugin = plugin already_parsed = isinstance(self.args.auth, AuthCredentials) if self.args.auth is None or not plugin.auth_parse: self.args.auth = plugin.get_auth() else: if already_parsed: # from the URL credentials = self.args.auth else: credentials = parse_auth(self.args.auth) if (not credentials.has_password() and plugin.prompt_password): if self.args.ignore_stdin: # Non-tty stdin read by now self.error( 'Unable to prompt for passwords because' ' --ignore-stdin is set.' ) credentials.prompt_password(url.netloc) if (credentials.key and credentials.value): plugin.raw_auth = credentials.key + ":" + credentials.value self.args.auth = plugin.get_auth( username=credentials.key, password=credentials.value, ) if not self.args.auth and self.args.ignore_netrc: # Set a no-op auth to force requests to ignore .netrc # self.args.auth = ExplicitNullAuth() def _apply_no_options(self, no_options): """For every `--no-OPTION` in `no_options`, set `args.OPTION` to its default value. This allows for un-setting of options, e.g., specified in config. """ invalid = [] for option in no_options: if not option.startswith('--no-'): invalid.append(option) continue # --no-option => --option inverted = '--' + option[5:] for action in self._actions: if inverted in action.option_strings: setattr(self.args, action.dest, action.default) break else: invalid.append(option) if invalid: self.error(f'unrecognized arguments: {" ".join(invalid)}') def _body_from_file(self, fd): """Read the data from a file-like object. Bytes are always read. """ self._ensure_one_data_source(self.args.data, self.args.files) self.args.data = getattr(fd, 'buffer', fd) def _body_from_input(self, data): """Read the data from the CLI. """ self._ensure_one_data_source(self.has_stdin_data, self.args.data, self.args.files) self.args.data = data.encode() def _ensure_one_data_source(self, *other_sources): """There can only be one source of input request data. """ if any(other_sources): self.error('Request body (from stdin, --raw or a file) and request ' 'data (key=value) cannot be mixed. Pass ' '--ignore-stdin to let key/value take priority. ' 'See https://httpie.io/docs#scripting for details.') def _guess_method(self): """Set `args.method` if not specified to either POST or GET based on whether the request has data or not. """ if self.args.method is None: # Invoked as `http URL'. assert not self.args.request_items if self.has_input_data: self.args.method = HTTP_POST else: self.args.method = HTTP_GET # FIXME: False positive, e.g., "localhost" matches but is a valid URL. elif not re.match('^[a-zA-Z]+$', self.args.method): # Invoked as `http URL item+'. The URL is now in `args.method` # and the first ITEM is now incorrectly in `args.url`. try: # Parse the URL as an ITEM and store it as the first ITEM arg. self.args.request_items.insert(0, KeyValueArgType( *SEPARATOR_GROUP_ALL_ITEMS).__call__(self.args.url)) except argparse.ArgumentTypeError as e: if self.args.traceback: raise self.error(e.args[0]) else: # Set the URL correctly self.args.url = self.args.method # Infer the method has_data = ( self.has_input_data or any( item.sep in SEPARATOR_GROUP_DATA_ITEMS for item in self.args.request_items) ) self.args.method = HTTP_POST if has_data else HTTP_GET def _parse_items(self): """ Parse `args.request_items` into `args.headers`, `args.data`, `args.params`, and `args.files`. """ try: request_items = RequestItems.from_args( request_item_args=self.args.request_items, request_type=self.args.request_type, ) except ParseError as e: if self.args.traceback: raise self.error(e.args[0]) else: self.args.headers = request_items.headers self.args.data = request_items.data self.args.files = request_items.files self.args.params = request_items.params self.args.multipart_data = request_items.multipart_data if self.args.files and not self.args.form: # `http url @/path/to/file` request_file = None for key, file in self.args.files.items(): if key != '': self.error( 'Invalid file fields (perhaps you meant --form?):' f' {",".join(self.args.files.keys())}') if request_file is not None: self.error("Can't read request from multiple files") request_file = file fn, fd, ct = request_file self.args.files = {} self._body_from_file(fd) if 'Content-Type' not in self.args.headers: content_type = get_content_type(fn) if content_type: self.args.headers['Content-Type'] = content_type def _process_output_options(self): """Apply defaults to output options, or validate the provided ones. The default output options are stdout-type-sensitive. """ def check_options(value, option): unknown = set(value) - OUTPUT_OPTIONS if unknown: self.error(f'Unknown output options: {option}={",".join(unknown)}') if self.args.verbose: self.args.all = True if self.args.output_options is None: if self.args.verbose >= 2: self.args.output_options = ''.join(OUTPUT_OPTIONS) elif self.args.verbose == 1: self.args.output_options = ''.join(BASE_OUTPUT_OPTIONS) elif self.args.offline: self.args.output_options = OUTPUT_OPTIONS_DEFAULT_OFFLINE elif not self.env.stdout_isatty: self.args.output_options = OUTPUT_OPTIONS_DEFAULT_STDOUT_REDIRECTED else: self.args.output_options = OUTPUT_OPTIONS_DEFAULT if self.args.output_options_history is None: self.args.output_options_history = self.args.output_options check_options(self.args.output_options, '--print') check_options(self.args.output_options_history, '--history-print') if self.args.download and OUT_RESP_BODY in self.args.output_options: # Response body is always downloaded with --download and it goes # through a different routine, so we remove it. self.args.output_options = str( set(self.args.output_options) - set(OUT_RESP_BODY)) def _process_pretty_options(self): if self.args.prettify == PRETTY_STDOUT_TTY_ONLY: self.args.prettify = PRETTY_MAP[ 'all' if self.env.stdout_isatty else 'none'] elif (self.args.prettify and self.env.is_windows and self.args.output_file): self.error('Only terminal output can be colorized on Windows.') else: # noinspection PyTypeChecker self.args.prettify = PRETTY_MAP[self.args.prettify] def _process_download_options(self): if self.args.offline: self.args.download = False self.args.download_resume = False return if not self.args.download: if self.args.download_resume: self.error('--continue only works with --download') if self.args.download_resume and not ( self.args.download and self.args.output_file): self.error('--continue requires --output to be specified') def _process_format_options(self): format_options = self.args.format_options or [] parsed_options = PARSED_DEFAULT_FORMAT_OPTIONS for options_group in format_options: parsed_options = parse_format_options(options_group, defaults=parsed_options) self.args.format_options = parsed_options def print_manual(self): from httpie.output.ui import man_pages if man_pages.is_available(self.env.program_name): man_pages.display_for(self.env, self.env.program_name) return None text = self.format_help() with self.env.rich_console.pager(): self.env.rich_console.print( text, highlight=False ) def print_usage(self, file): from rich.text import Text from httpie.output.ui import rich_help whitelist = set() _, exception, _ = sys.exc_info() if ( isinstance(exception, argparse.ArgumentError) and len(exception.args) >= 1 and isinstance(exception.args[0], argparse.Action) and exception.args[0].option_strings ): # add_usage path is also taken when you pass an invalid option, # e.g --style=invalid. If something like that happens, we want # to include to action that caused to the invalid usage into # the list of actions we are displaying. whitelist.add(exception.args[0].option_strings[0]) usage_text = Text('usage', style='bold') usage_text.append(':\n ') usage_text.append(rich_help.to_usage(self.spec, whitelist=whitelist)) self.env.rich_error_console.print(usage_text) def error(self, message): """Prints a usage message incorporating the message to stderr and exits.""" self.print_usage(sys.stderr) self.env.rich_error_console.print( dedent( f''' [bold]error[/bold]: {message} [bold]for more information[/bold]: run '{self.prog} --help' or visit https://httpie.io/docs/cli '''.rstrip() ) ) self.exit(2) cli-3.2.4/httpie/cli/argtypes.py000066400000000000000000000174671471121002400165520ustar00rootroot00000000000000import argparse import getpass import os import sys from copy import deepcopy from typing import List, Optional, Union from .constants import DEFAULT_FORMAT_OPTIONS, SEPARATOR_CREDENTIALS from ..sessions import VALID_SESSION_NAME_PATTERN class KeyValueArg: """Base key-value pair parsed from CLI.""" def __init__(self, key: str, value: Optional[str], sep: str, orig: str): self.key = key self.value = value self.sep = sep self.orig = orig def __eq__(self, other: 'KeyValueArg'): return self.__dict__ == other.__dict__ def __repr__(self): return repr(self.__dict__) class SessionNameValidator: def __init__(self, error_message: str): self.error_message = error_message def __call__(self, value: str) -> str: # Session name can be a path or just a name. if (os.path.sep not in value and not VALID_SESSION_NAME_PATTERN.search(value)): raise argparse.ArgumentError(None, self.error_message) return value class Escaped(str): """Represents an escaped character.""" def __repr__(self): return f"Escaped({repr(str(self))})" class KeyValueArgType: """A key-value pair argument type used with `argparse`. Parses a key-value arg and constructs a `KeyValueArg` instance. Used for headers, form data, and other key-value pair types. """ key_value_class = KeyValueArg def __init__(self, *separators: str): self.separators = separators self.special_characters = set() for separator in separators: self.special_characters.update(separator) def __call__(self, s: str) -> KeyValueArg: """Parse raw string arg and return `self.key_value_class` instance. The best of `self.separators` is determined (first found, longest). Back slash escaped characters aren't considered as separators (or parts thereof). Literal back slash characters have to be escaped as well (r'\\'). """ tokens = self.tokenize(s) # Sorting by length ensures that the longest one will be # chosen as it will overwrite any shorter ones starting # at the same position in the `found` dictionary. separators = sorted(self.separators, key=len) for i, token in enumerate(tokens): if isinstance(token, Escaped): continue found = {} for sep in separators: pos = token.find(sep) if pos != -1: found[pos] = sep if found: # Starting first, longest separator found. sep = found[min(found.keys())] key, value = token.split(sep, 1) # Any preceding tokens are part of the key. key = ''.join(tokens[:i]) + key # Any following tokens are part of the value. value += ''.join(tokens[i + 1:]) break else: raise argparse.ArgumentTypeError(f'{s!r} is not a valid value') return self.key_value_class(key=key, value=value, sep=sep, orig=s) def tokenize(self, s: str) -> List[Union[str, Escaped]]: r"""Tokenize the raw arg string There are only two token types - strings and escaped characters: >>> KeyValueArgType('=').tokenize(r'foo\=bar\\baz') ['foo', Escaped('='), 'bar\\\\baz'] """ tokens = [''] characters = iter(s) for char in characters: if char == '\\': char = next(characters, '') if char not in self.special_characters: tokens[-1] += '\\' + char else: tokens.extend([Escaped(char), '']) else: tokens[-1] += char return tokens class PromptMixin: def _prompt_password(self, prompt: str) -> str: prompt_text = f'http: {prompt}: ' try: return self._getpass(prompt_text) except (EOFError, KeyboardInterrupt): sys.stderr.write('\n') sys.exit(0) @staticmethod def _getpass(prompt): # To allow easy mocking. return getpass.getpass(str(prompt)) class SSLCredentials(PromptMixin): """Represents the passphrase for the certificate's key.""" def __init__(self, value: Optional[str]) -> None: self.value = value def prompt_password(self, key_file: str) -> None: self.value = self._prompt_password(f'passphrase for {key_file}') class AuthCredentials(KeyValueArg, PromptMixin): """Represents parsed credentials.""" def has_password(self) -> bool: return self.value is not None def prompt_password(self, host: str) -> None: self.value = self._prompt_password(f'password for {self.key}@{host}:') class AuthCredentialsArgType(KeyValueArgType): """A key-value arg type that parses credentials.""" key_value_class = AuthCredentials def __call__(self, s): """Parse credentials from `s`. ("username" or "username:password"). """ try: return super().__call__(s) except argparse.ArgumentTypeError: # No password provided, will prompt for it later. return self.key_value_class( key=s, value=None, sep=SEPARATOR_CREDENTIALS, orig=s ) parse_auth = AuthCredentialsArgType(SEPARATOR_CREDENTIALS) def readable_file_arg(filename): try: with open(filename, 'rb'): return filename except OSError as ex: raise argparse.ArgumentTypeError(f'{ex.filename}: {ex.strerror}') def parse_format_options(s: str, defaults: Optional[dict]) -> dict: """ Parse `s` and update `defaults` with the parsed values. >>> parse_format_options( ... defaults={'json': {'indent': 4, 'sort_keys': True}}, ... s='json.indent:2,json.sort_keys:False', ... ) {'json': {'indent': 2, 'sort_keys': False}} """ value_map = { 'true': True, 'false': False, } options = deepcopy(defaults or {}) for option in s.split(','): try: path, value = option.lower().split(':') section, key = path.split('.') except ValueError: raise argparse.ArgumentTypeError(f'invalid option {option!r}') if value in value_map: parsed_value = value_map[value] else: if value.isnumeric(): parsed_value = int(value) else: parsed_value = value if defaults is None: options.setdefault(section, {}) else: try: default_value = defaults[section][key] except KeyError: raise argparse.ArgumentTypeError( f'invalid key {path!r}') default_type, parsed_type = type(default_value), type(parsed_value) if parsed_type is not default_type: raise argparse.ArgumentTypeError( 'invalid value' f' {value!r} in {option!r}' f' (expected {default_type.__name__}' f' got {parsed_type.__name__})' ) options[section][key] = parsed_value return options PARSED_DEFAULT_FORMAT_OPTIONS = parse_format_options( s=','.join(DEFAULT_FORMAT_OPTIONS), defaults=None, ) def response_charset_type(encoding: str) -> str: try: ''.encode(encoding) except LookupError: raise argparse.ArgumentTypeError( f'{encoding!r} is not a supported encoding') return encoding def response_mime_type(mime_type: str) -> str: if mime_type.count('/') != 1: raise argparse.ArgumentTypeError( f'{mime_type!r} doesn’t look like a mime type; use type/subtype') return mime_type cli-3.2.4/httpie/cli/constants.py000066400000000000000000000062561471121002400167220ustar00rootroot00000000000000"""Parsing and processing of CLI input (args, auth credentials, files, stdin). """ import enum import re URL_SCHEME_RE = re.compile(r'^[a-z][a-z0-9.+-]*://', re.IGNORECASE) HTTP_POST = 'POST' HTTP_GET = 'GET' HTTP_OPTIONS = 'OPTIONS' # Various separators used in args SEPARATOR_HEADER = ':' SEPARATOR_HEADER_EMPTY = ';' SEPARATOR_CREDENTIALS = ':' SEPARATOR_PROXY = ':' SEPARATOR_HEADER_EMBED = ':@' SEPARATOR_DATA_STRING = '=' SEPARATOR_DATA_RAW_JSON = ':=' SEPARATOR_FILE_UPLOAD = '@' SEPARATOR_FILE_UPLOAD_TYPE = ';type=' # in already parsed file upload path only SEPARATOR_DATA_EMBED_FILE_CONTENTS = '=@' SEPARATOR_DATA_EMBED_RAW_JSON_FILE = ':=@' SEPARATOR_QUERY_PARAM = '==' SEPARATOR_QUERY_EMBED_FILE = '==@' # Separators that become request data SEPARATOR_GROUP_DATA_ITEMS = frozenset({ SEPARATOR_DATA_STRING, SEPARATOR_DATA_RAW_JSON, SEPARATOR_FILE_UPLOAD, SEPARATOR_DATA_EMBED_FILE_CONTENTS, SEPARATOR_DATA_EMBED_RAW_JSON_FILE }) SEPARATORS_GROUP_MULTIPART = frozenset({ SEPARATOR_DATA_STRING, SEPARATOR_DATA_EMBED_FILE_CONTENTS, SEPARATOR_FILE_UPLOAD, }) # Separators for items whose value is a filename to be embedded SEPARATOR_GROUP_DATA_EMBED_ITEMS = frozenset({ SEPARATOR_HEADER_EMBED, SEPARATOR_QUERY_EMBED_FILE, SEPARATOR_DATA_EMBED_FILE_CONTENTS, SEPARATOR_DATA_EMBED_RAW_JSON_FILE, }) # Separators for nested JSON items SEPARATOR_GROUP_NESTED_JSON_ITEMS = frozenset([ SEPARATOR_DATA_STRING, SEPARATOR_DATA_RAW_JSON, SEPARATOR_DATA_EMBED_FILE_CONTENTS, SEPARATOR_DATA_EMBED_RAW_JSON_FILE, ]) # Separators allowed in ITEM arguments SEPARATOR_GROUP_ALL_ITEMS = frozenset({ SEPARATOR_HEADER, SEPARATOR_HEADER_EMPTY, SEPARATOR_HEADER_EMBED, SEPARATOR_QUERY_PARAM, SEPARATOR_QUERY_EMBED_FILE, SEPARATOR_DATA_STRING, SEPARATOR_DATA_RAW_JSON, SEPARATOR_FILE_UPLOAD, SEPARATOR_DATA_EMBED_FILE_CONTENTS, SEPARATOR_DATA_EMBED_RAW_JSON_FILE, }) # Output options OUT_REQ_HEAD = 'H' OUT_REQ_BODY = 'B' OUT_RESP_HEAD = 'h' OUT_RESP_BODY = 'b' OUT_RESP_META = 'm' BASE_OUTPUT_OPTIONS = frozenset({ OUT_REQ_HEAD, OUT_REQ_BODY, OUT_RESP_HEAD, OUT_RESP_BODY, }) OUTPUT_OPTIONS = frozenset({ *BASE_OUTPUT_OPTIONS, OUT_RESP_META, }) # Pretty class PrettyOptions(enum.Enum): STDOUT_TTY_ONLY = enum.auto() PRETTY_MAP = { 'all': ['format', 'colors'], 'colors': ['colors'], 'format': ['format'], 'none': [] } PRETTY_STDOUT_TTY_ONLY = PrettyOptions.STDOUT_TTY_ONLY DEFAULT_FORMAT_OPTIONS = [ 'headers.sort:true', 'json.format:true', 'json.indent:4', 'json.sort_keys:true', 'xml.format:true', 'xml.indent:2', ] SORTED_FORMAT_OPTIONS = [ 'headers.sort:true', 'json.sort_keys:true', ] SORTED_FORMAT_OPTIONS_STRING = ','.join(SORTED_FORMAT_OPTIONS) UNSORTED_FORMAT_OPTIONS_STRING = ','.join( option.replace('true', 'false') for option in SORTED_FORMAT_OPTIONS) # Defaults OUTPUT_OPTIONS_DEFAULT = OUT_RESP_HEAD + OUT_RESP_BODY OUTPUT_OPTIONS_DEFAULT_STDOUT_REDIRECTED = OUT_RESP_BODY OUTPUT_OPTIONS_DEFAULT_OFFLINE = OUT_REQ_HEAD + OUT_REQ_BODY class RequestType(enum.Enum): FORM = enum.auto() MULTIPART = enum.auto() JSON = enum.auto() cli-3.2.4/httpie/cli/definition.py000066400000000000000000000707271471121002400170420ustar00rootroot00000000000000from __future__ import annotations import os import textwrap from argparse import FileType from httpie import __doc__, __version__ from httpie.cli.argtypes import (KeyValueArgType, SessionNameValidator, SSLCredentials, readable_file_arg, response_charset_type, response_mime_type) from httpie.cli.constants import (BASE_OUTPUT_OPTIONS, DEFAULT_FORMAT_OPTIONS, OUT_REQ_BODY, OUT_REQ_HEAD, OUT_RESP_BODY, OUT_RESP_HEAD, OUT_RESP_META, OUTPUT_OPTIONS, OUTPUT_OPTIONS_DEFAULT, PRETTY_MAP, PRETTY_STDOUT_TTY_ONLY, SEPARATOR_GROUP_ALL_ITEMS, SEPARATOR_PROXY, SORTED_FORMAT_OPTIONS_STRING, UNSORTED_FORMAT_OPTIONS_STRING, RequestType) from httpie.cli.options import ParserSpec, Qualifiers, to_argparse from httpie.output.formatters.colors import (AUTO_STYLE, DEFAULT_STYLE, BUNDLED_STYLES, get_available_styles) from httpie.plugins.builtin import BuiltinAuthPlugin from httpie.plugins.registry import plugin_manager from httpie.ssl_ import AVAILABLE_SSL_VERSION_ARG_MAPPING, DEFAULT_SSL_CIPHERS_STRING # Man pages are static (built when making a release). # We use this check to not include generated, system-specific information there (e.g., default --ciphers). IS_MAN_PAGE = bool(os.environ.get('HTTPIE_BUILDING_MAN_PAGES')) options = ParserSpec( 'http', description=f'{__doc__.strip()} ', epilog=""" For every --OPTION there is also a --no-OPTION that reverts OPTION to its default value. Suggestions and bug reports are greatly appreciated: https://github.com/httpie/cli/issues """, source_file=__file__ ) ####################################################################### # Positional arguments. ####################################################################### positional_arguments = options.add_group( 'Positional arguments', description=""" These arguments come after any flags and in the order they are listed here. Only URL is required. """, ) positional_arguments.add_argument( dest='method', metavar='METHOD', nargs=Qualifiers.OPTIONAL, default=None, short_help='The HTTP method to be used for the request (GET, POST, PUT, DELETE, ...).', help=""" The HTTP method to be used for the request (GET, POST, PUT, DELETE, ...). This argument can be omitted in which case HTTPie will use POST if there is some data to be sent, otherwise GET: $ http example.org # => GET $ http example.org hello=world # => POST """, ) positional_arguments.add_argument( dest='url', metavar='URL', short_help='The request URL.', help=""" The request URL. Scheme defaults to 'http://' if the URL does not include one. (You can override this with: --default-scheme=http/https) You can also use a shorthand for localhost $ http :3000 # => http://localhost:3000 $ http :/foo # => http://localhost/foo """, ) positional_arguments.add_argument( dest='request_items', metavar='REQUEST_ITEM', nargs=Qualifiers.ZERO_OR_MORE, default=None, type=KeyValueArgType(*SEPARATOR_GROUP_ALL_ITEMS), short_help=( 'HTTPie’s request items syntax for specifying HTTP headers, JSON/Form' 'data, files, and URL parameters.' ), nested_options=[ ('HTTP Headers', 'Name:Value', 'Arbitrary HTTP header, e.g X-API-Token:123'), ('URL Parameters', 'name==value', 'Querystring parameter to the URL, e.g limit==50'), ('Data Fields', 'field=value', 'Data fields to be serialized as JSON (default) or Form Data (with --form)'), ('Raw JSON Fields', 'field:=json', 'Data field for real JSON types.'), ('File upload Fields', 'field@/dir/file', 'Path field for uploading a file.'), ], help=r""" Optional key-value pairs to be included in the request. The separator used determines the type: ':' HTTP headers: Referer:https://httpie.io Cookie:foo=bar User-Agent:bacon/1.0 '==' URL parameters to be appended to the request URI: search==httpie '=' Data fields to be serialized into a JSON object (with --json, -j) or form data (with --form, -f): name=HTTPie language=Python description='CLI HTTP client' ':=' Non-string JSON data fields (only with --json, -j): awesome:=true amount:=42 colors:='["red", "green", "blue"]' '@' Form file fields (only with --form or --multipart): cv@~/Documents/CV.pdf cv@'~/Documents/CV.pdf;type=application/pdf' '=@' A data field like '=', but takes a file path and embeds its content: essay=@Documents/essay.txt ':=@' A raw JSON field like ':=', but takes a file path and embeds its content: package:=@./package.json You can use a backslash to escape a colliding separator in the field name: field-name-with\:colon=value """, ) ####################################################################### # Content type. ####################################################################### content_types = options.add_group('Predefined content types') content_types.add_argument( '--json', '-j', action='store_const', const=RequestType.JSON, dest='request_type', short_help='(default) Serialize data items from the command line as a JSON object.', help=""" (default) Data items from the command line are serialized as a JSON object. The Content-Type and Accept headers are set to application/json (if not specified). """, ) content_types.add_argument( '--form', '-f', action='store_const', const=RequestType.FORM, dest='request_type', short_help='Serialize data items from the command line as form field data.', help=""" Data items from the command line are serialized as form fields. The Content-Type is set to application/x-www-form-urlencoded (if not specified). The presence of any file fields results in a multipart/form-data request. """, ) content_types.add_argument( '--multipart', action='store_const', const=RequestType.MULTIPART, dest='request_type', short_help=( 'Similar to --form, but always sends a multipart/form-data ' 'request (i.e., even without files).' ) ) content_types.add_argument( '--boundary', short_help=( 'Specify a custom boundary string for multipart/form-data requests. ' 'Only has effect only together with --form.' ) ) content_types.add_argument( '--raw', short_help='Pass raw request data without extra processing.', help=""" This option allows you to pass raw request data without extra processing (as opposed to the structured request items syntax): $ http --raw='data' pie.dev/post You can achieve the same by piping the data via stdin: $ echo data | http pie.dev/post Or have HTTPie load the raw data from a file: $ http pie.dev/post @data.txt """, ) ####################################################################### # Content processing. ####################################################################### processing_options = options.add_group('Content processing options') processing_options.add_argument( '--compress', '-x', action='count', default=0, short_help='Compress the content with Deflate algorithm.', help=""" Content compressed (encoded) with Deflate algorithm. The Content-Encoding header is set to deflate. Compression is skipped if it appears that compression ratio is negative. Compression can be forced by repeating the argument. """, ) ####################################################################### # Output processing ####################################################################### def format_style_help(available_styles, *, isolation_mode: bool = False): text = """ Output coloring style (default is "{default}"). It can be one of: {available_styles} """ if isolation_mode: text += '\n\n' text += 'For finding out all available styles in your system, try:\n\n' text += ' $ http --style\n' text += textwrap.dedent(""" The "{auto_style}" style follows your terminal's ANSI color styles. For non-{auto_style} styles to work properly, please make sure that the $TERM environment variable is set to "xterm-256color" or similar (e.g., via `export TERM=xterm-256color' in your ~/.bashrc). """) if isolation_mode: available_styles = sorted(BUNDLED_STYLES) available_styles_text = '\n'.join( f' {line.strip()}' for line in textwrap.wrap(', '.join(available_styles), 60) ).strip() return text.format( default=DEFAULT_STYLE, available_styles=available_styles_text, auto_style=AUTO_STYLE, ) _sorted_kwargs = { 'action': 'append_const', 'const': SORTED_FORMAT_OPTIONS_STRING, 'dest': 'format_options', } _unsorted_kwargs = { 'action': 'append_const', 'const': UNSORTED_FORMAT_OPTIONS_STRING, 'dest': 'format_options', } output_processing = options.add_group('Output processing') output_processing.add_argument( '--pretty', dest='prettify', default=PRETTY_STDOUT_TTY_ONLY, choices=sorted(PRETTY_MAP.keys()), short_help='Control the processing of console outputs.', help=""" Controls output processing. The value can be "none" to not prettify the output (default for redirected output), "all" to apply both colors and formatting (default for terminal output), "colors", or "format". """, ) output_processing.add_argument( '--style', '-s', dest='style', metavar='STYLE', default=DEFAULT_STYLE, action='lazy_choices', getter=get_available_styles, short_help=f'Output coloring style (default is "{DEFAULT_STYLE}").', help_formatter=format_style_help, ) # The closest approx. of the documented resetting to default via --no- cli-3.2.4/tests/fixtures/xmldata/valid/simple-single-tag_raw.xml000066400000000000000000000000101471121002400247260ustar00rootroot00000000000000 cli-3.2.4/tests/fixtures/xmldata/valid/simple-standalone-no_formatted.xml000066400000000000000000000001271471121002400266430ustar00rootroot00000000000000 ........ cli-3.2.4/tests/fixtures/xmldata/valid/simple-standalone-no_raw.xml000066400000000000000000000001261471121002400254460ustar00rootroot00000000000000 ........ cli-3.2.4/tests/fixtures/xmldata/valid/simple-standalone-yes_formatted.xml000066400000000000000000000001301471121002400270210ustar00rootroot00000000000000 ........ cli-3.2.4/tests/fixtures/xmldata/valid/simple-standalone-yes_raw.xml000066400000000000000000000001271471121002400256330ustar00rootroot00000000000000 ........ cli-3.2.4/tests/fixtures/xmldata/valid/simple_formatted.xml000066400000000000000000000001721471121002400241030ustar00rootroot00000000000000 text text tail cli-3.2.4/tests/fixtures/xmldata/valid/simple_raw.xml000066400000000000000000000001541471121002400227070ustar00rootroot00000000000000texttexttail cli-3.2.4/tests/fixtures/xmldata/xhtml/000077500000000000000000000000001471121002400200605ustar00rootroot00000000000000cli-3.2.4/tests/fixtures/xmldata/xhtml/xhtml_formatted.xml000066400000000000000000000017321471121002400240060ustar00rootroot00000000000000 XHTML 1.0 Strict Example