commit 755d34b16a2ec496f0306ade8cbd2789f71b22d4 Author: xiaoxue Date: Sun May 24 23:41:32 2026 +0800 同步完整源码 - 2026-05-24 diff --git a/.github/workflows/build-badge.yml b/.github/workflows/build-badge.yml new file mode 100644 index 0000000..0cfefb0 --- /dev/null +++ b/.github/workflows/build-badge.yml @@ -0,0 +1,30 @@ +name: build +on: + schedule: + - cron: '5 0 * * *' + push: + branches: + - main + +jobs: + build: + runs-on: ubuntu-latest + strategy: + matrix: + python-version: ["3.13", "3.12", "3.11", "3.10", "3.9"] + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v5 + with: + python-version: ${{ matrix.python-version }} + - name : Build and run tests + run: | + mkdir $HOME/test_external_dir + cd $HOME/test_external_dir + cp $GITHUB_WORKSPACE/tests . -r + python -m venv venv + source venv/bin/activate + pip install $GITHUB_WORKSPACE pytest pytest-xdist + python -m pytest -n=auto diff --git a/.github/workflows/python-publish.yml b/.github/workflows/python-publish.yml new file mode 100644 index 0000000..2685575 --- /dev/null +++ b/.github/workflows/python-publish.yml @@ -0,0 +1,52 @@ +name: PyPI + +on: + release: + types: [published] + +jobs: + deploy: + runs-on: ubuntu-latest + environment: + name: deploy + url: https://pypi.org/p/hotpdf + steps: + - uses: actions/checkout@v4 + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: '3.11' + - name: Install dependencies + run: | + python -m pip install --upgrade pip + python3 -m pip install --upgrade setuptools wheel twine build + - name: Build and publish + env: + TWINE_USERNAME: ${{secrets.TWINE_USERNAME}} + TWINE_PASSWORD: ${{secrets.TWINE_PASSWORD}} + run: | + python -m build + twine upload dist/* + badge: + needs: deploy + runs-on: ubuntu-latest + strategy: + matrix: + python-version: ["3.13", "3.12", "3.11", "3.10", "3.9"] + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v5 + with: + python-version: ${{ matrix.python-version }} + - name : Install from PyPI and run tests + run: | + sleep 2m + mkdir $HOME/test_external_dir + cd $HOME/test_external_dir + cp $GITHUB_WORKSPACE/tests/ . -r + python -m venv venv + source venv/bin/activate + pip install hotpdf pytest pytest-xdist + python -m pytest tests -n=auto diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000..23482df --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,72 @@ +name: Unit tests + +on: + push: + branches: + - main + pull_request: + workflow_dispatch: + +jobs: + linter: + name: Linters + runs-on: ubuntu-latest + env: + Python3_ROOT_DIR: + timeout-minutes: 2 + + steps: + - name: Checkout Code + uses: actions/checkout@v4 + - name: Setup Python 3.11 + uses: actions/setup-python@v5 + with: + python-version: 3.11 + - name: Cache python packages + uses: actions/cache@v4 + id: cache + with: + path: ${{ env.Python3_ROOT_DIR }}/lib/python3.11/site-packages + key: dev-${{ hashFiles('**/pyproject.toml') }}-3.11 + - name: Install dependencies + if: steps.cache.outputs.cache-hit != 'true' + run: pip install -e '.[dev]' + - name: Lint with ruff + run: | + pip install --upgrade --force-reinstall ruff + python3 -m ruff check + - name: Run mypy + run: python -m mypy + + tests: + needs: linter + strategy: + matrix: + python-version: ["3.9", "3.10", "3.11", "3.12", "3.13"] + env: + Python3_ROOT_DIR: + name: Tests + runs-on: ubuntu-latest + timeout-minutes: 10 + steps: + - name: Checkout Code + uses: actions/checkout@v4 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v5 + with: + python-version: ${{ matrix.python-version }} + - name: Cache python packages + uses: actions/cache@v4 + id: cache + with: + path: ${{ env.Python3_ROOT_DIR }}/lib/python${{ matrix.python-version }}/site-packages + key: dev-${{ hashFiles('**/pyproject.toml') }}-${{ matrix.python-version }} + - name: Install dependencies + if: steps.cache.outputs.cache-hit != 'true' + run: pip install -e '.[dev]' + - name: Run tests + run: + python -m pytest --cov-fail-under=96 -n=auto --cov=hotpdf --cov-report term-missing + - name: Upload coverage to coveralls + if: github.event_name == 'push' + uses: coverallsapp/github-action@v2.2.3 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c8e9b7d --- /dev/null +++ b/.gitignore @@ -0,0 +1,171 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/#use-with-ide +.pdm.toml + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# ruff +.ruff_cache + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +#.idea/ +.vscode/ + +# MACOS +.DS_Store + +# Project specific +main.py +memray-* diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..33c5e9a --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,24 @@ +repos: + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.5.0 + hooks: + - id: check-yaml + - id: end-of-file-fixer + - id: trailing-whitespace + - repo: local + hooks: + - id: ruff-lint + name: ruff lint + entry: ruff check + language: system + pass_filenames: false + - id: ruff-format + name: ruff format + entry: ruff format + language: system + pass_filenames: false + - id: mypy + name: mypy + entry: mypy + language: system + pass_filenames: false diff --git a/.readthedocs.yaml b/.readthedocs.yaml new file mode 100644 index 0000000..b0ed90e --- /dev/null +++ b/.readthedocs.yaml @@ -0,0 +1,16 @@ +version: 2 + +build: + os: "ubuntu-22.04" + tools: + python: "3.11" + +sphinx: + configuration: docs/source/conf.py + +python: + install: + - method: pip + path: . + extra_requirements: + - docs diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..bc9ebf4 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 Prestatech GmbH + +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. diff --git a/README.md b/README.md new file mode 100644 index 0000000..da30219 --- /dev/null +++ b/README.md @@ -0,0 +1,147 @@ +# hotpdf + +[![Documentation Status](https://readthedocs.org/projects/hotpdf/badge/?version=latest)](https://hotpdf.readthedocs.io/en/latest/?badge=latest) +[![latest](https://github.com/weareprestatech/hotpdf/actions/workflows/python-publish.yml/badge.svg)](https://github.com/weareprestatech/hotpdf/actions/workflows/python-publish.yml) +[![build](https://github.com/weareprestatech/hotpdf/actions/workflows/build-badge.yml/badge.svg)](https://github.com/weareprestatech/hotpdf/actions/workflows/build-badge.yml) +[![Coverage Status](https://coveralls.io/repos/github/weareprestatech/hotpdf/badge.svg?branch=main)](https://coveralls.io/github/weareprestatech/hotpdf?branch=main) +[![Unit tests](https://github.com/weareprestatech/hotpdf/actions/workflows/test.yml/badge.svg?branch=main)](https://github.com/weareprestatech/hotpdf/actions/workflows/test.yml) + + +This project was started as an internal project @ [Prestatech](http://prestatech.com/) to parse PDF files in a fast and memory-efficient way to overcome the difficulties we were having while parsing big PDF files using libraries such as [pdfquery](https://github.com/jcushman/pdfquery) [[Comparison](https://imgur.com/a/5XuwEqq)]. + +hotpdf is a wrapper around [pdfminer.six](https://github.com/pdfminer/pdfminer.six) focusing on text extraction and text search operations on PDFs. + +hotpdf can be used to find and extract text from PDFs. +Please [read the docs](https://hotpdf.readthedocs.io/en/latest/) to understand how the library can help you! + +## Installation + +The latest version of hotpdf can be installed directly from [PyPI](https://pypi.org/project/hotpdf/) with pip. + +```bash +pip install hotpdf +``` + +## Local Setup + +First, install the dependencies required by hotpdf + +```bash +python3 -m pip install -e . +``` + +### Contributing + +You should install the [pre-commit](https://github.com/weareprestatech/hotpdf/blob/main/.pre-commit-config.yaml) hooks with `pre-commit install`. This will run the linter, mypy, and ruff formatting before each commit. + +Remember to run `pip install -e '.[dev]'` to install the extra dependencies for development. + +For more examples of how to run the full test suite please refer to the [CI workflow](https://github.com/weareprestatech/hotpdf/blob/main/.github/workflows/test.yml). + +We strive to keep the test coverage at 100% (but can't due to certain reasons - e.g., test file not available): if you want your contributions accepted please write tests for them :D + +Some examples of running tests locally: + +```bash +python3 -m pip install -e '.[dev]' # install extra deps for testing +python3 -m pytest -n=auto tests/ # run the test suite +# run tests with coverage +python3 -m pytest --cov-fail-under=96 -n=auto --cov=hotpdf --cov-report term-missing +``` + +### Documentation + +We use [sphinx](https://www.sphinx-doc.org/en/master/) for generating our docs and host them on [readthedocs](https://readthedocs.org/) + +Please update and add documentation if required, with your contributions. + +Update the `.rst` files, rebuild them, and commit them along with your PRs. + +```bash +cd docs +make clean +make html +``` + +This will generate the necessary documentation files. Once merged to `main` the docs will be updated automatically. + +## Usage + +**To view more detailed usage information, please [read the docs](https://hotpdf.readthedocs.io/en/latest/)** + +Basic usage is as follows: + +```python + +from hotpdf import HotPdf + +pdf_file_path = "test.pdf" + +# Load pdf file into memory +hotpdf_document = HotPdf(pdf_file_path) + +# Alternatively, you can also pass an opened PDF stream to be loaded +with open(pdf_file_path, "rb") as f: + hotpdf_document_2 = HotPdf(f) + +# You can also merge multiple HotPdf objects to get one single HotPdf object +merged_hotpdf_object = HotPdf.merge_multiple(hotpdfs=[hotpdf1, hotpdf2]) + +# Get the number of pages +print(len(hotpdf_document.pages)) + +# Find text +text_occurences = hotpdf_document.find_text("foo") + +# Find text and its full span +text_occurences_full_span = hotpdf_document.find_text("foo", take_span=True) + +# Extract text in the region +text_in_bbox = hotpdf_document.extract_text( + x0=0, + y0=0, + x1=100, + y1=10, + page=0, +) + +# Extract spans in the region +spans_in_bbox = hotpdf_document.extract_spans( + x0=0, + y0=0, + x1=100, + y1=10, + page=0, +) + +# Extract spans text in the region +spans_text_in_bbox = hotpdf_document.extract_spans_text( + x0=0, + y0=0, + x1=100, + y1=10, + page=0, +) + +# Extract full-page text +full_page_text = hotpdf_document.extract_page_text(page=0) +``` + +## Known Issues + +1. (cid:x) characters in text - In some pdfs when extracted, some symbols like `€` might not be properly decoded, and instead be extracted as `(cid:128)`. + +This is a problem with the `pdfminer.six` library. We have fixed it from our side on our [fork](https://github.com/weareprestatech/pdfminer.six), and you can install it using pip. Until we can merge it to pdfminer.six repo and it gets released, we recommend that you install our fork with the fixes manually. + + + +```bash +pip install --no-cache-dir git+https://github.com/weareprestatech/pdfminer.six.git@20240222#egg=pdfminer-six +``` + +## License + +This project is licensed under the terms of the MIT license. + +--- +with ❤️ from the team @ [Prestatech GmbH](https://prestatech.com/) diff --git a/demo.py b/demo.py new file mode 100644 index 0000000..1596fd4 --- /dev/null +++ b/demo.py @@ -0,0 +1,49 @@ +from hotpdf import HotPdf + +pdf_file_path = "test.pdf" + +# Load pdf file into memory +hotpdf_document = HotPdf(pdf_file_path) + +# Alternatively, you can also pass an opened pdf stream to be loaded +with open(pdf_file_path, "rb") as f: + hotpdf_document_2 = HotPdf(f) + +# Get number of pages +print(len(hotpdf_document.pages)) + +# Find text +text_occurences = hotpdf_document.find_text("foo") + +# Find text and its full span +text_occurences_full_span = hotpdf_document.find_text("foo", take_span=True) + +# Extract text in region +text_in_bbox = hotpdf_document.extract_text( + x0=0, + y0=0, + x1=100, + y1=10, + page=0, +) + +# Extract spans in region +spans_in_bbox = hotpdf_document.extract_spans( + x0=0, + y0=0, + x1=100, + y1=10, + page=0, +) + +# Extract spans text in region +spans_text_in_bbox = hotpdf_document.extract_spans_text( + x0=0, + y0=0, + x1=100, + y1=10, + page=0, +) + +# Extract full page text +full_page_text = hotpdf_document.extract_page_text(page=0) diff --git a/docs/.gitattributes b/docs/.gitattributes new file mode 100644 index 0000000..176a458 --- /dev/null +++ b/docs/.gitattributes @@ -0,0 +1 @@ +* text=auto diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 0000000..d0c3cbf --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,20 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line, and also +# from the environment for the first two. +SPHINXOPTS ?= +SPHINXBUILD ?= sphinx-build +SOURCEDIR = source +BUILDDIR = build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/docs/make.bat b/docs/make.bat new file mode 100644 index 0000000..dc1312a --- /dev/null +++ b/docs/make.bat @@ -0,0 +1,35 @@ +@ECHO OFF + +pushd %~dp0 + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set SOURCEDIR=source +set BUILDDIR=build + +%SPHINXBUILD% >NUL 2>NUL +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.https://www.sphinx-doc.org/ + exit /b 1 +) + +if "%1" == "" goto help + +%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% +goto end + +:help +%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% + +:end +popd diff --git a/docs/source/api.rst b/docs/source/api.rst new file mode 100644 index 0000000..5543b22 --- /dev/null +++ b/docs/source/api.rst @@ -0,0 +1,17 @@ +API +=== + +.. autosummary:: + :toctree: generated + + hotpdf.hotpdf.HotPdf + hotpdf.memory_map.MemoryMap + hotpdf.sparse_matrix.SparseMatrix + hotpdf.span_map.SpanMap + hotpdf.trie.TrieNode + hotpdf.trie.Trie + hotpdf.utils + hotpdf.processor + hotpdf.data.classes.HotCharacter + hotpdf.data.classes.Span + hotpdf.data.classes.ElementDimension diff --git a/docs/source/conf.py b/docs/source/conf.py new file mode 100644 index 0000000..e87b927 --- /dev/null +++ b/docs/source/conf.py @@ -0,0 +1,45 @@ +# Configuration file for the Sphinx documentation builder. +# +# For the full list of built-in configuration values, see the documentation: +# https://www.sphinx-doc.org/en/master/usage/configuration.html + +# -- Project information ----------------------------------------------------- +# https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information + +import os +import sys + +sys.path.insert(0, os.path.abspath("../..")) + +project = "hotpdf" +copyright = "2024, Prestatech GmbH" +author = "Prestatech GmbH" +release = "0.1" + +# -- General configuration --------------------------------------------------- +# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration + +extensions = [ + "sphinx.ext.duration", + "sphinx.ext.doctest", + "sphinx.ext.autodoc", + "sphinx.ext.autosummary", + "sphinx.ext.intersphinx", + "sphinx.ext.napoleon", + "sphinx.ext.autosectionlabel", +] + +intersphinx_mapping = { + "python": ("https://docs.python.org/3/", None), + "sphinx": ("https://www.sphinx-doc.org/en/master/", None), +} + +intersphinx_disabled_domains = ["std"] + +templates_path = ["_templates"] +exclude_patterns = [] + +# -- Options for HTML output ------------------------------------------------- +# https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output + +html_theme = "bizstyle" diff --git a/docs/source/generated/hotpdf.data.classes.ElementDimension.rst b/docs/source/generated/hotpdf.data.classes.ElementDimension.rst new file mode 100644 index 0000000..f3c4ea1 --- /dev/null +++ b/docs/source/generated/hotpdf.data.classes.ElementDimension.rst @@ -0,0 +1,30 @@ +hotpdf.data.classes.ElementDimension +==================================== + +.. currentmodule:: hotpdf.data.classes + +.. autoclass:: ElementDimension + + + .. automethod:: __init__ + + + .. rubric:: Methods + + .. autosummary:: + + ~ElementDimension.__init__ + + + + + + .. rubric:: Attributes + + .. autosummary:: + + ~ElementDimension.span_id + ~ElementDimension.x0 + ~ElementDimension.y0 + ~ElementDimension.x1 + ~ElementDimension.y1 diff --git a/docs/source/generated/hotpdf.data.classes.HotCharacter.rst b/docs/source/generated/hotpdf.data.classes.HotCharacter.rst new file mode 100644 index 0000000..0896be6 --- /dev/null +++ b/docs/source/generated/hotpdf.data.classes.HotCharacter.rst @@ -0,0 +1,31 @@ +hotpdf.data.classes.HotCharacter +================================ + +.. currentmodule:: hotpdf.data.classes + +.. autoclass:: HotCharacter + + + .. automethod:: __init__ + + + .. rubric:: Methods + + .. autosummary:: + + ~HotCharacter.__init__ + + + + + + .. rubric:: Attributes + + .. autosummary:: + + ~HotCharacter.is_anno + ~HotCharacter.value + ~HotCharacter.x + ~HotCharacter.y + ~HotCharacter.x_end + ~HotCharacter.span_id diff --git a/docs/source/generated/hotpdf.data.classes.Span.rst b/docs/source/generated/hotpdf.data.classes.Span.rst new file mode 100644 index 0000000..7e06ab7 --- /dev/null +++ b/docs/source/generated/hotpdf.data.classes.Span.rst @@ -0,0 +1,29 @@ +hotpdf.data.classes.Span +======================== + +.. currentmodule:: hotpdf.data.classes + +.. autoclass:: Span + + + .. automethod:: __init__ + + + .. rubric:: Methods + + .. autosummary:: + + ~Span.__init__ + ~Span.get_element_dimension + ~Span.to_text + + + + + + .. rubric:: Attributes + + .. autosummary:: + + ~Span.characters + ~Span.span_id diff --git a/docs/source/generated/hotpdf.hotpdf.HotPdf.rst b/docs/source/generated/hotpdf.hotpdf.HotPdf.rst new file mode 100644 index 0000000..0da606a --- /dev/null +++ b/docs/source/generated/hotpdf.hotpdf.HotPdf.rst @@ -0,0 +1,23 @@ +hotpdf.hotpdf.HotPdf +==================== + +.. currentmodule:: hotpdf.hotpdf + +.. autoclass:: HotPdf + + + .. automethod:: __init__ + + + .. rubric:: Methods + + .. autosummary:: + + ~HotPdf.__init__ + ~HotPdf.extract_page_text + ~HotPdf.extract_spans + ~HotPdf.extract_spans_text + ~HotPdf.extract_text + ~HotPdf.find_text + ~HotPdf.load + ~HotPdf.merge_multiple diff --git a/docs/source/generated/hotpdf.memory_map.MemoryMap.rst b/docs/source/generated/hotpdf.memory_map.MemoryMap.rst new file mode 100644 index 0000000..003edcb --- /dev/null +++ b/docs/source/generated/hotpdf.memory_map.MemoryMap.rst @@ -0,0 +1,20 @@ +hotpdf.memory\_map.MemoryMap +============================ + +.. currentmodule:: hotpdf.memory_map + +.. autoclass:: MemoryMap + + + .. automethod:: __init__ + + + .. rubric:: Methods + + .. autosummary:: + + ~MemoryMap.__init__ + ~MemoryMap.build_memory_map + ~MemoryMap.extract_text_from_bbox + ~MemoryMap.find_text + ~MemoryMap.load_memory_map diff --git a/docs/source/generated/hotpdf.processor.rst b/docs/source/generated/hotpdf.processor.rst new file mode 100644 index 0000000..f00cd7a --- /dev/null +++ b/docs/source/generated/hotpdf.processor.rst @@ -0,0 +1,16 @@ +hotpdf.processor +================ + +.. automodule:: hotpdf.processor + + + + + + + + .. rubric:: Functions + + .. autosummary:: + + process diff --git a/docs/source/generated/hotpdf.span_map.SpanMap.rst b/docs/source/generated/hotpdf.span_map.SpanMap.rst new file mode 100644 index 0000000..bc780f4 --- /dev/null +++ b/docs/source/generated/hotpdf.span_map.SpanMap.rst @@ -0,0 +1,19 @@ +hotpdf.span\_map.SpanMap +======================== + +.. currentmodule:: hotpdf.span_map + +.. autoclass:: SpanMap + + + .. automethod:: __init__ + + + .. rubric:: Methods + + .. autosummary:: + + ~SpanMap.__init__ + ~SpanMap.get_span + ~SpanMap.insert + ~SpanMap.items diff --git a/docs/source/generated/hotpdf.sparse_matrix.SparseMatrix.rst b/docs/source/generated/hotpdf.sparse_matrix.SparseMatrix.rst new file mode 100644 index 0000000..0a8a498 --- /dev/null +++ b/docs/source/generated/hotpdf.sparse_matrix.SparseMatrix.rst @@ -0,0 +1,18 @@ +hotpdf.sparse\_matrix.SparseMatrix +================================== + +.. currentmodule:: hotpdf.sparse_matrix + +.. autoclass:: SparseMatrix + + + .. automethod:: __init__ + + + .. rubric:: Methods + + .. autosummary:: + + ~SparseMatrix.__init__ + ~SparseMatrix.get + ~SparseMatrix.insert diff --git a/docs/source/generated/hotpdf.trie.Trie.rst b/docs/source/generated/hotpdf.trie.Trie.rst new file mode 100644 index 0000000..b4506cc --- /dev/null +++ b/docs/source/generated/hotpdf.trie.Trie.rst @@ -0,0 +1,18 @@ +hotpdf.trie.Trie +================ + +.. currentmodule:: hotpdf.trie + +.. autoclass:: Trie + + + .. automethod:: __init__ + + + .. rubric:: Methods + + .. autosummary:: + + ~Trie.__init__ + ~Trie.insert + ~Trie.search_all diff --git a/docs/source/generated/hotpdf.trie.TrieNode.rst b/docs/source/generated/hotpdf.trie.TrieNode.rst new file mode 100644 index 0000000..d38d42f --- /dev/null +++ b/docs/source/generated/hotpdf.trie.TrieNode.rst @@ -0,0 +1,16 @@ +hotpdf.trie.TrieNode +==================== + +.. currentmodule:: hotpdf.trie + +.. autoclass:: TrieNode + + + .. automethod:: __init__ + + + .. rubric:: Methods + + .. autosummary:: + + ~TrieNode.__init__ diff --git a/docs/source/generated/hotpdf.utils.rst b/docs/source/generated/hotpdf.utils.rst new file mode 100644 index 0000000..5249e3c --- /dev/null +++ b/docs/source/generated/hotpdf.utils.rst @@ -0,0 +1,20 @@ +hotpdf.utils +============ + +.. automodule:: hotpdf.utils + + + + + + + + .. rubric:: Functions + + .. autosummary:: + + filter_adjacent_coords + find_neighbour_coord + get_element_dimension + intersect + to_text diff --git a/docs/source/guide.rst b/docs/source/guide.rst new file mode 100644 index 0000000..f099d3d --- /dev/null +++ b/docs/source/guide.rst @@ -0,0 +1,191 @@ +================== +User Guide +================== + +This guide contains a couple of common use cases that your application might have. Since HotPdf returns data in its own structure, its readability may not be optimal. + +To mitigate this issue, we are writing this guide to help you get started with using HotPdf. + +Text Operations +------------------------------------------ + +Start by loading the file. + +The PDF can be loaded either by passing the file path or the file stream. + +.. code-block:: python + + from hotpdf import HotPdf + pdf_file_path = "path to your pdf file" + + # Loading from path + hotpdf_document = HotPdf(pdf_file_path) + + # Loading opened file + with open(pdf_file_path, "rb") as f: + hotpdf_document_2 = HotPdf(f) + +Alternatively, to load a file, you can also defer loading from the constructor and using `.load()` instead. + +.. code-block:: python + + from hotpdf import HotPdf + pdf_file_path = "path to your pdf file" + + # Loading from path + hotpdf_document = HotPdf() + hotpdf_document.load(pdf_file_path) + + # Loading opened file + hotpdf_document_2 = HotPdf() + with open(pdf_file_path, "rb") as f: + hotpdf_document_2.load(f) + +You can also merge multiple HotPdf objects to get one single HotPdf object! + +.. code-block:: python + + merged_hotpdf_object = HotPdf.merge_multiple(hotpdfs=[ + hotpdf_document, + hotpdf_document2, + ]) + + +The `HotPdf` object has many attributes that you can use to solve your problems. One of them is `pages`, representing each page of the PDF stored in data structures (trie & sparse matrix) to help with text operations. +Locked PDFs can be loaded passing the password as the password argument: + +.. code-block:: python + + hotpdf_document = HotPdf() + hotpdf_document = hotpdf_document.load(locked_pdf_file_path, password="your_password") + +Number of Pages +~~~~~~~~~~~~~~~~~~ + +Begin by getting the number of loaded pages or the total pages in the PDF. + +.. code-block:: python + + len_pages: int = len(hotpdf_document.pages) + +Each `page` in the `pages` list is an in-memory representation of a page of the loaded PDF. All operations are performed on a page. + +Looking up Text +~~~~~~~~~~~~~~~~~~ + +To look up text, use the `find_text` function. + +You can attempt to find the full span the text lies in by setting `take_span` to `True`. + +.. code-block:: python + + text_occurrences = hotpdf_document.find_text("foo") + +This will return a `dict` of `list` of `list` of `HotCharacter`: + +- The `dict` keys are the page numbers. +- The outer `list` is all the occurrences found on the page. +- The inner `list` contains character-wise all the words that were found. + The `HotCharacter` object contains the value and the coordinates of the character on the PDF. + +To get the entire span of the found occurrence, you could reuse the implementation of `get_element_dimension` that is found under `hotpdf.utils`. + +.. code-block:: python + + from hotpdf.utils import get_element_dimension + + # Getting the dimension of the first element that was found on page 0. + element_dimension = get_element_dimension(text_occurrences[0][0]) + +`element_dimension` will return an `ElementDimension` data object which has the `x0`, `y0`, `x1`, `y1` values. These coordinates represent the position the text was found in. + +You can set `take_span` to `True` to find the whole span that it lies in. Usage remains the same. + +.. code-block:: python + + text_occurrences = hotpdf_document.find_text("foo", take_span=True) + + # Getting the dimension of the first element that was found on page 0. + element_dimension = get_element_dimension(text_occurrences[0][0]) + +For example, if you are looking for a text like "hotpdf v23" but you know that the part "v23" is variable, you can simply search for "hotpdf v" or just "hotpdf". +This will return the spans of the text as well, so you could also find "hotpdf v24" just by searching for "hotpdf v" or "hotpdf". + +**Please note:** The text children of a `Span` depend on the PDF producing software, so it could be unpredictable. Either way, if it works for you, then it works. Please test it! + +Extracting Text +~~~~~~~~~~~~~~~~~~ + +If you know the coordinates of the text that you are going to extract, you can use the `extract_text` function. + +This will extract the text that lay in the specified coordinates (`x0`, `y0`, `x1`, `y1`) of the specified `page`. +If you don't specify a `page` it will default to 0 (i.e., the first page). + +.. code-block:: python + + text = pdf.extract_text(x0=0, y0=0, x1=600, y1=500, page=0) + +This will return a `str` in plain text format. Characters, if they are on different lines, will be separated by `\n`. + +Extracting Spans Text +~~~~~~~~~~~~~~~~~~~~~~ + +If you want to extract text of all spans that lay or intersect the coordinates (`x0`, `y0`, `x1`, `y1`) that you specify on the `page` that you specify, you need to use the `extract_spans_text` function. + +In case you want more granular view of the spans, use `extract_spans` instead. + +.. code-block:: python + + text_spans = pdf.extract_spans_text(x0=0, y0=0, x1=600, y1=500, page=0) + +This will return a `list` of `str`. + +The `list` contains text of spans that lay within the given coordinates. + +Extracting Spans +~~~~~~~~~~~~~~~~~~ + +If you want to extract all spans that lay or intersect the coordinates (`x0`, `y0`, `x1`, `y1`) that you specify on the `page` that you specify, you need to use the `extract_spans` function. + +.. code-block:: python + + text_spans = pdf.extract_spans(x0=0, y0=0, x1=600, y1=500, page=0) + +This will return a `list` of `Span`. + +The `list` contains the spans that lay within the given coordinates. A `Span` is a collection of `HotCharacter` + +To access a span, you can access it by index. For example, if you want to get the dimensions of the first span that was returned, you can do this: + +.. code-block:: python + + from hotpdf.utils import get_element_dimension + + # Get the dimensions of the first span + first_span_dimensions = spans[0].get_element_dimension() + + # Get the text of the first span + span_text = spans[0].to_text() + +This will give you the dimension of the span. + +If you want to extract the text, you can iterate over a span and get the `value` attribute of the `HotCharacter`. + +.. code-block:: python + + extracted_span = "".join([hc.value for hc in text_spans[0]]) + +Extracting Text of Page +~~~~~~~~~~~~~~~~~~~~~~~~~ + +In case you want to view the text of a specified page, you can use the `extract_page_text` function. + +This will return you an `str` of the whole page of the PDF. + +.. code-block:: python + + page_text = pdf.extract_page_text(page=0) + +--- + +We will keep adding more functions to help with various operations. In any case please feel free to open an issue on our github. diff --git a/docs/source/index.rst b/docs/source/index.rst new file mode 100644 index 0000000..fda722b --- /dev/null +++ b/docs/source/index.rst @@ -0,0 +1,100 @@ +========= +hotpdf +========= + +This project was started as an internal project @ `Prestatech `_ to parse PDF files in a fast and memory efficient way to overcome the difficulties we were having while parsing big PDF files using libraries such as `pdfquery `_. + +hotpdf can be used to find and extract text from PDFs. + +Installation +------------ + +The latest version of `hotpdf` can be installed directly from `PYPI`_ with pip. + +.. code-block:: bash + + pip install hotpdf + +.. _PYPI: https://pypi.org/project/hotpdf/ + +Local Setup +------------ + +First install the dependencies required by hotpdf + +.. code-block:: bash + + python3 -m pip install -e . + + +Contributing +------------ + +You should install the `pre-commit` hooks with ``pre-commit install``. This will run the linter, mypy, and a subset of the tests on every commit. + +For more examples of how to run the full test suite, please refer to the `CI workflow `_. + +We strive to keep the test coverage at 100%: if you want your contributions accepted, please write tests for them :D + +Some examples of running tests locally: + +.. code-block:: bash + + python3 -m pip install -e '.[testing]' # install extra deps for testing + python3 -m pytest -n=auto test/ # run the test suite + # run tests with coverage + python3 -m pytest --cov-fail-under=96 -n=auto --cov=hotpdf --cov-report term-missing + + +Known Issues +-------------- + +1. (cid:x) characters in text - Some pdfs when extracted, some symbols like `€` might not be properly decoded, and instead be extracted as `(cid:128)`. + + This is a problem with the `pdfminer.six` library. We have fixed it from our side on our `fork `, and you can install it using pip. Until we are able to merge it to pdfminer.six repo and it gets released, we recommend that you install our fork with the fixes manually. + + .. code-block:: bash + + pip install --no-cache-dir git+https://github.com/weareprestatech/pdfminer.six.git@20240222#egg=pdfminer-six + + + +Documentation +-------------- + +We use `sphinx `_ for generating our docs and host them on `readthedocs `_. + +Please update and add documentation if required, with your contributions. + +Update the `.rst` files, rebuild them, and commit them along with your PRs. + +.. code-block:: bash + + cd docs + make clean + make html + +This will generate the necessary documentation files. Once merged to `main` the docs will be updated automatically. + + +Contents +-------------- + +To view detailed usage information, please navigate to `Usage` and `User Guide` + + +.. toctree:: + :maxdepth: 3 + :caption: Contents: + + usage + guide + api + +License +------- + +This project is licensed under the terms of the MIT license. + +--- +with ❤️ from the team @ `Prestatech GmbH `_ diff --git a/docs/source/usage.rst b/docs/source/usage.rst new file mode 100644 index 0000000..e3b0815 --- /dev/null +++ b/docs/source/usage.rst @@ -0,0 +1,160 @@ +========= +Usage +========= + +HotPdf Class +------------------------------------------ + +.. autoclass:: hotpdf.HotPdf + +.. autofunction:: hotpdf.HotPdf.__init__ + +The HotPdf class is the wrapper around your PDF that allows for searching text and extracting text on your PDFs. + +.. code-block:: python + + from hotpdf import HotPdf + pdf_file_path = "path to your pdf file" + + # Load directly from Path + hotpdf_document = HotPdf(pdf_file_path) + + # Load from file stream + with open(pdf_file_path, "rb") as f: + hotpdf_document_2 = HotPdf(f) + +Alternatively you can defer loading, and use the `.load()` function instead. The outcome is the same, internally the constructor for `HotPdf` calls the `.load()` function + +.. code-block:: python + + from hotpdf import HotPdf + pdf_file_path = "path to your pdf file" + + # path + hotpdf_document = HotPdf() + hotpdf_document = hotpdf_document.load(pdf_file_path) + + # file stream + hotpdf_document_2 = HotPdf() + with open(pdf_file_path, "rb") as f: + hotpdf_document_2 = hotpdf_document_2.load(f) + + +.. autofunction:: hotpdf.HotPdf.load + +You can also merge multiple HotPdf objects to get one single HotPdf object! + +.. code-block:: python + + merged_hotpdf_object = HotPdf.merge_multiple(hotpdfs=[ + hotpdf_document, + hotpdf_document2, + ]) + + +.. autofunction:: hotpdf.HotPdf.merge_multiple + +File Operations +------------------------------------------ + +Length +~~~~~~~~~~~~~~~~~~~ + +The number of pages in the PDF file can be determined by checking the `len` of `pages` property of the hotpdf object. + +.. code-block:: python + + num_pages = len(hotpdf_document.pages) + +Search +------------------------------------------ + +find_text +~~~~~~~~~~~~~~~~~~~ + +To look for a string in the entire PDF File, you can use the `find_text` function. +You can also specify what pages you want to search in. By default it will look through the whole PDF. +To get the whole span where the string lies in, you can set `take_span` to True. + +.. code-block:: python + + text_occurences = hotpdf_document.find_text("foo") + text_occurences_with_span = hotpdf_document.find_text( + "foo", + take_span=True, + ) + + +.. autofunction:: hotpdf.HotPdf.find_text + +Extraction +------------------------------------------ + +extract_text +~~~~~~~~~~~~~~~~~~~ + +To extract string from specific positions in the PDF, you can use the `extract_text` function. +This will extract the string that lies within the positions that have been specified on the page that it's specified (default is Page 0). + +.. code-block:: python + + text_in_bbox = hotpdf_document.extract_text( + x0=0, + y0=0, + x1=100, + y1=10, + page=0, + ) + +.. autofunction:: hotpdf.HotPdf.extract_text + +extract_spans +~~~~~~~~~~~~~~~~~~~ + +Instead of just the individual characters that lay within the bounds that you specify, if you want full words, or the complete spans that intersect within the specified bounds - you can use the `extract_spans` functions instead. +This will extract all the spans that intersect with the positions that have been specified on the page that it's specified (default is Page 0). + + +.. code-block:: python + + spans_in_bbox = hotpdf_document.extract_spans( + x0=0, + y0=0, + x1=100, + y1=10, + page=0, + ) + +.. autofunction:: hotpdf.HotPdf.extract_spans + +extract_spans_text +~~~~~~~~~~~~~~~~~~~ + +Instead of handling the spans structures yourself, if you are only interested in the text of the spans, you can use the `extract_spans_text` function instead. + +The function is the same as `extract_spans`_ except it returns you a `list` of `str`. + +.. code-block:: python + + spans_text_in_bbox = hotpdf_document.extract_spans_text( + x0=0, + y0=0, + x1=100, + y1=10, + page=0, + ) + +.. autofunction:: hotpdf.HotPdf.extract_spans_text + +extract_page_text +~~~~~~~~~~~~~~~~~~~ + +If you want to view the text of an entire page in plaintext `str` format, you can use the `extract_page_text` function. + +The function accepts `page` as a parameter. + +.. code-block:: python + + page_text = hotpdf_document.extract_page_text(page=0,) + +.. autofunction:: hotpdf.HotPdf.extract_page_text diff --git a/hotpdf/__init__.py b/hotpdf/__init__.py new file mode 100644 index 0000000..b9add18 --- /dev/null +++ b/hotpdf/__init__.py @@ -0,0 +1,4 @@ +from hotpdf.hotpdf import HotPdf + +__version__ = "0.1.0" +__all__ = ["HotPdf"] diff --git a/hotpdf/data/__init__.py b/hotpdf/data/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/hotpdf/data/classes.py b/hotpdf/data/classes.py new file mode 100644 index 0000000..37efd94 --- /dev/null +++ b/hotpdf/data/classes.py @@ -0,0 +1,94 @@ +from collections import defaultdict +from dataclasses import dataclass +from typing import Optional +from uuid import UUID + + +@dataclass +class HotCharacter: + """A hot character is a character on a page with certain attributes. + + Attributes: + value (str): value value of the character. + x (int): x position of the character - column number. + y (int): y position of the character - row number. + x_end (int): end x position of the character. x_end - x = width of character. + span_id (UUID): hash of parent span the character lies in. + is_anno (bool, Optional): specify if a character is an annotation (default: False). + """ + + value: str + x: int + y: int + x_end: int + span_id: UUID + is_anno: Optional[bool] = False + + +@dataclass +class ElementDimension: + """ElementDimension is the dimension of an element in hotpdf. + + Attributes: + x0 (int): starting x position of the element (column). + y0 (int): starting y position of the element (row). + x1 (int): end x position of the element (column). x1 - x0 = width. + y1 (int): end y position of the element (row) y1 - y0 = height. + span_id (UUID, Optional): hash of parent span the element lies in. + """ + + x0: int + y0: int + x1: int + y1: int + span_id: Optional[UUID] = None + + +@dataclass(init=True) +class Span: + """A span is a group of characters that are close to each other. + + Attributes: + characters (list[HotCharacter]): list of characters in the span. + x0 (int): starting x position of the span (column). + y0 (int): starting y position of the span (row). + x_end (int): end x position of the span (column). x_end - x0 = width. + span_id (UUID, Optional): hash of the span. + """ + + characters: list[HotCharacter] + span_id: UUID + + def to_text(self) -> str: + """Convert the span to text. + + Returns: + str: text representation of the span. + """ + return "".join(char.value for char in self.characters) + + def get_element_dimension(self) -> ElementDimension: + """Get the element dimension of the span. + + Raises: + ValueError: if the span has no characters. + + Returns: + ElementDimension: _description_ + """ + if not self.characters: + raise ValueError("Span has no characters") + x0 = self.characters[0].x + y0 = self.characters[0].y + x1 = self.characters[-1].x_end + y1 = self.characters[-1].y + return ElementDimension(x0, y0, x1, y1, self.span_id) + + +# All occurences of HotCharacters in a page +# A list[HotCharacter] is the representation of a word split into "HotCharacters" +# A list[list[HotCharacter]] is a list of multiple list[HotCharacter] found on a page +PageResult = list[list[HotCharacter]] + +# Complete PageResult with Page Number as the index +SearchResult = defaultdict[int, PageResult] diff --git a/hotpdf/exceptions/__init__.py b/hotpdf/exceptions/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/hotpdf/exceptions/custom_exceptions.py b/hotpdf/exceptions/custom_exceptions.py new file mode 100644 index 0000000..31a0cbc --- /dev/null +++ b/hotpdf/exceptions/custom_exceptions.py @@ -0,0 +1,2 @@ +class HotPdfIsNoneError(Exception): + pass diff --git a/hotpdf/hotpdf.py b/hotpdf/hotpdf.py new file mode 100644 index 0000000..8b455b7 --- /dev/null +++ b/hotpdf/hotpdf.py @@ -0,0 +1,361 @@ +import math +import os +from collections import defaultdict +from io import IOBase +from pathlib import PurePath +from typing import Optional, Union + +from hotpdf import processor +from hotpdf.exceptions.custom_exceptions import HotPdfIsNoneError +from hotpdf.memory_map import MemoryMap +from hotpdf.utils import filter_adjacent_coords, intersect + +from .data.classes import ElementDimension, HotCharacter, PageResult, SearchResult, Span + + +class HotPdf: + def __init__( + self, + pdf_file: Union[PurePath, str, IOBase, None] = None, + password: str = "", + page_numbers: Optional[list[int]] = None, + extraction_tolerance: int = 4, + laparams: Optional[dict[str, Union[float, bool]]] = None, + include_annotation_spaces: bool = False, + preserve_pdfminer_coordinates: bool = False, + ) -> None: + """Initialize the HotPdf class. + + Args: + pdf_file (PurePath | str | IOBytes): The path to the PDF file to be loaded, or a bytes object. + password (str, optional): Password to use to unlock the pdf + page_numbers (list[int], optional): Pages to be loaded into memory. (0-indexed). + If not provided, will load all pages (default). + extraction_tolerance (int, optional): Tolerance value used during text extraction + to adjust the bounding box for capturing text. Defaults to 4. + laparams (dict[str, Union[float, bool]], optional): Layout parameters for pdfminer. + include_annotation_spaces (bool, optional): Add annotation spaces to the memory map. Default: False + preserve_pdfminer_coordinates (bool, Optional): Preserve pdfminer y-coordinate values. + Default: False - use natural coords + Raises: + ValueError: If the page range is invalid. + FileNotFoundError: If the file is not found. + PermissionError: If the file is encrypted or the password is wrong. + RuntimeError: If an unknown error is generated by transfotmer. + """ + self.pages: list[MemoryMap] = [] + self.extraction_tolerance: int = extraction_tolerance + if pdf_file: + self.load( + pdf_file, + password, + page_numbers, + laparams=laparams, + include_annotation_spaces=include_annotation_spaces, + preserve_pdfminer_coordinates=preserve_pdfminer_coordinates, + ) + + def __check_file_exists(self, pdf_file: str) -> None: + if not os.path.exists(pdf_file): + raise FileNotFoundError(f"File {pdf_file} not found") + + def __check_coordinates(self, x0: int, y0: int, x1: int, y1: int) -> None: + if x0 < 0 or x1 < 0 or y0 < 0 or y1 < 0: + raise ValueError("Invalid coordinates") + + def __check_page_number(self, page: int) -> None: + if page < 0 or page >= len(self.pages): + raise ValueError("Invalid page number") + + def __check_page_numbers(self, pages: list[int]) -> None: + for page in pages: + self.__check_page_number(page) + + def __check_page_range(self, page_numbers: list[int]) -> None: + if any(_page_num < 0 for _page_num in page_numbers): + raise ValueError("Invalid page range") + + def __prechecks(self, pdf_file: Union[PurePath, str, IOBase], page_numbers: list[int]) -> None: + if type(pdf_file) is str: + self.__check_file_exists(pdf_file) + self.__check_page_range(page_numbers) + + @staticmethod + def merge_multiple( + hotpdfs: list["HotPdf"], + ) -> "HotPdf": + """Merge multiple HotPdf objects and return a single HotPdf object consisting of all pages + + Args: + hotpdfs (list[HotPdf]): List of HotPdf objects that will be combined + to form one single HotPdf object. All other params will be ignored in this case. + Raises: + HotPdfIsNoneError: If any of the HotPdf objects in the hotpdfs list is None + + Returns: + HotPdf: Merged HotPdf object + """ + if any(_hotpdf is None for _hotpdf in hotpdfs): + raise HotPdfIsNoneError("HotPdf object cannot be None") + merged_hotpdf = HotPdf() + for _hotpdf in hotpdfs: + merged_hotpdf.pages.extend(_hotpdf.pages) + return merged_hotpdf + + def load( + self, + pdf_file: Union[PurePath, str, IOBase], + password: str = "", + page_numbers: Optional[list[int]] = None, + laparams: Optional[dict[str, Union[float, bool]]] = None, + include_annotation_spaces: bool = False, + preserve_pdfminer_coordinates: bool = False, + ) -> None: + """Load a PDF file into memory. + + Args: + pdf_file (str | Bytes): The path to the PDF file to be loaded, or a bytes object. + password (str, optional): Password to use to unlock the pdf + page_numbers (list[int], optional): Pages to be loaded into memory. (0-indexed). + If not provided, will load all pages (default). + laparams (dict[str, Union[float, bool]], optional): Layout parameters for pdfminer. + include_annotation_spaces (bool, optional): Add annotation spaces to the memory map. + preserve_pdfminer_coordinates (bool, Optional): Preserve pdfminer y-coordinate values. + Default: False - use natural coords + Raises: + Exception: If an unknown error is generated by pdfminer. + """ + page_numbers = page_numbers or [] + self.__prechecks(pdf_file, page_numbers) + try: + self.pages = processor.process( + source=pdf_file, + password=password, + page_numbers=page_numbers, + laparams=laparams, + include_annotation_spaces=include_annotation_spaces, + preserve_pdfminer_coordinates=preserve_pdfminer_coordinates, + ) + except Exception as e: + raise e + + def __extract_full_text_span( + self, + hot_characters: list[HotCharacter], + page_num: int, + ) -> Union[list[HotCharacter], None]: + """Extract the full span of text that the given hot characters are a part of. + + Args: + hot_characters (list[HotCharacter]): the list of hot characters to extract the span for. + page_num (int): the page number of the hot characters. + + Returns: + Union[list[HotCharacter], None]: the full span of text that the hot characters are a part of. + """ + _span: Optional[Span] = None + if hot_characters[0].span_id: + _span = self.pages[page_num].span_map[hot_characters[0].span_id] + return _span.characters if _span else None + + def find_text( + self, + query: str, + pages: Optional[list[int]] = None, + take_span: bool = False, + sort: bool = True, + case_sensitive: bool = True, + ) -> SearchResult: + """Find text within the loaded PDF pages. + + Args: + query (str): The text to search for. + pages (list[int], optional): List of page numbers to search. + take_span (bool, optional): Take the full span of the text that it is a part of. + sort (bool, Optional): Return elements sorted by their positions. + case_sensitive (bool, optional): Whether the search should be case-sensitive. Defaults to True. + Raises: + ValueError: If the page number is invalid. + + Returns: + SearchResult: A dictionary mapping page numbers to found text coordinates. + """ + pages = pages or [] + + self.__check_page_numbers(pages) + + query_pages = ( + {i: self.pages[i] for i in range(len(self.pages))} if len(pages) == 0 else {i: self.pages[i] for i in pages} + ) + + found_page_map = {} + + normalized_query = query if case_sensitive else query.lower() + + for page_num in query_pages: + found_page_map[page_num] = filter_adjacent_coords( + *query_pages[page_num].find_text(query, case_sensitive=case_sensitive) + ) + + final_found_page_map: SearchResult = defaultdict(PageResult) + + for page_num in found_page_map: + hot_character_page_occurences: PageResult = found_page_map[page_num] + final_found_page_map[page_num] = [] + for hot_characters in hot_character_page_occurences: + text = "".join(hc.value for hc in hot_characters) + comparable_text = text if case_sensitive else text.lower() + if normalized_query not in comparable_text: + continue + full_span_dimension_hot_characters: Union[list[HotCharacter], None] = ( + self.__extract_full_text_span( + hot_characters=hot_characters, + page_num=page_num, + ) + if take_span + else None + ) + chars_to_append = ( + full_span_dimension_hot_characters + if (take_span and full_span_dimension_hot_characters) + else hot_characters + ) + if chars_to_append and sort: + chars_to_append = sorted(chars_to_append, key=lambda ch: (ch.y, ch.x)) + final_found_page_map[page_num].append(chars_to_append) + if sort: + for _page in final_found_page_map: + final_found_page_map[_page] = sorted( + final_found_page_map[_page], key=lambda element: (element[0].y, element[0].x) + ) + return final_found_page_map + + def extract_spans(self, x0: int, y0: int, x1: int, y1: int, page: int = 0, sort: bool = True) -> list[Span]: + """Extract spans that intersect with the given bounding box. + + Args: + x0 (int): The left x-coordinate of the bounding box. + y0 (int): The bottom y-coordinate of the bounding box. + x1 (int): The right x-coordinate of the bounding box. + y1 (int): The top y-coordinate of the bounding box. + page (int, optional): The page number. Defaults to 0. + sort (bool, optional): Sort the spans by their coordinates. Defaults to True. + + Raises: + ValueError: If the coordinates are invalid. + ValueError: If the page number is invalid. + + Returns: + list[Span]: List of spans of hotcharacters that intersect with the given bounding box + """ + spans: list[Span] = [] + + self.__check_coordinates(x0, y0, x1, y1) + self.__check_page_number(page) + + for _, span in self.pages[page].span_map.items(): + if intersect(ElementDimension(x0, y0, x1, y1, None), span.get_element_dimension()): + span.characters = sorted(span.characters, key=lambda ch: (ch.y, ch.x)) + spans.append(span) + if sort: + spans = sorted( + spans, key=lambda span: (span.get_element_dimension().y0, span.get_element_dimension().x0) + ) + + return spans + + def extract_text( + self, + x0: int, + y0: int, + x1: int, + y1: int, + page: int = 0, + ) -> str: + """Extract text from a specified bounding box on a page. + + Args: + x0 (int): The left x-coordinate of the bounding box. + y0 (int): The bottom y-coordinate of the bounding box. + x1 (int): The right x-coordinate of the bounding box. + y1 (int): The top y-coordinate of the bounding box. + page (int): The page number. Defaults to 0. + + Raises: + ValueError: If the coordinates are invalid. + ValueError: If the page number is invalid. + + Returns: + str: Extracted text within the bounding box. + """ + self.__check_coordinates(x0, y0, x1, y1) + self.__check_page_number(page) + + page_to_search: MemoryMap = self.pages[page] + extracted_text = page_to_search.extract_text_from_bbox( + x0=math.floor(x0), + x1=math.ceil(x1 + self.extraction_tolerance), + y0=y0, + y1=y1, + ) + return extracted_text + + def extract_page_text( + self, + page: int, + ) -> str: + """Extract text from a specified page. + + Args: + page (int): The page number. + + Raises: + ValueError: If the page number is invalid. + + Returns: + str: Extracted text from the page. + """ + self.__check_page_number(page) + + page_to_search: MemoryMap = self.pages[page] + extracted_text = page_to_search.extract_text_from_bbox( + x0=0, + x1=page_to_search.width, + y0=0, + y1=page_to_search.height, + ) + return extracted_text + + def extract_spans_text( + self, + x0: int, + y0: int, + x1: int, + y1: int, + page: int = 0, + ) -> str: + """Extract text from spans that intersect with the given bounding box. + + Args: + x0 (int): The left x-coordinate of the bounding box. + y0 (int): The bottom y-coordinate of the bounding box. + x1 (int): The right x-coordinate of the bounding box. + y1 (int): The top y-coordinate of the bounding box. + page (int, optional): The page number. Defaults to 0. + + Raises: + ValueError: If the coordinates are invalid. + ValueError: If the page number is invalid. + + Returns: + str: Extracted text that intersects with the bounding box. + """ + self.__check_coordinates(x0, y0, x1, y1) + self.__check_page_number(page) + + spans: list[Span] = self.extract_spans(x0, y0, x1, y1, page) + extracted_text: list[str] = [] + + for span in spans: + extracted_text.append(span.to_text()) + return "".join(extracted_text) diff --git a/hotpdf/memory_map.py b/hotpdf/memory_map.py new file mode 100644 index 0000000..bbc581f --- /dev/null +++ b/hotpdf/memory_map.py @@ -0,0 +1,250 @@ +import math +from collections import defaultdict +from collections.abc import Generator +from typing import Union +from uuid import UUID, uuid4 + +from pdfminer.layout import LTAnno, LTChar, LTComponent, LTFigure, LTPage, LTText, LTTextContainer, LTTextLine + +from .data.classes import HotCharacter, PageResult +from .span_map import SpanMap +from .sparse_matrix import SparseMatrix +from .trie import Trie + + +class MemoryMap: + def __init__(self) -> None: + """Initialize the MemoryMap. 2D Matrix representation of a PDF Page. + + Args: + width (int): The width of a page. + height (int) The height of a page. + """ + self.text_trie = Trie() + self.span_map = SpanMap() + self.width: int = 0 + self.height: int = 0 + + def build_memory_map(self) -> None: + """Build the memory map based on width and height. + + The memory map is a SparseMatrix representation of the PDF. + """ + self.memory_map = SparseMatrix() + + def __reverse_page_objs(self, page_objs: list[LTComponent]) -> Generator[LTComponent, None, None]: + yield from reversed(page_objs) + + def __extract_from_ltfigure(self, lt_figure_obj: LTFigure) -> Generator[Union[LTTextLine, LTChar], None, None]: + for element in lt_figure_obj: + if isinstance(element, (LTTextLine, LTChar)): + yield element + elif isinstance(element, LTTextContainer): + element_stack = self.__reverse_page_objs(list(element)) + yield from (em for em in element_stack if isinstance(em, LTTextLine)) + + def __get_page_spans(self, page: LTPage) -> Generator[Union[LTTextLine, LTChar], None, None]: + element_stack = self.__reverse_page_objs(page._objs) + for obj in element_stack: + if isinstance(obj, LTTextLine): + yield obj + elif isinstance(obj, (LTTextContainer)): + element_stack = self.__reverse_page_objs(list(obj)) + yield from (em for em in element_stack if isinstance(em, LTTextLine)) + elif isinstance(obj, (LTFigure)): + yield from self.__extract_from_ltfigure(obj) + + def __get_right_shifted_hot_character(self, hot_character: HotCharacter, shift: int) -> HotCharacter: + """Shift a hotcharacter on the x-coordinate + + Args: + hot_character (HotCharacter): HotCharacter object to be shifted + shift (int): shift offset on the x-coordinate + + Returns: + HotCharacter: HotCharacter object with new coords + """ + hot_character.x += shift + hot_character.x_end += shift + return hot_character + + def load_memory_map( + self, + page: LTPage, + include_annotation_spaces: bool = False, + preserve_pdfminer_coordinates: bool = False, + ) -> None: + """Load memory map data from an XML page. + + Args: + page (str): LTPage Element returned by pdfminer + include_annotation_spaces (bool, optional): Add annotation spaces to the memory map. + preserve_pdfminer_coordinates(bool, optional): Preserve pdfminer y-coordinate values. + Returns: + None + """ + char_hot_characters: list[HotCharacter] = [] + page_components: Generator[Union[LTTextLine, LTChar], None, None] = self.__get_page_spans(page) + line_shift: defaultdict[int, int] = defaultdict(int) + for component in page_components: + span_id = uuid4() + prev_char_inserted = False + if isinstance(component, LTChar): + x0 = round(component.x0) + x1 = round(component.x1) + y0 = round(component.y0) if preserve_pdfminer_coordinates else round(page.height - component.y0) + hot_character: HotCharacter = self.__get_hot_character_of( + value=component.get_text(), + x=x0, + y=y0, + x_end=x1, + span_id=span_id, + ) + char_hot_characters.append( + hot_character, + ) + continue + for character in component: + if ( + include_annotation_spaces + and isinstance(character, LTAnno) + and (character._text == " ") + and prev_char_inserted + ): + _elem_width: int = 1 + space_char: HotCharacter = self.__get_hot_character_of( + value=" ", x=x0, y=y0, x_end=x0 + _elem_width, span_id=span_id, is_anno=True + ) + char_hot_characters.append( + space_char, + ) + prev_char_inserted = False + elif ( + isinstance(character, (LTChar, LTText)) + and ( + hasattr(character, "x0") + and hasattr(character, "x1") + and hasattr(character, "y0") + and hasattr(character, "y1") + ) + and not isinstance(character, LTAnno) + ): + char_c = character.get_text() + x0 = round(character.x0) + x1 = round(character.x1) + y0 = round(component.y0) if preserve_pdfminer_coordinates else round(page.height - component.y0) + hot_character = self.__get_hot_character_of( + value=char_c, + x=x0, + y=y0, + x_end=x1, + span_id=span_id, + ) + char_hot_characters.append( + hot_character, + ) + prev_char_inserted = char_c != " " + # Insert into Trie and Span Maps + last_inserted_x_y: tuple[int, int] = (-1, -1) + for i in range(len(char_hot_characters)): + _current_character: HotCharacter = char_hot_characters[i] + # Determine if annotation spaces should be added + if include_annotation_spaces and i > 0 and i < len(char_hot_characters) - 1: + prev_char: HotCharacter = char_hot_characters[i - 1] + next_char: HotCharacter = char_hot_characters[i + 1] + # Anno and non-anno characters should not be overlapping + if _current_character.is_anno and next_char.x - prev_char.x <= 0: + continue + + # Prevent characters from overlapping + if (last_inserted_x_y[0] > 0 and last_inserted_x_y[1] > 0) and ( + _current_character.x == last_inserted_x_y[0] and _current_character.y == last_inserted_x_y[1] + ): + line_shift[_current_character.y] += 1 + last_inserted_x_y = (_current_character.x, _current_character.y) + _current_character = self.__get_right_shifted_hot_character( + _current_character, line_shift[_current_character.y] + ) + + self.__insert_hotcharacter_to_memory(_current_character) + self.width = math.ceil(page.width) + self.height = math.ceil(page.height) + + def __insert_hotcharacter_to_memory( + self, + hot_character: HotCharacter, + ) -> None: + """Insert hotcharacter into memory map & trie""" + if hot_character.value == "": + return None + self.memory_map.insert(value=hot_character.value, row_idx=hot_character.y, column_idx=hot_character.x) + self.text_trie.insert(word=hot_character.value, hot_character=hot_character) + if hot_character.span_id: + self.span_map[hot_character.span_id] = hot_character + + def __get_hot_character_of( + self, + value: str, + x: int, + y: int, + x_end: int, + span_id: UUID, + is_anno: bool = False, + ) -> HotCharacter: + """Insert element into memory map. + + Args: + value (str): Value of the object to be inserted. + x (int): column index (x0-coordinate) of the element. + y (int): row index (y0-coordinate) of the element. + x_end (int): end column index (x1-coordinate) of element. x_end - x = width of element. + span_id (UUID): id of parent span. + + Returns: + HotCharacter: HotCharacter object of the whitespace. + """ + return HotCharacter( + value=value, + x=x, + y=y, + x_end=x_end, + span_id=span_id, + is_anno=is_anno, + ) + + def extract_text_from_bbox(self, x0: int, x1: int, y0: int, y1: int) -> str: + """Extract text within a specified bounding box. + + Args: + x0 (int): Left x-coordinate of the bounding box. + x1 (int): Right x-coordinate of the bounding box. + y0 (int): Bottom y-coordinate of the bounding box. + y1 (int): Top y-coordinate of the bounding box. + + Returns: + str: Extracted text within the bounding box. + """ + extracted_text: str = "" + for row in range(max(y0, 0), min(y1, self.memory_map.rows - 1) + 1): + row_text: str = "" + row_text = "".join( + self.memory_map.get(row_idx=row, column_idx=col) + for col in range(max(x0, 0), min(x1, self.memory_map.columns - 1) + 1) + ) + if row_text: + extracted_text += row_text + "\n" + + return extracted_text + + def find_text(self, query: str, case_sensitive: bool = True) -> tuple[list[str], PageResult]: + """Find text within the memory map. + + Args: + query (str): The text to search for. + case_sensitive (bool): Whether the search should be case-sensitive. Defaults to True. + + Returns: + list: List of found text coordinates. + """ + found_text = self.text_trie.search_all(query, case_sensitive=case_sensitive) + return found_text diff --git a/hotpdf/processor.py b/hotpdf/processor.py new file mode 100644 index 0000000..91dad0b --- /dev/null +++ b/hotpdf/processor.py @@ -0,0 +1,73 @@ +import logging +from io import IOBase +from pathlib import PurePath +from typing import Optional, Union + +from pdfminer.high_level import extract_pages +from pdfminer.layout import LAParams + +from hotpdf.memory_map import MemoryMap + +logging.getLogger("pdfminer").setLevel(logging.ERROR) + + +def __make_custom_laparams_object( + laparams: Optional[dict[str, Union[float, bool]]] = None, +) -> Union[LAParams, None]: + if not laparams: + return None + laparams_obj: LAParams = LAParams() + for key in laparams: + if hasattr(laparams_obj, key): + laparams_obj.__setattr__(key, laparams[key]) + return laparams_obj + + +def __supress_pdfminer_logs() -> None: + logging.getLogger("pdfminer").setLevel(logging.ERROR) + + +def __process( + source: Union[PurePath, str, IOBase], + password: str = "", + page_numbers: Optional[list[int]] = None, + laparams: Optional[dict[str, Union[float, bool]]] = None, + include_annotation_spaces: bool = False, + preserve_pdfminer_coordinates: bool = False, +) -> list[MemoryMap]: + pages: list[MemoryMap] = [] + __supress_pdfminer_logs() + page_numbers = sorted(page_numbers) if page_numbers else [] + laparams_obj = __make_custom_laparams_object(laparams) + + hl_page_layouts = extract_pages( + source, password=password, page_numbers=page_numbers, caching=True, laparams=laparams_obj + ) + for page_layout in hl_page_layouts: + parsed_page: MemoryMap = MemoryMap() + parsed_page.build_memory_map() + parsed_page.load_memory_map( + page=page_layout, + include_annotation_spaces=include_annotation_spaces, + preserve_pdfminer_coordinates=preserve_pdfminer_coordinates, + ) + pages.append(parsed_page) + return pages + + +def process( + source: Union[PurePath, str, IOBase], + password: str = "", + page_numbers: Optional[list[int]] = None, + laparams: Optional[dict[str, Union[float, bool]]] = None, + include_annotation_spaces: bool = False, + preserve_pdfminer_coordinates: bool = False, +) -> list[MemoryMap]: + return __process( + source=source, + password=password, + page_numbers=page_numbers, + laparams=laparams, + include_annotation_spaces=include_annotation_spaces, + preserve_pdfminer_coordinates=preserve_pdfminer_coordinates, + ) diff --git a/hotpdf/span_map.py b/hotpdf/span_map.py new file mode 100644 index 0000000..c2c25ec --- /dev/null +++ b/hotpdf/span_map.py @@ -0,0 +1,45 @@ +from collections.abc import Iterable +from typing import Union +from uuid import UUID + +from .data.classes import HotCharacter, Span + + +class SpanMap: + """Hashmap to store spans and their child words for fast referencing + and character grouping. + + Keys are span_ids and values are Span objects. + """ + + def __init__(self) -> None: + self.span_map: dict[UUID, Span] = dict() + + def __len__(self) -> int: + return len(self.span_map) + + def __getitem__(self, span_id: UUID) -> Union[Span, None]: + return self.get_span(span_id) + + def __setitem__(self, span_id: UUID, hot_character: HotCharacter) -> None: + self.insert(span_id, hot_character) + + def items(self) -> Iterable[tuple[UUID, Span]]: + yield from self.span_map.items() + + def insert(self, span_id: UUID, hot_character: HotCharacter) -> None: + span = self.span_map.get(span_id) + if not span: + span = Span( + characters=[], + span_id=span_id, + ) + span.characters.append(hot_character) + self.span_map[span_id] = span + + def get_span(self, span_id: UUID) -> Union[Span, None]: + span = self.span_map.get(span_id) + if not span: + return None + span.characters = sorted(span.characters, key=lambda ch: (ch.y, ch.x)) + return span diff --git a/hotpdf/sparse_matrix.py b/hotpdf/sparse_matrix.py new file mode 100644 index 0000000..35d7629 --- /dev/null +++ b/hotpdf/sparse_matrix.py @@ -0,0 +1,60 @@ +from collections import defaultdict +from collections.abc import Iterator +from warnings import warn + + +class SparseMatrix: + """2D representation of a PDF in plain text format. + + Sparse matrix removes the need to keep in memory the blank spaces + that are present in a PDF. Thus reducing memory usage drastically. + """ + + def __init__(self, rows: int = 0, columns: int = 0): + self.values: defaultdict[tuple[int, int], str] = defaultdict(str) + self.rows = rows + self.columns = columns + + def __getitem__(self, key: tuple[int, int]) -> str: + row_idx, column_idx = key + self.__check_indices(row_idx, column_idx) + return self.values[(row_idx, column_idx)] + + def __update_indices(self, row_idx: int, column_idx: int) -> None: + if row_idx > self.rows: + self.rows = row_idx + 1 + if column_idx > self.columns: + self.columns = column_idx + 1 + + def __check_indices(self, row_idx: int, column_idx: int) -> None: + if row_idx < 0 or column_idx < 0: + raise IndexError("Specified index is out of range") + + def __setitem__(self, key: tuple[int, int], value: str) -> None: + row_idx, column_idx = key + try: + self.__check_indices(row_idx, column_idx) + except IndexError as ie: + warn("Index Error. Skipping insertion into SparseMatrix", stacklevel=1) + warn(str(ie), stacklevel=1) + return + self.__update_indices(row_idx, column_idx) + if value: + self.values[(row_idx, column_idx)] = value + + def __iter__(self) -> Iterator[tuple[tuple[int, int], str]]: + yield from self.values.items() + + def insert(self, value: str, row_idx: int, column_idx: int) -> None: + self.__update_indices(row_idx, column_idx) + try: + self.__check_indices(row_idx, column_idx) + except IndexError: + warn("Index Error. Skipping insertion into SparseMatrix", stacklevel=1) + return + if value: + self.values[(row_idx, column_idx)] = value + + def get(self, row_idx: int, column_idx: int) -> str: + self.__check_indices(row_idx, column_idx) + return self.values[(row_idx, column_idx)] diff --git a/hotpdf/trie.py b/hotpdf/trie.py new file mode 100644 index 0000000..de0f676 --- /dev/null +++ b/hotpdf/trie.py @@ -0,0 +1,66 @@ +from collections import defaultdict + +from .data.classes import HotCharacter, PageResult + + +class TrieNode: + def __init__(self) -> None: + """Initialize a TrieNode. + + Args: + children (dict): Mapping of characters to TrieNode objects. + is_end_of_word (bool): Flag indicating the end of a word. + hot_characters (list[HotCharacter]): List of HotCharacter instances associated with the word. + """ + self.children: defaultdict[str, TrieNode] = defaultdict(TrieNode) + self.is_end_of_word: bool = False + self.hot_characters: list[HotCharacter] = [] + + +class Trie: + def __init__(self) -> None: + """Initialize a Trie.""" + self.root = TrieNode() + + def insert(self, word: str, hot_character: HotCharacter) -> None: + """Insert a word and a HotCharacter into the Trie. + + Args: + word (str): The word to insert. + hot_character (HotCharacter): The HotCharacter to insert. + """ + node: TrieNode = self.root + for char in word: + node = node.children[char] + node.is_end_of_word = True + node.hot_characters = node.hot_characters + [hot_character] + + def search_all(self, text: str, case_sensitive: bool = True) -> tuple[list[str], PageResult]: + """Search for words in the Trie that match a given text. + + Args: + text (str): The text to search for. + case_sensitive (bool): Whether the search should be case-sensitive. Defaults to True. + + Returns: + tuple: A tuple containing a list of the target characters found and corresponding PageResult. + """ + node: TrieNode = self.root + found: list[str] = [] + hot_characters: PageResult = [] + for char in text: + if case_sensitive: + if char in node.children and node.children[char].is_end_of_word: + found.append(char) + if node.children[char].hot_characters: + hot_characters.append(node.children[char].hot_characters) + else: + combined_hot_chars = [] + for candidate in {char, char.lower(), char.upper()}: + if candidate in node.children and node.children[candidate].is_end_of_word: + combined_hot_chars.extend(node.children[candidate].hot_characters) + if combined_hot_chars: + found.append(char) + hot_characters.append(combined_hot_chars) + node = self.root + return found, hot_characters diff --git a/hotpdf/utils.py b/hotpdf/utils.py new file mode 100644 index 0000000..841dfde --- /dev/null +++ b/hotpdf/utils.py @@ -0,0 +1,119 @@ +from typing import Union + +from .data.classes import ElementDimension, HotCharacter, PageResult + + +def find_neighbour_coord( + reference_character: HotCharacter, + hot_characters: list[HotCharacter], + max_distance: int = 5, + span_tolerance: int = 5, +) -> Union[HotCharacter, None]: + """Find a neighbouring coordinate within a specified maximum distance. + + Args: + reference_character (HotCharacter): Previous char instance. + hot_characters (list[HotCharacter]): List of character instances to search through. + max_distance (int): Maximum distance between reference coordinate and target coordinate. + span_tolerance (int): Additional distance to consider if text lies in the same span. + + Returns: + HotCharacter: The neighbouring HotCharacter if found, else None. + """ + for hot_character in hot_characters: + if hot_character == reference_character: + continue + if ( + ( + 0 + <= (hot_character.x - reference_character.x_end) + <= ( + (max_distance + span_tolerance) + if hot_character.span_id == reference_character.span_id + and (hot_character.span_id and reference_character.span_id) + else max_distance + ) + ) + or (reference_character.span_id == hot_character.span_id and reference_character.x < hot_character.x) + and (hot_character.x <= reference_character.x_end) + ) and reference_character.y == hot_character.y: + return hot_character + return None + + +def filter_adjacent_coords(text: list[str], page_hot_character_occurences: PageResult) -> PageResult: + """Filter adjacent coordinates based on the given text. + + Args: + text (str): The text to filter by. + page_hot_character_occurences (list): List of coordinates to filter by page + + Returns: + PageResult: List of adjacent groups of HotCharacters on a page. + """ + if not page_hot_character_occurences: + return [] + + max_len = len(text) + adjacent_groups = [] + + anchor_hot_character_instances = page_hot_character_occurences[0] + + for anchor_hot_character in anchor_hot_character_instances: + neighbours = [anchor_hot_character] + reference_hot_character = anchor_hot_character + for coords_j in page_hot_character_occurences[1:]: + neighbour_hot_character = find_neighbour_coord( + reference_character=reference_hot_character, + hot_characters=coords_j, + ) + if neighbour_hot_character: + neighbours.append(neighbour_hot_character) + reference_hot_character = neighbour_hot_character + if len(neighbours) == max_len: + adjacent_groups.append(neighbours[:]) + neighbours.clear() + neighbours = [] + return adjacent_groups + + +def get_element_dimension(elem: list[HotCharacter]) -> ElementDimension: + """Get the dimensions of an element based on its coordinates. + + Args: + elem (list): List of coordinates representing an element. + + Returns: + ElementDimension: ElementDimension object containing the dimensions (x0, x1, y0, y1, span_id). + """ + x0 = min(elem, key=lambda item: item.x).x + x1 = max(elem, key=lambda item: item.x_end).x_end + y0 = min(elem, key=lambda item: item.y).y + y1 = max(elem, key=lambda item: item.y).y + span = elem[0].span_id + return ElementDimension(x0=x0, x1=x1, y0=y0, y1=y1, span_id=span) + + +def intersect(bbox1: ElementDimension, bbox2: ElementDimension) -> bool: + """Check if two bounding boxes intersect. + + Args: + bbox1 (ElementDimension): Bounding box 1. (x0, y0, x1, y1) + bbox2 (ElementDimension): Bounding box 2. (x0, y0, x1, y1) + + Returns: + bool: True if the bounding boxes intersect, else False. + """ + return not (bbox2.x0 > bbox1.x1 or bbox2.x1 < bbox1.x0 or bbox2.y0 > bbox1.y1 or bbox2.y1 < bbox1.y0) + + +def to_text(el: list[HotCharacter]) -> str: + """Convert a list of HotCharacter instances to text. + + Args: + el (list): List of HotCharacter instances. + + Returns: + str: The text. + """ + return "".join(char.value for char in el) diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..d13a98c --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,100 @@ +[build-system] +requires = ["setuptools>=61.0"] +build-backend = "setuptools.build_meta:__legacy__" + +[project] +name="hotpdf" +version="0.5.3" +authors = [ + {name = "Krishnasis Mandal", email = "krishnasis@hotmail.com"}] +maintainers = [ + {name = "Alex Ptakhin" , email = "alex.ptakhin@prestatech.com"}, + {name = "Izel Odabasi" , email = "izel.odabasi@prestatech.com"}, + {name = "Mattia Callegari" , email = "callegari.mattia@protonmail.com"}] + +description = "Fast PDF Data Extraction library" +readme = "README.md" +license = {file = "LICENSE"} +requires-python = ">=3.9" +classifiers = [ + "License :: OSI Approved :: MIT License", + "Programming Language :: Python :: 3.13", + "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.9", + "Development Status :: 4 - Beta", + "Intended Audience :: Developers", + "Topic :: Software Development :: Libraries :: Python Modules", + "Topic :: Text Processing :: General", + "Topic :: Text Processing :: Indexing", + "Topic :: Text Processing :: Linguistic", + "Topic :: Utilities", + "Operating System :: OS Independent", +] +keywords = [ + "pdf", + "data extraction", + "text extraction", + "hotpdf", + "pdfminer", + "pdfquery" +] + +dependencies = [ + "pdfminer.six>=20231228", +] + +[tool.setuptools] +include-package-data = false + +[tool.setuptools.packages.find] +include = ["hotpdf*"] +exclude = ["docs*", "tests*"] + +[project.optional-dependencies] +dev = ["pytest", "pytest-cov", "pytest-xdist", "pylint", "mypy", "typing-extensions", "pre-commit", "ruff"] +docs = ["pdfminer.six"] + +[tool.ruff] +indent-width = 4 +line-length = 120 +select = [ + # pycodestyle + "E", "W", + # Pyflakes + "F", + # pyupgrade + "UP", + # flake8-bugbear + "B", + # flake8-simplify + "SIM", + # isort + "I", + # MaccaBe + "C901", + # Pep8-naming + #"N", # TODO: enable +] +fix = true +fixable = ["ALL"] +exclude = ["docs"] +preview = true + +[tool.ruff.mccabe] +max-complexity = 10 + +[tool.mypy] +warn_unused_configs = true +files = "hotpdf" +ignore_missing_imports = true +check_untyped_defs = true +explicit_package_bases = true +warn_unreachable = true +warn_redundant_casts = true +strict = true + +[tool.pytest.ini_options] +log_cli=true +log_level="NOTSET" diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/conftest.py b/tests/conftest.py new file mode 100644 index 0000000..e2392c7 --- /dev/null +++ b/tests/conftest.py @@ -0,0 +1,57 @@ +import pytest + + +@pytest.fixture() +def valid_file_name(): + return "tests/resources/PDF.pdf" + + +@pytest.fixture() +def blank_file_name(): + return "tests/resources/blank.pdf" + + +@pytest.fixture() +def multiple_pages_file_name(): + return "tests/resources/20pages.pdf" + + +@pytest.fixture() +def non_existent_file_name(): + return "non_existent_file.pdf" + + +@pytest.fixture() +def locked_file_name(): + return "tests/resources/PDF_locked.pdf" + + +@pytest.fixture() +def invalid_file_name(): + return "tests/resources/invalid_file.txt" + + +@pytest.fixture() +def bible_file_name(): + return "tests/resources/bible.pdf" + + +@pytest.fixture() +def mock_hotpdf_bank_file_name(): + return "tests/resources/hotpdf_bank.pdf" + + +@pytest.fixture() +def duplicate_span_file_name(): + return "tests/resources/dup_span.pdf" + + +@pytest.fixture +def document_lt_figure_file_name(): + # File sourced from: https://github.com/druskacik/ltfigure-pdfminer + return "tests/resources/doc_lt_figure.pdf" + + +@pytest.fixture() +def variations_simple_file_name(): + return "tests/resources/test_variations_simple.pdf" diff --git a/tests/resources/20pages.pdf b/tests/resources/20pages.pdf new file mode 100644 index 0000000..f455f3e --- /dev/null +++ b/tests/resources/20pages.pdf @@ -0,0 +1,775 @@ + THE HOLY BIBLE + + TRANSLATED FROM THE LATIN VULGATE +DILIGENTLY COMPARED WITH THE HEBREW, GREEK, AND + + OTHER EDITIONS IN DIVERS LANGUAGES + DOUAY-RHEIMS VERSION + 1609, 1582 + 2 + Contents + +I Old Testament 1 + +1 Book of Genesis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 + +2 Book of Exodus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 + +3 Book of Leviticus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119 + +4 Book of Numbers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156 + +5 Book of Deuteronomy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209 + +6 Book of Josue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255 + +7 Book of Judges . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286 + +8 Book of Ruth . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 318 + +9 First Book of Samuel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323 + +10 Second Book of Samuel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 365 + +11 Third Book of Kings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 400 + +12 Fourth Book of Kings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 441 + +13 First Book of Paralipomenon . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 479 + +14 Second Book of Paralipomenon . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 516 + +15 First Book of Esdras . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 560 + +16 Book of Nehemias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 574 + +17 Book of Tobias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 593 + +18 Book of Judith . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 606 + +19 Book of Esther . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 623 + +20 Book of Job . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 639 + +21 Book of Psalms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 675 + +22 Book of Proverbs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 761 + +23 Ecclesiastes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 791 + +24 Book of Wisdom . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 806 + +25 Ecclesiasticus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 826 + +26 Prophecy of Isaias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 883 + +27 Prophecy of Jeremias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 947 + +28 Lamentations of Jeremias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1018 + +29 Prophecy of Baruch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1025 + ii CONTENTS + + 30 Prophecy of Ezechiel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1035 + 31 Prophecy of Daniel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1101 + 32 Prophecy of Osee . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1128 + 33 Prophecy of Joel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1138 + 34 Prophecy of Amos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1142 + 35 Prophecy of Abdias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1150 + 36 Prophecy of Jonas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1152 + 37 Prophecy of Micheas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1155 + 38 Prophecy of Nahum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1161 + 39 Prophecy of Habacuc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1164 + 40 Prophecy of Sophonias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1167 + 41 Prophecy of Aggeus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1170 + 42 Prophecy of Zacharias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1173 + 43 Prophecy of Malachias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1184 + 44 First Book of Machabees . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1188 + 45 Second Book of Machabees . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1229 + +II New Testament 1258 + + 46 The Holy Gospel Of Jesus Christ, According to St. Matthew . . . . . . . . . . . . . 1260 + + 47 The Holy Gospel of Jesus Christ, According to St. Mark . . . . . . . . . . . . . . . . 1302 + + 48 The Holy Gospel of Jesus Christ, According to St. Luke . . . . . . . . . . . . . . . . 1329 + + 49 The Holy Gospel of Jesus Christ, According to St. John . . . . . . . . . . . . . . . . 1374 + + 50 The Acts of the Apostles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1408 + + 51 The Epistle of St. Paul the Apostle to the Romans . . . . . . . . . . . . . . . . . . . 1451 + + 52 The First Epistle of St. Paul to the Corinthians . . . . . . . . . . . . . . . . . . . . 1469 + + 53 The Second Epistle of St. Paul to the Corinthians . . . . . . . . . . . . . . . . . . . 1486 + + 54 The Epistle of St. Paul to the Galatians . . . . . . . . . . . . . . . . . . . . . . . . . 1498 + + 55 The Epistle of St. Paul to the Ephesians . . . . . . . . . . . . . . . . . . . . . . . . . 1504 + + 56 The Epistle of St. Paul to the Philippians . . . . . . . . . . . . . . . . . . . . . . . . 1510 + + 57 The Epistle of St. Paul to the Colossians . . . . . . . . . . . . . . . . . . . . . . . . 1515 + + 58 The First Epistle of St. Paul to the Thessalonians . . . . . . . . . . . . . . . . . . . 1519 + + 59 The Second Epistle of St. Paul to the Thessalonians . . . . . . . . . . . . . . . . . . 1523 + + 60 The First Epistle of St. Paul to Timothy . . . . . . . . . . . . . . . . . . . . . . . . . 1526 + + 61 The Second Epistle of St. Paul to Timothy . . . . . . . . . . . . . . . . . . . . . . . 1531 + + 62 The Epistle of St. Paul to Titus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1535 + + 63 The Epistle of St. Paul to Philemon . . . . . . . . . . . . . . . . . . . . . . . . . . . 1538 + + 64 The Epistle of St. Paul to the Hebrews . . . . . . . . . . . . . . . . . . . . . . . . . . 1540 + + 65 The Catholic Epistle of St. James the Apostle . . . . . . . . . . . . . . . . . . . . . . 1553 + + 66 The First Epistle of St. Peter the Apostle . . . . . . . . . . . . . . . . . . . . . . . . 1558 + CONTENTS iii + +67 The Second Epistle of St. Peter the Apostle . . . . . . . . . . . . . . . . . . . . . . . 1563 +68 The First Epistle of St. John the Apostle . . . . . . . . . . . . . . . . . . . . . . . . 1567 +69 The Second Epistle of St. John the Apostle . . . . . . . . . . . . . . . . . . . . . . . 1572 +70 The Third Epistle of St. John the Apostle . . . . . . . . . . . . . . . . . . . . . . . . 1573 +71 The Catholic Epistle of St. Jude the Apostle . . . . . . . . . . . . . . . . . . . . . . 1574 +72 The Apocalypse of St. John the Apostle . . . . . . . . . . . . . . . . . . . . . . . . . 1576 + iv CONTENTS + Part I + +Old Testament + Book of Genesis + +Chapter 1 12 And the earth brought forth the green + herb, and such as yieldeth seed according to its +In the beginning God created heaven, and earth. kind, and the tree that beareth fruit, having seed + 2 And the earth was void and empty, and each one according to its kind. And God saw + that it was good. +darkness was upon the face of the deep; and the +spirit of God moved over the waters. 13 And the evening and the morning were the + third day. + 3 And God said: Be light made. And light +was made. 14 And God said: Let there be lights made + in the firmament of heaven, to divide the day + 4 And God saw the light that it was good; and and the night, and let them be for signs, and for +he divided the light from the darkness. seasons, and for days and years: + + 5 And he called the light Day, and the dark- 15 To shine in the firmament of heaven, and +ness Night; and there was evening and morning to give light upon the earth, and it was so done. +one day. + 16 And God made two great lights: a greater + 6 And God said: Let there be a firmament light to rule the day; and a lesser light to rule +made amidst the waters: and let it divide the the night: and The stars. +waters from the waters. + 17 And he set them in the firmament of heaven + 7 And god made a firmament, and divided to shine upon the earth. +the waters that were under the firmament, from +those that were above the firmament, and it was 18 And to rule the day and the night, and to +so. divide the light and the darkness. And God saw + that it was good. + 8 And God called the firmament, Heaven; and +the evening and morning were the second day. 19 And the evening and morning were the + fourth day. + 9 God also said; Let the waters that are under +the heaven, be gathered together into one place: 20 God also said: let the waters bring forth +and let the dry land appear. And it was so done. the creeping creature having life, and the fowl + that may fly over the earth under the firmament + 10 And God called the dry land, Earth; and of heaven. +the gathering together of the waters, he called +Seas. And God saw that it was good. 21 And God created the great whales, and + every living and moving creature, which the + 11 And he said: let the earth bring forth green waaters brought forth, according to their kinds, +herb, and such as may seed, and the fruit tree and every winged fowl according to its kind. And +yielding fruit after its kind, which may have seed God saw that it was good. +in itself upon the earth. And it was so done. + 4 Book of Genesis + + 22 And he blessed them, saying: Increase and Chapter 2 +multiply, and fill the waters of the sea: and let +the birds be multiplied upon the earth. So the heavens and the earth were finished, and + all the furniture of them. + 23 And the evening and morning were the fifth +day. 2 And on the seventh day God ended his work + which he had made: and he rested on the seventh + 24 And God said: Let the earth bring forth day from all his work which he had done. +the living creature in its kind, cattle and creeping +things, and beasts of the earth, according to their 3 And he blessed the seventh day, and sancti- +kinds. And it was so done. fied it: because in it he had rested from all his + work which God created and made. + 25 And God made the beasts of the earth +according to their kinds, and cattle, and every 4 These are the generations of the heaven and +thing that creepeth on the earth after its kind. the earth, when they were created, in the day +And God saw that it was good. that the Lord God made the heaven and the + earth: + 26 And he said: Let us make man to our image +and likeness: and let him have dominion over the 5 And every plant of the field before it sprung +fishes of the sea, and the fowls of the air, and the up in the earth, and every herb of the ground +beasts, and the whole earth, and every creeping before it grew: for the Lord God had not rained +creature that moveth upon the earth. upon the earth; and there was not a man to till + the earth. + 27 And God created man to his own image: +to the image of God he created him: male and 6 But a spring rose out of the earth, watering +female he created them. all the surface of the earth. + + 28 And God blessed them, saying: Increase 7 And the Lord God formed man of the slime +and multiply, and fill the earth, and subdue it, of the earth: and breathed into his face the +and rule over the fishes of the sea, and the fowls breath of life, and man became a living soul. +of the air, and all living creatures that move +upon the earth. 8 And the Lord God had planted a paradise of + pleasure from the beginning: wherein he placed + 29 And God said: Behold I have given you man whom he had formed. +every herb bearing seed upon the earth, and all +trees that have in themselves seed of their own 9 And the Lord God brought forth of the +kind, to be your meat: ground all manner of trees, fair to behold, and + pleasant to eat of: the tree of life also in the + 30 And to all beasts of the earth, and to every midst of paradise: and the tree of knowledge of +fowl of the air, and to all that move upon the good and evil. +earth, and wherein there is life, that they may +have to feed upon. And it was so done. 10 And a river went out of the place of plea- + sure to water paradise, which from thence is di- + 31 And God saw all the things that he had vided into four heads. +made, and they were very good. And the evening +and morning were the sixth day. 11 The name of the one is Phison: that is it + which compasseth all the land of Hevilath, where + gold groweth. + + 12 And the gold of that land is very good: + there is found bdellium, and the onyx stone. + Book of Genesis 5 + + 13 And the name of the second river is Gehon: Chapter 3 +the same is it that compasseth all the land of +Ethiopia. Now the serpent was more subtle tha any of the + beasts of the earth which the Lord God had + 14 And the name of the third river is Tigris: made. And he said to the woman: Why hath +the same passeth along by the Assyrians. And God commanded you, that you should not eat +the fourth river is Euphrates. of every tree of paradise? + + 15 And the Lord God took man, and put him 2 And the woman answered him, saying: Of +into the paradise of pleasure, to dress it, and to the fruit of the trees that are in paradise we do +keep it. eat: + + 16 And he commanded him, saying: Of every 3 But of the fruit of the tree which is in the +tree of paradise thou shalt eat: midst of paradise, God hath commanded us that + we should not eat; and that we should not touch + 17 But of the tree of knowledge of good and it, lest perhaps we die. +evil, thou shalt not eat. For in what day soever +thou shalt eat of it, thou shalt die the death. 4 And the serpent said to the woman: No, you + shall not die the death. + 18 And the Lord God said: It is not good for +man to be alone: let us make him a help like 5 For God doth know that in what day soever +unto himself. you shall eat thereof, your eyes shall be opened: + and you shall be as Gods, knowing good and evil. + 19 And the Lord God having formed out of +the ground all the beasts of the earth, and all 6 And the woman saw that the tree was good +the fowls of the air, brought them to Adam to see to eat, and fair to the eyes, and delightful to +what he would call them: for whatsoever Adam behold: and she took of the fruit thereof, and +called any living creature the same is its name. did eat, and gave to her husband, who did eat. + + 20 And Adam called all the beasts by their 7 And the eyes of them both were opened: +names, and all the fowls of the air, and all the and when they perceived themselves to be naked, +cattle of the field: but for Adam there was not they sewed together fig leaves, and made them- +found a helper like himself. selves aprons. + + 21 Then the Lord God cast a deep sleep upon 8 And when they heard the voice of the Lord +Adam: and when he was fast asleep, he took one God walking in paradise at the afternoon air, +of his ribs, and filled up flesh for it. Adam and his wife hid themselves from the face + of the Lord God, amidst the trees of paradise. + 22 And the Lord God built the rib which he +took from Adam into a woman: and brought her 9 And the Lord God called Adam, and said to +to Adam. him: Where art thou? + + 23 And Adam said: This now is bone of my 10 And he said: I heard thy voice in paradise; +bones, and flesh of my flesh; she shall be called and I was afraid, because I was naked, and I hid +woman, because she was taken out of man. myself. + + 24 Wherefore a man shall leave father and 11 And he said to him: And who hath told +mother, and shall cleave to his wife: and they thee that thou wast naked, but that thou hast +shall be two in one flesh. eaten of the tree whereof I commanded thee that + thou shouldst not eat? + 25 And they were both naked: to wit, Adam +and his wife: and were not ashamed. + 6 Book of Genesis + + 12 And Adam said: The woman, whom thou 23 And the Lord God sent him out of the par- +gavest me to be my companion, gave me of the adise of pleasure, to till the earth from which he +tree, and I did eat. was taken. + + 13 And the Lord God said to the woman: Why 24 And he cast out Adam: and placed before +hast thou done this? And she answered: The the paradise of pleasure Cherubims, and a flam- +serpent deceived me, and I did eat. ing sword, turning every way, to keep the way of + the tree of life. + 14 And the Lord God said to the serpent: Be- +cause thou hast done this thing, thou art cursed Chapter 4 +among all cattle, and beasts of the earth: upon +thy breast shalt thou go, and earth shalt thou And Adam knew Eve his wife; who conceived +eat all the days of thy life. and brought forth Cain, saying: I have gotten a + man through God. + 15 I will put enmities between thee and the +woman, and thy seed and her seed: she shall 2 And again she brought forth his brother +cursh thy head, and thou shalt lie in wait for her Abel. And Abel was a shepherd, and Cain a +heel. husbandman. + + 16 To the woman also he said: I will multi- 3 And it came to pass after many days, that +ply thy sorrows, and thy conceptions: in sorrow Cain offered, of the fruits of the earth, gifts to +shalt thou bring forth children, and thou shalt the Lord. +be under thy husband’s power, and he shall have +dominion over thee. 4 Abel also offered of the firstlings of his flock, + and of their fat: and the Lord had respect to + 17 And to Adam he said: Because thou hast Abel, and to his offerings. +hearkened to the voice of thy wife, and hast eaten +of the tree, whereof I commanded thee, that thou 5 But to Cain and his offerings he had no re- +shouldst not eat, cursed is the earth in thy work: spect: and Cain was exceeding angry, and his +with labour and toil shalt thou eat thereof all the countenance fell. +days of thy life. + 6 And the Lord said to him: Why art thou + 18 Thorns and thistles shall it bring forth to angry? and why is thy countenance fallen? +thee, and thou shalt eat the herbs of the earth. + 7 If thou do well, shalt thou not receive? but + 19 In the sweat of thy face shalt thou eat bread if ill, shall not sin forthwith be present at the +till thou return to the earth out of which thou door? but the lust thereof shall be under thee, +wast taken: for dust thou art, and into dust thou and thou shalt have dominion over it. +shalt return. + 8 And Cain said to Abel his brother: Let us go + 20 And Adam called the name of his wife Eve: forth abroad. And when they were in the field, +because she was the mother of all the living. Cain rose up against his brother Abel, and slew + him. + 21 And the Lord God made for Adam and his +wife garments of skins, and clothed them. 9 And the Lord said to Cain: Where is thy + brother Abel? And he answered: I know not: + 22 And he said: Behold Adam is become as am I my brother’s keeper? +one of us, knowing good and evil: now therefore +lest perhaps he put forth his hand and take also 10 And he said to him: What hast thou done? +of the tree of life, and eat, and live for ever. + Book of Genesis 7 + +the voice of thy brother’s blood crieth to me from brass and iron. And the sister of Tubalcain was +the earth. Noema. + + 11 Now therefore cursed shalt thou be upon 23 And Lamech said to his wives Ada and +the earth, which hath opened her mouth and re- Sella: Hear my voice, ye wives of Lamech, hear- +cieved the blood of thy brother at thy hand. ken to my speech: for I have slain a man to the + wounding of myself, and a stripling to my own + 12 When thou shalt till it, it shall not yield bruising. +to thee its fruit: a fugitive and a vagabond shalt +thou be upon the earth. 24 Sevenfold vengeance shall be taken for + Cain: but for Lamech seventy times sevenfold. + 13 And Cain said to the Lord: My iniquity is +greater than that I may deserve pardon. 25 Adam also knew his wife again: and she + brought forth a son, and called his name Seth, + 14 Behold thou dost cast me out this day from saying: God hath given me another seed for +the face of the earth, and from thy face I shall be Abel, whom Cain slew. +hid, and I shall be a vagabond and a fugitive on +the earth: every one therefore that findeth me, 26 But to Seth also was born a son, whom +shall kill me. he called Enos: this man began to call upon the + name of the Lord. + 15 And the Lord said to him: No, it shall +not so be: but whosoever shall kill Cain, shall Chapter 5 +be punished sevenfold. And the Lord set a mark +upon Cain, that whosoever found him should not This is the book of the generation of Adam. In +kill him. the day that God created man, he made him to + the likeness of God. + 16 And Cain went out from the face of the +Lord, and dwelt as a fugitive on the earth at the 2 He created them male and female; and +east side of Eden. blessed them: and called their name Adam, in + the day when they were created. + 17 And Cain knew his wife, and she conceived, +and brought forth Henoch: and he built a city, 3 And Adam lived a hundred and thirty years, +and called the name thereof by the name of his and begot a son to his own image and likeness, +son Henoch. and called his name Seth. + + 18 And Henoch begot Irad, and Irad be- 4 And the days of Adam, after he begot Seth, +got Maviael, and Maviael begot Mathusael, and were eight hundred years: and he begot sons and +Mathusael begot Lamech, daughters. + + 19 Who took two wives: the name of the one 5 And all the time that Adam lived, came to +was Ada, and the name of the other Sella. nine hundred and thirty years, and he died. + + 20 And Ada brought forth Jabel: who was the 6 Seth also lived a hundred and five years, and +father of such as dwell in tents, and of herdsmen. begot Enos. + + 21 And his brother’s name was Jubal: he was 7 And Seth lived after he begot Enos, eight +the father of them that play upon the harp and hundred and seven years, and begot sons and +the organs. daughters. + + 22 Sella also brought forth Tubalcain, who +was a hammerer and artificer in every work of + 8 Book of Genesis + + 8 And all the days of Seth were nine hundred 26 And Mathlusala lived after he begot +and twelve years, and he died. Lamech, seven hundred and eighty-two years, + and begot sons and daughters. + 9 And Enos lived ninety years, and begot +Cainan. 27 And all the days of Mathusala were nine + hundred and sixty-nine years, and he died. + 10 After whose birth he lived eight hundred +and fifteen years, and begot sons and daughters. 28 And Lamech lived a hundred and eighty- + two years, and begot a son. + 11 And all the days of Enos were nine hundred +and five years, and he died. 29 And he called his name Noe, saying: + This same shall comfort us from the works and + 12 And Cainan lived seventy years, and begot labours of our hands on the earth, which the +Malaleel. Lord hath cursed. + + 13 And Cainan lived after he begot Malaleel, 30 And Lamech lived after he begot Noe, five +eight hundred and forty years, and begot sons hundred and ninety-five years, and begot sons +and daughters. and daughters. + + 14 And all the days of Cainan were nine hun- 31 And all the days of Lamech came to seven +dred and ten years, and he died. hundred and seventy-seven years, and he died. + And Noe, when he was five hundred years old, + 15 And Malaleel lived sixty-five years and be- begot Sem, Cham, and Japheth. +got Jared. + Chapter 6 + 16 And Malaleel lived after he begot Jared, +eight hundred and thirty years, and begot sons And after that men began to be multiplied upon +and daughters. the earth, and daughters were born to them, + + 17 And all the days of Malaleel were eight 2 The sons of God seeing the daughters of +hundred and ninety-five years, and he died. men, that they were fair, took to themselves + wives of all which they chose. + 18 And Jared lived a hundred and sixty-two +years, and begot Henoch. 3 And God said: My spirit shall not remain + in man for ever, because he is flesh, and his days + 19 And Jared lived after he begot Henoch, shall be a hundred and twenty years. +eight hundred years, and begot sons and daugh- +ters. 4 Now giants were upon the earth in those + days. For after the sons of God went in to the + 20 And all the days of Jared were nine hun- daughters of men, and they brought forth chil- +dred and sixty-two years, and he died. dren, these are the mighty men of old, men of + renown. + 21 And Henoch lived sixty-five years, and be- +got Mathusala. 5 And God seeing that the wickedness of men + was great on the earth, and that all the thought + 22 And Henoch walked with God: and lived of their heart was bent upon evil at all times, +after he begot Mathusala, three hundred years, +and begot sons and daughters. 6 It repented him that he had made man on + the earth. And being touched inwardly with sor- + 23 And all the days of Henoch were three hun- +dred and sixty-five years. + + 24 And he walked with God, and was seen no +more: because God took him. + + 25 And Mathusala lived a hundred and eighty- +seven years, and begot Lamech. + Book of Genesis 9 + +row of heart, sons, and thy wife, and the wives of thy sons + 7 He said: I will destroy man, whom I have with thee. + +created, from the face of the earth, from man 19 And of every living creature of all flesh, +even to beasts, from the creeping thing even to thou shalt bring two of a sort into the ark, that +the fowls of the air, for it repenteth me that I they may live with thee: of the male sex, and +have made them. the female. + + 8 But Noe found grace before the Lord. 20 Of fowls according to their kind, and of + 9 These are the generations of Noe: Noe was beasts in their kind, and of every thing that +a just and perfect man in his generations, he creepeth on the earth according to its kind: two +walked with God. of every sort shall go in with thee, that they may + 10 And he begot three sons, Sem, Cham, and live. +Japheth. + 11 And the earth was corrupted before God, 21 Thou shalt take unto thee of all food that +and was filled with iniquity. may be eaten, and thou shalt lay it up with thee: + 12 And when God had seen that the earth and it shall be food for thee and them. +was corrupted (for all flesh had corrupted its way +upon the earth), 22 And Noe did all things which God com- + 13 He said to Noe: The end of all flesh is manded him. +come before me, the earth is filled with iniquity +through them, and I will destroy them with the Chapter 7 +earth. + 14 Make thee an ark of timber planks: thou And the Lord said to him: Go in, thou and all +shalt make little rooms in the ark, and thou shalt thy house, into the ark: for thee I have seen just +pitch it within and without. before me in this generation. + 15 And thus shalt thou make it. The length +of the ark shall be three hundred cubits: the 2 Of all clean beasts take seven and seven, the +breadth of it fifty cubits, and the height of it male and the female. +thirty cubits. + 16 Thou shalt make a window in the ark, and 3 But of the beasts that are unclean two and +in a cubit shalt thou finish the top of it: and the two, the male and the female. Of the fowls also +door of the ark thou shalt set in the side: with of the air seven and seven, the male and the fe- +lower, middle chambers, and third stories shalt male: that seed may be saved upon the face of +thou make it. the whole earth. + 17 Behold, I will bring the waters of a great +flood upon the earth, to destroy all flesh, wherein 4 For yet a while, and after seven days, I will +is the breath of life under heaven. All things that rain upon the earth forty days and forty nights: +are in the earth shall be consumed. and I will destroy every substance that I have + 18 And I will establish my covenant with thee, made, from the face of the earth. +and thou shalt enter into the ark, thou and thy + 5 And Noe did all things which the Lord had + commanded him. + + 6 And he was six hundred years old, when the + waters of the flood overflowed the earth. + + 7 And Noe went in and his sons, his wife and + the wives of his sons with him into the ark, be- + 10 Book of Genesis + +cause of the waters of the flood. 20 The water was fifteen cubits higher than + 8 And of beasts clean and unclean, and of the mountains which it covered. + +fowls, and of every thing that moveth upon the 21 And all flesh was destroyed that moved +earth, upon the earth, both of fowl and of cattle, and + of beasts, and of all creeping things that creep + 9 Two and two went in to Noe into the ark, upon the earth: and all men. +male and female, as the Lord had commanded +Noe. 22 And all things wherein there is the breath + of life on the earth, died. + 10 And after the seven days were passed, the +waters of the flood overflowed the earth. 23 And he destroyed all the substance that + was upon the earth, from man even to beast, + 11 In the six hundredth year of the life of Noe, and the creeping things and fowls of the air: and +in the second month, in the seventeenth day of they were destroyed from the earth: and Noe +the month, all the fountains of the great deep only remained, and they that were with him in +were broken up, and the floodgates of heaven the ark. +were opened: + 24 And the waters prevailed upon the earth a + 12 And the rain fell upon the earth forty days hundred and fifty days. +and forty nights. + Chapter 8 + 13 In the selfsame day Noe, and Sem, and +Cham, and Japheth, his sons: his wife, and the And God remembered Noe, and all the living +three wives of his sons with them, went into the creatures, and all the cattle which were with him +ark. in the ark, and brought a wind upon the earth, + and the waters were abated: + 14 They and every beast according to its kind, +and all the cattle in their kind, and every thing 2 The fountains also of the deep, and the +that moveth upon the earth, according to its floodgates of heaven, were shut up, and the rain +kind, and every fowl according to its kind, all from heaven was restrained. +birds, and all that fly, + 3 And the waters returned from off the earth + 15 Went in to Noe into the ark, two and two going and coming: and they began to be abated +of all flesh, wherein was the breath of life. after a hundred and fifty days. + + 16 And they that went in, went in male and 4 And the ark rested in the seventh month, +female of all flesh, as God had commanded him: the seven and twentieth day of the month, upon +and the Lord shut him in on the outside. the mountains of Armenia. + + 17 And the flood was forty days upon the 5 And the waters were going and decreasing +earth: and the waters increased, and lifted up until the tenth month: for in the tenth month, +the ark on high from the earth. the first day of the month, the tops of the moun- + tains appeared. + 18 For they overflowed exceedingly: and filled +all on the face of the earth: and the ark was 6 And after that forty days were passed, Noe +carried upon the waters. opening the window of the ark, which he had + made, sent forth a raven: + 19 And the waters prevailed beyond measure +upon the earth: and all the high mountains un- +der the whole heaven were covered. + Book of Genesis 11 + + 7 Which went forth and did not return, till the 20 And Noe built an altar unto the Lord: and +waters were dried up upon the earth. taking of all cattle and fowls that were clean, + offered holocausts upon the altar. + 8 He sent forth also a dove after him, to see if +the waters had now ceased upon the face of the 21 And the Lord smelled a sweet savour, and +earth. said: I will no more curse the earth for the sake of + man: for the imagination and thought of man’s + 9 But she not finding where her foot might heart are prone to evil from his youth: therefore +rest, returned to him into the ark: for the waters I will no more destroy every living soul as I have +were upon the whole earth: and he put forth his done. +hand, and caught her, and brought her into the +ark. 22 All the days of the earth, seedtime and har- + vest, cold and heat, summer and winter, night + 10 And having waited yet seven other days, and day, shall not cease. +he again sent forth the dove out of the ark. + Chapter 9 + 11 And she came to him in the evening carry- +ing a bough of an olive tree, with green leaves, in And God blessed Noe and his sons. And he +her mouth. Noe therefore understood that the said to them: Increase, and multiply, and fill the +waters were ceased upon the earth. earth. + + 12 And he stayed yet other seven days: and 2 And let the fear and dread of you be upon +he sent forth the dove, which returned not any all the beasts of the earth, and upon all the fowls +more unto him. of the air, and all that move upon the earth: all + the fishes of the sea are delivered into your hand. + 13 Therefore in the six hundredth and first +year, the first month, the first day of the month, 3 And every thing that moveth, and liveth +the waters were lessened upon the earth, and shall be meat for you: even as the green herbs +Noe opening the covering of the ark, looked, and have I delivered them all to you: +saw that the face of the earth was dried. + 4 Saving that flesh with blood you shall not + 14 In the second month, the seven and twen- eat. +tieth day of the month, the earth was dried. + 5 For I will require the blood of your lives at + 15 And God spoke to Noe, saying: the hand of every beast, and at the hand of man, + 16 Go out of the ark, thou and thy wife, thy at the hand of every man, and of his brother, will +sons and the wives of thy sons with thee. I require the life of man. + 17 All living things that are with thee of all +flesh, as well in fowls as in beasts, and all creep- 6 Whosoever shall shed man’s blood, his blood +ing things that creep upon the earth, bring out shall be shed: for man was made to the image of +with thee, and go ye upon the earth: increase God. +and multiply upon it. + 18 So Noe went out, he and his sons: his wife, 7 But increase you and multiply, and go upon +and the wives of his sons with him. the earth and fill it. + 19 And all living things, and cattle, and creep- +ing things that creep upon the earth, according 8 Thus also said God to Noe, and to his sons +to their kinds went out of the ark. with him: + 12 Book of Genesis + + 9 Behold I will establish my covenant with 22 Which when Cham the father of Chanaan +you, and with your seed after you: had seen, to wit, that his father’s nakedness was + uncovered, he told it to his two brethren without. + 10 And with every living soul that is with you, +as well in all birds, as in cattle and beasts of the 23 But Sem and Japheth put a cloak upon +earth, that are come forth out of the ark, and in their shoulders, and going backward, covered the +all the beasts of the earth. nakedness of their father: and their faces were + turned away, and they saw not their father’s + 11 I will establish my covenant with you, and nakedness. +all flesh shall be no more destroyed with the wa- +ters of a flood, neither shall there be from hence- 24 And Noe awaking from the wine, when he +forth a flood to waste the earth. had learned what his younger son had done to + him, + 12 And God said: This is the sign of the +covenant which I give between me and you, and 25 He said: Cursed be Chanaan, a servant of +to every living soul that is with you, for perpet- servants shall he be unto his brethren. +ual generations. + 26 And he said: Blessed be the Lord God of + 13 I will set my bow in the clouds, and it shall Sem, be Chanaan his servant. +be the sign of a covenant between me and be- +tween the earth. 27 May God enlarge Japheth, and may he + dwell in the tents of Sem, and Chanaan be his + 14 And when I shall cover the sky with clouds, servant. +my bow shall appear in the clouds: + 28 And Noe lived after the flood three hun- + 15 And I will remember my covenant with dred and fifty years. +you, and with every living soul that beareth +flesh: and there shall no more be waters of a 29 And all his days were in the whole nine +flood to destroy all flesh. hundred and fifty years: and he died. + + 16 And the bow shall be in the clouds, and I Chapter 10 +shall see it, and shall remember the everlasting +covenant, that was made between God and every These are the generations of the sons of Noe: +living soul of all flesh which is upon the earth. Sem, Cham, and Japheth: and unto them sons + were born after the flood. + 17 And God said to Noe: This shall be the +sign of the covenant, which I have established, 2 The sons of Japheth: Gomer, and Magog, +between me and all flesh upon the earth. and Madai, and Javan, and Thubal, and Mosoch, + and Thiras. + 18 And the sons of Noe, who came out of the +ark, were Sem, Cham, and Japheth: and Cham 3 And the sons of Gomer: Ascenez and +is the father of Chanaan. Riphath and Thogorma. + + 19 These three are the sons of Noe: and from 4 And the sons of Javan: Elisa and Tharsis, +these was all mankind spread over the whole Cetthim and Dodanim. +earth. + 5 By these were divided the islands of the Gen- + 20 And Noe a husbandman began to till the tiles in their lands, every one according to his +ground, and planted a vineyard. tongue and their families in their nations. + + 21 And drinking of the wine was made drunk, +and was uncovered in his tent. + Book of Genesis 13 + + 6 And the Sons of Cham: Chus, and Mesram, 22 The sons of Sem: Elam and Assur, and +and Phuth, and Chanaan. Arphaxad, and Lud, and Aram. + + 7 And the sons of Chus: Saba, and Hevila, 23 The sons of Aram: Us, and Hull, and +and Sabatha, and Regma, and Sabatacha. The Gether; and Mes. +sons of Regma: Saba, and Dadan. + 24 But Arphaxad begot Sale, of whom was + 8 Now Chus begot Nemrod: he began to be born Heber. +mighty on the earth. + 25 And to Heber were born two sons: the + 9 And he was a stout hunter before the Lord. name of the one was Phaleg, because in his days +Hence came a proverb: Even as Nemrod the was the earth divided: and his brother’s name +stout hunter before the Lord. Jectan. + + 10 And the beginning of his kingdom was 26 Which Jectan begot Elmodad, and Saleph, +Babylon, and Arach, and Achad, and Chalanne and Asarmoth, Jare, +in the land of Sennaar. + 27 And Aduram, and Uzal, and Decla, + 11 Out of that land came forth Assur, and 28 And Ebal, and Abimael, Saba, +built Ninive, and the streets of the city, and 29 And Ophir, and Hevila, and Jobab. All +Chale. these were the sons of Jectan. + 30 And their dwelling was from Messa as we + 12 Resen also between Ninive and Chale: this go on as far as Sephar, a mountain in the east. +is the great city. 31 These are the children of Sem according + to their kindreds and tongues, and countries in + 13 And Mesraim begot Ludim, and Anamim their nations. +and Laabim, Nephthuim. 32 These are the families of Noe, according + to their people and nations. By these were the + 14 And Phetrusim, and Chasluim; of whom nations divided on the earth after the flood. +came forth the Philistines, and the Capthorim. + Chapter 11 + 15 And Chanaan begot Sidon his firstborn, +the Hethite, And the earth was of one tongue, and of the same + speech. + 16 And the Jebusite, and the Amorrhite, and +the Gergesite. 2 And when they removed from the east, they + found a plain in the land of Sennaar, and dwelt + 17 The Hevite and Aracite: the Sinite, in it. + 18 And the Aradian, the Samarite, and the +Hamathite: and afterwards the families of the 3 And each one said to his neighbour: Come +Chanaanites were spread abroad. let us make brick, and bake them with fire. And + 19 And the limits of Chanaan were from Sidon they had brick instead of stones, and slime in- +as one comes to Gerara even to Gaza, until thou stead of mortar: +enter Sodom and Gomorrha, and Adama, and +Seboim even to Lesa. 4 And they said: Come, let us make a city and + 20 These are the children of Cham in their kin- a tower, the top whereof may reach to heaven; +dreds and tongues, and generations, and lands, +and nations. + 21 Of Sem also the father of all the children of +Heber, the elder brother of Japheth, sons were +born. + 14 Book of Genesis + +and let us make our name famous before we be daughters. +scattered abroad into all lands. 18 Phaleg also lived thirty years, and begot + + 5 And the Lord came down to see the city Reu. +and the tower, which the children of Adam were 19 And Phaleg lived after he begot Reu, two +building. + hundred and nine years, and begot sons and + 6 And he said: Behold, it is one people, and all daughters. +have one tongue: and they have begun to do this, +neither will they leave off from their designs, till 20 And Reu lived thirty-two years, and begot +they accomplish them in deed. Sarug. + + 7 Come ye, therefore, let us go down, and 21 And Reu lived after he begot Sarug, two +there confound their tongue, that they may not hundred and seven years, and begot sons and +understand one another’s speech. daughters. + + 8 And so the Lord scattered them from that 22 And Sarug lived thirty years, and begot +place into all lands, and they ceased to build the Nachor. +city. + 23 And Sarug lived after he begot Nachor, two + 9 And therefore the name thereof was called hundred years, and begot sons and daughters. +Babel, because there the language of the whole +earth was confounded: and from thence the Lord 24 And Nachor lived nine and twenty years, +scattered them abroad upon the face of all coun- and begot Thare. +tries. + 25 And Nachor lived after he begot Thare, a + 10 These are the generations of Sem: Sem was hundred and nineteen years, and begot sons and +a hundred years old when he begot Arphaxad, daughters. +two years after the flood. + 26 And Thare lived seventy years, and begot + 11 And Sem lived after he begot Arphaxad, Abram, and Nachor, and Aran. +five hundred years, and begot sons and daugh- +ters. 27 And these are the generations of Thare: + Thare begot Abram, Nachor, and Aran. And + 12 And Arphaxad lived thirty-five years, and Aran begot Lot. +begot Sale. + 28 And Aran died before Thare his father, in + 13 And Arphaxad lived after he begot Sale, the land of his nativity in Ur of the Chaldees. +three hundred and three years, and begot sons +and daughters. 29 And Abram and Nachor married wives: the + name of Abram’s wife was Sarai: and the name + 14 Sale also lived thirty years, and begot of Nachor’s wife, Melcha, the daughter of Aran, +Heber. father of Melcha and father of Jescha. + + 15 And Sale lived after he begot Heber, four 30 And Sarai was barren, and had no children. +hundred and three years: and begot sons and 31 And Thare took Abram his son, and Lot +daughters. the son of Aran, his son’s son, and Sarai his + daughter in law, the wife of Abram his son, and + 16 And Heber lived thirty-four years, and be- brought them out of Ur of the Chaldees, to go +got Phaleg. into the land of Chanaan: and they came as far + as Haran, and dwelt there. + 17 And Heber lived after he begot Phaleg, four 32 And the days of Thare were two hundred +hundred and thirty years: and begot sons and and five years, and he died in Haran. + diff --git a/tests/resources/PDF.pdf b/tests/resources/PDF.pdf new file mode 100644 index 0000000..6e689e4 --- /dev/null +++ b/tests/resources/PDF.pdf @@ -0,0 +1,27 @@ +PDF HOTPDF + + THE BEST PDF PARSING LIBRARY TO EVER EXIST(DEBATABLE) + +NAME EXPERIENCE + +Hotpdf PARSER • PRESTATECH • 05/12/2023-PRESENT + Trying to parse pdfs without failing. <<<> +endobj +2 0 obj +<> +endobj +3 0 obj +<>stream +)#l֮RIyT3ğ 9 "c{Cv%IZ[R؟!"໙~͋m9Et6=D2di0wC{غuߙi5c0ReA]1YdV@\2KX{^rQ tymou\~ѰQEl/+@^]ࠨIjRSnIj +ZaumCzYGr-#Ls8qfhB}pySnwbK!P}bG߾4tU1"0lCի̣⣌}rgF׍a\x#x  4= "XĆ5Δ*M 3JXPtbD?7YNeh#y%eء#V y{*sۧ=TY=Υ9ߺm1D_}$>};K>$6̸H&IُܡDܤD]pEY@b3y^Uu{$@Gka_F&(/+2jJ׹A)xoږY [*(qu'>Fsss:Y,N"P [SNwZi"<#Cd} Y@wu@ߴ!,#]訠ȉe^zsJ[;JUpxG EcUY^m"԰d ,  F*\vH/+39Z~}֓LW0|DJ JLi^W1~t]V=N:egGsV7v)gj]]cc*úXUY랏6yoBRO_ 0*ؾ9 +ZaQW:ּkFZI  A..a Z>vIö݋s:.C?t8hުҺ綎{[a"{پ48JH01UM1\&8*_Ca$O j?N̗m6MZ?@hzoJP=ay .*#㾬dQȎg"&*))lmԎ_j5A{5AG}ƏBPݯ"gI0: q1`jB{ܗ%FQ2Th.;tT*l]HJW#x)MWV%6Ro.dZ tȧS~SVYsraR3뀍>mMG)3pVFĨ!69,Y2}TΜ, 5+5Y QiI N-O jF+fVJd2cn.'wpe2wMl*Gs:pp[ z|;\O_YzV t>2ﴕ{/bl*\%qRdҋqџn^̣vDDHP(+({vG׷O`?*xaJ7 BzP36toeg<)"p_b8MZ$HqGDB-9UpS<+&fbt[r-*;a;/_Npy7->*Ŝf>4/h݃s׽/|RlW>['Mt?k >Y%鞟jҟRS}_4"VNJ)Y20QA:<0Ȳ{ҋ]ܰڒyJΖbUe'LᓫgؓZ`[5.IUj?lρr^0TΛ@!`wB5/q)N]#Bo* 9`,?Ӈ<(OXoZoVM?7 u2"S;oɏThJ\Gabb"m ϧI[ȰR]~q2-{<+xLIIϿJ< + ]Qi2 +Ǐ qvͳg8H;0y>W{"¶I4c5EULj~OUwLX +!e5<^AHH[;!WTf#uRd,?6r{hcvHGiqm L72c)0&#`,'#޴%9ܪ(ʾX˹Tꑒ)$\ˢY%xHA@Ȳ$_8h3ٰ510bQ}*qG^l_ K+ummH @-RyOS`z|Xecp4Le;SmLV[(εiwL.c-m5]p}gJ(S~2ԩήȜÉ{߆*0ͯ/B*׊& l%6 +_Yů!,A}=py z #ƕ#q*.¨ςOF[v8޼SΒ +(7Q=ެ`2. fubFl⺼=gS num37a :>ɧ!1a^]qҖ_v9<{"kCW&~ȍ8k 4[ O ȓ"Ҭx(_ #v70 +9 9JX(~V= ߒ)1Z7I]6^ Vj(vuʨ]8r$^?A Mvej; b(7qA[n[e}~$$3t6oOGPTL-4B@,|L.!$sh e=wTt*yS_FKŸ'$2ߏ̮Ye'r +*3 |hxo1tN{ mp-;W:(Wc~HFB ϥuߡRm lSi$i1MI!(3[ +BO(Tv\籫M zELЀ"SKDuNE;t}%HǕO;fI$(J滜oW[eZ YJE-{FnK5k-c +N82) b/)(|EE +L8ib5h;,K9%{8x5h/oj;3@M +/dZu/ +wI DA3|jĤK-Xz\H""۠$qgTb FXK){?\ҼD I5J +yLs3~YZc12Y|BRDկ{֋%\6!gxi{@gcZS٫I?fw2 ,xH$i6usHp6,6k"w31ẍ́S_evɚT@ += 3#͂>|xjI0.w%>rmp] HO['h#LkMYASl̐\5Θ4RǵMDI)*i*f(z 'kTtoM[EMaϳoV0i>@Դ7޶-j٩k %|ڶI/#9`zFeg!m@M)?,v+J  kcY?*^J0oo/nxs$dn8#n8/3d%-|+2׊O Xg@r +1FGfHWFj?\aʱR@`%v]^G~=ƨ)v7.&Ƣe3Q/ѲYsƜ"F mHP.=2h2Ua}Rf8ms~ [n B)Ԇl'sk s_iؐ c\Nvη" :|#OH^šrX,ݞ82o[ҁs^=Gtz%::ci!sHt#@[_"Aw"U;#,!lIed.o6}:GXۭ%ӯ7oj@Ap'uSrkXb A@ +rUڴ )Ie ~3&f\9K +Cvj.@>7hvd4bNt<J*PA~R +yKbş<2@ 2 ώX.%>L{̝DuBI*A+;.$}aDP4.(DKB.SLY)pe Z$g $ҵh]*t起uU׳V;_W"7KQ}J(y4i}>!zkNI5=Vh!QspF;n$Mf [7-D1O%L(:t5){j''Nm,{\dGtlE,;p56oƾjTɐۮW5>: +{3@{*NFGLI#s>jd7dLkghN + .[u;%h ^Ξ bPrlDi$EǍp囃@e;eo!}T;Ӗ~~n($42rq7ȑm_|.Vo!o/MNwWx;_rj]lB؈NiiꅏI`[]EkiQ>ĈzᄒV" ,HIإ7%|3ÃG^EŹl^q%`˛u@]Mq?fR I (;EOT͗v-\[nyR7b6аm() ;d<)ć͸Σ_geQ+1.8&j KA";ªSZ?^BB\vC #;5}텂 +c 8qZU4/9_9[ħvV=" +w6 "Pj)>CUe)%Rď͒K.ΑHDa& ffz0c=2!{@ԡ>[Kd%m""VbG1Sݘʭ׈'udu)9m՘,w@ר W9eECbҝ.:^#U1=gOWOKq7b9ki †6*sh 5OMjy{?\\AkO|S?WUX +!x80!%}U=PBo͕YbOr\WkiFŵWV8ƾ 8RS HXFs(: +3kNzդ.oʼ~.<ۍu[zT{ԭ/ܯKu6〬Zi#Tޠ!L1"i-u˯>Ֆ]_:ڲLٖ!uZBKl:xVosnkh|Uty_sL@Sزah%gp\׬w!^Pt&p~Ďk$Z}B9rm?'mINo[$qZ)c2.6>` L[wj"C5?!6r)gSIAXv7 [#xk[hseX=3} #Vɯ_ Ռ7a}>jWgiM@Gтp)nS˃&v?.db߯< HXD6vrbE:\; `(HxI2Û+jFy)%V"Q,wj,ik\> /iR#%ͺ :Xr8Ԫi;Z'q@BIS6;;7Co΢ZP%axq/Z +TXfhSneo}[<&l~e5* p" R.We"G(+6semU`awbSӦd77"VSC%/$>7aTU8 n SGXJRhXGN7˶qyR)HMJ|/05)ydtsȟz#l=7tФM?+'~s5PҬόbYZ"HI@KbOZ[&Uͽ$x +@@ZQ>U3 &Ƣ* +a.+)JB&WsvkwwHdK9X<2_waIrHX* t". +z0DXQMaKF4c[+IO0`FnT) S.!V452=>{B̓V\2JwAr,1qޅp.DE=̊VR!Ӈݔ } +)` JPu'S֛KX|Q)aK9\bU}l ;- xc"'NPȀ'/=tc׍euh!ag`0aDپ{m"*o0$ :> (Xo9C>8YgvW͛y~td*AyEndKy%@&_k[@)sb&_eA.qCi.8^8݊BTsݢۦ@+ 45Ni#8> 44O*bASc'._W/^3N[!0iPeE.T]]gVNՆ%qoڮSd"ӧbܽL2;Õ>.HT-uLi酅G8U> Z&h֋` &V՜(Vo_r@h![Lz7`g3#mglB%+AHz1{̼2\T"0}cm㛸 Kc@1pH#9 Ҥ-TX'P\J'WEVUގ4ލv,tIV[_dI%}_>{J,eV?Н_|`cUoI;8bWl/KFW2ד\ܺO:%X@~7 )\1> +(xsMnj&`AN97!#y62 06A0@vL9׸E2ǫݺ|] IMښv.\}v/ƟaH[`XWu0NF J^`aT ט qhg5,鲰t00_$NzivdUWpd{%$, &1D8*TɸөqN Fڍ?'3O[Q'T[;V3z;Isڅr-H # DNpLJh3%z{ʦfj#(a\K{?b7᪭"\^`K5pPg}95bĪ=i] +~joL%&ܳG46/0\xVt$#=kUA׃$C\ ? c iB +*a}_O)Zf:075)e;B9Y!GI6{f$>Mȼ0wPNkGF9;y<`-"N@\ }m4m3`1[ex\%i5u7KЁpygתeWдQϙBYVj!ivLjWUEbф.rJٗ\DY6 }6`ޜ]^=T.t^J^ghZ=3kIҏB_ +eѕ繝(HAU+$tl*_>)/x&s@ a2sߨч2VxV)ІzrIa0sfDEui,g2fNg+ ﶣBqSf3fnluH0abw0jhTŔyCN]T-@b%/}PtBZVkZpL~nl—kΏ r@Uhݲ;S$nNqRuګ%;vd͠9YV*zm,PVmbGߎ1GxQUX0g +x$<8"evW2H: ꌩ~Y i9լvJvӀ?Y,uN]PGKɦ.֬ v:nLIB5>"pN'' |F|ejs 2Hѝsz<ث-B`N+egNv#4s5뇔Gxv`a~\+|d60٠Õ~Zޤmk lrDCbKT_@@h'mz!=U +͏qp5&v(@Tl .^/7zbJ@ia~I(6@lF*Ö^ľ*:afb 7L{18y t` #f6w6޺S$Y$UѾJ5iHcRe6I4ն\gn)o9sef2{ kGYy1մT`\P94w\sM7H œ5z/FA{):ʬHSʝ#Yq:P@~'(H +endstream +endobj +4 0 obj +<>/ExtGState<>/Font<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI]/XObject<>>> +endobj +5 0 obj +[/ICCBased 222 0 R] +endobj +6 0 obj +<> +endobj +7 0 obj +<> +endobj +8 0 obj +<> +endobj +9 0 obj +<> +endobj +10 0 obj +<> +endobj +11 0 obj +<>stream +< >$^ Gre6b)2qVrH W/Nz*^,%gLucB: +ӂ-oiZ'ݽ l-AQf* BBprս[FX(a7(VqӋ16tżNT&Yܩ 9q\T'_>y* jm@f + J$v'd} +r.ƛ֥1F1s:vgЂy.$^g{"Z^g:e {Fm+kbySD35[})X ?d kyn}\~~*ﶏh*p2#]=Oq^ )&in*{=yԋ2[`V +^-ɋ+DJDCGLu* `fQ0mQKʫohaoFs1)k(ux;?w)apE6%‹#X~9n@r-Z 'Lj(%HFa] ݥ˃=nL7qtq wʼnak:axÑ%EvG(ULؤzߍzŻ:-Ɏ(T (õ(:懏qD.몪zl[wx <ivkyokO_46b}a?T4;3 E-6 \VqmzܘY 1^."C]Y旬]o`\YyRlTm7*Ut{d  sdx;/I'#ڛAra,0 ʑwt”(ja#Ely!g%KoN" I_DE֎م%I,u?;#%Y`ȷF\$LPt;ς0wDUnHI;) -CyHv7JL}f Yg/+ݚ!N !{f1~OmYW)G>2gdC +7TE'C6b'vӕ &mdyEzW]ݯ. Rg;;=@N>mƷ2ӨoO ^'nYrIK*5hr;2m"Om`Qۈ&C7mfEn<v {Dl\S٬!KhtU$Dܾ=[bE0'Z:u2LQ1iuO\.f4A&'3/) + 9G{$7$m&?i=6@sI K2e-'V]{7fM `*S7;Dqlڲj> -yE(E|zx#noH8 X;A8* X\ݡ0B'f,Q 2tQ3sVBI 'x^59)q[zJ\TfmRMQ*|LՃBoV%谆\ K % 8uDEBFDG*4pTR 4q}dKzOVݦ1Rs wB D + {G%>y*qӋ 0xτ i̵ݙ,$BO QH_ ML=pp/0)=Rk}=\1I[ |?sx;y}ʢ0/ ~eÛ8U<{UF!g2] gY([3uu$,i$Wa̓!|:ȡ:`vP3tBfe JOűfau]΍(H'^A2H6,¼ Ûj8xL3;ԃ$*+5q1(+{4wm*"axfقMZB<ڍOӱffA Ik%Q'\ ryOн!X=C)G0"JGml7V, kh}UP|썌IPm sŋĿMԉ!'2F ݰ"ber^O|H1"ȊB`6%8^[|0`=C91t њ3dԯ64l[Ԗ>jaI3%zu%R {Ps1*jN?(u$5b#+p˨!՝PcQc)ró4%px44`=7$ͲNSU'zRό]_~(m(XVwᱎd4{~ֈ2Of(psiM\)SUmu?.F@,<1:\g5F!H4ڻA99ԩDZ]A~O%!VxxQc]RBotITBIl+bqw?)18Ձ* +3t>xQWm+ՙ%0ydZ6 +Uf"? :v} $# wsɖi3#_%Q<2LċUH=]=X0qp8_^Dؿ-`&5 3A~Qށ1TH@T ,{=gd³n>22KO8O"ۨ6NprlS<>@˧Ii=z9g=_Ў?H5&ZtqYl۬re9;?c>^)7p~zqT|[gkĻni/T۬)pڎ?P{j87B&o'8\S_ɔcUٞ׵.K8h!V/U|q7_=2ؼACmcrx]{=vs !EgŞ"k(WnXoc>Xղ]Tͩ C # w2U"E1X/u?0"p 8O$=&ee X+vbtLiYkxn:6'>_Ǯ 8`ETp5!i@؛ (D[0N FѾۇ 'M_H~fL5[Um';ӈ9jb,>"݃So|2ûeӮU2b7t)w(h@V= +@3N>ZUZz~x9+|H2cԡ 'poXY =h#)ؿ/u?;tZ p,5{w"" -|E, –PP]O~Af\GYn״EC`5`zp*gGBrכ&2?pr8?+rp\ D9$ 0AO$}\I7Sax'rvlqXTK/cWO9OP}ՔD[5(߲e 2Z>9smir;[w0n|?BQr9 }QFx4lK`VGi,e?2+5Sk?*5*LwTvu$[Ve9+_BBdLl@t1`k`!ծa#Ch6TR4$!WU6F!.XFߥ`]tA?=qnͲmPEQg.DI f2/ ++S+ Y f-`o^W fKl ՒA[ݻ.i:`cd~۷apNUl?u\`y{|-J{%*~q)L + +*+++mrr-\46QlYj+o1^'9k3^=SeS +f+Mu9ȒE!@9!K'h9gB\5z$(BHmec+L~SySMg'f'} a*TQ"@A[Ƒ{ +t|k#2&Eo%kAӈAt30EL{l7q" F"#*.sV@2_eR4M@rbݫL8i_&C0jSۙ c1y0h9bזMs!,VX>E6`XAmd,Ep-{D-v 05Uԭ3Kc[R:\_%s8.>q?S-A v]2ܝQ{1h .xcRq)fg 0sE&ӷRU %h`ßͱ,GOEI,U^cL[gLRt[3_!bT<-nc*YHʙ|xO^!\>,~~L%-T% ܫP5bb-h~)s6CE}@Dg +DxN66Gݵ4ff3?.peוּvYAL?^ގw|g@ʊMeX<#/?k:fg?'u8V`mʯX/=^oIN)}27qw'(%iѽ"bbģ?E v:. >[2+)QɅf<6UȆz2YwTvR2M7!id~pЧDAz]1 ѵ#&TyZ3[;ظ;pfr:*`a:ۤjYgl1c%r p;']u)>(wݏ|%f[ HnPb/q G/AόhM-xu?#-h} N]>"+!PVӫ8n%/yk7H3f۵q5?24݆w>nɴbXEb/ TT+'`~wxzhes_a g2L. `dOɵ"h^U~;/ʲ'OIN/"n/<}n=vp2Ss@' ewW왴İC& &rOU?0xml;;V<҅Er#p;y +ŎJT _v?M${=P0Z<3fxm AiYb-C.D<v@甬Y:O} U˜I{gپL=Bg>ΓQ~1}R[-An$, 8QnZjZA0~صѝّ^`2oФ_N|r>8O!aBgAzP|_ #=q@| 3eH,bi? 4߸fw OV "{Ѷ2mpsk? ȹRqU&z%%)SoHNĎ?bM@RJtFtFbPmH3sk^K_HVjEj@Y~ml{K(o.-O$t0e=![̽8O-6@SV6^6'Uĝy@;"!4nzirȍLjH*MQŇt9:ئ)p2J4e}f)d ծ#)`D2:K/DNɅ2_:\ı +07 0%}~gD|ϱ7q&p%̴,7/_e`Da6]$0dtd-=&r/FG5Q//fp ^8TX|#)Ju ;bI,.SO3xhXՎ@Myf/YO& Uֻ)eCUtH&ۣkź׍w;*x1ƴ:2'2kG Ҵ<\C8Y(4UL2G/iQQ ,3\1 Ҿ6F s !/Qrۈ^=(1<PW#KjI+}PvJv)o%Uđ[|s)[]:gNAJsâb~FpR +oHTs1^<ܰ YF>kO eKÉ!RhЧ +V7 Mm-"!ΪfuA{cb(m^U)i%`^oH]r9p!Vw]`U6=RٰI*:~''C%-uhl'O f *_=3{lzW-:p1Ó@BV=O^uB$Ʋr DK҇9VI"mp4д Ǖ9u{iY-d#H4*u3KXRΞ(r.Bá!Mm F)xpB"{H2CVPp+HŽ`؝!dPwKPEΔB@4uHw@٬䤔i0KѸ|}-x!ls`zroۘ́^I @%\캶*&/ CD??dpN$zEz>V;`*7!S@-v* WZQ9]iWYp_#9aɣYR^E'sZzˆ"KXXzɴ/2?jvg,KKĸ6j)Vx\(͛\ek;BjW( q[֕d+V6xWΖ ͵"ʜ9DfO S!{G2Փmxsۘҡ3DCl +F ,+t/ {וۻ aC[6^iyi*ظ}}Hf^E}u*# QcOp[\'\pBhV+[Fl矤PtD0s ??B2O܏G_̊`%zףMS"u}Pd<X8,_TVYe]xDonM(Y/˵ޮL 1 ^;-G"<7M[f%qv +#R7F+($d8p4*1 3&3UPRC! ~hM#s9w;|Ƶ@ =L+X|őAχE4H&9ל(zO9VCH?= :hd<&dBtVoҹ"1L2:;NذTwM`aA3( l(s+}B +‰bC.04֜ 2îd\\ ntp=֊dz]b,+1a=cAd*y,bcK'_J a; a21R]L,K09|Rr ^e pJ'ʧӹN17|~Ŋ!]Z&$ҥno㛜^uvF1# +{^ 1z?YE%l`;=}rCiN)zU`ʘ >>C*_,6mIM7S ꘩KЙ{:Xc&.,b +} O +rY_,5Pu|x>cC 1P. ;|_NW bcʀBB& `6} {c`zx +8]W#"X4嶪顃ϙ:=Jؖ"GO-w$z. +ۿh5[Akvh+z$dRu'-,v('hzοp´ Kwjo99j@o(2MD7|$j I>dKCjԃnt:wk('> R̦K4E=O]yKacDoUʈvM~$=A`r*ٕz1d)׽."^]̂\]MlTd% +A9EG_E4qo4z:%HTb~bnAAKQ%?(3}tm|8Å*qK̏V IzZ-!ۀP*̟Y i# +\""LB8],B2C95H[:Q"^W&z}(DN"^I8mL`e*djAP*KkYILctKjl]ȼj FYvS\T(7]A =c|23Žsf *7_f@B1~J .t-88hYi4˾n[oXrnF>Y3~RL+1qAy5-կs PBc'ZkLby {K6͍*%M^<9]LJa%Z , ؿ **'0p80ߟR7IhXP[3h`< +gSưL7.PY&E{_(S>H@JL('S8^3vKp@|kzc w޺vYzFpPh|#`JqBL&.#4'-*h8 ڶՖ?9 +>ͮՀP_kPH!Cs0A"F5ݮt9?T[uaO2؜n 鬱vˢ,Q?2TbʶɿHAu98#ZW3[YdB +e\$7c?{+ìJߗHQz (]2GD4}6zI* nLᆿz*W 'xuF(WyKyu?;^ 5S4K{ QfE֧B!s\<ҡ<t N4#C= 7ˎ +^V"/osUV+ŅBWsЀ;y$Ȧ +RƼߜ>9eIHF"yT$ÌsYKL^e3p)EW9D%(3JuCzv鏟}/IthK0v)GjVRhLz̲f#G7MV&20r닶&ؕ6.PRƢH"%$9 ,)jg-ʱ3Vu63jTr0rN>; z:"n J+d6@Ya^qW*)+`5'r:g/p~di|TӱGSOGvUtSɃlߦ#L],z +'6PnɴNͺr|?9;bZZݘ eq,'NDUrn @d3yԢQܝMFR;qhdX5!%5U$%U@MBCʳQ %(%}n/lUz~7I61ȝzY3JBP.?߃uR*䧲t@GB+J Ǡd,=ͤeZ1?"+?PȖ[y[5fF`YrӢQbg k>_5WGay~"CB{󯬸R`"^RΝL\D +jF%a:ADUfmw}&[Y<3* ZSfm`J+ +wݘ~xqO';+CA9|o.-ܒ^Ks &G>*mN.5 )`bFƆx$>'y{$`[NTB2&V\Fbs_Y@Ha[ۯ9BC!e$Vj-ªv]!3>yYb-{bN Ȏ;â='J1V+'Iw]ތe;>z6:AQ(g{qVo㣍pͺFW6 șa/Sӝj#:m^sJA)^I{ LZ^y9-9WY :#Wsy`i7B_FeyDBh..Mp}+*DZ!B;8:J|2'!'рϊ9-}݈ԛ&[@;ܛV/wț,v?i';G(UB6\*]F4ϫmr6κl24;p3^kn?_$4!pMst]qp C/b)8*4 7RUjy׳ʜާx^SY IF [/uKp}+5~/]POʥN vBnFUԍ!]btL0۷T j )N:x#e(eͣd혂Bl:\_|qA{&j &8Ԙ痗孭$(m ,LG6i!Dc 4ĭ (rӘ]V:WhTOMqM9n\_=X [3a/^gjޝGV_O V"#dQU5\ht?&͔E, [PDnXS,v##K8̌?%-Qo:qWi21aʚBzu3*?~,b-K^YOq{kOۭλe[]o6m* x_֠Q'Ohsi3NfjC?8-fTDlڷjKY V0Y_Z> 8 oz-]q]Է\gt[&ugÞ-1#,S؃GmX UY)Z&hoLE +߇aM|%A$ :UJ-3;<ș:ylXUgci8` +A+(.IҋFݣV#BL Y,)o;!>PTz>ڳ;5Z4Y៼~N5esBPMFwjZ]!4K "u`Q=VNjܫo>"~LxDAD ~9*/Hg39{u0b.^'ħ}ZH`x>hwܯ-ڊM> I`2n O6Ҩ+BYgT3/~̚Aq?.^8a8N0FeӖ_Z/kt1=V| W?mi^;4).˫D ;.F4Ilf0(8C {66Q Zfضf"Dvr?*VPk.,{Т" hSv̮}sf7jd&rr;cj]OqћZ΃~؝9@xk#e؁ Z>{áaCue izz'Q:kg[ +7<Պkr* N@.xޛh(Hi35:ڠcAՙB4Wr0 I fSNBdA^zHOs)IMtw9(wÎ%3xyx:op#Gnxa%H9L+#{m#E@C\(_5e/ZHt00Q[NҜ4#5tzoZGhؼv(Vd7\M{DLzɒ<ϷT˛Kx1jyjm12e&iVzFm[B kq嬥qۺ(SV Zs*ԵKٕ&ۖK0iwjy%F@9Ƹ)<{]$'CLL0r dv||iPkZ”b1\c]kpǢZ;c3 e䨰.q% +6 k1t/ +*'鶅Ȁ݈&L^!QK:}u4grl億T= muFtt=,:vKVStmd$'$.[;Ûb`*Y]VұDIoJG\ecSAc _+X^ΒsM}p,H"ZBl +\_OP/(KRL +L8ƀb=_@%my1\$LsK|ĺ2F2ܵ4CevGCQR'L674&x]y\qܷbE䥐]!jS>6x壶1. Pq-5`[\݁ +]\Jb}![+f$lr'v6DPL(Bh 7n;ʱ`Y ԃ=lg;4__;(,a䣷l JXb{_YxGN@U +wҟ?D[nFЃgي=ɈkcPM +>Iϛ8F?K1yEg_xfPU=z1m&xI^~OSL7hUq 'zSzkR FE^ Vo!o Z$K-Q{7ӱ(sc@В VĂo͌) G@Ȥ@s +NI0qb-梤= V **yƫ!OHe$d:i~8HD1NlKOl'qfC]P ݬ*_3ғ]ncIJŦI00 +`YOR To%@MJ1z} +KzmV!LN{ia綁 é3RI  v ڵQ֟ɘ)V&ؓ?9G^P2 +ngQǤҭкY S;,ќ"J>C+5[cٶЍ$/AXPBk"= -CG[m)dt`N.]lg\hxGi#NCU7mĚqAøyh= m`,v +9y~?bL1;_J&$0 +R?9lާ"i(h"^`ZRr$ QA@QpsCVnٛl'=SѱlWE pʻSt J69٧ + +5THكOO7U醙jT٘/},~f 1]'5uLi/jhk"U +Ke[,j{ŚįA-[醁Ʌ|d7ۊ:CH.!$*v{uy6ALG/;& V&YjX 4Z*L)Ai T"Ŝ{b"6vnR`U; Mc +Χ e9uc2<0ŀg\eʸ; l%߭1>x,=4; +˅M/q}K/F뵫Yװ*\-D"-;޹,2V&㙘W"5I~ЎȖf1U G4aI2fљڕ0|[ %Ok^~J>(1}?t 1*xZ2zo,@w/{Xxy̪k1'a |tvqja3*Ir0&,G=G~ĎN[Ef2HJT%롥|}t ֮ ڝ@ BM #*Y` {9Nl[k%cЖK\oTz9+V?^ -"yH}Uv-脊 Lh7eY9o,U)LL:?Km'G:GS jKt/0mL `(swngvv ·p'T_q;).b'|,m[өh?L+3r|d7w5̪wh(\a"ے\"3>ԑW$ b$<<4{$1:?0w˭#KN==֣sAěSYD:4(uj4ΡpCk*/WQ'8*8eo3xǦ1B\Bq˳*FEcf?]<{kUix3a@^ƂTpk^7g-> Ba8乂Hw#2oƦŤ{VHzXw߷2JAǟUVvN/F82n1ڠ}N瘶uؙ~B"C8T+;^%-"b¯ؽH\JwiDu]]H ~ XN]Oe%=i4;sGYc.\jΆe!}|`V )Hw:H қ&^dVn0z!Pv*|T1u1Sy*hTLc΁D¥<@رylS΍W鸸$&9ssSD!gLAcpg{Gm\ JPO: ҫh<@oaGUN'ޅVL&SB7kWz.xN(1f f#O')c ]|K cJLg-{رGFqP)z\O3p:`=〻:Ӆ +K0?j4"9%3& +eYV_SZiJ߈<H[աr#nLla4 clhLo E{QS",jaTSrZQB]Z^j I ; /iJ~_M2XmQʩ=Ig +m[9s_) L~fE*`U5>tki?5 )"-',dhtkeKihME܅\`&}{⒝HZbC3a~DJֽ'CA/d`?eQ>Ѵ $HGdcCaY,[(5glV}J`6~⯁灓v{HR,f% 3uF'\90ﳐQdڲGi [ddT-s :4K,rT">lK"=DkT˳ЏUB`[[\"k ƫLOS ?&ߝiq?"Y[.($ϻjuB]b,`2Y/UJd߳ư^O֥Щ>5Ǥ -XHj9mhcaoy GD•Bʒlэ@S {@ބ.P9M2P$V#_OP(}f*'.ë0,atq븘 ?z*a<=)=@$ӓrcBJaJA<5JeG(7e֜0Up @w<7{\vָ oݿ}#{ܷ](y](8I't xۮxzA<\a:u$u H=ZJ1ȬQ pQN O%gCT21l4¼* <1#&3G9QSl%[UiC m)3lt$ Jg<+X3BŌ_߳C+AsaV6}5 _3l卿)kc"}*N m~)sM X.Y: +͒f́ +R p,@PɌK [TzvUkoFMj氁8+l t_>k;nW?, 5 N;I툪a $gX_Y moo=5m&!%B@ /E2{wP]p ޳/' `$|^3c5v&~qgV}Em1z$_fH- &cp?Mː 8vagdDPE2{o_mar]*?ut9c7';$UM8UyiZS"8/_sCmczEn ,4>\Acc̤c$#ssHz^{rG +\}Iz#`5je y '&jbn;2-꯮mt G> Y(2npsH&jZd+/(㈠(\Osoz՜ds}i3'>js> ))'B9wް|hG=iDߦT7LzH94k~FŕA!U6jSmyn@slSn(~DCJ]IӸI虐NԾ-(4CF-C&N^6 L(z$F9C"TĈĹl$(Puxju{Y 4 +mX3Fܭˌ$mf< #le(dy{GpZ7wk[Kē4>)4כiq~;#}v?CJm.s`Z? q#&qnNIVm~9{90t]G]q8_-+h@y4xYϚ^Z?W/==t$\ +m7gq$5f0D$6& siߨq{Q=9~zU$Z&/I4h[dDLO$(!|u h 6jd@>}wV|st, ]d; Ș "ϩu`GWGeQf?XLa{Q&9|F;wpcLoh!vTR49L_E i[rǯ6G!4<PJU Vob4Y?chs!.嶽D04.þ$p4&mЛX:c6w">KqsKJ|1fo<5jl]UpX͛ =:=9HoKL5<-"0Ee;K(`4M&3lE;!0lL!*ҜIJݤPJ:f5B#\!۫_T؉qa +%,|IÐ}pK6WwP-rpi ܋++nkMf=B~jIUO;k&a?S NmͰ?SK21Ȅ+`[BKFdwKwQɊfk@Mv}(Rp"j淒$brm)m@TTϭ#*Z2rSg ;̟$}j6;lkބ#*UE+6\ GǞS Czz\zN59:K{KEQer::_*xʹ9R/"0ژҮ~Y\jC4)P1&NSMwLTeV(8zbM=E$(` 0(! +L/PbNвo(},}R8ޕGk!mYRH=!Ftts3a8xG(:أG3bȧ!Z(ԗ&p]M^a*)lm@I˱|Litgĩ|=K{{WvY`aҙ~Ka+ZwIK /nxi:w F2+e[;$8v$KV8nlDc]mN(4I %7_O,N ZŶMlojz9UҊPϏ(tU1X뮆-G-ɋɸn*kn5p( .B;2!S5J +Wؤs&ZN}1wfUdTП`)ƙ'\ҵstۃ:x Ŝ>EE<B_frM^=+n_8Bڤ ʸP8s]C1z:m(BT)}c{RLȱ5G`S ɂ:!-~XɄJő ^)YyHPMLؖI`7(p; $ A&@QᠻKy ^L1۷f-__` +TI҄E>Y[3QHYCq!i{G1$`Rt?㯁pl觊`hQdFk{.Id2_ɯWSߛǎC/s'[wګ>Thjǚ/jDb*#S˷jD<|#q>u<; eErU74p f`- 4vDșyyɲ/I;Jʐ%!`nzJԭdAjK`)*5S/Tʼh6m2ur22A7!踌x̮WynRg8Bt.j)y4ߔY"wM_ձB匾:'-1L?׈1 7弮5 e<W*Τ'ҼY )9×& `-a"6x7[8ՋJ,`։2xu6=&Pӥ=7JXm+xw9>" N7P~Ͽ.f~bއ,bʹtP>!ez}rI-OGMy4).UXeEsw˔ #읠[Dj^gqFx/vo˹r ?d̯* ŶQ| +K:%|WMaecm`dʩ=n|w?\}$6u_TmF :vpV o 'Imї.R_h{za?R#,޸FTs/(PLҔc!"9R&!/ZSCx耣Yaboȸ4|1,@bP";#m6JSu}*|[c p k!Bi5JdL|ֿ^<#0ۉVW ]OA HPTXeTĚң* U=TkE`zSW]5Q*bG_(s۸BAk "g#_ Q&+psm<-ூ䁥'3T?{Bܞ~:9u2I'rU)C)XW1XMxsAe*cU35r2vݜHS+6m?cJ-HZ"GkcR\"۰?]e;HN;/E +0Ѵ-tGdu!lIPE >;RAdE~8~}7{L# Aw_ 5_@}wd!ȿm x!^n jb)oX72ꨬ_[" &Eh{1y}2=1I#@nk*CCElϺ oh +&ؔdEQ2m< m~@7DǢ҂>jzX!%M䧲t1F)z`P r[|TneNm+*TH<-۲]n\tʽV݂Nb}{0Vtb@ԉ{˹v(6|uVDMѧM?:= /听weP{9`县r A`[7&Jq^iR,^V5[Q>l|h\N~9=Bsa7li`7^$S-DzHwh@EIؼ>,-v9r(> 3X÷=|Z4BZt">nfДP&JQif!ȓ[Gj@$pKj.Ү_ưa{KԢ]8yDL(d U2̼|nR Rq%~f&d'FQVnŌkM e +Eq$6-q2s +(_;qai*h%߲e4wPi>w%%^aGzo3ռ"ve*y)[mۿ"ŠBbfhH29!r~K~zYnY؃&>28w1݁^H5_U{g=;[Yctaq95{ל.6Ưiּ)m#PْXbJش~Uq?^4z)hD^ϙ!8“rՂx1ೋEz.jrdwoL4!+dҦ|9lMeT;.D +l}*C/71iKd jr(G#$bK_J6T304?rt%iYmzjovt D G(b,Yfp {8.4|ڕ'ABlMy(]YqnV`*f<읚2\:.3vU C؅N׈ىJ*()i$a_lh`fKQ3#>0 ఑? .cr_0(\= ߍXȇTr@a|_(OH7q40󅚙*r`<e6=K J|:W{`Dɶ{ʿt\u߸ӽC+}ekJn{crEN8+eR{f٫]g8mNScaofc3Ae[yh]QZF L ʬ4̡̄BBW1L5eC}]׺4 J \+ӏG)+[\1ؠ ;˸F_JwJG],лseq5әhSڤ謤ٍ";s_"D#ۼ~T X/gP5S]<^RDZ2\?i9 5j&:ϫ#㌜ّԆm11fiLxb,XGCIE90ӒJPc) +)uBRaaB 02M꭫8J]R;|lj嚍#o؋\L}6}hE_| }> +endobj +14 0 obj +<>stream +MCZ} 8%Ou$`v{6ΐߏ~c9xPoiXAq.hF~ ĘDXfMu.$vzKa .\ 8V +t0C 2s?e3KnBH0ť<7'0+4ϔh(نM{9Ac_6COf)(xhIOĞF^K(Ήi1N#EaSBRj[4Рw"r=|ƍB5H5)Y/)Y u5/ӣ[Э(kV%Gw5T7Ldwp&U*1{"1d:p|\s| Js@zij;AY`|b-oVzY0YbZ[F9H_6]a>-yǔcZ|3@ğ.5LQX(C"`bI+aejCI.kQapW8 =A?䗸9HS$sdCt6~[&;/"vDWdw+}^K(9+E~H$W6ksm6$j%_n|̋ `_.͎2>qW-tF7U{?PPpu>%8za{(<xu_VD]Z8,ᳰ"IiPB!|drjEa?3K{{'uT;kKv,T!7 Kŗ6{p +: ܬuЌFF-/Yy% $p柾tPǧ܆~ݎ1gjk͠G\7~uԨG׷VaQQᵗ/lW[s_tW;:J%dg#dRO嚫NB4]UAJp2sFXuΡA[c=sO@$6p -^?=,dB;:4v l; +2jL`G6dq54+똿et'Zf +5K{GCЙѕM#b6D%u/zG~Ƙ=*Ҥ+ ![Ng+ayV 51Syx\C bx|6%!v D̰ ޷r-qEg٣TXK +- >dml!KAAOi^.DI~Jk#CfWk+|SB(j;Ve|X֩)A492Aў}|2$hHk='ƅT~|/٦bf/1}.Fq&/D}Z sd'=bƺ\ZkO PcK}o^$4a4$Hi9s ,yd}~_Ac̚rqCϫwzZxҰR tξe֪ac +|Gd%R SlWSChACL(i1tnmpgwei"A{ &ř }UUWʆ7xP`YJ~ c0=[gw;┞gXc4r<_p}Rpokae)8_a(ݗ4Xn)cQTe2X )#ސdLw5ρI_GF{G&钾+D5xP[X, ǓZlHy|%` W;Ơ?iM?`m3zYUR +hsW˓ j <$]5,2M ͥvoLPn@o% X AI),"oܤ=+-Q i_s™<:LDy#$4m(0 +ſ^Fl:j!Pn?+Dn}<(nueVp/bL4Bv'Z1T5GQ%nR$j0[4(:6ǦIs}Q9á >!^@pz:`g+A!ztDdI}<ƀU nW\0pf*LeP\p4tB/xXl]G1wJHU}h HzЦj#X݁sOӲ0$N~Ay^-Ik'qmOd8Jq-ky*?h06 |BDBwt<϶y&I٣e.F*e?d!eS QOjV^>c jY@핃~2<]S0 k2'DX9Yrpk +Ҽ'LֈKd]PLHjɑ&LOBC _5.OМڼu +]TEKB[7Wݫsu;*VZ8D࿀r~'; >+%'~r/>fapb%*1+F8u'|㡤a d븗gF(02ȉ`5T F,rl1J>n\ +,'V"'w&ӌ=ϋ1&}hB4T`$ V@eI, &bUҁs;|+lWMEg;qE7?um"z4iZ=BR.ѫ!AYLS4xhS|"ꛇ\h~ "Hex-r>7F}J"qvH|PZԍT&W;`;D$xܼ}# E֫ ܣBw(S ~ҍ؉FӠ7X.+U|뽹T[ɉGHNV( 8uiP/ʄcӉlj(3V%pL6[M{e̥+@&AR1 +|,iQ녏EѺdf==*-b#:soHH?v +n,=]JU I(+\r ++;O' ҂UA/ܚ6jO1/uؐBbW[%@!|cݳܸD#Wr_cPLئFg:ڤ=:Mq/h.Gӻ6xl~⑿:ڬ|}+Pw|e%lVNŒbvfHJ~(ܜ}xF)T2jWEMڟxU,ASLUz]~Mf +]<Ꞟ#Yzr|؜3?<ܼPZEw5b lcSW,I^dvnP w\X )yWD_MϜgK).u3UlFlio֬[:!ҟUiQS\XP vs1`;iRYLa&n ,z>4e"c"ؠ\KŸ@` 2 W81X*KDP^YS&6֔)eAp.r["ҕ,&3C%9GFJca6⦼SfĈb;8 +Q}9ӕ\+W٧`>-vfyiXi}f +U&X~GS0{g/_nSQ U,dQ0(@GovgITpiHfЄaҡ?pCO΋_)/UK,~LO +6g <)A$ðOVKH9\HvX<ᪿ"cvN~ylyLXް,e^Vlt6-1ݦ:"k#?Iu_V)2= GU}Lt8G*ݡ.,aZ??Pw*&vM`^B%B`,D}x4;A2Be]Z6.9;L8cu':4 *|wzEJp$VķE}Ys:=cnz8,Ͼ%nr gwOiɥ=Kn +dQ\}xLEģI4*#ZWS ]v4J?0C&b ٹqx玚ol}f4K1,";HWS}]2ޅ/Uxp;Ք҄<+[IR>֤Q9_Z2dQVS(;zQ6$ƢmE ++8Wr+?f"Ak^S/ PZކbp%p=Qv|nd6# +T,BTI+eͅ>F;İQm>X=҆D2_D>%=;,lKU-2l ^CdKHeD9Z9$Kj*Aiܲ\2bЃ,2{瓙Nz2?kǠz[/, ʂrAEޅ7's/Aqn͓H*\:- &YVB٤-c6o@!݃AY]ac&n:3SE؆) f\$#U'\JJ&?Lc4:SSbSf#gC EA?x6{9B_eXTV^}u_tݴx3?8VpiME_oh]/FE-B#$|-bYԺ_] +>3ń*MO}dY߸Lc͘K˪%U2 aCd)SHd +oøuew7dyVǬV'-[>l V0. =0ʄv(TU,e?4Kһr%ٳh(eYW˜5aMc5k\[+`aRk)N;7t<9(1S+f?%.kV6+J,#bbP1y8y' h%|8Ѥ SK+}|uedE؉yKu|"u^vV3DQ*1xt +$> {^θ_A@6<F(u#FBMnI)aϷpaR/czEDf;`R226[]0ݭu?71Xr TTln34jx+5w-$V~6KO5Bڂ2ܓ|C$/o5ZmeX; KnP-Qf`VEr& (FJOn;Hibi}:# P Im=) "9JcG{xb<; y:"ܘR-Qm!,FJRcl + %|W+ezAg qi wXsqMW=uU~߆NͰw&<9~aHs5K;MDU}XE;ePeԽ- :Zmo͎-z/G‹j.R,B@z4M8Ø8b51˷9xZl +fosIB=X5-PB7ݮֈ6NW`B?ɵs{ o҄$7Qz<'up4,-T&+Zt3Y}GT~AD|1 gukTz0hvY>`ͻU oˆ\/o̐/. +|'ր"6NjJg;{z6wK*[RF^RT4q S1% +x2Pe}b]ð* ,+5 Y͈Pn߾ )DgS_q$cJ& ]J%$0CTfީQ!-[q* E3@kf%D&'NU>~`I@ѳ=18fàx_nMl1̠5%PkNn_%)C1orzYd￟|- <4Z=J(>_y{yEkQ]{&&"L";%N˥^@f +SLjK |xÖ~qQ[ĭ|BFr`j3l-Gwa',dPiZeUp +#hyDF  +3(9 J.*2R'~U,3A$ I,.hHR "˒eXBg9.EDGAFrw? %!N o50g 'q+/Gb=X9TJK!MBBysd UgPђ_Y b6!rVRl}غ4 N +-Qr?Rcؖ{BߚŹ|STY;\-s Y(pTolPpe0B@dN ;uƯLXULj!zeg#]"X݆KI:ibK$Ar%K*Mu_+&2w劻6f )>D|[d^Y{Up!8tORBV [vCeW1uZt۩>~Rae\nRۢqAHJb#|ŧݡ2Z=WW>d|$#^mc‘eP.ʠh<  +{]glaf얩̞2&q**q#`j9b߼!kSH &.̃a/rգozaY/&W71Lc J\ `}o0 b S(HE jԢ@Ǐ>2ieʄ/ݭ%HcYhQN}u^`d wo&碽o'aGD'6Eq~K{7*7'mrLUk~|c@Pi;YFIQ xp]o"LXcQYL@*:+mǡfQCdKDV,#U~0O'^?&25~ʟsMvֆJy[:kkoMnJj~dRU_nY$_ڬ3t$V5/2 Ul\++pY)?%voLeN絳:lޱq 4L*pVXR sVx+ 4uQ6lz2<81sPa]PN6Q@JN1u`IVv5K,&@*iqyQOl .8"d(uN}%[hiS-u@/ +q 6kFsr_&1:5[ǭD_7K_\3Ds mLF=Shvl,󖎺~->)#")h&)إ?]:fnsTq?P٥lYWQ"8ՕDk@٘WX>5nVe!l젵&aظV+W ߽RBp%Wr{%)75$zNmk=T?Ρ1˯~c*P է3^D|ɩE' Evi=hOνve^5K% K. :PT7 +Yqq 2y5bP5-p7oX,nI45-MF=U5"{//g`JX 䅛 +s1F[<8-OYug߶Y7L3igt׾:OLa$/7XE#F{'jp NnHul"\ !gckMGW{ʵWo(Ɍzv' i2i˽꺫r7&; A;(.\#dViݠy<\5^w;rfkOuPTR9tޖyczyXER[[!;"1? /iHHAb&XwBa^9ەSG({e)BQG|mTtre[#k5<ưA4G6LZi j2oq^&yX_ qCT)IZ[/kQ ©gz+d;HPt'SkAUV 3&)L0OW2m֘"} +wߌw,PX]A'=¸ZfפDXƷKsq=캌ciL3oKR-!֣f7D<5ǥr~" !v%X)U۶B{k8u=%|JG9y`¿@!R">V3ڲyp3ղ>Q8f|QKs[2T]6gNÊ,njK9s3mf%i6q{!_yзW\M0~tMz]v9qACxSgJ{tشf3U;1ix3(iG 72D@˜\Gj`'Xabn8!LQ`Sdh.w\3ɐ7S+&~sJ/5T?#U&Piѷdd3jr_V]s-&]=yEbdßu~u9h s-O/B,` AFzu[IIFz&[d40BE͏x˭0Wg۽%@mɽB?V R+P,df]0ë#ۤJ=EL,D.'{a:ѩVWĽq' j z¡#jtO֙{6U3&+W 9gwZBwi ҹ-h<|2"53#~{ܜwrLf@IܮhЁ?V@6Av okd$w;T@i ,f L֌hsgB`:0l fև5X21+R6_!yxvvlU9Io1MTχ z9Й)M|,p/*J>o=|}e!v* ^Sq݀ 7.YJqs]i475Tnf̠Z2tfl»M_C,⸍EF8m@;]xSh݌y Ƴ03Rՠz70ퟢ<,1b7EWr9G@i' 7 rt<\;W"0 ~-7&{-cEkED֣Bl>X_y4R|r$]I?! bUP֒81F6{Eij Wf)9sz.GIM)RHe!l }UeKN7etxjP!L #ìޟW;ijP&egϷk{xHԖiY$P݌)KbM=d'1ݽAi42".Q[PC/YnCYtqM^Ls`r5:6h<ƧpH p0iۯ'{ +6wu=dڌ]$%47`!d50L'7*ADnd)*:wbYPi62t)%+,^)k `h +*pm>\x`y꯫&f@KW X5 ١1 +c< +?)@)BPLxLR-ƶb7h:MJ# oʡt` 5 +;2N5(dg{H[y[=_5>+F%K3aR9X`%X~qm0­hV^L"{n~#~HqYر5XK- 2 ލu\ېc+C4b >jU>9qW Z%'r<wDDx$ +ЋVڧ(|. +EA%s4s46JPܴVx+H}cX&`A_۷JN-&-Sk,tD +&D_irl"9vo$<CQ5{9@;شh'(EN Lkz{_c^g%{4ڼoɺO$is^dE( gۆ| ]_e^,jl<4F͌Kzw!_< b1cE|^@-YSafuYnM3WEN lڊ`q3|M0<,8!||v$+7kJƬvmT=•pZk(NV0 CMUkF 30 j6-}Nz%GHnXYjMمR4AVcAYm 4`Mfb>9s:cR6!Z ҜN=U݊#nUo{;~ZSvj=爏%ar7*b<1BG} |vvf L3 oiڹs &iO0Ir.&[|pŲ!D% +$N`gD.\zƣwéGJ ykyqL %O dyS#9ϵLu(n~$"ZxP>б +g$o0N(Mis|(T'L[XE\`PQh'Bh!U`&5|p =ܬ:&t+އz`R?>_d[؟qS%K[.Q&vNJKvVyM?q+|PD;({p:%VnL9ٟ#zQ9R!m]t.};N<3`<89^ey1argOL2."rATfiWP"鐭h8u8d,>)h[v(&8Nѻ^ |@j.0djZng';KIғM4\1ٷ!-ƬMM/5k#3dRRUi^w8ᎾzBf&=+EX(1<)eh}}d\YR^2&U'Z[?VdĎI*lZ +`Y y &e zH뺄DiӫeѺEk'fm\?߃%_`Z|^IgZYn)F]`<$&7,\Z&x^QOMߣNLȑBv:@|\ u}r3I"U]qPelrNP7 S~ڲgVԳ )P@b. #7ǢGϰ\Y`ͤzR.2mC =}2wzݣD݈;1 DN͐TZFl&f{{JP2May% lДG ?B7ldV^|W1Õ5Է_rT /حp,,DPrt7 i6ДTlϸћS(R;;#ְfR#fw$dF@g8G|y]Hu 3{T2̉[r rr>נ7"Bw<<&;$/$n{{ɫ( =7v٭>Oh`jGCʉfK]+! zgP08Joe{ 1js+p'p/ +Q? +L9$y~3&D+"U 70 'lGrA7u0QxvO#a?UwpdF&f5 v){Nh*jΨ$c%tc2= +Σyʓ$U,8 +v!} V +vi X)6I=l^PyAlRs$,=6*I< +!E75ߘ,peG!T8$Kw؁h~}0 etHaF*^ҭNC$dYJl6Eo]C98Wu$<:,AGf!7qXPHxj=/hdΖZA.?iJGPJ.aݮZi:=R'],ϕBI;^IDgfP0Sm4>AVp, !xٱ۫w?8N>aR)(L19$%)9\S.CFjbk"͉)kT70WyfqJ,8&Y֘-e߂}^C3<%+ZTOA;iGƌF1w;j b]=]\ ZMi!偻8??KV!|xǑaSymԉ@ڡq6Z8QR8݂*,J 3 c{ :Q-=,ϔxtc9ZZAhg;ɘx8}UDÃ^2xBK@OK8 p$$8fvoF9! &CogQS*[S ,>B +@,!xwL}@xo1<e\ٽk `::ȈG랬P+hzޤحN !K-pێKki9KgWYkq7Tgcl74 +,$a]V+@ȣ}RaAqg=HB"חvGרZAkCFD 5R#;k I^g6Iuo _WB7w#Qo!5r@~(VuoXZR\/&n9T0Cq%w7`LـWIJA#GF=?%MX +ݚitA(mPi˺}AU;qNwSeU=}̲BlQ̤=Ց;ځT(=.CJxn ġ8`>7-6`I+KQ2u]8~#ʥm#[8tѕI\ &gRia="+**: Ǐn@h > UF:'_, Y`s{3Ks^_5ⰂZogkg' "1%\갣?pAy#BNf=>!J(?1&Zn ҪZ*v{ 98V&%5)vR(mx~|ù98?dT\)UTG`wYM? $>a b}'}/uM3w7]=䘇^ӵ=z`(&n@AX܍2+Hr! J$ֽ7S'Cί*,rRqEM95v4Mc^3d`hn@d%eWP;Vep>Cgh-hiOOTdžr?2B-zÌ~ļY&5Rt\E}[ HI +e?qmU>3? Ao!ѐ:VNSIwsa?櫁NmSwwJx4KMY>+ثK4~*T$*?/̭.rQ;1ۋ4y(fUԦa||cC6f8EIp7UήR].)Yߧ %$\G ZpJ_`Uާc￁#k27 ;qZS]@޽^d2(۬5Cgp2xVbjK2cCkLW 9ޝu };䱳Nn_-^Hٸ3G24yx#):-&2L^Ho*qKo8 PwnL0Y2zq2%ۻN`I<b^X-_ u.DRVyMjO7<>9I}:hzmxUɗlؑβ,܈8vWafLTdXMhMp *l^zkY b2 Jz9^DcX:V"j[2Fl28z,S]C&!/s"U8̕x&nԃ6a`0)([qa_(G.>ƒc],E ڕu[S fӤGJ +i[ÔYg}ZJ+XD( a#'E%q}\ZR FKTq/\ +9ChnK9a2.bD,x:#f;RK|ĽQ3|Rif>KB>({ާo`vzpE*8mQ$[FvOGBB* [W 4= F_ۗݢo^feI$w7X@LM^& j:˱>jW B ~aS-1̏Ƥ޳2P(=Npvq,Jːq&s|fg:j3)EfR .21 ۮ/ +Lм,ٻf\m 3F_X!$K/?&#C,d2'_n hpE\){ k(aBpbi eʿeq}&dx r2"vYno12vSrukeTԉL7QLXMV9DcoiSmmgw巓{St; ?E/>E  Xn5KO?GRŽ{%>/{^񎝦@T|1FgxZ7^lvyZVVdҧ1zF7%…o1׾SQB9jdT~nqT/݋,}aqXʃˏNK搀wr9)qi]hM1UP߽2Ĵ>DK$dS۰Y{! wFD3_9.b7:+kI$ xʳyH 5Ʀ~ 4!;BaEWtF6H=DXUu\0)RkfUƯ"D|%xX[Mx6YҲ#z~p9fF 0 }s%I(vmt< +FeW7}c,fՈ:ˎyMwp@ `mtdE>j4lghLe y|Wi:&wi%Y\0v,FRiBCD;vӐBjBUmHUw-U& ݾaY+p@?zHFmswZM9 zs\p)]1܅-zFц<FuJ@Zq3P3]h\<̆KQ$Wv\OBfzsG؞lH]F)腗2\lVI 8/,4wP}=7?h鳧Ip"~{%Kfoew|яIE!b4qbBwj#BB* J3)& 3=r}=!. vQj2s -9Uv}g=z,s!o3٩ s[g *G/<19PT +2%{~+"n==Q2["Iy8{("ZIڜhdm~Ŷ- H^%$TB:SD4AWeow8H~2&W"fJ~$#_ʽ 3r_!Ֆ\\4C"#66GcG'% ]"NaCPxpՆ dA^]e( ) '{!;76V$'$j=de{ߘU +9rdvܩnA82!`ۋF} O+M'n%v W xkZwoYy?i7~~}Tj ++(aV +ɩ&F:8:z}1jCU+k$뺲t;Iiy+1[";0H5ՙ̭ ̈1.UF!|t3U_*멻?oa R\(QNgPseRzOxdӼpP^ bbm%-k \Q!:%5iykX 8HZbRvggR 繟q<p0n zT`g¬!yBmMH='`cۃS2/A?m{/ªRMߎbNl 7>#~B*ğ9Bi +YeUS Vfv}j4=~qJA+ +H[I-))de@뉏#l%mՑH;DALD  +2zZe31ctEWY!"ԯ/rvuo44;R_/dEjQ-,%x׷O.<5 笈dj@r_1~G/vi2~$^'_RJ~z4B3nzK9kjd {qLDTR#- B Ny|g!jAI5 )%?'B]NUv t:@cǰx tKL&嗖7dD0x 5L֡y12 WlYt%K1 Bp/VD4_kc![|3ڤ8]!Zlap{s06u6_i]Z+$K*a#`|gexl,7R/`n1\jԋNh!1\g9ۧ!O** +$kI/E +g 4Gusu +: WmWC*=9 uYHrD@ޤl4GO[6^OR)(E7SHva"]$6E؜C![7QrI\gckEmjD_X gbbE$긫%ؼt|È\bؾL +D(>ORWpdfBMp]l@l48j_ "pUw 18%#'<͋7R0*0Kbωm~I󄡁kc6kOg  ]!⧯Хz e(ʴ hiq g—,nYlX@|$D3e.D'U +”W&g%#`}Sg^1 Z`γQhƆ<{poO854m~sݒ%1 LI/+l~”]we`dBհƀg')}"&aXXʔ4ߓMm4\ʶ=٪it%ؚ%ׁj;1or]yW Z4h]_Cx4+HNcF<2nMgY-f(}eX;S%u#q@JFΜ8S=igTJR}z-5\\WG[+'i vrS3Bh6bpޙ\N 04f#t̴b3WR!5 }15y3ΚrOX$ˆKPed=1L w4bSֈs~"6ҶbL(%خ8,UchVf#l{G'\d1T9Q<6+ ܗYt#|ʫNB[[ݛxX]oy^͈ @GCv}4 >lYhR 5ڢLz;6~ +"J],$ fr݇T6%1:( &>Ӹ} U&; MTPytpA*P]._ )tWտs+d$mܣj8jv@;?vAWۧ6fC3E+!pZ*a}^U`$$7,!Qю[8}KQYBH^p4iujpҖy~c{?Sx$&pA˲]7m&oˢ$џEެeN~iLA ]-Z>Yc?G%fP'-$R30*Db 2Z̹/QW|=&ni؁E]f̐ƚzo vȚuY'm.2@*8c Vځ}Iu-Tuҭ6OV8 |lZ);kQv߃/w`FYTٌӜ?đ +4JnVZUǯO` -ަq4糙%^ ]0YgBtG>%wӵBd,㵵#@ٴ(kB=>pб0ݳ6Z g6|3~kNʃ碌2E;DdԌm?]˅$ctV.{sDuUE)EԚ&il?%b] +ZZM0?;榭cj.$.8{,e[XmLߵEjn-1h$S;ڍ/ l,1V(Z`l +V +%*;jV+2vs [Ec?}\XCX}ྩ+9éz]a If@$OnM'ȴ ݾӐJJ3iTŽq\l)FІT&xA$t1S|*Kݣ%U+' nEgwɿ#7]ϝNbZ 'G ni5c]aLv l8?G +"ؖD!J!:|IL+g klU=4*=uުD]tBzKolCJJ⒤ʹF7U +o+*c"=q#ǩ30AKr]{>m##%T4z,٥)?2X265V^=e#<@H s#Z+h }bQ q&WqNaJ'{aw>QwD`j7X}f0ZmSKrc 3 $cX@H6,T{V0N|N#f T"BoFi +ͨg^!A *reuUVSh|WV/4єT t )UG9=N0E`kqj8+[4'WStOt$suLAB7pz Z*]1F:;ܟ[ׇX\[0躖Ό*6쭰(]ٲWҖP{] JnXG:G#bL } 9a@eҝt? G 9^=P7%x3'$#6P,Դ#Zòi(F D9x"w;= jDgW&c r]1PgAnE]=>L6*>kqvjuJ;JYPoڌ?PGv%^Bo%AwdEڄm+@4Y[qw&4}fDDy.vg~ 'C ܖZ20b9*O +I,6^^*up~ =NFw)*(y0Z4q#O}6|VStT2-,N9/)M$rS Fm?W2YIah F1[? XVGWǂT_m#trOrU(RwQaqT3"YhJU US(Y6'"QA4SBm/-_fVO>0'5yLvQ>w?%huQa]Di`EXhh./&\ݸ<1"!e" @B*:m4NV2jK)EOt* iPj#)Bod67|2hN".J3s^T3M^>*02)M n&xC)WgU#8Ts9uޘ49z2B7ԝ^DY{u<;: +`i}<@|O gO"\7f˰kjژ}7@Tg0j Rc/ 5 +.Zf䴠e[F~"k\ WoWnx&+μa WEb|<޹JhVN"*[n&XΞnbipQ1dݸ#{ F5? J,"DZxD-W෴\}q`E"1,D"9D̄XS oԆII|HqǠOl,-CKXR劗F9AE?<%Rm46#q,J(d=܏o.=How8cu+%weufȇ4/>]ֶDZڑz!'L* q<;#U_FwǷЉua2 *6^-ihA\Wt.8I,__7 OV qiuŮխj)_\4 )eJ zmCPGƍ6N//tP%S:1YDj2qqf8oJV]iڞY5YTxXG +9):!Bgf=@Ȝ?O,CU#VMJW +p4=gߧuPM XzKg)5 $WMgBT F6lOUPюKG0X6;RfBCZ^lN.5mՋaG;5mg73yϓXV{V{LH}~གྷ/|J: 4@Tl:?D ʚ6@N2WOA.~WĥRd0 +7l4%I/GV>M!д Wca0! rQTKz [tv7^^wSpB$ي Ӿ|v[QWxʐfYúYW>U9ISͷ2}6 ޭ:5Hꝅ%&C0;6cŸzSDh'B8O?{Lr.l |hEl2\e}`~p I}TEɫ{ d*z2_eީ œ.)PS}=Ͽ- +İ&K +r Zu쿲^CVj#@S#xv<\c*1|mTiN:Rya1M#S0O/Oʀ~$ߐ g V +6ſkځ/>wQY܊$vy#QR4FNUcƳ(壂蝘k:~L)Zpǣ8JpiX""M8\(pr-o }ckV^Єhuˉʆ-EX96fK/y20~!x2g_[EWk|^}~tbITNeF>\||+ZJ0X5W}v|FAZ gbUX~7@o=XR؈ tjOB+`T;tl\Ahה'_K\Gg9ںU +]MP) b L?&:lSvOmX<-WȤX xD{IZ"r9#zTGnrl }.X|pe6 }GxD'3:A[OwI^"83ٖd!?imf8Ej*$ԖȬVifЛO$X3XW %=ID 7ҚEG&xZ `yVDN # +P(DIJH'XM3(-qP/1Stghp b#oP^ҭ8UC9BCC<٭hJsS=%_+xoxRi4g8t㫤J +3:+y>L^1pmsM|B]Pdo + Kt?ushu$; =D^Kg7`x8t/蒁y\eXYYm{)<ẅ<dƿ#!zI$ҜT]\Lx4B]~HdT(X*2sPc\|gZ 6i`v[]n57.u#;TC-LO\iک,j%b}ozao.ejm?/TpCmL 'MSFq̩8LVr, 5 ޜL~|yhV@/I~r+Ȟ@|)tT [WBؽg(tX]ͰCSHjegՆ2z^1V4 s~pZ=2aN |( '|]R-F^#Nr޺*<6kЁ 4n'"(#4:*TC^:l +%:Rm[QTX6f*]c ߓ1TXFZAGi@+,:CXm37F'aog hr]ncid}`4Z,Ur,7Dhj#4 b}ߵ-ETАKq$CʸϿkCyڰk8 ;rcu>IҭA147xKy>p=-mA+*O1s?p#j^ϲVKF տ7ьJka2UD1%wN#D-bs/_e6W?dIysq.{V+֍<:QlHgbw(h5W^7yS[dVF'fHD=(RQ=wi7RQc }OҧP9rF; ^4G5ijb]jr yE?0JZFuuEW29b}e!XVp +endstream +endobj +15 0 obj +<>stream +]E; +ۮ2!r5),d]в-C+Vy]"YS>4 ɁMOBe w^ )eAUH^m~>eXn,t} v-`S_)kc. wDJPrGM'VKUˏ ZQCVi|ZF: +_@mAyjZHI`)cgXJ<2iQ&&|;:nB,(a\rɛZ0>Ӎ ,Ejdz (*a(>.j0o0)j11럤OtR"$z"qqҷa V[[; 'c]j +GCՁYѪ+ 5bʋ#௵(U󋾶m FGbtd;_Wk;.*\"`Kxh:gʯ]bCOqﭻKe-}~tF<#iJ}=M*"=Ҧ/!ͩ4!434zLA `UG-^0 p܄03&(X4e,=Ȍt;r~Mb>:l[xp5&ŷuA[@)ry91X m圬j$fkMts&jk=dd\Ku5A9jK`!)):Z 7?p)%yY H } hԙr_A +߈lP^3wn>s`}IeT6p`ȬNe 梌=^4M)o*$5@3ejWD^җD@##B7)V-H9U}sN* ZɿAuPg{~3,inSBRv$Ag)|MRJX*rfi-&ϋ[%G%߶p{S wP&u ,5K8͢ޮX\#; o5{Vgv{//7l JŹcs;l$ T=G~ y wF vZMx8tlb%h]d9l.ڇ;P!MwL +HnԽF5=̔K?-k9N'Y2l_l[elm)7þxbb?ҐBk`fBϨF.6K߭AׯDCQ-[aRa!w9! |)QFDY0A etDHR9ވ>-huh!O1eP]v]w2ZQBxS2z0q] _ca P/{zPF_Dd_Z|TZyR*-A=6yXS67 N2/Y6)jQ&tř!n"d;Fm2q-kk aւb%ѕ$:0k]M@p/VTc#o +N <'*'nl>'BݰzVV̇VB^HmbV3v0.Y0oOn Pi}Ù{aIa<`B7bAGo_h>6UяאY,eusWOViv>P_!ozfiH b&#'hz-tX es +K5$@fqՙammmYR/Ji?XŴGcd݊{ }R\h ޟ5|2u +éDlfL ,4w1[#%dwpoz– +JFE+{Yj\-7m)[]pL2YәM4X܇j dRHy'BZWg/e\]bW1\uqwUvS4''D6"#j#N@MTJ!oXJ\`!V&D5`E#$zJPm=xhZ*\ JξTuFcoLePMxB-M5)5(.0m=AW2PرW_+lxƖhPI(H> #Lr"Ql**3!@Ũ<=kqn{8@-;EIN)) +"ߤO$v^+`"236Z8%|Rmdʄ<4˷]Y"94hd1ПP8C|qM1EJ}\>wl %46/`,J|؆рM>{>ܢVq +{v+ +</?2lX瓢D2oA$ NUڈ`;o)%4h903?'Hˀ`.-KkgN8ה抅ςYXuBvTz֭42U{Ofv(lPEުɕ2g ̊ՅYxԩ|lwps|3&@:6d5jbfsZ.nI%[&9C7<F13K}9']^2{PI i 0b{g+7:a!Iq} &+`+] SQf,K}xdY`iiI15* s&̿+41(H(uQ ䷱ Ѕ*r7!"vR\ќ]K6c +#&.҉cD FwXsej;ԌcxC(eU uʱQM + +(,xK;JK5p$YڙxdoՅUǼE-WVp5myQa3ɸÖckjl*o5t>aEBei(QP77$ Ƃw7Pwx7"k~DGwr\(]خ[%x<,a9 +`l!P؂,bubLgjN<=IW4^= T.$ !r4hK= 'jDcE]񼤕(po9\#ʥ̀(%7Psy+kfgOJ~ &>|)W9AIbdLs\12$S4`32(}h)z'kp"0/uiy.؇yzkX#J$*b ̠|iq" j-Y1;1l݀]w$.^y=h +?d"'>jSl\D)çz }f-o^>8x]/US)}t~EZy hţUX8<+]RCS daԍ~ͣ2kE@!;{P8Cª[Z$h\M& +kaB|?m~ց3 W~wk/o5;J>|cff]g6炇UϜ>+ɏk!b/H9TW>CqN#`5eW&b܄1=zjOC +aM wq%en.io2nlN0N( i4RZZhòl$F{ sc ex:bdq;Vbld̖ Lx'|;N%]3/7IGgC*9T$[$v&MfL)뢀KɓYp;)(PXJ@d/8LB8^SҌ-7ɦY :RSxb5(.uCcY.No`mrW9eB1TTd*]Hom%bmM*A'JB_9`i n­\~ksM:.K.p =7Zm+ tdÊ?`Zū8}R0|/Ոl *Oxs*Q3b S1wgԪt +u8JT'}}o ߖ<.5fVT]JqkpZ'J%{l6T'$/ն5U@1̙: +"u^ݒ:qշ)G|x ^5x\!qnjΜذݥ?!* +Y.M.NNo}H:&=i.JހW07iREn +}3q̥Oh )(/E +I{&Vslowʉsi %Q1 +_e%rSPBu \svp,K*Yt.3ZWx#[m|2 ׾Τ"qNW4SS+|[ճP>a-q7 7IfSDJ۟9Yj}5$l~'" +D'zD-"wַ҅b\p* 2ZXu"WnρZ CNnugAs +i0?̊_z;|*b5|Ҡmg,L]:9%/~(xFKE)Sk[eS[$BMLmC~H/SavXw2lN B8oD^mdݳ9b δ9$XPZZ;bg7}VxNJMKyg5R8&0GT4iFfϓ:+2Bp )*TY%8I5YEPLy:;"$aFۡ' yFVOrס j*.LP3(!쯁rL u$5Ahȉ +d/آ7"}V2jȱqbkqOes?H dSTߛd$vvt][:2$;!(j;\|9%KQ8GdE&Vif4v-g~BGg7B3T]b7+9\c^n[xR7Aآ83Y{\b5k}Afo}3PQ$)رd&2BWr04KKPh +/amnŭ눜ϚB64nj# DwPㆹB$Ip0j'fSmNGi?cqo)[`/*&}Glm+~ &y?^C'`\cXH,ZU-,V2 ĠT/#P }&$)<7#Ӈ7=BfbfBنpo +gm ga/XFO&TG'>hY9x},J 2 |T(ͤ(og\`!ӎ|` Ӂ Zu0oˊ"%/g=b㹆Ü*`qSPra]!P哙Y$=CՋy8Q <Vӈ{ݢ EFE@_Uu.L&*b~E,ZiQB,ؾu׶)c|Xye">MGS:ګe0No#\UcmJW>WL +)y>a V#SO muΚb+ܪM02H`2(: |Ż!qk}? {]6bhj4( y'<朗j1 _jHjn-k.ף)dO١F<~NZ"Pb>O+Lcm)1 /_o >X9[8$5MTpLYM'FvS즉|(OWleven=ۖ\1y~ ?̘'éZU  8ڱB÷W .O(@M5T=%[3|aS@25ܣ7[M k BT9fFuvX +T':vx\W9AX\Y%~@k}c H1޸b@F$exNc+5xJe_?dݫosU_ + 2<<5Ձ&=X9N L^7vnXSM\/z98C^Q@kUvִ@ &E23uy}v@d7"ae6Z1LJu8(؝Ёq9GN_`fʬn3t> +2E' ̑2%.O54wt&"0|+bx8)O1]]ü$A9- U4!5M M6;ήZ؂:rYf> FS6S\cKuXt́V#k,OB<tB)dxj{{*94 n;I\aRsrK*߃%9X-\;+{A?B20Y;X`݂swV>\oY:v[TctXG"ܬr!{NWD|53;3b 7(^l ۉX[8ׅ֛'>alMX:f!.2NI'a*0,g AC}†ˌ#݃kOEj!NP{kwgSrޯ]̶dcDoU +LuX47Yk!w Y8aNe>RؐחӬSB{RKdp_Q݇ D@IymP4RFZ ,s@bvM$=P2i# -G <W//4c}CcObe,Q_uⶵ2$bvu UʋCVC'PKV=okviut aCL.P}{bS4'Eϔ1E|_Stpj5 +/=&f/,,Z?g"VϼFiwgxE/*t*NZEy`Z!\ 0׬kKxqNBNe!X捎 ߦd2)wYej\agG<6nW/9`ݥn$?H^y"[]l +nbŲ 7gO{!7vF:4r q"& +^-N$.~(ML\d`QV0sö5䉒-bmXa"[ YX[ +o*C,; r$UCq@R4ykKϸZmW%%Gj 6”ff+v_3bewd;FdG*&^r^`s9eҿD+K<cK`~ĭw?V}Fߺ9, +EFRzj!NҟW|vdSO!~b#G'AIYxK#dCr,"QHsȅ>JAU0Mix)|э.Z'6j)#)eoRȫ^^\-h?b6 +5Xy +³.9l5ߨ!~`̘妐X GjY#8VbղI&tkn^R06` #~VdĚ6_b68gCfs,Gp/Ja\*w&z 2iw(7:̘u`#Pve(ڢ'pƛUxKThCjQd/RX EJqz4-yyScU\6N4! ei3 @ 4l;R)OU\6Zu ٨])Z,@V-N3Jx$ɨ|煣:D||&4t=pPr.B̓WOuP};ɵ@0?Yt|M\誨cU(u*/\Wi`]fvT*=SW/;;dЯE,`x!=ˀn$3pT3ē\*F9xb[cEf<4Uۭw4.R@16DSo:y|UaSjgh[0YG` !S$gBKIKG_@kHS9'?@&;,˷P>n \ipUj|[m= 0 NJ-? Ϸ[q4Tws;$lwAyb氜$\)|{VѠ}0ʜC$taFd.˥=+M'%[,m4Wٚ#`{֙xjDMHKp_*=Z ))*rэ8нy] +Q>k/aSx`!Q(_d@Zâ=y>h-0XycE O r)8KAfqnsg \3C/AA36]"ٹcAeQ! +[FI|'+gŃ5,p*RTAp)^d +[Ce`"|NuH pQ91C,N$3 ה@J7Y +kjLup}=)1bh1,T,#BnEgz/5,m2l38gt0~{^__YTF#֮2|8e VH{Z]>{Co +_7MYe),$\Q :B EAhQs|l'-No,eEr 5^/ܼyoYFk$ܑlrsb .($OnG\prQ߱5ʷFpM$ƊvJ6N6D(&yւ^Q̢Gc_λFPE4'r"$mn)g$b bi-bY:u.G>! D~5pL.Jˬkuvc+p۶()Do7T`d +T ?T؏EVF52KN^? +ZQ20ҟbI_J٧z;.:u+ٚ8JB+sgXZ]-IHj ''N8| p;4f.-(&RYį*s ǏB+X@I"0t4.e"m0䤟Y@w5GA{1**7"bN +<5Ɔ(7{~ơ?"u7UJ 8(Y莁( +f^3Ώ6 40xCIB]U?&A /_НNlP7!Mc;<,_&8cNR|৩X ȻӖ jv[lr*,@2Q:BS 1|̞msS>dUPjӣ ĔǗPH2U>hwZ,|>>.f;QSHʥ$eAedgʹ]"#LB aE d}Pf:prs$3'PK md;Vfrgu0 Xb+,^O8P6/@mQ*szͫgYej&ȅÈR51ƁaBwQQǚ<B WÖp@Ub@fS?:vW[Ҽf6fc=]C[C +E)h螚jk54nlAdv%1Lx̘Řc>]|#kYX;yIv(ו \֝m1cDU,kQ7U)jN%s1Ѧϧ~T v:QW7q?5(z/r}.wۼ$pX @䟽_U75Oa-ƎR38SS탃;`rgriRISL}Fq" +r^}V/aO jrs|ieotǚYz-ZskCMV\;wA߻o4d[R׍6yZ 8)Z̀WKG4Jש -TLvܷ:ocNu >I<<%?5@y_wpuJsv"9/o궎XplnYga5~0y+ǞvViaPMoe{pwqf p%–"*4 J1d{#ǫs51+*X% E>7L1,e)&wAo#|6,r:g _R=cX$r +jåzʲ.Z[ +_se^6ʣ`Zn"$,]^Ƴs8/-V&Y`FRU˲4$nrF(ube`OV$3^@hlc!T襳Ѕ =E^M M'R2tǗWWP$od 9M ŭ~w؝T*:-D}6ŠmlӠ_Z);3hU]#޵dqj.XϺ@RO +aiЧ&dc٥~N;AIG8!Pc<^eѠuݞnaqnΐ+y9ʍDjOʅ\%ߋY$`JPkb++44P+vMvN~Ԋ9<߉"kUuZey=t9{_:zL NJƐ* o<#bP <"}<3InA_J# 2}6'mIƲU0V +LY0S%u,D1dS9 9{rIӱ_6{&~َU;MU``-]Z!uQeyo2 ~U%d֣YDޫ/1:4nQ$ZXOR | PߟWrCK>`KeK~5<9B,EbTI*@MI%E !Bװ'K wOo!R}H4+o693Sb 21Cueg]Nq#,A&3hv2 4(9\R:Jz]~xhSq`$uʶ&cx3s"C t}{nūcRϺ?B&UU1OȤ}6iqrF6@=D6tkM/9sdlq|4$q֚`Hc_ZuL;b\jX|aœ| 'd D[x:az},m oG5oAɀ?akMݫ`A~IQ B|Uf.RAC}Yh)|׋L\p-IuDXE8_5#9IOe+z$*27΀^*?'Z9 p&.93EΘkIlhkRqe31ʖݝ#lgzsh /$% +>'C#GzW~'Q V~L`JIJ6,]w?0yזf.u++c Rk +smۭβ` +y<=E#٧4ȃ.m&S;|V>V5{@(ϳSwC,#ql"})"E[f@o }V-YQ-,DA&*Eѧ5o>P.K@o\!-8ǴWaY蚹xkWSz7 + laN&%D"NK70G_hB 5#'T4c:Hnq!CǓLGǾف,\ĊDs1 u2O!]')),g;&ir/|e X:y#PG:FT?tP% >ʝq@s1#H]~=`ʣťFl %33c:"7pǟ*nm[<ޞGN +f567>5>w τql6t@YZR92r_rFwS@& C&q{[%'ֻr,+(Ԋuo>HѸI~dT_S#K& +YMV1'2A~jarՈ2RA Kgg3m"YHE3e~5T;BY]#)(ZX;$l$滝 =kn]䠾Q LYXO[|I$[X )(h@ko"eܸF?[F h $  +AzfRl;R`g4屰i =(FY:.9T)c[.3T}B`$wQM#[ղ9Bdۨyh&hoWY,z`;İf:\Q,oO0Ʊi +K߾;25Ł[{KMcoRlm4 %DVqlj0/[ӕSBGu[0ڎr4W~,;+ 4r[ Y(K?JZ*rLL]Jvc + 娨˶HL]Rc7BP:< LaŠRbfA@A2)\7Q]8UAa$rgw75CԢZ:RHN$e8h"׃{W-<–-fqpsDNѫ0/c^wh l撵@/5OKp˭v cH(dTEaXa*79 d1ETru}ze6L(^DSFͩ^dďH-:*4=SgƯ9q؋]% +HICۻ6uw__> Q03tr*~ +Av<Ĭו{@ge "IV߲ +pEf[+‰4HF/:Oqx?c7 4N}H^7#u!>oV$A7Z/Ho gQ0Ͽ$DKR a5{ii7@N*e- `{Tб6c*ZY!*c^n봇HN~@/ P0 7P~TѲ r5gFK)EUp.1nHȝSxځ){) +hTƼdyCg}Xi0{يf1lEIC4#~{4Khy9^-Ƀ$? +ㄌ}d|tw&޽r<^{ +ZOg`<(<3pNM͏ <{'-IN+vf]QOśA'Of:牥F#Du6[t+3qouMT m&bB6?#'|XHVBUPUA̖gaNG +}h佈S3O/?wgzxu]f:Y޳0J)?[9MNA_?ˍE*뵩S/ ::Wo>hHbuB)X0FXG/rI? vd0hmpS1Ǡ]hD7`pK6FP=C0Mpri9/s*8U|洑`"KDĢ" - +_Oc1e1 r^ʥv +Ջ"JA CƓ"V$Œj%F8IqլiU0"MaWLFwG>T=ZnLRul1<{tõߵ8y[LgHV5֏??cb:XNͭ.,LaGE'ޓ~%AaAm9 eE.ue_1_x/Ӂ!>2x=z۝0ܫHf$@2A.NQsW>XؤOAjvSV,s="H:)A@J$45*"eb-꺽thW\4pV +U7ةE_lн {2p겞DR rGɇx6H-4;"V~x1EC,6[dV2l[O.rAJm;jM(\D $T>=Gm֝L:q1Ne +>Uyk4Q-@SZ!cx5%gAMRu:9v^9`dF .mjPYD3F퀫 05|]37u-!uX yBhi?Z;pIt}8mq/ZΧbTȮp{ +bUBʢRnUfܿ$8ç;"˸!M3i|c V$ԗR7O2 [ +DD9 /Y@rNVEKW }dR-Z.X|L_QvDS* :ݪ*j$ݒb+ R*Ͳ"\aI=kFkѐN3cCXIۖkcZC~vzw b`2V:K_]Gf1\Ү&is1;:Q +JDZ ;ed(zM0?h_\Vm_0Erߒ%֏Q%]# Ի_jt++% clv@m)R@rc& t zDbY¡hn`7Ö46⺩; +g]i6^U]ɢ0XboB})c4 - 5T>*\ +fTʼuSt5DAWj##<Κ9p1ܸ+\~Qܷ*! %x'lz6U^vdj2^n;Q .t?mouSƿ]QgNYQij9W-:[?]y3$ar84Gz&`\Vy12B}4c(_?Ue`j ,+5b|W<$K"`#/Nw2U{ ,BhrQ ]GUIibUMtS2g)rjAҁu1rcNj:8*t~G\&MHql 0S RuȗVz>4-U +  ʤjg 쨜aJnpвWֻIvuG,h9ȜP?n1 %wT>j:NݵN+ӉHOT7#Q{QC.Al@}&hFώB!vqf'QBZQH2o;̪S:0YT+U="{WD<i- oݗKעҎK>+rtީCmFwCr;.xp{[MQ G׾,g.~H +xPǵnhCp*Ԗ|zUS҃Ԥ%C*sJbD5vmĢ_9'o> + +BgE7xK4O*USdۦ Qѹ7\h,4{yu + 3{"|P=4$9(}W{{_2H9a,3K 9Ruz۔And rcQ J&RJyne=O}]^s2 ”}VYց FÇ9yV Hfu>em?a itϸJT ⡜&ej\|y6<ͤיcMmo\1CBzLIX3K \sF[nzkk)g*|X-LulrLv.(ߝR-**mkYdǫ-;{,f3i~{qfXS%1]]tf5璚$7q>JEp̧:_כWlS~0h *5"/Ȟfٱުo<`|i'D^"D}Kg33! I,Zp㍀T{c}_ƮfC_.[OSʗsDĺ_-$e: +ޗUnJ<`u ,vECk2dASɖH#/C/3mА^n̹}6.On\mӸN(@r+"/o^1R L8wQ5V2Xv5WA :6KqvB bxY⍤KiaVbgā)0F(W^I51$ @CCwgkցY獲b˲<2D$t/܇- :W }G_zw]ry䘑7;N?QrZBfDm.1h~HV1XmoM^hAm#g|Goۙ +%mRq\I#|Ǫ͠7IKJ3W] c;mێkGJЙ mnԈ7ЫSI 6 Tfbȋ箻>[la9HIWB<1ʿh 6 +0LI1@i͈袖UIڑYoEl9+xGp,w]W@S*?O=j]U\H1$Z(i{}n2f=fhʞeO)gS{gKiʜm_@viWS-A k_iGKٺ4F);^nyGU_*NqO=n3(9?,qhlH"#CТC +d4 +yS].7im]#%qXYQ/5zV( .oSq)^s`{XaJDz0z >dE0-3(qz <x]7unzVUov1µ[=#1qiXa}+.hy8Q|.uK386z nC}{KmZ[?Y/q#`czNq4J6B2n.wUi86>೷}c73M^M降֓㣪/ܪʊ3ZOvf ^gܑ,;9)Ryވ+]6=s47UxAGHxzȔ +f $yOy}Rz)Bqm- ^zyЙ8|pqtO._yQ[lpO񑈖-E7Dmc9K=|@m9O$I%(uT4E;Էhyt0Fk*%\Czˮ}7 ͗^GEezR z8b M EM JN6vHkH$(!VRxPztpp m(z='fЬܘr-|"%2oɹWjv:|KXwRpjoIj_Vԩu5m{6ԚlʿzUembK Ұ;Vq]w+"7Sވ 5b{2*lZ PS SENJy+D"q't F;5=}ˋLL-ICCv4;HtmCP'uuՄ6od MmAk0CģUV31V7-^[z: Nb/l%M?}ЉFuzH؝q&sy>ԣqxy^'o ՚hg^@ӑf6UK;Np̪#ԙ+U_3>\:8x%$93Nƍ&+E s0 էӁxp6-<ܽKsA:{^U9Kb:.+F,ޡڢ/)_ϙA=W؁M5]Ϊa퐧(h Z B<ԒϝrCx4 `Pb|d?u8]p 7Dmw[|M B*/Rr؜IFd:ve>٩Doî/ZEt%;oܞ?G6' Е'K^OeCC;Qղe> RlCelQ$2i؏a \Ce!*62ZTW* *5D'JS+gh;uaR8a\VheZ6q}kU-Y @%bgh +^{]l·ղQK"͕/uk 7(}Kog0?1?z6N*V`CRJS`I72MUez{tstʟ Rf|Xg xNhvwCY%0/6q`]3Jp7V,4(0k{̇$5ˋdz陈*Yċ(.![p|O5O"fjM_al Jj/^[o(jp% swFJ3=h8R Q{ibdu M=mWEruޖ0]QyڶoN-# +x]ML`s(LeonL{p3xJ BKf.fW/@@MAmQmʻ|Ʃ|&x ۈ۹CNA`GYL +wvKةx[k_* evxkW[؂ W.6'4_HyЬW^^<^8P(|u_WEƍ1x&?wt9Zonhh=oHū !QSD2Frm\#LsqYs'2Ww6TC=i L̚7}UJZ<ЅE1).g,HRSحè.h]-&Z|Wþ3=O'weE2EbS/NNSxzS?nRGh4R9 +R9͍aFaqEM /NjY~agc %Kvpr0:LV,''E'D- yDBoϐoJ WΙ9E@ls *9ZO105X \Mz +T޶>Vmc-s)j?מ_DoNKE89֐L&<6ʪ"r9byupۏIgNRjG`Z҆1F(=Ԝ r0vGZŤx@OJ8̸vbs >ȴlZYMm~IMJ8.|kD?3e{ :&T[კ!x=Hb M oI85({YMHO]nr'̩A{P\e=oLJpU^2_=v薺.E/zM"I+Xض}2?MuljH@AIy{6A2]*'.=[IUXw_=[׸?rVvaeԁh:Ib} a *౷dnHDQNbc{I.Jm㥧aYK*4YAPp8iBLˌAg {xJV[^/{P4q/ OPgQi7Zck\jo +&OGŸW7KU q:+ǣ7^ɱ,y<|4\f؍Smf_dS7ؚ`x= X؄ +UX~TwGڜT+=OfʵoqupSK&GZ" 0a\OwܿA}r'4%Hvd.IyjlD)漇o`)h~F^K]rt* ¥j6UeƳ` /FI~^R8+F'&EDյؔLx=I" Wt7I0bMnρ>SG%}N5pc^"Y,K7+mr +1I4ς)h=Xf fR?^ mW;%#j[c)KT+g HCP' azk-/]{NPdҖڴaɾp/ S[ܧ`[Ρsβy'kkhŨh(t'vC㬻pO1}?/UX_2l]-FivN<ŐZl ɅooTw0yR"߸,Ci=*f^ϕhgr uɩ;f3޷LRn +AO4 ECY<&o~Zn''V`:+իz'G.DWm{@ur/*6L$g۽{I&:R>Cvc[\;2>-_΋XM&w0LA!.q`xg*O-ka쏮rF|;^Ȗh]cD?O<1^k9M-nH.;_d,rB*i+u3Q3Յ%2w8KRV5(Zdߠ͜ŖpiA! +Cg7 ~r"úwxW'^,2:{El ('7 ew6DKK(2–~p$qUS1ݒC>I5iqlpo)vw<LUa9q>fQnzF] $.f5Ը(#V_2d"Q@g䙷8@dL[񵥮dO?zioXF4K$$U6spW/h}͕&R5#&;Ņ Nort4_1D3t9^unfDY6ՏDUo[Z8E΄3}Za D@r8DGeǟƸL]J. :J㜭!,M_jy(V=*۪jԑmJ% *s8uM5VrM̎GF;D>qgZ94r!<3>DmS%͹dlqH8@(l9lQ.B:;aM33r]?pt]ofޥW[흰J?1d4Hz%GQkkN0v^&9 }m9<_5{74jH[ebXM3LҒs>iE +jYuVIZ5qOs3ohMf}xPRE랼ZRNo’ģJ[yinoss.)葻8jd]A+C,f(}Rf$>stream + P@x6I2}I1'첹)y?(?no o]]t:PEW\9U!g%q.*.fuIsyN +^2_S.OOukgVw}= +sCZ$y9IȐI? 8ViՖxȟdhB&6rT8X{90[: +`}υ`.'닫MB +o<6FUaVj,wlACCuu]|ClF0Hs1({O58up*sa z0@ÛK?raB~j`fHY)/c,-kszjw ~7dB{CS_LV#txݑ`n*@:w,>ز0wܔ18tJzxX# ݚIFv `-#oRtf!0ϝ^)*ޔ|\t_T ZQv1|Ǘ:[ 3jZv{5mvD- wI΍4޽ +Džz lHEb\kϳ|Gj_,M"qD`l.3 +#}MB9MOY_ɷ؈NӅ{|7-٤~;JFք*em21c C}%`& ݘ(9=syMf <Z39vKԣ$ 6 +? i¢(I^P;AEJyLND˦lͳ A)`k"n<2fDJe$\@[/KlFgix udW>Z4f [4O15Ss6k2Cy*^l(z B09 YHxP"UJ`vMQ/]Ν-eR, laꍘjLQ&ji3cgz˭9_D{g +q݇ls/Xϫ'Y { +k28OZn{{B6%-B[ա +\n|?H"Xsپ615JT#.m*qJWw\!WV]p婞JYl;GEi_j(9KzR U2}Rub- 7>߇갸% '.‘m8XsBōlR -D2n?V4ID'_Su4k/H ׾ݥffz/dߣHl WW}:UAnJyR4z{* 1Jn2Be a/17] RU>3T׉HѥPKDCri ƒ_ y^4̙I~#tZHJz4;V-N3A3'ZPҥ]GI?n[->L@]ےZ,-4F_"c;ՔsYtLA\>ÇBvA~xèkXk`0"Gp̱m2%nh?siG l?6Ċ 燖I hB>2,kQ\D".NgS[caAjWZ3if ('!A|/W 7QڞG6NCŔY+39 q$uZ*_g\C=}]R*vNC +-ûͭ\H4$l0z S󹞔;%oWד}(ݍ2VZR'+jpY1IZNDx^D'$PGg4VȌ!zƖ{5kzFO02iATͻ P)BHU*cCl;_ɉ)hN: a¦g:*:{)R3<=%urيM/*fu7AV/"[aqU]o8͔pIb/BP{OHſn4XB# !ӕuĩ %JY Lr~`|.c O=QOdz-/7OdTO?4 G܊fOp-6@.Qg[M^veOMw.n8#W3$r t~' oy +;n|37[~dp`SOtMCL⎅Ӳ}uF"LTn2h_3k.aZR0}YI!Mݱ[)]fktY"ydg%[׎0"Aw#%1-W@e-ÑeDU5`H KB}=V4`vuj`eevFqgh/^C2YlUdRǩ}8bAbl5ǜay,ٓak՛/"+dD(hF:ӻYzDQfm//CnFQ{vx M׭dSK{ EGwKmyJ/yk{i'T13t`%/#ؼ@%T$)/[*@  #z7dS<]BKۧ@t'ͷ<:Iv֦ +\XjvYֈ_ڍe@ lAJd(>#Ѕ6~;02]FU~R!ylΦd]ӫ,z*ЌN3)j$BÑ"{nKks/o3;6oѻaC?Rx!I!2/LZXH*vbJo%o̼4ts, 2)n +MJruyJ(lMj;Pҧww7 cg}Lv/FlԸ+y,KӒY=,׆ޮhUYk!0e62dYFM e#1d&XGM(W9/w˱ANPaRͨfŃQMbkGfo5Hʾ% x]Ta4PN[_p?Ԟi_(n!04"Id;rĬ$(;hcx&>)fG !>DC ckѥwZJFdēُzf.ܕR—3O>d#R bg俞Dam>po_hV/MTpAPN^^@j)єyC{) j"bbovQZtc0% ^6jaEcǻ"+f-`EB'#ݗȪD!#T]$rlP`7e<_~3ݗByB6/0GXi)-U f>Pǟӛ8X鐋zx|qWeW)䯣[xK?+DӉ}g'*vY:A?:.<et7BU~DYn}#3¾ ȉ(/ b+*d.hBJt꩞zdmkoAsow,zi?l rp\RD' vq{GVBtP  &MWic] +q +aAӲ,&c&+1ECg%Ӆ|:)4/қ(NR[&$?Ҙ +].מt͇(;Ɔʞ?[X~ enLyV<1֩=f9Z0Ǐ\t?!I)fɡW w#-D]Q*r%Heh#kOH9x/AGF%b`I ngabH@vP\;QEż }o,*>4Y12oxEt,l"Y{s>6:S W3!Qz9d]-ƒcF`7?4U,u7ؒ"^"wsT.!3 6O~E`yŀXpggQS2=|=>r+\"O^yBjʞPg6.hۧz4}Cm֪ɟ q |+, bu"&-C)u9~ /o~B5IVSڹ`ZNGKĠKdf92ƻY=:)ruMT:gj6A-l!0Xц_a୳gE(ϭ9~Kx>>(<%0OE!u)eCCsfZM1N*+%f +6|"i\GI?/-xq,pL˽Fyɓu͟mR?@p/3/D59?Eħl_uyx",VG9Yfa(>º]|N8;OS'.!275ܗ "C҄0kbo ,$TK3GxgQ)L`1 +W'3qx$_ӷ0 v!#?>!|bhV֫xj?XJ銷M aRVg\!g7α EzieXr=Y]WNb5m4]EFLZ@R +XҋS_IsKñP4 lp4+UAvqhml>IVyİ(Bnm2wo)IJ,TWnauHfH[49>߯oxeT-;L=z Ͻ'쇟W`~]fU6J Q1{ωf籀' 9؄N.h+%'N3gTWuXL׷`3/z{'VZӝ0=?Z8Q_f +PDvz!#Sk0 +,#Od%>`(]zZߋv^.OX瞋{-0ZMׂ`]$-R\n|vjv?ee3&Ϋw;Y-R9 UmO~1UP;Wog8֔Vr(DHggvά$a~~@5MX{Sg PLfJR&Jּfaٷ?U"&΅S}.Ee얃즁z44o=z@k@X] oY!E,\u*\%)f?= JNN?;PWM(dCYLgc&x[#d8MTP&B]p膽j!t2 +3NhF?,7,A:1 _Z5ĥu8%gaI^0$ ү 7Uy+ϊ#DT55)QY{ 8xLK '۰f\|;f4(Dz" j/Cp +XF da/IvhٓHT*%_E/VQ.npQxd$XXg_vJ8c jQ ,ыoLYeJxȚh뚜Ej(ᶨWCLU0ݵ 5gJkErM PF |BV7Hjo0gdaU2CHÜdyΐEڼ􀨶-`f3쯜ϽArptyyGN" +v( 0">?Ȇa +zH(f2`u)N0]H)Bjk]FT!Xk$LM೬;N%ݸfkA/cDsCoBԞn%Yžd+]v-j@B/AAEĚV46:C%VSG:@=+2& +7 +B{ H$WQ``ZAI +V-fz&~؉ŸПBk 0]PI:x b +j৽H_4[=9Z# 1({>p>O"4~"y7Z1;jN_k?8Z6@)ĔrDFśttVQ u@Æ@o̞~.T&p3"E\+RkqV}]CI]?17exӅX5EQt)ݽM~ €J"QS@E(vJdr(a.Ot(lʼ;DPȿ#;$ IGXo|"̹l~s4N{j(]V,.L'X[_찿ӱ`eT1: Y1h=>Ԏ#^_YH {bosFrcEoIPWeFL7DkDĎo04iYyΒ[ň/r(ωPd i)ug X6 Ǖ!}/N|قI5N%%_F`П@G20h} Bt& 1t/ }`E|fhAo1`_l +EW٪V`pІJk< +j*aB),lKDM n!J9oRضKFȴ3fYBkHW"XѻYa#$LB Vȸ4}̓>,f0Ó%f9Yh[^3?О8Z0<߭U)Ufxx<,d"PejXg#iU֓uRЯJdu̶b,/g\Q a'}ϪA5Zc} -Xt'JTŕF_[_!c{[!RxڶYcb*5 ++I1'Uh?Th-63y1l /$A{"9^/1E>21hi63"l /|lUbz/~Jǵ3S~yhDJ ,"eks9B#_zTeRQ=>6]RIFMK +q}JJl0!zi! +X5wٱoqn8snr?O"NIt84ϑ!u.${}Bp tg WU.^Zf k,W#7~΅]--7V|dJ\Oe/@z K[ZYC8bC*sƞ+ ,sV{rRӈ%U Y\ +| blDA@n<#԰J+ 1QocA^H(DB]w4:4 +$@WTPȘ[QfXlhή*[ױ։ '0͊sG=F?XR=pbIHc:i,L ,0[OX":Cև=܇L.Is~2><զ[0idRަ (Gs3ƴx`& )^֩Sc*h\DذW:Wȣy^yp1rK2gK'K)ukR z Kf؋#(ĶuJ9fK?:g%KR"P]4KvfB= :JU 2H 1[@f?@#I`\A>%bv}TVބd6rmˠZ''<# +R1 8RkLW龙 SIӣYoS4 zH uǮ󞯜X I9f'YٕJ-[ʚXij1|Trh$pe1Lgf$7 bn hhSgc51DH10<1G2s2PX sX[rsw ||T3N.쑓x%];Pݷ+D(x3Fl9 ]6eS"_7(7FgUu#i;H09́v JhaO;GXOԥ } +PJQQNj e2˜S]J^B~\,[T +m WCXr|O1kJɷeXĪI\8D[G,= ;W8LI|iY1n$Y%r2 BI$½rkr6m6C +ۓ卫U@?m$7ܵT燉;hWII p$ {IhvCC6 {* y[MKPvRxK*rQ!eMaSV(# .f+~LY#ɕ۟t vqoʇksvRS- ;)qаMEI=XkU{=9|}JÈKCMY ;J5j ++N/,,'Āa dޔcP`U 6wH?Fۉ"jng:Xm o0"џgI-Ys6zuu9NZd(y;F~'ӽz6)$=B/1]!L!1Ɣ9SF_NBI!qG5 gKg^a_"A: +tGF Q+t>V{~qI> +U|^-gZl0G?i76X֕rPJ ZAǓP_̜$C}8aikM*, sC' ~ET[2IV +IB;g.HqĎ#t\t7bBui x ZyCb+fRgԅ_-!#8/p17^D' +a$(ko48^Io2C+h$+aվU(moGsNp]b?UDMZO/>\qG Q4=Q -^se|&SCm+aܒWa+#HS}^DJYV]W𬆎3ks2h>"HIP>, +Zq}3NbA0}/ܢ7)6ȑs@~_`r'yNhKcn Lvv?R=ft'}nnƢW/ '7QǭEY[=qɱ__ +nO^PI +g_^93w+mW 4}w2{g ?6xlIBG);uEt?p__7V?fL1@qcv):ۇo`0Q2Cg;iZx}KU^N3HO0w#h7U.tU +(3Ypw?KnƛʺM _қ}Mx8?0U5v<-w'vw<_5Zʈ!EmXxXT{e@\xX%ܤvH(W; ]? 7l6 O*njk}vSʓX[%ԭcsC"¿V@"I b#tNw0dn} 70|͉qa$\rk"H)شSS.#7/V+;=<3vJ=1gy[/M)^HlϮ(9 B5z{^#&*_˛a-,y3 +T"j& +qmϞpO $M@\Il:x%&ؤ=`? əbKjE3yP= Id3۶&/6ITjmͳH1N]Է!yah`,q™͒[؍ +Iu_Cִ\|F[m- +@C㛣D$t:9&C[i:滰 15|gx<(A=5Kڑ^E]j=tK~=J. (ڲgho6c9o^\`D,Uc6=`mS,[HItCrH02B(ﰰnB?P7x~־Z/Mh~b 6ػB+(-S0|P=3)/5pܭMV-^ױkϞQ grɢM'#)lHB:Wd!fϛӀdp!M1茽_pݢʖh"Jbm[;> ˆ3[f LM0,R2_NsS1Aw&6UI+tT*Er}~UqcڲpBE V*o"wțjLx<BR2\nfcޱ0&!o.Off%4 .:;0oTV@ ѯ-bwp^}*0l53ə~23^qȣPgVPT_ +RN.܅$a)-xڇ!gie"CA*p̋g]ur{,*oqڽuJ dlrJG>=_MRE/6]h2(S8ŰR^uKĝa)Y1ڻ0 y`- +mCN/inrGiR}AH`)%w)E554\ݠ^؊" P.UV87;)і2KF!Մ a&/Gb͌˺\sF}g-t)$puTzq=GpϨ3vwvH}Kji r"Z;?<ȱ}##B+1YӑɌښ+b!2~7IIҾ- Sҷ2nXL\6/A-X`olTFjXG/¢ _]2}&tRlb 7f_oa[̬CD([49# X` 3jp -ir5.*M *w|.lF$ݡ@wW 3(sVϋƙR$lҢ\[oteޟ8FPɧ!RM#]G ?_iH_Ҟ.ts忀@"O9 R0C_&!s7F67uiLF&5t)]/ۧ$} k*3v(#R ߡ# ROMV]Gtc=/4xZ +t3l.H>p%}8-8#9NWnɴ43a*Ӿ_d; 8kZ2VK`SoaÂթgLqQ+4.rG+v $B=|,&l eѲNp<biXmrsH~(,yv(,XLniifDӱ3I ;|Fd:p"UP .X.t]Ic0yBڑ|ڍMxhe--$ӗ ^PZY(y>f*12 r梛P)Ew` gD/+Fo"w5O@R[i~ICK!J#Q rc1?LƆ7S lY^]F ҷX&Kb_- +Doo:UX%pd4#m:tmʸ\DR)Ћ.X$lc.u J!]u%l{Fw~$nVHEjc~܇QGwg:-c$}v; +;Շ? z}S'{;4;]Wj?ۧTK{ 7D YxQјhUߑ Utt,'Ŷ6U%biP}SnYݟc;-Xx7l/\/?Li;\Eӓt!Kӓ%  +ebZ|[\ؗ+xYu"xuEK5/t( MW\z^$s XC%kS;w` 7 y)uj4vYbo<+0׷+R_1bį«{(Y5_ v}bb }лx৆:4Pi78{ETz):TFR遥.CA{Mv;@w:~䫀$1S4d8ENSc1$rbM{)V+Cv|'=U& .~DH +/i7>Hv '˗ߊ?Cl_(;1P=ovV[ɵ7 6_9on##Ai7UZpT%_bg$^bb 7MO qbO`0P3ZxF4t+!j0p|rlY{-Ĵ(c*4#fo3!_t"Sn`f{"0IoE'M*vF!hcGo<s ]¦t :$$xnv)Q#zP?9LZV]xهEM7a+BY-A˦=El]r8X=0 ]^OGZ(lb-._7rfٮQ1ævʀB(w}5֤SW0z y,gƫbP4lH3Ɖᅵ`=lU鴶m(=D\b݌d{䍲r1v+a9Rf@њVSi_7gK(Drwb;$"68`ڿP9[q=5hZKh5y-g'5?u kǰcq{ %I Y4qI@MVE.3u"BƱ ׵A0H+{2S ԧČ9 S@mt?yV zݎ?07< +;y\Dbd.BD4znl 2m2 {r cnh!9r@zPg-!C?A] zi}dQ1?fx]>ΝvG`#ngbR-[Dq[]]J3~T8xt6SS$'hв(MLW&&Tob =$՜ +#Uu:jQ"?ߗ%πBwz,>2<+f6Kg M!5(s\Mk3 +o2DLEEcC'| %|I`"tp +j+o>ļcJ  #¬`Ob\((:\m]N/{kkֈs,0/8`% +P-" P=ISybǦvG.B p |YWQK+X% gio!_ I8S +ߩѹd`Ah78+ۆ%^" Zj6Kz +qOoSZԠBoktӤ-Okˆ)MvzC%,|S[cHY̹ 5=+Wq4mu aAg-C}DQ0ɊOhfj|C+&!*E"p͆*0Kߊ$L=8OCf)35f+$+_kVBkP!V^և=H{]`$%m۱cCrQ` SN9[0s oSz5in󌌢.4< |zlj[DYҽF`9)hT %`*qMPdcqkkMyTJ%+ Gռe"_"i.~PLtz˸QeL>IԒp}0?W{L0x1n(Q0l,mÆiD`~Y$5YM#zӀS76.>,f"@:&?t|t Ant4WK. c2x->Wbx#_1\WC+=#=C(=A78,]qz9Lw%3)M +*4Q Mr0}z8joAGkC<&ۍ yMђM}xx/4 +W7dqnCN2isyʀ F7t@@~YzZm;2[wό[f N8)dFcsD+~rhK"F1Qϓ$NiA("}ɡ::no-Gik,c\z x +lfëN5Q/ 4$S]3Kz/H(ߖB¡{C}tikfbgTF=̬X8yj1ltM:wRoBnΆز0HW`ޛk{7 /O| ~sk3AǗcDnKKCTDIa^>.LOoX?"l |@`AE0 щoa]LD| ak[ I[[gW3'8RArhMH"%6 kw/vL$?pQ%`; nD bOgKgj8Zur -v3MH6urgɻE)q[dP 40arڈК12۶sAlb%#.hd3][}^$LG;\4Et%]#DF{ ư4mFh(6zEo/ݯa*%GLQ#ZGJGT~c,\UmzuŞAc5DM!~9i*>B'W\n߮m`_w;mNyG.qc׆; +XNO{QJwFYQȉe[4G_81!ҾH<r~?t` yZU_e瓤0:@ X./oy:wW4;R (z"<ZB6Iv9m?@M%æ}wfvo-~'U#|xWf2  + 3/B@ƈE XTT3}ȌCYݮ:W&SHWy~usF2+,0E +)UU1I +d%2b:t]zy6yTOP{NG C>JA6B[܎=̪)Xv\y(}`$Y2ڵp]1=1r +- FQSbm@_E M?-e i/ۼtpNӴx&o; +8R3 ,Ͷ>HQ` ϥW)u~P-u@TzA1{1nHEz6%7$-1} jz1-6M\)CF9rpf !U,z+$vcnu^wJ7G=Z`ArO2E<.C9#~*RCMOG=)@sYbb$*L[W)%5E>leС*Xړ3;1ܕO—Y:2v7X2%-8R+k7->|e4n`קHԅyg,or 0#|~,[x>FAV>jͅ*%N8< +Ǵ 壇!^2[dQ͍QEZ)ߍ@rg.2w`H5zby7BmnN'!"깟^n8X}2#o(wEL:D}_Sb&aaP~*x bPTɻ!6灠Ppbl&Yqt#tɏN^= d-ۺ M0,8ӣM0*TOI~6 I.F-j ]8+'P5 ++4lƺ.&lM'"uV?7'a"ivzwl+qY= 40@NhkwM5͊ʿ+1R@ϸKk i]`El~b͹W.,1E6e/V15eg摑luNwFy̙=5`9* Bqleͮi٪7ϊ sovoH9..NЩ1qr-;)z_~K6APh Imucr8.F7v=okss7e4iDdN(z fEo\b9'YGgҞ5Gl<3sSsWk5M'ӊ´W1G}ä&~ȯӄe|2|=K4JI)wA ݃w#/C@UqG&.rM'-Y9mHW5AͶ}zDY$B=VYa";3A_mXP=_pIV͌eP'IR|(rۻO\M [Y ){dcL% * }֔LNM~{C?2k\s[=rW$On#5p +rDt gYѶI>"?[WI b}Nԍx|AEǀEljѶѲHjӖtTC~q|tOʍs&ht$NNKee猹'?lS_a[\ 4ٽEfݱ?`F׾Fm"jáEvjA +dN~UwND@6׏ۛ$Zƫ3 a}vPDq!h: HuoU0%=hl2toLH8 g@zDҲ%-LAPK + 4&}l8+4F +ճY`K鷡yWLf)Sp&VCPRAݷZbꀽhrq-SZ"~+S3S~.;'LaE ndʑ(Dt"|ywCexRs-5#0bmc:vj؈ +fL +O?̑E0mE-&+e b1yijob-'Rm .rqA¹f, n1D(G%?wS}(|ɞ/Uȋ)\ TUoo<6LFQP1}K"4q ++: %Tק?ԄhbqQ/ X'VO9}fV]_nӪ7=XEω1\c"@[QNiKE|s#= M}$Ϲ֪/[$jHZ5-|V夕s=<=AnR/>Ɛ zv^xP&=e\A ghIs;'`f$Åyi]lcF;sCwZ; m_^x?Xb7Zdcȼ_`Bת5)6XI4h|{V{$`"Ul8W*#=!Q67=M{Bet Lbhnܴ6=.#L3> +gr ,STSSm%0Td1uAL#uyuS\jm0_ U}Ww[[9"\hC֫O2z!iM{CY`>+dȩ#ݓ#zRm>`-R|U ~2O>TEdۣḄOg[!\m~)%2 4[$<[X3W#|x#' 2Bi1tKقXxZ/'A~yZS.S&5d1`&le.w>@`Ӌ<`~G0׆Y>8 =M#F"!ϵAJ,izsXtϲ0'>$X Ov^0wr!;nSW&_V:|c;U7fN{gr5!0 +c/]L9aq.l>t=(@%G +*'2*X3}qDn ! fp V8 n/Ӓ^2g +2ȭ}~:w\z[ulܡuNG/]a1{$L:T3mchjW'][lJnWM}3'GW8]l岶:l^|l1cҚyW40Nn8uucmZ1ϓ|ڥ\!KABVo ?t}` +a{ۺ.daÑn1-TPܝ2s1iS=Ʃ|Sxܪjf)VM=؉Ӌ}fΗK[-i x@«FPSL9l+GH%7!)3sf-rUc|滬+ދ8_I3fp +ئ2V 6u 9G0d08yM%_W*3Lj}EB}Z\ <::/ӌm#Z o]ALoY~Pxq!Q @cg>;*vo$'JMl.E+L%gPB ):5쉦Րxc8!5_NyCű㴩.zQ"TJ>pOl6}TJ#> ]2vzي hB_G8 Q) w#p-ԋ#)M[]HF8&SBG!{{#ZIʼb~` ͡w34&;6\כ蔫d' +<}Ņl+=AhlA/r*tg5SјPS^6ݧX)o?GM\O@](DZ; ЮTBԕ3VY8>j#jɚ] +TSAZ^scy-#} j}ܸ (,/Ty]VOѽFHL0=Cdl i زۍ~~2F<9mAƷ6g?c^}X + gO[)LO' Yi=@<,qq?Y]]k=V5^]䪚քMP ja &VڴR6/B4:slPHlD]'P]@\}I N{҂eh7Wi ġ]X|n f_4*2 +bD( CGuSt'' ;m}UȵuW G9/Sm~oF0= iS̾-iֺ<[˃B-_ʎAit;Qw;!əBTZKm2 1אR0k1>V:p G {Ee'<j̟ VBE%@64B85]]懜C+="?!}#!-HG_i.Ѣ_йGj XEl!19PrBj]Nwn#73 +claE$g[> K;R:BM[~=TQټXyUusDsOj-3P'%N?\{2?p/SR&f}$V%P+縏4_\duߕ rL{! ~!CV;d !}ƾ$Wtފ^}$ ;D+ɛo\޽ŭK-oEe6< +!Re{C[\P8Rꠛֆ0d!҃$|n&z/ؽE2?r *[@sZQ +LA I*k;x=zv CUмǃ~Zbu +\ +"pKP99+v^=9lk6v#IT{G?Yf$p=_0*Ð 'eq1bӎRlı/ܵNޟg#; ES˸o^F\_`rT4'vw=]Zkte[`c+!6& o˭92SYS,Pii?dY#1CZF6q +B'LXϖ~N W~wyv\$bv+6Mh +O#V|[D2P^+Q| G +@U'Q=aR!e@ڤV/^hD-^ʯ̺cV-MԻ{or8m.0)XO +2 , .=uAIa! TX5>plвGG +\vJlLV0ͫxQ)QFYN̜-]gsʖ"oJ}>6A6Ovc\H,V: .Ho_Yw1vfs:I70rC{sy=w$mtǨ,XBWanFlP˿9gZM{0YEv!XZJE6)uvh +qb6&u!!j+Gmx4Tǒ8`VW%ȥef>MCQJӍA#_'D2 +瀧NzѐԱleR4CʻLr4z'򁅏/Ea,H,fBc0D3\;O"?J{]dx ERڍ{20U#C{Co KQmqNu[90 !2|nINx۷.*@{t2k.цG-AH2#< XA*𖊰/ƻ|AE!w 1URXВeG.YO(yah9//"7'CLoOEa h,6YpEgN .DB|l扔+c5M y[-3oG zݷb;2 +J PAې yt7;]*f:{re^JsPzgFl4^".ʀw90#TԖBOX]'4PA.V36piȔAP +l37G+A5_$J20(2{f(^2Kbgc ֬Oeh [~z@I\c>PO +NU YjF.Uqt)3 q9bQhkjaJFɕkJp)`,H="KCJ=lO70.GE%N+Pt#s9A(1LeB%-{|pL8sa?5p~p:+'[`3<;=Fvvo9/Ѩry5纶}h3 Y;ZbS3HW3b˝; Sؘ* 3bFF3 1hʍLm̷IN:dB&|tx~vtc5Yd.dH@UDwgj + :)@4Z0W:a% 6ۙ%m{ZCt +G>*[ BFְ~^_2,c`n:sA +<~@\ԿuDSJn5,ro+c[FZg̩UXj}ixhmK$3qXH.آPI@~] Ғc(af2Hg i8:"[=Х9$8o^f)0D rI鞴& cn_ r{rT5x8da@4H?B?6ur9!ѓ0^0 %eB/ΈL ތ};?;}Zq{Eو;zGk%&*kt'U(no֩7{p?lH 9`mwr)r XD͖QyR[L5Y2ɯ `SONS[9UӍ3>™SzJ br22QJ)5R*>lLs$B}HJ%f>zfN miX?Lf5GssC=) +6uJʅ[>O:?WW-d$]jD鑡]j\y~1^& [H4lj-TTP7jlXJ̹̇ʫ\,ed(h.ڝ/; e{g7ZK}KoT dڋ"X~Hy~5"dӠw[Q:<$<ЉLE`ߝȟ|y@͗T䎃݌` +7&-Q5瑤}J>J)ȬΆ} l56}s#|5&* gTڰR&SBvue0z?:/N2uHwl7kȑ A :50gT7(rSAF\FD +ۂPn.Fva!;FGxM_Mbřs?=nd6B_[.-vK7j>zbw?ZHFtHD^xpZCh,W as=vnr=nd@d3D|~`@d0Ɣ"tsS> ݹEd6DIpuKVӚֹ’%^FW;3 +OSNX:)U;/|d0?LްL(R<ؗTK ĝx_G|{xXgßZ_kSC>O>stream +OD@fk02;"?5`Gqh*?4B_";8ĒT*`,=^4b`ۅqGqBP]N|c)>'EG堸'mW`5Fhvf£+%kT9-P;ĉ5Z2 #c,4 O=^Wv;vmpA[=0:nd7?>O{ijkbgT|d!hg6j=?=J78ӿR{}]^7wT뎬o7i^輱VVK;Y{r BZ nIAdoTT WvLkk.ΫK"K}7 ( ]6ɽm0* 4L+ZN{<.g"$A>jeь-dc4ʆT]}hu4l3*3 ,0q=RŒoBgB1ipAqQs"ϋ +U9i,ry4+CbXJ1kT=[;yHBGVhCK-7Z{ry9UTga +F#ADFA/_Ͼ9NkˈxJbRHv .Im5JZQƒhdY twl󭚿Kg27S֮\'q|f)-l>Y\*o ~Wo'_*(B8AMtKRPU^dIqϡ/DSw9\ӕ +4L_-oB]\ʒ{Ÿ1*!*Rמ Z Lgun3OªŐiB[JA"EW"Q ~TԐN}CPx..Iu0'=* "E`3?:UӳQhu/ @}u^Gq|Z^XƎthb.ۼrא3F}&κ#(cD*D#$ ~LY3U2%י h4+tT OG?\zWȢzV"3%4a"C +Hz8a ZsCG4RpT>OMZj䓥6K8Aޞ ;F߀0}Ya -wQв=HTsyS1hiE55hi墰CB SLh/Ωy`A#a@~>wM=.h Sej i Vi)mcUR/rvb(morÖɡ\ tD>a3;mjhsȕfy}2P4$o4ބDŽ!cd/lmr +Q -ﴠLS@;kV qх|N:q:V󤓎9媈4?$8]KgٓkoY+0J 5h]~VG>Cc}LoDpbq|H/ {r~\u|o) dΚlYgi7 rS#s;Y>Qĉd1aX}\ o F1H)ͬ(cM GT _z[Rq6w?HMf\)@[8%5M /A55qS\9w^dQ҉WtZv(@^}J9{[ֳup~9iƅ@V4۔U'C]fk0eK0dhK)h(L]hIހHtzN=ZT#M%Q}rv%t_呣s%ۜR;T{Z`MzKe/=~a\ jJ"hy`wk3v91Gr!kD VZ}UM%, )S,_9rbWNX4CpN4 +(1tKiRcFz5pvr6^KHdJGQɺ#li0qiSi /@i:gNGᝣ>BU^R t` WUYp>EH‘E J).:veD8ګΐIѭ9W o?(fBBj=N>/274PmS%gBH 0"@~.3cB#1%[5MףQJ/b|[k!R@!0Æn$_>< uQƅEl3RGvСك`)KgF<(3 +u$!Q!^2cC$O#vUO q4|yto a%.,H:kqkev`rfL=Vl5st֌| .B۾zSD/d0opu(aJA+\MV zn ז/x ){uDD]>dm0`Y +\=Ccdm7?}* ,ESU)֯1Y9,0S$ *Rފ :~!=3?2[j 7CJjViemJijKYV /Dq{ڥs!Fnda?d r245t +=4^O(ZM"RB\Ku}c#4\%zsPC*1SE6LjĄ?8jWuCݸ=^,Ȉ ^@S@ҮB 2ԑs3(J0lCt&&z_#/$ yx"Ah +֓`:.,}iC#i;1趍df~X5hedEJ!L0 T0Z+doGHٛ|Q"Ԛ6SPZ s~I`X-&m*o@ŧag*1| [\Y[ֳ.iyztV~"rvm1U# % o/9"u +BF1BVSܙz㶂HiV[UHem@wXUU]CnhxU-=x\v-ֈW׿W wc@و`@G]u`O)&_ NGWԫry=4i+BY75.w-*B>҅ۈ*`I`O٦17zcɛJ>=RS%.sS[뛓.OR o](MO! ķPڊᴪ +qWC'Tb.oS=jO%"Ee*z4ayro%:kK=g^iM{2dY`~:SG]ױ=ae*6v4!ShUE7 >2=EQDX9AXRU7q8"d3o>Ehd=&IJA?O-ЪD`%7!^U@޷>ClD!@bTfNc _8@>Z<nFoS+C!j,/hE} +yl[&[>XU{׹ayYҪr?OMeB ,e3'=0 l1 ͣEo\t"+Y\d[h9ThIR@ݤmDSL郔%Anրys FcB8lTP ̆cT\h˶<-yպ9F:i!},DCaAl]_v tLxx*Tny{k: > "X\g4Da]w@k9g'p,{lk}HS,] ^v~RA S.>#u +-);=u\4pȦgJX9$̌e +Ĕ gDώB'g|H 4l?p΃ˏ9=#`>P +kf383oRC9Zُ୸/}o^;hOՇy@^KpkdJrغ.L?:O菔knXV!ne%_Fn!B6>ַ6?ڇ*Y6 +ey drMuF(aJ=v#j t/"؇?"%Y&YPۣݓvhPj/'g:|>5wH5A JVn uI'Zt9rCCt'RH?E/\Mт(iW.{h8<0p#v+ Ò 3C;OB4V牬>7gX&zuCb6]\G=P@-.ٓ?}}|I2t +$߬v;7ْm`jH}z[siLw qc+d +ayb|huZ_>Kb/76f=}O);nO6~i_f2-`]Xj ^ecnM(%}6co&.5WM$LB}$j s1|f'Ʃ} Qo>?9y+OI~$X D +wh0+xC2w~>Io4.72igIs5n7^g=(B%@0F͆?C8 cD>R/bÎY-\92tS.ԏYV pIwON2H(- nEH츥oWV z| AxWYp]s?7o|p*u>r -u7XRȆpSdg5 4UpM*;|_?C"ZHGUpu ~dF#(lY˱dg[g~<+.­%0\VШ^OϭE8M2n¿85[K&3уg*̙~윢P$'Jyד׭=pMrlůTF"NP/kK#ͣp6PၬsyUy?t`7fVwKxőC!)} @[2Dǽf=~3qޡSNU +2uRYlYAN~l]K0e S\Υ,]Ž!0u5, 4J.UʘW^!>3{WƻX{Ϯ`h 8{hU[yӨ[fSG+=C)xPƑά +mϺ ښqWB#,ZԈf5D04]8 2w=*-XJ,/G!=,lir,`f"7"ܐj'Ko )nJE˻R4\Oc[ȏ괣|u귔XRs3tm+ `HhVi^^U4sU>6ڊFrt{rHxWY&_\%9=9 A>$RuQ]{Q$r~a'F~ ja>rK{uJG5 1>pt:dWA7`,73 yIӂ{U;BĹj' ^`57Im9T83n~LC(b[ݐqQ"}h.T ii[̠=_v/ + YQ(#[sQH~Xoli!wTYURsR'xڬrVTk?b[wr>fUc%-@!Ɂ&(4 3}3TrOzfE`7YەQ'0!*P-2a񵶭X7n߭^*^D e4Oq<|h~v}wfMkٺ[ +C.Im2v74337B'˨~ F2<6<=tǀ>AH wRzg|.+ŸG +SjbuGT/ЧKH2VDRTǡ7mt̷KaPǯخٽ.Q7zJ]1$r/ 5b[p7'W-QpvګO +fn*j!E]m6ʰdp +ĞI3$g81+8&vQ:LהQ٣wM{Y^>4Ri*,r#=Cwwo̸Xw}g4֛#N6xU(a[W ^')1ݑ4E2Sy{Ka65¿ƥj|MAY^*r,f]D#e50╹u`V$/n"N )jF>-N׏1+ {̉;lfZ5D wSN{K׻=j!WCk5gAaO.ȟ@B=S)5Bf;MН{h+gپymDxinW8v,5k`,P#!ݍx;4 AGzKv'c74kL JI +㖃]l 5<M;iCK?_F("^Gێ8_A ||q/g.\UZ(uNA\WK&4Ne/1Ì_T^q3"Ft7q*k׏x4],-LӾIH+-FܯA}1OECn盭Csfp^4pe|#h{.%U; D&vSZ +ddsv>ҖR *1`4.Ր2t_u r6U-|#-{V }7}˃z^[)j)7X kss|Hu'uw}De nFrW/,*d56Q\b02Mdᬊ55W֛"EpZZ-72S M*%yl]{D_3HTlUWvdOVaV\T`R"jCx䮍pFJ$cFϣN1qq1H}1*Zn}J3h^L(2r:?N[Q{v`!ѳgg0Y`ZaQi_~+~3kGU/>"(nҭӼ&g{P J.w69ENAe +iL} 7W?˒YexH\Q1VOs]$p +1{ӂ%.L!u8|)T]  Fʊ=חUjv!SBH%i1̵MVl^ŜTϵ|ƢdL'{I~FBƂ@뛘! 0,0%aAb\#5yBEݍ1l'Q{'^yw~+EQS޵gZw }xHxN[vC/o ȕV%՟?qo.}OQCWe f.1 ͮhj>]}40J!3U{QEBHYj\D#և.57f1 vxN:6~`"Vmw7şn^ :xT V֜,S90!a0P7)OMj7vYz%CmNrQ|6FTL7kJKLPqEB+>[z*^=1XбvJE9a9ƫmbnfzy?dzqeW=tQx1RZ=@g-4f2a󱲬{JގZa!:Dx%+bItoj7sI_SZ.wJI mFQ}wR|9Q62a I1mFeH=ԯ H9*i>+<ګ2ˁS,I8ԱdVD:[ +]Py6G34!Q +2[V̎RrA[b:1$3HEaEB&?J +Ήxki xk)&P-J[8!}ђ)뎩O6~[ONKu Ff힎|^dΙhߔJg}@e!^jކ5V|Uo^w[ԠV{zȂTNo8rr}n"F?NhZg-n;hWӞyb7"H7;۬A,,\plP|wfu_ 9eWSlr)Iޏ,`Aέ0s,o=fBohBDW*,҃*K2[tzmśy}}ꍼrd*Kђ=t!;7Qρ-8z~ L+˾=SE/iJ,/V +UQ }49E-LUiмٲh+ ʱ9kP^bR5 k oK{EAl_3;LKp# SJUF:~-Dwcw|g +U->Bӯ@4A{ 8HWC)e6*%4sILahN>">Vh85~! vt;N\&Y brcB^ 䶭 i-t >ޑ"%/_(|ԙ1U_7P*DH'*4 ahsE]ֲfw+qZ3i6ӟ6A A#O>j#@V*Abθr+_?V`xF&@'8q_s{?C2+^~; +m=ϩb6-#x+I1?yGjs[] JI,Ja_~*rށ GQ1[ÅV'yYG`cϸCbfr W!g_p[iuG!-wtHtkO-j~ ;4NOoT]"O2ҽip:Yʇ`bAc!xc޿>##PLRpjnD$NжUj^)v[FeoWE'͏'6'~SHJL/IvkD֓+ gfp[CuvGӝv.=n<)|C耩s=P# /k wҿYZ j #٫ +fwje!W tѡI\|[jη\Tm$|f]ᨮ)N?bM/B]of!tAyc -qR L$ON]=d4ƪ + +J0h8jMUl5!(H  O$K sD S{ȫcyXT}(ߒ쑸9)0Ѭڍka8Q6FCei})N"I;2 l^LIu#]SWM֪C,`yyCgl#[͋M\|%/(qDLJcctGꋙ.w{6(HwEyYƝ̵SwnEìzb)@ "<3L|bY֟ALzZ#=0$#.ĢC5Hc*iأ=ïڤjVADU#a^B;\n/*C %뮭*[AmcN3۲-~'*˓g!3j*++R+]䁪S+d +H-' : xtN蓜)"gg7טmP&Hk~e*Y<3}>x;u}ERұjP'S)lEK;ɣzn4utYQ{ G;4!F{;ea&rɇSZ[zj|H!ǑϥUvj^xpWONI`FhLcY)v;zRͷGƎ?d dLzPyg,JuTn~ iL)xP gyJ>j$w. +b:F˕sK|pBvM =C@-Z6%o]r_{; ߠ˸L h֚(Q9& m_ k'&๥g\LDOK=zM(4 G$2IUQ0Ph5O0ѿ7 \yV< Jqj1D.eS c"uIn +V p$16fSnelwӞR$U SO抛,)eX_.z!E[jb ((үcZ57w.xk{ ˋ G%NS龽,vlZS9 +%Ly۶q*ʞGyzo&H^n{^!RyDS{.;sy!44/%C%#HݛE3'A{4B]h (sNU: P;Q|z) }*Ok7жza各:4&A}0T!d ql !yLBQLNI[#Z^044=Ƭe*κ䝷צxwģ,*u*s > +ZV"\L˚a/< HP{Z6nN@D,&GEOGZO&vuh${ZzzmFD=L'f2Mo%oBGqҸ-'t:obnECc5M{@ܢF Qfi;<{c{Sy1b$MT^:ZY3]fbᕱ[hbQR]o]Ce+;Hqk G[7* 6Yp'V7?uyG>୤_vڑ`q;TQ5iTGe{620Â๋zʒ߽N`+ܭ9[T ȡ5n̜AmT"X,.?4Wǻ_ԷMy1xzeO-a90;!?~h%/ Ӛ%}\YvnC-,_:Μg: _{2 OG0D*Ekl;8]jqzUH1cr |`@D"}?<&!:#Ҽ^Oj6 +fSz5+M+vk2-LrϤp8qK?}BoM +M+wn)ĵwDˡ/ٕͬH8CpF(1(7 +MB6䃪[O045#= ,Mn[P|ZGK`ZQ ^YWQ8;,'w0&lp-ràPn92\%% ϐ +wC moעw#q55?5a[=_a,WrS'eȐZEH'X\w LKdm v #蝰G/ώit|+}UR+BAeXKe+Yb"-8;b ^4lܩyD+ˡ!ْ0FŞ T4dmt=ďem|!9/bs zYp@V'g'x5耣ȥ97W-Ea"uz#9]sZ}wAE=<$2LUMrь/3 Y¬4bނO1RVD}:{@A1GcPVW] y1ĭjlw/%%\4b. +A4R pj_=аrTf11pQ!vj䵮4%n53{gIqA*k Ř ^HC]Q?] `ucl[mDUԪ ˥(kM-N)"ڇkAQlzWo$+.fmDxfg$\0r;cMrb-TpbsIc]咕n9)qQF!C47t& 3$: ګO'@?ϵ9쁺)W.#n펳%S=Y.~4=%j2ry]_އ;kSϭM _%:H4c`~AT&W@%Q"Y~}.-65*Y\s<"z)^>8&4bɺ:/'c9WJ +6p>Y;dbOPb.`vGk  d=mXiAWYfsDY?g3+(jU8$Y&";/';3n#">"INBìDɓ3DhzQD_!;Ѥ-b +!ih ~k5q5KA [@܅19 ._wkCRzjw-2.͌?p=0 : I呡 K}L;;IaEbTjs@ +|9Z&>NE6^6kDd}ypm$/O +BNYį۬cxj`Mv(S-'[[R߁W;:;C&6ÃF+2(29] Љo(O8 TjI9'Ԍ陜vk=XoO3 v-R7A](d'f/ۗ6&֮J}ؔ$Ea]J i&Ide/w#8kY]#t@1B:ÈB/DAYC([ S Jx +V1TefQyvSN# +jdQw恝uF[ M^ВS8~$vC) {P-;M֊ aYop[%[M&l]JkZѻʣD +#/iQ|ORVS"JWIofʴ(X7z$5w}ԦK{Nk)NHx4d+~S@U d^n6~swwNƫ 8 +W1#yti@{4r eGU>QL-OIb5yeEutЙ5&n46-G2`qI:nj-yƆEgs6;֧ƾ DY,*-z'lqƗ7.-ss} akU&^ -еG㚛.aW0Ifoe˸g%dy17 +/yZ(Fc${:Ue|h?D~\gIa&c)E8M*&.Fuâzlփ18%9@V"pQeRz].4p"XXw̚*zK8:RFkVr|RfFeRq!1ky 9)\ļ}3 Jp^Ct V3 Ǒ$RQפl`IsDI~ziſU ĵ—lh{<7#,GƤ䝡EQZ/#kWUM0~yJ7Cd>"] tˮBf8|<+I9v>DkT|N6nKPaHe`{D +:ݤ)*~LD:]&Бy(5V|]cQݹu-ƺ%_-VFUnզsךּI9Do^^X*#y,.Jx)ȶ)}Sr73!)^\T@Q ٮ'+(`q. f`j̩?{ZsIt181]sEO3*#R{+TKLuI4= #䊁-iE7gA)G!k@vU +NY?<-ZSMu'7'Mň,x^c'|Ua|W m?LJi~q;O!Q|Zj$w\Ą-r4>~*e rX~r,]΅y$LUG93`xT +:U7X=}*a|uJ =p|7PVmM~Y+-<A_?*(0+-OOC$ lOx΋ԣ5୔E$1b"%Dܭj43` Xu%DRO1DŽ0KVew(=ټ~kLVMo)F'bL^P;#*.ƟIƤd!.*0I|S$O󽨄21,fv.]'yu'A@t^k3 xӎs,ҰR;y2ߙ+&.u+7!fxP`t HAAHm-֗aI~>&7$aIG>ീ>2]ˆh$@XeԓRF4 8ůc6 +;ba//Ma0Ҥ ۈfCK!@7 j7_Ud3VE(|2V2iC톈Qdzy8(TUT]BE2pdy]&nZ8A\B~ϵ5% *0hCBr^f zڴ{^Lb7Q3Ez"ADcrK V!B_"9=$u(,J~fXaq(5= \#],E]쵐dâ<$|i1T$wm~Fԝv O#t +@RHuS +HRbV5Βy>GXWz=Oͯ/96k˰ZvpmSEP53%brUU32"|b\mQL8F 8VέjD@aPyD%*̧[rrB[EBv$n+ ˁ_-~X%$F`,TJS o:L ޠFJ[ԭG⨛g]߻`tBJ =1b [ܾ::=gI7mȏc3gH$Ƙhau&Ʀ#WNfP7aՃX\IaH,tN9oCfTLa9sHq8VO'L9v=’v=?d:][:yluC|8lqDpج/dVsRR7|8R>Es7*&"&eCxPݢQ/2n\H9핂&c쟭ep0 ڣv}Z/0k]3ca,&[Ƅd- onS`Ow3rz4^_> ia6,0 3w dN$TX8k„\LD!  +L e~3hU(bVf@;*( +G=S_Ed[\/TX|R;'-SjNF%?2$JsL[w"AιH˵ۢ_] +9 bX F I[}to'B ChLK;_ +!ʱŒ+yd#_*Xg + +.AC+1 M,šӊr)8J>pp6ȡ=#(_ +O4l/O>i9tba!}ϲq0'&0A-~|_ EUuX[\s)W +N!M3DW[YfJ&P?)R/uިfNڲ)?ctІ\J;E5/cSnu'\pً shc0;E/Niak/(:H%}[8~>ٟ!4T8\\D=,"jͫ76@=5`b֞`:'.UO28y_eq0vfTH3RO :#݂tWҵ&$M>mdM*zs fa|;h⽷y&Xum_k kS#!TPwo`JI{M5e{]TP;[hmYcJW4$29b CnqPY 퍳c:ṗS# ? t:V9PV3HO%D.eSt;oP. u 'L +RVBƦbqo@]Z 0r@$-LzBr)*nQwp$`=Co>E%x3.Yƙ(}XaFO0 $Χ~o!K'*%N~s4s8LnO]NCzk'rXce6Лj*,jr9yM??UYUtgAJ$)HG-a$C<VwYAjR*?ʎYtV +V~ĠG䗈4a)zuIs8%,uo)'8=0|pZ%< xqu(`S{Nؓ ϏlEH ,c5EҀI|37>Y ~['TA؊A7GzF7DmhD"y:-,NrztzOB+t5JhA&)kg# XSxYzpDK#G^DWrL{,XܶlD[aLI޻~3Xa0B\d|T?_錓rtA=sTm"B䭩%Lհ̕HSKB;c "nND<29HlJHdrvh\5!GYaD9)(.LC%tB|.K@22܆ @QMݚg[VXQ:q}RS?>+GL=SvUS֠rIë}x<`χV4(&yrtO64}0󮌎oU4aK:(앎󿕕6mKY#+reX~}N"# ֮1>a4t<ѱY7z@nt0g!٪G5H2/B2C{ݥY**Eaqf|D܃Vp4 *8| :~»C3hE5P49tùysI&`1p%. bs ݧ_9ցv}UGrO;1̍0*(4ogX(E^b-PHWXM(k{F鼒\或NzQ^NUH`\{~aoR(W|bPU )-NSU$%P|q:d,&̅n{ 1^0{L=2ӷʨ7\OȜdm -焋C$XC{^@5?$WVtHad8E[&`З{ݭe'?eх/o׍Y.'*a[8AaTClg2Xq"M\!'(ُ_(0O%8 q7>Ju GwU iQfk°t؂g-1ܱ(yG*q>#{AƔf6eƾP[WWvunRmmŞYtK9S闁x<紀c 3Bfm~rꇞt/8t]IˤU=aXν*[!Y 97smQ]p"ģU?+ DE$W^̟o+hvѤ9t%^Տ;QQQS4 xAB{aRꗃ4agȝN%5;th+3= +2^-! LAv?C){/Q\`O/Ȃxn v=jy3Tj7]ʀ/R ;g#??+yBG >L[dTI{.$4-z!lq!okU/*D1cbLtI"ECBJXo{R/ VÅg>vγ8s^V}-U!"030Ă#)'$;.7L ? ?F{|.WɨCN5f> c d%]Zw4Ilu4DP$OJN[!FIfn}>rsӻܓuzVV J2-\1k6QG1pP `/'y_z4K_7Oj*l|r+ǹ8<;7b 9 x^h2MoБC\9d J Ty#!]'ށ&UeeNtx.$dڠG$95Cn\o3fR) +jp.XmaI«Tôovڹ4y hKZTdLIpD!-:![-]a1rUZ?߻?Jr'+w_l? 8hb +iub_14gpf9\:m|xV>_xK>ɖcNw8(U]2`x~^:`9Pv~D%PA%>%ٮ ۆYkB' l/mT2 | }854zy\3Z@<~nkmݲ`v!*$Ҫ{7R!X].QRy\}#z9%!g$؀&d)A]te Gb2-;'xqBQhG ahinڱk'~׶44'Ec7ɬ`~{ů$(A|(/QZi1|Wgb%'nHHڠY.Xo,(QKN.bApii#xfVby\MTحmmIˍ1 +/L_8Do&sgS~/|@ཋ.p3SX_Ű@y^1~w5.b .zU 4U~cu_j'u#A5S: Q*Ĵ.Jfa3%?NKË +%p_.䓐U'|j~FPzI# e;#<*u!;7(ptF!o@c&%v,n/x%rN,Sa-̩qR*#cFǹl3ƛ#\k+8iy5߹P7SͽWH]>e<K +bbB_a!kJP/=u8r9-wyl0[p=?40ѹu5[4MZ.(jm7m3z~OtL:ǺܢI\NkeCZn[F6<Dۛӥ[l@i|DܱdRrk{&i\DqʾR'mOOJMS/ #k8JqGBÈ/̇ wט-l}_P쩂̼kb}{.*w+A7v[{Քk!0]q_V,?TC%mTӬZ:YE~CGVVhG '&Y\8nFǚ49,?jjϰC/}7r[6@Tr.g1AjIr;]^iFèJ;;H8.|TV6J F[ +_x؄ קO5/:2:[gj`FGS 毘?Ul*IplT"Iic +52GG"H2p=:ATv˳IŽߍs(CS-Qqb'ɋ;`5T4 ʃZ^UTBn-\zTǜ>|1rT~~ƵH(-ɩ1@*Q=WTcl߽Hn].;xK|X(|4˞$eQ6_Q).d6;GL?c)pyZ̦M'b֪ËN\RxN Lޓ֝WK~7I>UC${;|tZ4fPa:z:N7{_S,VvOC;rj{>dUalX/`6w&llXc2@NM /3O`ږH_猂-/ +$a~\ A3oP( %.CcHi+s#!8fCr.:tv0IR$g2 'p`$/XP 0.<W J4q~шhZ.jzƧvaZӫZi2 {ABK%+"_lNfw`?{8^ntHӖbVӣ ?+&ҌHt n^?o#O9n%i}>nd +d-FdL8!i*!72tjh`W|'eȤ ?XTk.ux9-hG%V[ X^ԿҺ fǥp8|i xM=˷VH#wjjMuM,z(㈓(Cq`g_[2^_M0Z7lQw~߆գ^qjy rch;y;~D>S1;,ȩ+akt)DjGRęC,N*qRދO+3Le +qHIe+332\Oywp!)M8v~h nv0;F$v^+Q <-]484t{}+no+/g%uy>!:+ߐ9FOmwRϝ' *-]~"ʜHVn浢( [;dbRitv9 %ͮzco +#n+dPiԳY82DV0bQe[gUXooQiIb}Ě]) +'$#E9{7f([U Ւ7N_#Q+O`C)Z\].؈0"Ћu+lH΁0դ[GC/=rko;JRJq xE"V܁<ۻ1 Ňq @&+Kz$GS<^'rT3vwCepĉ=+aKqϛZ\0ҬTl1q-h"O60Z{y5$,2x+_k@tW?}k:A(6fDZc[5F _uzǃIhla[q>Ro)/5"%`~WdaI+>X,G +[ f); cUݚ'f6`nj}lLs)js[g#u4%"l UiV\[Gu̴#PgN-Fjq$>~ȃ͊ƌSDU u uX(ERZ6 ["l O̪v+hŽsVɻ\.&q)'^c "ǂJR S({CZηTau⊀ͨ[*lX\@y%'%ٷy,l61%0kQn[XH=;h8G]XEU`~o2BϱiJ=XR̸bfGn~|u\AIjp5."AP ԭQo"!)QN'@ڴd[N Y R.Qbkh}p7Ff<^{Nak fjl7D=S,^H)Q`ǧe.pq 5s5 @ UxV8o3}͈ړ`=EfJ +k2JD,6 lVW4?>tPj8FjȝF@#EHLQG#DxJIa.m۵!`^^mK'V&.R~s"&>D;lpڪ?}uF J,{v8%f'2Q݀,C ȢR~j@6@H Ws)1UJw7`0&-\M @DUbNv +FCY{4xSOp]vӸB)*s0ì9TŲ*R=A1)Q ^pӺ10OcA3mmĚxbַ?u#|w1ӕhn^TݕK2ewMX< J$i5Ƕe6G +=c$|ف릙DWQ淳.5zQL̝Wu6Z +En^;A eblo2@\o#kAQJx@L`1O,cOGP"'8GVku$ šE2RՖÞPt=˗.9:NlXGg.9}?TPIhGof 6ZmM +dQѦqyɄ4 We <{R3ozjNLTR,q0'.%z$s,)HB7$L9o))RpL0y*N {':lc^_52"A}=jRWr 3z nfgOF]x씭,GHĹl9jMRWs7A<zc/Sy \JP䏣X*zXdpQ!nJ1$5ŷW^3[ȏ 9ŋ)#\5hDS ;SD 2*OLe%P.-V, vih4y5启O#PS= 傍2`B|,.ڹ76;} \.m:r"-@<$c$t;QtC7 4;Gٴ;IFKu1M.eAohÊQ\ʠ(UMkdKWv{W"<k14ѿk`14G8_7Y"6MWxLsK.㘅9|S>Ǒi%8cEMGiM.G9s +Q +:5 Ng5u?=l +endstream +endobj +18 0 obj +<>stream +"ڰʙrI"} a>t/V9s|x0)v-1U-R/A±[Dgh8VD"wuutJCjG- 2dK9lQrbj HKi"/O$HdRJ5BE,_? + f"y"0xڔb8T ?&ކ%rV.K>s.Jڹ "U)[c%S5 Wl9/Δ-cಙ\ ر=bl\}m# q5n6I)a 4Ae_CR>8:1D⩾:hTٹ;InW6< ٜ/+air림5H[o%m $) Vd,`XT"Wš9^24 'xft+*Эsl$zb]W֊̡Ig%hmɂƚępmZGqX c x >@P&?gX6iw-PKUIOջc+戕ϏKkaZ#wɴnj̆Mo7|O_f(hS3QOh_/_+ϡkc5ӂm60E3/ǀ$e? 4W^d4MQ#$_$Q5. >K]j0QPZ=;E7r3DhB >~•1;HTɎMgCɚ_GG*l-&hn%s;?,.DO.u} M'e}} )_ + 4uOYpN`RLUO/{ Lll 2o}>xMru 'o^ۇėDZ)YPb:!:HQNP 4ד~d1+mT`< +P"Y&$շM0nqjzlzu'1muzuT5!q7mኬ6-2B{NfYKMV*Sj'v *o&C  +|Pw-`};գj{yI3A9Ʊы?CD5Zysu{ǔV!ZjSRc]~ྯV 5D p|Fp\D ]'C"Gk3m:)RgJx.]= \~`-.]e͠rr9A]b$"9&L?Ӵ eB:vvtAfr=N=8VqCZ(V6͸+yLMLı#V/ UAvĄOg«pE $aX*\wWCheo׫vw^Y%ڐ2u_ +|਻0d0 +mQ5==&y\.!=a1 vH]SXuNuʼnb@j_v:L.B8j"nYVi6 +3w]+M~Oղ cu}!d=8*ks eg5ބ\8N5uU"#M`0a%{>8|̕'[Y 7Ү=ᮟFĜz"tL`bG=8Lܛpa$br=f7X4yV _З`J3T8dtUܔfU>ȿU7FR~V7\f+H]Dq5 h$,T %[~XL& _@3^ƺU& Z[2)O@jeUHV>̔;jwMڍ :Z¬Hi8l3./r@X~^kcƧy(G,9Hj_Qyc)ig\Yyb_ \Ժ:h$S t,_wSrŹu$quSN`a;ਥ|o+!f ,!rl#P #x`!>V*݃jJ5F%c%}eBzT|e_zZ}l5tGAUXxX*N`OGYZ)P3z'#Ht`0*0n;+}gqޣE'y}Y7p?X<`&_*>WQW(_y H{'+d6YˀawM+1 |}2n+[(LW)ßܫ~-1%m1N c=bElqLfC]:LEVe.# ՠh)TF?<ڔ6GfqvoQ% + Q.>L,Zd|H!* + &֒i1),J6g|(u@& -qEշggn=6[ǪOv^v]kjdqă ﷇuM\] -DϽpTd@/IL.wAx-ΩEKD}IU׺ӑlsZR:u|udLM4L ,)ޭӟY" i@ft{U9VX9uNjP2+¡7peOd 10B6/\B ĠrSᤎ쒢O(%(^mP5YCnF>@m%D d)S,w$HRuvZ#\96+ + zi9WCY?fBlfFAGZS4/w8P~ŅQG@gY#߿6^74{`K@@++~fDfom:."%g|-8CJ^kZٖi_'Zěeg<sB_ C~q3ss=]qy}6Z]|mUү>ޜ|=?v)!!#A( d+;Z_ zf FT9A{W͝ +: Y{/AӟcZzBw ڇmp C, "n Z +څDG76&=F l8Px\[b_gF2ca + Z9%M̅^4 g1  㞐s9etzH]4Kp<1&8/Q鸫V}a +|ldc/͎ٔ0 H#R(ZW)Q;~/׆<67u{0Q,ߪ HG˹'noB6pwfm>VmiƷ*[#,Pco{&ɧzhކG}CWj^hd3 }.ul]ʖV !A1Gyk𖇺az2N1OWM&A@JCI}5/u+;&l?z:j38 vڅk\ ,w&h/X/02J"'oZ!<p&EM$)HaNA蠵tfbYUE6)x35\{5ñk$!y~}O~2U{ZFh r&]@ t&Z+^(LI<&Q̴1b k崱qm-p5/#깸IoCVPGј$ +tɧ64Fg"Stb+q@-`@7lpb -_wߋ2{Xb?A аa52VOCӮI +B,^4[ =xGzp_eEl]iX{^B`7vCLK8qi1jpϞSt50Q.τO `D1R(+NΝB @nW#ΨU~V +PBAhwGwjl >5%)8 csF0ٴv_ yyobC A/.1-pɛ@*袏i} &kNRE"?Cȴm|DuH~Rʼn)m;g!ICk$e o9FJ㛶Uݚ(k?3GEѲ>vLlE%xJ&1ŏOʗK9ߚb=E WΛfdz߭Fe/ / x03=gB'6zdƳPu'yIw,fUKy" ۃ>bS=V(*E0!^ I.flRVxӦ/3É21\U92L+DmЉm/i3 )%WB!ˤ,Ϲ p*ʦug'˓-ʌ?fӵRvzld|l,wd؉ V:q|GdQkE.<l7^JB7ŨPdE Q8W ,Fs/xnyIl?uޣ3ipP{ 6tQ(O] iOlq9˶b*Gr1(h_5&y((0dc\w^eC\0h +Rϔ.F~Oϩ zUy +8e/ @V_F#[KIĎ:cqI/w|˞Md;B-X@ #m 2;(͘IB)na^Q]C(eJJs(7_B'\|ӯ0 +^Da"FBIYjSJyrp\dYoQ CJ]d\T$ +`oeK8z l S&,;[>H#>Ň2sR?o/,G +Bz9=>T9} +bF*)yG  );ALu2Q`g|C*8>ж\Ҏ6#M=Qq!{e硷XRE1KLb1bfy4*(3c%]* */Jd/Eyp_sVg4z&h6[VXlnVpEDMx:`Ӎk x +:xZ?U\fRT.^U's"(v,Zz:h^BbfsޓG_&"5sT5I IHPW3nC*S>.޻XmE ottz},MIښ3t8A&rjEˎԅ$A}SBnX&P 3"{'Cfg +Ncc'? nB(F9"5BZMSU[RPfKq>Y?]w-4Z2v7JDb*zPÿ?*c8P/,ѿ2_݆ sQU^3X2+%/ olxSHv*zJJ8ΡkO"fO<^'sljDW)g\Hxu71ƨۜy'?$A=;l2\ +c囘`}qh /\H7y7*=z'at7Ge_l?b Ƒrz2sUC+q{慏,B7Ov%ߍKW%RKuVA3:]qMw'"xra娴%]Dwkd7rn|Zp(ģ@\%@_mm5( + dLP΢Vz[kb vn'VfH2@c/gԳwQ%0K}C=i7Qiun*+r^Ʉsbe񂵥Du8oUxzpw puzQ;6M8=h~ˍDZ/ xȴ0PΡ3(B%W+ʋNA5ev~JHrpCABfBHXq! +Wgx׿ͿTFt^"qe ކ +7bsDJijz bQ| YSQ,|ڦZmcvx<[İめխeV9E(q2SPVTioM`+ݸ=)Vo4VOCSh~zb){pםD#Lx7 .+!qvxV3/w,BI1sg"YyҀ"KQgX:Z}O ZC-GA) f:S<ٞ5oo!NAߜ1-95֬ R/@BM Aw/٨r~ӱZI |{y\Uua鋠N7lO%twQhEo@~e-vPV]2^Ȕ,sf!&nG/јzI)e}OT2gMڮH?nLk,tK74sP~u|a~FӬrZzPw~m..dqaeșv@WTYC+WINOOe֓"D-[ i +~p0G[BG.z9WtyGS!?;2./-sqs6[(jzuEO˚1a-dc)V8H 绔8[xQv8"!.*7KZ[ 0էD^ZC4rF xMsclz+z|VŊC@ou}ȌᗳEl}eNO4ʢ;0ٜvqt ܔKDvv%UkDNYW-B>Ć'Ϳ:r;j8X|ʃy]5T_P^(]7ԃTun[4zs|֯ P}|{`CR;8 ڐj(4OJґ_PEBv)jhtYGZԲ;qj6{L:$:c 6ЍAk e`[Ӷk'%Ljؙ:4IyA~-|bvTE֮lHcr! +kQ;o\D0:9nՌZ#B pE2tƓ-_(tZ Y<š}y@ҜB7'Ҕq@ƟtXb0.*ӌ *Џ8{g'X Bb{hd_Vt$H<zFg[,hT Ԍndvň37rx4g i A$@Ey~Mg)*8Zo*APpY RkZHmFmYe "BqfvIcTJT6y{h$~-ѕ b7ԟ\xA;n9yG6PKDEdߞoq~poi5퓭`1z@JVRsԉ{ 10Bފe$g[7bkE)b-`1FjWJX]^wi[ݡ%)ʜ2Y'E_gP +A.Ut u wS{b ^_$oMTKQ Օrwk 4.%)9~M5N@U*[q= 43Y;^\3! 5LzϠC8W!ېG(TY7F;\³56\nJna?>;ca~Gdd&LS4i]A-sԓCx34o>꿸9~h$OzEk:#Rhq'Jq5; .Q8G2"q\ˤhpyfآG*8: 68eiѥ9>u`O)Yr( igX a;v"xd_"7fv +%WnCwN>>>4{*_5liK;Cb1ᯙ\">S[< KGr8DoM6ʐlZ<D8 [t;z6!UʍjISNHRߪ2y3l/V&,ejjY} +8_qO%6;ǰ=`q1Ȉ'SL~D|jF4VV<4 H;;Z(;%~_)HUr6Hg*zp~^L\GCTfl0>Śr+kskY #6TLkf>f5|HotmLoH7WuL=ׄ^Y$acһO vis0&9ϳ\l5Bw\K^/*3W^@sϣ1{r0#CQ%V{XᛶC>OTB.r6 ҟY2,w1<:X-"`D$5>:~=)Kw 󔶻02@GGrAPKI܎s˵f":qa"M(լZl߬X8Iv:߆іŒ-ve~5Ua,ss'1u"aUF!A4}(Rxd{cd{"abN=80Ӡ"^Ov T͓0*PdRb\,_]_R +PK쭖K߯;dOc.7Bި~}P˱x裂c#v`l5nhr*S]e&4<&dl"֍Naqc oj gB)j kƖa.p_I_ z'"{⎗-B]_<\ӕ 35'pr.#;>& Kt*ϴU'tqZ}G@ݚE(zSט9=M ;U+v=NZoIeԎDD)(@]]i>\*`m6EdPP4EDץA`+fP{߈_Zn;GbɌozaǂ =Esۉۑ eL#X +,=6'V zdqmrH4>-v{Gu$H%g|[2rAc!`JWOtiO6FB1*ߤ1fZ6'a(t!Mq21԰$ 'YV,ɒDHMc);ےs}㰰UJ7xޯrE3K&]ݖ8Ǐqa^7m$p|85X0?jNFv6"@ʶT\o;;#@hwwȰ3ybO VngܘA<eac&u +ٮrWy +V4v +c;xMSiOfr<}Ls8{po +V/I+ /\VH@xaFm'CeՋU6wXôA=cЧqOijˡwM$"PV|tA?.<.;o*+6dr@j@ی?d~".ڪi܊Ojn =dVpܭR`0riCz +U,h)h\-WNB*忖6oeT"_ 龎IP: 'xFumiKk2ZE>h?zox?`;aKgc$xF3)t +EvcY%*Pö׷{d +! 0 +,w(ӌD)k{S*a[!rE=n/6/$ΰK%0. v<𼄳[aH7KEC%D-d Pb۸ 8׏ui!.QgN:^umq#{ [jw.ZqWdBQ$rh0_(/ p'CrŘal-1HR'_ϥ$`|{=%0޵1+Oqh%u"RfkC: ުkI)+^,"N_@>]*<Ӿ#8}Y~|Iב˚$ήnPB &M&vxǪzfT$~'E͸c'"%|Hp~fW? BRT߈c5lcm*f)/3;_dQuʲ\K$jkq&Vӕjn1I0/>VѝuNlg$r];[e9F]!/TYKj?nW/bВf5dSik\|D/r +"9)[Q `>P gz`ʇχB㛌vVܘk*VeOb9 Cz VL[=Rx->p.oɷAP_ҷC2^.QtP;|Fg7RI~ [ph/&7Gz@Ԙ7YvC_-tbπ3%v\틃Q~c/4Q@[Fvdѵ [ Jn敐nM՘\~^G}f|f< S?Gd^7=m`x K^}߃Q_fef4HxE!j 7ڕQi> X*CQR2Tto},DűLtc*(-NLjbLh욯u%r49#gIƒG`rd<]D9dF9&_043޵~D^to짞!⚐Vy,z +&}3HwAbݩdmi +K\ +v ѵc`lliۧ{+6ncor*vMT MINvp3x |_sj8R얓2;sZ9?$ {ܛZ@|/ܗd;ݐC7]S: +WkvJ>ѣ7^G}1>ŷ +{ռ;Q~g0h'~yX*56IݐyGEJ>jGqϩL3DW OY6hNM [6e!UvИ*Q@<Љ:xr%-I[ea":ZZd }9J}ǧ_CO}⨧3ҝuyn#[@FT@f2`քMN5LFh{ż^yNż= Od wj.z[8ŧ;UUZ;-J ؂@1G71"UVXTwHz+ S!ymG߷:#k>5>-; Y;^>Dj=vړ.1#͌H9V4W|uPW!&WWOLW?LӮ(gdbL`)2m6v}1\&h9>:،MZQ9z1}2wKC:_ΏT#7Oe zy/I&bA@;ys:)~çmA.ޭGa|i_~Xd91c?NWj2>~z+SK1tN ;\qy[kA[0!z0үkiV3rHORYnؚZ+aF*Zʃke8AÛJP)t샹c[=ˠȆYhva.>1Bi@Hi)e6LbY-'%hKvE mc11@Gu +M5t |( ~RO䇣;>,کÿAo`ɋjcB[msK YYt +TW+<'oO77u~v|;BRWCKjX.|^rR3QX'|-QG*dP|\!MְA{i$# -aOGIHQQr Xכ4G5IT>j:wk &\܄ؗsԀAK-jL)&rk[bk)4qL:MɯAhEJCSu-:9:5ôɿ0p4'5IO~OI7`y +rrwȑ-`5pn4)dl՚ׁNAM͇Qf;.SȩG s [ve$QT= Ju~Ƙ[pc .s^1sU<X@誈b0r^g9Hmhͣ!WIz>HAAǸ=+U89??` TKl·֞rOeޟh]>+djjOp_w 7$ӡ>Y1kw8x>mc0#WaW6.6mG B #ųaek7]{n[Ǜ2 +7רv%!Zmƅ%O̼+[:uY{ԜrkIQ;F^tCt$ Ø8jK{Ԓ^L-!wa&_ b2$Hۻ7as+(5m!s@K .}͓ ^Y ;Zy|`D=3'̝2crp"`5.5Pm䒺q)8]lkHo6Fw!#;_3FM]+)ΔYY۾rldۙ"&6 0Lm%wEEk hmtƛYD}djJN;JgFX0fъL<r8>%hyvsZ ɤCɪ$edLxp[,ZzoޫmA߰5J3;%0go'UީÀXi~Eg$UhVMwCƉH.P +[.+VAx~Ǝ1hak +/}9&O8Pp8fz_Y'1> +OH׷{Xl7i1I0lTIEW=B Bs]hV"Uʩe>T-t´tJé8wf{tMƏ%ԔkMxk|)߼Ml8i-.{؊O:KFs \/Tl,EmB,6%'(jo#nq%\FV3:P,cYOQ_HhҜ;(x,5EH5[mZ)# sfÛO? f:1H6* {nOob˟pfQ݁5O^K$49e8/FH#(ع:E-EKk.;A4sAo𽢞GzGQp-x_ZuG`-TzMq; [*YsoJ>WӔ qH Uj⡬L#?ި+w Oy?'[ȿ#_6*uΑPZ[u3T,ܢ夨"yMن){G^s`ƠU"Hi*: =L`ڎeD #gc/߹\ [gW&_4 i8jx?p*H7s{Fi@>(6צRiHI]0HLIr<*n'iiFeumH'ZQ)޹V6Bf.>V_ D-osׄ7:Y dUD89p2OS}]X\nw陮 Hİ~h~yp]bږ%B߾8KK)m*z rXpC8A窩x9PD(kuf#۩1qu'z0zhx =1}l5;n~On`F6=킀 +4LHI |A'牞Q1ac䂇"s3-J"lj,r7 +YBaxV;%16 G BN>?B\D׎Zfs::l9 +8QE}uT,撄ڡ>̩J 8DG nw;&{yG w9sQ A3` `RupQ*{21|Mp'')C3St9i_M1n\ZE>S +0O Q/xV h)l^0\kǪV89sįL`CaR + ,A[QGV*EVn { `7lG)*VEËPۭ^1iGMO]nHRF9McpduI4ٳE_c\v;T0YvF^]Cgi3Tg{tbR"pG~գ psAIÌ &WZR\++3^J]MKhh^uϐ.P麎%d1,Nޕ:i*.NpfEfs5.oqBYյcŸg Y rhSv|-@-t]w4liF/z0PHR> [E\~9d1iqe4UL 3<씻m~̗X3șmYL^4˱$T#@I6A~'l8Oo\ͷ!<FX?B|â]_Zi<S8LtM4 ڹh}>L&nl;tNw+~yv,# TlkE\C%T'\'BR;3TK-Ϸ\ *$&+OB +Re_f ""0ju(p-d<%[7o~ V=̗@{NTp rߓzc1G"tgΧwաq!6L&LKNZ*j*T<]iFB^-lJ x cr.5WuK) `JA1+˾?u:WPw?:ܴtD{+옲;*8~ؕ&`& *mj=|-闽hw8oߢju4Bm!1Ԥ=̌r}̶e1搜~ 3׭bx'eð'0/ +;® rB8pcS41RSMW"ʋg2+K8EeXR3ό`g~Ӆ(5d)e'a==1>qYFҥlЀVFmY,Ř-*9n,-YFHɿ LnS\A?IXID) - i*)'$C<5:QLlZWnVd44,>8DcS=߶>H2kEݶEܝUGR2(OQ6Gyթ)FJT!E,k! @E0~ trsZnevP;i:( t72v'!ks*I|@FX6c  29!EBZCF_ѷO841 }EI6cҳQ2toT~Gս?4tlYsdĦKC=:w1|q[JA`uN{π"Ov{6A.pZ\g` kue0gR7hׇ{ +QE >xZ'1yi+8Ʈ.D +:I3I[ A#]j&b~gpmtExi6#?t,*b*Lғ)EjSe*SQ)?w2@ 󛟖)9f{O3JL$R^pp##[DwPΝT[WF-HB3PGA' vݜ6p/39#K}b¨Z^,t:-v^eioy6w8|'0Ae~SezQUc?N Iby[pM}?ڞ,Jcqi[yy?9uUqMʊe:wnB&|%Tէ`RMx)m|HdާW^6ovېRb{qFh]1N|Fy\b)U6Ј0 +"śezP O{x[J +=dVJjIQ`ew@ 8°-)!fnֶO<A,bټ݊¿8YۆŲʹl#eyRoT >B7f+oJ?Ysd#WrV.F{2 aL3w :J*U*2#%!ApzMuڻjvG{jG!/vT5Ș [p-4Y[IB& -oc߁ꔫ)5P Ym C^E_ +E%2-YQԴp <DZ5?`e]W6yl,̛5 0mF&rRuX u'yw0-?a\0£ͫz 48! +3<{f`晥o@[ڠܤk͈Hk徔O6@ژbY93 +ejht?P2%ژFc0p;U{O}xe#:#!&}<~`x6Ty)ܿwy9Ln*M/ĝWMLZY9{CvG%@qMDC2ckĴoUucx(R}-q]g@^{nċ{~-lw?[IT7O>Muvu JK}c)E>%I &tcntLKs~'^(z emXs037 +6Ejh#jHL|K+In?Z݅b>u¹<3K_})xBU3U,Sb::5m&b$x[c__(&4 $퀩DciM/?VSfL%|sZn<η +H 0dRo~2 7>8vmC i\n`VlapC?:L0mwf^vd_Rrיfڑl IdnʗAk[$av&􌖤GأwCB5F ) 5GP;-Jtg~`-+8!U$Gs&-;_ae"mâ"ijwv +R$j k1kzU+/@gԐa𳩫S }A5^>/Ap/n|g_iGz9]9yͮg0yEEjLh\$oiBG]txvvtAؖL^%}cJ>`NgsɬeV> ],T +S?b٫_m㜨_QFw(I^:`'HdU]ݵQ]tslQ2!UWЕ3ucxϔ7יTbt#ƅ +ɣ^?'N7"xUbmI9UilbvIsŵ=8TGCv$D-yPRO##Y;IN~av:/;s-4dm`MnsܛKN%"t 5&sjC!ك}QxxX{ X 0״Ա)` +~㵪t\Oi#x6IN4Ҷt4Y ֽAͳ)YR9pH}u#yHyU:}n0=@!aXS?7/_|i;\{!U s1S +Lҹ3J֮5Vu"͍󊎟m 8gUH{>Z EȖ_Q|RKޏnǾ+k(0? ĎWd'ZHM*I5r^Iۜ {% H.\ξRӫmD_+uΠ#Ϳ: xզiʧ }G ^ U{'窈"Jf;r{ڟ-|?tE%5 +޽Œ0ņ]{WQy2hƏ}%FKM`7e}=h!y# as̲u`J /5T &+u d{ I.]^ЉBKɕm(UeOhK6Za1^*(Ml=-3jYئ,Y F_D &M` k8U?`*^ XIqX*fh3k5LKxk< )U RZ7^; b'L$#V_UEfM>k$~aWx #>U!e6Cmq~8/+k5U9E[KUfHW2F0 yeCdsQo^L, 3?Xܐ$J5z>pQVV=̔eyCTAl;+Jys_#žs bQI[N &AOV)m &]ѡKӌX!;!|׃@ӡS]U?m -7LBOk?}hB X 1rVa ME>?y;f/.k:f Kc$sOh?T2޲Sѵ#hecYE0ݼa"l|۬ ċU$.:RBt:#dg )_%Ǖ՜@DhW!is% 뷉Qh;DbJ"۷f͉=®~oCjaIcFs_;yً {J{+!`YT.-tS_}ыI(A]WI)|V V/=\Oٙ凩!pш Y G.tٗ6Z%˼"wev 1AvI&E:ҕ,g1?Ė:ߨ*5Bԙ]@0\'; CXThSܿ/ݳ +$#q6+I BAimFbcZ@33I]7n.U[$4*}2[qk~,5XREg([%NٿB=!:dͥUmbmLe/m E:sz@_}pf胅c8Co& z07@mLk'O +kKv^dE~\CL@8Hn,0] U, [$V\u)4Qy}-zwzVwrդv4SRDh|%0۶]D?;iJ' :YoF6sxh]M9L"gB=TM%F*V~43A9H#i-TSHN2't7u\Vߔ \SH!&H n!|R[kBݾw!6]S:JR7v( `cn,3_?Oy/w]N}fjut;R6應3#ک+hdpC5([٣ENߎy507ȚHhihэ\_(2\_l =Ji$1sbrW ֲZ[o Ss!v +O@3؏Z$-y\ "Y^ "vhws ({6~0 $-LH,;gW@7.$>8"9,`̒ B[a}c W޺ +Gz_KbM4:F +]ÌIm;<(!N~p&%w #_9o|lb_i-@& +σ\2Dm 9Kح\b]L6(.,Vnh &?NR?e&P$!wz^xS"y (\.9g4;fV +`2}-9^OC.45ڄ}/Rd3GvnݓqPZk BV!1IX^<&}b5zG>%i4⹜6Sl^mu02HF< m Wp&(ihMZCI@ȻZ7p817\M(i],.oD+?FɎ$EݠCȈI8Y}\Ce*wʴb悖#J_򷑡WYj_3/-s:9m'xBm} 9d'[$BOHtuor)j(1:iN{>ߕ^IbJ o+hqq訦տ=.3Ra:`됀k $| V{2]}WnNY0R,n8 <Җ3GCQ'N >yaݯ@s5<$; Bf*LK,|~?j.^5Rmw1s2eW>R=xnj=_u`F2:=h/-e_ɣIgAY()! DQEsl$Nuzos +)۲ Cϳ=>1c[b4ʋ%<{SZ:)*NUDֆit W$k"b(}#ڢ!wԹNRKMCCh~4'"鞆YP!4OlhM TJ8HnRAJCy5]ɨȕc[(7]5*˙5?]Ѥ-2.MXF4CBU!V)n<߄]1SrO?F/fd^lH>zR]K ߽n|#@6g1v_=&d9+,Knm]R\=8.{EPar_8-2R=NH2OUR"Ӧ # 2 uFg +1&ɤ%;(obn5Rq|{RE Z^RiVS[g_fˆnUOl`WE*IcɰK9Ȯ[Y N -xHE +{vu%-hx)x^V׭ +iIi2Ov k֢:y\*o52$Po#(Hڸ() i=!.9R95X2 C٪{|p<@ܶ(sh:z81bȉ?"ciol2'}Yl1[Ac“&g +{Hu7lbΧG7GӌBba&h[oJ>uUDbZ_ґ4Ip<ŇbS kAM@vd3Љ8Ցwvdk.2 hށu\}b*'aʊ4>[V_yt5{O}= XWE ܏ލH +ikcz[CuIKzQyn2lvR"?98mw@I2F8;pVjT11wl&PPk(I;kjHP [MP-`O4 P_V`67a!)Dߩm}5џđy;3maiSvybU!W !q%{' H1Mg=jkc%uqԹ&&$v>ϵfA/E;΂Uef +0"{PpXϿpv~̃9~l~=-Dp$3E&q:! 2B:OcϏp'zwC"z1ZrI"Ź:cע8\,GWmnnpzC1A'|`.@lfBy%q8Gb&M~|f8зd #ZɍJpݞRI7ι +C5Vͪ['zA ,SBABKvdU qN +ľz׋tXY[fq:[.-uNI\ARs_u/XgG|03dzP3iPLӀ +Kk #/#%0 +ýo@4Nh69^ù ]Xʼ6x{Tũ}d0U0\^/ax'i5EKVȣjر_=#f(97͎~_[ӥFA|ú +Yf{C PazD{/ZVQfvΔ 3(}$ٮN +M'O<!3~/Zӯ"aR/tM1>GL4S6>~Vc| +-AumВΖho{K"Z F*J1fdPCVLA~ +JKPPt#M10>%oNx|Ympy[`徘X`* {4WAhZ{^g$ODWSCC#ˮN(!E`Л98%ND4sfho>)y~K %㠴q$2tKu(:. .;0U,vͶZJħ TT77SL@3jQ1<<ۯR]Zoz ~6*+:niIB)/w2+K1bD#!AyKKGxQl9M<\=eq̔[=: +P :r< \w+0:u%eR6s'vŝtliue%2ai@pE7u.AG9rn&i5N/y-l@0:4uGV2ߝdvZc$qYm}һ[E6mIRh+͍?3)EYM-LQX ygV/șۤ zhs07 f{xC29m7of,uUG">"G SAA76˜;mi՟t",*zyidzHve&)']Y>;EhÎQzV6b;u +N6 ҭ3]l5{.p@C U#-6zUGqQՓWh +<~j)i0oH6QxX֏{ ,S\ +@ %q1%496:@s0ĉ3@([ ?K m刃?C99ڰVd\d=n֦P66iN R8iU<ԇ(KL~ j'ڋ̑,Etr1k.f*yYJ^["dIS;adSیtNzɄ^JyT D/i\ »7lTS2 ВvC=ED[`! h*0+~ܡ/KЧtn}i잗:%)\^ 3D>`rwo4gW#9EФ#4 Zp"d-7K҄$ύtT! w68NIhՂ,T׌c \s蒬j8H2}RQP@ +dt9b4 t\ 17aҠluԼ/Shx2Y, fiQnMY_yyBQYw#,(: wL+5CesbATFAUR\3S] :?,!=YInRl86EqaiGlf@d,v˞m6|ᡖxe'vK`'01ÖuP4[ᰐ!N$ 7 wYUD>'*e$HǙTx <,?@ZG<&JLR- +(o#" =ttnEU&dw+~F1sSЈ@ lâz{ӥo}} +)s &w C0f0 l~d`X"];E0%V\kM.=C@]7)P?w }vĆFw=Ǔ/^/RCxy%n& +f1ʫAk<$![˜@\9UoY(]VrF7>]{? %ox܇}v]9>=P{4c 7\`7'EQ۞Oވj,EO9 Y~&SzyYD_̗ۚ,+E#&$6"ןU3n b@ =SJdX5qp 3+n;a.9+VzaLBk=VzkDPMQPDV]/ڵ jq{FAʱ)W#~Rn:~o)P])-jg,~d6mPP%Rr4|LXc,b,AUЩ1_CF1Ap,N{ڀUVI^cjI rr}Xwڲ8,-J:3B]O[Pqs +`.T tP biZC]^2)e6wv{N/jph(|w~"BQ5]fPT +kFᦌc =cIj,sV.'Q+~褳=sHc0ks@"T.uSS\v0Yv㏊Y+Sum?(~BrtNe׌]+Z1ۛ{5DÖ/$ +Pb;ldA+?ydh܏;)7$ `E;6eRƂ:uJ~Z{O)IM]kdDǨ6cT"Ъ׫M_go$\FP d^c_k"fJbp~ZrV&o1q9Cw/CshΙ@4xIUS lօ_x=pQ+xvVuAݣd"X%u +T}έ=~fZp60Pqr"LU[CTmn3!_i55t̮Y`$)4 ſv3Uӂ uQ0{էG>5@-k*^wt%-K2Ŏ\/Klם#W 3ds4Oݻ JD $ f%kiLLYv +A>,>>uEH +9 +Wxaawjݬ{h᤬俵@NK8ԶI@n& O K?wK#=nmt ̦y~;a%0@A]V"m Ǥdx*K-kh/s nl#t򗢏R\e6:1Nщ1bHO|b sB]P]}-mH3Ug >PQ_}`~#oq]>mb%KIK[XADG.j2\Ksl7$7ƴh̭՛C7"\->;G]Get]}+%PmMMe#_ Q +3d"\QA2a {{1x=lWNY ݣ \=֭MZF8٠ν>*6Q FW뮈Zg;%YoWmP)2C8y&zaS АDNnM7'h(3 0aFd~A?*zf03Ժ=ݷWk w-ϲ4HJ o7 +endstream +endobj +19 0 obj +<>stream +,~ř進Sg_+Q*O<ײW ۪N}Y#5b_Yo0;tOMD<_zIM"G>n"kpXVz;P8c~Ʌ:-W@4t12^<F1W.Dh IO|I+MK:FHk芐pA⨶w\SDA6 r.bJ#0[m2u7V\ۃ<2{T1r?<3ƣ4Pq~99pkn'=J_z-ߝ/ՁWϣgȭ)j,dSR9wusHU%:t*q;/Yņ-s1N N?GNeKˆ!=2,(j+3Bl ~-bZd,ࣁIeQU77J!?8X='cTeo~ʀ;B^ˊQ=bMRq"-=W]"U|F̅lwjl T, _oe}N-z2#_|b:QcEtr!d'&k%V.'zjXtA9y8 PI_*NMVH_b +>8k@<|G~o0lM!N;݃^OpH>I@}8@o5 @ *>OM8x2x#';auנ+53g]r_"_3w{$ F:ӿVmvPK "xc̿ ξ+` r\߬%69ߣ{H<*l}ckHH&4*'ى6<}&$&hB71J߭fOSM .L2]󝿽ݻOIgY/8:*i:+C B" x\$@jޢJF᫲Ƌ.nd.Jag X"dw0do S\i sS7AAiDº8^PSUmӧ>xI)[*Hf 9VwBjQ"12 +Wv`#8 u'> +%sMh:m:ቖGF=q&uS +ӞJ;۾]e#2}9gnӰ$I^?%{FOE7-gyfBlL0j<"B5.֢'պT+f"L1!sL:fz@| {Y;z\,)('Ћv156}!HĔ/yW7LݗRɹxv04X$?RPRb}h)pO@c),9ejHhtְI{ȹIRri$Z01N~my11A@ r|Bʍ9gP0Ź6ih5(Eh*ި\7":Ӻ#cϬV2Cw&؂bH"{͓M2T '}BҗٯTݭf{?1;H.ә)h qҀB-bt$7\VS )fҧ e5$_)XCUJ..$䜈qq_X{kuC,5`ز?\ðƙe ,ߕ]Jjzq%$@}ΖywS 9y-g;$ဩW +k~)ɖ8Bec"/OIWqdo tL7rd*s^'MJ瞕iHGCwҜ\1⬖UF5h]N>W2/Mv?Rtז1$h l;}k`{4`'&+?ΧVms i} b,r[X Y)m7m&ʞc5a]i6$>`jJ$ {ۆaXcP5`)wM,rxy yw~#;Ѥ勨3 Q*dl%*ey\ C$QqP>q\u|hҡ!L(/dB^i{t +Dhz1 @#Kw}qSB`ѧ1t%LqP*'CS%%~K]ggB裍HSPjI/( +nn#hӴ鉳qZIJ+Iqx}e:гOܘ- ʠ]EH(@^5h8/(1?tPk #l]> 7'eCh]lݕh2 sƼIzlu; ` =twEÚ ""7MB8⳸.!nj\_eR?19#YnA[TYr\Tk>Z] +]Ǩ_9r(6pbTp;aa~ #>s(>2 +IE@YЫpO6# !FpI[`%gkGiM'Bx#[.F6V?^-zDC\9 EQC&s*w!u5XE )8¬{lQ)AT.Nڴ. 'ZHQ 3A+!>:5ԃCZ3E9F]S>$VOC_E,$ sE&)<`ILbjד4 =f q +pTƽXi鷥‹\[)0V?^īȿdpF̝ݸ:|.|Pֶ;([]G/3YYK\L#+t | wٗ$OӪmTXU+ջa5˝Kwߗ>Plǟ3R?(i`{l!c39޶M`,ިQ73-ѡEf8s C(4WqaTaiv;hW9,6?+/ @m]Ǖ"2 [;XAA^>i#̰cJN.k +ᜪ$${b537 _bdF&}_Ǘ޲+*yG{+4 #[ҁmU=D!u$ش$A$pe.s)(| Af令ǙLS®ZQ7n\-E꩒-4 "[GY޵MY Dd\ Oѿ)%~v<כ$P}4ҷ GcV)HhQ}(G˸BM>..U#4O^xɳ6EO_ +SpwDxVZ `rZbxv9[v ry,`zDCsãx(AJ(qal lZ&+wB.o:,^ϼқoe2" !HiYD|b˹c DBcTs&|כ ^]|8ɟ +o݊a.+r?7\y\8k֠[ [6Z3LfugRjq9`} ēg(=: $DR/5,^;;]c/q줤}PPkt:v);ጥ|5K eἲ@m-GDxg1逌gylv w\rGy7sBR 㸋mb>%TiWN3Ho --+ɫ[ǖܡ{b4YQcyb^+z"SUu- +^R| < zW8ID}`$t+8H7HKllhD0che=[tbN}0/HY\)1rcw-lkejڢs h0騀ے e6aaݹ% wb}">&d{mQHe>u7T B3UtSKJ="?ae3O0ET3R*yXi]iy q&&3v +%:;LԺhUjDr2BD\,fpS<,+mDbELLkF~Hɝ״~5D0o^YPKLj`frUbrRCvXlzw]fyfg75Fp.NwuXo,&; @,+=' Ⱥx"*6p7`MoآeQ`u2n0-bjoճںQC$b W /6;0/;fZs#_#ҡuIbhVPaFeU~|uh]<B''baj9Ȅ:쀢QLִ̕χj+UOf󺄲EM"5w:Ƃ[K&N.1#b3TBz4#<c–ūۙWGl@CdF*f>SϿ;hE&H%_vÜ't>삳[gI!Lz1-AR*vW18<1])QAPK_&+K9Q^5+ߑ]?}`k^ެęKxh?N?v!4v2-߱/ɡ^grTűGLuSmilz' t&z|mֵ H=F~c2ƒ!WNpgG.#ŰXCH3 uL)ܗB0{KER_PxAqiX&tU~0b2T|TBm,DPJ1bp&=ꀏ HepSyXk'@č{ugny`}g_Н0h+E L+% "v Gc :֗#R.UafT?a~rdϯX۟ݮi֑+(5ƿ +Q?]u5|0 XEkkNJ%8qϗb&?IsTM-_xTlquY>A8)+:b.2v _PV\vӫ`$Fkz%s4Rf3W|b s/ęWԓqÛbY^>4—Qad﮴F>yh :YGshCwDN+brz?QRjpŞ phQF {P1 +q]m@djVqBee&#$bgBx}\m|m +~Th8k1ƢG3lހTs{FՎ[Ǩ HV嫈J6g?S.ZƷOdxUkP88rj5-<K4dmϊEeҒT_l݌82yzu`2psyd;=^|ANZwD.sU!(Ѓ^KnZ@&S~s1\qݶIfq=yB SCDV +x@6O |;o'": GZ,2x.=.}bƜT]GO`&Y.t")7(ڧ8JZ9 LHby +$w87:Y:RNq.Wn 0XJpieD*t"L׉o.SWTn)!@PŶH5F3ϰb籬m/2E9:=E8H aIYTff:+m8PTN +N7Zv>winw8l]iiЛ'kr<}`i~zI% BP[Mu$ x.[Dt&8<̊M Й?[:4zi+hdݬ[iD2$y;Oa +JAn*';b9XA?>X|C7M@l9 cOʌSAzG>D)YrfmOTG6$ʃdl?R/x Q H ri1:+S,I!N!3Ӻhym[}n ׺TIWwK=핓@hxpb丙ѣ̰F `Zuʰ'ڵՔo1N/+ Cϲ~ .);W:l52lh*h>ׯK0R4 %cmw77$aD :%`-!wOq+߰f3#y]%_L+& OVFyKm3II}ʗiZ%bAI5irEx]m3v;C: + rzW6cF dpkH0+H,LּXn+ Uy54z,.~ {ŕV{|weU,q 1lYg#MwrS; +x^OZ;(&֪ Ӹ)铲1&L4KF+t(֡-3 +f1 =|rTgcKWɫ n"@m9(l^2JGrev[:[pRRvtB;I1$F4siSBD"K*YQWt7U%W{!)Bݪ"9d %6]DVڬgb!x8rΜd>OՀ!B<%Q\*0&U(UFߠ;qZΜBttD k@+_rg  #]k7];ʆrx;7`o:k× LtDAPoȦ#GjnPxE%N\mXjf%= ʖ 7.Sw 0PafPcrm')K[Øy {%ZYXD +a`R0]k])0#,EK^f8sUf &\~ute*t7MϳNޫM˹'$w n r R+A܄a ̞Na0je}gj/ݓ;5v)yj-nJdA50vQpqΕ/.4,>le(kBV H9 @0:V)DVh& tg]Nc!p`AT4AOl9dҠf +`sԭ7ȷ4/noõ6oQ$tuD'aG?7Ka/c =qHڎN:tGV[R*e=hH\m05a#/.퓓lZY7?P9Sc +hS\Ŵ4˻^7t@&ՎhsoMlы4; pGC†/ +8eDÊ ӑwŽ(qDs8,OzQo(KMqg?ftL`ɗխrj=^븥3:(ٶ#U73vj4x e E G+hNOD?t<$h6V]>l|R+c#EJ S0&GԯKW1lbwSK}FKTL bO)ϳ O$)`]&m-=Cɏ}Fs)v2d^Xt mMWL\#:v!gE̕1Aba/`oF ˅@H0EGPCN=z_l}O*1Fͨ3.47$):Npf"3*:ZG؋e +jr8VE˜aHIr1 hK W'T8FKh-4CG~k8^RU:2*6q;R~gcX/ t钧;VD\|5d#3ޑ5CddQfC~3Lnʼ1TޤH F_a8g%o!b~8儆q0rӁntmX DzԲ7$"apM"Q~$wd^'p/Bd7ԟfEu1sAA6U~'Z̝fkxA*մԸz;zAi e[cTgEݾ-PnߚG6˧] H[[N&E;ULGJB(hdȡUk-HDDϬ\6DJ NO{t4J p^sQd [o9T+M`Y]sohDYafkSۘ 4jڶ[ʘP+ϒlčeVO͊^a(%a\ըzlf x _O/0|?}8mhhF>IVR&W/,B8X͘B``Zljb 6E'n|,L>-> Αb5vjLtp޴B SSwǟ,H3Ԯx}l9De'RpRk3M"%]8(V*%a(㮉/7;d 7 +ݦ1mzjzc^o*]R!nGH!Y.({Lh`uݽ0UG9!.t "D|(a]*41rm 4j|f^jgw'BZtix8WricM9O~hr~ ƣmdoʥw-Ysv_Y+ PCjV +`~42t 9Ovxȵg#z;XDV('e=N̎n Oy{WTUЛ.cH3?Afe'e< ,( +K0W6UH hduuL>ChO>K3ts>#zx[XhdwԉD#}΄pni,{}s=3;k: + r:MA߷ï"ajzD !Q0VxKN؟hTѕ'oR9EՏ%U-W*&yb,.S"vZӜaYɞ> f3RTdCzb؜ ;dY2Pumӳnx/ѳO`KDF|gNd8%@jMd=PcZk7` }%\@Gr +;ހFג<:)q]kSw_8)m^bmn oFװu] oYdD1(Pr=c|wGXWD+m-C`3dsrtP=T7#dϓWh)Nɋ)ðn7QCB0|HtgJ„Yɩ_qz%Ob +Z~,krp?X; JCZƁB"yhbu. 4Ş e tQG6,|?iw' +b4ńNW4!N?-`VFɨ&}ֈ'&=urL0D|x]nI~OcndxAu—C&m!oHf{]M1?=f \;ntB4]ʔ?VS0gw7SX06š6q;fÿ=7>9@mR"bq`$tCY`Hlm?*L5pc?/t{*TmW0JdhJ;}Tc~ޘ> C7?ױ|6 }mx +-{IwJӄxT^}qlWc7FB&mX=20o+gכޅ+K#n)8@GF_l_]- +(* >cPȿV b:N(jU {há? @3C>h 봯Q[$XA{,376-/1ĐF!MRd F?# `f FJLfлlۚ \B/ ^ZAb6 Wdvxrٛ-\d[:pN^: ,-7dV!NN\(skZuIW*Mh-CM~Eݟ=ߡQAZ%#:"Jw6:'ǰ84}D]r<dz09=x*t G!9]rg,Q{Y2C3-UmZUIVV2 !2ʠcD*0%\e/qygpw dQ|A بndMd\Ű L4wqMh?loй.b F&813m`@Vㅨܻ ؚt/MH >p=*dnؠ0 ާnIA0xX=L@.3~قcǾhޝVr2jk=P%f\j?JhsT}vZWY|.kK3,Nf>ND7빗1/L'ù{*lΖlmn8Dpljɠi}O?*r{DBA =DT]s%2PĦ3GKYj4 dpgGi6KɮAޜ/.%׭'gӋ NUC-XLLT;݊"q;t`~cLCY$Jķru +u^UFIKBB-ؙƊ:V*302q,֛" }.zqR4'U},^-IM.:8l9vکoXA RiV]yʗ0EuݒL쪳Lfɬ`$y= +AoN Al7:ؼL4Fk2n{"0j-+Ld_ywlgk_L=PMwX2}ڔ ˜{oW 5OL}ZNW77=cYv526HkSxxõ~#%bv#Xz5y, FE䠯= مk$,=&*/q1wqn#h3*BZDZvo(GP Ki1](7!.W'Iҁ zt-=}A 8&wp#U`Vڼ[4 =?^ RB~s$Zwy\'X EX&ݱɘU4Lskmm > vA0=\>H'%ܨ"0iZ91rkos9\P{U;ʎ(O׬FSmнOa}ʉ*]#Z G]N#pt[~(($y5ș~o\ba^b*6ff}=7ea)ƕRSZ]&FɏSm@dAK1k=i|לz犖,:Fk GҪnq*,;uMz<~6ޔH̔dM!Г =+!ҥz=P mD kf#4AF,y6/N(eS/9'?&N4K~vo%1~װ ~|AM ʠkhqI8'].HHSRF"r2!'w +>$73%77x=:V{I|~|HLP-A{t 1ʧ\=p*s!wsK(u,3'z +PlD4?W^$V,I+:eO캅ŢF" aB:fVBVLcו U^E'viopW6pO})R59/sȠ/>GWaln$3s 8Z\:t*L׶|YtT@qx_#YW.5 G)F+O@ UPN:{KhE܀sSͷvFLUi SEu*}5iBEm0ˁ3P +c49PЉ\㞢$%}Dsf0B*Ag6fO<+1LDI8QxNɟ#T1Lygy8a{#U:+R.YV&J}{^*ޔiōwinPD̵`?vL R&dnezqܝEFa1"&O iJ$wCffϖmR )GSf ƁVr"HjCG"%XS$"QHK\E}T1%qza@CawxiWz# blC`>& bd6E>&+~|=C=Y*-ȻO^Ňb[Un8>߰ѻy2n ٥>(kK70kAuECU"D +$Xigp`l9<3g }͢QMw֬p5.eQ4Qfn1UX@Usd|]X(RB= vT`Æ7w;t(@b=x'LFlc-X͟P!iOk[I"?hei vh}s3*jCs|.MRB_.պ{yFX ؈RE&nLԃ}\lG5D  wJk(=t@bJ˱xH?׾^򷸧<< qj' ְ|C* (x=YB{BV*ngitm $06L~z룸g:FKF6| g(Z`ʯLAi>]fBoRW.1 ~d}%n#y<`"O^}k:o RgE̻?ٯ+뷴&xKwX.-|4M +YIpE+(~f\ & z͕kٔn̏10|be!3ӨG;{IɊ8q)6樚đ* \<ī?# .㓫V`rB̧4pdanL_QgT }iV!*yzSm@S.ꑅ€(9T곪\sg׽yoؾrx:5UJlѥKy!=Ni8ƝpCk7 Cl+°祋CjXGH 14q%}İ[ +a.*%(—nSNDž; ! kς\,n-з/xlBZd +oCYz z߹J %2 ɮd?FFQ6ȏuH-tEs*oHG^ccgUg1;cV=4Ԭ9#CdC*HJf>H +?-#>/WBq#D3NO{{{ZCHtWjE2C0pIVLεf8[sοW'^<Ywo y2P bWkڔD +6A71 +mUb@!ա++ľm;%apl@$M&5My%"%N=룴՜P:`u-fS'{OmT 46@\.R^U S缏t,0|(^z72Wf/-ą@;`*` [0P[Oܦ&b_JNk}WQ_'>0781'2%}ψǵhm;3ij#9+l}v +V$%i*H}"CQUe>,CKk?mfXw$'aI-8n#⡍n}y"ŸH.2\13.P|ֻKCPVP6<<Z +K7S  噦FP@F|>)>zsWL)PW(+#.>&$ƆF9H2D۝k` -9]s-^顱Y6SpKbH[ci [SD +F.-{?4xAuXj,8[:؈ $.3Ր̠4[yxOFʓyLn.evj {'4L+0,u +>#rM7vhus`Db 7ZHTcNؾ}}wzeaD:ιi""_zPY7bC +ږKZ?u7),c?I Sm"[X|qISb6Jh &L@2i-`< uDԤFqνr[K̩rV蜲,E}0ǯD_i^*=hnG#w_$b+RWk-T)/zq\( Cly4扗ޡ<)0ڙݘ_/][io= XV~9;wa__w<qS%]S(x +E5.B@^%琴EM;s423&wtF-t/d33 +[Ϸ[{G2Zىq)(-;1d'{zC= Ec\|Ne4׃s%j Gۮ6P\E{V=G=ZK a +? Ʌ8_JF)}7ݚ.4%5 b+H#_7vV-s;G062{b:Y@)>^; Pd%&hf(Q1%^q0,GL^evhW /֧Gh*Yq:Oid@[Hh-DLN,^J8OupldB*`h<|؝~ss^-I iѶֿfA(S9^jS !.8X7MdW \JݏD.]JX:ޫGV!["SzlF2[ٱ]6$åt嶑ol B/wHM3&B@qKk\i>$-5@1X) /_8Q +F%B* Ggg7.iv0^F[HNm댺1K4Rћ$ =br> >讹Wpׂb#W +1cs J ɋ^/: 2BCzK Y.ކeTpDB/^z i[3V`t:Y6IOA-<+ia%%[dmlU%-㓓+|5[G%89H+ >B' wV-}1|*ݘR4NQ}TCM`LDLŅd0!9q2<\5gĢ|]&`*L A0G%eX&Aź+ L0E?gIڕURkAI\=Ɔ:54(|xt' "9c1m +L +˱DíxTơmiAѠ #Hm%ˆ#ȨoeȃiC­!X!\#X t! : cV +A=c7k8'q-<LC=C<,W`sLO Ze~޼Įۀ=26 \kTf0˯a87kJX7K!L%TԀ \*ޟ0>"4m)˜b q͹o[0kMCҰ' +fD/AZߖx ҭoQ+=ERձDtgme/H"dHP05/ +;k)%MV k9f.nibR6 ?G+<߿1:i~_W!M`t2:#qɳ@x^a‰1%\9 IWmY$+38KrjZ&!G*N,o󞞰뀡U>F:2@LC#d $5Ĝ8a vwB 0.huoj0Y1uJ2='0P<`="57f1yME0Hw;/a۰J"xwЎ_xev%&7ah9)<P2t"I7%Ӡ6L7@jⷯ,==z֏3t.TA\^3]kGG avLFaA3a Vרe_C9QoCV0&U%")EK8&5w=4ޫX_x]l7)y5a E@Dr\ x4^K}>n947;Sلj$(#5j4 :Dx"&ݶ(U NZ{^}$Rfwo۔˂} ,jf=.bJB6j'X{@6@{,CHv3j%, - dmڕ ΝcQ%$ P|?Fϸ]1pWT-.ZΪ}ReD,c ٻg{/|^ y#]39hB.@迢߾XQJ>P(֡6r 3-MvwKoH*l~cAwR%BBZ׈,@پБb4x 2[u~`8'鐥Ak'NHDalT(y`SK/WVS=68ɖ<#=@eSmԧ/gfW9YE{.4TZ~Rr-q)n +:(r]bt̝,li^%ua2 }~ cWK6Eiޚ{F,(qhn}7ÈDyͭޓ V 6Y8[:v•! t?ZֳWl!dEOܮ'3=NKL& ω9B xAG+)~~~B7&c_SjFs(@(ӞBYiDDPn{q;ru;6RWqیA +}.@P\Mu/qB7]~bS q"f.y4Y8TE9H>#KP%"jE>PC3SFm?&[#krѨ: faiN]3%jHPN]wKuṖu'3@`v{Fk% pvhs0qØ sџE% i^_SE]@@&bg[N4 BT`:Bag6Qm̹;*4 rV}GmO5LC#-:Yk8j֊qrNdEc >1h +Z|t6YcvQ¿7Q2Aմcg$Q7B D!ơ1'O7Ǐzؾ (6ˎWQgω)g?ZD1E1˳T:s'0藡295|gXP4|z{ ֮ +43!C*YOkڴ2,u=,O!X&Ӯ6{w; ?pVFϊxfDfkNd?.!t ,蝁|)Ym| 8yNx1 2cXI y2>w@*-Pd-l[K}oy EM/:Վ66' ]ի-J]JIBk["" z5іljwm+3띀/A~$%NB%` )H +Q5j P֒T9.,x{#n{߰* Ut*<~ fB 4bࡌX^dƄј2LBK)ؐ:Cc#}DX!(Y LhywyzyE8T}"FOե ̣+}1$N}E^( 4V@ӿ;KI"C'}Rb޶+CGSy,Fp~}pQsH )%]|v.jY.qmaQ v*E:Q t60ό0[DF?" Q9]8 +Iػ/.)F|7bVrxONTw $Njn831!^(Bl#!ͣ/y#ΫFwK%aAVZ cɚ@Z){YT2r孎WDF pY$48;B(uaj^BhDpV! +X^2|OUe C=yD@aBm3_7OH+ɵr:pTujP!MJIO1m,q>{>nd3z]l^Ef_6A %9 wJ8Ӎn_z}iqTJ ( ndZUPKLj>To\dtccF6 ^PܬZV?98+*2/ɗ;. 4]"]d=C%(0+,{5o,6`m-^#w2ܛ^-zsжnK"7 swE2lW⎛b:Tmm]͘,$ mSfS$uֳFu(4’%D(*kh«ZWe)P(iV@(GgJKVÖXhD: ۵]صA'/r5XAPhq҆gV&'`.MFZ1Yr.+ gμD{ g;s-5R0}N[_'|f\ 5)۰ +*]m&@:El%fQr1 _'oK>ZG6c{g%)[X^IzWѓphPsqʷްgfӺ {Op1Yq? +mܭm<UZOu+cc q +Y:QvlQgi _6OgJL(lqȴhCɘoY>*lT Dn9Y ^2'IV/E%摄 #6>.̸kϝ(=7$a-)AۯBG~y]Ih@+pw߇_)ǃP[[uc"͉m$ӏ /ܷQ@/z 98wъ u +SY6waD*&-JU;S8-:yN$Oe +TG?u녷~ԵҨ01wKz~)z#Eݹ}r7NP t@GRӾ;`(_%R5sX|bjTwWёπ ]zs+6,D$.6~!P *RM!`; +h~|: XuG`^`mR4G]dz8~dy7Sєf.8Rzm:K$wĠNTOHQ<Ǥ[bVL9oh+Q7|af:I1wC5[e{ٲG[14TKA 5&Rp=F.exD%P o( |Eezn(eʼBWi7f)_s&-o} |CHcvZ;آyj0(L1/"^b1םgOU5VtHO9Yxnػ3-fYxqJ P_Zw +?@ɲp +X)'+,v#Rlu-8pY!HxR|b]!\ +\xHgDBd7w)YGa : I"Ѷ}`E>?cqT<\~~S )D$DM6D߱G}EcHlpp}@tָ.Dt9"dl X9QhX:WQZ% 6)<8TPj#>2KUAȅ[aש=e>nE_k* I]ߐcQFlYlC+d[whs*lٲKC:͡ ֆψl>Ӈse vHieZĹz2æ^ksL%ku%sUPJJpuE,v!J6NBo!役4>PlXu +Ϗ74G2vԌ3`8i:9{?ҧD"m1#5hF6Tq|9S|ѢiO >9Ф>\ensvZ=sOuDFuVhbOm +o3 a棖L)k+sJ[k/ǛJ?J|鏥b7mQn„\eubۏjq \ \|}CGj:1;6`uB^#hle/Do<; 3bzxK^>./zJPR Dm0ذTQ7B{sP0'!!MA{Nca*^$tr=>C6s]tR #&>yCl{pR‚Y_Go3'u2k wt:PZ{8Qz==G[ͯ Nm+g YEXxxXOO~[xbxh١|P+[ `dZ#ٹ _8I^,1~PfB^N>׹8Q_%ŋ<6ϬRln53E˽z +i0):^1WLģ/^>_'$ LC]Ays&(U /fwZ.ƧtGaLᨱIжeNUx%NkMOm쒲fCBn$<0i9֬7pFL@Qn' t rݲlHN~K/awEެˏ7nNAou43!F^T5poGhn:4gnE@h|GI nY/WNW-( zt0>JN|ú 8~_ +V,6cogE&ݚd+[~E :w;\6(}K3e PqQF=7͵>daGRJ_3w# ucק$5LmϴC[#MN<]H$ʘc)BP }Yoqm 3owp 5^oT,|W~UjBܣA+rweJj%._cKg‹gG9:)wyxv?>vϛA@hp3WYy*0 I5h`hLÒnnoasIɭk&Ck8}Ef1Ӑ5jr-%H*hIlv;R U7L^We-ɬ`o#V9wYȈ{myʾ-(M@z5ك +endstream +endobj +20 0 obj +<>stream +~-܎fWIaiqF&-X<~Yh%ZhoEZUkkM gHӀ6fJ(gG}|@Ps&~x%?Iwv=zQσXuZš):ge +!wFNp5rRsSS!a%F=aj?\~1c^ϐ_nHT%RZ{N$^6ΪmFND w`{sH^zfE $N:[hz>bAʉ1@&*=Z vm ݍ棦7BK@*ާrXyR4/&!;]B\?2V; /.,E(h oJKc]']{H j_xiW1D|nd82ԕ2!;]T y$Ufư PO}#jp㖃Ir?ch{thWXX߃FDq,ڇU':y erN_%+HOi6쌕1Bp?MAABi[5o ]w +xjxE?P8)TG/A+;7nR4ͷmQ+qDX*E-pX> D!RjȆ7>vTR6ch[y*m\DV%BL&.s㓥sq Rvx_\ W:wM5#l M"ԤQN+;2ꥌ. +@w+-"\1!~z^ quwqTlP#$ lCTg.L1uj̄~Zۤ[ޱ~"1iRCuq#dlT{$KI@*W ^&n]Nk@O'׳DZcRQ*s eA]*%Æ1B>F8N|o3.pBpGtcXM+\Sa͍VKS'պO[=X8?R{5@7TWKzr_3%.O{ptƅIkT<]bK}ԃN e_sKtV%#v绚kI-+DU>0M+*vP?޾B?8j4kű/BO[BR49|oU'an2Ry@DS>G#&.rwn H7P s_.{˚Vdԃ@1&1nS'?jnpպD,mHe-MHKr2;*Ct+Wt3rn +WFzxOuKYr V=T֌@[o0e t햛m"BS3D; GtcXd3e}}8#qل7sm\Y<T$cYF"É$:ͺy*gg LaXv&Q,UBf,AQsk:dpMjcBɍoHi{n:!4rC؆ՉZ +>a`/b #:CʸFnt8X*^@ґO[Z炜 vuPj8*Ea`fRew2tUga UFg(G,V!qMdYqW۵`Cb[ۏ'J- +cv5";BL`b?ֲT[!jQaC;bg̥ ?á?[GfG>DR}?,rHqX"sᒫ%*:!R(:A{{mMX1_j.!~\P[ VAˀ p" ʵ +,!yWeԄvmJQx0XV(atdO:]5VEg]=YQ7b!=rC@DY7ڱѐ&_/oJt}mw$5U 7*}< sm6V:&B>O x.ѝ >;S~ai^6p'yt]Kp!ql9Q3׊jUd!I,. McĝX%Ef6[AuɵÞN'%Z~?x#SԾ:@65gU%7TԖ&@FVP3mG< >~(.VsL# Mڤ!qOp[\%3RXբ Vbg*^_0RPAwsU#ATknE[xyv'4#&ywST.#!g#YP(Hh#狅ʵa) 9| QS[H,8D5mwsplh `֩ (a2t־ʌ*.aĖ^6])~pϠ߆<)u惑CuPhI |ۑ)yJ;Կ"t~[8#.O@}le&:qq:wR7 oyvMg% +KdKųa +bO7חKCr(@`Y;: dX-jAMCP5_Ey0h> ?(+\]싿t8@!)MdjHH_R1dq{W +0MsU`*ohf6zխnW5tMm~iq‚zdž6)qZy'q3DMlJSTakA崺dUVsy4"Z +#=x ϫD!CwF#'qUKđ<=Ǯ_sT>sP7+]'XAN}@u ol +dn-yʹ| 4A)U}Vk="DiAu֛E?yw5-JSjfD83=HطU7/§X *EQCu^ٸH9 e<hqBZ2Xu_iyșC'RDk*mΥ xxfGQu^YXaCu,7hCү FS>ҧYR< LbWc#GwR§ s-#gW +;ZqvgnsK0Y])Q*NZNc?n볫F껬; bBc)ߞcܦ>+&`+u`:H %Y@z̘' FmŮqk +jj6R/,T[! v/~^."Cβcabl9+s%/pNjG4oEDû-s\Y CӺ)9Qɑ^u6QGCUX%{R"/qZ]ΘȮ`bB|8s:UTtc398@z\)8XS+7 Y%.. O\]yPv +0}i!1C\ϲ:Eb65$'ȹI/Lt뛽l!o&gUmSs7FÌ3!*5+{9D@S j#b\FF6jIJLYGH /óc)(evbW+X&4&4MT+j=젶{Ac(K`aP0e9A +Ej#Xg?C{Q]ݭ/i8ZId/;h2LEI)1e|Hʇ+C<^F@!.-PqFs?#^2`,1d+ Y>͊kG_ߥ^A&䡴ۙNΨk'$ѵl#";.A@G~ +6I*nE2DJ670<'Xm12R^0 FCw¿~ 5K9bHNUhcY}wtR~m& &O.vT]{" <Q @U0}RJzKM+WʒsBsP1)AC^.Ҳj(2at6fDiKxL$k)sB7ƧgYdåAY<*F{c {-Qk:oLJ] 5~\o嶅/ NXtխ`6| +HwBvC%كf!@me&an ޻U:SRX28V:i8R~agLhGPG{qLW6Br10 +)dWS+PðE'.i]4)o?h VAT2їֆk:,IE. i?>Fxw + fUDzSRRsŦ ;FJr2/67{3f%?7+ҿ4=βO<:hs>OaߑKdҴN2bvNGw} ӿV<-y&=%xsQ%d%.N h>Կ[Ɣ} N^RʑK[(M4<sXU֋o8 +rT@1iR"0=Ma4~2q$-_D-EHzQcuLf*̒iaU0TA8~=)/,k)BUʇ8aψC5{Dyat%nPSNn=?{dFn]3K 5JeJ:sLet`^9]LCn+rq-I& p֔-ZH,jeGËL:MQBIJ6u9h;4x1 w6+#W!QTR^zVD|Yo0 z6;j?[J3ìPNVX^&kz! +`B, *WVM_F{r(l\/Ce=e ,mr_g` ByW& 6 +):D{\6zljdJ]duī"#Oxl{W|A!ղzJ@0iL=-5 zeڸ|[D 9p)$6/?c=k:]!%2D3Įl1ųJ F2N6*=03I rYH0 +^' +[GY?$_nD/JYX9on6gg ԩve)xttRIJAĝ8`;5̚ ~!k 4{C}P%MYK cJŘ-l߿sk14:ⰼ|gv3. 3oq{wI3҇obg[c.jf^<5A@^v~> ,c*O <Š#fiǶ[ad $dDQٲ1ڿzQVokI 49 <5ʘmf^8&lV.P-D${Nnܻ8=>P$9`^`m]OeT:_6d6_8$lh"D/ֺ%T|0k88%2[ŅҊ ++fۭQ2 =m{O8Y`{Ty)¶_aN#͹M ޗ@AUU)( +% dѥBU)-.@s7lR5vR$$W71H`j[:ږkș|Y(NQIKel +y3gf,h9 +B#<1\d^Vo䡷B$gU5jp1ޱH*SG+یՑl&9=ِzRnpSi? ߔdS\D:D^DnUi JK1!t mSOZX37kO@/3 Ձ2J'\ e V\Lwt8C_Fd!8ϡlZ]2zIK8dEdeٙI&şn#MfoMZNZ:04BTcм$Vޝ9o06~$3,?})0oNդK2KhP%?fwg3,PoG[+Wkś%`-\YcAau}v4qI LJAj,w̯Ln!ز/^kMOq6! +6 +:9se!Lٿmq%IiF'C#J`K3 +04DnmxQ YL')-M,8)ڎb3JſQ%5@od\-BqwNWRH@B+k_v#=(`_Tܷ:2_}OR'3%jK+^<9y2\kuÑo@Ic[boC=ZT``/Bv@;^Zp}˵ezCƆe7Ľ$H3w]#wg`08{bʐXdM=xR2(Tʡ5`6ccgs\R?DZS.!W +#Oy*S\16#(l +]5L88Ipq7B#b@)U $*ϛ[OSkw ,$Y-Cbt=I>y߬q;Z60GB?^u=o-"0+"w9)^s!l[̞ +y|(Hv6~PѿZ67MNX&2}=vт'|B^Iz(N!,G ,O(QK+c+RA#kZJ_͐ܭ(A1`[{@N>AS5*]9{? ȕy;,zMr`:s& =5i_YCm5$fO.pv?h +%AfD6ʒ-T X!2\!vCQ 7οhQN1B$-!KxJOkypfv~X<{bd/OV aqf/8{ @\i%9Z|ی@&,'DUoؚCm# j򳜁TI&ed"DJc=۪L\;aE'xq XxӸ0sR2u>/(E$]4ڒ\]@O$ +g~IP/+ГgXlYXO٬p*Ƅ-J0}Iʾ<頇!ə̋U #X-FN7=<K53+A_̀$;h]Kw|?M)4qJeၼ5p,e +_MrH]Wtdnֈ=@p͗II]b¦ /|Ftq$O{ݝ&-';%ؐo-2EZc웠-2Y^/IRjYjTF)|syf +}@W0?r!6Zr <-gS']EӦ:_C_M5pt'>:HD=eC`~>0yxtN3 g{#oU] K^=ЏIVP̉% fۂ)FF$C8J|6 %֟k+`^M ;2+LfzCb`6f# +u4@ -b=cluH"\P= Y')e{7J~f1Ԏ#@**|>t <3ռhs͔֔tm#N}9e e&= ŝڭ9 fV{KAgKNv9̵D 5/ 5+?ru8Ųd'MJN̛"SpuHy#G՚6|eFՍdS':%ln1~j'*."KeJpqyPϜO)zA 7pe'<_jI^D */@-䤄jw p @tx4TIo[n9Y{X|U~X[AG o3_z)fQ%"3$/z?^V֫ѩnNwR3SJU.iL[rA>W;\P$΁~l @P|!*\BuPaT<)%3'ud;r2@ZJ|+ M+ٗ}R ?劊N`-qJ| iO~BV?{+mn.>AXMS/@FN`f}Q 0ldzhPx=:m9`2ܨ>C7LFh<q ;F)׬z:`0gjriؑ(P։6ˋ7Ǟ/y.&O=Amǝ +f9 3 !8K.r™22;|9Cpn΃[Ax/A.8 ƫff+n<F-P=GBLh8t:L[@hVEy^`:i=(]iPKs+m{G2pO)0>@BY~1UyU:V2g;`|c p"]mï5iZ4l?/⊷L)8TQX'={Tx)blS3Yb#]v[@摩Yw=6|rf:>_fv7 v y}ܲ[`dALN[ܾ7uiL8Sl7$E)Ul*;%'^1 ̦2km*< 6X5h + y*KN'kP/ HĔ҄t +:̙bKNu,6 i[x_mV5MYKFPC0z7<}VCoӉ @q߯ vL1G"0jK"]H`${b}AU.txɱrgկ#y.p +qLO$ .gq%DXB +|:J=Y yD 5jQ!of<$߈MpD:} +P/{){?NςbJ fF*#ewѣA?̵ ,E\>Yۋ < 2#!.M|֗&1Qt%_Y Kj=atp)F=cy&Λy` rZk$ b|#6/V$9ӈY!w rm+qO[ܲBτ@hpuJ?2MSSfm S 'Y:5TxTGH9MvU&ecD16l3[[Tyu[א.f,ƏUݢę~a Ď/>'%ry) ^i;.:G ysZd.JӌIlƣG*`EE.NS7 r !*&4 +1+C&un[R٧jXA峳6뷮vھO\`$`M}IfPot'KaG DO*]vJѩEu &Q`)ɑf~}F*^KP%v FIe:c[`'Z8 S2vos͢5-@8 !aW5bkZѭ<ӝf}wRn_Uxa>BՊQU0d FgKw{7"UAB6GHP;=H}G;}tp&$06><$x:[`!AL)xm@g{(XBvbab#;oP\iZ4:,J=jRrfSVLaF[B[zZ]8Uǔdvol0BV^n_:_;So +tL׺=XAG]е9WK̑]-SɱX5&2a`$hQ\ZǧU,+yZ@_Z`NIVsQ +~^76JmuI'F)Dlsu98{+o* .nji\i +먹hVZ6Yy2 +c6c Yϙ*,/q^5;dYDGRAW2bє%D$-> 4wSļwm$@x@#tgH0P~~ -Ort(ޛ>U`&j)6h'74_♀^r wCڰ@9[ W HX\:ŌAn28{ oA9aWZ9I{)*b?SUE'+QH5r¨I+Z^F%g-v!y7~<4hIj\ͅ00IqgȏٖXYsj,c?1& .TXݔN*黻XfG7ꦞ%9.ߎSD [{qtj#3w$o_h[v-+;dmGRmLP"e(d?/<rXqH dP1 ӱ,D(oK$*{wAlZp+_=@AWb3~{XC@8;4P[Lp+OT.z >yOf,&GrgxdW8ORLa\+<dg8s66 bc쥍E~w1 Z[Ȑ:MZ" hgz7IQ7by5 c$:v3SF2e_8TwQ>+}9l-sc+.? ˧NB]#MHHI%Kf6FѦ;ԫƅYp^m+j}0yQ rw;GN5ɍ9}. %vOk('-zZi3cyIPUhD“55Z/;Q#(lZ/h<9,.%glPްnװ=:j\rH$xƒu?"wVWhSH쫒<# ;@ QgvuV_涗BT+OenSxXQ" 4%)UH{VЫWirKF][7tG𙠯zRƑ |$Vq]6KSځ`ҕ˳aIί>-H&ܫD]X짵x&4*?[N[hk*Zjr (x5EJ%ezxWסu'}YpԪ_е.VéwJZ%B?!ku@5S4] J1~:Ƹ /蔆7&;! ]97\S!h3*& T!+n `tb*ZR;v4]\~'B=w +*2,)qexN_.&k൦p#O}T>hn !gٳY%A S6V'욤Aj]g҃-Fur_] n$9 +R5Rީ@Gfs06gQbL%lKdZI/Idim17 '30t=$npvQsFZU>kުNLsgaƬU.]9'ha͸J,ՖxX,]a"$!-4O,%Mu "!e +t~p,*w>b9n4L >Uev7udƺ]y()7KFrc\^<mpGgB`.r_b=Vϣ]4=>N32#J'2v*+Ɵ'K!'yh wG `UQdt/jkh9^1U jG%HOk7Qy +}#mʻ'14-v `qkcܩ+NSaS_@CIh0U~ ^L˥P=}B<뮴lA`!T3%XY4?JĩP|*x ؀ۤOHDrm21A/g\Dމ8?GCJ bJT1;cjqe4 c'ۚz:Civ} CY4~#&d{Z9u틉YN0-=8% " )4FIYfeCi.b2=1SϾ4%[Ֆ@\Iȑ ny ! nýA祣s 8樔x" FhWOO秣_cG2kKߌpD| `=my5aY#ЧKa(t&ea.ɏlzOm0T_a g yˆFh O+=τHC!gT +y|UIQ~ cY4f;  Ua=E>K<Ä R1FMW`hy*57a ʣ#4XNlt]LEZɸ4~>@Lh{rXr|-;~Mu-~:P#m!w,LOy^-]Yol=7C&~}PT+`_"JL}pCH'7PE 'eX"Ux@;mZ)@tdrfyS#5IU;¸k0Ewx'y'^^b-vwRAQyiqtKoљ3Bs߆5P,upӉiE"E94rP{KNjmh["J[/bfns%Erh}S6}gVK>_:F~' "ݔa;&ݝnwҐ q[S tLpy )Ǝv3ґ㘕*r1Tc9)` ][8)r. "Y  .+<6LrO){:a;6N8 &^;alc"nVGZ-pEXF> +ӘdTޟM˾B;%غ +"NxQ's4;+[ +N/%MWYdc|r,"0* t]joO` ~ q`B YR~gZR(GX/-G\QK> .5bXEEƓx|a%#P;{Lu ZQV}*9h勄 C'V_o7^@v=6φ3n^UJ"e;0&m8#o 0aH9DW7U 0Ǫcq,[}x1MЄGd582gԸ'WbNO1GpGSOo96&*` O׀={e&-;Ӯyt7=kxbi#spKH-3P4_D@rA<*7n"rRRࣟ:xEi^6̸9\~SAЗhjяa|#GRʾL2yγ 5e ub%I(YmT5K_4ۖP_uS2}!e\`RP>J#gx5 od:'㙟¤L׼S,t 1kO#?%rP,N>KF_w/iO!4,8po9Pp5$#{R a,dX/Iu|92)%G2CIo|s2Ne!Tǒ̋Seh:>$i}qX[:2P-Ā]`z͝R0틧ʄmtq͘NOM#5I +ʽ,8ӉU}!7Ώ%}Rj,)UpFO9Pt f2@;s,f;Z13܂0̰ +Y(s^u_;6d 9G`M+fAB}$#V4cn1HxfXDFbp.>%bæ)c]Ȇ9~KJpdRW%ׂDKLbBH(*hXAZF3AG>e\# ;>,$U^']ފC\Py=Q; M8@VZr4aHĖUEhK%rR{y(9v~D7WXDF)"GfLOyWrV5Ydn iNj$pj`.&֝'{ w#\+̘nT/_#m0\}I;6,ˋJ1l$ԲMqɖ~(/V3 ė9%d]^p?\c, @:܀E0<׾(;M(~,_j:w3/QOG.ܫ}j4R3V_N|DŽ^i^:7¹>^!)FR־zM@S)=b?Kxhf衃ph2Ro2h~5OClmeQ -)£|otJ5#S%-n||G$3? iW4-6tV1 +-Ϣp/ʧe.T#%x+*/V8{)q Z젮캊̹pG7:u]=nzؠ():a/q,W@))ɑr迁g* YI49N:[@QyIi&8QwaZzǮ3{;W76~O;FjP`n2˜Zѫ7Xf?\ Jk4ʢ7PCџq.kX\q*IA3KljNjW3<nf䒏#w90]ȓ^HOJΡ֨sT*?'j<8n޾= 5P~بd4 sQQTt=J +\y<84| -]#/M.K(ei'.v.1.5f4e,^mTA/Ћ ?d;%!Y0+LL{&dy,a7$K鹖vw [^)W.!|C;:A"]ilzoZ^6qe5n't}zy"8'9hgh#+p 4&_2g^R5<FhӀlEs0>wA6 "1(ȹG0էLuAM6^Ya<`Q7ǯ X# ]~)u]1f&=kF_n|Ѧa@R+|Y`e\ :?a|yDf_0%l3\*"A`(d5-YGQ,'plPnUvd-Qn9 A"3K#-iεl®%+qи7ڎ+ |w&o+vNqʧ+P" 4 W"iW + !C-Q@"M҈1 +Q +zfuk] +9܉pu}tZN+#v<]Z +ĎHdNXL~͟S/zkPAJUu`F~o~NYvclNO$Tˠ>Cѧ tkbG&$ <>CTch!i]͑&'0;n5]PfŚi0P1OYnN͸7w= [X̃R_Ҳ3EBlHAnR-f`<ĩx uRQXPSJ|{c.[A5qG :BnՍpw\<5st ;6W۵ݜ"JWy5$L:L=|iH M +6D05T(/l'8/tn}lZ<.m#cn++(A7&)d]cIeko՚zşi1 ȳ\ݕ#QǑax}!Tw\1I}>mQk:w$=s%K50TȂl. x8=8Z^-9sJ{X} JƋBM`=flFhMlQ欔< S AI+\B +BƑ1FLN #n7e}_a܏Y(]-lom'o"/INl"3KݼRRױ4!`/ +} p,Wn\558ޔU>wBAN*zM#@WKGʋuVNdɐ62!n9c&U p <^e~\S/%\IujS(}).qm}|:9b=R6)Ac P>HC,<9TIq^Z%Qz'X$v$=@㚣h3+ tԎ`ʽXRM ˓߈cf~o=mǦ1.0h?`9-wz..G- +Ӂ A C yC&Ԏ9KR͚&m->M,G+0Fq4jNOo0d's<!ig~DwM%Gݺ24zk6_Vri[h8rC5HsWT[@;jkܱ슃3>`P +"!1nc/ Mnf[UKTRBnbjV4wIPY8&SPP2Ͷ.r]?-LL{q96~=(\ +7N$'3A뮾(A֬Kho9hII{3T\Xr,m(£Uꛀ=(LG}Wsz>4WAH;)A#ny{%z?i [DǴzBUmj]x'rbҺE>X忕-m3.:-'JZlo>j[=\ +nωkD;"b={d%hmo +N?a"\I1!흓(X'MB.K@:ͭ&d5{%M2iWY ۣhhnU؝2>8u mFS4*-0v,BkMUB!r1#V#]"Q "ǓQ4J٨i<`ĕ3@E{c(8~/NyjӋvNF ?_7ƳQ`}s]Дt]ʔE3lS F6.CiL.OsFB EC/|J+dL%rU1ٞ ]ᗙWW CA1oh.{'  +],]PBIUcXVʉ]L![zx`g=9!u]thJci'UHh#) ڗ}yƭ $ +p%aZdpJLs_[`&#!Kee=HNR JU6sXkXtW#Ӫ]%ů8Elu9};oڇpǀWYtha'jsk'*{)ט F/Xz'f~S}υ_ +"$C5=s$v|]2ޗZ^wHmg5 !b"p +П4>3e4{d8a~.ZO W[0n3Ӹ؎èӺ&8эd,RGߎu`cX#e' A'V_4w @q]' ZŶ/`l/!o'|@2@P5"85j5v MO:ضj5o.lU_ϔQC!ӱr |8JlfΓf"z" z9):r)$ޕB"po!MČ1#<]8;f(3_^٠Q2*R';{ +{ +;QW?;ћ`CYk9Qr̭Cп, / +=ISq,\&reE#T29'ݞtf{mY7TE"rdɯ YJ{yY'Hy5N< ngl_̥)_B0(>ܣ4=T"^Q/ɍaۿQFntjZi/b̒:]V;;t + +gW5,VLLs@`KmnrJ2UG*^*W iWӖCgI6ol)K@hzѱeܔZmՌ;$Df2T+h$ +Y<[)*j}瓬l=QpFEO#e +llow1"m 2PAbvKѰhAƑ 57pwD2^ ʭ]KlaTt@Y*/͛]-+ Z+]C))1^M.\SI_fXcD?)'4%(tj.z706my+N|7MmQ PwqPϮ/מ5vPz32@uo'Ү/( + I&zf5mUsRzl̨-34mn:OX.#G.yQ=0>oBVgIbUُ3 +j ,#BeC-/ϫnEj-BaF: 7n-)ֿ,G,+ uSưmuo3𓽬5;P w u1#tYhfrkƹNq!_kkQg%NљbNPtVK+apΪJUge7\JSӻ!Y6K_a 1;rHv_o6Fi,x;,cLi"ʊHƮuk(u^E{yn7A]@ ^Rc|މ>]Q# CmVĤӀpף@iUHg 2Mq84eZ +@^/t$9mܸ]} +XwC9pBSdW7@5$I;˰2V紒]F_ۦz#fȰj#4X lj&mVO-QUAO?W)ZLDP9^;QQ=Cܣ=NMl#wwRKxYc ȉuWutgSw8>Iw^ƕ87Gn˭VaTI4j ?oWNۓ>LSa{PFRZoHSWole gPj?o16?'k6}n@[dhpEu)\ikTə$1a +fwyH!0JleD]I[`$rJh: )k~uejVRK4,6K;{OҪ7.[1BmɁ&n22N =/qM 4,㺋)Ej&=K!-dyA+NQW(+̈́zxeZY1oǔ GS 𙃎 ,PTU{Ġ/^ʼn9u. +z!`!~-PF okE ɠR* e.xs9r/aS7e 7ļ7xk  lmXhC_.Pч:IG d}Ώkn [!hR9{\<4N'o=l]^<,xbr;0s* S7 #*L)Kiq2dZ0U>R8AÝqY$HA2@ ث.HҚZ/ ){ˍI3LsTnG0)%i`.QO3FUyߎS&4ǰt>pc6<ۀmjwJ-BX0ץ}Fx&8QX/v?V|liVaIBrGٙat/-Z0zXEj4|y0Fa:)dWR]>y>% .3;/Ǫ#*]QKB|ʞ 9y|`$CLPR`rd !0~IT5uߚ&1 E'ROٽuKoK$^d,LzN !@F"2_acf[Ժpm_4>KSipte^lE?w+x,$2¯Ѿ]Z0,ݬT0iw^Z".`r'~YKs)u_G4|ŵSR>Ғmxt'%ՠA +BcGmQb(nVZ!M&[YAڪS[dqgOuzq(MMcxʚs!.GZ +D$J$A8^0Qhv֘ğ~:*tʠʲ.VȂ>v]W-FJvߝMqfq] _a};ϣx&Nz %sl!F滹LSn着@/JP:J&~Aahs0d ̍u7/ |R_+(\っH258ۧqQ6xɦ.#nj=aB\cAZ0ywjqufz1X2./ٍHbO|y~i7:qgLuc–AfŠNE5ð7)ė#iS2[b'L@ y(\_(BEƫ$@lp1nj|H.r/KRj=F^tP'K>Jt FYIO|ْ}5/ 50%bI  6 Y1lKϡȎDG+ +=%zM?; &Oo-@F>:J5 ]QL4KtT nϽ2ɴ+qBo}4WS7 S%6R=5E4OtŝRc`0[AZA͒a#CT5Li<;!]s c}͓f#q+-cCR3'TѻŮ$NUMnOIǂ >ϵD|qH3 +9/L1k^?t\~%"T5FT[S6}X)}Lt';Veb16)v9F@5Ω,wa]<;u K>|)h[*JT$a7Q^BPap.9q#6 Bǫ0_0\Juy݀;Pe?a:R򖒟X.jbi|lp-C+j[fvcsaM7@ z-8 qf5LX[!jhygPZ;Nmt74PXh?AM =;M^٠qj0js)hvцтG]Y>OEWAˋroD[a4yJNc9zz%EX-TP{uz, ֈF=6^ta̓"98򦱠IF&CdxwkVe%Za!*U4ӗ} #c_ ܷ~?KݨM Oک(R@cq59E@tQ;FY( RXr0zЎP+oUjJ>R ۍ`c&pIO.Ke5N/P8 gŖ,T%[zx9‘u0` "WpLg!Q 12Njq<6wV/k2I.exMWs^ٹ64Pw%:*i3'j@cN +)kz4H-S3 5!;P;SgɶmU +AFtCqrх L*cWZ)!h>*{\Pه㘟b0Ƚ F &{ +|miu2/# [JRr8bx4f iix>w/|8U(,"8ۖ˻3T +9PNCۭu.29d0pZEyh|m]QvUgPr7'o<}e2]wZ2U"KÏ(Qfßa2;o@a6z݄!_ IDvj[ +[/&|.ܠGdxV=xBTedb''E{&5}DώT +NƍԔ Wߠ`e'z9wIl ,">j /4X}=A2wI{T_`C c$H K0 ziE?&H UZ"3٭561c +m#b2; Y&a&i\,ֹg` Y?Ý|}ϱǏ?G#mVz>-+w-@F8頷;ܼ0ks=8b2!XD5%kCkKQԚKQTot_|/o8*A%-!$+'OGkK%Ը +ρ&quɨq| ǫ-`z+k`y_6 įWqYL4|hҵ“h1zƫpu7#ɷHBy^7MRG6( X~M9`Laitpx2;DiU.dzJKнS܂{!Ucrh*CC!JQQ>J"&1) j)@K 2S4:d&T٥? 5׌N8Uii2LWQl:'@ːϬA[cF3&Or-3M9Z(^S5[jX߉tO6|yqDkw$"݃aBG-[q^ aW +endstream +endobj +21 0 obj +<>stream +arrOJwx!ſuGĢ Q`+~=ՙ{pO0DMQLAV6ȿW;7Nn}_dܽSZؘ& ;xH>4k5@2.A2Tӟncc'RRA]H%ENOaS*+RVsVj&MG}ť.4tk? BQ2qv嚑i?H1dtCbz}oIДj_[=[ѲӠy䕔o739?ѳ j˵3?W`oUIbǢ=Β6tNwBUS1 1$P߹9,Z_6" +8iMaԚ1SCv$Te~i_ ~_+d Dv~10>eH FYϺd.9.0MRL-BSy1~J?}!go,K30<.?ww3mWL=Eo\25Vp߂ g/2ZOlgT}8:aI?_<<h$M<=Ө"֊h%ٷR JҥMdԺ5 :x?wi E4@ [ mgqapg,ӂA>=dA4z͆"VR02`xVe!XC.qVzJ \M6%dkdIV.lBv x1D )(DZIX)h,XQ?BKI4|K<#Fr$3vh!*ڱJd^-'X +"++X,& _V?Ju< ԳN#&p ?mťQ|NDa+(N9ޙc+ÚyK,Դw+{9"`ӛ2hFЯxzɥ}lB)὜7WMlL%-ca:[=GŢ^u +u_pŸqpUa+퇇Hd4M}B"$\AJ`#R!sǕS M|>9k7 ȆP& yU \Q{j +g06LBN94HՃwY?7j40g 1֑/6¿/x1`+ٻD p v !62\UwT]l!vD3.^W4esDAj) 󪐓3vµ&X=$ K6u:r8ђy0ł)5]1HwH㴯F l02)zF1PιzEfe(F1G?q\u݂j JdV]xMtm1)* -űWt#V}wABj'Y|JWվݞvAZԹкDJ dsxyfMOʴN*8%wKcDTU +Ml3SZߔV xӆ"Ru\%s.֪/N=hX_///O֎@(^-k)PP0(^S7L:F<҄Pa{,~MϾ^=BZy"O'y9[%N& + 2zV + 7߁ 9hųaA Q&;Wu5Y]^бLmŤJ?: hnD&RKKrȦse20ZmΫ8S@I=/8X6k;nK9wI@n כ^yg +>`+P&.HOoKîn{e 9_s6q4+߼"r.aJp2 PB!Uk9}t$qyihtյORIŕ[CK4rc,GFIweF0RZn57_"wU:Uʛo0 .#zZb+$ΜVU>fə]$B6"fh P"=6 ƷWlOw<2 +7wǦyv,J+y7b"HQz>|p͸R},y.:~U C`=E J7wAd]^Fi^L\lt^Ns 37J%G<Rl[5?Ul$% _h{sI@;"է<y +*ciVG͌%dyľFI +3KX١*\l1[7ih ]TXvT"sKv-Di?H(ț2АbU0nizn7hzBcL5;(X&$f\2.C*^/^HZsΗr!}ܝu{poC xKZkH>#+c|vUra{rQRvlo"Բ=]n-׊h(p!&FW.5j*Dw}Z8AJ2aaޝum_2yʡGVޚ!2,x_F>)7,VR$@M}.v=/L F 6W~lH/QA;룔 cg/wHP "JP'fɧ tU.!(YɄ$?Xs0Im>ڼ[3{ itp">;,-톊֍S+vڢ\Y boZQۥ! mxiHGcp۸ת/ČF{ &'QjԬu.ۋeе1'X!@|ر} @AVp}gXQDs킢VǏKr@/0p(:-0z)lh Ƿ:zӕt6\u┇¹XH}2Ǎ8eJ*'vᮈXɕ棪6*L-;x=RZ4_ +o&]g$]EfួcPSH1~ɵ0yv p44 $B: 01QH,S=~5 +A]p[=zl'4 IIowpDʧ (CzȽ2;[ : zl ćŻ%spNFmVryIJ_Bzm&o8a_;lK=ώr2І5iPȖV%|~_mJ6] .XOЊɥG/”koC}EDq 7g.ɣoY;oIEWnЋg1sue^OOpϘ2v[Rq O 78[7Y): YZkA,4pt`4U3 +^7sGbg=oR F,J ѽsaS[MY\nÞu%XAPs-bH|KkOyCH.ȿ_5LMSi?yZDUg/- f +ZSԌh]-&L1`4L28y )fh'krD>U/i\BaŗH;$ӅUPTjG,`+s8E^~G VTӝ;Qհj6vFyE$0gbùiQrע![ۜD|x4nո!L%bl{袯8g} ++ChTdwB/ni~mH:>WHe}C)ĵ\C[R%5QdxS˱0 ~e/'_ū> +4D,pc&$F[ud)]$>Dl-[llp\t.t|t:`7ǯ#6+dfB/ y]+T +z`<eFRtU0p$ op0h!|A7T:Oc~(B CS=6a0a==$ٳ ؠ5_cϦ(7*֛eY 4Va;ֻb3gwK2Rڠl a4jCqPCZV +j8`f|G ^ɷVs"F&Ӥ#F;-lw $v2XD?@TM~h]ЩE+_]r;mB!@`K~!Eff!}!'"j.%1v`I7ùV {<0%lE9;~ @>/˲$ &8`s.QjTgY-Xt0iVs@RuRC|gV{7 WD" T!<իUA2-˹g~Kx*`Ō.o Qq;J;OO$! +*Cgn3mB/ dK `j_7/&? 7F?# xB` U~IŸ짻s- 'm,`οmtPo\֮sc +.E$)mqۼL&^&-gW$Պ/:HWX!y!H6Z5F Jw S2zBZ3@MwWĜv޵ +q~`BqZdUؕCLh>](A oΖl4ʂnCƓbR9\$YւSZy81 i9wkDBoۧ;Xr+A}!+PS.ɏpn UN;To{}\hCbp/XpMh>U{^+sjC3}B +1%~O>nx+K8w+94Qj!c]XX~*iQ#Y"GH+gd +]NUV4p<Ǖ2曓N2F]ezb*t❒Y7QZ + B(qBNaޘnI1JVɂUix\*\" +8/A˪vj@C[] +!< 8xU,Yrb cD wE` X3p(׭>44L~~? @rh>Oyң͓< J8B&"3w֪\CG +lk^2'q&Tp 3I%sᬖCi oHcT:E7*bOs1eacFUNQd% +|\PQ(Eh C4fM/, +y D--ovl?>'ɩɉ / 3YRbZ2:ec34fYlH9y3Nq3t{ƅB'uUs?nYi4_]1%P@x>~jGD : )"0/8#d=g!Ŀ[a +~R̙D[t[jH}vZߌ(` +neD (^;ԬU~p;OKL:l~$Tgp]l{H1/E+0aSĽs %귄,Sq#P.Date %\`l]=7Tj0i/O/ b'I>G#Xԙ|k~h1^ +ݏT:U+H?´$FUr4X܌%]._1]YԻСptfػ ɉV &^ 3aU[zuvE}hJ~k&J ?-Di7q8JĴ Cdsļ]8ᛀPhIQ*ӪFo %Ft8>pz`zbaՌz1Ϣ1-T^ BvKvr\~2҈ƭhZ{ȐJk$Aͳ +:0)눗Njn'j{H#$<n/5Mg ϫ۸_z)|3zúPL B~Iap+ױJObU^Ӗa^32k˟<بLCp떥[t俣qPK\SӭFgj8;CzK0{ʽNvG変0sHEmQe;rQ恶;>/pw![+R)bmEO2b-H,p=#@@@?GJo DQv"2PE( w̎~b +$~zi) 0jKt sg#ZUYujC~=HFjy Y Ja -*ٴDbd֎ZB#Ei+tt>r)8v2 !͢ ݣTau8K*T@O|+}&N$N>[0k %Q?Q5?rp +ozMw=qR|䘂{gH)h)%tl~I1ufh%ǒoONo#tkx/M]xBփW-`/.Al^3C@c[)ڱcAő1>"Gt$WcȸIFQD[Ț $7 "c=#IEuf#F2 k*\"{l]~8Ynm-Ѽ{LlC~TcI,m+")~w0t2z-bia8|.F;L*3[!sq'@AE5 q'))Qx],y*TMU5O;R>XmmM ώǀZbCT4J" JŠLҕ`}E!8;e>q=2vcΕpE W*@k@(v!}-1Gđip̏0LʭДJ:(_Udl|bX ֟G} oT!95TqA,5zG eثٞ|!npFH,10Œ(k24.s@enOi"QFO ݟTzD8Gh#$@% 1JG +1l>B#ބnKn /6{ *#9> 8"J;m}<ʤ'`FG,lxP9(݆%L. 32gjBtl!huK #xHn{pWRWh!jYڭ茮&CRʉ&G#nKNR55=AL٘Eow&ˍѼnO +^< +X+p4 bN% Xu'YiE tqa墱³^G̷}L5[""xJpү'bG"{ +:a_CH+aax1w(MMޥaEexN#~tke.f) "v%.  wun&pk^du a V+1I.E|*4e$TTZtXA14y5kIJ˧oo +oմ!U{Y6r6@iS* `V[zb!STٖF蟆8ue +@B$Rіf);vNv%7mr&\B,L$`CH*߁[|hvYlEq/qeCWcy8WD62buJ!{Sel-J,#Qli~Z> K&1iBz0Ӗ^{9fqK&6OGW^ے-Mb|\%),7&%1~:XM9pC<{G36/V'4OX9^MHE~aGkG%*0b^2gtV&&ߎt>*XV)u\Y8N蘫-ܴZ{WgH' `|)'ܘ?Dbesӵ]YğgoFCH {χ3oo yѐVZфdc!0ptF(+3t<[ՑSqZr1IeB2tbEjuRfY DX"ʏn3|uw@op/\4"ן>d=qa;_!snw5 +3pzv࢏cg:<5*Tr aRo#K_D㡐@B\Xx]=ҶxIF+m-+53MG>TQ4xzz= l { ر9o&WQ XIG~IHQ $B {ӈҷ"7B厲Y{r텳ͮg}CV?z(L{l\}O0_]~e\FӾ5+aTiќ޵+(u/k*#zvS;]Гe#MY i3| ^fLgao^#j9V{&W*B}d@,vs1CΙ3#C3{Q ʒ*ɃT`J?J=( x$j΅|9-Zws2cP,/ f( ҀOv\9֡eifrw> .mWw\]~ myG iXR"mT52tW*I,TL|se2 񕩐/m6h0~!JJv[ pш>=ѷJ1;c+`oZMG\FG*bW 1[CMzj~ +A^!f p +ulPX0Þ` :jSCVzLQB}U'Z2r{\ <.\S 7#l`3lvǛ B4__ãH#Psr˙@O.XgG1Ae,QV%Gs'#&By>y^( @ < +/]gh4)35ruI~Z>ac#(wx;sb`_6 aEmv,4!^Lamv&L@.zZ΢tkLU+ؾq`Y$QJe]Bݝg}OHNit +LkA*2%pd f|JV qu'4lQʥv(T) +DԾh֝!ڍS4-n|d\pÎbܗlwк$u'9LaϫI"3J,vJ޶ɆKܥnYpn0r"h+!]>iti};1zxr?{'\MHПUm@QB0I V~xpJ!y~QZϧ([pERMuM"zftyFIʵ -V:aטpj8N ٕ?C} Z@徛7]]\{:ȅSgkXqN>]N)k>o mM? +7=E: k;ڗBYK3 &%l@~)Y!ˊX@%)ԑN }b~kļ#kBP ~c< o@H*d(٥R|ʁ:[ u +OsgtkFc`_'ib>\/0BK +SFl于 9EfƼu\9Zt4ۇ։p+֍pH(C&;-_su `ve3ϱEDBGEg*&u& RB ){Ƒ'b^M'A8v0A 8 ]][ƜH'<γvU7ҋPN 9fk4d_;M>$nLst3o[ +a+eCr"l-$EXymx֠:)[/e;PSU ? qC e(e&$,BRV0$:,`bY$[h'N4 + y} N/JQaMRcp!Eۋ7;h _.j)1Vjd6IϖJ|uo +@q!gWodqߟPm03TBш{6aRld, 柱;Qs4zS}I›Icaw"3۟]SUhÏ2nTLi(aSPjլ8@3lx 5-m~x~C:&Todu^t3p=+uۈb1킩'#)瓛Zg4+eΠ8U' +^ނS"*yS'4N/-9!>בIDL%Xy&#Z[4$JP!~ ;8l \uX$~оV0-%f7\ufs,15 +YUmwLy{Ÿ50OɚBDoG14zeCVu@Lۆj9^ nD+: aJB,Gׁ\0j3dUw `IؼIt=X[%ގ=Kt)OF*E[K1݈ / +ı_pX{km`J)P_hӲqf r.IjɌKFxhW`lX˾$GȒY"L9<[ߋNHed 8kHq LL3ٯBUn%9z[!^{:選|/6W߈}V[72L3 +Bů_~Uz+!ɂUSA EH(p;0^R 0sA*]S/ֵOBL gY phZ1/TRM2~;v3ZX$\Zo +~(* +׃N[)' 3aԖtE2t+h;'ς+{&8 at5ye!E0mP7ff ]; ,c%gzv= RnQYyRu~RJd Nؽ[;kץ6Se怜GzYsOBy<Z&ۻ`'`4b16}9)6.!&pY) GD p KUMF:AYmdo5DUMTb/䮊='~-vMR4U[i>/ƖyA'e +ShmGvClPnׄbX$-Jd3H+x.?&pԋk)ys&J <w^ۣ]Q!GGP)F{!/4EQ׍[L% CâqJb|6yU=_!_ACpmA> P7-V n3T/y'A(}V_X5EdW~ +UFgS z*Jb`*_FYcH-T7:'E-'Bxw# \YU LM  '– `VSeךL(0m0 KBH8Jɸ<[ضW{Ohc*&(#G)yNuqtDž +$cމ94lWϧQh|d$1qLTEoAl<5r=/xgť)`klEzcP+)ѱԽ  laŨ3P_k mt$Mf>,i Zza"oXq"x07S#vPa ,kfE۪m^N" WPW횫[ p@;f$U*1}'־ ϣ(u&$J0L`5:u Ӊt'_q4{#hep /jО6TeQEH^@1,xg6ځ)`ŃqicZx*p׾ǖ1/',žbڶ@Szp~a#E{r a.$J5Vp" ͥvl9&:Ύ0P., XN/8Rxv~, (y8fY:A~wVZaulQFp;NI xmW14ȉ0 +zS{mHD SQ;F8bfp*<{E`W/g*n#[$^9 GS%=0y9vc\hu2`d{@ ;ǐ C@jQ?Bwbm.b[=";= oa[:DQ?`7Gæ3~so* >RSD8A;v9]n NWr7xG5TA Nj_$0[fmug㌼%zĢ(zlDP(T@x^(!ogn)"w1䲗cjM,wM(t!)w'Qtomy K[ܤ^ f\ݻΖqv!i fuj/3\ԧb;WńƩg}0EZ:-w +9lID ds5}'uA6acE8q~,SM7뢷 7՛?gU88o4F4DeΗ/0M> |bo$3G-(L~KjW' +yengV~> t< !Ģ$#_8+3/u/1Qa8I} ?1"'-cD|6OJAF;0m,NjOuC{op8%Z45J~r1֧:j%kT~ic&| K9S{i$r +ʸmlXGQ$hڣXW(P:a&K޹Laz)6ѯ@Q!ѳX.`L 7DX~ FޢZ.k]1T2嫣52h?M +ꑏ2P.qJ J^tZdr7>Dv~Þ[[(G]-;r';DpFfz'kP-9)&ڗť|X8!EL{_94Gt/Eэ>[lvqKh +qٽ@IdgF<3?,LJIn@-e{ +R4GdjR?֡CCd]mR Ds炦wƺI#%vG=֜S&je s/ڰ!An +]7B;c<2ҞϖS9Ї:) &bL.#nH%lC!}e |(xFVLq{E= \'X@X +j Ƒ+\B^"t6^n:d0,qp })u7@㉂ u I_ODEt0}8BNl|Ztx$Uo-Ϟ? +ۉb@7Ãq7!Ø!"y',Аݯ[>*h8T ~y{ TY` =&:WE|F`75A{OkrëKZ7ӓ}E;L!ɣ*m`GPyW7篽tn:-ꘙhI17 *4τ?! L@WAkjOCt ejAO-\fyY}P+{, +AǴ'5T@HN:=} piZFEvDy]gZ$w),|߸,NnD E3{?U +uҟ&f*_쿏V~ՆBZl}bN^IDp`[fRٹ` r;ԂUO=L5T:c]e?~p1=ڒ>VUP2=>;Y4 H| e + ɸw(aGuTjXĸ~}QN%+.~#a$kͬ븲}+ʗw(1;/.XeIjfZOetDHv BE痡Dx9%ER2۳)ۡQxeIDR,,ߧPb+ķ2Z~v)*W)+68aiͥ*a_[$\y}9.I-CPT?Yh̯d>+-%ʞtuϷ}2uX8 А>ϭ*{+T~LҷnФ|o +ng/~5k>lF$?U4ʼn< G;_}%MϚMu1N$>hTl*d ,cNH%?W^k*jbIn⿷jUX?ɕ +!|41qr1@/㞷-zo3~ ׸ɑUn{&L:!wՂn|o~D3 Ao&VY"pk9ACלy_;>9˫f?!HZYfn^{靌ww|HYs3hO35 PQ*afDY|/E6~5do#/Uۢoqn: xNW%cҋ_m=iQ>e3]q̯[䯀0H@K +6"} 0كׇ ʠQ|JkS'QUXǬt"JqaOvL , e).i"M(<aSs?G`S<9K m<Uqo} >>C.>P%:q?s> ;dy?3i7_,dZ,b {Q>#̩ 8%Z):cv\##[oei}"LՄQ/*NԚFvEE=Isem`aST1 +Gew#~t% =d'bE&S0e9h hA}WQIŒeZp_ZX}@]`Z:Iʥy Q$V[9HK=r F"tV'Y ͒t>VMA \KWhY@v&sE򁆔Rr^Qw4T{ZeƮY +ֺyen'2\/F '0#h)]-3?Ć/8#0ҌTXe80蒴36@~3m˰gh5eAd͛9$RF%Na. ;֙KJ6]f;[7 +$+ +I]P!(}`n[_UG%*6i][^b,xpd,P"N $ QCPr)=lh~6";IfZ:JGnSUZ~fSe^1YiZmoNwqU}TR2R-5r(u=.mٿ,`l킎[Z Z&7]4 ^k;(5օѫz= ZpQ Aj\cjˑ$xZvUŒxO`>a k<.v'.௪/mc<Np=Ӧ۫sGz,GxL5[6^j|F1~,.h★-HgH7/[{_wdnе$c #sٍ8iMn^ZXD4Y3fR-~I0\ڬMU-"O h8cܼTry<铀s>ϸr[m)UGi@;cFGEqzNLJZ~. *|Q +E$zqguc ͂I|KFሳx$Rjl7kRg~4>6MbHu.6BI5}UVTcwd뤿?%+p+ +Nvy=6topKR`O^N9F}K̓ĭ@M'PyVseR `3fluX"W  +ir4lWXXi{zs)m>V$ZYtB05Dgk2B@?%Nlo6T>N)OLte5: f@f}vU69 [5uEFl0`((wT8aQ02[ƒWgGPgxټ'>;M#;^؜G_"qE~.N#d(_Zqa("̈́=9F*v{>T; o+] + rg+u5S^2-ݹ[8RF (f,cHdg={46NF8;uA,?c uIP5X0j[y +\>eŭ'Wq+1ckx@G8+^ 'c&Yl_kcV'-wn: +٢Lā7*#S?]Z.qy-@+&`|iiKbˌo8˿h>xMmg +S%㙼)F5zWk'OUH! +bQN uIJe\Οڋ17.o! IY]1#Q_+7vZUҏuƊd0B:"\?ys\ Arxd<R_ܗ;W8FJ)=!xjc39Y09.|1 (妔0 )`eX odWYtTKqR|ќyTz~Ltu4TO#cxh\}{tբa,^h~e9/f$V /l-NWH*1D&8[ +*!ss8%AVkfXRO^]7~"kn /;سW$؉d`KNoX1p}O]X$xI~iVƜfT&.V al#3a^SQ8J%aY$x/YJjSU4Sn[% $<ܬV>6u)4eE.Ȭ]s1 Y\/2lݑn[FAʧ3 +tQ_qcChy$aˀ@?1mŹX&̷s NY;fxM k@fumi4+&W!Oצܒ0EGE0GgcjOߎ1-@ԷRY++Ih@X9V]f$tS@[Uu/զNm%;F8脊-'έZw;ey?2Mڡtt|np0$,SܑDgm030+O:>ą0MŃe|ҶE*r듉v4^dvt\u3 w[PՊ*ri00y)%lD_->q۝#"9eG *گ*VLε!X0;PGOTo6+H#DZ`4aG|7 'wkuk t(`c##? Pzٻʗ=kx'U 㘭X-27Qm# ky A}. mծ?aT4пiJ.`?Qą_쩡os<)}"-yQ>Bk'+mDg `)"à10񃚞\jQܬ,lj4Fb%HRsbC+>ѩ66`qJRr0b w.Mu~㪍./"fe)5WT5mπk%ȩ̼I[#o#wnp#oog +9eƒ4pӽB|.9%T5 ԣu+9|fW-(tI31As Qzbvͽ.-yjϮ8 Pƭsm=t lxMV+;/iX}nNqS[>{ tE e֋݁`_5=[p#4V_u7dkf&oo }ܖ.+%UIg*0NW^dUmk׌ܾν{.}T~/b0@8:n~E>׹ + (x2|3 +ƆawG+yǤ ܶ Y!?kN:wyzGGP3(kb3n-9eeq~Zۼ Qg0a7W_RxKwܴyvGTy#SKLtDwp/4dª#mVCU i1z:bT{$9-ן>vL6_`‡ä-I|G?h$oiC{.|]:u0 \ݦ#TB2 ^W;R5zkh$۸bbHԲ3J6o}i,ܪ=`}@8-;nEFLuSl*ez@)wL-2GYܪc 'p>\}_*j0jb#I k'd1 +1O-BkmP-GavpA]%wǷ@C ++%|Mv4i^_aOl=pv,g|Nah٧նa |EV(~yz r}io|ȿ>[AM,8puA#ۏtAa.V \_d!+#ዚ;y$?[v`2W@~{${悺¡a)v~WuJ]ɛn*j5'RGDQi]0~n3 3'XV0|iRItzz k&ҁ6W:t/6Gʚ0gzer磧D,&.q&S+v-06 گp>2 bEfL`c'BzY֟nu&!Lu4TV$sY:gchCɟZXaAG\{0m:wg;dfpn6x*SZBH`M'!/gR7A5?]:Ze^1p30hh*! cs;uw=/tAX*_ֻMyFZT@7!4 ,E?o"J19dG_1l?RJ:Hũē=PeSpC!.`GJG2 F2Mw%)Nuagj6N㲉Po})HskZX$SD]_@)g}51g2Rc١z";(SI \ѧ(ȲHIoGLX8WԮnd$jA:#3Up OmrњELCljK D#@^M3kǛ'ӢEْVlVQ̀JdE[Yn2-SIiBSz뤃O ànNrWd.>stream +9,S3t L usHso92" p93$ O0Gu^TkZ:qO/еg6JyjV*\fs6393b̒d|j,bYPiyiEѼHAam3#X>ʑ%AQҢ2Ao-ݸ.; V"bhE.Vd'-m>ɉ˜yPUpcFY~0 9yZyzL}׍t+N8W}'u(CxfESSZWƞDZ8z:/b6/ Çr/6>bKʹ|B,|84ǧD+.N4 ӓr̀Ll|(B6M-GUqvyAY[3t/YZY?mgp<AZW"{x -yHG@@W6 ,$|m6C̢Ơ_l3[iwrT8 ~MXFa zakN gTk'>x=uVP9+m,аȚ +QkU<_ENA/$ٯ )Z9lͯ5. +? Q dѠ-[:.l\= 8. +C*C0onb1 ^ Q//R|.K}Nfkc>7!{aʥ n1MU[<H8tkj#b1D314ނ81Z+"S5gVv;GIûT)]` aɟ 'U)SM d!<_؝}eP sm~'*eg[YPV[K؈唸I *A@A $&NߖQ=ñ7Lsu(pB#͂UՐdRUv1 ;$ȴ\TLJ/HXNfc$ ùzۂ cBlv(.TrةD,ѾeS6T^h? 2mEMxg#x3 qZSZ}>׋ok̆n\KYb%x-aO-77I(Yؙ'C.sAfioq&Ɗnnr!^8 h8@Ԉ$^qd$Y%(92_V=i.]_G%3'^?U2^+h#@4[/Wv0ܧrg=&#.䅺=V2]`g+iˋ\skHk,M?B:0ח+Ah'G BH~(-,iéH=?ȡ\n8$4 9|,׺vj㟸W.ޞYBj^ao{i ~3C`òA1>E+3xP}y<ӷqy(-խ*r]RjT?\x*PCrD_";rH'KAnu,h;u)[fjD.Z;&RN>2aGN#Pү; `#v=򸁧N0Sxm$Sh\%h@C|MZYM&)O|YGˍQ(*[(M ~*zvJ3m.Blag1}rp ѹB@QH:AzYR"f+Woo]ar ꦿb+kFu}3A>WQE{Ԁս O#Ɏ1]υs$g7_{8=yf<DVւ[JG;u9Qчe뮻_Jec0'G{ V_$0>B*fO2S4/zαte\" x#/٨'A>#یS'`XP(GfF.FL #VA^uܰ>J'e0HOm.U2ƭE瀷 ȐH=pU$DZ W +iF JMi9:DG\ňuoeAyZ{Xa2K[{)HۨCw YP{5[q6a=y\sKQGڇ1eN\M@#t>q:%q@b+.~@|Ej^]6o׆Ŭ?8eAN˗+Sft7 Hd6Nns:_CYfG:ufiU2YP-obAQ)'F mP_g_k: )x!Yv hŨ"++c=<35l8B >!3UZ(Pn陼9aES5|0I#0 +:e0us y<_їW*F-Sk^ygxJ\d)(JO{vAa->H ^PjHEfHLo!<؃X<;zB$BUUXHcqX4QPQB^:@2>ژ׳j z t-BviR?N6.qNڛ94CAv*;'r^p:(e#;n|ȚKk,:x7z1P34[ABR_7~?~Zvƌ*%6QC7w68}0%M_8vW<.n޺t'`a~)k2 +7QFUFSro1|< uo5ي]Nոԝ, J6&`cZW<>I!D^-BՊB"Fu[A=&ZvyESղ"~7U*D82>c0i +}>T~;@|v̮tYN RX$ +1-Zqp*Td.FyHUpdg1} ExQ) qO,KjlGJeN)#LU`م,zNCHPQj_}6csbisiepTr(bh/uw>M\s,U5K~DUVPヌ&^X:>n +c~hM ɤ~*,mmU5T [{cȣ+DB<Kb:\k"8I8!= !}k"%ҳ+IP=xz]9ꊝ^{oy+,gƁJAJH7V +̡G)/04QSdmˬ +#duTTN_}fX@W5j3~q%r"$CӟMƚ3@)d |m EʼjC͍16l fY# +I~Pq/,tBҊ#a}ScOUe+2[L ]zOG3gGA@ ^!l؄!7]S-ϫ㝫lǸPc!2>((Si,Q3*cicSqs$I +~iT.l.p] D"ۣS*,d:.BYP r&'qҎ5n2&+[ש^;а8rA:¼1]>H#tįZ=ac[ TN|R1.Vޡ5+h9 2ݣي3Fx|<vեc{z "#A0M/{CwVHF-b0P.a`aldeKX!qcac;?Pa& +-QdC3t?]g7b-&W!8$vfr$ZU0 ůܱ%Vټ`6@dGTcK[MAL͠Im${`vuALq$ot7S,0;8J`$_㏤lkl&IOնMYvh ^> ӌ.}l/ײ-9 +´uMB:dzhC0|Q<\h vLͦgO RZRY+UB |7"ORe5ZA0 gJ"Ih"**VmOB'?Tթ5CBdSfxCn1XdqPX<*TH\$ͷa"ߗ4`ϫ.뛲EerQTL%ߗ0 Vu[rrfCրsh`U"._D룻^jJO)h5 Y觴NԷo]8RnjvӛNG^?AU- ٭  +]_i)-K@-bGs, ^FsNCzj?; eq :ma/y떽| (h],(>z8ˉepMz0F$ E%5@xS'̹#ytʻ{Dw$Υڦ֤Jfq<{iIHλgRfZ .Y3}RjKg0<~6?}2h<[Fqʋj٣^CcnHd4qqoigÅÊ )Q Vۆ@ +5-?|&᱃db~OO uABۏ) %i2SytG7,cO +I(/YPY9-Ŷb]T@idbl!=8MwKT5{O^(ba:r riZZnJ)-Jsu4<]t/yxAQmpN &nB0Qs ޿ dCΔCVW%,/rW1K&u~up",@0=ѵ[ʁf2a<^faX]g >lef-%ސ$2b^,pUrw+PZD$cuaB’,fG{r h.,ؾ|%/ 1M[%\aAMi>yV +Ef+t+UX+dLk(=z ld-`Hk.`.O-(W0 k̗pA|fl\7?aTLW)ŃTvyF"*͡,8@ htT5Yk}{X *)LAb7OA ]cLd߳mRd t2"6J9&K>"6 +p͆gַP 8-V_U!v,=lg՟tLP1Iӯ0"2毘Uqj+0qI_6Լ@9j۹i5ćLJp_'+4!Z\ՇOkU < tY%ﵺ<:>O,V*E 5&fUލ=4І~Q^tU +훡9(el|hۘd(@uOJj ty/FĜ/=gڵhz,2+';uA_;X` tixy`̺vK.?#.  L" uj+7!jA?M~4& |5q</fK5jC>o୮gU,Oc[_w<)* ۦ8%1][Y{#Sr̩x|٪0|f̘i y%ۦ-ӦJ4omOc\*q- G'; FxKP5Fsl֎ UQ,9Ⓘ7YS +Qg:&pC|דKt4v)B,øyO} r+ϱ/Wb" +$ DkK9wB;{wsX``Q=@_)RVt}ZBIJ%5K'? +PQ?}I2?;:#Ddzf/saŽCbL,U6,Y 16%),͎M%ZG 2 h[9*!A7+W3XSp6@8?$ +(%qȰhMdfsjxqRCe'qP*]a(ުuq +J͚-3oRRk 0iI03E0 ׻ KJNȍZ6@;>']5D 7UmV klc_W+QQtz8_Ӟf{΋x$ŖUv$~dw6Dh/Yn҆zn@IDCާBp +r#g@]?.n1` -G䲎y gWOca_l4:z7F̽ fup*D\mP ^ZaΠDNB}Zѩ[v.v墠3VT) [vo)E?#u&S4}cʎҷ+溠*=kY[TxiʟمT*uk%ۮٗ1"TkG1-iˡZwOmؕḇgӓx>qg^C"@lO9vxi2Wl^j+2 UGhek9b+q4wr又ǂQRh艆B4),V Vo"[pCPy|S?t jQ`Fq-rlTVZַЄFW'е +YGCۥo++.a#;R${XPK<;VV@^Pu>VUNrt)lMRdMj +|sYb=h O"_ϔE{=Ok!W]78 jsr{\_gF@KAz:@mR2QbbR*9E|l)͎GvqU[&IoG!~P$<3}P2ͳ?ܪ~D>9wvʪ_޵BB$~|cp,o_Z9&i1DphAuDzitl(R KN8;]V@Xp{HcboIe.1XWA=:]4[N>9̲[AM--dq.0d#m&1 ;6ʆM+ ٩cJ#Gxę4@ lM7Xn H B|bkW3@;aS:_15Zv gL-e5Yr{cy +_Cr+2d[xtYIi`cV E! +!w}:;q;6-aF:|xj \SU>@{qO<7"̗7O۱-{oyI+;ސ;2] MΩ̅K˃+\*2oBvteМgQӰh +nwyMO?|$sb;_8/z|eGԏLFx:JW w"ڞiLx2w׵KHH'a%Y^)vtd,FRѨd'yp}AGf_Ȧ$G +`UCo߰=S7f;yqė5jU z %R:`֎d[tE!^Yi*+Tn !e2 modZa&:ĩDzozw G+̫3$lrF +0iQTȣrހDA.܍?o$=A~4*(a;7; < ݉S&TZayVg|s1v.%Uj&*ՂhRNm%kZ$'a}Slm{6!L<N]@&P(ǐX=Bab~J +-njܰ:YyBъEޮ,H^]sVSd ^GIZSYɺC\4$ϴPwW+2wpnI@;+l矓ZQPW&4g\f,s運~JXagPdk?$p$(aZǚtھwG/K.|{qo10-ju+r]mH` ZeP銥#ZIUb*?qYWXK\% 399$xkmI鳚i6mb2k. ڭіl6#eK=q3g 9C$&YeSYb`*&.%6+. +dӔwq,*faxjJҹWc%d^*uLeBq!S0Wӯ2FY&NSgN/ZnP5 +ltbdeRA|N^?tvp4%yn-SXLA'hm!W}t8]e&RޤLA1e@T;UIO1|_>cIs>żySyFgQ .h"0?tJTla2q#b?TuuvsoL ElͻGw,?:-\|qԵû^xq=ǵ*=vsu_℧ }V r/>e҅]m.Eβ*uI\QFTP=x@-Aʈ:'1H4qٔi,vlŦZ9NkO?hmQC(~SJ dC\#á92c+NW^G}98 N2ݤzlTgw95X ܿq Wlv|ܥ*]nYjݴ(s8G]"%lŐ!:u0oJX1%kXSAs Zk1bPkBna$P`8J͔Hm$-QyD3=^l#5VXEPa4s9bh8Z 2oG>yK?<)H؏Ȩp|D3Q%M@hҧ兿y߫Ԝ6'ۺU?@|0Qq@jgLi S6m @HZ\yqGGf)0QPLc;]/&qFA$ǘ:t;j‡Bc}yd,H/G߆LRѲMbJV Og#OO<2UIzk# +eȫa D<[; \\5ՌV}H|V'm.K?&gy7,%ŔQ4 GҠR|6b:u+SkW4&-}b~BCh[խ$OrprOno+Ah!>X<<Lh$#$toUF'qᏡN0gÑ3Ym;|x ']jM1g2GPxc/%#z\S5?v~mɢhy2eW<ʴr#/ZyXL +,oxc}J`7Rsyo]wg+,m0A9[PX +3' bA)Lw9Hh-:-2 fl*yC(תsnkvtY/\!lIpτK=QNY(JVX8^M?v"qײ>65"Pp>gى9@LZ1eBU?Ϫz"ZѝGYk[+= 2y%Y-0ý Y3aUV +v W_D;ѽ^ڟ 3M҅,//#t1D{a:q~[=iDaȔL +hhS4&OcF#jJa7H0_$פPIK#0̛z,+$DUNeioDUNVO|RɜC>{,0*nYia2[,~ay ,kbkwԴS90 ;`r~VF|o{׊0_|uM,=ܬ@~;fL2^-6_[K# cK! 7mC޻b:#w)zkW ; èq.%=\@k 2VEdX0j= ݒ:j47+]v\ } =0E N,V WPgoBlyn6Ϊ%;e>?rEV Z[+QeON’׋*6S"?rRd~+O_P_1iW.Y)PjU1(wfZW{qHx!Y6{f\[\??1:H + "QtN@-CLj[%Ǘ20v%[Jtw2 D;_wp CNgB''!?Qda&`(7bT!u4Bѵmmd_V @^ #ќI-PtTDǣ&'P.S:`Ҧeyd|Sࡎ_{G1~˼}%%lYAK +dPE\o;O( }0AMs`I'tzF JF=`sīmGpwy)"f@"T99{ poM0ᶉ0Ju8aW̫;܉_BBÂaw'=klŮW07⛐#I$Xa 8.*5/W3>a QP@FUDc.aCJ׍pd@|ڂ6wX<͓KHkۇ\SCPPMK=q>Joe?˫:d`';+\Ēm!QկB-$uD$wwO8ge] qDj0|fP!zqz ⭌On㯡seFp"f&PK[k-Mgbk2Z-\+{45"ฑGeK`WϜ[VvO5o%]b2L. O OM#rX2eM>C5[5r*@ V9>~6;]1e V_t~NkU)wBm-lJ2)7Gct _n֧`"鄘Ѹ0ٺh.Rc٪*lQRQTAפxƅL/WĦI\@ii3w&äj %M z&piz d`idWy;6TD՛$ps_6-/9+gΛeWXcί*YhDciඨȟ{NFQm[8BM1Yz>R!<|_O-9P_@JJ2QPL9#9󌅴ydOƿk9B#}0cĐ%ڕA.Xd~ +ce dJqn6SG/z} [si6H0UrԨϦhF(nLuऎmH񈬮s. e(ܵŌ#%BKDèu+HlX`&iAa:)y4E +W1~2:.Pv5+Ga6fDJf Te-kh sYmct  ޒ5Gr@Ul(͵Hi -.drɥ[V3)0'i]~;8TA'J]nW.^m2O`37vaA!_ouvbIN S[׼[r崅 n倓LMX{h;PH^wwd`W@` RJ^(? +e3D=`e>FU#t NֵXe5 ᔼvU)ސOvzK;!)ގ@L$ .ؖ_7npV?X\u3(ldNJf 3$o&i1p!  Iq&l e,!yc\,Y|/7#;ΣNΏm@Zl!am4^S ڽqq](l;*ž~ug(|nMfI!hŗ}@ +[aDSA$#ŠZgtc5 }yV);&oެgNh$dijX]@+' +"ի}rtZ&L^y~^iYTLws\锜 (5ۧJl)lW@VV+*2*out0[;آ(y ӈHҘ0|ް"뭷1)^aƥ@ٻTnWoABla:$VeNB=߿bWTc@Ah*.EL;x Î?O/+D~T#Z cy C .R~~-ݬN.LדO`O&C* i_/OxS<7>9H˦mu~O}L>|yCLS AxWsS? +Hn=&E?o0@n8,-ݤPjhpH$kF{B\q@:Ϫ.#Zf|%_; h4bg <r[Pm+>sշfY\',֬BoFf--s-hnD#p0SwC&ocw lH]N} + JٟTH zi2-%acaڬoZ>$*Հ}M#~L0~uxI]T"<x#HJ *C :o\haqLVAVyDRjp_CZQ*r!a$ݤ؟ݸӃ8bN'!x8=.,6&&3{«)mBiD+ ̫J&z0?M`Zh"l $]VϤs<+D2+p/P +0UUR>?~l+us7ۼ75556!prx-f; !BCvdf¼VU'TQú[@ PE6?cO_ŪDKxM=az3$ADCʬFP|ƜLfhхUVSľt1c wnXhty0{^D{Ӿn5g״N$oz6ɟ^ jn8fE!  oib)35! cfk>`#$+c) uMFYb |/!Y㦹.Ɲ'G̣*.9zNLiZa3̕u*ȫ=)zҵc7jۅW[gE-(V-6`$sa/ [.mɯ[椧M5RlY!3-+"%{D +Ŝ5p6 v% [C3CƄɉwe1"ٲOQyzT_" +ꤵ?9W?U6x BpLgB!Ӂ zukcVu/P(dfRXc I_.#|e4" +y%iKҥ2X ӡ3ct6Ð +t%D<ֻ7xl0H_Ϟ߭i#0Gj%9Ҥ!I$xj4pCtfe',LsE[(@g4E_=Pm%"r3`dS;4Sdl`~V|F n(M-R9z1Cw`+Qلߣ Q/Xea8wSg9~O3#fs +\T7,FQf/kN{V Y_g1z%:Hb7sWMDY&b5Ay R:ēl~m¸cBOX@v0t&Al3B<g̍5w"|~0GF'V$g@Uկ8nk1w悙9> +$4#pAH5Ib5f|rTmѝyyh^g:rVwtEPTy#6oDs3`&ʻ{g ⟐]ObY'HZ"nжg2Fe~g`JZjD)G0+. ++/2-d-: #TǎNDw [v[hxLf[ ? ~!t~ r(j7'7kVuR%YL,w;Xe.sv^Ĩfx܇k!R'j(y,][p5td(YYծpavQ,q6#ͻ j-36 K2JlH'c9ǰL.SaN OO7-L߱~LMfNX+U8vO f^!*C(TgI g/,E<)/L>H2L5`}IPOwS|1ӜEVT(Dˇ&cܠIt9]8Ԭ vCf)0Ň Qۧ˘Ţ8\5{KYK*t +WbeGi2e`e^fyK6~J\j@<Ƕ_NƐ~cijiV*!g*VKXGR_)%uhs$"GM\Rh +dp, aJ +fm ¥ۣ%gK̢;,x|6s5S¥vZ}[LPN,w{,/)gCb<>_cծ ˕/;耈ξV.1%3U˾0OY[4XZI< ת~trIzht8N\u=Jl6z\Vemha +._@R59ڳ(wJIK%dFpCM)Wc:¯vf!#F[UTaʢMͺI3]~6_iagqX o1n8ua@c9/@a11@VHYNUZF%ޖCH ooU +iEælsS"@ Y[ {pS= Z?q"T~u8Ji3cEGY/,,B:^㢪Ӑ0ZN.o>r֠Em%(d_xf6Dd)W_M0u9 |z܆mޣs$O*|Gư!# BDPt:l g"򀎙Ic?~ocYɯxpQ3e\/4ߙlk݁x\MH>m|M$+<[F0׺wkM.Zįe1*]bTLW)hIyuI0wj'Sjż6"473$I=6ޕ3t2߽_D`?4lI|D5lzk*|2|bbIXC9/+8ÓÃ1ox 0VFCNǐ{0+0+Ĵ:d Xwhf!"K6Y4% /L. =+WA$\bɒJD! aWxv^F OIxpCT2s#9_py$&Oq6D +f2-&2:unf, ,LAoOgC4M<Yl$&?p%1sPaՈ3 +A!X9>Úg"1yE/c5MPwՃ/ʃ5rF ^!nZ:@j6Q\•x{ɤ+C,iJ,c( +ˢ&"{j~V[g ]Xwj"D׉a,(9Loq݀fL3E:;{QxjzieGcs^dOz7~o+1 <_r'W)U=̊ 1|_:"w _'! _,&IrUĐjTi20Z΁^Dega5ȼIuwQşQ +Rv$iA5I&du+Μ@r8ݾ+Fuz*F{VKJЕօ]^Dâ^h4 4~ efLdpޚZXw!z_ t,m~W, 3e`/`mZ#Rr_gܭu F0k j rr*a|m?wv:nFMTn"A0rY~K7^~(tzR{1ۡ J.;@_OayAV0O/Rp;yVzJDhucFgi`M-bI6Bx%[k9=7`r?XfR?PTkX+pdQ\A )Zz63/w/G ?yW1zSikkS%4# +7l!z.{K(>84g%;ɠPNwPEZ:CZ=3ښ_J;lb`9ZB,a= rv[V#Sr=MႧO7x%m6LjSuߵ sbДd[8)(?NѳoPNwSI jXC2e~Մs%?1Z7ZBg*STќU1u)IS2Tok bi,xkolsW\)- +K:ZM(m*AGĕBۇ&sͦ)\[mTfޖn fzS +z=Nm0rdO{.ߡ2T\3}ֳט排D浂6O3ŋu/_ +lX_NxvfWquKv_Eu}W5[H,l6d;JMsjY6Zܡ?l#I,?MMPo_׵x =+i N@&y$% +)K8a;}ݲR϶<pwq H{@j"0%H\4>BMm2[-fxUSwg%1k=noф711 tϨa] E-}{x>H2Hh7Am&)):p~S>(X»9L=f'׊`kSX$QusW EhЎ+IiN}b_vŧE5 0XǭٴkZ˦YUl}i%ԐgKP ŇNŏTlb7[<>Wk^'&6@D/R^l:r!BD, 1$g#Ww:Gk:f"EvɎ5I$|(Ң+vyϦ,?WObAFd(A:Y܊#KZsr$ȕ;Kd5<@_u%3)'7IUEF8ݍ?S+(? |⍒DֻfY%*P\3gE!m6 +0VBZ:H%guT>n_CtIŕwh^oDITcqtƶX.rW-F⃗~}WiFvgqdS.w1佩>fp ڛq\.'9R!`|r?"R6/O^L?%|@uHB9h$iܹj^p^*CgT~.~'!%Ɇb)w⛧$:_.wM6`2߉ઓd{Bʙ|n4] -qϴIV-i^w"zJp6l4)P4,m +6k1L_օTf;g-lKCz4yYACVOXl,1}fr×ˎcp8A&@VؓKqq:*2ݿ T\"DQa +O/3+ YBb>۩3ֽ k;վ7hSaYΊ\h雛3:EĻJ+&[0т_Ѱا@8t]J a{Tষ͸xHǣ0}cHhcc4F9X6I_;E+p%Uq( |N#9_H6M2ΐ'@I0nwPKEt*OV4=s +X^b}\[ggGì懙>Y ẁ꽾GPk + MiKƥd8ڸh׬I 5jUz\Ɛx䒍iՍ8+J2p,id.z {>7Z$O@rei$UAK᠑L*4sZ/A<1 D4G + ^|A^]@Dy4G2|8QLBۨ_}z먧j:>Ys0vOnk-3]u#$d!{t_E% ފ;pME;FLlV$ koV%OڟhG%#I+~<߻o}3O F:ѦOH3ӰsVlW@ϑe%޼azBJϫ2^L %w@ߖO'FE;Η#+}#& agLd#`*^m\xTU$G4r< 2i.Mf6dTnQsţ>Ze#p6e?̑A-VE"62һ}Hr{SGZB!Y6OTuUbzWHLc9C9с8;8HO۷"%)2ݵxLsk^((w)~0_;=e\;[z:PZ'e*UX6@V!%Rd81Z'+(\M`--i|p5qdDQWg:DaT.Lפ &Thr߳iw*Jٶ(̈́p;3WJyF<뛲&AS`X̆Dd/vkRK<'TՌd.֥ɛ \ĢHU7&2pXQ4[ܳU#ϟNج:ba/cN| +g>_T<+Fx1FwzMFsDCH.P"GɁO~lM&C ސKSo.htkpc!V SYI x-!b 7ά?6?\"k٬ʍ.K|:U-%f |RzApbITMUQG+`NtVصCQ,3w_ .b*H"V! +z%+"ѪbLh;ONn򃑃2zʩC CGi?GSMȼ1\HpjQ,e-!@29[? ERЀ}Hz'-ČRsaq l0㬕-R{i6&xf4^} i'v&$cj j:1P\L%e4f{NUa@J?^U ,$o9;&mP]?Р}*RW-<eift!)ψT|(` +FIj{]Ri"K>A]20'KtY]!v"?XvmXz+`0 6hOM@~4N B e<k3X`=һx:Q{޹cfZn"9椄?CS wIE#sfi'bj/o&nxN{}&Nd*-oYG8B[c8[HXb=^Nߧu;CB d Ƅ0ޛĚ{ѹ][+z">9b ۞{܆ +Ysy7}!swH/SD]VT/^P= U5;"2b$d[mLWçdHܾ2~-:ٓas'd_!(Zm25Ln {A.U濴8[wqϨ I+&i]`"dslEZ>qsvµjejĽ {* ?IR^B%;P+8U$ڭ>tQ$ۀ51ۘo54%(-]yiWDpxpл.~ޙ$#Q޼8Iz"ߧ3Nq+xޛEi{"؜WltTEEo8Y1Q`?p5AoKj_A ” +\0Y\eU~Dd]*}ͤTajmd>.n)>m6ȼ0 Ed盐GŢT.ϋ(:_(/6[* 0=$YLg[jG0 2,1rWΣzI`}ڐLBj#|[13D +Lv"򎁅џW$m%<' RI!,@|ހ"؟rU4[",(QB8fj6N=#˄Dp>K״{Tc2",6}zօKbڛ1z_u r_RLPrVǼ *QN2$'y'PdF?{c+{eA͡2bnip+Zd<?jui$k3cclDXCJ$ +e AK8k1IT?˜,\%u_l8%LC 2ԑQE%+v[K^xWnu#vYa-3䎰+d5*i1pIь:F@m/JrY)crWobBRD')#ᬆ9q^W\)0{bB^K!Frϋ6f;R? XAFEe=ɫ>kaۺ]ň%^S18r?o[ 4@&>*&"sIy/85 2dIsRfF|Ge]3V42EHFҷ1c,TЛZ)b*C_MȏR C夁}Kd8 Pںpml\A>;:br}}QP͎lN ݸ&e 2o.P],y.U#"ERA;%n1EZ&öH,OPa۪>3N6!Qř%9 LL8vIoܶX-1R'\T0~EBQf~dX꺌k j(K~c2CP`_lĪvJW(IJĭTx==:_$IX^?D1]3JM@#O6h#:p%&0nĒirCSD߾졡&V68Jd?|n ~L2|{Jҟi֊hհpyGO<{RL Ζ~ȤO5Cp L3E!TNLN\)SܱH6ԺgJ.ΊZX+3e4}?@JA(EWN3$ ȘD[VHKt,jjTuCSyg5 +e0tv9hn %Y ߤ8:/Y&g.ݱ]yrD4vU(-z^е@S'nc4?]_㼂HbrE)&+5f<]*Ń5Sb\N-NSXnxm31X<~Te; X}#>BJNk+ϩR.ÍJz'WݙyZ,̝MY_y1 PeJ5.s~ JSaWpvӯ'.hgE.Q,INGuX{3 UX {. W?^'qfIWu(*n5?ӶH~mb2; EӰJzTs|<)A.KFKkBicyoqnjg,e_T#|?SwkS5tdhW*6\oln)D&P}912­I!cqlAq{4ڎޠQ B"GT30*@oA)E^)b31ٵXpσCjM49ؼmPpʽkDӝ[;C*v9䕺؜iYIK4omҪg>WI[JNmgWy,e1W@#^\IⵥkLZSXotufQ'is ,VA7QSVEXNg(ݎys21$[:d3֘ J .5~-dYJ'/䃶3fpltZ'te|2tj_ꃥcIE{qml͵1^ilhzau{LhLVTy ")Q`a%,VGeEkƫ9R:)r|UX1t#US(b+h׬x6Il'Z$@[ àyʶF5`>˯hԞT>JiDR#RMQy,.tR])^3rIbK7e+wzO oN9`ׂ6_.Oe`Yyu^;-+i+ؒC$2ul!O{K5D]g8eE:#Q[[.eid,(n}kr/&]b;x2r"vEVtnKҟ^2(EBOts4w;QaҤ$\l9xrݡe3 +{L +,g#O Lu\qhV~[&*u1*nɶ{O|RenCZ+yJ;Ps֨u-S*;}Dg߷%|9{-õ+㒈6~O{dHƹO/, +K7jE>[ӕue_y]w:~19P#ѳ.ng̸p"0U]kbUr۠?sAIG8uᬮV$g4;)Aأ=@ Sy0d1Bl%7EDž]]fq!hMwtY]_]*\'=utq '.ej=n&FI\DŽ" };~#~{Zh+ LuH'F1/9r\+ovP߉ڗ[x,- ŗV!xk^xnď&_b]Eސ|0_LPdVy7v.5 gqÌYVDu/3hW2n_@yUڞf_P@u\q}i0 +7qd +m"|T83=53 +*)촖d:4pO*@!mrHJ(5f{Nj%II'<=l@|nĤ>&,m0$XXI/QSc~6i`JN"xXԑ,1 *b1]iP +v{\E809N''p, +iEv=~S}<{boχ;YȵZT,}[ y)(3ܦr@m^tSlba>RLaEd2a23>i%{Gk'Ð]+s> bSn*eT^8-%a_Zֲmn^6ebM^;T{M +PrK)khStiO홱?.àv30K}FK,9(frz@QCs~uMg2/ǻJhZo4pHyGN +endstream +endobj +23 0 obj +<>stream +ԟԤY~52"Ӑ-cC&`yT}~,&U3(r$6|@ġȋϤ2:lM,xmp"lOjW{jpA"-0Kບg%nrH;o/x$dA3YAXηJKJGM'9 qR,t3r5DvV0WsO%u28['a.+6vY`[2X}0Mb"']u]oe)\J. DrʖE(Pϒ~࿗W\I PZ҆qR C^&("jq+kɲo{FVD tC$P iuVҏyJ;C>Й7TH%0*?\~0*V?(."I9X<)ɬOZ# &+.deU>ۄ +g(H IJfOm_j怙XѮHnCͱ8oY3#9wA5"º!WEǘEIA8<"R?GfKIEM5X]|:xа DL%;b[ެ52#}},vu~Y3gZ-x9Y.Oz?? sWn!b}5ST݉xE;|(&"&̟w;#e$2:t /lÛV[2CѤ<7a6Pl9]nhg=TAWa8d/'?LXG95!U,߀r# +~7.Fe ǂ䶨#3<^*\X~i!VN['DO~lqҎ)˂C&  :ܝlOO{pҶ {$]2?PO2K!Ks%' Q$wW܉1RAgp|+9@s>Lns0( i,F"\ N##p9xU=Mc%k/~ҶmWdž61e~&DQ^eeV, Oi֬zR˾T͐|-RI[o'$;Jw, w( ( Sɜ3|Qȣ`mʦcGKBzJ}*o{,`AcS͈2_zsK9vZ:0D.v&pD %*$xX T]IƯ&}[ SJn|Z%_Ua_?z<Mֿ +4JT[4Z/ ` +tA4d`wv=W+Ǥ +LX)ñ]RNJzȲh7#6/ 3KoʮfTv?Djb8찻lrO>j3eno:H"AE盆VMB?^:EqK\}#?@|p[w,_Iq*-3(3vT?-v4pC#)جN֪$G^ơ(Mr5a-}%3=Z#`|@^B$)#XHTcWi)>Z ++$'&;րU#wCp޼ʈ@X²U &7\NAm]ioč +ێk7q;Av9RaV;TQ+ +V@H[XzzkhŸ[1j>kdDAZ>ƴ znʥH@9aeCXt=9L"[/I isTk1 )R8eDFGwh.:.DN/Hg|n6ٟLj̱a-*{㣗~ȸe?h)@CΙ2q-6H`lY+ޥá]wdMQG$<ͅN_{wȁѝ|W4}HԻoЮ`qߑo"K|p @VTW@]Ѧu+Q<9͔~ ~VD#O͔ewg-"Z$ֆ EiS doDuM.QB6*v!Oڹ[?4̞eED[H93+VnA%R{_m%+QG!@O.LF]qs'*b^ +{:Rr&betU>nSrX\I\kX NneUTYߴ(9iSl% 9ϟaw=@f"6BJ-W|}$~і:V0u>Ë{Xف@pxA(jjyH RIS0WX,!J`yA`jX_3NOԽp+{Vvf#XiJ +K-CcJQ# o|.8.?!4Y(0>ZyH病%E;?_(%TTk(6CA3AQ"-yW|+ʒ{ lhN`OGF~ leX',Yxb|=` F5mBeF)Jt2 +H7`>v!_5 )@ǜ?IZ}(z g01POv@ųW AG YTH#+qv +(lӼ932˖Le`?uD:lV1?@%*ur źUOO}eAqj gfqov Pt菴`;qN9Jy[ZHOU4'ᨎ+-ܥn3Rpf"rzU)F0.4"đDMqAj3ۗ?pzpDk=ȅxӱbB>5.5FsZGf9t֗~PS5._!zBT\ &|pLlI/#UY tNFdHG9<3q$#M;Ug| :aa y2HSkpmy] ) ʬʯ!R/JhL [( %8ga*] teF v1os2GKhp: /j_9I4PZJ(t4D<:[be7կQUdd2@ мS: 6Ѱ~4p +W"fN!K2dQLV̼S`rNEFv-g !p1JKp P +1VA,mv^OԳ+HZa9>hO#r.yt VoH'}N46n6e\yؕT!X#UH?Vޅybm/3^> 'ߵcc$Nczs%jDD !ՕqD&Dè¡wW`S=<1^7Z-kgji pt[\-fcL ]Dq=7|Un}p$elЀhC-ZTO36Q +"T D}x P4T%Pdsˌ|3m,gA]֮]A1Yx|b,f} }Pd&BWeMmp=[migC̼)Vh?@7[ȟ񶰁g[iѿ\>W6*mdi UzP_!#B)*E웙hWȟo>)hϕ_!@ecWx,tM 0%Z tDԚxa~DA!9`Q.}ЉjiX72}i3GSKBo,ƁԿ=Aѓ$ u}gH+6Nff_E,.~8.hB7>@\||U8㨺T{Q8W>ãfu#/F־mֶXVXCYCHmgDq0:y^6+$RQ(Q`]OlO1gf}p.Fؖ2t +*5blvH`"|`;^oܽav:<׃?06\' *,`YP!W8f!c2qwDkz[Zn%6SFhfim&y eMhQ<[FV+Szq0̀CfS=*90r0/Qa'J#kst?wYuj0?VvKz^FJN>U\6(%&'tBX6ЋsyT!|wPFi듫U=a2x'qhO_,AS&޻_8arQ'?ʑZ +r7P]>Izˆ&D@3NJ(U*``? tDG!˿Ȓiv"wʷAw 8$[Ȭ4.ӠJr0qbTTܮ1L8Ӱ۸;G󶎥΃"">CͮDՄUgݿy2hT3={~1 ]Ō`H k0KLː4io +~_9fljw\(v +FkyA[ {A=C,{]Azlv ʨ-Z(>mC TsU?[bpÛR+:Ƹl,AirܣqSZ/ToW/^ZX}׶J.$"^M5Tf)M0MsC:ȇ"JS!e\A pq]IF0(GX|Xv k~(xC\Ve+wGf]7 nXxol1DQ| cFeo̚82JCJ?8dYlOd Sߋӈ0'>eZ})O\冺S6ϱ*֢K3ęߠRoky@~TFijAGv gm u?:#Xz-cD ?0c9i{~Y.dGf9?'x|ej23 nY|(Q16aQ5Iu `R"oHuZ㎵tDa39ߜ}jw("vMA"-j*J?7b _b (4Ulkq6%KYtY{嫋 +?g_f3MD)bEU 0p<=vշ_3#ow% tweMIQFd-mP}ˋo.g")>{ }8`_^,M/Vfs^(^hQ +ݢs(`ߗٹ*`9CcuMΑ 9b?f6.t67y\8NZSgAMqyHeўsSƺ2htQDAvTDC_ ld%<q00h*;% 1I42ռtfb!F/:љO)9bJw8SU`^|y?YZ"' +q_ 8fޯIe߄M\/foy W : taD*=Ҋ25f\pqkb@rLW\6XՅ_2sojۑ)\yì)7c= +>˧k؛X{l0rzciCnu7P<ȃ+WݮPsb#l\ )S{<!-Wxu<95]XNX?-wr޷4mѭC5˛=eaWJN@6 hkJ"5977i R7k`j2nd{]>mTC|BA%(p}RhOt9[ߴycB="k3[ qe/IV Bԇ*X@߈y%}~ 0Qh-T(>Fˎ, :5PM -P^|PwAÎB0ǘky'5jUGu24eL9$B˝x S;BJXn')fe +Fc:=2)qm6N\lmvPVEj괳̺SRA jjx7U8$!u^soWI MӺiD +PVD.H/ӗ 'ou !"iByu@ycV$)=&TLWUtA_"Bxdqܴ(ri|y#/v)1\[EsNM!KGvI0`stW/@/ϟLjMҶ OJΟ`qw?bk/ ++Q66gm/u:^b&:~-ָ ؀@*xL*3=)hP>{6LZӈ-uBl0ZX`Kʵ>}5>i +^k7SGAw'f6d-I?mӥrjRh6͢k͆>$op86P=EZ(Q(i.>I@A ܝw0Lv1nvp'/hPk1NctdJS2H|/ICfq -"17ۨcO(3?rLmKs>/XŦOwa+@])MmS'-li?]#I~%uW7x! 80:*pX6o.){;|oiK+amy1oA}'>z EH2<-1fL. IM V(yiX5Z S$oiK7e@-j)Y浖,b}H%J(q !vw2d"<0@[ddCK}υ(BBjַ \sEJ#Q5n𫰰fMSl)۝`Ɛ.F# ()tGP΢TdjCJD^tB=;< (ܡ{`gf݋E|Oh^C\K6W+r`AJ6φ}[F èzot1fTVGv2^ww w 4[Kߤ^VSӠ 1F3qHICds{T:FpFJ&r?_7NsIBϺ5v!<13s0% hʡzWZ#%yoBl&ۗP0`6,򝞾ߋ?5x0w>&[yWCf~AZ͗e;N Ccw?fNIxғ?(jMT4t>'8(=o:q\B!6gg[nTK88K.vv*EaVسorК7yw{#(G'4<~k@'1Q`Jāu5O ~0y1J_bp =Z%j\KȘ(['EBukv;d !Q0vQf|ҙ8HpAO*q~&4ƹ;UhT׀6tsж^̼Wv8?C;OE'QuOEsMXu1ڟ Ϋu3UIi*Y$?P=aĂXxjJ"ڋ%5ԎՈ{f !;i`v qY9zͤhirךP +";o832،1Y7Oc p.,HBɗ1CFJ *kB6b.d琻:X՜lMI on+GIs!Bkr:&Ŧٸ}(9im+)¾gƔDy%azM[iDα.tŁk/Qz#|tAUVGrp) q ㊩Q/S9rʉv\{vΡWnTέQp<6J#-ٞ_sZ0DoCY91m%G;/2~Q[mZ_qytaq#yK€ 4`dY$W!jkٖb3F6W>K:.a׽]V>g4vK=mGDJ#X3O-xK0N>>nj01pwbn><뛯磵ra(ljcڛ@ݎ2Vc9l?R /t(pMˎfc,AVHHs.O/l$qٙ؉6/!P 6}pZSL!)-1LwWpH'9z% 9uGu&R[棩- ڻREy@Nl*nJ"G4]%"w SEy<£d^_Yٔ#$v 0( ]pɿh E|t^HFU9$t9= *zӳHo Ye0//;J + SޭĢvO|oq[ :V4!6z&n2]GyMG3H791@Ąw&4ȣ@N`ElS=|/B0%`$Zc2֒,j%~D14Md>JuC>}BӉlOg2AHu\ŭ :c5g6$`3|ڌPI +׊ciE:Okር E&1Pm= >㌃1QZxy{[zs57Nep5C +ʌJ6_%09?hmZ;") Cɐ+я:|,H'՟iӪ%"sl +_hHHN/bz3~y/[$z;OWG#B ,Qh, ՌIzbs7͟!Er l΢Ifm<*#X5܈!UT )8(x @o"xMѺbQ]^2lf +wQ _ί,V +p24|Nr +S$kI=1fTdݴ<5oGes\ jƾU"*)qR5uc5(@!}$׃2V=gݺhIJƘa+0F96@$~4=$ $w0ڠ$x|vUɔNs>bQ7` H"a,$s@2a){3SCDz;@yu8`-@cqe}W#jjLE0pϸWm/DltNה}Gr|inP,V E !MLkN~ZI4WNO(Wi\*4/6#Tj0kMtZ^ޭL*Px>T7u2j` Qpeg=,2o?h~GX*ʗzj2o5Cv1=s +I7v\kwh%:#PKI$fH$ncDnbn4IF8*e$XMX+,bC>bLhwsY'E܍%wrP B *޺~o&P!_{d2AL ^xhl %tK(9tgӜŠځ1*C:xo. r`eܖia)>0NnBF\ b~Kkj'i[>bkծ:.?֞', +֗*n}ZYJ8bEI@kCt*qIcvw&E! P0z,k&ta&[تZPvEvf6_ }C5<>UY*DMe?=BB$own1YEM +5Hi1qkH+F މ̑2,=LfV @h{L[W\eϨ[Xߝ$%޳ ոWB-;b`WPm% qVrxddԛ02[vC7恢`Z*T=6a RQS6[ikb}6s+dsxSSįeG_&m3ŊKV^%RlYcz+5{Zgt9T؁j2rA*E<?`"&.iaZ #g!w*&y}7r+a囧E|T9Eɀ0 i@I7b6-Rmh"_L y57CRBq|n5SW5rywF6m-J3E˨1OPVcu@bXqaoc?SSb(`fT*`'jy FNY _3scu-ρW%}UEH[ 5 71TNዕEKa ]/G8H'6Qe} +պ#pՌ6J@&#.*x=~]9,)#"Y[ 27dd jRydUzoaҤ͛bU_2)gzԦr:AbFe1=UWq*XB?h_@Cf\0Nv*F9/AD 4 j1%6n'Z;# }^:.<l:v&́*o>;{mjEVr`O!! eh*2A`4q:>% Ad^pUY<Ε挲5i!)-{4E_ 8?Lt[PP$_5eM~Cs𮁰zc-ˌnq?,R+x۩7:DWOiM .af0{GR C#WȦ87g s{yڊ8ޭqZ-T$VGvM~K,՝ݨ ,P A-q72X7{Pbeh~Vbs@"19eY1~[$/DT& :|F061Qh '̓_ߛe9SZ=zmTfv1B<"NWI%O -:g핧 ºt#| (Tbū! >hvpBٵYx f{\F -kUm!6/|JM[}(7c)yt ,z/5hMMq ++Nf[ Os!eVL1RBmj Rܣwg?AȺd}Y8E'\0@0,7&6Y"J6FLlc-6QcO<0/f^mޓ Ǭl#8%e66/7`N̨{ZZqCp:wRc{ ڮfap!59EE?W]Ztepg!,mUEe,wS{} bT@zzu/DfV2)0cG4рL<`>@^+Gakni Mmb퐛 {?T;7G1A#6Ha,(_k*P9,z2 iX0]"Bk OV +o.x笨``1kp.3Y/H]djp^#!/Ɔ4_S#zru>a[WJPC^ ݈1ެ>Õ͍͞~ Y)4sX¾'{"%cMGBz¥Ic8|ǿ?rve|rr~vu8t[b{$xFhT VF3er~b#ǒjn } [mu(Eq>PDw>%(.R,M;7q`Kc0p0'n}dLʖ =k[CHD kcčbևjZ7,[Q 3(p=<GS-nGUd/gtGVW:Srŝ}33!NK߾a߯6(DCaOa'PszOL|!r + +{q>f=|E!9,TY ljgb u{y= 3*yQuit#E~blX162aOr?59y>)omLf.Xva}b2Y^# +[n +\ + +}_$ʺEi@'?.W 2Ը+WZ>52h dTm&t9R-^xʪ%t; |j5BpV>nBvxے +#^D;Vz3 yE(5ҥy^2O"az,uFZd5JFrG{ڇaSMFG~{S&oPF~i}c1΄PGTܫ`GM^z*o! O?ޏ R_=YB{kMU/qsT:ݎs>=/ƒQ9@=;[3(;}^X|yv.-Z#"(tPd{ӒHuUY-` R9l\ TCq}e͵c|47*t[Nw]39 V9xM@QBSR"iI Qj[ +(ՒՓm7B  wš?]Z? UջB{ׂ!JFp  :5,D]L./2H6uNJqq_1 =j1DkpZ̘sl\Kg>9$rJ7<Mnp :tPLQ5!_ #铷+<E厭O 3eO +_r$銚+E N羏!P9F-!؄)~#ˎqYjr$Ů˃3߃ssDG'yO0W9xcYAXZMp,\6!ԛA7 xMt4$gb0aWձbSډy60@9[! =HȨ v"uEjnLܝl9$djY/RjH3X0J"ǽE5M /`Ou*بL"9]nfHkISp" } wM;GPno] +CHs;Hi -*R'hs5Ǽ;).3 +ۯb[V 'k( z2ːFeJfLfh $2s;P  Y 65k&ⁿu>D+?bYHbH/Khu9st%u2gX # xOWPۂ&\uk`:bZ.ho2ԆƧ & v3/TX)}k-P%&R>jr+%Ii,H*< +ehqg2c N⧔L:fҩ<3;*9 .u5yLCZ96xk=Z*:ǘѣ],%vw.5\vhd*f͆ 9՟Rp7E'toy|KRh* 꿝~FTn1oF?W+.^D9#VI醧_O=e1tZu:ʓVzR[HL(|>uBy= pM:/,0P)ynR(XڵiD6w)ŗkyCgb$0?0*úʗ $>D([;/)?ޤ;tbym~ o7ڦzqqLU)̗[}@rO`ou^Uk>M=OA:琈|{m~)xKZ6E=@ +;[Oցn+2j]ÿ.s-tTPNN7V\ 9zn7 +Xl<ʼnۨGO Oq 4)77q\SIjv1Og^!p>-xGπV{4tJ'S[͑R{طdpx}uA7֝ǒǸK`]Q$j{6XsNx +1]\;1)C/[i^+֌s +~o)rJmrdPq,c|3u0 ]+ݾ'Uenaז Т0\2/;3Jbk' @& mO 1 4HE˞FarY~<3ftl6 :Tgҵb^v1!ۂ1P{΋>{\ž3AQ:Ͱ`=U<码DA}mM^Wl'i@_Kx(i%uf>UD|Y\ +Ʀ|cM/0J`cNoٳ(WRxY҃FhUº8 +*D~9'h;JGڬЖԜ>hXjUژl˝Sd %zR*!L|Ie)c!4m&876 9RW{Az/{dd`Pձݨj-!Ki4ly)߯AUiCKVKpUMqA3AM< I0\EvߙqLӨugS@xtDD_~ub#*EW7X@4vmbGYXNdVlѢ% +МLJTsDthkfE(՗,{ĥ- 7*?LB0f2^x=efozv +!^4 + +h0%dbU;sf_m2-eŝEfi$a4ha3M>[ Lbڅ\6%}5%؎dt\U|joڬ~`9Wm:ďӼ0 #'!_Bf}hDƏߎh j"b?@D+'8m%t>SF)knhm5wGW0-~ahls.yiroAJz# /SmIgkHiYJq$\u751MMq-='y)++^+s6ÕK} TIq/ p8E-@]Y!ϰ,$"R TصZ@+m1$9s?FrᒻO;- J~ܕEؕqUik@6T)ҴWtdm@`7^X1C-'ȿ1Zoʸ bq [~1[W_EUeg~BE Gp9Q0G!|ʪ]wE}PZ{  + kّhSA5.=Ip 0hlq2}nNvr RfԖ7A ̬gc ]߅ُG.Y~ɣkr{')ߵBgqR5eEG 9h0-3ZkHR&lgm!w-[2aQ*yIօ-^qSo%c^oˁm95Okݔ} rݕHC(=m#zikwWu31l-W"7GW /->ڊbBO2HR)("nw1@P'[_޷ m-H!Lo +Kၦy$e4l0ɏp*H7Õyk>6つZߦ8q^fg7 ZF(6TyS[L&*Pם9&ӫo+Zu|Bȵ -CZlbilj: mhGӅ.6cڋ*wc6`{OǴ8y'gS:Y˼Ndr*Z"DsVF nSԝ.+ƞ R!d(8)4G0Ț rctTHJ;/(.)g_QVK ZӢV^gs 矢kHzrљx9Jꉿ۔3js K$=OU˜-<S&90})J>߆KǜsAv'zxhWAJg@;L=RiҬh0ʌLX1}vFqUڔaw$Ymx ˺CVh#YBF5d<.0%Q-4- ~?ԯ׽brOTOF:^. +/H7%  ;z9}-T N尿^f.6>t=rpxMO|W{12g wf +R.  tᨿi-;Ү2Ŕ: $6dN3r +mqDzՃ&{XQAmȧx}:vHe=JJnS_J' 3Cm#*j:u _4E@lx=X+uO: WtZkj =4@eK/y; eA*N=lBjL 9{hsk(yTi%8wW./x|8h2a|~?~Z1|Ȗ.LSzb؈SbvtҘ~1A5M<7h"+YE|zK'W]f~^Wuo٬6@{ߣeR oD<$k!w!%nOb~>r#^2_ 75P@eSeNV7ȶQ֭ŚI$rx~ .Qذ84wg +RF?]223h ^C&:u4sĢ:Y‘~ ?@ ӦygfXV*wٯsyf&$`0BGEe\@(^,&8:%k?۲w:F cFP-1)y$5ܣ;#-镏@?'5zB42pc'˜Um׭fpgQ`/Zhƙ~ߕLI3'R[_GJ6D346#}1v?S_$#xVߨCqo6v==mH+7KP A@[KK鞠k('XnBͼ2)nOSVaz>A}*fFIA 'k3v_y=SѣJoN5j0\UF"@rsXU^[_kA3Q4ָ 2uW"!=(~}eCygOfݴ ކ^g8LzO_/CrdY1w?Ǿ = }>2z~"J'N~sJKWA_yfc?ńƙ8pQ~5\GI PdDõKn8P^ly;Bպ_;*oO(CͩDh e"īq|LCi B%<$Z?4C. "ͶJ{(E~KN=[io e M[VRc@L\y!.R#[CH泔ft+J2(djoUUq~%SЎ_'A]/egONHbrґaHf86b8[A|:Ԗ ,2;R۞Y6CjvXE%[IVCkkq[vD1fSY.'XD+$h^)t \ No newline at end of file