doxx-0.1.4/.cargo_vcs_info.json0000644000000001361046102023000120420ustar { "git": { "sha1": "d6b39f35faf9f1c9fed78535949b3e1e751773d4" }, "path_in_vcs": "" }doxx-0.1.4/.gitattributes000064400000000000000000000004041046102023000135010ustar 00000000000000# Auto detect text files and perform LF normalization * text=auto # Ensure Rust files always use LF *.rs text eol=lf *.toml text eol=lf *.md text eol=lf *.yml text eol=lf *.yaml text eol=lf # Binary files *.docx binary *.png binary *.jpg binary *.jpeg binarydoxx-0.1.4/.github/ISSUE_TEMPLATE/bug_report.md000064400000000000000000000015531046102023000170310ustar 00000000000000--- name: Bug Report about: Report a bug or issue with doxx title: '[BUG] ' labels: bug assignees: '' --- ## Description ## Steps to Reproduce 1. 2. 3. ## Expected Behavior ## Actual Behavior ## Environment - **doxx version**: - **OS**: - **Installation method**: ## Document Details (if applicable) - **File size**: - **Can you share the file?**: ## Error Message ``` Paste error message here ``` ## Additional Context doxx-0.1.4/.github/ISSUE_TEMPLATE/feature_request.md000064400000000000000000000012741046102023000200640ustar 00000000000000--- name: Feature Request about: Suggest a new feature or enhancement title: '[FEATURE] ' labels: enhancement assignees: '' --- ## Feature Description ## Problem or Use Case ## Proposed Solution ## Alternatives Considered ## Additional Context ## Implementation Notes doxx-0.1.4/.github/ISSUE_TEMPLATE/release.md000064400000000000000000000027231046102023000163010ustar 00000000000000--- name: Release about: Track a new version release title: 'Release vX.Y.Z' labels: release assignees: '' --- ## Release Version **Version:** vX.Y.Z ## Pre-Release Checklist - [ ] All tests passing: `cargo test` - [ ] No clippy warnings: `cargo clippy` - [ ] Code is formatted: `cargo fmt --check` - [ ] CHANGELOG.md updated with new version changes - [ ] Version bumped in `Cargo.toml` - [ ] Test binary works: `cargo run --release -- tests/fixtures/comprehensive.docx` ## Create Release - [ ] Commit version bump: `git commit -m "chore: release X.Y.Z"` - [ ] Push to main: `git push` - [ ] Create version tag: `git tag vX.Y.Z` - [ ] Push tag: `git push origin vX.Y.Z` - [ ] Wait for GitHub Actions workflows to complete (~10-15 minutes) ## Automated Release Verification All publishing is automated. Verify these workflows complete successfully: ### Core Release (`.github/workflows/release.yml`) - [ ] GitHub Release created at https://github.com/bgreenwell/doxx/releases/tag/vX.Y.Z - [ ] All artifacts present (binaries, tarballs, installers, checksums) - [ ] Homebrew formula published to [homebrew-doxx](https://github.com/bgreenwell/homebrew-doxx) - [ ] Published to [crates.io](https://crates.io/crates/doxx) ### Distribution Workflows - [ ] Scoop manifest published — `.github/workflows/publish-scoop.yml` - [ ] AUR package updated — `.github/workflows/publish-aur.yml` - [ ] WinGet PR created — `.github/workflows/publish-winget.yml` (may take 1-2 days to merge) doxx-0.1.4/.github/dependabot.yml.disabled000064400000000000000000000024111046102023000165440ustar 00000000000000# GitHub Dependabot configuration for doxx - DISABLED # See: https://docs.github.com/en/code-security/dependabot # # This is disabled during early development to avoid PR spam. # Rename to dependabot.yml when project is stable and ready for automated dependency updates. version: 2 updates: # Rust dependencies - package-ecosystem: "cargo" directory: "/" schedule: interval: "weekly" day: "monday" time: "09:00" timezone: "UTC" open-pull-requests-limit: 3 reviewers: - "bgreenwell" assignees: - "bgreenwell" commit-message: prefix: "deps" include: "scope" labels: - "dependencies" - "rust" # Group ALL updates to reduce PR noise groups: rust-dependencies: patterns: - "*" update-types: - "minor" - "patch" - "major" # GitHub Actions - package-ecosystem: "github-actions" directory: "/" schedule: interval: "weekly" day: "monday" time: "09:00" timezone: "UTC" open-pull-requests-limit: 2 reviewers: - "bgreenwell" assignees: - "bgreenwell" commit-message: prefix: "ci" include: "scope" labels: - "dependencies" - "github-actions"doxx-0.1.4/.github/workflows/ci.yml000064400000000000000000000025221046102023000153240ustar 00000000000000name: CI on: push: branches: [main] pull_request: branches: [main] env: CARGO_TERM_COLOR: always jobs: test: name: Build and Test runs-on: ${{ matrix.os }} strategy: matrix: os: [ubuntu-latest, windows-latest, macos-latest] steps: - name: Checkout code uses: actions/checkout@v5 - name: Install Rust uses: dtolnay/rust-toolchain@stable with: components: rustfmt, clippy - name: Install system dependencies (Linux) if: matrix.os == 'ubuntu-latest' run: | sudo apt-get update sudo apt-get install -y libxcb-shape0-dev libxcb-xfixes0-dev - name: Cache dependencies uses: Swatinem/rust-cache@v2 - name: Check formatting (Unix only) if: matrix.os != 'windows-latest' run: cargo fmt --all -- --check - name: Lint with Clippy run: cargo clippy --all-targets -- -D warnings - name: Run tests run: cargo test - name: Check build run: cargo build --release # Nix build - name: Install Nix if: matrix.os != 'windows-latest' uses: cachix/install-nix-action@v31 with: nix_path: nixpkgs=channel:nixos-unstable - name: Build with Nix if: matrix.os != 'windows-latest' run: nix build doxx-0.1.4/.github/workflows/docs.yml000064400000000000000000000033171046102023000156640ustar 00000000000000name: Deploy Documentation on: push: branches: ["main"] workflow_dispatch: permissions: contents: read pages: write id-token: write concurrency: group: "pages" cancel-in-progress: false jobs: build: if: ${{ github.actor == 'bgreenwell' }} runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v5 - name: Install Rust uses: dtolnay/rust-toolchain@stable - name: Cache dependencies uses: Swatinem/rust-cache@v2 - name: Build documentation run: cargo doc --no-deps - name: Create redirect page run: echo '' > target/doc/index.html - name: Setup Pages id: pages uses: actions/configure-pages@v5 continue-on-error: true - name: Upload artifact uses: actions/upload-pages-artifact@v3 with: path: "./target/doc" deploy: environment: name: github-pages url: ${{ steps.deployment.outputs.page_url }} runs-on: ubuntu-latest needs: build if: success() steps: - name: Deploy to GitHub Pages id: deployment uses: actions/deploy-pages@v4 continue-on-error: true - name: Pages deployment status run: | if [ "${{ steps.deployment.outcome }}" == "failure" ]; then echo "::warning::GitHub Pages deployment failed. Please enable Pages in repository settings:" echo "::warning::1. Go to Settings > Pages" echo "::warning::2. Set Source to 'GitHub Actions'" echo "::warning::3. Re-run this workflow" else echo "Documentation deployed successfully!" fi doxx-0.1.4/.github/workflows/publish-aur.yml000064400000000000000000000100051046102023000171570ustar 00000000000000name: Publish to AUR on: push: tags: ['v*'] workflow_dispatch: inputs: tag: description: 'Release tag to publish (e.g., v0.2.5)' required: true type: string permissions: contents: read jobs: publish-aur: runs-on: ubuntu-22.04 if: ${{ !contains(github.ref_name, '-') || github.event_name == 'workflow_dispatch' }} steps: - name: Determine release version id: get-version run: | if [ "${{ github.event_name }}" == "workflow_dispatch" ]; then TAG="${{ inputs.tag }}" else TAG="${{ github.ref_name }}" fi VERSION="${TAG#v}" echo "version=$VERSION" >> "$GITHUB_OUTPUT" echo "tag=$TAG" >> "$GITHUB_OUTPUT" - name: Checkout doxx repository uses: actions/checkout@v4 with: path: doxx - name: Download release tarball and SHA256 run: | VERSION="${{ steps.get-version.outputs.version }}" TARBALL="doxx-x86_64-unknown-linux-gnu.tar.xz" SHA_FILE="${TARBALL}.sha256" cd doxx gh release download "v${VERSION}" \ --pattern "$SHA_FILE" SHA256=$(cat "$SHA_FILE" | cut -d ' ' -f 1) echo "sha256=$SHA256" >> $GITHUB_OUTPUT echo "tarball=$TARBALL" >> $GITHUB_OUTPUT env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} id: download - name: Generate PKGBUILD run: | VERSION="${{ steps.get-version.outputs.version }}" SHA256="${{ steps.download.outputs.sha256 }}" TARBALL="${{ steps.download.outputs.tarball }}" cat > PKGBUILD << 'EOF' # Maintainer: Brandon Greenwell pkgname=doxx-bin pkgver=VERSION_PLACEHOLDER pkgrel=1 pkgdesc="Terminal document viewer for .docx files" url="https://github.com/bgreenwell/doxx" license=("MIT") arch=("x86_64") provides=("doxx") conflicts=("doxx") source=("https://github.com/bgreenwell/doxx/releases/download/v$pkgver/TARBALL_PLACEHOLDER") sha256sums=("SHA256_PLACEHOLDER") package() { cd "$srcdir/doxx-x86_64-unknown-linux-gnu" install -Dm755 doxx -t "$pkgdir/usr/bin" install -Dm644 LICENSE "$pkgdir/usr/share/licenses/$pkgname/LICENSE" } EOF sed -i "s/VERSION_PLACEHOLDER/$VERSION/" PKGBUILD sed -i "s/TARBALL_PLACEHOLDER/$TARBALL/" PKGBUILD sed -i "s/SHA256_PLACEHOLDER/$SHA256/" PKGBUILD - name: Generate .SRCINFO uses: addnab/docker-run-action@v3 with: image: archlinux:latest options: -v ${{ github.workspace }}:/workspace run: | cd /workspace useradd -m builder chown -R builder:builder . su builder -c 'makepkg --printsrcinfo' > .SRCINFO - name: Fix permissions after Docker run: | sudo chown -R $USER:$USER ${{ github.workspace }} - name: Setup SSH for AUR uses: webfactory/ssh-agent@v0.9.0 with: ssh-private-key: ${{ secrets.AUR_SSH_PRIVATE_KEY }} - name: Configure SSH for AUR run: | mkdir -p ~/.ssh ssh-keyscan -t rsa,ecdsa,ed25519 aur.archlinux.org >> ~/.ssh/known_hosts - name: Clone AUR repository run: | git clone ssh://aur@aur.archlinux.org/doxx-bin.git aur-repo - name: Update AUR repository run: | VERSION="${{ steps.get-version.outputs.version }}" cp PKGBUILD aur-repo/ cp .SRCINFO aur-repo/ cd aur-repo git config user.name "Brandon Greenwell" git config user.email "greenwell.brandon@gmail.com" git add PKGBUILD .SRCINFO if git diff --staged --quiet; then echo "No changes to commit" else git commit -m "Update to v${VERSION}" git push origin master fi doxx-0.1.4/.github/workflows/publish-scoop.yml000064400000000000000000000061261046102023000175240ustar 00000000000000name: Publish Scoop Manifest on: push: tags: ['v*'] workflow_dispatch: inputs: tag: description: 'Release tag to publish (e.g., v0.2.5)' required: true type: string permissions: contents: read jobs: publish-scoop: runs-on: ubuntu-22.04 if: ${{ !contains(github.ref_name, '-') || github.event_name == 'workflow_dispatch' }} env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_USER: "axo bot" GITHUB_EMAIL: "admin+bot@axo.dev" steps: - name: Determine release tag id: get-tag run: | if [ "${{ github.event_name }}" == "workflow_dispatch" ]; then echo "tag=${{ inputs.tag }}" >> "$GITHUB_OUTPUT" else echo "tag=${{ github.ref_name }}" >> "$GITHUB_OUTPUT" fi - name: Checkout Scoop bucket uses: actions/checkout@v4 with: repository: bgreenwell/scoop-bucket token: ${{ secrets.SCOOP_BUCKET_TOKEN }} path: scoop-bucket - name: Download release artifacts run: | TAG="${{ steps.get-tag.outputs.tag }}" VERSION="${TAG#v}" ZIP_FILE="doxx-x86_64-pc-windows-msvc.zip" SHA_FILE="${ZIP_FILE}.sha256" gh release download "$TAG" \ --repo bgreenwell/doxx \ --pattern "$ZIP_FILE" \ --pattern "$SHA_FILE" echo "VERSION=$VERSION" >> $GITHUB_ENV echo "ZIP_FILE=$ZIP_FILE" >> $GITHUB_ENV echo "SHA_FILE=$SHA_FILE" >> $GITHUB_ENV - name: Generate Scoop manifest run: | SHA256=$(cat "$SHA_FILE" | cut -d ' ' -f 1) DOWNLOAD_URL="https://github.com/bgreenwell/doxx/releases/download/v${VERSION}/${ZIP_FILE}" mkdir -p scoop-bucket/bucket jq -n \ --arg version "${VERSION}" \ --arg url "${DOWNLOAD_URL}" \ --arg hash "${SHA256}" \ '{ version: $version, description: "Terminal document viewer for .docx files", homepage: "https://github.com/bgreenwell/doxx", license: "MIT", architecture: { "64bit": { url: $url, hash: $hash } }, bin: "doxx.exe", checkver: { github: "https://github.com/bgreenwell/doxx" }, autoupdate: { architecture: { "64bit": { url: "https://github.com/bgreenwell/doxx/releases/download/v$version/doxx-x86_64-pc-windows-msvc.zip" } } } }' > scoop-bucket/bucket/doxx.json - name: Commit and push manifest working-directory: scoop-bucket run: | git config user.name "${GITHUB_USER}" git config user.email "${GITHUB_EMAIL}" git add bucket/doxx.json if git diff --staged --quiet; then echo "No changes to commit" else git commit -m "doxx ${VERSION}" git push fi doxx-0.1.4/.github/workflows/publish-winget.yml000064400000000000000000000026641046102023000177010ustar 00000000000000name: Publish to WinGet on: push: tags: ['v*'] workflow_dispatch: inputs: tag: description: 'Release tag to publish (e.g., v0.2.5)' required: true type: string permissions: contents: read jobs: publish-winget: runs-on: ubuntu-latest if: ${{ !contains(github.ref_name, '-') || github.event_name == 'workflow_dispatch' }} steps: - name: Determine release version id: get-version run: | if [ "${{ github.event_name }}" == "workflow_dispatch" ]; then TAG="${{ inputs.tag }}" else TAG="${{ github.ref_name }}" fi VERSION="${TAG#v}" echo "version=$VERSION" >> "$GITHUB_OUTPUT" echo "tag=$TAG" >> "$GITHUB_OUTPUT" - name: Install Komac uses: cargo-bins/cargo-binstall@main - name: Install komac binary run: cargo binstall komac -y - name: Sync WinGet fork run: gh repo sync bgreenwell/winget-pkgs env: GH_TOKEN: ${{ secrets.WINGET_TOKEN }} - name: Publish to WinGet with Komac run: | komac update bgreenwell.doxx \ --version ${{ steps.get-version.outputs.version }} \ --urls "https://github.com/bgreenwell/doxx/releases/download/${{ steps.get-version.outputs.tag }}/doxx-x86_64-pc-windows-msvc.msi" \ --submit env: GITHUB_TOKEN: ${{ secrets.WINGET_TOKEN }} doxx-0.1.4/.github/workflows/release.yml000064400000000000000000000342361046102023000163600ustar 00000000000000# This file was autogenerated by dist: https://axodotdev.github.io/cargo-dist # # Copyright 2022-2024, axodotdev # SPDX-License-Identifier: MIT or Apache-2.0 # # CI that: # # * checks for a Git Tag that looks like a release # * builds artifacts with dist (archives, installers, hashes) # * uploads those artifacts to temporary workflow zip # * on success, uploads the artifacts to a GitHub Release # # Note that the GitHub Release will be created with a generated # title/body based on your changelogs. name: Release permissions: "contents": "write" # This task will run whenever you push a git tag that looks like a version # like "1.0.0", "v0.1.0-prerelease.1", "my-app/0.1.0", "releases/v1.0.0", etc. # Various formats will be parsed into a VERSION and an optional PACKAGE_NAME, where # PACKAGE_NAME must be the name of a Cargo package in your workspace, and VERSION # must be a Cargo-style SemVer Version (must have at least major.minor.patch). # # If PACKAGE_NAME is specified, then the announcement will be for that # package (erroring out if it doesn't have the given version or isn't dist-able). # # If PACKAGE_NAME isn't specified, then the announcement will be for all # (dist-able) packages in the workspace with that version (this mode is # intended for workspaces with only one dist-able package, or with all dist-able # packages versioned/released in lockstep). # # If you push multiple tags at once, separate instances of this workflow will # spin up, creating an independent announcement for each one. However, GitHub # will hard limit this to 3 tags per commit, as it will assume more tags is a # mistake. # # If there's a prerelease-style suffix to the version, then the release(s) # will be marked as a prerelease. on: pull_request: push: tags: - '**[0-9]+.[0-9]+.[0-9]+*' jobs: # Run 'dist plan' (or host) to determine what tasks we need to do plan: runs-on: "ubuntu-22.04" outputs: val: ${{ steps.plan.outputs.manifest }} tag: ${{ !github.event.pull_request && github.ref_name || '' }} tag-flag: ${{ !github.event.pull_request && format('--tag={0}', github.ref_name) || '' }} publishing: ${{ !github.event.pull_request }} env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} steps: - uses: actions/checkout@v4 with: persist-credentials: false submodules: recursive - name: Install dist # we specify bash to get pipefail; it guards against the `curl` command # failing. otherwise `sh` won't catch that `curl` returned non-0 shell: bash run: "curl --proto '=https' --tlsv1.2 -LsSf https://github.com/axodotdev/cargo-dist/releases/download/v0.30.2/cargo-dist-installer.sh | sh" - name: Cache dist uses: actions/upload-artifact@v4 with: name: cargo-dist-cache path: ~/.cargo/bin/dist # sure would be cool if github gave us proper conditionals... # so here's a doubly-nested ternary-via-truthiness to try to provide the best possible # functionality based on whether this is a pull_request, and whether it's from a fork. # (PRs run on the *source* but secrets are usually on the *target* -- that's *good* # but also really annoying to build CI around when it needs secrets to work right.) - id: plan run: | dist ${{ (!github.event.pull_request && format('host --steps=create --tag={0}', github.ref_name)) || 'plan' }} --output-format=json > plan-dist-manifest.json echo "dist ran successfully" cat plan-dist-manifest.json echo "manifest=$(jq -c "." plan-dist-manifest.json)" >> "$GITHUB_OUTPUT" - name: "Upload dist-manifest.json" uses: actions/upload-artifact@v4 with: name: artifacts-plan-dist-manifest path: plan-dist-manifest.json # Build and packages all the platform-specific things build-local-artifacts: name: build-local-artifacts (${{ join(matrix.targets, ', ') }}) # Let the initial task tell us to not run (currently very blunt) needs: - plan if: ${{ fromJson(needs.plan.outputs.val).ci.github.artifacts_matrix.include != null && (needs.plan.outputs.publishing == 'true' || fromJson(needs.plan.outputs.val).ci.github.pr_run_mode == 'upload') }} strategy: fail-fast: false # Target platforms/runners are computed by dist in create-release. # Each member of the matrix has the following arguments: # # - runner: the github runner # - dist-args: cli flags to pass to dist # - install-dist: expression to run to install dist on the runner # # Typically there will be: # - 1 "global" task that builds universal installers # - N "local" tasks that build each platform's binaries and platform-specific installers matrix: ${{ fromJson(needs.plan.outputs.val).ci.github.artifacts_matrix }} runs-on: ${{ matrix.runner }} container: ${{ matrix.container && matrix.container.image || null }} env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} BUILD_MANIFEST_NAME: target/distrib/${{ join(matrix.targets, '-') }}-dist-manifest.json steps: - name: enable windows longpaths run: | git config --global core.longpaths true - uses: actions/checkout@v4 with: persist-credentials: false submodules: recursive - name: Install Rust non-interactively if not already installed if: ${{ matrix.container }} run: | if ! command -v cargo > /dev/null 2>&1; then curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y echo "$HOME/.cargo/bin" >> $GITHUB_PATH fi - name: Install dist run: ${{ matrix.install_dist.run }} # Get the dist-manifest - name: Fetch local artifacts uses: actions/download-artifact@v4 with: pattern: artifacts-* path: target/distrib/ merge-multiple: true - name: Install dependencies run: | ${{ matrix.packages_install }} - name: Build artifacts run: | # Actually do builds and make zips and whatnot dist build ${{ needs.plan.outputs.tag-flag }} --print=linkage --output-format=json ${{ matrix.dist_args }} > dist-manifest.json echo "dist ran successfully" - id: cargo-dist name: Post-build # We force bash here just because github makes it really hard to get values up # to "real" actions without writing to env-vars, and writing to env-vars has # inconsistent syntax between shell and powershell. shell: bash run: | # Parse out what we just built and upload it to scratch storage echo "paths<> "$GITHUB_OUTPUT" dist print-upload-files-from-manifest --manifest dist-manifest.json >> "$GITHUB_OUTPUT" echo "EOF" >> "$GITHUB_OUTPUT" cp dist-manifest.json "$BUILD_MANIFEST_NAME" - name: "Upload artifacts" uses: actions/upload-artifact@v4 with: name: artifacts-build-local-${{ join(matrix.targets, '_') }} path: | ${{ steps.cargo-dist.outputs.paths }} ${{ env.BUILD_MANIFEST_NAME }} # Build and package all the platform-agnostic(ish) things build-global-artifacts: needs: - plan - build-local-artifacts runs-on: "ubuntu-22.04" env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} BUILD_MANIFEST_NAME: target/distrib/global-dist-manifest.json steps: - uses: actions/checkout@v4 with: persist-credentials: false submodules: recursive - name: Install cached dist uses: actions/download-artifact@v4 with: name: cargo-dist-cache path: ~/.cargo/bin/ - run: chmod +x ~/.cargo/bin/dist # Get all the local artifacts for the global tasks to use (for e.g. checksums) - name: Fetch local artifacts uses: actions/download-artifact@v4 with: pattern: artifacts-* path: target/distrib/ merge-multiple: true - id: cargo-dist shell: bash run: | dist build ${{ needs.plan.outputs.tag-flag }} --output-format=json "--artifacts=global" > dist-manifest.json echo "dist ran successfully" # Parse out what we just built and upload it to scratch storage echo "paths<> "$GITHUB_OUTPUT" jq --raw-output ".upload_files[]" dist-manifest.json >> "$GITHUB_OUTPUT" echo "EOF" >> "$GITHUB_OUTPUT" cp dist-manifest.json "$BUILD_MANIFEST_NAME" - name: "Upload artifacts" uses: actions/upload-artifact@v4 with: name: artifacts-build-global path: | ${{ steps.cargo-dist.outputs.paths }} ${{ env.BUILD_MANIFEST_NAME }} # Determines if we should publish/announce host: needs: - plan - build-local-artifacts - build-global-artifacts # Only run if we're "publishing", and only if plan, local and global didn't fail (skipped is fine) if: ${{ always() && needs.plan.result == 'success' && needs.plan.outputs.publishing == 'true' && (needs.build-global-artifacts.result == 'skipped' || needs.build-global-artifacts.result == 'success') && (needs.build-local-artifacts.result == 'skipped' || needs.build-local-artifacts.result == 'success') }} env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} runs-on: "ubuntu-22.04" outputs: val: ${{ steps.host.outputs.manifest }} steps: - uses: actions/checkout@v4 with: persist-credentials: false submodules: recursive - name: Install cached dist uses: actions/download-artifact@v4 with: name: cargo-dist-cache path: ~/.cargo/bin/ - run: chmod +x ~/.cargo/bin/dist # Fetch artifacts from scratch-storage - name: Fetch artifacts uses: actions/download-artifact@v4 with: pattern: artifacts-* path: target/distrib/ merge-multiple: true - id: host shell: bash run: | dist host ${{ needs.plan.outputs.tag-flag }} --steps=upload --steps=release --output-format=json > dist-manifest.json echo "artifacts uploaded and released successfully" cat dist-manifest.json echo "manifest=$(jq -c "." dist-manifest.json)" >> "$GITHUB_OUTPUT" - name: "Upload dist-manifest.json" uses: actions/upload-artifact@v4 with: # Overwrite the previous copy name: artifacts-dist-manifest path: dist-manifest.json # Create a GitHub Release while uploading all files to it - name: "Download GitHub Artifacts" uses: actions/download-artifact@v4 with: pattern: artifacts-* path: artifacts merge-multiple: true - name: Cleanup run: | # Remove the granular manifests rm -f artifacts/*-dist-manifest.json - name: Create GitHub Release env: PRERELEASE_FLAG: "${{ fromJson(steps.host.outputs.manifest).announcement_is_prerelease && '--prerelease' || '' }}" ANNOUNCEMENT_TITLE: "${{ fromJson(steps.host.outputs.manifest).announcement_title }}" ANNOUNCEMENT_BODY: "${{ fromJson(steps.host.outputs.manifest).announcement_github_body }}" RELEASE_COMMIT: "${{ github.sha }}" run: | # Write and read notes from a file to avoid quoting breaking things echo "$ANNOUNCEMENT_BODY" > $RUNNER_TEMP/notes.txt gh release create "${{ needs.plan.outputs.tag }}" --target "$RELEASE_COMMIT" $PRERELEASE_FLAG --title "$ANNOUNCEMENT_TITLE" --notes-file "$RUNNER_TEMP/notes.txt" artifacts/* publish-homebrew-formula: needs: - plan - host runs-on: "ubuntu-22.04" env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} PLAN: ${{ needs.plan.outputs.val }} GITHUB_USER: "axo bot" GITHUB_EMAIL: "admin+bot@axo.dev" if: ${{ !fromJson(needs.plan.outputs.val).announcement_is_prerelease || fromJson(needs.plan.outputs.val).publish_prereleases }} steps: - uses: actions/checkout@v4 with: persist-credentials: true repository: "bgreenwell/homebrew-doxx" token: ${{ secrets.HOMEBREW_TAP_TOKEN }} # So we have access to the formula - name: Fetch homebrew formulae uses: actions/download-artifact@v4 with: pattern: artifacts-* path: Formula/ merge-multiple: true # This is extra complex because you can make your Formula name not match your app name # so we need to find releases with a *.rb file, and publish with that filename. - name: Commit formula files run: | git config --global user.name "${GITHUB_USER}" git config --global user.email "${GITHUB_EMAIL}" for release in $(echo "$PLAN" | jq --compact-output '.releases[] | select([.artifacts[] | endswith(".rb")] | any)'); do filename=$(echo "$release" | jq '.artifacts[] | select(endswith(".rb"))' --raw-output) name=$(echo "$filename" | sed "s/\.rb$//") version=$(echo "$release" | jq .app_version --raw-output) export PATH="/home/linuxbrew/.linuxbrew/bin:$PATH" brew update # We avoid reformatting user-provided data such as the app description and homepage. brew style --except-cops FormulaAudit/Homepage,FormulaAudit/Desc,FormulaAuditStrict --fix "Formula/${filename}" || true git add "Formula/${filename}" git commit -m "${name} ${version}" done git push announce: needs: - plan - host - publish-homebrew-formula # use "always() && ..." to allow us to wait for all publish jobs while # still allowing individual publish jobs to skip themselves (for prereleases). # "host" however must run to completion, no skipping allowed! if: ${{ always() && needs.host.result == 'success' && (needs.publish-homebrew-formula.result == 'skipped' || needs.publish-homebrew-formula.result == 'success') }} runs-on: "ubuntu-22.04" env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} steps: - uses: actions/checkout@v4 with: persist-credentials: false submodules: recursive doxx-0.1.4/.gitignore000064400000000000000000000016241046102023000126030ustar 00000000000000# Rust build artifacts /target *.pdb # IDE and editor files .idea/ .vscode/ *.swp *.swo *~ .ipynb_checkpoints/ # Coverage reports lcov.info coverage/ *.profraw # Logs and temporary files *.log *.tmp *.temp # Environment variables .env .env.local # Generated documentation /doc experiments/**/target/ # Project management and development notes CLAUDE.md # AGENTS.md is tracked .planning/ .agents/ # macOS .DS_Store .AppleDouble .LSOverride # Icon must end with two \r Icon # Thumbnails ._* # Files that might appear in the root of a volume .DocumentRevisions-V100 .fseventsd .Spotlight-V100 .TemporaryItems .Trashes .VolumeIcon.icns .com.apple.timemachine.donotpresent # Directories potentially created on remote AFP share .AppleDB .AppleDesktop Network Trash Folder Temporary Items .apdisk # Miscellaneous *_files/ *.html # Nix build artifacts result/ # Sensitive test files tests/fixtures/sample.docx doxx-0.1.4/.pre-commit-config.yaml000064400000000000000000000017021046102023000150710ustar 00000000000000# Pre-commit hooks for doxx # Install with: pre-commit install # Run manually: pre-commit run --all-files repos: - repo: https://github.com/pre-commit/pre-commit-hooks rev: v4.5.0 hooks: - id: trailing-whitespace - id: end-of-file-fixer - id: check-yaml - id: check-toml - id: check-merge-conflict - id: check-added-large-files args: ['--maxkb=1000'] - repo: local hooks: - id: cargo-fmt name: Cargo format entry: cargo fmt --all -- language: system types: [rust] pass_filenames: false - id: cargo-clippy name: Cargo clippy entry: cargo clippy --all-targets --all-features -- -D warnings language: system types: [rust] pass_filenames: false - id: cargo-test name: Cargo test entry: cargo test --all-features language: system types: [rust] pass_filenames: falsedoxx-0.1.4/AGENTS.md000064400000000000000000000063311046102023000121160ustar 00000000000000# doxx: AI Agent Development Guide doxx is a terminal-based .docx viewer built with Rust. It provides rich text rendering, equation support (LaTeX), tables, search, navigation, and multiple export formats (Markdown, CSV, JSON, ANSI, text). ## Quick Start ```bash cargo build --release cargo test cargo run -- tests/fixtures/minimal.docx cargo run -- tests/fixtures/comprehensive.docx --export ansi ``` ## Project Structure ``` src/ ├── main.rs # CLI entry point (clap) ├── lib.rs # Library root ├── config.rs # Config file loading (~/.config/doxx/config.toml) ├── state.rs # App state ├── ui.rs # TUI (ratatui) ├── export.rs # Export formats: markdown, JSON, CSV, text ├── ansi.rs # ANSI color export ├── equation.rs # OMML to LaTeX conversion ├── image_extractor.rs # Image extraction from DOCX ├── terminal_image.rs # Terminal image rendering ├── keymap/ # Keymap presets (default, vim, less) and bindings ├── widgets/ # Custom ratatui widgets └── document/ # Document parsing ├── models.rs # Core types (Document, DocumentElement) ├── loader.rs # Parsing orchestrator ├── query.rs # Search and outline └── parsing/ # Specialized parsers (headings, lists, tables, equations, formatting, numbering) ``` ## Key Dependencies - docx-rs (0.4): .docx parsing — no built-in OMML support; we parse equation XML directly - ratatui (0.29) + crossterm (0.27): TUI - ratatui-image (8.0): Kitty/iTerm2/half-block image rendering - tokio (1.0): Async runtime - clap (4.4): CLI ## Known Issues - Equation positioning (#58): Display equations may not be pixel-perfect in all documents - Advanced numbering (#24): Complex Word numbering schemes not fully supported ## Testing ```bash cargo test --all-features cargo test --test integration_test cargo test test_name -- --nocapture ``` Fixtures live in `tests/fixtures/`. Run `./scripts/regenerate-fixtures.sh` to rebuild them. ## Performance Targets Startup < 100ms | Memory < 50MB | Rendering < 500ms | Binary ~3MB ## Development Workflow Always run before pushing: ```bash ./scripts/quick-check.sh # fmt, clippy, tests ./scripts/check.sh # full: fmt --check, clippy, tests, release build ``` ## Git Commit Guidelines - Use conventional commit format: feat:, fix:, docs:, refactor:, etc. - No signature blocks in commit messages ## Changelog Guidelines CHANGELOG.md follows [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) format: - One line per entry, no sub-bullets - Standard sections only: Added, Changed, Deprecated, Removed, Fixed, Security - User-facing changes only — internal refactors belong in commit messages ## CI/CD `.github/workflows/ci.yml` — Linux, macOS, Windows: 1. `cargo fmt --all -- --check` (Unix) 2. `cargo clippy --all-targets -- -D warnings` (zero warnings) 3. `cargo test --all-features` 4. `cargo build --release` 5. `nix build` (Unix) ## Resources See `.agents/` for detailed docs: `known-issues.md`, `workflows.md`, `performance.md`, `release.md`, `ci-troubleshooting.md`, `development/`. doxx-0.1.4/CHANGELOG.md000064400000000000000000000101651046102023000124240ustar 00000000000000# Changelog All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased] ## [0.1.4] - 2026-05-26 ### Added - `SourceCode` paragraph style renders as a distinct code block in all export formats and the TUI ([#76](https://github.com/bgreenwell/doxx/issues/76)) - Text inside `wps:txbx` shape text boxes is now extracted and rendered with box-drawing borders instead of being silently dropped ([#76](https://github.com/bgreenwell/doxx/issues/76)) ### Fixed - Numbered list items sharing the same abstract numbering definition now count sequentially instead of both restarting at 1 ([#76](https://github.com/bgreenwell/doxx/issues/76)) - Bullet-format list levels (`numFmt="bullet"`) no longer render as lettered sequences ([#76](https://github.com/bgreenwell/doxx/issues/76)) - `w:br` line break elements inside a run are now preserved, fixing multi-line code blocks concatenated into a single line ([#76](https://github.com/bgreenwell/doxx/issues/76)) ## [0.1.3] - 2026-05-24 ### Added - Configurable keymap presets (`default`, `vim`, `less`) with per-user TOML overrides in `~/.config/doxx/config.toml` ([#26](https://github.com/bgreenwell/doxx/issues/26)) - Search result highlighting: current match in yellow, other matches in gray - `--restore-position` / `-r` flag to save and restore scroll position across sessions ([#66](https://github.com/bgreenwell/doxx/issues/66)) - Inline image display in TUI via Kitty, iTerm2, or half-block fallback ([#35](https://github.com/bgreenwell/doxx/issues/35)) - NetBSD package via `pkgin install doxx` ### Fixed - `--terminal-width` / `-w` wraps headings and text correctly in ANSI export ([#45](https://github.com/bgreenwell/doxx/issues/45)) - List bullets and numbers no longer inherit formatting from the first run of their item - ANSI formatting no longer bleeds into adjacent unformatted runs - Strikethrough and underline render correctly in the TUI viewer and table cells ### Changed - Refactored document rendering into a custom `DocumentWidget` - Split `document.rs` into focused submodules under `document/parsing/` ## [0.1.2] - 2025-10-21 ### Added - Inline equation rendering within paragraph text using `$...$` LaTeX delimiters - ANSI export (`--export ansi`) with `--terminal-width`/`-w` and `--color-depth` options ([#45](https://github.com/bgreenwell/doxx/issues/45)) - Strikethrough text rendering in TUI and all export formats ([#47](https://github.com/bgreenwell/doxx/issues/47)) - Search state toggle: press `S` to show/hide results ([#50](https://github.com/bgreenwell/doxx/pull/50)) by [@Jianchi-Chen](https://github.com/Jianchi-Chen) ### Fixed - Integration tests use `CARGO_BIN_EXE` for compatibility with packaging environments ([#60](https://github.com/bgreenwell/doxx/issues/60)) - Text formatting (bold, italic, colors) no longer lost during inline equation processing - Formatting preserved in Word automatic numbered lists - Empty search queries no longer match the entire document ([#50](https://github.com/bgreenwell/doxx/pull/50)) - Non-`.docx` files now rejected with clear error messages ([#40](https://github.com/bgreenwell/doxx/issues/40), [#56](https://github.com/bgreenwell/doxx/issues/56)) - Display equations now appear at their correct paragraph position ([#58](https://github.com/bgreenwell/doxx/issues/58)) ### Changed - Updated `ratatui-image` from v1.0 to v8.0 for Debian packaging compatibility ([#59](https://github.com/bgreenwell/doxx/issues/59)) ## [0.1.1] - 2025-08-22 ### Added - Release pipeline: cross-platform binaries, crates.io publishing, Homebrew formula, SHA256 checksums - Release automation script (`scripts/release.sh`) ### Fixed - Image picker initialization on Windows ### Changed - README updated to use sentence case throughout ## [0.1.0] - Initial Release ### Added - `.docx` document parsing and terminal viewer - Navigation, search, and outline views - Export formats: text, markdown, JSON, CSV - Table parsing and rendering - Document metadata extraction - Equation support (OMML to LaTeX)doxx-0.1.4/Cargo.lock0000644000002210061046102023000100160ustar # This file is automatically @generated by Cargo. # It is not intended for manual editing. version = 4 [[package]] name = "addr2line" version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" dependencies = [ "gimli", ] [[package]] name = "adler2" version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" [[package]] name = "aes" version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" dependencies = [ "cfg-if", "cipher", "cpufeatures", ] [[package]] name = "aho-corasick" version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" dependencies = [ "memchr", ] [[package]] name = "aligned-vec" version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc890384c8602f339876ded803c97ad529f3842aba97f6392b3dba0dd171769b" dependencies = [ "equator", ] [[package]] name = "allocator-api2" version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" [[package]] name = "ansi_colours" version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "14eec43e0298190790f41679fe69ef7a829d2a2ddd78c8c00339e84710e435fe" dependencies = [ "rgb", ] [[package]] name = "anstream" version = "0.6.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3ae563653d1938f79b1ab1b5e668c87c76a9930414574a6583a7b7e11a8e6192" dependencies = [ "anstyle", "anstyle-parse", "anstyle-query", "anstyle-wincon", "colorchoice", "is_terminal_polyfill", "utf8parse", ] [[package]] name = "anstyle" version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "862ed96ca487e809f1c8e5a8447f6ee2cf102f846893800b20cebdf541fc6bbd" [[package]] name = "anstyle-parse" version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e231f6134f61b71076a3eab506c379d4f36122f2af15a9ff04415ea4c3339e2" dependencies = [ "windows-sys 0.60.2", ] [[package]] name = "anstyle-wincon" version = "3.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3e0633414522a32ffaac8ac6cc8f748e090c5717661fddeea04219e2344f5f2a" dependencies = [ "anstyle", "once_cell_polyfill", "windows-sys 0.60.2", ] [[package]] name = "anyhow" version = "1.0.99" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b0674a1ddeecb70197781e945de4b3b8ffb61fa939a5597bcf48503737663100" [[package]] name = "arbitrary" version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1" dependencies = [ "derive_arbitrary", ] [[package]] name = "arboard" version = "3.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "55f533f8e0af236ffe5eb979b99381df3258853f00ba2e44b6e1955292c75227" dependencies = [ "clipboard-win", "image 0.25.6", "log", "objc2", "objc2-app-kit", "objc2-core-foundation", "objc2-core-graphics", "objc2-foundation", "parking_lot", "percent-encoding", "windows-sys 0.59.0", "x11rb", ] [[package]] name = "arg_enum_proc_macro" version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "arrayvec" version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" [[package]] name = "autocfg" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "av1-grain" version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4f3efb2ca85bc610acfa917b5aaa36f3fcbebed5b3182d7f877b02531c4b80c8" dependencies = [ "anyhow", "arrayvec", "log", "nom", "num-rational", "v_frame", ] [[package]] name = "avif-serialize" version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "47c8fbc0f831f4519fe8b810b6a7a91410ec83031b8233f730a0480029f6a23f" dependencies = [ "arrayvec", ] [[package]] name = "backtrace" version = "0.3.75" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" dependencies = [ "addr2line", "cfg-if", "libc", "miniz_oxide", "object", "rustc-demangle", "windows-targets 0.52.6", ] [[package]] name = "base64" version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" [[package]] name = "base64" version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "base64-simd" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "339abbe78e73178762e23bea9dfd08e697eb3f3301cd4be981c0f78ba5859195" dependencies = [ "outref", "vsimd", ] [[package]] name = "bit_field" version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc827186963e592360843fb5ba4b973e145841266c1357f7180c43526f2e5b61" [[package]] name = "bitflags" version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" [[package]] name = "bitstream-io" version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6099cdc01846bc367c4e7dd630dc5966dccf36b652fae7a74e17b640411a91b2" [[package]] name = "block-buffer" version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" dependencies = [ "generic-array", ] [[package]] name = "built" version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56ed6191a7e78c36abdb16ab65341eefd73d64d303fffccdbb00d51e4205967b" [[package]] name = "bumpalo" version = "3.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" [[package]] name = "bytemuck" version = "1.23.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3995eaeebcdf32f91f980d360f78732ddc061097ab4e39991ae7a6ace9194677" [[package]] name = "byteorder" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "byteorder-lite" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" [[package]] name = "bzip2" version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49ecfb22d906f800d4fe833b6282cf4dc1c298f5057ca0b5445e5c209735ca47" dependencies = [ "bzip2-sys", ] [[package]] name = "bzip2-sys" version = "0.1.13+1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "225bff33b2141874fe80d71e07d6eec4f85c5c216453dd96388240f96e1acc14" dependencies = [ "cc", "pkg-config", ] [[package]] name = "cassowary" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df8670b8c7b9dae1793364eafadf7239c40d669904660c5960d74cfd80b46a53" [[package]] name = "castaway" version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dec551ab6e7578819132c713a93c022a05d60159dc86e7a7050223577484c55a" dependencies = [ "rustversion", ] [[package]] name = "cc" version = "1.2.33" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3ee0f8803222ba5a7e2777dd72ca451868909b1ac410621b676adf07280e9b5f" dependencies = [ "jobserver", "libc", "shlex", ] [[package]] name = "cfg-expr" version = "0.15.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" dependencies = [ "smallvec", "target-lexicon", ] [[package]] name = "cfg-if" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" [[package]] name = "cipher" version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" dependencies = [ "crypto-common", "inout", ] [[package]] name = "clap" version = "4.5.45" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fc0e74a703892159f5ae7d3aac52c8e6c392f5ae5f359c70b5881d60aaac318" dependencies = [ "clap_builder", "clap_derive", ] [[package]] name = "clap_builder" version = "4.5.44" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b3e7f4214277f3c7aa526a59dd3fbe306a370daee1f8b7b8c987069cd8e888a8" dependencies = [ "anstream", "anstyle", "clap_lex", "strsim", ] [[package]] name = "clap_derive" version = "4.5.45" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "14cb31bb0a7d536caef2639baa7fad459e15c3144efefa6dbd1c84562c4739f6" dependencies = [ "heck", "proc-macro2", "quote", "syn", ] [[package]] name = "clap_lex" version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b94f61472cee1439c0b966b47e3aca9ae07e45d070759512cd390ea2bebc6675" [[package]] name = "clipboard-win" version = "5.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bde03770d3df201d4fb868f2c9c59e66a3e4e2bd06692a0fe701e7103c7e84d4" dependencies = [ "error-code", ] [[package]] name = "color_quant" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" [[package]] name = "colorchoice" version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" [[package]] name = "compact_str" version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3b79c4069c6cad78e2e0cdfcbd26275770669fb39fd308a752dc110e83b9af32" dependencies = [ "castaway", "cfg-if", "itoa", "rustversion", "ryu", "static_assertions", ] [[package]] name = "console" version = "0.15.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "054ccb5b10f9f2cbf51eb355ca1d05c2d279ce1804688d0db74b4733a5aeafd8" dependencies = [ "encode_unicode", "libc", "once_cell", "windows-sys 0.59.0", ] [[package]] name = "constant_time_eq" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" [[package]] name = "cpufeatures" version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" dependencies = [ "libc", ] [[package]] name = "crc" version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9710d3b3739c2e349eb44fe848ad0b7c8cb1e42bd87ee49371df2f7acaf3e675" dependencies = [ "crc-catalog", ] [[package]] name = "crc-catalog" version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" [[package]] name = "crc32fast" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" dependencies = [ "cfg-if", ] [[package]] name = "crossbeam-deque" version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" dependencies = [ "crossbeam-epoch", "crossbeam-utils", ] [[package]] name = "crossbeam-epoch" version = "0.9.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" dependencies = [ "crossbeam-utils", ] [[package]] name = "crossbeam-utils" version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" [[package]] name = "crossterm" version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f476fe445d41c9e991fd07515a6f463074b782242ccf4a5b7b1d1012e70824df" dependencies = [ "bitflags 2.9.1", "crossterm_winapi", "libc", "mio 0.8.11", "parking_lot", "signal-hook", "signal-hook-mio", "winapi", ] [[package]] name = "crossterm" version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "829d955a0bb380ef178a640b91779e3987da38c9aea133b20614cfed8cdea9c6" dependencies = [ "bitflags 2.9.1", "crossterm_winapi", "mio 1.0.4", "parking_lot", "rustix 0.38.44", "signal-hook", "signal-hook-mio", "winapi", ] [[package]] name = "crossterm_winapi" version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "acdd7c62a3665c7f6830a51635d9ac9b23ed385797f70a83bb8bafe9c572ab2b" dependencies = [ "winapi", ] [[package]] name = "crunchy" version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" [[package]] name = "crypto-common" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" dependencies = [ "generic-array", "typenum", ] [[package]] name = "darling" version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" dependencies = [ "darling_core", "darling_macro", ] [[package]] name = "darling_core" version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", "strsim", "syn", ] [[package]] name = "darling_macro" version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" dependencies = [ "darling_core", "quote", "syn", ] [[package]] name = "deflate64" version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da692b8d1080ea3045efaab14434d40468c3d8657e42abddfffca87b428f4c1b" [[package]] name = "deranged" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e" dependencies = [ "powerfmt", ] [[package]] name = "derive_arbitrary" version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e567bd82dcff979e4b03460c307b3cdc9e96fde3d73bed1496d2bc75d9dd62a" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "digest" version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer", "crypto-common", "subtle", ] [[package]] name = "dirs" version = "5.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" dependencies = [ "dirs-sys", ] [[package]] name = "dirs-sys" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" dependencies = [ "libc", "option-ext", "redox_users", "windows-sys 0.48.0", ] [[package]] name = "dispatch2" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec" dependencies = [ "bitflags 2.9.1", "objc2", ] [[package]] name = "displaydoc" version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "docx-rs" version = "0.4.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f21be13b97bd2924f30323d674f5a8db382964972825abd93f30d08f21dad98" dependencies = [ "base64 0.22.1", "image 0.24.9", "serde", "serde_json", "thiserror 1.0.69", "xml-rs", "zip 0.6.6", ] [[package]] name = "doxx" version = "0.1.4" dependencies = [ "anyhow", "arboard", "clap", "crossterm 0.27.0", "dirs", "docx-rs", "image 0.25.6", "once_cell", "quick-xml", "ratatui", "ratatui-image", "regex", "serde", "serde_json", "thiserror 1.0.69", "tokio", "toml", "unicode-segmentation", "unicode-width 0.2.0", "viuer", "zip 2.4.2", ] [[package]] name = "either" version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" [[package]] name = "encode_unicode" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" [[package]] name = "equator" version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4711b213838dfee0117e3be6ac926007d7f433d7bbe33595975d4190cb07e6fc" dependencies = [ "equator-macro", ] [[package]] name = "equator-macro" version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "44f23cf4b44bfce11a86ace86f8a73ffdec849c9fd00a386a53d278bd9e81fb3" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "equivalent" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "errno" version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "778e2ac28f6c47af28e4907f13ffd1e1ddbd400980a9abd7c8df189bf578a5ad" dependencies = [ "libc", "windows-sys 0.60.2", ] [[package]] name = "error-code" version = "3.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dea2df4cf52843e0452895c455a1a2cfbb842a1e7329671acf418fdc53ed4c59" [[package]] name = "exr" version = "1.73.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f83197f59927b46c04a183a619b7c29df34e63e63c7869320862268c0ef687e0" dependencies = [ "bit_field", "half", "lebe", "miniz_oxide", "rayon-core", "smallvec", "zune-inflate", ] [[package]] name = "fastrand" version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" [[package]] name = "fdeflate" version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" dependencies = [ "simd-adler32", ] [[package]] name = "flate2" version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4a3d7db9596fecd151c5f638c0ee5d5bd487b6e0ea232e5dc96d5250f6f94b1d" dependencies = [ "crc32fast", "miniz_oxide", ] [[package]] name = "fnv" version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "foldhash" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" [[package]] name = "generic-array" version = "0.14.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", ] [[package]] name = "gethostname" version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0176e0459c2e4a1fe232f984bca6890e681076abb9934f6cea7c326f3fc47818" dependencies = [ "libc", "windows-targets 0.48.5", ] [[package]] name = "getrandom" version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" dependencies = [ "cfg-if", "libc", "wasi 0.11.1+wasi-snapshot-preview1", ] [[package]] name = "getrandom" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" dependencies = [ "cfg-if", "js-sys", "libc", "r-efi", "wasi 0.14.2+wasi-0.2.4", "wasm-bindgen", ] [[package]] name = "gif" version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ae047235e33e2829703574b54fdec96bfbad892062d97fed2f76022287de61b" dependencies = [ "color_quant", "weezl", ] [[package]] name = "gimli" version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" [[package]] name = "half" version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "459196ed295495a68f7d7fe1d84f6c4b7ff0e21fe3017b2f283c6fac3ad803c9" dependencies = [ "cfg-if", "crunchy", ] [[package]] name = "hashbrown" version = "0.15.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" dependencies = [ "allocator-api2", "equivalent", "foldhash", ] [[package]] name = "heck" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "hmac" version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" dependencies = [ "digest", ] [[package]] name = "icy_sixel" version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ccc0a9c4770bc47b0a933256a496cfb8b6531f753ea9bccb19c6dff0ff7273fc" [[package]] name = "ident_case" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "image" version = "0.24.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5690139d2f55868e080017335e4b94cb7414274c74f1669c84fb5feba2c9f69d" dependencies = [ "bytemuck", "byteorder", "color_quant", "exr", "gif", "jpeg-decoder", "num-traits", "png", "qoi", "tiff", ] [[package]] name = "image" version = "0.25.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "db35664ce6b9810857a38a906215e75a9c879f0696556a39f59c62829710251a" dependencies = [ "bytemuck", "byteorder-lite", "color_quant", "exr", "gif", "image-webp", "num-traits", "png", "qoi", "ravif", "rayon", "rgb", "tiff", "zune-core", "zune-jpeg", ] [[package]] name = "image-webp" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f6970fe7a5300b4b42e62c52efa0187540a5bef546c60edaf554ef595d2e6f0b" dependencies = [ "byteorder-lite", "quick-error", ] [[package]] name = "imgref" version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d0263a3d970d5c054ed9312c0057b4f3bde9c0b33836d3637361d4a9e6e7a408" [[package]] name = "indexmap" version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fe4cd85333e22411419a0bcae1297d25e58c9443848b11dc6a86fefe8c78a661" dependencies = [ "equivalent", "hashbrown", ] [[package]] name = "indoc" version = "2.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f4c7245a08504955605670dbf141fceab975f15ca21570696aebe9d2e71576bd" [[package]] name = "inout" version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" dependencies = [ "generic-array", ] [[package]] name = "instability" version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "435d80800b936787d62688c927b6490e887c7ef5ff9ce922c6c6050fca75eb9a" dependencies = [ "darling", "indoc", "proc-macro2", "quote", "syn", ] [[package]] name = "interpolate_name" version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "io-uring" version = "0.7.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d93587f37623a1a17d94ef2bc9ada592f5465fe7732084ab7beefabe5c77c0c4" dependencies = [ "bitflags 2.9.1", "cfg-if", "libc", ] [[package]] name = "is_terminal_polyfill" version = "1.70.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" [[package]] name = "itertools" version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" dependencies = [ "either", ] [[package]] name = "itertools" version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" dependencies = [ "either", ] [[package]] name = "itoa" version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" [[package]] name = "jobserver" version = "0.1.33" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38f262f097c174adebe41eb73d66ae9c06b2844fb0da69969647bbddd9b0538a" dependencies = [ "getrandom 0.3.3", "libc", ] [[package]] name = "jpeg-decoder" version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "00810f1d8b74be64b13dbf3db89ac67740615d6c891f0e7b6179326533011a07" dependencies = [ "rayon", ] [[package]] name = "js-sys" version = "0.3.77" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" dependencies = [ "once_cell", "wasm-bindgen", ] [[package]] name = "lazy_static" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "lebe" version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8" [[package]] name = "libc" version = "0.2.175" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543" [[package]] name = "libfuzzer-sys" version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5037190e1f70cbeef565bd267599242926f724d3b8a9f510fd7e0b540cfa4404" dependencies = [ "arbitrary", "cc", ] [[package]] name = "libredox" version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "391290121bad3d37fbddad76d8f5d1c1c314cfc646d143d7e07a3086ddff0ce3" dependencies = [ "bitflags 2.9.1", "libc", ] [[package]] name = "linux-raw-sys" version = "0.4.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" [[package]] name = "linux-raw-sys" version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" [[package]] name = "lock_api" version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" dependencies = [ "autocfg", "scopeguard", ] [[package]] name = "log" version = "0.4.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" [[package]] name = "loop9" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fae87c125b03c1d2c0150c90365d7d6bcc53fb73a9acaef207d2d065860f062" dependencies = [ "imgref", ] [[package]] name = "lru" version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" dependencies = [ "hashbrown", ] [[package]] name = "lzma-rs" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "297e814c836ae64db86b36cf2a557ba54368d03f6afcd7d947c266692f71115e" dependencies = [ "byteorder", "crc", ] [[package]] name = "lzma-sys" version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5fda04ab3764e6cde78b9974eec4f779acaba7c4e84b36eca3cf77c581b85d27" dependencies = [ "cc", "libc", "pkg-config", ] [[package]] name = "maybe-rayon" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ea1f30cedd69f0a2954655f7188c6a834246d2bcf1e315e2ac40c4b24dc9519" dependencies = [ "cfg-if", "rayon", ] [[package]] name = "memchr" version = "2.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" [[package]] name = "minimal-lexical" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" dependencies = [ "adler2", "simd-adler32", ] [[package]] name = "mio" version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" dependencies = [ "libc", "log", "wasi 0.11.1+wasi-snapshot-preview1", "windows-sys 0.48.0", ] [[package]] name = "mio" version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" dependencies = [ "libc", "log", "wasi 0.11.1+wasi-snapshot-preview1", "windows-sys 0.59.0", ] [[package]] name = "new_debug_unreachable" version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" [[package]] name = "nom" version = "7.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" dependencies = [ "memchr", "minimal-lexical", ] [[package]] name = "noop_proc_macro" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0676bb32a98c1a483ce53e500a81ad9c3d5b3f7c920c28c24e9cb0980d0b5bc8" [[package]] name = "num-bigint" version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" dependencies = [ "num-integer", "num-traits", ] [[package]] name = "num-conv" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" [[package]] name = "num-derive" version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "num-integer" version = "0.1.46" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" dependencies = [ "num-traits", ] [[package]] name = "num-rational" version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" dependencies = [ "num-bigint", "num-integer", "num-traits", ] [[package]] name = "num-traits" version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", ] [[package]] name = "objc2" version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "561f357ba7f3a2a61563a186a163d0a3a5247e1089524a3981d49adb775078bc" dependencies = [ "objc2-encode", ] [[package]] name = "objc2-app-kit" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6f29f568bec459b0ddff777cec4fe3fd8666d82d5a40ebd0ff7e66134f89bcc" dependencies = [ "bitflags 2.9.1", "objc2", "objc2-core-graphics", "objc2-foundation", ] [[package]] name = "objc2-core-foundation" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1c10c2894a6fed806ade6027bcd50662746363a9589d3ec9d9bef30a4e4bc166" dependencies = [ "bitflags 2.9.1", "dispatch2", "objc2", ] [[package]] name = "objc2-core-graphics" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "989c6c68c13021b5c2d6b71456ebb0f9dc78d752e86a98da7c716f4f9470f5a4" dependencies = [ "bitflags 2.9.1", "dispatch2", "objc2", "objc2-core-foundation", "objc2-io-surface", ] [[package]] name = "objc2-encode" version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" [[package]] name = "objc2-foundation" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "900831247d2fe1a09a683278e5384cfb8c80c79fe6b166f9d14bfdde0ea1b03c" dependencies = [ "bitflags 2.9.1", "objc2", "objc2-core-foundation", ] [[package]] name = "objc2-io-surface" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7282e9ac92529fa3457ce90ebb15f4ecbc383e8338060960760fa2cf75420c3c" dependencies = [ "bitflags 2.9.1", "objc2", "objc2-core-foundation", ] [[package]] name = "object" version = "0.36.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" dependencies = [ "memchr", ] [[package]] name = "once_cell" version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" [[package]] name = "once_cell_polyfill" version = "1.70.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad" [[package]] name = "option-ext" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" [[package]] name = "outref" version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a80800c0488c3a21695ea981a54918fbb37abf04f4d0720c453632255e2ff0e" [[package]] name = "parking_lot" version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" dependencies = [ "lock_api", "parking_lot_core", ] [[package]] name = "parking_lot_core" version = "0.9.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" dependencies = [ "cfg-if", "libc", "redox_syscall", "smallvec", "windows-targets 0.52.6", ] [[package]] name = "paste" version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" [[package]] name = "pbkdf2" version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" dependencies = [ "digest", "hmac", ] [[package]] name = "percent-encoding" version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pin-project-lite" version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" [[package]] name = "pkg-config" version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" [[package]] name = "png" version = "0.17.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526" dependencies = [ "bitflags 1.3.2", "crc32fast", "fdeflate", "flate2", "miniz_oxide", ] [[package]] name = "powerfmt" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] name = "ppv-lite86" version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" dependencies = [ "zerocopy", ] [[package]] name = "proc-macro2" version = "1.0.97" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d61789d7719defeb74ea5fe81f2fdfdbd28a803847077cecce2ff14e1472f6f1" dependencies = [ "unicode-ident", ] [[package]] name = "profiling" version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3eb8486b569e12e2c32ad3e204dbaba5e4b5b216e9367044f25f1dba42341773" dependencies = [ "profiling-procmacros", ] [[package]] name = "profiling-procmacros" version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "52717f9a02b6965224f95ca2a81e2e0c5c43baacd28ca057577988930b6c3d5b" dependencies = [ "quote", "syn", ] [[package]] name = "qoi" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f6d64c71eb498fe9eae14ce4ec935c555749aef511cca85b5568910d6e48001" dependencies = [ "bytemuck", ] [[package]] name = "quick-error" version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" [[package]] name = "quick-xml" version = "0.36.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f7649a7b4df05aed9ea7ec6f628c67c9953a43869b8bc50929569b2999d443fe" dependencies = [ "memchr", ] [[package]] name = "quote" version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" dependencies = [ "proc-macro2", ] [[package]] name = "r-efi" version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" [[package]] name = "rand" version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", "rand_chacha", "rand_core", ] [[package]] name = "rand_chacha" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ "ppv-lite86", "rand_core", ] [[package]] name = "rand_core" version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ "getrandom 0.2.16", ] [[package]] name = "ratatui" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eabd94c2f37801c20583fc49dd5cd6b0ba68c716787c2dd6ed18571e1e63117b" dependencies = [ "bitflags 2.9.1", "cassowary", "compact_str", "crossterm 0.28.1", "indoc", "instability", "itertools 0.13.0", "lru", "paste", "strum", "unicode-segmentation", "unicode-truncate", "unicode-width 0.2.0", ] [[package]] name = "ratatui-image" version = "8.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4d2d8ad028fcbb171d83cfdeaf44df17bf0eae3585bdd7f89bc87af98fc71b0e" dependencies = [ "base64-simd", "icy_sixel", "image 0.25.6", "rand", "ratatui", "rustix 0.38.44", "thiserror 1.0.69", "windows", ] [[package]] name = "rav1e" version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cd87ce80a7665b1cce111f8a16c1f3929f6547ce91ade6addf4ec86a8dda5ce9" dependencies = [ "arbitrary", "arg_enum_proc_macro", "arrayvec", "av1-grain", "bitstream-io", "built", "cfg-if", "interpolate_name", "itertools 0.12.1", "libc", "libfuzzer-sys", "log", "maybe-rayon", "new_debug_unreachable", "noop_proc_macro", "num-derive", "num-traits", "once_cell", "paste", "profiling", "rand", "rand_chacha", "simd_helpers", "system-deps", "thiserror 1.0.69", "v_frame", "wasm-bindgen", ] [[package]] name = "ravif" version = "0.11.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5825c26fddd16ab9f515930d49028a630efec172e903483c94796cfe31893e6b" dependencies = [ "avif-serialize", "imgref", "loop9", "quick-error", "rav1e", "rayon", "rgb", ] [[package]] name = "rayon" version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f" dependencies = [ "either", "rayon-core", ] [[package]] name = "rayon-core" version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" dependencies = [ "crossbeam-deque", "crossbeam-utils", ] [[package]] name = "redox_syscall" version = "0.5.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77" dependencies = [ "bitflags 2.9.1", ] [[package]] name = "redox_users" version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ "getrandom 0.2.16", "libredox", "thiserror 1.0.69", ] [[package]] name = "regex" version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" dependencies = [ "aho-corasick", "memchr", "regex-automata", "regex-syntax", ] [[package]] name = "regex-automata" version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" dependencies = [ "aho-corasick", "memchr", "regex-syntax", ] [[package]] name = "regex-syntax" version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "rgb" version = "0.8.52" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c6a884d2998352bb4daf0183589aec883f16a6da1f4dde84d8e2e9a5409a1ce" dependencies = [ "bytemuck", ] [[package]] name = "rustc-demangle" version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" [[package]] name = "rustix" version = "0.38.44" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" dependencies = [ "bitflags 2.9.1", "errno", "libc", "linux-raw-sys 0.4.15", "windows-sys 0.59.0", ] [[package]] name = "rustix" version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "11181fbabf243db407ef8df94a6ce0b2f9a733bd8be4ad02b4eda9602296cac8" dependencies = [ "bitflags 2.9.1", "errno", "libc", "linux-raw-sys 0.9.4", "windows-sys 0.60.2", ] [[package]] name = "rustversion" version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" [[package]] name = "ryu" version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" [[package]] name = "scopeguard" version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "serde" version = "1.0.219" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" version = "1.0.219" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "serde_json" version = "1.0.142" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "030fedb782600dcbd6f02d479bf0d817ac3bb40d644745b769d6a96bc3afc5a7" dependencies = [ "itoa", "memchr", "ryu", "serde", ] [[package]] name = "serde_spanned" version = "0.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" dependencies = [ "serde", ] [[package]] name = "sha1" version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" dependencies = [ "cfg-if", "cpufeatures", "digest", ] [[package]] name = "shlex" version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "signal-hook" version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d881a16cf4426aa584979d30bd82cb33429027e42122b169753d6ef1085ed6e2" dependencies = [ "libc", "signal-hook-registry", ] [[package]] name = "signal-hook-mio" version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34db1a06d485c9142248b7a054f034b349b212551f3dfd19c94d45a754a217cd" dependencies = [ "libc", "mio 0.8.11", "mio 1.0.4", "signal-hook", ] [[package]] name = "signal-hook-registry" version = "1.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28b" dependencies = [ "libc", ] [[package]] name = "simd-adler32" version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" [[package]] name = "simd_helpers" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95890f873bec569a0362c235787f3aca6e1e887302ba4840839bcc6459c42da6" dependencies = [ "quote", ] [[package]] name = "slab" version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" [[package]] name = "smallvec" version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" [[package]] name = "static_assertions" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" [[package]] name = "strsim" version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "strum" version = "0.26.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" dependencies = [ "strum_macros", ] [[package]] name = "strum_macros" version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" dependencies = [ "heck", "proc-macro2", "quote", "rustversion", "syn", ] [[package]] name = "subtle" version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" version = "2.0.105" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7bc3fcb250e53458e712715cf74285c1f889686520d79294a9ef3bd7aa1fc619" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] [[package]] name = "system-deps" version = "6.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" dependencies = [ "cfg-expr", "heck", "pkg-config", "toml", "version-compare", ] [[package]] name = "target-lexicon" version = "0.12.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" [[package]] name = "tempfile" version = "3.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "15b61f8f20e3a6f7e0649d825294eaf317edce30f82cf6026e7e4cb9222a7d1e" dependencies = [ "fastrand", "getrandom 0.3.3", "once_cell", "rustix 1.0.8", "windows-sys 0.60.2", ] [[package]] name = "termcolor" version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" dependencies = [ "winapi-util", ] [[package]] name = "thiserror" version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" dependencies = [ "thiserror-impl 1.0.69", ] [[package]] name = "thiserror" version = "2.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3467d614147380f2e4e374161426ff399c91084acd2363eaf549172b3d5e60c0" dependencies = [ "thiserror-impl 2.0.16", ] [[package]] name = "thiserror-impl" version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "thiserror-impl" version = "2.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c5e1be1c48b9172ee610da68fd9cd2770e7a4056cb3fc98710ee6906f0c7960" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "tiff" version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba1310fcea54c6a9a4fd1aad794ecc02c31682f6bfbecdf460bf19533eed1e3e" dependencies = [ "flate2", "jpeg-decoder", "weezl", ] [[package]] name = "time" version = "0.3.41" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" dependencies = [ "deranged", "num-conv", "powerfmt", "serde", "time-core", ] [[package]] name = "time-core" version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c" [[package]] name = "tokio" version = "1.47.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038" dependencies = [ "backtrace", "io-uring", "libc", "mio 1.0.4", "pin-project-lite", "slab", "tokio-macros", ] [[package]] name = "tokio-macros" version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "toml" version = "0.8.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" dependencies = [ "serde", "serde_spanned", "toml_datetime", "toml_edit", ] [[package]] name = "toml_datetime" version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" dependencies = [ "serde", ] [[package]] name = "toml_edit" version = "0.22.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" dependencies = [ "indexmap", "serde", "serde_spanned", "toml_datetime", "toml_write", "winnow", ] [[package]] name = "toml_write" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" [[package]] name = "typenum" version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" [[package]] name = "unicode-ident" version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" [[package]] name = "unicode-segmentation" version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" [[package]] name = "unicode-truncate" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b3644627a5af5fa321c95b9b235a72fd24cd29c648c2c379431e6628655627bf" dependencies = [ "itertools 0.13.0", "unicode-segmentation", "unicode-width 0.1.14", ] [[package]] name = "unicode-width" version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" [[package]] name = "unicode-width" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fc81956842c57dac11422a97c3b8195a1ff727f06e85c84ed2e8aa277c9a0fd" [[package]] name = "utf8parse" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "v_frame" version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "666b7727c8875d6ab5db9533418d7c764233ac9c0cff1d469aec8fa127597be2" dependencies = [ "aligned-vec", "num-traits", "wasm-bindgen", ] [[package]] name = "version-compare" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "852e951cb7832cb45cb1169900d19760cfa39b82bc0ea9c0e5a14ae88411c98b" [[package]] name = "version_check" version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "viuer" version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec2ede5c8814363f92f862892dfe71a266f6816b649ca435aed1ff5e2cf3454e" dependencies = [ "ansi_colours", "base64 0.21.7", "console", "crossterm 0.27.0", "image 0.24.9", "lazy_static", "tempfile", "termcolor", ] [[package]] name = "vsimd" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c3082ca00d5a5ef149bb8b555a72ae84c9c59f7250f013ac822ac2e49b19c64" [[package]] name = "wasi" version = "0.11.1+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasi" version = "0.14.2+wasi-0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" dependencies = [ "wit-bindgen-rt", ] [[package]] name = "wasm-bindgen" version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" dependencies = [ "cfg-if", "once_cell", "rustversion", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" dependencies = [ "bumpalo", "log", "proc-macro2", "quote", "syn", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-macro" version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" dependencies = [ "quote", "wasm-bindgen-macro-support", ] [[package]] name = "wasm-bindgen-macro-support" version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", "syn", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" dependencies = [ "unicode-ident", ] [[package]] name = "weezl" version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a751b3277700db47d3e574514de2eced5e54dc8a5436a3bf7a0b248b2cee16f3" [[package]] name = "winapi" version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" dependencies = [ "winapi-i686-pc-windows-gnu", "winapi-x86_64-pc-windows-gnu", ] [[package]] name = "winapi-i686-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0978bf7171b3d90bac376700cb56d606feb40f251a475a5d6634613564460b22" dependencies = [ "windows-sys 0.60.2", ] [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windows" version = "0.58.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd04d41d93c4992d421894c18c8b43496aa748dd4c081bac0dc93eb0489272b6" dependencies = [ "windows-core", "windows-targets 0.52.6", ] [[package]] name = "windows-core" version = "0.58.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6ba6d44ec8c2591c134257ce647b7ea6b20335bf6379a27dac5f1641fcf59f99" dependencies = [ "windows-implement", "windows-interface", "windows-result", "windows-strings", "windows-targets 0.52.6", ] [[package]] name = "windows-implement" version = "0.58.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "windows-interface" version = "0.58.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "windows-link" version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" [[package]] name = "windows-result" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" dependencies = [ "windows-targets 0.52.6", ] [[package]] name = "windows-strings" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" dependencies = [ "windows-result", "windows-targets 0.52.6", ] [[package]] name = "windows-sys" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ "windows-targets 0.48.5", ] [[package]] name = "windows-sys" version = "0.59.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" dependencies = [ "windows-targets 0.52.6", ] [[package]] name = "windows-sys" version = "0.60.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" dependencies = [ "windows-targets 0.53.3", ] [[package]] name = "windows-targets" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" dependencies = [ "windows_aarch64_gnullvm 0.48.5", "windows_aarch64_msvc 0.48.5", "windows_i686_gnu 0.48.5", "windows_i686_msvc 0.48.5", "windows_x86_64_gnu 0.48.5", "windows_x86_64_gnullvm 0.48.5", "windows_x86_64_msvc 0.48.5", ] [[package]] name = "windows-targets" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ "windows_aarch64_gnullvm 0.52.6", "windows_aarch64_msvc 0.52.6", "windows_i686_gnu 0.52.6", "windows_i686_gnullvm 0.52.6", "windows_i686_msvc 0.52.6", "windows_x86_64_gnu 0.52.6", "windows_x86_64_gnullvm 0.52.6", "windows_x86_64_msvc 0.52.6", ] [[package]] name = "windows-targets" version = "0.53.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d5fe6031c4041849d7c496a8ded650796e7b6ecc19df1a431c1a363342e5dc91" dependencies = [ "windows-link", "windows_aarch64_gnullvm 0.53.0", "windows_aarch64_msvc 0.53.0", "windows_i686_gnu 0.53.0", "windows_i686_gnullvm 0.53.0", "windows_i686_msvc 0.53.0", "windows_x86_64_gnu 0.53.0", "windows_x86_64_gnullvm 0.53.0", "windows_x86_64_msvc 0.53.0", ] [[package]] name = "windows_aarch64_gnullvm" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] name = "windows_aarch64_gnullvm" version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" [[package]] name = "windows_aarch64_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_aarch64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] name = "windows_aarch64_msvc" version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" [[package]] name = "windows_i686_gnu" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" [[package]] name = "windows_i686_gnu" version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" [[package]] name = "windows_i686_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] name = "windows_i686_gnullvm" version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" [[package]] name = "windows_i686_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_i686_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] name = "windows_i686_msvc" version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" [[package]] name = "windows_x86_64_gnu" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] name = "windows_x86_64_gnu" version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" [[package]] name = "windows_x86_64_gnullvm" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] name = "windows_x86_64_gnullvm" version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" [[package]] name = "windows_x86_64_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "windows_x86_64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "windows_x86_64_msvc" version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" [[package]] name = "winnow" version = "0.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f3edebf492c8125044983378ecb5766203ad3b4c2f7a922bd7dd207f6d443e95" dependencies = [ "memchr", ] [[package]] name = "wit-bindgen-rt" version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" dependencies = [ "bitflags 2.9.1", ] [[package]] name = "x11rb" version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5d91ffca73ee7f68ce055750bf9f6eca0780b8c85eff9bc046a3b0da41755e12" dependencies = [ "gethostname", "rustix 0.38.44", "x11rb-protocol", ] [[package]] name = "x11rb-protocol" version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec107c4503ea0b4a98ef47356329af139c0a4f7750e621cf2973cd3385ebcb3d" [[package]] name = "xml-rs" version = "0.8.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6fd8403733700263c6eb89f192880191f1b83e332f7a20371ddcf421c4a337c7" [[package]] name = "xz2" version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "388c44dc09d76f1536602ead6d325eb532f5c122f17782bd57fb47baeeb767e2" dependencies = [ "lzma-sys", ] [[package]] name = "zerocopy" version = "0.8.26" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" version = "0.8.26" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "zeroize" version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" dependencies = [ "zeroize_derive", ] [[package]] name = "zeroize_derive" version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "zip" version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "760394e246e4c28189f19d488c058bf16f564016aefac5d32bb1f3b51d5e9261" dependencies = [ "byteorder", "crc32fast", "crossbeam-utils", "flate2", ] [[package]] name = "zip" version = "2.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fabe6324e908f85a1c52063ce7aa26b68dcb7eb6dbc83a2d148403c9bc3eba50" dependencies = [ "aes", "arbitrary", "bzip2", "constant_time_eq", "crc32fast", "crossbeam-utils", "deflate64", "displaydoc", "flate2", "getrandom 0.3.3", "hmac", "indexmap", "lzma-rs", "memchr", "pbkdf2", "sha1", "thiserror 2.0.16", "time", "xz2", "zeroize", "zopfli", "zstd", ] [[package]] name = "zopfli" version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "edfc5ee405f504cd4984ecc6f14d02d55cfda60fa4b689434ef4102aae150cd7" dependencies = [ "bumpalo", "crc32fast", "log", "simd-adler32", ] [[package]] name = "zstd" version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a" dependencies = [ "zstd-safe", ] [[package]] name = "zstd-safe" version = "7.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d" dependencies = [ "zstd-sys", ] [[package]] name = "zstd-sys" version = "2.0.15+zstd.1.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eb81183ddd97d0c74cedf1d50d85c8d08c1b8b68ee863bdee9e706eedba1a237" dependencies = [ "cc", "pkg-config", ] [[package]] name = "zune-core" version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f423a2c17029964870cfaabb1f13dfab7d092a62a29a89264f4d36990ca414a" [[package]] name = "zune-inflate" version = "0.2.54" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73ab332fe2f6680068f3582b16a24f90ad7096d5d39b974d1c0aff0125116f02" dependencies = [ "simd-adler32", ] [[package]] name = "zune-jpeg" version = "0.4.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc1f7e205ce79eb2da3cd71c5f55f3589785cb7c79f6a03d1c8d1491bda5d089" dependencies = [ "zune-core", ] doxx-0.1.4/Cargo.toml0000644000000070151046102023000100430ustar # THIS FILE IS AUTOMATICALLY GENERATED BY CARGO # # When uploading crates to the registry Cargo will automatically # "normalize" Cargo.toml files for maximal compatibility # with all versions of Cargo and also rewrite `path` dependencies # to registry (e.g., crates.io) dependencies. # # If you are reading this file be aware that the original Cargo.toml # will likely look very different (and much more reasonable). # See Cargo.toml.orig for the original contents. [package] edition = "2021" name = "doxx" version = "0.1.4" authors = ["Brandon Greenwell "] build = false exclude = [ "CLAUDE.md", "assets/", "src/bin/generate_test_docs.rs", "tests/fixtures/README.md", ".DS_Store", "*.tmp", "*.log", "*.bak", "*~", ] autolib = false autobins = false autoexamples = false autotests = false autobenches = false default-run = "doxx" description = "Terminal document viewer for .docx files" homepage = "https://github.com/bgreenwell/doxx" documentation = "https://github.com/bgreenwell/doxx#readme" readme = "README.md" keywords = [ "docx", "terminal", "document", "viewer", "tui", ] categories = [ "command-line-utilities", "text-processing", ] license = "MIT" repository = "https://github.com/bgreenwell/doxx" [package.metadata.release] pre-release-commit-message = "chore: release {{version}}" tag-message = "Release {{version}}" [[package.metadata.release.pre-release-replacements]] file = "CHANGELOG.md" search = '## \[Unreleased\]' replace = """ ## [Unreleased] ## [{{version}}] - {{date}}""" exactly = 1 [package.metadata.aur] depends = [] makedepends = ["cargo"] [package.metadata.wix] upgrade-guid = "9d14176b-1499-42ef-bc1a-c6570e19717a" path-guid = "12997dda-1476-4350-adba-af75a7270d8e" license = false eula = false [lib] name = "doxx" crate-type = ["rlib"] path = "src/lib.rs" [[bin]] name = "doxx" path = "src/main.rs" [[test]] name = "ansi_export_test" path = "tests/ansi_export_test.rs" [[test]] name = "integration_test" path = "tests/integration_test.rs" [[test]] name = "mixed_formatting_test" path = "tests/mixed_formatting_test.rs" [[test]] name = "roundtrip_test" path = "tests/roundtrip_test.rs" [[test]] name = "search_functionality_test" path = "tests/search_functionality_test.rs" [[test]] name = "strikethrough_test" path = "tests/strikethrough_test.rs" [[test]] name = "test_image_extraction" path = "tests/test_image_extraction.rs" [[test]] name = "unicode_safety" path = "tests/unicode_safety.rs" [dependencies.anyhow] version = "1.0" [dependencies.arboard] version = "3.3" [dependencies.clap] version = "4.4" features = ["derive"] [dependencies.crossterm] version = "0.27" [dependencies.dirs] version = "5.0" [dependencies.docx-rs] version = "0.4" [dependencies.image] version = "0.25" [dependencies.once_cell] version = "1.19" [dependencies.quick-xml] version = "0.36" [dependencies.ratatui] version = "0.29" [dependencies.ratatui-image] version = "8.0" [dependencies.regex] version = "1.10" [dependencies.serde] version = "1.0" features = ["derive"] [dependencies.serde_json] version = "1.0" [dependencies.thiserror] version = "1.0" [dependencies.tokio] version = "1.0" features = [ "rt-multi-thread", "macros", "fs", ] [dependencies.toml] version = "0.8" [dependencies.unicode-segmentation] version = "1.10" [dependencies.unicode-width] version = "0.2.0" [dependencies.viuer] version = "0.7" [dependencies.zip] version = "2.0" [profile.dist] lto = "thin" inherits = "release" [profile.release] lto = true codegen-units = 1 doxx-0.1.4/Cargo.toml.orig000064400000000000000000000036771046102023000135140ustar 00000000000000[package] name = "doxx" version = "0.1.4" edition = "2021" description = "Terminal document viewer for .docx files" license = "MIT" repository = "https://github.com/bgreenwell/doxx" homepage = "https://github.com/bgreenwell/doxx" documentation = "https://github.com/bgreenwell/doxx#readme" readme = "README.md" authors = ["Brandon Greenwell "] keywords = ["docx", "terminal", "document", "viewer", "tui"] categories = ["command-line-utilities", "text-processing"] default-run = "doxx" exclude = [ "CLAUDE.md", "assets/", "src/bin/generate_test_docs.rs", "tests/fixtures/README.md", ".DS_Store", "*.tmp", "*.log", "*.bak", "*~" ] [lib] name = "doxx" crate-type = ["rlib"] [dependencies] # Document parsing docx-rs = "0.4" # Terminal UI ratatui = "0.29" crossterm = "0.27" arboard = "3.3" # Image support viuer = "0.7" image = "0.25" zip = "2.0" ratatui-image = "8.0" tokio = { version = "1.0", features = ["rt-multi-thread", "macros", "fs"] } # Text processing unicode-segmentation = "1.10" regex = "1.10" once_cell = "1.19" quick-xml = "0.36" # CLI and utilities clap = { version = "4.4", features = ["derive"] } serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" anyhow = "1.0" thiserror = "1.0" # Configuration dirs = "5.0" toml = "0.8" unicode-width = "0.2.0" # Release optimizations [profile.release] codegen-units = 1 lto = true [profile.dist] inherits = "release" lto = "thin" [package.metadata.release] pre-release-replacements = [ { file = "CHANGELOG.md", search = "## \\[Unreleased\\]", replace = "## [Unreleased]\n\n## [{{version}}] - {{date}}", exactly = 1 }, ] pre-release-commit-message = "chore: release {{version}}" tag-message = "Release {{version}}" [package.metadata.aur] depends = [] makedepends = ["cargo"] [package.metadata.wix] upgrade-guid = "9d14176b-1499-42ef-bc1a-c6570e19717a" path-guid = "12997dda-1476-4350-adba-af75a7270d8e" license = false eula = false doxx-0.1.4/Formula/doxx.rb000064400000000000000000000016621046102023000135310ustar 00000000000000class Doxx < Formula desc "Terminal document viewer for .docx files" homepage "https://github.com/bgreenwell/doxx" version "0.1.2" license "MIT" on_macos do on_arm do url "https://github.com/bgreenwell/doxx/releases/download/v#{version}/doxx-aarch64-apple-darwin.tar.xz" sha256 "PLACEHOLDER" end on_intel do url "https://github.com/bgreenwell/doxx/releases/download/v#{version}/doxx-x86_64-apple-darwin.tar.xz" sha256 "PLACEHOLDER" end end on_linux do on_arm do url "https://github.com/bgreenwell/doxx/releases/download/v#{version}/doxx-aarch64-unknown-linux-gnu.tar.xz" sha256 "PLACEHOLDER" end on_intel do url "https://github.com/bgreenwell/doxx/releases/download/v#{version}/doxx-x86_64-unknown-linux-gnu.tar.xz" sha256 "PLACEHOLDER" end end def install bin.install "doxx" end test do system "#{bin}/doxx", "--version" end end doxx-0.1.4/LICENSE000064400000000000000000000020551046102023000116170ustar 00000000000000MIT License Copyright (c) 2025 Ben Greenwell Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.doxx-0.1.4/README.md000064400000000000000000000271021046102023000120710ustar 00000000000000# doxx 📄 > `.docx` files in your terminal — no Microsoft Word required [![CI](https://img.shields.io/github/actions/workflow/status/bgreenwell/doxx/ci.yml?style=for-the-badge)](https://github.com/bgreenwell/doxx/actions/workflows/ci.yml) [![Crates.io](https://img.shields.io/crates/v/doxx.svg?style=for-the-badge)](https://crates.io/crates/doxx) [![Downloads](https://img.shields.io/crates/d/doxx?style=for-the-badge)](https://crates.io/crates/doxx) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg?style=for-the-badge)](https://opensource.org/licenses/MIT) [![Rust](https://img.shields.io/badge/rust-1.70%2B-orange.svg?style=for-the-badge&logo=rust)](https://www.rust-lang.org) [![Easy Install](https://img.shields.io/badge/Easy%20Install-Homebrew%20%7C%20Scoop-FBB040?style=for-the-badge)](#installation) [![Platform](https://img.shields.io/badge/Platform-Linux%20%7C%20macOS%20%7C%20Windows-blue?style=for-the-badge)](https://github.com/bgreenwell/doxx/releases/latest) A fast, terminal-native document viewer for Word files. View, search, and export `.docx` documents without leaving your command line. ## Screenshots
Terminal image display
Terminal image display
Color support
Color support
Smart tables
Smart tables with alignment
Lists and formatting
Lists and formatting
Equation support
Inline and display equations
## 🎬 Demo
doxx mixed formatting demo
Mixed formatting with colors, bold, italic, underline, strikethrough and interactive navigation
## ✨ Features - **Beautiful terminal rendering** with formatting, tables, and lists - **Equation support** — LaTeX rendering for inline and display equations 📐 - **Fast search** with highlighting 🔍 - **Smart tables** with proper alignment and Unicode borders - **Copy to clipboard** — grab content directly from the terminal - **Export formats** — Markdown, CSV, JSON, plain text, ANSI-colored output - **Terminal images** for Kitty, iTerm2, WezTerm 🖼️ - **Color support** — see Word document colors in your terminal ## 🚀 Installation ### Package managers #### Homebrew (macOS/Linux) ```bash brew install doxx ``` #### Cargo (cross-platform) ```bash cargo install doxx ``` #### Debian/Ubuntu `doxx` is officially packaged for Debian as [`rust-doxx`](https://tracker.debian.org/pkg/rust-doxx) and is available in testing (forky). ```bash sudo apt install doxx ``` #### Arch Linux ```bash pacman -S doxx ``` The AUR package is also available for the development version: ```bash yay -S doxx-git ``` *Thanks to [@mhegreberg](https://github.com/mhegreberg) for creating and maintaining the AUR package!* #### Nix (cross-platform) ```bash nix profile install github:bgreenwell/doxx ``` *Thanks to [@bobberb](https://github.com/bobberb) for creating the Nix flake!* #### NetBSD ```bash pkgin install doxx ``` #### Conda-Forge (cross-platform) ```bash conda install doxx ``` or globally using [Pixi](pixi.sh): ```bash pixi global install doxx ``` #### Scoop (Windows) ```bash # Coming soon scoop bucket add doxx https://github.com/bgreenwell/doxx-scoop scoop install doxx ``` ### Pre-built binaries Download from [GitHub releases](https://github.com/bgreenwell/doxx/releases): ```bash # macOS/Linux - automatic platform detection curl -L https://github.com/bgreenwell/doxx/releases/latest/download/doxx-$(uname -s)-$(uname -m).tar.gz | tar xz sudo mv doxx /usr/local/bin/ # Verify installation doxx --version ``` **Available platforms:** - **Linux**: `x86_64-unknown-linux-musl` (statically linked) - **macOS**: `x86_64-apple-darwin` (Intel) and `aarch64-apple-darwin` (Apple Silicon) - **Windows**: `x86_64-pc-windows-msvc` ### Build from source ```bash git clone https://github.com/bgreenwell/doxx.git cd doxx cargo install --path . # Or for development cargo build --release ``` **Requirements:** - Rust 1.70+ - System dependencies: `libxcb` (Linux only) ## 🎯 Usage ```bash # View a document doxx report.docx # Search for content doxx contract.docx --search "payment" # Start with outline view doxx document.docx --outline # Export to different formats doxx data.docx --export csv > data.csv doxx report.docx --export markdown > report.md # View with images (supported terminals) doxx presentation.docx --images --export text # Enable color rendering doxx slides.docx --color ``` ## 📋 Command Line Options ### Basic options ```bash doxx [OPTIONS] ``` | Option | Description | |--------|-------------| | `` | Input document file (.docx) | | `-h, --help` | Show help information | | `-V, --version` | Show version information | ### Viewing options | Option | Description | |--------|-------------| | `-o, --outline` | Start with outline view for quick navigation | | `-p, --page ` | Jump to specific page number on startup | | `-s, --search ` | Search and highlight term immediately | | `--force-ui` | Force interactive UI mode (bypass TTY detection) | | `--color` | Enable color support for text rendering | ### Export options | Option | Values | Description | |--------|--------|-------------| | `--export ` | `markdown`, `text`, `csv`, `json`, `ansi` | Export document instead of viewing | **Export examples:** ```bash doxx report.docx --export markdown # Convert to Markdown doxx data.docx --export csv # Extract tables as CSV (tables only!) doxx document.docx --export text # Plain text output doxx structure.docx --export json # Document metadata as JSON doxx document.docx --export ansi # ANSI-colored terminal output ``` **📊 CSV export note:** The CSV export extracts **only tables** from the document, ignoring all text content. Perfect for pulling structured data from business reports, research papers, or surveys for analysis in Excel, Python, or databases. ### ANSI export options | Option | Values | Description | |--------|--------|-------------| | `-w, --terminal-width ` | Number | Set terminal width for formatting (default: $COLUMNS or 80) | | `--color-depth ` | `auto`, `1`, `4`, `8`, `24` | Control color rendering depth | **ANSI export examples:** ```bash doxx document.docx --export ansi # Full color ANSI output doxx document.docx --export ansi --color-depth 1 # Monochrome (no colors) doxx document.docx --export ansi --color-depth 4 # 16 colors doxx document.docx --export ansi --terminal-width 80 # Set terminal width doxx report.docx --export ansi | less -R # Pipe to less with color support ``` **🌈 Color depth options:** - `auto` - Auto-detect terminal capabilities - `1` - Monochrome (no colors, formatting only) - `4` - 16 colors (standard ANSI colors) - `8` - 256 colors (extended ANSI palette) - `24` - True color (16.7 million colors) ### Image options | Option | Description | |--------|-------------| | `--images` | Display images inline in terminal (auto-detect capabilities) | | `--extract-images ` | Extract images to specified directory | | `--image-width ` | Maximum image width in terminal columns (default: auto-detect) | | `--image-height ` | Maximum image height in terminal rows (default: auto-detect) | | `--image-scale ` | Image scaling factor (0.1 to 2.0, default: 1.0) | **Image examples:** ```bash doxx presentation.docx --images # Show images inline doxx document.docx --images --image-width 80 # Limit image width doxx slides.docx --extract-images ./images/ # Save images to folder ``` **⚠️ Image display notes:** - `--images` currently works with `--export text` mode and shows placeholders in TUI - Supports iTerm2, Kitty, and WezTerm terminals ## ⌨️ Navigation | Key | Action | |-----|--------| | `↑`/`k` | Scroll up | | `↓`/`j` | Scroll down | | `o` | Toggle outline | | `s` | Search | | `c` | Copy to clipboard | | `h` | Help | | `q` | Quit | ## 🔧 Why doxx? Current terminal tools for Word documents: - **docx2txt** → Loses all formatting, mangled tables - **pandoc** → Complex chain, formatting lost - **antiword** → Only handles old `.doc` files **doxx** gives you: - ✅ Rich formatting preserved (bold, italic, headers) - ✅ Professional table rendering with alignment - ✅ Equation support (inline and display LaTeX) - ✅ Interactive navigation and search - ✅ Multiple export formats for workflows - ✅ Terminal image display for modern terminals - ✅ Fast startup (50ms vs Word's 8+ seconds) Perfect for developers, sysadmins, and anyone who prefers the terminal. ## 📊 Examples ### Quick document analysis ```bash # Get overview and search doxx quarterly-report.docx doxx --search "revenue" # Extract tables for analysis doxx financial-data.docx --export csv | python analyze.py ``` ### Copy workflows ```bash # Review and copy sections doxx meeting-notes.docx # Press 'c' to copy current view to clipboard # Copy search results doxx specs.docx --search "requirements" # Press F2 to copy results with context ``` ### Pipeline integration ```bash # Extract text for processing doxx notes.docx --export text | grep "action items" # Get document structure doxx report.docx --export json | jq '.metadata' ``` ## 🏗️ Architecture Built with Rust for performance: - **[docx-rs](https://crates.io/crates/docx-rs)** — Document parsing - **[ratatui](https://crates.io/crates/ratatui)** — Terminal UI - **[viuer](https://crates.io/crates/viuer)** — Image rendering - **[unicode-segmentation](https://crates.io/crates/unicode-segmentation)** — Proper Unicode handling ## 🛠️ Development ```bash # Build and test cargo build --release cargo test # Run with sample document cargo run -- tests/fixtures/minimal.docx ``` ## Known limitations **Equation positioning:** Display equations may not appear at exact positions due to limitations in the underlying docx-rs parsing library. We've filed an [upstream issue](https://github.com/bokuweb/docx-rs/issues) and are planning a complete fix for v0.2.0 using direct XML parsing. ## Roadmap - Perfect equation positioning (v0.2.0) - Image support in TUI via ratatui-image crate - Enhanced table support (merged cells, complex layouts) - Performance improvements for large documents - Hyperlink navigation - Custom themes ## 💡 Inspiration This project was inspired by [Charm](https://github.com/charmbracelet)'s [Glow](https://github.com/charmbracelet/glow) package — the beautiful terminal Markdown renderer that shows how terminal document viewing can be both powerful and elegant. Just as Glow brings rich Markdown rendering to your command line, doxx aims to do the same for Microsoft Word documents. Thanks to the Charm team for the inspiration! ✨ ## 📝 License MIT License — see [LICENSE](LICENSE) file for details. --- **Made for developers who live in the terminal** 🚀 doxx-0.1.4/RELEASE.md000064400000000000000000000113531046102023000122150ustar 00000000000000# Release guide for doxx This document outlines the complete release process for doxx, including automated pipelines and manual steps. ## 🎯 Release overview The release pipeline includes: - ✅ **Cross-platform binaries** (Linux, macOS Intel/ARM, Windows) - ✅ **GitHub releases** with automated changelog - ✅ **crates.io publishing** for `cargo install doxx` - ✅ **Homebrew formula** (automated updates) - ✅ **Checksums** for security verification - ✅ **Modern GitHub Actions** with proper error handling ## 🚀 Quick release process ### 1. Prepare release ```bash # Make sure you're on main branch and working directory is clean git checkout main git pull origin main # Run the automated release script ./scripts/release.sh [major|minor|patch] # Example for patch release (0.1.0 -> 0.1.1) ./scripts/release.sh patch ``` ### 2. The script will: - ✅ Bump version in `Cargo.toml` - ✅ Run tests to ensure everything works - ✅ Update `Cargo.lock` - ✅ Commit version bump - ✅ Create and push git tag (e.g., `v0.1.1`) - ✅ Trigger GitHub Actions automatically ### 3. GitHub Actions will: - ✅ Build cross-platform binaries (Linux musl, macOS Intel/ARM, Windows) - ✅ Create draft GitHub release with CHANGELOG.md - ✅ Generate SHA256 checksums - ✅ Publish to crates.io (when draft is published) - ✅ Update Homebrew formula automatically ### 4. Manual steps 1. **Review draft release** - Go to [GitHub releases](https://github.com/bgreenwell/doxx/releases) - Edit the draft release created by Actions - Add release highlights and breaking changes if any 2. **Publish release** - Click "Publish release" to make it live - This triggers crates.io publishing - Homebrew formula gets updated automatically ## 📦 Package manager status ### ✅ Active package managers - **crates.io**: `cargo install doxx` ✅ Automated - **GitHub releases**: Direct binary downloads ✅ Automated - **Homebrew**: In progress 🚧 (Formula ready, tap needed) ### 🚧 Future package managers - **Scoop** (Windows): Repository structure ready - **Chocolatey** (Windows): Future consideration - **Snap** (Linux): Future consideration - **AUR** (Arch Linux): Community contribution welcome ## 🔍 Testing release pipeline ### Test without publishing ```bash # Test packaging for crates.io (dry run) cargo publish --dry-run # Test binary builds locally cargo build --release --target x86_64-unknown-linux-musl cargo build --release --target x86_64-apple-darwin # Test CLI works correctly ./target/release/doxx --version ./target/release/doxx tests/fixtures/minimal.docx --export text ``` ### Verify release assets After GitHub release is published: ```bash # Download and verify checksums wget https://github.com/bgreenwell/doxx/releases/latest/download/doxx-checksums.txt wget https://github.com/bgreenwell/doxx/releases/latest/download/doxx-linux-x86_64.tar.gz # Verify checksum matches sha256sum doxx-linux-x86_64.tar.gz grep linux-x86_64 doxx-checksums.txt ``` ## 📋 Pre-release checklist - [ ] All CI/CD tests passing on main branch - [ ] `CHANGELOG.md` updated with release notes - [ ] Version number follows semantic versioning - [ ] All new features documented in README - [ ] Breaking changes clearly documented - [ ] Security issues addressed - [ ] Dependencies updated and audited ## 🛠 Troubleshooting ### Release script issues ```bash # If release script fails, check: git status # Working directory clean? cargo test --all-features # All tests pass? cargo clippy -- -D warnings # No linting issues? ``` ### GitHub Actions issues - Check Actions tab for build failures - Common issues: Missing secrets (`CARGO_REGISTRY_TOKEN`) - Platform-specific build failures (usually dependency issues) ### crates.io publishing issues - Ensure `CARGO_REGISTRY_TOKEN` secret is set - Verify all required metadata in `Cargo.toml` - Check for naming conflicts ## 🔐 Required secrets Repository secrets needed for full automation: - `CARGO_REGISTRY_TOKEN`: For publishing to crates.io - Get from https://crates.io/me - Scope: "Publish new crates and update existing crates" ## 📈 Success metrics After release, verify: - [ ] GitHub release created with all binary assets - [ ] crates.io shows new version (may take a few minutes) - [ ] `cargo install doxx` works with new version - [ ] Download links in README work correctly - [ ] Homebrew formula updated (if tap is public) ## 🎉 Post-release 1. **Announce release** - Update README badges if needed - Consider social media announcement - Update any documentation sites 2. **Monitor** - Watch for user issues or bug reports - Monitor download statistics - Track performance metrics --- **Need help?** Check the GitHub Actions logs or open an issue for release pipeline problems.doxx-0.1.4/RELEASE_CHECKLIST.md000064400000000000000000000067451046102023000136170ustar 00000000000000# Release Checklist Use this checklist when preparing a new release of doxx. You can also create a GitHub issue using the "Release" template to track progress. ## Pre-Release - [ ] All tests passing: `cargo test` - [ ] No clippy warnings: `cargo clippy` - [ ] Code is formatted: `cargo fmt --check` - [ ] CHANGELOG.md updated: - [ ] Move items from `[Unreleased]` to new `[X.Y.Z] - YYYY-MM-DD` section - [ ] Keep `[Unreleased]` section empty for future changes - [ ] Verify changelog entries are accurate and complete - [ ] Version bumped in `Cargo.toml` - [ ] Test binary works: `cargo run --release -- tests/fixtures/comprehensive.docx` ## Create Release - [ ] Commit version bump: `git commit -m "chore: release X.Y.Z"` - [ ] Push to main: `git push` - [ ] Create version tag: `git tag vX.Y.Z` - [ ] Push tag: `git push origin vX.Y.Z` - [ ] Wait for GitHub Actions workflows to complete (~10-15 minutes) ## Verify Automated Releases All of the following are now automated via GitHub Actions: - [ ] **GitHub Release** created at https://github.com/bgreenwell/doxx/releases/tag/vX.Y.Z - [ ] All platform binaries present (Linux, macOS, Windows) - [ ] Tarballs (.tar.xz) and ZIP archive - [ ] MSI installer for Windows - [ ] Shell/PowerShell installer scripts - [ ] SHA256 checksum files - [ ] **Homebrew** formula published to [bgreenwell/homebrew-doxx](https://github.com/bgreenwell/homebrew-doxx) - Automated by: `publish-homebrew-formula` job in release.yml - [ ] **Scoop** manifest published to [bgreenwell/scoop-bucket](https://github.com/bgreenwell/scoop-bucket) - Automated by: `.github/workflows/publish-scoop.yml` - [ ] **crates.io** published at https://crates.io/crates/doxx - Automated by: `publish-crates-io` job in release.yml - [ ] **AUR** package updated at [doxx-bin](https://aur.archlinux.org/packages/doxx-bin) - Automated by: `.github/workflows/publish-aur.yml` - PKGBUILD and .SRCINFO auto-generated and pushed - [ ] **WinGet** manifest PR created to [microsoft/winget-pkgs](https://github.com/microsoft/winget-pkgs) - Automated by: `.github/workflows/publish-winget.yml` - **Note:** PR may require manual merge approval from Microsoft team (1-2 days) ## Test Installations - [ ] **Homebrew (macOS/Linux)**: ```bash brew update && brew upgrade doxx doxx --version ``` - [ ] **Scoop (Windows)**: ```powershell scoop update && scoop update doxx doxx --version ``` - [ ] **AUR (Arch Linux)**: ```bash yay -Syu doxx-bin doxx --version ``` - [ ] **WinGet (Windows)**: ```powershell winget upgrade bgreenwell.doxx doxx --version ``` **Note:** May take 1-2 days for WinGet PR to be merged ## Post-Release - [ ] All automated workflows completed successfully (check GitHub Actions) - [ ] Close release tracking issue ## Troubleshooting **GitHub Actions fails:** Verify all secrets are configured: `HOMEBREW_TAP_TOKEN`, `SCOOP_BUCKET_TOKEN`, `CARGO_REGISTRY_TOKEN`, `AUR_SSH_PRIVATE_KEY`, `WINGET_TOKEN` **AUR automation fails:** Check SSH key is valid (`AUR_SSH_PRIVATE_KEY` secret). Verify `doxx-bin` package exists at aur.archlinux.org. **WinGet PR not appearing:** Check `.github/workflows/publish-winget.yml` logs. May need to create PR manually with `komac update`. For detailed workflow information: - `.github/workflows/release.yml` — main release, Homebrew, crates.io - `.github/workflows/publish-scoop.yml` — Scoop bucket - `.github/workflows/publish-aur.yml` — AUR publishing - `.github/workflows/publish-winget.yml` — WinGet manifests doxx-0.1.4/dist-workspace.toml000064400000000000000000000015171046102023000144500ustar 00000000000000[workspace] members = ["cargo:."] # Config for 'dist' [dist] # The preferred dist version to use in CI (Cargo.toml SemVer syntax) cargo-dist-version = "0.30.2" # CI backends to support ci = "github" # The installers to generate for each app installers = ["shell", "powershell", "homebrew", "msi"] # A GitHub repo to push Homebrew formulas to tap = "bgreenwell/homebrew-doxx" scoop-bucket = "bgreenwell/scoop-bucket" # Target platforms to build apps for (Rust target-triple syntax) targets = ["aarch64-apple-darwin", "aarch64-unknown-linux-gnu", "x86_64-apple-darwin", "x86_64-unknown-linux-gnu", "x86_64-unknown-linux-musl", "x86_64-pc-windows-msvc"] # Path that installers should place binaries in install-path = "CARGO_HOME" # Publish jobs to run in CI publish-jobs = ["homebrew"] # Whether to install an updater program install-updater = true doxx-0.1.4/flake.lock000064400000000000000000000037661046102023000125600ustar 00000000000000{ "nodes": { "flake-utils": { "inputs": { "systems": "systems" }, "locked": { "lastModified": 1731533236, "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", "owner": "numtide", "repo": "flake-utils", "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", "type": "github" }, "original": { "owner": "numtide", "repo": "flake-utils", "type": "github" } }, "nixpkgs": { "locked": { "lastModified": 1755615617, "narHash": "sha256-HMwfAJBdrr8wXAkbGhtcby1zGFvs+StOp19xNsbqdOg=", "owner": "NixOS", "repo": "nixpkgs", "rev": "20075955deac2583bb12f07151c2df830ef346b4", "type": "github" }, "original": { "owner": "NixOS", "ref": "nixos-unstable", "repo": "nixpkgs", "type": "github" } }, "root": { "inputs": { "flake-utils": "flake-utils", "nixpkgs": "nixpkgs", "rust-overlay": "rust-overlay" } }, "rust-overlay": { "inputs": { "nixpkgs": [ "nixpkgs" ] }, "locked": { "lastModified": 1756003222, "narHash": "sha256-lmEMhIIbjt8Wp1EYbNqCojuU9ygyDFv8Tu0X1k8qIMc=", "owner": "oxalica", "repo": "rust-overlay", "rev": "88ceedecde53e809b4bf8b5fd10d181889d9bac7", "type": "github" }, "original": { "owner": "oxalica", "repo": "rust-overlay", "type": "github" } }, "systems": { "locked": { "lastModified": 1681028828, "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", "owner": "nix-systems", "repo": "default", "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", "type": "github" }, "original": { "owner": "nix-systems", "repo": "default", "type": "github" } } }, "root": "root", "version": 7 } doxx-0.1.4/flake.nix000064400000000000000000000110211046102023000124050ustar 00000000000000{ description = "doxx - Expose the contents of .docx files without leaving your terminal"; inputs = { nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; rust-overlay = { url = "github:oxalica/rust-overlay"; inputs.nixpkgs.follows = "nixpkgs"; }; flake-utils.url = "github:numtide/flake-utils"; }; outputs = { self, nixpkgs, rust-overlay, flake-utils }: flake-utils.lib.eachDefaultSystem (system: let overlays = [ (import rust-overlay) ]; pkgs = import nixpkgs { inherit system overlays; }; # Use the latest stable Rust toolchain rustToolchain = pkgs.rust-bin.stable.latest.default.override { extensions = [ "rust-src" "clippy" "rustfmt" ]; }; # Define the package doxx = pkgs.rustPlatform.buildRustPackage rec { pname = "doxx"; version = "0.1.2"; src = ./.; cargoLock = { lockFile = ./Cargo.lock; }; doCheck = true; checkFlags = [ # FIXME: Fails for some reason "--skip=terminal_image::tests::test_renderer_creation" ]; meta = with pkgs.lib; { description = "Expose the contents of .docx files without leaving your terminal. Fast, safe, and smart — no Office required!"; homepage = "https://github.com/bgreenwell/doxx"; license = licenses.mit; maintainers = [ ]; platforms = platforms.all; }; }; in { # Default package packages.default = doxx; packages.doxx = doxx; # Development shell devShells.default = pkgs.mkShell { buildInputs = with pkgs; [ # Rust toolchain rustToolchain # Development tools cargo-watch cargo-edit cargo-audit cargo-deny cargo-outdated cargo-expand # For macro expansion debugging # Additional development tools git # LSP and formatting tools rust-analyzer # For testing .docx files and document creation pandoc # Debugging tools gdb ]; # For better terminal support TERM = "xterm-256color"; # Development shell hook shellHook = '' echo "❄️ Welcome to the doxx Nix development environment!" echo "" echo "📋 Dependencies loaded:" echo " - Rust ${rustToolchain.version} with clippy, rustfmt, rust-src" echo " - ratatui for terminal UI" echo " - crossterm for cross-platform terminal" echo " - arboard for clipboard support" echo " - docx-rs for document parsing" echo "" echo "❄️ Nix commands:" echo " nix build - Build the project" echo " nix run - Run doxx" echo " nix run . -- --help - Run with help flag" echo " nix develop - Enter this dev shell" echo " nix flake check - Run all checks (fmt, clippy, build)" echo "" echo "📄 Usage examples:" echo " nix run . -- document.docx" echo " nix run . -- document.docx --outline" echo " nix run . -- document.docx --search 'keyword'" echo " nix run . -- document.docx --export csv" echo "" echo "🔧 Development commands (if you need them):" echo " cargo build - Direct build (uses Nix env)" echo " cargo watch -x run - Live reload during development" echo " cargo clippy - Run linter" echo " cargo fmt - Format code" echo "" echo "💡 Pro tip: 'nix run github:bgreenwell/doxx -- file.docx' to run from anywhere!" echo "" ''; }; # Apps for easy running apps.default = { type = "app"; program = "${doxx}/bin/doxx"; }; # Checks checks = { build = doxx; # Add format check fmt-check = pkgs.runCommand "fmt-check" { buildInputs = [ rustToolchain ]; } '' cd ${self} cargo fmt --all -- --check touch $out ''; }; }); } doxx-0.1.4/rustfmt.toml000064400000000000000000000003561046102023000132150ustar 00000000000000# Rust formatting configuration for doxx # Using only stable features for compatibility edition = "2021" max_width = 100 hard_tabs = false tab_spaces = 4 newline_style = "Auto" remove_nested_parens = true use_small_heuristics = "Default"doxx-0.1.4/scripts/README.md000064400000000000000000000016171046102023000135630ustar 00000000000000# Scripts | Script | Purpose | |--------|---------| | `quick-check.sh` | Auto-format, clippy, tests — use during development | | `check.sh` | Full CI mirror (fmt check, clippy, tests, release build) — use before pushing | | `pre-push.hook` | Git hook wrapper around `check.sh` | | `release.sh` | Bump version, validate, commit, tag, and push | | `regenerate-fixtures.sh` | Rebuild test fixtures via pandoc and `generate_test_docs` | ## Setup ```bash # Optional: auto-run full checks before every push cp scripts/pre-push.hook .git/hooks/pre-push chmod +x .git/hooks/pre-push ``` ## Release workflow 1. Update `CHANGELOG.md` (move `[Unreleased]` entries to the new version section) 2. Run `./scripts/release.sh [major|minor|patch]` The script bumps `Cargo.toml`, runs fmt/clippy/tests, commits, tags, and pushes. GitHub Actions handles binaries, crates.io, Homebrew, Scoop, AUR, and WinGet from there. doxx-0.1.4/scripts/check.sh000075500000000000000000000022201046102023000137070ustar 00000000000000#!/usr/bin/env bash # Pre-push validation script - mirrors CI/CD checks # Run this before committing to catch issues early set -e # Exit on first error echo "🔍 Running pre-push validation checks..." echo "" # Track overall success FAILED=0 # 1. Format check echo "📝 Checking code formatting..." if cargo fmt --all -- --check; then echo "✅ Format check passed" else echo "❌ Format check failed - run: cargo fmt --all" FAILED=1 fi echo "" # 2. Clippy lints echo "🔎 Running clippy lints..." if cargo clippy --all-targets -- -D warnings; then echo "✅ Clippy passed" else echo "❌ Clippy failed" FAILED=1 fi echo "" # 3. Tests echo "🧪 Running tests..." if cargo test --all-features; then echo "✅ Tests passed" else echo "❌ Tests failed" FAILED=1 fi echo "" # 4. Build check echo "🔨 Checking release build..." if cargo build --release; then echo "✅ Build passed" else echo "❌ Build failed" FAILED=1 fi echo "" # Summary if [ $FAILED -eq 0 ]; then echo "✅ All checks passed! Safe to push." exit 0 else echo "❌ Some checks failed. Fix issues before pushing." exit 1 fi doxx-0.1.4/scripts/pre-push.hook000064400000000000000000000010651046102023000147260ustar 00000000000000#!/usr/bin/env bash # Git pre-push hook # # To install: # cp scripts/pre-push.hook .git/hooks/pre-push # chmod +x .git/hooks/pre-push # # To bypass (use sparingly): # git push --no-verify set -e echo "🚀 Running pre-push validation..." echo "" # Run the full check script if ./scripts/check.sh; then echo "" echo "✅ Pre-push validation passed. Proceeding with push..." exit 0 else echo "" echo "❌ Pre-push validation failed!" echo "Fix the issues above or use 'git push --no-verify' to bypass (not recommended)" exit 1 fi doxx-0.1.4/scripts/quick-check.sh000075500000000000000000000014201046102023000150220ustar 00000000000000#!/usr/bin/env bash # Quick validation script for iterative development # Runs essential checks only (faster than full check.sh) set -e echo "⚡ Running quick validation..." echo "" # 1. Format and fix automatically echo "📝 Auto-formatting code..." cargo fmt --all echo "✅ Formatted" echo "" # 2. Clippy (most important for catching errors) echo "🔎 Running clippy..." if cargo clippy --all-targets -- -D warnings; then echo "✅ Clippy passed" else echo "❌ Clippy failed" exit 1 fi echo "" # 3. Quick test (skip release build for speed) echo "🧪 Running tests..." if cargo test --all-features; then echo "✅ Tests passed" else echo "❌ Tests failed" exit 1 fi echo "" echo "✅ Quick checks passed! Run ./scripts/check.sh before pushing." doxx-0.1.4/scripts/regenerate-fixtures.sh000075500000000000000000000013071046102023000166270ustar 00000000000000#!/usr/bin/env bash set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_DIR="$(dirname "$SCRIPT_DIR")" cd "$PROJECT_DIR" echo "Regenerating test fixtures..." # comprehensive.docx: generated from the markdown source via pandoc if ! command -v pandoc >/dev/null 2>&1; then echo "Warning: pandoc not found — skipping comprehensive.docx regeneration" echo "Install pandoc to regenerate: https://pandoc.org/installing.html" else pandoc tests/fixtures/comprehensive.md -o tests/fixtures/comprehensive.docx echo "Generated: tests/fixtures/comprehensive.docx" fi # minimal.docx, colors.docx: generated via docx-rs cargo run --bin generate_test_docs echo "Done." doxx-0.1.4/scripts/release.sh000075500000000000000000000031451046102023000142610ustar 00000000000000#!/usr/bin/env bash set -euo pipefail # Usage: ./scripts/release.sh [major|minor|patch] # Update CHANGELOG.md before running. SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_DIR="$(dirname "$SCRIPT_DIR")" red='\033[0;31m'; green='\033[0;32m'; nc='\033[0m' log() { echo -e "${green}[INFO]${nc} $1"; } error() { echo -e "${red}[ERROR]${nc} $1"; exit 1; } cd "$PROJECT_DIR" # Guards [[ "$(git rev-parse --abbrev-ref HEAD)" == "main" ]] || error "Must be on main branch" [[ -z "$(git status --porcelain)" ]] || error "Working directory must be clean" command -v cargo >/dev/null 2>&1 || error "cargo is required" # Version bump current_version=$(grep '^version = ' Cargo.toml | sed 's/version = "\(.*\)"/\1/') IFS='.' read -r -a v <<< "$current_version" bump_type=${1:-patch} case "$bump_type" in major) new_version="$((v[0]+1)).0.0" ;; minor) new_version="${v[0]}.$((v[1]+1)).0" ;; patch) new_version="${v[0]}.${v[1]}.$((v[2]+1))" ;; *) error "Invalid bump type: $bump_type. Use major, minor, or patch" ;; esac log "Bumping $bump_type: $current_version -> $new_version" sed -i.bak "s/^version = \"$current_version\"/version = \"$new_version\"/" Cargo.toml rm Cargo.toml.bak # Validate log "Running checks..." cargo fmt --all -- --check cargo clippy --all-targets -- -D warnings cargo test --all-features cargo update --workspace # Commit and tag git add Cargo.toml Cargo.lock CHANGELOG.md git commit -m "chore: release $new_version" git tag "v$new_version" git push origin main git push origin "v$new_version" log "v$new_version tagged and pushed — GitHub Actions will handle the rest." doxx-0.1.4/src/ansi.rs000064400000000000000000000560761046102023000127150ustar 00000000000000use anyhow::Result; use crossterm::style::{ Attribute, Color as CrosstermColor, ResetColor, SetAttribute, SetForegroundColor, }; use std::fmt::Write; use unicode_segmentation::UnicodeSegmentation; use unicode_width::UnicodeWidthStr; use crate::{document::*, ColorDepth}; pub struct AnsiOptions { pub terminal_width: usize, pub color_depth: ColorDepth, } impl Default for AnsiOptions { fn default() -> Self { Self { terminal_width: std::env::var("COLUMNS") .ok() .and_then(|s| s.parse().ok()) .unwrap_or(80), color_depth: ColorDepth::Auto, } } } pub fn export_to_ansi_with_options(document: &Document, options: &AnsiOptions) -> Result { let mut output = String::new(); // Add document title write_ansi_heading(&mut output, &document.title, 1, options)?; output.push('\n'); // Add metadata writeln!( output, "{}Document Information{}", format_ansi_text("", true, false, false, false, None, options), format_ansi_reset() )?; let prefix = "- File: "; let available = options.terminal_width.saturating_sub(prefix.len()); let path = &document.metadata.file_path; let file_str = if UnicodeWidthStr::width(path.as_str()) <= available { path.clone() } else { let truncated: String = path .graphemes(true) .rev() .scan(0usize, |w, g| { *w += UnicodeWidthStr::width(g); if *w < available { Some(g) } else { None } }) .collect::>() .into_iter() .rev() .collect(); format!("…{truncated}") }; writeln!(output, "{prefix}{file_str}")?; writeln!(output, "- Pages: {}", document.metadata.page_count)?; writeln!(output, "- Words: {}", document.metadata.word_count)?; if let Some(author) = &document.metadata.author { writeln!(output, "- Author: {author}")?; } output.push('\n'); // Separator let separator = "=".repeat(std::cmp::min(50, options.terminal_width)); writeln!(output, "{separator}")?; output.push('\n'); // Convert document content for element in &document.elements { match element { DocumentElement::Heading { level, text, number, } => { let heading_text = if let Some(number) = number { format!("{number} {text}") } else { text.clone() }; write_ansi_heading(&mut output, &heading_text, *level, options)?; output.push('\n'); } DocumentElement::Paragraph { runs } => { if runs.is_empty() || runs.iter().all(|run| run.text.trim().is_empty()) { continue; } write_ansi_paragraph(&mut output, runs, options)?; output.push('\n'); } DocumentElement::List { items, ordered } => { write_ansi_list(&mut output, items, *ordered, options)?; output.push('\n'); } DocumentElement::Table { table } => { write_ansi_table(&mut output, table, options)?; output.push('\n'); } DocumentElement::Image { description, .. } => { writeln!( output, "{}🖼️ [Image: {}]{}", format_ansi_color(Some("#FF00FF"), options), // Magenta description, format_ansi_reset() )?; output.push('\n'); } DocumentElement::Equation { latex, .. } => { writeln!( output, "{}📐 {}{}", format_ansi_color(Some("#00AAFF"), options), // Cyan latex, format_ansi_reset() )?; output.push('\n'); } DocumentElement::CodeBlock { text } => { let code_color = format_ansi_color(Some("#AAFFAA"), options); let reset = format_ansi_reset(); for line in text.lines() { writeln!(output, " {code_color}{line}{reset}")?; } output.push('\n'); } DocumentElement::TextBox { lines } => { let border_color = format_ansi_color(Some("#00FFFF"), options); let reset = format_ansi_reset(); let inner_width = options.terminal_width.saturating_sub(4); let bar = "─".repeat(options.terminal_width.saturating_sub(2)); writeln!(output, "{border_color}┌{bar}┐{reset}")?; for line in lines { let truncated: String = line.chars().take(inner_width).collect(); writeln!( output, "{border_color}│{reset} {truncated: { let separator = "─".repeat(std::cmp::min(60, options.terminal_width)); writeln!( output, "{}{}{}", format_ansi_color(Some("#666666"), options), // Dark gray separator, format_ansi_reset() )?; output.push('\n'); } } } Ok(output) } fn write_ansi_heading( output: &mut String, text: &str, level: u8, options: &AnsiOptions, ) -> Result<()> { let color = match level { 1 => Some("#FFFF00"), // Yellow 2 => Some("#00FF00"), // Green _ => Some("#00FFFF"), // Cyan }; let prefix = match level { 1 => "■ ", 2 => " ▶ ", 3 => " ◦ ", _ => " • ", }; let prefix_width = UnicodeWidthStr::width(prefix); let available_width = options.terminal_width.saturating_sub(prefix_width); let wrapped = wrap_plain_text(text, available_width); let indent = " ".repeat(prefix_width); for (i, line) in wrapped.iter().enumerate() { let display = if i == 0 { format!("{prefix}{line}") } else { format!("{indent}{line}") }; writeln!( output, "{}", format_ansi_text(&display, true, false, false, false, color, options) )?; } Ok(()) } fn wrap_plain_text(text: &str, max_width: usize) -> Vec { if max_width == 0 { return vec![text.to_string()]; } let mut lines = Vec::new(); let mut current_line = String::new(); let mut current_width = 0; for word in text.split_whitespace() { let word_width = UnicodeWidthStr::width(word); if current_width == 0 { current_line.push_str(word); current_width = word_width; } else if current_width + 1 + word_width > max_width { lines.push(current_line.clone()); current_line = word.to_string(); current_width = word_width; } else { current_line.push(' '); current_line.push_str(word); current_width += 1 + word_width; } } if !current_line.is_empty() { lines.push(current_line); } if lines.is_empty() { lines.push(String::new()); } lines } fn write_ansi_paragraph( output: &mut String, runs: &[FormattedRun], options: &AnsiOptions, ) -> Result<()> { let wrapped_lines = wrap_formatted_runs(runs, options); for line in wrapped_lines { writeln!(output, "{}{}", line, format_ansi_reset())?; } Ok(()) } /// Wrap formatted text runs to terminal width while preserving formatting fn wrap_formatted_runs(runs: &[FormattedRun], options: &AnsiOptions) -> Vec { if runs.is_empty() { return vec![]; } let max_width = options.terminal_width; let mut lines = Vec::new(); let mut current_line = String::new(); let mut current_width = 0; let mut line_needs_formatting = false; for run in runs { let graphemes: Vec<&str> = run.text.graphemes(true).collect(); let mut word = String::new(); let mut word_width = 0; // Apply formatting at start of run let format_start = get_ansi_format_start( run.formatting.bold, run.formatting.italic, run.formatting.underline, run.formatting.strikethrough, run.formatting.color.as_deref(), options, ); for grapheme in graphemes { let grapheme_width = UnicodeWidthStr::width(grapheme); if grapheme == " " || grapheme == "\n" { // End of word - try to add it to the current line if !word.is_empty() { if current_width + word_width > max_width && current_width > 0 { // Word doesn't fit on current line, start new line if line_needs_formatting { current_line.push_str(&format_ansi_reset()); } lines.push(current_line.clone()); current_line.clear(); current_width = 0; line_needs_formatting = false; } // Apply formatting if not already applied on this line if !line_needs_formatting && !format_start.is_empty() { current_line.push_str(&format_start); line_needs_formatting = true; } current_line.push_str(&word); current_width += word_width; word.clear(); word_width = 0; } // Handle space or newline if grapheme == "\n" { if line_needs_formatting { current_line.push_str(&format_ansi_reset()); } lines.push(current_line.clone()); current_line.clear(); current_width = 0; line_needs_formatting = false; } else if current_width < max_width { current_line.push(' '); current_width += 1; } } else { // Building a word word.push_str(grapheme); word_width += grapheme_width; } } // Handle remaining word at end of run if !word.is_empty() { if current_width + word_width > max_width && current_width > 0 { if line_needs_formatting { current_line.push_str(&format_ansi_reset()); } lines.push(current_line.clone()); current_line.clear(); current_width = 0; line_needs_formatting = false; } // Apply formatting if not already applied on this line if !line_needs_formatting && !format_start.is_empty() { current_line.push_str(&format_start); line_needs_formatting = true; } current_line.push_str(&word); current_width += word_width; } // Reset formatting at end of run if it was applied if line_needs_formatting && !current_line.is_empty() { current_line.push_str(&format_ansi_reset()); line_needs_formatting = false; } } // Add final line if not empty if !current_line.is_empty() { lines.push(current_line); } lines } /// Get ANSI formatting codes for start of formatted text fn get_ansi_format_start( bold: bool, italic: bool, underline: bool, strikethrough: bool, color: Option<&str>, options: &AnsiOptions, ) -> String { let mut result = String::new(); if bold { result.push_str(&format!("{}", SetAttribute(Attribute::Bold))); } if italic { result.push_str(&format!("{}", SetAttribute(Attribute::Italic))); } if underline { result.push_str(&format!("{}", SetAttribute(Attribute::Underlined))); } if strikethrough { result.push_str(&format!("{}", SetAttribute(Attribute::CrossedOut))); } if let Some(color_hex) = color { result.push_str(&format_ansi_color(Some(color_hex), options)); } result } fn write_ansi_list( output: &mut String, items: &[ListItem], ordered: bool, options: &AnsiOptions, ) -> Result<()> { for (i, item) in items.iter().enumerate() { let bullet = if ordered { format!("{}. ", i + 1) } else { "• ".to_string() }; let indent = " ".repeat(item.level as usize); let bullet_color = format_ansi_color(Some("#0066FF"), options); // Blue let prefix = format!("{}{}{}", bullet_color, indent, bullet); let prefix_visual_width = indent.len() + bullet.len(); // Wrap item text with proper indentation let available_width = options.terminal_width.saturating_sub(prefix_visual_width); let wrapped_lines = wrap_formatted_runs_with_width(&item.runs, available_width, options); for (line_idx, line) in wrapped_lines.iter().enumerate() { if line_idx == 0 { // First line: include bullet writeln!(output, "{}{}{}", prefix, format_ansi_reset(), line)?; } else { // Continuation lines: indent to align with first line writeln!(output, "{}{}", " ".repeat(prefix_visual_width), line)?; } } } Ok(()) } /// Wrap formatted text runs to a specific width fn wrap_formatted_runs_with_width( runs: &[FormattedRun], max_width: usize, options: &AnsiOptions, ) -> Vec { if runs.is_empty() || max_width == 0 { return vec![String::new()]; } let mut lines = Vec::new(); let mut current_line = String::new(); let mut current_width = 0; let mut line_needs_formatting = false; for run in runs { let graphemes: Vec<&str> = run.text.graphemes(true).collect(); let mut word = String::new(); let mut word_width = 0; // Get formatting codes for this run let format_start = get_ansi_format_start( run.formatting.bold, run.formatting.italic, run.formatting.underline, run.formatting.strikethrough, run.formatting.color.as_deref(), options, ); for grapheme in graphemes { let grapheme_width = UnicodeWidthStr::width(grapheme); if grapheme == " " || grapheme == "\n" { // End of word - try to add it to the current line if !word.is_empty() { if current_width + word_width > max_width && current_width > 0 { // Word doesn't fit on current line, start new line if line_needs_formatting { current_line.push_str(&format_ansi_reset()); } lines.push(current_line.clone()); current_line.clear(); current_width = 0; line_needs_formatting = false; } // Apply formatting if not already applied on this line if !line_needs_formatting && !format_start.is_empty() { current_line.push_str(&format_start); line_needs_formatting = true; } current_line.push_str(&word); current_width += word_width; word.clear(); word_width = 0; } // Handle space or newline if grapheme == "\n" { if line_needs_formatting { current_line.push_str(&format_ansi_reset()); } lines.push(current_line.clone()); current_line.clear(); current_width = 0; line_needs_formatting = false; } else if current_width < max_width { current_line.push(' '); current_width += 1; } } else { // Building a word word.push_str(grapheme); word_width += grapheme_width; } } // Handle remaining word at end of run if !word.is_empty() { if current_width + word_width > max_width && current_width > 0 { if line_needs_formatting { current_line.push_str(&format_ansi_reset()); } lines.push(current_line.clone()); current_line.clear(); current_width = 0; line_needs_formatting = false; } // Apply formatting if not already applied on this line if !line_needs_formatting && !format_start.is_empty() { current_line.push_str(&format_start); line_needs_formatting = true; } current_line.push_str(&word); current_width += word_width; } // Reset formatting at end of run if it was applied if line_needs_formatting && !current_line.is_empty() { current_line.push_str(&format_ansi_reset()); line_needs_formatting = false; } } // Add final line if not empty if !current_line.is_empty() { lines.push(current_line); } // Return at least one line even if empty if lines.is_empty() { lines.push(String::new()); } lines } fn write_ansi_table(output: &mut String, table: &TableData, options: &AnsiOptions) -> Result<()> { // Add table title if present if let Some(title) = &table.metadata.title { let formatted_title = format_ansi_text( &format!("📊 {title}"), true, false, false, false, Some("#0066FF"), // Blue options, ); writeln!(output, "{}{}", formatted_title, format_ansi_reset())?; output.push('\n'); } // Simple table rendering for ANSI if !table.headers.is_empty() { // Headers write!(output, "│")?; for header in &table.headers { write!( output, " {}{}{} │", format_ansi_text("", true, false, false, false, None, options), header.content, format_ansi_reset() )?; } writeln!(output)?; // Separator write!(output, "├")?; for _ in &table.headers { write!(output, "─────┼")?; } writeln!(output, "┤")?; // Rows for row in &table.rows { write!(output, "│")?; for cell in row { write!(output, " {} │", cell.content)?; } writeln!(output)?; } } Ok(()) } fn format_ansi_text( text: &str, bold: bool, italic: bool, underline: bool, strikethrough: bool, color: Option<&str>, options: &AnsiOptions, ) -> String { let mut result = String::new(); // Apply formatting attributes if bold { result.push_str(&format!("{}", SetAttribute(Attribute::Bold))); } if italic { result.push_str(&format!("{}", SetAttribute(Attribute::Italic))); } if underline { result.push_str(&format!("{}", SetAttribute(Attribute::Underlined))); } if strikethrough { result.push_str(&format!("{}", SetAttribute(Attribute::CrossedOut))); } // Apply color if let Some(color_hex) = color { result.push_str(&format_ansi_color(Some(color_hex), options)); } result.push_str(text); // Reset formatting after this run to prevent bleeding into subsequent runs result.push_str(&format_ansi_reset()); result } fn format_ansi_color(color_hex: Option<&str>, options: &AnsiOptions) -> String { let Some(hex) = color_hex else { return String::new(); }; match convert_hex_to_crossterm_color(hex, &options.color_depth) { Some(color) => format!("{}", SetForegroundColor(color)), None => String::new(), } } fn format_ansi_reset() -> String { format!("{ResetColor}") } fn convert_hex_to_crossterm_color(hex: &str, color_depth: &ColorDepth) -> Option { // Remove # if present and ensure we have 6 characters let hex = hex.trim_start_matches('#'); if hex.len() != 6 { return None; } // Parse RGB components let r = u8::from_str_radix(&hex[0..2], 16).ok()?; let g = u8::from_str_radix(&hex[2..4], 16).ok()?; let b = u8::from_str_radix(&hex[4..6], 16).ok()?; match color_depth { ColorDepth::Monochrome => None, ColorDepth::Standard => { // Convert to 16 colors (approximation) let color_index = rgb_to_ansi_16(r, g, b); Some(CrosstermColor::AnsiValue(color_index)) } ColorDepth::Extended => { // Convert to 256 colors let color_index = rgb_to_ansi_256(r, g, b); Some(CrosstermColor::AnsiValue(color_index)) } ColorDepth::TrueColor | ColorDepth::Auto => { // Use full RGB Some(CrosstermColor::Rgb { r, g, b }) } } } fn rgb_to_ansi_16(r: u8, g: u8, b: u8) -> u8 { // Simple mapping to 16 colors let r_bright = r > 127; let g_bright = g > 127; let b_bright = b > 127; let base = match (r > 64, g > 64, b > 64) { (false, false, false) => 0, // Black (false, false, true) => 4, // Blue (false, true, false) => 2, // Green (false, true, true) => 6, // Cyan (true, false, false) => 1, // Red (true, false, true) => 5, // Magenta (true, true, false) => 3, // Yellow (true, true, true) => 7, // White }; // Add 8 for bright colors if any component is very bright if r_bright || g_bright || b_bright { base + 8 } else { base } } fn rgb_to_ansi_256(r: u8, g: u8, b: u8) -> u8 { // 256-color conversion if r == g && g == b { // Grayscale if r < 8 { 16 } else if r > 247 { 231 } else { 232 + (r - 8) / 10 } } else { // Color cube: 16 + 36*r + 6*g + b let r_index = (r as f32 / 255.0 * 5.0) as u8; let g_index = (g as f32 / 255.0 * 5.0) as u8; let b_index = (b as f32 / 255.0 * 5.0) as u8; 16 + 36 * r_index + 6 * g_index + b_index } } doxx-0.1.4/src/config.rs000064400000000000000000000065741046102023000132260ustar 00000000000000use anyhow::{Context, Result}; use serde::{Deserialize, Serialize}; use std::collections::HashMap; use std::path::PathBuf; use crate::keymap::{Action, KeyBinding, Keymap, KeymapPreset}; #[derive(Debug, Clone, Serialize, Deserialize, Default)] pub struct Config { #[serde(default)] pub keymap: KeymapConfig, } #[derive(Debug, Clone, Serialize, Deserialize)] pub struct KeymapConfig { /// Preset name: "default", "vim", "less" #[serde(default = "default_preset")] pub preset: String, /// Custom key overrides: key string -> action string #[serde(default)] pub custom: HashMap, } fn default_preset() -> String { "default".to_string() } impl Default for KeymapConfig { fn default() -> Self { Self { preset: default_preset(), custom: HashMap::new(), } } } impl Config { pub fn load() -> Result { let path = Self::config_file_path()?; if !path.exists() { return Ok(Self::default()); } let contents = std::fs::read_to_string(&path) .with_context(|| format!("Failed to read config file: {}", path.display()))?; toml::from_str(&contents) .with_context(|| format!("Failed to parse config file: {}", path.display())) } pub fn save(&self) -> Result<()> { let path = Self::config_file_path()?; if let Some(parent) = path.parent() { std::fs::create_dir_all(parent)?; } let contents = toml::to_string_pretty(self)?; std::fs::write(&path, contents)?; Ok(()) } pub fn config_file_path() -> Result { let dir = dirs::config_dir().context("Failed to determine config directory")?; Ok(dir.join("doxx").join("config.toml")) } /// Build a Keymap from this config (preset + custom overrides). pub fn build_keymap(&self) -> Keymap { let preset = match self.keymap.preset.as_str() { "vim" => KeymapPreset::Vim, "less" => KeymapPreset::Less, _ => KeymapPreset::Default, }; let mut km = Keymap::from_preset(preset); for (key_str, action_str) in &self.keymap.custom { match (KeyBinding::parse_key(key_str), action_str.parse::()) { (Ok(key), Ok(action)) => km.bind(key, action), (Err(e), _) => eprintln!("doxx config: invalid key {:?}: {e}", key_str), (_, Err(e)) => eprintln!("doxx config: invalid action {:?}: {e}", action_str), } } km } /// Get a dot-path config value as a string (e.g. "keymap.preset"). pub fn get_value(&self, key: &str) -> Option { match key { "keymap.preset" => Some(self.keymap.preset.clone()), _ => None, } } /// Set a dot-path config value (e.g. "keymap.preset" = "vim"). pub fn set_value(&mut self, key: &str, value: &str) -> Result<()> { match key { "keymap.preset" => { match value { "default" | "vim" | "less" => self.keymap.preset = value.to_string(), other => { anyhow::bail!("Unknown keymap preset: {other}. Valid: default, vim, less") } } Ok(()) } other => anyhow::bail!("Unknown config key: {other}"), } } } doxx-0.1.4/src/document/cleanup.rs000064400000000000000000000064331046102023000152200ustar 00000000000000//! Post-processing and cleanup utilities //! //! This module provides helper functions for cleaning and processing //! document elements after initial parsing. use super::models::*; pub(crate) fn is_likely_sentence(text: &str) -> bool { let text = text.trim(); // If it contains multiple sentences, it's probably not a heading if text.matches(". ").count() > 1 { return true; } // If it ends with common sentence endings and is long, it's probably a sentence if text.len() > 80 && (text.ends_with('.') || text.ends_with('!') || text.ends_with('?')) { return true; } // If it contains common sentence connectors, it's likely a sentence if text.contains(" and ") || text.contains(" but ") || text.contains(" however ") || text.contains(" therefore ") { return true; } false } pub(crate) fn estimate_page_count(word_count: usize) -> usize { // Rough estimate: 250 words per page (word_count as f32 / 250.0).ceil() as usize } pub(crate) fn clean_word_list_markers(elements: Vec) -> Vec { elements .into_iter() .map(|element| match element { DocumentElement::Paragraph { runs } => { let cleaned_runs = runs .into_iter() .map(|mut run| { if run.text.starts_with("__WORD_LIST__") { run.text = run .text .strip_prefix("__WORD_LIST__") .unwrap_or(&run.text) .to_string(); } run }) .collect(); DocumentElement::Paragraph { runs: cleaned_runs } } DocumentElement::List { items, ordered } => { let cleaned_items = items .into_iter() .map(|item| { let combined_text: String = item.runs.iter().map(|run| run.text.as_str()).collect(); let cleaned_runs = if combined_text.starts_with("__WORD_LIST__") { // Remove the __WORD_LIST__ prefix from the first run let mut new_runs = item.runs.clone(); if let Some(first_run) = new_runs.first_mut() { first_run.text = first_run .text .strip_prefix("__WORD_LIST__") .unwrap_or(&first_run.text) .to_string(); } new_runs } else { item.runs.clone() }; ListItem { runs: cleaned_runs, level: item.level, } }) .collect(); DocumentElement::List { items: cleaned_items, ordered, } } other => other, }) .collect() } doxx-0.1.4/src/document/io.rs000064400000000000000000000065311046102023000141770ustar 00000000000000//! File I/O operations and validation //! //! This module handles file validation and document merge operations. use anyhow::{bail, Result}; use std::fs::File; use std::path::Path; use zip::ZipArchive; use super::models::DocumentElement; /// Validates that the file is a legitimate .docx file pub(crate) fn validate_docx_file(file_path: &Path) -> Result<()> { // Check file extension let extension = file_path .extension() .and_then(|ext| ext.to_str()) .unwrap_or(""); if extension != "docx" { bail!( "Invalid file format. Expected .docx file, got .{}\n\ Note: doxx only supports Word .docx files (not .doc, .xlsx, .zip, etc.)", extension ); } // Check ZIP structure contains word/document.xml let file = File::open(file_path)?; let mut archive = ZipArchive::new(file)?; if archive.by_name("word/document.xml").is_err() { // Check if it might be an Excel file if archive.by_name("xl/workbook.xml").is_ok() { bail!( "This appears to be an Excel file (.xlsx).\n\ doxx only supports Word documents (.docx)." ); } bail!( "Invalid .docx file: missing word/document.xml\n\ This file may be corrupted or is not a valid Word document." ); } Ok(()) } /// Merge display equations into the element list at their correct paragraph positions /// /// This function handles the fact that docx-rs doesn't parse paragraphs containing only equations. /// We need to track paragraph indices from the XML and insert equations at the right positions. pub(crate) fn merge_display_equations( elements: Vec, display_equations_by_para: std::collections::HashMap>, ) -> Vec { if display_equations_by_para.is_empty() { return elements; } // Get all paragraph indices with equations, sorted let mut eq_para_indices: Vec = display_equations_by_para.keys().copied().collect(); eq_para_indices.sort_unstable(); // Build a new element list with equations inserted at correct positions let mut result = Vec::new(); let mut element_para_index = 0; for element in elements { // Increment paragraph counter for elements that correspond to paragraphs match &element { DocumentElement::Paragraph { .. } | DocumentElement::Heading { .. } | DocumentElement::List { .. } => { element_para_index += 1; // Insert any display equations that come before this element while let Some(&eq_idx) = eq_para_indices.first() { if eq_idx < element_para_index { if let Some(eqs) = display_equations_by_para.get(&eq_idx) { result.extend(eqs.clone()); } eq_para_indices.remove(0); } else { break; } } } _ => {} } result.push(element); } // Add any remaining equations at the end for eq_idx in eq_para_indices { if let Some(eqs) = display_equations_by_para.get(&eq_idx) { result.extend(eqs.clone()); } } result } doxx-0.1.4/src/document/loader.rs000064400000000000000000000506231046102023000150370ustar 00000000000000//! Document loading and orchestration //! //! This module contains the main `load_document()` function that orchestrates //! the entire document parsing process, coordinating all the specialized parsing //! modules to transform a DOCX file into our internal Document representation. use anyhow::Result; use std::path::Path; // Import types from the models module use super::models::*; // Import I/O functions use super::io::{merge_display_equations, validate_docx_file}; // Import cleanup functions use super::cleanup::{clean_word_list_markers, estimate_page_count}; // Import numbering management use super::parsing::numbering::{ analyze_heading_structure, HeadingNumberTracker, NumberingResolver, }; // Import list processing use super::parsing::list::group_list_items; // Import formatting and text extraction use super::parsing::formatting::{extract_paragraph_text, extract_run_formatting}; // Import heading detection use super::parsing::heading::{detect_heading_from_text, detect_heading_with_numbering}; // Import table extraction use super::parsing::table::extract_table_data; // Import equation processing use super::parsing::equation::{ extract_equations_from_docx, extract_inline_equation_positions, ParagraphContent, }; /// Main document loading function that orchestrates the entire parsing process /// /// This function: /// 1. Validates the DOCX file /// 2. Extracts metadata (title, file size, etc.) /// 3. Optionally extracts images /// 4. Processes document structure (paragraphs, tables, headings, lists) /// 5. Integrates equations (both inline and display) /// 6. Post-processes elements (grouping lists, cleaning markers) /// 7. Returns a fully parsed Document pub fn load_document(file_path: &Path, image_options: ImageOptions) -> Result { // Validate file type before attempting to parse validate_docx_file(file_path)?; let file_size = std::fs::metadata(file_path)?.len(); // For now, create a simple implementation that reads the docx file // This is a simplified version to get the project compiling let file_data = std::fs::read(file_path)?; let docx = docx_rs::read_docx(&file_data)?; let title = file_path .file_stem() .and_then(|s| s.to_str()) .unwrap_or("Untitled Document") .to_string(); let mut elements = Vec::new(); let mut word_count = 0; let mut numbering_resolver = NumberingResolver::build_from_docx(&docx.numberings); let mut heading_tracker = HeadingNumberTracker::new(); // Analyze document structure to determine if auto-numbering should be enabled let should_auto_number = analyze_heading_structure(&docx.document); if should_auto_number { heading_tracker.enable_auto_numbering(); } // Extract images if enabled let image_extractor = if image_options.enabled { let mut extractor = crate::image_extractor::ImageExtractor::new()?; extractor.extract_images_from_docx(file_path)?; Some(extractor) } else { None }; // Enhanced content extraction with style information for child in &docx.document.children { match child { docx_rs::DocumentChild::Paragraph(para) => { // Check for heading with potential numbering first let heading_info = detect_heading_with_numbering(para); // Check for list numbering properties (Word's automatic lists) let list_info = detect_list_from_paragraph_numbering(para); // Check for images in this paragraph first for child in ¶.children { if let docx_rs::ParagraphChild::Run(run) = child { for run_child in &run.children { if let docx_rs::RunChild::Drawing(_drawing) = run_child { // Create an Image element with consistent ordering if let Some(ref extractor) = image_extractor { let images = extractor.get_extracted_images_sorted(); if !images.is_empty() { // Count images processed so far to maintain document order let image_count = elements .iter() .filter(|e| matches!(e, DocumentElement::Image { .. })) .count(); // Only create Image element if we have an actual image file available if image_count < images.len() { let (_, image_path) = &images[image_count]; elements.push(DocumentElement::Image { description: format!("Image {}", image_count + 1), width: None, height: None, relationship_id: None, image_path: Some(image_path.clone()), }); } } } } } } } // Detect paragraph style (used for code blocks, block quotes, etc.) let para_style = para .property .style .as_ref() .map(|s| s.val.as_str()) .unwrap_or(""); let is_code_block = para_style == "SourceCode" || para_style == "VerbatimChar"; // Extract runs with individual formatting, preserving line breaks. // Text box shapes (DrawingData::TextBox) are collected separately so they // are always emitted as plain paragraphs regardless of the parent style. let mut formatted_runs = Vec::new(); let mut textbox_groups: Vec> = Vec::new(); for child in ¶.children { if let docx_rs::ParagraphChild::Run(run) = child { let run_formatting = extract_run_formatting(run); let mut run_text = String::new(); for child in &run.children { match child { docx_rs::RunChild::Text(text_elem) => { run_text.push_str(&text_elem.text); } docx_rs::RunChild::Break(_) => { run_text.push('\n'); } docx_rs::RunChild::Drawing(drawing) => { if let Some(docx_rs::DrawingData::TextBox(text_box)) = &drawing.data { let mut group = Vec::new(); for tb_child in &text_box.children { if let docx_rs::TextBoxContentChild::Paragraph(para) = tb_child { let text = extract_paragraph_text(para); if !text.is_empty() { group.push(text); } } } if !group.is_empty() { textbox_groups.push(group); } } } _ => {} } } if !run_text.is_empty() { formatted_runs.push(FormattedRun { text: run_text, formatting: run_formatting, }); } } } // Calculate total text for word count and processing let total_text: String = formatted_runs.iter().map(|run| run.text.as_str()).collect(); if !total_text.trim().is_empty() { word_count += total_text.split_whitespace().count(); // Priority: code block > list numbering > heading style > text heuristics if is_code_block { let code_text: String = formatted_runs.iter().map(|r| r.text.as_str()).collect(); elements.push(DocumentElement::CodeBlock { text: code_text }); } else if let Some(list_info) = list_info { // This is an automatic Word list item - format with proper indentation let indent = " ".repeat(list_info.level as usize); let prefix = if let Some(num_id) = list_info.num_id { if numbering_resolver.is_ordered(num_id, list_info.level) { numbering_resolver.generate_number(num_id, list_info.level) } else { "* ".to_string() } } else { "* ".to_string() }; // For list items, preserve individual run formatting by creating separate prefix run // This maintains formatting fidelity while keeping bullets/numbers unformatted if !formatted_runs.is_empty() { // Create a prefix run with default formatting (no color, bold, etc.) let prefix_text = format!("__WORD_LIST__{indent}{prefix}"); let prefix_run = FormattedRun { text: prefix_text, formatting: TextFormatting::default(), }; // Insert prefix run at the beginning, preserving text formatting let mut updated_runs = vec![prefix_run]; updated_runs.extend(formatted_runs); elements.push(DocumentElement::Paragraph { runs: updated_runs }); } else { // Fallback for empty runs let list_text = format!("__WORD_LIST__{indent}{prefix}"); elements.push(DocumentElement::Paragraph { runs: vec![FormattedRun { text: list_text, formatting: TextFormatting::default(), }], }); } } else { // Check for headings (with or without numbering) if let Some(heading_info) = heading_info { let heading_text = heading_info.clean_text.unwrap_or(total_text.clone()); let number = if heading_info.number.is_some() { heading_info.number } else { // Generate automatic numbering if enabled for this document let auto_number = heading_tracker.get_number(heading_info.level); if auto_number.is_empty() { None } else { Some(auto_number) } }; elements.push(DocumentElement::Heading { level: heading_info.level, text: heading_text, number, }); } else { // Fallback to text-based heading detection using first run's formatting let first_formatting = if !formatted_runs.is_empty() { &formatted_runs[0].formatting } else { &TextFormatting::default() }; let level = detect_heading_from_text(&total_text, first_formatting); if let Some(level) = level { elements.push(DocumentElement::Heading { level, text: total_text, number: None, }); } else { // This is a regular paragraph - consolidate runs and preserve formatting let consolidated_runs = FormattedRun::consolidate_runs(formatted_runs); elements.push(DocumentElement::Paragraph { runs: consolidated_runs, }); } } } } // Emit each text box as a distinct TextBox element (one per shape) for group in textbox_groups { word_count += group .iter() .map(|s| s.split_whitespace().count()) .sum::(); elements.push(DocumentElement::TextBox { lines: group }); } } docx_rs::DocumentChild::Table(table) => { // Extract table data if let Some(table_element) = extract_table_data(table) { elements.push(table_element); } } _ => { // Handle other document elements (images, etc.) in future } } } // Extract inline equations with their positions let inline_paragraphs = extract_inline_equation_positions(file_path).unwrap_or_default(); // Extract all equations (both inline and display) let equation_infos = extract_equations_from_docx(file_path).unwrap_or_default(); // Create a map of paragraph index -> display equations let mut display_equations_by_para: std::collections::HashMap> = std::collections::HashMap::new(); for eq in equation_infos.iter() { if !eq.is_inline { display_equations_by_para .entry(eq.paragraph_index) .or_default() .push(DocumentElement::Equation { latex: eq.latex.clone(), fallback: eq.fallback.clone(), }); } } // Integrate inline equations into paragraphs and insert display equations at correct positions let mut elements_with_equations = Vec::new(); let mut para_index = 0; for element in elements { match element { DocumentElement::Paragraph { runs } => { para_index += 1; // Check if this paragraph has inline equations if let Some(content_items) = inline_paragraphs.get(¶_index) { // Check if there are actually any inline equations in this paragraph let has_actual_equations = content_items .iter() .any(|item| matches!(item, ParagraphContent::InlineEquation { .. })); if has_actual_equations { // Reconstruct paragraph with inline equations in correct positions let mut new_runs = Vec::new(); let mut accumulated_text = String::new(); for content in content_items { match content { ParagraphContent::Text(text) => { accumulated_text.push_str(text); } ParagraphContent::InlineEquation { latex, fallback: _ } => { // Flush accumulated text before equation if !accumulated_text.is_empty() { new_runs.push(FormattedRun { text: accumulated_text.clone(), formatting: TextFormatting::default(), }); accumulated_text.clear(); } // Add inline equation with $ delimiters new_runs.push(FormattedRun { text: format!("${latex}$"), formatting: TextFormatting::default(), }); } } } // Flush any remaining text if !accumulated_text.is_empty() { new_runs.push(FormattedRun { text: accumulated_text, formatting: TextFormatting::default(), }); } elements_with_equations.push(DocumentElement::Paragraph { runs: new_runs }); } else { // No actual equations, preserve original runs with formatting elements_with_equations.push(DocumentElement::Paragraph { runs }); } } else { // Check if this paragraph is actually a display equation if let Some(display_eqs) = display_equations_by_para.get(¶_index) { // This paragraph contains display equation(s) for eq in display_eqs { elements_with_equations.push(eq.clone()); } } else { // Regular paragraph without equations elements_with_equations.push(DocumentElement::Paragraph { runs }); } } } _ => { elements_with_equations.push(element); } } } // Post-process to group consecutive list items (only for text-based lists) // Word numbering-based lists are already properly formatted let elements = group_list_items(elements_with_equations); // Clean up Word list markers let elements = clean_word_list_markers(elements); // Merge display equations into the final element list at correct positions let elements = merge_display_equations(elements, display_equations_by_para); let metadata = DocumentMetadata { file_path: file_path.to_string_lossy().to_string(), file_size, word_count, page_count: estimate_page_count(word_count), created: None, // Simplified for now modified: None, author: None, }; Ok(Document { title, metadata, elements, image_options, }) } /// Internal structure for tracking Word list information #[derive(Debug, Clone)] struct ListInfo { level: u8, num_id: Option, // Word's numbering definition ID } /// Detect list properties from paragraph numbering metadata fn detect_list_from_paragraph_numbering(para: &docx_rs::Paragraph) -> Option { if let Some(num_pr) = ¶.property.numbering_property { let level = num_pr.level.as_ref().map(|l| l.val as u8).unwrap_or(0); let num_id = num_pr.id.as_ref().map(|id| id.id as i32); return Some(ListInfo { level, num_id }); } None } doxx-0.1.4/src/document/mod.rs000064400000000000000000000010271046102023000143420ustar 00000000000000//! Document parsing and data structures module //! //! This module provides functionality for parsing Microsoft Word (.docx) documents //! and converting them into a structured representation. //! //! During refactoring: Incrementally extracting modules pub(crate) mod cleanup; pub(crate) mod io; pub(crate) mod loader; pub mod models; pub(crate) mod parsing; pub mod query; // Re-export all models and query functions pub use models::*; pub use query::*; // Re-export main document loading function pub use loader::load_document; doxx-0.1.4/src/document/models.rs000064400000000000000000000107401046102023000150500ustar 00000000000000//! Core data structures for document representation //! //! This module defines all the public types used to represent a parsed document, //! including elements, formatting, tables, and metadata. use serde::{Deserialize, Serialize}; // Type aliases for convenience pub type TableRows = Vec>; pub type NumberingInfo = (i32, u8); /// Image rendering options #[derive(Debug, Clone, Default)] pub struct ImageOptions { pub enabled: bool, pub max_width: Option, pub max_height: Option, pub scale: Option, } #[derive(Debug, Clone, Serialize, Deserialize)] pub struct Document { pub title: String, pub metadata: DocumentMetadata, pub elements: Vec, #[serde(skip)] pub image_options: ImageOptions, } #[derive(Debug, Clone, Serialize, Deserialize)] pub struct DocumentMetadata { pub file_path: String, pub file_size: u64, pub word_count: usize, pub page_count: usize, pub created: Option, pub modified: Option, pub author: Option, } #[derive(Debug, Clone, Serialize, Deserialize)] pub enum DocumentElement { Heading { level: u8, text: String, number: Option, }, Paragraph { runs: Vec, }, List { items: Vec, ordered: bool, }, Table { table: TableData, }, Image { description: String, width: Option, height: Option, relationship_id: Option, // Link to DOCX relationship for image extraction image_path: Option, // Path to extracted image file }, Equation { latex: String, fallback: String, }, CodeBlock { text: String, }, TextBox { lines: Vec, }, PageBreak, } #[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)] pub struct TextFormatting { pub bold: bool, pub italic: bool, pub underline: bool, pub strikethrough: bool, pub font_size: Option, pub color: Option, } #[derive(Debug, Clone, Serialize, Deserialize)] pub struct FormattedRun { pub text: String, pub formatting: TextFormatting, } impl FormattedRun { /// Consolidate adjacent runs with identical formatting into single runs pub fn consolidate_runs(runs: Vec) -> Vec { if runs.is_empty() { return runs; } let mut consolidated = Vec::new(); let mut current_run = runs[0].clone(); for run in runs.into_iter().skip(1) { if current_run.formatting == run.formatting { // Same formatting - merge the text current_run.text.push_str(&run.text); } else { // Different formatting - push current and start new consolidated.push(current_run); current_run = run; } } // last run consolidated.push(current_run); consolidated } } #[derive(Debug, Clone, Serialize, Deserialize)] pub struct ListItem { pub runs: Vec, pub level: u8, } #[derive(Debug, Clone, Serialize, Deserialize)] pub struct TableData { pub headers: Vec, pub rows: Vec>, pub metadata: TableMetadata, } #[derive(Debug, Clone, Serialize, Deserialize)] pub struct TableCell { pub content: String, pub alignment: TextAlignment, pub formatting: TextFormatting, pub data_type: CellDataType, } #[derive(Debug, Clone, Serialize, Deserialize)] pub struct TableMetadata { pub column_count: usize, pub row_count: usize, pub has_headers: bool, pub column_widths: Vec, pub column_alignments: Vec, pub title: Option, } #[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Default)] pub enum TextAlignment { #[default] Left, Center, Right, Justify, } #[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Default)] pub enum CellDataType { #[default] Text, Number, Currency, Percentage, Date, Boolean, Empty, } #[derive(Debug, Clone)] pub struct SearchResult { pub element_index: usize, pub text: String, #[allow(dead_code)] pub start_pos: usize, #[allow(dead_code)] pub end_pos: usize, } #[derive(Debug, Clone, Serialize, Deserialize)] pub struct OutlineItem { pub title: String, pub level: u8, pub element_index: usize, } doxx-0.1.4/src/document/parsing/equation.rs000064400000000000000000000571071046102023000170650ustar 00000000000000//! Equation extraction and OMML to LaTeX conversion //! //! This module handles extraction of mathematical equations from Word documents //! and conversion from OMML (Office Math Markup Language) to LaTeX format. use anyhow::Result; use std::path::Path; /// Equation type and context information #[derive(Debug, Clone)] pub(crate) struct EquationInfo { pub(crate) latex: String, pub(crate) fallback: String, pub(crate) is_inline: bool, pub(crate) paragraph_index: usize, } /// Represents content within a paragraph (text or inline equation) #[derive(Debug, Clone)] pub(crate) enum ParagraphContent { Text(String), #[allow(dead_code)] // fallback may be used for UI display in future InlineEquation { latex: String, fallback: String, }, } /// Parse paragraphs with inline equations directly from XML /// Returns a map of paragraph index to ordered content (text and inline equations) pub(crate) fn extract_inline_equation_positions( file_path: &Path, ) -> Result>> { use quick_xml::events::Event; use quick_xml::Reader; use std::fs::File; use std::io::Read; use zip::ZipArchive; let file = File::open(file_path)?; let mut archive = ZipArchive::new(file)?; // Read word/document.xml let mut document_xml = String::new(); let mut xml_file = archive.by_name("word/document.xml")?; xml_file.read_to_string(&mut document_xml)?; let mut paragraphs: std::collections::HashMap> = std::collections::HashMap::new(); let mut reader = Reader::from_str(&document_xml); reader.config_mut().trim_text(false); // Don't trim to preserve spacing let mut buf = Vec::new(); let mut in_paragraph = false; let mut in_math = false; let mut in_math_para = false; // Track if we're in a display equation let mut in_text_run = false; let mut current_paragraph_index = 0; let mut current_paragraph_content: Vec = Vec::new(); let mut current_text = String::new(); let mut current_omml = String::new(); loop { match reader.read_event_into(&mut buf) { Ok(Event::Start(ref e)) if e.name().as_ref() == b"w:p" => { in_paragraph = true; current_paragraph_index += 1; current_paragraph_content.clear(); } Ok(Event::End(ref e)) if e.name().as_ref() == b"w:p" => { in_paragraph = false; if !current_paragraph_content.is_empty() { paragraphs.insert(current_paragraph_index, current_paragraph_content.clone()); } } Ok(Event::Start(ref e)) if e.name().as_ref() == b"m:oMathPara" => { in_math_para = true; } Ok(Event::End(ref e)) if e.name().as_ref() == b"m:oMathPara" => { in_math_para = false; } Ok(Event::Start(ref e)) if e.name().as_ref() == b"m:oMath" && in_paragraph && !in_math_para => { // Inline equation (not wrapped in oMathPara) in_math = true; current_omml.clear(); } Ok(Event::End(ref e)) if e.name().as_ref() == b"m:oMath" && in_math => { in_math = false; let (latex, fallback) = parse_simple_omml(¤t_omml); current_paragraph_content .push(ParagraphContent::InlineEquation { latex, fallback }); current_omml.clear(); } Ok(Event::Start(ref e)) if e.name().as_ref() == b"w:t" && in_paragraph && !in_math => { in_text_run = true; current_text.clear(); } Ok(Event::End(ref e)) if e.name().as_ref() == b"w:t" && in_text_run => { in_text_run = false; if !current_text.is_empty() { current_paragraph_content.push(ParagraphContent::Text(current_text.clone())); } } Ok(Event::Text(ref e)) if in_text_run => { current_text.push_str(&e.unescape().unwrap_or_default()); } // Capture OMML content for inline equations Ok(Event::Start(ref e)) if in_math => { let name_ref = e.name(); let tag_name = std::str::from_utf8(name_ref.as_ref()).unwrap_or(""); current_omml.push('<'); current_omml.push_str(tag_name); for a in e.attributes().flatten() { let key = std::str::from_utf8(a.key.as_ref()).unwrap_or(""); let value = String::from_utf8_lossy(&a.value); current_omml.push(' '); current_omml.push_str(key); current_omml.push_str("=\""); current_omml.push_str(&value); current_omml.push('"'); } current_omml.push('>'); } Ok(Event::End(ref e)) if in_math => { let name_ref = e.name(); let tag_name = std::str::from_utf8(name_ref.as_ref()).unwrap_or(""); current_omml.push_str("'); } Ok(Event::Empty(ref e)) if in_math => { let name_ref = e.name(); let tag_name = std::str::from_utf8(name_ref.as_ref()).unwrap_or(""); current_omml.push('<'); current_omml.push_str(tag_name); for a in e.attributes().flatten() { let key = std::str::from_utf8(a.key.as_ref()).unwrap_or(""); let value = String::from_utf8_lossy(&a.value); current_omml.push(' '); current_omml.push_str(key); current_omml.push_str("=\""); current_omml.push_str(&value); current_omml.push('"'); } current_omml.push_str("/>"); } Ok(Event::Text(ref e)) if in_math => { current_omml.push_str(&e.unescape().unwrap_or_default()); } Ok(Event::Eof) => break, Err(e) => { eprintln!("Error reading XML for inline equations: {e}"); break; } _ => {} } buf.clear(); } Ok(paragraphs) } /// Extract equations from .docx file by reading raw XML /// Since docx-rs doesn't expose OMML (Office Math Markup Language), we parse the ZIP directly pub(crate) fn extract_equations_from_docx(file_path: &Path) -> Result> { use quick_xml::events::Event; use quick_xml::Reader; use std::fs::File; use std::io::Read; use zip::ZipArchive; let file = File::open(file_path)?; let mut archive = ZipArchive::new(file)?; // Read word/document.xml let mut document_xml = String::new(); let mut xml_file = archive.by_name("word/document.xml")?; xml_file.read_to_string(&mut document_xml)?; let mut equations = Vec::new(); let mut reader = Reader::from_str(&document_xml); reader.config_mut().trim_text(true); let mut buf = Vec::new(); let mut in_math = false; let mut in_math_para = false; let mut current_omml = String::new(); let mut current_paragraph_index = 0; loop { match reader.read_event_into(&mut buf) { Ok(Event::Start(ref e)) if e.name().as_ref() == b"w:p" => { current_paragraph_index += 1; } Ok(Event::Start(ref e)) if e.name().as_ref() == b"m:oMathPara" => { in_math_para = true; } Ok(Event::End(ref e)) if e.name().as_ref() == b"m:oMathPara" => { in_math_para = false; } Ok(Event::Start(ref e)) if e.name().as_ref() == b"m:oMath" => { in_math = true; current_omml.clear(); } Ok(Event::End(ref e)) if e.name().as_ref() == b"m:oMath" => { in_math = false; // Parse the collected OMML to LaTeX let (latex, fallback) = parse_simple_omml(¤t_omml); // Inline equations are NOT wrapped in let is_inline = !in_math_para; equations.push(EquationInfo { latex, fallback, is_inline, paragraph_index: current_paragraph_index, }); current_omml.clear(); } Ok(Event::Start(ref e)) if in_math => { let name_ref = e.name(); let tag_name = std::str::from_utf8(name_ref.as_ref()).unwrap_or(""); current_omml.push('<'); current_omml.push_str(tag_name); // Capture attributes (e.g., m:chr m:val="∑") for a in e.attributes().flatten() { let key = std::str::from_utf8(a.key.as_ref()).unwrap_or(""); let value = String::from_utf8_lossy(&a.value); current_omml.push(' '); current_omml.push_str(key); current_omml.push_str("=\""); current_omml.push_str(&value); current_omml.push('"'); } current_omml.push('>'); } Ok(Event::End(ref e)) if in_math => { let name_ref = e.name(); let tag_name = std::str::from_utf8(name_ref.as_ref()).unwrap_or(""); current_omml.push_str("'); } Ok(Event::Empty(ref e)) if in_math => { // Handle self-closing tags like let name_ref = e.name(); let tag_name = std::str::from_utf8(name_ref.as_ref()).unwrap_or(""); current_omml.push('<'); current_omml.push_str(tag_name); // Capture attributes for a in e.attributes().flatten() { let key = std::str::from_utf8(a.key.as_ref()).unwrap_or(""); let value = String::from_utf8_lossy(&a.value); current_omml.push(' '); current_omml.push_str(key); current_omml.push_str("=\""); current_omml.push_str(&value); current_omml.push('"'); } current_omml.push_str("/>"); } Ok(Event::Text(ref e)) if in_math => { current_omml.push_str(&e.unescape().unwrap_or_default()); } Ok(Event::Eof) => break, Err(e) => { eprintln!("Error reading OMML: {e}"); break; } _ => {} } buf.clear(); } Ok(equations) } /// OMML parser that converts to LaTeX format fn parse_simple_omml(omml: &str) -> (String, String) { // Extract plain text for fallback let fallback = omml .split("") .skip(1) .filter_map(|s| s.split("").next()) .collect::>() .join(""); let latex = omml_to_latex(omml); if latex.is_empty() { (fallback.clone(), fallback) } else { (latex, fallback) } } /// Convert OMML XML to LaTeX fn omml_to_latex(omml: &str) -> String { let mut result = String::new(); let mut i = 0; while i < omml.len() { // Look for OMML structures if omml[i..].starts_with("") { // Superscript: ^{...} let end = omml[i..].find("").unwrap_or(omml.len() - i); let content = &omml[i..i + end]; if let (Some(base), Some(sup)) = ( extract_latex_text(content, "m:e"), extract_latex_text(content, "m:sup"), ) { result.push_str(&base); result.push_str("^{"); result.push_str(&sup); result.push('}'); } i += end + 8; } else if omml[i..].starts_with("") { // Subscript: _{...} let end = omml[i..].find("").unwrap_or(omml.len() - i); let content = &omml[i..i + end]; if let (Some(base), Some(sub)) = ( extract_latex_text(content, "m:e"), extract_latex_text(content, "m:sub"), ) { result.push_str(&base); result.push_str("_{"); result.push_str(&sub); result.push('}'); } i += end + 8; } else if omml[i..].starts_with("") { // Subscript and superscript: _{}^{} let end = omml[i..].find("").unwrap_or(omml.len() - i); let content = &omml[i..i + end]; if let (Some(base), Some(sub), Some(sup)) = ( extract_latex_text(content, "m:e"), extract_latex_text(content, "m:sub"), extract_latex_text(content, "m:sup"), ) { result.push_str(&base); result.push_str("_{"); result.push_str(&sub); result.push_str("}^{"); result.push_str(&sup); result.push('}'); } i += end + 12; } else if omml[i..].starts_with("") { // Delimiter: \left(...\right) let end = omml[i..].find("").unwrap_or(omml.len() - i); let content = &omml[i..i + end]; result.push_str("\\left("); if let Some(inner) = extract_latex_text(content, "m:e") { result.push_str(&inner); } result.push_str("\\right)"); i += end + 5; } else if omml[i..].starts_with("") { // Fraction: \frac{num}{den} or binomial coefficient: \binom{n}{k} let end = omml[i..].find("").unwrap_or(omml.len() - i); let content = &omml[i..i + end]; // Check if it's a binomial coefficient (noBar type) let is_binom = content.contains("m:val=\"noBar\""); if let (Some(num), Some(den)) = ( extract_latex_text(content, "m:num"), extract_latex_text(content, "m:den"), ) { if is_binom { result.push_str("\\binom{"); result.push_str(&num); result.push_str("}{"); result.push_str(&den); result.push('}'); } else { result.push_str("\\frac{"); result.push_str(&num); result.push_str("}{"); result.push_str(&den); result.push('}'); } } i += end + 5; } else if omml[i..].starts_with("") { // Function: \sin, \cos, \tan, etc. let end = omml[i..].find("").unwrap_or(omml.len() - i); let content = &omml[i..i + end]; if let Some(func_name) = extract_latex_text(content, "m:fName") { result.push('\\'); result.push_str(&func_name); } if let Some(argument) = extract_latex_text(content, "m:e") { result.push(' '); result.push_str(&argument); } i += end + 8; } else if omml[i..].starts_with("") { // Radical (square root): \sqrt{...} or \sqrt[n]{...} let end = omml[i..].find("").unwrap_or(omml.len() - i); let content = &omml[i..i + end]; result.push_str("\\sqrt"); // Check for degree (nth root) if let Some(deg) = extract_latex_text(content, "m:deg") { if deg != "2" && !deg.is_empty() { result.push('['); result.push_str(°); result.push(']'); } } result.push('{'); if let Some(base) = extract_latex_text(content, "m:e") { result.push_str(&base); } result.push('}'); i += end + 7; } else if omml[i..].starts_with("").unwrap_or(omml.len() - i); let content = &omml[i..i + end]; // Extract operator character and convert to LaTeX command let operator = if let Some(chr_pos) = content.find("m:val=\"") { let start = chr_pos + 7; if let Some(end_quote) = content[start..].find('"') { let chr = &content[start..start + end_quote]; match chr { "∑" => "\\sum", "∫" => "\\int", "∬" => "\\iint", "∭" => "\\iiint", "∮" => "\\oint", "∏" => "\\prod", "⋃" => "\\bigcup", "⋂" => "\\bigcap", _ => "\\sum", } } else { "\\sum" } } else { "\\sum" }; result.push_str(operator); // Extract sub and sup if let Some(sub) = extract_latex_text(content, "m:sub") { result.push_str("_{"); result.push_str(&sub); result.push('}'); } if let Some(sup) = extract_latex_text(content, "m:sup") { result.push_str("^{"); result.push_str(&sup); result.push('}'); } if let Some(base) = extract_latex_text(content, "m:e") { result.push(' '); result.push_str(&base); } i += end + 9; } else if omml[i..].starts_with("") { // Text run - extract text without processing let end = omml[i..].find("").unwrap_or(omml.len() - i); let content = &omml[i..i + end]; if let Some(text) = extract_text(content, "m:t") { // Convert special characters to LaTeX for ch in text.chars() { match ch { 'π' => result.push_str("\\pi "), 'α' => result.push_str("\\alpha "), 'β' => result.push_str("\\beta "), 'γ' => result.push_str("\\gamma "), 'Γ' => result.push_str("\\Gamma "), 'δ' => result.push_str("\\delta "), 'Δ' => result.push_str("\\Delta "), 'θ' => result.push_str("\\theta "), 'λ' => result.push_str("\\lambda "), 'μ' => result.push_str("\\mu "), 'σ' => result.push_str("\\sigma "), 'Σ' => result.push_str("\\Sigma "), 'φ' => result.push_str("\\phi "), 'ω' => result.push_str("\\omega "), 'Ω' => result.push_str("\\Omega "), '∞' => result.push_str("\\infty "), '±' => result.push_str("\\pm "), '×' => result.push_str("\\times "), '÷' => result.push_str("\\div "), '≤' => result.push_str("\\leq "), '≥' => result.push_str("\\geq "), '≠' => result.push_str("\\neq "), '≈' => result.push_str("\\approx "), '∈' => result.push_str("\\in "), '∉' => result.push_str("\\notin "), '⊂' => result.push_str("\\subset "), '⊃' => result.push_str("\\supset "), '∪' => result.push_str("\\cup "), '∩' => result.push_str("\\cap "), '∅' => result.push_str("\\emptyset "), '√' => result.push_str("\\sqrt"), _ => result.push(ch), } } } i += end + 5; } else if omml[i..].starts_with("") { // Text content let end = omml[i + 4..].find("").unwrap_or(omml.len() - i - 4); let text = &omml[i + 4..i + 4 + end]; // Convert special characters for ch in text.chars() { match ch { 'π' => result.push_str("\\pi"), 'α' => result.push_str("\\alpha"), 'β' => result.push_str("\\beta"), _ => result.push(ch), } } i += 4 + end + 5; } else { i += 1; } } result } /// Extract text from an OMML tag and recursively convert nested OMML to LaTeX fn extract_latex_text(omml: &str, tag: &str) -> Option { let start_tag = format!("<{tag}>"); let end_tag = format!(""); if let Some(start_pos) = omml.find(&start_tag) { let content = &omml[start_pos + start_tag.len()..]; // Find the matching closing tag, accounting for nesting let mut depth = 1; let mut pos = 0; let mut end_pos = None; while pos < content.len() && depth > 0 { if content[pos..].starts_with(&start_tag) { depth += 1; pos += start_tag.len(); } else if content[pos..].starts_with(&end_tag) { depth -= 1; if depth == 0 { end_pos = Some(pos); break; } pos += end_tag.len(); } else { // Skip to next character boundary (Unicode-safe) let next_char = content[pos..].chars().next(); if let Some(ch) = next_char { pos += ch.len_utf8(); } else { break; } } } if let Some(end_pos) = end_pos { let inner = &content[..end_pos]; // Check if inner content has OMML structures if inner.contains(" tags let text = inner .split("") .skip(1) .filter_map(|s| s.split("").next()) .collect::>() .join(""); if !text.is_empty() { return Some(text); } } } } None } /// Extract text from an OMML tag fn extract_text(omml: &str, tag: &str) -> Option { let start_tag = format!("<{tag}>"); let end_tag = format!(""); if let Some(start_pos) = omml.find(&start_tag) { let content = &omml[start_pos + start_tag.len()..]; if let Some(end_pos) = content.find(&end_tag) { let inner = &content[..end_pos]; // Inner is already the text between and , just return it if !inner.is_empty() { return Some(inner.to_string()); } } } None } doxx-0.1.4/src/document/parsing/formatting.rs000064400000000000000000000111011046102023000173720ustar 00000000000000//! Text extraction and formatting utilities //! //! This module handles extraction of text and formatting information //! from docx-rs paragraph and run elements. use super::super::models::*; /// Extract plain text from a paragraph, handling various child elements pub(crate) fn extract_paragraph_text(para: &docx_rs::Paragraph) -> String { let mut text = String::new(); for child in ¶.children { match child { docx_rs::ParagraphChild::Run(run) => { text.push_str(&extract_run_text(run)); } docx_rs::ParagraphChild::Insert(insert) => { // Handle insertions (track changes) - simplified approach // Since InsertChild might be different from Run, we'll extract text differently // This is a placeholder - in practice we'd need to handle the specific types for child in &insert.children { if let docx_rs::InsertChild::Run(run) = child { text.push_str(&extract_run_text(run)); } } } docx_rs::ParagraphChild::Delete(_) => { // Skip deletions (track changes) } _ => { // Handle other paragraph children if needed } } } text.trim().to_string() } /// Extract text from a run using docx-rs features pub(crate) fn extract_run_text(run: &docx_rs::Run) -> String { let mut text = String::new(); for child in &run.children { match child { docx_rs::RunChild::Text(text_elem) => { text.push_str(&text_elem.text); } docx_rs::RunChild::Tab(_) => { text.push('\t'); } docx_rs::RunChild::Break(_) => { // Break types are private, so we'll just add a line break text.push('\n'); } docx_rs::RunChild::Drawing(_) => { text.push_str("[Image]"); } _ => { // Handle other run children } } } text } /// Extract formatting information from a run pub(crate) fn extract_run_formatting(run: &docx_rs::Run) -> TextFormatting { let mut formatting = TextFormatting::default(); // Access run properties directly (they're not optional in current API) let props = &run.run_property; formatting.bold = props.bold.is_some(); formatting.italic = props.italic.is_some(); formatting.underline = props.underline.is_some(); formatting.strikethrough = props.strike.is_some() || props.dstrike.is_some(); // Extract color information if let Some(color) = &props.color { // Extract color value through debug formatting as a workaround for private field access let color_debug = format!("{color:?}"); if let Some(start) = color_debug.find("val: \"") { // Safe: searching for ASCII strings in debug output let search_from = start + 6; // length of "val: \"" if let Some(end) = color_debug[search_from..].find("\"") { let color_val = &color_debug[search_from..search_from + end]; formatting.color = Some(color_val.to_string()); } } } // For now, skip font size extraction due to API complexity // TODO: Add font size extraction when we understand the API better formatting } /// Extract numbering information from docx-rs numbering properties pub(crate) fn extract_numbering_info(num_pr: &docx_rs::NumberingProperty) -> Option { let num_id = num_pr.id.as_ref()?.id as i32; let level = num_pr.level.as_ref().map(|l| l.val as u8).unwrap_or(0); Some((num_id, level)) } /// Reconstruct heading number from Word's numbering system pub(crate) fn reconstruct_heading_number(num_id: i32, level: u8, heading_level: u8) -> String { // This is a simplified reconstruction // In a full implementation, we'd need to access the numbering definitions // and track the current state across the document match (num_id, level, heading_level) { // Standard heading numbering schemes (_, 0, 1) => "1".to_string(), (_, 1, 2) => "1.1".to_string(), (_, 2, 3) => "1.1.1".to_string(), (_, 3, 4) => "1.1.1.1".to_string(), _ => { // Fallback based on heading level match heading_level { 1 => "1".to_string(), 2 => "1.1".to_string(), 3 => "1.1.1".to_string(), _ => "1.1.1.1".to_string(), } } } } doxx-0.1.4/src/document/parsing/heading.rs000064400000000000000000000172701046102023000166340ustar 00000000000000//! Heading detection and classification //! //! This module handles detection of headings from Word paragraphs, //! including style-based detection, text-based heuristics, and //! numbering extraction. use super::super::cleanup::is_likely_sentence; use super::super::models::*; use super::formatting::{ extract_numbering_info, extract_paragraph_text, reconstruct_heading_number, }; use super::list::is_likely_list_item; use super::numbering::{extract_heading_number_from_text, HeadingInfo}; /// Detect heading level from Word paragraph style pub(crate) fn detect_heading_from_paragraph_style(para: &docx_rs::Paragraph) -> Option { // Try to access paragraph properties and style if let Some(style) = ¶.property.style { // Check for heading styles (Heading1, Heading2, etc.) if style.val.starts_with("Heading") || style.val.starts_with("heading") { if let Some(level_char) = style.val.chars().last() { if let Some(level) = level_char.to_digit(10) { return Some(level.min(6) as u8); } } // Default to level 1 for unspecified heading styles return Some(1); } } None } /// Detect heading with automatic or manual numbering pub(crate) fn detect_heading_with_numbering(para: &docx_rs::Paragraph) -> Option { // First check if this is a heading style let heading_level = detect_heading_from_paragraph_style(para)?; // Extract text using docx-rs proper text extraction let text = extract_paragraph_text(para); // Priority order for numbering detection: // 1. Manual numbering in text content (highest priority - user explicitly typed) // 2. Word's automatic numbering (w:numPr) - explicit numbering properties // 3. Style-based automatic generation (lowest priority - our inference) // First, check for manual numbering in text content if let Some((number, remaining_text)) = extract_heading_number_from_text(&text) { return Some(HeadingInfo { level: heading_level, number: Some(number), clean_text: Some(remaining_text), }); } // Second, check for Word's automatic numbering if let Some(num_pr) = ¶.property.numbering_property { // This is automatic Word numbering - try to reconstruct if let Some((num_id, level)) = extract_numbering_info(num_pr) { let number = reconstruct_heading_number(num_id, level, heading_level); return Some(HeadingInfo { level: heading_level, number: Some(number), clean_text: Some(text), // Keep original text since number is automatic }); } } // If no numbering found, return heading info without number Some(HeadingInfo { level: heading_level, number: None, clean_text: None, }) } /// Detect headings based on text content and formatting heuristics pub(crate) fn detect_heading_from_text(text: &str, formatting: &TextFormatting) -> Option { let text = text.trim(); // Be much more conservative and selective if text.len() < 100 && !text.contains('\n') { // Exclude common non-heading patterns first if is_likely_list_item(text) || is_likely_sentence(text) { return None; } // Exclude if it contains typical sentence patterns if text.contains(" the ") || text.contains(" and ") || text.contains(" with ") || text.contains(" for ") { return None; } // Strong indicators of headings if formatting.bold && text.len() < 60 && text.len() > 5 { // Bold text that's reasonably short is likely a heading if !text.ends_with('.') && !text.ends_with(',') && !text.ends_with(';') && !text.ends_with(':') { return Some(determine_heading_level_from_text(text)); } } // Check if it's all caps (but not just a short word) if text.len() > 15 && text.len() < 50 && text.chars().all(|c| { c.is_uppercase() || c.is_whitespace() || c.is_numeric() || c.is_ascii_punctuation() }) { return Some(1); } // Very specific patterns that indicate headings if text.starts_with("Chapter ") || text.starts_with("Section ") || text.starts_with("Part ") { return Some(determine_heading_level_from_text(text)); } // Look for standalone phrases that could be headings (very conservative) if text.len() < 40 && text.len() > 10 && !text.ends_with('.') && !text.contains(',') && !text.contains('(') && !text.contains(':') { // Check if it has heading-like characteristics let words = text.split_whitespace().count(); if (2..=5).contains(&words) { // Must contain at least one meaningful word (longer than 3 chars) let has_meaningful_word = text .split_whitespace() .any(|word| word.len() > 3 && word.chars().all(|c| c.is_alphabetic())); if has_meaningful_word && text.chars().next().is_some_and(|c| c.is_uppercase()) { return Some(determine_heading_level_from_text(text)); } } } } None } /// Determine heading level from text length heuristic pub(crate) fn determine_heading_level_from_text(text: &str) -> u8 { // Simple heuristic: shorter text = higher level (lower number) if text.len() < 20 { 1 } else if text.len() < 40 { 2 } else { 3 } } #[cfg(test)] mod tests { use super::*; #[test] fn test_heading_number_extraction() { // Test most common formats (decimal hierarchical) assert_eq!( extract_heading_number_from_text("1. Introduction"), Some(("1".to_string(), "Introduction".to_string())) ); assert_eq!( extract_heading_number_from_text("1.1 Project Overview"), Some(("1.1".to_string(), "Project Overview".to_string())) ); assert_eq!( extract_heading_number_from_text("2.1.1 Something Important"), Some(("2.1.1".to_string(), "Something Important".to_string())) ); // Test alternative numbering schemes assert_eq!( extract_heading_number_from_text("A. First Section"), Some(("A".to_string(), "First Section".to_string())) ); assert_eq!( extract_heading_number_from_text("I. Roman Numeral"), Some(("I".to_string(), "Roman Numeral".to_string())) ); // Test section numbering assert_eq!( extract_heading_number_from_text("Section 1.2 Overview"), Some(("Section 1.2".to_string(), "Overview".to_string())) ); // Test no numbering (should fall back to automatic generation) assert_eq!(extract_heading_number_from_text("Introduction"), None); // Test titles with numbers that should NOT be treated as numbered headings assert_eq!(extract_heading_number_from_text("Heading 1"), None); // Note: "Chapter 5 Summary" will match the section pattern, which is intentional // The section pattern is designed to match "Chapter 5 Something" formats assert_eq!( extract_heading_number_from_text("Chapter 5 Summary"), Some(("Chapter 5".to_string(), "Summary".to_string())) ); assert_eq!(extract_heading_number_from_text("Version 2"), None); } } doxx-0.1.4/src/document/parsing/list.rs000064400000000000000000000161021046102023000162010ustar 00000000000000//! List processing and detection //! //! This module handles detection of list items from paragraphs and //! grouping them into hierarchical list structures. use super::super::models::*; pub(crate) fn is_likely_list_item(text: &str) -> bool { let text = text.trim(); // Skip Word-formatted list items to avoid reprocessing if text.starts_with("__WORD_LIST__") { return false; } // Check for numbered list patterns that are NOT headings if text.starts_with(char::is_numeric) { // If it starts with a number followed by "." and then has substantial content, // it's likely a list item, not a heading if let Some(dot_pos) = text.find('.') { // Safe: '.' is ASCII, so dot_pos+1 is guaranteed to be a char boundary let after_dot = &text[dot_pos + 1..].trim(); // If there's substantial content after the number and dot, it's likely a list item if after_dot.len() > 20 { return true; } } } // Check for bullet point patterns if text.starts_with("• ") || text.starts_with("- ") || text.starts_with("* ") { return true; } // Check for lettered lists if text.len() > 3 && text.chars().nth(1) == Some('.') { let first_char = text.chars().next().unwrap(); if first_char.is_ascii_lowercase() || first_char.is_ascii_uppercase() { return true; } } false } pub(crate) fn group_list_items(elements: Vec) -> Vec { let mut result = Vec::new(); let mut current_list_items = Vec::new(); let mut current_list_ordered = false; for element in elements { match &element { DocumentElement::Paragraph { runs } => { // Get the combined text from all runs for list detection let text: String = runs.iter().map(|run| run.text.as_str()).collect(); if is_likely_list_item(&text) { // Determine if this is an ordered list item let is_ordered = text.trim().starts_with(char::is_numeric); // If we're starting a new list or switching list types, finish the current list if !current_list_items.is_empty() && is_ordered != current_list_ordered { result.push(DocumentElement::List { items: std::mem::take(&mut current_list_items), ordered: current_list_ordered, }); } current_list_ordered = is_ordered; // Calculate nesting level from indentation let level = calculate_list_level(&text); // Clean the runs (remove bullet/number prefix from first run) let clean_runs = clean_list_item_runs(runs.clone()); current_list_items.push(ListItem { runs: clean_runs, level, }); } else { // Not a list item, so finish any current list if !current_list_items.is_empty() { result.push(DocumentElement::List { items: std::mem::take(&mut current_list_items), ordered: current_list_ordered, }); } result.push(element); } } _ => { // Non-paragraph element, finish any current list if !current_list_items.is_empty() { result.push(DocumentElement::List { items: std::mem::take(&mut current_list_items), ordered: current_list_ordered, }); } result.push(element); } } } // Don't forget the last list if the document ends with one if !current_list_items.is_empty() { result.push(DocumentElement::List { items: current_list_items, ordered: current_list_ordered, }); } result } fn calculate_list_level(text: &str) -> u8 { // Count leading whitespace to determine nesting level let leading_spaces = text.len() - text.trim_start().len(); // Convert spaces to levels (every 2-4 spaces = 1 level) // Use 2 spaces per level as it's common in Word documents (leading_spaces / 2) as u8 } fn clean_list_item_runs(runs: Vec) -> Vec { if runs.is_empty() { return runs; } // Get the combined text to determine what prefix to remove let combined_text: String = runs.iter().map(|run| run.text.as_str()).collect(); let text = combined_text.trim(); // Determine what prefix we need to remove let prefix_to_remove = if text.starts_with("• ") { "• " } else if text.starts_with("- ") { "- " } else if text.starts_with("* ") { "* " } else if let Some(dot_pos) = text.find('.') { let prefix = &text[..dot_pos]; if prefix.chars().all(|c| c.is_ascii_digit()) { // For numbered lists, include the dot and following space &text[..dot_pos + if text.chars().nth(dot_pos + 1) == Some(' ') { 2 } else { 1 }] } else if text.chars().count() > 2 && text.chars().nth(1) == Some('.') { let first_char = text.chars().next().unwrap(); if first_char.is_ascii_lowercase() || first_char.is_ascii_uppercase() { // For lettered lists, include the letter, dot, and following space &text[..if text.chars().nth(2) == Some(' ') { 3 } else { 2 }] } else { "" } } else { "" } } else { "" }; if prefix_to_remove.is_empty() { return runs; } // Remove the prefix from the runs while preserving formatting let mut result_runs = Vec::new(); let mut chars_to_remove = prefix_to_remove.chars().count(); for run in runs { if chars_to_remove == 0 { // No more prefix to remove, keep this run as-is result_runs.push(run); } else { let run_char_count = run.text.chars().count(); if run_char_count <= chars_to_remove { // This entire run is part of the prefix to remove chars_to_remove -= run_char_count; } else { // This run contains part of the text we want to keep let keep_text: String = run.text.chars().skip(chars_to_remove).collect(); if !keep_text.is_empty() { result_runs.push(FormattedRun { text: keep_text.trim_start().to_string(), formatting: run.formatting, }); } chars_to_remove = 0; } } } result_runs } doxx-0.1.4/src/document/parsing/mod.rs000064400000000000000000000004361046102023000160100ustar 00000000000000//! Document parsing utilities //! //! This module contains specialized parsing functions for different //! document elements and features. pub(crate) mod equation; pub(crate) mod formatting; pub(crate) mod heading; pub(crate) mod list; pub(crate) mod numbering; pub(crate) mod table; doxx-0.1.4/src/document/parsing/numbering.rs000064400000000000000000000302531046102023000172170ustar 00000000000000//! Numbering management for lists and headings //! //! This module handles stateful numbering tracking for both list items //! and heading auto-numbering, including hierarchical number generation. use once_cell::sync::Lazy; use regex::Regex; use std::collections::{HashMap, HashSet}; /// Parse a Word numFmt string into a `NumberingFormat` variant. pub(crate) fn parse_numbering_format(fmt_str: &str) -> NumberingFormat { match fmt_str { "decimal" | "decimalZero" => NumberingFormat::Decimal, "lowerLetter" => NumberingFormat::LowerLetter, "upperLetter" => NumberingFormat::UpperLetter, "lowerRoman" => NumberingFormat::LowerRoman, "upperRoman" => NumberingFormat::UpperRoman, "parenLowerLetter" => NumberingFormat::ParenLowerLetter, "parenLowerRoman" => NumberingFormat::ParenLowerRoman, _ => NumberingFormat::Decimal, } } /// Format a counter value using the given numbering format. pub(crate) fn format_number_static(counter: u32, format: NumberingFormat) -> String { match format { NumberingFormat::Decimal => format!("{counter}. "), NumberingFormat::LowerLetter => { if counter <= 26 { format!("{}. ", (b'a' + (counter - 1) as u8) as char) } else { format!("{counter}. ") } } NumberingFormat::UpperLetter => { if counter <= 26 { format!("{}. ", (b'A' + (counter - 1) as u8) as char) } else { format!("{counter}. ") } } NumberingFormat::LowerRoman => { format!("{}. ", roman_numeral(counter).to_lowercase()) } NumberingFormat::UpperRoman => format!("{}. ", roman_numeral(counter)), NumberingFormat::ParenLowerLetter => { if counter <= 26 { format!("({}) ", (b'a' + (counter - 1) as u8) as char) } else { format!("({counter}) ") } } NumberingFormat::ParenLowerRoman => { format!("({}) ", roman_numeral(counter).to_lowercase()) } NumberingFormat::Bullet => "* ".to_string(), } } fn roman_numeral(num: u32) -> String { const VALUES: &[u32] = &[1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1]; const SYMBOLS: &[&str] = &[ "M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I", ]; let mut result = String::new(); let mut n = num; for (i, &value) in VALUES.iter().enumerate() { while n >= value { result.push_str(SYMBOLS[i]); n -= value; } } result } /// Resolves DOCX numbering definitions to determine list ordering and formatting. /// /// Tracks counters per `(abstractNumId, level)` so that different `numId` values /// that share the same abstract numbering definition continue counting sequentially. /// Start overrides in a `numId`'s level overrides are applied once on first use. pub(crate) struct NumberingResolver { /// (abstractNumId, level) → (numFmt string, default start value) abstract_levels: HashMap<(usize, usize), (String, usize)>, /// numId → (abstractNumId, level → start_override) num_instances: HashMap)>, /// Counter state per (abstractNumId, level) counters: HashMap<(usize, usize), u32>, /// Tracks which (numId, level) pairs have already applied their start override applied_overrides: HashSet<(usize, usize)>, } impl NumberingResolver { /// Build a resolver from a parsed docx numbering table. pub(crate) fn build_from_docx(numberings: &docx_rs::Numberings) -> Self { let mut abstract_levels = HashMap::new(); let mut num_instances = HashMap::new(); for abstract_num in &numberings.abstract_nums { for level in &abstract_num.levels { let start: usize = serde_json::to_value(&level.start) .ok() .and_then(|v| v.as_u64()) .unwrap_or(1) as usize; abstract_levels.insert( (abstract_num.id, level.level), (level.format.val.clone(), start), ); } } for numbering in &numberings.numberings { let mut overrides = HashMap::new(); for lo in &numbering.level_overrides { if let Some(start) = lo.override_start { overrides.insert(lo.level, start); } } num_instances.insert(numbering.id, (numbering.abstract_num_id, overrides)); } Self { abstract_levels, num_instances, counters: HashMap::new(), applied_overrides: HashSet::new(), } } /// Return true if the (numId, level) pair is an ordered (numbered) list. pub(crate) fn is_ordered(&self, num_id: i32, level: u8) -> bool { let num_id = num_id as usize; let level = level as usize; if let Some((abstract_num_id, _)) = self.num_instances.get(&num_id) { if let Some((fmt_str, _)) = self.abstract_levels.get(&(*abstract_num_id, level)) { return fmt_str != "bullet" && fmt_str != "none"; } } true } /// Generate the next formatted number string for a (numId, level) pair. pub(crate) fn generate_number(&mut self, num_id: i32, level: u8) -> String { let num_id = num_id as usize; let level = level as usize; let Some((abstract_num_id, overrides)) = self.num_instances.get(&num_id) else { return format!("{}. ", level + 1); }; let abstract_num_id = *abstract_num_id; let start_override = overrides.get(&level).copied(); let format_str = self .abstract_levels .get(&(abstract_num_id, level)) .map(|(s, _)| s.clone()) .unwrap_or_else(|| "decimal".to_string()); let counter_key = (abstract_num_id, level); let override_key = (num_id, level); // Apply a start override exactly once per (numId, level) if let Some(start) = start_override { if !self.applied_overrides.contains(&override_key) { self.applied_overrides.insert(override_key); *self.counters.entry(counter_key).or_insert(0) = (start as u32).saturating_sub(1); } } // Reset deeper levels for this abstract numbering let keys_to_reset: Vec<_> = self .counters .keys() .filter(|(aid, lvl)| *aid == abstract_num_id && *lvl > level) .cloned() .collect(); for k in keys_to_reset { self.counters.remove(&k); } let counter = { let c = self.counters.entry(counter_key).or_insert(0); *c += 1; *c }; let format = parse_numbering_format(&format_str); format_number_static(counter, format) } } /// Type alias for heading number and cleaned text pub(crate) type HeadingNumberInfo = (String, String); /// Different numbering formats supported by Word #[derive(Debug, Clone, Copy)] pub(crate) enum NumberingFormat { Decimal, // 1. 2. 3. LowerLetter, // a. b. c. UpperLetter, // A. B. C. LowerRoman, // i. ii. iii. UpperRoman, // I. II. III. ParenLowerLetter, // (a) (b) (c) ParenLowerRoman, // (i) (ii) (iii) #[allow(dead_code)] Bullet, // * * * } #[derive(Debug, Clone)] pub(crate) struct HeadingInfo { pub(crate) level: u8, pub(crate) number: Option, pub(crate) clean_text: Option, // Text with number removed } pub(crate) struct HeadingNumberTracker { counters: [u32; 6], // Support up to 6 heading levels auto_numbering_enabled: bool, } impl HeadingNumberTracker { pub(crate) fn new() -> Self { Self { counters: [0; 6], auto_numbering_enabled: false, } } pub(crate) fn enable_auto_numbering(&mut self) { self.auto_numbering_enabled = true; } pub(crate) fn get_number(&mut self, level: u8) -> String { if !self.auto_numbering_enabled { return String::new(); } let level_index = (level.saturating_sub(1) as usize).min(5); // Increment current level self.counters[level_index] += 1; // Reset all deeper levels for i in (level_index + 1)..6 { self.counters[i] = 0; } // Build number string (1.2.3 format) let mut parts = Vec::new(); for i in 0..=level_index { if self.counters[i] > 0 { parts.push(self.counters[i].to_string()); } } parts.join(".") } } /// Analyze document structure to determine if automatic numbering should be enabled pub(crate) fn analyze_heading_structure(document: &docx_rs::Document) -> bool { let mut heading_count = 0; let mut has_explicit_numbering = false; let mut level_counts = [0u32; 6]; // Count headings at each level for child in &document.children { if let docx_rs::DocumentChild::Paragraph(para) = child { // Note: detect_heading_from_paragraph_style and extract_paragraph_text // will be in the heading/formatting modules, but we use them here // This creates a circular dependency that we'll resolve in later phases if let Some(heading_level) = super::heading::detect_heading_from_paragraph_style(para) { let text = super::formatting::extract_paragraph_text(para); // Check if this heading has explicit numbering in the text if extract_heading_number_from_text(&text).is_some() { has_explicit_numbering = true; } heading_count += 1; let level_index = (heading_level.saturating_sub(1) as usize).min(5); level_counts[level_index] += 1; } } } // Don't auto-number if: // 1. Any headings have explicit numbering // 2. Very few headings (less than 3) // 3. Only one level of headings (no hierarchy) if has_explicit_numbering || heading_count < 3 { return false; } // Check if we have a real hierarchy (headings at multiple levels) let levels_with_headings = level_counts.iter().filter(|&&count| count > 0).count(); // Auto-number if we have multiple levels or multiple headings at level 1 levels_with_headings > 1 || level_counts[0] > 1 } // Lazy static regex patterns for heading number detection // Focused on common patterns for manual numbering in text static HEADING_NUMBER_PATTERNS: Lazy> = Lazy::new(|| { vec![ // Standard decimal numbering: "1.", "1.1", "1.1.1", "2.1.1" (most common) // For single numbers, require a period to distinguish from "Heading 1" style titles // For hierarchical numbers (1.1, 1.2.3), period is optional Regex::new(r"^(\d+(?:\.\d+)+\.?|\d+\.)\s+(.+)$").unwrap(), // Section numbering: "Section 1.2", "Chapter 3" Regex::new(r"^((?:Section|Chapter|Part)\s+\d+(?:\.\d+)*\.?)\s+(.+)$").unwrap(), // Alternative numbering schemes (less common, but still useful) Regex::new(r"^([A-Z]\.)\s+(.+)$").unwrap(), // "A. Introduction" Regex::new(r"^([IVX]+\.)\s+(.+)$").unwrap(), // "I. Overview" ] }); pub(crate) fn extract_heading_number_from_text(text: &str) -> Option { let text = text.trim(); // Early return for empty text if text.is_empty() { return None; } // Try each pattern until one matches for pattern in HEADING_NUMBER_PATTERNS.iter() { if let Some(captures) = pattern.captures(text) { if let (Some(number_match), Some(text_match)) = (captures.get(1), captures.get(2)) { let number = number_match.as_str().trim_end_matches('.'); let remaining_text = text_match.as_str().trim(); // Only return if we have both number and meaningful text if !number.is_empty() && !remaining_text.is_empty() { return Some((number.to_string(), remaining_text.to_string())); } } } } None } doxx-0.1.4/src/document/parsing/table.rs000064400000000000000000000242551046102023000163250ustar 00000000000000//! Table extraction and processing //! //! This module handles extraction of table data from Word documents, //! including header detection, column width calculation, and data type //! inference for proper alignment. use super::super::models::*; use super::formatting::extract_run_formatting; /// Extract table data from a docx-rs Table pub(crate) fn extract_table_data(table: &docx_rs::Table) -> Option { let mut header_cells = Vec::new(); let mut data_rows = Vec::new(); let mut is_first_row = true; let mut _raw_headers = Vec::new(); let mut raw_rows = Vec::new(); // First pass: extract raw text content for table_child in &table.rows { let docx_rs::TableChild::TableRow(row) = table_child; let mut row_cells = Vec::new(); for row_child in &row.cells { let docx_rs::TableRowChild::TableCell(cell) = row_child; let mut cell_text = String::new(); let mut cell_formatting = TextFormatting::default(); // Extract text and formatting from all content in the cell for content in &cell.children { match content { docx_rs::TableCellContent::Paragraph(para) => { for para_child in ¶.children { if let docx_rs::ParagraphChild::Run(run) = para_child { // Extract formatting from the first run if !cell_formatting.bold && !cell_formatting.italic { cell_formatting = extract_run_formatting(run); } for run_child in &run.children { if let docx_rs::RunChild::Text(text_elem) = run_child { if !cell_text.is_empty() && !cell_text.ends_with(' ') { cell_text.push(' '); } cell_text.push_str(&text_elem.text); } } } } } _ => { // Handle nested tables or other content if needed } } } let table_cell = TableCell::new(cell_text.trim().to_string()).with_formatting(cell_formatting); row_cells.push(table_cell); } if !row_cells.is_empty() { let raw_text: Vec = row_cells.iter().map(|c| c.content.clone()).collect(); if is_first_row && appears_to_be_header(&raw_text) { _raw_headers = raw_text; header_cells = row_cells; is_first_row = false; } else { raw_rows.push(raw_text); data_rows.push(row_cells); is_first_row = false; } } } // If no headers were detected, use the first row as headers if header_cells.is_empty() && !data_rows.is_empty() { header_cells = data_rows.remove(0); raw_rows.remove(0); } // Return table only if it has content if !header_cells.is_empty() || !data_rows.is_empty() { let table_data = TableData::new(header_cells, data_rows); Some(DocumentElement::Table { table: table_data }) } else { None } } /// Detect if a row appears to be a header based on heuristics fn appears_to_be_header(row: &[String]) -> bool { // Heuristics to detect if a row is likely a header let total_chars: usize = row.iter().map(|cell| cell.len()).sum(); let avg_length = if !row.is_empty() { total_chars / row.len() } else { 0 }; // Headers tend to be shorter and more concise if avg_length > 50 { return false; } // Check if most cells contain typical header words or are short phrases let header_indicators = row .iter() .filter(|cell| { let cell_lower = cell.to_lowercase(); let word_count = cell.split_whitespace().count(); // Short phrases (1-3 words) are often headers if word_count <= 3 && !cell.trim().is_empty() { return true; } // Common header words if cell_lower.contains("name") || cell_lower.contains("date") || cell_lower.contains("amount") || cell_lower.contains("type") || cell_lower.contains("status") || cell_lower.contains("id") || cell_lower.contains("description") || cell_lower.contains("count") { return true; } false }) .count(); // If more than half the cells look like headers, treat the row as a header header_indicators > row.len() / 2 } // Enhanced table processing functions impl TableData { pub fn new(headers: Vec, rows: Vec>) -> Self { let column_count = headers.len(); let row_count = rows.len(); let has_headers = !headers.is_empty(); // Calculate optimal column widths let column_widths = calculate_column_widths(&headers, &rows); // Determine column alignments let column_alignments = determine_column_alignments(&headers, &rows); let metadata = TableMetadata { column_count, row_count, has_headers, column_widths, column_alignments, title: None, }; Self { headers, rows, metadata, } } pub fn _get_column_width(&self, column_index: usize) -> usize { self.metadata .column_widths .get(column_index) .copied() .unwrap_or(10) } pub fn _get_column_alignment(&self, column_index: usize) -> TextAlignment { self.metadata .column_alignments .get(column_index) .copied() .unwrap_or(TextAlignment::Left) } } impl TableCell { pub fn new(content: String) -> Self { let data_type = detect_cell_data_type(&content); let alignment = default_alignment_for_type(data_type); Self { content, alignment, formatting: TextFormatting::default(), data_type, } } pub fn _with_alignment(mut self, alignment: TextAlignment) -> Self { self.alignment = alignment; self } pub fn with_formatting(mut self, formatting: TextFormatting) -> Self { self.formatting = formatting; self } pub fn display_width(&self) -> usize { // Calculate display width considering unicode characters unicode_segmentation::UnicodeSegmentation::graphemes(self.content.as_str(), true).count() } } /// Calculate optimal column widths based on content fn calculate_column_widths(headers: &[TableCell], rows: &TableRows) -> Vec { if headers.is_empty() { return Vec::new(); } let mut widths = headers .iter() .map(|h| h.display_width()) .collect::>(); for row in rows { for (i, cell) in row.iter().enumerate() { if let Some(current_width) = widths.get_mut(i) { *current_width = (*current_width).max(cell.display_width()); } } } // Ensure minimum width of 3 characters per column widths.iter_mut().for_each(|w| *w = (*w).max(3)); widths } /// Determine column alignments based on data types fn determine_column_alignments(headers: &[TableCell], rows: &TableRows) -> Vec { let column_count = headers.len(); let mut alignments = vec![TextAlignment::Left; column_count]; for (col_index, alignment) in alignments.iter_mut().enumerate().take(column_count) { let mut numeric_count = 0; let mut total_count = 0; // Check data types in this column for row in rows { if let Some(cell) = row.get(col_index) { total_count += 1; if matches!( cell.data_type, CellDataType::Number | CellDataType::Currency | CellDataType::Percentage ) { numeric_count += 1; } } } // If more than 70% of cells are numeric, right-align the column if total_count > 0 && (numeric_count as f32 / total_count as f32) > 0.7 { *alignment = TextAlignment::Right; } } alignments } /// Detect the data type of a cell's content fn detect_cell_data_type(content: &str) -> CellDataType { let trimmed = content.trim(); if trimmed.is_empty() { return CellDataType::Empty; } // Check for currency if trimmed.starts_with('$') || trimmed.starts_with('\u{20AC}') || trimmed.starts_with('\u{00A3}') { return CellDataType::Currency; } // Check for percentage if trimmed.ends_with('%') { return CellDataType::Percentage; } // Check for boolean let lower = trimmed.to_lowercase(); if matches!(lower.as_str(), "true" | "false" | "yes" | "no" | "y" | "n") { return CellDataType::Boolean; } // Check for number (including with commas) let number_candidate = trimmed.replace(',', ""); if number_candidate.parse::().is_ok() { return CellDataType::Number; } // Check for date patterns (basic) if trimmed.contains('/') || trimmed.contains('-') { let parts: Vec<&str> = trimmed.split(['/', '-']).collect(); if parts.len() == 3 && parts.iter().all(|p| p.parse::().is_ok()) { return CellDataType::Date; } } CellDataType::Text } /// Get default alignment for a data type fn default_alignment_for_type(data_type: CellDataType) -> TextAlignment { match data_type { CellDataType::Number | CellDataType::Currency | CellDataType::Percentage => { TextAlignment::Right } CellDataType::Boolean => TextAlignment::Center, _ => TextAlignment::Left, } } doxx-0.1.4/src/document/query.rs000064400000000000000000000107711046102023000147360ustar 00000000000000//! Document search and navigation operations //! //! This module provides read-only querying operations on parsed documents, //! including full-text search and outline generation. use super::models::*; pub fn search_document(document: &Document, query: &str) -> Vec { let mut results = Vec::new(); // TODO: consider deferring search execution until Enter is pressed if query.is_empty() { return results; } let query_lower = query.to_lowercase(); for (element_index, element) in document.elements.iter().enumerate() { let text = match element { DocumentElement::Heading { text, .. } => text, DocumentElement::Paragraph { runs } => { // Combine text from all runs for searching &runs.iter().map(|run| run.text.as_str()).collect::() } DocumentElement::List { items, .. } => { // Search in list items for item in items { let item_text: String = item.runs.iter().map(|run| run.text.as_str()).collect(); let text_lower = item_text.to_lowercase(); if let Some(start_pos) = text_lower.find(&query_lower) { results.push(SearchResult { element_index, text: item_text, start_pos, end_pos: start_pos + query.len(), }); } } continue; } DocumentElement::Table { table } => { // Search in table content for header in &table.headers { let text_lower = header.content.to_lowercase(); if let Some(start_pos) = text_lower.find(&query_lower) { results.push(SearchResult { element_index, text: header.content.clone(), start_pos, end_pos: start_pos + query.len(), }); } } for row in &table.rows { for cell in row { let text_lower = cell.content.to_lowercase(); if let Some(start_pos) = text_lower.find(&query_lower) { results.push(SearchResult { element_index, text: cell.content.clone(), start_pos, end_pos: start_pos + query.len(), }); } } } continue; } DocumentElement::Image { description, .. } => description, DocumentElement::Equation { latex, .. } => latex, DocumentElement::CodeBlock { text } => text, DocumentElement::TextBox { lines } => { let combined = lines.join(" "); let text_lower = combined.to_lowercase(); if let Some(start_pos) = text_lower.find(&query_lower) { results.push(SearchResult { element_index, text: combined, start_pos, end_pos: start_pos + query.len(), }); } continue; } DocumentElement::PageBreak => continue, }; let text_lower = text.to_lowercase(); if let Some(start_pos) = text_lower.find(&query_lower) { results.push(SearchResult { element_index, text: text.clone(), start_pos, end_pos: start_pos + query.len(), }); } } results } pub fn generate_outline(document: &Document) -> Vec { let mut outline = Vec::new(); for (index, element) in document.elements.iter().enumerate() { if let DocumentElement::Heading { level, text, number, } = element { let title = if let Some(number) = number { format!("{number} {text}") } else { text.clone() }; outline.push(OutlineItem { title, level: *level, element_index: index, }); } } outline } doxx-0.1.4/src/equation.rs000064400000000000000000000434431046102023000136020ustar 00000000000000use anyhow::Result; use quick_xml::events::Event; use quick_xml::Reader; /// Represents a mathematical equation extracted from a DOCX file #[derive(Debug, Clone)] pub struct Equation { /// Raw OMML (Office Math Markup Language) XML pub omml: String, /// Parsed and rendered Unicode representation pub unicode: String, /// Plain text fallback pub fallback: String, } /// OMML element types we need to parse #[derive(Debug, Clone)] enum OmmlElement { /// Superscript: base^exponent Superscript { base: Box, sup: Box, }, /// Subscript: base_sub Subscript { base: Box, sub: Box, }, /// Fraction: numerator/denominator Fraction { num: Box, den: Box, }, /// N-ary operator (sum, integral, etc.) Nary { operator: String, sub: Option>, sup: Option>, base: Box, }, /// Delimiter (parentheses, brackets, etc.) Delimiter { content: Box }, /// Text run Text(String), /// Sequence of elements Sequence(Vec), } impl Equation { /// Parse OMML XML and convert to Unicode representation pub fn from_omml(omml: String) -> Result { let unicode = parse_omml_to_unicode(&omml)?; let fallback = extract_text_from_omml(&omml); Ok(Equation { omml, unicode, fallback, }) } } /// Extract plain text from OMML (for fallback display) fn extract_text_from_omml(omml: &str) -> String { let mut reader = Reader::from_str(omml); reader.config_mut().trim_text(true); let mut text = String::new(); let mut buf = Vec::new(); loop { match reader.read_event_into(&mut buf) { Ok(Event::Start(ref e)) if e.name().as_ref() == b"m:t" => { // Inside tag, capture text if let Ok(Event::Text(e)) = reader.read_event_into(&mut buf) { text.push_str(&e.unescape().unwrap_or_default()); } } Ok(Event::Eof) => break, Err(e) => { eprintln!("Error parsing OMML: {e}"); break; } _ => {} } buf.clear(); } text } /// Convert OMML XML to Unicode mathematical representation fn parse_omml_to_unicode(omml: &str) -> Result { let element = parse_omml_element(omml)?; Ok(render_to_unicode(&element)) } /// Parse OMML XML into structured elements fn parse_omml_element(xml: &str) -> Result { let mut reader = Reader::from_str(xml); reader.config_mut().trim_text(true); let mut buf = Vec::new(); let mut elements = Vec::new(); loop { match reader.read_event_into(&mut buf) { Ok(Event::Start(ref e)) => { let name_ref = e.name(); let tag_name = std::str::from_utf8(name_ref.as_ref()).unwrap_or(""); match tag_name { "m:sSup" => { // Parse superscript structure elements.push(parse_superscript(&mut reader)?); } "m:sSub" => { elements.push(parse_subscript(&mut reader)?); } "m:f" => { elements.push(parse_fraction(&mut reader)?); } "m:nary" => { elements.push(parse_nary(&mut reader)?); } "m:d" => { elements.push(parse_delimiter(&mut reader)?); } "m:r" => { elements.push(parse_run(&mut reader)?); } _ => {} } } Ok(Event::Eof) => break, Err(e) => anyhow::bail!("XML parsing error: {}", e), _ => {} } buf.clear(); } if elements.len() == 1 { Ok(elements.into_iter().next().unwrap()) } else { Ok(OmmlElement::Sequence(elements)) } } /// Parse superscript element fn parse_superscript(reader: &mut Reader<&[u8]>) -> Result { let mut base = None; let mut sup = None; let mut buf = Vec::new(); loop { match reader.read_event_into(&mut buf) { Ok(Event::Start(ref e)) => { let name_ref = e.name(); let tag = std::str::from_utf8(name_ref.as_ref()).unwrap_or(""); match tag { "m:e" => { let content = read_element_content(reader, "m:e")?; if base.is_none() { base = Some(parse_omml_element(&content)?); } } "m:sup" => { let content = read_element_content(reader, "m:sup")?; sup = Some(parse_omml_element(&content)?); } _ => {} } } Ok(Event::End(ref e)) if e.name().as_ref() == b"m:sSup" => break, Ok(Event::Eof) => break, Err(e) => anyhow::bail!("Superscript parse error: {}", e), _ => {} } buf.clear(); } Ok(OmmlElement::Superscript { base: Box::new(base.unwrap_or(OmmlElement::Text(String::new()))), sup: Box::new(sup.unwrap_or(OmmlElement::Text(String::new()))), }) } /// Parse subscript element fn parse_subscript(reader: &mut Reader<&[u8]>) -> Result { let mut base = None; let mut sub = None; let mut buf = Vec::new(); loop { match reader.read_event_into(&mut buf) { Ok(Event::Start(ref e)) => { let name_ref = e.name(); let tag = std::str::from_utf8(name_ref.as_ref()).unwrap_or(""); match tag { "m:e" => { let content = read_element_content(reader, "m:e")?; if base.is_none() { base = Some(parse_omml_element(&content)?); } } "m:sub" => { let content = read_element_content(reader, "m:sub")?; sub = Some(parse_omml_element(&content)?); } _ => {} } } Ok(Event::End(ref e)) if e.name().as_ref() == b"m:sSub" => break, Ok(Event::Eof) => break, Err(e) => anyhow::bail!("Subscript parse error: {}", e), _ => {} } buf.clear(); } Ok(OmmlElement::Subscript { base: Box::new(base.unwrap_or(OmmlElement::Text(String::new()))), sub: Box::new(sub.unwrap_or(OmmlElement::Text(String::new()))), }) } /// Parse fraction element fn parse_fraction(reader: &mut Reader<&[u8]>) -> Result { let mut num = None; let mut den = None; let mut buf = Vec::new(); loop { match reader.read_event_into(&mut buf) { Ok(Event::Start(ref e)) => { let name_ref = e.name(); let tag = std::str::from_utf8(name_ref.as_ref()).unwrap_or(""); match tag { "m:num" => { let content = read_element_content(reader, "m:num")?; num = Some(parse_omml_element(&content)?); } "m:den" => { let content = read_element_content(reader, "m:den")?; den = Some(parse_omml_element(&content)?); } _ => {} } } Ok(Event::End(ref e)) if e.name().as_ref() == b"m:f" => break, Ok(Event::Eof) => break, Err(e) => anyhow::bail!("Fraction parse error: {}", e), _ => {} } buf.clear(); } Ok(OmmlElement::Fraction { num: Box::new(num.unwrap_or(OmmlElement::Text(String::new()))), den: Box::new(den.unwrap_or(OmmlElement::Text(String::new()))), }) } /// Parse n-ary operator (sum, integral, product, etc.) fn parse_nary(reader: &mut Reader<&[u8]>) -> Result { let mut operator = String::from("∑"); // Default to summation let mut sub = None; let mut sup = None; let mut base = None; let mut buf = Vec::new(); loop { match reader.read_event_into(&mut buf) { Ok(Event::Start(ref e)) => { let name_ref = e.name(); let tag = std::str::from_utf8(name_ref.as_ref()).unwrap_or(""); match tag { "m:chr" => { // Extract operator character from attribute if let Some(a) = e .attributes() .flatten() .find(|a| a.key.as_ref() == b"m:val") { operator = String::from_utf8_lossy(&a.value).to_string(); } } "m:sub" => { let content = read_element_content(reader, "m:sub")?; sub = Some(parse_omml_element(&content)?); } "m:sup" => { let content = read_element_content(reader, "m:sup")?; sup = Some(parse_omml_element(&content)?); } "m:e" => { let content = read_element_content(reader, "m:e")?; base = Some(parse_omml_element(&content)?); } _ => {} } } Ok(Event::End(ref e)) if e.name().as_ref() == b"m:nary" => break, Ok(Event::Eof) => break, Err(e) => anyhow::bail!("Nary parse error: {}", e), _ => {} } buf.clear(); } Ok(OmmlElement::Nary { operator, sub: sub.map(Box::new), sup: sup.map(Box::new), base: Box::new(base.unwrap_or(OmmlElement::Text(String::new()))), }) } /// Parse delimiter (parentheses, brackets, etc.) fn parse_delimiter(reader: &mut Reader<&[u8]>) -> Result { let mut content = None; let mut buf = Vec::new(); loop { match reader.read_event_into(&mut buf) { Ok(Event::Start(ref e)) => { let name_ref = e.name(); let tag = std::str::from_utf8(name_ref.as_ref()).unwrap_or(""); if tag == "m:e" { let xml_content = read_element_content(reader, "m:e")?; content = Some(parse_omml_element(&xml_content)?); } } Ok(Event::End(ref e)) if e.name().as_ref() == b"m:d" => break, Ok(Event::Eof) => break, Err(e) => anyhow::bail!("Delimiter parse error: {}", e), _ => {} } buf.clear(); } Ok(OmmlElement::Delimiter { content: Box::new(content.unwrap_or(OmmlElement::Text(String::new()))), }) } /// Parse text run fn parse_run(reader: &mut Reader<&[u8]>) -> Result { let mut text = String::new(); let mut buf = Vec::new(); loop { match reader.read_event_into(&mut buf) { Ok(Event::Start(ref e)) if e.name().as_ref() == b"m:t" => { if let Ok(Event::Text(e)) = reader.read_event_into(&mut buf) { text.push_str(&e.unescape().unwrap_or_default()); } } Ok(Event::End(ref e)) if e.name().as_ref() == b"m:r" => break, Ok(Event::Eof) => break, Err(e) => anyhow::bail!("Run parse error: {}", e), _ => {} } buf.clear(); } Ok(OmmlElement::Text(text)) } /// Read content of an XML element as a string fn read_element_content(reader: &mut Reader<&[u8]>, end_tag: &str) -> Result { let mut content = String::new(); let mut buf = Vec::new(); let mut depth = 1; let end_tag_bytes = end_tag.as_bytes(); loop { match reader.read_event_into(&mut buf) { Ok(Event::Start(ref e)) => { content.push('<'); content.push_str(std::str::from_utf8(e.name().as_ref()).unwrap_or("")); for a in e.attributes().flatten() { content.push(' '); content.push_str(std::str::from_utf8(a.key.as_ref()).unwrap_or("")); content.push_str("=\""); content.push_str(&String::from_utf8_lossy(&a.value)); content.push('"'); } content.push('>'); depth += 1; } Ok(Event::End(ref e)) => { depth -= 1; if depth == 0 && e.name().as_ref() == end_tag_bytes { break; } content.push_str("'); } Ok(Event::Text(ref e)) => { content.push_str(&e.unescape().unwrap_or_default()); } Ok(Event::Eof) => break, Err(e) => anyhow::bail!("Element content read error: {}", e), _ => {} } buf.clear(); } Ok(content) } /// Render parsed OMML element to Unicode string fn render_to_unicode(element: &OmmlElement) -> String { match element { OmmlElement::Text(s) => s.clone(), OmmlElement::Sequence(elements) => elements.iter().map(render_to_unicode).collect(), OmmlElement::Superscript { base, sup } => { let base_str = render_to_unicode(base); let sup_str = render_to_unicode(sup); format!("{}{}", base_str, to_superscript(&sup_str)) } OmmlElement::Subscript { base, sub } => { let base_str = render_to_unicode(base); let sub_str = render_to_unicode(sub); format!("{}{}", base_str, to_subscript(&sub_str)) } OmmlElement::Fraction { num, den } => { let num_str = render_to_unicode(num); let den_str = render_to_unicode(den); // For simple single-char fractions, use Unicode fractions match (num_str.as_str(), den_str.as_str()) { ("1", "2") => "½".to_string(), ("1", "4") => "¼".to_string(), ("3", "4") => "¾".to_string(), ("1", "3") => "⅓".to_string(), ("2", "3") => "⅔".to_string(), ("1", "5") => "⅕".to_string(), ("1", "8") => "⅛".to_string(), _ => format!("({num_str}⁄{den_str})"), } } OmmlElement::Nary { operator, sub, sup, base, } => { let mut result = operator.clone(); if let Some(s) = sub { result.push_str(&to_subscript(&render_to_unicode(s))); } if let Some(s) = sup { result.push_str(&to_superscript(&render_to_unicode(s))); } result.push_str(&render_to_unicode(base)); result } OmmlElement::Delimiter { content } => { format!("({})", render_to_unicode(content)) } } } /// Convert ASCII text to Unicode superscript fn to_superscript(text: &str) -> String { text.chars() .map(|c| match c { '0' => '⁰', '1' => '¹', '2' => '²', '3' => '³', '4' => '⁴', '5' => '⁵', '6' => '⁶', '7' => '⁷', '8' => '⁸', '9' => '⁹', '+' => '⁺', '-' => '⁻', '=' => '⁼', '(' => '⁽', ')' => '⁾', 'n' => 'ⁿ', 'i' => 'ⁱ', _ => c, // Keep other characters as-is }) .collect() } /// Convert ASCII text to Unicode subscript fn to_subscript(text: &str) -> String { text.chars() .map(|c| match c { '0' => '₀', '1' => '₁', '2' => '₂', '3' => '₃', '4' => '₄', '5' => '₅', '6' => '₆', '7' => '₇', '8' => '₈', '9' => '₉', '+' => '₊', '-' => '₋', '=' => '₌', '(' => '₍', ')' => '₎', 'a' => 'ₐ', 'e' => 'ₑ', 'h' => 'ₕ', 'i' => 'ᵢ', 'j' => 'ⱼ', 'k' => 'ₖ', 'l' => 'ₗ', 'm' => 'ₘ', 'n' => 'ₙ', 'o' => 'ₒ', 'p' => 'ₚ', 'r' => 'ᵣ', 's' => 'ₛ', 't' => 'ₜ', 'u' => 'ᵤ', 'v' => 'ᵥ', 'x' => 'ₓ', _ => c, // Keep other characters as-is }) .collect() } #[cfg(test)] mod tests { use super::*; #[test] fn test_superscript_conversion() { assert_eq!(to_superscript("2"), "²"); assert_eq!(to_superscript("n"), "ⁿ"); assert_eq!(to_superscript("10"), "¹⁰"); } #[test] fn test_subscript_conversion() { assert_eq!(to_subscript("0"), "₀"); assert_eq!(to_subscript("k"), "ₖ"); assert_eq!(to_subscript("n-k"), "ₙ₋ₖ"); } #[test] fn test_simple_fraction() { let omml = r#"12"#; let eq = Equation::from_omml(omml.to_string()).unwrap(); assert_eq!(eq.unicode, "½"); } } doxx-0.1.4/src/export.rs000064400000000000000000000610441046102023000132730ustar 00000000000000use anyhow::Result; use crate::{ ansi::{export_to_ansi_with_options, AnsiOptions}, document::*, ColorDepth, ExportFormat, }; pub fn export_document(document: &Document, format: &ExportFormat) -> Result<()> { match format { ExportFormat::Markdown => export_to_markdown(document), ExportFormat::Text => export_to_text(document), ExportFormat::Csv => export_to_csv(document), ExportFormat::Json => export_to_json(document), ExportFormat::Ansi => export_to_ansi(document), } } pub fn format_as_markdown(document: &Document) -> String { let mut markdown = String::new(); // Add document title markdown.push_str(&format!("# {}\n\n", document.title)); // Add metadata markdown.push_str("## Document Information\n\n"); markdown.push_str(&format!("- **File**: {}\n", document.metadata.file_path)); markdown.push_str(&format!("- **Pages**: {}\n", document.metadata.page_count)); markdown.push_str(&format!("- **Words**: {}\n", document.metadata.word_count)); if let Some(author) = &document.metadata.author { markdown.push_str(&format!("- **Author**: {author}\n")); } markdown.push_str("\n---\n\n"); // Convert document content for element in &document.elements { match element { DocumentElement::Heading { level, text, number, } => { let prefix = "#".repeat(*level as usize); let heading_text = if let Some(number) = number { format!("{number} {text}") } else { text.clone() }; markdown.push_str(&format!("{prefix} {heading_text}\n\n")); } DocumentElement::Paragraph { runs } => { let mut paragraph_text = String::new(); for run in runs { let mut formatted_text = run.text.clone(); if run.formatting.bold { formatted_text = format!("**{formatted_text}**"); } if run.formatting.italic { formatted_text = format!("*{formatted_text}*"); } if run.formatting.strikethrough { formatted_text = format!("~~{formatted_text}~~"); } paragraph_text.push_str(&formatted_text); } markdown.push_str(&format!("{paragraph_text}\n\n")); } DocumentElement::List { items, ordered } => { for (i, item) in items.iter().enumerate() { let indent = " ".repeat(item.level as usize); let bullet = if *ordered { format!("{}. ", i + 1) } else { "- ".to_string() }; let mut item_text = String::new(); for run in &item.runs { let mut formatted_text = run.text.clone(); if run.formatting.bold { formatted_text = format!("**{formatted_text}**"); } if run.formatting.italic { formatted_text = format!("*{formatted_text}*"); } if run.formatting.strikethrough { formatted_text = format!("~~{formatted_text}~~"); } item_text.push_str(&formatted_text); } markdown.push_str(&format!("{indent}{bullet}{item_text}\n")); } markdown.push('\n'); } DocumentElement::Table { table } => { // Add table title if present if let Some(title) = &table.metadata.title { markdown.push_str(&format!("### {title}\n\n")); } // Markdown table header let header_content: Vec = table.headers.iter().map(|h| h.content.clone()).collect(); markdown.push_str(&format!("| {} |\n", header_content.join(" | "))); // Generate alignment indicators let alignment_row: Vec = table .metadata .column_alignments .iter() .map(|align| match align { TextAlignment::Left => ":---".to_string(), TextAlignment::Right => "---:".to_string(), TextAlignment::Center => ":---:".to_string(), TextAlignment::Justify => ":---".to_string(), }) .collect(); markdown.push_str(&format!("| {} |\n", alignment_row.join(" | "))); // Table rows for row in &table.rows { let row_content: Vec = row.iter().map(|cell| cell.content.clone()).collect(); markdown.push_str(&format!("| {} |\n", row_content.join(" | "))); } markdown.push('\n'); } DocumentElement::Image { description, width, height, image_path, .. } => { let alt = description; let url = image_path .as_ref() .map(|p| p.to_string_lossy().to_string()) .unwrap_or_else(|| description.clone()); let dimensions = match (width, height) { (Some(w), Some(h)) => format!(" "), _ => String::new(), }; markdown.push_str(&format!("![{alt}]({url}){dimensions}\n\n")); } DocumentElement::Equation { latex, .. } => { markdown.push_str(&format!("$${latex}$$\n\n")); } DocumentElement::CodeBlock { text } => { markdown.push_str("```\n"); markdown.push_str(text); if !text.ends_with('\n') { markdown.push('\n'); } markdown.push_str("```\n\n"); } DocumentElement::TextBox { lines } => { for line in lines { markdown.push_str(&format!("> {line}\n")); } markdown.push('\n'); } DocumentElement::PageBreak => { markdown.push_str("\n---\n\n"); } } } markdown } pub fn export_to_markdown(document: &Document) -> Result<()> { print!("{}", format_as_markdown(document)); Ok(()) } pub fn format_as_text(document: &Document) -> String { let mut text = String::new(); // Add document title text.push_str(&format!("{}\n", document.title)); text.push_str(&"=".repeat(document.title.len())); text.push_str("\n\n"); // Convert document content for element in &document.elements { match element { DocumentElement::Heading { level, text: heading_text, .. } => { let underline = match level { 1 => "=", 2 => "-", _ => "~", }; text.push_str(&format!("{heading_text}\n")); text.push_str(&underline.repeat(heading_text.len())); text.push_str("\n\n"); } DocumentElement::Paragraph { runs } => { let para_text: String = runs.iter().map(|run| run.text.as_str()).collect(); text.push_str(&format!("{para_text}\n\n")); } DocumentElement::List { items, ordered } => { for (i, item) in items.iter().enumerate() { let bullet = if *ordered { format!("{}. ", i + 1) } else { "* ".to_string() }; let indent = " ".repeat(item.level as usize); let item_text: String = item.runs.iter().map(|run| run.text.as_str()).collect(); text.push_str(&format!("{indent}{bullet}{item_text}\n")); } text.push('\n'); } DocumentElement::Table { table } => { // Add table title if present if let Some(title) = &table.metadata.title { text.push_str(&format!("{title}\n")); text.push_str(&"=".repeat(title.len())); text.push_str("\n\n"); } // Use the calculated column widths from metadata let col_widths = &table.metadata.column_widths; // Top border let top_border = generate_text_table_border(col_widths, "┌", "┬", "┐", "─"); text.push_str(&format!("{top_border}\n")); // Header with proper alignment let header_line = render_text_table_row(&table.headers, col_widths, true); text.push_str(&format!("{header_line}\n")); // Header separator let separator = generate_text_table_border(col_widths, "├", "┼", "┤", "─"); text.push_str(&format!("{separator}\n")); // Data rows for row in &table.rows { let row_line = render_text_table_row(row, col_widths, false); text.push_str(&format!("{row_line}\n")); } // Bottom border let bottom_border = generate_text_table_border(col_widths, "└", "┴", "┘", "─"); text.push_str(&format!("{bottom_border}\n")); text.push('\n'); } DocumentElement::PageBreak => { text.push_str("---\n\n"); } DocumentElement::Image { description, image_path, .. } => { // Try to render the image inline if available if let Some(path) = image_path { match crate::terminal_image::TerminalImageRenderer::with_options( document.image_options.max_width, document.image_options.max_height, document.image_options.scale, ) .render_image_from_path(path, description) { Ok(_) => { // Image displayed successfully, add spacing text.push('\n'); } Err(_) => { // Fallback to text description text.push_str(&format!("[Image: {description}]\n\n")); } } } else { text.push_str(&format!("[Image: {description}]\n\n")); } } DocumentElement::Equation { latex, .. } => { text.push_str(&format!("Equation: {latex}\n\n")); } DocumentElement::CodeBlock { text: code } => { text.push_str(code); if !code.ends_with('\n') { text.push('\n'); } text.push('\n'); } DocumentElement::TextBox { lines } => { let width = lines.iter().map(|s| s.len()).max().unwrap_or(0) + 2; let bar = "-".repeat(width); text.push_str(&format!("+{bar}+\n")); for line in lines { text.push_str(&format!("| {line: Result<()> { export_to_text_with_images(document); Ok(()) } fn export_to_text_with_images(document: &Document) { // Print title println!("{}\n", document.title); // Print metadata println!("Document Information:"); println!("- File: {}", document.metadata.file_path); println!("- Pages: {}", document.metadata.page_count); println!("- Words: {}", document.metadata.word_count); if let Some(author) = &document.metadata.author { println!("- Author: {author}"); } println!("\n{}\n", "=".repeat(50)); // Process elements in order, printing immediately for element in &document.elements { match element { DocumentElement::Heading { level, text, number, } => { let prefix = "#".repeat(*level as usize); let heading_text = if let Some(number) = number { format!("{number} {text}") } else { text.clone() }; println!("{prefix} {heading_text}\n"); } DocumentElement::Paragraph { runs } => { let mut paragraph_text = String::new(); for run in runs { let mut formatted_text = run.text.clone(); if run.formatting.bold { formatted_text = format!("**{formatted_text}**"); } if run.formatting.italic { formatted_text = format!("*{formatted_text}*"); } if run.formatting.underline { formatted_text = format!("_{formatted_text}_"); } if run.formatting.strikethrough { formatted_text = format!("~~{formatted_text}~~"); } paragraph_text.push_str(&formatted_text); } println!("{paragraph_text}\n"); } DocumentElement::List { items, .. } => { for item in items { let item_text: String = item.runs.iter().map(|run| run.text.as_str()).collect(); println!("- {item_text}"); } println!(); } DocumentElement::Table { table } => { // Simple table rendering for text export for row in &table.rows { let row_content: Vec = row.iter().map(|cell| cell.content.clone()).collect(); println!("| {} |", row_content.join(" | ")); } println!(); } DocumentElement::Image { description, image_path, .. } => { // Render image immediately in the correct position if let Some(path) = image_path { match crate::terminal_image::TerminalImageRenderer::with_options( document.image_options.max_width, document.image_options.max_height, document.image_options.scale, ) .render_image_from_path(path, description) { Ok(_) => { // Image displayed successfully, add spacing println!(); } Err(_) => { // Fallback to text description println!("[Image: {description}]\n"); } } } else { println!("[Image: {description}]\n"); } } DocumentElement::Equation { latex, .. } => { println!("Equation: {latex}\n"); } DocumentElement::CodeBlock { text } => { print!("{text}"); if !text.ends_with('\n') { println!(); } println!(); } DocumentElement::TextBox { lines } => { let width = lines.iter().map(|s| s.len()).max().unwrap_or(0) + 2; let bar = "-".repeat(width); println!("+{bar}+"); for line in lines { println!("| {line: { println!("{}\n", "-".repeat(50)); } } } } pub fn export_to_csv(document: &Document) -> Result<()> { let mut csv_output = Vec::new(); // Find all tables in the document for (table_index, element) in document.elements.iter().enumerate() { if let DocumentElement::Table { table } = element { if table_index > 0 { csv_output.push(String::new()); // Empty line between tables csv_output.push(format!("# Table {}", table_index + 1)); } // Add table title as comment if present if let Some(title) = &table.metadata.title { csv_output.push(format!("# {title}")); } // CSV header let header_line = table .headers .iter() .map(|h| escape_csv_field(&h.content)) .collect::>() .join(","); csv_output.push(header_line); // CSV rows for row in &table.rows { let row_line = row .iter() .map(|cell| escape_csv_field(&cell.content)) .collect::>() .join(","); csv_output.push(row_line); } } } if csv_output.is_empty() { println!("No tables found in document"); } else { for line in csv_output { println!("{line}"); } } Ok(()) } pub fn export_to_json(document: &Document) -> Result<()> { let json_output = serde_json::to_string_pretty(document)?; println!("{json_output}"); Ok(()) } #[allow(dead_code)] pub fn extract_citations(document: &Document) -> Result> { let mut citations = Vec::new(); // Simple citation extraction - look for common citation patterns for (index, element) in document.elements.iter().enumerate() { let text = match element { DocumentElement::Heading { text, .. } => text, DocumentElement::Paragraph { runs } => { &runs.iter().map(|run| run.text.as_str()).collect::() } _ => continue, }; // Look for citation patterns like (Author, Year) or [1] let citation_patterns = [ r"\([A-Z][a-z]+,\s*\d{4}\)", // (Author, 2024) r"\[[0-9]+\]", // [1] r"\([A-Z][a-z]+\s+et\s+al\.,\s*\d{4}\)", // (Author et al., 2024) ]; for pattern in &citation_patterns { if let Ok(regex) = regex::Regex::new(pattern) { for mat in regex.find_iter(text) { citations.push(Citation { text: mat.as_str().to_string(), element_index: index, citation_type: CitationType::InText, }); } } } } Ok(citations) } #[allow(dead_code)] pub fn extract_bibliography(document: &Document) -> Result> { let mut bibliography = Vec::new(); // Look for bibliography or references section for (index, element) in document.elements.iter().enumerate() { if let DocumentElement::Heading { text, .. } = element { if text.to_lowercase().contains("reference") || text.to_lowercase().contains("bibliography") || text.to_lowercase().contains("works cited") { // Process following elements as bibliography entries for (bib_index, bib_element) in document.elements[index + 1..].iter().enumerate() { match bib_element { DocumentElement::Paragraph { runs } => { let text: String = runs.iter().map(|run| run.text.as_str()).collect(); if !text.trim().is_empty() { bibliography.push(Citation { text: text.clone(), element_index: index + bib_index + 1, citation_type: CitationType::Bibliography, }); } } DocumentElement::List { items, .. } => { for item in items { let text: String = item.runs.iter().map(|run| run.text.as_str()).collect(); bibliography.push(Citation { text, element_index: index + bib_index + 1, citation_type: CitationType::Bibliography, }); } } DocumentElement::Heading { .. } => break, // Next section _ => {} } } break; } } } Ok(bibliography) } #[allow(dead_code)] #[derive(Debug, Clone)] pub struct Citation { pub text: String, pub element_index: usize, pub citation_type: CitationType, } #[allow(dead_code)] #[derive(Debug, Clone)] pub enum CitationType { InText, Bibliography, } fn escape_csv_field(field: &str) -> String { if field.contains(',') || field.contains('"') || field.contains('\n') { format!("\"{}\"", field.replace('"', "\"\"")) } else { field.to_string() } } // Helper functions for text table rendering fn generate_text_table_border( column_widths: &[usize], left: &str, middle: &str, right: &str, fill: &str, ) -> String { let mut border = String::new(); border.push_str(left); for (i, &width) in column_widths.iter().enumerate() { border.push_str(&fill.repeat(width + 2)); // +2 for padding if i < column_widths.len() - 1 { border.push_str(middle); } } border.push_str(right); border } fn render_text_table_row(cells: &[TableCell], column_widths: &[usize], _is_header: bool) -> String { let mut row = String::new(); row.push('│'); for (i, cell) in cells.iter().enumerate() { let width = column_widths.get(i).copied().unwrap_or(10); let aligned_content = align_text_cell_content(&cell.content, cell.alignment, width); row.push(' '); row.push_str(&aligned_content); row.push(' '); row.push('│'); } row } fn align_text_cell_content(content: &str, alignment: TextAlignment, width: usize) -> String { let trimmed = content.trim(); match alignment { TextAlignment::Left => format!("{trimmed: format!("{trimmed:>width$}"), TextAlignment::Center => { let padding = width.saturating_sub(trimmed.len()); let left_pad = padding / 2; let right_pad = padding - left_pad; format!( "{}{}{}", " ".repeat(left_pad), trimmed, " ".repeat(right_pad) ) } TextAlignment::Justify => { // For export, treat justify as left-aligned format!("{trimmed: Result<()> { let options = AnsiOptions::default(); let ansi_output = export_to_ansi_with_options(document, &options)?; print!("{ansi_output}"); Ok(()) } pub fn export_to_ansi_with_cli_options( document: &Document, terminal_width: Option, color_depth: &ColorDepth, ) -> Result<()> { let options = AnsiOptions { terminal_width: terminal_width.unwrap_or_else(|| { std::env::var("COLUMNS") .ok() .and_then(|s| s.parse().ok()) .unwrap_or(80) }), color_depth: color_depth.clone(), }; let ansi_output = export_to_ansi_with_options(document, &options)?; print!("{ansi_output}"); Ok(()) } doxx-0.1.4/src/image_extractor.rs000064400000000000000000000144371046102023000151330ustar 00000000000000use anyhow::Result; use std::collections::HashMap; use std::fs::{self, File}; use std::io::{Read, Write}; use std::path::{Path, PathBuf}; use zip::ZipArchive; // Type aliases to simplify complex return types type ImageList<'a> = Vec<(&'a String, &'a PathBuf)>; type ExtractedImages = Vec<(String, PathBuf)>; /// Manages extraction of images from DOCX files #[derive(Debug)] pub struct ImageExtractor { temp_dir: PathBuf, extracted_images: HashMap, // relationship_id -> temp_file_path } #[derive(Debug, Clone)] pub enum ImageFormat { Png, Jpeg, Gif, Bmp, Tiff, } impl ImageFormat { pub fn from_filename(filename: &str) -> Option { let extension = Path::new(filename).extension()?.to_str()?.to_lowercase(); match extension.as_str() { "png" => Some(Self::Png), "jpg" | "jpeg" => Some(Self::Jpeg), "gif" => Some(Self::Gif), "bmp" => Some(Self::Bmp), "tiff" | "tif" => Some(Self::Tiff), _ => None, } } pub fn to_extension(&self) -> &'static str { match self { Self::Png => "png", Self::Jpeg => "jpg", Self::Gif => "gif", Self::Bmp => "bmp", Self::Tiff => "tiff", } } } impl ImageExtractor { /// Create a new image extractor with a temporary directory pub fn new() -> Result { let temp_dir = std::env::temp_dir().join("doxx_images"); fs::create_dir_all(&temp_dir)?; Ok(Self { temp_dir, extracted_images: HashMap::new(), }) } /// Extract all images from a DOCX file pub fn extract_images_from_docx(&mut self, docx_path: &Path) -> Result<()> { let file = File::open(docx_path)?; let mut archive = ZipArchive::new(file)?; // Look for images in the word/media/ folder for i in 0..archive.len() { let mut file = archive.by_index(i)?; let outpath = file.name().to_string(); // Clone the name to avoid borrow issues // Check if this is an image file in the media folder if outpath.starts_with("word/media/") && self.is_image_file(&outpath) { let filename = Path::new(&outpath) .file_name() .and_then(|n| n.to_str()) .unwrap_or("unknown"); // Create a unique temp file path let temp_file_path = self.temp_dir.join(filename); // Read the image data let mut buffer = Vec::new(); file.read_to_end(&mut buffer)?; // Write to temp file let mut temp_file = File::create(&temp_file_path)?; temp_file.write_all(&buffer)?; // Store the mapping (we'll enhance this with proper relationship parsing later) let rel_id = filename.to_string(); // Simplified for now self.extracted_images.insert(rel_id, temp_file_path); } } println!( "Extracted {} images to {}", self.extracted_images.len(), self.temp_dir.display() ); Ok(()) } /// Get image data by relationship ID pub fn get_image_data(&self, rel_id: &str) -> Result> { if let Some(path) = self.extracted_images.get(rel_id) { Ok(fs::read(path)?) } else { anyhow::bail!("Image not found: {}", rel_id) } } /// Get the path to an extracted image pub fn get_image_path(&self, rel_id: &str) -> Option<&PathBuf> { self.extracted_images.get(rel_id) } /// List all extracted images pub fn list_images(&self) -> ImageList<'_> { self.extracted_images.iter().collect() } /// Get all extracted images as a vector of (rel_id, path) pairs pub fn get_extracted_images(&self) -> ExtractedImages { self.extracted_images .iter() .map(|(rel_id, path)| (rel_id.clone(), path.clone())) .collect() } /// Get all extracted images sorted by filename for consistent ordering pub fn get_extracted_images_sorted(&self) -> ExtractedImages { let mut images: ExtractedImages = self .extracted_images .iter() .map(|(rel_id, path)| (rel_id.clone(), path.clone())) .collect(); // Sort by filename to ensure consistent ordering images.sort_by(|a, b| a.0.cmp(&b.0)); images } /// Clean up temporary files pub fn cleanup(&self) -> Result<()> { if self.temp_dir.exists() { fs::remove_dir_all(&self.temp_dir)?; } Ok(()) } /// Check if a file is an image based on its extension fn is_image_file(&self, filename: &str) -> bool { ImageFormat::from_filename(filename).is_some() } } impl Drop for ImageExtractor { fn drop(&mut self) { // Don't automatically clean up temp files - let them persist // for the lifetime of the application. The OS will clean them up // when the temp directory is cleared, or users can manually clean up. // let _ = self.cleanup(); } } #[cfg(test)] mod tests { use super::*; #[test] fn test_image_format_detection() { assert!(matches!( ImageFormat::from_filename("image.png"), Some(ImageFormat::Png) )); assert!(matches!( ImageFormat::from_filename("photo.jpg"), Some(ImageFormat::Jpeg) )); assert!(matches!( ImageFormat::from_filename("photo.jpeg"), Some(ImageFormat::Jpeg) )); assert!(matches!( ImageFormat::from_filename("animation.gif"), Some(ImageFormat::Gif) )); assert!(matches!( ImageFormat::from_filename("bitmap.bmp"), Some(ImageFormat::Bmp) )); assert!(matches!( ImageFormat::from_filename("scan.tiff"), Some(ImageFormat::Tiff) )); assert!(ImageFormat::from_filename("document.txt").is_none()); } #[test] fn test_image_extractor_creation() { let extractor = ImageExtractor::new().unwrap(); assert!(extractor.temp_dir.exists()); assert!(extractor.extracted_images.is_empty()); } } doxx-0.1.4/src/keymap/actions.rs000064400000000000000000000034631046102023000147010ustar 00000000000000use std::str::FromStr; #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] pub enum Action { // Navigation ScrollUp, ScrollDown, PageUp, PageDown, HalfPageUp, HalfPageDown, GotoStart, GotoEnd, // View switching ToggleOutline, EnterSearch, ToggleHelp, ToggleSearchState, // Search navigation (active when results exist) SearchNext, SearchPrevious, // Actions Copy, Quit, Escape, // Outline-specific OutlineSelect, // Search-mode input SearchDeleteChar, SearchSubmit, } impl FromStr for Action { type Err = anyhow::Error; fn from_str(s: &str) -> Result { match s { "scroll_up" => Ok(Action::ScrollUp), "scroll_down" => Ok(Action::ScrollDown), "page_up" => Ok(Action::PageUp), "page_down" => Ok(Action::PageDown), "half_page_up" => Ok(Action::HalfPageUp), "half_page_down" => Ok(Action::HalfPageDown), "goto_start" => Ok(Action::GotoStart), "goto_end" => Ok(Action::GotoEnd), "toggle_outline" => Ok(Action::ToggleOutline), "search" => Ok(Action::EnterSearch), "toggle_help" => Ok(Action::ToggleHelp), "toggle_search_state" => Ok(Action::ToggleSearchState), "search_next" => Ok(Action::SearchNext), "search_previous" => Ok(Action::SearchPrevious), "copy" => Ok(Action::Copy), "quit" => Ok(Action::Quit), "escape" => Ok(Action::Escape), "outline_select" => Ok(Action::OutlineSelect), "search_delete_char" => Ok(Action::SearchDeleteChar), "search_submit" => Ok(Action::SearchSubmit), other => anyhow::bail!("Unknown action: {other}"), } } } doxx-0.1.4/src/keymap/bindings.rs000064400000000000000000000123121046102023000150270ustar 00000000000000use anyhow::{bail, Result}; use crossterm::event::{KeyCode, KeyModifiers}; #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct KeyBinding { pub code: KeyCode, pub modifiers: KeyModifiers, } impl KeyBinding { pub fn new(code: KeyCode, modifiers: KeyModifiers) -> Self { Self { code, modifiers } } pub fn char(c: char) -> Self { Self::new(KeyCode::Char(c), KeyModifiers::NONE) } pub fn ctrl(c: char) -> Self { Self::new(KeyCode::Char(c), KeyModifiers::CONTROL) } /// Parse a key binding from a string like "ctrl-d", "shift-h", "/", "enter", "esc". pub fn parse_key(s: &str) -> Result { let s = s.trim().to_lowercase(); let parts: Vec<&str> = s.splitn(2, '-').collect(); match parts.as_slice() { ["ctrl", rest] => { let c = parse_single_char(rest)?; Ok(Self::ctrl(c)) } ["shift", rest] => { let c = parse_single_char(rest)?; Ok(Self::new( KeyCode::Char(c.to_ascii_uppercase()), KeyModifiers::NONE, )) } [single] => { // Special key names match *single { "enter" => Ok(Self::new(KeyCode::Enter, KeyModifiers::NONE)), "esc" | "escape" => Ok(Self::new(KeyCode::Esc, KeyModifiers::NONE)), "backspace" => Ok(Self::new(KeyCode::Backspace, KeyModifiers::NONE)), "tab" => Ok(Self::new(KeyCode::Tab, KeyModifiers::NONE)), "up" => Ok(Self::new(KeyCode::Up, KeyModifiers::NONE)), "down" => Ok(Self::new(KeyCode::Down, KeyModifiers::NONE)), "left" => Ok(Self::new(KeyCode::Left, KeyModifiers::NONE)), "right" => Ok(Self::new(KeyCode::Right, KeyModifiers::NONE)), "pageup" | "pgup" => Ok(Self::new(KeyCode::PageUp, KeyModifiers::NONE)), "pagedown" | "pgdn" => Ok(Self::new(KeyCode::PageDown, KeyModifiers::NONE)), "home" => Ok(Self::new(KeyCode::Home, KeyModifiers::NONE)), "end" => Ok(Self::new(KeyCode::End, KeyModifiers::NONE)), "f1" => Ok(Self::new(KeyCode::F(1), KeyModifiers::NONE)), "f2" => Ok(Self::new(KeyCode::F(2), KeyModifiers::NONE)), other => { // Use original case for char lookup (avoid lowercasing 'N' → 'n') let original = s.as_str(); let c = parse_single_char(original)?; let _ = other; // suppress unused warning Ok(Self::char(c)) } } } _ => bail!("Cannot parse key binding: {s}"), } } } impl KeyBinding { pub fn display(&self) -> String { let key = match &self.code { KeyCode::Char(c) => c.to_string(), KeyCode::Up => "↑".to_string(), KeyCode::Down => "↓".to_string(), KeyCode::Left => "←".to_string(), KeyCode::Right => "→".to_string(), KeyCode::PageUp => "PgUp".to_string(), KeyCode::PageDown => "PgDn".to_string(), KeyCode::Home => "Home".to_string(), KeyCode::End => "End".to_string(), KeyCode::Enter => "Enter".to_string(), KeyCode::Esc => "Esc".to_string(), KeyCode::Backspace => "Backspace".to_string(), KeyCode::Tab => "Tab".to_string(), KeyCode::F(n) => format!("F{n}"), _ => "?".to_string(), }; if self.modifiers.contains(KeyModifiers::CONTROL) { format!("ctrl-{key}") } else { key } } pub(super) fn sort_priority(&self) -> u8 { match &self.code { KeyCode::Char(_) if self.modifiers == KeyModifiers::NONE => 0, KeyCode::Up | KeyCode::Down | KeyCode::PageUp | KeyCode::PageDown | KeyCode::Home | KeyCode::End | KeyCode::F(_) => 1, _ => 2, } } } fn parse_single_char(s: &str) -> Result { let mut chars = s.chars(); let c = chars .next() .ok_or_else(|| anyhow::anyhow!("Empty key string"))?; if chars.next().is_some() { bail!("Expected single character, got: {s}"); } Ok(c) } #[cfg(test)] mod tests { use super::*; use crossterm::event::KeyCode; #[test] fn test_parse_ctrl() { let b = KeyBinding::parse_key("ctrl-d").unwrap(); assert_eq!(b.code, KeyCode::Char('d')); assert_eq!(b.modifiers, KeyModifiers::CONTROL); } #[test] fn test_parse_char() { let b = KeyBinding::parse_key("q").unwrap(); assert_eq!(b.code, KeyCode::Char('q')); assert_eq!(b.modifiers, KeyModifiers::NONE); } #[test] fn test_parse_special_keys() { assert_eq!(KeyBinding::parse_key("enter").unwrap().code, KeyCode::Enter); assert_eq!(KeyBinding::parse_key("esc").unwrap().code, KeyCode::Esc); assert_eq!(KeyBinding::parse_key("up").unwrap().code, KeyCode::Up); } } doxx-0.1.4/src/keymap/mod.rs000064400000000000000000000052771046102023000140250ustar 00000000000000pub mod actions; pub mod bindings; pub mod presets; use std::collections::HashMap; pub use actions::Action; pub use bindings::KeyBinding; pub use presets::KeymapPreset; pub struct Keymap { bindings: HashMap, } impl Keymap { pub fn from_preset(preset: KeymapPreset) -> Self { Self { bindings: presets::create_keymap(preset), } } pub fn bind(&mut self, key: KeyBinding, action: Action) { self.bindings.insert(key, action); } pub fn get_action(&self, key: &KeyBinding) -> Option { self.bindings.get(key).copied() } /// Returns all key strings bound to `action`, sorted: plain chars first, then /// special keys, then modifier combos. pub fn keys_for_action(&self, action: Action) -> Vec { let mut bindings: Vec<&KeyBinding> = self .bindings .iter() .filter(|(_, a)| **a == action) .map(|(k, _)| k) .collect(); bindings.sort_by_key(|k| (k.sort_priority(), k.display())); bindings.iter().map(|k| k.display()).collect() } /// Returns the single "best" key string for `action` (first after sorting). pub fn primary_key_for_action(&self, action: Action) -> String { self.keys_for_action(action) .into_iter() .next() .unwrap_or_else(|| "(unbound)".to_string()) } } impl Default for Keymap { fn default() -> Self { Self::from_preset(KeymapPreset::Default) } } #[cfg(test)] mod tests { use super::*; #[test] fn test_default_keymap() { let km = Keymap::default(); assert_eq!(km.get_action(&KeyBinding::char('q')), Some(Action::Quit)); assert_eq!( km.get_action(&KeyBinding::char('s')), Some(Action::EnterSearch) ); } #[test] fn test_vim_preset() { let km = Keymap::from_preset(KeymapPreset::Vim); assert_eq!( km.get_action(&KeyBinding::char('/')), Some(Action::EnterSearch) ); assert_eq!( km.get_action(&KeyBinding::ctrl('d')), Some(Action::HalfPageDown) ); assert_eq!( km.get_action(&KeyBinding::ctrl('u')), Some(Action::HalfPageUp) ); assert_eq!( km.get_action(&KeyBinding::char('N')), Some(Action::SearchPrevious) ); } #[test] fn test_custom_override() { let mut km = Keymap::from_preset(KeymapPreset::Default); km.bind(KeyBinding::char('s'), Action::ToggleHelp); assert_eq!( km.get_action(&KeyBinding::char('s')), Some(Action::ToggleHelp) ); } } doxx-0.1.4/src/keymap/presets.rs000064400000000000000000000102411046102023000147160ustar 00000000000000use std::collections::HashMap; use crossterm::event::{KeyCode, KeyModifiers}; use super::{actions::Action, bindings::KeyBinding}; #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum KeymapPreset { Default, Vim, Less, } pub fn create_keymap(preset: KeymapPreset) -> HashMap { match preset { KeymapPreset::Default => create_default(), KeymapPreset::Vim => create_vim(), KeymapPreset::Less => create_less(), } } fn create_default() -> HashMap { let mut m = HashMap::new(); // Navigation m.insert(KeyBinding::char('k'), Action::ScrollUp); m.insert( KeyBinding::new(KeyCode::Up, KeyModifiers::NONE), Action::ScrollUp, ); m.insert(KeyBinding::char('j'), Action::ScrollDown); m.insert( KeyBinding::new(KeyCode::Down, KeyModifiers::NONE), Action::ScrollDown, ); m.insert( KeyBinding::new(KeyCode::PageUp, KeyModifiers::NONE), Action::PageUp, ); m.insert( KeyBinding::new(KeyCode::PageDown, KeyModifiers::NONE), Action::PageDown, ); m.insert( KeyBinding::new(KeyCode::Home, KeyModifiers::NONE), Action::GotoStart, ); m.insert( KeyBinding::new(KeyCode::End, KeyModifiers::NONE), Action::GotoEnd, ); // View switching m.insert(KeyBinding::char('o'), Action::ToggleOutline); m.insert(KeyBinding::char('s'), Action::EnterSearch); m.insert(KeyBinding::char('S'), Action::ToggleSearchState); m.insert(KeyBinding::char('h'), Action::ToggleHelp); m.insert( KeyBinding::new(KeyCode::F(1), KeyModifiers::NONE), Action::ToggleHelp, ); // Search navigation m.insert(KeyBinding::char('n'), Action::SearchNext); m.insert(KeyBinding::char('p'), Action::SearchPrevious); // Actions m.insert(KeyBinding::char('c'), Action::Copy); m.insert(KeyBinding::char('q'), Action::Quit); m.insert( KeyBinding::new(KeyCode::Esc, KeyModifiers::NONE), Action::Escape, ); m.insert( KeyBinding::new(KeyCode::Enter, KeyModifiers::NONE), Action::OutlineSelect, ); // Search-mode input helpers (used in search mode) m.insert( KeyBinding::new(KeyCode::Backspace, KeyModifiers::NONE), Action::SearchDeleteChar, ); m.insert( KeyBinding::new(KeyCode::F(2), KeyModifiers::NONE), Action::Copy, ); m } fn create_vim() -> HashMap { let mut m = create_default(); // Half-page navigation m.insert(KeyBinding::char('u'), Action::HalfPageUp); m.insert(KeyBinding::ctrl('u'), Action::HalfPageUp); m.insert(KeyBinding::char('d'), Action::HalfPageDown); m.insert(KeyBinding::ctrl('d'), Action::HalfPageDown); // Home/End aliases m.insert(KeyBinding::char('H'), Action::GotoStart); m.insert(KeyBinding::char('L'), Action::GotoEnd); m.insert(KeyBinding::char('g'), Action::GotoStart); m.insert(KeyBinding::char('G'), Action::GotoEnd); // / for search (vim-style), N for previous; remove default 's' and 'p' bindings m.insert(KeyBinding::char('/'), Action::EnterSearch); m.insert(KeyBinding::char('N'), Action::SearchPrevious); m.remove(&KeyBinding::char('s')); m.remove(&KeyBinding::char('p')); m } fn create_less() -> HashMap { let mut m = create_default(); // / for search; remove default 's' and 'p' bindings m.insert(KeyBinding::char('/'), Action::EnterSearch); m.insert(KeyBinding::char('N'), Action::SearchPrevious); m.remove(&KeyBinding::char('s')); m.remove(&KeyBinding::char('p')); // Half-page navigation m.insert(KeyBinding::char('u'), Action::HalfPageUp); m.insert(KeyBinding::ctrl('u'), Action::HalfPageUp); m.insert(KeyBinding::char('d'), Action::HalfPageDown); m.insert(KeyBinding::ctrl('d'), Action::HalfPageDown); // less uses g/G for start/end, space for page down, b for page up m.insert(KeyBinding::char('g'), Action::GotoStart); m.insert(KeyBinding::char('G'), Action::GotoEnd); m.insert(KeyBinding::char('b'), Action::PageUp); m.insert(KeyBinding::char(' '), Action::PageDown); m } doxx-0.1.4/src/lib.rs000064400000000000000000000022031046102023000125100ustar 00000000000000//! doxx: Terminal document viewer for .docx files //! //! This library provides functionality for parsing Microsoft Word documents //! and displaying them in terminal environments with rich formatting support. pub mod ansi; pub mod config; pub mod document; pub mod equation; pub mod export; pub mod image_extractor; pub mod keymap; pub mod terminal_image; pub mod widgets; /// Export format options #[derive(clap::ValueEnum, Clone)] pub enum ExportFormat { Markdown, Text, Csv, Json, Ansi, } /// Color depth options for ANSI export #[derive(clap::ValueEnum, Clone, Debug)] pub enum ColorDepth { /// Auto-detect terminal color capabilities Auto, /// Monochrome (no colors) #[value(name = "1")] Monochrome, /// 16 colors #[value(name = "4")] Standard, /// 256 colors #[value(name = "8")] Extended, /// 24-bit true color #[value(name = "24")] TrueColor, } // Re-export commonly used types pub use document::{Document, DocumentElement}; pub use equation::Equation; pub use image_extractor::ImageExtractor; pub use terminal_image::{TerminalImageRenderer, TerminalImageSupport}; doxx-0.1.4/src/main.rs000064400000000000000000000134311046102023000126730ustar 00000000000000use anyhow::Result; use clap::{Parser, Subcommand}; use std::path::PathBuf; use doxx::{ColorDepth, ExportFormat}; mod ansi; mod config; mod document; mod export; pub mod image_extractor; mod keymap; mod state; pub mod terminal_image; mod ui; mod widgets; #[derive(Parser)] #[command( name = "doxx", version, about = "Terminal document viewer for .docx files", long_about = "Beautiful .docx viewing in your terminal" )] struct Cli { /// Input document file (.docx) #[arg(value_name = "FILE")] file: Option, /// Start with outline view #[arg(short, long)] outline: bool, /// Jump to specific page #[arg(short, long)] page: Option, /// Search and highlight term #[arg(short, long)] search: Option, /// Export format #[arg(long, value_enum)] export: Option, /// Terminal width for ANSI export (default: $COLUMNS or 80) #[arg(short = 'w', long, value_name = "COLS")] terminal_width: Option, /// Color depth for ANSI export #[arg(long, value_enum, default_value = "auto")] color_depth: ColorDepth, /// Force interactive UI mode (bypass TTY detection) #[arg(long)] force_ui: bool, /// Enable color support for text rendering #[arg(long)] color: bool, /// Restore last saved scroll position for this document #[arg(short = 'r', long)] restore_position: bool, /// Display images inline in terminal (auto-detect capabilities) #[arg(long)] images: bool, /// Force text-only mode for images (no inline display) #[arg(long)] no_images: bool, /// Extract images to a directory #[arg(long)] extract_images: Option, /// Maximum image width in terminal columns (default: auto-detect) #[arg(long, value_name = "COLS")] image_width: Option, /// Maximum image height in terminal rows (default: auto-detect) #[arg(long, value_name = "ROWS")] image_height: Option, /// Image scaling factor (0.1 to 2.0, default: 1.0) #[arg(long, value_name = "SCALE")] image_scale: Option, /// Test terminal image capabilities #[arg(long)] debug_terminal: bool, /// Configuration commands #[command(subcommand)] config: Option, } #[derive(Subcommand)] enum ConfigCommands { /// Set configuration value Set { key: String, value: String }, /// Get configuration value Get { key: String }, /// Initialize configuration Init, } #[tokio::main] async fn main() -> Result<()> { let cli = Cli::parse(); // Handle debug terminal command if cli.debug_terminal { use terminal_image::TerminalImageRenderer; let renderer = TerminalImageRenderer::new(); renderer.print_capabilities(); return Ok(()); } match &cli.config { Some(ConfigCommands::Init) => { let cfg = config::Config::default(); cfg.save()?; println!( "Configuration initialized at: {}", config::Config::config_file_path()?.display() ); println!("Edit that file to customize keybindings. Valid presets: default, vim, less"); return Ok(()); } Some(ConfigCommands::Set { key, value }) => { let mut cfg = config::Config::load()?; cfg.set_value(key, value)?; cfg.save()?; println!("{key} = {value}"); return Ok(()); } Some(ConfigCommands::Get { key }) => { let cfg = config::Config::load()?; match cfg.get_value(key) { Some(v) => println!("{v}"), None => anyhow::bail!("Unknown config key: {key}"), } return Ok(()); } None => {} } let cfg = config::Config::load()?; let file_path = cli .file .clone() .ok_or_else(|| anyhow::anyhow!("Please provide a document file to view"))?; if !file_path.exists() { anyhow::bail!("File not found: {}", file_path.display()); } let image_options = document::ImageOptions { enabled: cli.images, max_width: cli.image_width, max_height: cli.image_height, scale: cli.image_scale, }; // Run CPU-intensive document loading on a blocking thread let file_path_clone = file_path.clone(); let document = tokio::task::spawn_blocking(move || { document::load_document(&file_path_clone, image_options) }) .await??; // Handle image extraction flag if let Some(extract_dir) = &cli.extract_images { use image_extractor::ImageExtractor; let mut extractor = ImageExtractor::new()?; extractor.extract_images_from_docx(&file_path)?; // Copy extracted images to the specified directory std::fs::create_dir_all(extract_dir)?; for (rel_id, temp_path) in extractor.list_images() { let target_path = extract_dir.join(rel_id); std::fs::copy(temp_path, &target_path)?; println!("Extracted: {}", target_path.display()); } println!( "Successfully extracted {} images to {}", extractor.list_images().len(), extract_dir.display() ); return Ok(()); } if let Some(export_format) = &cli.export { match export_format { ExportFormat::Ansi => { export::export_to_ansi_with_cli_options( &document, cli.terminal_width, &cli.color_depth, )?; } _ => { export::export_document(&document, export_format)?; } } return Ok(()); } // Start terminal UI ui::run_viewer(document, &cli, &cfg).await?; Ok(()) } doxx-0.1.4/src/state.rs000064400000000000000000000132111046102023000130630ustar 00000000000000//! Document state persistence //! //! This module handles saving and loading document state (scroll position, search, view mode) //! across sessions. State is stored in a platform-specific config directory. use anyhow::{Context, Result}; use serde::{Deserialize, Serialize}; use std::{ collections::HashMap, fs, path::{Path, PathBuf}, time::{Duration, SystemTime}, }; use crate::ui::ViewMode; /// State for a single document #[derive(Debug, Clone, Serialize, Deserialize)] pub struct DocumentState { /// Last scroll position (element index) pub scroll_offset: usize, /// Last search query pub last_search: String, /// Last view mode (Document, Outline, Search) #[serde(skip)] pub view_mode: ViewMode, /// When this document was last accessed #[serde(default = "SystemTime::now")] pub last_accessed: SystemTime, } impl Default for DocumentState { fn default() -> Self { Self { scroll_offset: 0, last_search: String::new(), view_mode: ViewMode::Document, last_accessed: SystemTime::now(), } } } /// Global state manager for all documents #[derive(Debug, Serialize, Deserialize)] pub struct StateManager { /// Map of absolute file paths to their state documents: HashMap, } impl StateManager { /// Create a new empty state manager pub fn new() -> Self { Self { documents: HashMap::new(), } } /// Load state from disk, or create new if doesn't exist pub fn load() -> Result { let state_path = Self::state_file_path()?; if !state_path.exists() { return Ok(Self::new()); } let contents = fs::read_to_string(&state_path).context("Failed to read state file")?; let mut manager: StateManager = serde_json::from_str(&contents).context("Failed to parse state file")?; // Clean up old entries (older than 90 days) manager.cleanup_old_entries(Duration::from_secs(90 * 24 * 60 * 60)); Ok(manager) } /// Save state to disk pub fn save(&self) -> Result<()> { let state_path = Self::state_file_path()?; // Create parent directory if it doesn't exist if let Some(parent) = state_path.parent() { fs::create_dir_all(parent).context("Failed to create state directory")?; } let contents = serde_json::to_string_pretty(self).context("Failed to serialize state")?; fs::write(&state_path, contents).context("Failed to write state file")?; Ok(()) } /// Get state for a document pub fn get_state(&self, file_path: &Path) -> Option { let key = file_path.to_string_lossy().to_string(); self.documents.get(&key).cloned() } /// Update state for a document pub fn set_state(&mut self, file_path: &Path, state: DocumentState) { let key = file_path.to_string_lossy().to_string(); self.documents.insert(key, state); } /// Remove old entries that haven't been accessed recently fn cleanup_old_entries(&mut self, max_age: Duration) { let now = SystemTime::now(); self.documents.retain(|_, state| { now.duration_since(state.last_accessed) .map(|age| age < max_age) .unwrap_or(false) }); } /// Get the platform-specific state file path /// /// Returns: /// - macOS: ~/Library/Application Support/doxx/state.json /// - Linux: ~/.config/doxx/state.json /// - Windows: %APPDATA%\doxx\state.json fn state_file_path() -> Result { let config_dir = dirs::config_dir().context("Failed to determine config directory")?; Ok(config_dir.join("doxx").join("state.json")) } } impl Default for StateManager { fn default() -> Self { Self::new() } } #[cfg(test)] mod tests { use super::*; #[test] fn test_state_manager_new() { let manager = StateManager::new(); assert_eq!(manager.documents.len(), 0); } #[test] fn test_set_and_get_state() { let mut manager = StateManager::new(); let path = PathBuf::from("/test/document.docx"); let state = DocumentState { scroll_offset: 42, last_search: "test".to_string(), view_mode: ViewMode::Search, last_accessed: SystemTime::now(), }; manager.set_state(&path, state.clone()); let retrieved = manager.get_state(&path).unwrap(); assert_eq!(retrieved.scroll_offset, 42); assert_eq!(retrieved.last_search, "test"); } #[test] fn test_cleanup_old_entries() { let mut manager = StateManager::new(); let path = PathBuf::from("/test/old.docx"); // Create a state with an old timestamp let old_time = SystemTime::now() - Duration::from_secs(100 * 24 * 60 * 60); // 100 days ago let state = DocumentState { scroll_offset: 0, last_search: String::new(), view_mode: ViewMode::Document, last_accessed: old_time, }; manager.set_state(&path, state); assert_eq!(manager.documents.len(), 1); // Clean up entries older than 90 days manager.cleanup_old_entries(Duration::from_secs(90 * 24 * 60 * 60)); // Old entry should be removed assert_eq!(manager.documents.len(), 0); } #[test] fn test_state_file_path_returns_path() { let path = StateManager::state_file_path(); assert!(path.is_ok()); let path = path.unwrap(); assert!(path.ends_with("doxx/state.json") || path.ends_with("doxx\\state.json")); } } doxx-0.1.4/src/terminal_image.rs000064400000000000000000000242411046102023000147250ustar 00000000000000use anyhow::Result; use std::path::Path; /// Terminal image display capabilities #[derive(Debug, Clone, Copy, PartialEq)] pub enum TerminalImageSupport { Kitty, // Kitty graphics protocol ITerm2, // iTerm2 graphics protocol Sixel, // Sixel graphics HalfBlocks, // Unicode half-block fallback None, // Text description only } /// Handles display of images in the terminal using various protocols #[derive(Debug)] pub struct TerminalImageRenderer { support: TerminalImageSupport, max_width: u32, max_height: u32, } impl TerminalImageRenderer { /// Create a new terminal image renderer with auto-detected capabilities pub fn new() -> Self { let support = Self::detect_capabilities(); let (max_width, max_height) = Self::get_terminal_size(); Self { support, max_width, max_height, } } /// Create a new terminal image renderer with custom size limits pub fn with_size_limits(max_width: Option, max_height: Option) -> Self { let support = Self::detect_capabilities(); let (default_width, default_height) = Self::get_terminal_size(); Self { support, max_width: max_width.unwrap_or(default_width), max_height: max_height.unwrap_or(default_height), } } /// Create a new terminal image renderer with custom size limits and scaling pub fn with_options( max_width: Option, max_height: Option, scale: Option, ) -> Self { let support = Self::detect_capabilities(); let (default_width, default_height) = Self::get_terminal_size(); let scale_factor = scale.unwrap_or(1.0).clamp(0.1, 2.0); // Clamp between 0.1 and 2.0 let scaled_width = max_width.unwrap_or(default_width); let scaled_height = max_height.unwrap_or(default_height); Self { support, max_width: ((scaled_width as f32) * scale_factor) as u32, max_height: ((scaled_height as f32) * scale_factor) as u32, } } /// Create a renderer with specific capabilities (for testing) pub fn with_support(support: TerminalImageSupport) -> Self { let (max_width, max_height) = Self::get_terminal_size(); Self { support, max_width, max_height, } } /// Detect terminal image display capabilities pub fn detect_capabilities() -> TerminalImageSupport { // Check for WezTerm FIRST - it supports Kitty protocol if let Ok(term_program) = std::env::var("TERM_PROGRAM") { if term_program == "WezTerm" { return TerminalImageSupport::Kitty; } } // Check for iTerm2 (this function exists) if viuer::is_iterm_supported() { return TerminalImageSupport::ITerm2; } // Sixel support disabled for now to avoid linking issues // Will re-enable after fixing dependencies // Check terminal type for Kitty support if let Ok(term) = std::env::var("TERM") { match term.as_str() { "xterm-kitty" => TerminalImageSupport::Kitty, "wezterm" => TerminalImageSupport::Kitty, "screen" | "screen-256color" => { // Screen/tmux might support passthrough TerminalImageSupport::HalfBlocks } _ => TerminalImageSupport::HalfBlocks, } } else { TerminalImageSupport::HalfBlocks } } /// Get the current support level pub fn support(&self) -> TerminalImageSupport { self.support } /// Check if we can display images inline pub fn can_display_images(&self) -> bool { !matches!(self.support, TerminalImageSupport::None) } /// Render an image from a file path pub fn render_image_from_path(&self, image_path: &Path, description: &str) -> Result<()> { match self.support { TerminalImageSupport::None => { println!("📷 Image: {description}"); Ok(()) } _ => { let display_path = image_path.to_path_buf(); // Use viuer to display the image with appropriate protocol let mut conf = viuer::Config { transparent: true, absolute_offset: false, width: Some(self.max_width.min(80)), // Limit width to 80 columns height: Some(self.max_height.min(24)), // Limit height to 24 rows ..Default::default() }; // Set protocol based on terminal capability match self.support { TerminalImageSupport::Kitty => { conf.use_kitty = true; conf.use_iterm = false; } TerminalImageSupport::ITerm2 => { conf.use_kitty = false; conf.use_iterm = true; } _ => {} } match viuer::print_from_file(&display_path, &conf) { Ok(_) => { // Print description after the image if !description.is_empty() { println!("📷 {description}"); } Ok(()) } Err(e) => { // Fallback to text description if image display fails println!("📷 Image: {description} (display failed: {e})"); Ok(()) } } } } } /// Render an image from raw bytes pub fn render_image_from_bytes(&self, image_data: &[u8], description: &str) -> Result<()> { match self.support { TerminalImageSupport::None => { println!("📷 Image: {description}"); Ok(()) } _ => { let mut conf = viuer::Config { transparent: true, absolute_offset: false, width: Some(self.max_width.min(80)), height: Some(self.max_height.min(24)), ..Default::default() }; // Set protocol based on terminal capability match self.support { TerminalImageSupport::Kitty => { conf.use_kitty = true; conf.use_iterm = false; } TerminalImageSupport::ITerm2 => { conf.use_kitty = false; conf.use_iterm = true; } _ => {} } // Create a temporary file for viuer (it needs a file path) let temp_path = std::env::temp_dir().join("doxx_temp_image.png"); std::fs::write(&temp_path, image_data)?; match viuer::print_from_file(&temp_path, &conf) { Ok(_) => { // Clean up temp file let _ = std::fs::remove_file(&temp_path); if !description.is_empty() { println!("📷 {description}"); } Ok(()) } Err(e) => { println!("📷 Image: {description} (display failed: {e})"); Ok(()) } } } } } /// Get terminal size for image scaling fn get_terminal_size() -> (u32, u32) { // Try to get terminal size from crossterm if let Ok((width, height)) = crossterm::terminal::size() { (width as u32, height as u32) } else { // Fallback to reasonable defaults (80, 24) } } /// Print capabilities information for debugging pub fn print_capabilities(&self) { println!("=== Terminal Image Debug Information ==="); println!("Detected support: {:?}", self.support); println!("Max dimensions: {}x{}", self.max_width, self.max_height); println!("Can display images: {}", self.can_display_images()); // Environment variables if let Ok(term) = std::env::var("TERM") { println!("TERM: {term}"); } else { println!("TERM: not set"); } if let Ok(term_program) = std::env::var("TERM_PROGRAM") { println!("TERM_PROGRAM: {term_program}"); } else { println!("TERM_PROGRAM: not set"); } // Viuer capabilities println!( "viuer::is_iterm_supported(): {}", viuer::is_iterm_supported() ); // Additional debug info if let Ok(colorterm) = std::env::var("COLORTERM") { println!("COLORTERM: {colorterm}"); } println!("========================================"); } /// Debug method to test image rendering pub fn debug_render(&self) { println!( "DEBUG: Attempting to render test image with support: {:?}", self.support ); } } impl Default for TerminalImageRenderer { fn default() -> Self { Self::new() } } #[cfg(test)] mod tests { use super::*; #[test] fn test_capability_detection() { // This will vary by environment, but should not panic let support = TerminalImageRenderer::detect_capabilities(); println!("Detected support: {support:?}"); } #[test] fn test_renderer_creation() { let renderer = TerminalImageRenderer::new(); assert!(renderer.max_width > 0); assert!(renderer.max_height > 0); } #[test] fn test_can_display_images() { let renderer = TerminalImageRenderer::with_support(TerminalImageSupport::Kitty); assert!(renderer.can_display_images()); let renderer = TerminalImageRenderer::with_support(TerminalImageSupport::None); assert!(!renderer.can_display_images()); } } doxx-0.1.4/src/ui.rs000064400000000000000000001032211046102023000123610ustar 00000000000000use anyhow::Result; use arboard::Clipboard; use crossterm::{ event::{ self, DisableMouseCapture, EnableMouseCapture, Event, KeyCode, KeyEventKind, MouseEventKind, }, execute, terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen}, tty::IsTty, }; use ratatui::{ backend::{Backend, CrosstermBackend}, layout::{Constraint, Direction, Layout, Margin, Rect}, style::{Color, Modifier, Style}, widgets::{ Block, Borders, Clear, List, ListItem, ListState, Paragraph, Scrollbar, ScrollbarOrientation, ScrollbarState, Wrap, }, Frame, Terminal, }; use std::io; use crate::{ config::Config, document::*, keymap::{Action, KeyBinding, Keymap}, state::StateManager, widgets::{DocumentWidget, LayoutCache}, Cli, }; use ratatui_image::{picker::Picker, protocol::StatefulProtocol}; type ImageProtocols = Vec; pub struct App { pub document: Document, pub current_view: ViewMode, pub scroll_offset: usize, pub search_query: String, pub search_results: Vec, pub backup_search_results: Vec, pub current_search_index: usize, pub outline_state: ListState, pub show_help: bool, pub clipboard: Option, pub status_message: Option, pub color_enabled: bool, pub image_picker: Option, pub image_protocols: ImageProtocols, pub layout_cache: LayoutCache, pub keymap: Keymap, } #[derive(Debug, Clone, Default, serde::Serialize, serde::Deserialize)] pub enum ViewMode { #[default] Document, Outline, Search, #[allow(dead_code)] Help, } impl App { pub fn new(document: Document, cli: &Cli, config: &Config) -> Self { // Load saved state for this document (only if --restore-position flag is set) let saved_state = if cli.restore_position { if let Ok(manager) = StateManager::load() { use std::path::PathBuf; let doc_path = PathBuf::from(&document.metadata.file_path); manager.get_state(&doc_path) } else { None } } else { None // Default: start at top (like less) }; // Initialize with default or saved state let (initial_scroll, initial_search, initial_view) = if let Some(state) = &saved_state { ( state.scroll_offset, state.last_search.clone(), state.view_mode.clone(), ) } else { (0, String::new(), ViewMode::Document) }; let mut app = Self { document, current_view: initial_view, scroll_offset: initial_scroll, search_query: initial_search.clone(), search_results: Vec::new(), backup_search_results: Vec::new(), current_search_index: 0, outline_state: ListState::default(), show_help: false, clipboard: Clipboard::new().ok(), status_message: None, color_enabled: cli.color, image_picker: None, keymap: config.build_keymap(), image_protocols: Vec::new(), layout_cache: LayoutCache::new(), }; // Restore search results if we had a saved search if !initial_search.is_empty() { app.search_results = crate::document::search_document(&app.document, &initial_search); } // CLI options override saved state if cli.outline { app.current_view = ViewMode::Outline; } if let Some(search) = &cli.search { app.search_query = search.clone(); app.search_results = crate::document::search_document(&app.document, search); app.current_view = ViewMode::Search; } if let Some(page) = cli.page { // Rough estimate of elements per page let elements_per_page = 10; app.scroll_offset = (page.saturating_sub(1)) * elements_per_page; } // Initialize image support if images are enabled if cli.images { app.init_image_support(); } app } fn init_image_support(&mut self) { // Try to initialize picker from terminal query on Unix, use font size on Windows #[cfg(unix)] let picker = if let Ok(p) = Picker::from_query_stdio() { p } else { // Fallback to manual font size Picker::from_fontsize((8, 16)) }; #[cfg(not(unix))] let picker = Picker::from_fontsize((8, 16)); // Process all images in the document for element in &self.document.elements { if let DocumentElement::Image { image_path: Some(path), .. } = element { // Try to load and create protocol for each image if let Ok(img) = image::ImageReader::open(path) { if let Ok(dyn_img) = img.decode() { let protocol = picker.new_resize_protocol(dyn_img); self.image_protocols.push(protocol); } } } } self.image_picker = Some(picker); } pub fn next_search_result(&mut self) { if !self.search_results.is_empty() { self.current_search_index = (self.current_search_index + 1) % self.search_results.len(); if let Some(result) = self.search_results.get(self.current_search_index) { self.scroll_offset = result.element_index; } } } pub fn prev_search_result(&mut self) { if !self.search_results.is_empty() { self.current_search_index = if self.current_search_index == 0 { self.search_results.len() - 1 } else { self.current_search_index - 1 }; if let Some(result) = self.search_results.get(self.current_search_index) { self.scroll_offset = result.element_index; } } } pub fn scroll_up(&mut self) { self.scroll_offset = self.scroll_offset.saturating_sub(1); } pub fn scroll_down(&mut self) { if self.scroll_offset + 1 < self.document.elements.len() { self.scroll_offset += 1; } } pub fn page_up(&mut self, page_size: usize) { self.scroll_offset = self.scroll_offset.saturating_sub(page_size); } pub fn page_down(&mut self, page_size: usize) { let max_offset = self.document.elements.len().saturating_sub(1); self.scroll_offset = std::cmp::min(self.scroll_offset + page_size, max_offset); } pub fn copy_content(&mut self) { if let Some(clipboard) = &mut self.clipboard { let content = match self.current_view { ViewMode::Document => { // Copy the full document as text crate::export::format_as_text(&self.document) } ViewMode::Search => { // Copy search results if self.search_results.is_empty() { "No search results to copy.".to_string() } else { let mut content = format!("Search results for '{}':\n\n", self.search_query); for (i, result) in self.search_results.iter().enumerate() { content.push_str(&format!("{}. {}\n", i + 1, result.text.trim())); } content } } ViewMode::Outline => { // Copy document outline let outline = crate::document::generate_outline(&self.document); let mut content = String::from("Document Outline:\n\n"); for item in outline { let indent = " ".repeat((item.level as usize).saturating_sub(1)); content.push_str(&format!("{}{}\n", indent, item.title)); } content } _ => "Content not available for copying in this view.".to_string(), }; match clipboard.set_text(content) { Ok(_) => { self.status_message = Some("Copied to clipboard!".to_string()); } Err(_) => { self.status_message = Some("Failed to copy to clipboard.".to_string()); } } } else { self.status_message = Some("Clipboard not available.".to_string()); } } pub fn clear_status_message(&mut self) { self.status_message = None; } pub fn toggle_search_state(&mut self) { if self.search_query.is_empty() { return; } // Toggles search state: clears results if active, restores backup if inactive. if !self.search_results.is_empty() { self.backup_search_results = self.search_results.clone(); self.search_results.clear(); } else if !self.backup_search_results.is_empty() { self.search_results = self.backup_search_results.clone(); self.backup_search_results.clear(); } } } async fn run_non_interactive(document: Document, cli: &Cli) -> Result<()> { let app = App::new(document, cli, &Config::default()); match app.current_view { ViewMode::Outline => { // Show outline let outline = crate::document::generate_outline(&app.document); println!("Document Outline:"); println!("================"); for item in outline { let indent = " ".repeat((item.level.saturating_sub(1)) as usize); println!("{}{}", indent, item.title); } } ViewMode::Search => { // Show search results println!("Search Results for '{}':", app.search_query); println!("=============================="); for (i, result) in app.search_results.iter().enumerate() { println!("{}. {}", i + 1, result.text.trim()); println!(); } if app.search_results.is_empty() { println!("No results found."); } } _ => { // Default: show basic document info and content preview println!("Document: {}", app.document.title); println!("Pages: {}", app.document.metadata.page_count); println!("Words: {}", app.document.metadata.word_count); println!(); println!("Content Preview:"); println!("================"); // Show first few elements with proper formatting let preview_count = std::cmp::min(app.document.elements.len(), 20); for element in &app.document.elements[0..preview_count] { match element { DocumentElement::Heading { level, text, number, } => { let prefix = match level { 1 => "# ", 2 => "## ", _ => "### ", }; let heading_text = if let Some(number) = number { format!("{number} {text}") } else { text.clone() }; println!("{prefix}{heading_text}"); println!(); } DocumentElement::Paragraph { runs } => { let text: String = runs.iter().map(|run| run.text.as_str()).collect(); println!("{text}"); println!(); } DocumentElement::List { items, ordered } => { for (i, item) in items.iter().enumerate() { let bullet = if *ordered { format!("{}. ", i + 1) } else { "• ".to_string() }; let indent = " ".repeat(item.level as usize); let item_text: String = item.runs.iter().map(|run| run.text.as_str()).collect(); println!("{indent}{bullet}{item_text}"); } println!(); } DocumentElement::Table { .. } => { println!("[Table content - use --export csv to view]"); println!(); } DocumentElement::Image { description, image_path, .. } => { if let Some(path) = image_path { // Try to display the image inline using terminal protocols match crate::terminal_image::TerminalImageRenderer::with_options( app.document.image_options.max_width, app.document.image_options.max_height, app.document.image_options.scale, ) .render_image_from_path(path, description) { Ok(_) => { // Image displayed successfully println!(); } Err(_) => { // Fallback to text description println!("📷 [Image: {description}]"); println!(); } } } else { println!("📷 [Image: {description}]"); println!(); } } DocumentElement::Equation { latex, .. } => { println!("📐 Equation: {latex}"); println!(); } DocumentElement::CodeBlock { text } => { println!("{text}"); println!(); } DocumentElement::TextBox { lines } => { for line in lines { println!("│ {line}"); } println!(); } DocumentElement::PageBreak => { println!("---"); println!(); } } } if app.document.elements.len() > preview_count { println!( "... and {} more elements", app.document.elements.len() - preview_count ); println!(); } println!( "Use --export to save full content, or run in an interactive terminal for full UI." ); } } Ok(()) } /// Save the current app state to disk fn save_app_state(app: &App) { use crate::state::DocumentState; use std::path::PathBuf; // Load existing state manager let mut manager = StateManager::load().unwrap_or_default(); // Create state for this document let doc_path = PathBuf::from(&app.document.metadata.file_path); let state = DocumentState { scroll_offset: app.scroll_offset, last_search: app.search_query.clone(), view_mode: app.current_view.clone(), last_accessed: std::time::SystemTime::now(), }; // Update and save manager.set_state(&doc_path, state); // Ignore errors when saving state (don't crash the app on exit) let _ = manager.save(); } pub async fn run_viewer(document: Document, cli: &Cli, config: &Config) -> Result<()> { // Check if we're in an interactive terminal or forced to use UI if !cli.force_ui && !IsTty::is_tty(&io::stdout()) { // Fallback for non-interactive environments return run_non_interactive(document, cli).await; } // Setup terminal enable_raw_mode()?; let mut stdout = io::stdout(); execute!(stdout, EnterAlternateScreen, EnableMouseCapture)?; let backend = CrosstermBackend::new(stdout); let mut terminal = Terminal::new(backend)?; // Create app let mut app = App::new(document, cli, config); // Run the app let res = run_app(&mut terminal, &mut app).await; // Save state before exiting save_app_state(&app); // Restore terminal disable_raw_mode()?; execute!( terminal.backend_mut(), LeaveAlternateScreen, DisableMouseCapture )?; terminal.show_cursor()?; if let Err(err) = res { println!("{err:?}"); } Ok(()) } async fn run_app(terminal: &mut Terminal, app: &mut App) -> Result<()> { loop { terminal.draw(|f| ui(f, app))?; match event::read()? { Event::Key(key) if key.kind == KeyEventKind::Press => { let binding = KeyBinding::new(key.code, key.modifiers); let action = app.keymap.get_action(&binding); // In search mode, unbound character keys append to the query if matches!(app.current_view, ViewMode::Search) && action.is_none() { if let KeyCode::Char(c) = key.code { app.search_query.push(c); app.search_results = crate::document::search_document(&app.document, &app.search_query); app.current_search_index = 0; continue; } } if let Some(action) = action { // Clear status message on any action except copy if app.status_message.is_some() && action != Action::Copy { app.clear_status_message(); } if handle_action(app, action) { break; } } } Event::Mouse(mouse) => { match mouse.kind { MouseEventKind::ScrollUp => { match app.current_view { ViewMode::Document => { // Scroll up 3 lines for smooth mouse wheel experience for _ in 0..3 { app.scroll_up(); } } ViewMode::Outline => { let selected = app.outline_state.selected().unwrap_or(0); if selected > 0 { app.outline_state.select(Some(selected - 1)); } } ViewMode::Search => app.prev_search_result(), _ => {} } } MouseEventKind::ScrollDown => { match app.current_view { ViewMode::Document => { // Scroll down 3 lines for smooth mouse wheel experience for _ in 0..3 { app.scroll_down(); } } ViewMode::Outline => { let selected = app.outline_state.selected().unwrap_or(0); if selected + 1 < crate::document::generate_outline(&app.document).len() { app.outline_state.select(Some(selected + 1)); } } ViewMode::Search => app.next_search_result(), _ => {} } } _ => {} } } _ => {} } } Ok(()) } /// Returns true if the app should quit. fn handle_action(app: &mut App, action: Action) -> bool { match action { Action::Quit => return true, Action::Escape => match app.current_view { ViewMode::Search | ViewMode::Outline => app.current_view = ViewMode::Document, ViewMode::Help => { app.show_help = false; app.current_view = ViewMode::Document; } ViewMode::Document => {} }, Action::ScrollUp => app.scroll_up(), Action::ScrollDown => app.scroll_down(), Action::PageUp => app.page_up(10), Action::PageDown => app.page_down(10), Action::HalfPageUp => app.page_up(5), Action::HalfPageDown => app.page_down(5), Action::GotoStart => app.scroll_offset = 0, Action::GotoEnd => { app.scroll_offset = app.document.elements.len().saturating_sub(1); } Action::ToggleOutline => app.current_view = ViewMode::Outline, Action::EnterSearch => app.current_view = ViewMode::Search, Action::ToggleHelp => app.show_help = !app.show_help, Action::ToggleSearchState => app.toggle_search_state(), Action::SearchNext => { if !app.search_results.is_empty() { app.next_search_result(); } } Action::SearchPrevious => { if !app.search_results.is_empty() { app.prev_search_result(); } } Action::Copy => app.copy_content(), Action::OutlineSelect => { if let Some(selected) = app.outline_state.selected() { if let Some(item) = crate::document::generate_outline(&app.document).get(selected) { app.scroll_offset = item.element_index; app.current_view = ViewMode::Document; } } } Action::SearchDeleteChar => { app.search_query.pop(); app.search_results = crate::document::search_document(&app.document, &app.search_query); app.current_search_index = 0; } Action::SearchSubmit => { if !app.search_results.is_empty() { app.next_search_result(); } } } false } fn ui(f: &mut Frame, app: &mut App) { let chunks = Layout::default() .direction(Direction::Vertical) .constraints([Constraint::Min(0), Constraint::Length(3)].as_ref()) .split(f.area()); // Main content area match app.current_view { ViewMode::Document => render_document(f, chunks[0], app), ViewMode::Outline => render_outline(f, chunks[0], app), ViewMode::Search => render_search(f, chunks[0], app), ViewMode::Help => render_help(f, chunks[0], &app.keymap), } // Status bar render_status_bar(f, chunks[1], app); // Help overlay if app.show_help { render_help_overlay(f, app); } } fn render_document(f: &mut Frame, area: Rect, app: &mut App) { let title = format!("📄 doxx - {}", app.document.title); let block = Block::default() .title(title) .borders(Borders::ALL) .border_style(Style::default().fg(Color::Blue)); let inner = block.inner(area); f.render_widget(block, area); // Use DocumentWidget for unified rendering with proper text wrapping + images let mut doc_widget = DocumentWidget::new(&app.document.elements[..]) .scroll_offset(app.scroll_offset) .color_enabled(app.color_enabled) .search_results(&app.search_results[..]) .current_search_index(app.current_search_index); // Render the document content (text + images in single pass) doc_widget.render(inner, f, &mut app.image_protocols, &mut app.layout_cache); let scrollbar = Scrollbar::default() .orientation(ScrollbarOrientation::VerticalRight) .begin_symbol(Some("↑")) .end_symbol(Some("↓")); let mut scrollbar_state = ScrollbarState::default() .content_length(app.document.elements.len()) .position(app.scroll_offset); f.render_stateful_widget( scrollbar, area.inner(Margin { vertical: 1, horizontal: 0, }), &mut scrollbar_state, ); } fn render_outline(f: &mut Frame, area: Rect, app: &mut App) { let outline = crate::document::generate_outline(&app.document); let items: Vec = outline .iter() .map(|item| { let indent = " ".repeat((item.level.saturating_sub(1)) as usize); let text = format!("{}{}", indent, item.title); ListItem::new(text) }) .collect(); let list = List::new(items) .block( Block::default() .title("📋 Document Outline") .borders(Borders::ALL) .border_style(Style::default().fg(Color::Green)), ) .style(Style::default().fg(Color::White)) .highlight_style(Style::default().bg(Color::Blue).fg(Color::White)) .highlight_symbol("➤ "); f.render_stateful_widget(list, area, &mut app.outline_state); } fn render_search(f: &mut Frame, area: Rect, app: &App) { let chunks = Layout::default() .direction(Direction::Vertical) .constraints([Constraint::Length(3), Constraint::Min(0)].as_ref()) .split(area); // Search input let input = Paragraph::new(app.search_query.as_str()) .style(Style::default().fg(Color::Yellow)) .block( Block::default() .borders(Borders::ALL) .title("🔍 Search") .border_style(Style::default().fg(Color::Yellow)), ); f.render_widget(input, chunks[0]); // Search results let results: Vec = app .search_results .iter() .enumerate() .map(|(i, result)| { let prefix = "📄"; // Simplified for now let style = if i == app.current_search_index { Style::default().bg(Color::Blue).fg(Color::White) } else { Style::default() }; // Truncate long results and add context (Unicode-safe) let display_text = if result.text.len() > 80 { // Safe truncation: find the largest valid UTF-8 boundary <= 77 bytes let max_bytes = 77; let safe_boundary = if result.text.len() <= max_bytes { result.text.len() } else { let mut boundary = max_bytes; while boundary > 0 && !result.text.is_char_boundary(boundary) { boundary -= 1; } boundary }; format!("{}...", &result.text[..safe_boundary]) } else { result.text.clone() }; ListItem::new(format!("{} {} [{}]", prefix, display_text, i + 1)).style(style) }) .collect(); let results_list = List::new(results).block( Block::default() .title(format!( "Results ({}/{})", if app.search_results.is_empty() { 0 } else { app.current_search_index + 1 }, app.search_results.len() )) .borders(Borders::ALL) .border_style(Style::default().fg(Color::Yellow)), ); f.render_widget(results_list, chunks[1]); } fn render_help(f: &mut Frame, area: Rect, keymap: &Keymap) { let mut lines: Vec = vec![ "doxx - Help".to_string(), "".to_string(), "Navigation:".to_string(), ]; let nav_actions: &[(Action, &str)] = &[ (Action::ScrollUp, "Scroll up"), (Action::ScrollDown, "Scroll down"), (Action::PageUp, "Page up"), (Action::PageDown, "Page down"), (Action::HalfPageUp, "Half-page up"), (Action::HalfPageDown, "Half-page down"), (Action::GotoStart, "Go to start"), (Action::GotoEnd, "Go to end"), ]; for (action, desc) in nav_actions { let keys = keymap.keys_for_action(*action); if !keys.is_empty() { lines.push(format!(" {:<16} {}", keys.join(", "), desc)); } } lines.push("".to_string()); lines.push("Search:".to_string()); let search_actions: &[(Action, &str)] = &[ (Action::EnterSearch, "Open search"), (Action::SearchNext, "Next result"), (Action::SearchPrevious, "Previous result"), (Action::ToggleSearchState, "Deselect/Reselect selection"), ]; for (action, desc) in search_actions { let keys = keymap.keys_for_action(*action); if !keys.is_empty() { lines.push(format!(" {:<16} {}", keys.join(", "), desc)); } } lines.push("".to_string()); lines.push("Other:".to_string()); let other_actions: &[(Action, &str)] = &[ (Action::ToggleOutline, "Show outline"), (Action::Copy, "Copy content to clipboard"), (Action::ToggleHelp, "Toggle help"), (Action::Quit, "Quit"), ]; for (action, desc) in other_actions { let keys = keymap.keys_for_action(*action); if !keys.is_empty() { lines.push(format!(" {:<16} {}", keys.join(", "), desc)); } } lines.push("".to_string()); lines.push("Copy modes:".to_string()); lines.push(" Document: copies full document as text".to_string()); lines.push(" Outline: copies document structure".to_string()); lines.push(" Search: copies search results (F2)".to_string()); lines.push("".to_string()); lines.push("Press any key to close...".to_string()); let help = Paragraph::new(lines.join("\n")) .block( Block::default() .title("Help") .borders(Borders::ALL) .border_style(Style::default().fg(Color::Yellow)), ) .wrap(Wrap { trim: true }); f.render_widget(help, area); } fn render_help_overlay(f: &mut Frame, app: &App) { let area = centered_rect(60, 70, f.area()); f.render_widget(Clear, area); render_help(f, area, &app.keymap); } fn render_status_bar(f: &mut Frame, area: Rect, app: &App) { let metadata = &app.document.metadata; let view_indicator = match app.current_view { ViewMode::Document => "📄 Document", ViewMode::Outline => "📋 Outline", ViewMode::Search => "🔍 Search", ViewMode::Help => "❓ Help", }; let search_info = if !app.search_results.is_empty() { format!( " • 🔍 {}/{} matches", app.current_search_index + 1, app.search_results.len() ) } else if !app.search_query.is_empty() { " • 🔍 No matches".to_string() } else { String::new() }; let status_text = if let Some(status_msg) = &app.status_message { // Show status message (like copy confirmation) with higher priority status_msg.clone() } else { format!( "{} • 📄 {} • {} pages • {} words • {}/{}{}", view_indicator, metadata .file_path .split('/') .next_back() .unwrap_or("Unknown"), metadata.page_count, metadata.word_count, app.scroll_offset + 1, app.document.elements.len(), search_info ) }; let status_style = if app.status_message.is_some() { // Highlight status messages Style::default() .fg(Color::Green) .bg(Color::DarkGray) .add_modifier(Modifier::BOLD) } else { Style::default().fg(Color::White).bg(Color::DarkGray) }; let status = Paragraph::new(status_text) .style(status_style) .block(Block::default()); f.render_widget(status, area); // Navigation help (keys pulled from active keymap) let km = &app.keymap; let help_text = format!( "[↕] Scroll [{}] Outline [{}] Search [{}] Copy [{}] Help [{}] Quit", km.primary_key_for_action(Action::ToggleOutline), km.primary_key_for_action(Action::EnterSearch), km.primary_key_for_action(Action::Copy), km.primary_key_for_action(Action::ToggleHelp), km.primary_key_for_action(Action::Quit), ); let help_area = Rect { x: area.x, y: area.y + 1, width: area.width, height: 1, }; let help = Paragraph::new(help_text) .style(Style::default().fg(Color::Gray)) .block(Block::default()); f.render_widget(help, help_area); } fn centered_rect(percent_x: u16, percent_y: u16, r: Rect) -> Rect { let popup_layout = Layout::default() .direction(Direction::Vertical) .constraints([ Constraint::Percentage((100 - percent_y) / 2), Constraint::Percentage(percent_y), Constraint::Percentage((100 - percent_y) / 2), ]) .split(r); Layout::default() .direction(Direction::Horizontal) .constraints([ Constraint::Percentage((100 - percent_x) / 2), Constraint::Percentage(percent_x), Constraint::Percentage((100 - percent_x) / 2), ]) .split(popup_layout[1])[1] } doxx-0.1.4/src/widgets/document.rs000064400000000000000000000713501046102023000152370ustar 00000000000000use ratatui::{ buffer::Buffer, layout::Rect, style::{Color, Modifier, Style}, text::{Line, Span}, Frame, }; use ratatui_image::{protocol::StatefulProtocol, StatefulImage}; use unicode_segmentation::UnicodeSegmentation; use unicode_width::UnicodeWidthStr; use super::LayoutCache; use crate::document::*; /// Context for rendering document elements struct RenderContext<'a> { color_enabled: bool, search_matches: &'a [(usize, usize)], is_current_match: bool, element_index: usize, layout_cache: &'a mut LayoutCache, } /// Custom widget for rendering document content with proper text wrapping and inline images. /// /// This widget handles the complete layout of document elements including: /// - Text with unicode-aware wrapping /// - Inline images with correct positioning /// - Tables, lists, and other formatted content /// - Search result highlighting /// /// Unlike using the Paragraph widget with image overlays, this widget renders everything /// in a single pass with full control over layout, ensuring images are positioned correctly /// even when text wraps across multiple lines. pub struct DocumentWidget<'a> { elements: &'a [DocumentElement], scroll_offset: usize, color_enabled: bool, search_results: &'a [SearchResult], current_search_index: usize, } impl<'a> DocumentWidget<'a> { /// Create a new DocumentWidget with the given document elements pub fn new(elements: &'a [DocumentElement]) -> Self { Self { elements, scroll_offset: 0, color_enabled: false, search_results: &[], current_search_index: 0, } } /// Set the scroll offset (number of elements to skip from the top) pub fn scroll_offset(mut self, offset: usize) -> Self { self.scroll_offset = offset; self } /// Enable or disable color rendering pub fn color_enabled(mut self, enabled: bool) -> Self { self.color_enabled = enabled; self } /// Set search results for highlighting pub fn search_results(mut self, results: &'a [SearchResult]) -> Self { self.search_results = results; self } /// Set the current search result index for highlighting pub fn current_search_index(mut self, index: usize) -> Self { self.current_search_index = index; self } /// Wrap formatted text runs into lines that fit within the given width. /// /// This function properly handles: /// - Unicode grapheme clusters (emoji, combining characters) /// - Preserving text formatting (bold, italic, colors) across wrapped lines /// - Calculating visual width correctly for all unicode characters /// - Search result highlighting (current match and other matches) fn wrap_formatted_runs( runs: &[FormattedRun], max_width: usize, color_enabled: bool, search_matches: &[(usize, usize)], // List of (start_pos, end_pos) for matches in this element is_current_match: bool, // True if this element contains the current search match ) -> Vec> { if max_width == 0 { return vec![]; } let mut lines = Vec::new(); let mut current_line: Vec = Vec::new(); let mut current_width = 0; let mut char_position = 0; // Track absolute character position across all runs for run in runs { let mut base_style = Style::default(); // Apply formatting if run.formatting.bold { base_style = base_style.add_modifier(Modifier::BOLD); } if run.formatting.italic { base_style = base_style.add_modifier(Modifier::ITALIC); } if run.formatting.underline { base_style = base_style.add_modifier(Modifier::UNDERLINED); } if run.formatting.strikethrough { base_style = base_style.add_modifier(Modifier::CROSSED_OUT); } // Apply color if enabled if color_enabled { if let Some(color_hex) = &run.formatting.color { if let Some(color) = hex_to_color(color_hex) { base_style = base_style.fg(color); } } } // Split text into graphemes for proper unicode handling for grapheme in run.text.graphemes(true) { let g_width = grapheme.width(); // Determine if this character is within a search match let mut style = base_style; for &(start_pos, end_pos) in search_matches { if char_position >= start_pos && char_position < end_pos { // Apply search highlight if is_current_match { // Current match: bright yellow background style = style.bg(Color::Yellow).fg(Color::Black); } else { // Other matches: darker highlight style = style.bg(Color::Indexed(240)); // Dark gray } break; } } // Check if adding this grapheme would exceed max width if current_width + g_width > max_width && current_width > 0 { // Finish current line and start a new one if !current_line.is_empty() { lines.push(Line::from(current_line.clone())); current_line.clear(); current_width = 0; } } // Add grapheme to current line current_line.push(Span::styled(grapheme.to_string(), style)); current_width += g_width; char_position += grapheme.chars().count(); // Advance character position } } // Add remaining content if !current_line.is_empty() { lines.push(Line::from(current_line)); } // Return at least one empty line if no content if lines.is_empty() { lines.push(Line::from("")); } lines } /// Render a heading element at the current position fn render_heading( heading: &str, level: u8, number: Option<&str>, area: Rect, buf: &mut Buffer, current_y: &mut u16, color_enabled: bool, ) { if *current_y >= area.y + area.height { return; // Off screen } // Determine styling based on heading level let (style, prefix) = match level { 1 => ( if color_enabled { Style::default() .fg(Color::Yellow) .add_modifier(Modifier::BOLD) } else { Style::default().add_modifier(Modifier::BOLD) }, "■ ", ), 2 => ( if color_enabled { Style::default() .fg(Color::Green) .add_modifier(Modifier::BOLD) } else { Style::default().add_modifier(Modifier::BOLD) }, " ▶ ", ), _ => ( if color_enabled { Style::default() .fg(Color::Cyan) .add_modifier(Modifier::BOLD) } else { Style::default().add_modifier(Modifier::BOLD) }, " ◦ ", ), }; // Build heading text with optional numbering let text = if let Some(num) = number { format!("{prefix}{num} {heading}") } else { format!("{prefix}{heading}") }; buf.set_string(area.x, *current_y, &text, style); *current_y += 2; // Heading + blank line } /// Render a paragraph element at the current position fn render_paragraph( runs: &[FormattedRun], area: Rect, buf: &mut Buffer, current_y: &mut u16, ctx: &mut RenderContext, ) { if *current_y >= area.y + area.height { return; // Off screen } // Try to get cached lines, or wrap if not cached let wrapped_lines = if ctx.search_matches.is_empty() { // Only use cache if there are no search matches (search highlighting changes the output) if let Some(cached) = ctx.layout_cache.get(ctx.element_index, area.width) { cached.clone() } else { let lines = Self::wrap_formatted_runs( runs, area.width as usize, ctx.color_enabled, ctx.search_matches, ctx.is_current_match, ); ctx.layout_cache .insert(ctx.element_index, area.width, lines.clone()); lines } } else { // Don't cache when search highlighting is active Self::wrap_formatted_runs( runs, area.width as usize, ctx.color_enabled, ctx.search_matches, ctx.is_current_match, ) }; // Render each line for line in wrapped_lines { if *current_y >= area.y + area.height { break; // Stop if we reach bottom of area } buf.set_line(area.x, *current_y, &line, area.width); *current_y += 1; } *current_y += 1; // Blank line after paragraph } /// Render a list element at the current position fn render_list( items: &[ListItem], ordered: bool, area: Rect, buf: &mut Buffer, current_y: &mut u16, ctx: &mut RenderContext, ) { for (idx, item) in items.iter().enumerate() { if *current_y >= area.y + area.height { break; // Off screen } // Determine bullet/number prefix let bullet_str = if ordered { format!("{}. ", idx + 1) } else { "• ".to_string() }; let bullet_width = bullet_str.len(); let indent = " ".repeat(bullet_width); // Render bullet/number let bullet_style = if ctx.color_enabled { Style::default().fg(Color::Cyan) } else { Style::default() }; buf.set_string(area.x, *current_y, &bullet_str, bullet_style); // Wrap the item text to fit after the bullet let text_width = (area.width as usize).saturating_sub(bullet_width); let wrapped_lines = Self::wrap_formatted_runs( &item.runs, text_width, ctx.color_enabled, ctx.search_matches, ctx.is_current_match, ); // Render first line (on same line as bullet) if let Some(first_line) = wrapped_lines.first() { buf.set_line( area.x + bullet_width as u16, *current_y, first_line, (area.width as usize - bullet_width) as u16, ); *current_y += 1; } // Render remaining lines with indent for line in wrapped_lines.iter().skip(1) { if *current_y >= area.y + area.height { break; } buf.set_string(area.x, *current_y, &indent, Style::default()); buf.set_line( area.x + bullet_width as u16, *current_y, line, (area.width as usize - bullet_width) as u16, ); *current_y += 1; } } *current_y += 1; // Blank line after list } /// Render a table element at the current position fn render_table( table: &TableData, area: Rect, buf: &mut Buffer, current_y: &mut u16, color_enabled: bool, ) { if *current_y >= area.y + area.height { return; // Off screen } let available_width = area.width as usize; // Calculate column widths based on metadata let col_widths = &table.metadata.column_widths; let total_width: usize = col_widths.iter().sum(); // Scale widths to fit available space let scaled_widths: Vec = if total_width > available_width { col_widths .iter() .map(|w| (w * available_width) / total_width.max(1)) .collect() } else { col_widths.clone() }; // Render title if present if let Some(title) = &table.metadata.title { let title_style = if color_enabled { Style::default() .fg(Color::Cyan) .add_modifier(Modifier::BOLD) } else { Style::default().add_modifier(Modifier::BOLD) }; buf.set_string(area.x, *current_y, title, title_style); *current_y += 1; } // Render headers if present if table.metadata.has_headers && !table.headers.is_empty() { Self::render_table_row( &table.headers, &scaled_widths, area, buf, current_y, color_enabled, true, ); // Header separator line if *current_y < area.y + area.height { let separator = "─".repeat(available_width.min(scaled_widths.iter().sum())); buf.set_string(area.x, *current_y, &separator, Style::default()); *current_y += 1; } } // Render rows for row in &table.rows { if *current_y >= area.y + area.height { break; } Self::render_table_row( row, &scaled_widths, area, buf, current_y, color_enabled, false, ); } *current_y += 1; // Blank line after table } /// Render a single table row fn render_table_row( cells: &[TableCell], col_widths: &[usize], area: Rect, buf: &mut Buffer, current_y: &mut u16, color_enabled: bool, is_header: bool, ) { if *current_y >= area.y + area.height { return; } let mut x_offset = 0; for (i, cell) in cells.iter().enumerate() { let width = col_widths.get(i).copied().unwrap_or(10); // Apply cell styling let mut style = Style::default(); if is_header { style = style.add_modifier(Modifier::BOLD); if color_enabled { style = style.fg(Color::Yellow); } } else if color_enabled { if let Some(color_hex) = &cell.formatting.color { if let Some(color) = hex_to_color(color_hex) { style = style.fg(color); } } } // Apply cell formatting if cell.formatting.bold { style = style.add_modifier(Modifier::BOLD); } if cell.formatting.italic { style = style.add_modifier(Modifier::ITALIC); } if cell.formatting.underline { style = style.add_modifier(Modifier::UNDERLINED); } if cell.formatting.strikethrough { style = style.add_modifier(Modifier::CROSSED_OUT); } // Truncate content to fit width let content = if cell.content.len() > width { format!("{}…", &cell.content[..width.saturating_sub(1)]) } else { cell.content.clone() }; // Apply alignment let aligned_content = match cell.alignment { TextAlignment::Left => format!("{content: format!("{content:>width$}"), TextAlignment::Center => { let padding = width.saturating_sub(content.len()); let left_pad = padding / 2; let right_pad = padding - left_pad; format!( "{}{}{}", " ".repeat(left_pad), content, " ".repeat(right_pad) ) } TextAlignment::Justify => format!("{content:= area.y + area.height { return; } // Reserve space for the image *current_y += image_height; // Render description below the image space if *current_y < area.y + area.height { let desc_style = if color_enabled { Style::default().fg(Color::Magenta) } else { Style::default() }; let desc_text = format!("🖼️ {description}"); buf.set_string(area.x, *current_y, &desc_text, desc_style); *current_y += 2; // Description + blank line } } /// Render a text box element with Unicode box-drawing borders fn render_text_box( lines: &[String], area: Rect, buf: &mut Buffer, current_y: &mut u16, color_enabled: bool, ) { if *current_y >= area.y + area.height { return; } let border_style = if color_enabled { Style::default().fg(Color::Cyan) } else { Style::default() }; let inner_width = (area.width as usize).saturating_sub(4); // "│ " + " │" let bar = "─".repeat(area.width.saturating_sub(2) as usize); // Top border: ┌───┐ buf.set_string(area.x, *current_y, format!("┌{bar}┐"), border_style); *current_y += 1; // Content lines for line in lines { if *current_y >= area.y + area.height { return; } let truncated: String = line.chars().take(inner_width).collect(); let padded = format!("│ {truncated:= area.y + area.height { return; } let style = if color_enabled { Style::default().fg(Color::DarkGray) } else { Style::default() }; let separator = "─".repeat(area.width as usize); buf.set_string(area.x, *current_y, &separator, style); *current_y += 2; // Page break + blank line } /// Custom render method that has access to Frame for complete rendering. /// /// This method renders all document elements including text (with wrapping) and images. /// Unlike the Widget trait's render method, this has access to Frame which is required /// for rendering StatefulImage widgets. pub fn render( &mut self, area: Rect, frame: &mut Frame, image_protocols: &mut [StatefulProtocol], layout_cache: &mut LayoutCache, ) { let buf = frame.buffer_mut(); // Check if terminal width changed and invalidate cache if needed layout_cache.check_width(area.width); // Start rendering from the top of the area let mut current_y = area.y; // Skip elements based on scroll offset let visible_elements = self.elements.iter().enumerate().skip(self.scroll_offset); // Track image positions and protocol indices for rendering let mut images_to_render: Vec<(u16, usize)> = Vec::new(); // (y_position, protocol_index) let mut protocol_idx = 0; // Render each visible element for (element_index, element) in visible_elements { // Stop if we've reached the bottom of the area if current_y >= area.y + area.height { break; } // Extract search matches for this element let search_matches: Vec<(usize, usize)> = self .search_results .iter() .filter(|result| result.element_index == element_index) .map(|result| (result.start_pos, result.end_pos)) .collect(); // Check if this element contains the current search match let is_current_match = !self.search_results.is_empty() && self.current_search_index < self.search_results.len() && self.search_results[self.current_search_index].element_index == element_index; match element { DocumentElement::Heading { level, text, number, } => { Self::render_heading( text, *level, number.as_deref(), area, buf, &mut current_y, self.color_enabled, ); } DocumentElement::Paragraph { runs } => { let mut ctx = RenderContext { color_enabled: self.color_enabled, search_matches: &search_matches, is_current_match, element_index, layout_cache, }; Self::render_paragraph(runs, area, buf, &mut current_y, &mut ctx); } DocumentElement::List { items, ordered } => { let mut ctx = RenderContext { color_enabled: self.color_enabled, search_matches: &search_matches, is_current_match, element_index, layout_cache, }; Self::render_list(items, *ordered, area, buf, &mut current_y, &mut ctx); } DocumentElement::Table { table } => { Self::render_table(table, area, buf, &mut current_y, self.color_enabled); } DocumentElement::Image { description, image_path, .. } => { // Check if we can render this image if image_path.is_some() && protocol_idx < image_protocols.len() { // Store image position for rendering after text let image_y = current_y; images_to_render.push((image_y, protocol_idx)); // Reserve space for the image Self::render_image_placeholder( description, area, buf, &mut current_y, self.color_enabled, 15, // Standard image height ); protocol_idx += 1; } else { // Render text-only placeholder let status = if image_path.is_some() { " [Image available - use --images flag]" } else { " [Image not extracted]" }; let desc_text = format!("🖼️ {description}{status}"); buf.set_string(area.x, current_y, &desc_text, Style::default()); current_y += 2; } } DocumentElement::Equation { latex, .. } => { if current_y >= area.y + area.height { continue; } // Render equation as formatted text with icon let icon_style = if self.color_enabled { Style::default().fg(Color::Cyan) } else { Style::default() }; let latex_style = if self.color_enabled { Style::default() .fg(Color::White) .add_modifier(Modifier::BOLD) } else { Style::default().add_modifier(Modifier::BOLD) }; // Build the equation line let line = Line::from(vec![ Span::styled("📐 ", icon_style), Span::styled(latex, latex_style), ]); buf.set_line(area.x, current_y, &line, area.width); current_y += 2; // Equation + blank line } DocumentElement::CodeBlock { text } => { if current_y < area.y + area.height { let code_style = if self.color_enabled { Style::default().fg(Color::Green) } else { Style::default() }; for line in text.lines() { if current_y >= area.y + area.height { break; } buf.set_string(area.x, current_y, line, code_style); current_y += 1; } current_y += 1; // blank line after block } } DocumentElement::TextBox { lines } => { Self::render_text_box(lines, area, buf, &mut current_y, self.color_enabled); } DocumentElement::PageBreak => { Self::render_page_break(area, buf, &mut current_y, self.color_enabled); } } } // Now render all images using Frame (after text has been rendered to buffer) for (y_pos, proto_idx) in images_to_render { if let Some(protocol) = image_protocols.get_mut(proto_idx) { // Ensure image is within visible area if y_pos < area.y + area.height { let img_rect = Rect { x: area.x, y: y_pos, width: area.width.min(80), height: 15.min(area.y + area.height - y_pos), }; let image_widget = StatefulImage::new(); frame.render_stateful_widget(image_widget, img_rect, protocol); } } } } } /// Convert hex color code to ratatui Color fn hex_to_color(hex: &str) -> Option { let hex = hex.trim_start_matches('#'); if hex.len() != 6 { return None; } let r = u8::from_str_radix(&hex[0..2], 16).ok()?; let g = u8::from_str_radix(&hex[2..4], 16).ok()?; let b = u8::from_str_radix(&hex[4..6], 16).ok()?; Some(Color::Rgb(r, g, b)) } doxx-0.1.4/src/widgets/mod.rs000064400000000000000000000022511046102023000141720ustar 00000000000000mod document; use ratatui::text::Line; use std::collections::HashMap; pub use document::DocumentWidget; /// Cache for wrapped text lines to avoid re-wrapping on every frame #[derive(Debug, Default)] pub struct LayoutCache { /// Cached wrapped lines: (element_index, terminal_width) -> Vec cache: HashMap<(usize, u16), Vec>>, /// Last known terminal width for invalidation last_width: u16, } impl LayoutCache { pub fn new() -> Self { Self { cache: HashMap::new(), last_width: 0, } } /// Get cached lines for an element, if available pub fn get(&self, element_index: usize, width: u16) -> Option<&Vec>> { self.cache.get(&(element_index, width)) } /// Store wrapped lines for an element pub fn insert(&mut self, element_index: usize, width: u16, lines: Vec>) { self.cache.insert((element_index, width), lines); } /// Invalidate cache if terminal width changed pub fn check_width(&mut self, width: u16) { if width != self.last_width { self.cache.clear(); self.last_width = width; } } } doxx-0.1.4/tests/ansi_export_test.rs000064400000000000000000000273721046102023000157250ustar 00000000000000use doxx::{ ansi::{export_to_ansi_with_options, AnsiOptions}, document::{Document, DocumentElement, FormattedRun, TextFormatting}, ColorDepth, }; #[test] fn test_ansi_export_basic() { let document = create_test_document(); let options = AnsiOptions { terminal_width: 80, color_depth: ColorDepth::TrueColor, }; let result = export_to_ansi_with_options(&document, &options); assert!(result.is_ok()); let output = result.unwrap(); assert!(output.contains("Test Document")); assert!(output.contains("Document Information")); } #[test] fn test_ansi_export_formatting() { let document = create_formatted_document(); let options = AnsiOptions { terminal_width: 80, color_depth: ColorDepth::TrueColor, }; let result = export_to_ansi_with_options(&document, &options); assert!(result.is_ok()); let output = result.unwrap(); // Check for ANSI formatting codes assert!(output.contains("[1m")); // Bold assert!(output.contains("[3m")); // Italic assert!(output.contains("[4m")); // Underline assert!(output.contains("[9m")); // Strikethrough assert!(output.contains("[38;2;")); // RGB color assert!(output.contains("[0m")); // Reset } #[test] fn test_ansi_export_color_depths() { let document = create_colored_document(); // Test monochrome (no colors) let monochrome_options = AnsiOptions { terminal_width: 80, color_depth: ColorDepth::Monochrome, }; let mono_output = export_to_ansi_with_options(&document, &monochrome_options).unwrap(); assert!(!mono_output.contains("[38;2;")); // No RGB colors assert!(!mono_output.contains("[38;5;")); // No ANSI colors // Test 16 colors let standard_options = AnsiOptions { terminal_width: 80, color_depth: ColorDepth::Standard, }; let standard_output = export_to_ansi_with_options(&document, &standard_options).unwrap(); assert!(standard_output.contains("[38;5;")); // ANSI colors assert!(!standard_output.contains("[38;2;")); // No RGB colors // Test true color let true_color_options = AnsiOptions { terminal_width: 80, color_depth: ColorDepth::TrueColor, }; let true_color_output = export_to_ansi_with_options(&document, &true_color_options).unwrap(); assert!(true_color_output.contains("[38;2;")); // RGB colors } #[test] fn test_ansi_export_terminal_width() { let document = create_test_document(); // Test narrow width let narrow_options = AnsiOptions { terminal_width: 40, color_depth: ColorDepth::Auto, }; let narrow_output = export_to_ansi_with_options(&document, &narrow_options).unwrap(); // Check that separator respects width let lines: Vec<&str> = narrow_output.lines().collect(); let separator_line = lines.iter().find(|line| line.contains("====")).unwrap(); // Should be 40 characters or close to it (accounting for ANSI codes) let clean_line = strip_ansi_codes(separator_line); assert_eq!(clean_line.len(), 40); // Test wide width let wide_options = AnsiOptions { terminal_width: 120, color_depth: ColorDepth::Auto, }; let wide_output = export_to_ansi_with_options(&document, &wide_options).unwrap(); let wide_lines: Vec<&str> = wide_output.lines().collect(); let wide_separator = wide_lines .iter() .find(|line| line.contains("====")) .unwrap(); let wide_clean = strip_ansi_codes(wide_separator); assert_eq!(wide_clean.len(), 50); // Limited by min(50, width) } #[test] fn test_ansi_export_lists() { let document = create_list_document(); let options = AnsiOptions::default(); let result = export_to_ansi_with_options(&document, &options); assert!(result.is_ok()); let output = result.unwrap(); assert!(output.contains("1. ")); // Ordered list marker assert!(output.contains("• ")); // Unordered list marker assert!(output.contains(" ")); // Indentation for nested items } #[test] fn test_ansi_export_tables() { let document = create_table_document(); let options = AnsiOptions::default(); let result = export_to_ansi_with_options(&document, &options); assert!(result.is_ok()); let output = result.unwrap(); assert!(output.contains("│")); // Table borders assert!(output.contains("─")); // Table borders assert!(output.contains("📊")); // Table icon } // Helper functions to create test documents fn create_test_document() -> Document { use doxx::document::DocumentMetadata; Document { title: "Test Document".to_string(), metadata: DocumentMetadata { file_path: "test.docx".to_string(), file_size: 1024, word_count: 10, page_count: 1, created: None, modified: None, author: Some("Test Author".to_string()), }, elements: vec![DocumentElement::Paragraph { runs: vec![FormattedRun { text: "This is a simple paragraph.".to_string(), formatting: TextFormatting::default(), }], }], image_options: Default::default(), } } fn create_formatted_document() -> Document { use doxx::document::DocumentMetadata; let bold_formatting = TextFormatting { bold: true, ..Default::default() }; let italic_formatting = TextFormatting { italic: true, ..Default::default() }; let underline_formatting = TextFormatting { underline: true, ..Default::default() }; let strikethrough_formatting = TextFormatting { strikethrough: true, ..Default::default() }; Document { title: "Formatted Document".to_string(), metadata: DocumentMetadata { file_path: "formatted.docx".to_string(), file_size: 2048, word_count: 20, page_count: 1, created: None, modified: None, author: None, }, elements: vec![DocumentElement::Paragraph { runs: vec![ FormattedRun { text: "Bold text ".to_string(), formatting: bold_formatting, }, FormattedRun { text: "italic text ".to_string(), formatting: italic_formatting, }, FormattedRun { text: "underlined text ".to_string(), formatting: underline_formatting, }, FormattedRun { text: "strikethrough text".to_string(), formatting: strikethrough_formatting, }, ], }], image_options: Default::default(), } } fn create_colored_document() -> Document { use doxx::document::DocumentMetadata; let red_formatting = TextFormatting { color: Some("#FF0000".to_string()), ..Default::default() }; let blue_formatting = TextFormatting { color: Some("#0000FF".to_string()), ..Default::default() }; Document { title: "Colored Document".to_string(), metadata: DocumentMetadata { file_path: "colored.docx".to_string(), file_size: 1536, word_count: 15, page_count: 1, created: None, modified: None, author: None, }, elements: vec![DocumentElement::Paragraph { runs: vec![ FormattedRun { text: "Red text ".to_string(), formatting: red_formatting, }, FormattedRun { text: "Blue text".to_string(), formatting: blue_formatting, }, ], }], image_options: Default::default(), } } fn create_list_document() -> Document { use doxx::document::{DocumentMetadata, ListItem}; Document { title: "List Document".to_string(), metadata: DocumentMetadata { file_path: "lists.docx".to_string(), file_size: 1280, word_count: 12, page_count: 1, created: None, modified: None, author: None, }, elements: vec![ DocumentElement::List { items: vec![ ListItem { runs: vec![FormattedRun { text: "First item".to_string(), formatting: TextFormatting::default(), }], level: 0, }, ListItem { runs: vec![FormattedRun { text: "Second item".to_string(), formatting: TextFormatting::default(), }], level: 0, }, ListItem { runs: vec![FormattedRun { text: "Nested item".to_string(), formatting: TextFormatting::default(), }], level: 1, }, ], ordered: true, }, DocumentElement::List { items: vec![ListItem { runs: vec![FormattedRun { text: "Bullet item".to_string(), formatting: TextFormatting::default(), }], level: 0, }], ordered: false, }, ], image_options: Default::default(), } } fn create_table_document() -> Document { use doxx::document::{ CellDataType, DocumentMetadata, TableCell, TableData, TableMetadata, TextAlignment, }; let table = TableData { headers: vec![ TableCell { content: "Name".to_string(), alignment: TextAlignment::Left, formatting: TextFormatting::default(), data_type: CellDataType::Text, }, TableCell { content: "Age".to_string(), alignment: TextAlignment::Right, formatting: TextFormatting::default(), data_type: CellDataType::Number, }, ], rows: vec![vec![ TableCell { content: "Alice".to_string(), alignment: TextAlignment::Left, formatting: TextFormatting::default(), data_type: CellDataType::Text, }, TableCell { content: "30".to_string(), alignment: TextAlignment::Right, formatting: TextFormatting::default(), data_type: CellDataType::Number, }, ]], metadata: TableMetadata { title: Some("Test Table".to_string()), column_widths: vec![10, 5], column_alignments: vec![TextAlignment::Left, TextAlignment::Right], column_count: 2, row_count: 1, has_headers: true, }, }; Document { title: "Table Document".to_string(), metadata: DocumentMetadata { file_path: "table.docx".to_string(), file_size: 1792, word_count: 8, page_count: 1, created: None, modified: None, author: None, }, elements: vec![DocumentElement::Table { table }], image_options: Default::default(), } } fn strip_ansi_codes(text: &str) -> String { // Simple ANSI code stripping for testing let ansi_regex = regex::Regex::new(r"\x1b\[[0-9;]*m").unwrap(); ansi_regex.replace_all(text, "").to_string() } doxx-0.1.4/tests/fixtures/colors.docx000064400000000000000000000453311046102023000160110ustar 00000000000000PK!word/PK! word/_rels/PK!_rels/PK! docProps/PK!H1[Content_Types].xmlPK!R _rels/.relsPK!8docProps/app.xmlPK!?_ZyydocProps/core.xml1970-01-01T00:00:00Zunknownunknown1970-01-01T00:00:00Z1PK!t.docProps/custom.xmlPK!^word/_rels/document.xml.relsPK!5m+ + word/document.xmlColor Formatting TestRed text Green text Blue text Orange text Purple textBold red and italic blueThis paragraph has no color formatting for contrast.PK!ɩfword/styles.xmlPK!4ŵword/settings.xmlPK!E@44word/fontTable.xmlPK!h.YEEword/comments.xmlPK!$ $ word/numbering.xmlPK!n}}word/commentsExtended.xmlPK!H֎ word/footnotes.xmlPK.!Aword/PK.! A#word/_rels/PK.!AL_rels/PK.! ApdocProps/PK.!H1큗[Content_Types].xmlPK.!R _rels/.relsPK.!8 docProps/app.xmlPK.!?_Zyy docProps/core.xmlPK.!t.큝docProps/custom.xmlPK.!^큳word/_rels/document.xml.relsPK.!5m+ + 큈word/document.xmlPK.!ɩfword/styles.xmlPK.!4ŵ큓word/settings.xmlPK.!E@44w$word/fontTable.xmlPK.!h.YEE&word/comments.xmlPK.!$ $ O*word/numbering.xmlPK.!n}}큣3word/commentsExtended.xmlPK.!H֎ W<word/footnotes.xmlPKZiFdoxx-0.1.4/tests/fixtures/comprehensive.docx000064400000000000000000000273251046102023000173620ustar 00000000000000PK}\h΃[Content_Types].xmlN0E%%nY X]B%==$4BH̜{}c+|юa:# unW}1Kd;0DA`dHсJH_ 'Շ\ BK`)OFOɲyǯYǦҹ"W,uC:&7V|YKy ܅ Die4<2+w1y}!KO/0Slkq!N_: B`)ov:Yh.G'A|ΡyQc53VXexts.V;TIN؈O9tފ+Hpǫ%@hr9V9/'뷄;h+F߈BSu_! d=ZtB'PK}\w _rels/.relsMN1 Fy Bi7RwXg&QB=! ]trsq1h6-(&Zz oIj .U[B0[bT8ԟ.fORDzƋLNAm^Ž] EȈ_Jܳhx٢,7 Ω{`NRYos_)Qӕ>z$&fzO]sIfW$>2_Nxp7PK}\r 3G,word/document.xmlZIEWqOV(q2, 8\.+j "8!H!n\r:\3A\ ֝cݵ^#E}"$^(DmzAqpqRh <La(囥a} ˅$Era[DJ繥ag~C0aTaZ42D_V'L"ʈγt R z,eQ\U9&uF]{9ca,TBN<]'nQ<1.\RɕnhGym.`W&E seT xxCc+^tKnMw4lC:VApAW<o%ޛD*EWխ vE.1%FQYKG5p5xcǞwc-/.tWqv$~y6Grq'Out( j (G7Zj(vT/ < ߹=L}8) ֯=x_eo7-4!SJPX&8IXoKJ{Vnv`M mQu&n)%5es"*:Lݥvi3llc ) 3䬲a]Xݩm~67F9_,3 ytޒii0KfʶhcWt:Hՠk&ς61#bJ*&OX@POaͅDuGDDJ_wFo#o' #p4׼gZ*L|B0.<=~tN]GMw_|??G/y&c 9:ܕ&zE|&@,Xdx3z#z8KlL\Ib]㊴>DkHuNşoƹPK}\ޡword/_rels/document.xml.relsN W!NͲdZӏX3uo/Y:7\6rz`o|o"ˁQM+߬`Y? )~,,1^@G4>rUZ̎hBiӒ£k(իl/||\diLM+Yuhu.jPҵHx2Ӏ~"mFr&Ԇw3#cSKkՀ.:ZAamFw8"QX2fws1?KLPV("M~|PK}\ٌ#m|word/_rels/footnotes.xml.relsMA! EBw.1n` V Pb<,]~n>4qp,_I};\`]ԇ1U5#u{WD3T* 21[JMd\~PK}\Dword/numbering.xmlřݎ0_Z hM&fvuUbZy}}y-( Fi!?Ӟzm1t80t 1]z?ߥ &(JPAFT1D|eK,\8@ ψ0YL&*ߞBO܈r 'n4Sh SEhm \J2ތla`poAx^:(BfGK'+.I/[<) ڶ = 22ו!' 2dlKj8ݓ 0l$*[;1Mx6v`ߢyLrߩwYS;!ZbEl^;G-0OO NBBRuqIȲ)5P*k+bߴJdmy7-R_[oM ݉Dv'7T׶Bf~ˆ:Nqg-U_GM `2%At2W&eUNC b2#AtW&I+]beM+U*hӡb׿ ? ?s5ΦʊIE+%]ߥ00f;avi'̨0n0׾>APK}\@2 iword/styles.xml][wۨ~?e,ǩWN'ɩ8D:%],%U6 l@cA=BYȹ{1r/_7zzن^v };xrCe{"22#t`<j m@蕼zh'ў޹(w^"! ouGuaU\9=iY[ ^􏖃ǥY}*1=U_Z,= ]>DuL~` 2M}OOe+XjJ ͒GufuӏC͗ 7Ļg1+ =5u%&$?BkLBmmvF[I+6h}v;u_ﰅE:`txp" V "OP{M[ް+ڬ< 0=:c!zhœ]~'dzaZ:ŠlyG`BĊۀtZè8Ȱ L#"=rA4Aׯ@&-KR+twt^I e'N4އ$DEl(YZeo1"n67]?wqp9}yS,'># ) :D#ҿIc("e-\Yu2d 79]gZ^.,py=fIKtQs'J"fѳS!]~ro&Q iBǝ8C%KDQQL̲Zk-#$ʅfE$$d|K>ѱ*~]Fي\E-B`GzQRy8o,o'N-A&Ͳ+QVL/Ӽls;::Ĭ\'a,j3X)R8+{pj9{BV`NOJF8@%ǝ_L-t֗V\vR+,i/<Ꜿh3xE[`(,dM ?>uo׆w߃önm/}] o$Rڍz]e V:(_{Tݭ ɀ?>o3&1/A쥵Y-WϝpN v]u (O#$^1[r,M-G’n_E X/ =yu-)kҵm\%I{'|blgVYWY͸* :%hqr}ʺu}{˿77}%T%zOL/ 5*b먤KܩL@u.&4!xɍHQS7dTAثwS13C JJvN\ךzdr&wiReb%*.HO"QZ(QS{ k}tyUI*:_nWOvQX&MonĂ -qLO:-$SmތuNRDe8VM fGwz^\b[J fNR~hDnN5:Q( /|f٢8Pl6Rdx> ď]+@e3q l!DRt}I܈0'A^D9,y#euyNk AG,=nƅ"9qL3 !D938 ߠ iް GaaI%z 72)5J?dyraoЀ&ƣ5Y:t\FVZK/攈7_ VҍPDP'Ư},/\sj܅'|fI&ȦYSAɋu!_ 5-\ Ή t*@ քva;tk%d4n%ɢa,@a=u_?q륀9qo;Nq%6>Ak~)&tyx,J*O7PK}\iKword/footnotes.xmln0 _NCw&R=@BD6d{l]MGl}! _Z돵x;/bTʒSk3RJҽq6O)N)el6DT)`6{У3 bD_^P\+ϔ˳(-VOK[jd-zG/O?ObɟBg&(T (Rٶ(fM8<͙l*97ȹWu[|{cCW 5_PK}\nqword/comments.xml W S=ER  4BƑX%$28c5[b]#* vZqtL YV 1%%sGn2!uX( A;/0 ġ !;.b"gX %1J0oV^3YG:YopfSqx)l0^(JPK}\ٿl.bdocProps/core.xmln0E%>qUQ VT, Ď9q\͏4zF$%hnԛjV+%7>PB%3E%oA1BpmbJtJ  텱|TڽkZP,Ep?lx#}rKb@yV4RW(zau/Y4]C;p"ӱP(ŞG(С v'>Ҿir Mt1K 3U6n;nosnm6Q]DZfhXd#bs%@ybP7ёPaj$tDGȠ%sPօjNS== jB E)c~/W_$g։ڱ!I@'<ญC6΃b]88@K o[`An5Kr,Jvl@̮$re|}  rq~'G=35+~#= 7Щ^բޏ_hN- .  XPZK<नRP?+=Οgn>M&q80yޣrhJ5'am"\l%:aGlň-ˀ]*`XSCKة5֐=4`1^ e^m'aRރGgCP+S<)w PK}\dNFddocProps/app.xmlRN0+܉Kyr]!)-{X8enӆ 8fm1Vq5/ pkUo.˵l (piUv9%cIuT!i|e67Qp[.|~#ӠhX_Sݗπ~bVG gCEئ4jE#mξPq麓}Mq񂳡"*!K$9>M5mCodÆ%3>&.9W8B<.Jq׋&HWQ2$V>RĶ>(`:PoOKgikӃ8GV5~1y88k ~E&@=T̰'PK}\ j,word/theme/theme1.xmlZMo6WdK?I4niS@IОv0vXvXhu?b;,n:ƚ"}~㘆uúlpT71Eܸ~UxE(@@C~ _J=9 eP ) lT0x,iRM-a YCS.0'<KF=d4Ҙ'+ck<)o r=Gr!'ꆙGQ!DLu.EHhtl_Z؊4xfwOáIZ),5J-ht*V)fYF۴y4%ƬZєh4 nJy4iTN R*!%;z뚕ʢE-qHC&xHYWSv'PiГF$(m#`H6m˒aY6o &S49Ec8uH}W'O?y`|#؁(Moy%=v onP$W/|_?? Ӹw1Giݖ pac3M&qcr(u೉:m?P{&ez܎Hn&i=b2ԙD2.vU*8B! ct+糇=F9 &zCp_wp z]bѽIv6:R!2h!nr 7D@ H U`<ฐ4BqeSEPlgiBc-dR C? 2R اB/Uc8~ #q u_&|gg&L9dJik@)8 ؜PEc8@ܿ҈+v˗ri-z !?.=nu.9hD׉7d) uggdц Ja,8k~P ) ϝ$C`Yߢ=HPs #|l ~'&{q˻Խ-7hM^|ckf[] -Ѣ$G_tEEڬtї/ҋKtv_;= 1!bJ.WY.ڠ+gFg 8忊2\DL ,FR&0,QQ.hCZ-TvݬK{tp~RBqtV/]-s+U[SCշU2?µMZl$#nu3+t Lxikc'ROE.Ҏ/['퉯&j؛i\ne|%5NƬan$!8m<Ս!H(`̭Uޕ7AG6 ʀB d[r0GMˮ5{G!D2f~ʹtt"tAL=(ԩXY0`gUy %? ' !|xNjګr.\uW13zCxދqTSC^-Ql'ޚL٬< 'mRfѨY6RJ gvnoAn$Xz4.Ch'D(z$l_}#0\7NܲV:BT6 UQ*4dul7'g0,g&PLOߧMƗީ I=irSL;Zl7VնBnj(lm7ds'8J[vuےf)4Vvvۦ\\<3s,}ҿPK}\>\`] word/fontTable.xmln0y )梐7v3Q`8$CVD4鷗7/R3JpxE0b*9W???f*B+=|-E>W0 .AY$+]1BI{5@؃ζ)D\ j]i(y]j6yet\R֓+!6ꅢ}[Y ^E:{GEID!{YI 0{M:^A%5Yy4wp8w k`D)>(aS_VN ik%pJؙ /0=qb5%U}"rMdMx<e{lx=_`N&wgKB*A{*׮IڲVC uiH WFIZzk83~5u>Tn,sfޥU}a.S򽙢;R}R#H]꒣DENV?PK}\TΜword/webSettings.xml];0DrOl(M"L$loBAA9FS6/ ,Js-GJo$:+bG)1!VJ)-R4 @`M'a:h}T LqkwWa gsZ^;PK}\h΃[Content_Types].xmlPK}\w _rels/.relsPK}\r 3G,word/document.xmlPK}\ޡ& word/_rels/document.xml.relsPK}\ٌ#m|d word/_rels/footnotes.xml.relsPK}\D word/numbering.xmlPK}\@2 i word/styles.xmlPK}\iK@word/footnotes.xmlPK}\nqword/comments.xmlPK}\ٿl.bdocProps/core.xmlPK}\y%docProps/custom.xmlPK}\-(word/settings.xmlPK}\dNFddocProps/app.xmlPK}\ j, word/theme/theme1.xmlPK}\>\`] 'word/fontTable.xmlPK}\TΜ)word/webSettings.xmlPK *doxx-0.1.4/tests/fixtures/comprehensive.md000064400000000000000000000024501046102023000170150ustar 00000000000000--- title: Comprehensive Test Document --- # Text Formatting Normal paragraph with no special formatting. This paragraph has **bold text** and *italic text* in it. This paragraph has **bold** combined with *italic* and ~~strikethrough~~ together. ## Heading Level Two Content under a level two heading. ### Heading Level Three Content under a level three heading. #### Heading Level Four Content under a level four heading. ##### Heading Level Five Content under a level five heading. ###### Heading Level Six Content under a level six heading. # Lists ## Unordered List - First item - Second item - Nested item A - Nested item B - Third item ## Ordered List 1. First step 2. Second step 3. Third step # Tables | Product | Quantity | Price | | :--- | :--- | :--- | | Widget A | 10 | $5.00 | | Widget B | 20 | $3.50 | | Widget C | 5 | $12.00 | # Financial Data Executive summary: revenue grew across all quarters this year. Revenue results: - Q1 revenue: $1,200,000 - Q2 revenue: $1,450,000 - Q3 revenue: $1,380,000 - Q4 revenue: $1,600,000 Total annual revenue exceeded targets. The Q4 revenue figure was the strongest quarter. # Unicode Content Chinese: 你好世界 Arabic: مرحبا Japanese: こんにちは Emoji: 🎉 🌍 ✨ Math symbols: ∑ ∫ ∞ π Currency: € £ ¥ doxx-0.1.4/tests/fixtures/equations.docx000064400000000000000000000345471046102023000165270ustar 00000000000000PK!ߤlZ [Content_Types].xml (n0EUb袪*>-R{VǼQU l"%33Vƃښl w%=^i7+-d&0A6l4L60#ÒS OX*V$z33%p)O^ 5}nH"dsXgL`|ԟ|Prۃs?PWtt4Q+"wa|T\y,NU%-D/ܚXݞ(ŷ@2݅fo(N."}1躕 ]6!,B?;CG!6%PH3bb o\4[ Og ,XDr(qtc`XE8A`-6,WPdA+\| U=uq\TG . <&hYA!-tKƄM[uhϫkZ1V M,+<ȼ_)MS1BKKxoµO1񆺤$җ( Z-^سޠN-;5>KͲ-nX+'\M,sQ \oj2zCCu &,U`V=?6Pu]@rukERe@ ZWtQ\^ -~ n _m":ns}`^K;Z)q1-m9 0! 70щi.>DFFҔR4SأϩwёSRbnhY5' HvR +~,KnR dvƇ|+$O"3Gа׈z`-Ol cKg팅q=H5]Cy#9)|YS8ku]M Y*éb+~vl֡K- ڭ brZQ?l*;dd/a{5N/f.UoHJfT:Pgٗ:i+Vm~mK`bMsPӖq{L'AnW##]~My< #D[Ӻd3*U!Mg+:93hq`SeXeh+RuT *|?i>Œ0,?y1+Jxlt^y#X|F~DJ{b*fhyQQ|Kvh:49/yJ]g&*وgZ3% aGcf>hD&TkcQm$mŠma#u_~JGk[ޔ]:2MDwjJdʴelLdfW.3qIcVg Ŭ_P_AxI/iN4=t,m&-=FG/xwjye:m]@B,ڝ/=7bL7?Zk[ӵ)2#1O^PK!dQ1word/_rels/document.xml.rels (j0E}-;}PBlJ!E?, `HI`rsπ6w{r茯{*xAkWk*`[^^ljNKD8R1d:4e>K/4Vm^urw2NP0ŮVw5j o7o:>S!?p8JX[d0KDEVKc2P,ũa].ﰘsYҡ+(!O>zPK!g word/theme/theme1.xmlY͋7?;x?Mv%(֚ ɻ1!PS/BZz)C) 4K6#*ilt󱡡#~zYsڃ8Q)]q1o9wB\h PY \pG(D@G|@xXc HM) M' J!)z[+G`(ޞNR쮔 :Ƅ)Ȑɬw '9τ-Nqjq-DDlFnrKrݾר5m\>k}c҄K[܆f@ɣEw^*fU %5^kPX·],x Jk[J]^6Vo4jK2d ojnb&HZ)Hv.8b)K\;1 0\v^$z돶8A0#tVXR|ǿ=yr@X`g^Oy/_ǿozw_S ( qp ;4 LF$YvsA%cAE`o- \vdϏ G l Bx@)Pf]M5W ȷOYOlsw7ܟ2Me7@C"]}!!daт s!=#BA8f M(dH&̆܇f=:0qd QQmFwe3ۖ@܏ 2ȦB#ŶFGgp Oc)*{fЌUՎ*n,#>ijQY[33d#&7-^xfRԦCc}Zhjs{.7cRd[ƶBbLboKRp*[MP(zBS7Ebj;}Y6+.e6=8ZzENkj%a$MD)_y=gLsٞeyMb>3:xR^p{sQ{_Vé7PQ;`}TaL souF*aԅ0! r;bH>0Bd}?Z1jӖbH.6.(K<[6."FIL!ՎTʱepH'F>߰ܽ-J+ĨK.pbKTVgG")yHW`c,0ryqqB/hԱ#ƒ"s C:]@$H63miw[.$(=/lyX?[m+PKi߄`}Zaùy84rTUR; s$O1mNc} \m :'aKDrSؖk)+B/aLJ8ŭi0xp`/ZdVK-26zC7 C?o$!/>J`'2^ȟG^ak(;;Z)ƻ#e% kkh"w[+-Bknjs;i}o_(,W&SvH0fD8^M&dD2MiB?e/Ersss YE:iۜʍiQFUtz %۝Lsjx+sԾd۰B f_PnV֭BENuN8]N766 #:'})({\v+r;9Y.SKH ,i!;smvA˸{yi;(_p@ -\ЏjxaǓ,\LY.$ f?9p).PK!pe(word/styles.xml]rF}ߪv]HQd{ZQ,y<""ewnl ŵqUD39} IE{?< (N/ܽ}u%K#d){?o?>S‹@"؛||%OY/X) ?lde<|?:8J6!OKeD fi1E1ˣe(I/`qZ"fdL0?ؘ7h5BrߧYΦ@^ GQ7]0K1j? FY*) 5WMye<";_"LxO(/{¢6_Q/[|y*vebzør-;ؖW_nY=T$g*qL~S:ѵ8\DoFkMrXuJ.@ e=:9|^I.٪L# @ac"؉w#g;.T[b7y"^읝|ց_BQx%9֕g6Ԩ?T+7V"\eCÑ7$Tq[UDn|r }Ko!=S>k j*.-A7t:]׶qWUJ#`f,CyWwhpWd wc8y8MKB;Z'n.\U /inF@B3 KPX!ƟjM5F,Kpv#xQ `PTC(? K5DR T ;aPTC(?K5DR TC/?ʛjG5ȒTC,K5DS P]T*JjÖ9nf.Ȗ!.8[ْe-Y-٤FKŧO Ͱʏj\FPXqْj\I5.[-eKmT㲥6j\I5.[-eKmT㲥6qR/NqR'ոlM5.[j-Q˖ڨeKNqR'ոlj\-Q˖ڨeKmT%'ոlj\I5.[(LbW@.X^t{NJyɆK"K(=l,%RR|sHG2UX$0ͪvnQni7zq+”Eh|M uEɝo6\rΜ|U3Jz;>(PpǔכC) zYf,f-%zOu@8vzyn#P*yyc%`|d4>0y>0}J; gߦCUp|/_ "A '߅7Ta:7O_(W"ةN>#97T<=l;hf AjyM_pǶw)}V.;DS->O=J/{}cJI飳ЄϤ\>΍S>W ~cVYhonK#ӇU!VٿF-ufgpF@kՁ+w0wPMp(="^T. "æ.JURvev>s; doCt"7/|̔+S)ɌJI%#3O#~+Kr.fr| a: ^U+CUbqfaDv:r.++m> bdg(.yJbϸb\'m;W op vcZf,C[s1m'uEO_}_TWO2r!xԧݳ,^A}斤 ̙m]DF!CZ~C/ l~5kG խ>TVh"$lI3v`Y=5֚jkOS[1l_yWPK!&Ho-word/webSettings.xmln %{{:5Kc5Y,K=©%\uO?xcwS7_J:&'aJ04|}$qY.uV$(e(u+0a@]pr-:Ni{E!9<#i0ɧTѸRVշh5ZQY\XVGO3ihri-:,0,B(m"i?`|8ACfב3;;RtĮ1~8ޱǝΈ\Y\y)8 o&۴͗XP;Qkc='=b\>S 3mz?C7X[b%|-btoKеU&B3o3i"̎h=tB]Կ+fAxD|FdJև F:^ҏS 7š. ~yk̓o)I2~ sqBi̇$?E2錎]b< !r/` N-*( *XԱOyYWV+.:^qp f:.Ӱ>uaa#'u"fGai3Cmp0F{4zZwHÛPK-!ߤlZ [Content_Types].xmlPK-!N _rels/.relsPK-!x iY0xword/document.xmlPK-!dQ1;word/_rels/document.xml.relsPK-!g qword/theme/theme1.xmlPK-!h- 4 rword/settings.xmlPK-!pe(word/styles.xmlPK-!&Ho-*-word/webSettings.xmlPK-!d36.word/fontTable.xmlPK-!6*Q.1docProps/core.xmlPK-!F!tu3docProps/app.xmlPK 6doxx-0.1.4/tests/fixtures/images.docx000064400000000000000000056614241046102023000157710ustar 00000000000000PK! ! [Content_Types].xml (Mn0z¢EQHUHzlWrdǷ/)BȖ\E{}*ہҚKVHSӷgdF0e ܮ߿[=,M(}4-hrJif:ƟYrrk .0yJV+̾䷃dwmc*ɠ)3%Kzƒ $9%9X;#^8Ge҅LB3 T9uoKE *,uTmze)9tBBZ]E3iNg9L7A:A Zx@9΃{va ?} ~D~cs!0{}N'K[O^āxA]b<Kqm6Z=9 ͕vPK!U~ _rels/.rels (MK1!̽;*"^DMdC2(.Ե3y3C֛+4xW(A yX܂JBWpb#InJ*Eb=[JM%a B,o0f@=a noA;N<v"eӨbR1REF7ZnhYȐjy#1'<犦7 9m.3󭄓YPK! ! word/_rels/document.xml.rels (r ;d7W3Fu:L7)ַ/5L%|`` ReGP8ig7(PChx}5xhI-B WZh]3g6 LAGA ? H>o M%a.z[ŸuƼfe\E phm§6eR6)iIBBb$/ pxgdn\.RQag\;!BM`v| m8Z% |u +&g.Gld $eT %R*w $ٜDa_quua鯿%h<\F7,x+* O"Qg:"vPK!bUD&word/diagrams/data1.xmlZ]oF}_`ÈS' ۗbAKt",%$ڻ;,Kr&GcrWz{vfqZUI3-ޟ%QחiY7괸WɴiU ʢ;C/On򡚗݋fY-M;/{ؾO?c9m9/6AB٢xZӲ7<M)q)J!:H3N IZ9uY%d9m&7wU?3q.|6i_LMͯX˶T]G >(FuOl򟮿q7/8b49 𤩛Iɿi +F~5,m {4G"H A=J6a !?0^Yu΍nS7LyRw2_m;Lj~yn{9|mW&<`."&ͨ (d#B@KπM>0βlrW56hIr`6gdCRӷe[qC42?HZő< aĵaLu,7M)xJ92\{ǝ^]WJE1)H%V gU,aǩ J8ĤH$n #!Y+,NFF"i vZ0㘡:T1 sAN@9RB",PPRbXr^!BBĀA4X)kx\RTDNpఠa%!|Lo$Kͱ. !\!c:'iق1#(Lخk&pr'VEZ^Zzn:8oxֺF5~UNU}}3 ad0Qb!B4 &h {m2Ì2 X0o\vi7W;G;몏򼮦kVf3Rx &~4c4qOlOA; H2!x/46IaSKc}T'bQM]8- #HDJ3Z2`w'd݉DP ) $$r @wZE^%D0HDZq˘_,CkZ-q>zu92Jt.00KxH-п6 *G2F0| Ozh%OŨk'O3Lnu1"!Ot%7| m赏gt A 1 " M( 抠7e ($]-qvrpYPΛz7Fva#L;E~CsaHXE@~ݥ@Wi6@'PλxNGa ~/0.j% L U =xҾi=j ;^8M1vZGag/FJ2B<-r: N10-Lq]$t0fH0zp?.ੈIX Ρ{h#>́ˁv, y;T~daz^۲aSeJ?(q'+ +I$j9Axb- 3&#qHPʵH~=v:H $Yr%K$4$4r%g2ቖnBnҀcF N-tcAP$ 3Ax⎛ b KB>)fr@rSBX>k9<&/Tj(?>4qu>*ht>zMl^Tʷ7 b}{*B TaG!Dlk>ㅬ* F7>lWPK!t"WG9word/document.xmlZ׎v}7~QW3'\0 Je(QbH€ÿ/>Ru=S@I'.n>~gN} >7W_ĉ曚ׇ?߲gI ׇu5 ig1 xX`ێaaYx 'k^NpF~ilF4f(+ &`[ I-P,zDH1wn1$-cH[$ǐ޸a"OK0Oi8:0q 9$]2ü\<_ȯ?^#kewYYyyotʉX a?^;Ed-=. ;C#jSJ3\d;-%6"aMqq/y^Ts\N9oXú3Y1f\8w q%wAY`fbl# mŗ);H ƅ}Jc.ƆixEs~u O߁u [NZ =ZA.H[@hZy1԰]0 ćߡCki-!ReabRhF9Sha9 IS<R,[K4)* *1k{ o$vYP|$5/u5suI%*7I.kN 7- Ļ&+Ғ 0u})-sLI˱4p "J*I=RҢJ{BdYU8;[;ڌʶ 1v5mV8cG`ii)B39NNL@%]ZK PFMu72^ף t{yBei KBCC082 $7mHZRC%*>uYD}̓P8FFV90=H]΀f@@#rV@`oDZv 5X,:ʜy V8;iio_gz@֫[s3A^ĂO{"gU1AB4~ބ+J :.{ԮD5-E!ɩU_$/@J2ˏ4E Gs4@Ȅh7|#\%t6l9'(pt]7dJ5jp#prePQ/.Cvou8]T·"n%VUP4 2 m$N)@фbōOˀ(ɩ g})bK& 4fKqY/)cSTT@4J 7*_e_7Y.Y$"KyNG"Qos*"GE",ɳh&|(x A}L+6C%jS%EƉ{EL [NJ ݬog~?Z3DK@0r4f/ia ۓ ͒ļ<*HסsT9^"u(T(p2>2ğ_d&9iJy)Na)JiV% KdI~7ӳqr[ ߏ4"xsE)W\}ޯh_0b42(P z.vpY>$J@1.uxP"PdZt@)8fqbLx#/BEnRk`o>f,p2 cGwծɡ=U@^[ .&fʚ@o*$ہ_~ C8Z9bxBS !WtȻogԓ@'iqqEtUD玜R!Ţ] K!_3- OS/8+ע ?$bS?K%!I#ԶȪp6=J!zIq 983GBPsVHOC%聛.րjYܰV4]Gя2Jt7SH{ 㞶9i_x.2*V!y}=Vt-d•_8}}cE["2::cl~] ώ\n̎Nx4rJWG|onS+]mj%̆jq<}lƌ+x3(o&Iޏv5OOe-ϸ9[ި+X7I26{gzڎLa=`XZQq#CdSmWov^Qf(viU/#{вLof,Ł#KS غэ-2'촽2KGYv3t]FNBcd$ƋΕF;m>;$$.  Ge٢iF402,V%rCn^ڰ`[c΍DVJ31:}O"*4Ta„=>NTVS2t)BCs7WHяg. T͗WAs\EAҧw6rף8~V:MYzmӃd _|PH{Y2VxSŏx:Ug5y;Y$)pMHfdQ=W\ndX8 J:䚑=s#Uӏ+EMm,حD$5s3z4ʤV?t(`[mJilo: ت(-jl`nȘWTX)it5rV]/\0;6Ӟp{n$O6e,xypǺ,2>Z8y-j+*;jxq*ch`ٳMLu{E=f?3y8Mh?lpd]OHS;/:%Qv:G, fm ~%{*>QG=ڛ$s"D< 1+5?vFIr3m]lN M'cbߐz^k.ZRf ypzk:MӪu\sYS+!8qIbVFwiȚ(R-mL5vVm7;LC |d{ϭ$Xԍ*w KȝwE\ڊ^`AZshXMևfܯfI+JydHvEY] ũ(.D@IХ{de-Evw[\Q_T7D#ynP 96|Z|+^p~Xw}_Q 7JJtPAFDPo0WHM* "C1a3[ĹiC-tJ9EgwzoC9tfI|ɼR*%&c\p>g}1Gp8%7mY՘C^#}kxRF"6]ּBCI>q\*Wn9£nZR3F֫!Axeẙ֔A ZSG#PBT3/Eۉl= # +PwIju3l5hy% ꈮ4E0zl+ -,lVygsNqp96vPK!h"PsV word/footnotes.xml̖r0;0vδvɭa߾ #$]iWݟI朰)[׿\SĢ_Hi3Fֽ`~+˜1E *Â(C$J0H0bu,SAD a){HOP5" -6@  [?r 6`@QK`@ڪvsiOZM#4R8gS=3Aүo9i0*}MT]4[Z L!y4E8G¶n.hXgޘV(p6lYʤZ1$vPN0UeԀ#2IySTL,QN$ LC -pޑc MhCL{Mk ']xRh: z%/ X 6t`ZYN+tQ> ̭aT=F Ll" %.:e 506 !?~.Q~Ԗ|=` -BsƼ$JNPtLL[;`A6e9?u#L#S]+)Bu(1*&\eiV.B3;o\ܲW߱ꟑOyza/3:ꌔ<$HXa}xF&yy΍0W;+uՄ:{qĨJi^U/]b\xt^PK!`P word/endnotes.xml̖n0Ww@ܧrFMٮzjP}mBksޒl.{ޝ)qNXxQʎ;l:JCA޹ܻoyYĸ1\h-BJ0ꆦHrc}8 4d `@Q+`@ƪi9tŹ4R'}fwhsPWyL X@$V5}EF<MX#LQM;7,FoMK}h [,ҵV])?pQt5 11qL%hJ3I 9}%\S_PnC b~wNib Y[B nNpŧ= ၗET 출t`Z՜rW,'ml"v؇wX*Q2WZaU4%1XjC,ᨩgm/D)y&ZZ5S[s4U%|@a*9Eӑq ߈Ȥc2)vlE~{~FLl#[}䡾TX@ 54y{21?nkXm{Jis=ூM0#3RIP"㩙 c͍YImEYa ځrHkn#tʲzZjF/DmPK!Y T word/footer1.xmlKS0vd;!$pd(zQl9qk=*yJq h~ڕrRJ'u塈;O'CiCxDRQ\N>Q62;+cdW}ʒP -bs E'!"컞KRj _픸pێ)c pE=;rGx@BkzGF; ?t#My7RIv#5knp!)P%fD %1"I;0$:DV5 瘉)' =(ˡi;n֤TM 3FɳM!U"᪂K{s[T"j6!YE`wJArͧ -?cX2p?ݖHRdIя-2|D 3Of4% Ys%D\ ~k |0Lz$Ak8hZ\[6+t8v\kՔ$K}^ SsE)_e+Oq41' gm s8NZ@. Ô՘ Ul#v)hΡ@==bF(:Rh>Y+20tWZcҠit{j?Ps\h[]nk)pȞ*%|c⑧-)lQey~QgGmݷסKP8lXqc1hjS3cM?otx{Li p`%`Z"'sdѸn5>jX^68"?H3|7HK9\HFz_~d QOR4Vdh *8(e8W;#j)(wp ZLY䗺SAv ;XCgOH:]~,bs+yv6` 2|u &͖x f6alL^Mnh X,1zU~s{K)`Q5ͺ3nGkFTWk,K_}*{"y2HZxs1%"P^ǭᶌdٙ XMu!{u_SZT顠':?~}]wJe>hvo^~c&}XYN=*˥ynsEcmsweuGN!#N %)FN5ߓa6}=_?GYwߓeMulf<vZd9sk憊a7;?ӺE/ :*g!KF$!B?z7@gQӦ5o֞Y-9%[#6_R˶{)s\,Z֓7W._9|ųrYs1zp~|= M7 }kWR}?BwމgNdZ暫;t1{lm LZGfʜ\ 6~Zmn|~&KwoiXo%w~ޛjo5K?ťkg#-:0nQoݯyb"bޝ8.uypW]oʻ,տ-OUU]=᭲uz`g[[~-Sk-{ 'mݿ"bGC]DZI;lԹ;أfwH2/89+"PK {H֝?,ozZwmvcͭ'wk~Gz2ۃ,Ű=q;kvl-s]KVq5v4upk[,3,p#_7}ʸ[. ==?G]-C*L o3;3s/1ؽ=-^uX:hs-@.ߤGf8&Ql+Roc*dYs@\mm?D ' a;Hn􌏣_Gh_͏:??esU>;!\Prtj7ٹ!kL@9r@y73 8Pwe۠ @d T^uX쌁*kIֲswQ,1WIH%]%V|dx$z'K"C4P3>edecÃ-ix?[.UW~mӴ.2 Ú q R΋CHi}LOt({>,k~;VQ^CGFRc:2r,ip}uZj9?7gҿ'{Ybd{GY9LL,*شj;kg7ٿmKKEqp{8~r]k\ ?"_yBֻ[q~{7/yFI@>րqzyWfY Ol-\lyLupjezj^ӎ_feҟUvGJٮm~y;x mca}V[ Kq>戇׆'M; FtX}_`g}?G2u-CP$Z7#t5V\|MֹW^\bcP{gʭqjd?H sL~SwoG@yq{i֗nw޲'O9V cȹSӳbzE33{tR{N+N)Jqk,w5B}Oѭ>\ }^>d m:5[{_t'ݵ;\kFkc走Ƭ˩k[IFp?707oF4@Z~G=bc&GMt].'ҥcfU[zQ@;Hk3sm9ޣ;I܆kIp|—7~M?e.OŠnjsC]6^tZGT&OSb7?abtmpV3L7Q;>gUUC[[E^T1ߣ?n@#Y? o\b' k0r$HkzV;Vc,?njlw#Ogs8Ů?GMT+gwQ,`L#Hdː):纁3m7 k3%%btD8d,[(N0ĂBx7u6x.1? K\[Y{Yo]{"_N=(Xqh~: mjGPm-sѢ\u r:Bv0h}wsY1GC2}d81N:;jWs$;ѰO'J‹}NAϣG^N-bKA X[Omy=1mUrGb6nj?{ڔ "dO^(\;PwI_~YkyZqIoщcv gVnr}y1Zow=+N=̷8~ֽu-m $MOv0:oek;n4c>ǻkCH0@n^jjf퍚40k?ܳ1GV g/!eR繏scqϮ>~T\Zzk~-$VZ5Hi's>;*ԬC:[7vgFǂ[XyGK]N˕|}Rx v啓+i8%nmbg6qp8nvc^|:D}Kԛu]S˜g8$wWn~b^˚0 ^ZC9w3I'+6mt6CL}FrEM !'7M0 G6\;kV~ AZnU>f-'hlo9]WrӋI۝sw/l}/#԰\ͱv2_3sfzÏ,kvPK7w3e~ũw[˧ Zc}G4OnfV=n%3ϧw~?qrXzȸmemcie]KN8H#Yc(z\pVc}~ s?Z_Tm{nq/sȋl.on5mt,L YH5\ Zm{?.Q^;pPHd-{_ٳަ2<14O0s< P:h?&Z6?sjw˶}}?綼cs #n=iG=:clVϢ׵{gBOd)4m[ - kW_}VUqM'>IzZ:x4rfL;ug[NWA}6ۚmiwSzձUDXmwU_}Cc]^E}@{)q{^=nC_GձeS-iomk:{`sY[8SGϣuo_Jw1[,;Ysj+ksSjY﹡v˽:GA5SxpҦ[=wW-"ǿKhVw9{fO'D!Tկ~So-vwL˴>wwN o]$}-*|$g=IۻngwM~_LDim][8Jca]sW;7}.t[$˽k]iWж~̯gnv߲n/}_~U3ݾn=/KJ*`=g1 q;[Pv@vVfEVAj~NRug__[Y@m~'ZLVv@dNL}Pl3.ݿ͏=_æw0O+J_=^׵Ϳ, 5ƺ[\~f]mguc,h;憘s?M?fa۷l}Ol_>+ߺ&k;wߛm}4"w!.n.-G]-̲ms,h0wv9՟KԳfƳo?[XW}_]D}Xoe?lzVl?_?o.gՁOFMs|q '!5KX$][d)ن1H>xv5U?ҥ?';>6DGG/9[>"K|;Џe7h{oɦn.hs]v&ް:LŲ=Ƿp03]l}?k>_ClEӳmo'?K,_Ctgz6۳ퟙۿ7ٽo~W0uP 6fFCn5T{:f߽9v=+:7Y]hC,2ZzlouߥnE'7~饍mn? 20S~',u#&Ƹڜk`!^gw{?BY4׸>e-zrg]_?hgnf QoOZfݯҝqfzczݛQ:m?%Photoshop 3.08BIMZ%GaxBay of Fires Tasmania Australia(NRPtim phillips photosnGetty Images/Moment RFs Moment RF 5225861598BIM%J=lg>*F8BIM: printOutputPstSboolInteenumInteClrmprintSixteenBitbool printerNameTEXTprintProofSetupObjc Proof Setup proofSetupBltnenum builtinProof proofCMYK8BIM;-printOutputOptionsCptnboolClbrboolRgsMboolCrnCboolCntCboolLblsboolNgtvboolEmlDboolIntrboolBckgObjcRGBCRd doub@oGrn doub@oBl doub@oBrdTUntF#RltBld UntF#RltRsltUntF#Pxl@X vectorDataboolPgPsenumPgPsPgPCLeftUntF#RltTop UntF#RltScl UntF#Prc@YcropWhenPrintingboolcropRectBottomlong cropRectLeftlong cropRectRightlong cropRectToplong8BIM``8BIM&?8BIM 8BIM8BIM 8BIM http://www.gettyimages.com8BIM' 8BIMH/fflff/ff2Z5-8BIMp8BIM@@8BIM8BIMK@ 10002048_96@nullboundsObjcRct1Top longLeftlongBtomlongRghtlong@slicesVlLsObjcslicesliceIDlonggroupIDlongoriginenum ESliceOrigin autoGeneratedTypeenum ESliceTypeImg boundsObjcRct1Top longLeftlongBtomlongRghtlong@urlTEXTnullTEXTMsgeTEXTaltTagTEXTcellTextIsHTMLboolcellTextTEXT horzAlignenumESliceHorzAligndefault vertAlignenumESliceVertAligndefault bgColorTypeenumESliceBGColorTypeNone topOutsetlong leftOutsetlong bottomOutsetlong rightOutsetlong8BIM( ?8BIM8BIM8BIM ^kȠB Adobe_CMAdobed            k" ?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?/8!x{!Qc5f>SsE)_e+Oq41' gm s8NZ@. Ô՘ Ul#v)hΡ@==bF(:Rh>Y+20tWZcҠit{j?Ps\h[]nk)pȞ*%|c⑧-)lQey~QgGmݷסKP8lXqc1hjS3cM?otx{Li p`%`Z"'sdѸn5>jX^68"?H3|7HK9\HFz_~d QOR4Vdh *8(e8W;#j)(wp ZLY䗺SAv ;XCgOH:]~,bs+yv6` 2|u &͖x f6alL^Mnh X,1zU~s{K)`Q5ͺ3nGkFTWk,K_}*{"y2HZxs1%"P^ǭᶌdٙ XMu!{u_SZT顠':?~}]wJe>hvo^~c&}XYN=*˥ynsEcmsweuGN!#N %)FN5ߓa6}=_?GYwߓeMulf<vZd9sk憊a7;?ӺE/ :*g!KF$!B?z7@gQӦ5o֞Y-9%[#6_R˶{)s\,Z֓7W._9|ųrYs1zp~|= M7 }kWR}?BwމgNdZ暫;t1{lm LZGfʜ\ 6~Zmn|~&KwoiXo%w~ޛjo5K?ťkg#-:0nQoݯyb"bޝ8.uypW]oʻ,տ-OUU]=᭲uz`g[[~-Sk-{ 'mݿ"bGC]DZI;lԹ;أfwH2/89+"PK {H֝?,ozZwmvcͭ'wk~Gz2ۃ,Ű=q;kvl-s]KVq5v4upk[,3,p#_7}ʸ[. ==?G]-C*L o3;3s/1ؽ=-^uX:hs-@.ߤGf8&Ql+Roc*dYs@\mm?D ' a;Hn􌏣_Gh_͏:??esU>;!\Prtj7ٹ!kL@9r@y73 8Pwe۠ @d T^uX쌁*kIֲswQ,1WIH%]%V|dx$z'K"C4P3>edecÃ-ix?[.UW~mӴ.2 Ú q R΋CHi}LOt({>,k~;VQ^CGFRc:2r,ip}uZj9?7gҿ'{Ybd{GY9LL,*شj;kg7ٿmKKEqp{8~r]k\ ?"_yBֻ[q~{7/yFI@>րqzyWfY Ol-\lyLupjezj^ӎ_feҟUvGJٮm~y;x mca}V[ Kq>戇׆'M; FtX}_`g}?G2u-CP$Z7#t5V\|MֹW^\bcP{gʭqjd?H sL~SwoG@yq{i֗nw޲'O9V cȹSӳbzE33{tR{N+N)Jqk,w5B}Oѭ>\ }^>d m:5[{_t'ݵ;\kFkc走Ƭ˩k[IFp?707oF4@Z~G=bc&GMt].'ҥcfU[zQ@;Hk3sm9ޣ;I܆kIp|—7~M?e.OŠnjsC]6^tZGT&OSb7?abtmpV3L7Q;>gUUC[[E^T1ߣ?n@#Y? o\b' k0r$HkzV;Vc,?njlw#Ogs8Ů?GMT+gwQ,`L#Hdː):纁3m7 k3%%btD8d,[(N0ĂBx7u6x.1? K\[Y{Yo]{"_N=(Xqh~: mjGPm-sѢ\u r:Bv0h}wsY1GC2}d81N:;jWs$;ѰO'J‹}NAϣG^N-bKA X[Omy=1mUrGb6nj?{ڔ "dO^(\;PwI_~YkyZqIoщcv gVnr}y1Zow=+N=̷8~ֽu-m $MOv0:oek;n4c>ǻkCH0@n^jjf퍚40k?ܳ1GV g/!eR繏scqϮ>~T\Zzk~-$VZ5Hi's>;*ԬC:[7vgFǂ[XyGK]N˕|}Rx v啓+i8%nmbg6qp8nvc^|:D}Kԛu]S˜g8$wWn~b^˚0 ^ZC9w3I'+6mt6CL}FrEM !'7M0 G6\;kV~ AZnU>f-'hlo9]WrӋI۝sw/l}/#԰\ͱv2_3sfzÏ,kvPK7w3e~ũw[˧ Zc}G4OnfV=n%3ϧw~?qrXzȸmemcie]KN8H#Yc(z\pVc}~ s?Z_Tm{nq/sȋl.on5mt,L YH5\ Zm{?.Q^;pPHd-{_ٳަ2<14O0s< P:h?&Z6?sjw˶}}?綼cs #n=iG=:clVϢ׵{gBOd)4m[ - kW_}VUqM'>IzZ:x4rfL;ug[NWA}6ۚmiwSzձUDXmwU_}Cc]^E}@{)q{^=nC_GձeS-iomk:{`sY[8SGϣuo_Jw1[,;Ysj+ksSjY﹡v˽:GA5SxpҦ[=wW-"ǿKhVw9{fO'D!Tկ~So-vwL˴>wwN o]$}-*|$g=IۻngwM~_LDim][8Jca]sW;7}.t[$˽k]iWж~̯gnv߲n/}_~U3ݾn=/KJ*`=g1 q;[Pv@vVfEVAj~NRug__[Y@m~'ZLVv@dNL}Pl3.ݿ͏=_æw0O+J_=^׵Ϳ, 5ƺ[\~f]mguc,h;憘s?M?fa۷l}Ol_>+ߺ&k;wߛm}4"w!.n.-G]-̲ms,h0wv9՟KԳfƳo?[XW}_]D}Xoe?lzVl?_?o.gՁOFMs|q '!5KX$][d)ن1H>xv5U?ҥ?';>6DGG/9[>"K|;Џe7h{oɦn.hs]v&ް:LŲ=Ƿp03]l}?k>_ClEӳmo'?K,_Ctgz6۳ퟙۿ7ٽo~W0uP 6fFCn5T{:f߽9v=+:7Y]hC,2ZzlouߥnE'7~饍mn? 20S~',u#&Ƹڜk`!^gw{?BY4׸>e-zrg]_?hgnf QoOZfݯҝqfzczݛQ:m?8BIM!]Adobe PhotoshopAdobe Photoshop CC 20148BIMhttp://ns.adobe.com/xap/1.0/ 522586159 tim phillips photos Bay of Fires Tasmania Australia Adobed@@H     u!"1A2# QBa$3Rqb%C&4r 5'S6DTsEF7Gc(UVWdte)8fu*9:HIJXYZghijvwxyzm!1"AQ2aqB#Rb3 $Cr4%ScD&5T6Ed' sFtUeuV7)(GWf8vgwHXhx9IYiy*:JZjz ?ERS'e,Jic7>2b *JyyN_.=azPTVQb4IM?j#+N#?g}\H@YCcI9i=eEJ|'VG2/蓒Ԃ," cI<=?Ϝ#k#JZH+kkX YE7DOT\HPjRx?.iTS$wypG!][^@1dD%;)W꿏H7\PLH|1?&NjdaOq>X:C1$cpS$z6O>4ŮDB9SʞtT!Xee1B#8EU@$uoQs}5).#ɖ<@| U:*t|T)^&o$4sa3#jilU7OvYàTP=<+@ mhuKT<zq_He̎uTNMA"ΣkV7lh}ϗr4#$@|DTpJovVYygK4i9: G 0*´4D`G/??_w%"@JO9&USU}><}2UXӻ8ndרm\ .ӋBޛ Џt1`ƆxύS]nZo.?޽O?tYʴ [ 45O &.ϙ|Do3+aqpEbn v!+g˪;KWӯ UV`#MͿ*x 阮$gvP~kJPg@iLӬѴl,%np8?>kg |~_gKrTOǬ8X^_4?݈$2)h:tMFaU * |*uWrX<㬌CzA-nG}-o-KQ>-IMh3WyW>`XH-Mm<_K="?^Hax̎묚ҜˬF% JN[yq𤑇?tX2В+}G쥯gr.1^>{xG?eX:[[E(?zȚ.4q7:UC~4mp~?HW>ΓD@ #]8W~,l,O_Œr4YDl:ԟ g}@ZZ/I$bh,Usp;&p&?]ax%YHe7>A:bgc#k@Y3[.X{[YhzI$P{.-ť?fP#j|_/ӨEbHs`?++wsRGM]GIc}M^^#4'Moe}}\W^& ,р㺀fȷ<]Cn}h ezWH .τO_|:mBT'>^g_gW`+xWӒ@-q?# # T|)ҵ%*3\S^̑ 8'Z[tq\Pv3F#Lu}Ӄ߼!BGr<Y?W#`9\Gti_˭YZSU>~'N0^-~sa=``OIG*k^'f䋀4{WS`@_v1vWW:4jShGk~cYX*QoȿfpCZCuh%X5$>D_Pk X鰵ŽFPg_KƐTPzO=p(YForob}EAQL$YG@?3ìC6kr@/\Q*jXWDG8&*~4c i?S6xZg}zC9z>&$ϦzbQ_H\=\}2~X'=:E=-U3G~4HMů 'n}k3hOעhOpϗ#RGʃ'1}z2'7-lLN܎nREWz daK\4P}ו}R%;GoV~Z{o5\K=)%f=zwox.(ظ 6>xej7BQSĥ)+Cw㱔[&-9v{`B4 F!`*q;I~-{wZr,mmY RdGfy _HF>&3}|_:+LNPp(*"a++[Ԫ }\'hr<kY?-$A zvq,ʚm@Vm+ %J'չ*HjS:wP?`}eRͥcX.ي{z;Ӡ`'L'S4浯~#ˮ 2;}k"J)k?(uyzzAWI]J ?鮧Vc U$[a#<Gل3 8U-Ū )=8u=I:fqas"BqaxR}0($PƥILf(!#\G:O*~:ٞ RtI (kJ|X8Y(qaaRG Uu#6 K1.)zl#! WȓLu!b%݂zXOHdyWt7 YʤԂ5I 8.$3R1`? JX6@NӨc^2x0ޤ+ZҌ|x֊X%H lEi# =7a?U᫩M?8>u bGq?#&ܥRI!ӺnEN&'EǻG,Lz;)zEkYd p%OIMœQe{x=?h4 U?鷚ݜ}U>Y\̋O CF7Ik~tvo֤? Eh@Lw/bԉdz%{cҝHx#:i^W!؂}(ڈS_I[4}>ޡtv tmB?P6 ?QT̈DjŅh3I>ntpZ"䵁̊} |ƽϫD\b#sQIbfE3FX0'E1.ŬAmQ=1'tHJg0ijR -ECSu @?^2 ĦA^.ɇ鱰 pۓP}Ոgtˤ)!UA tfk7c1I'8Q_P4i%cG2>kPtH?KzH?ϵKpKW /?QOu )4d}"ډuxF]$#exm9+fXsrlu {ynH1}{xʅ+M%O73X ݗ,Ek@( 1Ϥ+ F8sN5*A,j$ڕ+\"*ytR2 ;*M( *p}=3=7Xِ ~=?=ޥoZ}! }i0?$qGeH(Sk>}#$pp!fVp$~6n ?s |J6l,~ڞ"ˮORԺKيS_|m$YFUsiA$M$d?oXGP)O? oȌ0@WZyXjy:Ӯap~RP}IuS"U?:ytz T+sV ~C[ہp(s^+UH4ϗ8(՘O}>ȸϷ-^;d(է=<}qjx~M r0?[?L1lz$+Ӂx}CΘPP5} E{P)SQO#?S?_ֽ4ncE5 ):6x eXK dS\<& ~oj2\d'Dy`c+xR͏# <fi8n?-ԑ ~ƕi充{Pi^Ic|BB+/D!Fo\Ǻ2 >ܾWB1Ztӄp/xB9mLӥb0cc|H6 x?[pG<>! #gNe/i(G}z!< <{ڢW/7#)8u.>#͸bTu$*ΒW\TS_A鞦U?XkU UWOB\jXOC'ӬX'a %?՞dK?/ X}q6{x@Cz?A55!44~x=ahlAp oovX܃Uf'Ag]p~_:y}qX7a㏡wׇbHE qQ?+e-_x}=#U:I),O 㐷ط@ˆk=#SU1?Z}Fzv67`>ՀQ?uI-\z^5#Ŭ/uIwUU}44HTjL5ua,8Cq\2.($pkqBE߻;NqB)kuU;OΏQOCHU\0؄Jn9}~^Y<{}рh!'HSP1qmX;qhYن}u{8$زce'MidVu~JVT23Jұ::nZ1*{onrS+%Ffw# )S6K=mRfU8HU(3OVڥًU30CIx*{G!fA=mdEnvEVW_k. {Tfh 'F( ׿6֖1NnF$QuIvatQj GѨqǗ}H>4ߟNB_17IV\a8h)uRH{_5@4#\BdTPҘZ:Hҍ*l`i-qoaDJ4M}~]&HXƪWSb=Fx±eGbDy3d0#鎓h\:ƩmNkRkԂi($cd>I?7 t| .H@TشOj` Q n!*ij?YY6`(+x_F45CéA_<{ 㘕 nUɺ> xOriҏckR}wO ,ӆN.,}>!#:~U[ݑ^ʴ}iҐӳʀ5>C[jX)F4^؟O8_˩FƄG RpB@b}Rrڏz0F8O垓XZML%`:M`PXd.)/ˤ) >B \uΤERD|Q?L" *6Y#alE)%N$t85q£t5S;g$FT( }??eIFz& DɌ#}#Lʧ+?[{+j)̅uhj1:n}O[bǖq !q?]Um]>IТֳ>Zۑoc}<i_/N H$]%s]=owVUV+{֤PY(36d Lİe?Ж+m$*SʇZT!H댸(W_+vG$clͨi_IFbXz_5N:mVW}C5[Rϧ VVN?zHCQF&**C+H6Lq4#׫(X@EO γFiƦ -s뤐xǻS%0+Ǐ=M(uR울 kOǶ|w]1J_bИч`~[ܓ{P#CztIޅ WGR3 Bmcap-{sFAJtА8Bځ'\~NG_ׇUCx~Z}:%7[_y?_^#χE<˩+H@<(?6o8F+Ɵg|騋/N.B<  UzNWǒY@a}Mڵ e'\:G$`LPSD˨?O[ġK ע{a Mi%qk͏AZ*+䕉vY9Y5NxnGŽ g1SR=urok\E!n{߄4N^8 Tx׬< {? |}73uӏ=3kzQiy`>TQƿV*KI:<?{LUr()Ӟ<(FHOj3J릧}r/ZV?g=x^0pJ[S#ALcDy l_q$.#㊭iw7aT帱:cNΟp[R/WvY|= q4p$ $ޚw:&U+?Jz0eի^7tO\2[Y#^85˯{e p.~crMW CN :-TΚB?Ho>!v\pUD GHe2H5Pu <>XP:ZInI{Z!FjgN242a}cX!-AJWY?MN Mkg'2TmPߞ"lPPGH'kbAgƇ.ÅM&*&zzdxbiH"4R򼌪 s{'~nsu,m*C^_K-Ȥ*FeCc}}OdX{vVmeY+MYENBJ i㠠uuKS 28$BiQG>~߷`og搒WƤ("cRv{}gyGF+h?iv@]H_2j V>D_SIL&I< _PZϠzRQN)K伂`F}H =ZE_/\Ѩf^GCʍf̄+ \{~}( IO=x R <>((Ծ겟k 0PϘOup#(BKuN;?#O+#&YiN>p8I^b~\іUgJ#6P 5Nz>q*#yh1if-}F׳-KZ)5)O!OϬIUE 4O2tZkO|mV4|惬B0 T GUYǏ֔d)JzME4ji5K4kf{$?uJ"7i: zTq')^0S%Jn }[lt?CEu3F'鋸c +f^~/}ieҬGbŵ)r=Z\*HqOcR#TQ= +H57B@$_>ҙ&#+<8tTPդzhk߳˦ X#w@: EGuL+U=$x+x|G}4KcUoKŸ6GY#Y?:)}OL;}TݑEŗu- PH$A*9醯n$p5/eorrݠz|R,+~G9IʌDjIRT7(P#ٔrFC9xTх02E :yꐣP?Υ5ʒ9ПkF5i?I[joM]-]MΩTd`ʐ!s'`}u5xq?gPޙg&e{ÐE?_Dut1f@i^?/o"`2DU k![$ҟ:fkXîrxP11e8q5]bAP@_vp@GPԂZ/ϩ r8%mf yFj*:ܫ:rJuEzM T/a`A(.E>UOH5yϮ2ʂ?\My `ԣ"ҧY$tJy lA%MMX}OIDJ?N #G܂m{5gUX 5`u^68M=^R,>XuHT}BG狛pCR"ʰI?Q$.G>fT#??/פ2F4'П(kƽD\p}ԒnNС]E2nG.}Mx( .-E#B8A[#E__[Y㌰c_,W lmp!'.,>ݍ 0C+SO {sQ|kN9ч~~!:JHljxSILIϦБk]0#4m74>17~.O'J.fEFbxRj$0[Ab ދد2:Y_ӉPzхPHxx{HГ^*F"@G 85kQ%Qrʵobl?ڑlUHz.t3}@RyN<<I?_K$Z~}PQ(1,,*uNĊ:ŨCoۀO"et]H4j?9lT_mA@ʠ:W s3~U?Ը(6}[U .UGh]+M,ұ+OY~y" ~,:g_ Ɩ^A1zi<. {VJc^A@eEsJLuaʼnlۀ_w[jªI$u~:#O/@zjS  +HO._^TI+i >WnuԯݛSca 5-,Ka>^~r7sEƋ@ OiMtG' *^s/if c5,ϟj ^{zm:J6lӦ5.kuh!稟;ID=T _-o-kd,5S]$B\5 5봟vgv ߾ۺvnn4 +Y@RDڜ7wDc1(1u,^b'% 1UO&0i]^ a١mkgiMaEI$dN oeh6_1.-$,4.KV jDKPH\W4YC,2 5+xj)DJ W *YPDaqzlIGiDigZh*z*y"1P$#rn}%'<ዕ%!Ր4_Nb.)X[`5vJ֕hҐ|EJ3 JDWB_62Jl}aB3$ypGmlDδ#N>}8BT*迩uf*eGOZ)47M7!*-YAk_v?O0n?#RM f(tI$ S>y#Q}QnEو_ooFd GZ4'qz6Hز@$k4-~ڸ|B$x[?#Q'DUROH5, "Eͬ=gE(MW~?I Z3UUbx|YVXJi*ɦu5YDoBM=kS׭Hֈ О=Db[ _C#Le6,ySXI' E*O֟$xR,-ݡvE.Xsk}ڀQ(?e)%uWȧI:qYy5.jBG&Xp?oUUf*ҭ+Sc*A1` 3i6% ,@0udЃB<}&IUU#0Ϧ}F <8"L%D! %F %򓭔)d%=H]< Eƪ#(^9'ӯ. WG,0H?~ov[G|^aoW%΄wSS=s82Z9jV&8 R)[eYr^}>."֏a_/A SILS:VCcפig :I_+:qu$e`h)d?~* EGHd.'~uhEMLj4V6%޲- 5:FFfx!$߆+26V2F8S4-pGWW* 2]>:AqGG@WOc/su%FU (#}P:i"@ʝ0Mdat"8+bo.d>"{`$pU^cuI;OZUX:Iz$@ iAMN-k1 ?'ս|h1z@r5zA(GzKTmwSоVp9a 矧XB9#<hWY@pIͥa*(3sr9oٴ3+a}rz(xdc8ǯIʌ#34lǤzK6ϳHP CtWpu;؟*}aY^:7%MІecohFOkp[ J<8t.5)#l>fQm)^h h>~/Tn]dQ _=27),H+!cy) H*ӽ??j?KT28zFj}=:qA:H IW<~[FMxL q_~}(`J6 7&e/nc:gFTc\iZԊqjR ЊGЭ< |.KYЯ_<3IoH Q$=FX#.~xz%46bmP} =T1Bxk?l.U? 5sax7-d*1R?HEWB!y ry">{t9 )BO>^5J`.I{P^өZ58q=@kWQH $+&#?#z kVb~GRMk½"i#8rr?٧ϨH/ ?{}`)}:Q|$J-kjRJi|G/u%Ju%Xmfcǵ* d1Ȫ+2+gҝE5K-kOǶtzi!A-4dz1* *@M_j!Z,@P8 !mD*h)oMόRhj28%D_wG]1+,)$$i* m[o6d@H,%ԐEP@\aEX^$R4e=Hi4jktCF'I`j**xcaDiH![I {{o6m mwYUL264UF!X sm$絖H4H]s ,$iPrR=d9<_'j5: ZjB$q_xj}ϙ7m;IeiYx֭"PZ4Vo`pmŷ}\ pBgz BvJi>b=#nbkk3;S%bjaDH0j)UsY ؏pcۋj8$5dksUUc QieGUm0GRtu97y79-[pe[d 46|t=t=1,onm55KO6OQT熲Sd#i$w]ܛ=w;mnqYגCڹjyM HC1_ӌa\F: !ZNdƓ)%z,}SSD|'(f+d}rJߘ7 M]MYA#e-jp3բPY|$'9dG:dJF8$c۾6n4xrɊ}&_(q];(x] $sÔVP>{'K]E+,:a%^0HAnzl[,\r"}1Mpa Y{[2%CQUO lV66jzcK"#3Jj'Bܫ;out3(H#wHWV F C^`7M;.RXKFYƥO ']0( y~ ր,d#B[_m?췛eiFږPXymi!4>Jxh e1R=cŊiaW!T)1D0X:Q"d6&'Ŭ, oϊhʖ>߷4!!ǛVzh'O$Jxq~GY+ā(fhXYCX %j#tsyH3Ʊ;+SCԏt0BVkyǟuH!S'JdyI#VAAkfQiD9#ѡ#qt-_,tc%ZVJHшu2+7f[ٙHSϿI`pY5NiB^"u*Uz Hʣ>t<*Ȫ.8zQqcb /_ҡ SIտ~dF_M]5P e[$ ‚f tך:)He[8Pp[ۀ:|5NQo^l*|jy"`>o<{uD5 Vg"FrOvΚuP5鏟+`Yj{,(\#R}Oi:Q'c>q3mѤSUA7d#\ϷbZJ'!b\z~~:u G677"3}A~_ou ,%WET-F!O7YRcݓV]fxpBK ?[7x9oI$bYˁF~^}[U~Ҩwc+*~tx CmDY?ӎm~-]8]o*Ո81 ~TGQr=Doy~ӽH`tnh2/|?//)Oa8 H$VqtS| \Pu$Z~!<?_.-Zgtѻk(O| eۛXb})_%qO$Q+m$\KQmd-W>nIiKgPВ!R##]\~8aJƌ 陨.G#܋5=Vj iOϯ5 $885zI-pFo:%vKA?FcJ5IAQp$gƿ,]'.9U#P^!rkPMO1O.4=7AGMmN) epr'/oiiqyxt…*p=.ڣݷ[-mpS,Q4urhq^3fm};)bJ:iE91 Q R2:oξ%ݤۯ{nIx,OsWXV` I;A\+{CsESVc.mu 㳋*z/_hEۙ^T`Xp؟!J8b~Z-Lr4yH^1έsٸiNY9U b;$wի8{k\ZIrƸ1\hc"@Z5R4A=#{kw6&m3PũPf+4K$KM4#x$rFI}==Xnnx3:$g_?Cp=ع+ mVL!dmI8|7P`z{;^y '++j3I<"z<}4ln-$I{#0'֚*cb~ab,H " @q$QnM_}=) SN)O-C&#ySKA4Y"x[N8)mjd{KUȤWG;^W)l SW ]AE=RR.ODY:H8'N^3 [rmet%šI$0ZpIp &tלs۳wDq7Zs{~XJicbb_rUTNIO/PD[Mj5^=F@,Lx18В"մlS1T6P0}>@P:uJ*bIO>p8۱jj?gI%K4_Fzu’ʤ1v02?־\q S :J7 N5A~νRO.IZG..J~ozOZ2RVe676TÌe`h<R\Q < OMG}zPÍ1J^`=IůI?XA¿Wiuq *W7_R9 G^U?q|uSkykjH }|V]xӨ뱉,okX 2QNVMz1mBIkƠT>ԯ´WL a?oQRT!O+>ԅtS_M4V}zUz,8qni:ֹQd{]%؝J#9QϷ~v-SUg|K7X-ëO:z)M"?˦Y_usXk{B uFAT~+^JVYhsOXLr_ԧK4Smvl?^*"_,e)UizĢFUEOntʟ/>%~pH|.%dx t}n %EB?.;!D~R&)J{+%UrzpU4'|D* q?YVM'^XWXҭ X4 (:ZZ~!) $0\ܱfR(iOZYI4O iOAM#&I%r>qH1f'HSZƈ5O鞣o}&b}0.At[}U`;~X>]0T ([2]?GfLW'g\F@23 'foJHnn9$qǧgө|?tCykžXt37"=@"̧`.;AGҴ՛JXTcp8>@tpH~G]&v[YG{_B=ZFӟgPnU@=pSʞ'ے9F4ȩyfՎ"A ѿ$-}9ټ7&+Q__ݜ1y'5VAH%|Q $p1F)<5 ~Yk*42*3N'}N"K1*1$!TbHTH>A%ևp VҞdz>E$|HVӬn ѿl`S>=0/i@iMc45;$UVeE@6Z:R_Qq+tEb ,Y@F$RK}0ʞ] ֣'^?*`< p*+pJnBYm؆'H?z>]єE>!N  7,?65V垖y1B^*J)C$niq׉fmb?%@OPj: PÐHׁq~nn}Q}IJ%xVy&!>f&o{r6f&tOA2k?:zl]|`rZsy?_oD $g?:a#LuԴZcKEEM-e\ҕXYzEsooiksws>x8U?m?oLZ{gjd"&;*j}NU_6wuod퍟.Y$5kME=BP..ۦ)UMc){'}K9psmk?SGDg*u_ݗrmؾ÷Z 5Yehԅqr;)vbᨖJʴzlvy gY&\^5Ϳ.a&u!:SI![`W4';% ӵ0mxzP֡bqUM۳`㪖SQTS5<5/P Rg$'+vxm04LTS5٦ؖv^m#4iRAtPkQĎLDު22B&-?GYN8x>cݳlEkoDkx@*>Ut־g%mS[+*G"5իVVpR^ՔRRQ2GG3S5Ud<UAFVY <7Z6:ۇz(ݥP]::В*[Žrs7qCH[kPFkΦNJ?ub$٘puN x]Jy4̴UrK52moDR"D+H=*xgeOh ъj]R$/}* fJ/=u |SՐeJfGr4R蚾pMw?[g~\ڹXYҋ~@ANi[x O%/P 1+CKPT.~´ux+#Q%D[U$讓%H#O+3*/迷[Uټ5XT@rR1RX{,~|K$d@Q !E@Wa0RSb $L tį"z\H{7{!HK԰$PׇS+׮oDRmRć±f5x14qh?K=Ы<_r+P@oμXO±mUWPHF#Iix ؉WTA=ku }D& UX~S(v I-ZW @;fH'nP?nzn.%|=kzQ\W[?=+Zyt]4 %uU0yp~Uk&*h*륊*=%TlbhlP{'/{7Emkr X$5Ů&D"]JM,^f蔰Wg*"rH,)BJ́ D9,#bMEVK5f 7EZ# `JM$!J k9fMš8ш*K#¬0wl/ ;je RE3t :!{+6ngp{/%ײh*(sRuq)OGQ,ٵxd}D (~S(OJ,w97ŭͶԎ[;0K_RŢA[M슌5OqtԐKTdޞGek=:"_E |.5ij#P4AFp.AmKY&2qIьb[S211)hB_e㤅"jy*j,$u~:jhi'#,Kor\=ŖPVmu((V0Ub"+TYbcKGP:w]kK{ּ]xffqN-!KA/@"2UA<\f,L` [HՋ0צVz?/-S'kT$ (83C'ڋPYI䟧kb“R=E:E5b#?.I/?/uh+Q@-BU $ W4?KǧXr& lg^JjxzՕ/XH >% GzHl!-JgʤE"<߾2HPF~c$rԥu<_ˏH\%T&5M@Eg!bJG?RcqE<*..OUZ1?QQOZSH?[6 oW#55)Wϥ'_WOe"WmdpG},BիTfr UOV!A0JH+<3H)ƾ]sFҬ)=Jԍ]iiEA_\n5x:U܏i@(PvcSJӇY;p}wk[R<ꚢ o\4p Z~YXW=y=c|)ncA&څM8?wK+7\ )ԄPqו[ՏǏ:}gˀרUЛ0Ͽ }xI$UHۋp9v^y<C 5 Mxc>ϟXhm#ꠟPg5WMIUXqz],D|-䰹KK5.H6]Z BkH].C~l- ϡZef~cчCYY{P%@C_]&u4ϧPUzpN.$N2<~ K?ՙ|X.b Zh ^Hrzo> YELR8ygRSdIZ6qf$ꖙ+hǟ~޵#^1_?1ì0#9. 6,@=$[QM@㏊$i`&AէZ$Uk<^"/Ï`j%wiZ5Ѐ^ܕK?Tx"VT{V@yR^}GlsJ5-rB-S!>xQHR|CFUtP.ClS~ #Iob gGT '3+!Ljցz3"-boĖ|_Xu$3AR ẗԐX"u7{b+{KՈ!\: \CsA\`j9FIRYYhb8 }?6jbj03%b1(x=׬͒)f ˄< ϶oۉ,#>UZ]u6ɠz4hǎ"VFPP1.9=rK@|=u,FƃQ|r>d Ӂ/k륆Q,the(U9,* ~o6ѽ8{.TK{qHTfF]oLMD.ʼϗiUDA#gK!yUN{U 8tᏖ(i2pGPSE]OVޤxEiull[.snkrkLE' *iP5{r߹op6.c- "kJt;U)e&6$ok{6[ugg7.i:zƔA>}a l_\Pdm?S@BpA ~[;E$zPo)D!T Wc׍Tk!N_qu1d7nKU)S.XNڹc`6#_Q/O+I<Xq쏚9gY޹xNgt_S$Sv.Q{wpJEőHD uJֲ!?n-FOSC*6KcX̃mHj%;I#yUg;m| 7ׁmm8h x_RPM:nw߹[by-m"fufZ:eZP ^|P_O4qK_ ˑjA&s}>K>ݷvi,]$Xԡ]@ S+\SnS^:g19>"9EP< 2dUc4t]7N5o"βŮS#dgaApofrѳX !o#CU 8*hΙ@tƹuXV:Y'4Sly|ܸ|UVe#_gzIjf(n"38[.DV\cOm*,Dq#,u1R`=j$=YQPtFc<.f٣[;COzle<^[JlgGS%*g Q5Hb M5ik'nm ո1$4'if@Zۛ7-oduMuncT>5ĒCY xtÛv-ݧ nfS54 _6zE5'r6~8ML+b8|VZʬ|/TxXӘuC}AXKREn Uȍ@X?(﹆e{֗rKxO-Ԛ{<`xR+4|#HĴ3k S:3 ]#Vy)QO\c; UXQ ~&*8tܒ?R`xփˎHmŹv6ש=EOzM-ª.:TV,4{V?pv y̿3 CHw}-$gDF& vY읫IT22u&yPdVE .z ^{ z`7x{/uqK0D҂obKm=$4V2I@dE9^}7UPi`5Lr ¹R0\*c_n*Bl:ہ7p4.X(}}q'|*¡@$悁klTX!nvXWb+2tߔZ9fHdK~*}=ʻ?1lhŽZo*M8xٕt=F͸˲o67{OpeG@}OM(Hi1Kx]HS" {*{3{qڶܧA*CqE$J: Bt=Nfwwؤ/ 4'$ D|6R(굯AQMCyTu1ԴF :7(DTM*dhΨַwϴ<8MgZNe1H- V76@&B,ccJї&\{V7\DLuD3ǩXwI~f1oݻC5͹6ًb2ce(hpx d\T'H=wms0,ͩ(|1RdcXݎ$gyh߷n6}U{^cVM<hEfO I&;{#-xcH3c`QC1FOp &C A$hkxogrHZJX`IUS<ۋǷV5?ϤŘ A K w[O귷Ut1OytM4$/pO`c<,#ODw-L:T1cU:.Gv:@Oخ$G@`3Z/P*) $OP\dpe4>>|xMX O6$~?{PZtNX5H,}AǮ>޹pJ{ x O.FS_U P)NRyG7:m{ԯ |JjY"Y@F[Xݵ ^۟uJJHS<>}yqBBhͭOwclEI`Ωp 4lq\U=s\tP埕Px>mLsTeR0k!lW * _̊kZ~޶B5>}L٭c}$pTRo¹"9$*@+Lu1,@f$yRx1OW ec#XM_gVŸ}>]M"H?ڈ|pjOAؾg`9u T~|}XS*|HeZpG?_jc_L`5?gYRZ.F \n,9z7P%uFJ-AR>v$ͽLUW4cF?௙!1+) Kk so_PӢ8hhX"e҉o,>Z.UBkPY>uē UƲp@ϷWkSP"([V"6 {x|7^:Q}p;qb(.J<~=^pOTrY|}'oMcM6RI{(}d czbHƠXuv-rt*=$ߋ׵K%TS4I OOE;rGfjUTqt_jPUELff>^@M+guk(m,߼i$sJWt`O@+CoTk7Q6jMȠczˤNIcVap\>r@wtdV|dA:!ȱ 7[(n.m+FvOWӦ J O*849"ÂG'9I\z$(?>~T;[X6!y^[ž5ں y#^ݔpߒAn؆ =䭫y*jK54Gh-㢪V\s|\&#7bGPzZmAS8S+<|y6sǷ^r2It!*"5ɠHMA$cx7yvyӕ-idHԪDVBcQkS?E+an TVI`Ylǥn:jj(TH(n*o9bpN=;M/w TQA%ɸC{XUAw*ꦡ|92p!q6džMIRQ•sَ*LpczD+[HőQ)ˏem0H`qd[wJnO6﷛Elh);:*czUXؘ4V'@UNʜ>!S̔sdgIaIeY#${{"{=*3H"$hB I tC폷~ƿܣǘkHCdw`u0dP$gGA6"co,EZ: َe*7iqX`ѱUt>Rys/vͷDVAxLK]&(C=t؟Fe+oYH/fxdZ9 TR.PjfctN&cÕ ]KEX;U?E]2UpU\5F:lS_^E}M4mR\ dR6y|G~_[pȶ+%B~~B3 P;Gt1CfDzx1.JXh5*%2F g&5&?ǵnD]ݫ*+tU# b2oPs;z\[]kGI|&SN6BI V.umOYc)i^7M4Տ1i[0]Y$q*^c}*Ne6KdޚnsEZ\'Whgsgn;fӳry]_˩dt8kWMo͑Ol峻Gcv76W!Lc.x2^.8(2rPC2nC(%G&/D #oayd6$1(ՒٜnZ;,uΡzFad~mًJJ1XԮbTWdph…r+\@bSv%W@Uo*8;~Eou }XJy&ggU%c)VFUOK+g+QX,VC/>nKc-뛽퓒`Y]IgS!Q -{OHnlm Di5FDј۷KPiw7wVZ,^1UNVDh08\nU4S41 nw>sYMlHgSyX-C"#1,rpnn71E..Q+#ƱFU,٢@Q26o,` TÎw/HUIrIMIcKe5 E*XiJNei.%PhV@F ^$)҇ݩޝ۶,63W,D"!<Աq4Qڷ矹[oI\r;W h4RGP{ѽ(m) 5" e@c7[VRuvϣ%,NEQUWIKFi2P+xPH'g-m,m"(O(A0PSu{pbI#b;1@U^ O]oڻX1qIu j-*&EzT+48|e$w>IԞ#<~flMZth\V/D8TyE|0rدA nAw:TgKO)J@{+)Zw\2Ilvl>.`.RZvdi#ǭ0X>AP%D!595JKHPIjiTfԆMa4GĪJN]$ZZӤ^ -^'l==JSI^id:`F&fA`bK{y).%d@"\P'"WTK·ukyS$ NbPU%j@m]ۆe}}\6B amZ !8IEZ^*Dltf|7:9Km@ S r k$iUz!RhWE܅nO=׻Ɨ8"N$Ttg:o>ޔf6( źiy$n<\kwUd)Ode4%h{v3s[]# XFjFt{]\~)yg= PRC:mp-QMٝTTo:ӚPI9xYcxLs,V<鸽 5;~maHvy%s#u>{%|c~#SW[ĈU7&mS\4 n|z'>߯9 sϵsa7 ׶Ek]U&*h%_;ND/5tW U60Qzj.c˗ocmsw @lngA$ 1tPZxLstÀP;{{si3=WZwuWnHT n83yZ01̑;$iyt{: of6|;UA<0#yr HA@.vq7MÚZV8mE*<-$w4)eE433󸳝gov]sYZÍڇQp8LV{ECKRVC鑋˓6-e3~U&yHI"uXUDeubInn9vWަ/uc_<#/tn eW1H^狁?oyh>.K8]l2qg b,ɱށ^y?O_Ϯ'@9~8[A-{}:+uS*/gc!'ů˯4ݪ>p87B ÃowԢTxMb?a|QoōOwYhS%Y G=F|YEn QƿӤRPi&:>{OjfM3Km~?4΀KqgXN*"M׿pm>IXiR?՞ U>c:⸒-E}?7:|NP%HQ!~A?ۏv1_:S_ w Xo?Ͻ^?.h֠?S"CFpy>:<}zx4hu7Suq#V@(xl = X#`uZRӥ`s_ԨoP<XA}}RķNzF}KqU/ $0Xs7{֧?˦SH vM7ʐ-ʏWيz|\H8"EQ<E_L5Z#m@'G?=1TQU>γ {=@\ap>ڹSzВ4_?S..%\Ўmuc[p@|Ri#=X PB>j+2s?mw"JilY'U2?//U딛j'Pі HՀ#-+Q=[锦sc]P,?krI3 @~^۵*1\mk>/4Wz[NQE@Q%MokŏcԼ|NP?.AoHA]C}DH?j#M@}]0;UqdnDRcJrJGR5m4+7K"گ1˦)jbV2?q&8jX[VPL=RPHQF9g߷]$Ռ4MHtRM2Շyx7lkZ- [ sG|ʠ#1rÃNSYTm~'~͐>qeX+d| c bG,R,D?}9kn[~n WA< Z%σFY!E?Ľ2}r9nnn{i<)-Ɵ Lht٧]tؓameE.حT?RWTGuTs%R ͬm{mQ4>H Pzo1޳r`g[ܺkGx^mhk}}5mDv' KvH՘?ugG__Gpdq4t˷ !wc,~+?v2g GJGi䢋)x~lNTKS+̀;oI6k|Wi2 4jy΢1%YssKifwi;tXq=B$u(5W "cϱT[\-C01SpPac6JiMݙ,%qteJ-9-%œa҈a zΘi &Z֣"{zZwl1%6fDr2UC[Ⱦ4"ji>>5>~#S_=^Ԯ&VRA,ʐS!NPoc gD#)X,JO{5ۢXWI]&DW@$C‘ ~t[xȒL] huB\pLB4qMQ ~6 &1Rk˸o/pmZ" +`BFu  ,V FK-g1"&xLCKo)GR~/ݳ Noo1sc*Z\bsyZ)(RC!O_Ŗ" {Xm*dbXQpU_j $6{|\?e(Vx,401 ,`Ptltp[]o4>Ɓ&֐M<TMՑEFib5o7t :#A"+i\:qcj'] myo8'uR+1*E[AݩymOLt&qAMfPrKFUڛ@fg=uӇ,TgH tYW ҩ"jQi֮wh6HVxb'& I#."A un ՙ̕>mZUٚʚS/!Y2zVbbg b 7xh( ] i=>)Z?x\}OMIU:jxhSbNgqX(uO( ]Y=N %y3M7HDPeYP 'iߗrMu2Iiw$Zjx'?84rF]$!?>5GoEosͬ*ޓLbG<}?7(M5kAԄu)r =@^tRXsT=มNz;G|Q67_/ U k%Um??N㈛o>1 ֣B _ƏmJpG>*z\])>2~B,?'̤̲*~WϩkVi$mAomr/ C[\p Ԛr 4T?q/Ƚ}5^ABkWDHp9Aǽ}aUca$7/) 'oz^Ԯ=(?mz`}k/tڊ_?8&,O{5$WMZ|qU +j w4ʓxSO_1ԑC xY}8'l)&ӟY2O_ ǫ{sS+ʧ\"H:O y?K_|fR[WuS_*H=Kqaȵ͏ k=F}N}7ɸq{uw)AMl{O)ln}>}t&$:CtSP^.nn.Gկ`}sbFk|֧I}0T%[k Q>̢PңY):zfPY/rKՖKYXPAG܃֭4'8"U$^K=Pn8ga#v6 (<_Ri P鶧l,U?_j݊j?Ϥ[hX?3N55c-έ)'yFL!^<NcFzSQ,?v['s00j=3p $(S@Gp'T铕ٲSzXTʳ4{9j^%ΤKiEEy^kSfk}$Bm \IG]b.Z_mX:^]44+1XnUŽ,*:\lԌsiCf1y VN +jq@|n$hX-]\Ũ:RJf-]1PB[*MBC=k{JM>ˆqɔWۘ #fM=v!rjIGX;w9k; ,|EV ӊ Bcfel6*OAUF*TQOdUCu2<@4`ݡ"9%Cd ,gAA\;{]ʣ(I$S H`**4hfԒV`RT&4U3.ӃI.(zQ4)::E~!_3=[zg'GYvV"l|$ٛAWQT)Edl?'owpk_䧇lfclCS|Ogg>T>RsG,XMZE! -9Ueg㲨5 U%F(f@N>͝WTȀr #6021ZQPk+WuIgj<+ak8`2D61!,Ij[j|yڂMj6]Z3ܽo͡1C%^" DFG{#mݹrXV8maJbD6U PxeG{>to:޲Oe^' .N#WRC:{ײn4A2'MYn:Lgxk\̪#DFGrO/_x ms,J ȱhPD (Y4_%[/"RUOTe4ԙHZyrO4aB6!aʀOmfXvW5YGԢ/eoRXomH#4p4$z%}%ju)MWl-L8jBRgHc)|F8ֹbQ{;ຳ}M!fWK;7jfE*CP Gpn;ΔkrʘV!_ hK3W|.Od)+#IerbD0DSXY-$SpM0=Ö!]( /pI=2˛+J\j!c*"@ %H m]ǟM L CG5V3$B ,oen+5ݝ^L =ѶDTh4 Rz5{{9vqcƅ<>=M\EHV [/=5{fV-O#E%$9UcUխMTHSPF,VQU&6~2VVРhtRƔ85M+/*RH[SX]1V8 LG}evl5t*a89rAdsSKA'Bǵ&*'Cxw &ƔtNz%0ճ+j2 _0 2PҍN_Z&7v47c{qKQjU5p)OBjbH@[(lOjd۝62nEp|ؖf6vZ;,~+#SR9Oߞ wFMHփZbVݙVIc 쿫1 vv jFPVO%޲:qP`*IW.P!McmwjeW*5M~X&Ly~8ݺ79T ؘD@r&ˮ_)TPx=?.ah] 4luE,I,E,cu ^!;X߀ ]%s-mV8!rrA 9hE+i; A x٬ iză7USM.5`0T(&ZiyZK^;ywF )GdGB`YSRUSSB+^ݙKwIw vʀ2!ISIRiJtZN몷8g|^3Yj1UԵ*nȇ_{zgFkd!  |h+xFu+ P'j5VgԪѲ4N^7aTbY:*JIWtM-=r"VI㘽X$r.Sۯ.3 _oyM P?k5ɯ*r_Ex .C\MF 5+Z"$?qY<^Sn{NuuDom+i&/H{+)cry 獶Kw)n3[H "RI(h*UM!EbW}xIp_/4J4 G.̏UHCN:Ż?k9S=fzq]+G$wn`<^gzˌKn{񤎫!׸I5hTvf[vM>krB4p oֻ4@Q'VhF['5W^ӜZlʌ>3OM f+Tl3‘I&BB*V1j 9^mḰjNIq,cΤUe;5AwZm-z |i4wu:KVպkb^mm)ST nKqb!3Ә裨(iiFFxuZ D*XW$W>na:I8J|3a%|m=-[V |WFJ*> ('-ZM Q3ׂ5Xtr<RνCޫ<|jdr{#My6>XC1 <5Lue$QcţMӁ#LA9z!@ԡ9ckX"w4=_+/t㹵ɱƮ,=e+֪6c H޼E<[oKWWXIͮO/PuIѸY1SshIq>I_tuΠ}A$nH&IgQN1b70:`ݩk_Ϗz.xIջZuW _.‘{F?'OЏf^(#9TREzl 㐄_kĽSzE$rQʚ8E +[x#WphkhQ j$zXrmo/϶]uak:O&>gs]5i 8?Em{C%=zX'HSӤQ𿴎޴TrHGӄBQIW)҈a)cNqA׏Nѕ[r3t珑=JUǶIyuy%i"?yљNj/٥6O=ju5=q4 <}t{ ]p4o?^x^cj-oŸ-ǻ <鶠P'ۂU+?4nmsb?q M2HV~}`0Hsco'EdP@&E57<}IV=TQSL~Ts{c:\_Ϧp}I9d_:S$QJIV,E -$GEi9NM7p??Vb^踸l=4`9crqǤn¯VLod_b&qŏE6.6::,M K'H:"1FHP }k"0>=KlDHOȽU'Sh։XږCx۟QFI#TLd3}7嶧,aJ{|}L@lyls`EPW<1z*n;urĞ*zo3t،u}T <,SV3mPp\Jp{gkwgy 5 9nъP7"Kvd>mD @+BEuU5GոIkulI[W+%ex L|Y4[=}ml@ 41CH^٧n:ڶv5A^vXvW$5}1jP԰!hsCYy\z\%KMSSVnXı..2Hqy/> y)h.b෰޷]"[s)0e 6+@Fz~MrP &R_Fn{f].c[Q6ɦ1odRQښX⍆? i'xں5 T&Oh\\6 bU+O<h8iI]/]M:H*(lns%&XV\>B*J6Q^|E)aG_*tDթX0q5!PΝBlmo_-GS5uD5H1u: <@ӡ- !3*#5֥'RCZ =Y.;i-èE"Q+!l HJ#!z~Z2u{fK-_@x*3?bզK*#ݖ}j;72AmVpC(ZXf8i87*nʪ(ٷ[52ȉms $ iphGZ1=鸻pˋx&[qF#nc?x,4qaUP7Fu%g:N{yn ᴴ&7X!5q#T5yrH%RTx':{j7DAii0?b.}\q5RSI&NAhqQJ*ȒF=[[r wQ$: j2ZdTq+PֻiJK#xȄT3,kUԨQG+'ya˻˶Z[KQOb)h螖0}4/G`z7i.Vi(cB\1^@il'ݷ&٨k 0vj ut@ ä뤤l25lEM MEd#J:h$}Eo;7a1$*U9$T䏙//-RZX$S5+2Ov4'%uʊP#2,Rc!T*M-U,bֈǟk$D[]CRNdj: C"!ot7#;'Hg%`.E$?@SմY̦Vl%&6:zܹ6#@FAq=[wۖ ԯ HI7%\/&E4uK,i$ju{ƫb5B'T]jU _4 /V7;;ľm 51PtIЮ&誷Naru* E ccKK]KZhףI,l @0ˈ6i!,5 %u*K@MTE7岴[*BEGbehUtF, JGpǀZ|uC71T2ɭEP`=:KN52`- p[m$ѩQևC tAţŪ{ko8:lnfl;O@)L+]."*,n STtX,Pı7^Z 60-L$fq2 Przv InR"K,`qDD)0" T۫rk1b\nƮSB:1Tڼ4Rhz1UoR`U#&ӤQAukI[d&m7 \H>CT5S,5U;aeL-JIg~aXX I."p(ڞ gX"nJC>&;F(NK47dhYF^R|JPeTBr-Rd{"f}M_yesb> Ik*iv[rFd#&2u2`nstGFVZ"ahNZڲ@#n8q ^L[G/C%^ !xf5^N6-3ng(s&]Ԉ-mنJt " ' Y$+r&rO5="Kgh X"4Esv>V?gv\.N:B:f |FiL*o*h>2rצHR.N ٢P dd|-7[H.oV tiķژejEіb4We{M5^J᚞4QGa@\59$("wyq=uk4V2("⪉ Ib)- 7RZ741Gmבmv UZK#Qn-;6ȷۧ{xI})'lѳC42ôN{%~U{Xvm&ؑ\m-;v&J? }&Bi#u*_r©RSPhjй 4%`٥<]\h&kQ6c; GԤFfq`F?O;!tVe*sbx!M!H$IJxQ\ůr}ⳒyyWkܭcHkJXE#e(_c[ۨ99-.ŨhnUPcX3ήz24d5ՕX'{YDi*QmԆ߲u>(fRQ9eI 1zY HUq:|IQP5IKOF'zFHʽg(f 0^pwN+d ?:K*921<>i "̡88k}6}-ߏ )҅1R_H~.?ÑtGO^dH^|T3#?A^Gq|ZŁ$~z*5Eȵo/{ހMQ ot~nAI6;LmօJʞ_P\8_j׏I@{^žF&% ˦ý@}4 ǵ+|&?Pe?oj­_Ccj19Fznl?<{.}W^6C H'O0_Lڰ{H\8P-oxݣNZ~kO>ܟoit @WN5_HH@,1*?H4=+C=LZoorz{M)C{OǺAW ҅@~ bC-O˭`5<~}Z>J8^ __~>$$uom+>rc,/=ڄu_\:mk7+^=TABxuxxu=+ PyRbyڂttjkOA&R ߃q58:è3KX밷ok[ڈƞэ=8ca?C;Sb :` ?7 f0ܦ;$_WˤU%RΧ`[)#:Iviue*ƥ{O?^)Jܮ#9W#?OI _{էMW>_ϧ^4xo~Wi*ҿ>} UV ܎@_v`OtKU$ɧSi@@p i$@VOolJ풧=? ÐqOWBĒZz,Ȭ꿤^s7yF{؟C%WGV ({Oak{ɶ ^Њ%)JP]Iڹ\8K[dh)%JE)պSf:gF3j!|łWH,H JT ~wWN9$>G:ևg2T+c^NzMM Gzܦm枆 SErxvmqFv UAʏTӆ:}ùdۼQ$`>*c@r4 j+d*=쯚֟zK͕=UlRei:E87UU E<>9g McǚM1<u<fC#)* -ܯQ ie(fU'uv+WrNFtTWdbp֮R|fڣ/Q[%R@XHZ{4hvIAT*֡&XX QFGIJz?|%c؜Դ )=BASN<0ܻ"8gR07Ciǖ>cC6RT28_tnGf`|fHAJ =L4 YeUE<]X!(>0iR(h,WU(.EU#Nk],k(h;>2=i{+qvgǼjt#쎠ewFa֟9׹*ep)j$5tz&y_qvAېZUcKx.eWFWw)ygnLH7B%md"4HW[ix&@G,R~)4hj#wKN9LFR oa7@USa0KJ#5d~},yn+HZ6w(nʈN8iU xT{ gϱs?/Իw$w-*T&GF>+(]Fe6u*l\^ܩ/36J\R&C%^G7JPM !Yqgu{x6ǃ6sY !2FԹܩGk}M,$[_XX*(=b,L;)IK]2\<8WfpT=P~h=kjeWGh#pI_D"0ԘEu ,-AuCAXDM$L'h1rU$%TJ@(#tڜr͓I&K7:I-*C<șbZ w ,6 a3Ief cqW:zlLJf1rM-) O@ |<,rk&VAmG[kZOsKz еUpಫL:JY+y"ei Ţd!k DTq==%f8 0sJǎJ <2YjIHuʪOIEJE5f'NX+eךGpEl̑a,kC)$;.Apǡ#>'qlNiG^bh$x`i%驐Tj)i% bydfV*_,L;c O5A ywm,pw( -FdtFj+82HH jOGom FpzN-[Mfb(X)Bd) 3|Ӷ.s&R*rL\eIm$jjkvT+-D Fd\,L +.ۢ|w:h^cB(jZKQA*7jvK4[ưR @4 4;°XH%Y)-FbI+ZT-:ܴPH2d\F'fK#`Td4$HT;)VyF:dx65W)Znr < 㾤Ԣ3HGreIcԍJx.՛duZn~m>k9DM]Iuzb㊐RX'C DϺKMm:$C[0-kf0Cv~÷%<]x,OU-n쫪g1PRC4EؓlU-aZVy]241\(¹)' s h#VDv~t]Oocq5+ᵪXi 򤌑ڇth^ S>6H}IpfqOyܴ疛1,N@()PT-Icae%H%D$ec`L5#7!Aڵƒ,1[sl;\R/Eynlwcgq KR?xA4m=6G=u %};6x.i%|-\9*MA5lȭ*)s79]]KvuDnO ' $3]*RJjWս+ ,Լz_q5fEn\=5Aae Yh}k^kNhqgAR Zn"r }=IVqc7M q[_AӚft[&R5̺injX?UZϴri 0W:wv(כiUA}{+]/Htlx!akENod `ezz D%H֟\[Z'HH?4Y3i*XMuoLXI풦oPe!$ֱ6qŽMɅ*,udʔ\Sv6 /X#HdUsTR\7@73TPJdF?O>ե8H䵓~XEks߫ScTOu?crOn# OG\CrZ2MkRMǥAuqԣ~GWU,TxEnM-5 ~1,-Gkvdj:>=f>Mj: ?_O#ϧ4٠#?^Gׯ.:hqn>>Ue":Е"߃oͽIST&Cxuy\ژ.XsoS!ӟ.58?@>O>%Zt p4W{:QZbjG?C{q qQpX ;}۞">8uH[sy\Ǧ"EhZ ?}=zEfW?#K8Lj="`2ʜ|o{*[l ֿ?ڸ]x^n ]j1 N76*nI6R7@Gp Zc2GjoĄ ]&VRoϿ?@mQ=V$Oеt@{!8G:NM Ij:Hk#\%UG*jv#Gz$IBkp,lO$ x3FBԏZL=+q|j|M s1IjgajHK>MGL1 *TzSz -NW CRJb.N79®|hU+͙S=7 ~6UE>fE~]j'Q%~/yM_4P<2Y7B sY< Pւ-J+Q'N ܲn$U8XX߲gw}SA fJ֩ĤuC3'[x>;\I&#Y!Ѕ1“;'OZZH*ѼX5 j*А@hk)_ ۙ,d042E`j1Ki1*vi%ǏḲ-d5@:-,EKoHC7,.ͥ5`BabHi]Ίxc>7nS Tyl9ط.#`ؼl.%tža,#}Z9 hqy9Zxy2j2̑5UL : BJS/nh75!j1g257>@|Q80Tim8;)$Zdۺzx2_E=6X#`܎eXiᡖ)"5Df#PWA +Işt i3C'"h Y-tV4DpiDZvl']Ӿ1Ƿj멪ivݏxKiPڪc1Y*Z:D VB^HVM}ӠHX"RO'荮lEv3WR⠍.AQU^ x}~`v'" r9Y%'`K2xսʜݿI owP *"ciq'=SH A$jJ;uܹkpڷpAx$эrh%Arbv=VVq=GWjG5͈e$øGHJxswvUKGQIWCf`Խk[3:MS#2md[c/-Xܧ{8hI!FJR5,hGR7ț[6͵CdiP=Tꕈ3u{*ĊGH ٜg2;fL>V`w.ꦣظՈHk ejqA34RUN4TrhKsyGsV, Cb]}s_1oPn3bp;#uZ)Zz:IਨIy|")4eF|vQ_΂C0X]'E2jƀfK Pr6˸,[\ mKMQ<+#pCǠʲr<-6oɇX}(Yqtw}54g'ۂ*<p@,;ŶTh˺ZI;XrYgBOYmU\XIskMq>h۩>c3CG}Z-$m/ןڹQOUl|=n&KUciqb(2sS5dG#X ܹw|Mx6 w,vv_a4ڄЂ^lל,klbY!솖Y\OkinBnR)Л"jڼ5>lfYmW[E5.c2y詗αsB `Fh` ϶mʛ՚D !5MPY`M4i+4vwmvG[%MwM=D$a3VÎvS! 7TyjZI}͍OXw>ApA{+ǏCqP*ꎛZ#u*ɻmB@hS?o94.=J֟.!K *ids`niou:6{Eo)NTRS47C/UtlFГ4.pZj'T}(n?{@i:/򎘏zۦucdiéULE*Ϋ-orI6:-؂֘z}8ֵt?AhlP[c+vV'MR0?oNpSMk973~ 'Y%k!0J$-$5?өžf{5D0?B}2B_*EzH\8>y'Q帽,{eOi 6WN3hc/6h đpsь?/z= Xn-}}=(UNh݉6 uc=3EUC͏s,9{unXM4Hڴ~lD:9?X/>եTjrR+:h2ܵ?PkR Ihl8#(c^Zd#S?ڥc2XkՀi< RSZR8ځ4=HBGL:(n,<2 `ot7~]T)u#:L XZߧ=\0G^ϗ42RLſmS+Ҥ,1dpq &톓?:\%W˩)NH[-~=ҁґN#YE/7#ޝ9B)^d[At\pךH*/~Cɿ8=YhV1 ZH>KLI>q1)oTx礯o~Π=/nr}&kvPH]Dh?R ߑoЏo-iJԊACc?>3!u'(}? -O^y:[WG`ÀH9ۢLq+ ^Eo^O!,*Q\M[OMMU%\ts5=RH*!.1P"lZ1>nL>Jr{K?ʡ4IwEyS=m͗H]KۛJm,52 UdQ# [lsܦtlEZj'$ l幞ZpEZ>~m>许ir96gTE޴(T%.GwW/TU ǓeDbqN[w7;NH0Y)s(F01bna?u6:߱+ꩫɾv=LۦUKM6~nlNWV"BCȒn[V xWwǟAv=ѪB(PP0q6YR~]WeF磯J͝jVʮOSITV/I NVv=ȖF,`CD@5ySϠM<[4^ xW M@D#Zne@55ZJ"y*rFi"5Ԓ0֒  AOS:ChKd`H.':~<|*NMI2;yTlRJ|kU!E4qM(#GVͼ-gY&ӧDcĮ85*yǝ:r<}0$:)@ Z#Ո޶.CO]'V6?F~K&Xu*]T 8m#ڑLc$54ң+^ڭvp4wثVrHb HNω_;;mmZc5mLzlm*rSPv%N%DXj@q&cym> ᤮4H%*p2a>gIݲ;{K;yUe @XK,5"=Zfݷ˱i=c[) Y͇|QEJDR0w >[NV|iHf)qM$UZQMkJ:s4jBJVݎu j @$|g}{Sy-d=SVeF=V%IHbPOH5K-+X_iKwS)!T +3xν'CjQ?s nKoq++Q\O"H}&'{ϫF>]ѻp;S~l}]UOET}i]7{UwV,`ݧgl6^'M:AVamEmP$V!YBV=/aOS1*+X+ARBKݷf^]6/=E1?VGD2&I(OGvI&#r/ iBz7(0URSU!WM8s"=򔳷8s <45RͩEhFBʠ48NLlei#X]aBY1.Y.=*m-bű T:_5 ݧS&-15f*ȵ+7./s5[Kh«t%f$` i[ mHY$QF d%]"V"d2(*]fb 7ssPU3AGym[qIC}<,o`VY;Ӭ$h4v+bPA!zo6ms+HZƾ3R qUyfpD`qGSIrL4ٟ$G?yV&DFy|p*d} ffJm$Ak2 5 M7n60۾$!HK JТ& iC}iWf\]dk%y%̀Q{7IsԷ&3Q GbCj+xV ҎK!oNc刯JgeU!b qo SI&f\qqSVTz{õY훜5H*kVg;ֆ{A#Q'];ۋMjaiN!1{@X*)eBFQ+r0PTMCKO'Wk2AfIn7Ĩقe!A BQiu2[܅ۑR+!"X:Rf,!j'd 'bet*QuUp횎yzRllg3,v룽ەpI% i؊6n9iYI;;Me)"cN dCEH,UiƼ]r-$r~t4u:b1@w;YA\f2٭X!-FضW RJ"ªHӼFG"،@'!AC$:ꤼL4T4LHYڦWh#wI%}o{Xy6 W,Ě|;tL3;Fxѕfdv,h]\BXiG !)#!~n=K:,wp*kZ?+Q#E@Jtw-RW_lHm- ~Oˣyq*%>$zVz'fprk#=>\yZ<ЕfoYG:_7ܣ2yO0itzxI_I?Vۭ.xB1ǧ( c2O-UA+}WR%NEGO҂=_6Kxemt$XC<'^IinHTBfdGC .p4McN=()3Ԝ-GAH'"em`^|a%+<^p%c6v@Eؓ{eY̟~UK1K<\WHT__[iZxw7֤W$u!jQWC϶L8+MJ`ԟOԦ>޹]M}}jƤz!x`x;I)))o@Gs嘏f|nNsF>>A_bJkgɂ^f=d$mVg zuR=:?_u懧_0H":Bmkކi~ޕ$R ?11)-nZdv*BHr?l7}\{Pmjrq [oom^[uʔWs ~q+_VŴPQMc un]7%llm1?A~GuSjT e&m{_9 XT2禙ϵʿd%O/qH[>լ%YPɟOusk=%0Tu.~ߋj4=rƾOES?5$d(Pj}XVMz,:?{ M{1O.}U#Qd4w~4ZvRI&tZyUux+AK)Z#OY܆cN餒8w$X3:>Z7'WY7;cYcOH5诧Z=u?e{Wl`b3cSo`~S?r){#-p =ceaBوfsmcr?ѤթO iu  F u;(eلp\uIARt'z6~[~3տѱl>9׸箬 >B8jfS5|[Y^l;@)ihÉ'*BۤWUYh<1ySQ|:~͒|^{%A .=$XaJxQGV+(R3Ib XFHѷ[MI,'Tsu )L*L 9]{O7[)}1mVBPcZ`bivZOCqyc3$Q9zH(kQoܵEi2kI>gfY~gg>Hv˷zc_؛aRc&&rvL4rTN1T1h[7ùff#v?4EQ8:yopq]ࢢ@`k͙ȩ.Ȫm]lnZj\H[\FNr~'8\cP#;rog8uU2F+( 1`pd m/ P]DD :LJ̢m4W)>CVd;cm쭝ؽɼ/K\~}F%Mv bP \T=<(XKrGoۼA2E xG_=]DZ@%szvv7:4"bBCSKSSBhkP*#^?(DYmnCkikkA[At3C\l+cZ)1JHa05+/o!nu.+A5&藜7WtWiOZ4SN᪄lZl2%8%&P=>4δ52FpWq -ѿ ?p/@x=sGaJb[cZa呓a\od.ln”ݼ4~8|iOOCD* 73$&4qp!U wM$ѩSAEOVc25',پ͓wYZ|&~Zm4@Q濇*d2uI5k:B~H+R!<h2x鴴 R%?ΆFhzulñ{l7];4dOF0G]Au,A< em9n3]㢩]ظ6B,N4Ⱜ`%aqm%n6Hz)2wü^I4ʅpattvoy Ib[!kAQMf >oAɗқd#w#xs*7;P,+(tS*gNQXy n,,JZ <ħu+M6Өǜ}ܹۭze.d cZBN8gbôtAK$.@*)6d(J0sI{DѤSC:Ż:ص1E8:]Β݈ÅռFqzn^Z!k*M8֣+]+GY=l3Tő%V^5M X>#M6 Q-m(i% Q,j(O^n H F!BBīEs%pjt5lm2{Vjjl2gMmf [zx襠Z}l*XU(FU#\B)P(?YQ_Kmh> mhp$BHJnX񻎧 8W7ˊZ^b#s֎߉:~}׫~B^ϯ^E@^8յ?k[~>F8{^,+ׅߋ7l~5M*SN>>cLc䛃{/ǺT7+B$Uz:HHȸc/h[]\h~1*@=RH "xiќ[LR85>yKM@X61FoFIWB]A?oNE4%H׿SmR?ВÝ%Vt x$RMz{t) @}yk@}t)>:|=Acߟhd%_ЮϞ,g2$Sy5.e}%4?1ԅ{p9?ӟF WKiC!~ޖO/ I@i5=3ron0$! RFzaΗX) z-Fh- ڟTbpfJAld9_9=KMbJ ?gI~qzg>ܤ . (Cq{r,OnPa9c'=:g&>Jl6K=&W]!ck隚Jz({9HTJ?<Jԯh#AT~yf1#b>Z aPj>]ItP@:3JUq(fFHG,mhK=(Գ,s1T+G h?>Sr_!k0]-[)ۙ͜Tya18$=IV`h^+a7hycOr>Y9-dQagj nZ†#2k4:STz{b禥]8M[jA'al4z|v_7]#}.+K Xd>o26ҽԀSÆq+cZi)fq;=Bu*udFQRp*@ZUM GA]W{&7nVj|M㿱MIeY:эG3M?˖8|mpAr[B 3"s¼:7{kfX; @2׷RQ_[ԓẶp)n~EQ6b")rt,M:(Ը56giL,Py CF*7h#LݭIR$,̱ɂ_>E! e"5D3EX$&yj)iQ:-Xr9jɲ8([UUQ,):܁fiףx. 2=-4*Ĉ*(wy< 쎄ԕ[|'佣p^MGCvL mp+<[T0@$@WP\>mA6 6tD*`*ld.*(uE!X㚤ܨpr=ēJq1PHѲC`؜m.R4X1%U'X)2MS嚦cs!@_\lֱs]r51±jiH ĨB cgkuuaa<Ƴ(3ܠ6pZCb/ (f.)`tEFm>t9P!M_[t_uՋ&Oj cg$dБR2ݾ[&$5#-}=iCf 1uqōAFRz{HU*kyu ?6 =]>./#` \(*-q{-SŽ])Ca*R8u8_EQ郳o\N<Aox{#ת6)_ېW#Wzq~Z@q^.TmM8W/V=OZ!U۞?6'uQOH ؞FX)gM|:*uaPR7:u-o?zB4iqwqe(i_˧5H;;78G41gL*N.6oϥlF8ϣfmeä(x}g?#c 6^.S 6KˬbnF{i6}ΊG=LM_SQs򺽲&"R>L:3F'?Rbܛvc§G9{|V~KOo)tG')NKڸjz;|'Ŷj*x[$b}cq!ռqXX̤-{u6ad `GQ-KǤi` .==BJbx EYcA׻ {p?~++f+ eZU c?Vf#=) 9^.ssɌI&;GMQ9Hh0%Y1H!aǰO9{ʼg4oqZIFN`*VVHF5hRP\5ɞs?<=-]IF,PM30x.!uU&Vgd> kuTn:<[r<~c%x:44ukoe|&1y9V0-=Ś*jár&؋M{Iy+q`fKUJ ˞^owzn\笩SOKϐvDƌS`T䉤m*pmn3M*>!TPйM62SR3%Z#: eEO@Gۏ';[nmzV7x*qqSٺh֮<efkg}v%BDZ dBA k)=hҫ3Ȥi755"*kWKR_)WYVl]e5d++4tGKz,Ӫ(bX_6m[_bV#Ldt@I}m+5^^c<ƋYg{;t,1o3&b֊'E-AXgwyx%ڭe(Ƅ'KA`7R]λ0&yȼB4ldS5=W\ArValdj:G&V K:H-MBɜ 0qK gy۞ZIyI"`ptZ[F.Q$qq|lr*HL쯤 l)\^Tjz׮;\>0GbD۫_UXwZTHpxRj3%˛nk_Mo&pUSXjNjýȫT9]-.k.Y4O(_#|q41ݽ!19SQ7=F.15ɢpfSD1C>$};GmР]ZQZRIi+ڴU on,$gXTF5$Nq KupD)UEXH)J&Uȁ(()d$4͊Ɯ?%w&͚3_Y_xZ9 ]g;xPaNOommQ$APR0OQ"[OKy^۷My] rAW*h*X#yamw7[vuyHPWK39*;@U$!këmk^ڿq6Ơ D"hki(| QK pJBR 从m,wlH F$>Z5PmJmIei 1Qi RFLr)209pjI <-mFېAY<:445]Ɏ} d%x|ԵQ$-\%ʀFAhuPTN b_"o,gT3쬲UbWCfjWU=\>ِ0{&K).N=_0 tu;>rŽ(!AR)HnM|.ݷY}TceApuZdP5Ƿpn]ü2yjrU[#7&x1O<.O\4AF!A7rK,gtI"vV2h:FC;! $>i[K2 f*.jQFU e)wV`)|tfLME~EI ,Aʨ&ܘh{v^N;(Aq1,,k P`:4~K1Kj';BY%gdxLUdjvBtp(U{'+StnYrmMCܐbٴYgpI]?54T53;1-܏s۬;ZE*0]r&RZnMiS;mh7F[fd% -$ 0JΰgU?]uK_#F=F;o+l t[{yg-v"ZsSE1F ܃<o[ bhPDVF$$x͵{$+}ap֨Ғ€u<~v?gV4ww`vG^.ƪW[-1mRLV/%#a?$ YIBªډMSg9sxĽF`H$fc1J{g:춣?vIe*;YWOr:l^DO<:ش *+IJs :\|814{/GN6SRNR义Yc':Kg/7ߟaA >*DgTX8pcZjXݱJz TJlqc^y*mO>GUxbY#;i|kr+jC I%H 0-@*F niXFQhG6!Dm|% @ tm\5UIE&Re0㣼4I`RH@PU\)%Dz ͭ¿ <Ruy3{:[AJ- tP|~bEhl!{p-sj@I#u nm_÷E N$> +;:@E*mPQVI$1_^AW]YNs⦨e,T'IJ_qtPE0E͍Korc&hƖuj5FHb,ibU*j(eCFڄT?1I cS4͕j9Jj"h略x? bGtRIam m11"tёCR4״tq7 m-LGT%XF**6(:;]Qծ?lUեu&TH G)]LFA{yI[EŽԱk*"9nc5KiHˢYF){{/0_m-nS-ѓ죑R[ZKpLz%YKՅHޏ#EQm5m:nZn:0͔j|,cR\fMww7+*\]n]KT"{kM3B$v39`]^G`bq[ݪxvȚSfQ0Utuz1W}4DDF8t%)G]*gT\6&=gkND;VfVGPs[9b+#%ÖAVTB QiZtٗI$*7`j@57&qUu4G Pt,tfYbO}5)4c_Q@W=*zDoYDఫ6KI"/`H74*<#0X%RSPlED>QYդg :Opo$ 9Gk+S cc2FtAC:!)y`*i/k*N$VH?ФsKqoqUH?g3Hn.`>z*9 jK\ љJ#SBZ$uG<~뉠GE<ٵ huܫJÏ&_RzTcR}zE~κE#I}P+:??>?>>'zW GÏ4 cq'o[] 5Wk~`U7\*=N(kvyo<{p\MG3z">m,OVHd#"izqk }Wv}qVԦc}a盰o>}&< @#c)6MXO\jWYšGNCuumby$.9ʱoǕڹg'~Ό+_KO-dk2gҐ!?{kdn + |xS ˑ}4 #S6 'anwg`N^GCkIQ~#Q@j*: e9B{"G[ʓH|:Uj rпLoe=?7Jm-E5ESn]^→\!šᩄ^<3o$z[9oW(P 2KJ4ֱ9l7ljC#v?ErХjVwRUw3(R\Q? CzbwDE2#L0cd˄zm\M49xYNfwTg<}|Y4-is;(.!P^In2J )E\v \Ĭb$)3`3(sz u|q鞱mmѽ;nܤYIzfioVP÷'{5rt}7KVV~ln[xiu5uيJIC8L2S#V[dCD jZ9M'2){ٵgI00#ÌJ]&I/ LE>[%b~92ev' ;+W[JԩI%Rr5r-0de>[Nܮlr1 _\b)cg1 8Њz -?o|مD)IdEl*+"1 COTm~۝Ec/d*,Y"}exfU)QIaQX_s&;ʶ֑}ME2iUbK/ TP?2 MdvOמ}(TV0XU+I?g8J}۽7^'1}ԕl0 4*TUh%Xwڹshe&FbӴ"3HU18]}y|$m'[ ^RGoS~cwofsTtлRlU=?qoܥym`+cg uR Ǜi˖v~,nEfo6ֱLq2 -ؽsnfx壎52L3QR$jUt}v^|6w3~K/k'GݩZ{je6wrc U7oox؋D<ӟvqv_Z*3$11R:=8-@iNhs&1MmrdeV@pֵM~?1>reVZ)k(FOTG5P y2lYNɢMrOA#ʀpWfFZ(>f[_o!{KIЅxYH`*jE֤]Z|FץYwT{V ;c 3GdPJH>$Z?,J,c_aގGHn+e gEy eII!jJ)SZft{YNb Do +kajHHu)Ӫ?"gߌL>4[ručϴr)Ka$`)uUsShY^Fbdw.bṵ[|xZIym!"Hddd:W{<{+TO{᷊d$BA(|B(no4չ/AG4ج}N`mH⦦UA f*D:jC[~d=a@S3/ӾmC6b Bٷ]ݶ3]YU3(fwG$qFPd B=튼c 6>4tk 8 :`bwƩ!H>ڎt9#To۝"ެL J戋P"j%L|.[3:?vKg+q 1!@P§^"rZB}{2r±[%34mtfE^2#UHr%ZkMC71ϟR!&e^iճѷ?qƌG.|'%hgBjET <<sr-mуdRKF%RaaRYF:K||N*hޚYc|UbptKFYBI:4ċىϷ܇D,dWc8:׿FT1'A^a.e\B(ٵ駈f*2])+wʝdS%-,TT-sTdba<[C݇w{IY,HƧJ&ФiUXP%@l9iZIOrP3yCk[pgsH-^;'=!e3YY_V k9WJ*}^{&l-d1mP"PtGkJQP.{h b)\ؾ[Hb 2A)uO}r2'NXir݁ TT-}>%MY$#C%|mʟwN}sm<3GfTv׮ VPaU 5{H9L!f1Cj@9MNJds8G1[ˆ۸h孜]# hRI 2QV8K4XsOY Kh"A,)'LQf*]Uk dI%NG#'E *"J'a"O SF+v}4 tSJƕ,χ K1pn`>S׍ DXqg\ X>c*(TWU˛c0y`sVc⡖1K7o!#e2% ˧R2 <2t=.jy9R y DK3Ha,7ӸbWfCܸ2O띢;]KY^pș8l-UY/O$ğTGңT݆qx($Zƹ]@_*Yzv]vbx.exkyf%#Aa:mg*xb9b0g a%`3s D`ũ( 6*סroۊ9~:Iu10yi'ScM tጒxr_-;-?f,ѪZ([ƠI;7Խ yE |rj$<H;Il?QnHWQ,4Xx~;,o bj %`/etW~ǘ춝h"+T:Jjm QfX㙷b;K7+BaWJjU+/+G[1S 5\uZ $` br@rE6- p lX#{D֖cgd4uٴ+`U'(btBT7RBPVIȗ4U$tUJ}Ejp|-"C@ e cH%#EQ"KSB+Ohz&U  W{T oHXoJ:ll;QM#2T6@RL?Um24-r4|b rbXkL~ݏn$t[F$!"RF2q>#tV4($Hoojt@ޓWM{>٥@ +%D*iԡ8$IUuIkVo1ף䔣Z2հ1SǏO1TR8}M{]@ %gPOψqM%x ^?BUVC׾Z{Uxӏ\ZO\{?zi90/QGC_O .%r> pC3_^.ϙz1v^7nݼo3XV+[IWOSChE]Znȑ'#{IyⷞI)cH4G (uFe:]b.q}=r?q7 z>-P K( 3uP36Ńq6>"gl-F q n7ge76QNQ9HzfFs_xW3&rr],DffA@$`ǽvi/l<]ֆhjzNeEja<5(u EULvƦm<}5$miQaqtNwNzX kV חv +u +:j*,ns@ nW4~m'7,R 4"31e mP^iT)D縺;6 żf_=k -|2x)4T'eX*Nsm{7!uΤwjZaaץJ P;-6p*1 CVIZJjQڄάn^GR6~)z=6fjϲ-e}J} !6._M,&f@RJ)䑩$Z2۹W6wMl 4nDYijw:>!Umg}i6J0+kVQ՜=N/!Q͋k#l4=L;ei$ ׶[}g]Ļ\6sq$am‹_ӈ]Z0&[>ݺ˹6ѴpGFeIiv͗L*Ǔ4d SCYrOmy<^'+QGId=c&&HJ$*I!ֱ +O'W7~?*Z`\ N69JmAI䪤U.PTU$C4$?3ws%.ZMfw>D1ҝy_1lfԋ>v5mJw(IHm @Nozh!l{vcV"ϐ#I%*`kǜsΛ7p˦+wbc ꘃY$5bFA윱nY)+Ϊ^; 'MJ£a198xkS[Gmqy [p±&E[#4Q*[lW\[ k8uNY]RHYEcP|k{ݸXɴ&QkKh#o0u|=Ƈ!jĚ&B`%%] U9fJ5BK$ FnE.bB#41GPͬW}d!Z Q`^ר@DJʯ#m5V6%ȥ%,1er{7:zjͯh_#5ɶwkf,̨LaL&QR:y`w}if-.Rk;{)sIm 0s)!t< N,%+\mzMfPcM4[ `I9X"J~>fxa{S$j\H䎾*jC"Mz3-޿';1K3vuLD1U<ljtm0ᨦH(_Gvf?~MlV6K#s(TI"(CѪ8孛OHL2ܲs .#&(uM J Bٸlw\49j1 5,QD$ST*!$o2|ϻnM} @V-#FX?:= ?5k^<[Mòkc>#J"PQݔ ARUݙnn K\v_- RK5D5Pe@ѩeYcΟ>z2{~dEIr:\:(C ЬD1B/X6TYmn;j]Q# !j6.%BRWLzԲ2-Y-M&ZY$9Lid91q>6)LkR7`[rPV"Zي jƸ.x9Qh-G1;%)Q٪n^i(!;HO&?Զݎzz̾Y`jfjtTJ%Ԓz; s$ܥɷreͳ`P2 gTgvgvߛ5Tx=ٝK1v*b c5l# "||!oČno#LkE@_%URjkۙ$ޮmi+4]1,eeZGVA RÀԕ9M#RxĿ{]S4 I [i^kcϹf×7h6DPp_z^~ܗ{q0FF+@?j`yq o[wˤjSWvk}'N) I2Ғ $8"+sG\]>F0_td+lpԩSʯͺ\Dɰ,8#!e/}ݑ붦y΍#%"HWT#[;s*28|>'o-E1edG_D>_K+ʢr]dl繸)fNUJ0|fX(Y, H1ܣ 3:/YQU%ot"%R>}ɦz:][$%QJX k ~n˰4KGM TcZm( yS`.mQ<8I.$AnLpEH{  !I90Dr 3YGjqYvnv?I&_  ˪j tr;&a3[~QNiۛ|&Bj%a;FcH+T_M+Ir.e؍8Cᴖg]V0\F̭-"rf׶LxL[_ f A۰ :3B#:>N_gQqt1&:Mɞdb7%J_zY#^*j񫳀Ly{q#۹yhS/a[w^\'`/rLncLzhۿ{s^ӹ3vO-ZP]m6g7z[QW3f|fYdCEMEE~3$b,hIFf w'ۗ}xnfei$v>&k+C E6PJ+@4mwΜEn,> T$[\P:'&8SUdYkjK>yj+|fwa {G,Z\ljI,\̺,X!8Ph R8H(UҪ ($(]^J?XaXF#1T}-+)W(MMK;;f-9*4ҪH/h8[)cx]4?dlxVԇxLuFdC-jFapE>[/V ˹13YWXb"~}>AEMWDcv )摛K`>&[ܯfTʘ_?:xu`Z~uD-:EyLߟFJ7m(GW}k#@?? i;j'S]YR 2x0D0[rl}'M4QViCG\[GU!ϬFHt?ÜT h!WJO-B   N{_ڴF SҘ^_v2 V+_S.j6T啫i%~4J[IH6~}r*eJ5H_b,qqd"_>nEZH챸B?b>$r> `8\#b\fS]{j5F'O^[c.E=gS:@ӥߨAy zeZKG"KNޮUc<#98c#ZJM(F?>l1jOoPxJWV+uq'" IaL暊Pޓ(X%^'}?׽9\D4,5T~&'wI"h_T#o~#nC$ufy Fc!h?h#P>χIܶSN؛4g $Qy˪`LϤ {Aogn\?Ү:~fie.x{J:-ݍ>m>Ju^f&8m`x&LiZ;h%%āƧ_i&uNb;{/6Es7^+U#yr#" f'NtXƩJ)޿&#\~KcRzma]sqbi3cj:XaeXㇺ\m\;ei,"Xd)+"#vW׮fc6^o#Ȓo.Hd+8)#|oI:]75Rd2m[ى &(M۸) A|>1WL9Yvx ͎YEthUtGS+O2Xg-yڶGtYK0 &4%qs8f$ %-6r+=@njڼV* d#4Ei$1G;^䕒 [ R Y EVw̌g<ٵiZZRHBIS$Ѐ%fZɺ)ZIwBjV$z,dAt6:FeqMUpVc%}-}gw;)Q$JUOY*S%rzQ:XVr (F"j[tDbf} j0}/OS9 7cq ˖)I)ǥV}yl#Hݠsb5 MQޏ\Aoͼp`VkR۹$iLB*)}3ꦥ䧊UEZʭO6aLF rju@~ĴHH`|*vz+@#KRJҕ2p}Ѿtu;StuN*L~R!: /gSWgbZ1(be_x.p}ڹ&qh≣dJkIo 6VaFjK{+[0s772=g0Ez?҇OBXz&y1 F2X?62TJ1dTJMZ%7Kqez79팞 ` SOws0axnH h淬P+Zە3C)!t9i@qkd6n!>3pnLu,j\ S."GjJl8RtcI7Iy` ,#1<ڃ'ΧPd.c&i][n,Eڠ(ӖB%`Wh"REF lf*ɐU ry0!U̕jkܟrV;-oX{<11bqWgg1}%mH~(iZ$Y$U5uyֻ/w=f:zżIܛj|\DPTԔ b))hHXOӝwuo9Gka&E,,Mbi{[j3d3оt Iq2O3mLBK,0>os. vˋx紂-VHD2*%HԧjT/ x%p4q#C H~>qS޹Ɨo2d +`mTzBXutn*ytR?SD@:}w^Hv8y۪E(S9wx!!T|6e P۽ә>lxȓ+A7#]%M]}"%ǧ<ߛfb)iQ<޷oDQK;e4W_-~s4{uvc+D+Q[TIk yG`&دR,{UϡsWOeT4 jHYyT7zz>Sf cX:z-",|+BrӾK1\Q<@J: (rU7ӥW&D -)AL}q%&sUI KYռXJ$W[@ukVҵQ]d3оqX&Wrl8Zm^垷GChpD*x*ejX,6:=;]\ǹNjcѤ`HADzEq[.qkvK8c~ʺcQ+TWq65Դn6bz?VJ+q*#SWd*54L0^lZ4Z?McoׅSa ):;W0[X58X'O8J27LHX:+lJ7Wk+0Y,N6W> .M4MXQ}<̂Oc*e Ia]eN`akmoduhnGBJTR4d_zvVX=˙WU&>&RYAV)GDT<6Ip>uߧvNI%i4=Jd!8VmD-ԃ[sZUFBvԡITVtE";|n߸8^]v^\7m =Q2MHCAAh}2iRjZ|i;.u ~rJdnX3sTqHВ#fj"ͷ܎E9=ekE1#1Y%4mV/ PGơHmKjÖNjRE%=]{n \rGJQ檪STy%Y'R_p۷[ h񦴺P*c>Ќ5,Eкqe N'[-rKQ9-Y5L; [A&V"tעS쌽t\&ۉGcd]QMSYK;OW (Ŏs4K9uŊAoPDuZtHh18 -ir.0\;Q&pZ@SCh{"GhM{K_o͠K2mϴQO1K8+h-$gRo,eEeKBa=vqq,*,WG%챫|.n)NZZd$ivZHGyIҠY\vV $DP*|yOJ-7Io/ff8?!^kN=o+C7. ;Zaߍz=UUvtt3 / f~Oy} lbK*[;U52Ju"|qDs6Qs)Mf$#bSP] VwfVj뮚C`#R&x+fR+OSٴ$kLM0{-"("jAJF> mRxw4[O-D q{xXnD".@+$V'S۰KBhゞ8OP$:j}QWyd+/n[jWɣ[FfSGf*h _nfl߼@b%uxpA,c&(@zgtt |;v!Qb6CG6멢:5 :q F+%Ƿ^w]`?2_7eE˪rтB:E7so5}sy$j|Gbڛ tHj@"뭩5= '%Gj{:fj:_a#[)JIcPK7D9=--'T%:<x85EerA/2^<<Ѵ͵pÐƀTI(a328J8.BI3EI#T Ff[e${#W71<֨uT YV*+R7Ѡ_BXlhX\MF~#GX*}%T.?1 ?~иf`##Qq0{t1o^A/5<ƷI#,S(xH$1p m:\&΀ܙdu\0e… :]nNRղMQǓ5x<鍓%PB<ф4e1nnqEafO/nfEiL! <J t(([ q61fAR<8'D_,^齤kwNzdvoYZ::WA&|AI6\i&-q`{!۾Z̻5ݠ[ia72-ݼ;XeBUЩ0 ܞd6Orq.Bokd#4hP; "<5hH+k1TRDI.6<DQ=̶||9I "ZS"q2jPU>nXǐ3}OF/P0,DkmOՆ ^lYe'ym;YF FkƧ]R9V^kz#wKAOJT4Ze5Ȅ"MďIU ,  >DPmp2-f1R(T iPīF{ܘb3uzl1S$:9:Y7[[$i$^'l.I@i"{@ԗ&5IH2 "1h +:F'qu5ZlCq6g{bhI@dcPQXl ߅ArX!0`˓ ۙ;4UY䕭=NY? :wsK,=%T5EU+hLE* G.q+`J j %z}6(V{fwpA*׸{@ ͟p{;^![h[)\CS d(F,NY^7?CohuGfF*‘.B.A495:V6{8j%jK *>*ScD13S%NA֖fkR<5Fj&kI7k&I5D2[+ڃ&JaV(H;U&wiVIdt1Xl}ߏ<< MTJ*w*)Q?G]1rYwWH]DQH4:ql(naBAr"0jtL)^;\~#^dE?% RKq3cU䪕Pȑ\P}m BRK*jV5O(8锵yF 0V`iCJ=$*q(6lvFgz_ld(hK,jjڔh}R0ugA^~޵.ZIo@PYYmdf1wh5#>Kv^P>n,e&E!N%U>2M%huuRA⨒8励mξ&x#;,%5f2d f.@L0s[BK J%"F`@IC}Ѵsź:ߥH˹vfd 3x,VNzgS,^ߟmsQ\3VI&f@ID;=Mydn.>""@5V9:-݅ L ~[6wMlEm۷rHO$umT& }1 Q$sޭomEd$ \i䛝b6-2TT%kLW'< .t9}r'ld)jXn4X05tB_گ#*jLCɷ]fu,{قmEPxNS: Qw"߽76;M3itEM4.I"VlʿןϐYLe( uR l,t5JOtjŽeiqis2#Jԗ k^8[6k^є~UVZ s`XOk ٹ &z_eE28h] {=Mmn!+wM`, e3Utj35~xaH/$u3FES{5=5K;ngU-A_Mqr[)R >JS(o' w w6Ҭ,W!6'BB g$lQ)4''Xev~ 6ڡg1Օ145OwY%T}Uҷ><׹xWRCq<ˊ @_ AT gxsg $ j¤*2i55& 6Ƿ]Qx,MWb6{'ƶ:mkdΘ2.Q5W26[[n+fqc>:TR4ELI(WH;=+0o>+=葍S23-ڱ=ړ9 ] -#F/y(!e4ŁT0AEK&{Ia۽m<-PZڬcQcI$vF%}NO@x9 Od?4HHGrY\O6NGD*@2 C Yi&dSTEd%E(;nq\BE2N 6l;V2TІLr\]>)D+pTx YYIU\*K\,nS?k(ᦪsWOCiS4 VM({+II+qaPf 8 ,,v뢙juYJx:?$bT|L}?H)tSMFpYMT-$UD8{g}-9鬐;5~jO0)FFgC8\v$4R!el4 a@Q -:'l:QG=sw[W-M^}6b0S;R)r<-Dq`zݷ|"ofFR^|3 ̷Rn7W01}+OI̐;hfX/\hfUrF֭DheqTK,G-9xdX {t$6DBA )BZ1@s@H.n[!ML2AԥM2A MsUۛhmjx)_k9Fz$h bn۹Gh;z=UPyJ ',ݱSܙs6߶Z*¬>&t\RE||H뭉Om0yCd*DRgQg+i!zDsyKL#, |w{\E+}R٪D^8t]+cw/sgǶnZ%"mlcz 񮉙Iv0h{KGln3뺌Ar4l˒eόx7ue5e-,I5 U+>|ϖus4-a#U[ZړDGcw ]s^ %$R^e%.5¢BDmVϓ_iM1Ty62SJXR,kb#D<`k$MvYI:2 ' ,jX Ý^ N]/u!r@W۳Z0jEՙDB[UiMS8l*jsx3 L'x㤊 c\8vyDHȸHۂ+U&Cԭȶv[.,W?! LR0jFt JtI~R67 UP=U'! QrqevTxaKOKxrE^:,Y*r46\uMHQIkV+Ej8t ul| m/t5m>6F*%z.KK6ismJPRR1p6FzZ<+䶓cPh%K\}H6{YKInC:f4ye]e? gREk\,Y<Vi^8jH I WɬFs=u0ٜGkv?_u"28zfإaDܜYSߘʪcZX)Ku7Mx@c[shx`C1g98V* VXu*{!5(msnFk mx,q'1D\Eٖa쮋LFJ>ڮRF4]dSq߷k^{ǐTf-p)uj`ko!ė]ĿMki2+hC19]SGB*!h+0Q!h&U-,ъx[jT4P$&-̾j5Ym8wKVE. JI Ch~vZ5 #0o.95y7X,(A@R4$ un}t{4b%1) n 8H<(5꺄jC) 7k$}SK$Ĉ!yX2PTZG<|]l.%"^%@F$Pk.'ng2[k:$DAZoUAGhb :*8o$ >佾hdLK4M[&5kM H|hٶۛK˒DVyQ:QZjxR0*GS[tp꠪Uc*4}ԂZ6 "(\#'u4{&`HZRjRP_C;v sfunܛAk%se9Y*#(I72{u=-gnjoi,]F"vbB!y N:]CQƒmݷAUEO*$IW_iEDHUgwWR)vG?^oWı ] ݊B*54?jؓa˼NmjEc:)Bt"*o)y)"SZWy*TJTEHs兼y$ISȥMMC0@9lemR1ph%We>]ӻ{ve+EMqcVJzRSM < D~2KbNKmelVtnB<95fZRE\qV Ip Z)N>|ڞ9u3ooZLSWv6F*jjPYXk&%bH^5!8'+nm ZC#/^\ᴧ!$G K2%}-eHᖧ_IltѢس+OUR51Icj(j䬁uubIC}umHw0%=)٣F (~5UT ;I}goiqijTB4jB5u\WnyͻHruoK]KK%?(>fFHq$F%%VH6[ijYgH|L5^8[b@UbdA4IMpzK3յ5<^ :Z8:6 :1}kR8uH*I ZR"R3B zv}Uhⷠ4sU.m* R5\o/$lv V72C= G, A+G{3VMB갑Lꉤ ?3$qK#Lf _]iتq"A^̌ēBY՜0:.mPn=ZjѢ>5[É9{ ^Q_*594G=5n >8(E:H3ʊ)"gWM؊n[[ՖYxb*gAHVIn%ۮoKo ,6 KH HBb#hkh3Tcv2+$xZUdH)"G!*QVŵljo ߴ""<2J\D%:1Ҁa-; N**ڱF@Y-JSu"P-5E-L)94xfK_1Dv}/ U! %{F5dzF10nEȑ]-]|5dZcĔzj^# rN/-:y 0IPk{^dw1fX$AS~U糂p ѭ+4yR qଇ!4tna5}sc$1#HU)A1 = q}x ^I1ջQըֵٙSn(embA"dR:E_Ch8"ډd<544MKMms;`!X$`V^4PHEikdм+KDJuֺ~jP*@/P*Xb]ZYښZr#pR)lG^䋋yFTQyp2l\T4S44 /4a33:~ExUcY.pRE@AӉ S"I2W'ARIMjnM<{йJyZ" NkPGP8u{v0D!{u}h5%t:6U$UU@u4#mAɝV-HHj镸\Exwƕo:Ρ&Y*'xWdP/) [lG{Tӫ 7 $ 8Q>j|}J}w%@A>UDR!)hG[>.H'Rs"1cP? ?"zvoDW1%ʀE$Uf \214RϦpdQI dRjБJ7ޤMǃ"&Zn=\ք_־v]=)8TRF|XUHc&[Z:qv?snOLiSǴgԜWNα')K><uBM$2ex䦣;HGQGGm )Un4P 2OV+,su5x湡9Nkz)`}ifH]񘠉D=r /ϰ$rkQn@ f(qa$X-M1BNj I^ŀ;dUz:ܹ:|UdU,TuhicA$6ϳ]mq#H ='>qFBYJF  8pX/Om6BOie^XJY@iϿ/ܒ,&M@7WwTO0|[ܕ@T~*o3.&G|/6/qnHw kfefo $=oj=2K$C XOJWޟr٘E>!ƕPۚNHTg:cCE5!=sWQ04R( 7{#Pө2XYI9J?pkyJLx )_V:QUNzK1Ua:lS5;JCCKJR̿[SHMRei%+f+^Ss m묪 OQJg˥Oi"QtPci*="ӨJ٣a" gey ۂ{gllD-1( y 4z0_wqDc# qY?Qx3}SY>]J8RǓNC&Cne4}HZh.GkJIs(yw>$2<4d^X*CJ1ҋMz"ګr%zbFZCpv6LFqGJ9!U5 e1ajaL񩞩"8}k~.mVUbIhH:o?oNʼm൬F[aΧ\тBDU\iYeY/xLvjE%- Lj?gsg% 䢕Ғ4 !aoww 4v;wXT/UɎх^VDA3z=M/[Tޚ.'4PA @l iRTR 2$pP>1Rrb K۽4Y- ʝʌj |AH$lnuw9l&Zْ %[#^NRaR]F*RA>PRbrQ6>+3 8)s!Ygy7-[77^I8$ S8RBAH@]:/-Ԋ W=YƮ9 kC;n_`qQj4b*UhT؏x5͜v׀\ENO'jpc*Ye\mClfSyrk#q;Y~vWcIS)SL4ugǭ[U?)#rx-6{#Ui&>+FwY40S7ۉsxŚn6;G9nZ3C$@J:2Ym Kۨ>Kurg1mS}dK2tI=v[X/[~0I&‘\1,"m%Twc!mo۷N%̯"6RTjhV՞=U?$UVSaP-6$ |8䩪z<b5#c;mgDLJ+;pXiԱ rϑ{l.gI&gXnʪiOrU^'^.4fQg2,vAI1pᦖ2iaUE-!v| fe9}.aE%^Y42J[]53GoͷHnlD-5aos"#t$]|2WY ]^˝SX4/0G9YvY=A;9rXGgԹ-$5x5?{P5M:5! \]X֒6ZAE[Iɖ03%$kS >kt}x'Or4~չO{C PjJ,Gu` Pk8gʤPJ**!QLYZ#_F-ԙ%X5@zANkÓHP2]Zuu ?go.{{|,=$z*lX?xxU!hd$` 5D(ۓyt~Ǚ%M.6{USpѽ4?NԲjqȟbӓ68yD܀KhB0!T\:TH$OTB[zOC[?YZɸET Lt|i% +PY0X弖ٞ$]_H\-=t=쾆ޣerY~ wF>jj}tJȉ_U9ii}b}mA{Ҡ6[@RYEOPG5{& չ!#k%XBĢ i\gΟNuȾưl/ bjbaM$szEYo4HGn/6s|{6rh7-*jƨ ɥ^@B qwEni]n%1>$p0ʱT Ҁ ~hm|^)9IkrڪܫJ'vaLd&SQr+rō/^ú$Vxn$_gwD2CicQįp|b}zx8eG b|;)ʷ7RD(2XT2c2Nno='(e+CI(KӟJwMͤa$f9RFp |+I@33. M$#:?fB8x W, qp3Ҿc垻:@IHtx)G$ u78*((p)R> 30 TW&SŸ4q2uR)nI{n\?ӿRڣ & /@x$bx⚠OM4u$ӘQOd-{-M#X#(ieQZjVΓYtI{r w'UF.B]; +pSˇ}f)fP14 eGB~ΥEK%B+HLlm.y`ߟugNXgV xҔb@Jf` z&iKKU.<&ׂ/*$M>5ncxLV%kRӉEM<03k8^&TL#9f ҇ppKpH>H:&eЪߦs@jYTv@xڡVϑʔǞK)wx.Bjeqb8$- s$*i/Z.e1CRǨe Wo*j?=:i$]VH'5N[1î1kQJіZI- E RU8kaڏopRB\E|?ЃE<>~F6[*CiTQ@ SJ4RIś'#Jփ[1)RʤS-E7CM7ЏzNY5׻ζfBxb62".g<*dh$ed[?#r(?p%ԈQϮ/Q+Ծ0EKR5Aow3Re01@ y tiLPcjBuIM kQ<֠uGOqiR(& ׮ XI:&GQXUi"v`}H{+©x ӇhAZq'R e,̾aQ4HE+,I rV֤=$EG$MM8> M0O뜛rO 4<.i 9DJ"yW_L}1 548?*ֵ_Nm@!z± 5hEHQӧj'uiB+q:~gdDeuT2zC =⊃Q:pF$>e<޸ADJ31Z- 66 4yQڢ,jyH?3?xy]R:@BX0YloؔA<|S@i1ӎ 0xpJE1S0DQMDޖZt?l1-@58?i$NtESífN(a Ѱ"MRhɱH}r|ڀ}Am=¿\O-Gom%Ts->f0$ʥ 4ŏ; I"&?/.tM&H& Ԧ֣q٨Gae3Ϗmo)R ӿkGhfj 8SZW"0$<A?=|iOj:(pW4xϼ{l.vm𘳈d}LVR=Kɼ6`L F@0|?]Sâ-ۼæTW3..b*WlmL|ӬHo]{;ۥ߽nooIsGqmmC-B^Gɕ<-eܠnp8[h$4 Қ;@^[o 6dqTLS$i6Xy;d ofQh`Xc-HPKU{wwIsr^kVk1Jq˶G$.t[)Nٗvv4&@Jl[nk*&+C3f2K]VC9%/iإٽؗkq+S)sq2km8Y$7}"> NKDv MrSz`BW:@2u\Y=;qnLmR -*:6m.OqeOTtEPm#6$6A`a Su%Jd-9Whoc PɦIwh 賱yG;gqYh%:mELFlRQgJFN0Ml+ eK ]3x70M|uVQC29l+fvշƓKW,匬&b tWPb:os/_)wWvF>) 6><㡇/]Iyӕ<1sX{}7XoߦYfQ*4JbZ;i3)OEw[?n[϶oo ȑ.hQZH G%T+=~FGPuy[eK<8M4OGI[YRzbUב[%ť͝CD[YBL,KF pVBۚ7 Ðe(.gkvvZFTT,`$1$B[#Y_6޾#X* Jh#Yc4soy[X먲ZԒ-V!6-_v%6`&ApI Gs>|moh`r4c ."zO1|62)Vwjz )Rõn /YPPQI*7 ,0К) pOu,|Ibi֠1m̐RK&k9[9,SL~YygVzosKa%v|S$o=O64>E:I&i$nb xmXύ# gZU ֹma]f{:*d[ J dʬ( ٘Z8r0AGR7z ~w]hp?,oHmg4U+]WNyRj GjXeQ$@Ij̪bdyeͮi_cod @;P})Z!T+яO_!Y&& &U KTQ XSR2x>PlTp|G{:nmFX5h@Df2ɬf=vlWV-Y~y6>+ӇA^[_lFnܙ*4Ճ=Ne:zmrbyMPb 7QM̷=Cyq4m#[ƬE!?dK 82oX[~i2yu@)ĺ]ZtU&Je;9ln櫚2GU Ls^e~KsPSD%LJ+{],,ۮ,7`҈NJFi[ Ĩf+iQJu0mǵ߬w$kID:#Dr9HWbƢS&58\fҨJlfK9i0ypy\M5.(:ߢQ,$S&c;+p*Nu+bNhJviTRKVqs%2rn֜1x=RxiVHf-ֺ?:3x(7b>3t~om5+٪܅vO!JG"ac*ZQȪ " u/͂hO_} b<3VF8u[wܯ>sY+2Kv wm7į1?X՞Z YD64u[9-dNb3L J@"3]|JEiO^KyKW-Zh %*IGJ<3 (&F^X]O$z"$+I+H >nɎE ?Ab >TIbxS{XT$&D$aBB)kd 2nLX=0;D&Jh磉JID ׻P* w/zmz_A1]jj QxPLiã3CnHr}iӔkػQJQmr+GaKWVFMDz~a~~\g{<5VAwHFCT3d7:>~T^h[[SZ`DPaB)P] hlH]Y5] * dx&^uv, euQX X}*y/Y(H˥WBо k[l#ms0!^ PL.KYh'vQP}h:^Y j(H>$e ,Go<4ZUV*ZWWF6<ɾ5[СPKWE) ]]{lLrx 2c(+|d")F>Z}Ut'BIJi%`87 "XḦUҽżMEbWciTiZtSѤQ$tc9I&=vB|Ng3] C3G?t@( 4cΝWݡ =Vō䖗K ܵusF{cFƱmcq7-.vtsX#Ia]+Χ*Gg_W)YL",}6fhn|ޑ*֞P! k뇖w+.[dbD-5 P2wPa/eg3 Ɠ:/#HJ;y j:Zz JFsRZ#S9EmqԵ?/_KF:"1F2\PE,нn׻|v74\M4H|M@֧UV3[ w߻Nw NiY"誊'QtPb{]|nY$6QZ#V+Y6eQPNj|N ~m)6pD3Wx2ԡhwF )o%6 1̔Ibp|o _\?#oM5X9F%YWVJdF`16-X|ZmhE2GRyvU$Mc^nݗ)K%iExS:h$ $c[!t4ywo7i]m.#3$6ߦΪ-TV*\cCo=$nŭٙCd:>=))6]#WUN1 \b/wKf 7moV;W>&e`@cUF5o;p{8y\ih@#4z\ŋH qf^f+1YwuvTA1OSkTJ1Pёt.ohYɓ\fAuНG)(w -ⷒ IuԱEjBX,fE%N=mF c6e75F\YUdGv/5 xW@Ism;ݷ][9mqۼөCB\!h#OJ7~aaK{ɮx۴.43iFUT vfJ$X[{RQڣ^F(M'ͳP z, FR\䱱bQZ}լ__Ti}kZSGRXX]GcB AtebA_V!d7)\g:tFqj!7ѩwGϨ*\S~xبd;I ZTF:#q M3 72I"+HcGGI>k eUO[|![V5%T`ګv]EnO鿠x$cҌTc$axkCU$D$dIZic* 4,`")~GG)*+ M}!P 67mtiz:`DxShI TԸ 2ɪ) 9*RRCRHKoֺpƧˈxICT\׊q<{5LO:fQ"V/X&ŹfqqoE?xpY+*+.Ȅ"IRggiEqC-P*qm}/jb?A#˨0:IUFH|++E2,P"Oјi\$UVxiiӀgI5H.`AI{(ztui#9ϕEi>T=5n(c 4~8&ia!)dt0JX_u:@_ZӧYdhW& J>5֡IDj1u2V7M.7t+J_HK&9:zp85Mj,V?H(ʬI-%V'vW H*)Z?VSN部ӈǐc!qC2XNJ]ȉ%A{h| RC<Đp2ozpg : @KFTeF9 {k[wc_.ߩ4k3Zuzl<$o ŘOv|V^<ۣ҅`WIϕKc` yWӇNGiC(:L _Uqb8I4ӪW)?@ }ѬVPLJ~}Co/*Gu\2`vkm,S FG#&6iQj}L$ hx \{qf")bx "C_jǿ' ech$z EJ#SY3$ZkIqqoۘH,KQR]--~'VF)H 5buО ƹ)OSFQ =e>c!K_t$r/F#Y&QUc{o-ur ACqN뛅YfimnQY$'$M1AL;r-P(UWRE4%~ݛe6L*jJ65P%CQP%LؐBS%ʢshA -PJ|FT\Io19&RB҃)^? qN#eR˖+I,6:= EQS-\xiui4 Q';Bb{+f;r^?FAE˦ -Hz{wg)}sg>VX@K* Wl_pOUQZ-1XuH؛^9ii9$OYVf.:{ ٹѯlЈYQtFPP;|,]H.GHZÌ(A\U/FTVKǘ7^>O6)hxJRW3'tbwK)IaxiF%b /+* ^:Q[=ew+sܶ{n"} ,.#TdF$H"-NJi]VAcw}Fߦ'w,4 #,/e䯼L7BtnRڈbG(j^Jw.xJ mzJM%˻d"M&U [x٢rrO<UL jJ*ygY!^V?TvT'- +Ov4 *MR VBA4R{ᱚ[)PH JJҢj.2斢-u5USL)ﮠL^ud[ahⱵ ' q,44Q7ƟGMoW>tk)G4`bj!̀h BUI*bIv_lߍ˽瓮7`6PkQw&뭩(kᪧzA%,ɒH!U؏k]joߜngiꡑH%x㺹Mh4ТT2u.]5եܯmc%͵h:"%ȵ '?N$f@PhoÏ-WSB5,tmIMhex֝AOqRio.*F3ƻGi@M:3#1@bLh áZ᳐Ę۽c\s,Tf= H]^i҅$U HryLWD M#Զ*IsweK^OkmL`cP, e&fLo)rIU5!0.+-M Vgd@M`/7iI6v)nFHn\Jc;*[7ɶݶ}\]b52&=V]$=㡧^t'^Q66 W4u GH!bSUЖeEml*4!hSFT !Dp wuFX1%UBԂIGwݹ~I''JQܒM2QR*j ,#`DQ-YttsY/7-Ui% nY" MF׸s]m[j40$ʹy!p[BwR(|sv*Z=;s-MALUUJ%>;iSGW@\Yux% 9|'"j%D\Z#,MBi(u1--H 2q%RW:FqV>j^H65vG ]-/`WKF2$Fa5my?yk%I46񘤑B31f FAjK$#%-K- QR) (nWBAZ-OJ~MO08pۛ)67%H" ̔1G8Ɨ2LBUɷ֪CAs)DyEI7V[dh6:jf:1=_yu[EI '[mRG HH/f5Pbzi1*m+ۏp7T|2ѥM#C>z$⩕_ıAt4aM'E;1akD*#2] $Q!b[+z,$b!r-Dӱr ^&VYcu+q 7]ߒO6.|NԋK *_a_AuEc9K^9ZI|| b4Pt$ȌG"$d(@m9WmDUƝn8\r2[h::i!:!y F:rI"d*௚bMCPF*^+d_j䍎dI%I!MV*JxuUn v׬/!ٓs adAL:jH~߿737Xx F3 lX>?K51ZJ":|^9xyok%ܧŒjUr5C9I281u2.'ihijdxt0J*ɜ6~."?&SRÑԙ=h%G`OujVkZBT tdZ\^Oo*P]ēE ck@VK5IszWP*)+F>jo U-ʃc6>3\*pj0E}xW*!mAq#&r58g4OA`tQ =9SĐ/57+ܮ$i.kRKv 'jFEzlf+G8DH{uֺ =&sX>\$QH'ұ8M$qR8O(matN)_:T'̚{0xY! 4>l+zk#Kun6 ioRhI#;`o=S)eJd,T-o:Gw~s,63QswI3yw.ղ\nq%s/頏$v (%*P#UWQZ餡Eo|f*j\jEN\nkMrKntY ҕ8g*Pm*epU5ą*qXjLRW6 Cl& 8n*斚 i)bxO%}W*w;s'53HvDu #Jic$_X# ߭+6#dY@D "Xԯ'e4>KmMܝY./1Cj|ZoltUƐeBOE~`߷`ܒ%r_YT,̡c1}3eet=۶ӗp[+I![F7g^iñF-U[os}ʼn 2`#fb)V~O˞+]w0Ao JjM+f"*A!I(^sm{q}mYa[Ol$32d<#$lsWX,{o`+q1ywb⥉~Ig OI<12Qc_Fs^֜b&l1mC Yfkq41+y+e/l3G7r7<|LkjO rP4' OH$E9 ~ݴwrccjE{.yz\e]=-M<c:hd>28&dIwr gգ4i1SNmn6Ho7ܰ)gS&ƕ'8lM,6_4< 0'K<咢eyxئIJHTGEC|=8&t/.vGۛR6h@iB髯my ×-CkkndgvD:iB%ƽcOa<-55a>efaԥTcTSITg 9 n~nyu֏u{EvCu)Fp.td#ofؤ 28bEdYYiD-ިB+HoZ75!mŢ:l._!uiANV2JZT!Q+t g2 r1 tJ:TI32r{9ͷr$-w BdkܢG34xAיy"Ǘٹ.qmĬ&D\;"pn%ⶴTZ1<ವKlg UM%v5a J}I}c6/ql- pԃ_,͑@]8W|i o.7M/(#ľhfH7 2 a7$sOh$wj)MHbʿZZVY'_oZHͩrhEu @P3ceLxcuo2'ј̀-"ֱ>d$ Sk/yw NEDj(J5iLYy`j*Ԁ ("?sL?n-,lKԐildaKc++VjS볛QKN&jYYP$*dRͫzNgvۖd5  M XcO:u9d]JZ"KR H0-4 ?STv^L@8EG+!V>ISNBI-ܭ4k $=AGZKuPSz9fx@(lu8kASNc!;Ωr F1҆c"]J";9:D+qbOpʙ7f?nHG bĀ0=)OEma(LN}[hzm,QJsTQ+` ֦JU g"(@D֝NmY%D3d#A>БbVP#_mU >*)3 Cyh(WPԼTW7C 1z <UV:6M8?:u āڒ9#hcei(j%DW=tکcm[=ëvz5Ѥqť)Q~y#QTSVu4I14E.E#lG4f>Q4GzRxs ƕ rO@:Be20!U*2%2!gLKocc*Q$p0?ez }=D+DJI"VAҙ^ĴZZAcrSbcO*l^6Xj^*hMD'O>yw=g.wS4A ( {b8שCp ([5`5 ('f˭MebRLNZ]KÂW>g'5,L5~URLPbfMw"vXTT97&(D2~72"vP *v[չݩCjH*%TjVbJ%v24he65ۡ'z[A3k lu`#[-!jSJBQ ˮ#pnlDtrUjU-6bL }*Xb H].%,֫5K|+NXpͮs";|8g*;g!P93sq3! y"F1TTEZPz-w[b2U]BegPeH%5=vmyoboA!X;:ƘZfҙ%}M ayB~j{m,nK+4c4}S%UZОY%yGFucᕌ`jSP BX):7P5enbrK09*mݹ+ Q"_UBF{[2n~l7Vn@@::kqo4q-V6g8u2,sޫq[qx nY$bMh.u=cOD͕cb)=SXiL Yo;soO6=ҙ-Kφ1 O;٢i,XJ n_-%EBU$+q bHZM=>;oc'jfiVy'Y$liŝ÷[zb^M޶ͫ#{%WXO3B"9/ Ƒ`ZC&#H㚢wJRBڞH$D I&8 #'J{ەp\[6EzJZ5h1*(jZa4:ȺLMva^[Y6E00M8" SVCX\o&="^I&]/$nEF(MC ?OW'q2d1xNw*:ZJZAͥC m"G% ihG5cH#$(J(vRWcc(!]@%VR(~]kpx}& 491kz Sf3{-P㲸M:sYNm{&;]&u8GQ#Յs \7:㰯,wRhe1HCK9^cIrR{?sO2UTmJ\J(#zJ9+ (9HjIĠC۶w<,`DdVd`FDڪ5 ӓbWt]c!K`C30ii5,㉏2.gS:Շ2ԻEOl,&.,\Y+n[VRƮi3Բf !\rmq̞ |,+`1xeGOpu[錧@$H!*PjR3Fx7p"& {%j^?菬hX'8yQsC eڶ@T'ŃRufPmS!bt媲3ƧeKh V&H ov*BD 8ԁBH=3Y۾uBT0Rrː)PG?f 7)7E]~͒Xj SIOQK65yHQ6-2' QrX4 TV)ar N5Q nc(ݷ+cMWxiMFCbnN,ShOmi+ kkuƢm ׾0MK=EDo-aޔ?dj^I4@=?0{i˼n/Wxq3I$} $q. [Nx&yQ.aDć 4i@W&=l:x.]d^T|Cەu0KS1bjdW,Gi8DHv-Cs4 fIBK*\' j1fޱ(Zim7Do2]Ɔ):rH^ml&z*'8|asLMqG%$꫼oMH(/bcp}qv,KSt$-ΠRa&+]f"H5 \㶍6[$„H^_@ c j(p:mɷ )6TU-\I&"L\!i)p;3sE8>tmhvHp.]ؔLlfF\=cVG0>A]a\( ASbGhHu#o׻ggm7#5dX1#XEB4ztnۗhG|>22f8k!۸Ccb2=UWܠ2FV5,{w7;g+]򵅏]_D}0dF"0c;vq߼eK-K $1+>dĻ t%,D٘w##h7$nL)i1L%VE[EE|9L\3Wxe)'"3niŵm_46\"F5zO)dR\)SLkO>ng&oۇ; "IgHrT[F&8ʊ0I>xh6NОURA5$ϒ)&PE KOEDݦp6rh`e ˂00dׇIZjܕ=Gb|9 z7Y#SM[Hn 1> "3GUz,}H1b_4"q]4 z{8ji2+ !.ج ZʍPP,5$)NM\[qq-NU1\ET`Ti5A*.#Wmy1\E FV!-tOY5J-;f*u{C/q9æm$7reBUjҪp `l]SSML?M\X+,j:C 1ZpN nxt`{ jc(;>3ęy炛%-ƒGRJGSWZah&7CkV&@F4xd$Ww.ו(geiv*$$EpHiBKII6gHvI@}+/\[ۉ&,B*.:k"O('oZ/ !M{l.Jܽt%F" j=-vͶ+J c ~w3wW>'6)A$Lٓjٜ{Q暦 do#IY@~.L )AT]/غM$P%IGnS6H> UO^7n7"jI.>zFR,v~}2\ zz dH8AU `)ACp'S3yĎ*ȨIJ/'S}=7Ò ??:q,JD" :up@UN8Ԟb7_5mx.vy]֫p}cL%#p폯($g~X~ΌSڦӃj4N#n8';{mT4tZU顒)jir0+#6BFpw"2r,s>Uϣݶ%SK;Nšh4<ƜK̃VjJq2ptAI֬Ն%TRHIu,d 1$ T)uwPe Jb0Pz= xn ⒏hPxωjk2Fje|IW051mm0{I-۶h]~g"ق奧JA@c]yuql@U 1+9_&c?QwV:T-~ӧ'ҾC=xOb=Em緷{v\ul{`(xq$~TEHa! 叿>{;a_w9H\Xm("%L n刹4-ߐ(ћd,ͯ9'k"m;~s8 >ɩF̐cbcq%bd!UJ(-8~vVI[,@ t,$NznwI}1XP*k"S[B3Վu~鮍u"yՖOS5|dƮE$W+߶D;sct&x"fH#łiK (A#Cwɇ,.He3C+HQ m?jGV^{e`f_d㪡=+6. F4%,Hf#f H$ G|nb.Pܯ-C H"q4k"!D`uHkSdw_4򼬥ֺ*"_JY墨1TCPGݹQWOQ$AjdZ5;i 4#ԑR!$lȫO He2_]mB̯=ACREA"ILd4E1ͭLe2,y- NY/?n*-Æl]ɋ=˶r٢(a2b9:CPO+YP2 ˹5ɪB*JB̵!via6h c`'dO-wWJ8,)6 u{enŏ:ReಗaWHjʅEuu[͑\ܳTΪ#M,(x/Y5Ņ\-;u0*#4\G&OZbpIET}t)5zQƩ U2 xeO^nQʳcSiR ԅP0* 3~nW\ӽڽK!2),q;(*(*ډC~!iuvˡS T =TQP *qsO3Xr/heo/4 P̰k$:Ti{m_:RtIbPf̪Wa}zoK67$8nz\_)j&|.Nwk%9#uy'9W1[ZCq#w%>iY4R(TSsOrb&`0< WWDu5@fjT=&s'#%|J*e M_)y(19b^d䗖sea*+ X!FH8/cH龓q;} )@.nFY T՛Ar]df1/,xyrG*b)rP(]Tij$ee^Wxjr[i%)lg&%4ӲFeiq3Y[k-ѵ괌n.^?QY͍I \0o6~Ǯ9-C,E~ꧧy豰S})wX)h#hu.Kn]nV޷+Z{&Ou )[_(m3)f ׽h^bk۬lVcHHJd1[V1czJTdYSj|FYX7vgkKdb""RtLV5Phwhl7AeR#ے)4p2PafEԍZ@C^HjZjtQ4TW>橨T$$SK_#,>-ZU&HdeCAJRmTȭ(z|4-͕$%7jSRҥA!"$>Zjj1+Le$%+"$G aQt~4;hlݖdi;4>E{d5uJj&y{M%MjYV6`[Nji$)Uq*,e56&(iY&wZ/## A$qn$]jrȩ ZjN9$q9 O#q"ibDh{u^NFqU rc%E#wlj 厎Fh.`R b pG}- ,MCҒր;j 45\ K"&y$Z2ʼnQ i@JdrF;=U^/r(Ys%WM66!dZ8Nj2HYOs٦kKǹVxa|cE~Ig:TR)^Knpr̐,K ZSf8-$'.?{MlI̱ZXp8Q; o_ZpsV^ՕٴGc⩫bTz]]R\u`aJ&!xh`S/QdK177Mu;>K1EaBQ%jj&b͛"d%[3A?bj&+0p^䩱Ymk/5^X"$-bJ]"dsrI=='hiK/vy#U]t8vy/b7{W+m9c[+eU%C!rg+,5$IF*&zsz>+SHZ*I"/)r7=K{&Kۍ)H"t!F4 FaOG{9rZs?};CZh<;6#?m=0 icVekUS[C%4-\ ZLQȃyS\+4'! ԭr(M4¦CZtч{)Pۃrbj[.2Q]IG1 e=vcjkѤ%9(I@s6 HOi\IaEy'i\+)*a` 1c;5^2]g)+>F-_i 'P" L6"@rK5eOh KSQP~~G5LqM"w*m >Y#/ Ϙم˕yE8 mͼ>"Hh!Z/cZ61j92,@мIp`t˘߽cWXN@yU4 YE`Sն`޹$EMvh'jV bI4UyUf .8)i(qQU%cSMйfȬXO 0IηW:JKo1'{Keӯ A@†\o=sdn KK^ 镖Jɦ9eRiZs1:Ta#QQJO}>}6#Uks,q3Fp:A? =HEA{6fڤLN K%JJif$ȫ/'4{ԃ)TfgZIkv''D$XV-U]ۅV|b,4'W`Kk-I-4i'@44_\>'5X%>JlxC)q#S2OMW) 4,T_OYl;lm2.5߇jĚ 寻m[ft^UTs6H! 5kRA='WRudnn+;,6R̘~֌L۾#\c `iyo>7)¼cUIh±8V>RƝO{w$[erv#0"11xt%I ;hĔ~iz;Kp]i3fn>_4ը z%Hiڡ,Oϟ~_q,x 6}Lt3&Z:á +IGQd3,,UHb; {TקNܽklf!jzUo쬆U6ֆE=W3[P#59 +-Or/o9cf9[o`.ZG9 jM&B˗쬬Mus{t×N` Ǫ;4$PnA㶮,*bg[\]{g7eo F1]!)G(j5AÙZmщv+hId cLc iNC6MIYC F) n=DVUK4"`m[*W0$ SMg:7tpڢ`ƲutNQ+п?${~ݓlƯ1X}f{dCGy]14AFY!=78>s+/'ZrڋR(enuŷ]]E K2@Y$(d+z.-.kEACc GX1J4RG Ug1yU8RHܹmt9?oFn f(j _`iv 71[?[cЫ}I,Kp;hI:\] 1-e@ }.d*E~`}Њ(V5Z4|x=*ۻ\V/޸Il)iɭ58WHA>@}/cr}|GTekr԰+*xytSE!rZRA)oK3?!9V+P(8Ճ]]u(2*e*ܳX{i.BIF+BŔCO:ˤb%`3[G$j35VC#k7X*%б&_wm7VRiD,, "JdPלw+KnS"FEg\p劚pvOQAa*ѻqս_k6aR:S>ee8㩝S@Ϻ/!=o&9dC#WvRC EA'Mz»uet0 Ohd*X#Do3w5}۾w4{Tu5 Vk*AV3acv_彛lm뉄,^$;:H-J3 М{*ʩYaCFk+Ĝt?Yܔ%wYa]#,I49@ G`UY:FAm2АM~u=ܞ-7[=2 ˤUg]%a)T~-U]&h.p}oj <1]3Z׶s@ 5.EĚǫ>)cG+lۏ[}[hSVm'`gtMHʯYʰ<ȶ`mbu#Z&|X@U xW0Ml%3 xe)M&8***Ү=8g#W48Lׂ{G %`+w{`RXԃ(RX :!js@Pyի%>4Ohn<~2%v5 }f[ɑ\E9YM:1#zYRP@y42!id+JjBtW3#Z6ӴXOqId@8FMjsP z}\U2RG2ezFF5TAвNZr 杚5喧ђJMzrQ f[ B-\9\qGHb z? (ºuo`l9;R覬i+L$ez1Ue) Ε$O5\+5(A}Ngٷ .e1 Lc-,WAou(ʾ"^+U۬kb5mU0BhţUGݿj禎Դ3B']p!ٕ&T(3jl WFu=h.q8M X1Rji7 <IRvVfiѷQEmT}U~Bŀl<:`g3(d)PQ_e|ͻfos3\I 3.dY? G@QB*YۚJ"S+ Ur +}Lչhl<lbtck&] =.n lv#bQ<6ְ*eyE .jhO#vm17 xi49R|btUxώGj*?a7FRGTXY[gb6j9fvc& \B ܵ's_͗V`taC@|%%BGOQ^o>Hk"d *j)uH'DDj>]y-ݦh~tUp&| $4Z0,1S˗[Y_n w(AKҤ39,ON6jZ|d5ʱd@Q.Q5Qu܁˰m#AAJ9qFi) VHW,#/(552ir>pcZtnnmcEvv3BOs9(štmZ O{&=]GE'4#"GIBSF[WK0ӯpY<%~8b϶?l:-ۚ٩j)ir0eSh8qo ɮKY}$e]mYɻB% 1 :)h$ оb@zCZ+QlHy5$&@6-]?_l4U[gGM\f4-9 0Q| ;};$6*]m]Yljl^,OHw &%Z$=5P |?F(r 1U֍Jkn4^J%}JJR5Ux+C_ ؒCt`Ra5`v3!OA%vj}Rqedh'))H"ĩ=nyKq[8,..VI-IGPZ*#LtIuExV8d-$ #h)(OHluոj֟kbbRRkRd) Y0jIN44Y~ ]1&dj0UeKwTgn[ms%W @񪑉4.Zg\ +p15TdzXڮ`@uS<".ccgP#U2HE -Ei9Ʋ"dC X@6]f5E.Va6a+)"jH4 k!X:fʤh{?hOs2}mc6)-(AmnQ [B3T-2x aV%WWp͙VW?9`E掙oґ5sg)=e-֩V_PKP? Ѩbv9jm Pg3Vo(#d:Q6FӳLGh:"|.[ UZ 9h,G,YO)}58X'ajx:.R 3ЬoNbVvjKVz8:vLJ:*ɜ%h G,YQ*ǶX/!u1فZ[D"4dchL#TIے%9Ϊ22Z.S r5<m3тAno<%K$ 'T:)kBI]x_@1esT==z'%4mYP9ޒ4o^.@ia%P-h28E~yE.Q=έy2PCML`Ha-ۻvj5c")#i.bI/;)+2JR$MxFPp~t~Ϸ'MabZ 7AjQ 5-oK1\L]lpĪV^Z%R,N"ȬTh4A&x K>9f֤ !jX<^"|#IwPV#]XE.x25uj__^-`m(A(MF  UcIA QU63jYTGI9 Jq¨ӻVyҘ4=(u[TiS磻UjRwUl-.3jX:3ѣ :"=fR4R>g`1CWBE[ 1,XWBLRS]s)k(DMĕ5q~ONi]YIJpG7;}Eԫ4$SV:;6y.A[[14C AŔԦ G'[v:SoCY YyrW]_V.ZLjōSQt-QhW  yzM~JXCs9Hb@ETq@h;,=T +Sqbڵ$ \R3ڱi,ꈃx홼sxv)ip8pr+LkxcV4BBrxb-|w+m&V;~Mo(-ĠG`i=LkӸl[؛S;5OouV;hx, /mfEIen ڹZJ$Di`n sy\3kcHԹ#ŝY+ccQ0O%ŦrӮ&G_ҍ8lz>ԛlT>ԙ<|hmcJeA-MVLeBLc l=/tcq=vژvC dGcR+Г}~7M vՑQ5Wa؍BYu~/gNΏm>v5,+EDg!KG C+&bۖ=~B+1 m疹U&ɀ4H+P4J4 gs\5ͺp!X#H1BV(T;Vc>իݽߕ1{JڦY,:TMf8Cfvz\pw7K0 Tw5t`d QIg*[\m{ $D**{T: ҹL\F f1ԙz8jv/%oS=RǡuK#4?s/yﮒLBH jUu -Ð6Egf\0̀W[yJ=t]M_6'VȾRga[%QZ.OGbyUA:HUdc~1{;+ܵGP|HdzRPԵkN[o6QwmܽѾBñe*Gui_gu˽wcceb6.Vv6i1{l|eR_ Oxjkr&i2~ I2%xu،ˀt׆8sO0]n &gQ4$YمU3ޠ!`{C ܙ<Fx` -4zJaAk}2}m܀_nNhzG&y>2>|S|%2! aKI !Taq[{AqϗN4!I*,!+MD6lb!mBM<j3מ ,ȅu[Ԋ@,`O~ZjP?'˦uXY ʡ<7i7_m|li O*ZiCUE]5lͮ8{fHCңWJ:om$Q !I<\@Y04SPSҔY ^?ԘaH-aJvUR\~Yu'OkZi_8Z7a8R8ܐew+ҴF+v^S9ILB(*UqȣPUkC8U}'=N~ݹÒw݈팩VghجzNTy[-͌V5\xIEL}[<׼; g$Q[ bɇZJs6kp aʼr#dx2ǤKZj UA [GucIRu"h#d?&K(Z9kP+RIF&TC{ 7˩Ȋ{ x:Z捪mgVPUeHCGU8O\VPR0M-F7 MMZ>*_;J2#iܻ}S.eAVljˑLBHrcKRwI jI \P"vmE_SILgfm;i: 2'i|~u.K]_Rʢk (EB>$$Ej;aw>d%TTAb*NV{2YNQI+h**eqGE27nYήE^7䴆/Ks6C",2r1CG]V H$!T R˞.Ԩ)^>Vj񦦃쿉U$9jc4TV [ _ػjm^l9V c!EI ar8Ӭ/~2 *X%\fRnўfSϼ>EmU48jەUjojC"J Y@Sn]r+moL]"e$D@1A#5 R6ne9@\ZZiё3н~[-۸ -tfKsPդL$h#h-%9Ry GCqwM܅ ƱFX49G!ң;Mvoko4 a$ `% z[r OZzNߡ|F'!-D&"Tʒ9*nI^VoݺaȻPϵY@Jg:Q1 $JT1 k3mspws D-H*5#Q48~ܘ|W6Q^GZ\bL)e t}6Yfc]>9jSf=cKQD<$2G--B„BjkAq_J*r& V,fu1IP| oH77I\n8؉57#n*4EcmxX,OgUU?Pd$2WTE #@Qj% SD%I, m$ζ>8d0Br!$V%{6ѸgRpk+]T]ޏ4TijɟCZ^lt d`•SﻎmhG]Գ)7EDްd iR5l[ibb֒UP*!ٗFdcUAyOUϸ`r F2=͓b *G!\T*x槂88b9KW؟bnn/no[q* IYV%Gf `ImFwj۹w` {=fE`Z8mXBKrKH@1+7s~cStOdP.N?ب䖾wm|+MUEւetVpw{["{ehoo%ۑ ju ˋ[e h7 dq5 [/,)[WP/y>ëBr]? 7>ɂ"+f'֒+n|ӷwSke\}4b쉔d%!$Dܕs]+HK8[%.m甔i6)@&oߑg>}d5ݯ#d [Ul?{3^*y`"2XǹƲr,nfhKRoĪ\H[#v'r5̜ɺݡ dy SAPYbHl";>[gVNn[&5UzmOOWڕ$MzTZﶪX?] {QμkȠB#{W) Q嵝9">VhY[O$s Wg}a٦c,RKd. \F~Rde{wcxlP(6NhP;pr%)r{wd73D7NjfdܫۦΣB( u7[N}\bTz-5r/dkF/LR͖6ƼW-N ԓ6< XcOJ$i#mo #2Ʃ&ht2`*3wogUVՕ2K*NA12v>: EML>sHkg1=;pAWQN|/9 Ȗ6եF!ۓ5i* MG,K#ہBՐjС[cV$V@J _!>eZ6\jܦBIk) B ΋pAxZvH H X,A*GfoDyYTP0U$ EF/SSÏ3!KECIO ɐe|t1\Mue˽~mk{( TmK!Zi`$*jfpƐ/M5d_&TKynXə)QEDym_2?n8#eJEc3׻KH)ZPiJy4Xlܙv*P`m?UM:Hdg)V~}rƶ9$Tzp3==omWkb H` $ЇA ЙW6a备ٱ}B JWt-)"u[Kb "iJq"LVv FĐF Mv<%nl(dU1)IHX6#|uR2u=jF{WʜM?qt` Hb*3/c" 0ۈQȚ *C KSPmw!TIE* #' |ķYb@]\tjsZВOgŪSmR& V$5xՉb] p}gI&"c4mnhF: ~ ~c&*N<}`U%ES2F=a1OiH+z4E%rxf)JTt}ctmЌ^Dka34,7# 6pj=F[6#]jڇpr+RWmDTO4rb49)jbu$"]Qթhk$#I"N;.AO O/̊yt*i7)6K}0\+Ƞڃ |PXN.bnnLgĶAA![OO#I"טG7b C y3nsmhHGPIsګi;0O-Eguā4HtR*ڵ Z5*5:IaDKvzy'Ǿ^[1;#G/fn<^3 +1X4R6F&Vdi(ԴP!6^`l6#}LV *HC@Ss͸yE}=*4> TwVRc~Gtc,9;cJR<}(W6a!o>{v"meoDH #e+ aAJ}ȳX즳3#0XBWYOҔ+Bn|VDiCݹzf`jmZlnfxrܴ~ZډX $qF?q>Fm>Y-[43L[C@Yc Tɑyw~bضN`ۭg] 'gBDAe!$]j'G۵:Gik1=?겹lU-6'M&6- n[seՔX|6EiG=f=櫝{tC3LPtiO%.h^m9~;m-r(qjj*!t?]9nj9 z q,p<`GQUOW* XHTr܏7ל7l& `UQhN;s`Ii25jiD1InZ=M׹97F5bTTiFٕ44WZh}lo\UlkA&P0{sZݽBR 5G`{cv$|" :o4GXc+M qvⷅR%U%OYP5Jn-3#K "ߟǵZ@T$t.ȧHu"&[x<ǺX8|: 2!넓Y>Ozuu(k7[k<؏pHAo\)քX+O(`[UGaO:rt=d1yQVak=]P4~Ci4}1!b Om>Νى]]h}~gdk&?,4>Eq鐥5R~hw/r:8*Ԏyb@9A IZրZ~|NzC%֧(T=&MB)UV$KQpm5Lvda2ixQF+N#iӑs&,w+:|.I֧ϥ>@?pioVJ34o#G,d OF4k;> W7Qviy~h1mORIaXto2`0yx%IUHu 445>VeR<@+$qmm%$p;M19}@8tm͝\ַKKEZ+;n:= !-͗/|#@Ɣ\|JOU;r֧ݯ{h-wS`%W7OMBji*@u>^K+В,5pgUcZ']~SocBH(AUkJ$ۓOmWɵ1[wl54ܘ̭nfe+d%0Y\bs-i7"x2%. Gڴf)f$cv[^YEA%I)`[Цָa)PSCJfG i1]م5GUEwZA>TtpBÀ3'8r`,wo#ʲ3GUDF]MUV:d떮fko+%Ŕp~XTv qhئn->:mf10 LHj|TS.#{ HU\=g$;F*#v$*$P,Nt6{s?ov"H2F)qQ;WO:Qx#excECh%>&=hَ່Dl|nC.W?-R1T|i8-GQgJϰWՄv="*b&j`G8ݕCjv"׾u-/Z"rb"I {$tMmvVEL+*sjMY&+@QT8\NCpICGGZ]0(T9c2ƪ!oh9?;[/' rf *f S t~};khptA$e5.MaJ_=9͟+ݎz䠂稆M2K$Ԛ*j7"T0MeRoi7m8?k[H%$~9 2,dg(Hfina/emW'CϹpd=F=#hTcb#>{tuI{p,q;,5RP2SX-vX#H,fFtƹ$m9#7CO]Rqo7;nW]Ên\/# MrU5d:e6s+}o9wdVs"A#WPqӒ6e)MfuRIeo9HP {zzjVp['.>Y3Vb2'9,Snj% mSQJ(_~l 6;ǂ[-lN .h$ZI}]l߽;ۼ4Ϫ87TդbuU\[7SuTY좗md+0cݶMm٧yqneI X˓,6be!>w̰ZDVts6omL㫲8LVC>j)f6j#F:jc5(g[糞ov6{qap+$rLPe|2BFwzgPm^tH|2kH=2 N; B'vVWfoY:++Tg%e㰌5a+2Y+29 h&-s O`/4m[9 M!#{)&%*z]{kۋ;F@zH ZU$ j#Yl;}LL|&e*fBo QPbx XYn#$bZR[O*t̥CF^Tq?(љ̥ ngmq큇ۛcin 9f+-KJY=ryj.G1j65S}S;MQ-&FYނ墦IMY5-% ;i[W,lSmjje67RPؖUy]cUSM"ofk^z^crܭH 70b5/-V1:Ɩdq#ILӨ1zѨT0U3nAHi3 X2vhm/D1'nG} ou}vGq5!R7IDQVu,%aCxI.9ߐ}گQ=+w&i&iV $ڲ. xx4Q] ϪƁA-H> &vץ\$Y#!{a)+kL׏]ÍrDn"]/SCݍs{JVM R?ݹ;g[1ኖ2oY_:Bg{ƾ-E/"x! C?/uz([<+:x'㕧@"n=RΤ\SеZqa UZլESN.*(_έLoOWP|?IOhB)%HPK,k[TsEda4>x1Nc`\)-p {!fҧ_ֵJpXeZ$ԇH,R3+_Nmr~H*TI&:|X*to2***8oϿh^ \]_ZI6 UI_zG˧F{qIPm%bcpKaJzm$ǧPacE3 &Y9#PֺiRO[ x~x/XU( cBC2G[sXdx}F_GKUT̴Ҹ ˆ*=ᓸTiÁ>cc֝qpjE! mPx ϶LTPQJ~]B+U:QҳUGGqGn#υ~]\xsQDD_VYY}Eԃn>NP"oO^G=ԯΞj5+dΟ5j}iuΒ իC0>5b٬tKg-.uq#~XG~y<% p=8.@?X%o7_5a:<4 mTqNҥ Q@\8[=(5y93yzEԋ}#V<_emIU:ZotP4H.,+֭ŏ6Ku, <zY\tWi.olUdYVjuz-Ŵ3ohL|6YEٗaMד/gĵ6GBNGu#eX`:6n,KYLB\+C!]򘮪hbc& gɗ[UEnrMU T-yKc웭݊;ƌˤ4a6(">|6˱®evSH4/r͵+}(dV0p&ViC=.. Tf0f =)(:@m;w6yڣ<$uH uo=E .2->uH$[W!{/],SvxkbM)Rı&}/dݧeIJ,1%—Q-o]m qYSڬn$TY.D$hù6T=ϓgoɶv]bfs1FboTd O5*KT"Y)L7Gn}ۮ6;{XnZ0#l#bPJ)y9~ySrݖ3s,rۋ*O#Ln,QEk3OnÏ(b5{ˏ"cלx^ӣ#,kGP52&,ݴ{R϶慠1c!N1IQ]KYZ elW %Y={?67~mݮ7] HaXx|x~Ijo]]zo۝,!ڬ'k':.5F1D)Fe4sm"]wr ZצIY0)q[%ۦ2#r*H)YooGdƛėU\  GHV@Y)$2ӟy.ײf̡|Kut "s0w3ᆍ Fl,f.!S 1Ze7S`cUPK.VXQMdvFPJbsmn%#8@'ܙ}ŀH^cIɺ*wM4TA 0R%OMivmmHk.0efbt>d7tK:X`w[xN6H8cz1R* Pmz}VC!6l,.w%>lu,F lwrt"<S%,#(ۼimkbX$2*ʫC+\R]K /JXpF+&+ 1 1VSc3M1ٸ|2I+βUcii6t2*ԍζQpUmD팚rG)8 MJ)qFtR52%LB5(LdBQ*/4&;Dnv۹܋GF%u>ۛ[&!Q*ҁQQmqAH9M,[V. RAV&]ykg[igfHcxkW[JT"1e'KvuO7m3mڻcgbsw7 %3EMBFhmpn"7iQ)# O(h:)aq9ek[Euրģ!XU@9aצ[ulCbǂOvZn\;VQEJԔZSO uLbw3]W>;uZ#SZF m8)Nͩk"JQ33DYc>'@Ԓ6VSn\6ĥ5Sn(xc.J AVE!ZBQMIb6YcT+Q'UݭvCmĒeYT'x}X Hkխ68aDQ6{/u֞cc)w+bI _[C[V-Mj'K$sFn*4玥*XD@ IOus7HyPÀ+~F=cD#HuUie O^ôtqrَ8:/%:\Sjl*ܘ<&f1j:$ n()43hUS5q$2Mxȸ:F qǏ >] y+|;h၍@aG H׹TT5} r?}S}yӿ=m+ǿznޓbEt_Q(19YSrC ݹq6lj'S+DX3QkP kn>]MmĠAU`UԦ̖O[r|)k̻r Ycݸd%mlnj3 T=UhW->N\}o?$4K$i&K;6p*Bw]lڶxg[P;r͊Zk_^/+ߧF}^~IL~塮%)Dih_g-Q *(ʜ)(GEx49i\WzljjA95z qGkCO ga[C (c1$"(x|4ҞO!LjqzuZ(̺Z OZO5?듽2Q2~Bn}!?ǪhkXZ 487l97c1HLWSBݾpEK1 y)4j:(9\ >>B4W$ƾ~i+^mQUQS^7KIg g}Gk=Ҡz/zΧOG s !5=\ڮpy?51+FL /u_/?R"VuDC aȷ~S<@+Y@qGx82,k40SGo~9)hT8?TI4362OW5K+©:Y)ܩςZ^4ku;Q}tKhP`?r}ٻ3pꂜ:b<k7R<O?lkzz*koQ+[?$QmN!qrxc 5TVFr>񼈈FJ&HtyPG#u }M$-h5y3/Lȯ LvPN$M4等 }uXTmLAu]4Mb?UB?mxF`hdTXÞAtǺ4E?hz7q5>^~}CYYE}DA`G@* }lI`<8iXQƒN4+sceſ~$SM WBq릉2Q2 q7?[ u`x?Q$.U@Hb .o{m}V0MOy#Ft֭k ͸"mB*)Jgzyu<4vF\M,$dtk<^G1@m!#[r?ĂX:sY?,g-,%8 HcoU-%O<jAPZ冫U*)mAj׬l <,@HB ӟaF҅ZtGEipq ]JkX_+ץ%KϬe[((M/4\6@G>Kh**կ^<$XG85y c-rfgno. i rLI5l=ݻ#I5N6w3Ek- <+씔!mf3#X}g7}寫[-@ 6c ƈy qd BE7^2Zǵ ZdcP(ŭ* I Ӣ]+=\7]-k+kryjʪj\UIXC %NHU+3g35W[:Z%K_AE˔*)2-Q,Y!HrG}e+5\\ JƪcAH*Yb/Nio]5!h-$f 7fB3mETwN;pWg1Ŧ9 Ɗ`6c[J/MKYqSCU/L|RJѲ~{x @D!V$+J N|f9RkPb<5iMZH V3Mr-A1XꌬxJ1 ݘijxs,t2 ;`ݢ{}pk+Y²LiO)[{vD؎虊hR%dHKE٦aZq 6ܽ J"ibꄌLggFaqK7lˆ+<)[3|ȉXBBʺLmg76KEh$BI Mb8E/ODmw5[nI  42jye.omV+ Sܳf1Uۢ3[1ySfpL]^KnRnM{MU5:QA]Dj{*MrXZ[&^1VV*L\[Ow,6D`Hw ˦4Fr#եD'KXn`egT cle^qE9-1-&i73o$ `Zyj_W OPϥސ<׼[ \[wog.՝Deo0$Jq~WzyG46xb8Z[D2L0D]AxbPX}ĸ~wlc;KK(rO16#qlG-eN)i"WGUC m āSApQIMmm$*G0qI3+ MU^qcvuK?IO>۫_|c< @7qZlu-]*EN {noj.izTPJOI, $Z#l$P(5cR}4[$r,|L4)&e0$R=0ëHE8v{sRno7{yDca<0c e)7F>jh-O q OoO'7 UpJ EOrF ;}bE m –1/z֝'AUuw v]^ m}wF;KO 3qޚoC{Ccw_#+ą@A? Hz$"`J:iǥm]y ZxL$ bLN9{tGLz.{滳qZrWE,䋲z)09\e. ޣŜr妛~e]dsmqsJ0KvZ: j1"wI&K(E5LQܸy EӨiV4RU767ds[pSwGPoEuO^fyd懶'$W6~%urٸ-/pQZv +:݁9 p>E:N}wyvn6v Kgn@vb[iDbbD3쬕`+=s*μ> >ɧl,.C_)s[`%rE$PP:Z5ʱ^)+ =h80'C.Xl,앃=Buv9(H^AY*1P^wFxήn=@+F^JF5SKLyj.f&Ct,Y[Zn6S۾滦ҨTTR6#XJ:AOZ3זւĬD,cѹ2!VE+2P%dp}ISg+TEJZn>Fj(Ɉn+ F$ۭ,6ʙQ~zmUZ+jwsn-&g/xoS:=|)۫1*ES ٽKKẻI4D2Z:Z70t_cq?i-]V& 2QU:֨&,=I0Zr7Tn=EuIH=ҿO tMO'W'<0: /Ofib~bOJ񿲋o1_q bB-M)КPW1CAARƔZ-\zYZ["y*1xJ,- bt8\jGQ(P\Ua@A'NX-:YJU@_Ӽ4Աā! o6թS˭pn&w 4:A6#&>As;Ju\*C{p& ^?޵P6@u+Rxgr#2/O9'n@ GX\osRA>TaJ,7-Md;&"%d?UۏaFXݏ(?6Zfs2@ )H<,$[z^ nIz&dQ[S5d$j-ǺMIe$3ĵѨ>8%zb^SyrFo,@̞iD}9u6Τ@.=iĴ-HHsp+*##_PEK }>=[@fE^3R`}rh!W){L17- rMo"-]+ƃ=4T8'ߟCJR-ዛzۄ/pJ):?e+:OPA'J48%'ӪhJ OY%Kq?!̡V/mF͠_Ǻ`USeFA ?>A KDMNZr5njP=ff$!X2 L Wx~ob*E)SVYZ)æUk6O77*G)F48 5/rO#%$Dʹ~J)IZZ)$7R-m2~> *j@z}2FyI4}w"Q֠\1^Fvpuy?C66n>ނ´1bɰ ??^Juo hDcpp׷kߟomJ^U?N = 1.p'? _~}\_ .=t)CL xY# #b?p@A퍲_G6xP͓q[?QI'H)'-v?rڅNжcY!AXA&2hGS#{-WG\l>/׷uW)JTTH=Tgl8C9Ҳ+Iz1bҬU>itkhw t[ŞW7TCIh̕=H5{f~vIbZTqnC w GԣITtLǸ]vݯɈMiPciCv7`v~{RYLnbpJaVm tCQ'4qƅM.yۗvXm7rVH/:MS©г"I,ݶvk'H Y6_FBXgogW'km>'\w+0W(;o~]jzڝ nm(Z(0KGG  d[kWvvQ A`?i5 \# Vz.ٻƲ;raMՖjtLFv-Cu5X9V81үѥvݙ-d60 XF9tצ76 uc᪤qUC#!C!p"iVg"ۻuj0%WfnQ:ȺiCFd%E*51(gg[Wں"\;wLBmZ-Aj %.|PL a^P+$hhΦׂR ;R`Effr{+7k#+Çݴ͹vc1UQ(}nۻ'"!e@ұ:*㮤ק|K{8[yvs#PV8& ns 'U%Pþ^Zi'#[z|&!qPn-` `i#Ćȴ3[GҮeյ}k=OP+UEU2F> R4#msmVp+xÃYiDA5:Q\xY`m> X8x2/6&?yj,6H⦦zi竌JY6P_4V * XPeiWyoⳌOm f8gjM;3X)2 kR۹(U6AJ,Mo8]Limj| t佾s;;p4y4J~b ){ }MQx+p?B[M*sS:pQ/\ʄ yUS8%x>EX4XKO`$Mq͖ܟtef"N;@TMdr3"_Y꽿VWaWݫL}g=F5"\}kjrGc_]_c㇭q'R=se8ym,Cr.Ǔk߁PN}?+׵r,sZ_\tOHf PJ?RzG:{ UWC$:<  ێu ]=)ִc_F8)L$Qyڟ  -q~{tV44:ؠ!s_`c#1V ` Cx۫M(k•(o]$Sٽ?WP$<\nU߳N~޶kZӬP* /r=azrNk?)|P`>b6Qci\ۃ>BE)[q}s`A)Lӏ/ ~u~A/}kANܛsHkހ㪊G})  I[,IZulxS{r8sc%֝luf/o-{+Zpl5'}zўƇ XX~G$BM:Hn=CxǒH_3ܾ}X1Qdy*IzcB (zoQȱ/o`j =oWq YUN"(ކ>:qf:AB+'lim$TyS8F ]D8ٖZ~=$I7-ҹT$ycx6K y s|:E]BEGt&ǯ[-ƝCk.q#**D SӪ|* <zCۛ}&Z>z&YEk.Ф6{oعg9~}ǝV:Di[xU F J>+ϾGa`,qⴭT=[ 5R =(8i149YJ;djVORV-4YSN!H㍤*{# .^Ġ. |5WKNTv.BT)ퟱ~eqs1.[*ÇI2,NFbXslM.>ᒓnqT-V䡟9WVN2|,uz{2 ')`}ս"3赚3DfR RUKGvddHyp!Vn!ٌJ-$ЊlP[yhL)f\] 0aSOe ;0FjN PK7Gl 'ݡXĚrQA."Q=[E@/[23*1ev`D[t5~ޙnǢdc=ZM]ruՍ! ,1΢hVE( ܓW['=s=7B5 %,)5"'H;3r>ukѫ<IEH-1ePTF TdQu%UV"3g/'=L٩djz7K#xRј=ðN@vy$ܤmGGA"D):$$tJFc^Zfx _I4M#I52&( - EC7wv$iI+JrϷc0˸r7xzcBsB&%_<dGpHZ:4#FR1Bk!e+}ߐ*זiQ\YjφJh$ΓJ"v7]B [jJ-mLjِ͙Uh3Y]^i(wVY*FR*(I%c=|b-eYk{1[ .dѤY@Y#<]$[.{[sgwju+՜kh!UO*td$3Flcw2Mw5iŵګ(dXVR-fyv{e٬wMy,;̑[#ctB+гDWI郭w> q;_{5E]-[&w`2Z nbzJHƙ $Urx 6~mҹZ̍:i9ok0T*JuFJm> *Kei$eC*gC&]2Hc9WrxsX-ߑgK/EME3 fq4ؖ\mJIjw$*{i,e$MѸ݈~Tq(U4҄tpۢnobX gc,Gn]9Cx5veb[V X{"Υ&+5WG؆ hB"2ܵK"KCJmD`P0!G.@ؘ|:L.Xͫ^ ؝$yJ{۴wl㮟,ZbO vwy{G0\;A naVəAK|ChicKNkvNcv;-++p:OG\F +'T*ZE ˕.NZhhHkUr|8P37kju}`om7oKH. 8YnAghBE=rlnqvehwtbӁr l>PǖuIHPsaorܶbR`[#/qH]p<.Ɣ'su6JYYF ߋ"ױ˿Lup?Ӌ@<ufhيSЀRڡߋM'#l£,O:mrQ6Ntg\}J%B&E-?>ӉU4O(F2KҒ}u3SfXn?7?`}|߈|\EUeSjtʧI^AIpRMZR:r*xE֚-rW%ɿ޼4i?H{/NnQnyj4 !dRĻ\'Od(.H Vb*1$:oET44îHdb" "0OQ *::|WyX4dIt٧q#8o~O0FzZ3$TWcTN*cǎ=,=Bu+~y<Ͻ2M8=P!'ҔqG 4 * ,YcQO}Ѵ+_N**/-Dq:jJ:lMI-FsijR5.8>^]Buu*(=rȦ1ʠNO".¥+R@=]!QQ1_:FOû:esn5#\fX$%KuBh`y݉2 b*4I9z5-c], H=WNZ@῍ rfd eB1T "H|ąpD{*82Ac Pt|iOZ;;UJnvpG$%tgCjVPRd堠+QPjjhS~ExBte򀀛bI%(N 1 t~i^=86YK)ʬ5vP Ѩ-pGj8t:v݇%؛4Xr#q:XebOe'<2Dg@y˓Ώ[4k(?LS@_ITʃ ǵs<ְ݄;V8  EbX{YMH.9Ք8 bv8%6Rjڼt2Uh#GJ/~܃:;ū&;RbYO9|2$eU=L'ӞwW㓘`{Se[]~:RGXAVEfaNk?tRewŤ lNN:灶vh Pc} F)at#؎en7|Cgth[u6J|z|@u'h4+oMr՗VɽZ$Esi$efxR SaK(6_|VIirtS"MUR ڑ9=)h܌>&a"*OQ`#t A:4sVK)@[H ,xQ5)?ovO1KZI)hd[]_+*d9UJp&m:䀕TMhz,{ ̶\;$hw@5i$ib:>]C~APː*>kga|!$(ZZNΒ~خkܛo;{֚jTqj*5Fi "ZdPc$FʷV*2kx"U& O!7B#tt(QՀ(pAjENpz S10#8Q5GZi(I~/۞}:=G@V~]Zz$̤بďo~r4T:P: bm`C{Z Q;U-o𹵭JRMu9 }FZR QOyJ酏U":G>7n> BJ@@޽i4M)*F)]0Uo SSr 6Rv 4^{n+ ?VX&oQT5:hɐ1^%6uk66[kAnUjO_by$p{WV7wLd8!w ,Ļx<0J L I^;Ny7VJbpgG֏%WgO XF^ `DZ~[#;'s??s'>ϱ{qtAy.'E5O JI:pzqw)rmg s]X 2)fjby&PknaϹ0*QY\:n'i'*sQ]\/]4TF]ζ齭wԿ+UXdk"MGT ^iH7Xk{}NFgo 8ظMġhDXYc4p%d[NlQ)jÌi&O.ZJ\ƳЬ]"w/K!=Cr3 f a#VҒo`!+%[tZsrnu<5,2]dh@1Wcll~vs])28qRi …"X2 ZxIX4aHC^N[>د^mD,)Et%W=&dV֤<"nV{6v_V1Z-.@"jU(}uyf8d?b˦K+zu নjA$Efu;>V6܈٢·[YZE٨2eU*(>$\sayۺF/ٯpnZ¤Dҹ,Q,^#[3G^QnX+[:܍7S:<-3=tx𭣴폴wqr0]Zݾm|+H5:^2d!l}ZuMhfkl*[U5Rff|xZz /%(TDtOTVV/T2Xıٗ#\s>ng%vs\M&VO:'U'(K%Xúd}K+{fծ "LUK' MPdq7<6^F7VxR%7unӘmj _mݙ-?Yu@&V(&99V*s7`i,[Hu~2N15tSd,G`b;֔[ 7>h%CKjzz2jiZeQor{wi{/ xkEFR{~G޹s/m6km?\ a"I$bQ <:Pw.w4K pϷw qFRlWqSm`cpE_dz J,AtT;w1\ɷ[%th{ou+[h{A0s/2u c  n˗ ^Dm¶;K%׋o!O-$:2A.gʪn76b/*oǔ8>3S ㍪fj` $ݶ'Q2ȗ65ݝ4T(f0 [Kt~^+Mf.ek6xb]A{zAI5]g)k3mmg <-Y%bd2Hi8Le: &{ r3[[RKm-^58]- ϓ1ElWmcrUI6֒-+~ͣnw;X7[]vQ܍DЩZI=uXK&ҳjgjHK$m1L#NQ=J4K3y޴\uI%F_+#LK%ZvB[JؗW>!/SBxcfpRrQx[G5I8BŴǶ|yu|-X"|1bSrۜ.N빤Hq!(j+¥ԡe u(_poӋU7nevt@ʲօӸfz:,JӀn\C{qed8 9j<\ui_?lU A/o1m-v)dѪ:<"u;}l7{x8d D9 ⸗7 o f+GbQҘ)c<9&W#/d.q=m^IVL4I*26"8)^ʭrt!:XEYؽM=q2g۷b_ YrTu+gmXJtˋS 56]e -<^k KdJZH}<3CuVҢ:F}[Ѹ{գAZJΗSFѸá :yUss?מ> I3Y#Q_]2Vn }-*$oP/b?.栊5SyZp1W(R,׻MLo٤8zHQ[Im) >(\%'MMM7o.쥿+pHeO.j@4ud1C}vۈPTlN͊hY&/5S&djui~id@nqm}ix4Lb%hxrj T-J (GDܣY۬{k/ (ff&V_`A8FdI#_CUyD1n͵>je9B)ff!T(YLh< $QE4Jd|O]cMejLES?Û_=$UŽPR",@W_xGG޲sޯ=;5yc{]Z"y#[c}CAtW272o7}lHXBp$2@ڬ~hіhdT+z7~Q!{k=;}44idIY_Q[MawOٵ5g*5!BɔpdaDu1Q?vlh-6VxE 4J4و|]\}鹝ww Bm-BPY8rZ~O^;[namlpm5^m׶W!Q>vf"r$U\| ^tNa=kg2rn;WxD̲45f0Q֓{pw{70Gq#L4 "U 6u%׹OϊǵEG]}j㧥\T4Z1T=$r/sNX,W+3}B;JѸ"4V9Y+ocs9Ó Ai%HG!ljwY*RT񙼶*15m 6k*ʤ&>JJf-}{[;[Kg;DKQ g}ʻ;>ٳ햜g<7b儑Kq O%L-SoP$4n*=\Gij㧚qB6 +$E-%Z=(~\yvogyB(*Q1(ҠǤ 9=@m΄7:.%945L "FH}['i:k :PmvQ|IAYKO ]BdsK{}NZCȐ!U_DVG ;9{hn@מ4ʹs$HUbD 4qwx-[{vqNvxP12⒂x>"֊RFfe9afm8IeVyE8JXkxq4u]jm\bMzyhc"h-#4PF݆E,V6K!d-@Wnv}ߙ,V<9ٸƿsolhV:\B QEhn=uﭰ[G| IdW{аD2Q F(|Ru}KOi 6eF1 G(I(Liܘ v׊=Cr!cze&~JmmM);D[R hR*qssW4r}Okg&m"9Vd% G#P4.uo;vIYؤd}=q0%nnfQ%Ԅ]#::՘Wōm,+1IS͌B% VVצRqo+4pKGT6HYQom˻&ݾ̿R%tF_mt1KY%!#e-LkH6ۦFޫŮ|[Pdi#<XȊgdo4vRS]AEչŴnH>֯pQtPa%QCfmABf掂!z(3{痬6۠Vt&tX0gWᲁVbs֛>65Na[4HP鑤-n(}{}uԘ-,C ̱bq;EQWv}(a08i( llu@FWFcL>/77-me$zǹш<C C6ѣ'j :꧒;7{s.*2ZQ+B-gEtM3c* c X\a0"!ےcO_fSIQLjYsmj5l++mz.!y9$[S)nba{F{)rѳ;5żOm<4I#e(%Cu#Z(1{ v4qu?dd JSִ=svlO?59J63qʑMUIZF)sQ%j,K{X. jxVE4:$~$suay~k[-pح%vgk"aG*):iHKzО km|n_OTUU[37.7UdWœK²D! .KT 妢W22Q(miuw-M< ť$X8U BG -BïOw;+3~~.ح 2;BhfUչ0ؚٛ'Mf"h突cH!7kwxt2# !~Q# z kkcs%ͼqI fi'Bj%uMʡB>@u^߻~6GQ)roE*c!SϚՀ{rLjnqTp=^CQa76ɧxߺim=ijUCq ijHأRfټ_[B؈Yub506b$YXpMgKcfep}k&JnՊy^AStJ:,Dx˔bIPD-inMi1Ȇ eժHEhSP:'.[lۧEтxnbqp'X4T;vR`#i["R~[ZLi- oyB[m>Ŷ{4Wk)zZv=v3=}4AVMa5%ŶB/PuAg gc[m#J[fe4хj.7JS6[}mo<('5 - HjϨT z> ۛgmJ2xݹͶЖ5퇆mn )QRTs,uHeɏln>+OE$84FDePeWIBP[_ۢqV%%{"F2ƿITG*Sq|rME1Mϻdc) W6ϻȨAHu2䲋Ϛ,-l 䮠s -'YPʙȋǗx7^PIndkAsNC].v2ฑ~۶lZFӮwhdl|N*pyQQWhbIY2ɑ\I-u;E<&O?R[[?0ƳCnKp5GCꎌJw ;;mv3'k`1^m H$d=!6D&c)mx.5>2{,SR 0gvE,;wmdu(&VDjvܷuK님ٮD*xKC4A@E tЗ6"[9ˤ6VA6F Y{ 40Xeql̶e/|VWc)&9*?uCYFǐ{wøIu)JH 8x5xOAJ]y,^|!KVkm$Kt)/$D+;"J|3[higSI~X"HjFZ(pfC~%.aMX6 T-S_FF 6=K[1Uݽ%YPaQLq⩫(]8hSrw;>*Hgq5U!ck$FF<+[mk{r09J GF6nztq"ČcQ|`E*iSR ?ؒ017lMmGm\ᣨݥ&a}~ۃp5дZay)rJIP&Pr B--律AKT])EcE A0U 4` 9[1Q!OOK$Jج+1R4IW$Sc4}&2m79./,q252ԃJLI%A= vФCq,b!YX %*@⃰3l:陠ܛxv1irE"0״5GECRilihTs|~kaMpO8@@Ie SGq*ys|,Dy,ds,A ݋--A`@^tS.fU![L~%N *2Zo\<  ,#U ;+WLH'Pb.evDGe1S4IQomWf QѪv}&0eb6nE<5qKQij1 t@P?Q_K{[+[`Q"DE HQIC($ӣ%{w.'lF=$H1ȬcB.놋:v&qn=ͷUz# &dj2d#i Ѳw{mfx\e%!H$v 1tA֬iMV%$FxeRN@I5 قs{n{*|ClnEesY-Tਨk}5585m ab$n6-3-W̒>uipGi)HLܡڣڦ&q BͪOkQf NdW$=ǴtZ:Y貔Y7Wgj G 4š!_Ded$Dek~_6nP'JV3A࢖t+( BeuYJś |ÿ0\f4 b_;H,O'E+';#.BmE/vmؿcg2#j]凟+X?{k`Y.s%l^[M,1 (煝HqI# / ud'A-y/9v `D.`"_;Hom3-$:#BCܯwהyotMtܤi [OVcH~rF$%C,)KߍbmrDdkDxȩzJd5TZ|Sj>x9w uQvH*{4RQL(Dz̐#xx۵RjiBۯËi%&׶1٠۳j^jEx ~ԁn\YGQG5ܤWLgYv^ڒ!{,Glpr(n4۶,wH搒rPB 4_oJe1avVEȪ9 G_oI:*:|m[Ă,1XaiHg[}iCCT32E%Hӄ jc뛜gs>=qͰͭ¬:iSTi*W D/hdFpF<[oltnοqj7LmHsk[7Ek%4r+UI.@ |kOpj$\WMJ2P[ȾXr+n/ ,+h+n)oMMdU :L6+pd=WƦG *y*ґ}HVeO'46 Euny&q-EA=’Ւi6BbA]+IhdDhKbq )Yn6肀1wKQ{s͗m3DmH1[;xicuB=`f! ߖ}/}Q"I/{{|Ns|0m.M%v[- mrX ZYDe&@/SyF,C*;I41Ipc{ISmkv 2me@bc"UC;m뮋#%p|hUu3~غ`;KW\D9QO5+{ VѷmO'&ezG#*Gs0uXK(^>^vqMȱ@eOќ)eU?X Iy-IVh:3/nojn5 l4F ӳ1)r݁A* m|0Rĕw>;%oS$vJ,RI8jsj/Hm$٬롰3]E=X!C $@ e,{޽==Uvs;8-˳7t)UKG Iva)pgLrBBwOs-'-hNVDmD`+-9M5G7616^CۓEoj1J62h)Ѣ=krbYsRcl2mvF6i61Ns73eigW@H^a6Kh-h֙\CrbvHԈ2mDE[$=nekҨ[cN=WT nƏsQ dB|4E%=zfp5Y,z sUDW9;k1nWkp-ѭˬUBEEdYBw#20휳ywu6O͈pnܛugÅSM~*IC-51Dyym-6]묦#)MD_NqPtR0rA,&(8'vĽ-`шHcnY,ڣ fͳf#f}񸽻6UĠdU$T%W2m=y"@ނ(uUkWHN:7WMߺl>)]4VRp Z2޽!z}o[on~ڸ_;cLT2`*Zݓ7Vtw-+L$fx̭kqv̋mE$֖8i<)a:M G1ҹsw >]Qm^H$6]>PRQ@5cYv7>ݹ*Av&[qW˜E 9W)gZ樖hB6r[׉bX(dr9bX [96$e@B"LM JL i:rzkRvssP͈[?[H\VՐ+nHpXHrai"Zd9yzݣKHM0#7pJ#e JP4?\{#MwnsIeU"ķ "y-ԒM1U^76e-fC7?9xMZ|TRd2 [-4ۆ'i%eJf1{[r3Ѷ_[X,Qc,}/:46M*$ w~oɼnq{xۊ\I|1,-T갴ĭj&'S=&`jX+1ҷ5BZC.>pc y2TrǷoo*H5ۙMGh3.e"Cݻmyܮ'9c$06TJTkRU]q٣ps'Y{bv^ԕ.0:x୊#23 dv.Kج/KS[, ScxݒXHȲeBJ)#s3^nql7 +ʖ87EJBejQqt2;wc&/6EYn C_614x%FQ> ={~jl2,^5ń+,` Sz቙eG@^0f}CyVBmPeYƦBQHƺw!ޛKyd29_a_)tWmvQ3Rad Kb'j YE4yeGnk}tX湽kSMI6G&9-,V+GRpQZGFwݱ́nJ te^\ ݛs @M3β%&ڷ-r.QQ?J zd'dD﮶{[{MGH&ôE #$4s39MMmmۃLU7z3RdiVmZ̕4%RI 9C!~䱒gsicm #-(elJ1`l"e啞G]^[D!ū0*,Vu+Wzf8:Ȱr"AOrd= t@$\f9l٠I4&!J +<=K5-ϖv ~6-BV 3Kknx7X j&:Kpu;{^ܕ4x,.Cieqx=эfҖpb?(r[;U ]YOfi("voysm;IcQ$敚i_Q(:D/.ktbM_H1pZ5gC#GđU + (;~ݻί7޻o2YLNu*:)6/aewbh*h;" eD*icX$W:.vˍpeexJ3~Ja:ѓ[웽q5;oQa8[xԑigsu Y} { t,%x߻wN:=Y(1)UQZ&Tk͖0wnZbh)#_f"Okoo^vڒDpيX$-HH H K<JU.Sxf~ *i#HUDE$[U&mmܗ-{r ǥIԫ;4 \Wr<ʹ^\cv#4P,M'lqLX`QXj+;Y=ꭥfdz[eܘilQ7:<N'%K@TUu0K6@<&'Vb<nYow[o3C"}CDA(DX̪E7A^Xhlˋ;mfD)5#3b,W@o c9oBC19.MʃQ`?diz";ȑ[֧Q VcrPIR~$׏X#-_ i H/*Y4ƪp?> Yu@t\$|GH!#y$:V&!ηA?uB@q?!ֈ,0NZtasJqpi]5oUJ婌,A""즶F/fKS9 wh2yxT:J8"sdi_QަzTI.쓚8ڹjkdO)ᬬ+H ƞ;ڦm^2г;xJ̿V fӨY^8Yk.9O48:I1OS#$Fx1>O3^$u>4~Yw ~uݦܤ#^,Vg4y%PhMUkNܮ~K},BUQ2-t%B@9-X}hMq86$RQe!O]ڹ??q[' Ja\ou,M=\̪VX 0:eVho̮ fTx h? V=j:c uzQI2Y/D)+|3qtUWhcJzZX T ^WwlBFĎ-/8@RjNv?.OiyE<6$F#rҰIMҺJjUvF:\$TymÊ{d|]NYvc^rc2rJ_ڒd]aCX-RiRdץ 5S5$6ٶKyw4qH_ fpɡITf3s0]ya]~d~|l6>k Rr acV93U)q\jTgbDCrCZM 2HCGsnmdm/r݁1D^D{xoXT=UyvIe)YCOS$5YU-34*@ameHwki,&¤ ax ڶB:c0OFn_Cn&Yq H<5PH$U:$Z*!w> v^cvXmqվ6Zd )z,WfjzHAg)V>ح$2YP,l#UR5kBOKùT0rxy86` PH7~DP$]f.qcsɷi1UIk5!*M;pu2.jl4,QI2w?)MexqNdp)'%:DԦOnXM_KG,23FCEV2ث$3įN%ssw=vV3]I_Ek(jjrlNG tL,xe)HH8aFѵigc,%{ik5rI <\ȊxðPS<˹;2moB.n!‘jUbskig24Ixrsjwe<;. *ѱԔUTQ_- P(DvF ܞs ƬWԣ*#S[+ B }7+KL-bIH\KL 1WYxHFhvtZMlT['fG3xwFjpnyhjii*0xf1RԽ([+j G dcǡMT!zo.m>,gdSqIܢُ$i"'ܶK[i%մ b[8_,TۢZF1V#Oڴrnڬ6֯9T8)cw%3TPTFLayH8ͣ7x5e!MLW@9r[,eMJpI-RVyFhX%1P-WgRnMÈexa8eFV,5P\e'34sφZy#$7י=.G0>ǹX{ǃ7.eH^]eD躢 !}]H/5C(oW[ݵ[{ďʰrwVFYJ2Gw!s)Gڻ'59=Ep1a,wmZZX)i koxVs -;uܻ̐c:RBi%!D8g-\s>e幧[sˆRzEkeP(g6nkaOaǴ8oQ .9hF>TvY#p ,!Gfn95tVPCo,10h*!5`U2 ?=Ȱ.#8+k׊9{xrB,BYHGSQ 4]m՘Yǘtڕ'ʚ&&lSυHՅyEۙXSkߗoX{2 y2@ V PӺ얻-<]^\]\"mֱsomyc d4[J+ѨobRw6yǃgW 3Lm{{A<..JqHL+"`Oe.5ls\Q!vM"vRa)EU绞\r^i;tqHη=sti"!G҂5 GC Yn 6#<>N,1M@M0*]y'X4[NfT:(+3:IOk}u]';IaUdGYd uHB+jVMfnƮݹ|D۳vP諶n<V,^-ZUgCC)R9G~pvj9"}quW >Wmw6_uUr,AY'eOhkqK%ۯ+H"_Uk7, ,Q"G"D3jҫ5s9w6m$-ռik[#xEE+,ry+#[GNM3({3{m6'YnzW3qfUuۛ9n97uvR8P01Rv)j=[IC32pqShBęf)UEA|˛.7j;Wa[F-?|5nim1UNl6Wmotm*I^a騷 lx#TPO$)SK+mWU`dJUԻgu6O>+#c !ۙM[[.Bi6N E4}234=d;sC.Z.cu@R% *FwdHV- f{&/,a VOcQ.{*s{lQʚUe;᧒ywmqԓ%\%eA5?6[|q;Y;zHۼ*2t=ov;ݸL.ݢ,"@ZI&."= Á|RUCSׇmn ѡpVcbCt ZcSE*){l6߷{ M,2GVgQ<H +unK݇mk Kd8xTqʫLJMŇ;qw-n'nVuQ)g鱽wW1=B19=YIJqB5n"!~ͱv:on魯E 㼺z+9`%䏨B4* {qK }mWA!"ZΈ%yېrITYhd+65t}wqMۛn,yJ寊Y15aKkQ {1I$I#d*b: CM !^J_k,Vd6^* H4lYTQbO0v]jTr#݋ۘ ݐbwrlOXMc(VHdFD :m|mraSǨEU3 ]iVrAҾqf$؀v]NOk@ReH#Rtj=W۽ڸ\~#T$j3iuESSRŘ_XY2 R5 ,Ⱥf.iw7o ެ]t2",&^/>rZ=sOF#} 3+ki#( J;7b֝ᧇ%V ыlK42ZdZ 4xzR UP0I;72Mi0n)dG5 I4e(%/j㚮 KŠIY-)7nZ3*e+iH**rȢ6f䆯 :\skJ}N@7ru ZU3# @h~(5tۆ˴OlkGEShj(FvRbEe3yM7ɧjn|k6ReW3mD*&%$w0rW` tc }h +UjJ(5Usgطd,m&XCMG ƨH,C`UQSfݙ1Ky*+h2<>-><8%R6T qO?b fd#J;J2_4+U*sG/|[Zv_M',0¦)L v,I ̆՛’dzﱶ`&6359 s7AYKpKRaME#kKRI~]9W(oWnoXI۴UM:OI,I @HU2vųhᕔ%+t *d9 l_ V+[5yaF [8Fm7I)N4FS 3{`EۏromK?pRvm]f3oVzFeVLgYÙ]wsEvXAˉ4Մ* j~9~)y}#qj4F8Vk|2&1£iXXYwvϫx,lŕ@(ІW-dگK)DQȩ)eey{*KxpY'""F r՛יN:_w|Fy5qWm j2է/OS$",)1۵ssP3xlhQ;vRҰ EN۠6y{eٶKws^sL$"Y%s$4Gjw_{tژ3:O;35|6+7FZ MfF&*|} CND̕٥mm]ht0G,^$ S%:CjBcXm3|no~-Ăط+3F'Tk[%#@FªCaoRƾګAmMY*:A+GEKMBV_5zV(Dmn[,YmI'PzEbjXR@E|14 gD23H#*C]zx_pu}m>k;Qg嬟'Rl5EzՒ jZcamkgs ͵\=d(KEGo5R\K^{>ݾ/?H(.n8CX¼)q(XcW)=YJ=cc{i(<|;n,"QI$5h1mq'ۣܫ8iXĢ"4WZu а^v[=8k;nj)M/ PEi$vmlX66US|=IAmܲ4`v*7Rn3C(jO)RbovzRmt]H RPx#.WD[D_<4r߰ eg8ZXm𞑴\ 5[g57v3嵱UY [>oon|=ѴsɁۣv҉cѳ{]>,LY$:x V*QD` kZl6Nzy.FZ^bo6qKXЬn\cwn~[y 0u n!I?^ukk7UNXpfe4Tl;n`oX'`cF=De:rlNluёCIykI w3]YmbI)ISݙwͶuXw^J|RjXd!4ۣ*RZ2"",,{|{$xcW_Iu< .,@ ]6n/y6-w6U!jCTIXcQ57_۬.Ȉ7BAO$}kڵ'_5W _.:HI'xV_PP1 2xzb?L~m].%@a S >~x<=j 5 [XӓwkY I \t88Y<:_7M2Jtw+*⁁ Sdj^ԴmS"NYmϸ}~_[9/s q5( @0B7v jhhX$R85qA;7>)CRQNR\rf2,ԲL>y]# 9܎eKl5~M jhK05zr'v7 @vT4zLqɄ H=nx37y,-]>ro ĈH<5lb+&X%Z_+=ݽ-[c-ykfIEi[I:ɆBxqJr 78j966Ow 8-W(e4FBTYXvwDU#TW`V8ݮRg[m{T61xj.",ͥłR+_œݳ'zYOƟ ƽL,)iGh&دbgiK&-m+B0&Vt$A푿HК^nl2nq:ȬVQ4eLr ;TVW ]ѫWSٹnÓ?]#ɻ\QAKj#kTDXj`9U_sek}6%cu$Ve 'v WQ4]Y_4vx{980ȬFvf]-B}3ouI ȹ SL&aZd9Sv$m `IR$N[' /`,7 "&FG[C{EFh*H5v.0ngyMx]AػGrd39UduU(%1 N_+yhMܱDh"ԴZ,b@\(we{R;~IaVIeC#h];;ިc6 \P7>*r;΢I]7V#ȱ[elŷk9yBOq W"i0²ܫ,*G'5^KgW7빊[ͽcRiʊ+,YAJmW?enjm.;%W1⩪cqxZuodf)$jzz *di!+kigO[K9ǒS+Ζꊗ13PD++*j4yp}itxgt(Z:m:*ĒLP\x\xqk=qb>-)V'ea0܂6w OPJUΕR&j!R%G|k"ޡu\S%X0UPB :'K{=/m4h 4q%,eep!Pl6~+w*?I{V\ڔ\mݫwmYs豕J4qI5"EZ5ǿ~Ayq#:k$rTP(!lyj+%ՔWIm]eU o8 YC+)Swnx7`Chy6+edw jjawIM4+$*wpey6 #ʚmfU@dҸ-U@EGBdB&V )iP[ַCK+ ?"ir9 \۔Ujiw6Q jSҵEwe6I&jX**DIJoeym@)rGV1h%U.]#'Q zʒob˗efwEy6B5Z&xٿ G;B%ٙ6Tm!;n W7ݩ\izTiqSFqv2CmY*>'J>*Yt&+:MKn7* 53;Hu;%X%OpY}5F2GoQe*Ry6uf/^ |ECQ1c-X[=ߕn[IA-  AoRL@_a0{-*sQm[m 0Y%tCVʤi @:][l|[7 RA59L4QEC]Qv:0c) wU?ua|]lɳ܆ܷm[#i )ӭ̚&2RAyKyNm$ o{Xń1Vqx4H3>FwX1,RT|tmʊZR m8-46P3[r^saci!IaY@Pom@vr/}C]d-AojZI+M.χeI44NYFnlS&S;vژ S%!aQE-U%zy*a)dg8ˢm,1PY:-[p|ᶆ`7&ߝjP˛]d(0{#+INJ8ZxhsTȵ.܁ZAe/0\xC(jO xALY%S@41ݎ_ܼ{ͼ!mr: tD9QуNa18æ\.܃)^nzm\Zޘ&n<:b|/MH{~qěг1iT#*bgs9[*{!E۾po0YU2zEw=nmŷ{W7LUfθx{cm2lf76/)lRUDv@5>E+n;/!^ ^ͲKi#3Ph74r_3D{Ԉsmq[JMȲX0W"be3uXϚ[Obte#=Gd)9MCVkJkUFU?ͣodsgzY/ O9b,&(Y\{uͿ9v7ܳ( ۤs۬*M)c+M^FAɲ?YU6&'MO<r?h%no ښh\P89ClۯY@kL,ֺؓ d ũ"r7Ż}T6A{m4S\ZCgdeqPD1wQctQRc*૕ʬ=\JJ̤+P3GqmmZn4g FjQ#ϟyع^+$75Č %#h,s*hzϓ_t݉7sp,<]GWJjf3}n 567O)3d5Q23m,\mspJQ9.#LӤks%[r.R^s"Yb 1F5Ji<71xx q[2guL(([mJ-զq`v >L{ÂTWEG_$0*_٠?3\\]XxE5ۚxoKb±ڝ>$FF-BDJ-.Yoo(TwI&fI?3=^i6a'vL>C%.od`4 m J櫖MQvMk$rBQ !$,R5^Sq?> Nre6s71]8Ƕ=5}YI$58X劕k&c/[Iؼ4~!iTTmKMI]͸vnlʵܻ^ :i6Crvevb-9*iUOC2C% y!vklڮ9Z;{j/!(<8Kv3f!)PwzY fd#Do*3G$ r\tH wvcQoтwN`Mal tf)r0cT5DHҭR*>w{s4a"0)UbgXF2 p ڹlVSnGEWiFR@ V /AE~+dlVbh[{d'9w~=ؙ:7Rg(38ͿMjk*UqDPuZqs[*mYLqh/%Y OuTz/"wuY$dT,PȩY.HTr=Yڳd?jqx [T.vb60{S'厾 O,h$m7* n;#iU D9Gwi=VP:\ D3H #JOGjQun{x^V=xQ߭(w{cfS2duGUD"N`66Nb \F@漏#IR> 4Q7l-+T4+љ5I"6T3P?k`뜮ˑ޽Mػ!>ܫW\ē-+ŖqKO0Ea Ϳn\]  $<`bW$Su[p%-.fAKۿ_uJ\Ko$u5 IzS>*ԅI|5 ;,*UvhHFE?PS Fzmƾ_nk9:BI\׶(4U>!7{_w^klrF))(q4ut>l㨨RTmj;-w>c+2RhiZCNa`I-QTaUm.Iv4Rmoca; *hw#[uGeVК[n b ҭWN-M\Y6%đ+SUaƍ(UEJ-{gh+vf)'xe6SnjKC4O- $#Af*jۍp.nAԔ3EE Uӌ3+}ѯ"b8Y~ޮeb2÷QcOVo>ngn0٬wZ666i~F,%oRv.oTÁ}бN)^~&!L췇}W7{5kfك/C2!6=e!7/sUBmce;bֺ<4C3z75vnwj>fZ,Fb,DOQ*ic$3/w3sss q ΔLݔ[P.B5zu+t o `ss(ixYK$ʨDb=XO8*|V7;{5FJ 򴛁7FzWKMAh)C DQpc~_=o6č!H? ό#j%IG("f2 C@e-%_ø4!hR[ԩkFǻջ#]5϶h3Gcmkpfzj]ߐ'6p$sRB Ӈ!n.Qsyspwⴵi4h]S]s $Cgܯp9ۑ~oi/uג;Gh H L'Kܝ_jW<.쎺dWSu'G jh+2ϊ4FFrߵ\sTOm[sDxO* UW 0p9&;l5! Šu,(uVaKf0.{ku=ꙶ ~??zsxesxNJ6 {f/ʴzTiT{Lv\i˗;d\[O E:H-MKf@?(7k}y,Cr@W<(jqɜS=].ޣ7䱻|MFOd2b7n6XaifP/.k&š%B :;3UTנR%T9 ͓bag^Ún8@PQ[,531nw{1k1y?5GܸNb|D#]&K ٪e'zXޢfպ֍}V2(xR@YȤ=h[˛M55 e2J}NUQ~;_g+>0;rI>>0J*]3XsILr’BNwKb},ΌVXd@U=Hn7BygGĒ&>#ѣ6b*W++i(F۽z4flv.ݴ;t6elrH2Y䠡ٛg$#Q :;H7K #ڥu0:81G2B)F!j+NyMhX](YK̆ -J.O*Xd3[s(;orKU]}`kFv--2t:FTh_ܾ}~ ;+ąEF4꦳AmV0˵oC-/"v]ܝ1E2f4H"+7rcfmLaip=R tu0QfN'CBG 9yys.o) ))k@p̒!t.**:9彿gł;S4+b,̦Wx12X,hBO7elݠ;;vK#Z-O6#EIQ=]c4裊Ɏ*Xj]Jk7;+mg>DK{@dW$ U66w7NR] tNLՂpn&FH D_:+{M_.ʢ+VadNؚJ) d9βjqfwYƗöJ8{% <i^!f SI:JZYvvjk"+H&1,riAmZhb@&=!IØo@9T.jOj2A E}=ܜc^ gYM-17k(ỊYnޙE~;134^ܰeuxݬ-$oZ4NZff*$9V!޷]Uw IfUH #i.hT쎚23ۀ?3|n0lZm:jp4MI_; )ib9OعEo;1,D]uPuC1 ֽ9m7ۨg=;X%F &L<Ĺ"jAs:vu6k͞A3lff:]8}ɹ5J? UX# |1a JMm}HfRmػ jєVfRx/]g.`h#=äzu$[ע]t4,mQaUl.Y 5L4uSUI"BlPY7?Ur,dHF ,jST7 eIXWAVT-3рj0^]GM}&w'U%.7mUGyY)mTf0 1.%ߔXY*nwQ_6ƨw"4Yh5/cO]nbv yoD &4JJFGwhPmϓ./6{yFn[۪ Ilx !>MŗdYs]Rb3yͅMQYZ `IYWOQnEXB]syn7y1B_fR$(NǩHSc{A%iO4mXEQR ĈKF̪ݹrU;oTj^M϶0tQ>!sB&=QGnPCN)N4%RZs88e^2 *<.c#N د[ĸLpxxPO,^RAFewv˱w>2c{#67W'1 %V9*M)Qwx具ngٷD^1Dec i@6I=N\]踲kXxO O/ꈤm!^7v}ݘG|tf1اztRa 43QEP|*,G;V۷\L*x|;h@ECDPAj틖 6VRhkQm`tR@҆k"=Ѕr[k.'pUmK]1<; MTSnTQDő㱯L(Yx ϺIHHHed/Ʋ -E$tߺvMnLv)F$Dug3UeԚH^c+\;zPzmah3'_]M25Lú⊞H驪dHBR7.'b6;6gד!iFǽ)Qemܭ¥Ɛt;(<7J1̣I#iq{g'IuU?˖Jᎏ!CM>')VsR \V2)!Q$)/V TEWw. Z;Zu/gUCu8\zSE][,RhQ#D C>8϶5Nկ=A<\ݟWxRIaw.ml:XDuUEUHHr-v2mL<I1ZRTFmmV1>KAˈ+xERQb1$VJݻ&]UK1T˲(2?5M(JhJjW8ފsX,8%2&r` !+LuGV.K=ϸDVpwjrp%\e輿Z2=බ[sfE 4ّG< q)8EPjtDZ[Ug^\[W lU[]tK ok1cW =ayCk{{y#!/Gp9Y|,d cfOd{N&>\.=d7ҍ35vaۭ8}Znfk+%,q\G J%#dCV4$e{k&wuKn,+92%qrHG->/el<=^Z:nݻ_ y[xmcv{pw|EHoMT %4ԯ,$Nw)ÕKIF[0Z\n8f$_кGyYm7^H}Mx;ݵ7Ww6s-o>̊1-=&ڟqOso>^qÝV+̓55*nXj#$w\m1n+I5дw+[cb+̯*WU){gÓ9k籚bkK6eM֪a"DH "b$,'fP`e28Y9g{5 oHvi*00ǘ{(iWnԚ̵tO,4*V ^oXaY#y,#8d&KiuF)_{e]\RY)ʒhC\\0s? h;H.# + V߮E7. ~Rto:)^A3uL.)[!QNXWMG4=nnSE4L$Hƥtd<*PA_rɾmɃ5q{b3Aku<6âg%ޮxj߹1u9 [K犟+f_fj35&esF_jMm6IW5 :dPcPW+|G ԖyviyHn- ,%2ayi<%i#)|'%Kc@$l^}m. 6~'j!ܭ䲢*1ZfMTs-Bkl{I2 B*c1Hh@;0۳mRڭ+ሃ1Bd~,%FV2|sz{eh3ϴk3yrlµZG0)*cw ,+JF] !b 5HhK#+O{7_n[iM$ xtK% U@L-[!rPgA񆳲8 궾Vnرw|JWap,ⰻw ZEISEKGUJ Y-9_pwlSek6V7/%rE9hm1ڟĴ[d-Jf^ebz#=_xUcfOm7~9<6V͌IŽ>K=ظiEJ,uZ3˛\{Sn[g^\HV}kx{e($bPψ$e?6sN%/=p֒M5ƶܸu Yh23E1$9C=1:n6{?%)ۓm-qۻ ,=nr){]u^䊆(ɳSnP;WvLI@0Y4WÉI4c[75qro{})&d2<=Zv ff?07S_v<[xd@껰-,4[9uJJz}}t3Bi1R:RE-ܮBd[&bG"M^T1 vK;}mF?-5#H 1-1L ~,"rS5&٨x`٢f*]~7b^CGEqkڡav(=Vsev[ò^ܓM#I}u?֤c`1%FT$2+iyw<{Dm <~,4o ZYIH(Ǫ&pyo̴ۿbO1 lu;kn*lŸ5CbI[T#S V_m|sh 6_Z9J5ki`Nzw/6nb{io(E -P,q*#LŔ;P{ hlI?o\b*6UgrM반x;> hUi<+Yfٷ%!aO#cHZ:n1lzؕr@ޕ,{5Cu3H.d:mwvŔ^ ٱX̤' G!?FX+bhCϼ)6;I-7{Ŧc/cpN'/ml "$l'1XnO{W:.[jj~=m↮rD g۸c$'$m1un+}㗤WPV.gh2+HQGNoV{+׷XDoqlj{kTԫsy"It~t=|,xg[cdCw#xfǏEVtSwTF\9SBl˼;|/Z⸒6[]*!Eg \bIyӚ`gWsC/K p b$E# ~-BB 6'9K'mvRn |]\JW'/r4QvZ f.UR}CG',f䩦-VΏ2g$YA +vm KkR5;ԡw%4.ja6gKr[4+ sL6{OW wǮ1$4rG3^q޶RmcwX`F о UYGVtE 7Z0˾Kʨ%n42H@+ XIW>M]_%޽a[wu%^oh;GIa(kdgOI[My\b1<>&ZY7d9 9y4r* Y~7knmcEY˫hZJ*#ɷmhv%^!Fp%A41vه^|'ܽQ8='% :}MEU!*9Һ#)}3ruѿIf-X,ab(%@ + ao_!yygpKK`aE2Fja4*%R3w}M۽E=ϐ Þtb7ZO{zLSqYXfU, 9Fq"!mp@txތQ kR8ݻȭe-MAp̀DII5 ~>xtn.ٱdivٻʊcj ser58$ 5;BH%f{Oܤk,:p^¡jA5Z)傒(ѯ`]!W$3vSPwPthZi:߳d~ u;_;&Sl pR^?'ZRJa<8zZ*%sxշ{}ppv ߐB<*Z+Ď8.'kWT0#j WPjbp[-7f/ ;w3X.Z,UUTdM,-TQ+;"*JԣTki`.Cc6/HiYɦݒHAM<>O!g?o G+SUyrIG/#<5TMb̌!g 7{}7[AP+@ 'Eq T=9u"@Ȓ<n T2<,*ɬgwt&$]ۗtg:7Ux(p}.K7UW_vFԦy#8i䩑|2$Zq=+hyw_vcH4%ĪݵBXꫤsF ڜ^aZ Ux43Z PnO`{mϗ!ۦeQy"€9Ju(,/ulG kyⱒbZ(De R9 ]a> ⚧p(زnX_;Sa\agVlǹV[&m:+Fp/LʈвhE&剬f@)4&X1[ʿPW>;: {nZ,jKK 7{{F/!xWIR(\F_\MɇL\vhDbº[L>#0›׭J%hIKv#0 ]|`z3Gf͍ٮL~?wL+nnLVc$ܹwqv؎m/ {!%Gwc#4TEY \Jh{" q @ YD.EcWi ?ӀarNo6 =l;魙Dv$`!PR*:w꜎ /f6 5YWxd,˴)ޚJE:)IKP'1BޭjPiIa*1P!}q+Z򽆘+:,J#!|&bJ/Vb:0S?;:ՙ|^gg dp"h }r7}ocObW|eʒ MI"{NDq0Rh0gzx xM&'q{Ɗ: %Fϼtۃsd+"H)r"Iw"gKG`4S 4}tQΣB#eۭ6eN^=ɪpB!;HEƷ4]۳)Ցm߹OU=QQn\&:F&s;KfZ/,>7˘H(w R3!uovw. hIWڸZ]xZݯmv)ZH]RJ Pd _w7S{%RiF_ nh"7NUnV(W?"n#lD cmLuIjēܫW!Ɩ #'Nvt0&{'nV2$(HWG T#R@/?.0Y\]! qq2]4Q .4IK!%ij+ȑ'&6f޽u.۾=N:jNݻyjZ#7JJm};݌iΚft-""!UW{1o=<-mKjfgyiK8GhݲxumMhcڑ }>~zyM-^jYj৊* ݨ^OVk\xu2(fU;! T 2(%l-[ԉ,1fx$5+ [v1Fc*پqh\[Wmu|kOO,t4KK%jC[WN4bԡC8g.imPJDb(XH-n-Y fTUMGKw+h8KDy!0LX Hi+*E!rBz]HܻKhs3nJ{'' g1szLE0u۳JdXeP#]חY/ՄrfTʸҋԊ͞|sn֦[nF0SIyZ7q DR-$8YHI-gn|ϖU2nz<9EnZr)E\* 1.y-k[(&F-JFdµKo'wikUe#@-wu`uhe9pzRuNΦg+&5\.;rqbf_ŠM$49$5'6ri2Y_UH%Aà ҩV,Azw<}Վ5yp/&ŸrS2PedI8c.ǤtMo/sB%U-fCԢ B҄&=ķZIX̱H$zQ%dRTvU d2{"l&opf{Z|gZAZ`!3زuBW$EIEI.Ƕ8"= ȣ(Ermmq7udM PE;N-ٝAiu-F[tdT+(66nz]ػ=S cijk4T\yȗ:i(6}{'',RM(t,5+3r_r̈́繯5E̶kmclqWFg&M@nY^59j#|n٘J-Vä4`E1cwv噱5$1mSʲI!hZ? /0$%\"0A{Y[m6r[$3JUH긊EPQ i&ՠNM_`qyo8v;+SbZ(#*>-^7nO~&B2;?HUbq퀢͑Z*G#2.wGRTtGmڋ#DrӣmtIi #CLnO;iPe7>{*lt9]y)ԭS.Pq6BA ]UF*5J(T@8!-+V̢E@_2SA#cTd?-pd0!_bifvw3jgm=y]ΒO3Rx* X{",*I.Y%m u^!x)zGu`m3_=ݦ-<$ V68cndUf*2H'QCKx,PmQQÂжa==LlueuU^7#M< ZV>(Xg*{#Ho- jDWPŃ"/ ! k5GCOlabZ8(H[/3vE,\:i$h ̠ m; LiQכrpi:OD 3;*x6u#?ӯyiYIXڈ33w*. 1cp(Ԓ7R֏x^Y C{-X@3>WZGU 9#HFC^+4;!ۡ]e$HV* C*PUnewwNQ,tk"y|**ih3]Sn&0(孊v is55r9# -aFOud2$2\%iwFuUVeIp 'K7HtKiEPTb{-Fp͛۸v+z\Lp8!:D v']医l/ͭ?Q ""RX+5-F'K"$f+"WEL뿏8ypQmL"OE V7oDC:qMMHQDo|,1w/{c"%S;x@Hễ u5.bVD>(ԍ<"QXfaACSi7 .M'#-vf2PRf$UI5O4etұ,6 1E(UkGݺu;HYC u'2V ^1'6(m%U$@. ;~BSY;tTǒNϏǘH1Q嶴I!hc2LW ߱/{zZ2L B,PɩL-<"3fO nwOw$4W"H)$Ċd FiaEHCΎRwoZ#>Fm3x++0X|6)AU3tNp؊ǚ:街Cd-nn׼eKh=9KV_ǣ(HV`Oov&~նu=oG-K!UxeIOF [E:Twj=]U{48mWRQRuv՛ce}$d'ɚE:RԬO$Xa>hF}7{c6Jڪ+kbX!JAch-'DzDNYDgV֑=ž3;* Frq`hvTo-I;# &㖤ch1R$I, +%Fe\X_wڑ<,lHEILQ:<̃ka0WSwvKb/r>',_UuuO l<ϸ55\K "y#ӱCK4V~ & @L`lv;1-I0P9}F1UECa^Jj"#P:n@7ʭelyPDBLu],6&:Ot#[W7r-\—"$c tHmxZƤP't(ACZ&6*1QdcG-FBMܕY8 ê*LloipLPIZdʪeUZN'479rk[8+;Gn! ۭu7SG#-61o-OW~5ug( ݻkIxJLY!S*JtW u˗ջųJn5q5JIgV2L([tݸ. dt9*sc/z5;G_%Eiu,m|IkWW M%U\ĕnm^܀YФ`"Cykxm(..|%wGŴ92BՐ 護;1nݹ鎩X(3CnյN3]׻v΄QOUoed'H1@SSHω'.Mᱷ1z\dT[_]f~R5 <xDB =[[^e!p!%# EfІRJ}'aܗ]n|+K #WQr9٩U}7]]E69en .JY!|bq0UKG7?_Wɏ*Qh2"|l4W[lQdEyshU8 7,Xln2Z^Y㼑Z ȁ f#ruM(025ciI/KGM`۝Ux:ݿIKln *{W.c(!ϼH&#tmb;Ni]s},B/!dU-MpQ #uf;\E[wy". xhf[]u#/7vۘQvTc0TiJ髧#E$Ӽ5[[ d{Q8{v" H&e1.$E9Aml>kg},b;a F'$ Z(:̬6==9 NtNOofk9ݱ4;+N۲W)7~S>>8,rJgTSൟ. !2kWץc4ok4,,{<x-nQ^iQ-!5e$ڕ{!u{Ӭi`زy86VQKY)9yr<TԞg?Aնf[^{k%ۙlHjRYa @p3jv..h'5Ҭ:zg-zoNƇ%[qoKb7JRW-SK+4a|%RM2ǡ4.ن J=9rؤ;˺ZD$<# F7s-%q qcVjʎ8:LkXoq U=O7Tyݹֽw9N軰sK//) dn6;mr7;n~$,Xd-9C!ЁЃ{״~9nlV2*qKupDܢ(USQ/{2-MqwqP綾QVT)38ڙEOR|u?fUdY|;yERJԆe4QБo,nsN(Wst[PZMGYIPEZG^كtS_eCj2Yڊrw ƐjcQ'f$KByJkW/Win TIF*$Vqh{wkh .{I`CTCJjT=6I0:c;!k0cvRRm*I+RqF6 dtUݤr̠HSL0MAF Ł0I*%5CAQf+{m;j>3q1֒\y:*BKT E*-EԕRVjS4i A"ƮI?@jʨ:ut<||3tnl Y9%e$c 'J#hhxjZ!(E(,TVbD|@j)QAJTǸ k%Tiej0t3ߙ:^3<^)X+o&1VUD H .`{ێzu5FT-+f;W4 aq5#hBNbU#ON5Ё՚WlJLo|6MnLFj\UmݣzTu>o>JZ'dJ}3Dvֲ֛n6%` ʨ B#`Qh @wϘ-oHc-Ii!t\J|Spe&|DoUc7;zoɕ׳{COp][kRM|#KYP+!" HjaMq~yi p1:*9Юp.ʻpcV;4rO XU#Fօk/4\R0]kqbw`E%T֍S: kU+wnVtvau$+[Ovqe[]o1x伄rL:f42+R /-*n!1 "5m R* :]̌G.g++onlUSvv'Y fg'IteLt4"@wka6(  IRs$w}$ݮ+Uts+0v #HxżG"K߽)+|n:[:ޤ۱M!X-]ɄMi2kTGGTB 5KV߸qcPD%%#e)YkR]JsyڷYh,CB;13ƞ-ZcBW6O|wV֞9U&K2a[4!1kAW5T QWP$tΒ4T|]؛J\#Ð01*U$ǥ|;&)mxTkI0ֆUvȁdw`bY$h$n{'؛1M*Õ9ۯTWTZmݎgЭjd㞗%E^1nb\NWw cH5Dc#H5pзv9u,v$fpth R&(qHfPS_*z|bVﭭ]5F; 0b{7w_⠡/!T萬0*PCOl7+i ɷIHЫ3*#Y=[ST1so.l{Tm ]լ^,s*iBDEY0HӤV{cuwn,'˝zzvc\fs;.ɵ8jût5Znjt.۹pKft#cTTIBu ujݮ l{VKx(|Y#1[ 8u*B$7QRgڽùz1 6ij 0i6é3Wɷ+H I$6PD{p]A$"= ZYU'ke#}=eo-+tR8<;e7w.QB1n1Y-ݝ_ܹMhv1|PS`7_wmIjh-cTsQ-&=|LW$p#>!]A(r(.Ფ)Vuk|IꪪYs43qJŝE57VE{;'q+II49%ޘz*osodѻix0Fgb@Tךn;-UT[7i$E,qFѼK/C%fYPj7n: rL1g;ss86.;;ɮ3eUUst 1S$Mq!#ͮ $$a|fG`^VStmj{mcy#G)حY4{ȣC"RU6'pm '3pArQ \m3*l~mtTt3,Xʆ!pKΛFm}Vw{5=E+hYbi#`ѨU ^_[>mw0BТRZ̪LL}Z GпFyh!F1qVVOMI=Q(\J=R6.r K :&VPTKlRW[HJfWHm^%BȤ*  i7C0lvߴXja6gh[UvԯV :f(,ˮ@џi#hw9f`UWhؖAP:m͹lv\č<#hFc{*k].ݛKnu.FY_椠WO>2sImǑĔ ڦK<*fIrh[ +LGĿJpƢi͞mSJa"3dw! Ob?^:7[=3O5wnҫJ1!U { hK縸hQ5gXQ4HƽE A+.qZϳTK!{{F:MW#t#( #iR|1wkm)v7]m*jLujE.;_Wdڪdj I$ 2$ [/#ls:B#M˛ݦ=іKXK15ݳ(OX-bidk[@w]1QE6Evo{/,NLzI52MY=+gޚEjxTm!bZ=ii֍=F[gҿApz./͗s gM&@۝M8(l\Tbb6F[ Vna*63R`rm|l6ېj㨖:vl"Ṳv12G]4*FTuZ+N7;ݶpuX2@Ic11IFV VL8Ѷ7E%%m|09AZif;D~g Q۸-Z**)hV \_g$3``4jWJX@! ;sk:DfiaI"ICo'h!^ :zVa0Íڕ;= ۀ.3Yw!m &mu>=52/A7G,X/9 V񢞊%P$FTBa۵J[{{Sok2;J +"J,eFT2EuNME} Kt |SySyKCAI]޸avSm{;kYy$:c@tk%CEh[AwsWsX$ZT#CCta))3 >>ѤkS7 cCX9id]Q,(BYDKyvtZZ'i:i$]&[o6u& x -%RjjZygQ ϛ=ovp6ZBX•$S":ksuB>r׶\W\L-q4XQ.eK Ga3["0BG NM&ivO>Ϡ rc6jfa{[.۴TuCW-/}w]ϙvy@m1Ù$vYdWѤoEU\m|dͥ0hêzf7M=+kZ{/LZjm5fMʚR_r5񍿌5䭨ZiܕeFK{.ލ-Ռn yoM$meU i}6mgkzE$I$AJW]M;kciussnڜ.oy=5,9W6qr\>tq$[K5w,P#,wpT%_U▯2 5+*g8&+xb9#xj-qM̤dF )(p=T5b:ۙ+͂j[e>Ip%ڠXg oE`S}{S6.ި=븓l3ҌydAMO,+HU ),$dg0s;]3_QEaiw4+,fSBҹDP\[{?/oqCHBM ėGc3Kd%@ځo 5w{sz{/U}q S7򡒗}vcųr>@M[3%42/D]qw;78L|KvdW;I͜1E٠*c`Q~77[lqݩgtOx̭m\Z]K Z׽qոn%|W=1nur8䥬yM[SuRm\Utյ9LI'F4;W9Mlܷo(#awHR;Mv jjC2Hamau bݖh1v겐 stueo5ݭr{6-ɏݰmDzŊbjo>87 )nw}b3gm j-0SR򼳸r0n[Fěu[w/Z+8+I 0>#$Mhwÿlq˾ܝqܣob.]caYbz8X^ld{c{.8I6jFzj|.*/#j R\I=1YY NO4 Rsha-9Ρ&T'b,#d2oSb 2=$Y0APB[}tg[gvOlp{pc0Ts=xt_[আM][ ܙ2jK審m+M?{*o{cy(&;VxM f^[JP, L V'! (R32%Ԓ0z9{hзyF0׹{Ϥ;u.)jnjmzQW48p4v'fY(WKJQd؂K+wx[IYc@iT( +UuE2&PcU55ۤ@Koo Ubg2Ic2V6өH^mY6;#Xj: ^bcr=]x{jK{SlTˋ9S"Ögx13G=H$w͏6mmxhm̚JHCڧEPҵ4p7y *^]nq^+[\"vY["O I%=kt]czME']QlÒ~K9vkyuN#g ؉P xm.fy]]14j|4*i؍jJm\c$q¶)*x[kFiYx唖QG$B_MWdWilFfckp: V37f3QMRhpUQzA#[q]ctnYs'dsuuY{bK#GF4gط{r|(FւIHL&6v &d#->Fj"Cuj]K_J N $Ki ,X\D֗Px!$բRHвhU ĐH];k*wwzܹbbk02ylf  'Yd+qǻ6Ed:*+,xI:z戥S'o,L.Px -S\HBHa1zIm{͖q~$cm)W8./6x]d>0&[anէ|f9oϲK^waf:˱|cp[:ck*`j9yc(g v똑Eò1a..1rSYCF]/9Ļ4KwveK{ۈGix" $FdPlA$rQC@;a jvUR.{%wwfh(* :uJZ%2ӚxrQOJ@n+s=y3dQJ +BuH##.f. 6;vڬ0FZ8 bT ZI"zl`m縱oxouM]M4Tej\Y)5DʠD'kĻ/'kbJEtR4RUd`3ri\G(ȓjR4CPUU1 pgk㯩yx+X>g!; =UXh,Ɠ*)!7eKkyf$e$+ee֡vPiz)Kne8Ya(B8!;p+ܸY^. #}t,qwE)^;㵍h%PzKێqc[}q k Iq1Y+Etf#PJCu0 W=E3&dM=h#tH|~EBU1-xOvnݙ#xXnLPI#\_ mCY`FlrG72ֻ0%{Uy#ʖLcTK{p͡t$U LQE%/;Ucnz]*n]S,QwVp>BO5NL&s3&:m޷{CCZ 4%#uPTAը8m6MqQ Nw)YT:^z7An8۷mPr'Mu KfTH$՜^XijS{OG.׷]]B n K}M+ep|zn=m[.ò))hPP3 N,+fmଊl43eBo-^v޹b8]ll㹊YfԳ$r A|7c.Am\_(\L}xI!(XhdewQ{6&TݕK6GFK UvpwVwqs7VO)*qؑtanf;TȊ}˭\ss\Ϯ㷞K$B8i~Ana>aˆϗ{㷳mnKHKcv,E;JJv%;/3Yzolm&9~M!{ClfZ|f˹2M4ܠEyKvn}GlഄBaEUлΊ w>?wG-m{5m5黩hɞHvEfWU ca'hvpz=hm42͸EB("2$ &PZ9URɭAvکJG5Wf**JJThpӔM42T$4}R>6+xJS #SfVj0vP3WG{{ec۩vŴD-qmn e :/@Dy1p2+Z&ڕ[ fnED;lR1[_PVfX,d8٘RROxjp cpF9G TVpbbX4Uyqh;k1_Mi55Vde]H`HH7 e.* qcx᳃s2T44rU"lfLJ_}O TCn֐n0Z_,mĉcU/$Zm' wynnd'pė\ܬUDFcP=md:kzuSqeY\5sĽO#yd*=ِ*RSJAaTXk]מ6//f"H m$sZ{h͸[YH%Kvb{;0ܾ.8{m5]~e#QljQgfN#w>9kp`'ΆhUbQ6A* jDY@*y0Ʈm(Eno_s=a [Ƞ\\Go15g #^NrvfVمfiAq4M<5y"҉ZSd=lCY\%C |vf3llb|U8߸U1e w-]ja.BNR<-6 tգV:.6mlc^I;C}CHj Y"7jhzS}M.u]IA[3o'RUdd`_Eov\}J[G`97^a,a qf-ؑxA4T*+3ZRVxY\VW[xpL*4f,MCu fҤ)N{Onڴ;zn>^fv`` -݉S<1` hdH}țoWf dP tΞJ){koqn[g΁c`-$KOq''j"o-Ǹ3;2t=Ѹ)wgݽ./י;o2zxïbV*yi)C+X#ԩ[r!Z_H!20ET m[,Mͻ-øoSq!1+YtTgӗw据 Tgԗ p s\ݶ>x7Iv9ԙ6plɸ#O,~m/(#wg{t %Ɯ2R5KUvp)IYn}˪%g.5))0+N޾tXLtG7{FS؂l~UZ 7Giw{T}wpnbƦVƽ= xt&muŕ[Z:iZF^5TI4`G1fQУxM5?tfܛ[sn-AۤΛmÜbTׁ h;iaS%W|yߖ ^ڢ,,e/).MX *Vvy$1o ڨT17%ͤwS}{Gl \+uVj5䞒&\?gɪiSZ"9G/_칂Mmfy&a@-,Zr+!,j;j[gI/"_ {H;V0WsD@zNK_VJNV`5l|C+ `↧mw]^nɹsj`"].a77\/5K$7*5OA:ȬX?ƬaU=%gm5T:hBc Jȴ C42 D":fVuup[d`vlQM40Ãc85TMEQwܭmiiu $SP3-2 aӐ)ׯ;Ţ;Gnӥ7$qŽȔeypk;:emߌdQZx{f3e0}õ;8 JOQֲ@#*ph{KU a$@QBb%({e,+=w$v2*-M;A:oȴU wHk廝vmfym1`KC`⡵9LeQ6ە}:,6QO#8'0@lд0V7Q;bnSnF 5) hn{3/\ne>e!IhB"?[}e%--/b|$[ 5=Rd;y I"DƣƊ8bS%RT؉(uu[񷭷*:]Ǟ>ì7FX021m[}mqO#ό>6B@Nvn.Rl2vvOe0[:tR{jr6:{duv{l&57pKI!V)hҪYR2~.x! *B$FUBn9 mO拋 ;`Y,,e9e[Z*u 1eGAH/][g|>ۻ{!${zwzrSWtgR7=cb᧪yGi 22]{Stۣe Hiu @d \TF\[Yn\Mu(.nݣK䕒($8mR*tWzӥͱ۽ͷF/)v\}FryRI]ˊ R-vN^84!N^am{wvhM 8cVh^;(B R mKgOgkӄ-ij9FS>}}۴wP,VVĠ ڔyLYEYdQ$uzx0=6hݧaYmda8  z`-6ΧZrr 3&m|Clck,TiIP8Ϻmp^[o2pɥL Tt (,:"߶cH沶HJ Ki?ۻMnu{{mmYdUt;Z:\edv~/UUo%c6B}ƾdO]I LB: nkxYb5FDH GFwhZm1ή#:#tSjv~kNK;QmǺԑMkj`fOU-D8EatVIT+*E\B{JS >]nSV"!YT,kYwstQڨE59mĺۻ1O쬎.fG[“5:7ڤOs5^M 5-*(T%&lכrbB E*20l:6PŽ(eV9cdؖI4=wLNmNGyety=WdVKod+2R qS 4:XT[1fm.oLmF"Hمi 5[/su癞0HYp´Y suo .$iKndvX8e,ngiVI2K+95\ >"!Q. []5yu7sm5T:k -n͝1ǻm4Rd[ƎB CPʰtƓHhx=?dVznљJstF8̉)K6N9%eedJ;܈9?t jM3PxiA@+W 0}E=ζ/e1odf$m- 2V#utE;wSq=Z]ػ74KU,{BG|f=Lqgmvw%qv%?veI'Iu{626g-e16LW"h4LAĆ7RJM䩲o!Q^pF}w^&ľC :azx)N4 ca.Rk] Ӥ*9zk{وOw{ %1L,ӁWKmp] j{7eQ+*xC=M1q xE6>ejqѱlw[($v9+u,i. T(Bq]N\M T UIaU%C2й{{w&;'lbX g>Z1ػ=XqQ!PTu $4~V{-m[o0D/Bc+!:Fa%C A]tf#vU2=C%<%:5k!})+ϑKjOjv{vN*)ʗެ+SMy$Uo ~b*`X%4ޒNw7.˩al`])jݭeڂΰFjЪA !eIYOSm)M e$x\n)HtW$MÌS$5 =#8/],jۭ,KMsLpHS@Ji )'[y, QdEpIs+ FI#*hYb6<y# ﷢ 2e0D>EqGIpe:MR4$*( #4 }MN*:"a/E]"DVd`0gi+ Nu'/~@C=CErۿ%婆Zt5/q`qROQ4fxC7J.^[UѼZ45IXۖy/*.Db3jdewww휛ra7ܺ88veaDk>$ a0ݕS.o/%e^iq19* $vߣdbG= }fnF?!,j2-ACN UAyU=9~},$Xxˆb!r#Uw.__FcF)`+'ֳU!m0ܽk6(T,UQ5ehU# P>ϼ(+KH!-F!++nבchm ^r}Upl̅n̶Y vO-*>k )(7~ؓnai[v:iU3JjfyG]_سn[FHLeR;@Cʺib+! D=J^{{mouV/Ce#7F;ˬ nR(";u`wnWy{hb-W[T=&xyhrI,2E]HHOZXaw 5d7L2U>SOQ/ُꤻV7űHigH⸂!a.#";y2Toͼ;{n 鹲0fq]K+؟pddf4)ͧ9]VjUxd1k}/*+aDְMNdT]QDN0Vga{=mro\C_e|{B.DUĒ]>}((?)٬Mfnf1Y::V-kzy@D#X=k1Z*%Ǘǒٽoob][\EsmeW iI V#X~-f築&#U$y+NJua5EM#_ [+~}iqB LºTRɥr8Rv[;)!*@(o+;3m̼m7/DyY{@iY9kM$1ykwVwvKƲ("Tc R F쯖 @IqLmx?3϶4[~^j'ܴ T-}h=oa{n{:YтDV d֪Iytp *DvW{mokv_-; 1 65b剟;b2w'YV.=Em]:T۸joh&uIPɒ9L7?ݷ=ayeKe#`u,Q]%˨ *ںCX\N-I,R1FGêc$\#]Ym_#\ŷmEfsj9.rx\vspcں+MUW kk$SGC̓<[ZwX6HuR[JiRNh+V93ޡ{}^KøStD @$FIfb{?KKtڛ#kyf+=1y\lc1v|iL5u=2馍׷2m$U0<{{@J2ZPKusn[2Y-^h SF#U6a R ͏ܴ}۴{~Nœˀ:'YMNJ%u..~c*k0z{J^m@ek(P uf)d ՗Lgޯ-7ywXht|<"`IY]&-6ؒtr7] %* EtTcid&^YmKSD ͦgļ58@4^&:rnʘ-{otGS9̾9<}qUS^fnJ2J,.GH 1)F\G-sbHD{/_GJt07^ܙ]mer4{ {FMݛw5ؽ?V`+2ʽ4UU K!3m{͓M[~Io Lve0Q ki[m5*nʼ}-I ~l muvnm9'Im,$#;[Mߔ{,.÷jGKm7ɹ]nQ$HwCЫ* 4uլ/uo|v.UaX-:yO4Ԧ;Kx|C*o Wׯ:saacm|nsm3*6+la"*em 9o-(=M2A|lw[t%4"*V,!ח`X_sۅiU$H$9$wwVo#2:kjZnw.O-q;3[nz;,Ѣz:<^%?m\dHX]~o6^zY Vopa]$v(m)#KIh*CaZ븖i㴶^8Y!K;0VZ Zv6lovm*ܒWveU]ݴLF*6 ܍wTFQ gQ̻8^~y[Վ InAGdV7dml,,8"ĺdx[K#4Ŭ C՞[3m^|7;fpv.7qvU SESUQ +*}67_򅭽J숲0 oZ='S c'KaH:zigm pLSI,FQwf-(B5t2޸׌Mef}uxzf]Oɷ[?SA4lmt)Q)\.aer{yyʱ(H"q3ŅGvHVmhG@[!7 aM #) z ~P P] =yٝÒ訷VVvu Fpn)j$GKOl*3Ion[Vp+WbnZ4ȦKb1+V$[߹sfnAK+Ǚwi YE *"F>Jݽi=j}wnZ5{oni02HS𛊣#XI=dxkCR |NZr߀FR7}TW#BXԒ)cݹ4m,Vhح7kq-b"8w Mf?Q]E$$0Wj++iTb$SKJP iҺ2r7ng*H8Tڈͽ1O4ۘxݤAE2K5Dk CP%|8잼lK{pqw@ml&@C-FuU44}j"12M\\mve^ ĒLfQopT^ȑdb"J֚\lWv͹N5w$WSA iӵď Zo5LvuIV%Mjn_"3k.^n뼖݃38 /moZje7Nj2҈+2d2*v6CW^h-b&Tfyte%] K cc=kHۍ)l%uofy#)!*"Ϥz!9^93C=xr{1'Ztci252q:(Rͩ\3{rvn}kC*Ho'vd;u5JCQo6n.6y%k~ %4HQ)Ck3 9^9gWL)sM{-Y6!Q@a^9S7{mGg[1PE]!yߜ]{kqm9Z1DBUc[EZm)6'^TS{cf(6`ic[ejʌ=m-bF56Um)s+ktWCf:?oNּM njcBT).ZOV4$ESVl$`m%vj*9UhdWhţ$G:X$,¼ۇ+R]Ofpۂ v>&mݿ$M li}T2d/mܭRKpT+xj*R=:&6y)e0N+]&Y ̳'t:OQ۪%E5%H`r]{0:>qk 5>>:8:YSzJb D;Ůwyi5myD̀B(:T (iDҚ덎}e})d(QuF bM^$!atJ"pUMK5,٬z7ThNreMOf_П ԤQŒu&{w *cGc3h-o~ Њ#s$F.M%~§ zSӖRhr 7?%UVlMQ2%c dhY`oYgQѪ!Ȣv,45ԯ;U.r+&h2,B@ˢh0A$A~0Xhb+au.6 f7дoU3Dզ 7Rhhabb8Ii#B+9pLp`K'i3@j$>3]j {Qʨڕ+,z^|( HTeοo# J}^j i% ASY!W֭1x}v(l[8c23Z2(F]hhirnS-#0DeSH,tjV𰸎ػ7 כ7em]fT؍.:CM?wFb YadhIeE,Ww3 FtR21R*:dۢ]}mZ5r!t1aʩ1ij*V>m Id3u/i47 868\} |nJV{_Q[vG`j=Ex|q{s1uJ:fvi#hfJ6j},SGCI%7ͿzI9rn߳?ofAGAwtBQ8MBԢHYK ?{53o=>[ImT;,r r#IUH)ݞ4^,gryOaSIPMaWE'ʶڰU&֤ӈyJB+n[>{/䘵M ]E#Yn&urJIX rw+ olv4[\n&4VJHd%Eak֝YY˯Td}U6gܛ+Oj$,^ zGQST}me5 4pô>&dzʹXn[aW i[bG!Qbhnh=on69;lMm" p dk'A=3wؔh#M򻟫w=:r~bۣzc(fjkFZjjZ r^ܲCA2ng)cF:4drN3[emȱP\=< YE-^Hi$j.@m?x*ڼwTͻz}Ӈ>5Y|۔ۍ~dɽ4ẹܕg{aYwaSHH"^e .Zh!UUz{n7mu[nauis vA2%ó*CiЬeKMKO\.-׹>2 ˎLVmׇlR!edx3zZYI5"lfQ[eR9F]D #IV*xBIbk/[Ǹ=MEbΖ[F*?@\VJ]C.7uF;{Qe9=قWr˰:cmÇ䒕pɝ+_I, hn=K-E¢YQf3"+YU_D1DXɶw:qk6]rTN۲9&:jmWQz|g/bjz\l^3 "-3 ϒ3QUB"bI>;,sar42FXa=GAAU~TPN}-6Y&Sr)$* 0iqӻë;_mG9\?MVmﻶyv)֗iP$Ê/ecL7܋;q{H%EiₑjHAuo|m|[[lQK(u!F-کH-Vxj='inj&j\Jrg{+j =KQ6z ߐ/"CKR`Jre}uޥK.ܤbhV>"J_WI&B l},7>tx>y\2C Xs+nϽxL- " dq4tzmbc08{QW6[Yz7i)25$}ۘF&O px-מ6Hb|t Eۯ@e$->f1-2sqSkmrcuxݭ.P kɽg2^6&4uۇOR1G J9e7vsعK)g&d/"$ķxXZa-nzW_Wr|smb֑n17,K( K;&LVY7O#qm̽NRxn uMBlmMM5#WE&j=4R`*w}&pxZD1u qS BR$-xaS b[MXu>ٛj{$Rm7'OM>,~62M4dUvwnRBDj@VWS!D ^M.[;|sxen  @PQ z|d6p+AVwZ189i ▆S4Q`WQɶ;mnlzRC&=[p<H[#iۻ~=`l?lwv{?7o{f]|^AS++&kPaOV엋7/Ɇ;kR{x?RE'QIe2S  [=l};˵6mZ! Q# N̑a7>_{g0?wwjoɞf:OUP1,U"S򺖄/THZO0ѻr75Ēr]X3 !e@]s_)7sVuuan Kn +$L'_9 ]#y qRon} a.}6zZѹX248]Sck#Ⱥ]CԵ-MɑXWٹ2<$0TX 2.F{ݓq߶kk wVwFK[g>[L1Mbl_lg nOSO7Mx-1vޟjwݵxͬ$\ùZVo,VڤjJhC\-5F Z bWSŮvH/dnvP=ԡ/fnOaT[ '{Te0EfC5WA_+ 0<.I,)d6cu'Z<$ȂK R^Fg hmgywÒHeiE4y]Ve zk|0_.\w6 &7jb[jCuo]Gw\U}wʒi|!xڦy_p幹oi PZa-u\o2"5%470Ъ1Ssi9lkϪEаi? ׄ2xAFBi+{j'o͛wO{a6ԗ$xOEgB:Am B )=۹fܯ77D[KvT}3X&.Gb=Q'OI`9mbhM#7[]"$)3f14(P.ؽ:+bwGVcVs{sci{pխlĮsM<͛.o.-hUj73FBRꨧDñ\7E.`e7&+K=Ac[#UȍB?o݉6.#ߵ{vo6w[R7}QYv1m5uTy=Ł,5] Fz(jqvH3E ϖ;;"xCHo8kJ(@ DZvb NeܮvBn7&`$ʱrN*a[s k}9!A$ (5#k\>;tupKnI 72-J ֣RULidvh^c -E$ooS\$*iVGЩ3CڹL˺v&VK=G eT==eCAVL{6S(IbeP}4̑h.p MGO"M!t(2IWEZrQEYS(OF 0znMdz;q.S/ۗrQnZ99 Sq4Ds^)B{C%("+*j])^f4 skKtyĢXVWFhu;7wMlY=v}ʹi^yVu U;/-F;O|Q=𪗛v?d)\IOcOPdjjDA1S?gK9:mѼ] U)% -̥dh][4$0b(Qpo;mm׹,wn23]{nVN檯rhjHj BP)6UlJb+xk)j@HZ$Tim43A 3F&m`_RxGŒAy"1FC12rSdݏ!;j}ղ;j؃3ݴ_iboIoaڮ+&+J:j e)lk5n%5X9b? Hg2)TD},v^f-fk_c[6 `F)-vvy/cw;DZ86{ [{b%T]{ϵjKO*c%S% 2,1mW;%o=%2gM`8u]A yt?r^ME AhQOܡVIc[X橡wqJBڙUvt#^lPK7κTUP6&xD[C,kPVJ?p7^g]\Fdž1$+$mH$Wb0`hAm]iysH.7co6uZE=G 9 HX E&nL7^Q_O];15-=6R Ejzz\|TYY` 5+I\ߓ LR(U֮^6(HUucaw/bm#y$12Qn#h^ '@T2W7F3}JKxn˴r4KlVnGER(4MFTBh)$ Ta(QQHQ&@EIրIW}gcn[nZ_Khc Wk,8K'G?0;1~ȫd0p Ik3Zzަ+AUMxO8:a+pi!JnZx~6qQ^DFRosl/1Ƕl$dQ@3T[7;>K{o6_uO ř*(&9q5P+qcG$UXm5DrBU8 vSmkyXQ\F0h<݁ $fql{mW6gK+ݸusm]Tm,mS YcKpp?Nh  䡡kmZM<[}Uiuu#ۺ5ĠqH\"Wzϯ/o43w={޽2eq={3UdvަhF/ o:}axIX LP?VZiwbͦyӝmYeUXx񵝮Stjp,?(Xŝع<ѥ3mnE<-ki)zdE]v[oTurA:Aatcy$t;d 'AZ; 5\Pُin:5fR %QfQ%ɸs'H$Y%R g ő{A/z}/w7B/P ;*F\(cs2h7aWcpy6^*T۔UK5Rc㩟ȡC{;u;k4 5hiKROB;m+x"餧RJ'4!?b>:;!nŇlbi$ncO>᚜jᥢ* ZH &$!JsזŽ, -WY5>3'TUiIncjmEghfR x\#*Ld]lP-KlMWWZ)[w>SYUצ>j:xgHQEG Cypm6#t4X͖%LxHىIT/-yyb++V͠'qY69̅."U/c  ;GŲԱwWq6|tpI(5c!e r.>ܔ[3 <ۋ0p̬_u_US<I[Ůa3Hsǒ~秖ā~)M'$aF5;rӚ/팚H:P#Vx]rI𻯴#չTV"fdabJj mVcf(XE𗛷yϚyrna+t<n(3}GLؑGY˜mr׷jbBR+ڤa+oe_:6n-&؝ۍ29*sjW۪J6cQI6RiX7.JW6m|AjZ(H\4,-LDjFR?8r]FոoolQAD]ܡ,^$bI DkGH\5v픘LUTUMj6Os v9Jژr=OS"sr\HT}m NesxL.J%"JLo$)φJj$_}cv;#hvkoa5nm_kki`Ck|eOM눟s  pPo5dkj6ZCIK].J:x6i7ks5׃p7Ёo!&ڄcH*[_7np}Arƶ?nmr0{J'0N>W5Y\}I[Q:@K9VכVqm4M@]!lF1p@h)iiU3%Q&CmuH ȍT0Ii712{b]t /Y=r/c7,]n3$yTsQ>Ee TtW/꭫%bkܹzvgt͔ d(ZMxU@ b]n[RxLjLY#ME<-j$K$GC^RMqK--+t=̒H&8PVbL:݊t#)ڒUWT(6~ݢ; qu Zar9bO9i"xuSY7[vV'"BQ,#"QX0h-6e02X@dX2k$Uzߴ8]CQi7U~b\VVd0dpxtW9ZaI+$Jz̄%O]2e{6$DVlJq;:j"J;  +ǹl\+hney!_ Y/mcG4L+nŐT!PŻ7e.G1fy{gU#>?1:yby!_)+!jqWlvj趹*/Ov%vE~NA7,rě^O_[y$"I.uqk7NMUAPԥf0,W [V6 FQҗ+6}7Zq)Z\V* VrV +cyCtݦ^s'fnbIЭ#P@Kk @ ik6S6N2yZ`>rdqu1粸=ŴvHgdq6YJWSPU^l)ySgq #0+g2/on4x 2V9ڝ@^sEȖ^ mjM5Qu RIV%WI8 ,7tclfsw>-c-UI&ңȽK-QӶYX r57/ɟ.,.Sl, R&@^fԚ@Fomqhݔٯo5[B(/೪Ї m;"onͭ .b{fjJW͎\JDe`MmMiKvhF4H30'c-p@M3F6-Km}QTƲ9BKE,X-LbGg*̶}dw.y} djo@MݑEf W!KL*ռ$O)%9Jn]v96n]#Ӯ% գVm fE S0^tsw1\=sk1fu.}AwF@$D E`sg3ywfE9jͩ]F3 i6\lJ jY&H )J3;w0]6Ӗc9@Ma,©%RФ`Fev2E7 yW`w$t@Kęcx8ijk`!fvіl=ᝣoc?-JfV۠ͯ]Eؙ ܠXYe2f-zzvLW1UX\% -5uxmh-ݶ[f4Y2\[x"Z* vrD]b"B;{~˸zpe}i,m]Iik ռG]N\f-(TӁ"!bzno E5Mt콷ƽ2TSa!oĊsoQGZk'VI%$171%滇pH%G12` .RVz g̓Xv1@H ѠR"1*Ǵߔ7Vm.&rjT6{GAi_ 2A@%9bV.vkO#:nN+FBɠ,Hn4ۖy$]'ue( Z5{/^]_WYP䰉:$sʬ&m4a !g6ȋ u9S[i mX@r:Mm-vؒךgHk"Xjz``{NfIuv -roq}29M(-=q|Q㫽3:לa7V4v7&[[Ug3oV Km3H${ߔowpeᶰk. k+OUUHB I+ ۛnMݍڴ8>w$2v&\/pLJhcXHui\v/XlÆX. Rz!BCנ/m[}ƭ2^L.DDPv$,<2RiY(T^ wSϏ)s}AL{nk>ƞnSECG7Jh$ kS4$sΕpg.- R j EZivCyno aG3;~c3ѱ]U-Lf ӌFJy6XH,m<7ʦ{y㺐ƒZxdYf&%W7$}oSMa+$s—CQJj1᳐ڑOA;s8I:n48oE&^ۙC; 5u F+ZAW2 mۉ.e(K FSt@V=z0ݲin!e8JJ;ڹ24"[<GCGSQvb>FbF#;7z?)Rosϒmm]I/)"UIݦ;Tm}g=.V#A- G եpzs=50r4ܿY,ׂ*;yZYaT2Цxzdlo4[coo۷ N/Om+U[/w~ COz6^z ;N2UąKs&m!v!0\Me3kfQG&Y&G^rW{..塚/Q-t>+.p"MKtڼ\O#ܟQ|rSq4^oZ.E]IXYQn<'S汻*A&SxV$}gQ5DŽZc"+M< )42wGܻEsբs=@dSF|2|[K; ʑr@ jt[qF|Weɰ6/ՙ{+vFٻ?#>lf۪f .Qr)*d"Uɗv7Q&o Fc¾*. j:7oew[vkfD$; CJ ŅLB3L4V#Wu<3kuWv]_## 'Wn-_G[Qj(^Wd( cg2vSsu˺YfXh so%p.ӱ/2Za&wn]C(;Cho7-bno«QS[pL834;OUm.!VxWq#aLlFM{o?rծGb(4LYQi iF }|1;xes99=Bo䫆JZVOnOTMLӠ`$dR;rqOluWK%M$zGBy'cd({gn`݊hhkNԓW(V{׶fU1|E,.* 6dOG Dd3N VME]U2lENTx֕Vy#篴il|n"4D-,Р5J 'MP?{^;4ͽ79XcO 5#WkwGtY5W u*ĿMavv۔ɲQӤZjk0XLFm~pI]9C][U0*uKws۬ۗż g&0NJ$c:K=tE6ޒӶ *c$#VѨ91: ]6[9 UuN;q=$;pSKWbx,2*R%-XۺVXjU%.Ze#MzqB٬vR$sb*ip`PVd6)3kh0L-as\I2H#W(_쵌x5H%:'Ha4n|?LF8 Ji5ܻZlT[hruIACc3TǓQ<_JD"Zb![{87[e5 4Ef`#` )F(Mq DdKQPtaI7{]P[7;ݸLtƦx*w5T\C+!\\5GJ:UE76!w r-K5;#\,(YqZcݚ}ݬۙ (HtbiQСCL+C.Lt[q)!62lsCV#Oޙ+P~VgU{Mq{Xz,# 'hH r+6xPMkyoK #R6#Ü,ƚPM:>k R:VQ,6|js>.{nEM$aBO @BKq5;m6Moh8a i*lL&&.Y#dj:޹t^Mqյ[\VI2pIR^OS vK7z2!(@2ڛ{M ]=+ZEc{W+do/cK;nG~[87nml\#)7Dx' ,o[mHIDwrʰ9̲jSXѣEPIpNE =I`Zb%f+4{! Ry;w]FWkqI[FU)1X|a'4~Z d%Lio|y]mhS<6t2T 7WaJc ̹)wp:net:[xELN #*"BHw|vI}%wd٠Rahrۃib1B\5 0Ȱ$$icww h E{1xRA"Eotc:(5i$$̼~vXt)Yx nS(V$(#>go?Glٍ5tm>^:A񫙂H9ڥ*e҉^`K,~ݷ(97g2,<<BTI(Д1#iR䀊?Wf奏lۄ~ q< ʭ,aegj\[ ,Eh_qzW&z{n<{hnVBf_zgm GRnicj'#hĨ]ٷ.]`^,1{!*)Udʕ EQ~Yۆ4ZJG#=4"ݫLind[Q.lL_;7o+m-d",A DMԹ!CJ"K 1mڹm7=D7G9f,V6hc:P"j8Z%$QԋsV'(o[F$Un|ID6$6es dQe#e6>j Sz;na(# p⊪ u)-U>)F6 ͏1ú@f̲)F2[T%]̀ԖE|D[>YWVIX1t&5p-*Ev̬`QW [dA^jjYAy%G8%XKGJ,?+9"m(R 9a IxmngeZB 27pn j*syjQ.f#'WC4 \!?I$e E97ec+)DVfT}E"ROX!5q%V~o۠_ I=ifd\ܴƁ16~5sn݉_sScpSa2XjI)V dh걢VA Dj;B6^$׷7% $M VpMYyi6.tyg>iWƼ Hp0H~:[$\[AalmQ#Ys/*j 2̩#H;@IZ%z#R1$q~uCG C$ISѶWҥ؀[hCƯ#B&\1:^F A *t9_|>\ۭ3lV /ut$ FB Ztc1[1[w}dt:J4V$)߶X^9d{Teu!WXtnFzg_aە{{c*[#O=o n퇒xOr5VNM-f5cOX~kߘ_/o͸mg&EV1j=hʈXE\ɷۅ=2MjRRdg!`h,'$`U^V+mb{[ie&uFwt5}&c`<2B"^x7H kE7]fhڐ=茊2K-ұ굍7^JV 7qM#YUip' B"H-ogXMR|—xlj6.ٛ~vPQr4x}qLfNEeoٍS űI( EF\f ?cbƜOAw$Z/Z aG##jIH tSwkɃn܇Ygh(;:+12iw \ lLziU+Ddy_ՔehgK+*%hH#sYw@!Pk<a)[_7XrHђ/)%Xdc 2 K^0oj&ŒytCXDbފ. VFlV_J>,͜p;QI,"I%Rr]䭧#iZ[rH!QRBFJcrc}E4}A9mIqow3ˬ@HUѲC*3j5v*m;#ۻpϗ{3ܱbKᡛbLef&mKx2˗Y3SLVR౴`/wfRHkU!V)5Z!!}sq &(ȮtO";iUcɱ=z7F:}t<]{j<&Os;"WoQͽw5-GUPSYOHJGw#v}LQʝ-Kyb TfjK=ټfg6`7WTqw37X)*1T0왖+<̕E f@6{ibzA6`:֡V`Bh$[uϺ\[o#}g n`[IBrq>BN/t`sw^l~7Um;X jvl7;k'QVj1M=4uu"  # +{,?eMovn՚] 98'pud; K&,]q1ֽ ,/q6Λͽܳn$0\#H44KspTʅ&WT'MEJn]&77edSYFbA$6)iG 0*gua!I>sr]1R6꽳7N!E@3J*79#R^sˮkcqBI.IXE뤉`V>t/9㕶-m浕ǹƍ e*VeeP ==LꎹoK:͊ _ 0mv GYђ|< DTKP ;er?0r̖)k.VQnUJ}2;@xkQ"SN[fS;rĊ+ss<)/ 3h.cTyvP>6.,IlU}ns{cGs2ǥdd]sM693"y+'T. H|˞X{Mgʛu[P,A0Z(ZY UaQOu;ݹK3-LnT l(YNjq*[!E(Qc/C.mM>LCv=A><^mnvR+V]᧌ sdݥn^kFb?XwM@|5=r+󬻌;%߷\~sScbҐ&(mh(tO3*09M{xb3cwK3[n,e񸽻=(!}Jhޡnhܽm6wV%nloćR9%l DI5Ó˖9K}{k37{"G-F3B YQڛ,ج]fwYno QݍS>z/ۛOA:3dU'SR͊s঒& P߬짴[h[ńPQIWRʴu!b z'K YFFjA.eG⋵%/EUnWVۛ/7ogv.SڛcQl޻lb(wL3w/^GMIJAڑcL:YfuuVrޮiyFDcĆI)_T{hm[.f%RxZ-R14dKVu^m zߓs8 {Oao>?9s;Uv %d :H>Ᵽ^ y#<Ζə/8QEXQbb XOSl.l99w]8.๹[+Y&diI#$KUԡA׏wu.|@weatbPm%Pz#*&<'*%q}^-Ûm9lb{١31X.VS4`xCqܷ+}}nAᣵݬ%-LK-:QQUPOnjNxM;Mع-؎DokTIv9rʴj0$S}ߔabG5%*")HoQ@UPS!}n.~u>fG{VvtM%#(31u;𙞹޻?=uX|~>]ïem\=oK01EӥE:P4E^>SˎdCiHZFUBP9de- CPcp竫ͭ6d.7.EVe Vݣy.Qs?QX(yg!hU=WQe*9\vrGm\l;MCP+Lȑou;hmL'FWj˥jiڬ:7#}D2|f ,DhvEp#ZG1[:zvGf>J]۶*o-QDkf{dzn. TSC_IQUue5Vn.cPK=IZA9,%VV[SvMH<{!Vj $ 3,V@J[~s|Mݽvtᱸ|f_ylSfztdg{+'E);e?֤0@;W?Y^H \8'kR/O׊nKFF\o@ZXG(H+8SMEGJi` ,6hYC,u <ª#o˜ L>2JLtwqm\¥հj@`FQ+ќ|XUiLsvUop^ۘ8ݧgS#dRknE9ZPZ) ފ&`TE$׉ j^N4"w纖iD`(Pĺha(:ڄ$Cpr&yob6In2l0!H366:9KҶKn\DTZitK$7U)JtCSѾ6;ⲇG%f"?Vϊ=] T$ Yi¯1D~2C(ƚSVi|p>Ux⪕fR>6cHe SV}ٿ)rql+ߵ~c%na$ʧKǤ~Ѩ:8`W8Sjx4thW no/ա*ID؊ىTRrEma|5diQ3$lhs-#dvT鱘eiSDO=Ts`qa媚jڗf%e-~e"#GPh:逄r4P2: Ӹ#$pIUL *d ;X*CmNw-IMX9ANR6gp>+24X$Sh*HK7b]_RzF5 Ui,Aѱt🥁6FMbI;c3Dy ]:j*I{Ӵ`W]YQggdCJqxMj8|GM=NY*0Xj`fUOL~,p$堵VX,VTCMò6v٨;[1=n2qElQdSmŐPc0G?#:dIbcMÓl7}k,LmRĐ3fe"*zPcr=Õn6͊ +KmT̒)%mwv R$ A<]ɦ%hV{fx?˘8g&Z5$p5}I&NdO׽{*ʝt_ai2{Ʀx'>O=[$PTN+py~/q=-":&*l?D.hQYwm~lel ~<72`h0;!'d*3‚Ǐm,U_i7Du ==YCTr̓3l<õVEo .÷ ydY%Dj ˜ʻ~iܻoe&ѷ lԆdm\E jvs}c1+jK!RdbѮZ'h>xեE2k7M9/$iV)8:ī!!aөq޹d],/ۺՔ i{rI eutYG[ƳiCT\Eeu 5[hhpͧk/Mj{<[SmcnHWBp )5eʐKTSh9Mv oѥeLHV7`]JX; ՟ fV*' SQ퍷0=jTVkbY]ܷw^T]l1WysnmnemE ROI[YhrQWcX0'IUU5C+ꨰ;9ܴ[oaiiw?yE 9m̽%7%Y jw hE[='kG, SpJ-c9fIje/#"tٶk& p^6uD"j)"Yv^8u㫩wom홗>ߡ A&l7PפaE:.Zđ;_l;ݽYb>$0_®kB0zOM+6i{a44d𥔕p[tnmuv u> [G T/w?]*{h4L  W I{M 1w:mEdq;HjJ}RAFsw|-\^[z%)1T! OAKڄWޥI2[[G-BH$Kv7@ՙ]$+qh_I7G}3ёg0Gna'hi0v̤)%MjM6<4(Z<7EEU_ƒNŚU$LTtw^v7{f3wXfy F8a@VNd2huR ސcF# _ec_gIIY29GN UMe)" "AzR>/ۦ:"D`ŠE @WLzڗخ=&|Sv^vnqMM&z5sJ<<_$yc 0cxw_}sgupaQȕ! Ng]SJ]|qԻC7F^ٔv_sv&ۖK;#_Cnd3qV6B9LsbrŨ[}&MQNa؁|9Ջ*":ۄmm-KeIa(nu&EBWI:ދ|nWoo-sm΋:|gcj]v 3aAZK BnݽA7#E:Hԭ!US%΂:!Mp8ݖL&W+hT Q$Dk%)4]8~=pu^(ud_;'ob[S;֛Q㞈8Jjyμy̱m[DwKrJܖHK4>P4UHu\e0]ImVW3Ap6úDd$q:@+Ipsg0]폇ٷ׭l\~pMU/i`?n dpUWfvwLԘzO PUH]Q뗗ykxܭ'2xeweKg >*Qa{6k]ܷE/mw[H۴U&hVέavn49'q9Ig{$5!뛨R{=O&X m(*!-fH#,sse[>kygam rg )㕚YySԬ9v_=N؝zCzMpd2 5e$Rb$Rt3w%#2\0g=įoiR U:IFZ] WW/7E}j*kj*Aaѵo{[OomL6U{m/]QlG6.j]jes4QDdP=[eoxn[53!d %E *8Um,KŎ].>$##Eugp@,koywfIvVZ5~la뱙lvxKUi~XTұL!U'XXȗx+9yƱ#o ix T vB@y2HƝ=V~łm){W R#q_Q?ZQ)?JfH QsKk ૃBkz?`cV8T WF?L`((h5lUݵƚ3eR,-LrEMxI*<*(* M>$tu#B V@G[(Yfd3t"P55U/3veo1[CyvI_1ɿ{RϏCLi[QOD5$A]j5("Mt^ۮ.)6C$Ujh<5C_엃jҳQIhX~' `RVe08<ND%xZ^X!=1ˡ)#U<<uTx !fF#P-H۬䶿XI.:xuGS*4J*Q; e,_2 R5>',21haMPu )gY.i/w(,kln0"U#f]LhsCӣWhnݹfI)wVgjjtV%Vrm-88 -2JyHN. u}GbvP44dJQ\P?>7z]FH@2*I%FFP*z>nu 6#mo)v m꼬5T[oV$4-]xdڜ)IYRj|W{yn,mND&9nR3:4x fni!{x+`buB4Vߡv~&;l%؛tfY^m*WI-dz|EM}ݯmye6[لV(WXɭg45}S-rs; v+JkJ61m$+;3+Ms٪6KljjJgkͷv'8MF>9$JFxiX!.֐;ѻdW*zXLlp07gZ~aA:sz!FF8֯%c@s?jnfdFFsMc=K$6}#!89k5ؤXoB+Ѧ5QR&K%A<8ySn~l0?Lcۥ*;J;K+Hr[``zrIݶ=䱱xVEpOKj E˃HN<[Ar|Lw>xswd0<:Eu"17r = J7\]l/ 'h /UO4+h6L DgOjFdEc 2FnDyd)_wy)l!.]gn0N^N9BԎy]uGR1ط)IS|˲^|4nL{ lė#28ܤp1ҳ`yȨù霎qiW]gIDI]n0A~m$l`yH -@8'\e&湝Xt,ֶpKS#*GN;jeтi㍒5s ̃1\}xGnh7@&U ͹R7V}oVSN*6^V]|ZFXZ_iwQJ@sʜc#Q%Ddg}1U[ n_cٰ̍r9A w~n<-,aY){h -ps=kTB{ZE燼Mo]܏* K>~dVí}u>ꩪk>Ioɮb7lʤIU 3[lN^/5go|DPnxՔ*r1RuVO<4D sۭwa>[7 >^Zvv^|]G[-'[7Aon|N)V`Tb'hW*B8EkpX}$O rP[5|>¾״/_Ѭm躓[-#$#*23dBidW[i\ޟ,FT`O9S lw uamauCoky[.H2h [N85깴֖]I~ [zHx+ $R0Ʊ⩦ԤV{ҪC18b#uXfnf |I˹ _ko#^HMӭ%ݴ,c(CA?'AsW Qoy83zV ~i@ub9#k#Q[)dO"+JA{moV rGu}yXvrxN2-0jN% FRsǔ 3M<f4i_@3&m9;%/7B ӣ*K8qio}myb.#Ʌ3‚,0=߶ߋ^0oح:d0^1[TwlI+#c kl/i[*ZMnP ~ ''jTe=Zw>4CLdmRRM{U/ C12 ,g'VzmjQŦLYWvPeϖ6ÂN9̲񏎼5c'Z-6$KI؂|ؕX kby: x{W\%o 8\<%GYI)5Ue[ᗃGuc&cK\ +C/lcqB_*6e"m0-o]& SI;ھ|u^⏎<9PP-&Hoplbk6B˓p|\YhREqQeirdZUWI@Lcr+ĆU>jQߧ3ףN>/ׁ->+xJoYYB~5դ͆ySPUapQ">q-^PӬLM|B|j)^+ R]:ȚoKԧnma"&&gl/ y=z^ahqG};m, &Y9T!)xl,$W5ў]dUN~1 οy4KR멼Yd'uZď?Ө< 5 źTz$2HQRDXC0tec1jUf]tc0xoJ5޷mwO- ^6v-ھéۛ97GLa+"eq(U/U>h_$xƺ Ke{~2[ztD#?asjת9#W@Ҽv5=%糏RѭR%Ĭ-D0G[iM.xZ&k k _K71_`~ǟ*<V٭qZyK! *trf;<>/[ƒx3}-c VC*:ʣή188s*Pu~U5A+-M/m>~~(~OwVesutqa%dRfc7  W[֣ߌ<;?-3UM/^ZbTIn$ywl1 ug? >_r::~#,Q#y#Ica*Cb+|YKto$[Xa!,\yU7M{Ux"湮ݞ(u~n$UTTwIk5_kwKM;k!D C]![&N<=3 Ŀ-+^-VN|"pr$iì0gxuQ;m>#xH3[eK{VD @:yǿC]_Nfq#Lmum%o/<  |oecs]%n{˵XJ4ezś[CƺƏsxI=_LԼna͓͆7egx W\|M#O k u6Юu!oKmcX qO9d+%X{?#ƶri6Zޔ-CRjFEu-8*RX KX?iͥPM{IUе hY7DJÖv)|eX)~6w1ޭf v5q`:"蚁h(o6O䗚$Up/A $`^uߌǞ!_xVS🋖DH쎌^KFiZŜٖk?iۃmn;/i\^b<_F$Бp7,܏כ*5"vzimUWwZ)E'JKos/i|ziX]E HqhNB,>u#W<~1] fM8k`v֩ۧo=hK^ȚgIZiϦ\UB ?:EֻԡQ!Ygd)\/3v~t}Jm$-[vR ȐIHci`#6Z,<:fiȿC]u "vʉO =Obdϓ5 alk1$d6])ˆB;wW˩jQZm )i{m3 沴J dn8'C_xZՎk<.#(r~İ_0PʤHn#=O1S.\1jQz+ش{_[yY^),!2Ԗ=9_SĹ1^^EuiOGq{c-MT#"/A;57~2G֢gI{lI'pI#@+:2OL_泬sXGx,ym"P$m;HpznH,@<;o\־4i:ogokĆ}bd$2F]eFan^ϱ|?goI|_i>miQCsOwzΈ7hx|4}PgeǏFվ5ϋo,3A+'϶BB+˅)-^5 ]wpWV~\ něUm2y  kZ5[xO:k9:@ݼ]pSp`_[nnsׯeP4}JQ+Yz?ûvrv'rH%Pw>o;Z1%N 8%+ؾ'|5kz"mRKF[ AUHۡȘ5*~ja᥂k_3\G,7m%T8I8܀yT$vw:hׄyrJq_{>+_AW.ǚ|櫦 umGL}98%)0۸00мGˬiV\ Z2k^3G +69<5_kiU"Y+F^# A=Ə懯 ^i}/iZݝ,dwbwð& }fT짧+K|uGiǞ6Z_|aawiI"=w' 2. H,Gc#|;/^|Dȿ"8煣0Isx$ФּI}'-u 5w2 2231F6P4տo=:ti+ *ɳs8n\*Gʢ3[/eIaZ۽T^9[>Q~~>E)հζֶWZ5Ɓ3x<ӗve5 +UE8~0?wz_z{8>>Y5ܒ+ cwmncq9kŴ/w֒@fQ;c{xFU;a ?U~3~ WQ%yfuLfhTBVwwc?xJ4X)?x&fEdpqXQSӛ{fS2q?·Ot?lL=(.cx#5_'u叏6Z7zDm#yo|A~}Oַ\_?lQе;xnȚ%n.I= &*j_ Qq;j_5$R'/t e0y_%qpBJ&k'hg=l=4+okO^;jmS_²G9Bi Ʋ@QyUa"2p>uV7NB[ňĤN*Hu@!2_)ߎ)oSjiiMO)lPOwf}HEU@'?wKƞ :yZ/ {D`dĜG+FWwvyzhu~"kG#e V)>o,+ !f*vj?ڟ>?aB-OM}G?9$wrdRv=+g U슪_gegr_ZzDŽ^L$Tзz#+G6 dbRH&֨uτ-U[H\>\b9KʶDܻf^/Yjťկl#݃!FWSğ|5F#.uuy-.Y,/5a|۝X񓏗/Wz/#oϣ-Eoyq͜0K8ͯg{isQjKs鿄6X^KtKvK'6rE *!`Aې6>S7Ŀ hzzީZZF̑ S[BbSV]>>'<7ATKnZ<F+oRͅ$|w[UԴhiye-$lxFU+S5.Ng_Sv_^@A8ĹUyjSːp\~yEM_mk,Q xNGQVᠵUIpXhE_Oo, YaiƞqLNF.MExO5ӿf N<4ۈhA11$Gp]bEfѥNs&iIC݊t}ވiEJ|+gooOF}M`#Љ^6p[i*?\?& aYfvCk+P@_%^i{Ě>)um$ė3Uxapq XW^~FwP-mS&P!7_I BxB.×ֵFv+}JsT<,D.}::ԭ'Kb4ױ &6H̄+{ÅN^jw)Ii :Ms7ܓkO%Gǘշ.Jz-++?Yt*Aůu\pw$E5?oz| cΕS5׳soukk%39v:ƴl¤c+_@&ôvz/ |k_~͟ ~͖xO7^,+h<)i+Q\j!U%v;  Fs ~ xcxCP9]yjzl1-]Mn!~y$R2 ,bHߒ ʩ>i6յFVRi)RH;f[zVÞ+v:ZEmml❤ԥU$mof73XfWq\qdKyoI27w+?Kgw Yz9d+p y'gO[{dž5}zڍ7NQknFH<J9syK5G TKHDrtH@yBquMYI5k8{:qxHփ=f4OM5g=qk#};OuoťBVnnR34lNK€ I漢:6 sP4F $>JۼwmmcB%qE: gJS)i#8uW駧o\˞oz(o78Ͷ]?q#16~f8>?,_ ;x_EOV5=j젷5Inb=u$I+k|?y—]+SO E')b jGg Z]]O !<;@P^5Q>,O4rGeXm6F} ]J17AV`26***~Q8Mg F6wɢE{i- >eџW$.=i1V~>X'x+Xum Y[xzڵFٕC>k+8F>/ xV[Xw4u?̈́fBM$$Qv ٿyID x-c1`6UX )Vb[9|FC?DJ0f2T`kotߍfAqXb:!ruǯSmmv%]r7IgX и>P>SE|7AW|\%xiͷ쥳IY+ql4P1}mq=֍4}.-e<, 2Yax$|Y:᷊Gq"}cLѵKۦ^R"i Q92&-ČwZu$bպkcʅI;^g$rͩțXgzyAuNL 0x+ {Mzq]RD4gs5퍃a##V(wz}VzT6od\̲?,~ Z?i}s㯎Ok泬AƝp}ܪ 0\?+,7p=<$M(7egktV/V+ov<Dj q K5((&ld>m0qyY Fk7z->7=$71M_o*,H  /ռ;)N}:vR 9d9$iXwV9'Z[NknpN2O~?ǯ_[$"Hҵk d{[6y!:"  9.,usSL46գHgBe4c{wœ>﮼hΗhڄ6euq%U$`\]Əyaprj3  io>S1bT]Ne-zKKj^$:2Vjϖvm뽯?_gQĞ 4 [)|r 5PDF)2?|ja,n<3;> AʓED](Le6Cb3z7M|;gi{CygSuirHÄNYpN7oYÿ54޲+Y;\,by fNrJ}wqԣYZ]4Im۶UuxŻ\xs/BCEuԪ\(=3o}^%ៃZ^yH?*_$qa~z~y7Z ]@s|5G8W2Zȓ HFbd/n-/aku2ç%I6c@-3zJ.i{vUjٞ.7OOM=՞<Eҋwe"3vJ[~h~ 4{{Yg[-S-oI528UaEUlW IOn|RxM9`[im 98<)*PTF*$i]>QnJI++ݻhnhve˝UTS_Bh_1`~ٱc*8$m5A$]JQǖJ.m\- _[m0+orw.CƟ+@?>*,߇:"Og[gA2׻ 9`֚tneWtZ+oִZ}Z5:Ưծl+-y춷Z.dx{t팾ӹM|{ouW>uΰH'tM gvH2g<~[cɒY~qnr3H'i^g~A 鍤ŭŶi{>LmxfĈpFHZ1kSUjkZo#e]ϩ4:kZ-Rhi$Yrמ<[iifkIo,Z)XxHsܣSUtgv"Kۛ?-'\#ee8 n i5 THkqǧZܘV'aYrW+7r9+nNRؿÏ _^Oc#ӵ[ued)cȹ*b6xhkjj vM%c.>d'?\}᜜r~?h+TH/ x~swjkH$ 1/Ep1.%;,,5oo3bL| BhG @0GGz~FЄf*+6mO5 jn,gyfPy{2,Eʒ6 Wōm;F|/el~ BcJ3#c9? #-څޫR>(.WM^#1_B|@~(xE_'aXƹe^NBq^K}y{[vUZ$oKz&MީcN+7Pd(l;2vU;2,|㏅ )O"uxOľ I\Vqå@:42A@|mCΕOީKye2[h1_=C&I:yF\ߥF/뽙|?g˭ĚG$񶅬Im&K2R˝!J*<X-Vt,IDfa,fM ^5!&O4rȶȷ7 O&dfeRdUc23~+:]Xҵ]S[/"4jj* ٙ<Eyc;$yKvy9߹كqIv*{,ڦd{I"x$K6Xq8έucf?Uk-KCqQu}㒭*TrӸRSVt\K֎^2)!Y'*vJ4g>8žԴ{>-CJ4a,8Ix 16t[(.M%{;vrNc)r!O],^ V-,=&L) cks0Fc 湪s0ϫ~_O^,xlյOź:?*m{>DʊqaW ZXZ7ifWo*IR[eYK"V y~ [juR tV+{+d+%#)d)cc u=t^ch;IK@$Xk%,;kk{붜| Wu7n]-ju<\"rHEmbcV;08^×^{$la `tHuy<%[@1IbpƤ)V-8&Yh85siǞRHB޾9Nu[}֧lLJ|9`Wql8Lf֍CL| <|XVn2 7sKpHˤE,B$E`3ݱ_|)м9x-ҼQ 54Bf#8Sa;MymʼcZKM9)aݯ;~mwk&ϙؤo2"%T c$`dzWY m|?6m-ș߆,Gc3;PjR p uGĶdAqr@ 8<$fԜm PSW@uX-İ&܇. A9=+>xovWyOxrk\5 >KKI%Eb ݴ|;-%s(@y#ݹV #ӹm֭e]Ea5Gqz}o>hu \QZxJqLCk=e Vܸ|2lݵ7|mf^}#ºR]xpX] ^[ht̋% pH1,Xz$[i>Y )rq v=9+3OЮĶ*vI̻wFr*d ]*P: ꪜj8udg)/F$ekγ 㤁18(wssQY^\+CoSն !R8kY/У<_d;@15NyeDj,DSab^F}Gt JsmzM҉' 8,K ͒'NQm;x&)f]9rV]Nf8XW FrUQ7P~{r\ aѲH*=q랕"nRrngFa%3㰳-+ hAsnOA?IO5i}kϳjڭm/qg&*+ƵFfYU%%5r@@9$~}0kc2H7 yma`{{uVmNUW&m\tkMQdO)3RΛH*=I?Ұ(UEw\.NG^W|ß h1lF6ncU2ŃFqokϚ2 v rNMWa#2# V`XXtraq.XVxI[ ;_Z(4m^ibdeDln* n# Ro#mJm(bVh\FsۦjޑtyNؚ`pw'< {+ -J+/CŦ}1X)hz\ {:UEUB3ZX̔@pO' a^[OBU07r W9T/9rȮ9i刱ْrrG~G91֟`k1nU%|{{2j P}%1m!# qJ9Tv&u,Q@ndqU7dt e\sވ˹TaN:w?S*03Iғwߐ !6}qJ~Bd Wu)t놴v8ϧJq?zRj\9W#rG^9S6wJE0^X)a4dc(q?a .g32ͨaT]y5Hv O^x4H `ddʚI1œJ|d I:acHP1w{u¨t yȆe 1 G$xgEr{qGJO{'mHt;1' tW Ә* 8,W6 '57u*+pFu+++XO[6#>8&-m<8;:Uo("d*^ 9yUo4qngR0ێs>٬iD&B$X(GOCh0s\emij'dma_ !`V$?te˞.kۋ{IKg1MUoSZ*{V_)ؕN obqvJo DrB ]8=1۩ڱoaգ 0x y K9|s1'TxiKNtY{VC4&r:8$sv-.1HyIvϹ<φ~|O_Ԯ<yY:\ sQ\&9u%~߳-#*~Fb'fvH,"M}<2s[kÿCceJPv<ߒ>_Ξ\hI q;la.mF`=C2N2?2* 9E41l l+32pFqK|#]=U|f B sWC4$MVQLd{ 33޵ jw470LVo<$" |ȏCO#\YY 2T6ڿ. ddc A*:tĬ*= =={ 7M8.UL̷`*Z@B xuҍy\I:v+8sq_ `G?j 7< \/R[TFr2ƬCl+]A'jBC8*BG_CWQ2~[kiZˮ٧518)ƥ>ViI^.n}Pk>0mx) uu ` R1dWeMo|)6oV:uPCk*8[}*iZjWGpbK o0 zN`jzEމK^ۭ'##2rkסX>NŦt=VWջ?Wem閭5teq&Cz&yW5iaoeO9 jpGh aD )`*ˀ0k?B6B**Rr>l0M|(I9D鏿5h-.-Hٖ5i: r;~MD,on^X$ZhڼZnY#q JϼjFOp Iخb'8RnSr=j}ouU"o7i:eR'ArXp{¤NIj"HBN; aK*u9읻;LkRSIt_Ŧihx|K|]ZuA; kiۤCK~,) uGAj6_[q3O#\̦re;rP ,N2mv5-F11}+6ʭi(v$LY@99H++Ƭ۩Ŗ\"ͥmsKOdkXH2abW;X5{Ekˋu ?齁v%FOHº2\J-쮱;Isڻ^GGRlm,LʒΤI:,o%-59KJMe!FR6ucj^{u=Q񖮗v79kfڀ+m9xk\k:I^'o [cf#9+m> x \l [NmFu1d2_ Y)-`:zke+uOeDžY]xgVh/"4r+lY$ 98bEZA-t#0fFL@CV5WOn-[q/` cj)i ? ~0Cm>k`vw `s4%t}{~"w jz\lC*reE6KA#.t ]1ϻ}ҹHfӆ@4Npw8G}C^4,Y&G ҥY@U۞Ӿ7~?di^3/^!F}'YeHqmB "(Vuce8⒎7ϭ^Q[۷c~ T[쒓mh]]5gtPh5mN3YC49gXG8nijiM-:<֡mEN@e90I<=ƽ-kYQ%ޏwo%>*`:HH&9WD4r2xgW/S|@/TԒuEEG(1+N f wZ_ x_u/ Gơq`y@Z la|r#cp0sto(*xC^ |COO߈%dO_ڛo5؝TFv|Wƿ<;ே:x\q䄻d yXV1!ݏ/he j c8Q[n9~bP&K_7_Ib=NV䶞dS~eF*Fۜ$ץE&u3\4bwimtG؛ź)Bh^$[lxf P;Jv_٫ß7[]n'g Θ'uyc4Ѵq.4Bzm5d.*E"G>EM-G*Hp8s]<;oi04 {);ɸ2ǚ5K?qZh1kw1wY52BilR&Ev~{)f[_v jḳ׶;A(y3@ʁm ĂUcZ>OlyQO\#,kT]1?)9`?| T/;)D.ͦWoacV '7^%&I[UymJ1J:] _r7~OVojbY.<$AWoOI2JUSN:3qj`w9WeV/H+B[?Y6(c״|WsiS(a/|G񵖽D#`DVIg3BA E.AƷ+PJt*ֵֶZBD7- asnEq(T`<_^x@MER+LjD;B@E wiWzfe x^ڎ|HP+BMչg Rm Q_̺?At! G'Y4.A}hdYUe ;0ԅ_/Fy7R=^1s_?˗eՍԦ]X4(u$Hu ,/g>?!wM$.Ȣ9 :8%WR}th|P[çZ{Y'dV#$ݗ>ŠKxKJ[bu7Rwka(;|ZʯfG X|g?[@i=Γ ෕H9vU>Q;^ui5v:UucKGGυf-yoŏksv:7c;Z:"mdf%@=M:Յ4=>p>5o* wkMh6Ĭ.7onYGPZ TV{uۯwtVG%2YC//naѧ Ġ1I AR g¿tǺ׊t[;zOnC@®&F#㸐B4xz %waekwk_[isr>_dKowi!8%Xr31_@.Zk1!M:b-C Qz%j.fۍZ)wC7|F׾,h:ʧoN7WQ3F\mRHtm2_h[>xR]&itɯlnhvEݲy-cd(8xVZ:.- GxukH&h[DU`f0Z^|IZ~Nd ūXFJ.BlH歇VZ=Sц{;x&}, ?Km.RSH~ɢi;]6yv~ 6qorf7]6f?+ȑ "U eXcu_u{| M7iM]Y;6W M;v 'h}emKğZl.m4e7 sdFQWxJ~ -zr[KOMф^vNy(q}#tVQ^fP[r"[b'Rp̤:/W :=s_Ϧ]c;ZW+*0/ٟ?~'xg]iZIu$5A4mbidTLLD.7~x fe9e";[Fu &)VD@I(_8 mF# Pt#*0z^KZX}9o,Ӯ,u,Fdy{ "cQ ~ Ko >4_xs麌6sj@>yRA9˱'x_[YL G]*+ٳ◊< C'ïM45zIƐBM % c\䍀>^Mmo}N]/K<߁5]WŶ5|K,)2I.I%!/ͯ?VZ:qWd g)C(,R_;}τ4^V7ZEZ[s1Mo>2 (C)B'4/Wм/x:$qx˼Β[+Cu`PH-Y1d%WpR/˱i|O!QMjT\Mz# I =?*0ˌdv|?U_7/:6 $KK,S5œmY"e,Y@)]D.F[#inm-m%WXlFʠvd  w~gVl;fLVW( 角{0X*z3T%~;ŋéEI8p0xOI'ff.[I29F8R ڋXd6]3T>}u-ݬ:|Ϊ[hf k  k}X.-nXkXfbȐmBA`'%|]=uZ%HIV=߽PJT?%}|Mfk k e֬un E$P+ڥOI/M7V׾߿MmwIƥwm>JOA4 3oé/K xo!{+Np \?ec>+59_^17I[6.h6)>i>~#VIvv/7@YKg8YC3/z¸;+Gk{_hP{gk&n]P396YwPEuct-{h^zzowvsapTvG]{|𞳥?#iauow2y%PnȮvGOxmbQ5Yp&xF;;o*߃ -|IffohCXZݫ<-4YfvIc. υ cho4[)=;(YFUZVG>\*8zN:;oq8h_t76־1;m=WI"Qa=-GșLŲ0iFǗ" U@3ʍ6vmk˥](7Ku'W ?x[} Ek`p1-3d&CFg+w|Az_icnU_@l/`|ᔌbk>'FoXi~%NkMh=͑O)$.L+n.gC|*.u-P5FKծpE7C$(|`"8vdžUV[Eo>]:k~3z/ xSZCNx=4elNp@10&_UoL|5jtv5`drW BOĈ&AL^"6^H[}sZ3y?i12i޳/RI᱊GMrQzzW,@\D2ydV7~v#TvRӷK= "xK}rCet:_-fP7GVI8NW~?Äd>;gxQԉ ﳝ5c$ U@lw ˥~?u#c;Cuc.p.6P)^o T>$ZԼOjJo?n< t2\["̂kg2׀}jU:ZYi[s&֗ը5wg SB/7?ֵ*(+/쓇,DFP'*k|!?ZMޫwjMƅe]JG9dWW0i/R}էǯ~+.BԵ >[Bd\G5ڼHLRs-ODEc:7Q>Zcƈ(cUV*9P^rg{[N7}tV׆3n [CM_LfoW–6KjMΩ0os*k3*gs5ީ L lp@V0ӹ0*[j.(x%jv6qJAYN6.Pleo? i,S L>[RNW-Br+.FA<<ق|o-}/S*2mٟ >*]}ᮗhY X.jR4x@ dKk~^F$Ww)׋d܆-1Gi`_umzg)V{)E8j 3uL˸v$X!W $mp~c \:iOC?M#To2c -A('7f`t&!Vo|GŻ_BK'ӯu)ǘr~ֳ*CP0o[}c4m_#~uMq#9FLa &XA0}ov!$IbfmېWY=x?_5b_ j7TWqů9u/:$rOOs18? onp-Τ/ g2{y'<V(ԕgt xwx}`i7~0/ >hꚞ=̇PWilȮe*̸`#_Ʃhlkopeve[jRS )8'ޗ'SMGy3; z.TdP퇨4X7P."[{;;t+$#lheC68M./nV/㽑K6Q]uFߧ$Cp 1ٴf'`wzioncҵ e/hq!w1N2rW~xcVmZYJKӮLqBܹDBZOAOg'M[Yok%/o$|"C@AMFu52 XcnKj u M6OYA Z\hi ̥@9$(;F槢42*X=4KYW a99}Zn-2{1f;@Q"_hiQN-K== znVŞ:m}3P˹M& \rA#&| bSWq-,Ų 57 AfEt s!\Tq4[ğuu=_Dtkm=R).Ht\Jci,X`|f0|(W__+w'V\E ZHH4ȨVQwOwk}52XSvR]47Vir> "-nRHnDY YZmbv[g1xIZEt%XD-*ܟG9?6>-v[J:+\눤Wp@XL\p$D +kǴ;}?&CgIlڊ0a{g[kr$N|9&at7Ѧo䈃1ȲIlU+oKu[GuIExL`Pr 0мEi:ieeGu- 1@HR.r Mtͤ].o !1 v?/ːs΅I_DDפ\?7Y-xK4[+3WIO$1KyLѺVp;?Z]Z->YqܥFI \W9* Hd+Dʍ!&ےo-[2"fyH#W& (L(`ݣ}χ|=Oaڀed*ZD?{p VZG]__o+Є*dj+˭],}S_k>>|?χ^5McMxWsOe.gd ̨J%I -; c ī6d,JIљ>]$ -eƝoͺw{uq:>+̠1 # 믴/i?\f%ȝUˎ97CZ]_wgM켏+c+7,[[!1s_BjNJu=GC|7Sdsx>+.w#V3m,Nk6?xVIS-Žե+#2v~_'x%IW>d[{TrLu%y0a^tӛ_y5hƢ咽?_gOkk" j$Ww/In$DUQ_yN3\Ŀ 7:c^)մմs@:B[jJU|>g;]ueaF4֫FXxU{=+×=gۦ7t<;K9G7_|;c6|5fEZp-Dq Ad`gtZw-98Joh՚gj>8}jڗ+8<'i}uiqg!e{By/V%c"hamfh<>XMuv!ax zB6m@nkB5+X*0]YXF#}"ȼ26AS$C=SZˤ<+9BGqoWXFՍŬGK.EI#`Ju#9YwB>1]J Nΰ1A$+g;g hjvi]Vmm7mBM+L%zN|v8-:I5[oYE8 IlX-M9bTu,~vn|]&KAxHM/S%[{AՀKchZomZ]̖-FgaΕIC1r<ϋ%עgW]66M/Dw؍3 qPןN=-ef]~wtytke~'ōNƳNlV}6^p +C:Q^#6E%yh c9PpA So ny\n`3zC.#+=r|ɥyKG#- J@G5ڰӧSՎ;[OY[o-!|'ΪmYŗ8~ juoMItO\4KPeKܔXp6'$7eu=XnS la1cvAxᖩ:gU QnǴ{#47,2!,ŀΥlqma`Y܄5fmӒy=y=2i!5s,Z:ڙmfa oj%l'oriWrp$̛흐U| O6a~iYkX,rzYIZ^aRJRiKEy2[vͻ ק|Ye[ڵ7ZΛj1\Hړ 4P41I]pߵ)\|HRa&BB8t~UJjvypt!$@03ć#-HהyU{|'eZŸ&kTm 77 (Ѱ $R, _s&G $GQl6<٣(26=Mo derZ5w[a޽FyH1ۇEY|c0>\x 8ݫʩVt6[VfڵΧPLa .иm6(=xWfӮ #-]e9U\ uk߇u;f֞tĆX&6k,Mi]oO5/>0h7v~kJݚ@^& F ϛmuo#W8K6hmd9)IyUeaq8&2,6Rh% RֲqpJw sy5'}VIlXe RFAu.{5k.%kỳkyjkCk{]cīzET[#EFB+p~U8jR~"UK$ݾY/ pw~6x猟_5]cړ&^5+*,em(%IHh]ϹGgqQП55(Hs֚[2Jԭ8̻8ף WYqw*A *G*WH#Z|-G?t /vz2]tgktbIrNzfß ҴmB󢨒;>N"-p>a㟎0? /-nϽJړ9n7e269 X\{34k=XHjN0,=Hӄvz5FUiNRMJ=t|mٖf7uK^͆؎ͼqC pΒ+`!p~? ++%n _.[P ۜ/|lum?Qa(.p"ğ|v >ꓬ2h2AApȱrLe3|)|;u ,o kvMo}%)*eyG5_EbmQe[c9GC:9A>| kM K XI22$ 6 WTM^[VTM֟v,x&M%cAǿ^ZG{k+Eʉ ENkk}+-:f#, P`|{zu|o~$IPLj46GENwV0|P@\?Ja>s֫5;2UG$G4m2G tn  8\#u VRqz$Uӧ~,^&#*RRi;6m|J- G{p:vg]U;xG\7*fXF#U ۭ|%6ӹǖ57W??&c0]ccd\ҙq֜#y'bY@j~`p =\Tew+)p1Ƿ]wdؖPKA'˒JQZ]SjI {kR 0 $D(ƻRU$q̚@B26^$U-ȧ#*_=HR?Cu9'H®Ns5@H;ƬB-Hk(5{(UE=?zjjBpu׮=8j:<"0~錌cM&g5 *T<{͌rq4zhw>y$ѧ<3PC)sswSs%P!I ]YJ66ѓ^եWͳ 5ה0"$dM3 'ލ9J}E(s*p[ۣoY?uIry?C_M|'O ]M&J)hZ4۫ܫ;++W'5mԕyC,3l(qkW[%nn.C v hw![.OYFI]ߩc0뼀L H?tUͥB$mw O9<Ԗ qu³GHyG< =澕eߵ}?}:+V2\[8Hs$iB!@wV* ⽌* >^RI-[mI7&I&I6J$khc`Q|}{WmᏋ~#X5{B5WLV[krU^f+UV$.k(_?Ļ_^=i mlO)R.ڠc$HyJ0(n$X?wq;aל "ᗐQbeO+MqRVm5>(a_)A(sFQm?viŴ47 8~ȷ?OٯA=2ZZdOhe_,.w8VRV4m8$S~R@PW  e@>#9=_@|񯀾x?|FkiAԮ.,oKi"d *˂k:*F*0nm_N b3UniK6ӓEF+_[V7w"VO-Gx8VDA=`]1*NI'=Ii?>4uoOҙaѴMHd6dLDʏ$¾?=mt.VhVԕ;BݸBs֫<ɫ`<=WvV5YRUi?O<{|*|Ia1/ rpٴɮ:)i82u1O8+ xH O5&jۑ" 6$r%ѵ}V[]~t!~RC⍽A#5ʼnYK-zyy.uA}^> O^\humc"Z A[2L%z?xA:xRa [33+%6`m"hǖ϶Ww%S&e1$Lǩ'*֒yqz41ia$ܝz>=JUcWt~ uAgQcUbvl#vtAR0qxco]"xh$"q<``|#5^_Ahq[y% |&>`GHgtgXH$AONIǠQq+섓"_Noe谬q aQס 9c46úZ%l9Ib2 `MRd ;amUEC YU0AO#01װ-$?-Lgy p e,;dݲZ"(!{x!fMpw$k_2Ovo@A挍`H 80MszΈT ^r#1"_#k0Uf Et>ѼEyo6ƶw1*מ {˕\qs|kmV;̛ ,,>8Qy< yqrm%X.621;l`d7?{on2+YYz&ʁ#' Ccg WUpūC"s4*ȸ(VD* Դ,btO]RZukEw&$yq>V$_9[*0ŏįVo6&~KDwR1v e?w}sXk[Z5&Yǘ?5  BIc׌ M_Mmdq.)BfF/p@C<=>hͣ;ϊGB힑_,#Kk)% G!RIQ eY&-͓\w·7 ɊHo#&P3S1洟ڔr_.5Ŏ1Zg!70ĕRF=4JjpOzmiaj׾"]WV{yE܊ZIjwz%sp߂w;k~фg)집ܻAs03f(D|呁&\:IS=αX+L͹ԫ)F2¿jO1]̖=Yvi%6vb3?k;ͦ[?*y)v[vk̞Vg 䔦&mɕhvUk>#Tr@%%ǦO#\&-`@]G'D,9텠Xg1nrs߿/ֽ,jKn:M(P/}-ge- _yRy {(, _Y V>moL.dD._)a?Oڋ+Ŷyx%W/nn!E 41PW4XYֿ]{Khc̭' oNgRWwLĻE[ʭK21"v^3/|y'o2+O^_ǤI*IoyckF; ċ̷O^[ KA)l<9x$fI$,Dbn>cʬF$}x,~Ϳ#X:z6^dRZi%݌JF9H&8?+O׵-~GRB*M-*ͿD>"]Nk`̀p]һE7~"jiگ<-aYGLG7JזIlV5ۄ'$%{=u5(ܛz+zsZVg痋|Ub7 i:nuv3TUlI57>,㽎G-'z+!MF$b1Oз1oi5{H::ڍK&bb3ib1$ٯX?dψ_mHd4lDYKࡎ ':L^)Z`tdۦI,LR[U *hO]#nۯ#LJ"d2b$9XLwo#i ̈Erf]spJxd7߅VtW)Z { k#EVF]TϞi(5?è˧iŭ)ukْb%,UR#819{ڷ{PV;M3D,;2h'񥍮.iIc,ͼqF6dwA1!l]|(QMkE]@E.K+[C̩4mldR!ʱVeÊ xTiڶ}iqEiHmlkܼ5o+:BY_x~CuM.h.4%\E R.pOT=NV?##ğ>&å?Iu qg2.]mbRXDAɊ7 Y3j~ß?ex/Wu7~- %7'."]" %cUgPʿQO|1xRȦ֣冟=7QF *l.Ȟ[=(/|(Λy4zn $ݤ\P~zׯ(Ku+-֪Iwf)W/rwM)'f8-;GӼQoj]"[rCL(hd'( kh~05W6D-ckX\/k,7Ibꌇ!;W$x xb|KwlHξTLZZ2l)wHYAUf~ߵ9'ŏ៉OsLk{(,5ʴq)KGZux3.uSTWvk\Ζѓ~OknyCؾ(x:{[}Sn^amymi.DS[*#G%8!zIuOxnT׉Yo 6Lf3Em[IrƢKiV0W<>|$&7M?`3"qlXRy: 6?^R u1FOqk0@,ikZxO;9 H; isG #5{O\IӵM>YYLqKl̅K6.ύ6f:km}xǓxZt/S[g6k X|ேо9YiZVܳ=K |G)~hKmC{Wύ>HKibnfMؤ"E/1y`iP+BkSƺ_|EXмow)8{pqwŞC{xY+rDӷ=}G۲<` b3|H%ׄ=eIe+,n^P3vͶG {9n-am-HeòBVm۞ϗRiٟƏ_8kakj(5[n~b[o اn1i 4?/zm}(T/o}͔ce<ʅA5_i1Mdm\3,4ϥ#`8˚ ^#ݥ 2mgdmCԭ5]Z6k!M%FO(cvΨk \7g<æIo[=*#s(#7ita-|̓9+{mᎿK>a CXH.o%F6,-76k3HA+gBI9rn6عw䖾/DQxoEt^/q}J_Pgu5A."2o NG%xᗌ4[O+K˛LWZmM$69p.-]XK]𷄼C^!&;3jG0 20w̿6j+BKz-[MSy}qs3Dbxy򴛋}jմ=⏂]~=PL-mn"v˒ H~vr[=o/f6WѺ˘.*T+C2.m?Vxαs*d+rĎQ |R׎-l|/.XG&ya;0?; XhhM;̻TM;]/<-[3&+>okva{9Yx!1# \0$ghbmOE,Q[V;GB #*F# ['II]mI53Oǝ$D3$ȡ:{- [›; ↏5˥Zvz9A]MnnCIΊnmvz[ZMHQ}wt?]:ǭ*M*R|?}c6os(yy+d; ͩ|閷: ;ۭ>g`21[ ͸u^!|ky᫭sƱwx_F͚kdX)毒LJA6V>~%QizȴоQVX#kq,p3(y 㬟$[zpź:%Ͷ^$7A<|"0FU69䊥/m.l{;{͵a "?** 2| {]~٭tIٌ :6`Pbsz'jTަGiw HN5qY@b>R"=9ڹо!+V6k:]W:- &ި6(2HƟSw>%>VS{;oPt@HY4X.qbD ixM8?;K۸HԑQ"!Щ$kx l~1/!&b RU'13)$q >a+Xigutjk[@v\zkME{g7_𮯵ƹM6[hHDch&-껁lgZcإϩI2ZbG(} T}WSM񎇫]x/@'5lNVH,!=FHZI9rcm##S_X6dEH㜜a#cPH;.*&⭮ǩ(Ymm?pZGco &'ˎC;92u FYFM'F}HjW7xUۘRۮ7EaI#mn,.;mI:)a8z?`|i&W:uQt%Q2f ;-lc*þ(;R>"5K%t<ĥbʪa(;{[X>+4 :xS}IuX* V*ܢ?+Z1ߦF:0k"iR;ײKb. E=IvH^d:vkƤ^8"E|B c Ӏ#գ ri[OYXNj)IJ/=sb&b˕p/t.Vҥ71Y^XER!j?k'f)3ç^Ua8aN8a[ѮyzUiٞ>uA isE @KRy9 v(us~sykOXn\OqEB-0۰J?0V֫% f" +y" ?| `_E)o ~5+w eՔ4w:Ė70I &qۃFSǜn-Eo߭3圵M{+6}]UZ_de_>ixS]cAcywϫLwi@#/sM.?j:i-#FT)q' t5(q.izU_NZ;V3@ڬ]ۆYJ<҄:#)E)G #b4C N7<%j%VKi\"[#;=]|GoO^֭4-2W9eԤRYggYU2z~ i[i^(5 J 4Bܯ"*US-;eUA|t91F*n]K}w'WHu8d6r-eR9#(^#ƶlnmI5ݨQt)<0A '?g/?u &46=`IC S$2YHo%GXzBx,Ó.8PYor\$'xdSt;6-?FzqYӅl-GR &i4Ӫ{FOړگ|Cfwb/|8~}mn4#)mXgWjkiS柨@š\%ŕHd0(Vq9G!OJ?w>eڍݰk]GNv0+((ʨ]'C^|b|v<&Iioho;4Y*_;r~<Uu;M$^w-f;+F6w^]zjT 'u)FJz+$v|ɣYܽZxXkDk-LŜQSu 6V4%1]_CY+&=TǝP)#s|7h+}⛽RM3$Ce>vssp ltg4+n|QjϴkȔ"JB8B0q)O??N3թ;ȵ:.k[Z<٬f-ӆ\By?z. +G*=gWKv(M7Tc%]G6~c ^qqcIu;f(%`![T`mῊccsm (-RK^4SZ >v*}mmm;h'nc; `;@n3ϾnM*ߙO 6fu,v8)8>WC֏ x_ 4XБg9) KT:6o9hٷZ|м=#AYNHukmJ <:3FQ@הž"akZeΕkڙ-n"/7+$M"d~W# BүIR[03G4lg,3{~j( .xBQMĕE)nϾNm ʐI+U(K_MJ6W^o?,|Ejȫ$T o޴m5>_n;KhQ F2J8S{sۍq@Q6rsdcq^?^7?cOa-VZ'}SC qltbFVPǛ+7(=4j6rE '+o̻t +m4ۙdӭYdfLRrz?3~ DԡuCw7I!`uQs}ϓ\׆o״r;-x2ҪG\:p׷@~E̬;Qttde-d>cF;Aq%j+*\ftW4x#񅖜ڰþgiWm,P32d+ n+ŮfPLb|˪Iro#;9Sץh-!kO3]ɪ$fUS^<"3݅L񁩵c-Hd{tvNM"NyY~@bh˂3>jjKis$oYviXbۀ;?Cgk 3$X1ʰA9RxN@$1n ~[F-xf 4A?60ErXX]DѰ<#B] sVYKwH*hPÒs9Vij]~r}fq0iR\XAe !aA G{}!YմX@QG,%, 82*޿y[Ii|#f@Xd`#w8cuwme< RG8WEpJ-{3Ѿ)x}jJIYFJz85$~LĀnܽ8 >]mX[[Mg@rNe*bRIFzO-ܒO2H δ弯m8ŷA~;%VРR[C 9UԷA(Om|h &I1EpZQ6ϴ[%!JRy~-[F`մ{omy ŻrG&HdSy?}S3UxKr]u:iTyebfHF^fBs^ avw{Z7NSoQS84ܭfM]5d=SG់W_K^wo>tEE>PyԶ%L)9 r9>q]]}K>&bKK@xԄ]? 'x=W3ko9~O7!lLuGy[[}deQRҽJ"e. I#8>xQZ5n $R>쑱VS~ xK߉n|QC+*{`(h߾]U=}oͲ6D =$29=:}jei$G\Hͽqq.dV<2O1 Kk*z{qا4W,Ap?Ceqc#j#f/$)9rJPp]\yb=po;5"?gB=)(PT9~t6}F0pɫCH ssz4UH㫷@Iq_? fKw<"qmh,}5ͩ17#|rz|CK匸^A nB:#?o3Ͽ 2&t:b0\(Yc#[NIRO*'%w梁-+F.ַo0&gʀ\(^Ҝ#dmnmOMpsdSy1 ~`vjHg6kʆR_?wi򈀌( يl}kn_1&HG%m[9p=sy!co PNp=?^x@dalnrG,60&. pqW;[n.rC;(UK2J59A[YXj t9=+Z"Gs8q;nm>#" :)F) ]5+SJyѩ*H<q~)$Y@22 cۮzwKѽKd<`SdZZ\fʕ*W9^+x$R 19<|%DHn{ׯ|ը!/nȇryr7 `!x~13GCeUqqb]ƚZ}R#! ыys[W6VJ9f|dg ],E≼>m>ktU,Ypx4߆*Zm\R4RjHIJ˸+x Fx9Og88iJyQ0Z !2yp1888dۗ7u|]ejq&D<"B5vѕ$̄@2T|ԑz}1Gkxׯ?/x~?=nB[I]]$I'C>$U J7(FIEkm6f2,.c~G(m}Sk-i@x]FOnu$oj-pO<ϲInL\B6{8 {jQP;\`b RQ\! G yiew,H#q bC$yyaZgS>ih:Zj[$ni3 x||>pzfNJմ{K{2ԝ:)<G^ $>xVq0IuM*\Fw),Hщ<ʹkm.%11]Q2zvzAtH甲GNB912y*YM>ѭ8, 2>W,2pNqn]|1RmdIt^{-K'najIU]FL{̧9M{OVT]bTvcXty\iEnn[YIcgؿ pqzQٷž(lfjuo]\D] V݋ifBLV\zWjߧy#Vuk&֋޽M/ñ  GpV!X6̬vK|@K|%t8 y,K |%j mO]GZc 55!zUn0VbvЋmRoWO!SR\^>~2~P߈ 6|>>ivw VoUci"xo/;_4K(McGL#[kh>do(3H i~"l^hnĞ[9gwܐ.mKs1kI')IȦ9$UV612r e*n<$R/}tٮ,SU#_)7')]NJmor;:W#vUX|$D O9ŋ;>sx{{v涸LS T—KuXz߇vH8cC(C8]C9ʌ>\dzMS 4ͧ#F.5㉾X.;0ǼB`)#pNYoK xŸ5o*ܦ^3p峖,4AX1wmmÄiZgwMJ 2A *J|ЌV69O Cı,VeYy 1k-c⇉ui0i:vZ[ [ *ibk45Xw*qAMt.׎Ǚڷ|I}e_j%B`s"VT•1䃻:]ìLm% !."L0G!YbÊϴZPԄn7[_lk$i&B nz źu拨j-/Wޫnw#B+Zo J;#ե֗1!-[=RvY|]y_FRH<^$+OwS]ha`O-TS;.,Ŕ'_5][V>%&że_0OjYR!`AQ폃4_Fiڵխj0DڕX%$d9ϥFڱ3pZ>佳>h5+kV(ky`HNvWx8*[|%;Zޙ',VQG8Z*d8b5?^Is|N-VAqrH$k13yGnNq|si<7l|Aϕ.sG5dzqYK)vVW/xCLwu G40GrZdhPV1 5Sm'[DgqnH|`)M ֺ{[u/kN&%˷SCo F߻'ppHݸ Oh1xs\ؘkppJ,27.;Tdv Xi7ֺems /zcؠ'yoTdnU$R]5kXUѼu~ͩi:FQN{w?xAl| <|9GmKOhV&#ac>H2_;HȳĞ5m7LFiͿ.R6?B້di"q?V:M##nԾҪ߻PFnXۘO5/1qjH_^6(7|9eݽZ'!ew"9>1#ww>/,5xIL0Vud_1;o5_?_Ʒwx(.I=ծr/ʏ#'? > p4umA/-tiv Y$I$rZ^ۂ9R w5p՛^O]ڒ7N7H|"ϊ~}y#ՎjCH3Tʅ>{i-{xVKq+ZXIrUs{((L| PԯVvg8"-uOE$m W? >|MEIil3kV9^ْmDj!nTp qrK>%N#*i.O8[GC{jS yKN +)G g$6W}'_ rZt^J u#Yfs\yypN@o oxx>x~s/LѮt2IJ!9r+־ rxG/- tmn.eBmn)",`eU cqf_Z.jSio5};/-_vcGDh2v^J؂L6f-m#OH{k^}b=WDQHm)ܱ ,iBJ0J?W{_\h+w/Oo+&Tx!K~ * ʬ&, gQ?|VmbҳFhh(b ?jД2G|Ij7mOjFqf'eFx?oPxf^[6H쌱Q(A wD8]H5A:vZZmoåҳvK(}\qVtϚU|1sO?ֽ;MɣjͧMGQAv?ڜ-m/ߦJi܎a]vd >"x ռ⸴+{ /Rm@O,w?Eڷ o '!$(~'m_#27~?ƓsMX[X-1 I5>i0AsVyt%0G$\Fv2p ?OqEHt=7Pˤu[]H[E c#zK |gZwZ^_:θao7[FB]A(XuNJ?}r5 >%+h?fk^cϮI5ծ#PfD_B+MWQi%FgHdmcf7yt1_dx/&_ai 7>|3[ -fOV\Eea`d+F6ASK+Cšoj^syVQK9"K,NWAoUtxRO ^,֣2Mn\PnNFӧxjKrO>ǟطCo/"E.__,[-MËk <˧2?)bFw*9ớcϬjڵӬZYZFQi%#X׵\F}}>cwPFIv4877BghՔ(K^>[m+]]*X$ӵ+[d0]V_ l*v:tlwkmvvU0nM=[KwПǎ+kD^ ֵ=N"iYUɈӕl0>O^Wx=OWQẏPW7\N!v-|.. CWlYFn_!\ƛ."V$L)^ ோ$JF4;Iucp>{e :9&9P.|Vb):_gm \om 6W:cC3o]n7 1 mCZ>ӆXKN(IfS+F2d|=4?ͥ> קoB]fB!Ygd|Ɠ@߅GشmoȖh0UVTɍwgWggK-W]OoUuڿyM?SKŸ QӢMFư겭H$H˪ G|eBoݐH> xw|]&vZ;;e6P ^螿חnդ~о/ Y;LR*c,dQ0;Oio^>n-|UiJy v`R6@Lyl\DŽ~*ʹm=Q^x"708 ?ul,s¨VS֝wƥx*uˏ%Վ-fP%oȕr**HF~oqn.vz6Yl-ͫ$@c̊C(dvۀ5׎<[QҼ)s5խmf͜ KAmP儌o6rW/x7Jln.DZo$y V #|[N1}⿀֒D4ˍ+Wm"EѤ1%2 V[g[eOZ(v_ws΢_ּO[--M$PI,0H }f_1$U!}'Woj~#Դ}(=I5uxvMK x*KmG,u]=dt/mdƨ]aFru Bso< n{M+QC-uj-@"Q,1Jֵ߶*oTCkH%Sbё(4Ir@FmYy\ݟu;FPM:]+NYW>GI$%|%W(v9fj,Slmk$70FN̾ i&n.nm&3y-ZY4IJyv]_f!|[FROb9,ZW-G a6-wéƶ ݬ 8!n>Tl۹>t fVЋ:մs-V.ޑm݂ᖱW/ \'Ou鎥g1ηM:Gyc8%܊sO 3-ߊccmetnmRO/c5NP'jO:m !$,Qتи($T~2xc^F񮙥W]}Fm+sc1 7HntE/ju֔z]fBDͧLM 8%6H~ |H;Kha[jvVϨ㶉ˇD&.]P(c~ ?ׅuK8F6t6\ʴ"JwP{а˃ǂ{:.sXڱ]4Ȍ|@qutY?'-Oo-Yu]Z j͒,7ٮ4ݶ//QkdVIox ;=%$gdd <7Y}:߄a5Y.Y$yUQe :\)lbƛN[4\hpsPn+wge}|g-eoiPMG֖ѿ)\,${e2NŶ°ONZآC $h.r3Š?#5? ZII`cm/xL.mId;.8/p((is^u yQԴ h-J7HmФcu LB³PWῒ#C7nr7z>qw-ogi8OP:+WXxm&/,@#'wyϢy*AzX7ӳ Y$#Igk³-Ο᫫KKL2 TaFNfh8\0aKNNZF2{[yT%XۈrHRS {?ڧÛ:}i*[>Oaԯm0@ p2rHlnWEuOxv5![m}P}]Zm3b+9;G*:W?xCwK{] 2Kuiƥ{wqekBmb[nIS_g~x𯆭DoT<4"[[ƒ+y٤x'xYJj咳O{kd6q:_GO wcmZОKJ1rg{-4=_:qj5(|8S6m.RGdpʡ#qKψ G l[{e<5-d6OvP 1ݐ!y9ծ/ړ^w$\g%{._ €8ԕBҊgu/O~=xKYIZZk[ivxfĈI?9 V6|2x ڜ^ $}sS xU.l̳2n#,0|+={ᏉZUZWiYY As3[_{>;fѬu-C.4֖(2;F2DqP'R3+Z{V:. 5+=N_ O޲5ֽC-ʺ [lv3F6G:V:z宭;{{\Qr\Vl \OYg7xn?i5x_WQ̮xH,8v~> ?{Ze3wrNԝB6),\W9x~HFP\|^ |mjUNˡ,MnH5to|*vN6Ri'Hqּ%sW5J"=JJK+%[# lG}FĐSMii;^+9.a}[ew14$; 64Q@s 'Y{Fm#V[hD"FcV`pN qפܠ壹[]5Ěϓo`U}ɇa)Wi ~h3:]r_m!`KVx|OpFNЬ,~H+KKI#F!C)o ]~ vmmjO[y>u ..FwYfi$X~݌!X)T-ldH3[_k2@%5c#ҧ́m̓` x{I'ukffedY5OK^-MծH#rd1 vjSzdT_4ONoCCSk WBL~E+(G.^NW-Z?GNϫW{3xkO:Whuykr>HƂف#r+W_!oMoW~4˗%7;5wPX#pB61xo:ΎNgi6zA.ȫ $l~P[Mt+4OtQaXG#"Nrr ɬ*JZ->*98^Ϲ?i_ M*>~ G wH8P[>\& r O ik:އi C?eg`vM Tic*^#>sb)H\` <_Em]ǧV7%$Hḥ#^)+EkZKm9|7o=ڥ<8%1ofgw+Ox kHu;ZzZj24d2x|"`tָN4|ۮmVv3 =h|k;U{;tV9k}/1xR? \S 'c`,͆de |?▍F\__mޓI#wL̍iq %Y6r00[wu&ݴ{G&A8 !_TA yZe]IY}uZ4*ӔBrRMuNtlBpxZޣg=1 NMw۞YsjmW/c)@0 n$Ug> |9<>%h|Mb?L|E_&drmG\XQ]fOzSǥ~!vqiY3Q;&P[p\;1xxJ*ey7Wa)J+ߧJmn4_J"¢vnH#,Sb #"QMQ qoV&*OV]:i_6?tQšxG bJ6 Gjj>3𾋡|Gҵm 湪闶QvI&1 ,E~2dGWۺWQEdN6]#&HbŬ쪰 BeHA HP/A*=0qsY|w$~=/4t.UHw֋:l1lOImNjo{8j^45MW,dԒy܍Z7o|x%wqk:MY}Ս|M ͛Ą/ #'^,XwҠi7 䒸'?=tTFv {oAմi\*3#{l~Dڤ1Ѳ:7SribpRezk•h^/׺}g4sُqn;-ʬ[OBܐ9҂?i#r 6q۞+o_<pM?L$-o4HVII?0O=i%@*k8U89Sʖ!: w5͋Ɯj*Z驟sg}f Hq2?#vT3'Sԯ&YksYqy @Wao}[K!16v l"ciY@vCt _K"񹱒@\I=_&J-drHe,Y[ I<={V5#%āapR<aGR;Tܧ$#6va{|Ҟ ~'ۯh~1`K]SW,Z_/meh>$Aq2I]7YsWF{eҟQ rD;0UO W£{gjZqݫ]̱Eq?wUgZ2[KT(|ݛx۩tx3(1 mf[:+$ p@>LtibOzqr]Z4Zhת1IQNiv=hou'5崓e~~kGXq ˜7ּwkJۭgOnf&*qc؜~?Qgi3 _OOq '䘏9"rm$m,TA?rGnҬ*"Ȭ8dzg9?|zu~߂V_/.y/ {Te,o$A) 9I$0`=1 r ӟ2CW )'gպl3[ χD($m29 ^iwvJJ}OC:8xӋTյo[N$#>m 0 =JƟ |O&;6I]/$i8.,ah#ypĖ.y<秹WԼSbX{ōYrΑRэ9It}<"$Ů]oߩ=ͭxUeKvЃJ/D?jfb9$cqF1yVχ|3x]`A\/vd-UPz{s^}H Flm|oucTG6Mi;m?Uue 7EԵ_D-7r؃bĦyr7|+I{A^d~w*IF,vӑgڹ劓&}Pe][J ;>ګ({1r2@e鎙jżƳav29$0$H#N21?+Ϟ((eb'97n?t Hda.9z]2*|@W8<#T{uxԮG,\Ȋm:.Z3yGFI+ObC D@{^׽mGi+.Xe#r=_YXܴj3ӧOzTfނg^w;8Fxibo~֤h8覛J(͉p$]U®rFI]c(vIz3zcQį.T \0 3ETUV=l#l;C.@ }9ܓe48P'-/ xU“}zdqkǥ[I-b0H!N]KMy~l9^k[+1$  3 [Y'Py1Oׯ|)88_)moM*v'Jjr%ηAѴVyu`ԸrA*qEWћE3[#IT8#8z zM-kGhK>b`7'G8's0Zgm·|=zu$1SW׺W|ڢ1 9?#e;]5xB% .ZeӦP$![O?%UƉm}gz"/b@U 裇QBH6XF0[w8WU%Q6-?3:.07QFb<؞891WM^ٍJ4%Ui F%n78y=|nI<fmR(&!v~]*bYy8~)[x3X.Cr~T`Vbܓ(-4MKHg1$s$lc rx<CxKޅ+˦ɶ7 <@b80k(ʥcE7r 9V=w&f{KaڔTk?3GPmcOxkz(mt{@5=6W *\,TDu$epJōoΝi_jaӼ5k%e2i\ƀȁIq7| iZ-t;MJ;ߵ27Z`qM3_hZ$~0ԧgKh_"!3n !MXQ_mZ3`ocڏg$Yڎt.݈e)k3aA6wUnn}w{4b5;V RX %VFt b3H!4i]՛Vm(oxFf BBrè< '[ uS^)O-BRH8mK/0ZTu, lWwd' )l(P+#{9sZ^Gksj7Yw&Am-̛w}挡V6>nby/."/?f:IhVAl x䍎7F@Y"(  Q&:>FsH:6:u{HltՂH̿0UfCy1w` %_m?K⯆zNJD{i6or"n %"ܦ-GSjBK{e+7 A A_OOwo 7㽗ćQ.q %uie9 yL2\Hݟ_?h?;sqHtHv/=nglyXpXs G ʖ^W2ZksgJxS('' (U6ӿ䬚^(xǺ\7KyėV/^K@9#B&Nω>xU^Ys"]E d9>lQ^Sv~:TLSVY@.N8w>(ю-u+5->1T70#a`\5Mk-N[𶅋oZSA揢Mw,5םǘ `@#j[#gr3n$ܮ1׾n Yያ}V21wkiqo2v&C,WH“-#o|S!]y+)8D Ěloa"~F6w JÃ^+_e+—~0x6խtsNT.Q!7M ȂE^I$]h%d:_3ܫyfź7gi6ms4-A;L% cX(>)xאxPHS [,6WmaC M`º|gWڌ,RkRT_ ;cs610" 𖽤 >v72-82 ,m$f<סnJ+5hѓ[\/YCV&"t[impT̫(@|_tdy2 7:EŴ"fQdZ`I q};Vߌ;>G դ |-xQZDQM53=kƱ ۘ.*ǿ|+Ѿ+~·ZDe|]w z%D!Fƒp봆oJe~<8ղZ[/V_krx}ZUg2O2)V;,~]uQ:4'm}bIbymU>cD.epTȿ/ 4?|.ݷuxde]:+k2Dw >sё3fk/GuZNEsOkj"w#.UIvp0cPCaէe̗Sph>KkYu"d^,s8cU HrI0r^ht:v'c'|̤Co!l)(ώ4#kv,#Gi1 k=qG9,|Mh7܏x:R:{ G29&E ގ'OMZ?.G7uI#QȻrH=6 Z<1xvڠ#Z9%vN|c^/]Q8OiA^b`Y-MLG1{%ăi%a\ZSY5=>=UЮ]X븂T%!2=pqOI_ l<7ѢEEC[6PQphduG??=Wϊi9ƭ/,S\B\2$W cl_gx#߃_x_:O<'hahw>&CYS_wi},2>g yÚnյ>[Z? [ƑMROUAQmMoջl &2-l]_U:KwPiĐ/D\Iql# pK##=u/Oң!ԼM{ruJG A#hF-J~n_xE_[^0Z' -#K;IS'n6un|3[K Bc{b9~wbUEN cV~j|mK"Hlaw ҉K&1a\|UM\kK -.Dr:y7! wg"[MKT:ڮ"Bkgx&׍e3yGῈ~դK xEe!Йgs$,"tbf'yd쯿›zRitI].#3Z1 K-BOWy^0iޙ|I& q>C7t'71Y}⿎3?{soo5jfEf_0qBH I~x W> <%/ZNayɒ+vGHg;Nw`+⾫9|d$w:.\GtRsqm $D@$AS̈́qV#Z)'oDշ&?/m{> jRYZpYܤ!0\[J ɏ#a!A)_ NkY$mjnq-Ŵ,֯!y`mHp*Zb?i_/#e>ۣiPomcWJW;by䌼xP7 fX~"FռgoO:k H=$KG$#+Dxֺ]J%sO˾*תS叅⯆췿ooSjE'ڢpA%pZe$+qH|}_?u74*=']t=WK9QD#tۗ!rkZU?xַoqTDҎ؝6{kH" "_8#C>T>}mkwg{R]F)UX1 M嘜s^|OTZ]WFM/_gok[/m-|E_Ckogm.mRDC W/~3|<$!ԭ,tͭ-#18;0bp$BQ9I|[iEa߆ldJu;/.F{{^ ta Z~.O7[X|Q$jl5-޶b *Vw2f4?Y+i]7[Z])G?^??ke"kg lq\&V"'G S?=;{MN\]z;yJYko)Ngks6Wec夏l dT%moq^> ֊kVtm4nMvͱIB P}PI|q^)mH2ʭ'a~dW\m;W5Tլ5 I}1ek}";9-pJ;Jm)_9+sԨ= /X|v.Qk˘-I7ĎC[o"!H#E A .kƷvd0@ 0R,~cdd|Bxݯ6Vg{p/J-yh`*t Rrrѫ6NIi5wda MN7>>|?|7oM_^vf%u2Xfᬤd w)6~+|Y[hY ]WWXAUey)$De^4Ծ_Ǻ]_R촫n4˝GL}_; Ռ,Hs$†U Hj7wڼSOHe[Oگ|I%݃I$.s\Yޞ -;k~4C[i׷^:,xhKN 8xV=o&>]6_H1~`"B8&oS⵷5j ).j:URҡxeb# ,E u?G~%O|7=hw>AIk:خj2K;*웆+XJwoo6KoF%N;f#4ŷv6zMg@, @k~.7Y<:dvז*#2LeIQc8!c_06Ki7Wm}+/K=Z3e58]pyEn<9[kWR,V%ޙo( TIx!u`TQVEm:%}ޥ?r>|3 dv$h#uyaUd̻Jr02|z H!5,jRmlKmcYytM[ ? kK ,|K9LosmM91y&1$qv eP<]·eU$|8 OiE~ jL-tmy)xYԝ߆/iH{\!1 9(r nef)5x]JK[-Ӻ)yat`ʉ"Ѹ/־%A{g :ݴ[hJG-ݲ[@kd .en$N}~)ZB:ƢX:ͱ%Gg f8[2` nx/Yk$LK(dނ6$ Og# |S.ķxrg·׏s H-"jH! Yo jvYLn}=|Fw@/ʹ ESo'orH3xmw:n=*EuYVO:ɣeC(|g<7_~2i􋒚|Py:"I!Lib*[tl `7.@Dͤ;YӴxc%_07kyl$AwsN#fҾ"EnQ#kٴ(7$A$be8]h_gmO6q^yχ.|)/#R[܏$DzO"Fi aWBwRо5xẹYtn#*ilDpr{Gݻ)muV^R𭶒'! bV8\ ԩOH,{^1k3Ldv2yq[ p5&\ukJOiigsoσ/ D./o崯XUܣXB褔eE.4y8 >x/7joz^ŦMcn)-/#E"$o.UubCY esxᯁKை+GgjVڌvWMbmtMx3y.$|x[\7vͪH|j"lyEr?2Ucؤ{ez)G x*]ƱviŤaefMdKJVPyتm>-Ʋvi!j.#G$wng왮ҵ52BnѦOحʄy%ѾVV IFIoծexmיZ]O$~㿅BlŅcA5>hlow2y5 vT-r~#uǍ Ωi{u8S#Codnc9~-P2ܨh0 _W k: -د%~~#k!4m.Q5FAkzǙ6+X!*>#}t9UVKEwI[S:wGPr4jv14%ݕ . Y:r`2k?xWকvyQx^pm-UMjbmP 0Wڅƭh'2jcg7€ -GC]4["kk/O[A3%3ȨZ1A5WWNߖOK=7fmw~xtIO7)4e C*AR9VOK'=ékZN摭Dc+aXeRNs/&<bMI_u ݽ -DFlckJϰ3&OC(2:ӕFn-4wշ-R+T4~>x lh-[@`m]q'MZ-DGIf+봗og0eJZk.*T\Ҝoۙ%5|LΣqF>W+k4՝_WIeokᯅ_~]s%ֵ"]MoĖQ5 S sob(?g\vu5 zחQ}.cNB.)8;R+_ZE{I9{Y0dBΊYH$Z~t?}6ױKNR_,-2KCݿaaQUJ\W]z[W]ir>{7[ W3N&kdR IJƹv 19?Ŀ~ZGi^ޏE"t7# F҅Rƭ~YkxNvՓuk)Q70!gP0NH$:՜Rw}.ګnp{hN?m6M;4ktmg+MߦēL88c2B`湑ix[UiO1"/p,`d$5Ф#:JȗQZ$?!9XHuIfp:ÿ;k:rkvBx*}*BWGx %bL\_TUoFMΕGydeMpຠMR>R|%o:w3v\Ž@Yd1eo)8~?~+<_ .|G/ְ<0JHIJqi;8or >VȺΨiեDK/( )zkIEFnvM5rۙY>9)Nqi)Y>de̵viŧͥxVmΥɯ$]"&H\OC d`~pIa; W&\RhEwdmE4i1$ Vu~n4imcح-?I EA´<sw->ƾ2FjO1;}(v~R1c7&e]Y滩hK3G{vW;(o.)I'—W{k{|^]AzGqaՃnުrpAQ?Fn_7i5{-H&}YǖÓpMnbE S -,+髷o8U(Nqe{+]lһ]}kײl%Y͕+,[]=5_ ꗺ6{,:]˰fId$r8ct_ΏO:ݞk3]ibմ,  Ė͂bt VZ&k[Ejךudi1 soU"2 -\~A-ϗskvf)?y%\n1-;pIdRrSƒo[?B+ a7$mwm2eW**gi +K8< kJ{/ڲƶ3͊@Y$?4@$\gs,ww"f(y `o iej5(bSEyV$o$!s.bxbg@A?26Œ.#4:ޓsT/-vPG%Y YA m.]V+M=LqӵC&s >Yy@c6p7)ݞ05^=;}a6buM5&KbAF3$g#h{V~)x#uO ^iBv6>DV>e&6[|&qE85i٬[$\1B4pcSb>Vc(` j𨬦xtJY̊c$TPٍKmNrb#Y5.j¦McNm֋3D'ze ;}~Nv J.fqC"ᗕ]իxo-,}"O څiO")w{.0km'߳wf-Oſ->&jֺf"` ŵXpIxOG M;Y vrd1ACo4d̪ şφ4_^ΣoMsbi:͢CkrJUʬ+.uO Dυ}1t`G ʢ&^8!ZA'imVk+$׹ˆVR)GV웽zZe|#㿏$Gm>\{ ?Z$ n`e6eR IݾkCh3<$1AoiWգ[mwaumek< pAT]/QJ3\nk5C ;ė:w/4рRw9r9R k.4vi}G7&ޚuZ=vg/lcm[xζJU q-R.v-2Iv״}/X}ZX9T)ZKy~bL{rFr3f8=ƧdwY}KiP9&$uyJjU4|;skm~H.56αN|> m%#h|Qo=DCag)(A SpAx|-c [K+JARFݤ${_|eDVh-^e*.#1:) yU9(׽M胳7Nmm4{;xnoa^iwӣ|m@Yxpp7:W_gψc:v>b-Ya$e\`?5}?Ω C_\]mqk +t݃W_ |FEAkq- Ss 1+DDgcƱpRpnUWo^i51i^!Ac+\Gh/"1R+Hk QKBn3 =_1]Zmn"Ӯ!nH>PN%08|)񿌼7uw_Ԭ"׵;(iHvm[ s9#z˗wۆ:# iɷZ6xcᏍM>z{yNF}VKT YpYcʔu P2i2){k:ʍgzS95vkFP1C#%"NrK@:o,nO09bN sqЅ:jQw-UO=r}OL)#ueJJ|Wo_hƅcc؈/!2<֑UV; GjF*20?(z-V;n.2떖uƘ{V#&rN>Ql<$ڴ 1rOEݐ0?W|O>tm+O-ZetUܤ q^C _dFC8y6gtf5T+߇0V<ߗf]vQ 8]IafМ0 F6=Nk<'jV>*ҢK_MkMZd0nlJ=7'.YWwlEklX8f*ŭÃn[Mh ,ʕ\NsmZsr,*ĀPˎh [,dg9֨$0bH~Q}uh۔bEP/33ج<օL#1X :z;z~p#neQ=SMb%p~Е$5&I=ifsϿ4$u64L zr՞9z 9W"cfg??¬˰`Ym^lzɅv O󡜶֛%DU|y1ܬFXi]+%L`+WAIy'Xv?,c$ܼ#'vϡ›Z0vtPB=:{u~T.-I4I~q>?DŽ"g0rQCM\k9Y@y A>:YY%&z ճ]Ŝ:߅eO Fߴg+]e3W}#"еkXo@OS@aڗKm3)]Yhz?~01jL_h#-4O\gwJ GZ7h߲ߌyᦵu="M䲃o,/$Ȥ!FkاY1X"0n=>N+kY>X.c!6\ħ0:1diʡ\ӗ44ʓլ՟3*d*fpK%F ܮw궵VwÚLz<ͲF!ge@A@5/?O"ηmcN*)#d 2L{[.o3#dM[gN`Ƿx5V/7*3ؔ|SjK_#۪9i3 #-6=9۞۽@$yi$P3.q;0IِF%3FJ6:aϞe'8$[WB=K-b݌~=VUੌ 9S\j0) 08}G 95VRraӕzG~5x⟅4Om'GCj+CzEH漊5uT/WN m̭qkprhK{~nGN=vɪ3HUfX [m 2npyeŠ>T8q$W9G 8'k[># YaE2:!#g3A 2WmQ6&_CY Xw]-j;#/ ė2yF&˂s`B<Jt !c7oso"߰wP `N3,"uxo*fߝJ 1 186 ~#ǥ״Ե2mgmַI6{# Z3*wL6 ,Vz"L-n좚Q⯘ʎHO|?>elM%͜$p ՘7|@ y $5RБdԬG+OƲFu\Z5~њvζw׺Niqun]B#!!1ލfe^)y;ӽQOca6^}F #M3]wUf!#Rg]gNe ǫhDV,ѵ l߂lwRI=IIAG!or^4k;dgubB UluJ&k$ 1`8$N @5Ts%*.>ҿ32͞W?u5t+^9ndϙ#FRYAe8j)b|?O>,A7JOY[ YDDy1:Cȼ9uD0!>"ef2-%Pyx %|^|w<][k3qGA<؈?Ȭ#P}, 9ܶvQwWvzyeViBIEJj.SE;. w{5֤l:ey$'I|4aVE ̊H8"oɥkF.^XB!eHڥ 'fx`>5~,zA9HK[wLXΠm=#I6xvo7G\P vU Ni/CpI$?٢KFJfElj=O Kڕ=oc7:ݞrŽ@f?^tKiu+dWj*ީ=y3In@N¡|3ܟ j<]pVhqVֲľo~,w"dz+NqztĞ:^e_[^Y~sFL$R]l.Xy͏K:4s +da̋"FrQ@'zދڛg7W!Ŧy6htU[@-QJ&ď~shs~V}kAEKuz{lm>x_dO*ZG,.FFx≕ec*9n|_aoRf;˂dmy r |:.x ßKz;X5_xSetkƼP߸đ۬MuM/M/<-fcy$7@C$";K>4\ֵ[譵 JupBʷVPqn]>WK{Pkk#k RKe{-߉tzvFc%Eo9Yp6/GDkϧۨ܏- F-JUYs6EյzMs)7!;FdS9A9 t '4\]㔅 &@Dj܌=Td-&~*>Ӿ$xoÍCEƫ_:N. 6IsXAswoޥHfE>~x+;:Ɓ(~o1؞gE 7IKrE7,5KmFB16y,$/ݳPO ?|ji>wZhuPMvϕlI |ey8E6hp{;+/5^ZǨi$d3ofx~uCbxcL*C #wiYV喣([{KFActӯo %E'7 c1liy|Ye jRHݠ,72XiF!9WNOe?k[w2gKqj! HPWnIbiQ\mn۽uШ'V2P[M_~>t?N>мIۙn5-Namcob];,2{XVOOv;ѭ%Gknm; WQnWhX>HVz/G SM(hׯ -[g$sp`q"JJد|Au$~Pko?H#)IbJтNxZ|pɾf74iO/u!}MWk %oxX J>UʰGf+ZJ>2`0ǁ<]3Jר<P5qel\iɨ"m,2y`+vxVzfc_Y@6y20/N:uiZr C|6׬|/j7/u/^hnЫ*̒I̜X#뿱H-axV_mӅkDIk-X/ÇVVʹcwxZMӮ/O4,万Vr,[Ĥ9?X[>b$lCvcE?{_>u}ޣ51C}o7\*.*j9:ԧ줔R|{Y>zuF|M\QRqRiZ;j^ ׼Wu_I 4SisΨr4v݄MCk{F(uSRh֋sL&U-i#'JxzN'[jfԥϵ<p|i ^ѴH㷋SkXYc J(^6y+ME(kn$IwK{up]mS@'I_zdvũǪ_c[mOd-D. $-o?~xL}st'~"g_eɹȞeF\nk˖./>F'(,xX5j>2-ڭm%21O5<"@XJA  HV|C:$WuԚ* wuw ]z'GŞ,$=`a28vvy\G m;m6oGgmu~*q}7/i=#5(ѵ&C5ӳb >a%X*=w_դ|@ݭ|; ΒڅIKfbDqF̳|0l,vpiBŖz|RKt̺!vHݝ/{~IKi1[>اgic_1$K \3dueYKF黵}MtgL:i~V]_>"ޗkmyl1C5T[|J \i4^Iծn#%.i 汻2EY s$d0'W JPtnvZ[&u}:t6SQ՘5 z_u?TIf3UW'\xۛj(ocCup.JVT2x%3ɬ=+?OԭO6F [*t(H`_4=$Nܭť8@ods<0B r jJHKh`g5 n$aqw.=-[h # i(QƵ4V(3k I΀JP˭O⧊4|J]rK'^kh1+8a oL&N0kíku:fo\ ^xP :)Qm;Q(B\l{ysb#)TWoM8/>zR_i:-YCϊ/59o"mB;Ď4qF2Á󇋼%bك AmG4 y :.Dds~:mjKSI֫ݪ݆ s&fd_'e'noxKׁ!KDRQP{.Hs e(ߋ4mNCx& wpX# ʿ)U %~L,?7D`;mHo41V ` 8,P}s_xNįZ\uA;)m`^ZN:cmʞH~M<9x7Rieu.6E$;,7?!CN@gR\gm)FJg)|Cm?Sω57O[m?Qe}2 .#JǷo?)vx-|muj趲G=yp-4 c C \>ᷧ#rӾ%ji |-}?N{.3`DmkXiwf8 6]TG;"lkҼ5oz1/i_!~,>aGeŽuWin-+XL6( 0nUִԯ&Q5ÝSìG@BH>>5<+w߲rǪA }Nk,wsѭ`V~<ƺ4UijZݴH{}n"Mdٹ2"%o_X[;[\.iRZè}嬦]r*|ԬҽM;zo^j^ݶe1i$ڟEgͭ<Ŏݵ+l!i|ۘagʂk+=P$6M*Gܐ m61O-Gk;.? ;ko狖 cC L'?~ŤkYè= n-´r LZ6wo?_KW4/mо(]j~Y5 廓LTDm.QcrS#i^ԭmZ5!,i&Kl1JbUV Rs^xľ$ۡx 嶣a"O:Zh#q a_<| ~gcq9MP)u;dV&9H#$o)X%>3蚽/hewR#^3ED\qHFbcD7 1hlts_4[j<)Q]!iY$GX )ȯ|$}Hk^>s FC+wKcqKL6j+n9dh`A󜬄dJg|ฬ.^o\jZlsYŃ/iΟZ;ho ZGo.@Y1#a;i~0X_]Xwsk5._j:uplHoW I;g W:|nk>tӦ+c ]Q>is~DW5#  1 k w:=g[/#PI KOITZ7~>:IizHMрj RPţ*k j͞躳HZ(-$)!7XKF_ޝp)=gu^mW/u "PMnE֣, rFtfG˅VOV\%K-jd$`iuVwq:_a\O0s)UpNo_9杢\3j^'PZFkg%2v%b3Z?<ڮ7> xLx'ZtռN?&A;V f70cf?|eԴ][oZ={);$q+!YH_cPӴ_ZUZm^nѬY܈cXBBq*2$o~(|jLJ|:jmusGq6 eolG_3# ylTfZڴrNury?ßDžd~4> j&9nm#+;?u3/@ 4ZcgN k= 9_n Wi⿃^1NOi幎otǧ K%%8! pFLz qVƛkvfS*/#1 *ƨr7Py=U[NIrhAErؗ,5 G΀F5;PQ\Kڕw!cӔ #ş >ѡ.iKn ZumIi$hϗөu+ğYծO^[i4ho>THЬ-Ih#6W o3oᾑ_GC'Kt[f=̷(ĀʡܙTg5O|P񕯈< y}i3YA Mp<_S#mR]:ݝ{D?BAvIe 8Ԃ4^MFUnbhu}|e>y|!s[^oț4IU>cwNϊSr\M\j"ɞv^kɹá9 1{Nx/\jWڲ_[G s*@f_.=3Qt{u Ԧ|2{wB Uݍ&m]ͳg7wE N oM[CPD?^HfGXbo5b ^)|@lN?U\MF(+y,V0vTc8CNJm|#USA9CZ3g!KAōw5^!hǶ>9-R9#Z ި-DIju|<7RT/5V(K[m^^UӌUvꝟ zO?]]g:h_z}zLlmti0L+Yx?_W!wž_ʒ3%VQUVoMw{z4iJrm._kk+|7odŭ.iQA&Cl?mǒ%V$`9KZl+ .Q-D,l1,nL_k'kx7.+e.8Oo,"Vp̤ožޡMo ksʚHI.e3ٍ7m_*c9KLެ9ct}2];z_U牼 ټ-#ZuG)M(+D dE ׼iEsiđ;W;.xܯˌn+D x ӭ5 Z; }Niyn $f쪻Qt$?>[Ŀk%iPFelōɺ{=B+F& v:,u'6:~kjqG;FM+6Oͪ.-oQKw}diJn0! ${'_Oi9bk;D.2<,sB#r#a=6=KR;tGdS6s#mV0<4e2. fEa{3%11! +nev/d\Gl w5|=qkRKk4kT71-4glĺ +ۤ]P{Ep%ri7MAt{X./0ec) Riܤ7f,Ȥx囲Ȥ 1UR$yoXb͠HHld*) 0%zduF>Zuݕ(y=~ѿ t/՗[]=*'HeKTX"6X||o×0-+þ{wt`ⴸtUWUH@۴_Jekk fz͔P, ]c JTyȲcrfu9?nx'f/p|=ԡ m^diIX&d ;ɒ3아aw_mB *O"n,.!ͬy>DpG x=W^/u_n(Aܩqyg]?&b@x7 `Ҽm05%9xD=޺n; Jvscu%p'RrI99hO3qQGO? 8u]*m+@tRj4dy,AUqS˗֚Va5Ώ"OlAV J1}9'=3_hxwσwp6zO%k{u6mCřv0d ZF`li`IUn 35Iմ?Ĵ& P~RhɐPdq<4nM,f>JFːX1X8`FAuZi>&0BG"DDܱ'J.`*5goؿO>^eHknUNS6g1F@^[5\Z܊*凌]Ijt)%8S7hٻ%vM6|c֟<^ycIpIA'$`4Qtx+ȗUs]\MΎT82Qa$+9ٷvZEwYq;6dw2nCXQN"(佰(fcx4e>f\6rxwC(.SJkhi76kc"ƘI}~dnedh~$n$qݓ^_J__S~4Z$Mx69,/x7AB#D R! ~6|,gXaM5?_˥֮H1@q+IwFveٛe0U/l'ͤ+ܣ{7K)ְSRUu%}sY%tb?ǿ? S QmGQ,gbGS̢Bw6%!:7/~8z +ewP,զ*7:…Zxj+_heuhqq(;?{<60R{X m\2ay&१{^\fje-ū,# 3o`?yЩ 9߅5Y4{Lct.y?7S|M-,G`;{"mfQ$,ITt8lW3m"!%OP8ʓ=y'R5)F.Vi2")4z- )-0ɾ җ„+nZl5k^PMžۛh1rlSyVɬ;MqF$UH, Ozᧉ'x?M."}Rk]_dj#%`mS|ծkӡЩ`u:NᛍB`l<9hV39mlB3]W]iZҳ;M},:%`*E8-qߚй> l_kY kd\}ܹ'ITWk q!>6a?" $tkRL+F6) rHH0kҮ6,:"M[>>p9 Wa" hI 2KdgE}.Te֗Ard`,F23kξX [Hdy VwQ²"p$;F?mާ4kf5EZB {cVظI;LMVO65%Hr XR18$ps&HIC< 8ǿFo4Ky[VerFEu"CGn$ЃӀO~㒪TbɍkV֒O{`E~PT??Z1bcx{kD<vUg(Xy Dyk(#gxl 99㞇ՍXf3 tcpy*yr s wvt$OA͌֯ڡ 7yziF(+'[|*i$%IGo*w \qW|)>xS]/NaH@?gQ 䪜|Y뎞Cnđ*A'zZaڌATw>~|9dvz|% 2!,A qZ(l.Ccu^iR@}ɻ:N0O4nQRHLJSD+:֗lom x!]ʣ8PAV}3Y(7L+.~d!@;[X2+džH䞹9e6i~A^u:k /lb7̻Y\K F3 rꖋڻ}<8`>QGod|/-maOcn:@sq8_%bd_7-oю70 H#?7LƴBLf7Tq٤WQNf0Bxu.^+,d\>ZLi+~t?m'Rco. uq?_0Z۷Ĩ{8!ൾTU6/|4Mr?!lp:ǩUs]õIyWe1$}xUyjQ]3C|4غ{%h ;ƊRXw8]φ෵{fv'$)")l9Wq Z|C`_{Ą  8tuQen&U[ʗf'/nw/'|c:TZfJx.)3E}9~!xS A\Ej D,$ [ M˷ uNM]إm|6cLyج@9{*o==]a{[I&ŭm"2#y<*jWSmhwZs" #2t*[%H\[ʶfc>ds$32d8澯 u߄ Vvit֏䬗 &ۑ$rE{tݿm c (VmP.]Dö7m=KVŦڔ c\E^x u<8(lP (ĨD+AwN3Դ?"RX[ѯ"_4ȭX8'9$zejdgFܨM'U{I{%S)YKl! 9('85^xZFyjYGr.mR( |ФI{(Z&ҢZ.8!h J9]kC4V=3Cx[oB}Ip/ux cV<%c Hmu_ ZxF.M7/n2#3""5~? u⇇~|?-Vo/t2Fۼ#pkO[ {]><|Bݼ}%c-U')ɣW:oNQrJN=Zl[_]1:5)RZUyeov^wK9|=>!7xDOe嵟FEEmo+7CLtly$r\C"+Ep @1ete8e1Z4t[/cZQFU SIr`:.G:p3ps4!E #^``s'M{YJOTGF8rkw%0{9u d)#{oُş IGYmncX(|vI1z ~2wb:];͆];#[G &}4đwD u#mx._G_^]^i72찛BSWբuI1o)kO­BCf5 S|ǯ_#~ڥ~y_լW7MIU H̝T.м!چIw%$kW$vy/9W):ҩ}-_99|i-/LJ+&Y`H1W/2qڵWC؂?q*&vTd}U"s2@GLM{>,ipM9)2r_^mʭSibde † Ēח6TO.MkM$zm۷X#v1&I ʨQA|R-O Zt[܁$aMÀ0P@=8o_~#+_0:y76kY%c(TRNquvv?m_>#Yn2+Ϭj1C/'Fr Q*5ZQ!Qt[+uw[x3NIA8[V炙kYw+]jؒ{M2yn%VE1d rqq^?>*QwB gl[ܜ,pP'*0a".|6o\+ťj4qZ<ׁ)2G͑" SMFhcɾ!fe $ckbkHF6צ4\gs`m'%c(2~Ԇ=e)4PZȊ$c&Dv:6dᎺ)Y$KJ+LѾ#|gԵs#O4[d.\I>I=;6.dP]=n Hd{-^~/xouxJM'P{_խѤK?,,H<}Ŀ m4xMOI[Z y͊wmptRDgѧ%}V"a %~3(aTki4 dW,͆7US2|~=? hh|6R9Ͷ=s2vUTVP][nχm'W:VX>\jvS\5cu.eT/ s^&%ڼ}?=5;LVs{X+-gFm A\$0т? k:jT7VpF5$ ߑr }kKX4+5+cm'+$ e'FpcydNy~f,A׾|–~ Oq2v'&H<_,,ȼJC5ytsDzψ}Hn̉Ga4+"kإZMN<泋ˣRkI|^2:QՖr;kI%ߊ>}k:ůO.J՗ySwZ~ >]WU- YAFY1fb"g;w.xcJG4ͤ:wZl!qkA~io M_\ JU5,$xC5i{}Q%e)צ|M9//į^?q;k\ hzrGPoCEu Cm_&7¶>"Gv€ a)!Gl#V5_< ᎩZ叉61j_j7+s{khRYk['W28ތysF_m+WIma?_ZӧBGyV1߼Ӆڧt%DUBw/Y2EȵГVH'D,AlS3|xL&m 9-9rb#G,d V8|cj9Zf?ώ^ZߤN4IϏ1V}@>^ |صy+~[e/&Ix?Qum,ɢi,^?K"rTu&Mċog|bR3s)\%D!gDKX|)[ ]8]E5ފ]qr\ZE2&_|r8?|eG~\:ob֖cZMUQfG##䓊Vr贷}_d:Qz/֖dž|/K(As4O0Ѷ4rf^a<qari:q-]ʣbCq ˹Q|p᫭'qO7Iu[Ymt٠үEݽͼȅ϶FbE$_viZ}~eky>V2BfExxkeg):WJ2EZҳO߭2yi^zu=/9j>Ï kz~qr^hy%C/Hڄ>R{uƚvAVY.;UU|* .ό>2~sxƁ}qmіAwklȏXQrႶ諙mWcԴŲڷ] vrn`+XNK]k/+t.Ek5^gh!>:x6 k,nKԼu * wBрV!xGmNŶٕ~=r9f."YVFإU5|Ka³x;DYMXizݮK3H+El[Td) }$vx{ZFKKjr_Sك$QEe 2yb;WWM=uAZxmCw\YRWHYns#tF)rܮ?߇^/oi>1v{:[ܱIěL PAH92t!Kk?ᛉnXHj\P`D  F8K]'zk9 .Cʹd41$l [yeR6׋:ДiI{{GtG?Z;ռemX[/ˬ]sd JGNjGizbkigG-7)K,TP·ukG+%߈'֞[[k[ql3g(É!/f򿈴?~>quMzAȦV)&n١&?1mT79&(W$]#_t/njWMf~7@O2FF2AV$H+i ?E<7|x-uMFՋʺȇՄmݘ Ɍ~^ Z>([ɫxz-^/"[4אL2ϐg/{b]Xk  K9P~R ]WZo|u߉I֬ gyљf/'*W $ךuM.O<]s-)B3I&m_ 7VVML`^'gO ƹ~ 6[[߽K>V{=4cb6YPdfSؤL7f Z<]"HdeuIdwV^'EYj^2jowcdcFS(*J+c+GBѾ*|{yu=F=*Q^+ɢV 6"L27eV;[ֲko>jB -ѧ?/c>DT 7XO{O`X㷆 y /2A+FU~n_оx:wVw<1M|ӫxa.,TP[ ⫓O:|=z}$ѵ=R{ `?iY$n[i9k-Pk]eh%H$Ic򶴫vӝNrI dYB-z[mۯ{Z3RrrV飺{V4x'9vkpM>S&ߘ1$ <|0//qXKk i!'#Z-[ݫ+mKI/)8" Z4L1q@T.gQZL2xK_E M|^XsƩlm-3\~Zɴ }FQ:zxVhu +`#"?s2%ڻ85]CF|VWn5v]JO:9*huwAm13cdQk z5Z\.xXOwz[I|H?5nݷg|uA,7W]klym6Y#W 7 SWʴmݗz8Nj<ˣO_&vge }㯃 k O㖍m/ 妕{|uIl^Kp" zF#ӯ|x? IK—w:kXQH o㟈Giymi$pbib|``̀y*eYK.4ڟnXPGs Hi,'i(ѤmzW~Umۧ[!|Gm|el5VXv ::+%;dqBHݫ~AM7VcxOӆ4Ie2VWi'\ JG^,dz4件{u"ܑY"ݐedg?x+=ρւ^1m?[() y!ܪ>Bť읭{>k#NJ,xG_~ wO5K;I}LdKB +-e+ |Nj%ƞ~::ņ1SB-Ŭ+ZX^Hpbr/?hW-Ehu$MOPUB/ou-M6 r`<%9|M5|TELJug4k%T2K0Ir͂ʹ@a]_}nWEuݭT_߀^ ^.,la/umk2w,ZX x!W{ƺޫ/ cĺ-mo?-Keݴ0w ywT|}ö~%Z+}MZl-hUơ,FO x{]4}iO]yˤj^!@AR;2kInm^ƫZ *úƗml%I)p+da:-ĨοT\O}BW7ȴK+㱴KBMYQ-̻\)+|- ;Oλ-'B4/K9,Ն/ $xgn0Ӽk+MSX  Tc 1⏄|OJmY$v3BfЙ 7eK-Yxp,Ɲ9>]iiGEWf2h%\"́\]@Il6*ܨ=WM\dV]L<(d#8 >7ON6^&$}CWBI b)%c7+0dRA_s͡|HƭY5 WU#ӂj|i_鵟vO/4 6FQmK8'/f@.-;IeMڇɵt(od UJ_k\x>0OӭStf[QаA+I8$k?tgdӒ}";7Iġܭ4dIHDR綥vZkfտ;v^qbg+.PA`kdH R[GtxAlukK=ڥlF|Ś#d^s33OA~iaZgfִUSFmtNyJnFzׁ|qi.|GM隽[*35դ]2#BA oIդr}6vZ~GZ*_xMOR;x{m'ʻΙkoqhDrC5G}/x8 R[|M֬o~$Kce͜R9*@`v^k)^qiu {]:+2}+9 %VmNvkƟjZ׉|OimqhrַkUyvGE9dAQ]>kFs~,>, 麵ޕᦊMiZXtnH,h|oaQ?Pn{JCs5sI,vrD \| *mݮ֗],%}ϣO?|aqW➍jiyFGvEUYrK_|hÚAv4i㙃ZO ge'?H-EŬQ^ X2kMq|#>1x[Y UN=ue%ρK}rVKK]9bBH}yIfq#FrBפiI]OĭNP[[j~լo/4ltqr(a%:};D/֢m1(H-wFW%]Q3 ^!/t˫#6d2$֊ Wi{5I" fu߿oRmIX/g~!la6iX_Z-]MɸkmX!nMڇ 'C>a4Q"ڦmRۜ?,Bcw @wW~&|uŗ1G'QϦEI =/Zý'-Kk[S/g歬}DXI '[͡]| 0xHέj#ںzM4h.K NT`rooTuEFY3ϤYB.آ)nHtA^Ï-*nV~:kƑ_hrjq1~+Ww{%K쏉1e˿},E8-Dym &v;NO?Bju_jz,:|=SOEݶeKiEe˰0g-7T?h-z;_kFk`tU*m`el?Wx45oxC–ikI//l+ڙg;T RIǕh-o~Yql_xQ+_xZ!i#XY!n+oeU <~|b>$Z4)Wo6]rbְ-SDIݺF5L!$~d|Hd:woa w6:sneӉHQo7c1ռ-%ø/X[Gyoi XwZ[hȒ)+##1U\|վL"qz1b {Kt.JyZX}3w-nN/Җt3xJwdqن˚|oF713gw}_:DRW;65U`w6ƌKZ|=\N~5o04IQ^9.c7 sqwo5U7Ue!o$gy9ʵ77YyѴ+Ȯͬb-Rk΍cT_嫟k[2xPҵ(g,3B KWcn*2I$|!xOlCLnl$1oa$8sY>15χ~=ǚ..sh-&H[ss2.dq?T)er.fNJG4k\Zݴ3v>vSo6劫+ګ!sЂyNuկ+5u] }:k,>mƔg7I! HIJb8$c<~Xwvo%q#iJ.F0~gY=WKIh?RɖKMF[w1@#11^$]PB{ińs)>n#m6mp4iJjV739%%t+p+jSiWG;Kcb3^Mk:ƽ2\#u2<",X4 L\jwW3ŻJġDɿvݪ f~1F,^4 H!M q́D+t˰~$-or;{,LGoޱ,2/|&լ|ICL" [ZYbЛVIēJ3X hmp|e E[q۰a[I3i7ˤܧHh<6ʡCT3 3t^im52^\BֳZ\dvT$6O^4\=Ƌ$\b rd,.%Xd#p=+LO>隟(9Rxk^i{v2 ˂kn[h\}P]1e6j,Lrd>LFIOk?*tyefꖚ/OZxALxdE,1a?5d!Kƨh֯vړZkgI,&_/Cن1ӂb05!䕷MgwV+ CNGI&_]R V { /%eE0ŲP*(_e3!/1/>E^.ӡDu/"IvQmDޭE Y{ ZxzNoZgK/ME=Fͬ$4m$PVjFpv{__;4ӽIN5cZZqj(^28dOtpԵ׷X,Lc1JJ\1 )QЃ\͢M> Ĭ$y*H*qz$K+k;fCjy( W߉:/wUCC&>dv:c{T%crEyRs<}~\kkַq˗deWB?:#+KmD7ɲx:SrldnhB{y`MJ E$_,HHЊ]6(ef8eF *x4mnu8s]vkV}YSY6ڬGr wWS=ւRɶ5HiǹÕBjidKwq TUB#bF$dXmeCy*eyة9ll.vASR揺&_:>5~͟4_ }OO7 `553*@IJ}Z㯆?l?S ωԬ%'N[)c.a+ zXsMއƜv"gnx 9P#q;G=FjjTSD֤][o%G\;7s`s;OڟG/5`/HomMź+ WV#JK{5Ck-dܱL'vvH W^ɧjZP$du~z#8+gCiڔRi# ~\.$x+9^h(T8=f>0GЭ|Cj^e Rl%]q1D86]n!9LOzl5k#P{)hщFll`sF#X)g93eL}rm%9,3ys0ʊY#Uăh. idy׼M3&<WųxYxV;va`hʎGt F³ ɯ ծ >YՌFB0 #3.@aҾ/N񡮙i{/ئeaBǚY5~ŏ#>߇nx^i$OJ[۸50uq_I;ݫ7vVzŧ Y.|G>7ox[ץ2>`ʸn♌AHQ@&dY5ڵ'{0ej QIe)\H$g9zT*tY1RٌM0zjkQ]ͧwQ^Xd,;U$k_ew0qٱt$1$rP/"ǗL/Q}]xj&\yRD[@APNܒsoLwzQ5?flܓx nxSwZUZH-݆4I: 46cd$mh*6NU9kvsɌ@l'n_].eIY u9l#;HN6'BaNW|VMմ<- YNee鮽oknϙUO'7ب g;HQnWY.KkaGpҢItmǖPI*NϽxWHג[D4x(D!1{XDamJ`pIrxCմB 3azd<*]wpGMrqmXaЯıDh ܳFm8 WNь^q%۾e8\`?Zֲ1q 7`r9&r3 n~z¬%ǡxgQ4y5觹OqZ:?u|6^}^P&89C7}ԿkK0pq]4 V? 38pv2U{8iG/+JH$V1.<8־ܛvN*R8Bw1}v?exBZ5< {7jD>NFϦO0,r8:ڋSEJ 2lwʖ+З~~}ujl4"Sߝy#c\0P03ԁ~}m/@ C~.ײȠ1 [^;gZW6C0`LnfGO=L*vnݽ x_ I\v@C_<]q px`dv:/oXZ8NzY_d҈5pJA*3!m^t5Zֳ(Tl `.O}Fx=7W7|Jѵ &XMGO kܒ n'}] ^2pNmlNf n25iG(I[|׷9kɴ ,Y>4:UH8 AYg9cVcM 6+w^3涼;k캸#FVYXnPzsj3-Z;c0rA 0G 1=k5ʉ]j ͖hPY`c`nn ƅ3$n=J 5Յ˺Ǎ͔eXe{z+ZLE[V~ dc~Oԫ+9$tKSc≤BèF3 [iq\u wcAì9O|jUdRLViv6#^**z'u߿ɳ%ڶػڕiJqx$ ,W>`|~~Zwg졬/֖#qeۘˮ[Xedpī+ȳ6qYȘ67 {s݇j롻o%_7,R{q=)ڪ~~PnjׯfUMҏ:K5}N\~in멯x^WG=Α-èb;=v1$kD3#b Bdɷpu{㟥>~8~ភYYD 1 q^ԾSoซSkk/ (z.Q+g7m{L)RJ4-,N:4d~cv~ {WAoPWnZĦ[En&R'n:;?Ƨ +2Iy2XT#n bN0H=؟Jd|͌FWp\'oSm曧zimnIFv^0 8QOv#u_V}nmH]\M"p!wԖw߱ '? 綴X|Ag)*>@TSNQb]^I,F)aɑ` [`QYҍ6i'7ҾN6!Sk.MO[YbzfYJ 8=I+ӵ0jV@$wH cNkW D~%|[O/ټIf> :x ֧6蝭{'fJ{ٝO]+;iK[itI"g3%ݼbe9q/'wah6RI,Z嶊H[u]pp2MG×3w3.TYcݒ #r@XkқÒ lq.p̥c% I,Hp$dWɩOXez3٧M?y4N-UXG"3~&7&W;pA$=NRֵI]k8b2Bv@ * S3V5uqkgs1Y-bAһ߄_ $|M>Ae-skHY< $ nM\EJܴm$M˲B^nѾvV𿈠oI&UW|3Z?xKI0 t'?/N-cSK?컈 q,S.Wmg*F\j wo5)UĀW HHx}6]>{Mƥvnrp⦜SВm{R_]i6$2hN$Pxw!I A ⽇+k/2+Ojf9b;Ls͒%؄!'j>jxW ߽mcv}Te%kf5hYKIU VI]O#y@!Y@`WQ_iv4 `Vkhd[{6BPL 0 .~&-FC5X(RHJܱo0GBlibgjitwlyT 7Cw>P399y=i6qM}UHg yafYv91r2IG$) ;%2*>\`i>)X`ugZ88dhT Xm #9E6Imɾ DR ,ᕻ2I("ft'ƾ95 [M^fg',;X&L*k7+\:VK ջnѿ% S\ >V62Ewh#vd639+,~xƾu"-<_Ne\8y#y5S0G#)x8^US㎏>%˯Z}^ME-.bIu8]Zk٨|fa{K~oYeh, 0?)ַQiyƖH#% 9 8ƽW۽GVWIWImG V5UUU/j7iGT/_fx::,H=wo$蚱0X{:ri'ʭTyVݟ?^0Oq;xWvvïk&ATd1]\kSYK%ӻI Q1BerCFݹ'5')-~(B-9!|v ʣ+7?|4׭56נYԮlc[i[Y6'؎G:q^+.vZv=uum?C vfD6uEڊ=@5։ay9f]AQ١U5C4\CvQ|^_~Tztv1cO.o b4+e`D[v ݌t3o7LNԍWͥ)tfH|CC2sG1O-i5USi[ڪV%vPX$bꗋO;Khnn%Um"\̐\} 9Z75Qu&K5r@︳*h "e2e Ҵ/|ѴִZ?ftQM{@14R@d|ZO:օ zn49[- Is.X*^22er׾~֡'ZGk,CkwlYvd2N _]ݗgvGVvw؋?^|kdt7zs3 KB{dkbHZ&SxDY~>a ݙ A$(Vr.vMcLQӭ-gSTłng?Bi?<+x}Q7'Jy$֒!^Q Qѥi;ݴV'ьwmw>z🌡,t RСkek>Dw[{ca}3]w_^$7- [EHf23#}jS/&:iڶii[$76vZZD3m1(Fv$ďKj]jrhդ4m˫@ry-&ݭg't Pxw[« Q{;6*T08iͯ~? %It[vӥd$f< ]e+DŽn~QMFhexX.(yoi2nx;wW?0b+s//}CriREiiw`k ͌Ht뙣ąTrQ#"1t2uNL߆i=.!K;v7^F1$sTW m<^\ >8ԯKxJVKH0gFx:Nj&RkSqq^Q3CFܱy@!k<)x,@hwbqYAu)Z_1勒Z_߹%7/ZxcD&x~ ҵYӵ8-NAULM G2 /޹$t4W]Nc eH_JW`6#)#iǭ\^g|5s`Tu61IM;E Q2ښ^xJU[ݳ#wSDYίZ*&ֲvvs;E_g!{+CWu e-,jI !-''x'V5mpg% {_;7,6!}֧|&nX=Nzl˒?6O*{9pb5nONֵoM<# ^AkM8{R Cmk{y6 <&Y>m8ʐn.%v>N9w: !IxúޟZXk `y ˒r<m?to4j_5- "jS[)ce,Y?~h񵑼zcu>oif{y$LVo9a]B[W¯|s=BwIyBd;H)b;zuN&wWJ/\ӊ:h^?9-JV{M6HvF.f>XxcE-%H =|=?KghMO ٛ;Av(܍l:!ǥ|wm?p=Y\Z["H˙tcgpF6 ]nSAhn5KH]Nx n6P W5Nw$޷nQ#n>!׵{vuF ^kF#YfV$nx­GdX R#ax.`ԣ#/,Ʉ-u'Ōy1dYq˚4IY;_J+d;v/u/SM]ƶjϘjffUT><žw5ekk/mtyK㿻ڪcK&m 6FW$.T:Go>6D&潂}RaVH&+w<[[H#>Oᝤ)#Đ3B5*Uզ;}Bo g .*r]R~쯭m-OxJ,5&Οqkހ-kR\JT /ٔ}E|;_Ty/^hm՛]C"1EA:9#!o:?V}sAo=םvS%Gx +⯈|?iVTv WIo&Dpȳ$% Hel=:=w/Wϖ|[zOόV7]BNw? &Ib#'nAz"|Ez~jx|GM{x aX7ٜyeW|oMQ/{{6ZslůY| *nM7Aċ/kS|&z|GYZ`81]0[ʳ7Driv}{tvIa[#'}[[i66Zi͝b&k.!aEy㿈^|=kyL`%U2`/Qy6! ] TnK׵Nsoݷu5;[ÿEb |KስaeDSHEgqo, 8"zQn,W(Ev]*Kj]2IT#*~|q[Ɠڨ=ί6Vg$Pmf8Oe>-n|OZj4hR9mBd%GWp3JWꄝSk6k|qng0XLS`5*U$T(c׈/4ߍ<1}ÚgsǷ%qVmo|AY|!m|3aas2)ym}UB%}˱|Z߳?z֯Kھk\/؉gذ(/cR_$&1殽?o佔պ揝hh_n5ZE:qhosdq4y+q;;px_^4-/AA5Oky IR'C$ _+Xc-a|^iĄ[};BӘ^ٽO$y䐾f0>[Z㡬Z]Ķ~TB'r$WxBۙPjV:[׳Mu\2Zj#~^־S_OIدm>Ino-n<"E!FnHE5SÞ;G|:tk`Dә,a4h2²,|_? xW|[ljSh<w7xeu*x kwDk g<\ OSgEv2^Ixݷ&2|D ;jPW~O? -'GҵE>o _ah žh 2 ZF,ևpZF<^^[g# 8I$X9;E9"װ= Rԭ2K*F5̛ KB~\OGeqy5-&[MBs^ n,|+h .q y H⻹];W_k&}xW?o h^)-Bt{sqh‡{fVy0Y@esMeCPuBF﵎̆PF1р ]C?4B Ѻ alH^<,^:!n$ҢKh@ſf_H;]IyZ?x%Zͧtjʱ6|^ln|*~M'gv]=*iBk$&VɇB{;ˠHc=42gMWFq x?/l[DcѠ)/uwI\+e 2YYnj<XYVvFƴJ%Mv{tն!h˃S˘$Uk/uX{};Yu6hT+tskk^z?.v|4#Y B-VXt,$F6/Hෘ򗀵]fw[M {x &ګs|}CZge~ͧnŞ +t",ȩ0~?j>cxMEZ3Ot[]JoUcVXM𵼑Ioj*6.s{>85˟x[MYjl 6x." Nƍ /8 \wO^h~=Q>hxEҤԌq[̐yi"bx%Y2Ł pYaFZmvVWVM尿z5ME]GogrX:z{J&eE2^ $U, ᆡg ]?qןكSIkap`# b,Nbi~"ƞ"\j^k8Q$a ?oe4R1y5kq_F{}"ckG-Ɇ8'*Q|M %nm*Ȓu+FP `qgml4bVmnnhtP#Hge*3%>Z}ŨogsS%֝[YY7.HM8ԯ4MWJ յvSK&W'A&6Qn P౴I]6Vz-$ci~k6 [o5;$vz ΎEוo,\KrhP'Az><3iUw9q6 AqhC!h[Z m5 o\:rܾX̲PL9S xxŸu|FxxP erA),<ª @:{hi$IB\Ni~Mg!V}BU{M;ɶs'Ī{6gEԵNnZ鼹K, bcD+'P~ g~"hZSլt ot6IWN I"Z*GV%8kM1a$)LrtvrZ~FԎ_SΧ :mYn5xRE-ޯ K+f]ȧ'#3^(t=o6[ ΒMq"B7)|I;66X-|%4?]J6刑@ 0'H/>0OxX|M%x:-t!&yd ;x%T쯥[${u?6ƾ1ŗ:~'fUNZKkhEFP*iND⮚VjKxMiSfӊכTqֵ}s:(Iu a.AFp숷,N06]Wí*:d_i$wJn>o%yvhZQ( AFnF77u+[sSAn%mIq$ј?&Ǿ'~+G:<+ sǤxoV}H̶3<<V63~E]_Зw6w.Íx7z_Э,Dbwk*\yn90b* A|35/G&ʆ|LjJD3[hz-?3GSM6m:ݞN[Ԣ.苳yEECs֖7(k/ԵΏwrs 0c}0]E^!Ƌ6% -kkNhif.T,`6텩D,i?׭,u6RPN!7tJDlT0QQR 򽔝'T`S?nމ^4җ6'=>ѵ;s&E_1U2H73dj!_:ƥ&mjVO׺KdI-:)xU5D/g⣩wӯ? {/Ztff/Tެ;f[bwOFEKyZBG" ]?i: 9lcIG\Ogŏ+׀<1xgEe5Ie4Svp0˫qgŤ+a=gq},7vRJZ_?AƲxBJ+qcuO,wnBõc`@9+xǏݒC)P{rD7qt;YY$F'[R패#šې )9~P# ?v]ֳ[aQZon"E{[D%^O-_\ѣ~1֑jFQZ] 6Wtf"k-竷7Lih7տi[\:>9O4`KudF46BK6R[h[3znι{]^j^wiY;]o)q+ -'FO5i <̠-d;" 6XQ&F`79*ym#5lr4ZQ`I!v2go%rr:7$]ex_VtlZ}h-.s#I{T2tE]%Xdk+zT["O685 D7Dgbo )wE[#+ѵ{/P;}dV7Ἡ7*tuV[ds\`c//Z|;i[ږ~bo1sYqusi#d)w ?:W݌}ߩ)38+9^MwoO;JCgXkϦ|P Y8>3\Mql+mnRfe@$p6:A0X5١6FXni%ى%vA 1ԃk隭c \,m7GFXp̨rā¶9"_XuOV^[;" "]isoojQ|sg ުJl; )[ˑr ,~7gMŸH-OohWOsjqyTҘmE|v:F%] oFڟ!uE\Ia1frИio9'*b$_Yㄼ/+|Z%}ݒZ[m-OMSCKq5HW1sVNXg:v8ni2ּ7mBPyDַ ܎`R7ۏ9x0s =FkY_vR˗P ~YGm~ɬ#0#X$G,6Xkp RZSq\_.6}5#8ϙM'W2RQjI梁M@բNK[+vfdi `1U=0@_x?Ŀ:w[h< R{ws_0(6|g\MoFwe(c0c9m {|O\U$]],XpT+rWj`ևx㟉7τ^$B4"u]"25+hGibP[qv!vswvݘG<1%3ɠceq0f\LbW* 2S\Z+İZEl= )i_m ~R%p7ޡpdԬ5K[xy6B#zu+Tۦx˾f [Jtٵ1Aya4 mm5|gXE`}goڏ"kwXI>[y^=hHJ*\mY+ *Q|excXp"dO j<$&cTЕCMvd{y%3G] b3.fInWOPqΣJJ Yy??F^˹MFi5U5E}/O?&4oi? u:k ݍ ^B>]ȯ"??`Ƭ`GJm՞ 6ܱ8<6㸮ҧx3[0 :n$Q]ȹՔAG;Vn6Q6h;d.'R@ÃTo.{yěG͆r>el#=q_SON?f:h>$τaQi!trN;Β_Ϩin^ \>en A"'_tk)5fd4Ѳ00`O1GsdcܸY~Vq\5 W>0yށWiH'#Wix{D<;i:Hk'P̯nA0'8$ٱʤW)$؉eUI]jrNF:9sC4c c{4:S{rY͵wrA y&]6 E#1ȸ\?0>9#a vr[=GA_~O?ߍ~ |+:WS~]$&'lY "Jg+;υ˫KY٧XGM庁 H'z8ihINR+Uz)T]Y;+o7im4)3*y !܂~=;I |% `>|㊹/kER1' @ǭvV8;sj֒!S82I!AMcsF̥K6v~?u]!50ԕ@vG?&OTF/[n(lhc-/v p 3g$޽7uiZж$V+Hu"˞qG\E}JX~U><ҙ }zpQq>X,)BlnN0s_J-.sd1#eE~(^>c &V9"<]]cn|1 Yo!d8n_>꼖p>䴿oaNUA?y+-RZoÒsnw+Aq$|Vꃮp=}[X[il.ᵊb4`+ԓx5"8d]@\ ;V8T>Z3]o].Κ.n7lEu;}d2sۦOAKy-|ٖHH>bˌ7pchqc(bUU9[e(*Y>S|>ӥtcG{h5!Si6ぞj2558)d'kbp'-wS[k+O[| 11 pkiuC2=>JX:4Ҟi{t}Jzrg(㷗c~CPބm$8VLE%Ԓ%W%B88q'օ/eN/|Wz|sպϛY NL6䪐H=?ƯGrY0Űw.W#Us2u.V\j /@GXG\Q ^:[ØT HWn2>\u; M" yɞPI+( PX195xlx~I{x}ݕh2<.>[(&'l"+=:^^W=UadOX2 df{@qzީ}3+<M>cd茙 `כ0gFs*M#ݍ ^ 0JV_>0dRq9U %rZl{y$VhIޡrBm\iex\}'?iQm pNKd`4Tj6ys/L AjWQ ۗ 9, 9ipq׌D əOkXyK R2a~s,,/KORi<;,\$9QvWSw{xPHN䐠 Gdyg U('2P8;sY2jϨ%:eN a$p88 I7,|ZR|m~*xwº8MK`?K8fH&Y|;)Vr~7۟ _oA8hdpEїbk,\u4> aӬy ~feO'W N5*COGVbpjT9%m׳.cO(?J=#];I) 4˻r/ll$5;%Uxz ->u7:Fxi Kk)2eHw`y=CƓ5})k"J`Vc3GKmcš.CbMhGk ^-cR դX`#BM+핯<\VTmALKg$hK`f aQM@Ѵ:5n-o%܏r1FN$r1ǖj\!fp[LpJ 'l~mhMιVs3v^6fRH Q2BU$FNWַvMI81qR'/u_Nk|R񕏁k[l~xl4/45VA"B2IvF>Gx6%5 B]FD{]GK$ۗAM}f??l?:A,%+KamE-Dr2y$gR<;XGdl :m ,Ryԯ+mRV^<  >0ISջ+wvwzf6ccpL: ;ܿ'Wi0HpVK8ʸ!ލՙI۽qjV54[{v,ԩ*Xۃk6e0ƗmKc m̪jZ,< 6yv=R9&&lBPL OMxVoPq(>.I!ɍPCOB|IhzE-Xʨg0 d\yde(з->\yi.m}OX8^|A?HG <+t)*V\13K>3G{ƭK#Y܍MLT2u BS w_o{ۛ$̍0t A ʊsOCx<;I|#S_Fl״gmP:S4`-u,秉i[7>2ѯd|5gZv.}r3JēBrs0pʤF5"Mf׏fnoJ/ ( Wx[x?ڐw2kZq4$;.IB5|)#F~ǫ`î%mI9ffFdURqK~?ë~ֈ󻷹GA0SK"M/lV"@vz>&x6? tgPզ5; ;Y!,ZE`N88F9fu>3Ю&q=BLmdxQU\# ɻ|N-ƅw+vi$]ԐTn_.P0nz1庒SI6IoeHXdZe(rr2W'ѵ\:m}ŽKwg$W]J9"I^sxO{䵼1\oYDo*$E8r'Qυ<]7K[?ZOfO^Y*#*%H zVvz_C' xGJOR;zU4it_=H1# I`]oĺ| S sV%eo,ty#Y͛ VMJw=SO_| g_S׵&e5L1qK!,kx#i\| /h=K}bcM,X#$(6;&rH4yBf\JRW 懽t<)Nxٵ%ӟ+)8m{ğ+Wߏ|7{sm=iVP^H.b[ pIZf4=nk i6ڎiڴ4,xZ A79Wu/kz_ıLë^-ъۣ3v#߈㯌:wnRkh|1x-HWU]_=-cOAn mv0vyφtwҼ0K&!a0yB0:? /E El9TKUTWGuWzaZ=[2%I7?$+|I  1WŞHYd$uSDv%ɫ>XuI}-qKW9袽2*{_kYE{ u j[2m#9yP3X)]t]0C%hճާsx>+7BI6DzKI|Ys1OO[ ㌁(oHW7'^wtIl6>\W >: `a@߀I gau#;BWˑ$+FW7_Rq5UtG4J꺟hZ~x'h|mixCR4dg׾x}k;5sEwa 6ئ<3@񬑃kg -{RX4 [O1vOm;YW|K ? u[YL^Flc@$xA rnM.e)]M,n90yϠ~# /?/MZEycpm'mZc#"$sDp+uRS +j0GZujOiunYP`l,5};YûӮ]i)h.mȒ[@(&62 S~>[-ƻ$yQ_2Be)҅wv,׺dbIU#f_.Xơ6*( 6+O>1{O$Ǐi> u xwkӵ&f^XG1ޅ$aYY7ʁ:<=8i:7 g%t{r jV4bI`)ox|jΏqiixǖ1*[4 c ܮ $ r_*#Z.7ᡭ!ƾ5.-vťվB y ) C)=ְ:$-LfcѮU^-60"hew<7ŚW\қ=CV['dΖ2RٳeC[s'=C~<W[ ̱HOpتW'r62*-MXuQX4k9D,%$)1vmr+}j>3Xj.iMLj#̐ o{lf;>Xn ? zik3s/."X$2O2f4mosW,Yk6wLgKΖ`XkhEmR&1B XnGtjmcyZ5dQW`~|#W7=^5ďޕl[}'rI`prpvVwlYTK->+itgs4\9t(LF~Kv-|%֥j|_tO4D"\B 33|Cכ||aYGUYLG[P ōi "-R %-<5UL]ZY b&ϙ`H_&[uNL#,A*U95d nMS;mb!xmQMMJ]2SS,v,owQuHΊ7e{I-3Zf^cY o),TvGW !5M m;0HmgρTdrN2,vIwWObl;đL|2#0U\Waa^JnVו;[m_Cxd &乊ki9 庰ޮF#!J7~r-\Gl 2D G0t ۛ" WM{k-sIЭMgVoUxų$N.׌dKiun-kOo>q 2hZ([vv2~gZnI~ٽlߩ̷?~ {i#j7#J"l MŅ}zolgD.[p4+}24@QyɈ $0R~QiSy{?Z %=*:"m=wi%|V d`UN.4mczZiF8R-2LYxAF4`8Y n4/FV(Ҽ3'U\ԭ-ZK8-Nm@Uke`Ţfhvqsş_~'j\6!tb{yq07E@ed#8 pNvVUݚMﮫQTkMbxsঝ__j𵱵RWwDI<oC!;AKnu};\ѯ5? hW%3-HNe~ƌfm k.L&k!H3cp}o_|>~MNVUqV=E0,<ϑe?V7(JwZuڭX6q׾>_mX\갔Tͤ ao{a<`ʟgſZ;Mč+EpӭŴqoD%11JR=⮩c F{I;G4KSGy ,Pu%&mǘ^<ޓiN6<6b%i"|rZ5X,`5Вuq\߈߳w|GfO*5tI}K:u1y; hyH̏_E?r_~ j#MbK5 t(pH DR;m|0uKGڞ.C3M2PnP~%xkě=1li 5fUho iI7mtۃ!mpĺV֚XɪJi IxS "\0'Kg.E" Q${$>I .zjFwmsQ'e_|ӿi?7m5 f (m@`@ΥJ$cTGeki<7MR҅smkd&+"={7 /x]m=f\j7v0Oo1$+sG@T6]Gڡg&{_)^ g#e2:H+IP9Ӧ_{ǎNVLӚ[Dyylѣ<ŚE B9 `dB/_6:M>R]G,)]˼jύ>Hǃ^Mo \+n#+*Pd8vtR$WowtMs[|;G䱛CY{ 6fѥAۑU{'k1>{ gUmSfpWq̃n>p R+/L|+EԺkngA#-fyR,c :V~"xZ4OiwPկVKo5[hs'.ciPEMMoԯ<5S%$U6PR֝z={'nltOͭΏiI6I`$kxU|8Ѯ2+ꏇ>(C­zwOjxu#I!9h8SDUri?m @ζ.DGn sa'$T6{$ڋ0xl^IByDӒ6C廣VSnSz沽}Ohϊ%ѭyY!ImYNX;[UyX{yCu`c|dBH`s?~42@o|omx'H<;em,Y#G$#O#.ф|*sVi]k-:iKݯm)O&sѧ-T #YFM֭%XṂ^AWFUܚUՅؑ$EMU*B|!^ώ,.tY"6l+y #`THZ]= {|ҵ]qo(PMt$R8|Hs4 ʕ-9|>]54xFl0I jڜ %`fS%,u<Ғ53Wo2Kr +,_1JF!<{O:4 i:7<7$Z471vR^,.2W!U3vmܪ[?1>>x+N<akGOd?DCHeE[D]Di)ؒPOȲZ\iI#@SPKN[Zऌ >_fw!F0ۙ?6{%QGӝG%v]e}ǷZ/VӼ3|Jk.eO*ow:KRfGl3GI~%`L@8 1S$|V_ , ^%yo%d Te@߂(sr/~~/ |c-kZĭoNdm:i"l7&a崑m!*>?ǟ>{gtM ^_q_]J#yDdyYr(l+ ׇ+[jW>L2}b5nudkVWk|co?g?|N캍􊈯%кRBUgFNߞ x3]]Zjviq""03ādF+p eZIk6V>l!3[iȥ6G]v,1M"7mm/t_ʆY^064TU;F o.˞VwvPӠCTռc[4W+11&11²m !'}G?w9~ckw?@T|M"(ۈdR a^k 0ohm6hVyDEex䌀+= ^Kwxmnrۑ"啎f{O_O>,(a(mnpQϓU>0i^_ =YcK2TȎMQkφw%XoXbּbZ>Wkq$[I$C.Ptap^ҝJVqӢzik#?iJ$=fմ{ﭴkF5K.Vsq7lut2ֶ7g(_.0:(o]yo5!8*T`,l3iR$O7 riY0J$@So~_'"I 'R߹"O4ުCB  U1N˻n˻ѾB҄,"I-_ShjmutRv$@,< o$qoY@9nRjeR1o>}goKmA~ע?WR aT"*17Z|AZ/̳YXY\I#8 N c/w\RXk4MKiu宠=^ 6YH fym$%F~[/tnK in.mV;.G͍% 7[ſ5Ю%lW\LI ۅIt$bPɂF7dהZ4;93ȓSH d%pyM}urJSKU}u]mm{4Z ٺi~GoH0Af܌ Rz0)kJ"XQU-ʄ H͆AT|%baǾZKmrW]ʦa)@-?}k73_O4ۅI+,e{71$P3dyӍZNq{=}_2'_/[V'ӭ %fn V 79`\:?A[6I" @\UԴƑo!We9+7d9cOC4mKY p%Xs 0"I`R2D99vP*OQ=ۿ[uݙCJF5dI$- ";=pj:kP5enrFcF\T^uMvk*{4Da$!e3@%ZJ()Zό>+k#{R߈rDn;X$f=2]&DzfTj<<J *Ȼ7]XSW;! ^j6/u-4o4С-TܻF ˃ep#8̾#4~ BoiBD%&Ҷ1|87?hZōSIЮV //n:Оb?,}/O?{_ű/ KC=k Id+`dT\1}Ń`yen|him6i6oi}sأOiN2j>վ;:>vķ*%1^Z$QU īW燉o,u CsDu+f$GE[ihH#SRbմ&G%mDʸr@^Og?ë#JSvGI*C#+vy{ 'reZ.fmYnVK줻s%)PZjH{vm&-c>̾4Ե]?G<%j֏ox2Yj QՕ$4Q|t[Kƻ,qȑ>@ mU;?](BSkޖ?lhNyVE'ulZ(n3bM4{SwOҋnZw&Ԟ7g%1֟k-)REcom~ʩ>_%K~H+sOx5{=jT+;H;Ith*#L ̺#eh#1“Xa<+)X"e*]ĩUyO#XU'Qݻja*oX ֭j ׅ?<hoY"s Wto [uvҰ ۽'9_]i4,]R91giq:wHD= "##C+1Ҫ*p޺Oa*SZڶ>t0nu{4ד]KwCk eIe{:Ҷ<kpi۫ f2FnqZZ3Iծl[c=ɌnW3kfLAU<@{~Uӌbj_[_a+0•<үM_Y-:Gun7u(?ŎUvi^TWON J].rO `sOҴl"3,_9LqS_Z>m&nc1zbG?t>G#]ȉ\Y1ºsհN+0TԫF3~gyJ0ns fUXo\A0s=3PO&a Bm' >Dާ09K6'ϋ_<+<ˣo%vǘhY^ ~ЂNAOFms,g*#T #0@$~5AuxI{8PD}C0ng9}g\.8^ڨeuto3M.xAb1XwC [6׽f볋׽տkľOֵXO&ٚh&HV\V21Hc$ *ʰ 9\7^|/[\XD[Kmy<|.FgjO&Z;X푶HHBw*=jue8hKGJ[+'b ' lWiBӭQ;茒@!d# t2P" sɓz#W[jg'~n6N3In6y! *X +Z՝_jBK%DD 3JB Fԗw eRD3O nr3=pkCh;U^On'A 5?FDP`Fw:Wn>\^2ߍ]qNJeYJHUD{eO+Ӕ_67b)]w]^id/$g2\35}j I[Ύ9 dBOl0~Sm_s~(Ѽ-VچwŞ|_2ѝa2Nv6 v[O$,)MȬ PQ'OS[AP>k} *R*NEg1uWUn#GC*lڈde zS%~!KYcGC<{1u򊟛h9r+2u Y2)Wv H/L+9ik߳d_IuH[Fbpiy>RIM֟+כ茫ԕ8'sjzo-N+*|3^xj2jZV.bXdG Kdd8Bv`;°M{{ ^Ԩһo3,AFV-)e˞L}fh,9P($nn;|*獼׈<k k˩yMWXȋ̈/kfձJt)%n;iz=\,U\¥II˥Zfwhp>GMGh[D4jZnc2b~3R9Z宧ȶ[ȒA=*qtrp uסxDa5Oo";-ݲ01Jtc@fH\5촿u] > :irKkYx8H a؊Vz*ECJI-~vDŚ棨hT56jSL併\]¥άAa@ú ε_Z\LѴE*27"U\21A aBU4^4ۻ #TLe?xtk=WNuQcz#3mgntQ$17H=FZ5i4=@*^Lz:6Jp*T Iwhu/x+o j7~z[N`Ki >T.6xžl^x^MJ"[y!KIVDVM,,PnA#*mf=/WHEi.,ؑі *^~{75ok^ÖZ]Γ<r]q ջ<۷| `}?cU<Z f%}I1x zm|qww=IMV9yqf8&, KH[cZ 4 ĻrK 9܆^K^'|SMeP.DKIkye([yܥ7AJJܧ-ex桨x.X-O&_#M?$vAr;gEƥ>vu}7Yܖ \RǕ.?h5䚕v[7,K2vKp,H'\׷],b2MMBG /P0:䜜-T~2'Mwfy#)T.䲖#0'>#?Ý6-RKd(|<:]r y jYY`{%!䷑<?я-(P0]7֋kCy͔r q.FeBkovMIi_ %FUSưi:[fd[{#e$Hyr!v)$W}C V>!_G[mjFw p6WipadY^XP$+Uǿubork鮡|OIskȻ!]:Xd2 ʮ|ᅿm=|;RR>.G';_b ]6κKpF.YCXpxGRo4^67Om<f5ÃӮFYA楥MoiC$n#_K{JDAaH+ѓvP=Xz?Cs I3rm{7`adžá`YNM?-:vE>Ď3seui/$P܆7OC h<5IA7.үug( 0;dx5%rx wNwWwyl#k Y~u "nf:sO'kzknE:n.|caˤ[v^{!YYIs  żrekDʜŧkp6˦ZlbMW0D}&o¯*kSTty14r[\4WX5Ļ lTTr ߔ=ڃVm hOXxV/k̚$ BZ8*Ό2 !ާ.&/?? x?2Vz3ay){{ v#^! ׈cְwz%W:kz`B`Veˑr8`Wa/IJN;7k5y~fI]^.`lg[DuheK[H';m\̔# >'ξ,S'泦E# ˫xV+hc :,SkLHXU*>NW^EJ~]tf*-MwM=4]3RմHV !iUA`Bp׫_Xi?~"E;j!ү/zvPEn-u'=jѡj߇tOxRmF7.#%'!czW<d .uF+W')VuW|R9G Ybu\N'gn[kUҒu>{V|A#[<t} {}$ K`?g]sV.zu֫{ImZKf[fXaF dN167}x!Ҵ|%E| 4%`Kjy lc^Cv%QLѤ$GV$#vQ((GZkwGwwa<֝[3A~u}kw^ue[FX[Xޕc)tw)<->(rh^4MV(-յŻ~;%2~s$6:͂r4jq]je va yILy[ܬpO.KxHpj:/.[p*vAl&gn]Q3sumKǾ|+f:4Am\X9DEʹ^YY~Rw?[|,ͮ4zυlX4eGe'%|,-m׼O?jEOhp$zdZM Udim&e!5ߊZ߈<]=o&_ ]; ArL?k'%Kk5wMkۮ5IHt//|G뺿l:viiot.meEI z*Y9O1s+Yb.mWKU~+io>xfZK#:&[m[Ik[.VI]eO;CGzk:Ǘ=]]$K,33hFeMvF5\%*{;k;i`V{vU# HG ;]Z\2bÐY>6~M^!hgo4 }={cN]^(rV0¼o~,6_jzy5֍mo)nDr3w]>fauO덡jf,`-JχUlp0ɋ.+/xXy%#ؼq"؈EԿ7.4Z,V@rHO [}C 9K+^Mku6w-o4"K|g-c7aEˍwGAq&n>i]_?ȼ?kç-wJؾ +A,dV~;w\8<'6^!q=WO𕧇u9mTH|":0Y ozG4V|Kb.նbYHW Ժmj ;TmjW7][:JeKvUe;@rluMZ,;tln~αwor$D';壅i}~]/CN3<}Y~&ܖ[kn1ʬ6G#+_YxᆹW׺J̳¯`({5%>nh 5xv^Ok{izd}+cI#6"9c*ܚ/EY6xU{FN2C"8EIeA8>^._OjoN]O^|PeoZբ}x7JQ3*W-xGZۍmx]uNVVK^@d(2 A`̸-o<S2G7uvyĒ'HcVI6s|=)exKNeV4gb8dx$R92yWqA)ӊ.Z该=z5#QIv|V,Ÿ$Je5l, )U֦%]hѻt|kP9Kpf5{?|g?վJ#E=*Yiב9SJ^d)Gi56R;+9a?#]m^cZ,j-ҵ$YFPVѥ1#gx,3 J^EIk.Wm|+ZMd'ok>+\W6v7'.iѵX3`mdG4|=m~%;Z[/ZG[! XGۗpeUc^hvFa Iu- H^.x%ȍ݃ht7?;^axW{ %5L/Ys+Q*Ȋvp}=~UKu+>t\^Kk5EoơojmUY.Cw<`5}{/П eB>i{vVZb)-AsnC-BġwZ>[㞥Oih~'{}K[-"f-e Lɜ}_ tXl|CJ.ծ ܨKiagQ_9I܃pp2>0'&;ccDO$8U/ δeZ~;UF1mu7&?/[i|\Vi yS4Wq.ԇ#)s_Ѥxƍ+Uy}Z ͧNd'vlFp`S&i#ßೆ\:isz0ȭ+UDfd8F4=I|;gIn$X+fhxw(Pmo:>_.3Z^/{/MqSVZww܍v{o277Y9Ll]ʓ]r'(ﭞ}[W>Y~kw%-yV}cM_-ȭՑUڠ ܨ9/i~"ZŌKX╚ 13ȓTB`|Ai&46Sb<[@'s7F0ZG4cdz^]53[Z4yI2.o( ߿nGM\ͩBnKf%ySlSqPޑo>0a$e!X|͐q2@|};Ӯ5+K3Ht%k$D jWg=S$k!.sLC-lKgp˳+W|S<Cav-mrV^i"$qJfq†Bfv&/|6zdw~4 ~bgs$nT Xbq#*Rd@\M*Z;{O M޽xÚf/x4ԵF!}NKȼ+#6@A.z~" rA[7T[uYMK1Yk>&;A|a[C_tGNKs{Y|3VعG\nnjZ):u4g&G;LI=rA`ɭiZ:^u鰜[GWxcPIG~W:TN+vwEVB͹;|,#&E/䚵bMùe6ȮX$.SФePa"WYKu&ި]-FqNaY\? m܃^u S׽򱊃M[YA x7^LiᇞIźْ1E}TUm6o/~:o4VtZMh8[˓ '} ){=Zvzu]:i:|__} Om:wWZkETKhMm rg~ |?o_zIt.R=}.bQvh$. רxj/ j_&w(_WLiK6[LyN U9 Ɩ? uχUiZi,,GmĒDdE[4T {>欂Ժ _ǯ"׈4_ X+M+\kQ8|2H1-WՌy?fUiyZ4α6$ :OX5-JYI=qB.S(o)|.JLnu/çO4hڔi-03E-E+6MSWiZۻ]Eq-s\+}Wע5hP@76 F% ok/MSqA8Uk e8Ki'=;=&>#<75=mX(,^2Nʦ[iqbb- -WXӿ--4}g.$SE>UAi% !* Cq]ݮ~g9kdywx_~xƆhfݭkk~e\0YDL[;W|A /Ei~.$Z\wzޜf[)CbN'qy>j"#-[ouE-JeHt&V "pz!:6iwnkbK;l71&?xLe[+hw齯{yeRV ׆xgŋy["1$Ƒ~i7`c|9k^% -:.ⶂ3f#Ĉy czn9?3o3@ rZiT_Z?2 ډ#t=~~ҿ[փzJCުvn]kV'ko /BՋ k\ߒa8t! Wa㟂>'zѼ~ki< ̚RݴrƆa`cpg!A*W7n0mh[{XD.xp^k+h6l|1mXdLbY7 "H_p AMn-Ym]^vN=IFJPW~*Ӽoxcǂɬy,5e o3 <wVV~m<@'\+Z\Đt+9'~xuk+{YWu^ 69`!<'7;*4+Zt:=崞,M2 t,:Sh ˆܪ*YVzU_ϫršQ<7ִo[%3K+C+ NpkY [STmLΐ?bboAYr̀2Fk_I&|5%m_}ku 60x% y$ܥ}4}O 6 VK'4ePH6ՈpSk6h0_ԯn<#,82(14v1ͤ^ꖩ </(}0I9Y/ iߌ/Pwxv)oasU@ ѕ௉Wۊ;Vfwe^=xG]-OaYQ$2HGP00i}7ɤZb "2v/;Kw3|KEg~ֶoqЕ9G6i8NϚIӍס~y'5] MP<ӣ߬ֈ6Y$eH $n*,pMv:SL&`Ɲn}kuw3eyBcf`5zgt˗|_˧yE3G5ʹ%Eu _|=#;.) #XdkNJ.T룓jv:ĩlm<.*0mi6'ڴndy?ů:ߏ|^αU}&,.$L$%ox{bܤw7b1U:K'r3YT,1iu(eyncOJxiXyU ǰ0.}{_XӛS3\[ v$y^^l,Q9*t]J[ENn]}{R~$|og(5=a?j qb VSE$YBy/iu->7K+o"T,uf'ÿö _i:m&mS\AU[HOmhO *a+SZXx V[H77mxȶd ͼ *)ǡ,&M;$lw;STRI_y[}o|A^_>Kk2M]{pxdcz,`u{w oş[|K!| ɦX}>=LKjm$qO2$(n|T A}A1u'KƟ? boobFhNClc+⽯ SB~qZݳi.";[gBPU kRIQf^ӝIݞk}Z;?:?oq_ ?5J9K`9u3Fv$Vi֚ǂFZvfc z5 #S$wi m9ro?ύ=xjUhnt5/W x%k]@(+ ,|Ezg4qyrk%r5Xۈ}w$۟M_Efi{OKuڜS_7<(eUԕqB$Yj`?uTh53I 9k;h$݈kobWɻ2 v]MO4>x4dܪd_ eUHcQ^i'-Վ| Ɨ1K.#͆uy l `$Y4~0u?~EE]ǭi`KAi$3YP$v&eV{[W,k;nI!Bzd+^>&äGuhX}/~f-v@Fb^MТ7/qkj~Ӭu/qr'$7|xY] r'p׋W6uϫg>i:ABW焠tЌۻ{fIb H 01_%krMΎOxc1ǓӨuu4MH䫵r<ǝ\gm7r9V0eg'P}x_-Ո 8EYRiW7,|MzTsOt, 7˅c(g W|X?G|bz̶]ZC伶C8ߗXO^}Gz-(àq{C.~n9+ wk x'NEj^(-4ZaofH8xNu=3W>\b +F$G@sS[ꗲGdl_$7rJʅ:3RmD'x&%Ã1d' |M_5m&L۪ۮ X%Œ$ed@3 `L)sJm<)݋-oP吻 …'5{H!/ dBlv!#  JGMxj@Y\2i[2znk4[զu (^`5(d]*$KQteTzukPgw2h)r|Y|?ZQ|wY-2iV12 :U,nVVn֙et^FXL!d =g쯯-I6nJJjIRGŢyI-=4LbGS8eH=O<)ʽ ne6WgfGT m0;W[uM-%ʺxIⷊo܅%9, SuK}WEo*M?Zdkix"QLKFFNAx[Bdҗ) |CxnI{-mpE +1¨/㏍4M7_5n 4xvtϧ37B#7ewJI>m/ e,lPFAV8mxsẕf֑]I(i$p\ɸ ;IpTM?a4c?Z,uxe/iiV@!$n'jnt X|Sk%ݬ+*$ٜT0;u_ _;_V[t!M9}:m܇< ^K>4ZV-敬5Ͳ+Th 7vAc޵aIۙ't \Z.G:]X>->VN3Xg'$z힕=;?D,lݠd8ʜ9{w/3O&CuxITMie"dH{2s^Wsz+w9šZeݽ|o{smru4 .$RY~\ZޠjJ'#B NFQB緯.<& n,Da8t|YO9gRZv. F@ v^HU)8'%y38}GIIiZ{iK u'nIvGJýu)&Hs'q+6AJ8Wa5mh^IyVs; b(O7=@8~+)ՙMm & ÐI!q3*pYp纓ǥyS\=5L'ڧ% r:ΦG#6I(x!QpFG_o< r/44 x;Issn&64rH*'85:N4C_;RnKr@enqcd( 䃓`zwPzWu>{kY^6BnhrkOm~_gY]ԒsRCES|#>Gc-R?eWeb;YJ=3LU<+cM 2,TJwVSj%]{Y]DΦ@bHg<ץ*4Mi7dlZux!pomVPo5⎉|HQkVB3uͫ6pZH.T@9'4O54]ďxjS9ÔgB6D @.H}^G. Z}Fg{+GkeČ#$q6jZLxgX۹lГ|׿ΧzpISQVW\-uoވp%Tﭬ­ϱtj@?}'ڍ24z΃a>ɃQ1|i5,6Ҡi(,(|OHߖu 5xq,3"Hgm€vx3+9LgjMoiwh'CJ7 ArVkH+hy{*Q[v?|U;Yi2|4We%$LKa#Z9fI,9Uo}uPיlh÷Zޭi:&y2ȕCg+LWW-G//^Օ/6[KۈYftB[zyFm |Lm.Wr 3WDa7$̶}\5?fsۻl\HbY. l%6tf A9=q]Z!;.# M3W-FK5%3,- Q 920 ֵݭDʯ-;Sn$-qHƾ.վ!G%NeDpbGRI9bj_6 0كS pHAX`|cv~"/gKe?bR i2@g',k~4|#wixc I;]aX6}#PK'Oa=Qv$Y")޲*FtЄ]ݐWlj?OմG&J7[z)a!~@?0~ Gx+;$Z^3<ʱV\&6h叀JGަ1b[kB$B""\ k ߍ_zj7-˜D@vZ?z QtjFKMZ߯`q+|_5CNk۱,>b>]MK%Ó!A'v$:Ҧ[vw\<ѳ[rs[凯#7<~o!"zl CE"eh/"G(q!ȑ75?~:|r/[5=[_ִ ++Ԯ|딶4 $Ifb~`X5ECR[ׯOnu(-:[g~%|x-|T𭘼-+vmXo6[js&҈sH~7m:m5[kbC:,ެ7.cGŅZSMhH!#).Fe/N|? ,^(1o dݔt#+fq5T3 IɷT<3myY&(%[fBQ 2˻Ҙ݋ȧF |vV$aw< Ix$Ѭ5 KR X0d+0=&AeFwAo\/ZG!\q# q3$C K }CЃWS[y_iZύӵ-#S6XEOrc5ڼOd ` kпgo^9/èybmU|e);J$w/x&[JkvM٭i!c Ps@9OwxUPwMո-*)*WPǐI,r__iҫJN/ٯNޥ_^XxS66z51hj[$CĒ$*-di '(j~8 3W^WrAha(;r8$Y?O|-|3kyH ֳwa>vLH[+~KojRÛ92E,i&UPUFryTݜm]Ѷ~VԘB.N kS@9/ayz #p>M[9clH?M\7VW yhlpJ͇.BIUFk`|7&=7/xP&0}ed E%"(N9a|{7VvgWfk,YeKF#np~+si&?S;4RVuJD-ler$ܪ"yYSk}:5#÷&oy^FrHIc $h;*FMP kSmܞl7c;ԩ\oF2Z7~f {SR}u2ѽ/fh__ß ^οPZZnh( b쐲a##>]]ůxn៊ڨƚ:^j :K{ʔ6pkO IOJtk{Kj6$G<v_Ji^S't=98wwӯW3kմ{6f+^7rB")1v΍'$sB/Y9H.TuV^oaK&-ĄFdݔ#La_i^Jb|h3/wi]X؅@Kk‘\nn!pG $=*3ӭj_ s5ޓItmf {2P HI~c3ۈft (TOV^O k{D]kw'PXcr2P>eY eHj[<wg9l$j6Qo!# C \~aM ][;mVR&W3c5:W泷^W,cnUk%.I?١QI2vH.,ʧhpў,Ӽc|>*4Oep穔Xo~>1IoHFqZ].1ij]$lxd_\z=WGխm2Y іxp7]Ӆe;%m~ϷU9ɟ>ZÏM[jZƵD'/%W 9 X0D03Z|N>goe͝v=ǵc*:l׫~?|A߳/xoPy.tۛ5!DBe$$7Rԍ/9m̒&ģ`0N%\ u/%?h5(]'}F-vKH5i$L# X6g(,z(|+_> +-Es6$g Wk^:lZȷשwnߴT @`"|;G.eWwZ}qIaho$YD בi$tMcI j I]2’$ld~Px5Fwᶞ{,iOCsuzxROm徣 >w4,ڵ_jWH2x67dDjkj8Vk#mKncLᖵm_$kGq41oBt3C&O;[CH/O"V zQ 7_򭝑Ts$w.D ;t=JhSmƂ?S~>>tav#ry}ỽ{1NkC|Ws 5ɕ|co%8dVf{Gl\5'VŔˀxYyww7{njX-KNGexnĶ?$w` [aq4jmwe{zhʌ`~%-m7UbrϠ.\B!2%#ly2R5UPEx_;ǖ>j隯e kI4V(Hp\ki&/ a$<x_%,DnH-,b$zO;as:0D|{B'ԉ&;jŭoY,$m2m)L΍Kr4E-.dV{]5[Y>Y?>F` !O|Ѡ+:캝T[ƶ,LSBJ˫i}n`ow7 khc6[g* v[w k_?e?Vzb EܬKf|`FӪ khmSǪiV xE(-_.}}.Vk)|\|>a|5kh:.s4YӮnv9l=>4e]vvkb-wq SY%!w m 3ń]ȬBeVh9aQ^+^B-Oƚ`ӵK!KIu K.!\30u6hꥪիk+$] )i_39|go3Q{)]xLvz*9 "FrYB~𵝦⛝Tm:,ൊ㐉[YgO)C$ |.kV6M\][/ظd"2Z@x;?)Ux&;tJOild^ |۸Vd9U q]t~K'u~)_Eyh3|#hijŦ>Mm*0 67 x/#𾳢ͬ o&F^WZ䕝}ogk$ڻwf'4;>=7^v U؇yU;NX:_4G}gS6ٍf%͔p&bV`ܸ5׈S:֞!K1Ayh/cha(d~xUZm>WK Vw-J挹 'aHwwJv䝒G+NJ|Uz׉\ǂuꚥŻWË ;V)}VJI_1:$}wuKSMU,S.45bR( ˹^h |O LLM2R}NOr3kkjdMY2?!X {Zmnǯ[V~bx`.-m}5-`ѭ籒DV's_~&Hu;odw6frckUUp0Pl?4}7Gmc`xKi}lҮ%]8q{5_ĞK(y.5xXC_2o)?:*.6Q]5W3RZ~K*N.ϯ|^&}aZCXpHv.{X k~,|=åZ|V}sƺcG'.D%OK²(W.CϺ[^G:EimK+\kY0K`\18FrYy9?e|ׯ| EWLvi[]A=EަP+SsRm[sٲދ}qOxZռ7>ZjZyzn-cα++t"ū:UfTj\}z[2KdȖt20Wji([bӼUh<7dmdTYȲ J_S*WHgܱd +ai-#e"-BU[;DuKI絖5|̑4:X׳=?5isDƆ$HG/΁dJkkZla;.!IQe9:ܪ\~jxuz}֓xL[{8tcE-EI.e/⇏5LN%j2T_)TK.sH9'vFk<}?^&%u{oޘ3[[Fd>e?f21?xCD|OXMiksQK^Ǟ a9*YbrFi\kidY.,FIW_564ۨu`+_w'>@$iOE|/Ѽ>)gյut+%0AdC;E:7V5U0u'7&5wZnR@5:wse^j*-*8b2a A\p[ {JM֥}K.E7w o唍oǿzOZ˩:=g:0uԤm{BKHQ8䍰ayx޵X]xs+( F#YNr.Tǭaׂy]]ZmZKF&vOUĺmɛVuX2:%ъ#\0H@[ί `V]6co)1.‚ d?xOK}ukM7B#k~z H"L*ڥO/o|CcD%ѯ,5kKn5X,2A1r1o<;q+ގ?_dOoTi]]k](j7wksO|itcMա[.f[0Mrk"xj?x^41j+JV.>3b^ڌ6y|7sֺovNk T$9 ^(մItW'qL 3󞝏ſ?>3O,5 GTj|1Ocgnpv%buo!#I7>!Qwe KP΢EqEO>"k6W0nUX-lJGrZIV0>lF8Bߨ5V3^Z}GOAݛ^;SDZ-<3B[]_[dxjgbI@$(S#k_&Yz_=~ I&YpWԛ?<ּ=sz\%@e,[: !d. G|1|O[?ڪ{{5u)Y-^BB^IcfJN,fEM٤Mh$rʹF͘ZXZÍZ[j?Zz~4E해kvѰY+.Þ3? !u_ x[&ZOK#u2oO=Mц/?4=[^7ӅX^}I"Xg!%6:V<%JRPvun}#Gh|CsaUJ]Y^@tw2k{&(ʄ<OS[uڅZ|sC-D;1!J%s^8AxO1hѾ>f2#Ni/5]&eo qk>9R9du ( CM;6rkK]/gAN)wyf/7HF5sIq"k"F"A,HmAë?nǪjZ3i3u76͛o_-`6gto3jjKjk[sОQp*ٷ#k嫫+=:$.Rϊ+%@)|! rȧ.is7mt-M^No)[g& W@|S=47Qk-{ϨBHjHIf 3_&xM%k]^+-o/L23jsop +4nRB~8']YO~eZ1{Ueg00Բ_|Jck{zaU7e9cʐm2&JSj))M;忒2L,?<= Yx=oE&T(rn!d!± ^)\] ]:}%oK@.ml]B$$\WV~2 >t:_ _4qXꊠ ɸ1]" *xIZy' Ē T+ wٽXVOF}f3iFo}ikU,q2| =>Wot-J)ʵ/y[xD\m5 a^/&klBʳ2|-x^{t۝n,Yڳ<%lo63᤿$g U4~K[ΗvYM@jcM%ՁUx4/Ķ>>`#70xz ](P19x;?GumG6 Z=jhj쏈k+(P#RNqd7柧A2mfEhb*r%TaYv)9>_0xK|7X,կ;ݙ ȵpF(fp$hO.[ZNh߲-_ @l\V_)GWvZ}7HƋht۫ŲMޡklfbrx48tϊ^j%X[H48.߻SB?7y8)[G¾"VǺDU`:f:|֐Lʓ4nX.#pko)h^/!o}.6kky70TsG((Xx9>XЯut;/'?#ATdAG 4 Z=6K 敯#M"Lϒ@P0Wh9'xxxG?/uLi.rTwc ?_cχ?9Zik}/ͤ )UQѫnUpz0R< "ǿω4H5+ִR[Flw<*eu$/o^.m5/xS5{_[m/miw MK}yAfHXGCLkT~<*֢ xu4[$Vж 26Q&B t[1["8SmHPuxpx{U]Ab-NJFңQ;̘uf -:KO޳ht8?>#bIx`7/F%dݝ#GW?BH ƥ'Żhd"LC{2mхF &ݟ?~j~<kԋú(/)?x$W >5 W,1FeN$jLȉ#Ln2EE(UqwMlm<|ܭE&KnjT<3wm#Du6{1ZG-+'Y ayꫠk5o,Ŵw, ;n$ۿ??W4ˍ(P;V2&)|Y<,$m p,ЩpU4mcɭ*)> $dm1rv*IWLa%KwG1jB÷:ZM7U+p4"P(2y[@ll㧨I=B>ucQBזsIw+π"yYy!ќ W^.::AKdյ _-sY&\aIRG j6:.AH@`,fg $O_u:Źjz/5=DxZk#kBڵ ؚ|df_%ĉg{ cU vɖ]4\K6PIMM/_8}&IQO.{^7xA06RkwZǥLYD0pI`rDžܧ|mkoLj|=r!SW6љF3ČT؊an 8ΟFtY^;G@D- W>#T!6%s>HDq0 O@Fy^=ݕ6&i#2J>'I$'5ZSεt F[ ss[K$SfI8i 2F/y 7+c׌o] ɸXM(Ѽh2 uw>/+kTբm iījc@aWO?_6‡@5[yxux$3D>]HyΆEF9nЏ%Gvmz_Nu9->u#?ӬVjR^BϐGU=yYYj:nm5Α4z!տ';1$ZOí7Z/,l.t󢾲*4^ZaUX@7`ymmt$qEtJp-ʲg9Pqxau;U=`5Ùn4=G[tl[%EH_?Q,\q]W|WSӼY'Yҭ-?U0 D ,l"}2cq` Ua#ä;w8'cɷAk|?ᯇÙoİ;Ci/V p.Q\FL|YPT^v2]^1&OVpދ{)99cJ2#d:⿀->oZIYX:僦Q5 7xtb RWg^,.4wז Y`}b'F#q9uwkUs忚8OiV0Kg-7qp2eRrT r@ .^[k:'{eŦJmkkKI#ۘVᔍ#N3좊OGIպ;]z fj "$ˣ)'FXdg@z4:|G8) a F>l{p5uخM LίepӦ󤵖)6̤902v n8M4Atv]|7"EbAcOoNÚx ~mŶ$'IÑ ⾝~~>,m>$xڝċ=LZx; YPueeTUW9#I Rk˰51 -akkwmdZdpb0*jvD_Gʿv}"u i|$x0A)"VwFz# qkpgȑSQ8!z>b^"fEYD9,~ό?d7}c~%4kwihڎ}mgbe\WF (>~'m(}m|gE YQR֝^GxSU|=> y="M;S[ƶXS_q :Blt(,m-Q5$rl_)E^>*,.8G@Tl;8B9\ŝdh P2q#S䚔IFJ3} =[[9dgC1$ed2HG:Euv%v $p3OҬ"yo%ʷ9]Cu?X-nghYk2?O˷q ~#&\-!h}##H*@ ~Z[}T]@"&@9{86|}Go|!oUi"֮m6{eo"gOP x^̯.&I]ٻzkg.*iEJ{]/;}%W^-'*q페U#㕷u3FdBX늭r);lW3?&'RF2G``zj;=! یלtϮjLOpOnp? o+̘b ONGJ+G{F765="ٷ< *SЂ 9c,"7[Nxҁ-$j!ck|h#N<Ϙ8`qqUhv 妆Kq,8#vNW9<=M$mxٕpOI3=pmX1uvݴ;F齇wSs[E1ldl ǎ1ӥwzoxWTK2IOs$|vw%+ >GjNe_2y?$aH6+b>@U%U9}JRPedz[^yYfxW,Y/!`[$qa`~־*֭f?ɣhQS.SRVDfY0vBGlp-ٸf-T3$В}@BARp*9iX7 `zWpve⽶:MovyyW *X:v_]6}Ľk=zͨxD H+)=d@BCgEz燾j&nK`Z# wlmYR]CQXt8{h.Wd˩ YT.pUL޼ 8:|}5̺(I5tN7u5}m.e0ed'AЮjߋ5xj_]].[em ~UՎ5 2X̊L\ C`pqV7/mvGmVGC<4^h^-1] ~SyJQ^'d;w`[higgGeY aTsG9+VVbQ&]iJo \^"#npOxcRtGO5J'ǐƚ_]FO^ /l-dK}!@-xkZj3x-ᐇgi98s[&h#OUV(gnC29okJ3$I-(m $2FȩjWyݿ;Ƞu乹˷#p&pvˀT =_⿉7ѧu8Y(p&|oiU4U;DT)hw6}Ee`a2abwP}O}K0H ~c]uDŽff0<̆K|v (b% @ $uZdWP KWdf^Kj&eHúbIr7`9&-|5oPoVxWl`7˴Z@ծ|xTn{c Twc8⦵ '4og+dRF+-dcer5hӗ3얖ץ15 j}mJSkpm~љJVI\;Ka# Ը\Ю._ڔ*̤$2 co;r3Vu];Đi:f66Җ&I`"9QLd0yBAF=J$(;RB'O:>1wxW=vK"=0j/qLZ~N Nsr|8 tk;#_h[uwbxhfX$g˜_ |Yо2A)^x’AϬi=6rkkGC+."YJ sEmM[D/ͬnZf߱+ E2ǒx V|T🅵k$Ě"cTRwm5e^#TǴ.\5wwV]WvK.aXlm]n{8vZXWTP)eekAZ|@+ᗄ~# j#$~éF9cn@ɖ4oÝCOM#@|.|mWHo7bKAQ:naOi|M%Kx&5u6**Il$1J_=bl}1V|_ž 3%@4IHծ,o!W;4Me߆;{#^6+-d<6*tVHV[f˓fDo)$pEg*q|[E'LG<ցHVGBNTmix4v[?]XjFɋso1>eլ@̻dr0@bw~kڛ^N-wh^yί*lv7]Ez;.aŻnX\]C?k֞=ïiܶ͜ڌIqQ,Qג2>|J巂mo4?|eBXx8D$s܄呑Vf X^5k?DڴFiol^Nјjц猴UJҍoGk~fo_žtᑭtm>Iuj`=yDdjL/~_)jvj}՘i w+@3v~\ ăo|cV/,~ϫ'cw#ѴmwU(E?fg/7^3KmcF~̗vճ k ˩Z1wjNy^eq$e / Y3o%m!{g5\%[6,6|}R3OZWm'Fh7śC*pUTkWxg@uh#4}VNl]:IdlWfHcNO+w~oi.Hm%lN/3_v*Q/k=o}ϥme Xx/# ⹵+-A$FKyZrPTᗇ@Rռ'-Bo-;N-jnH TGpc$ǦhzBZ6; mOt|dgnwф%M-}Wm6ޭw2}&CZh^/7k[q@iYUl$^s?LӵkN5Xu(E][^ڿ*2SBto+i?5uc.PY rC~|VUv0_/OkVNykkxE8 DŹKWyc#hs!k֌2_7t馶8(jj =OY_yu]SN ge{i{5~bPZ%Lo:4ReqZ4 {t`Sj~/[iڛ6+m*ws#Ĵ+_Z@GûvջG!.,K*\u &𽾳pK,7 즖lK ៏xm+ggH4whMJeޠV}?n>i1izh5~-մeI`Vsk$[S$_~FvV|Ke練z]Zp^:al4 'E"#77!5[;ȹTFSъƏURn4h<~^uI!Sa{nW8ܬĊ|8Zl4?-*]Ikiqn~/蘣:[\]dy׆Ƒ"؋{}S-cY!بA#Fi |KmkE׼E4S\"_xIrdYW, x2"c2Ƽ?5;#SXE]F 9`JB|b!a߀[ ޱꩢ ]闠i*bBm`;y\ !nMC ]OQ%)s %nmD4>eRՌ~?ngZ> _-$oF<Ȳmfr7.?~ xfQVXqW6 JQ +mscoj&%kZxtt \ J %}A:)>&}<}go{o}csbҦ e-*Hm@^iǚ4{5nVtZ>|OFk~]GQX4#xѪ#$JT9i @'|?ǀ/TмYmowZx0dZ$HP p-{w^uj'? mnK%BȡfK/YJ,UvqM+ȈSa,| '>0Q eulHJCuc-n 3!VQ׼|W:IMYlo7DF1ʫ_fTe~Iii}*QFygi$pX&1L#Jydnc-[Ƅeھ%VIwo婥L/*NSUS/ }fq܎K5G,rU_;>cW/ݾo.ykexBHvfVXEFe$q_(i<׵tH5_ֲ˖wTfȫ1.wG?W<oịkXe֝iy!C$2̥m ,GBNJ|[/+tmTp:Q}E{Ec sz6xo%I`XV1mtlls^/;w fjfmCWiKm2qr@` Ϛ-SZOo<7Kn}fI@b@9xhQAi%qo*9s*&L+3"ǝK)FM7.KvͷԘҾ-uBIg?`It6H_HT2>PnR3{e|=/mb8qf WVڄr.a) 򍻜5KGMsR|[e|nw4PŪ"Lژ4NU,.cO_|Lz4ڈXdbYH `眃 jfjv>_.4Ks𷋥@n6mQ6VUc$+> A5?χS=}OuX[XxG!+VPUcBUJy9pg>|[O%~̺U7QEP?sN 3gǿ ojZVV(,ap`Q#+(AS\im-;MJ4އ|I||C]_Z.4F$p-2%Z2$#忉7k[C&gv*@.47dMA|k>þյhڵAx9'G6L*HUH(w~&x5 |AZVS0c̍ $@0 m|imo]\\ϥi e*e{wA*X5teҊO5OGm3I{o>*vNh6~6ZŮ--'5;" ̅Ld6}d׶>"].MR9nkKnLa0pϴpHʯ?9GQ;O|Hf3c%IkH6U\d2Su?<=ci=^&nR[D|x[5e "{ mO%z? I r$kHhό7|\QO`&.T3RCP/OKgZxI.5mkU$06a"h.p %E_2'*??W?(mj3G}Z.;hc(g&v 17?~Z׉, 7ˇCk ! 4"\ հ@?U9zwFݫ= Gߕki} KMov,/5V([4`>X=Ǟ8wŖe.Wa2*I 9|f9 g<xwޝG,,<5`.-22G*Dlfh݇˱S(S#ʵkqnQ KMR=*; Q=H*ʌ;c]kSkAm:Iu'@cƷH Df #n3T%OFޗ}׷]+<'JךEҵHg[$+)[x@6YArA*GѴ ==4yfWuK(4-xq`gO*5 ]eI /FPעjWAcW6Y\\=ʲxfmȑt &B]F3~wg+ºlj%8o-.++!5[]Nb[fYٻ`ccN[_-6l1fO][~XKMeS^-cYF3x(3 k.XDN$G",C0utRd^WKվhѠ<]k]ZPyt٣|L+Rm1%+5h%铛Cq&"0ErY%2}z"yیɵvMv9mm,7dеk.uy:^`Gg h6X۔e|oE {@}rE$ζL$3aqut'i3^?wl|Q{{ 6Z,Q9( RUo0jGgo|AM]T]*|=4$3(*,b 2b%$~HK^kӕ򭵕J־J>񆕠~2>YiCFMU9&0;xV,$$ c{SK]V-Sԯnh+Chȣrw᫨#ip94qa[/V[Ynmc<'С̄8-o*MĨU>|s_PxWß~Ði6z'Rռ-{w=%RO2;hF+-Ci @sT(5zjieoy,f~xk|D>SO]:c(α6G߅,t?t^>",-o╂?^,dIs I#L,6 vR/Ox[+ij/qKe(iu򢉤 *3$ [Ɵ<=m^|9mml͔FyHʓP? CSZq2TOGny&;l"ӟTdOk-s0,nm$H fžF+3GMhʎPнݒ$f( STҽ>}ҳiE㿉*zj?Z6N^#mM *2[v!-/_<_U\[qiS -ՈUزv@%#a7[Lq5 #L{O khDyo*Dp˙8ʺd2ܪoZo,|i[g _R{[i.u6]*G[]i"tjp.r1RԌN{ٗ:qV-jK|JO 5_xOЦ{M.:o[u ,Q|T>%y}M2 EDKlc%Yǖ*"7G/-.} musmoҢܮ. 1h`Esg |lG.[u9|4!$^iUN*?T۶~fJ1~!xs5K:" OqX ]B5A۰TJ"Y9)1~F㏇ {mK`nEv希E ?h dW ))A{^$''ŭ.vV_iim,KDe 0dWu% [Mr+jF:a$!O'_؟|=O^HMĨ$}sr+ 3>5h~^ <x[3ӭRӗ1#g7U+0BḤRY4[9}5]Ucwgo;>S{=kKI/"VצQ0[8 4 灒8 , a?m<=ed:vKu-&w9lF 8FD ^{[x7 p{p1!4^Z"C<?j MӰYm_f$m$²+i'?g}^=JGRJҬ,m$$33®[]ف>| }QeԮ4_jsA)$w,Mh7veЕk#n!^յ?mEMt-G) 9FBWخ>!K-O5Kf[,[FD]1ͤ+F\yt当QRqu_x_9<VpQKѢQlLy`RRiq+⼒i^/|kgѴO xQy-̥g[ֲ!u8cc}W'j_e3I^⮝o孿v"F2of!~{ֺ>%I p6r˙$ICjv{湳}zWMJQm{{(ϐعFd^xU'?k4>;j<6ѭcYQ]:vE_F}Wۘmtk&{@ nUn $o#Ԯ[:4ћHW|xCɷ%DJ\c~(TV;#=[|z;?R🁮K nn5ԔƲ!_ [ï>2  ZfV\<>k<8<(rx~-E+vffI yTp l(% b4{Ű.m!h]n(8GܫU/owoΩ54> ~.Yֺ^5V; HMO E-´łEp_=1|a}޻''E2XܱM'2*33 Ȥ@h<%w_V\?ZzBGao fUDC!o)B+d>'ŤXk+\$/xk(Y56QԨ'qFIJZt$޽;F7-NĿk9 nk-NMQ~$N0iVi,%a (-7#_?u]/7:~a6Ҙ۷&+Yу*'䐬I[w|+ũYko䁣d/UKc$ [z ͏j4m#sjޙ77N y[G!+\$n!j05t^s:6? Z- ][YKM Ka~7vYm,H6oGč_xi>ڍ&QZkwvvZyo6jHK.'T+tZwWyNwտ5;?IqHˑ& K{w/͏ @~~ht ǥ~]xaz:jģ !td>c㟏mcZ{[IWG=na&BT8![< Rjv?>*|J]CLM yQgA[mm0;۷*4Iˣ~_ך+wum]Wk_xòkd|Dl\Ȓdv۸27ڭp4⽏)|;k?裾Z?=" R8;(B [1MJvE&]$Ď ΍^AjT[J(;B40X\hlBJ:ӷ87>6/ xK~,m:t+ 'ѭ]:57PdHTke}I$f=[Z&p2I $NX˵X,q ׵x\!|RtG6l&X%it$#,d@C5Kt)-tId+{pnex}w?m' E|gnؔwX7 0?-|W?n|8'o2tA1r\>`qMgc焤W|XF[uUbr 䁐sA3JڳO{uk9u+#3m쩹!G+vnfwtOjjhgVlĕP8+dtڟok6^+ZX]9@'x$~`U2tIO_+r]ߌ,Cn=7K[{* #eUmjJl54x~gi-VE13 q6P61^TʤKʹQ Gp|]ҴoEu \jzƑs*+`$̯: iYsS4;^9d"De.7z˿:e%徟K;;o*[o:!YFQ8<+mh>/.2,%b26Ĕ!Fk*))_[ӧ3s*VVv^[4i{W77p9N֕§|ĺ V.$aHI$8m 38#f>wLS̳S$]逡 ;GLZ¯_LRSKxBҌOc8]qg$2#HjjE+l|wis,7Uv<J7q.iI hYcy̡O= IJdIY$PW(0v",th,P[TG`O&E@ݷw15δ2e '|ռB?uX;Y %7vd1̒I/Cn|KGI7GK{6lѣx61k0.N?j^'$6I[U8Y-ɖ{9 "Fg귈bxC%iR\sȯ^i)Ὅ{'m=<䣃Qw{|85ә hv#C*!rj }{+Ėo609ܥhʰ5|0.xNk94͔COycz8<:5'#iܓEg4q%Iw?0+b>29$]8j`cBAv sxZΣמ HEU@vqf{iyRH*[4EqD#L szg<3˩ڴtzs,YFyp9uŞ{5)Ȇ9nc=N:q@BQfa[y®#HL`z@w>! ZIolcRdp1\Εm-J*>R2puFyZԥk KK[ 3B.=0>n+ZK '{)ei&ܥ[BazU]6X [K )jC=+,d^ilRid[F[*c.#5@-⽔%ԉZp4P29'*̤Z1ȋsR)s!=*R\?h1_23qo5XtbxKY&F9  xFi4FtCė6>H~;KQ^W„X^r@ɮZ}]Z_]TVVBɮ%4sXH[*9q ,RWy𮇦!5k{yԴUvVFT ~1;HK;𶷗˴mQsVDZ޷6pH%A 9C︃Ub],0FQK.Xm,J{Ehj6#ޅVv5ՎgBYM9b3s+uM_$ _0xTStu,~HU p W|\u?t4Iu{f+Ν<]Hͼpp:wVRT[oKm}muqFcךhيOnlxN0'(Wi:bw5}OSP9&% Lrv8R1CaizcȶY6ڒ4lț zg]ڜgWPZ{+se1xnߒ2C*?g&VWLɚQӯ.aco'xK+:sɯA-|/yKPO[=(Sr1ka͜xg<2O}<,a>,\$la?t`e4=LVmmt_0s%SO\J2qZ|ms/bV~ְnTiPF$8,qY o⋛DmJVa)3ϽN݅wdvzIxKv <-=兙YL_w#&09W_%g\x'W=.t}S9[5h/[=afR_uRpD񵶥I4:4HtK;]6Z eoD F@|96Z?,E液KrrDãa4lkdEug𖧤^ e%3yaRC F߃V)Jr躾֡?k=,m󶡥{\h-GzƱs^"J>\ |5o|J^G,7(p6'#]<1+}w;qC^? h HnVK_ZRd|[A=̍,7B\߽\>Bc_O[>x~q%y.)ji4 3x\+9( ј`Q8/k;_[~gף M5z̓Z6ğ~k>:YT nfmـb3 8i+7x׋|c\5$״>KH-] ][tLRb8 bL7xeTF *7a,4"5evu$nbr+4rʐ}L%8(To{4ۖfսv嬪M8-m<ݾ]XE]s,EE_[{2J R$5 *xῄo WZ4[uw1Zޭ*4 "ve .l~,[=o~*u-L-/GI .(.d(ʸQ+W|$Mo/O[VjNf)DHmnm~ս6:L )]Es]鶭4r>&ůxPH붖+A2I*uhbf$6%c?/Cƺ7WռMmcubۖ9QKϙ,-]\9 &ԭ~_x⎍ kxgOkYB 9` 8`8/>07TcIyp%ln"('wHq)w^X !65( 5pzRFote$z٧PmRojV᭮,FKF1$nһ@2rAKcqIkpZ$>dGݤIyndr5K^їz}z2wV[YjJMHlT9,e(PrijEq$>dybEVE)²9=CV=_:=!Oh6u%m{KFsxdT7~/> hzNt=N{vGhVy$ꄅ08_ zirRVw)<4ŎMmHvOGkw"L˱q%A,x%6ֱWR[xz K߂)xZ75,'T5Qw ෍!G[SA"ɤY5ś[I$+Ft{q >!2ڟ-SJ+2"]5+{Y!F&H&RT|Gwp~mmQKu+W+p>U;H4诵!<:u[-ZȮrY!kw#aXR6̓YT*[ަ(c/^0{E䗷GiyAt/-(UYQq^)M[%BKm;ZS&s漳 w0YD{T) d\Z5\jKy dg9I!vl$Wg"^'oFm<,maWX 1%PYp<ڪU)zooVΊ4^-{t}+⏊u Oaob5*X}9 ܮ ̰˟k>von a<}&MidκVQr0rtݹկ_v(a2Z_^U}FD(|tMT8e5C;~AO#;Mw %)p03]k(k處Oq63ٻ &k ׏c@$_?FӒnHp,VRIYrX5xz߆u>+Uen-.%(nIsW9|:|*Ǐ@xOǎԤ͂Kc%YƬYcT7> TѼ!g]j]ϮCiee*2T%KShrO*[IR"ھ{'Wn-Tb79-ukY˭.TZ{`|đfFp#;OZ_UC>C񶑦~KJ7ƄW .~7-EoWM.Vey-RK[c%TU]5_90J*ǰ x(j4ǸivsOۙ)7XiCǚ(<ȡMwobyDE 2s& /|+?ǚ<Z7Rǡo&-ܯ b.C:;NI8?kCͺ֧aq$s2x[I(djvV}|:G*4__cowe.[[yRj;r>yxFı*׿Yu-R[+IMҮ\^}@V7 ")c暽O񍏆j6vlo1mm+x;On[xF<6Kе3T+o!R%3 9aTN5ʝvzBۙ|[ui{܇`2NZ o"BF 2I׿5hnky!a*O6m&Fܿ:F2z/uo8MK%sԚvjrjv\-ҒceBD??EJL5җIH'A#,Yd *;@)PQ<]{ktR5C<3M[h}5dҴ#Ű?[[dDck/*?xzңӼGe TR.人-A2%moHWK~ aiUXjũ ˅ J<2bypvDZ|"e5Y|75Oڳ:fpQ2G:˶r|Ҍ+{]뭝=yF>=!gauA6=s-o@O$0 R;]t>x>/]6Ni/.<\- 3HB@uCZ/.lZM/nM peW;_ [\qxgS5햪PjGv˞F%WQ鶍K/>&:wЋz-nl# XH),~4j7 Qǒjw3-6_Qċ$P,. 9:dž5/>%|7ow,TV2jWKh H^=Vg_]k4_i6:e֛-)7mp+GV] Z4gUo>?>Ok^$-/4i7s-ͦ˃u7?*6 W?m|90Ӽye mK+&]ni%&f ?-#WoO^&ZjV*,$00 f~>"y #P? KJQ~[8Hƭ)XLK.SrI]+]uO],2n%kE"HhBKl\;{~[UORcᰲ`i;J`ggI~QeNTy7]Ufyq8xIϕDmbI5}Cϊ|}oXKi5,/57E3Pf 忴u?RԵ+n&`΂6+1 ,6l_.[D^(WWڜ߇t՚qJb* ʌbopwKx "P|"v2~fKu=vXŞmiWqK%xBF@lpﶼ#4? .=otܜ0xgS /Hr^ܻ)Zkw.Ư0C4p@b0I~V↽~uuC<2\\HuͳeF ;q׬-ȵ Y챝I{q8yfHK1-. ~xJլ)/hbmIV6l*=w*O9ҽdrG]]{NǓq~]hm?OquHCHcC Ga5u 6dޫy4Uƛsk|䕭wm9՞xWMo8ѭ{0>nZ5¤es+ܿ2/^;OxM߁N_Ua0vE3#Tc¶O΀~|/ e{:ƫEOe)7[d@-IXii/946UWs| .+PQfۃ+kי^澷έ5˦/Fws tIDR"TY 2&5Oxv7)Z3cCI 7vx^c9$2~66m6iVK8ExeiQ$# ceoXve[ u2[W%eB^76Oͷ!`eV1Jk{Wjȉ-u i?yUծbDv<@HmHVc16ѵ6ۻ١sl|Mew=hjgkymZ}V"Bj!$9~kУѴk#k>7g4NV5^k.bͲdWHOr˾&MFQx{J~zlm^~xw/Ŝ?nMdbIfI> ˓ ?O<[k[z^05(Vk%i[j6|د ow_Yc%>[F>[_r N#kcrE}$ ]%bGUYe E_?J| k( 8 H40q9ЧUAU4.ͫYzGd#]Vl[oH%tۯjַi^b|3/^x[2^KgXtRBC(W+:/|/wvG}uus6IY+;LdVm;5wVyCu_OXhbτVK $0[3b$;3`)+\x_:o-OןW%q#.ZB-YIP]e?vԡg^ ezH^+[U>Ss$DVC4^/,^Kvk2^hVqn*Q(m<>^! =|=y4˩_> #͊XeUmƷst[xѱ`Ѷ+UT1.Q拺&MNCǨPմNHŬm5lK]$W0sksx_=+kKs2-<ߒeOB=]|D!n4ٴt-dD@C$neG g09< 5WoRkKu(C*2++߷pI4z3YA=~ I'sῇE\tۍ.m1fa";']dI)RF @4|SѴ];wte'5k'KZn'$OTV#*ռb-4F]^X\Auk<6.K`53 @6x'|-=E|?&mJq-Ω\5(jʓ8Eٿ-֍kfMY[ "+Wd b/sIs4i˒"VKN}4[xW3E :y)ŽŒIF;2P% 0t+o wƺ'[Y;{!%p 'fQo Q|;e(?ψz /m+iw^!/-Hܪ Im,|8_3MaxtihG򜅑3O̿1J&nYz_)CValƊ+IBai.jD2 I}X]{M,^}_}$[k䴄e6bxA/P|2ɻ` AGCVuO/wnҴ0IHWxԁ\2;]|y6׹|FUƝM:ohk;\"LKd U8Ϸ~_u/ kz6i-u*0"IqM4B)Kb%Ji&ދ]kˌBQ޶O4}G¯>v Ɨھm$o!TwPI T`j;>km|*Ѭ59<Z c$+E.$u! &|;.+[@楧cIy$KDD( [E\QyUq Nw~lWS1Dx9 6C`u{_>S:TSuO84]dMiwٖ%s n Y$C>~U`?Zo76$~weݙ\@1Uc^/frO~M^nSĺn2! *TW672faj_>0\AW^[}RmjLKV!+yĀNF@j?U]}$𧆯|1&YCquE5.Mr/n~_v{/5;2-" 2/7Qu/?4 =O,-fSi:˨-\pU\3VFԮ$i4y #mr˒OujBҿt-z bVv^9mgWTpTey9y۵I#9=[ցhQj"%G[j%KE m#RCWhz"hjZVqi `88 pNXf߲G>2RO&j,t%Eʹm \n"yjB8U\d嫶jqUK7o]t1eφ Umw;.swA  M/}U]@_$% ;hQ+4 $- 9zOw$fcGl-5]S2쪭-ũC5f>Z>fKt/;G 9ܼqkF:n}D4b支]:mkGM᫩4 ^xF 0Rh.^+}-ݗrDi .܂}:?K񥎁~Ӽ;chn&I!{ds:ow/uY|2\X@gxۋFeA7?8xrip{PկU "$* NZΫP7 9MTuW>񍇊>2_4]IYtMFZyݭceܞeЬa W~2xC¶_|k0l[˽CLTdӖ(^H,nbUԠʲk_jĿ M 6dQPa֥&ۭ̩,3( u]=mOłkX<}&':.:n1oz~_Ϋ^g½r7uωuޅixhkV_$¹[K )r=|8V7]͇ാ1ڿwKaG1v2a`,_?ytj>"FsY̗ڂ<#MKv3|Iռ%`,Z%}VK1v3ybF#b4/O+X|=?!_Ka0㸃RtMR-Qe/IUXHu{!Fv˳dm|!C(c^'o~7ÏG K'VvvO5J "( (FWZ;%tw{8z7ӧm7M/yƩω| ͩOLpM[ZX.}i&%E;ʏBʛpk-4{bxQUHR΁cx)澛7ưKGyu4%qm1߳? TNJZCд$1K %nuEc,Z_I1hz~&4N= :xE Sa(>?~;o1mB+i4 %_"&%Vm knR\?ǪOc=͍͗nɦG1N32\EH(u&jqiEצTӺ5tկYYۣnyg-Z)t}>' .u[O*Kk#RɓdYFMihi\9u=;N7L C##$J9 0 D4իڊW`堂O*XYt|͑^[gh\$yb6YW!Rps Z-=Qɥ+D>tVY"Uҧ{,>RA1$'r6Wo'+ŎO62D݌SAX6<]]jͽ-͊= ̳UZE Gᾯ-K↧uxRygH Vq$w W&&vEFZN k3Go lc1fݼɁrA@l__[j5ɷK}8s* uGtcPҴajFy-|9] ĂH_<֓e=icKrY$ ؏9$`yb2H 3 k?|]w:/:ޕjϤug:]Jxg_iZޗXϭ,fH"e6eyrwv35ĮB;x0 Z,p'8ͭhuZiJPn|9!)|G[8W&ݽҳTlm.zRĹUx$Z:[6ViI=bnom`\f8$,_;e0>a59蹞wوc w͜(V id_p2AM956:kqD0w B@~H88WMIӦk Ǖb-wixP#PBF  6WWiRn[h,~l'k.1u5rcewgp{pbsd`N$O^U5yo[S oĜ VOSZ #^[Vb[gc#xo=Y Vhl?%xB&Ҥ'p:iVAwG.`>ar1:w/Ws[i6-n"s,R:$9(labs>$Դ?:奰"۩PUa6MF+ kO.!t/e%n?yNC}ʜ*吒[9bYnPX18ڧݝ .2ѡ6y1#Y9c7cW$ۻf1ӵi4(;@Lg: qOM60RMFT`dz}_?Vk]F&Zgۭ,;v *`Pcp"Mx#EHNf0 ]4b xhv6;7Wp22y86K:TBkxKjGtu+$Dz`$rEvW: zHnV[Xp$PX)ɐ fӖ n:K" YJaع!r$=EgR Q2lvԦy#Ƭ:#eA  ȱ ]@ Ҵ |C'<74k gVDFFţ#9zJu%myT@K`cp3\֤?id *ѴRIy,2P*`MEZRI RHIyQY 9 p?7B+CDorLDZW 0giB~IkC׭Sehߺf #O5CK|*.UbvsrzzxrZɨ" EyVٞAy֯-,[]>> g[^qޯ#25,#;2r7_@5q+6(FSag-9ݼ`y+cgĿBm'.kذt噭/BY#`@yvZ9- 37,dmp{6ŹQH#>b^99 #m7Țx6eo-  Hإ))9iЅ8SK}_^?N EFCnv-'2aߎY.a` 9 $ƀs19SuۤQp9ߓAZdZ4*g w2t,3s\Dw)\/? vt R܄)?dFEqe撫>[$ҧ+&Ձ $PS*tc wrrHGsPv awت󜜜v{iԽMt#MkG2WlvUcrHSWU9OyjYdnGRFx}K?Ptz.8 QWcd#zt⪲pnI+匀b/ӏOZIO_OiiiycxU-fKsqsەYT+no[IiئʲY\Emp-OHX C_мoL/89|Wn-wYm#0Użw*~YTr.Ӏ#ּrxj'-'Wɗf3cӁg]Ʒ%;öWHQ`)]IM4鹕X+'闋,M2Z,3 ۸ =xȯXƍ=khi"YIb`],;xog7ὖ+ @ *ýHWLDrU`۸.3-}URIn5+{3Ѫk[! 9<\Iߊ7U\ĪnQw].3Y[?1΄9!@r8}F6WsO3sFD`VXH )Ug2@׮:v^:%<$ v@*NӜ==j]M5=N;}zY#e2%–N3zcmk=5އw5r l2c$rp*Rje ?|)@HPl2'{]vmJ$Vbѫ4px#TO8Tl;OqeԒ"HV=eޠRsG+u_xTԵ 5W-f(wb>aF`z>Y4(.cg䶛h̀R=>Öߕo;1UnpH E}O+w Emͪq`c%͵ݴVaVV uzۨrS/.*HҜ2̸p~/|>ƑmSӮ."&'9ðe܎dZᢆ{T1Fn%piv=q+i"H'12xgkE]#OaZ[k' #v+FBX22d+}[+jM*;{<׏nuj͢AE2*7P#qŮ5ČW]CP\0=xF0=(J6;ot{=k6*,A'{G ץCPI({w=g-sԿe^5O6{YK&$}UipBs_5xUV_ /.江̌l%XT;d9d1V8H8N7YGҴ>Urs y8_,]"Kӿ`1Oq2Em ZGpΠW]jpJl5:nu#oZ_m3➩ X̖]*..,rROm$O:6&Jšw7< -%-LmBGߵStۏaPzZ@~utlȏ$Qvuk㱄voqb8U30$ӒZߊOƾҥYjbI]>x`5|5~1~\Z #| asKN:Dei$u}ΦH ʩ~wt cF&IKJX1;@ `dL١xs#|)쩮kF涔ݩ (OfsL3<88J4m_J޿U7$7}6Jۻr<^𭾩HW7 Fmz9;參=qmkߓ{&mxSx_xw Fg:m戺2;kᐩ T͵XŸM/ؠx^$+hZ̺4̱MQП1c(ugQs'''Z0)ӡ*VVmk'~Qeqa '٧m#;:hd?w?kukIP%XXH3&8'Kd|AiwrqiM!KnVSkMͺ+TzFB:r(O>n$hچLga)jq[H֯y;|)PrHV'1c;<%}Zh7-6ד%˕3d C$?~ A/_kg~m"{X|9rTI17-$E`A|`/k(q0G h~ӏ4l;- Buƶg1FHx^&S1{mV(O[qs&Hݕ͸']sBQѼ?M;3Pra݁?2NFo>"x^?4-SޱyٰK|5Dd!`RUE9,JmN\]z}G-hoK/S~&O;V+vDIbP].qr x{TԼK⫛|ϳ=~ӟ.Hѷ,`:At u j(MEq5|] V%Xh8#鿋?|a o־u+&Lj}ww|6Uy3[_9yi5b}6HVu0؆Di(<#?˯z=oUEo93o42Xir`yv9F__oR? ometK]?P($R-2OBFZ&ݺ0rN7M>[Jⴾs#DsiW~miks N̍m8GSە.kw%x?M$ٛxusI:Lm^>oܤrBYX89–+izilB5khVH@ӄ AW 5vEȴM %Vx˕eIQR15sGWos~K3?g/|-M,CLZ;#"\[J_rઁků#_hfoKu7zX_43YO*+"KmSV,/Rk$Itd m K!.Tc|gvN,.UmO[j3il h bK.pJǠ_'-ſ 9Ob ]r !61DU0yUA~\?^u&D9YPYmn>TFnf W>1,i^3}ƽ.<]=sE"FȣA"y˿ o|!Ğ(wF? EOG;HVBkg-WN:QiۣoN5ekZ|Ciwr޾=wdbrNp+nKNK,5؉VeB˘ȘUbT,07n^$VI.9k&.&F*.NY6Nw`b𦹫x{coY:vX,ee9_*6XŔT BqvO;aIvxtaVBŤ7V]*#En1 -sυ/xWEr zu$V^ 2 &ԆDrݝ}&W.V>'u\-{gkizSX]`3A 7v^Z:}O~x/'~ehonCHZeJDO}uջcp>cR7{KFk=Ƶz\Ғ]6K_h ;[rYeboWXQCg-¬fP'@|~|??|ojy_}b'Bii6;EKm~0x{m)jZΎ |12Cx/ ']>,;EჃpam~ѺW%{wZaowi O_"c5S{:„ڀ'jM82[kɛƯ+?nl~]v\:myewO.-P$2%A Z4]*HvVMU,%XAup钬L BPod'vxW7ˏ?φhƛh*Z~ mv[yQ<۸ẻ *Ooj%J7.Vi__>wޚt?Hiqe4tM弋 l3!Z|SW]ů|Lk:ޟr)(VʨId\ȯeZxP5Q IɧXAoyemvcPct9YFj|DMZ𮇥hI,W7g,*vo$6uBJ nQjҖogʍ{ϕϧ(~+2F]_X)>a,Ed&TH%ʬ2"oq{CwőJ1x7m{nK-Re 8ـ=Ofx⏇CiMKD]OC (,-)ɞHH )dUQ<iFS[/m^ [SL1 Hr?)ڧN.rQw}Wo[FSMӾ-_ cZh^,O2WLWuipeK%l˔rHOk &kTwծK,}4Dhf}(!>a᳓ 3xxºJZًK!fP%D mqy x8Euwy^W]ᥲAOL48<Bx( U9dLs诂*&k~ Hơq\VDMF`$Vܕ3DLag\-y'n~|@M':n62Fr-d1Ur\W~]/V4Z*xq'cϥN>{:)X4xO|\5gGtռmӿ/Ξy$[D4+2C2ߏ^P>Io?,~,Z>#KmsmpٷdlL%*oVvڮ"[xlu{k/%U+, nţi:vkדL,-u=E}zm0e{gUD?|Q[Q~Bt-NdMi>ԥ䏻4.Qe.}UӧMlhT)r]>?~1蟳z߆/5-?S;k_v[?e<ݰڇEt?YASA%ω&)lE"s"o"wC̺'#ê[iˣ=ؓY]ۘ %-މO?~zOwwjMda⌴C ,0k¶tOO*Yvϧ!xZߏ4mVXHH$IXZ ,Qt;]*V-CU+4osG#2\1įNI2uٱ嵟t4Vcuu,BNdrH+8±e<hkax/Ě_%]JyћtS]TJ!Hij:k_E _ޱz k_<tu?i<46ɶc `#UH|Njpi~HuM!2/G"Hrs__tv$Mgº[_wYkSwElzf}.iA[[+oT`y_5|.^ 4wmݴ6w:h^w(cbfV˕|I񼚷}\k+kBKMM0/l.nA1v@U`XeYx)}d6,o<%2 "q :}Cf+4L22SAs@WYk:7[.m͵ӢI֢~i|\lclJ0QUnMh;\U-k?> l~"^zmKI],2K II\'>)ij_\Eiq6 o;0X24af>`@o#tC׺]w7SDCR .7ł%Y?g|D4C><2z::_Li̞KBrFUH^XYB1r~m~ܥJ>Կg>5oxI[cQ^٤nM {Xi4Zu%͜Kh%L!J*R5wo_MÇV[\i֖${b=$x۷h%䌕o}+z'ڦ+˷Go Wr S1*LVTW7:te:l=YM58迭χ2xڎE[.MRɊlTrÖ' E3[giKn ¹ |]ч wg谲qZw,bM#Nogu n?Jhb2E!q^}_x㏍|SM/twi]EܹdE LPTrF xWV=ߛ SQCpYH?8~_ŏ8|#$^?!N# ppæFk֔\yRVI}=R~'VZW>4p^^Ik<*8ٔ|r0x+~|+5ӝ=E_4ZD^H̥8C^3-VZUMKM9үl#<ëDw4Q7_1O+dW- xfR>2 ~ x|bCm-˵ʜUX':iNkkZ+iOÿ_ )!wZ菦'ӵky.eođ`1h+dKƏ G-I0_X,^4*I)*^1!>|9|WܺOk-6tm-M6h>a9@Sr݌w*uWݖIm>ȑ#1G!@ic6Z{Y}-WvgWV?A :g\ˤçܦqZ>Y,+mc"!🇎ijI,}jV4䫡 !d+νt𥌍sPI9 x$΂6x8Ry\mZ]Kz?짫|,Io^G,z!R{42Lf`3KfhpUU$5~/-4P\Nj7WNgE/'k\dpr w3|G={H :ӼCƴ&X&WX.KH9cPі<kt_gu=4ZRJtcpߨRB<65O d=֭jm64Pӥo~,` k)h5rCxܪ#.OGxZ|;juLH)GIY Vo?"_W3uaOsvn.u+g2PlLTF W2q{Mz(4]xS!ֵKב|9y[:Z2`>BB,DYeӼ1Zk޿_hFAZso*iuɷtR KO(˨X,v-vr\$ tFQ98\~$h4F{iᄰ-(e(G]Ȋ7`rrnuwk3FhK-_^l7-NnYe[B42Q!~V>kxG†ɨy5휖&?[uF돗z^|%G|'kCPՖ[B[{;Ն&'LR5YU,z~,|Kq-}ki Y26d@ӕ湝Kmzyyw|1/nQZkɬJj]M:ޣF67MO|B6^j l-o#{}4{K#Ӥ uq2@b =t# f~|7DQ{Ym=7X҄{^E;̬J2#WaZ[|?5\hm}6O$ #|f!p!IU)VZ7Ogm;:M-t8SQVڿ<)H/&;ՂK6XIH HPVT\Ȭ , OmQkmv#G4R("2KE\>|#׭5B/o,LO#%y-$KnڥdT|/@|7+hlA:PWfFϲ1d.(QXh}{v793ǯK:W$#\ԡ.Fi%4,&&r@̳!~|{⧈ %eOJgҵQ{4lZ;>!~մ/d4mQ&QoTy!yQD[77Goz27 |?gjq5D3G" \JW%DjFI+uNU_Ǜ9J<+xh<k+ET_ ڰgXH.~pDͼc+Ayo,mu[h$X갴b9)XO/w>xc_4OMd|aawf4[N[P v㿂Zmoj_lK+Z7;,ʗ\y ̬B|5þ m'%q[g_.h䜂3[Q\R G+> EѼ=hھOj-uԘ˦j "H%EF% K=g֖,xOv"kc"FxWPjR `o5Έ֗xj3{>gp35Ro7 XbjmŦ{%o%]]ZLvr7 yyOOrJǘg⭗t}WD촍In.i_HOޭkƂq'Yc ~`Mw>$w~ćK#|MhQ;/,<fee, I>R4pQ5t;],/_KKck,^` ąc Eq{F:2 04^mhE>㸖$0-c,-žHנ'ڃR>xÚ.mK[{Kp q,ecȰo)*FF꿴q_έGZE#Z-΋ &j6E~S~7k↙ϋxz slnia%fPZ'OVQ)Y'v-]]{UIoviwC5[TۡNC؍ʉ rH&/??ᴇJ$"].nLk @2`׎|@W<7_4[O Im(hz>h6XNTCɽ=W}{ǭ3qҾ>C'c%Ң"sh"|gR Gfm6K^:д~md5[|<;kK1݃*q W+S5|}EXjůtltrᄖ)%p۔kڂߓʒ3rN{8?N5jh` ^:yF\yr|$Oa>~k:F4Wq]^IhN1(h]#yGS ]σzONZo<9S+NBIyʣ*ŀ|k?mCKDr<2!As*/]'}ɭ>χ /W?ϋu]x J޽I}g[nV{gڬ2ʪ$W5m[T񧏮u?Yio{,pxZe*ڭcxۉya/z|C/Awkg_a6a ʀ)8=@7[X'kmL5C!6Ț{HKbdbΜy޻cJyY~wZ<^3u-wL񝞝k)bGMQN۷0*]!/-żfnR+Իwe21)ݽ&kڦur-NDB2kH7o9-s<7O^zizATk#-%@uu'ʫ2seVgSEy]aN!V|-[/ПXxA.,"%_:8ڰ:ToGA=6O K⎋8:K]9mc- WM߼v;`|u펄ڈ,u4ӧ6ϐS3[#W`rpD%;A)#&2^HcoJPiogFi٤kKV*ܾX$A٤aiƊ>, ic7h8״WDoKYm6kk&X/2uf"2Z&^[59XaeC|³Isž`$ vC[ Wq[é>g"Ue-c2#5CX|vg5NhfVZO^.3WFĈ%Z]\Um2C{LSX^>K_tm?Þ6|coᆎL5ʳwfD]BC0\&ޗbkV 5fhUWΉHЂRJ>w xJkJ,=jKӣ\{{)]Z;@ )+Ӓ˿kmZIne?Am]:ºpx@$Z)VbŖ6Urx^_ǿ*x]CL׼[j-u-r浞Ι*$ٗU;z>%`Դu>mLMqp4*Q3l;=*o&gpWQhmVYKn13\%֫ fDMWVʇ|SjV~1t{E̒ɍHKyVC)]TWw#?+xaxݦ6dzuȲL.~B%foh:m:Ni0^Kh1ۖA!R@^ -¾olg` ͆2g!Ns?Kxo$ t/xGKiģÞ;./Pu)f{f2S2|x$a k?t |Kwov,Y`27(}\ҭyF SWۿS־ x=M:Nد6G,6slCrWj9#?|u5jZ= W-MOcFV*7`gq뻬auI,aC50NH~겠`h5~4h;_7_wk& {mVM6~}9fe{iX ,wNzc- ' 4q y1%u(UB7$㿁4/x:Q>fˍZNXmTR꤂1Ҽ{5kGbҢpsn9#1 bݷ(X y^vf"C w*b$rA [o+3Rګ_>=8AtAd"K{p7uR\xWoMa vڭoMCyl P}~/YZAY\[Zix[ [sA$AN|y"G#[qϨV|>}ꑶh[%WJ/;Mօ9R!<nyFߣ7]&O>)j!4ZuƱsoCĘ0s!M̽p6ؤS+Zo9>b9a=ݵi:ޱI,4%ql|zT%xCTY\Ys:(nQ 8]:;i >go"%A{yV;h6Wm''[|("68ڪf#;dzëcSyR%DA@F4uloA5NOP|t>ɜ*bpBM\)]ٰMC-OM.t=Y淗΄|?$`sV@{XQYG$;& iPmی>I<ײ|g⧈IZֵiԏsrmYC$3 X1v,If\44†F*|]Wx}S T`MqʚNPrZVm6.YdXEeۃFI9lޓJg4k1(b*snk}i-':?um&Xsq`98{ǹ,*Ȳ; 8h'v8ƒ\w+12Mnp H,(IܨwVC[v kp$eϥzid4FaFZVrC`\K{MYcV`@(OdgV5bp=:syhn1o8!ˉ#ʜ.Jyկu+JeW$H~fG su^W77 z}2Gd^l|IV  #~` I qJֹw8ٮH%@_!ʁB g?cQوu;o:XnAꪾX#*$ B~E`FK0`@?0?),DRLKqV~Si>ӣʺYqҸұl+þK-=&>u 0'B@ #be~_Dvq >ӭkEou޽@##83OOڸ$l%g_´r*չ=ܮ[Xy%.iSimpPj6H"*\"qH 8$qS\B9<ɼ>B$۸þ-G υK-lm4ÌAVmߕm: J,3'%'F?FkFЏKA- 7=pwmBCǴ*n'H" [co ly3t$;KrJkeFXJ;$rq:IQNʑ>!OPC{@L^Nbx^Ve1; FrǧNG5bFteF 5'cW! H끑]_o_>$xڦeqG$K;pVheIU B9|kqk];E5]TEwkllp«ob[e bI'}(ǕʤZC # 2 Y y`oX5щ㑞B_Tc #GGV;ɵ'&9 $>F&gED~]i$gc?.o&#L/0)(, "  1S;خizu{ ,ri?}vŸ1#(InY/"O S(b wSo| +H. $e]:G_7 K=條94U΄3'M2fy8 ^v}n& xEִKj]@260,0y'6%]ωMRȫiZV+ {֎BIPTb>e9w mr/&8HSpRDK*\2p>nk丂K48\| ƷQVR ;Ks iF$88\MK-ss:̏hNj,/JI5|}Licyx#lfC*4>F#B?,qӨ|]jez֥Qg%̞Z?b$m /ڮK[{cT f#:ѻ,#^t^|;-G?]_6-A, 6;y6\S C>!{}0ZyqHAŹcKj:%g/hچ8 x/y}'Nk˘;?|1JcIÓVZ1^LmggLI]JPzp[okiy_7(גͨZ.iibc8ҕ æ@lUnx^խP}Ge9-@7P.Xbߍf=wUO 7HOCFXwmo'9fѓO׊`Ѽ3eh3 ۨ2.$Wg2Hi-ڎ; LTu\oB~8\$ԗ6vuo"y3yWvo۾)2˹Wv1W^O? x[M'3N&Ow{na ɽ6o?6Sz)%ww~G%J#-{ާ_|HVi?;[ʐĥ2+1'>1jM]V G\1$q1r>186<={<'latʪl?ÿvL[ŋH:҄Z9I9>7|x {]oSSZ]^(tkwkmoo}xaYWp>r%T27=2躝X%G|Z9wC>8F][욤/#me)))E;}xOaiv_ϩB |{;|YyT<2G)7o4OTS{O]CRHVIUY `WpP;+Se[gcq rF! M/RY'fn.aCy`+=YJg-CǮoy$Io\%ЗNԃRkR]6O;OӬ;?Íou$*`KK*V5[`=&yx^J%mu6̘PE rAI8>>5 x"҅^ `h_2m? ZcoVVKQr/3J[.P>ȮtӋјaƤy_x/Nefu8tuI/Q[&c-<.[WA+^C[qJ져yR̢!U@U,vwsz5現]:fkCj׿fy@leR,ːΤqh*iF C5ƾMÏV,qK-炴/T<81RHxgO_|u/Oxž#7k%`GƗd#m9uּm -KAui'y%gc\F*1M P7a~.] *ћM|S^%­)J토֛I{&S^*GY9Shy &BnH= }o~6~8I4xcHѴ#<7,d,6mwzTH,>?E~I5w4k˫fKo4nͼp#NJ|g EkQں:\\_6Og>bHj |;}y wSv]2cxC U`hEmʮ ٗg-c\/46և}U,4 `p[< uX`1yb_?uB?#qtr5im,kfR:FY˖ ̧,îJ_uZ-ӴegmkLw/ηk]K,zjn"r- s d "6 x$u/xfx4*^ķs±)Ib7+#np߱xcDFb94i$cފrx^Ad`%YgGyij- $pT>/q/z#.X([zivtč{<ws H%ˉ!%a==nuV~E3 WUgY`ckvdVhͯ:/xP$_m4=oCԴ"Q3KƗdCȏr%ΉV |↼Ӥx5E<ͥ.|g>CD]wسeU,Xʬm.YegSzuFݼ`V@,7}2vAfK\>!-핢zΗ,^%Js8FmXQ3ȼ7a VB֪KiRJ+;‘ @]ݘ_q ,t-#N ,_ao'g)ѫ,6 :#}[ƞ Q^{۫DKfg.tF PФ+Wɺbks]7Sޤ$c૳f 0=]o|g9o h eZ +BbRHGYvT =ƩEjv֏IV2kcU~u[3^Tp~S9mR{]_ὗk:V=Ѱ,+ F B52pk׺/|C6QF$ҳ{vvalq+,7++r<1VN#Qukmumoyf=Iq XxNQZ_sg}t(_χۭ=MFlfiZoE8b6\~s"IjYJ}2s$iddTܪ1"G޾?^7ux~ȥ]Ge rFe|Cȣ T|[*Z']yet>LȲ:!R0wFAt8Њm61-b>--P^Ḭ>ŷc\!6;YDy/>5՞hhi%8`{Jcq7sϮ_@]կ(.4>Ep!@i)B GO~ ]?~%D_N|mo\posiw O$C^k 22JoKCe+Yn7J73jG& 9L#}o2euk5owaU_mxXhQMN#Դ)&F/2O\!E,LrƷ:W~#ﶦX)f+Ek0T A|ۏ٧~Oᶏ?.o#Zo0O8Sy&zox:cEȱX_!pݙH/:q+{Ö0sڸZiu?OmJE$}RY,c#TKx&}kz'S%m>XHo k 'uGB5[g#"r0yĎ#yo[tK~ ˲h\)ddf*ccX`Kf1RrdFv=_m|uizƫ;nO %q"?؞!fZvGfL Kia6ٽ^0aG/xVW<-/CxTg1Kuet0g&wVVS{kݶz'vOgwƾw[mGA=uǵEst Ix0%2Iem?X[WjqIuv#dL';0RA_|;=3S'/,ΚE$RY_~ -;T3DŲv'U-ONI~ؕhMqm,29_a#pSNN]/X;[}71܇!med(~0BX*W$"}uV鮞wS4ȮϦO8߆>(Ⱦ [-mnNɺlٿ;Yp=Kψ*{;m,`/wk"VK\1VGc[|o%W4wBN/ti Vwc)(xjk3OOMw"G#aUy0r9ԛ۷eeZZ}gSJGx~u},#:J*r#mcŒ"?ǚo<25 A$znKN,#w`|m'`Zɔn-4]JvmCז06#h ?O4{8]]-'Z4F ^Y Ap\yFS q)JvOb}ģ>y٣kwW_"k˫,)[KqAxrRwQ렽^׃4Koqb$=J]S4qֆGrP lVz/:geCe7έ#`2;+7qoiM^:dѭv:ci-cbrE+n Nި._j)?Z_x/shzVWַ7~YK[URa)qy2N%!7὆@Vvhw}Hj1#]FK,9"H|dn@ 6}-v^#xCly*N#$1{`sw ~x?FxÚ5):͔Y&xHG >RUt%i;m l9Rk~Ǿ[~*fԴzO JeR[K26 +8V$7u c&;u}1FѬ~t 6p?r>|0_1>+iaլoUdEc tY!9d&_x,4QqyYYۧڴс;UZY<ьa/KUEw|oD/mua5lQ<6Hg $_4cH Wv6%˗wcT-UבOk"}8= YnH"B@qȮ܃HBZ44GfRg$UK6| 3viVE"PmcbyIV\AA\{}2hr!x4 @h)٤WI=_Z9OUo3ӵO k2Xx[]\@WJ=ByPBaǑ^k^Ğj,L Y Q9cԎ|~׼58~di7&8̸g&gH#3~_i^-:kƊ$;L:r - BM6~kW9xZ_n4fh/ei+,&ݤ1Ijlx]e^_CxOhQwwxs8hIpkoVJ|CsmKkw-&MF),cb*] [gqxkG4"փG j.YB\.Bc# T66WnJ ާ-tA%#^ᇗ' + 7ߍtw{.k.#YKsޡJ^D9PA''y/Ucdwg N ɸF #|5o| mLԵMSR4L:FbeIV SŪZOoV [NeN'ץS0-G9$51݁|-KĞ"i!6\ȑ,+,e< 0߇WUմO}ZQԞ_1_V&>|&)Ĥ|ׄ|A/oKqxnĖvnnm(#v;w}駙a4iԵM5i6sif/tO~0iu5{_G̸H[J\^p$B3" C>{+"(.mb{yb=ݣ1-1v>;H𦩬|+-i睥j5N$7E^GeTrj}}wƁa<{p?sH71F́r½ZM5.MyoTV#/tR}LZI#ϹR=(E@#Øz|~xIx{hjڜHEpfH&EG ۈx;kz⛋CN4k:_}5;k3x2˼e]wW֛Ru|.[ı%ǭVJ+.^;u )ZMÚ<[Vw]|5xI>)ixSK&kgEp.x0eݒ漣EƧxeG5k\;"dzLSw|P?O߈,EIaj!{7/Ey"*G&D#+Q|!|/m1;}'k4{dDW(մ.}O}^VVho/|4Dz ޳PO+HY;EF+(~ i?5yax:Ωq&dt. o B%KK#Ú JNi,E[N"F¢%Hv,ʣ#[~;5V:>I+'R2ŧz3+gMn6L*/}.Nt]QƠ_t "|oxS]cJגyҎ#(GyCFF?d>c,dot|C Z:7tڍ-cD5ǑX5T`QsZQƧ㛑&cWSېdW e7AG8~0;#5ߍ|? |7tmeoumY7fHѦb #PU>iJ[vI|nݍ)6NŦk3ʇG..baY! vPJ8{? !K ּ eM+=7Tka JJ,:HG Ѿq|@ᯈctj+rG I.I[s˪a\֪}4/-W9T^*ǀc<{(Z4exF]>}UJ=TǣPIhE="[#%s) 1]ON^Uln&2G--uh]_z|E0͝vCּ/;t=m:=bhS]A'XcC6H'%2sԟ-k-(j$Z/ Om;^Eo5Dh"O s}I?i}IԵo j[^][%mE巷XjV4lrK㯋qSZ|7o. n/~*w*D(@0i i~xSϏѭn㸞)lasđB3CD䪃 պkMޗuS(?ǿx⧍5t_W4Rkq 3$l;@A5GuۯkC[]Y/$o KC\7Rޟ{o <:ֳk֖ZFln({RYq]Z_u'kxR{F+%E}"E-iK7A;EWѽ޽6fϮzdžI4&ݙu 'ZԦ{D0>\Y HܹKcS2aaYEoJWkeI2DDC ,p t5 x_ċ˘)[ϱCem|%gRPn,SgTmd춊2-CJ2w|LKW7Osꟴq7[ )K>DSnI#K'\Gy!;-~>H?Fעtk+&-3PFtmInN0|~Ohׇl5.O MG Ư El2IU.Y-<7UdX%`4Cbx 5R۫4~T8jJU={G<&:GGm“%I0`p_((#<'Oj>+/[r-K)dF*j~~ЗDԵ/ͩߥETw[<<%I_+Yg/֑| Wͫx/Oi0Ve{1IvF$gVRvk'>C·ʹiu;֬dvH[oq܍41ѓk6Ҥż֏Tާ?X#:גkZMGNEȷHea oVچ]2UkZ#1[xP$N.me$: mFX|Zk%eѫ^׷5%g{u5߭ѿ~cRWk\45k:`ly-gC3*U\|?O t}o6:d^ֵMv@$7*m GU#`xJ‘⏄1o<_VBKwLwg5(A* YwK?!xokg/tO:|~lrns4a4gzJ[*p w^)ľ8ׯm:7-HF_rw1յM¶^>_4Z57.JcxdFcH !`<;\I-0heݟa$,74nU6'9bݴhj+쵛Gn;K2SZ[B~`ܒJFvJΗfmF[xđ]@K[tҶ|+oaP9#h^îۍ{kS2苬NrBnEL@6.(¯!s=Ú5v׶MպZ3`42yղI\^i莊3Wq-kƾ$O< kcEdnfo3D)`\nW~_~?k3e4m6դ`e\~ȭ\<¡)3# kyy-*;[cs{caݼ&<+EnN8k7iKykJdwbϺ`B@lΒ]ʉJ M#LGƋ ~~dPhVjJR)A%X]0Y1j`ï?by|\zpUZ0sD ĦvH-c-PFg;NrA:[Squs` A-ŝn6HQLW=NhyoiOg krk/\ŖVK[sY]ef*Br|%7M6Um6+Ir"; c yvv*,.5 eM"!b K0r]B05~',MVcբm97yݳ+M3aQ#%sJG'o./\FR!MiU9Vm.- f!yq$(QAt-T0IAt toUý*Yޢ[4,< 6rf o箣Ǻv_h㨧Ե=FKitYO+7P,C>Q(I85NpM}O>)? ~x+A|AqLu?KnZC$Lc)1ۜ>!~R%,W B 90&Afh4|ıķPYm-`m[I!0LnG#<Ooė:UYMmsjWkY7h8̎\ ;);?N&2P~$> FO=]ν|?SM[ޱ !W&<6>h^Si^)g|;kFW 4W -d@y+?mϏ0dYAѩr I?j/V#s *E"˝vl& ,-t'-.}~;-lhcY\[\ .5;l8<ޟ4W_5=CSAmiOiIT[bZ;1VK9ъ}߬U$kDb5Z\jvtbp,H܃(/ 6Iht^ti_0t"m$䕊7־G?%Ok$a`O _2X]'ͻh݌d/ٛ㏉|#?>xĚ 1.+kJgxn,q0;QUj3J}??C,مc_62Hm̽xOsR=S嶭Xyh1i=EqPa*2GYAΈjs}/E74mu Y XpdGwPxC@R#Y%*meXfx\V;K¬VҔ.OKmkv,Ү.k u%IfV"PΨ!wrq1qŧ"soulv\xWoVKҼ.oo[kwPVHpU gf= C%{-&_. )Pp`0ۏۅ]uڢr3G"Be-+)# ry*6Rkk^<`%@d]y0vV9^+.|+G-o-Աg)RE"2 FA C} )bc $U*@ O-pv N\.W<\V)vǽZ\C}P%Vj ͲɞдR'9v<7h4XCK:dA` wS@K"dpq߰<4 Y7rN8mRp39ei Os ?7A\P&it0庲C`IdߩA_k|SXT_5]_L/PXqq~*6\?t]tVimd%%\M[})\TP SIYB tesq}+e`2`_Tnv0O$"tB\jFqX9Kğ i62‡Rp^:BA>zOe`㻀OA5>(5].=+Pg%(=q88<x YÝHO%zԜcJ]ipwqs#+mǒa<9WfvRIHw6ÑБڝ" iHq8 cڊR㦧d܉Akvr}~SPG#50ַ1$CG+cwU[7,wZY: KMFrt\Oݗ' + ;xd0TtFRjpH#kg|J1cˎY/+NsӜ1imwgtfTFu>`N^O?'*^gOam%a2w)!Ly]7y۹6Uasydm׎kxsR^Pvͱs['pNk4QLa MBNN3T ъ-95عs1K=˝s#G,`R>~Iݒq9GSxA ,3 *~^p$ȯSk4 q7Zuͩj:X7 Ċ C?tWOsw%yB%nZ,Ϙ?[ڷS٤w^:_j֫$EZ@uE zj5=j &-bKI&nY'UAN ; "ő!qQ<SU5PGK rͱex;89JDOVo/Σ[>aomj5 :IH8W,0Oҟ|9dk6^i`j;(#nl쒪 e#aA9^Ѭ&5I]-oV,Ӭx0b3jZ yJ6WOΡ[@2ye YKߴx⏃MhcƱ\aQ*e=3:>xs\fI" ֿ|5g%ČYq!"%. N<⯆1+T>(u-#S\NCNaWҗ-g[GgS/4_k(Ibv3=4G$| mt|٥h% or̨RXKp~wx!Z6s$PḼ v6)6͐xvF5R\n<7ͫqc\'l>sO:Td:u+ JZGvI#]#p*GG#{|(=dP J{۹Uy.{4kj#\Kq ̗vww< Mea\;JTp%^KvRz%y7Iv8u:r?RݮJ%y͍gMbK:BK&Mn E|@̅301Z'C<_uz ^}FKqӸ"]UppA$d4O7aIL'PI9ȐFESqkcx/8LNQ0$^ \nnE}? ^ζُ=VFKB&'oLjԴTOT(g0zu=ilu9mV% :6ko•KƏm?Q}F]6)Rs=]Sq5BkߧS"1a'Ӷg^ N 6~FQًXy,itW E'8ouOiLݔx'i7 4QyQۤ~r٬.#֝nNG hSq[iSI64.oG!hg;t Οfˤ~>}z"g6E͜* غwEhdܾa~RyifL΀~*|Nq#< cϨOɵ/iiYJۥJ%WO)[ϚygV.bep@کRIIjM-Fږ{uci}-K c9VFWIvFq]j??m4Eujr(-sc{+)A$ѸS Bjj=u얗?6m3+Q,Ȇ@&+l$)8w14mj _v7]+}jaVT9!f@ \6HyjۗZWL-DP}]Ϸh* `qO/>iNK2 # So;$#)mTo U4[hoYEdYb2Z"&weNH-*?9ipXx[B&3ڤt :VK`.>l xSmk/'Xgէ֮m%aD ;%Ӄ(}_ 0<9~Mw~%ͪ!0$Y-t(,35x[ᎍ_ xbLOZxƺ`]Mfl>njX]$˴@dxjcWVH{ 2& ' _#} Au9,c{k8sKU*XNYSwHn;i&J~LW pXMz?c Kݻ56zuIu]ՓVtmth)ciX7܍4;`˞UYU-f 7dtvj_f62DH$sMMU?%մij ݀kygG\egYՁ–aOj4ᏉE+Zݲ{$YYfD2#xU4g;^BnL2#yca$dc/xcsE;Y}Nр]9>rF#Cr R[]N|ֶ߭-Ÿh,lB֭tI.|"[sprFح^Ÿo,> ׊'I خm2HC/>0F4i4fԮ.g- [\[5&ɮ'ƚdWPfHF,aB8mܨ1#Eggku#pG:LJConcsn-&EC4RI!o3Wߋ kڬzP 4r[eFsA¬I||Rl|'kSڅ|C-.-4֗/42o&02w7~&~i5? :ݶ WSi$i66Cv{6gQǙ['t_>W>xU6kItwMZ#R l6$TVM+'¶|oaO閺ݧif!ko"2"Eq׾&w@Ҥ9べRX&xJ&㛘S2O>${Qq-1˱ @ 0(V8B3RtooNAW :h!a~S C|Qo $y`H3[A1L\ 6>/xcN%x׌.-cJbVkȢ q8!(WEXxn=#MY ϰ%Ѽ!nJ)]0BpIK~墿u4ŗڅ{a 'ds0ktM̙Kg?ioԵφxkP,c>*Ӥ ,3G[6//to\YK9&Le%GvYt5VfZZ.7ѼAM ٤MJFW Al|VFn{ᯊ"_Ɓךt">^|5f _L|%_Q:,ڤ2/#U@Y.g"%vί&ތ[ ^wZzW4uTbF~_kMJ\:r4^&KmJO ٓ巓lr C)b>KUڟV@ZGY5%3xFY@A9GO:izmkIa%ŝp! ꋉR,eL׻|bSú>E:-Z'tmJ+[P6;8g帵sl%e}WzNsNOm~Y+xn^c?_h&ԠKq<%H)*T&`o;cl |Wqm4XvϦK5>tv &H U#A ~>|@YX|LOxFeE͵ hqs924Nܬ~%B/|YmB+OP^\ZqkwT| 6ɁyԤ5mMO/z:6o.zɅ4U!RD"ڸ?(h ooiqR|-/-Ri|#TW1S'OU5XMm'YK)eXHKeG(%vl|{J6-Ӌa2FhՕvk BZ= W teF{t^m:K﬒B:iy>n~iUdNM5i-#HFa#p;?hxĺ{qc<}8ޢ({{eipx+d?/x}^еmV{iz|3_AwmVI+]H0 (4o>bhŧͽϺ7xH-Dum,{U,cK{vP58nj{xZ>j + n{ _9]dT Wc}y5IҺooc ڲ]Oν}Zlo]?P{vX'PjgibU $qp=)g'֡.hS}Z,Hc`2+q'u9n~xbto6r&H[7@ eG7Wamžo^ՍC TUP]nFߣ馽v4leᶩ|Ta[\ZèA:|^+Kn"'[q=6X-t\w $Ѳ3|Ѱ!~xV?>9[j/,oKHʹQC.|Rp_?S~_ŽNզOzy<ڌzŢLQQC 2ƻj6.յVPRDl^HPy@u©te@渡E7fw[鯖'+7_74|a_ N[2Of6B)I.Y 4`R_ @z3OFVtBt9U㲐ޣU1MIF$^5G>~ My?61YjꐏwnK4$eC |1P֥\Qiu/mat&^ {jܑjq+bfXi 21(pݒI>>æ߅~NdoPq5ʇ18Pg~$9n1|?7&HБm$n6ɺDަNWs9f4ܩJ6~h,e5R/o+߈O!RyEhic F$w sv>y4ۥkvkY2emI\Ğ ’\]ZD#n5{8ydC"A[¸%KW%~{YFlщT*F~?ck|eV?J<#fm[i3q7َoF G˻|wkFM6<%f/MälVsixbNx&ewؼz)IĮ:#19j> o?Omw|-#˹{vxR4 ڍ)B0ARďu%x {sEeuKoy $ N0lBU$Wwk!G]mWվmEg["Lqz|8|O>86FB3 IIʫ28$rr>,4ᖛuW7R0zzۡPDCCv5?xNܖK|l{K-ċn9f%7 ֵk:N>wZh]f[O=ĺdW!{%mnnxP xxW~!xE~d/,ICGq̏'kqzSrϷ0aMdj^ZmƲfXմkHyMTuh%Yva2 -']#ƾ#;_-gLo -ʹ)\XSfUqM84Zreeu)k4YgVůx m,iUtރSyg0 AoG|M}^&];FfVNxp!d|9uR KZ_[LX.C}ڧdE6;t2&&o·>˩jZeͮh%Dܟ1eՑo!FVo56Sn:5wi^zt޽g?x%ܶ:ڗNl$>e6XGrm:>u]7^u  xQ>1Am~tDlb@Ya3|J#G1\}c&xv ʓtCyzV*P`՛w+t|'|E!'+y8Ԩ]++_)}oJR\|F׌t?T׼_hi,=>Gh-GG"AlF .-XZgjB0hH|,1[eUL<h6ZfPYK4P8)tfB$9$j::e:#M62b 0 3pJ ZY[ghp^Oi]ϊ5] \P¯/V2")F o]_KO ƛh$k$0kHHQ'G RGxsV?wT4M?Fk"֡G)|m\H_ORxWtKAh0$ncy-V;i`9eJ\nnIGmVW(J[N_o:7cYm.M4i1n-`y~EO<0+1/k֏4xbtkD{{:\дN؁gQ}]ˏi;Ljtz[V8څݦDO,"A bUu+V"&mk:|vV/hs$~[!RmQk+'[ӥNM+q(|y/[ "@֮/ in5g03p8 %bҽ+)x|G?e[tm5)` k{#Θ,Ѱqd@vq8 D-Njn[KomKyndBLd?!I=qsڗi,o|O>xV6z K$~Io0"䓞1QRzlݴz-۽ΞKE6yDž>"I]խַo q$KpzRֵm.L@%-( vF($0}^^'4=K@'#{hVXdċ3mmTTm|:_!>eݭs =1H%XA$rjx)$jQCFWt:|f#Ï|hxLѦҴ3Kmo摕c( `;6_=?wOC/ bR}_ؕ.-e!22D#^"Ӽiu k#Mn;vHU-&^HlHSF 0Vo|6|KNIśLӵ)/KewX\jKpU QDy]y?Ougۣ2P`ƱO iVɭiob kI$'$[$mPmwš jZ寈4h7:r‚y-$39  E:4ෆm佚[61ɮy[{4QvJ`e$` `|=eMszNѮĖܾ"Dm@Fa|Z1z{]^3Qj-y4PI.%OK$m< *gn$e) y>?ر{qm. D#3,EI62+6u5[Z%Mv7V$23$ܨqxĖ I ^#mu%x-!Vk2E),BH%pƳ|s[#0jx$$[Mo [L~ma$fϥ/Y{x + itilMͼ^NRUwW]-,8$W/Tok>PB;CmJYl1Pc$`˟B_2xm<~ #4ؙdQ<"bUr^wm/>Ty fғ_hQkwg3m}ajhe%Nw @>UjzvM<);\k- ^]I&/$2G4mR,r+JWAk#A KޝAoL"-y#|dr@6 7nzݳ>Pa_sО&O ]Ѭ>vךu<-ݰ #L!T🋓znu IKik=%l Wפ?+ ږ܈4Hmˤ a^7hk+R$ח6f:Ԥ|T٢gKM{sYԯ5K l )4qko(y' dc?!i͗nu[ [mE>a͂sEGEx Yux/ ZǠM.rMy,r=űJ0ʻ\tH|E2Ewm}Me!r lswׄ=/ﯓ>O%k KgAY Sx>LF}owk01\Fv}o4oP@գ!h ; |9;g _|Gp5wAq #PMys$[y r{_M]jUreZMuWWZvkeGymnBb(.&| #/{lRܰ UkpVWN⟄ɦ^vL0yҁ>&Ex*~ "6Z@"nHE22ț>W<1k]{-kH)Ea>KPgcrt/Y:f?On&HYw!yF\J} km=4%GkpijD1fRN~Bׅ)4vA[BW6.E_֗ Q=߆k-WY]cyM7XiV_/ҾR#׮^ll!7pv5!<,8%}>i-$1گaG76~A\7Ks ՙz<\ͦKp֚00RioY%f:v`'M:!a+Eu(Bo7-fڏ>#^iqlfM(t)G[94(oO%xtdَ[(%22#9keh'NJ_/di<#z$I]0Q &摢wX[>b!.oEյhỵAqwAKIyB` _}bjtM&m-lu2YŴC2,ԦTS":FhL26q@-$`f'Gp HJ>NO?4Է5Ҝeozϙ_.ީݟ?Ygw$v0J\]P( YKpb+ PUuaYjw-w N%h;.w)DPõU:z-[X]ϔA*$^UW`#<˫ _Zj7] Vx #G3(F9[TMy*6u<~k.nٗ#,ֳJ|ro~*7N$Qtta,0 +S?uA[_j5u;  B 06Z 5Eu%ݐx $oh&x$`ܠN4R峝9~] 3RO_%-x^K)$&HNJrv$ӅڲFd~~߷Oۻ OGg-#L4)pkZ_"Thn!%$Ҩ6懎!QlC2- pHx>l߉&+M>] Cz{kCsyl H;/= MFk rr%JBQKɗf'HQ^ ^)/Wmq0fY[TkcS&;÷=1"4jAtHX%6JCrI!^}@}6,7>'[YslI!e<+maG9M_:f ͕HbiE@O"C6T(sayLi (d aQ BMCՄz 趓ڼ}ŭs '` yv9(^ >xSZ=;~%翱$ܨyK}E+ԽN}w4$vH~:7A'_NVXT{\n-V8nI$hl:׋IDn-uK)&#ihZʃ#N<|p~KCǢ!Z ։}" ;A|8|<͟4G5)-)61Sndť\eU]Fk:9ݷmB)Ap6}T/u/->u qw%yٱ:gfS-v!3FzpT>H7I/pOs JQԨ#k@9V3BCO-r_0*YHG@>]h6(؛yփk[hZVشHl,9fwQREx__~ xYDjv:煵_Y1>ۚ6ILy pIG~ͯ>bŞIu=Le[J4`ׂіʂ_* ^x6IM+WVZDș;q_U8s`QOڤ姺iF[7i.U1x66%PUS=%5'dǙrxj6Ҽ |=m2H~(P36` \n~'(7wZx"Iek4a[ I#iqƩkKl !JZa*0?8?trFAu먬Ks1pdc7$9e|;7`u5nǨ_^ׯ5+ٵ6K5m(x89hݫ7G[{ҫg,q[ 72ȣ*_z~gwxKh; c TsԖR~ZKx: I+d8%pH97!ԼJucYRPdtr 0EMyoe2̦IO/s&QdRNI As^~kRq [L[ ;I8 ey.mUX11`TI>꒸QNK9a-[G pʣʄ$9YTjQ`y{ ?cH<50/5PM" .ziY emWwv9!v9x˒[:E:_욊/ D;ha2;m wJ ^5;r_#(; YkαQb=։^ڴImosoaB4\t~}I[>o$0LspA=ɮN๒UG,rI㩭KY͵bbJ.+q9￴WqCl⿍ZXQ,2FZ6wciq^s f_ԩy4SJME>Fn1j7\]VhƼpҕ$^KwXIE:$)|'΋3 @9$6_?IgolY- !oy!IO}W(Y%sYKSP?c{[_t5ٴ]9G9Pg'd%NJ >lxg/xNu]*u+;ȌsE,dEeNx3pEx+OEo*h D2(<ҹyPk5ąYgb 1bsOJN.Qߩ1m},7(}ş,r7 $7Q鏭woKo M?Jſ\Gt28R+Ѵ/SmBx191 ͚#V gk7c9=Ri-Q{zOs$. sWF7`jx)"iIhj,`˳H U0ٸx[ڪK%o-7^l=NEȁ@ ձA83u uEx^+k"~olgWiqCJu㞸emc ޵5-f[#\__'[E)Žehyt$/k)3Y 6݃t{Xgtm;ۗ;;c25a麉tvwRm5ccJԴ4[vAu,Ib)laIlI,L%,k7F:W^wᕕiH6jqnSeM͆TeM7 +t!MK|/.u#t:.Y]5u&ߑ iޫ=ֲōjJxfD[ "mt$ctm:Yrʡ#hw?*!@,N'5? iϧܝ\\$]5llW 1;gyMo1F|#9 ;rs5LuJ˵J#RUカ:}gEUx|+$|a!hv@\S[=5>wPC[̒eLA`:VFuwN-a Oq5@0P#_Ŀt?ᯂ<9m}⻙n"Q5K@n [#{[ӄ_wS|e ڤq:/3XI 7L O_Csৌ+ #:cG6"HU훃?𝞣hj~RxdT-1)]hC[\uu };grc$ YRA`I } h_ľ74m"+b?--3崉eD\*5>BGɸC! S VZU牴=;[U6 W !C ׭)6!4eǛ3@U8% N{~̟'x6o uxrK!|K'TDy@}i%0_;'+?^5RDu+-l/L Mg5iͰg(Z*9E%{aZTf+(Wǔ<t[Hy&潌w/&'g~65[-4fz'tAqm*C$i{.H;H_Ěޕ}YNM7Bu4oi q8nEU x5Xȑv j jFp:/obS>*xSx*;WM_춲G'φuIZ )dfU*n CA^ ֿNubl/*9 ! P?>"i:~oF,.Ԓ)1O)q1wfEdRV{w{ϖQ΅=xλ ƾ<7W^5XFIekAyQ,`4i6(W<7}l49M,1y4w+GO0ᯈFu7ŖX P8Pͻ2 0);SR(5M3ʻuH /k,S0F-.d] n2C־Xx_Imgi6n/4Ep] 1}77-{K%nmeY]07wQ]Ck_POèjY?y$kRF65\o;_ޯ( VءQqp1\ 2+Џ,"ֶigFn'Ƴ^N6K{>ߋ>$i|NuZM5ܗxNK#\ؙU$rFMzo#f?񭶛igkv MH`TBx݅V8w|-gi>4[k ?Sr67K!&` +ȵh=vSi.m%[ou&<$lS#3`.sb7o3w_}fEaKY9d)("2yױ|,u6ៈ^ĺE~ʺfmh-`;Ơ\B^iyxc_3 q.esʢ*'i^-Қ+twa"g-!6n~&8Rv}צ}7?hS= .ĺVl> AMFM%- $3~!뺮wPh%?a="EZ`.%cܒ>=+u_0i:mGזOk)3u2;˪yLnRę~!|'R/h&Xz/" -դ*Paf#ҥzD|q)Fiv_}O7oEm<o}>[$e]>W\kzroP:j,wl׍im4dHTMFcšs_ NJ,fQn;P|!آ5neִ Լ3iz\.fbNPQ) ?xQ'CI`hDW m-,o*PFs |Qׯ<#Zw%tU ۧ R6# iqD0;h% V 3V%:~&ܩL|#FNl-fb4.h lZGHc/~~Ͳxtxk]֭|Ήkeҡguj cyr4Spp[x>"tzLoB%+q=!6vd e1:iW~H5[y,sh<Ȝq$fx4ί.xᶬ|]-f{{ڪaPzyx@E*@0a+ʮ㷻WBҧVד%KH9U#,kG2|1ҾnCkZX=ym(lXvT-߇5#}Eačum)TܸxC? *Ek"$/ xºdvkE̘[mf2䝯P|[c6IiZ2ψ𕯌{_KgV;,iSoF!$gëox(y{]Aey웞KD 3ŞԵO y5 ɬivfR`xhvni\yxxoޗQ2_#u_3gMs(EA߀&}n0kړ|$<Vj_X'>i] \&YVV#s`? CxOz5ů[m.% xu~+>4[ 40˗I"Uqm#τSg{O|PHЭDƃ 1DhABv*m.&KkoU8 wkƚ<b5M;V\hXCqѥ:żx>мk_ɧO6=*Z%R eu2Ky$Ж ,[wd|K:.ЅR)n핦RQɵi!H'j yԼGamuk{K ک5;n[nړ02+m $Nv5|*nVOo>-z4?#֘\U24+˖HHmΧnҤ.?x>z-o㏀~ XFοxUvC6$)t\y&dVxZ~4YvZ޲Wu l?bo-dYTu";;`8%x+[o~2ѼEi^(ٮ_asgg[Ep07vq,ֻXfYDf2$+\b޶kW<4^RqcvƟ"ִ/zyl.. 6r~I"IuÞ?G^%5"5_P{49㲻,wv(C. S'⇂g i j[k$vyՒJw;׾!i(ׇKNLS|?V62ȗS˾7P#_yT9+_{MViOB53uK 'ebޡm\@ ĸ)X:4UE%8QrNڧ_~1i:4:} O2]B-0Puzo凈i97N k$[19f% | 8mƉ h5 nvvA$wesܨya_N8TmJ7{vQFiӚn5sṻ́%7P}VEF6)Ϟ2u^VwL߉d:tdx2n"$2b)'$n _ď/Ï>"7ZMHq]cnb335||m{߈ jz mJR]x+Xf .BxO~/ӮjF{ȵ ZJeX][fM_j-BฒPQ[iU H`di;O y$1XubC)$pFA!2_g|FXt_&cIt6/yrZK >6}dm1TҷTgG7߲k? R HG-iz7eMJy[͔M }|l =xN٦9gi~@""t1T!z6 ;G|c\RMJ~"HШee.̻ W˯_o/ᰒYL-yv<-"FXWh *\"]ZnKnZyQI(r_#մCM(o.u!gihZ!v<΅cx^G:7uXWPG2AuwarʬD"6ՙN._fܲĂ> ƟhIB,nt՗M≛Y|Y$c~G_7/|@>n@mOZ@uWyI{YpL,g]ӭ)(F n#FuIdij> /7O4W(e%`f‚|,ym"dWE.[%fYHdb. hP_q5YĞ;xmͣ-C\IA.-I8zp\WG`yEՖ@.&d+28uRAfcܱV֫>o #|2qK$vU-:rm1W/ߊN]|y,n$ĪLeL)|YP;9\x1Xدi0lHHimGQbL:t-dDwDGFK.RH啮dP W d(aiUKWJ vqa;M⫭8C2\63BH;dI]fN9k^C=)iLmIw?h$sZXse8Oq|5|ug;R0,дl6B|\xfL?%Z&߉ 0io<7s$H8`>e{t_N^^v-kt|- \^QNOBwwd ؑL8t]Ea/ﲩ[%cYmArD%FnK]#>%)g i4rci#S!i-⾨o 4c7$Adֱ/k:Ƿ?,pɽ@rkޫ)A$J*9CT|զj_ƺF #^CWPo4XZCC2y:l쫈p5vV]9W][OmJz#x_S~!vM?L0NpoYڴfd bc c־*jzksM.HlAsj+;8p*H86 xW^ cB2ۿ9R1"<.*E@'(~/|UiV|A^i$u.c #^VEs&7aVHT+k+hq3w4?Lmkh叇-7Rok8V;R]G,sW\0Q'7uh{dס'"5G"i2e]p|ף%/jK]fyOS( [\o!^6d<`_43ῌb}I%oO";' LFe:# /TfOWnT]|s /;{2/]_XY/Pڽ69Ub</ |1Yxj[|m# ~ڶP'HC~Vb3'|K/ i4k^k,6+ KwmT dm.wS^^ >1O]kKY>Z&#ʿej)tUŠXS+RK{}u**u͝클G.PtDIekq J~(,<%iWQ>Mk gQԯ&s<34ʑ-o1bf&࿊/kYOHnlyk6iLw8*Q''p|qX9ZV79/ Of)h|("վ I}n=:D\Of!FY6 sZOK:W?/íI;G6q4j2̮ (Õ1^ezpzhۺ۱8^-DoVƝJф\սZۢO] ͵cj׾!f#]&GdoYaI$bٖQ.Y\"q{^&Ԅ~cka4j"@DۂI +!8աyV%񞕢ˢڰvz7۳,s}S $SQIT=۽/#}>@,}5ʮbP8n$CHg~'2~/xK]6K$w3j q1.;B<nLhvȥ,r|8" Z~?sai#|?tV^ ۮZ^,kcw8HLq˃&cv7 gA׼)wᯌ|%ݍU,Pk{2%͇w 쭊|< ZhQH-k_gA[PAD9VHapGNTs|a#$,Yu6oTa >7 +,pW󵿭w7o_j/tiJբef!L&P 2n/_{ĺlt{{,WH+֪IaimxGj]+F3zL OEk[Lp/pNwgx(ֵ.ocjnC?MլD+!{YnE2\ěs\kkJҗC?24OT1w)sxuWQk TTN+yC)ߊVZjZB^tknohX%]j)d 0G|d֗c]m&֚)c֭u_+6Odܣ}8OxVhxvHnuh@e+YѶ4) 0kuT]^++kF \o~^kQx?Ƕ4"}.OƲʰa(#aNd/neZþ"-m<]e.o6D8$j 0|$CyjN7Ktvץ~Xervrv_u:׆n4=b[J4kXMs D,3YX0n M_&~ԫRs$k y6*ƿQ~)i-/6ޟ.I4۸Z =G߶Ia`0U |5<+Sj1",]Eqڴ`DN*RK׳/+i)NPM5Ak:u+kMjeHRG(Iy-7<$e$ x7Rl0^Y-sFm^6 >@Q&D0x_ |;EEde1i7XN\ حKQ NMR~#x{Lwwͅ,Ua<偞5/K (۱̫^kkcCH-ViSRYngY!dQcsלxM ol$;nE1(RKg!2~5{CEGï]oa }2X/) L6QxP<JCLK$khEI$ҤÜqr=Ote? |v>%($l~˦j\QixBP܍)t-w޲QeIQz${{rs2XV^uoKnn ԬX$e=1Yjo?5o?xIQk4Sd+H$Fp eInnyt(kOGx xSi5xK]ndIyې9oqui}*tap˸bo5_?;=>R0 mJj-n +ieBؒ v ,C~@Xxt7i+vC1ER7 { ş #譣XmDбhHTm1R}IpͺrkWSys_Sޥ΍^;4,ydtSӨO#oi_#kk}ZuҤZCwHCyeFa-:cl6ꟸhi¦¥v4OY>]mVD^XmSߏ  ٷYю%П=5$i"XK`6TG!O%}+I,.~'1l m*,Mww-z_sY_;]6xj{h+.NVWs$,,俉Dn3,{0G!_%|ν-1ԼYfl kd%nuh )Tߕ/_y' mZҒM=#6A] uܻ mkվI |hдSOC~u1Ei-Mb˵^g' x}f-5 Mq4IDNҲ,H cO%m{uγu1NF(%%Nw296){-]׮_K[׸>j"Hm/\6%gRhVW',~Rz4 XoxCZ/t<@"bI :: d)+04_Zu^[HL2`l/ JFJ-9xNBXLW$ w>OMKl c{ZroN˅CmGkn$F-fcE,_dІuU p7{VE[ـAHG''#vSiMC<odޢP9(7ĎkRv9G#_ZwLc2Ӽ";C!r JQuO7}c渞mS7otO);+'pL<41nm1-n'ʭ9V{OMƛ–BM;k {kŌ zl A3TysR˸Q t~ܾG~?'ٗᇋT~>Ӧ|M|".¸WhFDU‘j+⇵49&o`vdUBpA1S۸^m֖oiOČLdݙ+,k#@𕶦ɤUgୌ9dL3 KĶ 9ɬ͹lky鷛 0MIAZݕ[jcx"EnH c/P, Iac׾9?MOR>&xO@5 ; vR+[R\\MmsbNIP%@ +zq$wE2Zj:TR Rp a@Sߵw#H<[,[C5M~(uxy:Y,JK.+8JTߴ[u4MT)4|e}o@afrF #n1мkCm dih1[Fep *k#o xV_xK,w!K-^Tm3pOW~ QW<#D}?V I+ik{Uw0Yqmk>EƏ,mn>Kwa)R̳@*< ^ra\_cFl|99z5^[W0Vp'B啐embfC;7<'89`r+WV2PqŞLjs- O~!']/VOC|L:_G:9D!@hg%Xo&nrFVF=y<VFyǩR4o8v9#WPsGqo4&2T.Pr qQVbmRQvg+reH@9$vA# - <)п5 ,`[Ih%Z6Ogn˚K\]!F?{Y̰>^YaJdrI֨٥ F%@x˵XO9IpGR1~Eԃe.G^,qM5g&^UⰕ9u(ZQ]{kGg$,#f۽11Yt1o.bV{xJ`9',y@~=9O_ql޻!t+ >+.Z"% X#4 mi"ۆC<NI\qXгKB ]H'=ךWh|dx#0yW:"g 1ΝSxEK]wu#D0_ˑ@)|+~Sw7%{L,O~,?/u崒f}we\yKFu$eB\oJsQ@G\UVW8:{|7J/e[;OH 8uʮFǷJӚ[۫aS wT斺~/7|[g>x.x[9I|S&y-)jǔY-cnk퟉O\GuҼMiAUl"iU>by-s?<]c>ZxXtMZfoyἿ0>ђ( ` c3yYxy|cUA*x9#5݂%?c۽Gm*8h|^[?|Eζ} ޽ 3za]XZEJ%x 6‚F1vquRKٴ7h\ ) q;qzki\dtId-ϘrP 5Ӝ*1J*oC<=eԼuY]b[aR$s+_N5 b+q.Jʸ83dW595k.lD|(bF)Q2rA!k:~XEhRE`[ibS&7I bn%eNrXMjrlZ4twVUqYԭE5ild$$h^]mXM/]&aeECw9P Q Wso=, ʥ^9mN:}'RyuK̲mfƌ](]ĖV0(K*>\0ay ~о9} 4mCUl4-,36nARG*oI7Ÿ Yxq|Sc Ú vj7yeYN^Nv%2"3ʒ2+sywB7%(z_$k7wN_H-JKYpZ5p.l5j #e:ntGUhwn]枻iKL}eh:ޥ TWA{2a6b񙁌Ikm9_bm!X[[ۅ7lhԗ`c;W`=5SrK=I]+[ռ?C?^ҵ~ _qj # W΢#o*9e'h+n@ ޏ$ Ctcm>o6),!,+I )!X;&$đ]omn\#\Ddi#+F\ p)4VRU%c$Q1 BʧI|撠ۿcgCztwZ͢_ 7WQ8%W!d] x7pX_&'YYxd -*<[<gÿ/\9lte&HOjCp> Ҿ =VM k$9'7-1y Ӫ|$UB5ZWI;z8z5*$+;4xs// x.ZеYbӮZI4Gџ,b\b?|_[%wiw4D31k#T| e7/}Fo }"$/mseun9bY(YYE{p%J_ݗfbFT;7{m{7Ulw/}⯄<|~񦫲f-D34j7%,{Z5.wۃ|==C:dv{FY 6 ϧtv{ HՅؒE4A覊OHᑎ|o$4DռGJ`ҴKKk;Vrai%#AןOKO< _UԭK-'+I:L#G(_ /h/|t/iq{VoiI#wa#\rv`~znTi_0ZWZ7dC~֝R]`˷6)+<42NpNGEh_-HxT7~BEQH9vΥXg/<+uOþ1u*hR\F}wm +8q2#1"sR֬!÷vw1 ._(Ȳzm3Sot=N}'DT̶ 9!J>aoei^$N,xHu7-5 :N- 6ViUVmU(&W-͔jyv$^H2DhqT|t;9gJqZY\ *]:;Tr;0d^F#v M$B ;I G<$w(y#>au{]oVtXRⲷIMwggV>/ sJ s&>O<߇<x7<ur iظU 颲Y\vDt 86kVVE;R{ /㉔LѦq y5l7}jL} Xg/7pa_ym} 5.8x~?gTas}iSf^K ˋeY`$z\b [K\TZ5Q7H\$$Ho?>Z<;fz~%D4Wlm.]oň))j7TL7lXc}AS}0j!B}Wwk]+K֦SWW~_~'G׆MG& 2k}z^./$|yKan 2b]σAWGu~ui=jK䴫߱CHB8;_ /۠ǯ!d nLլd߲KHVauqt A ޛmx]\j7Izisn˷s#i5F<*p+?D&jzS1;/l|/H񎝭i ze帗ΒP"7V2*ٕp\j4ߋZMu/^x.=1$J4˦Q҂H 3 穈R~^&7𖑢xUeu+(5DY$";EO"JqU7L70um~ڜ76杤]$*oΞ[=UTT9ZvK[IyhqBKWz]Ҟ9ԼS׆MfL6w۴{7R-J5t|aiY_9xQ}b&?o!XN۫y]nVdבjލ{_o(M:[Y-`8T0Fyfh P~8^6 ]_Ě熵K|lmu(QXBY4ȥ %dυ|WI_{[[|֪ۦgi+|;=ԵI_̵{)˞5s*Q,\jku]k=H4iAw6ߙrB ^*S36Zh)m{g=cifX9Ϙ"4 ^N _zi֩[>6ⶼtV a @ ;=[la^-+x?_.7+u b5ޝ<)+)ȇW *Z-sMN".mZk9lSI4[ rX<3h> eI6FizjaN.E!+!r3CL4"n<9wvƅ_zsJmuA.L2%yi;NE>~ҷ^"\53ᎋe0jƣdck0Q ³~5?\;iVuƑ_+8pU#EKaآԃ? PiU&6caxfV%Km\v0v~,5+)VXfR[;R2#ьl*~nﯛgm4޲=C_mo3_nZiSڼ̍QW?T|U_|@o> CxO[4I|ey\kPݵfymd`V۷ wßx[Jf|kzRtm4wor760(\8dn A+G 5[OLA%ܚdh+̷Q6IgZۮZt:=n2|7־,DǢ7]iҽ.cVAeXnnxvF!I}a6ski>+Zxrd 'eʋ Vsx|GʥV MkQ5-ḱ{e\,̍5 ?h[Ke3hJ+GbF֮x5`IcG3ŕ6-\|9,Cym^iӼ(iP$۴L[A~+gϊ:'5^]D^2lcYIg ,D}1]̒chik'fIf'z4O{YsOWokg6͉q_H<-i&mϊ5pս, -5O2QoGC4$MgUTڏqm;T־IDE;}SFO{o*@^)VF; ׻_"2c>%i =ڞico. tmCI_uIxP${ QD̑:K:ٗ}c4NYԧOǧ}J?hPfGT;Cʭ'I ~oh;kr;mw0ܠ3G%Js@5:qXnk_{xR+2=cXMÖXD="u*Ͷa|BӼ.:=whirƋv`14RH:lkKw/?h7 }T0HD9 =t_<'oKL|I0'jIHVNIvJyϖ1']4| Е.(8jx45O_koąkHJ+2i\}_&xwZ-Z0I$SϦܷ]aDUVc 5uTդ%h1ÒSl3I0G< PSjm[۽6mk4:>ud,5N z8x;|Oԙfw~K| qxz^M%/MJy-J.eI o$glv,K_ H +8[O,Bf0+C̍rYz>G/? xƟTd>$HB&W +) uu ))aloicAaҲgKK+ :%vT|;>8ωF0KT4k{n7+ ڛgpd `ya/_ ]7dQ[9"ۓOy.ٶ?!;?xCWƽmၬoOv ^u-r҈%$y)DpJ-go?{Y?m4-DeH:C%(c MJ2emRk{~ 'Z]ZZ_K]ZH&[ȭϵG S'>xw0SmS^h]XY; AČt,^9~>Z,*&3fi畕/ƴo%櫮[j--ַ chHhmB$*bSZ7elWkwxQa[+ EѸF2+ n\Nx}!)lm!Ma&X_Gs,Ida~RW ?)wq+-(1KgmZdwp@ F s@[y5V/!#Ri<։sr; rH;XwQ'w{k~yr߄o<'ԭקj:EIL-@ FNk*izu=6iz2[$\2剘99F?.058|=}}yir W[Rl6xƅ]PE׺e/4w 딒v|xd )* 25۲=Bjo#V^@4k֖Y|.m[bnP@MS3lwZKizt "ukfvF~#x:6x~^s$Ibfx$QIH^V&9$@o&_wpƬm ӣ,15p#NAORwX_oJJnu/i|?[KedVICqnXJ~Vn P/d4Hx,=!젒Y w6R/^ e]@خ4^Җ-__bba&v;ݝKlEtW͟O!V~uŝI"K pFL ׅƥ7=RvV+koKkڶj7w0Oi5D,Q^\[;Ks$sZM OMn.Z\sEkks$j|=iݕ1\߯? _V54粸xџKZ[asM G%`I~⇅#^t_Q:d`6Bl{}>bdU] (uԓ=W-ޚٽ5Z+T]ȯ&Ž5 MҝuK(5˩wT>Lw6n<{lZL2$m+>-SC2jwVl!GiPH"$$&῀4 j}gl+Mu ffy]XU2;Q>i+Qy/t" I"TvUoZ+~ 4juz^X=kίH¶5}#6rxKtK-mtƲ-5ԯ1Z̀;rG>"qrT~tvSU5|5#÷gL7K3!220tk3VF6e7O[`R4m܋\9]-}[L%?o͏¿ui76:UX99IṎ&!9%WnY!{ψ~)7xTn ԼQ=ti!H,`D`vo|ik n_vեcԼD0k̍lu F'=6xZ(H1X$bVD).:fhIOZ$Kݽ1\іݿ>MoPo?No~!m_]ⴾO*J +cZ0X>.L,Y˝>i"Yf g6 r] d;Ᾱa L{ywyrU94I mm[_&9JFKſڿ >+M/ɪY$o$GfKiYD`HpG%y Z1sek]_dZiFm_|B/|&~xj[-ڜH w$8fG1Aؙ U߃n,%utٴcx\Ϙ&'lYc;toFJSiI*=!///_J(M> QI'J%#'v J/6x5+[k=r . IB%"0ܜWR|S[]߂wo}-7io< yy-Fv6Zu冯[0DүA ymSx^M:M٢CwaOV : 6byqIi _M-ڟȿ\Z]iܳ1/H Wf֯{qxJuI~#du ]nG"K_j ~iPVw,&ASiI_OuIh|ϫxGXui5Kxϖ1J`Wmȯ2S4f3e? Q6q)V?19_I"he&,Ck5Ηo5vxnVfn7;o]xQ֠ zl22Jف.07֟75{*ir>*Z.xXÉaYkvJDf kY>P}^g|<<]ት(YyY&g %C8pLks MˍYx[.-`]$-rYA*ˑ]ݾx-/A5Oi/Q# ֶR(㴐MNR׻v_EodsQ|#[sv. ]h5m#θ %u|(Ml-Jn|CXy56׊eH ּGm?x]>s7_n[H :mHXpm|GuW:G< .DAzDHE$;&Efj*VS+M_-G*RO_4_1Ք :_Qo#:,Wݣx3O񗇼hD}wAnX+uwnkOce ȸ_}zK}MvY_x(OWivѺ6w0<Ğտ^Xٯ*[-9Eq0^Ώl3R=إ;S6.tmkMRӟVz%γwͳG!>j2\/*aHL*Q k/mu7XPY\$ђ[n^ G%$4SQ$cnҤCS_U׌h~Foivv̏p ʨFpbfwuiK)|:R{FԼ3?ßŧ\K6[;E[,B<xO]#t|?4m$#Ӛ1$ 7+>0$.fYX׉|C%c\!ktrȶ1xEġA?mg/_}&-ԋ4+EvA¬Tz]} *Fp[kT|7oy#j+MK+{Lo7G0[e-c]k+b5v|yt[NGm7ђ"TI(,OA RYɣx67`V'EUW+8*mt[{\ewp3K",qSmuoZ7EnL73<n5yHgwV\GfbOٯeV%K*>ҊѼak6Vm1hZhn&_F8D(,Ii 4k7:PkQ2oq67vI0!ܧoͻvWͳiG=;[t][QƗK$H*Ͱ/M|s13 Mknd` ^`Gq kxT}J :_Z-mlh }VKy@#V!kuh|L~Tr Pĩ!R6=<;}jA}y6i06? J_J5t(umGW^5h3dBH9/ߋ4OGӴi#Hm FUT;Bj.{3[YY=rɅhXfpCn#'(E?+v/łMI.,$ua]PJ)t.Դ*=ZCA{VX)9X0tL}QJo xCS[:&H1YL`P۷6H,~hzS[5ӼM۽߆;]nF얪xK[[˅BLȷqͼVoEoHJo]76oy=R;$gz8B Xcj°>ߣ6~O>=wB Q翎{y5{d#F1me`WA- #_~ $kK>nVI"a2`cY ) ?:\xzViY[k7 vp\d'cľ)D"tB Xܘ ,Jl~|%ii,ӯ펚"yn\HVL2rAZXXG]KAe›2BHuay8n&lY,t'X湴[3 eUe.PWJҔߧ:yom#þ*n9HeY1neSn!d 5Y4_Wњ6R^귞 CX孺ݠ `V$ {tpr:&|i/_j$?bqMŢrńѰd)0-95ΩsM,, 0'69LrOnځ _ (̃U0r j7j69`xT$o; >Ǚ8 5wjRVawKX8';@1sq,,_LM>YҪYHF9#!0\ysgX̢)A"bn 2'+i5d YNlv*aw`csm 5S-.T P3g 8GA=CZnus:k1t=9צ-坤ٕc D TbE4ڮ=A<+{yAXmdP2dx̓7vվ߂?~/| /5ΩbVqgu$ qbK/! o/d^679V0IE' +0J|^)<'[lbj[Zds3,%<Cov6vK-Rh #H6'hp>aփGƷx]H$ZG$n!_48C+f``E9(EѶ!c0B@K!ur$$>ľ M/^xwUY.5].gtv@ 2F3 tj--/C/kRRnM G%'}Nq-x (93ЌV!j+I"V2b{ ]O8cqk7R. ̛ݓIUIlķLv)/к;>K^9'+AE^Cd׽4*$E* qY mlɱ;hsNkrO[P^(r8݆89&e EP\"G-+10r8Rw.T0X.zqsR6>S94-vq]dX-Q*mmʞn ",U|g;X}@O`*@<;O@gH`13FݡCFyc-e"UP7<FNOlvAeԮuB*c' p9~y+Fe7"#]*P\N)aQibt7ƀQFI=zצ|@+K ɪ'Pom!2`<c='.Ml4MBKXEt&$@$߃,r:>~(?Ǻ o] ߇:V{,}f1t cugkm:,ˎTuo`@|?_I֧n]=W2Vl\G8AM-fFSNJɹѯgbAܭ< 'ø /&$L>H,w(PGpGRyvm.4K[u}7I͒z`caCNBkm1hSͧ yM:nǣ zswoO;̇˕mmfWCGa;pPdqSOJo?_+O O6qb;YIwk < : c9T|#(_M2ǧym{H87S]mEI3 cymdRJ[O ow9 .Qf>SaD԰LFd,ьc Np3VRGRJF5R`9f2>s_eڹMO; M.xT-q3/ndGBtQb89I#; ,wD!*Fѓ: qtRZ;lA`pyF9k.JH}Ժe뤷Vv2A<,VEݑI9=KT񟌯՚2Dp2e<{ psɭN6L9~ڿZ%Wy4&[ GF!psK6qI&43*7dg>5?hO_&ii~u)(W2^s*tn\_;SIV]:KdK&HcrͶU*Nѕ2:JZQW)NRrEQDCԾA< RI;^E'ew+b?!^|KND#-tRCmg yXya )c+ 'oik9}jX]BBI9]g(cpysoif,B m q+h×WWrDq1ٻݐE{zK"K3dGk $m#FşE>5^,RIS raQ[31'|@޷pWZ赴<(-`[z)S\I; rEOV[\ܳ"6 D"O3$i!@9!kf ߶gUPM~d'Gr1V+mNWw9bѮ-tq 1X#p`#n$zd mge#aWWb2!x'8 @iUdIC0 $[U6%uv5c^񎬰xS.T'b[lتٸr3O !д{xl'V7iq"=6,I1){I<~04m'U񜱯io!i^Gh".ӟ&ӡ5snM(A8 ۹z~[G1蚏u=.V "HSVFp0|z//[8kꗛZ]Icjж jYL0_lS'xEƇsVףkid5BXgADKGt}wo?c=ά}F (chXؼx]EY;rhxOtV:<xGmpe1!9v«WV:+\ dԮ~^ޗV.mmu.Ԋ+7ya3ÏY}kqkڎ{4km.igKZsnnm#{dc0ysPIftܭ,K+la3+AM 91 Սtsiח6civ7S ,g<^mGW]CZx[ bP/6E%\4傀| aݜFI>*DMfQԓ A-_FZڬ[Ic%ηWV-WeTr2 8(ViԒ|ʟc>=^5s_yhKַgE"OBWt ;o.nH4q[G%r۰_8NƷmC>}Gy#6SlP.Wbpp@>;6Mn]KY5m4f^9Gٚfic@rϷBg{uNVKk(w:5y\2m$O řH'b*sA|-_;cƞx[,pW0}XI´D4kmiom3"422$r < -ׁq ڵKj7z|lU8uV9d`CMYZחIs-vЃ¾:-_Zikq=I|*g=|=0XtmJ]r^='k-R=8eR@_'9Lj|'ahLnk&+*enN>mI}Gy^;>dʪם3gUuOGkƼHY&1n{9 . fIе/i,OWb?)qO8s>08ϊaLo⼂g-Qˏ*Xa ؟ρ7~oCkAEam&ĶU[++nIb]q=Z|e_5:fxt#h'ЅZͰVIJ㇙w$`Z?O+;ifm;6 YP7!a3l$@$;Mt?U{vƷjV)喕Mck{s6־eg_ c'B.|P]1KM :IlDt*Dbִ̤oR)&t~#5]Oo$z.&f%奶q1m !LqC3m~t+/Mwo,ot[ %D +921('uᗚWËiLj-gkZVGέ`m&eMImk!B*\1 Kurӧ$ҎZ>MkMV Ky4ɚb63+) ^-o⯉+{_)X-7*\Ѳ%/~>&Ėnc7dXUر( 1E$K?175ki:>b,DG"nI7UW u'*ԍ?znljxV֗o4:kH/RMf}ᑓ/k_ AGio$"R?.KsOUU_;c^YjRKuhزY$<ȷ۹]9 <1#4vWo"T7d)I9ڛi[\=~|ƹxuZtk Cwl=݋ڔic>XJAs|^|IyʐC{%孾K{yn$;7 KB~?xG\%u fk7R&sT$o* |%[G;[^9?n}srWjT-ok#SIs3oLԼk6o^NԴ~j%]$H}1a-"htEHp ׏Mx?ڷ|O]>'ե{)Mwk%y2* Y*|otxwH֡!e7yM2dE& P^"CO_[IAk50$ˑӍFzuUJZeedZ+$6]`O|=]ޙk_1g- }6aV@[0+HX $fW_g#_'[}_F[-KOa$$8w,#`[M%~Og^4idjVVI%s}O ơ_|EonZ_ܝSK $ֶA$Dv0TvEp*M)+_W^:z/Z:}cq+i>"Yڂ*\,"yxuR5/k?5,Ou;5,Kr#f;._\f#_xVƱw7xAYYxLӇ,KŁan4ѴEq0P6UIbw/ߍ>"O٧Eo>.l#axC i5]kp@J'僺I/;Yt1(-V"?-x{[;Io1-- :n:|X_WEΑkLVÝ&l([N_O;TԺ?Lv-%hEk崗q2+0Iڤƕ^mo#{h7 *Uϱe#<8 bCneQ_S .wKJ4lg^K&K' _WG]Z<wM ICG3* ƫ S\tmkZSMlT8\~XжZ)uʽZo{NLjีUt+_Zڝ;T>aɭ1hãv¶q~+OռA.`Ok"4 <0DIyЄ+arqˆ/(Ӓm7wItM3KZG/2Dow|Ńf"r8wG/|akKMx+/^IF,E'Wh~R-ijpPۚ6!8~E|Gk"^~w -_Ksus+r+.o%c !f_MmRᮝhdm:GEe e32O rStv ߇?%^oV+&O]I-Gdu`u Jl+|D~"KJpyrNvk+9be[ʣl/Rjӷs,8xz\jMOK0xeV킑cI#F8s/ iɱ̞.݊Znc 2`;? i~6>$xׁٚk/Xf5l೎H!r$vfp"߇]/~2?McZ=NL.+Hm˼.<0dBInHm`մm|=wȩ^[#Ypo|'Դ#ZŇn5˥IJݙStۺ'eD?#&׆;ϣkwVڋ>ǨF:Eada~ i's$0_"f@l@YM1&nR9হmsK~Fk;kKM E#3%m;#u寧oN%xhish-x[ҐbgRk-5zhPkZͼ:"ybD(hر>PUtant/ʙX_L'@y )rI84߃0p5T ÝRK3 'y!6֖K۵ J{yhOmNk9,&Uh):ȱ@ʞ2 ]f9&Ҭ $IqentZl 4a I\b&=6K>6;k伅L!WI 8$n+scY /kyn#`o8PASѩ)U3:jGxXj:vv(N;/o-1,KbKMU]@$Fwo6 Z[ڢNW)DbHUƏvqT0I|E}'N:eռ3[3r* Ld1/i3 .;}:æ}F"BGtPm-o٥.ۜr]/_b6gih,ֶV-6K)e .8bXּ/w&+k[˦7i+ZBT`>xuv=M-ۧ_4a#Th .ҧ@/qWXhݲǧOa\Z 34}8Ib2`==8:U^O[OS2k}6Q yΩ;mJnFf"̉` >nVu5j6zzkzIei+mq_E#@7!z60 HW>%CE]i5 K}A ,ef9>. *ApupkZ2kvVky&D1J&icWxJu*BIUD'uW.<~;4Y7:ƭj m;feO.OݳlzJ>ѵx_K?,^sc>$鏧*pΗV͸)eBV 6wPuͤɨ_47GHhЀˌOuKğˤj3xf3᩵ɨP[t|VKGPԼ3o~ d-nco $ 1! S8>0jkM T"HqejZ3`Hv0ʳ8 7!*x"YҼCi\t{wUur .Zl42d6ڨ|kj6l,'{;h~h;Ϋv"rEg:g^T~jDфu>Z>1/4]k\ɪto;~_%ڑlYi@ps3Ʃƿ JAwυKv3%W:Rke+f#:nî+"uwoo_|=& .TdD'k5pFQaj-}TJɜ`exZo|u_.[4xt=9&ҵH7kFIbdnU_<|k9m[\O_'SMCJ76ψK4RDUA?~#/ MͯԼ_6|\Yab*e\%ji<3*RbuijuѬnXXJm@oSD'viI^ۮ٣QZ;3Yx_埉Y7ĺӤ9A .#"\ q}vz&e>MQ3DI/^WZoe/,Qo-h I!v#!$` ȃIOrBQ *k_6[-CFnEum~ ]#bXԷ #9l.?5=^H^`\9.Ux? eퟌŷ X|q.t[K nƓ{,v,Mn.#eQKdi$p|q[lt(7%k Y4[ ebw(mq.STmzꚍ͝~3(#ZA%g\6 yqohոm.5oU#K$_IR2[۳ybG2/Ÿ(:>uz7N.4MgPx2[vm .(E,+6 ٕX`m˷T!N)&zm};~Wķ]JI4VA&hwo vbT6T ݽIAZz5ٷGW5½/GT_İj7Pwn%:\ʙC6v' OƗ>ڴ^\?Z4rGx,F9P\BD yHTNtZëz>*]:R#GYѣx`1FHZE+|z>nzEхUgRz鮛u27K:C<# 5KxeOY"wFWf(YrT*^fڕhX[ &R'DZ2Ȅ"i0G#B |7?<%x{Vt=f;{+O1pc<N7yrz 隇񮝭'>|dK"TW )K~?vq?4*CYG4ubYӇ5% DoT=;5 >;3%iw-$"H% Tړꤑ1xkKĺvޙzl4t E#܋)$6\7 k)em;t.oMqRW"BV<Ĝ! K #kM?~( ޙZKy4ֆ]2r1ofLrFy/h4Eٮ5)&X~ Pbe\^OSerj/Ri>C ֌xwceފ  ^u4} $d2$m\mB 7rM󢤖C|Z־"o?^m͓Ga-v}bqJ%MI @G e8]QΖ:ٽj#}o' OJ W ~yt?Bi_ . zo4k{GDMp@uy"4qd.< GdZv&䶡ke,DFH๑TKe,9^pmE%+tO:!E=v5nSXi?5}DA4:-qh AܛʀHrh.7Lz>Tak>`ӚO](.rQMowem[clFv7 X֒iNGVf=&`*#+\GfY/o)UN)Y z隽t"GxEPb3I)Ot_߉)i?D杩iQZ%1#3,ЖI$ضWn{JԬK8|3x]VHԍkM$i3!&+,X)$lt/[o u[w\1*Z5ٵJ1]SVޕ2 ;FYnEEDP(A[ Q7=nzw‰> ZMJ72r -BVɿPqab*P6 V{O_>-|YσiKXj[E)d8! m|j ^!2,,IVTGh\elp(i{uqx}f%^Ao1#nHrxS]x⾡74 xRqjJwwAe,^w^s{m5 e8"7gf m՛ [cqYS6peXmWo$Ͷ&Tq>Vڦ6Þ+mjּ=u欶#C֭bvwD$76A\H|Nյ-AuOW^ݢ&b%3I;ddH;zd +w|M=iGthޟ4Pig>:|Wːw^kW8Mͤ#RjOx[]+~u^էB)a#].&R"7/<_6$6ވ:ܲ$#FTU<ͨzÿWXHmcw=jvn.Kw.^8kIb,%k;(|y}⟆:]Ӎυ.ȊFPI|DpM^߇n±tԴRѻ=m]<žO޽[Mѯ\IertۗW& Fn}H `~ ~;K-LKkNG@m-&.PStR  9<<5Po, u#}P˝xR6@9L xuFNSluejWoQ:u ,q۱L4cŶ\L{cK˳1O&VEe1BWvSɮ|6:SXOM]嶔e#UF H8vmGmOYKg kx3>BDŽ(dB|Ppsi){O~ķ CF& 8chz|Kuy k^_۔,jQ(*mmR\\xcAԮ]K+eRŗnkkͥGWq,lDcDNYp=F##RZ-1vː.cv.(AsO yjF Fr+u+ 3j{;C#s >s̹ s.Y ip[^X%sHwCkMsd ; ԶK\G1KDo<@Ug .*45^moVV\[<q5Ii`\#rCaoxu,r!YT'k$*c B _xɤmh/-Y%UUgfW9bH-TjܺHSԤ}A#($]aW9r/9-VQ~2eϵe}eYWΘFΘ]u!U<쭼Go7`RHeR"`ʜ9l)ہ)ڼ:&x)BqOŘ*`$-Y3g;t3RYl`nNLykYr/xo$xAi>E˧_j,1O ?$7 ^@IR6: _<$zv_}nh &*X wGKot?EΙH-].uY3Ȳ8;}:hxW|=t iz-%fF|38Pb!Vӽ:~}/NXѝ/s5-m5mw\9*s3{=Y8'<Ğ$O^W[5[(@yLqي,i 3i#>Mtebj A 6Rh <6R)(g]7 ʍ)`gKȥ~T_XU(xck.x~^vfj,@&6n dy⎔0Ջ2gEV1lv-N+~X= Y6 ++[`Ԑ\[fBBt 3(Px9yï ~!gƺ'NjDLw[]CqhI&GII;x74/:~.ҭ':plse<2X ft}Jt~}?SϫJrgMN˷׷PJ@ZJGxyg V EgkMB)/iTo6i>M͟g#">?6A|7/ x=z8VSK.0v#iuo[jF+mxbs傮7`/88qԖHT{5.xLMYWNtcZW5um3#{MFuniŇsGmk].[4{sT!'r:d d9D"`>6|jX%!aN%OCŻ%X'H$J _/cF X3x5=+ yI$S> raҰ~ƿk &c%fXt$b@=w@$g߾ӦAt}қYI{tSx_U,ukxymgrжRHVW\vu^vޚ]Xo8ʃIN*׾R,)bs63^=)|],$z g#-tZkkk|/)RW CWYmm;{{9I &A?}s8ӿPf74e"Df#vxo{̑og\@qP[Y-c_@ #+#sק#-Ƨjuh.*Uz9;dc6ѡ-xvܡvdpzq]pi[DfDRϻwn,۾lOgq0UM?c9Laz]-Έ_s#qR2aQ 4hZʢ[EBzmݝݏ95"3tY6ُϛ(T`N{ãE7s$+ycPpB9;;p:9OĶ`5i]Hm ;`o`Agr9`Dnw8KxjVio Ȯnyh +gh<kwjHڄG ʡq~ҴhUIJ)8-H6$l8@玴9s1gt}VXi 4e2`|r0w)R}⏂? Y|htk_Fb6_uֲܣ`mS'/Zյ[}+FDMF{[̸Pp7{[%O:GK(utOXn !aݽ09+ӌڨ{$8P׺fitk|4Mځq.Jvvm 8¸ȹ3IisXv񺕐CT13 ~/x{7fΐ[q#e; xBebV I\ךjl\& ANnJ ``pksJ6)c|F~feR8S~guokڅBfVSI$ Dw),33 n|nG3Z[k"tY0@X+$ aHQA5xcJzjM8YfYIOoq) _C^h:ބAԴogJẔ2Fyh jֲɧkrJΉx(%!K6T1nQCntOI!ʳ?slw9_1IVL%ĭm~ Yx7G"]RQhPZXr. fQ1;6_־%ǨG麄ٱUCH |pJS7W29< AgGS߃8Oìi"u ; gkt@ IOf76~퀕, 64o maqiw[粱/f,?̼Xv u; ឍ?bt[fQY5u0F3qZRkooGNjWj _T/m徯Z^xF`kR9dm IdCV>1zqi6S61PdHJJ4nQwmPgMQe]~j:DŽԚ-\{VyKn2x 8Ms(4)<#ykcyt,lVZ}son:^lg'QS=mns+[ cr:2Ų1FY|)2x?Yl<|%4מSZ)%Ȼ &^X9#5Qx[\[T6 c nrxpfېSŸ|# 7wE|P67Po>4_)J(Rŋs[ 58\Zz?Ɵ x{Cyk4M [HRI]W2]X6sW=/ xKM ݾ7Iw"He$/!)vyw<#^ %[m-^Xo,}-gwiax|yHVxVespWcI$dz Nvnx)oo5!D89+< py#iI|=G?WxGqyC{ge|eaCA%;hr|\[Kt+vqm^USH]J𿆴_ÚUVϬ퀐GsQyB!"gIӃϽ=Ng͹+S^6mϦA$IRnͩQ,Pv%Xc<^1|!5َGСxSɉv1sgDkkw[>5-KNӮbgOn`.7wɖ\Wȗ2HCH[ fv|ᦴu5;kb2]ľ^]'o>*|MK?h[,#ƭ2IqipQdɏn5KӼo_F?/B^kFuHt.$++q ;HWy~j߅X|+q|M!USi=źWgw!)+z& o M,fMѴ6\)3. m^Wkb8|??xfM:#USReo5'ȣF=?izxkșHC#+>xΑ_-dj_j ,*lʤyxvSG-K7vznkJ槬 /#DHZ**YG#*B|e^[Ibn/&fbF\14c0ko+6-u-WIY{- ㍆{Jז{/$~,O T 7<# j<4 |yM\x>M2)6-Ů",qlN3wOxb&nM"+SH}5 uF`$Q$lH1^E/m_tSIYۣmyRPѮVHܤrr-pIboL/o?jACͩg5j7cx%>z]_!][yމLxjLCis;hR\Oo©Sm;Rk @U w!~Sh0ZkO2HY\m6wDJ:-|e7k7WZ4: " ZvfK*nRLEc.WWe{o}Q UtԵgn?gM|O/+i#oصԭ$D,b?% #VL+׃4h6⇅)&lWCQFE''? 4%6Xr|Gyf5uѵcƛ3aC&K |į t/ipjvz5q%X\KY\cAξWMx⾗UӵM.࡚[hA.KvkN2#O^no_R_,|tǾ0DŽ.cQn-<X\jVVlYu[Ջ8v9_ ?j,<(4MgĞ-uh7|EqcmmD5c(K#ZZ?t^Ou=YҵcjP;J"y$ye+R?I[ZGm"E%^Ct&ݖs'A\zdP-2ky kX4_|VZw{Yar×MnY[ukKj>{ź6I/oeA.aW-M?t=㗎= ^ &m5 #P %:)a]K}ぞʢwv{ioK-:rĔm6I_0 ્;CuOMA6dM.}{K5bҰ3f=ZGŻ5DžmtN847IȶކFd%ApH xƇ^' gzy4}^[#a.op  T+oj5_jڿዯ 6q%Ŵ_myޥr))_^[sҵUO>.o6_h>4fv.k ('p\I&xo N<_k %AskdH$dLQݭK9Ls)-ʁW^gS_mc6Tfgke ;mFI!G}cgP|f]6=+Vmpli@3Wx#EcRo}WETV<{v΁44^NfuI!an#-t#xQ5 k>G~$k>1HH,Sg wVֺ]슠Ue!?4y*Gugޓ-uoegkZk_ mPQEcK`kwO,_ȼ;Y[]PVFCPô0ŋR*1u/o5oJi7+ׄ!]O}F?ma3niSj)ׁ> 0u$5O#BmnE3"A)ϖAw?|Q1 /mJyVP2#|?j<\u]wO45?6H;5Gtfi0m@"-n[񿦆?=GE |G׼%0M.nOU/YGHfVb%c5O8ݵYDQBnW{I$Ya[{19n\\)D($ĪfEYּ]ue6گ,2^ OiS#rDAtc!*̭nj{h.<# ,zui3*7SƷO:o>|M*ZKVV|[FN?g5sÖְçىӯokvbc2,Le᷀w ΩZv<2i_oo-3#4BvU}wQ{73iW5P(UJn</?ӄnaeϤiDHtS H$+'q2Q<=ƺύ5OF,)Ǖء *]M <+jzo.u!iǦi4M'0os+T Gi%~8!4;Q3iڌ0"KJJY6I㭓^s7US~g][ t qťͶ]6Go?>V( yO~ g |Ih忈G 1-bq]AoDGՕ#k+AO/X5-s^t3E;o*Ig\N⒇^^%e_k={,n주k]8E 緞 ^f JI'7-}=<ֶSQoG,ּ7w?Aq4LC@z V'קkGmUajzfEpvCvH@ʰW$2睿`|<[ԼE%Ξ0-m ,Vs*,w2"iMSÑxm,76vw6[nln"!BQ}kڿۏxYVcFkkl4bV ygZoIEgnUN"6k~;._MkMi\αPR|cyHw+?AZe-.&(L4Q,yn++<okhfھbEnhPIY9 )";=(FkծVVӥK(`1Z̷h%$ O-oĿT}/2dzl0Gyl%H;׷]ޞZyM\ssg'æ("#v^$|I\Ń- -RSm3${v@_{Yl|/i6^ԮloKtr^/_!}pq s\f \iY%"(`*nώ,-[ i:|kmmK',$N!X!I ;Wi.hOO5F𪛱ZGZYZ>PYoEIU2$U*B^'Z۹bY<-maDdU bo.Vd)捔@tWcm2By] By.axk}@E{{jš^7J^$[vkڪJMp:WTׂ5y<-k2Yhyqۢͷ,؋pD;o |]G<%G(BBvJEҜ_YVIm/>t+#/ fV}kc]C)懤ĶwYym`i<9XٖSF7!$Ī XXڀfg& Wk Oj<7Mך ")%YpE*[ Z ŀ*?s⯆:)oe,j767whDsLb!>~&1JQ%k]cVZ!#sw{>!^ϦyW]ү-& le?-bટm?/'Oa^F.,tI !^ˬY3K6m3(#uk$uK;Zf}]R$]HчPQ@J xľ,VAj1ESKk#9&BHGyw>)x{⏂?kw F7lͪ D6y{FѫSQWO+7>Ojo~К>YOݾV'xBv!(djN.Jm]=n"J ǜ3"`M>3zzZ~d[Ysitb0 Aj`]ٯH> aLiOg؎+ DVQ+I\U*$%n~fb-e]ޣ[_Vs uQ0\$Z?Am?ᶩ&ޡe DM`[J=QoR~t_ xv [MkFY-!ox#)Ke`"11L?#GF٧Meg#d7H'h=u0nrMw_/-/ME)Jj{_v~ צxVSE\0\}I#PY R+,njQZ|{[kwv*OG'o~!ZkGW+iq{/L셕Xy- T>\miq~^hW+i>'huKyKmn\:KiC%n9+PNՖ/?۴KK_ 4KkHbg!O5w#*`2|:^8AH>u ̲Kc7V^_,r@<OTsƷ˫&4!RꪯWpӗ^ԥۙlf7Q2S`21aK|NaĴf-kZ^05ٛIVKRIbJXY0cU5Qln_i6SOل e z·5?Dƅ$ZK=inYo%F;QH .PN*\m\,7|z3,Ǝ6(c&ڠL6㸛_}_jvhr45yM<"YJpV3?$"īN먖U[+_÷ZΛ?>7hq_ĨWz|6 M~|Bƅdh]{$O8} .th0Nf;Jє +<)[K;_&u5u fw:YhV>)yj>lP "ijM2$tP$rsM}sm>i>_Gm- t]]#In4"JYʇ(YF-g>[how5JCe Jh7p20 *r3tQ&PV şK375X{O3=ZZc>tcuC$z{ $ ""\@7PݍM?z"%T 1$hp9. ƞHxҕKw){}$t$)oyiu yNUQa`}C;_xCu/_4 _xM -7S:1%͂*rso'F[:>"xI͢^.HVQPT${OCx-Qy&5%KK} |'"gnYE)9E4)⿀~*uiKūi'Dm5:VCx2-`@ F8ouk'6j.$QFJv2'iۻ-Y]Ũ֗<oIPow̹ +?=7G e.I}a -)Uc&29#KWRKw_NͻnO8laA-SS%a@A,R|QpzWU?ss|7[}1Ƴ'/>m4w,Y# ϛR\&ok:[j7BJ-#bjT9UJ#*Xi?ĽWR<7im֞KYwyVŞ5wRBn\-OY5jVEÉxI~́<AtK۹.#WRnjזz4Epz_r? '$irż‚IsbU$pv] ZmwḎMIU0FUs8V8OK};X5_[vӭ//6'GEUV& Erk>* |&O<:Fg3eYZ۳FHAmF$u ={i@x]2t57!3w[мqo}EKXӬ-5[h"'@nA$n84k~95Im.M YdvxN(P;b1"’Ii^;>m⯯GbPIaxuhT6I|;sܶ:oXwvJe:1ʏ I#𵖋}iGy$-.lܫ[ugV`ѝ<-ͥe@8gU (#3p#qڄn5);Xt2t" ݹ6Z'DBX.q W3%?C4ŁDsj~!T۔21.vSY&JKjw(k7VDfW(=Bm(4DHqYHWP3*`2pu$=Α|MÕἅ5KEku-)b&81*I^~ xkixƳa❗a< @%u(P'䕕%p A<]Q.VD'X쥷|In SOׇ, \Z;=q+rA2hݵ%Mm(ɵc|OKj4_gį/f7EZX]}S[(o(nfTmyM3fww{[v3+2fpiWG-b kTSb2b'e`IJYBgACiӽ^\BX21w1YTz_y1-X|nڭw(>Ȑ^5&7C^ >|H_'>-nu ;QGp]p]_1ᕶ > r4۔C%{}4MȰ’Ae+XZ%_El[Fm*. Ee $S& k9;8^Qu2dPdMP4iLQ\-M`JLw|Jm  u :-*),  6~q 0 禟&Kt*N!/q{r@qjrW_kn<(qUb0<24avG h]%\i*,6A9 wfYɧI> BOHto?u(T%G*LJ!#e!0FMaEARIk3떓Ƴ[^fC , +%5C7~-3GKJmkkߔmg,s< 9`S8|RUT^g?83q;K]5u枨1[ֵFH/mPQKknXU IlN3C 1ХO#3ec5۲8uY4OcURX`?.F2O_5?Xl4f OC-cZܲ٢deFЮ µeom{xFiWr# #RUe%K rZׅ/,[Tf+' 1Q{mxmGOu;B {'q >jzY6wJ+FwWXmnX̤iJK|Sx_OӋ[{ $#'P0P:uZï;S𖗧xInu?O7XR1c|%" `qhW"*-#W9 2G$HRXnHGUEm!;J;jc]v_Ոl6-Q&qn-o.񳁝$ 2h-dҹ f6#,$ujN2$V$j9HHτ,q7ϬH.|˹*N$)9<0yKKlXZ#Z{% 1T:usҹ+[6ɧp4U/,c r6NI5GԊ͐',҇1(UHWPOAeIbxhR 6 Io~x+٫v59\˪\[Ӵ\ۀL 1${Y)2$H7nK:qiRM5NE>`*QqngLQĖnQ%Kd0 P#*ղ0G +B֯*ZBm^A XN@ n8 c5_ϩ cIYW MgĚP!}VV{  % 4l :Zk+%eL'\g5\UGΛH9+?;YѦ'i|X$SmM84յѮ2PH5($m $+%X|= Hg[:؋IF2F r.vRa# Ome(>U˂B$aT9=PK ' ,8zkg-O};VZ33K*oxG7 Cp9S{U+8mg=nd<N}4 kJ%.to3 pcӧ<{\I;9O1n`!P@oǧ~[QgKnoHXją~N;tq7 Xc [Luk4=t#r:bʬs۷J& d*NNTm$47Dʹz:dWG2+"!3 ;m_By.S&H&a1$'nO nh#A'ˌ;`C%3N6`st5KkOo 2y2enmSַpzإ\S5|MX.0Jd*bX9'2sZ߈ٵnnnʘF!nN=qZh o!$9o| 1Qvf({Cjf &8cp``PqsHT$;PL``O|aSw|[Ӽ;shĩjˬer0npy+ko-Z VQ,K(`vV~PHZ2#(J2^뽴"׆> h>njw ԭ,Ͳ[Hc#gPBFpy^E,·n>Ј~p H8!dT\F%=ڭynP˸#h䟘qXY#Ms*><Ɇ`!-ל5+I4I6n, OC#[$SH2˻B5Zml7q\J#BZ`$y_~-5_~Ieik%?G  =H[ߋ4߆NjkQXCyrC 6`0:f੩k_7sœLdդV޶ңN鹥i0v'mvqYI۲c9o.H^r95/w6j?UoxO{mS}j E&̒eAT|x{Id"d̨%x1ΫYA$xh))YuNz5Vֺ;?үeZE"]{%*:p3;A9 zMψ5}#HHе}a]JYn TJH]#vkG_^uxG[ rWsm"͒@ʞH$`c_@|\o q=UUWD*p w.S1f^ϡ k\i6T׷vdeɹݍb_O*$7wgPYy4t FQu~c2aNte* {}o56C$xđ$L2q۝!P3\mN61h7ծp,wKrbiBAn9$n`y|߆/ u7VYj6E "N ڸKe)~3ʞ0?v.g $&"VY $%PUktsDbjU9}z6ox_Ƕ~)m'\Zu4芃%ݑ&0ToX'9#3my0ftnN_p@<#z֭ootthxnvO5̠;AF1zћJ =c}o|Vt߈ZC\Z}\m:yq,\; 1$t2pFx|#ԴosZ\iE1"a,8 O˗^֣ZpҮ0'H’q]=GOHjZKFѴL7"n^%do dJ~)F[6ywv[x/ɥS]\-^irj}/".6 g8$`4Aac6kG{eq$&gGg%OoPd*7|*ߋ> jMŤ5˩iiBJVmb*89O^5].jڄ ~ZId3KYPh#H5JӔ67ݘMkV7Үζ$]6P^4bH'qa 3kKG/ޑC_^ մ+m6(-{2{ғ 쯼՚2`3e {2vv_׭z?eW^:~xu#oX\]DMixԐsITcO |x|P0|KIGEvs>!xR'ěK.mBFH:43=J,dV?;2@GM-Mq8?Y dmnf1+l*S[IAMy4SZReOTVt4 jO2, FAe*Xf&_ ]hb2A5Ҹ,K02]~?]x}#^)!Ve$J䨞fOevd*ʲIàO>3k&~,>-S7V2`4?*HE*XWrSVܶmۻ/+7{VT'-ܛVJm%}>L-s=C%$%FUNYYH@!/|?c[įizV6e$8`(GX!b0?yԑYm̢Eamճ\%"xF10+xn6$7.YIrkz֫F]SE\t62n yxgT,gG&2⯏vƌ6{oe˾IO7&@Q_Ax{~;a)~i&{c{xACA4bP0ɽCU7 jǿ <%?i3~.ygv6jn9@6Rȹ=xsR՝z/O/^N,1n蕷߫yAqw&$Ech#'Q9#۾0k~>q?|?tx+xGSKEK-67͵]<_n-b=ÿNmQ7g[RzŤ-hNg!D!W4t.DI.[I MdIk9;laF\2mk4_i>|5-/V`OUh8gIbw ڭ\>#{^B aw<|n| $˥x_qg떟`C[O,b" Œy? t#M[acmu)uU̒|* E<Ꭺz+K'uP;+-f[?2|ؗ!4}aiF7#1xzZeyˠHIL+,+_W'46xKEдt*w2{ cÞm#Zz[YˬwФ6 h͓;d3g%H2u<\_yky 8^}j4wM/e1o)YQ;dE` Gt/m5{huFoA5Qˌ"H>x_|I:xXW#Yt[ŹTF;ԏ7$)&Lgk~kğV]DׁtO j>2x^ImH"KIv녉#{^FZWo)_HNxWcM$JW(/դ_ |+> ^xwIid0up>QhIN.˷oU*^]8ѧMKC4o'灼?'o/%\Eq8ȑϒm,w9?tl%?^uN'QXv[[( HZM(SʬK,ljXFZ4tDѵ~M.Fv_M9g`lfO\ÖiX< \֗gLnpdQɓ4hdBdQ)^ݲm54'(tK}Ye:}1,^eWezr<3=gOt4 LWTY&>ɊR\c `@|ВWvW~m⏃6Уۼ7mZ擫f2Kos%s $Ge9T%_G>g["կ3^-AcY$&z׾ -[MxFj#KWȷt[0d&$Z}} bJQaY#>\Q4Fp$|nu/&n`kk{u"[Y9XNc(Aq|Ilm[H?ڈVKՉ\FBrx& ir"RBmxŒ>xBkiWוiqrMKO5[x/dRYG!k-6͚L½s7 3nO9~#q_/w^jˬjo u4n)J2! ,==ۿ,Z^imGתּ5u-  [xW࿇iO^𤚾z$mNPG2Y=6M~)b=< cNiW*ϗMԼMmøUy٩G XS mP6pXx[7=Kƺ/!?j燮5Z~=lTokĞ}wk$sC59rB+GH6EoGọ"y溗Pi " N#|b6@"|aO\je^tH9ax2;z?_ kV5K[7Nc]%ZmŹRQKi 4֭ӵv,&~ϊ>~./ O a{Ȏ;G(o:62̲k9\ ;Y2W^nERQrϬrfLI кdTۚ9+ڍVinQexܱ ۻHU"u7gm?=ljg>hچoixoW GO[Nbyt} 8i7w(dŚ?5먦UDŽ/;=^@$t$o&y D[̶aʫ;Ϳ434[tW_Ek[g %(.!><*.UkGDφRYn`JI#k U`J 7I\ -sRmYt~gN=Ʒ7]kᯇV\ [7Tͅ1ʅXϸ 7ηPxD5񵞫oͨE=H ǛGqksi(.a|Rb7QiZž\~ 9s 訄q6~*xF儿fĖ Ol m W8|jI7?f[??4lu=RwڮoZCwfȬ ȓl-Γ~NmgVf?Y.`QB<-$_UƼ-/<:$"wH6c$UvCt|[xփmi z6owY=#ۢy "Snw &,#NN]c->}'ĚnHk?7ڍ285l[kXJʶ:e^9/>$Iki;[>=M.&2pH˴p@Ҵ{[4v[{v[ie/ܼO jwn xe<5u# Z}m17ܑvQ`.Jt磲#AeMqn-4i5'O \$0; G-e>¤2 (G7 k:g㳇O `"Ll˰X,?jRY|,ޕ]Z zlC ݳ%qHH$' ѶIŚƽ;~S;HՅ5oX闶9{-[ە; %d_F6ֶhyظs5}|GهyKNXm6{{W1ގnbB->B72Ʊb:aauMwY R۾&$aBlpJcp5{|@ui5+eտڔY_ @XXCےUuӴdզk9lܳ7 0ȱJXPp-Yt4F/nyJ3?"1֤/khJehN U\(Wc"d~o%բ;۹.,+qeeo"(|oJ | 4&ojL&CPgRU Ő o~]g1"kKﲺinuf Y'q.F78@>*4!75hY]u}Ϗ?6ZMζY(]B>Ue,C0a Pu5BuRkH${*xP\"g \H44:^mJ(Sl7|(Z ň`0I]CP.7%ƏIm-{U CG >Wo*26:bk/M|ވ*]NJ5O i:vɮ\ Ẓ#\wtu6@*Pkxf]LʓxsFi.f-mlrVIf1ǟAwt 6EF>p1ϖFa2A IxͿ%]o5-@6l&X  TER_<+ h]M~djJ-C5+=v\Ԣo.+MB \2.NXKF#íh.6v@%07˒#¿=E4/ V#q Mooq:Zy8 @OQ?xk>'Y4 tZ Fg]9IcX'ҩRpp #%{Yݯu{hݓXNg'6ڬZxf0> αccGR?6&wϋ9k[];L#kZŧye6fS$7,2T8#1.y>"ҴDHDjrf̶G?_k" AxPK/]>+Im#ʄe"ĐFC=z~t.W}w*?;Gzޟ<|-*xG[/GX𵯉RY+y'[U3@ 78dO7os_< >zUo;mJ+0%HU+,SPUc|Wӟ|?iWZzi5ôni͇ƫh ˑ|Hk 7O4 K{ öMV)%U@,jTz؊U.x/yhogFrVHs _jxkiPi淨Y RmbIyl~|+epw1_^kV/ϯϤ; 孼YhsDd`7h on΍}m$R趓#OnDW1B9VYLC㙾ŗ3j: m5o\=QV!no0YpUf,ctm][%ﵐ8<{Nx ŖZ>'4[kePZO^Gcp1Uڳ']ֳAǞ}boisGO>).!t6~JbRKvܪo,>1?o.| m54 -gx#Xͽ2WUX+iA4^&C]SZ7a{#wt}η%d!r˖?[өRpU%%-7OMջ[Ekv])S᷀ee)}sSk#ךBV) ؊c^^俴mYh.TnVTcxڪ̥rgjZ^?-<9sQO DF+ ]u?D -wz.uoi-յ,AM0cW>hM;yߺZ+o{T;63h#xr;s/xX8GW<,0AwZ5?*ҵFm+VMnK~,a H(f5x7~(֮|Q_kBM:ذmػ0Se_hf[(NsnD2 }>շ MOOVtr%tp06rpOUvֻݽ͍AsL}w_I{7eQiRAX',`4ţx N mt/WfdWS+"m20۴ VoW[Cks^T5ĸFDgTل˲ a_?#k.^Nk+-pC 4D&K0 WZw׷~V:NVWyF YegmEglo֗i|ܼ1ypI7yn)mC9V)iK i)BA۸~|ůPִ/eUW ]BkW];L`4lC+8r/=wNۗ+X@rl$ 9~eS\,Nk=>{:}]<4_CV>_zVWԚFZYӉDZC$>W_C C[񾇧6{^-jM.kw &$KiU#eٰWO}Sw=΃-oW<6zݗ,o&Q B䬞leG]> ~!xoŭQ촋Ɓ|'mZ#YOy &xM$}ͺE9rem7SǛ>547Ӵ I!mv @Jƚm."bc}Q>(kǞ?u_xrº}DkB[K`w\Ŧ+r7T::iqoHU^TJ!L O&Y>).S_C=őY-ޡ`M<1^[[E$Վ>wky7`Z4PJ[Q;_C[῅>>.3}Wn$Me"]lh%G5 mU8G-STMBPfulfq hF29=OGi?!涎Le@6K+ ~~/? +9Cd0dz $o*S:m%9iuӾ^NQM֝%̒muI>QCfR{m4@&eb)I]/>kxs?!Is }( Q#MpXByǙ R6iD"BͱO&9989Xci xCI;HYOuKe,'6ɮ^gt-9%rǒX$XZMC%ĦO[ i"II@cSW3 }5+:Ť.P~u/.IJLZ!ʫFzoPw'|,1O=̺Aյ,v^:,ULCo כi? 4]B{_Z%WK%ʌ)<*mrX&QNm~kK] ?4 Isa^-RX&Ůmϑɕ;2*~|=DwAs>wnDPԒ.̩2 J?4q-?M$OOqrWˍ ]6j_l|IKQ=W0[6.cPWo aQy릶Ӯ__w`M*'KH# q)mБnJ3?z sjhc,do|*yNc;p27o#|m5JT;{vXe;P<5|3i7x쬵ttZƋ72)2]!gvO.&}>E7ut)AO?c;./c#y@.!Y@vǑH k6bGAxV!xF xb떺8ͦ yd g<-=gľ*WK pʦKh,*|J$`1u<x;7Iӭ :D\[,YiϜ_IlݱNwq]ħaBMM0xG6rj+vdKH >gm9#x9a.X^|ikch@ӄ?`O-P$$d 4]J=z?kBE?d\d[\*;Xzpf 9[OO?Ě u[␫uGKi,rv$d{pQ)F7:Z<=|>cJeΣVHnd|E!Wz67[ھkmg{hn5͞[y£孮?>v {*9t[[6OspUC9pĀ6HHT,. Yq ď4aIЬL$fIV .Iۃz+"dN/ᎇq5]WAuYo,7PAs3h6Ŗ?yy hj iYvA"j_E6 x/T'zk/SFqyD/ɺC L͗<-/5[/罱Э^! 뫋w}̲ȑE8˗XW3kVvrdtM&Z9Q8 ?I"1Aj"ck{we{*$BfxZ2+O toNZ& 9OE"{9!\jqyFѲI|9 }OE'LۢJYdW\Ed`AcbM[rRp{zÏ^ӵ ĶQ^v"7Q#5r?lI ]SΈ U= ԔsJDya@0En xP9#=].ok>K&9fG+Ts^UIIj! %c;a{_~g٢G]hY#J|绉BK;(!9$y5 xLӛAMN qesoa{{sm wwFUhHJRCt,(M| oq 6;q*H,7"D#a>i6B:ՕNѵm~Q Yt1쑷2,N2[MY8x'BִzWji7PMǚ\+վ̬6®Tll/ji>EȵOy, &T9Gqkx.nG.`_7iTB~f`1 QI2A-]7ܼ,s3Skpa/q4IH , 3;U'Ev<_[|7ѵnNӴ5(k 3( f<?jD}oQ,$72` @$׵OPt-O_į?gnE˳/.DRF3E#cF仦[~gȺ2K(C|nUެpqJ1-nx-& F@ ^)@8=;_yǍto=݌"*r<)9v?뱴|:vng4Xeʂ%)2ctTlqPi|:[FȪH0X;D,7@L`dzុCIueyjVnvh16۰*I ]rIC̈. $p*MNUa_9#+BL.c9pqd!O֪ɥM}mj~Sp=X\*I1M+Nn<:MbZ G<%3d sn(0bZFӭWψ5$;ceu;.wEu Aw7&iGi;\M"o=71@3HQp@9 pQcNST[$ ݳ1U3OxOּAZemt~43q- * Gq,<jVWErN:*JGiS y&|rKJ7ߙf\kuwk4km北$R*3e,I6繬{ w>uih L$a#'oD{5y VEXe, մ?)9 E4%ܛO>;ω QneK˷͸2B@# /;n? EԬu12I۸89ytR_[W;p yv`Gl<-~_ߢ1yխ޸ֶJX w2ƙ$+#$iUP{~&+ '[P^kAVD%ǐHXznq:0]>ٴ(56|,}ŻL7#"|@69˛OԤol6nm$rq F 5kKy,Vx%2Qg9MӃI!u%٧< plHZڿO4[.^;' &2Far[AxoߋI此h>jzI dlwv3- U1_tCNsjȳϧ!TYYR-0WO7^ƚK[ӆ$! Ie}{SQ\]EƂ2R{x)/p p/;~k2^XkZeӵ9H65Qp)o<[i,Mhn7,XI [:Q isl'GvF(HFȢɩ 'v[[tϡz[0tht9ěc30AP@q9?ci+l~ķP?& o:X$KFR``1O5g{:煬Le [[>q_~>+Ki^!|+-^Եo[l a WkozmJIϵ2⦠﮻;i}}Q~_+:]-=lrlk 9ڧhLKm]^0W֑`pB9x֛Q2vRuU@8eWҳnZEU&kw@>bfqr؜dfKw͂ Ϛ˶=įzmCI>nk\Chcݻ[<' |I5gn4 Ew|ϪYɒZ+&+q%dET{oSLWo ߉on#B->{h X~ClؿŧGWmZH_ͪu6oi #u`G(Wqo~]KG{ZXI͗C$!s w89m[xJTԯ4h$ϙl,s1i X8 ?-ҫ8t?/72hCVpo)ZD"'^#w-ӥ[sSmOUwM#!lL`e0Mji=4䚖=sI<&SLpK(۔ch>}Di5EUT]p sag ͽgkVf7e#||wͣh~ r^Rc yP%7=Ԏ\5{0=>*Կf7M2QFYV<:ARP%[f^gOݠ,sğG˨A]\^V+K&i2yAlݖ&דUƓ'ElҘtn$.XcH$2լ.!ho"Uhgބcfl5d:Kkmז<$*GyO_}׈ijXA UZ@T@ky>*+S-k}2Bmo <ď s>!Y 4AjF_+i,,_5i}|75>?>xIu OJâKDShbxxl*xXVRVz_^7ݜe mEIEk-cC_ xiܛ$3j9fYxI)8F|?Ҽ}n}Fjf-@rbZKxfVbP /~ʾ7+ᆑꏩ/HntF)1:˱'Yկ4 h3on٬ݺ01$S:Jw}W;F<ѩ)plkG}?'i6mq}7]6\,bXA;Ikxfd$ekּu|qڞXHW `!`FHj--F&hSJ|$XF(_o#dѵtvLtGvdTPJw~ֆ!ne*c\O2HxVf\1]0񆫤j-tj&NRMBd v)38b+σ5~!>uxW1Mm'1U#ǷisԩK[ O7wߩ>Y*SҴY|-[hg[t %&YnK(qn]S]|:OOx>мGs{Au}4ycylwѽ6F䟡gB|CoW2 4S^XoIBbxmUĉ'y=~0O|`5(I<Kx&X7W¬.+"Qmc2Ň좜RM/m߷K*zKc- x)kݩ--ʲj2\jL`I"h ۓ3m箫ᆱ|,/d|?k˭>wڭcC(cN Xj*9|_xf_}Rgt 񱃅F$,J`d? t&?Vk[r ,K=bd,LqWX߱-FJW=#ǟZxrLеkSG-Y*G%m̧wG5mw/,OtN}qy0 .1)*c#T7,Ŀ$_>PmChjc`KxmGHR&FLP-O[.mCA]V9cFr*@2nNn@Z V+QjVg)V g߆~7g/PtR <-o,j6tHM$m#< |YLjuGC_3 [w紟϶ZyGP1!kmIxVXʹηQHasL{T;1澱-g.Uǎ<2q=6q4NI E4֪0d(/^?~ }FԬ}y&oqsE4HYYUw.W^jQSw]{>}}WəTjO7%[xΟh|/3(leww1^ cr,!|+z _|KӴ/RDK,I9cQ65\K:Rȳ;*۶̐2x#IK?eOڋxzB)O{,:դ:K[*h ʁ C W٨=ZW;Es;X\kcw)k6Wib1GW|YڰIu pyO$M[lMc b]鐓}y[:]+]m="3aFȯfb+=nצ)NMԅ !񧊼==/]ugd6W&Ŵh\9vX^ͭ! kFh; Oo) |˚]Yu\S>5O'^%DRK QWVbuⶰK1CouoG ޤsǷB6mb}sS5(ӜUt}[UNMYƺGlM&BU'T]':lD.x u-'rFfKmm  Jx8D*2d⻳E^}d>2Ji$2J q!ᯉWE_ 2m^{Z[Ȭ%Q\||K|O%56WOG273GI~|'ik:ޓK"v)kQy_gLeXoǻp|O.|? c?۞cj~/ %np)`ʿq c'n۷;vCWM~u_h[u$--.Y)y)HdFc m sSvGQG)+M{[owD#[n`𾱫?i%"D|Y_:UɹIZ!o> E T^\G,0Ēr#FG90YDqRAI|≮er-z"7ui%8$U)LK)*=#{7Ĉ|?Ox!Mn:]--4y@o +Ve 1\X56{Z[sk.K k[څeqiʰ^Xxk?kEQi&#WMe$';,9wU|I9Z{~'ώX&LM/]/glP\6gBsd+kp L>7.oōK%ſt8me!Z5Cx>7w ~˧[xwNң]@ϱj47%PvM6;;vړMmʊ|ƒ[$)R~bI°8I{Ӷ?)ZN/ZiO_~&5;o!BOY+yM;4l<0Kڡk~5&lj?Mc+xFCyvs[$v]ql+;8UokOˎQVYc:DX7d#f lxQV{c;@ >Ic-$5ㅋCkxӣ!09LӴxtmyy%YjFKh+SƳ7JboחZ-w6}?NE(vSr@<#yL[|4S'~$xxhV^'+A3|\t]sS)F֗'-N5ߏ|K:u/hzƃ}6ן{K O"[bVbcfIA2fO?_4s𵶴?.<%a賦=ʺKX1qE䠕Tanka*i4_ ֞1/"֬>!hbݕ?嬒aLdࢄ &gpjpnYadBb|*Pdx/{=$t}>?ݬX\N.$b33Āȹ^L0+}m2ߧ~$i#x__L(ka%OKiq01J6eJӴo[ϨjvYO&;"e7J_"Ad _#Ʒz߈e*y-ۙLHJ627(CҼi{5QjVdzɻ@DxHm˸rMx958^wu|Vc[~ot>;;of%_*fڏ~`@3ïx[SVxAn#Jluapqq85OSPK-QeɹN̢ۗm S xSdB:湦oeiX4UHW3(YWabnJ4:]w޺q{=5+DOSo]A kk[%2nIceXg×[u_ > vַ64F76V*lּ.4a6ͦln",*J]"4"ya yeP+H,b c̺OF_zCQ.O Kip q$Ree9;}KP2]k]~*Kg<|M.O1i,eᥗSC4Gn,v9 ;_~5?3ߪ\4,Ƒ(Ѫ#H O-}]\XV,M]=rEkٝV(1X&~.SB=ɵIwv6h%Ne[$1TJ2|z'V^ɫ > |nx: 2˨ܩ8S^qF$G{'h::zW:fy} XO,|p2HfK熵y㴽]ϒP|!`m> yV-6ZM[PwXB3G$Gv+`^X9跶bq6~1vM[F3↡y{3]krh0yvCv|ULo1Gz^'.-"u{٬$\lc@ N+ oOŸ׌K<k֭q^RZhn@F$8$ O}ioΘGh&eI )D1 QM9 N>œU?"hE_s~ |Լ[oxWW|Q Uӯ-2}"i%l.ܘż°='MGd{m:I*!!aNOxz_mbj [j7#TGͨHBa-\ 1|a ŧo4igkKgP/tդA0͓!F33Q CM:4٥}:iSY|)5_OƷviP_xSBg7/aYI&EvF!kc|#R{XH%`u[M#Y#%Eao0IOB𵗍fz-jէѧ.%di2pFo⦃ϊ1nvag2I2`YHeD+*Vu4OVњƔ\sgk~#O^ym[Xh/wHno)dv}0uŢ2f;5 \«aL%{e ;Ewi*XW)>ΦC֚b FaIm޿<5|(/i,f $m{ %R zvw|6OM=lzJNWgo𮣬Kv }j-zX3T>Ѥ?SVV|&-K$q <25K&ؾ`+Sy?.MFH&z vOqâ#D)&^v WIP_=[k_¥GҵNm+Ehf6󉼕pTD;l0?XֱkxŞ$uwA5ȕ&tbJ ki|;wM6zDZ~?lImY#Hn"ku `fHٷ u^x5M"]j>,ؼj%`k*9$㢥o LSKGG׶X*u%y^}~)|N/>$[}.YTS%=6.k+)aRU$1O ]_KDŽ?lޯEuO'5ݮfKonaa>^O>%EG{+7u+C}a{!e#B`)du@QQ_v?WEw"\Eeay XRC ϕ!Km@U>R)AF\)o˭Fh5.kZON|@Լw_Km%w\Iu4%d7 I$*Z3,yx*KduUKv2n.Pdo18U _Kᆗ'ۛGZּ?&=rF`T"(m’j~$tm#NrB:0SRoraN۞oxlj7D C%okq-yЭđwGv4~/K x/P%9a( 1*@Z\hv xOCBF]?UV6^T.#dʖPąFTڿWM]xP7mLb҆V eěYX*"pN7wtG'74_=~%i>:G%|}֬5)2c-$3 F$*V/oZ7:cQ iZhkK qny($W3zw4]jy5Kpȭݒ>L)>[FTgm_>84 ۦE,v)&CwF¤3b]rۓ.K_MwEz$p*$`cZ7e&W>v`KMB%3l*'͂B׫~_|i%ƅmI_ _O͵Ռlowb2dBc*@!T>*;xᾕ;TBg<-DD2Ĥ3H^/񖱬yqSoM>/CFH;$۴MBwtO:~v?|]_U4( $6 cRLU@gP+t|!^Z,48,Zro%vCdGͮ _YdS:L|wo48[xP}6K/>%p,~k.XmY7-%+% Ҁ~T*eE}W~j)sTW/xwBFtmnXL򢵦e`8zQ:υ|5yKLu]"VS+ 7LAQee\( c*c ^KĝXi-tUqD'[If7R &BؔFAZ/wNSau=ŭƋnVHWI][U[4w6w4ۗCTRexcY2GDrCԱxKw<xQͥM W&R2B7?#UԵ N鎨^_5dg`d{2>izm4iOj2^n-76yLj%[;qxMx٫3 jlծ,4"xfRFY%UW 4|iˠx:o,ẹ}6g{gue e;e"2>dWS;i_|PuOk T:LzwtkT][ dO[-#Z~!V إκ=xnC$݈tE.B~ZRM/(Jjy|+;+1è~Wc4Ay ]I6#go_ 5z>xo֚nmI//avͅG}kw5Bv3˷2ŵO.*M |C"PԴYIms[X;j22rF`PNT|7<;LW#]hmy^;Hspܜ>3$jvbS|滍ErK|Gemt+ >;K&uX-I2n~Φ@c 6`A./Ү~ ᦥ$z熵.~EyM آw ՟| ++x^=muavVPU ĩl YcE/ uYm2߈]) 2[+ TeRv}ןfQ?CxCᏅ^5oxjkmnYd2Cr(rշI#]XUcwzM*;ʛaѹ!#e|JX:7V z-mYe[v_0,+O3ma_F?ÏxþҼAx~E.io!{yey!rL,eH/nUtkw)EEt <5b]yX1K<'ϹN+ͼ?WVf'QA要}~,CÈ]-.Zmo4fP Po<8IyoڶZ{4.f6,N] $ [#QUĶW)$iΗW/GUm_uR,=FK-̇wu;!sb.bO9YdI7r;':|rcq!idvCFQCIT`Aas_CoQfP'ː M'嫻6 r% D˶[#;l rk5gyWP4mX LH m2>])K6.ҏ,9vvuu5k_U]ҭmHۘ$ki7`ZZX/5Ywp7^fV(ZFKإ%8B!01FAw爤|r*5ͥuJRORI/EFktscs`ڕv4xc (O.I,A;AEݵ=M⿅ߋ~,tiSIך3îѳ4'Q52༐v-VE6CjuHfހ!6ⶺV=+0K8v$2;3˙#KIqir,3Iݙڪb6,#`H 7Wn?K2wF? uOn};sǃh/)xB,{-RLW<Z34 0vdZIDj@Ii'IX`$Mt(Լfp | N-^9Eջ&9$>fG$msq̻Ѵu$hՒ8eխ̕T y2|N-t܍e 38݇ 8X 7jrX k6C!{/~`=oxw'lma J-t6$Үk덗㌗i7@HWiSst x7H3+;|mhnmAp0U3Teo0(Zͽ)HXpW8le$ m4Ei"|CSĺ|WRDlCx5tyt!mc[M30Iw4YͦnѭxpἶIcen2_9M}mg}:J<ٝlN@k~G^]xZ uKeyBmg]YIse tk$+#.r2 r2:R>T^FXJRg>gkqz/!Xi9x׊$p{DḧUK5լwPm `S`tM7cN@mỞW eyIwZ|^#V?.cRn )8E)ZJW>~5VD]RK{-\]KTRѺ>یÆ ^qO 濸tDb6)A;x簻nI8y%LˤKZF\܂geZ89?!BeNTW>jMfH`]&/.%H! R0Tq=4:IryU^\[2"<2ewFX*9;SmhZ[{Mv <?,Ed$FL͞k;OM3ē5Cf *.^7 l~KPj0_E$Qr {\f7&hwmߴn@#&5N6z4h?|? ֗,^uUQ4}3LE`ZRFYGKD4h#iϔLGy Yn;i_6~10jWJc[-P+6zP@>c d춓(70 !e<Uoy kK/xS"[Bݟ.km6_2Gs Y]t%r*LҨ*Dnccql!ѥy3@1"C6d(͜ $xh~&RW+ D 2t=}S9^]vGu)lӵJex MrB;/d ֳ$yeiF6C gv|5=i ީ# "#@KlpbCRCp@tv*M%+|"Cvm[i<4Ecf|g_~ x7]]\E\^gU;F $mvtk=FKUn]McrʲW\G⟏_>)|?G4K+ٮ:k-\kNrCLMHz}]uaSB#4mHrXՀ 9+^--'֒Y\]ZYGPԓR$#Aqg fE1@nW};.*:}޻ fGA'@pHW+vPqp1V½+]=nu{y\}/\PCW~2J>o/}_뭧^xSZӭfլaI+xQ d>)E$*)m?#S?_ilb RA崌eaSϧk7lD[buBj`6q M{mx?Jh^F&`[F8'qq^|ky7L5_KL B ެ[Nίܗ {"̿d>Gh.WZTΎ=BEɏJ9 ?$>/f/~oZczfLŒ 8(㵇^]7ķz,[NzGnlEs ΄# x⠸7tsYX=UӭuU%H̅ǻ'i8[vVm=Nn4NX6׫$mwDΟ"[K&*TCa#f)t͸o[٬-Tl%̨Nd")π?i~5 [y[O..® $,96 w|u$n%Ǧg$Z1^H邆xe'@JI?_oxPt[3vZk=jNI` $fTyHC6:~i_ক|/ZϤi^#:9?,ZI Ds_=x3ڬw^&t&Ѯ,oݮ-PHF0VH€u_IOzu=69m􇽽[{',5\HaAi /4YߩVis-!ѭmILj23Hb?hF766Mad5XHC,lr#1SsǫJִRt/Kf;{yER $ˢJ@NMu׆-/tų Z۱d|,>wB؃)JMcOׂt׏!Sӵ{:J5!;Y&Ԓ2SfvGϋ']d ]SOKOlN eA]Q?Ws7Oaz kZ`4-Rf[B\%hyo&/^)ӴK;uX8 Jlsvz߅u_ Ad])!ѳ.魾j DR(G7}ȊO~_ |?CU1k|4yN=s*V0[vmF 5h αqt1"Y/euf*]pVKpXIYjzu}j,/5Kہ$$m109Mѹr[U %~`fcnT%Gt6Ȥ`[/)w:G[¢ӢĿzaOlnt/dyr\, #x:7ɼ&\ ȵo$mC)ޒ@.FP _i:?.߃%y'JЎRK= zZe\Ѡ{1Ǝ4L2F{V<#^ u3¾*V~ws&꺼vzXgdY\F\qX>%\x@KmGSHlf٥դ+,Uĕ^~ӿ|a B^0,dl)HЗoY^ٕ)8mW:t/]YxI5M/X Y,$(]$aX{rTWB52Te>˾?ïY/\4mktc.׶Vij^6mu$Q!cBDt*OE5ji׺^ލ ͤ4QjvצЙB4nsϏOk? àQ\[jCȉvΙzmY cBƿ>+Kņs^QԵmgM{w"uFk[0p('&_۝~> xKW4AmmXcnkOJ(E`q$Mf峹[ +Hi ov"{#Ú|mcM%:e:}6A 2Kyq֒J[c$6kc__ᆯ ѯoqk;o|6,"/{ l^)J{'M¿k{MoSE>qk+'<*"Z|u&]K=^gE.O .iRO./P#̊q_kzbRO _\\̂!]:}&;1$I=X.quе_X^pJ/^;mnu+WcnA1cbSw[ԄfNJܟ;z-Y_XҼd×6Mܷm64+&XRZM+wocߎ|Smk{(!Ú;V.#?0vWi\E|ai׺:jᏂeE۝+7k6M.-{KӃB$\̲4kh 9|A|KAsNд׎ى.tˉ]nYsl!9XJ7ݨ~|;J_XzI*_.)eIDHcվoǗijxŖZaiD,ւR{xB0` eֵ.H-{NQ]OFqZk"Ѵpm3yȂ)s]xS÷t^[^.&s Rhtd( _2Vx]UQTJis4Ӷy+/|4Ӵxc/o~/((,YɆYAi_q5W$ux-ucqyq؛KfngĨ Ұ< ȡG[it>,WD&q{Hy4+O[hUޣx5G:iڶ54:Nby4jQ\Gr[#KYd(c(_~>ίTA=36m,-ͩ|Y2aIc7`7+߁Ah:|sk$O[4i΢=.40-Y11d*FVQm7}:uk忕Vow#^-4 n }T..uVipУm(e[~0㭟n7:uX_ecp }DlM8EeOʠgIx>#]MKOiGt ]V99wf.O=w[4KM/DYTܵ0$E A NjonU}}nޖR䋺~SYy"䉡"E)Qz/A-+ -M˽bB\G$I SN$AB<m!գxZxɤ$z/٣IG@v GaW֍s{ԶkcGNئ IPNA y;|קkMZ'|>fkm:h'ңy 9[l񁴲LP>_එkzlL\=Fh-Eų˔(&IF91Ȭ z<}=6 .;Mt٧{8U[w)>h#|M+PQhM¾0.,U-.դ鑟I-~mYTtwgzwўIyZXtׯ[WԷ..pb!$Y"i#+<`8k_ִ?]11iz5bKk} ee8hIbx$۵O(l&o[n|?x9ybl(eBW2FL08Ŀ>)$5]GY$e3kMACWf,r)RN2VJwv7>]|AQ=Nj.9dy)Xƍ̞GX2GHpbe t 54dUtlUfS.fVDed@#=:қT%h1'φ$Sq !Ԅ"l`r8Ҿ(]x>P#ĺ͟乜&t4F! 26Ǣf/XWvH-7tK 77W:鶱[$v3AI,2,S,wI]SY xG{k[ [ n0<Б,R#: ^0s~,3~[z M5﵍]PWevHmePbYJhvQ]hJ)9v^)?i)ӓM6^-Ffh~<"{iH]G IѼ7Yt?=?\}$Z{xeiU=cNo9N~i=mXG},T/? NԾ"wzu3RMk$qJKE¨^N5+8ɧ ugtݭ7O2}Rz_ #->1qR{qͭ#Jc@yl2_>(xOK .u/\e! FGXI'Q/DjxW: ||L^̋aosu.y.T$Lh7TJnk-=\= Fʹ tN>!^۾5Ʊ^LK4[67PC3{U o^+Wt+?tv]߾x"h|fKr+g/Z_9_4Z/X[xIE%ie[Ƃwh ɰ$ܲ(b~|l#>i:΋֒_ɲx`.Z(RBYJyw|Vt=jO7>]/Z~r4G{6pJIR0$sٔ7n+):~[u~'=-o,ZHL^O`-EGxѭF]3.ܟ5n}oh*,7){#E=vc(x9$p^uO^Ѿ!xS]>KSn$,6+ƌU "S ͨi.e5m Ѱ vJ&7bvuN2m_M/=|Zct9ZuqdʷK[G{Fw(i6]<-ëx]:Ѭ%qt i?=Z1x9Zuk?xMƼ7*<[5qjm%I$O++y{lM?K{ DBy_hf@҂)gRVk]Y7gKc.fROEԞٵoepO!Z4q tea2Myǿ:Vhj1۽\h=]1j&4Td"rtPݥׄu";_IAiOz\1Kn#/W~Y̛IHUUoҚ:s\Ky[XGL9e'?=%Gǿ 6Rk,[+ghVn]GC>"x;r’CEu Zj+Ȍ Eፘۅۻt*|]X|j4_1X|=]Kl <4 6]>LL3;N+WIj>$k=\bLI+d1 =OY<]]xaƟuieR=FwܕS$XT18.& q86i/v?᷎~/jO4ۘWmΕkitwryY c,[1!P|IE7Pd,`ȗO-Fp|+.Yvmcu w\"-5;KI"A3.ה|a_Ũৠg:Fmo}חMOu{uC 5k[iqFK@;f7o]W1:|ch ^2휷MC,bi#6ƅrB7 Ӽ=ZhZi3y "m<`ua>xYP_VoVagkco-Fʪ#I,Fi8=mٛl,# a_ @t{k+[I嶁e#¤Gl.9pA] hrFt" @X1Q(*Jni'|L񽾕6UtSSW[}=4/tH<lr@FݕFړA>h(🊼)du.%F)s㈌ Tq#,x^Z{dg.nK钓q*+4)+ _FvkzMԒ\K8s"Hf ~X2̣e줓vhi;;71FsT˩3ZIEnК1ao=]u9+\XT:1]tmwmkkmcI8}n}Ueig{I.CbZ&!m4ʶbVJ#Dv\ VPp+o x#CoZ6+ i ii!"3!|^KCeh?|;_ FLr\DLg]AlGu %X0 !>\2<➏qxTԘ~*Q+wg+3dp}˙ϛ)˚me~Wﱴ5ǸWohZf[-]OX<̓4Pϧdh$Q$exbN65}Fɮ8[\i>bx-FO[ kkٵk3THfE ֵKH<;w'!o2;#I攢a-C۟el5_;/%.n|NĭMu/ww$:κ<83:'-Br =߆hOH<dO ŢKmsi^k[-իw2-̻X>?XS=[r"C$2VV}&[9׺?lꗷ~2;;Bɂέo{n[J+.HSPN=lhI3\߯ #ƾ;ߎuum:h^X͉u\L XZ8m $'| s:ԤOgUdXZB#Rn+Ebc l\ :o#61_2 [R${{dUoIu_Z.n4{D<{Jfjti^)!nDY޵ǽ%ZO0 6cơcm}yY'S@R6 pRG V.vk˭t'{x/Xn5֖Nc5ynwP.s* 3xA𧆯M^J4dž2$0s\.ݾu5*Z sh-V K[dڗ;"n>9,54/]5Λ,6YrZXnIfa7] 5 xCVmccMcF]SNevf$ G8.I>uJ 2*ziz4< }ǮahmqD,i|x%x BF ƞ'$:&}j{{icUH.b!ߔ% }4>^>i˩fS)g{-)IX Sd3^X#V4]'W;x5VX,ihX P wƔj'w4<-S^.eeF5Nro+;y^_Ow_4/2Z״lɣh.(# >!yFaoFN|( "$sT2ĖؤfѼZÞ-4~cZYZHUpmvr_ J2z|?񥿈4+hPwmݑI>\d1 PmqꖃLAMNxl*TF*+OUӾß?Վ4]Xj7cS' X;rF&{qc\>"gKdlbc< /ryt+_L0uXh]ŚŸpa$P"U (}f\ 0i-K\Cr3pWl3KxSU`Uie R-gz_* <ԕd`% -$Y G5~&)7|gxCũC!KF9%HQ껔lMO৊>|66gV6vR+X \7JnbxF~kT}/|QuIsQ:g؈^. |6cs:nqF}t]/g(7t~o Jʼn<~e5ڌEIcaA,nQS|-Ċ],~&{.nͤ$o9U\p(m&o -qC Ώ sO+t}7f?xsC4Oigo jL2~Fd%J2褍N*-7m.k6j0ȖszC)l7†}UcuH<{t  riO"Y$\ʆP0ı>XJ5ٓ㗁=;ƚ.q/.k +Sug#H/QVuW-GCët{6(ņXº)`_$x6618H5wLKi?=;d {^]p"HUK|?Յ`J* aU=ig{-O gThI!I'ye7!BEFjݿ.}W6l׺NqHFlq&,a"mZv'ڑ4%>lq2bTlv4k>#..5sQ7|UeǓ)%O'ido/Q\jh6։iӏ[B !*?}`TJA.ݏmAs)[laxYς8ʠS(c.W0rO*Y6vG0ܽnutXtخ;ޅ]1xd #z_ſ ~ Adžon<3e%݄WF~q ](h Wh;/ٙ$h 1f#7!Wtj 3\ʑAs% m#['kWbʠPJX,:k;}ٚVxڶo})5nZϞw=d,ֿ).Œs&oexGEdCƖC*0շ>VQZ3xC[za:M:_(_d$ wav4^fk:kfYlݕpұ_v9q9[nTw_m,nx;tIk&HPk9 Y8\__-c[ңdO"I%uѶ@.',|J8 |EjzD:F8IX"ʳ(T`FHj-Ayg7HKEP`PQ*KcEsX6M P>.㹰D<>wn! ;rrɽ &y.#"xOŗ_5xCu4=6=^f <**F0+ ɶ|+/klWv2MI6dxS<,u7K[^]zԵ=2A-DɧA͎\n~nͳE3$-F( :}A8s1U]>H>-bK8Z높 d;c_݈RNܷ==j^ ߑ^MݛAo$˶!bp vg^+jV+<*Q ى)bC!B8=> -uaЊFxͫNc3F1[~ASs,iE GözFjUKD Lta>1ămC8\z Ooj^\D>-ե×q-dE P+01x[qA-ol I% 3 8)$k<7|Myw&f~%ͳ3N.Ǟ sLNnS-˧/>!);Z"U'G6oOAJw߯go-ؒGu*_fs~ $T )ﯾRX-ɞ[4 .O,;Rҵ{c5څW Qr!g8fE$s<Tpȇ-2 2OjI-biL!4C. @6o=8篬&o$E)P0O 1;W2,0*ѓi+40IT]RA5]!9XHcPW,AT|ayR[LK b@N0_eI=HS]u%ĖWӳ/9PʍɝT0qߜг>ˋ$34̻v&vsN3_{ 4֒Oת]J@g5RnE*YI tg}\d(K3$ Cm,nA Ӧk?-;HIBs`su:k>1jZş]XēR应ϯ ͈1GCqc92'K}jW6EiDm$gA˼mU28;sץRȓˆ'WF;6¨1=rVvG/,Cy03޺{;;y.8ܰ7[/Jzu X5FbEg1wgh sY;ms4q:.2[,-#3;jin_[=5!29'8=S6+0CC,FaFqivT]X$x$)-lt﷧gOI6$id$;2¨;sMk[T6:Z/ol־:G.iKY.tdBm獣+vS5P>o<Mq^Mv.xStʰ^3`wr@e_^ҾxU57OK[]f5(X匑ri:Mn`I5 L[#][^^IY}y7wjB;HPq `w_ u Iu"wZdZ[[%7qɶ?*(cRm)p~tօӣ˥ެԹ'½^Pu{iVpɦ}n$)iVG0[v xX jI7#f>Y[t`;y#% ^Ny$Y/#Peƌ6Q*35izt:L =1* Ć0@£tN*x[ Mzi6^k _~6" Ax"=DbH\Oݸ*7*E ?>x fޣӬ.4n.H32O8x榺ƧĶ\|-Oe+Lw3Zx<+vd'XUSO68Vi^į7 `+NpԍkQ|mx{6jF]f4ѭYݴ@oY-6 ->GWX!tmq -ԆqYDb&xzMe .$9eё[(cA=CWX9٭x#lܾqTaF:zvvKEy]j7Awt.!Q5C6ܙ;Emű]s4j> <u {#h6YnU@ hfzd۾׹R´ZM>Tz/ĝ3Wig|3}qKowN9t%(M caa8Uq#->*֏F"]Iy<*C,s@w?<Ǿ3*.YWΫdp3)hf7$%~x[sÚ q,wgkQM;ZƞT"4AR~r^)_C|A K]H\Zk?hCwk5GnQU-sAEuK}Hn%Ե."q")KyY^AAG-w]=&!*I['26&@A1G[$Ͷ_.pd*Uv}H<|+(aͪ-~np I"HSqNw`k[QwW2 4ݯk\ԭ>(7JK Bm"6Wkoum[|,3Yxz,F4x^hc[K[3; D(`d8RV8}B 4}Nz#yT4 7m_E>#x3f-5ŭ{q2vU(" `VQN\z F~'+]|=-_PKfBH:w!1T8 6/kW+X/4MW]4i`.BWЗ:/?^%V»48-b*Qo6is$s\bp ZycM185h /UnkKgQ{8Lj"]Pn_&`͹C ^V=?NJ|/⛫ x?FoC5 UqK/<[ԬB2UX =KKte^y4KPVw"_"]n;iȨ2t//0ov6>)t?&ETM.$v}t}*P-cKѶKNlrw|;Rr @#n"VwvI3A_||8u=W3a!4Z-is,C&beD̘ȨbnSc׉=gXXg&m4-G#4 7w `@, zG⾱{(%ޙ{ϥ-)-Ǔqmuk.w k%-k>Cώ-;,^k鰴mq^2c@؎uga)/YN7< !{ Ƣ[hD7dĪ ܵ7zNJ|O/?{·Q7ڠ8KCk;8E.P܌zuvE<_kZ׷M}|C5>g]9Iyd0xq?"XMkO6iәŴXcv el k_|d\Ӷh:yK[8.'*2I4hS{0MP •Qc/ax"dK{&X!{ZٹaRÔ,^՛ncmhukZaxo&=;_xöڊxZ>pז֚uq 2^&@*r0q˩_6gƏçZiv.5-*8Nopֵo Um=!m/nC](G0@9'jr\4IImNKdq%Wdṕ|RDyi$Mu^˪0l[k/ѯtKFφ ;EdA<=O h˩icչ{fc I']őEUo~-_~ 5z=НSDb?rnwA׊2 Oq"I54Vν ;*Mx_ℿ?-Y 1Hn%ViEcw]cwxnjKcڶ,m}fOcxLĨP1U8կ:6Ɩ>''5Mۛ+U6xQс]dd(e r7iV⹚wόVYZ%XmOf H |4ӵUw)MZlu.)a!,V d9e!%7Aq񖅪x:$k gE][Gn ?.$u'5qQrkȕfu,PxUm9q 7SV-$p<'݅`͵>*#^*𖿭xz:vvV?OX7RBPj7xCĖƥ K5DE+s0DP#G~t]GC)%e{["nc89Y TFJ2I;m~XyǕrr{mwzEp'Sdot=V@\;+hљIlZ/+*I}7w^%iovM+:ebyd UTe[ޭsғQXA%hZ\ޣF]E&?HD~.u]G4:rhN>:t()<3^NYTaJWە8M[O3cuiMvm;[ռ?8U4ҙnXz}QI!Rte[kq&oY֬o4}.Ry5-ЯKvur!p4j.TR |-nG sZE=P(rٲ)A sSkIJ*뛻or)v<6>|Op[j_@Ǫk76f|YUU84 `UߝbM]{7dּwixiW)o5īo00Y,,IpW?# B[5WX/dYwc GG܊鷀ĜTu,|[cs k4m!dMr.m.HXT`D!@_G_u GhWZdjR\˪G D4r FH+zӧU~_0l6/zƖ.&C$E#GkG&'H`+_e?? <|1\^}ö]؋K$h/m#+1 3ynbkS6MԧUXR)zE"]]N _'YQ$$8*3uZ]4.6l57k9;WVE# l5Hab[ƐYjYTe/'ɐePoZѾ;OCN⾏s<:<b[#x.$ˑy}v`$=6h{Vҵ èi^ 5xd Whb_&FUUܥRx\{%/8Xu6=XVB#(CL4(l{OK}FiCSBĢ'+D]fB+ơۭmǀ> vk4e Ƭ&Kv0V]՚RSOCN[Yj  z}>kIj(b{WEiGf2p%ka_ ;o:U6^sMWL0Lqcux]։vhi6:b5אFxm*NnJ]oo -Φ~x=-5\iN2ig 7: Tm)NSv۟k>OHkTK,ϼjzY&,W(6v-I- 6b,ɀx-nx%ihTzA3CϒZdke( 4b1WbHODvk?s@>&?\$Asy={@j۴qMnX\ ^+?iپL֟go[h2Fg*xkMY_YIy=m=/أCkh ;N)V%w.%y;-]#'NPi[5o5kGCҵv@,/.C"cb Ǐ7^ 6ZFkZt!|77g4M/̀<:@n1+2[j`J n񶧠^BviO=R?H90Vk&_E W2KrIӮU8Z'uv)9mC>EiZ-]nIo:g˳pWiv^ONԉTKgΊfhkX|_rdoh~j_|[uw6(T,.m!:<žktrDn}z/6j]kL[=~:ķr)~Kݔ\vn+EmӎK^o籬j4V> f|L~Z3ZJ}Yo\H9x58u)+o Z|L6OJ/u"aum 6Cf,C@Ix"ωl{]+PѮ%$ wlinnieu\ǻ`+ B0׃ ?lRKkyRW#yFKF cj"h`/ϗ]uV7é+S]X cmn&k:DPdhM7 Ƒ22/&/6-zie彠ln3$E)U*# ̸f7Oomqsrڲ^iTj^K/:@Uː֥oRΟhZ^4v1G )WMc .w('O-z3A[ac:-\hfNVhGdy|`F wxBBZi[I Mj`Q]< K_+{7WZg ]LP%GVL!kfcO Xwlt. y-&aP[hq\ϊgmK]-*kxbX, Oq xPҊâջVwS:rMkMHtGXTu;mUi̦;bTX>?aa#Y]M:5fxY O1b˔dt/JYĆ+.ޫvKc^)dt eO+fxH̲ú4-i) V 7 ۆN:nJ6Fw}Ww}BG>$X_5u%ޥq, Gsh7FVP 7̓[D4~4KgowZ>;ٽE .E*L-d@#(?@W/[~$v2ɥGs~t| (1E _sck_m.PtƷmwKoz6/⛽JIec ^Ku]]Zh>S dpZE|*ukm?QW0M=k6.n!y6ff~4ӛŶB + B 1kFdʜd *=C=Iu+\g#[\]A, R{3 F)%!\ǿ[vɄw>ft).^DI=!ܐP0Df R$ >Kjzi,󳾯ic`:YNC)`Ykܾ ~ڏoMŗ׶W&5ӥ۫:<#@ Y|/ľ$t]KGUҖ&#'cYny +4r5E\t98}V~/oi&d󮴫+˨c'ȚYSl{J##oxŞ0Դ?j>mHq![YL/7{wt χ1n5Y_Bmcgh .\'J|+-Z:|k}{‚Awsgsyሰq"`Xu*z" T]̷ŏhXW: Q1@51U4:EyG O'rZjV%L]Wu[KiHX1XX>)|WGU}/CRi%S6 .CrK>6iO|~'^ÓN4STM$jGZ3;͜ĻX>ZC[Hm+~Λe F+cu)h`!P-t:<|@еaY˨ueoLmxdTia$@łg0izf}6J?nպtukob?0fJ'hu1^sI}zmK#"nK|!տëbK}>F&fq"X ̒;dvG0c?7'P>K iU6{y92.s$mGZl|/+ge1)1N#%,+mb+? >>E^Xͥ=ֹey6H[w7 G z|mV}֡<'ˎB30to-mh_.JGR-5_]~~PIh+x>o%Zj:53ZjD#W6+%1oo|gxF#Wi]zy,wo ەGuXm3tӡ^Foo 3YdF$ıƏ'pxCþ6iZO4m-G ukdpTsQ(SQom Iy صh Ҭg|?,݋[MRI%I@.c6r7mLEndx$2vXPQubnL~>ٺYےAqjڋoM>\P`?/^"5=;Òhz幸/l].ช&o 7O3$uPZ7qafϊ|,MLfnمB2K*@nzOu;[9'̱]@ ɕ#+s~%<^RçE{mO5(.]g% *0dQbc[X|+N(|Axjʹh-ͬ1 0c%N$6&Z<=3eY--.O\BXi7:^4 ΅C$ ]xHW w5ŽH bQ EKvj;Y!5Kv1!Ftf`?hc'{y% >DX٢;$gU@deqKo:~-w\-Ɠe5H2Ͷ^&p")[k|v9q5Rd.SLC|x'BXmG᫸[;4xђdS;"fU rGR||_x Tq;LdE{P6z?'kxn>e][; DIQ%F 2w]uokESڙZi9 `; .FNuiȚiZ}맫[m+Ϋ2Rյ^߯vՒ~>.Cw( żŭ=s$[_krQ8RdܢnIs#wh0.eWk=qH$q ƚek|K%;vFb1rĞSp)Q>[:)6?x8_uiWzakoe 4q+yjBBC* {(x֡kH_jsk1%TFb#F(JF0(xO6$n˪6ʻ&sE-pJ! @n:Ԍuay*\Blٕ2e FX\ԉӕ+ I ;:eȰEqf3\cIWPQn&u@xZgK լ.L__ .H63Z.7$p \~֮4)/i&o=գ …(#D5)&Mi<1oއhݔB0U.Ңx+OgӼA~MEAuxZ]o,Lilnw~𭇉oUXIYg!#CujQyWǚQ7^bT&H $6C2 7J$qXm'Z[J8u?Eq vrD_,(8,`3C?VvT!dfkU ^M2ZZ$[4#LbXۓL6@k\ sfbW~P\)*xgqU5;=Iz x3Ǟ_5/76RŨn/&?$ G*FRI^).?ҴMXܽq$he)](^ ?pXІiwpZn-z#7R䬱2lcgt|"OS:5mBGmug4\ObeG\d9I }6ohVq&v~ͫmu9qXU*UwggmM_t%/4|M^1.:7"0 nyV}PUNw+xA[ yO=dTk3F6J9 ~!fTc?Kf2D3 0z߆2xᕟ-P|7K\0w]yFEܑ.M'+~mrZ] h7yPzG6-֖nͳf&E_%r /5/YAu[DZ}w7)bl_9]ĞS)@_i5kxTb{HL2X FڠaJrC,4Yu|缶S-Y&(FD XDznh֨eόcP6W#inw*67Wk{ |eBH#tl#ngX^4'V^a״FM/$sLIchZ߅/M#KԮ1_glP] Ĉǚ(īNjRa֏, LhivւO1Vrb4*WbS;X gkzj.WU{[27c $R #Jrצ{}a`XF2pp^7L>#^N]Ql{Dv䄿>ZL q^c.% &6F]˺DX)N 'wOOEW ȸ&3$WIk]FIe^[0˄f\(p 9ٿf|*`:߄uHKUe3Gq G+KT1ی 2\]:xR5}ZjV[?aYPM&gg̵ַKv}.so|'MXiz池rZ!f$čGUXn|bG uĤc+30;[ nBm>I+.lSω&GU#lrwm;Bnu94oՌӍjdBcEz8ZGY BΙ BI?&jm5՘mX(۟m?0&NvvFRkE}N#x>A@7&ZyzR:JXG`ը +[j(4̃@ p 0~Mrok%ܲ0 ##$ņneh5Q:ax–9<^}uyV1=:+m`v(#$|AF8Kյ{l$c)F1G2$GbS'W=lC4_jzDžkجeIyM&ҠcRozϑ_.3˫,dm#U'Ҡ{h[|śiIVfkt 9 O @pNk5A>fOI|YAiK ZS~2Z\FIV-k{ӬHҒ;m-LqnPqLdGOĚeuk>3U@Á6g׫8_x;8yZآa8U3{ 2\NVOi~/拕mmZI@\~\<{o n5VY4=KRE;6GvWZ#qY! =G8h.^i%|iQ#=9ێ5U*T$z6_RU':j5bnKǬ4 4f=&k)5Ţ2 'KA6MYNwcOܮWvp=~O` &aprT28<׸%2Qx8V84WrJD[4zK;eXЪ;79G  et:u9iV9Hd*[3 % x4[ epm*;sjW}iwK*M漬0_IRP݌p^.<]=?Q~ gK5OCl,c'hn YA@!OGpx?gdE/;hgeXe$\pBBm) $ {Ν-rEfe|%~eg\młj[{5)4B+ )p#I=sWڍ:ޤv2O$9EubFq:$k[/oxėw*nlяC,B\inzu!yyoBSQ2]ȤJ0,ҾdBtc"ko&1m2M!˳ȩU#C;Ǧ_Kkd?跑޽#@[~@0$箣~)XxlҬRU&ke>E$^" Eqm AeGݳ n ŎO=mŕOa $;z;@BhTm<;`m5$b.D F=kDUU6-UTѵѮ|5o4&@"l;0HNOˎ}2Mu="N{ٖMV%U 8S2(<X0MNyGWB7[N,$ysquֲ w , g=FF%}szƸg/xgï?h^$ѯη75]L\B>"%egV_/k_>[xڃ.֖BrMܟ5>a >zUk۸->.<\1fh"O};M, qW,\(p^#Ls3^ ?QZecD,ytj2|ˌ.BWV8FNGKVN>{ԈN2Ko(^!7-6%K^Vp#%̄UUc|8Z|}jh]fJm(,qq K&)Dy5CNgR&WEȇLt-Ed)mB1qxYon5wO;0b|2cs3#)$H95%]6wqћ&z+ƳY>*I=NpݝesYMC_ o!瘖 I䒪7v ֶZX[;H@Pyq70?0$hbkƝig^XowYÈH I2@IoM;#N]=ִ{?w^+V3[YQIkh*SnFI.@GߌM+Dkr`Ѿtn心vɥV`>Z~I {@>'O xsI<1M'R2 ~]@Kɶ7(U?(\muיՔwV:7uOU6lwuYȻ5 dy "ԕ'*v#>6>nzeTOj$slcyyb#j|i5A,u?Qgvq=&Ҭsރ4=j1r,2h3Z,ĩlͥ˜>#|T6 j:H/úmō"K-<2lFRӀjZ VZua<&7 Igld@'~+ocaKx)dy.Au#O.)7HwW nr~?^/'o !Ijz/7:9sYRŶx8WX|kG5uO YRdyZx ^8!e\+%'{?V4aN&YvxÖ~+jouŝ5-CXBwR@T~Qh>Mt-ml^Tؗra#| ySx?ŶUߊgүuKIŬZmI/!r i8fydoBocj2iJWka f[RBr7uj>(۔xKEqy kz,4T\i -tꥃܖ;A=⎫<+ j-*#t剤"H5͈IaAς X񮝪Tšh,-cDAuiipܳ$"u`O 1~(K麖k7^reD]-dgNȊeX$ԕV#_[| M/Zn&ֺD6a kL3̫|!N3/3Z_-FfV5?AҦ{1-وodeƟ|*>3G|R|evK=~wEM,S4s"m܀e ·^o2 {;UeOo;?u:e03zv23RJ+$ҳnS-?c>2r_ h־?Mb Y:߬H[]ԟ|o#Ŗ7l:NsoknC+G .عu(+ [O> 8ء9&np\^.y+-ihnV*9 Fa*G( upw_z[/GTA;Bײiְ:*4(Jp6m_^Ӽ]ľoRM"QGOdY.Di,q ^Zi.`̑Ĉ^cҨ"8jW5b 0=;N]ZG,T(gRNk RJ/}JTw2?|BX[[M[όNU5/u]zh;7%>SLV7 oqolߺ;7,L~vGٷi?t?teZPuM*Y$ l*?(cԿ5Ǻ&izA$3IS+?<{ __J,-tCJD &F,6`k?f]/\h_}mO:ORKƍ .rMi%7q5 ‚O|ƺokĖz~\H#HK=.;ixb1iq @ry?Skiu^XF%ŬW*X}K(HcOd𦗢jZ ,M,NDJUYQn, s*>Θ\|X}|Kү!XC_E%JlѲHѶ1Պ T񟊬?ܫj^;\jP>\I RLpf]@G^~YBƾ=֣-|?vghcdei8Ěֻh 4\xf]*Cxo1 ]FGt}>%'+5](C#,s.#w\c'mm7Xm7ĖڳȚK}Z2 #k䎣[5W6rXi;{lcM@Eun,j+oy1붑eiW2$6,v֗LdEPCڒaIYH^6⩵j&6.i%WFv %}/ƞ)𖑣h6-O!M٤v<| V#|[as;冸xΟL<[],csWh&KF\]èFdjdԣt@T_7c6ڟǂ P~Y^ L0#w|X=?[S%e!٥Bs!H#u~ibP K-] Ih>ΫVeiC 2{.c!7mu:f.cfyыֹ-$ f9-#!P=|]c-|{MF>zKL[#R$&Y:FxozKimfi@= J0Ӌ\+Lzww-ZY=W#Y4!BwEhw)Mw&wdsxUM6TN;϶u+yIe;$ݴlr_}?-b_]x]dk h偌v)"Euw]q5|Kteyw{.y/$I渵gA^rȅpݦ)kkz+?\*=|.m7;K OQ4aR,3[]G7La6,k߾k44=w]Ҭ?MCŖky/dXԌd0v S%񷄼W{sDxr[X&}VnI#JsAoS&/˜kikA Ms3Oqۉbmp 1"wʝؚr*],ZUs;Yugjq-욕΂Kc)ctlҏ®Jץ33k_yX5m5t}rYto>$"VBnHSo1 x5|)aKW`YڨNɦ&Iϒ[|O ᯈ>n3/hldv oo-fL$ZuoE*iwi,nT0|!ix _Z^k+cmi7y;n?6>w(ӌ? ~O^xc/A!*NY>BI 4ja*Τ%M]^Ӷ=Hϙ'#ZZ+2B춃Yh< l[pv 8DSLӣ;%ܫDņ74j#ABYo u֏^ꡮMNѤZj [vC`9Ip-SeSG&&%6ۥSd")Y(=x¦m[M/neTK{b!Y2*qF[h~:'/W?M;Lc?Y-J̖R7rpIÉ)z7oD6Ӎ?6xVOj77 u:e[NI#@#D $GݞÚ%hE{O}*_ͪ\]!. !ym30۫C<;mWᾣisu]h7Us ]9d\2~qMnZ{wA} "ؖSo0w v%n'MOž/\ڿߋS3A !xĦhHEpdb|ŷdkխnkz~{tपsIK[?[ƺaɩWZ- b/&+j6ŐT#n,08?>)7-ҵ|,ys4Dfoh7ڈ(w MO xS%QկZM5nܲ ,2` w/_|_c^ 'L}2/7beT+Yf[tɶywŒ{3(%ˢW+/mQ8Օ;4sͬ> [j-k!Ȭu/ ^yoiRo>cXx*]F%CQ_x#oū/-8ntkZײ[ŝIFB 9V$ կﯮt5}KT\ H.-gpvxb?,`]+SU_^TUi'YME29'LƓom_d_όXVbvǕ1(q*6]Ѐ?Ɩ յi#cԦ6vpGkyi!ǒK"퐍ٮğ~(gլRCq*X,eqKaklE ԧyZ6 ǚw|OLGNdb\x1&S,-7.˶x'ѣ<!LH6pBjZY.`ݭ3?!eZ!1TMğRO~i߆^%o//8YPT1:ڦw )FNJッ/&I'nzG j<;N)"n'tz|>.,!Ul pvךsQwRF&>3oa=v.$?1*L(%F\}Jzjh.LDbF,4_4I^Xu[[K岞"'V`JEy6޺_1NS_[' +Y|KTkd=c$n6 L@*ZJMs˩C :N9e2#ȓEh 忉O5->V(O5.6ndS x w =|Uk}}Y?êccϪK=3nCLF`0qPႭiEb]e6Z_Ew;.ά|X~/uwtk,w^tȲf^nmLۏly ;j.l.촋{{[ԖXL-֌,$A(@l{t? |Cv&fR^d؈N1h1`>+^uZogJCGizҔLAqS7oOHGAO |6𥏎4=ox 'Vt^肋S{nTM>h| xeV8(=wO;ֻmR.a\$$5@|+V[okL? c6|Eм>K4Zû̳7GM,M.C9|E_XYA~דVԦdRDU™s%@oǥgƩ?9s5MZ7$Kc2̤ |~"K~wzF-CE:nuԼ1F>n8mI*{N7KkiܨPQn^oSQW>$~-Քf{wt$m2ʺaFOC.|;jp/օYek}VE"y+lqBO~1KQi#Z[iޅ]GneuD]&O JWQu>WZx~5NS\[{m=w+yNk骓ֽW]wwZНY>h}{ڭ-@P-ۤiklFy GD q a+-`xQ_n&LHw.P`ܺ_|i'"jw&9^ u2h7_gt G$R"$Wu WR>{gI--%b)6Y\3_!O> P;N x:=O=v%\Z^M ^EEuU #l%֋umeB[:uv43 Edyjbd00RjjV~ۓ<{){[RpI6=PNX%v}X K5HDkHY$NR)hSzş .5w m^YrD"-,b6J>#ydR \t~_ B]Rk\Z]-^HxGiTe7m,} xRmJv@EC<}$ gaK,a\-dH @9-_h|2|7h\Nѵm*_ ^5Ur{%˃ >T*w<ƚt u7MoÇQM2*69 bR| l,VJPIl]]~L=g*+~7 oψ|];?7?k9HomQ6]>ʑ|U~~]VhQh~+՛HN=,w#?gO3p`9vW?fjpc{mFik#oww`C&FXNa=&MXv2(ѱe kFNJm/ -3$xcoe5 _͍՝Ɠc,S Z%$*Xa&kg~ 5ݽSjx7P^a{`4s y$S^i*"DZD6[c-k2YWGx㧁~0:{띝u߅<):/Z}ϊ4qqj2i݋aW1BV#do6u++2{fúfI䉙e\8a~VӚMޙu}ld!D+Pj2c%9M/cӥCtΓŗ7ĨNSzhwjjߺ$ѩTYb: Hا;C*Ѽ5%\A3X[Ix#%7wc Xd]U >}1Eyk#\Lw UQ<h `8d5Η5计E騌\W mvs)Te;wε$TRV=uYw+A i>#ީt?k#%l(/3KEԓsºtu5n|Bm*1s*XjoXOIa(S֍6~"d*DSc^wGCwtOΕhvs8c2Z!""n9 kRiڏKS bM6Si55+uͻZȭцv4YU 0$)rJEg}-u7̋Fd\\O_\/rJGf.Z@`tI6$S(oJO_ >xD.|CgngqIXʡUS 4'8¢_k-gy!C)i7ڞ}$`Nvs+π6Z:K}Tҵi>lt33*/gws2hB aռ}a~%X41ai`"x1 XRaH` x|xX}g^ԭ͎gϚ Id?<` 8!+*zߧqٯs 7R|^1h\W:Ք+r4dE/~0IQf[hiEiZY瑕Pơ9Fv A`ob?)Umg=Ž:bwFIyaͿu6`0kN4\jZ6#v O<{mك mȤUVeRzZ5Ïiڅ爵oD.,4/hASTU6&FbNmF84h,_Ame"KJ9y(C!26 6BڢiU2C 0ܥR]SƹsxVĚYo}ͰNJp\8^FEhB 9Tm&9J9v>࿅Z</kow>l$)x>b! Is_5^&ԵOhodѬ.fI~!~hS/8z{<'% M+Q_eݔ̌E˴0R$c#|#/'ᮓiYI] V{ơc#" ")my`/w7/vD 6!3J';Y /TW]P_x[$֚aO sFrnWnpf/|EAT: %4ٿT1ߢ/碦XSy~[Y{h$[YGHQKY]vliЊv/q7r,.A.:d,0z&wnU7\< 2[&RWcs~xDm̩\o PK|ml] dlp\c$Vs|5Hol-fӵM8K=2y`\ \;!ơ&%Ӧa׭ZE|wBaK2ʜja;c~u[º^m:|(f Rf #Oxt/y⛋ ;cwvlK9,5;|73x7CB˧3jsԐS I&h&i>bIdJm.9d ~&;K-oZqx^K9 d Z FpɓjR||e[x#źn Xqoe3΢WfX@svMMtt=wƗ},vQtբ}Rܢ_\[OlVxL. 2~(lAk.F'2KWemK?[I,y2LI$&ȍ\( xOe7iꮴ9h$<'OԬl&yW첃 *#ovwߔIvƒ$)ۆ$6;U{B ;ZgG2Z-xe9Xe1&CAҠ:m䰏 DvgpGB ޘU}KZI BO&I##HY e$dd5QsۘÁVd v9u9jǺ{H7 rJvE=F2axHTYFz62sY6ȉqKxJsFAmH' <[7j0Hx >uinT c8#I.H+ v>t s9?hۻ3}o$4l%1mw%Gڸ+ 0 lWԞ,>+lG=ƹiw2x$vMq3D,fbk!˗O${m4<6:@;S9FkFҵh) 1ʻr\aIp1SMBVRUtJ2q9]BKB==dHC߻H>E؟f,lnٞP;Ȩz:Oz҂kA4-.|nxH__ ^ZhZ^uk,JR4n[o!6P?'$)avc[QVQpᱴ\j -|ɃDEs~Vn^UUdi>jn9 *,.`*$LnP9#[V XLhCuu]%~sV$I$L2|,$+1 mOjv8ˤi":0X]j#HFc&7z%q.c-Rzvvl/'lB=]%RQ~о&wo[|!/tm!Sgg^Xj"i.nB4,.1^&/vƱ.$ma!]@9#KNSm1'bѱ6np0r<9ڋE6v(\V<[P#/*0Ij`^ bë`'*?+#iŦl_w. v[8Z?׮!Ͳ{whѴVAfxl))#=9ܽ.dh\[QYif8IdylhVO.V$8 WZ>n> ӮGcwY CdϮ3]v=IN:M5nu4_0p,wr9]K.X`W#OEi2DgG21Tyxirj/ggkX\f{ykHy,D?&B'#͓C#IqkD7 C"G?xYGB]ڧe.VnnOLC2/k+m.zv[,U ߴԑ׃HQks1T+ v 0X t$Wx{ ^ӤoEH,lpe2 n `q zVH-%9n!pryNѫ8rtfcYHcʧ :\Sgtaw a˿j/Ebh{*9o#3CGxwE17#U;""xDC'|Af_Pp%ė1`9eP ϞO ''#B-xw6p);/^Yd\m̃bە+BRV?ŷWY?OrZ" ws+DdF՝{H^sB44;+s<:M4r/2n|,Hy<BIqoRII anÚ^[X[X.~Ϩk=IjwK1>fKI+y55jބ6i4WE{zѩW9keF]6x*$d1]k+K ak6] =F@O" Q\OVq{ 0K.5oxegbe<]w¿h/m=xVmlIb/RgdxUm8 YBnmZ<1wok*&Eh8v1n'6O;>Y:o,k5ԷΓ3ԦD>em+mWZ~fi-^XDde† c8DKn*܋ņlФG]pKnXNL1^'~%1J*Uj1dF+o=O:h4Ԋr;AjRMT%TtFFGOJ(Cgn=?M|ukk(Ae,qބ !!'Uy$ԃ[-񵾩eǣZeͤ##Hx ˆ+۸e >\|9k/#k>&mthd<=*F6,FiyU;v7~4Mo|98/ڳ\^k=ԺTHh;\.`)5ΦZku +4'=q4 ح4[[2y,dn#AOvZJ}Hoŵtik?>9|ô9GNT\w=V~],V6siz#\H O>jrhSG|_=pFD/ X`F֑OgNJPc-<=3Khm/;I[`f;гN Iw#Ķiw7܍7GOI54|;I ^|FdӝZLF2yHfn]Iʎwu#6[]g]^Z]]en +8䪉"(v֖N>F\ZCY?jO_od4&qɤkEH㻕!{YW+`7mA񮛭xkEĶui6ҳGgr[!@䒲_z.5FlY[{V1-c!3'qq!f,@LMw:T=u-ʺC]B 9* Ɇ7|(8:u9)J^^> N"^s6 qh.ʇv!W ˜عvp Ǟ(I:Zk}NMN'tpqv+X.7zuGOQ-JwXW,( ];QQäuHaGvx%⮣Kj(t/ñO>iM ^#6E>Hg%rAv~"Y|`O>6GlFL>)|?VOeFm"cӵ;Qnmb3`\!Kjyg+HV&щOv, $y⯈56%K *0Cjd@Fo =V|A?+WCoqwO+9R_:YL KDls'G=xvJuKK8JɥhqtDLhK_,f<6mv!g dY޳DXKԪ6>PJ!ѡT\\&A}[%lMėGo]*8?4 jWEkr4Y$}Ѧ|u_@8b Ci -扭˭H%l%dDgk$GW|X›i+ծ&xotIw/{;92 lu cKF* f{(`6-dfF6 1vέ[C΅xlmtO K]dF+0!ѣ@Ř*Yۚ}7]3u(e-/2Vݛ;Þ%o<}ڦ[)usy_j3e$dE)#$zG|?7 uG^ڽ{Yu]ZI`-{˩k8d)^OšmI <\wogy{]]ht#%cV1 W<V}6m-P\h$HH)uz=ῌ>7'_h ֺO"9 ,Uui| ((uo>6̺_ïzo? 2і)%V0ۑaEHHRB9w ~0\xG.mmΞ"d ( S4O k4]:ea/#o"\mU|0'J[}ߘ`~xB5=Vfto.k+ol[ḳk" `#~%ˍVj%g\ LDL "חŚmu,a$V(XAl u `䜻)ޟOi馦Tԡ8y]uR~躟l, _NkP^Ej2.C'Du{ 1[ڋK{Pf{ ؍Cwm<9 $u5Jiv7꺥9e6QeBkX+O+q poj:ot1[-7b9m'H>r[E,W!uJɫ_JTn '۝;;[kMۘ5+ ,2ZH&UED_yG4xfY]cd+O'8qag#,C핶aO MkU!' ךO-xBv=ѐxP{u=BE!Ir'`p`CJa[]ܒWtqY7zi׮\Kk]SKoŧ_k9y6V'Yu ^jR}Y4k)m?m2bh,Q#NY֊% ănO|(ߍxGM.q*H}[fh?w,/+۱?.8>ogOo֦(aѯ$$ҼYcX/$.%妥ylLlm{o6)T3DF%5gڼim6]{mR-+(|;UGƋ^sc66uBNv 0V/^z>nmXi ␩`6|d/`'7Jӧ2fD"ə S?\GuGk;#c% d%(nϘRV( i=[o0.Mctx|Ex]SP>x(T1݅H6V|u0U Y4msjyo݄<FeĖA`x;XM g[\o^\X6Q8VTg]۠M9<'IΙe/l/uJ|m|42.2,Qٮm_~s_>t Y{_1a>hzGqiKkim2=masp.-`U?r:=R:қ)ִ&]{)cwƒ\?|I?F۝xCco}RQZfͱ|+vuk-{(#> &KmdDk(^tx$qwbJyxF>m%Ij0K)ج7bVQ-c`*lɩZRT}}lUG_Ӯ-ut8(ۼ"v`] s; 9$!}n^ 7vbeG)ʡWervr@w)/ſfỨVuqJ@VW X(/^x5H-sÓ.%ͅWXŨHЫk3)Xpi݆Ug&Eu{z+kaa_ۥxEz_j[jZp_j~ё%- $Deb$ˠ!f=5k kP\i7HiX],19*I \cbρUoo jx~+wLkmFEwTrwǾ%y{g [Oω5D伻bij2 v$*Thz[Oצ}ߴK~mX$1].[8HXa'`6Rطze)kt\|?-toA}gb8tEっck"DXMaJ^m籼J*lyw- ֒-7B[|Ii-ӇU+bb8~DɮW^ '42^5h-qo$07h9N[stK"F𥮺. K QR)nfX9)]𷁼'wqBz]Z\۩uxVYSVlݸ/L`ML;],$/u9-[iu}:k{[؂ܮ0 c#7π> |%\حdТZ:HEyX4#q|]ht[~S]k)ݭW/ms=fDN[~[>(w?+\XZM* etX2 @U2NO?z5i1k<>9h_ƥӮO2Kʹ)Tݘ$%l|s<&Q7[!V4U3n,pbe!,ٰo x5O|8Tn۵{R<+IntIwH_n|]7bVZ?4X,k-}7J >sf-yB2t]CtI^!;iP\I n1LHߝ޿XLί}wkaxrIYw\GjF̈́{ğq7Iǁ5]jZmǡE}{,0$(#h] V=ic;kzi&~o}tnYW/\ dpd!q^-4-:M^iz^·25ünl1o -LJHg/S}Xo'4$uUFڒ^H.& cȵ0[ xI^)IїIAHcm F;HF$eQug}Ee{X[d>j?H4mq-o#mk:,$\#Ao xPN io%Z})iomIm|*.V:)&U~ivדCAweTiDmʏ<-Roms;" iiiՓ<11HDy6ee E;™kiYdS_T|Ld/č:^Xhjzj+q>k-snpYIu i5:|+׺W [sR-pHnUCD|@>ARs̺>/ eGIkVPXOK;Z< -d9݊E;=b촿g^ٳjԟ2~G|h7tqium"{hv D<1FV{et֧|Nuk%$23J HW7O_ 9!m1Skƀ,l6>#`^=>.5 gp7v֓/F%5e$+[PrzX:N\~]v9W&:Z\^冒6e,I-cYZe=oCˤw4A[6Lя0٥-E/|7*T eFmtH 4pwcI;^ q/NG4=gM|3sCmtد " %ĞZ1m˹.z2\4ח^h}^i%$nvuGoeɩ^D蕒[LɸK^\SxG|(Ah+` |53oA2!ͭK n|o|%-Y} =s÷R=aVĤy[rC)Or_t;o j!]:]A+jZdp#P^(Lp ]*rXz j&gn-Ơ5u`R16ޖ.t;P@ReJn g,"Jm G_~ҵI죖}$X$Y ̈nb 6.$+֬O]kOea1%/ eͰNJτ>iu&~,мAl~i1屖x .#hԅddɎ%i]jUox36hNq[wMw?i H 4EmrU-5I?Ⳗ[wPmɞx ]Cyf"I9V_jjV}bKyk&l&hEDR#D.U>#7~,x>wtk]$݉coe[oir֒HsnU0\ՊMOM ιWz3ˏiχO#@.mū^G!,7).n&Zݟk5v}UVx,O4ړk۵]uIZ|Cԯ|SxCcעO+ImED95ᒏx5TP2Ţ(mor3j"BF܈ B8xH'+d\.f $ʠi5]_W^-u.^Kϳ^ɸ[ [r6ޤ(QE%.Ǽ|8su3x׋g8\w%-jԖr^$m ;n+y㡥|-g)O jP}IM{%޵Lbwˏ/a%!7>\Sxve;2y᷿ϲ嘤b8fW m=5t7z{$[gO&RخdcWnSWIIO{~:Uxo:,~ چui2xŚܗ=+DQىI#TemΟvJn ܚޡ,SزfyN|Ͷ@7@#? W!)O.dtZZi7A#y@mn_1i0n6kH^uq'LQ22T(%€EivӴO|f7a#^7:F͵S$F -K%7u.9e %}_Cͼ7j>T6PWhBw#|SMfuX[{X[s#C*"T!@XmfA'5;B^X$h\\?aPDZׅP5wZ}Yj-|L@2\ NM8.kYxS[MQغq|E Hy(aW[|8׃,4_ ii^*d{}yok=DAUrII[s-|6ݬ>> ufy( fIe Upv1uv85MHt{#o.+G0K+bӴUvq6$Z]K=P$lV׳'YlK;S#]E|u%8Tc,,4[qYxD{q[X D#ڬ|RG 3Ÿm|94z5:I$BnIHPw+z:_^v[yDJ$dJpLaknVIj io,t릳0C~?GgfB67`emu(xK7}KI{je{d6ב4.H+D A`PF:vwپe4~lȆ !#HFC,;ڵx߶xᶛ(t]gR7wvHf} V72!$q_g9.bQG5 1+2Fx&b=brM7uIݣwn).@ %I@Ad|`Iu!-RCt4pݶ)V*w'L/_S/|IUGpe$78snЃмI +Uzt+[>%a" &B7<r5c%-?gkIu+Cy 4Hr1w\ƣZiO"| f6]i,ڟCt/5ׇ^ڗH&n|Sm< cQKF U<^4RNoa,7H[(x'ݵ]H܌`njQYv8^[~:x{ijcg%  .s?YXxR-'ȟJkxxQ#܍uş~|Ki4;K #Ԛ|%o(PC!LZ7; xVUZ][kK?iřB`Px! *]*SggkR\ekq hDo!ב1$ K\`MWJMIXR\$r(YJsȱx;VҢB+ 賵 c"TVlDq҆1ݽΎ[i4Uk"H)Q'JiSTmoK}]j:]ޒMWI]GfI I*<.Jv <_ymtiҥaZ"`<؈񖷦K$x.u)-.`Q{(]DoB3]0+3J+?7AW{4PʆISEN_$⏉>-kWm;[}v[/ 2J9`qG¿Zx/ ÝTgNu-F+*8 ,7!B坛^|^Z5(ZNsImKÓG{8~,$EmrM!NpⷆMŀMfTޛA%,"鹀*g`7O5xEO#.!X<DIJv}zE"5ךEvv PrGC^{c>}=P‘ S$qqilbBV7K@?MoYٛyE.&K[GbC򤄶H}om3V/y,x;K 藳Xǫ,KdDܩvyeu_s+}sp kiqp "2FЬY USϭ}K^=|S<3⅊Di ^=k=ϴ] ]Sxu{:_// hx{a BIsJa$W!A]AW\xk?٧Ҽ3Rm&k"hbQ@+EiE眺wtHmHWMk+'zl5얖bXGY^k+Û Z.Sk}so5ôi"m|sèc[9t?.5ۥGDFUbĐH9~LJR|Vk 2X#_c  c9Ǝ}jZ佶7Lf;߰.*nymb_ \1!k^K'MVFh$eiX άJXgq;>x ^V"kZ,*?g"dU@ЬTm,;W>|Kl׶Q Ilrv(8h>g;x⾵q|//[ [x%G|%̫ 3v &[M^wgAŽi p$B!q6T#eo>&x>9+6 NrdSon &XY7ahZgFBM.Y^yujFXܷJ[Ym%mtk[[ S<*[R06 (5o5-&K-d L#I 8*Ts+f}2UԭOоG~Vi*GV(#RUmx> OZ֛ohzҬvJz}w+Sn$ m{~],7ŏ7G͸62ji8SepYU"SA'8c_Y[Y>L'DB`nx94Us/=ǖ] r:6F=On&$bo)q ]u3Qi+$Ms ,kxc 3֧kPK;;:g\iȶ)@˹6j]G"tG#d\dm3@m5x`pPQ]ܚƚe|Yh:&k$s_o} 8$mL_|J?!xn]"0W,zt19$ ,n3W*PKwVz/d8VdޜJ?O6R00 nxNqĸ֥ekbS춴|~M1z%oi/-4}ZZ5g/ 70 H<091z?JvvW0I[}.@ӡvnycfbmn*p2[G$w 2ĻR+ݟ 1]|C'|o&lR m4x~v.xQcgYy|ֶck" ;0IEsUv.nڴ[,`H#[4ߔE,73NpOBqꊳ ߀bjZX]xo@x-[(gƍ2ą.K!9+-/[.l>ljd-B63O }ɥs^T]Vrp'<9yo4/7]B]KRm䵉Ra#n %278PR9+N<&<\Ús^n{ -ΙqpͼR0X`nr !&2kͿYTʞMyV ]f1NW֡{^Rku׿|Ps^Aj27ЦL 1eĀ2,dIi}ȥ d@ar0I: ,tkEu#yiEiVȘYNǵcu}-m)!,~XD@Q EyeZ1' Y*酖 wu\b??z(i74F }7PH4hK걮5jT;G,F,66 A9mMtQMi$ܝzhfnT l(FN pW)5D 6&eceӟP{ g[ mC1.'- )-Wu⎫@1  wic-m62̊wtK{ KxeR-5ζumLVǧ=*Z) <'U[ ;:͵ʨQ o!WY_Zzle MI7||e'Pj˲Yt$췖WY<,2rZ!xc᾿[7M=&>Bwuucܱk'_~&wg ("D-9>oukw[E!K++Ȯ 8)MX^x{XmFOMEpaͱ蠁::x~2}Jkkh3}\'q m*5x4~P@Zx[W-owo"jK)ea8ԝ[%22P5^%ƞ=-CYPfHNVb0 V0X"R]뱇/um+N.睥(>|#;lT-݂Muz4 M m׉lHlht?Oubt8Yq'5ě{T~ C jl]+X?v s!Y^]fns@c޾Fok5+|HW'"ۿ28xV啯4]k^Fm<>ͧk0\8*˕Adv> 𕦉xn6 ̰\PH`vzww'wSm-m-:k`Z.ֹZG+34Rx!¸jF%\xŋsbF%O˫!H>u?@a.2 5&9k+=GC?||_S4C5֐66&di^t c$#W<ogIq,zsIErfTHHBT+Ǖ.jAtK<\owSmo #D9W#8ox@ԧ,E`N"gBZhƻZ0YBq[gMJRE kasi368hX-9OOǿXkWjZgڷ6mqw猣f(edeg8y 5uYڽ̱WU; ;|Z_$4Ska 9Ywy'P4$&G`/*|[o%PUa 5noa|c-+EIWD׭:cX}$`yBCzc-ħifHyevIˢ,FNu=!/|3m5՝żWJ E\$ %ՕUrp[{COߌ)._E|6Nq!FG n\05'y*rSʧ/k=B FT$ՑRJT}}34͂_1kEy FRVv>_5}Z;FyuǞ=.1#!H.'|0W:`Oׄ0ZH]cuj6'_Ѿ7Q@m +8TQ6JǛWԼ[Ow}\RAk=CِnIm͈g$uaKkK{<8r#tRī ?_eMqpn4jrꑨd 4pD%x@g&=q߆o'z]͊ӵއ^;R7Jh$:b) e6xW<28 h4 kti|ˇ s _T A#=|/ğ ~/xsB֮l^;DտgkIeB-+ 1k @=R$3o5W (>3^,^OGX%AWxV&,?$W%,Ysߑ?kҾGp;&T"ƒАΓ亓n\UWq4ZZƇiFPRVwKG7Wn;v[CY 1B卒 `Xk"_Iӭk WYr_eX8`7 W.WM|w] 5d4!Ktf]iRBI*~]+x@%Xiugkd,ifua`*KU{{u_J"Qx{?~#Jn,-K=bM^"[eeČ r~2a㋯>*u{&K(k+ PՇp6g_Is?< oA&wuFaI7UNɑR7Fɵws‡߹SxnWľ'4ٯXCmy{5(t#{vEYGIa{Su5_>$ia>ȋQn'^^k;$Fu /DuٴUm54>`*V֭变 e! / |Ԭ<' ×׃{_ CW8WFb 08P2C%}ɶon%%SG%o _ֶ $wP#Hnm;8o6Q ;L xm1I{߃=޼oKˁ"2(d쑓 7{WM߁3$-:1_kOxWUmFHK-R7*Xۜp+/U{|L/t=2MG]b(#5J)2B2p{yob:nu~'kuonQg-˸lZFdat|9֍b۵Wʻ$(BmU6nVܻď xI;x]$Eu mKkmG,jЄ(^̨Rz!x7^-޹æoIw,h\<_,pbZU#}:u4e|;wXCյՅ摢E%s;d=f";vEpTF>Ud ]GLJ~\|?䳛wz&H`i m4e؉R)Yj|^o4n"TmY cԪ"g#ߊ k}im"aQ?qI5]/Kb1Ogs19xXąּAjtEHiiai"Y@dS9m @>0xRAoV;K> sܲ 1V]˜:| {|-? 5v kuxkvKܛ,fHan`[d  u >5xRWW?ZkDMQb1]Cܣ&V"9;w>߈:{ϩxI㕖Z)mE "|ʁXռU?|Yx-Zq5Qne.f;ds(5-eZv)B{^ToqSO E? "IrH([P7M{][ B Dk:󃁴WqS㏌GÍ{8.4/o 4yfQn6gTٽ_x;?Zwoٛ)`FԸMbOG[ `.u8jW2JKT~K|V Dw<#xG.uh5n.&o2촷hX劀)IvpwψLڗÆnn &4Ӆ%$~oH/h)h6Wͭkb\[Y]iIUq1,B>h<)M/"GY4.ڬRݭ2I<1O 0p?,-ee+_WkkPիnB4Ou5"[;^Bޮٞpo+*VOt]ß47ڞukQآݼxVcκeLv8fUſ=ݞwx{]C@$a-_Q,_, \-sKE/gP𥥾o,F6։GRA+Fe1K P.I=u_ϧUJjK֫iz_/cxƚq}e[W _̊[cpn7@%C[ּMfƏ Σchh `ɷ䷙.7^c ؓLzlG$AP4dpꪛQ{:OLj66L~<7l/dկ<]gs۱)$T)V@ڏ6=ZkS}D.aI8g>s<_j "Gn]_ZW/ۼs1}79ID[ƣJ<+=nZSxx4:el6[} L6I-RM諾ӧZݜk.\x^#3Ƒt.-E)*3FDcRX_lx#R# WZO5nֹG"1 _?xƚϋ4?(V]>#Qc ep}鋪xO`&6`{{Ys$*K`FZ:벵;_c/_ԖZo)݈5:=>`_' Ϯf?o5ylP]\ivmn CaAKG&KL-RL`kEѭUf{cq,QYU_1Ȭ?HG|\hv\^ [${v+! Ƶ(Z)Zݷ{Z:2MoPѼe^OEμ ( m 0ύ?8,sA_EӃNƩiył!2!ɇ(lxOPVG{^e0WFGie,!]kO뺚7^/}:-m鴴k6vs39 y-^?Z}۾:?eyk|=L]ͻD5[[p,@Ǝ2IlG?x#!5%i6$P˾ [G.~c*6 mx3Ş.լm"պ]ͩA.f#\0ܪ͹TPFG};Þ=z܈&mi$ -PÍ*NTFR߲_[6~=‹kS"'DUW1lH'%y|u> /ԓPѭ!tsZc!*q]7_ŗc݆*Z[McpdclX 䎻k<1?xPOWPA`0LFKQ (I!,}*uiǻZ;~YR|3$]Yx7L5ƹim-ʤFJNJ |>c{j]Fm.eintѲU[2m^0 lx ]Ɖ_)]XxgUY_k[tu;$<^l0ΑaI;J4Í6Ο=OV֭mDk{K*ޢ4~VXsC3 N\撳;ԛվz3|QEW%>>uOëJ-$[I47[2:N#%h!b/ūw_}WA{g4gɎ{UV;I2->,$-~#k6>#Ԥkq1 i ldAPdRGCQÿ7:Y^67iTx.tүr˲Vx`2 on۶;q,-(vw}|T3.t;E[72+Z*9_F9e>.A?hZƿjφ񡍯rP\A %8VV¨b0W7zkxmfkWP0KY_k~!eXHk_,n[*(n%Ē6)?) , m^ %O=f"( | xžh֗7Z0C,ͭ&c4"ާĚ{­+K{EDF|YIg oDя+!B$[gi6h[m,<^j·kěǐ[ܼ-UQÒ\o1{[h睃I 4 ܒNr}.%mot}¼Z?x'× {i o>0m>k6Lx]c(\ G/6^z\Z:R̸Bc( X! Wh?x|Dot.mڼоYeK8d3m!Kro>"Z?oɼObV~l 2B&P8JeNw4=nfǠR;࿊.Wzծu=-IY"2Ƭr6*~[4x_kog?lՠلKeW\ۢ&rx >)W>.+9&d/<|I1@\IM; w߆.:ƽq-,,kg*g~"9ębv̪C.wm[W0ºt׼ޛG&L5}[2uź\xM]9mLo4-ʰv WQ#yxkz޵]D4{OZ 衊< ԟyt ^&×umkgso{EH`HbAX`uTo'ſ4߇ ƺ}9KH3ե Xf\#z6Uk~zzC˧k7ϑŏEm6qso,7-ܻA3|ɐN+c`|*e k,}'MN \"8Y]1!f$d狥kj׮ wY/5f$:{yה=ׄ%/ĽGϊ,kt4$R-}Xn%@-$П9[z5jTmt}_)lxjWu]{}8Jw.mC%?+1\֕EҎ˘5 K[D },"2lIPeq_|{qie{[)^ _Ȁ!eiD"=f;W c _',52Z5iXܗir!\JN0F {X7k^Ws%B)(/k~+7t]Húv=w'۬NΗI$\&mł4,Gw=I/h/&6QuEp%ݻ"I;]j<_O|5tkk%ђht[[bɂ.&XFVZ?> |Rn[6ֱ\S,%D.34XVʵNd*[=D*V>iWFI<׺}׺~!۩Kų-"WhK:/H>o_ xz_V[PO0:B޿>K X(;φ|_r=\jSjtli!=;Ո Y)/־gmX#/umVEtcŚ{]^Nb9 >K .ROWwGU>cӎK(/QMm2M%;.T Uxe,#eqxö5GMaLssGSV<wK⏅//_|]ܿikk#8Me,\Nw,z Q%K%7;H]rq"|XduW#{fe/>֢ԯ3:M@Lבd cϘgg|'-m$_G+w }v<- 0<~&/g֮4J᰸X,r$y|6:}_ևx?N񧃾MkMYM.UO&  QE.*r&l*˾ 伳ldq]ٝGNDQcɍZC0|19?C?S|kශ|jOZ\km\dK>LN /^.Po|[?·[}1/Aγm>wfd&x .pm3oO:G6|o m:_ݤ_hXE1+']XlQJhI-]t5}s':\hZneqyiUybVɅE/ &,vqeNJ ] Y vE-|#kd *ČC r;?/I,cǭX&hWՠ"5)jHbX2\1N\c`vfݯn򦜔ogLZ/Ū_k)u-͟g(y2#I9Sڹ;x_oPc:d.:Z0R[ / I-[Ɇ Htp$HxM#­$]Ċ:½ǿ eqh-VzD׷\OehƇ!Y+  @Zv_O񿁴OR—|6ȱi ]܆LU;NѴC.5/ݯjˡ\O `H5i.."SI(daۀ[Ɩ^B,+&W!&Uw?6 Owq.X(oh|ctr%ͺCG&R/yCB 9P˒Q⿆t tRH.ujH񳮟>=$l1*=jVw!K6٭aqsig$DBoc8ơd}sA;_ȭ Oō)GI&Se9^MzčoK-{CNaSLvYd"O0d$.X6(B޵@b;4F3Toï)?xj<%j>-Z6jVTU(Ie$ylElQzT>&|w5^Zj1Dg[pD'sbb |ǂ_eMHήڝZ,ZFY0T-T!9b&ijMh-,m'iS]DRQ砸BpA’Ff56<֐\i5C/TydQ^'Y1SqQ*v{1){w_cZ h6)I:dKu%6BQnq$n끟UÝo\+-2|hڍҳEUȌ7T5jP5՟MFw[{Vh4le"A8`0@r/'vY#e9QT3G$PΉ$2(#c 5=k%[f̆&Q R|xU2xxAvyiGJJɎyHlg;b?"eX $;DfRxK"C/;`OMd_:ALGxem(C\mS]G6#›sv_wSHK]&|D["1k3Gp9uڌT1P2k~&|BOu;;"j7f(؍)d|y`b]^v^ 9fxY*"U2trx࿒Cm|YU:t/8uJm#֗^kvea&h mWx?IK}i,wN"K0z?uVRFu FV[h56|v->ߨxK.mkK{ X.fw"ȒvtFQ<|k㾣jjXkRZco 9x`D3juijf{qe>gڱ %2͈XmTI"CfVg6'4O- V5j H%F!]cX@IqUoq ۻvdvVы+yb]Q7 bH8?f= @iwڧu5љnugD֙%m:+)Vg)]#  b%yrD^~eww5)wBcOfU`>UI"<Eӳ[n~6M^5p*9Fڳ~q&xciԴUmY[6B )gݻ]7ay#iߊ~'jŨh\4ɶD+QU!Pm%O#?oM+s\3,Z4|Σ;Bc7$*\-LMMTbEd 4NF^TI8^*Q릗׿oAaVP S@'΁|6|uOI3x>Ͷu $Ύ+E ۀW?`Fut˴I$E?0T$WzX䊻g_ffm׉< _O^xr٭mo'X'aF>nkozfqo5˫ SLҲSsv&okwѣNu2ۛIU$p;8e$' ,-zAϨʗi&' AfUn:BLTla$V,˹U@mi/7_He.t.xl5%vʲ! [l}W[-ivn"t 2]g 6N >ޟÞ%eDŽ|9izݧ>ɮX5а; 8%+I;:ݱYQe࿄4IZ+isysƾdD%R6˒+[ ?bSA >!ɜ8ӎNgjn5#\lH2j&9GR`y5:x=jųG3[Ȍodg[[Nb 5>+b]e?_-y *ZSv }$gVWZxۛ-_O0&[η7FĒ Mk'k3x?Kbuycek5^Fi3lЂBu`b<yUsYB` pN$N4:ݕO#ȑd,ɴ; 'ƣ /5 S H9rbh]W70ee9'FJ6y#!D\31a1 \!NI9$>-hLedieU Us"62Pvʒ,rZA#HX썀*v x{N)D/(5*?ް3I͒r drR<D$2 ɑ8!6OC#a5 tyl9 Wkf l~6E5Ιu,/x3k$OW $ۚ eB}qPr`^qIZ8>O_E=Ԫs -]Hղɔmig8luk3'+ye_d} PAI<\kOn2df*ȏ 2=[9tI6:ǾS,cB0c*>Q'ů]+_F;)pk%Gv,N]8zM5Su6ˆFx/9]'&4E=f+H96.F|е gKaMr-*[rpݘN={#_</~(|7EֺjhCo)uHՔ~ޭ ! M[W,n]≶3!V2&,NF38? E?nyZ"SlyrsޗCb]-;@_KVV6qT>^7v6iD1gq8|6#b>ehAFЯrxd'H60(]'=9I:t>3? 'mAm|C(#?ԪFym%H(T<^ߩW՝'~G g~;}~0}.L"n.}Y"ʿBr/x-uG7Q][@ gA AOGGZ޻jz׌ci0-n0!7тY"/KojG}u%ݦ7yRȋ$ g0ȫԌ9cmߋFRzխk9đ?x+-~Ȓi>UXL+ 9>J]_ 69Xn!cW 1mm`g ng_ f<*ڍkJݙن(89,S|F ^nU 0P #z 1ڍ7dR4Vv^_qYn};P@-QE!c`I -~"пi~i_<_cwjiNs%ܩrq%xcsu",V;/&޾Xϖo9'h }ACMgWv}-ùu!^rrTX psv7O(u h,[(,z Z+Gzݖ_{`eprB#68'$t>#҇n?4g#+DH>lm t+i !yfr4ECB pۀΤ-2l/ۦ-whI\ue9B THˮq!|4[g! g)ށMSKjW~ev$r(Y3pnR3 ޛi'Cbo y#-]7HXʰ0y9%dRSxu5yKHml|)Xd'uF:)FSx4"Q[!̃jpE\ XXܾ)+/n>|$x~q=Iti5Yj_` I,nU-n?/!gUKpn-N-nxŸK/|?^ ȠM3e3+NO :j^ SOxXl[Xk˝J=Zi{(p o PxnR(_]\h"^ڃdȑKˉ@Wic_O K+[&>RbyHZMPMP2{߈v"UoZ+y; #)*fXM>K}N14׽GU8V/X¹կdjyvc.wxI@{!Vd##;@"ik]BvJgpawo݀8b2m:f?%KXyrhmcPF!r2 G<7-j0xwVMye5 $B2k*͐ y*砧+0`\PxwX٩?|͕L(Z0 $a;@Pf |Vo^5 ,/vLef?`rq(CaY܃j?h߆ J@>Nt=6RYcq"FunW7"TЄWvV5kwoo4+vEc9#ifY>Syy+wfdOd.c;VvQReo+QnqG[㏈>Am#AnikZ=rYV.ESc%ÞuGijŧlY]5' (v] 8:vF_훶kIq:䟾pۜeNNxCKmwx_ʱ Ȱ'T.>l\Ҩq*VwǓxM\>k^ *:!)dg Os.",ީ+CUD-$q0H^c^Y/ iz_ eݻ",t򳗸Abʻx֭5 γdfm8ZxwTm-^6g%y+ԍz^?u<|og ,o-#Ʋ[PFd\);>*>^/07j,JK+ܐeג-ǘxCu9-w<5}?>!E2eY\F#P 啶7e>cIy$ӯ&dނ59V9lwdz -ʹvI|>5oٻZ_^Zl/Ү%aG;eG")` +v}N-.k\_J4,d&l5eWI> xǞ u[='^{y 9boCBsdz v no|cIjŎKfGFK#@8֝ܥq)]ۯNy'nc5_ĭ"`/<1ZiK)q9ݸrƾ#xo]Ky omue*, m e fM핌!Xobt]d$O_4햧Dk$x񍳖`>RvncWגՔe)eem-ov7BYWAִ9|?\-[Jf<Q3?1ӴkwPakxçPX_I0mFɑ!h??|/UsRwȋ%C`F6{|.fcK24sei2@ Rg%ʹJvJ VOc~>>gUa|HҼ.|g`m1o yX1J8*Pdߖ=4LjIQw[Yt}#> M״WQ %GocomvƓ,0^ @6|*d150Jt 'vz{ŧ/<&E+8mDwaK.yMr9|ӌK(>_.37 W>#ƭhWwBv& iJ01>|3}OTv-7XXt+d]jO(xtk*->"~ئþ%jZGu8[]hl|ݩu]fAz> |;<#mjl䷊Mb ;i^9nII<ėm׆s{z|}IÍkh|S.'ռ?K}5mNl|Wl[H)"bExMs_>3kOYwP·H#TaLW'{VҔts)E%ψ*h>#|qI5;)mP]op$*E)RJn<{%[O|l/7ˋbm8g&"Jt*vAۖ!Сu=,V)<:ͮo9HXs'8xwDo|5qm!:wnodyq˨*ʃ ٔ08ݫG/j- cq+tZx>$[#^\E\$$32pJIxKҵKO=Aa 'Ch:)* = 3\具Ԯn,:-u1X97  ! x.-!nYx,\DnZ[ۋ+ e s1҃ՔWEӶ~. TJޫK[k-*xwtK,/dӓĒF활]Y#S3IKLj<9-s]ͻK[5LQȜu+[5 -Yl$FS_SĪ# cž4}zB.-fYgMgB~U`34;p@%r)ӫjg~OErBZ04 !M\:=ue}=u1eL<#: Bm\|מ4g 'kDYȕ]P}EtU7's>'|=[xXKE<3k 5M%]Nw>ΌQ)~j#? ~ k^5kֵ%՝6z~cl,˧^%dh~%,m%+#T?KRԡKOoi;yzFG*3RoxWsYI.K6dm[\! G?凎 4!Eε ōhEcu$X 4F8a#JW @Yeo=ZZvH,,^ xn/x%.T)BI~E񧅿em߆:+l’Co%RcA \\9YF ѬAאc6_]ee#IxkEEU g_G3{ÅS巚\R/ }Zo_K.UՒZƩ_NkfI 浴kxgB!=#sxs:&Xg=pb` $*R@8-񾷯;_F=KL=χn_VNI% (JaN%s=[Zcb?JQocBH% ,J ji,VnO?eCȮ&)}wwkkaHo.CIVy`[/Pxi墘B[iwAM62d'm"\ '8vc[x[npmA0Rh6I&",/͇@Oo[@Ӵ-#K7C Ե{#jKBX՘ҌloOLc4_<.5}CL(A4Ry4s {غ]kpzRWrl ̋([-SpS+|ukQo@?M&K}KvڔT! Ӧċ,I&Ҍ=K_?|$6,5KM] U]ΔGK:/ͅǵZWo^Rn^0|OW3Z2iê\#SI,+ :qi3].iltJgU,AU,$6Oy_b^]}6H񥱾giltm,ֲ`,+BE5ꏯiRK{}庾m(:IZg='VwƽW_д /cMKO$7;^i$-LT|] I2Zn_;̬֝KZxHg 1guqm>᛻ Y,[Ѫ8SJ6Rxo&j:-Gw}+3r,&5"@#~'c<}kLIM_.d%Oe*iM8 !KmGSg;Mk&ԂP[TL#>Hb)-!I%~[[gmp˖Tx\][\_ Kc P)"d+L0)O6z/#v+Ķ]c.k7k/٘`Hᔑ7V>'jqZ>._ck}=vcY_!eդ>wj^."H|B1+¸'I`e]O)K+]̷vVnH#{6_koxyaSI jbČ"$>IV۷|=P5+{/ڼ\"EcJ7^3ZoU|s[EJiypeTe%9pd+gN1k0}%{6eK}Wq{+H]m(>CW[5U+8}Tοn+?ï|6tzγdd[1D Q,2XwXF[Z@?H*+Jȯ$.R VEc^6}XDͦ5R"pgEU_4; )OZFoi |Ԓy'cK$Ef@73PBJOi&-~_}k*s/WjVަZnGFp~%"|K;y%tT kw:܀}[o.14=T$;ibp#c<<|+G3o xC4yO 2GYTlp]Sڏ854i cζ^a4%7I$O+n NFET)v}~jֳW_z1z=/>CĚm>Ƕ~'T]Gk`iH,|k k-sAo mkgu֓xIXf(hE]e XOx'ZԚw|Mޣƕciv/twBlk3G,%iCCY sY|ܚ^ dnV{ (뵢uJQ(8龝b!8s#Ls6Ak qpm[)`$P(o7g;2@1iiC >%tY,HxطȷhKI RIku/ÖIB?z/eI}[nHtw,@Hc[(i[n}IGI!:IxXU9prNU#M~m 4*.i >,swR;vo/ q v"| ixy yQ-|_5ܐϣ_"]E< ,ss"{x` >%h:Rziyv&X-#,axF9'5G 7&=QݴXbԊI!qjʡ]?ݐӫ`MzK;PQ}K ֏7û}[Cе}"3^^# %">3yBm?Sw5gV^5潳5XQUK`|(V0SDoߍ->$xcJ6߅l&GKh{[5 *H|-Kh~r$1!`x#[Ѧ~ Gm^]:+;XZJuvVYq]*tGZ˽v>OjX޹oa;Bѻ< $UgB_zW5/W!eҠcҼ F;atلkx4PJۣ;~1k6t+5KG o, o*$mh # ; |%".tOMDmo nґs O n#+2e`q)J*n]VݭK-σ<m']xקc,qѡ1"k~e@Y+6p0q< qhZ74Vեc֯xBKq9ye gqaSP b2\Kyqk:][."t'ro~Ϻώ?hZIjѴѮm~{Hca7$ɵ˲1b@뫋{+5u6zz9<_A<i^]:idk)v%] *ּO|JQ}Z:N'صm5xeYʲyPleeCQyz՟G;G4JV}SMC0Ga&3-XL|e{SV`Ӽk[ldV*fbmdHќ.ӫ׾ov*s¼ oc p[@կoE̚FeyI ٬̲i$zW_i}@4?Z^c`I4yՎ[[G%nV\6*ƗoY^5uyQH 7,)`ޡ<{rPudmt#Y忈[RlnV8V#CU*]Miwu\N?mDC x;.-Ep+2Sƞ)yvw4igs}p,]a s3V[OM?VL"-OZա{9opw.(pq{f6[C[v!2 ͻihJ-]HGxWx>\t9̚bB$.[yE33,J|NËJ:Vsv<+NҖ5\Ve FPJ/mMo ]]x[ƜEF2I"O knXS_?j_CtXl:5ϊ' iqtӭP}kƒKL9,CEQ4>%=HEgxZjkjS[,.mityu[[;Yn nF9lo8=+4*KI<;hcMDaM{16@񽗆tAM'H0_Ewt6h6 Č$y< Ut?6/t ǭsI=wktqkA;f &u5JgMz|cy+s̼^8~ gF^ѵ6z4e. sFgvp Fs/ȷ~9/tQd.fefms EXܼ2D.ek>Vuj&[}>nPƁu"XV|"5k֛k>,խ<)>աA:t%X|E V׺CQԴmMc|1suhI`*׺l-o$-'My>4^OfդYlB+TM=Y_xN C[ƟZkKKkbַR9R I>a3D]TVS\6\i޻:^4X慕ش\w2D*̱|kkoSڿ4MV;[I\a"Љ# r >1hO㏊sZ{kC6O{oo=mD|IhqyFr:֞ÃN}9 )e{KBE=FbUdaY؆S,׬xvE O,ilo) Z) (-,:}x^'(Q\[g0!7A+ hVڞxPG HkL@|D O*vYmf\)swoOinۡH흖[&.qHU=ב>[-VּcakxQ|GoHŵSz(.#i>#k6X]CR1Xol % uHdt*ĝ [+sPi37:gF{ZhO=Ie2wo^,8jm_oVI$Ϛ'i$3E"oF¼S5'2^jZO=Em%HsBQ0@P3(7בxT<=i*V+jCڔ%ϑ$a]a+ 2p1H| eGfT [ ;dɐ2c*r _xOxfRMN+>oթ.<4*I,0G5ϨxKKE+HΡos4^K''|[-b]PpNѝv_5)-VPRմۛn'uMEI)h+2x³Lվ#gQdڝZ^_MYddR %O>m^U9֞乳dǘ rA q ]dU?F5|-uֺ}-ō6Ze3LTG~B`bF2F#vPCy0eޓ}#X_tNz%ŪjYf=]K?*AvG zx]MϏ4s0ɦZ$)-DB#a^fh<3qgZFX %fP)aWr*r@XxrWR>_)>3x ТЧI0Cugt#t|*!2 lkm Ş-O/:?.4dMW Mh쉢Pvn@-'?jnuԴxfwdW<$%28_ּKr.K(i&dE-_,l$ ݐ~bate͇ïuGd}ۙ7Wdk{hy7Pp[Mtt* Vmlf^ =]Fe_??Ɋ}Dp"dǦ1^"Mγ~!Ѡ,P"=ae k@ L9_Z mh-E^TgreqW4p]{isi9U1\Ύ! x$7._> x9{<IiH%e{^xCKmX) w-O>mB0Nd c`bESݴ/O+\xgJ$ԯnm4.5=QP<2Y[#c^2~)1E|;zXܽݧPu+ĻeH ~c!@ 2FQOGMɧx_įiPZ_\[j1j?kx;mwlWl`bHh< 6?ij Ku CL/trCr$6Uː{\|b\{d U% .vYF _cMFMov\iZ)idR خ +m&Ru"wN濌4@}y$̲OrdJɆ}C|_{wISaIoGmpQ {r0FA}*[-4HA…y;M#D7 F[GX\XO&V[Ki2a@yd_'>nYӺ@饡฀ayΗeI\EN>D)?* -JY-a(WP@!ȕm<6e6f,55 iShҬkk a\mQ+. #!oeO~ƃ1mw-c)2џҢv;)쎮oi[}۰k_oP"\Ʃm2b?!^4εmm˧<Q(,ͳom]`@VsWZr }mgqoSR2pH?|vA{SSkZb0G2D"ڴgق$$фJnChhݾm~'ZhsE(nˉfKX!%rBJW?|v4Xg-;˱+$OdoYP6۸ɋyfT1U Tm-״}2$ kd-#O*U 3$ۤo*vV+iZ߈gtTYdZ?ل@鵟ccr'ɜ|/m. kx̄1[1)lmsPOAi}ysbr򋤋y&$et p67\@UeVvB63UC\.rj|kIr1ɉ {XP]W*z*TFb=,f:ew6 [Z{ۿ4@4/yrYE`xجA`e࣯/[]Odд yBd{ףk!E|}SIngJ[,i$xEC9Br6_ÚU5-n#Ҽ_\Key.>bKWPH>[JIFU˱F| 5 FI-(l`df-"Gp >U>7XFWm'B{IkK?1o)A.@_<߉^뺡H/{`]!\9L\z~pQh^_ hV7` \j:`+Ev $}8JARͺZC|ci;266++}+e™l|YmKԞyB!%SZeIC*gуW>]=e.k,qDq 0J0L0ݵ`~ COqxA4Uk{kU,)O0CsbpN[RLX4yV & cIbWrtVEc9]Fp9҃:ȇX޵KMj,($K5&"MyPH@G).{sq<3\B]Ŵ(N\IzWGY~ZX,2#%&G2'a'?62Nk8~XN=Js!Ĥ6N}8>U.'C1o 7H x1MKwoSFNGϨ^{ Ȳ5(K'WE%(ݐW'ZceM/ =oB؝ H񜂡XF]~%g C-i"Yr%NS"MSݏ/5#D"h1ag s=Ag!JM֕i|) E4:dB(3oy>7,\J"C27 F9+ۏ*9FܑJ;*Wnl]2zwI` m{# .T_sRnM>1-!.3B#70UVr?\u 7}y#vi[0&PILn$H55/մ[~2K}a{? {;;`HcFF|>;˝^)_PiW"PF,A'h  "M7I)mAҲb Ӡv=zK˭An>˽׸õ=>K3$ҼQo$c,_?6A \?dq4q8$0Uw :u涖ƫM 8[_FM[#9wb1rc+ӭm\x]bT.A*:A2bX}$=pMo0MEB],*mO8&2ˌU4՞IdhZW Xb@2@,=z__+NmÞ)7 auqkڝņw:gGmNKuI% /75yU]sT՟tOOӮ\EheM![0;uo?-7텱. XݔgBef8;z|g M}h[6"P6Cs uUGOU' w><4υ][𦷦ҵKͰh$.!+kiⷙAe;0kw U_K?>%׃b'#pLb9^0Ȭ\n5W,+I,,]xx2#2=ɠ Gg)KiY.(>\Yq3J/~Ѿ&] 4=QQ"Eti0 qXo>#jRJVK8^Q7[K+2b[nZԍ5 q}BNX/h$ >usGA-^ߟvghx{O4IYϧA;N_t M  F_ï|(@xHՎcTkkVL*QՔwf-5mr}:w@27J~V4.4i%k{-'] X¹*4$䀠%qu[_5jjWw̯u.]<^N{ۖC>AsBq'KHjWZ?1᳨U]+[y~Ytٝ` `e9^5 -ZߌӼ+0KznR~r鱣6:ۇDǵFy&kzn{kFwp}@TgBEbPL%!':"~W[3@E0GZ6.9Ne,pvv 7uM?Şy5&l+o4!F$ҮUqk>s]:gW[ \ԣ$(YJ*nPo?yI C& 㛟wx)dSnR̛@HFbǶ>4ַfm&(5XM\[HP U'3^i2OZvJ,! )P ksă2pz䓌]vDgSƥXZM]?<_@Cw\JMFndbJF <6FZ,QQ^e*|$9;n,H"_|A5#fx{Yi5HtZ,mAX:nbg w|khQkwzQ׮Lǻy[ktGղ~W:+Ϣfg?cP>Ϩޣ~н% ,o[_ Gf)x? u GHnLKin9$myi0'8D*H*w;|-5m^M*O@nM:힟̖C$RGN 8%fUToQ/Qm&hYeۨM |Ő:*P(Zu ɓ§/iE -.4B1a<Fa@t)4?'Zȉit{{5P*y >wytm@Bu`ZKRRs7mQ?<+d<:nAZ۷V[0H/C&:.^qU 9gqX1X¿ acu/K:GwdwQ߼MiFI@9jK?i׉516Cҭ<=}wBk+@G`L`PܪN׾4]3D.E|;R%%0HW-Kn5Lx0In.4 Kխ4"Ӵ_]xbk <vۉ]<}tYlF0Y'i%X5L@%7CٞZO|7MViK;kҘlRT1};W~kzo^[o9P[TVOJ;i-YO%$1a^}STޡ]lw ť\0س*_W_?uMc_|i׺>aG =Օ@3esOٿ_wcΨXlVqHmxI5FIfӥJ {<#BPHbWuU7OӼ]oi,lhu+0M- rm`_4n>VCz|'/í* Z$gV.,š8oeK\2 .|þ𾭦j:gOV4fI-wc-oMo5ԕjm~>xፎdq}Z^.^_my^CϓuͯSCDXMe]4˥x[ܴ˲I r01cx=+> MB kawuj&qE;s̠VGħzӦk#eosnh3i4[aq ̞fҤvZ%o_kߧ9FqZ߿#R?Opn5VMm{"A6, qh6gfקh][n7Y Жr*Ԋn0u Ô_v)\\@ZY%T q˲6W? 5vZ7Ο{w~]5mJ)`8.lbe_8(GP3[eTvc~,3^['c+iF"HƩi0h:[οa.%-+R͙u`Z(q!GuCHMy.ww-'\exN'>r3A vOZx:tؖ+Xm[rm^'Vut,e"9u֛z-4Ne-/& o|^ͶR)'; $WQtSokYXEKbۧdmVW]ohd8Λei_$ki ʲo k!íEmݡ"2fERD>^ltNZ-v6 O\?-sNg-NpI&彆 WR*R0j0j:^It<&%6q=lPIHT\Ň;?j}m^K6zt+=N8$aRATwwVWbxW6ãj {cKS$Gp>m#+gHK^_E8j=kWsw}~&5͵֏y*opMEƠqjxF_ScqkfRκLVo. P1"BT@Ǧ7?z7t; RsDЮQ4&tmr ڢ&"\eGox^iVKU}Hq5Wm( G4j+uiR<:xmI[;u {(-mk6딇d$*#ygbk8/y~=o>'g<t>$څ*iv"VNbeVxCa t"w=YjiK,/cd]u@w.‡|]p&>yUKv\xo]yT{-kp)%\ʿ2eT֗wK:lnu9%NdFC4\VME+hKסç4G}/j]^x^mt8/fdFX}# 3 eF z8 (GxS\(άF [ܼi`DvȄW[x{zZilm, 4.#XY aWkNUq-; [GSk[kjIkq$eRiP."\C%,"7r'u9c[²x­Zf[[; C&GYp|pwLc|+1/KuyuxeRTFRc C+˅$A$fݼ}t}/Rj$ZŸ%;V\i: 5,'ca>>E˧Kw.y4R]"ic3!]%C"PFV!|o@w+&s-44.6qB䘛( TDas>.4UJ6зQ}ʗInT+ʲaWi& MFMˢR)=եΫan}q-pUpd0*5{-v-^1#HP1K(%07eG82OPú͍dx \:h0 XfMXu|53\j[ymqk6G mTQ I,| ₧Mݽ~5shYW| #¸Wh%`Ȓr9mT|kzva)L7Ia v)I#F6nƭ5ٴ:_?)$w+1FTcniwykܪ q)PR0 ȿ*K>o-BWn'{|;ৃ~]:HFsmL0p.T2.g ۯiؘjWӭsZ*#ul2XMzΏgwtwp ˮK-DJ.cbw4k #Jէ-|Le38ɉ%˒!tkۿ:7Q9s:UTxq/%F$8a":FIRIZ~hY6o.6-$D^6A<7 xu4+i,Vwڗ4(tH æ܁8i5{ZjKcnuݟ(nUL6 cl6={>Xnm]41rJ,|1u #]-^x 3d2<|!7(!}񭶛d±~/KmU5X%]CHr ) ;;:r[57ĝ_;UcumqetbG9Bw]DrG,i!gů gXQ<-hg.gUMK$ }FI"ʤ壕k{%/kݶ^*w]s>u#=蒶vBadb2ROZ@ VדZ7"I%MtQPa!>[ɊA!U2ON\.& 5J?d@ ĒZ(q0N3:5"5{ ?Ś* 2'm&1Aum ۗD I3csJ}Ob|+5>:$ rdIu`k=VEh!t#^7쬵iZQ_OK"ܖ*# d*zxnH׾jzW mZn XCzO싸.㵉>$a'˹; X"gȬ΅Ԟ.ӯ\W|-y]R-Jo̚Mj,"% Ѯѓ67__luM[62ʒOˉAMNwt~0C&G?P^ikeHdFKS*B'o3Z[U-Kz)⯋^ ǀ濰:UMO1kU{d_2yd+# @ |l.::Er5ck߳nxde>o+$4^ tC)[\Mdͧ$7'BZHB|?(t;.Ci5]%݌va"rHUT3Uh S=*7]l ]JRz}w=^vx~7ӪjV:}ǿ α".BX:)|Ow+W %.-$ip;B$ ީf8OO{;M~ Ӛ[Q Fa[؍ߒ ,ggr~em&iŷO ˦vWF!>m.bo-tT8;<ˉ7I h C>/_qw{x[X/Dvlm ACy mV-Ea+H8F鷯*)%ޅ]#HmݍNpP\u2X.j/^!NitmnEsnB"ʌʳ0W!xL_í2kK{;kwDh㹍-$hnf5E{~(Ӽc+>*ܐ7,M)0Ej.7+Ohiư"Ic0g4fgcbZbk-FK'SzUd^o#xCDb6Y_I|6$ʒYO1(pXD'Y >:׾ -ޥ{i 4 Y-,53C +dP͝*o6^BWrw.<'shw >"!m{,WE pDCݟ+u{5j+K ʷ9Үf40 \ wG_w^Y@Iiiitg#*+mT iWs@n6O|K Jii1Y/d_<4,c a$ 9c~;Qv2o|k6-T_6n,YILѫʥ$vş |@>ͤhRi:f*D"b;ʌȪMVww^-N[\,K"e0%53lipYjl$ْřux\4sqewpF0rxPHϤ|U<9㏉!_ x]j|MvP ."BO*Sı;^W/zЃֿDhc8 f[8 _yd]tME'#9pvCW֡5m5 'Y9&3h>$lsox#~|"u7[w6Ӯsquwj7GK刀UNdmzaOo`-K]oMʡG0.ʬw)8#ܵ o 6O7Ծݫi /ij ZmraUVݫϸgd KZ^,7}GQ-l5ic1(t`1ݷ ѴۋKy|I=NŢk8> ]DJ@h=Fw^?⫣|Л}KSH<&b,]1xQԴ?iwFH4SE#8YHʲ+TnW;٣Kɻ8;/i]v֒%EŕMm7 6i"gblqyL>63x%KK^ZђOVmmb)fIŔ8)8ʱx^vʷv}Ro-ZʇV9dXA|CbK]SN /aMvLVI!]Үp|;G:q ĆG̐H6rGpk~xƺIKlzmi*a1"< & q#Zٸ,=XE]-k;曧xW)t5!.;3i80dG}X<Fh<]78|"x^+ԭOjx gP3H;]#Jܒ#rǁ[[ok_.KZEu÷:=w-Dz>RYy&*ϗSǕ?nKIm0M3&0UI4[# R84gDυEzL$$xb<, +ߐ~-4OxCKIխ7yjqBY7$v_ x[ŷ5[28tiN+EU#_/JMّ/xGz{7Isys j\GI#mHT"BRRj7-.hB&%OO(X vsQJ8M*@lVѣǽٕ( Dd =To.d@AF59K+(Ն$6 ojм=kai_f N*ꖻg:ۓyWOܜW9jMk^Eumuq=Eucr2y,e|0HPt=JN[MNRGi=IJ$ICe2BĆoWݲ.`aX.,z|  &x/]4-RVԮ-%Vkxo`$TNXJc>A jx\(jZQ{0do-O<Ɂ0aaHYtRKeVZUݑn%IeB~` 𥥜ڼwvz̑]}(F5m 3lʵw_f |:Ү % |֑Ny䵉Xk) l}?KG~-;éXiW#ךcQB[N rdnWʕUڦ}Gm;ljgӟI/q6m2[JJR6eWrʻ^!k~5.^zMblM Mq9h!z5j|TjsGG|%k{mct{s]$EוXYPXe]s4M^i6xɮ4q14ُa d*|o+>⇍~kz/vmFkxRSY_#pTO?έk> &H'H&,+:~i6ԀYt۬$Ew\ 8b71$ZjkM-n jkN=7U˯^Q1B2"]c^qxt?V=2k[aDrb'>\Np s/0Ѡ$t׏Z.m^ ʫma9A&!ᘪfscg8U-bhbԙt$$t rJߏ I>h}?_#< \|8՗ 4}OLs躕H&"1T|{uڇu'xo7U^!My2)k蚖iiZ.][c0?|ru{/ᩅդ^jEzJč"T7:4Ŭ^c77 <H.2*N/~xStQCog(9+kuKo/^2|^&9<1їI,HXo\m.ര4Aek'm%9VYYvp3@8HgD! Qz=/ r"5x@7Ie 𵵎xhvZue]30yFӃͿD?V5,6/|Ye cokJf[vHP.RqN&5`ܝc1cíYiΉ{%Vw#Cq}θpAzτu]M_/=2uUbĻoC`Bm=$WFo/'e:uY2ex’WbP$F7~0Kgx+45oe[4-Nh'GENu幯mb?5Kۭ:v$)< 7ؖw X \a_X|B[xIl2X^>"b;*>ӴOx~3ezDiccAa-H$.֍0 ]NM,}&W{ۙXFT}p q%FneYu$b |w]̾X10jڌy;->4U{UMniouZ٫<%}]"ׯEӡ >C$6L`mƒVek 0:MԎ,`mX*-rE}kbd>0[uoXo.ZxR^e}أC|#Y-`owyjE:2 1w%Kx(eu[lSa ڼOQ _/-l:I݂Vlkkk32" PG2u+oQg]^lYvUK`fEjN3sůa ӭ ^BemWDݍW<9>KaZ}ĺ.os\6.,2wq^sՅ֖aә5!6,pGe96^] t(9u$ ,6T)Q>cͥ VdQR q6>bH ]{jv K*K H308$"'$ j-_Gu+5I?|[5KEVK<8cbU[>T\u^Zj 4ꊱ\F#J)7c A3$WG+[H$nHo唸Xn 3W/m}&G`D *'2x7h!+; vHk{Y QI Onu&f2vinjMyio2̆[tYm[ ~\El$y$y]B(aO@sԢ&Ėŗx*[ \9TmY-0b8i<̕p$m`ӚD*M&H `8sɬLfM?E\L,1oE"Jw1>]y#7[TS$' }5;s-cw!|Ӿ2 K8ޣAvl+' ;ro;#;j#m5:1OfDFWkHX*<7N z<⏃6|ۢ}S#6]'*FT>HȮ%)Jo4՞vZlַ2Ns̮оffMp$vqYj2hƩ))bg)ns9eQ@`*X͂2PE,Sup~N7Jpǀzކ CqhI"ʇ:B[|-~'|eO4<%uu{8m*,?)kb.bPD.-&lCޢ +17vZ[.Γ2<4L?vT rA句R#~xVv7ﴛҒ;ͦ5"`92c1 n99Z;ce1*֥-VgSCO' 72,,P+rMW*vu9&+n;VEX9H%2NMRcY-N/GѭukV’?w&DpAd ڵ<*q:]h&TueR yenNFG|V_:oגN')x."2G Rq?^~:͠x\P\Ԟk60Zy,跹 >aWKziArwiS_Tl~{Gi ~glwzWvcMk KOѣH^Ͳ/  ˌgM?oIc~"]&K ([yvTd*Iiljct-ZαΣg*,36i3,ܘa(;T,x.X-bN&rBrHݷJE?WI% eT2!H{ $p0G{ CDiLjhח!̮dR[ҩa$:.uۖ(y{1B.1r?3P@ɴ` *5zjBWVqiŮVeo bE!BłwdNl+܉!b0Hbyj!w[㸂9JGr֍k/,y.d- $pL^涝ȲKPA I`X3Ack$jcȅX,M6s 6~AWVz?J߬BURfC㟘5J>ϭ@oKѴh:=ݯuKmm쓣u>m*Ot~>}jO>ԬGԒY R+0|nS|:u-C_Q-ܫ+V$,V\wm3Ns^{C}^jI:\G$`o ] CcUn̹S=ӡ 56aB9s +ns]6xWNgs>^uFۢ*ݬB6NBBI͢7L&-a,%g]cU.*26T=y9۫gtڏ!grHGs\@H%ڳN]>h^oj:5+]5~'fY,fڛ ?h?o8|]"-ZF$ҒxXwy,𤓁zd. $H"G<,vȟ2r2Xۓs}: sI{="(glFW<:c?t״] NmK:|Sh^ɣLZ-&xll8s!_FѾ1|OҾ|0ү<1-on* >\\]%uRAxּHuZk`TDJGVB.^Sk+Y ~įfnnU1/́ՈUܕ^ZQ̒Ee~x J>2x_hW^0A ͺm@<(,Hn :Tm8n &dTȍu#uڀmSOsBf_)wn@NUSKKè]]O%dfDfE@sQp^gS5=Ft;d3\IoG[hB(?[?4? xS}:=n*^+=2K(N\7);[( ?V=|FU==\XLA2W. F@S *5+{q4S9U/ʵו&-Cͼ}`g_oQqy@<2\^N#GC+ȡ.4Mv2_}un2|nbx9>\Yū^j.'DK+DyE썕d MjމM[\!/iq"C 0r9T ;lߌ>>jzuڲk0bTkyhs}x^%FӖOǙrLHZm4R: 01 ?|fŸϮxQnWg֢+ l[?228)2r85>.^[MXI\M'y6I7VYzgi>98=^ן.xӝt꼎1k~qx(jZᵱ'y8aq$ln#bdu,|/hܚ庘V!};e;8tz5-ԱI#ڇuV0\^Zˠi g7*JP+C^.[]AdCd2X Dy@7,k<9o~.'>zij_5f3K3B2w"92pwveh۵gE T+^Enwh9c=[[N"KhbYF @S77$4POG`G;ZW?;aCCSW$rj8T}-oRr~IB!p)' Rvd5u{kcz~'4KKbӞPKD Sr ۊ{;/ xK^]kZ,6u*w+%3gy)5kdAKreB>nMvDK=SZKO\ B]b@^K%, sWFK⮭S]Ҭ7T^mPۉ)$lgjkWZx: h̖ܴJIŃ*Z4@:j/s~,un5[?Ok!O]Z .n& X295 UBϧũ]K@odfIUIћ`5N(YiOxmψ(oLt-ἀU N|+]NKyȴx71B %r+qm4wы&r%[>| JV՚37du ]RS>'ckZ{&\ijv,w>E똈2O% |cX&/[Z\jeݣ]lgC}+ lju_OT{W"壴97J, &ss_eKƒ<]6Չ$Y7]s^V3g(CTδֵ|;%ئx<ƁQ^?6Xؓ3GqWđw_iY-FC-W̷rK!O~do:}aOo<'u-oxIfM*qY.5/da^+5e_Zx}k6][HEŎ" gp섲GmƩq56)!)rI>P SA9T7*sO!)J=/_svM3œj~o!Ԯ,DqD ;eww*p$~ޕ'NԬ&6zIu8O2xavVs pCNn,n5`BO\6E" ~-\QGm|0Gt:$"W%gR.~cH)?8@UK}=;Q>6bḥKˢi1m*pa̳1av1JBa~h4M6­ڦ*d TPx w c?^ϨLe9- W!Tx !%@rkꏁ^=?g/~,OT廱J]܉\?'ONhSV7Q&$Cv$"2Ѵ]R{}!5n eYo=  5^M\>V^>I^k YMnyko2E21} p2j7?7uT[o ΚY/$ukwf⺚0DY6#m<+gj-oK#PC_j3DʢTѥh`CZBgÚ.k:;1Sox7mt#Ye[ BUL1ſ x> е9%[ SQK"Rx_V;>چ$ђу~|4N +|$;7NOy }Psd0`H(@,B`7#U>j67xԮmEpR 8"Q*@2qU i^%еXiݶۇY*̱11 $ؽVV;g #u<j^-K}KLZ࿶aC%ZaHEv1~LJ2]+X^k7yKopL"F9vǚ?}gറݨ^hQ7wa`7a) xzk2S.ms4*&IrrK)M'_G r<]|Z _OѼ=8o<ao{Ia)e-+ʖy|Gt< -[|_>":\jSNq{d7:YmXKfGRNJ,x*6QՖhox3fG~!xF/eƟ|59?Am%Ɲ jc3yr <e|Bg߭Y|# .N5~kewՠ,ghdk6GH"`Ȯv$ >-֞+tjpkUVwp$B$bğ~'|<'_x97О$!2p]\B̨03c~9u*Tc"f[pCCiptb['dJ9]{٦V[ZJ4MMq_ 55cuFm@_i&I.c,TbvԱL{ďVi[iC\*\e{REܼ/|ZL:ƹzÐwmfEKMyO#5/[xχ)h/?SOkxo)4x-dt!v%خn){?"o8yß 5Or K MQ02KeeDe!CiimGC#I4U/K)r&B 4/V3k8MUk1ͣ Vc EvU+(^WwK|K[.uu6IKb|s"")K`$NG5/δ2<[a&s>"}lx>j"LJhFRZ_|}{蚶6#:톭=Pn 3Żifp/CHFtG\Ѵ%jHCP~nή[A>By[HVϤ*j/-żae,.9n$S_Xi殺 >UNBM_P֎ukO7҈VDJG2A<6w/l4:+9ѸavoXxf4B! _f/}N=kj6[z?>U[S8h(>GEi'v~h"ѯ}J&UrVS,k(9]:ٮ͆7έ;[b|mֽ!еi_[M,Y*$bE vI&?mo5[Y\hKgu )qC;xDtPIdwW5mWZSE4uEheE[Y;+xO1K&k7ZֱH[{{yd D\x8RPI'ggkuwK:{-ϧ|4/t[wK$z#f;k6kë|WxS~;>3$Y K[UHc}p-}.4ˍf_%崲(%Tpຬ e-Wz~7˸t6մj2Hۼ$dd+7[>i^69F7Su?6Gmv]jvPٵشY.f[buȓfVl=ÞXk{'I8Z$&tVgbc$HgOּ,ƭKmۤUMR玛Vhx[1ntn8}g/ |a y&t%M:KmiW+kpkelm- b9.~L׵x ),ӊ-ZrJ>H۴rpw ^auxw>`HW0̥cٙN& zPM'V4ҒN!.NDo\RF|g~;j.SwG\Լ!"cZHT%ک02QN C#$qgmr .kޗ2+(/ p@VCmgms}\7FHg 2SzG&ϊ5u2e9Q@B22C?ׅ3䧶ݾiuEc"G }" _E"9 1Arx'<;k\ l2Yg4vk'؝Č=tLZGyfl+fML`srkiu؋ ,H%Y#1`=ُ$;{5kK}~&HN wW ]<8gܿ"(9;IҞirf;D[@HX:[Y,#kwi5)-Ftm|$]lW`NW<]ѬϷKag+6O:Mj~]UI 9쪥F^>'e+lh^Mca6-CEVK2A4%CǐZ.N+%_wcnug4ҥX0#`t{LS林q@cF}A,H3v%䢓e&?<\VSi u-Q_2k"kygԯRYlE+,mqK/էe}]w=9ӏ3>ZCik؛.8lݾ}c- %O ˽$y jπ߂Ýb?EjFr:۞;dlI<r7%;F ?4 [ɨ-rQ&D q lCG#,c`V+_'k@cyYF!I0,¦LOtoxR4+[]xycmk+c[%.Reބ& |KiIm[Z4ە(5mdsZGx$y?ƽ4 PաmAMvN`%r ,W%i[=k/ů [{fY<$iU;0 ~˾ XMVnm4 By4ٯ GY3Ȝ8<]</xPGF俇¶Ŵ7 #BkE|]Eq<7|wٯ.mͿ]ɷv*جBE%Ւ>z߯ 2TNLvP|@G>h/u^i! gwu$BX<#۔Osfߌ&~#Y ,n&D9-Bbqv$'vN~/喇g!׍].j[23ͻFY`|~]ދ? j#N;-m?S%,MVI2&FMiN)%~}﷖|R|i -+6ڥՊaa] 2otRA Z`ݯ)k^kFյ(ct[:T9ѦMy*ѱPUKa^3֓kkZj E[I6[h$i#}mǠ|Nռ6gI״Ʒ4k/--j,kv" l)N7[翯ejᗌSL-&t]7P,̷6de/e,s#ywVam\$wv$I0 0oi72Iݣi~&? Zg*/Guv^9Z6Mù[B*5ia㨓^5 N'K6ʹ,qUo1.MhTen}{;zzyc[<^ bc+Z\\,QL"-\H.#O64 ɯpft7x/hTS٥3]o]yCAd͕̿"G,t m4~tpZX]J(B:b|/σt>:M?w޷bi,.lgYs *ȡ#R#}~!TKFW߉YMѼY}.,ze!67KWcԨd8'9OOƟoE5iw7<חV&+Gu!vkuOgŷ6xh ImE*ȭi?4KmTzڼ 52]WȕA*$d+v^__5\&&^ m}?uxSOխ54oX~m4q02nP|1 Fj2ZWP3d9q:m58[xWĚ=ͥ͟ R $oXG@ *xe>/kjkO*hwpmbAo"g\mchkk[c\`x՚x͵qV`XB V;I*Vf#2Ljt_=R{Yo}<\,bHkYcVvT*>g H_xB|EΩ{4W%0}i-P9~=L&|Rfp-L]jf$K|OJI>r5 :KI=ԖWbOsf"R,/'/ajVwL#77c_nc[uui.Ԝۭ!dsqv3} kYKb[',G$isd܏"_f|5|*Œh`W$HD%u;Nȯ8ftK{S!Um/-nj2\F7 d+! 8Lgw/{ޕ(qoV,[i\x?|Ij6#4V{d J+9'@ w{5̱=o#"LpIY@R1|i+6|CBMiwv:J!@1@6BWy#'ȯDM ஫>;/lͥ\<_4RG(x峜l0%8r[~.Ϫ+uUAwa]j^)``E qTId.qN=w6?{X7b]δk2.hrzwCv7+kSmw* 6m~)oP/4M"`QWeg+WDW)Œ+\SioqR{o-|;kwsmp!K䁂d quuaw k$p|ZD8[h)r1oGnZLLʞI2&C%`Pψi6VͨI-`yc`BJː&ICP3JmNjK{WU>8dm[TAc{(GrJuE"sgg4B-ĈȡbeC3U.3 xd1L,% '5H};Q-)O#mV(#-džX+.+.*d\x)S:ڜMlyދY + @:Uմk 3]+EC Px;s]ֺ%D:fo]fVWǘi1).at |& ms7hw&8/$.UF3n0+g6hMoC49VO7e ,7%$kf-5"VIKwn;\xXt系7zsA"FcHdyVQ7#\XkZWvk5卥 ?gDDF2۾J~|6|k ;¾լm^ $o5&#I""v%$@x 7U7e/V]ɠj3h隂!oC!ASl`JRgSSPo|F\=$MvMnnpw+ZA kJK zce\gl0#-Jd}~)uº KŚIqGv.X Dvfԟ xxyMXcxGT[RRuV3$<ؔ1'Ԧy)ׇ:ޯoR^|Ic"A[k$eѮYbK8,O?7<8q}mxXtߺxlc@V6k"1 0^2y.iuk{-ZK^Z%ʤvifHˏ;fBn ֺljDGMx/h,$Y݃ n' <=G ӳZ5zbiiFx%_ǃ*\jm^SI~vy"oSzx!~ͨ 5k?X5O Gw "\b:12e 2|Q/cKB1Y2Vi_pk'hW\[^5ӵo=g@cyxɽ0UcYϴ5xVup*VNe|*!30eے}SM |#&Zêt6+5+g  43Z$TȲ$ 2dq S3uhlnm^ e/<[n$y,Gʿr=s!\H EKoG-8[Og4w/F :Bfpm{ǟgqLḅj5\!YA!MΛyus?00I&c@_@>SrMh_fLJ|GQ,6w6 ֓[F>bZ)AV6'~sKG7(]rYڀ. 8 ^Nn~(uyS |n x%K\ʲ$!|l0AcfHp*[NzGLkRϪE yrW˄A#vX>h#aEюCl%˷@[X>`~pO\=z9Iuhʁ, &žA5j^EܶӱxD0#)-dCA#BsO5;X&k䐵1  rIFp A9e\M:,*9q`*UPͻ}gcB_>7hzt"1,q_3+I2$P TQKy|PjJ԰il.Hm[mɫk&WRsa)[(Љx 8<>ZI#IkyaaN0.+ 2M,~m̠*9*1Cg<@/uF\EY 4 <2rr hů>7Vyei(%V0%SFr0ep[q`XWk9o/xV1iٕ6ߖb2nYF !^JqVwt4ӻz|]Mqn.$H-evBNW Hg$ a= N14Bm_% 9ePA lsz`wPj3VX EIpN6g88#DEX$Lp1߸3K3w1i򵥪Cy6y/lu3MEjtt;O/^5Hm^.gleʓaHA zKkp^shRCulTjIF+ !lmnkYS|NCMgσ.,$;J MշWqy@e\d^U}in/.utffA!O w8kMrD1kqwB6xĭ#8U%q>_ [hy2lGPvkdb$m,|ēbq*%% GRK̹88 2cjq|5}iZhW+#$Z]B71]@'ҴWT$[O3G4+ Q7ʎQUt#\}ѝg pap<U{/PjVfYxm)?!pvI::]崄Ar&@w!6@r9j?|-g_mEt=}eo03vUr~o5H_Y5m0 kkybEG,X)Om 9pْ[J.|se7dWldg^)^ˡ̴o\~4Y tmq'[Zŵ$Ml[-J;\wWS4KLvfcV`jd @$qEK 2y2V%A+'B5]4btVTd;E*ҺKWu^MOGioJcIJ\Z\1eWUZ-,^K{ C-&هqj`AmQnwbąyad9Af%ҼQnfo]i:EQ$qC"Y3'[ܵ;)\\x^^8zK/|[Y6AIHr3|/|o iZכi-ŵcf ew NFTNhO?w/LVڝƐކd LHgI`0phx~kPjV3趭~!IxPjKzJRP{ETYͩK.\O@dFEx9LL cee)}iby-9⹻]^E܆(YJl,T+H<|u}>MaE]^ChZ{h M( GYʄ)F3jޒ{O&}'Fh:Pmocz_vwĺM<ʩIԪV[+0 T⯌ XxHkMcMcL0Oj|U8m"T ;f8$`s5G6?Ri[5](YBd$⏍.5\&vqE8bN#B$%JaHվ(&?vie]NQԮnд*HUe2q'hZ)c+E+~%ùDPXF '=w.hQiY=YH-}: S/D %\1Ap"hz{o5[ytG'9 yh 6X8YI=LiՍH+}=nƗMΩyihXC%Ö$bo`9EFƏ-W71, ˾'ud@| EzփEZXѼSqqKz֋wjs\c sjU@-Hl|W+^q<>&:QmupnJZ[ET%e_(UNoI_b-h, 0a ?r&D E*OWOV~:kZ֜m^=SKgzI)ˆwvE ZZV'Eud0\huWVӲ+}[+BB x,6ZďsFڎBu*͜{{Y4€$⹋q՝Dl6Ťqݥ?f:Hd 2.vP6¯Zwam~ɭ䲾k)-8##DrTsc/`ѭ??xZGmʱ,O׭pt&W8W3u+ҧtm*+;d%GiD|;T+ :I#{ړ֗ZZ[ƶwzeOIUy n7(RŷI!t1xC徭6"$Zu,M5\u5ZjcXOm ct=̊tX)?0ai:ª]q$i{K)?6Ӟ@iꉕ8]WƝIemºUޝ]G.iᯐLFk9TīgH#?`ӟY>˸/t RQi*'ϴ0H^K[[&Ŧ8iYᵖ#A׀deCt>R|{־(xN<+VfAҢ9v(i^M8- zt'EOU_RREBݷ}#_u?ŭ3S#}vQb}3l[xg_ =/sjv&:N}q,2ֺP*""H  cO0>NtX~&ծ.&.a-ydĀauyףu {ÿRew|Cy/m^YMKd$[v@h&Yp0VTųk>5oVm|.,KSpѕM6yavdʂ ]ßρ_%fL-񺴅n#mi!H8Z1_i:!.ljm݀Ybf2Hf;kek~D]>h{/)hGXxֺ5zq%Ɲ+#b2>8#|M&7wsjuwkwvi1Z]:գ2[D3ϻ9g|1O[f Ny&J\XL*[K w)t9Fm$ѱ~//m-t{ veO69գ!ee|Ei ZW"^+mgi'5dIgsA%2$qc(T>h7.j'_ZѦ%Zf@%UB5yF?ÿ i"V kOM{;,d,2HcBshݞGKRITtG \"r7z4?um>dςF>ZxLսŵ͎ n\E+ylѦOxSw)xVeyx$4 ƓNWѵf*ty_O3\Oa&I iJ"ni8iގ_E?[4ΊI)ФlX-.~(|֤Ч4on/.DWh+$2D\z|0bWot*=IӡӮ./,Z3+\$,Ы3t vˏ.01Z_n,Nm71e,lEE̊ e]2IvK-|9k6Wqy\ 6Copd žsyoo]0FV7R o <ƟQ@ZmKhWONw9tmt`C2 *9%k*qOf7] >ZgMF Ge΀nYO&CC,c_x[kyM翷e%c  >{khG2,k=>d򥅤K3nf _:Y"մuW2+Ov䉑ʇU8z ΃4oSWWih { %`P ϒ/&YlZ9Ќ#CxJMBv򤷌$ "pzύ<>)0ޱzobct4HZg9ZcbNRGDͣMO{&-֕sk4Pi7ŒK;uh^+@]Ac 5zjC}㭆GNjM߿pO)MS;3 -&g;du5l0DЩRI&@'`Osjihg{ Q~OxCWKXh:{yF>Ԅ-   xᵆG ^ufQl#opCԿ5տ:U+5x.mS֓-'[|}MhiioPUV$PmOx;AծK/ZmuGO_?!x<2+4[j:.K|7I!mig,`a:\/|jx{¾ `OQӮtɹ)Fvc*5~"#5b|/5-6zsg%I%ģsO礡*!xtoZ qxϪEt.n4$52]Uu}vi#˩֍ӔmeW|!|hBy<3^yH(&*JdVS~|>%ZѼ_.Xã^Ej.Kkf6Ld씪 ?%[>%WvPv^X{]:[$IrtW0Ur*>&|F[{o~;UeygiP^t#[iv Fʪ z4Zz+iW}5٧*dghe߭:=o_umQW]J f6aʋBif%pe#gke$ 'x=xl-t:gXUBD?;>*n淝DiOMK1ngi2cUyp(Wc;x ^0u洶UMݴna )9 eAVMrO:)MFܶ\)(ax7? ui.,){;Misŕٸ?E_ĘItbr(΋M6m^ejc]1712)Y5zu ۍ ԥM,1GtYgQ2pʭCj𧅾־.Mi4XxUY˴s KK'd JFyX[I>v}zlnx5'}-e1~'YN4lIԬ9K|@M[OHDe٧xx93|͹(9Y\xIw6btnR4ag27BɨxGzf{RK6_AޝFgY"1DJdJ ~tbkOyw=sS1c޻eo_cJk[.mFKvpپF;\"I\'kkh/[۽Λc^^iDH+tr3 LJ}IldҦJ໹qu<&V[ϥmKjgIR]R>M7WMRB@IyfQ;BȈ/~0i]޻ 7vntHW$(r+/<o,iofv&Nw,?yiixVz{opClnmmlJM{ͶӾD^W>!nͨ-+#-չ]G]To h~PoAaa XfmvE`$sxHӴ{,֊6w^DŤhBɑU0@!es=!}Fڛ( cgQD3>O>#Uyl}}ɌweK1iվa־p[ [VuX:s8Ɲkvyw..-E،f3r:_pa:/ywZW2MZ_\{FiTFXr`kE}H =uK_E ?g-bH- rOG /OvQW2u~"vV_ZsbҮUK_-.y!B̖CxR2qx쒬đ4" 7tv*ڏ>9Xx&>m!7DkhZļV3nnQ#H;Hti~m'W׺j#WCb)O39#s4Y@j7I;5fmla(EgCxCy,)#+?> <7x./Iu a ௑"DaBb@ so~!Ěh^G%3\Zp ul1puE5-宿+%%}/Vs^# i<jwVGX9HЬ*7tYun^Su~=մgqk42ϕV+Abb>߽ $kOtχ/ 7/~o=YےKow_˿El<r. eO>g_]^}ȳ"MD_p8j'ݯRT]|Gc>2c{x4!\|w 8ur&/w5r5֗}Eg%qn"$I]D<ӑ5mBQ|3뻳6]=xQI)s//_K1xEm -U@b 8]243&&0첀+4xVoو=2M׋[mq@D;s1Hot ] IhYIS4Kp#ԕ DvͪW<"=4m&k fk;>9Puo,+@fnW>>Z|-E| MyyauKk>]KżeM!ՕD"yq_GFo =ޤ]Kk;Ex/ϱ PʍyZKw9}<L_@j6@ӌz&{n[$KGo*k`œ9Uωri-i#2wGpS2'Ec H[G&6m&ܝvG5ķn<BTQJB\ OiZ^eco?JM.si!Mô㐙 +s_0ꕝzWu[}kL%WQW&*R{ I@ M>*.t2 6l/l$3y.Uب\=Kߋtxޕk!᷎-I-$O?:g81TKKKsf{yna\X]г)%ޑ3r37$j]]OG?B j?I6 _745 ͳ+(&% r*|Yn|ElKrnb[?(Aq4ە0~RWj0½'+I}KFZ6}:pi ^bP^̋rY2P:וYn1i`Yŝt-[T̫* >C,rNqkOS <_/vo[~7"׼!qX4}jxϵZKiSt1>aS¯ukM.,O \y:~R H^)飌ו$rEq-1 i7/ƟJNcx-yJ$qxǃ8/;[9&2 %t!HF*,n/˚#wdwn]/MK_t+ʱ]YDٱή+ ;r9{oxZC Zms,fbT#IVDP!pˀRasO5:[k2iښ~ xdKydM1ϑ|;;ZZ5i:Z*mxLF(Ã*MyMS/~ o?|k,kKR_}G@*$s*)%͍U,Cl4OZizgek 2DQ]XgӴM{?dRv%zO+4SVt!!`8&8?Kbin %c|a+(r!]*^ߘ׳d׃4ch6P}B+yA5Zv`w (W$x_u{6cP6{܂]Y|ǕXQZ@%7qZĿ5KvFmFomՄ+=Go>acrWac -?NKka7L#PΕi%b#ay7pvRWM*Pj~]?W}j0Kj7-e&$wO|ckguIF.<hZ~/]^;iLveeWpFu^jiU! BE;(}X q} ]Ef@e.F\gVn5/xZiJv}u[o/ |GKΒWr нWG̱dXі""gl1?/56{-U)Mr1+;*͹.y_Ý ,u?[\VxUw;uo-GL>.Iԯ["[=R&:k$bJG'z4Jvh]id𕩹6"{4pOhp B!IPUABI/Y>)5͵զ`Ӵa̘ްE_㶭S6mo\Ӗeq.&`6Y|I{$E9Z=!|KwiYE ݊2!6/8,T٘ l`$ܑȌwv `5iV0M-1[YViR40oDdaKGW7{EٶRMV.$؎KGe۷kG,% ]oԿeo_>x  Ԓntܭʗ dI])MNZ_97*|хOMWN9O |;j"n49t ]6Wɯ`Uerɴnz1=O#(kRkR٭g`DnTn6I*S$0kռK0 11j("wf8$t/]΋i6Y= P4ƁI!Jy:wQ!&xS^~0tKPlnOgs3Cc-XfE$R$Blw[i:Agy[M#[.FǭRݬ-7 ϗdZ3y v 'y%lxZE[WĚ5&6oX.fH|P}8-5̛*s>!-R_IeHĄyRo(ĕ2X)WVY+W%~tƷ̸ؒIcB W+|?^"#[}n3ϰm"9Llv]|V.^#S'{x,-aٮUeh`]Es?*Ԭ_ֺ[ƢJ7ӣ}/K5ox{QeiʑhiNS<,к(T+j-IYƱ Q9+##8Rvi@InW4z֏ ] 8L+7:nTW t8 ytˏiz-V}Ymג|x,ɗ%2P9TB-MmC~)4/Zھ_UIU'ee_ipp+׼-?xSSYJXŸW1}s*+pC2z}J=gVio/G3A"ǐT6jλ}:橪isj2\Iq4>{ qF^T Y?C Tos)Ùjq>!"[!).LҪc/r}{_Zğ h~'u;cm\IjH"5x""F=jS/u6Kf$.3ήF&eaŕ1^H N+ofu |YW;|SyԞtU tmmZx/m/خ"vmULHͻ廹&5/ ^&@D3K.? k jkm=՗nXdD**T 0ho xDѬ꺴W^1jIHT2;gB`T mM>5O8_I$4eQr2gD5:;i׿cլ(|Y!y K 2[xWYGڝ2Gڒ:I./m^Dc X ̅Np6C0x_ñ^^%խ{k٢$\h]L"n)>i_:<iz[nE}^Ak mx^?~8OভgNSR:3%D Im]0ϙʪqK}ozW<;C]/um:)4 ;XF$\ Anvo$Դ_\N].D-I{ $l $#bt/Z`gҵJwX̸̒8Ze_aԤ$\Ȼt,T8@*:GUVѤlobP[g &@IXX45 E&^M5|=Sүub"GAmD #9f9w7ǚm6<7Z#;6I!Ų308S6- ,H YXI/)c*3 O_/'䶊{N& p١U;ت0 97亜Te ž5_'SyaamtJoVL˺}PAg*60nmy[gdI&%1 Nxz-&«lE,#K8čo^ɐBn}Kt-tY| pkψI4_`ȉ(cBQȟ9u~"x4 sREyґ,)2[v": y'e~W4k~x)Qi[[m!!*]b) 0_XhVY/w#1ʧz2!꽫iα}ba]VYSR\2c( Fí?[&zh4j.XK=M#<`.Gvok2r|Dt`h'sxɃ/).%p K:7?o%.bkwY#u.MRKl%tʮFdʳ0*x+ސTw9hK/9`H|a#=eQ+ZǦ|nO\]jle{%󛏴dƻVRHfPpʅ>܆Ԟ+j+!wxmlwUbw_zϴuQhaK ʅ$X9z+=t 5Uh8  8qy&^1^3369Qs ="W>mو 2Kd džglm V"9ʀTHwEc~ҐxF4$K^e&?,j3۳zU!$ވHKbiԮ>E_-yA*xZWV;klό2a Pjv3ɶ9>YÒA 2r =Hu~tib͌ n&` VrPr2d@8-ܶڟB䳶"탙]z^LdIuP_OKo F_\GYi^NE[K<6Q!/($!Yǹ=j 6&bxkHY @*In$b0 ӌ6k5)6Ӎ9K{?^ҴZloXndMe ;v$xMsN0capF̝Ks>I͖5ɋgʠ00Ʊ/tyQ)623?+ qHѱ+#/*CsNikY>5H@ɨ^@{Ĝ\!P AO5CDcV ?y r㏏_wkY|@z}ZUs`/@PBV>C`$)5}tl_z5=׌9(!c#G*,21ʐr63.⧜d.0Z=嶡nN,ıQL1۾^2N<+!fھZ#*v ݋rx^ icDN?!lT.v:SN֌ʛˌ9B!3kV ]ۙU;s#1 !.0ԮU5#^MQùppUHR #Ӵѩ̓0EYf9mbt y#vӱF9dckxi?Lex$W7ĺ?|}=k)$վūڵ č4j]ʤ6 RWGŏ-4S6}6Xh:yci?WXè9I7ݖiikɮ&p "C؟a~b@ WD)];cQ86w~+Y%\D&׊I ȲȖDxUyG⟈'[|5F>vw") >s@23Wh9,xo曬j{x,_0̘=9žO2#/.-? .,@]񳳞4d1Wr|¤I {9O闫{g7E@DKo, c<1hrV^Ӥ0Hўyt#w(+ʠ·vy]쏜umDa{{,.v_UiXڤ2v{F}o?_j}_ o }jXE1l-+G}/zL^AmγoP 2x2]K=񥮓e]G10XxOS;7ڬ?yL8s5V6)6NgQ/]Che $t VTkȸ#AV⿄xF$Q֐  %e! 2GϚ,:/.5piv [iXYY@P<($qEXAcs }CÌ'[Iq~^7I&ϒ4#V,#V{֝;Y~jnKgsO [!Y- ZY@ *xJZ? 8k[>UHɖrVDbB ٙhqkqr"^3)N[g.吜p`k- GSnk76v ~QY|9lz_)Juc݆yT|ey-yxs^/"hn/g- %)o,]Er/C zo_o>!xRYYbH#K%G076ywi 8xo{c6 |$ܕ_QR=?;\>hTl}mE^jsdrf yX`5Z]UѴAKnM5L9XvB 8s}h׷6׆Xu+>ϩ_H "4IqPvl1X:WY'UKK I1pdQ F#@_/jZƽxyt8L[h#ӡCR"32ϕ,vϣfNQcE& אY:tZ3܂q}ZE3HZZ7žɍeI%Gc>aL9](>9UxIK AG<3ssw@Wk6Ś8±*o6|*fx&]OYӭ[]PL|2F 8vW$kNZ5wws{_/|cI#lncFI0i]qp|͸p/7/]}vr؇q]~PO<^ae6}ZKc"pc~gs_<-'|!šviqs~$'(Ũ\\J˖0 m =/c*,n|wڴxM5_>TIfc٦FڐĹ+rW#$ca5nܶa3[_Y o{`q"Sݒ\ޭx{IQ-B vƵlBg#P\Nw0zGO-;֓}[Ŷu 'QD;;I# G?dX,Zi7_</'l]VGM" H 6Hl`W]x_^kM԰k&Y`^9I9UU7ouZE^N l]n g2UjxEվ*Xxkڥ` мq6,]eqej#.IXIĞ^kvAsx&Fn4K{g _cfo4vz${[ϊ3iƳX?6yky'#"M$UG*xelsCC^E84 ee6s!. & yrkҟ_K_6mmX]eLg(ag,#;w6q=ZlMNHb{f1PI 7瑽fnٵCWu*ᗉtql2kZM7rRRp5c,6$0K5֓k8i蓛-*aI py nḑ{Ta|Nd[Ⱦn6I%io 'ˇq$E[^ k]3PEQC,&T%bis&tz}LZmRϲ4So4WO!\&e H boM"ҾŪ[YC[oG6; ) HL&' Ҷ3O/-2f=e%˸1hg+WH`ejFoŽZ/)4_k "Ih^xc{CmWY>x%ABk~0|Do 1<5ikeZXi0ڑK5Kgw(gyi=Չr"̓j0T,,A@9`.'췞$kki=66{Ś4mە2nUc NUͭ_WФPӅ[\YJYbG7TNFiw^Tlx_F(g,4s., &F |yyk⯇\xMTVԤ OW14cb۸2=;- _ 9eu<#'PG$XA.7,IUGfL(&} ^<Oe!եvM-Ĥy%4"ؒ?;k.ܫ2SV|/?JxšӭM־q/7!1ܘf2rQv|1< 㸼?d1j-涚 ,֍"+y۷g;J/O/zZgMkHOJ)nxi¬`*BN.)K濯su˟/tMFU} [Hu3%4i(,єVܲ>$]>m=ͰIe)0qE8.l|9tFt,/&XL>/ɔ 1U=W^w{l%ҵؿ|s.qhEI,O$.#cw=/ާzPscw U-,3e z.ߌv zNu+!i][-Z[{4\(Dh4,;ԥ̬CEKHiZxso Fy5Fq"Iz%Jk-č;zg?> SVmᳵ_H]udDvF8)"}wukqح֫j$whDq[4F% ~мmkzq]"5e_%˙-l xaC3 ϰhVK"Hռ6K}:z㯋e<9]_x_P4Zqń'o3%KwpM4Rqi~ ]|jn<?uM_Ug͗MT3Ev4D &Pw/B+=SJkascy I6FBToG|A}죽uO'RXMޓm9oldWW !Q9_u[RFMFUIG3#d$9?4OmtusČ<+<\'I(ID/ MQu=b4a#F+ ؎8˥heo#[)I%0avp/x{t滥Vc{;m4 yI" K^<PYQenܧXk_uxJ/lJZx-t T7, oXKs8fjS&{gb_GHYKa,In,2+Jx+=<連֟c(Aoo_Y}8wf,ӓ x"#m^D$b #xwRD7*:m#ԮѬnY->E ʝWl,J&I^ 14vu8:6PQ[P+*iS¾/o.4eԡa* ]>W'7{:j0OC (Saq[D_xKPe.X^ )KxtEȒB![>mˣ^\^C$j'{V]5bI4w~a1ݥX G]KQ,unm<9ydueK e&$Y *6~'[/O&kO]Aa2<{Fr@P^ pռ[٤_-IE}}:Z}w|Mu~![rH#&`2Mq}ڤi1 挵ydž,j^a'b `u{Ubcd"M]` +Tm{yb\[|I* TS'[o4gʒ-ϋtOG|K_x[Iҵ KDĽKk3ucW1n!UA5>6~Ƴj IK b岵%q i='9]uO>8"[]4^+[cd$aT1:!f2I< ywȖDү$V ;dMEXo[[Mnu^ƚf =!cյna'hBP&4dRp;|Uŭ@Rkf材*WudJ;Ths^4m>dY[ԠԶ,62H$i8EwVS pC4ij3s'D͌lY~ounC) M'~Ҿ#x iwW7ݟ)BPNdS1^:߉43xM4[[Gp{Θڒ 'A2Hpb*c&ׅ<-BZom1 xn6` 'x{Έ,,~%˫wFg]KJEil8bZdyRcUVJMo򹖎JQzjUu&yau4j~c<،$LhD(+hh/<ڶu aZAw,<>=se. gKֈipln3A+|'p[AJ6mw[ __֙p:+7"{n_}MX_4M>Ad7J%HVhȤXO5KrQՍ{f_>Ҿ,V[i{^[ʆ)q% HͶ;Y#%G;ڗn2!|K nJ.BH^P"1BT[j҄q>,?7Zt9Cdt9VI[4@bv^scnbl㳐X6;RX$3 `sz^_w:mۚN$r~sT:baV֡+/n3S+%m'V.Zp?$THJkI=SSik~fM k>4+Yd/eq03 nFȎAʩ#i6:SOuֺv&*Ė@\>TBI5u4mDj/"3Mr"sv&,2e]X^N]j7Ds+{G׶k6`eXf{X-EWf(zդݤݭ_=W_j!ӵOǮBÚ5+V[ѭ H["@{پ쭯 z愲_;M"3yBAZ+7"gÿikW-l4)}EYbq-Fw_q׉Z}τ5@ԭĭwW;JJ@dedE ],t/% k _D_(A-ZAu*-yH b]Bh{;xD,F9b6,o!UO4AuQú$HIi0 M/E~oWAV97F0@\&z{"weTjۊR~B˒ku~0f܉b=:g&&Q'<7$`T&i'/?N|-%YGcLeψ I\ ǂ~h2k m]Cn׉ Ѻq+6aZO(4d+)?.t^ 4'!6B-b>$3)X>R@_HڵoC-d{pzdC$9أ,o&-kRek:%_ 7X!noKx7 ~G-:1a;|5X|<:R#Vd1H\DGާi+O|5/}0\uc%BUcV]Dx/Op_l>N{]Kʬ< MI7]t6'G/%6(l.qn|BJ1@lW<_oZ!1Ek24{vnYp[(c0:u$nncg ֦+%Y]Ce]a~ia>s7-u=Ɯw6hqF)"N 0WVQRMR啕?>'~ +W^o OwxM,Q{2F eyſ#6W-WG-kCS5++g('iQ G&ѵ*yx׍u̖3=W+31*#RPv^zƞDɩng{0K9*SoY_yd89i8Z;{:.<ɾߞkTNR-'R-&MVH"f$!cRwG> \$:5(,6Z0p>kmL>y4k]v+Խ-Bٷ39fBeKj .iz}kyghҬsZ ǐbۧI@UðNuҤf'A诱ZxSXEGuAus`ѕ>2P+^ K^9bQ&K%ktc pKSa?&Ԡͤy!KxReđ7j4v)^>n~[ymmmPid7,J^s&H|"ƐG6ݯ$>!{Le䓋"@RHd.b2 :ŚVwvpmzu61ܲ &j8,|\o$s}+4/ϸmF;7$Et_>¯ף~mqWLģEyo,I HC CWR2n vz~ 9 4[Ɍ[η驠6C@wF2z}J𯄬5=fQK&e+*#Jp0R1gwBkcIj'oRZu= c l wخ{<%{kRKVXQ$++"L \92V| p2qWvtA%2 :y[NxI&RB#=9\e}SLh+Xubx4* o<; +5|Mi^,5]S eӗOa!suڅvI2@ݸ::5qw$\^L7ݢ)`3U;p1|K;~'h+xOn</ Whei"FC8Q6Kx Gkmb[SI Kb7$m>aR/= 4 ya֚;7T-,rJc*cUC 6Ϗ7n :߀ejZ1ĺ`\F4S[nA*0L򑷳l+GW}YRZGykeH-Z 'lOبVbr̬I\|= iar7:lYtTqij&gxReul'C6Уa0:zJqy r} V[DdޥE#ˮyaJI':NZj(m:K hJF01AۇV޳/ kv:j6qysGvHݢ 8w&7X0%6GM+ˋ$ib U8vڮkY\ bnBB"-"B(EU, 8Ao&W2H_'mYkV>$H52-弎k2K#PxRB#a[$nRU՛ %xJsu&%3mKUɉdQJoa4O@㉅Oq04cd/= l8Fylʞ/ +PE$67 34Q,1w!J7I}t/\_$G(lbl`ךYuOu=PI\Qčf*/ p<º14/I|+24\_+VNCjj ux__ѡj;&-<863+`a7̆i ˸3mWyhy@˿ X`_u-JkE{-,omͤ>MNJ-ifөTM)Zz F=nB+ưu{l4rƯ9t ɜ2F~ZS[H嵍I_#vM(+`}j2ZHoemo 8:l'F~Sxar£6r:k{kL# ެF: `pIEcZBt$m>Vm}F`A!p87ۉw. WHcuQJ 7z ǨkH8Rb@5vq}ȆiDi(-NwHƓbaA2G@J\~0+=@5LƼZ/h cpdeAlN;۫5"N~r۷u98rzM6+rƪ9vQ址!J[,5gQgզ`-(D10*T:窴tCyRO+nUluٽ&RTX_tPpy #\Uk;3ܷa0>"R˹ wgM(bR\4{ .N c`Xs]0>%L(%[`償jJdxN-&NC4%ل3!U8_gJ0՚&;3iM>d;vޠ[K_-[pRpr}3@զ<^젼rsk$F!tllTHr38URiejpLdf4cc/d}\v҂N! ԬgPU9c.Xp2`* |4:)ihAaEK|a2kB4;sf伊X>ń2 9y 6U-!Z_YbFl0%Pi;cq`v1+򜃤vW4=_>.x㗈u 7Jk+J(@wB.7òpw2ǐ>x{=:֍#+46䍊p<Upu7 `ӟtE䒭ǝq,UZ ьĶ@ා]_`~/ïٻ@w[_ m2{{f65f.db&Db-~g۔owA h]X+܈fVe٭=<3O^Vh;O~ĭ{Q~h"Zߵa} GE`f,53-gY/\h| kmʠW O" `}?α|*ЯQ 蚭aw - , NpݒPz^Ŧr]4eUv2 J ގv&M-u?Ʋ]lcŗ\\jvwJf!|B2Y1< Wgeh4RkѴ,<0ddG, 8~<|10Fޅk(K?:yj[}\ {e2WÓn-'Y-{aOqFuHݤjfUH$Е9-4iqRjÚCSĺ74YkO n4kx!vv@ῶkڟY<}bi[kz[$dye(j8W#5<g+ fP`#MF_2 YmY%2̶ֿ4KuB8,smʣh3Mo4K6VoJ-MfZ.# 0z.48nbgkyn$.ƱfI R|g^*^/#xu$Jآ;9tT;FxH+BF%W>Y)Ss$F!9eSk#Aqyjæ2ڤLɼa;#.d`L$ؽOY2oi՟w\hj{ #own -4Ե)m\ q(ɨ-}5tv}V>wnEEwZwV}[I%$I ;у Ϲq^{|UůwͤMwȣlv'#ːfv x'_|cka_Ǭ4z`*Ҳ,Qw |/g?OhJm4Czo#cyBc28\*4AIFoWr״!λox(h2 ]kr]Gia@پ٩<ě^Mu[ PUgduM2r0v!5oz׉zT.DB]]\na#T-Jq^y {r\h*;퍕bpX:U¶/\ӨZז՞]GUa/մF4`Kam!kH^",q홤|.K ෆg&k/>,O=1ˤ\he$ y#I$S R(1~5 l3Gsn˶EU(O5Ld V~-WZ%؍ .|nb@U%8jʞq}.fY5OG5O [Zzt>kOk\HҢHbUvf˾m/^ZVqE'л99y2-8x 3;|bxA<_=zKծw<'KRF?j"\FPXr/Y%]j:5b.{[ܲ\p qWk'\v ^i>^K7_WF ƫ7r5Kn*H : fąEy/_{v  [sRZ#6+3;@%9>'|FueGŮ~x$0B$|YO>x H. Q c˙&eldr1BO3e+>>xe<@w1$lD(a)l .#rw4xgY4-I5 k%4KY%KyTA)'2#4*6[N|.Ӽi{/Kl>h/5y$7_[[.vr1*=9?7?槮ktZM p\JFdE2.kcycM{D|{փPI^B㴸2!R G*9rn4f4i-.=UдOlcS(c0Ŋku՟RŹ[[xv|\Sw/iWwⶻO@ ipL[$FQk~i%K\JΞk$ ˗B]SW5 &!nf;ުp]vM, EwoǏ h|=].7ؤ!sO/^i[hR wzdW;{[ܶcfɜJ-H:Ec*rRJ=  i־5|YYZi:D? (j>;@ZhsvZwk/BOOkI5mVզ7JŤIm6 -q$>k} jQxSFwkGfX 3<,*L<+K)O[nƍ7XqA.bhzJ{v/j->zx>ɓR[h%)*(b9OmoçH-^Lm#-%)Ao'`fDta߀Ojq$[حeDTՌЉ6!U*PoH}'#{0SѴۘ.c{g짒[Re(#vZ-(PRJ*LuM7F5K\m4{su-diw[^YL6 qԣjw+HtOJt 6k058I]~2mr<ʬk𖏥^x|+ W7Q?cy"2DK,V&R IB5Z´] x{v޽  syPz~60H(f4̋j4ko pj &}le>-hR[zǗ?t ZH]ڀԅ:O$]-I/"li!ǘ#Ѽ5kAu#N}s[vnZv\̇j`I 3\'+mwnk=~}r+pt/k59K\aܫ1{U+#f*$|Q}vGt<)sWW:xO chm%}j摢i76+%=f C*FTcsQ+NJth5;`ZQO2Q*$ϖIhG=I⪤MmQ"-Γ[M&LOyoiE5r@'@qn!W5š-b>٨j 8l3Q'FeBz!A+kk;nVqqs.(hѢQEWMͻj0}*DM\Αddgu,rY~)'&vޤčBd ׆'O+?xvP[C-0ʗRsv(c2x7V'鴲jXiRI7KXlq[Zx@>]ޗiiow|d C"L}Jʌ=׋曯};y"Ҡ*a ʶY7byVtUbxU?x{>e5,ڂI D\EUYFInRp{oW;ƣbɦB}7Rє F"$`Fq~iuG^ /zv}MTQ*]DE FC0]ve ^EťZ˩EVU2(rIFp@>}j=?TSodž󬤒eH/mƒ4hG"X`tHsEѽuۨ3\6B>?&ZϢؤ6'}ē^mdYZFBVkH&/^^YgQHy"&VE"0%LJt;Zfy[K8Ƀ0bB>|Q x{^}JSxGq\^qs o'vrUGUF>O:k`<_-GixA|Sh7vbVrm$5i<.vjw M= >'޵Ok6M|Kso$6;'=Ćܢ3';|i?3m᙮|C'$2D[+nC)v4hտ<#{PuĖ5-Tm4wȍLQHٸKbĊ>hס*ZuO9I:yӟRӝu;YoQ.~$e `dWUC¯?`h~."7 so İpKy0ᾙčv,RiM퍋MgXSt4 )IXđvW'/x/oO-ETrHʾlqHܪ8GmVN6mRǁ%x6n Lv-{weQ -Y.r 4;Ws =zDZL:lz_j35ϘҺӮ# rFZ%ߴmx7U/̌y1lͳ]\+I_wO6>h:ݯ4_J-Ki ϼ ͭH|Bug4n58j0LwK1xRhfrYa5VGd`1,x m_ٺ4ߴzf몋DrR' #af>JٚSK ,l7my五+˵.%6jcx81DBd8tTs[[O "NMcDo9kk7pߢۈc$DnP 60XgG_+++mROUKF\' cB0~q\\(Nm4Q?w=32W;}RK:$X3X]ı hXG ˫w6zzV*iWR?0՞RIDS]vx?_γmWqlGƧɻ01/͹?u |Y_;ECh@rAQŝ/zLɥχ."WXkߴJGmoBe  x gJg<ּWA^׮Mo٘<=<42_*]v 0#u[>Et71cH*\OS ֯q&ctm+1\hL|W Qh<6o\GFQ,dzM{v5`mtK[{Vx3<ڭ]7P&ex[.bk4 < ,<.͍;H7xc^u]n/o"vkygdX;JJ`P)ז˭)/'-bHl"=;yqqk{:&7>\^\O`ti5mw}Df ^8;H¯-_&m6k]Y-7oYIƶJcXn#Ė|я0J֟m/X^Yz$i7 ϳ~͹ݲ+Rs#gmޥwó\m/,OBI+J|Lso5 :mCNghtrH@t)rHTU_'J`n.n<*Oڀet VPjC.m5'1,fÿwWgR5zI_X\3,ofנnJQmt +k8ޯ}A5y|b`Kd{krffu*QQ`v2bUѣ[{ԣڐjآ3,0z*2N7įxFHAҞ =鐕5Cm|d}B@~%3 6XiZK%K$Uֳ#g T6\nE)WvrVdOsּW&FLy"8bmXZ>U3 3^.tkj1YA :bj]i PHT0Ϳ0F691\xZjIO}&M,yU9e7=ƃq]&Bu/mGKRIRb`BR.K4/}Rm594&:lMf&v7j#3\*:Ɵ! wF#WO!u U(fUmt}5`v%Y$1mYcĎN۸WZu:AO^jMi7i,Fxd z]:MB:eiy_s!]:_[Lި 2ےt BH2tHv |Ags -X,4K+P\Qܘ"xdC=͐uM\; Uyݻ]/_ AҼ;8 k~ MFjK6SX+'mx?t+}fŒy~%|_o3Ax33nÔj ^k5UImHplVȋJT`z _4ߍ_ڲkw?f3y 3x݂+bai_J7J+iߧ62UIJ-|W]y"?-eoiIz{I_×i$VXu$v@%Ko{^J)n%Y&6lOS+_8?Mj\}l-uXU_:mڧp-[U u;}I"GRCl Bosm;~BW!̭O/μwR~# :^hnA͞iXcTÖAEs.qijCMw vSq0o-yx*9,XtF{aZ4X+5ȷysyB|/tgV9V0H)X|:|MocwonCI(%g1N5S:$י󝭮51$N/."{XD2rvD* @5|3+Mg\qM-LAlJ9ʀޅ?MVeVԣkfxd#k?-}NKԋsqK&0"!BDI'k~𮿮ͤGy>va,iêugS'"7i6^a-KⷵF7;(v0%\=/JJN UyĉŚ0m߼$9jG}kĺ 64lXV(ةq䁜cEKjV,l̝Lr2+?x[YWKs$Q:BHW-<~`!r{NZs52 xAxPO2i  ݂+6JQw9>fm| 'Ɨ iij3oCΈHm !Y~v>G w:ݟQkf29"f(B5g-k*q R+ʫщ'+)tUbC9Z!u}zXluD~w"m|:iK2 ]͇<.xs&;TrZ'm?MF\N~غp6DA32Y \xe]چLwZ6؛Ib{^k\r F..-Ik%J߻yX!mJ 2O+jڵƫ'0-/x-d8DQx=NkߌK4Ahf-lPhmܤRf_,XUc.3^"InhXxCWmm4|)i/:ynz RK{*9Cǘ6{m{J-ޱk^< &5k[y64KCs C*㍬s\]S šSR֓$r_5(rE-̉傍g9xҵ67eʷSڴ?3ѣ?9="zt=nG 1m$WN{iڔJ_!9Ksumsa#Sɒً+HIdp>PZz$pzT˾X)=ơ%*м<dT]Hl;J 85 O-n0DbKY7 =[m5د;ŻEėqO2fh'@p,p x!5Ưjd|W{Ibh`|4JN4q+__>ZG⧅DVQ$zauaꗌَ09ύosJuuV-Jb)tyLn#{Ybee9|Xqw*NJ7G32,ddI񗆵9-K~]9Ŵr籑xYrv8hH  `ϱ*.j>!Αnq`}D2xʛB7;_ [4Up[ki*ۼs-ʦ#VtmnwwK?>gsu\k;X@!E*$r,s'?i-OIKt6,wE,cI HRdee*jǡoRowe|a n=~0h2x~yh/|Q&6nw-WU/MZmK-VٮqppF7h ~%\u[sh>p'T걝&k+`d<׊[ZW{-6K}jeY-rїwՂ0?8 1eYRvi|'o_o.suXi,,'n'\"K܊rFQ\f-i)7QAXO-M nA08=hؖՄ>@䍖@^s#yw +p5ڒ"Y'ʴG3s y݆ e8cjrM,:K+cf#?; n&;Ğ#Mm#J+y&w7jH,FV !H=d3-}$I 9q"0*8+ӎG gcUU`!T˃c&[㨮w =U ˩[/%Y:g I$G!A%I;-B濶[.%D -#pvNc}kW?^ﴯ9=.+wGvBMDGV^i xG?qX^xX2us\ΝsA ˦we8T(6`.l8*r}>2.5tg9uh}w{, #IoD'@mĒ5~ISmoSP\ ݢ_2h av/ᆕ|C߃ci6:4-CViRRc0t2J-#-]υm&M4+q&uMrYH2yRK#4Q;!X« >|/o|xFm~ݣz3;k% r PQ+WIUkOﶶ?8N)rɧgkɞJcᯆ XMй[;xümX(?ÔYWkYm[ϕ F :9׎>,]ڧ )4[S浤 a(퍹^?-E} RbPd\/%g,A\N&szhK塞Fj;o{j'_O>uŶleh8|6U*T`]2'B? yG gRc#iiCc }W.jv?:/,5].8A\6 Xd'>[/a7P T}OMܰMZ"L2\9 xƚ0l9Ef <'9-ձ=zWJ>RH$Bf*%NJ x%kNnܢIF6hU+1%Q ǡs0+e'V-lH$>vD pP1;#}z֔#ypXF1M8\pSf٢ܭT`w)LmbkA5R2XAPyʃ 4 Ǧ[ %T X$Orynm[Chʩ\ym̆<<a=HMqAq@%e瘡8\J $tLY$c=̊۲K8rD@=GREV/zgSH ۻ,O9$珔 x7Zr݈Bn$9'ڽQP,CdMmX2@<O49h].MDy;3U08VF+9vV+1p$ rHAbzGO9}rʂyg&[?)aj\8mi[kД[l 5A$r5VU,r佄B.nX,e]KaAQ6_چa5ҡU%"+pkMSEѠI-亹ɘ2q\0A$EyUCodR6uk&f=[Seq4lkY&Fl#)>*@Pkk(bO%n:N78Sٸ ,ł7 w +1o1TPĥF~RGu(M'̵0\24F98pXCXphbu6=j?,2hLiX#9mnk%ooC=Vaof\Jy_3Ov2Ge.^yM*n;vRWwŒըV[Y3ە̋;BW9^:A 0ãX-sy"i[w-xO lA ׉; !,A|x3n!\/琵Հ ѬpyJ")&6S|0a Kjvwqos5VxB,ܐ9aTgdsN8Oxڞ.W=cn+ "$k+1p c.zoW]>3@=kᙵc$\vCuC+s|$}wFyNb1o1>tQI?(,v&o<6 k[$+rF fkī+2et%[ $6rK-±<G0<-}4ťAG|+]V JؒMunF&78F|Kuocx' %"a|VMĤNp'b}nާ4H^UD$îCm*^@mս(?9Ө~|]mk 8_R&W vv[DTJkl9P[h-dǾ-Λw {<)gzZ2^.fQFdϔC(ˌxƣ[hexA+^#w1 e#O|G_![H}Z-/d71D0I+$7@-G#uogkn ::٥$DEf_>&ƅ(/sawiįhRi\F+/,pvWP@YQе;:/;ɾ"K筤v1 =@_?2>nX`,=J5#em6T+103\?t gV:o ]rt YWiHP_;i%f=#Bl< w:i\)osj!ugU +_8qR ѧfko7@p#| nN[ )&Y+\>}R²x5ޡ{i TE$yYjwrI&? X?zx mcr!7g$ݵ$2H;hgZVo%lR%#(u.Yr$ u|O 'mC_]SbOhtPuMŕ2\2o8œ^5/Z忂a{asY(Ҩ 184:]6qgI~,–PeL 2b7i [BOHZ]k>N-ղDV _m3[{‚Lo=fJzG4q-ӄF b"0VytrWPsu֒p$EnR웎`tg~/틽6[͆+kʌ`lGdL$I"滺&WFuKlta\Q:6pp<4K@kBh2YLjy*W ?6*MwllcOλ]G"$VC#rFJuocacHH sơ ǚQMpzZŮL{1 U]HÒ71^ +JOk% P)՝d($I<7:FWWY R 9mI~c^hu-tF Q%J?PIlWaRYyu"W~2i@ PyTN|)1 ~ʚu{C8>*ZjA`Eg#iBcћT[?{י1a'Ƞa;p Z|r5] I5 @˨o%(b` ,Hb^yEKNѭ6/ i{>g4g^56 d!Y<׍p,Fbx9"F+^?I~C>hyOI>pщ. o~3_4讼߶ciK6(Rp]䁀r[uY\RCCw`l#MmE2tv8%c Z\QV]>?ܿm||Fu+M詢YwoeiWL^ S>P? Zxr;J wXZ۬갸8T~UpY[oVWz6ef\tR_[mP&gՒh$bBC5ڧĘ|s⻋X[%ڇ!MU ۬ZC( wu5)ϚKY+.%c(r|KCoiޮ% &Xdܐ^2 ~^ps+g;g,nt Tդ&@_ V[w:q ]r8aԵ[¶&K=U1yDEz.kj9 实o5ˣ4hJp$B7(/ݔ LxůOk 2$!\ 1&_Jr@ڤWN{|amtAkHX2e_3 YS>KY|Ia1b.-ן*rD!p"fF0 + .օmaXִx!@ͧI!rm IbJ|z Ofѯ$ji/-f0%)Lb YqǡBS׾8v!׵?ö57go:b 2. H%:V5 -Ưsqp<,42 ڌq0HFVt};q^ ֧oGoI5ц iun]Uˋv'~8A8?6O|G`n/5M^ kqk&%H EҸ21I:g5:EY.&Lo|Ny+$|C͖woo%V,LyiB:9b\[Ϩxr⎠2{F운E,S) E)ٵ򥙀ٓ楫SkOҵ+F{ˋĐ]$K77>IoxjhI$O% 0?+l`C?5S_OF|ǭjc#m>8h#O:J6HۃEom 1bȭUpÉ_2Yb&RkaqrohȀ9u*rwnR~5|AѴ%n[">i"J^-SB͸IKX\O7WpkMEhDkO[O*dng;kG,Ex|=~:rY V5hˡ!L0~l_ D<{K9ٴ;.cL*FmW';xBֱɤZi$7ocaO)m)AbGD}9Y;m!^% f\^?fGX,,m+>Fie@}/jzm-H&fA<aJ,g͏ `ŶG\[,jBL"P}61ƭsx{t:N\I>O$*2FF6kWT2kjYg4q m9(&JI!q9_hDݴVuB! µ,#kmĒ %l!'{j~&/<[/j6ȋc]t.e 0$Ymvz3(ﴽkJ.dY4nol|d ,IfTSv>-x>xpz)!"C{ڽ 9q4w^C.>{'7gF~[frLqQq[Iz{۟\gWxP"X'4oem7Dc~5;;;_߆~,j_<=z׀}z{{m^),lWtTbMmڼXK_6l%K4u6 $įOxWmhw-&=|i*1` /$ Ai_n>&nʡOXZX{K](F:?[ඏ}FK?.aT\0%߾9#dڼkz=R]=cYv7q` j ̇l>hӼ]-,.l5*$d3ώ;\F udM8X5HOf hY^6yw-!i#6PO)E>w_ֱ̚oΦz֑ugP#]utԛºnwa jqM=ŝ1A"pȪg\>3_u|IK)u+kecq˽j,[j6Wb1&gR~aaxat[kmt(dyw)Xw26Ր +|+㿆Bh!5=6Rg[ -k+hde0 b{KM巹iMl{%D.k;|f5^|?:Oj1tmE$+Z#"5cI% 5־+cz^mm'z~ HFoVP V 𵮯c:X\XLC{o vprlfiVjҗWdOcu8/xXl|3yNYJ^(i7!B@e&L|ejEq%w.bF%uDb$B klo'~xվasl|_wo]Ae\dyCh]7n5Ȟ2|IGO&|W'2#ZfbVP{7~ iyuV}n^TXZipʑL8|ݻ6Z/O7w \5O3G(v'MB| |;RG \ L7$RxUHYYrW'w:-_ᶩ{+_ ,DrK<#BҤq - e4J,|?5̳xᴻ[eGCȍ TWpakZ rX jV\H쓴TmN:)>Zݻsƾ3վCgJkH|1g4׉hoK8ZʒG IX#v<Ş87]xNEl`?b$id|l'CVόMwjĀ {6[87&xIa2WOH3CoHψk, l-ȕP[g\6`,RKrXŒ#۽[;Bc~mtvύeo4Vm;Zv(`hä<&; TcFHG8{԰:^q{麧 _o/e\XwdY|> Vcx+K[u]x7h3̺\T}1 RW],_4֬/lyu,p!/m%_9IR.5C%iwC)Vm3EM.mtltӅ{kMw*)4NH]k>x7-V:qI"'董$[3!?=R?&⵲bm-R\JI+\Du>x?v-'#ۍ?PPutRdY#%hQF-I_C•% +GQ>_nBj#b*|\=3-EƷ^Y\uY|A#%ȭketIDNSpfUm&k\ÿOiokMN SQ텽&XOb[rd*;u|99tw>7K:/\F1KxR|we !5q{t9jӓWZ=FiiKs.{Kybo t{YO2Fg$@0 5++xK:bTxl Z&W KF#iĶ4[[f隄GA4v>j*X`Πu>x2157կ/%Xj6T\eZ0ֿ뮚%V=k?.|ዻ:;[-]4˥Ң Im%!$Hvw˭j?j$7ËJLZ1IpCp2W^gi:WNamo5vV,$ !QK<=cAm^g#ID-!8.ḅ$׵K:zf>5ީ>cs.s˧7WV %X* Zw-r3oXKQ\26РeXyM3XtRo#DO )E, 54=#öW'MW+kvcF#)U$e޲rJ SFK 'ŶsiڎE=ZW{Ò}]r$s 8W|E^|\u6nRWܯd'-o",A6yobkPOk)Q%HNc~P19$ mZ0}9w-4_:u!ۇh$O^~Hnf~OEyfs:hڵ\&W%gXgPxoK&+gL]6ue̛o8*4>|7S:4tREnn.oQԄ#F[("F;dR%].oLcm"u+[Ş}@K?vEPXwƥw4.)XxS>{|pfƗ.E *$IoZ)5֒L51I:,-=Ͳ^HPSrY;O 藓iItY9e_L6SR 偽dȁdPt_g2I~!䖺֝j .M?u-pf-Q|cU-協mu_!ltg{TXm9`OvErH_*@_ +4m{zv2xz\ZϮx[ɞO޶#ya) +),OI5~ K11hUtlM.UBcu} u/ZQavSXæەF&g w$k!,y5ɻ;[;kfo'gǗm\jrꍾa( 16 i?o_OVri"ɽX]Xn<N'sB%O^ L/g[{[p5U#I"0[+C=ռ$tk;#2IO'U͏gt{XĐhba:+ .s-^,Jq;⟇ o]oU ɥ^C>.e,EَUd#mpUMsΉ[kP- kmLMhnɰE2w> 4{xgir_xtѷ M7rVN?<ڶ[3:#-O^OF[ͱm*҄rX1F|A yνx7x"|E᥵y-,n,`'x/nuZkc`UiE5V؊bد^o¿xkP楦RƠ\pPw)kyUe"i$ ѬVq|X\kWr'VR6GU |JЊQn\uv2q}fr[Ԭt,Ὂm5QŒ^JLJCΌ1e*94h>xœs& 0dQX3EB_oѾLYg4]gú PCiJDeR.6dd {?<oHFw|gB7;ʱF J)PxR֏R|uH/(laWRѣD}^9k ʍ&W ]'ψ֕H斚φuQw+vZ; $VfUdsr|S`:<6QjPiV[DBD0 &#[47{y.yR2'nlo ]V_?]V¾~e4φ tMBbhI0 $LEeQ. ص&R}76~um47mCP*-#?9\,#hVt} K+I5{{9Ǘ=Ο+qUi#YGO|Fv}}gךx)a1Vca2e'5y;rNQĥej^ߌ3F FK!H+ncU%R}BѧOw/.k#v,maxMҠ+`.uOıxN-[SKC}u~,.qlV9e90?x7uOgqiA&o {MN܀Ɩ A#˅o_CUFZ7;]h!/|/6kf7w#!G `ı#1:*K竦rQе2xd1°Ƴ+L"fMKQd儫֪VʼrͿi1V*.{?s-wQ4ۈ$ Љ|#.䑛h9JMN]N@=>e|9u#jdkB`yڻ Ȓ0߲|,|j~:vzox}nζtfwrD;dQ5kEscWGUԭ/i[/Xhveu .O Mi .ry jO *&28I>lSCI8G~'oƇ9>'x0{=MqP$$K 820,6Q)wgW .k)][uៈx]&.KfYdtx6g4'a o'~wcA=>hYT%6YϣxTDŽAntndKTfT\.t :V<QR)RB-HRGחq2pm *NzT$opR5ȴm<{YZwX0BHʄQ$UhWw_ZhXu8btehuŜۼܨ7 K&+ٳ;q~h |A}xS{=jP,[{P+wF~K/T] CnwG,L6sj^&> =kpjI,NmBk{h@k! VO8, ( W\bUKcjV%eabe!GwRqsՎ!JIjsxZi{fh5QgsDmČBw:r]$WUoo^ )nc_ h,!p 17wV 7^㿈WR蚠l\X\*Ie?_ ύG Q<)^5t0JU5_Kvx̭m# v 'c#i9\HϙI;/'zϋ7h~@tMHd`n'qxgdyr*[^ayh gI{땁L\ƙpn W1pkq=gl (̳Ǘp ؒ3$/V?*%ƍiK{gG"kkзt]$Ȥ3 m8UțR*VGO'h%̰,C(% ev.:;r>i>0o%Վgz4/xZ=K!Դ#l_02ȉ+ (>.^艪' F!2[u]ǙF+|5{uŹt lfBG%B(ۆU-e'uy+=zu H]#EӼAd>moWv;+%DG;g2`Q\ZfkgmMw\jN4%##*Cm5xF<{_QFŤ#.oeyo*BL¹@#1W-[[j,QEiKD?pOG,G9ڹPVR\m=hxGX5VM< dc}ȬP u?ύ(Cbg׃MVq4:n蠍w*!GǺtܤC4֓ m>p[be;q~:ɽe$DVe3`qSr)ƿ-iE;_K|.$4iDRei̴`̮70>7x@uFOյ_ G<]u#1YuV1I We/<[Y'`ݵ-i!\:4eEmv'ywį Ӥ&hȶ%QԏED[+i$]B\jvVQYt 0bqwG7{Cga4Kh;l&G.^528*g%}Zue-o][AuԬU˴pHJA/[ˆfQT;~=+ƾ* şt+3b]t5 -FYH+9D@)9W_x]%5Ƹ0 L@N9rU IچIe;B>FSe ^7~iw2W r ol[M Ihe>XrxWMDxGsgmp x[_;&wH&+CV_CWAӢ%ُvWqjI.4)N$~{fi[E5,.gcn2om5_C4OM.Nɽ]N찉d`\m,KSBM9?7o8_x\%i60Ks!HHhy۝wGOip'ӯ.Y1@Wdm~~`v#JxoO4ظvIc+$ 9_^Z?RkGkuYl.d#Ԫ>egcJ\kN-[#*sm|eb#ze`  ] 5̟:[9>,(N. p1P~OZh?涾!]QZ_Oq/!6wD{G3;O77?ZϞa}ECYY7wqZM;JϹ[')Y xf#c$l ?oZ4;l0֋&vc)hZH$IV /cOַ5X!oG[^9!+ry뫹#\,/2Kyiq :^7@S:-%kshmkMIHB"6no)ui7PBw-!մ{{K=H LXXqbcd@ʨ2jv귚wM%oKHQK4`K93YkL,YkTE-o*ܫ(U2@AoS>KXx,$0yvg,XL6l %}3>$6cwwk-=mas2DG$7ùOwF%$6HuXWa!٣`(kUorjC< ˲#{ 6l @7Bi&gC/_;PvBU6$J>η~&ѣkW)gr6#jxQMXq-mmY\:۸atŞ |7ݜ3:r.Q%$F|yl9WwfN~|= ˏXj6zٵK.bլ5Th<km-,4Vy#!*dnP_k}~(+ryJ&1og[z$Zn,2OMʪk<ZGY,dԵ .rA!ITy^Y*p611ks3W0?pN},CşeCyo*0_9́w(8Ђ2&*g=؃`a(rv|)wsè }n{h̲ى.1HID\^2j$X/"G$@$R941H,f@ r4GpSrg<8_c!7^qo}YkY$ W0#g8OG C?[œZf-.?3VBBu7gxtjMQj怯ʯ YFC5CLIAR<+Ϧl}r>H4>lf8`88s1gC7-sJL1=q?D˥ H7rN\gqVL#$>ʪ/8~qJnhC  bG<o{=:hlQF - gc̻T{wɰ1Œ r2r:TWI`&`9.w6g5 Y na/il|px;ʝ0SXZ] [D}`<!$q bAX,r7Byů٣xQJ0<8'#G -G#E[ko$㎽hñ*t?eE${O@@<g=in>tۙ>CN0ݻUͧS 3`qs,v\s>Jp@;Qz׮4Z],-s+UA!rUwICIb[qyv>aԎ1 hb;7Q*RŹ۸dVżZyTY%D]L|l[$uG?1cd`s]=q4Q謓1 qW eo㸑|D8fB3$[v7!

H>7"%n-!Y=]@qk6d 18 2@ A^9a^s p2c?i10 'qvBmIOp˄%q1-bK&g:]k ma Eoo4U(rCmbʠtC=j"y-᳖4TduD'iÖR IlF݄s^6,E.rWd!u[~cREBT|ۉdx%zp=]toFsftGy2!tAþ NltK5 cG_ eUBSzyI}2OY#vgs>] !A \Gw41Lf U+\p8,8aFe 3O!+0x"B ,p S]Îv4g0Gh.Ro+z|\EQ`amS<ٟK70; /n0}bGutAUrw#;A9. kYa7ium\5͝3K v8 vg>x3ޅ_xĺŎosK[;PZKd;#aa}0qo-Wtm$mḉoZg#YUo.h#(KE1I"&ݪ!%Iv cU)(o{<}m]Vw1;B@1Eckm K+JiB"gV[ݎI ᆧkh!)G(yadw- J<$da LKiw7Ztb. KbMFDlaCcG{1[Iiѭorap9W6/I'6 K{EHdݨ4l(\b9XFDEF>b9!iW" Upp&LG-!ERrFF}rHt|Ah.tDF[o6HeOۗy TsZg"oMɭQ\Gq;^HbFA7m匪Ֆ,HԴx[þ)ԭ_7_tqBZA%S cR[únh&O5Ya[#ThF%dvpynVqro }l^> 5 !b+5۔\sp # A,uTIu-/ܥDaf_M͑cKS[+uc[m5M+X6P&ʬcdjJ.r8Z4 vW+edylTeJaTZ[ ZkŗK˫0\]&s!K"ûR۴mR_M@QAqiC[ý\Q~fbPk,>G|}GJk3NAuKK\.d\/iW#ʵ;g6,(bv$xęuOK ZXܺoyd5HX'Y 87➥hPoHcJxY|\]-$i1˹Jvܤ ³IsJ_ a&-%ݨtVU EI&(E%#2!kJŖ_;YLR!It3O-*EiK$ Yt~1Έ:5M?|Cgs#kqNo/"$؏WkƢz} .VRRDuVB9R7)#/5I4ev?u:Y[whvdȨKOk4E-y-Ar*lBg_Vx_uAkԵ_÷#I.f8|@E2?.W?~9O xJ hױ2[rn?tW$1LkE=1q-v-_4!Ud4Wi l5 0-ΐ{ <).S}Ao(ih lmTϊ(_ BQ =woRi~&|OmiYDҠKMFEa#1NCdy#xXM'x&n%R4R>S? ]0+kn~&gnU}mpÑnU m!Tqȑ$؛ R$nU K2 ?G{sOg30V |2;CbozE4KK/ Z˦hX438q,2"T8~(Vo+Ez~&}Kŋ]iZŕ尶Ε^Xg`o-Bd & 7>MY!$4;H3-YvùByq_ү.la\ 3; A`NYvt xoxJX֭s9f 4`ATf'ybZK+ktP[uk'e|]BOռMV,=*25NT8eMTT k{V.e%uF% eH6MLE!-D% 4oo8[uLu26UH^h5ś<Ln#% F5]/m.|P> ,|W4zwtF]RHke_$C.ƮM}LN|oj):+xԳv.%ar h_6xOge>ڭĺ1MFHfim%^B#95ΙgsZj4Z>\`,1aT[ˑ< BYΛ6yyq+Gv"Gxd+HX H!Idm׉ WYŤK sdMB;3gܬw^]/&$> oe R$װE|Eo &v}Byu~''./RB&xEe.lqo>4>MݳYRK2OشMw/u|U=K] h`ɶq 1?g ~3č"s57sj-8-?wJp]NZgMs\1o򶅤,vONv*{>`i3g8-_Yc6&iwwgaI 3k{98̌^%`+ R6T[XuFM)uvG.Ѭm2eo"է6bEm;ë4m?<ᨬf4'|E|]2dR5i 67A$w߀Ӡveٯ/eӴ$cH-4#6J`8e/P/#7#PxO[O ֞T42F ~Y=ĭI/;^5O&oasBigybUe8݀*<'=uCDz[ӵhhYm/E($3nH;nSjWѝz|M{̏J o-b1}ZӢKf?.~ӧݣS &z3YZ_iˑ+R%V;B<1|5ZŴOZϝjaK!gxAzAenmJI XKn2^CE̵A mʲۇxyU'w'}>c6ƪ4)l^F>;KfZ[BVIϒO80f'9P8j񅯄(4E.5ۻ.dyIrVKgb8?_Pٻb|'uڦG hJ[S2t$K pk'u˯-r^~>k7fQ2j~ #d#zċor;"2D`8l^)^>u+K1 t6i5TcH<;+6\cǽR+ک=W_^oLjo? )?K4.m> {^cX9bN̊ A ki㴗 OhqjZk)<3hP=ka6]:5R厽^ʙc|*g7"i" iL/~mSIoYfHya%ȬcyF(*Vɷu-?v>٣15ޣyu nmmЁ,koKq"(vׇ$eͮZj'MG]JM>yvVY !la&T?Nlt}+QK^[DLe`x3*0eg*wJWJ/x|/U^h~t-g]yl-IKq wDW`rdTRʣ<ÍK:/5F+ w/ JQmߙuUh%Y%9fY1$o!TYn`fʨDsќDoxgN1J5+dPK$CHO) Oʭ]ai]h{YW _|I3R块]_oa< *sKۍ=5M9Aq}l`oZ)V<"(?2T( +|usk[ \4 xli 'Όv啁9&uW׈M3G,$dETeA1;L>#lbwDWOo.y H{ вZRJT,1.˿[34uEc5 "9gKfF̷`] ş4=r>K]ycbYcʲMeTE:T~'G k󶫡/h06ik Ρ$6|aAo1_2PI' z5/&6lY- b;y `1K);qh/,Cgo -s $;ռU[V**o/䨗S೼ɻiE4b)@edए|N-ͣ]N%'5'QYm=oxVxo/|;X>fԼ%Ck1P:/ oݑe'~,ѯ?N:M!"} WM39=pO <)kW>i+K$w""i-' 'ɯ.ş&xF oclfUe g KeFHF+H>*Z|e<;kϩh-5-BMpc]I#+y7R-Tڝ>Yy W\2…/›xF5;QyD澛և|Ak6{;d#EEce ) O]O {A5oE=Ōi*~&K8|H.qܙ`k=I;Vz?i윔yk_#x RLM*_> :X&gIgC"#zvվkob$4_P%uDq4^N|xG?5__搱[?嶧idTMs"5co5V~|6F";Ծ.i:jmՌLzK*ڔFQw3뮿3thmO4WUᠼɥ;Z;:t(£ CIxKN-4kxIBdF0Ywf@N7 u66t(4ص{3qd5o>?5J@W~Qʗdfcg|aĸAmbSI(HWGUrKrV]⪸˖1~ á%U휗dlS|'aTcC(5_si|^If}nomdʕenl9v-Vsi2m$Z͗X.綜GqS0f,bz|KgǚjWc-q2O*Ģf4U, XB]4{|km36ĚNiV%ՄMiFYy(tP>˯*=_cPdP yYf%pb^j-,{}:噦KDJW1+- XSuFtk;X5XtkP$Y`Rn*JNvJNZܞkGׅoqMxnuE[an-=ǘ@@O8cš-ݍšjzs-R%ݔXd6zn x[V.Y%#Î F‚핀P<'⟊t?amaGJ|s6ɣ\N`*ɫirO|NY&uOu:6!2!}YmB[6cϙ䏔Ծ ֍l sAugW"6yN% Vb$!RXWoi ™_ 5 6o\xX,A5/ʹ,#$e\ӘѴ gE|+iionEI#|22~6dʝߩ Qn)_9_xT$ƞ{ J[-$Vy9!&F$ ]?5lҤEKlmX4cW*8]d|)%χl~!/c.5Miݬar/$7X bΛ_VdžJm;P(]V獦;@<`Ds.J5naO_>>%ȷ&~t܆gXfP퀥\0M?ÞO= {j 6s໨tl UO[z^sƚZ×wRM< -/hiF[eJ}/V1#l>%Lk .ѯmL@fCɱBo]2!? O贝X{ 2DB. •mG^t7Ɲ\Yw.3,r*i +&bמIyas}eٿ$34_$.Hs.q ɻ6:'ͶMOial!_Dn=%j#lbic,X`eq0S|!o{xOhuܖ\-nt:՛xN-k-[[ڐ'Јf Ρc+[ }TWut緒 ͊HTZX%xE ]dy.@TV|%/rxwAײX|C] #@ۓQ;WxZ]i^jP)%)<*cfB2Bሯ}oľ7ǖqEc<o"$ZlѠ!g>=+?šKKx$fhȳF3?䐀_8'0B,W|s/?3f-)FXI YH dlҗr7G;pYve]QjN ޯc]V,-m?X"Sſ/b^wK97N J2\ZI*1a)V\T_gkğ!{HQoYjֻkesci&Y[Fa#[ ">qg@ޥeauMtOX?-Ź8{"(0@IBm; $KAK?5Ļo}]ZEpUv#ʀK)sw># GƗEJ/7^M6G> ÿ'l[4 :H٥H]%R~FYwVJս/.Iwyۉfߗ}ΤT+*tyRN]Z߀h4-F-.5e=jd؏J%rw|i6m-%m. I)pyAS[h>fkIuk%Xjo pVꥈuf;Tq MVz.qqi;hb!%W f)9 }mWXH|cxvǚmv{^ dHՂ*ʥDfx;:_CZ֬|/K7xsX}>[VY$G v1JG5htk],%ȤV~k[`^p°m4Z$w93\72b)-}M@)Hy̖RcqS@c !w*m:46.o2ᕋm 3HHp*N𗉒KM,q\!VR6L(yo汆42 ﲩ5vKugh'+ )NR]BN>&| Z׀|16PgۛV'8v9#$HO*S^ZݻK1[7]GYՄ:-ΘWs<OĬQT?0ķ>=s|K|;xXkk|PDg³~j1êG}}o|n[Z*2a-T)l[8|-鷷 Wnn;]fd *tG9DR [\ƽ+Y$]ɵ xKNյl-[W]69.*dmQlAڸ<-Y=wVGvbLOta *bp'*5"F)tS$-'M+Y݈߷8lf\Pԡh.活X^Hq.Ա 熥EQOxTKS5ީ<1,( 8r38Nȭo5XVKst&U@$7et | vZոu]I45G.3 ը ZَKDTaWC_|S(ɧݪYCb5 ]6 ݽr6ug  wW-y6nϧZydk9u kD8!K)$r##˖ˮg0Utyuoi;e ]B#vuw"Xw>vM>zMk-*'M~h |E9hom9]M:0 tR*e1}CUmSqSisȼ+૽_SӼ=9bFf3/͒۹+>6N ;MzֺlRgޣBƾjƲG$-":Ŕ j_km$:EܲEE/##.;P;encd@1FPa*$ausўZ^hu"WYIbtUI+,JI:)f¾&,E2@-/X+JypH~SbO}_Zqƕvc5;=&n2J#x>3$EQZƭkr-XMxC2̌l]V6S"1>tn"v̟fU $!VsB~%h4'jizqLh'UP#|d]Z>},QZmq&ٜ)V\`UӮM0" I 1y2w`01ٳV3KP; LJux.Wsmw g0KYA3227 55k;׶E՜SVo2/ P*a<Ϙۂi |#~$}+6D WƒH<;dPAזGᧆ?hV>#>kmJ ymRY+zHU~Qp~$T%&?}Ocucu ʱ[,Ra_20µ`ꚏާzv5XltM4;e C9)H:@\c#ǒVgG⸄d۬ ֓G";[J?ǥ1&jQNsBD9H%TˠUA4{DzN:vgl;'3oc͌&yFM1c_;#hb>SJB!՞m{?hb0X^kn" Z -b)|͠n/ m]~ES(D;z2+#]Ե!kG!pf*f-: <%k$wۮQCX:I#x鴭![@aa.L'J񓍨ѕФ:Ha%d$V9# {04T6_GMGD$3\mf? Ko2cQd r98 t8&'x3)} TѼ;I'O s\7KP\#,f<a) rr9Zڳ5eK.ژZAbXkmD]R`qaC:E(Ȁ0 @`8$@0H5t QT/͑I9t <]<"+1]P}t7dlI I!EwH $n8>~O{wܸm <w rXkqw[d#ƛվV9e`A8O#6m̹]IeݧwH6TmV!F>PTrX;M8%utL GlV!.I8$ oC#E-T0Р6dd7 tGI fŅmcdV.A$R0 A=+j*yWmH#)#2HqӨwVŶ&XE͸eTr9G)N.um^aU7||wc|ӌv2Cx(UUm d'KN$8[ai" 4 ጀ``v>nNkϞCT(ЧCc r7gAd՟%1[]*GH8* d<ճVNAmy?';"yc~l '"I5CQoPH<86|[ZMI&Qkk>8XeQYySs a\.H]^\Hb$X|xPWe`JFH`+d k<ȷDGX hDEv r)Z_r[o,8>%IZ 3ɍ[ۿ\Rd }dCeYBXn 1>`,\ho%檒-חp'4d#td TG5VSmt9]om +Znks!v$dBμaqioZp'ΨVWR̡Hj۸ $\C%7<*6/#`Ni4X|{xˤ "̻] l* Iq*|c /}FSu󧬾)쵫Y$m|a`9^IvkÁnN";[_.&XBmw3d0q[tE^^L7zIX4'Rեe4V@Αps?>Լ#Utj;vI#zM*ʙ NmW9h*zsx{V~#!/U-:i&xd$l|yq5is5e'(O_?ly|;Cկu{+7Ev X𼪒팹- @݀eoKZqK#5Ñ}qL|̊M͵$ TCЂ-7^Լ5ťq%ķhyje̩]ʥs_f|?=n ٝGTQ2vhmEOτە*70#w=>ZXmXk{RK-QgsÏMmwoqr'TkZ)і8Q͒`NHZC_B_/?+zk[vWu%;C"1Č|;ViWfֶ,Po#&㟐~cKipRMڂ̗ ,4CbE ?#z_ o3U6ד]i|w3'a f`DOP*~Nq>ᯈ/5o^Zj K%YI!!n"6O=8*+[|emk7u ͥk ^m72YLeZNunJ2oǺg^qZUϟF;kċ2#I/147LɇY3br K6\dWG_.j"uy-nn!b_+&ܟ\(83Ht-^i[8q\(  2,LFCuVU.wI]zW| :vKhtm+-wl v.Hkk$W˜72-m97>xwCկt}"6Y-tc@Xa7SHjZGeʑ;[Im Y#J*HJJIÚ:zᣩAEݿKiRػ\\;\Y5.Yh;m!m]xPIm2f8Xr2juU_,ܬdr_2F zfK^tKT$S"[W8ppfrՑ˪G-3Vֺjs`vPI@iF?u _x^LZo!TK|. w"*9i Hc: |=jw&źXUCo,MuxmN(5cVo55좞(2>ø2&0H+jM\R Žb9.YcSh,X8,A=-.$ⵐɺErzXKR.j1l$ky,tEoR].O/cu$O0lB~ucO=WF6Oil-ܜ}$#lsbz^[:_g&L>[I-# ſ xBCKM<-+ rI,nH$u5 i{i$uVyoJMJ^}N+fV1wI ?Hܥt'7xf]Ti5wqZaQ;@I:Ōr'tm6DZ?n&@-A<X+/QK[OF DFM (7(Np*vM$Z}O?ޥ'G/-XV[2}YQQh 8ۜ@|1M>}z,"kCY\\GqulʉsdF"2DhsV3/ADWVYRdTtDdEo2Ia>3O3}uަ"K" S\HfP0'ZR[V4{+i^@5{-©Wi-hgy$b8}%oc[˻#4=7TI V*ː3|s{ hj__ΨȱA9\e|ϵp/6:lV3'lw 7. ~e=r3oߺFx|[:rkEcLM)L@o !&%KD ,\m@>\.x*Լ]msW5->;XKiI.(|ѩWt/@u 9CS厍 t=pY2i"DM1:ߋ|3|+IkECo{yሔbF"9.\!w"sz|ȵa%Mdn_K24Z3:xc L*A 䇮ű ZģMd.ɄаU,U6Hj5&I$))$0pһmNk <:~>{*Gn"Em`GY&,ƻc%^O>i iA W)\斊ҁ6U1 MbVtmKצ%w7$(GnrS'4DS|1FB et8ۃT׃Po.[P0V,GTt:ð2Ma;ΪZ i ɩ[ζsO_[E]LF1M#-2hWv:8 } R3nzvk:|']R[( Kqsn-.7#p3.zW=bR7֒T-v%֢ =3:-N8faT:kQQ >QhxVT!rx×?+{xò_^ VT2&-7gca2RXm}5/ Ii$77DJg"giPj qg_xrI_H]!rmMkg;`hët%y1dvV.usύ)iMkrk#KMKHP'p\!t-@Ҵ{LҬ٭h^ %f%[=X}3[{eɣuT r~7%Op3%hʝCT𿈴 'ƞ.@K-Ip4cɸA\"v`y /MkkcCHn_w>s 0o7L'|[ ;M-JGy.e^\X;ش&$ V1^-)RTږ05y/#0my!+*rXN7:IҼqb̷"Cp'*,xͿ䖏 1VLK-~q\,z}w$FO-%F 35x_麯~4x-հ 9uu@J.#IWeZ'Zsi5/.lV  >H'Ux{h׳=NݺXm7Z)'t];~+W:Y\O/G$O*F0!ozhEcڕ"եͲGmgfs%Y_nIqצxLx+mޙixM 2I<|BYJfܽO57u4m26>I`+EbHVڵ6b{jNhۊ[G~ <= ]Yn﬈uI-.LFuw  A]Kn7᫆wikp]^io}%vB1.Z% NFG~W`MBk[]K͆Gm16 nę Xv<+kJ .o]{eC5ude_=Ld$/|0iٵf[tTޏC"x^ς<}Z_]-.!Rj6\$̒!"Hf*|;yLrKN𥵭tbe}fX'J&dO!;eU«~.д j_M]:{c$-qe$b+!Y&/C~1 w: >+x8] ƒi"\qq1M]}= 3q=Nc|kzWCK=]KHV)DbFbPUvwm/A˽R%%֕Ycf4*dVh]•Gc$ԤP46g%aڣ+HO9j 5}KofLrga{ټ^yF8V9]cm+)sn2nީx/ƶQZ-tJiMȶo^HC9HJȻg9*k'ӧH$ӠeMzcyr$!cETh*ɴ'.Xxo-3^EۭwA,4q[9, +d'"Ñ[o޶%rŶ!!q^?8J;=z<_^MizM5CF먘bʫ#*OUԼqOگ|5m!^ mR. .(rtRZ,#Wi|:[y5ۋU5[Kg0>721|c9ŚYD[=ٵ-d$}Wˆޡ8V?!;H֔t_#䴏Fus<5#xw~ikmo/Ƞ%ەnk֬2 šYeJd-L`ՁY/ƐtfzMt;X\F e1'Tw 0˽K.Vvyi-/^EV=2*"%?c Ey[c-Q\jWZUAeмODqg(\e1T*Wo©5k=MM+>P6ҥP d( Џ2xp8E ZD#ZΡVw騘ntFO-edHc76EȮSF7>&kxTnȰkX.$H6R;L8yr0!OӭZ"|VRZ'6uep21sc0BO ]]"\\SZ42EH!f!i NK^ !&Svâ \jmu>mizȳi"53   I q<'iGG{ dwom im.%P-nJmKmΏc/?vY]FS6 o6o,Ej+nqx#(bê{xW/r5I%%w#!G!mq/b^^ih"/%*L y &ʻ.?K5Si]ƽ7 4:7[uk-> >M7dLrwcm P׼?)h~kr7}e^T*:'·Y/,fcJejQZ$}۫j]5mZX,,IQk]1uٖD˴m}OrMWu}KYMӵ60Jk4b(kkS19|0:մoi:ĚN|G+Cbc"[Gq-"PZ4WZoJ{/%"ey|J1ܠeP/MO_p.L4\Z4ȭ4a?|!.7ôv|R׼!~:^se67ZdA BFʆ;*lC[ԼUZO5ݳGK4R^Li|K/W4gtFibi-x)RXSX#38J<[~|KQkÿ 5mkW/Ļ-l乊FE圍5žw ȅQnmocτ:ſ<7,wd^ T# X䬪x3V>4kL[Bk׀B*cHj;&W],F3*=m25+<GArn;'(,j⻉u7;'[yՄYZ%9܎B7-~$|3k"UǧMg͸cCHc˩ճ[ϊugSZdR@~mnK$1ͺH䍄%J8Yǟ,{V–YA.e+HpytyY`vJ2(rj'gױMo]6iἌU򤈱dGRF@ןk#^Mv+> m{ Ey!wO4)mxX?b5닸qFIm }]rha{saᴵm&;j* uԏoȲrm;cR},J'$v9/0>'\ݦs_zޥ`YLJq8_5"0vFlJ{\zh"K$B ֗m2ە9(sSyxwFk.;˨@p@,P!de? m_s]{O[}24iu-aFy-cy( !+Hw;cw6f3K=NUFկgs<v$ E2| /5YYY#ZpJ|msWzO r}XɁXE*ש7~+_Qm{JD7sn7 +ew+(ݹLaʇ r8ltB[K2`#-FH"\@(k.ּ;r$\C=G2`oJﬞЧ(|9kVkW2i֑ Y7|ۙcT+|W^W]{w^|&GZx8n̅eEow+|;5.h;{k]%Wfes-dy_qvRXR_j^5 9nQE-*#rawإMrj_ѵ&ֻ1.RYE.bcdq{]Z\O`=*117, Q2N/YrvBJ n;$[PRf)mv7 }eW>%8񥼺υ6Kxndup4U@K|Řy7ĉoZ.zm4lZL253[K7`\FVwWu^KEu-#5IWh"UQ$FͲ3)Ti_M{37[񝿍Qx_^]&%'a!-1:H 6JBI/$ntNr^ ohOu K”!6ֳ.gsspbid+f˂X89-m9my7ēLвl,cVMF9&KKĞE21D%GU(&.֭UIF1}4H\ѼIlm^7[1Y.S;fu!c<ɴ+ QCu$!nXƥ!~ufXֳ2sj{-[tBP {9[툌2/M5+jR}VM-!WDc8d{P3 ŁaG;O[}jX{Mf+*Dc]H `q‰&5..5&yJyh6 rrzZռKyIˬ\\ AgPw$T۶M<݃6 Q P uu5dȡKl][g#i̥O*\irZ%1A ^ Jvc?9&񆩧YxgJt 4.{{g\cMT&,M]j6Zhlۼd@+$`X(:×)j4kdnUvQpcx^8p;|TzvE5Гɖ J07!A)W !׈5կf[ VrRxVliHYr :ɴKvƚ4hlEhoms0 lSyrYm꫕kF-I_CuMGqc#y'H(k'm|/|\'I?dmK>K..]"H >Y@@ϸF*/5 j5.!A"q-IB|[𧅵_Əa}}SY"<0(h &]UC/,]L'Rb@5h"hot11E@ڕhyx"dR`^&ฏze{%Ki\XL, gl(k_/iR?#.;aE,6;|r_<]En͕Zt02rώWn1q'˚5]*Ķ<oJXu7ۃdkYQseVJ GIO/j?_%&"xݟ1 p9!&éE55I|۟)|i0J Բvrf|GRc}873LL6}9܍b]voZ lyNJ]j3'Zso k62[{ |J|}~ǭi2)ߥKa=6 /x%)*`ϞilZƬ;k`ʑvix\3&68\0cZ|_N~)ҋhnb]1>Z tXmEǃON9POo$y0yn@ )Z[Wmqu(-VVfR8s]~i믹ulqi"qʲztG2}/:|"+DGz^ϨEmsyq[,qO"G^E (o!FWʺ3B .F"H>ePpzWj:$0Y*Zت[q!pb֓M[Hܳn{YCN XԝVݤ7,c-Ԁve#'Aks:`2+$,ѕ*0 ЖHn.U7I2\HNҧ 9]Hi6V_و%btGuG zp7v]N9̝F{3$䈹PCenU!p+6R?h\m3Ww R͖Q&Gh[2+,r6#3{xQA439;K՞RH.2n*\ amCKNbuVvYvHqA ']x|UOxTty5)MFtXA<$-Г^G7oƯ=G#0fel#iTu,y > a2\*\y3w[+*0n`G%qX:$׹NVkTf?5~>.ڴe qk_h5̢7%riz=sOu<7SEm{ ̐pƎanUNA5Mwx^A~S;0R @==On5f{kBQ˜n-y8Җi$_\gvB0HUYUU Gq=sZy/o&T,m>#N]1{2432A3_-.sTP:Zm-gT HܡP9lvXk[̷ ֎+01z2cWfO1D 0Ktbx?3 d!G ~cL2 d*WH드:dV6KWL>mclfF0}nRd̎]A7')#QdU e(_kci`~ dtt1KfH;$cv ÆV-4xOpf$0*2$WOZy*$Hp)h;* qK'VŤp"=1 lN(E&]4CVˆ<Aޖ"ӳG[Y PUܟ6CL-iVU'fSn'$xw:]= HO/rB31WREZXLAIU ^HYA#S9=Y7M´|nVQܩ6zdf՚&Yk&EY%Yx$p7`H5m2o+̑BNO.y;Kf$[e#+;|AUnLu}g&zSs0<9Vy'Hh @T`1 0G>cy>!Y{"Dw $Xa샐S] ZwI͜4[6F1AڽMSutoG+u"Xi$eJH9pNrS]n,I$,kL//B`񷟘WSv1l*Ff`Di \Jn%"w0οi&,Bp1g5Y0y#豪xN_fvjqݪ$qĬȝ .k~C3ɲx`cnV S>J[."OWl*o@m :v ^yip6NOImnZMy1x->i pGx%mlo1J}3yWr8۸ !WA_},FEbpdKm)TPкo;svWG|U,6" | hņᖉS3&紎VW'" C$iKpRHoEsxVD/lC\Cbto6S";IH>ZwQ]_65[[Ù֚k\iWSq#I1<+KcP4sGմ.將KhôJT1|Hk8~Y 5i-5M@kfN4Ђ%Y-xA$W˾5g_:SVOZy;9`pVd 'W?.ӴOv}/ю8(Jlg/fwjSGu Q5БLw (!(r|:JWXQ=5nV-0˼ƅWp%,8W=\v7ЬCacnz.ah}Nvs *BSs+€69JviN[mARoEkl!Kt!5b)LdC9 kMWM? >.N%#(XǵrZEx‚rMG~x\Oo~Ҡúԓjk@sf>9,H5x֩MokS UxbXpY^?ElJ.vs2꺦"}X^lXC >cI>`  ȣy@x]tZ}&rV4j3DR~? '${6(GM]_𶸞Ms_/tymd +HfgU>U8ɚktkTݡmtqPr1_F6-W_}1.Xl4_4If,2D;$YY,$^\ Pϐ7,04z7_Scr&D2Z FXg28j7~.6[mn$@X!o RpbFFkфnqF~>#62:|ZG \Ĺ*mWq'?ž.rm-$Ҭ5 $v KЦݦL۹U1UPӣ׮8_,@Gudi xInwL 4`Lk:Q[k2<00LgW/irύ"7,,OCa7k(ndfrU|mC#%y&o<;j:n|mMM:oT%+zb5= #+|DB]Yιˬ!ځ." +JKT_Fֱ],vJjWQI` sŋ^jQ)!%M|Ux Mg47si-\"D1˻ S|r=2=a/-mkxt,ܘ;Gፇ 2$ЧSl=R &xNԭIu;]:=qD@LZqX+jNKDXuK-#ZahסW.<x}2M\G!,rI3M)?.d x+Ay"]O7nR fxu#4ȉUw0-aЩbW2=ᦛ^2м]UTҴ)JZX${w`[yʖU$oh_T.3\usqk#`h~ vI;F i.E.`]"rn.`'{,Ҟ.#(ʊ0x↵m#N|:t[K-YRq$ˍL= ZeqnOeKKiᱥmJ0pZDϦ@<0 &MB ;$a:}.L =4IgmRK>n8`V,;^je-[8i-mIB&f VWfeS.U- F7״/O[9bay#ޓfFW X-C\|{?j2\70R2 bW'.dc4 g 5EX^Mp,c9-pIr@j^Vh2 $6"\EzE Fd*S^*ɽMź8];lv ${k+m* ᬵ9-Rkp!*K!HANΙ|Kua6Pb @C9ʨp,8KcZchw=Oּ [!~Նg@#[Y|FL~xh1-_ؖg%Oo̱[<ERɑIY&k{asKu$Elgfelve@][|OO Kk[]xN Y{"GLa 0mN ]5USQtGY[zot(ѴF5Gןh>o-e}65 n5-:}b3O( yR0v oo@奦[!yq%)`Z{vT 2@ ce^k/(-ݬ4]V NEҮec7V,uwz?5 i:&$}KUOĚ䖑$ .tn$h/X,ll'Ek˚34|F4uJ'u7[AfKwmC6>fQVԇ|?5MZVRL$餺b Ix'U;K_v:VvdIrcRd|ڤǃWݍgH֎m$j~ iDQr22F1罓^8aKDޟ7)\xFӣ'/l ˖GD{ Q"w%Msŧi"5:4H-Hn@ (t#Vx⵳u1J#!33űBF?O𵎹;Z5ާjg}Laip=N`F FAy6]AXIm}t^jZummm+ ӚKnUQJۿasᧃbukfY{Ygh[{wO ydĈx5zu&ѦnZxQrC,aJdF~<]=4 Y~D8eIQ#[[&I`=oX<9c+LՒa2-!Y{ZEHfkJ[1 B*_;nZmͺm\i\0jIӨ / ~EuXOgqw"Ks[xFŴ8 .ru +|_MbmeZ@j2 ;>-r=A߱tӅB$S+e^O1HE%Cq-O𕶷3 CR6\^Z:.& %[G.e*n#VmIߵճ ޭhp\$*[l6*cr%SČp\0=v;f#h> ݪY[ŧ7O,A XDrD˸SZ_|1aj> Pj6ZE&)m#C+k ˖Cv~5}zB?ﯡ WWSi z{G+M.4Uox..)67_=[hec˫i߫_llhInY"TwksZz/&m&HԵKC%!,P1$v/ -wrjvp ?R0&\f0xͩo|J{riVai.cE7*J$'*rxFoOxtk #iM1\ ,Xz/5'5ifZS 2,Os+D&_8 \,t][?>i¯B o.̍#9lKn3 ԓW4Jj.I|뱑8#=fܛNYNSY88X6"noȘ׻Ux};hz<[gQXf2Cᛦ]WW EWy4guO>x^=s}gf}N-5, A}VEL}$|M:h%WX|s;Z!blK}M-|ek'ay.Od-F'h}۬r^)9N`HTWH񼩑FY eUE;m?}x'?].25fe!+偰unci];]as#=HIc%=5Go2|CӼiC5ԠwYm k(bIvR_ ]hzoimym|vl,īpĀD%#k 'U\[~"5 C'f֣{{{uVKB\$;#  ibUE}/Zw4imĚo>vTvic ˙`\Zȓ||ۮKw7S7lk4`Ij-cfQ63%Լq,_Jmo*8*#{i3<.'tM ZcVғogVJkd$?mymSXҭt;ylnSS4RFF߾2n,vP=sB_-tYW[睡yO-!'.- +NE7bq49Un>ϹZYNr<6K@Pdy[nK H[=[ZIn%{,I.j #8w~.whup1arvFVn qy//݄b͢/&@-&@<1gie*:.MkZzׇ"Y +rghtg=+7&էtxӴb(#Kȣ7M噒H,o+c@]PI\Z[߃b UK(1I$? p[/"ltbѢX-e-\K74 faSC:J|?hV;-f'%ecʆ1\+[Kr{eΝ!&?g0ϖ%Pa.,$Ef);-\\:ܛF+p$2#~C" (WiEXOwF\iUӚ#aqY 3|:Yq>uc,_ / }_x{ZԿo1d$:+N*7z,mw,WW`˟Q.*NJ3cnù [Zt4Q֦+[[xGIۂ*qGc]!֮a-ԭnm?ݒK [`ֶgkVx6V+ R_̖k=޸  (b9 xP.4/D6!Dm0mTn ͼf8aM]}cba$̑"2FN?xQQ}u<%mڝU͞&Y3Hm'ABCnIwy/E⋙")٬[̅M ۗqeCk"t \Ęu`;_\),lZKG}uvb|E|<-x2ɞb,F$svJ^՚jzYOt W~_-">ld5ki ]nӼsேGL5֟}c$ (5c*Hur$(|^%UY,,p?IO) APpt{uOfn#M$ֱ𞙥Zi^ymI>&ִ{)h'"YmƨF<3Mn^/"wIbua@ʥvX|ˑxzo&n+$MyGES"HJ i6WWO܍R;Iv`c%$]p\>Kݐ6[Z4?x7φZ E iQ *!\cWi/jV GlۘGI/lHlVtx"T+6 HC,$W#ig`qVt8,M}_k$wj7yd3H.%M̤Wtg˙8?K7>"+x{F RbYć'P0knWZ?ZuCg}9,Cǃ0U`kӯ5 TOYi k/D4V^hDSMj-*99[kõWTtV̮-ٕnE9D|fc6sOT:ba|/tgV[8ߧYEtI.bݼ67< /gS0;Gp-㐀LrGhLL-}JqsHx$;!nTЏcվV 5i1隞LKY't۴t8B'۲0NkuRٍUթQ,7T%a?gRoT(2띥A4=ι-y(iu=HBGD$f9+7KInU8[&LX,7x"N`g[(*7e0ۀlsK̥$^1j0OeLb(|p#~z-i5# 5;,je͌i2afK HݱԒ01度Y4^=-ı6oH2FZE yiϐWWS\zV>)H MʩJL1VtV4S|A"jzGż(;I:.ljbI}i/NlHFXJJH3$*]wß ڕ#iK4r ̒0Ji"msD%қĎ=:<+&ކ$b7W$(bJRT].okh}{2:hۆv|˽uH{.;Th|][L9l`NW+xFlm7P (dC`|QxX|ZݼIÉs(pW#Rvvg4'+SnNQof*ȹ,%r[, yOJa5+k&ki`aeFvl*=>[_\^)f><h=F] >GF<אKq}GᾱN&qY$[[kr\@8)b0rktαɿ Cd8$t<*'۔M]Igsu$l(É!"%eyrr+5yČcrPmU'aWw6mnX$>L{Zu8D @ v 98Yu]Ha|D*H7`aNG rׁXJΚ>W#k۽Nyt䳷635.&Xy~alJ @fɦ/"Veo"̓';mpP/rFzE8`089sqHٌήd '+2  l5DFY(@SF,VHѝm}U-1 Y# ;A9'IIJE1mA'0F9=N+~S x.H?xYrKdgj6bF&-ȏ(Asj7+h:́]b _il=>o.q)C*?ʎpAS1tb04{5xżrUU%A+ߡ 9Tnr8#HuV!E\#Nz眞JX"ȿ3aԮ 8EvT1_ɧ[ZoĆ?8y[ dUڋp,s晌f=FPo6ƌfhlpxf,ϒ7\ S_[w?I?|!i>}+~Syɂ6w̑0\_3jQAcᱦAJ)*AH܎K`<=JQץ8J3෋G9caݵZB.c,PLe#xq23Oig3 L*HfP%N1 $ 1դ֚4<# yʹEBOA+sY.X`b vy$Jz3ywKw)(}.^ yXWYZ9#0-.A< ;MEPE̩G(%jQ#87,M+eJY>]ۂW pFӓ^56ZFֲҸH<'!{HTnn]BXb?qH3MzmͅOeƭ!~.È,wA'C, F(DYrc k֣=F͜\dO8cF0Oͷ3 Y1+ &1=y8`q}}$vΉh<q' 9S$A݂0 n9滣&yRSJY[+\DY1BK&c2]=Lv@n̻$29r! .NxF+ %46hAF$uf[Ĺ T09 2q0n3Ш+-bAP.šR<ؐ/M#PX͓rȗ!npHvxm)XK3m11l#7HS=3һ?PDMJK wI"HL+#gN>tѦݶa*, n7!T2Ԗ\u<2EwT{t0*PBv<P 1-ǹlpy%S pOizϊ-pR;mamU"#;,vc|%~eey6) <.bҺ|5~(xmė7eK(XHV4 6*- +Ú%v& 톚[1"4HJCaxVzqΟKخ"D 5""}1Hŝ3W'uMGy$,dA`rM#H΀$j{C׺],x/{:4rphU0*JX72 jھ7nd3好,Eԝ@T'kMs/gO $ Yyj2 DR# e}6&[^7iY#T4P\DFJ?(1lwW?$l;bN(6#29 xo@5zӯłx )]$U'f=B:~*Ѣ# ,eیku}; 44W>kV:K!:$HQ  )$p F05fIYX5;dYp1"62 AEhKGmmôKcY-I'LgQg)^C,ymB鴶Fy gM>=/'3ŽŔa"gV h;u! 8۟& {k`'\$FF O\+r{y% FC|QjEk+;[hV'oV?,&&? k&- /ۚ_*B;A]۲ϝfvڽOgW\tK}j+3 Q^^_xNaRqxė^'bW7b[4gyXP‚6G Aq[I!mmmc9'cXeudu^g[}@PҵǖYq}psGp6*fKNNzwwgl NH%`lga a p? rWϒvm-,DgL;yqfA8fŲO6{u`##x`'hȟR6)nX" TpJ|0n#$r:E귩BVk9$G 󤬲P#bm@~u8>y;H!i$tT`;/JڣIqB/kd1dBHC!6deM3UG{-9\-x 7V:TQ]9 r.+[>wb%ńۅ$UxKQ9CY(F<:036Y cҥudnOW}ypbAl%Ky%DsX^gif[l,9$lUH 7xsÖw^#ӧ.U,"k}>I6E.% *7I}֙jxZ:Zӵ'f6S]pOyAI=P  &բs܆(Z㨼=,RI` }?vi{3щ  B~}⏰_x]z{b ݊[RGi`bē5q:o&ky 8o*B0WWu$aY~YtݯQsx,&;V{V줂X#i<ؼlOӛ79^P~-?qGG=Σ|1}+qs;9dYl(M8#'Z_{wKI=3Aqyb@Φ2e$ɘS]amaoixRI[;fխ.-ԴrZjY@(cB8x@kk/um$z<0-쒕EQ"eFc's׈I]]=M^hJK[f4~ M$)lmf°hO=+Do%D ÕszԼi6P5vCw*Ni4+)#ѡ]I.Uo*<$ivɴ6RrǕno mL,_ xAn.n-th5#[@[ܳJ_teE2o,64cxNMS::U֕yq7{$}c%B3.2 CĺΑ 4m!V]&K\)X 1u2;-/{j;=B8h& 0ۆm'SFfF3}FVkha bkP.ZƯhVKmbZ)vqXe,2ǚƽ6h73[D6maefj#J=3¤_ -E8ʬ+LMg^k6%q<*A',XR2G %cck1<"_2T~Y>ܣZD! B=)*e 7Mt;J]ZEE[̱[A3䢖 cd|^ —ml~lrYۡGv;!'+0 "B%I&ݧkεEm[^hS/aWǓpd;g.Vߺ fC)<ŕ* JjtHY%I62ȇ Yܟ6L03Y0:y&D, O&oTQ rNc7+ZiMֈچ3ewm;sI*PI*4عt) SU&w0-g1VF*q J\| j]HRy/'{妹7/&E˖$] +J}fx˗ߘĻv|ڞ\V/v6)S͢E4~34^K.VhП.e4m$q;+K? |7M"="-*]5>,*di%ȥ@Hث$?u-"KkKeb&eY*2Ŷ1'fyx[P rZq[4v gF#)-%NXp8j5chszwմ?"P$֗ "C(!2z6O+C XMbNm͔1Ir@W@yf5-MG"Gaybr6]Z<+IʶsQ:w?v-gOcҬNf8fD$Flo c{I2yg{Uw[TvIW'w}66_g\./<2-0|$Ut [NA}R uy#QwyLeHH.Tm~ߛ/u7oϧ~Ǘh*/5O/-XAk{q<{pq`| `s ~_nJAjF W]M仵JR[yiX2IʂwR+i -g.,sinHK㝍E>!Nz3}um 檖-v4R 4jGrıf(M{DރZR{Z}G$yK66_G-QB1F ~d*)xF|I`=E>gZkiQI|*J1ӷt:OK^kL>`ݭ/I s,a73~P:c=aɧVK`feqlj7q$P{x~]r}5u;6t'{KQGH5k/n紟U"FnY7whhEb`rI-uFV=/kl_?u; ɡi~,ŭ$ ?lF0Ⱥh$ U(PybG?k>OkGYct[6̙YG8(H#ErG8uO2!HD[:X[!emV@YpD |PGLѮ5FVxn# w4qh!.BrT#--n0{E ωu ZhڴSjyv/&nnCUhQ*%+6'Mixn崼M A,smYxqKGN4m t2Yks4RdEq$]ѱ nŵ滦^[|=կ}]NͦȄɴLlwG R%$PW-է9v~#:>"Z\O-Io+pMF_`9|YMVgd$|xs)~x_PAipЭ lQ(PBo Mxƃgw-Յ\8Caj׈)l2iB.+z/xj-m+Avw$eso$g^ R^%~/m][hut׶J$JJcX) |-]oC|C6{zkyJXf%bƬx +d5پWRK<͵VhdF,fNɨ);Oo= OD>ԣ,)A-Ʀ4{GgG bHb,,2x/WO)d%V2—ίF>iUC׊K%RQe6}ղ M#FSǃrTתd=~#x'v mn9 \[xs,YׂTrUc F./U{ym}_~-0C7> ׾q-ZGfۇ+TTbZ'|?CJ|;k^Iomk 廱"_e n ǟ.ki^믬ܼ\!9pEQ$Nޏ}_RцEm"%o>%1+b#j U o)n޽5 Fּ]f?h58[c_'t[wX ߴGeȣ&i Z]$Ek˟rX,0|C8AD"-ȱq sʮͥv9z]2FOmhrJns0ǜY5<mKȟdV?MŞ2E,mؖFm.5K,$X3g*782yZx_,cOKk}Z o2-46Snf(~A(攮wA^|fMgLYQKmn c'b+2@mb|#gSG/'5͔RG[yR #\G|>. ݷwվ'صnƥ[p2˨XJrmS!;7sVw=3>Gn?u5leMic\"mI#,@;c-X 1xgǿ~(^3k~-u-O0]-6R)`&IC1|]=R]峉t{^~$q#Hl.ʬGfʃ,Y]W Ox[:KUse禾tͮN]߳];:+ӥot>)zͥk"Q谂'bgxa7ƓMM$QI/XfF{/-7%Ǎ&yЩh*s^Ky=vٶڇ-]*8a(Ѫ^0b;jqzƛê\G!yf;G!a%fpAZk^8l.!K;i9F҅mW6T ֐c&SKmm@b\ !!(۸ЂWB-,!engMcqd4ƹ%kg4OaF0pOͳrLjed|GZG"]fbͰ#YHdW>MHȊJʾHgE\]#!5At?e:ysHϴ;ʝ u_Omw s΍c"*.e$H'`3td#E㾄J̢E"X#T԰q'}s@Vrj!#Ҳp^%mfV/5o[5CKj,؈7"Go$;)#qYoKD<-t\cXFHE)9 }Ng^vCR˰+a-ćt8pl-Z:t/1R Ky EAUF Fg(Q];^Y!r@10Įq5~ -dcMSNәK/?P oڠ%1 a`xע/DJZɾ"|TgO~"]W60i_NghZyCs~p ˍ]ff4}9̷B7A)yTN·u$Tke}GujqAx\3m*Wv&/*oBl5[U&&&[Iec IbN 3mSj+DxeGw`(\6o/& ) V&7܌O(jMU7khZ|75ϕh/g5Ō3$C}YIu" R@$Fp݇KidںGIn3X0%@e%+3vht{V~U5h <:F$ 1'2r{}K1`}NiƔ$wVReݒr1fB a,ehmMna%,mWmoNHlS'<[bV7qĖS5܁ vڬīCMr> H5&o;O~"9~]oG6ڎiF" &Aۀv$V /8Id (G$W]{aKmXZ+sfG %Az6[ 9rUH\?* v”RQ⢕G$b.wHT9^t*7U.A.d 1; [yΒ$y6u(U] + 6z+Fd9;3A#88jrJDwh{Y]!;blI"[\EeCMgEjOexy% Fe*YTfNhkkcU?!* OPy;q|11vd'9ZH#U sVF&4 J1WEF -HXpy<`J[XJ,8Mw{V2)ٸ 1rzctŚmQgBJ%!P0,R@>jA4o ]Tr{#gqW7o 5m,ڠN3^2BcdqoMvNg嬒oW'Ip98#u֬mo!4rd-u-hf[h!$#9oNjaeu+(H$qsֺM,<^k'2$RG" tQU 1R<Im&~l QQ*ʀu#̱Rcuy&Tp|\l8m]Q "_l(,n@ݓA[tҴ鮵*9d]892+=sAN (YěNv+̤ c[閲v  FF!wp lUMke<t v<ҳ;M#biG#@XfX w ]er=K;2 X}ebAx#E,N"pIP])(r uQj v#HTfRw_-ew%!NWzjz޹gPKB͑n%rrًBO mB=DL,)+P@v JO<%蠤bE1 2q= Z0i J`ɍP1g}IAv(4G"L3sHdguGk+ݼ#;"VQ* [|2V[úDzˬ$ԭP-ϜT09[!q gIc6 @Le{,̗XnF7r,cDˉX<`*]۲I;GdgRc#+Ɨ錑Ha4p ddY/%ځ,bAoC6/] x\xYcUks’8(ϡa$S#.09h#5T.-rv*,k ʬ ps]BmRG辗k% x2Rݢ@$&@̸'x/j &f{7he gGl -Æ:Awgp[V)`߆ =zlA{vc8o&F,܇?ywөbY*=OS?CϋzOlmnkB.T&d mg#%ukcw{lÈ O1\8Ci>ʐNȪ%-:3a>`?7CLw6)fq'  w1$XGN8)k>՗KӴBk!4kmJ۴BkokBU55{b#Fdw W+ l&5BƷťೆW!A-$)x7sZ:vs{!kdEBp\ #"̿;DˠXذD3~^."pORᾸ Q,Ow w Xhc\;H 2oxPϵ-+[+~`5 m}sp˳~̑êѵ|fE¶s$A2ϱʻ~P0|z[/L%[KG~[s8p# Sp2Ώɖ(涓1c̜?c&4G5+JW\dB If";.p K kռBpqf!eUA,pͼr5=W{Z(|  I;wl]b$G$k&$x²Ťt@PF8t{;+}xc- {)66Ds6IOM4O(Doc*\*JI!jCph|-|NwI,r$12eIqB-E7/$`Ei)6s.6d/[%ZaN{Ff輹#n.b^E+|2Z2@`]C}i,@n~ͧM}ۥ$,3C -^:NSetnE*"i  dh?tx;=؛mjMRBV&hf%^9R2Q_3V>FW=?R;oxB]f)DZ>iѨBel2&FVⶴ_4i/.8;$EɁL9!j_W%wϧ>k.1M̳7mV^6nxXO\kۻȯaNb)aivUuR>{q~!km.p<2AyE*+.ت^VsI58jI3qij-Ƀ6vOky(CfX #x5ioFѱ7P#O*BqP|($>n>fbO3g(ѕ( @c|ʼn;k7O&M拸 F`vU22Y;QW>G:e%U-BF)dͤxx ex`gdmU$0VHs[Ŧi^qp$j,QJɌT`d><k$sn-UTm'kHcj\n`Meַ6lCn-D|Bcqʳ#eOKcӵO[͜KplM)Hci+G@F>`w-e鱕y8m.3 1YdHUd##_nxS ;qX % l C+K8߆ v-ZZI/&e?u$@T;IrHWFC$45hKDh}%,eTA ZNcs"[XdcFFӌヒqaVtHaTUP321p݅ɪVka,hNklAOqooz)h$ )C aBW#^&Y]k}q{1KiW6>d!wLMbGHюH5V/]iXimX-Wyn"u AUbA-FD^׈˭KP4+3%v#ea&2grk:%r]HǶYB˒ cێ;Gȗm1ZH$R+ W?*9SzumbIeHK C("1G%$rpMXƬLͫuqnG@2432$ HohlC,#I VaRXXWCm$Qge$V"2Rwoh|%eB:y@0E(˻pC̤8٣@mes'/mu)!cy vML G i4 ȡKTN⡰k˭"_XK+M^wD $W0$Q3f+m ]NI%KxdJByjȪ 'ϡQMhfIsZ'ǥ-y2,E,|}TW=m+Ti5-WQӵ1}iLNeԮv*HYI<;scJcY%eyAHׁq|³m-}qiwɢ׬<$ Ku ")H,3F81'FQ롥8=NT&}>;['| `fsVͳǧZk 1я[mhg*Š/9qakS֗lO VL^5>`S 5{V?uaokj6sbI.xS`X̃bO-/W3-5 š]]ͩh0:ctsOh.$h&7n@OZ|9?tK/P|K*> *!6]?J`g8yķ-OHIr\YC*;%kjW3] >'hHi2 ! mǪ%-.r))_EtiߡgxGwumSŚ be{ܢ4"2o2+ :oY=k>MZj蚌:v:Y <-V[$!+dR)4/FP"X>Awyw_4p9Ocx~Vw+CNmwbS57~ Q;"uhC$l[xݱd73=zQi,⽖)J( yvO1!^xXu A _b5`4KIY7F>fr=sSN_9Bj74oW~[q7:eݠ%p>jG`p|-GLEk)K-oV2$kqjVu<>RWGL/5$Ԓ]>+hnၤ Ap7mmX|;OܗodR"s$̬{5Z+Xjv>-Ȧt88 v9l,񿄼gKy]X[OpC^J\6aU)Xd/DCmvd:r5՝i.5uU޹EU ,F~[_rVcGĶhLrmRުY"@ ri˨B' K;+VtDr8>':.}pIEY2 W0Bѱa T>mV.|TxT:H76԰5ߋݮ.. Ud|Q~cÓ@#9y-1k9 ЪK37u Pܓd1w' y$ F+nڡ| ޤ:m EqtnmOx@݅=>~UT63z4]vxZv`Ad݅`Ju#vܰ#?xryKPluP\$qP6IG,k i5BK c Hz{օNgsq XX̂5y&f?7̭r]]v>4UogӬ5}n_]"y.(iFS DRԍE9{,n&kk/Ih r#s4 RLFP]yTX|<~\ qE?J 4M;eF@;@C`3Ͼ+>|=:.54x@J쮤1Pv HVoun˨iKMBM价K qep`dq&FgH[tyh-aw(-P, ]X^ ֗Q <#k&H#U#"BEy .Ei?S |K\^_jzdP4^ m9cπ΄~ =W,*$"pa̐J,DVCȬKyC7$ NMZ)J ft1(.W2SXo _G;mX 2?5&DCrWʅw.`6Z#y\)ovMF׷6J41.V!o!&v:1aW'>&k PŢ^Ee#|s㯉O +洋I"^[ gY< . T Ww&e\]ְ :7A$[@ (q~m,insʴi+S,y~&iHP m>]0<vnEe]^w[@c{'KK wȎ%<1a&|ElmX;$ Ś>ւiwHi)$VWd[iT)L7BWP Y@ mj '$6iJO^%<˭/w5-gK+ODmbUci]IFSW?]?!^-FKōuK7Iu+n)7*ζ?kKl\-]Km0Gb&TdU#m„Q>׵i6hzk-d7Q٬юY (& Q$WԦ%\yRv|&Kk"ohp[~V}Tm#ry d3nM kkwvEvVsFFrmm[ǟ ɸ ΰ<]2-^/ZL/Z)lMm>t 7͍|F<+'m>fѵ&kX5 = +/udBB 9|.nߏcüWk'{鶗:]ըxn-uf!V5"H!mT1ȮCOX{ϠjzŶy ѢfR`|h2z^/GUl.K>x6lMo0NeUm#4ئ|Γ}.L6$14C˹YǃRev\_ס!-xXӤn0V:"*{XQC4+l*0zwwFԥxjd׼3u[OY:կCa_6K PLÒr+7^cA5 }&䅚in9.gfuΌj'NWm_BU 57uk[\; =Rx)\Zy(YT9|ƞ!d7v6M]Jm**42**[r4+L|7o^I/U,w5\-z. :O~.Fخv7,jLin(n%ĜݎM$W4~Ğ2o?Z-WT?u[Ѽ3Eqqe+ ; r7 dW7_fլ] 'YnݯY-ڛ2b޿'u#]yuhu&TMUOZ+v<3T>Q[KGQmlEʉ/#<:Hm?Uiu%?5]RcY |܉myY,tbbC&as/46IAJǽgXU@;c1+ltgElWW**ݥU."`p79,pc~FoOϡSR\ /tHëܛ fP挈DRɍ.ѐ SkϮ?}C\N-n[ 2 V-!WdrBn[UWտ47#qk)&Ѳս.M ~~p=/I}CZ֥KDO, GhUJJfx^)b*"qM$ӻTF/C>~ h} Fo.7k5܅wD; ,㔱,چO,VR T*O"?? ǩ=v%O,Q\A$ nXJFONӥM>O3LҬJHU .ma%@s\ vvge.Y{31u?ev+[޺l6a[ RFсS6Z?=V֗~u<,$FE66xַ6-`1\/$!f]REp$ֲ֬qe- 7rɩ^ fpUBƒDƿsj,Ӽ1ou<:{Y^IlȒA (lX߃"|9x7>xL)Y5pEwm Ypvvמj>!2D1 8KmK[}7Ki^'uJĞ*T:Zv۬^ڸA*YwyעY_A/]Ba6m#K|lw*NI/zt}6A.om4[q$uXc,v ~m_GSU_6B݌6enm0c.@7vEOEo{ۋ1t.pWp%5fǫxrXdKx$$EZ4C@;@]&KXӴ9čg_^fMPܣFrǶAc߆IDMo?5oZm5 "jL7R$*qSk[5e%hF2|9?u};ᯆa}DIrieys(G+*Ab8`@ ޓHu+,/'x*u y( p-nO4R'ǖN4~#g$3[ ~VVps8Y }qumMWD[m͑wud+;cA}_{}8'}[o]է㺶m_-a|Y 02lVLkVZυ4+ifY#}q*JGSX\\RsػAMeVTFEv=w'ᝦ֯o&iR;`ЋiY[to T`[Ϋ%|¾0ӵt][$ m&[nB"bciP3nxW1r{{YY1K e cv {[uY(A}#c\;F|;< P 0%{7KO񷉵];_uTLT8԰\Y]hQ$\ )n# Ia+lQ!ْs^~?|/7]N\$({xnq-‘#ގ`XɩhO v2\E Ic|܍ c*VkZA֖*$GC78݄$rQ}y隍W3Ki~̐\̍$J7{vP4i*65WDܡr۷y\**` ۉo/ƟgC?HhжӶDt(pHB+|A\ipΆh%j\+F5Y Y ܢY@ةiZ1)Q&U8 |?5/K}\|-[$^w 1pc4&auі(-!7hdVyg W$ec =KA.L'aŹnv*ܤ aՆI=՗KwŭGs秈~з˹ 5>E|2Sh7\ K;CGmel cN^UFA! e-6,onvc2@`B /:ʻlK&"4Ə*,*HKfBD$O3Z-dM 6Y'BK`/y'ȬB&v%XP2]+{ }Z XB$Vn*TA]\ic,Q۶f  X8rYL~R~^P~Mqe.o#]ծf2_Gs+qՕʮ0'77KS^[)&n2 d`1,FVý?]Vx?U;xK^DpVF6LɝpQ]? %kz"CKiⰩ5B_ko`Sq \xӔbQW OWgTl~F[ʖCfO@0;>5hR"Zjw)tAI *;+$er7FF П^Xnskq%A3HH< `Hr"R\[K+/O29,̠l5ElΎVγ:]ݶ%L@LQ~Xs 7!r(8mj k+H!$sHcp~GKp<7gRBj쐆M晄 ..܇<+f2z/V_VP浒96#"˺#e8 xiAen_UiŴfKš-gb5Ӷ;wu"1U;Yz7 ƫYHC4R@w,r4IMrr@Ȫ P]Zt;)#BHP)ઑ^fQiX\"%PJI:#5=[=Nձ"c|IA)|짩+ˏ=!6: GdK!X.#_/rĄ0W*y5n7YMKGWq$z Bs-5ɬYk4^C gt+&+GjC[RH{#)ZwkKl}-ۘ |/1!Xt8*[/xF=,n.tB8fkP7BF0A;ICW7vq2nCH͘•$G23Wx8egS7ڎe5}k8]6%Ā+: G3F@*w]6ݭuC犏}su>ȚoA! "hpf =ꏽWi\[o5ݑIKV"T`)TM&M]$b}Ylt6n6nctȋ8PA$VW.. hOs ΝR]2llbBwb|@ZYke6kFDڌ@=Tru&lZ˔^FS 9*;FHAng4}*KM,u d1G0BBOI $ UHҬo`bnc˶G$d3ojR۪҃[$1 ^y2M< S#!|}{Y-@RIe1$" %țijTP.VQB]݈ ]9{D𦽯I$[RRH죘Dq+`%#c*Z4Մ5K@swjh 2dXyBJ0b6FN mj'pz獾xƹxN4uWuDKk$R2*vA _=;0d]#e@lxL߉|SN C7׺:l0Cu!w(n7vF XոQ+7 G?rw>$I8b0I T)ڜ䮒9kK;mѦjc0+\ڙU3\ز|1ձ A\ ۘ\!C#?1F=5{^`VŎ\_avjZl]ͰbwdPcK4#kcǾ?q,7rҤ .I^[UHAg 1Oqn2[$l,D6]I,nːHld)\BTO,yK!  PA${nsOBH vPjN۝V "e!A` K[;nuVpxNXm~i͗HHpvASs  .IWG0|B88˶x|{UO?t ?0pÿ<֜&m@v0x# fޜNvɬ?rc ʖ$灚֍Uλ*|vlPX~iTJ q֘dclc,>#]rmZ#X>ܗ7t =}*{Yw5I&B;1aD.";B+H=@zc6Eh]fm w mڠn/\yolMĉ# 9w`p`y<1+B٢BOCHR1z⹄n6B UpskBhmyh'!qF]^ H,ich@ah*nrSGK^@V'@ 7 CkeK]`KxO84THbܞ[Χs`jԴ@bCn'ݐ3 VWw]?}Ak7Vu:Hh`pGn't+vZ˩,+C [R3QdS m'(wg( @[;*69)d=zsRګI.&;wn{cA'ENW:CMKTfeFTyرf;8+V@/%h-CHTd[r9 tGimgoMs G9n`U$e^:H—†ɍKDWc|=ir60٭<d{f\ _ 6Ao?ap /F&'b+1/a`y}cz&6Ѧ2yq6rqǼJ=PPZ@ѐ싏1@H![1MoMSa7O':jNN\ycӮ%Ԟ+a#y|O*:dW]~ׅ;Nt3-ti2L *Tce.2I&Ip9mNm:b=uƋ3RB` [x=j1;gY_s20xBXml+nN3pOm Ie X1LmЬ- ?pFX3Pwd,B ]P!H ;J̎0I' 223Ch)-UݺHa†IrHQX"ĶJC哐OÒ9硫}ή@eLwخ59am1O*c9h!Y1pJ̻'8jN<Է,$8CFwa͕Q8Z}ݣ( +OU\mo?=G훇Ӯ6I 'ۖwgϧJՃL}p62V?.6!bkYn[&4T"*$&u kIy/N2>j,W[UrbH* +>tRf'++p c~bmژ(c`~D,AK0bv sMk`b,%ed yp*j߮A3;̕TpxeI6ŧH72D1 g=O.I U=va9bߵG[ח\˧@m0>o+n;0.;q)to& 8;*ૂA'tFiվ[ e"kEKʈ6L~ /SZ Ȭ&- (M 6s~)O yTGܮT -gxmmof$[{v cU3]7VԶ[ȓd&Ubk,[r~by 4/ZmOΑ# [0rL]Pt?5A_.%Remb#ۻnO` 6I' p83\@" n |`֪8EO_xy,颂"\-ebQ!]sA}U.കbQ1AAݝT |Չ *#ѵV5$DX#HE|ąڸl\vM8 #mAAh-(< !; ń75/hXb{O"0g&m타+ໟi+ ׀ZE("i>f($a2Uw0۩eKΫb.w;0@z']Mɳ\WR'Z]۽kW}Ru)>!6"#MyUmYl"g 0xo)ŗ.> C pb + œ.fkHR/jI'z5s껟[Z2i7ua;9IHd8y۫krFvH>m^"jq&C@L20W@AS*I^RK B$٘YQ #eP2[}agmˉ/dBVS+M)S}UPp`k(EYLo+T#7sʚ5D` Y74@͂ nɼצ}i{Mr+rnwn+bU;W Qe(Ʈ b /Ìm*Ş`i8۬1@&l9sr;^$򉔧][%$+3sY;\,H`,cK /.OsNԙ;d+qsv$+'j_)9swip1o5SUm;VO6qM;˄ܝ~ ||\++apypqF8Ԛ$g2ERp "e [TB\P[n8i" w`aN 瞙oآJlw>x={WWB=y֢iM4x`c<0fp ;Fqhɣ}&d7NHy 孹GJ+hJ˵1YII,u_Iz-W6$Ys"J$J|9rWzE^ܘmZ/5'f )_+tgR~z]/ÚMuya܂;Hfe A1sըge{>{]>O޶R0T4`Wt8Sv ]h_^?F䛸Tbd+k6l˨VD=;7:VWd3ySL29A'3?e#X!\+w[ͬK +iէy2Ӽ6.9"9e<i!j@3bcsSzާ<֖%$rZFc;_X{9o4k²vUxQ $0M;*Xh[ =WލJȊ(K)r0Pj~'ZvGycsl]ȍVh7;>|c&*[MɡuE7($[pdZ孵KYaM>M\ lL$8/ \ W'ty1Mu>Ӿx85=]7WvJjoaH`h \)Br§OaqkcC,hṸbYo(>?0 amqPѬm&ͼ+a7/zO |D=:׾q[?P}F&W&$J̅YcgRrX,N:#XkXQwFRfXm1+<<ԲPcO~ɢs[鯬$9陉ͼq¿"rpW*>mGR]$RS<˯YoB #9GM`Y|R2E t%+ϲI] c8O-|֭Ju#zA{5ru3"EQΥ NYGo?١_ ,~-]燶",!A2$$#m#-cZu?Pt.b{@ +$RƮ#2ݕeԺO-=.bms0^L|,̱)Lj.Wj&3Nl>*Neoxz{ʹ;,0R4@'}o}-,ys_e|I?%:?{8LrMh(,Gy Hd+%.صIl,Cd˂|v TBZŻ_屯hZ[-)5IoEԱ*2gp(w۸_!76R-m{Cc" Y>0f'nXNS +[/Ԛ x;D(12˹vuO]Q` 6rmy&[pX;^O99MF'fE4 ԫ{j B:)\w;p8uxڼB/rc1#|r)Pňmڔw3yPi+m@!~x^I8XE@0V;PwR1I3:y$4 #r^KpSrXCn+@Q]ŹˢK "r8;21eؐ^ !py84DVज़ Ad[oWcF(W JY-O4feѣYKX"EI d b)`: Aɯe- -nǗFO+y~ZG eF H#ݼ׮Fϧ,\5DV# $EbI8xeM5s?rvz΋|4Z@f"&9 4hDFXy{\7v"ح-"]?g%ԶJKI+qnfXT#bK"QyYIx5X-1|[nAStGQiz&spy~G ) @_S+Eχ]j uy-5 I.s 64r/N#$e091 '9v'46P4,mO-6$ ^ic18{eRd3I"2R0f@!Tǎ U Q.malK$PaVbI (E|-̒d\LY}岹.K\IM VNAs 7vb><5f}Xm4pP7 w`H pGaxZo-6B-ڲ F߽S*:mr˭_ӦoZΩyue&utͦ92Hמtq\2̄xز|J2Qgt ɧ$⵸Kʩv.mPϿ`UĝF ]T]e~IM:CK<4R\WsoBqv> 6]٤W1$|(Y NY JkDh_tXi3ǥ;9_L6 gs Ňs+JI̋ <"ym?X\Y _ELun\ 2xכ|OVҼ 6j\^EڠRѢ"? "ba Ů]Х%4V&+*pűIpQRl_t:crw;cqz'E58CPkn5,mmա{52P8've:Ʒz֫}&LӚ5ծd:/ehޮ ٞmg5 8L6K5¢Ȃ=(Rv NE6MkФZL16b%pk?2iI7}qqPIsJly/:)̞XmITd}yLVrVDR6! 8Ȍ(n =.dk?5O^"-}gF‘]L-"ƐvOXB ۭYv$DH}xh/(et$F*ἧTNFA._5?ٷQ\"#+"PN#jw,;x7ơZv:ZWZѺ(&eNv^$GOVY&e>y0΍q#BRB$=v5]j SV?g)x+YYL|Ivľ Ҿ jΛk,:XhU#C2#p*5v7WD]swi-(ϧ[[`G#E8Gxv$A`3GVS[:xo|jϤ>}6俊c]bGhޒE#Wcjnһ2+OH+9O}CK[k }zˣߔAri,b~ؕ0VLndzSuLB#FbÕ0_p_L֥5>m:K}tZ5͜V9FYIVp kPm6-lmQ,2Z_|.Ѭr(ř1dMXTmr{m=/Kx[{iD$U-#9D~s̪ѕ~WHȓW$J@#C#:ܫaA'~zj7ڎ<_VQ$8 nGl0ރ⏅ƣhViuo}BgK(Ktlnmq1:*H >[g/佁dԤf]V&%ĊTc Jת|IMBZmn|]'+B_"Eq$D6J"sYI^׊ﵝJu->L quyiA YaX.) MɄ*+TڷK.v4S#[]BWӋ+[ -8ݤ4$jͻ;׮cCYpXj}:M2Mq4%^Dcql$q. ,+CBʞliGI4uwᗇ-f䴎ETգెQs3o)XVBjо/bӼ'~ίjzeԵ-M!GUGIp:CO?>0? 3źޙjγYest]-gXgy!W*ǝ 1J4(eR7i-5w/,sM#VFP!vFr[IH*svVvSzy]M:DrʳgP8)! >f<9|8-o"eSP s 9DFk gYMsM币KKE TG]}/ug- wsjhKkr"uv-#rvDXZX')EV֗F ŧ-۠ dW^ Jy94=-Yl]@ZmhH !rͽw(-}2u2BVrv~#4%宮A4N$Pk!rvFiKRi] BS{s`RJ ˆs9@LZug+hm2Ċ_9d<]~++H M #^\DG4nHEѩfqA7 0l)H즚z mQ5ޕ͆H%D(ǒ3cb n붚ka$&7_Nխ,%vT 0nFΡuǧH .ҕHΤ(V~F Kx\xu}+SӅ;LDgx aYT$d80K`ETtώ&<]{K4> ,c{;'cb;khW|q* X&P<}A\%/EଚmAKi8d.cؤpJƵv9o?_ٺr>u$\LnN:_{Z>X#0kXcxh3fRxܤn&A5{+WIne[ؠݥ2.XP ֣mսh'^G.Uݥ0*$@ABkڎem,K,I+ШW>yU< 3k%{Qym:\̕T9R76`)8 7|) u 2="%M/YFvQx$vr႖Qiaqrn!-]Y%iP8e~?sNys4_ Fkq5#cKbU߅te`G7υ $|.ҴPۦq{ 2amZ5ΌG<⺡ XvMS|_u?HoM~d1΅d?m#hf$f(Xۂ/Y$I2 _IڬŎzc֋{yzC^k K-6Iě$pm/pyqN󋝆kaʻ :),*՘YZop~}XIЍX?  yA u˸KÌ# c pČ9b]P&k icg Ѹ03RUr0T0V#PGrZţ,{Ü6Yx#q{ѽYiUw2Ɉl= hUqXC!EKs9z'tȃb*1-ܒI#@<"[*Tg[IdY 2@N6҅խ ҥ#FlYHm33:jKi'"iMyQ[Mq1mpp@C>r"5.w([!Tu ;_Kjgsg&|Mސ;:q ʹꌟ9ʓ_+뗫w19'dt? nm8 69vekİy.IZ:_Џ??Eꟶ~{]֢K(f6Q<%a;,os[݃t[=MȹJT1O.0Y$+3 7A꿱Z7"+[^});YHd&%YK,VL\BujV4Χ/vIJKfZ5̯jqxtcQ:2/t~ϚOhRx돨O1i.L2E"mL'v Mrg f-ge%]P+FMtzݤ:KyF6V w2V1arr;X̞- (c2nP(m/<:$UdZZQ4om-ܱ\u{45dh#+ \b@[p0O1kpGGc%s+mE %e:^z0n]ͶT*ĒtazY#V-<n ēmU cV1rOIyky`i1NK)8䃌2@<✞mveTi yX2:c&dHfYdM${jh_=%X= 8ޭۤ^ Yˑ `0<$d LߚL"̄C"@w$r/N:V0UYR88~XIO̠c>KKg `6gVv<>Q3)*c݆.Ic)̺UY^Y~FfkHp PG10rYnTkfht#\ci\~&zn:ĺb] >m2";b' 9Rqvn\6jzF:ޝsdGy|@+q-]:ZVp. *DqH>//46Y**J8GU}.EZW˛1eH(+as@ #'I:lXZodwln u;(VQiFQcUOB-V=Iuo%\|]ClUۓ'OaytCQHKe2' "AR8㍹g9Q|&pX΍]$VT:O"H9%@'^HNJ孄o0,.F6 rrr0Hu_Fy>=)ltOE L >ld]0O1{}&->fH#0HFS&wG1:c:{dP8ctb[v6dH]U=M]Yۆex6HlQg^өRit=GDƜov%ykh"v#2m##r1v6^UhF)"2mݵm9UWeM,J&'DF%`yޥr@8st[$,JW*QJE ة :tF{ƗoLvx84˹X ۱$jMgL5 TlMbZ / sݗ62$MĈ(a#v2r =CxNN SyJ1#nkTޱTt;-~0]zҶ]rqo5/ 2 aA$y.jҴ>MQm4<-B >DH[z&`8if8]ѐmF0rerL5 6vOPT'g0]'Ԁ3Eu8q#-BI4%v2lj&+Us:Atc,KE3r[ˎAqvN{6HJn1)]CMj F\2pk[楴#h'89cէ-F&[t;iBB6u$L]NmDbIb 1# p j)lr"oi 7f(`K+7A)ݐ|BIq*0N6<5nU%7lnAdGo,dK#c(` ̸8'.xWZՑFwYOk(`Y~U-9Qs[j[P̢`|A݅ݐqkg c>zw?dP#;7 0:{p_̗vGgڤe\~˒6ۯc?Y|+Tvq\X *'P+;FGCu#QW'pr1Sr~w d/ȧ  ,듑L wjm{rskHb 3х"<ɉ2(#8$[PbpЋo )THlp9JA Dnنn[@$qTjZIB;1rA+3p}oUEPF قrK8)ܶ㡎/1nYcH$`U2F9xힰq#ΰ|߸BN$`gkF]Byf Uo,@ Owxg.i+61!UڊsKqZkHPi|ѨXT1`b I.ǍbG`eIPos;׮1izF6DnNr gWbn^K $;/U;(#A4 [)KA3)_bNp2pǢuIfoD {;fMQS|KЊCBq*͔#a$#]]MYeqp2(c3&9'x n#< $|gidS\s[yd_2܂6?xrqAN)YlaQTem !@ #5n5=N{ˋ[ahh"r ~.FA:ȪWvC7ܩ-'r .;+("A䗑 .W^An3[Ԃrw+C?73]M OsjrL`>NRФ88DM: fmq!Hh?6>@,ZDKJqWi$5شO2XCFD|9$h"BVa KANx0K .b(Y ΡYsG#>+O+c9`[zp'oأslY?*TZmGTv `jtdVYby\/ƛhd $Xc^mPl Hbv|z jr+ F8;@:{uё5wqBL1}E%@dVlSZ(tI!*v7!$n F4&n"($GrvdrxVGfHѥo3m{ gTPdeLfW+BZuDGm3d&0Y`@ np-5ͧ$PyF"8Iw('5U`mCPghO0brF<qy`qWMa ǑxqRC;@):dYFi6b^ߡ%2(`s"(g%HQsie]Z)\+u9zݮsV7IQ+Hp7 bjcm;ʖ,0s*yg?( vۑVu6y 5h&XR8|e ʬklCl2EQ ˩~'+W&؄eLTƒ(tPrˌqNN+Xas@AF ̘9^1swq`.-EP#ABfBM*,4 2 ޙ1ZiVo8- HY)2"(!INt,;6Ut{UI\ C2[zu9YTR|2eY$d9"JGysD33ru#b=$9LUYdO'$V^">hq3pȠ=IW\$btZdqƖq80] /2HRrQsҬdFh=HFB@t\]7A\ωtVn]̻r'˸8S#x.1JiG4jʡԞsȭVNqHv2[nm>\2!.P[ba@|u{ !,L_( &Ŝ2ɔăyt0Qmq"4~^Ai&!ô+` n {>ߊ?е6LQ,ʬg}IZ6ܧjjs-ڮhV.I+LS`rY=>,i~$ilFepӻțF́e>@=TOxU,브:.%͸ݿtG`'ڡ|V>>:dž-%/Est { ƱVXٱm"Tujn&KH i#m )lHЫf*U#5bK+[1؂O-lb4X`@ϖI#<#$ҡ$y&e[!YE^ ~fL V>V.ۈ 7+k^YL]_Id`А1 A)(Y^`@hP-3pyq醥~ І)\̏B@pEE{KOSI Qz/[PVkɷJ|47+^o4MPiMXHDua Oә$eE+xٺEԯeIͶZ]GvӶˊ)XnE~ ƚ]o>u!m5tGP]74-R+VSԧF<~5MniLh7mƐn>&8 "T.k{YZUشmX Bbi%EW{Zkz-#SP"Xu˽Yk4|EGMrU cÿ 4Z]q?ِ6Vʷ39Cr&2B0Dp=/ZQ%dp^=x(Zq_(EmtT9ʁe]ı>98x?Komq.֓5غ2WsclT#Kqq ^|JU#(N̳?z6K+6ekx^VeHTtK0UU?&ܗ'p.I(1Ҋ>v\ui:~M0jH Y-1[4 7 A vFA8/׵ ]=tmJ=Jh4D<*c"bXA>)nubTDRFVb@ԀXG ;ktdIYbbIg;O#ve>T|/3J}[%-[o"ɃU9TY@հ|Mat]#eaȌw.̓k:47~^F]VBsBHf':k3T/˥C*a qOL1K>~yt}voH O}9t\C",ʓހ[=* |tơ &C,0F$y9$8V7 x`YX;`G:(O\z66-fӳLR LvK0d;MXlCg6 3&y&o:l"a$+Rd}ާ>mw҆wf 1QZͩZR]ԁX#Jcw<鵹,Z!qp<10݊RX7SHÖy+ڭ̏o0gͺS>rQ0q^93M"eIP-<)"1W?gmg +IcZqn}{|g>%B$K:>RFcgbE1Ԁ@ ]Je|O$ 6ֵ_ijqԻF,XLaNyXgԡ9tVQz+fL x3-n4]f2vKyأbJBVfHVi& \ɓI$ yoұլ@(ѼM[āp۲5xvMkH%[{P XVTm1e$K4bY#*I0CEctꏅ*φ-N[R&%iOpnY$+\i'a M;_^?A}<aƖKwmsmo3;]`[y% H#oݩ Y^4𦃪h֗SrF{-ͼְ+* <Ғ;j&g> ;)x*WyUZyk%Aao$.#s˹,կ,j+yfg_ &ZQm#"LZώJ&y il|t{8䃄ܭ:v2vCўv;͢W?">%|(Yڞ:DqƗp|B#"(fZT_%6,sĻVK1;yGW? GiæHg 7myQ6B"2גOෳCI1)TQ;Hӧzd^>NZE\96 H8$ovsεbBMٹ I=x8 KcyE~S;zWANddaH~jy^6lYmK 2Ǖ>c9 st_E5*4yRC . ]d5SP/٤hv0l&z >}>cM[z "#ۙHY#8t6삧vCԮJv; x=Ĉfp[PHM >Xl#YbB0X %IN#W6H46CH7a^`Xm;2y TUt'ߎ+m4KTԆLkx֛:[{^4 J'w(ߋ- Hmf ㈨2yVIAQ!_s( w,5{g)Ez6ڄ3_[Z ѭ%+\R%>XRrlk6|ARm\iLJuimDO69&byh` p|Af)ɨ4;}'^!lGR^xjeY.vEB$<3DJn[{=Y{TfhEãƌ0 xlC?ȵHE&*1ۉz` nXk7Z$u-mRME#k;HO?0%KJ󐻀-דiV,Kkxpl͔iW|_g+WcTz/Hӵi-"}O&. ChƠu7Wp|&#xv8VQ0ded(BH%C o(}xW?_L6ֵ13 mdh,n Zz-{ki~5M*9 ymdDHVdp1a+-o,MՏ3rq}6w~j"P{{먧^ڬ^Dv6 ʪ,0o{2AԄEr%O|9T !;kw1{3S}iĖVCBDMqt۟OuH(mdǑVX"By'k9hbK36qoabN>*Va u'h" "ݒT\u¿]_jkM .Rp1ʸ Ae?En/>m*]B,m$oY@ڬ;h#GilS9- H %vc%LT5,RSgۤ Eu:N9BO6*Ȍ0Q>Z[tSiwkže,018c%0w. #?<cTK>52ج}E!(5&hp gĽOlt}OS: 2-dHYmTȒ.ne4KeEiEn%&a5#K!CC,AIzW\\I>ox/%+J!(щ#@ʕLoM3ysIΝ/lRhnXJ m@?K/g%/v `me[M[Oݲ7d Td<*1iSw<JҢhs,\B@fȪ\_i>m Km9mF-^Vh#wiI " XKђK.[;a6,|Ap6hshӶxKzjOd31xN݅B#ER6%ñn/! ;̒H|8NHgݿjZ91iш67M`ֲ8 񝼫T]˨5>-*91Ȯ6s0eh$lb ,Ye={uw-oėWRC1$RP挕 A8aK]oxD_m1eմ/ڽJ|)hLy-G˕mhWڷ4wmcI-ݒ4]9A 7۶7W\KtϱIyl3;G%^Kdl4XY*@%:\2-3~)rFy0O-ԣBXS̎n2X9;.-#i粷O%'pDk+2&kyʣ4X=%ռlX[(#bRMi6 }A4-'eܑ `us/i:H.MEˁ#}BC+,{yRC)BؿC-[@fW-'b0̭Kpqoouбۮ䍋##ʊ2K0 *Wx[⯈w+uf}͍塹a*&G| ^|OU4x4{kMMshIA r,63OԛQӎw~݇cd b70}bc61iͧ>م]nĩe7A\YH,+œiq^O3v.۱f8=h5]t[-$H[ڪVXpW̘ Up2+84{SNɮx^t"-^"'pR`ooqKQVdZ9 \g,nN73kmnaӴ(feCddB`øTٻq<Xɫzҡ9WvAASyU@\hcW}|R1Z$F\i53Fլó)cha[=9dkEq*YcTNDToJh͒d1L%C1ϱ}̤x$Vo+m/'qTD;uTmlWRQr05zRj,SZjyQfbTʠ)`rAAU =ơ<˲?6ielNΘ [Lӛ\O iD5ٚI#d W7xV YQk2=X*͍ Ñj-2~j._d/r]D22<+*<2rD?.,gἑѥ,maF}?Ԝd'u;}Jmtdy\Tc]l+*T-#;tWw%B1`"ֱɻ6o&rk{io1gumvvl;ka}wnrN^w™S>vW9,4Im .{\Kikb ER+PX 9$yB=2U_I<Ѫ,M"DIL~S\609)k[[BgRtG#ɽXW0ܻ +CΆc&o1 &3q1[P[\iS_셝F̪ǃarQ #$jCj6ԀQ(Y]Pc;Ah8ec]/6y̮4H]prϓp#4h>#}V&iobU dFm #ֺm:|UFxvV:ڭ4k-̑ VH qFYU{[^w_#M"MnK7f-14Ѣ#; IBay!8!(%sn .  ot qC&%kA\n \Égcg8TA)/,@۴/ jhc=5*݋m.%t/Dbaf瓹GO`j{${O1 -l|l.9;^ ,mA#fK:.W,FHamz;+ & 7z+`we2+ 3RܹqsK{$sFviO\kku=m^+Gqr/'k:o%Bd_Ԯ v3F63 kO[BA {yBdPr)'n;10}%%N( #\Fx#f}~T{o6X1K Jn]33M@ۿUќ3OsJ. zg5av'pרG ?錜 8Ef]l;XHF2#/pnݐHpH&`hB28#7#s ^:i.Cha[xr sa듌ۧ*Gl+|'Rv`v=dnfX ʞ9?e*mA޲I]dx]G ]zX Bo# ӼqnrGnbIߐWssq-by:a8*ۊ|H`E)6#\dgkNSh;4pyS3P; |ɕ:1k<.Ie8`>nXO8XFgVr e$ @t0K$uS%;Av8Q 1.iZ&tG&6|;$`[0HWHS$T[ԩ*;Cc@ku9 ~br2YR3[y- Z' rsŒtp9օSzz,ه$_F6YxBH ->d/LR̋97n=qYG@r9Nr29z}ќVi2"g#[ zS,3yrĨc .9GXe&2UFeHdG˼`@ s5B#\"\坁;q]ViWAy -PUB˼8k*V=srGӑ#;dEW!WP8e͂:sN4wzn٭јqP,̱{kRF[|W)O`{cMCA sȪYrvR/Q#y*ţ١f1t[k{-NG,A'`9p^q8fUd,{ۀKpx?1CoOѐ[Ihnf`"HUa ^t]lwp1Giݒ=s1 tym"iLvDmxA d*oFqP+1*N nPpݴz-aM,3?$Q>NHǸ66OeU"EvX|k7X <_&iNUb./}@R?"t坷NR{{Xmp&uJo 7ȧ$n]fgxi.!TYf ] N1VB+(u9-j|5#(vWU˙Qod3 x 2m [IofHt)[_na9&+$' 4 mAq;}!䵕gBI;@VpG#c*t%s3β: 6 =)J3zmSKYV@,#l޼WIบeDXYfH"nf'kFy8@&Rq *u:B\q8RAQ@'GTSkDyՖ4a'FTlaLH9bIQqtVKAs:Um9WZ\l>Ҳ[G")l3%fvlm Cڕԭp|Ǝ3#Kla-&C*7y8p<=E3,&[y.vHrer8kOϳӱvdȧo`+ ,sgnffZYIrC`|SpOZyk_[A2)11F -J#wl atrL[*[n#眎+ YeUs1wYL;YY-FzŬh^VBYr6('cp bT؉V1s"ۼj y [|p{"G ]w3jBu"O4*aFC3cr͓a]_Ď"61kv nFsZQp<̟0e%Õ$kSEhaEGWBF?q:8 ~,W%DRE_%͖@^8=zaH͘FfthWQmV#qV/u _B$;2~Jl w6Q!xwBp )8sZUc)Kcn/+`jb8#qH YɪFH5UHAΣU26yx'$u\Չ~*PX!tm*I zWUОvv:jJnc7gK7@Qʓ?.۹bmØJulHpxXmQʇqSfB0ɜ<$Hp$#އ^T5gn]4QV%¨>dFqpH)52`\ : Oor3׃k+nK7ePqy8<}j/XAecv=3'Cte" ⵋ!QНАFz؃V;}l"" Xs'^e# $q!!@ylʲX JpPNH x-ԺKc-˒2JIc ڪp~a&˸Vb#:C0u8==<|AIq!ݽ W '9DѨtOX#'\ Ms$>IU-&IQ2F~nO$/y-ڬqKI)m)d{ɬ$M*UXƟ p3p80q c y$I9Fqus==>Ѽ._sgx9qw+#KI%aF!K"N+:v̏m-@!! *=;Z)A*2mt\m-JvCë;Dy,ooo d` S_7(;l7+ؚ#%Yqj E' q1q3Js"Itb6 ڧF2Eh[U'-<$ldā6+1r9F6g#[%p?0'v^kQZ[CfRO |w̬(_8}O+)S,pU<sU~錸*q2O罃HA6r)v5x㕠TI8 95+$ ELߖ$dmLJoCA: "M0$a_::ae:dSym6؈ۃHRx1d[(Mg)s;giW-2]LUhm<~ܟPaiwxk3*jw0Os/ʑ\8 )EvJW_hֱ#Fc GfhQ.u9-l [x6f\DDP+qp+qUϥtCKƩ{+o!b wEmsWn4z'X][[G#G$q `[E5-;f:/mxGVfW!RA.@f_ KBO:Pdtox8ށ>v ]%q6W?\>)kܖWPΆmVS?#GPƧ3זPj2[o<[ }ɯg7oQX6d !nv =ʒV8n$vYUvT m^RC{r;kRH `"15Ux3%*>N |['$N"۹03*~l6 pN03«4Sv4^{6dTUآm}3P#ѓV9˘c*AyqI'$DZTIy@TVm!FO,nR(K6!Av't{{g8X}[Jm f"G8'sy&[.#3$Icq9<'X7!wSzU `Kur <@& i'r'\JgݞpTes'VQr]jy) F]$|`g8 瓁ԺV!ao*PC26w aG͆$\#y'&ed7 34&{n݌ bRU[d%{Ws_T{Ve iʱz.ݧiA}GP7f V$یHF]éW6s0vEl6ݎ0ҽP9gdyM 7dxbY7$*焕4>䌓jL -(DZ2l8C>y+Imd̑Ü3|1$#XcaϣID0L-Ln?0-d|\ -ݟ7D6їl}֥t|d@#Xlwn>b#8'VEGoI{+HR0\)ٖ=Jm9==ݮmeV)9B8.?izTZ5ˁ+5ȏ6@*@O{m>D1DDj#eQ.ؠH%A,⼲ZKVG, <0WJ.,dU| A`A&&0HK:M 䎊K|ڿ,Aq;;>Ї+x[-3St'x&Kɝ-Cĩ1\, AݻjAn'io;2̋v 28O1IDPN'n (Nn$KSϩcye!5fѯl,-7RHye8Y-c#|y w~V_krY.jq'E[]R%ːᇗϭ;h#CI,#H)S+z&Alm;WYwװw&%j;⹺G k+RrFKdrX;m!$-O<]xgTE$`[}큓l icF0Y_EUơ>m6Amt[XEb1;J7s(BlQ۸#okR.is"-;DeI>t5OR\E|*Ie ,( ;Pftʥ=^ǒxQ2`h#j7$"(W]fZ]jl*ŧ[YSu( 2r 93Ğ*OsC{c!k{4e`33H,n6l^a}>ig=Ex7PZY'\Tf6#n`co, WS燋V>2׼si$I~.!hmڧJ~ ۽61U11ٶ+6cŸžpQMϗ :Fc(ff / 66^qKP9{i T.cXL$&>l8ezy4<IkgedM*q9Q1A' 0;z4zTzRK,^[FRic_/nNL|6~br9*w]Z\䘭 a \2(| g'#tVJ̒Dnh#m ;@s$|۹h!YQq3*۰gq۞Vܔ{deyn젮s)#mZڨvzI`ʻ]C6yܹ m֢=i!Ioo aIʹ?kiY"M)uxqgˑKV.+'txRҵ[-K-9|h㼲Yhy{̡\7(6soeϏgѭ/lo.ͮ6+Z adlFUXZ4.[]I$mf2͟3u2eVq,Wwge^n E1(C|!2KGeJ>*Rľ<% jPxOKȼ[]1}-6!6,,np~_ ]6R̺ܐ"EYUʱ~\FFUwsfd}˖?(d̑0m|sxw_WO[Ybծwެ;K"  °l9U!%R%iaLge+ swct}rM7Q_ymu(Y eJY-fYjwp?L%ٻ1x cށhVCvfF]'LM^\qIqܪFr~YpkIlmki-u[Sp\I, +E PpXr_jCIeKA40jdK *rŻ}b/^+Qkd'&yB%x}G#GĭcԷo彶Ԭ.$ж׶-\b_剎Ӗd%'/mIkjKKkfkcD*hO+OmZxG $K7wU-˓J;#|9oxzmQ4GXjMԋ.muW RpUAWl;/ +6&h>oOyؽ.q-;aaja6i-zwz7~+{.b%:v--amnRʒ"R@)KWy്k&D$ PGUIIz ΋}n"Hsy7v34rǺ@dp:Iigww[e-6^*H)D& |{rdNͶjS^>:|5u\7 -4QHv1qc^V->msP$y@F+ զHnqHĞ=NJ<V:Z>o b+I.-ZKXHvCY+|z6Zzkyl+*gvTd?(I'~k[Ь& R^IWw"VjEbm,W,L;.]`Bf1 ~-mdû{E/ۍ>ɼu&i#Td*噰3my.nPFH(ɉn PIU 60?4 ?Н_VFYnlYe?,˕USqI]֍5T}!gxԠ,^|+fe*Qиk#R{umVH謎!(eyd#'h0@9+RY6n="ՙ5\K*ȷHvONKd z//ࠒJw7O_ɧVV [Ϛ>Ÿ2W` :u[x4O 7767O&$Vd_x?®OCx%]N4WSH9fA`HNWƫmcWR [=me*0O8T5wEe|Ӥ%2DnB( pcI}](K*odx )(9^᧎<Ox Hu q/9tI qW+]vOAJN1mFy  m3C*C! Aw)\.|nDna&փң6ܶ#I3(,m}gnf<ȰN0;X`v_ |9<;_j-!lAF6[%3#zFTZf+7yn˫u@?. mI0)REdMl\Wy  RF5+[k+!a[V;rP1U$H?Z\"\J- ;I-VĹp'f.=!;s33Ι).$ٹ)+y$MM+Iu֓"U'tt[;Rj>n K;=w^ݿH1ePy$ї-+v1 oivZO^l44O++HU&1υ~)Ѽ'KBgHnl,WoK JW)]umxP]i1r1aos-r )<;qh(f/l#!bb;f.IRmJvJr+YxwwzEֶAVs%݁;d2I @""䚬?6PKx)]b"pԷI%>AE^ěH.䓆\]~μ>y,ןoRG+'Dt|ɜ*246)`ҵ4q<;]\,Nmf@΄,N6䜙{y%ֺ*6אKfDDu$."Y67mާEnt{f#AGE#X %vzS>+tdm+nZxf+*[ q*p~W3Ydt_+ill0I,0[{RMοŔ.qZZzM%տ ws顖DJFB@NH ܝǟ?mԬG0rerpAoˤ}9nGy T[30xhW~K mJXrOxAwk:v%ׄqe#FgӮjդ+YK JF$02M|e[+[MR?)+`,pp ݄8bHGKuEɂr *'=u՞sַMhZT s mŴHwBvyA\ar^G O#1h}pFRX " Fܜ`pҺ[ BeP[X ''s=+mfa2Xb #׌ "b!S&FOc~$;c*_a(cԻrOp3̕sc6L r<TGa@j/30 8zI c9r!O7PJKÎ#inͻwN9{˻7`EHC1v?2G{h<ѫvS|/aL|.\rHLwsC"#X\eI|s@<\H ROB:TN@3TAhhZ IIn pF=@פkYO y.8ì6Nѻ:#8&2Nb8,g;p2#rShגZ34猋&;wDr), QI_II<PamѴR9'bɶ,~c>CgLfGsOcuc.VyLm#yq')EQa1҅>FuʐC4"8 63\>kӡ>$ zS]9>L㴏+"ln⑻ 1 7/[ƭFPd>a9(O|Yil&烳G)iM,) agK&`~v;K7Ȇh/$*%:o%Lo!/[iHϖY*2Xi$z*<cD\l1b?!3 `* 3٥Q %!͹ea,el'`0@7ڮ$ȌU#`qC򟻓# *֛6 [ +4kx&xXOMCH.٣飶 ` (Xmw'h;[."#x\2-#H1 !UB75 nM"(E&9Swxr115ݕV˶%b0z<~nٜeƀ[A~kLx|hYBz+)"8avO21en㷜q[Y|\*Grst&y4VFyX٦. ęHFr >j{ ʨ3, AORhߓCF.CJSs9Fcԅ]Fd‚&W 9= EԒ9|;z׌msTM N]~l9H#zzT8cAo3v23JÆ'>SN*$XERAb$e3F#& qhe(dO1ÕI܃OL.++`giƻKS%! Hîr˱[0pAGoiY"|b&;v<9 9;/.fmdnGE'nAՈ/,."3l g98jvv=RisYʩr SdS0*玾wo0F_͹ Z3&C+#`s8uڙdc>fA;m."L2.)EA܅+.$Q33jǸɣ£t2"y|nF'$u\ bhT ÑpH9 <^oaC,e'1#,Nᒧh Aɺ[h&,;2`r coSMmt4XEIRfUF0d*GqԂk*5("Cmi %N]m/|2.6ǹ !D6q[S]i{YeKՀp7 9Q'/Gjwv}m a汚]Ut"m2Dʒv2;XX4O|7XuΣpltUeu6$ps(#b1y7˝Kn;$V\\ IkFXrF;7{v/}yyAmggg 73<؊e4yd(?3<ߺRE-ӵ7{[iE\UE>kwRN_~Yiw6!iƵL*Vi;Jgh32 53so[|:o@үt/QkY) !Y#WAW!w?-p;|1UWΰ~#ΐ]ųG4KfDX(fG_*zeŵ"DhYT >W}Т#^FZW$1\YEjo% /U$ l*;Ewah5kυݓrS|as.A!f-A5W^;#uekE3 Upd.2pR?/?Ꚙ]K8d%K'~VG5 /uƺ[}NIloeA+6l;3 eOs FV> ͛j1 (N0: 5'yXD̢;$L ( 7+5K=KKm#Ͱ;q1m.6wd14\eKZ8Urg/ 9 Tn n?9ksE$0#S1`U%g9`9ۿ (VV$P .8aE}NR7哖BVQ5Kp9l?U%XK iLЁRV9 0-k!kF3%]MX!>Bȭ!8'jz-(6^%*-aB}I=QNwQh Wy(y\^#s5ۥMBNޫtt5bbAs84g-ys@zsqYq}hLr*94h$fO d;U DM%p o'8#%i,!d Ӄ幕bIt@FR۰H:O%Z\I#HWܖNz\r\济=f>4Qc)m7$7`m8ܲk{LrBo|YBqoɶd8=@ Fm>?!w81,F8X:i,EsjP6^gY :pv^qi(HŷP7$[=s^'/y&HlW(sa8q`HΐG,NBгec;8Uz3ԡ@ZRH*Y2za$UVmw 1n:)vՌrnL7NcJ,k&(᳟ATV Xӯ-٤i#P_x?!06uBKެPa&TbJ#@r>s;=*\\E,qU 82*瑴sDŽqvy[pב7'p`3QȻAj [K&X,FX0mG#+#FL1JKiŪ$4 !M呉Ro:4t_6[]aݔ.p&v_ N >-io!M;8ӄ>rFijn-mHpʋF b7W8tBᘴՏmx-nLr^6BeSjtVl CXgye˒7 #(G`nFźtIn T u:gZ| H%oTݐJ)$[{he4%Y粶cq1Ԯ.Uw+;ݍ$8xf9Z6.!vf Kpm7Gƺ4VrwvcU8RzG8jw%kan5Co+>). m+\6c#"Xn5G:ǏfMq/fQ dI*3l$mFhUDv`Dh9*'9>I&Q4MdrQ 'nSvw }Z{\nǜI#mܕbaS?rGS{gu3 C:j$ `?{ @a,.#Td.ϴy!UD'8 85Zm{s.Q!|ˀB˵G$dzWkrZ#)P 8cꝔ*Guq+,kЂ"ޫ@E!f#_Hx/~Z]ŦH.lд(221(?9to]Am2C"X(pGUENU--|zmWYDD܆߆1 џK0?M4+=/Ui7qI:$<)"Jrr2>o6м_ZiZӯ_kpۢ'w/:g(nBAA91Kn *E]78࿏^%多YYkiGsx8H ,v?m{|;BJC]|=B}-d&"x岞U.I_PuWgZ7bQHPSK-U!!gRl@ySaOB]pq4F=X\ݼe6lм'w+E{:xƾ  Ni,xdHsi% !%]o9kEC%mu-*K۽gQ\ƓE2 6rO4R s:ݷuӠw6$Ha ,AV~xSKs>E$M8?ps/6sPI]6wx~{h$Q3j ƒ3۪ygU9mcrkOSŖ~}R-Adc$/<ٞ6VHvy0Yq-=cš灵_E3 Ms^Ma{gfrae n`@L€1_5Z}cW׭$\X0d2)-厍5zֱ7?o㵴o#ϲG F]Y7fJ ˭Ϥoᴄx.T2&AŚX`HZ*Lkv#pgt5䳻$w 7[lǙ|oAyޖ*wiO|B$N;NeQ>-X:LB9%lw)^Y4HOMqk<ʲ<{]~+Z)u(2iH-$*HayDtCqe.zvV6s_)"/h.5W !rC 浮<_=CSi#ͮ,bb Đ'$!NOm?j?u{Bǝzm--'U+ެeڼ7/.wpMfN:}=CMI+čn U|0OEZmRև.Wt[Y۱_薗O51[iy$hʇh Yq+(D`cYk&sW彸igr\`U#&ebbk Il$٣ 2FI*ťb3x)U`ɥٵכBKn(#*llNz:ſ!|RP. iK9v+݅UU \ֳ( h}yhoOjy?8`ѴNQ#V6 {{7*3,Q%Gs}o|7%KYyWƾ׬cGuXuLS;ȯY_1jiU*wۻӫݯ߱=GxBhl[mKO'xf  fĐOW7sis&)fx1D9_t< +%Y_ҺIh1m٢/ d)q xRIKNֳ%_07q˴aZ;ZTғV6>xK*񍯆CMሤԼȵKx[RQž*{t )RNxwz)BHыKVOp%;32FUNzٌ^#U &BLx^-,Y$1/ou}Bxa2o$Y%aU`XgVV٫=_k\y#-- }KCtAvO.=mZ/"$dwph2#A ucq ۍ;L6ҙu{ /k*1GPctE%$^8۝B% ԉR,K*⑀2HS~m+V2֦cMefy(՘1D4.*R@j>(u++xnhcœ=ؐd74Z[t^9-{fad$/ ]G6%0Iڲ+`K?\hwY\$;A{K.0# rE:3uv { =5t`w䢴{71dd/<xy#UKMz kF\Z4CFVV#)fY.-UťWap'%;=#\隷3;-$oNX6&F =sw%Ӻ :VH!u$]0W[7g sC_SY|Ekk.sܮ[#R1@1FCJ*0C9+]KSѹRz(>mGd1 Q Աj6";mZyd{HBكQs㜱:CNH UDyk壢 -z|.:\bWhf.渷V)QU-T$6p`)%_YʪDU ]W Vedc9n"fSGerZSg-@0"YU$b88PGn3D}Gmqy+,Vq8<#V2/gPCv+\|mAc4|FFV[[dG#:e- #vNӁZw:RQib0{l>@l0 9UPS[G,?.7KSn B0Sc2cke LGvUD음zi&dcs&XP X.@wr}<|'A+@xě@d]rj_H44׭->kYQ?8>UTk;zrkto_ JB.>vwU-dfk|G,2XGJ1!3|Qk4;I{jpBjY'P&aF6p 8QރAi:UO DYRpѮ܍R.CQ0K9| w ʍwg A&Ytb &ncXD 7,( ĜƤ"l ErMh|6apb> xP~a_!EO`g]ѳ#/ 6BXWtqkFta,- I_m{ZjS̑\_[=SXJRHdYcB~C+3?hطO_E{X085zEyj#ncv1ZTTرMy>`C+F3[9񷈼uZ/YMφIe0mPUY٘t1jI//!nt3 *d$֏('wwSEŔ:ClX$H1:(ÜQp7T&`DA$[ۂ ޤ||Nv5[GV/ysIB l{N兖 K48^Un1u (9Z)_1`VKt22'HIK?PX3`EݔS*$7$Uect{T<p SlLgN*.MĀ<Oa]+V>w xmyUAnT 3<`tc_fq$u#bJ;_qqU!Vm+3y-ZVHFw猜c'ym=vF9wѤ}1 3$Zȏ=:;l?F$0N(HaOpJ-ľkmpY= `צdIc/)XUIc{Tq9[C 3s"P19:si(Ef`m$~~jVhDeRFᘯ\Nk_ ,p9d khK7d<<KI#pC)2 =R~8AGS7Ah#-DfV@&NW88Zkxa(JV3. mP'=z~-^Cm2i%YP $nnr)_L6Il`2#V¡$}q[DJ ^(fQӄ'zxK g'0jD#7J+7teˡBK`q2+ji#DDJPJm@8UFE bI$KgeWZۊcVkLyY@UžfC dff`]6z 4h|^|e9KR38ЭbLVxKMv@kFv\XPRlauD!H)BH< [QXE&bxq{p.@ɷ@GcPY66/)m'$(l&q9?Ҍq *vDn;$gėc(.>2ߥwV>xm(v%8osOnK<C*.ȸGw*10vᰲj%ZPVo#Eǘp Ɨ4nfTd*6&ٗhM DŤv%hh-.tĄV  8$NIw[.̺yrA a ՙgqڹ\ 5*۩Zk եg{5TXLATf`_[Xܲ g. #?.z | xB9 (*U$u8䓏5w'4GzG%VФxiXIUR'$lZjzes+[]~-U߹)ݕŔ6nk{Kfvc`tlA$+"x-/SG`0*BB܌9&AcKYmeIw:Hyw2e`)] NPx,>*wU扭O4gy+7hH[IRD[xR*XAc;]\`h9€ `g`s^i-ͼzN#Ȃ Hᣈ>dKhT\)OPQVA ڱE?3pH ʒ@+!3˞Kco[wiH4ﰢ%q+1-*`!pqX—CRiZ5n -̩V(3cO>QfjWMݤƈ1;ǙRT0+ P҄*]0@8m T֍moV8f0x?/ˌlw98θV;bn4M$1ʀ9x dsQ2Ȫ}"|30:YGM.H8q\oxWv2{fq2'<3FXq1nsI.wh/$ \@;f'K+DL3.'gU{*-E]؜'d̝aC"6lp dar0m R)T'd[GjdܮC8'!+4kH۫*嶹S >^EOa_TY>go9uAg] m[HxEPT2C¨Kpns;}ǏÁ߮(E牮Q )I *9#=jѵTV -c?s3̣P  PH ya=@aT~EYB3⤏CB\S3Lc,v>nŖ,bqB>EsHgw)kfe[Yhs2TչI9Q]^D-㍐~DB[ob dc8@tCJӵ4ba/<$r\n.vͺG8lR} 39ǰb\`5=zXkk{Ѵ`/nca tajai4۶̻T.H8Rx3+ $[ >/r@jH1sBߙbUC)Ձ$dt4u,/x8٤4AJ;bBKmH9yHcY&A ¡PN1ʎ9#}wik]}8 4$AOC>R+bw`u]2'}nФ3ZAFVmY.&ؒKc={M^Y3)T2 &Wq~Oh­8~Tdȁypr;fqid6F(P>BːYx+83t&쥱3ëقmm30 ㍼+~贸KR?y$x `=AX.~x{GZi$M *mQm01_-u #Hi&H$f71NyI9Sԧ-+-Oɫ\ElЬ3$jS#}##-EjfʑHpNߔf8c~|3˴:Uydho-D20VQ!i l#1#wp)kH>(x0[$Rk[^(㾷4a4Dv,08I#<[h"+!i 8C!r fS|A^˧Ԧ H:Db ˈn%+EVR:WƟ zD+M6xvIm)-wErͰA(C3؎~\I68,ȒLC gTo+nlU( 7 rHL~Q~Xn:qJ8ubU{#.Ѣw9mwyO|1+n':YI-1tB27t_0(,r\ڛ N]Aw mXn (#8bm,Kl'`Rǩi`h< M#NlK=jk]B-$ [nbFKɰ XSkItvm&N#?7d|jH$g$sԓǺ]ռq76 Bnm̿.fH ~K-F35jŮB'&Mi88;{~Ξ7j^8[#`E=tģ\ N18GF#,DS|5]Zs;="W)-[8 bpJ10 q1Cژa,"b.wY 9'^èeY Yô9a'̍don)}ed#͒ v2r  LԼ>IQ=bq^b06LN*o1e\tKer9s𷆭uimYt6hFcYw+TpI<ޟby,1Q7eryj'?ԁ tykbJYH7,f\-KGQ2Ic'cT6Zkn#FxİϐyۂB<>i`?5& u2 bfpI+rxj>z|+[)ƒ9Q/&Etk^溱uK]ms-vx|\dW s,]gR)ie|6=UhC\n`6,S5x[a g9Ҽ s}OlM͈]t[mՏ;ە;`']+-"owE̐P\XmT#j4=/ǚZӵMwy>YЕy̑tYKvMFl;k]#Hbk9K/..q)m$$BBơTJdXnv¦R;ky$9Vk ^'gZ,@#RrX۟ "X -yΩs$DڎP+D[Xm%ZVDUY ƺ%j.-tմ% ە,'HE H8W՛}e%ν/]a;kK[[K2%H, N X4O>-+]B)dfsujc,07`6T)#exGÚl@m͔Ee{}&ձ"*+U5ƥ[FD!̛W,[&$Xlҭ+ xL4Eo#1_/r7 .ƳıwPxmChכ+2ɊLރ li7G?o[y#$V!X]ٿIPpºKW&ioh]ΎVy q*X8߿g;Cg=D0<>:<׺|8G<I^D2R"PqR=χj3|m/,cn?i*KM񼍃n\Ңu:vf[\:Α!@j~ [o^]Z++[uR br+}[p~fxwJ[]ϑ5ݾ< 4˘o ,6,S_ I5?% $[`$kAR5V`,QcdzNeg> _Iwspon *<ȻL~ab8^{xR=V-OLVue7"? h8Ql4v?4]~5o"8YB0Z?pR s:WϏkMvI[^]ʯnb;q. !AX+*Ǿ>``+sYFHm \t3YtkC四CgzgCG\S0IBy牖[ymL1P.$ c?{un;#&D$,YT88|=kb'gac(0ً@ 8Y/G^*+5I$K))_-Yc| #rN`~`8%gEpȾVZ]?LcwpO5NdrWa-.s7|XH&vm x5oT5=|ߴB$.U! GNcrѫ*HU8U H$bhdE+M@Y十ݴçc':Hme/ rBKgi6#k #?5v<1y,Cv䢑JnPO$W 2A:MB;ZB$s֦[nUw OUTc[{n*Gǭ_Iuvm"  xc$u/֊uI%[x «2c(V;s^>6v;1xLXd`We[Fcs%NelsYʺ=^MZIKwL푓Viyv!ߕP l+K* 9W NhEX.[J 6Gcu̡&)W+nSӝZUS=<+wL- + `i4T7@;TdH'OvhrM^X4ܢjp@Ge#)?*AY!n:ܰjZ0){WPEHʈHmFTo|;w g/zv74vk=l!C/s;40!YUY^u,w-q=˸g!TRqn MKs^75[NOwJya[+>W-jՓbZG8dcʱ x|58uKxli!-yb)! $.-(,y2Tں:=+J&|V"X4Q?Ѳ\[x@Ww,MZRGO;h`FnN$oi6Z~m6-w'lh*UDLV1)5[~]V{x'Dn[]~bd܅ YIAC\ꔒW-_riJBe,Hm‘ ?yFIV]ŊjZ]RMϵW!2wWvh{$g͕o-V\Ʃ;<m}`]>WӮg/4rHS·O󼛍JܒF+!+;UFz~(x-u%.4*쯨[ZJ\up!D@љ0kgu^&IEtRKG9 gl諆VeUa޿ 6PPV2*H,bܙHQ* WW7gO\+;-C<e߲ /3nPE*S<=*q|AJ{; i$%dd *5YUZ{%aa K"qma*/Bѿ [aգ5i_-)6,VUkԯrj3y6Nr%B D+F#R:kDl?F eMcpEu{+af\9d_%[k" N h~AMơ\ 5HHWheV;V.yy74 $T9 $2"XfBQc* f5Zگԧ ^ h8+ *M],V# {4 y$֡^5#R (\Xw%k.Id+u.X璹3Ӽ[?Z]Ɨ5]lYa}ФVHdP\]P|_Xpl{IY*4{JjDuisfTѽ̋(f#+a*.G}AT6M/-T?.o,FHS?}^/ t }AoaOWotHVXcdmkž"]Mմwmgy{@"hn#dvGd,X,UqN 9eOPzyNUW%+76^Y2K- &MU7\k^2\JӥF.xİ!}GNA<4 wV h䉠i&TVBbQ27 X}ĺX#ѻf@'d%&3#KpUP aV;NPSa𕏉-OyogQئ 7!a1cr;n O]x:;_[˫ZyMR#BKD[X 1@Gϓ{knO߫*}*e 9m26RkY9+wK2]j cúv$V{xug`ы5 ?zvZuq2Z^QUE>mܨQ+n; [yc2[{:58$ywYN ;귑њ!-E, e&|M쌧)lR{KdиT2v`Ôa Irlu`藳&#tS~S )JdZCjCPՖ̄WTBkA |_Qk9%ԣkuP]3,ʞH j5ūmUftwKwvgBRKv+[;k`^\Rgm=©DCEk8wf]ΣgyeTH Tvbʛs2hRw"K RMd8\EMC/[0[$d,A#$]4c8C3p PoFi_+Yx ?e~l4cnB~h,2HF `D d ,%Fb0PD:leƟe6 \0ƌOZpKƷziv`WY1Pr.D\yv@_zEA93Gqp4%ݷQDĖ,DZF<eip"BM[`KIu,69/ԓ{>:]@c712܀?%I%pA GVM/Pӵ8qX5I")qo"Y#)t Yv|B7ֱyŝҁl1AȩwF%bYKnr9`N pO?.*;1纒+;k g{$ XL?3n-f9IwsjF&'!bY"@2 Fp:WC6>wKV@!hS1\ e>8WSə[BONpF6{RY+;쮅̐0݁l6 I 0g{?i;$2hhГ1o,{zE.dqT#Hq,W .q-1M9m+[[XŗP+t!TFlBFPZn=yᱞ+"Ȭ s _xo:x'=);$Pq,|X**_  sYY%Y 9S 6Av[?'sJiJ78$Cl".rQ%@$t$1Z;7wK.ml<Բ ppOLMFXH[iW\T W26i lTqfv`6ƊC 5ֲif 9ނDPpU+IO1e^+Mb[5%-g'Yxv F>~GXkT\WO?.k"ev]k[ ^٧ fq$Pb pPWilyzw1MDZ9yi@=y4O*3(x`00I㏧'ߏϠ.BHҖO4-c*us=tTbܩ^ `1'q]fmุ@*Nxknr<gWŨV/#TgoR2A8\rO^4$[$X€ۍđNry95WAFݿ '|*օ ^]4im4}Bk8- Yg\)@$C2fZeV[{}#"p8,6@c:xmpny@V $ՙؕ'2uEaG%bQn9 Mv{w(OBh˽KIWFD!wAfrp gZWRuDH؏ @~cc89,,mI3X288$8mZkoW'ݮ+! ͕l\si *ʰ23I$=g61X4j)Hu6 26}うIw-wi6T8Pw=*b}Z@ICxjr[Ao#$4TU\lg r0Mix|d# )%f] {f@m22J89 HFF:SEm]Ŵ$" (ᚨ}GoU[a lľ [(!$B vX:4q}f 2o:.Z\vjjXvX|aRpƻh߾򌩕UPB3lT,FHJ%w 弈K "UrzפëAd&7OR$1D9ېr\3C=Ue)l'xGhw`vMŕjO9YՑdMϻ$`15 Guq,q I\ƢH=Da %~Rj>M2 "Gwzq.̾т陵%LJ&އe4rǨ#mC<b =D>Εev1+ɄeʌrHj |mRÞԵngcFKsj,(\P &-oi}:9T4e6SILifuR}s-gᮍ-S|"22aSsR$s4ltC.y b@2|'/ m"mS;͉Z"%2H*pݪxfXTR ;7g =F[ρWZ%*In"2i~r79pn]glebs( $E',yT OqٟRCx~D2H#Ɍ\* %D_bِn%$xC_gWդVA3J֖l/J3g*9=NWq)n-$X-f2I&&qg?7|2Vjpơ"C(eOS&$sZdB<eY#j Pcv=+0\9[AF +El cʶ2soܐ&B0۷@8q7zH`ʐ*'룤^]\ Uexx^.vrqB=Hʪh%˕u-ȉJX][ӴXg?ZBvr@sn$eo' `<AjjVYXr~[DP N2 nkKX0bGuڤ), 0r\~b>HY{Hiob]_cDHSe` "+Tnif$HJHKlkBpe.D `()I8 V[Z6sG Hce_4_xa˒ xV׊< I2l O9dSx y̏vBdbB<(來h֍lrDBo.اψ;UcΫLaLz8R UxʶC~02rY}n,:˹&5,@(dpFv&z&kx8V][lJd0c$<HbcWkivI4 7+3?/=r %k׵g^(/z674Yu:M>urƱgYEF %Bn3_oo㶑e;LRQF\o9|SŚnq!5ΏiekЇKmMhkDPǓk4z@*ejC+"C)YN^Vxch-4,:-mۖClglelYDz|zݭIuϝ\).IpFrCbiu=em:dZf2.giW\'88mt{TV[sv,kaU_A.xuA]G:aMA;t#*_#ަy`ww6(өw)~r">Q6Qb|m/o*RUYPA&3\QӴ븠-i(\2=>û8Q=#wψ$n&eQJ5JN;.j^'Req7?x7qaqM>'aGMRHDU";0gR +~J\L;W'i'x\X7J G.E=SSӴ#{ 5mй+qr\$yٖȮ>ѼGtd1i C-C^O$eol!Y崓o,a+;ipe=2E$ Y)wHvȏ q6ڸnu~%P}> msE#y c@&.݅+|Af V{\ڳu,|X2Gx13{xOonm*RgƤyn7rdVU[ $9mkFҵJë+fQLK6.F#C(d`O7:Α]}RRS88RйÑrY_ RmFpäۉ-gҧYCQ$wMZ]4|o20jڽio髢ɢKqS :0v0B<ӍMHk ګ,.,,LqfDJaN6 wȼw5}LYf_ku (Pb!*-}Ci#[ZG0mmSn%1Mtϰv-ŷ{ r)>SgK)Ѡ^Ma}w6m,) 2G5H˦|9ʂF&Vw1#V_2,=v$~T?M;~u]H]zxjȷ`iE[ $9Z?)V=D."͖ͧ:VxvY7iXè[,-7HB 7V/ZGO^^^C9n&RTT;Eݷ95kZns7Z|*ZtN'UnF8>Tg-4X4M0yVy{stpXh>dcp$c ڣsI|3~ \^i7!v<4EQ Fr(WsA'm{\Sa,V^$edUn]7|MWv#!k:Fj0F}-M%l]ReA7<5\k[TʰJ]w_|}u +YtYmdy2#K($>S.~*sK%=@42Jb{Y7v:ll8QЭ'᷌| ůIntGBXu?:[[9C{)_ `qh>%ֵoV:]3]E{v0{UFSܻcB`E zW)~3ļsWR̺wjBI-0@eHF9erBk־$5"D.7yfðP +h:ıA bh]V3$!6w(kc5Nឍs>|akw(+fDĢќ 9=pcSmORӆޖV*Q06\*v YGY.MpZ}mѦ$ens5y.K—q((B1-&Evn#.ctO+[|%ʓfFS'n+]1Q*~'W^@'6%Ԗu ayl)D;Yds5;WIXFxM,ٷ&/-!;p 濉numakx(#qiOl3FlTYU4]ss:o>om.a<3ͲK򭬋 E_k"[#XH]]nZUk~ :鮾 #mk})y[ 'q xEmsCob@NBVD N\CkuDտerлG:' /̮FATmh/QFB!k;LFyC x_ϙVKO_ m]đ4\C,rw lo$]Cp2ǚ뿳6L2ǖp"ȡml&PcIWMih?,**HP2 _ #]Z{}>[y٧P"Ypbpsh: 4gbAul ibo+XՎ)dgcIv6\d=Wvvۭ*ۨ~oVrX5h:猵RI&:_jd{q@JMڿ>T䪁\~3tcˋKio ܽ|UV17 7ՙ&BrXE… /Ǟ֣ڌ:7%_q* SA6vdd^  n]~3\'ర+KkeavYxR9& ?w) ]-?h^k_j:bGy TBFvA>lvd i/9eyvἼ+ooݟIXm96it돽$O&DsDf.A݁ZN\ۜlZ16|-II%xБyu*U[{%j}%[-Hy/B /9QU$~%:}Vql$[\vŤ,bҤIe;~)x~AѴ}sMuI4mOIBܢ;) idpɫ\|@i/δ=׆{ٵEKvd[S2=N~jzriشGJ!2g^PX~rGUKCc0 Xw++:`osxǦx׮!wJ-:45@H7&'$<¸sav+J,.湖(o{woR&IqGk0`y95+ . _cVX5Z;#t*@$jT;K_%[gVʫdb#@X/u5{QӮ'Ե(l$eP6M"Ƭ Hwaoi -GZƆ=*5Qh牬j̛T> Pèx8vCbҭ[P ! 2\p|oLh'1 o+c=̒bq18ISލc-4̞\]@IvG\!"h "P7p2O]]~ |^M+Uܚn IDr{ W\lxnԄy<)Y!`/PpVum=͵˭qȉj,[U}2RTxuI,GH4.$TxMH[f`\`w˒ +FofH\g"El")WqHʬ$:F 3(qmu-FK[m0ѫ˹X#/W i\pR5 {!% }E.M;m\n Ѭt?\ޠZ0A8hّqp `FH,GMc*N:1Ci3OHwQjJ[jx/0!P60"|QO RijvSOm|l0 BInU-$ys{6he +ⷌATMz F ;|5=3̷9$`!`#qF2ĞE ֛^'qC|אė1;9EERo .p`cN\ҍo<JyӥUӓIm_'|t/JOZkVyPHŊ[oxGen־U #x'`pA 7n<#zo^n]JzI$UfI'ȤUx>2xM&&9͗L?h#i_ * 7Fs[TX֭31Jmy X7l$q1Dem3S2ۙ/tcb[U`Z-$ԵM.xetaf LǛf6FݒP3ⱃF7VZZ{Hsŕ!cӤ;Z"${9 E_rN&xHĉˠǩ[ɩi2C-͈r(څGu+),q̱E&r]]^ʺ].%Ywe|\AJ9s+\Q,THd*$h3u9vZO ,d7ܑ2Jc :Bc%џ*-cxRX?ڢsS2 |3 m+}ah\vsݠ04Eu$#Yv ?x7Sҵ䴺Yv;!;Ӝu{qhfdaI3)YXG${,rUj|GQg8Hj(Y`Q2N@8\%N q/%[wL-#mlxf v u+vGhou^aiĶ99#rkO"Cu%M$k V!{}H3p*FӴw6%  pFwH\ֱg,ֆ]1G E!̻q@8xUf NHv lHI?(lsytG] ֊2N H`(vm#qn=?*r$2"Jm*vc6v9t{=rx Q8yjWnV6 &r97F=*WR( rs8<5~ i ӂO8OjtZE,Fgi<0GQ kh)(2rC S`G8<?*C<%$rP@ lz-r6gbZg_iD ˟n:olfR[F61,~S߯OZ]DhVhS!rN1up(C;7Rzw=Mo#Q0k|7EnPqݠc}F+mgr\Z˕#r1I^k`rTg9I6; y.=UKv% \Fhk`@27)9b@#r@+7;+8Cc9ֈASǽ2@9WaA8,zt=ШU좉Ƭcۍ[F}{G>`]¹BLʘ!Hݎ>k2Kj#FC!,8cH\qGf-B[s40mz8ؤu ke;>ڌшIDr:ddd 䃎,م($F¸W\ qןI47FV Oc) iAXV7;;lby%Rw? $d* !O\1Z:lgnҙ"zs򎻕F jX"c+"cI<x=kBMb\i\@h7ꤨ 2e2Tr@J3GJy[[Mnim:ݧz٭QK)Wy%c,Yrxs#"ӭ^uhA$bY|2IFIg3žbuXq~qme>'qi`p89zVTj1QQN[[?d 3v;W|@$@@ mtyWIѴ8$I w/m%Ǒ*%PΧ+7s|m|qgWT#x\7Qk+=&ct~hՅ+pU,B`q^ͣ6/;l1]xt>"v]˲$TӍێc|d Ew ˩ \W_/0ޙi7ڮDZ&3Q1t 8k\h1iLzR-,. սuaUhfe @5wkVj\](_ŒYh>Zg*`ɻAr2dtofyn"X(*'668_ 9W8ǢXxQ|IgD%=Y2.GU~CCx !JyQ3wP BʠqW\:X}KNu:R5WC bx'+3xjs]/&P"2/4,$emex EI63"Uv(z ?n`x{y 9U)& e,wvN6gAmٺM gL-{E_[iRZ=:Jmb ȳU69-~PԦM7OmSZdeYBK;3v^kmsx 7* ɫ_]ms$,_G`?/keΧQaKdˑCn#%~a/#>K22K#D|ez0 B6r*k1Hbk0PWk#mHP6G2̪Vg.«r_.Gs[]@II#ʩ,##`b<+0{epFY3|9?y|9{]ĿƇYE=u'FA.1;Cu~ԭb/.HQwKo$ɁxwdI Gz~7/ƌ 4ip lѿ0](yq]ŦY̷ % e\IYxc!FAlSZ^ڼ\X.!i6>V$bʨaX:a|`M1c\1Cd@/C O͂Wid:G`"VY#iep#$ʃ;X4``p%OiB;ͼs\^gYlr5qM{]2eqpȒ}Ab1(X̮'qQıIɱT|G%Mwv5m0S|/S~j!i}]EnZtZVHUR5 F?ekcx8dDI_U 7.wg=ב;m&neM۝B;U !# v+-P\s463C`&v  F3K ZwN@)- Hq)>_-VlW~hixSѡnlDi8󢐬>p0;PO!хƏn Oªpar^|M]j[J1$1}77I0bo.Hܗm|ߨ|-wff%h LK8% ӾvZ}%AiQRyɑr1 >Q@ol5[XbԵ]$;}sik2O&Y%KGՇxAѵ%_L o-.4{I#1U]ܺ1EUM3.Y*OouZ'_m:Kk,D^Ų 0o2=;jK,_G{%դ$X/!r2 wISev6qhЈ..lv@E$+;>s|! 2(u)Y[pguc"x+0Cm;"&ԍ䔹 ;Dž%_qf 1mJ=Ŭ2l*w򬫵H,Ze7z\|Vvȓk r˹Jy’8=}"Z}MY {{5EݺSd]$jX5Ҽ۷Z\Iq ż/bA71!X9dW3qe}3^l,dlnpn0Ab?ŏo_-GR<%Ëqq 48eth0Ǵ3 dko]ڇu0o_l-#EY%/ CƥwMݭ|qsi7A!ӮL՚gSm)#nfTNW^"~!xZ}>{mV"#hcC120۸ItVBs]|}_{K&꺆 ÷W X?cY!UceA NiFļGe2EIIi mpb `2jjM9{J7~A>k[$ZE^ILP$Sh\|ϊ:7$:7 VA&Cd93kix'^_Pe٭z] ZEsMKD UyQ=3mrf}=_L[3_7 I(xMILmYVϱ6 KǁM͕τnkGv*bm$EyekV!I#1Xj1%؝cvu R]XIA|3վ.Oxmaie6j,{P\ }z֥uYxo^U61klGo$!Aw <6BeqV=5uJZr{խqY_Bƴx7fy`e]P-qj _x[Ci?h36|*쫱fMdhaѯnű/Keo#W5[=m/Hi$2Z,$`!N^NkjwQWw9jpioz6V:J^J$iQ\?z"gh'֭5(dam70J,v4X E#|,H +JZ5WClci$^LgSpa+nf?YѯLop&Lp<%J F <ڧ.ln42f;*Ϻ\:> BF֭Kٔco k+$9mˀy&vzt,pRdԵ lo,4W&'st$ѴL$QۖhR72]I~!i ~UP$Q4SLnU#x,oǗ9b.[!e;[iQIn~RFHS/Y0X|?MĶn֚䲵(L2Y\O AԍW8T ߇nuOA=Be=3K$yZmYxP?g& K}[̻n3IrDv0WLlwd[|>/X5E77hftF r2ȑoI u;Pѵ&խ ;#mŔνmq\MKrgvԏ 䯅Vb8h׌iS*tܨ+{w xNcT%ͽ3AZ%*(l|`u"ealZo< }3HhT":pieu2Fv)@ ~{~"6qB<&*rrU>sw6’r,hɁcܒ#xP19SɆs(.[3e-^YX+o$6Ӳ#yQI఑.Iq􍏉t]Kכy& K4[F Ỏ;\K̬~o=/RVuTMd*NQIdB3ٶ6-rn&kk(|fYK\…1!;и6zW{6Q#^֪~C7ky+u b#pw1tRv8ˍ:;[&ĺL[=LX&_V?9K=ūK 71,h.tebU>PWos[tĹWq45YXC0pwPΤn{4rbx X}jh-Z[@a帉h@E(ĩ>[?}ğ q?ZZՅymH3Zs  ?xWEfklR]+RXahRF qo/6^!F GP ym u4lѲ;$8Q!F&ӵmYiW1OMRm;&沺ukNӵ;"5Iu=帙4R8 /^ P@ִs_UFkE k1%I4 "-ͲXct9tM $ԑq5s+7l4 :rxm`e]o6Bw\ϵzx "f|Mk]^Z[.t-v+:RH]:йWW,$:ZYF;ebvWGV "i9\b_ExbRoJB%ޡդL.`#VPDD[i ȥ|C F;5n8#Yx0S31UÇNǀkxSqiV6Wo3k7Naӣo. m;# H\Kþw;٠KKI.:KЫ*X:̕(y_R/D0Ycb8}v1X;ۮ[yz_8ꎩv1qr3kséjCkC 1}C$\n 9LJ,4B:+{f H9be{Δq-+XV] ;ʡv:4"Y-DPGx* 5W>)D$~C VHK~]e(2[4oH+[6GD>QaqH0Mf|d .i#k8Lr*9ʣl<3wdiB4ɩԴM&OxK9uam*VDToJφ6WnmhKu+깊) S+[eiPr$d@K+Oٌ\j oK 5Q]c{8ۚC<'[ش6v.g+ѹ*P &v|UzL @<}m:#}G岆|$,:) j"VG/!еܪG[+Er͑W'%D]M/]#c(˻+nFq3^@#h))կnfGVA"\"4xWhn!Ix+i3՟CΛc4 j'd3Zi=n$sߖnG,v {I6dӛVrс2PY mpIq&ogFg}.,rMܒfhs"\-&/e\[<. eX:bG ]E67)ø5d~JFg .RC<nhQP23%q^m=F[XC m7>+ ~~Qxvka%;푣VPƁX€@I]G{]36a:IIk$ҫ 0 y1m#5-iDGQ$֧fo%YBFSn7nX;9g ϫ?4{FF,ccFBmĝÌ־xKxe6 97"T'ZҔim:a p!7gn'c`Hrnx9|:EsUI&hee^Kq_H4ǚ[h\2GI/f{MKXQ+A BA7 jO8K^8۷](p8 [↠S^j2=̳oyfg*U\(!c9r}CeEs,\띒0Tx_C żgdu`P. ,S 5 &'h"MUI㷙J)4M#/ _|G\;Ej{p8,ʣ#. B~:Ś/ĚXpno 1J .3H۸kx̲,h#_oǺҝ>{4?QobHilr7;cvkfK7m1p;՚D@hʗ#bU oT1xd2>zH]pQ7HeSֻ]>qkZ6ikuo܂ўH KTI2$[xm~\或db|P7* 5ˋx.g,!ܼfH˱ʖcb]>~05M .--1 x/=,;sim$i-4km#*HN0@FSZ1W/PgQ̭C V?7>_-yfZD܆`DJ2op~0xnIoLhp.BXxdf|21"Mk0=s\\ubr:eAgēzh8n,29iF@Z_o#[ɚeVSy|q98%#d @ €1#.5;y"q۰J9)lÊT~7gD+&ɉV\ɶMXpMvߎ~xO};4yT3P4% ʃ_.RPHGxbZFP].WxĚ~Ț}+{RKsNx mP@[ ٠q"*Y}E]Z1,q4U,BeP56T#~ om41]3)"UY`eОmXwLD'X!\ {00;4|?xr_]_Oݬ l\i.GǜQ*`!&Q:0cY$̪I` rNci>bFvJB,m81iDžͤYc7c7W' <%=-VO["ȰdHVA)rcySΎK%+hy/qr9Z6"`|v2 $vv,a,kFO, rB瀭j^ֶc] )M0 lckˆhIr͸87:׉UFb-G5rtsylfGq M: f1#őRwBG_.u/C^[{ktnq 1 x _ *kmo׶77 Uܲc;x݂0z=[g;X=$"o.JWcH!|Wx{Ez6)^: m6[!% ی-$zuuncE E.zzߕ̉}6ZC â Rڶѧ}e cT۸nuϝRH4g%FO^/M`"Gh" BLt`A*iiYo,jkt͊ᙶ/_ oX)~W{Yگ4`w*es"H!uz6nuN] w6|\<خ㝜0˞kh\K5y!)$ s$`^܋IJXA0V_AYPGH`9<|:Ax*L1ʣAG˔ ɆhƙoQ[DrbI^N"e`MgenkqwL}z$jO9?hª+KB9]ʜ#Pn-sW3w vQPW`)74y3Y%O/]3]#3~;`&beppX-uus D{|oΓ;P0 ẜHrѝ^५`I X+7HVGxs[Ԯ|2u]2kh.t۾(A%Kyl+W+uzu.6BH| R21 xsO)k5[+UK[baҵ 8R5ws^&kK4J;:+nSrKDŽ[a !ԯ$,H|tvbTS ܿ(vo%$e.Lo2_3bjm]5M4o"eʳ#sf-5;k^մqW-s4Vшᝥ.$8 Whl q}$W17- gLlT\'J]BшL2/qp^ A/| MssC 2A!m@R[nԂ1qͳcPյXӢ6bVS)k3d6C.p 6к{ <p!b|0 uL jv6Pqv>s8T,eza[Xf귍inkŒƦFpv?{Yݕ/!8'UR(c04 >e1M8ZIA#6 |C#Pde'q| qk;B` n]]ºn21)OݮbԕLhc$pB?1U?SW:J#nVpc$e I$R(2ni[f:rjDULh6+sdp5vCj P#=r[f\Xey\;">,Sz]]<ד%XDI.U782Vғg-X.#g^\m g %,C@; \4W)ipoEN68:;wm\a?ٌ"!le7aX gv}Tbt8H_$@4Q;Y8 nJV)7ke&F^3q1pT)P([x"K /"ّNܼmʞ3cM4l30$ ~gf}X` <IZUԱ>C$L6pdsI^ĝ=38-nOr() ~jɆb[ U!o=q䑝Xlt042hЍUb|/#' {=6L7Q¨ү A`7 IJ=39AodI&oЈ >$psv.ķ3l!H e ӞryնP=-~P2rsR,$eF`p(e잧h⇳]F"'t@:`-r>]~9,2Bkɒ5҇; \|T秈/έ}M(!ekWe"4 v ˓Ǡdj)̲HP0Sذ0pGS}^VeJ0uPyn$H@(pNk@-y5ߗ hd7P0O8'=MkXjP:-,e V9 +dqe,ӑ׽h6q#Ɛw:ciȚ&#@ܾ[mcAy<`FF4?*Uw /8CrVC[9!NO=q\DԤs(+7_2|Z1;6"̖UP;;2]C*t9)o)(o7(w^-q[Ȓ)HXd*y뚫u ξj7ulc8Ai~6'5R!+(uL#K+1O$qPIp\eY"XP`[uon X] y$dִ0d[# G!mR'^JZzς|?$dQB2ɓ2/qgxio:$'Ǚ99nN}AMn]E'~8Sh $їĊ,V.]lSX>U#y 9b5`|'x9gʜn*ׯERK{&ZMlblLTn G\Q3%3o rc/}\ądYm.I Ԟr3MwqxdcY| Rp$)I$dM~.eɍTUXRUOFZsxx^8Aj]ٮDX*#[Q^8GE!D~bG8 Ǯx_C͢r, bb1] <[s eKαMcc#v*F=sLK!ՕI>R1H!qj\mͻ,ӫgGC@"08?1 GyZSlrI FW4 ݦmjTɅR#G^'SRY$1%Tȗ$0b@pO^έmJ!Co a0 XxF\S'uP\vaqyY,$BxDߜ`qp0Wodʶ'yDV!X:H;FF ~ZKiZ}" 8 ,# ]ɦF_>z2`!C)V{Dd{xHedf1I2HQ̒3V`|!@vZ-Ă+wXCmg &Ѵv#):h$1^cSyĨbxhVM\X s yFc(e\o;A8-y5qݟEΪgԺt;-K^kAgXeeDb w=[;VSXt4( 3P7pw(U*9im<b%r;Hx9% ?&MT}jRgl(< ,TM|Q隤r8G#G䲂*z0*rX\iCl3Z_)͸sAr6*VKtu)4) ,23,-ն1`@_!-XԢ+./t!6U 6ܔ#'xF-aH(~б;1"&2%@]k SϑxOЅϢFN,![9 BxYK$v`1ۚ/OKu;yn1mh"v @ Tݪ N4I-D}ďݗgU I8Pdv¶>o9A lv"KNr^, j \y?T~ChѴieԑfd&qOj{i!Oܶv9V̌r78$oK_ [H̄ $cNTׯ"K/̉|'N獡ybkѥZny?Iid~xOĺeZ_H$-E(H3/(^=5Pn^Ldm% `4?/"mSs9FBIVX'9t NGLJ? M^;220ǮGR+oeIy8)hxާ]:Y^Klmd!89-s^cnbd4=eJo`*?R\h_:}oofc&g= <>GwD˅ 3ܓ}y#F>$1-gًۍwT{i#[mO2; *-OϪ[[^蒟*֗qm`w P9ohy);QЌpNH'KDnC..Icmd3ڄ?7[VS^ҴI^Jm]B"eI!2UHrz~?lc]!mGMt9l'yH!h1fYF n+ mpL ҄p@݀: ۦ&N.moO7^Jіim#PYڼ.kwն{-&̓w^N_oاxwT𾠖LFr^Z3e&yRUu,)CKY꒬Ze}7`fڃe0ٯ1|Co~d{V̹yrf!ۜ8@:|u-ܓ<ʄme PYBwk#+4wz xwna3R$R۶JNc z|%^{ɩXOkkmC(ԡ(ukb-pʪ]('G⫫tf_+X "ud޾dJTmې}E$&Zm ){~=ܑfR.$P ʊT`m8espcSYYe\rJ<^ѼSK|kBotg $vԮTdPGm ,/|ek676Km}.ci"6ד|`@p@5O@mmMhm$ r, $ uH`:v6^jj^Ҡ:4JR'm\*ٖ4;YCfk_TլⴓU@V{F\$E9$p {}Pϒi4z6o.)K̖Hlcnʀ j̷3[4q+H&MSaʁ p0IWx^"GË}{Of^ŕ̫rAڑض<"<{jz\:%VeFYĈ9Fg/Q&6T=?&V$Fߗ?/EP%qcoxoaxmi2[ T;f?h3@S|*ծ$P@h$be#7,#/u-R(#1E8PAD#3RbVwN=S],sa=IFfB۝R9݁!W2tL_ضWHίXy3e MУF/<㌊6کBʢ$#$a\y)^n/o/2=NIėJMSą :}Mf ztVP\4fH1o CHA;;M; ҍ䭰4IҔ1gX8l,gH6,41%1C1]dH@#*6|kiiQIHFDnfOG*˖$P::nCS;i9FH\$4acQ-#Dq5H%0Ka,`hಌG^,P*BwPn#"[P18dI茒Kw zxsjVv>Ox[b(b)&ų-̍p.xm $=ţ ;awȶYK[b7R >omkLHoi}/[ tl<<1m7[+{5%8\5!v !t)3{MS.-hYG-sWdyNcx*68#{/WWܧUѮus iiFL[es+;Rrqi?؏#Go6v@| 2QFIuOj>ҮvCq5ҔD19ALI K(8:c-c+߆|CX[K|A^p{hcTʒ#m15l'?6ѣ5ٛI lXZK.WBϘe,0 T--mdEKMU]1Hn!lV km7iyޒnLtYH:+SeڗS/s?t_I_vWpGpl糑- Mv-!ie2&p;)VR$ fU[͢IT @D64pr~oE|&n5jڥ_ikњ Y$coq VG[# R彮\u5ŭ׈dU`P2XOy)XLѦWl3~ͤj;]F_Ñ\fuk(FQErHRKhm)9V<SѵHf[96Hۡ,S18p;~I\Lwo4mx)FV;5Υg&lb GWYe@ѰB*rv&gWFUCm督ΐ,Ó 7am-3c>[72!-pM\ئd 7o__M>j Ԓh-d6ř$E,H(GV 4,Zk:~=ޡqzkF; Jc#6.O]ڽA 1fJ%VdRjInvi~-fj}\>n;(?xl b[he&s⧌?n-éjh- m-tn#g!BY$:߈j7W2Du,QC$Q3*c!@'O>?UIr|tI*~[=O4}^Do=z\yDr3ghaݜZmZFEq3CsRz<H^\GmO/""dmA8|K?]#h~Ґ4"nV&QuY bSabynsKkmEnK+w?h_*Af60FP1ʀ|SON^˺[PiU$W"`s8"o[*tP\`eDYYH b yn]3鶑fY.uOrnY}q3 z:J>;#⟆>xM{ v,DAbْ&JҵxXqZ7?8aFB$ ̌0pCֻkҥ+-m'hFyW~xW~-EZOmz])Αy1~> ʗ\n R U#{+Gbv"IRR[I+V_mxTЮ#Ⱊay&ٞ96*DpU*$`T|?gf#HZǒ FluE}>w4;ҕ"7䶎-bpR rɘ L0eZ?䴞$d䖆;S#;U7Yz~؝P"a7D]7s:zd hEIV.W%@ A-PN*ዤrgS(mE7qG(,1C E!nT+`<8.~;o*#TT|?(+tmA"̓sJ`0q8S"3FOFæ U@ÇvW~'o"EF"\E  $m bt^OfJ٨glTnpNpW 00s"x{ƭ^G-*W03^,(e%؆!g xzJk^IJx&GG?&Hr#$2:J֒/<|0rl< .߁, #6#i)rmڅ ^;/g]K]6MݍngnlV2F 2j,Boo;1]7ZT403"ţm\g ] [(粲{k-rey "Eu@$25t: u$`,NB6E͢$kw+#(drrf@H8OƫzU e_מ޽hɎ+եV}) GY<0YIl:K| _o4`yy3DWqeS2FqK+o{hdxPw!rW;zvAgy}ꭴ:,2/͒rk#SkU=B-Zbe2 Y>Gn^0vFMO[ĺ<Ya9u+ 0\G_v\K!_)@FW`U \ s zuj\M/UfgfPHx4ZM̗))oˊ2C@HUC _)#+Aݪ>Yv:j4Ktͪ4d*E3]KF>wi7EVAݙ.B#ܞpe`6'V ' `;noB0}%ŴNS0E>;ekaUW QhE%l3(|,.fm-O4cӾ~ m"V/lZ#m6mgr%˹ĢtF MaxqT0*|(̪dag -}A<򛫫Db|2ml/;; Es}e|jG`6k۾41@5 nr p1{X\P-;-e>%ž/>;6y#c%,p\þ FoC6$ vDo$ז[Ď-X2'9e7bo1>e槱f̗*SRYYA(Qʮ܌$X{-fxY$8 *Ea0QuRa ê=c $k\d)$ W_xmnZmBVl-g {H?69_iz|Y2JeUHPr%YH8]kXn4TUքW^X;3AQYP{qfc#ʴk _- >fR&߼CpzQѣ{붒wUQ4cFRVhb|NJ”5T!o|?|xs@եխuy֓D&*m쥌4kx)xkq*ճlV]]D\|Q3)]̭~As6Kokym`n_2@$(6qٴtQ/^M_i^_]$M ǜ#(G$j`ġTaW(Oi7ze͋[Bê*g 3 8ojYl|KЭ$WqV8[|$d, a<%][_l|aBu}<]teEh)sq*WxF:xY_=ZYibuX%r}v!6&mD!hHӒDјPI!DwW. ۯ/YFU+l,6G<ܤe#qwAʶTshw{[2(5Z 3]S FTHnbAxRYGD݌*1yrW66}LwZ1kyIѹv'jR< %DcREo[۴+ErLYgFd)}>6+n]wR2KX^dWUcp6#9w++!ܜ.U]/QiX|e%KumbpŢ Y33[#ڭm髥X=I*Gh$VPH)`$lu Qhvy-A>P6c$s5vk+M;laVGXK/3+,Mռ/m'ݯ/u *3[̂'C(`F5Y"M?f.Ϟ@RF̌1䓉%2߭w3i;#u!J %IUG9\?E']RLeUmK"FҏH8e\ЫVfxG,͉aH;6'媺liǩ]]p bhR0,줁)FD c&*|A̶ sFD!_7sԲ+2)jP{"ҔeHݕ&rLamK'sm! rsY~O ט6@g]*< )zQ{  /%Oo @-؃;}.oxNK]o(.)`0F9`jJY`~]R2`' kGB[&5hbG Le;۴X-LJ/MRH;L,S,MGPG$b(t{:K 2s" `NHU Ę)r#1y;By a]D5K&1fR6*N68N@PMR,R7'XJg *Gj+K;{$J͉#l烍ZV."/2g=*9R9ne!Ǝb`0L,p=49+#A4pH`RێJ99RrLi 7/UH 5` $8WqPpp0,r:o4* "3h#i~q$X%]+a{@k#R8B9,sFw Oً5cD-J(C9|j!UAu8p==5ݴ~Y7 Byz{TݳY6~#+e5k3do(0V%)qj‡w vN{qǦy4#' HcOXh-yQ0ytFaΖ-i%܎H7=bU;ݰȍIO1qщ y\1+  N\԰) āw*`d>;9[ں̉,D#h@⚓ī$]8 A?@;;([eEK ~`z {ŕq\&]˓vf@݁ g񄑅EI܊~urs~Z {mFQ&%RSj(h*Lnv9a[TtPNOޚKOL,ia:ొEqI{*6m%fbX!H'ߡNLvlu#aP9$3wRMέvҦZ5Su f&GV$xHqd99 6E|Ue~Z0n@NqM{K{/6x&(aGc3ɫn"Sqh XӆB6bsϽ}!hݬz-Vy%Lh 7K}W$Ǩö;{{t3fb v,w0GuWZݯ=ueʫ ~`xH|:ڡhoX-cYˑHʌ*8sZo,>G#0 mRcҒIRJrsX`Ό.CZ 3OzeΚwQ 4̝QvIi+Hn&c\J6Yd'e eB<[};T3ȷA!d(*O2>_bݎ5#|rX8=֮\>Pe,hs5^m,^F6V;:ߊKP+ˋ, H9bTm,˵^kI{mBI5Y,fyce$eNݹ߸ [xnKk;fbxe LBNӷ-6h(9$"}.F6W,dwǼ ˵;cHo4 Y3YY< bo6V6y@#?9,[N;Y.E,"bU>wmm_NAH:՞{-wWտ]+R.k- mq,}I_;f>m!y|=_iZC3bU$,۔_ 9s?7IbVEr$mb39ݳW| ֦t8{RDlBD_,3c$k8 Q'4~Ǎk!\i %D[΋n6'럳k<=%Գ5휖?& RپVAʅb '>7EO{}"&ʜ: !AV*P&EMH[Ĵl>``O~\kAHpj?zEԓ"iflԝ7Ϗd֒~Z]jIJƦ14mU8 }S~hvB$oR͵d\t2ᚳbon!&3GlnpkԆgY zǯ:'?Kجcɚq(&A>&X/@KC7zj: b]A]KYff.R~*;N;< M^|Ow`Y [ 1bk?uN[p(UWϳo;<WGH7}<= Tl(^6[C@NDV$f8H2(9gۑʂwu5y 4I;@b̍cQDԮ0uGs,_C$3G[|ˈۅ]8NTz/> HJHA=`CwInBG<w90ap;Nzh鮭|˘F)08`P3wZtoKf,r/@D~de($cFrƪv׈[h`FӋ|.00FЧCNӾc& VxYBL\@]T*7PT5n5'8G"nÄlp`. a#?t6ax#1P@a<i1,OYTH-Y.otcy| q d ZB8ާA]k;riӳ,Wv>,8`nϖ|lҌKkX%[#\,TdsZZw]>I57iCyIVf22Jf'aUO-zq|媛`O`:ޓ5rLk+Z^ +n`/@@+g[3ii[+ƌ;lS7uTA>g?+hwk%Y\A'&Nו[yN[ jۙe|r; y 8a=f'TMy4$ms dj'nbt$sW]3Wo,QKk`""8GіF݆$|UjK9/kW g$>Wo I"nssm|d^WBdC608H^,ٚLt %p-#nhЮG*' I NBFU *2 $nSf{ ^-"h|H&3e8yz/"|eh.qFM41e;Wv ^%);b*jgxv~05oxIp=Y\HlP;0¾r|],u[KȌZr0˟k}XЦ}b9. yԬ){X0u)ڤ 1%&5y|Ϧ:67MK}Z.o?/`B`6 ZQyI->"}\IMls2F0P` *ŷ` g=I,cBl* p3В/ww E'/ )V3s;aA~n+&ᾕGe?a QmbhdvG+gQ.s*._ zŞ47;Cw$-m81(riAk `Ȼ0%YZ6\= Eg:l#ifhehVuR1_wm$5A<l3BntC!ݒJXdvOizR:=bHX7py$U;c+`4o\``+Mu%Z%#"խijr@\@(Y%Iw̯q,>ƀP0B؅۴`p1x>|? -WƱ! k#U젶0hT -@dg]*crokIKvei ; &u(q#&[$MRX\Iʬ*[p8'ǃn.":Md0W19gZ6r]Bg%w0S*y=@ia _/eңΎiFKp|VP Q#B72M}!WGD𿈵]Nu{{ %I<0#LP -^!!W)amhy 6hՊ FNy۟QW)oRz4vg%qfHKr$F܃yG>+^+i?ӵ}^7ִ'Plk{{[SG,;x~CAodߍ:٥4]V{ 57hs.*|I >&!*~F,o0d ʐljZnr捘ڙT+T|jP>tBwot5X$mb`Kb ae##מ!YJsnQghnj+մ~ӷhTnY<]ğp:zY:FdXV"[˜Χw6 ØXɮǫxTԼڀxcӒlZOD#!!p,l K1Oכ^^W0ҩ/6$`$) c 6: 7`T׉tg9$>7E0b̧ s ׂm(1mşdUbld !j5| 7H{V?Zh.5l ?%;G$RH^0l 9ӕ¤kss)/ke;x  n!>gȘGߊ|H}-'"B[PL"06T)Iˏ x_çGko=ޝ» Xpvy8_Wot':֡##W1ci5} Kyk]uMM{ycUeyY!UkE&Ufk ᷓS]M^BG qc|$ Vt_=ܤчljOt+JKMN{[4*[߂WŭBPƵkzKX-<&,Rsff#XɐtmAO(F+7kl->r{^4}F8aӬlc}/nb!_hVݔ!ݽŽypƓndV`3nL/V[K'쭩PΑ1;ޫמjѦi!{{.S1o85:ƸKG6ZUDw n  y$ }KߎS\M"vec'`tl"Uv닖[7}Z| 2?\+{y,J E pr_+^c ֛꺥ռVWwWKhnOIi~D#eGmC^QiF5+ [)3xU 27aIcV?Vv]XMk{5EvoW#Hd oI0Go#}'&T7m[PmN)[!msS=%-t͡%ƣ}(*0/%Ctk K>8yf7YK$Ҿx⏎<6.`|D]-OdUvDv 1#vẇ]֟rfh$=ݲ2Y?ȄrJ74fL$/ ^=6-JYغ?1'p˵x9S:~WsSY%5%KEUQ6\ל.ůɧ^4%1%[84IoSO @DI(xbWk:R*pzΉtM6.^yVY41ψ y|5/xDc>Դ8.;LJH^s®J>&ֿ5F=߆/u {A}iV:˔+| RҞP)duhS޽t ֭$v/Gō1 (|y"Veƕ?kkΙit.༷kxNommXfœI]%k C# GJ26@[:8l'l*B( fGTe,J[mgYԭ#H׌eh<3.ڬr)|oT GsaVxy<؃[j|vp%86;[}R+w㼵?VNTJ"]CVi Dgfp -BJi,D15]cerJj0v@۝b(&fGMD6d` Ie'܎?l׭uVA5ZV)p]c!ArdIqy}mNy<[ɛ$fT08y P%6FKY̷|THC6.U݂9(C-#Lj<3jťrGCmc ʚ2JTr6$q||X[fWM‚J #A88uj6[soZi)--=J䏴<7F1 ?BsK6!8@7{ѱ*#ěwg] Mn w\Ip5эMA$nJ:ձxy$˗ii-`d1z]iZ$Mm' eU a;UddZ͘_.@؎O$J+:#/_^OG?Yk)1#Rd60e!fFx4R$ $HN⌻NTpHK-զ~m ۙ<_(IT%e_ k0ew}[]%k~R}o(Gv= N[jK=ō\NRƃ Ķ0j,%iIAv+nӭ_2kZ[paXk_pa ;?c,62H-bM&ZHci"br=~NsNbR~pl۸qvRm-_i3OX^ͨyG(bP;*6 [#S!w2g%CV~gL='1Eso'$#0QE" ]t9hǕ2kw#)O /oI Jd E/ʠN3-zښ:b8d9W%T\I7i 2jP }@K+lm|C xT"@2CvV" x # Y(f 6 1k*U4)js}7D_l4 oxc[@)&ܯrV<7'S;Əەx hnL(8 TxL5 iw E680,67>Fk |Vj?4? lb/e}%p~EPm;{t_W=~$#7qsY^SZy1G<>Tk ]sI?ڋ{_OKHYnt.lgQ"*Y>[ +$t${Ռ/a}Eu, >'V>F$%x]&EP˙Ud$W b[Yi,='M;e\uxjvLPKƶh};bʫw! .%&˘‚6s a3 qm$n{h[m}٤SYF$$ mFXsgg_g&im4&)3x 7_9`Z!OKX5 qkm*T$brOU-gP5 EUC Jd{KwR .# IŎ=Jmdg"Fe,V,H$x{SӗK{-Ub`7| 0edVw $ζ#; ++[xWH7=X2Ԍ1eCwjW)36Q9]l)qe @3vKÞ 8U`-q,E^{wd |D`yu浦;y~cxbUex%z:|r e*Hۗ|~[FtZ@K6cCu ',S>q13u md+pUC8}0 3}̀Ig,sz7!GUG}r<0psp~xľmn-.!VA}$e$ebApTk驛& &NDJH;KZc CjXe[˿94I[J(r|#9VV1 ('WsXTc@+bId!g'yo=6Tc*$hfZ{aX|a #[( eT0ʳ8k9.#[Y$FHUX[`VAS,o +K^ !31L`|d$n?>tu2#y݆fSc SU'm:YI?Cuܘ-,U@TPTcݐV /+(2+v_{C!A(T`*ҽgo?k>JmKFEukld s* >xP+V!tح">b.HcA6<V3.$ߺ6]d1Lǘ*wl,a$cMkOH>fdc)ܓUQy-IIWks + N䁤6#K,H )F-YT9 w(̋k@P >)o-,%zp7*cp0FԚUn3H~a V y"-uib1.6(bƋ.Hr FrѲ VodAi^J W@98 翻B ,L<(?*FwF} rF&cWe(b:nu{NUq]"Bn8 XdoݜW4dmoCB쏀%]ʖU9p svY-yL2P<'ͻ!9 1#.oob( 5I]wrup]],+4iVP`HGx,985r#}:(..$1NU<I<v>_SsTa9X4h半$faA 2q890\MnүFy/"i7* $9WP k1s)uHU# wp a5̮fmG [c[XMaq6zqF-GMi)q$r+cUVM׫g,G&\\mlމ;a>DŽY";岡])#ČCM ̌x1ְ͌CDhNɗDVQPhźBx,qmx.ToI9`q~lty. 3E*b1mo$Wc4i- b~Ex<\#ZML~%{x@%1Ŕ`)<`e Mt> >Ѩb;g.C4ZhKVw4{If jƉ[Gil7dXee$ެzb5/k>+ ?hvck `"R Jd3 W5VǗ9xIƩm|y0P0( u`U ~X(p0v18~;Lܣ\%#NЪrF3y"NBUN#'$eʱ3p2r22qɬ3u4l&)ī嫡whnmp8;O$+ X_W J~rHz SZBNVO24{C@썀\p{T)@f%YW2$:b=q z{M @#<Ԃ,T<(n jo;U+w_YjAkhGb+9eU.]7);jsQ7/7ZFz, 6h.W ߯qɓb᳌Sn#<Ƃ0 3ߜ mdyK{ܞ8S`Wrbo)AJa#-ٰ|s'K+b ,.0AJLb[ vx(~U19 OJS3*S珝@ 9ݜ ~U#)I6.4OG`xr? [4!Q9<G?&ռvzCF$@ C1iczCשi F9 s,1FC% 89#h@;MTg=OjK2;A\<*0+@%d\` 9$*r NqZQaӨh3y8slq?sKmgr2Lt7rm'A#VbViVXeW9#==3ug=߻R63}9FwU}@8\٫Xf_]CH'[Pr%QO2F8?hOgoD,dW|wGocnM"oTV|X㎸skpw1bXr2 L'7d-t7GnLfY%ïu9kq?0 y|\np08+9}9O1!؎#8Vۜp9H%S+EܩByYr`^F:Ӻٰ,n-,o%' 1v'Fduڵъ6mcT,|B8nCB3\\oc̡/ 鎕-<6YB!`l):jǡBgkVH ^$ ø.rB9Fkmu^KHf@'4mqtkm,AwmQixqK4SG &fx+$܂Y@I?>]hZ_^\ 0+y%0' pKq9ȭ-G;+$+/U9b@$g\,ǿ"Tk#r-Hpc^s['Zk{3,@vO y>$B<ʐ)Gf`Jێ*AI6ϝc1HRhp $[- ck}mqi ĪKm-TI;FQOvkZlZGحj_i&I^&?4+)ό+,>$6owm|n-# Tx[9 :.7N⎅+bI\y3l ѫ8Os_[-gk[#V1#ar#>ؓtIBN [1-[(Y׉v}09k⦃i ,iC.!F6Ӹch$ctwg Q=fXZKDI&b%Tgcng-\΍-da^x(-M.Y H'%c*0HbM 0M%gReܠ}:dzWI7]m7sylYK8DsrAcsQUk{X9ebɌ.{8+0IJ|K$aE y8{.Y%bTy 8ZG;Xh)#Gm#j8;|ͧݞ8k: i\cp&[FO Pq$s$m9veO"oYh%xKdKL,`)œ"9'V_8y3Iq n1#i7Y~K!!|ۀ69.1Yi+R6;'3z4$yZ7Kȥ-!X(SD[lsFr +@\i.29傥U3;w.O' O L% HX@ܡFw 'ƸZgOoz'ݺĿ kPɪݻ>w>t!rve2:|STm\,A"|p<&F`Tp*ǮϗQ'xM6l+*g.\rȥ8 9ϻ~bG_7Uɷ,g{;FZ}x3d;#5#U,*m+F ")lI 3¬:M_ 1Q}k̢~ ck]ww@@\2eF ^ҿk{DTBdG;v6;WB'4|'JrmT_yZmؐ,\+HÍKszd}v= i'i]v#vY7+o}ǜr<ns'%fffe9b6U϶@5ڟ\o-[Pf#Pw3u#8smpJ#};k|2p7`g%*7$)%@ebͭΗ\Kqy[ʀh 2>U.jρX:]Ρup1 E ܶA r?7~o$^ФiV1j 06Rz &x{k5 SzLOu2XcJyʌL4b^q)P3=aquIEeR%A,>v9f7V,rkGU Kד_QR$HVTf=[8X%jz\i6.n`233I,i㞕!.:Ii6+x ߈Dw6r)FS9TnqX#B.jSv pwՆ rr_~KtKGhCXO$. "tH^ v}+=>TSLDyqo=|9 -k8ֵ~rVc29Y*\mr#,*ʱ}ځזt'3"p!URrd yے33__E)EO%&8"A$vf XdkOF-J(Z,0!CzPT %U>͹<.kϨF-ce9mo1B̴60ITgku.*8ϘÀ>V~&mk:]G|hBϨ,vMxKHλ-$r 3έ~Mž1ҷ'RCBτp0iߵ/=RI|_o 'G٤,vccxw_yOp2SIm{F[餶=.oNbY-Ĺ \fP-QfVY'``*,rHYkg An(aךu<`vQ2,}:# 1rhfдyV6nܛи 0PX2ܥ}y'8ۙc,eD B2lABMn,#Hʷ.He\.%~rS-Jd#̷B`(ia% Hs9WΞ3hj2GhC8|2i.8X(ToCSI]TsOڝ3֟m9h)&y B8.+0R |ħ\ϓ:mէ|S#"[I\]m!r̭R1*־,|e˧uU2$v\4;ݴ gW&heYXA~9>FkVϜN1fkOK?um?n5\ԬCtu (4Kf|0.W,2+ߟ-xyMt.w)%Gʼ228idbe+I `8'#1P[XZT5hw8*yO֮|TI;t_+Sg3N*O?so~Uk=CœB~14Sy e'^]qxH°*DVX B\(t jRktvU#wB$^kNOː2wRr0Nv8=kWUC؁I9r.-'s)A!tڰt議?d<3U<'eL:ūHܔ8.BzmIȯg uwz-5G1bT!Liqyg'k{2~ ~b os߁zЫn IV; `#*O]zp;^.'żC- :o|1Ko /\KeaVn6YB@Vxr5-.ÃodQKip c#݌N썲dE~6I QWa\p(w^2*51 Kal ? ǿ 'OҢW\ҿC{ڶhkG$K[,l Km$nf?0k<71FYTe |2|,8V֦[n YSc#Xy8TM ]]2yl! szD:p)?C.u[!-n_b͂3'e\0>QLgm|`mUDKl6'p?s8qQV܉]gMl Z|VAJ?i5ED._xP ]Cc&%E $2_hx7 {AEva?4tH ŅŜzt dHwbm)"gxIba*rެS~e)$IuMblbI)$`d;Nď,mt|O य़.-KW^ y5'X^%Vp7ȯEfj'*GqRb#22nʀsjWдt$00RJHCn9 %GA2ԙڊ>*o<=ou{:W`omŖ|4eI?1X`>Kּ;&S±.gUX)" pc$t98?j߇ ,n!) IUV#( dT'f̅[~&eֹky kXM(#yۼ02c'> ķik:,pK,Qjzvm&JG-+tc\~ `𶃫l~n4 cLK.5N.f#T?;1k8V)H{;SK%bl H6ɕ NJRnֳm xO-{32e5X-+d )ojv@qsqK";e]"vՙ@nQ'L|gY,L6b[/ 5k鐳6D4YX]HV]Nrt^ $mG3}8]:YFk %h}9;kѻM _?ׂV {>URw+"2**w]=B-z? uE}&KM;F5m%)mHt[X_#~ߵg[%ӯѭ9`[Ia:̮a685y`ӤLZ)$2|WK,ʔ_NX|2'(JE<(/wۆ`T Z.)M%πZw+WSiH+W7b@(̅YŽ|L.Fwu_![tl>~zƋwnvO܉q)qGl1)+,(2Y \?ޗ}&:kП2u_ _Ͷx5_h vlF( UxpH<#_?[@[Eoiz5"* h I8,+akh)$lI#c}l-]J` ,7"0GQL=`}Y2bƧ_|ZYH!$I2łRHԠ%v$χ_xM5~V_l+i5ɑEM9Wr\1Oel|f~~?oMk?V=V  x$YH#>F~~6Xx;V[ N$L1>d#]7edϸSYZ7ix,muk]oF+Gk.l(La",_QRw{THFц7++Al-Y/j |;4mo귱,vHmwplUZlB_3.֮Q@ aK~bdWG~(i_,JNcI&hl|Gb8 o ǦEc_B<A6$!H7erpC~:IfGG,H%W;_ ʎl@^MRܚ֥h_i"xd^.0E)u/2%/eG^[gmm$V]HoV y^wg9ޅqgi+[,uNF"eutTxDbT>>\=փ|s%<8 &Wa9`o/CZwhWtҼB顒dwR]UNaHܥ,/B9%eָKyt.H.QH 6$y+BҸۑ&$v3[O KciC$R*L I0`3_?UI/4o.HY$lG,6s\W75^h> 0_f[rL)8`C1X wjU]W2|q&#*V |=ŜQ6l-9?~$֖Ş7$[e\YQƼ!UpCֿXf^&drUw}Ӵ۔kM9 Ӥ7E (NpsXREi&Ke@dF Li^)N,mRH5xI`mpdU 9g둏f\,k  Ԭx%IXj6G}jVbܠͩqS^KujzʝW6Zȇ@3$*7Ͱr58`j:\e3 /oFg\o$\pEGC&4~&U2ۂDZ?- z՛ߏtolZїyOL1T #'ۋyb4D U$.$lC?3'U 3G0M-mH1Q $+c-t_ ܻ-Z3=vY[ǙQToH? .~I:Ő |u8 ('Dui⺉Ѳ011P>CۿE2cW0:oay;Ĩw-N?lSx5O V0lbX|4bVb7n$0"!Ғr<Pgr<ַZz34mj.!,U;H @'M{ki`Zxy7# 0@;7?xˊK4,=A݀ 'ooyG~J3i^%{mϼðlVF/*Rpg7Ebaw>lz%/o$R#4DVOӴ@ZNFw 4+ ʲHa&CzsqjW|Mi$ ymZG3n;A&Y8ݹXWIi~*kXVsE("(c †+(Fz^]! _TSTv 5ұQ,%L!hF+nkgEo#3:F z*p@ } P@[-fV8݈ Qrwd1z}ٮ An`[g$G +%ekxPĚן:FRG0Kt_%|$(A&j6< ڿnn 8i%1yVtP ¸ۈu4-tV?̏$,0X v$VU&2B"R2،fNF3>JTKC,ML#Tz~R2F7M=Jݫ^$!cLd60 76u; ?-ºK한2ܸmJ5Nxֹdߺ *eV j1݌U,,Jf% $3C:^``Q9BVZᵖY"K3\LFx:06I8݊4#SEe3>`$AP)nC{psq-͜WvDvPCCyξX^"7fM:&gCxBy[}P 2pTV$ԒV+sH6tTnR]<0g4IbPčpv]Tۖg0 s֡}22B^5 vLfb2C䌒sgJZկʎC-Χ%G[|^2b gܚms*6OأHFeAV֮y1ɦ'<̒IAYIFR I7P:/ohe?iˠۈlc; ݙS,{1HŵiQʠX" #2(ldJQ6*|sH1q)#vC/ː b`r^y(d3I>(@:`(T$6Sc䓴m>^ŭL]][ m"wp&BX Ree-H@$dStHn?}W*M&$rfB/g Gl{ryn-.W);iVks`N+H%FL; tܨ'i "8X FmOq&[y2#$a]˰1[Z(C[8f 8Xe  {/'Vdi)G B{r~`vgWK]ZaUEGoޕQf5G,Hp| 2Sp6>ڣ"5.C_-..%xH6G\cepݚ敭MԢ4bM!REYp7' f,ITKy I#bV4W- 06n0x9ch ٟ2D@T'xK9&ZԤѴyYfy)Ty`p@[+."DFnK.,v0A[ oKL 2Bp*Ot.wP]Te$xBRaumzZYhWEq.Cј0`6N7O6 iD (g.rY^yCu;Auk([8CEqYV G T9cuX`uaWcO]eq}ZAO>smNq SewY-5yиyYP#kHćU%28qk}µJʣ~,e9;eӠ#8g"eKl2 %0z|){c?%͜ y ZI.NfVwn'i5涋S[X#2߆1G PrFIӮld`a 6UybX1$q 9ʂm.(/q gK[ d 7d$\$﹔XuݚX?8Kdsx9:nx @(nΠ>L.й`p(k{[Eu #JV*ԡ %H8Aae@)3T顼[+26Np-^WdȌ)ڠQ9:CgGiFdŰS,3`瑟Z癶8VI6].''hn0 uyU9W_vON[d}@Sj4*( e tyzq)w$,:$/r3cIՂ1Q'##w1lg\`{pa}6H^Isn[o Ct9ֺa>Z岧!)Ps $iz#mAG2/>c: 88`kuͱCD6FaH0}HV/l ,qn*H#՞䋛-c\|Xr9=Hlsՠ,"FT1, %#֍5!f)'#weoۑ*ZϬ,F+v#1 qM:+"GYJA|? Xʹ K,Fc+'$NKI<F_(W\r;|4T9Q4iyt[Q\i@$V30a~}j+SÖG\4$pP[/RpoƱc ĞֵagO ^-^*^8?xŝGFrG_0;NZ=GvC42XUQa9PG#\<1,'=f* SX_ϭ|#8&kD{3g4y#}UsᶮWoEBJTM0I#ǂV^8r8=8"ϝ6zG7.ϼy[.VRDQڲX$ (XdXnca2` J$ggo {͍b89ӖwY\qџgZ||Uf3<( #NQ 1Hkb. yE|dK"1rAqbJF#PA?OSME՛@n2;Vڪ #HRi A#¥ 0$n%:mҮY^2²4>LS 9Z' u[FxMG3)>,OQ/+V\+me)ʍ\ :+ռӱ:a)*DFQÜ.@*HG @74xg,w 'r 0# |;,C%G'!{U qfs<"k4rޛ8d$ Kƪ{ s{ΞwB)&''!4SO @<d>ZfX$(݃+ ]v֋Kh2r܎x-a7i#k.# >jƯjt~gTq-+#~?n?0hoAc8 y.!ft a6F0{&^=qS8D` 0 =?x0ulgKX@pO^I Y.2;OLsy`wX cg3&s'LLwhٔ|ˀ2O99tg'' xC%d)'(zp~Ex]׏Ǧjܐ\-qq رUFW6'5$q"nEXI: @` +P%~a@} lw$R]B gҠ6`c6;ie<bJK%q3Bsp;ӼI:|l*z8Q%l˰\ c>6; Q^0ێ#CMDqp]O"qn&\"o`qU3z;6]%i&c$(\s>*qZIGSlߞT_#¹]Vխecw)dU,Q'LY`r:UicNcR`DxČg [nrvm;@ =Z9d?6?"[\|ޤsҹs )_qIcJtj{h 31m{@.5/J3-kA$`d8'v0c8sTca.$ |BJ9d7~.Sr8O,("DA%,<}8l}PLHˀ2 u%'I%W2*A;8P 'dI[ @r:{gu{dmmʱ@rds*c-}5R5[شm6T4/_|.r@'s _FYak,ei|`d8$H@Ȩ) +tH_utl:6[8`ah.jC$m ]O1dU/2n*{zS,ӑ"Ə ;ۋJ9߷Ԋ?k8<Y2=ZZ؜jibE c$B8iQDZEP8@~fVW :ǹsAHzy,E8 :# 9R  ?^Fz\ZԠWF%";U1;ULSq!K@STךw. Wgw=9Z{h$p!*3` q9Nݔ/fpcCF~V RxnwtPe@wu89ke;QdAO$d}3cyHǍ2Occo@թrRf9mb`$0܌1CLIᴒaEJQgs%G|}w\x7,-tO,yyET2[5>i_ =Gk6qH]#lЈq־?l/[Y"Xv1n̒$FA uP2T9<9aW j y,L[.gemWXIs2ͩOuxhG|, )ϼx{ëxO[5Hy +,Q+(r •x@0J9BbǶlgFr3. 9dv m&cp^*fl?/ŦE߶Imʡ&H"UF eR.22FzΉx<}+K{gFW)ap2$w~l" R9=銍Ra]GI$ ~q\~{Xk}[g,:WھЙ,}[k4q>AI~[G(+k]`0PѸvH98{KIHYb`?tFrqLӭšώ9"p#9鎇'G]96yuZ%j6M>(k :'1b餃R01&-nH,dn^1h/, QdmmeH7)d O<ׄv,ei9M!/ԟ`1LIS3fϖ O#QE~gf\kӍlLzY{5_q<;j  mȖ`X%cmwqm'+,H#D)'$89ᨯ (H09猑~ q5ܧm7>b'@o/KyH~o͙eS8*q4,O6DTI#r0@' !%GB؇b8[9g3%塓* $u}!ʹ\}&aQxV CjNgDS"5_F7n0yW<-qm>Y#,y,2Gq'btu:)4UmZHYS7;jWsr[jd^A9* 8YvNLN@X>~\;pq~Y]F߼)r\ rT1< 60ss 31%xÍnxNNzn,7ks,2퉶B xLON+ZxÃ+aUnmPI<Ց,"n wy ;H8#G2Haˉ NpHU浬kcEwrx'N܌tTȏWlPK0`NG|OXmfe !Kr00N:)]#V"$ q]sx[˰N@븀 մ#- p_]N~CڽJms|mð@.9Wcs#w)+H<㌎}J=dohH՚Dh,emɄ%{;s9'_zl)xbАcq`@c䁐>Zq [ٶ 5 qƭKs*y`U'w'lRԲZvnCuܩx2Gm? ~T~i2NC>\8'*=J'ޖHZ5ܷx( ].xf<  sEDE$t:ji-ɕ^^= h"Y7 a|$(P  2u3.958#-lА<\2Hr \y{CTY[Q2<\IÀes]#1p)m1;OB9ϙ~rXZ"xr\d>@4E$H8ms$.;q+$$!n؀';G8sRd|[+b#kuu nk>f"ӤM#B pIa߁G E $r`܃#gShbyqvV"rJ}ruqN@yj@V*$=NrjslrHehoP͍*ώ#FǡYbjN\n@ éogGw})I"U@0H@ CJsM@M0cb#eRjb9ǯ^xpȱ fXRe%\NG u8$~56#,!|B [M[ִ;k1 ˵XmBMJ~)Gi-m\>pr$$~5ì eC2+3 Rϑc>.]8\`uz縩0X(͛zljR/)/3ܯ&B<8`^?kڂZBt8+e\6:qǀ4ܡ >pxÑޘpJ721=NOs寅=|]ҍ giֶ7Ə j s.Hhd A{2AfB9P@, xXSnf8*-J\l5tW0,)(l< OoއJiFSS+YE)x5P&̦I db7m$xzèm'%e8tE ArO(G[\q~YZjnM~6}[,Ɲp\y)\|cM9 c#HSS%!O\BL+!d,>L|j "$yGH~NR9VY,]p"ed_|C>3GKG9fӬB8RbFiƙvSu_~uiuR{Hټ±_n^X8u-9lPRXtݼ,K R9`״ǿXcS6FmnT"%G#? u4t3xmZ2^?iNX,o1IM9vaYkA$Vc|2&v/ kKn ^,6jcW=Ap|ls|~ J@+ \pFVyg9e>ys+W]׈az^Wvn~gخk)nc;\ǹ rGCbm9gT\(_݂IIQq_6:ֱB[@qH8%Xc$c־iQ|Y_ĺ毧^JppYz퓑O!~|7y;VGͅ幻,,kq+1d)`I,#l1?CiSfHK,vE``3xZxM5޷[2)+2'Bv cG6ct7S@8I6rT>MH p%͚3Ǟ%Ή#(0Yqχz<%λI#d*{G|p?Z|qZsu)x-vF #qOLc(>j|a#|IIukIǑ}b0DvVWR<=fY"d)cf4^G˜^ 0]ݕ'Y,\+Qi^Hl,2c/D2:ŞtA,Z1dZ4|n8^E2gi|BQؖTCG p>_K~ZZ}TcċqSy#h˒$s^^e[D7/ g)FA  <h.iAe.ZuS}Gޢo3%SȭЌи8 Pyy/dkv >Yb tؼSR:6˰CC$gl)t6崉fnB`K7&xؤ`W8c ׷%ƭytA$ 8wQr˰OPZ[50r.Ҹe%qrs{5\!\#@@SV[5Յ0<"608q:71K0kA?K TmF@ҳȉ[ed # rWoˑգIi>l9~Xkp8gKXrqX B9_U "1$?5ȌF29==Ř1`:ŏRFBgN߷JXP?JsI99^z_ `d8Ϸڣ| =\2p@*xKH'Sn7Rî>)[FI8UF9P{BWO gST9,s}P@Uprcf"u*8_R@IO@zXBq c1QRT8~J[! cbOۅzMr2U${1AbO0pb#r9 u s0idmB6ݸl2?R0 c;A0'8BI}=Cqf9wTGg*RV!GB,OS(^t4qY\>U?(?=w!Y%MU qSҦ 299*3ޞ٨Yԓ=i-H]B09קlS8#FyTT$QN&2Y ?J5pIПN$ln'ڛj !oC${xZII&6=cvU~^_6ڤppaI nLyGs`:VtXU:Ȝ7\0 88{{V Ćh2LT\Fg*rByϥB 1AqT39RH`6#֥%i<ʠflYZr}9o'BUzE\dzz I"yPdp>eta?iEA:.:oƩ#$i$Q8}NY5R:{~?! ă88NWn][m:Hb1`w9՛6I'##(I=* 3/!' c={ID(ÂNy00:{W T|)8=G^NJ̳'7&S/Z h166Q%LT<8 q (ve\sB=N=\*>dnדTk ЊGY #qwRNG*s@PE3HߛHA?֡1p8) Fv ̥A;:gLRvO HDv=EZ2 7ǐ<{X?+cflX{{Se;X8lqqׯҚ<& AR5.>cԨ B(]\ #0##'A31g߭U4SCm(cݜ7OO]#,6Q^3֣Wf%~#>HНF'9'pR=1̌󃓁Qs*F(E`R:c PJϴPH t XgB[8}j }f*]Ñ$q63F19x<r.jV,0ǹݞNγFMf o$Hh%T7r0sREHƣLab=rJ<\˱Jj@0x ~5Vip 8FAaBZGw?2?V>"%rH h/dml pA6Ä̘c{ֲ. 1,Q$I,@H)jڍլRY(r@,B=qUBMIbHǮe3(@-'xWmqyXr ֞V|^#2Ys5p67̑ɐ޼{XDZF{%b[+"q 8o^24)mX0fer=8n ~߰/mjxOúzufo%hddFYR4T)aG}i|TR:d=և Grvcx1d@^~KĿHn1v:ը4OỌZW^z]^G8K0FRe{;^ҪF=R $V[#CtZjd<}(<* ]Y HK $VC1u! sוKpmWc%/|z?4ÎK1mue YsnvOR6c=8!lGz8 Xvd+ Z WdK"!aHLw2Ac87M>!@Ц26?][\Ѿ2)p~ꕽŬK+$Ȏ ,w{~ IJ.|úm1 L-푎[Ov( mp€IV,-*I;" UuR=*Xe1d!ycN2+I!\\e90ec`^;Iq*1IC~ʎvUXmFT†p>>z/ܤzxc$CğgB& }:㚂8d.f7;K68cOd`DJJ(VG]pqP٬PC'-8O=k?jit.hINۻ= иdUa͓ߌsO]lN5 }Єs-BFFr:"\_o(U;X|ŘT=:ȷżDJS?)z~V$L|@ۉe~^_ K]n^KĊXn\ #Ӧ}*đ,Q2%G^y2I$c8^KxJ1r:c׌^ G<{HC) Q Қ,Ɗ[# qTPK'v]NzS%i64b?,*#hv>ǯץEq0K@؍0>PFx'g^FueLeD`wf9ݓV}Lд1!Tf!rHRݰ98#A԰] \>P>P@tz QnNq 6\Y 3p`2}QJeunr끐UsǖUʣhcw^}{zwໂ9rٹ~x#>9."\ 0 ZEyh`'9N:{Vb]L2F9ےN?cƦ[UUoOnu]F41$<vn<8sܬɜI4L68 O@xM320U+( c<4,+QX pzF23S} o2]$HY"LeFG#?SWmܲ"MvԁbBLxB dd1_F $ ˅v2nGNs҅"MIuP0"E) ÄK`q8]朿~Dŗ*A ǧTĨt~W23pd$(tͫG搣 89}y%YC<'~Ѱr<p;^ B *cר=p^#G I#]U>RI`9NhnMn_AүA{6^pF2@ϡ͉""[Xb wu[m4a&wqԐHEHmāIC8nzCqen-H\V|[ 2;:;2!tS #[`\sP)tTDARAg˻9 MJK +$4yhdVi`7(BA@zMW0[a`ɜd|0HϞA2nH vǭRI#d@PQ2O S,YCFWq!F*県1Zs0:=7z~|ehFnj+Gq:#iA:IVQ%=U<:ҳsِmSv⑒Qxz2OLҵ]4uڱ(|;@:r[*h-mx##GÁWtflͼ0;1 <6梉*[Ʊ{qs#^P-6anYO\PH58 F`3'?JlwR%c2U$)ꛛ?7W;L(T%z{mQ 9F%P' 7px?N?Ža![QacaӜ8WCzTu,Q*}BN0i7%`* .HW$B1 dͽ\rqd[Z6H =؏Slܻ=q+{ B5W8RޜuxV"a*aRĨ py~5b0+[eX/@ A+4Fexo9vי(:~>1Y`Ld,Fdcq=qӊ`9#rU yoJ(b]pp~\'z0C'7}۲L$'06n-ChVq$S:㞕]EfϑP]8;AO61۸}*{rpnۙ qy${U hڻKm8nQd!"U?qǦ8O6 nqQx9Y xs(r")?lI'}*s\.deW/_@r=*)B@89ΥY Gj`=u)nN$=HPv$tөzȭӁ8?7dcO L{r{u5HI;8I{W/\Gj]+pXc Fq=i=>Sw:OvJa׵hQzC[ Y."P8?{=r$r;-p"1cy!9 q@=;gC6cj|ٯjڿo.ft\1cOY~B!8O\)`y[hBʎ)NcIsnR n`J aQPk̳[20s m<}ӸRs_~-.M.,cr9s^e` *dR=`v3˜UPj~\>[c|ì[62h[D-Bt'kl~3[$380i !l>_Ef<)Xv^BB_ Ppx_di"V];L2^bĞKmȀ7H=k_jm7/eD7,17KtM +o _.M9MO2ssdpsMִ:pqPNzwy#=GzqR1Tr8#֘?JS^؜n3s nޕ$h2Nv=0~ڡ `{~ltd) sSr+e3Aװ &s!086gvs2ۑép ?v%$W^FFzR 7sN(ɗ:8'BU+Aa0KȨ<ЌbZp\{Jx¨fS) ScqDp1ds}EDрʹG)Ʊ3Kgמi>_/vxy2>^BIpsH4C*}{~=j0Tdz~UbtZ3>|5J]uB[w!ҿ$ux~/$C!PT1þj%rsZy>i^HQ=)d^9ݎ:GJmpvC =uUo$X6;a84Lz B=ԛǖ z#Ӹ08'y~q˃'pR1F%Œq۷i6p2OI qI3̘!`x| ~ӞB#y,HMWvR'fXs7gZ"2o!ЌcDFeAc?$I [gI"ěw9 X6Y8&Gn.c2 `Bےz8[2?FGTB9T r:;"m#a1,,vÃ{sTvא63d~%Uc9t])}*m {ԥEq3v5Y un6Bm4ϳ\]MuMn@糾 +t];Vr2 +Si`& pO`z Hݟi`)ԏ^iDkyb9sIӾhl uf~`d NG'p$q}QL^GUX[`Y€I94đ_c[c>9 +0 @׷ҭXa(Gˎzt}j0j)c$Y+}qZhS;/nryzVRvw1,I0yez9*%̤ g8zNG?WXeUY,88OtRTwJM]4ںz4UE_,h)mbGcӜNG0Kpr#N#<қ+ȡfXc, GqӽT0ʯ985i2gޣ JD"# dc =}[?o[?mF=VP 3u]O OM㎳5&'>&OMCHZka/fS\ WSթQ',nu}cH/ǝvۖiº~X.;v*ⳌTKX+;ggGC*xlӲo+O.wX̰MZM &@989?0õlZpYY4ʻLl@Sju&p42wmq k&,rR@%pHT쭄ֆm_4Dhd"V.x9#pnu+kăT5R#8vJH$W[ %VW*rC)I )Piޣ%AüC䀅2K1a(\iЧ}qM [&"HM`ʛpͩ Ÿ(vWPU]z{x.t *Һ \cymKءyR`3_-3?kuei\٫ťMiq,P-̬wq __/2ʸgĪk)#vbp/WZKmnӰ3;H=o3A w <#\\y. rȱ(yso4%iclepC5x,)*<ɿo{߳Iy|?o)'!2H1ڟ9=db&ijpOyE0 2YR00s^1,s[.h5 ݨQ]| a aC ⏅WX%3z&P w1۸Àx\SK*6K@BPr.qWqϩ[\oyg;Wש?Úck {sC\z}FNpjXS ;PPh{[,bFH~b@C[fVA1szt+_6Z{ȍj S[9$K~6 [n@I0hQq OS֨G#rߺ! cy8հf (vBAQzddU./.Cu*:qNcfQC ۢPczuҥ--ɞYlI T.!*Sc'^>,v3|dL܌rr霃?5<V% t U$rNL7)' >XFQr mp03߯~*e$pA,p@ッOj X'8ҳC [ ᶢ|. u?4jbH\BO^Ɵ,A۷'8"8K/I'Ny9?Q+D$ x!4q+N|ԃԓTj|Nv琼?;iO(nI'sҭ%Ybޛv*8?>`U\eiDyb#u#'9*"^r&mB>b93ǙCU3qWQ[ ᷫ6pc'溝wYB 9l܎Uf7ͻy=aߥ:@#$}Q@bA=qG0>R y|E'n' 1ޫH:gs{UҒ9Xi(x1T1Xǖw|˃3aJR5̩Myr[` 9}y.ոvc 1BΥaOQ휜}qW[qN֏'L_b5F6mW^9\q=(k4>k\oiHD0)&NpN0F ri-!Eܒ|fWYwHIM󐻛9 J{.#`No7c*1d]rc=:MO9$_>"#*v[n܀tI ܉6c~iZf T+C F;{ 8O $/ A=x<~F`+J9;22OQ=GD|ƥ9_M9s71D/=H2xNi/0A,Us3Q nGǹʞw 2I n sӐ5P4ry#S'C-ԎzvŒqy5]7`t i\c"6z`gg0`f@v{Zt?BhB0F0=3֣i$R|VH ߔs9%U #oVa{=)lCc܎O##5 qv02?#U8<ԟzh'+¤xpI9 $>hEmLnHIߞ]vrAC,c\|p3qqTvI̱,v.;qp+7Qj((F)ryp I6]P%fpso+C[Y\8:MT#`_c=g׭3RD@~(89? )6ǹ'r?ɬuE7!oϧPmel@Xt\?NUsipdSޝ,o,no0͜sKpy#Fv瞙F]T(g+~.@XfeW!AO dƒ g>Q+p\snnHɐ+0:h,:*"`I# *$6v6tCHbi# T@^=}7mN 69s'nhwn3N0W qJc.O$qcIW+7.UrF}pE -FJ@$uh`];v|s_W|Â̜cg-a9AңK0$u$O.Y8bv_d\8צ}0ʡI=sf RždJtqg1Y@yP&36#ʜߊcT9j ,ݐp障ʤIsn3ygIW#-9H[2kP3oJs]@9>*L3{/ ;Sż6;OP1=8.;Wi|VLpH?^ *omː#oMH瑲͕>j1 OQ*/:_~*cHSXu Kߩ h|D{1ڐ[56 jbzSˁ[t,U;<SZ̈́~>:E7TZJH~l=3Bt㯰//ʡP)Iq760W϶> p&W(9u;F8*UqcߊW:pzӷ)\涚ܟ=IጂZ@zimp* ͒9ƃ?uw}jA!;}늖FJ };jl0zOϚL'J@asK"l=}1Qyg8K~x!G͌\e@3+qH 㓏^:<Ҕ x\= J;A;Fwo% eOBw{zTHgR?J{I&l8ULS`$sO$t6#Vas*IX,d ssڟC ݜ1*.wӪ:i ,p @9۽X8KoNOxT[理!NIW#Ȭx&ɖ9$v?LLQ+gM} ihZ]<I%1g;);#fE[Y0AVeDx {{u--cl` wM‘$ t븟Ӊ-j٣ôsluT$,7 1?[1[`3+2lz䌟ޚ04;S?Z46LD23Nc׽@npF$忋RU,v|^ک6 =Ƭ|p>{Z"C&оߏ朊 mk..:njF ph{ḭ#9Q(NC*9=@IWq%J=py==8FPLXzj%F)fr;?Φs&>ҬKa&Jc1@0@{v^B+$CG9映B7 :V\S`ަ);,s"|#=zu+J[FI#tHB#8 e0R;qJյcĚLj.n/nU//eyrKֶˊ_n犰ꨌ*e g5~ *n%K 9Ygvp*2OIսp>5Y:vzN5 CVe&47'0AI t> #=jy%>T( v ;=0{a^eeCݖLN==MkfIPe8',=i}yǵSza22G'x`72#O\m?֯mTȻ= 1HRK22# ĂbGlpI'ӏ"@ft,)آ?tbq$wG8m:}9)3_ O+"TFq0=j20ȑv9\'9$>{^rh^o*ktIH)% \m=1ץ4/YKdtsk#-Ԣ៎<}j XA+9 :8BlY6o.8l`_X|TNN>ƜبmA1szP/\";>R>n.El:4W2.7 $g2j TUY.pB!I,_vǾ:>u^`$U`ϙ}9#jKxY"Ƥf G䎘 ʑmRO=;` l)Es)ĬyUG\y?J;/] h5 y [#h{G5 O_ @tdڄڥ—Ak{_3gy1pྐ0O6"qJ"pNyA s"D~~'E޵{m\Oؼ=Jah:E "Ay$ g5wqE,; ))]KRaޏ-j&ogf6 sҢn @ɂ2>BW,y%pFkg^4oj^"m3U-8t  ;Ќ!B Kn HH#q݌u{uԬSfݻ=֢'PtʝO^IAȣ%%1:32wx8Ȃ9ba%ͱanЅ=1ӮjŭFb!BKJ.X`9BvcHd[e4rbL7W#J=qmS mTsř0۲H,n8k"KXf0@ѳIqWߍ41uap0`R=˱l޸ 2zsNznkcu/.X,X 9L *Dq ݈/N&HHa+ר d(c8˻瘤Ȁz'59x :$v3mM0iJRum/U7+ wʇ &pC`k o<9RE}*+ZK C0r2H}ViH~̬"_4 w2o$s ca 8~?ZJ'~#&TCrc9 g}+R<̾&My{w@'$ gqLܷ(9*+/=O<%yBsT\v=%QԹ$8spXh|v1x20.djA%>Q^3eiD6,p1p +5<ܬp=:g85<%B6 =yBls\ XIʂ>QٺABHM9d\3ϵJ HP+ k;;$gE=Y7en@C8#פ]Csgf uȐ 8*_JtE*fB2`d 8qA,*?v: IA < Ύ_).PT%*n'vHPȬ$ m\sr8>%l7sܐF2;{n0*rY3"o!G|qqQ,,or:~`}W@9^ &2K:~#bC^9³-".X9(HG= c׶;H@ nrr7 CB:~4]  F#P#w'ǩNj0 g q:YCJ|Σ='VY~m!rs85>Q$mgT#j_qq>NԲ,* 0'JkAq89Kx9O.J?^׵']%ԝG;6b}y9?Z5*[Nknv$Uٲ䲩>g=:ip%ѷ,DGq׌qҲt-O˂I?u@*A'3n%N89Ej˧4jM㜒xn.,n#/Qon~zg89d GA pS-RHěB89kKLR|W'p:NG1?y1z ]F3e):s4ѳ1]Wzr`FH7̹r8r:s0DiJے0FFIS,ZV0.m-hSsyL]};"R'-.Shr'vx{^L]A1c9a8ERxmE@ ޲{Un7_3 sK]U-C(:c޺bI N ?CgR `2='F? ;-W@{i6 p98#O'={kC-"W;_dACǵb)^܃܏ {9y-Ž}@֞4{O 8#8RF #ۊ339< {q*J{283iPެ"51FB"d7Loݒ~`TɯRbk࢑v:rr#1S9A8;c'WjzNR=V#jPݒNr;Eω3WyX*JɎ0Nv ^-frdoqr uŒ," ">cgN;ls(XAq"0'##xjd$e۾C$c6H@o0V(I:@ }z*9t iFҳaRz"UI %9E txW>TVq5H̨ RpHA,~UA&"d9r6#T3ǧW?6G~3W馹1XK&qN39Zq[*%d@LʻE ̭kϲhd1=uj,ż$F)r ?1#ךT 3*3dwуZ֖RE-iw*IRN88;Ժk"ʡu$s:gNs+tpM^9$u8%zuf|rYeymE$G=NpGԌqң]YacKcG$ҜmqohAUW9gc*֡p\oa#w8lRÎI⚩"U]FEm69ҫ4,$l6|sn냜~9Augu疘4dE8 H$n U Fz|uNF:(hc x$҆YKeM.qÎ}k%I]Sn7n1٨S&A+C:x~2;IW-htCk$m+K"<:Y5IDUڟx1SRX$'xUT^j;JO:B˱FlPZ;NvY<ۄ ! 2ĩ )<9s>rݍ[ I^U3%́%' Qp;sUw5BAcH< '#8}p"bN!Htcߑ5x;T|Ă3sӂWgo[`w+OښdI$h" C;H3G'1iȇt͜`d*@ \OP,83׃Wv%k2v$!$%هӚi"%7T$!wq~Ƣ!0vhيd㧧Z źcvO+y <Q0Þк,Y|Q$?2`r:qY3eIacN>ks A#?ҕ4֗K1ejfN)x$A?Ϊ*Eg͞Ka,m+2 P o8''I16ޥk)F$ O:͌EkiV9?@F>~Z*g's}jio.BbF#0=*7^r .efBB wZ"A%2 ۞sa0Iq¯rI<?3RY"A#?\dm,&I9<g|!xmDa"003~9TˀH'1=?T& ֵ8dH,t :dgL @s%8ϩ|4`6CN{S 2=TX6<vlQ嬢9_@ҾrۨxR|„;MMJG8ɩV\ZLI`Rrgp=?JcA2N?އ(Xt cެ,֮ CdI5]/mr#TBQ#*<Λm;X6pl ,a:mY5b=. \($=y绿?) aޑ5yZ92> g?˅8bT#=+b]mwT!8ؘ(d>`I!܌qFsО;U\gplFpXy9*`;y, =Fi\50SrOQӧ7q߄'=@0bT@\N"wۼ/<=sYe|wCpT܌`qҠyь獧=da˻~;R I.[rq}zpq14{dI֝r,Chy7''js>T+s=ބF% ?֦ǸHFHscR`2ه!0 gI\92_~ב G[L,}XrqϵR3m7+9:t^j34, r:'S*8UxЌS8 UW ,A%?O%ƪ$G'RNw79Cϧ\tDI8r޽xVZĭ!@͜ÌAZ2%g'$;t$rPhz4hK4BTwnz)eXqH?3/nos߉~Ixaۂ6=~58Hj X-j_58Ἣ}>--)iӄ*$ψwo{¾2נ4jSXy <2۟UO?g2 fդc:m"mrb篗#&sl=KnoQ_j,祗sX~RS\Pv|:ƈ91W€em$g~TA^ &\i 3Q(1٢p\RI 3׎fQyt 8.-wNf&vd:Ѓiyk$p6bg'* 0=3X=$h#yTsp0p3k*JC3Xʲ۟ l;\֊G9bkLP 'O\䑁]:)LqCȯv xW IQ6P؎9aG颷ΚEWUᶑ$tD K`}=GZYޣ`LJ-P nO|sջcxQ:W$(e>ځ@8=jNC-2 d# ʑE ~*k4~xRj -dyF# –9WM/W3ПvocѴ 7Ϲk0H"S91W'+#Vjpi!18E7NT}$ἣ';j쒕vXxeR[[()j۲,V-oc~Q.&ԡ7,Jop$OHIM g G|.|%Śݜ%%egf9r!NF 9x=W|3;M/ Z[I%j+FdB Լ9IsK+ Q:dD,ΖYU3"9++|Uzֱֺ6WObeR۸AIE0kֵ?j, V*..ZUdm [j1I _ h&~(A?n4"&K9E?ŶnKt4~ [KMGGw%EJ8>WQA9~,j0rJQZ&dgUJ T,u;Y.uK-2x4"irQ >Q 'c8kfjRkj5 AYd8VͰ/$#=C tm-\ʭq.$q!FѮ朌`|E?Λ~m"ϴWV y(Tr@o5wV{vOڧ H&Gt5i>XCHۛ{h2)b_Fr̓ԯ?gߊi nt[k[/MEXbH0UR|B|KNJ|O^|߉ux,zMa;EQP;$:Hu9C?I05$('f'%S 5wkתٸҴ H?"H '1LJ;I/hH]rzc'4GY\@N$*!G'=94=d8;öw ?g:Tn|;-Br͐1  3Ic/ٞGά#EspF[K,IX +"$p ^T~"۴*!Fr~)j]o0GSH끒(97L$KPCXgs8fL*GLd@hkvEη Ncp1@9ji)$d';#hC#'pmgvG+*0Tn8XPȲeml2>.`dț*;Ƿbx&;{K̗Y9?1p#rU)UQxuCo F2+/3Afg:I+\̸yCH[X qִbѮňX?)2إ2n%HF)f̌IP=?vzp;#Ky+6AdH,=yzRM8\8M<ັr $}H|#٬OnQ4픫cbX.y*H냑tً̹1̍F)U}ڻO<qҾ"wKU*[v H=ssȮL[P-霮Kt<7]<h#Wk+Fr2px(vl A oPc`Nw Cd85ki'٤)/(y $|K`l̶ͩ+#N <#Q]IV,wM@d,$;l7nǩN0A$6APWvP60nrOP*n }\D2/ n *g TK: g^:3ͶBt)8/=' k fhDHw*<`UwpqjHd"<B#_LuQum|7!rW`)HgV ;C] Ü#W;TarW#W{Vs (a=\ GZΕ5CEnčq!덤sQ*,A2Cy1'ֹ' fE'82: c?{ֱ'ʴGYacqr](-B.{1~ǧkӨU3>TbC=00?^so.62B pbp6矛<]DڵHnd"YJ!$1Z@*23\;'s.%[x,Cqñp̯t1G˴:~:g#b`S,۷sjb6d;m$)sWF!׮I4ze8 H^F1Zʺu8R@0le'bf3ӊg{bz+Fs#[$cZi O9Dַ\lݶ8Ǧ;ߨV*#A{OjAԤ b0H;Xwޠ4MSmz[f0\&(ҳpx9 n= s@ok2u}c QѥOke|xba"KL\81r8%$TQHr99;sөbb6NK$Ď}*j12LieCD`7OnxH8\7#j$ւ7e>A$93,:G{9KIn@#P+7cFyYE@Iebv>QǥYq L q׵M4q*(RUUat#9v'}q23$ѝzU&}ENLFrT Ӿjj~Do'9=z<hx'v8 Xc߫ӭ 99ݺz5xDaT8[p:LjD]fczUɷ+'̟tXu=sלPRXR#MK3u.瑓I^eW8ǏVvn$(ۇ*FsU16þ}F?t, 8bwz洵rGG䜰 ǩY䑚Yח$eK6B :\玸ɪg`9ߞ)Йr&lѓ ޣX61b :\;>E|O*6L>.r;yQp?{#xY ~R=1ARZm+L!#JsVæߙ?«Đ I$c1ʇMXHrd 9*_w!}JxXmOqQ#{P6Md9R<5nfcb#RAms鞕g`@agӁN^$6==-˸** sOY8GH;(\@Aߒdwci4[wiVcܒ۷/9$׊TLgOKFD'ki 7.'T<޵a֌)!{~uExjUQ$a 9nt3}Fr@Ϡ暗 .Jy`z`+9+zmTQR;w&AeI#[w'Ҧ%r/̓8䎵JVxSHԉeأ$Ǯ =1ij`yS̲PT.A$q~ 1$lOOCE|n :ּ-ֵ^\u qޞc6 x5wSڣ^ ڧdI$dpc>]Ű@X @IPd)Tv y&I%Q qs_[1;82(-ʆ=1ےHORzkE1( UU|);?AHLR"ihIlӧf`* qxz$ T_\go"JLnXt3ӯZ [y !Owmьc?P=٦&"IC4ӹ8Q*r`d\)fʷ=s1V{y&4@dm^y<1UXD$ r09黐GZcyM4o>@!s5$suDy}<?\Qؒ!"H<r)$B!+ZR@Hp"*r1{h$R8lc]A#̐>>PzcwGrf1cޣJtZ&L*2H^M:xF=98o\g~5āNIw.G#L` Q1Qrwg.rzz QHїOLu s#tD1ʊrK9&i$V(s4F=jRC,n_1PNG*}4ia".F@;sjec H`RëCf]m̈n&>@x]@Tqn #vI?5ԞMK%^_cMǦ sNkG( =#'8J"+C4ʟ@cRER\\H߼HbVgAvfQf5pI]%UzsCbM2 xldsC9E#9רg-#F_']ms]%Xc2`l޹$zvD ,D|-9fsӏ\B6B+Oކa A dq6R.F"% 9˩v g= mLyl sAsYa`|ʈ DnT A=I\X&,{w9-R$ps"=֟D^k p3H.*an`z97и$ƴ :*q<H?Qߊ5+/.HN1Ϡ7ɹ@U0@<l_E9l 2uIS4Ne-. +*so#uFrۈ+od^aelvc0pNs*F֩r2"> Upr>k^oO3Dmq rSr}sv/k31݈䒸qb2S'= ׆6C<& JF;c\KΌoc,5@f.0@w`v6VqOyvG .xOr^\Mز!.wVʜ&q_⟆|4ӦmΖֺ?qdRM;ٿɁ#Vr~;)tmOR_zšks/m%2`&FZ1"Mfž!ڴSˣijڛ4D~TQ8G?1%N+q ͦztޝ^G_; `i9k~Hg>'=:蚀I*+Dž`9"Ms]oQǼB,vd ߦ1_ଟ~x;wⅆ}RRom>7i%2w*5RBmJIL-eoQ#LM K}+du~žJ KOTܼʷ߭os6D"Ai;a`6ps{cu_xOYb5uu񥲸d#.An1~\fOƓ|4 ͐?ј0lB)/s-(,dKPV)٪2) xwph0 soK}|$YUq9gVT'(K#ݏFc^yɴnp$N0I$O>ҞOG̢m>Fȼ4D{H 8z| =5kk/yY`_Z~Yrwp9,]5v4,H `x#m 'q u9 t Q<ȒaoJ-y>ôqhʳ|䤗K=?[9Zr,w+5/ٛ➩㗄|sVB4QROjJKx%0ZW)L:QIc.|_1_GS?ZJrp5ixK:Á']f9s? &CޘtؤQI!03ߟL1_߲Wy6^!:΢_>5A nie/cLf; f35iEY&ٹ.iF>/WMZx8YM=nzoMZ]H~6RmY Y̊KjVUdmK$>5+/4\MmNYP1{|m|~/oŖnm.REծgm:BYcb)W/F5? j6^,z}HnRSۈ6@$,G[b]nkm-ױ5Pj)~_>lOEdž<[=[{[djk/ͻ䞤k?gX/5i{+6VM*b$]@0N p_?g,ڦu=w"IR6l,YO 0xėiMXS,C,Pg5@3 ˌ$b"y-y󼎟7d}>$f\1Q-_?m?ڧGe?(KOu0"Klp +oŞeMjiwyO=&q"+@Z\BE5׉ GmwkpO C#sɮW=jOmrGmΑ8!ٙH\ a<-ePoQG Y7S'eO xk?a.Nb;x-4L'yglI |sFD5?՜:3m&`NKNmuUPYߵ> |Cƿ٩-wY^WƾUV&nm/CpÕ HԟGgV <)wmǫx'zW86U!>$ir}?Ar,N[:*Qm+Ji z/.!G.#಻dd?ďL0eF!JWy!S&¾@ {\{rY5l|/QY卖&I7m<ʞP3E$mp0D$w99aTIV@ɕ5_==)|&B8-R}ۚmE+k]kÌ̊YPR2Gn>y6Id>p@m1>V+Ŷ?q\,#jL42LFH ֥[sTݒ-j[] ~PlcbTeh&Of!T8m${EdI[L2pwH ֥H*@#XhuLEp l!H 0>Q4k4=yi$FW2XsT]uH.7w88'91Ҵ)-%[x6z9v9[؊;n jI);lg<*>m*ۈF  *ʂ1>me6##ʷ7<>·4;w;ۉ shuc$F}SNg ;Nޛ@`|ߍO-yId*τ*ۉb35_C$n0 %z1m&%o8 1PYUOtLW ogn4;;s9#q5ާFMn}}9I5J壇X6px˹ YCþ6p۲O#E9%} '4m׮$,ȜXct=ONxi/t;7y>KI!@wx 꺀d!< (q0O$ޮ.od`>\dcdQRծgvٍ*Cso% 2NFҼϧYz桼C>tq$.ͥ'εQxyeyVwrŃ3L$r\Vv]ؑC6c8&V"!1 "a#>d3ҵa'=>pp3ޱn-5v(LbWspdӗXK/KI Sce5+i%Rx*#8?Wl!fq0Puzw]{{a,q7"r;`B$lǡO]q]L[zդxlm*=VD1(l`g82A\dk-/6$qc4գ6v# A'ǚNl:slj,J9نJ3OLVV#ZM), ~a=~O=槵5Gj'~ӓxjM ʉ0!Hmק@p;^K\W[qO-ĭ"Dm(P9$dI=,TulY9b?:ƋTr>28V<Stϧ%&2淒#0݁=[]"^8"]b8-6qj,< Ɂ̊]yU.s%OvVVJcFjafʒAUuk H`q)1=TdcҲo{QUP;qm>_P6)8x 1} _-f6K]Nv(>hU$ x'ֲ&0aʾUsqx >PEKOsUi-^XmTJ'נJ/hkl!Ք瞛A>#w)"8'Nz==p}sw<Fӎ@SyW'a23qi&8dyO#Sc \y`Y@|s߯Z1@ώDʁ"[93 ϭE¬ny ,rH` >-2zHV\dNv) spȫv]cW-†G szTIZHs2"1!W,>I?S֮ijR ^r08~W1%9NX)9s5 T,&@Agy6nWU(>xwÞk83@K" 8cyZR:!6<|t=j("V$p=zb2x;I%JyYQ"69rfٴ؈`wsG25H]NVQd`;_󤔩#8 pG`*z3ZhI1_3 I?bH8?ʳ6,7 1t5+AdV݂#A] ˓uEKI"VhF~äݨ鞇gԙBOnGFFFfܓ !*}g!,lVn2팮8#N0iZit 8J\QK{$I3m2z)K |݂IwdisOJ}\u?I&"3t! {~NoI[bm"{(-;1 PlQ=L@sEeq <G)ʼg2pNzoZliBc,v>Sx KGYy`?_zjDNfΐl9T? !2=H8E1acǛu:N)xwg.Jۿ+88OҮIc6 g ?(ic ȎpFބ;:$G#*=Q$j9+'Jm͹UHlc~\zŭ XdOŽt *:'LWaRN1֏OR@'R>PHfCwyH89e.18@Q@眚6p2 cKmlWH돭 '3 ;n8Hq) #񫔷Xs';*$Bpa#$v)Ӷ1UG{BC1jf6;,G24ԓ&Qe"\sFޯ6Jl,2}7Nj H`F)InA8j:M{Ye8HTva ePvxQim2fDr瓞AN}x1-=:c,2GF\r9}:ys6RŁ $#<J`Ί) nw#ϯ\=yY*q&;1<j 0A㧶GLH<=KMkb%ĔS2J<`]/DРK [mMybpy8zg}5y!#>ԑ̠=zus,>zI!T.$1=Gi{Ce.dZ2&vD;0~f8pR+9fv5x%oXd*V9mY`A+ݴMVFd%t6vn 02$뮵V%Ml[{Xr#!1#͏ T 뚌eq[m'nR<hؓF8w࿆J4O$زP@yQBU 澶< #ޛyR^\eyS~x/\7:0<lɖ6\epFFU=5o!<όRdފ->VckHcr0staW|auBI7Λ\.pTAeȯD- 9^)VڿCoٟWew68xZE1a~z gP,.] mrp@rqY(طD|,a}'#J~t CN?~ɾ.Уn9g) ۣe A1Z?W-żҥȝ$PwcW7@,0t|QVN_j>u!?ҋeo݌r;t=FسHacawpn( S>6)6;AcvԣZ`2/'d`n  a:)EdfVU3z}iίB!;I1ԟ:0EiI_?I`O'+xSKŘKhItd*O w*6s.2Tj3kXOL0'y'fXE\O^OZ\Y} 29NqN(T56tUޥj;|M7/ dd) tA +g-u-r\Dfeel99\KFV>00~UAID~^>7Hg2 66i>_ΑoILg x1_h c"A9gqJCR뢵 f >#vp0\jg%eK.i2F ݐ)mIr0{~l{TO1m ],d\qXgoVk_($)7zkގyatyGADGy`/#*eȑBqTqOz?VGˁf#t פ#fqFlu[}jHPgE!8MI=O­ҕ&65/|D@Y]|ˆr]{ߩYfC1MGa;F@'jܚt.WTN6(&^ +9B@fa sN?*yp!W*8Nn.3 U#wRn%m2 p H?(9$鞝ynagd+`+@={TJ$GLsi]ȎGP{qJGMmv`ܲv}ک\;C1%A9Fsޱe.OCW]VZw ŔzVN՝McCΆv֑F>l-sד֜,A""#Bx wY%8\=WV6Τ'YXL 霟bG0ۖl䪰8hZljqฌysZ7 qч\WҘ2c }r`tqPCfV$3ܣ8ݜy~Qs|љ7 Hp>m__I+hqCn )9ۂOuq;J%r1A_U}NIEj78pp<C['2cZjH>WN26sd]:h#X,l>ăYYk:Ҳmaw*l{ת[pRWu.<{1cI9VxH̎0B?ZqpF.K,y'98[s;V<coΦK]I";~'gM&X{*3Ozтkwc+DyF@LeQIў~:v] |}U9L9Z}I#l!988A*=E $PK)#0sWEe1E?6(9<ƧG̥oc+߱# 2H̬v嚱/G-h[.zApH8`Uϒ| 0C` ҕ )gG0`kA6Իo_Snϕ짰:Ah@!Y  *8d_TK2J搖~\2CeA<ac>J7f$=i3*"p 3tfKZ5~`h'%r6=:ukhauX69 NHo<mHP8vyb-1TOIa!nlׯj[Lh`e8;sw4r6T;a㝹*InQ0lsXr?Z+lKljVYY!1%0s3>H@~-:i!7 $d ͹BJd V"T4qkDӂO#:W?tV]-Iu.DfeIT*QgkW?EuO 5Ku{%*$-2IjW^>3x:BɧIخowuik{` QHN\Qr)?f! @+lᷚAi3\$Ŧ%(ʱ>k1څO_N'ď(~5m2Yԯst#ЭED頁Zg*9fpvaG|shxC>"[ᴏCεh n-{;t ˫*wů?<[a'[Ԯ ::iLO8y@8UUF~)֝Z*kW]':Ա.W峺MYvB2b2 K4oUWl(%Ֆ[aQcgX`zcs~֟18D{?]ې2N zsϰPԿ c:_r[s|=Iܹ8馜;qr"oI>^U |JFmo1X@-,d sd3GE1_r`Xd̏mD\(9F8"CghbH L=$^ڟฑcI# ŝ= ea9=X\ig,MOz!FG5y=ó;4y:es% ?j/!~kpiz]l.%7M-h3LIo`# Q B1S7q$ӴʯR[ yfhڈW<[,ɿ!dZkpܜs}a[  u][?>Y|<+(ǚ0#V&dX2͗9>?!w=.'g `'D#|2(\嫓NqiEQ)J^q{g^;53?p6w_5ȽKK:w9۹Z1_irIRU_'%s}s^I#5Yr #Eugli|%id*5F[f=Z^6ryX(=*z5~< 6I d;6O_W_/Ohγ恩i$4=(^'mJ?uυDE ;lCz'$_?B؇oisφ^|# +[+n},o$[K6⢷kI4.0U%BsRzm5o [~ @_߳u+Ko oJnFVf乕T!JrA95$='߳υy^OkWZ$ $bLhX,.">|S~+xG]֬8O2bqPY?o _$~x7KE7Ť ˨-`{qe/)W*O4i?kR7vZ%z[u|kJU9-tqo_V~?9=-c+ֳJ#WRD&ۉ#+]) bpK`׮|H5ylu7˱<+ <|nkw 388?n#uhZ޲ˡjI/h sMxώ< xV_x^յ \ǞK`@f % 4So%K:hќs[R]z%s?gŚWWg쬵[$5?d`RO ^ $WXxMS?4 N[)nX8r7W yEƟ؃ )]R F e0, :ƄL~ſI?~7_) ?qCÞh'B19"=޶&d]v4!Tr8랠 )yF90w2O}*0u˻D@c;SL-f(kBCBIlgہ/u PN?^1do̙Ȍ`rq=959cDlR F")hY\mH*sGQ}̭J9AKXpU.Xs5ʈdW|{9va 1Bq$z#UChd P3O88X(C(ÏU/&TD#Ud<I5/2*kF8rczF2$ٕt@*0jQx:s~ԐUB'tRq瞀5&c9N,79GC޴-ĥ6껉8UlczqYo1 mpn1ϳ:Nѱp0sG*w؟0Z@.Ք/8#=~y+H<*ׯ8k+/I0|܂\1$;Uv g=DHWSXjTd t#VlIf a{vIE,>Ya@ʚtexfb">9^ZqZF~7?ct`۲ ʊ('8?Ҵ$rʟN0I'#=>zpv2y獮7f"$UAL|9<}+l[G7|Qwdn<%yRURN(4M +NA$#֨K G-bDzjLA=Z:UDͺM72Ʌ w`CTf7Я`SNZEmČs~j[vbA9WEx$+"2O~֦=",LB9Yz}G㊿mՋ.?b#dm޴ne($e@H%' b`I˱N=8|/8u( ls ͷϰi8yty/[եW8T 2#ksH5 >αK#ɱ @]湠nloc!9Fd`oLTz~^_oh4Cavd=G. sYxY^8 n*?{:"Xc=KEP˶?!?1GOY1ձc13|1zZݭNfm70\2K~ww`8N+Ԥ֝˦e6x< {U.#YvP&aB`q/q,><ܣrO!V;U W?^r+[ݤVЭp"H;br6`v^ֶ{ ;p"b1MPy^{B2+)2Oa&兒) p21yqڜPl B2G5hj.$ ݒ0k=H 2@~o.b}FU!b]z+ H,d=O,󎜿gɠjO /sco^MksIژѕIeUlg$ y{흏.RY#1II=me mcFKUs}MG:{r?<^mPL¼8_.HʌG"ǧ28#sa쑌׳mm&k;=Fhd\*z zj> K##`g?O^3Z_Qc%V;FX'ˑ׌{kkt,|5HlB2yIχV %ERct<@#=jedEd)]1a*eUƓPGMIXg,;m9*x֛/ȑ-tjN$ץz]2L+bp8n:qb͝42U?l'GN8jZV7y̾է{OITۍV<1qը4{kwcxHJ|GTQ:q9Ϥ&THLǍqq񿊓QѴK}Aj*0*1Ќ`b^kZNWveZ o|m4g @n'q'4̖GB͜ghױZK1g,orT`dƗW./(hG1< pkҰT|_ ]ME2n]  :v]acD$bO x]W,Zy[&gAT%2e`LC'.m`2Or3'MTidbT1,/&2e ~R 8 ׂoiL+.F8#L iʂܾlOzԵ G9b% I@ p0y_쿯 r ֮~ $pLힼjibdN:T su 8p%.3b~ns[BHaap ݰx=iB%8~:4VV?|i ^nu[Fd0FHB0}*oi&n1R9$9ZVv"8$s>Xo1K +*o뙌[8EعC6y/.γL.B2#`+X,TuvBVW%O j.7Zܳb FsGcn9x ے@86:{Npr9Uyt ɶ1kc$~\uR.Qq8ɫIr?z+1Ahum17Fz ]8!p2p{{u4"Fi4|djW3 /݃ӦK(Z8|)ߜ(nB9<~HGC&N["F. 8ͶҬŸI@Nz8Z[b8n\†IFy$g;גD;یP S$zDdžͼJ3VAqM-k+"@2}#jǶ3fwSy!g' r1SLW6dC!Gz]^DIfDGQ+KA%G2ZD'-{ Ui@yWU n^;g^}2Wlchb '=k=ln@͗ddxx5Ra+ mDwǜB0\`^#Jrq#s,gVSvb;u8j9ȓFx_ҍa-nHhcR> ue%^Džշ` ~kK.R\$r?(9SYڌKge@+Di|csRSJ׌OQ'^XC Q*Uoh?|-[Ln"Mq#B \zWZx(ySޡ:\d㌺jC=&\=wM#vߕr 28=}VOٻT&|es%w!CJx2ZHWm-KvҴ9Ry5NU`0sþ$qgZwy+Sr&mO9q+qjWfI[׿CKS~??"L{[Iy>Y?v˻s(a*m9~#!&}1XnxJ/Ao*v܎'x$X+A)RdbOE8Q\ޣ]ho!y[ʸ8q'a|r{\UKV^mgzK^RJ}"ӖUz*>pBn\Vg]QմP%;C<J$/"Պ2F:_c5Kڷ' /e&zkCTwNk5G4{\Gmt# WOhq,F$nY˵$9=pH5^ k9<>&imm"#;H}Ny>օ.yzf38\G$*Ķ c\r@ͨתպ{43L6S}at<}}.Kܳ*V9ٷF%!p \ u_7[@nX)Z'3f0h>^ mOzd/ K=_ sۉ*) 7#g# 5 ?y}䝬Q$F\- m,ă$v ^%;TjԖʏ̩*G1@r>Rp4Bn^5ζ*"B%Hu'+g:Fy9jiZߞZ}+^%?Z+_\xK.k )n\r w)N96@k K"{^׶˙k rWO~IfԵA*yWI&V5]7 k˼+O*na[ݗp#F .|Iƅ;DI_ no*X>]| p$uM66e?-[O 0[pHZ,r4g?Х&}v4}h^u&Uo"e;P͍ax†il Іe-fRkxfh_%@ ALʜa'kycr_z3_>Vس_*|1!`nY|A#{ƅoM- Ү1$t :Ex (2D""wVxlռPA J{WRQ,hYZ{6IV9EYKnx_< tu&uV@HJ}(=)tψ%/n$Vs,^s FIo 6zW쵭_mmP|AdDo-J0qx$oWGP5KXH#itSfv21 S|ZFvބ|ժȄZvߖg ιx\#VQt ?T-9Ngm1nC+TWiFv#³[_x{K)o!̪dhvE }k J早x- GvF +xr0i7CNߧp>RPV2iIH{<).!H~sL:S+ ͆l"[gxx|CcbO1tz/[^$=ܖVyb0;LHw&oxGT==ŴIo 3PĮ탐G8⼪IAsԡUwoO(5~:.l,|{",q{w,•]s" ;E5LJowkI«Qx+5;w <.̘ (;$ur47 Ca.kd+؄$abZq#KWpD)>o]4m7||MN[p{q;o:[BFR1`8eE}&ŅQ/N~.>p8+=nGֺԤPwR*#WBH`zp2^9d;_4A[Y/>;iT"6@c' 7?ouufTwpF9`rc$DqؽՕ[\gi|Cm0atli@~m8KBn,\1`@cn,ԥu~[S_6G/'!Q(ۀ!tJd@+8Ld"Oz|vV]4Mk-6FH-uTz_~wiv8eo=~`!y*5t~./m!Dh eFY&7*B#A3??#no~tZTâHZ4gYsWv\@ ~ǟz~A毪Gʶvf8YSnY~=Fj[Vo2Kx#Kv@'NTA4Oro䭭oztu|9$K{kV Vῌ-$&IAu|Nԯ{'@/RX)XR F:-q ]:EYltNc5Y"m:; | v:ђvٻv]5p5x7RKFg19!I k2:%P]ZM,p:e)5!"H!v|9lvL?.ۇvh8ݍ:gĄ9=MSH_\Z&3ƥ2A]=*BO]%O,տ3z÷Ol$QTz`y@ܩZι U$@P20==(2 TĶ䧙UGFc);1 cڛ\=4[c}ьesF~#Ӎ_VOw?>zĭy *0Hc gug< вz&ui#;,!~`qCĤ(SZKG3obOYI;g18##'힕?|U Ҧb#M3`A_ogcFB][; rpIc#%Ymt:űB#Ý ~%KͫWwo )cM)Gl ^F8oXJu0iHӕ.n`zcW<5ZCJS1`]mU;,r9<ǺW6kM!ث+1/$ pr>`غh"ھӸ7\Ǯ+^14}CNk!Y!f9$smsTm DtGj_o~I𿉡>#_ƿnTXE_ZZ$JA)`x zHu?krk( vhrcN^0p1|o?gOx'&S.<3.cwsoh%mEpةtq 4+ߥGK(64{+kk/9|Qѣm>:v<0v|nebFGiY7;22w6~xj" c?~-3˯][Mw%]< E,c;7;1Y>|->|VJn"ee?91ֿ&nh䝤  7>WU#MC䳙 O"}s?9{; *q`k?k+/Gww}oY7zbVy($W;0mt}JF|ȉ& !~R'TYG5"3~Po+Ew+y=Zif7Vz=[Oo Eg?(?|=jh:^mpdJdiJ] t./=)G40^'W {ygH͸Zܓ`$}ݸ1?1~2{ga.yM#G HʍFi`۟{۲gf;k|V.k_ hapŢبIu O$qk#5=ygӣ,.nSaU 2{}b?xcVs/tB8X7Z p }uߢ='Qk?ޏ,/l~' j=wiu]Z"C4w'*Rd>I]|4iA#<(pI>7\̬ 俒G].W85|jS;GFsB'Zu¡/-3_C<s6z[~2“_?fOړ߳ĝ9o~d1D^PM͎xdxp@c>/pUⓌ$]{4|V/;mb-$It2ޤdcpuA?^v!-ԡslm ࿇%x3^6ӠtO.6uY]oh@ڻ'qNZ|d4-{Tѵ}'ZL."k\:'rR?=I=UH~AYS6Og-d]Rzn֋}Eխ(yՓgw{7PcqPU[tʾ̮+r3(G֫o&Yڬ= $k%@9vy8|i_/guIU'\J|r\ Cs/t9{Eo2gp|Ș31A V5UUJS+QOz´'&Nu%:Sn1+l- M6gHIؤ2&wɒP<'5O8*UR ZܱgĖn&M%K+09$o=Aץj_*kkv]wT̠ $ÍM#zLrLRv2ܖ[+Z^5{ED2!2qH-0k~!AIJU^#z5ɯ|O;UAA;<qqK%іS,4,`q8QZ;)b#Y,ŻFI'@?aZ|7Лf\R:.R4o; F0OX8>] 욍bүsƊrC|Υ2zOZ׷_RC_|gyFs12Zn $g `sT^#8>sĂ21^Wybin\n!#'u7ǶKKjUo* }и$n95Ǐ~4nK^W| 9YV\c s>7?-βA Ny=HB8[ w8;pg88C@-_Xj&iI l ~s,.VGyey4֮2|Nʕ$R7]$F|$d#JU%%v灣n1O䫱VQA`4OS隦5%SGB|uG$IrN_HWkn|Kk''rP ^x>8w6^)*ec~-~OJJ/]F:r1+ybqA5|C[&KPyw&Q䈋(HeI c9]Uw[RD ^Eʢ0nAc8TKa_r) }sߚ~>=yLbYӽDKϠ0G[1 ^$24br_iX|%v?#e|{;ŚbdDy saAjYkɾ&NӔP\bOJ.5t'HcUb~QlUNێ2$Cw[A6qtR2mUyGdrW9#~$oh릏 -5vC+;ĨfؠT_/fO \OP:s_ki^o4DA"ρoq*k8ӒҴ߀o夝X27hˡ“957Eڬ},C3ZS-&vYJ9\sj)!0 /$IqҿRBvO¤T Bd mWF36^mw?{$5essOMw;kV~i[x_\7hyCS F~2]z_c-FYP0b)VAԃ`/Lywq ڜƦHQ.2frZy3KS:bI!|bI䁓przۊOx-h*2KَY<[X` ̦G=S g puM/_ GYBqUL,HUY8NBoOwbaTU\t,27OZY%[o/{q (X\`3r2Q~/iZUΏ5tP.a)*F%vp8\*~3r6\O~+n)K_w?]^ZG* #dgǁUk2*28,ϓ'dwN1k>^Kڍl"R!FHƒ$׾ C×{O&Z)2HS@+6 ։JN w;tk Nײ?8>-lԵK;XRMΥdx]F/^26xV'%TeWpܹ,#~i-)PJhu噳GLF* oWV{V* k]3&C6ijVV;x Ŧ45/8^Q;?|Z>J] +^G  >`OpyA 6k r 8N~fT{[;|r]53@p.y8ZuOhV n7g*$sI9t-[_f vڍϓ%4KlE9Cg]u[FpWi,\7 2yאxAӵot+NL0fvF*o uT.Ui]N~SA 8^vR׻NZ~N/~?fk, Vf%DL6NOXUojp繄.'Q ;U nP#t[8 s-@l,w; Wu5"8._K.5'7YP\|U}1ᬭUvR#pBh8(Q}H-Gch,.ҬN7m7*{Jelcm.uF!>HB)P1CH!ws\ͭ]\.sD,RE('f8,U!`ǵu.k-^GvdIh...H!a\2dY2@e$z`˗ PgHZV5$ s:+幌\6%*c1%w,epk~"xZ\[b0=(.G;IJ@5%97o«a⵲_יƯmIk"#Y1݊JFOVZԭĆ'kfl"6}+.>7hvVdmat]`yqH&}~m~}\>. ['{Hm4ybÑqƽy!WEgPTb T@P} u3|i>(XĘw$ 񎦷4 Kyn12o<[Pd1J'[#jTL#Pٍn ~H(tշueib>PvMҭ'ud 32\*8ڹl݀##.: {J-}] o1 4K/̐3BB `stWF `K4tDq0@' צIEGvC}:y 9Wp$gʓ".e$~=u։>تUQ/UXx$ZsMV@\b6íuP$Q<>9[Ƴq Hzpx̤r3h"[ɻaʻ$Wo%$ `ȭo Vf)AO9=\;IP̯:DUbv$62O0wxrd'I1ZRت["f;8' IA +ϳCلIdp?8\1 m8Օ{"H3Unz tx$)w@p}4l'i#vɔ9av1vC$R2$֨M0]a* y ߊ6 7[]ö >t1I#hZV̇WR0IUu08`0'qcr>%F3>BC0,J+~o?ؽ -aCD1K#p8Nk;νoDkUheOO 3[P L|^F+b{أkY6d_z?n!B+a+ m$@#dIoPoFe-˧x5TGRj=Nkqep3Z}UdV6Bcpy#(3X@dOʨva^1x~'TU1G,H6KT]0 yUiM#kcZ[oOG!UI FOlkVO ^ghDRyp@-+3OvِOPI\18[O$x]Pp8?7}kF-}U(ݵMK U'ֺؼKŎu3v |`G9yx"UF2I uxJP3B#'hHP9VUv&ԉcϦ5=72=Eī4񸈀2P'ܟ@eh .(m1r  ctȯ纱! ϛ lڎ6Qv]+9pj{QRJY,%,V(c)X`=xV ckko!|NH NУבך[Y ;RJsR 皻i{̱Z2w;\c=ML8aB-.i_A<ߙu։b|_k AR P@#'mh$]Rs$%.y2OpN:|s:Lo e{c})W!W$1 V3ʧ2_\sƣgB:\)>qIp@O'=ΓC=/I#Hż5,9'l_ƈ!F0\$btx(HwH~S_x0[,%8! Q׮{OijB[eڪQ*'9'kë_Cw]N\^?Oմ(.nu$ xyXaJjk~O]$^Hl2 p36kg80b2H $-ci`RV $|I' *5Ikq&'?x}a2A9?r,d d]NplI͵܋8kfU4߼;LppSk&s,;;sQrGq v:/4#kyeVUǿ $6 pUk,F 껲x|nI4]: F|]v8;9z8˩13){9i۷ԳL3Is/MO_l)u?.ny% ξZybAیzO Ԡ;ն%5 l9HFGOݕ;BY E(,0GqCwTg\l𿁼49SI-䅡DHPH$Ʌ >xcZilk^`+/2eC7hOHY]yPH$dXmm0qjj~ hmGw9]q GNqW 5[U/'뽷ݶN.e8%I$,<է^FAPWnђx;-=ƣggRd\$FR5]N76y.5_c5tmvY*ǒG7;#mMB.2g4SܯP:QmX9T$UPTUTeN34FeUu&O,ȒKx#syc1m72ɜq /-LJhI•8>0Iqce<,Q:FBEI$N_jS9$bҦδS?A_oweki1tia)l1;#㊞5RZizf6I]Ğ`rYXʸfFH|NmkIuyPVg$b3=0U@+/1jo<i'_8RA27rx T])[}o(;|`|X(kttMyed " `N^\,q){swhHV5/"A#~:i%,2>Rfi?lu`ƪ3eeml@5K/O2^i~;-K\[=J61،?7.rCeW,-4wWJs&p L P35'n֮`ḅ?`_sTOq >#xdx['ڣ RjI6}t$ʎ1%6=]{Ğ ,M儩UIIH<P8c?*Ey5CK7Zrha+Fi1`p:,@'+9Fk&B"lmR9Y[W_jv,: V/sNFsвYE\m_O3Mݞkp'Qh{,ID ~-HM9Q.nEBy7 F0yMiG_z \꺰[Ɩ vUr;R}v[l|[k[jƷ{ 8 )؍q 7Nqk/~\Zs>x~٤L\I#\?SڥͤJ\ys t2)7.p\Zu+%Ŧr]w鴩PrH ygV4ݾ͚ӫe̞GAc4~%Պ:r"#Vim90 %С{?:ys|HGen@ NHuOٴ[z;j8Z/>'{H CcERa܌|]iԒqW褗VO>%Bm<;ȝ{,q\X$ ?< ܍V^E yF3nᱜɷ|U 60C/|c"ՙ3לu'<u%X4l!x%O #.K7LdA8+pÓnӭk^jGwc|QkR}lܤq@6eݟ0`'A^t y 3Y%~BY%#O5u^4^67x!'s#}dt%V}FIenURw^2sgSqQo^Iݧ,7/>Ӽq}7Qmn]"H[̦1&v `mn^ m&!ZYn(!s]ALrkk?x Y)n n2>`NFvxSPeuW&e͈_AܣsqKNRR*^˪&8(o%Gz兏q g0 V3#(hܔPpTynxNKFyPIl+&n7#q (0›eͻ$db>x+5e +;NC]rjlMo~>ʦ:smŸ~go\=W{2ljd'j21;E\_`u=:(#V D2Ba n􆋂i#`4{:U_UrBŔs_7t?[Ț6[o(F3,Z5DZv^k[;%TGmA"vN"w]b(`hbADpI8zQtu4sZi۬3BT7`0-Yq ԯIpّ8V1#*wCG`ua)ds JyŠXid/JeI r0_۲_6Jja \-Ғ0~zַiS-r77ŤA$c1?aTV)cR`G ;W6Ui iY}IE/*N!a- ᙙ I c!r4? l׶3nvi9Uk&JxటIUk<VoaxWҭ,{r1xr0N5_ۚ.5~ש{^t뺉sZ׶[NkSⷂ-< W¾S6_MBH-5|8a1%`_oO>?uωns_L)g{i[h,0 9dp>g OxZ2Kb鯯_k~e̫@®x@q?w~_|@!mcJF yKpoU3a{,hQPN4N/W9թx?utRi~k5K=Þ'njM[Z-w&o61P܈aڏ?YUw(l8Ն Zk^25v{K`T#>RQpO#zYmh-M]X5<eeH=hA lWp$y<X̊62y 8+'rsVqXSW0%$,儐d:08=#=j&jZa~GHdh@628$k:_|]|yҤ/ؠ 6T9 s>6׵_`.=8Uڲ誡P8#zr_sFJ #[#(#yX+]FdW%sӐ1ׁK%9f*#mVF` =NFkV+ovtDtR/4hzj7-E0ądfAi<ZMDžt+N-,:H ъb=V_z1>٩(Oz_Y?=.d C4gH1Y9PI&2 ~ȟi KF]`+p'&xxPɐs "մookvf`4 ,2ؖMme_?~*e}ƞ&&>ig{\\\R,SgHnMD>:z?< |1yCCw2iV#%#OULTHL7*7 k^B_⇈Z(]{ISOW|ρ b[9dX4̊A9nj@' o3|+>8#> .u5 F8bH8|6 -KJe)x@ĚXKm~G\?9N YiBoQk?>P]*ww-ޫ5Ē>-,+#y@?vq<mw_FYry)V0&Bw:67K 3k j:-^ݝvrZH "0UTk {95y|KZkڦxO0ɖ2R@x\<1%=>>/qVATaA)9Zfv4i.k>[?W"~k=߇;-^u !"K["Д˹U'x| Y UвbA}[ kj3"XMnێA@%r{tw^?Ae'zk !qIo55 Ju+[ ggq&"`8K.tbfZc0G4a{zqo ~?׼Clxķ]eLc?@+q0+ |^g%AX[\P4tjRmKǚgMQs!nGK x_o-~|IḵBU(h)ʮWt >دNY^ZGƾR]_W}n}oxEvד-О6Vv0,IzhF*kڌ>XڻY<#?GQV{$PFX0PqȯYSh={Wsi+qǨ-.\2$J>8+uO~q{k˨YI6[vDB@rp _я2lvW_0Jr PTX-?IornWOnU~! q*JA9X'+gLc]%Т>K`yh7.I!>wR8'MSXK f=aE款kV(c9Rq`:7?l_"Obo/6kaiib Ak{|q8Sޭ>gx/.-A4xKsZk//s]7>oUfBQdǻne%FI uƟ jɸeLfQ 0Փ:oב??i c\C5c1c;'+n& 2`p9(b7+}}ͫ)D^Oi>8XךA9H9-PmtV`,w݁ .ˬZ w<,A^Cs)U dq>P9+mkyUI«*#2X†+l5gHhZ_irU,䃓uxR=ogv_RRI<$^Ԭh&I4.do][p$$n\wkjK";Pۤ YuˋeBv_.R2x ~\U x mYDeMb0HQmIK7lNkjNPkZZ>ZsMP3 s8H'j`k}axBq }B+|j o'$'=Ev<gxBcs*pPx%о"\y  cf$U*ї.EЏd㪿܌,Χ>;HĵKHS"F6`,V6!it{ k+FNIߗtYGikKYcX >A<':|)/An{}á%E77 3du<59ԴϗE׹ sxSz65[W=$I񖹪-54?e,䁌CjL}%kwhͨǨ4Pm\94`'X\(am o$@Gi;HU6]mf=N&YG7Rm-Ӿݾ^G}:qZWh&͟d(fkw}8&Ysֲd/A [UnI#ChU =&VҴR+OR)q)Wu\~d # XGK{v8&1X#w[ gx=w*{קv:8MiriƍȨޠ00f= 9!߳A,ᑥb~[9]n]6kOONVo &9DѼϑ ABQ `媆sQD#J`ncwD.Iq"4+x.4 fƞDVm%2Uwde2@ >^x!Lixw[ 6n GM*dE z(סK3τn[O_۪<`j^G|%/NϡSnnyg#P,@r~n+ë;ҵ]Eg2D/\IczsU!4)7Ky!0 ~85:NHbETJscDr>Е9 dAͤ;4Gl U?P~KF+hy{HGpA#0 c. ~o3RHBBU$HB=JjYurm?-1o.vS_߆V|$L`mqO&ҥfy%iBgu} G$\Wy$w:wí~ >`cv*nEu`p/́i) GQh|{ۨy| 6xA Ю1\g0ҽ9>ݺB9++_RjSy:">G%N%קSݝxfFծ[˝KTuo3!lBEs,5u"a* Acl1$k@=z]hxRe2,Cov .-:9u)i-!}tꓷupKݿ3>xúIq5ֶmdul][x\ԣi'}- ic̏`29 T1^[sS3{k,LH3}~_u4nKO?PmckbT3.X" U|RvuI"t_-$ 2 ϘY&k+``oo] :R~r}*KwPi|o{!&`s$dL+Xrss|pK].;ת/y\ėrw~v 'Y3L$. e_QܶnJԧ*J,+s< z&1R-wPN#a.PH;X#\-_Ԍ|r/;WM.-HBmN<1?Ψ5Q}å)uy7 k$()ssdU)qLZrHd.e$@Xr!O'#ʇEݪ?CqO>BcLdY|~^0崳/zm!|fw j\xB=1@-Urs&g_eMmw' )& "PW8;Wf>&a<M[v#ӣN܏bij"G#@vl 'yש G,^O$ _6喪/c O( @n1 %|]\]ZX 89ḛp"Ǖ7|Re(do}QO2YF,UK((%[a^W1}EAFuN9קx[ư "i#r  t @1Z! K ،wBrIC7Wvd+CMS_#b/tu+f2eԷoK/k.33İň*czLfٰbD?hۺrf@mMOhIc6Wo} ܥr^ΫҔuziiO97}ͦ⩢XTK/20INnmLM%(Uчq6 3Yi^4/.07t7b}}|n6,b@w+t+Dפ<,y?DO7r2y>)M>~-39k(hm4P+X9"s1.GE Vֲ$/9yS"!۽X/y0ׄ5[i[E+0`0IT * p 4[HLC,02NmrC_MSn+ /-dyn//&INs0Y *۝{>+^],hyf|g#b8I̲9lN.Ӏ:Y? g1 xdl $`IŒ5,%Z]Ro&Uc!ss LXaJT =qR]>ͷcnB*9m NIy޽^ "B1$e Fѓ+VPVHG%dޱ_#AִxAvTǴ4E ?26܎sR?2";v#aOnzBV[5Yd¤T%AiV*OTHwRy;|9H˻?c83ݨ0se8'ӊTA83\ 89{o@<8f"I8NBKV^r,Yd3g<WMq{=oa+.Ȋ7g- 9<vc7wN8\`>AqDńc98,{\X8mዥih<P=ahѝf0J& 8T99:vɈK;7ʀrkRO1vnR6c'S_Y:{x3,q;g=qL}_*yw)u>C_aK-*[_0QC*p8yRĖ!s%rsNa=>,߻cr|ii`  zGj yCBw >\85yHV%G~dB%cP1 `d߂=oD>[qS+2"blp pkQkI(-%6JZH؅8-zl # m_z@moD64@R!$fq rI>-j4;dEB Av q2;c]x.0u#JIv{-l#([wDasGzHyyYX1U@}[w2Z4(XIZ\zqn94gΉFnip7[sl1A듚ƯՄ}<ɣ'E;x~ZHg+ʖe$㜎95;W>0k C>m1YV%@P.<q铑WN%Z_W?"j;-WSkJmn6N€I#nUysV̱_\?Q%CFH_3`~fxs? dZL~L!iP5##qn@ͮlClcs'kUX¾[n UƎ]K$c唔U06^IHW9< <Rc8%yI?]_׬K3>%J"VU3,NGNro]}~yQl/]cvK4߿-IDDovm0C'/kTKdT`GX9 G6sR~nX^c/IElaq[G!O֠a#;MpbCK`>gp/eozmChgv+~_5j[L.dP*g 诟ر!G'kv:΅jlUF7Ȉ)@I`<+ۍ.+[A{[O K$ʯ\t;Bc#>ۛ%_Z4$ ̼v屜90|0;m6z*~牾9x˦ZYL-UQ*b8`P@(2['|?mb j.Ө]\VF2w dW˺@IBw|m?.z+еoԊO[;ɺF~vFM{x&irSYI6yeQ^NvK<7m(jz$1Nɮ# !bAݕR1FH5Gf6,o]R2r1|:SsUNgo-9zv6)$vw~:𖷭KNm䙦[P9%|Af_v--"ܛe.瓯@`l|!M`iW2}]BZ8؈(l9XH@ { cuV֯vrt~t>w"[^}K~Sr 7#k4>=*4Qhgv wwWm8lnxgMk}z>UobG*It x&wKTT7$h,NIcÇe7?movꬹׯpي)~/iYWj&Ji(,]:gz>kvOuk[EX>-'vJV^J,xaneffg ; ՊAK ',,I.l z5QPrug)^ߏzxrx[=a #ic;oQ/]odY[0]Ixg/˒ym FA$owuy1UTmx ⨛zdҡ{cIe+H P.P%'j|SN^ߕ/ёVվ~ mCM<]NWE3gdaQ~V,2H$IkNo^#ɝo193 7.SI.3*Q]nQ^E[493!9 Dyt 8Tg8q6"ܝy7M )Pk k!'|a"$1F 2F6<1㼽WZ@t),4k! ʅ8$]ny6O9&2?l1ٸTǖpOӵnXym;gOmp$y&NnwqNk鮪$(v'IϏ:M态!O/<&9;9$[Sf/;QTS#2)P¸[z V QKİd=X Gk^TA;/^_UpTۃ18 ]08(B\[ޛ[צ)^Gk4Q$#gCxS fO9Ey2- |}_[[i[yWmyy?1 sx[qI_tפF%<D{ub|c{[b`(홧Dv,Եi7ڥ7YW. A PL>ϦERU#^$]}/:*>Ζ.Mg@݀xUOX7Kݤ3&DtcgG*%A"(xKt+q9&mZҷ޺?-,;i6_4߂>&܇Fok3 !٣p22Kr"t &m7P֙kta{K/uH‘=M|ץ_uA=mZhɄV#qRu+A.ռ/'P0kr- +q8x70:b9Zϫךy6TcJ&ߕ<LmWKy3DM7,,H3N_P|]Рk{_"Eh1 r]?;<8; /+ŒGorX5.6gaJPRHկx_=_zgop+G=̒#aV3v..25K+8US{5մ_1\N6]/:˯ ݵ֕k*kЅlG݆''#>)ati) y${ݑV,2 ݕ_(4Vzҳ,2PeΐVnsI 澋ϖE<ȗ+}0D4ppyq3z2f{ѶZ، hMOE=tٞWsxZȨyp[e_36ie4A$אkZ2%3&'uc(@PIyWދematnld"A#( rNDt-f+[o , akmys.[ko$|.xwˉIi')[~;MYӕKm5MFYREWF1S)0?wq5Tqw8Ko5T{ q_vD-4q4:#a&I8 @SæێAc+.rEnmXH  yF*R==珉s sq' ை_ .bE6wVUV',pXK mOĿm_gx|#WQ:j#Hw'Ii9;ya* {E+w6wAaQ,>S^VqxjrE[n-es SFv{/>%4QxynKhds5aY 8PX\՝?xgWŷ6^ޤRjm`Y2$u (]U~ W.ǭ.Ym/IR+}.7Dyh n?6Ѵ >!h2\<)yy%,&h-#dnodP w84235it}:WZqMz]zG1rb#bP8*@Dcq؝W%MMaM4b,AV)6-[r^)j8t :NUӂw2\ܿtH (#y)>3oD|~ZvV^+6bpΖpH_<3$\=ê]\tvRH+;G累#)5(= x>o-wƾ%4B kiY]_:P0|4HF/nj2kU_'~ zXr˥xynR4e'?9啝+Ɩl"bc$€Cl^I 9(7(=?Nˡ>y%?/S) σnhwėͫj%܄kkSt .vf1b~ 6m&}jJznSߞM=j݋X65 )n)V O vrA5+Edo4< 0UI#u_e7Xj|#_["opPȻ$5$CP̙ 2h>n|emn5r-;Pxy r_Sot}1hBGG擾G. kS턠\m1qO^;,<*-lxB9黭~F-eMfV #ƬÜ C}s@Yȯ!BʪpKm=+V+HRHw);̊(9#ӿOpp= m4yԾ8syV1Jr28N;fk; &wf& |߂+3"4H0vSHsMD$eKHź{_~Wc dYLn3; ;v3?/~^wma`mgʬr7)@17}_$f IL$\|RO XcuI#43D@KU݃ÿz.5H^-XuZDXGBYy3ϧ\$LеBF0<̑yfZ_?>3h>cE~П\Ty$kqOETAxc{mJLE,tp)BSP:ԓH)j_e&"M-`䌙Jg8 ެ DK8W{.n!EU*$PYl:eұ|jmy% Ёq*b2`7 @hl-%pOCd/7>"~_ !ZX5/Z[$MVZUϕw3|jBEC#2d{֎|v*9'5ĺ a_ "~Ӥ$p:I8$`+ S~VgSVf] 6 nqs8y|]4#_޸$n ŽNGF>_GWZM,GU%\k(;L\'Y<VOӾ?xNPOxShcOz;Pc"pWpɍZmH߷2{^n#2y3|bxcx^y.Y!w9^玃}3޿ԲP $5\\Ed {'[eO?xN݁7^BX7 +3_\K|zgt=zȟ^Gm# Lw6Sv c 3r;7w/jZ["MmMw c~׃su}J7UQvgG&jk◆#h>/xf麌 *F8|he@x?TZm9EuaFYxUM]&&X#Gq|< $Y t@?>n5'9nk-Ca,~h R? N@sR*t]4_!5ŵ䶥a[>bqq ݡ(7zS1tSϿS\5?5]>VA65P=MQB+3q_W_#os^߲>t7<kk<\NEt* 9#G; mo0ֿl\M͏#W;69Y,odh JĊa~Dkmw =IjwGE{Iڲ.˃}`82;Dhֱ5ܤN)i Lƒ)A6|?/x6f(F6FԒwIWg3,jWsN4|0Kym{Y=G$E| ,6,p9UK+rP43ʸb05!2T@ >պOŏx^+P*]]Yb%t!]jr-a%T*N6K(rEEjAvݮYdwjQLW`"R%QO-ccVCB{ia#Y0UGRYJqe_# R?j:, _x{Mؽ{^EUH2z3l6ګ> Jӏ-ϲ?PEeC3KU`ʨ"h%.@HHuݝLEnonV%Y% 38rUkD5%4WDڝVfT2r#P<;m^6 _T{bu|H+!fn7R$9?no&e{E_(¶{,heUbmT|'8>!~$wη[iv6kcB)`<ul_m:]ڲ91W7ozvWb7~AGuHdQ@,{f3;֚3%S@>I77 tBH|~nRW" K!Gd|`~EyƧkjEyd8#s^,ެb Q '}hpόoa~|BԿg}7LK aq{g"!s,Ss r; //jV?A6dQi6Qx_"q$` R_0Z]O sw+n@nn%K9~^A;&GN3*LUri }&,$ ۙIʂ- E1~d`˻zIԽl<>Z&UnOM]X ]w573ʗzkX ApF zN6B=L"#]?4*Ǒ7Ò~?;4.Ms'‚TyYa@M[NꎯK,-|.6,l|WXDTq4-?_[C ӦۄoA+Zi\}hd_)4ݹ78 C3 hk~cEMemSVؠ[-8CKtD )]\hxhvj>Ѭ$ԥF00HEBȬ>fR60Fq^a1i,UҒc*9+ڲcOfL$,choݬ!X)@⟭^2ѤӴ#JW;XsX!!Ֆz6v%{#=:| ʻ>`Alރ+_Nxo.`U  0) rT_%w*I+?5k>϶9Dy +>+3tLC|\ʍWj f ç[2t3X22Xٗ*8%{-^ox{W!J.,eI8$)'ʏY]&'J]b%΋hbp#>YJs%۫m߱K/RI6Hur )'qy,|+*$ s.I 0M;اֲC$#T-$}A>mܭ{ҼYD&Q $cB@@T rvKZ/tdŶERL仰*H6,FK5Fr6^pc8nIE4&|%6f),ۂټIąPi]Np}8!i6 d7>FuV9b[y/e1J2ds+uUm>S͖WkG_ַiI41LYH88 h?/o&_݆C|b3#'yNx^Sr ag%66>vs F8K1]Y -^z*!97P(gݵz/v穂"^N}1L,NvEb Ǩqz'#_%J%7n?˒xBi(? l"̅^=X?r?(!sҪiZLMm-hy&B1#@\6yJ)FZ)[_yS7$#Ia1㳴.06rY%G|cVinokW8U ZY} ]ms8)$CjńY1; ,jͶ4׏.4wQK 9݃ +yi'i v"S,dT:wed"۷F 9I<.ŧn٫oownY[o0B2a!. ny,݁K DM(sALF'o<sq-{_WќmXmmP!`IdEa"c#z`csZ(s\F: w`8#ܞ:d.#Yܵ-(|"!x 8rkmx/-漣DQ"t94|Xɯc{J]?67*3`-I:R{d Ni/obC {~mâzq7Ɠ_y%30 VnF:dO#55)m."kͳ3al[v\ֽMռp{g I42xUJ ?8()"ƁaڄMz.jeE$n!$1`gk$̱O[:H>tz9B pW8z3u%\ٖI9|ewތLWdnprkM3H0ZE*s' +W xvJ (TϹBPF2 UzҺ3+E G>h$7`.p$ 5eg:{ʶҴ;|Gބ*@-x#?7#ϢAaW7[cIa ʐe|#ӟW^xHFWA,J v3aɏ*F#mG9;NC ڽz4w?%N=M/"R&T)c0sqqۥKgy\\좔nIĢvAf,2y?$'4U7I<TG@@=K r98%ˆ&2=<n--bKB&v#sP\Hco͖99>qEԪJZZ܉5] ŷpTx8t lچy3ͅ\?(3}2q[z+$s5ܓ`2Ia5M1P[[EWaQۓ@Hdr+Ưaോ*YwhSD2G(BAʪO\u>wMӮU#`@zx"b4%I#FM,aslEs׳E)y PYv=xT*Tۖ^"-c@ qʇrݜ@Owfii08~"FѪ± S1И<?^!Hcup#y䓒\GC9ғjZz/jI&&Bgn,UR8>~]qx=9E@|KnqM\JB#Bo@䏗|N:6?e*,F4;fmR7gm熮L2BXFv2{k4^}?2̴5[So'<]giQ,84 Q"̖<$fMѻv<Ohun(.X-Ĭbs M7du3ue6A,&%Pܷ!s€zxիC:{CjpUƧɈt]:+X%%a ;H>Qf@Du{kXiʷ$(H8`8W[:75+M6=Z#̿ YI 7ӊn|1MWMW>}éK9RVTwl ҥQ{G3эM='ieͩ!+F-V۱Wp(֬"hifMܪ#ӻvx=;Ow9YѦ*@7O5 5ky=>T[pcr$K]=u_שs}Q,Fo.@8<cy03ʫ, ;% 6*x^{o΂xXwYB c$\4_JOYԍ@A$<eG}+5(գ,xnNm5dCt8%fSާ5XܭX$)o& ~A`wzּ^{jyqQYy(c7nH?;]WQP &9 F8aTNfήjVQ#> erڗ*ZOoTߑTIϒw՛~eڒ"Xxlɑb 170O'i|`/lDb4a`.0zd0x (9tl5k|@Zx*v< OmH y+ Luc%1d)NWngʨw?6_(Tu_ *M۾ 2Ԣ ;TA r $QU̾Ѯᶓd7K<9IdUn y8K"0N)-[|P?r^v} #Ji.`?:[&ʌ288 H9|A4s}#l"ݮw0J*+[qo%OC<4L0\lB\T1#G #Ec+,/cqa?p d{:r):6+ž#R׽Dwx9C4̪b"`B1dq^y[ω5-%K]Vܴao?wr1$xM=ėSJ9 HPq8<ܼ;oyoTIQLdRِ|AUfC*s_%JFpjz;|Ն X:OhүSY+ dmz>|t'7W/$68E߆xq95{}ZV j 2* y 4P+XVx!i.a(\!mC@#&bYB#7^T'ma =) n%i63 wmS˧54i<覆8$ЪQ0IyX?fz.ۍ7mw·PLe$;Q]QBK1$c$v3UmCA"[[Fq ^72IaH5^XFR+75SK~;XhңK[Lu 5,ŢD7 `+WqOOm#1)ƦhlH.2 9<LuxL1lUYI[ [zF0 q`V֙Mw?i,.qn W1#Y m˨nC@nkԫu={wsoޏ"}`YGƗڽ94 e#x>\ӌq]yuv7Lj܅]l Foa$:}-+v}e.}n ѲξZXȭ`?W"D#-;(QF~d9,1#3ppߗީ+^R}"7wLe]2LR r&l9"qY`Oҥ U;6rap䔥c:x4Moi6jm%K31#k6FGE _O[wnZrvqB,)&`Vq AoisExY#%P 3fxAp+S -4ms¾0ծF[S$@pNMt9f6,|VN_mgE]w'>8:w\K 9&H9T;qq/xq^u ҁ 6It6HFq54E.|q,7RywvJ?*MrÞ1𞇢F"6)$@K Tܓ+8Z(*rI{?/{vW ΢߳oecy&_)4&;s)[dN@8"^@-6H]<^&$Ixr6 :M|5$ J '@OۇFO^U<#g2O;yrOCܠ 790<׽Rs:Mug F-9=Olt>9-LF c%] .ËhtEXEZ@nA6+*37> x:Q3M [a'*.][FcǻS,5H[~n&5}Fi-yP#ɏ0}PaN˒p/|'X= D%Ea|ɌJK\qy I~o=g|U e[s2HQ^dS T3jgs5ĭHċr>N M.^E$խͯGU/M~ gh h&Fhg[hmEI967}H1?Chz<>$ Q pG|㜮 Lm{ m3Ox緵ʒg F0IbMt>;tyPAJ>R >\p=,u%]e}/S.u#NUwfm麗R6LUݕVRA 1 1|P4x{mx6Qc$gXk[_`K]EfbJDrKF`n6{?⏉ kR<2%V֗倆+#P}jCgΩKXAi\כD=5Z~!+>_ՍQȵ[v7 2@e W#;xo|?_TeoGs$Dha;6pM}|Y9#{ǞWb7s鶊 hVH78 W%,RTUZs[KwN&7Iubv| 9%ﶞ[Wh1w@WIk/P]kvZŬep;˒y{¯]Bpo^6Fr5A$?0|=Hs-pSxnI]'e}SSVӪ|Nn<&rp d`czE%/^.)e'k~:;약M씽Sv ^oZM~2ҥdu(;s\^Ѡ'C ^>F.dW7$ZY$7Qbep>UX96 /o?==<+1"ib{%)$1%A VӔ#徉׮S"W{lx~o<DžnbCxkm#p ` ;@^:J_&Kia;e'2`+wW^>G]]kw%Y|2",i22,=>ڎC|GFx-0!`|1>}Z/n5]/,otEew! C c>p#\0+ѓ[Kiz4ZO{H䄋kv1Hb@ ⾵g >.kVR/m WIvJɝVHP2鷀bßW{]^K~ i-0}STscqQ:n;udQP AգOT{knbҏ?^Y?KvχG3[0* "S0?xc9o'Bpb]F!w.pk~ǿl/,t&-kP|AFbڧre5GVoqV^{6B&( DD'' Ƽx8zB{nVߣ;p=*Qsyo/Y}6#P#heC:=+( aY{:y<+]=H$H4 ~p]XGg h6mc^\,5C^) ꐾ]lRO"G>DE864#5Mڼ+3Nf ;p'e7|i[ѻ%W/a7~V?悠Y>BDj.'- 2s ~ ܵ򍻼1 yCnNy@@MqkZEׇ4o;$Xla݈mbs|!_ |%vy33PWcqp|o;<%Mėe2ȫ vx ʟ|?S Ҳ{5:Q_~Gi;BdiŜ nn$:sEHJ C0K_'.\YiwOk2svR `7"yuX^0hֶ6ՠ22$YP$1KL/Kf<_>}H]Dhȏ|+X'U? xnm*kV֞UNs~+.{!]CWmYhPc{H6eE  1{ _7 Yl|0VWrJK0ܒ +'nhhwH([r7fyQI*ʛĪ%mp[]éV-.5o,A6}A l>"J9GݹVoZF#ݫuxglnu<{ jIT~m E|)1Fg-q,ow8cna!Ws4+(AeX28A+_~:\fyy$VaIBnSbGlqW~Mu !M5ZımDE#, yvJɩCX\NJ}]շ~[DK$WSj0Oe}]C\֗rEz|(FI"NJ{m5_le`d^p>^ӞIn'iM]M mhm-R#pq |,AUp++P"]yʔRlp{|+S]lOX|ATSPNɯ'?KQ@>&K<9&xtO쨵֜Il1t@rNMMBt;@/6XsjbjO%]$ppNsǽgx:G}K>&Kl.5}B򠲳YEc3E{&>~f'}{[?Vy`/J7bN~,.,4=,!VYm d"mlz:į~>5 FP$綱s*Ih:5wuO`Rk >$i,0Z+" ĬxWt7- mŖs2MȶGP y9!gw0$pb1>ʌ5n~_r>O+p\?=IY^_[l4EK]m .[w?upHcKxzާw̱^ۄ DtW?l?x{XUׂ%|eVDAV>J܇C`t Aož2nj|q,Fx͵.bm P9}n#-I|.-~=^'tau*;?(_]P#s Q,+o][,^C%';@q*S swm } Oqqec[pKym#D&MĬ걲$#վ6x+Ŀ|u}_bJb@6X:q 6Y,ąe?j}g\k?CxtJl7\M#e*NEf%J?.Yu`AJW[Z7Z5b)N.jm]_ɟwx'渋T_/?&3rdWZKpih;U {P[,{_?~?+xxD?kmMrL2EIHfGWPT_]|H>xwڣ%mj,qkw? RpT%G5`ƽ6ԖUߺTU6̠=rNsèEl'.%$ar~c8%u8%GU`7 zg'qlɇ30x8+2eh@AEp_ O4-BG6IVhn`ު:mۂI<|'-+sr[?Z/??hg\iGuφz/5 jzW@ %VO#?K/-TXJ#2YbI88Zߐl,18F3zq#R\*vISsqN2ٵ1 +n#f2͞p=zXL gv1G^:CꦇXy x6!2Fۜ:wQC f%;2C㯰ٳf]D%7>,W|coeHQV?ϐXO~WD.$r#xt8G\z+|>׼1F=n:n쩽s1 wֱV`m؇Wlo:SiF!x$ $]N!S>ox"c&nu跺5,Va8<HJ;@+?! kL ͚J9 JfM˟׆K?h[ٻ BԴilO`r2V{`Pd j_燼=/tnHK19aI;l!:|+k@<$7q!9Ӱ_ǖrIewUll_[<Gd;ZE;/;ݏN"pe*k}{eVTTG4ted 8^#X'k Wve ěa&H\xʐq]u^AMkuU *FviL`f&O!ci z-m.0 mۃnĸQ2bQ2?Ju;-N$̥~E_|27Z .n[\#1&BE 7϶OMn~?տ`_[pMwkK@*S"IIhɯtOW17 wv_qfbIy9mޤ_Ng7ւ_S:bG(1EDF8A|ކ Jk$wrԔM8JJkIG/;^QjY@_Kib kr$w2[f[⿣?10IUjBuiloz"S2e{>o#>|Eޱiqg>xE[[Amr 9c;bN:/>uԖM2qy}dV avX>Lec>tG--co5^bR̲#Š~пWF>pZ=jl-=ì/s:HKy9l2sll熭 2|go앺-tG QU!)E}WUb=߆-J!-m1"8\w~P?6Zss]KdeI#Ef;#l s \Whk/F"|UIJ.UN`V>yWT?:|L]j?m5Vl7nT2\ R% $Ga澯<>ƤgNի-\}&]ss mcG᳉N$:̢0BjGlq?P?}cN6q*XD '̠QR+ #hӭ҅[*oFps;H;O i>˻Rt웋1Ƈ<8~0~5KN&~Zh_%=.{Vdʤsʎ3_?gS-5/xgbַwX'X'yl T5Vڰu*JKқV1w>c5F45 %oLjKC|Ruo BҤc{~X@=)&㸿1g!c ͞p~@2Iݟ=u拧4o=͌ڊH_P2c2 c9ۓo? ZQ`0U#zg]OWج DV)  z'-<5_Ok[^O,g#!Y^0|y, s$? j ms^m28:[6u+Ap!m*ݲ2N9pEzk?nn6<; hRP'qg1V btZ')kT:4.#Nok.[(}2p>9*vNqku| ?fK;i;] YgfZ%0V% Gcä͐ӼxGҭ"K+t~U[j3ƾ6>|^*1f].%xTy]:j ԩo:f=tAxsY-:Xv֣WMb*! 1ĩ?.A9uOи|sis'- !]"8Lo=`iXWC8y"{ICFF2ryWVeK&s] &٤P &<6"Fݨ}<.eRSjpG'-|^4kg{-ݛ[rOdt¼]ֿg=KR6yO8V-c!\9%iTۜočkC/kvX^\ m3Hэvbv||;Fm}yfMXxdJ3V@B@ۗüF$b*enk.]M[^+o)NkeF-7Uh#&*c0:SoCѼ_iqC{ [MMY SBXܩ߇6zXӵMbKؙ{8(v7`TڻsiZW쎛sn0= e1 VjjR{QokTw&8˖-Ѻ_:zz&+Y YHicdI Fê3(<+{ؑuVHn&kahc ʤڥνxS/.Hme(>Dy2erp.3u2\Q>zTboӝK[. }d{xˏF kAb2M\MsqkSKmu$η-ow\B<Jla ßˈkrNDcmꯜL 5#C.z^WxxկHD (R1;H“^a'L?}k}7miK*O}c Z_Te,6L]ž\Yy9 bUimrYEa@$ly+N0WԣKe`T!cT#̫$ACwů>xsa%ж67T|%w+-Ӡm᧤'O ?|AohA# ȖgʞBHlAēDJ4kN!N*rnĂT8l|??Ǹ4X'&;;Y;lb=Òܓkcy1I&vm*elz.:brw[~߯K"*4չ>?B[iZN[Y2<#yHE|FG98?2$#Z)]c9qSЭM<5aokm\5|+ bwCp{?`1wf  l;~bpxؼu`]y46#Ot ^mjX2+ø)2yilp3|*nuqc+i>] ?T_:ŇogRVH̑`lc\ zVuEOMޟFo7b v]ۛ=6X'qY;^LdW#I `6.\wzgJ]3TRSFh Fc'j?xi5)-6tw ĺ//*b]6$PM,N_?e4K(_.0d\fbX ǞMY&KɄOe>\DxνKYdlYdyS̐p IUA'8Sm]HYFIdi…oW\dnsYW\-;9 Nq݃r Z)/?gIeqw&E,^X @e͕ʜ =p|U@ۘ-,Pi nbιt8qe{!%a ʫmc wkG+]:[5,q+c2 `}zXMާFMsF m@ Xn TVzZ=[ƶE*&Bμ8u?0߯,VI$L UE-9%sDXY7":( dWTaI$tsNu4sũdyܻi r$w5?Y^MsݼL*ʷDT`FAz99&kıw(tbAOp,@')[G0(b LCHbvx]|dk _ב\:ď:<-{hgQpAHBzV$.qzgfMZYbiS1Pnr /#׹ui+[jKG2`gqcX\j\e9YB,,0s{zPJr`(DF]! b6қq" ܬ y;qMoNu5(\fbJq88{F[e :޻A^~W'\SG=̛4tV8Ha-@ǡl qWTKvr} ]"1ذbA9pJН}'Qf+$3N02I]KM2lE-l( n\@QO+MÓa3"Q[j98<c5/| EQ2c ssŸ]Vgxp~lW< Z񝏫.VGxȵh( odq$`U͟ |smW# 0~N[>\~ckHsgopynLjIޖm!7⻉tHXch$p [uj"͋\ٛ) 8`܀`};WM|bd3.B(w98^@QYdܣ'G=kzYwy妇Z*\!S0b8=8c&bܿ֔8 < \^R!1M#JeB]99HOzoꚍ:vLĐ^f#'NV z만gi֯sx?DN/8`A 9WX CfQЎ~vмM=r',m>P7`Ak$XXD@LeCpkq[KTmQ't|Ajt..th$f,^D$n+$G#l<[ -`Wf=@ msҫ+ڭ;qn%Sp`1Q3 9k!R ?(`Wd99*_&sxZUmRnK8TmBs }/m $MvA|myT֍\&KeQ$C%°sA^ YYnKbǼܐ -~23jy?KSvDZV!."0(E8]ͻD}X a76X`$AzΑyF;mjGkKn NJa e!mwC 2O'$Ov~!\##qXeE=w.4\ܕi. ]jZѡ=2-j[:.fׂ8&-#UF1OYNYmZ8ĶJAC+u|3(ݳ0ExW[);fv8jv9-1w#ʮkaX3){s,%*yq(m$F>$rukY4 D!~WN1Z~}qm |M4&0 1A1*jag_7n`-=S s$f@y"ɂd|csu<D \Eri˼S䜷+O# O;y/+ܕ3~2 guLjgu-VLvKddo-%i\pcٌi8QM:#M/ڧ0xR36?) +_cƋ4Q-TJ P!9Eq90E+zuE.]ٚCoIo>.1 uuߋڎZ aYC $hIG<}ဩVa}^?4u hϩt{j>) 9ڈNr$w f`W^9_\orbMГ;UCq~\j]g y#1dT*ye@?Ry<iãڼݡY='pvhzxU82X59Ydlz%~#|9}_^?c{S{Ky~ԡ%0 >z+kWW:;]ũG,F[.wcdaq^y:Nsis40 x']3KRNdӕD"'|$l t+<6AK4{OcJٕYI's^haoq /nIN®Xorۘ-3uWI9l-n|U,sG1$ha\20ќz["o i]τbdeE理WPͥ*:.x@Q7`4 pd~Wc('h>e+[>wo~*㶵w)ΟDll,bm乍^kd~L=:3(iZj(yGi4sJ-p*z_[k_k{1{sp&h1,,A,8뺤v0պ"Iq#F*F9rXyum[j vb 칟gh<-m?q$n&Y&oL\*pKq_:[ַ 'ҭrʎvF\^XߦGI~? h {6oVcJzqy " ۛ>;h쭣C+%n>ɯzxuE#ךXosӾIO]YtE;yaRu+l>Rޟ YjR]0o!  yt$hS4wrhp#yFTIHѲww*1p *ը2_87bsG8դao#]3O ĖѬj6#wE0 a#> Mp41ufeiZFa2H-drz׭jf'tcT11K e@08G;0Hs񧎼 ^iZYG<ѩG䲒O'y\*<&eJDji4Nܺuo_y_Ee=rc2eB\p@7էxBXMEh伔|IR9a>Uƞ-2:u|f/!w)@MBHw.}FҴKh6]F GawK9 @!TK MG]w0U-+][?_f]B$[8[ eC?.Gf%Tƒ won%ҵKK,b!*@FaYNFN'#KM ΍e֣K+"V21G[Q[h+"KYF mfb+(q J)[Sm55=`OJsy/UY|t|zuc1i.Jbq >,ee\m5p< S8+U7+gCOQ_qm>Yyه 2ʠ> xj񥍭 6sYp%&4 *Hv`@ (ƹJ){$䴵~wcS_uW߳ħZ5v$3_N9$a SߨN]h^xbgT]$Q3%4LG&N@ 3`xWu_j6:͢ 6X5 $’NUG'{WkH=FH佤Zn[ORSh3f?7]Ts\WE,w~nsF\}%o#|鉭_Z[djA l dSmp@X2^x&k=R;O$vF;[YV-1DI l _isk)ǙZt0\,/@#NmD666 I8|WEjڭ~ G,/ ّ6ryNb+8BOKyG~f<ЍKyJx̚Tw$黢Ti3$D4X6^ ?"ty׫[ʅ>Q#,BF_ geukXtd/.kLL6&w;F9Y:?n?c[ZM6ϰ FD_kw8UЫ/vh-R's[=?`-ͼ)o_*yrid f9moP7lnmY->;)텥4O-̹&cAŇ\^{,?j-q0eX?+erA7xZ{:XaC@|y x?iSTN)]}RH~Varus=>d'odIt[6RUD PB.ݵkoKk7G͌ZRhAg+2(̙#毓~ ^ &TLٙY\yug}ʹ-m߇.|[ vM >Kݢp!z|IsQG}_Z.rn n=ztk::VӫZKO|84 tsE,RIq_ .a2ՙ 7|9xM.{[;[I,D6 eidI W#L2/%tErY4.KK!d%3d&+_G.mxVY5 .vMSILfr>Ht&%@ q[nQ\[[w7-6mj^l0rMkz+yZ{͎붓äDЬis\gs;xcv߀7z>]BB}K2qwCpnW 0 p"Ɖtx_Լ+k i6. dUIYg@Wq U2CtoE~;o t۠{x\07M9ʝύp#4KgdG%vWG0$0җ~jןCU=['\“O%PY ,ovd m5_ #34Hy &dSP噮 ,.ee2OzoMxxj\=9/$е)4d[Ÿ&"KV$FA6s[_ Cq5q5 Kìz"3?ƞ |Xn-w:g͒l/4 AML@F=A?|o\VzƗvZBTle)酭R(fta[};+Gx~)BQdma12"F|<baxA1TM&Ym 6rfBۗnp/+ =ssM mfuMalKx9k!R355_wHեk<# [瑾Uˊ2s jSIE.Q԰ xA}3Nyju$M["ۤ a3z'aRW]Dgu3SGB$ pN֮in^MUk vPR7;J>\9/v].4-) HYPQF , PF HrMeOi&}>]ӡ/p}jc ω#3kiKY˙Ot$ xEZ[InV naM2oy _fۻux'yu Y"VoqZ8!N+=?z΅jpiUP.Mhma$I`;ٹ'Sn/U^]uGT8fҥIzOf/|?\gM++3$f0x[ktDžl-ᴆxbЧ1WB)o$CS_U{"}2ɈL^gYSqV ^d/͞i-M%,osnK`@^+֍_C*F-iZv( bO/_'W>7#%gc>(t-1hz$.L1 %nAvo8/,%hh2gV d'|RI™?ج] %.Y&<֗[R<TZWN잾>J<\xSkmBL8"$#NI se6(k>|+K:d+wT7["=jՖ4k۠|qQR2T4APNҠd^:o)_ړj:*Y~epI!5?LN!ش)U'u%w{>`>8rZ\jo#j݋kD.@|_Zomhmᷞ6X͕RNs.ŀ*G [-ɻ:ٴYl:<7R߱ӡ[⯃o5ȻsA?gxp%5tM-߄>-l$H*UԒ屑+.kH_{:~k^ 5;!;XjDK ,p\rxb9MS^,[CKEk{Af&hrsp*g9,<$8EjT֖mVM؜6Sȟ2o>"7dkXC̳=LJK2UY 2@`Etj1Qŀ䱰,I|\4mqp"~5hSOU5swrk5bFmY[>-_cVu3OqH S*H65O3ryfK c?Jh^*X<_}Adү4(k?12r#oPo& S:E\i[P.L˸- P<,6rJT2XMYKV[mt0JX_u^wf PҵXVWOkmW)s 3󵙰`_2,nn4=WҬ>̏qp6")Ǐx/3ďDco [IgxDAbk c?4iu;v?f\~Y7˧" !w`ˀcz 0Ot ҌwfU|4մ hq+φ_v9m]6$ieM ܨ*N7-G?긵X/~q_|)2ECE~Exǚ6z~Ɨmc/s\,r5 4kQk?[hlpPrmhr69.Gxk ѣjsiˮk6-KžƊ%>k`/_o>.߈<+ c}i<f-m<3<ᶄ˓I84uM&/_Q6/mu ZI;!8 yO"N/j(f5o)7nnTI$Z7]ІVv۲}FV~?ط6VY_޵I `q_Ֆhڥ,pFpGxk>?BG;#֮* ;xK fIhqffBTc?o> |(֧HJk3nV>Ihي@PXGY:_i)87mI=m#f LE[FQmZKO#kĿ'x/Tl@4{+1\Z+@ȲRO\ڪ_>&Uas?:}R݄G0[{K}MGYu]^Z=ryc K*GW#[a>-~-7|KAc494KE'I1l=Pioپ^'~O{>+-tkhS^)u; kiGC$׿_Nӛ^vivӱaO:1TS'4ⷴ7lCЕ-)Ew%_7gx5 KDDclVhk9My~~ݏ3B'~H~x4廏ɻbRxm fSWu-J$2hf 0%U n_Nʌ58?67D^xIJKikw+5uWu$)V71N_+\yE&[.Cy7߽Bx w!) # ժ/~(xz"5Ʃ%aks"8V;r!Jw)i!儫*ҥYIhR6V~VW\C«_|hS#V*]()@%Pٕs 7)_k<~ m#VG-;Z+ɪrsQZڿW Q7˫HE´M[P?8;/(8#ҾJgVU-%/?7y9O)VE:pz)+/#S|t?P'w"f[ѥȕ IG,1]߉m,ݘw !0992⿆;CoSo %ڥZ) \*2 o9R;:!-eoQNB( iO 0k%V.kZUˆFەh|Oޛ svRΖL &C+Fp~xcźx?O]iOM@S0K!F0iw?uqmse _-1O3X c.{)#$ֿgW YbX-bveB[kMG`EZzپ#Q5%;:+=lϱф#J^tg{=7OjvQn pm x9 |iմ7>Bk e$Gcq;#zx8ܹ]5KZD;,鯧}o) Qy nc2'gsoyj r? hz3~ǬҠv{Ft밖'%N>P'm:!%V/e/xXruC<->Go ;qK ǚD'?0?oC_s|ПWtK:^%$E|փQ`ŇP _ txKa5naRݝ;Gɫa$0^?WU1SӚ~KscWolgC>W"K )tn"2a1' w2澂jZV?Okhֵ/ |;M|ҮE60%?|?jG~|}]VP2lA,j7VHɬÛkp7-]eΰF/j[1-`ܡ .ar|#k_ =7MioNȬaV`@p H9\w+D}-y&+ &W+]EJQPw{'cÿ1XM$:ߪ-Mw${rUU 0OG oi :l̒jڥAIq$H[%O˃W'KwosX}.g3A|wnH0Pe~ŏſZXd4zs=Uf13_HB_ehfo(6-{w肋?|ʫMXяhyuQÏ&+;GѾ[YkƆ+Į >vq.o$lñxR8 O}yy-+RiY_Xj.#{J}'@pFI|CZ30AX=Fp6TpY*W|_PxZKxQrBݿr~rcuKmq^B.d"CEq,a"C> yO bq̮՚m]Ux[CW+5g[#14)f~9/U]ylѼ<ڔHm ˹̛fT)V*kO.l. +0/ys0\+š]4w~[ Ocuy~)L-R[K hjX\8TȬ? 5[XW6Gy2q6 *)5icxk7kZ g0HWxRJ<{ZKEuzu `̈́e 6Tt`G\y{*Pkgm߿k[>KY%u_Ŀ7GSX...Rɿv!gsQ,9fi_f+`3$eE v\Log5-9)`Yyα ܞNAL1qwDK ubv$U^1;_SJ8[^Yl^^-g;wJ2~i?yGY}]_'" tS]B4J܆Wۛ _ Z2 _x E1cm||>UՅ͌(n%f*W.'դ-c{[%2$oy#k׫5u͊\~ls|'j1W=</ PB-4|Y%+|[;`7'~U SnG˞3Z~!6^iqp 74 )$ҿe)=?AC{٢3N<ȐKfnq Ϸ$yc*ri;5zݭ:s[2*[{?<{OM42OgG3$* ׹w4lw LUC3dkFy|i\W}.J4!H َOqKnj4{y5]~Us rv+,0>qef3;{ +]~sKZݼ>"w-./xd *ƮAB>\rsIgWeEvnV29zLJh֤q*_JuqmtIuWVV۴F;ڧoA޵4qm43Bc>aV ͵'^/e){,-ohEw^wۭUyz>Gvcj]>WR1xB7',qq]No6kJod#݁&!V-O=d𵎙yz֡v$gWfTd1>Ѿ>Kmv\4 Fa2pXCφI9rZ*X9W/r]ɵugkj,fU.k[|՜Xp󦸼a˝CFk|"{KY- n УEvFf7 t5c|2PqWEWzbu1$rخω-Վ +Y¾SY -w/_ Zt\cVZ]4{+5^ S(ݿ ]3GoM6Mϝdޢ_YB'%s^q~7} xn-vVivX;apC1Om r %-lChv^ӭ6iu%ey`U#.ṙ=ҾGq EU%Ked1"ƫ*%@6sou%K\[Vu0x-}]5M<_ 5I?.ngH/qYq @ٖdojW!Mߌ4(5溰t};I{i%Fem˰/'*-G׶zi7LVO|L(Pl>9Y{$U6iqgr"jƱ|XK>\xu<xZ.yo[=.IJ ױ&c^خE,lY_Tݎs>guX&<?Uolt-崈:墈( 7͖Y|ڍ5 sIոtU(9s|>㞳}S[| uB #KkhL4 y;Ѷ5Zkm:Ş#8h$7vL,# \|_^[hww 46=EDwdO܀4aƫ-Y^\\;eu2%23qg;cqiOZuoJ7^T)ԵJݶh-Sƾ33^D$;0Q06~NoZXxcF}cC7,V3&PJX>wAu +[ k]ե}B9`̧bbS͓V|vA_2¦M6:%aFku`"H$Qdn#fe=*ʤmI4io#4RPw.~7eKՃN T*0t +]q\J/$JiqDDW#M,wNW+`3_\x,ť]HQ>QJ[.IGfWXyk~bncv2$`i3GeɉmI_OYmfէzoeߢ<QL3$N,M#,qXGcg9'}çiItDHV䴮>@I*Un[ Ŭ-L  F8 Wha"/Y5Kq{"GۃXM@+hTke(K_nQ򆋪k}!|5Xuam"{ԊIǘm`J@\.s} ;Y/ Vb&Ib@$Zߗ$Ѥ+f߽t$λ9 65ӊT*toV&#.2יNoV[6B$2 bI$Le9C.`cӬ~5-_h(`#KK_sΉ ,I##8 c⇄? Lyo%M(Y.HJFc{g5`ٔimo_ZErnxgMN wo[Z5FlRHbG={Wៃ=˸NdB9 t>ojww$ I.G0W`ňޣCm-{>aB"1:rc̓{+(9ubgRҎ6v[ ^1v7lg{I",#+U@P dfuڞ3 Séߟ|Avne9Vid,*llb7Ox P_jVy`l\<8lm+|eQAw<^aT[Kv>#&߲W"YT9pIPZl9<+$Chr{;;b-IRYBo_2(+8 rWoϧ[.mz7cӗFz=4j]H#rd,1$NHGgFy$6q q:Ihid*k9~^rfBQZǖ wD.=@뎹N6ouonT}Cuyk0mRT1߼4Y<7@@#>NGwVv71 \5- XJ%B2C$,1#n,큷2|?H=:i+vX=v_u5umefnL{ 6zCFv`pq4:8|O"fٷ6G>l:WqCm]FdwVBpL9`r&.[{|*ǯAyԹ/pJ*He]g5m9VE_) I NEP eF3>5H[.gB$#Vn.-ϗ tg1S#$#Wɶ4Z_1@̧n5ȅrd! r͞8 5q"EmXߌÓ`p*_)Q gw9l9#O8Ҟ^Wz3_\"bUB+7 F3X7"WW0F0K96p +8qX\n&'gRIٌ&}Rk;[+yPB+mfbzcJ>U=++m=wߧ5kt{~.0@BB.n#F1ϵ.`.!g*y8*K.0c>+6_8>ЇnӍry^YR*c-ttz߈.'hQB8.G'U"ӥfxMNqOׯ S_qudܭdJإs ن.hGJ4w ,RU#>_WQy>!Ty9'~- ,(  pܝߗJyGf}#{rE8BFu~"82 I 09 WKta/a$#(U᷊Rc@#2>NsN}~AM}+] ,K0?*7\9yf=W#~X0SDb8+#iP[`;]OH5^GHrA`>\0A-/., S۸X|%,y8 ׷HX$II+i4XesO&0gku8 k/෍ b7(eO rFpAP÷]5͙ej2jSV%=ppCc'$]~=k=Mo4$0'=qDc#,GCgV١\MdbkWXXD4…䁀rku/RW0l^>B fWSZTT>c Jm=NG>=.ù.t[u"Rkchil*2H=^ioms! v@) r8PPoIϲxlz$<?ZH fɉ&b#`6p#>W} W?jY!.9v^tl1>>ᛝ,YYo}o0,0I+#&Ny$gwNZB] ;$1$wHFmqUb>MBAРM..AB!ɓ<^1%Ttjڻwe(|Jw0_wQR.،s6Ss0yο7~ jYoIp\+HhNeiڕ$r !K"֩W捘pu9`+cnúwU"i%7%k&{*iJxA-ԥ+#'JS|v%{߆[^Ix*7RY[*mCEtKL9t;ӉBw I]Xc`)=w=6Ip- 7!zwbɴX9'۔}4 vWIy-;W2jӆ5c;bL Wpr0N*=[>46Λ3|Ļh6`-C^\O{}h&i TXI+6|]¶z.]}eݮj%|01rprlfY<2)J[{٤.ѽP$S+^ʹ{R8!&bZ"[!i^M ʰOKtVVkc@kRy3C*fG)<&Ŀ5-J>k 2g Y%y0ۜ!V+=_kؓi .N,v^)$y =.SibSTkdܴg P+Rizfj:qiD:E6F$UXkU/Ӽ6cc<ϨD6&|#, ?rť~3q4v2g+剖(Ƈ,1@k<&}xU]6{ffYU6rr>]nWEʦ"&qW^ZsI( ^Ic/o Hcaۘ -93^*4x&RI#+ $;g| xT6t,tZu8*e }E N~`1?/LUEa$fR11J«`rH)Th%̭oAռՕq:Z?S$oYuFP;U1D *~V˴!r.k6G.E_M|Wǃ53Ew-Ѹvl2,Xұ?' ~g vEz-6]^*H^&!ttחMڶv߾UjS5Tk{uIty4!ye0dTfwϾGa#*rA;xM4;x+ Efc)Qᑃ%@#cx \߅tKk[[QgswT$dw:qRk/X2o 5ܴJ}ծͫ5<:NI[^eJe溙Tΰ=U__ω>{7m>H`Nm좖0xd(-P+|WiXj?/_ x̵[Xkogv0~<~>=[2ݺ-y|ҋ(”GCgeO 0i][v99^ T}y#]o'kmOknj^h}8/X_NxvyM4H#*JQ bG}VJhkɬO~п Epڮ u->G e!nA$#Fw +gֿim@[D֟pUҎl3]DK,3>qN9׸Ԭu]>VK"ZUGA>+ ⱽy|+oh,boV9d»HXC(U`6 Ls)Gj8D~w~0⽵ާ+.4R-"ąLl+]7<_>լA1Iu[Cn,-'dqFE@$ ͒ŀ/K W^IVV gkIi,!䝰1 6sQ4-/edy2[6| p1ד-jpRw-eֳkuVqsnWV߿#u2K*{}F]Mܰ s\W>7~ΏRm~lo&faB8rA`0I?׺f:OgN~;DQ6ct-hP0R+7L>[Ou}n4m6v` yJ\2¥BH }N 7YɽRd_WRE=/3ϼ ࿇=r4]RMVk)m-gyc5%e<.Uokvi0[e6V a26ZG۸"FQ[}㶋M[BQ$nLcq@;پs^kHA{D֥Ԛx9Z4I \|eKx,o7<\)kKhk[3Blʹ=ZO Y}J|3B!T.O˸npW~*h:džtQŅ2ZKۇ9}E7_6 6!̛%ZYXvml#o/?_'/t5 Ū\q)R.8GUXꔨ=]]dսҵwlмR>tOUƝxUr.-dB;6vi|Wj9CxcMZ\hڈZck_2TtXd!EdlubGb׉u{ |V-޳ǥ4:][!aO|ֳ_n!nu[ 6K ,?8Z,z|$ 3eCg*5zrui^^zk+5_va'i3jdzlj=]M6!ک(Pf2s$n|0|7)>'whZE$Ȃ)|# ?t5z_Ⱦѧ&4 h_+Z2o#J븳dfb<1x`訨";suI$$tSњ;3ʻwωZ6Yi/k(dMXYci% dEP$=xor%Gm(Ἴ0Yc ctO3SrU|WYJ.<1tKfc*@_b q! 0K^|gOf^My..Z)|(pP(<8ƍ(Z/MʩM>ծB~y_Ϛ߆ݏ="A/tcabo$6vѢ4,ĐNU3+0$?K[^5͏'f(#- w#k 9渍oZNY%Fy^L(ܜ,@ PT.Ǯ=Z9XY\Rʤ=&*,BWB{HY5{rr[=RnobT{qk~&CgW&[9G))(I@b'l.x-Fm$ )C+̥eT]K|5{k04Բ6\4lrUef`m J,|q=wT$d$4\dªlrk8geV>MmʭM jzrB.ߞ3zĿxⶻhr$'Y"ђ[p yw\ } xLQSFlk`'mX0!g0DŽOx";~g]]Mo.ԕ6C?2 09"_\]zh/bMՂJOP._G9 aݥed_>S^S{O[g>rO#'y #.BnXai.Ws>$~ Ϳm,7F'H۫ovl-0#NV_P;[[X&f1K\9IKF0A$ttZf` mCNh-ne۫hjUŽ6 fIK!fۑ M7W:Z- aE$)YгWmO/ŐCI<)_ N[կ4YmT(0p6KW-RiZڷ=eH|{1u{1xu= AHiMu$ѩ0%wzB.w7>&δ_OiY<PB}Qһߊ,QO}zәVC#XeI<_,r!~f*7AA Jk+[q)ݭuTL6 `L2qU<&TpXմzŎUZ$W|5?S!/uK#V1xc .5)U|XsRHm v.[~/~ ыhK:=X70\>H b'[|8д?k^BW7o PaWr>}''!Ni:Mks+nR8Y-#²e 61$*^I>=>i<)MIaolR H "*b@I}΃Ms↷{$Ӭ繻..,bB(|E^;|Ai'/+-8Zh34ngHmzSya|0[!gcQ$׮Ͷ-V!f㴫-{ڌitlV G5vy3I < 8?"re\F, F)k꟝ݛ<ф*bdwӿ7ȏnGx?wt>0յkCxvE&R",0JutJ*|4os)F׬5=oL%[Ud݉PAbּkb:c;MGWdFfQEhu'loav8ⶶR+Xo$5dl\;{~KrtrJz="ҌwgnٟS%KEF7r]K[} W^}h:v'0^˨M[A$e(Se1*N0H?_ |2í'źT)cđ_ocɲ7o9KT^>1<]I-!WٽpVF1xW~ | G+9']> 2(OLQU@A>ڎ.nSE :S5/:غ-+ 6{=>{0̑6q|y+g9"K?gmQ~ iW6^$|V.mi֯nAtCH%Swz̚m$%mafgo_s*~ _|X/@H5 ˮYAz  $gWQq40ΟjWfѯ'?O|Y ۛ,9iּI7wQM |0.a}m}JX^) UN&=3L~6$JF֣jn|A'Emkuj#d䷵ӯ|!FlgMCWo%ύ&NJgp-7rfByR40ph?*-|4ĿN]b&햟{6zhɧ³\pn!$Ū^i4;Ge#BMҕM䞩=4mw[ӱ~?< ۏHm'~/ Kaw΁Y=ѣ@z"@kNmexl@D.pA*s_e_2'~h[|V+'C#[}62>o<Ɨ8U}\$wq:T.$=sҾk%ZySMۭϯ̩JJ]m-wߩgW5':gn5S[X}+kA$2IY(ܲ~|]𯂼m? ѼCkyxbIӵ$kZCbcT;x?/ƩzվkK.d#.TyllRH<2\_jeP][<-KITq>̳EzXDT=vQ[>OJo}ۦ%)gĭ4NuM/x%UT24j;p8E_迱?mmظ"-ݴM ey^NA9<#O/&x,-),V%`w,2F98mKMW y 8Fvp8- b'vFc-lsrf,Z]p*8 a8Se|hxMq_Pi122Jۛ\|$S tm/zeͫ:|qr22BsѾlWH3}6'2W$4&"0B)LH>RbxܾZmR21MhX,t.g?|ڝ$6X%[\{~b6).(\+GjW:LΑ "'b!&p@?YQjGKߖvn/[)E{?+>1Sgt&[nC"e\̶1G!C!ԾOR=0IDsD~~$<;%|Y;6ХݡmF}1Bo-rnQG]/< toܫG'.ctVi ) |y2 c 0_˛FK_T n5)YAǤ};oϋ_?Yx\NM:_^;Go~ĉV'1:$Hb VO _%$CyqIס @c濪_/'y1cEdO|#[-V ȯ#q~Ic[K_\;Ic+# ul9sj>!PNO1MhV˯}RRܲNݵ>.0X?ElqM+089bۘGa+~ܾQ9!/QGU}p% g #9<1]M!P# 2N~9i:OOݒK@:`4-xۿ4_M+i٪ochPlEwRI,ϛ!,qqjKzsD"թ(2XE7VMmZ.";yb'?܏񥕡/bB nh䬊g+nhE,R<9%M'_j'ݒdC'gb02h8cuׯ!{ͦKyy9o+Toݞs׎ᯂ4oxcTG.^%Dn 9E 3HOq?M%-?:,1jPA2G@N3Ř<-Run;ɾs_Vtf-ʹ3◅5Y'x;ERF8m;CVE`eS;2$kS?O;/.yAWigG-DGv9[+Ҽwc:^.e y{rYA.H/1XѦO-TSi5J:v='ם79ry+~'Η ˦_2FU)~0W ?ZZ|Ay% j1ȁx rX̣$=;_ËG][Og/>-!y1e$щ ׸ť]Nt&$UpIoI֣-p+H`Xd"Aۣi 2cUs>&jc$zxAX G7N૟s]R%[lqp#w$X;Kwa5~>:wkl[Ƽ[ @H[ib!@ <%8;9wߖVug^WqnK__}NuiቖHZhmU/9PP>8_ǧkwZn D].cbHlW㾭LԖz4.R_U\I32ݷ95Ab~ז:>}e+H3 (A P2|sВ}9\әijVz"Qjk䯿[~hT-Vw&U]92lgXe6$Ϯ!DKox! PY\/ ( E%{)s,0}4YR[ ,$ßD{ yDUO]V ιX(~Anb;9Ekᨳ}f%H63DFu6x y|1JT!A=mYgumuw:/))ki#ǯE->š w'${yx:)bBlxX<yZaM&m!tA e;îU7%௎gk}mq4z\]dm{ H@tIRKS~0i(bN>Q*߬NN}#)[XtR%s=[ů i5zuƉx\2Fe䝘5]4՗J-/|nv1 d`ٌ3COГNtR7,f'iw/an ^xgZ 88ɦk4j]h:8Y߇W4 i:mHlX,#3qR3\Oͬj V"ًhΫ*tf3ĸI\zK@b!g+R\φ 6KەU{#G:2yo*FN ?Rrj"2V{&]J>zi$:m[m|>6Cykt%UMhF9&}7ѻ~(|8ԾHn4˄;xL򔕢kV$ďxq.{c=H!}U±h*|[VŦ^ŒyjLI!2-6EKqntk&ff洭>~$jW?.-JeDPJ0f~(SK(" yW5^ǁ́_e:~vgZq鵽 M\6_ܪ\ :rAUb[$W-x>2=íüd8]l n2r =}êIw iB 򞢰Ízy5VmG*ZK1̨[ UN:p<Iqeemu[:RQI\C+-Mw4ҖrFs"28=+?K׬4=n1UF>n'W~!Ɠ-b弄mnÆo*E]䪱20iUJ-w_32{d^OfhLS k$NT1f/[u֚ևw4IAAUSjv:Gw14/( 2Bx'4xMl,S8hgs##Kf~y/e)?WG[_&v+$]KCNA-L*PtqQ qd\LޛitvYU:C#/pkï Z酤US~TuA_jMZ[Y[" 1r_s pޣ|=L'JRv|)XT7TA"g+6D#b{4ZVKkpS+nkZT B9c#l8 ׵eZȷ(`pvv  rTiu%WĬg 8F  fhRVaA<|,y+eUvwGQc6RE yX̲[%$2l`ltf|²=zciNF!tޢ6, rŰ;j-zNy`F119G$d0zec$>4Qq1LM  e^0Rv39I=N~{*2da,AeDW.}N}uٌژ4 醦\̸ pRT1$H,t%\G#mhqnztu8e!`!fs?6I8?EV1,x= :TLhzʼn'$`}>ng[ C2:;!$SAӣcRryclkf'9 ޠwک ) m#"Ocn}>cŤy/*+l6g0zw97q +F4R?ڛޣ8#<{WT0eJ-ݥaRTu0F;gw5B[G cXp^5{˦IJ@c(1VP3zvVp$ v1+TjZ_U^XJl^*k(^OrWqH-bJl :lv$cY̊vz K"b8' O@=N=z{)-C W$20v;}ݞOW&&U!G.YhsHPVDQ ylF猷 1r3Ziv'e;0%2G^9SK,y SpV<~T3۠RX?  vQ^Ujgd!h!/ a\0=H9~l5R4̰I+eV%ù!GB{ 2PÝ?Hbr[x7_f#\3kn*pN 89e~f>G=6u3npg<< j;EY%KO-QC;3ecjf]>K$h/c j`pF1Q]+i2Dѻq\d;W,wҍ diWz !;]e8}n`6]iwPJ nwJᣄ;p3ϱ."X20Bc@B7Zm,湆"`u+!T3㒅-^ΞM Y$5ϞUu/R\.^ qɮ-K+ L3,$ON7um{uιfHmT͵O*1|KewTb ;v%2Q);kc}i=&f'q<Ც2鍍J*T]j=RDgy- J.d,Ųy+9 I Dt$ʐ)Պ8p1(dĒ,~g=]T}Y[k A<$M3>Ya%4ٞe2\r98'xzך:4:U7L_ ȥ6TtrG@*NLӭDPH|'}yt.J2%#/o9XNЛx戫1b Ku/dI6`h@p F ^j"^*Ź%m̍P9We56柕ihtaoq^WYmEΟ[rq} 3)n'ejC_k:;uF9`q4!eg7vL+/ +m,w:lc\b HFrr4vڅB~` bp3FKJݽ JRWq t4gBN%X$mۣ T\]W 8u{4m9kST:(k7]Npq]|;N۸+,8UJvF x&KIuВ* o0Iq."NvmJRG"-fEO/c[]O (Մ+aI896Z"gWRHUv!UW<km/ Rdvkk*<TbW` OuU鋨iƧwA ۦH'J%I9H9XLO[Z浭Z6*cOT>#AYUDkS5Jp(;FbIC<\wu[IViZ1%D\cFq__KpѮg,d/Q|]o YxZvw;tL_wp1 dZ||R״t߇-9UnRV`zmR@8_ |;Ie,]$؉ʖf,>Y]_91<\b^i>߱x ǕRn֚emIYk95т7]F6.[#k̽T҆Msuk~쀲hm%݃.M6}^Mbc $`&̒:5+>E C>-M,ÿ*mL *-#NyR)jw٥}rk3? g,KNrslYh>b//S4_x8$K>70~om=+QKb$:"XHUrnb{XŒk6Κ{hޗEpoyzWc8V7Kvc[?!c>AlEO',0xS_:Ȼynnkq#$NqWl%XKgetgklz0WX:y:޹H5YO,R$ERJK6z)|L$;`{r"5;w ob06+߆}5;YQۡؾXm Ų*k"X>˥>]*I NJ!FץæF=kMk[몾._替e0xS;y^l0iQ .ps-_Qx{ſW,b&KjϦ XZIʓv >pw$ &EѢZn8cZ/]hZ_m*]y6ĘѤeYdd?-[hrwI+[F׻zk ߪ_I/V}+J@#5͒(]8IP#%FrWpj7M54M.HuC\#H3rA'+k¶n[__+% e,O!Qwu8#| >!OkK4as& FQLU67`J3pR(F3iɷiTkw]SMĎCqfchS#{<ߎOo4&% s*g];TRK6G g~ZGL ݛt $~RNۀoX/u'/>,x"Mևiz{%^jFL_|۔7d~O2#Fڋ[{nvw1ƩPr疞J;]Sq4vCW\o˯ϪKھLg d ܹ#%GƺwV͌n ǀFPK"A;wf<''L{ G[4* ][w*dDBo%P:tic$J2V'uo?#sI秩Q5 xH}ɻK+ud{y*CMLd[º}쉯3,ƫz$t3oe} 1C[;߇M.h,Hi,D!"WČs)'Z[/g|Cuq02󖌣dag&v &ru6ۻmۖ*ڦ{'R"(}kݿ+LWw/oi@uívsd,fFX.gGoqM[> ,F}Te?ݫ]78n=X| fR>mgpF Rb# 0 sݴe:˨v<9>Cu$ _]4c pvs!9l[8l4fnSN(0e=Z3擶KJbݻiD g(iT[Ԡԯ݈<;mv%ẩ5GXxSȦs%7*cxn QJҷ"1]O\~Mb7VZd2I" CI**! @f]W^4o f٣t\<'hĨIN mϿ)N֓VnY9m%dyRrT}:ǁ^_Ƴ)8![\Q6&t.vn W4]f_t;gv]Iooɶ/V@.$|+o'hIUb"BH'*2Wkx?[$im0B:Y'JYb1Sv6V4wۻ=P^^#jo):.ao0\ipGdl6$֚+oL`s%M w-1tE  GGBNyl>9|mNi|W+vp>uxq3g89oѦR{KoCƥNOOC믈mm-K@ 9XnhPFD|UO5.!-;[q9$r͔9bHJ{ׯ-ZjᄓK0I (䞢kfo-9I&¨n4*9ƼJ\-QW_޺vhzOI<1=[R8 !d$o*r Fǣ Kx jW"5H5e.wm99no֌Xdυp2^pv((5Z׈n-PӮ _- H'_ZZ֭]m6IzCu s~gꟌ&w:onFKu>LI,a|+g*`@[MuNa=ե׀hB99525G~tu{sG<NaЯRFS3' K4>\3x?_t_WQ4w2E ۆ FP#w' ŚPRH"|8XKk$YJfUr"DHn8/ n^s7z[+' ws aye:^HH8e`όd~;&y{73J61`']% %+!U,@g8;o@dX_`G܃lPygo^xQXvI%վz݋qD罇,|1߆ګv9-t6$CmytX:gGnۧOj_jȾsKUGZQjMf92a嶶L)6?5_7GyĒ’ȊԀq_fxCu<[g}(XF*fdfۑ  =?`]kvV<+OQtCGܨ*\r vCN_uoݽCQ4ֿ%og1I~~6Iƿƻ:_1ԦmV8@#0G#vFi <^:t>~[ѦG=BM"O7dz0"J~5vm/ΏiinKм7Jc(#mRMqfwS1q~n+&idEy/<;GufM;C?kN/sF1 , % I/&A2NX1MnƯ.u}{^\| h[rlyN5fvvGO#Зw~/|.|d&]I7n.V)4 EU A5?gC xO{.25R<3Ƭϗ1$~xwgXW5[}j&2gw$K#BSDZM*/B_Y·Ӿ0Q\ision )xM 8.Uz|\T5:'3Uʚm_N \+|ʤ&~dMcfNj5}:2Q$r7ǩwQQIzϵau$bq*@< xSo5֧Gi[Db1O1P(U Eݎx^CXX[Wu;=@r9 kهZi+r)[XUk[Mt3O+]I,|"<VzIBNZ8}$PkUwz=} ΩvoF*ƭb>p u gm.=͕kssS|ec!xfj|[ۥŭ@ˏ*RKQfmM|5TfrwoEͶI$6#By|6IFurf)H62*r'i>Cp>5OiS_ݼOH'[hgBd/6 gx?.^7#G ̚o`}f'ٮd;Raa2(dn{WZxC0\|UѦ/,o׏yZ|#,L6L@?1K)Ju1o񖍵k+]dE=RZS׺C; >k#t[km[mE]YVlFɗaA.2㑊j/ 5|S?|;O@ԣмw 3Jؿ7CeG7=i演XJ-]BmQTQ[=$񖇥薷ZM2Dс$Pƒ(3_UCs)44[iG^Z3x]l2T;_3/[W>:bUk>@>PłI9뿶ڵ{tڒ l'x}83]y]+GܑM,׺uI8)Vy$!'G|)]mgTҌlw(c9<YBr< G?Řl5q\Yzz*[t|x'^guMOGzw%RgS*8|oDH4nO-NrexJ4Q#Z R/Lg,H .⠓m燼H[ZdZ3urVLʌ27$d\ePRv}ﵭ{:otTx7{;1-}! 8ݞN8&imۆOSܑ׿s_Wh:vK-mo81Y 0\u=+ּ36xZ$KA`2fHs'=zg㼻u^_Ԫy*X:][pƊ<™! dWMe7Zai+5dcr$p_];C|'>sjgZ?#ZWN؂8k:jDا*3Wq>yZNtqTk_yOu]%:Rkƅpl`J/A o/4~ݞ&Eg[;3Rmvf@K#h.-i^7 Q9.jڥ6SYofuO QDQƪ$(*1n:NŖ ^N-- h)8m`+Fܪ7nMvo#F{=[υ|NPUFi5W7–cUy$ㆷE<y ^/Z&.S  1_?|/y lMhD]n]n>"M'ya$t%sT y>ZJR\•~kW8OjE/L??ůum VV&wdUA^YF85{sI^!80. V'í}_WZ~S2 #HoTT@P =Jo j6zu֧K>4.\]c8ȍyCOle ^ҩ^TUݹl+GqTr.z_S\.q8vX@n,+;(PK x,F;; 6W,H*nl~_}I}MKme{uX h0ֈbVyqD #~aObJ:u Ӕ6ƅ;$ܫ3' Wa;מ&m{(QR[]n?׾TbgOJvסƍsg1KhLpI& iVn 72N8`u 5X_1(b&m=W=.c̭4o(/]KQ/ǃtHW 3Jk!M+:;#$jv1hCKGrΈp X#-,ȯV1vͧE @R2ҩFT(9l.QAkUC[jV%-OrڐR` v*+TRVnDQ\KNvis=Д/mk" +BrOoj!9 C1v8&2I8_7w)]Vv0P&"/!O-`oIyGhЛko7dR}7,jBfJ׿*kR<]>"Q[S0G]ȱ -[DQL WA]xIfTJXVA$>\~97{^8u~f;66kv6ZcE=Y#Sx,6)e*^fL[KKm-M\)YkkBEn m֎g6YXͳ.!Xn!Tu_᝹Ɨk=q5?gT"B)l#)5_s#66x/HRO6GCfNO& %a` >pʥy=zkT\[ɴ]u=ؾM֗/"K?\j3nŲ<6K)V@I axB@~,Q)ͦnú渓Pd \y [zt֖eX$ [F%BJJT@  96FmJVGYnr~]oE$_MJx?ײ6o#2ƟlKhY,VGR 9 cB%[=.k9i#-6v+/ x?:U'#Y‚Eܠ>B75_夏mH xB~b`Ld0I4[Aŵ[[_[k~S9w|q}vP[k7h:q(gr̅ݲB˴`C-"n+Ww XhčKǒ;]M5:}[ڗ3"9F P0]{MxuYa3Oevmq+>Wj뾏U_^ƶUM_+G ɪ./0mVMtF yV3^1\EyLe*3aBcO8'5􍗆n5㴼"+BEb*@uʱ`e_+(F.#;i#y0$€ICrI]o?Ϥܣ-?k-M= 4w $HV6?.#z+&Z֧DЯ'[?otAlr<ܼ{<|_k6qJ~+l$l/}Ѽ7D8\BfS": vasҫj ܪ4BM&#}xI=zWк_]R֖Һw!EcwqҺ_n-+ iTbϚ4S]-OIYRM/z%> |mo"Y`R =:_EH"sr۶6"7I=k3p%^0wF'-=8mB ƥF@(d/r|;5*A8ԣi5OU|2FZwK1S(i hǗ/L*8i.s-ܸ|^18\+]K1-RfW2?0\`;BZ552,?=,~ aʁpÞ N84կNo7hjM:nxM:|-meuV  B]}RYFʳ"f`6=`y\[N󧉣S#L&>cҳ 5ׅ}“G=aI 8g܅x+xnd ($ Y͍cIk$YoRwi]+"'OV3j%[U:reʖ*9 9qGV|/m%].'wImUgP'+`FH㏤9J1redz3l :12p3! ry]'SttH,< e|峍BZҧFL2C|B_f+xX  ۠tXs,9Jy9T~mzDڊ2NG̼p#qs0HrpL0f|c9:W1_\4Qj o`5Zg )!Obqw+6Reg:ȷnpҢIRHcU0^!jD$lIg !m2ABpF+é[y$0~DǙsF'J-fvp ،Čp#5zS}S[FfR/i=6M Ui^;u/=k3Қ(c!V$|lg[fHX8d~eeNr$m!4]nxV>̒Uyۂ2O7HouKd-&_/ ?19ۏu>dמRoCK&hc *U@>V};RioeZU9`:zzKg-66e-"> v5_X[}+8]maJ|ҞfNۜf:y[_;«]=kpۻQzď<ċ@XryR L 4źsڳq[3I$2 NN< OMo'ca W8=My؍܀9rjo.B:ve,b2S+B O` 'rxj2ǺcV>;9GU_Hr}=bHJ@vq¦ SQWgT>AF%{8Ƿq]wQd[Tރ~\~C2}2I0yqهEP9\) 5'oLWKzxyNNx@(8q⥼;&(͐ܨ''`5΍9٢UHYwFRX;Fp17=d''U z9=Fa K#C*=WhnvOLֵ0آ]cH ʀ:c=\?>AiX8%{ x=*'9v_F R9oaW<59"iEmwZ$bcrFS~ajSú9#Qഅ`q8yyj1©(0p@l GԖ _Ӝx{\w#h$lټIh410|-9=+k/ IR:t 洸>sFcm3)0%88LEM<4*X_Zq) ɴ\!`s 6zs]ƽx-i&N-ZTRuXdqrFHW%,5KMX㧦=;}jݣjO,9ֹmfƻYm=M;TSo ٌ!co3ljp0r}BFOkig"NcM0ݰ^u}>c8n$Job%el >ȯF+F+{su]v9#nKu2IDE pq*pxsW+,}4"+{q|0=A1^K|1j-ndyB0iԲ3KIpRBO6b2=hdr;jv9*c9G}f)b[tx b B8t_ xQt[i`9u'i;f*dt%?izz{-~l-O ww'LIpbDL1#EzmQO3Fm;}SWBĖ=m1$ZwrA>ǵwZmqռvk$䲲0rxy9O -˙}ۮM [vV(WIKA# \aCN8'z`70Ӵmb-.޳=M*)v,Lc;N+牾!jv5*^EcW=H=8ZƟ$J .Ed'7͹dLו^Uddw9,-m3'q 9*nsgibǿ= uK;݂$Us*'( ʃ"bsp | e$n>QԌ#qVFkˉieGW<$,_ OPѿO˩Ts4~sm4mcUYtx^O)jhZc%i ƑA ہp lnrOAS:[^EwдÂDx 9TjNk^W߯o)/}7+j=Wwm&;;d5WH-K,q=EوҼ`  Mp? |qYiחVbldr2`1`5^Q5 *K=Ҵ1,$ƨI$m!Fգ͇jeC %R${ˋkOL~51 ēJ@AբV̪%32E-lIͺ.0r B'mU*ZNdII@D rF>;cH 黷߇CЧGEixS/hpʂ@ ~nAw!-^?OlWD]11Fmop:dFBŔ9'?ċk"%o/"vP%yxQ NA}S_O&62ǶYXb v:(>Tq5uc i쎇~~6gԾ!>!^On5-OIG)ܬ ̤<@(I={bb]Kʑk$`DřyPm!5ngQԼXCY rϹ%.02Nxi7̺G cdchw$ҳ #}9&V3UݩE{V'_~c '~ӵY ,^]J C(Uؑv21XǦܼwL<3WdjR#LJ#0]3b⾼Ke(\OH¨Hݍ}鶥f?frqhI 8>&":@i ֚)$o#ǖ73nb >]Uc2|M>XS)ffn^[[uѼi)R}SǾkOOTNčiF98kfK]4j#p~} NsT4Ko:սssBGŔ4cd|Eۓn&` ŔFXt3ϫG ,9e)%-U_FZץlG j3[b[p%k[)bf*qPIOxsYקMq0Eǐe[aϵ!Y%H53j΢ ɽ`ڪs; XWy5XMbfu<>UTvNX1_CS/R Ie}vJ^gE9I6{G|+5+o:tqnQMhd*L\n8)ß%ޙJSz g. @c^1Ut.T3tFA܋,`E`iz{gbOtyB.feoݸ۹A>#ˎSm'vU=#fӷ^;<  m% n ٕl 2H9'>⿌yZhoK׺yFBXmP>N6 siʟ%&I#.) !/"H뱛_о E/s813,.t;=P0;z+gRmYQO?CJo\GC$Ȉ'3(U2Y 2TdאG _,!b+EKW=~BV$%#/㫍#B_޶1.ӸG:aTE/_\+mEt{Hg6M#"fD Opkf4G:)"x DYZ0A냹IvuK^$@ctm %䏐'ib11wof/FХ:kI7*,NP_O/ 07+OUңԙ"9m|!K6.0|T)vVt;EfD*ۂɂ0qtV׺5ė"94l!eL܄95ft:Y}mW{h]o/[ЕO{jE4I,ouWmO"Zܢy#rMHuzQ]Z e^f%|؆ Me7? !mFK%m-%y`gx҅dP͒DU: 0p(F6tӿe[XZ=mgfQ TnsǠگ^Giys jͲ;̌F[k9o#RqsoC9w6:VA4X~R ' ?B2Սw7zYx;k2ŗvLeT660Q)b]߻AW[}B{ !쵋]&9t^mcyH &a ˕̣v[jUO4 xj[˛ 6gBQNfvI) Mq:O­ RkYV/K1iigoc$ALr0tun6w$ /.K۶'ͺ>3Gğ wg5 k {Mjp['n =#_t|?Y5mWNh3Ek,d4S##FDM jᏆ+eNJy{5p8€Y[*[@Ix/M]~d q"/p\6d6IPOH^4Q۴3?j ؀lqOs?Zv}Ϩȱ \ܷDeʀ1jbN0sujRž۫ZmJ7nKRlV͒gKt-gOW"KM,Dv`{7yr^5} (8\םqNo]8W\4nz曆K\ M9N_MOm~ϗ_  x{@Em~4P;3E\nnt_//ghR侅FeYi,2Ź9?`R4;%යM$(Q"0;Kc~6s/S"j"b+rIudX02,3ƯnZI/Fo#ϖ\Zz4?? ~;xSҼgiv:R%na.GD5ԂH;`N28ن:^E.9{L|ઐTpA--d]. ѵoL֭$Fa ۄnѱ v~PFLJi(<-qyK9m#S $|y\eېNErzW7_'Kox`uqy8ǒFdedج yb;kv[Cu8UdYh"hNvX, J/s'/wkgF RON6[4핅F[obbԎZQ)1ɖY I#c|_c gwYkitK`s#$RerDc#|Meqox"Q#?`A|,T^j -4;nhd0dUuiճeᶼl'S'QZJZ%q[\gmSZ^[?]^4xv{9#Vby#KBUG]J''-_i<Rx, Do;=Eh8_Au ܯje]"`~H'O3κб尪^axG⏊d4k -`[E΍4|v H˅<X)U¨k7ծOV~O^j5/B>}}?>£JẾEn!d]F;1{\ xXAϟx:g]u|77"'kRy%F /^5 G} &M3g#pMVh%S6{^DY{[X4='Ě]miڬq.x#9,pjXV֚ F{X(aJc tc655xŦȷ62څv̇drl0~V5gțABq5k)yfpإot>eNŠ]YS{uRO]?}R ֌yS^O{'SAsmKJ++qg"Dtd|!a~Oh>^Vt I>wK5ILȮ87<[5ij3Xog<il*8<o>3񯅵7r5$[b[1Gr U((sØd *eBwQҳGWm(c}/o^_ɿzGth'nQ#2¬k#F I9QkC-|) [ tfܮ$RFSrSC኶ `דO/ƍhw gmfe%{F#nX(W\Z/>XN)K#`ݑ(7&2c_¿SZO^^=mc3Gan %i@t܄mڤ QmN"z+{ڻi궷^ag*s\Z}Row V~լ4>-OKufwFd|ߔ*C0$8;:|76uxGѭJw$ok'f*j,:/~e|b>)ҭc\[]Z,'Q,6`D_n-}~̾_մmR?iCm(VEfKbw/fY> M뢨d[2=L&Uk.wim~|x[\H4 we)m'YYb"hRYȓyPIQ{>%E.cSxͭI䑜,R+ i] -2"h$,;qԖC4_,6lR~K5 3b 7+⾹mR JNc=YA>o;ADi%q'x|?E74BB<"^uÈnX #y\3)G8x1 u?IGP]~縊6rC+ƅ hf* `*@ e\[xwus4Q.l,c`HuFlھ[7TfpbRiFtWQ𯆼'h u'd;d%Xl$1y69|K;h*\=,aRXAKWؒ#W]4FI孵-D6 YP_Aմ [ia7#r jK"ǽNw)X}a7[+Fɤz;[W Ӳv}l~~Q|T|Cq| ur:+OUMCkzlFo;J2BA_oY?ZHk;خZ~<2I5]Dn""$2 5 Vࠣ=e}tzmmbN.Mމ5477w6'F d ~P E{*iZ/i+ ʺʩk}#2Hɝ#@+=ZE⫻.t6D2H2gw ־j:1̂ ^arK~q# Tb~fxG yj䖍&[]+Ϸ.=^ԣ̱ZPҚr',s,C*mYV.}NNnmY绺IfUUq6ټ3|?w<kP-QrG~ֆM+h3)2q}.mWQ! `7sA"2F*ÀLnsp <3^UWZM$}ԓۯqrKoѺޗ}k -nSXQF=@G&TǴZam6GW|S=v[ ֜'SŭjbKbY[s8pKدI/x:@FnM / ł||̧wp7| #i)-!ƨ]HpC2N.⯳ZVV|Ik^=7OOSK?GxT;+tM)hѦC4J̄u‚fw^^l@GQ m!]\.%d7㏏1j-=>Ze}N> U,F oxO &+key9y(jFQ37':*J.Nx略{Wڄb~=ϫ?h a37,I}'uFThǗ8[gdWiW&\21^S??kچqz-|5ueyq)ϕ˕uWpx?4H~\=̺ͳn#3I‰Pn`mES0VRˡ9s4ޏe비3:&QV۽5]ZtՓEylζVeλd9<1W<1nl y]OثR6]$VVjs]Ke>tL%s{UAH2GxX|k T#[] t2BPD~Ubv݉Gթ RtS+^KUt8Ms_{>MImۍOoі =ـ;E2w*jK{{>x;^[X B5<ѓ+6y?xQ}J6P Vݤ~e1R@U8Nۜ0b+ ?ZЯ_VOUV}і_1I%d(Rg9Mj1r|g~0s.Uƪ<=ch-5h[' &8!o`2EGⅼcXuk؟L`}hwC 03i8M6㏈ˠ˪iU$G6hwTvb>YXU n%po>xK÷05^Xi9]ߴR2Gvᛰ%G:gmtvN!MGEu}5ᎫpCOjC m#PS&Z&R`Ş5#@t1yngּi4{iZd9۝ *N-gÍrS| pu /&HI4]HXp8*>&b}53r:#cnM `BebAmu]['5L~"nWwױI ^?ul56}E:"x8;?lO ?W^"ѭ|a0H`f@WƷvQaf7nm W9[vٶ̓wdk9ԇ'-K}=_?iWU{ES $90TN$:mUM<B3?C-4om. 0y) ϰ4PqrGֆSY}OA{EH-tC+L$e]9gʥ($M]v[j*k8T_]O[kG.4˩ⱼԏ!G%qq;O w_\05, /dV{_*X"F%WlUa&^hѵ0"nҤީضeHʝꪧ1~] _z֭oxv8R#vW%Ko܍v9>[ZcN-Ymٵk3VsЫ|O=|)q. ^ytĻDK i³|fnNiv"#C!>=^Imى!xYdsY-.JAmΛݵYx{|NPXgnycG.b9Y6 223OS}b@jv7MÇ7:>}O%po׶O^W[Kkg[>(u͠FoB|ĩSeܸ-K^.uIe٢4) C*F)붞|YEn5[E7D $.$.)֌"g6}l[xkuŪcE ̲˫9]XLu\{]5Mv1"4}ogVĞ4>-u$+v˿YZ'iy`A7|7t5-eeTue s0u$ ʡICI,-Go AggRia>m[3,ǖEBm x;}+Y5jX"3uYnfٔ勩$ryRYG+wu]zww,w"JW⟈&hYuv-XawH%DUT1  nS^6@az7p=,(z;.]Rf8E;ChVl5ռcc. 2M4{ۼa8p .[Ov7V[OEK$~Ayp@~7k1ǬZ%ä+t>g,+Z? 9 s4ҏN\׻ҾaIݷ%o!eaIp333c9a$ : %-Q,M`#iM2}ޓjAy'̉0^WvS3)1xOT.=Wr/'tl%U8Lsмd~OE~yꞫ4}.NPmqܙ-(T1 5IҾ—h'JIa <0<ˡxiM[rGƪe;LU԰98So>h8t^+QW|IxkyWTmO~l0iBkrFq[k/ii(*aU.c\ǎmԥǧsd"&T|wOP3]7zƗos<%ټW z k]o4A2>b5eX +k|YT-mWfe^))Sm_#=KLhH$fܪYRSXs躅]۴VFLDh:ԶN 2\to;]d;6'ֽ#~ tܵƯ3m vF *T[+d!Nm뺝SG CDDLtE =:UrxZK7wEդ)|gi7%r#_l4?lRh&1ĞQZڼpw)b>\䏽yψMLJGVG%1I- J2~ΔnzF#{ӎ,Xr"h,5e"IX;c۽'?1\Ա6ͧA>sa,SGT@YM9ϖTvx&m;v$̲ƢXÞq9ȨYǨFP)EحE<;HpM}^-俯dһ5 R<$j+iJBp9ǩ!~#/eFJ|%@=Uutx96@$$ \b`[[|G0oOzsڴHs9Ui)j6ڵ^0&_cUp v8eZwQ24M啎i<_ AF3a]F|* ay-cW%+3,%w O8'ǥyxq5d k~0lӹz|]鷱XBcD8l%FF 5]A۰PpcU}XBpXrFy<5;˦{yj80CS*!ˆx*5.\a '֜421@VaB'ޤYY#D@.ՠ*?l@ ɵ ֡Ć n*y : fhӪ29`w*ZX+$CCa71VsXxE}ƉVMş|$SRʬÃsUmun+HQA6pqjݛDg,(\15r( \K%sWʀTdGq 8ui[݋w!RehὺK-cc;K(bI wq{yx8=H?5F2`ҬKWR ObrX=+ɭVMJ+eZxzkV1<~B>lebČʜIjoORA HDZLg5q$< $lqN2X/LqI:\FjM(Sn_xF?ٗӽ(pTgi_+Co@,S݆]#,w{*>x5]g%Dz.YG͜<j40Φ8Fѕ!I>r@MpC^,{;a%o#|M @~y^ؘ[$7_y1ȮGPŤy-,>IanH1+VI)$;U0z / |#7V=:↥wn-aDAq& sXK"S+e6ebNzsnf?y$5r 4X#ރҽzyVF O;D҅J2y~:_O\YM[9d4He8 wdrYzp+ 2^]y!(=wM8Vc)ōʰVqjݯ yLf!5M'6dGY#GM)nvtzWZZKzҖMnrVxvFlnx~qxjƳ7'@,rfGCNݭ:׉[%nYkNaZ*Z>\^Al Ucfk|̹'98g<ߋ['cMPShRI$v0NghwA4ilWT ,u9n}*Kt,gg8(YKdw'b^W|}ij  Cʬ2n\`bG:w ȭ8uڙВþHY[k}+q{Ezx.J7ϕ[dj1qmQ+BM.y~ H=˥EjI f2HH!H#H&- ݴzF֟LV2έ,)pSۀ1^9Jm&atgBC d.z [{K–"௕Qy1 Cמ**IՖG\JĮh*Yr!2p\I8֯QVo[)d$.?ť[YYi][j V0q>W|I.tۛDkK2ZR>Xï5𐡘9֪.Z{=??_/V7 l>gxF01U6 Y }k~ #Tм=q4ݪH D"8R\y{;;eϬ]$hmo$fn Ⱦ[=/ NǧlBHfmYO e$6O<L]Mi]CkWI#ŚJH|5I& y!>|c zW ^/#̒G;Ƌ Vn8d6nDZnX-Q܊rcY>X9k>"V)ZivVLN0HvdG9$![ fhVuU{{JtֶZ<-Wnomy#h}6HD) /Jsóy' ԥԼ_X6~Tr,[uAK+u 3+/#1X4RL/$k{MEٰyeLF(̑HjHr1j$zmw#Swo,־å][BIs-Kt872?4 >i%PG2A/q$9>!gb(r#(1"?%tk=ZCF%e5Xb?*n'+B2pZRnM}ڻyTjZߋh4I^XL]^F2@A5jW[~AIʬ;nqQ]%CNOV72a$5O%bQ0n5xZT9n7G\+Kpb #R;Nx[ st蹓-rQ53gO7V#^_7ٚW!cgG/սzY*\!׵常(Ćmgʚ AzyFG9$uγ=|1 iv5p3D&QFr9^A&7k4aܥcN2) D6뢏"%+:->?PkWetT=0ƽBχ$h0 ۴7p015}w[ůE]BR3,A^}wg^| {{_IgYjk> {M)MFE@zU\8pp֏G-69_jU.5槉KFypS#;PrǽeE%.e))T~q@_xo[im\Cgz6 pĐs χ4=[Gd"ۦcoT@;Py\..F1 ɫgt~*dؘܢgߌu?$X`c Pʹ]q`I]pi8h%rFXI98|6X[kv_6=6lѤLf?|6pI"W?LM~(Ѽxe A* np F kߣGý%kRXO-W>SXj .qH9%w)ڼ|&umҎG <I 6B#$?MF; qorHDW 8 3ǯz·>kŭ䯨EԿxr1 HxKI?b^vT &uJK]O{\y.b)16m-yoP[,nDƫnJ\7p<Ꮒƕ/5RV+8¸,AmQϧ|i1,z\׉2bmϘPQ&@zni¼v+q]nf{15exiڽχ42EV= #$BWs rh-C^K=_=ilWΣif7$Hehwww+-Ĥpg$r1PP|FԮa G Պ՛ɘR !cTu<PNrdVw},}(zw;75OPXMo W2[ǨGQ"E :`1^2GO Zj^5It"HA2\\ΖsMKkLJ_LRX VS6⻕UnO5 Σ;e˸C) I澣eѧ =lLyWf5ӯ_0niϥ3YWZ0֬,#Fɒ'L]CJ$7tƅ⯆iKn'K,$~ed1RHsougxlʈqE;9?60A u`}^.9Axb1-ġ~ ^7zŽ)8]]s^mJt^]?z牾!|+5ơ C ]@T&DF;I$T3z&&.ghV%[@ڦM`r>dg"UEK i[(-8@*N0SԳ7\s zMBA7_9!"!w&ѐ>~Zq_\Jg<,qʡ 1Ā~\(EbhtY.΍D!7w$Yt޶}'c_`\+N wvKeN}%_KtU)FmhY[+xR^0[!-ZDR]-!p"_ IJ(|)}MY!IBi2c_+|=͢1?Ķ_[#LԖ$+fc,lTy}ײi=^7%m氃UXIR6y.Œ* 8.DΊfg y.37L6'x&y˙ P%_o ]{۹\ͨc!X|ҪW+01*0nۭٮ-7~v2ʹ>a-D|@_Gm$p[4Qa;*8w3B_⛫Piw(^>rDDQ2btgKQ]={۶뗽<,ҽ'>xOoծmQL[dvZ@fni\3_c2M-7ZM}}5ϚsDr3GM۰S&3 xk7:kveSecѲ-嬊V3I"լj Ү1wcpxrRky0tAkIPW.}³PiJ)kfҽ]24S~{`iƾ<մ_iiܘݧ !ϲ]2:@#M q>*<)èu7-ƙ9]*1V536Q}RMѪ1.pv:p>|-oumKm$kɱP9Y &4cKM^;4WOe/'m5~+.[}S񎛯jZa5=m$GM%I0IG?wߌ|+[|AkWmmf ͆("@bǘqyJ𥾹So緆Joa[<`'͉3&0p9Ko4+j^"Utf5[Cy`x =yFilp~&0w5u { 2hV3%+S$)f N$/'_~};L&x[9Kc'|+c"]J'I'E0NHb3v<VsWii{}uV#9q_}\!8u{y[PYX幹 Uoi 6v5WlWfTr7 *Joŷ,<}2^/d]] fIrHvg*M}9o/4ȵt:}i` ZXXԖ`NCq7>ƕWSݟ[tuݽ=Nf^Z5 f:m*G $f@b1sF*H~T&5HP{dgL()bB}oAgd5/|Vf^]ݜC,q?>▅Vto nD.k7n"EE#f1ƪ>g|fԕֺTF]xe]f>ᦅ=N?RyM:Ĩ/ 9ʼ.JInJrpQ_Ox{~F}Ly'n{=.#PBNpO>asZ|RgL-/ٞC"]Gd,IpWny>0Y^2oOiu6]͠M*~@\w Gθ~%ҥWi)_ݺ%++SRNuZ=6/,]t#詍V0NǡxQm6vwzkfG=vQtTmw(/x]fh?5[4HL6I A%T*i~QHaKJ@Fҹ򢷉\v!BRjPwjI>g-/%͚$M.륺'X]_4cf|R5DYH-+<,?-3|)l |3i"u?PX\Eu,f7"(FS a;}2,2Asu&pDiK'_~5k-K%a .Ll9j)l):kПR*u~t[%\q/KÙC=7i:t>%|i'M-CoMKMV[˕&wBŎ ^ׇ|?oXI$!\heP@ȧrMp[ӯ.'MG}zIuܛHcT>@C0߻zCMJ?Y3Hn/,(23($W&J9|v+ElZ˿8!ԓV=S<\kbk=Vi:Ƅ外+heTEY8Cq5>!k:zm,yjG"3[E"0]wgY/j^6do4䷞ 2FzPU&-c`dr+ۼ=[|?57[]UH\㸻!a7(,Ib13IP\d.5[^ݷn|]ͅo2.r ]vnBnF |anXN:Jդy% Xc8$`cđ\ˬؤQkp ZO!>;HWn|YVZ̷#0gqq*1*~̫Sk V'}v}N:T!hiʻ}wc4{m[Hm+t*G ^?fV3n dUQ$V8;zgw׏|A}cWPϠ[Y䡦!ZFc$TE F lݯukIl!Hmq"onG'!v2rxzyByJ;mmR|w?1ta-Ɯ~ϩjDx=aV \+xGx?xWK;=yn&G IK[dQ NgĞ.ԭ'^12Gbw\Mr)>xwM[{lj-۷&>ڳ[~X1ӬmWM_Pwn+Sdl kW='x5o-/F}.bgvRR8+z޻w=7~ȚM2Dsuju(#_!iJ%IX[vF.$cirRt5fޮWi5}^v#RvOKls>$W~JI~eu2ۺ<';v;AnE[,H |*qh—^,wmjKv `m5WI M%O.bwDƌǘ BÐ`ױ^Sۧ&{=U+.xSݗ^[ljS^9>%H? *d{ M5i\j]GkkHZk01XYpd3mrU՛*1)l;:ι2xyⴂ4-ضϚ076ϖPz8'tJkNV6v.ԜT7}?+V;zޘlw6dNhPFrFy/|e1:NvR'|~iUAxe[Xa.m挬h]."''<ǍJ'ip|OӼkv%Q)lr8Kfiv@×`%yxNNkI}Rɫ]%u{[7('~]_Zk[6:o/la}J%<Ep!aH 0=;-?.)em6k,A#Iqo [ܯб Pd_ Ǎb]*{ҦƜZ]Ds0$0׿|"Mx={/ K]#1*Dc !`;Kai*wdyE5eՄҷG}SDŽP}&( pv lh7FYw^D1C&ŧGm 6V8"@-7踦ս{hiTKk~zߍ<=mxrvcPI*0*F N9 M0s?,!Y#<[f&  m$ Zoݤ˩Lfn&9$WWb p]GߊӦkw7Fh'$ѐ|ܲq0 } *t*ֳɭ^%Mny%8CO_N޿ՉJO kV[ʳ[NLm&Rt.8[ↇ[[p\-VS3,6;BKzTpgFNvM2ƁH1G;ppy.C+M#i-!k(4+Im) g̑W2Osѡ*Jv]7ӭpZTҏi~Ou?=GGh]ٮT($@npptƧgw_kZYdeeS(̑ݜ@/ͫxȹIi4ibo,:M g #)]_om{S4]]Hiۮ"V!bb"q vXu. D޷M+[u{eS* WwO }4ϫZJİ ́npvq\G:zL6 u}c$3+7v+8&/]xu/Djׁ`m&Qwfmw:UGo[RޅeipnD h #qNd7-z4iЍ ԫGi$j8W0OOByokv李465[i!!Xo 2 51x[JK+-=lڿɾPth&񆽧M]å6(Nsm n$5fޏQ|2#zOk\G QJQ=]it[sRV 3u^?qyiw3闷re'kH{# .OĚeQIbe 'ep$}Vs,\Kp;iE gd`Ɓs>.NX+sFy61r7haIj{[q5*IYh[>c;.೸.Y܊rJ1S@KkD-5no\#.J>f '$|yMCLyu ;[Z"]T._/5-̵KaKV%4dls<8z b*{p-[]ǟœti3xk3\A$1>Y!lN|RȤ wgrxƉ[M[;[]\ Qd*&ͪIݼ9k @FݪKܚ߆5-(\K Sd$]~Fps^s^bT(>6FM[IkcNI%xᐂ"so?09;{XWW#1kmuc淖|hi~+DZeK{$$yd8$8R] tB]\=2HS12bL)SJ5! ^T[mm;]E-"Zޥֶ$^eղ\Xa(rsՠ$sڝ|qI4'+g8|I{0̂.$ YdTd=hIbJ]Bɍb +u{=BC=֧>sNY\1$G #Y-,[&9nuM6Hc.n b=Kq8Zr2;(E898z,MI \L![lde HHJIoo`"Z}ٌ$ɳˁA8b:+-vZpԧSIEczٲ[Y%C$9P 5\H|;/$,<^x^E})?n+1V+ߥ7wkuls:̙G'#ϭGNoJ4dl8*_$3(2č@砫PwwTE)B2GsK=Qapj1=NE@h@OL´Rh(Lc#Jލ=Q& 4 HI$\eKw p6 2r2G=x>c~]Iںkx/= 1 F95bg(6{)ViK`rr!#zN䖁sm[Hr[sZGIK2oq) z{ZhvۖI|&<Ҹ$ 7189=1ҹg^m+br ,!'8$pH*0zhf8YRIc,L6 |'ڤI.nK1UCsaP䞧B&^0̸>f27ry#ԛ_+$WN5Ka[,cxIQ4y۾hU*NrFN:=3[nr&C x:Ztgw}y{kZU^/>z,Im,^bL $RR>J^k>u((URT1I"yk[8#pل<iH=.0sOҴډԭ^yefD1 nS%2upF2It\4)dߚY}yOZ#uw:զ{o|mM8N8Psz΅t$mς@TB[z~ַOiڼ`${]t]y FRRGBqiͲg:~iC_,<H!EV$9/jS:i"csxqxd\BIJ{ھ.Mio:~i+[?"Iya#)T%)kkcᨅCU14pE#D1*z^ch^(Ds\8eϸ0)'u5x&% 払;8FF7d1ߏS9S婉Wۻ_rZW/X k0]o }Ϙ2 jkes|KF~+Ё^;xJXtV `9U$I?SG_ ,3̺)G*vNsYQVmxiHcM/ Kn V֚Rܕ4ۉ$z/4y |BȇFK(WI]vEқSC+Cg`o#m#0? >;UVr"d 3#opc 𻂓 _zmov RX)$rW}=DlVy R),``R@tF2?~b(^>}3*Tөgu>K\6c-弖˴ii ĩf# rQz3khtO6TF{cG|܃ȯe{;)4I'ťʬq,EѸ +c%rA1fW1IPy#bF˸A x^TPK=;kg{s*m5g~4k\J@ ! H]N\sE[<znMy dQ`r?)L&QXk6,mq4H 6NgI-R%3f, Ly<~RI5[{os/^mZ߭۷_+Gou˭kSOiwj$w(ۂ. j^ ѭ ,lQsd"_!H-K(,Ww@M:_xcz<5s-V[XB,m1U0ybj'xCVs,WWRkcuwiu$B xɥW'E>G{[KZI%}]mGQ~~WKxB[*ǵ q.X* KELvZ֐lɰX?1ccgW&h%M!w$BG(378Mjό ׉nrѐθc=ePҼg⻟ZX\!m[$a&7qOӼݷwjvI-vFV\8|2QOBִWӵxb>L)"ow?*C¿4Qiֶ 4 bM+Aw7<xNԎ+پlG 2GM̾Z<7]euK6.mmf,ӨpI*S# Q]ԓjN۷ѵ׵o,9􊵶yZ>K_k[cMm˝Fo.XH] hPX=1j?=>=B 3hu7R LSyLP#g*H Ï[#0iVEzooܩ${~4xkF%-݆rT b|l]*:dY/T қVmk֩=RN$Gct70A9k$TN&dV,qaAS!uszMh摧Ӣr\[$$Tr?hOneu-@Umq(~c-=5v^ox;D\1ūJGKo@f8LCI9=uq.ғNv֩=᭄__#TM>t8$y)+JٰWT ~ ^6!$31B0q}~Ϻ7UJd-=dP0H[%&?$(\|a8ԍE[/.񳍋|:lR !B|J\CzR(E]8ߚM][ɻIњRNW/;Y!l|h֚}mw.Z:8r >@[ $߆~*T4w"+Ȗ$ +ӭ4MCN-7K:ѼVG RI'$ rKU٦''WEz>/khb@,kn&@ows+fPQ{ꭧ_$_SsQ۷' ^C,l]Įf ?'\g^ښc=-uts*u|XtZٴZ٬ԮRFՖFXfe H瓢/M4j]Z;y]\Ty٣qo{sn$"G;Q =z=iE##clmSF;;IмQyPw-WTs{FhڭH(a~!E4`ۥ;[kЮ^~ҥ(qRO{kg,h?~\zyCđK!wd+~3]]Zy/"6$Ga fm0#=r+ I-"|80epFw`r;m{kmFmy"Ҭ[jH\gp5ц]89ʌTKy;EWRQGeZ濊8kƕmj&H9]&郻pgtxb)a鴸DbUI-rɌYb[#  ?~ydjW'DD 1*6犺 ZXAm%[2|v\mr1CWRQ:ORInݯ^ΙũH|M[%ƣ;jJ/[ >cږ V#sߋ=!] ÖepmYD ,`,r*S+]tK<:I;/斚'ӖofX0|kӴF߆.lCN`%FI>/w ct5w,2Ad'+nw+G) fN[[T(t.agA!^~ kɖYõ!;|VmJGdq9WMm |Usiԍ O*KrbqOk+; [P/#Z4w!0;{1?-q{I0 $@U|[Mb/× {|R5qrFeɏ 'R@Nx 6 'YˡLw }j߇fQ :HٙT亍IA.0Ӵ)`f Z]JٮVo]x5].I!d+n|) AN}1^[MtMNYn. i 3.r6m.y8'parERrKѥk=k޾-%K~Yn'׍Lzܩ\ ZܝGUU:#@ƟoUe-nMBXM|n^7Ÿb'٭nowyG۴`qZm\?lK^u"i$+#p>l`ՈRu`WIGK'kw1RJ-N[gxV+VKHMŬb$Gp*'h;Ilޑ< ʗ q$IߴC籓U$Hs6;lk<˜`p9=Ms',VZI 噁*<*X<'o&kqcua{ sRV.qNr*x{Ro'oF̓g ~l zwKU$ge*4y<4k+if!Kpd@y;z [^):em VK2n !˰g_WM+B o,5?>}* XCWI۴nN8#& j6~#DykeƙjS+[lh((8䐢d6i%u/C%8c5 |+ 3c2_5%X([!w T90'F5[w]t[\ަa4M#>?M4Fi~w+[7-d10n<[~{';!˕хD`̯ sWwiH/cZ&Y Y-0w1=AOrDڛWfy"Qao38u'ƝKfݯ_M/ђmʢg*5Ky沰B"8fQ k~%O îj2j7I2^3-E[AղRU$iI5_[zkXuTY+yZv]-,VIn H90G*kwUen$iojwXys#gR[v&xV`q~ksjrڿ^kǕ1Px8`20H9潺?zf_bm㵸DE14ULgT3,* PN;}_5vWԥ;~{쿤y富/o%Ѣ[r"D"SbS ێscڻx dk`6,aIWioan>-xX[;>=f6DT+qpzӏI~%^&dws$idTgy>c76e:ivoki̼<_7<]MwL|YVI{9Wyq(Aӌg{0S$m*6dXTd*rb(o^]XjoW`x; YϢj6fշk80ױ0*c%I886ʧO IQ >moQKtvV^Ƥ]@u/̚_.lΕ=-ƿ!܅ݜmb#]x Dt_ j?:4mɸqIŵ6ĮvWZܘ S/e5,6b L7xVvoGK6JZO^zQK6×>gA4in-ɆG] 2ɯ15j{Z.ʹۖKzP9Z뽿=BuŞTXťЛRrZ_)@g95M/|\l!+x>y__h-3}y@NN@nF"wº_˪:T%-jԼMgw8[O#)x$%WP"l<Ro!vF,iT_#$6  Z24/fqei\9Wv@< B*kj릚.kkk9I&dX4w:}֠ЈdhD{7| }WK G݄)e}1gҖ&I#\YO%ΡcvȩrgI1UY~Y0,>R!kQD[@^ Bhb68)WYBn*[&NBV?3ѭ4-BHt{i?^V:8`uwѴK bYѭ"sSG|qOا"7\0fi 6߃:)&-XǡZ8!w/H&Pf\$2F׻FY{JK#Κ<Ɩw~Z3ܙ(d>7s"Helm+ Vp2~P9+/pޥ>bEnQU$e*%YNG={r+'$qo#DY.p#y`J=r89z=?zKty@؂$d;-ς}_0dǓPOہ̅c|@(FFNz}vנj隭K1rf}4yjcld09AK#Hs@O}RQ&5]=;rN46Ѷ*[q,(dUp8\홭Lʱf(wea:1wT}:iц"&GxʨHb = FqY B-0c phA-) 1\pqjG}4NIb3{qTmFy/QɺamyOAM8Ǖ輎9.f#O1 279 N=.53MY,H$2Fs\2\)l ŕ*3`RI՞y$Bj7b2sja%t++YJ\9KY2 $ < Ҳx#L7.00HJ`n-Jat-sn/dE "#fg85{f_ǜ&k<4>QvH\*Չc $@08lc$m@Q0mzM*|*w /T~>|LytvFd\s`cNxBH{#CBקc$8X㌹B##OJD!'pL;;zTY`cUX® [%ۯ~9⫲`?*dp -F~>D«\0'*{g|{ :s҈I'<&U2w'qSVM5rK/G!w(^[k; nBdZ%Ӈş 0xScdܤة:6L,^B^k^AS#AUv я\:סFW8[DmERd*HbӧZ+'vʸ1#dcykOMU+G_W,YbP?/5V YFk&w81]qߞ8jomR\'08;8:ޕڔQNT`vsϵIsz`:`?5RCT}NϷ`bN IH0}}+nOeI4"c'=F9\Քd Xsr2ldy'v`vy=jMΚr:+`apc% n:#NAg#T(A@TSY*Dy+XKvlϾrO+,1HDf@{W6m.^N5y#1c'!}:q ixp}Y@!`0qǩĚXck2R⵴7 >iFpcbb[x9^H{M]z.o,ěCm2dye#VB;`@ =qsPXxe[~I9Z~/.񕹯zU[4aUD  5oT'ɋFbA!M2'F3 y>h+ĬT'J&u=E-=V6,b4Õr À1^5ϯoi̲i?c )HDJ9 ,>8`$Jy"NmY#@yI=?Z/q#l23yJƴ)3v 3ֶnp[b0SԨqc֦XH+nl5oHq$O,1wOuhZI$%2qiX,E=2HmK Fnw Wn7csmzsڜR/ɼٻx\/u< HaO*7*\ e^A87SVT%k6"3]:I S--^|[O#Jd2¯)gqz/)Ѧ %`v8K벟2w51u&kD)ʒr8׶ps]}~έ=`#} ܋90x}:y(K*nCw|B$N,Rmt*f$j"˝JEcW*9迯Qm8CE:OT_ ͮAw8e8|><\_î-<[a4OHD*1+t[^?FK˻dRJqQNNpqEGl#0vdN9=\s칣:1iuWy= =GL|g|ȖHg| *H^Xz?/xMjRn0ftYF>8_28GU$PAQ_&7t2K MLZp@^t2HŸa=Ab^s7E#2|Ӡ,/S(UbhTts/_L2kws%֞"²INjl qp_nd**d#!@<O:^_ y.uD *?>Yŭ庚ݲYAu\ͅ:yR9VokeC5*I~g!ط/Mޟ=՝#">ʣ8$@:>>"vd[RFm+4BHm][(v<Gry=ڥgisZɧ\-"2$鸌թ9ƌt^~&#M՗y4 8|? +*.Ԏm^]CZTY3? c{מiڶm,cTF@pWWZ>fWi"6PC\>x8'gzc`Ck<EMےi tG[ t^/9mP|HUVpNsZn;$dIWߧ޿+5rz|ceR;F FA @!p{䁟Oh_}ŒIoe=_9A] Է;u?^DZKk,q͍큒qV <+{YLjZ GIX!Sz\vF2`pOlM҂5R__S13*{7_iwX@P NF>u׈|#x-'7{)m!s,n"~D]@#8[ .{5m|ǟ&} (#ԶO+LeL+(nSo}mKM Yܭm\rM#U%7QA?>|DU A[*HΜ+=|;7WVM/m/}r*oM?!kK"(X6FwgN5Q{J9⾎keiͺV6<0Tnx[>"Y%8EE2D[!I,0s< 8FL<[vz185w0=ݔL !IfU aI8$p9=+ϛQ =3 -à'i|9Zh+#C : ##t?n5in|Ho3L |I? dI ?DirJ-]Z+Ǘ:R8 gOt.]W\>2힘mWc{=JbR|76Amu3-X5(oHVX"@[/E9#x"p]ē5Y%ˆ.a+6Tv9S9pG%OvpT"t[մx20˹Wlǩ8%K+Y؏dt89&QT?YfD<mǐWҹ;wV핝|!<뺽 -mpo[o|+g,o΍5TMj+%gtȮVEk;^GcHO;(㷽4t=RKhAv*>l*ň5xZzj3l&%J '#*I/XT5i6z4V}:me-Rg<95|`znǿ_jr׼~b.f}7ψ~|A>n|%m9vUSjx؍>h͝(`ڐ#63 ed-( 9Z"N;;?0 zFQm.UY؈˅>~W˰wfdUq#/3gB.F{ B\Yl9._^xᯆ< {>~gk,ymC]㕘d- TZ޵i-Bw|H0F jō4vrǸ2\ T28T㏄PjRgeo;MzE5ᰓ6LB3n .0k˾-<0#=A9o ӭHhP I?JOQ9Öo]<8eR8^؞'ƶv'y\ų4T*`]FX'v 6ڬ7Sjtf"C 97gj n$'lt]NNa#k3!@.g {qgwekVkZ3jtk߯}_QЬ<;kmuyXxT\Hse08$;:x :Ť׍c kjzȏ8د˸*2qϮDK".`.YpʨAcךlS֘CyypŤ%.yqk p3M(Q췿ݚ:\<G{IMjmr23A.NA݂ā_6>-mqs%3^,04Z}eR0B-ݼݱemE,8~k˿$19ϡsTnj{_w;[Myum{j<#ɬx^hۙ.hٚ11d<9㞯&kOTZ a.Y 3h s'~+-V2ƒhʗʫ&Ѹ*8>J-縸H E"B6!d ʩ@+S_%bS2 wV߫{P͹=4[+.~xR;;7sIU ~1@ 2O9>ψ~7J:Akitұ2QxрOZ|CּHFڇN'7Op8Sw3rOR$iwC,̐o-O9گCrJQZ{o־Ң^]?}<>%Ԭ.Z&{DžH&ȉ'%Uv=_)KᾛlE6ڮ+C]TfF 9F~ozƗ/- V'El0iyJh@d"<V=wʞ>$k>!^vtz}*bwbD"'q9nN~%\_yz]]Wh>n8(ɐ@z8\۷{[{V-o婍IrU?_l^) ][;mIU*]`|I 1al o$v/#7ʿ,`1d`Tg%jwnz:evr%ō⫼̌;e,Pè1 Ү4Mk[Tn $]23 ~sT)b'RьZjhҶͿ-YOSnڽ47TӅK&;MQYC 1u b0Ty]'v.,?eh/yu$ 6ݡ<:6\DNMLv e܄P +Jh(PҖъo/h{`?w:pfi>_\2ӭW_Z|1<ƙUfs<2棕8 ayA5+ak=Q)IѢqW%FI [L#;du0Y\`g'$TUZ\.*Wm+mg}{k&՗Ez:R7AAwq$Ok]D~@p½s}j\n"S   & 1 U[RyidI3<؜9RPq>\xLeTm|i) ĐrTFiP4Z="ѻ%]GMRj鿦MmvA)+6 wHcLXH\Wi>-4-\Ie Zk^j󹸶eW"%3țZj~4 jޫmvW191Fž+7-({yvQ%P_wn?(כb:Sҍ&Ttn~t*]2acw ?_𭎓 MON/{$jјfm;C Ox<?,8=Id9T PifeH$!"8T4V8Qo=[P'4)*K g&~LE%6hiL`0s9`1ե.uoO-N<Ώ3X%51 K_Z $vUdx=qZng7GnCg+@R`]%l߷ pIqy|qx7ŏPR㾍/"q4r0IAE<l 1IǢlzp)QA^KVKpqsoN^M7OX#Xۻ‰$_x\f]xXѭJe31D271@ fhWziVܴhǧhVS.q* sWkY_b6Vʷ!],Ќ@/Åmt}2KKgn7!3IP   8?mźͅ1Cwk,$ se_6%/3  ('5徇6~H"U1S#nҬ2 =k#Hҵ %5Wxnn#hTmn95ݙeW{Y}{v1bpFi7xi>DLϔ*FbԒ`9#rk8K?F]]1p2Iَ q9"hWm|(™2, =:kIqm=WSYM$HH8P $dn"7 (sUm=6<~ƥ҇7/.X䁥D>Y*gYyơxE[bX>ar@<2:NYi}2B f@f݀N 'j>Dv^w1g37'y>^tfwE鮯OW[ ]O32Cx.u3I q"3# H[zQ|aR95#oڀ`f;c &a}$j@&O Ԩ8` z޹e5qpd{1>UT#dnqX}b8Qʔ׻4YsS wQI,q.ʂyn@}-^KiS|lZlaz6DŽNj"[+H%6Ap$%[~Qr:nwwy[[m55SܸhBng'≠!Ƅ"uW=|.^.mߙh|;/mnĺJgg <sw[Km>+'hO4")V!Cm9Idwv鶿څLZ.n_)0$Q5?( wuo=kooK$g~Ό~A!I `m\S|Ną9yKFQt5˯c |>^ռb0p]#YVH`2 'q z;خH"ĨNG TG9_|6\iK 3K{ *DUM3 q\c$M[->O "gkuO0%Rvȯdk[yurI[}eS ! ^;̓7\:,I06!y 4 O~63KpL񬁉Qّ;HsyϗoF~-ikoV{*K c?x}_/K|:=8U=ocCzt|fX"8%?xO|ۍ[TiZc,ϐ3L~Kڦ?Y]NWCmH 6dXG}S?-G3󏔞s^7ŸmIum)dd|?5)2h4D08f8*Jknj6ٜb~+"H>au,6v`O4˯뺝  G"I,z_,/ncVgh~0S$ ȻƟ~-!S$k#0GN [ާ-š8f|ĮfWcpr<8:tV{DV. 纸$ļkFcB6*sp,9G730{FA88~oKye1A-d]XxQm8^Τ}K[%Pss(jcqT fi"N˴՟%0'\tr S}w a]?a׺f-WYwc? i])))fd%mcC.Y */^pV9EL*%zesp P]2%srH$ghO8 Rpy$ 秥v{*1qʥNj0h1cmbX-wk&Q, :;֬=n`c98UF 1~~V#=; %fLRN5]F7՚EhRE{j65vRX\|L;T6ydvm^Aݣ&KDξG.xYqӌq\zVE֢o$.19\~Z,HplfWݜLISkTcf6@Aֱ VUCK%WpbN@s@Yٟn8Rq V&5X{$/n!ː?8jUB߸V輜4<(PR[J6j$+>ÿn*LÞ}}}7ww =w?3t:p:cڴ!VT>õ1[G6OLT I7c@\\PFs#'?3+R\Gփ>{hPK !')##word/media/image3.pngPNG  IHDRǵsRGBeXIfMM*JR(iZ2{ pHYs;;̶"IDATxϫUYv_?*G3FД4$dAt !ɿ$B'P &/'9H hcAKZ)oy}}]ٟK={߳|x眭-6@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @(M;0q{IlO؎Iw D$8ؾ};bt_-b8#LOĴA qJ집T~E؟.?R  +9\yZ$ k@@pſP u16@-yQg`&H3  Ew~1Y;]WG 4H\~8/e?t!x5q@_=pZ@kDSۥ|= >B71W=<pT}*v#`Ƅ ŧSbI N@(ri'= ^ @\B" `4Uƃ PkGK:AAh?(Ay@@ vId|@(` @`(SW tta7 L]a AN0u@:׼[/u*s3-ߚCϨ0*^@ . @\m ( J0*^@ . @\m (8  ?.c];/#7 |+/-jئ2{_&?xV6^=#uyug#ƴ빌uClW,fջCyzbS\^~=׫ݣu* Ǝg9AYD/㦦5q|v^S88ceW,f;℘ hmSOj}٫vg%'b)!K&>]AnVM=SOj]ѻf3/?O*-Рdޑ&L왒5\?RSgZwwź7Q&Kݦ<,kE[⯁yY /LVg/%l}f5EI=w.a\R.V Z3Ú}_!rQQ̰fߣ?i?']N9Q ]iP ,'@ 4FOŸN8JNj>|8 JB8Z41`@7,&6c.&~LY2 m6}r?%zXV=S|HAEAmӉt6E gj= { 58W5{ k"dbk= { 58Yۅ:TtvP%@D0W8/w=ms9l/啯 S0aq3v?q<SVY3Ú}_E}H'w;GTQ̰fߋ:Jx".ʀ]?VƮʝKA$ fnϹS!oF hec^hn1FUp?wZKƼUU.+:px²0OeGwx(w9iIU}G&-⻕Ǿ%D+пlΌUԜ2W&s)!fORI^}˗[L͍Ho@k⬨0(tF2V=)2R,LkDG͙=1N9_@|yRR8߳ΫZ㍚bRb]K1wzgmw@kbG23Trj.cߪgjg qz95h,7~\\;/A%oMhWkt_ TUݣh. Αmx#]ߖ迵n͚ϩ8͉`)9h 0Q KXR()BC( D%,@)!!L`  @&J`LT*‚ y L 8@;Bp'@p pgT@(  @] CÝQ!K|P|3* ww p wF N.@!@Ψ A~^O?>%Z<]~v'~R[k v O@p!@pΠ P5@.(.? x@;B'qw.A+΋툝 |+/-jߦR4[ӦښWѬ 7j-egdugbcx2 ] Oz.yoԄ3?ƷjRƿ&vL,fC܎w@kb&pO,̥/b7?OJo35'"5x%YɆ'bD.t!k9ɕR[L͋h=,X8JkFJqO*]]ȵѿL(Uyvi2Zh7JBwwź7cпlΌU<):9`7Ƀ@zȾ+>ly ^mRx#Ƒz瓳^G,w[Oco3E@Eӈ鈼 bRUO)9h(j[U5H~1 >ۋĆ>!gY k=j' @{53"S`z(kfXE.2 LdoP1C!$AD@` \Mv1z sv_I/=܁_+_@ `f MoXVQ̰fߋO(An5y k!1S{d+R+ ؅`eǸUTE;RrBܬ-:@b;2B KZǼ&q[i EӡrCs co3EfO%* QEFw+T=[-`M<$\ OK^-!;1nX'EY0缭Fg&A=Ki^s]V=Ss#|o8+jG,:/ 2ѿL(UO ̻K{Ӛ0es&vO̢S>_v"n?~ߪg*#5x&&5ԄXRƿ&vL,fCYۢm~o̸ؑ.L,ܹڟX7vŢo?/<ꙚEǙ_ˌ}{Y[LqXOWǥ؞y1- z-ykB+?羘^EO-jߦR4zh@+uQX(un-!B|G-]tl|NQToNKA; LTX‚ "@HD P&*,aAH@`( PRh 0Qo9qA0:+qjѿkMmO-.Fۯ'RNy*(gduV/@mjN,yUֶhb`7z^C#X{@2'^"afC˗C&Yw0Ojm6?75_wh 5 $F }̄OFgۻbcm390񏛿$ #݄X ~MщmN5mA~lS?L)<߶uS6%uքH-c$ia9ߩ˨?񷭿%fOj3VT~nu:"-W;[7^Q~WBGxONմ)Sb&7r;E@Jҥ_D񷭿1}xyd:{.a{=1=1jw-@`qr^s5; @HCIw #9(9Qs^3nƨ}]X'z FI$":@& @Z/]'-|_C}T4.a{g3@t:D\g(i]{cx{c[ NK9|q /@9|qq &.r)M  R9.2<:ߋ^+YYyЅE/d͎Ȼosi|߶s*$4uITKS]8OK~[b^~-r9/5/Λ1sXYϋ'.T~tpWgw2zHm18Tj]CIFmiJY{w=ƓZ/ɰ.5IOR"zsSw3ݲ`lDkIf Z*&zs>[׿Zۢ{9T{-_ n VNo5~k>SdqHAX0fC˗C^Xߓ :y5Sk[|_J~C[6!Z׿L$>1ߟ%ķw"m 3C9-z/|NHfjy|SMw Ѻ?k>Sd }パļڏKϡhZ׿b幺Si5^'ңxnUQZ+~7-!gUք׺?O k>/Z_~%ff3DlY(Ϲ)|t=pրq&ްW-}g}]=./퉝ӉR U=&zzm1WfKϡl[׿ʫQZu\6k.owyCw XyP+{{  L^b `5B< %&@@ PVsa/ L^b `5B<)0y,@  $@(IP6cADH \ P$mƂ  @$ @Iڌ@ q@qJz0kͣ|Q,: P˟bGx\,: Pkͣ}m @ kGЛAAF8; 4K@o6J<>o 'pK++O:iO 4LYG)=OA׿4>BB?x8 @c#   Xbs=~ǩ?zw? Lb⯜= _b'Fl@3t(ψ @SA8oGϟNL oEK\a +9_d9 ZS(=d3QTM@}{1]I?e:zp\$'v^lGEA A! |-^U=nzm}S{[LA @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @v:7BIENDB`PK !=  word/media/image4.svgPK!+Aword/diagrams/layout1.xmlWms8~3<~H2LIP:s%B:Jr ֋m@/>},ya_HEǣ0"|;]/#Ogw>3E$qu9KsR 5%5@r`x8&)E[؁W@88VO<$KDX2I]MĦR`(3iqbM)QЂGfrHqTJ yw kf%Ǩ iUp/gfeln#`ό_FE*f S~&*=}' -nmխ=]w!q0:FoйЅ|2ytoBwW?y3k?A3`+x"u`+x?xm+(+qT{ߡ'$J. (1dnuù5f#Ucp#$A!^UAQ7b[W JAț+:ZZuT,xhխjlOčyHҾ*7>M$aHdS9-Al(0௟~i[r|Io.,v8-kcdvkJ: y(g-I'tmE7kxR{z'a%+b(6UBU]frkǩO©_Pu; ӤB#؆|D8wMVc5A utuucS1FG6"3RNmjfV)*>Iڝ:ތ sᠽ?by/ ˎH37-v/Ķpg3<7dzP&bn= @{u͝9g]Fɋ.'&ZDͮmPza;jL0&vt@<9wܞVlhrC!C`>ycǣ; =`>8]:Kt;ϚsD/8T>}ݳO٣/"l XY엽~Ja8QiOp PK!Yˤ Qword/diagrams/quickStyle1.xmlN0'"ߏM" >T !X8vR~vmB:&M\}ddōZd+ Ͼ: *9y▜tTTԺ'/xx'N}QNjiZV=r-iJ CFY=- mH EK~YdiԴhKtԸ`-=LwZѴOqwkN8ɓ9!馨^¨n8OS%8"IkW4dYi`W8>zrW\S)݊*1“qƑ_ NHQh5C`pt!(89 -hR<fZJxނE0\H$/aIc8,0 &xDb79F?Cpw%P0^G6*bH?_^x?PK!<4Aword/diagrams/colors1.xml]o0'?D_:Դǐ*Uդ8Nbձ3P|.$ sΉ8ǁuLp8!z|8RACK?S.=ɩn@T2u]"CytoE (BU{:>1(=\Đ0,McBP'* Ji\he+JؖhKe;A[cyL2bWM?[fˁo) ٓf1GOHE(cZaXaEil4*fq$oO)xҤ[ )qBTDaj(Sޘ%酝]`d1{c[{>b5uaqe:R6Rʗi!nJlQ-`k'[ 0j@ab1$PEvk7YѫVujezw\({cBy 7QYWbW95~P}rih~}qBv ` $mhuuYj_L8YmS%-)+qcryamĒS72ʧP,ǂ㭝 fk>}z pk{,{.UIGFs>/0YDn94 'IP!Z;ӎΩ.GV n'6q@ "cz+ .cc/ #SF=+K-&<%ٝR-y&baO'#e*ζfe,V2a32ʥl/`>Gl[?"ِQ%+u%0hne`D²j -_akL ?ʹsn 2RRa9Vab\'DQ@T!B2٤WQKZ@Z2gbR k:axG۱u;O?0k~J^w{qCwqZY)"mlYI+/ Z ^M->֍P)%ۉ uoDoJk^3KNHC&M*;ne]:{}u[y,Y0"\+v:ѬP}zyw+5Y]}$ 04O1~dڡMvI$ǎ3>!BCK"Ga洃@V1Χ+h%BEd<2VD2tYz  l'1>EX$p!l{n KΒ(L]g3'Lԙ͡8{2{4uh' Q (;q 00W2@sS¥0]N` #.e˃39aaxa8Og;tg߻Xo/PK!Ajeword/theme/theme1.xmlYOo6wtw-[lu [ۭI[4iiXSARI } e vWEIh趦@q|{z7l@I{fe0 IY|p4ቊO 71Hpyx#ypƩbb"ȘN.]*toQa?DER: D92b,6'ZDAHw!JwL!N|$&\)ilnW5f_쫚}U?.t^D=ϋD>E%Lx&PvEN(mQ baJ3f,km8KITH[S([J.6$^Hte^f!"TD\٥5,,䥌 p7aǩЯ{LumDZ!QK7D- cM%_TbF>bڀSg{v,zTE3Y{,Ҟ,(C&'Cj`\knv'_Jη>zȑ|A&x4]QFnx^oheEP 8ͤP"$yN38 Ld'0AjCK{8m37lw+$[%-]FF"H2|Ǩ!ŧ${/\D.cxsEmgd͘:9i wC:{H=IiwBHbvg3͏]g+7g,rfpWҾ {۴$2~DHcJ˜m#ئk86'6Hk!%%325*_+`%Z-( A^ g$Q\(wעR0_B_CPdV *#hNi"jG!`C)luhN)4{.UY[ʺE%-=NY@UΓCԿp:;n7:_,颤3ތ!f⏴vVóxzsA!+SZ[Wy%rZ5ͻ{EVDiÛrh`:|H8vtn׮Qd"JSbYX'$~FG5xm-B+$+p`c/H.n4X[4;7y+\BBj@Il3z:'ad)M,nqm4'kԵ5l+HQ;J5Tl*Xsu$i$FLO#I <3-lRNt#qVMq<R(e絸'}Ԣ 9}Y.ߍ}B)PK!pkdocProps/core.xml (]O0MK4qt``#A7xWT֏p 眾m:=<؃\ { @RŸ\ObP`Jiv}RPe( q'IP=AtBJAOkBd EX#8K`[":!mzg (Hgq܋Y{@5\6V}E+ϗ!WP28rR|}dwo.fƻdddy^)n2zF'2zB9?v]̽YW {^lX)4=_/ ,%Mc𸘣a4 "'QE_徝g8-KleݏPK!!edocProps/app.xml (Sn0 ?7JEŐb( 9s2%Abd_?^\ei>GҏOmS0&J&SQ3n/经H;\ &߿SF pi%Da)e2l!M88S1{|آ#9N% ]]Š15Ǡkh*PO݊7`;'ZАE?ysQ|Vт#1 MHuia0/˱]t&p[ؓ[w}\fg`5;Cu+G^B{l;Km-~?˨-Gⅎ;ONu{5':DgcFxWM;|Q1%—:f&weD"Vco*PK!ȑword/styles.xml]r8}ߪv2Ȗxl'd7O 4?~EhQ,??h$oF_n^"yB2ӳ-GUY=d8@^ZgEU^.I[ќ_bI*~X-IuzT,ap2061}敔+hY^.UY AcE*XL˒7z)%I-Ӹ`%W?I(.~/- 1Lbz8{\IΤIǭ2@FAz?B**Yj,Ȃ6d"(+71]˯DPQdu)\;Lt/(}Ot !vR\o]ޅ*hXIyctX>VA{ F hq,Ʊ  hq,vƱ)b c[wwᆻKpnp;zx\5Ԋq7+o/3V嬢b{cɄ< h`Td7ZLn NޟW"o<낖7HpօE#.6]9-hӐTdQ^âyX}5b4ϟIF$qH>-u%@u@X{LZnقO$ aSP*h4)LқPzhM&2[.=|62c⡊w=mNҳ5)mAVHLswÚmƖsu뚒Be҄.V|Z(k_<bH6L4]Ϫک:f9%Z }Tvq(9K7l;(ɂsSKmo;v PK'#>hӽHW,M!Nl #fZ2djfA'P%!VuF< o^,IEF1oo>nJ$Ba/XUe0L=?a*xS!PkMZI4@Xu< KӇ#EjLE!Nreؠ}G;$H٪PNu̘,׳i>(|էu%gEpZJdM= c[p{LvB5 ^SpuN5`0 րTȲ2/CXl ހ&#L Ji    uC! 40BY?Г&,IPv&Bٙ eg 8\c@92\GWtb)A- 0Ю 6\--)m,XVzO%YXM#%+vSp.X&,ϗej~ w}.hh(ؓuZ]`34I˺Ex6뷀z7㍖@IXdf,ݒ<( <()%5IN-wgEpg}HvI\%:cL3gÜ."; Ɲ(`T*ky c9vPw|4VsmI+ٙ#bpȳC }VqT vaG(P%>B1C !Ў !Ў16C;9*DA;*@;*@;*ʻ8*DqqTvTvTvTvTvTl*j@PPQ!BBBBBBq'G(hGhGhGU/f;*9*wqT@Q! Q!Q!QCLG8G. Q\BBBBB;9*DA;*@;*OtkfPM7sKFc"J|ケQhQ*1<.NgY$ey / D=N| J9>5%ARz癦$%$趏: G=}a>.8Tq_bB $ Tp_aG3ٖ>IN pbG3KU}@Ja({v4P|Zaڡ ۡܨnQX!ƝjL5rF,K{p#8Q `ܩPTC(7aW"`X=;d+;ʙjF5aX!jD5qB9S ܨY=j"`NTw!3j9ӢŰ!gC![2%1[\՜%4;PCi#CCQ˖vwT;j\d-R˖zeKvqRոljlGp-R˖zeKvqRոlj\Eglq-R˖T㲥.qRոlj\d-R˖zeKvqRոlj\E5.[R˖zeKT㲥\$ )U}oI'"-Y&QئGr﮵L+3}{ㅮD}W%&dBX$۽Ӳq*Q (ϊf2YŒV}Ab.PW7ZߣqӖf>R9qY3~+fh+-j8):3p׃VL%'x*n1NS6eQ:wXYf5M̉B330;5og8wzqM!YQsd6V&Xv#`ejɓt'=JH܏@G` $ٻYS,6^bMTDIwVs'[Y fN:Rūi\i$=[647 q0E`_ol`H]4!]͌OۡCi3-ve>W>_" |Wa*(:*lfW6at2/.u[GzfcT]r.`IQs!ѱđRNsjv wlZߩa^àibiۚt6CY\cX= h<_m 'ܭQsaۚ_0CS>tLV:p.Q ]lZ ؑWiy .-Iq ';9zbo>])[#y]m?Bhg(HZX6qml뿖u3=t_O+ 7h?': "&[#>+|#^0 _cd r$( A\@Z kQ0?5u)ĴzV~ ^1&Z]:aP! MVˠ@_/PK!l=M5word/numbering.xmlZݎ6w"r]ev[u5!-e}B g  @a9ogIEߡ鄅no_$͜pQ,}wpX 'COY%u,pһs(6ٝJx.SQVHI4 N:-ܧvh9@g)I2tAtR*\R;C UHQUt9rHD*)T1jQBDId3yT'_pd0Q8^UbDT 5uOwI8+:C˱=g))Ӭ웴.`MIw8 `"nٓ(Sl|~MxH,YY٧]0\ I% RȄ |]œ G SZ?jO^ Dq, bł̩{^|L ]5s)Xʺݱ[l/PQ\6 cG $6SK/p~mQQ6xQ~SCi=4knX7F5׃c!Zh*Zd6CRZlöt2f=(i&Fn+}!5s[<,0K9A9XE:N/ 0vqLHjж ]B[LaQko!Fm (ri}cֶߢ6mimUim5/wZ_׶9eN',%ϭE C a’¶Z=J;)Qbv.C!W/yxx_͵a:fm1wvFTzyP)C2:,٤Ўvǒ'v8cEVvcos\Yɼ= `qv`ɘ;Gke50A\ {xaS〇Q{\_8ML8:F7xt*#Oc8C =kv,u:Ej5ΎmuZDuunvKGHRoс%YCA$dUMW"jA伎d6HVoF"w.&7qs0!qoj*'oPK!&Ho-word/webSettings.xmln %{{:5Kc5Y,K=©%\uO?xcwS7_J:&'aJ04|}$qY.uV$(e(u+0a@]pr-:Ni{E!9<#i0ɧTѸRVշh5ZQY\XVGO3ihri-:,0,B(m"i?`|8ACfב3;;RtĮ1~8ޱǝΈ\Y\y)8 o&۴PK!R _rels/.relsPK!8docProps/app.xmlPK!?_ZyydocProps/core.xml1970-01-01T00:00:00Zunknownunknown1970-01-01T00:00:00Z1PK!t.docProps/custom.xmlPK!^word/_rels/document.xml.relsPK!Tqnnword/document.xmlMinimal TestThis is the smallest possible test document with just a title and one paragraph.This single paragraph tests the most basic document parsing functionality.PK!ɩfword/styles.xmlPK!4ŵword/settings.xmlPK!E@44word/fontTable.xmlPK!h.YEEword/comments.xmlPK!$ $ word/numbering.xmlPK!n}}word/commentsExtended.xmlPK!H֎ word/footnotes.xmlPK.!Aword/PK.! A#word/_rels/PK.!AL_rels/PK.! ApdocProps/PK.!H1큗[Content_Types].xmlPK.!R _rels/.relsPK.!8 docProps/app.xmlPK.!?_Zyy docProps/core.xmlPK.!t.큝docProps/custom.xmlPK.!^큳word/_rels/document.xml.relsPK.!Tqnn큈word/document.xmlPK.!ɩf%word/styles.xmlPK.!4ŵword/settings.xmlPK.!E@44큺!word/fontTable.xmlPK.!h.YEE$word/comments.xmlPK.!$ $ 큒'word/numbering.xmlPK.!n}}0word/commentsExtended.xmlPK.!H֎ 큚9word/footnotes.xmlPKZCdoxx-0.1.4/tests/fixtures/office2pdf_test.docx000064400000000000000000001133761046102023000175630ustar 00000000000000PK#\ _rels/.relsJ1{b{wUDdЛH}LHZP PV3#za uMh_hDbN FH^#rsZ1 yi0nYm+v׍D[- 'ZT8ʥ\De\K3e {gSK.: Kvc\SdYDiɢ=ϚE}PKrDPK#\docProps/core.xmlRn0+"HڊS*Aժ7^رlC$$ЖCo;;ٗ狣+j$Q\2G/e8CuTqZ rtݜijϦ`x#e 99 Ɩ@Ry6:M5e_KpSGqk-9-Tg*Iց惎RJNnJrTMDMI} ~[=QCU1@axҗqDE0qI3Haצh 1ˌ߰'$<*~eIT{ʊZG 'q#7t$ϹɌLW# ]e"銎?>~ WA?PKUdPK#\docProps/app.xml_o )⫥mfS Od6UݛapmYZ F͚>'=߅ Y_6uRq"P\ y" Jtl6`r%j7+oc. Iێ m$9j~@y%IA s3@\]B~n_LQRAgZ恾'Xhp8FU1$=?=^,[1z~N=Cj/+)- '-o8I`,v\#, k9j 9c.#EoRqR4™:TQم"|95Kdo!{m~gPKPK#\word/_rels/document.xml.relsn } }!jBz&:e@CP;o?Tm*u?lL6#VEI X:m 6FJ$_r#b"%qJ{yX7#utXLS& uN$HO~HMbVM]SKKsNEיѷM3Xc:eY Iw")kQr+b;YN NCZNi\ ]fS)N$xfIRPuw|/u!BѼ:]'O;@2﹃cE & kDR9pr),~)kmΥbT ,%v30{°TB?%ISQmDrj` 'SMq`Ȗm85CgmzEJG/((xbesWo@kFd,M%/)*7cS9΀eKh:+bY2^(IU4bC>4ث$cE R ^Dx ^",G<+*.X VK7*ݹeF{cQj_O]4~G_~ rh'=,Ӗ9[Lr #q=:n'%%l{; 'b8(eDOrJ\2ȥ40Dap7 z^.iA 5OD2f7o%9mfڮ\L%] l_J~_fa@zAAC3 tTH Tg8?i$:w:u w-w_GpK4zƘz,aNXj0M{,P8)@xn;2.|CEQ=0z+gqr2>t$QRQ_3k7H@^-.0?|n:cV7zshR YXŹ+Jm9QS~ᦑ:V Z2XGeHib: #e`jnX O~sWa-19@ߘNm$ 9-v;S#z3`s 5 ;FCp{^wi""HcF>/~篝Ȼ~ C}9p T3CC>`A8p&a-m~dX:A؎_God_8~$=Px=@= '#ER.v9&@tn귆?e\j\o;7 K7ԙnЖ7ya~Ύt5 GDH]q\/+e5]s\O VgWc^]aW_+_fzhaAL21Q"R5β،4i$j0O7"<'7o4m0֯o'@k.7 ol qռRdK ԺK+'NżuҬvwCLo$8+ 3x겷V+#!%*׿cbD泾E~F/S,Vo UvT|p9ӄ*_迚61gfh7u_ DqkJ~vcw)+pL1\iL}Oaɏ FZUDr7{d#aڠ9)8:uX!{qwΣ%ӳ3IՖM- noov?l[{騗1|}n9GxBq~ۻ3զpڻ=m޽{IžlŸrIx^ /Nur7HIF4Ra{FL*1c=V `*_ h};)Uhg["IJITTҰ@>K 7\M +0,.cS-JRrs,LE(cNS"/$QqG!{s`GPKJPgI SLPK#\word/styles.xml]s~ Φ;SO2i $VٿJ lavfksy:⨿sGHD}o6q^_,] p W3 ?緧{vaq~|x7:@1[DSb {ngfi3A!ٔd 0jw x E9F< .זˣ:ľ+,&Sל`hO@`#tO|F?o&8?CI@t=erw{q#xc +"囪d[a9#p -e. wE%Jb";M:wO9$&!#7LFC4' 1[pY0^qz\"B׷e 89O.:#0%6 1z$S^iGt25FFU/A7i^b< <#!\W,B'g'䐧!%nT.ܒ}`ȩK{Djbr짝OYw:Rk@eHl _q`0)qs iMи6Di_Iiehr3_r=;0 j7/qG>9j(] |֗x?+**>%e%n+@6jw&8l-]=-^lY+=3|02Pe( "= DFSb+lWl\Zb1ۏj 4xYӹOZ< ipIxp©J8@ ZfX Z l4 Y S-PK Z kxa\-f3p,(̨2#=Ș= $V-H, . $RXbz#GbƵE!:QH90r # À/WE#Zm$!JeDԁk4R^~e}lEd oNm\|Fx~P5 ^T;?ԛW?ߞK/Hz AS^%9m}/f 1W)0s^L(y0^ mo+{l)SI#{6j贑".i&,En.M' 7uڸƊ6<*5a2m뉆%OВ䚠?`ʄ0I \B} oVi\@!Jcz-a8Rc0aQ4 J$Zh { q*|LD#*x rj䩏֣o?+)FF1h#EN\d093s]l `Ij4,%Ż$O(U~ĭj+(SHў;hQ9m4r.]SӴZo=PɑiKv]aA5#>Z T䘚[[;\b첨h:u{"W )ҷ؋(ٰ@}Ie2R5cW<Ķ<Ԋ40{SyP$sj4莻ѬVd56p^;ԯ>V3/D.9bU}\8#u8V; {Hdˡh8M}t2q@F: ;r>8LF; 縚P,'.n2R|6jRّ)#=/ 9/֑(W#Rq=O}I9WHUfKE|FK` 't5k q=Fϱ|/CI\z!,q|A!kUX ?]TXXF[cE_`$2xG-TU11CU)\Z&`oU9#`~n!2L.*QB t}3~U*Źi2ZgJnp%opCt]ZRMMU642]E;{)킲2dU)KET1GnT9aWFYw&0h]c&!£hAX._cq XQW| *I!ךO )kKT·FE.Ըin`S^V0kߨ^ݾh"?wZkaE Kꍠ .^k>qnzu.b*6b-eW eBĿ-7ӯ6+ }dvӭXzPd@G0%k4J aE!>Lx}4MUNHF6vދ4sX\8N>X7'"oA C*K_ -1#-pơ=_ p>fOPW5UھE)M6#ڐp'o WYf+*i/.se| _tX F(9C*|X{TV˪_k<੪'хPzP5y5KdK7AO/xJVoί$vkUQ$cfO0QJ|#OzMpSBH`?l[setwL(yoPK qv iPK#\word/numbering.xmlYn0SDvY[`6U.I8`?@{ۗ# sBRfJB3Ϗsr91N6 Hi(Č|¼ZhJ&+=Cb̙ȲAK U{1$'Z ƣ3P[m-"jnX` `dX, 4@J ˰P*bQz?'#@', 4lj0ywb]qXk`&^Va;e`.~`탽M적 j ' q_!\LRMӟ00*ER#0~"*)؋] I u'rqےfV<,5$>? )MOwIȲVK` :<7&:]֐u&c{!]^M.[C0ؽt[U׽Dͺw{5)I@^zGKHx-R^j*%8nwXu{UwwXug{UwwXu'{UwwXuz']AsA7&V8H% Vcl1^6|:dr"XǛ6*6PK؁b)]PK#\word/media/image1.pngtePNqwwwXaqww'!w܂CwBpwܯ>KtS=L*)* 6 v _}?Gm y/99ɂ!rmTՕN<O>_o?{߷ާWU>././SR NN}..>&'?>BB>,-?@l7j #1CS54,<⒓gggwskTL%1)HɑڂR  yTPKI/ShWE K)_(Kp>FՖۃDGP$O`jD Ah:YORJ/O61픔HbNa/\^+aRS{d53pRp(b$lmj.2/1r˰7W$u;h!|238ژRL7/ 3/:QS'-L|4p\kYaQ( udt̐,v/&g2GPuyb)6*y`M,t, } q6^lD+Wx# ->FJZb2FJ7qF>wӎ6g: KS|=<K***%e-FG~vUU%$KI.猍뇋EJYGB9NIFEMHb1Ka12 ߐZ(b,@RRC>A#<T/%gey8|@]^>~6 P\Gή6v~Z?x9:zzgk =oPAʸ.y 7k(Z(pm3%YUkN.V]Aw&+V] ropqJIe]2u}2X/Bb'&[Ə' K]8eT[>Qm;4 ]huL۳Wþ}bS>(KlRD^ ѿ3? Obo=(!2VRG8qbZ|#9芢.2EOG4 2ڠ nT] P,2תg|0ˬhֻȠibk2^J՜xU.sq_.cTHğ+uOc77׻r`5,YRp5/`ì4:B#~;Pck,hda;kop̔-u͞D_JwL_m+,}׹wNIPo[o4%{|AM d$,a1WVH `)2qt{*kS^f,CY9)ƒ@P}ӯ2pVU8-*,|a^ b~o *-] 0NtsALߝ;dHݷ"J<2h4$L {^f#]JCls?YSE pX(`"V[`',,rC븰S;\Ê ^|_ۺ_&7'\tRLbn-­Mmoƒc? :8R;I(N^U].x hw粨A?;uH^5t3v@q:l&ˤ _7ꯝw /Ng]#̍N"e4HIB?*?`/cYD("6 FpK5""|~iѰ'7 U+yg#8Dz6reA=-)k@z|JS]9G=͚8 aHN_lPvF聾$VkW+>T/qg+t'r@feUͽsPj}n%.\[6cR& fHiJPVb>+ ZP|9+GVKj9 # wȷ^ CV@?+إ B+Y#<Ǭ߄pe(`I6O/BRrS ,̔D=(w2S:ZFW6RuX2`;9tm1 E6t[dLM n3U_E?XSY/Ăe{#FFZjlc!SY08p`O\0?~5ra+풽d:zReEN%zNJCL:k{Zۜd6O *e*N,4$5OߚŤv[ gQkニ4Qb }Iҏumg@I"">/+n 1sJSy3ZQ(]&/H* x4 riܪ ;CgþNˎK`Ll36# 6GET? {x,UkLM\~CM!qWr8UF.d~iefFkr־њ ?8^qklGYeMG۰?Aj<%ml&2xuw328"/`ag{=ΰ0|jȓ#%§*ti:. @n]^Zga^:T֎⨜aIQSD]RzqOpH7s|D'13> v7| i~Q}h9Py: +)vzUg8 JboRfxG$X*`>G8L^JM߬)EGtSAEVii1c˶_Ug8X-y5sY='VU7ZsEݴ9ٖ `QO[~{aojڽ,yȞk ᕩaY4a.z8 >2ɇrܡ |VMQ]?+7ce)eW f yGC]B Jjf˅CcT)~&d?Va/u2MgدYW'+^ ӟ) NǐNK _Z۲o4SAriq1W?lRZ {>ax#|^ ??wlN)w2b3!8o($xđ [[`jc(ёc6$?/fEOM!Iܚ`D>;,GoyG&eb3sҺ`.W}=nwC-"gր-FGYMscW6&l\Svx|5FeE$@hc^̱̂^fz/ce '\!lp5u Kfwz_ғ +.AxV_vnY] :cM 5allBݿ'P]d&Mo20Db4V'T;^ WŴ& ,ěqU) sjcEϮf~y03'i_Uϗ<85> rN@?p|zi1MaKVV#GJ&mt \9.4U񥢺Ur\U%ۛ%H}SR/=ݓNkM.Yv 9I6fu1ga?O:?h +Wu*m ʴT6X+ql3{gq!6*f-+LXU؀<餧4?[vssȊ7)Aw-Ѱ+X>Zz3$sa aw[T%~UlZm\i13BYa;Q=A¶+ IՆ3yBfL> ڻz9_;Rhyuav.^unQvq9@hn ᝗߶ /{P%e'NG~*1[Uu_t~;O9G qB6;SRhN=/ſ"p6?֓-uS6$vA=Qߞl p6vz"&wٳs!!&@R=AdͰS=E`f5iO@] ?0cgOo$+bi!+톜Z߹?íplw陠ytoCW GG{`t?M'@KzAtn7 ݥ~Ɣ)9m|2Vof?CgQ>0RB3*X%,#qm u0Z[eŽVWaMjwm>drYs& ҎrM:o%O6{V9Iة[3&Fet' M6Ȟr #Sfޙp: 6ۥ;qaz9۱h oN @j6ϲv#uևKܼ.M y9z e{;kkqQ`޵m\ ȤM]y+uy1ѭ:"jë p<|/*;#&Z$G:Tu?!D.d(ߨ 5)}]\)ϩL$].:ۈhi NSsw =3T.8UiãNGAsiۼ(Khiz׭S x">!L:}ATQFPGCnhsCFqM?zPD5bfySI\N=],˧3#I=뷽DK7h2.wlJ|'2M1Rf_z_g.` 5Ii6.nj$s@$΃Ø؇  f\_{gWhĜzm)~"\ܡf{ϊ^4(YE. Q&5S:5l-#i\!jC_M']0 iKJA!⁸t՜--ăsfvfٜ!tߛưt[:xGMrA|C.3*~AC3 u(t>FeanU\ͼn? *G 1Ix?{^_P0qUXʳCJaW`0W5F|-ΤӮ\ZyR5H=1ַЪIX>$oU ,q)xX$/S)V%W#1N#@"ckݶ*DugY+9Z؉}*y5.% ތ?K7Ҏ2pCݙN3>UCLJ֩%vt \I/fd l^{+B^+)z+0|m&B _18@2/iPU'@4EO7W{k?Ég>jnZ(.lMa5ڠ;X6v 忴DhgA[y'7Ty=j<4Lɰ#O $sF"ڲ=&qv A<axV]-]$ ,EJE%ϫx5z=ջ[9)+dӶz'^f9tyRxWHv]p F`CeDŽ’Β[;@z*"U^ECJ}"8.kd/vh4/YN!הYڴiqSn|OWpl_ M3ҁ~V^ĎJ{mQM?LT1m:-%Sf xp:@dk{дkʴ.x-Rd+,Xs8,aGqF:?BBOQ1gl ~9S3 +=Fb<V-.piêZou뙳B `֝o]W뉓oO$*xXR7LaSW?mt*tu!NG,\ؤ-׳}&=P46165yګ{f8n;2A KS;teͥۤqS6&]E&_mr܌)ZOz 4_C^Z @ԅS6Z0Yƾ6^g^}gN߬"@:SR˨?8rVe eXENz:%Ta Z:w(DWh>vuK[:n?.&f ?lq`>y%@< >b=}kykv^\QXl+FY5ʪ#} tkFkɟf-rOYaAJzf67NCQ;H}$qK^;fya9(;#aU -t#UШ%f6އ7;4kP/=4gwHL@7.}TԲd׏CϨ )}cVDc{ O2R/4$MNXҾ^8owH.]?ݢٵ0,)_ܟMuj_ˇK:5F͛؆򫟲?|ìXh0O"ʒFn}R_It_d) +N)8v/'=.EK3/SuH |UW~f vxU)v1۲bz'NO&H8ߎÚEԤ祂m(|=N^oM C2iۨʌ2t^I>X'~ߝ̐]5ٙx~f'y;iWꛨ܉\P:c%G6;}hHӼkW.RCu7hCᢏ9O)xu4&ж|%1g[6I_}#*tWV87ѥD#~ۘ"JBDZ Zk}re?!r Jpv տ%&ZN0Laj3lL PG.<wX7kݕ(q00A18&<2Ys5^6ٮBNUeK RrsOę0k{m)%A_ jkWCېZWӤ*9Jsٖ:,jB$05zHA >:Yk ϊ9KVC}UcpaWEY3s5#5C+d74.R|mꡄfySt=t_6K Ha ?xך`vlL̖)ZhqMt." \Mh{#L$CG20i63/J-]%'g Cs[cKY*}̨Dױ_]^q\NnCZUU.]QԪ 0I\֟L/_k]zz,X8}PL0p4{|>{y`azO+FF2ޜ#.GS.xfҙh|-q| ճztm}tWI P('< {Vf6fBsv$%dq)\z=>k(}>f(N`?UlXEVk3-2/_0ľyQBG4'J|c$eui &`ꉿpJYNw\u薏ć f9X-c/$גOɀ6ˋ+ d2.΅ 0=mj_aM@o[[7/FvgsވjT^BdazO~cl|{c]-5(㯹38av9,jIN+tt(e>4d *2ϣ- ĂS;1%H:vTOI=o86?37!1XD`5'CQ6,gy?_ n`pL=|,O'Cd|Q] }u.T YbO Sތ{1W?liVёjd<1YGЂV5co\)S&1VӀecRJjAs-3 ]);wb:uP+ẶTyѬKe|HH)bÏ0`ߴ-A.ꥡ%DwM_ L&zMWuњ?2~3Rp? ZX\$'m3؄YK}_{XJ, 6bldڀ.*0QUf2t}}o[: oW\D삆SFԽ|*;K ONM/PjxQnpҞH.IjqE(D$gG\ӅKyًu3")C!1%t-ŃW<4};VOl#a$[%QV_ M:BLFod=C:Û8J7e2EWr>II?a[r5vT%0* ZOv Ԧ֩sV:#CSa&,k9 NCec sam(V OvYotڗəx5=w){4a\{ iA0;Ku P+ {Ȼ4׬ŗ$@/ B+};IP['KZ[qN%mW7h1G֌$4 cL7민/gg2|@B=3gJF:Lt0_0Bjf2Q{1/O@AY.+&b)S9Fv:5S%x7DҦ[+`_uÏ>yfJ-b)]C3l\Y˟0GjI o46:NvպP6{ŸAA'![V otFĴ bpYJ53N(mDӱ{WETՔ:}-[efNiG~s@[`TDI"A V_^>SX:jbNgF1I E{.ώ 0GkXBM*hkBWUmE4\^}/(f-I=ɡ xD74[=K4#i6i6!BK9zfq \US:_1pTSzJ}:]X a_z5r<~y3\dJgKf2_ T dXͳk9VwݎcfG v4K`S"A9b ߩh,ڽr5τ\>''r"R3m)nT8Vp˖e7~3LvfӸ On,;ȊpO[|ehG)WGAQWk+O!T ؊dL$8-a\#ϭwvBUq~"Yaa㹙Dl"B` 蝯4_᱄^RIJӑ~,0>IYG5OZu64YѪ]&x0DV&# k32kIQ D}hJ 1ZzJ"8x0%v]ns]y.=?VѻG 'b A|hbP!6kkbr܍{1 zLxdYhx!XJz@wgckX̴XHR4jWj8r qB1빅!yR%[Z5{8I9/d%B?ŋ@ˑ4{so9!ݭ5<9v<dq|THx:I1:]4"<{ rfB!)T!L!̤{A|2tNbk0ăSd,Fc$C_ Y%H_cb!j%f8@(԰0vdjF\N6qץt\ru;:o BYIW`)ZTp`/wexX'(W9 %/%LuTn䶧v2v%[>3w>;߿i葋FR:J|Ƞf##dFā9s%EJ$ȌЍY&^S2/J5 5D~mKP|&j@֩ĩE!QDx6$!,Oj-o@.{c'v#!&{NB#?eI{!nb4 cXΧS*?uZe_DeY_ AJi!"=r#W#GZ#qe94^6WkniK>TF_ g5!d?z8h`O04IwܶnAn){~>F܏7\lu!)տ@ׁqA6Rԍzܜ3Y۔j˞Elv2tx d4k4] S.&=;$O6mpٳL?fU[5B&2:$Dj͏& ,r?pЎb,9+Xr{xP>B$y.&J [ٞJi~l'M_' ʩ{ߝܑgYd)myg|[gĐLJƄT <3vϹ/E0kjqA V̋j$)tɬFp†ؖ榪_xČQÛ)a\1T2!l嬛h26IꞸ GYv$Ŗ4bJM$Qv+7,$QEe/5b gJ%I}o'C}ܵ HdQX ]_g}B(4Bӥb2V/.dMu`EO{UWUvi$L:8St'c#|*˾Gl u<-dw!е28_uZXQx/[GQM MAF4fS$x6nyZ+ckIuܯT8{؃`e Ast(BXYNng`zBƈ8@i\5G@6;g`fO <,' D] ۍEbn^$]kϐj:[WPsQ]O`??j-$!?wpCw>_P%˫Jؗ2sv>хEI"K ^^tD?96ߣ4hAdPL.?sE]@ƭ1,T^qZliTLb&ٝI{9q E㰕EaڷYG8Ui.B[L9r m#\)ׅ]q?R$"P*zh Ow0:mB\!Ǖx2zt`پ25ט<ĸt|Oގ4 ` BĠ ̬8ϖqŃ;( Kz='̬QEj{Ǩ vWn=Th-c b֒' 4K[8#H%٣G6vuL UGG;%RcS5Z~{g!Y&?v(K7FHn3 ƱM %ACMo9oz٬Cd.ziɊ,"ٌw9c7UP۩'zU&| ӿs3zT`*tEC@eFC'ۓ~nrc#U6kGyԁz^;IzߑWsD&%}:K/{%W.< ̺#Z{١QS)ın#.n0[`l(Nm/u͞5)7X*LÞ&TEW8/r <>wC/^v=-yG|c>z)}CG}(:~Vx=cp@ OmWI!Ĥ>?t:9, @ĔX, KTϷ1x37Dy/^` `HF]k-a68XgK=ç6T {fC }APOƞ,u.>2 ­>Xc7%MO)ņ!)蜼62͞ݔ|LKL>V7i]樂 RaЦSrR(jS$v?im&ź{DlLP @hIuRoEyaUױM8IS44_?ͿnAt`:jb0^Bk IAAve:T8qBic3b l@wХ+u'稤qceKje[(;>(p@0F?},(s1o ,v ;Az?9#x1E<03Ο_G {hC"2_#\ֿGM5`䤘53ءxJfDB"F(jƬՊXQ[Q5R5j(^5JfZE-j+Z{w{>yϹa:C\U;5kaԢ_otbumO޸qqs;+Ǹ{?4=k?j&EY!&}D9;7Ufn 3xq2Eiuro;9Q\v WP&L1r[y>WH(݊o$;&pP+#dR4`* j\@G!^]S(;ZLٸ_i=ѷ9}9&3Hqzz)!llw^YNB5iou8GL_뙳r#W' ,T ]^QAdE> 9;=nFgg{lUǵΤGg`Ҳwrc'i0 $(P,9ܧbWh^-29_߂75)67=wwڄK}847BM+++I=Dzcage9UXiKh6E.H $>T?4-6, [7}?JsWNMZUWݣ2Xi.Fwz+ʹKlj"Z]:.Ny0ZZEq]3tx1Lт%wU=Kd%.FI*':l[sUNn52\;VіW5CX@)iЍ + 2e86_)GiR5k:vi7uMv/$"曷RItc.Z#K#*=,:5eǒ^\y!7,QK},ώƠTN$N$ȃ-8s14Oz:fX`ʃcc%ȼ)Hc\XFtـl"^[Q5gՃ*M b^˦W|;@%-+ U[~'|Hc4w уbu"' NRh՟(R ^I)7~΢m06fRx Ds;׼ϯ%fW8ڍ|OQh&7z-_n?QuFNY_G7U՛~&JWEzosu+/-g`dl$Nq$ǹV3A)/S#Уc&w>Jo3Ib9tkHr5x^NJ_C p( HPn2$1k6]IL^_ڹqsW{q`zXrP7'c:X!A !Da l;@Yz=`7c'+K(>5▙J(Ftދ35@(-sj Rg}, *%3&vI=_&bW徚91R֢0&kEuh"d]l kav68a)k7< \9<[L%l$hjfBݠAau5^gͫ57,APPӖ*޼ /l/i1bEeyaecp;PfʗoPܓ( Q(!Tlj;;~#0Zw.J\?f<09)~Tm)xj7KƶRʭ e:0I[fWuﰕ㿲 з:E$Q2xRq|>oOpQz\ibE?%a^\eJyaÄPl{O~.ߍtW=ID*z0ח) g /10t1œ 12"H ޒ'?Jt&>6F^8DiY/` Gs-s+@oRHwan! _nz>d {hCnۼ/{;ֱ13aq4w` q)5e`7d,$Ԯǿ)g4 PLg̘L>V):TT9ŨSXP>9K?a %[QQE2āyF@:1tME~ WuqM5سw8?msIswrW89Jn!R4p1C>ÇQD ʕ^aJoQ A|S;wa~wEd*ddp%_tX;t 4{(&!\hzba3lD"yW48)K6ʭTcQ(eCf1N&MhZ;we) fpٱ|GX2>aPIy:Yz'Չ6'ZqRL>&L ϻDzX!'5DGTl m\ y4AEXćӆyZMa)Qa2C3*jh6Gk9 ?PA<3En$~AeU! 4h۩+(tHGs}TCV;MO{UMlś|݇I9 wHkO'0,f/ \]s h8+j}MaJ^1?__-ĂmAC4J\Hx ﳠwǹ*ОQ` [Du 3+HxNX\;:0[i#K@:4F9x2|{-$2)+g:Ja!8+s ;C[,):UG~R5F-]#L)d7\:Om -ӕPK뺉 D?: j*8.mbkY5ҙqz4n%"Y ¸3$EN)#,:ҌeF G)}PhOLL+x' tGCɀ/C*V[uTo+P#I Pҿ!Ü-uW$oAGrs%6ko7͈]д W}еGjOձ w.P@X{v\)~* p<ՔXyH&`h.-vP+!R+w#Wu3IO !Xc(`f@1) -65)>²J:ԯ8>yX~e΁.;|s +GAS|„*  a\mNT=N||sazmcHzfAԥeVs(T'֫>NtYlpffkstzHqP•}̧gL%P6w&]=Τ?Ԥ`ofj  $F5LUZ~%J^^Jhhh@^M06AL$P*ͮh4"Jin7ET)q#^ '5L@} HE4&%nϷQ#ѩo<Ϯa-'c菶}*3C1_Ms9#}!yw[|vy,Dkwl4zu+O+^tnGg0G`4.&@ǰ/&Y u(YZu1s|7l1`(J*׃#W'U[;Gj 1'}~䨎o45" = gsԺA!h0bc2ZiVL 7?IDV X~hγuUzR a Ŏ'sc" <81 z0 -a>RKH+((C4~˚'.MIAdE, gQzv{/ <%"45BԻ4,23#y_ Tc9Xo±QAH#gb$@@[Tw9I۷4 kHgOP)( Ǭ#I^B8}c8sgifhW(YS z Ec wZltW >K-R3FsΊ[nvm =ޥ/ d+%k=?t[)߇Y |Ņ uxHd>JuiJɣځ8b?Ȃ.Ds+/V6<5nFgrL{YjE裧j c" -*sāDdUGqk*N!T[܃b y@!-r;pc`sq&!nu 3saK oM']4`T/0 }& %BmiáBA? kwn찣m.@3}K@DDwƛ T_TZfIiw=ٝehX:.X!'[!`6= ݶ}kE.uD dB[NxFueК ARYڜ;Tj:"߫!:zP|&(f 8Kie9k甯$b$wyLEЅhڎ)R 5 B *pѧ&I1saugY\NV&7YWO_/"p$^tv|`@VHT:{|28{ا^eʥ<;';_)̩O7+."`wefYuc5!r|; C7CHv9}kk0ƒŘ1zR4٧f! j>o+,lj)I3eK J=޺÷9nͪaHyOp,i8"hN7o*2 {`W49yz Kbq ,v;Vbl#UYcn,6:%G9э~]SyUPYԙ/OG#H9סB0 .Xyҥopw[I-˭PW64sY29b m㣖u;~Wz-g,28dvT:gPq~ }%.lc9VO]|Ko-٨0NgLKoE%:!6(Hnq$LBɝpMakMt4(S( $r!E3Հ2oR*@,R##h`UyptcȄHd0!IڪIc58dTt;N t{ʌYec֒+q57KNKܮItzI(R7@4Gcn)^?9XMv{5/*NS$f.пf{D9AXKءwNPW;DԹph_"8r2ѭFa]zn%Ty:}D}I{`$|}/bIgzv7_Q6H&!.\nNjyԙϟ9GgV3̟أU!$@ _;79Xe8Ě۷ė90,GLnJ3)l=hp'u}U{?қr֡mOkָi""^ oFB9 !DP $1[hl햛ͽ  F#^Ӂs#GNrteLƿv˓de C,BGyKJkϞw9 ([Ӣ'|F;N$Qa2=H>%|a$==l|݀;r'޻ Q_X:J_1hC?/izwbR]8U&~|_^_MGDc"r ys7B)Vh Y\|ϻXP"^`]aBv.S(lh)4@پ@ZeC4磻G5ٍa Ǽ̞EW_{`Hve;9t&|6LuS/l2s\ExvBTLjCm iF6ye3ך_R&t)Onv :stK#\S+:OW +ͳ 7EnvD/Һpi&4wvz(vaL"͍i5Sc vv>'&sĖ^|!YꂝZ9'J88+&5/'۵;7_z!^3#)WqXFQإ_VC½dOrv;*}+vռ6wdF$qJxҦJL\gᗽs_.ǧqK;g9kV !] 7Nd?}زT@g.~E"0:1U-C%e ]ٙDϘDI }{A&RK=inBBd6Ȼ؁'E3/\#4790ѲҜ~s=Es bI3  ?N+8⬋F F" T $ *P`r$xIA'/K,ͳ*!)*ܓTR<c.O?w)S=[398FPLlosw Rxz`>2GBnG~O{sj' 1 yON غGTvW$V޻}IZ" t a\Mvxb j:t8eO:?ޥQ!bkDLb^-C7aF1{kV'.SN\vY/mptĭ=ރ˚Qnxխ~w 㒦hmSw ]m5e_CC]{|$TNrd|kym=x2UL*97a> vAw6OTr? 6z}bU5_~ ~ ӣjj|ҖM鐅\z~B%2GiAy .vłlw{ۦyM& N=d2}/k6O/5(oi[~ iZv#do~OYA'Pۑz>`mW*Ƚ)Sj$$'w2'1^2G1vvüa9}/HSE{?s;^*5l]λ^7ΏUvUݹ{zUz,M nL| gL.b>!adEn4_9;wzX('Q?;vlLOa/ŜJe({Q"+_hFoW­s駁]$F:oДJg\/ CVӴ<7~9ŞJDՄ.^IC=O^c;9_$/=_?F5؆{VTA[{۹Cjb|(*ҰZ'j^^2\GG-`I^Ӗ3Ϳ|խ3=uu[ g2{ȣA 3V;G.?tà8)7u ^䳥 :ϴşQ5jؽQg8zw:IoEJ/$W&Yiqqqw_W~S#KRm@ޑjh{D:W/GwT`6c O2 뒹˫ǽQqT)(0ԺޑwWrOc];"L5bP13M@&HKB7.<0Ͷ<oӨu JeyߍGKԘJsE[&vnǴZL+}l}-GsPNWT++Zc@El?>^Rr*3ݣZo18PK:k*kPK#\word/fontTable.xmlUn0 +ܷҦ Qдiii])8 -Hhy~{nGbTozR(Wvb*r25Âg[6,IY*!V3ë[$ r!s@7:zweBeDYmġ:RU,[vZ0Ldx#MJp%TB!d}*esj?ȤEzwǵ`mR>+wKp 7Gi6sQ&gR⥎h|$5G %Tr_Ct]$ƻϻE'WyxR\iX_cX/pq|uXsɶ9]n=EJX@aQjm]" b jrý5MpjoPK.pPK#\word/settings.xmleQn0 +PmhۄJ]eD"q23vsvo%WdjNUKΧU%צCa2faQ"&մ.ڏM01vw1@HK;>>\.9zbR`ˆJ m#H(SfuJ`PkfJTCSf$Ж8哒w94-bv[ŏ%%S U^ #AK}#o~C]lGl`7?Jf\'72&kRsu<8s>愮9- 1b|+t:Ծ.pGG9w_ xw>4b7ޛ xw 6P 0GA| >(sBʣ&CRC+n UszR`ۆDs-]-thY@0s*F ]3:bnM:2#Ae!T BxAF>pEѪEiX:Wl5I:6ST3xa˯U :@)n~0Lyf,oY:ϙm][h䍌V I⹭gbYҬoGwkMi@(R|jJQRD4a -o`.- 6kJ ,e N0h+ PK#\[Content_Types].xmln0E Ķ']TUɢeE[=w"I7H=j &[TmyitiKr/l#>71/6OM8őbO^N0Acϳ'(yScַXpqД@F$0sEѨ[/Ϳ+X':Wթ:*K=-w^7j $OСGCaz 4qGhr/` PK,ft1PK#\rD _rels/.relsPK#\Ud!docProps/core.xmlPK#\ :/docProps/app.xmlPK#\<docProps/custom.xmlPK#\m!word/_rels/document.xml.relsPK#\JPgI SLZword/document.xmlPK#\ qv iword/styles.xmlPK#\؁b)]word/numbering.xmlPK#\:k*kH word/media/image1.pngPK#\.pword/fontTable.xmlPK#\f@m#Pword/settings.xmlPK#\>h+ word/theme/theme1.xmlPK#\,ft1[Content_Types].xmlPK Cdoxx-0.1.4/tests/integration_test.rs000064400000000000000000000125701046102023000157070ustar 00000000000000use std::path::Path; use std::process::Command; #[test] fn test_minimal_document_parsing() { let output = Command::new(env!("CARGO_BIN_EXE_doxx")) .args(["tests/fixtures/minimal.docx"]) .output() .expect("Failed to execute doxx"); assert!( output.status.success(), "doxx should successfully parse minimal.docx" ); let stdout = String::from_utf8_lossy(&output.stdout); assert!( stdout.contains("Minimal Test"), "Should contain document title" ); } #[test] fn test_tables_csv_export() { let output = Command::new(env!("CARGO_BIN_EXE_doxx")) .args(["tests/fixtures/comprehensive.docx", "--export", "csv"]) .output() .expect("Failed to execute doxx"); assert!( output.status.success(), "doxx should successfully export tables to CSV" ); let stdout = String::from_utf8_lossy(&output.stdout); assert!( stdout.contains("Product") && stdout.contains("Quantity"), "Should contain CSV headers" ); } #[test] fn test_headings_outline() { let output = Command::new(env!("CARGO_BIN_EXE_doxx")) .args(["tests/fixtures/comprehensive.docx", "--outline"]) .output() .expect("Failed to execute doxx"); assert!( output.status.success(), "doxx should successfully generate outline" ); let stdout = String::from_utf8_lossy(&output.stdout); assert!( stdout.contains("Text Formatting"), "Should contain heading from document" ); } #[test] fn test_formatting_markdown_export() { let output = Command::new(env!("CARGO_BIN_EXE_doxx")) .args(["tests/fixtures/comprehensive.docx", "--export", "markdown"]) .output() .expect("Failed to execute doxx"); assert!( output.status.success(), "doxx should successfully export to markdown" ); let stdout = String::from_utf8_lossy(&output.stdout); assert!( stdout.contains("**") && stdout.contains("*"), "Should contain markdown formatting (bold and italic)" ); } #[test] fn test_unicode_document() { let output = Command::new(env!("CARGO_BIN_EXE_doxx")) .args(["tests/fixtures/comprehensive.docx", "--export", "text"]) .output() .expect("Failed to execute doxx"); assert!( output.status.success(), "doxx should successfully parse document with unicode" ); let stdout = String::from_utf8_lossy(&output.stdout); assert!( stdout.contains("你好世界"), "Should contain CJK unicode content" ); } #[test] fn test_document_parsing() { let output = Command::new(env!("CARGO_BIN_EXE_doxx")) .args(["tests/fixtures/comprehensive.docx"]) .output() .expect("Failed to execute doxx"); assert!( output.status.success(), "doxx should successfully parse comprehensive document" ); let stdout = String::from_utf8_lossy(&output.stdout); assert!( stdout.contains("Text Formatting"), "Should contain document content" ); } #[test] fn test_export_json() { let output = Command::new(env!("CARGO_BIN_EXE_doxx")) .args(["tests/fixtures/comprehensive.docx", "--export", "json"]) .output() .expect("Failed to execute doxx"); assert!( output.status.success(), "doxx should successfully export to JSON" ); let stdout = String::from_utf8_lossy(&output.stdout); assert!(stdout.contains("{"), "Should contain JSON output"); } #[test] fn test_search_functionality() { let output = Command::new(env!("CARGO_BIN_EXE_doxx")) .args(["tests/fixtures/comprehensive.docx", "--search", "revenue"]) .output() .expect("Failed to execute doxx"); assert!( output.status.success(), "doxx should successfully search document" ); let stdout = String::from_utf8_lossy(&output.stdout); assert!( stdout.contains("Search Results"), "Should contain search results" ); } #[test] fn test_empty_search_functionality() { let output = Command::new(env!("CARGO_BIN_EXE_doxx")) .args(["tests/fixtures/comprehensive.docx", "--search", ""]) .output() .expect("Failed to execute doxx"); assert!( output.status.success(), "doxx should handle empty search gracefully" ); let stdout = String::from_utf8_lossy(&output.stdout); assert!( stdout.contains("No results found"), "Should show no results for empty search" ); } #[test] fn test_help_command() { let output = Command::new(env!("CARGO_BIN_EXE_doxx")) .args(["--help"]) .output() .expect("Failed to execute doxx"); assert!(output.status.success(), "doxx should show help"); let stdout = String::from_utf8_lossy(&output.stdout); assert!(stdout.contains("doxx"), "Should contain program name"); assert!( stdout.contains("Beautiful .docx viewing"), "Should contain description" ); } #[test] fn test_all_fixtures_exist() { let fixtures = [ "tests/fixtures/minimal.docx", "tests/fixtures/comprehensive.docx", "tests/fixtures/colors.docx", "tests/fixtures/equations.docx", "tests/fixtures/images.docx", ]; for fixture in &fixtures { assert!( Path::new(fixture).exists(), "Test fixture {fixture} should exist" ); } } doxx-0.1.4/tests/mixed_formatting_test.rs000064400000000000000000000063471046102023000167310ustar 00000000000000use std::process::Command; #[test] fn test_color_document_parsing() { let output = Command::new("cargo") .args(["run", "--bin", "doxx", "tests/fixtures/colors.docx"]) .output() .expect("Failed to execute doxx"); assert!( output.status.success(), "doxx should successfully parse colors document: {}", String::from_utf8_lossy(&output.stderr) ); let stdout = String::from_utf8_lossy(&output.stdout); assert!(!stdout.is_empty(), "Output should not be empty"); } #[test] fn test_mixed_formatting_export_text() { let output = Command::new("cargo") .args([ "run", "--bin", "doxx", "tests/fixtures/comprehensive.docx", "--export", "text", ]) .output() .expect("Failed to execute doxx"); assert!( output.status.success(), "doxx should successfully export comprehensive doc to text" ); let stdout = String::from_utf8_lossy(&output.stdout); assert!( stdout.len() > 10, "Exported text should have reasonable length" ); } #[test] fn test_mixed_formatting_export_markdown() { let output = Command::new("cargo") .args([ "run", "--bin", "doxx", "tests/fixtures/comprehensive.docx", "--export", "markdown", ]) .output() .expect("Failed to execute doxx"); assert!( output.status.success(), "doxx should successfully export comprehensive doc to markdown" ); let stdout = String::from_utf8_lossy(&output.stdout); assert!( stdout.contains("**") || stdout.contains("*") || stdout.contains("#"), "Markdown export should contain formatting indicators" ); } #[test] fn test_mixed_formatting_export_json() { let output = Command::new("cargo") .args([ "run", "--bin", "doxx", "tests/fixtures/comprehensive.docx", "--export", "json", ]) .output() .expect("Failed to execute doxx"); assert!( output.status.success(), "doxx should successfully export comprehensive doc to JSON" ); let stdout = String::from_utf8_lossy(&output.stdout); assert!( stdout.contains("{"), "JSON export should contain JSON structure" ); assert!( stdout.contains("\""), "JSON export should contain quoted strings" ); } #[test] fn test_mixed_formatting_document_structure() { let test_files = [ "tests/fixtures/colors.docx", "tests/fixtures/comprehensive.docx", ]; for file_path in &test_files { let output = Command::new("cargo") .args(["run", "--bin", "doxx", file_path]) .output() .expect("Failed to execute doxx"); assert!( output.status.success(), "doxx should successfully parse {}: {}", file_path, String::from_utf8_lossy(&output.stderr) ); let stdout = String::from_utf8_lossy(&output.stdout); assert!( !stdout.is_empty(), "Output should not be empty for {file_path}" ); } } doxx-0.1.4/tests/roundtrip_test.rs000064400000000000000000000077741046102023000154240ustar 00000000000000/// Round-trip test: comprehensive.md → pandoc → comprehensive.docx → doxx markdown export /// /// comprehensive.md is the canonical source document. This test verifies that doxx's /// markdown exporter preserves the content and formatting from the pandoc-generated docx. /// It serves as a regression guard: changes to the markdown exporter that drop content /// or break formatting will fail here. /// /// Notes on known non-round-trippable aspects (not tested here): /// - Heading auto-numbers: doxx adds section numbers (1, 1.1) when it detects hierarchy /// - List detection: pandoc list items are parsed as paragraphs by doxx /// - Underline: not emitted by the markdown exporter use std::process::Command; fn export_comprehensive_markdown() -> String { let output = Command::new(env!("CARGO_BIN_EXE_doxx")) .args(["tests/fixtures/comprehensive.docx", "--export", "markdown"]) .output() .expect("Failed to run doxx"); assert!( output.status.success(), "doxx exited with error: {}", String::from_utf8_lossy(&output.stderr) ); String::from_utf8_lossy(&output.stdout).into_owned() } #[test] fn test_headings_preserved() { let md = export_comprehensive_markdown(); // Heading text is preserved (auto-numbers are prepended but text still present) assert!(md.contains("Text Formatting"), "H1 heading text missing"); assert!(md.contains("Heading Level Two"), "H2 heading text missing"); assert!( md.contains("Heading Level Three"), "H3 heading text missing" ); assert!(md.contains("Heading Level Four"), "H4 heading text missing"); assert!(md.contains("Heading Level Five"), "H5 heading text missing"); assert!(md.contains("Heading Level Six"), "H6 heading text missing"); } #[test] fn test_inline_formatting_preserved() { let md = export_comprehensive_markdown(); assert!(md.contains("**bold text**"), "Bold formatting missing"); assert!(md.contains("*italic text*"), "Italic formatting missing"); assert!( md.contains("~~strikethrough~~"), "Strikethrough formatting missing" ); // Combined formatting on the same paragraph assert!( md.contains("**bold**") && md.contains("*italic*") && md.contains("~~strikethrough~~"), "Combined formatting missing" ); } #[test] fn test_table_preserved() { let md = export_comprehensive_markdown(); assert!( md.contains("| Product | Quantity | Price |"), "Table header missing" ); assert!(md.contains("| Widget A |"), "Table row missing"); assert!(md.contains("| Widget B |"), "Table row missing"); assert!(md.contains("| Widget C |"), "Table row missing"); // Alignment row must be present assert!(md.contains(":---"), "Table alignment row missing"); } #[test] fn test_unicode_preserved() { let md = export_comprehensive_markdown(); assert!(md.contains("你好世界"), "CJK characters missing"); assert!(md.contains("مرحبا"), "Arabic characters missing"); assert!(md.contains("こんにちは"), "Japanese characters missing"); assert!(md.contains("🎉"), "Emoji missing"); assert!(md.contains("∑"), "Math symbol missing"); assert!(md.contains("€"), "Currency symbol missing"); } #[test] fn test_financial_content_preserved() { let md = export_comprehensive_markdown(); // These terms must appear for the search tests to work against comprehensive.docx assert!(md.contains("revenue"), "Search term 'revenue' missing"); assert!(md.contains("Q4"), "Search term 'Q4' missing"); assert!(md.contains("Executive"), "Search term 'Executive' missing"); assert!(md.contains("$1,200,000"), "Financial figure missing"); } #[test] fn test_plain_paragraphs_preserved() { let md = export_comprehensive_markdown(); assert!( md.contains("Normal paragraph with no special formatting."), "Plain paragraph missing" ); assert!( md.contains("Content under a level two heading."), "Paragraph under heading missing" ); } doxx-0.1.4/tests/search_functionality_test.rs000064400000000000000000000106451046102023000176020ustar 00000000000000use doxx::document::{load_document, search_document, ImageOptions}; use std::path::Path; async fn load_test_document() -> doxx::document::Document { let path = Path::new("tests/fixtures/comprehensive.docx").to_path_buf(); tokio::task::spawn_blocking(move || load_document(&path, ImageOptions::default())) .await .expect("Failed to spawn blocking task") .expect("Failed to load test document") } #[cfg(test)] mod search_tests { use super::*; #[tokio::test] async fn test_empty_search_returns_no_results() { let document = load_test_document().await; // Test empty string let results = search_document(&document, ""); assert!(results.is_empty(), "Empty search should return no results"); // Test whitespace-only string let results = search_document(&document, " "); assert!( results.is_empty(), "Whitespace-only search should return no results" ); } #[tokio::test] async fn test_normal_search_returns_results() { let document = load_test_document().await; let results = search_document(&document, "revenue"); assert!( !results.is_empty(), "Search for 'revenue' should return results" ); assert!( results.len() >= 3, "Should find multiple matches for 'revenue' in business report" ); } #[tokio::test] async fn test_case_insensitive_search() { let document = load_test_document().await; let results_lower = search_document(&document, "revenue"); let results_upper = search_document(&document, "REVENUE"); let results_mixed = search_document(&document, "Revenue"); assert_eq!( results_lower.len(), results_upper.len(), "Search should be case insensitive" ); assert_eq!( results_lower.len(), results_mixed.len(), "Search should be case insensitive" ); assert!(!results_lower.is_empty(), "Should find revenue mentions"); } #[tokio::test] async fn test_search_multiple_elements() { let document = load_test_document().await; // Search for content that appears in multiple elements let results = search_document(&document, "Q4"); assert!( !results.is_empty(), "Should find 'Q4' in the business report" ); } } // Note: UI-specific tests for toggle_search_state are tested via integration tests // since the App struct and UI module are not exported from the library. #[cfg(test)] mod edge_case_tests { use super::*; #[tokio::test] async fn test_search_with_special_characters() { let document = load_test_document().await; // Test search with various special characters let results = search_document(&document, "."); assert!(!results.is_empty(), "Should find periods in the text"); let results = search_document(&document, "$"); assert!( !results.is_empty(), "Should find dollar signs in financial data" ); } #[tokio::test] async fn test_search_preserves_element_index() { let document = load_test_document().await; let results = search_document(&document, "Executive"); assert!(!results.is_empty(), "Should find 'Executive' heading"); assert!( results[0].element_index < document.elements.len(), "Element index should be valid" ); } #[tokio::test] async fn test_search_result_positions() { let document = load_test_document().await; let results = search_document(&document, "revenue"); assert!(!results.is_empty(), "Should find revenue in document"); let result = &results[0]; assert!( result.start_pos < result.end_pos, "Start position should be before end position" ); assert_eq!( result.end_pos - result.start_pos, 7, "Should match the length of 'revenue'" ); } #[tokio::test] async fn test_search_in_table_content() { let document = load_test_document().await; // comprehensive.docx has a product table let results = search_document(&document, "Widget"); assert!( !results.is_empty(), "Should find search terms in table content" ); } } doxx-0.1.4/tests/strikethrough_test.rs000064400000000000000000000136631046102023000162720ustar 00000000000000use doxx::document::{FormattedRun, TextFormatting}; #[cfg(test)] mod strikethrough_tests { use super::*; #[test] fn test_strikethrough_formatting_structure() { // Test that strikethrough field is properly included in TextFormatting let formatting = TextFormatting { bold: false, italic: false, underline: false, strikethrough: true, font_size: None, color: None, }; assert!(formatting.strikethrough); assert!(!formatting.bold); assert!(!formatting.italic); assert!(!formatting.underline); } #[test] fn test_strikethrough_formatting_default() { // Test that default formatting has strikethrough set to false let formatting = TextFormatting::default(); assert!(!formatting.strikethrough); } #[test] fn test_formatted_run_with_strikethrough() { // Test that FormattedRun properly handles strikethrough formatting let formatting = TextFormatting { bold: false, italic: false, underline: false, strikethrough: true, font_size: None, color: None, }; let run = FormattedRun { text: "This text is struck through".to_string(), formatting, }; assert!(run.formatting.strikethrough); assert_eq!(run.text, "This text is struck through"); } #[test] fn test_mixed_formatting_with_strikethrough() { // Test strikethrough combined with other formatting let formatting = TextFormatting { bold: true, italic: true, underline: false, strikethrough: true, font_size: Some(12.0), color: Some("#FF0000".to_string()), }; assert!(formatting.bold); assert!(formatting.italic); assert!(!formatting.underline); assert!(formatting.strikethrough); assert_eq!(formatting.font_size, Some(12.0)); assert_eq!(formatting.color, Some("#FF0000".to_string())); } #[test] fn test_formatting_serialization() { // Test that strikethrough formatting can be serialized to JSON let formatting = TextFormatting { bold: true, italic: false, underline: true, strikethrough: true, font_size: Some(14.0), color: Some("#0000FF".to_string()), }; let json = serde_json::to_string(&formatting).expect("Failed to serialize"); let deserialized: TextFormatting = serde_json::from_str(&json).expect("Failed to deserialize"); assert!(deserialized.bold); assert!(!deserialized.italic); assert!(deserialized.underline); assert!(deserialized.strikethrough); assert_eq!(deserialized.font_size, Some(14.0)); assert_eq!(deserialized.color, Some("#0000FF".to_string())); } #[test] fn test_run_consolidation_with_strikethrough() { // Test that runs with identical strikethrough formatting are properly consolidated let formatting1 = TextFormatting { bold: false, italic: false, underline: false, strikethrough: true, font_size: None, color: None, }; let formatting2 = formatting1.clone(); let runs = vec![ FormattedRun { text: "First part ".to_string(), formatting: formatting1, }, FormattedRun { text: "second part".to_string(), formatting: formatting2, }, ]; let consolidated = FormattedRun::consolidate_runs(runs); assert_eq!(consolidated.len(), 1); assert_eq!(consolidated[0].text, "First part second part"); assert!(consolidated[0].formatting.strikethrough); } #[test] fn test_run_consolidation_different_strikethrough() { // Test that runs with different strikethrough settings are not consolidated let formatting1 = TextFormatting { bold: false, italic: false, underline: false, strikethrough: true, font_size: None, color: None, }; let formatting2 = TextFormatting { bold: false, italic: false, underline: false, strikethrough: false, // Different strikethrough setting font_size: None, color: None, }; let runs = vec![ FormattedRun { text: "Struck text ".to_string(), formatting: formatting1, }, FormattedRun { text: "normal text".to_string(), formatting: formatting2, }, ]; let consolidated = FormattedRun::consolidate_runs(runs); assert_eq!(consolidated.len(), 2); assert_eq!(consolidated[0].text, "Struck text "); assert!(consolidated[0].formatting.strikethrough); assert_eq!(consolidated[1].text, "normal text"); assert!(!consolidated[1].formatting.strikethrough); } } // Integration tests that would require actual DOCX files #[cfg(test)] mod integration_tests { use std::process::Command; #[test] fn test_strikethrough_help_available() { // This test ensures the application can start and shows help without panicking // when strikethrough formatting is included in the codebase let output = Command::new("cargo") .args(["run", "--bin", "doxx", "--", "--help"]) .output() .expect("Failed to execute doxx"); assert!( output.status.success(), "doxx should show help successfully with strikethrough support" ); let stdout = String::from_utf8_lossy(&output.stdout); assert!(stdout.contains("doxx"), "Should contain program name"); } } doxx-0.1.4/tests/test_image_extraction.rs000064400000000000000000000032721046102023000167050ustar 00000000000000use doxx::image_extractor::ImageExtractor; use std::path::Path; #[test] fn test_image_extraction_from_images_docx() { let docx_path = Path::new("tests/fixtures/images.docx"); assert!(docx_path.exists(), "images.docx test file should exist"); let mut extractor = ImageExtractor::new().expect("Should create image extractor"); // Extract images from the DOCX let result = extractor.extract_images_from_docx(docx_path); assert!( result.is_ok(), "Image extraction should succeed: {result:?}" ); // Check if any images were extracted let images = extractor.list_images(); println!("Extracted {} images:", images.len()); for (rel_id, path) in &images { println!(" {}: {}", rel_id, path.display()); assert!(path.exists(), "Extracted image file should exist"); } // If there are images, test that we can read the data if !images.is_empty() { let (first_rel_id, _) = &images[0]; let image_data = extractor.get_image_data(first_rel_id); assert!(image_data.is_ok(), "Should be able to read image data"); assert!( !image_data.unwrap().is_empty(), "Image data should not be empty" ); } } #[test] fn test_terminal_image_capabilities() { use doxx::terminal_image::{TerminalImageRenderer, TerminalImageSupport}; // Test that we can create renderers with specific support let kitty_renderer = TerminalImageRenderer::with_support(TerminalImageSupport::Kitty); assert!(kitty_renderer.can_display_images()); let no_support_renderer = TerminalImageRenderer::with_support(TerminalImageSupport::None); assert!(!no_support_renderer.can_display_images()); } doxx-0.1.4/tests/unicode_safety.rs000064400000000000000000000133201046102023000153200ustar 00000000000000/// Unicode safety tests for doxx /// /// These tests reproduce the critical Issue #22: Unicode safety bug that causes /// runtime panics when searching documents with emojis and special characters. /// /// The root cause is unsafe string slicing at src/ui.rs:793 where &result.text[..77] /// can slice through Unicode character boundaries. /// Helper function to demonstrate safe string truncation /// This is what should replace the unsafe slicing in ui.rs pub fn safe_truncate_string(s: &str, max_graphemes: usize) -> String { use unicode_segmentation::UnicodeSegmentation; s.graphemes(true).take(max_graphemes).collect() } /// Helper function for byte-safe truncation /// Ensures we don't slice through character boundaries pub fn safe_truncate_bytes(s: &str, max_bytes: usize) -> &str { if s.len() <= max_bytes { return s; } // Find the largest valid UTF-8 boundary <= max_bytes let mut boundary = max_bytes; while boundary > 0 && !s.is_char_boundary(boundary) { boundary -= 1; } &s[..boundary] } #[cfg(test)] mod unicode_safety_tests { use unicode_segmentation::UnicodeSegmentation; /// Test case that would have caused the exact panic from Issue #22 (now fixed) #[test] fn test_unicode_string_slicing_now_safe() { // This string has emojis that are multi-byte UTF-8 characters // Before our fix, slicing at byte position 77 would panic if it fell in a character boundary let text_with_emojis = "🚀🎉💻🔥🌟⭐️✨💫🌈🦄🎯🎪🎨🎭🎪🎨🎭🎪🎨🎭🎪🎨🎭🎪🎨🎭🎪🎨🎭🎪🎨🎭🎪🎨🎭🎪🎨🎭"; // This would have been the EXACT problematic code from src/ui.rs:793 (now fixed) // Instead of panicking, we now use safe truncation // Demonstrate the safe truncation logic we implemented let max_bytes = 77; let safe_boundary = if text_with_emojis.len() <= max_bytes { text_with_emojis.len() } else { let mut boundary = max_bytes; while boundary > 0 && !text_with_emojis.is_char_boundary(boundary) { boundary -= 1; } boundary }; // This is now safe and won't panic let _safe_truncated = &text_with_emojis[..safe_boundary]; println!("Safe truncation at boundary {safe_boundary}: working correctly"); } /// Test demonstrating safe Unicode-aware truncation #[test] fn test_safe_unicode_truncation() { let text_with_emojis = "🚀🎉💻🔥🌟⭐️✨💫🌈🦄🎯🎪🎨🎭🎪🎨🎭🎪🎨🎭🎪🎨🎭🎪🎨🎭🎪🎨🎭🎪🎨🎭🎪🎨🎭🎪🎨🎭"; // Safe truncation using unicode-segmentation let max_chars = 10; let safe_truncated: String = text_with_emojis.graphemes(true).take(max_chars).collect(); // This should work without panicking assert_eq!(safe_truncated.graphemes(true).count(), max_chars); println!("Safe truncation: {safe_truncated}"); } /// Test different types of Unicode characters that could cause issues #[test] fn test_various_unicode_characters() { let test_cases = vec![ ("Simple ASCII", "Hello World"), ("Accented chars", "café naïve résumé jalapeño"), ("CJK text", "你好世界 こんにちは 안녕하세요"), ("Emojis", "🚀 🎉 💻 🔥"), ("Complex emojis", "👨‍💻 👩‍🔬 🏴‍☠️ 🏳️‍🌈"), ("Math symbols", "∑ ∫ ∞ ≠ ≤ ≥ √ ∂"), ( "Special quotes", "\"curly quotes\" 'single quotes' —em dash— …ellipsis", ), ]; for (name, text) in test_cases { println!("Testing {name}: {text}"); // Test that these strings don't panic when handled safely let char_count = text.chars().count(); let byte_count = text.len(); let grapheme_count = text.graphemes(true).count(); println!(" Chars: {char_count}, Bytes: {byte_count}, Graphemes: {grapheme_count}"); // Demonstrate unsafe slicing could panic if byte_count > 10 { // This is potentially unsafe if we slice at a fixed byte position // let _unsafe = &text[..10]; // Could panic! // Safe alternative using char boundaries let safe_slice: String = text.chars().take(10).collect(); println!(" Safe slice (10 chars): {safe_slice}"); } } } /// Test that reproduces the search functionality issue #[test] fn test_search_result_truncation_issue() { // Mock search result with Unicode content struct SearchResult { text: String, } let result = SearchResult { text: "Found emoji result: 🚀🎉💻🔥🌟⭐️✨💫🌈🦄🎯🎪🎨🎭🎪🎨🎭🎪🎨🎭🎪🎨🎭🎪🎨🎭🎪🎨🎭🎪🎨🎭🎪🎨🎭🎪🎨🎭".to_string(), }; // The problematic code from ui.rs:793 // result_text: &result.text[..77], println!("Text length in bytes: {}", result.text.len()); println!("Text length in chars: {}", result.text.chars().count()); // This will likely panic if the 77th byte is in the middle of an emoji if result.text.len() > 77 { // UNSAFE: This is the bug from Issue #22 // let _problematic = &result.text[..77]; // Will panic! // SAFE alternative: let safe_truncated: String = result.text.chars().take(40).collect(); println!("Safe truncation: {safe_truncated}"); } } }